Merge "iorap-functional-test: Add iorap-functional-test to presubmit." into rvc-dev
diff --git a/Android.bp b/Android.bp
index 03a6af5..8d3b4af 100644
--- a/Android.bp
+++ b/Android.bp
@@ -273,9 +273,6 @@
         // etc.
         ":framework-javastream-protos",
         ":statslog-framework-java-gen", // FrameworkStatsLog.java
-
-        // telephony annotations
-        ":framework-telephony-annotations",
     ],
 }
 
@@ -711,11 +708,9 @@
     name: "framework-services-net-module-wifi-shared-srcs",
     srcs: [
         "core/java/android/net/DhcpResults.java",
-        "core/java/android/net/shared/Inet4AddressUtils.java",
         "core/java/android/net/shared/InetAddressUtils.java",
         "core/java/android/net/util/IpUtils.java",
         "core/java/android/util/LocalLog.java",
-        "core/java/com/android/internal/util/Preconditions.java",
     ],
 }
 
@@ -942,6 +937,7 @@
 
 aidl_interface {
     name: "libincremental_aidl",
+    unstable: true,
     srcs: [
         ":incremental_aidl",
     ],
@@ -960,6 +956,7 @@
 
 aidl_interface {
     name: "libdataloader_aidl",
+    unstable: true,
     srcs: [
         ":dataloader_aidl",
     ],
@@ -981,6 +978,7 @@
 
 aidl_interface {
     name: "libincremental_manager_aidl",
+    unstable: true,
     srcs: [
         ":incremental_manager_aidl",
     ],
@@ -1175,7 +1173,10 @@
         "framework-annotations-lib",
         "unsupportedappusage",
     ],
-    visibility: ["//frameworks/base/wifi"],
+    visibility: [
+        "//frameworks/base/wifi",
+        "//frameworks/base/services/net",
+    ],
 }
 
 filegroup {
@@ -1222,71 +1223,4 @@
 build = [
     "StubLibraries.bp",
     "ApiDocs.bp",
-]
-
-// TODO(b/147699819): move to frameworks/base/telephony/ folder
-droidstubs {
-    name: "framework-telephony-stubs-srcs",
-    srcs: [
-        ":framework-telephony-sources",
-        ":framework_native_aidl",
-        ":framework-javastream-protos",
-    ],
-    aidl: {
-        local_include_dirs: [
-            "core/java",
-            "telecomm/java"
-        ],
-    },
-    libs: [
-        "framework-annotations-lib",
-        "android.hardware.radio-V1.5-java",
-    ],
-    check_api: {
-        current: {
-            // TODO(b/147699819): remove telephony prefix when moved
-            api_file: "telephony/api/system-current.txt",
-            removed_api_file: "telephony/api/system-removed.txt",
-        },
-    },
-    // TODO: make telephony inherit the shared stubs and remove this
-    args: "--show-annotation android.annotation.SystemApi\\(" +
-            "client=android.annotation.SystemApi.Client.PRIVILEGED_APPS" +
-        "\\) " +
-        "--error UnhiddenSystemApi " +
-        "--hide BroadcastBehavior " +
-        "--hide DeprecationMismatch " +
-        "--hide HiddenSuperclass " +
-        "--hide HiddenTypedefConstant " +
-        "--hide HiddenTypeParameter " +
-        "--hide MissingPermission " +
-        "--hide RequiresPermission " +
-        "--hide SdkConstant " +
-        "--hide Todo " +
-        "--hide Typo " +
-        "--hide UnavailableSymbol ",
-    filter_packages: ["android.telephony"],
-    sdk_version: "system_current",
-}
-
-java_library {
-    name: "framework-telephony-stubs",
-    srcs: [":framework-telephony-stubs-srcs"],
-    // TODO(b/147699819): move public aidls to a separate folder and potentially remove
-    // below aidl exports.
-    aidl: {
-        export_include_dirs: ["telephony/java"],
-    },
-    sdk_version: "module_current",
-}
-
-filegroup {
-    // TODO (b/147690217): move to frameworks/base/telephony/common.
-    name: "framework-telephony-annotations",
-    srcs: ["telephony/java/android/telephony/Annotation.java"],
-}
-
-filegroup {
-    name: "framework-telephony-jarjar-rules",
-    srcs: ["telephony/framework-telephony-jarjar-rules.txt"],
-}
+]
\ No newline at end of file
diff --git a/Android.mk b/Android.mk
index 3b30714..d3627e1 100644
--- a/Android.mk
+++ b/Android.mk
@@ -36,10 +36,6 @@
 # always included.
 INTERNAL_SDK_SOURCE_DIRS := $(addprefix $(LOCAL_PATH)/,$(dirs_to_document))
 
-$(call dist-for-goals,sdk,$(INTERNAL_PLATFORM_API_FILE))
-$(call dist-for-goals,sdk,$(INTERNAL_PLATFORM_SYSTEM_API_FILE))
-$(call dist-for-goals,sdk,$(INTERNAL_PLATFORM_TEST_API_FILE))
-
 # sdk.atree needs to copy the whole dir: $(OUT_DOCS)/offline-sdk to the final zip.
 # So keep offline-sdk-timestamp target here, and unzip offline-sdk-docs.zip to
 # $(OUT_DOCS)/offline-sdk.
diff --git a/StubLibraries.bp b/StubLibraries.bp
index f06f279..bfc1367 100644
--- a/StubLibraries.bp
+++ b/StubLibraries.bp
@@ -76,9 +76,14 @@
     name: "metalava-non-updatable-api-stubs-default",
     defaults: ["metalava-base-api-stubs-default"],
     sdk_version: "core_platform",
-    libs: ["framework-all"],
+    // There are a few classes from modules used as type arguments that
+    // need to be resolved by metalava. For now, we can use a previously
+    // finalized stub library to resolve them. If a new class gets added,
+    // this may be need to be revisited to use a manually maintained stub
+    // library with empty classes in order to resolve those references.
+    libs: ["sdk_system_29_android"],
     aidl: {
-        local_include_dirs: ["apex/media/framework/java"],
+        local_include_dirs: ["apex/media/aidl/stable"],
     },
 }
 
@@ -92,9 +97,6 @@
 droidstubs {
     name: "api-stubs-docs",
     defaults: ["metalava-full-api-stubs-default"],
-    api_filename: "public_api.txt",
-    private_api_filename: "private.txt",
-    removed_api_filename: "removed.txt",
     removed_dex_api_filename: "removed-dex.txt",
     arg_files: [
         "core/res/AndroidManifest.xml",
@@ -137,11 +139,6 @@
 droidstubs {
     name: "system-api-stubs-docs",
     defaults: ["metalava-full-api-stubs-default"],
-    api_tag_name: "SYSTEM",
-    api_filename: "system-api.txt",
-    private_api_filename: "system-private.txt",
-    private_dex_api_filename: "system-private-dex.txt",
-    removed_api_filename: "system-removed.txt",
     removed_dex_api_filename: "system-removed-dex.txt",
     arg_files: [
         "core/res/AndroidManifest.xml",
@@ -174,9 +171,6 @@
 droidstubs {
     name: "test-api-stubs-docs",
     defaults: ["metalava-full-api-stubs-default"],
-    api_tag_name: "TEST",
-    api_filename: "test-api.txt",
-    removed_api_filename: "test-removed.txt",
     arg_files: [
         "core/res/AndroidManifest.xml",
     ],
@@ -212,7 +206,6 @@
 droidstubs {
     name: "module-lib-api",
     defaults: ["metalava-full-api-stubs-default"],
-    api_tag_name: "MODULE_LIB",
     arg_files: ["core/res/AndroidManifest.xml"],
     args: metalava_framework_docs_args + module_libs,
     check_api: {
@@ -293,7 +286,7 @@
     name: "android_module_lib_stubs_current",
     srcs: [ ":module-lib-api-stubs-docs" ],
     defaults: ["android_defaults_stubs_current"],
-    libs: ["android_system_stubs_current"],
+    libs: ["sdk_system_29_android"],
 }
 
 /////////////////////////////////////////////////////////////////////
diff --git a/apex/blobstore/service/java/com/android/server/blob/BlobStoreConfig.java b/apex/blobstore/service/java/com/android/server/blob/BlobStoreConfig.java
index 6af1178..b4a7cd4 100644
--- a/apex/blobstore/service/java/com/android/server/blob/BlobStoreConfig.java
+++ b/apex/blobstore/service/java/com/android/server/blob/BlobStoreConfig.java
@@ -131,6 +131,10 @@
                         LEASE_ACQUISITION_WAIT_DURATION_MS = properties.getLong(key,
                                 DEFAULT_LEASE_ACQUISITION_WAIT_DURATION_MS);
                         break;
+                    case KEY_COMMIT_COOL_OFF_DURATION_MS:
+                        COMMIT_COOL_OFF_DURATION_MS = properties.getLong(key,
+                                DEFAULT_COMMIT_COOL_OFF_DURATION_MS);
+                        break;
                     default:
                         Slog.wtf(TAG, "Unknown key in device config properties: " + key);
                 }
@@ -149,6 +153,9 @@
             fout.println(String.format(dumpFormat, KEY_LEASE_ACQUISITION_WAIT_DURATION_MS,
                     TimeUtils.formatDuration(LEASE_ACQUISITION_WAIT_DURATION_MS),
                     TimeUtils.formatDuration(DEFAULT_LEASE_ACQUISITION_WAIT_DURATION_MS)));
+            fout.println(String.format(dumpFormat, KEY_COMMIT_COOL_OFF_DURATION_MS,
+                    TimeUtils.formatDuration(COMMIT_COOL_OFF_DURATION_MS),
+                    TimeUtils.formatDuration(DEFAULT_COMMIT_COOL_OFF_DURATION_MS)));
         }
     }
 
diff --git a/apex/jobscheduler/service/java/com/android/server/DeviceIdleController.java b/apex/jobscheduler/service/java/com/android/server/DeviceIdleController.java
index f8b2f32..ac58f3d 100644
--- a/apex/jobscheduler/service/java/com/android/server/DeviceIdleController.java
+++ b/apex/jobscheduler/service/java/com/android/server/DeviceIdleController.java
@@ -1224,7 +1224,7 @@
                 IDLE_FACTOR = mParser.getFloat(KEY_IDLE_FACTOR,
                         2f);
                 MIN_TIME_TO_ALARM = mParser.getDurationMillis(KEY_MIN_TIME_TO_ALARM,
-                        !COMPRESS_TIME ? 60 * 60 * 1000L : 6 * 60 * 1000L);
+                        !COMPRESS_TIME ? 30 * 60 * 1000L : 6 * 60 * 1000L);
                 MAX_TEMP_APP_WHITELIST_DURATION = mParser.getDurationMillis(
                         KEY_MAX_TEMP_APP_WHITELIST_DURATION, 5 * 60 * 1000L);
                 MMS_TEMP_APP_WHITELIST_DURATION = mParser.getDurationMillis(
diff --git a/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java b/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java
index 07a9908..2aa2275 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java
@@ -2182,17 +2182,18 @@
         }
 
         final boolean jobExists = mJobs.containsJob(job);
-
         final boolean userStarted = areUsersStartedLocked(job);
+        final boolean backingUp = mBackingUpUids.indexOfKey(job.getSourceUid()) >= 0;
 
         if (DEBUG) {
             Slog.v(TAG, "isReadyToBeExecutedLocked: " + job.toShortString()
-                    + " exists=" + jobExists + " userStarted=" + userStarted);
+                    + " exists=" + jobExists + " userStarted=" + userStarted
+                    + " backingUp=" + backingUp);
         }
 
         // These are also fairly cheap to check, though they typically will not
         // be conditions we fail.
-        if (!jobExists || !userStarted) {
+        if (!jobExists || !userStarted || backingUp) {
             return false;
         }
 
@@ -2265,15 +2266,17 @@
 
         final boolean jobExists = mJobs.containsJob(job);
         final boolean userStarted = areUsersStartedLocked(job);
+        final boolean backingUp = mBackingUpUids.indexOfKey(job.getSourceUid()) >= 0;
 
         if (DEBUG) {
             Slog.v(TAG, "areComponentsInPlaceLocked: " + job.toShortString()
-                    + " exists=" + jobExists + " userStarted=" + userStarted);
+                    + " exists=" + jobExists + " userStarted=" + userStarted
+                    + " backingUp=" + backingUp);
         }
 
         // These are also fairly cheap to check, though they typically will not
         // be conditions we fail.
-        if (!jobExists || !userStarted) {
+        if (!jobExists || !userStarted || backingUp) {
             return false;
         }
 
diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/BackgroundJobsController.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/BackgroundJobsController.java
index d7b1e07..1645bcb 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/controllers/BackgroundJobsController.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/BackgroundJobsController.java
@@ -184,7 +184,6 @@
     }
 
     boolean updateSingleJobRestrictionLocked(JobStatus jobStatus, int activeState) {
-
         final int uid = jobStatus.getSourceUid();
         final String packageName = jobStatus.getSourcePackageName();
 
@@ -199,7 +198,7 @@
             isActive = (activeState == KNOWN_ACTIVE);
         }
         if (isActive && jobStatus.getStandbyBucket() == NEVER_INDEX) {
-            Slog.wtf(TAG, "App became active but still in NEVER bucket");
+            Slog.wtf(TAG, "App " + packageName + " became active but still in NEVER bucket");
         }
         boolean didChange = jobStatus.setBackgroundNotRestrictedConstraintSatisfied(canRun);
         didChange |= jobStatus.setUidActive(isActive);
diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/idle/DeviceIdlenessTracker.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/idle/DeviceIdlenessTracker.java
index f74eb3b..e2c8f64 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/controllers/idle/DeviceIdlenessTracker.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/idle/DeviceIdlenessTracker.java
@@ -19,10 +19,12 @@
 import static com.android.server.job.JobSchedulerService.sElapsedRealtimeClock;
 
 import android.app.AlarmManager;
+import android.app.UiModeManager;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
+import android.os.PowerManager;
 import android.util.Log;
 import android.util.Slog;
 import android.util.proto.ProtoOutputStream;
@@ -39,6 +41,7 @@
             || Log.isLoggable(TAG, Log.DEBUG);
 
     private AlarmManager mAlarm;
+    private PowerManager mPowerManager;
 
     // After construction, mutations of idle/screen-on state will only happen
     // on the main looper thread, either in onReceive() or in an alarm callback.
@@ -47,6 +50,7 @@
     private boolean mIdle;
     private boolean mScreenOn;
     private boolean mDockIdle;
+    private boolean mInCarMode;
     private IdlenessListener mIdleListener;
 
     private AlarmManager.OnAlarmListener mIdleAlarmListener = () -> {
@@ -59,6 +63,7 @@
         mIdle = false;
         mScreenOn = true;
         mDockIdle = false;
+        mInCarMode = false;
     }
 
     @Override
@@ -74,6 +79,7 @@
         mIdleWindowSlop = context.getResources().getInteger(
                 com.android.internal.R.integer.config_jobSchedulerIdleWindowSlop);
         mAlarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
+        mPowerManager = context.getSystemService(PowerManager.class);
 
         IntentFilter filter = new IntentFilter();
 
@@ -92,6 +98,10 @@
         filter.addAction(Intent.ACTION_DOCK_IDLE);
         filter.addAction(Intent.ACTION_DOCK_ACTIVE);
 
+        // Car mode
+        filter.addAction(UiModeManager.ACTION_ENTER_CAR_MODE_PRIORITIZED);
+        filter.addAction(UiModeManager.ACTION_EXIT_CAR_MODE_PRIORITIZED);
+
         context.registerReceiver(this, filter);
     }
 
@@ -100,6 +110,8 @@
         pw.print("  mIdle: "); pw.println(mIdle);
         pw.print("  mScreenOn: "); pw.println(mScreenOn);
         pw.print("  mDockIdle: "); pw.println(mDockIdle);
+        pw.print("  mInCarMode: ");
+        pw.println(mInCarMode);
     }
 
     @Override
@@ -116,6 +128,9 @@
         proto.write(
                 StateControllerProto.IdleController.IdlenessTracker.DeviceIdlenessTracker.IS_DOCK_IDLE,
                 mDockIdle);
+        proto.write(
+                StateControllerProto.IdleController.IdlenessTracker.DeviceIdlenessTracker.IN_CAR_MODE,
+                mInCarMode);
 
         proto.end(diToken);
         proto.end(token);
@@ -124,63 +139,90 @@
     @Override
     public void onReceive(Context context, Intent intent) {
         final String action = intent.getAction();
-        if (action.equals(Intent.ACTION_SCREEN_ON)
-                || action.equals(Intent.ACTION_DREAMING_STOPPED)
-                || action.equals(Intent.ACTION_DOCK_ACTIVE)) {
-            if (action.equals(Intent.ACTION_DOCK_ACTIVE)) {
+        if (DEBUG) {
+            Slog.v(TAG, "Received action: " + action);
+        }
+        switch (action) {
+            case Intent.ACTION_DOCK_ACTIVE:
                 if (!mScreenOn) {
                     // Ignore this intent during screen off
                     return;
-                } else {
-                    mDockIdle = false;
                 }
-            } else {
+                // Intentional fallthrough
+            case Intent.ACTION_DREAMING_STOPPED:
+                if (!mPowerManager.isInteractive()) {
+                    // Ignore this intent if the device isn't interactive.
+                    return;
+                }
+                // Intentional fallthrough
+            case Intent.ACTION_SCREEN_ON:
                 mScreenOn = true;
                 mDockIdle = false;
-            }
-            if (DEBUG) {
-                Slog.v(TAG,"exiting idle : " + action);
-            }
-            //cancel the alarm
-            mAlarm.cancel(mIdleAlarmListener);
-            if (mIdle) {
-            // possible transition to not-idle
-                mIdle = false;
-                mIdleListener.reportNewIdleState(mIdle);
-            }
-        } else if (action.equals(Intent.ACTION_SCREEN_OFF)
-                || action.equals(Intent.ACTION_DREAMING_STARTED)
-                || action.equals(Intent.ACTION_DOCK_IDLE)) {
-            // when the screen goes off or dreaming starts or wireless charging dock in idle,
-            // we schedule the alarm that will tell us when we have decided the device is
-            // truly idle.
-            if (action.equals(Intent.ACTION_DOCK_IDLE)) {
-                if (!mScreenOn) {
-                    // Ignore this intent during screen off
-                    return;
-                } else {
-                    mDockIdle = true;
+                if (DEBUG) {
+                    Slog.v(TAG, "exiting idle");
                 }
-            } else {
-                mScreenOn = false;
-                mDockIdle = false;
-            }
+                cancelIdlenessCheck();
+                if (mIdle) {
+                    mIdle = false;
+                    mIdleListener.reportNewIdleState(mIdle);
+                }
+                break;
+            case Intent.ACTION_SCREEN_OFF:
+            case Intent.ACTION_DREAMING_STARTED:
+            case Intent.ACTION_DOCK_IDLE:
+                // when the screen goes off or dreaming starts or wireless charging dock in idle,
+                // we schedule the alarm that will tell us when we have decided the device is
+                // truly idle.
+                if (action.equals(Intent.ACTION_DOCK_IDLE)) {
+                    if (!mScreenOn) {
+                        // Ignore this intent during screen off
+                        return;
+                    } else {
+                        mDockIdle = true;
+                    }
+                } else {
+                    mScreenOn = false;
+                    mDockIdle = false;
+                }
+                maybeScheduleIdlenessCheck(action);
+                break;
+            case UiModeManager.ACTION_ENTER_CAR_MODE_PRIORITIZED:
+                mInCarMode = true;
+                cancelIdlenessCheck();
+                if (mIdle) {
+                    mIdle = false;
+                    mIdleListener.reportNewIdleState(mIdle);
+                }
+                break;
+            case UiModeManager.ACTION_EXIT_CAR_MODE_PRIORITIZED:
+                mInCarMode = false;
+                maybeScheduleIdlenessCheck(action);
+                break;
+            case ActivityManagerService.ACTION_TRIGGER_IDLE:
+                handleIdleTrigger();
+                break;
+        }
+    }
+
+    private void maybeScheduleIdlenessCheck(String reason) {
+        if ((!mScreenOn || mDockIdle) && !mInCarMode) {
             final long nowElapsed = sElapsedRealtimeClock.millis();
             final long when = nowElapsed + mInactivityIdleThreshold;
             if (DEBUG) {
-                Slog.v(TAG, "Scheduling idle : " + action + " now:" + nowElapsed + " when="
-                        + when);
+                Slog.v(TAG, "Scheduling idle : " + reason + " now:" + nowElapsed + " when=" + when);
             }
             mAlarm.setWindow(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                     when, mIdleWindowSlop, "JS idleness", mIdleAlarmListener, null);
-        } else if (action.equals(ActivityManagerService.ACTION_TRIGGER_IDLE)) {
-            handleIdleTrigger();
         }
     }
 
+    private void cancelIdlenessCheck() {
+        mAlarm.cancel(mIdleAlarmListener);
+    }
+
     private void handleIdleTrigger() {
         // idle time starts now. Do not set mIdle if screen is on.
-        if (!mIdle && (!mScreenOn || mDockIdle)) {
+        if (!mIdle && (!mScreenOn || mDockIdle) && !mInCarMode) {
             if (DEBUG) {
                 Slog.v(TAG, "Idle trigger fired @ " + sElapsedRealtimeClock.millis());
             }
@@ -189,7 +231,7 @@
         } else {
             if (DEBUG) {
                 Slog.v(TAG, "TRIGGER_IDLE received but not changing state; idle="
-                        + mIdle + " screen=" + mScreenOn);
+                        + mIdle + " screen=" + mScreenOn + " car=" + mInCarMode);
             }
         }
     }
diff --git a/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java b/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java
index 1ab7938..3c1fafb 100644
--- a/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java
+++ b/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java
@@ -172,8 +172,7 @@
             COMPRESS_TIME ?  1 * ONE_MINUTE : 12 * ONE_HOUR,
             COMPRESS_TIME ?  4 * ONE_MINUTE : 24 * ONE_HOUR,
             COMPRESS_TIME ? 16 * ONE_MINUTE : 48 * ONE_HOUR,
-            // TODO(149050681): increase timeout to 30+ days
-            COMPRESS_TIME ? 32 * ONE_MINUTE : 4 * ONE_DAY
+            COMPRESS_TIME ? 32 * ONE_MINUTE : 30 * ONE_DAY
     };
 
     /** The minimum allowed values for each index in {@link #ELAPSED_TIME_THRESHOLDS}. */
diff --git a/apex/media/framework/java/android/media/MediaParser.java b/apex/media/framework/java/android/media/MediaParser.java
index e533b7a..50f4ddd 100644
--- a/apex/media/framework/java/android/media/MediaParser.java
+++ b/apex/media/framework/java/android/media/MediaParser.java
@@ -21,14 +21,15 @@
 import android.annotation.Nullable;
 import android.annotation.StringDef;
 import android.media.MediaCodec.CryptoInfo;
-import android.net.Uri;
 import android.text.TextUtils;
+import android.util.Log;
 import android.util.Pair;
 import android.util.SparseArray;
 
 import com.google.android.exoplayer2.C;
 import com.google.android.exoplayer2.Format;
 import com.google.android.exoplayer2.ParserException;
+import com.google.android.exoplayer2.drm.DrmInitData.SchemeData;
 import com.google.android.exoplayer2.extractor.DefaultExtractorInput;
 import com.google.android.exoplayer2.extractor.Extractor;
 import com.google.android.exoplayer2.extractor.ExtractorInput;
@@ -51,18 +52,17 @@
 import com.google.android.exoplayer2.extractor.ts.PsExtractor;
 import com.google.android.exoplayer2.extractor.ts.TsExtractor;
 import com.google.android.exoplayer2.extractor.wav.WavExtractor;
-import com.google.android.exoplayer2.upstream.DataSource;
-import com.google.android.exoplayer2.upstream.DataSpec;
-import com.google.android.exoplayer2.upstream.TransferListener;
+import com.google.android.exoplayer2.upstream.DataReader;
 import com.google.android.exoplayer2.util.ParsableByteArray;
 import com.google.android.exoplayer2.util.Util;
 import com.google.android.exoplayer2.video.ColorInfo;
 
 import java.io.EOFException;
 import java.io.IOException;
-import java.io.InterruptedIOException;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -70,6 +70,7 @@
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.UUID;
 
 /**
  * Parses media container formats and extracts contained media samples and metadata.
@@ -711,6 +712,7 @@
 
     // Private constants.
 
+    private static final String TAG = "MediaParser";
     private static final Map<String, ExtractorFactory> EXTRACTOR_FACTORIES_BY_NAME;
     private static final Map<String, Class> EXPECTED_TYPE_BY_PARAMETER_NAME;
     private static final String TS_MODE_SINGLE_PMT = "single_pmt";
@@ -847,14 +849,16 @@
     private final OutputConsumer mOutputConsumer;
     private final String[] mParserNamesPool;
     private final PositionHolder mPositionHolder;
-    private final InputReadingDataSource mDataSource;
-    private final ExtractorInputAdapter mScratchExtractorInputAdapter;
+    private final InputReadingDataReader mExoDataReader;
+    private final DataReaderAdapter mScratchDataReaderAdapter;
     private final ParsableByteArrayAdapter mScratchParsableByteArrayAdapter;
-    private String mExtractorName;
+    @Nullable private final Constructor<DrmInitData.SchemeInitData> mSchemeInitDataConstructor;
+    private String mParserName;
     private Extractor mExtractor;
     private ExtractorInput mExtractorInput;
     private long mPendingSeekPosition;
     private long mPendingSeekTimeMicros;
+    private boolean mLoggedSchemeInitDataCreationException;
 
     // Public methods.
 
@@ -924,7 +928,7 @@
     @NonNull
     @ParserName
     public String getParserName() {
-        return mExtractorName;
+        return mParserName;
     }
 
     /**
@@ -950,33 +954,29 @@
             // clearBuffers() method, or similar.
             mExtractorInput =
                     new DefaultExtractorInput(
-                            mDataSource,
+                            mExoDataReader,
                             seekableInputReader.getPosition(),
                             seekableInputReader.getLength());
         }
-        mDataSource.mInputReader = seekableInputReader;
+        mExoDataReader.mInputReader = seekableInputReader;
 
         // TODO: Apply parameters when creating extractor instances.
         if (mExtractor == null) {
-            if (!mExtractorName.equals(PARSER_NAME_UNKNOWN)) {
-                mExtractor = EXTRACTOR_FACTORIES_BY_NAME.get(mExtractorName).createInstance();
+            if (!mParserName.equals(PARSER_NAME_UNKNOWN)) {
+                mExtractor = createExtractor(mParserName);
                 mExtractor.init(new ExtractorOutputAdapter());
             } else {
                 for (String parserName : mParserNamesPool) {
                     Extractor extractor = createExtractor(parserName);
                     try {
                         if (extractor.sniff(mExtractorInput)) {
-                            mExtractorName = parserName;
+                            mParserName = parserName;
                             mExtractor = extractor;
                             mExtractor.init(new ExtractorOutputAdapter());
                             break;
                         }
                     } catch (EOFException e) {
                         // Do nothing.
-                    } catch (InterruptedException e) {
-                        // TODO: Remove this exception replacement once we update the ExoPlayer
-                        // version.
-                        throw new InterruptedIOException();
                     } finally {
                         mExtractorInput.resetPeekPosition();
                     }
@@ -999,9 +999,6 @@
             result = mExtractor.read(mExtractorInput, mPositionHolder);
         } catch (ParserException e) {
             throw new ParsingException(e);
-        } catch (InterruptedException e) {
-            // TODO: Remove this exception replacement once we update the ExoPlayer version.
-            throw new InterruptedIOException();
         }
         if (result == Extractor.RESULT_END_OF_INPUT) {
             return false;
@@ -1051,12 +1048,13 @@
         mParserParameters = new HashMap<>();
         mOutputConsumer = outputConsumer;
         mParserNamesPool = parserNamesPool;
-        mExtractorName = sniff ? PARSER_NAME_UNKNOWN : parserNamesPool[0];
+        mParserName = sniff ? PARSER_NAME_UNKNOWN : parserNamesPool[0];
         mPositionHolder = new PositionHolder();
-        mDataSource = new InputReadingDataSource();
+        mExoDataReader = new InputReadingDataReader();
         removePendingSeek();
-        mScratchExtractorInputAdapter = new ExtractorInputAdapter();
+        mScratchDataReaderAdapter = new DataReaderAdapter();
         mScratchParsableByteArrayAdapter = new ParsableByteArrayAdapter();
+        mSchemeInitDataConstructor = getSchemeInitDataConstructor();
     }
 
     private boolean isPendingSeek() {
@@ -1097,7 +1095,7 @@
                         getBooleanParameter(PARAMETER_MP4_IGNORE_EDIT_LISTS)
                                 ? Mp4Extractor.FLAG_WORKAROUND_IGNORE_EDIT_LISTS
                                 : 0;
-                return new Mp4Extractor();
+                return new Mp4Extractor(flags);
             case PARSER_NAME_MP3:
                 flags |=
                         getBooleanParameter(PARAMETER_MP3_DISABLE_ID3)
@@ -1188,38 +1186,53 @@
 
     // Private classes.
 
-    private static final class InputReadingDataSource implements DataSource {
+    private static final class InputReadingDataReader implements DataReader {
 
         public InputReader mInputReader;
 
         @Override
-        public void addTransferListener(TransferListener transferListener) {
-            // Do nothing.
-        }
-
-        @Override
-        public long open(DataSpec dataSpec) {
-            throw new UnsupportedOperationException();
-        }
-
-        @Override
         public int read(byte[] buffer, int offset, int readLength) throws IOException {
             return mInputReader.read(buffer, offset, readLength);
         }
+    }
+
+    private final class MediaParserDrmInitData extends DrmInitData {
+
+        private final SchemeInitData[] mSchemeDatas;
+
+        private MediaParserDrmInitData(com.google.android.exoplayer2.drm.DrmInitData exoDrmInitData)
+                throws IllegalAccessException, InstantiationException, InvocationTargetException {
+            mSchemeDatas = new SchemeInitData[exoDrmInitData.schemeDataCount];
+            for (int i = 0; i < mSchemeDatas.length; i++) {
+                mSchemeDatas[i] = toFrameworkSchemeInitData(exoDrmInitData.get(i));
+            }
+        }
 
         @Override
-        public Uri getUri() {
+        @Nullable
+        public SchemeInitData get(UUID schemeUuid) {
+            for (SchemeInitData schemeInitData : mSchemeDatas) {
+                if (schemeInitData.uuid.equals(schemeUuid)) {
+                    return schemeInitData;
+                }
+            }
             return null;
         }
 
         @Override
-        public Map<String, List<String>> getResponseHeaders() {
-            return null;
+        public SchemeInitData getSchemeInitDataAt(int index) {
+            return mSchemeDatas[index];
         }
 
         @Override
-        public void close() {
-            throw new UnsupportedOperationException();
+        public int getSchemeInitDataCount() {
+            return mSchemeDatas.length;
+        }
+
+        private DrmInitData.SchemeInitData toFrameworkSchemeInitData(SchemeData exoSchemeData)
+                throws IllegalAccessException, InvocationTargetException, InstantiationException {
+            return mSchemeInitDataConstructor.newInstance(
+                    exoSchemeData.uuid, exoSchemeData.mimeType, exoSchemeData.data);
         }
     }
 
@@ -1270,12 +1283,12 @@
         }
 
         @Override
-        public int sampleData(ExtractorInput input, int length, boolean allowEndOfInput)
+        public int sampleData(DataReader input, int length, boolean allowEndOfInput)
                 throws IOException {
-            mScratchExtractorInputAdapter.setExtractorInput(input, length);
-            long positionBeforeReading = mScratchExtractorInputAdapter.getPosition();
-            mOutputConsumer.onSampleDataFound(mTrackIndex, mScratchExtractorInputAdapter);
-            return (int) (mScratchExtractorInputAdapter.getPosition() - positionBeforeReading);
+            mScratchDataReaderAdapter.setDataReader(input, length);
+            long positionBeforeReading = mScratchDataReaderAdapter.getPosition();
+            mOutputConsumer.onSampleDataFound(mTrackIndex, mScratchDataReaderAdapter);
+            return (int) (mScratchDataReaderAdapter.getPosition() - positionBeforeReading);
         }
 
         @Override
@@ -1297,14 +1310,14 @@
         }
     }
 
-    private static final class ExtractorInputAdapter implements InputReader {
+    private static final class DataReaderAdapter implements InputReader {
 
-        private ExtractorInput mExtractorInput;
+        private DataReader mDataReader;
         private int mCurrentPosition;
         private long mLength;
 
-        public void setExtractorInput(ExtractorInput extractorInput, long length) {
-            mExtractorInput = extractorInput;
+        public void setDataReader(DataReader dataReader, long length) {
+            mDataReader = dataReader;
             mCurrentPosition = 0;
             mLength = length;
         }
@@ -1314,12 +1327,7 @@
         @Override
         public int read(byte[] buffer, int offset, int readLength) throws IOException {
             int readBytes = 0;
-            try {
-                readBytes = mExtractorInput.read(buffer, offset, readLength);
-            } catch (InterruptedException e) {
-                // TODO: Remove this exception replacement once we update the ExoPlayer version.
-                throw new InterruptedIOException();
-            }
+            readBytes = mDataReader.read(buffer, offset, readLength);
             mCurrentPosition += readBytes;
             return readBytes;
         }
@@ -1404,16 +1412,16 @@
         setOptionalMediaFormatInt(result, MediaFormat.KEY_HEIGHT, format.height);
 
         List<byte[]> initData = format.initializationData;
-        if (initData != null) {
-            for (int i = 0; i < initData.size(); i++) {
-                result.setByteBuffer("csd-" + i, ByteBuffer.wrap(initData.get(i)));
-            }
+        for (int i = 0; i < initData.size(); i++) {
+            result.setByteBuffer("csd-" + i, ByteBuffer.wrap(initData.get(i)));
         }
+        setPcmEncoding(format, result);
         setOptionalMediaFormatString(result, MediaFormat.KEY_LANGUAGE, format.language);
         setOptionalMediaFormatInt(result, MediaFormat.KEY_MAX_INPUT_SIZE, format.maxInputSize);
-        setOptionalMediaFormatInt(result, MediaFormat.KEY_PCM_ENCODING, format.pcmEncoding);
         setOptionalMediaFormatInt(result, MediaFormat.KEY_ROTATION, format.rotationDegrees);
         setOptionalMediaFormatInt(result, MediaFormat.KEY_SAMPLE_RATE, format.sampleRate);
+        setOptionalMediaFormatInt(
+                result, MediaFormat.KEY_CAPTION_SERVICE_NUMBER, format.accessibilityChannel);
 
         int selectionFlags = format.selectionFlags;
         result.setInteger(
@@ -1439,18 +1447,40 @@
             result.setInteger(MediaFormat.KEY_PIXEL_ASPECT_RATIO_HEIGHT, parHeight);
             result.setFloat("pixel-width-height-ratio-float", format.pixelWidthHeightRatio);
         }
-
+        if (format.drmInitData != null) {
+            // The crypto mode is propagated along with sample metadata. We also include it in the
+            // format for convenient use from ExoPlayer.
+            result.setString("crypto-mode-fourcc", format.drmInitData.schemeType);
+        }
         // LACK OF SUPPORT FOR:
-        //    format.accessibilityChannel;
         //    format.containerMimeType;
         //    format.id;
         //    format.metadata;
-        //    format.roleFlags;
         //    format.stereoMode;
-        //    format.subsampleOffsetUs;
         return result;
     }
 
+    private static void setPcmEncoding(Format format, MediaFormat result) {
+        int exoPcmEncoding = format.pcmEncoding;
+        setOptionalMediaFormatInt(result, "exo-pcm-encoding", format.pcmEncoding);
+        int mediaFormatPcmEncoding;
+        switch (exoPcmEncoding) {
+            case C.ENCODING_PCM_8BIT:
+                mediaFormatPcmEncoding = AudioFormat.ENCODING_PCM_8BIT;
+                break;
+            case C.ENCODING_PCM_16BIT:
+                mediaFormatPcmEncoding = AudioFormat.ENCODING_PCM_16BIT;
+                break;
+            case C.ENCODING_PCM_FLOAT:
+                mediaFormatPcmEncoding = AudioFormat.ENCODING_PCM_FLOAT;
+                break;
+            default:
+                // No matching value. Do nothing.
+                return;
+        }
+        result.setInteger(MediaFormat.KEY_PCM_ENCODING, mediaFormatPcmEncoding);
+    }
+
     private static void setOptionalMediaFormatInt(MediaFormat mediaFormat, String key, int value) {
         if (value != Format.NO_VALUE) {
             mediaFormat.setInteger(key, value);
@@ -1464,10 +1494,19 @@
         }
     }
 
-    private static DrmInitData toFrameworkDrmInitData(
-            com.google.android.exoplayer2.drm.DrmInitData drmInitData) {
-        // TODO: Implement.
-        return null;
+    private DrmInitData toFrameworkDrmInitData(
+            com.google.android.exoplayer2.drm.DrmInitData exoDrmInitData) {
+        try {
+            return exoDrmInitData != null && mSchemeInitDataConstructor != null
+                    ? new MediaParserDrmInitData(exoDrmInitData)
+                    : null;
+        } catch (Throwable e) {
+            if (!mLoggedSchemeInitDataCreationException) {
+                mLoggedSchemeInitDataCreationException = true;
+                Log.e(TAG, "Unable to create SchemeInitData instance.");
+            }
+            return null;
+        }
     }
 
     private static CryptoInfo toCryptoInfo(TrackOutput.CryptoData encryptionData) {
@@ -1494,6 +1533,19 @@
         }
     }
 
+    @Nullable
+    private static Constructor<DrmInitData.SchemeInitData> getSchemeInitDataConstructor() {
+        // TODO: Use constructor statically when available.
+        Constructor<DrmInitData.SchemeInitData> constructor;
+        try {
+            return DrmInitData.SchemeInitData.class.getConstructor(
+                    UUID.class, String.class, byte[].class);
+        } catch (Throwable e) {
+            Log.e(TAG, "Unable to get SchemeInitData constructor.");
+            return null;
+        }
+    }
+
     // Static initialization.
 
     static {
diff --git a/apex/sdkextensions/derive_sdk/derive_sdk.rc b/apex/sdkextensions/derive_sdk/derive_sdk.rc
index 1b66794..18f021c 100644
--- a/apex/sdkextensions/derive_sdk/derive_sdk.rc
+++ b/apex/sdkextensions/derive_sdk/derive_sdk.rc
@@ -1,3 +1,5 @@
 service derive_sdk /apex/com.android.sdkext/bin/derive_sdk
+    user nobody
+    group nobody
     oneshot
     disabled
diff --git a/apex/sdkextensions/framework/java/android/os/ext/SdkExtensions.java b/apex/sdkextensions/framework/java/android/os/ext/SdkExtensions.java
index 103b53e..c268ff4 100644
--- a/apex/sdkextensions/framework/java/android/os/ext/SdkExtensions.java
+++ b/apex/sdkextensions/framework/java/android/os/ext/SdkExtensions.java
@@ -62,7 +62,11 @@
         if (sdk < VERSION_CODES.R) {
             throw new IllegalArgumentException(String.valueOf(sdk) + " does not have extensions");
         }
-        return R_EXTENSION_INT;
+
+        if (sdk == VERSION_CODES.R) {
+            return R_EXTENSION_INT;
+        }
+        return 0;
     }
 
 }
diff --git a/apex/statsd/aidl/Android.bp b/apex/statsd/aidl/Android.bp
index 404c632..04339e6 100644
--- a/apex/statsd/aidl/Android.bp
+++ b/apex/statsd/aidl/Android.bp
@@ -20,6 +20,7 @@
 
 aidl_interface {
     name: "statsd-aidl",
+    unstable: true,
     srcs: [
         "android/os/IPendingIntentRef.aidl",
         "android/os/IPullAtomCallback.aidl",
diff --git a/apex/statsd/aidl/android/os/IStatsd.aidl b/apex/statsd/aidl/android/os/IStatsd.aidl
index 80308d2..0d3f420 100644
--- a/apex/statsd/aidl/android/os/IStatsd.aidl
+++ b/apex/statsd/aidl/android/os/IStatsd.aidl
@@ -182,12 +182,6 @@
     void unsetBroadcastSubscriber(long configId, long subscriberId, int callingUid);
 
     /**
-     * Apps can send an atom via this application breadcrumb with the specified label and state for
-     * this label. This allows building custom metrics and predicates.
-     */
-    void sendAppBreadcrumbAtom(int label, int state);
-
-    /**
      * Tell the stats daemon that all the pullers registered during boot have been sent.
      */
     oneway void allPullersFromBootRegistered();
diff --git a/apex/statsd/framework/java/android/util/StatsLog.java b/apex/statsd/framework/java/android/util/StatsLog.java
index 536b71a..4eeae57 100644
--- a/apex/statsd/framework/java/android/util/StatsLog.java
+++ b/apex/statsd/framework/java/android/util/StatsLog.java
@@ -25,8 +25,7 @@
 import android.annotation.SystemApi;
 import android.content.Context;
 import android.os.IStatsd;
-import android.os.RemoteException;
-import android.os.StatsFrameworkInitializer;
+import android.os.Process;
 import android.util.proto.ProtoOutputStream;
 
 import com.android.internal.util.StatsdStatsLog;
@@ -45,10 +44,6 @@
     private static final boolean DEBUG = false;
     private static final int EXPERIMENT_IDS_FIELD_ID = 1;
 
-    private static IStatsd sService;
-
-    private static Object sLogLock = new Object();
-
     private StatsLog() {
     }
 
@@ -59,26 +54,13 @@
      * @return True if the log request was sent to statsd.
      */
     public static boolean logStart(int label) {
-        synchronized (sLogLock) {
-            try {
-                IStatsd service = getIStatsdLocked();
-                if (service == null) {
-                    if (DEBUG) {
-                        Log.d(TAG, "Failed to find statsd when logging start");
-                    }
-                    return false;
-                }
-                service.sendAppBreadcrumbAtom(label,
-                        StatsdStatsLog.APP_BREADCRUMB_REPORTED__STATE__START);
-                return true;
-            } catch (RemoteException e) {
-                sService = null;
-                if (DEBUG) {
-                    Log.d(TAG, "Failed to connect to statsd when logging start");
-                }
-                return false;
-            }
-        }
+        int callingUid = Process.myUid();
+        StatsdStatsLog.write(
+                StatsdStatsLog.APP_BREADCRUMB_REPORTED,
+                callingUid,
+                label,
+                StatsdStatsLog.APP_BREADCRUMB_REPORTED__STATE__START);
+        return true;
     }
 
     /**
@@ -88,26 +70,13 @@
      * @return True if the log request was sent to statsd.
      */
     public static boolean logStop(int label) {
-        synchronized (sLogLock) {
-            try {
-                IStatsd service = getIStatsdLocked();
-                if (service == null) {
-                    if (DEBUG) {
-                        Log.d(TAG, "Failed to find statsd when logging stop");
-                    }
-                    return false;
-                }
-                service.sendAppBreadcrumbAtom(
-                        label, StatsdStatsLog.APP_BREADCRUMB_REPORTED__STATE__STOP);
-                return true;
-            } catch (RemoteException e) {
-                sService = null;
-                if (DEBUG) {
-                    Log.d(TAG, "Failed to connect to statsd when logging stop");
-                }
-                return false;
-            }
-        }
+        int callingUid = Process.myUid();
+        StatsdStatsLog.write(
+                StatsdStatsLog.APP_BREADCRUMB_REPORTED,
+                callingUid,
+                label,
+                StatsdStatsLog.APP_BREADCRUMB_REPORTED__STATE__STOP);
+        return true;
     }
 
     /**
@@ -117,26 +86,13 @@
      * @return True if the log request was sent to statsd.
      */
     public static boolean logEvent(int label) {
-        synchronized (sLogLock) {
-            try {
-                IStatsd service = getIStatsdLocked();
-                if (service == null) {
-                    if (DEBUG) {
-                        Log.d(TAG, "Failed to find statsd when logging event");
-                    }
-                    return false;
-                }
-                service.sendAppBreadcrumbAtom(
-                        label, StatsdStatsLog.APP_BREADCRUMB_REPORTED__STATE__UNSPECIFIED);
-                return true;
-            } catch (RemoteException e) {
-                sService = null;
-                if (DEBUG) {
-                    Log.d(TAG, "Failed to connect to statsd when logging event");
-                }
-                return false;
-            }
-        }
+        int callingUid = Process.myUid();
+        StatsdStatsLog.write(
+                StatsdStatsLog.APP_BREADCRUMB_REPORTED,
+                callingUid,
+                label,
+                StatsdStatsLog.APP_BREADCRUMB_REPORTED__STATE__UNSPECIFIED);
+        return true;
     }
 
     /**
@@ -181,17 +137,6 @@
         return true;
     }
 
-    private static IStatsd getIStatsdLocked() throws RemoteException {
-        if (sService != null) {
-            return sService;
-        }
-        sService = IStatsd.Stub.asInterface(StatsFrameworkInitializer
-            .getStatsServiceManager()
-            .getStatsdServiceRegisterer()
-            .get());
-        return sService;
-    }
-
     /**
      * Write an event to stats log using the raw format.
      *
diff --git a/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java b/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java
index ce5309e..93e6c10 100644
--- a/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java
+++ b/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java
@@ -166,13 +166,6 @@
     }
 
     private static void informAllUids(Context context) {
-        UserManager um = (UserManager) context.getSystemService(Context.USER_SERVICE);
-        PackageManager pm = context.getPackageManager();
-        final List<UserHandle> users = um.getUserHandles(true);
-        if (DEBUG) {
-            Log.d(TAG, "Iterating over " + users.size() + " userHandles.");
-        }
-
         ParcelFileDescriptor[] fds;
         try {
             fds = ParcelFileDescriptor.createPipe();
@@ -185,6 +178,12 @@
         backgroundThread.start();
         Handler handler = new Handler(backgroundThread.getLooper());
         handler.post(() -> {
+            UserManager um = (UserManager) context.getSystemService(Context.USER_SERVICE);
+            PackageManager pm = context.getPackageManager();
+            final List<UserHandle> users = um.getUserHandles(true);
+            if (DEBUG) {
+                Log.d(TAG, "Iterating over " + users.size() + " userHandles.");
+            }
             IStatsd statsd = getStatsdNonblocking();
             if (statsd == null) {
                 return;
@@ -699,8 +698,6 @@
             deathRecipient.addRegisteredBroadcastReceivers(
                     List.of(appUpdateReceiver, userUpdateReceiver, shutdownEventReceiver));
 
-            final long token = Binder.clearCallingIdentity();
-
             // Used so we can call statsd.bootComplete() outside of the lock.
             boolean shouldSendBootComplete = false;
             synchronized (sStatsdLock) {
@@ -713,13 +710,10 @@
                 statsd.bootCompleted();
             }
 
-            try {
-                // Pull the latest state of UID->app name, version mapping when
-                // statsd starts.
-                informAllUids(mContext);
-            } finally {
-                Binder.restoreCallingIdentity(token);
-            }
+            // Pull the latest state of UID->app name, version mapping when
+            // statsd starts.
+            informAllUids(mContext);
+
             Log.i(TAG, "Told statsd that StatsCompanionService is alive.");
         } catch (RemoteException e) {
             Log.e(TAG, "Failed to inform statsd that statscompanion is ready", e);
diff --git a/apex/statsd/tests/libstatspull/Android.bp b/apex/statsd/tests/libstatspull/Android.bp
index 0df96e1..05b3e04 100644
--- a/apex/statsd/tests/libstatspull/Android.bp
+++ b/apex/statsd/tests/libstatspull/Android.bp
@@ -33,6 +33,7 @@
         ],
     test_suites: [
         "device-tests",
+        "mts",
     ],
     platform_apis: true,
     privileged: true,
diff --git a/api/current.txt b/api/current.txt
index 80e2d00..3f8bee9 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -48759,12 +48759,8 @@
     method public void onCapabilitiesStatusChanged(@NonNull android.telephony.ims.feature.MmTelFeature.MmTelCapabilities);
   }
 
-  public class ImsRcsManager implements android.telephony.ims.RegistrationManager {
-    method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public void getRegistrationState(@NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Integer>);
-    method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public void getRegistrationTransportType(@NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Integer>);
+  public class ImsRcsManager {
     method @NonNull public android.telephony.ims.RcsUceAdapter getUceAdapter();
-    method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public void registerImsRegistrationCallback(@NonNull java.util.concurrent.Executor, @NonNull android.telephony.ims.RegistrationManager.RegistrationCallback) throws android.telephony.ims.ImsException;
-    method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public void unregisterImsRegistrationCallback(@NonNull android.telephony.ims.RegistrationManager.RegistrationCallback);
     field public static final String ACTION_SHOW_CAPABILITY_DISCOVERY_OPT_IN = "android.telephony.ims.action.SHOW_CAPABILITY_DISCOVERY_OPT_IN";
   }
 
diff --git a/api/test-current.txt b/api/test-current.txt
index 0dff41b..96cefe1 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -107,6 +107,7 @@
   }
 
   public class ActivityOptions {
+    method @NonNull public static android.app.ActivityOptions makeCustomAnimation(@NonNull android.content.Context, int, int, @Nullable android.os.Handler, @Nullable android.app.ActivityOptions.OnAnimationStartedListener, @Nullable android.app.ActivityOptions.OnAnimationFinishedListener);
     method public static void setExitTransitionTimeout(long);
     method public void setLaunchActivityType(int);
     method public void setLaunchTaskId(int);
@@ -115,8 +116,17 @@
     method public void setTaskOverlay(boolean, boolean);
   }
 
+  public static interface ActivityOptions.OnAnimationFinishedListener {
+    method public void onAnimationFinished();
+  }
+
+  public static interface ActivityOptions.OnAnimationStartedListener {
+    method public void onAnimationStarted();
+  }
+
   public class ActivityTaskManager {
     method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public void clearLaunchParamsForPackages(java.util.List<java.lang.String>);
+    method public static boolean currentUiModeSupportsErrorDialogs(@NonNull android.content.Context);
     method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public String listAllStacks();
     method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public void moveTaskToStack(int, int, boolean);
     method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public boolean moveTopActivityToPinnedStack(int, android.graphics.Rect);
@@ -142,6 +152,7 @@
     ctor public ActivityView(android.content.Context, android.util.AttributeSet);
     ctor public ActivityView(android.content.Context, android.util.AttributeSet, int);
     ctor public ActivityView(android.content.Context, android.util.AttributeSet, int, boolean);
+    ctor public ActivityView(@NonNull android.content.Context, @NonNull android.util.AttributeSet, int, boolean, boolean);
     method public int getVirtualDisplayId();
     method public void onLayout(boolean, int, int, int, int);
     method public void onLocationChanged();
@@ -494,6 +505,11 @@
     method public boolean isStatusBarExpansionDisabled();
   }
 
+  public class TaskInfo {
+    method @NonNull public android.content.res.Configuration getConfiguration();
+    method @NonNull public android.window.WindowContainerToken getToken();
+  }
+
   public class TimePickerDialog extends android.app.AlertDialog implements android.content.DialogInterface.OnClickListener android.widget.TimePicker.OnTimeChangedListener {
     method public android.widget.TimePicker getTimePicker();
   }
@@ -1311,6 +1327,34 @@
 
 }
 
+package android.hardware.soundtrigger {
+
+  public class KeyphraseEnrollmentInfo {
+    ctor public KeyphraseEnrollmentInfo(@NonNull android.content.pm.PackageManager);
+    method @Nullable public android.hardware.soundtrigger.KeyphraseMetadata getKeyphraseMetadata(@NonNull String, @NonNull java.util.Locale);
+    method @Nullable public android.content.Intent getManageKeyphraseIntent(int, @NonNull String, @NonNull java.util.Locale);
+    method @NonNull public String getParseError();
+    method @NonNull public java.util.Collection<android.hardware.soundtrigger.KeyphraseMetadata> listKeyphraseMetadata();
+    field public static final int MANAGE_ACTION_ENROLL = 0; // 0x0
+    field public static final int MANAGE_ACTION_RE_ENROLL = 1; // 0x1
+    field public static final int MANAGE_ACTION_UN_ENROLL = 2; // 0x2
+  }
+
+  public final class KeyphraseMetadata implements android.os.Parcelable {
+    ctor public KeyphraseMetadata(int, @NonNull String, @NonNull java.util.Set<java.util.Locale>, int);
+    method public int describeContents();
+    method public int getId();
+    method @NonNull public String getKeyphrase();
+    method public int getRecognitionModeFlags();
+    method @NonNull public java.util.Set<java.util.Locale> getSupportedLocales();
+    method public boolean supportsLocale(@Nullable java.util.Locale);
+    method public boolean supportsPhrase(@Nullable String);
+    method public void writeToParcel(@NonNull android.os.Parcel, int);
+    field @NonNull public static final android.os.Parcelable.Creator<android.hardware.soundtrigger.KeyphraseMetadata> CREATOR;
+  }
+
+}
+
 package android.location {
 
   public final class GnssClock implements android.os.Parcelable {
@@ -2263,7 +2307,11 @@
 
   public class Environment {
     method public static java.io.File buildPath(java.io.File, java.lang.String...);
+    method @NonNull public static java.io.File getOdmDirectory();
+    method @NonNull public static java.io.File getOemDirectory();
     method @NonNull public static java.io.File getProductDirectory();
+    method @NonNull public static java.io.File getSystemExtDirectory();
+    method @NonNull public static java.io.File getVendorDirectory();
   }
 
   public final class FileUtils {
@@ -3039,6 +3087,7 @@
     field public static final String LOCK_SCREEN_SHOW_NOTIFICATIONS = "lock_screen_show_notifications";
     field public static final String NFC_PAYMENT_DEFAULT_COMPONENT = "nfc_payment_default_component";
     field public static final String NOTIFICATION_BADGING = "notification_badging";
+    field public static final String POWER_MENU_LOCKED_SHOW_CONTENT = "power_menu_locked_show_content";
     field @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public static final String SYNC_PARENT_SOUNDS = "sync_parent_sounds";
     field public static final String USER_SETUP_COMPLETE = "user_setup_complete";
     field public static final String VOICE_INTERACTION_SERVICE = "voice_interaction_service";
@@ -4936,6 +4985,7 @@
 
   public class AccessibilityNodeInfo implements android.os.Parcelable {
     method public void addChild(@NonNull android.os.IBinder);
+    method public long getSourceNodeId();
     method public void setLeashedParent(@Nullable android.os.IBinder, int);
     method public static void setNumInstancesInUseCounter(java.util.concurrent.atomic.AtomicInteger);
     method public void writeToParcelNoRecycle(android.os.Parcel, int);
@@ -5211,10 +5261,20 @@
 
 package android.window {
 
+  public final class DisplayAreaInfo implements android.os.Parcelable {
+    ctor public DisplayAreaInfo(@NonNull android.window.WindowContainerToken, int);
+    method public int describeContents();
+    method public void writeToParcel(@NonNull android.os.Parcel, int);
+    field @NonNull public static final android.os.Parcelable.Creator<android.window.DisplayAreaInfo> CREATOR;
+    field @NonNull public final android.content.res.Configuration configuration;
+    field public final int displayId;
+    field @NonNull public final android.window.WindowContainerToken token;
+  }
+
   public class DisplayAreaOrganizer extends android.window.WindowOrganizer {
     ctor public DisplayAreaOrganizer();
-    method public void onDisplayAreaAppeared(@NonNull android.window.WindowContainerToken);
-    method public void onDisplayAreaVanished(@NonNull android.window.WindowContainerToken);
+    method public void onDisplayAreaAppeared(@NonNull android.window.DisplayAreaInfo);
+    method public void onDisplayAreaVanished(@NonNull android.window.DisplayAreaInfo);
     method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public void registerOrganizer(int);
     field public static final int FEATURE_DEFAULT_TASK_CONTAINER = 1; // 0x1
     field public static final int FEATURE_ROOT = 0; // 0x0
diff --git a/cmds/idmap2/Android.bp b/cmds/idmap2/Android.bp
index 645dc93..ef5c4ce 100644
--- a/cmds/idmap2/Android.bp
+++ b/cmds/idmap2/Android.bp
@@ -261,6 +261,7 @@
 
 aidl_interface {
     name: "overlayable_policy_aidl",
+    unstable: true,
     srcs: [":overlayable_policy_aidl_files"],
 }
 
diff --git a/cmds/screencap/screencap.cpp b/cmds/screencap/screencap.cpp
index 4410f1c..bb32dd2 100644
--- a/cmds/screencap/screencap.cpp
+++ b/cmds/screencap/screencap.cpp
@@ -105,7 +105,7 @@
     char *cmd[] = {
         (char*) "am",
         (char*) "broadcast",
-        (char*) "am",
+        (char*) "-a",
         (char*) "android.intent.action.MEDIA_SCANNER_SCAN_FILE",
         (char*) "-d",
         &filePath[0],
diff --git a/cmds/statsd/Android.bp b/cmds/statsd/Android.bp
index b357904..f30ed17c 100644
--- a/cmds/statsd/Android.bp
+++ b/cmds/statsd/Android.bp
@@ -104,6 +104,7 @@
         "src/subscriber/IncidentdReporter.cpp",
         "src/subscriber/SubscriberReporter.cpp",
         "src/uid_data.proto",
+        "src/utils/MultiConditionTrigger.cpp",
     ],
 
     local_include_dirs: [
@@ -290,7 +291,16 @@
 cc_test {
     name: "statsd_test",
     defaults: ["statsd_defaults"],
-    test_suites: ["device-tests"],
+    test_suites: ["device-tests", "mts"],
+
+    //TODO(b/153588990): Remove when the build system properly separates
+    //32bit and 64bit architectures.
+    compile_multilib: "both",
+    multilib: {
+        lib64: {
+            suffix: "64",
+        }
+    },
 
     cflags: [
         "-Wall",
@@ -361,6 +371,7 @@
         "tests/StatsService_test.cpp",
         "tests/storage/StorageManager_test.cpp",
         "tests/UidMap_test.cpp",
+        "tests/utils/MultiConditionTrigger_test.cpp",
     ],
 
     static_libs: [
diff --git a/cmds/statsd/src/FieldValue.cpp b/cmds/statsd/src/FieldValue.cpp
index cfc1de4..c9ccfb9 100644
--- a/cmds/statsd/src/FieldValue.cpp
+++ b/cmds/statsd/src/FieldValue.cpp
@@ -18,7 +18,6 @@
 #include "Log.h"
 #include "FieldValue.h"
 #include "HashableDimensionKey.h"
-#include "atoms_info.h"
 #include "math.h"
 
 namespace android {
diff --git a/cmds/statsd/src/FieldValue.h b/cmds/statsd/src/FieldValue.h
index 92e09ea..fd86e36 100644
--- a/cmds/statsd/src/FieldValue.h
+++ b/cmds/statsd/src/FieldValue.h
@@ -27,7 +27,6 @@
 struct Field;
 struct FieldValue;
 
-const int32_t kAttributionField = 1;
 const int32_t kMaxLogDepth = 2;
 const int32_t kLastBitMask = 0x80;
 const int32_t kClearLastBitDeco = 0x7f;
@@ -181,6 +180,7 @@
 
         return false;
     }
+
     bool matches(const Matcher& that) const;
 };
 
@@ -360,7 +360,9 @@
 
 class Annotations {
 public:
-    Annotations() {}
+    Annotations() {
+        setNested(true);  // Nested = true by default
+    }
 
     // This enum stores where particular annotations can be found in the
     // bitmask. Note that these pos do not correspond to annotation ids.
@@ -379,8 +381,6 @@
 
     inline void setUidField(bool isUid) { setBitmaskAtPos(UID_POS, isUid); }
 
-    inline void setResetState(int resetState) { mResetState = resetState; }
-
     // Default value = false
     inline bool isNested() const { return getValueFromBitmask(NESTED_POS); }
 
@@ -393,10 +393,6 @@
     // Default value = false
     inline bool isUidField() const { return getValueFromBitmask(UID_POS); }
 
-    // If a reset state is not sent in the StatsEvent, returns -1. Note that a
-    // reset satate is only sent if and only if a reset should be triggered.
-    inline int getResetState() const { return mResetState; }
-
 private:
     inline void setBitmaskAtPos(int pos, bool value) {
         mBooleanBitmask &= ~(1 << pos); // clear
@@ -410,8 +406,6 @@
     // This is a bitmask over all annotations stored in boolean form. Because
     // there are only 4 booleans, just one byte is required.
     uint8_t mBooleanBitmask = 0;
-
-    int mResetState = -1;
 };
 
 /**
diff --git a/cmds/statsd/src/HashableDimensionKey.cpp b/cmds/statsd/src/HashableDimensionKey.cpp
index 29249f4..eba66e0 100644
--- a/cmds/statsd/src/HashableDimensionKey.cpp
+++ b/cmds/statsd/src/HashableDimensionKey.cpp
@@ -180,6 +180,23 @@
     return num_matches > 0;
 }
 
+bool filterPrimaryKey(const std::vector<FieldValue>& values, HashableDimensionKey* output) {
+    size_t num_matches = 0;
+    const int32_t simpleFieldMask = 0xff7f0000;
+    const int32_t attributionUidFieldMask = 0xff7f7f7f;
+    for (const auto& value : values) {
+        if (value.mAnnotations.isPrimaryField()) {
+            output->addValue(value);
+            output->mutableValue(num_matches)->mField.setTag(value.mField.getTag());
+            const int32_t mask =
+                    isAttributionUidField(value) ? attributionUidFieldMask : simpleFieldMask;
+            output->mutableValue(num_matches)->mField.setField(value.mField.getField() & mask);
+            num_matches++;
+        }
+    }
+    return num_matches > 0;
+}
+
 void filterGaugeValues(const std::vector<Matcher>& matcherFields,
                        const std::vector<FieldValue>& values, std::vector<FieldValue>* output) {
     for (const auto& field : matcherFields) {
diff --git a/cmds/statsd/src/HashableDimensionKey.h b/cmds/statsd/src/HashableDimensionKey.h
index 33a5024..bd01100 100644
--- a/cmds/statsd/src/HashableDimensionKey.h
+++ b/cmds/statsd/src/HashableDimensionKey.h
@@ -154,6 +154,18 @@
                   HashableDimensionKey* output);
 
 /**
+ * Creating HashableDimensionKeys from State Primary Keys in FieldValues.
+ *
+ * This function may make modifications to the Field if the matcher has Position=FIRST,LAST or ALL
+ * in it. This is because: for example, when we create dimension from last uid in attribution chain,
+ * In one event, uid 1000 is at position 5 and it's the last
+ * In another event, uid 1000 is at position 6, and it's the last
+ * these 2 events should be mapped to the same dimension.  So we will remove the original position
+ * from the dimension key for the uid field (by applying 0x80 bit mask).
+ */
+bool filterPrimaryKey(const std::vector<FieldValue>& values, HashableDimensionKey* output);
+
+/**
  * Filter the values from FieldValues using the matchers.
  *
  * In contrast to the above function, this function will not do any modification to the original
diff --git a/cmds/statsd/src/StatsLogProcessor.cpp b/cmds/statsd/src/StatsLogProcessor.cpp
index 325cbc7..60e259b 100644
--- a/cmds/statsd/src/StatsLogProcessor.cpp
+++ b/cmds/statsd/src/StatsLogProcessor.cpp
@@ -25,7 +25,6 @@
 #include <frameworks/base/cmds/statsd/src/experiment_ids.pb.h>
 
 #include "android-base/stringprintf.h"
-#include "atoms_info.h"
 #include "external/StatsPullerManager.h"
 #include "guardrail/StatsdStats.h"
 #include "logd/LogEvent.h"
@@ -139,15 +138,13 @@
 }
 
 void StatsLogProcessor::mapIsolatedUidToHostUidIfNecessaryLocked(LogEvent* event) const {
-    if (android::util::AtomsInfo::kAtomsWithAttributionChain.find(event->GetTagId()) !=
-        android::util::AtomsInfo::kAtomsWithAttributionChain.end()) {
-        for (auto& value : *(event->getMutableValues())) {
-            if (value.mField.getPosAtDepth(0) > kAttributionField) {
-                break;
-            }
-            if (isAttributionUidField(value)) {
-                const int hostUid = mUidMap->getHostUidOrSelf(value.mValue.int_value);
-                value.mValue.setInt(hostUid);
+    if (std::pair<int, int> indexRange; event->hasAttributionChain(&indexRange)) {
+        vector<FieldValue>* const fieldValues = event->getMutableValues();
+        for (int i = indexRange.first; i <= indexRange.second; i++) {
+            FieldValue& fieldValue = fieldValues->at(i);
+            if (isAttributionUidField(fieldValue)) {
+                const int hostUid = mUidMap->getHostUidOrSelf(fieldValue.mValue.int_value);
+                fieldValue.mValue.setInt(hostUid);
             }
         }
     } else {
@@ -390,15 +387,24 @@
 void StatsLogProcessor::OnLogEvent(LogEvent* event, int64_t elapsedRealtimeNs) {
     std::lock_guard<std::mutex> lock(mMetricsMutex);
 
+    // Tell StatsdStats about new event
+    const int64_t eventElapsedTimeNs = event->GetElapsedTimestampNs();
+    int atomId = event->GetTagId();
+    StatsdStats::getInstance().noteAtomLogged(atomId, eventElapsedTimeNs / NS_PER_SEC);
+    if (!event->isValid()) {
+        StatsdStats::getInstance().noteAtomError(atomId);
+        return;
+    }
+
     // Hard-coded logic to update train info on disk and fill in any information
     // this log event may be missing.
-    if (event->GetTagId() == android::os::statsd::util::BINARY_PUSH_STATE_CHANGED) {
+    if (atomId == android::os::statsd::util::BINARY_PUSH_STATE_CHANGED) {
         onBinaryPushStateChangedEventLocked(event);
     }
 
     // Hard-coded logic to update experiment ids on disk for certain rollback
     // types and fill the rollback atom with experiment ids
-    if (event->GetTagId() == android::os::statsd::util::WATCHDOG_ROLLBACK_OCCURRED) {
+    if (atomId == android::os::statsd::util::WATCHDOG_ROLLBACK_OCCURRED) {
         onWatchdogRollbackOccurredLocked(event);
     }
 
@@ -407,16 +413,11 @@
         ALOGI("%s", event->ToString().c_str());
     }
 #endif
-    const int64_t eventElapsedTimeNs = event->GetElapsedTimestampNs();
-
     resetIfConfigTtlExpiredLocked(eventElapsedTimeNs);
 
-    StatsdStats::getInstance().noteAtomLogged(
-        event->GetTagId(), event->GetElapsedTimestampNs() / NS_PER_SEC);
-
     // Hard-coded logic to update the isolated uid's in the uid-map.
     // The field numbers need to be currently updated by hand with atoms.proto
-    if (event->GetTagId() == android::os::statsd::util::ISOLATED_UID_CHANGED) {
+    if (atomId == android::os::statsd::util::ISOLATED_UID_CHANGED) {
         onIsolatedUidChangedEventLocked(*event);
     }
 
@@ -433,7 +434,7 @@
     }
 
 
-    if (event->GetTagId() != android::os::statsd::util::ISOLATED_UID_CHANGED) {
+    if (atomId != android::os::statsd::util::ISOLATED_UID_CHANGED) {
         // Map the isolated uid to host uid if necessary.
         mapIsolatedUidToHostUidIfNecessaryLocked(event);
     }
@@ -1052,8 +1053,8 @@
 void StatsLogProcessor::notifyAppUpgrade(const int64_t& eventTimeNs, const string& apk,
                                          const int uid, const int64_t version) {
     std::lock_guard<std::mutex> lock(mMetricsMutex);
-    ALOGW("Received app upgrade");
-    for (auto it : mMetricsManagers) {
+    VLOG("Received app upgrade");
+    for (const auto& it : mMetricsManagers) {
         it.second->notifyAppUpgrade(eventTimeNs, apk, uid, version);
     }
 }
@@ -1061,20 +1062,28 @@
 void StatsLogProcessor::notifyAppRemoved(const int64_t& eventTimeNs, const string& apk,
                                          const int uid) {
     std::lock_guard<std::mutex> lock(mMetricsMutex);
-    ALOGW("Received app removed");
-    for (auto it : mMetricsManagers) {
+    VLOG("Received app removed");
+    for (const auto& it : mMetricsManagers) {
         it.second->notifyAppRemoved(eventTimeNs, apk, uid);
     }
 }
 
 void StatsLogProcessor::onUidMapReceived(const int64_t& eventTimeNs) {
     std::lock_guard<std::mutex> lock(mMetricsMutex);
-    ALOGW("Received uid map");
-    for (auto it : mMetricsManagers) {
+    VLOG("Received uid map");
+    for (const auto& it : mMetricsManagers) {
         it.second->onUidMapReceived(eventTimeNs);
     }
 }
 
+void StatsLogProcessor::onStatsdInitCompleted(const int64_t& elapsedTimeNs) {
+    std::lock_guard<std::mutex> lock(mMetricsMutex);
+    VLOG("Received boot completed signal");
+    for (const auto& it : mMetricsManagers) {
+        it.second->onStatsdInitCompleted(elapsedTimeNs);
+    }
+}
+
 void StatsLogProcessor::noteOnDiskData(const ConfigKey& key) {
     std::lock_guard<std::mutex> lock(mMetricsMutex);
     mOnDiskDataConfigs.insert(key);
diff --git a/cmds/statsd/src/StatsLogProcessor.h b/cmds/statsd/src/StatsLogProcessor.h
index 97512ed..ffd83ba 100644
--- a/cmds/statsd/src/StatsLogProcessor.h
+++ b/cmds/statsd/src/StatsLogProcessor.h
@@ -120,6 +120,11 @@
     /* Notify all MetricsManagers of uid map snapshots received */
     void onUidMapReceived(const int64_t& eventTimeNs) override;
 
+    /* Notify all metrics managers of boot completed
+     * This will force a bucket split when the boot is finished.
+     */
+    void onStatsdInitCompleted(const int64_t& elapsedTimeNs);
+
     // Reset all configs.
     void resetConfigs();
 
diff --git a/cmds/statsd/src/StatsService.cpp b/cmds/statsd/src/StatsService.cpp
index dd1d400..bd9f7a5 100644
--- a/cmds/statsd/src/StatsService.cpp
+++ b/cmds/statsd/src/StatsService.cpp
@@ -118,8 +118,10 @@
                   }
               })),
       mEventQueue(queue),
-      mStatsCompanionServiceDeathRecipient(AIBinder_DeathRecipient_new(
-              StatsService::statsCompanionServiceDied)) {
+      mBootCompleteTrigger({kBootCompleteTag, kUidMapReceivedTag, kAllPullersRegisteredTag},
+                           [this]() { mProcessor->onStatsdInitCompleted(getElapsedRealtimeNs()); }),
+      mStatsCompanionServiceDeathRecipient(
+              AIBinder_DeathRecipient_new(StatsService::statsCompanionServiceDied)) {
     mUidMap = UidMap::getInstance();
     mPullerManager = new StatsPullerManager();
     StatsPuller::SetUidMap(mUidMap);
@@ -939,6 +941,7 @@
                        packageNames,
                        installers);
 
+    mBootCompleteTrigger.markComplete(kUidMapReceivedTag);
     VLOG("StatsService::informAllUidData UidData proto parsed successfully.");
     return Status::ok();
 }
@@ -1058,7 +1061,7 @@
     ENFORCE_UID(AID_SYSTEM);
 
     VLOG("StatsService::bootCompleted was called");
-
+    mBootCompleteTrigger.markComplete(kBootCompleteTag);
     return Status::ok();
 }
 
@@ -1214,20 +1217,11 @@
     return Status::ok();
 }
 
-Status StatsService::sendAppBreadcrumbAtom(int32_t label, int32_t state) {
-    // Permission check not necessary as it's meant for applications to write to
-    // statsd.
-    android::os::statsd::util::stats_write(android::os::statsd::util::APP_BREADCRUMB_REPORTED,
-                               (int32_t) AIBinder_getCallingUid(), label,
-                               state);
-    return Status::ok();
-}
-
 Status StatsService::allPullersFromBootRegistered() {
     ENFORCE_UID(AID_SYSTEM);
 
     VLOG("StatsService::allPullersFromBootRegistered was called");
-
+    mBootCompleteTrigger.markComplete(kAllPullersRegisteredTag);
     return Status::ok();
 }
 
diff --git a/cmds/statsd/src/StatsService.h b/cmds/statsd/src/StatsService.h
index 23d4c1b..b49fa1d 100644
--- a/cmds/statsd/src/StatsService.h
+++ b/cmds/statsd/src/StatsService.h
@@ -17,7 +17,14 @@
 #ifndef STATS_SERVICE_H
 #define STATS_SERVICE_H
 
+#include <aidl/android/os/BnStatsd.h>
+#include <aidl/android/os/IPendingIntentRef.h>
+#include <aidl/android/os/IPullAtomCallback.h>
 #include <gtest/gtest_prod.h>
+#include <utils/Looper.h>
+
+#include <mutex>
+
 #include "StatsLogProcessor.h"
 #include "anomaly/AlarmMonitor.h"
 #include "config/ConfigManager.h"
@@ -26,13 +33,7 @@
 #include "packages/UidMap.h"
 #include "shell/ShellSubscriber.h"
 #include "statscompanion_util.h"
-
-#include <aidl/android/os/BnStatsd.h>
-#include <aidl/android/os/IPendingIntentRef.h>
-#include <aidl/android/os/IPullAtomCallback.h>
-#include <utils/Looper.h>
-
-#include <mutex>
+#include "utils/MultiConditionTrigger.h"
 
 using namespace android;
 using namespace android::os;
@@ -161,11 +162,6 @@
     virtual void sayHiToStatsCompanion();
 
     /**
-     * Binder call to get AppBreadcrumbReported atom.
-     */
-    virtual Status sendAppBreadcrumbAtom(int32_t label, int32_t state) override;
-
-    /**
      * Binder call to notify statsd that all pullers from boot have been registered.
      */
     virtual Status allPullersFromBootRegistered();
@@ -385,6 +381,11 @@
     mutable mutex mShellSubscriberMutex;
     std::shared_ptr<LogEventQueue> mEventQueue;
 
+    MultiConditionTrigger mBootCompleteTrigger;
+    static const inline string kBootCompleteTag = "BOOT_COMPLETE";
+    static const inline string kUidMapReceivedTag = "UID_MAP";
+    static const inline string kAllPullersRegisteredTag = "PULLERS_REGISTERED";
+
     ScopedAIBinder_DeathRecipient mStatsCompanionServiceDeathRecipient;
 
     FRIEND_TEST(StatsLogProcessorTest, TestActivationsPersistAcrossSystemServerRestart);
@@ -393,11 +394,14 @@
     FRIEND_TEST(StatsServiceTest, TestAddConfig_invalid);
     FRIEND_TEST(StatsServiceTest, TestGetUidFromArgs);
     FRIEND_TEST(PartialBucketE2eTest, TestCountMetricNoSplitOnNewApp);
+    FRIEND_TEST(PartialBucketE2eTest, TestCountMetricSplitOnBoot);
     FRIEND_TEST(PartialBucketE2eTest, TestCountMetricSplitOnUpgrade);
     FRIEND_TEST(PartialBucketE2eTest, TestCountMetricSplitOnRemoval);
     FRIEND_TEST(PartialBucketE2eTest, TestCountMetricWithoutSplit);
+    FRIEND_TEST(PartialBucketE2eTest, TestValueMetricOnBootWithoutMinPartialBucket);
     FRIEND_TEST(PartialBucketE2eTest, TestValueMetricWithoutMinPartialBucket);
     FRIEND_TEST(PartialBucketE2eTest, TestValueMetricWithMinPartialBucket);
+    FRIEND_TEST(PartialBucketE2eTest, TestGaugeMetricOnBootWithoutMinPartialBucket);
     FRIEND_TEST(PartialBucketE2eTest, TestGaugeMetricWithoutMinPartialBucket);
     FRIEND_TEST(PartialBucketE2eTest, TestGaugeMetricWithMinPartialBucket);
 };
diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto
index 453ddeb..b3da32fc 100644
--- a/cmds/statsd/src/atoms.proto
+++ b/cmds/statsd/src/atoms.proto
@@ -46,6 +46,7 @@
 import "frameworks/base/core/proto/android/stats/devicepolicy/device_policy.proto";
 import "frameworks/base/core/proto/android/stats/devicepolicy/device_policy_enums.proto";
 import "frameworks/base/core/proto/android/stats/docsui/docsui_enums.proto";
+import "frameworks/base/core/proto/android/stats/accessibility/accessibility_enums.proto";
 import "frameworks/base/core/proto/android/stats/enums.proto";
 import "frameworks/base/core/proto/android/stats/intelligence/enums.proto";
 import "frameworks/base/core/proto/android/stats/launcher/launcher.proto";
@@ -421,7 +422,15 @@
         TvSettingsUIInteracted tvsettings_ui_interacted = 261 [(module) = "tv_settings"];
         LauncherStaticLayout launcher_snapshot = 262 [(module) = "sysui"];
         PackageInstallerV2Reported package_installer_v2_reported = 263 [(module) = "framework"];
+        UserLifecycleJourneyReported user_lifecycle_journey_reported = 264 [(module) = "framework"];
+        UserLifecycleEventOccurred user_lifecycle_event_occurred = 265 [(module) = "framework"];
+        AccessibilityShortcutReported accessibility_shortcut_reported =
+            266 [(module) = "framework"];
+        AccessibilityServiceReported accessibility_service_reported = 267 [(module) = "framework"];
         SdkExtensionStatus sdk_extension_status = 354;
+
+        // StatsdStats tracks platform atoms with ids upto 500.
+        // Update StatsdStats::kMaxPushedAtomId when atom ids here approach that value.
     }
 
     // Pulled events will start at field 10000.
@@ -8991,7 +9000,7 @@
  * Each pull creates multiple atoms, one for each call. The sequence is randomized when pulled.
  *
  * Pulled from:
- *   frameworks/opt/telephony/src/java/com/android/internal/telephony/metrics/PersistPullers.java
+ *   frameworks/opt/telephony/src/java/com/android/internal/telephony/metrics/MetricsCollector.java
  */
 message VoiceCallSession {
     // Bearer (IMS or CS) when the call started.
@@ -9055,9 +9064,7 @@
     // See https://source.android.com/devices/tech/config/carrierid.
     optional int32 carrier_id = 18;
 
-    // Whether an SRVCC has been completed successfully.
-    // SRVCC (CS fallback) should be recorded in the IMS call since there will be no more SRVCC
-    // events once the call is switched to CS.
+    // Whether an SRVCC has been completed successfully for this call.
     optional bool srvcc_completed = 19;
 
     // Number of SRVCC failures.
@@ -9066,7 +9073,8 @@
     // Number of SRVCC cancellations.
     optional int64 srvcc_cancellation_count = 21;
 
-    // Whether the Real-Time Text (RTT) was ever used in the call.
+    // Whether the Real-Time Text (RTT) was ever used in the call (rather than whether RTT was
+    // enabled in the dialer's settings).
     optional bool rtt_enabled = 22;
 
     // Whether this was an emergency call.
@@ -9083,7 +9091,7 @@
  * time. The atom will be skipped if not enough data is available.
  *
  * Pulled from:
- *   frameworks/opt/telephony/src/java/com/android/internal/telephony/metrics/PersistPullers.java
+ *   frameworks/opt/telephony/src/java/com/android/internal/telephony/metrics/MetricsCollector.java
  */
 message VoiceCallRatUsage {
     // Carrier ID (https://source.android.com/devices/tech/config/carrierid).
@@ -9104,7 +9112,7 @@
  * Pulls the number of active SIM slots and SIMs/eSIM profiles.
  *
  * Pulled from:
- *   frameworks/opt/telephony/src/java/com/android/internal/telephony/metrics/NonPersistPullers.java
+ *   frameworks/opt/telephony/src/java/com/android/internal/telephony/metrics/MetricsCollector.java
  */
 message SimSlotState {
     // Number of active SIM slots (both physical and eSIM profiles) in the device.
@@ -9125,7 +9133,7 @@
  * This atom reports the capabilities of the device, rather than the network it has access to.
  *
  * Pulled from:
- *   frameworks/opt/telephony/src/java/com/android/internal/telephony/metrics/NonPersistPullers.java
+ *   frameworks/opt/telephony/src/java/com/android/internal/telephony/metrics/MetricsCollector.java
  */
 message SupportedRadioAccessFamily {
     // A bitmask of supported radio technologies.
@@ -9249,12 +9257,13 @@
     optional bool is_workprofile = 7;
 
     enum SharesheetPreviewType {  // Constants from ChooserActivity.java
+        CONTENT_PREVIEW_TYPE_UNKNOWN = 0;  // Default for proto 2 / 3 compatibility.
         CONTENT_PREVIEW_IMAGE = 1;  // The preview shown in the sharesheet is an image.
         CONTENT_PREVIEW_FILE = 2;  // The preview shown in the sharesheet is a file.
         CONTENT_PREVIEW_TEXT = 3;  // The preview shown in the sharesheet is text.
     }
     // How the sharesheet preview is presented.
-    optional SharesheetPreviewType previewType = 8;
+    optional SharesheetPreviewType preview_type = 8;
 
     enum ResolverActivityIntent { // Intents handled by ResolverActivity.java
         INTENT_DEFAULT = 0;
@@ -9267,7 +9276,7 @@
         INTENT_ACTION_MAIN = 7;
     }
     // The intent being processed (only SEND and SEND_MULTIPLE are system sharesheet)
-    optional ResolverActivityIntent intentType = 9;
+    optional ResolverActivityIntent intent_type = 9;
 }
 
 /**
@@ -9356,3 +9365,117 @@
     // Android user index. 0 for primary user, 10, 11 for secondary or profile user
     optional int32 user_id = 7;
 }
+
+/**
+ * An event logged to indicate that a user journey is about to be performed. This atom includes
+ * relevant information about the users involved in the journey. A UserLifecycleEventOccurred event
+ * will immediately follow this atom which will describe the event(s) and its state.
+ *
+ * Logged from:
+ *   frameworks/base/services/core/java/com/android/server/am/UserController.java
+ *   frameworks/base/services/core/java/com/android/server/pm/UserManagerService.java
+ */
+message UserLifecycleJourneyReported {
+    // An identifier to track a chain of user lifecycle events occurring (referenced in the
+    // UserLifecycleEventOccurred atom)
+    optional int64 session_id = 1;
+
+    // Indicates what type of user journey this session is related to
+    enum Journey {
+        UNKNOWN = 0; // Undefined user lifecycle journey
+        USER_SWITCH_UI = 1; // A user switch journey where a UI is shown
+        USER_SWITCH_FG = 2; // A user switch journey without a UI shown
+        USER_START = 3; // A user start journey
+        USER_CREATE = 4; // A user creation journey
+    }
+    optional Journey journey = 2;
+    // Which user the journey is originating from - could be -1 for certain phases (eg USER_CREATE)
+    // This integer is a UserIdInt (eg 0 for the system user, 10 for secondary/guest)
+    optional int32 origin_user = 3;
+    // Which user the journey is targeting
+    // This integer is a UserIdInt (eg 0 for the system user, 10 for secondary/guest)
+    optional int32 target_user = 4;
+
+    // What is the user type of the target user
+    // These should be in sync with USER_TYPE_* flags defined in UserManager.java
+    enum UserType {
+        TYPE_UNKNOWN = 0;
+        FULL_SYSTEM = 1;
+        FULL_SECONDARY = 2;
+        FULL_GUEST = 3;
+        FULL_DEMO = 4;
+        FULL_RESTRICTED = 5;
+        PROFILE_MANAGED = 6;
+        SYSTEM_HEADLESS = 7;
+    }
+    optional UserType user_type = 5;
+    // What are the flags attached to the target user
+    optional int32 user_flags = 6;
+}
+
+/**
+ * An event logged when a specific user lifecycle event is performed. These events should be
+ * correlated with a UserLifecycleJourneyReported atom via the session_id.
+ * Note: journeys can span over multiple events, hence some events may share a single session id.
+ *
+ * Logged from:
+ *   frameworks/base/services/core/java/com/android/server/am/UserController.java
+ *   frameworks/base/services/core/java/com/android/server/pm/UserManagerService.java
+ */
+message UserLifecycleEventOccurred {
+    // An id which links back to user details (reported in the UserLifecycleJourneyReported atom)
+    optional int64 session_id = 1;
+    // The target user for this event (same as target_user in the UserLifecycleJourneyReported atom)
+    // This integer is a UserIdInt (eg 0 for the system user, 10 for secondary/guest)
+    optional int32 user_id = 2;
+
+    enum Event {
+        UNKNOWN = 0; // Indicates that the associated user journey timed-out or resulted in an error
+        SWITCH_USER = 1; // Indicates that this is a user switch event
+        START_USER = 2; // Indicates that this is a user start event
+        CREATE_USER = 3; // Indicates that this is a user create event
+    }
+    optional Event event = 3;
+
+    enum State {
+        NONE = 0; // Indicates the associated event has no start/end defined
+        BEGIN = 1;
+        FINISH = 2;
+    }
+    optional State state = 4; // Represents the state of an event (beginning/ending)
+}
+
+/**
+ * Logs when accessibility shortcut clicked.
+ *
+ * Logged from:
+ *   frameworks/base/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
+ */
+message AccessibilityShortcutReported {
+    // The accessibility feature(including installed a11y service, framework a11y feature,
+    // and installed a11y activity) package name that is assigned to the accessibility shortcut.
+    optional string package_name = 1;
+
+    // The definition of the accessibility shortcut.
+    // From frameworks/base/core/proto/android/stats/accessibility/accessibility_enums.proto.
+    optional android.stats.accessibility.ShortcutType shortcut_type = 2;
+
+    // The definition of the service status.
+    // From frameworks/base/core/proto/android/stats/accessibility/accessibility_enums.proto.
+    optional android.stats.accessibility.ServiceStatus service_status = 3;
+}
+
+/**
+ * Logs when accessibility service status changed.
+ *
+ * Logged from:
+ *   frameworks/base/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
+ */
+message AccessibilityServiceReported {
+    // The accessibility service package name.
+    optional string package_name = 1;
+
+    // The definition of the service status.
+    // From frameworks/base/core/proto/android/stats/accessibility/accessibility_enums.proto.
+    optional android.stats.accessibility.ServiceStatus service_status = 2;
+}
diff --git a/cmds/statsd/src/external/StatsCallbackPuller.cpp b/cmds/statsd/src/external/StatsCallbackPuller.cpp
index 933f48d..3618bb0 100644
--- a/cmds/statsd/src/external/StatsCallbackPuller.cpp
+++ b/cmds/statsd/src/external/StatsCallbackPuller.cpp
@@ -67,8 +67,14 @@
                     lock_guard<mutex> lk(*cv_mutex);
                     for (const StatsEventParcel& parcel: output) {
                         shared_ptr<LogEvent> event = make_shared<LogEvent>(/*uid=*/-1, /*pid=*/-1);
-                        event->parseBuffer((uint8_t*)parcel.buffer.data(), parcel.buffer.size());
-                        sharedData->push_back(event);
+                        bool valid = event->parseBuffer((uint8_t*)parcel.buffer.data(),
+                                                        parcel.buffer.size());
+                        if (valid) {
+                            sharedData->push_back(event);
+                        } else {
+                            StatsdStats::getInstance().noteAtomError(event->GetTagId(),
+                                                                     /*pull=*/true);
+                        }
                     }
                     *pullSuccess = success;
                     *pullFinish = true;
diff --git a/cmds/statsd/src/external/StatsPullerManager.cpp b/cmds/statsd/src/external/StatsPullerManager.cpp
index ebe9610..cfd5d14 100644
--- a/cmds/statsd/src/external/StatsPullerManager.cpp
+++ b/cmds/statsd/src/external/StatsPullerManager.cpp
@@ -252,9 +252,13 @@
     mPullUidProviders[configKey] = provider;
 }
 
-void StatsPullerManager::UnregisterPullUidProvider(const ConfigKey& configKey) {
+void StatsPullerManager::UnregisterPullUidProvider(const ConfigKey& configKey,
+                                                   wp<PullUidProvider> provider) {
     std::lock_guard<std::mutex> _l(mLock);
-    mPullUidProviders.erase(configKey);
+    const auto& it = mPullUidProviders.find(configKey);
+    if (it != mPullUidProviders.end() && it->second == provider) {
+        mPullUidProviders.erase(it);
+    }
 }
 
 void StatsPullerManager::OnAlarmFired(int64_t elapsedTimeNs) {
diff --git a/cmds/statsd/src/external/StatsPullerManager.h b/cmds/statsd/src/external/StatsPullerManager.h
index ab0ccee..5e18aaa 100644
--- a/cmds/statsd/src/external/StatsPullerManager.h
+++ b/cmds/statsd/src/external/StatsPullerManager.h
@@ -78,11 +78,12 @@
                                     wp<PullDataReceiver> receiver);
 
     // Registers a pull uid provider for the config key. When pulling atoms, it will be used to
-    // determine which atoms to pull from.
+    // determine which uids to pull from.
     virtual void RegisterPullUidProvider(const ConfigKey& configKey, wp<PullUidProvider> provider);
 
     // Unregister a pull uid provider.
-    virtual void UnregisterPullUidProvider(const ConfigKey& configKey);
+    virtual void UnregisterPullUidProvider(const ConfigKey& configKey,
+                                           wp<PullUidProvider> provider);
 
     // Verify if we know how to pull for this matcher
     bool PullerForMatcherExists(int tagId) const;
@@ -180,6 +181,8 @@
     FRIEND_TEST(ValueMetricE2eTest, TestPulledEvents);
     FRIEND_TEST(ValueMetricE2eTest, TestPulledEvents_LateAlarm);
     FRIEND_TEST(ValueMetricE2eTest, TestPulledEvents_WithActivation);
+
+    FRIEND_TEST(StatsLogProcessorTest, TestPullUidProviderSetOnConfigUpdate);
 };
 
 }  // namespace statsd
diff --git a/cmds/statsd/src/external/puller_util.cpp b/cmds/statsd/src/external/puller_util.cpp
index 90247cf..aa99d00 100644
--- a/cmds/statsd/src/external/puller_util.cpp
+++ b/cmds/statsd/src/external/puller_util.cpp
@@ -17,7 +17,6 @@
 #define DEBUG false  // STOPSHIP if true
 #include "Log.h"
 
-#include "atoms_info.h"
 #include "puller_util.h"
 
 namespace android {
@@ -49,11 +48,10 @@
  */
 void mapAndMergeIsolatedUidsToHostUid(vector<shared_ptr<LogEvent>>& data, const sp<UidMap>& uidMap,
                                       int tagId, const vector<int>& additiveFieldsVec) {
-    bool hasAttributionChain = (android::util::AtomsInfo::kAtomsWithAttributionChain.find(tagId) !=
-                                android::util::AtomsInfo::kAtomsWithAttributionChain.end());
-    // To check if any LogEvent has a uid field, we can just check the first
-    // LogEvent because all atoms with this tagId should have the uid
-    // annotation.
+    // Check the first LogEvent for attribution chain or a uid field as either all atoms with this
+    // tagId have them or none of them do.
+    std::pair<int, int> attrIndexRange;
+    const bool hasAttributionChain = data[0]->hasAttributionChain(&attrIndexRange);
     bool hasUidField = (data[0]->getUidFieldIndex() != -1);
 
     if (!hasAttributionChain && !hasUidField) {
@@ -67,15 +65,13 @@
             ALOGE("Wrong atom. Expecting %d, got %d", tagId, event->GetTagId());
             return;
         }
-        if (android::util::AtomsInfo::kAtomsWithAttributionChain.find(tagId) !=
-            android::util::AtomsInfo::kAtomsWithAttributionChain.end()) {
-            for (auto& value : *(event->getMutableValues())) {
-                if (value.mField.getPosAtDepth(0) > kAttributionField) {
-                    break;
-                }
-                if (isAttributionUidField(value)) {
-                    const int hostUid = uidMap->getHostUidOrSelf(value.mValue.int_value);
-                    value.mValue.setInt(hostUid);
+        if (hasAttributionChain) {
+            vector<FieldValue>* const fieldValues = event->getMutableValues();
+            for (int i = attrIndexRange.first; i <= attrIndexRange.second; i++) {
+                FieldValue& fieldValue = fieldValues->at(i);
+                if (isAttributionUidField(fieldValue)) {
+                    const int hostUid = uidMap->getHostUidOrSelf(fieldValue.mValue.int_value);
+                    fieldValue.mValue.setInt(hostUid);
                 }
             }
         } else {
diff --git a/cmds/statsd/src/guardrail/StatsdStats.cpp b/cmds/statsd/src/guardrail/StatsdStats.cpp
index 2bd13d7..46f5dbd 100644
--- a/cmds/statsd/src/guardrail/StatsdStats.cpp
+++ b/cmds/statsd/src/guardrail/StatsdStats.cpp
@@ -54,6 +54,7 @@
 
 const int FIELD_ID_ATOM_STATS_TAG = 1;
 const int FIELD_ID_ATOM_STATS_COUNT = 2;
+const int FIELD_ID_ATOM_STATS_ERROR_COUNT = 3;
 
 const int FIELD_ID_ANOMALY_ALARMS_REGISTERED = 1;
 const int FIELD_ID_PERIODIC_ALARMS_REGISTERED = 1;
@@ -119,7 +120,7 @@
 };
 
 StatsdStats::StatsdStats() {
-    mPushedAtomStats.resize(android::util::kMaxPushedAtomId + 1);
+    mPushedAtomStats.resize(kMaxPushedAtomId + 1);
     mStartTimeSec = getWallClockSec();
 }
 
@@ -448,7 +449,7 @@
 void StatsdStats::noteAtomLogged(int atomId, int32_t timeSec) {
     lock_guard<std::mutex> lock(mLock);
 
-    if (atomId <= android::util::kMaxPushedAtomId) {
+    if (atomId <= kMaxPushedAtomId) {
         mPushedAtomStats[atomId]++;
     } else {
         if (mNonPlatformPushedAtomStats.size() < kMaxNonPlatformPushedAtoms) {
@@ -549,6 +550,20 @@
             std::min(pullStats.minBucketBoundaryDelayNs, timeDelayNs);
 }
 
+void StatsdStats::noteAtomError(int atomTag, bool pull) {
+    lock_guard<std::mutex> lock(mLock);
+    if (pull) {
+        mPulledAtomStats[atomTag].atomErrorCount++;
+        return;
+    }
+
+    bool present = (mPushedAtomErrorStats.find(atomTag) != mPushedAtomErrorStats.end());
+    bool full = (mPushedAtomErrorStats.size() >= (size_t)kMaxPushedAtomErrorStatsSize);
+    if (!full || present) {
+        mPushedAtomErrorStats[atomTag]++;
+    }
+}
+
 StatsdStats::AtomMetricStats& StatsdStats::getAtomMetricStats(int64_t metricId) {
     auto atomMetricStatsIter = mAtomMetricStats.find(metricId);
     if (atomMetricStatsIter != mAtomMetricStats.end()) {
@@ -604,9 +619,11 @@
         pullStats.second.pullExceedMaxDelay = 0;
         pullStats.second.registeredCount = 0;
         pullStats.second.unregisteredCount = 0;
+        pullStats.second.atomErrorCount = 0;
     }
     mAtomMetricStats.clear();
     mActivationBroadcastGuardrailStats.clear();
+    mPushedAtomErrorStats.clear();
 }
 
 string buildTimeString(int64_t timeSec) {
@@ -617,6 +634,15 @@
     return string(timeBuffer);
 }
 
+int StatsdStats::getPushedAtomErrors(int atomId) const {
+    const auto& it = mPushedAtomErrorStats.find(atomId);
+    if (it != mPushedAtomErrorStats.end()) {
+        return it->second;
+    } else {
+        return 0;
+    }
+}
+
 void StatsdStats::dumpStats(int out) const {
     lock_guard<std::mutex> lock(mLock);
     time_t t = mStartTimeSec;
@@ -721,11 +747,13 @@
     const size_t atomCounts = mPushedAtomStats.size();
     for (size_t i = 2; i < atomCounts; i++) {
         if (mPushedAtomStats[i] > 0) {
-            dprintf(out, "Atom %lu->%d\n", (unsigned long)i, mPushedAtomStats[i]);
+            dprintf(out, "Atom %zu->(total count)%d, (error count)%d\n", i, mPushedAtomStats[i],
+                    getPushedAtomErrors((int)i));
         }
     }
     for (const auto& pair : mNonPlatformPushedAtomStats) {
-        dprintf(out, "Atom %lu->%d\n", (unsigned long)pair.first, pair.second);
+        dprintf(out, "Atom %d->(total count)%d, (error count)%d\n", pair.first, pair.second,
+                getPushedAtomErrors(pair.first));
     }
 
     dprintf(out, "********Pulled Atom stats***********\n");
@@ -737,13 +765,15 @@
                 "nanos)%lld, "
                 "  (max pull delay nanos)%lld, (data error)%ld\n"
                 "  (pull timeout)%ld, (pull exceed max delay)%ld\n"
-                "  (registered count) %ld, (unregistered count) %ld\n",
+                "  (registered count) %ld, (unregistered count) %ld\n"
+                "  (atom error count) %d\n",
                 (int)pair.first, (long)pair.second.totalPull, (long)pair.second.totalPullFromCache,
                 (long)pair.second.pullFailed, (long)pair.second.minPullIntervalSec,
                 (long long)pair.second.avgPullTimeNs, (long long)pair.second.maxPullTimeNs,
                 (long long)pair.second.avgPullDelayNs, (long long)pair.second.maxPullDelayNs,
                 pair.second.dataError, pair.second.pullTimeout, pair.second.pullExceedMaxDelay,
-                pair.second.registeredCount, pair.second.unregisteredCount);
+                pair.second.registeredCount, pair.second.unregisteredCount,
+                pair.second.atomErrorCount);
     }
 
     if (mAnomalyAlarmRegisteredStats > 0) {
@@ -919,6 +949,10 @@
                     proto.start(FIELD_TYPE_MESSAGE | FIELD_ID_ATOM_STATS | FIELD_COUNT_REPEATED);
             proto.write(FIELD_TYPE_INT32 | FIELD_ID_ATOM_STATS_TAG, (int32_t)i);
             proto.write(FIELD_TYPE_INT32 | FIELD_ID_ATOM_STATS_COUNT, mPushedAtomStats[i]);
+            int errors = getPushedAtomErrors(i);
+            if (errors > 0) {
+                proto.write(FIELD_TYPE_INT32 | FIELD_ID_ATOM_STATS_ERROR_COUNT, errors);
+            }
             proto.end(token);
         }
     }
@@ -928,6 +962,10 @@
                 proto.start(FIELD_TYPE_MESSAGE | FIELD_ID_ATOM_STATS | FIELD_COUNT_REPEATED);
         proto.write(FIELD_TYPE_INT32 | FIELD_ID_ATOM_STATS_TAG, pair.first);
         proto.write(FIELD_TYPE_INT32 | FIELD_ID_ATOM_STATS_COUNT, pair.second);
+        int errors = getPushedAtomErrors(pair.first);
+        if (errors > 0) {
+            proto.write(FIELD_TYPE_INT32 | FIELD_ID_ATOM_STATS_ERROR_COUNT, errors);
+        }
         proto.end(token);
     }
 
diff --git a/cmds/statsd/src/guardrail/StatsdStats.h b/cmds/statsd/src/guardrail/StatsdStats.h
index 25794c8..805281c 100644
--- a/cmds/statsd/src/guardrail/StatsdStats.h
+++ b/cmds/statsd/src/guardrail/StatsdStats.h
@@ -16,7 +16,6 @@
 #pragma once
 
 #include "config/ConfigKey.h"
-#include "atoms_info.h"
 
 #include <gtest/gtest_prod.h>
 #include <log/log_time.h>
@@ -166,6 +165,10 @@
     // Maximum number of pushed atoms statsd stats will track above kMaxPushedAtomId.
     static const int kMaxNonPlatformPushedAtoms = 100;
 
+    // Maximum atom id value that we consider a platform pushed atom.
+    // This should be updated once highest pushed atom id in atoms.proto approaches this value.
+    static const int kMaxPushedAtomId = 500;
+
     // Atom id that is the start of the pulled atoms.
     static const int kPullAtomStartTag = 10000;
 
@@ -457,6 +460,16 @@
      */
      void noteActivationBroadcastGuardrailHit(const int uid);
 
+     /**
+      * Reports that an atom is erroneous or cannot be parsed successfully by
+      * statsd. An atom tag of 0 indicates that the client did not supply the
+      * atom id within the encoding.
+      *
+      * For pushed atoms only, this call should be preceded by a call to
+      * noteAtomLogged.
+      */
+     void noteAtomError(int atomTag, bool pull=false);
+
     /**
      * Reset the historical stats. Including all stats in icebox, and the tracked stats about
      * metrics, matchers, and atoms. The active configs will be kept and StatsdStats will continue
@@ -495,6 +508,7 @@
         long emptyData = 0;
         long registeredCount = 0;
         long unregisteredCount = 0;
+        int32_t atomErrorCount = 0;
     } PulledAtomStats;
 
     typedef struct {
@@ -542,6 +556,12 @@
     // Maps PullAtomId to its stats. The size is capped by the puller atom counts.
     std::map<int, PulledAtomStats> mPulledAtomStats;
 
+    // Stores the number of times a pushed atom was logged erroneously. The
+    // corresponding counts for pulled atoms are stored in PulledAtomStats.
+    // The max size of this map is kMaxAtomErrorsStatsSize.
+    std::map<int, int> mPushedAtomErrorStats;
+    int kMaxPushedAtomErrorStatsSize = 100;
+
     // Maps metric ID to its stats. The size is capped by the number of metrics.
     std::map<int64_t, AtomMetricStats> mAtomMetricStats;
 
@@ -609,6 +629,8 @@
 
     void addToIceBoxLocked(std::shared_ptr<ConfigStats>& stats);
 
+    int getPushedAtomErrors(int atomId) const;
+
     /**
      * Get a reference to AtomMetricStats for a metric. If none exists, create it. The reference
      * will live as long as `this`.
@@ -627,6 +649,7 @@
     FRIEND_TEST(StatsdStatsTest, TestPullAtomStats);
     FRIEND_TEST(StatsdStatsTest, TestAtomMetricsStats);
     FRIEND_TEST(StatsdStatsTest, TestActivationBroadcastGuardrailHit);
+    FRIEND_TEST(StatsdStatsTest, TestAtomErrorStats);
 };
 
 }  // namespace statsd
diff --git a/cmds/statsd/src/logd/LogEvent.cpp b/cmds/statsd/src/logd/LogEvent.cpp
index 8b6a864..10b1059 100644
--- a/cmds/statsd/src/logd/LogEvent.cpp
+++ b/cmds/statsd/src/logd/LogEvent.cpp
@@ -114,14 +114,6 @@
     mValues.push_back(FieldValue(Field(mTagId, getSimpleField(4)), Value(trainInfo.status)));
 }
 
-LogEvent::~LogEvent() {
-    if (mContext) {
-        // This is for the case when LogEvent is created using the test interface
-        // but init() isn't called.
-        android_log_destroy(&mContext);
-    }
-}
-
 void LogEvent::parseInt32(int32_t* pos, int32_t depth, bool* last, uint8_t numAnnotations) {
     int32_t value = readNextValue<int32_t>();
     addToValues(pos, depth, value, last);
@@ -219,8 +211,8 @@
 
 void LogEvent::parseAttributionChain(int32_t* pos, int32_t depth, bool* last,
                                      uint8_t numAnnotations) {
-    int firstUidInChainIndex = mValues.size();
-    int32_t numNodes = readNextValue<uint8_t>();
+    const unsigned int firstUidInChainIndex = mValues.size();
+    const int32_t numNodes = readNextValue<uint8_t>();
     for (pos[1] = 1; pos[1] <= numNodes; pos[1]++) {
         last[1] = (pos[1] == numNodes);
 
@@ -233,6 +225,11 @@
         last[2] = true;
         parseString(pos, /*depth=*/2, last, /*numAnnotations=*/0);
     }
+    // Check if at least one node was successfully parsed.
+    if (mValues.size() - 1 > firstUidInChainIndex) {
+        mAttributionChainStartIndex = firstUidInChainIndex;
+        mAttributionChainEndIndex = mValues.size() - 1;
+    }
 
     parseAnnotations(numAnnotations, firstUidInChainIndex);
 
@@ -293,7 +290,8 @@
     }
 
     const bool exclusiveState = readNextValue<uint8_t>();
-    mValues[mValues.size() - 1].mAnnotations.setExclusiveState(exclusiveState);
+    mExclusiveStateFieldIndex = mValues.size() - 1;
+    mValues[getExclusiveStateFieldIndex()].mAnnotations.setExclusiveState(exclusiveState);
 }
 
 void LogEvent::parseTriggerStateResetAnnotation(uint8_t annotationType) {
@@ -302,8 +300,7 @@
         return;
     }
 
-    int32_t resetState = readNextValue<int32_t>();
-    mValues[mValues.size() - 1].mAnnotations.setResetState(resetState);
+    mResetState = readNextValue<int32_t>();
 }
 
 void LogEvent::parseStateNestedAnnotation(uint8_t annotationType) {
@@ -385,7 +382,6 @@
         typeInfo = readNextValue<uint8_t>();
         uint8_t typeId = getTypeId(typeInfo);
 
-        // TODO(b/144373276): handle errors passed to the socket
         switch (typeId) {
             case BOOL_TYPE:
                 parseBool(pos, /*depth=*/0, last, getNumAnnotations(typeInfo));
@@ -410,10 +406,14 @@
                 break;
             case ATTRIBUTION_CHAIN_TYPE:
                 parseAttributionChain(pos, /*depth=*/0, last, getNumAnnotations(typeInfo));
-                if (mAttributionChainIndex == -1) mAttributionChainIndex = pos[0];
+                break;
+            case ERROR_TYPE:
+                mErrorBitmask = readNextValue<int32_t>();
+                mValid = false;
                 break;
             default:
                 mValid = false;
+                break;
         }
     }
 
@@ -571,6 +571,19 @@
     writeFieldValueTreeToStream(mTagId, getValues(), &protoOutput);
 }
 
+bool LogEvent::hasAttributionChain(std::pair<int, int>* indexRange) const {
+    if (mAttributionChainStartIndex == -1 || mAttributionChainEndIndex == -1) {
+        return false;
+    }
+
+    if (nullptr != indexRange) {
+        indexRange->first = mAttributionChainStartIndex;
+        indexRange->second = mAttributionChainEndIndex;
+    }
+
+    return true;
+}
+
 void writeExperimentIdsToProto(const std::vector<int64_t>& experimentIds,
                                std::vector<uint8_t>* protoOut) {
     ProtoOutputStream proto;
diff --git a/cmds/statsd/src/logd/LogEvent.h b/cmds/statsd/src/logd/LogEvent.h
index 4eeb7d6..731b966 100644
--- a/cmds/statsd/src/logd/LogEvent.h
+++ b/cmds/statsd/src/logd/LogEvent.h
@@ -70,7 +70,7 @@
     explicit LogEvent(int64_t wallClockTimestampNs, int64_t elapsedTimestampNs,
                       const InstallTrainInfo& installTrainInfo);
 
-    ~LogEvent();
+    ~LogEvent() {}
 
     /**
      * Get the timestamp associated with this event.
@@ -145,7 +145,7 @@
     }
 
     // Default value = false
-    inline bool shouldTruncateTimestamp() {
+    inline bool shouldTruncateTimestamp() const {
         return mTruncateTimestamp;
     }
 
@@ -163,11 +163,29 @@
         return mUidFieldIndex;
     }
 
-    // Returns the index of (the first) attribution chain within the atom
-    // definition. Note that the value is 1-indexed. If there is no attribution
-    // chain, returns -1.
-    inline int getAttributionChainIndex() {
-        return mAttributionChainIndex;
+    // Returns whether this LogEvent has an AttributionChain.
+    // If it does and indexRange is not a nullptr, populate indexRange with the start and end index
+    // of the AttributionChain within mValues.
+    bool hasAttributionChain(std::pair<int, int>* indexRange = nullptr) const;
+
+    // Returns the index of the exclusive state field within the FieldValues vector if
+    // an exclusive state exists. If there is no exclusive state field, returns -1.
+    //
+    // If the index within the atom definition is desired, do the following:
+    //    int vectorIndex = LogEvent.getExclusiveStateFieldIndex();
+    //    if (vectorIndex != -1) {
+    //        FieldValue& v = LogEvent.getValues()[vectorIndex];
+    //        int atomIndex = v.mField.getPosAtDepth(0);
+    //    }
+    // Note that atomIndex is 1-indexed.
+    inline int getExclusiveStateFieldIndex() const {
+        return mExclusiveStateFieldIndex;
+    }
+
+    // If a reset state is not sent in the StatsEvent, returns -1. Note that a
+    // reset state is sent if and only if a reset should be triggered.
+    inline int getResetState() const {
+        return mResetState;
     }
 
     inline LogEvent makeCopy() {
@@ -190,6 +208,14 @@
         return BAD_INDEX;
     }
 
+    bool isValid() const {
+        return mValid;
+    }
+
+    int32_t getErrorBitmask() const {
+        return mErrorBitmask;
+    }
+
 private:
     /**
      * Only use this if copy is absolutely needed.
@@ -216,12 +242,13 @@
     bool checkPreviousValueType(Type expected);
 
     /**
-     * The below three variables are only valid during the execution of
+     * The below two variables are only valid during the execution of
      * parseBuffer. There are no guarantees about the state of these variables
      * before/after.
      */
     uint8_t* mBuf;
     uint32_t mRemainingLen; // number of valid bytes left in the buffer being parsed
+
     bool mValid = true; // stores whether the event we received from the socket is valid
 
     /**
@@ -273,19 +300,15 @@
     // matching.
     std::vector<FieldValue> mValues;
 
-    // This field is used when statsD wants to create log event object and write fields to it. After
-    // calling init() function, this object would be destroyed to save memory usage.
-    // When the log event is created from log msg, this field is never initiated.
-    android_log_context mContext = NULL;
-
     // The timestamp set by the logd.
     int64_t mLogdTimestampNs;
 
     // The elapsed timestamp set by statsd log writer.
     int64_t mElapsedTimestampNs;
 
-    // The atom tag of the event.
-    int mTagId;
+    // The atom tag of the event (defaults to 0 if client does not
+    // appropriately set the atom id).
+    int mTagId = 0;
 
     // The uid of the logging client (defaults to -1).
     int32_t mLogUid = -1;
@@ -293,10 +316,16 @@
     // The pid of the logging client (defaults to -1).
     int32_t mLogPid = -1;
 
+    // Bitmask of errors sent by StatsEvent/AStatsEvent.
+    int32_t mErrorBitmask = 0;
+
     // Annotations
     bool mTruncateTimestamp = false;
     int mUidFieldIndex = -1;
-    int mAttributionChainIndex = -1;
+    int mAttributionChainStartIndex = -1;
+    int mAttributionChainEndIndex = -1;
+    int mExclusiveStateFieldIndex = -1;
+    int mResetState = -1;
 };
 
 void writeExperimentIdsToProto(const std::vector<int64_t>& experimentIds, std::vector<uint8_t>* protoOut);
diff --git a/cmds/statsd/src/main.cpp b/cmds/statsd/src/main.cpp
index d79b6a2..cd9c4e5 100644
--- a/cmds/statsd/src/main.cpp
+++ b/cmds/statsd/src/main.cpp
@@ -37,21 +37,30 @@
 using std::make_shared;
 
 shared_ptr<StatsService> gStatsService = nullptr;
+sp<StatsSocketListener> gSocketListener = nullptr;
 
-void sigHandler(int sig) {
-    if (gStatsService != nullptr) {
-        gStatsService->Terminate();
+void signalHandler(int sig) {
+    if (sig == SIGPIPE) {
+        // ShellSubscriber uses SIGPIPE as a signal to detect the end of the
+        // client process. Don't prematurely exit(1) here. Instead, ignore the
+        // signal and allow the write call to return EPIPE.
+        ALOGI("statsd received SIGPIPE. Ignoring signal.");
+        return;
     }
+
+    if (gSocketListener != nullptr) gSocketListener->stopListener();
+    if (gStatsService != nullptr) gStatsService->Terminate();
     ALOGW("statsd terminated on receiving signal %d.", sig);
     exit(1);
 }
 
-void registerSigHandler()
+void registerSignalHandlers()
 {
     struct sigaction sa;
     sigemptyset(&sa.sa_mask);
     sa.sa_flags = 0;
-    sa.sa_handler = sigHandler;
+    sa.sa_handler = signalHandler;
+    sigaction(SIGPIPE, &sa, nullptr);
     sigaction(SIGHUP, &sa, nullptr);
     sigaction(SIGINT, &sa, nullptr);
     sigaction(SIGQUIT, &sa, nullptr);
@@ -79,17 +88,17 @@
         return -1;
     }
 
-    registerSigHandler();
+    registerSignalHandlers();
 
     gStatsService->sayHiToStatsCompanion();
 
     gStatsService->Startup();
 
-    sp<StatsSocketListener> socketListener = new StatsSocketListener(eventQueue);
+    gSocketListener = new StatsSocketListener(eventQueue);
 
     ALOGI("Statsd starts to listen to socket.");
     // Backlog and /proc/sys/net/unix/max_dgram_qlen set to large value
-    if (socketListener->startListener(600)) {
+    if (gSocketListener->startListener(600)) {
         exit(1);
     }
 
diff --git a/cmds/statsd/src/metrics/CountMetricProducer.h b/cmds/statsd/src/metrics/CountMetricProducer.h
index a4711e8..f9a8842 100644
--- a/cmds/statsd/src/metrics/CountMetricProducer.h
+++ b/cmds/statsd/src/metrics/CountMetricProducer.h
@@ -109,10 +109,11 @@
     FRIEND_TEST(CountMetricProducerTest, TestEventsWithNonSlicedCondition);
     FRIEND_TEST(CountMetricProducerTest, TestEventsWithSlicedCondition);
     FRIEND_TEST(CountMetricProducerTest, TestAnomalyDetectionUnSliced);
-    FRIEND_TEST(CountMetricProducerTest, TestEventWithAppUpgrade);
-    FRIEND_TEST(CountMetricProducerTest, TestEventWithAppUpgradeInNextBucket);
     FRIEND_TEST(CountMetricProducerTest, TestFirstBucket);
     FRIEND_TEST(CountMetricProducerTest, TestOneWeekTimeUnit);
+
+    FRIEND_TEST(CountMetricProducerTest_PartialBucket, TestSplitInCurrentBucket);
+    FRIEND_TEST(CountMetricProducerTest_PartialBucket, TestSplitInNextBucket);
 };
 
 }  // namespace statsd
diff --git a/cmds/statsd/src/metrics/DurationMetricProducer.h b/cmds/statsd/src/metrics/DurationMetricProducer.h
index cc48f99..6f84076 100644
--- a/cmds/statsd/src/metrics/DurationMetricProducer.h
+++ b/cmds/statsd/src/metrics/DurationMetricProducer.h
@@ -154,12 +154,14 @@
     FRIEND_TEST(DurationMetricTrackerTest, TestNoCondition);
     FRIEND_TEST(DurationMetricTrackerTest, TestNonSlicedCondition);
     FRIEND_TEST(DurationMetricTrackerTest, TestNonSlicedConditionUnknownState);
-    FRIEND_TEST(DurationMetricTrackerTest, TestSumDurationWithUpgrade);
-    FRIEND_TEST(DurationMetricTrackerTest, TestSumDurationWithUpgradeInFollowingBucket);
-    FRIEND_TEST(DurationMetricTrackerTest, TestMaxDurationWithUpgrade);
-    FRIEND_TEST(DurationMetricTrackerTest, TestMaxDurationWithUpgradeInNextBucket);
     FRIEND_TEST(WakelockDurationE2eTest, TestAggregatedPredicates);
     FRIEND_TEST(DurationMetricTrackerTest, TestFirstBucket);
+
+    FRIEND_TEST(DurationMetricProducerTest_PartialBucket, TestSumDuration);
+    FRIEND_TEST(DurationMetricProducerTest_PartialBucket,
+                TestSumDurationWithSplitInFollowingBucket);
+    FRIEND_TEST(DurationMetricProducerTest_PartialBucket, TestMaxDuration);
+    FRIEND_TEST(DurationMetricProducerTest_PartialBucket, TestMaxDurationWithSplitInNextBucket);
 };
 
 }  // namespace statsd
diff --git a/cmds/statsd/src/metrics/EventMetricProducer.cpp b/cmds/statsd/src/metrics/EventMetricProducer.cpp
index 6833f8d..d68f64a 100644
--- a/cmds/statsd/src/metrics/EventMetricProducer.cpp
+++ b/cmds/statsd/src/metrics/EventMetricProducer.cpp
@@ -151,8 +151,7 @@
 
     uint64_t wrapperToken =
             mProto->start(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED | FIELD_ID_DATA);
-    const int64_t elapsedTimeNs = truncateTimestampIfNecessary(
-            event.GetTagId(), event.GetElapsedTimestampNs());
+    const int64_t elapsedTimeNs = truncateTimestampIfNecessary(event);
     mProto->write(FIELD_TYPE_INT64 | FIELD_ID_ELAPSED_TIMESTAMP_NANOS, (long long) elapsedTimeNs);
 
     uint64_t eventToken = mProto->start(FIELD_TYPE_MESSAGE | FIELD_ID_ATOMS);
diff --git a/cmds/statsd/src/metrics/GaugeMetricProducer.cpp b/cmds/statsd/src/metrics/GaugeMetricProducer.cpp
index 42bbd8e..c4bd054 100644
--- a/cmds/statsd/src/metrics/GaugeMetricProducer.cpp
+++ b/cmds/statsd/src/metrics/GaugeMetricProducer.cpp
@@ -270,11 +270,9 @@
                     protoOutput->end(atomsToken);
                 }
                 for (const auto& atom : bucket.mGaugeAtoms) {
-                    const int64_t elapsedTimestampNs =
-                            truncateTimestampIfNecessary(mAtomId, atom.mElapsedTimestamps);
-                    protoOutput->write(
-                        FIELD_TYPE_INT64 | FIELD_COUNT_REPEATED | FIELD_ID_ELAPSED_ATOM_TIMESTAMP,
-                        (long long)elapsedTimestampNs);
+                    protoOutput->write(FIELD_TYPE_INT64 | FIELD_COUNT_REPEATED |
+                                               FIELD_ID_ELAPSED_ATOM_TIMESTAMP,
+                                       (long long)atom.mElapsedTimestampNs);
                 }
             }
             protoOutput->end(bucketInfoToken);
@@ -477,7 +475,9 @@
     if ((*mCurrentSlicedBucket)[eventKey].size() >= mGaugeAtomsPerDimensionLimit) {
         return;
     }
-    GaugeAtom gaugeAtom(getGaugeFields(event), eventTimeNs);
+
+    const int64_t truncatedElapsedTimestampNs = truncateTimestampIfNecessary(event);
+    GaugeAtom gaugeAtom(getGaugeFields(event), truncatedElapsedTimestampNs);
     (*mCurrentSlicedBucket)[eventKey].push_back(gaugeAtom);
     // Anomaly detection on gauge metric only works when there is one numeric
     // field specified.
diff --git a/cmds/statsd/src/metrics/GaugeMetricProducer.h b/cmds/statsd/src/metrics/GaugeMetricProducer.h
index 79ec7112..2eb584b 100644
--- a/cmds/statsd/src/metrics/GaugeMetricProducer.h
+++ b/cmds/statsd/src/metrics/GaugeMetricProducer.h
@@ -35,10 +35,10 @@
 
 struct GaugeAtom {
     GaugeAtom(std::shared_ptr<vector<FieldValue>> fields, int64_t elapsedTimeNs)
-        : mFields(fields), mElapsedTimestamps(elapsedTimeNs) {
+        : mFields(fields), mElapsedTimestampNs(elapsedTimeNs) {
     }
     std::shared_ptr<vector<FieldValue>> mFields;
-    int64_t mElapsedTimestamps;
+    int64_t mElapsedTimestampNs;
 };
 
 struct GaugeBucket {
@@ -73,18 +73,23 @@
                       bool pullSuccess, int64_t originalPullTimeNs) override;
 
     // GaugeMetric needs to immediately trigger another pull when we create the partial bucket.
-    void notifyAppUpgrade(const int64_t& eventTimeNs, const string& apk, const int uid,
-                          const int64_t version) override {
+    void notifyAppUpgrade(const int64_t& eventTimeNs) override {
         std::lock_guard<std::mutex> lock(mMutex);
 
         if (!mSplitBucketForAppUpgrade) {
             return;
         }
-        if (eventTimeNs > getCurrentBucketEndTimeNs()) {
-            // Flush full buckets on the normal path up to the latest bucket boundary.
-            flushIfNeededLocked(eventTimeNs);
+        flushLocked(eventTimeNs);
+        if (mIsPulled && mSamplingType == GaugeMetric::RANDOM_ONE_SAMPLE) {
+            pullAndMatchEventsLocked(eventTimeNs);
         }
-        flushCurrentBucketLocked(eventTimeNs, eventTimeNs);
+    };
+
+    // GaugeMetric needs to immediately trigger another pull when we create the partial bucket.
+    void onStatsdInitCompleted(const int64_t& eventTimeNs) override {
+        std::lock_guard<std::mutex> lock(mMutex);
+
+        flushLocked(eventTimeNs);
         if (mIsPulled && mSamplingType == GaugeMetric::RANDOM_ONE_SAMPLE) {
             pullAndMatchEventsLocked(eventTimeNs);
         }
@@ -190,13 +195,14 @@
     FRIEND_TEST(GaugeMetricProducerTest, TestPulledEventsWithCondition);
     FRIEND_TEST(GaugeMetricProducerTest, TestPulledEventsWithSlicedCondition);
     FRIEND_TEST(GaugeMetricProducerTest, TestPulledEventsNoCondition);
-    FRIEND_TEST(GaugeMetricProducerTest, TestPushedEventsWithUpgrade);
-    FRIEND_TEST(GaugeMetricProducerTest, TestPulledWithUpgrade);
     FRIEND_TEST(GaugeMetricProducerTest, TestPulledWithAppUpgradeDisabled);
     FRIEND_TEST(GaugeMetricProducerTest, TestPulledEventsAnomalyDetection);
     FRIEND_TEST(GaugeMetricProducerTest, TestFirstBucket);
     FRIEND_TEST(GaugeMetricProducerTest, TestPullOnTrigger);
     FRIEND_TEST(GaugeMetricProducerTest, TestRemoveDimensionInOutput);
+
+    FRIEND_TEST(GaugeMetricProducerTest_PartialBucket, TestPushedEvents);
+    FRIEND_TEST(GaugeMetricProducerTest_PartialBucket, TestPulled);
 };
 
 }  // namespace statsd
diff --git a/cmds/statsd/src/metrics/MetricProducer.h b/cmds/statsd/src/metrics/MetricProducer.h
index 4550e65..91c98ea2 100644
--- a/cmds/statsd/src/metrics/MetricProducer.h
+++ b/cmds/statsd/src/metrics/MetricProducer.h
@@ -141,30 +141,25 @@
     }
 
     /**
-     * Forces this metric to split into a partial bucket right now. If we're past a full bucket, we
-     * first call the standard flushing code to flush up to the latest full bucket. Then we call
-     * the flush again when the end timestamp is forced to be now, and then after flushing, update
-     * the start timestamp to be now.
+     * Force a partial bucket split on app upgrade
      */
-    virtual void notifyAppUpgrade(const int64_t& eventTimeNs, const string& apk, const int uid,
-                          const int64_t version) {
+    virtual void notifyAppUpgrade(const int64_t& eventTimeNs) {
         std::lock_guard<std::mutex> lock(mMutex);
-
-        if (eventTimeNs > getCurrentBucketEndTimeNs()) {
-            // Flush full buckets on the normal path up to the latest bucket boundary.
-            flushIfNeededLocked(eventTimeNs);
-        }
-        // Now flush a partial bucket.
-        flushCurrentBucketLocked(eventTimeNs, eventTimeNs);
-        // Don't update the current bucket number so that the anomaly tracker knows this bucket
-        // is a partial bucket and can merge it with the previous bucket.
+        flushLocked(eventTimeNs);
     };
 
-    void notifyAppRemoved(const int64_t& eventTimeNs, const string& apk, const int uid) {
+    void notifyAppRemoved(const int64_t& eventTimeNs) {
         // Force buckets to split on removal also.
-        notifyAppUpgrade(eventTimeNs, apk, uid, 0);
+        notifyAppUpgrade(eventTimeNs);
     };
 
+    /**
+     * Force a partial bucket split on boot complete.
+     */
+    virtual void onStatsdInitCompleted(const int64_t& eventTimeNs) {
+        std::lock_guard<std::mutex> lock(mMutex);
+        flushLocked(eventTimeNs);
+    }
     // Consume the parsed stats log entry that already matched the "what" of the metric.
     void onMatchedLogEvent(const size_t matcherIndex, const LogEvent& event) {
         std::lock_guard<std::mutex> lock(mMutex);
@@ -292,8 +287,7 @@
     // End: getters/setters
 protected:
     /**
-     * Flushes the current bucket if the eventTime is after the current bucket's end time. This will
-       also flush the current partial bucket in memory.
+     * Flushes the current bucket if the eventTime is after the current bucket's end time.
      */
     virtual void flushIfNeededLocked(const int64_t& eventTime){};
 
@@ -451,7 +445,7 @@
     std::vector<int32_t> mSlicedStateAtoms;
 
     // Maps atom ids and state values to group_ids (<atom_id, <value, group_id>>).
-    std::unordered_map<int32_t, std::unordered_map<int, int64_t>> mStateGroupMap;
+    const std::unordered_map<int32_t, std::unordered_map<int, int64_t>> mStateGroupMap;
 
     // MetricStateLinks defined in statsd_config that link fields in the state
     // atom to fields in the "what" atom.
diff --git a/cmds/statsd/src/metrics/MetricsManager.cpp b/cmds/statsd/src/metrics/MetricsManager.cpp
index d832ed8..d7ad27b 100644
--- a/cmds/statsd/src/metrics/MetricsManager.cpp
+++ b/cmds/statsd/src/metrics/MetricsManager.cpp
@@ -189,7 +189,7 @@
             StateManager::getInstance().unregisterListener(atomId, it);
         }
     }
-    mPullerManager->UnregisterPullUidProvider(mConfigKey);
+    mPullerManager->UnregisterPullUidProvider(mConfigKey, this);
 
     VLOG("~MetricsManager()");
 }
@@ -231,8 +231,8 @@
 void MetricsManager::notifyAppUpgrade(const int64_t& eventTimeNs, const string& apk, const int uid,
                                       const int64_t version) {
     // Inform all metric producers.
-    for (auto it : mAllMetricProducers) {
-        it->notifyAppUpgrade(eventTimeNs, apk, uid, version);
+    for (const auto& it : mAllMetricProducers) {
+        it->notifyAppUpgrade(eventTimeNs);
     }
     // check if we care this package
     if (std::find(mAllowedPkg.begin(), mAllowedPkg.end(), apk) != mAllowedPkg.end()) {
@@ -252,8 +252,8 @@
 void MetricsManager::notifyAppRemoved(const int64_t& eventTimeNs, const string& apk,
                                       const int uid) {
     // Inform all metric producers.
-    for (auto it : mAllMetricProducers) {
-        it->notifyAppRemoved(eventTimeNs, apk, uid);
+    for (const auto& it : mAllMetricProducers) {
+        it->notifyAppRemoved(eventTimeNs);
     }
     // check if we care this package
     if (std::find(mAllowedPkg.begin(), mAllowedPkg.end(), apk) != mAllowedPkg.end()) {
@@ -282,6 +282,13 @@
     initLogSourceWhiteList();
 }
 
+void MetricsManager::onStatsdInitCompleted(const int64_t& eventTimeNs) {
+    // Inform all metric producers.
+    for (const auto& it : mAllMetricProducers) {
+        it->onStatsdInitCompleted(eventTimeNs);
+    }
+}
+
 void MetricsManager::init() {
     for (const auto& producer : mAllMetricProducers) {
         producer->prepareFirstBucket();
@@ -380,11 +387,14 @@
         // Uid is 3rd from last field and must match the caller's uid,
         // unless that caller is statsd itself (statsd is allowed to spoof uids).
         long appHookUid = event.GetLong(event.size()-2, &err);
-        if (err != NO_ERROR ) {
+        if (err != NO_ERROR) {
             VLOG("APP_BREADCRUMB_REPORTED had error when parsing the uid");
             return false;
         }
-        int32_t loggerUid = event.GetUid();
+
+        // Because the uid within the LogEvent may have been mapped from
+        // isolated to host, map the loggerUid similarly before comparing.
+        int32_t loggerUid = mUidMap->getHostUidOrSelf(event.GetUid());
         if (loggerUid != appHookUid && loggerUid != AID_STATSD) {
             VLOG("APP_BREADCRUMB_REPORTED has invalid uid: claimed %ld but caller is %d",
                  appHookUid, loggerUid);
@@ -393,7 +403,7 @@
 
         // The state must be from 0,3. This part of code must be manually updated.
         long appHookState = event.GetLong(event.size(), &err);
-        if (err != NO_ERROR ) {
+        if (err != NO_ERROR) {
             VLOG("APP_BREADCRUMB_REPORTED had error when parsing the state field");
             return false;
         } else if (appHookState < 0 || appHookState > 3) {
@@ -407,7 +417,7 @@
 
         // Uid is the first field provided.
         long jankUid = event.GetLong(1, &err);
-        if (err != NO_ERROR ) {
+        if (err != NO_ERROR) {
             VLOG("Davey occurred had error when parsing the uid");
             return false;
         }
@@ -419,7 +429,7 @@
         }
 
         long duration = event.GetLong(event.size(), &err);
-        if (err != NO_ERROR ) {
+        if (err != NO_ERROR) {
             VLOG("Davey occurred had error when parsing the duration");
             return false;
         } else if (duration > 100000) {
diff --git a/cmds/statsd/src/metrics/MetricsManager.h b/cmds/statsd/src/metrics/MetricsManager.h
index 1fd6572..ef03d20 100644
--- a/cmds/statsd/src/metrics/MetricsManager.h
+++ b/cmds/statsd/src/metrics/MetricsManager.h
@@ -70,6 +70,8 @@
 
     void onUidMapReceived(const int64_t& eventTimeNs);
 
+    void onStatsdInitCompleted(const int64_t& elapsedTimeNs);
+
     void init();
 
     vector<int32_t> getPullAtomUids(int32_t atomId) override;
diff --git a/cmds/statsd/src/metrics/ValueMetricProducer.h b/cmds/statsd/src/metrics/ValueMetricProducer.h
index e9273dc..c8dc8cc 100644
--- a/cmds/statsd/src/metrics/ValueMetricProducer.h
+++ b/cmds/statsd/src/metrics/ValueMetricProducer.h
@@ -69,8 +69,7 @@
                       bool pullSuccess, int64_t originalPullTimeNs) override;
 
     // ValueMetric needs special logic if it's a pulled atom.
-    void notifyAppUpgrade(const int64_t& eventTimeNs, const string& apk, const int uid,
-                          const int64_t version) override {
+    void notifyAppUpgrade(const int64_t& eventTimeNs) override {
         std::lock_guard<std::mutex> lock(mMutex);
         if (!mSplitBucketForAppUpgrade) {
             return;
@@ -81,6 +80,15 @@
         flushCurrentBucketLocked(eventTimeNs, eventTimeNs);
     };
 
+    // ValueMetric needs special logic if it's a pulled atom.
+    void onStatsdInitCompleted(const int64_t& eventTimeNs) override {
+        std::lock_guard<std::mutex> lock(mMutex);
+        if (mIsPulled && mCondition) {
+            pullAndMatchEventsLocked(eventTimeNs);
+        }
+        flushCurrentBucketLocked(eventTimeNs, eventTimeNs);
+    };
+
     void onStateChanged(int64_t eventTimeNs, int32_t atomId, const HashableDimensionKey& primaryKey,
                         int oldState, int newState) override;
 
@@ -256,7 +264,6 @@
 
     FRIEND_TEST(ValueMetricProducerTest, TestAnomalyDetection);
     FRIEND_TEST(ValueMetricProducerTest, TestBaseSetOnConditionChange);
-    FRIEND_TEST(ValueMetricProducerTest, TestBucketBoundariesOnAppUpgrade);
     FRIEND_TEST(ValueMetricProducerTest, TestBucketBoundariesOnConditionChange);
     FRIEND_TEST(ValueMetricProducerTest, TestBucketBoundaryNoCondition);
     FRIEND_TEST(ValueMetricProducerTest, TestBucketBoundaryWithCondition);
@@ -269,10 +276,8 @@
     FRIEND_TEST(ValueMetricProducerTest, TestEmptyDataResetsBase_onDataPulled);
     FRIEND_TEST(ValueMetricProducerTest, TestEventsWithNonSlicedCondition);
     FRIEND_TEST(ValueMetricProducerTest, TestFirstBucket);
-    FRIEND_TEST(ValueMetricProducerTest, TestFullBucketResetWhenLastBucketInvalid);
     FRIEND_TEST(ValueMetricProducerTest, TestLateOnDataPulledWithDiff);
     FRIEND_TEST(ValueMetricProducerTest, TestLateOnDataPulledWithoutDiff);
-    FRIEND_TEST(ValueMetricProducerTest, TestPartialBucketCreated);
     FRIEND_TEST(ValueMetricProducerTest, TestPartialResetOnBucketBoundaries);
     FRIEND_TEST(ValueMetricProducerTest, TestPulledData_noDiff_bucketBoundaryFalse);
     FRIEND_TEST(ValueMetricProducerTest, TestPulledData_noDiff_bucketBoundaryTrue);
@@ -283,15 +288,12 @@
     FRIEND_TEST(ValueMetricProducerTest, TestPulledEventsTakeAbsoluteValueOnReset);
     FRIEND_TEST(ValueMetricProducerTest, TestPulledEventsTakeZeroOnReset);
     FRIEND_TEST(ValueMetricProducerTest, TestPulledEventsWithFiltering);
-    FRIEND_TEST(ValueMetricProducerTest, TestPulledValueWithUpgrade);
-    FRIEND_TEST(ValueMetricProducerTest, TestPulledValueWithUpgradeWhileConditionFalse);
     FRIEND_TEST(ValueMetricProducerTest, TestPulledWithAppUpgradeDisabled);
     FRIEND_TEST(ValueMetricProducerTest, TestPushedAggregateAvg);
     FRIEND_TEST(ValueMetricProducerTest, TestPushedAggregateMax);
     FRIEND_TEST(ValueMetricProducerTest, TestPushedAggregateMin);
     FRIEND_TEST(ValueMetricProducerTest, TestPushedAggregateSum);
     FRIEND_TEST(ValueMetricProducerTest, TestPushedEventsWithCondition);
-    FRIEND_TEST(ValueMetricProducerTest, TestPushedEventsWithUpgrade);
     FRIEND_TEST(ValueMetricProducerTest, TestPushedEventsWithoutCondition);
     FRIEND_TEST(ValueMetricProducerTest, TestResetBaseOnPullDelayExceeded);
     FRIEND_TEST(ValueMetricProducerTest, TestResetBaseOnPullFailAfterConditionChange);
@@ -313,6 +315,14 @@
     FRIEND_TEST(ValueMetricProducerTest_BucketDrop, TestInvalidBucketWhenGuardRailHit);
     FRIEND_TEST(ValueMetricProducerTest_BucketDrop,
                 TestInvalidBucketWhenAccumulateEventWrongBucket);
+
+    FRIEND_TEST(ValueMetricProducerTest_PartialBucket, TestBucketBoundariesOnPartialBucket);
+    FRIEND_TEST(ValueMetricProducerTest_PartialBucket, TestFullBucketResetWhenLastBucketInvalid);
+    FRIEND_TEST(ValueMetricProducerTest_PartialBucket, TestPartialBucketCreated);
+    FRIEND_TEST(ValueMetricProducerTest_PartialBucket, TestPushedEvents);
+    FRIEND_TEST(ValueMetricProducerTest_PartialBucket, TestPulledValue);
+    FRIEND_TEST(ValueMetricProducerTest_PartialBucket, TestPulledValueWhileConditionFalse);
+
     friend class ValueMetricProducerTestHelper;
 };
 
diff --git a/cmds/statsd/src/metrics/metrics_manager_util.cpp b/cmds/statsd/src/metrics/metrics_manager_util.cpp
index 2fcb13b..3ab44f4 100644
--- a/cmds/statsd/src/metrics/metrics_manager_util.cpp
+++ b/cmds/statsd/src/metrics/metrics_manager_util.cpp
@@ -21,7 +21,6 @@
 
 #include <inttypes.h>
 
-#include "atoms_info.h"
 #include "FieldValue.h"
 #include "MetricProducer.h"
 #include "condition/CombinationConditionTracker.h"
@@ -795,9 +794,7 @@
     for (const auto& it : allMetricProducers) {
         // Register metrics to StateTrackers
         for (int atomId : it->getSlicedStateAtoms()) {
-            if (!StateManager::getInstance().registerListener(atomId, it)) {
-                return false;
-            }
+            StateManager::getInstance().registerListener(atomId, it);
         }
     }
     return true;
diff --git a/cmds/statsd/src/state/StateManager.cpp b/cmds/statsd/src/state/StateManager.cpp
index ea776fa..5514b446 100644
--- a/cmds/statsd/src/state/StateManager.cpp
+++ b/cmds/statsd/src/state/StateManager.cpp
@@ -38,20 +38,12 @@
     }
 }
 
-bool StateManager::registerListener(const int32_t atomId, wp<StateListener> listener) {
+void StateManager::registerListener(const int32_t atomId, wp<StateListener> listener) {
     // Check if state tracker already exists.
     if (mStateTrackers.find(atomId) == mStateTrackers.end()) {
-        // Create a new state tracker iff atom is a state atom.
-        auto it = android::util::AtomsInfo::kStateAtomsFieldOptions.find(atomId);
-        if (it != android::util::AtomsInfo::kStateAtomsFieldOptions.end()) {
-            mStateTrackers[atomId] = new StateTracker(atomId, it->second);
-        } else {
-            ALOGE("StateManager cannot register listener, Atom %d is not a state atom", atomId);
-            return false;
-        }
+        mStateTrackers[atomId] = new StateTracker(atomId);
     }
     mStateTrackers[atomId]->registerListener(listener);
-    return true;
 }
 
 void StateManager::unregisterListener(const int32_t atomId, wp<StateListener> listener) {
diff --git a/cmds/statsd/src/state/StateManager.h b/cmds/statsd/src/state/StateManager.h
index 8b3a4218..577a0f5 100644
--- a/cmds/statsd/src/state/StateManager.h
+++ b/cmds/statsd/src/state/StateManager.h
@@ -45,10 +45,11 @@
     // Notifies the correct StateTracker of an event.
     void onLogEvent(const LogEvent& event);
 
-    // Returns true if atomId is being tracked and is associated with a state
-    // atom. StateManager notifies the correct StateTracker to register listener.
+    // Notifies the StateTracker for the given atomId to register listener.
     // If the correct StateTracker does not exist, a new StateTracker is created.
-    bool registerListener(const int32_t atomId, wp<StateListener> listener);
+    // Note: StateTrackers can be created for non-state atoms. They are essentially empty and
+    // do not perform any actions.
+    void registerListener(const int32_t atomId, wp<StateListener> listener);
 
     // Notifies the correct StateTracker to unregister a listener
     // and removes the tracker if it no longer has any listeners.
diff --git a/cmds/statsd/src/state/StateTracker.cpp b/cmds/statsd/src/state/StateTracker.cpp
index ab86127..b63713b 100644
--- a/cmds/statsd/src/state/StateTracker.cpp
+++ b/cmds/statsd/src/state/StateTracker.cpp
@@ -25,81 +25,43 @@
 namespace os {
 namespace statsd {
 
-StateTracker::StateTracker(const int32_t atomId, const util::StateAtomFieldOptions& stateAtomInfo)
-    : mAtomId(atomId),
-      mStateField(getSimpleMatcher(atomId, stateAtomInfo.exclusiveField)),
-      mNested(stateAtomInfo.nested) {
-    // create matcher for each primary field
-    for (const auto& primaryField : stateAtomInfo.primaryFields) {
-        if (primaryField == util::FIRST_UID_IN_CHAIN) {
-            Matcher matcher = getFirstUidMatcher(atomId);
-            mPrimaryFields.push_back(matcher);
-        } else {
-            Matcher matcher = getSimpleMatcher(atomId, primaryField);
-            mPrimaryFields.push_back(matcher);
-        }
-    }
-
-    if (stateAtomInfo.defaultState != util::UNSET_VALUE) {
-        mDefaultState = stateAtomInfo.defaultState;
-    }
-
-    if (stateAtomInfo.resetState != util::UNSET_VALUE) {
-        mResetState = stateAtomInfo.resetState;
-    }
+StateTracker::StateTracker(const int32_t atomId) : mField(atomId, 0) {
 }
 
 void StateTracker::onLogEvent(const LogEvent& event) {
-    int64_t eventTimeNs = event.GetElapsedTimestampNs();
+    const int64_t eventTimeNs = event.GetElapsedTimestampNs();
 
     // Parse event for primary field values i.e. primary key.
     HashableDimensionKey primaryKey;
-    if (mPrimaryFields.size() > 0) {
-        if (!filterValues(mPrimaryFields, event.getValues(), &primaryKey) ||
-            primaryKey.getValues().size() != mPrimaryFields.size()) {
-            ALOGE("StateTracker error extracting primary key from log event.");
-            handleReset(eventTimeNs);
-            return;
-        }
-    } else {
-        // Use an empty HashableDimensionKey if atom has no primary fields.
-        primaryKey = DEFAULT_DIMENSION_KEY;
+    filterPrimaryKey(event.getValues(), &primaryKey);
+
+    FieldValue stateValue;
+    if (!getStateFieldValueFromLogEvent(event, &stateValue)) {
+        ALOGE("StateTracker error extracting state from log event. Missing exclusive state field.");
+        clearStateForPrimaryKey(eventTimeNs, primaryKey);
+        return;
     }
 
-    // Parse event for state value.
-    FieldValue stateValue;
-    if (!filterValues(mStateField, event.getValues(), &stateValue) ||
-        stateValue.mValue.getType() != INT) {
+    mField.setField(stateValue.mField.getField());
+
+    if (stateValue.mValue.getType() != INT) {
         ALOGE("StateTracker error extracting state from log event. Type: %d",
               stateValue.mValue.getType());
-        handlePartialReset(eventTimeNs, primaryKey);
+        clearStateForPrimaryKey(eventTimeNs, primaryKey);
         return;
     }
 
-    int32_t state = stateValue.mValue.int_value;
-    if (state == mResetState) {
-        VLOG("StateTracker Reset state: %s", stateValue.mValue.toString().c_str());
-        handleReset(eventTimeNs);
+    const int32_t resetState = event.getResetState();
+    if (resetState != -1) {
+        VLOG("StateTracker new reset state: %d", resetState);
+        handleReset(eventTimeNs, resetState);
         return;
     }
 
-    // Track and update state.
-    int32_t oldState = 0;
-    int32_t newState = 0;
-    updateState(primaryKey, state, &oldState, &newState);
-
-    // Notify all listeners if state has changed.
-    if (oldState != newState) {
-        VLOG("StateTracker updated state");
-        for (auto listener : mListeners) {
-            auto sListener = listener.promote();  // safe access to wp<>
-            if (sListener != nullptr) {
-                sListener->onStateChanged(eventTimeNs, mAtomId, primaryKey, oldState, newState);
-            }
-        }
-    } else {
-        VLOG("StateTracker NO updated state");
-    }
+    const int32_t newState = stateValue.mValue.int_value;
+    const bool nested = stateValue.mAnnotations.isNested();
+    StateValueInfo* stateValueInfo = &mStateMap[primaryKey];
+    updateStateForPrimaryKey(eventTimeNs, primaryKey, newState, nested, stateValueInfo);
 }
 
 void StateTracker::registerListener(wp<StateListener> listener) {
@@ -111,81 +73,62 @@
 }
 
 bool StateTracker::getStateValue(const HashableDimensionKey& queryKey, FieldValue* output) const {
-    output->mField = mStateField.mMatcher;
+    output->mField = mField;
 
-    // Check that the query key has the correct number of primary fields.
-    if (queryKey.getValues().size() == mPrimaryFields.size()) {
-        auto it = mStateMap.find(queryKey);
-        if (it != mStateMap.end()) {
-            output->mValue = it->second.state;
-            return true;
-        }
-    } else if (queryKey.getValues().size() > mPrimaryFields.size()) {
-        ALOGE("StateTracker query key size %zu > primary key size %zu is illegal",
-              queryKey.getValues().size(), mPrimaryFields.size());
-    } else {
-        ALOGE("StateTracker query key size %zu < primary key size %zu is not supported",
-              queryKey.getValues().size(), mPrimaryFields.size());
+    if (const auto it = mStateMap.find(queryKey); it != mStateMap.end()) {
+        output->mValue = it->second.state;
+        return true;
     }
 
-    // Set the state value to default state if:
-    // - query key size is incorrect
-    // - query key is not found in state map
-    output->mValue = mDefaultState;
+    // Set the state value to kStateUnknown if query key is not found in state map.
+    output->mValue = kStateUnknown;
     return false;
 }
 
-void StateTracker::handleReset(const int64_t eventTimeNs) {
+void StateTracker::handleReset(const int64_t eventTimeNs, const int32_t newState) {
     VLOG("StateTracker handle reset");
-    for (const auto pair : mStateMap) {
-        for (auto l : mListeners) {
-            auto sl = l.promote();
-            if (sl != nullptr) {
-                sl->onStateChanged(eventTimeNs, mAtomId, pair.first, pair.second.state,
-                                   mDefaultState);
-            }
-        }
-    }
-    mStateMap.clear();
-}
-
-void StateTracker::handlePartialReset(const int64_t eventTimeNs,
-                                      const HashableDimensionKey& primaryKey) {
-    VLOG("StateTracker handle partial reset");
-    if (mStateMap.find(primaryKey) != mStateMap.end()) {
-        for (auto l : mListeners) {
-            auto sl = l.promote();
-            if (sl != nullptr) {
-                sl->onStateChanged(eventTimeNs, mAtomId, primaryKey,
-                                   mStateMap.find(primaryKey)->second.state, mDefaultState);
-            }
-        }
-        mStateMap.erase(primaryKey);
+    for (auto& [primaryKey, stateValueInfo] : mStateMap) {
+        updateStateForPrimaryKey(eventTimeNs, primaryKey, newState,
+                                 false /* nested; treat this state change as not nested */,
+                                 &stateValueInfo);
     }
 }
 
-void StateTracker::updateState(const HashableDimensionKey& primaryKey, const int32_t eventState,
-                               int32_t* oldState, int32_t* newState) {
-    // get old state (either current state in map or default state)
-    auto it = mStateMap.find(primaryKey);
+void StateTracker::clearStateForPrimaryKey(const int64_t eventTimeNs,
+                                           const HashableDimensionKey& primaryKey) {
+    VLOG("StateTracker clear state for primary key");
+    const std::unordered_map<HashableDimensionKey, StateValueInfo>::iterator it =
+            mStateMap.find(primaryKey);
+
+    // If there is no entry for the primaryKey in mStateMap, then the state is already
+    // kStateUnknown.
     if (it != mStateMap.end()) {
-        *oldState = it->second.state;
-    } else {
-        *oldState = mDefaultState;
+        updateStateForPrimaryKey(eventTimeNs, primaryKey, kStateUnknown,
+                                 false /* nested; treat this state change as not nested */,
+                                 &it->second);
+    }
+}
+
+void StateTracker::updateStateForPrimaryKey(const int64_t eventTimeNs,
+                                            const HashableDimensionKey& primaryKey,
+                                            const int32_t newState, const bool nested,
+                                            StateValueInfo* stateValueInfo) {
+    const int32_t oldState = stateValueInfo->state;
+
+    if (kStateUnknown == newState) {
+        mStateMap.erase(primaryKey);
     }
 
     // Update state map for non-nested counting case.
     // Every state event triggers a state overwrite.
-    if (!mNested) {
-        if (eventState == mDefaultState) {
-            // remove (key, state) pair if state returns to default state
-            VLOG("\t StateTracker changed to default state")
-            mStateMap.erase(primaryKey);
-        } else {
-            mStateMap[primaryKey].state = eventState;
-            mStateMap[primaryKey].count = 1;
+    if (!nested) {
+        stateValueInfo->state = newState;
+        stateValueInfo->count = 1;
+
+        // Notify listeners if state has changed.
+        if (oldState != newState) {
+            notifyListeners(eventTimeNs, primaryKey, oldState, newState);
         }
-        *newState = eventState;
         return;
     }
 
@@ -197,31 +140,47 @@
     // number of OFF events as ON events.
     //
     // In atoms.proto, a state atom with nested counting enabled
-    // must only have 2 states and one of the states must be the default state.
-    it = mStateMap.find(primaryKey);
-    if (it != mStateMap.end()) {
-        *newState = it->second.state;
-        if (eventState == it->second.state) {
-            it->second.count++;
-        } else if (eventState == mDefaultState) {
-            if ((--it->second.count) == 0) {
-                mStateMap.erase(primaryKey);
-                *newState = mDefaultState;
-            }
-        } else {
-            ALOGE("StateTracker Nest counting state has a third state instead of the binary state "
-                  "limit.");
-            return;
+    // must only have 2 states. There is no enforcemnt here of this requirement.
+    // The atom must be logged correctly.
+    if (kStateUnknown == newState) {
+        if (kStateUnknown != oldState) {
+            notifyListeners(eventTimeNs, primaryKey, oldState, newState);
         }
-    } else {
-        if (eventState != mDefaultState) {
-            mStateMap[primaryKey].state = eventState;
-            mStateMap[primaryKey].count = 1;
-        }
-        *newState = eventState;
+    } else if (oldState == kStateUnknown) {
+        stateValueInfo->state = newState;
+        stateValueInfo->count = 1;
+        notifyListeners(eventTimeNs, primaryKey, oldState, newState);
+    } else if (oldState == newState) {
+        stateValueInfo->count++;
+    } else if (--stateValueInfo->count == 0) {
+        stateValueInfo->state = newState;
+        stateValueInfo->count = 1;
+        notifyListeners(eventTimeNs, primaryKey, oldState, newState);
     }
 }
 
+void StateTracker::notifyListeners(const int64_t eventTimeNs,
+                                   const HashableDimensionKey& primaryKey, const int32_t oldState,
+                                   const int32_t newState) {
+    for (auto l : mListeners) {
+        auto sl = l.promote();
+        if (sl != nullptr) {
+            sl->onStateChanged(eventTimeNs, mField.getTag(), primaryKey, oldState, newState);
+        }
+    }
+}
+
+bool getStateFieldValueFromLogEvent(const LogEvent& event, FieldValue* output) {
+    const int exclusiveStateFieldIndex = event.getExclusiveStateFieldIndex();
+    if (-1 == exclusiveStateFieldIndex) {
+        ALOGE("error extracting state from log event. Missing exclusive state field.");
+        return false;
+    }
+
+    *output = event.getValues()[exclusiveStateFieldIndex];
+    return true;
+}
+
 }  // namespace statsd
 }  // namespace os
 }  // namespace android
diff --git a/cmds/statsd/src/state/StateTracker.h b/cmds/statsd/src/state/StateTracker.h
index 154750e..c5f6315 100644
--- a/cmds/statsd/src/state/StateTracker.h
+++ b/cmds/statsd/src/state/StateTracker.h
@@ -15,7 +15,6 @@
  */
 #pragma once
 
-#include <atoms_info.h>
 #include <utils/RefBase.h>
 #include "HashableDimensionKey.h"
 #include "logd/LogEvent.h"
@@ -30,7 +29,7 @@
 
 class StateTracker : public virtual RefBase {
 public:
-    StateTracker(const int32_t atomId, const android::util::StateAtomFieldOptions& stateAtomInfo);
+    StateTracker(const int32_t atomId);
 
     virtual ~StateTracker(){};
 
@@ -60,21 +59,11 @@
 
 private:
     struct StateValueInfo {
-        int32_t state;  // state value
-        int count;      // nested count (only used for binary states)
+        int32_t state = kStateUnknown;  // state value
+        int count = 0;                  // nested count (only used for binary states)
     };
 
-    const int32_t mAtomId;  // id of the state atom being tracked
-
-    Matcher mStateField;  // matches the atom's exclusive state field
-
-    std::vector<Matcher> mPrimaryFields;  // matches the atom's primary fields
-
-    int32_t mDefaultState = kStateUnknown;
-
-    int32_t mResetState = kStateUnknown;
-
-    const bool mNested;
+    Field mField;
 
     // Maps primary key to state value info
     std::unordered_map<HashableDimensionKey, StateValueInfo> mStateMap;
@@ -82,20 +71,24 @@
     // Set of all StateListeners (objects listening for state changes)
     std::set<wp<StateListener>> mListeners;
 
-    // Reset all state values in map to default state.
-    void handleReset(const int64_t eventTimeNs);
+    // Reset all state values in map to the given state.
+    void handleReset(const int64_t eventTimeNs, const int32_t newState);
 
-    // Reset only the state value mapped to the given primary key to default state.
-    // Partial resets are used when we only need to update the state of one primary
-    // key instead of clearing/reseting every key in the map.
-    void handlePartialReset(const int64_t eventTimeNs, const HashableDimensionKey& primaryKey);
+    // Clears the state value mapped to the given primary key by setting it to kStateUnknown.
+    void clearStateForPrimaryKey(const int64_t eventTimeNs, const HashableDimensionKey& primaryKey);
 
     // Update the StateMap based on the received state value.
-    // Store the old and new states.
-    void updateState(const HashableDimensionKey& primaryKey, const int32_t eventState,
-                     int32_t* oldState, int32_t* newState);
+    void updateStateForPrimaryKey(const int64_t eventTimeNs, const HashableDimensionKey& primaryKey,
+                                  const int32_t newState, const bool nested,
+                                  StateValueInfo* stateValueInfo);
+
+    // Notify registered state listeners of state change.
+    void notifyListeners(const int64_t eventTimeNs, const HashableDimensionKey& primaryKey,
+                         const int32_t oldState, const int32_t newState);
 };
 
+bool getStateFieldValueFromLogEvent(const LogEvent& event, FieldValue* output);
+
 }  // namespace statsd
 }  // namespace os
 }  // namespace android
diff --git a/cmds/statsd/src/stats_log.proto b/cmds/statsd/src/stats_log.proto
index f4247ec..868247b 100644
--- a/cmds/statsd/src/stats_log.proto
+++ b/cmds/statsd/src/stats_log.proto
@@ -425,6 +425,7 @@
     message AtomStats {
         optional int32 tag = 1;
         optional int32 count = 2;
+        optional int32 error_count = 3;
     }
 
     repeated AtomStats atom_stats = 7;
@@ -460,6 +461,7 @@
         optional int64 empty_data = 15;
         optional int64 registered_count = 16;
         optional int64 unregistered_count = 17;
+        optional int32 atom_error_count = 18;
     }
     repeated PulledAtomStats pulled_atom_stats = 10;
 
diff --git a/cmds/statsd/src/stats_log_util.cpp b/cmds/statsd/src/stats_log_util.cpp
index 77a3eb3..2acffee 100644
--- a/cmds/statsd/src/stats_log_util.cpp
+++ b/cmds/statsd/src/stats_log_util.cpp
@@ -24,7 +24,6 @@
 
 #include "statscompanion_util.h"
 
-using android::util::AtomsInfo;
 using android::util::FIELD_COUNT_REPEATED;
 using android::util::FIELD_TYPE_BOOL;
 using android::util::FIELD_TYPE_FIXED64;
@@ -80,6 +79,8 @@
 const int FIELD_ID_EMPTY_DATA = 15;
 const int FIELD_ID_PULL_REGISTERED_COUNT = 16;
 const int FIELD_ID_PULL_UNREGISTERED_COUNT = 17;
+const int FIELD_ID_ATOM_ERROR_COUNT = 18;
+
 // for AtomMetricStats proto
 const int FIELD_ID_ATOM_METRIC_STATS = 17;
 const int FIELD_ID_METRIC_ID = 1;
@@ -492,6 +493,7 @@
                        (long long) pair.second.registeredCount);
     protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_PULL_UNREGISTERED_COUNT,
                        (long long) pair.second.unregisteredCount);
+    protoOutput->write(FIELD_TYPE_INT32 | FIELD_ID_ATOM_ERROR_COUNT, pair.second.atomErrorCount);
     protoOutput->end(token);
 }
 
@@ -549,14 +551,13 @@
     return time(nullptr) * MS_PER_SEC;
 }
 
-int64_t truncateTimestampIfNecessary(int atomId, int64_t timestampNs) {
-    if (AtomsInfo::kTruncatingTimestampAtomBlackList.find(atomId) !=
-            AtomsInfo::kTruncatingTimestampAtomBlackList.end() ||
-        (atomId >= StatsdStats::kTimestampTruncationStartTag &&
-         atomId <= StatsdStats::kTimestampTruncationEndTag)) {
-        return timestampNs / NS_PER_SEC / (5 * 60) * NS_PER_SEC * (5 * 60);
+int64_t truncateTimestampIfNecessary(const LogEvent& event) {
+    if (event.shouldTruncateTimestamp() ||
+        (event.GetTagId() >= StatsdStats::kTimestampTruncationStartTag &&
+         event.GetTagId() <= StatsdStats::kTimestampTruncationEndTag)) {
+        return event.GetElapsedTimestampNs() / NS_PER_SEC / (5 * 60) * NS_PER_SEC * (5 * 60);
     } else {
-        return timestampNs;
+        return event.GetElapsedTimestampNs();
     }
 }
 
diff --git a/cmds/statsd/src/stats_log_util.h b/cmds/statsd/src/stats_log_util.h
index ade25d6..20d93b5 100644
--- a/cmds/statsd/src/stats_log_util.h
+++ b/cmds/statsd/src/stats_log_util.h
@@ -17,11 +17,12 @@
 #pragma once
 
 #include <android/util/ProtoOutputStream.h>
+
 #include "FieldValue.h"
 #include "HashableDimensionKey.h"
-#include "atoms_info.h"
 #include "frameworks/base/cmds/statsd/src/statsd_config.pb.h"
 #include "guardrail/StatsdStats.h"
+#include "logd/LogEvent.h"
 
 using android::util::ProtoOutputStream;
 
@@ -93,9 +94,9 @@
     return message->ParseFromArray(pbBytes.c_str(), pbBytes.size());
 }
 
-// Checks the blacklist of atoms as well as the blacklisted range of 300,000 - 304,999.
+// Checks the truncate timestamp annotation as well as the blacklisted range of 300,000 - 304,999.
 // Returns the truncated timestamp to the nearest 5 minutes if needed.
-int64_t truncateTimestampIfNecessary(int atomId, int64_t timestampNs);
+int64_t truncateTimestampIfNecessary(const LogEvent& event);
 
 // Checks permission for given pid and uid.
 bool checkPermissionForIds(const char* permission, pid_t pid, uid_t uid);
diff --git a/cmds/statsd/src/utils/MultiConditionTrigger.cpp b/cmds/statsd/src/utils/MultiConditionTrigger.cpp
new file mode 100644
index 0000000..43a6933
--- /dev/null
+++ b/cmds/statsd/src/utils/MultiConditionTrigger.cpp
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#define DEBUG false  // STOPSHIP if true
+
+#include "MultiConditionTrigger.h"
+
+#include <thread>
+
+using namespace std;
+
+namespace android {
+namespace os {
+namespace statsd {
+
+MultiConditionTrigger::MultiConditionTrigger(const set<string>& conditionNames,
+                                             function<void()> trigger)
+    : mRemainingConditionNames(conditionNames),
+      mTrigger(trigger),
+      mCompleted(mRemainingConditionNames.empty()) {
+    if (mCompleted) {
+        thread executorThread([this] { mTrigger(); });
+        executorThread.detach();
+    }
+}
+
+void MultiConditionTrigger::markComplete(const string& conditionName) {
+    bool doTrigger = false;
+    {
+        lock_guard<mutex> lg(mMutex);
+        if (mCompleted) {
+            return;
+        }
+        mRemainingConditionNames.erase(conditionName);
+        mCompleted = mRemainingConditionNames.empty();
+        doTrigger = mCompleted;
+    }
+    if (doTrigger) {
+        std::thread executorThread([this] { mTrigger(); });
+        executorThread.detach();
+    }
+}
+}  // namespace statsd
+}  // namespace os
+}  // namespace android
diff --git a/cmds/statsd/src/utils/MultiConditionTrigger.h b/cmds/statsd/src/utils/MultiConditionTrigger.h
new file mode 100644
index 0000000..51f6029
--- /dev/null
+++ b/cmds/statsd/src/utils/MultiConditionTrigger.h
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#pragma once
+
+#include <gtest/gtest_prod.h>
+
+#include <mutex>
+#include <set>
+
+namespace android {
+namespace os {
+namespace statsd {
+
+/**
+ * This class provides a utility to wait for a set of named conditions to occur.
+ *
+ * It will execute the trigger runnable in a detached thread once all conditions have been marked
+ * true.
+ */
+class MultiConditionTrigger {
+public:
+    explicit MultiConditionTrigger(const std::set<std::string>& conditionNames,
+                                   std::function<void()> trigger);
+
+    MultiConditionTrigger(const MultiConditionTrigger&) = delete;
+    MultiConditionTrigger& operator=(const MultiConditionTrigger&) = delete;
+
+    // Mark a specific condition as true. If this condition has called markComplete already or if
+    // the event was not specified in the constructor, the function is a no-op.
+    void markComplete(const std::string& eventName);
+
+private:
+    mutable std::mutex mMutex;
+    std::set<std::string> mRemainingConditionNames;
+    std::function<void()> mTrigger;
+    bool mCompleted;
+
+    FRIEND_TEST(MultiConditionTriggerTest, TestCountDownCalledBySameEventName);
+};
+}  // namespace statsd
+}  // namespace os
+}  // namespace android
diff --git a/cmds/statsd/tests/LogEvent_test.cpp b/cmds/statsd/tests/LogEvent_test.cpp
index bb4578d..00f336a 100644
--- a/cmds/statsd/tests/LogEvent_test.cpp
+++ b/cmds/statsd/tests/LogEvent_test.cpp
@@ -95,6 +95,7 @@
     EXPECT_EQ(100, logEvent.GetTagId());
     EXPECT_EQ(1000, logEvent.GetUid());
     EXPECT_EQ(1001, logEvent.GetPid());
+    EXPECT_FALSE(logEvent.hasAttributionChain());
 
     const vector<FieldValue>& values = logEvent.getValues();
     EXPECT_EQ(4, values.size());
@@ -143,6 +144,7 @@
     EXPECT_EQ(100, logEvent.GetTagId());
     EXPECT_EQ(1000, logEvent.GetUid());
     EXPECT_EQ(1001, logEvent.GetPid());
+    EXPECT_FALSE(logEvent.hasAttributionChain());
 
     const vector<FieldValue>& values = logEvent.getValues();
     EXPECT_EQ(2, values.size());
@@ -179,6 +181,7 @@
     EXPECT_EQ(100, logEvent.GetTagId());
     EXPECT_EQ(1000, logEvent.GetUid());
     EXPECT_EQ(1001, logEvent.GetPid());
+    EXPECT_FALSE(logEvent.hasAttributionChain());
 
     const vector<FieldValue>& values = logEvent.getValues();
     EXPECT_EQ(1, values.size());
@@ -248,6 +251,11 @@
     const vector<FieldValue>& values = logEvent.getValues();
     EXPECT_EQ(4, values.size());  // 2 per attribution node
 
+    std::pair<int, int> attrIndexRange;
+    EXPECT_TRUE(logEvent.hasAttributionChain(&attrIndexRange));
+    EXPECT_EQ(0, attrIndexRange.first);
+    EXPECT_EQ(3, attrIndexRange.second);
+
     // Check first attribution node
     const FieldValue& uid1Item = values[0];
     Field expectedField = getField(100, {1, 1, 1}, 2, {true, false, false});
@@ -352,7 +360,7 @@
 
     const vector<FieldValue>& values = event.getValues();
     EXPECT_EQ(values.size(), 1);
-    EXPECT_EQ(values[0].mAnnotations.getResetState(), resetState);
+    EXPECT_EQ(event.getResetState(), resetState);
 }
 
 }  // namespace statsd
diff --git a/cmds/statsd/tests/MetricsManager_test.cpp b/cmds/statsd/tests/MetricsManager_test.cpp
index 1075fe4..a44541d 100644
--- a/cmds/statsd/tests/MetricsManager_test.cpp
+++ b/cmds/statsd/tests/MetricsManager_test.cpp
@@ -528,7 +528,7 @@
             }));
     sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>();
     EXPECT_CALL(*pullerManager, RegisterPullUidProvider(kConfigKey, _)).Times(1);
-    EXPECT_CALL(*pullerManager, UnregisterPullUidProvider(kConfigKey)).Times(1);
+    EXPECT_CALL(*pullerManager, UnregisterPullUidProvider(kConfigKey, _)).Times(1);
 
     sp<AlarmMonitor> anomalyAlarmMonitor;
     sp<AlarmMonitor> periodicAlarmMonitor;
diff --git a/cmds/statsd/tests/StatsLogProcessor_test.cpp b/cmds/statsd/tests/StatsLogProcessor_test.cpp
index d29394b..b809286 100644
--- a/cmds/statsd/tests/StatsLogProcessor_test.cpp
+++ b/cmds/statsd/tests/StatsLogProcessor_test.cpp
@@ -301,6 +301,29 @@
     EXPECT_TRUE(noData);
 }
 
+TEST(StatsLogProcessorTest, TestPullUidProviderSetOnConfigUpdate) {
+    // Setup simple config key corresponding to empty config.
+    sp<UidMap> m = new UidMap();
+    sp<StatsPullerManager> pullerManager = new StatsPullerManager();
+    sp<AlarmMonitor> anomalyAlarmMonitor;
+    sp<AlarmMonitor> subscriberAlarmMonitor;
+    StatsLogProcessor p(
+            m, pullerManager, anomalyAlarmMonitor, subscriberAlarmMonitor, 0,
+            [](const ConfigKey& key) { return true; },
+            [](const int&, const vector<int64_t>&) { return true; });
+    ConfigKey key(3, 4);
+    StatsdConfig config = MakeConfig(false);
+    p.OnConfigUpdated(0, key, config);
+    EXPECT_NE(pullerManager->mPullUidProviders.find(key), pullerManager->mPullUidProviders.end());
+
+    config.add_default_pull_packages("AID_STATSD");
+    p.OnConfigUpdated(5, key, config);
+    EXPECT_NE(pullerManager->mPullUidProviders.find(key), pullerManager->mPullUidProviders.end());
+
+    p.OnConfigRemoved(key);
+    EXPECT_EQ(pullerManager->mPullUidProviders.find(key), pullerManager->mPullUidProviders.end());
+}
+
 TEST(StatsLogProcessorTest, TestActiveConfigMetricDiskWriteRead) {
     int uid = 1111;
 
diff --git a/cmds/statsd/tests/e2e/CountMetric_e2e_test.cpp b/cmds/statsd/tests/e2e/CountMetric_e2e_test.cpp
index a5da9c8..b1461a1 100644
--- a/cmds/statsd/tests/e2e/CountMetric_e2e_test.cpp
+++ b/cmds/statsd/tests/e2e/CountMetric_e2e_test.cpp
@@ -232,7 +232,7 @@
     StateMap map = state.map();
     for (auto group : map.group()) {
         for (auto value : group.value()) {
-            EXPECT_EQ(metricProducer->mStateGroupMap[SCREEN_STATE_ATOM_ID][value],
+            EXPECT_EQ(metricProducer->mStateGroupMap.at(SCREEN_STATE_ATOM_ID).at(value),
                       group.group_id());
         }
     }
@@ -614,7 +614,7 @@
     StateMap map = state1.map();
     for (auto group : map.group()) {
         for (auto value : group.value()) {
-            EXPECT_EQ(metricProducer->mStateGroupMap[SCREEN_STATE_ATOM_ID][value],
+            EXPECT_EQ(metricProducer->mStateGroupMap.at(SCREEN_STATE_ATOM_ID).at(value),
                       group.group_id());
         }
     }
diff --git a/cmds/statsd/tests/e2e/DurationMetric_e2e_test.cpp b/cmds/statsd/tests/e2e/DurationMetric_e2e_test.cpp
index ba09a35..d59ec3e 100644
--- a/cmds/statsd/tests/e2e/DurationMetric_e2e_test.cpp
+++ b/cmds/statsd/tests/e2e/DurationMetric_e2e_test.cpp
@@ -921,18 +921,18 @@
                bucket #1                      bucket #2
     |       1       2       3       4       5     6     7     8  (minutes)
     |---------------------------------------|------------------
-         ON                              OFF    ON             (BatterySaverMode)
+             ON                          OFF    ON             (BatterySaverMode)
                   T            F    T                          (DeviceUnpluggedPredicate)
-             |          |              |                       (ScreenIsOnEvent)
+         |              |              |                       (ScreenIsOnEvent)
                 |           |                       |          (ScreenIsOffEvent)
                                 |                              (ScreenDozeEvent)
     */
     // Initialize log events.
     std::vector<std::unique_ptr<LogEvent>> events;
-    events.push_back(CreateBatterySaverOnEvent(bucketStartTimeNs + 20 * NS_PER_SEC));  // 0:30
     events.push_back(CreateScreenStateChangedEvent(
-            bucketStartTimeNs + 60 * NS_PER_SEC,
-            android::view::DisplayStateEnum::DISPLAY_STATE_ON));  // 1:10
+            bucketStartTimeNs + 20 * NS_PER_SEC,
+            android::view::DisplayStateEnum::DISPLAY_STATE_ON));                       // 0:30
+    events.push_back(CreateBatterySaverOnEvent(bucketStartTimeNs + 60 * NS_PER_SEC));  // 1:10
     events.push_back(CreateScreenStateChangedEvent(
             bucketStartTimeNs + 80 * NS_PER_SEC,
             android::view::DisplayStateEnum::DISPLAY_STATE_OFF));  // 1:30
diff --git a/cmds/statsd/tests/e2e/PartialBucket_e2e_test.cpp b/cmds/statsd/tests/e2e/PartialBucket_e2e_test.cpp
index b173ee0..9117623 100644
--- a/cmds/statsd/tests/e2e/PartialBucket_e2e_test.cpp
+++ b/cmds/statsd/tests/e2e/PartialBucket_e2e_test.cpp
@@ -89,6 +89,7 @@
     valueMetric->set_bucket(FIVE_MINUTES);
     valueMetric->set_min_bucket_size_nanos(minTime);
     valueMetric->set_use_absolute_value_on_reset(true);
+    valueMetric->set_skip_zero_diff_output(false);
     return config;
 }
 
@@ -217,6 +218,35 @@
     EXPECT_EQ(1, report.metrics(0).count_metrics().data(0).bucket_info(0).count());
 }
 
+TEST(PartialBucketE2eTest, TestCountMetricSplitOnBoot) {
+    shared_ptr<StatsService> service = SharedRefBase::make<StatsService>(nullptr, nullptr);
+    SendConfig(service, MakeConfig());
+    int64_t start = getElapsedRealtimeNs();  // This is the start-time the metrics producers are
+                                             // initialized with.
+
+    // Goes into the first bucket
+    service->mProcessor->OnLogEvent(CreateAppCrashEvent(start + NS_PER_SEC, 100).get());
+    int64_t bootCompleteTimeNs = start + 2 * NS_PER_SEC;
+    service->mProcessor->onStatsdInitCompleted(bootCompleteTimeNs);
+    // Goes into the second bucket.
+    service->mProcessor->OnLogEvent(CreateAppCrashEvent(start + 3 * NS_PER_SEC, 100).get());
+
+    ConfigMetricsReport report = GetReports(service->mProcessor, start + 4 * NS_PER_SEC);
+    backfillStartEndTimestamp(&report);
+
+    ASSERT_EQ(1, report.metrics_size());
+    ASSERT_EQ(1, report.metrics(0).count_metrics().data_size());
+    ASSERT_EQ(1, report.metrics(0).count_metrics().data(0).bucket_info_size());
+    EXPECT_TRUE(report.metrics(0)
+                        .count_metrics()
+                        .data(0)
+                        .bucket_info(0)
+                        .has_start_bucket_elapsed_nanos());
+    EXPECT_EQ(MillisToNano(NanoToMillis(bootCompleteTimeNs)),
+              report.metrics(0).count_metrics().data(0).bucket_info(0).end_bucket_elapsed_nanos());
+    EXPECT_EQ(1, report.metrics(0).count_metrics().data(0).bucket_info(0).count());
+}
+
 TEST(PartialBucketE2eTest, TestValueMetricWithoutMinPartialBucket) {
     shared_ptr<StatsService> service = SharedRefBase::make<StatsService>(nullptr, nullptr);
     service->mPullerManager->RegisterPullAtomCallback(
@@ -229,13 +259,22 @@
                                              // initialized with.
 
     service->mProcessor->informPullAlarmFired(5 * 60 * NS_PER_SEC + start);
-    service->mUidMap->updateApp(5 * 60 * NS_PER_SEC + start + 2, String16(kApp1.c_str()), 1, 2,
-                                String16("v2"), String16(""));
+    int64_t appUpgradeTimeNs = 5 * 60 * NS_PER_SEC + start + 2 * NS_PER_SEC;
+    service->mUidMap->updateApp(appUpgradeTimeNs, String16(kApp1.c_str()), 1, 2, String16("v2"),
+                                String16(""));
 
     ConfigMetricsReport report =
-            GetReports(service->mProcessor, 5 * 60 * NS_PER_SEC + start + 100, true);
+            GetReports(service->mProcessor, 5 * 60 * NS_PER_SEC + start + 100 * NS_PER_SEC);
+    backfillStartEndTimestamp(&report);
+
     EXPECT_EQ(1, report.metrics_size());
     EXPECT_EQ(0, report.metrics(0).value_metrics().skipped_size());
+
+    // The fake subsystem state sleep puller returns two atoms.
+    ASSERT_EQ(2, report.metrics(0).value_metrics().data_size());
+    ASSERT_EQ(2, report.metrics(0).value_metrics().data(0).bucket_info_size());
+    EXPECT_EQ(MillisToNano(NanoToMillis(appUpgradeTimeNs)),
+              report.metrics(0).value_metrics().data(0).bucket_info(1).end_bucket_elapsed_nanos());
 }
 
 TEST(PartialBucketE2eTest, TestValueMetricWithMinPartialBucket) {
@@ -249,13 +288,13 @@
     int64_t start = getElapsedRealtimeNs();  // This is the start-time the metrics producers are
                                              // initialized with.
 
-    const int64_t endSkipped = 5 * 60 * NS_PER_SEC + start + 2;
+    const int64_t endSkipped = 5 * 60 * NS_PER_SEC + start + 2 * NS_PER_SEC;
     service->mProcessor->informPullAlarmFired(5 * 60 * NS_PER_SEC + start);
     service->mUidMap->updateApp(endSkipped, String16(kApp1.c_str()), 1, 2, String16("v2"),
                                String16(""));
 
     ConfigMetricsReport report =
-            GetReports(service->mProcessor, 5 * 60 * NS_PER_SEC + start + 100 * NS_PER_SEC, true);
+            GetReports(service->mProcessor, 5 * 60 * NS_PER_SEC + start + 100 * NS_PER_SEC);
     backfillStartEndTimestamp(&report);
 
     ASSERT_EQ(1, report.metrics_size());
@@ -264,10 +303,49 @@
     // Can't test the start time since it will be based on the actual time when the pulling occurs.
     EXPECT_EQ(MillisToNano(NanoToMillis(endSkipped)),
               report.metrics(0).value_metrics().skipped(0).end_bucket_elapsed_nanos());
+
+    ASSERT_EQ(2, report.metrics(0).value_metrics().data_size());
+    EXPECT_EQ(1, report.metrics(0).value_metrics().data(0).bucket_info_size());
+}
+
+TEST(PartialBucketE2eTest, TestValueMetricOnBootWithoutMinPartialBucket) {
+    shared_ptr<StatsService> service = SharedRefBase::make<StatsService>(nullptr, nullptr);
+    // Initial pull will fail since puller is not registered.
+    SendConfig(service, MakeValueMetricConfig(0));
+    int64_t start = getElapsedRealtimeNs();  // This is the start-time the metrics producers are
+                                             // initialized with.
+
+    service->mPullerManager->RegisterPullAtomCallback(
+            /*uid=*/0, util::SUBSYSTEM_SLEEP_STATE, NS_PER_SEC, NS_PER_SEC * 10, {},
+            SharedRefBase::make<FakeSubsystemSleepCallback>());
+
+    int64_t bootCompleteTimeNs = start + NS_PER_SEC;
+    service->mProcessor->onStatsdInitCompleted(bootCompleteTimeNs);
+
+    service->mProcessor->informPullAlarmFired(5 * 60 * NS_PER_SEC + start);
+
+    ConfigMetricsReport report = GetReports(service->mProcessor, 5 * 60 * NS_PER_SEC + start + 100);
+    backfillStartEndTimestamp(&report);
+
+    // First bucket is dropped due to the initial pull failing
+    ASSERT_EQ(1, report.metrics_size());
+    EXPECT_EQ(1, report.metrics(0).value_metrics().skipped_size());
+    EXPECT_EQ(MillisToNano(NanoToMillis(bootCompleteTimeNs)),
+              report.metrics(0).value_metrics().skipped(0).end_bucket_elapsed_nanos());
+
+    // The fake subsystem state sleep puller returns two atoms.
+    ASSERT_EQ(2, report.metrics(0).value_metrics().data_size());
+    ASSERT_EQ(1, report.metrics(0).value_metrics().data(0).bucket_info_size());
+    EXPECT_EQ(
+            MillisToNano(NanoToMillis(bootCompleteTimeNs)),
+            report.metrics(0).value_metrics().data(0).bucket_info(0).start_bucket_elapsed_nanos());
 }
 
 TEST(PartialBucketE2eTest, TestGaugeMetricWithoutMinPartialBucket) {
     shared_ptr<StatsService> service = SharedRefBase::make<StatsService>(nullptr, nullptr);
+    service->mPullerManager->RegisterPullAtomCallback(
+            /*uid=*/0, util::SUBSYSTEM_SLEEP_STATE, NS_PER_SEC, NS_PER_SEC * 10, {},
+            SharedRefBase::make<FakeSubsystemSleepCallback>());
     // Partial buckets don't occur when app is first installed.
     service->mUidMap->updateApp(1, String16(kApp1.c_str()), 1, 1, String16("v1"), String16(""));
     SendConfig(service, MakeGaugeMetricConfig(0));
@@ -278,16 +356,22 @@
     service->mUidMap->updateApp(5 * 60 * NS_PER_SEC + start + 2, String16(kApp1.c_str()), 1, 2,
                                String16("v2"), String16(""));
 
-    ConfigMetricsReport report =
-            GetReports(service->mProcessor, 5 * 60 * NS_PER_SEC + start + 100, true);
-    EXPECT_EQ(1, report.metrics_size());
+    ConfigMetricsReport report = GetReports(service->mProcessor, 5 * 60 * NS_PER_SEC + start + 100);
+    backfillStartEndTimestamp(&report);
+    ASSERT_EQ(1, report.metrics_size());
     EXPECT_EQ(0, report.metrics(0).gauge_metrics().skipped_size());
+    // The fake subsystem state sleep puller returns two atoms.
+    ASSERT_EQ(2, report.metrics(0).gauge_metrics().data_size());
+    EXPECT_EQ(2, report.metrics(0).gauge_metrics().data(0).bucket_info_size());
 }
 
 TEST(PartialBucketE2eTest, TestGaugeMetricWithMinPartialBucket) {
     shared_ptr<StatsService> service = SharedRefBase::make<StatsService>(nullptr, nullptr);
     // Partial buckets don't occur when app is first installed.
     service->mUidMap->updateApp(1, String16(kApp1.c_str()), 1, 1, String16("v1"), String16(""));
+    service->mPullerManager->RegisterPullAtomCallback(
+            /*uid=*/0, util::SUBSYSTEM_SLEEP_STATE, NS_PER_SEC, NS_PER_SEC * 10, {},
+            SharedRefBase::make<FakeSubsystemSleepCallback>());
     SendConfig(service, MakeGaugeMetricConfig(60 * NS_PER_SEC /* One minute */));
     int64_t start = getElapsedRealtimeNs();  // This is the start-time the metrics producers are
                                              // initialized with.
@@ -298,7 +382,7 @@
                                 String16(""));
 
     ConfigMetricsReport report =
-            GetReports(service->mProcessor, 5 * 60 * NS_PER_SEC + start + 100 * NS_PER_SEC, true);
+            GetReports(service->mProcessor, 5 * 60 * NS_PER_SEC + start + 100 * NS_PER_SEC);
     backfillStartEndTimestamp(&report);
     ASSERT_EQ(1, report.metrics_size());
     ASSERT_EQ(1, report.metrics(0).gauge_metrics().skipped_size());
@@ -306,6 +390,38 @@
     EXPECT_TRUE(report.metrics(0).gauge_metrics().skipped(0).has_start_bucket_elapsed_nanos());
     EXPECT_EQ(MillisToNano(NanoToMillis(endSkipped)),
               report.metrics(0).gauge_metrics().skipped(0).end_bucket_elapsed_nanos());
+    ASSERT_EQ(2, report.metrics(0).gauge_metrics().data_size());
+    EXPECT_EQ(1, report.metrics(0).gauge_metrics().data(0).bucket_info_size());
+}
+
+TEST(PartialBucketE2eTest, TestGaugeMetricOnBootWithoutMinPartialBucket) {
+    shared_ptr<StatsService> service = SharedRefBase::make<StatsService>(nullptr, nullptr);
+    // Initial pull will fail since puller hasn't been registered.
+    SendConfig(service, MakeGaugeMetricConfig(0));
+    int64_t start = getElapsedRealtimeNs();  // This is the start-time the metrics producers are
+                                             // initialized with.
+
+    service->mPullerManager->RegisterPullAtomCallback(
+            /*uid=*/0, util::SUBSYSTEM_SLEEP_STATE, NS_PER_SEC, NS_PER_SEC * 10, {},
+            SharedRefBase::make<FakeSubsystemSleepCallback>());
+
+    int64_t bootCompleteTimeNs = start + NS_PER_SEC;
+    service->mProcessor->onStatsdInitCompleted(bootCompleteTimeNs);
+
+    service->mProcessor->informPullAlarmFired(5 * 60 * NS_PER_SEC + start);
+
+    ConfigMetricsReport report = GetReports(service->mProcessor, 5 * 60 * NS_PER_SEC + start + 100);
+    backfillStartEndTimestamp(&report);
+
+    ASSERT_EQ(1, report.metrics_size());
+    EXPECT_EQ(0, report.metrics(0).gauge_metrics().skipped_size());
+    // The fake subsystem state sleep puller returns two atoms.
+    ASSERT_EQ(2, report.metrics(0).gauge_metrics().data_size());
+    // No data in the first bucket, so nothing is reported
+    ASSERT_EQ(1, report.metrics(0).gauge_metrics().data(0).bucket_info_size());
+    EXPECT_EQ(
+            MillisToNano(NanoToMillis(bootCompleteTimeNs)),
+            report.metrics(0).gauge_metrics().data(0).bucket_info(0).start_bucket_elapsed_nanos());
 }
 
 #else
diff --git a/cmds/statsd/tests/guardrail/StatsdStats_test.cpp b/cmds/statsd/tests/guardrail/StatsdStats_test.cpp
index 00e8397..cdde603 100644
--- a/cmds/statsd/tests/guardrail/StatsdStats_test.cpp
+++ b/cmds/statsd/tests/guardrail/StatsdStats_test.cpp
@@ -254,8 +254,8 @@
 TEST(StatsdStatsTest, TestNonPlatformAtomLog) {
     StatsdStats stats;
     time_t now = time(nullptr);
-    int newAtom1 = android::util::kMaxPushedAtomId + 1;
-    int newAtom2 = android::util::kMaxPushedAtomId + 2;
+    int newAtom1 = StatsdStats::kMaxPushedAtomId + 1;
+    int newAtom2 = StatsdStats::kMaxPushedAtomId + 2;
 
     stats.noteAtomLogged(newAtom1, now + 1);
     stats.noteAtomLogged(newAtom1, now + 2);
@@ -486,6 +486,41 @@
     EXPECT_TRUE(uid2Good);
 }
 
+TEST(StatsdStatsTest, TestAtomErrorStats) {
+    StatsdStats stats;
+
+    int pushAtomTag = 100;
+    int pullAtomTag = 1000;
+    int numErrors = 10;
+
+    for (int i = 0; i < numErrors; i++) {
+        // We must call noteAtomLogged as well because only those pushed atoms
+        // that have been logged will have stats printed about them in the
+        // proto.
+        stats.noteAtomLogged(pushAtomTag, /*timeSec=*/0);
+        stats.noteAtomError(pushAtomTag, /*pull=*/false);
+
+        stats.noteAtomError(pullAtomTag, /*pull=*/true);
+    }
+
+    vector<uint8_t> output;
+    stats.dumpStats(&output, false);
+    StatsdStatsReport report;
+    EXPECT_TRUE(report.ParseFromArray(&output[0], output.size()));
+
+    // Check error count = numErrors for push atom
+    EXPECT_EQ(1, report.atom_stats_size());
+    const auto& pushedAtomStats = report.atom_stats(0);
+    EXPECT_EQ(pushAtomTag, pushedAtomStats.tag());
+    EXPECT_EQ(numErrors, pushedAtomStats.error_count());
+
+    // Check error count = numErrors for pull atom
+    EXPECT_EQ(1, report.pulled_atom_stats_size());
+    const auto& pulledAtomStats = report.pulled_atom_stats(0);
+    EXPECT_EQ(pullAtomTag, pulledAtomStats.atom_id());
+    EXPECT_EQ(numErrors, pulledAtomStats.atom_error_count());
+}
+
 }  // namespace statsd
 }  // namespace os
 }  // namespace android
diff --git a/cmds/statsd/tests/metrics/CountMetricProducer_test.cpp b/cmds/statsd/tests/metrics/CountMetricProducer_test.cpp
index 65f8de6..8131725 100644
--- a/cmds/statsd/tests/metrics/CountMetricProducer_test.cpp
+++ b/cmds/statsd/tests/metrics/CountMetricProducer_test.cpp
@@ -38,9 +38,9 @@
 namespace os {
 namespace statsd {
 
-const ConfigKey kConfigKey(0, 12345);
 
 namespace {
+const ConfigKey kConfigKey(0, 12345);
 
 void makeLogEvent(LogEvent* logEvent, int64_t timestampNs, int atomId) {
     AStatsEvent* statsEvent = AStatsEvent_obtain();
@@ -61,6 +61,13 @@
 
 }  // namespace
 
+// Setup for parameterized tests.
+class CountMetricProducerTest_PartialBucket : public TestWithParam<BucketSplitEvent> {};
+
+INSTANTIATE_TEST_SUITE_P(CountMetricProducerTest_PartialBucket,
+                         CountMetricProducerTest_PartialBucket,
+                         testing::Values(APP_UPGRADE, BOOT_COMPLETE));
+
 TEST(CountMetricProducerTest, TestFirstBucket) {
     CountMetric metric;
     metric.set_id(1);
@@ -237,11 +244,11 @@
     EXPECT_EQ(1LL, bucketInfo.mCount);
 }
 
-TEST(CountMetricProducerTest, TestEventWithAppUpgrade) {
+TEST_P(CountMetricProducerTest_PartialBucket, TestSplitInCurrentBucket) {
     sp<AlarmMonitor> alarmMonitor;
     int64_t bucketStartTimeNs = 10000000000;
     int64_t bucketSizeNs = TimeUnitToBucketSizeInMillis(ONE_MINUTE) * 1000000LL;
-    int64_t eventUpgradeTimeNs = bucketStartTimeNs + 15 * NS_PER_SEC;
+    int64_t eventTimeNs = bucketStartTimeNs + 15 * NS_PER_SEC;
 
     int tagId = 1;
     int conditionTagId = 2;
@@ -260,22 +267,30 @@
     sp<AnomalyTracker> anomalyTracker = countProducer.addAnomalyTracker(alert, alarmMonitor);
     EXPECT_TRUE(anomalyTracker != nullptr);
 
-    // Bucket is flushed yet.
+    // Bucket is not flushed yet.
     LogEvent event1(/*uid=*/0, /*pid=*/0);
     makeLogEvent(&event1, bucketStartTimeNs + 1, tagId, /*uid=*/"111");
     countProducer.onMatchedLogEvent(1 /*log matcher index*/, event1);
     EXPECT_EQ(0UL, countProducer.mPastBuckets.size());
     EXPECT_EQ(0, anomalyTracker->getSumOverPastBuckets(DEFAULT_METRIC_DIMENSION_KEY));
 
-    // App upgrade forces bucket flush.
+    // App upgrade or boot complete forces bucket flush.
     // Check that there's a past bucket and the bucket end is not adjusted.
-    countProducer.notifyAppUpgrade(eventUpgradeTimeNs, "ANY.APP", 1, 1);
+    switch (GetParam()) {
+        case APP_UPGRADE:
+            countProducer.notifyAppUpgrade(eventTimeNs);
+            break;
+        case BOOT_COMPLETE:
+            countProducer.onStatsdInitCompleted(eventTimeNs);
+            break;
+    }
     EXPECT_EQ(1UL, countProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY].size());
-    EXPECT_EQ((long long)bucketStartTimeNs,
+    EXPECT_EQ(bucketStartTimeNs,
               countProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY][0].mBucketStartNs);
-    EXPECT_EQ((long long)eventUpgradeTimeNs,
+    EXPECT_EQ(eventTimeNs,
               countProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY][0].mBucketEndNs);
-    EXPECT_EQ(eventUpgradeTimeNs, countProducer.mCurrentBucketStartTimeNs);
+    EXPECT_EQ(0, countProducer.getCurrentBucketNum());
+    EXPECT_EQ(eventTimeNs, countProducer.mCurrentBucketStartTimeNs);
     // Anomaly tracker only contains full buckets.
     EXPECT_EQ(0, anomalyTracker->getSumOverPastBuckets(DEFAULT_METRIC_DIMENSION_KEY));
 
@@ -285,7 +300,8 @@
     makeLogEvent(&event2, bucketStartTimeNs + 59 * NS_PER_SEC + 10, tagId, /*uid=*/"222");
     countProducer.onMatchedLogEvent(1 /*log matcher index*/, event2);
     EXPECT_EQ(1UL, countProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY].size());
-    EXPECT_EQ(eventUpgradeTimeNs, countProducer.mCurrentBucketStartTimeNs);
+    EXPECT_EQ(eventTimeNs, countProducer.mCurrentBucketStartTimeNs);
+    EXPECT_EQ(0, countProducer.getCurrentBucketNum());
     EXPECT_EQ(0, anomalyTracker->getSumOverPastBuckets(DEFAULT_METRIC_DIMENSION_KEY));
 
     // Third event in following bucket.
@@ -294,13 +310,14 @@
     countProducer.onMatchedLogEvent(1 /*log matcher index*/, event3);
     EXPECT_EQ(2UL, countProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY].size());
     EXPECT_EQ(lastEndTimeNs, countProducer.mCurrentBucketStartTimeNs);
+    EXPECT_EQ(1, countProducer.getCurrentBucketNum());
     EXPECT_EQ(2, anomalyTracker->getSumOverPastBuckets(DEFAULT_METRIC_DIMENSION_KEY));
 }
 
-TEST(CountMetricProducerTest, TestEventWithAppUpgradeInNextBucket) {
+TEST_P(CountMetricProducerTest_PartialBucket, TestSplitInNextBucket) {
     int64_t bucketStartTimeNs = 10000000000;
     int64_t bucketSizeNs = TimeUnitToBucketSizeInMillis(ONE_MINUTE) * 1000000LL;
-    int64_t eventUpgradeTimeNs = bucketStartTimeNs + 65 * NS_PER_SEC;
+    int64_t eventTimeNs = bucketStartTimeNs + 65 * NS_PER_SEC;
 
     int tagId = 1;
     int conditionTagId = 2;
@@ -319,15 +336,23 @@
     countProducer.onMatchedLogEvent(1 /*log matcher index*/, event1);
     EXPECT_EQ(0UL, countProducer.mPastBuckets.size());
 
-    // App upgrade forces bucket flush.
-    // Check that there's a past bucket and the bucket end is not adjusted.
-    countProducer.notifyAppUpgrade(eventUpgradeTimeNs, "ANY.APP", 1, 1);
+    // App upgrade or boot complete forces bucket flush.
+    // Check that there's a past bucket and the bucket end is not adjusted since the upgrade
+    // occurred after the bucket end time.
+    switch (GetParam()) {
+        case APP_UPGRADE:
+            countProducer.notifyAppUpgrade(eventTimeNs);
+            break;
+        case BOOT_COMPLETE:
+            countProducer.onStatsdInitCompleted(eventTimeNs);
+            break;
+    }
     EXPECT_EQ(1UL, countProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY].size());
-    EXPECT_EQ((int64_t)bucketStartTimeNs,
+    EXPECT_EQ(bucketStartTimeNs,
               countProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY][0].mBucketStartNs);
     EXPECT_EQ(bucketStartTimeNs + bucketSizeNs,
               countProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY][0].mBucketEndNs);
-    EXPECT_EQ(eventUpgradeTimeNs, countProducer.mCurrentBucketStartTimeNs);
+    EXPECT_EQ(eventTimeNs, countProducer.mCurrentBucketStartTimeNs);
 
     // Next event occurs in same bucket as partial bucket created.
     LogEvent event2(/*uid=*/0, /*pid=*/0);
@@ -340,7 +365,7 @@
     makeLogEvent(&event3, bucketStartTimeNs + 121 * NS_PER_SEC + 10, tagId, /*uid=*/"333");
     countProducer.onMatchedLogEvent(1 /*log matcher index*/, event3);
     EXPECT_EQ(2UL, countProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY].size());
-    EXPECT_EQ((int64_t)eventUpgradeTimeNs,
+    EXPECT_EQ((int64_t)eventTimeNs,
               countProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY][1].mBucketStartNs);
     EXPECT_EQ(bucketStartTimeNs + 2 * bucketSizeNs,
               countProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY][1].mBucketEndNs);
diff --git a/cmds/statsd/tests/metrics/DurationMetricProducer_test.cpp b/cmds/statsd/tests/metrics/DurationMetricProducer_test.cpp
index 30f8159..8ef2519 100644
--- a/cmds/statsd/tests/metrics/DurationMetricProducer_test.cpp
+++ b/cmds/statsd/tests/metrics/DurationMetricProducer_test.cpp
@@ -41,10 +41,10 @@
 namespace os {
 namespace statsd {
 
-const ConfigKey kConfigKey(0, 12345);
 
 namespace {
 
+const ConfigKey kConfigKey(0, 12345);
 void makeLogEvent(LogEvent* logEvent, int64_t timestampNs, int atomId) {
     AStatsEvent* statsEvent = AStatsEvent_obtain();
     AStatsEvent_setAtomId(statsEvent, atomId);
@@ -55,6 +55,13 @@
 
 }  // namespace
 
+// Setup for parameterized tests.
+class DurationMetricProducerTest_PartialBucket : public TestWithParam<BucketSplitEvent> {};
+
+INSTANTIATE_TEST_SUITE_P(DurationMetricProducerTest_PartialBucket,
+                         DurationMetricProducerTest_PartialBucket,
+                         testing::Values(APP_UPGRADE, BOOT_COMPLETE));
+
 TEST(DurationMetricTrackerTest, TestFirstBucket) {
     sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>();
     DurationMetric metric;
@@ -205,7 +212,7 @@
     EXPECT_EQ(1LL, buckets2[0].mDuration);
 }
 
-TEST(DurationMetricTrackerTest, TestSumDurationWithUpgrade) {
+TEST_P(DurationMetricProducerTest_PartialBucket, TestSumDuration) {
     /**
      * The duration starts from the first bucket, through the two partial buckets (10-70sec),
      * another bucket, and ends at the beginning of the next full bucket.
@@ -217,15 +224,7 @@
      */
     int64_t bucketStartTimeNs = 10000000000;
     int64_t bucketSizeNs = TimeUnitToBucketSizeInMillis(ONE_MINUTE) * 1000000LL;
-    int64_t eventUpgradeTimeNs = bucketStartTimeNs + 15 * NS_PER_SEC;
-    int64_t startTimeNs = bucketStartTimeNs + 1 * NS_PER_SEC;
-    int64_t endTimeNs = startTimeNs + 125 * NS_PER_SEC;
-
     int tagId = 1;
-    LogEvent event1(/*uid=*/0, /*pid=*/0);
-    makeLogEvent(&event1, startTimeNs, tagId);
-    LogEvent event2(/*uid=*/0, /*pid=*/0);
-    makeLogEvent(&event2, endTimeNs, tagId);
 
     DurationMetric metric;
     metric.set_id(1);
@@ -238,32 +237,47 @@
                                             3 /* stop_all index */, false /*nesting*/, wizard,
                                             dimensions, bucketStartTimeNs, bucketStartTimeNs);
 
+    int64_t startTimeNs = bucketStartTimeNs + 1 * NS_PER_SEC;
+    LogEvent event1(/*uid=*/0, /*pid=*/0);
+    makeLogEvent(&event1, startTimeNs, tagId);
     durationProducer.onMatchedLogEvent(1 /* start index*/, event1);
     EXPECT_EQ(0UL, durationProducer.mPastBuckets.size());
     EXPECT_EQ(bucketStartTimeNs, durationProducer.mCurrentBucketStartTimeNs);
 
-    durationProducer.notifyAppUpgrade(eventUpgradeTimeNs, "ANY.APP", 1, 1);
+    int64_t partialBucketSplitTimeNs = bucketStartTimeNs + 15 * NS_PER_SEC;
+    switch (GetParam()) {
+        case APP_UPGRADE:
+            durationProducer.notifyAppUpgrade(partialBucketSplitTimeNs);
+            break;
+        case BOOT_COMPLETE:
+            durationProducer.onStatsdInitCompleted(partialBucketSplitTimeNs);
+            break;
+    }
     EXPECT_EQ(1UL, durationProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY].size());
     std::vector<DurationBucket> buckets =
             durationProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY];
     EXPECT_EQ(bucketStartTimeNs, buckets[0].mBucketStartNs);
-    EXPECT_EQ(eventUpgradeTimeNs, buckets[0].mBucketEndNs);
-    EXPECT_EQ(eventUpgradeTimeNs - startTimeNs, buckets[0].mDuration);
-    EXPECT_EQ(eventUpgradeTimeNs, durationProducer.mCurrentBucketStartTimeNs);
+    EXPECT_EQ(partialBucketSplitTimeNs, buckets[0].mBucketEndNs);
+    EXPECT_EQ(partialBucketSplitTimeNs - startTimeNs, buckets[0].mDuration);
+    EXPECT_EQ(partialBucketSplitTimeNs, durationProducer.mCurrentBucketStartTimeNs);
+    EXPECT_EQ(0, durationProducer.getCurrentBucketNum());
 
     // We skip ahead one bucket, so we fill in the first two partial buckets and one full bucket.
+    int64_t endTimeNs = startTimeNs + 125 * NS_PER_SEC;
+    LogEvent event2(/*uid=*/0, /*pid=*/0);
+    makeLogEvent(&event2, endTimeNs, tagId);
     durationProducer.onMatchedLogEvent(2 /* stop index*/, event2);
     buckets = durationProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY];
     EXPECT_EQ(3UL, buckets.size());
-    EXPECT_EQ(eventUpgradeTimeNs, buckets[1].mBucketStartNs);
+    EXPECT_EQ(partialBucketSplitTimeNs, buckets[1].mBucketStartNs);
     EXPECT_EQ(bucketStartTimeNs + bucketSizeNs, buckets[1].mBucketEndNs);
-    EXPECT_EQ(bucketStartTimeNs + bucketSizeNs - eventUpgradeTimeNs, buckets[1].mDuration);
+    EXPECT_EQ(bucketStartTimeNs + bucketSizeNs - partialBucketSplitTimeNs, buckets[1].mDuration);
     EXPECT_EQ(bucketStartTimeNs + bucketSizeNs, buckets[2].mBucketStartNs);
     EXPECT_EQ(bucketStartTimeNs + 2 * bucketSizeNs, buckets[2].mBucketEndNs);
     EXPECT_EQ(bucketSizeNs, buckets[2].mDuration);
 }
 
-TEST(DurationMetricTrackerTest, TestSumDurationWithUpgradeInFollowingBucket) {
+TEST_P(DurationMetricProducerTest_PartialBucket, TestSumDurationWithSplitInFollowingBucket) {
     /**
      * Expected buckets (start at 11s, upgrade at 75s, end at 135s):
      *  - [10,70]: 59 secs
@@ -272,15 +286,7 @@
      */
     int64_t bucketStartTimeNs = 10000000000;
     int64_t bucketSizeNs = TimeUnitToBucketSizeInMillis(ONE_MINUTE) * 1000000LL;
-    int64_t eventUpgradeTimeNs = bucketStartTimeNs + 65 * NS_PER_SEC;
-    int64_t startTimeNs = bucketStartTimeNs + 1 * NS_PER_SEC;
-    int64_t endTimeNs = startTimeNs + 125 * NS_PER_SEC;
-
     int tagId = 1;
-    LogEvent event1(/*uid=*/0, /*pid=*/0);
-    makeLogEvent(&event1, startTimeNs, tagId);
-    LogEvent event2(/*uid=*/0, /*pid=*/0);
-    makeLogEvent(&event2, endTimeNs, tagId);
 
     DurationMetric metric;
     metric.set_id(1);
@@ -293,11 +299,22 @@
                                             3 /* stop_all index */, false /*nesting*/, wizard,
                                             dimensions, bucketStartTimeNs, bucketStartTimeNs);
 
+    int64_t startTimeNs = bucketStartTimeNs + 1 * NS_PER_SEC;
+    LogEvent event1(/*uid=*/0, /*pid=*/0);
+    makeLogEvent(&event1, startTimeNs, tagId);
     durationProducer.onMatchedLogEvent(1 /* start index*/, event1);
     EXPECT_EQ(0UL, durationProducer.mPastBuckets.size());
     EXPECT_EQ(bucketStartTimeNs, durationProducer.mCurrentBucketStartTimeNs);
 
-    durationProducer.notifyAppUpgrade(eventUpgradeTimeNs, "ANY.APP", 1, 1);
+    int64_t partialBucketSplitTimeNs = bucketStartTimeNs + 65 * NS_PER_SEC;
+    switch (GetParam()) {
+        case APP_UPGRADE:
+            durationProducer.notifyAppUpgrade(partialBucketSplitTimeNs);
+            break;
+        case BOOT_COMPLETE:
+            durationProducer.onStatsdInitCompleted(partialBucketSplitTimeNs);
+            break;
+    }
     EXPECT_EQ(2UL, durationProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY].size());
     std::vector<DurationBucket> buckets =
             durationProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY];
@@ -305,32 +322,29 @@
     EXPECT_EQ(bucketStartTimeNs + bucketSizeNs, buckets[0].mBucketEndNs);
     EXPECT_EQ(bucketStartTimeNs + bucketSizeNs - startTimeNs, buckets[0].mDuration);
     EXPECT_EQ(bucketStartTimeNs + bucketSizeNs, buckets[1].mBucketStartNs);
-    EXPECT_EQ(eventUpgradeTimeNs, buckets[1].mBucketEndNs);
-    EXPECT_EQ(eventUpgradeTimeNs - (bucketStartTimeNs + bucketSizeNs), buckets[1].mDuration);
-    EXPECT_EQ(eventUpgradeTimeNs, durationProducer.mCurrentBucketStartTimeNs);
+    EXPECT_EQ(partialBucketSplitTimeNs, buckets[1].mBucketEndNs);
+    EXPECT_EQ(partialBucketSplitTimeNs - (bucketStartTimeNs + bucketSizeNs), buckets[1].mDuration);
+    EXPECT_EQ(partialBucketSplitTimeNs, durationProducer.mCurrentBucketStartTimeNs);
+    EXPECT_EQ(1, durationProducer.getCurrentBucketNum());
 
     // We skip ahead one bucket, so we fill in the first two partial buckets and one full bucket.
+    int64_t endTimeNs = startTimeNs + 125 * NS_PER_SEC;
+    LogEvent event2(/*uid=*/0, /*pid=*/0);
+    makeLogEvent(&event2, endTimeNs, tagId);
     durationProducer.onMatchedLogEvent(2 /* stop index*/, event2);
     buckets = durationProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY];
     EXPECT_EQ(3UL, buckets.size());
-    EXPECT_EQ(eventUpgradeTimeNs, buckets[2].mBucketStartNs);
+    EXPECT_EQ(partialBucketSplitTimeNs, buckets[2].mBucketStartNs);
     EXPECT_EQ(bucketStartTimeNs + 2 * bucketSizeNs, buckets[2].mBucketEndNs);
-    EXPECT_EQ(bucketStartTimeNs + 2 * bucketSizeNs - eventUpgradeTimeNs, buckets[2].mDuration);
+    EXPECT_EQ(bucketStartTimeNs + 2 * bucketSizeNs - partialBucketSplitTimeNs,
+              buckets[2].mDuration);
 }
 
-TEST(DurationMetricTrackerTest, TestSumDurationAnomalyWithUpgrade) {
+TEST_P(DurationMetricProducerTest_PartialBucket, TestSumDurationAnomaly) {
     sp<AlarmMonitor> alarmMonitor;
     int64_t bucketStartTimeNs = 10000000000;
     int64_t bucketSizeNs = TimeUnitToBucketSizeInMillis(ONE_MINUTE) * 1000000LL;
-    int64_t eventUpgradeTimeNs = bucketStartTimeNs + 15 * NS_PER_SEC;
-    int64_t startTimeNs = bucketStartTimeNs + 1;
-    int64_t endTimeNs = startTimeNs + 65 * NS_PER_SEC;
-
     int tagId = 1;
-    LogEvent event1(/*uid=*/0, /*pid=*/0);
-    makeLogEvent(&event1, startTimeNs, tagId);
-    LogEvent event2(/*uid=*/0, /*pid=*/0);
-    makeLogEvent(&event2, endTimeNs, tagId);
 
     // Setup metric with alert.
     DurationMetric metric;
@@ -351,27 +365,35 @@
     sp<AnomalyTracker> anomalyTracker = durationProducer.addAnomalyTracker(alert, alarmMonitor);
     EXPECT_TRUE(anomalyTracker != nullptr);
 
+    int64_t startTimeNs = bucketStartTimeNs + 1;
+    LogEvent event1(/*uid=*/0, /*pid=*/0);
+    makeLogEvent(&event1, startTimeNs, tagId);
     durationProducer.onMatchedLogEvent(1 /* start index*/, event1);
-    durationProducer.notifyAppUpgrade(eventUpgradeTimeNs, "ANY.APP", 1, 1);
+
+    int64_t partialBucketSplitTimeNs = bucketStartTimeNs + 15 * NS_PER_SEC;
+    switch (GetParam()) {
+        case APP_UPGRADE:
+            durationProducer.notifyAppUpgrade(partialBucketSplitTimeNs);
+            break;
+        case BOOT_COMPLETE:
+            durationProducer.onStatsdInitCompleted(partialBucketSplitTimeNs);
+            break;
+    }
 
     // We skip ahead one bucket, so we fill in the first two partial buckets and one full bucket.
+    int64_t endTimeNs = startTimeNs + 65 * NS_PER_SEC;
+    LogEvent event2(/*uid=*/0, /*pid=*/0);
+    makeLogEvent(&event2, endTimeNs, tagId);
     durationProducer.onMatchedLogEvent(2 /* stop index*/, event2);
+
     EXPECT_EQ(bucketStartTimeNs + bucketSizeNs - startTimeNs,
               anomalyTracker->getSumOverPastBuckets(DEFAULT_METRIC_DIMENSION_KEY));
 }
 
-TEST(DurationMetricTrackerTest, TestMaxDurationWithUpgrade) {
+TEST_P(DurationMetricProducerTest_PartialBucket, TestMaxDuration) {
     int64_t bucketStartTimeNs = 10000000000;
     int64_t bucketSizeNs = TimeUnitToBucketSizeInMillis(ONE_MINUTE) * 1000000LL;
-    int64_t eventUpgradeTimeNs = bucketStartTimeNs + 15 * NS_PER_SEC;
-    int64_t startTimeNs = bucketStartTimeNs + 1;
-    int64_t endTimeNs = startTimeNs + 125 * NS_PER_SEC;
-
     int tagId = 1;
-    LogEvent event1(/*uid=*/0, /*pid=*/0);
-    makeLogEvent(&event1, startTimeNs, tagId);
-    LogEvent event2(/*uid=*/0, /*pid=*/0);
-    makeLogEvent(&event2, endTimeNs, tagId);
 
     DurationMetric metric;
     metric.set_id(1);
@@ -385,15 +407,30 @@
                                             3 /* stop_all index */, false /*nesting*/, wizard,
                                             dimensions, bucketStartTimeNs, bucketStartTimeNs);
 
+    int64_t startTimeNs = bucketStartTimeNs + 1;
+    LogEvent event1(/*uid=*/0, /*pid=*/0);
+    makeLogEvent(&event1, startTimeNs, tagId);
     durationProducer.onMatchedLogEvent(1 /* start index*/, event1);
     EXPECT_EQ(0UL, durationProducer.mPastBuckets.size());
     EXPECT_EQ(bucketStartTimeNs, durationProducer.mCurrentBucketStartTimeNs);
 
-    durationProducer.notifyAppUpgrade(eventUpgradeTimeNs, "ANY.APP", 1, 1);
+    int64_t partialBucketSplitTimeNs = bucketStartTimeNs + 15 * NS_PER_SEC;
+    switch (GetParam()) {
+        case APP_UPGRADE:
+            durationProducer.notifyAppUpgrade(partialBucketSplitTimeNs);
+            break;
+        case BOOT_COMPLETE:
+            durationProducer.onStatsdInitCompleted(partialBucketSplitTimeNs);
+            break;
+    }
     EXPECT_EQ(0UL, durationProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY].size());
-    EXPECT_EQ(eventUpgradeTimeNs, durationProducer.mCurrentBucketStartTimeNs);
+    EXPECT_EQ(partialBucketSplitTimeNs, durationProducer.mCurrentBucketStartTimeNs);
+    EXPECT_EQ(0, durationProducer.getCurrentBucketNum());
 
     // We skip ahead one bucket, so we fill in the first two partial buckets and one full bucket.
+    int64_t endTimeNs = startTimeNs + 125 * NS_PER_SEC;
+    LogEvent event2(/*uid=*/0, /*pid=*/0);
+    makeLogEvent(&event2, endTimeNs, tagId);
     durationProducer.onMatchedLogEvent(2 /* stop index*/, event2);
     EXPECT_EQ(0UL, durationProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY].size());
 
@@ -406,18 +443,10 @@
     EXPECT_EQ(endTimeNs - startTimeNs, buckets[0].mDuration);
 }
 
-TEST(DurationMetricTrackerTest, TestMaxDurationWithUpgradeInNextBucket) {
+TEST_P(DurationMetricProducerTest_PartialBucket, TestMaxDurationWithSplitInNextBucket) {
     int64_t bucketStartTimeNs = 10000000000;
     int64_t bucketSizeNs = TimeUnitToBucketSizeInMillis(ONE_MINUTE) * 1000000LL;
-    int64_t eventUpgradeTimeNs = bucketStartTimeNs + 65 * NS_PER_SEC;
-    int64_t startTimeNs = bucketStartTimeNs + 1;
-    int64_t endTimeNs = startTimeNs + 115 * NS_PER_SEC;
-
     int tagId = 1;
-    LogEvent event1(/*uid=*/0, /*pid=*/0);
-    makeLogEvent(&event1, startTimeNs, tagId);
-    LogEvent event2(/*uid=*/0, /*pid=*/0);
-    makeLogEvent(&event2, endTimeNs, tagId);
 
     DurationMetric metric;
     metric.set_id(1);
@@ -431,24 +460,39 @@
                                             3 /* stop_all index */, false /*nesting*/, wizard,
                                             dimensions, bucketStartTimeNs, bucketStartTimeNs);
 
+    int64_t startTimeNs = bucketStartTimeNs + 1;
+    LogEvent event1(/*uid=*/0, /*pid=*/0);
+    makeLogEvent(&event1, startTimeNs, tagId);
     durationProducer.onMatchedLogEvent(1 /* start index*/, event1);
     EXPECT_EQ(0UL, durationProducer.mPastBuckets.size());
     EXPECT_EQ(bucketStartTimeNs, durationProducer.mCurrentBucketStartTimeNs);
 
-    durationProducer.notifyAppUpgrade(eventUpgradeTimeNs, "ANY.APP", 1, 1);
+    int64_t partialBucketSplitTimeNs = bucketStartTimeNs + 65 * NS_PER_SEC;
+    switch (GetParam()) {
+        case APP_UPGRADE:
+            durationProducer.notifyAppUpgrade(partialBucketSplitTimeNs);
+            break;
+        case BOOT_COMPLETE:
+            durationProducer.onStatsdInitCompleted(partialBucketSplitTimeNs);
+            break;
+    }
     EXPECT_EQ(0UL, durationProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY].size());
-    EXPECT_EQ(eventUpgradeTimeNs, durationProducer.mCurrentBucketStartTimeNs);
+    EXPECT_EQ(partialBucketSplitTimeNs, durationProducer.mCurrentBucketStartTimeNs);
+    EXPECT_EQ(1, durationProducer.getCurrentBucketNum());
 
     // Stop occurs in the same partial bucket as created for the app upgrade.
+    int64_t endTimeNs = startTimeNs + 115 * NS_PER_SEC;
+    LogEvent event2(/*uid=*/0, /*pid=*/0);
+    makeLogEvent(&event2, endTimeNs, tagId);
     durationProducer.onMatchedLogEvent(2 /* stop index*/, event2);
     EXPECT_EQ(0UL, durationProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY].size());
-    EXPECT_EQ(eventUpgradeTimeNs, durationProducer.mCurrentBucketStartTimeNs);
+    EXPECT_EQ(partialBucketSplitTimeNs, durationProducer.mCurrentBucketStartTimeNs);
 
     durationProducer.flushIfNeededLocked(bucketStartTimeNs + 2 * bucketSizeNs + 1);
     std::vector<DurationBucket> buckets =
             durationProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY];
     EXPECT_EQ(1UL, buckets.size());
-    EXPECT_EQ(eventUpgradeTimeNs, buckets[0].mBucketStartNs);
+    EXPECT_EQ(partialBucketSplitTimeNs, buckets[0].mBucketStartNs);
     EXPECT_EQ(bucketStartTimeNs + 2 * bucketSizeNs, buckets[0].mBucketEndNs);
     EXPECT_EQ(endTimeNs - startTimeNs, buckets[0].mDuration);
 }
diff --git a/cmds/statsd/tests/metrics/GaugeMetricProducer_test.cpp b/cmds/statsd/tests/metrics/GaugeMetricProducer_test.cpp
index 42d0d5d..9d2ec88 100644
--- a/cmds/statsd/tests/metrics/GaugeMetricProducer_test.cpp
+++ b/cmds/statsd/tests/metrics/GaugeMetricProducer_test.cpp
@@ -42,6 +42,8 @@
 namespace os {
 namespace statsd {
 
+namespace {
+
 const ConfigKey kConfigKey(0, 12345);
 const int tagId = 1;
 const int64_t metricId = 123;
@@ -52,9 +54,8 @@
 const int64_t bucket2StartTimeNs = bucketStartTimeNs + bucketSizeNs;
 const int64_t bucket3StartTimeNs = bucketStartTimeNs + 2 * bucketSizeNs;
 const int64_t bucket4StartTimeNs = bucketStartTimeNs + 3 * bucketSizeNs;
-const int64_t eventUpgradeTimeNs = bucketStartTimeNs + 15 * NS_PER_SEC;
+const int64_t partialBucketSplitTimeNs = bucketStartTimeNs + 15 * NS_PER_SEC;
 
-namespace {
 shared_ptr<LogEvent> makeLogEvent(int32_t atomId, int64_t timestampNs, int32_t value1, string str1,
                                   int32_t value2) {
     AStatsEvent* statsEvent = AStatsEvent_obtain();
@@ -71,6 +72,13 @@
 }
 }  // anonymous namespace
 
+// Setup for parameterized tests.
+class GaugeMetricProducerTest_PartialBucket : public TestWithParam<BucketSplitEvent> {};
+
+INSTANTIATE_TEST_SUITE_P(GaugeMetricProducerTest_PartialBucket,
+                         GaugeMetricProducerTest_PartialBucket,
+                         testing::Values(APP_UPGRADE, BOOT_COMPLETE));
+
 /*
  * Tests that the first bucket works correctly
  */
@@ -194,7 +202,7 @@
     EXPECT_EQ(25L, it->mValue.int_value);
 }
 
-TEST(GaugeMetricProducerTest, TestPushedEventsWithUpgrade) {
+TEST_P(GaugeMetricProducerTest_PartialBucket, TestPushedEvents) {
     sp<AlarmMonitor> alarmMonitor;
     GaugeMetric metric;
     metric.set_id(metricId);
@@ -230,11 +238,22 @@
     gaugeProducer.onMatchedLogEvent(1 /*log matcher index*/, event1);
     EXPECT_EQ(1UL, (*gaugeProducer.mCurrentSlicedBucket).count(DEFAULT_METRIC_DIMENSION_KEY));
 
-    gaugeProducer.notifyAppUpgrade(eventUpgradeTimeNs, "ANY.APP", 1, 1);
+    switch (GetParam()) {
+        case APP_UPGRADE:
+            gaugeProducer.notifyAppUpgrade(partialBucketSplitTimeNs);
+            break;
+        case BOOT_COMPLETE:
+            gaugeProducer.onStatsdInitCompleted(partialBucketSplitTimeNs);
+            break;
+    }
     EXPECT_EQ(0UL, (*gaugeProducer.mCurrentSlicedBucket).count(DEFAULT_METRIC_DIMENSION_KEY));
     EXPECT_EQ(1UL, gaugeProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY].size());
+    EXPECT_EQ(bucketStartTimeNs,
+              gaugeProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY][0].mBucketStartNs);
+    EXPECT_EQ(partialBucketSplitTimeNs,
+              gaugeProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY][0].mBucketEndNs);
     EXPECT_EQ(0L, gaugeProducer.mCurrentBucketNum);
-    EXPECT_EQ(eventUpgradeTimeNs, gaugeProducer.mCurrentBucketStartTimeNs);
+    EXPECT_EQ(partialBucketSplitTimeNs, gaugeProducer.mCurrentBucketStartTimeNs);
     // Partial buckets are not sent to anomaly tracker.
     EXPECT_EQ(0, anomalyTracker->getSumOverPastBuckets(DEFAULT_METRIC_DIMENSION_KEY));
 
@@ -244,7 +263,11 @@
     gaugeProducer.onMatchedLogEvent(1 /*log matcher index*/, event2);
     EXPECT_EQ(0L, gaugeProducer.mCurrentBucketNum);
     EXPECT_EQ(1UL, gaugeProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY].size());
-    EXPECT_EQ((int64_t)eventUpgradeTimeNs, gaugeProducer.mCurrentBucketStartTimeNs);
+    EXPECT_EQ(bucketStartTimeNs,
+              gaugeProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY][0].mBucketStartNs);
+    EXPECT_EQ(partialBucketSplitTimeNs,
+              gaugeProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY][0].mBucketEndNs);
+    EXPECT_EQ((int64_t)partialBucketSplitTimeNs, gaugeProducer.mCurrentBucketStartTimeNs);
     // Partial buckets are not sent to anomaly tracker.
     EXPECT_EQ(0, anomalyTracker->getSumOverPastBuckets(DEFAULT_METRIC_DIMENSION_KEY));
 
@@ -267,7 +290,7 @@
     EXPECT_EQ(2, anomalyTracker->getSumOverPastBuckets(DEFAULT_METRIC_DIMENSION_KEY));
 }
 
-TEST(GaugeMetricProducerTest, TestPulledWithUpgrade) {
+TEST_P(GaugeMetricProducerTest_PartialBucket, TestPulled) {
     GaugeMetric metric;
     metric.set_id(metricId);
     metric.set_bucket(ONE_MINUTE);
@@ -293,7 +316,8 @@
             .WillOnce(Invoke(
                     [](int tagId, const ConfigKey&, vector<std::shared_ptr<LogEvent>>* data, bool) {
                         data->clear();
-                        data->push_back(CreateRepeatedValueLogEvent(tagId, eventUpgradeTimeNs, 2));
+                        data->push_back(
+                                CreateRepeatedValueLogEvent(tagId, partialBucketSplitTimeNs, 2));
                         return true;
                     }));
 
@@ -311,10 +335,21 @@
                          .mFields->begin()
                          ->mValue.int_value);
 
-    gaugeProducer.notifyAppUpgrade(eventUpgradeTimeNs, "ANY.APP", 1, 1);
+    switch (GetParam()) {
+        case APP_UPGRADE:
+            gaugeProducer.notifyAppUpgrade(partialBucketSplitTimeNs);
+            break;
+        case BOOT_COMPLETE:
+            gaugeProducer.onStatsdInitCompleted(partialBucketSplitTimeNs);
+            break;
+    }
     EXPECT_EQ(1UL, gaugeProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY].size());
+    EXPECT_EQ(bucketStartTimeNs,
+              gaugeProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY][0].mBucketStartNs);
+    EXPECT_EQ(partialBucketSplitTimeNs,
+              gaugeProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY][0].mBucketEndNs);
     EXPECT_EQ(0L, gaugeProducer.mCurrentBucketNum);
-    EXPECT_EQ((int64_t)eventUpgradeTimeNs, gaugeProducer.mCurrentBucketStartTimeNs);
+    EXPECT_EQ(partialBucketSplitTimeNs, gaugeProducer.mCurrentBucketStartTimeNs);
     EXPECT_EQ(1UL, gaugeProducer.mCurrentSlicedBucket->size());
     EXPECT_EQ(2, gaugeProducer.mCurrentSlicedBucket->begin()
                          ->second.front()
@@ -370,7 +405,7 @@
                          .mFields->begin()
                          ->mValue.int_value);
 
-    gaugeProducer.notifyAppUpgrade(eventUpgradeTimeNs, "ANY.APP", 1, 1);
+    gaugeProducer.notifyAppUpgrade(partialBucketSplitTimeNs);
     EXPECT_EQ(0UL, gaugeProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY].size());
     EXPECT_EQ(0L, gaugeProducer.mCurrentBucketNum);
     EXPECT_EQ(bucketStartTimeNs, gaugeProducer.mCurrentBucketStartTimeNs);
diff --git a/cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp b/cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp
index 3b4d646..f493cc4 100644
--- a/cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp
+++ b/cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp
@@ -41,6 +41,8 @@
 namespace os {
 namespace statsd {
 
+namespace {
+
 const ConfigKey kConfigKey(0, 12345);
 const int tagId = 1;
 const int64_t metricId = 123;
@@ -58,10 +60,18 @@
 static void assertPastBucketValuesSingleKey(
         const std::unordered_map<MetricDimensionKey, std::vector<ValueBucket>>& mPastBuckets,
         const std::initializer_list<int>& expectedValuesList,
-        const std::initializer_list<int64_t>& expectedDurationNsList) {
-    std::vector<int> expectedValues(expectedValuesList);
-    std::vector<int64_t> expectedDurationNs(expectedDurationNsList);
+        const std::initializer_list<int64_t>& expectedDurationNsList,
+        const std::initializer_list<int64_t>& expectedStartTimeNsList,
+        const std::initializer_list<int64_t>& expectedEndTimeNsList) {
+    vector<int> expectedValues(expectedValuesList);
+    vector<int64_t> expectedDurationNs(expectedDurationNsList);
+    vector<int64_t> expectedStartTimeNs(expectedStartTimeNsList);
+    vector<int64_t> expectedEndTimeNs(expectedEndTimeNsList);
+
     ASSERT_EQ(expectedValues.size(), expectedDurationNs.size());
+    ASSERT_EQ(expectedValues.size(), expectedStartTimeNs.size());
+    ASSERT_EQ(expectedValues.size(), expectedEndTimeNs.size());
+
     if (expectedValues.size() == 0) {
         ASSERT_EQ(0, mPastBuckets.size());
         return;
@@ -70,15 +80,21 @@
     ASSERT_EQ(1, mPastBuckets.size());
     ASSERT_EQ(expectedValues.size(), mPastBuckets.begin()->second.size());
 
-    auto buckets = mPastBuckets.begin()->second;
+    const vector<ValueBucket>& buckets = mPastBuckets.begin()->second;
     for (int i = 0; i < expectedValues.size(); i++) {
         EXPECT_EQ(expectedValues[i], buckets[i].values[0].long_value)
                 << "Values differ at index " << i;
         EXPECT_EQ(expectedDurationNs[i], buckets[i].mConditionTrueNs)
                 << "Condition duration value differ at index " << i;
+        EXPECT_EQ(expectedStartTimeNs[i], buckets[i].mBucketStartNs)
+                << "Start time differs at index " << i;
+        EXPECT_EQ(expectedEndTimeNs[i], buckets[i].mBucketEndNs)
+                << "End time differs at index " << i;
     }
 }
 
+}  // anonymous namespace
+
 class ValueMetricProducerTestHelper {
 public:
     static sp<ValueMetricProducer> createValueProducerNoConditions(
@@ -191,6 +207,13 @@
     }
 };
 
+// Setup for parameterized tests.
+class ValueMetricProducerTest_PartialBucket : public TestWithParam<BucketSplitEvent> {};
+
+INSTANTIATE_TEST_SUITE_P(ValueMetricProducerTest_PartialBucket,
+                         ValueMetricProducerTest_PartialBucket,
+                         testing::Values(APP_UPGRADE, BOOT_COMPLETE));
+
 /*
  * Tests that the first bucket works correctly
  */
@@ -325,9 +348,10 @@
     EXPECT_EQ(bucketSizeNs, valueProducer->mPastBuckets.begin()->second[2].mConditionTrueNs);
 }
 
-TEST(ValueMetricProducerTest, TestPartialBucketCreated) {
+TEST_P(ValueMetricProducerTest_PartialBucket, TestPartialBucketCreated) {
     ValueMetric metric = ValueMetricProducerTestHelper::createMetric();
     sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>();
+    int64_t partialBucketSplitTimeNs = bucket2StartTimeNs + 2;
     EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _))
             // Initialize bucket.
             .WillOnce(Invoke([](int tagId, const ConfigKey&,
@@ -337,10 +361,12 @@
                 return true;
             }))
             // Partial bucket.
-            .WillOnce(Invoke([](int tagId, const ConfigKey&,
-                                vector<std::shared_ptr<LogEvent>>* data, bool) {
+            .WillOnce(Invoke([partialBucketSplitTimeNs](int tagId, const ConfigKey&,
+                                                        vector<std::shared_ptr<LogEvent>>* data,
+                                                        bool) {
                 data->clear();
-                data->push_back(CreateRepeatedValueLogEvent(tagId, bucket2StartTimeNs + 10, 5));
+                data->push_back(
+                        CreateRepeatedValueLogEvent(tagId, partialBucketSplitTimeNs + 8, 5));
                 return true;
             }));
 
@@ -354,19 +380,21 @@
     valueProducer->onDataPulled(allData, /** success */ true, bucket2StartTimeNs);
 
     // Partial buckets created in 2nd bucket.
-    valueProducer->notifyAppUpgrade(bucket2StartTimeNs + 2, "com.foo", 10000, 1);
+    switch (GetParam()) {
+        case APP_UPGRADE:
+            valueProducer->notifyAppUpgrade(partialBucketSplitTimeNs);
+            break;
+        case BOOT_COMPLETE:
+            valueProducer->onStatsdInitCompleted(partialBucketSplitTimeNs);
+            break;
+    }
+    EXPECT_EQ(partialBucketSplitTimeNs, valueProducer->mCurrentBucketStartTimeNs);
+    EXPECT_EQ(1, valueProducer->getCurrentBucketNum());
 
-    // One full bucket and one partial bucket.
-    EXPECT_EQ(1UL, valueProducer->mPastBuckets.size());
-    vector<ValueBucket> buckets = valueProducer->mPastBuckets.begin()->second;
-    EXPECT_EQ(2UL, buckets.size());
-    // Full bucket (2 - 1)
-    EXPECT_EQ(1, buckets[0].values[0].long_value);
-    EXPECT_EQ(bucketSizeNs, buckets[0].mConditionTrueNs);
-    // Full bucket (5 - 3)
-    EXPECT_EQ(3, buckets[1].values[0].long_value);
-    // partial bucket [bucket2StartTimeNs, bucket2StartTimeNs + 2]
-    EXPECT_EQ(2, buckets[1].mConditionTrueNs);
+    assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {1, 3},
+                                    {bucketSizeNs, partialBucketSplitTimeNs - bucket2StartTimeNs},
+                                    {bucketStartTimeNs, bucket2StartTimeNs},
+                                    {bucket2StartTimeNs, partialBucketSplitTimeNs});
 }
 
 /*
@@ -613,7 +641,8 @@
     allData.clear();
     allData.push_back(CreateRepeatedValueLogEvent(tagId, bucket2StartTimeNs + 1, 110));
     valueProducer->onDataPulled(allData, /** succeed */ true, bucket2StartTimeNs);
-    assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {10}, {bucketSizeNs - 8});
+    assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {10}, {bucketSizeNs - 8},
+                                    {bucketStartTimeNs}, {bucket2StartTimeNs});
 
     // has one slice
     EXPECT_EQ(1UL, valueProducer->mCurrentSlicedBucket.size());
@@ -625,7 +654,8 @@
     EXPECT_EQ(10, curInterval.value.long_value);
 
     valueProducer->onConditionChanged(false, bucket2StartTimeNs + 1);
-    assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {10}, {bucketSizeNs - 8});
+    assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {10}, {bucketSizeNs - 8},
+                                    {bucketStartTimeNs}, {bucket2StartTimeNs});
 
     // has one slice
     EXPECT_EQ(1UL, valueProducer->mCurrentSlicedBucket.size());
@@ -636,10 +666,12 @@
     EXPECT_EQ(false, curBaseInfo.hasBase);
 
     valueProducer->onConditionChanged(true, bucket3StartTimeNs + 1);
-    assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {10, 20}, {bucketSizeNs - 8, 1});
+    assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {10, 20}, {bucketSizeNs - 8, 1},
+                                    {bucketStartTimeNs, bucket2StartTimeNs},
+                                    {bucket2StartTimeNs, bucket3StartTimeNs});
 }
 
-TEST(ValueMetricProducerTest, TestPushedEventsWithUpgrade) {
+TEST_P(ValueMetricProducerTest_PartialBucket, TestPushedEvents) {
     ValueMetric metric = ValueMetricProducerTestHelper::createMetric();
 
     UidMap uidMap;
@@ -660,25 +692,46 @@
     valueProducer.onMatchedLogEvent(1 /*log matcher index*/, event1);
     EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size());
 
-    valueProducer.notifyAppUpgrade(bucketStartTimeNs + 150, "ANY.APP", 1, 1);
-    EXPECT_EQ(1UL, valueProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY].size());
-    EXPECT_EQ(bucketStartTimeNs + 150, valueProducer.mCurrentBucketStartTimeNs);
+    int64_t partialBucketSplitTimeNs = bucketStartTimeNs + 150;
+    switch (GetParam()) {
+        case APP_UPGRADE:
+            valueProducer.notifyAppUpgrade(partialBucketSplitTimeNs);
+            break;
+        case BOOT_COMPLETE:
+            valueProducer.onStatsdInitCompleted(partialBucketSplitTimeNs);
+            break;
+    }
+    assertPastBucketValuesSingleKey(valueProducer.mPastBuckets, {10},
+                                    {partialBucketSplitTimeNs - bucketStartTimeNs},
+                                    {bucketStartTimeNs}, {partialBucketSplitTimeNs});
+    EXPECT_EQ(partialBucketSplitTimeNs, valueProducer.mCurrentBucketStartTimeNs);
+    EXPECT_EQ(0, valueProducer.getCurrentBucketNum());
 
+    // Event arrives after the bucket split.
     LogEvent event2(/*uid=*/0, /*pid=*/0);
-    CreateRepeatedValueLogEvent(&event2, tagId, bucketStartTimeNs + 59 * NS_PER_SEC, 10);
+    CreateRepeatedValueLogEvent(&event2, tagId, bucketStartTimeNs + 59 * NS_PER_SEC, 20);
     valueProducer.onMatchedLogEvent(1 /*log matcher index*/, event2);
-    EXPECT_EQ(1UL, valueProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY].size());
-    EXPECT_EQ(bucketStartTimeNs + 150, valueProducer.mCurrentBucketStartTimeNs);
+
+    assertPastBucketValuesSingleKey(valueProducer.mPastBuckets, {10},
+                                    {partialBucketSplitTimeNs - bucketStartTimeNs},
+                                    {bucketStartTimeNs}, {partialBucketSplitTimeNs});
+    EXPECT_EQ(partialBucketSplitTimeNs, valueProducer.mCurrentBucketStartTimeNs);
+    EXPECT_EQ(0, valueProducer.getCurrentBucketNum());
 
     // Next value should create a new bucket.
     LogEvent event3(/*uid=*/0, /*pid=*/0);
-    CreateRepeatedValueLogEvent(&event3, tagId, bucketStartTimeNs + 65 * NS_PER_SEC, 10);
+    CreateRepeatedValueLogEvent(&event3, tagId, bucket2StartTimeNs + 5 * NS_PER_SEC, 10);
     valueProducer.onMatchedLogEvent(1 /*log matcher index*/, event3);
-    EXPECT_EQ(2UL, valueProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY].size());
+    assertPastBucketValuesSingleKey(valueProducer.mPastBuckets, {10, 20},
+                                    {partialBucketSplitTimeNs - bucketStartTimeNs,
+                                     bucket2StartTimeNs - partialBucketSplitTimeNs},
+                                    {bucketStartTimeNs, partialBucketSplitTimeNs},
+                                    {partialBucketSplitTimeNs, bucket2StartTimeNs});
     EXPECT_EQ(bucketStartTimeNs + bucketSizeNs, valueProducer.mCurrentBucketStartTimeNs);
+    EXPECT_EQ(1, valueProducer.getCurrentBucketNum());
 }
 
-TEST(ValueMetricProducerTest, TestPulledValueWithUpgrade) {
+TEST_P(ValueMetricProducerTest_PartialBucket, TestPulledValue) {
     ValueMetric metric = ValueMetricProducerTestHelper::createMetric();
 
     UidMap uidMap;
@@ -689,14 +742,16 @@
                     atomMatcherId, logEventMatcherIndex, atomMatcher, uidMap)});
     sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>();
     sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>();
+    int64_t partialBucketSplitTimeNs = bucket2StartTimeNs + 150;
     EXPECT_CALL(*pullerManager, RegisterReceiver(tagId, kConfigKey, _, _, _)).WillOnce(Return());
     EXPECT_CALL(*pullerManager, UnRegisterReceiver(tagId, kConfigKey, _)).WillOnce(Return());
     EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _))
             .WillOnce(Return(true))
-            .WillOnce(Invoke([](int tagId, const ConfigKey&,
-                                vector<std::shared_ptr<LogEvent>>* data, bool) {
+            .WillOnce(Invoke([partialBucketSplitTimeNs](int tagId, const ConfigKey&,
+                                                        vector<std::shared_ptr<LogEvent>>* data,
+                                                        bool) {
                 data->clear();
-                data->push_back(CreateRepeatedValueLogEvent(tagId, bucket2StartTimeNs + 149, 120));
+                data->push_back(CreateRepeatedValueLogEvent(tagId, partialBucketSplitTimeNs, 120));
                 return true;
             }));
     ValueMetricProducer valueProducer(kConfigKey, metric, -1, wizard, logEventMatcherIndex,
@@ -711,20 +766,27 @@
     valueProducer.onDataPulled(allData, /** succeed */ true, bucket2StartTimeNs);
     EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size());
 
-    valueProducer.notifyAppUpgrade(bucket2StartTimeNs + 150, "ANY.APP", 1, 1);
-    EXPECT_EQ(1UL, valueProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY].size());
-    EXPECT_EQ(bucket2StartTimeNs + 150, valueProducer.mCurrentBucketStartTimeNs);
-    assertPastBucketValuesSingleKey(valueProducer.mPastBuckets, {20}, {150});
+    switch (GetParam()) {
+        case APP_UPGRADE:
+            valueProducer.notifyAppUpgrade(partialBucketSplitTimeNs);
+            break;
+        case BOOT_COMPLETE:
+            valueProducer.onStatsdInitCompleted(partialBucketSplitTimeNs);
+            break;
+    }
+    EXPECT_EQ(partialBucketSplitTimeNs, valueProducer.mCurrentBucketStartTimeNs);
+    EXPECT_EQ(1, valueProducer.getCurrentBucketNum());
+    assertPastBucketValuesSingleKey(valueProducer.mPastBuckets, {20}, {150}, {bucket2StartTimeNs},
+                                    {partialBucketSplitTimeNs});
 
     allData.clear();
     allData.push_back(CreateRepeatedValueLogEvent(tagId, bucket3StartTimeNs + 1, 150));
     valueProducer.onDataPulled(allData, /** succeed */ true, bucket3StartTimeNs);
-    EXPECT_EQ(2UL, valueProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY].size());
     EXPECT_EQ(bucket3StartTimeNs, valueProducer.mCurrentBucketStartTimeNs);
-    EXPECT_EQ(20L,
-              valueProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY][0].values[0].long_value);
-    assertPastBucketValuesSingleKey(valueProducer.mPastBuckets, {20, 30},
-                                    {150, bucketSizeNs - 150});
+    EXPECT_EQ(2, valueProducer.getCurrentBucketNum());
+    assertPastBucketValuesSingleKey(valueProducer.mPastBuckets, {20, 30}, {150, bucketSizeNs - 150},
+                                    {bucket2StartTimeNs, partialBucketSplitTimeNs},
+                                    {partialBucketSplitTimeNs, bucket3StartTimeNs});
 }
 
 TEST(ValueMetricProducerTest, TestPulledWithAppUpgradeDisabled) {
@@ -754,12 +816,12 @@
     valueProducer.onDataPulled(allData, /** succeed */ true, bucket2StartTimeNs);
     EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size());
 
-    valueProducer.notifyAppUpgrade(bucket2StartTimeNs + 150, "ANY.APP", 1, 1);
+    valueProducer.notifyAppUpgrade(bucket2StartTimeNs + 150);
     EXPECT_EQ(0UL, valueProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY].size());
     EXPECT_EQ(bucket2StartTimeNs, valueProducer.mCurrentBucketStartTimeNs);
 }
 
-TEST(ValueMetricProducerTest, TestPulledValueWithUpgradeWhileConditionFalse) {
+TEST_P(ValueMetricProducerTest_PartialBucket, TestPulledValueWhileConditionFalse) {
     ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition();
 
     sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>();
@@ -784,14 +846,21 @@
     valueProducer->onConditionChanged(false, bucket2StartTimeNs - 100);
     EXPECT_FALSE(valueProducer->mCondition);
 
-    valueProducer->notifyAppUpgrade(bucket2StartTimeNs - 50, "ANY.APP", 1, 1);
+    int64_t partialBucketSplitTimeNs = bucket2StartTimeNs - 50;
+    switch (GetParam()) {
+        case APP_UPGRADE:
+            valueProducer->notifyAppUpgrade(partialBucketSplitTimeNs);
+            break;
+        case BOOT_COMPLETE:
+            valueProducer->onStatsdInitCompleted(partialBucketSplitTimeNs);
+            break;
+    }
     // Expect one full buckets already done and starting a partial bucket.
-    EXPECT_EQ(bucket2StartTimeNs - 50, valueProducer->mCurrentBucketStartTimeNs);
-    EXPECT_EQ(1UL, valueProducer->mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY].size());
-    EXPECT_EQ(bucketStartTimeNs,
-              valueProducer->mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY][0].mBucketStartNs);
+    EXPECT_EQ(partialBucketSplitTimeNs, valueProducer->mCurrentBucketStartTimeNs);
+    EXPECT_EQ(0, valueProducer->getCurrentBucketNum());
     assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {20},
-                                    {(bucket2StartTimeNs - 100) - (bucketStartTimeNs + 1)});
+                                    {(bucket2StartTimeNs - 100) - (bucketStartTimeNs + 1)},
+                                    {bucketStartTimeNs}, {partialBucketSplitTimeNs});
     EXPECT_FALSE(valueProducer->mCondition);
 }
 TEST(ValueMetricProducerTest, TestPushedEventsWithoutCondition) {
@@ -834,7 +903,8 @@
     EXPECT_EQ(30, curInterval.value.long_value);
 
     valueProducer.flushIfNeededLocked(bucket2StartTimeNs);
-    assertPastBucketValuesSingleKey(valueProducer.mPastBuckets, {30}, {bucketSizeNs});
+    assertPastBucketValuesSingleKey(valueProducer.mPastBuckets, {30}, {bucketSizeNs},
+                                    {bucketStartTimeNs}, {bucket2StartTimeNs});
 }
 
 TEST(ValueMetricProducerTest, TestPushedEventsWithCondition) {
@@ -895,7 +965,8 @@
     EXPECT_EQ(50, curInterval.value.long_value);
 
     valueProducer.flushIfNeededLocked(bucket2StartTimeNs);
-    assertPastBucketValuesSingleKey(valueProducer.mPastBuckets, {50}, {20});
+    assertPastBucketValuesSingleKey(valueProducer.mPastBuckets, {50}, {20}, {bucketStartTimeNs},
+                                    {bucket2StartTimeNs});
 }
 
 TEST(ValueMetricProducerTest, TestAnomalyDetection) {
@@ -1012,7 +1083,8 @@
     EXPECT_EQ(true, curBaseInfo.hasBase);
     EXPECT_EQ(23, curBaseInfo.base.long_value);
     EXPECT_EQ(false, curInterval.hasValue);
-    assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {12}, {bucketSizeNs});
+    assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {12}, {bucketSizeNs},
+                                    {bucket2StartTimeNs}, {bucket3StartTimeNs});
 
     // pull 3 come late.
     // The previous bucket gets closed with error. (Has start value 23, no ending)
@@ -1028,7 +1100,15 @@
     EXPECT_EQ(true, curBaseInfo.hasBase);
     EXPECT_EQ(36, curBaseInfo.base.long_value);
     EXPECT_EQ(false, curInterval.hasValue);
-    assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {12}, {bucketSizeNs});
+    assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {12}, {bucketSizeNs},
+                                    {bucket2StartTimeNs}, {bucket3StartTimeNs});
+    // The 3rd bucket is dropped due to multiple buckets being skipped.
+    ASSERT_EQ(1, valueProducer->mSkippedBuckets.size());
+    EXPECT_EQ(bucket3StartTimeNs, valueProducer->mSkippedBuckets[0].bucketStartTimeNs);
+    EXPECT_EQ(bucket4StartTimeNs, valueProducer->mSkippedBuckets[0].bucketEndTimeNs);
+    ASSERT_EQ(1, valueProducer->mSkippedBuckets[0].dropEvents.size());
+    EXPECT_EQ(MULTIPLE_BUCKETS_SKIPPED, valueProducer->mSkippedBuckets[0].dropEvents[0].reason);
+    EXPECT_EQ(bucket6StartTimeNs, valueProducer->mSkippedBuckets[0].dropEvents[0].dropTimeNs);
 }
 
 /*
@@ -1073,7 +1153,8 @@
     valueProducer->onConditionChanged(false, bucket2StartTimeNs + 1);
     curInterval = valueProducer->mCurrentSlicedBucket.begin()->second[0];
     curBaseInfo = valueProducer->mCurrentBaseInfo.begin()->second[0];
-    assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {20}, {bucketSizeNs - 8});
+    assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {20}, {bucketSizeNs - 8},
+                                    {bucketStartTimeNs}, {bucket2StartTimeNs});
     EXPECT_EQ(false, curBaseInfo.hasBase);
 
     // Now the alarm is delivered.
@@ -1082,7 +1163,8 @@
     allData.push_back(CreateRepeatedValueLogEvent(tagId, bucket2StartTimeNs + 30, 110));
     valueProducer->onDataPulled(allData, /** succeed */ true, bucket2StartTimeNs);
 
-    assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {20}, {bucketSizeNs - 8});
+    assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {20}, {bucketSizeNs - 8},
+                                    {bucketStartTimeNs}, {bucket2StartTimeNs});
     curInterval = valueProducer->mCurrentSlicedBucket.begin()->second[0];
     curBaseInfo = valueProducer->mCurrentBaseInfo.begin()->second[0];
     EXPECT_EQ(false, curBaseInfo.hasBase);
@@ -1090,10 +1172,9 @@
 }
 
 /*
-* Test pulled event with non sliced condition. The pull on boundary come late, after the
-condition
-* change to false, and then true again. This is due to alarm delivered late.
-*/
+ * Test pulled event with non sliced condition. The pull on boundary come late, after the condition
+ * change to false, and then true again. This is due to alarm delivered late.
+ */
 TEST(ValueMetricProducerTest, TestBucketBoundaryWithCondition2) {
     ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition();
 
@@ -1139,7 +1220,8 @@
 
     // pull on bucket boundary come late, condition change happens before it
     valueProducer->onConditionChanged(false, bucket2StartTimeNs + 1);
-    assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {20}, {bucketSizeNs - 8});
+    assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {20}, {bucketSizeNs - 8},
+                                    {bucketStartTimeNs}, {bucket2StartTimeNs});
     EXPECT_EQ(1UL, valueProducer->mCurrentSlicedBucket.size());
     curInterval = valueProducer->mCurrentSlicedBucket.begin()->second[0];
     curBaseInfo = valueProducer->mCurrentBaseInfo.begin()->second[0];
@@ -1148,7 +1230,8 @@
 
     // condition changed to true again, before the pull alarm is delivered
     valueProducer->onConditionChanged(true, bucket2StartTimeNs + 25);
-    assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {20}, {bucketSizeNs - 8});
+    assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {20}, {bucketSizeNs - 8},
+                                    {bucketStartTimeNs}, {bucket2StartTimeNs});
     curInterval = valueProducer->mCurrentSlicedBucket.begin()->second[0];
     curBaseInfo = valueProducer->mCurrentBaseInfo.begin()->second[0];
     EXPECT_EQ(true, curBaseInfo.hasBase);
@@ -1167,13 +1250,15 @@
     EXPECT_EQ(140, curBaseInfo.base.long_value);
     EXPECT_EQ(true, curInterval.hasValue);
     EXPECT_EQ(10, curInterval.value.long_value);
-    assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {20}, {bucketSizeNs - 8});
+    assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {20}, {bucketSizeNs - 8},
+                                    {bucketStartTimeNs}, {bucket2StartTimeNs});
 
     allData.clear();
     allData.push_back(CreateRepeatedValueLogEvent(tagId, bucket3StartTimeNs, 160));
     valueProducer->onDataPulled(allData, /** succeed */ true, bucket3StartTimeNs);
-    assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {20, 30},
-                                    {bucketSizeNs - 8, bucketSizeNs - 24});
+    assertPastBucketValuesSingleKey(
+            valueProducer->mPastBuckets, {20, 30}, {bucketSizeNs - 8, bucketSizeNs - 24},
+            {bucketStartTimeNs, bucket2StartTimeNs}, {bucket2StartTimeNs, bucket3StartTimeNs});
 }
 
 TEST(ValueMetricProducerTest, TestPushedAggregateMin) {
@@ -1216,7 +1301,8 @@
     EXPECT_EQ(10, curInterval.value.long_value);
 
     valueProducer.flushIfNeededLocked(bucket2StartTimeNs);
-    assertPastBucketValuesSingleKey(valueProducer.mPastBuckets, {10}, {bucketSizeNs});
+    assertPastBucketValuesSingleKey(valueProducer.mPastBuckets, {10}, {bucketSizeNs},
+                                    {bucketStartTimeNs}, {bucket2StartTimeNs});
 }
 
 TEST(ValueMetricProducerTest, TestPushedAggregateMax) {
@@ -1239,9 +1325,6 @@
 
     LogEvent event1(/*uid=*/0, /*pid=*/0);
     CreateRepeatedValueLogEvent(&event1, tagId, bucketStartTimeNs + 10, 10);
-
-    LogEvent event2(/*uid=*/0, /*pid=*/0);
-    CreateRepeatedValueLogEvent(&event2, tagId, bucketStartTimeNs + 20, 20);
     valueProducer.onMatchedLogEvent(1 /*log matcher index*/, event1);
 
     // has one slice
@@ -1251,6 +1334,8 @@
     EXPECT_EQ(10, curInterval.value.long_value);
     EXPECT_EQ(true, curInterval.hasValue);
 
+    LogEvent event2(/*uid=*/0, /*pid=*/0);
+    CreateRepeatedValueLogEvent(&event2, tagId, bucketStartTimeNs + 20, 20);
     valueProducer.onMatchedLogEvent(1 /*log matcher index*/, event2);
 
     // has one slice
@@ -1258,10 +1343,9 @@
     curInterval = valueProducer.mCurrentSlicedBucket.begin()->second[0];
     EXPECT_EQ(20, curInterval.value.long_value);
 
-    valueProducer.flushIfNeededLocked(bucket3StartTimeNs);
-    /* EXPECT_EQ(1UL, valueProducer.mPastBuckets.size()); */
-    /* EXPECT_EQ(1UL, valueProducer.mPastBuckets.begin()->second.size()); */
-    /* EXPECT_EQ(20, valueProducer.mPastBuckets.begin()->second.back().values[0].long_value); */
+    valueProducer.flushIfNeededLocked(bucket2StartTimeNs);
+    assertPastBucketValuesSingleKey(valueProducer.mPastBuckets, {20}, {bucketSizeNs},
+                                    {bucketStartTimeNs}, {bucket2StartTimeNs});
 }
 
 TEST(ValueMetricProducerTest, TestPushedAggregateAvg) {
@@ -1351,7 +1435,8 @@
     EXPECT_EQ(25, curInterval.value.long_value);
 
     valueProducer.flushIfNeededLocked(bucket2StartTimeNs);
-    assertPastBucketValuesSingleKey(valueProducer.mPastBuckets, {25}, {bucketSizeNs});
+    assertPastBucketValuesSingleKey(valueProducer.mPastBuckets, {25}, {bucketSizeNs},
+                                    {bucketStartTimeNs}, {bucket2StartTimeNs});
 }
 
 TEST(ValueMetricProducerTest, TestSkipZeroDiffOutput) {
@@ -1375,10 +1460,8 @@
 
     LogEvent event1(/*uid=*/0, /*pid=*/0);
     CreateRepeatedValueLogEvent(&event1, tagId, bucketStartTimeNs + 10, 10);
-
-    LogEvent event2(/*uid=*/0, /*pid=*/0);
-    CreateRepeatedValueLogEvent(&event2, tagId, bucketStartTimeNs + 15, 15);
     valueProducer.onMatchedLogEvent(1 /*log matcher index*/, event1);
+
     // has one slice
     EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size());
     ValueMetricProducer::Interval curInterval =
@@ -1388,6 +1471,8 @@
     EXPECT_EQ(10, curBaseInfo.base.long_value);
     EXPECT_EQ(false, curInterval.hasValue);
 
+    LogEvent event2(/*uid=*/0, /*pid=*/0);
+    CreateRepeatedValueLogEvent(&event2, tagId, bucketStartTimeNs + 15, 15);
     valueProducer.onMatchedLogEvent(1 /*log matcher index*/, event2);
 
     // has one slice
@@ -1400,12 +1485,14 @@
     LogEvent event3(/*uid=*/0, /*pid=*/0);
     CreateRepeatedValueLogEvent(&event3, tagId, bucket2StartTimeNs + 10, 15);
     valueProducer.onMatchedLogEvent(1 /*log matcher index*/, event3);
+
     EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size());
     curInterval = valueProducer.mCurrentSlicedBucket.begin()->second[0];
     curBaseInfo = valueProducer.mCurrentBaseInfo.begin()->second[0];
     EXPECT_EQ(true, curBaseInfo.hasBase);
     EXPECT_EQ(15, curBaseInfo.base.long_value);
     EXPECT_EQ(true, curInterval.hasValue);
+    EXPECT_EQ(0, curInterval.value.long_value);
 
     LogEvent event4(/*uid=*/0, /*pid=*/0);
     CreateRepeatedValueLogEvent(&event4, tagId, bucket2StartTimeNs + 15, 15);
@@ -1416,11 +1503,11 @@
     EXPECT_EQ(true, curBaseInfo.hasBase);
     EXPECT_EQ(15, curBaseInfo.base.long_value);
     EXPECT_EQ(true, curInterval.hasValue);
+    EXPECT_EQ(0, curInterval.value.long_value);
 
     valueProducer.flushIfNeededLocked(bucket3StartTimeNs);
-    EXPECT_EQ(1UL, valueProducer.mPastBuckets.size());
-    EXPECT_EQ(1UL, valueProducer.mPastBuckets.begin()->second.size());
-    assertPastBucketValuesSingleKey(valueProducer.mPastBuckets, {5}, {bucketSizeNs});
+    assertPastBucketValuesSingleKey(valueProducer.mPastBuckets, {5}, {bucketSizeNs},
+                                    {bucketStartTimeNs}, {bucket2StartTimeNs});
 }
 
 TEST(ValueMetricProducerTest, TestSkipZeroDiffOutputMultiValue) {
@@ -1740,8 +1827,8 @@
     EXPECT_EQ(3, baseInfo1.base.long_value);
     EXPECT_EQ(false, interval1.hasValue);
     EXPECT_EQ(0UL, valueProducer->mPastBuckets.size());
-    vector<shared_ptr<LogEvent>> allData;
 
+    vector<shared_ptr<LogEvent>> allData;
     allData.clear();
     allData.push_back(CreateTwoValueLogEvent(tagId, bucket2StartTimeNs + 1, 2, 4));
     allData.push_back(CreateTwoValueLogEvent(tagId, bucket2StartTimeNs + 1, 1, 11));
@@ -1753,7 +1840,8 @@
     EXPECT_EQ(false, interval1.hasValue);
     EXPECT_EQ(8, interval1.value.long_value);
     EXPECT_FALSE(interval1.seenNewData);
-    assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {8}, {bucketSizeNs});
+    assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {8}, {bucketSizeNs},
+                                    {bucketStartTimeNs}, {bucket2StartTimeNs});
 
     auto it = valueProducer->mCurrentSlicedBucket.begin();
     for (; it != valueProducer->mCurrentSlicedBucket.end(); it++) {
@@ -1769,14 +1857,13 @@
     }
     EXPECT_TRUE(it != iter);
     EXPECT_TRUE(itBase != iterBase);
-    auto& interval2 = it->second[0];
-    auto& baseInfo2 = itBase->second[0];
+    auto interval2 = it->second[0];
+    auto baseInfo2 = itBase->second[0];
     EXPECT_EQ(2, it->first.getDimensionKeyInWhat().getValues()[0].mValue.int_value);
     EXPECT_EQ(true, baseInfo2.hasBase);
     EXPECT_EQ(4, baseInfo2.base.long_value);
     EXPECT_EQ(false, interval2.hasValue);
     EXPECT_FALSE(interval2.seenNewData);
-    assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {8}, {bucketSizeNs});
 
     // next pull somehow did not happen, skip to end of bucket 3
     allData.clear();
@@ -1791,7 +1878,8 @@
     EXPECT_EQ(5, baseInfo2.base.long_value);
     EXPECT_EQ(false, interval2.hasValue);
     EXPECT_FALSE(interval2.seenNewData);
-    assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {8}, {bucketSizeNs});
+    assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {8}, {bucketSizeNs},
+                                    {bucketStartTimeNs}, {bucket2StartTimeNs});
 
     allData.clear();
     allData.push_back(CreateTwoValueLogEvent(tagId, bucket5StartTimeNs + 1, 2, 14));
@@ -1805,9 +1893,13 @@
     EXPECT_FALSE(interval2.seenNewData);
     ASSERT_EQ(2UL, valueProducer->mPastBuckets.size());
     auto iterator = valueProducer->mPastBuckets.begin();
+    EXPECT_EQ(bucket4StartTimeNs, iterator->second[0].mBucketStartNs);
+    EXPECT_EQ(bucket5StartTimeNs, iterator->second[0].mBucketEndNs);
     EXPECT_EQ(9, iterator->second[0].values[0].long_value);
     EXPECT_EQ(bucketSizeNs, iterator->second[0].mConditionTrueNs);
     iterator++;
+    EXPECT_EQ(bucketStartTimeNs, iterator->second[0].mBucketStartNs);
+    EXPECT_EQ(bucket2StartTimeNs, iterator->second[0].mBucketEndNs);
     EXPECT_EQ(8, iterator->second[0].values[0].long_value);
     EXPECT_EQ(bucketSizeNs, iterator->second[0].mConditionTrueNs);
 }
@@ -2414,7 +2506,8 @@
     EXPECT_EQ(true, valueProducer->mHasGlobalBase);
 
     EXPECT_EQ(1UL, valueProducer->mPastBuckets.size());
-    assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {1}, {bucketSizeNs - 12 + 1});
+    assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {1}, {bucketSizeNs - 12 + 1},
+                                    {bucketStartTimeNs}, {bucket2StartTimeNs});
 }
 
 TEST(ValueMetricProducerTest, TestPartialResetOnBucketBoundaries) {
@@ -2461,10 +2554,11 @@
     EXPECT_EQ(true, valueProducer->mHasGlobalBase);
 }
 
-TEST(ValueMetricProducerTest, TestFullBucketResetWhenLastBucketInvalid) {
+TEST_P(ValueMetricProducerTest_PartialBucket, TestFullBucketResetWhenLastBucketInvalid) {
     ValueMetric metric = ValueMetricProducerTestHelper::createMetric();
 
     sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>();
+    int64_t partialBucketSplitTimeNs = bucketStartTimeNs + bucketSizeNs / 2;
     EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _))
             // Initialization.
             .WillOnce(Invoke(
@@ -2474,23 +2568,41 @@
                         return true;
                     }))
             // notifyAppUpgrade.
-            .WillOnce(Invoke([](int tagId, const ConfigKey&,
-                                vector<std::shared_ptr<LogEvent>>* data, bool) {
+            .WillOnce(Invoke([partialBucketSplitTimeNs](int tagId, const ConfigKey&,
+                                                        vector<std::shared_ptr<LogEvent>>* data,
+                                                        bool) {
                 data->clear();
-                data->push_back(CreateRepeatedValueLogEvent(
-                        tagId, bucketStartTimeNs + bucketSizeNs / 2, 10));
+                data->push_back(CreateRepeatedValueLogEvent(tagId, partialBucketSplitTimeNs, 10));
                 return true;
             }));
     sp<ValueMetricProducer> valueProducer =
             ValueMetricProducerTestHelper::createValueProducerNoConditions(pullerManager, metric);
     ASSERT_EQ(0UL, valueProducer->mCurrentFullBucket.size());
 
-    valueProducer->notifyAppUpgrade(bucketStartTimeNs + bucketSizeNs / 2, "com.foo", 10000, 1);
+    switch (GetParam()) {
+        case APP_UPGRADE:
+            valueProducer->notifyAppUpgrade(partialBucketSplitTimeNs);
+            break;
+        case BOOT_COMPLETE:
+            valueProducer->onStatsdInitCompleted(partialBucketSplitTimeNs);
+            break;
+    }
+    EXPECT_EQ(partialBucketSplitTimeNs, valueProducer->mCurrentBucketStartTimeNs);
+    EXPECT_EQ(0, valueProducer->getCurrentBucketNum());
+    assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {9},
+                                    {partialBucketSplitTimeNs - bucketStartTimeNs},
+                                    {bucketStartTimeNs}, {partialBucketSplitTimeNs});
     ASSERT_EQ(1UL, valueProducer->mCurrentFullBucket.size());
 
     vector<shared_ptr<LogEvent>> allData;
     allData.push_back(CreateRepeatedValueLogEvent(tagId, bucket3StartTimeNs + 1, 4));
     valueProducer->onDataPulled(allData, /** fails */ false, bucket3StartTimeNs + 1);
+    assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {9},
+                                    {partialBucketSplitTimeNs - bucketStartTimeNs},
+                                    {bucketStartTimeNs}, {partialBucketSplitTimeNs});
+    ASSERT_EQ(1, valueProducer->mSkippedBuckets.size());
+    EXPECT_EQ(partialBucketSplitTimeNs, valueProducer->mSkippedBuckets[0].bucketStartTimeNs);
+    EXPECT_EQ(bucket2StartTimeNs, valueProducer->mSkippedBuckets[0].bucketEndTimeNs);
     ASSERT_EQ(0UL, valueProducer->mCurrentFullBucket.size());
 }
 
@@ -2537,7 +2649,8 @@
     valueProducer->onConditionChanged(false, bucket3StartTimeNs + 10);
 
     // Bucket should have been completed.
-    assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {2}, {bucketSizeNs - 10});
+    assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {2}, {bucketSizeNs - 10},
+                                    {bucket2StartTimeNs}, {bucket3StartTimeNs});
 }
 
 TEST(ValueMetricProducerTest, TestLateOnDataPulledWithoutDiff) {
@@ -2557,7 +2670,8 @@
     valueProducer->onDataPulled(allData, /** succeed */ true, bucket2StartTimeNs);
 
     // Bucket should have been completed.
-    assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {30}, {bucketSizeNs});
+    assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {30}, {bucketSizeNs},
+                                    {bucketStartTimeNs}, {bucket2StartTimeNs});
 }
 
 TEST(ValueMetricProducerTest, TestLateOnDataPulledWithDiff) {
@@ -2585,12 +2699,14 @@
     valueProducer->onDataPulled(allData, /** succeed */ true, bucket2StartTimeNs);
 
     // Bucket should have been completed.
-    assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {19}, {bucketSizeNs});
+    assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {19}, {bucketSizeNs},
+                                    {bucketStartTimeNs}, {bucket2StartTimeNs});
 }
 
-TEST(ValueMetricProducerTest, TestBucketBoundariesOnAppUpgrade) {
+TEST_P(ValueMetricProducerTest_PartialBucket, TestBucketBoundariesOnPartialBucket) {
     ValueMetric metric = ValueMetricProducerTestHelper::createMetric();
 
+    int64_t partialBucketSplitTimeNs = bucket2StartTimeNs + 2;
     sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>();
     EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _))
             // Initialization.
@@ -2601,20 +2717,29 @@
                         return true;
                     }))
             // notifyAppUpgrade.
-            .WillOnce(Invoke([](int tagId, const ConfigKey&,
-                                vector<std::shared_ptr<LogEvent>>* data, bool) {
+            .WillOnce(Invoke([partialBucketSplitTimeNs](int tagId, const ConfigKey&,
+                                                        vector<std::shared_ptr<LogEvent>>* data,
+                                                        bool) {
                 data->clear();
-                data->push_back(CreateRepeatedValueLogEvent(tagId, bucket2StartTimeNs + 2, 10));
+                data->push_back(CreateRepeatedValueLogEvent(tagId, partialBucketSplitTimeNs, 10));
                 return true;
             }));
 
     sp<ValueMetricProducer> valueProducer =
             ValueMetricProducerTestHelper::createValueProducerNoConditions(pullerManager, metric);
 
-    valueProducer->notifyAppUpgrade(bucket2StartTimeNs + 2, "com.foo", 10000, 1);
+    switch (GetParam()) {
+        case APP_UPGRADE:
+            valueProducer->notifyAppUpgrade(partialBucketSplitTimeNs);
+            break;
+        case BOOT_COMPLETE:
+            valueProducer->onStatsdInitCompleted(partialBucketSplitTimeNs);
+            break;
+    }
 
     // Bucket should have been completed.
-    assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {9}, {bucketSizeNs});
+    assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {9}, {bucketSizeNs},
+                                    {bucketStartTimeNs}, {bucket2StartTimeNs});
 }
 
 TEST(ValueMetricProducerTest, TestDataIsNotUpdatedWhenNoConditionChanged) {
@@ -2642,7 +2767,7 @@
 
     valueProducer->onConditionChanged(true, bucketStartTimeNs + 8);
     valueProducer->onConditionChanged(false, bucketStartTimeNs + 10);
-    valueProducer->onConditionChanged(false, bucketStartTimeNs + 10);
+    valueProducer->onConditionChanged(false, bucketStartTimeNs + 12);
 
     EXPECT_EQ(1UL, valueProducer->mCurrentSlicedBucket.size());
     auto curInterval = valueProducer->mCurrentSlicedBucket.begin()->second[0];
@@ -2654,7 +2779,8 @@
     allData.push_back(CreateRepeatedValueLogEvent(tagId, bucket2StartTimeNs + 1, 10));
     valueProducer->onDataPulled(allData, /** succeed */ true, bucket2StartTimeNs + 1);
 
-    assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {2}, {2});
+    assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {2}, {2}, {bucketStartTimeNs},
+                                    {bucket2StartTimeNs});
 }
 
 // TODO: b/145705635 fix or delete this test
@@ -2705,7 +2831,7 @@
     valueProducer->onDataPulled(allData, /** succeed */ true, bucket2StartTimeNs);
 
     // There was not global base available so all buckets are invalid.
-    assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {}, {});
+    assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {}, {}, {}, {});
 }
 
 TEST(ValueMetricProducerTest, TestPullNeededFastDump) {
@@ -2849,7 +2975,8 @@
     valueProducer->onDataPulled(allData, /** succeed */ true, bucket2StartTimeNs + 30);
 
     // Bucket should have been completed.
-    assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {10}, {bucketSizeNs});
+    assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {10}, {bucketSizeNs},
+                                    {bucketStartTimeNs}, {bucket2StartTimeNs});
 }
 
 TEST(ValueMetricProducerTest, TestPulledData_noDiff_withMultipleConditionChanges) {
@@ -2892,7 +3019,8 @@
     allData.push_back(CreateRepeatedValueLogEvent(tagId, bucket2StartTimeNs + 30, 110));
     valueProducer->onDataPulled(allData, /** succeed */ true, bucket2StartTimeNs);
 
-    assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {20}, {50 - 8});
+    assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {20}, {50 - 8},
+                                    {bucketStartTimeNs}, {bucket2StartTimeNs});
     curInterval = valueProducer->mCurrentSlicedBucket.begin()->second[0];
     curBaseInfo = valueProducer->mCurrentBaseInfo.begin()->second[0];
     EXPECT_EQ(false, curBaseInfo.hasBase);
@@ -2923,7 +3051,8 @@
     allData.push_back(CreateRepeatedValueLogEvent(tagId, bucket2StartTimeNs + 30, 30));
     valueProducer->onDataPulled(allData, /** succeed */ true, bucket2StartTimeNs);
 
-    assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {30}, {bucketSizeNs - 8});
+    assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {30}, {bucketSizeNs - 8},
+                                    {bucketStartTimeNs}, {bucket2StartTimeNs});
     ValueMetricProducer::Interval curInterval =
             valueProducer->mCurrentSlicedBucket.begin()->second[0];
     ValueMetricProducer::BaseInfo curBaseInfo = valueProducer->mCurrentBaseInfo.begin()->second[0];
@@ -2946,7 +3075,7 @@
     valueProducer->onDataPulled(allData, /** succeed */ true, bucket2StartTimeNs);
 
     // Condition was always false.
-    assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {}, {});
+    assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {}, {}, {}, {});
 }
 
 TEST(ValueMetricProducerTest, TestPulledData_noDiff_withFailure) {
@@ -2976,7 +3105,7 @@
     valueProducer->onDataPulled(allData, /** succeed */ true, bucket2StartTimeNs);
 
     // No buckets, we had a failure.
-    assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {}, {});
+    assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {}, {}, {}, {});
 }
 
 /*
diff --git a/cmds/statsd/tests/metrics/metrics_test_helper.h b/cmds/statsd/tests/metrics/metrics_test_helper.h
index 69f7e3f..be410b1 100644
--- a/cmds/statsd/tests/metrics/metrics_test_helper.h
+++ b/cmds/statsd/tests/metrics/metrics_test_helper.h
@@ -44,7 +44,8 @@
                             vector<std::shared_ptr<LogEvent>>* data, bool useUids));
     MOCK_METHOD2(RegisterPullUidProvider,
                  void(const ConfigKey& configKey, wp<PullUidProvider> provider));
-    MOCK_METHOD1(UnregisterPullUidProvider, void(const ConfigKey& configKey));
+    MOCK_METHOD2(UnregisterPullUidProvider,
+                 void(const ConfigKey& configKey, wp<PullUidProvider> provider));
 };
 
 class MockUidMap : public UidMap {
diff --git a/cmds/statsd/tests/state/StateTracker_test.cpp b/cmds/statsd/tests/state/StateTracker_test.cpp
index 78c80bc..ba2a4cf 100644
--- a/cmds/statsd/tests/state/StateTracker_test.cpp
+++ b/cmds/statsd/tests/state/StateTracker_test.cpp
@@ -19,6 +19,7 @@
 
 #include "state/StateListener.h"
 #include "state/StateManager.h"
+#include "state/StateTracker.h"
 #include "stats_event.h"
 #include "tests/statsd_test_util.h"
 
@@ -127,23 +128,23 @@
 
     // Register listener to non-existing StateTracker
     EXPECT_EQ(0, mgr.getStateTrackersCount());
-    EXPECT_TRUE(mgr.registerListener(util::SCREEN_STATE_CHANGED, listener1));
+    mgr.registerListener(util::SCREEN_STATE_CHANGED, listener1);
     EXPECT_EQ(1, mgr.getStateTrackersCount());
     EXPECT_EQ(1, mgr.getListenersCount(util::SCREEN_STATE_CHANGED));
 
     // Register listener to existing StateTracker
-    EXPECT_TRUE(mgr.registerListener(util::SCREEN_STATE_CHANGED, listener2));
+    mgr.registerListener(util::SCREEN_STATE_CHANGED, listener2);
     EXPECT_EQ(1, mgr.getStateTrackersCount());
     EXPECT_EQ(2, mgr.getListenersCount(util::SCREEN_STATE_CHANGED));
 
     // Register already registered listener to existing StateTracker
-    EXPECT_TRUE(mgr.registerListener(util::SCREEN_STATE_CHANGED, listener2));
+    mgr.registerListener(util::SCREEN_STATE_CHANGED, listener2);
     EXPECT_EQ(1, mgr.getStateTrackersCount());
     EXPECT_EQ(2, mgr.getListenersCount(util::SCREEN_STATE_CHANGED));
 
     // Register listener to non-state atom
-    EXPECT_FALSE(mgr.registerListener(util::BATTERY_LEVEL_CHANGED, listener2));
-    EXPECT_EQ(1, mgr.getStateTrackersCount());
+    mgr.registerListener(util::BATTERY_LEVEL_CHANGED, listener2);
+    EXPECT_EQ(2, mgr.getStateTrackersCount());
 }
 
 /**
@@ -249,6 +250,9 @@
     EXPECT_EQ(1, listener->updates.size());
     EXPECT_EQ(1000, listener->updates[0].mKey.getValues()[0].mValue.int_value);
     EXPECT_EQ(BleScanStateChanged::ON, listener->updates[0].mState);
+    FieldValue stateFieldValue;
+    mgr.getStateValue(util::BLE_SCAN_STATE_CHANGED, listener->updates[0].mKey, &stateFieldValue);
+    EXPECT_EQ(BleScanStateChanged::ON, stateFieldValue.mValue.int_value);
     listener->updates.clear();
 
     std::unique_ptr<LogEvent> event2 =
@@ -258,6 +262,8 @@
     EXPECT_EQ(1, listener->updates.size());
     EXPECT_EQ(2000, listener->updates[0].mKey.getValues()[0].mValue.int_value);
     EXPECT_EQ(BleScanStateChanged::ON, listener->updates[0].mState);
+    mgr.getStateValue(util::BLE_SCAN_STATE_CHANGED, listener->updates[0].mKey, &stateFieldValue);
+    EXPECT_EQ(BleScanStateChanged::ON, stateFieldValue.mValue.int_value);
     listener->updates.clear();
 
     std::unique_ptr<LogEvent> event3 =
@@ -265,8 +271,12 @@
                                            BleScanStateChanged::RESET, false, false, false);
     mgr.onLogEvent(*event3);
     EXPECT_EQ(2, listener->updates.size());
-    EXPECT_EQ(BleScanStateChanged::OFF, listener->updates[0].mState);
-    EXPECT_EQ(BleScanStateChanged::OFF, listener->updates[1].mState);
+    for (const TestStateListener::Update& update : listener->updates) {
+        EXPECT_EQ(BleScanStateChanged::OFF, update.mState);
+
+        mgr.getStateValue(util::BLE_SCAN_STATE_CHANGED, update.mKey, &stateFieldValue);
+        EXPECT_EQ(BleScanStateChanged::OFF, stateFieldValue.mValue.int_value);
+    }
 }
 
 /**
@@ -352,13 +362,13 @@
     // No state stored for this query key.
     HashableDimensionKey queryKey2;
     getPartialWakelockKey(1002 /* uid */, "tag1", &queryKey2);
-    EXPECT_EQ(WakelockStateChanged::RELEASE,
+    EXPECT_EQ(-1 /*StateTracker::kStateUnknown*/,
               getStateInt(mgr, util::WAKELOCK_STATE_CHANGED, queryKey2));
 
     // Partial query fails.
     HashableDimensionKey queryKey3;
     getPartialWakelockKey(1001 /* uid */, &queryKey3);
-    EXPECT_EQ(WakelockStateChanged::RELEASE,
+    EXPECT_EQ(-1 /*StateTracker::kStateUnknown*/,
               getStateInt(mgr, util::WAKELOCK_STATE_CHANGED, queryKey3));
 }
 
diff --git a/cmds/statsd/tests/statsd_test_util.cpp b/cmds/statsd/tests/statsd_test_util.cpp
index 687014f..7216e1d 100644
--- a/cmds/statsd/tests/statsd_test_util.cpp
+++ b/cmds/statsd/tests/statsd_test_util.cpp
@@ -569,6 +569,8 @@
     AStatsEvent_setAtomId(statsEvent, util::SCREEN_STATE_CHANGED);
     AStatsEvent_overwriteTimestamp(statsEvent, timestampNs);
     AStatsEvent_writeInt32(statsEvent, state);
+    AStatsEvent_addBoolAnnotation(statsEvent, util::ANNOTATION_ID_EXCLUSIVE_STATE, true);
+    AStatsEvent_addBoolAnnotation(statsEvent, util::ANNOTATION_ID_STATE_NESTED, false);
 
     std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
     parseStatsEventToLogEvent(statsEvent, logEvent.get());
@@ -662,9 +664,14 @@
     AStatsEvent_overwriteTimestamp(statsEvent, timestampNs);
 
     writeAttribution(statsEvent, attributionUids, attributionTags);
+    AStatsEvent_addBoolAnnotation(statsEvent, util::ANNOTATION_ID_PRIMARY_FIELD_FIRST_UID, true);
     AStatsEvent_writeInt32(statsEvent, android::os::WakeLockLevelEnum::PARTIAL_WAKE_LOCK);
+    AStatsEvent_addBoolAnnotation(statsEvent, util::ANNOTATION_ID_PRIMARY_FIELD, true);
     AStatsEvent_writeString(statsEvent, wakelockName.c_str());
+    AStatsEvent_addBoolAnnotation(statsEvent, util::ANNOTATION_ID_PRIMARY_FIELD, true);
     AStatsEvent_writeInt32(statsEvent, state);
+    AStatsEvent_addBoolAnnotation(statsEvent, util::ANNOTATION_ID_EXCLUSIVE_STATE, true);
+    AStatsEvent_addBoolAnnotation(statsEvent, util::ANNOTATION_ID_STATE_NESTED, true);
 
     std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
     parseStatsEventToLogEvent(statsEvent, logEvent.get());
@@ -803,7 +810,11 @@
     AStatsEvent_overwriteTimestamp(statsEvent, timestampNs);
 
     AStatsEvent_writeInt32(statsEvent, uid);
+    AStatsEvent_addBoolAnnotation(statsEvent, util::ANNOTATION_ID_IS_UID, true);
+    AStatsEvent_addBoolAnnotation(statsEvent, util::ANNOTATION_ID_PRIMARY_FIELD, true);
     AStatsEvent_writeInt32(statsEvent, state);
+    AStatsEvent_addBoolAnnotation(statsEvent, util::ANNOTATION_ID_EXCLUSIVE_STATE, true);
+    AStatsEvent_addBoolAnnotation(statsEvent, util::ANNOTATION_ID_STATE_NESTED, false);
 
     std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
     parseStatsEventToLogEvent(statsEvent, logEvent.get());
@@ -821,10 +832,20 @@
     AStatsEvent_overwriteTimestamp(statsEvent, timestampNs);
 
     writeAttribution(statsEvent, attributionUids, attributionTags);
+    AStatsEvent_addBoolAnnotation(statsEvent, util::ANNOTATION_ID_PRIMARY_FIELD_FIRST_UID, true);
     AStatsEvent_writeInt32(statsEvent, state);
-    AStatsEvent_writeInt32(statsEvent, filtered);       // filtered
-    AStatsEvent_writeInt32(statsEvent, firstMatch);     // first match
-    AStatsEvent_writeInt32(statsEvent, opportunistic);  // opportunistic
+    AStatsEvent_addBoolAnnotation(statsEvent, util::ANNOTATION_ID_EXCLUSIVE_STATE, true);
+    AStatsEvent_addBoolAnnotation(statsEvent, util::ANNOTATION_ID_STATE_NESTED, true);
+    if (state == util::BLE_SCAN_STATE_CHANGED__STATE__RESET) {
+        AStatsEvent_addInt32Annotation(statsEvent, ANNOTATION_ID_TRIGGER_STATE_RESET,
+                                       util::BLE_SCAN_STATE_CHANGED__STATE__OFF);
+    }
+    AStatsEvent_writeBool(statsEvent, filtered);  // filtered
+    AStatsEvent_addBoolAnnotation(statsEvent, util::ANNOTATION_ID_PRIMARY_FIELD, true);
+    AStatsEvent_writeBool(statsEvent, firstMatch);  // first match
+    AStatsEvent_addBoolAnnotation(statsEvent, util::ANNOTATION_ID_PRIMARY_FIELD, true);
+    AStatsEvent_writeBool(statsEvent, opportunistic);  // opportunistic
+    AStatsEvent_addBoolAnnotation(statsEvent, util::ANNOTATION_ID_PRIMARY_FIELD, true);
 
     std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
     parseStatsEventToLogEvent(statsEvent, logEvent.get());
@@ -840,9 +861,14 @@
     AStatsEvent_overwriteTimestamp(statsEvent, timestampNs);
 
     AStatsEvent_writeInt32(statsEvent, uid);
+    AStatsEvent_addBoolAnnotation(statsEvent, util::ANNOTATION_ID_IS_UID, true);
+    AStatsEvent_addBoolAnnotation(statsEvent, util::ANNOTATION_ID_PRIMARY_FIELD, true);
     AStatsEvent_writeString(statsEvent, packageName.c_str());
-    AStatsEvent_writeInt32(statsEvent, usingAlertWindow);
+    AStatsEvent_addBoolAnnotation(statsEvent, util::ANNOTATION_ID_PRIMARY_FIELD, true);
+    AStatsEvent_writeBool(statsEvent, usingAlertWindow);
     AStatsEvent_writeInt32(statsEvent, state);
+    AStatsEvent_addBoolAnnotation(statsEvent, util::ANNOTATION_ID_EXCLUSIVE_STATE, true);
+    AStatsEvent_addBoolAnnotation(statsEvent, util::ANNOTATION_ID_STATE_NESTED, false);
 
     std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
     parseStatsEventToLogEvent(statsEvent, logEvent.get());
diff --git a/cmds/statsd/tests/statsd_test_util.h b/cmds/statsd/tests/statsd_test_util.h
index 37b9889..4d68ea2 100644
--- a/cmds/statsd/tests/statsd_test_util.h
+++ b/cmds/statsd/tests/statsd_test_util.h
@@ -42,6 +42,8 @@
 const int SCREEN_STATE_ATOM_ID = util::SCREEN_STATE_CHANGED;
 const int UID_PROCESS_STATE_ATOM_ID = util::UID_PROCESS_STATE_CHANGED;
 
+enum BucketSplitEvent { APP_UPGRADE, BOOT_COMPLETE };
+
 // Converts a ProtoOutputStream to a StatsLogReport proto.
 StatsLogReport outputStreamToProto(ProtoOutputStream* proto);
 
diff --git a/cmds/statsd/tests/utils/MultiConditionTrigger_test.cpp b/cmds/statsd/tests/utils/MultiConditionTrigger_test.cpp
new file mode 100644
index 0000000..db402a0
--- /dev/null
+++ b/cmds/statsd/tests/utils/MultiConditionTrigger_test.cpp
@@ -0,0 +1,174 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "utils/MultiConditionTrigger.h"
+
+#include <gtest/gtest.h>
+
+#include <chrono>
+#include <set>
+#include <thread>
+#include <vector>
+
+#ifdef __ANDROID__
+
+using namespace std;
+using std::this_thread::sleep_for;
+
+namespace android {
+namespace os {
+namespace statsd {
+
+TEST(MultiConditionTrigger, TestMultipleConditions) {
+    int numConditions = 5;
+    string t1 = "t1", t2 = "t2", t3 = "t3", t4 = "t4", t5 = "t5";
+    set<string> conditionNames = {t1, t2, t3, t4, t5};
+
+    mutex lock;
+    condition_variable cv;
+    bool triggerCalled = false;
+
+    // Mark done as true and notify in the done.
+    MultiConditionTrigger trigger(conditionNames, [&lock, &cv, &triggerCalled] {
+        {
+            lock_guard lg(lock);
+            triggerCalled = true;
+        }
+        cv.notify_all();
+    });
+
+    vector<thread> threads;
+    vector<bool> done(numConditions, false);
+
+    int i = 0;
+    for (const string& conditionName : conditionNames) {
+        threads.emplace_back([&done, &conditionName, &trigger, i] {
+            sleep_for(chrono::milliseconds(3));
+            done[i] = true;
+            trigger.markComplete(conditionName);
+        });
+        i++;
+    }
+
+    unique_lock<mutex> unique_lk(lock);
+    cv.wait(unique_lk, [&triggerCalled] {
+        return triggerCalled;
+    });
+
+    for (i = 0; i < numConditions; i++) {
+        EXPECT_EQ(done[i], 1);
+    }
+
+    for (i = 0; i < numConditions; i++) {
+        threads[i].join();
+    }
+}
+
+TEST(MultiConditionTrigger, TestNoConditions) {
+    mutex lock;
+    condition_variable cv;
+    bool triggerCalled = false;
+
+    MultiConditionTrigger trigger({}, [&lock, &cv, &triggerCalled] {
+        {
+            lock_guard lg(lock);
+            triggerCalled = true;
+        }
+        cv.notify_all();
+    });
+
+    unique_lock<mutex> unique_lk(lock);
+    cv.wait(unique_lk, [&triggerCalled] { return triggerCalled; });
+    EXPECT_TRUE(triggerCalled);
+    // Ensure that trigger occurs immediately if no events need to be completed.
+}
+
+TEST(MultiConditionTrigger, TestMarkCompleteCalledBySameCondition) {
+    string t1 = "t1", t2 = "t2";
+    set<string> conditionNames = {t1, t2};
+
+    mutex lock;
+    condition_variable cv;
+    bool triggerCalled = false;
+
+    MultiConditionTrigger trigger(conditionNames, [&lock, &cv, &triggerCalled] {
+        {
+            lock_guard lg(lock);
+            triggerCalled = true;
+        }
+        cv.notify_all();
+    });
+
+    trigger.markComplete(t1);
+    trigger.markComplete(t1);
+
+    // Ensure that the trigger still hasn't fired.
+    {
+        lock_guard lg(lock);
+        EXPECT_FALSE(triggerCalled);
+    }
+
+    trigger.markComplete(t2);
+    unique_lock<mutex> unique_lk(lock);
+    cv.wait(unique_lk, [&triggerCalled] { return triggerCalled; });
+    EXPECT_TRUE(triggerCalled);
+}
+
+TEST(MultiConditionTrigger, TestTriggerOnlyCalledOnce) {
+    string t1 = "t1";
+    set<string> conditionNames = {t1};
+
+    mutex lock;
+    condition_variable cv;
+    bool triggerCalled = false;
+    int triggerCount = 0;
+
+    MultiConditionTrigger trigger(conditionNames, [&lock, &cv, &triggerCalled, &triggerCount] {
+        {
+            lock_guard lg(lock);
+            triggerCount++;
+            triggerCalled = true;
+        }
+        cv.notify_all();
+    });
+
+    trigger.markComplete(t1);
+
+    // Ensure that the trigger fired.
+    {
+        unique_lock<mutex> unique_lk(lock);
+        cv.wait(unique_lk, [&triggerCalled] { return triggerCalled; });
+        EXPECT_TRUE(triggerCalled);
+        EXPECT_EQ(triggerCount, 1);
+        triggerCalled = false;
+    }
+
+    trigger.markComplete(t1);
+
+    // Ensure that the trigger does not fire again.
+    {
+        unique_lock<mutex> unique_lk(lock);
+        cv.wait_for(unique_lk, chrono::milliseconds(5), [&triggerCalled] { return triggerCalled; });
+        EXPECT_FALSE(triggerCalled);
+        EXPECT_EQ(triggerCount, 1);
+    }
+}
+
+}  // namespace statsd
+}  // namespace os
+}  // namespace android
+#else
+GTEST_LOG_(INFO) << "This test does nothing.\n";
+#endif
diff --git a/cmds/uiautomator/library/Android.bp b/cmds/uiautomator/library/Android.bp
index 3a26063..c33d31f 100644
--- a/cmds/uiautomator/library/Android.bp
+++ b/cmds/uiautomator/library/Android.bp
@@ -28,9 +28,6 @@
     installable: false,
     args: "-stubpackages com.android.uiautomator.core:" +
           "com.android.uiautomator.testrunner",
-    api_tag_name: "UIAUTOMATOR",
-    api_filename: "uiautomator_api.txt",
-    removed_api_filename: "uiautomator_removed_api.txt",
 
     check_api: {
         current: {
diff --git a/config/boot-image-profile.txt b/config/boot-image-profile.txt
index 23a68c7..5f45d69 100644
--- a/config/boot-image-profile.txt
+++ b/config/boot-image-profile.txt
@@ -26,14 +26,6 @@
 HSPLandroid/accessibilityservice/AccessibilityServiceInfo;->initFromParcel(Landroid/os/Parcel;)V
 HSPLandroid/accessibilityservice/AccessibilityServiceInfo;->isDirectBootAware()Z
 HSPLandroid/accessibilityservice/AccessibilityServiceInfo;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/accounts/AbstractAccountAuthenticator$Transport;-><init>(Landroid/accounts/AbstractAccountAuthenticator;)V
-HSPLandroid/accounts/AbstractAccountAuthenticator$Transport;-><init>(Landroid/accounts/AbstractAccountAuthenticator;Landroid/accounts/AbstractAccountAuthenticator$1;)V
-HSPLandroid/accounts/AbstractAccountAuthenticator$Transport;->getAuthToken(Landroid/accounts/IAccountAuthenticatorResponse;Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;)V
-HSPLandroid/accounts/AbstractAccountAuthenticator$Transport;->hasFeatures(Landroid/accounts/IAccountAuthenticatorResponse;Landroid/accounts/Account;[Ljava/lang/String;)V
-HSPLandroid/accounts/AbstractAccountAuthenticator;-><init>(Landroid/content/Context;)V
-HSPLandroid/accounts/AbstractAccountAuthenticator;->access$000(Landroid/accounts/AbstractAccountAuthenticator;)V
-HSPLandroid/accounts/AbstractAccountAuthenticator;->checkBinderPermission()V
-HSPLandroid/accounts/AbstractAccountAuthenticator;->getIBinder()Landroid/os/IBinder;
 HSPLandroid/accounts/Account$1;->createFromParcel(Landroid/os/Parcel;)Landroid/accounts/Account;
 HSPLandroid/accounts/Account$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/accounts/Account$1;->newArray(I)[Landroid/accounts/Account;
@@ -56,47 +48,23 @@
 HSPLandroid/accounts/AccountManager$16;-><init>(Landroid/accounts/AccountManager;Landroid/accounts/OnAccountsUpdateListener;[Landroid/accounts/Account;)V
 HSPLandroid/accounts/AccountManager$16;->run()V
 HSPLandroid/accounts/AccountManager$18;-><init>(Landroid/accounts/AccountManager;)V
-HSPLandroid/accounts/AccountManager$2;-><init>(Landroid/accounts/AccountManager;Landroid/os/Handler;Landroid/accounts/AccountManagerCallback;Landroid/accounts/Account;[Ljava/lang/String;)V
-HSPLandroid/accounts/AccountManager$2;->bundleToResult(Landroid/os/Bundle;)Ljava/lang/Boolean;
-HSPLandroid/accounts/AccountManager$2;->bundleToResult(Landroid/os/Bundle;)Ljava/lang/Object;
-HSPLandroid/accounts/AccountManager$2;->doWork()V
-HSPLandroid/accounts/AccountManager$3;-><init>(Landroid/accounts/AccountManager;Landroid/os/Handler;Landroid/accounts/AccountManagerCallback;Ljava/lang/String;[Ljava/lang/String;)V
-HSPLandroid/accounts/AccountManager$3;->bundleToResult(Landroid/os/Bundle;)Ljava/lang/Object;
-HSPLandroid/accounts/AccountManager$3;->bundleToResult(Landroid/os/Bundle;)[Landroid/accounts/Account;
-HSPLandroid/accounts/AccountManager$3;->doWork()V
 HSPLandroid/accounts/AccountManager$8;-><init>(Landroid/accounts/AccountManager;Landroid/app/Activity;Landroid/os/Handler;Landroid/accounts/AccountManagerCallback;Landroid/accounts/Account;Ljava/lang/String;ZLandroid/os/Bundle;)V
 HSPLandroid/accounts/AccountManager$8;->doWork()V
 HSPLandroid/accounts/AccountManager$AmsTask$1;-><init>(Landroid/accounts/AccountManager;)V
-HSPLandroid/accounts/AccountManager$AmsTask$Response;-><init>(Landroid/accounts/AccountManager$AmsTask;)V
 HSPLandroid/accounts/AccountManager$AmsTask$Response;-><init>(Landroid/accounts/AccountManager$AmsTask;Landroid/accounts/AccountManager$1;)V
 HSPLandroid/accounts/AccountManager$AmsTask$Response;->onResult(Landroid/os/Bundle;)V
 HSPLandroid/accounts/AccountManager$AmsTask;-><init>(Landroid/accounts/AccountManager;Landroid/app/Activity;Landroid/os/Handler;Landroid/accounts/AccountManagerCallback;)V
 HSPLandroid/accounts/AccountManager$AmsTask;->done()V
 HSPLandroid/accounts/AccountManager$AmsTask;->getResult()Landroid/os/Bundle;
 HSPLandroid/accounts/AccountManager$AmsTask;->getResult()Ljava/lang/Object;
-HSPLandroid/accounts/AccountManager$AmsTask;->getResult(JLjava/util/concurrent/TimeUnit;)Landroid/os/Bundle;
-HSPLandroid/accounts/AccountManager$AmsTask;->getResult(JLjava/util/concurrent/TimeUnit;)Ljava/lang/Object;
 HSPLandroid/accounts/AccountManager$AmsTask;->internalGetResult(Ljava/lang/Long;Ljava/util/concurrent/TimeUnit;)Landroid/os/Bundle;
 HSPLandroid/accounts/AccountManager$AmsTask;->set(Landroid/os/Bundle;)V
 HSPLandroid/accounts/AccountManager$AmsTask;->start()Landroid/accounts/AccountManagerFuture;
-HSPLandroid/accounts/AccountManager$BaseFutureTask$1;-><init>(Landroid/accounts/AccountManager;)V
-HSPLandroid/accounts/AccountManager$BaseFutureTask$Response;-><init>(Landroid/accounts/AccountManager$BaseFutureTask;)V
-HSPLandroid/accounts/AccountManager$BaseFutureTask$Response;->onResult(Landroid/os/Bundle;)V
-HSPLandroid/accounts/AccountManager$BaseFutureTask;-><init>(Landroid/accounts/AccountManager;Landroid/os/Handler;)V
-HSPLandroid/accounts/AccountManager$BaseFutureTask;->access$1000(Landroid/accounts/AccountManager$BaseFutureTask;Ljava/lang/Object;)V
 HSPLandroid/accounts/AccountManager$BaseFutureTask;->startTask()V
-HSPLandroid/accounts/AccountManager$Future2Task;-><init>(Landroid/accounts/AccountManager;Landroid/os/Handler;Landroid/accounts/AccountManagerCallback;)V
 HSPLandroid/accounts/AccountManager$Future2Task;->done()V
-HSPLandroid/accounts/AccountManager$Future2Task;->getResult()Ljava/lang/Object;
-HSPLandroid/accounts/AccountManager$Future2Task;->getResult(JLjava/util/concurrent/TimeUnit;)Ljava/lang/Object;
-HSPLandroid/accounts/AccountManager$Future2Task;->internalGetResult(Ljava/lang/Long;Ljava/util/concurrent/TimeUnit;)Ljava/lang/Object;
-HSPLandroid/accounts/AccountManager$Future2Task;->start()Landroid/accounts/AccountManager$Future2Task;
 HSPLandroid/accounts/AccountManager;-><init>(Landroid/content/Context;Landroid/accounts/IAccountManager;)V
 HSPLandroid/accounts/AccountManager;->access$000(Landroid/accounts/AccountManager;)Landroid/accounts/IAccountManager;
-HSPLandroid/accounts/AccountManager;->access$100(Landroid/accounts/AccountManager;)Landroid/content/Context;
 HSPLandroid/accounts/AccountManager;->access$200(Landroid/accounts/AccountManager;)Ljava/util/HashMap;
-HSPLandroid/accounts/AccountManager;->access$300(Landroid/accounts/AccountManager;)Ljava/util/HashMap;
-HSPLandroid/accounts/AccountManager;->access$500(Landroid/accounts/AccountManager;)V
 HSPLandroid/accounts/AccountManager;->addOnAccountsUpdatedListener(Landroid/accounts/OnAccountsUpdateListener;Landroid/os/Handler;Z)V
 HSPLandroid/accounts/AccountManager;->addOnAccountsUpdatedListener(Landroid/accounts/OnAccountsUpdateListener;Landroid/os/Handler;Z[Ljava/lang/String;)V
 HSPLandroid/accounts/AccountManager;->blockingGetAuthToken(Landroid/accounts/Account;Ljava/lang/String;Z)Ljava/lang/String;
@@ -105,29 +73,11 @@
 HSPLandroid/accounts/AccountManager;->getAccounts()[Landroid/accounts/Account;
 HSPLandroid/accounts/AccountManager;->getAccountsAsUser(I)[Landroid/accounts/Account;
 HSPLandroid/accounts/AccountManager;->getAccountsByType(Ljava/lang/String;)[Landroid/accounts/Account;
-HSPLandroid/accounts/AccountManager;->getAccountsByTypeAndFeatures(Ljava/lang/String;[Ljava/lang/String;Landroid/accounts/AccountManagerCallback;Landroid/os/Handler;)Landroid/accounts/AccountManagerFuture;
 HSPLandroid/accounts/AccountManager;->getAccountsByTypeAsUser(Ljava/lang/String;Landroid/os/UserHandle;)[Landroid/accounts/Account;
-HSPLandroid/accounts/AccountManager;->getAccountsByTypeForPackage(Ljava/lang/String;Ljava/lang/String;)[Landroid/accounts/Account;
 HSPLandroid/accounts/AccountManager;->getAuthToken(Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;ZLandroid/accounts/AccountManagerCallback;Landroid/os/Handler;)Landroid/accounts/AccountManagerFuture;
 HSPLandroid/accounts/AccountManager;->getAuthToken(Landroid/accounts/Account;Ljava/lang/String;ZLandroid/accounts/AccountManagerCallback;Landroid/os/Handler;)Landroid/accounts/AccountManagerFuture;
-HSPLandroid/accounts/AccountManager;->getAuthenticatorTypes()[Landroid/accounts/AuthenticatorDescription;
-HSPLandroid/accounts/AccountManager;->getAuthenticatorTypesAsUser(I)[Landroid/accounts/AuthenticatorDescription;
-HSPLandroid/accounts/AccountManager;->getPassword(Landroid/accounts/Account;)Ljava/lang/String;
-HSPLandroid/accounts/AccountManager;->getUserData(Landroid/accounts/Account;Ljava/lang/String;)Ljava/lang/String;
 HPLandroid/accounts/AccountManager;->hasAccountAccess(Landroid/accounts/Account;Ljava/lang/String;Landroid/os/UserHandle;)Z
-HSPLandroid/accounts/AccountManager;->hasFeatures(Landroid/accounts/Account;[Ljava/lang/String;Landroid/accounts/AccountManagerCallback;Landroid/os/Handler;)Landroid/accounts/AccountManagerFuture;
-HSPLandroid/accounts/AccountManager;->invalidateAuthToken(Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/accounts/AccountManager;->peekAuthToken(Landroid/accounts/Account;Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/accounts/AccountManager;->postToHandler(Landroid/os/Handler;Landroid/accounts/OnAccountsUpdateListener;[Landroid/accounts/Account;)V
-HSPLandroid/accounts/AccountManager;->setAuthToken(Landroid/accounts/Account;Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/accounts/AccountManager;->setUserData(Landroid/accounts/Account;Ljava/lang/String;Ljava/lang/String;)V
 HSPLandroid/accounts/AccountManagerInternal;-><init>()V
-HSPLandroid/accounts/AuthenticatorDescription$1;->createFromParcel(Landroid/os/Parcel;)Landroid/accounts/AuthenticatorDescription;
-HSPLandroid/accounts/AuthenticatorDescription$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/accounts/AuthenticatorDescription$1;->newArray(I)[Landroid/accounts/AuthenticatorDescription;
-HSPLandroid/accounts/AuthenticatorDescription$1;->newArray(I)[Ljava/lang/Object;
-HSPLandroid/accounts/AuthenticatorDescription;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/accounts/AuthenticatorDescription;-><init>(Landroid/os/Parcel;Landroid/accounts/AuthenticatorDescription$1;)V
 HSPLandroid/accounts/AuthenticatorDescription;-><init>(Ljava/lang/String;)V
 HSPLandroid/accounts/AuthenticatorDescription;-><init>(Ljava/lang/String;Ljava/lang/String;IIIIZ)V
 HSPLandroid/accounts/AuthenticatorDescription;->equals(Ljava/lang/Object;)Z
@@ -137,32 +87,18 @@
 HPLandroid/accounts/IAccountAuthenticator$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HPLandroid/accounts/IAccountAuthenticator$Stub$Proxy;->getAuthToken(Landroid/accounts/IAccountAuthenticatorResponse;Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;)V
 HPLandroid/accounts/IAccountAuthenticator$Stub$Proxy;->hasFeatures(Landroid/accounts/IAccountAuthenticatorResponse;Landroid/accounts/Account;[Ljava/lang/String;)V
-HSPLandroid/accounts/IAccountAuthenticator$Stub;-><init>()V
-HSPLandroid/accounts/IAccountAuthenticator$Stub;->asBinder()Landroid/os/IBinder;
 HPLandroid/accounts/IAccountAuthenticator$Stub;->asInterface(Landroid/os/IBinder;)Landroid/accounts/IAccountAuthenticator;
-HSPLandroid/accounts/IAccountAuthenticator$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/accounts/IAccountAuthenticatorResponse$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/accounts/IAccountAuthenticatorResponse$Stub$Proxy;->onResult(Landroid/os/Bundle;)V
 HPLandroid/accounts/IAccountAuthenticatorResponse$Stub;->asBinder()Landroid/os/IBinder;
 HSPLandroid/accounts/IAccountAuthenticatorResponse$Stub;->asInterface(Landroid/os/IBinder;)Landroid/accounts/IAccountAuthenticatorResponse;
 HPLandroid/accounts/IAccountAuthenticatorResponse$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/accounts/IAccountManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HSPLandroid/accounts/IAccountManager$Stub$Proxy;->getAccountsAsUser(Ljava/lang/String;ILjava/lang/String;)[Landroid/accounts/Account;
-HSPLandroid/accounts/IAccountManager$Stub$Proxy;->getAccountsByFeatures(Landroid/accounts/IAccountManagerResponse;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/accounts/IAccountManager$Stub$Proxy;->getAccountsByTypeForPackage(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)[Landroid/accounts/Account;
 HSPLandroid/accounts/IAccountManager$Stub$Proxy;->getAuthToken(Landroid/accounts/IAccountManagerResponse;Landroid/accounts/Account;Ljava/lang/String;ZZLandroid/os/Bundle;)V
-HSPLandroid/accounts/IAccountManager$Stub$Proxy;->getAuthenticatorTypes(I)[Landroid/accounts/AuthenticatorDescription;
-HSPLandroid/accounts/IAccountManager$Stub$Proxy;->getPassword(Landroid/accounts/Account;)Ljava/lang/String;
-HSPLandroid/accounts/IAccountManager$Stub$Proxy;->getUserData(Landroid/accounts/Account;Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/accounts/IAccountManager$Stub$Proxy;->hasFeatures(Landroid/accounts/IAccountManagerResponse;Landroid/accounts/Account;[Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/accounts/IAccountManager$Stub$Proxy;->invalidateAuthToken(Ljava/lang/String;Ljava/lang/String;)V
 HSPLandroid/accounts/IAccountManager$Stub$Proxy;->onAccountAccessed(Ljava/lang/String;)V
-HSPLandroid/accounts/IAccountManager$Stub$Proxy;->peekAuthToken(Landroid/accounts/Account;Ljava/lang/String;)Ljava/lang/String;
 HSPLandroid/accounts/IAccountManager$Stub$Proxy;->registerAccountListener([Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/accounts/IAccountManager$Stub$Proxy;->setAuthToken(Landroid/accounts/Account;Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/accounts/IAccountManager$Stub$Proxy;->setUserData(Landroid/accounts/Account;Ljava/lang/String;Ljava/lang/String;)V
 HSPLandroid/accounts/IAccountManager$Stub;-><init>()V
 HSPLandroid/accounts/IAccountManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/accounts/IAccountManager;
+PLandroid/accounts/IAccountManager$Stub;->getDefaultTransactionName(I)Ljava/lang/String;
 HPLandroid/accounts/IAccountManager$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HPLandroid/accounts/IAccountManagerResponse$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HPLandroid/accounts/IAccountManagerResponse$Stub$Proxy;->asBinder()Landroid/os/IBinder;
@@ -265,7 +201,6 @@
 HSPLandroid/animation/AnimatorSet$SeekState;->updateSeekDirection(Z)V
 HSPLandroid/animation/AnimatorSet;-><init>()V
 HSPLandroid/animation/AnimatorSet;->access$100(Landroid/animation/AnimatorSet;)Landroid/util/ArrayMap;
-HSPLandroid/animation/AnimatorSet;->access$200(Landroid/animation/AnimatorSet;)J
 HSPLandroid/animation/AnimatorSet;->access$300(Landroid/animation/AnimatorSet;)Z
 HSPLandroid/animation/AnimatorSet;->access$402(Landroid/animation/AnimatorSet;Z)Z
 HSPLandroid/animation/AnimatorSet;->access$500(Landroid/animation/AnimatorSet;Landroid/animation/Animator;)Landroid/animation/AnimatorSet$Node;
@@ -346,7 +281,6 @@
 HSPLandroid/animation/Keyframe$ObjectKeyframe;->clone()Landroid/animation/Keyframe$ObjectKeyframe;
 HSPLandroid/animation/Keyframe$ObjectKeyframe;->clone()Landroid/animation/Keyframe;
 HSPLandroid/animation/Keyframe$ObjectKeyframe;->getValue()Ljava/lang/Object;
-HSPLandroid/animation/Keyframe$ObjectKeyframe;->setValue(Ljava/lang/Object;)V
 HSPLandroid/animation/Keyframe;-><init>()V
 HSPLandroid/animation/Keyframe;->getFraction()F
 HSPLandroid/animation/Keyframe;->getInterpolator()Landroid/animation/TimeInterpolator;
@@ -544,8 +478,6 @@
 HSPLandroid/animation/PropertyValuesHolder;->setupStartValue(Ljava/lang/Object;)V
 HSPLandroid/animation/PropertyValuesHolder;->setupValue(Ljava/lang/Object;Landroid/animation/Keyframe;)V
 HSPLandroid/animation/RectEvaluator;-><init>(Landroid/graphics/Rect;)V
-HSPLandroid/animation/RevealAnimator;-><init>(Landroid/view/View;IIFF)V
-HSPLandroid/animation/RevealAnimator;->onFinished()V
 HSPLandroid/animation/StateListAnimator$1;-><init>(Landroid/animation/StateListAnimator;)V
 HSPLandroid/animation/StateListAnimator$1;->onAnimationEnd(Landroid/animation/Animator;)V
 HSPLandroid/animation/StateListAnimator$StateListAnimatorConstantState;-><init>(Landroid/animation/StateListAnimator;)V
@@ -627,6 +559,7 @@
 HSPLandroid/animation/ValueAnimator;->resolveDurationScale()F
 HSPLandroid/animation/ValueAnimator;->reverse()V
 HSPLandroid/animation/ValueAnimator;->setAllowRunningAsynchronously(Z)V
+HSPLandroid/animation/ValueAnimator;->setAnimationHandler(Landroid/animation/AnimationHandler;)V
 HSPLandroid/animation/ValueAnimator;->setCurrentFraction(F)V
 HSPLandroid/animation/ValueAnimator;->setCurrentPlayTime(J)V
 HSPLandroid/animation/ValueAnimator;->setDuration(J)Landroid/animation/Animator;
@@ -664,8 +597,6 @@
 HSPLandroid/app/-$$Lambda$ActivityThread$ApplicationThread$tUGFX7CUhzB4Pg5wFd5yeqOnu38;->accept(Ljava/lang/Object;Ljava/lang/Object;)V
 HSPLandroid/app/-$$Lambda$ActivityThread$Wg40iAoNYFxps_KmrqtgptTB054;-><init>(Landroid/app/ActivityThread;)V
 HSPLandroid/app/-$$Lambda$ActivityThread$Wg40iAoNYFxps_KmrqtgptTB054;->onConfigurationChanged(Landroid/content/res/Configuration;)V
-HSPLandroid/app/-$$Lambda$AppOpsManager$2$t9yQjThS21ls97TonVuHm6nv4N8;-><init>(Landroid/app/AppOpsManager$OnOpActiveChangedListener;IILjava/lang/String;Z)V
-HSPLandroid/app/-$$Lambda$AppOpsManager$2$t9yQjThS21ls97TonVuHm6nv4N8;->run()V
 HSPLandroid/app/-$$Lambda$AppOpsManager$4Zbi7CSLEt0nvOmfJBVYtJkauTQ;-><init>(Ljava/util/concurrent/Executor;Ljava/util/function/Consumer;)V
 HSPLandroid/app/-$$Lambda$AppOpsManager$4Zbi7CSLEt0nvOmfJBVYtJkauTQ;->onResult(Landroid/os/Bundle;)V
 HSPLandroid/app/-$$Lambda$AppOpsManager$HistoricalOp$DkVcBvqB32SMHlxw0sWQPh3GL1A;-><init>(Landroid/app/AppOpsManager$HistoricalOp;)V
@@ -684,6 +615,9 @@
 HSPLandroid/app/-$$Lambda$ResourcesManager$QJ7UiVk_XS90KuXAsIjIEym1DnM;->test(Ljava/lang/Object;)Z
 HSPLandroid/app/-$$Lambda$SharedPreferencesImpl$EditorImpl$3CAjkhzA131V3V-sLfP2uy0FWZ0;-><init>(Landroid/app/SharedPreferencesImpl$EditorImpl;Landroid/app/SharedPreferencesImpl$MemoryCommitResult;)V
 HSPLandroid/app/-$$Lambda$SharedPreferencesImpl$EditorImpl$3CAjkhzA131V3V-sLfP2uy0FWZ0;->run()V
+HSPLandroid/app/-$$Lambda$SystemServiceRegistry$16$s6mZ42tuGUunhKa_5iwjLY5FGdM;-><clinit>()V
+HSPLandroid/app/-$$Lambda$SystemServiceRegistry$16$s6mZ42tuGUunhKa_5iwjLY5FGdM;-><init>()V
+HSPLandroid/app/-$$Lambda$SystemServiceRegistry$16$s6mZ42tuGUunhKa_5iwjLY5FGdM;->get()Ljava/lang/Object;
 HSPLandroid/app/-$$Lambda$SystemServiceRegistry$17$DBwvhMLzjNnBFkaOY1OxllrybH4;-><clinit>()V
 HSPLandroid/app/-$$Lambda$SystemServiceRegistry$17$DBwvhMLzjNnBFkaOY1OxllrybH4;-><init>()V
 HSPLandroid/app/-$$Lambda$SystemServiceRegistry$17$DBwvhMLzjNnBFkaOY1OxllrybH4;->get()Ljava/lang/Object;
@@ -712,14 +646,12 @@
 HSPLandroid/app/Activity;->access$100(Landroid/app/Activity;)Landroid/app/ActivityManager$TaskDescription;
 HSPLandroid/app/Activity;->attach(Landroid/content/Context;Landroid/app/ActivityThread;Landroid/app/Instrumentation;Landroid/os/IBinder;ILandroid/app/Application;Landroid/content/Intent;Landroid/content/pm/ActivityInfo;Ljava/lang/CharSequence;Landroid/app/Activity;Ljava/lang/String;Landroid/app/Activity$NonConfigurationInstances;Landroid/content/res/Configuration;Ljava/lang/String;Lcom/android/internal/app/IVoiceInteractor;Landroid/view/Window;Landroid/view/ViewRootImpl$ActivityConfigCallback;Landroid/os/IBinder;)V
 HSPLandroid/app/Activity;->attachBaseContext(Landroid/content/Context;)V
-HSPLandroid/app/Activity;->autofillClientFindViewByAutofillIdTraversal(Landroid/view/autofill/AutofillId;)Landroid/view/View;
 HSPLandroid/app/Activity;->autofillClientGetActivityToken()Landroid/os/IBinder;
 HSPLandroid/app/Activity;->autofillClientGetComponentName()Landroid/content/ComponentName;
 HSPLandroid/app/Activity;->autofillClientIsFillUiShowing()Z
 HSPLandroid/app/Activity;->autofillClientRequestHideFillUi()Z
 HSPLandroid/app/Activity;->autofillClientResetableStateAvailable()V
 HSPLandroid/app/Activity;->autofillClientRunOnUiThread(Ljava/lang/Runnable;)V
-HSPLandroid/app/Activity;->canStartActivityForResult()Z
 HSPLandroid/app/Activity;->cancelInputsAndStartExitTransition(Landroid/os/Bundle;)V
 HSPLandroid/app/Activity;->collectActivityLifecycleCallbacks()[Ljava/lang/Object;
 HSPLandroid/app/Activity;->dispatchActivityCreated(Landroid/os/Bundle;)V
@@ -753,13 +685,11 @@
 HSPLandroid/app/Activity;->finish()V
 HSPLandroid/app/Activity;->finish(I)V
 HSPLandroid/app/Activity;->finishAfterTransition()V
-HSPLandroid/app/Activity;->finishAndRemoveTask()V
 HSPLandroid/app/Activity;->getActivityOptions()Landroid/app/ActivityOptions;
 HSPLandroid/app/Activity;->getActivityToken()Landroid/os/IBinder;
 HSPLandroid/app/Activity;->getApplication()Landroid/app/Application;
 HSPLandroid/app/Activity;->getAutofillClient()Landroid/view/autofill/AutofillManager$AutofillClient;
 HSPLandroid/app/Activity;->getAutofillManager()Landroid/view/autofill/AutofillManager;
-HSPLandroid/app/Activity;->getCallingActivity()Landroid/content/ComponentName;
 HSPLandroid/app/Activity;->getCallingPackage()Ljava/lang/String;
 HSPLandroid/app/Activity;->getComponentName()Landroid/content/ComponentName;
 HSPLandroid/app/Activity;->getContentCaptureManager()Landroid/view/contentcapture/ContentCaptureManager;
@@ -773,10 +703,8 @@
 HSPLandroid/app/Activity;->getReferrer()Landroid/net/Uri;
 HSPLandroid/app/Activity;->getRequestedOrientation()I
 HSPLandroid/app/Activity;->getSystemService(Ljava/lang/String;)Ljava/lang/Object;
-HSPLandroid/app/Activity;->getTaskId()I
 HSPLandroid/app/Activity;->getTitle()Ljava/lang/CharSequence;
 HSPLandroid/app/Activity;->getTitleColor()I
-HSPLandroid/app/Activity;->getVolumeControlStream()I
 HSPLandroid/app/Activity;->getWindow()Landroid/view/Window;
 HSPLandroid/app/Activity;->getWindowManager()Landroid/view/WindowManager;
 HSPLandroid/app/Activity;->initWindowDecorActionBar()V
@@ -789,9 +717,6 @@
 HSPLandroid/app/Activity;->isTaskRoot()Z
 HSPLandroid/app/Activity;->makeVisible()V
 HSPLandroid/app/Activity;->notifyContentCaptureManagerIfNeeded(I)V
-HSPLandroid/app/Activity;->onActionModeFinished(Landroid/view/ActionMode;)V
-HSPLandroid/app/Activity;->onActionModeStarted(Landroid/view/ActionMode;)V
-HSPLandroid/app/Activity;->onActivityResult(IILandroid/content/Intent;)V
 HSPLandroid/app/Activity;->onApplyThemeResource(Landroid/content/res/Resources$Theme;IZ)V
 HSPLandroid/app/Activity;->onAttachFragment(Landroid/app/Fragment;)V
 HSPLandroid/app/Activity;->onAttachedToWindow()V
@@ -802,7 +727,6 @@
 HSPLandroid/app/Activity;->onCreateDescription()Ljava/lang/CharSequence;
 HSPLandroid/app/Activity;->onCreateOptionsMenu(Landroid/view/Menu;)Z
 HSPLandroid/app/Activity;->onCreatePanelMenu(ILandroid/view/Menu;)Z
-HSPLandroid/app/Activity;->onCreatePanelView(I)Landroid/view/View;
 HSPLandroid/app/Activity;->onCreateView(Landroid/view/View;Ljava/lang/String;Landroid/content/Context;Landroid/util/AttributeSet;)Landroid/view/View;
 HSPLandroid/app/Activity;->onCreateView(Ljava/lang/String;Landroid/content/Context;Landroid/util/AttributeSet;)Landroid/view/View;
 HSPLandroid/app/Activity;->onDestroy()V
@@ -811,10 +735,7 @@
 HSPLandroid/app/Activity;->onKeyDown(ILandroid/view/KeyEvent;)Z
 HSPLandroid/app/Activity;->onKeyUp(ILandroid/view/KeyEvent;)Z
 HSPLandroid/app/Activity;->onLowMemory()V
-HSPLandroid/app/Activity;->onMenuItemSelected(ILandroid/view/MenuItem;)Z
 HSPLandroid/app/Activity;->onNewIntent(Landroid/content/Intent;)V
-HSPLandroid/app/Activity;->onOptionsItemSelected(Landroid/view/MenuItem;)Z
-HSPLandroid/app/Activity;->onPanelClosed(ILandroid/view/Menu;)V
 HSPLandroid/app/Activity;->onPause()V
 HSPLandroid/app/Activity;->onPictureInPictureRequested()V
 HSPLandroid/app/Activity;->onPictureInPictureRequested()Z
@@ -839,8 +760,6 @@
 HSPLandroid/app/Activity;->onUserLeaveHint()V
 HSPLandroid/app/Activity;->onWindowAttributesChanged(Landroid/view/WindowManager$LayoutParams;)V
 HSPLandroid/app/Activity;->onWindowFocusChanged(Z)V
-HSPLandroid/app/Activity;->onWindowStartingActionMode(Landroid/view/ActionMode$Callback;)Landroid/view/ActionMode;
-HSPLandroid/app/Activity;->onWindowStartingActionMode(Landroid/view/ActionMode$Callback;I)Landroid/view/ActionMode;
 HSPLandroid/app/Activity;->overridePendingTransition(II)V
 HSPLandroid/app/Activity;->performCreate(Landroid/os/Bundle;)V
 HSPLandroid/app/Activity;->performCreate(Landroid/os/Bundle;Landroid/os/PersistableBundle;)V
@@ -857,7 +776,6 @@
 HSPLandroid/app/Activity;->performUserLeaving()V
 HSPLandroid/app/Activity;->registerActivityLifecycleCallbacks(Landroid/app/Application$ActivityLifecycleCallbacks;)V
 HSPLandroid/app/Activity;->reportFullyDrawn()V
-HSPLandroid/app/Activity;->requestWindowFeature(I)Z
 HSPLandroid/app/Activity;->restoreHasCurrentPermissionRequest(Landroid/os/Bundle;)V
 HSPLandroid/app/Activity;->restoreManagedDialogs(Landroid/os/Bundle;)V
 HSPLandroid/app/Activity;->retainNonConfigurationInstances()Landroid/app/Activity$NonConfigurationInstances;
@@ -867,13 +785,11 @@
 HSPLandroid/app/Activity;->setContentView(Landroid/view/View;)V
 HSPLandroid/app/Activity;->setIntent(Landroid/content/Intent;)V
 HSPLandroid/app/Activity;->setRequestedOrientation(I)V
-HSPLandroid/app/Activity;->setResult(I)V
 HSPLandroid/app/Activity;->setResult(ILandroid/content/Intent;)V
 HSPLandroid/app/Activity;->setTaskDescription(Landroid/app/ActivityManager$TaskDescription;)V
 HSPLandroid/app/Activity;->setTheme(I)V
 HSPLandroid/app/Activity;->setTitle(I)V
 HSPLandroid/app/Activity;->setTitle(Ljava/lang/CharSequence;)V
-HSPLandroid/app/Activity;->setVolumeControlStream(I)V
 HSPLandroid/app/Activity;->startActivity(Landroid/content/Intent;)V
 HSPLandroid/app/Activity;->startActivity(Landroid/content/Intent;Landroid/os/Bundle;)V
 HSPLandroid/app/Activity;->startActivityForResult(Landroid/content/Intent;I)V
@@ -882,8 +798,6 @@
 HSPLandroid/app/Activity;->transferSpringboardActivityOptions(Landroid/os/Bundle;)Landroid/os/Bundle;
 HSPLandroid/app/ActivityManager$1;->create()Landroid/app/IActivityManager;
 HSPLandroid/app/ActivityManager$1;->create()Ljava/lang/Object;
-HSPLandroid/app/ActivityManager$AppTask;-><init>(Landroid/app/IAppTask;)V
-HSPLandroid/app/ActivityManager$AppTask;->getTaskInfo()Landroid/app/ActivityManager$RecentTaskInfo;
 HSPLandroid/app/ActivityManager$MemoryInfo;-><init>()V
 HSPLandroid/app/ActivityManager$MemoryInfo;->readFromParcel(Landroid/os/Parcel;)V
 HPLandroid/app/ActivityManager$MemoryInfo;->writeToParcel(Landroid/os/Parcel;I)V
@@ -909,9 +823,6 @@
 HPLandroid/app/ActivityManager$RunningAppProcessInfo;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/app/ActivityManager$RunningServiceInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/ActivityManager$RunningServiceInfo;
 HSPLandroid/app/ActivityManager$RunningServiceInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HPLandroid/app/ActivityManager$RunningServiceInfo;-><init>()V
-HSPLandroid/app/ActivityManager$RunningServiceInfo;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/app/ActivityManager$RunningServiceInfo;-><init>(Landroid/os/Parcel;Landroid/app/ActivityManager$1;)V
 HSPLandroid/app/ActivityManager$RunningServiceInfo;->readFromParcel(Landroid/os/Parcel;)V
 HPLandroid/app/ActivityManager$RunningServiceInfo;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/app/ActivityManager$RunningTaskInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/ActivityManager$RunningTaskInfo;
@@ -934,8 +845,8 @@
 HSPLandroid/app/ActivityManager$TaskDescription;-><init>(Landroid/app/ActivityManager$TaskDescription;)V
 HSPLandroid/app/ActivityManager$TaskDescription;-><init>(Landroid/os/Parcel;)V
 HSPLandroid/app/ActivityManager$TaskDescription;-><init>(Landroid/os/Parcel;Landroid/app/ActivityManager$1;)V
-HSPLandroid/app/ActivityManager$TaskDescription;-><init>(Ljava/lang/String;Landroid/graphics/Bitmap;I)V
 HSPLandroid/app/ActivityManager$TaskDescription;-><init>(Ljava/lang/String;Landroid/graphics/Bitmap;ILjava/lang/String;IIIIZZIII)V
+HSPLandroid/app/ActivityManager$TaskDescription;-><init>(Ljava/lang/String;Landroid/graphics/drawable/Icon;IIIIZZIII)V
 HSPLandroid/app/ActivityManager$TaskDescription;->copyFrom(Landroid/app/ActivityManager$TaskDescription;)V
 HSPLandroid/app/ActivityManager$TaskDescription;->copyFromPreserveHiddenFields(Landroid/app/ActivityManager$TaskDescription;)V
 HSPLandroid/app/ActivityManager$TaskDescription;->getBackgroundColor()I
@@ -951,13 +862,12 @@
 HSPLandroid/app/ActivityManager$TaskDescription;->getStatusBarColor()I
 HSPLandroid/app/ActivityManager$TaskDescription;->loadTaskDescriptionIcon(Ljava/lang/String;I)Landroid/graphics/Bitmap;
 HSPLandroid/app/ActivityManager$TaskDescription;->readFromParcel(Landroid/os/Parcel;)V
-HPLandroid/app/ActivityManager$TaskDescription;->restoreFromXml(Ljava/lang/String;Ljava/lang/String;)V
 HPLandroid/app/ActivityManager$TaskDescription;->saveToXml(Lorg/xmlpull/v1/XmlSerializer;)V
 HSPLandroid/app/ActivityManager$TaskDescription;->setBackgroundColor(I)V
 HSPLandroid/app/ActivityManager$TaskDescription;->setEnsureNavigationBarContrastWhenTransparent(Z)V
 HSPLandroid/app/ActivityManager$TaskDescription;->setEnsureStatusBarContrastWhenTransparent(Z)V
 HSPLandroid/app/ActivityManager$TaskDescription;->setIcon(I)V
-HSPLandroid/app/ActivityManager$TaskDescription;->setIcon(Landroid/graphics/Bitmap;)V
+HSPLandroid/app/ActivityManager$TaskDescription;->setIcon(Landroid/graphics/drawable/Icon;)V
 HSPLandroid/app/ActivityManager$TaskDescription;->setIconFilename(Ljava/lang/String;)V
 HSPLandroid/app/ActivityManager$TaskDescription;->setLabel(Ljava/lang/String;)V
 HSPLandroid/app/ActivityManager$TaskDescription;->setMinHeight(I)V
@@ -972,7 +882,6 @@
 HPLandroid/app/ActivityManager$TaskSnapshot$Builder;-><init>()V
 HPLandroid/app/ActivityManager$TaskSnapshot$Builder;->build()Landroid/app/ActivityManager$TaskSnapshot;
 HPLandroid/app/ActivityManager$TaskSnapshot$Builder;->getPixelFormat()I
-HPLandroid/app/ActivityManager$TaskSnapshot$Builder;->getScaleFraction()F
 HPLandroid/app/ActivityManager$TaskSnapshot$Builder;->setColorSpace(Landroid/graphics/ColorSpace;)Landroid/app/ActivityManager$TaskSnapshot$Builder;
 HPLandroid/app/ActivityManager$TaskSnapshot$Builder;->setContentInsets(Landroid/graphics/Rect;)Landroid/app/ActivityManager$TaskSnapshot$Builder;
 HPLandroid/app/ActivityManager$TaskSnapshot$Builder;->setId(J)Landroid/app/ActivityManager$TaskSnapshot$Builder;
@@ -980,8 +889,7 @@
 HPLandroid/app/ActivityManager$TaskSnapshot$Builder;->setIsTranslucent(Z)Landroid/app/ActivityManager$TaskSnapshot$Builder;
 HPLandroid/app/ActivityManager$TaskSnapshot$Builder;->setOrientation(I)Landroid/app/ActivityManager$TaskSnapshot$Builder;
 HPLandroid/app/ActivityManager$TaskSnapshot$Builder;->setPixelFormat(I)Landroid/app/ActivityManager$TaskSnapshot$Builder;
-HPLandroid/app/ActivityManager$TaskSnapshot$Builder;->setReducedResolution(Z)Landroid/app/ActivityManager$TaskSnapshot$Builder;
-HPLandroid/app/ActivityManager$TaskSnapshot$Builder;->setScaleFraction(F)Landroid/app/ActivityManager$TaskSnapshot$Builder;
+HPLandroid/app/ActivityManager$TaskSnapshot$Builder;->setRotation(I)Landroid/app/ActivityManager$TaskSnapshot$Builder;
 HPLandroid/app/ActivityManager$TaskSnapshot$Builder;->setSnapshot(Landroid/graphics/GraphicBuffer;)Landroid/app/ActivityManager$TaskSnapshot$Builder;
 HPLandroid/app/ActivityManager$TaskSnapshot$Builder;->setSystemUiVisibility(I)Landroid/app/ActivityManager$TaskSnapshot$Builder;
 HPLandroid/app/ActivityManager$TaskSnapshot$Builder;->setTopActivityComponent(Landroid/content/ComponentName;)Landroid/app/ActivityManager$TaskSnapshot$Builder;
@@ -996,6 +904,7 @@
 HSPLandroid/app/ActivityManager$TaskSnapshot;->getScale()F
 HSPLandroid/app/ActivityManager$TaskSnapshot;->getSnapshot()Landroid/graphics/GraphicBuffer;
 HSPLandroid/app/ActivityManager$TaskSnapshot;->getSystemUiVisibility()I
+HSPLandroid/app/ActivityManager$TaskSnapshot;->getTaskSize()Landroid/graphics/Point;
 HPLandroid/app/ActivityManager$TaskSnapshot;->getTopActivityComponent()Landroid/content/ComponentName;
 HSPLandroid/app/ActivityManager$TaskSnapshot;->getWindowingMode()I
 HSPLandroid/app/ActivityManager$TaskSnapshot;->isRealSnapshot()Z
@@ -1011,7 +920,6 @@
 HSPLandroid/app/ActivityManager;->broadcastStickyIntent(Landroid/content/Intent;II)V
 HSPLandroid/app/ActivityManager;->checkComponentPermission(Ljava/lang/String;IIZ)I
 HSPLandroid/app/ActivityManager;->checkUidPermission(Ljava/lang/String;I)I
-HSPLandroid/app/ActivityManager;->getAppTasks()Ljava/util/List;
 HSPLandroid/app/ActivityManager;->getCurrentUser()I
 HSPLandroid/app/ActivityManager;->getDeviceConfigurationInfo()Landroid/content/pm/ConfigurationInfo;
 HSPLandroid/app/ActivityManager;->getLauncherLargeIconSize()I
@@ -1050,13 +958,14 @@
 HSPLandroid/app/ActivityManagerInternal;-><init>()V
 HSPLandroid/app/ActivityOptions;-><init>()V
 HSPLandroid/app/ActivityOptions;-><init>(Landroid/os/Bundle;)V
+HPLandroid/app/ActivityOptions;->abort()V
 HPLandroid/app/ActivityOptions;->abort(Landroid/app/ActivityOptions;)V
 HSPLandroid/app/ActivityOptions;->disallowEnterPictureInPictureWhileLaunching()Z
 HSPLandroid/app/ActivityOptions;->freezeRecentTasksReordering()Z
 HSPLandroid/app/ActivityOptions;->fromBundle(Landroid/os/Bundle;)Landroid/app/ActivityOptions;
 HSPLandroid/app/ActivityOptions;->getAnimationType()I
 HSPLandroid/app/ActivityOptions;->getAvoidMoveToFront()Z
-PLandroid/app/ActivityOptions;->getCallerDisplayId()I
+HPLandroid/app/ActivityOptions;->getCallerDisplayId()I
 HPLandroid/app/ActivityOptions;->getLaunchActivityType()I
 HSPLandroid/app/ActivityOptions;->getLaunchBounds()Landroid/graphics/Rect;
 HSPLandroid/app/ActivityOptions;->getLaunchDisplayId()I
@@ -1137,7 +1046,6 @@
 HSPLandroid/app/ActivityThread$ApplicationThread;->scheduleCreateService(Landroid/os/IBinder;Landroid/content/pm/ServiceInfo;Landroid/content/res/CompatibilityInfo;I)V
 HSPLandroid/app/ActivityThread$ApplicationThread;->scheduleDestroyBackupAgent(Landroid/content/pm/ApplicationInfo;Landroid/content/res/CompatibilityInfo;I)V
 HSPLandroid/app/ActivityThread$ApplicationThread;->scheduleEnterAnimationComplete(Landroid/os/IBinder;)V
-HSPLandroid/app/ActivityThread$ApplicationThread;->scheduleInstallProvider(Landroid/content/pm/ProviderInfo;)V
 PLandroid/app/ActivityThread$ApplicationThread;->scheduleLowMemory()V
 HSPLandroid/app/ActivityThread$ApplicationThread;->scheduleReceiver(Landroid/content/Intent;Landroid/content/pm/ActivityInfo;Landroid/content/res/CompatibilityInfo;ILjava/lang/String;Landroid/os/Bundle;ZII)V
 HSPLandroid/app/ActivityThread$ApplicationThread;->scheduleRegisteredReceiver(Landroid/content/IIntentReceiver;Landroid/content/Intent;ILjava/lang/String;Landroid/os/Bundle;ZZII)V
@@ -1152,7 +1060,6 @@
 HSPLandroid/app/ActivityThread$ApplicationThread;->setProcessState(I)V
 HSPLandroid/app/ActivityThread$ApplicationThread;->unstableProviderDied(Landroid/os/IBinder;)V
 HSPLandroid/app/ActivityThread$ApplicationThread;->updateHttpProxy()V
-HSPLandroid/app/ActivityThread$ApplicationThread;->updateTimeZone()V
 HSPLandroid/app/ActivityThread$BindServiceData;-><init>()V
 HSPLandroid/app/ActivityThread$ContextCleanupInfo;-><init>()V
 HSPLandroid/app/ActivityThread$CreateBackupAgentData;-><init>()V
@@ -1271,7 +1178,6 @@
 HSPLandroid/app/ActivityThread;->handleDumpProvider(Landroid/app/ActivityThread$DumpComponentInfo;)V
 HSPLandroid/app/ActivityThread;->handleDumpService(Landroid/app/ActivityThread$DumpComponentInfo;)V
 HSPLandroid/app/ActivityThread;->handleEnterAnimationComplete(Landroid/os/IBinder;)V
-HSPLandroid/app/ActivityThread;->handleInstallProvider(Landroid/content/pm/ProviderInfo;)V
 HSPLandroid/app/ActivityThread;->handleLaunchActivity(Landroid/app/ActivityThread$ActivityClientRecord;Landroid/app/servertransaction/PendingTransactionActions;Landroid/content/Intent;)Landroid/app/Activity;
 HPLandroid/app/ActivityThread;->handleLowMemory()V
 HSPLandroid/app/ActivityThread;->handleNewIntent(Landroid/os/IBinder;Ljava/util/List;)V
@@ -1358,7 +1264,6 @@
 HSPLandroid/app/ActivityTransitionState;->saveState(Landroid/os/Bundle;)V
 HSPLandroid/app/ActivityTransitionState;->setEnterActivityOptions(Landroid/app/Activity;Landroid/app/ActivityOptions;)V
 HSPLandroid/app/ActivityTransitionState;->startExitBackTransition(Landroid/app/Activity;)Z
-HSPLandroid/app/ActivityTransitionState;->startExitOutTransition(Landroid/app/Activity;Landroid/os/Bundle;)V
 HSPLandroid/app/AlarmManager$AlarmClockInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/AlarmManager$AlarmClockInfo;
 HSPLandroid/app/AlarmManager$AlarmClockInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/app/AlarmManager$AlarmClockInfo;-><init>(Landroid/os/Parcel;)V
@@ -1373,21 +1278,18 @@
 HSPLandroid/app/AlarmManager;->access$100()Landroid/util/ArrayMap;
 HSPLandroid/app/AlarmManager;->cancel(Landroid/app/AlarmManager$OnAlarmListener;)V
 HSPLandroid/app/AlarmManager;->cancel(Landroid/app/PendingIntent;)V
-HSPLandroid/app/AlarmManager;->getNextAlarmClock()Landroid/app/AlarmManager$AlarmClockInfo;
 HSPLandroid/app/AlarmManager;->getNextAlarmClock(I)Landroid/app/AlarmManager$AlarmClockInfo;
 HPLandroid/app/AlarmManager;->getNextWakeFromIdleTime()J
 HSPLandroid/app/AlarmManager;->legacyExactLength()J
-HSPLandroid/app/AlarmManager;->set(IJJJLandroid/app/PendingIntent;Landroid/os/WorkSource;)V
 HSPLandroid/app/AlarmManager;->set(IJJJLjava/lang/String;Landroid/app/AlarmManager$OnAlarmListener;Landroid/os/Handler;Landroid/os/WorkSource;)V
 HSPLandroid/app/AlarmManager;->set(IJLandroid/app/PendingIntent;)V
 HSPLandroid/app/AlarmManager;->set(IJLjava/lang/String;Landroid/app/AlarmManager$OnAlarmListener;Landroid/os/Handler;)V
-HSPLandroid/app/AlarmManager;->setAndAllowWhileIdle(IJLandroid/app/PendingIntent;)V
 HSPLandroid/app/AlarmManager;->setExact(IJLandroid/app/PendingIntent;)V
 HSPLandroid/app/AlarmManager;->setExact(IJLjava/lang/String;Landroid/app/AlarmManager$OnAlarmListener;Landroid/os/Handler;)V
 HSPLandroid/app/AlarmManager;->setExactAndAllowWhileIdle(IJLandroid/app/PendingIntent;)V
 HSPLandroid/app/AlarmManager;->setImpl(IJJJILandroid/app/PendingIntent;Landroid/app/AlarmManager$OnAlarmListener;Ljava/lang/String;Landroid/os/Handler;Landroid/os/WorkSource;Landroid/app/AlarmManager$AlarmClockInfo;)V
 HSPLandroid/app/AlarmManager;->setInexactRepeating(IJJLandroid/app/PendingIntent;)V
-HSPLandroid/app/AlarmManager;->setWindow(IJJLandroid/app/PendingIntent;)V
+PLandroid/app/AlarmManager;->setTime(J)V
 HSPLandroid/app/AlarmManager;->setWindow(IJJLjava/lang/String;Landroid/app/AlarmManager$OnAlarmListener;Landroid/os/Handler;)V
 HSPLandroid/app/AlertDialog$Builder;-><init>(Landroid/content/Context;)V
 HSPLandroid/app/AlertDialog$Builder;-><init>(Landroid/content/Context;I)V
@@ -1398,7 +1300,6 @@
 HSPLandroid/app/AlertDialog;->access$000(Landroid/app/AlertDialog;)Lcom/android/internal/app/AlertController;
 HSPLandroid/app/AlertDialog;->onCreate(Landroid/os/Bundle;)V
 HSPLandroid/app/AlertDialog;->resolveDialogTheme(Landroid/content/Context;I)I
-HSPLandroid/app/AlertDialog;->setTitle(Ljava/lang/CharSequence;)V
 HSPLandroid/app/AlertDialog;->setView(Landroid/view/View;)V
 HSPLandroid/app/AppCompatCallbacks;-><init>([J)V
 HSPLandroid/app/AppCompatCallbacks;->install([J)V
@@ -1416,37 +1317,20 @@
 HSPLandroid/app/AppGlobals;->getPackageManager()Landroid/content/pm/IPackageManager;
 HSPLandroid/app/AppGlobals;->getPermissionManager()Landroid/permission/IPermissionManager;
 HSPLandroid/app/AppOpsManager$1;-><init>(Landroid/app/AppOpsManager;Landroid/app/AppOpsManager$OnOpChangedListener;)V
+HSPLandroid/app/AppOpsManager$1;->onSelfNoted(Landroid/app/SyncNotedAppOp;)V
 HSPLandroid/app/AppOpsManager$1;->opChanged(IILjava/lang/String;)V
+HSPLandroid/app/AppOpsManager$1;->reportStackTraceIfNeeded(Landroid/app/SyncNotedAppOp;)V
+HSPLandroid/app/AppOpsManager$2;-><init>(Landroid/app/AppOpsManager;Landroid/app/AppOpsManager$OnOpChangedListener;)V
 HSPLandroid/app/AppOpsManager$2;-><init>(Landroid/app/AppOpsManager;Ljava/util/concurrent/Executor;Landroid/app/AppOpsManager$OnOpActiveChangedListener;)V
-HSPLandroid/app/AppOpsManager$2;->lambda$opActiveChanged$0(Landroid/app/AppOpsManager$OnOpActiveChangedListener;IILjava/lang/String;Z)V
-HSPLandroid/app/AppOpsManager$2;->opActiveChanged(IILjava/lang/String;Z)V
-HSPLandroid/app/AppOpsManager$3;->opNoted(IILjava/lang/String;I)V
-HSPLandroid/app/AppOpsManager$HistoricalFeatureOps$1;-><init>()V
-HSPLandroid/app/AppOpsManager$HistoricalFeatureOps;-><clinit>()V
-HSPLandroid/app/AppOpsManager$HistoricalFeatureOps;-><init>(Ljava/lang/String;)V
-HPLandroid/app/AppOpsManager$HistoricalFeatureOps;-><init>(Ljava/lang/String;Landroid/util/ArrayMap;)V
-HPLandroid/app/AppOpsManager$HistoricalFeatureOps;->access$2900(Landroid/app/AppOpsManager$HistoricalFeatureOps;Landroid/app/AppOpsManager$HistoricalFeatureOps;)V
-HPLandroid/app/AppOpsManager$HistoricalFeatureOps;->access$3200(Landroid/app/AppOpsManager$HistoricalFeatureOps;)Z
-HSPLandroid/app/AppOpsManager$HistoricalFeatureOps;->access$3300(Landroid/app/AppOpsManager$HistoricalFeatureOps;IIIJ)V
-HSPLandroid/app/AppOpsManager$HistoricalFeatureOps;->access$3400(Landroid/app/AppOpsManager$HistoricalFeatureOps;IIIJ)V
-HSPLandroid/app/AppOpsManager$HistoricalFeatureOps;->access$3500(Landroid/app/AppOpsManager$HistoricalFeatureOps;IIIJ)V
-HSPLandroid/app/AppOpsManager$HistoricalFeatureOps;->getFeatureId()Ljava/lang/String;
-HSPLandroid/app/AppOpsManager$HistoricalFeatureOps;->getOp(Ljava/lang/String;)Landroid/app/AppOpsManager$HistoricalOp;
-HSPLandroid/app/AppOpsManager$HistoricalFeatureOps;->getOpAt(I)Landroid/app/AppOpsManager$HistoricalOp;
-HSPLandroid/app/AppOpsManager$HistoricalFeatureOps;->getOpCount()I
-HSPLandroid/app/AppOpsManager$HistoricalFeatureOps;->getOrCreateHistoricalOp(I)Landroid/app/AppOpsManager$HistoricalOp;
-HSPLandroid/app/AppOpsManager$HistoricalFeatureOps;->increaseAccessCount(IIIJ)V
-HSPLandroid/app/AppOpsManager$HistoricalFeatureOps;->increaseAccessDuration(IIIJ)V
-HSPLandroid/app/AppOpsManager$HistoricalFeatureOps;->increaseRejectCount(IIIJ)V
-HSPLandroid/app/AppOpsManager$HistoricalFeatureOps;->isEmpty()Z
-HSPLandroid/app/AppOpsManager$HistoricalFeatureOps;->merge(Landroid/app/AppOpsManager$HistoricalFeatureOps;)V
-HPLandroid/app/AppOpsManager$HistoricalFeatureOps;->splice(D)Landroid/app/AppOpsManager$HistoricalFeatureOps;
+HSPLandroid/app/AppOpsManager$2;->opChanged(IILjava/lang/String;)V
+HSPLandroid/app/AppOpsManager$3;-><init>(Landroid/app/AppOpsManager;Ljava/util/concurrent/Executor;Landroid/app/AppOpsManager$OnOpActiveChangedListener;)V
+HSPLandroid/app/AppOpsManager$4;-><init>(Landroid/app/AppOpsManager;Landroid/app/AppOpsManager$OnOpNotedListener;)V
+HSPLandroid/app/AppOpsManager$4;->opNoted(IILjava/lang/String;I)V
+HSPLandroid/app/AppOpsManager$AttributedOpEntry$1;-><init>()V
+HSPLandroid/app/AppOpsManager$AttributedOpEntry$LongSparseArrayParceling;-><init>()V
+HSPLandroid/app/AppOpsManager$AttributedOpEntry$LongSparseArrayParceling;-><init>(Landroid/app/AppOpsManager$1;)V
+HSPLandroid/app/AppOpsManager$AttributedOpEntry;-><clinit>()V
 HSPLandroid/app/AppOpsManager$HistoricalOp;-><init>(I)V
-HPLandroid/app/AppOpsManager$HistoricalOp;->access$3700(Landroid/app/AppOpsManager$HistoricalOp;Landroid/app/AppOpsManager$HistoricalOp;)V
-HPLandroid/app/AppOpsManager$HistoricalOp;->access$4100(Landroid/app/AppOpsManager$HistoricalOp;)Z
-HSPLandroid/app/AppOpsManager$HistoricalOp;->access$4200(Landroid/app/AppOpsManager$HistoricalOp;IIJ)V
-HSPLandroid/app/AppOpsManager$HistoricalOp;->access$4300(Landroid/app/AppOpsManager$HistoricalOp;IIJ)V
-HSPLandroid/app/AppOpsManager$HistoricalOp;->access$4400(Landroid/app/AppOpsManager$HistoricalOp;IIJ)V
 HSPLandroid/app/AppOpsManager$HistoricalOp;->getOpName()Ljava/lang/String;
 HSPLandroid/app/AppOpsManager$HistoricalOp;->getOrCreateAccessCount()Landroid/util/LongSparseLongArray;
 HSPLandroid/app/AppOpsManager$HistoricalOp;->getOrCreateAccessDuration()Landroid/util/LongSparseLongArray;
@@ -1477,7 +1361,6 @@
 HSPLandroid/app/AppOpsManager$HistoricalOps;->increaseRejectCount(IILjava/lang/String;Ljava/lang/String;IIJ)V
 HSPLandroid/app/AppOpsManager$HistoricalOps;->isEmpty()Z
 HSPLandroid/app/AppOpsManager$HistoricalOps;->merge(Landroid/app/AppOpsManager$HistoricalOps;)V
-HSPLandroid/app/AppOpsManager$HistoricalOps;->offsetBeginAndEndTime(J)V
 HSPLandroid/app/AppOpsManager$HistoricalOps;->round(D)D
 HSPLandroid/app/AppOpsManager$HistoricalOps;->setBeginAndEndTime(JJ)V
 HSPLandroid/app/AppOpsManager$HistoricalOps;->setEndTime(J)V
@@ -1488,13 +1371,6 @@
 HSPLandroid/app/AppOpsManager$HistoricalOpsRequest;-><init>(ILjava/lang/String;Ljava/lang/String;Ljava/util/List;IJJILandroid/app/AppOpsManager$1;)V
 HSPLandroid/app/AppOpsManager$HistoricalOpsRequest;->access$5900(Landroid/app/AppOpsManager$HistoricalOpsRequest;)I
 HSPLandroid/app/AppOpsManager$HistoricalPackageOps;-><init>(Ljava/lang/String;)V
-HSPLandroid/app/AppOpsManager$HistoricalPackageOps;->access$2200(Landroid/app/AppOpsManager$HistoricalPackageOps;ILjava/lang/String;IIJ)V
-HSPLandroid/app/AppOpsManager$HistoricalPackageOps;->access$2300(Landroid/app/AppOpsManager$HistoricalPackageOps;ILjava/lang/String;IIJ)V
-HSPLandroid/app/AppOpsManager$HistoricalPackageOps;->access$2400(Landroid/app/AppOpsManager$HistoricalPackageOps;ILjava/lang/String;IIJ)V
-HSPLandroid/app/AppOpsManager$HistoricalPackageOps;->getFeatureCount()I
-HSPLandroid/app/AppOpsManager$HistoricalPackageOps;->getFeatureOps(Ljava/lang/String;)Landroid/app/AppOpsManager$HistoricalFeatureOps;
-HSPLandroid/app/AppOpsManager$HistoricalPackageOps;->getFeatureOpsAt(I)Landroid/app/AppOpsManager$HistoricalFeatureOps;
-HSPLandroid/app/AppOpsManager$HistoricalPackageOps;->getOrCreateHistoricalFeatureOps(Ljava/lang/String;)Landroid/app/AppOpsManager$HistoricalFeatureOps;
 HSPLandroid/app/AppOpsManager$HistoricalPackageOps;->getPackageName()Ljava/lang/String;
 HSPLandroid/app/AppOpsManager$HistoricalPackageOps;->increaseAccessCount(ILjava/lang/String;IIJ)V
 HSPLandroid/app/AppOpsManager$HistoricalPackageOps;->increaseAccessDuration(ILjava/lang/String;IIJ)V
@@ -1503,9 +1379,6 @@
 HSPLandroid/app/AppOpsManager$HistoricalPackageOps;->merge(Landroid/app/AppOpsManager$HistoricalPackageOps;)V
 HPLandroid/app/AppOpsManager$HistoricalPackageOps;->splice(D)Landroid/app/AppOpsManager$HistoricalPackageOps;
 HSPLandroid/app/AppOpsManager$HistoricalUidOps;-><init>(I)V
-HSPLandroid/app/AppOpsManager$HistoricalUidOps;->access$1100(Landroid/app/AppOpsManager$HistoricalUidOps;ILjava/lang/String;Ljava/lang/String;IIJ)V
-HSPLandroid/app/AppOpsManager$HistoricalUidOps;->access$1200(Landroid/app/AppOpsManager$HistoricalUidOps;ILjava/lang/String;Ljava/lang/String;IIJ)V
-HSPLandroid/app/AppOpsManager$HistoricalUidOps;->access$1300(Landroid/app/AppOpsManager$HistoricalUidOps;ILjava/lang/String;Ljava/lang/String;IIJ)V
 HSPLandroid/app/AppOpsManager$HistoricalUidOps;->getOrCreateHistoricalPackageOps(Ljava/lang/String;)Landroid/app/AppOpsManager$HistoricalPackageOps;
 HSPLandroid/app/AppOpsManager$HistoricalUidOps;->getPackageCount()I
 HSPLandroid/app/AppOpsManager$HistoricalUidOps;->getPackageOps(Ljava/lang/String;)Landroid/app/AppOpsManager$HistoricalPackageOps;
@@ -1536,7 +1409,6 @@
 HSPLandroid/app/AppOpsManager$OpEntry$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/app/AppOpsManager$OpEntry;-><init>(IILjava/util/Map;)V
 HSPLandroid/app/AppOpsManager$OpEntry;-><init>(Landroid/os/Parcel;)V
-HPLandroid/app/AppOpsManager$OpEntry;->getFeatures()Ljava/util/Map;
 HSPLandroid/app/AppOpsManager$OpEntry;->getMode()I
 HSPLandroid/app/AppOpsManager$OpEntry;->getOp()I
 HSPLandroid/app/AppOpsManager$OpEntry;->isRunning()Z
@@ -1545,8 +1417,7 @@
 HSPLandroid/app/AppOpsManager$OpEventProxyInfo;-><clinit>()V
 HSPLandroid/app/AppOpsManager$OpEventProxyInfo;-><init>(ILjava/lang/String;Ljava/lang/String;)V
 HPLandroid/app/AppOpsManager$OpEventProxyInfo;-><init>(Landroid/app/AppOpsManager$OpEventProxyInfo;)V
-PLandroid/app/AppOpsManager$OpEventProxyInfo;->getFeatureId()Ljava/lang/String;
-PLandroid/app/AppOpsManager$OpEventProxyInfo;->getPackageName()Ljava/lang/String;
+HSPLandroid/app/AppOpsManager$OpEventProxyInfo;->getPackageName()Ljava/lang/String;
 PLandroid/app/AppOpsManager$OpEventProxyInfo;->getUid()I
 HPLandroid/app/AppOpsManager$OpEventProxyInfo;->reinit(ILjava/lang/String;Ljava/lang/String;)V
 HSPLandroid/app/AppOpsManager$OpFeatureEntry$1;-><init>()V
@@ -1554,21 +1425,12 @@
 HSPLandroid/app/AppOpsManager$OpFeatureEntry$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/app/AppOpsManager$OpFeatureEntry$LongSparseArrayParceling;-><init>()V
 HSPLandroid/app/AppOpsManager$OpFeatureEntry$LongSparseArrayParceling;-><init>(Landroid/app/AppOpsManager$1;)V
-HPLandroid/app/AppOpsManager$OpFeatureEntry$LongSparseArrayParceling;->parcel(Landroid/util/LongSparseArray;Landroid/os/Parcel;I)V
-HPLandroid/app/AppOpsManager$OpFeatureEntry$LongSparseArrayParceling;->parcel(Ljava/lang/Object;Landroid/os/Parcel;I)V
 HSPLandroid/app/AppOpsManager$OpFeatureEntry$LongSparseArrayParceling;->unparcel(Landroid/os/Parcel;)Landroid/util/LongSparseArray;
 HSPLandroid/app/AppOpsManager$OpFeatureEntry$LongSparseArrayParceling;->unparcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/app/AppOpsManager$OpFeatureEntry;-><clinit>()V
-HPLandroid/app/AppOpsManager$OpFeatureEntry;-><init>(IZLandroid/util/LongSparseArray;Landroid/util/LongSparseArray;)V
 HSPLandroid/app/AppOpsManager$OpFeatureEntry;-><init>(Landroid/os/Parcel;)V
-HPLandroid/app/AppOpsManager$OpFeatureEntry;->collectKeys()Landroid/util/ArraySet;
 HSPLandroid/app/AppOpsManager$OpFeatureEntry;->getLastAccessEvent(III)Landroid/app/AppOpsManager$NoteOpEvent;
-HPLandroid/app/AppOpsManager$OpFeatureEntry;->getLastAccessTime(III)J
-HPLandroid/app/AppOpsManager$OpFeatureEntry;->getLastDuration(III)J
-HPLandroid/app/AppOpsManager$OpFeatureEntry;->getLastProxyInfo(III)Landroid/app/AppOpsManager$OpEventProxyInfo;
 HSPLandroid/app/AppOpsManager$OpFeatureEntry;->getLastRejectEvent(III)Landroid/app/AppOpsManager$NoteOpEvent;
-HPLandroid/app/AppOpsManager$OpFeatureEntry;->getLastRejectTime(III)J
-HPLandroid/app/AppOpsManager$OpFeatureEntry;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/app/AppOpsManager$PackageOps$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/AppOpsManager$PackageOps;
 HSPLandroid/app/AppOpsManager$PackageOps$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/app/AppOpsManager$PackageOps;-><init>(Landroid/os/Parcel;)V
@@ -1578,31 +1440,37 @@
 HSPLandroid/app/AppOpsManager$PackageOps;->getUid()I
 HPLandroid/app/AppOpsManager$PackageOps;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/app/AppOpsManager;-><init>(Landroid/content/Context;Lcom/android/internal/app/IAppOpsService;)V
+HSPLandroid/app/AppOpsManager;->access$000()Lcom/android/internal/app/MessageSamplingConfig;
 HSPLandroid/app/AppOpsManager;->access$000(Landroid/util/LongSparseArray;III)Landroid/app/AppOpsManager$NoteOpEvent;
+HSPLandroid/app/AppOpsManager;->access$002(Lcom/android/internal/app/MessageSamplingConfig;)Lcom/android/internal/app/MessageSamplingConfig;
+HSPLandroid/app/AppOpsManager;->access$100()Ljava/lang/String;
+HSPLandroid/app/AppOpsManager;->access$200()Lcom/android/internal/app/IAppOpsService;
 HSPLandroid/app/AppOpsManager;->access$200()[Ljava/lang/String;
+HSPLandroid/app/AppOpsManager;->access$500()[Ljava/lang/String;
 HPLandroid/app/AppOpsManager;->checkAudioOpNoThrow(IIILjava/lang/String;)I
 HSPLandroid/app/AppOpsManager;->checkOp(IILjava/lang/String;)I
 HSPLandroid/app/AppOpsManager;->checkOpNoThrow(IILjava/lang/String;)I
 HSPLandroid/app/AppOpsManager;->checkOpNoThrow(Ljava/lang/String;ILjava/lang/String;)I
 HSPLandroid/app/AppOpsManager;->checkPackage(ILjava/lang/String;)V
+HSPLandroid/app/AppOpsManager;->collectNoteOpCallsForValidation(I)V
 HSPLandroid/app/AppOpsManager;->collectNotedOpForSelf(ILjava/lang/String;)V
 HSPLandroid/app/AppOpsManager;->extractFlagsFromKey(J)I
 HSPLandroid/app/AppOpsManager;->extractUidStateFromKey(J)I
 HSPLandroid/app/AppOpsManager;->finishOp(IILjava/lang/String;)V
 HSPLandroid/app/AppOpsManager;->finishOp(IILjava/lang/String;Ljava/lang/String;)V
-HSPLandroid/app/AppOpsManager;->finishOp(Ljava/lang/String;ILjava/lang/String;)V
 HSPLandroid/app/AppOpsManager;->getClientId()Landroid/os/IBinder;
 HSPLandroid/app/AppOpsManager;->getFormattedStackTrace()Ljava/lang/String;
 HSPLandroid/app/AppOpsManager;->getHistoricalOps(Landroid/app/AppOpsManager$HistoricalOpsRequest;Ljava/util/concurrent/Executor;Ljava/util/function/Consumer;)V
 HSPLandroid/app/AppOpsManager;->getLastEvent(Landroid/util/LongSparseArray;III)Landroid/app/AppOpsManager$NoteOpEvent;
 HSPLandroid/app/AppOpsManager;->getNotedOpCollectionMode(ILjava/lang/String;I)I
-HSPLandroid/app/AppOpsManager;->getOpsForPackage(ILjava/lang/String;[I)Ljava/util/List;
 HSPLandroid/app/AppOpsManager;->getPackagesForOps([I)Ljava/util/List;
+HSPLandroid/app/AppOpsManager;->getService()Lcom/android/internal/app/IAppOpsService;
 HSPLandroid/app/AppOpsManager;->getToken(Lcom/android/internal/app/IAppOpsService;)Landroid/os/IBinder;
 HSPLandroid/app/AppOpsManager;->isCollectingNotedAppOps()Z
 HPLandroid/app/AppOpsManager;->isOperationActive(IILjava/lang/String;)Z
 HSPLandroid/app/AppOpsManager;->lambda$getHistoricalOps$0(Ljava/util/function/Consumer;Landroid/app/AppOpsManager$HistoricalOps;)V
 HSPLandroid/app/AppOpsManager;->lambda$getHistoricalOps$1(Ljava/util/concurrent/Executor;Ljava/util/function/Consumer;Landroid/os/Bundle;)V
+HSPLandroid/app/AppOpsManager;->leftCircularDistance(III)I
 HSPLandroid/app/AppOpsManager;->makeKey(II)J
 HSPLandroid/app/AppOpsManager;->noteOp(IILjava/lang/String;)I
 HSPLandroid/app/AppOpsManager;->noteOp(IILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)I
@@ -1614,8 +1482,6 @@
 HSPLandroid/app/AppOpsManager;->noteOpNoThrow(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)I
 HSPLandroid/app/AppOpsManager;->noteProxyOp(ILjava/lang/String;ILjava/lang/String;Ljava/lang/String;)I
 HSPLandroid/app/AppOpsManager;->noteProxyOpNoThrow(ILjava/lang/String;ILjava/lang/String;Ljava/lang/String;)I
-HSPLandroid/app/AppOpsManager;->noteProxyOpNoThrow(Ljava/lang/String;Ljava/lang/String;)I
-HSPLandroid/app/AppOpsManager;->noteProxyOpNoThrow(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)I
 HSPLandroid/app/AppOpsManager;->opToDefaultMode(I)I
 HSPLandroid/app/AppOpsManager;->opToPermission(I)Ljava/lang/String;
 HSPLandroid/app/AppOpsManager;->opToPublicName(I)Ljava/lang/String;
@@ -1630,22 +1496,21 @@
 HSPLandroid/app/AppOpsManager;->setRestriction(III[Ljava/lang/String;)V
 HSPLandroid/app/AppOpsManager;->setUidMode(Ljava/lang/String;II)V
 HSPLandroid/app/AppOpsManager;->startOpNoThrow(IILjava/lang/String;)I
-HPLandroid/app/AppOpsManager;->startOpNoThrow(IILjava/lang/String;Z)I
 HSPLandroid/app/AppOpsManager;->startOpNoThrow(IILjava/lang/String;ZLjava/lang/String;Ljava/lang/String;)I
-HSPLandroid/app/AppOpsManager;->startOpNoThrow(Ljava/lang/String;ILjava/lang/String;)I
-HSPLandroid/app/AppOpsManager;->startOpNoThrow(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)I
 HSPLandroid/app/AppOpsManager;->startWatchingActive([ILandroid/app/AppOpsManager$OnOpActiveChangedListener;)V
 HSPLandroid/app/AppOpsManager;->startWatchingActive([Ljava/lang/String;Ljava/util/concurrent/Executor;Landroid/app/AppOpsManager$OnOpActiveChangedListener;)V
 HSPLandroid/app/AppOpsManager;->startWatchingMode(ILjava/lang/String;ILandroid/app/AppOpsManager$OnOpChangedListener;)V
 HSPLandroid/app/AppOpsManager;->startWatchingMode(ILjava/lang/String;Landroid/app/AppOpsManager$OnOpChangedListener;)V
-HSPLandroid/app/AppOpsManager;->startWatchingMode(Ljava/lang/String;Ljava/lang/String;ILandroid/app/AppOpsManager$OnOpChangedListener;)V
 HSPLandroid/app/AppOpsManager;->startWatchingMode(Ljava/lang/String;Ljava/lang/String;Landroid/app/AppOpsManager$OnOpChangedListener;)V
 HSPLandroid/app/AppOpsManager;->startWatchingNoted([ILandroid/app/AppOpsManager$OnOpNotedListener;)V
 HSPLandroid/app/AppOpsManager;->stopWatchingMode(Landroid/app/AppOpsManager$OnOpChangedListener;)V
 HSPLandroid/app/AppOpsManager;->strOpToOp(Ljava/lang/String;)I
+HPLandroid/app/AppOpsManager;->sumForFlagsInStates(Landroid/util/LongSparseLongArray;III)J
 HSPLandroid/app/AppOpsManager;->unsafeCheckOp(Ljava/lang/String;ILjava/lang/String;)I
 HSPLandroid/app/AppOpsManager;->unsafeCheckOpNoThrow(Ljava/lang/String;ILjava/lang/String;)I
 HSPLandroid/app/AppOpsManager;->unsafeCheckOpRaw(Ljava/lang/String;ILjava/lang/String;)I
+HSPLandroid/app/AppOpsManager;->unsafeCheckOpRawNoThrow(IILjava/lang/String;)I
+HSPLandroid/app/AppOpsManager;->unsafeCheckOpRawNoThrow(Ljava/lang/String;ILjava/lang/String;)I
 HSPLandroid/app/AppOpsManagerInternal;-><init>()V
 HSPLandroid/app/Application$ActivityLifecycleCallbacks;->onActivityPostCreated(Landroid/app/Activity;Landroid/os/Bundle;)V
 HSPLandroid/app/Application$ActivityLifecycleCallbacks;->onActivityPostDestroyed(Landroid/app/Activity;)V
@@ -1706,6 +1571,8 @@
 HPLandroid/app/ApplicationErrorReport$ParcelableCrashInfo;-><init>(Landroid/os/Parcel;)V
 HSPLandroid/app/ApplicationErrorReport$ParcelableCrashInfo;-><init>(Ljava/lang/Throwable;)V
 HSPLandroid/app/ApplicationErrorReport;-><init>()V
+HSPLandroid/app/ApplicationErrorReport;->getErrorReportReceiver(Landroid/content/Context;Ljava/lang/String;I)Landroid/content/ComponentName;
+HSPLandroid/app/ApplicationErrorReport;->getErrorReportReceiver(Landroid/content/pm/PackageManager;Ljava/lang/String;Ljava/lang/String;)Landroid/content/ComponentName;
 HSPLandroid/app/ApplicationErrorReport;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/app/ApplicationExitInfo$1;-><init>()V
 HSPLandroid/app/ApplicationExitInfo;-><clinit>()V
@@ -1752,7 +1619,6 @@
 HSPLandroid/app/ApplicationPackageManager$HasSystemFeatureQuery;-><init>(Ljava/lang/String;I)V
 HSPLandroid/app/ApplicationPackageManager$HasSystemFeatureQuery;->equals(Ljava/lang/Object;)Z
 HSPLandroid/app/ApplicationPackageManager$HasSystemFeatureQuery;->hashCode()I
-HSPLandroid/app/ApplicationPackageManager$MoveCallbackDelegate;-><init>(Landroid/content/pm/PackageManager$MoveCallback;Landroid/os/Looper;)V
 HSPLandroid/app/ApplicationPackageManager$OnPermissionsChangeListenerDelegate;-><init>(Landroid/app/ApplicationPackageManager;Landroid/content/pm/PackageManager$OnPermissionsChangedListener;Landroid/os/Looper;)V
 HSPLandroid/app/ApplicationPackageManager$OnPermissionsChangeListenerDelegate;->handleMessage(Landroid/os/Message;)Z
 HSPLandroid/app/ApplicationPackageManager$OnPermissionsChangeListenerDelegate;->onPermissionsChanged(I)V
@@ -1766,7 +1632,6 @@
 HSPLandroid/app/ApplicationPackageManager;->access$000(Landroid/app/ApplicationPackageManager;Ljava/lang/String;I)Z
 HSPLandroid/app/ApplicationPackageManager;->addOnPermissionsChangeListener(Landroid/content/pm/PackageManager$OnPermissionsChangedListener;)V
 HSPLandroid/app/ApplicationPackageManager;->checkPermission(Ljava/lang/String;Ljava/lang/String;)I
-HSPLandroid/app/ApplicationPackageManager;->checkSignatures(II)I
 HSPLandroid/app/ApplicationPackageManager;->checkSignatures(Ljava/lang/String;Ljava/lang/String;)I
 HSPLandroid/app/ApplicationPackageManager;->configurationChanged()V
 HSPLandroid/app/ApplicationPackageManager;->getActivityInfo(Landroid/content/ComponentName;I)Landroid/content/pm/ActivityInfo;
@@ -1780,7 +1645,9 @@
 HSPLandroid/app/ApplicationPackageManager;->getCachedIcon(Landroid/app/ApplicationPackageManager$ResourceName;)Landroid/graphics/drawable/Drawable;
 HSPLandroid/app/ApplicationPackageManager;->getCachedString(Landroid/app/ApplicationPackageManager$ResourceName;)Ljava/lang/CharSequence;
 HSPLandroid/app/ApplicationPackageManager;->getComponentEnabledSetting(Landroid/content/ComponentName;)I
+HSPLandroid/app/ApplicationPackageManager;->getContentCaptureServicePackageName()Ljava/lang/String;
 HSPLandroid/app/ApplicationPackageManager;->getDefaultActivityIcon()Landroid/graphics/drawable/Drawable;
+HSPLandroid/app/ApplicationPackageManager;->getDefaultTextClassifierPackageName()Ljava/lang/String;
 HSPLandroid/app/ApplicationPackageManager;->getDrawable(Ljava/lang/String;ILandroid/content/pm/ApplicationInfo;)Landroid/graphics/drawable/Drawable;
 HSPLandroid/app/ApplicationPackageManager;->getHomeActivities(Ljava/util/List;)Landroid/content/ComponentName;
 HSPLandroid/app/ApplicationPackageManager;->getInstalledApplications(I)Ljava/util/List;
@@ -1802,6 +1669,8 @@
 HSPLandroid/app/ApplicationPackageManager;->getPermissionControllerPackageName()Ljava/lang/String;
 HSPLandroid/app/ApplicationPackageManager;->getPermissionFlags(Ljava/lang/String;Ljava/lang/String;Landroid/os/UserHandle;)I
 HSPLandroid/app/ApplicationPackageManager;->getPermissionInfo(Ljava/lang/String;I)Landroid/content/pm/PermissionInfo;
+PLandroid/app/ApplicationPackageManager;->getPrimaryStorageCurrentVolume()Landroid/os/storage/VolumeInfo;
+HSPLandroid/app/ApplicationPackageManager;->getProfileIconForDensity(Landroid/os/UserHandle;II)Landroid/graphics/drawable/Drawable;
 HSPLandroid/app/ApplicationPackageManager;->getReceiverInfo(Landroid/content/ComponentName;I)Landroid/content/pm/ActivityInfo;
 HSPLandroid/app/ApplicationPackageManager;->getResourcesForApplication(Landroid/content/pm/ApplicationInfo;)Landroid/content/res/Resources;
 HSPLandroid/app/ApplicationPackageManager;->getResourcesForApplication(Ljava/lang/String;)Landroid/content/res/Resources;
@@ -1810,9 +1679,7 @@
 HSPLandroid/app/ApplicationPackageManager;->getServicesSystemSharedLibraryPackageName()Ljava/lang/String;
 HSPLandroid/app/ApplicationPackageManager;->getSetupWizardPackageName()Ljava/lang/String;
 HSPLandroid/app/ApplicationPackageManager;->getSharedSystemSharedLibraryPackageName()Ljava/lang/String;
-HSPLandroid/app/ApplicationPackageManager;->getSystemAvailableFeatures()[Landroid/content/pm/FeatureInfo;
 HSPLandroid/app/ApplicationPackageManager;->getSystemCaptionsServicePackageName()Ljava/lang/String;
-HSPLandroid/app/ApplicationPackageManager;->getSystemSharedLibraryNames()[Ljava/lang/String;
 HSPLandroid/app/ApplicationPackageManager;->getText(Ljava/lang/String;ILandroid/content/pm/ApplicationInfo;)Ljava/lang/CharSequence;
 HSPLandroid/app/ApplicationPackageManager;->getUserBadgeColor(Landroid/os/UserHandle;)I
 HSPLandroid/app/ApplicationPackageManager;->getUserBadgedIcon(Landroid/graphics/drawable/Drawable;Landroid/os/UserHandle;)Landroid/graphics/drawable/Drawable;
@@ -1836,6 +1703,7 @@
 HSPLandroid/app/ApplicationPackageManager;->putCachedString(Landroid/app/ApplicationPackageManager$ResourceName;Ljava/lang/CharSequence;)V
 HSPLandroid/app/ApplicationPackageManager;->queryBroadcastReceivers(Landroid/content/Intent;I)Ljava/util/List;
 HSPLandroid/app/ApplicationPackageManager;->queryBroadcastReceiversAsUser(Landroid/content/Intent;II)Ljava/util/List;
+HSPLandroid/app/ApplicationPackageManager;->queryContentProviders(Ljava/lang/String;IILjava/lang/String;)Ljava/util/List;
 HSPLandroid/app/ApplicationPackageManager;->queryIntentActivities(Landroid/content/Intent;I)Ljava/util/List;
 HSPLandroid/app/ApplicationPackageManager;->queryIntentActivitiesAsUser(Landroid/content/Intent;II)Ljava/util/List;
 HSPLandroid/app/ApplicationPackageManager;->queryIntentServices(Landroid/content/Intent;I)Ljava/util/List;
@@ -1854,8 +1722,6 @@
 HSPLandroid/app/ApplicationPackageManager;->updateFlagsForComponent(IILandroid/content/Intent;)I
 HSPLandroid/app/ApplicationPackageManager;->updateFlagsForPackage(II)I
 HSPLandroid/app/ApplicationPackageManager;->updatePermissionFlags(Ljava/lang/String;Ljava/lang/String;IILandroid/os/UserHandle;)V
-HSPLandroid/app/AsyncNotedAppOp$1;-><init>()V
-HSPLandroid/app/AsyncNotedAppOp;-><clinit>()V
 HPLandroid/app/AsyncNotedAppOp;-><init>(IILjava/lang/String;Ljava/lang/String;J)V
 HSPLandroid/app/BackStackRecord$Op;-><init>(ILandroid/app/Fragment;)V
 HSPLandroid/app/BackStackRecord;-><init>(Landroid/app/FragmentManagerImpl;)V
@@ -1863,7 +1729,6 @@
 HSPLandroid/app/BackStackRecord;->addOp(Landroid/app/BackStackRecord$Op;)V
 HSPLandroid/app/BackStackRecord;->bumpBackStackNesting(I)V
 HSPLandroid/app/BackStackRecord;->commit()I
-HSPLandroid/app/BackStackRecord;->commitAllowingStateLoss()I
 HSPLandroid/app/BackStackRecord;->commitInternal(Z)I
 HSPLandroid/app/BackStackRecord;->doAddOp(ILandroid/app/Fragment;Ljava/lang/String;I)V
 HSPLandroid/app/BackStackRecord;->executeOps()V
@@ -1894,8 +1759,6 @@
 HSPLandroid/app/ContentProviderHolder;-><init>(Landroid/os/Parcel;)V
 HSPLandroid/app/ContentProviderHolder;-><init>(Landroid/os/Parcel;Landroid/app/ContentProviderHolder$1;)V
 HSPLandroid/app/ContentProviderHolder;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/app/ContextImpl$1;-><init>(Ljava/lang/String;)V
-HSPLandroid/app/ContextImpl$1;->accept(Ljava/io/File;Ljava/lang/String;)Z
 HSPLandroid/app/ContextImpl$ApplicationContentResolver;-><init>(Landroid/content/Context;Landroid/app/ActivityThread;)V
 HSPLandroid/app/ContextImpl$ApplicationContentResolver;->acquireExistingProvider(Landroid/content/Context;Ljava/lang/String;)Landroid/content/IContentProvider;
 HSPLandroid/app/ContextImpl$ApplicationContentResolver;->acquireProvider(Landroid/content/Context;Ljava/lang/String;)Landroid/content/IContentProvider;
@@ -1918,11 +1781,11 @@
 HSPLandroid/app/ContextImpl;->checkPermission(Ljava/lang/String;IILandroid/os/IBinder;)I
 HSPLandroid/app/ContextImpl;->checkSelfPermission(Ljava/lang/String;)I
 HSPLandroid/app/ContextImpl;->checkUriPermission(Landroid/net/Uri;III)I
-HSPLandroid/app/ContextImpl;->checkUriPermission(Landroid/net/Uri;IIILandroid/os/IBinder;)I
 HSPLandroid/app/ContextImpl;->createActivityContext(Landroid/app/ActivityThread;Landroid/app/LoadedApk;Landroid/content/pm/ActivityInfo;Landroid/os/IBinder;ILandroid/content/res/Configuration;)Landroid/app/ContextImpl;
 HSPLandroid/app/ContextImpl;->createAppContext(Landroid/app/ActivityThread;Landroid/app/LoadedApk;)Landroid/app/ContextImpl;
 HSPLandroid/app/ContextImpl;->createAppContext(Landroid/app/ActivityThread;Landroid/app/LoadedApk;Ljava/lang/String;)Landroid/app/ContextImpl;
 HSPLandroid/app/ContextImpl;->createApplicationContext(Landroid/content/pm/ApplicationInfo;I)Landroid/content/Context;
+HSPLandroid/app/ContextImpl;->createAttributionContext(Ljava/lang/String;)Landroid/content/Context;
 HSPLandroid/app/ContextImpl;->createConfigurationContext(Landroid/content/res/Configuration;)Landroid/content/Context;
 HSPLandroid/app/ContextImpl;->createContextAsUser(Landroid/os/UserHandle;I)Landroid/content/Context;
 HSPLandroid/app/ContextImpl;->createCredentialProtectedStorageContext()Landroid/content/Context;
@@ -1936,10 +1799,8 @@
 HSPLandroid/app/ContextImpl;->createSystemContext(Landroid/app/ActivityThread;)Landroid/app/ContextImpl;
 HSPLandroid/app/ContextImpl;->createSystemUiContext(Landroid/app/ContextImpl;)Landroid/app/ContextImpl;
 HSPLandroid/app/ContextImpl;->createSystemUiContext(Landroid/app/ContextImpl;I)Landroid/app/ContextImpl;
-HSPLandroid/app/ContextImpl;->databaseList()[Ljava/lang/String;
 HSPLandroid/app/ContextImpl;->deleteDatabase(Ljava/lang/String;)Z
 HSPLandroid/app/ContextImpl;->deleteFile(Ljava/lang/String;)Z
-HSPLandroid/app/ContextImpl;->deleteSharedPreferences(Ljava/lang/String;)Z
 HSPLandroid/app/ContextImpl;->enforce(Ljava/lang/String;IZILjava/lang/String;)V
 HSPLandroid/app/ContextImpl;->enforceCallingOrSelfPermission(Ljava/lang/String;Ljava/lang/String;)V
 HSPLandroid/app/ContextImpl;->enforceCallingPermission(Ljava/lang/String;Ljava/lang/String;)V
@@ -1949,11 +1810,11 @@
 HSPLandroid/app/ContextImpl;->ensurePrivateCacheDirExists(Ljava/io/File;Ljava/lang/String;)Ljava/io/File;
 HSPLandroid/app/ContextImpl;->ensurePrivateDirExists(Ljava/io/File;)Ljava/io/File;
 HSPLandroid/app/ContextImpl;->ensurePrivateDirExists(Ljava/io/File;IILjava/lang/String;)Ljava/io/File;
-HSPLandroid/app/ContextImpl;->fileList()[Ljava/lang/String;
 HSPLandroid/app/ContextImpl;->getActivityToken()Landroid/os/IBinder;
 HSPLandroid/app/ContextImpl;->getApplicationContext()Landroid/content/Context;
 HSPLandroid/app/ContextImpl;->getApplicationInfo()Landroid/content/pm/ApplicationInfo;
 HSPLandroid/app/ContextImpl;->getAssets()Landroid/content/res/AssetManager;
+HSPLandroid/app/ContextImpl;->getAttributionTag()Ljava/lang/String;
 HSPLandroid/app/ContextImpl;->getAutofillClient()Landroid/view/autofill/AutofillManager$AutofillClient;
 HSPLandroid/app/ContextImpl;->getAutofillOptions()Landroid/content/AutofillOptions;
 HSPLandroid/app/ContextImpl;->getBasePackageName()Ljava/lang/String;
@@ -1988,7 +1849,6 @@
 HSPLandroid/app/ContextImpl;->getPackageCodePath()Ljava/lang/String;
 HSPLandroid/app/ContextImpl;->getPackageManager()Landroid/content/pm/PackageManager;
 HSPLandroid/app/ContextImpl;->getPackageName()Ljava/lang/String;
-HSPLandroid/app/ContextImpl;->getPackageResourcePath()Ljava/lang/String;
 HSPLandroid/app/ContextImpl;->getPreferencesDir()Ljava/io/File;
 HSPLandroid/app/ContextImpl;->getReceiverRestrictedContext()Landroid/content/Context;
 HSPLandroid/app/ContextImpl;->getResources()Landroid/content/res/Resources;
@@ -2002,7 +1862,6 @@
 HSPLandroid/app/ContextImpl;->getThemeResId()I
 HSPLandroid/app/ContextImpl;->getUser()Landroid/os/UserHandle;
 HSPLandroid/app/ContextImpl;->getUserId()I
-HSPLandroid/app/ContextImpl;->grantUriPermission(Ljava/lang/String;Landroid/net/Uri;I)V
 HSPLandroid/app/ContextImpl;->initializeTheme()V
 HSPLandroid/app/ContextImpl;->installSystemApplicationInfo(Landroid/content/pm/ApplicationInfo;Ljava/lang/ClassLoader;)V
 HSPLandroid/app/ContextImpl;->isCredentialProtectedStorage()Z
@@ -2011,21 +1870,15 @@
 HSPLandroid/app/ContextImpl;->isUiComponent(Ljava/lang/String;)Z
 HSPLandroid/app/ContextImpl;->isUiContext()Z
 HSPLandroid/app/ContextImpl;->makeFilename(Ljava/io/File;Ljava/lang/String;)Ljava/io/File;
-HSPLandroid/app/ContextImpl;->moveFiles(Ljava/io/File;Ljava/io/File;Ljava/lang/String;)I
-HSPLandroid/app/ContextImpl;->moveSharedPreferencesFrom(Landroid/content/Context;Ljava/lang/String;)Z
 HSPLandroid/app/ContextImpl;->openFileInput(Ljava/lang/String;)Ljava/io/FileInputStream;
 HSPLandroid/app/ContextImpl;->openFileOutput(Ljava/lang/String;I)Ljava/io/FileOutputStream;
-HSPLandroid/app/ContextImpl;->openOrCreateDatabase(Ljava/lang/String;ILandroid/database/sqlite/SQLiteDatabase$CursorFactory;)Landroid/database/sqlite/SQLiteDatabase;
-HSPLandroid/app/ContextImpl;->openOrCreateDatabase(Ljava/lang/String;ILandroid/database/sqlite/SQLiteDatabase$CursorFactory;Landroid/database/DatabaseErrorHandler;)Landroid/database/sqlite/SQLiteDatabase;
 HSPLandroid/app/ContextImpl;->performFinalCleanup(Ljava/lang/String;Ljava/lang/String;)V
 HSPLandroid/app/ContextImpl;->registerReceiver(Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;)Landroid/content/Intent;
 HSPLandroid/app/ContextImpl;->registerReceiver(Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;Ljava/lang/String;Landroid/os/Handler;)Landroid/content/Intent;
-HSPLandroid/app/ContextImpl;->registerReceiver(Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;Ljava/lang/String;Landroid/os/Handler;I)Landroid/content/Intent;
 HSPLandroid/app/ContextImpl;->registerReceiverAsUser(Landroid/content/BroadcastReceiver;Landroid/os/UserHandle;Landroid/content/IntentFilter;Ljava/lang/String;Landroid/os/Handler;)Landroid/content/Intent;
 HSPLandroid/app/ContextImpl;->registerReceiverForAllUsers(Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;Ljava/lang/String;Landroid/os/Handler;)Landroid/content/Intent;
 HSPLandroid/app/ContextImpl;->registerReceiverInternal(Landroid/content/BroadcastReceiver;ILandroid/content/IntentFilter;Ljava/lang/String;Landroid/os/Handler;Landroid/content/Context;I)Landroid/content/Intent;
 HSPLandroid/app/ContextImpl;->resolveUserId(Landroid/net/Uri;)I
-HSPLandroid/app/ContextImpl;->revokeUriPermission(Landroid/net/Uri;I)V
 HSPLandroid/app/ContextImpl;->scheduleFinalCleanup(Ljava/lang/String;Ljava/lang/String;)V
 HSPLandroid/app/ContextImpl;->sendBroadcast(Landroid/content/Intent;)V
 HSPLandroid/app/ContextImpl;->sendBroadcast(Landroid/content/Intent;Ljava/lang/String;)V
@@ -2034,9 +1887,6 @@
 HSPLandroid/app/ContextImpl;->sendBroadcastAsUser(Landroid/content/Intent;Landroid/os/UserHandle;Ljava/lang/String;I)V
 HSPLandroid/app/ContextImpl;->sendBroadcastAsUser(Landroid/content/Intent;Landroid/os/UserHandle;Ljava/lang/String;Landroid/os/Bundle;)V
 HPLandroid/app/ContextImpl;->sendBroadcastAsUserMultiplePermissions(Landroid/content/Intent;Landroid/os/UserHandle;[Ljava/lang/String;)V
-HSPLandroid/app/ContextImpl;->sendOrderedBroadcast(Landroid/content/Intent;Ljava/lang/String;)V
-HSPLandroid/app/ContextImpl;->sendOrderedBroadcast(Landroid/content/Intent;Ljava/lang/String;ILandroid/content/BroadcastReceiver;Landroid/os/Handler;ILjava/lang/String;Landroid/os/Bundle;Landroid/os/Bundle;)V
-HSPLandroid/app/ContextImpl;->sendOrderedBroadcast(Landroid/content/Intent;Ljava/lang/String;Landroid/content/BroadcastReceiver;Landroid/os/Handler;ILjava/lang/String;Landroid/os/Bundle;)V
 HSPLandroid/app/ContextImpl;->sendOrderedBroadcastAsUser(Landroid/content/Intent;Landroid/os/UserHandle;Ljava/lang/String;ILandroid/os/Bundle;Landroid/content/BroadcastReceiver;Landroid/os/Handler;ILjava/lang/String;Landroid/os/Bundle;)V
 HSPLandroid/app/ContextImpl;->sendOrderedBroadcastAsUser(Landroid/content/Intent;Landroid/os/UserHandle;Ljava/lang/String;Landroid/content/BroadcastReceiver;Landroid/os/Handler;ILjava/lang/String;Landroid/os/Bundle;)V
 HSPLandroid/app/ContextImpl;->sendStickyBroadcastAsUser(Landroid/content/Intent;Landroid/os/UserHandle;)V
@@ -2079,7 +1929,6 @@
 HSPLandroid/app/Dialog;->dismiss()V
 HSPLandroid/app/Dialog;->dismissDialog()V
 HSPLandroid/app/Dialog;->dispatchOnCreate(Landroid/os/Bundle;)V
-HSPLandroid/app/Dialog;->dispatchPopulateAccessibilityEvent(Landroid/view/accessibility/AccessibilityEvent;)Z
 HSPLandroid/app/Dialog;->dispatchTouchEvent(Landroid/view/MotionEvent;)Z
 HSPLandroid/app/Dialog;->findViewById(I)Landroid/view/View;
 HSPLandroid/app/Dialog;->getContext()Landroid/content/Context;
@@ -2106,30 +1955,9 @@
 HSPLandroid/app/Dialog;->setOnCancelListener(Landroid/content/DialogInterface$OnCancelListener;)V
 HSPLandroid/app/Dialog;->setOnDismissListener(Landroid/content/DialogInterface$OnDismissListener;)V
 HSPLandroid/app/Dialog;->setOnShowListener(Landroid/content/DialogInterface$OnShowListener;)V
-HSPLandroid/app/Dialog;->setOwnerActivity(Landroid/app/Activity;)V
 HSPLandroid/app/Dialog;->setTitle(Ljava/lang/CharSequence;)V
 HSPLandroid/app/Dialog;->show()V
-HSPLandroid/app/DownloadManager$CursorTranslator;-><init>(Landroid/database/Cursor;Landroid/net/Uri;Z)V
-HSPLandroid/app/DownloadManager$CursorTranslator;->getInt(I)I
-HSPLandroid/app/DownloadManager$CursorTranslator;->getLong(I)J
-HSPLandroid/app/DownloadManager$CursorTranslator;->translateStatus(I)I
-HSPLandroid/app/DownloadManager$Query;-><init>()V
-HSPLandroid/app/DownloadManager$Query;->joinStrings(Ljava/lang/String;Ljava/lang/Iterable;)Ljava/lang/String;
-HSPLandroid/app/DownloadManager$Query;->runQuery(Landroid/content/ContentResolver;[Ljava/lang/String;Landroid/net/Uri;)Landroid/database/Cursor;
-HSPLandroid/app/DownloadManager$Query;->setFilterById([J)Landroid/app/DownloadManager$Query;
-HSPLandroid/app/DownloadManager$Query;->setFilterByStatus(I)Landroid/app/DownloadManager$Query;
-HSPLandroid/app/DownloadManager$Request;-><init>(Landroid/net/Uri;)V
-HSPLandroid/app/DownloadManager$Request;->putIfNonNull(Landroid/content/ContentValues;Ljava/lang/String;Ljava/lang/Object;)V
-HSPLandroid/app/DownloadManager$Request;->setNotificationVisibility(I)Landroid/app/DownloadManager$Request;
-HSPLandroid/app/DownloadManager$Request;->setVisibleInDownloadsUi(Z)Landroid/app/DownloadManager$Request;
-HSPLandroid/app/DownloadManager$Request;->toContentValues(Ljava/lang/String;)Landroid/content/ContentValues;
 HSPLandroid/app/DownloadManager;-><init>(Landroid/content/Context;)V
-HSPLandroid/app/DownloadManager;->enqueue(Landroid/app/DownloadManager$Request;)J
-HSPLandroid/app/DownloadManager;->getWhereClauseForIds([J)Ljava/lang/String;
-HSPLandroid/app/DownloadManager;->markRowDeleted([J)I
-HSPLandroid/app/DownloadManager;->query(Landroid/app/DownloadManager$Query;)Landroid/database/Cursor;
-HSPLandroid/app/DownloadManager;->query(Landroid/app/DownloadManager$Query;[Ljava/lang/String;)Landroid/database/Cursor;
-HSPLandroid/app/DownloadManager;->remove([J)I
 HSPLandroid/app/EventLogTags;->writeWmOnActivityResultCalled(ILjava/lang/String;Ljava/lang/String;)V
 HSPLandroid/app/EventLogTags;->writeWmOnCreateCalled(ILjava/lang/String;Ljava/lang/String;)V
 HSPLandroid/app/EventLogTags;->writeWmOnDestroyCalled(ILjava/lang/String;Ljava/lang/String;)V
@@ -2159,7 +1987,6 @@
 HSPLandroid/app/Fragment;->initState()V
 HSPLandroid/app/Fragment;->instantiate(Landroid/content/Context;Ljava/lang/String;Landroid/os/Bundle;)Landroid/app/Fragment;
 HSPLandroid/app/Fragment;->instantiateChildFragmentManager()V
-HSPLandroid/app/Fragment;->isAdded()Z
 HSPLandroid/app/Fragment;->isPostponed()Z
 HSPLandroid/app/Fragment;->noteStateNotSaved()V
 HSPLandroid/app/Fragment;->onActivityCreated(Landroid/os/Bundle;)V
@@ -2173,6 +2000,7 @@
 HSPLandroid/app/Fragment;->onDestroyView()V
 HSPLandroid/app/Fragment;->onDetach()V
 HSPLandroid/app/Fragment;->onGetLayoutInflater(Landroid/os/Bundle;)Landroid/view/LayoutInflater;
+HSPLandroid/app/Fragment;->onLowMemory()V
 HSPLandroid/app/Fragment;->onPause()V
 HSPLandroid/app/Fragment;->onResume()V
 HSPLandroid/app/Fragment;->onSaveInstanceState(Landroid/os/Bundle;)V
@@ -2190,7 +2018,7 @@
 HSPLandroid/app/Fragment;->performDestroyView()V
 HSPLandroid/app/Fragment;->performDetach()V
 HSPLandroid/app/Fragment;->performGetLayoutInflater(Landroid/os/Bundle;)Landroid/view/LayoutInflater;
-HSPLandroid/app/Fragment;->performOptionsItemSelected(Landroid/view/MenuItem;)Z
+HSPLandroid/app/Fragment;->performLowMemory()V
 HSPLandroid/app/Fragment;->performPause()V
 HSPLandroid/app/Fragment;->performPrepareOptionsMenu(Landroid/view/Menu;)Z
 HSPLandroid/app/Fragment;->performResume()V
@@ -2204,7 +2032,6 @@
 HSPLandroid/app/Fragment;->setIndex(ILandroid/app/Fragment;)V
 HSPLandroid/app/Fragment;->setNextAnim(I)V
 HSPLandroid/app/Fragment;->setNextTransition(II)V
-HSPLandroid/app/Fragment;->setRetainInstance(Z)V
 HSPLandroid/app/Fragment;->toString()Ljava/lang/String;
 HSPLandroid/app/FragmentContainer;-><init>()V
 HSPLandroid/app/FragmentContainer;->instantiate(Landroid/content/Context;Ljava/lang/String;Landroid/os/Bundle;)Landroid/app/Fragment;
@@ -2217,7 +2044,6 @@
 HSPLandroid/app/FragmentController;->dispatchCreateOptionsMenu(Landroid/view/Menu;Landroid/view/MenuInflater;)Z
 HSPLandroid/app/FragmentController;->dispatchDestroy()V
 HSPLandroid/app/FragmentController;->dispatchLowMemory()V
-HSPLandroid/app/FragmentController;->dispatchOptionsItemSelected(Landroid/view/MenuItem;)Z
 HSPLandroid/app/FragmentController;->dispatchPause()V
 HSPLandroid/app/FragmentController;->dispatchPrepareOptionsMenu(Landroid/view/Menu;)Z
 HSPLandroid/app/FragmentController;->dispatchResume()V
@@ -2294,7 +2120,6 @@
 HSPLandroid/app/FragmentManagerImpl;->dispatchOnFragmentStopped(Landroid/app/Fragment;Z)V
 HSPLandroid/app/FragmentManagerImpl;->dispatchOnFragmentViewCreated(Landroid/app/Fragment;Landroid/view/View;Landroid/os/Bundle;Z)V
 HSPLandroid/app/FragmentManagerImpl;->dispatchOnFragmentViewDestroyed(Landroid/app/Fragment;Z)V
-HSPLandroid/app/FragmentManagerImpl;->dispatchOptionsItemSelected(Landroid/view/MenuItem;)Z
 HSPLandroid/app/FragmentManagerImpl;->dispatchPause()V
 HSPLandroid/app/FragmentManagerImpl;->dispatchPrepareOptionsMenu(Landroid/view/Menu;)Z
 HSPLandroid/app/FragmentManagerImpl;->dispatchResume()V
@@ -2376,7 +2201,6 @@
 HSPLandroid/app/IActivityManager$Stub$Proxy;->bindIsolatedService(Landroid/app/IApplicationThread;Landroid/os/IBinder;Landroid/content/Intent;Ljava/lang/String;Landroid/app/IServiceConnection;ILjava/lang/String;Ljava/lang/String;I)I
 HSPLandroid/app/IActivityManager$Stub$Proxy;->broadcastIntent(Landroid/app/IApplicationThread;Landroid/content/Intent;Ljava/lang/String;Landroid/content/IIntentReceiver;ILjava/lang/String;Landroid/os/Bundle;[Ljava/lang/String;ILandroid/os/Bundle;ZZI)I
 HSPLandroid/app/IActivityManager$Stub$Proxy;->broadcastIntentWithFeature(Landroid/app/IApplicationThread;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;Landroid/content/IIntentReceiver;ILjava/lang/String;Landroid/os/Bundle;[Ljava/lang/String;ILandroid/os/Bundle;ZZI)I
-HSPLandroid/app/IActivityManager$Stub$Proxy;->cancelIntentSender(Landroid/content/IIntentSender;)V
 HSPLandroid/app/IActivityManager$Stub$Proxy;->checkPermission(Ljava/lang/String;II)I
 HSPLandroid/app/IActivityManager$Stub$Proxy;->checkPermissionWithToken(Ljava/lang/String;IILandroid/os/IBinder;)I
 HSPLandroid/app/IActivityManager$Stub$Proxy;->checkUriPermission(Landroid/net/Uri;IIIILandroid/os/IBinder;)I
@@ -2389,33 +2213,25 @@
 HSPLandroid/app/IActivityManager$Stub$Proxy;->getMemoryInfo(Landroid/app/ActivityManager$MemoryInfo;)V
 HSPLandroid/app/IActivityManager$Stub$Proxy;->getMyMemoryState(Landroid/app/ActivityManager$RunningAppProcessInfo;)V
 HSPLandroid/app/IActivityManager$Stub$Proxy;->getPackageForIntentSender(Landroid/content/IIntentSender;)Ljava/lang/String;
-HSPLandroid/app/IActivityManager$Stub$Proxy;->getPackageProcessState(Ljava/lang/String;Ljava/lang/String;)I
 HSPLandroid/app/IActivityManager$Stub$Proxy;->getProcessMemoryInfo([I)[Landroid/os/Debug$MemoryInfo;
-HSPLandroid/app/IActivityManager$Stub$Proxy;->getProviderMimeType(Landroid/net/Uri;I)Ljava/lang/String;
 HSPLandroid/app/IActivityManager$Stub$Proxy;->getProviderMimeTypeAsync(Landroid/net/Uri;ILandroid/os/RemoteCallback;)V
 HSPLandroid/app/IActivityManager$Stub$Proxy;->getRunningAppProcesses()Ljava/util/List;
 HSPLandroid/app/IActivityManager$Stub$Proxy;->getServices(II)Ljava/util/List;
 HSPLandroid/app/IActivityManager$Stub$Proxy;->getTasks(I)Ljava/util/List;
 HSPLandroid/app/IActivityManager$Stub$Proxy;->getUidForIntentSender(Landroid/content/IIntentSender;)I
-HSPLandroid/app/IActivityManager$Stub$Proxy;->grantUriPermission(Landroid/app/IApplicationThread;Ljava/lang/String;Landroid/net/Uri;II)V
 HSPLandroid/app/IActivityManager$Stub$Proxy;->handleApplicationStrictModeViolation(Landroid/os/IBinder;ILandroid/os/StrictMode$ViolationInfo;)V
-HSPLandroid/app/IActivityManager$Stub$Proxy;->handleApplicationWtf(Landroid/os/IBinder;Ljava/lang/String;ZLandroid/app/ApplicationErrorReport$ParcelableCrashInfo;)Z
 HSPLandroid/app/IActivityManager$Stub$Proxy;->handleApplicationWtf(Landroid/os/IBinder;Ljava/lang/String;ZLandroid/app/ApplicationErrorReport$ParcelableCrashInfo;I)Z
 HSPLandroid/app/IActivityManager$Stub$Proxy;->isIntentSenderAnActivity(Landroid/content/IIntentSender;)Z
 HSPLandroid/app/IActivityManager$Stub$Proxy;->isUserAMonkey()Z
-HSPLandroid/app/IActivityManager$Stub$Proxy;->isUserRunning(II)Z
 HSPLandroid/app/IActivityManager$Stub$Proxy;->publishContentProviders(Landroid/app/IApplicationThread;Ljava/util/List;)V
 HSPLandroid/app/IActivityManager$Stub$Proxy;->publishService(Landroid/os/IBinder;Landroid/content/Intent;Landroid/os/IBinder;)V
 HSPLandroid/app/IActivityManager$Stub$Proxy;->refContentProvider(Landroid/os/IBinder;II)Z
 HSPLandroid/app/IActivityManager$Stub$Proxy;->registerIntentSenderCancelListener(Landroid/content/IIntentSender;Lcom/android/internal/os/IResultReceiver;)V
 HSPLandroid/app/IActivityManager$Stub$Proxy;->registerReceiver(Landroid/app/IApplicationThread;Ljava/lang/String;Landroid/content/IIntentReceiver;Landroid/content/IntentFilter;Ljava/lang/String;II)Landroid/content/Intent;
 HSPLandroid/app/IActivityManager$Stub$Proxy;->registerReceiverWithFeature(Landroid/app/IApplicationThread;Ljava/lang/String;Ljava/lang/String;Landroid/content/IIntentReceiver;Landroid/content/IntentFilter;Ljava/lang/String;II)Landroid/content/Intent;
-HSPLandroid/app/IActivityManager$Stub$Proxy;->registerTaskStackListener(Landroid/app/ITaskStackListener;)V
-HSPLandroid/app/IActivityManager$Stub$Proxy;->registerUidObserver(Landroid/app/IUidObserver;IILjava/lang/String;)V
 HSPLandroid/app/IActivityManager$Stub$Proxy;->registerUserSwitchObserver(Landroid/app/IUserSwitchObserver;Ljava/lang/String;)V
 HSPLandroid/app/IActivityManager$Stub$Proxy;->removeContentProvider(Landroid/os/IBinder;Z)V
 HSPLandroid/app/IActivityManager$Stub$Proxy;->resumeAppSwitches()V
-HSPLandroid/app/IActivityManager$Stub$Proxy;->revokeUriPermission(Landroid/app/IApplicationThread;Ljava/lang/String;Landroid/net/Uri;II)V
 HSPLandroid/app/IActivityManager$Stub$Proxy;->sendIntentSender(Landroid/content/IIntentSender;Landroid/os/IBinder;ILandroid/content/Intent;Ljava/lang/String;Landroid/content/IIntentReceiver;Ljava/lang/String;Landroid/os/Bundle;)I
 HSPLandroid/app/IActivityManager$Stub$Proxy;->serviceDoneExecuting(Landroid/os/IBinder;III)V
 HSPLandroid/app/IActivityManager$Stub$Proxy;->setHasTopUi(Z)V
@@ -2446,8 +2262,6 @@
 HSPLandroid/app/IActivityTaskManager$Stub$Proxy;->activityTopResumedStateLost()V
 HSPLandroid/app/IActivityTaskManager$Stub$Proxy;->finishActivity(Landroid/os/IBinder;ILandroid/content/Intent;I)Z
 HSPLandroid/app/IActivityTaskManager$Stub$Proxy;->getActivityOptions(Landroid/os/IBinder;)Landroid/os/Bundle;
-HSPLandroid/app/IActivityTaskManager$Stub$Proxy;->getAppTasks(Ljava/lang/String;)Ljava/util/List;
-HSPLandroid/app/IActivityTaskManager$Stub$Proxy;->getCallingActivity(Landroid/os/IBinder;)Landroid/content/ComponentName;
 HSPLandroid/app/IActivityTaskManager$Stub$Proxy;->getCallingPackage(Landroid/os/IBinder;)Ljava/lang/String;
 HSPLandroid/app/IActivityTaskManager$Stub$Proxy;->getDeviceConfigurationInfo()Landroid/content/pm/ConfigurationInfo;
 HSPLandroid/app/IActivityTaskManager$Stub$Proxy;->getDisplayId(Landroid/os/IBinder;)I
@@ -2496,16 +2310,14 @@
 HSPLandroid/app/IAlarmManager$Stub$Proxy;->set(Ljava/lang/String;IJJJILandroid/app/PendingIntent;Landroid/app/IAlarmListener;Ljava/lang/String;Landroid/os/WorkSource;Landroid/app/AlarmManager$AlarmClockInfo;)V
 HSPLandroid/app/IAlarmManager$Stub;-><init>()V
 HSPLandroid/app/IAlarmManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/IAlarmManager;
+PLandroid/app/IAlarmManager$Stub;->getDefaultTransactionName(I)Ljava/lang/String;
 HSPLandroid/app/IAlarmManager$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/app/IAppTask$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/app/IAppTask$Stub$Proxy;->getTaskInfo()Landroid/app/ActivityManager$RecentTaskInfo;
-HSPLandroid/app/IAppTask$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/IAppTask;
 HPLandroid/app/IAppTask$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/app/IApplicationThread$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/app/IApplicationThread$Stub$Proxy;->bindApplication(Ljava/lang/String;Landroid/content/pm/ApplicationInfo;Ljava/util/List;Landroid/content/ComponentName;Landroid/app/ProfilerInfo;Landroid/os/Bundle;Landroid/app/IInstrumentationWatcher;Landroid/app/IUiAutomationConnection;IZZZZLandroid/content/res/Configuration;Landroid/content/res/CompatibilityInfo;Ljava/util/Map;Landroid/os/Bundle;Ljava/lang/String;Landroid/content/AutofillOptions;Landroid/content/ContentCaptureOptions;[J)V
 HPLandroid/app/IApplicationThread$Stub$Proxy;->clearDnsCache()V
 HPLandroid/app/IApplicationThread$Stub$Proxy;->dispatchPackageBroadcast(I[Ljava/lang/String;)V
 HPLandroid/app/IApplicationThread$Stub$Proxy;->dumpService(Landroid/os/ParcelFileDescriptor;Landroid/os/IBinder;[Ljava/lang/String;)V
+HPLandroid/app/IApplicationThread$Stub$Proxy;->requestAssistContextExtras(Landroid/os/IBinder;Landroid/os/IBinder;III)V
 HSPLandroid/app/IApplicationThread$Stub$Proxy;->runIsolatedEntryPoint(Ljava/lang/String;[Ljava/lang/String;)V
 HSPLandroid/app/IApplicationThread$Stub$Proxy;->scheduleBindService(Landroid/os/IBinder;Landroid/content/Intent;ZI)V
 HSPLandroid/app/IApplicationThread$Stub$Proxy;->scheduleCreateService(Landroid/os/IBinder;Landroid/content/pm/ServiceInfo;Landroid/content/res/CompatibilityInfo;I)V
@@ -2529,11 +2341,9 @@
 HSPLandroid/app/IBackupAgent$Stub;-><init>()V
 HSPLandroid/app/IBackupAgent$Stub;->asBinder()Landroid/os/IBinder;
 HSPLandroid/app/IBackupAgent$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-PLandroid/app/IInstantAppResolver$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+HPLandroid/app/IInstantAppResolver$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HPLandroid/app/IInstantAppResolver$Stub$Proxy;->getInstantAppResolveInfoList(Landroid/content/pm/InstantAppRequestInfo;ILandroid/os/IRemoteCallback;)V
-HSPLandroid/app/IInstantAppResolver$Stub;-><init>()V
-PLandroid/app/IInstantAppResolver$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/IInstantAppResolver;
-HSPLandroid/app/IInstantAppResolver$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
+HPLandroid/app/IInstantAppResolver$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/IInstantAppResolver;
 HSPLandroid/app/IInstrumentationWatcher$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/IInstrumentationWatcher;
 HSPLandroid/app/INotificationManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HSPLandroid/app/INotificationManager$Stub$Proxy;->areNotificationsEnabled(Ljava/lang/String;)Z
@@ -2543,28 +2353,26 @@
 HSPLandroid/app/INotificationManager$Stub$Proxy;->createNotificationChannels(Ljava/lang/String;Landroid/content/pm/ParceledListSlice;)V
 HSPLandroid/app/INotificationManager$Stub$Proxy;->deleteNotificationChannel(Ljava/lang/String;Ljava/lang/String;)V
 HSPLandroid/app/INotificationManager$Stub$Proxy;->enqueueNotificationWithTag(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILandroid/app/Notification;I)V
+HSPLandroid/app/INotificationManager$Stub$Proxy;->enqueueTextOrCustomToast(Ljava/lang/String;Landroid/os/IBinder;Landroid/app/ITransientNotification;IIZ)V
 HSPLandroid/app/INotificationManager$Stub$Proxy;->finishToken(Ljava/lang/String;Landroid/os/IBinder;)V
 HSPLandroid/app/INotificationManager$Stub$Proxy;->getActiveNotificationsFromListener(Landroid/service/notification/INotificationListener;[Ljava/lang/String;I)Landroid/content/pm/ParceledListSlice;
 HSPLandroid/app/INotificationManager$Stub$Proxy;->getAppActiveNotifications(Ljava/lang/String;I)Landroid/content/pm/ParceledListSlice;
 HSPLandroid/app/INotificationManager$Stub$Proxy;->getConsolidatedNotificationPolicy()Landroid/app/NotificationManager$Policy;
 HSPLandroid/app/INotificationManager$Stub$Proxy;->getEffectsSuppressor()Landroid/content/ComponentName;
 HSPLandroid/app/INotificationManager$Stub$Proxy;->getNotificationChannel(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)Landroid/app/NotificationChannel;
-HSPLandroid/app/INotificationManager$Stub$Proxy;->getNotificationChannelGroup(Ljava/lang/String;Ljava/lang/String;)Landroid/app/NotificationChannelGroup;
 HSPLandroid/app/INotificationManager$Stub$Proxy;->getNotificationChannelGroups(Ljava/lang/String;)Landroid/content/pm/ParceledListSlice;
 HSPLandroid/app/INotificationManager$Stub$Proxy;->getNotificationChannels(Ljava/lang/String;Ljava/lang/String;I)Landroid/content/pm/ParceledListSlice;
 HSPLandroid/app/INotificationManager$Stub$Proxy;->getNotificationPolicy(Ljava/lang/String;)Landroid/app/NotificationManager$Policy;
 HSPLandroid/app/INotificationManager$Stub$Proxy;->getPrivateNotificationsAllowed()Z
 HSPLandroid/app/INotificationManager$Stub$Proxy;->getZenMode()I
 HSPLandroid/app/INotificationManager$Stub$Proxy;->getZenModeConfig()Landroid/service/notification/ZenModeConfig;
-HSPLandroid/app/INotificationManager$Stub$Proxy;->getZenRules()Ljava/util/List;
 HSPLandroid/app/INotificationManager$Stub$Proxy;->isNotificationPolicyAccessGranted(Ljava/lang/String;)Z
 HSPLandroid/app/INotificationManager$Stub$Proxy;->registerListener(Landroid/service/notification/INotificationListener;Landroid/content/ComponentName;I)V
-HSPLandroid/app/INotificationManager$Stub$Proxy;->requestUnbindProvider(Landroid/service/notification/IConditionProvider;)V
 HSPLandroid/app/INotificationManager$Stub$Proxy;->setNotificationsShownFromListener(Landroid/service/notification/INotificationListener;[Ljava/lang/String;)V
-PLandroid/app/INotificationManager$Stub$Proxy;->setPrivateNotificationsAllowed(Z)V
 HSPLandroid/app/INotificationManager$Stub$Proxy;->shouldHideSilentStatusIcons(Ljava/lang/String;)Z
 HSPLandroid/app/INotificationManager$Stub;-><init>()V
 HSPLandroid/app/INotificationManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/INotificationManager;
+PLandroid/app/INotificationManager$Stub;->getDefaultTransactionName(I)Ljava/lang/String;
 HSPLandroid/app/INotificationManager$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 PLandroid/app/IProcessObserver$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 PLandroid/app/IProcessObserver$Stub$Proxy;->asBinder()Landroid/os/IBinder;
@@ -2579,7 +2387,6 @@
 HSPLandroid/app/IRequestFinishCallback$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/app/ISearchManager$Stub;-><init>()V
 HSPLandroid/app/ISearchManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/ISearchManager;
-PLandroid/app/ISearchManager$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/app/IServiceConnection$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HSPLandroid/app/IServiceConnection$Stub$Proxy;->asBinder()Landroid/os/IBinder;
 HSPLandroid/app/IServiceConnection$Stub$Proxy;->connected(Landroid/content/ComponentName;Landroid/os/IBinder;Z)V
@@ -2623,13 +2430,12 @@
 HSPLandroid/app/IUidObserver$Stub;-><init>()V
 HSPLandroid/app/IUidObserver$Stub;->asBinder()Landroid/os/IBinder;
 HSPLandroid/app/IUidObserver$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/IUidObserver;
-HSPLandroid/app/IUidObserver$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/app/IUriGrantsManager$Stub;-><init>()V
 HSPLandroid/app/IUriGrantsManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/IUriGrantsManager;
 HPLandroid/app/IUriGrantsManager$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/app/IUserSwitchObserver$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HSPLandroid/app/IUserSwitchObserver$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-PLandroid/app/IUserSwitchObserver$Stub$Proxy;->onLockedBootComplete(I)V
+HPLandroid/app/IUserSwitchObserver$Stub$Proxy;->onLockedBootComplete(I)V
 HSPLandroid/app/IUserSwitchObserver$Stub;-><init>()V
 HSPLandroid/app/IUserSwitchObserver$Stub;->asBinder()Landroid/os/IBinder;
 HSPLandroid/app/IUserSwitchObserver$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/IUserSwitchObserver;
@@ -2648,25 +2454,11 @@
 HSPLandroid/app/IWallpaperManager$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/app/IWallpaperManagerCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HSPLandroid/app/IWallpaperManagerCallback$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-PLandroid/app/IWallpaperManagerCallback$Stub$Proxy;->onWallpaperColorsChanged(Landroid/app/WallpaperColors;II)V
+HPLandroid/app/IWallpaperManagerCallback$Stub$Proxy;->onWallpaperColorsChanged(Landroid/app/WallpaperColors;II)V
 HSPLandroid/app/IWallpaperManagerCallback$Stub;-><init>()V
 HSPLandroid/app/IWallpaperManagerCallback$Stub;->asBinder()Landroid/os/IBinder;
 HSPLandroid/app/IWallpaperManagerCallback$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/IWallpaperManagerCallback;
-HSPLandroid/app/InstantAppResolverService$1;-><init>(Landroid/app/InstantAppResolverService;)V
-HSPLandroid/app/InstantAppResolverService$1;->getInstantAppResolveInfoList(Landroid/content/pm/InstantAppRequestInfo;ILandroid/os/IRemoteCallback;)V
-HSPLandroid/app/InstantAppResolverService$InstantAppResolutionCallback;-><init>(ILandroid/os/IRemoteCallback;)V
-HSPLandroid/app/InstantAppResolverService$InstantAppResolutionCallback;->onInstantAppResolveInfo(Ljava/util/List;)V
-HSPLandroid/app/InstantAppResolverService$ServiceHandler;-><init>(Landroid/app/InstantAppResolverService;Landroid/os/Looper;)V
-HSPLandroid/app/InstantAppResolverService$ServiceHandler;->handleMessage(Landroid/os/Message;)V
-HSPLandroid/app/InstantAppResolverService;-><clinit>()V
-HSPLandroid/app/InstantAppResolverService;-><init>()V
-HSPLandroid/app/InstantAppResolverService;->access$000()Z
-HSPLandroid/app/InstantAppResolverService;->attachBaseContext(Landroid/content/Context;)V
-HSPLandroid/app/InstantAppResolverService;->getLooper()Landroid/os/Looper;
-HSPLandroid/app/InstantAppResolverService;->onBind(Landroid/content/Intent;)Landroid/os/IBinder;
-HSPLandroid/app/InstantAppResolverService;->onGetInstantAppResolveInfo(Landroid/content/Intent;[ILandroid/os/UserHandle;Ljava/lang/String;Landroid/app/InstantAppResolverService$InstantAppResolutionCallback;)V
-HSPLandroid/app/InstantAppResolverService;->onGetInstantAppResolveInfo(Landroid/content/Intent;[ILjava/lang/String;Landroid/app/InstantAppResolverService$InstantAppResolutionCallback;)V
-HSPLandroid/app/InstantAppResolverService;->onGetInstantAppResolveInfo(Landroid/content/pm/InstantAppRequestInfo;Landroid/app/InstantAppResolverService$InstantAppResolutionCallback;)V
+HSPLandroid/app/IWallpaperManagerCallback$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/app/Instrumentation;-><init>()V
 HSPLandroid/app/Instrumentation;->basicInit(Landroid/app/ActivityThread;)V
 HSPLandroid/app/Instrumentation;->callActivityOnCreate(Landroid/app/Activity;Landroid/os/Bundle;)V
@@ -2694,14 +2486,12 @@
 HSPLandroid/app/Instrumentation;->postPerformCreate(Landroid/app/Activity;)V
 HSPLandroid/app/Instrumentation;->prePerformCreate(Landroid/app/Activity;)V
 HSPLandroid/app/IntentReceiverLeaked;-><init>(Ljava/lang/String;)V
-HSPLandroid/app/IntentService$ServiceHandler;-><init>(Landroid/app/IntentService;Landroid/os/Looper;)V
 HSPLandroid/app/IntentService$ServiceHandler;->handleMessage(Landroid/os/Message;)V
 HSPLandroid/app/IntentService;-><init>(Ljava/lang/String;)V
 HSPLandroid/app/IntentService;->onCreate()V
 HSPLandroid/app/IntentService;->onDestroy()V
 HSPLandroid/app/IntentService;->onStart(Landroid/content/Intent;I)V
 HSPLandroid/app/IntentService;->onStartCommand(Landroid/content/Intent;II)I
-HSPLandroid/app/IntentService;->setIntentRedelivery(Z)V
 HSPLandroid/app/JobSchedulerImpl;-><init>(Landroid/app/job/IJobScheduler;)V
 HSPLandroid/app/JobSchedulerImpl;->cancel(I)V
 HSPLandroid/app/JobSchedulerImpl;->enqueue(Landroid/app/job/JobInfo;Landroid/app/job/JobWorkItem;)I
@@ -2718,7 +2508,6 @@
 HSPLandroid/app/KeyguardManager;->isDeviceSecure(I)Z
 HSPLandroid/app/KeyguardManager;->isKeyguardLocked()Z
 HSPLandroid/app/KeyguardManager;->isKeyguardSecure()Z
-PLandroid/app/KeyguardManager;->setPrivateNotificationsAllowed(Z)V
 HSPLandroid/app/LoadedApk$ReceiverDispatcher$Args;-><init>(Landroid/app/LoadedApk$ReceiverDispatcher;Landroid/content/Intent;ILjava/lang/String;Landroid/os/Bundle;ZZI)V
 HSPLandroid/app/LoadedApk$ReceiverDispatcher$Args;->getRunnable()Ljava/lang/Runnable;
 HSPLandroid/app/LoadedApk$ReceiverDispatcher$Args;->lambda$getRunnable$0$LoadedApk$ReceiverDispatcher$Args()V
@@ -2776,7 +2565,6 @@
 HSPLandroid/app/LoadedApk;->getResDir()Ljava/lang/String;
 HSPLandroid/app/LoadedApk;->getResources()Landroid/content/res/Resources;
 HSPLandroid/app/LoadedApk;->getServiceDispatcher(Landroid/content/ServiceConnection;Landroid/content/Context;Landroid/os/Handler;I)Landroid/app/IServiceConnection;
-HSPLandroid/app/LoadedApk;->getServiceDispatcher(Landroid/content/ServiceConnection;Landroid/content/Context;Ljava/util/concurrent/Executor;I)Landroid/app/IServiceConnection;
 HSPLandroid/app/LoadedApk;->getServiceDispatcherCommon(Landroid/content/ServiceConnection;Landroid/content/Context;Landroid/os/Handler;Ljava/util/concurrent/Executor;I)Landroid/app/IServiceConnection;
 HSPLandroid/app/LoadedApk;->getSplitClassLoader(Ljava/lang/String;)Ljava/lang/ClassLoader;
 HSPLandroid/app/LoadedApk;->getSplitPaths(Ljava/lang/String;)[Ljava/lang/String;
@@ -2793,14 +2581,12 @@
 HSPLandroid/app/LoadedApk;->setThreadPolicy(Landroid/os/StrictMode$ThreadPolicy;)V
 HSPLandroid/app/LoadedApk;->setupJitProfileSupport()V
 HSPLandroid/app/LoadedApk;->updateApplicationInfo(Landroid/content/pm/ApplicationInfo;Ljava/util/List;)V
-HSPLandroid/app/LoaderManagerImpl;->doStop()V
 HSPLandroid/app/Notification$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/Notification;
 HSPLandroid/app/Notification$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/app/Notification$Action$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/Notification$Action;
 HSPLandroid/app/Notification$Action$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/app/Notification$Action$1;->newArray(I)[Landroid/app/Notification$Action;
 HSPLandroid/app/Notification$Action$1;->newArray(I)[Ljava/lang/Object;
-HSPLandroid/app/Notification$Action$Builder;-><init>(ILjava/lang/CharSequence;Landroid/app/PendingIntent;)V
 HSPLandroid/app/Notification$Action$Builder;-><init>(Landroid/graphics/drawable/Icon;Ljava/lang/CharSequence;Landroid/app/PendingIntent;)V
 HSPLandroid/app/Notification$Action$Builder;-><init>(Landroid/graphics/drawable/Icon;Ljava/lang/CharSequence;Landroid/app/PendingIntent;Landroid/os/Bundle;[Landroid/app/RemoteInput;ZI)V
 HSPLandroid/app/Notification$Action$Builder;->addExtras(Landroid/os/Bundle;)Landroid/app/Notification$Action$Builder;
@@ -2841,21 +2627,17 @@
 HSPLandroid/app/Notification$BubbleMetadata$Builder;-><init>()V
 HSPLandroid/app/Notification$BubbleMetadata$Builder;->build()Landroid/app/Notification$BubbleMetadata;
 HSPLandroid/app/Notification$BubbleMetadata$Builder;->setDesiredHeight(I)Landroid/app/Notification$BubbleMetadata$Builder;
-HSPLandroid/app/Notification$BubbleMetadata;-><init>(Landroid/app/PendingIntent;Landroid/app/PendingIntent;Landroid/graphics/drawable/Icon;IILjava/lang/String;)V
 HSPLandroid/app/Notification$BubbleMetadata;-><init>(Landroid/app/PendingIntent;Landroid/app/PendingIntent;Landroid/graphics/drawable/Icon;IILjava/lang/String;Landroid/app/Notification$1;)V
 HSPLandroid/app/Notification$BubbleMetadata;->setFlags(I)V
 HSPLandroid/app/Notification$Builder;-><init>(Landroid/content/Context;)V
 HSPLandroid/app/Notification$Builder;-><init>(Landroid/content/Context;Landroid/app/Notification;)V
 HSPLandroid/app/Notification$Builder;-><init>(Landroid/content/Context;Ljava/lang/String;)V
-HSPLandroid/app/Notification$Builder;->access$2300(Landroid/app/Notification$Builder;ILandroid/app/Notification$StandardTemplateParams;Landroid/app/Notification$TemplateBindResult;)Landroid/widget/RemoteViews;
 HSPLandroid/app/Notification$Builder;->access$2900(Landroid/app/Notification$Builder;)Ljava/util/ArrayList;
 HSPLandroid/app/Notification$Builder;->access$300(Landroid/app/Notification$Builder;)Landroid/app/Notification;
 HSPLandroid/app/Notification$Builder;->access$3400(Landroid/app/Notification$Builder;)Landroid/content/Context;
 HSPLandroid/app/Notification$Builder;->addAction(ILjava/lang/CharSequence;Landroid/app/PendingIntent;)Landroid/app/Notification$Builder;
 HSPLandroid/app/Notification$Builder;->addAction(Landroid/app/Notification$Action;)Landroid/app/Notification$Builder;
 HSPLandroid/app/Notification$Builder;->addExtras(Landroid/os/Bundle;)Landroid/app/Notification$Builder;
-HSPLandroid/app/Notification$Builder;->addPerson(Landroid/app/Person;)Landroid/app/Notification$Builder;
-HSPLandroid/app/Notification$Builder;->addPerson(Ljava/lang/String;)Landroid/app/Notification$Builder;
 HSPLandroid/app/Notification$Builder;->applyStandardTemplate(ILandroid/app/Notification$StandardTemplateParams;Landroid/app/Notification$TemplateBindResult;)Landroid/widget/RemoteViews;
 HSPLandroid/app/Notification$Builder;->applyStandardTemplate(ILandroid/app/Notification$TemplateBindResult;)Landroid/widget/RemoteViews;
 HSPLandroid/app/Notification$Builder;->applyStandardTemplateWithActions(ILandroid/app/Notification$StandardTemplateParams;Landroid/app/Notification$TemplateBindResult;)Landroid/widget/RemoteViews;
@@ -2876,6 +2658,7 @@
 HSPLandroid/app/Notification$Builder;->buildUnstyled()Landroid/app/Notification;
 HSPLandroid/app/Notification$Builder;->calculateMarginEnd(ZZ)I
 HSPLandroid/app/Notification$Builder;->createBigContentView()Landroid/widget/RemoteViews;
+HSPLandroid/app/Notification$Builder;->createContentView()Landroid/widget/RemoteViews;
 HSPLandroid/app/Notification$Builder;->createContentView(Z)Landroid/widget/RemoteViews;
 HSPLandroid/app/Notification$Builder;->createHeadsUpContentView(Z)Landroid/widget/RemoteViews;
 HSPLandroid/app/Notification$Builder;->createSummaryText()Ljava/lang/CharSequence;
@@ -2885,7 +2668,6 @@
 HSPLandroid/app/Notification$Builder;->getAllExtras()Landroid/os/Bundle;
 HSPLandroid/app/Notification$Builder;->getBackgroundColor(Landroid/app/Notification$StandardTemplateParams;)I
 HSPLandroid/app/Notification$Builder;->getBaseLayoutResource()I
-HSPLandroid/app/Notification$Builder;->getBigBaseLayoutResource()I
 HSPLandroid/app/Notification$Builder;->getHeadsUpStatusBarText(Z)Ljava/lang/CharSequence;
 HSPLandroid/app/Notification$Builder;->getNeutralColor(Landroid/app/Notification$StandardTemplateParams;)I
 HSPLandroid/app/Notification$Builder;->getPrimaryTextColor(Landroid/app/Notification$StandardTemplateParams;)I
@@ -2980,10 +2762,7 @@
 HSPLandroid/app/Notification$InboxStyle;->makeBigContentView()Landroid/widget/RemoteViews;
 HSPLandroid/app/Notification$InboxStyle;->restoreFromExtras(Landroid/os/Bundle;)V
 HSPLandroid/app/Notification$MediaStyle;-><init>()V
-HSPLandroid/app/Notification$MediaStyle;->addExtras(Landroid/os/Bundle;)V
-HSPLandroid/app/Notification$MediaStyle;->buildStyled(Landroid/app/Notification;)Landroid/app/Notification;
 HSPLandroid/app/Notification$MediaStyle;->restoreFromExtras(Landroid/os/Bundle;)V
-HSPLandroid/app/Notification$MediaStyle;->setShowActionsInCompactView([I)Landroid/app/Notification$MediaStyle;
 HSPLandroid/app/Notification$MessagingStyle$Message;-><init>(Ljava/lang/CharSequence;JLandroid/app/Person;Z)V
 HSPLandroid/app/Notification$MessagingStyle$Message;->access$3500(Landroid/app/Notification$MessagingStyle$Message;)Ljava/lang/CharSequence;
 HSPLandroid/app/Notification$MessagingStyle$Message;->access$3600(Landroid/app/Notification$MessagingStyle$Message;)Landroid/app/Person;
@@ -2992,26 +2771,31 @@
 HSPLandroid/app/Notification$MessagingStyle$Message;->getExtras()Landroid/os/Bundle;
 HSPLandroid/app/Notification$MessagingStyle$Message;->getMessageFromBundle(Landroid/os/Bundle;)Landroid/app/Notification$MessagingStyle$Message;
 HSPLandroid/app/Notification$MessagingStyle$Message;->getMessagesFromBundleArray([Landroid/os/Parcelable;)Ljava/util/List;
+HSPLandroid/app/Notification$MessagingStyle$Message;->getSender()Ljava/lang/CharSequence;
 HSPLandroid/app/Notification$MessagingStyle$Message;->getSenderPerson()Landroid/app/Person;
 HSPLandroid/app/Notification$MessagingStyle$Message;->getText()Ljava/lang/CharSequence;
 HSPLandroid/app/Notification$MessagingStyle$Message;->getTimestamp()J
+HSPLandroid/app/Notification$MessagingStyle$Message;->isRemoteInputHistory()Z
 HSPLandroid/app/Notification$MessagingStyle$Message;->toBundle()Landroid/os/Bundle;
 HSPLandroid/app/Notification$MessagingStyle;-><init>()V
 HSPLandroid/app/Notification$MessagingStyle;->addExtras(Landroid/os/Bundle;)V
 HSPLandroid/app/Notification$MessagingStyle;->findLatestIncomingMessage()Landroid/app/Notification$MessagingStyle$Message;
 HSPLandroid/app/Notification$MessagingStyle;->findLatestIncomingMessage(Ljava/util/List;)Landroid/app/Notification$MessagingStyle$Message;
 HSPLandroid/app/Notification$MessagingStyle;->fixTitleAndTextExtras(Landroid/os/Bundle;)V
+HSPLandroid/app/Notification$MessagingStyle;->getHeadsUpStatusBarText()Ljava/lang/CharSequence;
 HSPLandroid/app/Notification$MessagingStyle;->getMessages()Ljava/util/List;
+HSPLandroid/app/Notification$MessagingStyle;->isGroupConversation()Z
+HSPLandroid/app/Notification$MessagingStyle;->makeBigContentView()Landroid/widget/RemoteViews;
 HSPLandroid/app/Notification$MessagingStyle;->makeContentView(Z)Landroid/widget/RemoteViews;
 HSPLandroid/app/Notification$MessagingStyle;->makeMessagingView(ZZ)Landroid/widget/RemoteViews;
 HSPLandroid/app/Notification$MessagingStyle;->restoreFromExtras(Landroid/os/Bundle;)V
+HSPLandroid/app/Notification$MessagingStyle;->setConversationTitle(Ljava/lang/CharSequence;)Landroid/app/Notification$MessagingStyle;
 HSPLandroid/app/Notification$MessagingStyle;->validate(Landroid/content/Context;)V
 HSPLandroid/app/Notification$StandardTemplateParams;-><init>()V
 HSPLandroid/app/Notification$StandardTemplateParams;-><init>(Landroid/app/Notification$1;)V
 HSPLandroid/app/Notification$StandardTemplateParams;->fillTextsFrom(Landroid/app/Notification$Builder;)Landroid/app/Notification$StandardTemplateParams;
 HSPLandroid/app/Notification$StandardTemplateParams;->reset()Landroid/app/Notification$StandardTemplateParams;
 HSPLandroid/app/Notification$StandardTemplateParams;->setMaxRemoteInputHistory(I)Landroid/app/Notification$StandardTemplateParams;
-HSPLandroid/app/Notification$StandardTemplateParams;->text(Ljava/lang/CharSequence;)Landroid/app/Notification$StandardTemplateParams;
 HSPLandroid/app/Notification$Style;-><init>()V
 HSPLandroid/app/Notification$Style;->addExtras(Landroid/os/Bundle;)V
 HSPLandroid/app/Notification$Style;->buildStyled(Landroid/app/Notification;)Landroid/app/Notification;
@@ -3027,14 +2811,12 @@
 HSPLandroid/app/Notification$Style;->restoreFromExtras(Landroid/os/Bundle;)V
 HSPLandroid/app/Notification$Style;->setBuilder(Landroid/app/Notification$Builder;)V
 HSPLandroid/app/Notification$Style;->validate(Landroid/content/Context;)V
-HSPLandroid/app/Notification$TemplateBindResult;-><init>()V
 HSPLandroid/app/Notification$TemplateBindResult;-><init>(Landroid/app/Notification$1;)V
 HSPLandroid/app/Notification$TemplateBindResult;->getIconMarginEnd()I
 HSPLandroid/app/Notification$TemplateBindResult;->setIconMarginEnd(I)V
 HSPLandroid/app/Notification$TemplateBindResult;->setRightIconContainerVisible(Z)V
 HSPLandroid/app/Notification;-><init>()V
 HSPLandroid/app/Notification;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/app/Notification;->access$1002(Landroid/app/Notification;Landroid/app/Notification$BubbleMetadata;)Landroid/app/Notification$BubbleMetadata;
 HSPLandroid/app/Notification;->access$1102(Landroid/app/Notification;J)J
 HSPLandroid/app/Notification;->access$1300(Landroid/app/Notification;)Landroid/graphics/drawable/Icon;
 HSPLandroid/app/Notification;->access$1302(Landroid/app/Notification;Landroid/graphics/drawable/Icon;)Landroid/graphics/drawable/Icon;
@@ -3045,18 +2827,15 @@
 HSPLandroid/app/Notification;->access$1800(Landroid/app/Notification;)Z
 HSPLandroid/app/Notification;->access$2002(Landroid/app/Notification;J)J
 HSPLandroid/app/Notification;->access$2100(Landroid/app/Notification;)Landroid/graphics/drawable/Icon;
-HSPLandroid/app/Notification;->access$2202(Landroid/app/Notification;Z)Z
 HSPLandroid/app/Notification;->access$502(Landroid/app/Notification;Ljava/lang/String;)Ljava/lang/String;
 HSPLandroid/app/Notification;->access$600(Landroid/app/Notification;)Ljava/lang/String;
-HSPLandroid/app/Notification;->access$602(Landroid/app/Notification;Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/app/Notification;->access$802(Landroid/app/Notification;I)I
 HSPLandroid/app/Notification;->access$902(Landroid/app/Notification;I)I
 HSPLandroid/app/Notification;->addFieldsFromContext(Landroid/content/Context;Landroid/app/Notification;)V
 HSPLandroid/app/Notification;->addFieldsFromContext(Landroid/content/pm/ApplicationInfo;Landroid/app/Notification;)V
 HPLandroid/app/Notification;->areActionsVisiblyDifferent(Landroid/app/Notification;Landroid/app/Notification;)Z
 HPLandroid/app/Notification;->areRemoteViewsChanged(Landroid/app/Notification$Builder;Landroid/app/Notification$Builder;)Z
 HPLandroid/app/Notification;->areRemoteViewsChanged(Landroid/widget/RemoteViews;Landroid/widget/RemoteViews;)Z
-HPLandroid/app/Notification;->areStyledNotificationsVisiblyDifferent(Landroid/app/Notification$Builder;Landroid/app/Notification$Builder;)Z
+HSPLandroid/app/Notification;->areStyledNotificationsVisiblyDifferent(Landroid/app/Notification$Builder;Landroid/app/Notification$Builder;)Z
 HSPLandroid/app/Notification;->clone()Landroid/app/Notification;
 HSPLandroid/app/Notification;->cloneInto(Landroid/app/Notification;Z)V
 HSPLandroid/app/Notification;->findRemoteInputActionPair(Z)Landroid/util/Pair;
@@ -3125,11 +2904,10 @@
 HSPLandroid/app/NotificationChannel;->getUserLockedFields()I
 HSPLandroid/app/NotificationChannel;->getVibrationPattern()[J
 HSPLandroid/app/NotificationChannel;->hasUserSetImportance()Z
+HSPLandroid/app/NotificationChannel;->hashCode()I
 HSPLandroid/app/NotificationChannel;->isBlockableSystem()Z
 HSPLandroid/app/NotificationChannel;->isDeleted()Z
-HSPLandroid/app/NotificationChannel;->isDemoted()Z
 HSPLandroid/app/NotificationChannel;->isFgServiceShown()Z
-PLandroid/app/NotificationChannel;->isImportanceLockedByOEM()Z
 HSPLandroid/app/NotificationChannel;->lockFields(I)V
 HSPLandroid/app/NotificationChannel;->longArrayToString([J)Ljava/lang/String;
 HSPLandroid/app/NotificationChannel;->populateFromXml(Lorg/xmlpull/v1/XmlPullParser;)V
@@ -3210,6 +2988,7 @@
 HSPLandroid/app/NotificationManager$Policy$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/NotificationManager$Policy;
 HSPLandroid/app/NotificationManager$Policy$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/app/NotificationManager$Policy;-><init>(IIIII)V
+HSPLandroid/app/NotificationManager$Policy;-><init>(IIIIII)V
 HSPLandroid/app/NotificationManager$Policy;-><init>(Landroid/os/Parcel;)V
 HSPLandroid/app/NotificationManager$Policy;->allowAlarms()Z
 HSPLandroid/app/NotificationManager$Policy;->allowCalls()Z
@@ -3243,12 +3022,10 @@
 HSPLandroid/app/NotificationManager;->fixNotification(Landroid/app/Notification;)Landroid/app/Notification;
 HSPLandroid/app/NotificationManager;->from(Landroid/content/Context;)Landroid/app/NotificationManager;
 HSPLandroid/app/NotificationManager;->getActiveNotifications()[Landroid/service/notification/StatusBarNotification;
-HSPLandroid/app/NotificationManager;->getAutomaticZenRules()Ljava/util/Map;
 HSPLandroid/app/NotificationManager;->getConsolidatedNotificationPolicy()Landroid/app/NotificationManager$Policy;
 HSPLandroid/app/NotificationManager;->getCurrentInterruptionFilter()I
 HSPLandroid/app/NotificationManager;->getEffectsSuppressor()Landroid/content/ComponentName;
 HSPLandroid/app/NotificationManager;->getNotificationChannel(Ljava/lang/String;)Landroid/app/NotificationChannel;
-HSPLandroid/app/NotificationManager;->getNotificationChannelGroup(Ljava/lang/String;)Landroid/app/NotificationChannelGroup;
 HSPLandroid/app/NotificationManager;->getNotificationChannelGroups()Ljava/util/List;
 HSPLandroid/app/NotificationManager;->getNotificationChannels()Ljava/util/List;
 HSPLandroid/app/NotificationManager;->getNotificationPolicy()Landroid/app/NotificationManager$Policy;
@@ -3272,7 +3049,6 @@
 HSPLandroid/app/PendingIntent;->cancel()V
 HSPLandroid/app/PendingIntent;->describeContents()I
 HSPLandroid/app/PendingIntent;->equals(Ljava/lang/Object;)Z
-HSPLandroid/app/PendingIntent;->getActivities(Landroid/content/Context;I[Landroid/content/Intent;ILandroid/os/Bundle;)Landroid/app/PendingIntent;
 HSPLandroid/app/PendingIntent;->getActivity(Landroid/content/Context;ILandroid/content/Intent;I)Landroid/app/PendingIntent;
 HSPLandroid/app/PendingIntent;->getActivity(Landroid/content/Context;ILandroid/content/Intent;ILandroid/os/Bundle;)Landroid/app/PendingIntent;
 HSPLandroid/app/PendingIntent;->getActivityAsUser(Landroid/content/Context;ILandroid/content/Intent;ILandroid/os/Bundle;Landroid/os/UserHandle;)Landroid/app/PendingIntent;
@@ -3285,7 +3061,6 @@
 HSPLandroid/app/PendingIntent;->getService(Landroid/content/Context;ILandroid/content/Intent;I)Landroid/app/PendingIntent;
 HSPLandroid/app/PendingIntent;->getTag(Ljava/lang/String;)Ljava/lang/String;
 HPLandroid/app/PendingIntent;->getTarget()Landroid/content/IIntentSender;
-HSPLandroid/app/PendingIntent;->getTargetPackage()Ljava/lang/String;
 HSPLandroid/app/PendingIntent;->hashCode()I
 HSPLandroid/app/PendingIntent;->isActivity()Z
 HPLandroid/app/PendingIntent;->isBroadcast()Z
@@ -3325,18 +3100,13 @@
 HSPLandroid/app/Person;->getIcon()Landroid/graphics/drawable/Icon;
 HSPLandroid/app/Person;->getKey()Ljava/lang/String;
 HSPLandroid/app/Person;->getName()Ljava/lang/CharSequence;
+HPLandroid/app/Person;->resolveToLegacyUri()Ljava/lang/String;
 HSPLandroid/app/Person;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/app/PictureInPictureParams$Builder;-><init>()V
 HSPLandroid/app/PictureInPictureParams$Builder;->build()Landroid/app/PictureInPictureParams;
 HSPLandroid/app/PictureInPictureParams;-><init>(Landroid/util/Rational;Ljava/util/List;Landroid/graphics/Rect;)V
-PLandroid/app/ProcessMemoryState$1;-><init>()V
-PLandroid/app/ProcessMemoryState;-><clinit>()V
-HPLandroid/app/ProcessMemoryState;-><init>(IILjava/lang/String;I)V
 HSPLandroid/app/ProgressDialog;-><init>(Landroid/content/Context;)V
 HSPLandroid/app/ProgressDialog;->initFormats()V
-HSPLandroid/app/ProgressDialog;->onCreate(Landroid/os/Bundle;)V
-HSPLandroid/app/ProgressDialog;->onProgressChanged()V
-HSPLandroid/app/ProgressDialog;->onStart()V
 HSPLandroid/app/ProgressDialog;->setIndeterminate(Z)V
 HSPLandroid/app/ProgressDialog;->setMessage(Ljava/lang/CharSequence;)V
 HSPLandroid/app/PropertyInvalidatedCache$1;-><init>(Landroid/app/PropertyInvalidatedCache;IFZI)V
@@ -3377,7 +3147,6 @@
 HSPLandroid/app/RemoteInput;->getAllowFreeFormInput()Z
 HSPLandroid/app/RemoteInput;->getChoices()[Ljava/lang/CharSequence;
 HSPLandroid/app/RemoteInput;->getEditChoicesBeforeSending()I
-HSPLandroid/app/RemoteInput;->getLabel()Ljava/lang/CharSequence;
 HSPLandroid/app/RemoteInput;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/app/ResourcesManager$ActivityResources;-><init>()V
 HSPLandroid/app/ResourcesManager$ActivityResources;-><init>(Landroid/app/ResourcesManager$1;)V
@@ -3387,7 +3156,6 @@
 HSPLandroid/app/ResourcesManager$UpdateHandler;-><init>(Landroid/app/ResourcesManager;)V
 HSPLandroid/app/ResourcesManager$UpdateHandler;-><init>(Landroid/app/ResourcesManager;Landroid/app/ResourcesManager$1;)V
 HSPLandroid/app/ResourcesManager;-><init>()V
-HSPLandroid/app/ResourcesManager;->appendLibAssetsForMainAssetPath(Ljava/lang/String;[Ljava/lang/String;)V
 HSPLandroid/app/ResourcesManager;->applyCompatConfigurationLocked(ILandroid/content/res/Configuration;)Z
 HSPLandroid/app/ResourcesManager;->applyConfigurationToResourcesLocked(Landroid/content/res/Configuration;Landroid/content/res/CompatibilityInfo;)Z
 HSPLandroid/app/ResourcesManager;->applyConfigurationToResourcesLocked(Landroid/content/res/Configuration;Landroid/content/res/CompatibilityInfo;Landroid/content/res/Configuration;Landroid/content/res/ResourcesKey;Landroid/content/res/ResourcesImpl;)V
@@ -3397,6 +3165,7 @@
 HSPLandroid/app/ResourcesManager;->createAssetManager(Landroid/content/res/ResourcesKey;)Landroid/content/res/AssetManager;
 HSPLandroid/app/ResourcesManager;->createBaseActivityResources(Landroid/os/IBinder;Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;ILandroid/content/res/Configuration;Landroid/content/res/CompatibilityInfo;Ljava/lang/ClassLoader;)Landroid/content/res/Resources;
 HSPLandroid/app/ResourcesManager;->createBaseActivityResources(Landroid/os/IBinder;Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;ILandroid/content/res/Configuration;Landroid/content/res/CompatibilityInfo;Ljava/lang/ClassLoader;Ljava/util/List;)Landroid/content/res/Resources;
+HSPLandroid/app/ResourcesManager;->createBaseTokenResources(Landroid/os/IBinder;Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;ILandroid/content/res/Configuration;Landroid/content/res/CompatibilityInfo;Ljava/lang/ClassLoader;Ljava/util/List;)Landroid/content/res/Resources;
 HSPLandroid/app/ResourcesManager;->createResources(Landroid/os/IBinder;Landroid/content/res/ResourcesKey;Ljava/lang/ClassLoader;)Landroid/content/res/Resources;
 HSPLandroid/app/ResourcesManager;->createResourcesForActivityLocked(Landroid/os/IBinder;Ljava/lang/ClassLoader;Landroid/content/res/ResourcesImpl;Landroid/content/res/CompatibilityInfo;)Landroid/content/res/Resources;
 HSPLandroid/app/ResourcesManager;->createResourcesImpl(Landroid/content/res/ResourcesKey;)Landroid/content/res/ResourcesImpl;
@@ -3519,7 +3288,6 @@
 HSPLandroid/app/SharedPreferencesImpl;->startReloadIfChangedUnexpectedly()V
 HSPLandroid/app/SharedPreferencesImpl;->unregisterOnSharedPreferenceChangeListener(Landroid/content/SharedPreferences$OnSharedPreferenceChangeListener;)V
 HSPLandroid/app/SharedPreferencesImpl;->writeToFile(Landroid/app/SharedPreferencesImpl$MemoryCommitResult;Z)V
-HSPLandroid/app/StatsManager;-><init>(Landroid/content/Context;)V
 HSPLandroid/app/StatusBarManager;-><init>(Landroid/content/Context;)V
 HSPLandroid/app/StatusBarManager;->disable(I)V
 HSPLandroid/app/StatusBarManager;->getService()Lcom/android/internal/statusbar/IStatusBarService;
@@ -3528,8 +3296,7 @@
 HSPLandroid/app/SyncNotedAppOp;-><init>(ILjava/lang/String;)V
 HSPLandroid/app/SyncNotedAppOp;->getOp()Ljava/lang/String;
 HSPLandroid/app/SynchronousUserSwitchObserver;-><init>()V
-HSPLandroid/app/SystemServiceRegistry$100;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$101;->createService(Landroid/app/ContextImpl;)Landroid/app/slice/SliceManager;
+HSPLandroid/app/SystemServiceRegistry$101;->createService(Landroid/app/ContextImpl;)Landroid/content/pm/CrossProfileApps;
 HSPLandroid/app/SystemServiceRegistry$101;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
 HSPLandroid/app/SystemServiceRegistry$102;->createService(Landroid/app/ContextImpl;)Landroid/app/slice/SliceManager;
 HSPLandroid/app/SystemServiceRegistry$102;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
@@ -3539,7 +3306,6 @@
 HSPLandroid/app/SystemServiceRegistry$104;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
 HSPLandroid/app/SystemServiceRegistry$105;->createService(Landroid/app/ContextImpl;)Landroid/permission/PermissionManager;
 HSPLandroid/app/SystemServiceRegistry$105;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$106;->createService(Landroid/app/ContextImpl;)Landroid/app/role/RoleManager;
 HSPLandroid/app/SystemServiceRegistry$106;->createService(Landroid/app/ContextImpl;)Landroid/permission/PermissionControllerManager;
 HSPLandroid/app/SystemServiceRegistry$106;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
 HSPLandroid/app/SystemServiceRegistry$107;->createService(Landroid/app/ContextImpl;)Landroid/app/role/RoleManager;
@@ -3576,81 +3342,90 @@
 HSPLandroid/app/SystemServiceRegistry$14;->createService(Landroid/content/Context;)Ljava/lang/Object;
 HSPLandroid/app/SystemServiceRegistry$15;->createService()Landroid/os/IBinder;
 HSPLandroid/app/SystemServiceRegistry$15;->createService()Ljava/lang/Object;
+HSPLandroid/app/SystemServiceRegistry$16;->createService(Landroid/app/ContextImpl;)Landroid/net/TetheringManager;
+HSPLandroid/app/SystemServiceRegistry$16;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
+HSPLandroid/app/SystemServiceRegistry$16;->lambda$createService$0()Landroid/os/IBinder;
 HSPLandroid/app/SystemServiceRegistry$17;->createService(Landroid/app/ContextImpl;)Landroid/net/TetheringManager;
 HSPLandroid/app/SystemServiceRegistry$17;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
 HSPLandroid/app/SystemServiceRegistry$17;->lambda$createService$0()Landroid/os/IBinder;
 HSPLandroid/app/SystemServiceRegistry$1;->createService(Landroid/app/ContextImpl;)Landroid/view/accessibility/AccessibilityManager;
 HSPLandroid/app/SystemServiceRegistry$1;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$20;->createService(Landroid/app/ContextImpl;)Landroid/app/admin/DevicePolicyManager;
-HSPLandroid/app/SystemServiceRegistry$20;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
 HSPLandroid/app/SystemServiceRegistry$21;->createService(Landroid/app/ContextImpl;)Landroid/app/admin/DevicePolicyManager;
 HSPLandroid/app/SystemServiceRegistry$21;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
 HSPLandroid/app/SystemServiceRegistry$22;->createService()Landroid/location/CountryDetector;
 HSPLandroid/app/SystemServiceRegistry$22;->createService()Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$22;->createService(Landroid/app/ContextImpl;)Landroid/app/DownloadManager;
+HSPLandroid/app/SystemServiceRegistry$22;->createService(Landroid/app/ContextImpl;)Landroid/app/admin/DevicePolicyManager;
 HSPLandroid/app/SystemServiceRegistry$22;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
 HSPLandroid/app/SystemServiceRegistry$23;->createService(Landroid/app/ContextImpl;)Landroid/app/admin/DevicePolicyManager;
 HSPLandroid/app/SystemServiceRegistry$23;->createService(Landroid/app/ContextImpl;)Landroid/os/BatteryManager;
 HSPLandroid/app/SystemServiceRegistry$23;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
 HSPLandroid/app/SystemServiceRegistry$24;->createService(Landroid/app/ContextImpl;)Landroid/app/DownloadManager;
+HSPLandroid/app/SystemServiceRegistry$24;->createService(Landroid/app/ContextImpl;)Landroid/os/BatteryManager;
 HSPLandroid/app/SystemServiceRegistry$24;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
 HSPLandroid/app/SystemServiceRegistry$25;->createService(Landroid/app/ContextImpl;)Landroid/os/BatteryManager;
 HSPLandroid/app/SystemServiceRegistry$25;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$26;->createService()Landroid/hardware/input/InputManager;
-HSPLandroid/app/SystemServiceRegistry$26;->createService()Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$26;->createService(Landroid/app/ContextImpl;)Landroid/hardware/display/DisplayManager;
 HSPLandroid/app/SystemServiceRegistry$26;->createService(Landroid/app/ContextImpl;)Landroid/nfc/NfcManager;
 HSPLandroid/app/SystemServiceRegistry$26;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
+HSPLandroid/app/SystemServiceRegistry$27;->createService()Landroid/hardware/input/InputManager;
+HSPLandroid/app/SystemServiceRegistry$27;->createService()Ljava/lang/Object;
 HSPLandroid/app/SystemServiceRegistry$27;->createService(Landroid/app/ContextImpl;)Landroid/hardware/display/DisplayManager;
 HSPLandroid/app/SystemServiceRegistry$27;->createService(Landroid/app/ContextImpl;)Landroid/os/DropBoxManager;
 HSPLandroid/app/SystemServiceRegistry$27;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
 HSPLandroid/app/SystemServiceRegistry$28;->createService()Landroid/hardware/input/InputManager;
 HSPLandroid/app/SystemServiceRegistry$28;->createService()Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$28;->getService(Landroid/app/ContextImpl;)Landroid/view/inputmethod/InputMethodManager;
-HSPLandroid/app/SystemServiceRegistry$28;->getService(Landroid/app/ContextImpl;)Ljava/lang/Object;
+HSPLandroid/app/SystemServiceRegistry$28;->createService(Landroid/app/ContextImpl;)Landroid/hardware/display/DisplayManager;
+HSPLandroid/app/SystemServiceRegistry$28;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
 HSPLandroid/app/SystemServiceRegistry$29;->createService(Landroid/app/ContextImpl;)Landroid/hardware/display/DisplayManager;
 HSPLandroid/app/SystemServiceRegistry$29;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
 HSPLandroid/app/SystemServiceRegistry$29;->getService(Landroid/app/ContextImpl;)Landroid/view/inputmethod/InputMethodManager;
 HSPLandroid/app/SystemServiceRegistry$29;->getService(Landroid/app/ContextImpl;)Ljava/lang/Object;
 HSPLandroid/app/SystemServiceRegistry$2;->createService(Landroid/app/ContextImpl;)Landroid/view/accessibility/CaptioningManager;
 HSPLandroid/app/SystemServiceRegistry$2;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$30;->createService(Landroid/app/ContextImpl;)Landroid/app/KeyguardManager;
 HSPLandroid/app/SystemServiceRegistry$30;->createService(Landroid/app/ContextImpl;)Landroid/hardware/display/ColorDisplayManager;
-HSPLandroid/app/SystemServiceRegistry$30;->createService(Landroid/app/ContextImpl;)Landroid/view/textservice/TextServicesManager;
 HSPLandroid/app/SystemServiceRegistry$30;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
+HSPLandroid/app/SystemServiceRegistry$30;->getService(Landroid/app/ContextImpl;)Landroid/view/inputmethod/InputMethodManager;
+HSPLandroid/app/SystemServiceRegistry$30;->getService(Landroid/app/ContextImpl;)Ljava/lang/Object;
 HSPLandroid/app/SystemServiceRegistry$31;->createService(Landroid/app/ContextImpl;)Landroid/app/KeyguardManager;
+HSPLandroid/app/SystemServiceRegistry$31;->createService(Landroid/app/ContextImpl;)Landroid/view/textservice/TextServicesManager;
 HSPLandroid/app/SystemServiceRegistry$31;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
 HSPLandroid/app/SystemServiceRegistry$31;->getService(Landroid/app/ContextImpl;)Landroid/view/inputmethod/InputMethodManager;
 HSPLandroid/app/SystemServiceRegistry$31;->getService(Landroid/app/ContextImpl;)Ljava/lang/Object;
+HSPLandroid/app/SystemServiceRegistry$32;->createService(Landroid/app/ContextImpl;)Landroid/app/KeyguardManager;
 HSPLandroid/app/SystemServiceRegistry$32;->createService(Landroid/app/ContextImpl;)Landroid/view/LayoutInflater;
 HSPLandroid/app/SystemServiceRegistry$32;->createService(Landroid/app/ContextImpl;)Landroid/view/textservice/TextServicesManager;
 HSPLandroid/app/SystemServiceRegistry$32;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
 HSPLandroid/app/SystemServiceRegistry$33;->createService(Landroid/app/ContextImpl;)Landroid/app/KeyguardManager;
 HSPLandroid/app/SystemServiceRegistry$33;->createService(Landroid/app/ContextImpl;)Landroid/location/LocationManager;
+HSPLandroid/app/SystemServiceRegistry$33;->createService(Landroid/app/ContextImpl;)Landroid/view/LayoutInflater;
 HSPLandroid/app/SystemServiceRegistry$33;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
 HSPLandroid/app/SystemServiceRegistry$34;->createService(Landroid/app/ContextImpl;)Landroid/app/NotificationManager;
-HSPLandroid/app/SystemServiceRegistry$34;->createService(Landroid/app/ContextImpl;)Landroid/net/NetworkPolicyManager;
+HSPLandroid/app/SystemServiceRegistry$34;->createService(Landroid/app/ContextImpl;)Landroid/location/LocationManager;
 HSPLandroid/app/SystemServiceRegistry$34;->createService(Landroid/app/ContextImpl;)Landroid/view/LayoutInflater;
 HSPLandroid/app/SystemServiceRegistry$34;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
 HSPLandroid/app/SystemServiceRegistry$35;->createService(Landroid/app/ContextImpl;)Landroid/app/NotificationManager;
 HSPLandroid/app/SystemServiceRegistry$35;->createService(Landroid/app/ContextImpl;)Landroid/location/LocationManager;
+HSPLandroid/app/SystemServiceRegistry$35;->createService(Landroid/app/ContextImpl;)Landroid/net/NetworkPolicyManager;
 HSPLandroid/app/SystemServiceRegistry$35;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
+HSPLandroid/app/SystemServiceRegistry$36;->createService(Landroid/app/ContextImpl;)Landroid/app/NotificationManager;
 HSPLandroid/app/SystemServiceRegistry$36;->createService(Landroid/app/ContextImpl;)Landroid/net/NetworkPolicyManager;
 HSPLandroid/app/SystemServiceRegistry$36;->createService(Landroid/app/ContextImpl;)Landroid/os/PowerManager;
 HSPLandroid/app/SystemServiceRegistry$36;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
 HSPLandroid/app/SystemServiceRegistry$37;->createService(Landroid/app/ContextImpl;)Landroid/app/NotificationManager;
 HSPLandroid/app/SystemServiceRegistry$37;->createService(Landroid/app/ContextImpl;)Landroid/os/PowerManager;
 HSPLandroid/app/SystemServiceRegistry$37;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
+HSPLandroid/app/SystemServiceRegistry$38;->createService(Landroid/app/ContextImpl;)Landroid/os/PowerManager;
+HSPLandroid/app/SystemServiceRegistry$38;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
 HSPLandroid/app/SystemServiceRegistry$39;->createService(Landroid/app/ContextImpl;)Landroid/os/PowerManager;
 HSPLandroid/app/SystemServiceRegistry$39;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
 HSPLandroid/app/SystemServiceRegistry$3;->createService(Landroid/app/ContextImpl;)Landroid/accounts/AccountManager;
 HSPLandroid/app/SystemServiceRegistry$3;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
 HSPLandroid/app/SystemServiceRegistry$40;->createService(Landroid/app/ContextImpl;)Landroid/hardware/SensorManager;
 HSPLandroid/app/SystemServiceRegistry$40;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
+HSPLandroid/app/SystemServiceRegistry$41;->createService(Landroid/app/ContextImpl;)Landroid/hardware/SensorManager;
 HSPLandroid/app/SystemServiceRegistry$41;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
 HSPLandroid/app/SystemServiceRegistry$42;->createService(Landroid/app/ContextImpl;)Landroid/hardware/SensorManager;
 HSPLandroid/app/SystemServiceRegistry$42;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$43;->createService(Landroid/app/ContextImpl;)Landroid/os/storage/StorageManager;
+HSPLandroid/app/SystemServiceRegistry$43;->createService(Landroid/app/ContextImpl;)Landroid/app/StatusBarManager;
 HSPLandroid/app/SystemServiceRegistry$43;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
 HSPLandroid/app/SystemServiceRegistry$44;->createService(Landroid/app/ContextImpl;)Landroid/app/StatusBarManager;
 HSPLandroid/app/SystemServiceRegistry$44;->createService(Landroid/app/ContextImpl;)Landroid/os/storage/StorageManager;
@@ -3660,10 +3435,7 @@
 HSPLandroid/app/SystemServiceRegistry$45;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
 HSPLandroid/app/SystemServiceRegistry$46;->createService(Landroid/app/ContextImpl;)Landroid/app/usage/StorageStatsManager;
 HSPLandroid/app/SystemServiceRegistry$46;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$47;->createService(Landroid/app/ContextImpl;)Landroid/os/SystemUpdateManager;
-HSPLandroid/app/SystemServiceRegistry$47;->createService(Landroid/app/ContextImpl;)Landroid/telephony/TelephonyRegistryManager;
 HSPLandroid/app/SystemServiceRegistry$47;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$48;->createService(Landroid/app/ContextImpl;)Landroid/telecom/TelecomManager;
 HSPLandroid/app/SystemServiceRegistry$48;->createService(Landroid/app/ContextImpl;)Landroid/telephony/TelephonyRegistryManager;
 HSPLandroid/app/SystemServiceRegistry$48;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
 HSPLandroid/app/SystemServiceRegistry$49;->createService(Landroid/app/ContextImpl;)Landroid/telecom/TelecomManager;
@@ -3671,17 +3443,18 @@
 HSPLandroid/app/SystemServiceRegistry$49;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
 HSPLandroid/app/SystemServiceRegistry$4;->createService(Landroid/app/ContextImpl;)Landroid/app/ActivityManager;
 HSPLandroid/app/SystemServiceRegistry$4;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$50;->createService(Landroid/app/ContextImpl;)Landroid/app/UiModeManager;
 HSPLandroid/app/SystemServiceRegistry$50;->createService(Landroid/app/ContextImpl;)Landroid/telecom/TelecomManager;
 HSPLandroid/app/SystemServiceRegistry$50;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
 HSPLandroid/app/SystemServiceRegistry$51;->createService(Landroid/app/ContextImpl;)Landroid/app/UiModeManager;
 HSPLandroid/app/SystemServiceRegistry$51;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
 HSPLandroid/app/SystemServiceRegistry$52;->createService(Landroid/app/ContextImpl;)Landroid/app/UiModeManager;
+HSPLandroid/app/SystemServiceRegistry$52;->createService(Landroid/app/ContextImpl;)Landroid/hardware/usb/UsbManager;
 HSPLandroid/app/SystemServiceRegistry$52;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
 HSPLandroid/app/SystemServiceRegistry$53;->createService(Landroid/app/ContextImpl;)Landroid/hardware/usb/UsbManager;
 HSPLandroid/app/SystemServiceRegistry$53;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
 HSPLandroid/app/SystemServiceRegistry$55;->createService(Landroid/app/ContextImpl;)Landroid/os/Vibrator;
 HSPLandroid/app/SystemServiceRegistry$55;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
+HSPLandroid/app/SystemServiceRegistry$56;->createService(Landroid/app/ContextImpl;)Landroid/app/WallpaperManager;
 HSPLandroid/app/SystemServiceRegistry$56;->createService(Landroid/app/ContextImpl;)Landroid/os/Vibrator;
 HSPLandroid/app/SystemServiceRegistry$56;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
 HSPLandroid/app/SystemServiceRegistry$57;->createService(Landroid/app/ContextImpl;)Landroid/app/WallpaperManager;
@@ -3705,29 +3478,33 @@
 HSPLandroid/app/SystemServiceRegistry$62;->createService(Landroid/app/ContextImpl;)Landroid/os/UserManager;
 HSPLandroid/app/SystemServiceRegistry$62;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
 HSPLandroid/app/SystemServiceRegistry$63;->createService(Landroid/app/ContextImpl;)Landroid/app/AppOpsManager;
+HSPLandroid/app/SystemServiceRegistry$63;->createService(Landroid/app/ContextImpl;)Landroid/hardware/camera2/CameraManager;
 HSPLandroid/app/SystemServiceRegistry$63;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
+HSPLandroid/app/SystemServiceRegistry$64;->createService(Landroid/app/ContextImpl;)Landroid/content/pm/LauncherApps;
 HSPLandroid/app/SystemServiceRegistry$64;->createService(Landroid/app/ContextImpl;)Landroid/hardware/camera2/CameraManager;
 HSPLandroid/app/SystemServiceRegistry$64;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
 HSPLandroid/app/SystemServiceRegistry$65;->createService(Landroid/app/ContextImpl;)Landroid/content/pm/LauncherApps;
 HSPLandroid/app/SystemServiceRegistry$65;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$66;->createService(Landroid/app/ContextImpl;)Landroid/content/RestrictionsManager;
 HSPLandroid/app/SystemServiceRegistry$66;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$68;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
+HSPLandroid/app/SystemServiceRegistry$69;->createService(Landroid/app/ContextImpl;)Landroid/media/session/MediaSessionManager;
 HSPLandroid/app/SystemServiceRegistry$69;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
 HSPLandroid/app/SystemServiceRegistry$70;->createService(Landroid/app/ContextImpl;)Landroid/media/session/MediaSessionManager;
 HSPLandroid/app/SystemServiceRegistry$70;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
 HSPLandroid/app/SystemServiceRegistry$71;->createService()Landroid/app/trust/TrustManager;
 HSPLandroid/app/SystemServiceRegistry$71;->createService()Ljava/lang/Object;
+HSPLandroid/app/SystemServiceRegistry$71;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
 HSPLandroid/app/SystemServiceRegistry$72;->createService(Landroid/app/ContextImpl;)Landroid/hardware/fingerprint/FingerprintManager;
 HSPLandroid/app/SystemServiceRegistry$72;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
 HSPLandroid/app/SystemServiceRegistry$73;->createService(Landroid/app/ContextImpl;)Landroid/hardware/face/FaceManager;
 HSPLandroid/app/SystemServiceRegistry$73;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
+HSPLandroid/app/SystemServiceRegistry$74;->createService(Landroid/app/ContextImpl;)Landroid/hardware/biometrics/BiometricManager;
+HSPLandroid/app/SystemServiceRegistry$74;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
 HSPLandroid/app/SystemServiceRegistry$75;->createService(Landroid/app/ContextImpl;)Landroid/hardware/biometrics/BiometricManager;
 HSPLandroid/app/SystemServiceRegistry$75;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$76;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
 HSPLandroid/app/SystemServiceRegistry$77;->createService(Landroid/app/ContextImpl;)Landroid/net/NetworkScoreManager;
 HSPLandroid/app/SystemServiceRegistry$77;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
 HSPLandroid/app/SystemServiceRegistry$78;->createService(Landroid/app/ContextImpl;)Landroid/app/usage/UsageStatsManager;
+HSPLandroid/app/SystemServiceRegistry$78;->createService(Landroid/app/ContextImpl;)Landroid/net/NetworkScoreManager;
 HSPLandroid/app/SystemServiceRegistry$78;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
 HSPLandroid/app/SystemServiceRegistry$79;->createService(Landroid/app/ContextImpl;)Landroid/app/usage/NetworkStatsManager;
 HSPLandroid/app/SystemServiceRegistry$79;->createService(Landroid/app/ContextImpl;)Landroid/app/usage/UsageStatsManager;
@@ -3736,9 +3513,6 @@
 HSPLandroid/app/SystemServiceRegistry$7;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
 HSPLandroid/app/SystemServiceRegistry$80;->createService(Landroid/app/ContextImpl;)Landroid/app/usage/NetworkStatsManager;
 HSPLandroid/app/SystemServiceRegistry$80;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$81;->createService(Landroid/app/ContextImpl;)Landroid/appwidget/AppWidgetManager;
-HSPLandroid/app/SystemServiceRegistry$81;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$82;->createService(Landroid/app/ContextImpl;)Landroid/appwidget/AppWidgetManager;
 HSPLandroid/app/SystemServiceRegistry$82;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
 HSPLandroid/app/SystemServiceRegistry$83;->createService(Landroid/app/ContextImpl;)Landroid/appwidget/AppWidgetManager;
 HSPLandroid/app/SystemServiceRegistry$83;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
@@ -3755,8 +3529,8 @@
 HSPLandroid/app/SystemServiceRegistry$91;->createService(Landroid/app/ContextImpl;)Landroid/os/health/SystemHealthManager;
 HSPLandroid/app/SystemServiceRegistry$91;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
 HSPLandroid/app/SystemServiceRegistry$92;->createService(Landroid/app/ContextImpl;)Landroid/hardware/location/ContextHubManager;
+HSPLandroid/app/SystemServiceRegistry$92;->createService(Landroid/app/ContextImpl;)Landroid/os/health/SystemHealthManager;
 HSPLandroid/app/SystemServiceRegistry$92;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$93;->createService(Landroid/app/ContextImpl;)Landroid/view/autofill/AutofillManager;
 HSPLandroid/app/SystemServiceRegistry$93;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
 HSPLandroid/app/SystemServiceRegistry$94;->createService(Landroid/app/ContextImpl;)Landroid/view/autofill/AutofillManager;
 HSPLandroid/app/SystemServiceRegistry$94;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
@@ -3786,6 +3560,7 @@
 HSPLandroid/app/TaskStackListener;->onTaskDescriptionChanged(ILandroid/app/ActivityManager$TaskDescription;)V
 HSPLandroid/app/TaskStackListener;->onTaskDescriptionChanged(Landroid/app/ActivityManager$RunningTaskInfo;)V
 HSPLandroid/app/TaskStackListener;->onTaskDisplayChanged(II)V
+HSPLandroid/app/TaskStackListener;->onTaskFocusChanged(IZ)V
 HSPLandroid/app/TaskStackListener;->onTaskMovedToFront(I)V
 HSPLandroid/app/TaskStackListener;->onTaskMovedToFront(Landroid/app/ActivityManager$RunningTaskInfo;)V
 HSPLandroid/app/TaskStackListener;->onTaskRemovalStarted(I)V
@@ -3810,6 +3585,7 @@
 HSPLandroid/app/WallpaperInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/WallpaperInfo;
 HSPLandroid/app/WallpaperInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/app/WallpaperInfo;-><init>(Landroid/os/Parcel;)V
+HSPLandroid/app/WallpaperInfo;->supportsAmbientMode()Z
 HSPLandroid/app/WallpaperManager$ColorManagementProxy;-><init>(Landroid/content/Context;)V
 HSPLandroid/app/WallpaperManager$Globals;-><init>(Landroid/app/IWallpaperManager;Landroid/os/Looper;)V
 HSPLandroid/app/WallpaperManager$Globals;->access$200(Landroid/app/WallpaperManager$Globals;)Landroid/app/IWallpaperManager;
@@ -3889,39 +3665,26 @@
 HSPLandroid/app/admin/DevicePolicyEventLogger;-><init>(I)V
 HSPLandroid/app/admin/DevicePolicyEventLogger;->createEvent(I)Landroid/app/admin/DevicePolicyEventLogger;
 HPLandroid/app/admin/DevicePolicyEventLogger;->setAdmin(Landroid/content/ComponentName;)Landroid/app/admin/DevicePolicyEventLogger;
-PLandroid/app/admin/DevicePolicyEventLogger;->setAdmin(Ljava/lang/String;)Landroid/app/admin/DevicePolicyEventLogger;
 PLandroid/app/admin/DevicePolicyEventLogger;->setBoolean(Z)Landroid/app/admin/DevicePolicyEventLogger;
 HSPLandroid/app/admin/DevicePolicyEventLogger;->setStrings([Ljava/lang/String;)Landroid/app/admin/DevicePolicyEventLogger;
 HSPLandroid/app/admin/DevicePolicyEventLogger;->stringArrayValueToBytes([Ljava/lang/String;)[B
 HSPLandroid/app/admin/DevicePolicyEventLogger;->write()V
 HSPLandroid/app/admin/DevicePolicyManager;-><init>(Landroid/content/Context;Landroid/app/admin/IDevicePolicyManager;)V
 HSPLandroid/app/admin/DevicePolicyManager;-><init>(Landroid/content/Context;Landroid/app/admin/IDevicePolicyManager;Z)V
-HSPLandroid/app/admin/DevicePolicyManager;->getAccountTypesWithManagementDisabledAsUser(I)[Ljava/lang/String;
 HSPLandroid/app/admin/DevicePolicyManager;->getActiveAdmins()Ljava/util/List;
 HSPLandroid/app/admin/DevicePolicyManager;->getActiveAdminsAsUser(I)Ljava/util/List;
 HSPLandroid/app/admin/DevicePolicyManager;->getCameraDisabled(Landroid/content/ComponentName;I)Z
 HSPLandroid/app/admin/DevicePolicyManager;->getCurrentFailedPasswordAttempts(I)I
-HSPLandroid/app/admin/DevicePolicyManager;->getDeviceOwner()Ljava/lang/String;
 HSPLandroid/app/admin/DevicePolicyManager;->getDeviceOwnerComponentInner(Z)Landroid/content/ComponentName;
 HSPLandroid/app/admin/DevicePolicyManager;->getDeviceOwnerComponentOnAnyUser()Landroid/content/ComponentName;
-HSPLandroid/app/admin/DevicePolicyManager;->getDeviceOwnerComponentOnCallingUser()Landroid/content/ComponentName;
 HSPLandroid/app/admin/DevicePolicyManager;->getDeviceOwnerOrganizationName()Ljava/lang/CharSequence;
 HSPLandroid/app/admin/DevicePolicyManager;->getDeviceOwnerUser()Landroid/os/UserHandle;
 HSPLandroid/app/admin/DevicePolicyManager;->getGuestUserDisabled(Landroid/content/ComponentName;)Z
-HSPLandroid/app/admin/DevicePolicyManager;->getKeyguardDisabledFeatures(Landroid/content/ComponentName;)I
 HSPLandroid/app/admin/DevicePolicyManager;->getKeyguardDisabledFeatures(Landroid/content/ComponentName;I)I
 HSPLandroid/app/admin/DevicePolicyManager;->getMaximumTimeToLock(Landroid/content/ComponentName;I)J
-HSPLandroid/app/admin/DevicePolicyManager;->getPasswordQuality(Landroid/content/ComponentName;)I
-HSPLandroid/app/admin/DevicePolicyManager;->getPasswordQuality(Landroid/content/ComponentName;I)I
-HSPLandroid/app/admin/DevicePolicyManager;->getProfileOwner()Landroid/content/ComponentName;
 HSPLandroid/app/admin/DevicePolicyManager;->getProfileOwnerAsUser(I)Landroid/content/ComponentName;
 HSPLandroid/app/admin/DevicePolicyManager;->getRequiredStrongAuthTimeout(Landroid/content/ComponentName;I)J
-HSPLandroid/app/admin/DevicePolicyManager;->getStorageEncryptionStatus()I
-HSPLandroid/app/admin/DevicePolicyManager;->getStorageEncryptionStatus(I)I
-HSPLandroid/app/admin/DevicePolicyManager;->getSystemUpdatePolicy()Landroid/app/admin/SystemUpdatePolicy;
 HSPLandroid/app/admin/DevicePolicyManager;->hasDeviceIdentifierAccess(Ljava/lang/String;II)Z
-HSPLandroid/app/admin/DevicePolicyManager;->isAdminActive(Landroid/content/ComponentName;)Z
-HSPLandroid/app/admin/DevicePolicyManager;->isAdminActiveAsUser(Landroid/content/ComponentName;I)Z
 HSPLandroid/app/admin/DevicePolicyManager;->isDeviceManaged()Z
 HSPLandroid/app/admin/DevicePolicyManager;->isDeviceOwnerApp(Ljava/lang/String;)Z
 HSPLandroid/app/admin/DevicePolicyManager;->isDeviceOwnerAppOnAnyUserInner(Ljava/lang/String;Z)Z
@@ -3929,7 +3692,6 @@
 HSPLandroid/app/admin/DevicePolicyManager;->isLogoutEnabled()Z
 HSPLandroid/app/admin/DevicePolicyManager;->isNetworkLoggingEnabled(Landroid/content/ComponentName;)Z
 HSPLandroid/app/admin/DevicePolicyManager;->isProfileOwnerApp(Ljava/lang/String;)Z
-HSPLandroid/app/admin/DevicePolicyManager;->isSecondaryLockscreenEnabled(I)Z
 HSPLandroid/app/admin/DevicePolicyManager;->myUserId()I
 HSPLandroid/app/admin/DevicePolicyManager;->reportKeyguardDismissed(I)V
 HSPLandroid/app/admin/DevicePolicyManager;->reportKeyguardSecured(I)V
@@ -3948,34 +3710,24 @@
 HSPLandroid/app/admin/IDevicePolicyManager$Stub$Proxy;->getDeviceOwnerOrganizationName()Ljava/lang/CharSequence;
 HSPLandroid/app/admin/IDevicePolicyManager$Stub$Proxy;->getKeyguardDisabledFeatures(Landroid/content/ComponentName;IZ)I
 HSPLandroid/app/admin/IDevicePolicyManager$Stub$Proxy;->getMaximumTimeToLock(Landroid/content/ComponentName;IZ)J
-HSPLandroid/app/admin/IDevicePolicyManager$Stub$Proxy;->getPasswordQuality(Landroid/content/ComponentName;IZ)I
 HSPLandroid/app/admin/IDevicePolicyManager$Stub$Proxy;->getProfileOwner(I)Landroid/content/ComponentName;
 HSPLandroid/app/admin/IDevicePolicyManager$Stub$Proxy;->getProfileOwnerAsUser(I)Landroid/content/ComponentName;
-HSPLandroid/app/admin/IDevicePolicyManager$Stub$Proxy;->getStorageEncryptionStatus(Ljava/lang/String;I)I
-HSPLandroid/app/admin/IDevicePolicyManager$Stub$Proxy;->getSystemUpdatePolicy()Landroid/app/admin/SystemUpdatePolicy;
 HSPLandroid/app/admin/IDevicePolicyManager$Stub$Proxy;->hasDeviceOwner()Z
-HSPLandroid/app/admin/IDevicePolicyManager$Stub$Proxy;->isAdminActive(Landroid/content/ComponentName;I)Z
 HSPLandroid/app/admin/IDevicePolicyManager$Stub$Proxy;->isLogoutEnabled()Z
 HSPLandroid/app/admin/IDevicePolicyManager$Stub$Proxy;->isNetworkLoggingEnabled(Landroid/content/ComponentName;Ljava/lang/String;)Z
-HSPLandroid/app/admin/IDevicePolicyManager$Stub$Proxy;->isSecondaryLockscreenEnabled(I)Z
 HSPLandroid/app/admin/IDevicePolicyManager$Stub$Proxy;->reportKeyguardDismissed(I)V
 HSPLandroid/app/admin/IDevicePolicyManager$Stub$Proxy;->reportKeyguardSecured(I)V
 HSPLandroid/app/admin/IDevicePolicyManager$Stub$Proxy;->reportSuccessfulBiometricAttempt(I)V
 HSPLandroid/app/admin/IDevicePolicyManager$Stub$Proxy;->reportSuccessfulPasswordAttempt(I)V
 HSPLandroid/app/admin/IDevicePolicyManager$Stub;-><init>()V
 HSPLandroid/app/admin/IDevicePolicyManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/admin/IDevicePolicyManager;
+HPLandroid/app/admin/IDevicePolicyManager$Stub;->getDefaultTransactionName(I)Ljava/lang/String;
 HPLandroid/app/admin/IDevicePolicyManager$Stub;->onTransact$setApplicationRestrictions$(Landroid/os/Parcel;Landroid/os/Parcel;)Z
 HPLandroid/app/admin/IDevicePolicyManager$Stub;->onTransact$setUninstallBlocked$(Landroid/os/Parcel;Landroid/os/Parcel;)Z
+HPLandroid/app/admin/IDevicePolicyManager$Stub;->onTransact$setUserRestriction$(Landroid/os/Parcel;Landroid/os/Parcel;)Z
 HSPLandroid/app/admin/IDevicePolicyManager$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/app/admin/IKeyguardCallback$Stub;-><init>()V
-PLandroid/app/admin/PasswordMetrics$ComplexityBucket$1;-><init>(Ljava/lang/String;II)V
-PLandroid/app/admin/PasswordMetrics$ComplexityBucket$2;-><init>(Ljava/lang/String;II)V
-PLandroid/app/admin/PasswordMetrics$ComplexityBucket$3;-><init>(Ljava/lang/String;II)V
-PLandroid/app/admin/PasswordMetrics$ComplexityBucket$4;-><init>(Ljava/lang/String;II)V
 PLandroid/app/admin/PasswordMetrics$ComplexityBucket$4;->allowsCredType(I)Z
-PLandroid/app/admin/PasswordMetrics$ComplexityBucket;-><clinit>()V
-PLandroid/app/admin/PasswordMetrics$ComplexityBucket;-><init>(Ljava/lang/String;II)V
-PLandroid/app/admin/PasswordMetrics$ComplexityBucket;-><init>(Ljava/lang/String;IILandroid/app/admin/PasswordMetrics$1;)V
 PLandroid/app/admin/PasswordMetrics$ComplexityBucket;->forComplexity(I)Landroid/app/admin/PasswordMetrics$ComplexityBucket;
 HPLandroid/app/admin/PasswordMetrics$ComplexityBucket;->values()[Landroid/app/admin/PasswordMetrics$ComplexityBucket;
 HPLandroid/app/admin/PasswordMetrics;-><init>(I)V
@@ -4014,6 +3766,7 @@
 HSPLandroid/app/assist/AssistStructure$SendChannel;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/app/assist/AssistStructure$ViewNode;-><init>()V
 HSPLandroid/app/assist/AssistStructure$ViewNode;-><init>(Landroid/app/assist/AssistStructure$ParcelTransferReader;I)V
+HSPLandroid/app/assist/AssistStructure$ViewNode;->getAutofillHints()[Ljava/lang/String;
 HSPLandroid/app/assist/AssistStructure$ViewNode;->getAutofillId()Landroid/view/autofill/AutofillId;
 HSPLandroid/app/assist/AssistStructure$ViewNode;->getAutofillType()I
 HSPLandroid/app/assist/AssistStructure$ViewNode;->getChildAt(I)Landroid/app/assist/AssistStructure$ViewNode;
@@ -4022,47 +3775,35 @@
 HSPLandroid/app/assist/AssistStructure$ViewNode;->getContentDescription()Ljava/lang/CharSequence;
 HSPLandroid/app/assist/AssistStructure$ViewNode;->getHeight()I
 HSPLandroid/app/assist/AssistStructure$ViewNode;->getHint()Ljava/lang/String;
+HSPLandroid/app/assist/AssistStructure$ViewNode;->getHtmlInfo()Landroid/view/ViewStructure$HtmlInfo;
 HSPLandroid/app/assist/AssistStructure$ViewNode;->getIdEntry()Ljava/lang/String;
+HSPLandroid/app/assist/AssistStructure$ViewNode;->getInputType()I
 HSPLandroid/app/assist/AssistStructure$ViewNode;->getLeft()I
 HSPLandroid/app/assist/AssistStructure$ViewNode;->getScrollX()I
 HSPLandroid/app/assist/AssistStructure$ViewNode;->getScrollY()I
 HSPLandroid/app/assist/AssistStructure$ViewNode;->getText()Ljava/lang/CharSequence;
 HSPLandroid/app/assist/AssistStructure$ViewNode;->getTop()I
-HSPLandroid/app/assist/AssistStructure$ViewNode;->getVisibility()I
+HSPLandroid/app/assist/AssistStructure$ViewNode;->getWebDomain()Ljava/lang/String;
 HSPLandroid/app/assist/AssistStructure$ViewNode;->getWidth()I
-HSPLandroid/app/assist/AssistStructure$ViewNode;->isClickable()Z
-HSPLandroid/app/assist/AssistStructure$ViewNode;->isFocused()Z
 HSPLandroid/app/assist/AssistStructure$ViewNode;->writeSelfToParcel(Landroid/os/Parcel;Landroid/os/PooledStringWriter;Z[F)I
 HSPLandroid/app/assist/AssistStructure$ViewNodeBuilder;-><init>(Landroid/app/assist/AssistStructure;Landroid/app/assist/AssistStructure$ViewNode;Z)V
 HSPLandroid/app/assist/AssistStructure$ViewNodeBuilder;->getChildCount()I
 HSPLandroid/app/assist/AssistStructure$ViewNodeBuilder;->getNodeText()Landroid/app/assist/AssistStructure$ViewNodeText;
 HSPLandroid/app/assist/AssistStructure$ViewNodeBuilder;->newChild(I)Landroid/view/ViewStructure;
-HSPLandroid/app/assist/AssistStructure$ViewNodeBuilder;->setAutofillHints([Ljava/lang/String;)V
-HSPLandroid/app/assist/AssistStructure$ViewNodeBuilder;->setAutofillId(Landroid/view/autofill/AutofillId;)V
-HSPLandroid/app/assist/AssistStructure$ViewNodeBuilder;->setAutofillType(I)V
-HSPLandroid/app/assist/AssistStructure$ViewNodeBuilder;->setAutofillValue(Landroid/view/autofill/AutofillValue;)V
 HSPLandroid/app/assist/AssistStructure$ViewNodeBuilder;->setChildCount(I)V
 HSPLandroid/app/assist/AssistStructure$ViewNodeBuilder;->setClassName(Ljava/lang/String;)V
 HSPLandroid/app/assist/AssistStructure$ViewNodeBuilder;->setClickable(Z)V
 HSPLandroid/app/assist/AssistStructure$ViewNodeBuilder;->setContentDescription(Ljava/lang/CharSequence;)V
-HSPLandroid/app/assist/AssistStructure$ViewNodeBuilder;->setDataIsSensitive(Z)V
 HSPLandroid/app/assist/AssistStructure$ViewNodeBuilder;->setDimens(IIIIII)V
 HSPLandroid/app/assist/AssistStructure$ViewNodeBuilder;->setEnabled(Z)V
 HSPLandroid/app/assist/AssistStructure$ViewNodeBuilder;->setFocusable(Z)V
 HSPLandroid/app/assist/AssistStructure$ViewNodeBuilder;->setFocused(Z)V
 HSPLandroid/app/assist/AssistStructure$ViewNodeBuilder;->setHint(Ljava/lang/CharSequence;)V
-HSPLandroid/app/assist/AssistStructure$ViewNodeBuilder;->setHintIdEntry(Ljava/lang/String;)V
 HSPLandroid/app/assist/AssistStructure$ViewNodeBuilder;->setId(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/app/assist/AssistStructure$ViewNodeBuilder;->setImportantForAutofill(I)V
 HSPLandroid/app/assist/AssistStructure$ViewNodeBuilder;->setInputType(I)V
 HSPLandroid/app/assist/AssistStructure$ViewNodeBuilder;->setLongClickable(Z)V
-HSPLandroid/app/assist/AssistStructure$ViewNodeBuilder;->setMaxTextEms(I)V
-HSPLandroid/app/assist/AssistStructure$ViewNodeBuilder;->setMaxTextLength(I)V
-HSPLandroid/app/assist/AssistStructure$ViewNodeBuilder;->setMinTextEms(I)V
 HSPLandroid/app/assist/AssistStructure$ViewNodeBuilder;->setOpaque(Z)V
 HSPLandroid/app/assist/AssistStructure$ViewNodeBuilder;->setSelected(Z)V
-HSPLandroid/app/assist/AssistStructure$ViewNodeBuilder;->setText(Ljava/lang/CharSequence;)V
-HSPLandroid/app/assist/AssistStructure$ViewNodeBuilder;->setTextIdEntry(Ljava/lang/String;)V
 HSPLandroid/app/assist/AssistStructure$ViewNodeBuilder;->setVisibility(I)V
 HSPLandroid/app/assist/AssistStructure$ViewNodeText;-><init>()V
 HSPLandroid/app/assist/AssistStructure$ViewNodeText;-><init>(Landroid/os/Parcel;Z)V
@@ -4077,7 +3818,6 @@
 HSPLandroid/app/assist/AssistStructure$WindowNode;->getTitle()Ljava/lang/CharSequence;
 HSPLandroid/app/assist/AssistStructure$WindowNode;->getTop()I
 HSPLandroid/app/assist/AssistStructure$WindowNode;->getWidth()I
-HSPLandroid/app/assist/AssistStructure$WindowNode;->resolveViewAutofillFlags(Landroid/content/Context;I)I
 HSPLandroid/app/assist/AssistStructure$WindowNode;->writeSelfToParcel(Landroid/os/Parcel;Landroid/os/PooledStringWriter;[F)V
 HSPLandroid/app/assist/AssistStructure;-><init>(Landroid/app/Activity;ZI)V
 HSPLandroid/app/assist/AssistStructure;-><init>(Landroid/os/Parcel;)V
@@ -4093,11 +3833,13 @@
 HSPLandroid/app/assist/AssistStructure;->access$500(Landroid/app/assist/AssistStructure;)Ljava/util/ArrayList;
 HSPLandroid/app/assist/AssistStructure;->clearSendChannel()V
 HSPLandroid/app/assist/AssistStructure;->ensureData()V
-HSPLandroid/app/assist/AssistStructure;->getActivityComponent()Landroid/content/ComponentName;
 HSPLandroid/app/assist/AssistStructure;->getWindowNodeAt(I)Landroid/app/assist/AssistStructure$WindowNode;
 HSPLandroid/app/assist/AssistStructure;->getWindowNodeCount()I
 HSPLandroid/app/assist/AssistStructure;->setAcquisitionEndTime(J)V
 HSPLandroid/app/assist/AssistStructure;->setAcquisitionStartTime(J)V
+PLandroid/app/assist/AssistStructure;->setActivityComponent(Landroid/content/ComponentName;)V
+PLandroid/app/assist/AssistStructure;->setHomeActivity(Z)V
+PLandroid/app/assist/AssistStructure;->setTaskId(I)V
 HSPLandroid/app/assist/AssistStructure;->waitForReady()Z
 HSPLandroid/app/assist/AssistStructure;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/app/backup/BackupAgent$BackupServiceBinder;-><init>(Landroid/app/backup/BackupAgent;)V
@@ -4141,23 +3883,8 @@
 HSPLandroid/app/backup/BackupManager;->checkServiceBinder()V
 HSPLandroid/app/backup/BackupManager;->dataChanged()V
 HSPLandroid/app/backup/BackupManager;->dataChanged(Ljava/lang/String;)V
-HSPLandroid/app/backup/BackupManager;->getCurrentTransport()Ljava/lang/String;
-HSPLandroid/app/backup/BackupManager;->isBackupEnabled()Z
-HSPLandroid/app/backup/BackupManager;->isBackupServiceActive(Landroid/os/UserHandle;)Z
-HSPLandroid/app/backup/BackupManager;->updateTransportAttributes(Landroid/content/ComponentName;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/CharSequence;)V
-HSPLandroid/app/backup/BackupManager;->updateTransportAttributes(Landroid/content/ComponentName;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;)V
-HSPLandroid/app/backup/BackupTransport$TransportImpl;-><init>(Landroid/app/backup/BackupTransport;)V
-HSPLandroid/app/backup/BackupTransport$TransportImpl;->configurationIntent()Landroid/content/Intent;
-HSPLandroid/app/backup/BackupTransport$TransportImpl;->currentDestinationString()Ljava/lang/String;
-HSPLandroid/app/backup/BackupTransport$TransportImpl;->dataManagementIntent()Landroid/content/Intent;
-HSPLandroid/app/backup/BackupTransport$TransportImpl;->dataManagementIntentLabel()Ljava/lang/CharSequence;
-HSPLandroid/app/backup/BackupTransport$TransportImpl;->name()Ljava/lang/String;
-HSPLandroid/app/backup/BackupTransport$TransportImpl;->transportDirName()Ljava/lang/String;
-HSPLandroid/app/backup/BackupTransport;-><init>()V
-HSPLandroid/app/backup/BackupTransport;->configurationIntent()Landroid/content/Intent;
-HSPLandroid/app/backup/BackupTransport;->dataManagementIntent()Landroid/content/Intent;
-HSPLandroid/app/backup/BackupTransport;->dataManagementIntentLabel()Ljava/lang/CharSequence;
-HSPLandroid/app/backup/BackupTransport;->getBinder()Landroid/os/IBinder;
+HSPLandroid/app/backup/FileBackupHelper;-><init>(Landroid/content/Context;[Ljava/lang/String;)V
+HSPLandroid/app/backup/FileBackupHelper;->performBackup(Landroid/os/ParcelFileDescriptor;Landroid/app/backup/BackupDataOutput;Landroid/os/ParcelFileDescriptor;)V
 HSPLandroid/app/backup/FileBackupHelperBase;-><init>(Landroid/content/Context;)V
 HSPLandroid/app/backup/FileBackupHelperBase;->finalize()V
 HSPLandroid/app/backup/FileBackupHelperBase;->performBackup_checked(Landroid/os/ParcelFileDescriptor;Landroid/app/backup/BackupDataOutput;Landroid/os/ParcelFileDescriptor;[Ljava/lang/String;[Ljava/lang/String;)V
@@ -4167,20 +3894,18 @@
 HSPLandroid/app/backup/IBackupCallback$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/backup/IBackupCallback;
 HSPLandroid/app/backup/IBackupManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HSPLandroid/app/backup/IBackupManager$Stub$Proxy;->dataChanged(Ljava/lang/String;)V
-HSPLandroid/app/backup/IBackupManager$Stub$Proxy;->getCurrentTransport()Ljava/lang/String;
-HSPLandroid/app/backup/IBackupManager$Stub$Proxy;->isBackupEnabled()Z
-HSPLandroid/app/backup/IBackupManager$Stub$Proxy;->isBackupServiceActive(I)Z
-HSPLandroid/app/backup/IBackupManager$Stub$Proxy;->updateTransportAttributesForUser(ILandroid/content/ComponentName;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/CharSequence;)V
 HSPLandroid/app/backup/IBackupManager$Stub;-><init>()V
-PLandroid/app/backup/IBackupManager$Stub;->asBinder()Landroid/os/IBinder;
+HPLandroid/app/backup/IBackupManager$Stub;->asBinder()Landroid/os/IBinder;
 HSPLandroid/app/backup/IBackupManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/backup/IBackupManager;
 HPLandroid/app/backup/IBackupManager$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/app/backup/SharedPreferencesBackupHelper;-><init>(Landroid/content/Context;[Ljava/lang/String;)V
 HSPLandroid/app/backup/SharedPreferencesBackupHelper;->performBackup(Landroid/os/ParcelFileDescriptor;Landroid/app/backup/BackupDataOutput;Landroid/os/ParcelFileDescriptor;)V
 HSPLandroid/app/blob/IBlobStoreManager$Stub;-><init>()V
-HPLandroid/app/blob/IBlobStoreManager$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
+HSPLandroid/app/compat/ChangeIdStateCache;-><clinit>()V
+HSPLandroid/app/compat/ChangeIdStateCache;-><init>()V
+HSPLandroid/app/compat/CompatChanges;-><clinit>()V
+HSPLandroid/app/compat/CompatChanges;->isChangeEnabled(J)Z
 HSPLandroid/app/contentsuggestions/IContentSuggestionsManager$Stub;-><init>()V
-HPLandroid/app/contentsuggestions/IContentSuggestionsManager$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/app/job/-$$Lambda$FpGlzN9oJcl8o5soW-gU-DyTvXM;->createService(Landroid/content/Context;)Ljava/lang/Object;
 HSPLandroid/app/job/-$$Lambda$JobSchedulerFrameworkInitializer$PtYe8PQc1PVJQXRnpm3iSxcWTR0;->createService(Landroid/content/Context;Landroid/os/IBinder;)Ljava/lang/Object;
 HSPLandroid/app/job/-$$Lambda$JobSchedulerFrameworkInitializer$RHUxgww0pZFMmfQWKgaRAx0YFqA;->createService(Landroid/os/IBinder;)Ljava/lang/Object;
@@ -4199,7 +3924,6 @@
 HSPLandroid/app/job/IJobScheduler$Stub$Proxy;->getAllPendingJobs()Landroid/content/pm/ParceledListSlice;
 HSPLandroid/app/job/IJobScheduler$Stub$Proxy;->getPendingJob(I)Landroid/app/job/JobInfo;
 HSPLandroid/app/job/IJobScheduler$Stub$Proxy;->schedule(Landroid/app/job/JobInfo;)I
-HSPLandroid/app/job/IJobScheduler$Stub$Proxy;->scheduleAsPackage(Landroid/app/job/JobInfo;Ljava/lang/String;ILjava/lang/String;)I
 HSPLandroid/app/job/IJobScheduler$Stub;-><init>()V
 HSPLandroid/app/job/IJobScheduler$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/job/IJobScheduler;
 HSPLandroid/app/job/IJobScheduler$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
@@ -4258,7 +3982,6 @@
 HSPLandroid/app/job/JobInfo$Builder;->setRequiresDeviceIdle(Z)Landroid/app/job/JobInfo$Builder;
 HSPLandroid/app/job/JobInfo$Builder;->setRequiresStorageNotLow(Z)Landroid/app/job/JobInfo$Builder;
 HSPLandroid/app/job/JobInfo$Builder;->setTransientExtras(Landroid/os/Bundle;)Landroid/app/job/JobInfo$Builder;
-HSPLandroid/app/job/JobInfo$Builder;->setTriggerContentMaxDelay(J)Landroid/app/job/JobInfo$Builder;
 HSPLandroid/app/job/JobInfo$TriggerContentUri$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/job/JobInfo$TriggerContentUri;
 HSPLandroid/app/job/JobInfo$TriggerContentUri$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/app/job/JobInfo$TriggerContentUri$1;->newArray(I)[Landroid/app/job/JobInfo$TriggerContentUri;
@@ -4309,7 +4032,6 @@
 HPLandroid/app/job/JobInfo;->isPrefetch()Z
 HSPLandroid/app/job/JobInfo;->isRequireCharging()Z
 HSPLandroid/app/job/JobInfo;->isRequireDeviceIdle()Z
-HPLandroid/app/job/JobInfo;->kindofEqualsBundle(Landroid/os/BaseBundle;Landroid/os/BaseBundle;)Z
 HSPLandroid/app/job/JobInfo;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/app/job/JobParameters$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/job/JobParameters;
 HSPLandroid/app/job/JobParameters$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
@@ -4393,10 +4115,10 @@
 HSPLandroid/app/prediction/IPredictionManager$Stub;-><init>()V
 HPLandroid/app/prediction/IPredictionManager$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HPLandroid/app/role/-$$Lambda$9DeAxmM9lUVr3-FTSefyo-BW8DY;-><init>(Lcom/android/internal/infra/AndroidFuture;)V
-PLandroid/app/role/-$$Lambda$9DeAxmM9lUVr3-FTSefyo-BW8DY;->onResult(Landroid/os/Bundle;)V
-PLandroid/app/role/-$$Lambda$RoleControllerManager$Jsb4ev7pHUqel8_lglNSRLiUzpg;->run(Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroid/app/role/-$$Lambda$9DeAxmM9lUVr3-FTSefyo-BW8DY;->onResult(Landroid/os/Bundle;)V
+HPLandroid/app/role/-$$Lambda$RoleControllerManager$Jsb4ev7pHUqel8_lglNSRLiUzpg;->run(Ljava/lang/Object;)Ljava/lang/Object;
 HSPLandroid/app/role/-$$Lambda$RoleControllerManager$hbh627Rh8mtJykW3vb1FWR34mIQ;-><init>(Ljava/util/concurrent/Executor;Ljava/lang/String;Ljava/util/function/Consumer;)V
-PLandroid/app/role/-$$Lambda$RoleControllerManager$hbh627Rh8mtJykW3vb1FWR34mIQ;->accept(Ljava/lang/Object;Ljava/lang/Object;)V
+HPLandroid/app/role/-$$Lambda$RoleControllerManager$hbh627Rh8mtJykW3vb1FWR34mIQ;->accept(Ljava/lang/Object;Ljava/lang/Object;)V
 HPLandroid/app/role/-$$Lambda$RoleControllerManager$mCMKfoPdye0sMu6efs963HCR1Xk;-><init>(Ljava/lang/Throwable;Ljava/lang/String;Ljava/util/function/Consumer;Landroid/os/Bundle;)V
 HPLandroid/app/role/-$$Lambda$RoleControllerManager$mCMKfoPdye0sMu6efs963HCR1Xk;->run()V
 HSPLandroid/app/role/-$$Lambda$Z0BwIRmLFQVA4XrF_I5nxvuecWE;-><clinit>()V
@@ -4404,10 +4126,10 @@
 PLandroid/app/role/-$$Lambda$Z0BwIRmLFQVA4XrF_I5nxvuecWE;->apply(Ljava/lang/Object;)Ljava/lang/Object;
 HSPLandroid/app/role/IOnRoleHoldersChangedListener$Stub;-><init>()V
 HSPLandroid/app/role/IOnRoleHoldersChangedListener$Stub;->asBinder()Landroid/os/IBinder;
-PLandroid/app/role/IRoleController$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+HPLandroid/app/role/IRoleController$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 PLandroid/app/role/IRoleController$Stub$Proxy;->asBinder()Landroid/os/IBinder;
 HPLandroid/app/role/IRoleController$Stub$Proxy;->grantDefaultRoles(Landroid/os/RemoteCallback;)V
-PLandroid/app/role/IRoleController$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/role/IRoleController;
+HPLandroid/app/role/IRoleController$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/role/IRoleController;
 HSPLandroid/app/role/IRoleManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HSPLandroid/app/role/IRoleManager$Stub$Proxy;->getDefaultSmsPackage(I)Ljava/lang/String;
 HSPLandroid/app/role/IRoleManager$Stub;-><init>()V
@@ -4418,7 +4140,7 @@
 HSPLandroid/app/role/RoleControllerManager;-><init>(Landroid/content/ComponentName;Landroid/os/Handler;Landroid/content/Context;)V
 PLandroid/app/role/RoleControllerManager;->createWithInitializedRemoteServiceComponentName(Landroid/os/Handler;Landroid/content/Context;)Landroid/app/role/RoleControllerManager;
 HSPLandroid/app/role/RoleControllerManager;->getRemoteServiceComponentName(Landroid/content/Context;)Landroid/content/ComponentName;
-PLandroid/app/role/RoleControllerManager;->grantDefaultRoles(Ljava/util/concurrent/Executor;Ljava/util/function/Consumer;)V
+HPLandroid/app/role/RoleControllerManager;->grantDefaultRoles(Ljava/util/concurrent/Executor;Ljava/util/function/Consumer;)V
 HSPLandroid/app/role/RoleControllerManager;->initializeRemoteServiceComponentName(Landroid/content/Context;)V
 HPLandroid/app/role/RoleControllerManager;->lambda$grantDefaultRoles$0(Landroid/app/role/IRoleController;)Ljava/util/concurrent/CompletableFuture;
 HPLandroid/app/role/RoleControllerManager;->lambda$propagateCallback$7(Ljava/lang/Throwable;Ljava/lang/String;Ljava/util/function/Consumer;Landroid/os/Bundle;)V
@@ -4445,11 +4167,9 @@
 HSPLandroid/app/servertransaction/ActivityLifecycleItem;->recycle()V
 HSPLandroid/app/servertransaction/ActivityRelaunchItem$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/servertransaction/ActivityRelaunchItem;
 HSPLandroid/app/servertransaction/ActivityRelaunchItem$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/app/servertransaction/ActivityRelaunchItem;-><init>()V
 HSPLandroid/app/servertransaction/ActivityRelaunchItem;-><init>(Landroid/os/Parcel;)V
 HSPLandroid/app/servertransaction/ActivityRelaunchItem;-><init>(Landroid/os/Parcel;Landroid/app/servertransaction/ActivityRelaunchItem$1;)V
 HSPLandroid/app/servertransaction/ActivityRelaunchItem;->execute(Landroid/app/ClientTransactionHandler;Landroid/os/IBinder;Landroid/app/servertransaction/PendingTransactionActions;)V
-HSPLandroid/app/servertransaction/ActivityRelaunchItem;->obtain(Ljava/util/List;Ljava/util/List;ILandroid/util/MergedConfiguration;Z)Landroid/app/servertransaction/ActivityRelaunchItem;
 HSPLandroid/app/servertransaction/ActivityRelaunchItem;->postExecute(Landroid/app/ClientTransactionHandler;Landroid/os/IBinder;Landroid/app/servertransaction/PendingTransactionActions;)V
 HSPLandroid/app/servertransaction/ActivityRelaunchItem;->preExecute(Landroid/app/ClientTransactionHandler;Landroid/os/IBinder;)V
 HSPLandroid/app/servertransaction/ActivityRelaunchItem;->recycle()V
@@ -4612,17 +4332,13 @@
 HSPLandroid/app/servertransaction/TransactionExecutorHelper;->pathInvolvesDestruction(Landroid/util/IntArray;)Z
 HSPLandroid/app/slice/-$$Lambda$SliceProvider$bIgM5f4PsMvz_YYWEeFTjvTqevw;-><init>(Landroid/app/slice/SliceProvider;)V
 HSPLandroid/app/slice/ISliceManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/app/slice/ISliceManager$Stub$Proxy;->checkSlicePermission(Landroid/net/Uri;Ljava/lang/String;Ljava/lang/String;II[Ljava/lang/String;)I
 HSPLandroid/app/slice/ISliceManager$Stub$Proxy;->getPinnedSlices(Ljava/lang/String;)[Landroid/net/Uri;
 HSPLandroid/app/slice/ISliceManager$Stub$Proxy;->getPinnedSpecs(Landroid/net/Uri;Ljava/lang/String;)[Landroid/app/slice/SliceSpec;
-HSPLandroid/app/slice/ISliceManager$Stub$Proxy;->grantSlicePermission(Ljava/lang/String;Ljava/lang/String;Landroid/net/Uri;)V
 HSPLandroid/app/slice/ISliceManager$Stub$Proxy;->pinSlice(Ljava/lang/String;Landroid/net/Uri;[Landroid/app/slice/SliceSpec;Landroid/os/IBinder;)V
 HSPLandroid/app/slice/ISliceManager$Stub$Proxy;->unpinSlice(Ljava/lang/String;Landroid/net/Uri;Landroid/os/IBinder;)V
 HSPLandroid/app/slice/ISliceManager$Stub;-><init>()V
 HSPLandroid/app/slice/ISliceManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/slice/ISliceManager;
 HPLandroid/app/slice/ISliceManager$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/app/slice/Slice$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/slice/Slice;
-HSPLandroid/app/slice/Slice$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/app/slice/Slice$Builder;-><init>(Landroid/net/Uri;Landroid/app/slice/SliceSpec;)V
 HSPLandroid/app/slice/Slice$Builder;->addAction(Landroid/app/PendingIntent;Landroid/app/slice/Slice;Ljava/lang/String;)Landroid/app/slice/Slice$Builder;
 HSPLandroid/app/slice/Slice$Builder;->addHints(Ljava/util/List;)Landroid/app/slice/Slice$Builder;
@@ -4632,17 +4348,13 @@
 HSPLandroid/app/slice/Slice$Builder;->addSubSlice(Landroid/app/slice/Slice;Ljava/lang/String;)Landroid/app/slice/Slice$Builder;
 HSPLandroid/app/slice/Slice$Builder;->addText(Ljava/lang/CharSequence;Ljava/lang/String;Ljava/util/List;)Landroid/app/slice/Slice$Builder;
 HSPLandroid/app/slice/Slice$Builder;->build()Landroid/app/slice/Slice;
-HSPLandroid/app/slice/Slice;-><init>(Landroid/os/Parcel;)V
 HSPLandroid/app/slice/Slice;-><init>(Ljava/util/ArrayList;[Ljava/lang/String;Landroid/net/Uri;Landroid/app/slice/SliceSpec;)V
 HSPLandroid/app/slice/Slice;->access$002(Landroid/app/slice/Slice;Landroid/app/slice/SliceSpec;)Landroid/app/slice/SliceSpec;
 HSPLandroid/app/slice/Slice;->getHints()Ljava/util/List;
 HSPLandroid/app/slice/Slice;->getItems()Ljava/util/List;
 HSPLandroid/app/slice/Slice;->getSpec()Landroid/app/slice/SliceSpec;
 HSPLandroid/app/slice/Slice;->getUri()Landroid/net/Uri;
-HSPLandroid/app/slice/SliceItem$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/slice/SliceItem;
-HSPLandroid/app/slice/SliceItem$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/app/slice/SliceItem;-><init>(Landroid/app/PendingIntent;Landroid/app/slice/Slice;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)V
-HSPLandroid/app/slice/SliceItem;-><init>(Landroid/os/Parcel;)V
 HSPLandroid/app/slice/SliceItem;-><init>(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)V
 HSPLandroid/app/slice/SliceItem;-><init>(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)V
 HSPLandroid/app/slice/SliceItem;->getAction()Landroid/app/PendingIntent;
@@ -4655,14 +4367,11 @@
 HSPLandroid/app/slice/SliceItem;->getSlice()Landroid/app/slice/Slice;
 HSPLandroid/app/slice/SliceItem;->getSubType()Ljava/lang/String;
 HSPLandroid/app/slice/SliceItem;->getText()Ljava/lang/CharSequence;
-HSPLandroid/app/slice/SliceItem;->readObj(Ljava/lang/String;Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/app/slice/SliceManager;-><init>(Landroid/content/Context;Landroid/os/Handler;)V
 HSPLandroid/app/slice/SliceManager;->bindSlice(Landroid/net/Uri;Ljava/util/Set;)Landroid/app/slice/Slice;
-HSPLandroid/app/slice/SliceManager;->checkSlicePermission(Landroid/net/Uri;II)I
 HSPLandroid/app/slice/SliceManager;->enforceSlicePermission(Landroid/net/Uri;Ljava/lang/String;II[Ljava/lang/String;)V
 HSPLandroid/app/slice/SliceManager;->getPinnedSlices()Ljava/util/List;
 HSPLandroid/app/slice/SliceManager;->getPinnedSpecs(Landroid/net/Uri;)Ljava/util/Set;
-HSPLandroid/app/slice/SliceManager;->grantSlicePermission(Ljava/lang/String;Landroid/net/Uri;)V
 HSPLandroid/app/slice/SliceManager;->pinSlice(Landroid/net/Uri;Ljava/util/Set;)V
 HSPLandroid/app/slice/SliceManager;->unpinSlice(Landroid/net/Uri;)V
 HSPLandroid/app/slice/SliceProvider;-><init>([Ljava/lang/String;)V
@@ -4685,23 +4394,20 @@
 HSPLandroid/app/timedetector/ITimeDetectorService$Stub;-><init>()V
 HSPLandroid/app/timedetector/ITimeDetectorService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/timedetector/ITimeDetectorService;
 HPLandroid/app/timedetector/ITimeDetectorService$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-PLandroid/app/timedetector/NetworkTimeSuggestion$1;-><init>()V
-PLandroid/app/timedetector/NetworkTimeSuggestion;-><clinit>()V
 HPLandroid/app/timedetector/NetworkTimeSuggestion;-><init>(Landroid/os/TimestampedValue;)V
 HPLandroid/app/timedetector/NetworkTimeSuggestion;->addDebugInfo([Ljava/lang/String;)V
 PLandroid/app/timedetector/NetworkTimeSuggestion;->getUtcTime()Landroid/os/TimestampedValue;
 HPLandroid/app/timedetector/NetworkTimeSuggestion;->toString()Ljava/lang/String;
-HSPLandroid/app/timedetector/PhoneTimeSuggestion$Builder;-><init>(I)V
-HSPLandroid/app/timedetector/PhoneTimeSuggestion$Builder;->access$100(Landroid/app/timedetector/PhoneTimeSuggestion$Builder;)I
-HSPLandroid/app/timedetector/PhoneTimeSuggestion$Builder;->access$200(Landroid/app/timedetector/PhoneTimeSuggestion$Builder;)Landroid/os/TimestampedValue;
-HSPLandroid/app/timedetector/PhoneTimeSuggestion$Builder;->access$300(Landroid/app/timedetector/PhoneTimeSuggestion$Builder;)Ljava/util/List;
-HSPLandroid/app/timedetector/PhoneTimeSuggestion$Builder;->build()Landroid/app/timedetector/PhoneTimeSuggestion;
-HSPLandroid/app/timedetector/PhoneTimeSuggestion$Builder;->setUtcTime(Landroid/os/TimestampedValue;)Landroid/app/timedetector/PhoneTimeSuggestion$Builder;
-HSPLandroid/app/timedetector/PhoneTimeSuggestion;-><init>(Landroid/app/timedetector/PhoneTimeSuggestion$Builder;)V
-HSPLandroid/app/timedetector/PhoneTimeSuggestion;-><init>(Landroid/app/timedetector/PhoneTimeSuggestion$Builder;Landroid/app/timedetector/PhoneTimeSuggestion$1;)V
-HSPLandroid/app/timedetector/PhoneTimeSuggestion;->getUtcTime()Landroid/os/TimestampedValue;
-HSPLandroid/app/timedetector/PhoneTimeSuggestion;->toString()Ljava/lang/String;
-HSPLandroid/app/timedetector/TimeDetector;-><init>()V
+HSPLandroid/app/timedetector/TelephonyTimeSuggestion$Builder;-><init>(I)V
+HSPLandroid/app/timedetector/TelephonyTimeSuggestion$Builder;->access$100(Landroid/app/timedetector/TelephonyTimeSuggestion$Builder;)I
+HSPLandroid/app/timedetector/TelephonyTimeSuggestion$Builder;->access$200(Landroid/app/timedetector/TelephonyTimeSuggestion$Builder;)Landroid/os/TimestampedValue;
+HSPLandroid/app/timedetector/TelephonyTimeSuggestion$Builder;->access$300(Landroid/app/timedetector/TelephonyTimeSuggestion$Builder;)Ljava/util/List;
+HSPLandroid/app/timedetector/TelephonyTimeSuggestion$Builder;->build()Landroid/app/timedetector/TelephonyTimeSuggestion;
+HSPLandroid/app/timedetector/TelephonyTimeSuggestion$Builder;->setUtcTime(Landroid/os/TimestampedValue;)Landroid/app/timedetector/TelephonyTimeSuggestion$Builder;
+HSPLandroid/app/timedetector/TelephonyTimeSuggestion;-><init>(Landroid/app/timedetector/TelephonyTimeSuggestion$Builder;)V
+HSPLandroid/app/timedetector/TelephonyTimeSuggestion;-><init>(Landroid/app/timedetector/TelephonyTimeSuggestion$Builder;Landroid/app/timedetector/TelephonyTimeSuggestion$1;)V
+HSPLandroid/app/timedetector/TelephonyTimeSuggestion;->getUtcTime()Landroid/os/TimestampedValue;
+HSPLandroid/app/timedetector/TelephonyTimeSuggestion;->toString()Ljava/lang/String;
 HSPLandroid/app/timedetector/TimeDetectorImpl;-><init>()V
 HSPLandroid/app/timezonedetector/ITimeZoneDetectorService$Stub;-><init>()V
 HPLandroid/app/timezonedetector/ITimeZoneDetectorService$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
@@ -4721,6 +4427,20 @@
 HSPLandroid/app/timezonedetector/PhoneTimeZoneSuggestion;-><init>(Landroid/app/timezonedetector/PhoneTimeZoneSuggestion$Builder;)V
 HSPLandroid/app/timezonedetector/PhoneTimeZoneSuggestion;-><init>(Landroid/app/timezonedetector/PhoneTimeZoneSuggestion$Builder;Landroid/app/timezonedetector/PhoneTimeZoneSuggestion$1;)V
 HSPLandroid/app/timezonedetector/PhoneTimeZoneSuggestion;->toString()Ljava/lang/String;
+HSPLandroid/app/timezonedetector/TelephonyTimeZoneSuggestion$Builder;-><init>(I)V
+HSPLandroid/app/timezonedetector/TelephonyTimeZoneSuggestion$Builder;->access$100(Landroid/app/timezonedetector/TelephonyTimeZoneSuggestion$Builder;)I
+HSPLandroid/app/timezonedetector/TelephonyTimeZoneSuggestion$Builder;->access$200(Landroid/app/timezonedetector/TelephonyTimeZoneSuggestion$Builder;)Ljava/lang/String;
+HSPLandroid/app/timezonedetector/TelephonyTimeZoneSuggestion$Builder;->access$300(Landroid/app/timezonedetector/TelephonyTimeZoneSuggestion$Builder;)I
+HSPLandroid/app/timezonedetector/TelephonyTimeZoneSuggestion$Builder;->access$400(Landroid/app/timezonedetector/TelephonyTimeZoneSuggestion$Builder;)I
+HSPLandroid/app/timezonedetector/TelephonyTimeZoneSuggestion$Builder;->access$500(Landroid/app/timezonedetector/TelephonyTimeZoneSuggestion$Builder;)Ljava/util/List;
+HSPLandroid/app/timezonedetector/TelephonyTimeZoneSuggestion$Builder;->build()Landroid/app/timezonedetector/TelephonyTimeZoneSuggestion;
+HSPLandroid/app/timezonedetector/TelephonyTimeZoneSuggestion$Builder;->setMatchType(I)Landroid/app/timezonedetector/TelephonyTimeZoneSuggestion$Builder;
+HSPLandroid/app/timezonedetector/TelephonyTimeZoneSuggestion$Builder;->setQuality(I)Landroid/app/timezonedetector/TelephonyTimeZoneSuggestion$Builder;
+HSPLandroid/app/timezonedetector/TelephonyTimeZoneSuggestion$Builder;->setZoneId(Ljava/lang/String;)Landroid/app/timezonedetector/TelephonyTimeZoneSuggestion$Builder;
+HSPLandroid/app/timezonedetector/TelephonyTimeZoneSuggestion$Builder;->validate()V
+HSPLandroid/app/timezonedetector/TelephonyTimeZoneSuggestion;-><init>(Landroid/app/timezonedetector/TelephonyTimeZoneSuggestion$Builder;)V
+HSPLandroid/app/timezonedetector/TelephonyTimeZoneSuggestion;-><init>(Landroid/app/timezonedetector/TelephonyTimeZoneSuggestion$Builder;Landroid/app/timezonedetector/TelephonyTimeZoneSuggestion$1;)V
+HSPLandroid/app/timezonedetector/TelephonyTimeZoneSuggestion;->toString()Ljava/lang/String;
 HSPLandroid/app/trust/IStrongAuthTracker$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HSPLandroid/app/trust/IStrongAuthTracker$Stub$Proxy;->asBinder()Landroid/os/IBinder;
 HPLandroid/app/trust/IStrongAuthTracker$Stub$Proxy;->onStrongAuthRequiredChanged(II)V
@@ -4731,7 +4451,6 @@
 HSPLandroid/app/trust/ITrustListener$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HSPLandroid/app/trust/ITrustListener$Stub$Proxy;->onTrustChanged(ZII)V
 HSPLandroid/app/trust/ITrustListener$Stub$Proxy;->onTrustManagedChanged(ZI)V
-HSPLandroid/app/trust/ITrustListener$Stub;-><init>()V
 HSPLandroid/app/trust/ITrustListener$Stub;->asBinder()Landroid/os/IBinder;
 HSPLandroid/app/trust/ITrustListener$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/trust/ITrustListener;
 HSPLandroid/app/trust/ITrustListener$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
@@ -4746,7 +4465,6 @@
 HSPLandroid/app/trust/ITrustManager$Stub;-><init>()V
 HSPLandroid/app/trust/ITrustManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/trust/ITrustManager;
 HSPLandroid/app/trust/ITrustManager$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/app/trust/TrustManager$1;-><init>(Landroid/app/trust/TrustManager;Landroid/app/trust/TrustManager$TrustListener;)V
 HSPLandroid/app/trust/TrustManager$1;->onTrustChanged(ZII)V
 HSPLandroid/app/trust/TrustManager$1;->onTrustManagedChanged(ZI)V
 HSPLandroid/app/trust/TrustManager$2;-><init>(Landroid/app/trust/TrustManager;Landroid/os/Looper;)V
@@ -4764,6 +4482,16 @@
 HSPLandroid/app/usage/AppStandbyInfo;-><init>(Landroid/os/Parcel;Landroid/app/usage/AppStandbyInfo$1;)V
 HSPLandroid/app/usage/AppStandbyInfo;-><init>(Ljava/lang/String;I)V
 HSPLandroid/app/usage/AppStandbyInfo;->writeToParcel(Landroid/os/Parcel;I)V
+HSPLandroid/app/usage/CacheQuotaHint$Builder;-><init>()V
+HSPLandroid/app/usage/CacheQuotaHint$Builder;->access$000(Landroid/app/usage/CacheQuotaHint$Builder;)Ljava/lang/String;
+HSPLandroid/app/usage/CacheQuotaHint$Builder;->access$100(Landroid/app/usage/CacheQuotaHint$Builder;)I
+HSPLandroid/app/usage/CacheQuotaHint$Builder;->access$200(Landroid/app/usage/CacheQuotaHint$Builder;)Landroid/app/usage/UsageStats;
+HSPLandroid/app/usage/CacheQuotaHint$Builder;->access$300(Landroid/app/usage/CacheQuotaHint$Builder;)J
+HSPLandroid/app/usage/CacheQuotaHint$Builder;->build()Landroid/app/usage/CacheQuotaHint;
+HSPLandroid/app/usage/CacheQuotaHint$Builder;->setQuota(J)Landroid/app/usage/CacheQuotaHint$Builder;
+HSPLandroid/app/usage/CacheQuotaHint$Builder;->setUid(I)Landroid/app/usage/CacheQuotaHint$Builder;
+HSPLandroid/app/usage/CacheQuotaHint$Builder;->setVolumeUuid(Ljava/lang/String;)Landroid/app/usage/CacheQuotaHint$Builder;
+HSPLandroid/app/usage/CacheQuotaHint;-><init>(Landroid/app/usage/CacheQuotaHint$Builder;)V
 HPLandroid/app/usage/ConfigurationStats;-><init>()V
 HPLandroid/app/usage/EventList;-><init>()V
 HPLandroid/app/usage/EventList;->firstIndexOnOrAfter(J)I
@@ -4779,57 +4507,18 @@
 HSPLandroid/app/usage/IStorageStatsManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/usage/IStorageStatsManager;
 HPLandroid/app/usage/IStorageStatsManager$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/app/usage/IUsageStatsManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/app/usage/IUsageStatsManager$Stub$Proxy;->getAppStandbyBucket(Ljava/lang/String;Ljava/lang/String;I)I
-HSPLandroid/app/usage/IUsageStatsManager$Stub$Proxy;->isAppInactive(Ljava/lang/String;I)Z
-HSPLandroid/app/usage/IUsageStatsManager$Stub$Proxy;->queryEvents(JJLjava/lang/String;)Landroid/app/usage/UsageEvents;
 HSPLandroid/app/usage/IUsageStatsManager$Stub$Proxy;->queryUsageStats(IJJLjava/lang/String;)Landroid/content/pm/ParceledListSlice;
 HSPLandroid/app/usage/IUsageStatsManager$Stub;-><init>()V
 HSPLandroid/app/usage/IUsageStatsManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/usage/IUsageStatsManager;
 HPLandroid/app/usage/IUsageStatsManager$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/app/usage/NetworkStats$Bucket;-><init>()V
-HSPLandroid/app/usage/NetworkStats$Bucket;->access$000(I)I
-HSPLandroid/app/usage/NetworkStats$Bucket;->access$102(Landroid/app/usage/NetworkStats$Bucket;I)I
-HSPLandroid/app/usage/NetworkStats$Bucket;->access$1102(Landroid/app/usage/NetworkStats$Bucket;I)I
-HSPLandroid/app/usage/NetworkStats$Bucket;->access$1302(Landroid/app/usage/NetworkStats$Bucket;J)J
-HSPLandroid/app/usage/NetworkStats$Bucket;->access$1402(Landroid/app/usage/NetworkStats$Bucket;J)J
-HSPLandroid/app/usage/NetworkStats$Bucket;->access$1502(Landroid/app/usage/NetworkStats$Bucket;J)J
-HSPLandroid/app/usage/NetworkStats$Bucket;->access$1602(Landroid/app/usage/NetworkStats$Bucket;J)J
-HSPLandroid/app/usage/NetworkStats$Bucket;->access$1702(Landroid/app/usage/NetworkStats$Bucket;J)J
-HSPLandroid/app/usage/NetworkStats$Bucket;->access$1802(Landroid/app/usage/NetworkStats$Bucket;J)J
-HSPLandroid/app/usage/NetworkStats$Bucket;->access$200(I)I
-HSPLandroid/app/usage/NetworkStats$Bucket;->access$302(Landroid/app/usage/NetworkStats$Bucket;I)I
-HSPLandroid/app/usage/NetworkStats$Bucket;->access$400(I)I
-HSPLandroid/app/usage/NetworkStats$Bucket;->access$502(Landroid/app/usage/NetworkStats$Bucket;I)I
-HSPLandroid/app/usage/NetworkStats$Bucket;->access$702(Landroid/app/usage/NetworkStats$Bucket;I)I
-HSPLandroid/app/usage/NetworkStats$Bucket;->access$902(Landroid/app/usage/NetworkStats$Bucket;I)I
-HSPLandroid/app/usage/NetworkStats$Bucket;->convertSet(I)I
-HSPLandroid/app/usage/NetworkStats$Bucket;->convertTag(I)I
-HSPLandroid/app/usage/NetworkStats$Bucket;->convertUid(I)I
-HSPLandroid/app/usage/NetworkStats$Bucket;->getRxBytes()J
-HSPLandroid/app/usage/NetworkStats$Bucket;->getStartTimeStamp()J
-HSPLandroid/app/usage/NetworkStats$Bucket;->getTxBytes()J
-HSPLandroid/app/usage/NetworkStats;-><init>(Landroid/content/Context;Landroid/net/NetworkTemplate;IJJLandroid/net/INetworkStatsService;)V
-HSPLandroid/app/usage/NetworkStats;->close()V
-HSPLandroid/app/usage/NetworkStats;->finalize()V
-HSPLandroid/app/usage/NetworkStats;->getNextBucket(Landroid/app/usage/NetworkStats$Bucket;)Z
-HSPLandroid/app/usage/NetworkStats;->getNextHistoryBucket(Landroid/app/usage/NetworkStats$Bucket;)Z
-HSPLandroid/app/usage/NetworkStats;->getUid()I
-HSPLandroid/app/usage/NetworkStats;->hasNextUid()Z
-HSPLandroid/app/usage/NetworkStats;->isUidEnumeration()Z
-HSPLandroid/app/usage/NetworkStats;->setSingleUidTagState(III)V
-HSPLandroid/app/usage/NetworkStats;->startHistoryEnumeration(III)V
 HSPLandroid/app/usage/NetworkStatsManager$CallbackHandler;-><init>(Landroid/os/Looper;ILjava/lang/String;Landroid/app/usage/NetworkStatsManager$UsageCallback;)V
-HPLandroid/app/usage/NetworkStatsManager$CallbackHandler;->getObject(Landroid/os/Message;Ljava/lang/String;)Ljava/lang/Object;
-HPLandroid/app/usage/NetworkStatsManager$CallbackHandler;->handleMessage(Landroid/os/Message;)V
+HSPLandroid/app/usage/NetworkStatsManager$CallbackHandler;->getObject(Landroid/os/Message;Ljava/lang/String;)Ljava/lang/Object;
+HSPLandroid/app/usage/NetworkStatsManager$CallbackHandler;->handleMessage(Landroid/os/Message;)V
 HSPLandroid/app/usage/NetworkStatsManager$UsageCallback;-><init>()V
 HSPLandroid/app/usage/NetworkStatsManager$UsageCallback;->access$000(Landroid/app/usage/NetworkStatsManager$UsageCallback;)Landroid/net/DataUsageRequest;
 HSPLandroid/app/usage/NetworkStatsManager$UsageCallback;->access$002(Landroid/app/usage/NetworkStatsManager$UsageCallback;Landroid/net/DataUsageRequest;)Landroid/net/DataUsageRequest;
 HSPLandroid/app/usage/NetworkStatsManager;-><init>(Landroid/content/Context;)V
 HSPLandroid/app/usage/NetworkStatsManager;-><init>(Landroid/content/Context;Landroid/net/INetworkStatsService;)V
-HSPLandroid/app/usage/NetworkStatsManager;->createTemplate(ILjava/lang/String;)Landroid/net/NetworkTemplate;
-HSPLandroid/app/usage/NetworkStatsManager;->queryDetailsForUidTag(ILjava/lang/String;JJII)Landroid/app/usage/NetworkStats;
-HSPLandroid/app/usage/NetworkStatsManager;->queryDetailsForUidTagState(ILjava/lang/String;JJIII)Landroid/app/usage/NetworkStats;
-HSPLandroid/app/usage/NetworkStatsManager;->queryDetailsForUidTagState(Landroid/net/NetworkTemplate;JJIII)Landroid/app/usage/NetworkStats;
 HSPLandroid/app/usage/NetworkStatsManager;->registerUsageCallback(Landroid/net/NetworkTemplate;IJLandroid/app/usage/NetworkStatsManager$UsageCallback;Landroid/os/Handler;)V
 HSPLandroid/app/usage/NetworkStatsManager;->setPollOnOpen(Z)V
 HSPLandroid/app/usage/NetworkStatsManager;->unregisterUsageCallback(Landroid/app/usage/NetworkStatsManager$UsageCallback;)V
@@ -4846,6 +4535,8 @@
 HPLandroid/app/usage/StorageStatsManager;->getCacheQuotaBytes(Ljava/lang/String;I)J
 HSPLandroid/app/usage/StorageStatsManager;->isQuotaSupported(Ljava/lang/String;)Z
 HSPLandroid/app/usage/StorageStatsManager;->isQuotaSupported(Ljava/util/UUID;)Z
+PLandroid/app/usage/StorageStatsManager;->queryExternalStatsForUser(Ljava/lang/String;Landroid/os/UserHandle;)Landroid/app/usage/ExternalStorageStats;
+PLandroid/app/usage/StorageStatsManager;->queryExternalStatsForUser(Ljava/util/UUID;Landroid/os/UserHandle;)Landroid/app/usage/ExternalStorageStats;
 HSPLandroid/app/usage/StorageStatsManager;->queryStatsForPackage(Ljava/util/UUID;Ljava/lang/String;Landroid/os/UserHandle;)Landroid/app/usage/StorageStats;
 PLandroid/app/usage/TimeSparseArray;-><init>()V
 HPLandroid/app/usage/TimeSparseArray;->closestIndexOnOrAfter(J)I
@@ -4857,7 +4548,6 @@
 HSPLandroid/app/usage/UsageEvents$Event;-><init>(IJ)V
 HPLandroid/app/usage/UsageEvents$Event;->copyFrom(Landroid/app/usage/UsageEvents$Event;)V
 HSPLandroid/app/usage/UsageEvents$Event;->getClassName()Ljava/lang/String;
-PLandroid/app/usage/UsageEvents$Event;->getConfiguration()Landroid/content/res/Configuration;
 HSPLandroid/app/usage/UsageEvents$Event;->getEventType()I
 HSPLandroid/app/usage/UsageEvents$Event;->getInstanceId()I
 HSPLandroid/app/usage/UsageEvents$Event;->getPackageName()Ljava/lang/String;
@@ -4880,7 +4570,6 @@
 HPLandroid/app/usage/UsageStats;->anyForegroundServiceStarted()Z
 HPLandroid/app/usage/UsageStats;->eventMapToBundle(Landroid/util/ArrayMap;)Landroid/os/Bundle;
 HSPLandroid/app/usage/UsageStats;->getPackageName()Ljava/lang/String;
-HSPLandroid/app/usage/UsageStats;->getTotalTimeInForeground()J
 HPLandroid/app/usage/UsageStats;->hasVisibleActivity()Z
 PLandroid/app/usage/UsageStats;->incrementServiceTimeUsed(J)V
 HPLandroid/app/usage/UsageStats;->incrementTimeUsed(J)V
@@ -4891,18 +4580,13 @@
 HPLandroid/app/usage/UsageStats;->writeSparseIntArray(Landroid/os/Parcel;Landroid/util/SparseIntArray;)V
 HPLandroid/app/usage/UsageStats;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/app/usage/UsageStatsManager;-><init>(Landroid/content/Context;Landroid/app/usage/IUsageStatsManager;)V
-HSPLandroid/app/usage/UsageStatsManager;->getAppStandbyBucket(Ljava/lang/String;)I
-HSPLandroid/app/usage/UsageStatsManager;->isAppInactive(Ljava/lang/String;)Z
-HSPLandroid/app/usage/UsageStatsManager;->queryEvents(JJ)Landroid/app/usage/UsageEvents;
 HSPLandroid/app/usage/UsageStatsManager;->queryUsageStats(IJJ)Ljava/util/List;
 HPLandroid/app/usage/UsageStatsManager;->reasonToString(I)Ljava/lang/String;
-PLandroid/app/usage/UsageStatsManager;->usageSourceToString(I)Ljava/lang/String;
-HSPLandroid/app/usage/UsageStatsManager;->whitelistAppTemporarily(Ljava/lang/String;JLandroid/os/UserHandle;)V
+HPLandroid/app/usage/UsageStatsManager;->usageSourceToString(I)Ljava/lang/String;
 HSPLandroid/appwidget/AppWidgetManager;-><init>(Landroid/content/Context;Lcom/android/internal/appwidget/IAppWidgetService;)V
 HSPLandroid/appwidget/AppWidgetManager;->getInstance(Landroid/content/Context;)Landroid/appwidget/AppWidgetManager;
 HSPLandroid/appwidget/AppWidgetManager;->isBoundWidgetPackage(Ljava/lang/String;I)Z
 HSPLandroid/appwidget/AppWidgetManagerInternal;-><init>()V
-HSPLandroid/appwidget/AppWidgetProviderInfo;-><init>()V
 HSPLandroid/appwidget/AppWidgetProviderInfo;->getProfile()Landroid/os/UserHandle;
 HSPLandroid/appwidget/AppWidgetProviderInfo;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/bluetooth/-$$Lambda$BluetoothAdapter$2$INSd_aND-SGWhhPZUtIqya_Uxw4;-><init>(Landroid/bluetooth/BluetoothAdapter$2;)V
@@ -4911,8 +4595,6 @@
 HSPLandroid/bluetooth/BluetoothA2dp$1;->getServiceInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothA2dp;
 HSPLandroid/bluetooth/BluetoothA2dp$1;->getServiceInterface(Landroid/os/IBinder;)Ljava/lang/Object;
 HSPLandroid/bluetooth/BluetoothA2dp;-><init>(Landroid/content/Context;Landroid/bluetooth/BluetoothProfile$ServiceListener;)V
-HSPLandroid/bluetooth/BluetoothA2dp;->close()V
-HSPLandroid/bluetooth/BluetoothA2dp;->finalize()V
 HSPLandroid/bluetooth/BluetoothA2dp;->getActiveDevice()Landroid/bluetooth/BluetoothDevice;
 HSPLandroid/bluetooth/BluetoothA2dp;->getConnectedDevices()Ljava/util/List;
 HSPLandroid/bluetooth/BluetoothA2dp;->getConnectionState(Landroid/bluetooth/BluetoothDevice;)I
@@ -4928,11 +4610,7 @@
 HSPLandroid/bluetooth/BluetoothAdapter$2;->recompute(Ljava/lang/Object;)Ljava/lang/Object;
 HSPLandroid/bluetooth/BluetoothAdapter$2;->recompute(Ljava/lang/Void;)Ljava/lang/Integer;
 HSPLandroid/bluetooth/BluetoothAdapter$3;-><init>(Landroid/bluetooth/BluetoothAdapter;ILjava/lang/String;)V
-HSPLandroid/bluetooth/BluetoothAdapter$3;->recompute(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/bluetooth/BluetoothAdapter$3;->recompute(Ljava/lang/Void;)Ljava/lang/Boolean;
 HSPLandroid/bluetooth/BluetoothAdapter$4;-><init>(Landroid/bluetooth/BluetoothAdapter;ILjava/lang/String;)V
-HSPLandroid/bluetooth/BluetoothAdapter$4;->recompute(Ljava/lang/Integer;)Ljava/lang/Integer;
-HSPLandroid/bluetooth/BluetoothAdapter$4;->recompute(Ljava/lang/Object;)Ljava/lang/Object;
 HSPLandroid/bluetooth/BluetoothAdapter$5;-><init>(Landroid/bluetooth/BluetoothAdapter;)V
 HSPLandroid/bluetooth/BluetoothAdapter$5;->onBluetoothServiceUp(Landroid/bluetooth/IBluetooth;)V
 HSPLandroid/bluetooth/BluetoothAdapter;-><init>(Landroid/bluetooth/IBluetoothManager;)V
@@ -4945,31 +4623,20 @@
 HSPLandroid/bluetooth/BluetoothAdapter;->access$500()Landroid/bluetooth/le/BluetoothLeAdvertiser;
 HSPLandroid/bluetooth/BluetoothAdapter;->access$600()Landroid/bluetooth/le/BluetoothLeScanner;
 HSPLandroid/bluetooth/BluetoothAdapter;->checkBluetoothAddress(Ljava/lang/String;)Z
-HSPLandroid/bluetooth/BluetoothAdapter;->closeProfileProxy(ILandroid/bluetooth/BluetoothProfile;)V
-HSPLandroid/bluetooth/BluetoothAdapter;->enableBLE()Z
-HSPLandroid/bluetooth/BluetoothAdapter;->getAddress()Ljava/lang/String;
-HSPLandroid/bluetooth/BluetoothAdapter;->getBluetoothLeScanner()Landroid/bluetooth/le/BluetoothLeScanner;
 HSPLandroid/bluetooth/BluetoothAdapter;->getBluetoothManager()Landroid/bluetooth/IBluetoothManager;
 HSPLandroid/bluetooth/BluetoothAdapter;->getBluetoothService(Landroid/bluetooth/IBluetoothManagerCallback;)Landroid/bluetooth/IBluetooth;
 HSPLandroid/bluetooth/BluetoothAdapter;->getBondedDevices()Ljava/util/Set;
 HSPLandroid/bluetooth/BluetoothAdapter;->getConnectionState()I
 HSPLandroid/bluetooth/BluetoothAdapter;->getDefaultAdapter()Landroid/bluetooth/BluetoothAdapter;
-HSPLandroid/bluetooth/BluetoothAdapter;->getFeatureId()Ljava/lang/String;
-HSPLandroid/bluetooth/BluetoothAdapter;->getLeAccess()Z
 HSPLandroid/bluetooth/BluetoothAdapter;->getLeState()I
-HSPLandroid/bluetooth/BluetoothAdapter;->getName()Ljava/lang/String;
-HSPLandroid/bluetooth/BluetoothAdapter;->getOpPackageName()Ljava/lang/String;
 HSPLandroid/bluetooth/BluetoothAdapter;->getProfileConnectionState(I)I
 HSPLandroid/bluetooth/BluetoothAdapter;->getProfileProxy(Landroid/content/Context;Landroid/bluetooth/BluetoothProfile$ServiceListener;I)Z
 HSPLandroid/bluetooth/BluetoothAdapter;->getRemoteDevice(Ljava/lang/String;)Landroid/bluetooth/BluetoothDevice;
 HSPLandroid/bluetooth/BluetoothAdapter;->getState()I
 HSPLandroid/bluetooth/BluetoothAdapter;->getSupportedProfiles()Ljava/util/List;
 HSPLandroid/bluetooth/BluetoothAdapter;->getUuids()[Landroid/os/ParcelUuid;
-HSPLandroid/bluetooth/BluetoothAdapter;->isBleScanAlwaysAvailable()Z
 HSPLandroid/bluetooth/BluetoothAdapter;->isEnabled()Z
 HSPLandroid/bluetooth/BluetoothAdapter;->isHearingAidProfileSupported()Z
-HSPLandroid/bluetooth/BluetoothAdapter;->isLeEnabled()Z
-HSPLandroid/bluetooth/BluetoothAdapter;->isOffloadedFilteringSupported()Z
 HSPLandroid/bluetooth/BluetoothAdapter;->nameForState(I)Ljava/lang/String;
 HPLandroid/bluetooth/BluetoothAdapter;->requestControllerActivityEnergyInfo(Landroid/os/ResultReceiver;)V
 HSPLandroid/bluetooth/BluetoothAdapter;->setContext(Landroid/content/Context;)V
@@ -4984,7 +4651,10 @@
 HSPLandroid/bluetooth/BluetoothDevice$2;->newArray(I)[Landroid/bluetooth/BluetoothDevice;
 HSPLandroid/bluetooth/BluetoothDevice$2;->newArray(I)[Ljava/lang/Object;
 HSPLandroid/bluetooth/BluetoothDevice$3;-><init>(Landroid/bluetooth/BluetoothDevice;ILjava/lang/String;)V
+HSPLandroid/bluetooth/BluetoothDevice$3;->recompute(Landroid/bluetooth/BluetoothDevice;)Ljava/lang/Integer;
+HSPLandroid/bluetooth/BluetoothDevice$3;->recompute(Ljava/lang/Object;)Ljava/lang/Object;
 HSPLandroid/bluetooth/BluetoothDevice;-><init>(Ljava/lang/String;)V
+HSPLandroid/bluetooth/BluetoothDevice;->access$000()Landroid/bluetooth/IBluetooth;
 HSPLandroid/bluetooth/BluetoothDevice;->equals(Ljava/lang/Object;)Z
 HSPLandroid/bluetooth/BluetoothDevice;->getAddress()Ljava/lang/String;
 HSPLandroid/bluetooth/BluetoothDevice;->getAlias()Ljava/lang/String;
@@ -4994,14 +4664,12 @@
 HSPLandroid/bluetooth/BluetoothDevice;->getName()Ljava/lang/String;
 HSPLandroid/bluetooth/BluetoothDevice;->getPhonebookAccessPermission()I
 HSPLandroid/bluetooth/BluetoothDevice;->getService()Landroid/bluetooth/IBluetooth;
-HSPLandroid/bluetooth/BluetoothDevice;->getType()I
 HSPLandroid/bluetooth/BluetoothDevice;->getUuids()[Landroid/os/ParcelUuid;
 HSPLandroid/bluetooth/BluetoothDevice;->hashCode()I
 HSPLandroid/bluetooth/BluetoothDevice;->isBluetoothEnabled()Z
 HSPLandroid/bluetooth/BluetoothDevice;->isConnected()Z
 HSPLandroid/bluetooth/BluetoothDevice;->toString()Ljava/lang/String;
 HSPLandroid/bluetooth/BluetoothDevice;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/bluetooth/BluetoothGattCallback;-><init>()V
 HSPLandroid/bluetooth/BluetoothHeadset$1;-><init>(Landroid/bluetooth/BluetoothHeadset;)V
 HSPLandroid/bluetooth/BluetoothHeadset$1;->onBluetoothStateChange(Z)V
 HSPLandroid/bluetooth/BluetoothHeadset$2;-><init>(Landroid/bluetooth/BluetoothHeadset;)V
@@ -5015,7 +4683,6 @@
 HSPLandroid/bluetooth/BluetoothHeadset;->access$202(Landroid/bluetooth/BluetoothHeadset;Landroid/bluetooth/IBluetoothHeadset;)Landroid/bluetooth/IBluetoothHeadset;
 HSPLandroid/bluetooth/BluetoothHeadset;->access$300(Landroid/bluetooth/BluetoothHeadset;)Landroid/os/Handler;
 HSPLandroid/bluetooth/BluetoothHeadset;->access$400(Landroid/bluetooth/BluetoothHeadset;)Landroid/bluetooth/BluetoothProfile$ServiceListener;
-HSPLandroid/bluetooth/BluetoothHeadset;->close()V
 HSPLandroid/bluetooth/BluetoothHeadset;->doBind()Z
 HSPLandroid/bluetooth/BluetoothHeadset;->doUnbind()V
 HSPLandroid/bluetooth/BluetoothHeadset;->getActiveDevice()Landroid/bluetooth/BluetoothDevice;
@@ -5048,7 +4715,6 @@
 HSPLandroid/bluetooth/BluetoothHidHost;->getConnectedDevices()Ljava/util/List;
 HSPLandroid/bluetooth/BluetoothHidHost;->getService()Landroid/bluetooth/IBluetoothHidHost;
 HSPLandroid/bluetooth/BluetoothHidHost;->isEnabled()Z
-HSPLandroid/bluetooth/BluetoothInputStream;-><init>(Landroid/bluetooth/BluetoothSocket;)V
 HSPLandroid/bluetooth/BluetoothManager;-><init>(Landroid/content/Context;)V
 HSPLandroid/bluetooth/BluetoothManager;->getAdapter()Landroid/bluetooth/BluetoothAdapter;
 HSPLandroid/bluetooth/BluetoothMap$1;-><init>(Landroid/bluetooth/BluetoothMap;Landroid/bluetooth/BluetoothProfile;ILjava/lang/String;Ljava/lang/String;)V
@@ -5059,9 +4725,7 @@
 HSPLandroid/bluetooth/BluetoothMap;->getConnectionState(Landroid/bluetooth/BluetoothDevice;)I
 HSPLandroid/bluetooth/BluetoothMap;->getService()Landroid/bluetooth/IBluetoothMap;
 HSPLandroid/bluetooth/BluetoothMap;->isEnabled()Z
-HSPLandroid/bluetooth/BluetoothMap;->isValidDevice(Landroid/bluetooth/BluetoothDevice;)Z
 HSPLandroid/bluetooth/BluetoothMap;->log(Ljava/lang/String;)V
-HSPLandroid/bluetooth/BluetoothOutputStream;-><init>(Landroid/bluetooth/BluetoothSocket;)V
 HSPLandroid/bluetooth/BluetoothPan$1;-><init>(Landroid/bluetooth/BluetoothPan;Landroid/bluetooth/BluetoothProfile;ILjava/lang/String;Ljava/lang/String;)V
 HSPLandroid/bluetooth/BluetoothPan$1;->getServiceInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothPan;
 HSPLandroid/bluetooth/BluetoothPan$1;->getServiceInterface(Landroid/os/IBinder;)Ljava/lang/Object;
@@ -5088,7 +4752,6 @@
 HSPLandroid/bluetooth/BluetoothProfileConnector;->access$500(Landroid/bluetooth/BluetoothProfileConnector;)I
 HSPLandroid/bluetooth/BluetoothProfileConnector;->access$600(Landroid/bluetooth/BluetoothProfileConnector;)Landroid/bluetooth/BluetoothProfile;
 HSPLandroid/bluetooth/BluetoothProfileConnector;->connect(Landroid/content/Context;Landroid/bluetooth/BluetoothProfile$ServiceListener;)V
-HSPLandroid/bluetooth/BluetoothProfileConnector;->disconnect()V
 HSPLandroid/bluetooth/BluetoothProfileConnector;->doBind()Z
 HSPLandroid/bluetooth/BluetoothProfileConnector;->doUnbind()V
 HSPLandroid/bluetooth/BluetoothProfileConnector;->getService()Ljava/lang/Object;
@@ -5101,19 +4764,8 @@
 HSPLandroid/bluetooth/BluetoothSap;->getService()Landroid/bluetooth/IBluetoothSap;
 HSPLandroid/bluetooth/BluetoothSap;->isEnabled()Z
 HSPLandroid/bluetooth/BluetoothSap;->log(Ljava/lang/String;)V
-HSPLandroid/bluetooth/BluetoothServerSocket;->accept()Landroid/bluetooth/BluetoothSocket;
-HSPLandroid/bluetooth/BluetoothServerSocket;->accept(I)Landroid/bluetooth/BluetoothSocket;
-HSPLandroid/bluetooth/BluetoothSocket;-><init>(IIZZLandroid/bluetooth/BluetoothDevice;ILandroid/os/ParcelUuid;)V
-HSPLandroid/bluetooth/BluetoothSocket;-><init>(IIZZLandroid/bluetooth/BluetoothDevice;ILandroid/os/ParcelUuid;ZZ)V
-HSPLandroid/bluetooth/BluetoothSocket;->accept(I)Landroid/bluetooth/BluetoothSocket;
-HSPLandroid/bluetooth/BluetoothSocket;->getSecurityFlags()I
-HSPLandroid/bluetooth/BluetoothSocket;->readAll(Ljava/io/InputStream;[B)I
-HSPLandroid/bluetooth/BluetoothSocket;->readInt(Ljava/io/InputStream;)I
-HSPLandroid/bluetooth/BluetoothSocket;->waitSocketSignal(Ljava/io/InputStream;)Ljava/lang/String;
 HSPLandroid/bluetooth/BluetoothUuid;->containsAnyUuid([Landroid/os/ParcelUuid;[Landroid/os/ParcelUuid;)Z
-HSPLandroid/bluetooth/BluetoothUuid;->is16BitUuid(Landroid/os/ParcelUuid;)Z
 HSPLandroid/bluetooth/BluetoothUuid;->parseUuidFrom([B)Landroid/os/ParcelUuid;
-HSPLandroid/bluetooth/BluetoothUuid;->uuidToBytes(Landroid/os/ParcelUuid;)[B
 HSPLandroid/bluetooth/IBluetooth$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HSPLandroid/bluetooth/IBluetooth$Stub$Proxy;->asBinder()Landroid/os/IBinder;
 HSPLandroid/bluetooth/IBluetooth$Stub$Proxy;->enable(Z)Z
@@ -5124,7 +4776,6 @@
 HSPLandroid/bluetooth/IBluetooth$Stub$Proxy;->getConnectionState(Landroid/bluetooth/BluetoothDevice;)I
 HPLandroid/bluetooth/IBluetooth$Stub$Proxy;->getName()Ljava/lang/String;
 HSPLandroid/bluetooth/IBluetooth$Stub$Proxy;->getPhonebookAccessPermission(Landroid/bluetooth/BluetoothDevice;)I
-HSPLandroid/bluetooth/IBluetooth$Stub$Proxy;->getProfileConnectionState(I)I
 HSPLandroid/bluetooth/IBluetooth$Stub$Proxy;->getRemoteAlias(Landroid/bluetooth/BluetoothDevice;)Ljava/lang/String;
 HSPLandroid/bluetooth/IBluetooth$Stub$Proxy;->getRemoteClass(Landroid/bluetooth/BluetoothDevice;)I
 HSPLandroid/bluetooth/IBluetooth$Stub$Proxy;->getRemoteName(Landroid/bluetooth/BluetoothDevice;)Ljava/lang/String;
@@ -5132,7 +4783,6 @@
 HSPLandroid/bluetooth/IBluetooth$Stub$Proxy;->getState()I
 HSPLandroid/bluetooth/IBluetooth$Stub$Proxy;->getSupportedProfiles()J
 HSPLandroid/bluetooth/IBluetooth$Stub$Proxy;->getUuids()[Landroid/os/ParcelUuid;
-HSPLandroid/bluetooth/IBluetooth$Stub$Proxy;->isOffloadedFilteringSupported()Z
 PLandroid/bluetooth/IBluetooth$Stub$Proxy;->onLeServiceUp()V
 HSPLandroid/bluetooth/IBluetooth$Stub$Proxy;->registerCallback(Landroid/bluetooth/IBluetoothCallback;)V
 HPLandroid/bluetooth/IBluetooth$Stub$Proxy;->requestActivityInfo(Landroid/os/ResultReceiver;)V
@@ -5147,10 +4797,6 @@
 HSPLandroid/bluetooth/IBluetoothCallback$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/bluetooth/IBluetoothGatt$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HPLandroid/bluetooth/IBluetoothGatt$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/bluetooth/IBluetoothGatt$Stub$Proxy;->registerScanner(Landroid/bluetooth/le/IScannerCallback;Landroid/os/WorkSource;)V
-HSPLandroid/bluetooth/IBluetoothGatt$Stub$Proxy;->startScan(ILandroid/bluetooth/le/ScanSettings;Ljava/util/List;Ljava/util/List;Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/bluetooth/IBluetoothGatt$Stub$Proxy;->stopScan(I)V
-HSPLandroid/bluetooth/IBluetoothGatt$Stub$Proxy;->unregisterScanner(I)V
 HSPLandroid/bluetooth/IBluetoothGatt$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothGatt;
 HSPLandroid/bluetooth/IBluetoothHeadset$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HSPLandroid/bluetooth/IBluetoothHeadset$Stub$Proxy;->getActiveDevice()Landroid/bluetooth/BluetoothDevice;
@@ -5173,16 +4819,10 @@
 HSPLandroid/bluetooth/IBluetoothHidHost$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothHidHost;
 HSPLandroid/bluetooth/IBluetoothManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HSPLandroid/bluetooth/IBluetoothManager$Stub$Proxy;->bindBluetoothProfileService(ILandroid/bluetooth/IBluetoothProfileServiceConnection;)Z
-HSPLandroid/bluetooth/IBluetoothManager$Stub$Proxy;->getAddress()Ljava/lang/String;
-HSPLandroid/bluetooth/IBluetoothManager$Stub$Proxy;->getBluetoothGatt()Landroid/bluetooth/IBluetoothGatt;
-HSPLandroid/bluetooth/IBluetoothManager$Stub$Proxy;->getName()Ljava/lang/String;
-HSPLandroid/bluetooth/IBluetoothManager$Stub$Proxy;->isBleScanAlwaysAvailable()Z
 HSPLandroid/bluetooth/IBluetoothManager$Stub$Proxy;->isHearingAidProfileSupported()Z
 HSPLandroid/bluetooth/IBluetoothManager$Stub$Proxy;->registerAdapter(Landroid/bluetooth/IBluetoothManagerCallback;)Landroid/bluetooth/IBluetooth;
 HSPLandroid/bluetooth/IBluetoothManager$Stub$Proxy;->registerStateChangeCallback(Landroid/bluetooth/IBluetoothStateChangeCallback;)V
 HSPLandroid/bluetooth/IBluetoothManager$Stub$Proxy;->unbindBluetoothProfileService(ILandroid/bluetooth/IBluetoothProfileServiceConnection;)V
-HSPLandroid/bluetooth/IBluetoothManager$Stub$Proxy;->unregisterStateChangeCallback(Landroid/bluetooth/IBluetoothStateChangeCallback;)V
-HSPLandroid/bluetooth/IBluetoothManager$Stub$Proxy;->updateBleAppCount(Landroid/os/IBinder;ZLjava/lang/String;)I
 HSPLandroid/bluetooth/IBluetoothManager$Stub;-><init>()V
 HSPLandroid/bluetooth/IBluetoothManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothManager;
 HSPLandroid/bluetooth/IBluetoothManager$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
@@ -5212,7 +4852,6 @@
 HSPLandroid/bluetooth/IBluetoothSap$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HSPLandroid/bluetooth/IBluetoothSap$Stub$Proxy;->getConnectedDevices()Ljava/util/List;
 HSPLandroid/bluetooth/IBluetoothSap$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothSap;
-HSPLandroid/bluetooth/IBluetoothSocketManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothSocketManager;
 HPLandroid/bluetooth/IBluetoothStateChangeCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HPLandroid/bluetooth/IBluetoothStateChangeCallback$Stub$Proxy;->asBinder()Landroid/os/IBinder;
 HPLandroid/bluetooth/IBluetoothStateChangeCallback$Stub$Proxy;->onBluetoothStateChange(Z)V
@@ -5220,104 +4859,35 @@
 HSPLandroid/bluetooth/IBluetoothStateChangeCallback$Stub;->asBinder()Landroid/os/IBinder;
 HPLandroid/bluetooth/IBluetoothStateChangeCallback$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothStateChangeCallback;
 HSPLandroid/bluetooth/IBluetoothStateChangeCallback$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/bluetooth/le/BluetoothLeScanner$BleScanCallbackWrapper$1;-><init>(Landroid/bluetooth/le/BluetoothLeScanner$BleScanCallbackWrapper;Landroid/bluetooth/le/ScanResult;)V
-HSPLandroid/bluetooth/le/BluetoothLeScanner$BleScanCallbackWrapper$1;->run()V
-HSPLandroid/bluetooth/le/BluetoothLeScanner$BleScanCallbackWrapper;-><init>(Landroid/bluetooth/le/BluetoothLeScanner;Landroid/bluetooth/IBluetoothGatt;Ljava/util/List;Landroid/bluetooth/le/ScanSettings;Landroid/os/WorkSource;Landroid/bluetooth/le/ScanCallback;Ljava/util/List;)V
-HSPLandroid/bluetooth/le/BluetoothLeScanner$BleScanCallbackWrapper;->access$400(Landroid/bluetooth/le/BluetoothLeScanner$BleScanCallbackWrapper;)Landroid/bluetooth/le/ScanCallback;
-HSPLandroid/bluetooth/le/BluetoothLeScanner$BleScanCallbackWrapper;->onScanResult(Landroid/bluetooth/le/ScanResult;)V
-HSPLandroid/bluetooth/le/BluetoothLeScanner$BleScanCallbackWrapper;->onScannerRegistered(II)V
-HSPLandroid/bluetooth/le/BluetoothLeScanner$BleScanCallbackWrapper;->startRegistration()V
-HSPLandroid/bluetooth/le/BluetoothLeScanner$BleScanCallbackWrapper;->stopLeScan()V
-HSPLandroid/bluetooth/le/BluetoothLeScanner;-><init>(Landroid/bluetooth/IBluetoothManager;Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/bluetooth/le/BluetoothLeScanner;->access$100(Landroid/bluetooth/le/BluetoothLeScanner;)Ljava/util/Map;
-HSPLandroid/bluetooth/le/BluetoothLeScanner;->access$200(Landroid/bluetooth/le/BluetoothLeScanner;)Ljava/lang/String;
-HSPLandroid/bluetooth/le/BluetoothLeScanner;->access$300(Landroid/bluetooth/le/BluetoothLeScanner;)Ljava/lang/String;
-HSPLandroid/bluetooth/le/BluetoothLeScanner;->isHardwareResourcesAvailableForScan(Landroid/bluetooth/le/ScanSettings;)Z
-HSPLandroid/bluetooth/le/BluetoothLeScanner;->isSettingsAndFilterComboAllowed(Landroid/bluetooth/le/ScanSettings;Ljava/util/List;)Z
-HSPLandroid/bluetooth/le/BluetoothLeScanner;->isSettingsConfigAllowedForScan(Landroid/bluetooth/le/ScanSettings;)Z
-HSPLandroid/bluetooth/le/BluetoothLeScanner;->startScan(Ljava/util/List;Landroid/bluetooth/le/ScanSettings;Landroid/bluetooth/le/ScanCallback;)V
-HSPLandroid/bluetooth/le/BluetoothLeScanner;->startScan(Ljava/util/List;Landroid/bluetooth/le/ScanSettings;Landroid/os/WorkSource;Landroid/bluetooth/le/ScanCallback;Landroid/app/PendingIntent;Ljava/util/List;)I
-HSPLandroid/bluetooth/le/BluetoothLeScanner;->startScanFromSource(Ljava/util/List;Landroid/bluetooth/le/ScanSettings;Landroid/os/WorkSource;Landroid/bluetooth/le/ScanCallback;)V
-HSPLandroid/bluetooth/le/BluetoothLeScanner;->stopScan(Landroid/bluetooth/le/ScanCallback;)V
-HSPLandroid/bluetooth/le/BluetoothLeUtils;->checkAdapterStateOn(Landroid/bluetooth/BluetoothAdapter;)V
-HSPLandroid/bluetooth/le/IScannerCallback$Stub;-><init>()V
-HSPLandroid/bluetooth/le/IScannerCallback$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/bluetooth/le/IScannerCallback$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/bluetooth/le/ScanCallback;-><init>()V
 HSPLandroid/bluetooth/le/ScanFilter$1;->createFromParcel(Landroid/os/Parcel;)Landroid/bluetooth/le/ScanFilter;
 HSPLandroid/bluetooth/le/ScanFilter$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/bluetooth/le/ScanFilter$Builder;-><init>()V
 HSPLandroid/bluetooth/le/ScanFilter$Builder;->build()Landroid/bluetooth/le/ScanFilter;
 HSPLandroid/bluetooth/le/ScanFilter$Builder;->setManufacturerData(I[B[B)Landroid/bluetooth/le/ScanFilter$Builder;
-HSPLandroid/bluetooth/le/ScanFilter$Builder;->setServiceData(Landroid/os/ParcelUuid;[B)Landroid/bluetooth/le/ScanFilter$Builder;
-HSPLandroid/bluetooth/le/ScanFilter$Builder;->setServiceUuid(Landroid/os/ParcelUuid;)Landroid/bluetooth/le/ScanFilter$Builder;
 HSPLandroid/bluetooth/le/ScanFilter;-><init>(Ljava/lang/String;Ljava/lang/String;Landroid/os/ParcelUuid;Landroid/os/ParcelUuid;Landroid/os/ParcelUuid;Landroid/os/ParcelUuid;Landroid/os/ParcelUuid;[B[BI[B[B)V
 HSPLandroid/bluetooth/le/ScanFilter;-><init>(Ljava/lang/String;Ljava/lang/String;Landroid/os/ParcelUuid;Landroid/os/ParcelUuid;Landroid/os/ParcelUuid;Landroid/os/ParcelUuid;Landroid/os/ParcelUuid;[B[BI[B[BLandroid/bluetooth/le/ScanFilter$1;)V
 HSPLandroid/bluetooth/le/ScanFilter;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/bluetooth/le/ScanRecord;-><init>(Ljava/util/List;Ljava/util/List;Landroid/util/SparseArray;Ljava/util/Map;IILjava/lang/String;[B)V
 HSPLandroid/bluetooth/le/ScanRecord;->extractBytes([BII)[B
 HSPLandroid/bluetooth/le/ScanRecord;->getBytes()[B
-HSPLandroid/bluetooth/le/ScanRecord;->getManufacturerSpecificData(I)[B
-HSPLandroid/bluetooth/le/ScanRecord;->getServiceData(Landroid/os/ParcelUuid;)[B
 HSPLandroid/bluetooth/le/ScanRecord;->parseFromBytes([B)Landroid/bluetooth/le/ScanRecord;
 HSPLandroid/bluetooth/le/ScanRecord;->parseServiceUuid([BIIILjava/util/List;)I
 HSPLandroid/bluetooth/le/ScanResult$1;->createFromParcel(Landroid/os/Parcel;)Landroid/bluetooth/le/ScanResult;
 HSPLandroid/bluetooth/le/ScanResult$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/bluetooth/le/ScanResult;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/bluetooth/le/ScanResult;-><init>(Landroid/os/Parcel;Landroid/bluetooth/le/ScanResult$1;)V
-HSPLandroid/bluetooth/le/ScanResult;->getDevice()Landroid/bluetooth/BluetoothDevice;
-HSPLandroid/bluetooth/le/ScanResult;->getRssi()I
-HSPLandroid/bluetooth/le/ScanResult;->getScanRecord()Landroid/bluetooth/le/ScanRecord;
 HSPLandroid/bluetooth/le/ScanResult;->readFromParcel(Landroid/os/Parcel;)V
-HSPLandroid/bluetooth/le/ScanResult;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/bluetooth/le/ScanSettings$Builder;-><init>()V
-HSPLandroid/bluetooth/le/ScanSettings$Builder;->build()Landroid/bluetooth/le/ScanSettings;
-HSPLandroid/bluetooth/le/ScanSettings$Builder;->isValidCallbackType(I)Z
-HSPLandroid/bluetooth/le/ScanSettings$Builder;->setCallbackType(I)Landroid/bluetooth/le/ScanSettings$Builder;
-HSPLandroid/bluetooth/le/ScanSettings$Builder;->setMatchMode(I)Landroid/bluetooth/le/ScanSettings$Builder;
-HSPLandroid/bluetooth/le/ScanSettings$Builder;->setNumOfMatches(I)Landroid/bluetooth/le/ScanSettings$Builder;
-HSPLandroid/bluetooth/le/ScanSettings$Builder;->setReportDelay(J)Landroid/bluetooth/le/ScanSettings$Builder;
-HSPLandroid/bluetooth/le/ScanSettings$Builder;->setScanMode(I)Landroid/bluetooth/le/ScanSettings$Builder;
-HSPLandroid/bluetooth/le/ScanSettings;-><init>(IIIJIIZI)V
-HSPLandroid/bluetooth/le/ScanSettings;-><init>(IIIJIIZILandroid/bluetooth/le/ScanSettings$1;)V
-HSPLandroid/bluetooth/le/ScanSettings;->getCallbackType()I
-HSPLandroid/bluetooth/le/ScanSettings;->getReportDelayMillis()J
-HSPLandroid/bluetooth/le/ScanSettings;->getScanMode()I
-HSPLandroid/bluetooth/le/ScanSettings;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/companion/ICompanionDeviceManager$Stub;-><init>()V
 HSPLandroid/companion/ICompanionDeviceManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/companion/ICompanionDeviceManager;
-HPLandroid/companion/ICompanionDeviceManager$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/compat/Compatibility$Callbacks;-><init>()V
 HSPLandroid/compat/Compatibility;->isChangeEnabled(J)Z
 HSPLandroid/compat/Compatibility;->setCallbacks(Landroid/compat/Compatibility$Callbacks;)V
-HSPLandroid/content/-$$Lambda$AbstractThreadedSyncAdapter$ISyncAdapterImpl$L6ZtOCe8gjKwJj0908ytPlrD8Rc;->accept(Ljava/lang/Object;Ljava/lang/Object;)V
-HSPLandroid/content/AbstractThreadedSyncAdapter$ISyncAdapterImpl;-><init>(Landroid/content/AbstractThreadedSyncAdapter;)V
-HSPLandroid/content/AbstractThreadedSyncAdapter$ISyncAdapterImpl;-><init>(Landroid/content/AbstractThreadedSyncAdapter;Landroid/content/AbstractThreadedSyncAdapter$1;)V
-HSPLandroid/content/AbstractThreadedSyncAdapter$ISyncAdapterImpl;->cancelSync(Landroid/content/ISyncContext;)V
-HSPLandroid/content/AbstractThreadedSyncAdapter$ISyncAdapterImpl;->lambda$onUnsyncableAccount$0(Ljava/lang/Object;Landroid/content/ISyncAdapterUnsyncableAccountCallback;)V
-HSPLandroid/content/AbstractThreadedSyncAdapter$ISyncAdapterImpl;->onUnsyncableAccount(Landroid/content/ISyncAdapterUnsyncableAccountCallback;)V
+HSPLandroid/content/-$$Lambda$IntentFilter$fvZpjl2C1djVISORSFvcX_-NkJo;-><init>(Landroid/content/IntentFilter;)V
+HSPLandroid/content/-$$Lambda$IntentFilter$fvZpjl2C1djVISORSFvcX_-NkJo;->accept(Ljava/lang/Object;Ljava/lang/Object;)V
 HSPLandroid/content/AbstractThreadedSyncAdapter$ISyncAdapterImpl;->startSync(Landroid/content/ISyncContext;Ljava/lang/String;Landroid/accounts/Account;Landroid/os/Bundle;)V
-HSPLandroid/content/AbstractThreadedSyncAdapter$SyncThread;-><init>(Landroid/content/AbstractThreadedSyncAdapter;Ljava/lang/String;Landroid/content/SyncContext;Ljava/lang/String;Landroid/accounts/Account;Landroid/os/Bundle;)V
-HSPLandroid/content/AbstractThreadedSyncAdapter$SyncThread;-><init>(Landroid/content/AbstractThreadedSyncAdapter;Ljava/lang/String;Landroid/content/SyncContext;Ljava/lang/String;Landroid/accounts/Account;Landroid/os/Bundle;Landroid/content/AbstractThreadedSyncAdapter$1;)V
-HSPLandroid/content/AbstractThreadedSyncAdapter$SyncThread;->access$800(Landroid/content/AbstractThreadedSyncAdapter$SyncThread;)Landroid/content/SyncContext;
-HSPLandroid/content/AbstractThreadedSyncAdapter$SyncThread;->isCanceled()Z
 HSPLandroid/content/AbstractThreadedSyncAdapter$SyncThread;->run()V
 HSPLandroid/content/AbstractThreadedSyncAdapter;-><init>(Landroid/content/Context;ZZ)V
-HSPLandroid/content/AbstractThreadedSyncAdapter;->access$100()Z
-HSPLandroid/content/AbstractThreadedSyncAdapter;->access$1100(Landroid/content/AbstractThreadedSyncAdapter;)Z
-HSPLandroid/content/AbstractThreadedSyncAdapter;->access$1300(Landroid/content/AbstractThreadedSyncAdapter;)Landroid/content/Context;
 HSPLandroid/content/AbstractThreadedSyncAdapter;->access$200(Landroid/content/AbstractThreadedSyncAdapter;Landroid/accounts/Account;)Landroid/accounts/Account;
-HSPLandroid/content/AbstractThreadedSyncAdapter;->access$300(Landroid/content/AbstractThreadedSyncAdapter;)Ljava/lang/Object;
-HSPLandroid/content/AbstractThreadedSyncAdapter;->access$400(Landroid/content/AbstractThreadedSyncAdapter;)Ljava/util/HashMap;
-HSPLandroid/content/AbstractThreadedSyncAdapter;->access$500(Landroid/content/AbstractThreadedSyncAdapter;)Z
-HSPLandroid/content/AbstractThreadedSyncAdapter;->access$600(Landroid/content/AbstractThreadedSyncAdapter;)Ljava/util/concurrent/atomic/AtomicInteger;
 HSPLandroid/content/AbstractThreadedSyncAdapter;->getContext()Landroid/content/Context;
 HSPLandroid/content/AbstractThreadedSyncAdapter;->getSyncAdapterBinder()Landroid/os/IBinder;
-HSPLandroid/content/AbstractThreadedSyncAdapter;->handleOnUnsyncableAccount(Landroid/content/ISyncAdapterUnsyncableAccountCallback;)V
-HSPLandroid/content/AbstractThreadedSyncAdapter;->onSyncCanceled()V
-HSPLandroid/content/AbstractThreadedSyncAdapter;->onSyncCanceled(Ljava/lang/Thread;)V
-HSPLandroid/content/AbstractThreadedSyncAdapter;->onUnsyncableAccount()Z
-HSPLandroid/content/AbstractThreadedSyncAdapter;->toSyncKey(Landroid/accounts/Account;)Landroid/accounts/Account;
 HSPLandroid/content/AsyncQueryHandler$WorkerArgs;-><init>()V
 HSPLandroid/content/AsyncQueryHandler$WorkerHandler;-><init>(Landroid/content/AsyncQueryHandler;Landroid/os/Looper;)V
 HSPLandroid/content/AsyncQueryHandler$WorkerHandler;->handleMessage(Landroid/os/Message;)V
@@ -5325,19 +4895,10 @@
 HSPLandroid/content/AsyncQueryHandler;->createHandler(Landroid/os/Looper;)Landroid/os/Handler;
 HSPLandroid/content/AsyncQueryHandler;->handleMessage(Landroid/os/Message;)V
 HSPLandroid/content/AsyncQueryHandler;->startQuery(ILjava/lang/Object;Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/content/AsyncTaskLoader$LoadTask;->doInBackground([Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/content/AsyncTaskLoader$LoadTask;->doInBackground([Ljava/lang/Void;)Ljava/lang/Object;
-HSPLandroid/content/AsyncTaskLoader$LoadTask;->onPostExecute(Ljava/lang/Object;)V
-HSPLandroid/content/AsyncTaskLoader;->dispatchOnLoadComplete(Landroid/content/AsyncTaskLoader$LoadTask;Ljava/lang/Object;)V
-HSPLandroid/content/AsyncTaskLoader;->executePendingTask()V
-HSPLandroid/content/AsyncTaskLoader;->onCancelLoad()Z
-HSPLandroid/content/AsyncTaskLoader;->onForceLoad()V
-HSPLandroid/content/AsyncTaskLoader;->onLoadInBackground()Ljava/lang/Object;
 HSPLandroid/content/AutofillOptions$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/AutofillOptions;
 HSPLandroid/content/AutofillOptions$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/content/AutofillOptions;-><init>(IZ)V
 HSPLandroid/content/AutofillOptions;->isAugmentedAutofillEnabled(Landroid/content/Context;)Z
-HSPLandroid/content/AutofillOptions;->isAutofillDisabledLocked(Landroid/content/ComponentName;)Z
 HSPLandroid/content/AutofillOptions;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/content/BroadcastReceiver$PendingResult$1;-><init>(Landroid/content/BroadcastReceiver$PendingResult;Landroid/app/IActivityManager;)V
 HSPLandroid/content/BroadcastReceiver$PendingResult$1;->run()V
@@ -5360,7 +4921,6 @@
 HSPLandroid/content/BroadcastReceiver;->setResultCode(I)V
 HSPLandroid/content/ClipData$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/ClipData;
 HSPLandroid/content/ClipData$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/content/ClipData$Item;-><init>(Ljava/lang/CharSequence;)V
 HSPLandroid/content/ClipData$Item;-><init>(Ljava/lang/CharSequence;Ljava/lang/String;Landroid/content/Intent;Landroid/net/Uri;)V
 HSPLandroid/content/ClipData$Item;->getText()Ljava/lang/CharSequence;
 HSPLandroid/content/ClipData$Item;->getUri()Landroid/net/Uri;
@@ -5394,7 +4954,7 @@
 HSPLandroid/content/ComponentName;-><init>(Ljava/lang/String;Landroid/os/Parcel;)V
 HSPLandroid/content/ComponentName;-><init>(Ljava/lang/String;Ljava/lang/String;)V
 HSPLandroid/content/ComponentName;->appendShortClassName(Ljava/lang/StringBuilder;Ljava/lang/String;Ljava/lang/String;)V
-PLandroid/content/ComponentName;->appendShortString(Ljava/lang/StringBuilder;)V
+HPLandroid/content/ComponentName;->appendShortString(Ljava/lang/StringBuilder;)V
 HSPLandroid/content/ComponentName;->appendShortString(Ljava/lang/StringBuilder;Ljava/lang/String;Ljava/lang/String;)V
 HSPLandroid/content/ComponentName;->compareTo(Landroid/content/ComponentName;)I
 HSPLandroid/content/ComponentName;->createRelative(Ljava/lang/String;Ljava/lang/String;)Landroid/content/ComponentName;
@@ -5423,7 +4983,6 @@
 HSPLandroid/content/ContentProvider$Transport;-><init>(Landroid/content/ContentProvider;)V
 HSPLandroid/content/ContentProvider$Transport;->access$300(Landroid/content/ContentProvider$Transport;Ljava/lang/String;Ljava/lang/String;I)I
 HSPLandroid/content/ContentProvider$Transport;->applyBatch(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/ArrayList;)[Landroid/content/ContentProviderResult;
-HSPLandroid/content/ContentProvider$Transport;->bulkInsert(Ljava/lang/String;Ljava/lang/String;Landroid/net/Uri;[Landroid/content/ContentValues;)I
 HSPLandroid/content/ContentProvider$Transport;->call(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;)Landroid/os/Bundle;
 HSPLandroid/content/ContentProvider$Transport;->canonicalize(Ljava/lang/String;Ljava/lang/String;Landroid/net/Uri;)Landroid/net/Uri;
 HSPLandroid/content/ContentProvider$Transport;->createCancellationSignal()Landroid/os/ICancellationSignal;
@@ -5490,7 +5049,6 @@
 HSPLandroid/content/ContentProvider;->uriHasUserId(Landroid/net/Uri;)Z
 HSPLandroid/content/ContentProvider;->validateIncomingAuthority(Ljava/lang/String;)V
 HSPLandroid/content/ContentProvider;->validateIncomingUri(Landroid/net/Uri;)Landroid/net/Uri;
-HSPLandroid/content/ContentProviderClient$CursorWrapperInner;-><init>(Landroid/content/ContentProviderClient;Landroid/database/Cursor;)V
 HSPLandroid/content/ContentProviderClient$CursorWrapperInner;->close()V
 HSPLandroid/content/ContentProviderClient$CursorWrapperInner;->finalize()V
 HSPLandroid/content/ContentProviderClient$NotRespondingRunnable;-><init>(Landroid/content/ContentProviderClient;)V
@@ -5504,10 +5062,7 @@
 HSPLandroid/content/ContentProviderClient;->call(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;)Landroid/os/Bundle;
 HSPLandroid/content/ContentProviderClient;->close()V
 HSPLandroid/content/ContentProviderClient;->closeInternal()Z
-HSPLandroid/content/ContentProviderClient;->delete(Landroid/net/Uri;Landroid/os/Bundle;)I
-HSPLandroid/content/ContentProviderClient;->delete(Landroid/net/Uri;Ljava/lang/String;[Ljava/lang/String;)I
 HSPLandroid/content/ContentProviderClient;->finalize()V
-HSPLandroid/content/ContentProviderClient;->getLocalContentProvider()Landroid/content/ContentProvider;
 HSPLandroid/content/ContentProviderClient;->query(Landroid/net/Uri;[Ljava/lang/String;Landroid/os/Bundle;Landroid/os/CancellationSignal;)Landroid/database/Cursor;
 HSPLandroid/content/ContentProviderClient;->query(Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;
 HSPLandroid/content/ContentProviderClient;->query(Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/database/Cursor;
@@ -5531,37 +5086,19 @@
 HSPLandroid/content/ContentProviderOperation$Builder;->access$700(Landroid/content/ContentProviderOperation$Builder;)Landroid/util/SparseArray;
 HSPLandroid/content/ContentProviderOperation$Builder;->access$800(Landroid/content/ContentProviderOperation$Builder;)Ljava/lang/Integer;
 HSPLandroid/content/ContentProviderOperation$Builder;->access$900(Landroid/content/ContentProviderOperation$Builder;)Z
-HSPLandroid/content/ContentProviderOperation$Builder;->assertSelectionAllowed()V
 HSPLandroid/content/ContentProviderOperation$Builder;->assertValuesAllowed()V
 HSPLandroid/content/ContentProviderOperation$Builder;->build()Landroid/content/ContentProviderOperation;
-HSPLandroid/content/ContentProviderOperation$Builder;->ensureSelectionArgs()V
 HSPLandroid/content/ContentProviderOperation$Builder;->ensureValues()V
-HSPLandroid/content/ContentProviderOperation$Builder;->setSelectionArg(ILjava/lang/Object;)V
 HSPLandroid/content/ContentProviderOperation$Builder;->setValue(Ljava/lang/String;Ljava/lang/Object;)V
-HSPLandroid/content/ContentProviderOperation$Builder;->withExpectedCount(I)Landroid/content/ContentProviderOperation$Builder;
-HSPLandroid/content/ContentProviderOperation$Builder;->withSelection(Ljava/lang/String;[Ljava/lang/String;)Landroid/content/ContentProviderOperation$Builder;
-HSPLandroid/content/ContentProviderOperation$Builder;->withValue(Ljava/lang/String;Ljava/lang/Object;)Landroid/content/ContentProviderOperation$Builder;
-HSPLandroid/content/ContentProviderOperation$Builder;->withValueBackReference(Ljava/lang/String;I)Landroid/content/ContentProviderOperation$Builder;
 HSPLandroid/content/ContentProviderOperation$Builder;->withValues(Landroid/content/ContentValues;)Landroid/content/ContentProviderOperation$Builder;
-HSPLandroid/content/ContentProviderOperation$Builder;->withYieldAllowed(Z)Landroid/content/ContentProviderOperation$Builder;
 HSPLandroid/content/ContentProviderOperation;-><init>(Landroid/content/ContentProviderOperation$Builder;)V
 HSPLandroid/content/ContentProviderOperation;-><init>(Landroid/content/ContentProviderOperation$Builder;Landroid/content/ContentProviderOperation$1;)V
 HSPLandroid/content/ContentProviderOperation;->apply(Landroid/content/ContentProvider;[Landroid/content/ContentProviderResult;I)Landroid/content/ContentProviderResult;
 HSPLandroid/content/ContentProviderOperation;->applyInternal(Landroid/content/ContentProvider;[Landroid/content/ContentProviderResult;I)Landroid/content/ContentProviderResult;
 HSPLandroid/content/ContentProviderOperation;->getUri()Landroid/net/Uri;
-HSPLandroid/content/ContentProviderOperation;->isInsert()Z
-HSPLandroid/content/ContentProviderOperation;->isReadOperation()Z
-HSPLandroid/content/ContentProviderOperation;->isWriteOperation()Z
-HSPLandroid/content/ContentProviderOperation;->isYieldAllowed()Z
-HSPLandroid/content/ContentProviderOperation;->newAssertQuery(Landroid/net/Uri;)Landroid/content/ContentProviderOperation$Builder;
-HSPLandroid/content/ContentProviderOperation;->newDelete(Landroid/net/Uri;)Landroid/content/ContentProviderOperation$Builder;
 HSPLandroid/content/ContentProviderOperation;->newInsert(Landroid/net/Uri;)Landroid/content/ContentProviderOperation$Builder;
-HSPLandroid/content/ContentProviderOperation;->newUpdate(Landroid/net/Uri;)Landroid/content/ContentProviderOperation$Builder;
 HSPLandroid/content/ContentProviderOperation;->resolveExtrasBackReferences([Landroid/content/ContentProviderResult;I)Landroid/os/Bundle;
-HSPLandroid/content/ContentProviderOperation;->resolveSelectionArgsBackReferences([Landroid/content/ContentProviderResult;I)[Ljava/lang/String;
 HSPLandroid/content/ContentProviderOperation;->resolveValueBackReferences([Landroid/content/ContentProviderResult;I)Landroid/content/ContentValues;
-HSPLandroid/content/ContentProviderOperation;->toString()Ljava/lang/String;
-HSPLandroid/content/ContentProviderOperation;->typeToString(I)Ljava/lang/String;
 HSPLandroid/content/ContentProviderOperation;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/content/ContentProviderProxy;-><init>(Landroid/os/IBinder;)V
 HSPLandroid/content/ContentProviderProxy;->applyBatch(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/ArrayList;)[Landroid/content/ContentProviderResult;
@@ -5579,12 +5116,7 @@
 HSPLandroid/content/ContentProviderResult$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/content/ContentProviderResult$1;->newArray(I)[Landroid/content/ContentProviderResult;
 HSPLandroid/content/ContentProviderResult$1;->newArray(I)[Ljava/lang/Object;
-HSPLandroid/content/ContentProviderResult;-><init>(I)V
-HSPLandroid/content/ContentProviderResult;-><init>(Landroid/net/Uri;)V
-HSPLandroid/content/ContentProviderResult;-><init>(Landroid/net/Uri;Ljava/lang/Integer;Landroid/os/Bundle;Ljava/lang/Throwable;)V
 HSPLandroid/content/ContentProviderResult;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/content/ContentResolver$2;-><init>(Landroid/content/SyncStatusObserver;)V
-HSPLandroid/content/ContentResolver$2;->onStatusChanged(I)V
 HSPLandroid/content/ContentResolver$CursorWrapperInner;-><init>(Landroid/content/ContentResolver;Landroid/database/Cursor;Landroid/content/IContentProvider;)V
 HSPLandroid/content/ContentResolver$CursorWrapperInner;->close()V
 HSPLandroid/content/ContentResolver$CursorWrapperInner;->finalize()V
@@ -5597,10 +5129,13 @@
 HSPLandroid/content/ContentResolver$ParcelFileDescriptorInner;->releaseResources()V
 HSPLandroid/content/ContentResolver$ResultListener;-><init>()V
 HSPLandroid/content/ContentResolver$ResultListener;-><init>(Landroid/content/ContentResolver$1;)V
+HSPLandroid/content/ContentResolver$ResultListener;->getExceptionFromBundle(Landroid/os/Bundle;)Ljava/lang/RuntimeException;
 HSPLandroid/content/ContentResolver$ResultListener;->onResult(Landroid/os/Bundle;)V
 HSPLandroid/content/ContentResolver$ResultListener;->waitForResult(J)V
 HSPLandroid/content/ContentResolver$StringResultListener;-><init>()V
 HSPLandroid/content/ContentResolver$StringResultListener;-><init>(Landroid/content/ContentResolver$1;)V
+HSPLandroid/content/ContentResolver$StringResultListener;->getResultFromBundle(Landroid/os/Bundle;)Ljava/lang/Object;
+HSPLandroid/content/ContentResolver$StringResultListener;->getResultFromBundle(Landroid/os/Bundle;)Ljava/lang/String;
 HSPLandroid/content/ContentResolver;-><init>(Landroid/content/Context;)V
 HSPLandroid/content/ContentResolver;-><init>(Landroid/content/Context;Landroid/content/ContentInterface;)V
 HSPLandroid/content/ContentResolver;->acquireContentProviderClient(Landroid/net/Uri;)Landroid/content/ContentProviderClient;
@@ -5609,34 +5144,27 @@
 HSPLandroid/content/ContentResolver;->acquireProvider(Landroid/net/Uri;)Landroid/content/IContentProvider;
 HSPLandroid/content/ContentResolver;->acquireProvider(Ljava/lang/String;)Landroid/content/IContentProvider;
 HSPLandroid/content/ContentResolver;->acquireUnstableContentProviderClient(Landroid/net/Uri;)Landroid/content/ContentProviderClient;
-HSPLandroid/content/ContentResolver;->acquireUnstableContentProviderClient(Ljava/lang/String;)Landroid/content/ContentProviderClient;
 HSPLandroid/content/ContentResolver;->acquireUnstableProvider(Landroid/net/Uri;)Landroid/content/IContentProvider;
-HSPLandroid/content/ContentResolver;->acquireUnstableProvider(Ljava/lang/String;)Landroid/content/IContentProvider;
-HSPLandroid/content/ContentResolver;->addPeriodicSync(Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;J)V
-HSPLandroid/content/ContentResolver;->addStatusChangeListener(ILandroid/content/SyncStatusObserver;)Ljava/lang/Object;
 HSPLandroid/content/ContentResolver;->applyBatch(Ljava/lang/String;Ljava/util/ArrayList;)[Landroid/content/ContentProviderResult;
-HSPLandroid/content/ContentResolver;->bulkInsert(Landroid/net/Uri;[Landroid/content/ContentValues;)I
 HSPLandroid/content/ContentResolver;->call(Landroid/net/Uri;Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;)Landroid/os/Bundle;
 HSPLandroid/content/ContentResolver;->call(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;)Landroid/os/Bundle;
+HSPLandroid/content/ContentResolver;->canonicalize(Landroid/net/Uri;)Landroid/net/Uri;
 HSPLandroid/content/ContentResolver;->createSqlQueryBundle(Ljava/lang/String;[Ljava/lang/String;)Landroid/os/Bundle;
 HSPLandroid/content/ContentResolver;->createSqlQueryBundle(Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)Landroid/os/Bundle;
 HSPLandroid/content/ContentResolver;->delete(Landroid/net/Uri;Landroid/os/Bundle;)I
 HSPLandroid/content/ContentResolver;->delete(Landroid/net/Uri;Ljava/lang/String;[Ljava/lang/String;)I
+HSPLandroid/content/ContentResolver;->getAttributionTag()Ljava/lang/String;
 HSPLandroid/content/ContentResolver;->getContentService()Landroid/content/IContentService;
 HSPLandroid/content/ContentResolver;->getFeatureId()Ljava/lang/String;
-HSPLandroid/content/ContentResolver;->getIsSyncable(Landroid/accounts/Account;Ljava/lang/String;)I
-HSPLandroid/content/ContentResolver;->getMasterSyncAutomatically()Z
 HSPLandroid/content/ContentResolver;->getPackageName()Ljava/lang/String;
-HSPLandroid/content/ContentResolver;->getPeriodicSyncs(Landroid/accounts/Account;Ljava/lang/String;)Ljava/util/List;
 HSPLandroid/content/ContentResolver;->getResourceId(Landroid/net/Uri;)Landroid/content/ContentResolver$OpenResourceIdResult;
 HSPLandroid/content/ContentResolver;->getSyncAdapterPackagesForAuthorityAsUser(Ljava/lang/String;I)[Ljava/lang/String;
-HSPLandroid/content/ContentResolver;->getSyncAdapterTypes()[Landroid/content/SyncAdapterType;
+HSPLandroid/content/ContentResolver;->getSyncAdapterTypesAsUser(I)[Landroid/content/SyncAdapterType;
 HSPLandroid/content/ContentResolver;->getSyncAutomatically(Landroid/accounts/Account;Ljava/lang/String;)Z
 HSPLandroid/content/ContentResolver;->getType(Landroid/net/Uri;)Ljava/lang/String;
 HSPLandroid/content/ContentResolver;->getUserId()I
 HSPLandroid/content/ContentResolver;->insert(Landroid/net/Uri;Landroid/content/ContentValues;)Landroid/net/Uri;
 HSPLandroid/content/ContentResolver;->insert(Landroid/net/Uri;Landroid/content/ContentValues;Landroid/os/Bundle;)Landroid/net/Uri;
-HSPLandroid/content/ContentResolver;->invalidPeriodicExtras(Landroid/os/Bundle;)Z
 HSPLandroid/content/ContentResolver;->maybeLogQueryToEventLog(JLandroid/net/Uri;[Ljava/lang/String;Landroid/os/Bundle;)V
 HSPLandroid/content/ContentResolver;->maybeLogUpdateToEventLog(JLandroid/net/Uri;Ljava/lang/String;Ljava/lang/String;)V
 HSPLandroid/content/ContentResolver;->notifyChange(Landroid/net/Uri;Landroid/database/ContentObserver;)V
@@ -5656,13 +5184,9 @@
 HSPLandroid/content/ContentResolver;->query(Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/database/Cursor;
 HSPLandroid/content/ContentResolver;->registerContentObserver(Landroid/net/Uri;ZLandroid/database/ContentObserver;)V
 HSPLandroid/content/ContentResolver;->registerContentObserver(Landroid/net/Uri;ZLandroid/database/ContentObserver;I)V
-HSPLandroid/content/ContentResolver;->removePeriodicSync(Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;)V
-HSPLandroid/content/ContentResolver;->requestSync(Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;)V
-HSPLandroid/content/ContentResolver;->requestSyncAsUser(Landroid/accounts/Account;Ljava/lang/String;ILandroid/os/Bundle;)V
 HSPLandroid/content/ContentResolver;->resolveUserId(Landroid/net/Uri;)I
-HSPLandroid/content/ContentResolver;->setIsSyncable(Landroid/accounts/Account;Ljava/lang/String;I)V
-HSPLandroid/content/ContentResolver;->setSyncAutomatically(Landroid/accounts/Account;Ljava/lang/String;Z)V
 HSPLandroid/content/ContentResolver;->setSyncAutomaticallyAsUser(Landroid/accounts/Account;Ljava/lang/String;ZI)V
+PLandroid/content/ContentResolver;->syncErrorToString(I)Ljava/lang/String;
 HSPLandroid/content/ContentResolver;->unregisterContentObserver(Landroid/database/ContentObserver;)V
 HSPLandroid/content/ContentResolver;->update(Landroid/net/Uri;Landroid/content/ContentValues;Landroid/os/Bundle;)I
 HSPLandroid/content/ContentResolver;->update(Landroid/net/Uri;Landroid/content/ContentValues;Ljava/lang/String;[Ljava/lang/String;)I
@@ -5679,7 +5203,6 @@
 HSPLandroid/content/ContentValues;-><init>(Landroid/os/Parcel;Landroid/content/ContentValues$1;)V
 HSPLandroid/content/ContentValues;->clear()V
 HSPLandroid/content/ContentValues;->containsKey(Ljava/lang/String;)Z
-HSPLandroid/content/ContentValues;->equals(Ljava/lang/Object;)Z
 HSPLandroid/content/ContentValues;->get(Ljava/lang/String;)Ljava/lang/Object;
 HSPLandroid/content/ContentValues;->getAsBoolean(Ljava/lang/String;)Ljava/lang/Boolean;
 HSPLandroid/content/ContentValues;->getAsByteArray(Ljava/lang/String;)[B
@@ -5688,21 +5211,17 @@
 HSPLandroid/content/ContentValues;->getAsString(Ljava/lang/String;)Ljava/lang/String;
 HSPLandroid/content/ContentValues;->getValues()Landroid/util/ArrayMap;
 HSPLandroid/content/ContentValues;->isEmpty()Z
-HSPLandroid/content/ContentValues;->isSupportedValue(Ljava/lang/Object;)Z
 HSPLandroid/content/ContentValues;->keySet()Ljava/util/Set;
 HSPLandroid/content/ContentValues;->put(Ljava/lang/String;Ljava/lang/Boolean;)V
 HSPLandroid/content/ContentValues;->put(Ljava/lang/String;Ljava/lang/Double;)V
-HSPLandroid/content/ContentValues;->put(Ljava/lang/String;Ljava/lang/Float;)V
 HSPLandroid/content/ContentValues;->put(Ljava/lang/String;Ljava/lang/Integer;)V
 HSPLandroid/content/ContentValues;->put(Ljava/lang/String;Ljava/lang/Long;)V
 HSPLandroid/content/ContentValues;->put(Ljava/lang/String;Ljava/lang/String;)V
 HSPLandroid/content/ContentValues;->put(Ljava/lang/String;[B)V
-HSPLandroid/content/ContentValues;->putAll(Landroid/content/ContentValues;)V
 HSPLandroid/content/ContentValues;->putNull(Ljava/lang/String;)V
 HSPLandroid/content/ContentValues;->putObject(Ljava/lang/String;Ljava/lang/Object;)V
 HSPLandroid/content/ContentValues;->remove(Ljava/lang/String;)V
 HSPLandroid/content/ContentValues;->size()I
-HSPLandroid/content/ContentValues;->toString()Ljava/lang/String;
 HSPLandroid/content/ContentValues;->valueSet()Ljava/util/Set;
 HSPLandroid/content/ContentValues;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/content/Context;-><init>()V
@@ -5710,6 +5229,7 @@
 HSPLandroid/content/Context;->getColor(I)I
 HSPLandroid/content/Context;->getColorStateList(I)Landroid/content/res/ColorStateList;
 HSPLandroid/content/Context;->getDrawable(I)Landroid/graphics/drawable/Drawable;
+HSPLandroid/content/Context;->getFeatureId()Ljava/lang/String;
 HSPLandroid/content/Context;->getNextAutofillId()I
 HSPLandroid/content/Context;->getSharedPrefsFile(Ljava/lang/String;)Ljava/io/File;
 HSPLandroid/content/Context;->getString(I)Ljava/lang/String;
@@ -5727,7 +5247,7 @@
 HSPLandroid/content/ContextWrapper;->attachBaseContext(Landroid/content/Context;)V
 HSPLandroid/content/ContextWrapper;->bindIsolatedService(Landroid/content/Intent;ILjava/lang/String;Ljava/util/concurrent/Executor;Landroid/content/ServiceConnection;)Z
 HSPLandroid/content/ContextWrapper;->bindService(Landroid/content/Intent;Landroid/content/ServiceConnection;I)Z
-PLandroid/content/ContextWrapper;->bindServiceAsUser(Landroid/content/Intent;Landroid/content/ServiceConnection;ILandroid/os/Handler;Landroid/os/UserHandle;)Z
+HPLandroid/content/ContextWrapper;->bindServiceAsUser(Landroid/content/Intent;Landroid/content/ServiceConnection;ILandroid/os/Handler;Landroid/os/UserHandle;)Z
 HSPLandroid/content/ContextWrapper;->bindServiceAsUser(Landroid/content/Intent;Landroid/content/ServiceConnection;ILandroid/os/UserHandle;)Z
 HSPLandroid/content/ContextWrapper;->canLoadUnsafeResources()Z
 HSPLandroid/content/ContextWrapper;->checkCallingOrSelfPermission(Ljava/lang/String;)I
@@ -5736,8 +5256,8 @@
 HSPLandroid/content/ContextWrapper;->checkPermission(Ljava/lang/String;IILandroid/os/IBinder;)I
 HSPLandroid/content/ContextWrapper;->checkSelfPermission(Ljava/lang/String;)I
 HSPLandroid/content/ContextWrapper;->checkUriPermission(Landroid/net/Uri;III)I
-HSPLandroid/content/ContextWrapper;->checkUriPermission(Landroid/net/Uri;IIILandroid/os/IBinder;)I
 HSPLandroid/content/ContextWrapper;->createApplicationContext(Landroid/content/pm/ApplicationInfo;I)Landroid/content/Context;
+HSPLandroid/content/ContextWrapper;->createAttributionContext(Ljava/lang/String;)Landroid/content/Context;
 HSPLandroid/content/ContextWrapper;->createConfigurationContext(Landroid/content/res/Configuration;)Landroid/content/Context;
 HSPLandroid/content/ContextWrapper;->createContextAsUser(Landroid/os/UserHandle;I)Landroid/content/Context;
 HSPLandroid/content/ContextWrapper;->createCredentialProtectedStorageContext()Landroid/content/Context;
@@ -5746,16 +5266,15 @@
 HSPLandroid/content/ContextWrapper;->createFeatureContext(Ljava/lang/String;)Landroid/content/Context;
 HSPLandroid/content/ContextWrapper;->createPackageContext(Ljava/lang/String;I)Landroid/content/Context;
 HSPLandroid/content/ContextWrapper;->createPackageContextAsUser(Ljava/lang/String;ILandroid/os/UserHandle;)Landroid/content/Context;
-HSPLandroid/content/ContextWrapper;->databaseList()[Ljava/lang/String;
 HSPLandroid/content/ContextWrapper;->deleteDatabase(Ljava/lang/String;)Z
 HSPLandroid/content/ContextWrapper;->deleteFile(Ljava/lang/String;)Z
 HSPLandroid/content/ContextWrapper;->enforceCallingOrSelfPermission(Ljava/lang/String;Ljava/lang/String;)V
 HSPLandroid/content/ContextWrapper;->enforceCallingPermission(Ljava/lang/String;Ljava/lang/String;)V
 HSPLandroid/content/ContextWrapper;->enforcePermission(Ljava/lang/String;IILjava/lang/String;)V
-HSPLandroid/content/ContextWrapper;->fileList()[Ljava/lang/String;
 HSPLandroid/content/ContextWrapper;->getApplicationContext()Landroid/content/Context;
 HSPLandroid/content/ContextWrapper;->getApplicationInfo()Landroid/content/pm/ApplicationInfo;
 HSPLandroid/content/ContextWrapper;->getAssets()Landroid/content/res/AssetManager;
+HSPLandroid/content/ContextWrapper;->getAttributionTag()Ljava/lang/String;
 HSPLandroid/content/ContextWrapper;->getAutofillClient()Landroid/view/autofill/AutofillManager$AutofillClient;
 HSPLandroid/content/ContextWrapper;->getAutofillOptions()Landroid/content/AutofillOptions;
 HSPLandroid/content/ContextWrapper;->getBaseContext()Landroid/content/Context;
@@ -5786,7 +5305,6 @@
 HSPLandroid/content/ContextWrapper;->getPackageCodePath()Ljava/lang/String;
 HSPLandroid/content/ContextWrapper;->getPackageManager()Landroid/content/pm/PackageManager;
 HSPLandroid/content/ContextWrapper;->getPackageName()Ljava/lang/String;
-HSPLandroid/content/ContextWrapper;->getPackageResourcePath()Ljava/lang/String;
 HSPLandroid/content/ContextWrapper;->getResources()Landroid/content/res/Resources;
 HSPLandroid/content/ContextWrapper;->getSharedPreferences(Ljava/lang/String;I)Landroid/content/SharedPreferences;
 HSPLandroid/content/ContextWrapper;->getSharedPreferencesPath(Ljava/lang/String;)Ljava/io/File;
@@ -5796,24 +5314,19 @@
 HSPLandroid/content/ContextWrapper;->getThemeResId()I
 HSPLandroid/content/ContextWrapper;->getUser()Landroid/os/UserHandle;
 HSPLandroid/content/ContextWrapper;->getUserId()I
-HSPLandroid/content/ContextWrapper;->grantUriPermission(Ljava/lang/String;Landroid/net/Uri;I)V
 HSPLandroid/content/ContextWrapper;->isDeviceProtectedStorage()Z
 HSPLandroid/content/ContextWrapper;->isRestricted()Z
+HSPLandroid/content/ContextWrapper;->isUiContext()Z
 HSPLandroid/content/ContextWrapper;->openFileInput(Ljava/lang/String;)Ljava/io/FileInputStream;
 HSPLandroid/content/ContextWrapper;->openFileOutput(Ljava/lang/String;I)Ljava/io/FileOutputStream;
-HSPLandroid/content/ContextWrapper;->openOrCreateDatabase(Ljava/lang/String;ILandroid/database/sqlite/SQLiteDatabase$CursorFactory;)Landroid/database/sqlite/SQLiteDatabase;
 HSPLandroid/content/ContextWrapper;->registerReceiver(Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;)Landroid/content/Intent;
 HSPLandroid/content/ContextWrapper;->registerReceiver(Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;Ljava/lang/String;Landroid/os/Handler;)Landroid/content/Intent;
-HSPLandroid/content/ContextWrapper;->registerReceiver(Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;Ljava/lang/String;Landroid/os/Handler;I)Landroid/content/Intent;
 HSPLandroid/content/ContextWrapper;->registerReceiverAsUser(Landroid/content/BroadcastReceiver;Landroid/os/UserHandle;Landroid/content/IntentFilter;Ljava/lang/String;Landroid/os/Handler;)Landroid/content/Intent;
 HSPLandroid/content/ContextWrapper;->registerReceiverForAllUsers(Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;Ljava/lang/String;Landroid/os/Handler;)Landroid/content/Intent;
-HSPLandroid/content/ContextWrapper;->revokeUriPermission(Landroid/net/Uri;I)V
 HSPLandroid/content/ContextWrapper;->sendBroadcast(Landroid/content/Intent;)V
 HSPLandroid/content/ContextWrapper;->sendBroadcast(Landroid/content/Intent;Ljava/lang/String;)V
 HSPLandroid/content/ContextWrapper;->sendBroadcastAsUser(Landroid/content/Intent;Landroid/os/UserHandle;)V
 HSPLandroid/content/ContextWrapper;->sendBroadcastAsUser(Landroid/content/Intent;Landroid/os/UserHandle;Ljava/lang/String;)V
-HSPLandroid/content/ContextWrapper;->sendOrderedBroadcast(Landroid/content/Intent;Ljava/lang/String;)V
-HSPLandroid/content/ContextWrapper;->sendOrderedBroadcast(Landroid/content/Intent;Ljava/lang/String;Landroid/content/BroadcastReceiver;Landroid/os/Handler;ILjava/lang/String;Landroid/os/Bundle;)V
 HSPLandroid/content/ContextWrapper;->sendStickyBroadcastAsUser(Landroid/content/Intent;Landroid/os/UserHandle;)V
 HSPLandroid/content/ContextWrapper;->setAutofillClient(Landroid/view/autofill/AutofillManager$AutofillClient;)V
 HSPLandroid/content/ContextWrapper;->setAutofillOptions(Landroid/content/AutofillOptions;)V
@@ -5836,21 +5349,16 @@
 HPLandroid/content/IClipboard$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/content/IContentService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HSPLandroid/content/IContentService$Stub$Proxy;->addPeriodicSync(Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;J)V
-HSPLandroid/content/IContentService$Stub$Proxy;->addStatusChangeListener(ILandroid/content/ISyncStatusObserver;)V
 HSPLandroid/content/IContentService$Stub$Proxy;->getIsSyncable(Landroid/accounts/Account;Ljava/lang/String;)I
 HSPLandroid/content/IContentService$Stub$Proxy;->getMasterSyncAutomatically()Z
-HSPLandroid/content/IContentService$Stub$Proxy;->getPeriodicSyncs(Landroid/accounts/Account;Ljava/lang/String;Landroid/content/ComponentName;)Ljava/util/List;
-HSPLandroid/content/IContentService$Stub$Proxy;->getSyncAdapterTypes()[Landroid/content/SyncAdapterType;
 HSPLandroid/content/IContentService$Stub$Proxy;->getSyncAutomatically(Landroid/accounts/Account;Ljava/lang/String;)Z
 HSPLandroid/content/IContentService$Stub$Proxy;->notifyChange([Landroid/net/Uri;Landroid/database/IContentObserver;ZIIILjava/lang/String;)V
 HSPLandroid/content/IContentService$Stub$Proxy;->registerContentObserver(Landroid/net/Uri;ZLandroid/database/IContentObserver;II)V
 HSPLandroid/content/IContentService$Stub$Proxy;->removePeriodicSync(Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;)V
-HSPLandroid/content/IContentService$Stub$Proxy;->setIsSyncable(Landroid/accounts/Account;Ljava/lang/String;I)V
-HSPLandroid/content/IContentService$Stub$Proxy;->setSyncAutomaticallyAsUser(Landroid/accounts/Account;Ljava/lang/String;ZI)V
-HSPLandroid/content/IContentService$Stub$Proxy;->syncAsUser(Landroid/content/SyncRequest;ILjava/lang/String;)V
 HSPLandroid/content/IContentService$Stub$Proxy;->unregisterContentObserver(Landroid/database/IContentObserver;)V
 HSPLandroid/content/IContentService$Stub;-><init>()V
 HSPLandroid/content/IContentService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/IContentService;
+HPLandroid/content/IContentService$Stub;->getDefaultTransactionName(I)Ljava/lang/String;
 HSPLandroid/content/IContentService$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/content/IIntentReceiver$Stub$Proxy;->asBinder()Landroid/os/IBinder;
 HSPLandroid/content/IIntentReceiver$Stub$Proxy;->performReceive(Landroid/content/Intent;ILjava/lang/String;Landroid/os/Bundle;ZZI)V
@@ -5868,39 +5376,25 @@
 HSPLandroid/content/IOnPrimaryClipChangedListener$Stub;-><init>()V
 HSPLandroid/content/IOnPrimaryClipChangedListener$Stub;->asBinder()Landroid/os/IBinder;
 HPLandroid/content/IOnPrimaryClipChangedListener$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/IOnPrimaryClipChangedListener;
-PLandroid/content/IOnPrimaryClipChangedListener$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/content/IRestrictionsManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/content/IRestrictionsManager$Stub$Proxy;->getApplicationRestrictions(Ljava/lang/String;)Landroid/os/Bundle;
 HSPLandroid/content/IRestrictionsManager$Stub;-><init>()V
-HSPLandroid/content/IRestrictionsManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/IRestrictionsManager;
 HPLandroid/content/IRestrictionsManager$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HPLandroid/content/ISyncAdapter$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HPLandroid/content/ISyncAdapter$Stub$Proxy;->asBinder()Landroid/os/IBinder;
 HPLandroid/content/ISyncAdapter$Stub$Proxy;->cancelSync(Landroid/content/ISyncContext;)V
 HPLandroid/content/ISyncAdapter$Stub$Proxy;->onUnsyncableAccount(Landroid/content/ISyncAdapterUnsyncableAccountCallback;)V
 HPLandroid/content/ISyncAdapter$Stub$Proxy;->startSync(Landroid/content/ISyncContext;Ljava/lang/String;Landroid/accounts/Account;Landroid/os/Bundle;)V
-HSPLandroid/content/ISyncAdapter$Stub;-><init>()V
 HSPLandroid/content/ISyncAdapter$Stub;->asBinder()Landroid/os/IBinder;
 HPLandroid/content/ISyncAdapter$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/ISyncAdapter;
 HSPLandroid/content/ISyncAdapter$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/content/ISyncAdapterUnsyncableAccountCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/content/ISyncAdapterUnsyncableAccountCallback$Stub$Proxy;->onUnsyncableAccountDone(Z)V
 PLandroid/content/ISyncAdapterUnsyncableAccountCallback$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/content/ISyncAdapterUnsyncableAccountCallback$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/ISyncAdapterUnsyncableAccountCallback;
 HPLandroid/content/ISyncAdapterUnsyncableAccountCallback$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/content/ISyncContext$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/content/ISyncContext$Stub$Proxy;->asBinder()Landroid/os/IBinder;
 HSPLandroid/content/ISyncContext$Stub$Proxy;->onFinished(Landroid/content/SyncResult;)V
 HPLandroid/content/ISyncContext$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/content/ISyncContext$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/ISyncContext;
 HPLandroid/content/ISyncContext$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HPLandroid/content/ISyncStatusObserver$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HPLandroid/content/ISyncStatusObserver$Stub$Proxy;->asBinder()Landroid/os/IBinder;
 HPLandroid/content/ISyncStatusObserver$Stub$Proxy;->onStatusChanged(I)V
-HSPLandroid/content/ISyncStatusObserver$Stub;-><init>()V
-HSPLandroid/content/ISyncStatusObserver$Stub;->asBinder()Landroid/os/IBinder;
 HPLandroid/content/ISyncStatusObserver$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/ISyncStatusObserver;
-HSPLandroid/content/ISyncStatusObserver$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/content/Intent$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/Intent;
 HSPLandroid/content/Intent$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/content/Intent$1;->newArray(I)[Landroid/content/Intent;
@@ -5920,7 +5414,6 @@
 HSPLandroid/content/Intent;->addCategory(Ljava/lang/String;)Landroid/content/Intent;
 HSPLandroid/content/Intent;->addFlags(I)Landroid/content/Intent;
 HSPLandroid/content/Intent;->canStripForHistory()Z
-HSPLandroid/content/Intent;->clone()Ljava/lang/Object;
 HSPLandroid/content/Intent;->cloneFilter()Landroid/content/Intent;
 HSPLandroid/content/Intent;->createChooser(Landroid/content/Intent;Ljava/lang/CharSequence;)Landroid/content/Intent;
 HSPLandroid/content/Intent;->createChooser(Landroid/content/Intent;Ljava/lang/CharSequence;Landroid/content/IntentSender;)Landroid/content/Intent;
@@ -5966,6 +5459,7 @@
 HSPLandroid/content/Intent;->isAccessUriMode(I)Z
 HSPLandroid/content/Intent;->isDocument()Z
 HSPLandroid/content/Intent;->isExcludingStopped()Z
+HSPLandroid/content/Intent;->isImageCaptureIntent()Z
 HSPLandroid/content/Intent;->isWebIntent()Z
 HSPLandroid/content/Intent;->makeMainActivity(Landroid/content/ComponentName;)Landroid/content/Intent;
 HSPLandroid/content/Intent;->makeMainSelectorActivity(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;
@@ -5989,7 +5483,6 @@
 HSPLandroid/content/Intent;->putExtra(Ljava/lang/String;[J)Landroid/content/Intent;
 HSPLandroid/content/Intent;->putExtra(Ljava/lang/String;[Landroid/os/Parcelable;)Landroid/content/Intent;
 HSPLandroid/content/Intent;->putExtra(Ljava/lang/String;[Ljava/lang/String;)Landroid/content/Intent;
-HSPLandroid/content/Intent;->putExtras(Landroid/content/Intent;)Landroid/content/Intent;
 HSPLandroid/content/Intent;->putExtras(Landroid/os/Bundle;)Landroid/content/Intent;
 HSPLandroid/content/Intent;->putParcelableArrayListExtra(Ljava/lang/String;Ljava/util/ArrayList;)Landroid/content/Intent;
 HSPLandroid/content/Intent;->putStringArrayListExtra(Ljava/lang/String;Ljava/util/ArrayList;)Landroid/content/Intent;
@@ -6079,15 +5572,17 @@
 HSPLandroid/content/IntentFilter;->hasCategory(Ljava/lang/String;)Z
 HSPLandroid/content/IntentFilter;->hasDataPath(Ljava/lang/String;)Z
 HSPLandroid/content/IntentFilter;->hasDataScheme(Ljava/lang/String;)Z
-HSPLandroid/content/IntentFilter;->hasDataSchemeSpecificPart(Ljava/lang/String;)Z
 HSPLandroid/content/IntentFilter;->isImplicitlyVisibleToInstantApp()Z
 HSPLandroid/content/IntentFilter;->isVisibleToInstantApp()Z
+HSPLandroid/content/IntentFilter;->lambda$addDataType$0$IntentFilter(Ljava/lang/String;Ljava/lang/Boolean;)V
 HSPLandroid/content/IntentFilter;->match(Landroid/content/ContentResolver;Landroid/content/Intent;ZLjava/lang/String;)I
 HSPLandroid/content/IntentFilter;->match(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/net/Uri;Ljava/util/Set;Ljava/lang/String;)I
 HSPLandroid/content/IntentFilter;->matchAction(Ljava/lang/String;)Z
 HSPLandroid/content/IntentFilter;->matchCategories(Ljava/util/Set;)Ljava/lang/String;
 HSPLandroid/content/IntentFilter;->matchData(Ljava/lang/String;Ljava/lang/String;Landroid/net/Uri;)I
+HSPLandroid/content/IntentFilter;->matchData(Ljava/lang/String;Ljava/lang/String;Landroid/net/Uri;Z)I
 HSPLandroid/content/IntentFilter;->matchDataAuthority(Landroid/net/Uri;)I
+HSPLandroid/content/IntentFilter;->processMimeType(Ljava/lang/String;Ljava/util/function/BiConsumer;)V
 HSPLandroid/content/IntentFilter;->readFromXml(Lorg/xmlpull/v1/XmlPullParser;)V
 HSPLandroid/content/IntentFilter;->schemesIterator()Ljava/util/Iterator;
 HSPLandroid/content/IntentFilter;->setAutoVerify(Z)V
@@ -6102,41 +5597,22 @@
 HSPLandroid/content/IntentSender;-><init>(Landroid/content/IIntentSender;Landroid/os/IBinder;)V
 HSPLandroid/content/IntentSender;->getTarget()Landroid/content/IIntentSender;
 HSPLandroid/content/IntentSender;->getWhitelistToken()Landroid/os/IBinder;
-PLandroid/content/IntentSender;->sendIntent(Landroid/content/Context;ILandroid/content/Intent;Landroid/content/IntentSender$OnFinished;Landroid/os/Handler;)V
-HPLandroid/content/IntentSender;->sendIntent(Landroid/content/Context;ILandroid/content/Intent;Landroid/content/IntentSender$OnFinished;Landroid/os/Handler;Ljava/lang/String;)V
-HSPLandroid/content/Loader$ForceLoadContentObserver;-><init>(Landroid/content/Loader;)V
-HSPLandroid/content/Loader;->cancelLoad()Z
-HSPLandroid/content/Loader;->commitContentChanged()V
-HSPLandroid/content/Loader;->deliverResult(Ljava/lang/Object;)V
-HSPLandroid/content/Loader;->forceLoad()V
-HSPLandroid/content/Loader;->getContext()Landroid/content/Context;
-HSPLandroid/content/Loader;->isAbandoned()Z
-HSPLandroid/content/Loader;->isReset()Z
-HSPLandroid/content/Loader;->registerListener(ILandroid/content/Loader$OnLoadCompleteListener;)V
-HSPLandroid/content/Loader;->startLoading()V
-HSPLandroid/content/Loader;->takeContentChanged()Z
+HSPLandroid/content/IntentSender;->sendIntent(Landroid/content/Context;ILandroid/content/Intent;Landroid/content/IntentSender$OnFinished;Landroid/os/Handler;)V
+HSPLandroid/content/IntentSender;->sendIntent(Landroid/content/Context;ILandroid/content/Intent;Landroid/content/IntentSender$OnFinished;Landroid/os/Handler;Ljava/lang/String;)V
+HSPLandroid/content/IntentSender;->writeToParcel(Landroid/os/Parcel;I)V
+HSPLandroid/content/LocusId$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/LocusId;
+HSPLandroid/content/LocusId$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/content/LocusId;-><init>(Ljava/lang/String;)V
-HSPLandroid/content/MutableContextWrapper;-><init>(Landroid/content/Context;)V
-HSPLandroid/content/MutableContextWrapper;->setBaseContext(Landroid/content/Context;)V
 HSPLandroid/content/PeriodicSync$1;-><init>()V
-HSPLandroid/content/PeriodicSync$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/PeriodicSync;
-HSPLandroid/content/PeriodicSync$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/content/PeriodicSync;-><clinit>()V
-HSPLandroid/content/PeriodicSync;-><init>(Landroid/os/Parcel;)V
 HPLandroid/content/PeriodicSync;->writeToParcel(Landroid/os/Parcel;I)V
+HPLandroid/content/PermissionChecker;->checkAppOpPermission(Landroid/content/Context;Ljava/lang/String;IILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Z)I
 HSPLandroid/content/PermissionChecker;->checkCallingOrSelfPermissionForPreflight(Landroid/content/Context;Ljava/lang/String;)I
 HSPLandroid/content/PermissionChecker;->checkPermissionCommon(Landroid/content/Context;Ljava/lang/String;IILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Z)I
 HSPLandroid/content/PermissionChecker;->checkPermissionForPreflight(Landroid/content/Context;Ljava/lang/String;IILjava/lang/String;)I
 HSPLandroid/content/PermissionChecker;->checkRuntimePermission(Landroid/content/Context;Ljava/lang/String;IILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Z)I
-HSPLandroid/content/RestrictionsManager;-><init>(Landroid/content/Context;Landroid/content/IRestrictionsManager;)V
-HSPLandroid/content/RestrictionsManager;->getApplicationRestrictions()Landroid/os/Bundle;
 HSPLandroid/content/ServiceConnection;->onBindingDied(Landroid/content/ComponentName;)V
 HSPLandroid/content/ServiceConnection;->onNullBinding(Landroid/content/ComponentName;)V
-HSPLandroid/content/SyncAdapterType$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/SyncAdapterType;
-HSPLandroid/content/SyncAdapterType$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/content/SyncAdapterType$1;->newArray(I)[Landroid/content/SyncAdapterType;
-HSPLandroid/content/SyncAdapterType$1;->newArray(I)[Ljava/lang/Object;
-HSPLandroid/content/SyncAdapterType;-><init>(Landroid/os/Parcel;)V
 HSPLandroid/content/SyncAdapterType;-><init>(Ljava/lang/String;Ljava/lang/String;)V
 HSPLandroid/content/SyncAdapterType;-><init>(Ljava/lang/String;Ljava/lang/String;ZZZZLjava/lang/String;Ljava/lang/String;)V
 HPLandroid/content/SyncAdapterType;->allowParallelSyncs()Z
@@ -6153,31 +5629,9 @@
 PLandroid/content/SyncAdaptersCache;->onServicesChangedLocked(I)V
 HSPLandroid/content/SyncAdaptersCache;->parseServiceAttributes(Landroid/content/res/Resources;Ljava/lang/String;Landroid/util/AttributeSet;)Landroid/content/SyncAdapterType;
 HSPLandroid/content/SyncAdaptersCache;->parseServiceAttributes(Landroid/content/res/Resources;Ljava/lang/String;Landroid/util/AttributeSet;)Ljava/lang/Object;
-HSPLandroid/content/SyncContext;-><init>(Landroid/content/ISyncContext;)V
-HSPLandroid/content/SyncContext;->getSyncContextBinder()Landroid/os/IBinder;
 HSPLandroid/content/SyncContext;->onFinished(Landroid/content/SyncResult;)V
-PLandroid/content/SyncInfo$1;-><init>()V
-PLandroid/content/SyncInfo;-><clinit>()V
-HPLandroid/content/SyncInfo;-><init>(ILandroid/accounts/Account;Ljava/lang/String;J)V
 PLandroid/content/SyncRequest$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/SyncRequest;
 HPLandroid/content/SyncRequest$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/content/SyncRequest$Builder;-><init>()V
-HSPLandroid/content/SyncRequest$Builder;->access$100(Landroid/content/SyncRequest$Builder;)J
-HSPLandroid/content/SyncRequest$Builder;->access$1000(Landroid/content/SyncRequest$Builder;)Z
-HSPLandroid/content/SyncRequest$Builder;->access$200(Landroid/content/SyncRequest$Builder;)J
-HSPLandroid/content/SyncRequest$Builder;->access$300(Landroid/content/SyncRequest$Builder;)Landroid/accounts/Account;
-HSPLandroid/content/SyncRequest$Builder;->access$400(Landroid/content/SyncRequest$Builder;)Ljava/lang/String;
-HSPLandroid/content/SyncRequest$Builder;->access$500(Landroid/content/SyncRequest$Builder;)I
-HSPLandroid/content/SyncRequest$Builder;->access$600(Landroid/content/SyncRequest$Builder;)I
-HSPLandroid/content/SyncRequest$Builder;->access$700(Landroid/content/SyncRequest$Builder;)Z
-HSPLandroid/content/SyncRequest$Builder;->access$800(Landroid/content/SyncRequest$Builder;)Landroid/os/Bundle;
-HSPLandroid/content/SyncRequest$Builder;->access$900(Landroid/content/SyncRequest$Builder;)Landroid/os/Bundle;
-HSPLandroid/content/SyncRequest$Builder;->build()Landroid/content/SyncRequest;
-HSPLandroid/content/SyncRequest$Builder;->setExtras(Landroid/os/Bundle;)Landroid/content/SyncRequest$Builder;
-HSPLandroid/content/SyncRequest$Builder;->setSyncAdapter(Landroid/accounts/Account;Ljava/lang/String;)Landroid/content/SyncRequest$Builder;
-HSPLandroid/content/SyncRequest$Builder;->setupInterval(JJ)V
-HSPLandroid/content/SyncRequest$Builder;->syncOnce()Landroid/content/SyncRequest$Builder;
-HSPLandroid/content/SyncRequest;-><init>(Landroid/content/SyncRequest$Builder;)V
 HPLandroid/content/SyncRequest;-><init>(Landroid/os/Parcel;)V
 HPLandroid/content/SyncRequest;-><init>(Landroid/os/Parcel;Landroid/content/SyncRequest$1;)V
 HPLandroid/content/SyncRequest;->getAccount()Landroid/accounts/Account;
@@ -6186,7 +5640,6 @@
 HPLandroid/content/SyncRequest;->getSyncFlexTime()J
 HPLandroid/content/SyncRequest;->getSyncRunTime()J
 HPLandroid/content/SyncRequest;->isPeriodic()Z
-HSPLandroid/content/SyncRequest;->writeToParcel(Landroid/os/Parcel;I)V
 HPLandroid/content/SyncResult$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/SyncResult;
 HPLandroid/content/SyncResult$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/content/SyncResult;-><init>()V
@@ -6205,7 +5658,7 @@
 HSPLandroid/content/SyncStats;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/content/SyncStatusInfo$Stats;-><init>()V
 PLandroid/content/SyncStatusInfo$Stats;->clear()V
-PLandroid/content/SyncStatusInfo$Stats;->copyTo(Landroid/content/SyncStatusInfo$Stats;)V
+HPLandroid/content/SyncStatusInfo$Stats;->copyTo(Landroid/content/SyncStatusInfo$Stats;)V
 HSPLandroid/content/SyncStatusInfo;-><init>(I)V
 HPLandroid/content/SyncStatusInfo;->addEvent(Ljava/lang/String;)V
 HPLandroid/content/SyncStatusInfo;->areSameDates(JJ)Z
@@ -6231,7 +5684,6 @@
 HSPLandroid/content/UndoManager$UndoState;->matchOwner(Landroid/content/UndoOwner;)Z
 HSPLandroid/content/UndoManager$UndoState;->setCanMerge(Z)Z
 HSPLandroid/content/UndoManager$UndoState;->updateLabel(Ljava/lang/CharSequence;)V
-HSPLandroid/content/UndoManager$UndoState;->writeToParcel(Landroid/os/Parcel;)V
 HSPLandroid/content/UndoManager;-><init>()V
 HSPLandroid/content/UndoManager;->addOperation(Landroid/content/UndoOperation;I)V
 HSPLandroid/content/UndoManager;->beginUpdate(Ljava/lang/CharSequence;)V
@@ -6248,9 +5700,7 @@
 HSPLandroid/content/UndoManager;->matchOwners(Landroid/content/UndoManager$UndoState;[Landroid/content/UndoOwner;)Z
 HSPLandroid/content/UndoManager;->pushWorkingState()V
 HSPLandroid/content/UndoManager;->removeOwner(Landroid/content/UndoOwner;)V
-HSPLandroid/content/UndoManager;->restoreInstanceState(Landroid/os/Parcel;Ljava/lang/ClassLoader;)V
 HSPLandroid/content/UndoManager;->saveInstanceState(Landroid/os/Parcel;)V
-HSPLandroid/content/UndoManager;->saveOwner(Landroid/content/UndoOwner;Landroid/os/Parcel;)V
 HSPLandroid/content/UndoOperation;-><init>(Landroid/content/UndoOwner;)V
 HSPLandroid/content/UndoOperation;->allowMerge()Z
 HSPLandroid/content/UndoOperation;->getOwner()Landroid/content/UndoOwner;
@@ -6265,7 +5715,6 @@
 HSPLandroid/content/UriMatcher;->createChild(Ljava/lang/String;)Landroid/content/UriMatcher;
 HSPLandroid/content/UriMatcher;->match(Landroid/net/Uri;)I
 HSPLandroid/content/integrity/IAppIntegrityManager$Stub;-><init>()V
-HPLandroid/content/integrity/IAppIntegrityManager$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/content/om/IOverlayManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HSPLandroid/content/om/IOverlayManager$Stub$Proxy;->getOverlayInfosForTarget(Ljava/lang/String;I)Ljava/util/List;
 HSPLandroid/content/om/IOverlayManager$Stub;-><init>()V
@@ -6285,10 +5734,9 @@
 HSPLandroid/content/pm/-$$Lambda$IPackageManager$Stub$Proxy$X2I1qlX4SiKMZSjDTNzS_nTibbo;-><init>(Landroid/os/Parcel;)V
 HSPLandroid/content/pm/-$$Lambda$IPackageManager$Stub$Proxy$X2I1qlX4SiKMZSjDTNzS_nTibbo;->accept(Ljava/lang/Object;Ljava/lang/Object;)V
 HSPLandroid/content/pm/-$$Lambda$T1UQAuePWRRmVQ1KzTyMAktZUPM;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
-HPLandroid/content/pm/-$$Lambda$ciir_QAmv6RwJro4I58t77dPnxU;->accept(Ljava/lang/Object;Ljava/lang/Object;)V
+HSPLandroid/content/pm/-$$Lambda$ciir_QAmv6RwJro4I58t77dPnxU;->accept(Ljava/lang/Object;Ljava/lang/Object;)V
 HSPLandroid/content/pm/-$$Lambda$hUJwdX9IqTlLwBds2BUGqVf-FM8;-><clinit>()V
 HSPLandroid/content/pm/-$$Lambda$hUJwdX9IqTlLwBds2BUGqVf-FM8;-><init>()V
-HSPLandroid/content/pm/-$$Lambda$hUJwdX9IqTlLwBds2BUGqVf-FM8;->get()Ljava/lang/Object;
 HSPLandroid/content/pm/-$$Lambda$n3uXeb1v-YRmq_BWTfosEqUUr9g;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
 HSPLandroid/content/pm/-$$Lambda$zO9HBUVgPeroyDQPLJE-MNMvSqc;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
 HSPLandroid/content/pm/ActivityInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/ActivityInfo;
@@ -6325,9 +5773,9 @@
 HSPLandroid/content/pm/ApplicationInfo;->getAllApkPaths()[Ljava/lang/String;
 HSPLandroid/content/pm/ApplicationInfo;->getApplicationInfo()Landroid/content/pm/ApplicationInfo;
 HSPLandroid/content/pm/ApplicationInfo;->getBaseCodePath()Ljava/lang/String;
-HSPLandroid/content/pm/ApplicationInfo;->getBaseResourcePath()Ljava/lang/String;
 HSPLandroid/content/pm/ApplicationInfo;->getCodePath()Ljava/lang/String;
 HSPLandroid/content/pm/ApplicationInfo;->getHiddenApiEnforcementPolicy()I
+PLandroid/content/pm/ApplicationInfo;->getSplitCodePaths()[Ljava/lang/String;
 HSPLandroid/content/pm/ApplicationInfo;->hasRequestedLegacyExternalStorage()Z
 HSPLandroid/content/pm/ApplicationInfo;->hasRtlSupport()Z
 HSPLandroid/content/pm/ApplicationInfo;->initForUser(I)V
@@ -6373,7 +5821,6 @@
 HSPLandroid/content/pm/BaseParceledListSlice;->setInlineCountLimit(I)V
 HSPLandroid/content/pm/BaseParceledListSlice;->verifySameType(Ljava/lang/Class;Ljava/lang/Class;)V
 HSPLandroid/content/pm/BaseParceledListSlice;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/content/pm/ChangedPackages;-><clinit>()V
 HPLandroid/content/pm/ChangedPackages;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/content/pm/ComponentInfo;-><init>()V
 HSPLandroid/content/pm/ComponentInfo;-><init>(Landroid/content/pm/ComponentInfo;)V
@@ -6391,7 +5838,7 @@
 HSPLandroid/content/pm/ConfigurationInfo;-><init>(Landroid/os/Parcel;)V
 HSPLandroid/content/pm/ConfigurationInfo;-><init>(Landroid/os/Parcel;Landroid/content/pm/ConfigurationInfo$1;)V
 HSPLandroid/content/pm/ConfigurationInfo;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/content/pm/DataLoaderManager;-><init>(Landroid/content/pm/IDataLoaderManager;)V
+HSPLandroid/content/pm/CrossProfileApps;-><init>(Landroid/content/Context;Landroid/content/pm/ICrossProfileApps;)V
 HSPLandroid/content/pm/FallbackCategoryProvider;->getFallbackCategory(Ljava/lang/String;)I
 HSPLandroid/content/pm/FallbackCategoryProvider;->loadFallbacks()V
 HSPLandroid/content/pm/FeatureInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/FeatureInfo;
@@ -6401,14 +5848,15 @@
 HSPLandroid/content/pm/FeatureInfo;-><init>(Landroid/os/Parcel;Landroid/content/pm/FeatureInfo$1;)V
 HSPLandroid/content/pm/FeatureInfo;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/content/pm/ICrossProfileApps$Stub;-><init>()V
+HSPLandroid/content/pm/ICrossProfileApps$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/pm/ICrossProfileApps;
 HPLandroid/content/pm/ICrossProfileApps$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/content/pm/IDataLoaderManager$Stub;-><init>()V
-HSPLandroid/content/pm/IDataLoaderManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/pm/IDataLoaderManager;
-HPLandroid/content/pm/IDataLoaderManager$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/content/pm/ILauncherApps$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HSPLandroid/content/pm/ILauncherApps$Stub$Proxy;->getShortcuts(Ljava/lang/String;JLjava/lang/String;Ljava/util/List;Landroid/content/ComponentName;ILandroid/os/UserHandle;)Landroid/content/pm/ParceledListSlice;
+HSPLandroid/content/pm/ILauncherApps$Stub$Proxy;->getShortcuts(Ljava/lang/String;JLjava/lang/String;Ljava/util/List;Ljava/util/List;Landroid/content/ComponentName;ILandroid/os/UserHandle;)Landroid/content/pm/ParceledListSlice;
 HSPLandroid/content/pm/ILauncherApps$Stub;-><init>()V
 HSPLandroid/content/pm/ILauncherApps$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/pm/ILauncherApps;
+PLandroid/content/pm/ILauncherApps$Stub;->getDefaultTransactionName(I)Ljava/lang/String;
 HPLandroid/content/pm/ILauncherApps$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 PLandroid/content/pm/IOnAppsChangedListener$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 PLandroid/content/pm/IOnAppsChangedListener$Stub$Proxy;->asBinder()Landroid/os/IBinder;
@@ -6417,16 +5865,10 @@
 HSPLandroid/content/pm/IOnAppsChangedListener$Stub;-><init>()V
 PLandroid/content/pm/IOnAppsChangedListener$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/pm/IOnAppsChangedListener;
 HSPLandroid/content/pm/IOtaDexopt$Stub;-><init>()V
-HPLandroid/content/pm/IOtaDexopt$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HPLandroid/content/pm/IPackageDataObserver$Stub$Proxy;->onRemoveCompleted(Ljava/lang/String;Z)V
 HPLandroid/content/pm/IPackageDataObserver$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/pm/IPackageDataObserver;
-HSPLandroid/content/pm/IPackageInstaller$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/content/pm/IPackageInstaller$Stub$Proxy;->getAllSessions(I)Landroid/content/pm/ParceledListSlice;
-HSPLandroid/content/pm/IPackageInstaller$Stub$Proxy;->getSessionInfo(I)Landroid/content/pm/PackageInstaller$SessionInfo;
-HSPLandroid/content/pm/IPackageInstaller$Stub$Proxy;->registerCallback(Landroid/content/pm/IPackageInstallerCallback;I)V
 HSPLandroid/content/pm/IPackageInstaller$Stub;-><init>()V
 HPLandroid/content/pm/IPackageInstaller$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/content/pm/IPackageInstaller$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/pm/IPackageInstaller;
 HPLandroid/content/pm/IPackageInstaller$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 PLandroid/content/pm/IPackageInstallerCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 PLandroid/content/pm/IPackageInstallerCallback$Stub$Proxy;->asBinder()Landroid/os/IBinder;
@@ -6437,11 +5879,10 @@
 HSPLandroid/content/pm/IPackageInstallerCallback$Stub;-><init>()V
 HSPLandroid/content/pm/IPackageInstallerCallback$Stub;->asBinder()Landroid/os/IBinder;
 PLandroid/content/pm/IPackageInstallerCallback$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/pm/IPackageInstallerCallback;
-HSPLandroid/content/pm/IPackageInstallerCallback$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
+HSPLandroid/content/pm/IPackageInstallerSession$Stub;-><init>()V
 PLandroid/content/pm/IPackageInstallerSession$Stub;->asBinder()Landroid/os/IBinder;
+HPLandroid/content/pm/IPackageInstallerSession$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/content/pm/IPackageManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->checkSignatures(Ljava/lang/String;Ljava/lang/String;)I
-HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->checkUidSignatures(II)I
 HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->getActivityInfo(Landroid/content/ComponentName;II)Landroid/content/pm/ActivityInfo;
 HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->getApplicationEnabledSetting(Ljava/lang/String;I)I
 HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->getApplicationInfo(Ljava/lang/String;II)Landroid/content/pm/ApplicationInfo;
@@ -6460,8 +5901,6 @@
 HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->getServiceInfo(Landroid/content/ComponentName;II)Landroid/content/pm/ServiceInfo;
 HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->getServicesSystemSharedLibraryPackageName()Ljava/lang/String;
 HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->getSharedSystemSharedLibraryPackageName()Ljava/lang/String;
-HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->getSystemAvailableFeatures()Landroid/content/pm/ParceledListSlice;
-HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->getSystemSharedLibraryNames()[Ljava/lang/String;
 HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->hasSystemFeature(Ljava/lang/String;I)Z
 HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->isInstantApp(Ljava/lang/String;I)Z
 HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->isOnlyCoreApps()Z
@@ -6470,6 +5909,7 @@
 HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->notifyDexLoad(Ljava/lang/String;Ljava/util/Map;Ljava/lang/String;)V
 HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->notifyPackageUse(Ljava/lang/String;I)V
 HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->notifyPackagesReplacedReceived([Ljava/lang/String;)V
+HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->queryContentProviders(Ljava/lang/String;IILjava/lang/String;)Landroid/content/pm/ParceledListSlice;
 HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->queryIntentActivities(Landroid/content/Intent;Ljava/lang/String;II)Landroid/content/pm/ParceledListSlice;
 HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->queryIntentReceivers(Landroid/content/Intent;Ljava/lang/String;II)Landroid/content/pm/ParceledListSlice;
 HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->queryIntentServices(Landroid/content/Intent;Ljava/lang/String;II)Landroid/content/pm/ParceledListSlice;
@@ -6486,32 +5926,28 @@
 HSPLandroid/content/pm/IPackageManagerNative$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 PLandroid/content/pm/IPackageMoveObserver$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 PLandroid/content/pm/IPackageMoveObserver$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/content/pm/IPackageMoveObserver$Stub;-><init>()V
 HSPLandroid/content/pm/IPackageMoveObserver$Stub;->asBinder()Landroid/os/IBinder;
 PLandroid/content/pm/IPackageMoveObserver$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/pm/IPackageMoveObserver;
 HSPLandroid/content/pm/IShortcutService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/content/pm/IShortcutService$Stub$Proxy;->addDynamicShortcuts(Ljava/lang/String;Landroid/content/pm/ParceledListSlice;I)Z
-HSPLandroid/content/pm/IShortcutService$Stub$Proxy;->getMaxShortcutCountPerActivity(Ljava/lang/String;I)I
-HSPLandroid/content/pm/IShortcutService$Stub$Proxy;->getPinnedShortcuts(Ljava/lang/String;I)Landroid/content/pm/ParceledListSlice;
-HSPLandroid/content/pm/IShortcutService$Stub$Proxy;->getShortcuts(Ljava/lang/String;II)Landroid/content/pm/ParceledListSlice;
-HSPLandroid/content/pm/IShortcutService$Stub$Proxy;->reportShortcutUsed(Ljava/lang/String;Ljava/lang/String;I)V
-HSPLandroid/content/pm/IShortcutService$Stub$Proxy;->setDynamicShortcuts(Ljava/lang/String;Landroid/content/pm/ParceledListSlice;I)Z
-HSPLandroid/content/pm/IShortcutService$Stub$Proxy;->updateShortcuts(Ljava/lang/String;Landroid/content/pm/ParceledListSlice;I)Z
 HSPLandroid/content/pm/IShortcutService$Stub;-><init>()V
 HSPLandroid/content/pm/IShortcutService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/pm/IShortcutService;
 HPLandroid/content/pm/IShortcutService$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HPLandroid/content/pm/InstantAppRequest;-><init>(Landroid/content/pm/AuxiliaryResolveInfo;Landroid/content/Intent;Ljava/lang/String;Ljava/lang/String;ZILandroid/os/Bundle;Z[ILjava/lang/String;)V
+PLandroid/content/pm/InstantAppIntentFilter$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/InstantAppIntentFilter;
+PLandroid/content/pm/InstantAppIntentFilter$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/content/pm/InstantAppRequestInfo$1;-><init>()V
-HSPLandroid/content/pm/InstantAppRequestInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/InstantAppRequestInfo;
-HSPLandroid/content/pm/InstantAppRequestInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/content/pm/InstantAppRequestInfo;-><clinit>()V
 HPLandroid/content/pm/InstantAppRequestInfo;-><init>(Landroid/content/Intent;[ILandroid/os/UserHandle;ZLjava/lang/String;)V
-HSPLandroid/content/pm/InstantAppRequestInfo;-><init>(Landroid/os/Parcel;)V
 HPLandroid/content/pm/InstantAppRequestInfo;->writeToParcel(Landroid/os/Parcel;I)V
-HPLandroid/content/pm/InstantAppResolveInfo$InstantAppDigest;-><init>(Ljava/lang/String;I)V
-HPLandroid/content/pm/InstantAppResolveInfo$InstantAppDigest;->generateDigest(Ljava/lang/String;I)[[B
+PLandroid/content/pm/InstantAppResolveInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/InstantAppResolveInfo;
+PLandroid/content/pm/InstantAppResolveInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
+HPLandroid/content/pm/InstantAppResolveInfo$InstantAppDigest$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/InstantAppResolveInfo$InstantAppDigest;
+PLandroid/content/pm/InstantAppResolveInfo$InstantAppDigest$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
+HPLandroid/content/pm/InstantAppResolveInfo$InstantAppDigest;-><init>(Landroid/os/Parcel;)V
+HSPLandroid/content/pm/InstantAppResolveInfo$InstantAppDigest;-><init>(Ljava/lang/String;I)V
+HSPLandroid/content/pm/InstantAppResolveInfo$InstantAppDigest;->generateDigest(Ljava/lang/String;I)[[B
 PLandroid/content/pm/InstantAppResolveInfo$InstantAppDigest;->getDigestPrefix()[I
 HPLandroid/content/pm/InstantAppResolveInfo$InstantAppDigest;->getDigestPrefixSecure()[I
+HPLandroid/content/pm/InstantAppResolveInfo;-><init>(Landroid/os/Parcel;)V
 PLandroid/content/pm/InstantAppResolveInfo;->getPackageName()Ljava/lang/String;
 HSPLandroid/content/pm/IntentFilterVerificationInfo;-><init>(Lorg/xmlpull/v1/XmlPullParser;)V
 HSPLandroid/content/pm/IntentFilterVerificationInfo;->getIntFromXml(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;I)I
@@ -6545,22 +5981,21 @@
 HSPLandroid/content/pm/PackageInfo;->composeLongVersionCode(II)J
 HSPLandroid/content/pm/PackageInfo;->getLongVersionCode()J
 PLandroid/content/pm/PackageInfo;->isOverlayPackage()Z
-HSPLandroid/content/pm/PackageInfo;->isStaticOverlayPackage()Z
 HSPLandroid/content/pm/PackageInfo;->propagateApplicationInfo(Landroid/content/pm/ApplicationInfo;[Landroid/content/pm/ComponentInfo;)V
 HSPLandroid/content/pm/PackageInfo;->writeToParcel(Landroid/os/Parcel;I)V
-PLandroid/content/pm/PackageInfoLite;->getLongVersionCode()J
+HPLandroid/content/pm/PackageInfoLite;->getLongVersionCode()J
 HSPLandroid/content/pm/PackageInstaller$SessionCallback;-><init>()V
 HSPLandroid/content/pm/PackageInstaller$SessionCallbackDelegate;-><init>(Landroid/content/pm/PackageInstaller$SessionCallback;Ljava/util/concurrent/Executor;)V
 HSPLandroid/content/pm/PackageInstaller$SessionCallbackDelegate;->onSessionActiveChanged(IZ)V
-PLandroid/content/pm/PackageInstaller$SessionCallbackDelegate;->onSessionCreated(I)V
+HSPLandroid/content/pm/PackageInstaller$SessionCallbackDelegate;->onSessionCreated(I)V
 HSPLandroid/content/pm/PackageInstaller$SessionCallbackDelegate;->onSessionFinished(IZ)V
 HSPLandroid/content/pm/PackageInstaller$SessionCallbackDelegate;->onSessionProgressChanged(IF)V
 HSPLandroid/content/pm/PackageInstaller$SessionInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/PackageInstaller$SessionInfo;
 HSPLandroid/content/pm/PackageInstaller$SessionInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/content/pm/PackageInstaller$SessionInfo;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/content/pm/PackageInstaller$SessionInfo;->getAppPackageName()Ljava/lang/String;
 HSPLandroid/content/pm/PackageInstaller$SessionInfo;->getInstallerPackageName()Ljava/lang/String;
 HSPLandroid/content/pm/PackageInstaller$SessionInfo;->getSessionId()I
+HSPLandroid/content/pm/PackageInstaller$SessionInfo;->getUser()Landroid/os/UserHandle;
 HPLandroid/content/pm/PackageInstaller$SessionInfo;->writeToParcel(Landroid/os/Parcel;I)V
 PLandroid/content/pm/PackageInstaller$SessionParams$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/PackageInstaller$SessionParams;
 PLandroid/content/pm/PackageInstaller$SessionParams$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
@@ -6570,7 +6005,6 @@
 HSPLandroid/content/pm/PackageInstaller;-><init>(Landroid/content/pm/IPackageInstaller;Ljava/lang/String;I)V
 HSPLandroid/content/pm/PackageInstaller;->getAllSessions()Ljava/util/List;
 HSPLandroid/content/pm/PackageInstaller;->getSessionInfo(I)Landroid/content/pm/PackageInstaller$SessionInfo;
-HSPLandroid/content/pm/PackageInstaller;->registerSessionCallback(Landroid/content/pm/PackageInstaller$SessionCallback;)V
 HSPLandroid/content/pm/PackageInstaller;->registerSessionCallback(Landroid/content/pm/PackageInstaller$SessionCallback;Landroid/os/Handler;)V
 HSPLandroid/content/pm/PackageItemInfo;-><init>()V
 HSPLandroid/content/pm/PackageItemInfo;-><init>(Landroid/content/pm/PackageItemInfo;)V
@@ -6603,6 +6037,7 @@
 HSPLandroid/content/pm/PackageManager;->access$000(Ljava/lang/String;II)Landroid/content/pm/ApplicationInfo;
 HSPLandroid/content/pm/PackageManager;->access$100(Ljava/lang/String;II)Landroid/content/pm/PackageInfo;
 HSPLandroid/content/pm/PackageManager;->getApplicationInfoAsUser(Ljava/lang/String;ILandroid/os/UserHandle;)Landroid/content/pm/ApplicationInfo;
+HSPLandroid/content/pm/PackageManager;->getApplicationInfoAsUserCached(Ljava/lang/String;II)Landroid/content/pm/ApplicationInfo;
 HSPLandroid/content/pm/PackageManager;->getApplicationInfoAsUserUncached(Ljava/lang/String;II)Landroid/content/pm/ApplicationInfo;
 HSPLandroid/content/pm/PackageManager;->getPackageArchiveInfo(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;
 HSPLandroid/content/pm/PackageManager;->getPackageInfoAsUserCached(Ljava/lang/String;II)Landroid/content/pm/PackageInfo;
@@ -6625,6 +6060,7 @@
 HSPLandroid/content/pm/PackageParser$Activity;->setPackageName(Ljava/lang/String;)V
 HSPLandroid/content/pm/PackageParser$ActivityIntentInfo;-><init>(Landroid/content/pm/PackageParser$Activity;)V
 HSPLandroid/content/pm/PackageParser$ApkLite;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;ZIIIILjava/util/List;Landroid/content/pm/PackageParser$SigningDetails;ZZZZZZZII)V
+HSPLandroid/content/pm/PackageParser$ApkLite;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;ZIIIILjava/util/List;Landroid/content/pm/PackageParser$SigningDetails;ZZZZZZZLjava/lang/String;ZIII)V
 HSPLandroid/content/pm/PackageParser$ApkLite;->getLongVersionCode()J
 HSPLandroid/content/pm/PackageParser$CachedComponentArgs;-><init>()V
 HSPLandroid/content/pm/PackageParser$CachedComponentArgs;-><init>(Landroid/content/pm/PackageParser$1;)V
@@ -6657,7 +6093,6 @@
 HSPLandroid/content/pm/PackageParser$SigningDetails$Builder;->setSignatureSchemeVersion(I)Landroid/content/pm/PackageParser$SigningDetails$Builder;
 HSPLandroid/content/pm/PackageParser$SigningDetails$Builder;->setSignatures([Landroid/content/pm/Signature;)Landroid/content/pm/PackageParser$SigningDetails$Builder;
 HSPLandroid/content/pm/PackageParser$SigningDetails;-><init>(Landroid/content/pm/PackageParser$SigningDetails;)V
-HSPLandroid/content/pm/PackageParser$SigningDetails;-><init>(Landroid/os/Parcel;)V
 HSPLandroid/content/pm/PackageParser$SigningDetails;-><init>([Landroid/content/pm/Signature;I)V
 HSPLandroid/content/pm/PackageParser$SigningDetails;-><init>([Landroid/content/pm/Signature;ILandroid/util/ArraySet;[Landroid/content/pm/Signature;)V
 HSPLandroid/content/pm/PackageParser$SigningDetails;-><init>([Landroid/content/pm/Signature;I[Landroid/content/pm/Signature;)V
@@ -6680,7 +6115,7 @@
 HSPLandroid/content/pm/PackageParser;->buildCompoundName(Ljava/lang/String;Ljava/lang/CharSequence;Ljava/lang/String;[Ljava/lang/String;)Ljava/lang/String;
 HSPLandroid/content/pm/PackageParser;->buildProcessName(Ljava/lang/String;Ljava/lang/String;Ljava/lang/CharSequence;I[Ljava/lang/String;[Ljava/lang/String;)Ljava/lang/String;
 HSPLandroid/content/pm/PackageParser;->buildTaskAffinityName(Ljava/lang/String;Ljava/lang/String;Ljava/lang/CharSequence;[Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/content/pm/PackageParser;->cacheResult(Ljava/io/File;ILandroid/content/pm/parsing/ParsedPackage;)V
+HSPLandroid/content/pm/PackageParser;->checkRequiredSystemProperty(Ljava/lang/String;Ljava/lang/String;)Z
 HSPLandroid/content/pm/PackageParser;->checkUseInstalledOrHidden(ILandroid/content/pm/PackageUserState;Landroid/content/pm/ApplicationInfo;)Z
 HSPLandroid/content/pm/PackageParser;->collectCertificates(Landroid/content/pm/PackageParser$Package;Ljava/io/File;Z)V
 HSPLandroid/content/pm/PackageParser;->collectCertificates(Landroid/content/pm/PackageParser$Package;Z)V
@@ -6688,16 +6123,13 @@
 HSPLandroid/content/pm/PackageParser;->computeMinSdkVersion(ILjava/lang/String;I[Ljava/lang/String;[Ljava/lang/String;)I
 HSPLandroid/content/pm/PackageParser;->computeTargetSdkVersion(ILjava/lang/String;[Ljava/lang/String;[Ljava/lang/String;)I
 HSPLandroid/content/pm/PackageParser;->copyNeeded(ILandroid/content/pm/PackageParser$Package;Landroid/content/pm/PackageUserState;Landroid/os/Bundle;I)Z
-HSPLandroid/content/pm/PackageParser;->fromCacheEntry([B)Landroid/content/pm/parsing/ParsedPackage;
-HSPLandroid/content/pm/PackageParser;->fromCacheEntryStatic([B)Landroid/content/pm/parsing/ParsedPackage;
 HSPLandroid/content/pm/PackageParser;->generateAppDetailsHiddenActivity(Landroid/content/pm/PackageParser$Package;I[Ljava/lang/String;Z)Landroid/content/pm/PackageParser$Activity;
 HSPLandroid/content/pm/PackageParser;->generateApplicationInfo(Landroid/content/pm/PackageParser$Package;ILandroid/content/pm/PackageUserState;I)Landroid/content/pm/ApplicationInfo;
 HSPLandroid/content/pm/PackageParser;->generatePackageInfo(Landroid/content/pm/PackageParser$Package;Landroid/apex/ApexInfo;I)Landroid/content/pm/PackageInfo;
 HSPLandroid/content/pm/PackageParser;->generatePackageInfo(Landroid/content/pm/PackageParser$Package;Landroid/apex/ApexInfo;[IIJJLjava/util/Set;Landroid/content/pm/PackageUserState;I)Landroid/content/pm/PackageInfo;
 HSPLandroid/content/pm/PackageParser;->generatePackageInfo(Landroid/content/pm/PackageParser$Package;[IIJJLjava/util/Set;Landroid/content/pm/PackageUserState;)Landroid/content/pm/PackageInfo;
+HSPLandroid/content/pm/PackageParser;->generatePackageInfo(Landroid/content/pm/PackageParser$Package;[IIJJLjava/util/Set;Landroid/content/pm/PackageUserState;I)Landroid/content/pm/PackageInfo;
 HSPLandroid/content/pm/PackageParser;->getActivityConfigChanges(II)I
-HSPLandroid/content/pm/PackageParser;->getCacheKey(Ljava/io/File;I)Ljava/lang/String;
-HSPLandroid/content/pm/PackageParser;->getCachedResult(Ljava/io/File;I)Landroid/content/pm/parsing/ParsedPackage;
 HSPLandroid/content/pm/PackageParser;->hasDomainURLs(Landroid/content/pm/PackageParser$Package;)Z
 HSPLandroid/content/pm/PackageParser;->isApkFile(Ljava/io/File;)Z
 HSPLandroid/content/pm/PackageParser;->isApkPath(Ljava/lang/String;)Z
@@ -6711,6 +6143,7 @@
 HSPLandroid/content/pm/PackageParser;->parseBaseApk(Ljava/io/File;Landroid/content/res/AssetManager;I)Landroid/content/pm/PackageParser$Package;
 HSPLandroid/content/pm/PackageParser;->parseBaseApkCommon(Landroid/content/pm/PackageParser$Package;Ljava/util/Set;Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;I[Ljava/lang/String;)Landroid/content/pm/PackageParser$Package;
 HSPLandroid/content/pm/PackageParser;->parseBaseApplication(Landroid/content/pm/PackageParser$Package;Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;I[Ljava/lang/String;)Z
+HSPLandroid/content/pm/PackageParser;->parseClusterPackageLite(Ljava/io/File;I)Landroid/content/pm/PackageParser$PackageLite;
 HSPLandroid/content/pm/PackageParser;->parseIntent(Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;ZZLandroid/content/pm/PackageParser$IntentInfo;[Ljava/lang/String;)Z
 HSPLandroid/content/pm/PackageParser;->parseMetaData(Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;Landroid/os/Bundle;[Ljava/lang/String;)Landroid/os/Bundle;
 HSPLandroid/content/pm/PackageParser;->parseMonolithicPackage(Ljava/io/File;I)Landroid/content/pm/PackageParser$Package;
@@ -6719,19 +6152,12 @@
 HSPLandroid/content/pm/PackageParser;->parsePackageItemInfo(Landroid/content/pm/PackageParser$Package;Landroid/content/pm/PackageItemInfo;[Ljava/lang/String;Ljava/lang/String;Landroid/content/res/TypedArray;ZIIIIII)Z
 HSPLandroid/content/pm/PackageParser;->parsePackageLite(Ljava/io/File;I)Landroid/content/pm/PackageParser$PackageLite;
 HSPLandroid/content/pm/PackageParser;->parsePackageSplitNames(Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;)Landroid/util/Pair;
-HSPLandroid/content/pm/PackageParser;->parseParsedPackage(Ljava/io/File;IZ)Landroid/content/pm/parsing/ParsedPackage;
 HSPLandroid/content/pm/PackageParser;->parsePublicKey(Ljava/lang/String;)Ljava/security/PublicKey;
 HSPLandroid/content/pm/PackageParser;->readConfigUseRoundIcon(Landroid/content/res/Resources;)V
-HSPLandroid/content/pm/PackageParser;->setCacheDir(Ljava/io/File;)V
 HSPLandroid/content/pm/PackageParser;->setCallback(Landroid/content/pm/PackageParser$Callback;)V
 HSPLandroid/content/pm/PackageParser;->setCompatibilityModeEnabled(Z)V
-HSPLandroid/content/pm/PackageParser;->setDisplayMetrics(Landroid/util/DisplayMetrics;)V
 HSPLandroid/content/pm/PackageParser;->setMaxAspectRatio(Landroid/content/pm/PackageParser$Package;)V
 HSPLandroid/content/pm/PackageParser;->setMinAspectRatio(Landroid/content/pm/PackageParser$Package;)V
-HSPLandroid/content/pm/PackageParser;->setOnlyCoreApps(Z)V
-HSPLandroid/content/pm/PackageParser;->setSeparateProcesses([Ljava/lang/String;)V
-HSPLandroid/content/pm/PackageParser;->toCacheEntry(Landroid/content/pm/parsing/ParsedPackage;)[B
-HSPLandroid/content/pm/PackageParser;->toCacheEntryStatic(Landroid/content/pm/parsing/ParsedPackage;)[B
 HSPLandroid/content/pm/PackageParser;->toSigningKeys([Landroid/content/pm/Signature;)Landroid/util/ArraySet;
 HSPLandroid/content/pm/PackageParser;->updateApplicationInfo(Landroid/content/pm/ApplicationInfo;ILandroid/content/pm/PackageUserState;)V
 HSPLandroid/content/pm/PackageParser;->validateName(Ljava/lang/String;ZZ)Ljava/lang/String;
@@ -6748,10 +6174,10 @@
 HSPLandroid/content/pm/PackageUserState;->isAvailable(I)Z
 HSPLandroid/content/pm/PackageUserState;->isEnabled(ZZLjava/lang/String;I)Z
 HSPLandroid/content/pm/PackageUserState;->isMatch(Landroid/content/pm/ComponentInfo;I)Z
-HSPLandroid/content/pm/PackageUserState;->isMatch(ZZLandroid/content/pm/parsing/ComponentParseUtils$ParsedComponent;I)Z
 HSPLandroid/content/pm/PackageUserState;->isMatch(ZZZZLjava/lang/String;I)Z
 HSPLandroid/content/pm/PackageUserState;->reportIfDebug(ZI)Z
 HSPLandroid/content/pm/PackageUserState;->setOverlayPaths([Ljava/lang/String;)V
+HSPLandroid/content/pm/PackageUserState;->setSharedLibraryOverlayPaths(Ljava/lang/String;[Ljava/lang/String;)V
 HSPLandroid/content/pm/ParceledListSlice$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/ParceledListSlice;
 HSPLandroid/content/pm/ParceledListSlice$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/content/pm/ParceledListSlice;-><init>(Landroid/os/Parcel;Ljava/lang/ClassLoader;)V
@@ -6858,7 +6284,7 @@
 HSPLandroid/content/pm/ServiceInfo;-><init>(Landroid/os/Parcel;)V
 HSPLandroid/content/pm/ServiceInfo;-><init>(Landroid/os/Parcel;Landroid/content/pm/ServiceInfo$1;)V
 HPLandroid/content/pm/ServiceInfo;->getForegroundServiceType()I
-PLandroid/content/pm/ServiceInfo;->toString()Ljava/lang/String;
+HPLandroid/content/pm/ServiceInfo;->toString()Ljava/lang/String;
 HSPLandroid/content/pm/ServiceInfo;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/content/pm/SharedLibraryInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/SharedLibraryInfo;
 HSPLandroid/content/pm/SharedLibraryInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
@@ -6867,8 +6293,6 @@
 HSPLandroid/content/pm/SharedLibraryInfo;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/lang/String;JILandroid/content/pm/VersionedPackage;Ljava/util/List;Ljava/util/List;)V
 HSPLandroid/content/pm/SharedLibraryInfo;->addDependency(Landroid/content/pm/SharedLibraryInfo;)V
 HSPLandroid/content/pm/SharedLibraryInfo;->clearDependencies()V
-HSPLandroid/content/pm/SharedLibraryInfo;->createForDynamic(Landroid/content/pm/parsing/AndroidPackage;Ljava/lang/String;)Landroid/content/pm/SharedLibraryInfo;
-HSPLandroid/content/pm/SharedLibraryInfo;->createForStatic(Landroid/content/pm/parsing/AndroidPackage;)Landroid/content/pm/SharedLibraryInfo;
 HSPLandroid/content/pm/SharedLibraryInfo;->getAllCodePaths()Ljava/util/List;
 HSPLandroid/content/pm/SharedLibraryInfo;->getDeclaringPackage()Landroid/content/pm/VersionedPackage;
 HSPLandroid/content/pm/SharedLibraryInfo;->getDependencies()Ljava/util/List;
@@ -6882,37 +6306,15 @@
 HSPLandroid/content/pm/ShortcutInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/ShortcutInfo;
 HSPLandroid/content/pm/ShortcutInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/content/pm/ShortcutInfo$Builder;-><init>(Landroid/content/Context;Ljava/lang/String;)V
-HSPLandroid/content/pm/ShortcutInfo$Builder;->access$000(Landroid/content/pm/ShortcutInfo$Builder;)Landroid/content/Context;
-HSPLandroid/content/pm/ShortcutInfo$Builder;->access$100(Landroid/content/pm/ShortcutInfo$Builder;)Ljava/lang/String;
-HSPLandroid/content/pm/ShortcutInfo$Builder;->access$1000(Landroid/content/pm/ShortcutInfo$Builder;)Ljava/util/Set;
-HSPLandroid/content/pm/ShortcutInfo$Builder;->access$1100(Landroid/content/pm/ShortcutInfo$Builder;)[Landroid/content/Intent;
-HSPLandroid/content/pm/ShortcutInfo$Builder;->access$1200(Landroid/content/pm/ShortcutInfo$Builder;)[Landroid/app/Person;
-HSPLandroid/content/pm/ShortcutInfo$Builder;->access$1300(Landroid/content/pm/ShortcutInfo$Builder;)Z
-HSPLandroid/content/pm/ShortcutInfo$Builder;->access$1400(Landroid/content/pm/ShortcutInfo$Builder;)I
-HSPLandroid/content/pm/ShortcutInfo$Builder;->access$1500(Landroid/content/pm/ShortcutInfo$Builder;)Landroid/os/PersistableBundle;
-HSPLandroid/content/pm/ShortcutInfo$Builder;->access$1600(Landroid/content/pm/ShortcutInfo$Builder;)Landroid/content/LocusId;
-HSPLandroid/content/pm/ShortcutInfo$Builder;->access$200(Landroid/content/pm/ShortcutInfo$Builder;)Landroid/content/ComponentName;
-HSPLandroid/content/pm/ShortcutInfo$Builder;->access$300(Landroid/content/pm/ShortcutInfo$Builder;)Landroid/graphics/drawable/Icon;
-HSPLandroid/content/pm/ShortcutInfo$Builder;->access$400(Landroid/content/pm/ShortcutInfo$Builder;)Ljava/lang/CharSequence;
-HSPLandroid/content/pm/ShortcutInfo$Builder;->access$500(Landroid/content/pm/ShortcutInfo$Builder;)I
-HSPLandroid/content/pm/ShortcutInfo$Builder;->access$600(Landroid/content/pm/ShortcutInfo$Builder;)Ljava/lang/CharSequence;
-HSPLandroid/content/pm/ShortcutInfo$Builder;->access$700(Landroid/content/pm/ShortcutInfo$Builder;)I
-HSPLandroid/content/pm/ShortcutInfo$Builder;->access$800(Landroid/content/pm/ShortcutInfo$Builder;)Ljava/lang/CharSequence;
-HSPLandroid/content/pm/ShortcutInfo$Builder;->access$900(Landroid/content/pm/ShortcutInfo$Builder;)I
 HSPLandroid/content/pm/ShortcutInfo$Builder;->build()Landroid/content/pm/ShortcutInfo;
 HSPLandroid/content/pm/ShortcutInfo$Builder;->setIcon(Landroid/graphics/drawable/Icon;)Landroid/content/pm/ShortcutInfo$Builder;
-HSPLandroid/content/pm/ShortcutInfo$Builder;->setIntent(Landroid/content/Intent;)Landroid/content/pm/ShortcutInfo$Builder;
 HSPLandroid/content/pm/ShortcutInfo$Builder;->setIntents([Landroid/content/Intent;)Landroid/content/pm/ShortcutInfo$Builder;
-HSPLandroid/content/pm/ShortcutInfo$Builder;->setLongLabel(Ljava/lang/CharSequence;)Landroid/content/pm/ShortcutInfo$Builder;
-HSPLandroid/content/pm/ShortcutInfo$Builder;->setRank(I)Landroid/content/pm/ShortcutInfo$Builder;
 HSPLandroid/content/pm/ShortcutInfo$Builder;->setShortLabel(Ljava/lang/CharSequence;)Landroid/content/pm/ShortcutInfo$Builder;
 HPLandroid/content/pm/ShortcutInfo;-><init>(ILjava/lang/String;Ljava/lang/String;Landroid/content/ComponentName;Landroid/graphics/drawable/Icon;Ljava/lang/CharSequence;ILjava/lang/String;Ljava/lang/CharSequence;ILjava/lang/String;Ljava/lang/CharSequence;ILjava/lang/String;Ljava/util/Set;[Landroid/content/Intent;ILandroid/os/PersistableBundle;JIILjava/lang/String;Ljava/lang/String;I[Landroid/app/Person;Landroid/content/LocusId;)V
 HSPLandroid/content/pm/ShortcutInfo;-><init>(Landroid/content/pm/ShortcutInfo$Builder;)V
-HSPLandroid/content/pm/ShortcutInfo;-><init>(Landroid/content/pm/ShortcutInfo$Builder;Landroid/content/pm/ShortcutInfo$1;)V
 HPLandroid/content/pm/ShortcutInfo;-><init>(Landroid/content/pm/ShortcutInfo;I)V
 HSPLandroid/content/pm/ShortcutInfo;-><init>(Landroid/os/Parcel;)V
 HSPLandroid/content/pm/ShortcutInfo;-><init>(Landroid/os/Parcel;Landroid/content/pm/ShortcutInfo$1;)V
-HSPLandroid/content/pm/ShortcutInfo;->access$1700([Landroid/content/Intent;)[Landroid/content/Intent;
 HPLandroid/content/pm/ShortcutInfo;->addFlags(I)V
 HPLandroid/content/pm/ShortcutInfo;->clearFlags(I)V
 HPLandroid/content/pm/ShortcutInfo;->clone(I)Landroid/content/pm/ShortcutInfo;
@@ -6920,9 +6322,9 @@
 HSPLandroid/content/pm/ShortcutInfo;->cloneIntents([Landroid/content/Intent;)[Landroid/content/Intent;
 HSPLandroid/content/pm/ShortcutInfo;->clonePersons([Landroid/app/Person;)[Landroid/app/Person;
 HPLandroid/content/pm/ShortcutInfo;->enforceMandatoryFields(Z)V
+HPLandroid/content/pm/ShortcutInfo;->ensureUpdatableWith(Landroid/content/pm/ShortcutInfo;Z)V
 HSPLandroid/content/pm/ShortcutInfo;->fixUpIntentExtras()V
 HSPLandroid/content/pm/ShortcutInfo;->getActivity()Landroid/content/ComponentName;
-HPLandroid/content/pm/ShortcutInfo;->getBitmapPath()Ljava/lang/String;
 HSPLandroid/content/pm/ShortcutInfo;->getCategories()Ljava/util/Set;
 HSPLandroid/content/pm/ShortcutInfo;->getDisabledMessage()Ljava/lang/CharSequence;
 HSPLandroid/content/pm/ShortcutInfo;->getDisabledReason()I
@@ -6941,7 +6343,6 @@
 HSPLandroid/content/pm/ShortcutInfo;->getShortLabel()Ljava/lang/CharSequence;
 HSPLandroid/content/pm/ShortcutInfo;->getUserHandle()Landroid/os/UserHandle;
 HSPLandroid/content/pm/ShortcutInfo;->getUserId()I
-PLandroid/content/pm/ShortcutInfo;->hasAnyResources()Z
 HSPLandroid/content/pm/ShortcutInfo;->hasFlags(I)Z
 HSPLandroid/content/pm/ShortcutInfo;->hasIconFile()Z
 HSPLandroid/content/pm/ShortcutInfo;->hasIconResource()Z
@@ -6952,10 +6353,8 @@
 HSPLandroid/content/pm/ShortcutInfo;->isDynamic()Z
 HSPLandroid/content/pm/ShortcutInfo;->isEnabled()Z
 HPLandroid/content/pm/ShortcutInfo;->isFloating()Z
-PLandroid/content/pm/ShortcutInfo;->isIconPendingSave()Z
 HSPLandroid/content/pm/ShortcutInfo;->isImmutable()Z
 HPLandroid/content/pm/ShortcutInfo;->isManifestShortcut()Z
-HPLandroid/content/pm/ShortcutInfo;->isOriginallyFromManifest()Z
 HPLandroid/content/pm/ShortcutInfo;->isPinned()Z
 PLandroid/content/pm/ShortcutInfo;->isVisibleToPublisher()Z
 HPLandroid/content/pm/ShortcutInfo;->lookUpResourceId(Landroid/content/res/Resources;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I
@@ -6970,18 +6369,10 @@
 HPLandroid/content/pm/ShortcutInfo;->setIntents([Landroid/content/Intent;)V
 HPLandroid/content/pm/ShortcutInfo;->setReturnedByServer()V
 PLandroid/content/pm/ShortcutInfo;->setTimestamp(J)V
-HSPLandroid/content/pm/ShortcutInfo;->updateTimestamp()V
 HSPLandroid/content/pm/ShortcutInfo;->validateIcon(Landroid/graphics/drawable/Icon;)Landroid/graphics/drawable/Icon;
 HSPLandroid/content/pm/ShortcutInfo;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/content/pm/ShortcutManager;-><init>(Landroid/content/Context;Landroid/content/pm/IShortcutService;)V
-HSPLandroid/content/pm/ShortcutManager;->addDynamicShortcuts(Ljava/util/List;)Z
-HSPLandroid/content/pm/ShortcutManager;->getDynamicShortcuts()Ljava/util/List;
-HSPLandroid/content/pm/ShortcutManager;->getMaxShortcutCountPerActivity()I
-HSPLandroid/content/pm/ShortcutManager;->getPinnedShortcuts()Ljava/util/List;
 HSPLandroid/content/pm/ShortcutManager;->injectMyUserId()I
-HSPLandroid/content/pm/ShortcutManager;->reportShortcutUsed(Ljava/lang/String;)V
-HSPLandroid/content/pm/ShortcutManager;->setDynamicShortcuts(Ljava/util/List;)Z
-HSPLandroid/content/pm/ShortcutManager;->updateShortcuts(Ljava/util/List;)Z
 HSPLandroid/content/pm/ShortcutServiceInternal;-><init>()V
 HSPLandroid/content/pm/Signature$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/Signature;
 HSPLandroid/content/pm/Signature$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
@@ -7002,12 +6393,7 @@
 HSPLandroid/content/pm/Signature;->toChars([C[I)[C
 HSPLandroid/content/pm/Signature;->toCharsString()Ljava/lang/String;
 HSPLandroid/content/pm/Signature;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/content/pm/SigningInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/SigningInfo;
-HSPLandroid/content/pm/SigningInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/content/pm/SigningInfo;-><init>(Landroid/content/pm/PackageParser$SigningDetails;)V
-HSPLandroid/content/pm/SigningInfo;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/content/pm/SigningInfo;-><init>(Landroid/os/Parcel;Landroid/content/pm/SigningInfo$1;)V
-HSPLandroid/content/pm/SigningInfo;->getApkContentsSigners()[Landroid/content/pm/Signature;
 HSPLandroid/content/pm/SigningInfo;->getSigningCertificateHistory()[Landroid/content/pm/Signature;
 HSPLandroid/content/pm/SigningInfo;->hasMultipleSigners()Z
 HSPLandroid/content/pm/SigningInfo;->hasPastSigningCertificates()Z
@@ -7022,7 +6408,6 @@
 HSPLandroid/content/pm/UserInfo;-><init>(Landroid/content/pm/UserInfo;)V
 HSPLandroid/content/pm/UserInfo;-><init>(Landroid/os/Parcel;)V
 HSPLandroid/content/pm/UserInfo;-><init>(Landroid/os/Parcel;Landroid/content/pm/UserInfo$1;)V
-HPLandroid/content/pm/UserInfo;->flagsToString(I)Ljava/lang/String;
 HSPLandroid/content/pm/UserInfo;->getUserHandle()Landroid/os/UserHandle;
 HSPLandroid/content/pm/UserInfo;->isAdmin()Z
 HSPLandroid/content/pm/UserInfo;->isDemo()Z
@@ -7050,6 +6435,7 @@
 HSPLandroid/content/pm/VersionedPackage;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/content/pm/dex/ArtManager;->getCurrentProfilePath(Ljava/lang/String;ILjava/lang/String;)Ljava/lang/String;
 HSPLandroid/content/pm/dex/ArtManager;->getProfileName(Ljava/lang/String;)Ljava/lang/String;
+PLandroid/content/pm/dex/ArtManager;->getProfileSnapshotFileForName(Ljava/lang/String;Ljava/lang/String;)Ljava/io/File;
 HSPLandroid/content/pm/dex/ArtManagerInternal;-><init>()V
 HSPLandroid/content/pm/dex/DexMetadataHelper;->buildDexMetadataPathForApk(Ljava/lang/String;)Ljava/lang/String;
 HSPLandroid/content/pm/dex/DexMetadataHelper;->buildDexMetadataPathForFile(Ljava/io/File;)Ljava/lang/String;
@@ -7059,8 +6445,7 @@
 HSPLandroid/content/pm/dex/IArtManager$Stub;-><init>()V
 PLandroid/content/pm/dex/IArtManager$Stub;->asBinder()Landroid/os/IBinder;
 HPLandroid/content/pm/dex/IArtManager$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-PLandroid/content/pm/dex/ISnapshotRuntimeProfileCallback$Stub$Proxy;->onSuccess(Landroid/os/ParcelFileDescriptor;)V
-HPLandroid/content/pm/dex/PackageOptimizationInfo;-><init>(II)V
+HPLandroid/content/pm/dex/ISnapshotRuntimeProfileCallback$Stub$Proxy;->onSuccess(Landroid/os/ParcelFileDescriptor;)V
 HPLandroid/content/pm/dex/PackageOptimizationInfo;->getCompilationFilter()I
 HPLandroid/content/pm/dex/PackageOptimizationInfo;->getCompilationReason()I
 HSPLandroid/content/pm/parsing/ApkLiteParseUtils;->parseApkLite(Ljava/io/File;I)Landroid/content/pm/PackageParser$ApkLite;
@@ -7068,635 +6453,7 @@
 HSPLandroid/content/pm/parsing/ApkLiteParseUtils;->parseApkLiteInner(Ljava/io/File;Ljava/io/FileDescriptor;Ljava/lang/String;I)Landroid/content/pm/PackageParser$ApkLite;
 HSPLandroid/content/pm/parsing/ApkLiteParseUtils;->parseClusterPackageLite(Ljava/io/File;I)Landroid/content/pm/PackageParser$PackageLite;
 HSPLandroid/content/pm/parsing/ApkLiteParseUtils;->parseMonolithicPackageLite(Ljava/io/File;I)Landroid/content/pm/PackageParser$PackageLite;
-HSPLandroid/content/pm/parsing/ApkParseUtils$ParseResult;-><init>()V
-HSPLandroid/content/pm/parsing/ApkParseUtils$ParseResult;->getResultAndNull()Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/ApkParseUtils$ParseResult;->isSuccess()Z
-HSPLandroid/content/pm/parsing/ApkParseUtils$ParseResult;->reset()Landroid/content/pm/parsing/ApkParseUtils$ParseInput;
-HSPLandroid/content/pm/parsing/ApkParseUtils$ParseResult;->success(Landroid/content/pm/parsing/ParsingPackage;)Landroid/content/pm/parsing/ApkParseUtils$ParseResult;
-HSPLandroid/content/pm/parsing/ApkParseUtils;->buildClassName(Ljava/lang/String;Ljava/lang/CharSequence;)Ljava/lang/String;
-HSPLandroid/content/pm/parsing/ApkParseUtils;->checkOverlayRequiredSystemProperty(Ljava/lang/String;Ljava/lang/String;)Z
-HSPLandroid/content/pm/parsing/ApkParseUtils;->collectCertificates(Landroid/content/pm/parsing/AndroidPackage;Z)V
-HSPLandroid/content/pm/parsing/ApkParseUtils;->convertNewPermissions(Landroid/content/pm/parsing/ParsingPackage;)V
-HSPLandroid/content/pm/parsing/ApkParseUtils;->convertSplitPermissions(Landroid/content/pm/parsing/ParsingPackage;)V
-HSPLandroid/content/pm/parsing/ApkParseUtils;->generateAppDetailsHiddenActivity(Landroid/content/pm/parsing/ParsingPackage;[Ljava/lang/String;)Landroid/content/pm/parsing/ComponentParseUtils$ParsedActivity;
-HSPLandroid/content/pm/parsing/ApkParseUtils;->hasDomainURLs(Landroid/content/pm/parsing/ParsingPackage;)Z
-HSPLandroid/content/pm/parsing/ApkParseUtils;->parseAdditionalCertificates(Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;[Ljava/lang/String;)[Ljava/lang/String;
-HSPLandroid/content/pm/parsing/ApkParseUtils;->parseBaseApk(Landroid/content/pm/parsing/ApkParseUtils$ParseInput;[Ljava/lang/String;Landroid/content/pm/PackageParser$Callback;Landroid/util/DisplayMetrics;Ljava/io/File;Landroid/content/res/AssetManager;I)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/ApkParseUtils;->parseBaseApk(Landroid/content/pm/parsing/ApkParseUtils$ParseInput;[Ljava/lang/String;Landroid/content/pm/PackageParser$Callback;Ljava/lang/String;Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;I)Landroid/content/pm/parsing/ApkParseUtils$ParseResult;
-HSPLandroid/content/pm/parsing/ApkParseUtils;->parseBaseApkTags(Landroid/content/pm/parsing/ApkParseUtils$ParseInput;[Ljava/lang/String;Landroid/content/pm/PackageParser$Callback;Landroid/content/pm/parsing/ParsingPackage;Landroid/content/res/TypedArray;Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;I)Landroid/content/pm/parsing/ApkParseUtils$ParseResult;
-HSPLandroid/content/pm/parsing/ApkParseUtils;->parseBaseApplication(Landroid/content/pm/parsing/ApkParseUtils$ParseInput;[Ljava/lang/String;Landroid/content/pm/PackageParser$Callback;Landroid/content/pm/parsing/ParsingPackage;Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;I)Landroid/content/pm/parsing/ApkParseUtils$ParseResult;
-HSPLandroid/content/pm/parsing/ApkParseUtils;->parseClusterPackage(Landroid/content/pm/parsing/ApkParseUtils$ParseInput;[Ljava/lang/String;Landroid/content/pm/PackageParser$Callback;Landroid/util/DisplayMetrics;ZLjava/io/File;I)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/ApkParseUtils;->parseFeatureInfo(Landroid/content/res/Resources;Landroid/util/AttributeSet;)Landroid/content/pm/FeatureInfo;
-HSPLandroid/content/pm/parsing/ApkParseUtils;->parseManifestAttributes(Landroid/content/res/TypedArray;Landroid/content/pm/parsing/ParsingPackage;I)V
-HSPLandroid/content/pm/parsing/ApkParseUtils;->parseMetaData(Landroid/content/pm/parsing/ParsingPackage;Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;Landroid/os/Bundle;[Ljava/lang/String;)Landroid/os/Bundle;
-HSPLandroid/content/pm/parsing/ApkParseUtils;->parseMonolithicPackage(Landroid/content/pm/parsing/ApkParseUtils$ParseInput;[Ljava/lang/String;Landroid/content/pm/PackageParser$Callback;Landroid/util/DisplayMetrics;ZLjava/io/File;I)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/ApkParseUtils;->parseOriginalPackage(Landroid/content/pm/parsing/ParsingPackage;Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;)Z
-HSPLandroid/content/pm/parsing/ApkParseUtils;->parseOverlay(Landroid/content/pm/parsing/ApkParseUtils$ParseInput;Landroid/content/pm/parsing/ParsingPackage;Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;)Landroid/content/pm/parsing/ApkParseUtils$ParseResult;
-HSPLandroid/content/pm/parsing/ApkParseUtils;->parsePackage(Landroid/content/pm/parsing/ApkParseUtils$ParseInput;[Ljava/lang/String;Landroid/content/pm/PackageParser$Callback;Landroid/util/DisplayMetrics;ZLjava/io/File;I)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/ApkParseUtils;->parsePackageItemInfo(Landroid/content/pm/parsing/ApkParseUtils$ParseInput;Landroid/content/pm/parsing/ParsingPackage;Ljava/lang/String;Landroid/content/res/TypedArray;ZIIIIII)Landroid/content/pm/parsing/ApkParseUtils$ParseResult;
-HSPLandroid/content/pm/parsing/ApkParseUtils;->parsePermission(Landroid/content/pm/parsing/ApkParseUtils$ParseInput;Landroid/content/pm/parsing/ParsingPackage;Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;)Landroid/content/pm/parsing/ApkParseUtils$ParseResult;
-HSPLandroid/content/pm/parsing/ApkParseUtils;->parsePermissionGroup(Landroid/content/pm/parsing/ApkParseUtils$ParseInput;Landroid/content/pm/parsing/ParsingPackage;Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;)Landroid/content/pm/parsing/ApkParseUtils$ParseResult;
-HSPLandroid/content/pm/parsing/ApkParseUtils;->parsePermissionTree(Landroid/content/pm/parsing/ApkParseUtils$ParseInput;Landroid/content/pm/parsing/ParsingPackage;Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;)Landroid/content/pm/parsing/ApkParseUtils$ParseResult;
-HSPLandroid/content/pm/parsing/ApkParseUtils;->parseProtectedBroadcast(Landroid/content/pm/parsing/ParsingPackage;Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;)Z
-HSPLandroid/content/pm/parsing/ApkParseUtils;->parseQueries(Landroid/content/pm/parsing/ApkParseUtils$ParseInput;Landroid/content/pm/parsing/ParsingPackage;Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;)Landroid/content/pm/parsing/ApkParseUtils$ParseResult;
-HSPLandroid/content/pm/parsing/ApkParseUtils;->parseRestrictUpdateHash(ILandroid/content/pm/parsing/ParsingPackage;Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;)Z
-HSPLandroid/content/pm/parsing/ApkParseUtils;->parseSharedUser(Landroid/content/pm/parsing/ApkParseUtils$ParseInput;Landroid/content/pm/parsing/ParsingPackage;Landroid/content/res/TypedArray;)Landroid/content/pm/parsing/ApkParseUtils$ParseResult;
-HSPLandroid/content/pm/parsing/ApkParseUtils;->parseSplitApk(Landroid/content/pm/parsing/ApkParseUtils$ParseInput;Landroid/util/DisplayMetrics;[Ljava/lang/String;Landroid/content/pm/parsing/ParsingPackage;ILandroid/content/res/AssetManager;I)V
-HSPLandroid/content/pm/parsing/ApkParseUtils;->parseSplitApk(Landroid/content/pm/parsing/ApkParseUtils$ParseInput;[Ljava/lang/String;Landroid/content/pm/parsing/ParsingPackage;Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;II[Ljava/lang/String;)Landroid/content/pm/parsing/ApkParseUtils$ParseResult;
-HSPLandroid/content/pm/parsing/ApkParseUtils;->parseSplitApplication(Landroid/content/pm/parsing/ApkParseUtils$ParseInput;[Ljava/lang/String;Landroid/content/pm/parsing/ParsingPackage;Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;II[Ljava/lang/String;)Landroid/content/pm/parsing/ApkParseUtils$ParseResult;
-HSPLandroid/content/pm/parsing/ApkParseUtils;->parseSupportScreens(Landroid/content/pm/parsing/ParsingPackage;Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;)Z
-HSPLandroid/content/pm/parsing/ApkParseUtils;->parseUnknownTag(Landroid/content/pm/parsing/ApkParseUtils$ParseInput;Landroid/content/pm/parsing/ParsingPackage;Landroid/content/res/XmlResourceParser;)Landroid/content/pm/parsing/ApkParseUtils$ParseResult;
-HSPLandroid/content/pm/parsing/ApkParseUtils;->parseUsesPermission(Landroid/content/pm/parsing/ApkParseUtils$ParseInput;Landroid/content/pm/parsing/ParsingPackage;Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;Landroid/content/pm/PackageParser$Callback;)Landroid/content/pm/parsing/ApkParseUtils$ParseResult;
-HSPLandroid/content/pm/parsing/ApkParseUtils;->parseUsesSdk(Landroid/content/pm/parsing/ApkParseUtils$ParseInput;Landroid/content/pm/parsing/ParsingPackage;Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;)Landroid/content/pm/parsing/ApkParseUtils$ParseResult;
-HSPLandroid/content/pm/parsing/ApkParseUtils;->parseUsesStaticLibrary(Landroid/content/pm/parsing/ApkParseUtils$ParseInput;Landroid/content/pm/parsing/ParsingPackage;Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;)Landroid/content/pm/parsing/ApkParseUtils$ParseResult;
-HSPLandroid/content/pm/parsing/ApkParseUtils;->setMaxAspectRatio(Landroid/content/pm/parsing/ParsingPackage;)V
-HSPLandroid/content/pm/parsing/ApkParseUtils;->setMinAspectRatio(Landroid/content/pm/parsing/ParsingPackage;Landroid/content/pm/PackageParser$Callback;)V
-HSPLandroid/content/pm/parsing/ApkParseUtils;->validateName(Ljava/lang/String;ZZ)Ljava/lang/String;
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedActivity$1;-><init>()V
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedActivity$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/parsing/ComponentParseUtils$ParsedActivity;
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedActivity$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedActivity;-><clinit>()V
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedActivity;-><init>()V
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedActivity;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedActivity;->addIntent(Landroid/content/pm/parsing/ComponentParseUtils$ParsedActivityIntentInfo;)V
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedActivity;->hasMaxAspectRatio()Z
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedActivity;->hasMinAspectRatio()Z
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedActivity;->setMaxAspectRatio(IF)V
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedActivity;->setMinAspectRatio(IF)V
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedActivity;->setPackageName(Ljava/lang/String;)V
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedActivity;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedActivityIntentInfo$1;-><init>()V
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedActivityIntentInfo;-><clinit>()V
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedActivityIntentInfo;-><init>(Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedComponent;-><init>()V
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedComponent;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedComponent;->getComponentName()Landroid/content/ComponentName;
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedComponent;->getName()Ljava/lang/String;
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedComponent;->getPackageName()Ljava/lang/String;
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedComponent;->getSplitName()Ljava/lang/String;
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedComponent;->isDirectBootAware()Z
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedComponent;->isEnabled()Z
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedComponent;->setEnabled(Z)V
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedComponent;->setPackageName(Ljava/lang/String;)V
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedComponent;->setPackageNameInternal(Ljava/lang/String;)V
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedComponent;->setSplitName(Ljava/lang/String;)V
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedComponent;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedFeature$1;-><init>()V
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedFeature;-><clinit>()V
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedFeature;->isCombinationValid(Ljava/util/List;)Z
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedInstrumentation$1;-><init>()V
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedInstrumentation;-><clinit>()V
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedIntentInfo;-><init>(Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedIntentInfo;->addRawDataType(Ljava/lang/String;)V
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedIntentInfo;->createIntentsList(Landroid/os/Parcel;)Ljava/util/ArrayList;
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedIntentInfo;->getClassName()Ljava/lang/String;
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedIntentInfo;->getPackageName()Ljava/lang/String;
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedIntentInfo;->writeIntentInfoToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedIntentInfo;->writeIntentsList(Ljava/util/List;Landroid/os/Parcel;I)V
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedMainComponent$1;-><init>()V
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedMainComponent;-><clinit>()V
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedMainComponent;-><init>()V
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedMainComponent;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedMainComponent;->getPermission()Ljava/lang/String;
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedMainComponent;->getProcessName()Ljava/lang/String;
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedMainComponent;->setPermission(Ljava/lang/String;)V
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedMainComponent;->setProcessName(Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedMainComponent;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedPermission$1;-><init>()V
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedPermission;-><clinit>()V
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedPermission;-><init>()V
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedPermission;-><init>(Landroid/content/pm/parsing/ComponentParseUtils$ParsedPermission;)V
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedPermission;->getGroup()Ljava/lang/String;
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedPermission;->getProtection()I
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedPermission;->getProtectionFlags()I
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedPermission;->isRuntime()Z
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedPermission;->setGroup(Ljava/lang/String;)V
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedPermission;->setName(Ljava/lang/String;)V
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedPermission;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedPermissionGroup$1;-><init>()V
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedPermissionGroup;-><clinit>()V
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedPermissionGroup;-><init>()V
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedPermissionGroup;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedProvider$1;-><init>()V
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedProvider;-><clinit>()V
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedProvider;-><init>()V
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedProvider;->getAuthority()Ljava/lang/String;
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedProvider;->getIntents()Ljava/util/List;
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedProvider;->getReadPermission()Ljava/lang/String;
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedProvider;->getWritePermission()Ljava/lang/String;
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedProvider;->isSyncable()Z
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedProvider;->setAuthority(Ljava/lang/String;)V
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedProvider;->setReadPermission(Ljava/lang/String;)V
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedProvider;->setWritePermission(Ljava/lang/String;)V
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedProvider;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedProviderIntentInfo$1;-><init>()V
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedProviderIntentInfo;-><clinit>()V
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedProviderIntentInfo;-><init>(Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedService$1;-><init>()V
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedService;-><clinit>()V
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedService;-><init>()V
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedService;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedServiceIntentInfo$1;-><init>()V
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedServiceIntentInfo;-><clinit>()V
-HSPLandroid/content/pm/parsing/ComponentParseUtils$ParsedServiceIntentInfo;-><init>(Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/content/pm/parsing/ComponentParseUtils;->getActivityResizeMode(Landroid/content/pm/parsing/ParsingPackage;Landroid/content/res/TypedArray;I)I
-HSPLandroid/content/pm/parsing/ComponentParseUtils;->isImplicitlyExposedIntent(Landroid/content/pm/parsing/ComponentParseUtils$ParsedIntentInfo;)Z
-HSPLandroid/content/pm/parsing/ComponentParseUtils;->parseActivity([Ljava/lang/String;Landroid/content/pm/parsing/ParsingPackage;Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;I[Ljava/lang/String;ZZ)Landroid/content/pm/parsing/ComponentParseUtils$ParsedActivity;
-HSPLandroid/content/pm/parsing/ComponentParseUtils;->parseActivityAlias(Landroid/content/pm/parsing/ParsingPackage;Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;[Ljava/lang/String;)Landroid/content/pm/parsing/ComponentParseUtils$ParsedActivity;
-HSPLandroid/content/pm/parsing/ComponentParseUtils;->parseAllMetaData(Landroid/content/pm/parsing/ParsingPackage;Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;Ljava/lang/String;Landroid/content/pm/parsing/ComponentParseUtils$ParsedComponent;[Ljava/lang/String;)Z
-HSPLandroid/content/pm/parsing/ComponentParseUtils;->parseIntentInfo(Landroid/content/pm/parsing/ComponentParseUtils$ParsedIntentInfo;Landroid/content/pm/parsing/ParsingPackage;Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;ZZ[Ljava/lang/String;)Z
-HSPLandroid/content/pm/parsing/ComponentParseUtils;->parseLayout(Landroid/content/res/Resources;Landroid/util/AttributeSet;)Landroid/content/pm/ActivityInfo$WindowLayout;
-HSPLandroid/content/pm/parsing/ComponentParseUtils;->parsePermission(Landroid/content/pm/parsing/ParsingPackage;Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;[Ljava/lang/String;)Landroid/content/pm/parsing/ComponentParseUtils$ParsedPermission;
-HSPLandroid/content/pm/parsing/ComponentParseUtils;->parsePermissionGroup(Landroid/content/pm/parsing/ParsingPackage;Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;[Ljava/lang/String;)Landroid/content/pm/parsing/ComponentParseUtils$ParsedPermissionGroup;
-HSPLandroid/content/pm/parsing/ComponentParseUtils;->parsePermissionTree(Landroid/content/pm/parsing/ParsingPackage;Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;[Ljava/lang/String;)Landroid/content/pm/parsing/ComponentParseUtils$ParsedPermission;
-HSPLandroid/content/pm/parsing/ComponentParseUtils;->parseProvider([Ljava/lang/String;Landroid/content/pm/parsing/ParsingPackage;Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;I[Ljava/lang/String;)Landroid/content/pm/parsing/ComponentParseUtils$ParsedProvider;
-HSPLandroid/content/pm/parsing/ComponentParseUtils;->parseProviderTags(Landroid/content/pm/parsing/ParsingPackage;Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;ZLandroid/content/pm/parsing/ComponentParseUtils$ParsedProvider;[Ljava/lang/String;)Z
-HSPLandroid/content/pm/parsing/ComponentParseUtils;->parseService([Ljava/lang/String;Landroid/content/pm/parsing/ParsingPackage;Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;I[Ljava/lang/String;)Landroid/content/pm/parsing/ComponentParseUtils$ParsedService;
-HSPLandroid/content/pm/parsing/PackageImpl$1;-><init>()V
-HSPLandroid/content/pm/parsing/PackageImpl;-><clinit>()V
-HSPLandroid/content/pm/parsing/PackageImpl;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/content/pm/parsing/PackageImpl;-><init>(Ljava/lang/String;Ljava/lang/String;Landroid/content/res/TypedArray;Z)V
-HSPLandroid/content/pm/parsing/PackageImpl;->addActivity(Landroid/content/pm/parsing/ComponentParseUtils$ParsedActivity;)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->addAdoptPermission(Ljava/lang/String;)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->addAdoptPermission(Ljava/lang/String;)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->addConfigPreference(Landroid/content/pm/ConfigurationInfo;)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->addConfigPreference(Landroid/content/pm/ConfigurationInfo;)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->addImplicitPermission(Ljava/lang/String;)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->addImplicitPermission(Ljava/lang/String;)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->addLibraryName(Ljava/lang/String;)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->addLibraryName(Ljava/lang/String;)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->addOriginalPackage(Ljava/lang/String;)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->addOriginalPackage(Ljava/lang/String;)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->addPermission(Landroid/content/pm/parsing/ComponentParseUtils$ParsedPermission;)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->addPermission(Landroid/content/pm/parsing/ComponentParseUtils$ParsedPermission;)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->addPermissionGroup(Landroid/content/pm/parsing/ComponentParseUtils$ParsedPermissionGroup;)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->addPermissionGroup(Landroid/content/pm/parsing/ComponentParseUtils$ParsedPermissionGroup;)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->addProtectedBroadcast(Ljava/lang/String;)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->addProtectedBroadcast(Ljava/lang/String;)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->addProvider(Landroid/content/pm/parsing/ComponentParseUtils$ParsedProvider;)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->addQueriesPackage(Ljava/lang/String;)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->addQueriesPackage(Ljava/lang/String;)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->addReceiver(Landroid/content/pm/parsing/ComponentParseUtils$ParsedActivity;)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->addReqFeature(Landroid/content/pm/FeatureInfo;)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->addReqFeature(Landroid/content/pm/FeatureInfo;)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->addRequestedPermission(Ljava/lang/String;)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->addRequestedPermission(Ljava/lang/String;)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->addService(Landroid/content/pm/parsing/ComponentParseUtils$ParsedService;)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->addUsesLibrary(ILjava/lang/String;)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->addUsesLibrary(ILjava/lang/String;)Landroid/content/pm/parsing/ParsedPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->addUsesLibrary(Ljava/lang/String;)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->addUsesLibrary(Ljava/lang/String;)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->addUsesOptionalLibrary(Ljava/lang/String;)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->addUsesOptionalLibrary(Ljava/lang/String;)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->addUsesStaticLibrary(Ljava/lang/String;)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->addUsesStaticLibrary(Ljava/lang/String;)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->addUsesStaticLibraryCertDigests([Ljava/lang/String;)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->addUsesStaticLibraryCertDigests([Ljava/lang/String;)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->addUsesStaticLibraryVersion(J)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->addUsesStaticLibraryVersion(J)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->asSplit([Ljava/lang/String;[Ljava/lang/String;[ILandroid/util/SparseArray;)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->asSplit([Ljava/lang/String;[Ljava/lang/String;[ILandroid/util/SparseArray;)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->canHaveOatDir()Z
-HSPLandroid/content/pm/parsing/PackageImpl;->cantSaveState()Z
-HSPLandroid/content/pm/parsing/PackageImpl;->capPermissionPriorities()Landroid/content/pm/parsing/ParsedPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->clearAdoptPermissions()Landroid/content/pm/parsing/ParsedPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->clearOriginalPackages()Landroid/content/pm/parsing/ParsedPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->clearProtectedBroadcasts()Landroid/content/pm/parsing/ParsedPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->forParsing(Ljava/lang/String;Ljava/lang/String;Landroid/content/res/TypedArray;Z)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->getActivities()Ljava/util/List;
-HSPLandroid/content/pm/parsing/PackageImpl;->getAdoptPermissions()Ljava/util/List;
-HSPLandroid/content/pm/parsing/PackageImpl;->getAllCodePaths()Ljava/util/List;
-HSPLandroid/content/pm/parsing/PackageImpl;->getAppInfoClassLoaderName()Ljava/lang/String;
-HSPLandroid/content/pm/parsing/PackageImpl;->getAppInfoCodePath()Ljava/lang/String;
-HSPLandroid/content/pm/parsing/PackageImpl;->getAppInfoPackageName()Ljava/lang/String;
-HSPLandroid/content/pm/parsing/PackageImpl;->getAppInfoProcessName()Ljava/lang/String;
-HSPLandroid/content/pm/parsing/PackageImpl;->getAppInfoResourcePath()Ljava/lang/String;
-HSPLandroid/content/pm/parsing/PackageImpl;->getAppMetaData()Landroid/os/Bundle;
-HSPLandroid/content/pm/parsing/PackageImpl;->getApplicationInfoVolumeUuid()Ljava/lang/String;
-HSPLandroid/content/pm/parsing/PackageImpl;->getBaseCodePath()Ljava/lang/String;
-HSPLandroid/content/pm/parsing/PackageImpl;->getBaseRevisionCode()I
-HSPLandroid/content/pm/parsing/PackageImpl;->getCodePath()Ljava/lang/String;
-HSPLandroid/content/pm/parsing/PackageImpl;->getCompileSdkVersion()I
-HSPLandroid/content/pm/parsing/PackageImpl;->getCompileSdkVersionCodeName()Ljava/lang/String;
-HSPLandroid/content/pm/parsing/PackageImpl;->getCpuAbiOverride()Ljava/lang/String;
-HSPLandroid/content/pm/parsing/PackageImpl;->getDataDir()Ljava/lang/String;
-HSPLandroid/content/pm/parsing/PackageImpl;->getFeatures()Ljava/util/List;
-HSPLandroid/content/pm/parsing/PackageImpl;->getFlags()I
-HSPLandroid/content/pm/parsing/PackageImpl;->getHiddenApiEnforcementPolicy()I
-HSPLandroid/content/pm/parsing/PackageImpl;->getImplicitPermissions()Ljava/util/List;
-HSPLandroid/content/pm/parsing/PackageImpl;->getInstallLocation()I
-HSPLandroid/content/pm/parsing/PackageImpl;->getInstrumentations()Ljava/util/List;
-HSPLandroid/content/pm/parsing/PackageImpl;->getKeySetMapping()Ljava/util/Map;
-HSPLandroid/content/pm/parsing/PackageImpl;->getLatestForegroundPackageUseTimeInMills()J
-HSPLandroid/content/pm/parsing/PackageImpl;->getLibraryNames()Ljava/util/List;
-HSPLandroid/content/pm/parsing/PackageImpl;->getLongVersionCode()J
-HSPLandroid/content/pm/parsing/PackageImpl;->getManifestPackageName()Ljava/lang/String;
-HSPLandroid/content/pm/parsing/PackageImpl;->getMaxAspectRatio()F
-HSPLandroid/content/pm/parsing/PackageImpl;->getMinAspectRatio()F
-HSPLandroid/content/pm/parsing/PackageImpl;->getName()Ljava/lang/String;
-HSPLandroid/content/pm/parsing/PackageImpl;->getNativeLibraryDir()Ljava/lang/String;
-HSPLandroid/content/pm/parsing/PackageImpl;->getNativeLibraryRootDir()Ljava/lang/String;
-HSPLandroid/content/pm/parsing/PackageImpl;->getOriginalPackages()Ljava/util/List;
-HSPLandroid/content/pm/parsing/PackageImpl;->getOverlayCategory()Ljava/lang/String;
-HSPLandroid/content/pm/parsing/PackageImpl;->getOverlayPriority()I
-HSPLandroid/content/pm/parsing/PackageImpl;->getOverlayTarget()Ljava/lang/String;
-HSPLandroid/content/pm/parsing/PackageImpl;->getOverlayTargetName()Ljava/lang/String;
-HSPLandroid/content/pm/parsing/PackageImpl;->getOverlayables()Ljava/util/Map;
-HSPLandroid/content/pm/parsing/PackageImpl;->getPackageName()Ljava/lang/String;
-HSPLandroid/content/pm/parsing/PackageImpl;->getPermission()Ljava/lang/String;
-HSPLandroid/content/pm/parsing/PackageImpl;->getPermissionGroups()Ljava/util/List;
-HSPLandroid/content/pm/parsing/PackageImpl;->getPermissions()Ljava/util/List;
-HSPLandroid/content/pm/parsing/PackageImpl;->getPreferredOrder()I
-HSPLandroid/content/pm/parsing/PackageImpl;->getPrimaryCpuAbi()Ljava/lang/String;
-HSPLandroid/content/pm/parsing/PackageImpl;->getPrivateFlags()I
-HSPLandroid/content/pm/parsing/PackageImpl;->getProcessName()Ljava/lang/String;
-HSPLandroid/content/pm/parsing/PackageImpl;->getProtectedBroadcasts()Ljava/util/List;
-HSPLandroid/content/pm/parsing/PackageImpl;->getProviders()Ljava/util/List;
-HSPLandroid/content/pm/parsing/PackageImpl;->getQueriesIntents()Ljava/util/List;
-HSPLandroid/content/pm/parsing/PackageImpl;->getQueriesPackages()Ljava/util/List;
-HSPLandroid/content/pm/parsing/PackageImpl;->getRealPackage()Ljava/lang/String;
-HSPLandroid/content/pm/parsing/PackageImpl;->getReceivers()Ljava/util/List;
-HSPLandroid/content/pm/parsing/PackageImpl;->getRequestedPermissions()Ljava/util/List;
-HSPLandroid/content/pm/parsing/PackageImpl;->getRequiredAccountType()Ljava/lang/String;
-HSPLandroid/content/pm/parsing/PackageImpl;->getRestrictedAccountType()Ljava/lang/String;
-HSPLandroid/content/pm/parsing/PackageImpl;->getSeInfo()Ljava/lang/String;
-HSPLandroid/content/pm/parsing/PackageImpl;->getSeInfoUser()Ljava/lang/String;
-HSPLandroid/content/pm/parsing/PackageImpl;->getSecondaryCpuAbi()Ljava/lang/String;
-HSPLandroid/content/pm/parsing/PackageImpl;->getServices()Ljava/util/List;
-HSPLandroid/content/pm/parsing/PackageImpl;->getSharedUserId()Ljava/lang/String;
-HSPLandroid/content/pm/parsing/PackageImpl;->getSharedUserLabel()I
-HSPLandroid/content/pm/parsing/PackageImpl;->getSigningDetails()Landroid/content/pm/PackageParser$SigningDetails;
-HSPLandroid/content/pm/parsing/PackageImpl;->getSplitCodePaths()[Ljava/lang/String;
-HSPLandroid/content/pm/parsing/PackageImpl;->getSplitDependencies()Landroid/util/SparseArray;
-HSPLandroid/content/pm/parsing/PackageImpl;->getSplitFlags()[I
-HSPLandroid/content/pm/parsing/PackageImpl;->getSplitNames()[Ljava/lang/String;
-HSPLandroid/content/pm/parsing/PackageImpl;->getSplitRevisionCodes()[I
-HSPLandroid/content/pm/parsing/PackageImpl;->getStaticSharedLibName()Ljava/lang/String;
-HSPLandroid/content/pm/parsing/PackageImpl;->getStaticSharedLibVersion()J
-HSPLandroid/content/pm/parsing/PackageImpl;->getTargetSdkVersion()I
-HSPLandroid/content/pm/parsing/PackageImpl;->getTaskAffinity()Ljava/lang/String;
-HSPLandroid/content/pm/parsing/PackageImpl;->getUiOptions()I
-HSPLandroid/content/pm/parsing/PackageImpl;->getUid()I
-HSPLandroid/content/pm/parsing/PackageImpl;->getUpgradeKeySets()Ljava/util/Set;
-HSPLandroid/content/pm/parsing/PackageImpl;->getUsesLibraries()Ljava/util/List;
-HSPLandroid/content/pm/parsing/PackageImpl;->getUsesLibraryFiles()[Ljava/lang/String;
-HSPLandroid/content/pm/parsing/PackageImpl;->getUsesLibraryInfos()Ljava/util/List;
-HSPLandroid/content/pm/parsing/PackageImpl;->getUsesOptionalLibraries()Ljava/util/List;
-HSPLandroid/content/pm/parsing/PackageImpl;->getUsesStaticLibraries()Ljava/util/List;
-HSPLandroid/content/pm/parsing/PackageImpl;->getUsesStaticLibrariesCertDigests()[[Ljava/lang/String;
-HSPLandroid/content/pm/parsing/PackageImpl;->getUsesStaticLibrariesVersions()[J
-HSPLandroid/content/pm/parsing/PackageImpl;->getVersionCode()I
-HSPLandroid/content/pm/parsing/PackageImpl;->getVersionCodeMajor()I
-HSPLandroid/content/pm/parsing/PackageImpl;->getVersionName()Ljava/lang/String;
-HSPLandroid/content/pm/parsing/PackageImpl;->getVolumeUuid()Ljava/lang/String;
-HSPLandroid/content/pm/parsing/PackageImpl;->hasComponentClassName(Ljava/lang/String;)Z
-HSPLandroid/content/pm/parsing/PackageImpl;->hideAsFinal()Landroid/content/pm/parsing/AndroidPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->hideAsParsed()Landroid/content/pm/parsing/ParsedPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->initForUser(I)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->initForUser(I)Landroid/content/pm/parsing/ParsedPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->internStringArrayList(Ljava/util/List;)V
-HSPLandroid/content/pm/parsing/PackageImpl;->isAllowedToUseHiddenApis()Z
-HSPLandroid/content/pm/parsing/PackageImpl;->isBaseHardwareAccelerated()Z
-HSPLandroid/content/pm/parsing/PackageImpl;->isCoreApp()Z
-HSPLandroid/content/pm/parsing/PackageImpl;->isDirectBootAware()Z
-HSPLandroid/content/pm/parsing/PackageImpl;->isEmbeddedDexUsed()Z
-HSPLandroid/content/pm/parsing/PackageImpl;->isEnabled()Z
-HSPLandroid/content/pm/parsing/PackageImpl;->isEncryptionAware()Z
-HSPLandroid/content/pm/parsing/PackageImpl;->isExternal()Z
-HSPLandroid/content/pm/parsing/PackageImpl;->isForceQueryable()Z
-HSPLandroid/content/pm/parsing/PackageImpl;->isHiddenUntilInstalled()Z
-HSPLandroid/content/pm/parsing/PackageImpl;->isInstantApp()Z
-HSPLandroid/content/pm/parsing/PackageImpl;->isLibrary()Z
-HSPLandroid/content/pm/parsing/PackageImpl;->isMatch(I)Z
-HSPLandroid/content/pm/parsing/PackageImpl;->isOverlayIsStatic()Z
-HSPLandroid/content/pm/parsing/PackageImpl;->isPackageWhitelistedForHiddenApis()Z
-HSPLandroid/content/pm/parsing/PackageImpl;->isPrivileged()Z
-HSPLandroid/content/pm/parsing/PackageImpl;->isProduct()Z
-HSPLandroid/content/pm/parsing/PackageImpl;->isProfileableByShell()Z
-HSPLandroid/content/pm/parsing/PackageImpl;->isRequiredForAllUsers()Z
-HSPLandroid/content/pm/parsing/PackageImpl;->isSignedWithPlatformKey()Z
-HSPLandroid/content/pm/parsing/PackageImpl;->isStaticSharedLibrary()Z
-HSPLandroid/content/pm/parsing/PackageImpl;->isStub()Z
-HSPLandroid/content/pm/parsing/PackageImpl;->isSystem()Z
-HSPLandroid/content/pm/parsing/PackageImpl;->isSystemApp()Z
-HSPLandroid/content/pm/parsing/PackageImpl;->isSystemExt()Z
-HSPLandroid/content/pm/parsing/PackageImpl;->isUpdatedSystemApp()Z
-HSPLandroid/content/pm/parsing/PackageImpl;->isVendor()Z
-HSPLandroid/content/pm/parsing/PackageImpl;->makeListAllCodePaths()Ljava/util/List;
-HSPLandroid/content/pm/parsing/PackageImpl;->markNotActivitiesAsNotExportedIfSingleUser()Landroid/content/pm/parsing/ParsedPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->mutate()Landroid/content/pm/parsing/AndroidPackageWrite;
-HSPLandroid/content/pm/parsing/PackageImpl;->removeUsesLibrary(Ljava/lang/String;)Landroid/content/pm/parsing/ParsedPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->removeUsesOptionalLibrary(Ljava/lang/String;)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->removeUsesOptionalLibrary(Ljava/lang/String;)Landroid/content/pm/parsing/ParsedPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->requestsIsolatedSplitLoading()Z
-HSPLandroid/content/pm/parsing/PackageImpl;->setActivitiesResizeModeResizeable(Z)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setActivitiesResizeModeResizeable(Z)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setActivitiesResizeModeResizeableViaSdkVersion(Z)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setActivitiesResizeModeResizeableViaSdkVersion(Z)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setAllComponentsDirectBootAware(Z)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setAllComponentsDirectBootAware(Z)Landroid/content/pm/parsing/ParsedPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setAllowAudioPlaybackCapture(Z)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setAllowAudioPlaybackCapture(Z)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setAllowBackup(Z)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setAllowBackup(Z)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setAllowClearUserData(Z)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setAllowClearUserData(Z)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setAllowClearUserDataOnFailedRestore(Z)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setAllowClearUserDataOnFailedRestore(Z)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setAllowTaskReparenting(Z)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setAllowTaskReparenting(Z)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setAnyDensity(I)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setAnyDensity(I)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setAppComponentFactory(Ljava/lang/String;)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setAppComponentFactory(Ljava/lang/String;)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setAppMetaData(Landroid/os/Bundle;)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setAppMetaData(Landroid/os/Bundle;)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setApplicationInfoBaseResourcePath(Ljava/lang/String;)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setApplicationInfoBaseResourcePath(Ljava/lang/String;)Landroid/content/pm/parsing/ParsedPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setApplicationInfoCodePath(Ljava/lang/String;)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setApplicationInfoCodePath(Ljava/lang/String;)Landroid/content/pm/parsing/ParsedPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setApplicationInfoResourcePath(Ljava/lang/String;)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setApplicationInfoResourcePath(Ljava/lang/String;)Landroid/content/pm/parsing/ParsedPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setApplicationInfoSplitResourcePaths([Ljava/lang/String;)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setApplicationInfoSplitResourcePaths([Ljava/lang/String;)Landroid/content/pm/parsing/ParsedPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setApplicationVolumeUuid(Ljava/lang/String;)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setApplicationVolumeUuid(Ljava/lang/String;)Landroid/content/pm/parsing/ParsedPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setApplicationVolumeUuid(Ljava/lang/String;)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setBackupAgentName(Ljava/lang/String;)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setBackupAgentName(Ljava/lang/String;)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setBackupInForeground(Z)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setBackupInForeground(Z)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setBanner(I)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setBanner(I)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setBaseHardwareAccelerated(Z)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setBaseHardwareAccelerated(Z)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setCantSaveState(Z)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setCantSaveState(Z)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setCategory(I)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setCategory(I)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setClassLoaderName(Ljava/lang/String;)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setClassLoaderName(Ljava/lang/String;)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setClassName(Ljava/lang/String;)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setClassName(Ljava/lang/String;)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setCodePath(Ljava/lang/String;)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setCodePath(Ljava/lang/String;)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setCompatibleWidthLimitDp(I)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setCompatibleWidthLimitDp(I)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setCompileSdkVersionCodename(Ljava/lang/String;)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setCoreApp(Z)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setCoreApp(Z)Landroid/content/pm/parsing/ParsedPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setCpuAbiOverride(Ljava/lang/String;)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setCpuAbiOverride(Ljava/lang/String;)Landroid/content/pm/parsing/ParsedPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setCrossProfile(Z)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setCrossProfile(Z)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setDebuggable(Z)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setDebuggable(Z)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setDefaultToDeviceProtectedStorage(Z)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setDefaultToDeviceProtectedStorage(Z)Landroid/content/pm/parsing/ParsedPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setDefaultToDeviceProtectedStorage(Z)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setDescriptionRes(I)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setDescriptionRes(I)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setDirectBootAware(Z)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setDirectBootAware(Z)Landroid/content/pm/parsing/ParsedPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setDirectBootAware(Z)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setEnabled(Z)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setEnabled(Z)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setExternalStorage(Z)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setExternalStorage(Z)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setExtractNativeLibs(Z)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setExtractNativeLibs(Z)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setFactoryTest(Z)Landroid/content/pm/parsing/ParsedPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setForceQueryable(Z)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setForceQueryable(Z)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setFullBackupContent(I)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setFullBackupContent(I)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setFullBackupOnly(Z)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setFullBackupOnly(Z)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setHasCode(Z)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setHasCode(Z)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setHasDomainUrls(Z)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setHasDomainUrls(Z)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setHasFragileUserData(Z)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setHasFragileUserData(Z)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setHiddenUntilInstalled(Z)Landroid/content/pm/parsing/AndroidPackageWrite;
-HSPLandroid/content/pm/parsing/PackageImpl;->setHiddenUntilInstalled(Z)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setIcon(I)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setIcon(I)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setIconRes(I)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setIconRes(I)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setInstallLocation(I)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setInstallLocation(I)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setIsGame(Z)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setIsGame(Z)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setIsOverlay(Z)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setIsOverlay(Z)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setIsStub(Z)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setIsStub(Z)Landroid/content/pm/parsing/ParsedPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setIsolatedSplitLoading(Z)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setIsolatedSplitLoading(Z)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setKillAfterRestore(Z)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setKillAfterRestore(Z)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setLabelRes(I)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setLabelRes(I)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setLargeHeap(Z)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setLargeHeap(Z)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setLargestWidthLimitDp(I)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setLargestWidthLimitDp(I)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setLastPackageUsageTimeInMills(IJ)Landroid/content/pm/parsing/AndroidPackageWrite;
-HSPLandroid/content/pm/parsing/PackageImpl;->setLastPackageUsageTimeInMills(IJ)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setLogo(I)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setLogo(I)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setManageSpaceActivityName(Ljava/lang/String;)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setManageSpaceActivityName(Ljava/lang/String;)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setMaxAspectRatio(F)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setMaxAspectRatio(F)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setMinAspectRatio(F)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setMinAspectRatio(F)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setMinSdkVersion(I)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setMinSdkVersion(I)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setMultiArch(Z)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setMultiArch(Z)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setName(Ljava/lang/String;)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setName(Ljava/lang/String;)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setNativeLibraryDir(Ljava/lang/String;)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setNativeLibraryDir(Ljava/lang/String;)Landroid/content/pm/parsing/ParsedPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setNativeLibraryRootDir(Ljava/lang/String;)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setNativeLibraryRootDir(Ljava/lang/String;)Landroid/content/pm/parsing/ParsedPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setNativeLibraryRootRequiresIsa(Z)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setNativeLibraryRootRequiresIsa(Z)Landroid/content/pm/parsing/ParsedPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setNetworkSecurityConfigRes(I)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setNetworkSecurityConfigRes(I)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setNonLocalizedLabel(Ljava/lang/CharSequence;)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setNonLocalizedLabel(Ljava/lang/CharSequence;)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setOdm(Z)Landroid/content/pm/parsing/ParsedPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setOem(Z)Landroid/content/pm/parsing/ParsedPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setOverlayCategory(Ljava/lang/String;)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setOverlayCategory(Ljava/lang/String;)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setOverlayIsStatic(Z)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setOverlayIsStatic(Z)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setOverlayPriority(I)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setOverlayPriority(I)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setOverlayTarget(Ljava/lang/String;)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setOverlayTarget(Ljava/lang/String;)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setOverlayTargetName(Ljava/lang/String;)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setOverlayTargetName(Ljava/lang/String;)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setPackageName(Ljava/lang/String;)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setPackageName(Ljava/lang/String;)Landroid/content/pm/parsing/ParsedPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setPackageSettingCallback(Landroid/content/pm/parsing/ParsedPackage$PackageSettingCallback;)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setPackageSettingCallback(Landroid/content/pm/parsing/ParsedPackage$PackageSettingCallback;)Landroid/content/pm/parsing/ParsedPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setPartiallyDirectBootAware(Z)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setPartiallyDirectBootAware(Z)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setPermission(Ljava/lang/String;)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setPermission(Ljava/lang/String;)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setPersistent(Z)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setPersistent(Z)Landroid/content/pm/parsing/ParsedPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setPersistent(Z)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setPrimaryCpuAbi(Ljava/lang/String;)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setPrimaryCpuAbi(Ljava/lang/String;)Landroid/content/pm/parsing/ParsedPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setPrivileged(Z)Landroid/content/pm/parsing/ParsedPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setProcessName(Ljava/lang/String;)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setProcessName(Ljava/lang/String;)Landroid/content/pm/parsing/ParsedPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setProcessName(Ljava/lang/String;)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setProduct(Z)Landroid/content/pm/parsing/ParsedPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setRealPackage(Ljava/lang/String;)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setRealPackage(Ljava/lang/String;)Landroid/content/pm/parsing/ParsedPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setRealPackage(Ljava/lang/String;)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setRequestLegacyExternalStorage(Z)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setRequestLegacyExternalStorage(Z)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setRequiredAccountType(Ljava/lang/String;)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setRequiredAccountType(Ljava/lang/String;)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setRequiredForAllUsers(Z)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setRequiredForAllUsers(Z)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setRequiresSmallestWidthDp(I)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setRequiresSmallestWidthDp(I)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setResizeable(I)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setResizeable(I)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setRestoreAnyVersion(Z)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setRestoreAnyVersion(Z)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setRestrictUpdateHash([B)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setRestrictUpdateHash([B)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setRestrictedAccountType(Ljava/lang/String;)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setRestrictedAccountType(Ljava/lang/String;)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setRoundIconRes(I)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setRoundIconRes(I)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setSeInfo(Ljava/lang/String;)Landroid/content/pm/parsing/AndroidPackageWrite;
-HSPLandroid/content/pm/parsing/PackageImpl;->setSeInfo(Ljava/lang/String;)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setSeInfo(Ljava/lang/String;)Landroid/content/pm/parsing/ParsedPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setSeInfoUser(Ljava/lang/String;)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setSeInfoUser(Ljava/lang/String;)Landroid/content/pm/parsing/ParsedPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setSecondaryCpuAbi(Ljava/lang/String;)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setSecondaryCpuAbi(Ljava/lang/String;)Landroid/content/pm/parsing/ParsedPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setSecondaryNativeLibraryDir(Ljava/lang/String;)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setSecondaryNativeLibraryDir(Ljava/lang/String;)Landroid/content/pm/parsing/ParsedPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setSharedUserId(Ljava/lang/String;)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setSharedUserId(Ljava/lang/String;)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setSharedUserLabel(I)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setSharedUserLabel(I)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setSignedWithPlatformKey(Z)Landroid/content/pm/parsing/ParsedPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setSigningDetails(Landroid/content/pm/PackageParser$SigningDetails;)Landroid/content/pm/parsing/AndroidPackageWrite;
-HSPLandroid/content/pm/parsing/PackageImpl;->setSigningDetails(Landroid/content/pm/PackageParser$SigningDetails;)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setSigningDetails(Landroid/content/pm/PackageParser$SigningDetails;)Landroid/content/pm/parsing/ParsedPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setSigningDetails(Landroid/content/pm/PackageParser$SigningDetails;)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setSplitClassLoaderName(ILjava/lang/String;)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setSplitClassLoaderName(ILjava/lang/String;)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setSplitHasCode(IZ)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setSplitHasCode(IZ)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setStaticSharedLibName(Ljava/lang/String;)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setStaticSharedLibName(Ljava/lang/String;)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setStaticSharedLibVersion(J)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setStaticSharedLibVersion(J)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setStaticSharedLibrary(Z)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setStaticSharedLibrary(Z)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setSupportsLargeScreens(I)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setSupportsLargeScreens(I)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setSupportsNormalScreens(I)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setSupportsNormalScreens(I)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setSupportsRtl(Z)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setSupportsRtl(Z)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setSupportsSmallScreens(I)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setSupportsSmallScreens(I)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setSupportsXLargeScreens(I)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setSupportsXLargeScreens(I)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setSystem(Z)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setSystem(Z)Landroid/content/pm/parsing/ParsedPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setSystemExt(Z)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setSystemExt(Z)Landroid/content/pm/parsing/ParsedPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setTargetSandboxVersion(I)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setTargetSandboxVersion(I)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setTargetSdkVersion(I)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setTargetSdkVersion(I)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setTaskAffinity(Ljava/lang/String;)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setTaskAffinity(Ljava/lang/String;)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setTestOnly(Z)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setTestOnly(Z)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setTheme(I)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setTheme(I)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setUiOptions(I)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setUiOptions(I)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setUid(I)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setUid(I)Landroid/content/pm/parsing/ParsedPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setUpdatedSystemApp(Z)Landroid/content/pm/parsing/AndroidPackageWrite;
-HSPLandroid/content/pm/parsing/PackageImpl;->setUpdatedSystemApp(Z)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setUse32BitAbi(Z)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setUse32BitAbi(Z)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setUseEmbeddedDex(Z)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setUseEmbeddedDex(Z)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setUsesCleartextTraffic(Z)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setUsesCleartextTraffic(Z)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setUsesLibraryFiles([Ljava/lang/String;)Landroid/content/pm/parsing/AndroidPackageWrite;
-HSPLandroid/content/pm/parsing/PackageImpl;->setUsesLibraryFiles([Ljava/lang/String;)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setUsesLibraryInfos(Ljava/util/List;)Landroid/content/pm/parsing/AndroidPackageWrite;
-HSPLandroid/content/pm/parsing/PackageImpl;->setUsesLibraryInfos(Ljava/util/List;)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setUsesNonSdkApi(Z)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setUsesNonSdkApi(Z)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setVendor(Z)Landroid/content/pm/parsing/ParsedPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setVersionCode(I)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setVersionCode(I)Landroid/content/pm/parsing/ParsedPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setVersionCodeMajor(I)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setVersionCodeMajor(I)Landroid/content/pm/parsing/ParsedPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setVersionName(Ljava/lang/String;)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setVisibleToInstantApps(Z)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setVisibleToInstantApps(Z)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setVmSafeMode(Z)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setVmSafeMode(Z)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setVolumeUuid(Ljava/lang/String;)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setVolumeUuid(Ljava/lang/String;)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->setZygotePreloadName(Ljava/lang/String;)Landroid/content/pm/parsing/PackageImpl;
-HSPLandroid/content/pm/parsing/PackageImpl;->setZygotePreloadName(Ljava/lang/String;)Landroid/content/pm/parsing/ParsingPackage;
-HSPLandroid/content/pm/parsing/PackageImpl;->toAppInfoWithoutState()Landroid/content/pm/ApplicationInfo;
-HSPLandroid/content/pm/parsing/PackageImpl;->updateFlags()V
-HSPLandroid/content/pm/parsing/PackageImpl;->usesCompatibilityMode()Z
-HSPLandroid/content/pm/parsing/PackageImpl;->usesNonSdkApi()Z
-HSPLandroid/content/pm/parsing/PackageImpl;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/content/pm/parsing/PackageInfoUtils;->assignSharedFieldsForComponentInfo(Landroid/content/pm/ComponentInfo;Landroid/content/pm/parsing/ComponentParseUtils$ParsedComponent;)V
-HSPLandroid/content/pm/parsing/PackageInfoUtils;->assignSharedFieldsForPackageItemInfo(Landroid/content/pm/PackageItemInfo;Landroid/content/pm/parsing/ComponentParseUtils$ParsedComponent;)V
-HSPLandroid/content/pm/parsing/PackageInfoUtils;->checkUseInstalledOrHidden(Landroid/content/pm/parsing/AndroidPackage;Landroid/content/pm/PackageUserState;I)Z
-HSPLandroid/content/pm/parsing/PackageInfoUtils;->generate(Landroid/content/pm/parsing/AndroidPackage;[IIJJLjava/util/Set;Landroid/content/pm/PackageUserState;I)Landroid/content/pm/PackageInfo;
-HSPLandroid/content/pm/parsing/PackageInfoUtils;->generateActivityInfo(Landroid/content/pm/parsing/AndroidPackage;Landroid/content/pm/parsing/ComponentParseUtils$ParsedActivity;ILandroid/content/pm/PackageUserState;I)Landroid/content/pm/ActivityInfo;
-HSPLandroid/content/pm/parsing/PackageInfoUtils;->generateActivityInfo(Landroid/content/pm/parsing/AndroidPackage;Landroid/content/pm/parsing/ComponentParseUtils$ParsedActivity;ILandroid/content/pm/PackageUserState;Landroid/content/pm/ApplicationInfo;I)Landroid/content/pm/ActivityInfo;
-HSPLandroid/content/pm/parsing/PackageInfoUtils;->generateApplicationInfo(Landroid/content/pm/parsing/AndroidPackage;ILandroid/content/pm/PackageUserState;I)Landroid/content/pm/ApplicationInfo;
-HPLandroid/content/pm/parsing/PackageInfoUtils;->generatePermissionGroupInfo(Landroid/content/pm/parsing/ComponentParseUtils$ParsedPermissionGroup;I)Landroid/content/pm/PermissionGroupInfo;
-HSPLandroid/content/pm/parsing/PackageInfoUtils;->generatePermissionInfo(Landroid/content/pm/parsing/ComponentParseUtils$ParsedPermission;I)Landroid/content/pm/PermissionInfo;
-HSPLandroid/content/pm/parsing/PackageInfoUtils;->generateProviderInfo(Landroid/content/pm/parsing/AndroidPackage;Landroid/content/pm/parsing/ComponentParseUtils$ParsedProvider;ILandroid/content/pm/PackageUserState;I)Landroid/content/pm/ProviderInfo;
-HSPLandroid/content/pm/parsing/PackageInfoUtils;->generateProviderInfo(Landroid/content/pm/parsing/AndroidPackage;Landroid/content/pm/parsing/ComponentParseUtils$ParsedProvider;ILandroid/content/pm/PackageUserState;Landroid/content/pm/ApplicationInfo;I)Landroid/content/pm/ProviderInfo;
-HSPLandroid/content/pm/parsing/PackageInfoUtils;->generateServiceInfo(Landroid/content/pm/parsing/AndroidPackage;Landroid/content/pm/parsing/ComponentParseUtils$ParsedService;ILandroid/content/pm/PackageUserState;I)Landroid/content/pm/ServiceInfo;
-HSPLandroid/content/pm/parsing/PackageInfoUtils;->generateServiceInfo(Landroid/content/pm/parsing/AndroidPackage;Landroid/content/pm/parsing/ComponentParseUtils$ParsedService;ILandroid/content/pm/PackageUserState;Landroid/content/pm/ApplicationInfo;I)Landroid/content/pm/ServiceInfo;
-HSPLandroid/content/pm/parsing/PackageInfoUtils;->updateApplicationInfo(Landroid/content/pm/ApplicationInfo;ILandroid/content/pm/PackageUserState;)V
-HSPLandroid/content/pm/parsing/library/AndroidHidlUpdater;->updatePackage(Landroid/content/pm/parsing/ParsedPackage;)V
-HSPLandroid/content/pm/parsing/library/AndroidTestBaseUpdater;->isChangeEnabled(Landroid/content/pm/parsing/AndroidPackage;)Z
-HSPLandroid/content/pm/parsing/library/AndroidTestBaseUpdater;->updatePackage(Landroid/content/pm/parsing/ParsedPackage;)V
-HSPLandroid/content/pm/parsing/library/OrgApacheHttpLegacyUpdater;->apkTargetsApiLevelLessThanOrEqualToOMR1(Landroid/content/pm/parsing/AndroidPackage;)Z
-HSPLandroid/content/pm/parsing/library/OrgApacheHttpLegacyUpdater;->updatePackage(Landroid/content/pm/parsing/ParsedPackage;)V
-HSPLandroid/content/pm/parsing/library/PackageBackwardCompatibility$AndroidTestRunnerSplitUpdater;->updatePackage(Landroid/content/pm/parsing/ParsedPackage;)V
-HSPLandroid/content/pm/parsing/library/PackageBackwardCompatibility;->modifySharedLibraries(Landroid/content/pm/parsing/ParsedPackage;)V
-HSPLandroid/content/pm/parsing/library/PackageBackwardCompatibility;->updatePackage(Landroid/content/pm/parsing/ParsedPackage;)V
-HSPLandroid/content/pm/parsing/library/PackageSharedLibraryUpdater;->isLibraryPresent(Ljava/util/List;Ljava/util/List;Ljava/lang/String;)Z
-HSPLandroid/content/pm/parsing/library/PackageSharedLibraryUpdater;->prefixImplicitDependency(Landroid/content/pm/parsing/ParsedPackage;Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/content/pm/parsing/library/PackageSharedLibraryUpdater;->prefixRequiredLibrary(Landroid/content/pm/parsing/ParsedPackage;Ljava/lang/String;)V
-HSPLandroid/content/pm/parsing/library/PackageSharedLibraryUpdater;->removeLibrary(Landroid/content/pm/parsing/ParsedPackage;Ljava/lang/String;)V
 HSPLandroid/content/pm/permission/SplitPermissionInfoParcelable$1;-><init>()V
-HSPLandroid/content/pm/permission/SplitPermissionInfoParcelable$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/permission/SplitPermissionInfoParcelable;
-HSPLandroid/content/pm/permission/SplitPermissionInfoParcelable$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/content/pm/permission/SplitPermissionInfoParcelable;-><clinit>()V
 HSPLandroid/content/pm/permission/SplitPermissionInfoParcelable;-><init>(Ljava/lang/String;Ljava/util/List;I)V
 HSPLandroid/content/pm/permission/SplitPermissionInfoParcelable;->getNewPermissions()Ljava/util/List;
@@ -7712,6 +6469,7 @@
 HSPLandroid/content/res/-$$Lambda$Resources$4msWUw7LKsgLexLZjIfWa4oguq4;->test(Ljava/lang/Object;)Z
 HSPLandroid/content/res/-$$Lambda$ResourcesImpl$99dm2ENnzo9b0SIUjUj2Kl3pi90;->onHeaderDecoded(Landroid/graphics/ImageDecoder;Landroid/graphics/ImageDecoder$ImageInfo;Landroid/graphics/ImageDecoder$Source;)V
 HSPLandroid/content/res/-$$Lambda$ResourcesImpl$h3PTRX185BeQl8SVC2_w9arp5Og;->get()Ljava/lang/Object;
+HSPLandroid/content/res/ApkAssets;-><init>(ILjava/lang/String;ILandroid/content/res/loader/AssetsProvider;)V
 HSPLandroid/content/res/ApkAssets;-><init>(Ljava/lang/String;ZZZZZ)V
 HSPLandroid/content/res/ApkAssets;->close()V
 HSPLandroid/content/res/ApkAssets;->definesOverlayable()Z
@@ -7721,13 +6479,16 @@
 HSPLandroid/content/res/ApkAssets;->isForLoader()Z
 HSPLandroid/content/res/ApkAssets;->isUpToDate()Z
 HSPLandroid/content/res/ApkAssets;->loadFromPath(Ljava/lang/String;)Landroid/content/res/ApkAssets;
+HSPLandroid/content/res/ApkAssets;->loadFromPath(Ljava/lang/String;I)Landroid/content/res/ApkAssets;
 HSPLandroid/content/res/ApkAssets;->loadFromPath(Ljava/lang/String;Z)Landroid/content/res/ApkAssets;
 HSPLandroid/content/res/ApkAssets;->loadFromPath(Ljava/lang/String;ZZ)Landroid/content/res/ApkAssets;
+HSPLandroid/content/res/ApkAssets;->loadOverlayFromPath(Ljava/lang/String;I)Landroid/content/res/ApkAssets;
 HSPLandroid/content/res/ApkAssets;->loadOverlayFromPath(Ljava/lang/String;Z)Landroid/content/res/ApkAssets;
 HSPLandroid/content/res/ApkAssets;->openXml(Ljava/lang/String;)Landroid/content/res/XmlResourceParser;
 HSPLandroid/content/res/AssetFileDescriptor$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/res/AssetFileDescriptor;
 HSPLandroid/content/res/AssetFileDescriptor$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/content/res/AssetFileDescriptor$AutoCloseInputStream;-><init>(Landroid/content/res/AssetFileDescriptor;)V
+HSPLandroid/content/res/AssetFileDescriptor$AutoCloseInputStream;->read([BII)I
 HSPLandroid/content/res/AssetFileDescriptor;-><init>(Landroid/os/Parcel;)V
 HSPLandroid/content/res/AssetFileDescriptor;-><init>(Landroid/os/ParcelFileDescriptor;JJ)V
 HSPLandroid/content/res/AssetFileDescriptor;-><init>(Landroid/os/ParcelFileDescriptor;JJLandroid/os/Bundle;)V
@@ -7747,8 +6508,6 @@
 HSPLandroid/content/res/AssetManager$AssetInputStream;->ensureOpen()V
 HSPLandroid/content/res/AssetManager$AssetInputStream;->finalize()V
 HSPLandroid/content/res/AssetManager$AssetInputStream;->getNativeAsset()J
-HSPLandroid/content/res/AssetManager$AssetInputStream;->mark(I)V
-HSPLandroid/content/res/AssetManager$AssetInputStream;->markSupported()Z
 HSPLandroid/content/res/AssetManager$AssetInputStream;->read()I
 HSPLandroid/content/res/AssetManager$AssetInputStream;->read([B)I
 HSPLandroid/content/res/AssetManager$AssetInputStream;->read([BII)I
@@ -7768,15 +6527,11 @@
 HSPLandroid/content/res/AssetManager;->access$300(J[Landroid/content/res/ApkAssets;Z)V
 HSPLandroid/content/res/AssetManager;->access$402(Landroid/content/res/AssetManager;[Landroid/content/res/loader/ResourcesLoader;)[Landroid/content/res/loader/ResourcesLoader;
 HSPLandroid/content/res/AssetManager;->access$500(J)J
-HSPLandroid/content/res/AssetManager;->access$600(J)I
 HSPLandroid/content/res/AssetManager;->access$600(J)J
 HSPLandroid/content/res/AssetManager;->access$700(J)I
 HSPLandroid/content/res/AssetManager;->access$700(J[BII)I
 HSPLandroid/content/res/AssetManager;->access$800(J[BII)I
 HSPLandroid/content/res/AssetManager;->access$900(J)J
-HSPLandroid/content/res/AssetManager;->access$900(JJI)J
-HSPLandroid/content/res/AssetManager;->addAssetPath(Ljava/lang/String;)I
-HSPLandroid/content/res/AssetManager;->addAssetPathAsSharedLibrary(Ljava/lang/String;)I
 HSPLandroid/content/res/AssetManager;->addAssetPathInternal(Ljava/lang/String;ZZ)I
 HSPLandroid/content/res/AssetManager;->applyStyle(JIILandroid/content/res/XmlBlock$Parser;[IJJ)V
 HSPLandroid/content/res/AssetManager;->applyStyleToTheme(JIZ)V
@@ -7812,7 +6567,6 @@
 HSPLandroid/content/res/AssetManager;->getSystem()Landroid/content/res/AssetManager;
 HSPLandroid/content/res/AssetManager;->getThemeValue(JILandroid/util/TypedValue;Z)Z
 HSPLandroid/content/res/AssetManager;->incRefsLocked(J)V
-HSPLandroid/content/res/AssetManager;->invalidateCachesLocked(I)V
 HSPLandroid/content/res/AssetManager;->isUpToDate()Z
 HSPLandroid/content/res/AssetManager;->list(Ljava/lang/String;)[Ljava/lang/String;
 HSPLandroid/content/res/AssetManager;->open(Ljava/lang/String;)Ljava/io/InputStream;
@@ -7855,7 +6609,6 @@
 HSPLandroid/content/res/ColorStateList;->isStateful()Z
 HSPLandroid/content/res/ColorStateList;->modulateColorAlpha(IF)I
 HSPLandroid/content/res/ColorStateList;->obtainForTheme(Landroid/content/res/Resources$Theme;)Landroid/content/res/ColorStateList;
-HSPLandroid/content/res/ColorStateList;->obtainForTheme(Landroid/content/res/Resources$Theme;)Landroid/content/res/ComplexColor;
 HSPLandroid/content/res/ColorStateList;->onColorsChanged()V
 HSPLandroid/content/res/ColorStateList;->valueOf(I)Landroid/content/res/ColorStateList;
 HSPLandroid/content/res/ColorStateList;->withAlpha(I)Landroid/content/res/ColorStateList;
@@ -7903,13 +6656,14 @@
 HSPLandroid/content/res/Configuration;->isOtherSeqNewer(Landroid/content/res/Configuration;)Z
 HSPLandroid/content/res/Configuration;->isScreenRound()Z
 HSPLandroid/content/res/Configuration;->isScreenWideColorGamut()Z
+HPLandroid/content/res/Configuration;->localesToResourceQualifier(Landroid/os/LocaleList;)Ljava/lang/String;
 HSPLandroid/content/res/Configuration;->needNewResources(II)Z
 HSPLandroid/content/res/Configuration;->readFromParcel(Landroid/os/Parcel;)V
 HPLandroid/content/res/Configuration;->readFromProto(Landroid/util/proto/ProtoInputStream;J)V
 HSPLandroid/content/res/Configuration;->reduceScreenLayout(III)I
 HSPLandroid/content/res/Configuration;->resetScreenLayout(I)I
+HPLandroid/content/res/Configuration;->resourceQualifierString(Landroid/content/res/Configuration;Landroid/util/DisplayMetrics;)Ljava/lang/String;
 HSPLandroid/content/res/Configuration;->setLayoutDirection(Ljava/util/Locale;)V
-HSPLandroid/content/res/Configuration;->setLocale(Ljava/util/Locale;)V
 HSPLandroid/content/res/Configuration;->setLocales(Landroid/os/LocaleList;)V
 HSPLandroid/content/res/Configuration;->setTo(Landroid/content/res/Configuration;)V
 HSPLandroid/content/res/Configuration;->setToDefaults()V
@@ -7990,7 +6744,6 @@
 HSPLandroid/content/res/Resources;->getClassLoader()Ljava/lang/ClassLoader;
 HSPLandroid/content/res/Resources;->getColor(I)I
 HSPLandroid/content/res/Resources;->getColor(ILandroid/content/res/Resources$Theme;)I
-HSPLandroid/content/res/Resources;->getColorStateList(I)Landroid/content/res/ColorStateList;
 HSPLandroid/content/res/Resources;->getColorStateList(ILandroid/content/res/Resources$Theme;)Landroid/content/res/ColorStateList;
 HSPLandroid/content/res/Resources;->getCompatibilityInfo()Landroid/content/res/CompatibilityInfo;
 HSPLandroid/content/res/Resources;->getConfiguration()Landroid/content/res/Configuration;
@@ -8126,15 +6879,12 @@
 HSPLandroid/content/res/ResourcesKey;->hashCode()I
 HSPLandroid/content/res/StringBlock$StyleIDs;->access$000(Landroid/content/res/StringBlock$StyleIDs;)I
 HSPLandroid/content/res/StringBlock$StyleIDs;->access$100(Landroid/content/res/StringBlock$StyleIDs;)I
-HSPLandroid/content/res/StringBlock$StyleIDs;->access$1000(Landroid/content/res/StringBlock$StyleIDs;)I
 HSPLandroid/content/res/StringBlock$StyleIDs;->access$200(Landroid/content/res/StringBlock$StyleIDs;)I
 HSPLandroid/content/res/StringBlock$StyleIDs;->access$300(Landroid/content/res/StringBlock$StyleIDs;)I
 HSPLandroid/content/res/StringBlock$StyleIDs;->access$400(Landroid/content/res/StringBlock$StyleIDs;)I
 HSPLandroid/content/res/StringBlock$StyleIDs;->access$500(Landroid/content/res/StringBlock$StyleIDs;)I
 HSPLandroid/content/res/StringBlock$StyleIDs;->access$600(Landroid/content/res/StringBlock$StyleIDs;)I
 HSPLandroid/content/res/StringBlock$StyleIDs;->access$700(Landroid/content/res/StringBlock$StyleIDs;)I
-HSPLandroid/content/res/StringBlock$StyleIDs;->access$800(Landroid/content/res/StringBlock$StyleIDs;)I
-HSPLandroid/content/res/StringBlock$StyleIDs;->access$900(Landroid/content/res/StringBlock$StyleIDs;)I
 HSPLandroid/content/res/StringBlock;-><init>(JZ)V
 HSPLandroid/content/res/StringBlock;->applyStyles(Ljava/lang/String;[ILandroid/content/res/StringBlock$StyleIDs;)Ljava/lang/CharSequence;
 HSPLandroid/content/res/StringBlock;->close()V
@@ -8216,7 +6966,6 @@
 HSPLandroid/content/res/XmlBlock$Parser;->getText()Ljava/lang/String;
 HSPLandroid/content/res/XmlBlock$Parser;->isEmptyElementTag()Z
 HSPLandroid/content/res/XmlBlock$Parser;->next()I
-HSPLandroid/content/res/XmlBlock$Parser;->nextTag()I
 HSPLandroid/content/res/XmlBlock$Parser;->nextText()Ljava/lang/String;
 HSPLandroid/content/res/XmlBlock$Parser;->require(ILjava/lang/String;Ljava/lang/String;)V
 HSPLandroid/content/res/XmlBlock;-><init>(Landroid/content/res/AssetManager;J)V
@@ -8240,7 +6989,6 @@
 HSPLandroid/content/res/XmlBlock;->newParser(I)Landroid/content/res/XmlResourceParser;
 HSPLandroid/content/rollback/IRollbackManager$Stub;-><init>()V
 HSPLandroid/content/rollback/IRollbackManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/rollback/IRollbackManager;
-HPLandroid/content/rollback/IRollbackManager$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/content/rollback/RollbackManager;-><init>(Landroid/content/Context;Landroid/content/rollback/IRollbackManager;)V
 PLandroid/content/rollback/RollbackManager;->getAvailableRollbacks()Ljava/util/List;
 HSPLandroid/content/type/-$$Lambda$DefaultMimeMapFactory$3biOnZOOEGRoeaFehYke-eZnpCg;-><init>(Ljava/lang/Class;)V
@@ -8249,6 +6997,8 @@
 HSPLandroid/content/type/DefaultMimeMapFactory;->create(Ljava/util/function/Function;)Llibcore/content/type/MimeMap;
 HSPLandroid/content/type/DefaultMimeMapFactory;->lambda$create$0(Ljava/lang/Class;Ljava/lang/String;)Ljava/io/InputStream;
 HSPLandroid/content/type/DefaultMimeMapFactory;->parseTypes(Llibcore/content/type/MimeMap$Builder;Ljava/util/function/Function;Ljava/lang/String;)V
+HSPLandroid/database/-$$Lambda$ContentObserver$MgqiYb2qvgLhoXTioYXq9MvvpNk;-><init>(Landroid/database/ContentObserver;ZLjava/util/Collection;II)V
+HSPLandroid/database/-$$Lambda$ContentObserver$MgqiYb2qvgLhoXTioYXq9MvvpNk;->run()V
 HSPLandroid/database/AbstractCursor$SelfContentObserver;-><init>(Landroid/database/AbstractCursor;)V
 HSPLandroid/database/AbstractCursor$SelfContentObserver;->onChange(Z)V
 HSPLandroid/database/AbstractCursor;-><init>()V
@@ -8260,17 +7010,13 @@
 HSPLandroid/database/AbstractCursor;->getColumnIndex(Ljava/lang/String;)I
 HSPLandroid/database/AbstractCursor;->getColumnIndexOrThrow(Ljava/lang/String;)I
 HSPLandroid/database/AbstractCursor;->getColumnName(I)Ljava/lang/String;
-HSPLandroid/database/AbstractCursor;->getExtras()Landroid/os/Bundle;
 HSPLandroid/database/AbstractCursor;->getPosition()I
 HSPLandroid/database/AbstractCursor;->getWantsAllOnMoveCalls()Z
 HSPLandroid/database/AbstractCursor;->getWindow()Landroid/database/CursorWindow;
 HSPLandroid/database/AbstractCursor;->isAfterLast()Z
-HSPLandroid/database/AbstractCursor;->isBeforeFirst()Z
 HSPLandroid/database/AbstractCursor;->isClosed()Z
 HSPLandroid/database/AbstractCursor;->isLast()Z
-HSPLandroid/database/AbstractCursor;->move(I)Z
 HSPLandroid/database/AbstractCursor;->moveToFirst()Z
-HSPLandroid/database/AbstractCursor;->moveToLast()Z
 HSPLandroid/database/AbstractCursor;->moveToNext()Z
 HSPLandroid/database/AbstractCursor;->moveToPosition(I)Z
 HSPLandroid/database/AbstractCursor;->moveToPrevious()Z
@@ -8278,7 +7024,6 @@
 HSPLandroid/database/AbstractCursor;->onDeactivateOrClose()V
 HSPLandroid/database/AbstractCursor;->onMove(II)Z
 HSPLandroid/database/AbstractCursor;->registerContentObserver(Landroid/database/ContentObserver;)V
-HSPLandroid/database/AbstractCursor;->registerDataSetObserver(Landroid/database/DataSetObserver;)V
 HSPLandroid/database/AbstractCursor;->setNotificationUri(Landroid/content/ContentResolver;Landroid/net/Uri;)V
 HSPLandroid/database/AbstractCursor;->setNotificationUris(Landroid/content/ContentResolver;Ljava/util/List;)V
 HSPLandroid/database/AbstractCursor;->setNotificationUris(Landroid/content/ContentResolver;Ljava/util/List;IZ)V
@@ -8289,7 +7034,6 @@
 HSPLandroid/database/AbstractWindowedCursor;->closeWindow()V
 HSPLandroid/database/AbstractWindowedCursor;->getBlob(I)[B
 HSPLandroid/database/AbstractWindowedCursor;->getDouble(I)D
-HSPLandroid/database/AbstractWindowedCursor;->getFloat(I)F
 HSPLandroid/database/AbstractWindowedCursor;->getInt(I)I
 HSPLandroid/database/AbstractWindowedCursor;->getLong(I)J
 HSPLandroid/database/AbstractWindowedCursor;->getString(I)Ljava/lang/String;
@@ -8326,18 +7070,21 @@
 HSPLandroid/database/ContentObserver$NotificationRunnable;->run()V
 HSPLandroid/database/ContentObserver$Transport;-><init>(Landroid/database/ContentObserver;)V
 HSPLandroid/database/ContentObserver$Transport;->onChange(ZLandroid/net/Uri;I)V
+HSPLandroid/database/ContentObserver$Transport;->onChangeEtc(Z[Landroid/net/Uri;II)V
 HSPLandroid/database/ContentObserver$Transport;->releaseContentObserver()V
 HSPLandroid/database/ContentObserver;-><init>(Landroid/os/Handler;)V
 HSPLandroid/database/ContentObserver;->access$000(Landroid/database/ContentObserver;ZLandroid/net/Uri;I)V
-HSPLandroid/database/ContentObserver;->dispatchChange(ZLandroid/net/Uri;)V
 HSPLandroid/database/ContentObserver;->dispatchChange(ZLandroid/net/Uri;I)V
+HSPLandroid/database/ContentObserver;->dispatchChange(ZLjava/util/Collection;II)V
 HSPLandroid/database/ContentObserver;->getContentObserver()Landroid/database/IContentObserver;
+HSPLandroid/database/ContentObserver;->lambda$dispatchChange$0$ContentObserver(ZLjava/util/Collection;II)V
 HSPLandroid/database/ContentObserver;->onChange(Z)V
 HSPLandroid/database/ContentObserver;->onChange(ZLandroid/net/Uri;)V
 HSPLandroid/database/ContentObserver;->onChange(ZLandroid/net/Uri;I)V
+HSPLandroid/database/ContentObserver;->onChange(ZLjava/util/Collection;I)V
+HSPLandroid/database/ContentObserver;->onChange(ZLjava/util/Collection;II)V
 HSPLandroid/database/ContentObserver;->releaseContentObserver()Landroid/database/IContentObserver;
 HSPLandroid/database/CrossProcessCursorWrapper;-><init>(Landroid/database/Cursor;)V
-HSPLandroid/database/CrossProcessCursorWrapper;->getWindow()Landroid/database/CursorWindow;
 HSPLandroid/database/CursorToBulkCursorAdaptor$ContentObserverProxy;-><init>(Landroid/database/IContentObserver;Landroid/os/IBinder$DeathRecipient;)V
 HSPLandroid/database/CursorToBulkCursorAdaptor$ContentObserverProxy;->unlinkToDeath(Landroid/os/IBinder$DeathRecipient;)Z
 HSPLandroid/database/CursorToBulkCursorAdaptor;-><init>(Landroid/database/Cursor;Landroid/database/IContentObserver;Ljava/lang/String;)V
@@ -8358,7 +7105,6 @@
 HSPLandroid/database/CursorWindow;-><init>(Landroid/os/Parcel;Landroid/database/CursorWindow$1;)V
 HSPLandroid/database/CursorWindow;-><init>(Ljava/lang/String;)V
 HSPLandroid/database/CursorWindow;-><init>(Ljava/lang/String;J)V
-HSPLandroid/database/CursorWindow;-><init>(Z)V
 HSPLandroid/database/CursorWindow;->allocRow()Z
 HSPLandroid/database/CursorWindow;->clear()V
 HSPLandroid/database/CursorWindow;->dispose()V
@@ -8366,18 +7112,14 @@
 HSPLandroid/database/CursorWindow;->getBlob(II)[B
 HSPLandroid/database/CursorWindow;->getCursorWindowSize()I
 HSPLandroid/database/CursorWindow;->getDouble(II)D
-HSPLandroid/database/CursorWindow;->getFloat(II)F
 HSPLandroid/database/CursorWindow;->getInt(II)I
 HSPLandroid/database/CursorWindow;->getLong(II)J
 HSPLandroid/database/CursorWindow;->getNumRows()I
 HSPLandroid/database/CursorWindow;->getStartPosition()I
 HSPLandroid/database/CursorWindow;->getString(II)Ljava/lang/String;
 HSPLandroid/database/CursorWindow;->getType(II)I
-HSPLandroid/database/CursorWindow;->isNull(II)Z
 HSPLandroid/database/CursorWindow;->newFromParcel(Landroid/os/Parcel;)Landroid/database/CursorWindow;
 HSPLandroid/database/CursorWindow;->onAllReferencesReleased()V
-HSPLandroid/database/CursorWindow;->putBlob([BII)Z
-HSPLandroid/database/CursorWindow;->putDouble(DII)Z
 HSPLandroid/database/CursorWindow;->putLong(JII)Z
 HSPLandroid/database/CursorWindow;->putNull(II)Z
 HSPLandroid/database/CursorWindow;->putString(Ljava/lang/String;II)Z
@@ -8392,28 +7134,22 @@
 HSPLandroid/database/CursorWrapper;->getColumnCount()I
 HSPLandroid/database/CursorWrapper;->getColumnIndex(Ljava/lang/String;)I
 HSPLandroid/database/CursorWrapper;->getColumnIndexOrThrow(Ljava/lang/String;)I
-HSPLandroid/database/CursorWrapper;->getColumnName(I)Ljava/lang/String;
-HSPLandroid/database/CursorWrapper;->getColumnNames()[Ljava/lang/String;
 HSPLandroid/database/CursorWrapper;->getCount()I
 HSPLandroid/database/CursorWrapper;->getDouble(I)D
-HSPLandroid/database/CursorWrapper;->getExtras()Landroid/os/Bundle;
 HSPLandroid/database/CursorWrapper;->getInt(I)I
 HSPLandroid/database/CursorWrapper;->getLong(I)J
 HSPLandroid/database/CursorWrapper;->getPosition()I
 HSPLandroid/database/CursorWrapper;->getString(I)Ljava/lang/String;
 HSPLandroid/database/CursorWrapper;->getType(I)I
-HSPLandroid/database/CursorWrapper;->getWantsAllOnMoveCalls()Z
 HSPLandroid/database/CursorWrapper;->getWrappedCursor()Landroid/database/Cursor;
 HSPLandroid/database/CursorWrapper;->isAfterLast()Z
 HSPLandroid/database/CursorWrapper;->isClosed()Z
-HSPLandroid/database/CursorWrapper;->isLast()Z
 HSPLandroid/database/CursorWrapper;->isNull(I)Z
 HSPLandroid/database/CursorWrapper;->moveToFirst()Z
-HSPLandroid/database/CursorWrapper;->moveToLast()Z
 HSPLandroid/database/CursorWrapper;->moveToNext()Z
 HSPLandroid/database/CursorWrapper;->moveToPosition(I)Z
+HSPLandroid/database/CursorWrapper;->moveToPrevious()Z
 HSPLandroid/database/CursorWrapper;->registerContentObserver(Landroid/database/ContentObserver;)V
-HSPLandroid/database/CursorWrapper;->unregisterContentObserver(Landroid/database/ContentObserver;)V
 HSPLandroid/database/DataSetObservable;-><init>()V
 HSPLandroid/database/DataSetObservable;->notifyChanged()V
 HSPLandroid/database/DataSetObservable;->notifyInvalidated()V
@@ -8431,13 +7167,12 @@
 HSPLandroid/database/DatabaseUtils;->readExceptionWithFileNotFoundExceptionFromParcel(Landroid/os/Parcel;)V
 HSPLandroid/database/DatabaseUtils;->readExceptionWithOperationApplicationExceptionFromParcel(Landroid/os/Parcel;)V
 HSPLandroid/database/DatabaseUtils;->sqlEscapeString(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/database/DatabaseUtils;->stringForQuery(Landroid/database/sqlite/SQLiteDatabase;Ljava/lang/String;[Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/database/DatabaseUtils;->stringForQuery(Landroid/database/sqlite/SQLiteStatement;[Ljava/lang/String;)Ljava/lang/String;
 HSPLandroid/database/DatabaseUtils;->writeExceptionToParcel(Landroid/os/Parcel;Ljava/lang/Exception;)V
 HSPLandroid/database/DefaultDatabaseErrorHandler;-><init>()V
 HSPLandroid/database/IContentObserver$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HSPLandroid/database/IContentObserver$Stub$Proxy;->asBinder()Landroid/os/IBinder;
 HSPLandroid/database/IContentObserver$Stub$Proxy;->onChange(ZLandroid/net/Uri;I)V
+HSPLandroid/database/IContentObserver$Stub$Proxy;->onChangeEtc(Z[Landroid/net/Uri;II)V
 HSPLandroid/database/IContentObserver$Stub;-><init>()V
 HSPLandroid/database/IContentObserver$Stub;->asBinder()Landroid/os/IBinder;
 HSPLandroid/database/IContentObserver$Stub;->asInterface(Landroid/os/IBinder;)Landroid/database/IContentObserver;
@@ -8453,24 +7188,13 @@
 HSPLandroid/database/MatrixCursor;->addRow([Ljava/lang/Object;)V
 HSPLandroid/database/MatrixCursor;->ensureCapacity(I)V
 HSPLandroid/database/MatrixCursor;->get(I)Ljava/lang/Object;
-HSPLandroid/database/MatrixCursor;->getBlob(I)[B
 HSPLandroid/database/MatrixCursor;->getColumnNames()[Ljava/lang/String;
 HSPLandroid/database/MatrixCursor;->getCount()I
-HSPLandroid/database/MatrixCursor;->getDouble(I)D
 HSPLandroid/database/MatrixCursor;->getInt(I)I
 HSPLandroid/database/MatrixCursor;->getLong(I)J
 HSPLandroid/database/MatrixCursor;->getString(I)Ljava/lang/String;
 HSPLandroid/database/MatrixCursor;->getType(I)I
 HSPLandroid/database/MatrixCursor;->newRow()Landroid/database/MatrixCursor$RowBuilder;
-HSPLandroid/database/MergeCursor$1;-><init>(Landroid/database/MergeCursor;)V
-HSPLandroid/database/MergeCursor$1;->onInvalidated()V
-HSPLandroid/database/MergeCursor;-><init>([Landroid/database/Cursor;)V
-HSPLandroid/database/MergeCursor;->close()V
-HSPLandroid/database/MergeCursor;->getColumnNames()[Ljava/lang/String;
-HSPLandroid/database/MergeCursor;->getCount()I
-HSPLandroid/database/MergeCursor;->getLong(I)J
-HSPLandroid/database/MergeCursor;->getString(I)Ljava/lang/String;
-HSPLandroid/database/MergeCursor;->onMove(II)Z
 HSPLandroid/database/Observable;-><init>()V
 HSPLandroid/database/Observable;->registerObserver(Ljava/lang/Object;)V
 HSPLandroid/database/Observable;->unregisterAll()V
@@ -8533,6 +7257,7 @@
 HSPLandroid/database/sqlite/SQLiteConnection;->executeForLastInsertedRowId(Ljava/lang/String;[Ljava/lang/Object;Landroid/os/CancellationSignal;)J
 HSPLandroid/database/sqlite/SQLiteConnection;->executeForLong(Ljava/lang/String;[Ljava/lang/Object;Landroid/os/CancellationSignal;)J
 HSPLandroid/database/sqlite/SQLiteConnection;->executeForString(Ljava/lang/String;[Ljava/lang/Object;Landroid/os/CancellationSignal;)Ljava/lang/String;
+HSPLandroid/database/sqlite/SQLiteConnection;->executePerConnectionSqlFromConfiguration(I)V
 HSPLandroid/database/sqlite/SQLiteConnection;->finalize()V
 HSPLandroid/database/sqlite/SQLiteConnection;->finalizePreparedStatement(Landroid/database/sqlite/SQLiteConnection$PreparedStatement;)V
 HSPLandroid/database/sqlite/SQLiteConnection;->getConnectionId()I
@@ -8581,7 +7306,6 @@
 HSPLandroid/database/sqlite/SQLiteConnectionPool;->closeExcessConnectionsAndLogExceptionsLocked()V
 HSPLandroid/database/sqlite/SQLiteConnectionPool;->collectDbStats(Ljava/util/ArrayList;)V
 HSPLandroid/database/sqlite/SQLiteConnectionPool;->disableIdleConnectionHandler()V
-HSPLandroid/database/sqlite/SQLiteConnectionPool;->discardAcquiredConnectionsLocked()V
 HSPLandroid/database/sqlite/SQLiteConnectionPool;->dispose(Z)V
 HSPLandroid/database/sqlite/SQLiteConnectionPool;->dump(Landroid/util/Printer;ZLandroid/util/ArraySet;)V
 HSPLandroid/database/sqlite/SQLiteConnectionPool;->finalize()V
@@ -8601,7 +7325,6 @@
 HSPLandroid/database/sqlite/SQLiteConnectionPool;->releaseConnection(Landroid/database/sqlite/SQLiteConnection;)V
 HSPLandroid/database/sqlite/SQLiteConnectionPool;->setMaxConnectionPoolSizeLocked()V
 HSPLandroid/database/sqlite/SQLiteConnectionPool;->setupIdleConnectionHandler(Landroid/os/Looper;J)V
-HSPLandroid/database/sqlite/SQLiteConnectionPool;->shouldYieldConnection(Landroid/database/sqlite/SQLiteConnection;I)Z
 HSPLandroid/database/sqlite/SQLiteConnectionPool;->throwIfClosedLocked()V
 HSPLandroid/database/sqlite/SQLiteConnectionPool;->tryAcquireNonPrimaryConnectionLocked(Ljava/lang/String;I)Landroid/database/sqlite/SQLiteConnection;
 HSPLandroid/database/sqlite/SQLiteConnectionPool;->tryAcquirePrimaryConnectionLocked(I)Landroid/database/sqlite/SQLiteConnection;
@@ -8617,8 +7340,6 @@
 HSPLandroid/database/sqlite/SQLiteCursor;->getCount()I
 HSPLandroid/database/sqlite/SQLiteCursor;->getDatabase()Landroid/database/sqlite/SQLiteDatabase;
 HSPLandroid/database/sqlite/SQLiteCursor;->onMove(II)Z
-HSPLandroid/database/sqlite/SQLiteCursor;->setWindow(Landroid/database/CursorWindow;)V
-HSPLandroid/database/sqlite/SQLiteDatabase$1;-><init>(Ljava/lang/String;)V
 HSPLandroid/database/sqlite/SQLiteDatabase$1;->accept(Ljava/io/File;)Z
 HSPLandroid/database/sqlite/SQLiteDatabase$OpenParams$Builder;-><init>()V
 HSPLandroid/database/sqlite/SQLiteDatabase$OpenParams$Builder;-><init>(Landroid/database/sqlite/SQLiteDatabase$OpenParams;)V
@@ -8640,7 +7361,6 @@
 HSPLandroid/database/sqlite/SQLiteDatabase$OpenParams;->access$500(Landroid/database/sqlite/SQLiteDatabase$OpenParams;)J
 HSPLandroid/database/sqlite/SQLiteDatabase$OpenParams;->access$600(Landroid/database/sqlite/SQLiteDatabase$OpenParams;)Ljava/lang/String;
 HSPLandroid/database/sqlite/SQLiteDatabase$OpenParams;->access$700(Landroid/database/sqlite/SQLiteDatabase$OpenParams;)Ljava/lang/String;
-HSPLandroid/database/sqlite/SQLiteDatabase$OpenParams;->toBuilder()Landroid/database/sqlite/SQLiteDatabase$OpenParams$Builder;
 HSPLandroid/database/sqlite/SQLiteDatabase;-><init>(Ljava/lang/String;ILandroid/database/sqlite/SQLiteDatabase$CursorFactory;Landroid/database/DatabaseErrorHandler;IIJLjava/lang/String;Ljava/lang/String;)V
 HSPLandroid/database/sqlite/SQLiteDatabase;->beginTransaction()V
 HSPLandroid/database/sqlite/SQLiteDatabase;->beginTransaction(Landroid/database/sqlite/SQLiteTransactionListener;Z)V
@@ -8650,8 +7370,6 @@
 HSPLandroid/database/sqlite/SQLiteDatabase;->compileStatement(Ljava/lang/String;)Landroid/database/sqlite/SQLiteStatement;
 HSPLandroid/database/sqlite/SQLiteDatabase;->createSession()Landroid/database/sqlite/SQLiteSession;
 HSPLandroid/database/sqlite/SQLiteDatabase;->delete(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)I
-HSPLandroid/database/sqlite/SQLiteDatabase;->deleteDatabase(Ljava/io/File;)Z
-HSPLandroid/database/sqlite/SQLiteDatabase;->deleteDatabase(Ljava/io/File;Z)Z
 HSPLandroid/database/sqlite/SQLiteDatabase;->disableWriteAheadLogging()V
 HSPLandroid/database/sqlite/SQLiteDatabase;->dispose(Z)V
 HSPLandroid/database/sqlite/SQLiteDatabase;->dump(Landroid/util/Printer;ZZLandroid/util/ArraySet;)V
@@ -8667,9 +7385,6 @@
 HSPLandroid/database/sqlite/SQLiteDatabase;->getActiveDatabases()Ljava/util/ArrayList;
 HSPLandroid/database/sqlite/SQLiteDatabase;->getDbStats()Ljava/util/ArrayList;
 HSPLandroid/database/sqlite/SQLiteDatabase;->getFileTimestamps(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/database/sqlite/SQLiteDatabase;->getLabel()Ljava/lang/String;
-HSPLandroid/database/sqlite/SQLiteDatabase;->getMaximumSize()J
-HSPLandroid/database/sqlite/SQLiteDatabase;->getPageSize()J
 HSPLandroid/database/sqlite/SQLiteDatabase;->getPath()Ljava/lang/String;
 HSPLandroid/database/sqlite/SQLiteDatabase;->getThreadDefaultConnectionFlags(Z)I
 HSPLandroid/database/sqlite/SQLiteDatabase;->getThreadSession()Landroid/database/sqlite/SQLiteSession;
@@ -8678,7 +7393,6 @@
 HSPLandroid/database/sqlite/SQLiteDatabase;->insert(Ljava/lang/String;Ljava/lang/String;Landroid/content/ContentValues;)J
 HSPLandroid/database/sqlite/SQLiteDatabase;->insertOrThrow(Ljava/lang/String;Ljava/lang/String;Landroid/content/ContentValues;)J
 HSPLandroid/database/sqlite/SQLiteDatabase;->insertWithOnConflict(Ljava/lang/String;Ljava/lang/String;Landroid/content/ContentValues;I)J
-HSPLandroid/database/sqlite/SQLiteDatabase;->isDbLockedByCurrentThread()Z
 HSPLandroid/database/sqlite/SQLiteDatabase;->isMainThread()Z
 HSPLandroid/database/sqlite/SQLiteDatabase;->isOpen()Z
 HSPLandroid/database/sqlite/SQLiteDatabase;->isReadOnly()Z
@@ -8688,18 +7402,14 @@
 HSPLandroid/database/sqlite/SQLiteDatabase;->onAllReferencesReleased()V
 HSPLandroid/database/sqlite/SQLiteDatabase;->open()V
 HSPLandroid/database/sqlite/SQLiteDatabase;->openDatabase(Ljava/io/File;Landroid/database/sqlite/SQLiteDatabase$OpenParams;)Landroid/database/sqlite/SQLiteDatabase;
-HSPLandroid/database/sqlite/SQLiteDatabase;->openDatabase(Ljava/lang/String;Landroid/database/sqlite/SQLiteDatabase$CursorFactory;I)Landroid/database/sqlite/SQLiteDatabase;
 HSPLandroid/database/sqlite/SQLiteDatabase;->openDatabase(Ljava/lang/String;Landroid/database/sqlite/SQLiteDatabase$CursorFactory;ILandroid/database/DatabaseErrorHandler;)Landroid/database/sqlite/SQLiteDatabase;
 HSPLandroid/database/sqlite/SQLiteDatabase;->openDatabase(Ljava/lang/String;Landroid/database/sqlite/SQLiteDatabase$OpenParams;)Landroid/database/sqlite/SQLiteDatabase;
 HSPLandroid/database/sqlite/SQLiteDatabase;->openInner()V
-HSPLandroid/database/sqlite/SQLiteDatabase;->openOrCreateDatabase(Ljava/io/File;Landroid/database/sqlite/SQLiteDatabase$CursorFactory;)Landroid/database/sqlite/SQLiteDatabase;
-HSPLandroid/database/sqlite/SQLiteDatabase;->openOrCreateDatabase(Ljava/lang/String;Landroid/database/sqlite/SQLiteDatabase$CursorFactory;)Landroid/database/sqlite/SQLiteDatabase;
 HSPLandroid/database/sqlite/SQLiteDatabase;->query(Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;
 HSPLandroid/database/sqlite/SQLiteDatabase;->query(Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;
 HSPLandroid/database/sqlite/SQLiteDatabase;->query(ZLjava/lang/String;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;
 HSPLandroid/database/sqlite/SQLiteDatabase;->queryWithFactory(Landroid/database/sqlite/SQLiteDatabase$CursorFactory;ZLjava/lang/String;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/database/Cursor;
 HSPLandroid/database/sqlite/SQLiteDatabase;->rawQuery(Ljava/lang/String;[Ljava/lang/String;)Landroid/database/Cursor;
-HSPLandroid/database/sqlite/SQLiteDatabase;->rawQuery(Ljava/lang/String;[Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/database/Cursor;
 HSPLandroid/database/sqlite/SQLiteDatabase;->rawQueryWithFactory(Landroid/database/sqlite/SQLiteDatabase$CursorFactory;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;
 HSPLandroid/database/sqlite/SQLiteDatabase;->rawQueryWithFactory(Landroid/database/sqlite/SQLiteDatabase$CursorFactory;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/database/Cursor;
 HSPLandroid/database/sqlite/SQLiteDatabase;->releaseMemory()I
@@ -8712,8 +7422,6 @@
 HSPLandroid/database/sqlite/SQLiteDatabase;->update(Ljava/lang/String;Landroid/content/ContentValues;Ljava/lang/String;[Ljava/lang/String;)I
 HSPLandroid/database/sqlite/SQLiteDatabase;->updateWithOnConflict(Ljava/lang/String;Landroid/content/ContentValues;Ljava/lang/String;[Ljava/lang/String;I)I
 HSPLandroid/database/sqlite/SQLiteDatabase;->validateSql(Ljava/lang/String;Landroid/os/CancellationSignal;)V
-HSPLandroid/database/sqlite/SQLiteDatabase;->yieldIfContendedHelper(ZJ)Z
-HSPLandroid/database/sqlite/SQLiteDatabase;->yieldIfContendedSafely(J)Z
 HSPLandroid/database/sqlite/SQLiteDatabaseConfiguration;-><init>(Landroid/database/sqlite/SQLiteDatabaseConfiguration;)V
 HSPLandroid/database/sqlite/SQLiteDatabaseConfiguration;-><init>(Ljava/lang/String;I)V
 HSPLandroid/database/sqlite/SQLiteDatabaseConfiguration;->isInMemoryDb()Z
@@ -8731,7 +7439,6 @@
 HSPLandroid/database/sqlite/SQLiteDirectCursorDriver;-><init>(Landroid/database/sqlite/SQLiteDatabase;Ljava/lang/String;Ljava/lang/String;Landroid/os/CancellationSignal;)V
 HSPLandroid/database/sqlite/SQLiteDirectCursorDriver;->cursorClosed()V
 HSPLandroid/database/sqlite/SQLiteDirectCursorDriver;->query(Landroid/database/sqlite/SQLiteDatabase$CursorFactory;[Ljava/lang/String;)Landroid/database/Cursor;
-HSPLandroid/database/sqlite/SQLiteDoneException;-><init>()V
 HSPLandroid/database/sqlite/SQLiteException;-><init>(Ljava/lang/String;)V
 HSPLandroid/database/sqlite/SQLiteGlobal;->checkDbWipe()Z
 HSPLandroid/database/sqlite/SQLiteGlobal;->getDefaultJournalMode()Ljava/lang/String;
@@ -8762,7 +7469,6 @@
 HSPLandroid/database/sqlite/SQLiteProgram;->bind(ILjava/lang/Object;)V
 HSPLandroid/database/sqlite/SQLiteProgram;->bindAllArgsAsStrings([Ljava/lang/String;)V
 HSPLandroid/database/sqlite/SQLiteProgram;->bindBlob(I[B)V
-HSPLandroid/database/sqlite/SQLiteProgram;->bindDouble(ID)V
 HSPLandroid/database/sqlite/SQLiteProgram;->bindLong(IJ)V
 HSPLandroid/database/sqlite/SQLiteProgram;->bindNull(I)V
 HSPLandroid/database/sqlite/SQLiteProgram;->bindString(ILjava/lang/String;)V
@@ -8789,11 +7495,9 @@
 HSPLandroid/database/sqlite/SQLiteQueryBuilder;->isStrict()Z
 HSPLandroid/database/sqlite/SQLiteQueryBuilder;->isStrictColumns()Z
 HSPLandroid/database/sqlite/SQLiteQueryBuilder;->isStrictGrammar()Z
-HSPLandroid/database/sqlite/SQLiteQueryBuilder;->maybeWithOperator(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
 HSPLandroid/database/sqlite/SQLiteQueryBuilder;->query(Landroid/database/sqlite/SQLiteDatabase;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;
 HSPLandroid/database/sqlite/SQLiteQueryBuilder;->query(Landroid/database/sqlite/SQLiteDatabase;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;
 HSPLandroid/database/sqlite/SQLiteQueryBuilder;->query(Landroid/database/sqlite/SQLiteDatabase;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/database/Cursor;
-HSPLandroid/database/sqlite/SQLiteQueryBuilder;->setDistinct(Z)V
 HSPLandroid/database/sqlite/SQLiteQueryBuilder;->setProjectionMap(Ljava/util/Map;)V
 HSPLandroid/database/sqlite/SQLiteQueryBuilder;->setStrict(Z)V
 HSPLandroid/database/sqlite/SQLiteQueryBuilder;->setTables(Ljava/lang/String;)V
@@ -8811,7 +7515,6 @@
 HSPLandroid/database/sqlite/SQLiteSession;->executeForCursorWindow(Ljava/lang/String;[Ljava/lang/Object;Landroid/database/CursorWindow;IIZILandroid/os/CancellationSignal;)I
 HSPLandroid/database/sqlite/SQLiteSession;->executeForLastInsertedRowId(Ljava/lang/String;[Ljava/lang/Object;ILandroid/os/CancellationSignal;)J
 HSPLandroid/database/sqlite/SQLiteSession;->executeForLong(Ljava/lang/String;[Ljava/lang/Object;ILandroid/os/CancellationSignal;)J
-HSPLandroid/database/sqlite/SQLiteSession;->executeForString(Ljava/lang/String;[Ljava/lang/Object;ILandroid/os/CancellationSignal;)Ljava/lang/String;
 HSPLandroid/database/sqlite/SQLiteSession;->executeSpecial(Ljava/lang/String;[Ljava/lang/Object;ILandroid/os/CancellationSignal;)Z
 HSPLandroid/database/sqlite/SQLiteSession;->hasTransaction()Z
 HSPLandroid/database/sqlite/SQLiteSession;->obtainTransaction(ILandroid/database/sqlite/SQLiteTransactionListener;)Landroid/database/sqlite/SQLiteSession$Transaction;
@@ -8821,14 +7524,11 @@
 HSPLandroid/database/sqlite/SQLiteSession;->setTransactionSuccessful()V
 HSPLandroid/database/sqlite/SQLiteSession;->throwIfNoTransaction()V
 HSPLandroid/database/sqlite/SQLiteSession;->throwIfTransactionMarkedSuccessful()V
-HSPLandroid/database/sqlite/SQLiteSession;->yieldTransaction(JZLandroid/os/CancellationSignal;)Z
-HSPLandroid/database/sqlite/SQLiteSession;->yieldTransactionUnchecked(JLandroid/os/CancellationSignal;)Z
 HSPLandroid/database/sqlite/SQLiteStatement;-><init>(Landroid/database/sqlite/SQLiteDatabase;Ljava/lang/String;[Ljava/lang/Object;)V
 HSPLandroid/database/sqlite/SQLiteStatement;->execute()V
 HSPLandroid/database/sqlite/SQLiteStatement;->executeInsert()J
 HSPLandroid/database/sqlite/SQLiteStatement;->executeUpdateDelete()I
 HSPLandroid/database/sqlite/SQLiteStatement;->simpleQueryForLong()J
-HSPLandroid/database/sqlite/SQLiteStatement;->simpleQueryForString()Ljava/lang/String;
 HSPLandroid/database/sqlite/SQLiteStatementInfo;-><init>()V
 HSPLandroid/ddm/DdmHandleAppName$Names;-><init>(Ljava/lang/String;Ljava/lang/String;)V
 HSPLandroid/ddm/DdmHandleAppName$Names;-><init>(Ljava/lang/String;Ljava/lang/String;Landroid/ddm/DdmHandleAppName$1;)V
@@ -8861,7 +7561,6 @@
 HSPLandroid/ddm/DdmHandleViewDebug;->connected()V
 HSPLandroid/ddm/DdmHandleViewDebug;->disconnected()V
 HSPLandroid/debug/AdbManagerInternal;-><init>()V
-HSPLandroid/debug/IAdbManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HSPLandroid/debug/IAdbManager$Stub;-><init>()V
 HSPLandroid/debug/IAdbManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/debug/IAdbManager;
 HPLandroid/debug/IAdbManager$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
@@ -8870,10 +7569,11 @@
 HSPLandroid/graphics/-$$Lambda$ColorSpace$Rgb$8EkhO2jIf14tuA3BvrmYJMa7YXM;-><init>(Landroid/graphics/ColorSpace$Rgb;)V
 HSPLandroid/graphics/-$$Lambda$ColorSpace$Rgb$8EkhO2jIf14tuA3BvrmYJMa7YXM;->applyAsDouble(D)D
 HSPLandroid/graphics/-$$Lambda$ColorSpace$Rgb$b9VGKuNnse0bbguR9jbOM_wK2Ac;->applyAsDouble(D)D
-HSPLandroid/graphics/-$$Lambda$HardwareRendererObserver$Z08IFApIdHoCBfw8BsQ-lVjpUlI;-><init>(Landroid/graphics/HardwareRendererObserver;)V
-HSPLandroid/graphics/-$$Lambda$HardwareRendererObserver$Z08IFApIdHoCBfw8BsQ-lVjpUlI;->run()V
+HSPLandroid/graphics/BLASTBufferQueue;-><init>(Landroid/view/SurfaceControl;II)V
+HSPLandroid/graphics/BLASTBufferQueue;->finalize()V
+HSPLandroid/graphics/BLASTBufferQueue;->getSurface()Landroid/view/Surface;
+HSPLandroid/graphics/BLASTBufferQueue;->update(Landroid/view/SurfaceControl;II)V
 HSPLandroid/graphics/BaseCanvas;-><init>()V
-HSPLandroid/graphics/BaseCanvas;->drawARGB(IIII)V
 HSPLandroid/graphics/BaseCanvas;->drawBitmap(Landroid/graphics/Bitmap;FFLandroid/graphics/Paint;)V
 HSPLandroid/graphics/BaseCanvas;->drawBitmap(Landroid/graphics/Bitmap;Landroid/graphics/Matrix;Landroid/graphics/Paint;)V
 HSPLandroid/graphics/BaseCanvas;->drawBitmap(Landroid/graphics/Bitmap;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Paint;)V
@@ -8881,7 +7581,6 @@
 HSPLandroid/graphics/BaseCanvas;->drawCircle(FFFLandroid/graphics/Paint;)V
 HSPLandroid/graphics/BaseCanvas;->drawColor(I)V
 HSPLandroid/graphics/BaseCanvas;->drawColor(ILandroid/graphics/PorterDuff$Mode;)V
-HSPLandroid/graphics/BaseCanvas;->drawLine(FFFFLandroid/graphics/Paint;)V
 HSPLandroid/graphics/BaseCanvas;->drawOval(FFFFLandroid/graphics/Paint;)V
 HSPLandroid/graphics/BaseCanvas;->drawOval(Landroid/graphics/RectF;Landroid/graphics/Paint;)V
 HSPLandroid/graphics/BaseCanvas;->drawPath(Landroid/graphics/Path;Landroid/graphics/Paint;)V
@@ -8919,7 +7618,6 @@
 HSPLandroid/graphics/BaseRecordingCanvas;->drawRoundRect(Landroid/graphics/RectF;FFLandroid/graphics/Paint;)V
 HSPLandroid/graphics/BaseRecordingCanvas;->drawText(Ljava/lang/CharSequence;IIFFLandroid/graphics/Paint;)V
 HSPLandroid/graphics/BaseRecordingCanvas;->drawText(Ljava/lang/String;FFLandroid/graphics/Paint;)V
-HSPLandroid/graphics/BaseRecordingCanvas;->drawText([CIIFFLandroid/graphics/Paint;)V
 HSPLandroid/graphics/BaseRecordingCanvas;->drawTextRun(Ljava/lang/CharSequence;IIIIFFZLandroid/graphics/Paint;)V
 HSPLandroid/graphics/BaseRecordingCanvas;->drawTextRun([CIIIIFFZLandroid/graphics/Paint;)V
 HSPLandroid/graphics/Bitmap$1;->createFromParcel(Landroid/os/Parcel;)Landroid/graphics/Bitmap;
@@ -8986,7 +7684,6 @@
 HSPLandroid/graphics/Bitmap;->setDensity(I)V
 HSPLandroid/graphics/Bitmap;->setHasAlpha(Z)V
 HSPLandroid/graphics/Bitmap;->setHasMipMap(Z)V
-HSPLandroid/graphics/Bitmap;->setPixels([IIIIIII)V
 HSPLandroid/graphics/Bitmap;->setPremultiplied(Z)V
 HSPLandroid/graphics/Bitmap;->wrapHardwareBuffer(Landroid/graphics/GraphicBuffer;Landroid/graphics/ColorSpace;)Landroid/graphics/Bitmap;
 HSPLandroid/graphics/Bitmap;->wrapHardwareBuffer(Landroid/hardware/HardwareBuffer;Landroid/graphics/ColorSpace;)Landroid/graphics/Bitmap;
@@ -8997,7 +7694,6 @@
 HSPLandroid/graphics/BitmapFactory$Options;->validate(Landroid/graphics/BitmapFactory$Options;)V
 HSPLandroid/graphics/BitmapFactory;->decodeByteArray([BII)Landroid/graphics/Bitmap;
 HSPLandroid/graphics/BitmapFactory;->decodeByteArray([BIILandroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap;
-HSPLandroid/graphics/BitmapFactory;->decodeFile(Ljava/lang/String;)Landroid/graphics/Bitmap;
 HSPLandroid/graphics/BitmapFactory;->decodeFile(Ljava/lang/String;Landroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap;
 HSPLandroid/graphics/BitmapFactory;->decodeFileDescriptor(Ljava/io/FileDescriptor;)Landroid/graphics/Bitmap;
 HSPLandroid/graphics/BitmapFactory;->decodeFileDescriptor(Ljava/io/FileDescriptor;Landroid/graphics/Rect;Landroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap;
@@ -9042,9 +7738,6 @@
 HSPLandroid/graphics/Canvas;->clipRect(Landroid/graphics/Rect;Landroid/graphics/Region$Op;)Z
 HSPLandroid/graphics/Canvas;->clipRect(Landroid/graphics/RectF;)Z
 HSPLandroid/graphics/Canvas;->concat(Landroid/graphics/Matrix;)V
-HSPLandroid/graphics/Canvas;->drawARGB(IIII)V
-HSPLandroid/graphics/Canvas;->drawArc(FFFFFFZLandroid/graphics/Paint;)V
-HSPLandroid/graphics/Canvas;->drawArc(Landroid/graphics/RectF;FFZLandroid/graphics/Paint;)V
 HSPLandroid/graphics/Canvas;->drawBitmap(Landroid/graphics/Bitmap;FFLandroid/graphics/Paint;)V
 HSPLandroid/graphics/Canvas;->drawBitmap(Landroid/graphics/Bitmap;Landroid/graphics/Matrix;Landroid/graphics/Paint;)V
 HSPLandroid/graphics/Canvas;->drawBitmap(Landroid/graphics/Bitmap;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Paint;)V
@@ -9052,7 +7745,6 @@
 HSPLandroid/graphics/Canvas;->drawCircle(FFFLandroid/graphics/Paint;)V
 HSPLandroid/graphics/Canvas;->drawColor(I)V
 HSPLandroid/graphics/Canvas;->drawColor(ILandroid/graphics/PorterDuff$Mode;)V
-HSPLandroid/graphics/Canvas;->drawLine(FFFFLandroid/graphics/Paint;)V
 HSPLandroid/graphics/Canvas;->drawOval(FFFFLandroid/graphics/Paint;)V
 HSPLandroid/graphics/Canvas;->drawOval(Landroid/graphics/RectF;Landroid/graphics/Paint;)V
 HSPLandroid/graphics/Canvas;->drawPaint(Landroid/graphics/Paint;)V
@@ -9112,17 +7804,19 @@
 HSPLandroid/graphics/Color;->alpha(I)I
 HSPLandroid/graphics/Color;->alpha(J)F
 HSPLandroid/graphics/Color;->argb(IIII)I
+HSPLandroid/graphics/Color;->blue()F
 HSPLandroid/graphics/Color;->blue(I)I
 HSPLandroid/graphics/Color;->blue(J)F
 HSPLandroid/graphics/Color;->colorSpace(J)Landroid/graphics/ColorSpace;
 HSPLandroid/graphics/Color;->colorToHSV(I[F)V
-HSPLandroid/graphics/Color;->getHtmlColor(Ljava/lang/String;)I
+HSPLandroid/graphics/Color;->green()F
 HSPLandroid/graphics/Color;->green(I)I
 HSPLandroid/graphics/Color;->green(J)F
 HSPLandroid/graphics/Color;->luminance(I)F
 HSPLandroid/graphics/Color;->pack(FFFFLandroid/graphics/ColorSpace;)J
 HSPLandroid/graphics/Color;->pack(I)J
 HSPLandroid/graphics/Color;->parseColor(Ljava/lang/String;)I
+HSPLandroid/graphics/Color;->red()F
 HSPLandroid/graphics/Color;->red(I)I
 HSPLandroid/graphics/Color;->red(J)F
 HSPLandroid/graphics/Color;->rgb(III)I
@@ -9178,7 +7872,9 @@
 HSPLandroid/graphics/ColorSpace$Rgb;->xyWhitePoint([F)[F
 HSPLandroid/graphics/ColorSpace;-><init>(Ljava/lang/String;Landroid/graphics/ColorSpace$Model;I)V
 HSPLandroid/graphics/ColorSpace;-><init>(Ljava/lang/String;Landroid/graphics/ColorSpace$Model;ILandroid/graphics/ColorSpace$1;)V
+HSPLandroid/graphics/ColorSpace;->access$1100([F)[F
 HSPLandroid/graphics/ColorSpace;->access$1200([F)[F
+HSPLandroid/graphics/ColorSpace;->access$1200([F[F)[F
 HSPLandroid/graphics/ColorSpace;->access$1300([F[F)[F
 HSPLandroid/graphics/ColorSpace;->access$1600()[F
 HSPLandroid/graphics/ColorSpace;->access$1700([F[F)Z
@@ -9242,7 +7938,6 @@
 HSPLandroid/graphics/HardwareRenderer;->access$500(J)I
 HSPLandroid/graphics/HardwareRenderer;->access$600()V
 HSPLandroid/graphics/HardwareRenderer;->access$700(I)V
-HSPLandroid/graphics/HardwareRenderer;->addObserver(Landroid/graphics/HardwareRendererObserver;)V
 HSPLandroid/graphics/HardwareRenderer;->allocateBuffers()V
 HSPLandroid/graphics/HardwareRenderer;->buildLayer(Landroid/graphics/RenderNode;)V
 HSPLandroid/graphics/HardwareRenderer;->clearContent()V
@@ -9260,7 +7955,6 @@
 HSPLandroid/graphics/HardwareRenderer;->pushLayerUpdate(Landroid/view/TextureLayer;)V
 HSPLandroid/graphics/HardwareRenderer;->registerAnimatingRenderNode(Landroid/graphics/RenderNode;)V
 HSPLandroid/graphics/HardwareRenderer;->registerVectorDrawableAnimator(Landroid/view/NativeVectorDrawableAnimator;)V
-HSPLandroid/graphics/HardwareRenderer;->removeObserver(Landroid/graphics/HardwareRendererObserver;)V
 HSPLandroid/graphics/HardwareRenderer;->setDebuggingEnabled(Z)V
 HSPLandroid/graphics/HardwareRenderer;->setFPSDivisor(I)V
 HSPLandroid/graphics/HardwareRenderer;->setForceDark(Z)Z
@@ -9282,10 +7976,6 @@
 HSPLandroid/graphics/HardwareRenderer;->validateAlpha(FLjava/lang/String;)V
 HSPLandroid/graphics/HardwareRenderer;->validateFinite(FLjava/lang/String;)V
 HSPLandroid/graphics/HardwareRenderer;->validatePositive(FLjava/lang/String;)V
-HSPLandroid/graphics/HardwareRendererObserver;-><init>(Landroid/graphics/HardwareRendererObserver$OnFrameMetricsAvailableListener;[JLandroid/os/Handler;)V
-HSPLandroid/graphics/HardwareRendererObserver;->getNativeInstance()J
-HSPLandroid/graphics/HardwareRendererObserver;->lambda$notifyDataAvailable$0$HardwareRendererObserver()V
-HSPLandroid/graphics/HardwareRendererObserver;->notifyDataAvailable()V
 HSPLandroid/graphics/ImageDecoder$AssetInputStreamSource;-><init>(Landroid/content/res/AssetManager$AssetInputStream;Landroid/content/res/Resources;Landroid/util/TypedValue;)V
 HSPLandroid/graphics/ImageDecoder$AssetInputStreamSource;->createImageDecoder(Z)Landroid/graphics/ImageDecoder;
 HSPLandroid/graphics/ImageDecoder$AssetInputStreamSource;->getDensity()I
@@ -9459,8 +8149,6 @@
 HSPLandroid/graphics/Paint;->getTextScaleX()F
 HSPLandroid/graphics/Paint;->getTextSize()F
 HSPLandroid/graphics/Paint;->getTextSkewX()F
-HSPLandroid/graphics/Paint;->getTextWidths(Ljava/lang/String;II[F)I
-HSPLandroid/graphics/Paint;->getTextWidths(Ljava/lang/String;[F)I
 HSPLandroid/graphics/Paint;->getTypeface()Landroid/graphics/Typeface;
 HSPLandroid/graphics/Paint;->getUnderlinePosition()F
 HSPLandroid/graphics/Paint;->getUnderlineThickness()F
@@ -9521,8 +8209,6 @@
 HSPLandroid/graphics/Path$Op;-><init>(Ljava/lang/String;I)V
 HSPLandroid/graphics/Path;-><init>()V
 HSPLandroid/graphics/Path;-><init>(Landroid/graphics/Path;)V
-HSPLandroid/graphics/Path;->addArc(FFFFFF)V
-HSPLandroid/graphics/Path;->addArc(Landroid/graphics/RectF;FF)V
 HSPLandroid/graphics/Path;->addCircle(FFFLandroid/graphics/Path$Direction;)V
 HSPLandroid/graphics/Path;->addOval(FFFFLandroid/graphics/Path$Direction;)V
 HSPLandroid/graphics/Path;->addOval(Landroid/graphics/RectF;Landroid/graphics/Path$Direction;)V
@@ -9593,6 +8279,7 @@
 HSPLandroid/graphics/Point;->offset(II)V
 HSPLandroid/graphics/Point;->readFromParcel(Landroid/os/Parcel;)V
 HSPLandroid/graphics/Point;->set(II)V
+HSPLandroid/graphics/Point;->toString()Ljava/lang/String;
 HSPLandroid/graphics/Point;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/graphics/PointF;-><init>()V
 HSPLandroid/graphics/PointF;-><init>(FF)V
@@ -9616,7 +8303,6 @@
 HSPLandroid/graphics/RecordingCanvas;->drawCircle(Landroid/graphics/CanvasProperty;Landroid/graphics/CanvasProperty;Landroid/graphics/CanvasProperty;Landroid/graphics/CanvasProperty;)V
 HSPLandroid/graphics/RecordingCanvas;->drawRenderNode(Landroid/graphics/RenderNode;)V
 HSPLandroid/graphics/RecordingCanvas;->drawTextureLayer(Landroid/view/TextureLayer;)V
-HSPLandroid/graphics/RecordingCanvas;->drawWebViewFunctor(I)V
 HSPLandroid/graphics/RecordingCanvas;->enableZ()V
 HSPLandroid/graphics/RecordingCanvas;->finishRecording()J
 HSPLandroid/graphics/RecordingCanvas;->getHeight()I
@@ -9773,7 +8459,6 @@
 HSPLandroid/graphics/RenderNode;->setPivotY(F)Z
 HSPLandroid/graphics/RenderNode;->setProjectBackwards(Z)Z
 HSPLandroid/graphics/RenderNode;->setProjectionReceiver(Z)Z
-HSPLandroid/graphics/RenderNode;->setRevealClip(ZFFF)Z
 HSPLandroid/graphics/RenderNode;->setRight(I)Z
 HSPLandroid/graphics/RenderNode;->setRotationZ(F)Z
 HSPLandroid/graphics/RenderNode;->setScaleX(F)Z
@@ -9808,7 +8493,6 @@
 HSPLandroid/graphics/SurfaceTexture;->updateTexImage()V
 HSPLandroid/graphics/TemporaryBuffer;->obtain(I)[C
 HSPLandroid/graphics/TemporaryBuffer;->recycle([C)V
-HSPLandroid/graphics/Typeface$Builder;-><init>(Landroid/content/res/AssetManager;Ljava/lang/String;)V
 HSPLandroid/graphics/Typeface$Builder;-><init>(Landroid/content/res/AssetManager;Ljava/lang/String;ZI)V
 HSPLandroid/graphics/Typeface$Builder;->access$000(Landroid/content/res/AssetManager;Ljava/lang/String;I[Landroid/graphics/fonts/FontVariationAxis;IILjava/lang/String;)Ljava/lang/String;
 HSPLandroid/graphics/Typeface$Builder;->build()Landroid/graphics/Typeface;
@@ -9895,6 +8579,7 @@
 HSPLandroid/graphics/drawable/AdaptiveIconDrawable;->jumpToCurrentState()V
 HSPLandroid/graphics/drawable/AdaptiveIconDrawable;->mutate()Landroid/graphics/drawable/Drawable;
 HSPLandroid/graphics/drawable/AdaptiveIconDrawable;->onBoundsChange(Landroid/graphics/Rect;)V
+HSPLandroid/graphics/drawable/AdaptiveIconDrawable;->onStateChange([I)Z
 HSPLandroid/graphics/drawable/AdaptiveIconDrawable;->resumeChildInvalidation()V
 HSPLandroid/graphics/drawable/AdaptiveIconDrawable;->setVisible(ZZ)Z
 HSPLandroid/graphics/drawable/AdaptiveIconDrawable;->suspendChildInvalidation()V
@@ -9916,7 +8601,6 @@
 HSPLandroid/graphics/drawable/AnimatedStateListDrawable$AnimatedStateListState;->mutate()V
 HSPLandroid/graphics/drawable/AnimatedStateListDrawable$AnimatedStateListState;->newDrawable(Landroid/content/res/Resources;)Landroid/graphics/drawable/Drawable;
 HSPLandroid/graphics/drawable/AnimatedStateListDrawable$AnimatedStateListState;->transitionHasReversibleFlag(II)Z
-HSPLandroid/graphics/drawable/AnimatedStateListDrawable$AnimatedVectorDrawableTransition;-><init>(Landroid/graphics/drawable/AnimatedVectorDrawable;ZZ)V
 HSPLandroid/graphics/drawable/AnimatedStateListDrawable$AnimatedVectorDrawableTransition;->start()V
 HSPLandroid/graphics/drawable/AnimatedStateListDrawable$AnimatedVectorDrawableTransition;->stop()V
 HSPLandroid/graphics/drawable/AnimatedStateListDrawable$AnimationDrawableTransition;-><init>(Landroid/graphics/drawable/AnimationDrawable;ZZ)V
@@ -10091,7 +8775,6 @@
 HSPLandroid/graphics/drawable/BitmapDrawable$BitmapState;->newDrawable(Landroid/content/res/Resources;)Landroid/graphics/drawable/Drawable;
 HSPLandroid/graphics/drawable/BitmapDrawable;-><init>()V
 HSPLandroid/graphics/drawable/BitmapDrawable;-><init>(Landroid/content/res/Resources;Landroid/graphics/Bitmap;)V
-HSPLandroid/graphics/drawable/BitmapDrawable;-><init>(Landroid/graphics/Bitmap;)V
 HSPLandroid/graphics/drawable/BitmapDrawable;-><init>(Landroid/graphics/drawable/BitmapDrawable$BitmapState;Landroid/content/res/Resources;)V
 HSPLandroid/graphics/drawable/BitmapDrawable;-><init>(Landroid/graphics/drawable/BitmapDrawable$BitmapState;Landroid/content/res/Resources;Landroid/graphics/drawable/BitmapDrawable$1;)V
 HSPLandroid/graphics/drawable/BitmapDrawable;->applyTheme(Landroid/content/res/Resources$Theme;)V
@@ -10135,7 +8818,6 @@
 HSPLandroid/graphics/drawable/ClipDrawable$ClipState;-><init>(Landroid/graphics/drawable/ClipDrawable$ClipState;Landroid/content/res/Resources;)V
 HSPLandroid/graphics/drawable/ClipDrawable$ClipState;->access$002(Landroid/graphics/drawable/ClipDrawable$ClipState;[I)[I
 HSPLandroid/graphics/drawable/ClipDrawable$ClipState;->newDrawable(Landroid/content/res/Resources;)Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/drawable/ClipDrawable;-><init>()V
 HSPLandroid/graphics/drawable/ClipDrawable;-><init>(Landroid/graphics/drawable/ClipDrawable$ClipState;Landroid/content/res/Resources;)V
 HSPLandroid/graphics/drawable/ClipDrawable;-><init>(Landroid/graphics/drawable/ClipDrawable$ClipState;Landroid/content/res/Resources;Landroid/graphics/drawable/ClipDrawable$1;)V
 HSPLandroid/graphics/drawable/ClipDrawable;->draw(Landroid/graphics/Canvas;)V
@@ -10210,7 +8892,6 @@
 HSPLandroid/graphics/drawable/Drawable;->getCallback()Landroid/graphics/drawable/Drawable$Callback;
 HSPLandroid/graphics/drawable/Drawable;->getChangingConfigurations()I
 HSPLandroid/graphics/drawable/Drawable;->getColorFilter()Landroid/graphics/ColorFilter;
-HSPLandroid/graphics/drawable/Drawable;->getConstantState()Landroid/graphics/drawable/Drawable$ConstantState;
 HSPLandroid/graphics/drawable/Drawable;->getCurrent()Landroid/graphics/drawable/Drawable;
 HSPLandroid/graphics/drawable/Drawable;->getDirtyBounds()Landroid/graphics/Rect;
 HSPLandroid/graphics/drawable/Drawable;->getIntrinsicHeight()I
@@ -10278,10 +8959,7 @@
 HSPLandroid/graphics/drawable/DrawableContainer$DrawableContainerState;->getChangingConfigurations()I
 HSPLandroid/graphics/drawable/DrawableContainer$DrawableContainerState;->getChild(I)Landroid/graphics/drawable/Drawable;
 HSPLandroid/graphics/drawable/DrawableContainer$DrawableContainerState;->getChildCount()I
-HSPLandroid/graphics/drawable/DrawableContainer$DrawableContainerState;->getChildren()[Landroid/graphics/drawable/Drawable;
-HSPLandroid/graphics/drawable/DrawableContainer$DrawableContainerState;->getConstantHeight()I
 HSPLandroid/graphics/drawable/DrawableContainer$DrawableContainerState;->getConstantPadding()Landroid/graphics/Rect;
-HSPLandroid/graphics/drawable/DrawableContainer$DrawableContainerState;->getConstantWidth()I
 HSPLandroid/graphics/drawable/DrawableContainer$DrawableContainerState;->getOpacity()I
 HSPLandroid/graphics/drawable/DrawableContainer$DrawableContainerState;->growArray(II)V
 HSPLandroid/graphics/drawable/DrawableContainer$DrawableContainerState;->invalidateCache()V
@@ -10295,7 +8973,6 @@
 HSPLandroid/graphics/drawable/DrawableContainer$DrawableContainerState;->setVariablePadding(Z)V
 HSPLandroid/graphics/drawable/DrawableContainer$DrawableContainerState;->updateDensity(Landroid/content/res/Resources;)V
 HSPLandroid/graphics/drawable/DrawableContainer;-><init>()V
-HSPLandroid/graphics/drawable/DrawableContainer;->animate(Z)V
 HSPLandroid/graphics/drawable/DrawableContainer;->applyTheme(Landroid/content/res/Resources$Theme;)V
 HSPLandroid/graphics/drawable/DrawableContainer;->canApplyTheme()Z
 HSPLandroid/graphics/drawable/DrawableContainer;->clearMutated()V
@@ -10568,7 +9245,6 @@
 HSPLandroid/graphics/drawable/LayerDrawable;->mutate()Landroid/graphics/drawable/Drawable;
 HSPLandroid/graphics/drawable/LayerDrawable;->onBoundsChange(Landroid/graphics/Rect;)V
 HSPLandroid/graphics/drawable/LayerDrawable;->onLayoutDirectionChanged(I)Z
-HSPLandroid/graphics/drawable/LayerDrawable;->onLevelChange(I)Z
 HSPLandroid/graphics/drawable/LayerDrawable;->onStateChange([I)Z
 HSPLandroid/graphics/drawable/LayerDrawable;->refreshChildPadding(ILandroid/graphics/drawable/LayerDrawable$ChildDrawable;)Z
 HSPLandroid/graphics/drawable/LayerDrawable;->refreshPadding()V
@@ -10581,7 +9257,6 @@
 HSPLandroid/graphics/drawable/LayerDrawable;->setDrawable(ILandroid/graphics/drawable/Drawable;)V
 HSPLandroid/graphics/drawable/LayerDrawable;->setDrawableByLayerId(ILandroid/graphics/drawable/Drawable;)Z
 HSPLandroid/graphics/drawable/LayerDrawable;->setHotspot(FF)V
-HSPLandroid/graphics/drawable/LayerDrawable;->setId(II)V
 HSPLandroid/graphics/drawable/LayerDrawable;->setLayerInset(IIIII)V
 HSPLandroid/graphics/drawable/LayerDrawable;->setLayerInsetInternal(IIIIIII)V
 HSPLandroid/graphics/drawable/LayerDrawable;->setPaddingMode(I)V
@@ -10645,7 +9320,6 @@
 HSPLandroid/graphics/drawable/NinePatchDrawable;->onStateChange([I)Z
 HSPLandroid/graphics/drawable/NinePatchDrawable;->setAlpha(I)V
 HSPLandroid/graphics/drawable/NinePatchDrawable;->setAutoMirrored(Z)V
-HSPLandroid/graphics/drawable/NinePatchDrawable;->setColorFilter(Landroid/graphics/ColorFilter;)V
 HSPLandroid/graphics/drawable/NinePatchDrawable;->setDither(Z)V
 HSPLandroid/graphics/drawable/NinePatchDrawable;->setTintBlendMode(Landroid/graphics/BlendMode;)V
 HSPLandroid/graphics/drawable/NinePatchDrawable;->setTintList(Landroid/content/res/ColorStateList;)V
@@ -10655,8 +9329,6 @@
 HSPLandroid/graphics/drawable/RippleBackground$1;->get(Ljava/lang/Object;)Ljava/lang/Object;
 HSPLandroid/graphics/drawable/RippleBackground$1;->setValue(Landroid/graphics/drawable/RippleBackground;F)V
 HSPLandroid/graphics/drawable/RippleBackground$1;->setValue(Ljava/lang/Object;F)V
-HSPLandroid/graphics/drawable/RippleBackground;->access$000(Landroid/graphics/drawable/RippleBackground;)F
-HSPLandroid/graphics/drawable/RippleBackground;->access$002(Landroid/graphics/drawable/RippleBackground;F)F
 HSPLandroid/graphics/drawable/RippleBackground;->isVisible()Z
 HSPLandroid/graphics/drawable/RippleBackground;->jumpToFinal()V
 HSPLandroid/graphics/drawable/RippleBackground;->onStateChanged()V
@@ -10666,7 +9338,6 @@
 HSPLandroid/graphics/drawable/RippleComponent;->invalidateSelf()V
 HSPLandroid/graphics/drawable/RippleComponent;->onBoundsChange()V
 HSPLandroid/graphics/drawable/RippleComponent;->onHotspotBoundsChanged()V
-HSPLandroid/graphics/drawable/RippleComponent;->onTargetRadiusChanged(F)V
 HSPLandroid/graphics/drawable/RippleComponent;->setup(FI)V
 HSPLandroid/graphics/drawable/RippleDrawable$RippleState;-><init>(Landroid/graphics/drawable/LayerDrawable$LayerState;Landroid/graphics/drawable/RippleDrawable;Landroid/content/res/Resources;)V
 HSPLandroid/graphics/drawable/RippleDrawable$RippleState;->applyDensityScaling(II)V
@@ -10783,7 +9454,6 @@
 HSPLandroid/graphics/drawable/RotateDrawable;->draw(Landroid/graphics/Canvas;)V
 HSPLandroid/graphics/drawable/RotateDrawable;->inflate(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)V
 HSPLandroid/graphics/drawable/RotateDrawable;->mutateConstantState()Landroid/graphics/drawable/DrawableWrapper$DrawableWrapperState;
-HSPLandroid/graphics/drawable/RotateDrawable;->onLevelChange(I)Z
 HSPLandroid/graphics/drawable/RotateDrawable;->updateStateFromTypedArray(Landroid/content/res/TypedArray;)V
 HSPLandroid/graphics/drawable/RotateDrawable;->verifyRequiredAttributes(Landroid/content/res/TypedArray;)V
 HSPLandroid/graphics/drawable/ScaleDrawable$ScaleState;-><init>(Landroid/graphics/drawable/ScaleDrawable$ScaleState;Landroid/content/res/Resources;)V
@@ -10843,7 +9513,6 @@
 HSPLandroid/graphics/drawable/StateListDrawable;-><init>(Landroid/graphics/drawable/StateListDrawable$StateListState;)V
 HSPLandroid/graphics/drawable/StateListDrawable;-><init>(Landroid/graphics/drawable/StateListDrawable$StateListState;Landroid/content/res/Resources;)V
 HSPLandroid/graphics/drawable/StateListDrawable;-><init>(Landroid/graphics/drawable/StateListDrawable$StateListState;Landroid/content/res/Resources;Landroid/graphics/drawable/StateListDrawable$1;)V
-HSPLandroid/graphics/drawable/StateListDrawable;->addState([ILandroid/graphics/drawable/Drawable;)V
 HSPLandroid/graphics/drawable/StateListDrawable;->applyTheme(Landroid/content/res/Resources$Theme;)V
 HSPLandroid/graphics/drawable/StateListDrawable;->clearMutated()V
 HSPLandroid/graphics/drawable/StateListDrawable;->cloneConstantState()Landroid/graphics/drawable/DrawableContainer$DrawableContainerState;
@@ -10862,19 +9531,14 @@
 HSPLandroid/graphics/drawable/TransitionDrawable;-><init>()V
 HSPLandroid/graphics/drawable/TransitionDrawable;-><init>(Landroid/graphics/drawable/TransitionDrawable$TransitionState;Landroid/content/res/Resources;)V
 HSPLandroid/graphics/drawable/TransitionDrawable;-><init>(Landroid/graphics/drawable/TransitionDrawable$TransitionState;Landroid/content/res/Resources;Landroid/graphics/drawable/TransitionDrawable$1;)V
-HSPLandroid/graphics/drawable/TransitionDrawable;-><init>(Landroid/graphics/drawable/TransitionDrawable$TransitionState;[Landroid/graphics/drawable/Drawable;)V
-HSPLandroid/graphics/drawable/TransitionDrawable;-><init>([Landroid/graphics/drawable/Drawable;)V
 HSPLandroid/graphics/drawable/TransitionDrawable;->createConstantState(Landroid/graphics/drawable/LayerDrawable$LayerState;Landroid/content/res/Resources;)Landroid/graphics/drawable/LayerDrawable$LayerState;
 HSPLandroid/graphics/drawable/TransitionDrawable;->draw(Landroid/graphics/Canvas;)V
 HSPLandroid/graphics/drawable/TransitionDrawable;->resetTransition()V
 HSPLandroid/graphics/drawable/TransitionDrawable;->setCrossFadeEnabled(Z)V
 HSPLandroid/graphics/drawable/TransitionDrawable;->startTransition(I)V
-HSPLandroid/graphics/drawable/VectorDrawable$VClipPath;-><init>()V
-HSPLandroid/graphics/drawable/VectorDrawable$VClipPath;-><init>(Landroid/graphics/drawable/VectorDrawable$VClipPath;)V
 HSPLandroid/graphics/drawable/VectorDrawable$VClipPath;->canApplyTheme()Z
 HSPLandroid/graphics/drawable/VectorDrawable$VClipPath;->getNativePtr()J
 HSPLandroid/graphics/drawable/VectorDrawable$VClipPath;->getNativeSize()I
-HSPLandroid/graphics/drawable/VectorDrawable$VClipPath;->inflate(Landroid/content/res/Resources;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)V
 HSPLandroid/graphics/drawable/VectorDrawable$VClipPath;->isStateful()Z
 HSPLandroid/graphics/drawable/VectorDrawable$VClipPath;->updateStateFromTypedArray(Landroid/content/res/TypedArray;)V
 HSPLandroid/graphics/drawable/VectorDrawable$VFullPath;-><init>()V
@@ -10966,8 +9630,6 @@
 HSPLandroid/graphics/drawable/VectorDrawable;->access$3300(JF)V
 HSPLandroid/graphics/drawable/VectorDrawable;->access$3500(JF)V
 HSPLandroid/graphics/drawable/VectorDrawable;->access$3600(JJ)V
-HSPLandroid/graphics/drawable/VectorDrawable;->access$3700()J
-HSPLandroid/graphics/drawable/VectorDrawable;->access$3800(J)J
 HSPLandroid/graphics/drawable/VectorDrawable;->access$3900(JLjava/lang/String;I)V
 HSPLandroid/graphics/drawable/VectorDrawable;->access$400(JJ)J
 HSPLandroid/graphics/drawable/VectorDrawable;->access$4800()J
@@ -11024,9 +9686,6 @@
 HSPLandroid/graphics/drawable/shapes/RectShape;-><init>()V
 HSPLandroid/graphics/drawable/shapes/RectShape;->onResize(FF)V
 HSPLandroid/graphics/drawable/shapes/RectShape;->rect()Landroid/graphics/RectF;
-HSPLandroid/graphics/drawable/shapes/RoundRectShape;-><init>([FLandroid/graphics/RectF;[F)V
-HSPLandroid/graphics/drawable/shapes/RoundRectShape;->draw(Landroid/graphics/Canvas;Landroid/graphics/Paint;)V
-HSPLandroid/graphics/drawable/shapes/RoundRectShape;->onResize(FF)V
 HSPLandroid/graphics/drawable/shapes/Shape;-><init>()V
 HSPLandroid/graphics/drawable/shapes/Shape;->clone()Landroid/graphics/drawable/shapes/Shape;
 HSPLandroid/graphics/drawable/shapes/Shape;->resize(FF)V
@@ -11133,6 +9792,7 @@
 HSPLandroid/hardware/ICameraService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HSPLandroid/hardware/ICameraService$Stub$Proxy;->addListener(Landroid/hardware/ICameraServiceListener;)[Landroid/hardware/CameraStatus;
 HSPLandroid/hardware/ICameraService$Stub$Proxy;->getCameraCharacteristics(Ljava/lang/String;)Landroid/hardware/camera2/impl/CameraMetadataNative;
+HSPLandroid/hardware/ICameraService$Stub$Proxy;->getConcurrentCameraIds()[Landroid/hardware/camera2/utils/ConcurrentCameraIdCombination;
 HSPLandroid/hardware/ICameraService$Stub$Proxy;->getConcurrentStreamingCameraIds()[Landroid/hardware/camera2/utils/ConcurrentCameraIdCombination;
 HSPLandroid/hardware/ICameraService$Stub$Proxy;->isHiddenPhysicalCamera(Ljava/lang/String;)Z
 HSPLandroid/hardware/ICameraService$Stub$Proxy;->notifySystemEvent(I[I)V
@@ -11143,34 +9803,25 @@
 HSPLandroid/hardware/ICameraServiceProxy$Stub;-><init>()V
 HPLandroid/hardware/ICameraServiceProxy$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/hardware/IConsumerIrService$Stub;-><init>()V
-HPLandroid/hardware/IConsumerIrService$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/hardware/ISensorPrivacyListener$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HSPLandroid/hardware/ISensorPrivacyListener$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/hardware/ISensorPrivacyListener$Stub;-><init>()V
 HSPLandroid/hardware/ISensorPrivacyListener$Stub;->asBinder()Landroid/os/IBinder;
 HSPLandroid/hardware/ISensorPrivacyListener$Stub;->asInterface(Landroid/os/IBinder;)Landroid/hardware/ISensorPrivacyListener;
-HSPLandroid/hardware/ISensorPrivacyManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HSPLandroid/hardware/ISensorPrivacyManager$Stub$Proxy;->addSensorPrivacyListener(Landroid/hardware/ISensorPrivacyListener;)V
 HSPLandroid/hardware/ISensorPrivacyManager$Stub$Proxy;->isSensorPrivacyEnabled()Z
 HSPLandroid/hardware/ISensorPrivacyManager$Stub;-><init>()V
-HSPLandroid/hardware/ISensorPrivacyManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/hardware/ISensorPrivacyManager;
 HSPLandroid/hardware/ISensorPrivacyManager$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/hardware/ISerialManager$Stub;-><init>()V
-HPLandroid/hardware/ISerialManager$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/hardware/Sensor;-><init>()V
-HSPLandroid/hardware/Sensor;->getFifoMaxEventCount()I
-HSPLandroid/hardware/Sensor;->getFifoReservedEventCount()I
 HSPLandroid/hardware/Sensor;->getHandle()I
 HSPLandroid/hardware/Sensor;->getMaxLengthValuesArray(Landroid/hardware/Sensor;I)I
 HSPLandroid/hardware/Sensor;->getMaximumRange()F
 HSPLandroid/hardware/Sensor;->getName()Ljava/lang/String;
 HSPLandroid/hardware/Sensor;->getPower()F
 HSPLandroid/hardware/Sensor;->getReportingMode()I
-HSPLandroid/hardware/Sensor;->getResolution()F
 HSPLandroid/hardware/Sensor;->getStringType()Ljava/lang/String;
 HSPLandroid/hardware/Sensor;->getType()I
 HSPLandroid/hardware/Sensor;->getVendor()Ljava/lang/String;
-HSPLandroid/hardware/Sensor;->getVersion()I
 HSPLandroid/hardware/Sensor;->isWakeUpSensor()Z
 HSPLandroid/hardware/Sensor;->setType(I)Z
 HSPLandroid/hardware/Sensor;->setUuid(JJ)V
@@ -11189,8 +9840,6 @@
 HSPLandroid/hardware/SensorManager;->requestTriggerSensor(Landroid/hardware/TriggerEventListener;Landroid/hardware/Sensor;)Z
 HSPLandroid/hardware/SensorManager;->unregisterListener(Landroid/hardware/SensorEventListener;)V
 HSPLandroid/hardware/SensorManager;->unregisterListener(Landroid/hardware/SensorEventListener;Landroid/hardware/Sensor;)V
-HSPLandroid/hardware/SensorPrivacyManager$1;-><init>(Landroid/hardware/SensorPrivacyManager;Landroid/hardware/SensorPrivacyManager$OnSensorPrivacyChangedListener;)V
-HSPLandroid/hardware/SensorPrivacyManager;-><init>(Landroid/content/Context;Landroid/hardware/ISensorPrivacyManager;)V
 HSPLandroid/hardware/SensorPrivacyManager;->addSensorPrivacyListener(Landroid/hardware/SensorPrivacyManager$OnSensorPrivacyChangedListener;)V
 HSPLandroid/hardware/SensorPrivacyManager;->getInstance(Landroid/content/Context;)Landroid/hardware/SensorPrivacyManager;
 HSPLandroid/hardware/SensorPrivacyManager;->isSensorPrivacyEnabled()Z
@@ -11231,13 +9880,10 @@
 HSPLandroid/hardware/biometrics/BiometricAuthenticator$Identifier;->getDeviceId()J
 HSPLandroid/hardware/biometrics/BiometricAuthenticator$Identifier;->getName()Ljava/lang/CharSequence;
 HSPLandroid/hardware/biometrics/BiometricManager;-><init>(Landroid/content/Context;Landroid/hardware/biometrics/IAuthService;)V
-HSPLandroid/hardware/biometrics/BiometricManager;->canAuthenticate()I
-HSPLandroid/hardware/biometrics/BiometricManager;->canAuthenticate(I)I
-HSPLandroid/hardware/biometrics/BiometricManager;->canAuthenticate(II)I
 HSPLandroid/hardware/biometrics/BiometricManager;->hasBiometrics(Landroid/content/Context;)Z
 HPLandroid/hardware/biometrics/BiometricManager;->hasEnrolledBiometrics(I)Z
 HSPLandroid/hardware/biometrics/BiometricManager;->registerEnabledOnKeyguardCallback(Landroid/hardware/biometrics/IBiometricEnabledOnKeyguardCallback;)V
-PLandroid/hardware/biometrics/BiometricManager;->resetLockout([B)V
+HPLandroid/hardware/biometrics/BiometricManager;->resetLockout([B)V
 HSPLandroid/hardware/biometrics/BiometricManager;->setActiveUser(I)V
 HSPLandroid/hardware/biometrics/BiometricSourceType$1;->createFromParcel(Landroid/os/Parcel;)Landroid/hardware/biometrics/BiometricSourceType;
 HSPLandroid/hardware/biometrics/BiometricSourceType$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
@@ -11245,7 +9891,6 @@
 HSPLandroid/hardware/biometrics/BiometricSourceType;->values()[Landroid/hardware/biometrics/BiometricSourceType;
 HSPLandroid/hardware/biometrics/BiometricSourceType;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/hardware/biometrics/IAuthService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/hardware/biometrics/IAuthService$Stub$Proxy;->canAuthenticate(Ljava/lang/String;II)I
 HSPLandroid/hardware/biometrics/IAuthService$Stub$Proxy;->registerEnabledOnKeyguardCallback(Landroid/hardware/biometrics/IBiometricEnabledOnKeyguardCallback;)V
 HSPLandroid/hardware/biometrics/IAuthService$Stub;-><init>()V
 HSPLandroid/hardware/biometrics/IAuthService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/hardware/biometrics/IAuthService;
@@ -11260,7 +9905,6 @@
 HSPLandroid/hardware/biometrics/IBiometricEnabledOnKeyguardCallback$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/hardware/biometrics/IBiometricService$Stub;-><init>()V
 HSPLandroid/hardware/biometrics/IBiometricService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/hardware/biometrics/IBiometricService;
-HPLandroid/hardware/biometrics/IBiometricService$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/hardware/biometrics/IBiometricServiceLockoutResetCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HSPLandroid/hardware/biometrics/IBiometricServiceLockoutResetCallback$Stub$Proxy;->asBinder()Landroid/os/IBinder;
 HSPLandroid/hardware/biometrics/IBiometricServiceLockoutResetCallback$Stub$Proxy;->onLockoutReset(JLandroid/os/IRemoteCallback;)V
@@ -11281,10 +9925,7 @@
 HSPLandroid/hardware/camera2/CameraManager$CameraManagerGlobal$1;->compare(Ljava/lang/String;Ljava/lang/String;)I
 HSPLandroid/hardware/camera2/CameraManager$CameraManagerGlobal$3;-><init>(Landroid/hardware/camera2/CameraManager$CameraManagerGlobal;Landroid/hardware/camera2/CameraManager$AvailabilityCallback;)V
 HSPLandroid/hardware/camera2/CameraManager$CameraManagerGlobal$3;->run()V
-HSPLandroid/hardware/camera2/CameraManager$CameraManagerGlobal$4;-><init>(Landroid/hardware/camera2/CameraManager$CameraManagerGlobal;Ljava/lang/String;Landroid/hardware/camera2/CameraManager$AvailabilityCallback;Ljava/lang/String;)V
 HSPLandroid/hardware/camera2/CameraManager$CameraManagerGlobal$4;->run()V
-HSPLandroid/hardware/camera2/CameraManager$CameraManagerGlobal$5;-><init>(Landroid/hardware/camera2/CameraManager$CameraManagerGlobal;Ljava/lang/String;Landroid/hardware/camera2/CameraManager$AvailabilityCallback;Ljava/lang/String;)V
-HSPLandroid/hardware/camera2/CameraManager$CameraManagerGlobal$5;->run()V
 HSPLandroid/hardware/camera2/CameraManager$CameraManagerGlobal;-><clinit>()V
 HSPLandroid/hardware/camera2/CameraManager$CameraManagerGlobal;-><init>()V
 HSPLandroid/hardware/camera2/CameraManager$CameraManagerGlobal;->asBinder()Landroid/os/IBinder;
@@ -11337,7 +9978,6 @@
 HSPLandroid/hardware/camera2/impl/CameraMetadataNative$Key;->hasTag()Z
 HSPLandroid/hardware/camera2/impl/CameraMetadataNative$Key;->hashCode()I
 HSPLandroid/hardware/camera2/impl/CameraMetadataNative;-><init>()V
-HSPLandroid/hardware/camera2/impl/CameraMetadataNative;->access$400(Landroid/hardware/camera2/impl/CameraMetadataNative;)Landroid/hardware/camera2/params/StreamConfigurationMap;
 HSPLandroid/hardware/camera2/impl/CameraMetadataNative;->close()V
 HSPLandroid/hardware/camera2/impl/CameraMetadataNative;->finalize()V
 HSPLandroid/hardware/camera2/impl/CameraMetadataNative;->get(Landroid/hardware/camera2/CameraCharacteristics$Key;)Ljava/lang/Object;
@@ -11399,15 +10039,9 @@
 HSPLandroid/hardware/camera2/marshal/impl/MarshalQueryableStreamConfigurationDuration;->createMarshaler(Landroid/hardware/camera2/utils/TypeReference;I)Landroid/hardware/camera2/marshal/Marshaler;
 HSPLandroid/hardware/camera2/marshal/impl/MarshalQueryableStreamConfigurationDuration;->isTypeMappingSupported(Landroid/hardware/camera2/utils/TypeReference;I)Z
 HSPLandroid/hardware/camera2/marshal/impl/MarshalQueryableString;->isTypeMappingSupported(Landroid/hardware/camera2/utils/TypeReference;I)Z
-HSPLandroid/hardware/camera2/params/StreamConfiguration;-><init>(IIIZ)V
-HSPLandroid/hardware/camera2/params/StreamConfiguration;->getFormat()I
 HSPLandroid/hardware/camera2/params/StreamConfiguration;->getSize()Landroid/util/Size;
 HSPLandroid/hardware/camera2/params/StreamConfiguration;->isOutput()Z
 HSPLandroid/hardware/camera2/params/StreamConfigurationDuration;-><init>(IIIJ)V
-HSPLandroid/hardware/camera2/params/StreamConfigurationDuration;->getDuration()J
-HSPLandroid/hardware/camera2/params/StreamConfigurationDuration;->getFormat()I
-HSPLandroid/hardware/camera2/params/StreamConfigurationDuration;->getHeight()I
-HSPLandroid/hardware/camera2/params/StreamConfigurationDuration;->getWidth()I
 HSPLandroid/hardware/camera2/params/StreamConfigurationMap;-><init>([Landroid/hardware/camera2/params/StreamConfiguration;[Landroid/hardware/camera2/params/StreamConfigurationDuration;[Landroid/hardware/camera2/params/StreamConfigurationDuration;[Landroid/hardware/camera2/params/StreamConfiguration;[Landroid/hardware/camera2/params/StreamConfigurationDuration;[Landroid/hardware/camera2/params/StreamConfigurationDuration;[Landroid/hardware/camera2/params/StreamConfiguration;[Landroid/hardware/camera2/params/StreamConfigurationDuration;[Landroid/hardware/camera2/params/StreamConfigurationDuration;[Landroid/hardware/camera2/params/StreamConfiguration;[Landroid/hardware/camera2/params/StreamConfigurationDuration;[Landroid/hardware/camera2/params/StreamConfigurationDuration;[Landroid/hardware/camera2/params/HighSpeedVideoConfiguration;Landroid/hardware/camera2/params/ReprocessFormatsMap;Z)V
 HSPLandroid/hardware/camera2/params/StreamConfigurationMap;-><init>([Landroid/hardware/camera2/params/StreamConfiguration;[Landroid/hardware/camera2/params/StreamConfigurationDuration;[Landroid/hardware/camera2/params/StreamConfigurationDuration;[Landroid/hardware/camera2/params/StreamConfiguration;[Landroid/hardware/camera2/params/StreamConfigurationDuration;[Landroid/hardware/camera2/params/StreamConfigurationDuration;[Landroid/hardware/camera2/params/StreamConfiguration;[Landroid/hardware/camera2/params/StreamConfigurationDuration;[Landroid/hardware/camera2/params/StreamConfigurationDuration;[Landroid/hardware/camera2/params/StreamConfiguration;[Landroid/hardware/camera2/params/StreamConfigurationDuration;[Landroid/hardware/camera2/params/StreamConfigurationDuration;[Landroid/hardware/camera2/params/HighSpeedVideoConfiguration;Landroid/hardware/camera2/params/ReprocessFormatsMap;ZZ)V
 HSPLandroid/hardware/camera2/params/StreamConfigurationMap;->checkArgumentFormat(I)I
@@ -11440,15 +10074,6 @@
 HSPLandroid/hardware/contexthub/V1_0/HubAppInfo;-><init>()V
 HSPLandroid/hardware/contexthub/V1_0/HubAppInfo;->readEmbeddedFromParcel(Landroid/os/HwParcel;Landroid/os/HwBlob;J)V
 HSPLandroid/hardware/contexthub/V1_0/HubAppInfo;->readVectorFromParcel(Landroid/os/HwParcel;)Ljava/util/ArrayList;
-HSPLandroid/hardware/contexthub/V1_0/IContexthub$Proxy;-><init>(Landroid/os/IHwBinder;)V
-HSPLandroid/hardware/contexthub/V1_0/IContexthub$Proxy;->getHubs()Ljava/util/ArrayList;
-HSPLandroid/hardware/contexthub/V1_0/IContexthub$Proxy;->interfaceChain()Ljava/util/ArrayList;
-HSPLandroid/hardware/contexthub/V1_0/IContexthub$Proxy;->queryApps(I)I
-HSPLandroid/hardware/contexthub/V1_0/IContexthub$Proxy;->registerCallback(ILandroid/hardware/contexthub/V1_0/IContexthubCallback;)I
-HPLandroid/hardware/contexthub/V1_0/IContexthub$Proxy;->sendMessageToHub(ILandroid/hardware/contexthub/V1_0/ContextHubMsg;)I
-HSPLandroid/hardware/contexthub/V1_0/IContexthub;->asInterface(Landroid/os/IHwBinder;)Landroid/hardware/contexthub/V1_0/IContexthub;
-HSPLandroid/hardware/contexthub/V1_0/IContexthub;->getService(Ljava/lang/String;Z)Landroid/hardware/contexthub/V1_0/IContexthub;
-HSPLandroid/hardware/contexthub/V1_0/IContexthub;->getService(Z)Landroid/hardware/contexthub/V1_0/IContexthub;
 HSPLandroid/hardware/contexthub/V1_0/IContexthubCallback$Stub;-><init>()V
 HSPLandroid/hardware/contexthub/V1_0/IContexthubCallback$Stub;->asBinder()Landroid/os/IHwBinder;
 HSPLandroid/hardware/contexthub/V1_0/IContexthubCallback$Stub;->onTransact(ILandroid/os/HwParcel;Landroid/os/HwParcel;I)V
@@ -11488,6 +10113,7 @@
 HSPLandroid/hardware/display/BrightnessConfiguration$Builder;->checkMonotonic([FZLjava/lang/String;)V
 HSPLandroid/hardware/display/BrightnessConfiguration$Builder;->setDescription(Ljava/lang/String;)Landroid/hardware/display/BrightnessConfiguration$Builder;
 HSPLandroid/hardware/display/BrightnessConfiguration$Builder;->setShortTermModelLowerLuxMultiplier(F)Landroid/hardware/display/BrightnessConfiguration$Builder;
+HSPLandroid/hardware/display/BrightnessConfiguration$Builder;->setShortTermModelTimeoutMillis(J)Landroid/hardware/display/BrightnessConfiguration$Builder;
 HSPLandroid/hardware/display/BrightnessConfiguration$Builder;->setShortTermModelUpperLuxMultiplier(F)Landroid/hardware/display/BrightnessConfiguration$Builder;
 HSPLandroid/hardware/display/BrightnessConfiguration$Builder;->setShouldCollectColorSamples(Z)Landroid/hardware/display/BrightnessConfiguration$Builder;
 HSPLandroid/hardware/display/BrightnessConfiguration;-><init>([F[FLjava/util/Map;Ljava/util/Map;Ljava/lang/String;ZJFF)V
@@ -11511,6 +10137,13 @@
 HSPLandroid/hardware/display/ColorDisplayManager;->isNightDisplayActivated()Z
 HSPLandroid/hardware/display/ColorDisplayManager;->isNightDisplayAvailable(Landroid/content/Context;)Z
 HSPLandroid/hardware/display/Curve;-><init>([F[F)V
+HSPLandroid/hardware/display/DeviceProductInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/hardware/display/DeviceProductInfo;
+HSPLandroid/hardware/display/DeviceProductInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
+HSPLandroid/hardware/display/DeviceProductInfo$ManufactureDate$1;->createFromParcel(Landroid/os/Parcel;)Landroid/hardware/display/DeviceProductInfo$ManufactureDate;
+HSPLandroid/hardware/display/DeviceProductInfo$ManufactureDate$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
+HSPLandroid/hardware/display/DeviceProductInfo$ManufactureDate;-><init>(Landroid/os/Parcel;)V
+HSPLandroid/hardware/display/DeviceProductInfo;-><init>(Landroid/os/Parcel;)V
+HSPLandroid/hardware/display/DeviceProductInfo;-><init>(Landroid/os/Parcel;Landroid/hardware/display/DeviceProductInfo$1;)V
 HSPLandroid/hardware/display/DisplayManager;-><init>(Landroid/content/Context;)V
 HSPLandroid/hardware/display/DisplayManager;->addAllDisplaysLocked(Ljava/util/ArrayList;[I)V
 HSPLandroid/hardware/display/DisplayManager;->addPresentationDisplaysLocked(Ljava/util/ArrayList;[II)V
@@ -11518,10 +10151,12 @@
 HSPLandroid/hardware/display/DisplayManager;->getDisplays()[Landroid/view/Display;
 HSPLandroid/hardware/display/DisplayManager;->getDisplays(Ljava/lang/String;)[Landroid/view/Display;
 HSPLandroid/hardware/display/DisplayManager;->getOrCreateDisplayLocked(IZ)Landroid/view/Display;
-HSPLandroid/hardware/display/DisplayManager;->getStableDisplaySize()Landroid/graphics/Point;
 HSPLandroid/hardware/display/DisplayManager;->getWifiDisplayStatus()Landroid/hardware/display/WifiDisplayStatus;
 HSPLandroid/hardware/display/DisplayManager;->registerDisplayListener(Landroid/hardware/display/DisplayManager$DisplayListener;Landroid/os/Handler;)V
 HSPLandroid/hardware/display/DisplayManager;->unregisterDisplayListener(Landroid/hardware/display/DisplayManager$DisplayListener;)V
+HSPLandroid/hardware/display/DisplayManagerGlobal$1;-><init>(Landroid/hardware/display/DisplayManagerGlobal;ILjava/lang/String;)V
+HSPLandroid/hardware/display/DisplayManagerGlobal$1;->recompute(Ljava/lang/Integer;)Landroid/view/DisplayInfo;
+HSPLandroid/hardware/display/DisplayManagerGlobal$1;->recompute(Ljava/lang/Object;)Ljava/lang/Object;
 HSPLandroid/hardware/display/DisplayManagerGlobal$DisplayListenerDelegate;-><init>(Landroid/hardware/display/DisplayManager$DisplayListener;Landroid/os/Looper;)V
 HSPLandroid/hardware/display/DisplayManagerGlobal$DisplayListenerDelegate;->clearEvents()V
 HSPLandroid/hardware/display/DisplayManagerGlobal$DisplayListenerDelegate;->handleMessage(Landroid/os/Message;)V
@@ -11530,7 +10165,9 @@
 HSPLandroid/hardware/display/DisplayManagerGlobal$DisplayManagerCallback;-><init>(Landroid/hardware/display/DisplayManagerGlobal;Landroid/hardware/display/DisplayManagerGlobal$1;)V
 HSPLandroid/hardware/display/DisplayManagerGlobal$DisplayManagerCallback;->onDisplayEvent(II)V
 HSPLandroid/hardware/display/DisplayManagerGlobal;-><init>(Landroid/hardware/display/IDisplayManager;)V
+HSPLandroid/hardware/display/DisplayManagerGlobal;->access$000(Landroid/hardware/display/DisplayManagerGlobal;)Landroid/hardware/display/IDisplayManager;
 HSPLandroid/hardware/display/DisplayManagerGlobal;->access$100(Landroid/hardware/display/DisplayManagerGlobal;II)V
+HSPLandroid/hardware/display/DisplayManagerGlobal;->access$200(Landroid/hardware/display/DisplayManagerGlobal;II)V
 HSPLandroid/hardware/display/DisplayManagerGlobal;->findDisplayListenerLocked(Landroid/hardware/display/DisplayManager$DisplayListener;)I
 HSPLandroid/hardware/display/DisplayManagerGlobal;->getCompatibleDisplay(ILandroid/content/res/Resources;)Landroid/view/Display;
 HSPLandroid/hardware/display/DisplayManagerGlobal;->getCompatibleDisplay(ILandroid/view/DisplayAdjustments;)Landroid/view/Display;
@@ -11539,7 +10176,6 @@
 HSPLandroid/hardware/display/DisplayManagerGlobal;->getInstance()Landroid/hardware/display/DisplayManagerGlobal;
 HSPLandroid/hardware/display/DisplayManagerGlobal;->getLooperForHandler(Landroid/os/Handler;)Landroid/os/Looper;
 HSPLandroid/hardware/display/DisplayManagerGlobal;->getRealDisplay(I)Landroid/view/Display;
-HSPLandroid/hardware/display/DisplayManagerGlobal;->getStableDisplaySize()Landroid/graphics/Point;
 HSPLandroid/hardware/display/DisplayManagerGlobal;->getWifiDisplayStatus()Landroid/hardware/display/WifiDisplayStatus;
 HSPLandroid/hardware/display/DisplayManagerGlobal;->handleDisplayEvent(II)V
 HSPLandroid/hardware/display/DisplayManagerGlobal;->registerCallbackIfNeededLocked()V
@@ -11565,11 +10201,11 @@
 HSPLandroid/hardware/display/IDisplayManager$Stub$Proxy;->getDisplayIds()[I
 HSPLandroid/hardware/display/IDisplayManager$Stub$Proxy;->getDisplayInfo(I)Landroid/view/DisplayInfo;
 HSPLandroid/hardware/display/IDisplayManager$Stub$Proxy;->getPreferredWideGamutColorSpaceId()I
-HSPLandroid/hardware/display/IDisplayManager$Stub$Proxy;->getStableDisplaySize()Landroid/graphics/Point;
 HSPLandroid/hardware/display/IDisplayManager$Stub$Proxy;->getWifiDisplayStatus()Landroid/hardware/display/WifiDisplayStatus;
 HSPLandroid/hardware/display/IDisplayManager$Stub$Proxy;->registerCallback(Landroid/hardware/display/IDisplayManagerCallback;)V
 HSPLandroid/hardware/display/IDisplayManager$Stub;-><init>()V
 HSPLandroid/hardware/display/IDisplayManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/hardware/display/IDisplayManager;
+HPLandroid/hardware/display/IDisplayManager$Stub;->getDefaultTransactionName(I)Ljava/lang/String;
 HSPLandroid/hardware/display/IDisplayManager$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/hardware/display/IDisplayManagerCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HSPLandroid/hardware/display/IDisplayManagerCallback$Stub$Proxy;->asBinder()Landroid/os/IBinder;
@@ -11598,8 +10234,6 @@
 HSPLandroid/hardware/display/WifiDisplayStatus;->getActiveDisplay()Landroid/hardware/display/WifiDisplay;
 HSPLandroid/hardware/display/WifiDisplayStatus;->getFeatureState()I
 HSPLandroid/hardware/display/WifiDisplayStatus;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/hardware/face/Face$1;-><init>()V
-HSPLandroid/hardware/face/Face;-><clinit>()V
 HSPLandroid/hardware/face/FaceManager$1;-><init>(Landroid/hardware/face/FaceManager;)V
 HSPLandroid/hardware/face/FaceManager$AuthenticationCallback;-><init>()V
 HSPLandroid/hardware/face/FaceManager$LockoutResetCallback;-><init>()V
@@ -11619,6 +10253,7 @@
 HSPLandroid/hardware/fingerprint/FingerprintManager$MyHandler;-><init>(Landroid/hardware/fingerprint/FingerprintManager;Landroid/content/Context;)V
 HSPLandroid/hardware/fingerprint/FingerprintManager$MyHandler;-><init>(Landroid/hardware/fingerprint/FingerprintManager;Landroid/content/Context;Landroid/hardware/fingerprint/FingerprintManager$1;)V
 HSPLandroid/hardware/fingerprint/FingerprintManager;-><init>(Landroid/content/Context;Landroid/hardware/fingerprint/IFingerprintService;)V
+HSPLandroid/hardware/fingerprint/FingerprintManager;->getEnrolledFingerprints(I)Ljava/util/List;
 HSPLandroid/hardware/fingerprint/FingerprintManager;->isHardwareDetected()Z
 HSPLandroid/hardware/fingerprint/IFingerprintService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HSPLandroid/hardware/fingerprint/IFingerprintService$Stub$Proxy;->isHardwareDetected(Ljava/lang/String;)Z
@@ -11633,7 +10268,6 @@
 HSPLandroid/hardware/input/IInputManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HSPLandroid/hardware/input/IInputManager$Stub$Proxy;->getInputDevice(I)Landroid/view/InputDevice;
 HSPLandroid/hardware/input/IInputManager$Stub$Proxy;->getInputDeviceIds()[I
-HSPLandroid/hardware/input/IInputManager$Stub$Proxy;->hasKeys(II[I[Z)Z
 HPLandroid/hardware/input/IInputManager$Stub$Proxy;->injectInputEvent(Landroid/view/InputEvent;I)Z
 HSPLandroid/hardware/input/IInputManager$Stub$Proxy;->monitorGestureInput(Ljava/lang/String;I)Landroid/view/InputMonitor;
 HSPLandroid/hardware/input/IInputManager$Stub$Proxy;->registerInputDevicesChangedListener(Landroid/hardware/input/IInputDevicesChangedListener;)V
@@ -11645,14 +10279,12 @@
 HSPLandroid/hardware/input/InputDeviceIdentifier;->getProductId()I
 HSPLandroid/hardware/input/InputDeviceIdentifier;->getVendorId()I
 HSPLandroid/hardware/input/InputManager$InputDeviceListenerDelegate;-><init>(Landroid/hardware/input/InputManager$InputDeviceListener;Landroid/os/Handler;)V
-HSPLandroid/hardware/input/InputManager$InputDeviceListenerDelegate;->handleMessage(Landroid/os/Message;)V
 HSPLandroid/hardware/input/InputManager$InputDevicesChangedListener;-><init>(Landroid/hardware/input/InputManager;)V
 HSPLandroid/hardware/input/InputManager$InputDevicesChangedListener;-><init>(Landroid/hardware/input/InputManager;Landroid/hardware/input/InputManager$1;)V
 HSPLandroid/hardware/input/InputManager$InputDevicesChangedListener;->onInputDevicesChanged([I)V
 HSPLandroid/hardware/input/InputManager;-><init>(Landroid/hardware/input/IInputManager;)V
 HSPLandroid/hardware/input/InputManager;->access$200(Landroid/hardware/input/InputManager;[I)V
 HSPLandroid/hardware/input/InputManager;->containsDeviceId([II)Z
-HSPLandroid/hardware/input/InputManager;->deviceHasKeys(I[I)[Z
 HSPLandroid/hardware/input/InputManager;->findInputDeviceListenerLocked(Landroid/hardware/input/InputManager$InputDeviceListener;)I
 HSPLandroid/hardware/input/InputManager;->getInputDevice(I)Landroid/view/InputDevice;
 HSPLandroid/hardware/input/InputManager;->getInputDeviceIds()[I
@@ -11669,21 +10301,15 @@
 HSPLandroid/hardware/input/KeyboardLayout;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILandroid/os/LocaleList;II)V
 HSPLandroid/hardware/input/KeyboardLayout;->getDescriptor()Ljava/lang/String;
 HSPLandroid/hardware/input/TouchCalibration;->getAffineTransform()[F
+HSPLandroid/hardware/lights/ILightsManager$Stub;-><init>()V
 HSPLandroid/hardware/location/-$$Lambda$ContextHubManager$3$5yx25kUuvL9qy3uBcIzI3sQQoL8;-><init>(Landroid/hardware/location/ContextHubClientCallback;Landroid/hardware/location/ContextHubClient;J)V
 HSPLandroid/hardware/location/-$$Lambda$ContextHubManager$3$5yx25kUuvL9qy3uBcIzI3sQQoL8;->run()V
 HSPLandroid/hardware/location/-$$Lambda$ContextHubManager$3$KgVQePwT_QpjU9EQTp2L3LsHE5Y;-><init>(Landroid/hardware/location/ContextHubClientCallback;Landroid/hardware/location/ContextHubClient;J)V
 HSPLandroid/hardware/location/-$$Lambda$ContextHubManager$3$KgVQePwT_QpjU9EQTp2L3LsHE5Y;->run()V
 HSPLandroid/hardware/location/-$$Lambda$ContextHubManager$3$U9x_HK_GdADIEQ3mS5mDWMNWMu8;-><init>(Landroid/hardware/location/ContextHubClientCallback;Landroid/hardware/location/ContextHubClient;Landroid/hardware/location/NanoAppMessage;)V
 HSPLandroid/hardware/location/-$$Lambda$ContextHubManager$3$U9x_HK_GdADIEQ3mS5mDWMNWMu8;->run()V
-HSPLandroid/hardware/location/-$$Lambda$ContextHubManager$4$sylEfC1Rx_cxuQRnKuthZXmV8KI;-><init>(Landroid/hardware/location/ContextHubManager$4;IILandroid/hardware/location/ContextHubMessage;)V
-HSPLandroid/hardware/location/-$$Lambda$ContextHubManager$4$sylEfC1Rx_cxuQRnKuthZXmV8KI;->run()V
-HSPLandroid/hardware/location/-$$Lambda$ContextHubTransaction$RNVGnle3xCUm9u68syzn6-2znnU;-><init>(Landroid/hardware/location/ContextHubTransaction;)V
-HSPLandroid/hardware/location/-$$Lambda$ContextHubTransaction$RNVGnle3xCUm9u68syzn6-2znnU;->run()V
 HSPLandroid/hardware/location/ActivityRecognitionHardware;->isSupported()Z
 HSPLandroid/hardware/location/ContextHubClient;-><init>(Landroid/hardware/location/ContextHubInfo;Z)V
-HSPLandroid/hardware/location/ContextHubClient;->close()V
-HSPLandroid/hardware/location/ContextHubClient;->finalize()V
-HSPLandroid/hardware/location/ContextHubClient;->getAttachedHub()Landroid/hardware/location/ContextHubInfo;
 HSPLandroid/hardware/location/ContextHubClient;->sendMessageToNanoApp(Landroid/hardware/location/NanoAppMessage;)I
 HSPLandroid/hardware/location/ContextHubClient;->setClientProxy(Landroid/hardware/location/IContextHubClient;)V
 HSPLandroid/hardware/location/ContextHubClientCallback;-><init>()V
@@ -11696,8 +10322,6 @@
 HSPLandroid/hardware/location/ContextHubInfo;->getId()I
 HSPLandroid/hardware/location/ContextHubInfo;->getMaxPacketLengthBytes()I
 HPLandroid/hardware/location/ContextHubInfo;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/hardware/location/ContextHubManager$2;-><init>(Landroid/hardware/location/ContextHubManager;Landroid/hardware/location/ContextHubTransaction;)V
-HSPLandroid/hardware/location/ContextHubManager$2;->onQueryResponse(ILjava/util/List;)V
 HSPLandroid/hardware/location/ContextHubManager$3;-><init>(Landroid/hardware/location/ContextHubManager;Ljava/util/concurrent/Executor;Landroid/hardware/location/ContextHubClientCallback;Landroid/hardware/location/ContextHubClient;)V
 HSPLandroid/hardware/location/ContextHubManager$3;->lambda$onMessageFromNanoApp$0(Landroid/hardware/location/ContextHubClientCallback;Landroid/hardware/location/ContextHubClient;Landroid/hardware/location/NanoAppMessage;)V
 HSPLandroid/hardware/location/ContextHubManager$3;->lambda$onNanoAppLoaded$3(Landroid/hardware/location/ContextHubClientCallback;Landroid/hardware/location/ContextHubClient;J)V
@@ -11706,7 +10330,6 @@
 HSPLandroid/hardware/location/ContextHubManager$3;->onNanoAppLoaded(J)V
 HSPLandroid/hardware/location/ContextHubManager$3;->onNanoAppUnloaded(J)V
 HSPLandroid/hardware/location/ContextHubManager$4;-><init>(Landroid/hardware/location/ContextHubManager;)V
-HSPLandroid/hardware/location/ContextHubManager$4;->lambda$onMessageReceipt$0$ContextHubManager$4(IILandroid/hardware/location/ContextHubMessage;)V
 HSPLandroid/hardware/location/ContextHubManager$4;->onMessageReceipt(IILandroid/hardware/location/ContextHubMessage;)V
 HSPLandroid/hardware/location/ContextHubManager;-><init>(Landroid/content/Context;Landroid/os/Looper;)V
 HSPLandroid/hardware/location/ContextHubManager;->access$000(Landroid/hardware/location/ContextHubManager;)Landroid/hardware/location/ContextHubManager$Callback;
@@ -11714,16 +10337,7 @@
 HSPLandroid/hardware/location/ContextHubManager;->createClient(Landroid/hardware/location/ContextHubInfo;Landroid/hardware/location/ContextHubClientCallback;)Landroid/hardware/location/ContextHubClient;
 HSPLandroid/hardware/location/ContextHubManager;->createClient(Landroid/hardware/location/ContextHubInfo;Landroid/hardware/location/ContextHubClientCallback;Ljava/util/concurrent/Executor;)Landroid/hardware/location/ContextHubClient;
 HSPLandroid/hardware/location/ContextHubManager;->createClientCallback(Landroid/hardware/location/ContextHubClient;Landroid/hardware/location/ContextHubClientCallback;Ljava/util/concurrent/Executor;)Landroid/hardware/location/IContextHubClientCallback;
-HSPLandroid/hardware/location/ContextHubManager;->createQueryCallback(Landroid/hardware/location/ContextHubTransaction;)Landroid/hardware/location/IContextHubTransactionCallback;
-HSPLandroid/hardware/location/ContextHubManager;->findNanoAppOnHub(ILandroid/hardware/location/NanoAppFilter;)[I
-HSPLandroid/hardware/location/ContextHubManager;->getContextHubHandles()[I
-HSPLandroid/hardware/location/ContextHubManager;->getContextHubInfo(I)Landroid/hardware/location/ContextHubInfo;
 HSPLandroid/hardware/location/ContextHubManager;->getContextHubs()Ljava/util/List;
-HSPLandroid/hardware/location/ContextHubManager;->getNanoAppInstanceInfo(I)Landroid/hardware/location/NanoAppInstanceInfo;
-HSPLandroid/hardware/location/ContextHubManager;->invokeOnMessageReceiptCallback(IILandroid/hardware/location/ContextHubMessage;)V
-HSPLandroid/hardware/location/ContextHubManager;->queryNanoApps(Landroid/hardware/location/ContextHubInfo;)Landroid/hardware/location/ContextHubTransaction;
-HSPLandroid/hardware/location/ContextHubManager;->registerCallback(Landroid/hardware/location/ContextHubManager$Callback;Landroid/os/Handler;)I
-HSPLandroid/hardware/location/ContextHubManager;->sendMessage(IILandroid/hardware/location/ContextHubMessage;)I
 HSPLandroid/hardware/location/ContextHubMessage$1;->createFromParcel(Landroid/os/Parcel;)Landroid/hardware/location/ContextHubMessage;
 HSPLandroid/hardware/location/ContextHubMessage$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/hardware/location/ContextHubMessage;-><init>(II[B)V
@@ -11732,22 +10346,9 @@
 HSPLandroid/hardware/location/ContextHubMessage;->getData()[B
 HSPLandroid/hardware/location/ContextHubMessage;->getMsgType()I
 HSPLandroid/hardware/location/ContextHubMessage;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/hardware/location/ContextHubTransaction$Response;-><init>(ILjava/lang/Object;)V
-HSPLandroid/hardware/location/ContextHubTransaction$Response;->getContents()Ljava/lang/Object;
-HSPLandroid/hardware/location/ContextHubTransaction$Response;->getResult()I
-HSPLandroid/hardware/location/ContextHubTransaction;-><init>(I)V
-HSPLandroid/hardware/location/ContextHubTransaction;->lambda$setResponse$1$ContextHubTransaction()V
-HSPLandroid/hardware/location/ContextHubTransaction;->setOnCompleteListener(Landroid/hardware/location/ContextHubTransaction$OnCompleteListener;Ljava/util/concurrent/Executor;)V
-HSPLandroid/hardware/location/ContextHubTransaction;->setResponse(Landroid/hardware/location/ContextHubTransaction$Response;)V
-HSPLandroid/hardware/location/ContextHubTransaction;->waitForResponse(JLjava/util/concurrent/TimeUnit;)Landroid/hardware/location/ContextHubTransaction$Response;
-HSPLandroid/hardware/location/GeofenceHardwareCallback;-><init>()V
-HSPLandroid/hardware/location/GeofenceHardwareMonitorCallback;-><init>()V
-HSPLandroid/hardware/location/IActivityRecognitionHardware$Stub;->asInterface(Landroid/os/IBinder;)Landroid/hardware/location/IActivityRecognitionHardware;
-PLandroid/hardware/location/IActivityRecognitionHardwareClient$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+HPLandroid/hardware/location/IActivityRecognitionHardwareClient$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HPLandroid/hardware/location/IActivityRecognitionHardwareClient$Stub$Proxy;->onAvailabilityChanged(ZLandroid/hardware/location/IActivityRecognitionHardware;)V
-HSPLandroid/hardware/location/IActivityRecognitionHardwareClient$Stub;-><init>()V
-PLandroid/hardware/location/IActivityRecognitionHardwareClient$Stub;->asInterface(Landroid/os/IBinder;)Landroid/hardware/location/IActivityRecognitionHardwareClient;
-HSPLandroid/hardware/location/IActivityRecognitionHardwareClient$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
+HPLandroid/hardware/location/IActivityRecognitionHardwareClient$Stub;->asInterface(Landroid/os/IBinder;)Landroid/hardware/location/IActivityRecognitionHardwareClient;
 PLandroid/hardware/location/IContextHubCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HPLandroid/hardware/location/IContextHubCallback$Stub$Proxy;->asBinder()Landroid/os/IBinder;
 HPLandroid/hardware/location/IContextHubCallback$Stub$Proxy;->onMessageReceipt(IILandroid/hardware/location/ContextHubMessage;)V
@@ -11756,14 +10357,13 @@
 PLandroid/hardware/location/IContextHubCallback$Stub;->asInterface(Landroid/os/IBinder;)Landroid/hardware/location/IContextHubCallback;
 HSPLandroid/hardware/location/IContextHubCallback$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/hardware/location/IContextHubClient$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/hardware/location/IContextHubClient$Stub$Proxy;->close()V
 HSPLandroid/hardware/location/IContextHubClient$Stub$Proxy;->sendMessageToNanoApp(Landroid/hardware/location/NanoAppMessage;)I
 HSPLandroid/hardware/location/IContextHubClient$Stub;-><init>()V
-PLandroid/hardware/location/IContextHubClient$Stub;->asBinder()Landroid/os/IBinder;
+HPLandroid/hardware/location/IContextHubClient$Stub;->asBinder()Landroid/os/IBinder;
 HSPLandroid/hardware/location/IContextHubClient$Stub;->asInterface(Landroid/os/IBinder;)Landroid/hardware/location/IContextHubClient;
 HPLandroid/hardware/location/IContextHubClient$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 PLandroid/hardware/location/IContextHubClientCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-PLandroid/hardware/location/IContextHubClientCallback$Stub$Proxy;->asBinder()Landroid/os/IBinder;
+HPLandroid/hardware/location/IContextHubClientCallback$Stub$Proxy;->asBinder()Landroid/os/IBinder;
 HPLandroid/hardware/location/IContextHubClientCallback$Stub$Proxy;->onMessageFromNanoApp(Landroid/hardware/location/NanoAppMessage;)V
 HSPLandroid/hardware/location/IContextHubClientCallback$Stub;-><init>()V
 HSPLandroid/hardware/location/IContextHubClientCallback$Stub;->asBinder()Landroid/os/IBinder;
@@ -11771,38 +10371,25 @@
 HSPLandroid/hardware/location/IContextHubClientCallback$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/hardware/location/IContextHubService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HSPLandroid/hardware/location/IContextHubService$Stub$Proxy;->createClient(ILandroid/hardware/location/IContextHubClientCallback;)Landroid/hardware/location/IContextHubClient;
-HSPLandroid/hardware/location/IContextHubService$Stub$Proxy;->findNanoAppOnHub(ILandroid/hardware/location/NanoAppFilter;)[I
-HSPLandroid/hardware/location/IContextHubService$Stub$Proxy;->getContextHubHandles()[I
-HSPLandroid/hardware/location/IContextHubService$Stub$Proxy;->getContextHubInfo(I)Landroid/hardware/location/ContextHubInfo;
 HSPLandroid/hardware/location/IContextHubService$Stub$Proxy;->getContextHubs()Ljava/util/List;
-HSPLandroid/hardware/location/IContextHubService$Stub$Proxy;->getNanoAppInstanceInfo(I)Landroid/hardware/location/NanoAppInstanceInfo;
-HSPLandroid/hardware/location/IContextHubService$Stub$Proxy;->queryNanoApps(ILandroid/hardware/location/IContextHubTransactionCallback;)V
 HSPLandroid/hardware/location/IContextHubService$Stub$Proxy;->registerCallback(Landroid/hardware/location/IContextHubCallback;)I
-HSPLandroid/hardware/location/IContextHubService$Stub$Proxy;->sendMessage(IILandroid/hardware/location/ContextHubMessage;)I
 HSPLandroid/hardware/location/IContextHubService$Stub;-><init>()V
 HSPLandroid/hardware/location/IContextHubService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/hardware/location/IContextHubService;
 HPLandroid/hardware/location/IContextHubService$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HPLandroid/hardware/location/IContextHubTransactionCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HPLandroid/hardware/location/IContextHubTransactionCallback$Stub$Proxy;->onQueryResponse(ILjava/util/List;)V
 HSPLandroid/hardware/location/IContextHubTransactionCallback$Stub;-><init>()V
-HSPLandroid/hardware/location/IContextHubTransactionCallback$Stub;->asBinder()Landroid/os/IBinder;
 HPLandroid/hardware/location/IContextHubTransactionCallback$Stub;->asInterface(Landroid/os/IBinder;)Landroid/hardware/location/IContextHubTransactionCallback;
-HSPLandroid/hardware/location/IContextHubTransactionCallback$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/hardware/location/IGeofenceHardware$Stub;->asInterface(Landroid/os/IBinder;)Landroid/hardware/location/IGeofenceHardware;
 HSPLandroid/hardware/location/MemoryRegion$1;->newArray(I)[Landroid/hardware/location/MemoryRegion;
 HSPLandroid/hardware/location/MemoryRegion$1;->newArray(I)[Ljava/lang/Object;
 PLandroid/hardware/location/NanoAppFilter$1;->createFromParcel(Landroid/os/Parcel;)Landroid/hardware/location/NanoAppFilter;
 HPLandroid/hardware/location/NanoAppFilter$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/hardware/location/NanoAppFilter;-><init>(JIIJ)V
 HPLandroid/hardware/location/NanoAppFilter;-><init>(Landroid/os/Parcel;)V
 HPLandroid/hardware/location/NanoAppFilter;-><init>(Landroid/os/Parcel;Landroid/hardware/location/NanoAppFilter$1;)V
 HPLandroid/hardware/location/NanoAppFilter;->testMatch(Landroid/hardware/location/NanoAppInstanceInfo;)Z
 PLandroid/hardware/location/NanoAppFilter;->versionsMatch(III)Z
-HSPLandroid/hardware/location/NanoAppFilter;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/hardware/location/NanoAppInstanceInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/hardware/location/NanoAppInstanceInfo;
-HSPLandroid/hardware/location/NanoAppInstanceInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/hardware/location/NanoAppInstanceInfo;-><init>(IJII)V
-HSPLandroid/hardware/location/NanoAppInstanceInfo;-><init>(Landroid/os/Parcel;)V
 HSPLandroid/hardware/location/NanoAppInstanceInfo;->getAppId()J
 HSPLandroid/hardware/location/NanoAppInstanceInfo;->getAppVersion()I
 HSPLandroid/hardware/location/NanoAppInstanceInfo;->getContexthubId()I
@@ -11820,14 +10407,7 @@
 HSPLandroid/hardware/location/NanoAppMessage;->getNanoAppId()J
 HPLandroid/hardware/location/NanoAppMessage;->isBroadcastMessage()Z
 HSPLandroid/hardware/location/NanoAppMessage;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/hardware/location/NanoAppState$1;->createFromParcel(Landroid/os/Parcel;)Landroid/hardware/location/NanoAppState;
-HSPLandroid/hardware/location/NanoAppState$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/hardware/location/NanoAppState;-><init>(JIZ)V
-HSPLandroid/hardware/location/NanoAppState;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/hardware/location/NanoAppState;-><init>(Landroid/os/Parcel;Landroid/hardware/location/NanoAppState$1;)V
-HSPLandroid/hardware/location/NanoAppState;->getNanoAppId()J
-HSPLandroid/hardware/location/NanoAppState;->getNanoAppVersion()J
-HSPLandroid/hardware/location/NanoAppState;->isEnabled()Z
 HPLandroid/hardware/location/NanoAppState;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/hardware/soundtrigger/-$$Lambda$SoundTrigger$ZVJnEi-r8cH99VNOx-TiaTkEQgo;-><clinit>()V
 HSPLandroid/hardware/soundtrigger/-$$Lambda$SoundTrigger$ZVJnEi-r8cH99VNOx-TiaTkEQgo;-><init>()V
@@ -11847,9 +10427,12 @@
 HSPLandroid/hardware/soundtrigger/KeyphraseMetadata$1;-><init>()V
 HSPLandroid/hardware/soundtrigger/KeyphraseMetadata;-><clinit>()V
 HSPLandroid/hardware/soundtrigger/KeyphraseMetadata;-><init>(ILjava/lang/String;Landroid/util/ArraySet;I)V
+HSPLandroid/hardware/soundtrigger/KeyphraseMetadata;->hashCode()I
 HSPLandroid/hardware/soundtrigger/SoundTrigger$ConfidenceLevel$1;->newArray(I)[Landroid/hardware/soundtrigger/SoundTrigger$ConfidenceLevel;
 HSPLandroid/hardware/soundtrigger/SoundTrigger$ConfidenceLevel$1;->newArray(I)[Ljava/lang/Object;
 HSPLandroid/hardware/soundtrigger/SoundTrigger$GenericSoundModel;-><init>(Ljava/util/UUID;Ljava/util/UUID;[BI)V
+HSPLandroid/hardware/soundtrigger/SoundTrigger$Keyphrase;-><init>(IILjava/util/Locale;Ljava/lang/String;[I)V
+HSPLandroid/hardware/soundtrigger/SoundTrigger$KeyphraseRecognitionEvent;-><init>(IIZIIIZLandroid/media/AudioFormat;[B[Landroid/hardware/soundtrigger/SoundTrigger$KeyphraseRecognitionExtra;)V
 HSPLandroid/hardware/soundtrigger/SoundTrigger$KeyphraseRecognitionExtra$1;->createFromParcel(Landroid/os/Parcel;)Landroid/hardware/soundtrigger/SoundTrigger$KeyphraseRecognitionExtra;
 HSPLandroid/hardware/soundtrigger/SoundTrigger$KeyphraseRecognitionExtra$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/hardware/soundtrigger/SoundTrigger$KeyphraseRecognitionExtra$1;->newArray(I)[Landroid/hardware/soundtrigger/SoundTrigger$KeyphraseRecognitionExtra;
@@ -11857,7 +10440,6 @@
 HSPLandroid/hardware/soundtrigger/SoundTrigger$KeyphraseRecognitionExtra;-><init>(III[Landroid/hardware/soundtrigger/SoundTrigger$ConfidenceLevel;)V
 HSPLandroid/hardware/soundtrigger/SoundTrigger$KeyphraseRecognitionExtra;->fromParcel(Landroid/os/Parcel;)Landroid/hardware/soundtrigger/SoundTrigger$KeyphraseRecognitionExtra;
 HSPLandroid/hardware/soundtrigger/SoundTrigger$KeyphraseRecognitionExtra;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/hardware/soundtrigger/SoundTrigger$KeyphraseSoundModel;-><init>(Ljava/util/UUID;Ljava/util/UUID;[B[Landroid/hardware/soundtrigger/SoundTrigger$Keyphrase;I)V
 HSPLandroid/hardware/soundtrigger/SoundTrigger$ModuleProperties;-><init>(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;IIIIZIZIZI)V
 HPLandroid/hardware/soundtrigger/SoundTrigger$ModuleProperties;->writeToParcel(Landroid/os/Parcel;I)V
 HPLandroid/hardware/soundtrigger/SoundTrigger$RecognitionConfig$1;->createFromParcel(Landroid/os/Parcel;)Landroid/hardware/soundtrigger/SoundTrigger$RecognitionConfig;
@@ -11869,7 +10451,9 @@
 HPLandroid/hardware/soundtrigger/SoundTrigger$SoundModel;->equals(Ljava/lang/Object;)Z
 HSPLandroid/hardware/soundtrigger/SoundTrigger;->getService()Landroid/media/soundtrigger_middleware/ISoundTriggerMiddlewareService;
 HSPLandroid/hardware/soundtrigger/SoundTrigger;->listModules(Ljava/util/ArrayList;)I
+PLandroid/hardware/soundtrigger/SoundTriggerModule$EventHandlerDelegate$1;-><init>(Landroid/hardware/soundtrigger/SoundTriggerModule$EventHandlerDelegate;Landroid/os/Looper;Landroid/hardware/soundtrigger/SoundTriggerModule;Landroid/hardware/soundtrigger/SoundTrigger$StatusListener;)V
 HPLandroid/hardware/soundtrigger/SoundTriggerModule$EventHandlerDelegate$1;->handleMessage(Landroid/os/Message;)V
+PLandroid/hardware/soundtrigger/SoundTriggerModule$EventHandlerDelegate;-><init>(Landroid/hardware/soundtrigger/SoundTriggerModule;Landroid/hardware/soundtrigger/SoundTrigger$StatusListener;Landroid/os/Looper;)V
 PLandroid/hardware/soundtrigger/SoundTriggerModule$EventHandlerDelegate;->onRecognitionAvailabilityChange(Z)V
 HPLandroid/hardware/soundtrigger/SoundTriggerModule;->loadSoundModel(Landroid/hardware/soundtrigger/SoundTrigger$SoundModel;[I)I
 HPLandroid/hardware/soundtrigger/SoundTriggerModule;->startRecognition(ILandroid/hardware/soundtrigger/SoundTrigger$RecognitionConfig;)I
@@ -11890,32 +10474,23 @@
 HSPLandroid/hardware/thermal/V2_0/IThermal;->getService(Ljava/lang/String;)Landroid/hardware/thermal/V2_0/IThermal;
 HSPLandroid/hardware/thermal/V2_0/IThermalChangedCallback$Stub;-><init>()V
 HSPLandroid/hardware/thermal/V2_0/IThermalChangedCallback$Stub;->asBinder()Landroid/os/IHwBinder;
-PLandroid/hardware/thermal/V2_0/IThermalChangedCallback$Stub;->onTransact(ILandroid/os/HwParcel;Landroid/os/HwParcel;I)V
+HPLandroid/hardware/thermal/V2_0/IThermalChangedCallback$Stub;->onTransact(ILandroid/os/HwParcel;Landroid/os/HwParcel;I)V
 HSPLandroid/hardware/thermal/V2_0/Temperature;-><init>()V
 HSPLandroid/hardware/thermal/V2_0/Temperature;->readEmbeddedFromParcel(Landroid/os/HwParcel;Landroid/os/HwBlob;J)V
 PLandroid/hardware/thermal/V2_0/Temperature;->readFromParcel(Landroid/os/HwParcel;)V
 HSPLandroid/hardware/thermal/V2_0/Temperature;->readVectorFromParcel(Landroid/os/HwParcel;)Ljava/util/ArrayList;
 HSPLandroid/hardware/usb/IUsbManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/hardware/usb/IUsbManager$Stub$Proxy;->getCurrentAccessory()Landroid/hardware/usb/UsbAccessory;
 HSPLandroid/hardware/usb/IUsbManager$Stub$Proxy;->getDeviceList(Landroid/os/Bundle;)V
-HSPLandroid/hardware/usb/IUsbManager$Stub$Proxy;->getPortStatus(Ljava/lang/String;)Landroid/hardware/usb/UsbPortStatus;
-HSPLandroid/hardware/usb/IUsbManager$Stub$Proxy;->getPorts()Ljava/util/List;
 HSPLandroid/hardware/usb/IUsbManager$Stub;-><init>()V
 HSPLandroid/hardware/usb/IUsbManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/hardware/usb/IUsbManager;
 HSPLandroid/hardware/usb/IUsbManager$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/hardware/usb/ParcelableUsbPort$1;->createFromParcel(Landroid/os/Parcel;)Landroid/hardware/usb/ParcelableUsbPort;
-HSPLandroid/hardware/usb/ParcelableUsbPort$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/hardware/usb/ParcelableUsbPort;-><init>(Ljava/lang/String;IIZZ)V
-HSPLandroid/hardware/usb/ParcelableUsbPort;-><init>(Ljava/lang/String;IIZZLandroid/hardware/usb/ParcelableUsbPort$1;)V
 HSPLandroid/hardware/usb/ParcelableUsbPort;->describeContents()I
 HSPLandroid/hardware/usb/ParcelableUsbPort;->getUsbPort(Landroid/hardware/usb/UsbManager;)Landroid/hardware/usb/UsbPort;
 HSPLandroid/hardware/usb/ParcelableUsbPort;->of(Landroid/hardware/usb/UsbPort;)Landroid/hardware/usb/ParcelableUsbPort;
 HSPLandroid/hardware/usb/ParcelableUsbPort;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/hardware/usb/UsbManager;-><init>(Landroid/content/Context;Landroid/hardware/usb/IUsbManager;)V
-HSPLandroid/hardware/usb/UsbManager;->getAccessoryList()[Landroid/hardware/usb/UsbAccessory;
 HSPLandroid/hardware/usb/UsbManager;->getDeviceList()Ljava/util/HashMap;
-HSPLandroid/hardware/usb/UsbManager;->getPortStatus(Landroid/hardware/usb/UsbPort;)Landroid/hardware/usb/UsbPortStatus;
-HSPLandroid/hardware/usb/UsbManager;->getPorts()Ljava/util/List;
 HSPLandroid/hardware/usb/UsbManager;->usbFunctionsFromString(Ljava/lang/String;)J
 HSPLandroid/hardware/usb/UsbManager;->usbFunctionsToString(J)Ljava/lang/String;
 HSPLandroid/hardware/usb/UsbPort;-><init>(Landroid/hardware/usb/UsbManager;Ljava/lang/String;IIZZ)V
@@ -11923,7 +10498,6 @@
 HSPLandroid/hardware/usb/UsbPort;->combineRolesAsBit(II)I
 HSPLandroid/hardware/usb/UsbPort;->dataRoleToString(I)Ljava/lang/String;
 HSPLandroid/hardware/usb/UsbPort;->getId()Ljava/lang/String;
-HSPLandroid/hardware/usb/UsbPort;->getStatus()Landroid/hardware/usb/UsbPortStatus;
 HSPLandroid/hardware/usb/UsbPort;->getSupportedContaminantProtectionModes()I
 HSPLandroid/hardware/usb/UsbPort;->getSupportedModes()I
 PLandroid/hardware/usb/UsbPort;->isModeSupported(I)Z
@@ -11933,8 +10507,6 @@
 HSPLandroid/hardware/usb/UsbPort;->supportsEnableContaminantPresenceDetection()Z
 HSPLandroid/hardware/usb/UsbPort;->supportsEnableContaminantPresenceProtection()Z
 HSPLandroid/hardware/usb/UsbPort;->toString()Ljava/lang/String;
-HSPLandroid/hardware/usb/UsbPortStatus$1;->createFromParcel(Landroid/os/Parcel;)Landroid/hardware/usb/UsbPortStatus;
-HSPLandroid/hardware/usb/UsbPortStatus$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/hardware/usb/UsbPortStatus;-><init>(IIIIII)V
 HSPLandroid/hardware/usb/UsbPortStatus;->describeContents()I
 HSPLandroid/hardware/usb/UsbPortStatus;->getContaminantDetectionStatus()I
@@ -11994,11 +10566,9 @@
 HSPLandroid/icu/impl/CaseMapImpl$StringContextIterator;->nextCaseMapCP()I
 HSPLandroid/icu/impl/CaseMapImpl$StringContextIterator;->setLimit(I)V
 HSPLandroid/icu/impl/CaseMapImpl;-><clinit>()V
-HSPLandroid/icu/impl/CaseMapImpl;->appendCodePoint(Ljava/lang/Appendable;I)I
 HSPLandroid/icu/impl/CaseMapImpl;->appendResult(ILjava/lang/Appendable;IILandroid/icu/text/Edits;)V
 HSPLandroid/icu/impl/CaseMapImpl;->appendUnchanged(Ljava/lang/CharSequence;IILjava/lang/Appendable;ILandroid/icu/text/Edits;)V
 HSPLandroid/icu/impl/CaseMapImpl;->applyEdits(Ljava/lang/CharSequence;Ljava/lang/StringBuilder;Landroid/icu/text/Edits;)Ljava/lang/String;
-HSPLandroid/icu/impl/CaseMapImpl;->getTitleBreakIterator(Landroid/icu/util/ULocale;ILandroid/icu/text/BreakIterator;)Landroid/icu/text/BreakIterator;
 HSPLandroid/icu/impl/CaseMapImpl;->internalToUpper(IILjava/lang/CharSequence;Ljava/lang/Appendable;Landroid/icu/text/Edits;)V
 HSPLandroid/icu/impl/CaseMapImpl;->toTitle(IILandroid/icu/text/BreakIterator;Ljava/lang/CharSequence;)Ljava/lang/String;
 HSPLandroid/icu/impl/CaseMapImpl;->toTitle(IILandroid/icu/text/BreakIterator;Ljava/lang/CharSequence;Ljava/lang/Appendable;Landroid/icu/text/Edits;)Ljava/lang/Appendable;
@@ -12023,6 +10593,7 @@
 HSPLandroid/icu/impl/DateNumberFormat;->getDigits()[C
 HSPLandroid/icu/impl/DateNumberFormat;->initialize(Landroid/icu/util/ULocale;Ljava/lang/String;Ljava/lang/String;)V
 HSPLandroid/icu/impl/DontCareFieldPosition;-><clinit>()V
+HSPLandroid/icu/impl/DontCareFieldPosition;-><init>()V
 HSPLandroid/icu/impl/FormattedStringBuilder;-><clinit>()V
 HSPLandroid/icu/impl/FormattedStringBuilder;-><init>()V
 HSPLandroid/icu/impl/FormattedStringBuilder;-><init>(I)V
@@ -12111,7 +10682,6 @@
 HSPLandroid/icu/impl/ICUCurrencyMetaInfo;->collect(Landroid/icu/impl/ICUCurrencyMetaInfo$Collector;Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;)Ljava/util/List;
 HSPLandroid/icu/impl/ICUCurrencyMetaInfo;->collectRegion(Landroid/icu/impl/ICUCurrencyMetaInfo$Collector;Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;ILandroid/icu/impl/ICUResourceBundle;)V
 HSPLandroid/icu/impl/ICUCurrencyMetaInfo;->currencies(Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;)Ljava/util/List;
-HSPLandroid/icu/impl/ICUCurrencyMetaInfo;->currencyDigits(Ljava/lang/String;Landroid/icu/util/Currency$CurrencyUsage;)Landroid/icu/text/CurrencyMetaInfo$CurrencyDigits;
 HSPLandroid/icu/impl/ICUData;->checkStreamForBinaryData(Ljava/io/InputStream;Ljava/lang/String;)V
 HSPLandroid/icu/impl/ICUData;->getStream(Ljava/lang/ClassLoader;Ljava/lang/String;Z)Ljava/io/InputStream;
 HSPLandroid/icu/impl/ICUDebug;->enabled(Ljava/lang/String;)Z
@@ -12210,7 +10780,6 @@
 HSPLandroid/icu/impl/ICUResourceBundleImpl$ResourceArray;->handleGet(ILjava/util/HashMap;Landroid/icu/util/UResourceBundle;)Landroid/icu/util/UResourceBundle;
 HSPLandroid/icu/impl/ICUResourceBundleImpl$ResourceArray;->handleGetStringArray()[Ljava/lang/String;
 HSPLandroid/icu/impl/ICUResourceBundleImpl$ResourceBinary;-><init>(Landroid/icu/impl/ICUResourceBundleImpl;Ljava/lang/String;I)V
-HSPLandroid/icu/impl/ICUResourceBundleImpl$ResourceBinary;->getBinary()Ljava/nio/ByteBuffer;
 HSPLandroid/icu/impl/ICUResourceBundleImpl$ResourceBinary;->getBinary([B)[B
 HSPLandroid/icu/impl/ICUResourceBundleImpl$ResourceContainer;-><init>(Landroid/icu/impl/ICUResourceBundle$WholeBundle;)V
 HSPLandroid/icu/impl/ICUResourceBundleImpl$ResourceContainer;-><init>(Landroid/icu/impl/ICUResourceBundleImpl;Ljava/lang/String;I)V
@@ -12304,7 +10873,6 @@
 HSPLandroid/icu/impl/ICUResourceBundleReader;->compareKeys(Ljava/lang/CharSequence;C)I
 HSPLandroid/icu/impl/ICUResourceBundleReader;->getAlias(I)Ljava/lang/String;
 HSPLandroid/icu/impl/ICUResourceBundleReader;->getArray(I)Landroid/icu/impl/ICUResourceBundleReader$Array;
-HSPLandroid/icu/impl/ICUResourceBundleReader;->getBinary(I)Ljava/nio/ByteBuffer;
 HSPLandroid/icu/impl/ICUResourceBundleReader;->getBinary(I[B)[B
 HSPLandroid/icu/impl/ICUResourceBundleReader;->getChars(II)[C
 HSPLandroid/icu/impl/ICUResourceBundleReader;->getFullName(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
@@ -12349,18 +10917,13 @@
 HSPLandroid/icu/impl/JavaTimeZone;->getOffset(JZ[I)V
 HSPLandroid/icu/impl/JavaTimeZone;->hashCode()I
 HSPLandroid/icu/impl/JavaTimeZone;->isFrozen()Z
-HSPLandroid/icu/impl/LocaleIDParser$1;-><init>(Landroid/icu/impl/LocaleIDParser;)V
-HSPLandroid/icu/impl/LocaleIDParser$1;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
-HSPLandroid/icu/impl/LocaleIDParser$1;->compare(Ljava/lang/String;Ljava/lang/String;)I
 HSPLandroid/icu/impl/LocaleIDParser;-><init>(Ljava/lang/String;)V
 HSPLandroid/icu/impl/LocaleIDParser;-><init>(Ljava/lang/String;Z)V
 HSPLandroid/icu/impl/LocaleIDParser;->addSeparator()V
 HSPLandroid/icu/impl/LocaleIDParser;->append(C)V
-HSPLandroid/icu/impl/LocaleIDParser;->append(Ljava/lang/String;)V
 HSPLandroid/icu/impl/LocaleIDParser;->atTerminator()Z
 HSPLandroid/icu/impl/LocaleIDParser;->getBaseName()Ljava/lang/String;
 HSPLandroid/icu/impl/LocaleIDParser;->getCountry()Ljava/lang/String;
-HSPLandroid/icu/impl/LocaleIDParser;->getKeyComparator()Ljava/util/Comparator;
 HSPLandroid/icu/impl/LocaleIDParser;->getKeywordMap()Ljava/util/Map;
 HSPLandroid/icu/impl/LocaleIDParser;->getKeywordValue(Ljava/lang/String;)Ljava/lang/String;
 HSPLandroid/icu/impl/LocaleIDParser;->getKeywords()Ljava/util/Iterator;
@@ -12381,8 +10944,6 @@
 HSPLandroid/icu/impl/LocaleIDParser;->parseVariant()I
 HSPLandroid/icu/impl/LocaleIDParser;->reset()V
 HSPLandroid/icu/impl/LocaleIDParser;->set(ILjava/lang/String;)V
-HSPLandroid/icu/impl/LocaleIDParser;->setKeywordValue(Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/icu/impl/LocaleIDParser;->setKeywordValue(Ljava/lang/String;Ljava/lang/String;Z)V
 HSPLandroid/icu/impl/LocaleIDParser;->setToKeywordStart()Z
 HSPLandroid/icu/impl/LocaleIDParser;->skipCountry()V
 HSPLandroid/icu/impl/LocaleIDParser;->skipLanguage()V
@@ -12729,21 +11290,9 @@
 HSPLandroid/icu/impl/ZoneMeta;->getZoneIndex(Ljava/lang/String;)I
 HSPLandroid/icu/impl/ZoneMeta;->openOlsonResource(Landroid/icu/util/UResourceBundle;Ljava/lang/String;)Landroid/icu/util/UResourceBundle;
 HSPLandroid/icu/impl/coll/Collation;-><clinit>()V
-HSPLandroid/icu/impl/coll/Collation;->ceFromCE32(I)J
-HSPLandroid/icu/impl/coll/Collation;->ceFromSimpleCE32(I)J
-HSPLandroid/icu/impl/coll/Collation;->incThreeBytePrimaryByOffset(JZI)J
-HSPLandroid/icu/impl/coll/Collation;->indexFromCE32(I)I
-HSPLandroid/icu/impl/coll/Collation;->isSpecialCE32(I)Z
-HSPLandroid/icu/impl/coll/Collation;->latinCE0FromCE32(I)J
-HSPLandroid/icu/impl/coll/Collation;->latinCE1FromCE32(I)J
-HSPLandroid/icu/impl/coll/Collation;->lengthFromCE32(I)I
-HSPLandroid/icu/impl/coll/Collation;->makeCE(J)J
-HSPLandroid/icu/impl/coll/Collation;->tagFromCE32(I)I
 HSPLandroid/icu/impl/coll/CollationData;-><clinit>()V
 HSPLandroid/icu/impl/coll/CollationData;-><init>(Landroid/icu/impl/Normalizer2Impl;)V
 HSPLandroid/icu/impl/coll/CollationData;->getCE32(I)I
-HSPLandroid/icu/impl/coll/CollationData;->getCE32FromContexts(I)I
-HSPLandroid/icu/impl/coll/CollationData;->getFirstPrimaryForGroup(I)J
 HSPLandroid/icu/impl/coll/CollationData;->getLastPrimaryForGroup(I)J
 HSPLandroid/icu/impl/coll/CollationData;->getScriptIndex(I)I
 HSPLandroid/icu/impl/coll/CollationData;->isUnsafeBackward(IZ)Z
@@ -12752,37 +11301,14 @@
 HSPLandroid/icu/impl/coll/CollationDataReader$IsAcceptable;->isDataVersionAcceptable([B)Z
 HSPLandroid/icu/impl/coll/CollationDataReader;-><clinit>()V
 HSPLandroid/icu/impl/coll/CollationDataReader;->read(Landroid/icu/impl/coll/CollationTailoring;Ljava/nio/ByteBuffer;Landroid/icu/impl/coll/CollationTailoring;)V
-HSPLandroid/icu/impl/coll/CollationFCD;-><clinit>()V
-HSPLandroid/icu/impl/coll/CollationFCD;->hasTccc(I)Z
 HSPLandroid/icu/impl/coll/CollationFastLatin;-><clinit>()V
 HSPLandroid/icu/impl/coll/CollationFastLatin;->compareUTF16([C[CILjava/lang/CharSequence;Ljava/lang/CharSequence;I)I
 HSPLandroid/icu/impl/coll/CollationFastLatin;->getOptions(Landroid/icu/impl/coll/CollationData;Landroid/icu/impl/coll/CollationSettings;[C)I
 HSPLandroid/icu/impl/coll/CollationIterator$CEBuffer;-><init>()V
 HSPLandroid/icu/impl/coll/CollationIterator$CEBuffer;->append(J)V
-HSPLandroid/icu/impl/coll/CollationIterator$CEBuffer;->appendUnsafe(J)V
 HSPLandroid/icu/impl/coll/CollationIterator$CEBuffer;->ensureAppendCapacity(I)V
 HSPLandroid/icu/impl/coll/CollationIterator$CEBuffer;->get(I)J
-HSPLandroid/icu/impl/coll/CollationIterator$CEBuffer;->incLength()V
-HSPLandroid/icu/impl/coll/CollationIterator$CEBuffer;->set(IJ)J
 HSPLandroid/icu/impl/coll/CollationIterator;-><clinit>()V
-HSPLandroid/icu/impl/coll/CollationIterator;-><init>(Landroid/icu/impl/coll/CollationData;)V
-HSPLandroid/icu/impl/coll/CollationIterator;->appendCEsFromCE32(Landroid/icu/impl/coll/CollationData;IIZ)V
-HSPLandroid/icu/impl/coll/CollationIterator;->clearCEs()V
-HSPLandroid/icu/impl/coll/CollationIterator;->clearCEsIfNoneRemaining()V
-HSPLandroid/icu/impl/coll/CollationIterator;->makeCodePointAndCE32Pair(II)J
-HSPLandroid/icu/impl/coll/CollationIterator;->nextCE()J
-HSPLandroid/icu/impl/coll/CollationIterator;->nextCE32FromContraction(Landroid/icu/impl/coll/CollationData;ILjava/lang/CharSequence;III)I
-HSPLandroid/icu/impl/coll/CollationIterator;->nextCEFromCE32(Landroid/icu/impl/coll/CollationData;II)J
-HSPLandroid/icu/impl/coll/CollationIterator;->reset()V
-HSPLandroid/icu/impl/coll/CollationIterator;->reset(Z)V
-HSPLandroid/icu/impl/coll/CollationKeys$LevelCallback;-><init>()V
-HSPLandroid/icu/impl/coll/CollationKeys$SortKeyByteSink;-><init>([B)V
-HSPLandroid/icu/impl/coll/CollationKeys$SortKeyByteSink;->Append(I)V
-HSPLandroid/icu/impl/coll/CollationKeys$SortKeyByteSink;->Append([BI)V
-HSPLandroid/icu/impl/coll/CollationKeys$SortKeyByteSink;->NumberOfBytesAppended()I
-HSPLandroid/icu/impl/coll/CollationKeys;-><clinit>()V
-HSPLandroid/icu/impl/coll/CollationKeys;->getSortKeyLevel(II)Landroid/icu/impl/coll/CollationKeys$SortKeyLevel;
-HSPLandroid/icu/impl/coll/CollationKeys;->writeSortKeyUpToQuaternary(Landroid/icu/impl/coll/CollationIterator;[ZLandroid/icu/impl/coll/CollationSettings;Landroid/icu/impl/coll/CollationKeys$SortKeyByteSink;ILandroid/icu/impl/coll/CollationKeys$LevelCallback;Z)V
 HSPLandroid/icu/impl/coll/CollationLoader;-><clinit>()V
 HSPLandroid/icu/impl/coll/CollationLoader;->findWithFallback(Landroid/icu/util/UResourceBundle;Ljava/lang/String;)Landroid/icu/util/UResourceBundle;
 HSPLandroid/icu/impl/coll/CollationLoader;->loadTailoring(Landroid/icu/util/ULocale;Landroid/icu/util/Output;)Landroid/icu/impl/coll/CollationTailoring;
@@ -12790,7 +11316,6 @@
 HSPLandroid/icu/impl/coll/CollationRoot;->getRoot()Landroid/icu/impl/coll/CollationTailoring;
 HSPLandroid/icu/impl/coll/CollationSettings;-><clinit>()V
 HSPLandroid/icu/impl/coll/CollationSettings;-><init>()V
-HSPLandroid/icu/impl/coll/CollationSettings;->aliasReordering(Landroid/icu/impl/coll/CollationData;[II[B)V
 HSPLandroid/icu/impl/coll/CollationSettings;->clone()Landroid/icu/impl/coll/CollationSettings;
 HSPLandroid/icu/impl/coll/CollationSettings;->clone()Landroid/icu/impl/coll/SharedObject;
 HSPLandroid/icu/impl/coll/CollationSettings;->dontCheckFCD()Z
@@ -12798,21 +11323,14 @@
 HSPLandroid/icu/impl/coll/CollationSettings;->getMaxVariable()I
 HSPLandroid/icu/impl/coll/CollationSettings;->getStrength()I
 HSPLandroid/icu/impl/coll/CollationSettings;->getStrength(I)I
-HSPLandroid/icu/impl/coll/CollationSettings;->getTertiaryMask(I)I
 HSPLandroid/icu/impl/coll/CollationSettings;->hasReordering()Z
 HSPLandroid/icu/impl/coll/CollationSettings;->isNumeric()Z
-HSPLandroid/icu/impl/coll/CollationSettings;->isTertiaryWithCaseBits(I)Z
-HSPLandroid/icu/impl/coll/CollationSettings;->reorder(J)J
 HSPLandroid/icu/impl/coll/CollationSettings;->setFlag(IZ)V
-HSPLandroid/icu/impl/coll/CollationSettings;->setReorderRanges([III)V
 HSPLandroid/icu/impl/coll/CollationSettings;->setStrength(I)V
 HSPLandroid/icu/impl/coll/CollationTailoring;-><clinit>()V
 HSPLandroid/icu/impl/coll/CollationTailoring;-><init>(Landroid/icu/impl/coll/SharedObject$Reference;)V
 HSPLandroid/icu/impl/coll/CollationTailoring;->ensureOwnedData()V
 HSPLandroid/icu/impl/coll/FCDUTF16CollationIterator;-><clinit>()V
-HSPLandroid/icu/impl/coll/FCDUTF16CollationIterator;-><init>(Landroid/icu/impl/coll/CollationData;)V
-HSPLandroid/icu/impl/coll/FCDUTF16CollationIterator;->handleNextCE32()J
-HSPLandroid/icu/impl/coll/FCDUTF16CollationIterator;->setText(ZLjava/lang/CharSequence;I)V
 HSPLandroid/icu/impl/coll/SharedObject$Reference;-><init>(Landroid/icu/impl/coll/SharedObject;)V
 HSPLandroid/icu/impl/coll/SharedObject$Reference;->clear()V
 HSPLandroid/icu/impl/coll/SharedObject$Reference;->clone()Landroid/icu/impl/coll/SharedObject$Reference;
@@ -12825,8 +11343,6 @@
 HSPLandroid/icu/impl/coll/SharedObject;->getRefCount()I
 HSPLandroid/icu/impl/coll/SharedObject;->removeRef()V
 HSPLandroid/icu/impl/coll/UTF16CollationIterator;-><clinit>()V
-HSPLandroid/icu/impl/coll/UTF16CollationIterator;-><init>(Landroid/icu/impl/coll/CollationData;)V
-HSPLandroid/icu/impl/coll/UTF16CollationIterator;->setText(ZLjava/lang/CharSequence;I)V
 HSPLandroid/icu/impl/locale/AsciiUtil;->caseIgnoreMatch(Ljava/lang/String;Ljava/lang/String;)Z
 HSPLandroid/icu/impl/locale/AsciiUtil;->isAlpha(C)Z
 HSPLandroid/icu/impl/locale/AsciiUtil;->isAlphaString(Ljava/lang/String;)Z
@@ -12863,14 +11379,11 @@
 HSPLandroid/icu/impl/locale/LanguageTag;->getScript()Ljava/lang/String;
 HSPLandroid/icu/impl/locale/LanguageTag;->getVariants()Ljava/util/List;
 HSPLandroid/icu/impl/locale/LanguageTag;->isLanguage(Ljava/lang/String;)Z
-HSPLandroid/icu/impl/locale/LanguageTag;->isScript(Ljava/lang/String;)Z
 HSPLandroid/icu/impl/locale/LanguageTag;->parseLocale(Landroid/icu/impl/locale/BaseLocale;Landroid/icu/impl/locale/LocaleExtensions;)Landroid/icu/impl/locale/LanguageTag;
-HSPLandroid/icu/impl/locale/LocaleExtensions;-><clinit>()V
 HSPLandroid/icu/impl/locale/LocaleObjectCache$CacheEntry;-><init>(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/ref/ReferenceQueue;)V
 HSPLandroid/icu/impl/locale/LocaleObjectCache$CacheEntry;->getKey()Ljava/lang/Object;
 HSPLandroid/icu/impl/locale/LocaleObjectCache;->cleanStaleEntries()V
 HSPLandroid/icu/impl/locale/LocaleObjectCache;->get(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/icu/impl/locale/UnicodeLocaleExtension;-><clinit>()V
 HSPLandroid/icu/impl/number/AdoptingModifierStore;-><clinit>()V
 HSPLandroid/icu/impl/number/AdoptingModifierStore;-><init>(Landroid/icu/impl/number/Modifier;Landroid/icu/impl/number/Modifier;Landroid/icu/impl/number/Modifier;)V
 HSPLandroid/icu/impl/number/AdoptingModifierStore;->getModifierWithoutPlural(I)Landroid/icu/impl/number/Modifier;
@@ -13218,7 +11731,6 @@
 HSPLandroid/icu/lang/UCharacter;->isDigit(I)Z
 HSPLandroid/icu/lang/UCharacter;->isHighSurrogate(C)Z
 HSPLandroid/icu/lang/UCharacter;->isLowerCase(I)Z
-HSPLandroid/icu/lang/UCharacter;->toTitleCase(Landroid/icu/util/ULocale;Ljava/lang/String;Landroid/icu/text/BreakIterator;I)Ljava/lang/String;
 HSPLandroid/icu/lang/UScript$ScriptMetadata;-><clinit>()V
 HSPLandroid/icu/lang/UScript$ScriptMetadata;->access$000(I)I
 HSPLandroid/icu/lang/UScript$ScriptMetadata;->getScriptProps(I)I
@@ -13229,7 +11741,6 @@
 HSPLandroid/icu/lang/UScript;->getCodeFromName(Ljava/lang/String;)I
 HSPLandroid/icu/lang/UScript;->getScript(I)I
 HSPLandroid/icu/lang/UScript;->isRightToLeft(I)Z
-HSPLandroid/icu/number/CurrencyPrecision;->withCurrency(Landroid/icu/util/Currency;)Landroid/icu/number/Precision;
 HSPLandroid/icu/number/FormattedNumber;-><init>(Landroid/icu/impl/FormattedStringBuilder;Landroid/icu/impl/number/DecimalQuantity;)V
 HSPLandroid/icu/number/FormattedNumber;->appendTo(Ljava/lang/Appendable;)Ljava/lang/Appendable;
 HSPLandroid/icu/number/FormattedNumber;->nextFieldPosition(Ljava/text/FieldPosition;)Z
@@ -13285,12 +11796,9 @@
 HSPLandroid/icu/number/Precision;->access$000(I)I
 HSPLandroid/icu/number/Precision;->access$100(I)I
 HSPLandroid/icu/number/Precision;->clone()Ljava/lang/Object;
-HSPLandroid/icu/number/Precision;->constructCurrency(Landroid/icu/util/Currency$CurrencyUsage;)Landroid/icu/number/CurrencyPrecision;
 HSPLandroid/icu/number/Precision;->constructFraction(II)Landroid/icu/number/FractionPrecision;
-HSPLandroid/icu/number/Precision;->constructFromCurrency(Landroid/icu/number/CurrencyPrecision;Landroid/icu/util/Currency;)Landroid/icu/number/Precision;
 HSPLandroid/icu/number/Precision;->getDisplayMagnitudeFraction(I)I
 HSPLandroid/icu/number/Precision;->getRoundingMagnitudeFraction(I)I
-HSPLandroid/icu/number/Precision;->integer()Landroid/icu/number/FractionPrecision;
 HSPLandroid/icu/number/Precision;->withLocaleData(Landroid/icu/util/Currency;)Landroid/icu/number/Precision;
 HSPLandroid/icu/number/Precision;->withMode(Ljava/math/MathContext;)Landroid/icu/number/Precision;
 HSPLandroid/icu/number/Scale;-><clinit>()V
@@ -13339,6 +11847,7 @@
 HSPLandroid/icu/text/BreakIterator;-><init>()V
 HSPLandroid/icu/text/BreakIterator;->clone()Ljava/lang/Object;
 HSPLandroid/icu/text/BreakIterator;->getBreakInstance(Landroid/icu/util/ULocale;I)Landroid/icu/text/BreakIterator;
+HSPLandroid/icu/text/BreakIterator;->getLineInstance(Ljava/util/Locale;)Landroid/icu/text/BreakIterator;
 HSPLandroid/icu/text/BreakIterator;->getSentenceInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/BreakIterator;
 HSPLandroid/icu/text/BreakIterator;->getShim()Landroid/icu/text/BreakIterator$BreakIteratorServiceShim;
 HSPLandroid/icu/text/BreakIterator;->getWordInstance(Ljava/util/Locale;)Landroid/icu/text/BreakIterator;
@@ -13356,10 +11865,6 @@
 HSPLandroid/icu/text/CaseMap;->access$500(Ljava/util/Locale;)I
 HSPLandroid/icu/text/CaseMap;->getCaseLocale(Ljava/util/Locale;)I
 HSPLandroid/icu/text/CaseMap;->toUpper()Landroid/icu/text/CaseMap$Upper;
-HSPLandroid/icu/text/CollationKey;-><clinit>()V
-HSPLandroid/icu/text/CollationKey;-><init>(Ljava/lang/String;Landroid/icu/text/RawCollationKey;)V
-HSPLandroid/icu/text/CollationKey;->getLength()I
-HSPLandroid/icu/text/CollationKey;->toByteArray()[B
 HSPLandroid/icu/text/Collator$ServiceShim;-><init>()V
 HSPLandroid/icu/text/Collator;-><clinit>()V
 HSPLandroid/icu/text/Collator;-><init>()V
@@ -13390,7 +11895,6 @@
 HSPLandroid/icu/text/ConstrainedFieldPosition;->setState(Ljava/text/Format$Field;Ljava/lang/Object;II)V
 HSPLandroid/icu/text/CurrencyDisplayNames;-><init>()V
 HSPLandroid/icu/text/CurrencyDisplayNames;->getInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/CurrencyDisplayNames;
-HSPLandroid/icu/text/CurrencyMetaInfo$CurrencyDigits;-><init>(II)V
 HSPLandroid/icu/text/CurrencyMetaInfo$CurrencyFilter;-><init>(Ljava/lang/String;Ljava/lang/String;JJZ)V
 HSPLandroid/icu/text/CurrencyMetaInfo$CurrencyFilter;->onRegion(Ljava/lang/String;)Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;
 HSPLandroid/icu/text/CurrencyMetaInfo$CurrencyFilter;->withRegion(Ljava/lang/String;)Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;
@@ -13443,15 +11947,12 @@
 HSPLandroid/icu/text/DateFormatSymbols;->setLocale(Landroid/icu/util/ULocale;Landroid/icu/util/ULocale;)V
 HSPLandroid/icu/text/DateFormatSymbols;->setTimeSeparatorString(Ljava/lang/String;)V
 HSPLandroid/icu/text/DateIntervalFormat$BestMatchInfo;-><init>(Ljava/lang/String;I)V
-HSPLandroid/icu/text/DateIntervalFormat$SkeletonAndItsBestMatch;-><init>(Ljava/lang/String;Ljava/lang/String;)V
 HSPLandroid/icu/text/DateIntervalFormat;-><clinit>()V
 HSPLandroid/icu/text/DateIntervalFormat;-><init>(Ljava/lang/String;Landroid/icu/util/ULocale;Landroid/icu/text/SimpleDateFormat;)V
-HSPLandroid/icu/text/DateIntervalFormat;->adjustFieldWidth(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)Ljava/lang/String;
 HSPLandroid/icu/text/DateIntervalFormat;->concatSingleDate2TimeInterval(Ljava/lang/String;Ljava/lang/String;ILjava/util/Map;)V
 HSPLandroid/icu/text/DateIntervalFormat;->fieldExistsInSkeleton(ILjava/lang/String;)Z
 HSPLandroid/icu/text/DateIntervalFormat;->format(Landroid/icu/util/Calendar;Landroid/icu/util/Calendar;Ljava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;
 HSPLandroid/icu/text/DateIntervalFormat;->formatImpl(Landroid/icu/util/Calendar;Landroid/icu/util/Calendar;Ljava/lang/StringBuffer;Ljava/text/FieldPosition;Landroid/icu/text/DateIntervalFormat$FormatOutput;Ljava/util/List;)Ljava/lang/StringBuffer;
-HSPLandroid/icu/text/DateIntervalFormat;->genFallbackPattern(ILjava/lang/String;Ljava/util/Map;Landroid/icu/text/DateTimePatternGenerator;)V
 HSPLandroid/icu/text/DateIntervalFormat;->genIntervalPattern(ILjava/lang/String;Ljava/lang/String;ILjava/util/Map;)Landroid/icu/text/DateIntervalFormat$SkeletonAndItsBestMatch;
 HSPLandroid/icu/text/DateIntervalFormat;->genSeparateDateTimePtn(Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;Landroid/icu/text/DateTimePatternGenerator;)Z
 HSPLandroid/icu/text/DateIntervalFormat;->getConcatenationPattern(Landroid/icu/util/ULocale;)Ljava/lang/String;
@@ -13491,7 +11992,6 @@
 HSPLandroid/icu/text/DateIntervalInfo;->setIntervalPatternInternally(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Landroid/icu/text/DateIntervalInfo$PatternInfo;
 HSPLandroid/icu/text/DateIntervalInfo;->setup(Landroid/icu/util/ULocale;)V
 HSPLandroid/icu/text/DateIntervalInfo;->splitPatternInto2Part(Ljava/lang/String;)I
-HSPLandroid/icu/text/DateIntervalInfo;->stringNumeric(IIC)Z
 HSPLandroid/icu/text/DateTimePatternGenerator$AppendItemFormatsSink;-><clinit>()V
 HSPLandroid/icu/text/DateTimePatternGenerator$AppendItemFormatsSink;-><init>(Landroid/icu/text/DateTimePatternGenerator;)V
 HSPLandroid/icu/text/DateTimePatternGenerator$AppendItemFormatsSink;-><init>(Landroid/icu/text/DateTimePatternGenerator;Landroid/icu/text/DateTimePatternGenerator$1;)V
@@ -13715,33 +12215,34 @@
 HSPLandroid/icu/text/DictionaryBreakEngine$DequeI;->removeAllElements()V
 HSPLandroid/icu/text/DictionaryBreakEngine$DequeI;->size()I
 HSPLandroid/icu/text/DisplayContext;->type()Landroid/icu/text/DisplayContext$Type;
-HSPLandroid/icu/text/Edits$Iterator;-><clinit>()V
 HSPLandroid/icu/text/Edits$Iterator;-><init>([CIZZ)V
 HSPLandroid/icu/text/Edits$Iterator;-><init>([CIZZLandroid/icu/text/Edits$1;)V
-HSPLandroid/icu/text/Edits$Iterator;->hasChange()Z
-HSPLandroid/icu/text/Edits$Iterator;->newLength()I
-HSPLandroid/icu/text/Edits$Iterator;->next()Z
 HSPLandroid/icu/text/Edits$Iterator;->next(Z)Z
-HSPLandroid/icu/text/Edits$Iterator;->noNext()Z
-HSPLandroid/icu/text/Edits$Iterator;->replacementIndex()I
-HSPLandroid/icu/text/Edits$Iterator;->sourceIndex()I
-HSPLandroid/icu/text/Edits$Iterator;->updateNextIndexes()V
 HSPLandroid/icu/text/Edits;-><init>()V
 HSPLandroid/icu/text/Edits;->addReplace(II)V
 HSPLandroid/icu/text/Edits;->addUnchanged(I)V
 HSPLandroid/icu/text/Edits;->append(I)V
-HSPLandroid/icu/text/Edits;->getCoarseIterator()Landroid/icu/text/Edits$Iterator;
 HSPLandroid/icu/text/Edits;->hasChanges()Z
 HSPLandroid/icu/text/Edits;->lastUnit()I
-HSPLandroid/icu/text/Edits;->lengthDelta()I
 HSPLandroid/icu/text/Edits;->reset()V
 HSPLandroid/icu/text/Edits;->setLastUnit(I)V
 HSPLandroid/icu/text/IDNA;->convertIDNToASCII(Ljava/lang/String;I)Ljava/lang/StringBuffer;
-HSPLandroid/icu/text/ListFormatter$FormattedListBuilder;->appendTo(Ljava/lang/Appendable;)V
+HSPLandroid/icu/text/ListFormatter$Cache;-><init>()V
+HSPLandroid/icu/text/ListFormatter$Cache;-><init>(Landroid/icu/text/ListFormatter$1;)V
+HSPLandroid/icu/text/ListFormatter$Cache;->get(Landroid/icu/util/ULocale;Ljava/lang/String;)Landroid/icu/text/ListFormatter;
+HSPLandroid/icu/text/ListFormatter$Cache;->load(Landroid/icu/util/ULocale;Ljava/lang/String;)Landroid/icu/text/ListFormatter;
+HSPLandroid/icu/text/ListFormatter$FormattedListBuilder;-><init>(Ljava/lang/Object;Z)V
+HSPLandroid/icu/text/ListFormatter$FormattedListBuilder;->append(Ljava/lang/String;Ljava/lang/Object;Z)Landroid/icu/text/ListFormatter$FormattedListBuilder;
+HSPLandroid/icu/text/ListFormatter$FormattedListBuilder;->offsetRecorded()Z
 HSPLandroid/icu/text/ListFormatter$Style;-><clinit>()V
 HSPLandroid/icu/text/ListFormatter$Style;-><init>(Ljava/lang/String;ILjava/lang/String;)V
 HSPLandroid/icu/text/ListFormatter$Style;->getName()Ljava/lang/String;
 HSPLandroid/icu/text/ListFormatter;-><clinit>()V
+HSPLandroid/icu/text/ListFormatter;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/icu/util/ULocale;)V
+HSPLandroid/icu/text/ListFormatter;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/icu/util/ULocale;Landroid/icu/text/ListFormatter$1;)V
+HSPLandroid/icu/text/ListFormatter;->access$000(Ljava/lang/String;Ljava/lang/StringBuilder;)Ljava/lang/String;
+HSPLandroid/icu/text/ListFormatter;->compilePattern(Ljava/lang/String;Ljava/lang/StringBuilder;)Ljava/lang/String;
+HSPLandroid/icu/text/ListFormatter;->format(Ljava/util/Collection;I)Landroid/icu/text/ListFormatter$FormattedListBuilder;
 HSPLandroid/icu/text/ListFormatter;->getInstance(Landroid/icu/util/ULocale;Landroid/icu/text/ListFormatter$Style;)Landroid/icu/text/ListFormatter;
 HSPLandroid/icu/text/MeasureFormat$FormatWidth;-><clinit>()V
 HSPLandroid/icu/text/MeasureFormat$FormatWidth;-><init>(Ljava/lang/String;ILandroid/icu/text/ListFormatter$Style;Landroid/icu/number/NumberFormatter$UnitWidth;Landroid/icu/number/NumberFormatter$UnitWidth;)V
@@ -13872,7 +12373,6 @@
 HSPLandroid/icu/text/PluralRules;->parseRuleChain(Ljava/lang/String;)Landroid/icu/text/PluralRules$RuleList;
 HSPLandroid/icu/text/PluralRules;->select(D)Ljava/lang/String;
 HSPLandroid/icu/text/PluralRules;->select(Landroid/icu/text/PluralRules$IFixedDecimal;)Ljava/lang/String;
-HSPLandroid/icu/text/RawCollationKey;-><init>(I)V
 HSPLandroid/icu/text/RelativeDateTimeFormatter$1;-><clinit>()V
 HSPLandroid/icu/text/RelativeDateTimeFormatter$AbsoluteUnit;-><clinit>()V
 HSPLandroid/icu/text/RelativeDateTimeFormatter$AbsoluteUnit;-><init>(Ljava/lang/String;I)V
@@ -13983,7 +12483,6 @@
 HSPLandroid/icu/text/RuleBasedBreakIterator;->setText(Ljava/text/CharacterIterator;)V
 HSPLandroid/icu/text/RuleBasedCollator$CollationBuffer;-><init>(Landroid/icu/impl/coll/CollationData;)V
 HSPLandroid/icu/text/RuleBasedCollator$CollationBuffer;-><init>(Landroid/icu/impl/coll/CollationData;Landroid/icu/text/RuleBasedCollator$1;)V
-HSPLandroid/icu/text/RuleBasedCollator$CollationKeyByteSink;-><init>(Landroid/icu/text/RawCollationKey;)V
 HSPLandroid/icu/text/RuleBasedCollator$FCDUTF16NFDIterator;-><init>()V
 HSPLandroid/icu/text/RuleBasedCollator$NFDIterator;-><init>()V
 HSPLandroid/icu/text/RuleBasedCollator$UTF16NFDIterator;-><init>()V
@@ -13995,18 +12494,13 @@
 HSPLandroid/icu/text/RuleBasedCollator;->compare(Ljava/lang/String;Ljava/lang/String;)I
 HSPLandroid/icu/text/RuleBasedCollator;->doCompare(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)I
 HSPLandroid/icu/text/RuleBasedCollator;->getCollationBuffer()Landroid/icu/text/RuleBasedCollator$CollationBuffer;
-HSPLandroid/icu/text/RuleBasedCollator;->getCollationKey(Ljava/lang/String;)Landroid/icu/text/CollationKey;
-HSPLandroid/icu/text/RuleBasedCollator;->getCollationKey(Ljava/lang/String;Landroid/icu/text/RuleBasedCollator$CollationBuffer;)Landroid/icu/text/CollationKey;
 HSPLandroid/icu/text/RuleBasedCollator;->getOwnedSettings()Landroid/icu/impl/coll/CollationSettings;
-HSPLandroid/icu/text/RuleBasedCollator;->getRawCollationKey(Ljava/lang/CharSequence;Landroid/icu/text/RawCollationKey;Landroid/icu/text/RuleBasedCollator$CollationBuffer;)Landroid/icu/text/RawCollationKey;
 HSPLandroid/icu/text/RuleBasedCollator;->getStrength()I
 HSPLandroid/icu/text/RuleBasedCollator;->isFrozen()Z
 HSPLandroid/icu/text/RuleBasedCollator;->releaseCollationBuffer(Landroid/icu/text/RuleBasedCollator$CollationBuffer;)V
 HSPLandroid/icu/text/RuleBasedCollator;->setDecomposition(I)V
 HSPLandroid/icu/text/RuleBasedCollator;->setFastLatinOptions(Landroid/icu/impl/coll/CollationSettings;)V
 HSPLandroid/icu/text/RuleBasedCollator;->setStrength(I)V
-HSPLandroid/icu/text/RuleBasedCollator;->simpleKeyLengthEstimate(Ljava/lang/CharSequence;)I
-HSPLandroid/icu/text/RuleBasedCollator;->writeSortKey(Ljava/lang/CharSequence;Landroid/icu/text/RuleBasedCollator$CollationKeyByteSink;Landroid/icu/text/RuleBasedCollator$CollationBuffer;)V
 HSPLandroid/icu/text/SimpleDateFormat$PatternItem;-><init>(CI)V
 HSPLandroid/icu/text/SimpleDateFormat;-><clinit>()V
 HSPLandroid/icu/text/SimpleDateFormat;-><init>(Ljava/lang/String;Landroid/icu/text/DateFormatSymbols;Landroid/icu/util/Calendar;Landroid/icu/text/NumberFormat;Landroid/icu/util/ULocale;ZLjava/lang/String;)V
@@ -14139,8 +12633,6 @@
 HSPLandroid/icu/util/AnnualTimeZoneRule;->getRule()Landroid/icu/util/DateTimeRule;
 HSPLandroid/icu/util/AnnualTimeZoneRule;->getStartInYear(III)Ljava/util/Date;
 HSPLandroid/icu/util/BasicTimeZone;-><init>(Ljava/lang/String;)V
-HSPLandroid/icu/util/ByteArrayWrapper;-><init>()V
-HSPLandroid/icu/util/ByteArrayWrapper;->releaseBytes()[B
 HSPLandroid/icu/util/BytesTrie$Result;-><clinit>()V
 HSPLandroid/icu/util/BytesTrie$Result;-><init>(Ljava/lang/String;I)V
 HSPLandroid/icu/util/BytesTrie$Result;->hasNext()Z
@@ -14299,13 +12791,10 @@
 HSPLandroid/icu/util/Currency;->access$000(Ljava/lang/String;)Landroid/icu/util/Currency;
 HSPLandroid/icu/util/Currency;->createCurrency(Landroid/icu/util/ULocale;)Landroid/icu/util/Currency;
 HSPLandroid/icu/util/Currency;->getCurrencyCode()Ljava/lang/String;
-HSPLandroid/icu/util/Currency;->getDefaultFractionDigits()I
-HSPLandroid/icu/util/Currency;->getDefaultFractionDigits(Landroid/icu/util/Currency$CurrencyUsage;)I
 HSPLandroid/icu/util/Currency;->getInstance(Landroid/icu/util/ULocale;)Landroid/icu/util/Currency;
 HSPLandroid/icu/util/Currency;->getInstance(Ljava/lang/String;)Landroid/icu/util/Currency;
 HSPLandroid/icu/util/Currency;->getInstance(Ljava/util/Locale;)Landroid/icu/util/Currency;
 HSPLandroid/icu/util/Currency;->getName(Landroid/icu/util/ULocale;I[Z)Ljava/lang/String;
-HSPLandroid/icu/util/Currency;->getRoundingIncrement(Landroid/icu/util/Currency$CurrencyUsage;)D
 HSPLandroid/icu/util/Currency;->getSymbol(Landroid/icu/util/ULocale;)Ljava/lang/String;
 HSPLandroid/icu/util/Currency;->getSymbol(Ljava/util/Locale;)Ljava/lang/String;
 HSPLandroid/icu/util/Currency;->isAlpha3Code(Ljava/lang/String;)Z
@@ -14429,8 +12918,6 @@
 HSPLandroid/icu/util/ULocale;->isRightToLeft()Z
 HSPLandroid/icu/util/ULocale;->lookupLikelySubtags(Ljava/lang/String;)Ljava/lang/String;
 HSPLandroid/icu/util/ULocale;->parseTagString(Ljava/lang/String;[Ljava/lang/String;)I
-HSPLandroid/icu/util/ULocale;->setKeywordValue(Ljava/lang/String;Ljava/lang/String;)Landroid/icu/util/ULocale;
-HSPLandroid/icu/util/ULocale;->setKeywordValue(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
 HSPLandroid/icu/util/ULocale;->toLanguageTag()Ljava/lang/String;
 HSPLandroid/icu/util/ULocale;->toLocale()Ljava/util/Locale;
 HSPLandroid/icu/util/ULocale;->toString()Ljava/lang/String;
@@ -14455,74 +12942,20 @@
 HSPLandroid/icu/util/VersionInfo;->compareTo(Landroid/icu/util/VersionInfo;)I
 HSPLandroid/icu/util/VersionInfo;->getInstance(IIII)Landroid/icu/util/VersionInfo;
 HSPLandroid/icu/util/VersionInfo;->getInt(IIII)I
-HSPLandroid/location/-$$Lambda$-z-Hjl12STdAybauR3BT-ftvWd0;-><clinit>()V
-HSPLandroid/location/-$$Lambda$-z-Hjl12STdAybauR3BT-ftvWd0;-><init>()V
-HSPLandroid/location/-$$Lambda$-z-Hjl12STdAybauR3BT-ftvWd0;->accept(Ljava/lang/Object;)V
-HSPLandroid/location/-$$Lambda$AbstractListenerManager$Registration$TnkXgyOd99JHl00GzK6Oay_sYms;-><init>(Landroid/location/AbstractListenerManager$Registration;Ljava/util/function/Consumer;)V
-HSPLandroid/location/-$$Lambda$AbstractListenerManager$Registration$TnkXgyOd99JHl00GzK6Oay_sYms;->run()V
-HSPLandroid/location/-$$Lambda$GpsStatus$RTSonBp9m0T0NWA3SCfYgWf1mTo;-><init>(Landroid/location/GpsStatus;)V
-HSPLandroid/location/-$$Lambda$GpsStatus$RTSonBp9m0T0NWA3SCfYgWf1mTo;->iterator()Ljava/util/Iterator;
-HSPLandroid/location/-$$Lambda$LocationManager$GnssStatusListenerManager$GnssStatusListener$4EPi22o4xuVnpNhFHnDvebH4TG8;-><init>(Landroid/location/GnssStatus;)V
-HSPLandroid/location/-$$Lambda$LocationManager$GnssStatusListenerManager$GnssStatusListener$4EPi22o4xuVnpNhFHnDvebH4TG8;->accept(Ljava/lang/Object;)V
-HSPLandroid/location/-$$Lambda$LocationManager$GnssStatusListenerManager$GnssStatusListener$7Fi5XkeF81eL_OKPS2GJMvyc3-8;-><init>(I)V
-HSPLandroid/location/-$$Lambda$LocationManager$GnssStatusListenerManager$GnssStatusListener$7Fi5XkeF81eL_OKPS2GJMvyc3-8;->accept(Ljava/lang/Object;)V
-HSPLandroid/location/-$$Lambda$LocationManager$GnssStatusListenerManager$GnssStatusListener$gYcH61KCtV_OcJJszI1TfvnrJHY;-><init>(Ljava/lang/String;J)V
-HSPLandroid/location/-$$Lambda$LocationManager$GnssStatusListenerManager$GnssStatusListener$gYcH61KCtV_OcJJszI1TfvnrJHY;->accept(Ljava/lang/Object;)V
-HSPLandroid/location/-$$Lambda$LocationManager$LocationListenerTransport$JzcdERl3Ha8sYr9NxFhb3gNOoCM;-><init>(Landroid/location/LocationManager$LocationListenerTransport;Ljava/util/concurrent/Executor;Ljava/lang/String;)V
-HSPLandroid/location/-$$Lambda$LocationManager$LocationListenerTransport$JzcdERl3Ha8sYr9NxFhb3gNOoCM;->run()V
+HSPLandroid/location/-$$Lambda$LocationManager$LocationListenerTransport$C3xaM63A8GAwfJNN4R634OLsvDc;-><clinit>()V
+HSPLandroid/location/-$$Lambda$LocationManager$LocationListenerTransport$C3xaM63A8GAwfJNN4R634OLsvDc;-><init>()V
+HSPLandroid/location/-$$Lambda$LocationManager$LocationListenerTransport$C3xaM63A8GAwfJNN4R634OLsvDc;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
 HSPLandroid/location/-$$Lambda$LocationManager$LocationListenerTransport$OaIkiu4R0h4pgFbCDDlNkbmPaps;-><init>(Landroid/location/LocationManager$LocationListenerTransport;Ljava/util/concurrent/Executor;Landroid/location/Location;)V
 HSPLandroid/location/-$$Lambda$LocationManager$LocationListenerTransport$OaIkiu4R0h4pgFbCDDlNkbmPaps;->run()V
-HSPLandroid/location/-$$Lambda$LocationManager$LocationListenerTransport$vDJFuk-DvyNgQEXUO2Jkf2ZFeE8;-><init>(Landroid/location/LocationManager$LocationListenerTransport;Ljava/util/concurrent/Executor;Ljava/lang/String;)V
-HSPLandroid/location/-$$Lambda$LocationManager$LocationListenerTransport$vDJFuk-DvyNgQEXUO2Jkf2ZFeE8;->run()V
-HSPLandroid/location/-$$Lambda$UmbtQF279SH5h72Ftfcj_s96jsY;-><clinit>()V
-HSPLandroid/location/-$$Lambda$UmbtQF279SH5h72Ftfcj_s96jsY;-><init>()V
-HSPLandroid/location/-$$Lambda$UmbtQF279SH5h72Ftfcj_s96jsY;->accept(Ljava/lang/Object;)V
-HSPLandroid/location/-$$Lambda$_14QHG018Z6p13d3hzJuGTWnNeo;->execute(Ljava/lang/Runnable;)V
-HSPLandroid/location/AbstractListenerManager$Registration;-><init>(Ljava/util/concurrent/Executor;Ljava/lang/Object;)V
-HSPLandroid/location/AbstractListenerManager$Registration;-><init>(Ljava/util/concurrent/Executor;Ljava/lang/Object;Landroid/location/AbstractListenerManager$1;)V
-HSPLandroid/location/AbstractListenerManager$Registration;->access$100(Landroid/location/AbstractListenerManager$Registration;)V
-HSPLandroid/location/AbstractListenerManager$Registration;->access$200(Landroid/location/AbstractListenerManager$Registration;Ljava/util/function/Consumer;)V
-HSPLandroid/location/AbstractListenerManager$Registration;->execute(Ljava/util/function/Consumer;)V
-HSPLandroid/location/AbstractListenerManager$Registration;->lambda$execute$0$AbstractListenerManager$Registration(Ljava/util/function/Consumer;)V
-HSPLandroid/location/AbstractListenerManager$Registration;->unregister()V
+HSPLandroid/location/-$$Lambda$LocationManager$LocationListenerTransport$enkW18B0WwpQkSIMmVChmQ2YwC8;-><clinit>()V
+HSPLandroid/location/-$$Lambda$LocationManager$LocationListenerTransport$enkW18B0WwpQkSIMmVChmQ2YwC8;-><init>()V
+HSPLandroid/location/-$$Lambda$LocationManager$LocationListenerTransport$enkW18B0WwpQkSIMmVChmQ2YwC8;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
 HSPLandroid/location/AbstractListenerManager;-><init>()V
-HSPLandroid/location/AbstractListenerManager;->addInternal(Ljava/lang/Object;Landroid/location/AbstractListenerManager$Registration;)Z
-HSPLandroid/location/AbstractListenerManager;->addInternal(Ljava/lang/Object;Ljava/util/concurrent/Executor;)Z
-HSPLandroid/location/AbstractListenerManager;->execute(Ljava/util/function/Consumer;)V
-HSPLandroid/location/AbstractListenerManager;->removeListener(Ljava/lang/Object;)V
 HSPLandroid/location/Address$1;->createFromParcel(Landroid/os/Parcel;)Landroid/location/Address;
 HSPLandroid/location/Address$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/location/Address;-><init>(Ljava/util/Locale;)V
-HSPLandroid/location/Address;->access$000(Landroid/location/Address;)Ljava/util/HashMap;
-HSPLandroid/location/Address;->access$002(Landroid/location/Address;Ljava/util/HashMap;)Ljava/util/HashMap;
-HSPLandroid/location/Address;->access$100(Landroid/location/Address;)I
-HSPLandroid/location/Address;->access$1002(Landroid/location/Address;Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/location/Address;->access$102(Landroid/location/Address;I)I
-HSPLandroid/location/Address;->access$1102(Landroid/location/Address;Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/location/Address;->access$1202(Landroid/location/Address;Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/location/Address;->access$1300(Landroid/location/Address;)Z
-HSPLandroid/location/Address;->access$1302(Landroid/location/Address;Z)Z
-HSPLandroid/location/Address;->access$1402(Landroid/location/Address;D)D
-HSPLandroid/location/Address;->access$1500(Landroid/location/Address;)Z
-HSPLandroid/location/Address;->access$1502(Landroid/location/Address;Z)Z
-HSPLandroid/location/Address;->access$1602(Landroid/location/Address;D)D
-HSPLandroid/location/Address;->access$1702(Landroid/location/Address;Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/location/Address;->access$1802(Landroid/location/Address;Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/location/Address;->access$1902(Landroid/location/Address;Landroid/os/Bundle;)Landroid/os/Bundle;
-HSPLandroid/location/Address;->access$202(Landroid/location/Address;Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/location/Address;->access$302(Landroid/location/Address;Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/location/Address;->access$402(Landroid/location/Address;Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/location/Address;->access$502(Landroid/location/Address;Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/location/Address;->access$602(Landroid/location/Address;Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/location/Address;->access$702(Landroid/location/Address;Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/location/Address;->access$802(Landroid/location/Address;Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/location/Address;->access$902(Landroid/location/Address;Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/location/Country$1;->createFromParcel(Landroid/os/Parcel;)Landroid/location/Country;
-HSPLandroid/location/Country$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HPLandroid/location/Country;-><init>(Landroid/location/Country;)V
+HSPLandroid/location/Address;->writeToParcel(Landroid/os/Parcel;I)V
 HPLandroid/location/Country;-><init>(Ljava/lang/String;I)V
-HSPLandroid/location/Country;-><init>(Ljava/lang/String;IJ)V
-HSPLandroid/location/Country;-><init>(Ljava/lang/String;IJLandroid/location/Country$1;)V
 HPLandroid/location/Country;->equals(Ljava/lang/Object;)Z
 HSPLandroid/location/Country;->getCountryIso()Ljava/lang/String;
 HSPLandroid/location/Country;->getSource()I
@@ -14535,37 +12968,14 @@
 HSPLandroid/location/Geocoder;->isPresent()Z
 HSPLandroid/location/GeocoderParams$1;->createFromParcel(Landroid/os/Parcel;)Landroid/location/GeocoderParams;
 HSPLandroid/location/GeocoderParams$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/location/GeocoderParams;-><init>()V
 HSPLandroid/location/GeocoderParams;-><init>(Landroid/content/Context;Ljava/util/Locale;)V
-HSPLandroid/location/GeocoderParams;-><init>(Landroid/location/GeocoderParams$1;)V
-HSPLandroid/location/GeocoderParams;->access$102(Landroid/location/GeocoderParams;Ljava/util/Locale;)Ljava/util/Locale;
-HSPLandroid/location/GeocoderParams;->access$202(Landroid/location/GeocoderParams;Ljava/lang/String;)Ljava/lang/String;
 HSPLandroid/location/GeocoderParams;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/location/GnssClock;-><init>()V
 HSPLandroid/location/GnssClock;->initialize()V
-HSPLandroid/location/GnssClock;->resetBiasNanos()V
-HSPLandroid/location/GnssClock;->resetBiasUncertaintyNanos()V
-HSPLandroid/location/GnssClock;->resetDriftNanosPerSecond()V
-HSPLandroid/location/GnssClock;->resetDriftUncertaintyNanosPerSecond()V
-HSPLandroid/location/GnssClock;->resetElapsedRealtimeNanos()V
-HSPLandroid/location/GnssClock;->resetElapsedRealtimeUncertaintyNanos()V
-HSPLandroid/location/GnssClock;->resetFlag(I)V
-HSPLandroid/location/GnssClock;->resetFullBiasNanos()V
-HSPLandroid/location/GnssClock;->resetLeapSecond()V
-HSPLandroid/location/GnssClock;->resetTimeUncertaintyNanos()V
 HSPLandroid/location/GnssClock;->setHardwareClockDiscontinuityCount(I)V
 HSPLandroid/location/GnssClock;->setTimeNanos(J)V
 HSPLandroid/location/GnssMeasurement;-><init>()V
 HSPLandroid/location/GnssMeasurement;->initialize()V
-HSPLandroid/location/GnssMeasurement;->resetAutomaticGainControlLevel()V
-HSPLandroid/location/GnssMeasurement;->resetBasebandCn0DbHz()V
-HSPLandroid/location/GnssMeasurement;->resetCarrierCycles()V
-HSPLandroid/location/GnssMeasurement;->resetCarrierFrequencyHz()V
-HSPLandroid/location/GnssMeasurement;->resetCarrierPhase()V
-HSPLandroid/location/GnssMeasurement;->resetCarrierPhaseUncertainty()V
-HSPLandroid/location/GnssMeasurement;->resetCodeType()V
-HSPLandroid/location/GnssMeasurement;->resetFlag(I)V
-HSPLandroid/location/GnssMeasurement;->resetSnrInDb()V
 HSPLandroid/location/GnssMeasurement;->setAccumulatedDeltaRangeMeters(D)V
 HSPLandroid/location/GnssMeasurement;->setAccumulatedDeltaRangeState(I)V
 HSPLandroid/location/GnssMeasurement;->setAccumulatedDeltaRangeUncertaintyMeters(D)V
@@ -14578,44 +12988,15 @@
 HSPLandroid/location/GnssMeasurement;->setState(I)V
 HSPLandroid/location/GnssMeasurement;->setSvid(I)V
 HSPLandroid/location/GnssMeasurement;->setTimeOffsetNanos(D)V
-HSPLandroid/location/GnssMeasurementsEvent;-><clinit>()V
 HSPLandroid/location/GnssMeasurementsEvent;-><init>(Landroid/location/GnssClock;[Landroid/location/GnssMeasurement;)V
-HSPLandroid/location/GnssNavigationMessage$1;-><init>()V
-HSPLandroid/location/GnssNavigationMessage;-><clinit>()V
-HSPLandroid/location/GnssReflectingPlane$1;-><init>()V
-HSPLandroid/location/GnssReflectingPlane;-><clinit>()V
-HSPLandroid/location/GnssSingleSatCorrection$1;-><init>()V
-HSPLandroid/location/GnssSingleSatCorrection;-><clinit>()V
-HSPLandroid/location/GnssStatus$Callback;-><init>()V
 HSPLandroid/location/GnssStatus;-><init>(I[I[F[F[F[F[F)V
-HSPLandroid/location/GnssStatus;->getAzimuthDegrees(I)F
 HPLandroid/location/GnssStatus;->getCarrierFrequencyHz(I)F
 HSPLandroid/location/GnssStatus;->getCn0DbHz(I)F
 HSPLandroid/location/GnssStatus;->getConstellationType(I)I
-HSPLandroid/location/GnssStatus;->getElevationDegrees(I)F
 HSPLandroid/location/GnssStatus;->getSatelliteCount()I
-HSPLandroid/location/GnssStatus;->getSvid(I)I
-HSPLandroid/location/GnssStatus;->hasAlmanacData(I)Z
 HPLandroid/location/GnssStatus;->hasCarrierFrequencyHz(I)Z
-HSPLandroid/location/GnssStatus;->hasEphemerisData(I)Z
 HSPLandroid/location/GnssStatus;->usedInFix(I)Z
 HSPLandroid/location/GnssStatus;->wrap(I[I[F[F[F[F[F)Landroid/location/GnssStatus;
-HSPLandroid/location/GpsSatellite;-><init>(I)V
-HPLandroid/location/GpsSatellite;->getPrn()I
-HPLandroid/location/GpsSatellite;->getSnr()F
-HSPLandroid/location/GpsSatellite;->usedInFix()Z
-HSPLandroid/location/GpsStatus$SatelliteIterator;-><init>(Landroid/location/GpsStatus;)V
-HSPLandroid/location/GpsStatus$SatelliteIterator;->hasNext()Z
-HSPLandroid/location/GpsStatus$SatelliteIterator;->next()Landroid/location/GpsSatellite;
-HSPLandroid/location/GpsStatus$SatelliteIterator;->next()Ljava/lang/Object;
-HSPLandroid/location/GpsStatus;-><init>()V
-HSPLandroid/location/GpsStatus;->access$000(Landroid/location/GpsStatus;)Landroid/util/SparseArray;
-HSPLandroid/location/GpsStatus;->create(Landroid/location/GnssStatus;I)Landroid/location/GpsStatus;
-HSPLandroid/location/GpsStatus;->getSatellites()Ljava/lang/Iterable;
-HSPLandroid/location/GpsStatus;->lambda$new$0$GpsStatus()Ljava/util/Iterator;
-HSPLandroid/location/GpsStatus;->setStatus(Landroid/location/GnssStatus;I)V
-HSPLandroid/location/ICountryDetector$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/location/ICountryDetector$Stub$Proxy;->detectCountry()Landroid/location/Country;
 HSPLandroid/location/ICountryDetector$Stub;-><init>()V
 HSPLandroid/location/ICountryDetector$Stub;->asInterface(Landroid/os/IBinder;)Landroid/location/ICountryDetector;
 HPLandroid/location/ICountryDetector$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
@@ -14624,18 +13005,13 @@
 HSPLandroid/location/ICountryListener$Stub;-><init>()V
 HSPLandroid/location/ICountryListener$Stub;->asBinder()Landroid/os/IBinder;
 HPLandroid/location/ICountryListener$Stub;->asInterface(Landroid/os/IBinder;)Landroid/location/ICountryListener;
-HSPLandroid/location/IGeocodeProvider$Stub;-><init>()V
-HSPLandroid/location/IGeofenceProvider$Stub;-><init>()V
 HPLandroid/location/IGnssStatusListener$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HPLandroid/location/IGnssStatusListener$Stub$Proxy;->asBinder()Landroid/os/IBinder;
 HPLandroid/location/IGnssStatusListener$Stub$Proxy;->onGnssStarted()V
 HPLandroid/location/IGnssStatusListener$Stub$Proxy;->onGnssStopped()V
 HPLandroid/location/IGnssStatusListener$Stub$Proxy;->onNmeaReceived(JLjava/lang/String;)V
 HPLandroid/location/IGnssStatusListener$Stub$Proxy;->onSvStatusChanged(I[I[F[F[F[F[F)V
-HSPLandroid/location/IGnssStatusListener$Stub;-><init>()V
-HSPLandroid/location/IGnssStatusListener$Stub;->asBinder()Landroid/os/IBinder;
 HPLandroid/location/IGnssStatusListener$Stub;->asInterface(Landroid/os/IBinder;)Landroid/location/IGnssStatusListener;
-HSPLandroid/location/IGnssStatusListener$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/location/IGpsGeofenceHardware$Stub;-><init>()V
 HPLandroid/location/ILocationListener$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HPLandroid/location/ILocationListener$Stub$Proxy;->asBinder()Landroid/os/IBinder;
@@ -14645,19 +13021,12 @@
 HPLandroid/location/ILocationListener$Stub;->asInterface(Landroid/os/IBinder;)Landroid/location/ILocationListener;
 HSPLandroid/location/ILocationListener$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/location/ILocationManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/location/ILocationManager$Stub$Proxy;->getAllProviders()Ljava/util/List;
-HSPLandroid/location/ILocationManager$Stub$Proxy;->getExtraLocationControllerPackage()Ljava/lang/String;
 HSPLandroid/location/ILocationManager$Stub$Proxy;->getLastLocation(Landroid/location/LocationRequest;Ljava/lang/String;Ljava/lang/String;)Landroid/location/Location;
-HSPLandroid/location/ILocationManager$Stub$Proxy;->getProviderProperties(Ljava/lang/String;)Lcom/android/internal/location/ProviderProperties;
-HSPLandroid/location/ILocationManager$Stub$Proxy;->getProviders(Landroid/location/Criteria;Z)Ljava/util/List;
 HSPLandroid/location/ILocationManager$Stub$Proxy;->isLocationEnabledForUser(I)Z
 HSPLandroid/location/ILocationManager$Stub$Proxy;->isProviderEnabledForUser(Ljava/lang/String;I)Z
 HSPLandroid/location/ILocationManager$Stub$Proxy;->locationCallbackFinished(Landroid/location/ILocationListener;)V
-HSPLandroid/location/ILocationManager$Stub$Proxy;->registerGnssStatusCallback(Landroid/location/IGnssStatusListener;Ljava/lang/String;Ljava/lang/String;)Z
 HSPLandroid/location/ILocationManager$Stub$Proxy;->removeUpdates(Landroid/location/ILocationListener;Landroid/app/PendingIntent;Ljava/lang/String;)V
 HSPLandroid/location/ILocationManager$Stub$Proxy;->requestLocationUpdates(Landroid/location/LocationRequest;Landroid/location/ILocationListener;Landroid/app/PendingIntent;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/location/ILocationManager$Stub$Proxy;->setExtraLocationControllerPackage(Ljava/lang/String;)V
-HSPLandroid/location/ILocationManager$Stub$Proxy;->setExtraLocationControllerPackageEnabled(Z)V
 HSPLandroid/location/ILocationManager$Stub;-><init>()V
 HSPLandroid/location/ILocationManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/location/ILocationManager;
 HPLandroid/location/ILocationManager$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
@@ -14694,21 +13063,16 @@
 HSPLandroid/location/Location;->access$802(Landroid/location/Location;J)J
 HSPLandroid/location/Location;->access$902(Landroid/location/Location;J)J
 HSPLandroid/location/Location;->computeDistanceAndBearing(DDDDLandroid/location/Location$BearingDistanceCache;)V
-HSPLandroid/location/Location;->distanceBetween(DDDD[F)V
 HSPLandroid/location/Location;->distanceTo(Landroid/location/Location;)F
 HSPLandroid/location/Location;->getAccuracy()F
 HSPLandroid/location/Location;->getAltitude()D
-HSPLandroid/location/Location;->getBearing()F
-HSPLandroid/location/Location;->getBearingAccuracyDegrees()F
 HSPLandroid/location/Location;->getElapsedRealtimeNanos()J
 HSPLandroid/location/Location;->getExtras()Landroid/os/Bundle;
 HSPLandroid/location/Location;->getLatitude()D
 HSPLandroid/location/Location;->getLongitude()D
 HSPLandroid/location/Location;->getProvider()Ljava/lang/String;
 HSPLandroid/location/Location;->getSpeed()F
-HSPLandroid/location/Location;->getSpeedAccuracyMetersPerSecond()F
 HSPLandroid/location/Location;->getTime()J
-HSPLandroid/location/Location;->getVerticalAccuracyMeters()F
 HSPLandroid/location/Location;->hasAccuracy()Z
 HSPLandroid/location/Location;->hasAltitude()Z
 HSPLandroid/location/Location;->hasBearing()Z
@@ -14719,9 +13083,7 @@
 HSPLandroid/location/Location;->hasVerticalAccuracy()Z
 HSPLandroid/location/Location;->isComplete()Z
 HSPLandroid/location/Location;->isFromMockProvider()Z
-PLandroid/location/Location;->removeAltitude()V
 HSPLandroid/location/Location;->removeBearing()V
-HSPLandroid/location/Location;->removeSpeed()V
 HSPLandroid/location/Location;->set(Landroid/location/Location;)V
 HSPLandroid/location/Location;->setAccuracy(F)V
 HSPLandroid/location/Location;->setAltitude(D)V
@@ -14731,7 +13093,6 @@
 HSPLandroid/location/Location;->setExtras(Landroid/os/Bundle;)V
 HSPLandroid/location/Location;->setLatitude(D)V
 HSPLandroid/location/Location;->setLongitude(D)V
-HSPLandroid/location/Location;->setProvider(Ljava/lang/String;)V
 HSPLandroid/location/Location;->setSpeed(F)V
 HSPLandroid/location/Location;->setSpeedAccuracyMetersPerSecond(F)V
 HSPLandroid/location/Location;->setTime(J)V
@@ -14739,6 +13100,8 @@
 HSPLandroid/location/Location;->toString()Ljava/lang/String;
 HSPLandroid/location/Location;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/location/LocationManager$1;-><init>(Landroid/location/LocationManager;ILjava/lang/String;)V
+HSPLandroid/location/LocationManager$1;->recompute(Ljava/lang/Integer;)Ljava/lang/Boolean;
+HSPLandroid/location/LocationManager$1;->recompute(Ljava/lang/Object;)Ljava/lang/Object;
 HSPLandroid/location/LocationManager$BatchedLocationCallbackManager;-><init>(Landroid/location/LocationManager;)V
 HSPLandroid/location/LocationManager$BatchedLocationCallbackManager;-><init>(Landroid/location/LocationManager;Landroid/location/LocationManager$1;)V
 HSPLandroid/location/LocationManager$GnssAntennaInfoListenerManager;-><init>(Landroid/location/LocationManager;)V
@@ -14747,33 +13110,15 @@
 HSPLandroid/location/LocationManager$GnssMeasurementsListenerManager;-><init>(Landroid/location/LocationManager;Landroid/location/LocationManager$1;)V
 HSPLandroid/location/LocationManager$GnssNavigationMessageListenerManager;-><init>(Landroid/location/LocationManager;)V
 HSPLandroid/location/LocationManager$GnssNavigationMessageListenerManager;-><init>(Landroid/location/LocationManager;Landroid/location/LocationManager$1;)V
-HSPLandroid/location/LocationManager$GnssStatusListenerManager$1;-><init>(Landroid/location/LocationManager$GnssStatusListenerManager;Ljava/lang/Object;)V
-HSPLandroid/location/LocationManager$GnssStatusListenerManager$1;->onSatelliteStatusChanged(Landroid/location/GnssStatus;)V
-HSPLandroid/location/LocationManager$GnssStatusListenerManager$1;->onStarted()V
-HSPLandroid/location/LocationManager$GnssStatusListenerManager$1;->onStopped()V
-HSPLandroid/location/LocationManager$GnssStatusListenerManager$GnssStatusListener;-><init>(Landroid/location/LocationManager$GnssStatusListenerManager;)V
-HSPLandroid/location/LocationManager$GnssStatusListenerManager$GnssStatusListener;-><init>(Landroid/location/LocationManager$GnssStatusListenerManager;Landroid/location/LocationManager$1;)V
-HSPLandroid/location/LocationManager$GnssStatusListenerManager$GnssStatusListener;->lambda$onFirstFix$0(ILandroid/location/GnssStatus$Callback;)V
-HSPLandroid/location/LocationManager$GnssStatusListenerManager$GnssStatusListener;->lambda$onNmeaReceived$2(Ljava/lang/String;JLandroid/location/GnssStatus$Callback;)V
-HSPLandroid/location/LocationManager$GnssStatusListenerManager$GnssStatusListener;->lambda$onSvStatusChanged$1(Landroid/location/GnssStatus;Landroid/location/GnssStatus$Callback;)V
-HSPLandroid/location/LocationManager$GnssStatusListenerManager$GnssStatusListener;->onFirstFix(I)V
-HSPLandroid/location/LocationManager$GnssStatusListenerManager$GnssStatusListener;->onGnssStarted()V
-HSPLandroid/location/LocationManager$GnssStatusListenerManager$GnssStatusListener;->onGnssStopped()V
-HSPLandroid/location/LocationManager$GnssStatusListenerManager$GnssStatusListener;->onNmeaReceived(JLjava/lang/String;)V
-HSPLandroid/location/LocationManager$GnssStatusListenerManager$GnssStatusListener;->onSvStatusChanged(I[I[F[F[F[F[F)V
 HSPLandroid/location/LocationManager$GnssStatusListenerManager;-><init>(Landroid/location/LocationManager;)V
 HSPLandroid/location/LocationManager$GnssStatusListenerManager;-><init>(Landroid/location/LocationManager;Landroid/location/LocationManager$1;)V
-HSPLandroid/location/LocationManager$GnssStatusListenerManager;->addListener(Landroid/location/GpsStatus$Listener;Ljava/util/concurrent/Executor;)Z
-HSPLandroid/location/LocationManager$GnssStatusListenerManager;->convertKey(Ljava/lang/Object;)Landroid/location/GnssStatus$Callback;
-HSPLandroid/location/LocationManager$GnssStatusListenerManager;->convertKey(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/location/LocationManager$GnssStatusListenerManager;->getGnssStatus()Landroid/location/GnssStatus;
-HSPLandroid/location/LocationManager$GnssStatusListenerManager;->getTtff()I
-HSPLandroid/location/LocationManager$GnssStatusListenerManager;->registerService()Z
 HSPLandroid/location/LocationManager$LocationListenerTransport;-><init>(Landroid/location/LocationManager;Landroid/location/LocationListener;)V
 HSPLandroid/location/LocationManager$LocationListenerTransport;-><init>(Landroid/location/LocationManager;Landroid/location/LocationListener;Landroid/location/LocationManager$1;)V
+HSPLandroid/location/LocationManager$LocationListenerTransport;->acceptLocation(Ljava/util/concurrent/Executor;Landroid/location/Location;)V
+HSPLandroid/location/LocationManager$LocationListenerTransport;->acceptProviderChange(Ljava/util/concurrent/Executor;Ljava/lang/String;Z)V
+HSPLandroid/location/LocationManager$LocationListenerTransport;->lambda$C3xaM63A8GAwfJNN4R634OLsvDc(Landroid/location/LocationManager$LocationListenerTransport;Ljava/util/concurrent/Executor;Ljava/lang/String;Z)V
+HSPLandroid/location/LocationManager$LocationListenerTransport;->lambda$enkW18B0WwpQkSIMmVChmQ2YwC8(Landroid/location/LocationManager$LocationListenerTransport;Ljava/util/concurrent/Executor;Landroid/location/Location;)V
 HSPLandroid/location/LocationManager$LocationListenerTransport;->lambda$onLocationChanged$0$LocationManager$LocationListenerTransport(Ljava/util/concurrent/Executor;Landroid/location/Location;)V
-HSPLandroid/location/LocationManager$LocationListenerTransport;->lambda$onProviderDisabled$2$LocationManager$LocationListenerTransport(Ljava/util/concurrent/Executor;Ljava/lang/String;)V
-HSPLandroid/location/LocationManager$LocationListenerTransport;->lambda$onProviderEnabled$1$LocationManager$LocationListenerTransport(Ljava/util/concurrent/Executor;Ljava/lang/String;)V
 HSPLandroid/location/LocationManager$LocationListenerTransport;->locationCallbackFinished()V
 HSPLandroid/location/LocationManager$LocationListenerTransport;->onLocationChanged(Landroid/location/Location;)V
 HSPLandroid/location/LocationManager$LocationListenerTransport;->onProviderDisabled(Ljava/lang/String;)V
@@ -14782,30 +13127,22 @@
 HSPLandroid/location/LocationManager$LocationListenerTransport;->register(Ljava/util/concurrent/Executor;)V
 HSPLandroid/location/LocationManager$LocationListenerTransport;->unregister()V
 HSPLandroid/location/LocationManager;-><init>(Landroid/content/Context;Landroid/location/ILocationManager;)V
-HSPLandroid/location/LocationManager;->access$1000(Landroid/location/LocationManager;)Landroid/content/Context;
+HSPLandroid/location/LocationManager;->access$000(Landroid/location/LocationManager;)Landroid/location/ILocationManager;
 HSPLandroid/location/LocationManager;->access$600(Landroid/location/LocationManager;)Landroid/location/ILocationManager;
-HSPLandroid/location/LocationManager;->access$700(Landroid/location/LocationManager;)Landroid/location/ILocationManager;
-HSPLandroid/location/LocationManager;->addGpsStatusListener(Landroid/location/GpsStatus$Listener;)Z
 HSPLandroid/location/LocationManager;->getAllProviders()Ljava/util/List;
-HSPLandroid/location/LocationManager;->getExtraLocationControllerPackage()Ljava/lang/String;
-HSPLandroid/location/LocationManager;->getGpsStatus(Landroid/location/GpsStatus;)Landroid/location/GpsStatus;
 HSPLandroid/location/LocationManager;->getLastKnownLocation(Ljava/lang/String;)Landroid/location/Location;
 HSPLandroid/location/LocationManager;->getListenerIdentifier(Ljava/lang/Object;)Ljava/lang/String;
 HSPLandroid/location/LocationManager;->getProvider(Ljava/lang/String;)Landroid/location/LocationProvider;
 HSPLandroid/location/LocationManager;->getProviders(Z)Ljava/util/List;
-HSPLandroid/location/LocationManager;->isLocationEnabled()Z
 HSPLandroid/location/LocationManager;->isLocationEnabledForUser(Landroid/os/UserHandle;)Z
 HSPLandroid/location/LocationManager;->isProviderEnabled(Ljava/lang/String;)Z
 HSPLandroid/location/LocationManager;->isProviderEnabledForUser(Ljava/lang/String;Landroid/os/UserHandle;)Z
-HSPLandroid/location/LocationManager;->removeGpsStatusListener(Landroid/location/GpsStatus$Listener;)V
 HSPLandroid/location/LocationManager;->removeUpdates(Landroid/location/LocationListener;)V
 HSPLandroid/location/LocationManager;->requestLocationUpdates(Landroid/location/LocationRequest;Landroid/location/LocationListener;Landroid/os/Looper;)V
 HSPLandroid/location/LocationManager;->requestLocationUpdates(Landroid/location/LocationRequest;Ljava/util/concurrent/Executor;Landroid/location/LocationListener;)V
 HSPLandroid/location/LocationManager;->requestLocationUpdates(Ljava/lang/String;JFLandroid/location/LocationListener;)V
 HSPLandroid/location/LocationManager;->requestLocationUpdates(Ljava/lang/String;JFLandroid/location/LocationListener;Landroid/os/Looper;)V
-HSPLandroid/location/LocationManager;->setExtraLocationControllerPackage(Ljava/lang/String;)V
-HSPLandroid/location/LocationManager;->setExtraLocationControllerPackageEnabled(Z)V
-HSPLandroid/location/LocationManager;->unregisterGnssStatusCallback(Landroid/location/GnssStatus$Callback;)V
+HSPLandroid/location/LocationManagerInternal;-><init>()V
 HSPLandroid/location/LocationProvider;-><init>(Ljava/lang/String;Lcom/android/internal/location/ProviderProperties;)V
 HSPLandroid/location/LocationRequest$1;->createFromParcel(Landroid/os/Parcel;)Landroid/location/LocationRequest;
 HSPLandroid/location/LocationRequest$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
@@ -14816,7 +13153,6 @@
 HSPLandroid/location/LocationRequest;->checkQuality(I)V
 HSPLandroid/location/LocationRequest;->create()Landroid/location/LocationRequest;
 HSPLandroid/location/LocationRequest;->createFromDeprecatedProvider(Ljava/lang/String;JFZ)Landroid/location/LocationRequest;
-PLandroid/location/LocationRequest;->decrementNumUpdates()V
 HSPLandroid/location/LocationRequest;->getExpirationRealtimeMs(J)J
 HSPLandroid/location/LocationRequest;->getExpireIn()J
 HSPLandroid/location/LocationRequest;->getFastestInterval()J
@@ -14886,12 +13222,12 @@
 HSPLandroid/media/AudioAttributes;->getSystemUsage()I
 HSPLandroid/media/AudioAttributes;->getTags()Ljava/util/Set;
 HSPLandroid/media/AudioAttributes;->getUsage()I
-HSPLandroid/media/AudioAttributes;->getVolumeControlStream()I
 HSPLandroid/media/AudioAttributes;->hashCode()I
 HSPLandroid/media/AudioAttributes;->isSystemUsage(I)Z
 HSPLandroid/media/AudioAttributes;->toLegacyStreamType(Landroid/media/AudioAttributes;)I
 HSPLandroid/media/AudioAttributes;->toString()Ljava/lang/String;
 HSPLandroid/media/AudioAttributes;->toVolumeStreamType(ZLandroid/media/AudioAttributes;)I
+HSPLandroid/media/AudioAttributes;->usageToString()Ljava/lang/String;
 HSPLandroid/media/AudioAttributes;->usageToString(I)Ljava/lang/String;
 HSPLandroid/media/AudioAttributes;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/media/AudioDeviceCallback;-><init>()V
@@ -14911,7 +13247,6 @@
 HSPLandroid/media/AudioFocusRequest$Builder;->setAudioAttributes(Landroid/media/AudioAttributes;)Landroid/media/AudioFocusRequest$Builder;
 HSPLandroid/media/AudioFocusRequest$Builder;->setFocusGain(I)Landroid/media/AudioFocusRequest$Builder;
 HSPLandroid/media/AudioFocusRequest$Builder;->setLocksFocus(Z)Landroid/media/AudioFocusRequest$Builder;
-HSPLandroid/media/AudioFocusRequest$Builder;->setOnAudioFocusChangeListener(Landroid/media/AudioManager$OnAudioFocusChangeListener;)Landroid/media/AudioFocusRequest$Builder;
 HSPLandroid/media/AudioFocusRequest$Builder;->setOnAudioFocusChangeListenerInt(Landroid/media/AudioManager$OnAudioFocusChangeListener;Landroid/os/Handler;)Landroid/media/AudioFocusRequest$Builder;
 HSPLandroid/media/AudioFocusRequest$Builder;->setWillPauseWhenDucked(Z)Landroid/media/AudioFocusRequest$Builder;
 HSPLandroid/media/AudioFocusRequest;-><init>(Landroid/media/AudioManager$OnAudioFocusChangeListener;Landroid/os/Handler;Landroid/media/AudioAttributes;II)V
@@ -14939,10 +13274,8 @@
 HSPLandroid/media/AudioFormat;->getEncoding()I
 HSPLandroid/media/AudioFormat;->getPropertySetMask()I
 HSPLandroid/media/AudioFormat;->getSampleRate()I
-HSPLandroid/media/AudioFormat;->isEncodingLinearFrames(I)Z
 HSPLandroid/media/AudioFormat;->isEncodingLinearPcm(I)Z
 HSPLandroid/media/AudioFormat;->isPublicEncoding(I)Z
-HSPLandroid/media/AudioFormat;->isValidEncoding(I)Z
 HSPLandroid/media/AudioHandle;-><init>(I)V
 HSPLandroid/media/AudioHandle;->equals(Ljava/lang/Object;)Z
 HSPLandroid/media/AudioHandle;->id()I
@@ -14971,9 +13304,10 @@
 HSPLandroid/media/AudioManager;-><init>(Landroid/content/Context;)V
 HSPLandroid/media/AudioManager;->abandonAudioFocus(Landroid/media/AudioManager$OnAudioFocusChangeListener;)I
 HSPLandroid/media/AudioManager;->abandonAudioFocus(Landroid/media/AudioManager$OnAudioFocusChangeListener;Landroid/media/AudioAttributes;)I
-HSPLandroid/media/AudioManager;->abandonAudioFocusRequest(Landroid/media/AudioFocusRequest;)I
 HSPLandroid/media/AudioManager;->access$1000(Landroid/media/AudioManager;)Landroid/util/ArrayMap;
 HSPLandroid/media/AudioManager;->access$1100(Landroid/media/AudioManager;Landroid/os/Handler;)V
+HSPLandroid/media/AudioManager;->access$1300(Landroid/media/AudioManager;)Landroid/util/ArrayMap;
+HSPLandroid/media/AudioManager;->access$1400(Landroid/media/AudioManager;Landroid/os/Handler;)V
 HSPLandroid/media/AudioManager;->access$500(Landroid/media/AudioManager;)Ljava/lang/Object;
 HSPLandroid/media/AudioManager;->access$600(Landroid/media/AudioManager;)Ljava/util/List;
 HSPLandroid/media/AudioManager;->broadcastDeviceListChange_sync(Landroid/os/Handler;)V
@@ -14989,7 +13323,6 @@
 HSPLandroid/media/AudioManager;->getIdForAudioFocusListener(Landroid/media/AudioManager$OnAudioFocusChangeListener;)Ljava/lang/String;
 HSPLandroid/media/AudioManager;->getLastAudibleStreamVolume(I)I
 HSPLandroid/media/AudioManager;->getMode()I
-HSPLandroid/media/AudioManager;->getProperty(Ljava/lang/String;)Ljava/lang/String;
 HSPLandroid/media/AudioManager;->getRingerMode()I
 HSPLandroid/media/AudioManager;->getRingerModeInternal()I
 HSPLandroid/media/AudioManager;->getRingtonePlayer()Landroid/media/IRingtonePlayer;
@@ -15000,11 +13333,8 @@
 HSPLandroid/media/AudioManager;->hasPlaybackCallback_sync(Landroid/media/AudioManager$AudioPlaybackCallback;)Z
 HSPLandroid/media/AudioManager;->infoListFromPortList(Ljava/util/ArrayList;I)[Landroid/media/AudioDeviceInfo;
 HSPLandroid/media/AudioManager;->isAudioFocusExclusive()Z
-HSPLandroid/media/AudioManager;->isBluetoothA2dpOn()Z
-HSPLandroid/media/AudioManager;->isBluetoothScoOn()Z
 HSPLandroid/media/AudioManager;->isHapticPlaybackSupported()Z
 HSPLandroid/media/AudioManager;->isInputDevice(I)Z
-HSPLandroid/media/AudioManager;->isMusicActive()Z
 HSPLandroid/media/AudioManager;->isSpeakerphoneOn()Z
 HSPLandroid/media/AudioManager;->isStreamAffectedByMute(I)Z
 HSPLandroid/media/AudioManager;->isStreamMute(I)Z
@@ -15019,9 +13349,7 @@
 HSPLandroid/media/AudioManager;->registerAudioFocusRequest(Landroid/media/AudioFocusRequest;)V
 HSPLandroid/media/AudioManager;->registerAudioPlaybackCallback(Landroid/media/AudioManager$AudioPlaybackCallback;Landroid/os/Handler;)V
 HSPLandroid/media/AudioManager;->registerAudioPortUpdateListener(Landroid/media/AudioManager$OnAudioPortUpdateListener;)V
-HSPLandroid/media/AudioManager;->requestAudioFocus(Landroid/media/AudioFocusRequest;)I
 HSPLandroid/media/AudioManager;->requestAudioFocus(Landroid/media/AudioFocusRequest;Landroid/media/audiopolicy/AudioPolicy;)I
-HSPLandroid/media/AudioManager;->requestAudioFocus(Landroid/media/AudioManager$OnAudioFocusChangeListener;II)I
 HSPLandroid/media/AudioManager;->requestAudioFocus(Landroid/media/AudioManager$OnAudioFocusChangeListener;Landroid/media/AudioAttributes;II)I
 HSPLandroid/media/AudioManager;->requestAudioFocus(Landroid/media/AudioManager$OnAudioFocusChangeListener;Landroid/media/AudioAttributes;IILandroid/media/audiopolicy/AudioPolicy;)I
 HSPLandroid/media/AudioManager;->resetAudioPortGeneration()I
@@ -15046,6 +13374,7 @@
 HSPLandroid/media/AudioPlaybackConfiguration$IPlayerShell;->monitorDeath()V
 HPLandroid/media/AudioPlaybackConfiguration$IPlayerShell;->release()V
 HSPLandroid/media/AudioPlaybackConfiguration;-><init>(Landroid/media/PlayerBase$PlayerIdCard;III)V
+HPLandroid/media/AudioPlaybackConfiguration;->anonymizedCopy(Landroid/media/AudioPlaybackConfiguration;)Landroid/media/AudioPlaybackConfiguration;
 HSPLandroid/media/AudioPlaybackConfiguration;->getAudioAttributes()Landroid/media/AudioAttributes;
 HSPLandroid/media/AudioPlaybackConfiguration;->getClientPid()I
 HSPLandroid/media/AudioPlaybackConfiguration;->getClientUid()I
@@ -15087,7 +13416,6 @@
 HSPLandroid/media/AudioRecord;->release()V
 HSPLandroid/media/AudioRecord;->startRecording()V
 HSPLandroid/media/AudioRecord;->stop()V
-HSPLandroid/media/AudioRecordingConfiguration;->getClientAudioSource()I
 HSPLandroid/media/AudioRecordingMonitorImpl$1;-><init>(Landroid/media/AudioRecordingMonitorImpl;)V
 HSPLandroid/media/AudioRecordingMonitorImpl;-><init>(Landroid/media/AudioRecordingMonitorClient;)V
 HSPLandroid/media/AudioRoutesInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/media/AudioRoutesInfo;
@@ -15108,32 +13436,8 @@
 HSPLandroid/media/AudioSystem;->setStreamVolumeIndexAS(III)I
 HSPLandroid/media/AudioSystem;->streamToString(I)Ljava/lang/String;
 HSPLandroid/media/AudioTimestamp;-><init>()V
-HSPLandroid/media/AudioTrack;-><init>(Landroid/media/AudioAttributes;Landroid/media/AudioFormat;III)V
-HSPLandroid/media/AudioTrack;-><init>(Landroid/media/AudioAttributes;Landroid/media/AudioFormat;IIIZILandroid/media/AudioTrack$TunerConfiguration;)V
-HSPLandroid/media/AudioTrack;->audioBuffSizeCheck(I)V
-HSPLandroid/media/AudioTrack;->audioParamCheck(IIIII)V
-HSPLandroid/media/AudioTrack;->blockUntilOffloadDrain(I)Z
-HSPLandroid/media/AudioTrack;->clampGainOrLevel(F)F
-HSPLandroid/media/AudioTrack;->endStreamEventHandling()V
-HSPLandroid/media/AudioTrack;->finalize()V
-HSPLandroid/media/AudioTrack;->flush()V
-HSPLandroid/media/AudioTrack;->getMinBufferSize(III)I
-HSPLandroid/media/AudioTrack;->getNativeOutputSampleRate(I)I
-HSPLandroid/media/AudioTrack;->getPlayState()I
-HSPLandroid/media/AudioTrack;->getSampleRate()I
-HSPLandroid/media/AudioTrack;->getState()I
-HSPLandroid/media/AudioTrack;->pause()V
-HSPLandroid/media/AudioTrack;->play()V
-HSPLandroid/media/AudioTrack;->playerSetVolume(ZFF)V
-HSPLandroid/media/AudioTrack;->release()V
-HSPLandroid/media/AudioTrack;->setStereoVolume(FF)I
-HSPLandroid/media/AudioTrack;->setVolume(F)I
-HSPLandroid/media/AudioTrack;->shouldEnablePowerSaving(Landroid/media/AudioAttributes;Landroid/media/AudioFormat;II)Z
-HSPLandroid/media/AudioTrack;->startImpl()V
-HSPLandroid/media/AudioTrack;->stop()V
 HSPLandroid/media/ExifInterface$ByteOrderedDataInputStream;-><init>(Ljava/io/InputStream;)V
 HSPLandroid/media/ExifInterface$ByteOrderedDataInputStream;-><init>([B)V
-HSPLandroid/media/ExifInterface$ByteOrderedDataInputStream;->peek()I
 HSPLandroid/media/ExifInterface$ByteOrderedDataInputStream;->read()I
 HSPLandroid/media/ExifInterface$ByteOrderedDataInputStream;->readByte()B
 HSPLandroid/media/ExifInterface$ByteOrderedDataInputStream;->readFully([B)V
@@ -15189,16 +13493,13 @@
 HSPLandroid/media/IAudioService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HSPLandroid/media/IAudioService$Stub$Proxy;->abandonAudioFocus(Landroid/media/IAudioFocusDispatcher;Ljava/lang/String;Landroid/media/AudioAttributes;Ljava/lang/String;)I
 HSPLandroid/media/IAudioService$Stub$Proxy;->getLastAudibleStreamVolume(I)I
-HSPLandroid/media/IAudioService$Stub$Proxy;->getMode()I
 HSPLandroid/media/IAudioService$Stub$Proxy;->getRingerModeExternal()I
 HSPLandroid/media/IAudioService$Stub$Proxy;->getRingerModeInternal()I
 HSPLandroid/media/IAudioService$Stub$Proxy;->getStreamMaxVolume(I)I
 HSPLandroid/media/IAudioService$Stub$Proxy;->getStreamMinVolume(I)I
 HSPLandroid/media/IAudioService$Stub$Proxy;->getStreamVolume(I)I
 HSPLandroid/media/IAudioService$Stub$Proxy;->isBluetoothA2dpOn()Z
-HSPLandroid/media/IAudioService$Stub$Proxy;->isBluetoothScoOn()Z
 HSPLandroid/media/IAudioService$Stub$Proxy;->isCameraSoundForced()Z
-HSPLandroid/media/IAudioService$Stub$Proxy;->isSpeakerphoneOn()Z
 HSPLandroid/media/IAudioService$Stub$Proxy;->isStreamAffectedByMute(I)Z
 HSPLandroid/media/IAudioService$Stub$Proxy;->isStreamMute(I)Z
 HSPLandroid/media/IAudioService$Stub$Proxy;->notifyVolumeControllerVisible(Landroid/media/IVolumeController;Z)V
@@ -15234,8 +13535,8 @@
 HSPLandroid/media/IMediaRouterService$Stub;-><init>()V
 HSPLandroid/media/IMediaRouterService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/media/IMediaRouterService;
 HSPLandroid/media/IMediaRouterService$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-PLandroid/media/IPlaybackConfigDispatcher$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-PLandroid/media/IPlaybackConfigDispatcher$Stub$Proxy;->asBinder()Landroid/os/IBinder;
+HPLandroid/media/IPlaybackConfigDispatcher$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+HPLandroid/media/IPlaybackConfigDispatcher$Stub$Proxy;->asBinder()Landroid/os/IBinder;
 HPLandroid/media/IPlaybackConfigDispatcher$Stub$Proxy;->dispatchPlaybackConfigChange(Ljava/util/List;Z)V
 HSPLandroid/media/IPlaybackConfigDispatcher$Stub;-><init>()V
 HSPLandroid/media/IPlaybackConfigDispatcher$Stub;->asBinder()Landroid/os/IBinder;
@@ -15268,6 +13569,7 @@
 HSPLandroid/media/IVolumeController$Stub;->asInterface(Landroid/os/IBinder;)Landroid/media/IVolumeController;
 HSPLandroid/media/IVolumeController$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/media/MediaCodec$BufferInfo;-><init>()V
+HSPLandroid/media/MediaCodec$BufferInfo;->dup()Landroid/media/MediaCodec$BufferInfo;
 HSPLandroid/media/MediaCodec$BufferInfo;->set(IIJI)V
 HSPLandroid/media/MediaCodec$BufferMap$CodecBuffer;-><init>()V
 HSPLandroid/media/MediaCodec$BufferMap$CodecBuffer;-><init>(Landroid/media/MediaCodec$1;)V
@@ -15285,16 +13587,10 @@
 HSPLandroid/media/MediaCodec;-><init>(Ljava/lang/String;ZZ)V
 HSPLandroid/media/MediaCodec;->access$000(Landroid/media/MediaCodec;)Landroid/media/MediaCodec$Callback;
 HSPLandroid/media/MediaCodec;->access$002(Landroid/media/MediaCodec;Landroid/media/MediaCodec$Callback;)Landroid/media/MediaCodec$Callback;
-HSPLandroid/media/MediaCodec;->access$1000(Landroid/media/MediaCodec;[Ljava/nio/ByteBuffer;ILandroid/media/MediaCodec$BufferInfo;)V
 HSPLandroid/media/MediaCodec;->access$300(Landroid/media/MediaCodec;)Ljava/lang/Object;
-HSPLandroid/media/MediaCodec;->access$400(Landroid/media/MediaCodec;)I
-HSPLandroid/media/MediaCodec;->access$500(Landroid/media/MediaCodec;)[Ljava/nio/ByteBuffer;
-HSPLandroid/media/MediaCodec;->access$600(Landroid/media/MediaCodec;[Ljava/nio/ByteBuffer;I)V
-HSPLandroid/media/MediaCodec;->access$900(Landroid/media/MediaCodec;)[Ljava/nio/ByteBuffer;
 HSPLandroid/media/MediaCodec;->cacheBuffers(Z)V
 HSPLandroid/media/MediaCodec;->configure(Landroid/media/MediaFormat;Landroid/view/Surface;Landroid/media/MediaCrypto;I)V
 HSPLandroid/media/MediaCodec;->configure(Landroid/media/MediaFormat;Landroid/view/Surface;Landroid/media/MediaCrypto;Landroid/os/IHwBinder;I)V
-HSPLandroid/media/MediaCodec;->createByCodecName(Ljava/lang/String;)Landroid/media/MediaCodec;
 HSPLandroid/media/MediaCodec;->createDecoderByType(Ljava/lang/String;)Landroid/media/MediaCodec;
 HSPLandroid/media/MediaCodec;->dequeueInputBuffer(J)I
 HSPLandroid/media/MediaCodec;->dequeueOutputBuffer(Landroid/media/MediaCodec$BufferInfo;J)I
@@ -15330,6 +13626,7 @@
 HSPLandroid/media/MediaCodecInfo$AudioCapabilities;->getDefaultFormat(Landroid/media/MediaFormat;)V
 HSPLandroid/media/MediaCodecInfo$AudioCapabilities;->init(Landroid/media/MediaFormat;Landroid/media/MediaCodecInfo$CodecCapabilities;)V
 HSPLandroid/media/MediaCodecInfo$AudioCapabilities;->initWithPlatformLimits()V
+HSPLandroid/media/MediaCodecInfo$AudioCapabilities;->isSampleRateSupported(I)Z
 HSPLandroid/media/MediaCodecInfo$AudioCapabilities;->limitSampleRates([I)V
 HSPLandroid/media/MediaCodecInfo$AudioCapabilities;->limitSampleRates([Landroid/util/Range;)V
 HSPLandroid/media/MediaCodecInfo$AudioCapabilities;->parseFromInfo(Landroid/media/MediaFormat;)V
@@ -15339,6 +13636,7 @@
 HSPLandroid/media/MediaCodecInfo$CodecCapabilities;-><init>([Landroid/media/MediaCodecInfo$CodecProfileLevel;[IZLjava/util/Map;Ljava/util/Map;)V
 HSPLandroid/media/MediaCodecInfo$CodecCapabilities;->checkFeature(Ljava/lang/String;I)Z
 HSPLandroid/media/MediaCodecInfo$CodecCapabilities;->dup()Landroid/media/MediaCodecInfo$CodecCapabilities;
+HSPLandroid/media/MediaCodecInfo$CodecCapabilities;->getAudioCapabilities()Landroid/media/MediaCodecInfo$AudioCapabilities;
 HSPLandroid/media/MediaCodecInfo$CodecCapabilities;->getMimeType()Ljava/lang/String;
 HSPLandroid/media/MediaCodecInfo$CodecCapabilities;->getValidFeatures()[Landroid/media/MediaCodecInfo$Feature;
 HSPLandroid/media/MediaCodecInfo$CodecCapabilities;->getVideoCapabilities()Landroid/media/MediaCodecInfo$VideoCapabilities;
@@ -15390,8 +13688,6 @@
 HSPLandroid/media/MediaCodecInfo;->isHardwareAccelerated()Z
 HSPLandroid/media/MediaCodecInfo;->makeRegular()Landroid/media/MediaCodecInfo;
 HSPLandroid/media/MediaCodecList;-><init>(I)V
-HSPLandroid/media/MediaCodecList;->getCodecCount()I
-HSPLandroid/media/MediaCodecList;->getCodecInfoAt(I)Landroid/media/MediaCodecInfo;
 HSPLandroid/media/MediaCodecList;->getCodecInfos()[Landroid/media/MediaCodecInfo;
 HSPLandroid/media/MediaCodecList;->getGlobalSettings()Ljava/util/Map;
 HSPLandroid/media/MediaCodecList;->getNewCodecInfoAt(I)Landroid/media/MediaCodecInfo;
@@ -15508,7 +13804,6 @@
 HSPLandroid/media/MediaPlayer;->setDataSource(Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;Ljava/util/List;)V
 HSPLandroid/media/MediaPlayer;->setOnCompletionListener(Landroid/media/MediaPlayer$OnCompletionListener;)V
 HSPLandroid/media/MediaPlayer;->setOnErrorListener(Landroid/media/MediaPlayer$OnErrorListener;)V
-HSPLandroid/media/MediaPlayer;->setOnPreparedListener(Landroid/media/MediaPlayer$OnPreparedListener;)V
 HSPLandroid/media/MediaPlayer;->setSubtitleAnchor()V
 HSPLandroid/media/MediaPlayer;->setVolume(F)V
 HSPLandroid/media/MediaPlayer;->setVolume(FF)V
@@ -15518,12 +13813,13 @@
 HSPLandroid/media/MediaPlayer;->stop()V
 HSPLandroid/media/MediaPlayer;->updateSurfaceScreenOn()V
 HSPLandroid/media/MediaRecorder;->getAudioSourceMax()I
+HSPLandroid/media/MediaRoute2Info;->getId()Ljava/lang/String;
+HSPLandroid/media/MediaRoute2Info;->isSystemRoute()Z
 HSPLandroid/media/MediaRouter$Callback;-><init>()V
 HSPLandroid/media/MediaRouter$CallbackInfo;-><init>(Landroid/media/MediaRouter$Callback;IILandroid/media/MediaRouter;)V
 HSPLandroid/media/MediaRouter$CallbackInfo;->filterRouteEvent(I)Z
 HSPLandroid/media/MediaRouter$CallbackInfo;->filterRouteEvent(Landroid/media/MediaRouter$RouteInfo;)Z
 HSPLandroid/media/MediaRouter$RouteCategory;-><init>(IIZ)V
-HSPLandroid/media/MediaRouter$RouteCategory;-><init>(Ljava/lang/CharSequence;IZ)V
 HSPLandroid/media/MediaRouter$RouteCategory;->getName()Ljava/lang/CharSequence;
 HSPLandroid/media/MediaRouter$RouteCategory;->getName(Landroid/content/res/Resources;)Ljava/lang/CharSequence;
 HSPLandroid/media/MediaRouter$RouteCategory;->isGroupable()Z
@@ -15583,18 +13879,7 @@
 HSPLandroid/media/MediaRouter$Static;->updateClientState()V
 HSPLandroid/media/MediaRouter$Static;->updateDiscoveryRequest()V
 HSPLandroid/media/MediaRouter$Static;->updatePresentationDisplays(I)V
-HSPLandroid/media/MediaRouter$UserRouteInfo;-><init>(Landroid/media/MediaRouter$RouteCategory;)V
-HSPLandroid/media/MediaRouter$UserRouteInfo;->configureSessionVolume()V
-HSPLandroid/media/MediaRouter$UserRouteInfo;->setDescription(Ljava/lang/CharSequence;)V
-HSPLandroid/media/MediaRouter$UserRouteInfo;->setName(Ljava/lang/CharSequence;)V
-HSPLandroid/media/MediaRouter$UserRouteInfo;->setPlaybackStream(I)V
-HSPLandroid/media/MediaRouter$UserRouteInfo;->setPlaybackType(I)V
-HSPLandroid/media/MediaRouter$UserRouteInfo;->setVolume(I)V
-HSPLandroid/media/MediaRouter$UserRouteInfo;->setVolumeCallback(Landroid/media/MediaRouter$VolumeCallback;)V
-HSPLandroid/media/MediaRouter$UserRouteInfo;->setVolumeHandling(I)V
-HSPLandroid/media/MediaRouter$UserRouteInfo;->setVolumeMax(I)V
 HSPLandroid/media/MediaRouter$VolumeCallback;-><init>()V
-HSPLandroid/media/MediaRouter$VolumeCallbackInfo;-><init>(Landroid/media/MediaRouter$VolumeCallback;Landroid/media/MediaRouter$RouteInfo;)V
 HSPLandroid/media/MediaRouter$VolumeChangeReceiver;-><init>()V
 HSPLandroid/media/MediaRouter$VolumeChangeReceiver;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
 HSPLandroid/media/MediaRouter$WifiDisplayStatusChangedReceiver;-><init>()V
@@ -15602,13 +13887,12 @@
 HSPLandroid/media/MediaRouter2Manager;-><clinit>()V
 HSPLandroid/media/MediaRouter2Manager;-><init>(Landroid/content/Context;)V
 HSPLandroid/media/MediaRouter2Manager;->getInstance(Landroid/content/Context;)Landroid/media/MediaRouter2Manager;
+HSPLandroid/media/MediaRouter2Utils;->toUniqueId(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
 HSPLandroid/media/MediaRouter;-><init>(Landroid/content/Context;)V
 HSPLandroid/media/MediaRouter;->access$100()Z
 HSPLandroid/media/MediaRouter;->addCallback(ILandroid/media/MediaRouter$Callback;I)V
 HSPLandroid/media/MediaRouter;->addRouteStatic(Landroid/media/MediaRouter$RouteInfo;)V
-HSPLandroid/media/MediaRouter;->addUserRoute(Landroid/media/MediaRouter$UserRouteInfo;)V
 HSPLandroid/media/MediaRouter;->createRouteCategory(Ljava/lang/CharSequence;Z)Landroid/media/MediaRouter$RouteCategory;
-HSPLandroid/media/MediaRouter;->createUserRoute(Landroid/media/MediaRouter$RouteCategory;)Landroid/media/MediaRouter$UserRouteInfo;
 HSPLandroid/media/MediaRouter;->dispatchRouteAdded(Landroid/media/MediaRouter$RouteInfo;)V
 HSPLandroid/media/MediaRouter;->dispatchRouteChanged(Landroid/media/MediaRouter$RouteInfo;)V
 HSPLandroid/media/MediaRouter;->dispatchRouteChanged(Landroid/media/MediaRouter$RouteInfo;I)V
@@ -15623,7 +13907,6 @@
 HSPLandroid/media/MediaRouter;->getSelectedRoute(I)Landroid/media/MediaRouter$RouteInfo;
 HSPLandroid/media/MediaRouter;->removeCallback(Landroid/media/MediaRouter$Callback;)V
 HSPLandroid/media/MediaRouter;->removeRouteStatic(Landroid/media/MediaRouter$RouteInfo;)V
-HSPLandroid/media/MediaRouter;->removeUserRoute(Landroid/media/MediaRouter$UserRouteInfo;)V
 HSPLandroid/media/MediaRouter;->selectDefaultRouteStatic()V
 HSPLandroid/media/MediaRouter;->selectRoute(ILandroid/media/MediaRouter$RouteInfo;)V
 HSPLandroid/media/MediaRouter;->selectRouteStatic(ILandroid/media/MediaRouter$RouteInfo;Z)V
@@ -15643,7 +13926,6 @@
 HSPLandroid/media/PlayerBase$PlayerIdCard;-><init>(Landroid/os/Parcel;Landroid/media/PlayerBase$1;)V
 HSPLandroid/media/PlayerBase$PlayerIdCard;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/media/PlayerBase;-><init>(Landroid/media/AudioAttributes;I)V
-HSPLandroid/media/PlayerBase;->basePause()V
 HSPLandroid/media/PlayerBase;->baseRegisterPlayer()V
 HSPLandroid/media/PlayerBase;->baseRelease()V
 HSPLandroid/media/PlayerBase;->baseSetVolume(FF)V
@@ -15666,7 +13948,6 @@
 HSPLandroid/media/Ringtone;->setAudioAttributes(Landroid/media/AudioAttributes;)V
 HSPLandroid/media/Ringtone;->setUri(Landroid/net/Uri;Landroid/media/VolumeShaper$Configuration;)V
 HSPLandroid/media/RingtoneManager;->getActualDefaultRingtoneUri(Landroid/content/Context;I)Landroid/net/Uri;
-HSPLandroid/media/RingtoneManager;->getDefaultUri(I)Landroid/net/Uri;
 HSPLandroid/media/RingtoneManager;->getRingtone(Landroid/content/Context;Landroid/net/Uri;ILandroid/media/VolumeShaper$Configuration;)Landroid/media/Ringtone;
 HSPLandroid/media/SoundPool$Builder;-><init>()V
 HSPLandroid/media/SoundPool$Builder;->build()Landroid/media/SoundPool;
@@ -15711,8 +13992,6 @@
 HSPLandroid/media/Utils$2;-><init>()V
 HSPLandroid/media/Utils$2;->compare(Landroid/util/Range;Landroid/util/Range;)I
 HSPLandroid/media/Utils$2;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
-HSPLandroid/media/Utils$ListenerList;-><init>()V
-HSPLandroid/media/Utils$ListenerList;-><init>(ZZZ)V
 HSPLandroid/media/Utils;->alignRange(Landroid/util/Range;I)Landroid/util/Range;
 HSPLandroid/media/Utils;->binarySearchDistinctRanges([Landroid/util/Range;Ljava/lang/Comparable;)I
 HSPLandroid/media/Utils;->divUp(II)I
@@ -15732,7 +14011,6 @@
 HSPLandroid/media/VolumePolicy$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/media/VolumePolicy;-><init>(ZZZI)V
 HSPLandroid/media/VolumePolicy;->equals(Ljava/lang/Object;)Z
-HSPLandroid/media/VolumePolicy;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/media/VolumeShaper$Configuration$Builder;-><init>()V
 HSPLandroid/media/VolumeShaper$Configuration$Builder;->build()Landroid/media/VolumeShaper$Configuration;
 HSPLandroid/media/VolumeShaper$Configuration$Builder;->setCurve([F[F)Landroid/media/VolumeShaper$Configuration$Builder;
@@ -15755,8 +14033,6 @@
 HSPLandroid/media/VolumeShaper$Operation;->access$600(Landroid/media/VolumeShaper$Operation;)I
 HSPLandroid/media/VolumeShaper$Operation;->access$700(Landroid/media/VolumeShaper$Operation;)F
 HSPLandroid/media/audiofx/AudioEffect$Descriptor;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/media/audiofx/AudioEffect;-><clinit>()V
-HSPLandroid/media/audiofx/AudioEffect;->queryEffects()[Landroid/media/audiofx/AudioEffect$Descriptor;
 HSPLandroid/media/audiopolicy/AudioProductStrategy$AudioAttributesGroup;-><init>(II[Landroid/media/AudioAttributes;)V
 HSPLandroid/media/audiopolicy/AudioProductStrategy$AudioAttributesGroup;->getAudioAttributes()Landroid/media/AudioAttributes;
 HSPLandroid/media/audiopolicy/AudioProductStrategy$AudioAttributesGroup;->getStreamType()I
@@ -15772,8 +14048,8 @@
 HSPLandroid/media/audiopolicy/AudioProductStrategy;->getLegacyStreamTypeForStrategyWithAudioAttributes(Landroid/media/AudioAttributes;)I
 HSPLandroid/media/audiopolicy/AudioProductStrategy;->initializeAudioProductStrategies()Ljava/util/List;
 HSPLandroid/media/audiopolicy/AudioProductStrategy;->supportsAudioAttributes(Landroid/media/AudioAttributes;)Z
+HPLandroid/media/audiopolicy/IAudioPolicyCallback$Stub;->asInterface(Landroid/os/IBinder;)Landroid/media/audiopolicy/IAudioPolicyCallback;
 HSPLandroid/media/midi/IMidiManager$Stub;-><init>()V
-HPLandroid/media/midi/IMidiManager$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/media/projection/IMediaProjectionManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HSPLandroid/media/projection/IMediaProjectionManager$Stub$Proxy;->addCallback(Landroid/media/projection/IMediaProjectionWatcherCallback;)V
 HSPLandroid/media/projection/IMediaProjectionManager$Stub$Proxy;->getActiveProjectionInfo()Landroid/media/projection/MediaProjectionInfo;
@@ -15781,12 +14057,10 @@
 HSPLandroid/media/projection/IMediaProjectionManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/media/projection/IMediaProjectionManager;
 HPLandroid/media/projection/IMediaProjectionManager$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 PLandroid/media/projection/IMediaProjectionWatcherCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-PLandroid/media/projection/IMediaProjectionWatcherCallback$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/media/projection/IMediaProjectionWatcherCallback$Stub;-><init>()V
+HPLandroid/media/projection/IMediaProjectionWatcherCallback$Stub$Proxy;->asBinder()Landroid/os/IBinder;
 HSPLandroid/media/projection/IMediaProjectionWatcherCallback$Stub;->asBinder()Landroid/os/IBinder;
 PLandroid/media/projection/IMediaProjectionWatcherCallback$Stub;->asInterface(Landroid/os/IBinder;)Landroid/media/projection/IMediaProjectionWatcherCallback;
 HSPLandroid/media/projection/MediaProjectionManager$Callback;-><init>()V
-HSPLandroid/media/projection/MediaProjectionManager$CallbackDelegate;-><init>(Landroid/media/projection/MediaProjectionManager$Callback;Landroid/os/Handler;)V
 HSPLandroid/media/projection/MediaProjectionManager;-><init>(Landroid/content/Context;)V
 HSPLandroid/media/projection/MediaProjectionManager;->addCallback(Landroid/media/projection/MediaProjectionManager$Callback;Landroid/os/Handler;)V
 HSPLandroid/media/projection/MediaProjectionManager;->getActiveProjectionInfo()Landroid/media/projection/MediaProjectionInfo;
@@ -15805,11 +14079,9 @@
 HSPLandroid/media/session/ISession$Stub;-><init>()V
 HPLandroid/media/session/ISession$Stub;->asBinder()Landroid/os/IBinder;
 HPLandroid/media/session/ISession$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-PLandroid/media/session/ISessionCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HPLandroid/media/session/ISessionCallback$Stub$Proxy;->asBinder()Landroid/os/IBinder;
 HSPLandroid/media/session/ISessionCallback$Stub;-><init>()V
 HSPLandroid/media/session/ISessionCallback$Stub;->asBinder()Landroid/os/IBinder;
-PLandroid/media/session/ISessionCallback$Stub;->asInterface(Landroid/os/IBinder;)Landroid/media/session/ISessionCallback;
 HSPLandroid/media/session/ISessionController$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HSPLandroid/media/session/ISessionController$Stub$Proxy;->asBinder()Landroid/os/IBinder;
 HSPLandroid/media/session/ISessionController$Stub$Proxy;->getMetadata()Landroid/media/MediaMetadata;
@@ -15825,6 +14097,7 @@
 HPLandroid/media/session/ISessionController$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HPLandroid/media/session/ISessionControllerCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HPLandroid/media/session/ISessionControllerCallback$Stub$Proxy;->asBinder()Landroid/os/IBinder;
+HPLandroid/media/session/ISessionControllerCallback$Stub$Proxy;->onMetadataChanged(Landroid/media/MediaMetadata;)V
 HPLandroid/media/session/ISessionControllerCallback$Stub$Proxy;->onPlaybackStateChanged(Landroid/media/session/PlaybackState;)V
 HPLandroid/media/session/ISessionControllerCallback$Stub$Proxy;->onSessionDestroyed()V
 HSPLandroid/media/session/ISessionControllerCallback$Stub;-><init>()V
@@ -15841,7 +14114,6 @@
 HSPLandroid/media/session/ISessionManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/media/session/ISessionManager;
 HSPLandroid/media/session/ISessionManager$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/media/session/MediaController$Callback;-><init>()V
-HSPLandroid/media/session/MediaController$Callback;->onMetadataChanged(Landroid/media/MediaMetadata;)V
 HSPLandroid/media/session/MediaController$CallbackStub;-><init>(Landroid/media/session/MediaController;)V
 HSPLandroid/media/session/MediaController$CallbackStub;->onExtrasChanged(Landroid/os/Bundle;)V
 HSPLandroid/media/session/MediaController$CallbackStub;->onMetadataChanged(Landroid/media/MediaMetadata;)V
@@ -15882,8 +14154,6 @@
 HSPLandroid/media/session/MediaSession$CallbackStub;-><init>(Landroid/media/session/MediaSession;)V
 HSPLandroid/media/session/MediaSession$QueueItem$1;->createFromParcel(Landroid/os/Parcel;)Landroid/media/session/MediaSession$QueueItem;
 HSPLandroid/media/session/MediaSession$QueueItem$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/media/session/MediaSession$QueueItem;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/media/session/MediaSession$QueueItem;-><init>(Landroid/os/Parcel;Landroid/media/session/MediaSession$1;)V
 HSPLandroid/media/session/MediaSession$Token$1;->createFromParcel(Landroid/os/Parcel;)Landroid/media/session/MediaSession$Token;
 HSPLandroid/media/session/MediaSession$Token$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/media/session/MediaSession$Token;-><init>(Landroid/media/session/ISessionController;)V
@@ -15902,7 +14172,6 @@
 HSPLandroid/media/session/MediaSession;->setCallback(Landroid/media/session/MediaSession$Callback;Landroid/os/Handler;)V
 HSPLandroid/media/session/MediaSession;->setFlags(I)V
 HSPLandroid/media/session/MediaSession;->setPlaybackToLocal(Landroid/media/AudioAttributes;)V
-HSPLandroid/media/session/MediaSessionLegacyHelper;-><clinit>()V
 HSPLandroid/media/session/MediaSessionLegacyHelper;-><init>(Landroid/content/Context;)V
 HSPLandroid/media/session/MediaSessionLegacyHelper;->getHelper(Landroid/content/Context;)Landroid/media/session/MediaSessionLegacyHelper;
 HSPLandroid/media/session/MediaSessionManager$OnMediaKeyEventDispatchedListenerStub;-><init>(Landroid/media/session/MediaSessionManager;)V
@@ -15948,6 +14217,7 @@
 HSPLandroid/media/session/PlaybackState;->getPosition()J
 HSPLandroid/media/session/PlaybackState;->getState()I
 HSPLandroid/media/session/PlaybackState;->writeToParcel(Landroid/os/Parcel;I)V
+PLandroid/media/soundtrigger_middleware/ISoundTriggerCallback$Stub;-><init>()V
 PLandroid/media/soundtrigger_middleware/ISoundTriggerCallback$Stub;->asBinder()Landroid/os/IBinder;
 HSPLandroid/media/soundtrigger_middleware/ISoundTriggerMiddlewareService$Stub;-><init>()V
 HSPLandroid/media/soundtrigger_middleware/ISoundTriggerMiddlewareService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/media/soundtrigger_middleware/ISoundTriggerMiddlewareService;
@@ -15967,18 +14237,11 @@
 HSPLandroid/media/soundtrigger_middleware/SoundTriggerModuleProperties;-><clinit>()V
 HSPLandroid/media/soundtrigger_middleware/SoundTriggerModuleProperties;-><init>()V
 HSPLandroid/metrics/LogMaker;-><init>(I)V
-HSPLandroid/metrics/LogMaker;-><init>([Ljava/lang/Object;)V
 HSPLandroid/metrics/LogMaker;->addTaggedData(ILjava/lang/Object;)Landroid/metrics/LogMaker;
 HSPLandroid/metrics/LogMaker;->clearTaggedData(I)Landroid/metrics/LogMaker;
-HSPLandroid/metrics/LogMaker;->deserialize([Ljava/lang/Object;)V
 HSPLandroid/metrics/LogMaker;->getCategory()I
-HSPLandroid/metrics/LogMaker;->getCounterBucket()J
-HSPLandroid/metrics/LogMaker;->getCounterName()Ljava/lang/String;
-HSPLandroid/metrics/LogMaker;->getCounterValue()I
 HSPLandroid/metrics/LogMaker;->getEntries()Landroid/util/SparseArray;
-HSPLandroid/metrics/LogMaker;->getTimestamp()J
 HSPLandroid/metrics/LogMaker;->getType()I
-HSPLandroid/metrics/LogMaker;->isLongCounterBucket()Z
 HSPLandroid/metrics/LogMaker;->isValidValue(Ljava/lang/Object;)Z
 HSPLandroid/metrics/LogMaker;->serialize()[Ljava/lang/Object;
 HSPLandroid/metrics/LogMaker;->setCategory(I)Landroid/metrics/LogMaker;
@@ -15988,40 +14251,18 @@
 HSPLandroid/metrics/LogMaker;->setCounterValue(I)Landroid/metrics/LogMaker;
 HPLandroid/metrics/LogMaker;->setLatency(J)Landroid/metrics/LogMaker;
 HSPLandroid/metrics/LogMaker;->setPackageName(Ljava/lang/String;)Landroid/metrics/LogMaker;
-HSPLandroid/metrics/LogMaker;->setProcessId(I)Landroid/metrics/LogMaker;
 HSPLandroid/metrics/LogMaker;->setSubtype(I)Landroid/metrics/LogMaker;
 HSPLandroid/metrics/LogMaker;->setTimestamp(J)Landroid/metrics/LogMaker;
 HSPLandroid/metrics/LogMaker;->setType(I)Landroid/metrics/LogMaker;
-HSPLandroid/metrics/LogMaker;->setUid(I)Landroid/metrics/LogMaker;
-HSPLandroid/metrics/MetricsReader$Event;-><init>(Landroid/util/EventLog$Event;)V
-HSPLandroid/metrics/MetricsReader$Event;->getData()Ljava/lang/Object;
-HSPLandroid/metrics/MetricsReader$Event;->getProcessId()I
-HSPLandroid/metrics/MetricsReader$Event;->getTimeMillis()J
-HSPLandroid/metrics/MetricsReader$Event;->getUid()I
-HSPLandroid/metrics/MetricsReader$LogReader;-><init>()V
-HSPLandroid/metrics/MetricsReader$LogReader;->readEvents([IJLjava/util/Collection;)V
-HSPLandroid/metrics/MetricsReader$LogReader;->writeCheckpoint(I)V
-HSPLandroid/metrics/MetricsReader;-><init>()V
-HSPLandroid/metrics/MetricsReader;->checkpoint()V
-HSPLandroid/metrics/MetricsReader;->hasNext()Z
-HSPLandroid/metrics/MetricsReader;->next()Landroid/metrics/LogMaker;
-HSPLandroid/metrics/MetricsReader;->read(J)V
-HSPLandroid/metrics/MetricsReader;->reset()V
 HSPLandroid/net/-$$Lambda$FpGXkd3pLxeXY58eJ_84mi1PLWQ;->nameOf(I)Ljava/lang/String;
-HSPLandroid/net/-$$Lambda$Network$KD6DxaMRJIcajhj36TU1K7lJnHQ;-><init>(Landroid/net/Network;)V
-HSPLandroid/net/-$$Lambda$Network$KD6DxaMRJIcajhj36TU1K7lJnHQ;->lookup(Ljava/lang/String;)Ljava/util/List;
 HSPLandroid/net/-$$Lambda$NetworkScoreManager$NetworkScoreCallbackProxy$PGkg1UrNyisY0wAts4zoVuYRgkw;-><init>(Landroid/net/NetworkScoreManager$NetworkScoreCallbackProxy;)V
 HSPLandroid/net/-$$Lambda$NetworkScoreManager$NetworkScoreCallbackProxy$PGkg1UrNyisY0wAts4zoVuYRgkw;->run()V
 HPLandroid/net/-$$Lambda$NetworkScoreManager$NetworkScoreCallbackProxy$TEOhIiY2C9y8yDWwRR6zm_12TGY;-><init>(Landroid/net/NetworkScoreManager$NetworkScoreCallbackProxy;Ljava/util/List;)V
 HPLandroid/net/-$$Lambda$NetworkScoreManager$NetworkScoreCallbackProxy$TEOhIiY2C9y8yDWwRR6zm_12TGY;->run()V
-HSPLandroid/net/-$$Lambda$NetworkStats$3raHHJpnJwsEAXnRXF2pK8-UDFY;-><clinit>()V
-HSPLandroid/net/-$$Lambda$NetworkStats$3raHHJpnJwsEAXnRXF2pK8-UDFY;-><init>()V
 HSPLandroid/net/-$$Lambda$NetworkStats$3raHHJpnJwsEAXnRXF2pK8-UDFY;->test(Ljava/lang/Object;)Z
 HPLandroid/net/-$$Lambda$NetworkStats$xvFSsVoR0k5s7Fhw1yPDPVIpx8A;-><init>(II[Ljava/lang/String;)V
 HPLandroid/net/-$$Lambda$NetworkStats$xvFSsVoR0k5s7Fhw1yPDPVIpx8A;->test(Ljava/lang/Object;)Z
 HSPLandroid/net/-$$Lambda$p1_56lwnt1xBuY1muPblbN1Dtkw;->nameOf(I)Ljava/lang/String;
-HSPLandroid/net/ConnectivityManager$1;-><init>(Landroid/net/ConnectivityManager;Landroid/net/ConnectivityManager$OnNetworkActiveListener;)V
-HSPLandroid/net/ConnectivityManager$1;->onNetworkActive()V
 HSPLandroid/net/ConnectivityManager$CallbackHandler;-><init>(Landroid/net/ConnectivityManager;Landroid/os/Handler;)V
 HSPLandroid/net/ConnectivityManager$CallbackHandler;-><init>(Landroid/net/ConnectivityManager;Landroid/os/Looper;)V
 HSPLandroid/net/ConnectivityManager$CallbackHandler;->getObject(Landroid/os/Message;Ljava/lang/Class;)Ljava/lang/Object;
@@ -16042,7 +14283,6 @@
 HSPLandroid/net/ConnectivityManager$OnStartTetheringCallback;-><init>()V
 HSPLandroid/net/ConnectivityManager;-><init>(Landroid/content/Context;Landroid/net/IConnectivityManager;)V
 HSPLandroid/net/ConnectivityManager;->access$800()Ljava/util/HashMap;
-HSPLandroid/net/ConnectivityManager;->addDefaultNetworkActiveListener(Landroid/net/ConnectivityManager$OnNetworkActiveListener;)V
 HSPLandroid/net/ConnectivityManager;->checkCallbackNotNull(Landroid/net/ConnectivityManager$NetworkCallback;)V
 HSPLandroid/net/ConnectivityManager;->checkTimeout(I)V
 HSPLandroid/net/ConnectivityManager;->enforceChangePermission(Landroid/content/Context;)V
@@ -16051,22 +14291,18 @@
 HSPLandroid/net/ConnectivityManager;->getActiveNetworkForUid(I)Landroid/net/Network;
 HSPLandroid/net/ConnectivityManager;->getActiveNetworkForUid(IZ)Landroid/net/Network;
 HSPLandroid/net/ConnectivityManager;->getActiveNetworkInfo()Landroid/net/NetworkInfo;
-HSPLandroid/net/ConnectivityManager;->getAllNetworkInfo()[Landroid/net/NetworkInfo;
 HSPLandroid/net/ConnectivityManager;->getAllNetworks()[Landroid/net/Network;
 HSPLandroid/net/ConnectivityManager;->getAlwaysOnVpnPackageForUser(I)Ljava/lang/String;
-HSPLandroid/net/ConnectivityManager;->getBackgroundDataSetting()Z
 HSPLandroid/net/ConnectivityManager;->getBoundNetworkForProcess()Landroid/net/Network;
 HSPLandroid/net/ConnectivityManager;->getCallbackName(I)Ljava/lang/String;
 HSPLandroid/net/ConnectivityManager;->getDefaultHandler()Landroid/net/ConnectivityManager$CallbackHandler;
 HSPLandroid/net/ConnectivityManager;->getDefaultNetworkCapabilitiesForUser(I)[Landroid/net/NetworkCapabilities;
 HSPLandroid/net/ConnectivityManager;->getDefaultProxy()Landroid/net/ProxyInfo;
-HSPLandroid/net/ConnectivityManager;->getInstanceOrNull()Landroid/net/ConnectivityManager;
 HSPLandroid/net/ConnectivityManager;->getLinkProperties(Landroid/net/Network;)Landroid/net/LinkProperties;
 HSPLandroid/net/ConnectivityManager;->getNetworkCapabilities(Landroid/net/Network;)Landroid/net/NetworkCapabilities;
 HSPLandroid/net/ConnectivityManager;->getNetworkInfo(I)Landroid/net/NetworkInfo;
 HSPLandroid/net/ConnectivityManager;->getNetworkInfo(Landroid/net/Network;)Landroid/net/NetworkInfo;
 HSPLandroid/net/ConnectivityManager;->getNetworkInfoForUid(Landroid/net/Network;IZ)Landroid/net/NetworkInfo;
-HSPLandroid/net/ConnectivityManager;->getNetworkManagementService()Landroid/os/INetworkManagementService;
 HSPLandroid/net/ConnectivityManager;->getNetworkPolicyManager()Landroid/net/INetworkPolicyManager;
 HPLandroid/net/ConnectivityManager;->getNetworkTypeName(I)Ljava/lang/String;
 HSPLandroid/net/ConnectivityManager;->getProcessDefaultNetwork()Landroid/net/Network;
@@ -16076,23 +14312,18 @@
 HSPLandroid/net/ConnectivityManager;->getTetheringManager()Landroid/net/TetheringManager;
 HSPLandroid/net/ConnectivityManager;->inferLegacyTypeForNetworkCapabilities(Landroid/net/NetworkCapabilities;)I
 HSPLandroid/net/ConnectivityManager;->isActiveNetworkMetered()Z
-HSPLandroid/net/ConnectivityManager;->isDefaultNetworkActive()Z
 HSPLandroid/net/ConnectivityManager;->isNetworkSupported(I)Z
 HPLandroid/net/ConnectivityManager;->isNetworkTypeMobile(I)Z
 HSPLandroid/net/ConnectivityManager;->isNetworkTypeValid(I)Z
 HPLandroid/net/ConnectivityManager;->isNetworkTypeWifi(I)Z
 HSPLandroid/net/ConnectivityManager;->isTetheringSupported()Z
-HPLandroid/net/ConnectivityManager;->networkCapabilitiesForFeature(ILjava/lang/String;)Landroid/net/NetworkCapabilities;
-HPLandroid/net/ConnectivityManager;->networkCapabilitiesForType(I)Landroid/net/NetworkCapabilities;
 HSPLandroid/net/ConnectivityManager;->printStackTrace()V
 HSPLandroid/net/ConnectivityManager;->registerDefaultNetworkCallback(Landroid/net/ConnectivityManager$NetworkCallback;)V
 HSPLandroid/net/ConnectivityManager;->registerDefaultNetworkCallback(Landroid/net/ConnectivityManager$NetworkCallback;Landroid/os/Handler;)V
-HSPLandroid/net/ConnectivityManager;->registerNetworkAgent(Landroid/os/Messenger;Landroid/net/NetworkInfo;Landroid/net/LinkProperties;Landroid/net/NetworkCapabilities;Landroid/net/NetworkScore;Landroid/net/NetworkAgentConfig;I)Landroid/net/Network;
+HSPLandroid/net/ConnectivityManager;->registerNetworkAgent(Landroid/os/Messenger;Landroid/net/NetworkInfo;Landroid/net/LinkProperties;Landroid/net/NetworkCapabilities;ILandroid/net/NetworkAgentConfig;I)Landroid/net/Network;
 HSPLandroid/net/ConnectivityManager;->registerNetworkCallback(Landroid/net/NetworkRequest;Landroid/net/ConnectivityManager$NetworkCallback;)V
 HSPLandroid/net/ConnectivityManager;->registerNetworkCallback(Landroid/net/NetworkRequest;Landroid/net/ConnectivityManager$NetworkCallback;Landroid/os/Handler;)V
 HSPLandroid/net/ConnectivityManager;->registerNetworkProvider(Landroid/net/NetworkProvider;)I
-HSPLandroid/net/ConnectivityManager;->reportNetworkConnectivity(Landroid/net/Network;Z)V
-HSPLandroid/net/ConnectivityManager;->requestNetwork(Landroid/net/NetworkRequest;Landroid/net/ConnectivityManager$NetworkCallback;)V
 HSPLandroid/net/ConnectivityManager;->requestNetwork(Landroid/net/NetworkRequest;Landroid/net/ConnectivityManager$NetworkCallback;IILandroid/os/Handler;)V
 HSPLandroid/net/ConnectivityManager;->requestNetwork(Landroid/net/NetworkRequest;Landroid/net/ConnectivityManager$NetworkCallback;Landroid/os/Handler;)V
 HPLandroid/net/ConnectivityManager;->requestNetwork(Landroid/net/NetworkRequest;Landroid/net/ConnectivityManager$NetworkCallback;Landroid/os/Handler;I)V
@@ -16113,17 +14344,13 @@
 HSPLandroid/net/Credentials;->getPid()I
 HSPLandroid/net/Credentials;->getUid()I
 HSPLandroid/net/DataUsageRequest;-><init>(ILandroid/net/NetworkTemplate;J)V
-HSPLandroid/net/DhcpInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/net/DhcpInfo;
-HSPLandroid/net/DhcpInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/net/DhcpInfo;-><init>()V
-HPLandroid/net/DhcpResults;-><init>(Landroid/net/StaticIpConfiguration;)V
+HPLandroid/net/DhcpInfo;->writeToParcel(Landroid/os/Parcel;I)V
 PLandroid/net/EventLogTags;->writeNtpSuccess(Ljava/lang/String;JJ)V
 HSPLandroid/net/IConnectivityManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HSPLandroid/net/IConnectivityManager$Stub$Proxy;->getActiveNetwork()Landroid/net/Network;
 HSPLandroid/net/IConnectivityManager$Stub$Proxy;->getActiveNetworkInfo()Landroid/net/NetworkInfo;
-HSPLandroid/net/IConnectivityManager$Stub$Proxy;->getAllNetworkInfo()[Landroid/net/NetworkInfo;
 HSPLandroid/net/IConnectivityManager$Stub$Proxy;->getAllNetworks()[Landroid/net/Network;
-HSPLandroid/net/IConnectivityManager$Stub$Proxy;->getDefaultNetworkCapabilitiesForUser(I)[Landroid/net/NetworkCapabilities;
 HSPLandroid/net/IConnectivityManager$Stub$Proxy;->getLinkProperties(Landroid/net/Network;)Landroid/net/LinkProperties;
 HSPLandroid/net/IConnectivityManager$Stub$Proxy;->getNetworkCapabilities(Landroid/net/Network;)Landroid/net/NetworkCapabilities;
 HSPLandroid/net/IConnectivityManager$Stub$Proxy;->getNetworkCapabilities(Landroid/net/Network;Ljava/lang/String;)Landroid/net/NetworkCapabilities;
@@ -16136,19 +14363,17 @@
 HSPLandroid/net/IConnectivityManager$Stub$Proxy;->listenForNetwork(Landroid/net/NetworkCapabilities;Landroid/os/Messenger;Landroid/os/IBinder;)Landroid/net/NetworkRequest;
 HSPLandroid/net/IConnectivityManager$Stub$Proxy;->listenForNetwork(Landroid/net/NetworkCapabilities;Landroid/os/Messenger;Landroid/os/IBinder;Ljava/lang/String;)Landroid/net/NetworkRequest;
 HSPLandroid/net/IConnectivityManager$Stub$Proxy;->releaseNetworkRequest(Landroid/net/NetworkRequest;)V
-HSPLandroid/net/IConnectivityManager$Stub$Proxy;->reportNetworkConnectivity(Landroid/net/Network;Z)V
 HSPLandroid/net/IConnectivityManager$Stub$Proxy;->requestNetwork(Landroid/net/NetworkCapabilities;Landroid/os/Messenger;ILandroid/os/IBinder;I)Landroid/net/NetworkRequest;
 HSPLandroid/net/IConnectivityManager$Stub$Proxy;->requestNetwork(Landroid/net/NetworkCapabilities;Landroid/os/Messenger;ILandroid/os/IBinder;ILjava/lang/String;)Landroid/net/NetworkRequest;
 HSPLandroid/net/IConnectivityManager$Stub;-><init>()V
 HSPLandroid/net/IConnectivityManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/IConnectivityManager;
+HPLandroid/net/IConnectivityManager$Stub;->getDefaultTransactionName(I)Ljava/lang/String;
 HSPLandroid/net/IConnectivityManager$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/net/IEthernetManager$Stub;-><init>()V
-HPLandroid/net/IEthernetManager$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/net/IIpConnectivityMetrics$Stub;-><init>()V
 HSPLandroid/net/IIpConnectivityMetrics$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/IIpConnectivityMetrics;
 HPLandroid/net/IIpConnectivityMetrics$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/net/IIpSecService$Stub;-><init>()V
-HPLandroid/net/IIpSecService$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/net/INetdEventCallback$Stub;-><init>()V
 HSPLandroid/net/INetworkManagementEventObserver$Stub;-><init>()V
 HSPLandroid/net/INetworkManagementEventObserver$Stub;->asBinder()Landroid/os/IBinder;
@@ -16169,39 +14394,27 @@
 HPLandroid/net/INetworkPolicyManager$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 PLandroid/net/INetworkRecommendationProvider$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HPLandroid/net/INetworkRecommendationProvider$Stub$Proxy;->requestScores([Landroid/net/NetworkKey;)V
-HSPLandroid/net/INetworkRecommendationProvider$Stub;-><init>()V
 HPLandroid/net/INetworkRecommendationProvider$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/INetworkRecommendationProvider;
-HSPLandroid/net/INetworkRecommendationProvider$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/net/INetworkScoreCache$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HSPLandroid/net/INetworkScoreCache$Stub$Proxy;->asBinder()Landroid/os/IBinder;
 HPLandroid/net/INetworkScoreCache$Stub$Proxy;->clearScores()V
-HPLandroid/net/INetworkScoreCache$Stub$Proxy;->updateScores(Ljava/util/List;)V
 HSPLandroid/net/INetworkScoreCache$Stub;-><init>()V
 HSPLandroid/net/INetworkScoreCache$Stub;->asBinder()Landroid/os/IBinder;
 HSPLandroid/net/INetworkScoreCache$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/INetworkScoreCache;
 HSPLandroid/net/INetworkScoreCache$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/net/INetworkScoreService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/net/INetworkScoreService$Stub$Proxy;->getActiveScorerPackage()Ljava/lang/String;
 HSPLandroid/net/INetworkScoreService$Stub$Proxy;->registerNetworkScoreCache(ILandroid/net/INetworkScoreCache;I)V
 HSPLandroid/net/INetworkScoreService$Stub$Proxy;->requestScores([Landroid/net/NetworkKey;)Z
-HSPLandroid/net/INetworkScoreService$Stub$Proxy;->updateScores([Landroid/net/ScoredNetwork;)Z
 HSPLandroid/net/INetworkScoreService$Stub;-><init>()V
 HSPLandroid/net/INetworkScoreService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/INetworkScoreService;
 HSPLandroid/net/INetworkScoreService$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/net/INetworkStatsService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/net/INetworkStatsService$Stub$Proxy;->getIfaceStats(Ljava/lang/String;I)J
-HSPLandroid/net/INetworkStatsService$Stub$Proxy;->getMobileIfaces()[Ljava/lang/String;
-HSPLandroid/net/INetworkStatsService$Stub$Proxy;->getTotalStats(I)J
-HSPLandroid/net/INetworkStatsService$Stub$Proxy;->openSessionForUsageStats(ILjava/lang/String;)Landroid/net/INetworkStatsSession;
 HSPLandroid/net/INetworkStatsService$Stub;-><init>()V
 PLandroid/net/INetworkStatsService$Stub;->asBinder()Landroid/os/IBinder;
 HSPLandroid/net/INetworkStatsService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/INetworkStatsService;
+PLandroid/net/INetworkStatsService$Stub;->getDefaultTransactionName(I)Ljava/lang/String;
 HSPLandroid/net/INetworkStatsService$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/net/INetworkStatsSession$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/net/INetworkStatsSession$Stub$Proxy;->close()V
-HSPLandroid/net/INetworkStatsSession$Stub$Proxy;->getHistoryIntervalForUid(Landroid/net/NetworkTemplate;IIIIJJ)Landroid/net/NetworkStatsHistory;
 HPLandroid/net/INetworkStatsSession$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/net/INetworkStatsSession$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/INetworkStatsSession;
 HPLandroid/net/INetworkStatsSession$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/net/ITetheringStatsProvider$Stub;-><init>()V
 HSPLandroid/net/InetAddresses;->parseNumericAddress(Ljava/lang/String;)Ljava/net/InetAddress;
@@ -16225,10 +14438,11 @@
 HSPLandroid/net/IpPrefix;-><init>(Ljava/net/InetAddress;I)V
 HSPLandroid/net/IpPrefix;-><init>([BI)V
 HSPLandroid/net/IpPrefix;->checkAndMaskAddressAndPrefixLength()V
-HPLandroid/net/IpPrefix;->contains(Ljava/net/InetAddress;)Z
+HSPLandroid/net/IpPrefix;->contains(Ljava/net/InetAddress;)Z
 HSPLandroid/net/IpPrefix;->equals(Ljava/lang/Object;)Z
 HSPLandroid/net/IpPrefix;->getAddress()Ljava/net/InetAddress;
 HSPLandroid/net/IpPrefix;->getPrefixLength()I
+HSPLandroid/net/IpPrefix;->hashCode()I
 HSPLandroid/net/IpPrefix;->toString()Ljava/lang/String;
 HSPLandroid/net/IpPrefix;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/net/LinkAddress$1;->createFromParcel(Landroid/os/Parcel;)Landroid/net/LinkAddress;
@@ -16268,9 +14482,10 @@
 HPLandroid/net/LinkProperties;->ensureDirectlyConnectedRoutes()V
 HSPLandroid/net/LinkProperties;->equals(Ljava/lang/Object;)Z
 HSPLandroid/net/LinkProperties;->findLinkAddressIndex(Landroid/net/LinkAddress;)I
+HSPLandroid/net/LinkProperties;->findRouteIndexByRouteKey(Landroid/net/RouteInfo;)I
 HSPLandroid/net/LinkProperties;->getAddresses()Ljava/util/List;
 HPLandroid/net/LinkProperties;->getAllInterfaceNames()Ljava/util/List;
-HPLandroid/net/LinkProperties;->getAllRoutes()Ljava/util/List;
+HSPLandroid/net/LinkProperties;->getAllRoutes()Ljava/util/List;
 HSPLandroid/net/LinkProperties;->getCaptivePortalApiUrl()Landroid/net/Uri;
 HSPLandroid/net/LinkProperties;->getCaptivePortalData()Landroid/net/CaptivePortalData;
 HSPLandroid/net/LinkProperties;->getDhcpServerAddress()Ljava/net/Inet4Address;
@@ -16284,13 +14499,12 @@
 HSPLandroid/net/LinkProperties;->getPrivateDnsServerName()Ljava/lang/String;
 HSPLandroid/net/LinkProperties;->getRoutes()Ljava/util/List;
 HSPLandroid/net/LinkProperties;->getStackedLinks()Ljava/util/List;
-PLandroid/net/LinkProperties;->getTcpBufferSizes()Ljava/lang/String;
 HSPLandroid/net/LinkProperties;->getValidatedPrivateDnsServers()Ljava/util/List;
 HSPLandroid/net/LinkProperties;->hasGlobalIpv6Address()Z
 HSPLandroid/net/LinkProperties;->hasIpv4Address()Z
-HPLandroid/net/LinkProperties;->hasIpv4AddressOnInterface(Ljava/lang/String;)Z
-HPLandroid/net/LinkProperties;->hasIpv4DefaultRoute()Z
-HPLandroid/net/LinkProperties;->hasIpv4DnsServer()Z
+HSPLandroid/net/LinkProperties;->hasIpv4AddressOnInterface(Ljava/lang/String;)Z
+HSPLandroid/net/LinkProperties;->hasIpv4DefaultRoute()Z
+HSPLandroid/net/LinkProperties;->hasIpv4DnsServer()Z
 HSPLandroid/net/LinkProperties;->hasIpv6DefaultRoute()Z
 HPLandroid/net/LinkProperties;->hasIpv6DnsServer()Z
 HSPLandroid/net/LinkProperties;->isIdenticalAddresses(Landroid/net/LinkProperties;)Z
@@ -16310,7 +14524,7 @@
 HSPLandroid/net/LinkProperties;->isIdenticalValidatedPrivateDnses(Landroid/net/LinkProperties;)Z
 HSPLandroid/net/LinkProperties;->isIdenticalWakeOnLan(Landroid/net/LinkProperties;)Z
 HSPLandroid/net/LinkProperties;->isPrivateDnsActive()Z
-HPLandroid/net/LinkProperties;->isReachable(Ljava/net/InetAddress;)Z
+HSPLandroid/net/LinkProperties;->isReachable(Ljava/net/InetAddress;)Z
 HSPLandroid/net/LinkProperties;->isWakeOnLanSupported()Z
 HSPLandroid/net/LinkProperties;->readAddress(Landroid/os/Parcel;)Ljava/net/InetAddress;
 HSPLandroid/net/LinkProperties;->routeWithInterface(Landroid/net/RouteInfo;)Landroid/net/RouteInfo;
@@ -16342,7 +14556,6 @@
 HSPLandroid/net/LocalSocket;->close()V
 HSPLandroid/net/LocalSocket;->connect(Landroid/net/LocalSocketAddress;)V
 HSPLandroid/net/LocalSocket;->createConnectedLocalSocket(Landroid/net/LocalSocketImpl;I)Landroid/net/LocalSocket;
-HSPLandroid/net/LocalSocket;->createConnectedLocalSocket(Ljava/io/FileDescriptor;)Landroid/net/LocalSocket;
 HSPLandroid/net/LocalSocket;->createLocalSocketForAccept(Landroid/net/LocalSocketImpl;)Landroid/net/LocalSocket;
 HSPLandroid/net/LocalSocket;->getAncillaryFileDescriptors()[Ljava/io/FileDescriptor;
 HSPLandroid/net/LocalSocket;->getFileDescriptor()Ljava/io/FileDescriptor;
@@ -16351,7 +14564,6 @@
 HSPLandroid/net/LocalSocket;->getPeerCredentials()Landroid/net/Credentials;
 HSPLandroid/net/LocalSocket;->implCreateIfNeeded()V
 HSPLandroid/net/LocalSocket;->setSoTimeout(I)V
-HSPLandroid/net/LocalSocket;->toString()Ljava/lang/String;
 HSPLandroid/net/LocalSocketAddress$Namespace;->getId()I
 HSPLandroid/net/LocalSocketAddress;-><init>(Ljava/lang/String;)V
 HSPLandroid/net/LocalSocketAddress;-><init>(Ljava/lang/String;Landroid/net/LocalSocketAddress$Namespace;)V
@@ -16389,7 +14601,6 @@
 HSPLandroid/net/LocalSocketImpl;->getSockAddress()Landroid/net/LocalSocketAddress;
 HSPLandroid/net/LocalSocketImpl;->listen(I)V
 HSPLandroid/net/LocalSocketImpl;->setOption(ILjava/lang/Object;)V
-HSPLandroid/net/LocalSocketImpl;->toString()Ljava/lang/String;
 HSPLandroid/net/MacAddress$1;->createFromParcel(Landroid/os/Parcel;)Landroid/net/MacAddress;
 HSPLandroid/net/MacAddress$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/net/MacAddress;-><init>(J)V
@@ -16412,33 +14623,24 @@
 HSPLandroid/net/Network$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/net/Network$1;->newArray(I)[Landroid/net/Network;
 HSPLandroid/net/Network$1;->newArray(I)[Ljava/lang/Object;
-HSPLandroid/net/Network$NetworkBoundSocketFactory;-><init>(Landroid/net/Network;)V
-HSPLandroid/net/Network$NetworkBoundSocketFactory;-><init>(Landroid/net/Network;Landroid/net/Network$1;)V
-HSPLandroid/net/Network$NetworkBoundSocketFactory;->createSocket()Ljava/net/Socket;
 HSPLandroid/net/Network;-><init>(I)V
 HSPLandroid/net/Network;-><init>(IZ)V
 HSPLandroid/net/Network;->bindSocket(Ljava/io/FileDescriptor;)V
 HSPLandroid/net/Network;->bindSocket(Ljava/net/DatagramSocket;)V
 HSPLandroid/net/Network;->bindSocket(Ljava/net/Socket;)V
 HSPLandroid/net/Network;->equals(Ljava/lang/Object;)Z
-HSPLandroid/net/Network;->getAllByName(Ljava/lang/String;)[Ljava/net/InetAddress;
 HSPLandroid/net/Network;->getByName(Ljava/lang/String;)Ljava/net/InetAddress;
 HSPLandroid/net/Network;->getNetIdForResolv()I
 HSPLandroid/net/Network;->getNetworkHandle()J
 HSPLandroid/net/Network;->getPrivateDnsBypassingCopy()Landroid/net/Network;
-HSPLandroid/net/Network;->getSocketFactory()Ljavax/net/SocketFactory;
 HSPLandroid/net/Network;->hashCode()I
-HSPLandroid/net/Network;->lambda$maybeInitUrlConnectionFactory$0$Network(Ljava/lang/String;)Ljava/util/List;
-HSPLandroid/net/Network;->maybeInitUrlConnectionFactory()V
-HSPLandroid/net/Network;->openConnection(Ljava/net/URL;)Ljava/net/URLConnection;
-HSPLandroid/net/Network;->openConnection(Ljava/net/URL;Ljava/net/Proxy;)Ljava/net/URLConnection;
 HSPLandroid/net/Network;->toString()Ljava/lang/String;
 HSPLandroid/net/Network;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/net/NetworkAgent$InitialConfiguration;-><init>(Landroid/content/Context;Landroid/net/NetworkCapabilities;Landroid/net/LinkProperties;Landroid/net/NetworkScore;Landroid/net/NetworkAgentConfig;Landroid/net/NetworkInfo;)V
+HSPLandroid/net/NetworkAgent$InitialConfiguration;-><init>(Landroid/content/Context;Landroid/net/NetworkCapabilities;Landroid/net/LinkProperties;ILandroid/net/NetworkAgentConfig;Landroid/net/NetworkInfo;)V
 HSPLandroid/net/NetworkAgent$NetworkAgentHandler;-><init>(Landroid/net/NetworkAgent;Landroid/os/Looper;)V
 HSPLandroid/net/NetworkAgent$NetworkAgentHandler;->handleMessage(Landroid/os/Message;)V
-HSPLandroid/net/NetworkAgent;-><init>(Landroid/content/Context;Landroid/os/Looper;Ljava/lang/String;Landroid/net/NetworkCapabilities;Landroid/net/LinkProperties;Landroid/net/NetworkScore;Landroid/net/NetworkAgentConfig;Landroid/net/NetworkProvider;)V
-HSPLandroid/net/NetworkAgent;-><init>(Landroid/os/Looper;Landroid/content/Context;Ljava/lang/String;Landroid/net/NetworkCapabilities;Landroid/net/LinkProperties;Landroid/net/NetworkScore;Landroid/net/NetworkAgentConfig;ILandroid/net/NetworkInfo;Z)V
+HSPLandroid/net/NetworkAgent;-><init>(Landroid/content/Context;Landroid/os/Looper;Ljava/lang/String;Landroid/net/NetworkCapabilities;Landroid/net/LinkProperties;ILandroid/net/NetworkAgentConfig;Landroid/net/NetworkProvider;)V
+HSPLandroid/net/NetworkAgent;-><init>(Landroid/os/Looper;Landroid/content/Context;Ljava/lang/String;Landroid/net/NetworkCapabilities;Landroid/net/LinkProperties;ILandroid/net/NetworkAgentConfig;ILandroid/net/NetworkInfo;Z)V
 HSPLandroid/net/NetworkAgent;->access$000(Landroid/net/NetworkAgent;)Lcom/android/internal/util/AsyncChannel;
 HSPLandroid/net/NetworkAgent;->access$002(Landroid/net/NetworkAgent;Lcom/android/internal/util/AsyncChannel;)Lcom/android/internal/util/AsyncChannel;
 HSPLandroid/net/NetworkAgent;->access$100(Landroid/net/NetworkAgent;)Ljava/util/ArrayList;
@@ -16497,11 +14699,9 @@
 HSPLandroid/net/NetworkCapabilities;->clearAll()V
 HSPLandroid/net/NetworkCapabilities;->deduceRestrictedCapability()Z
 HSPLandroid/net/NetworkCapabilities;->describeFirstNonRequestableCapability()Ljava/lang/String;
-HPLandroid/net/NetworkCapabilities;->equalRequestableCapabilities(Landroid/net/NetworkCapabilities;)Z
 HSPLandroid/net/NetworkCapabilities;->equals(Ljava/lang/Object;)Z
 HSPLandroid/net/NetworkCapabilities;->equalsLinkBandwidths(Landroid/net/NetworkCapabilities;)Z
 HSPLandroid/net/NetworkCapabilities;->equalsNetCapabilities(Landroid/net/NetworkCapabilities;)Z
-PLandroid/net/NetworkCapabilities;->equalsNetCapabilitiesRequestable(Landroid/net/NetworkCapabilities;)Z
 HSPLandroid/net/NetworkCapabilities;->equalsPrivateDnsBroken(Landroid/net/NetworkCapabilities;)Z
 HSPLandroid/net/NetworkCapabilities;->equalsRequestor(Landroid/net/NetworkCapabilities;)Z
 HSPLandroid/net/NetworkCapabilities;->equalsSSID(Landroid/net/NetworkCapabilities;)Z
@@ -16519,21 +14719,19 @@
 HPLandroid/net/NetworkCapabilities;->getUids()Ljava/util/Set;
 HPLandroid/net/NetworkCapabilities;->getUnwantedCapabilities()[I
 HSPLandroid/net/NetworkCapabilities;->hasCapability(I)Z
-HPLandroid/net/NetworkCapabilities;->hasConnectivityManagedCapability()Z
 HSPLandroid/net/NetworkCapabilities;->hasSignalStrength()Z
 HSPLandroid/net/NetworkCapabilities;->hasTransport(I)Z
 HSPLandroid/net/NetworkCapabilities;->hashCode()I
-HPLandroid/net/NetworkCapabilities;->isMetered()Z
 HSPLandroid/net/NetworkCapabilities;->isPrivateDnsBroken()Z
 HSPLandroid/net/NetworkCapabilities;->isValidCapability(I)Z
 HSPLandroid/net/NetworkCapabilities;->isValidTransport(I)Z
 HSPLandroid/net/NetworkCapabilities;->maybeMarkCapabilitiesRestricted()V
 HSPLandroid/net/NetworkCapabilities;->removeCapability(I)Landroid/net/NetworkCapabilities;
-HPLandroid/net/NetworkCapabilities;->satisfiedByImmutableNetworkCapabilities(Landroid/net/NetworkCapabilities;)Z
 HSPLandroid/net/NetworkCapabilities;->satisfiedByLinkBandwidths(Landroid/net/NetworkCapabilities;)Z
 HSPLandroid/net/NetworkCapabilities;->satisfiedByNetCapabilities(Landroid/net/NetworkCapabilities;Z)Z
 HSPLandroid/net/NetworkCapabilities;->satisfiedByNetworkCapabilities(Landroid/net/NetworkCapabilities;)Z
 HSPLandroid/net/NetworkCapabilities;->satisfiedByNetworkCapabilities(Landroid/net/NetworkCapabilities;Z)Z
+HSPLandroid/net/NetworkCapabilities;->satisfiedByRequestor(Landroid/net/NetworkCapabilities;)Z
 HSPLandroid/net/NetworkCapabilities;->satisfiedBySSID(Landroid/net/NetworkCapabilities;)Z
 HSPLandroid/net/NetworkCapabilities;->satisfiedBySignalStrength(Landroid/net/NetworkCapabilities;)Z
 HSPLandroid/net/NetworkCapabilities;->satisfiedBySpecifier(Landroid/net/NetworkCapabilities;)Z
@@ -16542,6 +14740,7 @@
 HSPLandroid/net/NetworkCapabilities;->set(Landroid/net/NetworkCapabilities;)V
 HSPLandroid/net/NetworkCapabilities;->setAdministratorUids(Ljava/util/List;)Landroid/net/NetworkCapabilities;
 HSPLandroid/net/NetworkCapabilities;->setAdministratorUids(Ljava/util/List;)V
+HSPLandroid/net/NetworkCapabilities;->setAdministratorUids([I)Landroid/net/NetworkCapabilities;
 HSPLandroid/net/NetworkCapabilities;->setCapabilities([I[I)V
 HSPLandroid/net/NetworkCapabilities;->setCapability(IZ)Landroid/net/NetworkCapabilities;
 HSPLandroid/net/NetworkCapabilities;->setLinkDownstreamBandwidthKbps(I)Landroid/net/NetworkCapabilities;
@@ -16557,24 +14756,7 @@
 HSPLandroid/net/NetworkCapabilities;->transportNameOf(I)Ljava/lang/String;
 HSPLandroid/net/NetworkCapabilities;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/net/NetworkConfig;-><init>(Ljava/lang/String;)V
-HSPLandroid/net/NetworkFactory$1;-><init>(Landroid/net/NetworkFactory;Landroid/content/Context;Landroid/os/Looper;Ljava/lang/String;)V
-HSPLandroid/net/NetworkFactory$1;->onNetworkRequested(Landroid/net/NetworkRequest;II)V
-HSPLandroid/net/NetworkFactory$1;->onRequestWithdrawn(Landroid/net/NetworkRequest;)V
-HSPLandroid/net/NetworkFactory$NetworkRequestInfo;-><init>(Landroid/net/NetworkFactory;Landroid/net/NetworkRequest;II)V
-HSPLandroid/net/NetworkFactory;-><init>(Landroid/os/Looper;Landroid/content/Context;Ljava/lang/String;Landroid/net/NetworkCapabilities;)V
-HSPLandroid/net/NetworkFactory;->evalRequest(Landroid/net/NetworkFactory$NetworkRequestInfo;)V
-HSPLandroid/net/NetworkFactory;->evalRequests()V
-HSPLandroid/net/NetworkFactory;->handleAddRequest(Landroid/net/NetworkRequest;II)V
-HSPLandroid/net/NetworkFactory;->handleMessage(Landroid/os/Message;)V
-HSPLandroid/net/NetworkFactory;->handleRemoveRequest(Landroid/net/NetworkRequest;)V
-HSPLandroid/net/NetworkFactory;->handleSetScore(I)V
-HSPLandroid/net/NetworkFactory;->log(Ljava/lang/String;)V
-HSPLandroid/net/NetworkFactory;->register()V
-HSPLandroid/net/NetworkFactory;->setScoreFilter(I)V
-HSPLandroid/net/NetworkFactory;->shouldNeedNetworkFor(Landroid/net/NetworkFactory$NetworkRequestInfo;)Z
-HSPLandroid/net/NetworkFactory;->shouldReleaseNetworkFor(Landroid/net/NetworkFactory$NetworkRequestInfo;)Z
 HSPLandroid/net/NetworkIdentity;-><init>(IILjava/lang/String;Ljava/lang/String;ZZZ)V
-HPLandroid/net/NetworkIdentity;->buildNetworkIdentity(Landroid/content/Context;Landroid/net/NetworkState;Z)Landroid/net/NetworkIdentity;
 HSPLandroid/net/NetworkIdentity;->equals(Ljava/lang/Object;)Z
 HPLandroid/net/NetworkIdentity;->getDefaultNetwork()Z
 HPLandroid/net/NetworkIdentity;->getMetered()Z
@@ -16586,8 +14768,6 @@
 HSPLandroid/net/NetworkIdentity;->hashCode()I
 HSPLandroid/net/NetworkInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/net/NetworkInfo;
 HSPLandroid/net/NetworkInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/net/NetworkInfo$1;->newArray(I)[Landroid/net/NetworkInfo;
-HSPLandroid/net/NetworkInfo$1;->newArray(I)[Ljava/lang/Object;
 HSPLandroid/net/NetworkInfo$DetailedState;->valueOf(Ljava/lang/String;)Landroid/net/NetworkInfo$DetailedState;
 HSPLandroid/net/NetworkInfo$DetailedState;->values()[Landroid/net/NetworkInfo$DetailedState;
 HSPLandroid/net/NetworkInfo$State;->valueOf(Ljava/lang/String;)Landroid/net/NetworkInfo$State;
@@ -16640,14 +14820,16 @@
 HPLandroid/net/NetworkPolicy;->hasCycle()Z
 HPLandroid/net/NetworkPolicy;->isOverLimit(J)Z
 HPLandroid/net/NetworkPolicy;->isOverWarning(J)Z
+HPLandroid/net/NetworkPolicyManager$1;-><init>(Ljava/util/Iterator;)V
 HPLandroid/net/NetworkPolicyManager$1;->hasNext()Z
 HPLandroid/net/NetworkPolicyManager$1;->next()Landroid/util/Pair;
 HPLandroid/net/NetworkPolicyManager$1;->next()Ljava/lang/Object;
 HSPLandroid/net/NetworkPolicyManager$Listener;-><init>()V
 HSPLandroid/net/NetworkPolicyManager$Listener;->onMeteredIfacesChanged([Ljava/lang/String;)V
-PLandroid/net/NetworkPolicyManager$Listener;->onSubscriptionPlansChanged(I[Landroid/telephony/SubscriptionPlan;)V
+HSPLandroid/net/NetworkPolicyManager$Listener;->onSubscriptionPlansChanged(I[Landroid/telephony/SubscriptionPlan;)V
 HSPLandroid/net/NetworkPolicyManager$Listener;->onUidRulesChanged(II)V
 HSPLandroid/net/NetworkPolicyManager;-><init>(Landroid/content/Context;Landroid/net/INetworkPolicyManager;)V
+HPLandroid/net/NetworkPolicyManager;->cycleIterator(Landroid/net/NetworkPolicy;)Ljava/util/Iterator;
 HSPLandroid/net/NetworkPolicyManager;->from(Landroid/content/Context;)Landroid/net/NetworkPolicyManager;
 HSPLandroid/net/NetworkPolicyManager;->getNetworkPolicies()[Landroid/net/NetworkPolicy;
 HSPLandroid/net/NetworkPolicyManager;->getRestrictBackground()Z
@@ -16661,15 +14843,6 @@
 HSPLandroid/net/NetworkProvider;->getName()Ljava/lang/String;
 HSPLandroid/net/NetworkProvider;->getProviderId()I
 HSPLandroid/net/NetworkProvider;->setProviderId(I)V
-HSPLandroid/net/NetworkRecommendationProvider$ServiceWrapper$1;-><init>(Landroid/net/NetworkRecommendationProvider$ServiceWrapper;[Landroid/net/NetworkKey;)V
-HSPLandroid/net/NetworkRecommendationProvider$ServiceWrapper$1;->run()V
-HSPLandroid/net/NetworkRecommendationProvider$ServiceWrapper;-><init>(Landroid/net/NetworkRecommendationProvider;Landroid/content/Context;Ljava/util/concurrent/Executor;)V
-HSPLandroid/net/NetworkRecommendationProvider$ServiceWrapper;->enforceCallingPermission()V
-HSPLandroid/net/NetworkRecommendationProvider$ServiceWrapper;->execute(Ljava/lang/Runnable;)V
-HSPLandroid/net/NetworkRecommendationProvider$ServiceWrapper;->requestScores([Landroid/net/NetworkKey;)V
-HSPLandroid/net/NetworkRecommendationProvider;-><clinit>()V
-HSPLandroid/net/NetworkRecommendationProvider;-><init>(Landroid/content/Context;Ljava/util/concurrent/Executor;)V
-HSPLandroid/net/NetworkRecommendationProvider;->getBinder()Landroid/os/IBinder;
 HSPLandroid/net/NetworkRequest$1;->createFromParcel(Landroid/os/Parcel;)Landroid/net/NetworkRequest;
 HSPLandroid/net/NetworkRequest$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/net/NetworkRequest$Builder;-><init>()V
@@ -16678,13 +14851,10 @@
 HSPLandroid/net/NetworkRequest$Builder;->build()Landroid/net/NetworkRequest;
 HSPLandroid/net/NetworkRequest$Builder;->clearCapabilities()Landroid/net/NetworkRequest$Builder;
 HSPLandroid/net/NetworkRequest$Builder;->removeCapability(I)Landroid/net/NetworkRequest$Builder;
-HSPLandroid/net/NetworkRequest$Builder;->setNetworkSpecifier(Landroid/net/NetworkSpecifier;)Landroid/net/NetworkRequest$Builder;
-HSPLandroid/net/NetworkRequest$Builder;->setNetworkSpecifier(Ljava/lang/String;)Landroid/net/NetworkRequest$Builder;
 HSPLandroid/net/NetworkRequest$Builder;->setUids(Ljava/util/Set;)Landroid/net/NetworkRequest$Builder;
 HSPLandroid/net/NetworkRequest$Type;->valueOf(Ljava/lang/String;)Landroid/net/NetworkRequest$Type;
 HSPLandroid/net/NetworkRequest$Type;->values()[Landroid/net/NetworkRequest$Type;
 HSPLandroid/net/NetworkRequest;-><init>(Landroid/net/NetworkCapabilities;IILandroid/net/NetworkRequest$Type;)V
-HPLandroid/net/NetworkRequest;-><init>(Landroid/net/NetworkRequest;)V
 HSPLandroid/net/NetworkRequest;->equals(Ljava/lang/Object;)Z
 HSPLandroid/net/NetworkRequest;->getNetworkSpecifier()Landroid/net/NetworkSpecifier;
 HSPLandroid/net/NetworkRequest;->hasCapability(I)Z
@@ -16696,13 +14866,7 @@
 HSPLandroid/net/NetworkRequest;->satisfiedBy(Landroid/net/NetworkCapabilities;)Z
 HSPLandroid/net/NetworkRequest;->toString()Ljava/lang/String;
 HSPLandroid/net/NetworkRequest;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/net/NetworkScore$Builder;-><init>()V
-HSPLandroid/net/NetworkScore$Builder;->build()Landroid/net/NetworkScore;
-HSPLandroid/net/NetworkScore$Builder;->setLegacyScore(I)Landroid/net/NetworkScore$Builder;
-HSPLandroid/net/NetworkScore$Metrics;-><clinit>()V
-HSPLandroid/net/NetworkScore$Metrics;-><init>(III)V
-HSPLandroid/net/NetworkScore;-><init>(ILandroid/net/NetworkScore$Metrics;Landroid/net/NetworkScore$Metrics;IIZI)V
-HSPLandroid/net/NetworkScore;-><init>(ILandroid/net/NetworkScore$Metrics;Landroid/net/NetworkScore$Metrics;IIZILandroid/net/NetworkScore$1;)V
+HSPLandroid/net/NetworkScoreManager$NetworkScoreCallback;-><init>()V
 HSPLandroid/net/NetworkScoreManager$NetworkScoreCallbackProxy;-><init>(Landroid/net/NetworkScoreManager;Ljava/util/concurrent/Executor;Landroid/net/NetworkScoreManager$NetworkScoreCallback;)V
 HSPLandroid/net/NetworkScoreManager$NetworkScoreCallbackProxy;->clearScores()V
 HSPLandroid/net/NetworkScoreManager$NetworkScoreCallbackProxy;->lambda$clearScores$1$NetworkScoreManager$NetworkScoreCallbackProxy()V
@@ -16713,12 +14877,7 @@
 HSPLandroid/net/NetworkScoreManager;->registerNetworkScoreCache(ILandroid/net/INetworkScoreCache;I)V
 HSPLandroid/net/NetworkScoreManager;->registerNetworkScoreCallback(IILjava/util/concurrent/Executor;Landroid/net/NetworkScoreManager$NetworkScoreCallback;)V
 HSPLandroid/net/NetworkScoreManager;->requestScores([Landroid/net/NetworkKey;)Z
-HSPLandroid/net/NetworkScoreManager;->updateScores([Landroid/net/ScoredNetwork;)Z
-HSPLandroid/net/NetworkScorerAppData;-><clinit>()V
-HPLandroid/net/NetworkScorerAppData;-><init>(ILandroid/content/ComponentName;Ljava/lang/String;Landroid/content/ComponentName;Ljava/lang/String;)V
 HPLandroid/net/NetworkScorerAppData;->equals(Ljava/lang/Object;)Z
-HPLandroid/net/NetworkScorerAppData;->getRecommendationServiceComponent()Landroid/content/ComponentName;
-HPLandroid/net/NetworkScorerAppData;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/net/NetworkSpecifier;-><init>()V
 HPLandroid/net/NetworkSpecifier;->redact()Landroid/net/NetworkSpecifier;
 HSPLandroid/net/NetworkStack;->checkAnyPermissionOf(Landroid/content/Context;[Ljava/lang/String;)Z
@@ -16765,8 +14924,6 @@
 HSPLandroid/net/NetworkStats;->subtract(Landroid/net/NetworkStats;Landroid/net/NetworkStats;Landroid/net/NetworkStats$NonMonotonicObserver;Ljava/lang/Object;)Landroid/net/NetworkStats;
 HSPLandroid/net/NetworkStats;->subtract(Landroid/net/NetworkStats;Landroid/net/NetworkStats;Landroid/net/NetworkStats$NonMonotonicObserver;Ljava/lang/Object;Landroid/net/NetworkStats;)Landroid/net/NetworkStats;
 HSPLandroid/net/NetworkStats;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/net/NetworkStatsHistory$1;->createFromParcel(Landroid/os/Parcel;)Landroid/net/NetworkStatsHistory;
-HSPLandroid/net/NetworkStatsHistory$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/net/NetworkStatsHistory$DataStreamUtils;->readVarLong(Ljava/io/DataInputStream;)J
 HSPLandroid/net/NetworkStatsHistory$DataStreamUtils;->readVarLongArray(Ljava/io/DataInputStream;)[J
 HPLandroid/net/NetworkStatsHistory$DataStreamUtils;->writeVarLong(Ljava/io/DataOutputStream;J)V
@@ -16776,7 +14933,6 @@
 HSPLandroid/net/NetworkStatsHistory;-><init>(J)V
 HPLandroid/net/NetworkStatsHistory;-><init>(JI)V
 HSPLandroid/net/NetworkStatsHistory;-><init>(JII)V
-HSPLandroid/net/NetworkStatsHistory;-><init>(Landroid/os/Parcel;)V
 HSPLandroid/net/NetworkStatsHistory;-><init>(Ljava/io/DataInputStream;)V
 HSPLandroid/net/NetworkStatsHistory;->addLong([JIJ)V
 HSPLandroid/net/NetworkStatsHistory;->ensureBuckets(JJ)V
@@ -16786,7 +14942,6 @@
 HSPLandroid/net/NetworkStatsHistory;->getLong([JIJ)J
 HSPLandroid/net/NetworkStatsHistory;->getStart()J
 HSPLandroid/net/NetworkStatsHistory;->getTotalBytes()J
-HSPLandroid/net/NetworkStatsHistory;->getValues(ILandroid/net/NetworkStatsHistory$Entry;)Landroid/net/NetworkStatsHistory$Entry;
 HPLandroid/net/NetworkStatsHistory;->getValues(JJJLandroid/net/NetworkStatsHistory$Entry;)Landroid/net/NetworkStatsHistory$Entry;
 HSPLandroid/net/NetworkStatsHistory;->insertBucket(IJ)V
 HSPLandroid/net/NetworkStatsHistory;->recordData(JJLandroid/net/NetworkStats$Entry;)V
@@ -16832,36 +14987,36 @@
 HSPLandroid/net/Proxy;->setHttpProxySystemProperty(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/net/Uri;)V
 HSPLandroid/net/RouteInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/net/RouteInfo;
 HSPLandroid/net/RouteInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
+HSPLandroid/net/RouteInfo$RouteKey;-><init>(Landroid/net/IpPrefix;Ljava/net/InetAddress;)V
 HSPLandroid/net/RouteInfo;-><init>(Landroid/net/IpPrefix;Ljava/net/InetAddress;Ljava/lang/String;)V
 HSPLandroid/net/RouteInfo;-><init>(Landroid/net/IpPrefix;Ljava/net/InetAddress;Ljava/lang/String;I)V
 HSPLandroid/net/RouteInfo;-><init>(Landroid/net/IpPrefix;Ljava/net/InetAddress;Ljava/lang/String;II)V
-HPLandroid/net/RouteInfo;-><init>(Landroid/net/LinkAddress;Ljava/net/InetAddress;Ljava/lang/String;)V
+HSPLandroid/net/RouteInfo;-><init>(Landroid/net/LinkAddress;Ljava/net/InetAddress;Ljava/lang/String;)V
 HSPLandroid/net/RouteInfo;->equals(Ljava/lang/Object;)Z
 HSPLandroid/net/RouteInfo;->getDestination()Landroid/net/IpPrefix;
 HSPLandroid/net/RouteInfo;->getGateway()Ljava/net/InetAddress;
 HSPLandroid/net/RouteInfo;->getInterface()Ljava/lang/String;
 HSPLandroid/net/RouteInfo;->getMtu()I
+HSPLandroid/net/RouteInfo;->getRouteKey()Landroid/net/RouteInfo$RouteKey;
 HSPLandroid/net/RouteInfo;->getType()I
 HSPLandroid/net/RouteInfo;->hasGateway()Z
 HSPLandroid/net/RouteInfo;->isDefaultRoute()Z
 HSPLandroid/net/RouteInfo;->isHost()Z
 HSPLandroid/net/RouteInfo;->isIPv4Default()Z
-HPLandroid/net/RouteInfo;->isIPv6Default()Z
-HPLandroid/net/RouteInfo;->matches(Ljava/net/InetAddress;)Z
-HPLandroid/net/RouteInfo;->selectBestRoute(Ljava/util/Collection;Ljava/net/InetAddress;)Landroid/net/RouteInfo;
+HSPLandroid/net/RouteInfo;->isIPv6Default()Z
+HSPLandroid/net/RouteInfo;->matches(Ljava/net/InetAddress;)Z
+HSPLandroid/net/RouteInfo;->selectBestRoute(Ljava/util/Collection;Ljava/net/InetAddress;)Landroid/net/RouteInfo;
 HSPLandroid/net/RouteInfo;->toString()Ljava/lang/String;
 HSPLandroid/net/RouteInfo;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/net/RssiCurve$1;->createFromParcel(Landroid/os/Parcel;)Landroid/net/RssiCurve;
 HSPLandroid/net/RssiCurve$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/net/RssiCurve;-><init>(Landroid/os/Parcel;)V
 HSPLandroid/net/RssiCurve;-><init>(Landroid/os/Parcel;Landroid/net/RssiCurve$1;)V
-HSPLandroid/net/RssiCurve;->lookupScore(IZ)B
 HSPLandroid/net/RssiCurve;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/net/ScoredNetwork$1;->createFromParcel(Landroid/os/Parcel;)Landroid/net/ScoredNetwork;
 HSPLandroid/net/ScoredNetwork$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 PLandroid/net/ScoredNetwork$1;->newArray(I)[Landroid/net/ScoredNetwork;
 HPLandroid/net/ScoredNetwork$1;->newArray(I)[Ljava/lang/Object;
-HSPLandroid/net/ScoredNetwork;-><init>(Landroid/net/NetworkKey;Landroid/net/RssiCurve;Z)V
 HSPLandroid/net/ScoredNetwork;-><init>(Landroid/os/Parcel;)V
 HSPLandroid/net/ScoredNetwork;-><init>(Landroid/os/Parcel;Landroid/net/ScoredNetwork$1;)V
 HSPLandroid/net/ScoredNetwork;->calculateBadge(I)I
@@ -16878,29 +15033,26 @@
 PLandroid/net/SntpClient;->writeTimeStamp([BIJ)V
 HSPLandroid/net/StaticIpConfiguration$1;->createFromParcel(Landroid/os/Parcel;)Landroid/net/StaticIpConfiguration;
 HSPLandroid/net/StaticIpConfiguration$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HPLandroid/net/StaticIpConfiguration$Builder;-><init>()V
-HPLandroid/net/StaticIpConfiguration$Builder;->build()Landroid/net/StaticIpConfiguration;
-HPLandroid/net/StaticIpConfiguration$Builder;->setDnsServers(Ljava/lang/Iterable;)Landroid/net/StaticIpConfiguration$Builder;
-PLandroid/net/StaticIpConfiguration$Builder;->setDomains(Ljava/lang/String;)Landroid/net/StaticIpConfiguration$Builder;
-PLandroid/net/StaticIpConfiguration$Builder;->setGateway(Ljava/net/InetAddress;)Landroid/net/StaticIpConfiguration$Builder;
-PLandroid/net/StaticIpConfiguration$Builder;->setIpAddress(Landroid/net/LinkAddress;)Landroid/net/StaticIpConfiguration$Builder;
+HSPLandroid/net/StaticIpConfiguration$Builder;-><init>()V
+HSPLandroid/net/StaticIpConfiguration$Builder;->build()Landroid/net/StaticIpConfiguration;
+HSPLandroid/net/StaticIpConfiguration$Builder;->setDnsServers(Ljava/lang/Iterable;)Landroid/net/StaticIpConfiguration$Builder;
+HSPLandroid/net/StaticIpConfiguration$Builder;->setDomains(Ljava/lang/String;)Landroid/net/StaticIpConfiguration$Builder;
+HSPLandroid/net/StaticIpConfiguration$Builder;->setGateway(Ljava/net/InetAddress;)Landroid/net/StaticIpConfiguration$Builder;
+HSPLandroid/net/StaticIpConfiguration$Builder;->setIpAddress(Landroid/net/LinkAddress;)Landroid/net/StaticIpConfiguration$Builder;
 HSPLandroid/net/StaticIpConfiguration;-><init>()V
-PLandroid/net/StaticIpConfiguration;->getDnsServers()Ljava/util/List;
-PLandroid/net/StaticIpConfiguration;->getDomains()Ljava/lang/String;
-PLandroid/net/StaticIpConfiguration;->getGateway()Ljava/net/InetAddress;
-PLandroid/net/StaticIpConfiguration;->getIpAddress()Landroid/net/LinkAddress;
-HPLandroid/net/StaticIpConfiguration;->getRoutes(Ljava/lang/String;)Ljava/util/List;
+HSPLandroid/net/StaticIpConfiguration;->getDnsServers()Ljava/util/List;
+HSPLandroid/net/StaticIpConfiguration;->getDomains()Ljava/lang/String;
+HSPLandroid/net/StaticIpConfiguration;->getGateway()Ljava/net/InetAddress;
+HSPLandroid/net/StaticIpConfiguration;->getIpAddress()Landroid/net/LinkAddress;
+HSPLandroid/net/StaticIpConfiguration;->getRoutes(Ljava/lang/String;)Ljava/util/List;
 HSPLandroid/net/StaticIpConfiguration;->readFromParcel(Landroid/os/Parcel;)Landroid/net/StaticIpConfiguration;
-HPLandroid/net/StaticIpConfiguration;->writeToParcel(Landroid/os/Parcel;I)V
+HSPLandroid/net/StaticIpConfiguration;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/net/StringNetworkSpecifier$1;->createFromParcel(Landroid/os/Parcel;)Landroid/net/StringNetworkSpecifier;
 HSPLandroid/net/StringNetworkSpecifier$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/net/StringNetworkSpecifier;-><init>(Ljava/lang/String;)V
 HSPLandroid/net/TelephonyNetworkSpecifier$1;-><init>()V
 HSPLandroid/net/TelephonyNetworkSpecifier$1;->createFromParcel(Landroid/os/Parcel;)Landroid/net/TelephonyNetworkSpecifier;
 HSPLandroid/net/TelephonyNetworkSpecifier$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/net/TelephonyNetworkSpecifier$Builder;-><init>()V
-HSPLandroid/net/TelephonyNetworkSpecifier$Builder;->build()Landroid/net/TelephonyNetworkSpecifier;
-HSPLandroid/net/TelephonyNetworkSpecifier$Builder;->setSubscriptionId(I)Landroid/net/TelephonyNetworkSpecifier$Builder;
 HSPLandroid/net/TelephonyNetworkSpecifier;-><clinit>()V
 HSPLandroid/net/TelephonyNetworkSpecifier;-><init>(I)V
 HSPLandroid/net/TelephonyNetworkSpecifier;->equals(Ljava/lang/Object;)Z
@@ -16911,7 +15063,6 @@
 HSPLandroid/net/TelephonyNetworkSpecifier;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/net/TrafficStats;->addIfSupported(J)J
 HSPLandroid/net/TrafficStats;->clearThreadStatsTag()V
-HSPLandroid/net/TrafficStats;->clearThreadStatsUid()V
 HSPLandroid/net/TrafficStats;->getAndSetThreadStatsTag(I)I
 HSPLandroid/net/TrafficStats;->getMobileIfaces()[Ljava/lang/String;
 HSPLandroid/net/TrafficStats;->getMobileRxBytes()J
@@ -16919,7 +15070,6 @@
 HSPLandroid/net/TrafficStats;->getRxBytes(Ljava/lang/String;)J
 HSPLandroid/net/TrafficStats;->getRxPackets(Ljava/lang/String;)J
 HSPLandroid/net/TrafficStats;->getStatsService()Landroid/net/INetworkStatsService;
-HSPLandroid/net/TrafficStats;->getThreadStatsTag()I
 HSPLandroid/net/TrafficStats;->getTotalRxBytes()J
 HSPLandroid/net/TrafficStats;->getTotalTxBytes()J
 HSPLandroid/net/TrafficStats;->getTxBytes(Ljava/lang/String;)J
@@ -16927,8 +15077,6 @@
 HSPLandroid/net/TrafficStats;->getUidRxBytes(I)J
 HSPLandroid/net/TrafficStats;->getUidTxBytes(I)J
 HSPLandroid/net/TrafficStats;->setThreadStatsTag(I)V
-HSPLandroid/net/TrafficStats;->setThreadStatsUid(I)V
-HSPLandroid/net/TrafficStats;->tagSocket(Ljava/net/Socket;)V
 HSPLandroid/net/TrafficStats;->untagSocket(Ljava/net/Socket;)V
 HSPLandroid/net/UidRange$1;->createFromParcel(Landroid/os/Parcel;)Landroid/net/UidRange;
 HSPLandroid/net/UidRange$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
@@ -17042,7 +15190,6 @@
 HSPLandroid/net/Uri$StringUri;->getEncodedFragment()Ljava/lang/String;
 HSPLandroid/net/Uri$StringUri;->getEncodedPath()Ljava/lang/String;
 HSPLandroid/net/Uri$StringUri;->getEncodedQuery()Ljava/lang/String;
-HSPLandroid/net/Uri$StringUri;->getFragment()Ljava/lang/String;
 HSPLandroid/net/Uri$StringUri;->getFragmentPart()Landroid/net/Uri$Part;
 HSPLandroid/net/Uri$StringUri;->getPath()Ljava/lang/String;
 HSPLandroid/net/Uri$StringUri;->getPathPart()Landroid/net/Uri$PathPart;
@@ -17053,7 +15200,6 @@
 HSPLandroid/net/Uri$StringUri;->getSchemeSpecificPart()Ljava/lang/String;
 HSPLandroid/net/Uri$StringUri;->getSsp()Landroid/net/Uri$Part;
 HSPLandroid/net/Uri$StringUri;->isHierarchical()Z
-HSPLandroid/net/Uri$StringUri;->isRelative()Z
 HSPLandroid/net/Uri$StringUri;->parseAuthority(Ljava/lang/String;I)Ljava/lang/String;
 HSPLandroid/net/Uri$StringUri;->parseFragment()Ljava/lang/String;
 HSPLandroid/net/Uri$StringUri;->parsePath()Ljava/lang/String;
@@ -17079,7 +15225,6 @@
 HSPLandroid/net/Uri;->getQueryParameter(Ljava/lang/String;)Ljava/lang/String;
 HSPLandroid/net/Uri;->getQueryParameterNames()Ljava/util/Set;
 HSPLandroid/net/Uri;->hashCode()I
-HSPLandroid/net/Uri;->isAbsolute()Z
 HSPLandroid/net/Uri;->isAllowed(CLjava/lang/String;)Z
 HSPLandroid/net/Uri;->isOpaque()Z
 HSPLandroid/net/Uri;->isPathPrefixMatch(Landroid/net/Uri;)Z
@@ -17093,8 +15238,6 @@
 HSPLandroid/net/UriCodec;->flushDecodingByteAccumulator(Ljava/lang/StringBuilder;Ljava/nio/charset/CharsetDecoder;Ljava/nio/ByteBuffer;Z)V
 HSPLandroid/net/UriCodec;->getNextCharacter(Ljava/lang/String;IILjava/lang/String;)C
 HSPLandroid/net/UriCodec;->hexCharToValue(C)I
-HSPLandroid/net/WebAddress;-><init>(Ljava/lang/String;)V
-HSPLandroid/net/WebAddress;->toString()Ljava/lang/String;
 HSPLandroid/net/WifiKey$1;->createFromParcel(Landroid/os/Parcel;)Landroid/net/WifiKey;
 HSPLandroid/net/WifiKey$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/net/WifiKey;-><init>(Landroid/os/Parcel;)V
@@ -17104,7 +15247,6 @@
 HSPLandroid/net/WifiKey;->hashCode()I
 HSPLandroid/net/WifiKey;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/net/apf/ApfCapabilities;-><init>(III)V
-HPLandroid/net/apf/ApfCapabilities;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/net/http/X509TrustManagerExtensions;-><init>(Ljavax/net/ssl/X509TrustManager;)V
 HSPLandroid/net/http/X509TrustManagerExtensions;->checkServerTrusted([Ljava/security/cert/X509Certificate;Ljava/lang/String;Ljava/lang/String;)Ljava/util/List;
 HPLandroid/net/metrics/ConnectStats;-><init>(IJLcom/android/internal/util/TokenBucket;I)V
@@ -17115,29 +15257,28 @@
 HPLandroid/net/metrics/ConnectStats;->isNonBlocking(I)Z
 HPLandroid/net/metrics/ConnectStats;->isSuccess(I)Z
 HSPLandroid/net/metrics/DefaultNetworkEvent;-><init>(J)V
-PLandroid/net/metrics/DefaultNetworkEvent;->updateDuration(J)V
+HPLandroid/net/metrics/DefaultNetworkEvent;->updateDuration(J)V
 HPLandroid/net/metrics/DhcpClientEvent$1;->createFromParcel(Landroid/os/Parcel;)Landroid/net/metrics/DhcpClientEvent;
 HPLandroid/net/metrics/DhcpClientEvent$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HPLandroid/net/metrics/DhcpClientEvent;-><init>(Landroid/os/Parcel;)V
 HPLandroid/net/metrics/DhcpClientEvent;-><init>(Landroid/os/Parcel;Landroid/net/metrics/DhcpClientEvent$1;)V
-PLandroid/net/metrics/DhcpErrorEvent$1;-><init>()V
+HSPLandroid/net/metrics/DhcpErrorEvent$1;-><init>()V
 PLandroid/net/metrics/DhcpErrorEvent$1;->createFromParcel(Landroid/os/Parcel;)Landroid/net/metrics/DhcpErrorEvent;
 HPLandroid/net/metrics/DhcpErrorEvent$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-PLandroid/net/metrics/DhcpErrorEvent;-><clinit>()V
+HSPLandroid/net/metrics/DhcpErrorEvent;-><clinit>()V
 HPLandroid/net/metrics/DhcpErrorEvent;-><init>(Landroid/os/Parcel;)V
 HPLandroid/net/metrics/DhcpErrorEvent;-><init>(Landroid/os/Parcel;Landroid/net/metrics/DhcpErrorEvent$1;)V
 HPLandroid/net/metrics/DnsEvent;-><init>(IJI)V
 HPLandroid/net/metrics/DnsEvent;->addResult(BBI)Z
-HPLandroid/net/metrics/DnsEvent;->resize(I)V
 HSPLandroid/net/metrics/IpConnectivityLog;-><init>()V
 HSPLandroid/net/metrics/IpConnectivityLog;->checkLoggerService()Z
 HSPLandroid/net/metrics/IpConnectivityLog;->log(I[ILandroid/net/metrics/IpConnectivityLog$Event;)Z
 HSPLandroid/net/metrics/IpConnectivityLog;->log(Landroid/net/ConnectivityMetricsEvent;)Z
 HSPLandroid/net/metrics/IpConnectivityLog;->makeEv(Landroid/net/metrics/IpConnectivityLog$Event;)Landroid/net/ConnectivityMetricsEvent;
 PLandroid/net/metrics/IpManagerEvent$1;->createFromParcel(Landroid/os/Parcel;)Landroid/net/metrics/IpManagerEvent;
-PLandroid/net/metrics/IpManagerEvent$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
+HPLandroid/net/metrics/IpManagerEvent$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HPLandroid/net/metrics/IpManagerEvent;-><init>(Landroid/os/Parcel;)V
-PLandroid/net/metrics/IpManagerEvent;-><init>(Landroid/os/Parcel;Landroid/net/metrics/IpManagerEvent$1;)V
+HPLandroid/net/metrics/IpManagerEvent;-><init>(Landroid/os/Parcel;Landroid/net/metrics/IpManagerEvent$1;)V
 PLandroid/net/metrics/IpReachabilityEvent$1;->createFromParcel(Landroid/os/Parcel;)Landroid/net/metrics/IpReachabilityEvent;
 HPLandroid/net/metrics/IpReachabilityEvent$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HPLandroid/net/metrics/NetworkEvent$1;->createFromParcel(Landroid/os/Parcel;)Landroid/net/metrics/NetworkEvent;
@@ -17156,9 +15297,7 @@
 HPLandroid/net/metrics/NetworkMetrics;->addConnectResult(IILjava/lang/String;)V
 HPLandroid/net/metrics/NetworkMetrics;->addDnsResult(III)V
 HPLandroid/net/metrics/NetworkMetrics;->addTcpStatsResult(IIII)V
-HPLandroid/net/metrics/RaEvent$1;->createFromParcel(Landroid/os/Parcel;)Landroid/net/metrics/RaEvent;
-HPLandroid/net/metrics/RaEvent$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HPLandroid/net/metrics/RaEvent;-><init>(Landroid/os/Parcel;)V
+HPLandroid/net/metrics/NetworkMetrics;->getPendingStats()Landroid/net/metrics/NetworkMetrics$Summary;
 HPLandroid/net/metrics/ValidationProbeEvent$1;->createFromParcel(Landroid/os/Parcel;)Landroid/net/metrics/ValidationProbeEvent;
 HPLandroid/net/metrics/ValidationProbeEvent$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/net/metrics/ValidationProbeEvent$Decoder;-><clinit>()V
@@ -17167,8 +15306,6 @@
 HSPLandroid/net/metrics/ValidationProbeEvent;->getProbeName(I)Ljava/lang/String;
 HSPLandroid/net/netstats/provider/INetworkStatsProvider$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HSPLandroid/net/netstats/provider/INetworkStatsProvider$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HPLandroid/net/netstats/provider/INetworkStatsProvider$Stub$Proxy;->requestStatsUpdate(I)V
-HPLandroid/net/netstats/provider/INetworkStatsProvider$Stub$Proxy;->setAlert(J)V
 HSPLandroid/net/netstats/provider/INetworkStatsProvider$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/netstats/provider/INetworkStatsProvider;
 HSPLandroid/net/netstats/provider/INetworkStatsProviderCallback$Stub;-><init>()V
 HSPLandroid/net/netstats/provider/INetworkStatsProviderCallback$Stub;->asBinder()Landroid/os/IBinder;
@@ -17205,8 +15342,8 @@
 HSPLandroid/net/util/MultinetworkPolicyTracker;->start()V
 HSPLandroid/net/util/MultinetworkPolicyTracker;->updateAvoidBadWifi()Z
 HSPLandroid/net/util/MultinetworkPolicyTracker;->updateMeteredMultipathPreference()V
-PLandroid/net/util/NetUtils;->addressTypeMatches(Ljava/net/InetAddress;Ljava/net/InetAddress;)Z
-HPLandroid/net/util/NetUtils;->selectBestRoute(Ljava/util/Collection;Ljava/net/InetAddress;)Landroid/net/RouteInfo;
+HSPLandroid/net/util/NetUtils;->addressTypeMatches(Ljava/net/InetAddress;Ljava/net/InetAddress;)Z
+HSPLandroid/net/util/NetUtils;->selectBestRoute(Ljava/util/Collection;Ljava/net/InetAddress;)Landroid/net/RouteInfo;
 HSPLandroid/net/wifi/WifiNetworkScoreCache$CacheListener$1;->run()V
 HSPLandroid/net/wifi/WifiNetworkScoreCache$CacheListener;-><init>(Landroid/os/Handler;)V
 HSPLandroid/net/wifi/WifiNetworkScoreCache$CacheListener;->post(Ljava/util/List;)V
@@ -17217,128 +15354,20 @@
 HSPLandroid/net/wifi/WifiNetworkScoreCache;->getScoredNetwork(Landroid/net/NetworkKey;)Landroid/net/ScoredNetwork;
 HSPLandroid/net/wifi/WifiNetworkScoreCache;->registerListener(Landroid/net/wifi/WifiNetworkScoreCache$CacheListener;)V
 HSPLandroid/net/wifi/WifiNetworkScoreCache;->updateScores(Ljava/util/List;)V
-HSPLandroid/net/wifi/wificond/-$$Lambda$WifiCondManager$E-DcVUYhRrwhi7YiitOfpiDZVUI;-><init>(Landroid/net/wifi/wificond/WifiCondManager;)V
-HPLandroid/net/wifi/wificond/-$$Lambda$WifiCondManager$ScanEventHandler$rS5Re_WiaaxPxvx9bAC1Smf03j0;-><init>(Landroid/net/wifi/wificond/WifiCondManager$ScanEventHandler;)V
-HPLandroid/net/wifi/wificond/-$$Lambda$WifiCondManager$ScanEventHandler$rS5Re_WiaaxPxvx9bAC1Smf03j0;->run()V
-PLandroid/net/wifi/wificond/ChannelSettings$1;-><init>()V
-PLandroid/net/wifi/wificond/ChannelSettings;-><clinit>()V
-HPLandroid/net/wifi/wificond/ChannelSettings;-><init>()V
-HPLandroid/net/wifi/wificond/ChannelSettings;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/net/wifi/wificond/IClientInterface$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/net/wifi/wificond/IClientInterface$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/net/wifi/wificond/IClientInterface$Stub$Proxy;->getWifiScannerImpl()Landroid/net/wifi/wificond/IWifiScannerImpl;
-HPLandroid/net/wifi/wificond/IClientInterface$Stub$Proxy;->signalPoll()[I
-HSPLandroid/net/wifi/wificond/IClientInterface$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/wifi/wificond/IClientInterface;
-HSPLandroid/net/wifi/wificond/IPnoScanEvent$Stub;-><init>()V
-HSPLandroid/net/wifi/wificond/IPnoScanEvent$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/net/wifi/wificond/IScanEvent$Stub;-><init>()V
-HSPLandroid/net/wifi/wificond/IScanEvent$Stub;->asBinder()Landroid/os/IBinder;
-HPLandroid/net/wifi/wificond/IScanEvent$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/net/wifi/wificond/IWifiScannerImpl$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HPLandroid/net/wifi/wificond/IWifiScannerImpl$Stub$Proxy;->abortScan()V
-HSPLandroid/net/wifi/wificond/IWifiScannerImpl$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HPLandroid/net/wifi/wificond/IWifiScannerImpl$Stub$Proxy;->getScanResults()[Landroid/net/wifi/wificond/NativeScanResult;
-HPLandroid/net/wifi/wificond/IWifiScannerImpl$Stub$Proxy;->scan(Landroid/net/wifi/wificond/SingleScanSettings;)Z
-HSPLandroid/net/wifi/wificond/IWifiScannerImpl$Stub$Proxy;->subscribePnoScanEvents(Landroid/net/wifi/wificond/IPnoScanEvent;)V
-HSPLandroid/net/wifi/wificond/IWifiScannerImpl$Stub$Proxy;->subscribeScanEvents(Landroid/net/wifi/wificond/IScanEvent;)V
-HSPLandroid/net/wifi/wificond/IWifiScannerImpl$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/wifi/wificond/IWifiScannerImpl;
-HSPLandroid/net/wifi/wificond/IWificond$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/net/wifi/wificond/IWificond$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/net/wifi/wificond/IWificond$Stub$Proxy;->createClientInterface(Ljava/lang/String;)Landroid/net/wifi/wificond/IClientInterface;
-HSPLandroid/net/wifi/wificond/IWificond$Stub$Proxy;->getAvailable2gChannels()[I
-HSPLandroid/net/wifi/wificond/IWificond$Stub$Proxy;->getAvailable5gNonDFSChannels()[I
-HSPLandroid/net/wifi/wificond/IWificond$Stub$Proxy;->getAvailable6gChannels()[I
-HSPLandroid/net/wifi/wificond/IWificond$Stub$Proxy;->getAvailableDFSChannels()[I
-HSPLandroid/net/wifi/wificond/IWificond$Stub$Proxy;->tearDownInterfaces()V
-HSPLandroid/net/wifi/wificond/IWificond$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/wifi/wificond/IWificond;
-PLandroid/net/wifi/wificond/NativeScanResult$1;-><init>()V
-HPLandroid/net/wifi/wificond/NativeScanResult$1;->createFromParcel(Landroid/os/Parcel;)Landroid/net/wifi/wificond/NativeScanResult;
-HPLandroid/net/wifi/wificond/NativeScanResult$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HPLandroid/net/wifi/wificond/NativeScanResult$1;->newArray(I)[Landroid/net/wifi/wificond/NativeScanResult;
-HPLandroid/net/wifi/wificond/NativeScanResult$1;->newArray(I)[Ljava/lang/Object;
-PLandroid/net/wifi/wificond/NativeScanResult;-><clinit>()V
-HPLandroid/net/wifi/wificond/NativeScanResult;-><init>()V
-PLandroid/net/wifi/wificond/NativeScanResult;->getFrequencyMhz()I
-PLandroid/net/wifi/wificond/NativeScanResult;->getInformationElements()[B
-PLandroid/net/wifi/wificond/NativeScanResult;->getRadioChainInfos()Ljava/util/List;
-PLandroid/net/wifi/wificond/NativeScanResult;->getSignalMbm()I
-PLandroid/net/wifi/wificond/NativeScanResult;->getSsid()[B
-PLandroid/net/wifi/wificond/NativeScanResult;->getTsf()J
-PLandroid/net/wifi/wificond/RadioChainInfo$1;-><init>()V
-HPLandroid/net/wifi/wificond/RadioChainInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/net/wifi/wificond/RadioChainInfo;
-HPLandroid/net/wifi/wificond/RadioChainInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-PLandroid/net/wifi/wificond/RadioChainInfo;-><clinit>()V
-HPLandroid/net/wifi/wificond/RadioChainInfo;-><init>(II)V
-PLandroid/net/wifi/wificond/RadioChainInfo;->getChainId()I
-PLandroid/net/wifi/wificond/RadioChainInfo;->getLevelDbm()I
-PLandroid/net/wifi/wificond/SingleScanSettings$1;-><init>()V
-PLandroid/net/wifi/wificond/SingleScanSettings;-><clinit>()V
-PLandroid/net/wifi/wificond/SingleScanSettings;-><init>()V
-HPLandroid/net/wifi/wificond/SingleScanSettings;->isValidScanType(I)Z
-HPLandroid/net/wifi/wificond/SingleScanSettings;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/net/wifi/wificond/WifiCondManager$PnoScanEventHandler;-><init>(Landroid/net/wifi/wificond/WifiCondManager;Ljava/util/concurrent/Executor;Landroid/net/wifi/wificond/WifiCondManager$ScanEventCallback;)V
-HSPLandroid/net/wifi/wificond/WifiCondManager$ScanEventHandler;-><init>(Landroid/net/wifi/wificond/WifiCondManager;Ljava/util/concurrent/Executor;Landroid/net/wifi/wificond/WifiCondManager$ScanEventCallback;)V
-HPLandroid/net/wifi/wificond/WifiCondManager$ScanEventHandler;->OnScanResultReady()V
-HPLandroid/net/wifi/wificond/WifiCondManager$ScanEventHandler;->lambda$OnScanResultReady$0$WifiCondManager$ScanEventHandler()V
-HPLandroid/net/wifi/wificond/WifiCondManager$SignalPollResult;-><init>(IIII)V
-HSPLandroid/net/wifi/wificond/WifiCondManager;-><init>(Landroid/content/Context;)V
-PLandroid/net/wifi/wificond/WifiCondManager;->abortScan(Ljava/lang/String;)V
-HSPLandroid/net/wifi/wificond/WifiCondManager;->clearState()V
-HSPLandroid/net/wifi/wificond/WifiCondManager;->enableVerboseLogging(Z)V
-HPLandroid/net/wifi/wificond/WifiCondManager;->getClientInterface(Ljava/lang/String;)Landroid/net/wifi/wificond/IClientInterface;
-HPLandroid/net/wifi/wificond/WifiCondManager;->getScanResults(Ljava/lang/String;I)Ljava/util/List;
-HPLandroid/net/wifi/wificond/WifiCondManager;->getScanType(I)I
-HPLandroid/net/wifi/wificond/WifiCondManager;->getScannerImpl(Ljava/lang/String;)Landroid/net/wifi/wificond/IWifiScannerImpl;
-HPLandroid/net/wifi/wificond/WifiCondManager;->parseOemSecurityTypeElement(II[B)Landroid/net/wifi/wificond/WifiCondManager$OemSecurityType;
-HSPLandroid/net/wifi/wificond/WifiCondManager;->retrieveWificondAndRegisterForDeath()Z
-HSPLandroid/net/wifi/wificond/WifiCondManager;->setupInterfaceForClientMode(Ljava/lang/String;Ljava/util/concurrent/Executor;Landroid/net/wifi/wificond/WifiCondManager$ScanEventCallback;Landroid/net/wifi/wificond/WifiCondManager$ScanEventCallback;)Z
-HPLandroid/net/wifi/wificond/WifiCondManager;->signalPoll(Ljava/lang/String;)Landroid/net/wifi/wificond/WifiCondManager$SignalPollResult;
-HPLandroid/net/wifi/wificond/WifiCondManager;->startScan(Ljava/lang/String;ILjava/util/Set;Ljava/util/List;)Z
-HSPLandroid/net/wifi/wificond/WifiCondManager;->tearDownInterfaces()Z
-HSPLandroid/nfc/IAppCallback$Stub;-><init>()V
 HSPLandroid/nfc/INfcAdapter$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/nfc/INfcAdapter$Stub$Proxy;->deviceSupportsNfcSecure()Z
 HSPLandroid/nfc/INfcAdapter$Stub$Proxy;->getNfcCardEmulationInterface()Landroid/nfc/INfcCardEmulation;
 HSPLandroid/nfc/INfcAdapter$Stub$Proxy;->getNfcFCardEmulationInterface()Landroid/nfc/INfcFCardEmulation;
 HSPLandroid/nfc/INfcAdapter$Stub$Proxy;->getNfcTagInterface()Landroid/nfc/INfcTag;
-HSPLandroid/nfc/INfcAdapter$Stub$Proxy;->getState()I
 HSPLandroid/nfc/INfcAdapter$Stub;->asInterface(Landroid/os/IBinder;)Landroid/nfc/INfcAdapter;
-HSPLandroid/nfc/INfcCardEmulation$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/nfc/INfcCardEmulation$Stub;->asInterface(Landroid/os/IBinder;)Landroid/nfc/INfcCardEmulation;
-HSPLandroid/nfc/INfcFCardEmulation$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/nfc/INfcFCardEmulation$Stub;->asInterface(Landroid/os/IBinder;)Landroid/nfc/INfcFCardEmulation;
-HSPLandroid/nfc/INfcTag$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/nfc/INfcTag$Stub;->asInterface(Landroid/os/IBinder;)Landroid/nfc/INfcTag;
-HSPLandroid/nfc/NfcActivityManager;-><init>(Landroid/nfc/NfcAdapter;)V
-HSPLandroid/nfc/NfcAdapter$1;-><init>(Landroid/nfc/NfcAdapter;)V
 HSPLandroid/nfc/NfcAdapter;-><init>(Landroid/content/Context;)V
-HSPLandroid/nfc/NfcAdapter;->getCardEmulationService()Landroid/nfc/INfcCardEmulation;
-HSPLandroid/nfc/NfcAdapter;->getContext()Landroid/content/Context;
 HSPLandroid/nfc/NfcAdapter;->getDefaultAdapter(Landroid/content/Context;)Landroid/nfc/NfcAdapter;
 HSPLandroid/nfc/NfcAdapter;->getNfcAdapter(Landroid/content/Context;)Landroid/nfc/NfcAdapter;
 HSPLandroid/nfc/NfcAdapter;->getServiceInterface()Landroid/nfc/INfcAdapter;
 HSPLandroid/nfc/NfcAdapter;->hasBeamFeature()Z
 HSPLandroid/nfc/NfcAdapter;->hasNfcFeature()Z
 HSPLandroid/nfc/NfcAdapter;->hasNfcHceFeature()Z
-HSPLandroid/nfc/NfcAdapter;->isEnabled()Z
-HSPLandroid/nfc/NfcAdapter;->isSecureNfcSupported()Z
 HSPLandroid/nfc/NfcManager;-><init>(Landroid/content/Context;)V
 HSPLandroid/nfc/NfcManager;->getDefaultAdapter()Landroid/nfc/NfcAdapter;
-HSPLandroid/nfc/cardemulation/AidGroup$1;-><init>()V
-HSPLandroid/nfc/cardemulation/AidGroup$1;->createFromParcel(Landroid/os/Parcel;)Landroid/nfc/cardemulation/AidGroup;
-HSPLandroid/nfc/cardemulation/AidGroup$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/nfc/cardemulation/AidGroup;-><clinit>()V
-HSPLandroid/nfc/cardemulation/AidGroup;-><init>(Ljava/util/List;Ljava/lang/String;)V
-HSPLandroid/nfc/cardemulation/AidGroup;->getAids()Ljava/util/List;
-HSPLandroid/nfc/cardemulation/AidGroup;->isValidCategory(Ljava/lang/String;)Z
-HSPLandroid/nfc/cardemulation/AidGroup;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/nfc/cardemulation/CardEmulation;-><clinit>()V
-HSPLandroid/nfc/cardemulation/CardEmulation;-><init>(Landroid/content/Context;Landroid/nfc/INfcCardEmulation;)V
-HSPLandroid/nfc/cardemulation/CardEmulation;->getInstance(Landroid/nfc/NfcAdapter;)Landroid/nfc/cardemulation/CardEmulation;
-HSPLandroid/nfc/cardemulation/CardEmulation;->isValidAid(Ljava/lang/String;)Z
-HSPLandroid/nfc/cardemulation/HostApduService$MsgHandler;-><init>(Landroid/nfc/cardemulation/HostApduService;)V
-HSPLandroid/nfc/cardemulation/HostApduService;-><init>()V
-HSPLandroid/nfc/cardemulation/HostApduService;->onBind(Landroid/content/Intent;)Landroid/os/IBinder;
 HSPLandroid/opengl/EGL14;->eglCreateWindowSurface(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLConfig;Ljava/lang/Object;[II)Landroid/opengl/EGLSurface;
 HSPLandroid/opengl/EGLConfig;-><init>(J)V
 HSPLandroid/opengl/EGLContext;-><init>(J)V
@@ -17369,7 +15398,6 @@
 HSPLandroid/opengl/GLSurfaceView;->setRenderer(Landroid/opengl/GLSurfaceView$Renderer;)V
 HSPLandroid/opengl/GLUtils;->texImage2D(IILandroid/graphics/Bitmap;I)V
 HSPLandroid/opengl/Matrix;->setIdentityM([FI)V
-HSPLandroid/opengl/Matrix;->translateM([FIFFF)V
 HSPLandroid/os/-$$Lambda$Build$WrC6eL7oW2Zm9UDTcXXKr0DnOMw;->apply(Ljava/lang/Object;)Ljava/lang/Object;
 HSPLandroid/os/-$$Lambda$PowerManager$1$-RL9hKNKSaGL1mmR-EjQ-Cm9KuA;-><init>(Landroid/os/PowerManager$OnThermalStatusChangedListener;I)V
 HSPLandroid/os/-$$Lambda$PowerManager$1$-RL9hKNKSaGL1mmR-EjQ-Cm9KuA;->run()V
@@ -17380,7 +15408,6 @@
 HSPLandroid/os/-$$Lambda$StrictMode$yZJXPvy2veRNA-xL_SWdXzX_OLg;-><init>(ILandroid/os/StrictMode$ViolationInfo;)V
 HSPLandroid/os/-$$Lambda$StrictMode$yZJXPvy2veRNA-xL_SWdXzX_OLg;->run()V
 HSPLandroid/os/-$$Lambda$ThreadLocalWorkSource$IP9vRFCDG5YwbWbXAEGHH52B9IE;->get()Ljava/lang/Object;
-HPLandroid/os/AppZygote;-><init>(Landroid/content/pm/ApplicationInfo;III)V
 HPLandroid/os/AppZygote;->connectToZygoteIfNeededLocked()V
 HPLandroid/os/AppZygote;->getAppInfo()Landroid/content/pm/ApplicationInfo;
 HPLandroid/os/AppZygote;->getProcess()Landroid/os/ChildZygoteProcess;
@@ -17401,7 +15428,6 @@
 HSPLandroid/os/AsyncTask$WorkerRunnable;-><init>()V
 HSPLandroid/os/AsyncTask$WorkerRunnable;-><init>(Landroid/os/AsyncTask$1;)V
 HSPLandroid/os/AsyncTask;-><init>()V
-HSPLandroid/os/AsyncTask;-><init>(Landroid/os/Handler;)V
 HSPLandroid/os/AsyncTask;-><init>(Landroid/os/Looper;)V
 HSPLandroid/os/AsyncTask;->access$500(Landroid/os/AsyncTask;)Ljava/util/concurrent/atomic/AtomicBoolean;
 HSPLandroid/os/AsyncTask;->access$700(Landroid/os/AsyncTask;Ljava/lang/Object;)Ljava/lang/Object;
@@ -17435,13 +15461,10 @@
 HSPLandroid/os/BaseBundle;->get(Ljava/lang/String;)Ljava/lang/Object;
 HSPLandroid/os/BaseBundle;->getBoolean(Ljava/lang/String;)Z
 HSPLandroid/os/BaseBundle;->getBoolean(Ljava/lang/String;Z)Z
-HSPLandroid/os/BaseBundle;->getBooleanArray(Ljava/lang/String;)[Z
 HSPLandroid/os/BaseBundle;->getByteArray(Ljava/lang/String;)[B
 HSPLandroid/os/BaseBundle;->getCharSequence(Ljava/lang/String;)Ljava/lang/CharSequence;
 HSPLandroid/os/BaseBundle;->getCharSequenceArray(Ljava/lang/String;)[Ljava/lang/CharSequence;
 HSPLandroid/os/BaseBundle;->getCharSequenceArrayList(Ljava/lang/String;)Ljava/util/ArrayList;
-HSPLandroid/os/BaseBundle;->getDouble(Ljava/lang/String;)D
-HSPLandroid/os/BaseBundle;->getDouble(Ljava/lang/String;D)D
 HSPLandroid/os/BaseBundle;->getFloat(Ljava/lang/String;)F
 HSPLandroid/os/BaseBundle;->getFloat(Ljava/lang/String;F)F
 HSPLandroid/os/BaseBundle;->getFloatArray(Ljava/lang/String;)[F
@@ -17451,7 +15474,6 @@
 HSPLandroid/os/BaseBundle;->getIntegerArrayList(Ljava/lang/String;)Ljava/util/ArrayList;
 HSPLandroid/os/BaseBundle;->getLong(Ljava/lang/String;)J
 HSPLandroid/os/BaseBundle;->getLong(Ljava/lang/String;J)J
-HSPLandroid/os/BaseBundle;->getLongArray(Ljava/lang/String;)[J
 HSPLandroid/os/BaseBundle;->getMap()Landroid/util/ArrayMap;
 HSPLandroid/os/BaseBundle;->getSerializable(Ljava/lang/String;)Ljava/io/Serializable;
 HSPLandroid/os/BaseBundle;->getString(Ljava/lang/String;)Ljava/lang/String;
@@ -17468,11 +15490,9 @@
 HSPLandroid/os/BaseBundle;->putAll(Landroid/os/PersistableBundle;)V
 HSPLandroid/os/BaseBundle;->putAll(Landroid/util/ArrayMap;)V
 HSPLandroid/os/BaseBundle;->putBoolean(Ljava/lang/String;Z)V
-HSPLandroid/os/BaseBundle;->putBooleanArray(Ljava/lang/String;[Z)V
 HSPLandroid/os/BaseBundle;->putByteArray(Ljava/lang/String;[B)V
 HSPLandroid/os/BaseBundle;->putCharSequence(Ljava/lang/String;Ljava/lang/CharSequence;)V
 HSPLandroid/os/BaseBundle;->putCharSequenceArray(Ljava/lang/String;[Ljava/lang/CharSequence;)V
-HSPLandroid/os/BaseBundle;->putDouble(Ljava/lang/String;D)V
 HSPLandroid/os/BaseBundle;->putFloat(Ljava/lang/String;F)V
 HSPLandroid/os/BaseBundle;->putInt(Ljava/lang/String;I)V
 HSPLandroid/os/BaseBundle;->putIntArray(Ljava/lang/String;[I)V
@@ -17494,12 +15514,10 @@
 HSPLandroid/os/BaseBundle;->unparcel()V
 HSPLandroid/os/BaseBundle;->writeToParcelInner(Landroid/os/Parcel;I)V
 HSPLandroid/os/BatteryManager;-><init>(Landroid/content/Context;Lcom/android/internal/app/IBatteryStats;Landroid/os/IBatteryPropertiesRegistrar;)V
-HSPLandroid/os/BatteryManager;->getIntProperty(I)I
 HSPLandroid/os/BatteryManager;->isCharging()Z
 HSPLandroid/os/BatteryManager;->queryProperty(I)J
 HSPLandroid/os/BatteryManagerInternal;-><init>()V
 HSPLandroid/os/BatteryProperty;-><init>()V
-HSPLandroid/os/BatteryProperty;->getLong()J
 HSPLandroid/os/BatteryProperty;->readFromParcel(Landroid/os/Parcel;)V
 HPLandroid/os/BatteryProperty;->setLong(J)V
 HPLandroid/os/BatteryProperty;->writeToParcel(Landroid/os/Parcel;I)V
@@ -17531,9 +15549,11 @@
 HSPLandroid/os/BatteryStats$HistoryTag;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/os/BatteryStats$LevelStepTracker;-><init>(I)V
 HSPLandroid/os/BatteryStats$LevelStepTracker;->addLevelSteps(IJJ)V
+HSPLandroid/os/BatteryStats$LevelStepTracker;->appendHex(JILjava/lang/StringBuilder;)V
 HSPLandroid/os/BatteryStats$LevelStepTracker;->clearTime()V
 HSPLandroid/os/BatteryStats$LevelStepTracker;->computeTimePerLevel()J
 HSPLandroid/os/BatteryStats$LevelStepTracker;->decodeEntryAt(ILjava/lang/String;)V
+HSPLandroid/os/BatteryStats$LevelStepTracker;->encodeEntryAt(ILjava/lang/StringBuilder;)V
 HPLandroid/os/BatteryStats$LevelStepTracker;->getDurationAt(I)J
 HPLandroid/os/BatteryStats$LevelStepTracker;->getInitModeAt(I)I
 HPLandroid/os/BatteryStats$LevelStepTracker;->getLevelAt(I)I
@@ -17548,12 +15568,9 @@
 HPLandroid/os/BatteryStats$Timer;->getCurrentDurationMsLocked(J)J
 HPLandroid/os/BatteryStats$Timer;->getMaxDurationMsLocked(J)J
 HPLandroid/os/BatteryStats$Timer;->getTotalDurationMsLocked(J)J
-HSPLandroid/os/BatteryStats$Uid$Pkg$Serv;-><init>()V
-HSPLandroid/os/BatteryStats$Uid$Pkg;-><init>()V
 HSPLandroid/os/BatteryStats$Uid$Proc$ExcessivePower;-><init>()V
 HSPLandroid/os/BatteryStats$Uid$Proc;-><init>()V
 HSPLandroid/os/BatteryStats$Uid$Sensor;-><init>()V
-HSPLandroid/os/BatteryStats$Uid$Wakelock;-><init>()V
 HSPLandroid/os/BatteryStats$Uid;-><init>()V
 HSPLandroid/os/BatteryStats;-><init>()V
 HPLandroid/os/BatteryStats;->controllerActivityHasData(Landroid/os/BatteryStats$ControllerActivityCounter;I)Z
@@ -17570,6 +15587,12 @@
 HPLandroid/os/BatteryStats;->printWakeLockCheckin(Ljava/lang/StringBuilder;Landroid/os/BatteryStats$Timer;JLjava/lang/String;ILjava/lang/String;)Ljava/lang/String;
 HSPLandroid/os/BatteryStatsManager;-><init>(Lcom/android/internal/app/IBatteryStats;)V
 PLandroid/os/BatteryStatsManager;->getWifiBatteryStats()Landroid/os/connectivity/WifiBatteryStats;
+HSPLandroid/os/BatteryStatsManager;->reportWifiOn()V
+HPLandroid/os/BatteryStatsManager;->reportWifiRssiChanged(I)V
+HPLandroid/os/BatteryStatsManager;->reportWifiScanStartedFromSource(Landroid/os/WorkSource;)V
+HPLandroid/os/BatteryStatsManager;->reportWifiScanStoppedFromSource(Landroid/os/WorkSource;)V
+HPLandroid/os/BatteryStatsManager;->reportWifiState(ILjava/lang/String;)V
+HPLandroid/os/BatteryStatsManager;->reportWifiSupplicantStateChanged(IZ)V
 HSPLandroid/os/BestClock;-><init>(Ljava/time/ZoneId;[Ljava/time/Clock;)V
 HSPLandroid/os/BestClock;->millis()J
 HSPLandroid/os/Binder$PropagateWorkSourceTransactListener;-><init>()V
@@ -17617,14 +15640,11 @@
 HSPLandroid/os/BinderProxy;->transact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/os/Build;->ensureFingerprintProperty()V
 HSPLandroid/os/Build;->getRadioVersion()Ljava/lang/String;
-HSPLandroid/os/Build;->getSerial()Ljava/lang/String;
 HSPLandroid/os/Build;->isBuildConsistent()Z
 HSPLandroid/os/Build;->joinListOrElse(Ljava/util/List;Ljava/lang/String;)Ljava/lang/String;
 HSPLandroid/os/Build;->lambda$joinListOrElse$0(Ljava/lang/Object;)Ljava/lang/String;
 HSPLandroid/os/Bundle$1;->createFromParcel(Landroid/os/Parcel;)Landroid/os/Bundle;
 HSPLandroid/os/Bundle$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/os/Bundle$1;->newArray(I)[Landroid/os/Bundle;
-HSPLandroid/os/Bundle$1;->newArray(I)[Ljava/lang/Object;
 HSPLandroid/os/Bundle;-><init>()V
 HSPLandroid/os/Bundle;-><init>(I)V
 HSPLandroid/os/Bundle;-><init>(Landroid/os/Bundle;)V
@@ -17664,7 +15684,6 @@
 HSPLandroid/os/Bundle;->putParcelable(Ljava/lang/String;Landroid/os/Parcelable;)V
 HSPLandroid/os/Bundle;->putParcelableArray(Ljava/lang/String;[Landroid/os/Parcelable;)V
 HSPLandroid/os/Bundle;->putParcelableArrayList(Ljava/lang/String;Ljava/util/ArrayList;)V
-HSPLandroid/os/Bundle;->putParcelableList(Ljava/lang/String;Ljava/util/List;)V
 HSPLandroid/os/Bundle;->putSerializable(Ljava/lang/String;Ljava/io/Serializable;)V
 HSPLandroid/os/Bundle;->putSparseParcelableArray(Ljava/lang/String;Landroid/util/SparseArray;)V
 HSPLandroid/os/Bundle;->putStringArrayList(Ljava/lang/String;Ljava/util/ArrayList;)V
@@ -17697,14 +15716,8 @@
 HSPLandroid/os/ConditionVariable;->block(J)Z
 HSPLandroid/os/ConditionVariable;->close()V
 HSPLandroid/os/ConditionVariable;->open()V
-PLandroid/os/CoolingDevice$1;-><init>()V
-PLandroid/os/CoolingDevice;-><clinit>()V
-HPLandroid/os/CoolingDevice;-><init>(JILjava/lang/String;)V
-HPLandroid/os/CoolingDevice;->getName()Ljava/lang/String;
-HPLandroid/os/CoolingDevice;->getType()I
-HPLandroid/os/CoolingDevice;->getValue()J
-HPLandroid/os/CoolingDevice;->isValidType(I)Z
 HSPLandroid/os/DeadObjectException;-><init>()V
+HSPLandroid/os/DeadObjectException;-><init>(Ljava/lang/String;)V
 HSPLandroid/os/Debug$MemoryInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/os/Debug$MemoryInfo;
 HSPLandroid/os/Debug$MemoryInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/os/Debug$MemoryInfo$1;->newArray(I)[Landroid/os/Debug$MemoryInfo;
@@ -17755,17 +15768,14 @@
 HPLandroid/os/Debug$MemoryInfo;->set(Landroid/os/Debug$MemoryInfo;)V
 HPLandroid/os/Debug$MemoryInfo;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/os/Debug;->countInstancesOfClass(Ljava/lang/Class;)J
-HSPLandroid/os/Debug;->dumpService(Ljava/lang/String;Ljava/io/FileDescriptor;[Ljava/lang/String;)Z
 HSPLandroid/os/Debug;->getCaller([Ljava/lang/StackTraceElement;I)Ljava/lang/String;
 HSPLandroid/os/Debug;->getCallers(I)Ljava/lang/String;
 HSPLandroid/os/Debug;->getMethodTracingMode()I
 HSPLandroid/os/Debug;->getVmFeatureList()[Ljava/lang/String;
 HSPLandroid/os/Debug;->isDebuggerConnected()Z
-HSPLandroid/os/Debug;->threadCpuTimeNanos()J
 HSPLandroid/os/Debug;->waitingForDebugger()Z
 HSPLandroid/os/DeviceIdleManager;-><init>(Landroid/content/Context;Landroid/os/IDeviceIdleController;)V
 HSPLandroid/os/DeviceIdleManager;->getService()Landroid/os/IDeviceIdleController;
-HSPLandroid/os/DeviceIdleManager;->isApplicationWhitelisted(Ljava/lang/String;)Z
 HSPLandroid/os/DropBoxManager$Entry$1;->createFromParcel(Landroid/os/Parcel;)Landroid/os/DropBoxManager$Entry;
 HSPLandroid/os/DropBoxManager$Entry$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HPLandroid/os/DropBoxManager$Entry;-><init>(Ljava/lang/String;J)V
@@ -17777,12 +15787,10 @@
 HSPLandroid/os/DropBoxManager$Entry;->getFlags()I
 HSPLandroid/os/DropBoxManager$Entry;->getInputStream()Ljava/io/InputStream;
 HSPLandroid/os/DropBoxManager$Entry;->getTag()Ljava/lang/String;
-HSPLandroid/os/DropBoxManager$Entry;->getTimeMillis()J
 HSPLandroid/os/DropBoxManager$Entry;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/os/DropBoxManager;-><init>(Landroid/content/Context;Lcom/android/internal/os/IDropBoxManagerService;)V
 HSPLandroid/os/DropBoxManager;->addFile(Ljava/lang/String;Ljava/io/File;I)V
 HSPLandroid/os/DropBoxManager;->addText(Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/os/DropBoxManager;->getNextEntry(Ljava/lang/String;J)Landroid/os/DropBoxManager$Entry;
 HSPLandroid/os/DropBoxManager;->isTagEnabled(Ljava/lang/String;)Z
 HSPLandroid/os/Environment$UserEnvironment;-><init>(I)V
 HSPLandroid/os/Environment$UserEnvironment;->buildExternalStorageAppCacheDirs(Ljava/lang/String;)[Ljava/io/File;
@@ -17799,6 +15807,7 @@
 HSPLandroid/os/Environment;->getDataDirectory()Ljava/io/File;
 HSPLandroid/os/Environment;->getDataDirectory(Ljava/lang/String;)Ljava/io/File;
 HSPLandroid/os/Environment;->getDataMiscCeDirectory()Ljava/io/File;
+HSPLandroid/os/Environment;->getDataMiscDeDirectory(I)Ljava/io/File;
 HSPLandroid/os/Environment;->getDataProfilesDeDirectory(I)Ljava/io/File;
 HSPLandroid/os/Environment;->getDataProfilesDePackageDirectory(ILjava/lang/String;)Ljava/io/File;
 HSPLandroid/os/Environment;->getDataSystemCeDirectory()Ljava/io/File;
@@ -17812,6 +15821,7 @@
 HSPLandroid/os/Environment;->getDataUserDeDirectory(Ljava/lang/String;)Ljava/io/File;
 HSPLandroid/os/Environment;->getDataUserDeDirectory(Ljava/lang/String;I)Ljava/io/File;
 HSPLandroid/os/Environment;->getDataUserDePackageDirectory(Ljava/lang/String;ILjava/lang/String;)Ljava/io/File;
+HSPLandroid/os/Environment;->getDataVendorDeDirectory(I)Ljava/io/File;
 HSPLandroid/os/Environment;->getDownloadCacheDirectory()Ljava/io/File;
 HSPLandroid/os/Environment;->getExternalStorageDirectory()Ljava/io/File;
 HSPLandroid/os/Environment;->getExternalStoragePublicDirectory(Ljava/lang/String;)Ljava/io/File;
@@ -17840,7 +15850,7 @@
 HPLandroid/os/FactoryTest;->isLongPressOnPowerOffEnabled()Z
 HPLandroid/os/FileBridge;-><init>()V
 HPLandroid/os/FileBridge;->forceClose()V
-PLandroid/os/FileBridge;->isClosed()Z
+HPLandroid/os/FileBridge;->isClosed()Z
 HSPLandroid/os/FileObserver$ObserverThread;-><init>()V
 HSPLandroid/os/FileObserver$ObserverThread;->onEvent(IILjava/lang/String;)V
 HSPLandroid/os/FileObserver$ObserverThread;->run()V
@@ -17859,6 +15869,8 @@
 HSPLandroid/os/FileUtils;->closeQuietly(Ljava/lang/AutoCloseable;)V
 HSPLandroid/os/FileUtils;->contains(Ljava/io/File;Ljava/io/File;)Z
 HSPLandroid/os/FileUtils;->contains(Ljava/lang/String;Ljava/lang/String;)Z
+HSPLandroid/os/FileUtils;->copy(Ljava/io/InputStream;Ljava/io/OutputStream;)J
+HSPLandroid/os/FileUtils;->copy(Ljava/io/InputStream;Ljava/io/OutputStream;Landroid/os/CancellationSignal;Ljava/util/concurrent/Executor;Landroid/os/FileUtils$ProgressListener;)J
 HSPLandroid/os/FileUtils;->createDir(Ljava/io/File;)Z
 HSPLandroid/os/FileUtils;->createDir(Ljava/io/File;Ljava/lang/String;)Ljava/io/File;
 HSPLandroid/os/FileUtils;->deleteContents(Ljava/io/File;)Z
@@ -17867,8 +15879,6 @@
 HSPLandroid/os/FileUtils;->isValidExtFilename(Ljava/lang/String;)Z
 HSPLandroid/os/FileUtils;->isValidExtFilenameChar(C)Z
 HSPLandroid/os/FileUtils;->listFilesOrEmpty(Ljava/io/File;)[Ljava/io/File;
-HSPLandroid/os/FileUtils;->listFilesOrEmpty(Ljava/io/File;Ljava/io/FilenameFilter;)[Ljava/io/File;
-HSPLandroid/os/FileUtils;->listOrEmpty(Ljava/io/File;)[Ljava/lang/String;
 HSPLandroid/os/FileUtils;->newFileOrNull(Ljava/lang/String;)Ljava/io/File;
 HSPLandroid/os/FileUtils;->readTextFile(Ljava/io/File;ILjava/lang/String;)Ljava/lang/String;
 HPLandroid/os/FileUtils;->rewriteAfterRename(Ljava/io/File;Ljava/io/File;Ljava/io/File;)Ljava/io/File;
@@ -17974,7 +15984,6 @@
 HSPLandroid/os/HwBinder;-><init>()V
 HSPLandroid/os/HwBinder;->getService(Ljava/lang/String;Ljava/lang/String;)Landroid/os/IHwBinder;
 HSPLandroid/os/HwBlob;-><init>(I)V
-HPLandroid/os/HwBlob;->putHidlMemory(JLandroid/os/HidlMemory;)V
 HSPLandroid/os/HwBlob;->wrapArray([B)[Ljava/lang/Byte;
 HSPLandroid/os/HwBlob;->wrapArray([I)[Ljava/lang/Integer;
 HSPLandroid/os/HwParcel;-><init>()V
@@ -17987,7 +15996,6 @@
 HSPLandroid/os/HwParcel;->writeStringVector(Ljava/util/ArrayList;)V
 HSPLandroid/os/HwRemoteBinder;-><init>()V
 HSPLandroid/os/HwRemoteBinder;->queryLocalInterface(Ljava/lang/String;)Landroid/os/IHwInterface;
-HSPLandroid/os/IBatteryPropertiesRegistrar$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HSPLandroid/os/IBatteryPropertiesRegistrar$Stub$Proxy;->getProperty(ILandroid/os/BatteryProperty;)I
 HSPLandroid/os/IBatteryPropertiesRegistrar$Stub;-><init>()V
 HSPLandroid/os/IBatteryPropertiesRegistrar$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/IBatteryPropertiesRegistrar;
@@ -17998,29 +16006,22 @@
 HSPLandroid/os/ICancellationSignal$Stub$Proxy;->asBinder()Landroid/os/IBinder;
 HSPLandroid/os/ICancellationSignal$Stub$Proxy;->cancel()V
 HSPLandroid/os/ICancellationSignal$Stub;-><init>()V
-HSPLandroid/os/ICancellationSignal$Stub;->asBinder()Landroid/os/IBinder;
 HSPLandroid/os/ICancellationSignal$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/ICancellationSignal;
-HSPLandroid/os/ICancellationSignal$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/os/IDeviceIdentifiersPolicyService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/os/IDeviceIdentifiersPolicyService$Stub$Proxy;->getSerialForPackage(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
 HSPLandroid/os/IDeviceIdentifiersPolicyService$Stub;-><init>()V
 HSPLandroid/os/IDeviceIdentifiersPolicyService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/IDeviceIdentifiersPolicyService;
 HPLandroid/os/IDeviceIdentifiersPolicyService$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/os/IDeviceIdleController$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/os/IDeviceIdleController$Stub$Proxy;->addPowerSaveTempWhitelistApp(Ljava/lang/String;JILjava/lang/String;)V
-HSPLandroid/os/IDeviceIdleController$Stub$Proxy;->isPowerSaveWhitelistApp(Ljava/lang/String;)Z
 HSPLandroid/os/IDeviceIdleController$Stub;-><init>()V
 HSPLandroid/os/IDeviceIdleController$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/IDeviceIdleController;
 HPLandroid/os/IDeviceIdleController$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/os/IDumpstate$Stub;-><init>()V
-HPLandroid/os/IDumpstate$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/os/IExternalVibratorService$Stub;-><init>()V
-HPLandroid/os/IExternalVibratorService$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/os/IHardwarePropertiesManager$Stub;-><init>()V
 HPLandroid/os/IHardwarePropertiesManager$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/os/IIncidentCompanion$Stub;-><init>()V
 HPLandroid/os/IIncidentCompanion$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/os/IIncidentManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+HPLandroid/os/IIncidentManager$Stub$Proxy;->getIncidentReport(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Landroid/os/IncidentManager$IncidentReport;
+HPLandroid/os/IIncidentManager$Stub$Proxy;->getIncidentReportList(Ljava/lang/String;Ljava/lang/String;)Ljava/util/List;
 HSPLandroid/os/IIncidentManager$Stub$Proxy;->systemRunning()V
 HSPLandroid/os/IIncidentManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/IIncidentManager;
 HSPLandroid/os/IInstalld$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
@@ -18052,15 +16053,10 @@
 HSPLandroid/os/IMessenger$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/IMessenger;
 HSPLandroid/os/IMessenger$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 PLandroid/os/INetworkActivityListener$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-PLandroid/os/INetworkActivityListener$Stub$Proxy;->asBinder()Landroid/os/IBinder;
+HPLandroid/os/INetworkActivityListener$Stub$Proxy;->asBinder()Landroid/os/IBinder;
 HPLandroid/os/INetworkActivityListener$Stub$Proxy;->onNetworkActive()V
-HSPLandroid/os/INetworkActivityListener$Stub;-><init>()V
-HSPLandroid/os/INetworkActivityListener$Stub;->asBinder()Landroid/os/IBinder;
 PLandroid/os/INetworkActivityListener$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/INetworkActivityListener;
-HSPLandroid/os/INetworkActivityListener$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/os/INetworkManagementService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/os/INetworkManagementService$Stub$Proxy;->isNetworkActive()Z
-HSPLandroid/os/INetworkManagementService$Stub$Proxy;->registerNetworkActivityListener(Landroid/os/INetworkActivityListener;)V
 HSPLandroid/os/INetworkManagementService$Stub$Proxy;->setUidCleartextNetworkPolicy(II)V
 HSPLandroid/os/INetworkManagementService$Stub;-><init>()V
 HSPLandroid/os/INetworkManagementService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/INetworkManagementService;
@@ -18072,15 +16068,14 @@
 HSPLandroid/os/IPowerManager$Stub$Proxy;->getPowerSaveState(I)Landroid/os/PowerSaveState;
 HSPLandroid/os/IPowerManager$Stub$Proxy;->isDeviceIdleMode()Z
 HSPLandroid/os/IPowerManager$Stub$Proxy;->isInteractive()Z
-HSPLandroid/os/IPowerManager$Stub$Proxy;->isLightDeviceIdleMode()Z
 HSPLandroid/os/IPowerManager$Stub$Proxy;->isPowerSaveMode()Z
 HSPLandroid/os/IPowerManager$Stub$Proxy;->releaseWakeLock(Landroid/os/IBinder;I)V
 HSPLandroid/os/IPowerManager$Stub$Proxy;->setDozeAfterScreenOff(Z)V
-HSPLandroid/os/IPowerManager$Stub$Proxy;->updateWakeLockWorkSource(Landroid/os/IBinder;Landroid/os/WorkSource;Ljava/lang/String;)V
 HSPLandroid/os/IPowerManager$Stub$Proxy;->userActivity(JII)V
 HSPLandroid/os/IPowerManager$Stub$Proxy;->wakeUp(JILjava/lang/String;Ljava/lang/String;)V
 HSPLandroid/os/IPowerManager$Stub;-><init>()V
 HSPLandroid/os/IPowerManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/IPowerManager;
+HPLandroid/os/IPowerManager$Stub;->getDefaultTransactionName(I)Ljava/lang/String;
 HSPLandroid/os/IPowerManager$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/os/IProcessInfoService$Stub;-><init>()V
 HPLandroid/os/IProcessInfoService$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
@@ -18088,10 +16083,6 @@
 HSPLandroid/os/IProgressListener$Stub;->asBinder()Landroid/os/IBinder;
 HSPLandroid/os/IPullAtomCallback$Stub;-><init>()V
 HSPLandroid/os/IPullAtomCallback$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/os/IPullAtomCallback$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/os/IPullAtomResultReceiver$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/os/IPullAtomResultReceiver$Stub$Proxy;->pullFinished(IZ[Landroid/util/StatsEventParcel;)V
-HSPLandroid/os/IPullAtomResultReceiver$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/IPullAtomResultReceiver;
 HSPLandroid/os/IRecoverySystem$Stub;-><init>()V
 HPLandroid/os/IRecoverySystem$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/os/IRemoteCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
@@ -18115,10 +16106,8 @@
 PLandroid/os/IStoraged$Stub$Proxy;->onUserStarted(I)V
 HSPLandroid/os/IStoraged$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/IStoraged;
 HSPLandroid/os/ISystemConfig$Stub;-><init>()V
-HSPLandroid/os/ISystemUpdateManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/os/ISystemUpdateManager$Stub$Proxy;->retrieveSystemUpdateInfo()Landroid/os/Bundle;
+HPLandroid/os/ISystemConfig$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/os/ISystemUpdateManager$Stub;-><init>()V
-HSPLandroid/os/ISystemUpdateManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/ISystemUpdateManager;
 HPLandroid/os/ISystemUpdateManager$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 PLandroid/os/IThermalEventListener$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 PLandroid/os/IThermalEventListener$Stub$Proxy;->asBinder()Landroid/os/IBinder;
@@ -18136,7 +16125,6 @@
 HSPLandroid/os/IThermalStatusListener$Stub;-><init>()V
 HSPLandroid/os/IThermalStatusListener$Stub;->asBinder()Landroid/os/IBinder;
 HSPLandroid/os/IUpdateLock$Stub;-><init>()V
-HPLandroid/os/IUpdateLock$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/os/IUserManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HSPLandroid/os/IUserManager$Stub$Proxy;->getApplicationRestrictions(Ljava/lang/String;)Landroid/os/Bundle;
 HSPLandroid/os/IUserManager$Stub$Proxy;->getProfileIds(IZ)[I
@@ -18144,13 +16132,10 @@
 HSPLandroid/os/IUserManager$Stub$Proxy;->getProfiles(IZ)Ljava/util/List;
 HSPLandroid/os/IUserManager$Stub$Proxy;->getUserAccount(I)Ljava/lang/String;
 HSPLandroid/os/IUserManager$Stub$Proxy;->getUserBadgeColorResId(I)I
-HSPLandroid/os/IUserManager$Stub$Proxy;->getUserCreationTime(I)J
-HSPLandroid/os/IUserManager$Stub$Proxy;->getUserHandle(I)I
 HSPLandroid/os/IUserManager$Stub$Proxy;->getUserIcon(I)Landroid/os/ParcelFileDescriptor;
 HSPLandroid/os/IUserManager$Stub$Proxy;->getUserIconBadgeResId(I)I
 HSPLandroid/os/IUserManager$Stub$Proxy;->getUserInfo(I)Landroid/content/pm/UserInfo;
 HSPLandroid/os/IUserManager$Stub$Proxy;->getUserRestrictionSources(Ljava/lang/String;I)Ljava/util/List;
-HSPLandroid/os/IUserManager$Stub$Proxy;->getUserRestrictions(I)Landroid/os/Bundle;
 HSPLandroid/os/IUserManager$Stub$Proxy;->getUserSerialNumber(I)I
 HSPLandroid/os/IUserManager$Stub$Proxy;->getUsers(ZZZ)Ljava/util/List;
 HSPLandroid/os/IUserManager$Stub$Proxy;->hasBadge(I)Z
@@ -18159,11 +16144,11 @@
 HSPLandroid/os/IUserManager$Stub$Proxy;->isDemoUser(I)Z
 HSPLandroid/os/IUserManager$Stub$Proxy;->isManagedProfile(I)Z
 HSPLandroid/os/IUserManager$Stub$Proxy;->isProfile(I)Z
-HSPLandroid/os/IUserManager$Stub$Proxy;->isUserRunning(I)Z
 HSPLandroid/os/IUserManager$Stub$Proxy;->isUserUnlocked(I)Z
 HSPLandroid/os/IUserManager$Stub$Proxy;->isUserUnlockingOrUnlocked(I)Z
 HSPLandroid/os/IUserManager$Stub;-><init>()V
 HSPLandroid/os/IUserManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/IUserManager;
+HPLandroid/os/IUserManager$Stub;->getDefaultTransactionName(I)Ljava/lang/String;
 HSPLandroid/os/IUserManager$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/os/IUserRestrictionsListener$Stub;-><init>()V
 HSPLandroid/os/IVibratorService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
@@ -18190,9 +16175,10 @@
 HSPLandroid/os/IVold$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/IVold;
 HSPLandroid/os/IVoldListener$Stub;-><init>()V
 HSPLandroid/os/IVoldListener$Stub;->asBinder()Landroid/os/IBinder;
-PLandroid/os/IVoldListener$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
+HPLandroid/os/IVoldListener$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 PLandroid/os/IVoldMountCallback$Stub;-><init>()V
 PLandroid/os/IVoldMountCallback$Stub;->asBinder()Landroid/os/IBinder;
+HSPLandroid/os/IVoldTaskListener$Stub;-><init>()V
 HSPLandroid/os/IVoldTaskListener$Stub;->asBinder()Landroid/os/IBinder;
 HSPLandroid/os/IVoldTaskListener$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/os/IncidentManager$IncidentReport$1;-><init>()V
@@ -18200,6 +16186,7 @@
 HSPLandroid/os/IncidentManager$IncidentReport$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/os/IncidentManager$IncidentReport;-><clinit>()V
 HSPLandroid/os/IncidentManager$IncidentReport;-><init>(Landroid/os/Parcel;)V
+HPLandroid/os/IncidentManager$IncidentReport;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/os/LocaleList$1;->createFromParcel(Landroid/os/Parcel;)Landroid/os/LocaleList;
 HSPLandroid/os/LocaleList$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/os/LocaleList;-><init>(Ljava/util/Locale;Landroid/os/LocaleList;)V
@@ -18228,6 +16215,7 @@
 HSPLandroid/os/LocaleList;->toString()Ljava/lang/String;
 HSPLandroid/os/LocaleList;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/os/Looper;-><init>(Z)V
+HSPLandroid/os/Looper;->dump(Landroid/util/Printer;Ljava/lang/String;)V
 HSPLandroid/os/Looper;->getMainLooper()Landroid/os/Looper;
 HSPLandroid/os/Looper;->getQueue()Landroid/os/MessageQueue;
 HSPLandroid/os/Looper;->getThread()Ljava/lang/Thread;
@@ -18246,11 +16234,8 @@
 HSPLandroid/os/Looper;->showSlowLog(JJJLjava/lang/String;Landroid/os/Message;)Z
 HSPLandroid/os/Looper;->toString()Ljava/lang/String;
 HSPLandroid/os/MemoryFile;-><init>(Ljava/lang/String;I)V
-HSPLandroid/os/MemoryFile;->beginAccess()V
-HSPLandroid/os/MemoryFile;->checkActive()V
 HSPLandroid/os/MemoryFile;->close()V
 HSPLandroid/os/MemoryFile;->deactivate()V
-HSPLandroid/os/MemoryFile;->endAccess()V
 HSPLandroid/os/MemoryFile;->getFileDescriptor()Ljava/io/FileDescriptor;
 HSPLandroid/os/MemoryFile;->writeBytes([BIII)V
 HSPLandroid/os/Message$1;->createFromParcel(Landroid/os/Parcel;)Landroid/os/Message;
@@ -18293,6 +16278,7 @@
 HSPLandroid/os/MessageQueue;->addOnFileDescriptorEventListener(Ljava/io/FileDescriptor;ILandroid/os/MessageQueue$OnFileDescriptorEventListener;)V
 HSPLandroid/os/MessageQueue;->dispatchEvents(II)I
 HSPLandroid/os/MessageQueue;->dispose()V
+HSPLandroid/os/MessageQueue;->dump(Landroid/util/Printer;Ljava/lang/String;Landroid/os/Handler;)V
 HSPLandroid/os/MessageQueue;->enqueueMessage(Landroid/os/Message;J)Z
 HSPLandroid/os/MessageQueue;->finalize()V
 HSPLandroid/os/MessageQueue;->hasMessages(Landroid/os/Handler;ILjava/lang/Object;)Z
@@ -18337,9 +16323,7 @@
 HSPLandroid/os/Parcel;->access$000(Landroid/os/Parcel;)J
 HSPLandroid/os/Parcel;->adoptClassCookies(Landroid/os/Parcel;)V
 HSPLandroid/os/Parcel;->appendFrom(Landroid/os/Parcel;II)V
-HPLandroid/os/Parcel;->compareData(Landroid/os/Parcel;)I
 HSPLandroid/os/Parcel;->copyClassCookies()Ljava/util/Map;
-HSPLandroid/os/Parcel;->createBinderArrayList()Ljava/util/ArrayList;
 HSPLandroid/os/Parcel;->createBooleanArray()[Z
 HSPLandroid/os/Parcel;->createByteArray()[B
 HSPLandroid/os/Parcel;->createException(ILjava/lang/String;)Ljava/lang/Exception;
@@ -18377,7 +16361,6 @@
 HSPLandroid/os/Parcel;->readArraySet(Ljava/lang/ClassLoader;)Landroid/util/ArraySet;
 HSPLandroid/os/Parcel;->readBlob()[B
 HSPLandroid/os/Parcel;->readBoolean()Z
-HSPLandroid/os/Parcel;->readBooleanArray([Z)V
 HSPLandroid/os/Parcel;->readBundle()Landroid/os/Bundle;
 HSPLandroid/os/Parcel;->readBundle(Ljava/lang/ClassLoader;)Landroid/os/Bundle;
 HSPLandroid/os/Parcel;->readByte()B
@@ -18423,6 +16406,7 @@
 HSPLandroid/os/Parcel;->readTypedObject(Landroid/os/Parcelable$Creator;)Ljava/lang/Object;
 HSPLandroid/os/Parcel;->readValue(Ljava/lang/ClassLoader;)Ljava/lang/Object;
 HSPLandroid/os/Parcel;->recycle()V
+HSPLandroid/os/Parcel;->resetSqaushingState()V
 HSPLandroid/os/Parcel;->restoreAllowFds(Z)V
 HSPLandroid/os/Parcel;->setClassCookie(Ljava/lang/Class;Ljava/lang/Object;)V
 HSPLandroid/os/Parcel;->setDataCapacity(I)V
@@ -18448,7 +16432,6 @@
 HSPLandroid/os/Parcel;->writeCharSequenceArray([Ljava/lang/CharSequence;)V
 HSPLandroid/os/Parcel;->writeCharSequenceList(Ljava/util/ArrayList;)V
 HSPLandroid/os/Parcel;->writeDouble(D)V
-HSPLandroid/os/Parcel;->writeDoubleArray([D)V
 HSPLandroid/os/Parcel;->writeException(Ljava/lang/Exception;)V
 HSPLandroid/os/Parcel;->writeFileDescriptor(Ljava/io/FileDescriptor;)V
 HSPLandroid/os/Parcel;->writeFloat(F)V
@@ -18533,12 +16516,8 @@
 HSPLandroid/os/ParcelUuid;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/os/ParcelableException;-><init>(Ljava/lang/Throwable;)V
 HSPLandroid/os/ParcelableException;->maybeRethrow(Ljava/lang/Class;)V
-HSPLandroid/os/ParcelableParcel$1;->createFromParcel(Landroid/os/Parcel;)Landroid/os/ParcelableParcel;
-HSPLandroid/os/ParcelableParcel$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/os/ParcelableParcel;-><init>(Landroid/os/Parcel;Ljava/lang/ClassLoader;)V
-HSPLandroid/os/ParcelableParcel;-><init>(Ljava/lang/ClassLoader;)V
-HSPLandroid/os/ParcelableParcel;->getClassLoader()Ljava/lang/ClassLoader;
-HSPLandroid/os/ParcelableParcel;->getParcel()Landroid/os/Parcel;
+HSPLandroid/os/ParcelableException;->writeToParcel(Landroid/os/Parcel;I)V
+HSPLandroid/os/ParcelableException;->writeToParcel(Landroid/os/Parcel;Ljava/lang/Throwable;)V
 HSPLandroid/os/ParcelableParcel;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/os/PatternMatcher$1;->createFromParcel(Landroid/os/Parcel;)Landroid/os/PatternMatcher;
 HSPLandroid/os/PatternMatcher$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
@@ -18586,7 +16565,6 @@
 HSPLandroid/os/PowerManager$2;-><init>(Landroid/os/PowerManager;ILjava/lang/String;)V
 HSPLandroid/os/PowerManager$2;->recompute(Ljava/lang/Object;)Ljava/lang/Object;
 HSPLandroid/os/PowerManager$2;->recompute(Ljava/lang/Void;)Ljava/lang/Boolean;
-HPLandroid/os/PowerManager$WakeData;-><init>(JI)V
 HSPLandroid/os/PowerManager$WakeLock$1;-><init>(Landroid/os/PowerManager$WakeLock;)V
 HSPLandroid/os/PowerManager$WakeLock$1;->run()V
 HSPLandroid/os/PowerManager$WakeLock;-><init>(Landroid/os/PowerManager;ILjava/lang/String;Ljava/lang/String;)V
@@ -18606,8 +16584,8 @@
 HSPLandroid/os/PowerManager;-><init>(Landroid/content/Context;Landroid/os/IPowerManager;Landroid/os/IThermalService;Landroid/os/Handler;)V
 HSPLandroid/os/PowerManager;->addThermalStatusListener(Landroid/os/PowerManager$OnThermalStatusChangedListener;)V
 HSPLandroid/os/PowerManager;->addThermalStatusListener(Ljava/util/concurrent/Executor;Landroid/os/PowerManager$OnThermalStatusChangedListener;)V
+HSPLandroid/os/PowerManager;->getBrightnessConstraint(I)F
 HSPLandroid/os/PowerManager;->getDefaultScreenBrightnessSetting()I
-HSPLandroid/os/PowerManager;->getDeviceIdleManager()Landroid/os/DeviceIdleManager;
 HSPLandroid/os/PowerManager;->getLocationPowerSaveMode()I
 HSPLandroid/os/PowerManager;->getMaximumScreenBrightnessForVrSetting()I
 HSPLandroid/os/PowerManager;->getMaximumScreenBrightnessSetting()I
@@ -18616,7 +16594,6 @@
 HSPLandroid/os/PowerManager;->getPowerSaveState(I)Landroid/os/PowerSaveState;
 HPLandroid/os/PowerManager;->goToSleep(JII)V
 HSPLandroid/os/PowerManager;->isDeviceIdleMode()Z
-HSPLandroid/os/PowerManager;->isIgnoringBatteryOptimizations(Ljava/lang/String;)Z
 HSPLandroid/os/PowerManager;->isInteractive()Z
 HSPLandroid/os/PowerManager;->isLightDeviceIdleMode()Z
 HSPLandroid/os/PowerManager;->isPowerSaveMode()Z
@@ -18646,7 +16623,7 @@
 HSPLandroid/os/PowerSaveState;-><init>(Landroid/os/Parcel;)V
 HPLandroid/os/PowerSaveState;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/os/PowerWhitelistManager;-><init>(Landroid/content/Context;)V
-HSPLandroid/os/PowerWhitelistManager;->whitelistAppTemporarily(Ljava/lang/String;J)V
+HSPLandroid/os/PowerWhitelistManager;->isWhitelisted(Ljava/lang/String;Z)Z
 HSPLandroid/os/Process$ProcessStartResult;-><init>()V
 HSPLandroid/os/Process;->getStartElapsedRealtime()J
 HSPLandroid/os/Process;->getThreadGroupLeader(I)I
@@ -18657,13 +16634,11 @@
 HSPLandroid/os/Process;->isIsolated(I)Z
 HSPLandroid/os/Process;->isThreadInProcess(II)Z
 HSPLandroid/os/Process;->killProcess(I)V
-HSPLandroid/os/Process;->killProcessQuiet(I)V
 HSPLandroid/os/Process;->myPid()I
 HSPLandroid/os/Process;->myTid()I
 HSPLandroid/os/Process;->myUid()I
 HSPLandroid/os/Process;->myUserHandle()Landroid/os/UserHandle;
 HSPLandroid/os/Process;->setStartTimes(JJ)V
-HSPLandroid/os/Process;->start(Ljava/lang/String;Ljava/lang/String;II[IIIILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Z[JLjava/util/Map;[Ljava/lang/String;)Landroid/os/Process$ProcessStartResult;
 HPLandroid/os/Process;->startWebView(Ljava/lang/String;Ljava/lang/String;II[IIIILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[J[Ljava/lang/String;)Landroid/os/Process$ProcessStartResult;
 PLandroid/os/RecoverySystem;->handleAftermath(Landroid/content/Context;)Ljava/lang/String;
 HSPLandroid/os/RemoteCallback$1;-><init>(Landroid/os/RemoteCallback;)V
@@ -18842,6 +16817,7 @@
 HSPLandroid/os/StrictMode$VmPolicy$Builder;->detectContentUriWithoutPermission()Landroid/os/StrictMode$VmPolicy$Builder;
 HSPLandroid/os/StrictMode$VmPolicy$Builder;->detectCredentialProtectedWhileLocked()Landroid/os/StrictMode$VmPolicy$Builder;
 HSPLandroid/os/StrictMode$VmPolicy$Builder;->detectFileUriExposure()Landroid/os/StrictMode$VmPolicy$Builder;
+HSPLandroid/os/StrictMode$VmPolicy$Builder;->detectIncorrectContextUse()Landroid/os/StrictMode$VmPolicy$Builder;
 HSPLandroid/os/StrictMode$VmPolicy$Builder;->detectLeakedClosableObjects()Landroid/os/StrictMode$VmPolicy$Builder;
 HSPLandroid/os/StrictMode$VmPolicy$Builder;->detectLeakedRegistrationObjects()Landroid/os/StrictMode$VmPolicy$Builder;
 HSPLandroid/os/StrictMode$VmPolicy$Builder;->detectLeakedSqlLiteObjects()Landroid/os/StrictMode$VmPolicy$Builder;
@@ -18856,7 +16832,6 @@
 HSPLandroid/os/StrictMode$VmPolicy;-><init>(ILjava/util/HashMap;Landroid/os/StrictMode$OnVmViolationListener;Ljava/util/concurrent/Executor;Landroid/os/StrictMode$1;)V
 HSPLandroid/os/StrictMode;->access$100()Ljava/util/HashMap;
 HSPLandroid/os/StrictMode;->access$1000()Ljava/lang/ThreadLocal;
-HSPLandroid/os/StrictMode;->access$1100()Landroid/os/StrictMode$ViolationLogger;
 HSPLandroid/os/StrictMode;->access$1400(ILandroid/os/StrictMode$ViolationInfo;)V
 HSPLandroid/os/StrictMode;->access$1500()Ljava/lang/ThreadLocal;
 HSPLandroid/os/StrictMode;->access$1600()Ljava/lang/ThreadLocal;
@@ -18876,7 +16851,6 @@
 HSPLandroid/os/StrictMode;->enterCriticalSpan(Ljava/lang/String;)Landroid/os/StrictMode$Span;
 HSPLandroid/os/StrictMode;->getThreadPolicy()Landroid/os/StrictMode$ThreadPolicy;
 HSPLandroid/os/StrictMode;->getThreadPolicyMask()I
-HSPLandroid/os/StrictMode;->getVmPolicy()Landroid/os/StrictMode$VmPolicy;
 HSPLandroid/os/StrictMode;->handleApplicationStrictModeViolation(ILandroid/os/StrictMode$ViolationInfo;)V
 HSPLandroid/os/StrictMode;->hasGatheredViolations()Z
 HSPLandroid/os/StrictMode;->incrementExpectedActivityCount(Ljava/lang/Class;)V
@@ -18889,7 +16863,6 @@
 HSPLandroid/os/StrictMode;->noteSlowCall(Ljava/lang/String;)V
 HSPLandroid/os/StrictMode;->onBinderStrictModePolicyChange(I)V
 HSPLandroid/os/StrictMode;->onCredentialProtectedPathAccess(Ljava/lang/String;I)V
-HSPLandroid/os/StrictMode;->onUntaggedSocket()V
 HSPLandroid/os/StrictMode;->onVmPolicyViolation(Landroid/os/strictmode/Violation;)V
 HSPLandroid/os/StrictMode;->onVmPolicyViolation(Landroid/os/strictmode/Violation;Z)V
 HSPLandroid/os/StrictMode;->readAndHandleBinderCallViolations(Landroid/os/Parcel;)V
@@ -18937,8 +16910,6 @@
 HSPLandroid/os/SystemService;->access$100()Ljava/lang/Object;
 HPLandroid/os/SystemService;->getState(Ljava/lang/String;)Landroid/os/SystemService$State;
 PLandroid/os/SystemService;->isRunning(Ljava/lang/String;)Z
-HSPLandroid/os/SystemUpdateManager;-><init>(Landroid/os/ISystemUpdateManager;)V
-HSPLandroid/os/SystemUpdateManager;->retrieveSystemUpdateInfo()Landroid/os/Bundle;
 HSPLandroid/os/SystemVibrator;-><init>(Landroid/content/Context;)V
 HSPLandroid/os/SystemVibrator;->cancel()V
 HSPLandroid/os/SystemVibrator;->hasVibrator()Z
@@ -19026,7 +16997,6 @@
 HSPLandroid/os/UserHandle;->isApp(I)Z
 HSPLandroid/os/UserHandle;->isCore(I)Z
 HSPLandroid/os/UserHandle;->isIsolated(I)Z
-HSPLandroid/os/UserHandle;->isOwner()Z
 HSPLandroid/os/UserHandle;->isSameApp(II)Z
 HSPLandroid/os/UserHandle;->isSameUser(II)Z
 HSPLandroid/os/UserHandle;->isSystem()Z
@@ -19057,8 +17027,6 @@
 HSPLandroid/os/UserManager;->getSerialNumberForUser(Landroid/os/UserHandle;)J
 HSPLandroid/os/UserManager;->getUserAccount(I)Ljava/lang/String;
 HSPLandroid/os/UserManager;->getUserBadgeColor(I)I
-HSPLandroid/os/UserManager;->getUserCount()I
-HSPLandroid/os/UserManager;->getUserCreationTime(Landroid/os/UserHandle;)J
 HSPLandroid/os/UserManager;->getUserForSerialNumber(J)Landroid/os/UserHandle;
 HSPLandroid/os/UserManager;->getUserHandle()I
 HSPLandroid/os/UserManager;->getUserHandle(I)I
@@ -19068,7 +17036,6 @@
 HSPLandroid/os/UserManager;->getUserInfo(I)Landroid/content/pm/UserInfo;
 HSPLandroid/os/UserManager;->getUserProfiles()Ljava/util/List;
 HSPLandroid/os/UserManager;->getUserRestrictionSources(Ljava/lang/String;Landroid/os/UserHandle;)Ljava/util/List;
-HSPLandroid/os/UserManager;->getUserRestrictions()Landroid/os/Bundle;
 HSPLandroid/os/UserManager;->getUserRestrictions(Landroid/os/UserHandle;)Landroid/os/Bundle;
 HSPLandroid/os/UserManager;->getUserSerialNumber(I)I
 HSPLandroid/os/UserManager;->getUserSwitchability(Landroid/os/UserHandle;)I
@@ -19128,7 +17095,10 @@
 HSPLandroid/os/VibrationAttributes;->writeToParcel(Landroid/os/Parcel;I)V
 HPLandroid/os/VibrationEffect$1;->createFromParcel(Landroid/os/Parcel;)Landroid/os/VibrationEffect;
 PLandroid/os/VibrationEffect$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
+HSPLandroid/os/VibrationEffect$Composition$PrimitiveEffect$1;-><init>()V
+HSPLandroid/os/VibrationEffect$Composition$PrimitiveEffect;-><clinit>()V
 HSPLandroid/os/VibrationEffect$OneShot;-><init>(JI)V
+HSPLandroid/os/VibrationEffect$OneShot;->getDuration()J
 HSPLandroid/os/VibrationEffect$OneShot;->validate()V
 HSPLandroid/os/VibrationEffect$Prebaked;-><init>(IZ)V
 HPLandroid/os/VibrationEffect$Prebaked;-><init>(Landroid/os/Parcel;)V
@@ -19140,10 +17110,10 @@
 HSPLandroid/os/VibrationEffect$Prebaked;->validate()V
 HSPLandroid/os/VibrationEffect$Prebaked;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/os/VibrationEffect$Waveform;-><init>([J[II)V
-PLandroid/os/VibrationEffect$Waveform;->getAmplitudes()[I
+HPLandroid/os/VibrationEffect$Waveform;->getAmplitudes()[I
 HSPLandroid/os/VibrationEffect$Waveform;->getDuration()J
-PLandroid/os/VibrationEffect$Waveform;->getRepeatIndex()I
-PLandroid/os/VibrationEffect$Waveform;->getTimings()[J
+HPLandroid/os/VibrationEffect$Waveform;->getRepeatIndex()I
+HPLandroid/os/VibrationEffect$Waveform;->getTimings()[J
 HSPLandroid/os/VibrationEffect$Waveform;->hasNonZeroEntry([J)Z
 HPLandroid/os/VibrationEffect$Waveform;->resolve(I)Landroid/os/VibrationEffect$Waveform;
 HPLandroid/os/VibrationEffect$Waveform;->scale(FI)Landroid/os/VibrationEffect$Waveform;
@@ -19165,16 +17135,13 @@
 HSPLandroid/os/WorkSource$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HPLandroid/os/WorkSource$WorkChain$1;->createFromParcel(Landroid/os/Parcel;)Landroid/os/WorkSource$WorkChain;
 HPLandroid/os/WorkSource$WorkChain$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/os/WorkSource$WorkChain;-><init>()V
 HPLandroid/os/WorkSource$WorkChain;-><init>(Landroid/os/Parcel;)V
 HPLandroid/os/WorkSource$WorkChain;-><init>(Landroid/os/Parcel;Landroid/os/WorkSource$1;)V
 HSPLandroid/os/WorkSource$WorkChain;-><init>(Landroid/os/WorkSource$WorkChain;)V
-HSPLandroid/os/WorkSource$WorkChain;->addNode(ILjava/lang/String;)Landroid/os/WorkSource$WorkChain;
 HSPLandroid/os/WorkSource$WorkChain;->equals(Ljava/lang/Object;)Z
 PLandroid/os/WorkSource$WorkChain;->getAttributionUid()I
 HPLandroid/os/WorkSource$WorkChain;->getTags()[Ljava/lang/String;
 HPLandroid/os/WorkSource$WorkChain;->getUids()[I
-HSPLandroid/os/WorkSource$WorkChain;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/os/WorkSource;-><init>()V
 HSPLandroid/os/WorkSource;-><init>(I)V
 HSPLandroid/os/WorkSource;-><init>(ILjava/lang/String;)V
@@ -19186,22 +17153,17 @@
 HPLandroid/os/WorkSource;->addWork(Landroid/os/WorkSource;ILjava/lang/String;)Landroid/os/WorkSource;
 HPLandroid/os/WorkSource;->clearNames()V
 HSPLandroid/os/WorkSource;->compare(Landroid/os/WorkSource;II)I
-HSPLandroid/os/WorkSource;->createWorkChain()Landroid/os/WorkSource$WorkChain;
 HSPLandroid/os/WorkSource;->diff(Landroid/os/WorkSource;)Z
 HPLandroid/os/WorkSource;->diffChains(Landroid/os/WorkSource;Landroid/os/WorkSource;)[Ljava/util/ArrayList;
 HSPLandroid/os/WorkSource;->equals(Ljava/lang/Object;)Z
 HPLandroid/os/WorkSource;->getAttributionUid()I
-HSPLandroid/os/WorkSource;->getName(I)Ljava/lang/String;
 HSPLandroid/os/WorkSource;->getPackageName(I)Ljava/lang/String;
 HSPLandroid/os/WorkSource;->getUid(I)I
 HSPLandroid/os/WorkSource;->getWorkChains()Ljava/util/List;
-HSPLandroid/os/WorkSource;->hashCode()I
 HPLandroid/os/WorkSource;->insert(II)V
 HSPLandroid/os/WorkSource;->insert(IILjava/lang/String;)V
 HSPLandroid/os/WorkSource;->isChainedBatteryAttributionEnabled(Landroid/content/Context;)Z
 HSPLandroid/os/WorkSource;->isEmpty()Z
-HSPLandroid/os/WorkSource;->remove(Landroid/os/WorkSource;)Z
-HSPLandroid/os/WorkSource;->removeUidsAndNames(Landroid/os/WorkSource;)Z
 HPLandroid/os/WorkSource;->set(I)V
 HSPLandroid/os/WorkSource;->set(Landroid/os/WorkSource;)V
 HPLandroid/os/WorkSource;->setReturningDiffs(Landroid/os/WorkSource;)[Landroid/os/WorkSource;
@@ -19224,7 +17186,7 @@
 HSPLandroid/os/ZygoteProcess;->attemptZygoteSendArgsAndGetResult(Landroid/os/ZygoteProcess$ZygoteState;Ljava/lang/String;)Landroid/os/Process$ProcessStartResult;
 PLandroid/os/ZygoteProcess;->bootCompleted()V
 PLandroid/os/ZygoteProcess;->bootCompleted(Ljava/lang/String;)V
-PLandroid/os/ZygoteProcess;->close()V
+HPLandroid/os/ZygoteProcess;->close()V
 HSPLandroid/os/ZygoteProcess;->fetchUsapPoolEnabledProp()Z
 HSPLandroid/os/ZygoteProcess;->fetchUsapPoolEnabledPropWithMinInterval()Z
 HSPLandroid/os/ZygoteProcess;->getAbiList(Ljava/io/BufferedWriter;Ljava/io/DataInputStream;)Ljava/util/List;
@@ -19237,24 +17199,18 @@
 HSPLandroid/os/ZygoteProcess;->preloadDefault(Ljava/lang/String;)Z
 PLandroid/os/ZygoteProcess;->setHiddenApiAccessLogSampleRate(I)V
 PLandroid/os/ZygoteProcess;->setHiddenApiAccessStatslogSampleRate(I)V
-HSPLandroid/os/ZygoteProcess;->start(Ljava/lang/String;Ljava/lang/String;II[IIIILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZZ[JLjava/util/Map;[Ljava/lang/String;)Landroid/os/Process$ProcessStartResult;
 HSPLandroid/os/ZygoteProcess;->startChildZygote(Ljava/lang/String;Ljava/lang/String;II[IILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;II)Landroid/os/ChildZygoteProcess;
-HSPLandroid/os/ZygoteProcess;->startViaZygote(Ljava/lang/String;Ljava/lang/String;II[IIIILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZLjava/lang/String;ZZ[JLjava/util/Map;[Ljava/lang/String;)Landroid/os/Process$ProcessStartResult;
 HSPLandroid/os/ZygoteProcess;->waitForConnectionToZygote(Landroid/net/LocalSocketAddress;)V
 HSPLandroid/os/ZygoteProcess;->waitForConnectionToZygote(Ljava/lang/String;)V
-HSPLandroid/os/ZygoteProcess;->zygoteSendArgsAndGetResult(Landroid/os/ZygoteProcess$ZygoteState;ZLjava/util/ArrayList;)Landroid/os/Process$ProcessStartResult;
-HPLandroid/os/connectivity/CellularBatteryStats;-><init>()V
-PLandroid/os/connectivity/CellularBatteryStats;->setTimeInRxSignalStrengthLevelMicros([J)V
 HPLandroid/os/connectivity/CellularBatteryStats;->writeToParcel(Landroid/os/Parcel;I)V
-HPLandroid/os/connectivity/GpsBatteryStats;-><init>()V
+PLandroid/os/connectivity/GpsBatteryStats;->getEnergyConsumedMaMs()J
 PLandroid/os/connectivity/GpsBatteryStats;->getLoggingDurationMs()J
 PLandroid/os/connectivity/GpsBatteryStats;->getTimeInGpsSignalQualityLevel()[J
 PLandroid/os/connectivity/GpsBatteryStats;->initialize()V
-PLandroid/os/connectivity/GpsBatteryStats;->setEnergyConsumedMaMs(J)V
-PLandroid/os/connectivity/GpsBatteryStats;->setLoggingDurationMs(J)V
-HPLandroid/os/connectivity/GpsBatteryStats;->setTimeInGpsSignalQualityLevel([J)V
 HPLandroid/os/connectivity/GpsBatteryStats;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/os/connectivity/WifiActivityEnergyInfo;-><init>(JIJJJJ)V
+HSPLandroid/os/connectivity/WifiActivityEnergyInfo;-><init>(JIJJJJJ)V
+HSPLandroid/os/connectivity/WifiActivityEnergyInfo;->calculateEnergyMicroJoules(JJJ)J
 HSPLandroid/os/connectivity/WifiActivityEnergyInfo;->getControllerEnergyUsedMicroJoules()J
 HSPLandroid/os/connectivity/WifiActivityEnergyInfo;->getControllerIdleDurationMillis()J
 HSPLandroid/os/connectivity/WifiActivityEnergyInfo;->getControllerRxDurationMillis()J
@@ -19263,6 +17219,7 @@
 HSPLandroid/os/connectivity/WifiActivityEnergyInfo;->getStackState()I
 HSPLandroid/os/connectivity/WifiActivityEnergyInfo;->getTimeSinceBootMillis()J
 HSPLandroid/os/connectivity/WifiActivityEnergyInfo;->isValid()Z
+HPLandroid/os/connectivity/WifiActivityEnergyInfo;->toString()Ljava/lang/String;
 HPLandroid/os/connectivity/WifiBatteryStats;-><init>(JJJJJJJJJJJJJ[J[J[JJ)V
 PLandroid/os/connectivity/WifiBatteryStats;->getEnergyConsumedMaMillis()J
 PLandroid/os/connectivity/WifiBatteryStats;->getIdleTimeMillis()J
@@ -19277,14 +17234,10 @@
 PLandroid/os/connectivity/WifiBatteryStats;->getSleepTimeMillis()J
 PLandroid/os/connectivity/WifiBatteryStats;->getTxTimeMillis()J
 HPLandroid/os/connectivity/WifiBatteryStats;->writeToParcel(Landroid/os/Parcel;I)V
-PLandroid/os/health/HealthKeys$Constants;-><init>(Ljava/lang/Class;)V
 HPLandroid/os/health/HealthKeys$Constants;->getDataType()Ljava/lang/String;
 HPLandroid/os/health/HealthKeys$Constants;->getIndex(II)I
 HPLandroid/os/health/HealthKeys$Constants;->getKeys(I)[I
 HPLandroid/os/health/HealthKeys$Constants;->getSize(I)I
-PLandroid/os/health/HealthKeys$SortedIntArray;-><init>(I)V
-PLandroid/os/health/HealthKeys$SortedIntArray;->addValue(I)V
-PLandroid/os/health/HealthKeys$SortedIntArray;->getArray()[I
 HSPLandroid/os/health/HealthStats;-><init>(Landroid/os/Parcel;)V
 HSPLandroid/os/health/HealthStats;->createHealthStatsMap(Landroid/os/Parcel;)Landroid/util/ArrayMap;
 HSPLandroid/os/health/HealthStats;->createLongsMap(Landroid/os/Parcel;)Landroid/util/ArrayMap;
@@ -19317,10 +17270,6 @@
 HPLandroid/os/health/HealthStatsWriter;->writeHealthStatsWriterMap(Landroid/os/Parcel;Landroid/util/ArrayMap;)V
 HPLandroid/os/health/HealthStatsWriter;->writeLongsMap(Landroid/os/Parcel;Landroid/util/ArrayMap;)V
 HPLandroid/os/health/HealthStatsWriter;->writeParcelableMap(Landroid/os/Parcel;Landroid/util/ArrayMap;)V
-PLandroid/os/health/PackageHealthStats;-><clinit>()V
-PLandroid/os/health/PidHealthStats;-><clinit>()V
-PLandroid/os/health/ProcessHealthStats;-><clinit>()V
-PLandroid/os/health/ServiceHealthStats;-><clinit>()V
 HSPLandroid/os/health/SystemHealthManager;-><init>(Lcom/android/internal/app/IBatteryStats;)V
 HSPLandroid/os/health/SystemHealthManager;->takeMyUidSnapshot()Landroid/os/health/HealthStats;
 HSPLandroid/os/health/SystemHealthManager;->takeUidSnapshot(I)Landroid/os/health/HealthStats;
@@ -19331,11 +17280,8 @@
 HSPLandroid/os/health/TimerStat;->getCount()I
 HSPLandroid/os/health/TimerStat;->getTime()J
 HPLandroid/os/health/TimerStat;->writeToParcel(Landroid/os/Parcel;I)V
-PLandroid/os/health/UidHealthStats;-><clinit>()V
 HSPLandroid/os/image/IDynamicSystemService$Stub;-><init>()V
 PLandroid/os/image/IDynamicSystemService$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/os/incremental/IIncrementalManager$Stub;-><init>()V
-HPLandroid/os/incremental/IIncrementalManager$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/os/incremental/IncrementalManager;->isIncrementalPath(Ljava/lang/String;)Z
 HSPLandroid/os/storage/-$$Lambda$StorageManager$StorageEventListenerDelegate$GoEFKT1rhv7KuSkGeH69DO738lA;-><init>(Landroid/os/storage/StorageManager$StorageEventListenerDelegate;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
 HSPLandroid/os/storage/-$$Lambda$StorageManager$StorageEventListenerDelegate$GoEFKT1rhv7KuSkGeH69DO738lA;->run()V
@@ -19353,7 +17299,6 @@
 PLandroid/os/storage/IStorageEventListener$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/storage/IStorageEventListener;
 HSPLandroid/os/storage/IStorageEventListener$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/os/storage/IStorageManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/os/storage/IStorageManager$Stub$Proxy;->allocateBytes(Ljava/lang/String;JILjava/lang/String;)V
 HSPLandroid/os/storage/IStorageManager$Stub$Proxy;->getAllocatableBytes(Ljava/lang/String;ILjava/lang/String;)J
 HSPLandroid/os/storage/IStorageManager$Stub$Proxy;->getDisks()[Landroid/os/storage/DiskInfo;
 HSPLandroid/os/storage/IStorageManager$Stub$Proxy;->getVolumeList(ILjava/lang/String;I)[Landroid/os/storage/StorageVolume;
@@ -19376,7 +17321,6 @@
 HSPLandroid/os/storage/StorageManager$StorageVolumeCallback;-><init>()V
 HSPLandroid/os/storage/StorageManager$StorageVolumeCallback;->onStateChanged(Landroid/os/storage/StorageVolume;)V
 HSPLandroid/os/storage/StorageManager;-><init>(Landroid/content/Context;Landroid/os/Looper;)V
-HSPLandroid/os/storage/StorageManager;->allocateBytes(Ljava/io/FileDescriptor;J)V
 HSPLandroid/os/storage/StorageManager;->allocateBytes(Ljava/io/FileDescriptor;JI)V
 HSPLandroid/os/storage/StorageManager;->allocateBytes(Ljava/util/UUID;JI)V
 HPLandroid/os/storage/StorageManager;->checkPermissionAndAppOp(Landroid/content/Context;ZIILjava/lang/String;Ljava/lang/String;Ljava/lang/String;I)Z
@@ -19386,6 +17330,7 @@
 PLandroid/os/storage/StorageManager;->checkPermissionReadImages(ZIILjava/lang/String;Ljava/lang/String;)Z
 HSPLandroid/os/storage/StorageManager;->convert(Ljava/lang/String;)Ljava/util/UUID;
 HSPLandroid/os/storage/StorageManager;->convert(Ljava/util/UUID;)Ljava/lang/String;
+HSPLandroid/os/storage/StorageManager;->findEmulatedForPrivate(Landroid/os/storage/VolumeInfo;)Landroid/os/storage/VolumeInfo;
 HPLandroid/os/storage/StorageManager;->findPathForUuid(Ljava/lang/String;)Ljava/io/File;
 HPLandroid/os/storage/StorageManager;->findPrivateForEmulated(Landroid/os/storage/VolumeInfo;)Landroid/os/storage/VolumeInfo;
 HSPLandroid/os/storage/StorageManager;->findVolumeById(Ljava/lang/String;)Landroid/os/storage/VolumeInfo;
@@ -19396,6 +17341,7 @@
 HSPLandroid/os/storage/StorageManager;->getBestVolumeDescription(Landroid/os/storage/VolumeInfo;)Ljava/lang/String;
 HSPLandroid/os/storage/StorageManager;->getDisks()Ljava/util/List;
 HSPLandroid/os/storage/StorageManager;->getPrimaryStorageSize()J
+PLandroid/os/storage/StorageManager;->getPrimaryStorageUuid()Ljava/lang/String;
 HSPLandroid/os/storage/StorageManager;->getPrimaryVolume()Landroid/os/storage/StorageVolume;
 HSPLandroid/os/storage/StorageManager;->getPrimaryVolume([Landroid/os/storage/StorageVolume;)Landroid/os/storage/StorageVolume;
 HPLandroid/os/storage/StorageManager;->getStorageCacheBytes(Ljava/io/File;I)J
@@ -19448,10 +17394,10 @@
 HSPLandroid/os/storage/VolumeInfo;-><init>(Landroid/os/Parcel;)V
 HSPLandroid/os/storage/VolumeInfo;-><init>(Ljava/lang/String;ILandroid/os/storage/DiskInfo;Ljava/lang/String;)V
 HPLandroid/os/storage/VolumeInfo;->buildStorageVolume(Landroid/content/Context;IZ)Landroid/os/storage/StorageVolume;
-PLandroid/os/storage/VolumeInfo;->clone()Landroid/os/storage/VolumeInfo;
+HPLandroid/os/storage/VolumeInfo;->clone()Landroid/os/storage/VolumeInfo;
 HSPLandroid/os/storage/VolumeInfo;->dump(Lcom/android/internal/util/IndentingPrintWriter;)V
-PLandroid/os/storage/VolumeInfo;->getBroadcastForEnvironment(Ljava/lang/String;)Ljava/lang/String;
 HSPLandroid/os/storage/VolumeInfo;->getDescription()Ljava/lang/String;
+HSPLandroid/os/storage/VolumeInfo;->getDisk()Landroid/os/storage/DiskInfo;
 HSPLandroid/os/storage/VolumeInfo;->getDiskId()Ljava/lang/String;
 HPLandroid/os/storage/VolumeInfo;->getEnvironmentForState(I)Ljava/lang/String;
 HSPLandroid/os/storage/VolumeInfo;->getFsUuid()Ljava/lang/String;
@@ -19484,32 +17430,35 @@
 PLandroid/permission/-$$Lambda$PermissionControllerManager$WcxnBH4VsthEHNc7qKClONaAHtQ;-><init>(Ljava/util/function/Consumer;)V
 PLandroid/permission/-$$Lambda$PermissionControllerManager$WcxnBH4VsthEHNc7qKClONaAHtQ;->accept(Ljava/lang/Object;Ljava/lang/Object;)V
 PLandroid/permission/-$$Lambda$PermissionControllerManager$u5bno-vHXoMY3ADbZMAlZp7v9oI;->run(Ljava/lang/Object;)Ljava/lang/Object;
-PLandroid/permission/-$$Lambda$PermissionControllerManager$yqGWw4vOTpW9pDZRlfJdxzYUsF0;->run(Ljava/lang/Object;)Ljava/lang/Object;
 HSPLandroid/permission/-$$Lambda$ViMr_PAGHrCLBQPYNzqdYUNU5zI;-><clinit>()V
 HSPLandroid/permission/-$$Lambda$ViMr_PAGHrCLBQPYNzqdYUNU5zI;-><init>()V
 PLandroid/permission/-$$Lambda$ViMr_PAGHrCLBQPYNzqdYUNU5zI;->apply(Ljava/lang/Object;)Ljava/lang/Object;
 HPLandroid/permission/IOnPermissionsChangeListener$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HPLandroid/permission/IOnPermissionsChangeListener$Stub$Proxy;->asBinder()Landroid/os/IBinder;
+HPLandroid/permission/IOnPermissionsChangeListener$Stub$Proxy;->onPermissionsChanged(I)V
 HSPLandroid/permission/IOnPermissionsChangeListener$Stub;-><init>()V
 HSPLandroid/permission/IOnPermissionsChangeListener$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/permission/IOnPermissionsChangeListener$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
+PLandroid/permission/IOnPermissionsChangeListener$Stub;->asInterface(Landroid/os/IBinder;)Landroid/permission/IOnPermissionsChangeListener;
 PLandroid/permission/IPermissionController$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 PLandroid/permission/IPermissionController$Stub$Proxy;->asBinder()Landroid/os/IBinder;
+PLandroid/permission/IPermissionController$Stub$Proxy;->grantOrUpgradeDefaultRuntimePermissions(Lcom/android/internal/infra/AndroidFuture;)V
 PLandroid/permission/IPermissionController$Stub;->asInterface(Landroid/os/IBinder;)Landroid/permission/IPermissionController;
 HSPLandroid/permission/IPermissionManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/permission/IPermissionManager$Stub$Proxy;->addOnPermissionsChangeListener(Landroid/permission/IOnPermissionsChangeListener;)V
 HSPLandroid/permission/IPermissionManager$Stub$Proxy;->checkPermission(Ljava/lang/String;Ljava/lang/String;I)I
 HSPLandroid/permission/IPermissionManager$Stub$Proxy;->getPermissionFlags(Ljava/lang/String;Ljava/lang/String;I)I
 HSPLandroid/permission/IPermissionManager$Stub$Proxy;->getPermissionInfo(Ljava/lang/String;Ljava/lang/String;I)Landroid/content/pm/PermissionInfo;
-HSPLandroid/permission/IPermissionManager$Stub$Proxy;->getSplitPermissions()Ljava/util/List;
-HSPLandroid/permission/IPermissionManager$Stub$Proxy;->removeOnPermissionsChangeListener(Landroid/permission/IOnPermissionsChangeListener;)V
 HSPLandroid/permission/IPermissionManager$Stub;-><init>()V
 HSPLandroid/permission/IPermissionManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/permission/IPermissionManager;
+PLandroid/permission/IPermissionManager$Stub;->getDefaultTransactionName(I)Ljava/lang/String;
 HSPLandroid/permission/IPermissionManager$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/permission/PermissionControllerManager$1;-><init>(Landroid/permission/PermissionControllerManager;Landroid/content/Context;Landroid/content/Intent;IILjava/util/function/Function;Landroid/os/Handler;)V
 PLandroid/permission/PermissionControllerManager$1;->getAutoDisconnectTimeoutMs()J
 PLandroid/permission/PermissionControllerManager$1;->getJobHandler()Landroid/os/Handler;
 HSPLandroid/permission/PermissionControllerManager;-><init>(Landroid/content/Context;Landroid/os/Handler;)V
+PLandroid/permission/PermissionControllerManager;->grantOrUpgradeDefaultRuntimePermissions(Ljava/util/concurrent/Executor;Ljava/util/function/Consumer;)V
+PLandroid/permission/PermissionControllerManager;->lambda$grantOrUpgradeDefaultRuntimePermissions$21(Landroid/permission/IPermissionController;)Ljava/util/concurrent/CompletableFuture;
+PLandroid/permission/PermissionControllerManager;->lambda$grantOrUpgradeDefaultRuntimePermissions$22(Ljava/util/function/Consumer;Ljava/lang/Boolean;Ljava/lang/Throwable;)V
+PLandroid/permission/PermissionControllerManager;->updateUserSensitive()V
 HSPLandroid/permission/PermissionManager$1;-><init>(ILjava/lang/String;)V
 HSPLandroid/permission/PermissionManager$1;->recompute(Landroid/permission/PermissionManager$PermissionQuery;)Ljava/lang/Integer;
 HSPLandroid/permission/PermissionManager$1;->recompute(Ljava/lang/Object;)Ljava/lang/Object;
@@ -19544,11 +17493,10 @@
 HSPLandroid/preference/PreferenceManager;->getDefaultSharedPreferencesMode()I
 HSPLandroid/preference/PreferenceManager;->getDefaultSharedPreferencesName(Landroid/content/Context;)Ljava/lang/String;
 HSPLandroid/print/IPrintManager$Stub;-><init>()V
-HPLandroid/print/IPrintManager$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 PLandroid/print/IPrintSpooler$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 PLandroid/print/IPrintSpooler$Stub$Proxy;->pruneApprovedPrintServices(Ljava/util/List;)V
 PLandroid/print/IPrintSpooler$Stub$Proxy;->removeObsoletePrintJobs()V
-PLandroid/print/IPrintSpooler$Stub$Proxy;->setClient(Landroid/print/IPrintSpoolerClient;)V
+HPLandroid/print/IPrintSpooler$Stub$Proxy;->setClient(Landroid/print/IPrintSpoolerClient;)V
 PLandroid/print/IPrintSpooler$Stub;->asInterface(Landroid/os/IBinder;)Landroid/print/IPrintSpooler;
 PLandroid/print/IPrintSpoolerClient$Stub;->asBinder()Landroid/os/IBinder;
 PLandroid/print/IPrintSpoolerClient$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
@@ -19576,32 +17524,13 @@
 HSPLandroid/provider/-$$Lambda$Settings$NameValueCache$qSyMM6rUAHCa-5rsP-atfAqR3sA;-><init>(Landroid/provider/Settings$NameValueCache;)V
 PLandroid/provider/BlockedNumberContract$SystemContract;->shouldShowEmergencyCallNotification(Landroid/content/Context;)Z
 HSPLandroid/provider/CalendarContract$Attendees;-><clinit>()V
-HSPLandroid/provider/CalendarContract;-><clinit>()V
 HSPLandroid/provider/CallLog$Calls;->shouldHaveSharedCallLogEntries(Landroid/content/Context;Landroid/os/UserManager;I)Z
 HSPLandroid/provider/CallLog;-><clinit>()V
-HSPLandroid/provider/ContactsContract$CommonDataKinds$Email;->getTypeLabel(Landroid/content/res/Resources;ILjava/lang/CharSequence;)Ljava/lang/CharSequence;
-HSPLandroid/provider/ContactsContract$CommonDataKinds$Email;->getTypeLabelResource(I)I
-HSPLandroid/provider/ContactsContract$CommonDataKinds$Event;->getTypeResource(Ljava/lang/Integer;)I
-HSPLandroid/provider/ContactsContract$CommonDataKinds$Im;->getProtocolLabelResource(I)I
 HSPLandroid/provider/ContactsContract$CommonDataKinds$Phone;->getTypeLabel(Landroid/content/res/Resources;ILjava/lang/CharSequence;)Ljava/lang/CharSequence;
 HSPLandroid/provider/ContactsContract$CommonDataKinds$Phone;->getTypeLabelResource(I)I
-HSPLandroid/provider/ContactsContract$CommonDataKinds$Relation;->getTypeLabelResource(I)I
-HSPLandroid/provider/ContactsContract$CommonDataKinds$StructuredPostal;-><clinit>()V
-HSPLandroid/provider/ContactsContract$CommonDataKinds$StructuredPostal;->getTypeLabelResource(I)I
 HSPLandroid/provider/ContactsContract$Contacts;->getLookupUri(JLjava/lang/String;)Landroid/net/Uri;
 HSPLandroid/provider/ContactsContract$Contacts;->isEnterpriseContactId(J)Z
-HSPLandroid/provider/ContactsContract$DeletedContacts;-><clinit>()V
-HSPLandroid/provider/ContactsContract$Directory;-><clinit>()V
-HSPLandroid/provider/ContactsContract$Directory;->isEnterpriseDirectoryId(J)Z
-HSPLandroid/provider/ContactsContract$Directory;->isRemoteDirectoryId(J)Z
-HSPLandroid/provider/ContactsContract$DisplayPhoto;-><clinit>()V
-HSPLandroid/provider/ContactsContract$Groups;-><clinit>()V
 HSPLandroid/provider/ContactsContract$Profile;-><clinit>()V
-HSPLandroid/provider/ContactsContract$ProviderStatus;-><clinit>()V
-HSPLandroid/provider/ContactsContract$RawContacts;-><clinit>()V
-HSPLandroid/provider/ContactsContract$RawContactsEntity;-><clinit>()V
-HSPLandroid/provider/ContactsContract$Settings;-><clinit>()V
-HSPLandroid/provider/ContactsContract$SyncState;-><clinit>()V
 HSPLandroid/provider/DeviceConfig$1;-><init>(Landroid/os/Handler;)V
 HSPLandroid/provider/DeviceConfig$1;->onChange(ZLandroid/net/Uri;)V
 HSPLandroid/provider/DeviceConfig$Properties$Builder;-><init>(Ljava/lang/String;)V
@@ -19623,12 +17552,12 @@
 HSPLandroid/provider/DeviceConfig;->getLong(Ljava/lang/String;Ljava/lang/String;J)J
 HSPLandroid/provider/DeviceConfig;->getProperties(Ljava/lang/String;[Ljava/lang/String;)Landroid/provider/DeviceConfig$Properties;
 HSPLandroid/provider/DeviceConfig;->getProperty(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
+HSPLandroid/provider/DeviceConfig;->getPublicNamespaces()Ljava/util/List;
 HSPLandroid/provider/DeviceConfig;->getString(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
 HSPLandroid/provider/DeviceConfig;->handleChange(Landroid/net/Uri;)V
 HSPLandroid/provider/DeviceConfig;->incrementNamespace(Ljava/lang/String;)V
 HPLandroid/provider/DeviceConfig;->lambda$handleChange$0(Landroid/provider/DeviceConfig$OnPropertiesChangedListener;Landroid/provider/DeviceConfig$Properties;)V
 HSPLandroid/provider/DeviceConfig;->removeOnPropertiesChangedListener(Landroid/provider/DeviceConfig$OnPropertiesChangedListener;)V
-HSPLandroid/provider/DeviceConfig;->setProperties(Landroid/provider/DeviceConfig$Properties;)Z
 PLandroid/provider/Downloads;->removeAllDownloadsByPackage(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;)V
 HSPLandroid/provider/FontRequest;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)V
 HSPLandroid/provider/FontRequest;->getIdentifier()Ljava/lang/String;
@@ -19668,11 +17597,11 @@
 HSPLandroid/provider/Settings$Config;->createCompositeName(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
 HSPLandroid/provider/Settings$Config;->createPrefix(Ljava/lang/String;)Ljava/lang/String;
 HSPLandroid/provider/Settings$Config;->getStrings(Landroid/content/ContentResolver;Ljava/lang/String;Ljava/util/List;)Ljava/util/Map;
-HSPLandroid/provider/Settings$Config;->setStrings(Landroid/content/ContentResolver;Ljava/lang/String;Ljava/util/Map;)Z
+HSPLandroid/provider/Settings$Config;->registerMonitorCallback(Landroid/content/ContentResolver;Landroid/os/RemoteCallback;)V
+HSPLandroid/provider/Settings$Config;->registerMonitorCallbackAsUser(Landroid/content/ContentResolver;ILandroid/os/RemoteCallback;)V
 HSPLandroid/provider/Settings$ContentProviderHolder;->access$000(Landroid/provider/Settings$ContentProviderHolder;)Landroid/net/Uri;
 HSPLandroid/provider/Settings$ContentProviderHolder;->getProvider(Landroid/content/ContentResolver;)Landroid/content/IContentProvider;
 HSPLandroid/provider/Settings$GenerationTracker;-><init>(Landroid/util/MemoryIntArray;IILjava/lang/Runnable;)V
-HSPLandroid/provider/Settings$GenerationTracker;->destroy()V
 HSPLandroid/provider/Settings$GenerationTracker;->getCurrentGeneration()I
 HSPLandroid/provider/Settings$GenerationTracker;->isGenerationChanged()Z
 HSPLandroid/provider/Settings$GenerationTracker;->readCurrentGeneration()I
@@ -19694,7 +17623,6 @@
 HSPLandroid/provider/Settings$NameValueCache;->getStringForUser(Landroid/content/ContentResolver;Ljava/lang/String;I)Ljava/lang/String;
 HSPLandroid/provider/Settings$NameValueCache;->getStringsForPrefix(Landroid/content/ContentResolver;Ljava/lang/String;Ljava/util/List;)Landroid/util/ArrayMap;
 HSPLandroid/provider/Settings$NameValueCache;->putStringForUser(Landroid/content/ContentResolver;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZIZ)Z
-HSPLandroid/provider/Settings$NameValueCache;->setStringsForPrefix(Landroid/content/ContentResolver;Ljava/lang/String;Ljava/util/HashMap;)Z
 HSPLandroid/provider/Settings$NameValueTable;->getUriFor(Landroid/net/Uri;Ljava/lang/String;)Landroid/net/Uri;
 HSPLandroid/provider/Settings$Secure;->getCloneToManagedProfileSettings(Ljava/util/Set;)V
 HSPLandroid/provider/Settings$Secure;->getFloat(Landroid/content/ContentResolver;Ljava/lang/String;F)F
@@ -19709,7 +17637,6 @@
 HSPLandroid/provider/Settings$Secure;->getString(Landroid/content/ContentResolver;Ljava/lang/String;)Ljava/lang/String;
 HSPLandroid/provider/Settings$Secure;->getStringForUser(Landroid/content/ContentResolver;Ljava/lang/String;I)Ljava/lang/String;
 HSPLandroid/provider/Settings$Secure;->getUriFor(Ljava/lang/String;)Landroid/net/Uri;
-HSPLandroid/provider/Settings$Secure;->isLocationProviderEnabled(Landroid/content/ContentResolver;Ljava/lang/String;)Z
 HSPLandroid/provider/Settings$Secure;->putInt(Landroid/content/ContentResolver;Ljava/lang/String;I)Z
 HSPLandroid/provider/Settings$Secure;->putIntForUser(Landroid/content/ContentResolver;Ljava/lang/String;II)Z
 HSPLandroid/provider/Settings$Secure;->putString(Landroid/content/ContentResolver;Ljava/lang/String;Ljava/lang/String;)Z
@@ -19722,10 +17649,8 @@
 HSPLandroid/provider/Settings$System;->getCloneFromParentOnValueSettings(Ljava/util/Map;)V
 HSPLandroid/provider/Settings$System;->getCloneToManagedProfileSettings(Ljava/util/Set;)V
 HSPLandroid/provider/Settings$System;->getConfiguration(Landroid/content/ContentResolver;Landroid/content/res/Configuration;)V
-HSPLandroid/provider/Settings$System;->getFloat(Landroid/content/ContentResolver;Ljava/lang/String;)F
 HSPLandroid/provider/Settings$System;->getFloat(Landroid/content/ContentResolver;Ljava/lang/String;F)F
 HSPLandroid/provider/Settings$System;->getFloatForUser(Landroid/content/ContentResolver;Ljava/lang/String;FI)F
-HSPLandroid/provider/Settings$System;->getFloatForUser(Landroid/content/ContentResolver;Ljava/lang/String;I)F
 HSPLandroid/provider/Settings$System;->getInt(Landroid/content/ContentResolver;Ljava/lang/String;)I
 HSPLandroid/provider/Settings$System;->getInt(Landroid/content/ContentResolver;Ljava/lang/String;I)I
 HSPLandroid/provider/Settings$System;->getIntForUser(Landroid/content/ContentResolver;Ljava/lang/String;I)I
@@ -19735,25 +17660,19 @@
 HSPLandroid/provider/Settings$System;->getString(Landroid/content/ContentResolver;Ljava/lang/String;)Ljava/lang/String;
 HSPLandroid/provider/Settings$System;->getStringForUser(Landroid/content/ContentResolver;Ljava/lang/String;I)Ljava/lang/String;
 HSPLandroid/provider/Settings$System;->getUriFor(Ljava/lang/String;)Landroid/net/Uri;
+HPLandroid/provider/Settings$System;->putFloatForUser(Landroid/content/ContentResolver;Ljava/lang/String;FI)Z
 HSPLandroid/provider/Settings$System;->putInt(Landroid/content/ContentResolver;Ljava/lang/String;I)Z
 HSPLandroid/provider/Settings$System;->putIntForUser(Landroid/content/ContentResolver;Ljava/lang/String;II)Z
 HSPLandroid/provider/Settings$System;->putStringForUser(Landroid/content/ContentResolver;Ljava/lang/String;Ljava/lang/String;I)Z
 HSPLandroid/provider/Settings$System;->putStringForUser(Landroid/content/ContentResolver;Ljava/lang/String;Ljava/lang/String;IZ)Z
-HSPLandroid/provider/Settings;->canDrawOverlays(Landroid/content/Context;)Z
 HSPLandroid/provider/Settings;->checkAndNoteChangeNetworkStateOperation(Landroid/content/Context;ILjava/lang/String;Z)Z
 HSPLandroid/provider/Settings;->getPackageNameForUid(Landroid/content/Context;I)Ljava/lang/String;
-HSPLandroid/provider/Settings;->isCallingPackageAllowedToDrawOverlays(Landroid/content/Context;ILjava/lang/String;Z)Z
 HSPLandroid/provider/Settings;->isCallingPackageAllowedToPerformAppOpsProtectedOperation(Landroid/content/Context;ILjava/lang/String;ZI[Ljava/lang/String;Z)Z
 HSPLandroid/provider/Settings;->isInSystemServer()Z
 HSPLandroid/provider/Settings;->setInSystemServer()V
-HSPLandroid/provider/Telephony$Mms;-><clinit>()V
 HSPLandroid/provider/Telephony$Mms;->isPhoneNumber(Ljava/lang/String;)Z
 HSPLandroid/provider/Telephony$MmsSms;-><clinit>()V
-HSPLandroid/provider/Telephony$Sms$Intents;->getMessagesFromIntent(Landroid/content/Intent;)[Landroid/telephony/SmsMessage;
 HSPLandroid/provider/Telephony$Sms;->getDefaultSmsPackage(Landroid/content/Context;)Ljava/lang/String;
-HSPLandroid/provider/Telephony$Threads;-><clinit>()V
-HSPLandroid/provider/VoicemailContract$Status;-><clinit>()V
-HSPLandroid/provider/VoicemailContract$Voicemails;-><clinit>()V
 HSPLandroid/renderscript/BaseObj;-><init>(JLandroid/renderscript/RenderScript;)V
 HSPLandroid/renderscript/BaseObj;->equals(Ljava/lang/Object;)Z
 HSPLandroid/renderscript/BaseObj;->getID(Landroid/renderscript/RenderScript;)J
@@ -19800,7 +17719,6 @@
 HSPLandroid/security/GateKeeper;->getSecureUserId()J
 HSPLandroid/security/GateKeeper;->getService()Landroid/service/gatekeeper/IGateKeeperService;
 HSPLandroid/security/IFileIntegrityService$Stub;-><init>()V
-HPLandroid/security/IFileIntegrityService$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/security/IKeyChainService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HSPLandroid/security/IKeyChainService$Stub$Proxy;->getUserCaAliases()Landroid/content/pm/StringParceledListSlice;
 HSPLandroid/security/IKeyChainService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/security/IKeyChainService;
@@ -19811,10 +17729,6 @@
 HSPLandroid/security/KeyChain$KeyChainConnection;->getService()Landroid/security/IKeyChainService;
 HSPLandroid/security/KeyChain;->bindAsUser(Landroid/content/Context;Landroid/os/UserHandle;)Landroid/security/KeyChain$KeyChainConnection;
 HSPLandroid/security/KeyChain;->ensureNotOnMainThread(Landroid/content/Context;)V
-HSPLandroid/security/KeyStore$ExportKeyPromise;-><init>(Landroid/security/KeyStore;)V
-HSPLandroid/security/KeyStore$ExportKeyPromise;-><init>(Landroid/security/KeyStore;Landroid/security/KeyStore$1;)V
-HSPLandroid/security/KeyStore$ExportKeyPromise;->getFuture()Ljava/util/concurrent/CompletableFuture;
-HSPLandroid/security/KeyStore$ExportKeyPromise;->onFinished(Landroid/security/keymaster/ExportResult;)V
 HSPLandroid/security/KeyStore$KeyCharacteristicsCallbackResult;-><init>(Landroid/security/KeyStore;Landroid/security/keystore/KeystoreResponse;Landroid/security/keymaster/KeyCharacteristics;)V
 HSPLandroid/security/KeyStore$KeyCharacteristicsCallbackResult;->getKeyCharacteristics()Landroid/security/keymaster/KeyCharacteristics;
 HSPLandroid/security/KeyStore$KeyCharacteristicsCallbackResult;->getKeystoreResponse()Landroid/security/keystore/KeystoreResponse;
@@ -19836,7 +17750,6 @@
 HSPLandroid/security/KeyStore;->contains(Ljava/lang/String;I)Z
 HSPLandroid/security/KeyStore;->delete(Ljava/lang/String;I)Z
 HSPLandroid/security/KeyStore;->delete2(Ljava/lang/String;I)I
-HSPLandroid/security/KeyStore;->exportKey(Ljava/lang/String;ILandroid/security/keymaster/KeymasterBlob;Landroid/security/keymaster/KeymasterBlob;I)Landroid/security/keymaster/ExportResult;
 HSPLandroid/security/KeyStore;->finish(Landroid/os/IBinder;Landroid/security/keymaster/KeymasterArguments;[B[B[B)Landroid/security/keymaster/OperationResult;
 HSPLandroid/security/KeyStore;->generateKey(Ljava/lang/String;Landroid/security/keymaster/KeymasterArguments;[BIILandroid/security/keymaster/KeyCharacteristics;)I
 HSPLandroid/security/KeyStore;->generateKeyInternal(Ljava/lang/String;Landroid/security/keymaster/KeymasterArguments;[BIILandroid/security/keymaster/KeyCharacteristics;)I
@@ -19849,7 +17762,6 @@
 HSPLandroid/security/KeyStore;->getKeyCharacteristics(Ljava/lang/String;Landroid/security/keymaster/KeymasterBlob;Landroid/security/keymaster/KeymasterBlob;ILandroid/security/keymaster/KeyCharacteristics;)I
 HSPLandroid/security/KeyStore;->getKeyStoreException(I)Landroid/security/KeyStoreException;
 HSPLandroid/security/KeyStore;->getToken()Landroid/os/IBinder;
-HSPLandroid/security/KeyStore;->getmtime(Ljava/lang/String;I)J
 HSPLandroid/security/KeyStore;->grant(Ljava/lang/String;I)Ljava/lang/String;
 HSPLandroid/security/KeyStore;->insert(Ljava/lang/String;[BII)I
 HSPLandroid/security/KeyStore;->list(Ljava/lang/String;I)[Ljava/lang/String;
@@ -19858,28 +17770,17 @@
 HPLandroid/security/KeyStore;->unlock(ILjava/lang/String;)Z
 HSPLandroid/security/KeyStore;->update(Landroid/os/IBinder;Landroid/security/keymaster/KeymasterArguments;[B)Landroid/security/keymaster/OperationResult;
 HSPLandroid/security/KeyStoreException;->getErrorCode()I
-HSPLandroid/security/NetworkSecurityPolicy;->getInstance()Landroid/security/NetworkSecurityPolicy;
-HSPLandroid/security/NetworkSecurityPolicy;->isCleartextTrafficPermitted()Z
 HPLandroid/security/Scrypt;-><init>()V
-HPLandroid/security/Scrypt;->scrypt([B[BIIII)[B
-HSPLandroid/security/keymaster/ExportResult$1;-><init>()V
-HSPLandroid/security/keymaster/ExportResult$1;->createFromParcel(Landroid/os/Parcel;)Landroid/security/keymaster/ExportResult;
-HSPLandroid/security/keymaster/ExportResult$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/security/keymaster/ExportResult;-><clinit>()V
-HSPLandroid/security/keymaster/ExportResult;-><init>(Landroid/os/Parcel;)V
 HSPLandroid/security/keymaster/IKeyAttestationApplicationIdProvider$Stub;-><init>()V
 HPLandroid/security/keymaster/IKeyAttestationApplicationIdProvider$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 PLandroid/security/keymaster/KeyAttestationApplicationId;->writeToParcel(Landroid/os/Parcel;I)V
-PLandroid/security/keymaster/KeyAttestationPackageInfo;->writeToParcel(Landroid/os/Parcel;I)V
+HPLandroid/security/keymaster/KeyAttestationPackageInfo;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/security/keymaster/KeyCharacteristics$1;->createFromParcel(Landroid/os/Parcel;)Landroid/security/keymaster/KeyCharacteristics;
 HSPLandroid/security/keymaster/KeyCharacteristics$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/security/keymaster/KeyCharacteristics;-><init>()V
 HSPLandroid/security/keymaster/KeyCharacteristics;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/security/keymaster/KeyCharacteristics;->getBoolean(I)Z
-HSPLandroid/security/keymaster/KeyCharacteristics;->getDate(I)Ljava/util/Date;
 HSPLandroid/security/keymaster/KeyCharacteristics;->getEnum(I)Ljava/lang/Integer;
 HSPLandroid/security/keymaster/KeyCharacteristics;->getEnums(I)Ljava/util/List;
-HSPLandroid/security/keymaster/KeyCharacteristics;->getUnsignedInt(IJ)J
 HSPLandroid/security/keymaster/KeyCharacteristics;->getUnsignedLongs(I)Ljava/util/List;
 HSPLandroid/security/keymaster/KeyCharacteristics;->readFromParcel(Landroid/os/Parcel;)V
 HSPLandroid/security/keymaster/KeyCharacteristics;->shallowCopyFrom(Landroid/security/keymaster/KeyCharacteristics;)V
@@ -19903,26 +17804,23 @@
 HSPLandroid/security/keymaster/KeymasterArguments;->addUnsignedLong(ILjava/math/BigInteger;)V
 HSPLandroid/security/keymaster/KeymasterArguments;->containsTag(I)Z
 HSPLandroid/security/keymaster/KeymasterArguments;->getArgumentByTag(I)Landroid/security/keymaster/KeymasterArgument;
-HSPLandroid/security/keymaster/KeymasterArguments;->getBoolean(I)Z
 HSPLandroid/security/keymaster/KeymasterArguments;->getBytes(I[B)[B
-HSPLandroid/security/keymaster/KeymasterArguments;->getDate(ILjava/util/Date;)Ljava/util/Date;
 HSPLandroid/security/keymaster/KeymasterArguments;->getEnum(II)I
 HSPLandroid/security/keymaster/KeymasterArguments;->getEnumTagValue(Landroid/security/keymaster/KeymasterArgument;)I
 HSPLandroid/security/keymaster/KeymasterArguments;->getEnums(I)Ljava/util/List;
 HSPLandroid/security/keymaster/KeymasterArguments;->getLongTagValue(Landroid/security/keymaster/KeymasterArgument;)Ljava/math/BigInteger;
-HSPLandroid/security/keymaster/KeymasterArguments;->getUnsignedInt(IJ)J
 HSPLandroid/security/keymaster/KeymasterArguments;->getUnsignedLongs(I)Ljava/util/List;
 HSPLandroid/security/keymaster/KeymasterArguments;->toUint64(J)Ljava/math/BigInteger;
 HSPLandroid/security/keymaster/KeymasterArguments;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/security/keymaster/KeymasterBlob;-><init>([B)V
 HSPLandroid/security/keymaster/KeymasterBlob;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/security/keymaster/KeymasterBlobArgument;-><init>(ILandroid/os/Parcel;)V
 HSPLandroid/security/keymaster/KeymasterBlobArgument;-><init>(I[B)V
 HSPLandroid/security/keymaster/KeymasterBlobArgument;->writeValue(Landroid/os/Parcel;)V
 HSPLandroid/security/keymaster/KeymasterBooleanArgument;-><init>(I)V
 HSPLandroid/security/keymaster/KeymasterBooleanArgument;-><init>(ILandroid/os/Parcel;)V
 HSPLandroid/security/keymaster/KeymasterBooleanArgument;->writeValue(Landroid/os/Parcel;)V
 HSPLandroid/security/keymaster/KeymasterCertificateChain;-><init>()V
+HSPLandroid/security/keymaster/KeymasterCertificateChain;->readFromParcel(Landroid/os/Parcel;)V
 HSPLandroid/security/keymaster/KeymasterDateArgument;-><init>(ILandroid/os/Parcel;)V
 HSPLandroid/security/keymaster/KeymasterDefs;->getTagType(I)I
 HSPLandroid/security/keymaster/KeymasterIntArgument;-><init>(II)V
@@ -19967,8 +17865,6 @@
 HSPLandroid/security/keystore/AndroidKeyStoreBCWorkaroundProvider;->putSignatureImpl(Ljava/lang/String;Ljava/lang/String;)V
 HSPLandroid/security/keystore/AndroidKeyStoreBCWorkaroundProvider;->putSymmetricCipherImpl(Ljava/lang/String;Ljava/lang/String;)V
 HSPLandroid/security/keystore/AndroidKeyStoreCipherSpiBase;-><init>()V
-HSPLandroid/security/keystore/AndroidKeyStoreCipherSpiBase;->createAdditionalAuthenticationDataStreamer(Landroid/security/KeyStore;Landroid/os/IBinder;)Landroid/security/keystore/KeyStoreCryptoOperationStreamer;
-HSPLandroid/security/keystore/AndroidKeyStoreCipherSpiBase;->createMainDataStreamer(Landroid/security/KeyStore;Landroid/os/IBinder;)Landroid/security/keystore/KeyStoreCryptoOperationStreamer;
 HSPLandroid/security/keystore/AndroidKeyStoreCipherSpiBase;->engineDoFinal([BII)[B
 HSPLandroid/security/keystore/AndroidKeyStoreCipherSpiBase;->engineInit(ILjava/security/Key;Ljava/security/SecureRandom;)V
 HSPLandroid/security/keystore/AndroidKeyStoreCipherSpiBase;->engineInit(ILjava/security/Key;Ljava/security/spec/AlgorithmParameterSpec;Ljava/security/SecureRandom;)V
@@ -19981,17 +17877,6 @@
 HSPLandroid/security/keystore/AndroidKeyStoreCipherSpiBase;->resetAll()V
 HSPLandroid/security/keystore/AndroidKeyStoreCipherSpiBase;->resetWhilePreservingInitState()V
 HSPLandroid/security/keystore/AndroidKeyStoreCipherSpiBase;->setKey(Landroid/security/keystore/AndroidKeyStoreKey;)V
-HSPLandroid/security/keystore/AndroidKeyStoreECDSASignatureSpi$SHA256;-><init>()V
-HSPLandroid/security/keystore/AndroidKeyStoreECDSASignatureSpi;-><init>(I)V
-HSPLandroid/security/keystore/AndroidKeyStoreECDSASignatureSpi;->addAlgorithmSpecificParametersToBegin(Landroid/security/keymaster/KeymasterArguments;)V
-HSPLandroid/security/keystore/AndroidKeyStoreECDSASignatureSpi;->getAdditionalEntropyAmountForSign()I
-HSPLandroid/security/keystore/AndroidKeyStoreECDSASignatureSpi;->initKey(Landroid/security/keystore/AndroidKeyStoreKey;)V
-HSPLandroid/security/keystore/AndroidKeyStoreECDSASignatureSpi;->resetAll()V
-HSPLandroid/security/keystore/AndroidKeyStoreECDSASignatureSpi;->resetWhilePreservingInitState()V
-HSPLandroid/security/keystore/AndroidKeyStoreECPrivateKey;-><init>(Ljava/lang/String;ILjava/security/spec/ECParameterSpec;)V
-HSPLandroid/security/keystore/AndroidKeyStoreECPublicKey;-><init>(Ljava/lang/String;ILjava/security/interfaces/ECPublicKey;)V
-HSPLandroid/security/keystore/AndroidKeyStoreECPublicKey;-><init>(Ljava/lang/String;I[BLjava/security/spec/ECParameterSpec;Ljava/security/spec/ECPoint;)V
-HSPLandroid/security/keystore/AndroidKeyStoreECPublicKey;->getParams()Ljava/security/spec/ECParameterSpec;
 HSPLandroid/security/keystore/AndroidKeyStoreHmacSpi$HmacSHA256;-><init>()V
 HSPLandroid/security/keystore/AndroidKeyStoreHmacSpi;-><init>(I)V
 HSPLandroid/security/keystore/AndroidKeyStoreHmacSpi;->engineInit(Ljava/security/Key;Ljava/security/spec/AlgorithmParameterSpec;)V
@@ -20005,94 +17890,23 @@
 HSPLandroid/security/keystore/AndroidKeyStoreKey;->getUid()I
 HSPLandroid/security/keystore/AndroidKeyStoreKeyFactorySpi;-><init>()V
 HSPLandroid/security/keystore/AndroidKeyStoreKeyFactorySpi;->engineGeneratePublic(Ljava/security/spec/KeySpec;)Ljava/security/PublicKey;
-HSPLandroid/security/keystore/AndroidKeyStoreKeyPairGeneratorSpi$EC;-><init>()V
-HSPLandroid/security/keystore/AndroidKeyStoreKeyPairGeneratorSpi$RSA;-><init>()V
-HSPLandroid/security/keystore/AndroidKeyStoreKeyPairGeneratorSpi;-><clinit>()V
-HSPLandroid/security/keystore/AndroidKeyStoreKeyPairGeneratorSpi;-><init>(I)V
-HSPLandroid/security/keystore/AndroidKeyStoreKeyPairGeneratorSpi;->addAlgorithmSpecificParameters(Landroid/security/keymaster/KeymasterArguments;)V
-HSPLandroid/security/keystore/AndroidKeyStoreKeyPairGeneratorSpi;->checkValidKeySize(IIZ)V
-HSPLandroid/security/keystore/AndroidKeyStoreKeyPairGeneratorSpi;->constructKeyGenerationArguments()Landroid/security/keymaster/KeymasterArguments;
-HSPLandroid/security/keystore/AndroidKeyStoreKeyPairGeneratorSpi;->createCertificateChain(Ljava/lang/String;Ljava/security/KeyPair;)Ljava/lang/Iterable;
-HSPLandroid/security/keystore/AndroidKeyStoreKeyPairGeneratorSpi;->generateKeyPair()Ljava/security/KeyPair;
-HSPLandroid/security/keystore/AndroidKeyStoreKeyPairGeneratorSpi;->generateKeystoreKeyPair(Ljava/lang/String;Landroid/security/keymaster/KeymasterArguments;[BI)V
-HSPLandroid/security/keystore/AndroidKeyStoreKeyPairGeneratorSpi;->generateSelfSignedCertificate(Ljava/security/PrivateKey;Ljava/security/PublicKey;)Ljava/security/cert/X509Certificate;
-HSPLandroid/security/keystore/AndroidKeyStoreKeyPairGeneratorSpi;->generateSelfSignedCertificateBytes(Ljava/security/KeyPair;)[B
-HSPLandroid/security/keystore/AndroidKeyStoreKeyPairGeneratorSpi;->generateSelfSignedCertificateWithFakeSignature(Ljava/security/PublicKey;)Ljava/security/cert/X509Certificate;
-HSPLandroid/security/keystore/AndroidKeyStoreKeyPairGeneratorSpi;->generateSelfSignedCertificateWithValidSignature(Ljava/security/PrivateKey;Ljava/security/PublicKey;Ljava/lang/String;)Ljava/security/cert/X509Certificate;
-HSPLandroid/security/keystore/AndroidKeyStoreKeyPairGeneratorSpi;->getAvailableKeymasterSignatureDigests([Ljava/lang/String;[Ljava/lang/String;)Ljava/util/Set;
-HSPLandroid/security/keystore/AndroidKeyStoreKeyPairGeneratorSpi;->getCertificateSignatureAlgorithm(IILandroid/security/keystore/KeyGenParameterSpec;)Ljava/lang/String;
-HSPLandroid/security/keystore/AndroidKeyStoreKeyPairGeneratorSpi;->initAlgorithmSpecificParameters()V
-HSPLandroid/security/keystore/AndroidKeyStoreKeyPairGeneratorSpi;->initialize(Ljava/security/spec/AlgorithmParameterSpec;Ljava/security/SecureRandom;)V
-HSPLandroid/security/keystore/AndroidKeyStoreKeyPairGeneratorSpi;->loadKeystoreKeyPair(Ljava/lang/String;)Ljava/security/KeyPair;
-HSPLandroid/security/keystore/AndroidKeyStoreKeyPairGeneratorSpi;->resetAll()V
-HSPLandroid/security/keystore/AndroidKeyStoreKeyPairGeneratorSpi;->storeCertificate(Ljava/lang/String;[BILjava/lang/String;)V
-HSPLandroid/security/keystore/AndroidKeyStoreKeyPairGeneratorSpi;->storeCertificateChain(ILjava/lang/Iterable;)V
 HSPLandroid/security/keystore/AndroidKeyStoreLoadStoreParameter;-><init>(I)V
 HSPLandroid/security/keystore/AndroidKeyStoreLoadStoreParameter;->getUid()I
-HSPLandroid/security/keystore/AndroidKeyStorePrivateKey;-><init>(Ljava/lang/String;ILjava/lang/String;)V
 HSPLandroid/security/keystore/AndroidKeyStoreProvider;-><init>()V
-HSPLandroid/security/keystore/AndroidKeyStoreProvider;->getAndroidKeyStorePrivateKey(Landroid/security/keystore/AndroidKeyStorePublicKey;)Landroid/security/keystore/AndroidKeyStorePrivateKey;
-HSPLandroid/security/keystore/AndroidKeyStoreProvider;->getAndroidKeyStorePublicKey(Ljava/lang/String;ILjava/lang/String;[B)Landroid/security/keystore/AndroidKeyStorePublicKey;
 HSPLandroid/security/keystore/AndroidKeyStoreProvider;->getKeyCharacteristics(Landroid/security/KeyStore;Ljava/lang/String;I)Landroid/security/keymaster/KeyCharacteristics;
 HSPLandroid/security/keystore/AndroidKeyStoreProvider;->getKeyStoreForUid(I)Ljava/security/KeyStore;
 HSPLandroid/security/keystore/AndroidKeyStoreProvider;->install()V
 HSPLandroid/security/keystore/AndroidKeyStoreProvider;->loadAndroidKeyStoreKeyFromKeystore(Landroid/security/KeyStore;Ljava/lang/String;I)Landroid/security/keystore/AndroidKeyStoreKey;
-HSPLandroid/security/keystore/AndroidKeyStoreProvider;->loadAndroidKeyStoreKeyPairFromKeystore(Landroid/security/KeyStore;Ljava/lang/String;I)Ljava/security/KeyPair;
-HSPLandroid/security/keystore/AndroidKeyStoreProvider;->loadAndroidKeyStoreKeyPairFromKeystore(Landroid/security/KeyStore;Ljava/lang/String;ILandroid/security/keymaster/KeyCharacteristics;)Ljava/security/KeyPair;
-HSPLandroid/security/keystore/AndroidKeyStoreProvider;->loadAndroidKeyStorePrivateKeyFromKeystore(Landroid/security/KeyStore;Ljava/lang/String;ILandroid/security/keymaster/KeyCharacteristics;)Landroid/security/keystore/AndroidKeyStorePrivateKey;
-HSPLandroid/security/keystore/AndroidKeyStoreProvider;->loadAndroidKeyStorePublicKeyFromKeystore(Landroid/security/KeyStore;Ljava/lang/String;ILandroid/security/keymaster/KeyCharacteristics;)Landroid/security/keystore/AndroidKeyStorePublicKey;
 HSPLandroid/security/keystore/AndroidKeyStoreProvider;->loadAndroidKeyStoreSecretKeyFromKeystore(Ljava/lang/String;ILandroid/security/keymaster/KeyCharacteristics;)Landroid/security/keystore/AndroidKeyStoreSecretKey;
 HSPLandroid/security/keystore/AndroidKeyStoreProvider;->putKeyFactoryImpl(Ljava/lang/String;)V
 HSPLandroid/security/keystore/AndroidKeyStoreProvider;->putSecretKeyFactoryImpl(Ljava/lang/String;)V
-HSPLandroid/security/keystore/AndroidKeyStorePublicKey;-><init>(Ljava/lang/String;ILjava/lang/String;[B)V
-HSPLandroid/security/keystore/AndroidKeyStorePublicKey;->getEncoded()[B
-HSPLandroid/security/keystore/AndroidKeyStoreRSAPrivateKey;-><init>(Ljava/lang/String;ILjava/math/BigInteger;)V
-HSPLandroid/security/keystore/AndroidKeyStoreRSAPublicKey;-><init>(Ljava/lang/String;ILjava/security/interfaces/RSAPublicKey;)V
-HSPLandroid/security/keystore/AndroidKeyStoreRSAPublicKey;-><init>(Ljava/lang/String;I[BLjava/math/BigInteger;Ljava/math/BigInteger;)V
-HSPLandroid/security/keystore/AndroidKeyStoreRSAPublicKey;->getModulus()Ljava/math/BigInteger;
 HSPLandroid/security/keystore/AndroidKeyStoreSecretKey;-><init>(Ljava/lang/String;ILjava/lang/String;)V
-HSPLandroid/security/keystore/AndroidKeyStoreSecretKeyFactorySpi;-><init>()V
-HSPLandroid/security/keystore/AndroidKeyStoreSecretKeyFactorySpi;->engineGetKeySpec(Ljavax/crypto/SecretKey;Ljava/lang/Class;)Ljava/security/spec/KeySpec;
-HSPLandroid/security/keystore/AndroidKeyStoreSecretKeyFactorySpi;->getKeyInfo(Landroid/security/KeyStore;Ljava/lang/String;Ljava/lang/String;I)Landroid/security/keystore/KeyInfo;
-HSPLandroid/security/keystore/AndroidKeyStoreSignatureSpiBase;-><init>()V
-HSPLandroid/security/keystore/AndroidKeyStoreSignatureSpiBase;->createMainDataStreamer(Landroid/security/KeyStore;Landroid/os/IBinder;)Landroid/security/keystore/KeyStoreCryptoOperationStreamer;
-HSPLandroid/security/keystore/AndroidKeyStoreSignatureSpiBase;->engineInitSign(Ljava/security/PrivateKey;)V
-HSPLandroid/security/keystore/AndroidKeyStoreSignatureSpiBase;->engineInitSign(Ljava/security/PrivateKey;Ljava/security/SecureRandom;)V
-HSPLandroid/security/keystore/AndroidKeyStoreSignatureSpiBase;->engineSign()[B
-HSPLandroid/security/keystore/AndroidKeyStoreSignatureSpiBase;->engineUpdate([BII)V
-HSPLandroid/security/keystore/AndroidKeyStoreSignatureSpiBase;->ensureKeystoreOperationInitialized()V
-HSPLandroid/security/keystore/AndroidKeyStoreSignatureSpiBase;->getKeyStore()Landroid/security/KeyStore;
-HSPLandroid/security/keystore/AndroidKeyStoreSignatureSpiBase;->initKey(Landroid/security/keystore/AndroidKeyStoreKey;)V
-HSPLandroid/security/keystore/AndroidKeyStoreSignatureSpiBase;->resetAll()V
-HSPLandroid/security/keystore/AndroidKeyStoreSignatureSpiBase;->resetWhilePreservingInitState()V
-HSPLandroid/security/keystore/AndroidKeyStoreSpi$KeyStoreX509Certificate;-><init>(Ljava/lang/String;ILjava/security/cert/X509Certificate;)V
-HSPLandroid/security/keystore/AndroidKeyStoreSpi$KeyStoreX509Certificate;->getPublicKey()Ljava/security/PublicKey;
 HSPLandroid/security/keystore/AndroidKeyStoreSpi;-><init>()V
-HSPLandroid/security/keystore/AndroidKeyStoreSpi;->engineAliases()Ljava/util/Enumeration;
 HSPLandroid/security/keystore/AndroidKeyStoreSpi;->engineContainsAlias(Ljava/lang/String;)Z
-HSPLandroid/security/keystore/AndroidKeyStoreSpi;->engineGetCertificate(Ljava/lang/String;)Ljava/security/cert/Certificate;
-HSPLandroid/security/keystore/AndroidKeyStoreSpi;->engineGetCertificateChain(Ljava/lang/String;)[Ljava/security/cert/Certificate;
-HSPLandroid/security/keystore/AndroidKeyStoreSpi;->engineGetCreationDate(Ljava/lang/String;)Ljava/util/Date;
+HSPLandroid/security/keystore/AndroidKeyStoreSpi;->engineDeleteEntry(Ljava/lang/String;)V
 HSPLandroid/security/keystore/AndroidKeyStoreSpi;->engineGetKey(Ljava/lang/String;[C)Ljava/security/Key;
-HSPLandroid/security/keystore/AndroidKeyStoreSpi;->engineIsCertificateEntry(Ljava/lang/String;)Z
-HSPLandroid/security/keystore/AndroidKeyStoreSpi;->engineIsKeyEntry(Ljava/lang/String;)Z
 HSPLandroid/security/keystore/AndroidKeyStoreSpi;->engineLoad(Ljava/security/KeyStore$LoadStoreParameter;)V
-HSPLandroid/security/keystore/AndroidKeyStoreSpi;->getCertificateForPrivateKeyEntry(Ljava/lang/String;[B)Ljava/security/cert/Certificate;
-HSPLandroid/security/keystore/AndroidKeyStoreSpi;->getUniqueAliases()Ljava/util/Set;
 HSPLandroid/security/keystore/AndroidKeyStoreSpi;->isKeyEntry(Ljava/lang/String;)Z
-HSPLandroid/security/keystore/AndroidKeyStoreSpi;->toCertificate([B)Ljava/security/cert/X509Certificate;
-HSPLandroid/security/keystore/AndroidKeyStoreSpi;->wrapIntoKeyStoreCertificate(Ljava/lang/String;ILjava/security/cert/X509Certificate;)Landroid/security/keystore/AndroidKeyStoreSpi$KeyStoreX509Certificate;
-HSPLandroid/security/keystore/AndroidKeyStoreUnauthenticatedAESCipherSpi$CBC$PKCS7Padding;-><init>()V
-HSPLandroid/security/keystore/AndroidKeyStoreUnauthenticatedAESCipherSpi$CBC$PKCS7Padding;->finalize()V
-HSPLandroid/security/keystore/AndroidKeyStoreUnauthenticatedAESCipherSpi$CBC;-><init>(I)V
-HSPLandroid/security/keystore/AndroidKeyStoreUnauthenticatedAESCipherSpi;-><init>(IIZ)V
-HSPLandroid/security/keystore/AndroidKeyStoreUnauthenticatedAESCipherSpi;->addAlgorithmSpecificParametersToBegin(Landroid/security/keymaster/KeymasterArguments;)V
-HSPLandroid/security/keystore/AndroidKeyStoreUnauthenticatedAESCipherSpi;->getAdditionalEntropyAmountForBegin()I
-HSPLandroid/security/keystore/AndroidKeyStoreUnauthenticatedAESCipherSpi;->getAdditionalEntropyAmountForFinish()I
-HSPLandroid/security/keystore/AndroidKeyStoreUnauthenticatedAESCipherSpi;->initKey(ILjava/security/Key;)V
-HSPLandroid/security/keystore/AndroidKeyStoreUnauthenticatedAESCipherSpi;->loadAlgorithmSpecificParametersFromBeginResult(Landroid/security/keymaster/KeymasterArguments;)V
-HSPLandroid/security/keystore/AndroidKeyStoreUnauthenticatedAESCipherSpi;->resetAll()V
-HSPLandroid/security/keystore/AndroidKeyStoreUnauthenticatedAESCipherSpi;->resetWhilePreservingInitState()V
 HSPLandroid/security/keystore/ArrayUtils;->cloneIfNotEmpty([B)[B
 HSPLandroid/security/keystore/ArrayUtils;->cloneIfNotEmpty([Ljava/lang/String;)[Ljava/lang/String;
 HSPLandroid/security/keystore/ArrayUtils;->concat([BII[BII)[B
@@ -20100,11 +17914,6 @@
 HSPLandroid/security/keystore/ArrayUtils;->copy([BI[BII)I
 HSPLandroid/security/keystore/ArrayUtils;->nullToEmpty([Ljava/lang/String;)[Ljava/lang/String;
 HSPLandroid/security/keystore/ArrayUtils;->subarray([BII)[B
-HSPLandroid/security/keystore/DelegatingX509Certificate;-><init>(Ljava/security/cert/X509Certificate;)V
-HSPLandroid/security/keystore/DelegatingX509Certificate;->getPublicKey()Ljava/security/PublicKey;
-HSPLandroid/security/keystore/IKeystoreExportKeyCallback$Stub;-><init>()V
-HSPLandroid/security/keystore/IKeystoreExportKeyCallback$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/security/keystore/IKeystoreExportKeyCallback$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/security/keystore/IKeystoreKeyCharacteristicsCallback$Stub;-><init>()V
 HSPLandroid/security/keystore/IKeystoreKeyCharacteristicsCallback$Stub;->asBinder()Landroid/os/IBinder;
 HSPLandroid/security/keystore/IKeystoreKeyCharacteristicsCallback$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
@@ -20120,13 +17929,11 @@
 HSPLandroid/security/keystore/IKeystoreService$Stub$Proxy;->begin(Landroid/security/keystore/IKeystoreOperationResultCallback;Landroid/os/IBinder;Ljava/lang/String;IZLandroid/security/keymaster/KeymasterArguments;[BI)I
 HSPLandroid/security/keystore/IKeystoreService$Stub$Proxy;->del(Ljava/lang/String;I)I
 HSPLandroid/security/keystore/IKeystoreService$Stub$Proxy;->exist(Ljava/lang/String;I)I
-HSPLandroid/security/keystore/IKeystoreService$Stub$Proxy;->exportKey(Landroid/security/keystore/IKeystoreExportKeyCallback;Ljava/lang/String;ILandroid/security/keymaster/KeymasterBlob;Landroid/security/keymaster/KeymasterBlob;I)I
 HSPLandroid/security/keystore/IKeystoreService$Stub$Proxy;->finish(Landroid/security/keystore/IKeystoreOperationResultCallback;Landroid/os/IBinder;Landroid/security/keymaster/KeymasterArguments;[B[B[B)I
 HSPLandroid/security/keystore/IKeystoreService$Stub$Proxy;->generateKey(Landroid/security/keystore/IKeystoreKeyCharacteristicsCallback;Ljava/lang/String;Landroid/security/keymaster/KeymasterArguments;[BII)I
 HSPLandroid/security/keystore/IKeystoreService$Stub$Proxy;->get(Ljava/lang/String;I)[B
 HSPLandroid/security/keystore/IKeystoreService$Stub$Proxy;->getKeyCharacteristics(Landroid/security/keystore/IKeystoreKeyCharacteristicsCallback;Ljava/lang/String;Landroid/security/keymaster/KeymasterBlob;Landroid/security/keymaster/KeymasterBlob;I)I
 PLandroid/security/keystore/IKeystoreService$Stub$Proxy;->getState(I)I
-HSPLandroid/security/keystore/IKeystoreService$Stub$Proxy;->getmtime(Ljava/lang/String;I)J
 HSPLandroid/security/keystore/IKeystoreService$Stub$Proxy;->grant(Ljava/lang/String;I)Ljava/lang/String;
 HSPLandroid/security/keystore/IKeystoreService$Stub$Proxy;->insert(Ljava/lang/String;[BII)I
 HSPLandroid/security/keystore/IKeystoreService$Stub$Proxy;->list(Ljava/lang/String;I)[Ljava/lang/String;
@@ -20136,16 +17943,13 @@
 HSPLandroid/security/keystore/IKeystoreService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/security/keystore/IKeystoreService;
 HSPLandroid/security/keystore/KeyGenParameterSpec$Builder;-><init>(Ljava/lang/String;I)V
 HSPLandroid/security/keystore/KeyGenParameterSpec$Builder;->build()Landroid/security/keystore/KeyGenParameterSpec;
-HSPLandroid/security/keystore/KeyGenParameterSpec$Builder;->setAlgorithmParameterSpec(Ljava/security/spec/AlgorithmParameterSpec;)Landroid/security/keystore/KeyGenParameterSpec$Builder;
 HSPLandroid/security/keystore/KeyGenParameterSpec$Builder;->setAttestationChallenge([B)Landroid/security/keystore/KeyGenParameterSpec$Builder;
-HSPLandroid/security/keystore/KeyGenParameterSpec$Builder;->setBlockModes([Ljava/lang/String;)Landroid/security/keystore/KeyGenParameterSpec$Builder;
-HSPLandroid/security/keystore/KeyGenParameterSpec$Builder;->setDigests([Ljava/lang/String;)Landroid/security/keystore/KeyGenParameterSpec$Builder;
-HSPLandroid/security/keystore/KeyGenParameterSpec$Builder;->setEncryptionPaddings([Ljava/lang/String;)Landroid/security/keystore/KeyGenParameterSpec$Builder;
+HSPLandroid/security/keystore/KeyGenParameterSpec$Builder;->setUserAuthenticationValidityDurationSeconds(I)Landroid/security/keystore/KeyGenParameterSpec$Builder;
 HSPLandroid/security/keystore/KeyGenParameterSpec;-><init>(Ljava/lang/String;IILjava/security/spec/AlgorithmParameterSpec;Ljavax/security/auth/x500/X500Principal;Ljava/math/BigInteger;Ljava/util/Date;Ljava/util/Date;Ljava/util/Date;Ljava/util/Date;Ljava/util/Date;I[Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;ZZIIZ[BZZZZZZZ)V
-HSPLandroid/security/keystore/KeyGenParameterSpec;-><init>(Ljava/lang/String;IILjava/security/spec/AlgorithmParameterSpec;Ljavax/security/auth/x500/X500Principal;Ljava/math/BigInteger;Ljava/util/Date;Ljava/util/Date;Ljava/util/Date;Ljava/util/Date;Ljava/util/Date;I[Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;ZZIZ[BZZZZZZZ)V
 HSPLandroid/security/keystore/KeyGenParameterSpec;->getAlgorithmParameterSpec()Ljava/security/spec/AlgorithmParameterSpec;
 HSPLandroid/security/keystore/KeyGenParameterSpec;->getAttestationChallenge()[B
 HSPLandroid/security/keystore/KeyGenParameterSpec;->getBlockModes()[Ljava/lang/String;
+HSPLandroid/security/keystore/KeyGenParameterSpec;->getBoundToSpecificSecureUserId()J
 HSPLandroid/security/keystore/KeyGenParameterSpec;->getCertificateNotAfter()Ljava/util/Date;
 HSPLandroid/security/keystore/KeyGenParameterSpec;->getCertificateNotBefore()Ljava/util/Date;
 HSPLandroid/security/keystore/KeyGenParameterSpec;->getCertificateSerialNumber()Ljava/math/BigInteger;
@@ -20171,25 +17975,14 @@
 HSPLandroid/security/keystore/KeyGenParameterSpec;->isUserAuthenticationValidWhileOnBody()Z
 HSPLandroid/security/keystore/KeyGenParameterSpec;->isUserConfirmationRequired()Z
 HSPLandroid/security/keystore/KeyGenParameterSpec;->isUserPresenceRequired()Z
-HSPLandroid/security/keystore/KeyInfo;->getUserAuthenticationValidityDurationSeconds()I
-HSPLandroid/security/keystore/KeyInfo;->isInsideSecureHardware()Z
-HSPLandroid/security/keystore/KeyProperties$BlockMode;->allFromKeymaster(Ljava/util/Collection;)[Ljava/lang/String;
 HSPLandroid/security/keystore/KeyProperties$BlockMode;->allToKeymaster([Ljava/lang/String;)[I
-HSPLandroid/security/keystore/KeyProperties$BlockMode;->fromKeymaster(I)Ljava/lang/String;
 HSPLandroid/security/keystore/KeyProperties$BlockMode;->toKeymaster(Ljava/lang/String;)I
-HSPLandroid/security/keystore/KeyProperties$Digest;->allFromKeymaster(Ljava/util/Collection;)[Ljava/lang/String;
 HSPLandroid/security/keystore/KeyProperties$Digest;->allToKeymaster([Ljava/lang/String;)[I
-HSPLandroid/security/keystore/KeyProperties$Digest;->fromKeymasterToSignatureAlgorithmDigest(I)Ljava/lang/String;
 HSPLandroid/security/keystore/KeyProperties$Digest;->toKeymaster(Ljava/lang/String;)I
 HSPLandroid/security/keystore/KeyProperties$EncryptionPadding;->allToKeymaster([Ljava/lang/String;)[I
-HSPLandroid/security/keystore/KeyProperties$EncryptionPadding;->fromKeymaster(I)Ljava/lang/String;
 HSPLandroid/security/keystore/KeyProperties$EncryptionPadding;->toKeymaster(Ljava/lang/String;)I
-HSPLandroid/security/keystore/KeyProperties$KeyAlgorithm;->fromKeymasterAsymmetricKeyAlgorithm(I)Ljava/lang/String;
 HSPLandroid/security/keystore/KeyProperties$KeyAlgorithm;->fromKeymasterSecretKeyAlgorithm(II)Ljava/lang/String;
-HSPLandroid/security/keystore/KeyProperties$Origin;->fromKeymaster(I)I
-HSPLandroid/security/keystore/KeyProperties$Purpose;->allFromKeymaster(Ljava/util/Collection;)I
 HSPLandroid/security/keystore/KeyProperties$Purpose;->allToKeymaster(I)[I
-HSPLandroid/security/keystore/KeyProperties$Purpose;->fromKeymaster(I)I
 HSPLandroid/security/keystore/KeyProperties$Purpose;->toKeymaster(I)I
 HSPLandroid/security/keystore/KeyProperties$SignaturePadding;->allToKeymaster([Ljava/lang/String;)[I
 HSPLandroid/security/keystore/KeyProperties;->access$000(I)[I
@@ -20208,6 +18001,7 @@
 HSPLandroid/security/keystore/KeyStoreCryptoOperationUtils;->getRandomBytesToMixIntoKeystoreRng(Ljava/security/SecureRandom;I)[B
 HSPLandroid/security/keystore/KeymasterUtils;->addUserAuthArgs(Landroid/security/keymaster/KeymasterArguments;Landroid/security/keystore/UserAuthArgs;)V
 HSPLandroid/security/keystore/KeymasterUtils;->getDigestOutputSizeBits(I)I
+HSPLandroid/security/keystore/KeymasterUtils;->getRootSid()J
 HSPLandroid/security/keystore/KeystoreResponse$1;->createFromParcel(Landroid/os/Parcel;)Landroid/security/keystore/KeystoreResponse;
 HSPLandroid/security/keystore/KeystoreResponse$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/security/keystore/KeystoreResponse;-><init>(ILjava/lang/String;)V
@@ -20216,7 +18010,7 @@
 HSPLandroid/security/keystore/Utils;->cloneIfNotNull([B)[B
 HPLandroid/security/keystore/recovery/KeyChainProtectionParams$Builder;-><init>()V
 HPLandroid/security/keystore/recovery/KeyChainProtectionParams$Builder;->build()Landroid/security/keystore/recovery/KeyChainProtectionParams;
-PLandroid/security/keystore/recovery/KeyChainProtectionParams$Builder;->setKeyDerivationParams(Landroid/security/keystore/recovery/KeyDerivationParams;)Landroid/security/keystore/recovery/KeyChainProtectionParams$Builder;
+HPLandroid/security/keystore/recovery/KeyChainProtectionParams$Builder;->setKeyDerivationParams(Landroid/security/keystore/recovery/KeyDerivationParams;)Landroid/security/keystore/recovery/KeyChainProtectionParams$Builder;
 HPLandroid/security/keystore/recovery/KeyChainProtectionParams$Builder;->setLockScreenUiFormat(I)Landroid/security/keystore/recovery/KeyChainProtectionParams$Builder;
 HPLandroid/security/keystore/recovery/KeyChainProtectionParams$Builder;->setUserSecretType(I)Landroid/security/keystore/recovery/KeyChainProtectionParams$Builder;
 HPLandroid/security/keystore/recovery/KeyChainProtectionParams;-><init>()V
@@ -20231,14 +18025,14 @@
 PLandroid/security/keystore/recovery/KeyChainProtectionParams;->access$402(Landroid/security/keystore/recovery/KeyChainProtectionParams;[B)[B
 HPLandroid/security/keystore/recovery/KeyChainSnapshot$Builder;-><init>()V
 HPLandroid/security/keystore/recovery/KeyChainSnapshot$Builder;->build()Landroid/security/keystore/recovery/KeyChainSnapshot;
-PLandroid/security/keystore/recovery/KeyChainSnapshot$Builder;->setCounterId(J)Landroid/security/keystore/recovery/KeyChainSnapshot$Builder;
-PLandroid/security/keystore/recovery/KeyChainSnapshot$Builder;->setEncryptedRecoveryKeyBlob([B)Landroid/security/keystore/recovery/KeyChainSnapshot$Builder;
-PLandroid/security/keystore/recovery/KeyChainSnapshot$Builder;->setKeyChainProtectionParams(Ljava/util/List;)Landroid/security/keystore/recovery/KeyChainSnapshot$Builder;
-PLandroid/security/keystore/recovery/KeyChainSnapshot$Builder;->setMaxAttempts(I)Landroid/security/keystore/recovery/KeyChainSnapshot$Builder;
-PLandroid/security/keystore/recovery/KeyChainSnapshot$Builder;->setServerParams([B)Landroid/security/keystore/recovery/KeyChainSnapshot$Builder;
-PLandroid/security/keystore/recovery/KeyChainSnapshot$Builder;->setSnapshotVersion(I)Landroid/security/keystore/recovery/KeyChainSnapshot$Builder;
-PLandroid/security/keystore/recovery/KeyChainSnapshot$Builder;->setTrustedHardwareCertPath(Ljava/security/cert/CertPath;)Landroid/security/keystore/recovery/KeyChainSnapshot$Builder;
-PLandroid/security/keystore/recovery/KeyChainSnapshot$Builder;->setWrappedApplicationKeys(Ljava/util/List;)Landroid/security/keystore/recovery/KeyChainSnapshot$Builder;
+HPLandroid/security/keystore/recovery/KeyChainSnapshot$Builder;->setCounterId(J)Landroid/security/keystore/recovery/KeyChainSnapshot$Builder;
+HPLandroid/security/keystore/recovery/KeyChainSnapshot$Builder;->setEncryptedRecoveryKeyBlob([B)Landroid/security/keystore/recovery/KeyChainSnapshot$Builder;
+HPLandroid/security/keystore/recovery/KeyChainSnapshot$Builder;->setKeyChainProtectionParams(Ljava/util/List;)Landroid/security/keystore/recovery/KeyChainSnapshot$Builder;
+HPLandroid/security/keystore/recovery/KeyChainSnapshot$Builder;->setMaxAttempts(I)Landroid/security/keystore/recovery/KeyChainSnapshot$Builder;
+HPLandroid/security/keystore/recovery/KeyChainSnapshot$Builder;->setServerParams([B)Landroid/security/keystore/recovery/KeyChainSnapshot$Builder;
+HPLandroid/security/keystore/recovery/KeyChainSnapshot$Builder;->setSnapshotVersion(I)Landroid/security/keystore/recovery/KeyChainSnapshot$Builder;
+HPLandroid/security/keystore/recovery/KeyChainSnapshot$Builder;->setTrustedHardwareCertPath(Ljava/security/cert/CertPath;)Landroid/security/keystore/recovery/KeyChainSnapshot$Builder;
+HPLandroid/security/keystore/recovery/KeyChainSnapshot$Builder;->setWrappedApplicationKeys(Ljava/util/List;)Landroid/security/keystore/recovery/KeyChainSnapshot$Builder;
 HPLandroid/security/keystore/recovery/KeyChainSnapshot;-><init>()V
 PLandroid/security/keystore/recovery/KeyChainSnapshot;-><init>(Landroid/security/keystore/recovery/KeyChainSnapshot$1;)V
 PLandroid/security/keystore/recovery/KeyChainSnapshot;->access$102(Landroid/security/keystore/recovery/KeyChainSnapshot;I)I
@@ -20256,14 +18050,8 @@
 PLandroid/security/keystore/recovery/KeyChainSnapshot;->access$802(Landroid/security/keystore/recovery/KeyChainSnapshot;[B)[B
 PLandroid/security/keystore/recovery/KeyDerivationParams;-><init>(I[BI)V
 HPLandroid/security/keystore/recovery/RecoveryCertPath;-><init>([B)V
-PLandroid/security/keystore/recovery/RecoveryCertPath;->createRecoveryCertPath(Ljava/security/cert/CertPath;)Landroid/security/keystore/recovery/RecoveryCertPath;
+HPLandroid/security/keystore/recovery/RecoveryCertPath;->createRecoveryCertPath(Ljava/security/cert/CertPath;)Landroid/security/keystore/recovery/RecoveryCertPath;
 HPLandroid/security/keystore/recovery/RecoveryCertPath;->encodeCertPath(Ljava/security/cert/CertPath;)[B
-HSPLandroid/security/keystore/recovery/RecoveryController;->getInstance(Landroid/content/Context;)Landroid/security/keystore/recovery/RecoveryController;
-HSPLandroid/security/keystore/recovery/RecoveryController;->getRecoverySecretTypes()[I
-HSPLandroid/security/keystore/recovery/RecoveryController;->initRecoveryService(Ljava/lang/String;[B[B)V
-HSPLandroid/security/keystore/recovery/RecoveryController;->setRecoverySecretTypes([I)V
-HSPLandroid/security/keystore/recovery/RecoveryController;->setServerParams([B)V
-HSPLandroid/security/keystore/recovery/RecoveryController;->setSnapshotCreatedPendingIntent(Landroid/app/PendingIntent;)V
 HPLandroid/security/keystore/recovery/WrappedApplicationKey$Builder;-><init>()V
 HPLandroid/security/keystore/recovery/WrappedApplicationKey$Builder;->build()Landroid/security/keystore/recovery/WrappedApplicationKey;
 HPLandroid/security/keystore/recovery/WrappedApplicationKey$Builder;->setAlias(Ljava/lang/String;)Landroid/security/keystore/recovery/WrappedApplicationKey$Builder;
@@ -20279,9 +18067,7 @@
 HSPLandroid/security/net/config/ApplicationConfig;->getConfigForHostname(Ljava/lang/String;)Landroid/security/net/config/NetworkSecurityConfig;
 HSPLandroid/security/net/config/ApplicationConfig;->getDefaultInstance()Landroid/security/net/config/ApplicationConfig;
 HSPLandroid/security/net/config/ApplicationConfig;->getTrustManager()Ljavax/net/ssl/X509TrustManager;
-HSPLandroid/security/net/config/ApplicationConfig;->hasPerDomainConfigs()Z
 HSPLandroid/security/net/config/ApplicationConfig;->isCleartextTrafficPermitted()Z
-HSPLandroid/security/net/config/ApplicationConfig;->isCleartextTrafficPermitted(Ljava/lang/String;)Z
 HSPLandroid/security/net/config/ApplicationConfig;->setDefaultInstance(Landroid/security/net/config/ApplicationConfig;)V
 HSPLandroid/security/net/config/CertificatesEntryRef;-><init>(Landroid/security/net/config/CertificateSource;Z)V
 HSPLandroid/security/net/config/CertificatesEntryRef;->findAllCertificatesByIssuerAndSignature(Ljava/security/cert/X509Certificate;)Ljava/util/Set;
@@ -20289,7 +18075,6 @@
 HSPLandroid/security/net/config/CertificatesEntryRef;->overridesPins()Z
 HSPLandroid/security/net/config/ConfigNetworkSecurityPolicy;-><init>(Landroid/security/net/config/ApplicationConfig;)V
 HSPLandroid/security/net/config/ConfigNetworkSecurityPolicy;->isCertificateTransparencyVerificationRequired(Ljava/lang/String;)Z
-HSPLandroid/security/net/config/ConfigNetworkSecurityPolicy;->isCleartextTrafficPermitted()Z
 HSPLandroid/security/net/config/ConfigNetworkSecurityPolicy;->isCleartextTrafficPermitted(Ljava/lang/String;)Z
 HSPLandroid/security/net/config/DirectoryCertificateSource$1;-><init>(Landroid/security/net/config/DirectoryCertificateSource;Ljava/security/cert/X509Certificate;)V
 HSPLandroid/security/net/config/DirectoryCertificateSource$3;-><init>(Landroid/security/net/config/DirectoryCertificateSource;Ljava/security/cert/X509Certificate;)V
@@ -20305,9 +18090,6 @@
 HSPLandroid/security/net/config/DirectoryCertificateSource;->readCertificate(Ljava/lang/String;)Ljava/security/cert/X509Certificate;
 HSPLandroid/security/net/config/Domain;->hashCode()I
 HSPLandroid/security/net/config/KeyStoreCertificateSource;-><init>(Ljava/security/KeyStore;)V
-HSPLandroid/security/net/config/KeyStoreCertificateSource;->ensureInitialized()V
-HSPLandroid/security/net/config/KeyStoreCertificateSource;->findAllByIssuerAndSignature(Ljava/security/cert/X509Certificate;)Ljava/util/Set;
-HSPLandroid/security/net/config/KeyStoreCertificateSource;->findBySubjectAndPublicKey(Ljava/security/cert/X509Certificate;)Ljava/security/cert/X509Certificate;
 HSPLandroid/security/net/config/KeyStoreConfigSource;-><init>(Ljava/security/KeyStore;)V
 HSPLandroid/security/net/config/KeyStoreConfigSource;->getDefaultConfig()Landroid/security/net/config/NetworkSecurityConfig;
 HSPLandroid/security/net/config/KeyStoreConfigSource;->getPerDomainConfigs()Ljava/util/Set;
@@ -20323,7 +18105,6 @@
 HSPLandroid/security/net/config/NetworkSecurityConfig$1;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
 HSPLandroid/security/net/config/NetworkSecurityConfig$Builder;-><init>()V
 HSPLandroid/security/net/config/NetworkSecurityConfig$Builder;->addCertificatesEntryRef(Landroid/security/net/config/CertificatesEntryRef;)Landroid/security/net/config/NetworkSecurityConfig$Builder;
-HSPLandroid/security/net/config/NetworkSecurityConfig$Builder;->addCertificatesEntryRefs(Ljava/util/Collection;)Landroid/security/net/config/NetworkSecurityConfig$Builder;
 HSPLandroid/security/net/config/NetworkSecurityConfig$Builder;->build()Landroid/security/net/config/NetworkSecurityConfig;
 HSPLandroid/security/net/config/NetworkSecurityConfig$Builder;->getEffectiveCertificatesEntryRefs()Ljava/util/List;
 HSPLandroid/security/net/config/NetworkSecurityConfig$Builder;->getEffectiveCleartextTrafficPermitted()Z
@@ -20346,11 +18127,9 @@
 HSPLandroid/security/net/config/NetworkSecurityConfigProvider;->install(Landroid/content/Context;)V
 HSPLandroid/security/net/config/NetworkSecurityTrustManager;-><init>(Landroid/security/net/config/NetworkSecurityConfig;)V
 HSPLandroid/security/net/config/NetworkSecurityTrustManager;->checkPins(Ljava/util/List;)V
-HSPLandroid/security/net/config/NetworkSecurityTrustManager;->checkServerTrusted([Ljava/security/cert/X509Certificate;Ljava/lang/String;)V
 HSPLandroid/security/net/config/NetworkSecurityTrustManager;->checkServerTrusted([Ljava/security/cert/X509Certificate;Ljava/lang/String;Ljava/lang/String;)Ljava/util/List;
 HSPLandroid/security/net/config/NetworkSecurityTrustManager;->checkServerTrusted([Ljava/security/cert/X509Certificate;Ljava/lang/String;Ljava/net/Socket;)V
 HSPLandroid/security/net/config/RootTrustManager;-><init>(Landroid/security/net/config/ApplicationConfig;)V
-HSPLandroid/security/net/config/RootTrustManager;->checkServerTrusted([Ljava/security/cert/X509Certificate;Ljava/lang/String;)V
 HSPLandroid/security/net/config/RootTrustManager;->checkServerTrusted([Ljava/security/cert/X509Certificate;Ljava/lang/String;Ljava/lang/String;)Ljava/util/List;
 HSPLandroid/security/net/config/RootTrustManager;->checkServerTrusted([Ljava/security/cert/X509Certificate;Ljava/lang/String;Ljava/net/Socket;)V
 HSPLandroid/security/net/config/RootTrustManagerFactorySpi;-><init>()V
@@ -20371,8 +18150,6 @@
 HSPLandroid/security/net/config/UserCertificateSource$NoPreloadHolder;->access$100()Landroid/security/net/config/UserCertificateSource;
 HSPLandroid/security/net/config/UserCertificateSource;-><init>()V
 HSPLandroid/security/net/config/UserCertificateSource;-><init>(Landroid/security/net/config/UserCertificateSource$1;)V
-HSPLandroid/security/net/config/UserCertificateSource;->findAllByIssuerAndSignature(Ljava/security/cert/X509Certificate;)Ljava/util/Set;
-HSPLandroid/security/net/config/UserCertificateSource;->findBySubjectAndPublicKey(Ljava/security/cert/X509Certificate;)Ljava/security/cert/X509Certificate;
 HSPLandroid/security/net/config/UserCertificateSource;->getInstance()Landroid/security/net/config/UserCertificateSource;
 HSPLandroid/security/net/config/XmlConfigSource;-><init>(Landroid/content/Context;ILandroid/content/pm/ApplicationInfo;)V
 HSPLandroid/security/net/config/XmlConfigSource;->addDebugAnchorsIfNeeded(Landroid/security/net/config/NetworkSecurityConfig$Builder;Landroid/security/net/config/NetworkSecurityConfig$Builder;)V
@@ -20391,14 +18168,9 @@
 HPLandroid/service/appprediction/IPredictionService$Stub$Proxy;->requestPredictionUpdate(Landroid/app/prediction/AppPredictionSessionId;)V
 HSPLandroid/service/appprediction/IPredictionService$Stub;-><init>()V
 PLandroid/service/appprediction/IPredictionService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/service/appprediction/IPredictionService;
-PLandroid/service/autofill/AutofillServiceInfo;-><init>(Landroid/content/Context;Landroid/content/ComponentName;I)V
 PLandroid/service/autofill/AutofillServiceInfo;-><init>(Landroid/content/Context;Landroid/content/pm/ServiceInfo;)V
-PLandroid/service/autofill/AutofillServiceInfo;->getCompatibilityPackages()Landroid/util/ArrayMap;
-PLandroid/service/autofill/AutofillServiceInfo;->getServiceInfo()Landroid/content/pm/ServiceInfo;
 PLandroid/service/autofill/AutofillServiceInfo;->getServiceInfoOrThrow(Landroid/content/ComponentName;I)Landroid/content/pm/ServiceInfo;
 PLandroid/service/autofill/AutofillServiceInfo;->parseCompatibilityPackages(Lorg/xmlpull/v1/XmlPullParser;Landroid/content/res/Resources;)Landroid/util/ArrayMap;
-HSPLandroid/service/autofill/Dataset$1;-><init>()V
-HSPLandroid/service/autofill/Dataset;-><clinit>()V
 HSPLandroid/service/autofill/FillContext;-><init>(ILandroid/app/assist/AssistStructure;Landroid/view/autofill/AutofillId;)V
 HSPLandroid/service/autofill/FillContext;->getStructure()Landroid/app/assist/AssistStructure;
 HSPLandroid/service/autofill/FillRequest;->getFlags()I
@@ -20429,46 +18201,35 @@
 PLandroid/service/autofill/augmented/IAugmentedAutofillService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 PLandroid/service/autofill/augmented/IAugmentedAutofillService$Stub$Proxy;->onConnected(ZZ)V
 HPLandroid/service/autofill/augmented/IAugmentedAutofillService$Stub$Proxy;->onDestroyAllFillWindowsRequest()V
+HPLandroid/service/autofill/augmented/IAugmentedAutofillService$Stub$Proxy;->onFillRequest(ILandroid/os/IBinder;ILandroid/content/ComponentName;Landroid/view/autofill/AutofillId;Landroid/view/autofill/AutofillValue;JLandroid/view/inputmethod/InlineSuggestionsRequest;Landroid/service/autofill/augmented/IFillCallback;)V
 PLandroid/service/autofill/augmented/IAugmentedAutofillService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/service/autofill/augmented/IAugmentedAutofillService;
+HPLandroid/service/autofill/augmented/IFillCallback$Stub;->asBinder()Landroid/os/IBinder;
+HPLandroid/service/autofill/augmented/IFillCallback$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/service/contentcapture/ActivityEvent;-><clinit>()V
 HSPLandroid/service/contentcapture/ActivityEvent;-><init>(Landroid/content/ComponentName;I)V
 HPLandroid/service/contentcapture/ActivityEvent;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/service/contentcapture/ContentCaptureService;-><clinit>()V
 HSPLandroid/service/contentcapture/ContentCaptureService;->setClientState(Lcom/android/internal/os/IResultReceiver;ILandroid/os/IBinder;)V
-PLandroid/service/contentcapture/ContentCaptureServiceInfo;-><init>(Landroid/content/Context;Landroid/content/ComponentName;ZI)V
-PLandroid/service/contentcapture/ContentCaptureServiceInfo;-><init>(Landroid/content/Context;Landroid/content/pm/ServiceInfo;)V
+HPLandroid/service/contentcapture/ContentCaptureServiceInfo;-><init>(Landroid/content/Context;Landroid/content/pm/ServiceInfo;)V
 PLandroid/service/contentcapture/ContentCaptureServiceInfo;->getServiceInfo()Landroid/content/pm/ServiceInfo;
 PLandroid/service/contentcapture/ContentCaptureServiceInfo;->getServiceInfoOrThrow(Landroid/content/ComponentName;ZI)Landroid/content/pm/ServiceInfo;
+HPLandroid/service/contentcapture/FlushMetrics$1;->createFromParcel(Landroid/os/Parcel;)Landroid/service/contentcapture/FlushMetrics;
+HPLandroid/service/contentcapture/FlushMetrics$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/service/contentcapture/FlushMetrics;-><init>()V
 PLandroid/service/contentcapture/IContentCaptureService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HPLandroid/service/contentcapture/IContentCaptureService$Stub$Proxy;->onActivityEvent(Landroid/service/contentcapture/ActivityEvent;)V
 PLandroid/service/contentcapture/IContentCaptureService$Stub$Proxy;->onConnected(Landroid/os/IBinder;ZZ)V
+HPLandroid/service/contentcapture/IContentCaptureService$Stub$Proxy;->onSessionStarted(Landroid/view/contentcapture/ContentCaptureContext;IILcom/android/internal/os/IResultReceiver;I)V
 PLandroid/service/contentcapture/IContentCaptureService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/service/contentcapture/IContentCaptureService;
 PLandroid/service/contentcapture/IContentCaptureServiceCallback$Stub;->asBinder()Landroid/os/IBinder;
 HPLandroid/service/contentcapture/IContentCaptureServiceCallback$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/service/dreams/DreamManagerInternal;-><init>()V
-HSPLandroid/service/dreams/DreamService$1;-><init>(Landroid/service/dreams/DreamService;Landroid/os/IRemoteCallback;)V
-HSPLandroid/service/dreams/DreamService$1;->run()V
-HSPLandroid/service/dreams/DreamService$DreamServiceWrapper$1;-><init>(Landroid/service/dreams/DreamService$DreamServiceWrapper;Landroid/os/IBinder;ZLandroid/os/IRemoteCallback;)V
-HSPLandroid/service/dreams/DreamService$DreamServiceWrapper$1;->run()V
-HSPLandroid/service/dreams/DreamService$DreamServiceWrapper$2;-><init>(Landroid/service/dreams/DreamService$DreamServiceWrapper;)V
-HSPLandroid/service/dreams/DreamService$DreamServiceWrapper$2;->run()V
-HSPLandroid/service/dreams/DreamService$DreamServiceWrapper$3;-><init>(Landroid/service/dreams/DreamService$DreamServiceWrapper;)V
-HSPLandroid/service/dreams/DreamService$DreamServiceWrapper$3;->run()V
 HSPLandroid/service/dreams/DreamService$DreamServiceWrapper;-><init>(Landroid/service/dreams/DreamService;)V
-HSPLandroid/service/dreams/DreamService$DreamServiceWrapper;-><init>(Landroid/service/dreams/DreamService;Landroid/service/dreams/DreamService$1;)V
 HSPLandroid/service/dreams/DreamService$DreamServiceWrapper;->attach(Landroid/os/IBinder;ZLandroid/os/IRemoteCallback;)V
 HSPLandroid/service/dreams/DreamService$DreamServiceWrapper;->detach()V
 HSPLandroid/service/dreams/DreamService$DreamServiceWrapper;->wakeUp()V
 HSPLandroid/service/dreams/DreamService;-><init>()V
-HSPLandroid/service/dreams/DreamService;->access$100(Landroid/service/dreams/DreamService;)Landroid/view/Window;
-HSPLandroid/service/dreams/DreamService;->access$200(Landroid/service/dreams/DreamService;)Z
-HSPLandroid/service/dreams/DreamService;->access$300(Landroid/service/dreams/DreamService;)Z
-HSPLandroid/service/dreams/DreamService;->access$502(Landroid/service/dreams/DreamService;Z)Z
 HSPLandroid/service/dreams/DreamService;->access$600(Landroid/service/dreams/DreamService;Landroid/os/IBinder;ZLandroid/os/IRemoteCallback;)V
-HSPLandroid/service/dreams/DreamService;->access$700(Landroid/service/dreams/DreamService;)Landroid/os/Handler;
-HSPLandroid/service/dreams/DreamService;->access$800(Landroid/service/dreams/DreamService;)V
-HSPLandroid/service/dreams/DreamService;->access$900(Landroid/service/dreams/DreamService;Z)V
 HSPLandroid/service/dreams/DreamService;->attach(Landroid/os/IBinder;ZLandroid/os/IRemoteCallback;)V
 HSPLandroid/service/dreams/DreamService;->clampAbsoluteBrightness(I)I
 HSPLandroid/service/dreams/DreamService;->detach()V
@@ -20514,9 +18275,6 @@
 HPLandroid/service/notification/Adjustment$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HPLandroid/service/notification/Adjustment;-><init>(Landroid/os/Parcel;)V
 HSPLandroid/service/notification/Adjustment;-><init>(Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;Ljava/lang/CharSequence;I)V
-PLandroid/service/notification/Adjustment;->getKey()Ljava/lang/String;
-PLandroid/service/notification/Adjustment;->getSignals()Landroid/os/Bundle;
-PLandroid/service/notification/Adjustment;->getUser()I
 HSPLandroid/service/notification/Condition$1;->createFromParcel(Landroid/os/Parcel;)Landroid/service/notification/Condition;
 HSPLandroid/service/notification/Condition$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/service/notification/Condition;-><init>(Landroid/net/Uri;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;III)V
@@ -20542,14 +18300,12 @@
 HSPLandroid/service/notification/ConditionProviderService;->notifyCondition(Landroid/service/notification/Condition;)V
 HSPLandroid/service/notification/ConditionProviderService;->notifyConditions([Landroid/service/notification/Condition;)V
 HSPLandroid/service/notification/ConditionProviderService;->onBind(Landroid/content/Intent;)Landroid/os/IBinder;
-HSPLandroid/service/notification/ConditionProviderService;->requestUnbind()V
 PLandroid/service/notification/IConditionProvider$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HPLandroid/service/notification/IConditionProvider$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-PLandroid/service/notification/IConditionProvider$Stub$Proxy;->onConnected()V
+HPLandroid/service/notification/IConditionProvider$Stub$Proxy;->onConnected()V
 HSPLandroid/service/notification/IConditionProvider$Stub;-><init>()V
 HSPLandroid/service/notification/IConditionProvider$Stub;->asBinder()Landroid/os/IBinder;
 HPLandroid/service/notification/IConditionProvider$Stub;->asInterface(Landroid/os/IBinder;)Landroid/service/notification/IConditionProvider;
-HSPLandroid/service/notification/IConditionProvider$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/service/notification/INotificationListener$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HSPLandroid/service/notification/INotificationListener$Stub$Proxy;->asBinder()Landroid/os/IBinder;
 HSPLandroid/service/notification/INotificationListener$Stub$Proxy;->onListenerConnected(Landroid/service/notification/NotificationRankingUpdate;)V
@@ -20568,7 +18324,6 @@
 HSPLandroid/service/notification/INotificationListener$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/service/notification/IStatusBarNotificationHolder$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HSPLandroid/service/notification/IStatusBarNotificationHolder$Stub$Proxy;->get()Landroid/service/notification/StatusBarNotification;
-HSPLandroid/service/notification/IStatusBarNotificationHolder$Stub;-><init>()V
 HSPLandroid/service/notification/IStatusBarNotificationHolder$Stub;->asBinder()Landroid/os/IBinder;
 HSPLandroid/service/notification/IStatusBarNotificationHolder$Stub;->asInterface(Landroid/os/IBinder;)Landroid/service/notification/IStatusBarNotificationHolder;
 HSPLandroid/service/notification/IStatusBarNotificationHolder$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
@@ -20595,6 +18350,7 @@
 HSPLandroid/service/notification/NotificationListenerService$Ranking;->getSmartReplies()Ljava/util/List;
 HSPLandroid/service/notification/NotificationListenerService$Ranking;->getSuppressedVisualEffects()I
 HSPLandroid/service/notification/NotificationListenerService$Ranking;->getVisibilityOverride()I
+HSPLandroid/service/notification/NotificationListenerService$Ranking;->importanceToString(I)Ljava/lang/String;
 HSPLandroid/service/notification/NotificationListenerService$Ranking;->isAmbient()Z
 HSPLandroid/service/notification/NotificationListenerService$Ranking;->isConversation()Z
 HSPLandroid/service/notification/NotificationListenerService$Ranking;->isSuspended()Z
@@ -20643,7 +18399,6 @@
 HSPLandroid/service/notification/NotificationRankingUpdate;->getRankingMap()Landroid/service/notification/NotificationListenerService$RankingMap;
 HSPLandroid/service/notification/NotificationRankingUpdate;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/service/notification/NotificationStats;-><init>()V
-PLandroid/service/notification/NotificationStats;->hasSeen()Z
 HPLandroid/service/notification/NotificationStats;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/service/notification/ScheduleCalendar;-><init>()V
 HSPLandroid/service/notification/ScheduleCalendar;->addDays(JI)J
@@ -20671,6 +18426,7 @@
 HSPLandroid/service/notification/StatusBarNotification;->getGroupLogTag()Ljava/lang/String;
 HSPLandroid/service/notification/StatusBarNotification;->getId()I
 HSPLandroid/service/notification/StatusBarNotification;->getInitialPid()I
+HSPLandroid/service/notification/StatusBarNotification;->getInstanceId()Lcom/android/internal/logging/InstanceId;
 HSPLandroid/service/notification/StatusBarNotification;->getKey()Ljava/lang/String;
 HSPLandroid/service/notification/StatusBarNotification;->getLogMaker()Landroid/metrics/LogMaker;
 HSPLandroid/service/notification/StatusBarNotification;->getNotification()Landroid/app/Notification;
@@ -20690,6 +18446,7 @@
 HSPLandroid/service/notification/StatusBarNotification;->isGroup()Z
 HSPLandroid/service/notification/StatusBarNotification;->isOngoing()Z
 HSPLandroid/service/notification/StatusBarNotification;->key()Ljava/lang/String;
+HPLandroid/service/notification/StatusBarNotification;->setOverrideGroupKey(Ljava/lang/String;)V
 HSPLandroid/service/notification/StatusBarNotification;->shortenTag(Ljava/lang/String;)Ljava/lang/String;
 HSPLandroid/service/notification/StatusBarNotification;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/service/notification/ZenModeConfig$1;->createFromParcel(Landroid/os/Parcel;)Landroid/service/notification/ZenModeConfig;
@@ -20793,24 +18550,11 @@
 HSPLandroid/service/notification/ZenPolicy;->isCategoryAllowed(IZ)Z
 HSPLandroid/service/notification/ZenPolicy;->isVisualEffectAllowed(IZ)Z
 HSPLandroid/service/oemlock/IOemLockService$Stub;-><init>()V
-HPLandroid/service/oemlock/IOemLockService$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/service/persistentdata/IPersistentDataBlockService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/service/persistentdata/IPersistentDataBlockService$Stub$Proxy;->getFlashLockState()I
-HSPLandroid/service/persistentdata/IPersistentDataBlockService$Stub$Proxy;->getMaximumDataBlockSize()J
-HSPLandroid/service/persistentdata/IPersistentDataBlockService$Stub$Proxy;->read()[B
-HSPLandroid/service/persistentdata/IPersistentDataBlockService$Stub$Proxy;->write([B)I
 HSPLandroid/service/persistentdata/IPersistentDataBlockService$Stub;-><init>()V
-HSPLandroid/service/persistentdata/IPersistentDataBlockService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/service/persistentdata/IPersistentDataBlockService;
 HPLandroid/service/persistentdata/IPersistentDataBlockService$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/service/persistentdata/PersistentDataBlockManager;-><init>(Landroid/service/persistentdata/IPersistentDataBlockService;)V
-HSPLandroid/service/persistentdata/PersistentDataBlockManager;->getFlashLockState()I
-HSPLandroid/service/persistentdata/PersistentDataBlockManager;->getMaximumDataBlockSize()J
-HSPLandroid/service/persistentdata/PersistentDataBlockManager;->read()[B
-HSPLandroid/service/persistentdata/PersistentDataBlockManager;->write([B)I
 HSPLandroid/service/quicksettings/IQSService$Stub;-><init>()V
 HSPLandroid/service/textclassifier/ITextClassifierCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HPLandroid/service/textclassifier/ITextClassifierCallback$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/service/textclassifier/ITextClassifierCallback$Stub;-><init>()V
 HSPLandroid/service/textclassifier/ITextClassifierCallback$Stub;->asBinder()Landroid/os/IBinder;
 HSPLandroid/service/textclassifier/ITextClassifierCallback$Stub;->asInterface(Landroid/os/IBinder;)Landroid/service/textclassifier/ITextClassifierCallback;
 HSPLandroid/service/textclassifier/ITextClassifierCallback$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
@@ -20827,38 +18571,17 @@
 HSPLandroid/service/textclassifier/ITextClassifierService$Stub;-><init>()V
 HSPLandroid/service/textclassifier/ITextClassifierService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/service/textclassifier/ITextClassifierService;
 HSPLandroid/service/textclassifier/ITextClassifierService$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/service/textclassifier/TextClassifierService;->getResponse(Landroid/os/Bundle;)Landroid/os/Parcelable;
 HSPLandroid/service/textclassifier/TextClassifierService;->getServiceComponentName(Landroid/content/Context;)Landroid/content/ComponentName;
 HSPLandroid/service/textclassifier/TextClassifierService;->getServiceComponentNameByPackage(Landroid/content/Context;Ljava/lang/String;Z)Landroid/content/ComponentName;
-PLandroid/service/trust/ITrustAgentService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+HPLandroid/service/trust/ITrustAgentService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HPLandroid/service/trust/ITrustAgentService$Stub$Proxy;->onConfigure(Ljava/util/List;Landroid/os/IBinder;)V
 HPLandroid/service/trust/ITrustAgentService$Stub$Proxy;->onDeviceLocked()V
 HPLandroid/service/trust/ITrustAgentService$Stub$Proxy;->onDeviceUnlocked()V
-PLandroid/service/trust/ITrustAgentService$Stub$Proxy;->setCallback(Landroid/service/trust/ITrustAgentServiceCallback;)V
-HSPLandroid/service/trust/ITrustAgentService$Stub;-><init>()V
-PLandroid/service/trust/ITrustAgentService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/service/trust/ITrustAgentService;
-HSPLandroid/service/trust/ITrustAgentService$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/service/trust/ITrustAgentServiceCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-PLandroid/service/trust/ITrustAgentServiceCallback$Stub;-><init>()V
-PLandroid/service/trust/ITrustAgentServiceCallback$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/service/trust/TrustAgentService$1;-><init>(Landroid/service/trust/TrustAgentService;)V
-HSPLandroid/service/trust/TrustAgentService$1;->handleMessage(Landroid/os/Message;)V
-HSPLandroid/service/trust/TrustAgentService$ConfigurationData;-><init>(Ljava/util/List;Landroid/os/IBinder;)V
-HSPLandroid/service/trust/TrustAgentService$TrustAgentServiceWrapper;-><init>(Landroid/service/trust/TrustAgentService;)V
-HSPLandroid/service/trust/TrustAgentService$TrustAgentServiceWrapper;-><init>(Landroid/service/trust/TrustAgentService;Landroid/service/trust/TrustAgentService$1;)V
-HSPLandroid/service/trust/TrustAgentService$TrustAgentServiceWrapper;->onConfigure(Ljava/util/List;Landroid/os/IBinder;)V
-HSPLandroid/service/trust/TrustAgentService$TrustAgentServiceWrapper;->onDeviceLocked()V
-HSPLandroid/service/trust/TrustAgentService$TrustAgentServiceWrapper;->onDeviceUnlocked()V
-HSPLandroid/service/trust/TrustAgentService$TrustAgentServiceWrapper;->setCallback(Landroid/service/trust/ITrustAgentServiceCallback;)V
-HSPLandroid/service/trust/TrustAgentService;-><init>()V
-HSPLandroid/service/trust/TrustAgentService;->access$000(Landroid/service/trust/TrustAgentService;)Ljava/lang/Object;
-HSPLandroid/service/trust/TrustAgentService;->access$102(Landroid/service/trust/TrustAgentService;Landroid/service/trust/ITrustAgentServiceCallback;)Landroid/service/trust/ITrustAgentServiceCallback;
-HSPLandroid/service/trust/TrustAgentService;->access$400(Landroid/service/trust/TrustAgentService;)Landroid/os/Handler;
-HSPLandroid/service/trust/TrustAgentService;->access$500(Landroid/service/trust/TrustAgentService;)Z
-HSPLandroid/service/trust/TrustAgentService;->access$600(Landroid/service/trust/TrustAgentService;)Ljava/lang/Runnable;
-HSPLandroid/service/trust/TrustAgentService;->onBind(Landroid/content/Intent;)Landroid/os/IBinder;
+HPLandroid/service/trust/ITrustAgentService$Stub$Proxy;->onUnlockAttempt(Z)V
+HPLandroid/service/trust/ITrustAgentService$Stub$Proxy;->setCallback(Landroid/service/trust/ITrustAgentServiceCallback;)V
+HPLandroid/service/trust/ITrustAgentService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/service/trust/ITrustAgentService;
+HPLandroid/service/trust/ITrustAgentServiceCallback$Stub;->asBinder()Landroid/os/IBinder;
 HPLandroid/service/voice/IVoiceInteractionService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HPLandroid/service/voice/IVoiceInteractionService$Stub$Proxy;->asBinder()Landroid/os/IBinder;
 PLandroid/service/voice/IVoiceInteractionService$Stub$Proxy;->ready()V
 HPLandroid/service/voice/IVoiceInteractionService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/service/voice/IVoiceInteractionService;
 HSPLandroid/service/voice/VoiceInteractionManagerInternal;-><init>()V
@@ -20872,6 +18595,8 @@
 HSPLandroid/service/voice/VoiceInteractionServiceInfo;->getSettingsActivity()Ljava/lang/String;
 HSPLandroid/service/voice/VoiceInteractionServiceInfo;->getSupportsAssist()Z
 HSPLandroid/service/vr/IPersistentVrStateCallbacks$Stub;-><init>()V
+HSPLandroid/service/vr/IVrManager$Stub$Proxy;->getVrModeState()Z
+HSPLandroid/service/vr/IVrManager$Stub$Proxy;->registerListener(Landroid/service/vr/IVrStateCallbacks;)V
 HSPLandroid/service/vr/IVrManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/service/vr/IVrManager;
 HSPLandroid/service/vr/IVrStateCallbacks$Stub;-><init>()V
 HSPLandroid/service/vr/IVrStateCallbacks$Stub;->asBinder()Landroid/os/IBinder;
@@ -20884,12 +18609,10 @@
 HSPLandroid/service/wallpaper/IWallpaperConnection$Stub$Proxy;->onWallpaperColorsChanged(Landroid/app/WallpaperColors;I)V
 HSPLandroid/service/wallpaper/IWallpaperConnection$Stub;-><init>()V
 HSPLandroid/service/wallpaper/IWallpaperConnection$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/service/wallpaper/IWallpaperConnection$Stub;->asInterface(Landroid/os/IBinder;)Landroid/service/wallpaper/IWallpaperConnection;
 HSPLandroid/service/wallpaper/IWallpaperConnection$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/service/wallpaper/IWallpaperEngine$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HSPLandroid/service/wallpaper/IWallpaperEngine$Stub$Proxy;->requestWallpaperColors()V
 HSPLandroid/service/wallpaper/IWallpaperEngine$Stub$Proxy;->setInAmbientMode(ZJ)V
-HSPLandroid/service/wallpaper/IWallpaperEngine$Stub;-><init>()V
 HSPLandroid/service/wallpaper/IWallpaperEngine$Stub;->asBinder()Landroid/os/IBinder;
 HSPLandroid/service/wallpaper/IWallpaperEngine$Stub;->asInterface(Landroid/os/IBinder;)Landroid/service/wallpaper/IWallpaperEngine;
 HSPLandroid/service/wallpaper/IWallpaperEngine$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
@@ -20901,7 +18624,6 @@
 HSPLandroid/service/wallpaper/WallpaperService$Engine$1;-><init>(Landroid/service/wallpaper/WallpaperService$Engine;)V
 HSPLandroid/service/wallpaper/WallpaperService$Engine$2;-><init>(Landroid/service/wallpaper/WallpaperService$Engine;)V
 HSPLandroid/service/wallpaper/WallpaperService$Engine$2;->dispatchAppVisibility(Z)V
-HSPLandroid/service/wallpaper/WallpaperService$Engine$2;->dispatchWallpaperOffsets(FFFFZ)V
 HSPLandroid/service/wallpaper/WallpaperService$Engine$2;->resized(Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;ZLandroid/util/MergedConfiguration;Landroid/graphics/Rect;ZZILandroid/view/DisplayCutout$ParcelableWrapper;)V
 HSPLandroid/service/wallpaper/WallpaperService$Engine$3;-><init>(Landroid/service/wallpaper/WallpaperService$Engine;)V
 HSPLandroid/service/wallpaper/WallpaperService$Engine$3;->onDisplayChanged(I)V
@@ -20918,6 +18640,7 @@
 HSPLandroid/service/wallpaper/WallpaperService$Engine;->doVisibilityChanged(Z)V
 HSPLandroid/service/wallpaper/WallpaperService$Engine;->getSurfaceHolder()Landroid/view/SurfaceHolder;
 HSPLandroid/service/wallpaper/WallpaperService$Engine;->onApplyWindowInsets(Landroid/view/WindowInsets;)V
+HSPLandroid/service/wallpaper/WallpaperService$Engine;->onZoomChanged(F)V
 HSPLandroid/service/wallpaper/WallpaperService$Engine;->reportVisibility()V
 HSPLandroid/service/wallpaper/WallpaperService$Engine;->updateSurface(ZZZ)V
 HSPLandroid/service/wallpaper/WallpaperService$IWallpaperEngineWrapper;-><init>(Landroid/service/wallpaper/WallpaperService;Landroid/service/wallpaper/WallpaperService;Landroid/service/wallpaper/IWallpaperConnection;Landroid/os/IBinder;IZIILandroid/graphics/Rect;I)V
@@ -20938,64 +18661,13 @@
 HSPLandroid/service/watchdog/ExplicitHealthCheckService$PackageConfig;-><clinit>()V
 HSPLandroid/service/watchdog/ExplicitHealthCheckService$PackageConfig;-><init>(Landroid/os/Parcel;)V
 HSPLandroid/service/watchdog/ExplicitHealthCheckService$PackageConfig;-><init>(Landroid/os/Parcel;Landroid/service/watchdog/ExplicitHealthCheckService$1;)V
-HSPLandroid/service/watchdog/ExplicitHealthCheckService$PackageConfig;->getHealthCheckTimeoutMillis()J
-HSPLandroid/service/watchdog/ExplicitHealthCheckService$PackageConfig;->getPackageName()Ljava/lang/String;
 HSPLandroid/service/watchdog/ExplicitHealthCheckService$PackageConfig;->toString()Ljava/lang/String;
 HSPLandroid/service/watchdog/IExplicitHealthCheckService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HSPLandroid/service/watchdog/IExplicitHealthCheckService$Stub$Proxy;->getRequestedPackages(Landroid/os/RemoteCallback;)V
 HSPLandroid/service/watchdog/IExplicitHealthCheckService$Stub$Proxy;->getSupportedPackages(Landroid/os/RemoteCallback;)V
+PLandroid/service/watchdog/IExplicitHealthCheckService$Stub$Proxy;->request(Ljava/lang/String;)V
 HSPLandroid/service/watchdog/IExplicitHealthCheckService$Stub$Proxy;->setCallback(Landroid/os/RemoteCallback;)V
 HSPLandroid/service/watchdog/IExplicitHealthCheckService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/service/watchdog/IExplicitHealthCheckService;
-HSPLandroid/speech/tts/ITextToSpeechCallback$Stub;-><init>()V
-HSPLandroid/speech/tts/ITextToSpeechCallback$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/speech/tts/ITextToSpeechService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/speech/tts/ITextToSpeechService$Stub$Proxy;->getClientDefaultLanguage()[Ljava/lang/String;
-HSPLandroid/speech/tts/ITextToSpeechService$Stub$Proxy;->getDefaultVoiceNameFor(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/speech/tts/ITextToSpeechService$Stub$Proxy;->setCallback(Landroid/os/IBinder;Landroid/speech/tts/ITextToSpeechCallback;)V
-HSPLandroid/speech/tts/ITextToSpeechService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/speech/tts/ITextToSpeechService;
-HSPLandroid/speech/tts/TextToSpeech$Connection$1;-><init>(Landroid/speech/tts/TextToSpeech$Connection;)V
-HSPLandroid/speech/tts/TextToSpeech$Connection$SetupConnectionAsyncTask;-><init>(Landroid/speech/tts/TextToSpeech$Connection;Landroid/content/ComponentName;)V
-HSPLandroid/speech/tts/TextToSpeech$Connection$SetupConnectionAsyncTask;->doInBackground([Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/speech/tts/TextToSpeech$Connection$SetupConnectionAsyncTask;->doInBackground([Ljava/lang/Void;)Ljava/lang/Integer;
-HSPLandroid/speech/tts/TextToSpeech$Connection$SetupConnectionAsyncTask;->onPostExecute(Ljava/lang/Integer;)V
-HSPLandroid/speech/tts/TextToSpeech$Connection$SetupConnectionAsyncTask;->onPostExecute(Ljava/lang/Object;)V
-HSPLandroid/speech/tts/TextToSpeech$Connection;-><init>(Landroid/speech/tts/TextToSpeech;)V
-HSPLandroid/speech/tts/TextToSpeech$Connection;-><init>(Landroid/speech/tts/TextToSpeech;Landroid/speech/tts/TextToSpeech$1;)V
-HSPLandroid/speech/tts/TextToSpeech$Connection;->access$300(Landroid/speech/tts/TextToSpeech$Connection;)Landroid/speech/tts/ITextToSpeechCallback$Stub;
-HSPLandroid/speech/tts/TextToSpeech$Connection;->access$400(Landroid/speech/tts/TextToSpeech$Connection;)Landroid/speech/tts/ITextToSpeechService;
-HSPLandroid/speech/tts/TextToSpeech$Connection;->access$600(Landroid/speech/tts/TextToSpeech$Connection;)Landroid/speech/tts/TextToSpeech$Connection$SetupConnectionAsyncTask;
-HSPLandroid/speech/tts/TextToSpeech$Connection;->access$602(Landroid/speech/tts/TextToSpeech$Connection;Landroid/speech/tts/TextToSpeech$Connection$SetupConnectionAsyncTask;)Landroid/speech/tts/TextToSpeech$Connection$SetupConnectionAsyncTask;
-HSPLandroid/speech/tts/TextToSpeech$Connection;->access$702(Landroid/speech/tts/TextToSpeech$Connection;Z)Z
-HSPLandroid/speech/tts/TextToSpeech$Connection;->getCallerIdentity()Landroid/os/IBinder;
-HSPLandroid/speech/tts/TextToSpeech$Connection;->isEstablished()Z
-HSPLandroid/speech/tts/TextToSpeech$Connection;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
-HSPLandroid/speech/tts/TextToSpeech$Connection;->runAction(Landroid/speech/tts/TextToSpeech$Action;Ljava/lang/Object;Ljava/lang/String;ZZ)Ljava/lang/Object;
-HSPLandroid/speech/tts/TextToSpeech$EngineInfo;-><init>()V
-HSPLandroid/speech/tts/TextToSpeech;-><init>(Landroid/content/Context;Landroid/speech/tts/TextToSpeech$OnInitListener;)V
-HSPLandroid/speech/tts/TextToSpeech;-><init>(Landroid/content/Context;Landroid/speech/tts/TextToSpeech$OnInitListener;Ljava/lang/String;)V
-HSPLandroid/speech/tts/TextToSpeech;-><init>(Landroid/content/Context;Landroid/speech/tts/TextToSpeech$OnInitListener;Ljava/lang/String;Ljava/lang/String;Z)V
-HSPLandroid/speech/tts/TextToSpeech;->access$1002(Landroid/speech/tts/TextToSpeech;Landroid/speech/tts/TextToSpeech$Connection;)Landroid/speech/tts/TextToSpeech$Connection;
-HSPLandroid/speech/tts/TextToSpeech;->access$200(Landroid/speech/tts/TextToSpeech;)Ljava/lang/Object;
-HSPLandroid/speech/tts/TextToSpeech;->access$500(Landroid/speech/tts/TextToSpeech;)Landroid/os/Bundle;
-HSPLandroid/speech/tts/TextToSpeech;->access$800(Landroid/speech/tts/TextToSpeech;I)V
-HSPLandroid/speech/tts/TextToSpeech;->access$902(Landroid/speech/tts/TextToSpeech;Landroid/speech/tts/TextToSpeech$Connection;)Landroid/speech/tts/TextToSpeech$Connection;
-HSPLandroid/speech/tts/TextToSpeech;->connectToEngine(Ljava/lang/String;)Z
-HSPLandroid/speech/tts/TextToSpeech;->dispatchOnInit(I)V
-HSPLandroid/speech/tts/TextToSpeech;->getCallerIdentity()Landroid/os/IBinder;
-HSPLandroid/speech/tts/TextToSpeech;->getDefaultEngine()Ljava/lang/String;
-HSPLandroid/speech/tts/TextToSpeech;->initTts()I
-HSPLandroid/speech/tts/TextToSpeech;->runAction(Landroid/speech/tts/TextToSpeech$Action;Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object;
-HSPLandroid/speech/tts/TextToSpeech;->runAction(Landroid/speech/tts/TextToSpeech$Action;Ljava/lang/Object;Ljava/lang/String;ZZ)Ljava/lang/Object;
-HSPLandroid/speech/tts/TtsEngines$EngineInfoComparator;-><clinit>()V
-HSPLandroid/speech/tts/TtsEngines$EngineInfoComparator;-><init>()V
-HSPLandroid/speech/tts/TtsEngines;-><init>(Landroid/content/Context;)V
-HSPLandroid/speech/tts/TtsEngines;->getDefaultEngine()Ljava/lang/String;
-HSPLandroid/speech/tts/TtsEngines;->getEngineInfo(Landroid/content/pm/ResolveInfo;Landroid/content/pm/PackageManager;)Landroid/speech/tts/TextToSpeech$EngineInfo;
-HSPLandroid/speech/tts/TtsEngines;->getEngineInfo(Ljava/lang/String;)Landroid/speech/tts/TextToSpeech$EngineInfo;
-HSPLandroid/speech/tts/TtsEngines;->getEngines()Ljava/util/List;
-HSPLandroid/speech/tts/TtsEngines;->getHighestRankedEngineName()Ljava/lang/String;
-HSPLandroid/speech/tts/TtsEngines;->isEngineInstalled(Ljava/lang/String;)Z
-HSPLandroid/speech/tts/TtsEngines;->isSystemEngine(Landroid/content/pm/ServiceInfo;)Z
 HSPLandroid/stats/devicepolicy/nano/StringList;-><init>()V
 HSPLandroid/stats/devicepolicy/nano/StringList;->clear()Landroid/stats/devicepolicy/nano/StringList;
 HSPLandroid/stats/devicepolicy/nano/StringList;->computeSerializedSize()I
@@ -21013,11 +18685,7 @@
 HSPLandroid/sysprop/-$$Lambda$TelephonyProperties$JNTRmlscGaFlYo_3krOr_WWd2QI;-><clinit>()V
 HSPLandroid/sysprop/-$$Lambda$TelephonyProperties$JNTRmlscGaFlYo_3krOr_WWd2QI;-><init>()V
 HSPLandroid/sysprop/-$$Lambda$TelephonyProperties$JNTRmlscGaFlYo_3krOr_WWd2QI;->apply(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/sysprop/-$$Lambda$TelephonyProperties$UKEfAuJVPm5cKR_UnPj1L66mN34;-><clinit>()V
-HSPLandroid/sysprop/-$$Lambda$TelephonyProperties$UKEfAuJVPm5cKR_UnPj1L66mN34;-><init>()V
 HSPLandroid/sysprop/-$$Lambda$TelephonyProperties$UKEfAuJVPm5cKR_UnPj1L66mN34;->apply(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/sysprop/-$$Lambda$TelephonyProperties$VtSZ_Uto4bMa49ncgAfdWewMFOU;-><clinit>()V
-HSPLandroid/sysprop/-$$Lambda$TelephonyProperties$VtSZ_Uto4bMa49ncgAfdWewMFOU;-><init>()V
 HSPLandroid/sysprop/-$$Lambda$TelephonyProperties$VtSZ_Uto4bMa49ncgAfdWewMFOU;->apply(Ljava/lang/Object;)Ljava/lang/Object;
 HSPLandroid/sysprop/-$$Lambda$TelephonyProperties$dc-CgjsF3BtDxLSSKL5bQ9ullG0;-><clinit>()V
 HSPLandroid/sysprop/-$$Lambda$TelephonyProperties$dc-CgjsF3BtDxLSSKL5bQ9ullG0;-><init>()V
@@ -21044,7 +18712,6 @@
 HSPLandroid/sysprop/TelephonyProperties;->lambda$icc_operator_iso_country$9(Ljava/lang/String;)Ljava/lang/String;
 HSPLandroid/sysprop/TelephonyProperties;->lambda$icc_operator_numeric$7(Ljava/lang/String;)Ljava/lang/String;
 HSPLandroid/sysprop/TelephonyProperties;->lambda$operator_alpha$1(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/sysprop/TelephonyProperties;->lambda$operator_is_roaming$3(Ljava/lang/String;)Ljava/lang/Boolean;
 HSPLandroid/sysprop/TelephonyProperties;->lambda$operator_numeric$2(Ljava/lang/String;)Ljava/lang/String;
 HSPLandroid/sysprop/TelephonyProperties;->max_active_modems()Ljava/util/Optional;
 HSPLandroid/sysprop/TelephonyProperties;->multi_sim_config()Ljava/util/Optional;
@@ -21063,9 +18730,7 @@
 HSPLandroid/system/ErrnoException;-><init>(Ljava/lang/String;I)V
 HSPLandroid/system/ErrnoException;->getMessage()Ljava/lang/String;
 HSPLandroid/system/ErrnoException;->rethrowAsIOException()Ljava/io/IOException;
-HSPLandroid/system/ErrnoException;->rethrowAsSocketException()Ljava/net/SocketException;
 HSPLandroid/system/GaiException;-><init>(Ljava/lang/String;I)V
-HSPLandroid/system/GaiException;->getMessage()Ljava/lang/String;
 HSPLandroid/system/GaiException;->rethrowAsUnknownHostException(Ljava/lang/String;)Ljava/net/UnknownHostException;
 HSPLandroid/system/Int32Ref;-><init>(I)V
 HSPLandroid/system/Os;->accept(Ljava/io/FileDescriptor;Ljava/net/InetSocketAddress;)Ljava/io/FileDescriptor;
@@ -21096,7 +18761,6 @@
 HSPLandroid/system/Os;->ioctlInt(Ljava/io/FileDescriptor;ILandroid/system/Int32Ref;)I
 HSPLandroid/system/Os;->listen(Ljava/io/FileDescriptor;I)V
 HSPLandroid/system/Os;->lseek(Ljava/io/FileDescriptor;JI)J
-HSPLandroid/system/Os;->lstat(Ljava/lang/String;)Landroid/system/StructStat;
 HSPLandroid/system/Os;->mkdir(Ljava/lang/String;I)V
 HSPLandroid/system/Os;->mlock(JJ)V
 HSPLandroid/system/Os;->mmap(JJIILjava/io/FileDescriptor;J)J
@@ -21105,7 +18769,6 @@
 HSPLandroid/system/Os;->pipe2(I)[Ljava/io/FileDescriptor;
 HSPLandroid/system/Os;->poll([Landroid/system/StructPollfd;I)I
 HSPLandroid/system/Os;->posix_fallocate(Ljava/io/FileDescriptor;JJ)V
-HSPLandroid/system/Os;->prctl(IJJJJ)I
 HSPLandroid/system/Os;->read(Ljava/io/FileDescriptor;Ljava/nio/ByteBuffer;)I
 HSPLandroid/system/Os;->read(Ljava/io/FileDescriptor;[BII)I
 HSPLandroid/system/Os;->readlink(Ljava/lang/String;)Ljava/lang/String;
@@ -21113,24 +18776,17 @@
 HSPLandroid/system/Os;->setpgid(II)V
 HSPLandroid/system/Os;->setregid(II)V
 HSPLandroid/system/Os;->setreuid(II)V
-HSPLandroid/system/Os;->setsockoptInt(Ljava/io/FileDescriptor;III)V
 HSPLandroid/system/Os;->setsockoptTimeval(Ljava/io/FileDescriptor;IILandroid/system/StructTimeval;)V
 HSPLandroid/system/Os;->socket(III)Ljava/io/FileDescriptor;
 HSPLandroid/system/Os;->socketpair(IIILjava/io/FileDescriptor;Ljava/io/FileDescriptor;)V
 HSPLandroid/system/Os;->stat(Ljava/lang/String;)Landroid/system/StructStat;
 HSPLandroid/system/Os;->statvfs(Ljava/lang/String;)Landroid/system/StructStatVfs;
-HSPLandroid/system/Os;->symlink(Ljava/lang/String;Ljava/lang/String;)V
 HSPLandroid/system/Os;->sysconf(I)J
 HSPLandroid/system/Os;->umask(I)I
-HSPLandroid/system/Os;->uname()Landroid/system/StructUtsname;
 HSPLandroid/system/Os;->write(Ljava/io/FileDescriptor;[BII)I
 HSPLandroid/system/OsConstants;->S_ISDIR(I)Z
 HSPLandroid/system/OsConstants;->S_ISREG(I)Z
-HSPLandroid/system/OsConstants;->WEXITSTATUS(I)I
-HSPLandroid/system/OsConstants;->WIFEXITED(I)Z
-HSPLandroid/system/OsConstants;->WTERMSIG(I)I
 HSPLandroid/system/OsConstants;->errnoName(I)Ljava/lang/String;
-HSPLandroid/system/OsConstants;->gaiName(I)Ljava/lang/String;
 HSPLandroid/system/StructAddrinfo;-><init>()V
 HSPLandroid/system/StructCapUserData;-><init>(III)V
 HSPLandroid/system/StructCapUserHeader;-><init>(II)V
@@ -21145,7 +18801,6 @@
 HSPLandroid/system/StructTimespec;->equals(Ljava/lang/Object;)Z
 HSPLandroid/system/StructTimeval;-><init>(JJ)V
 HSPLandroid/system/StructTimeval;->fromMillis(J)Landroid/system/StructTimeval;
-HSPLandroid/system/StructUtsname;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
 HSPLandroid/system/UnixSocketAddress;-><init>([B)V
 HSPLandroid/system/suspend/ISuspendControlService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HSPLandroid/system/suspend/ISuspendControlService$Stub$Proxy;->getWakeLockStats()[Landroid/system/suspend/WakeLockInfo;
@@ -21161,7 +18816,7 @@
 HSPLandroid/telecom/CallAudioState;->getRoute()I
 HSPLandroid/telecom/CallAudioState;->getSupportedRouteMask()I
 HSPLandroid/telecom/CallAudioState;->isMuted()Z
-HSPLandroid/telecom/CallAudioState;->listAppend(Ljava/lang/StringBuffer;Ljava/lang/String;)V
+HSPLandroid/telecom/CallAudioState;->toString()Ljava/lang/String;
 HSPLandroid/telecom/Connection;->capabilitiesToString(I)Ljava/lang/String;
 HSPLandroid/telecom/Connection;->capabilitiesToStringInternal(IZ)Ljava/lang/String;
 HSPLandroid/telecom/Connection;->propertiesToString(I)Ljava/lang/String;
@@ -21175,6 +18830,7 @@
 HSPLandroid/telecom/DisconnectCause$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/telecom/DisconnectCause;-><init>(ILjava/lang/CharSequence;Ljava/lang/CharSequence;Ljava/lang/String;I)V
 HSPLandroid/telecom/DisconnectCause;->getCode()I
+HSPLandroid/telecom/DisconnectCause;->getReason()Ljava/lang/String;
 HPLandroid/telecom/DisconnectCause;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/telecom/Log;->addEvent(Landroid/telecom/Logging/EventManager$Loggable;Ljava/lang/String;Ljava/lang/Object;)V
 HSPLandroid/telecom/Log;->addRequestResponsePair(Landroid/telecom/Logging/EventManager$TimedEventPair;)V
@@ -21343,17 +18999,14 @@
 HSPLandroid/telecom/PhoneAccountHandle;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/telecom/TelecomManager;-><init>(Landroid/content/Context;)V
 HSPLandroid/telecom/TelecomManager;-><init>(Landroid/content/Context;Lcom/android/internal/telecom/ITelecomService;)V
-HSPLandroid/telecom/TelecomManager;->getCallCapablePhoneAccounts()Ljava/util/List;
-HSPLandroid/telecom/TelecomManager;->getCallCapablePhoneAccounts(Z)Ljava/util/List;
 HSPLandroid/telecom/TelecomManager;->getCallState()I
 HSPLandroid/telecom/TelecomManager;->getCurrentTtyMode()I
 HSPLandroid/telecom/TelecomManager;->getDefaultDialerPackage()Ljava/lang/String;
 HSPLandroid/telecom/TelecomManager;->getDefaultDialerPackage(I)Ljava/lang/String;
-HSPLandroid/telecom/TelecomManager;->getDefaultOutgoingPhoneAccount(Ljava/lang/String;)Landroid/telecom/PhoneAccountHandle;
 PLandroid/telecom/TelecomManager;->getDefaultPhoneApp()Landroid/content/ComponentName;
 HSPLandroid/telecom/TelecomManager;->getPhoneAccount(Landroid/telecom/PhoneAccountHandle;)Landroid/telecom/PhoneAccount;
 HSPLandroid/telecom/TelecomManager;->getSimCallManager()Landroid/telecom/PhoneAccountHandle;
-PLandroid/telecom/TelecomManager;->getSimCallManager(I)Landroid/telecom/PhoneAccountHandle;
+HPLandroid/telecom/TelecomManager;->getSimCallManager(I)Landroid/telecom/PhoneAccountHandle;
 HSPLandroid/telecom/TelecomManager;->getSystemDialerPackage()Ljava/lang/String;
 HSPLandroid/telecom/TelecomManager;->getTelecomService()Lcom/android/internal/telecom/ITelecomService;
 HSPLandroid/telecom/TelecomManager;->isInCall()Z
@@ -21362,7 +19015,6 @@
 HSPLandroid/telecom/VideoProfile;->hasState(II)Z
 HSPLandroid/telecom/VideoProfile;->isVideo(I)Z
 HSPLandroid/telephony/-$$Lambda$MLKtmRGKP3e0WU7x_KyS5-Vg8q4;->apply(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/telephony/-$$Lambda$NetworkRegistrationInfo$1JuZmO5PoYGZY8bHhZYwvmqwOB0;->apply(Ljava/lang/Object;)Ljava/lang/Object;
 HSPLandroid/telephony/-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$2XBMUIj05jt4Xm08XAsE57q5gCc;-><init>(Landroid/telephony/PhoneStateListener;II)V
 HSPLandroid/telephony/-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$2XBMUIj05jt4Xm08XAsE57q5gCc;->run()V
 HSPLandroid/telephony/-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$2cMrwdqnKBpixpApeIX38rmRLak;-><init>(Landroid/telephony/PhoneStateListener;Landroid/telephony/CellLocation;)V
@@ -21371,6 +19023,8 @@
 HSPLandroid/telephony/-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$6czWSGzxct0CXPVO54T0aq05qls;->run()V
 HSPLandroid/telephony/-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$FBJGFGXoSvidKfm50cEzC3i9rVk;-><init>(Landroid/telephony/PhoneStateListener;I)V
 HSPLandroid/telephony/-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$FBJGFGXoSvidKfm50cEzC3i9rVk;->run()V
+HSPLandroid/telephony/-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$GJ2YJ4ARy5-u2bWutnqrYMAsLYA;-><init>(Landroid/telephony/PhoneStateListener$IPhoneStateListenerStub;Landroid/telephony/PhoneStateListener;I)V
+HSPLandroid/telephony/-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$GJ2YJ4ARy5-u2bWutnqrYMAsLYA;->runOrThrow()V
 HSPLandroid/telephony/-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$Hbn6-eZxY2p3rjOfStodI04A8E8;-><init>(Landroid/telephony/PhoneStateListener$IPhoneStateListenerStub;Landroid/telephony/PhoneStateListener;Landroid/telephony/CellLocation;)V
 HSPLandroid/telephony/-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$Hbn6-eZxY2p3rjOfStodI04A8E8;->runOrThrow()V
 HSPLandroid/telephony/-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$MtX5gtAKHxLcUp_ibya6VO1zuoE;-><init>(Landroid/telephony/PhoneStateListener$IPhoneStateListenerStub;Landroid/telephony/PhoneStateListener;I)V
@@ -21393,207 +19047,66 @@
 HSPLandroid/telephony/-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$pLr-IfJJu1u_YG6I5LI0iHTuBi0;->runOrThrow()V
 HSPLandroid/telephony/-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$uC5syhzl229gIpaK7Jfs__OCJxQ;-><init>(Landroid/telephony/PhoneStateListener$IPhoneStateListenerStub;Landroid/telephony/PhoneStateListener;Landroid/telephony/ServiceState;)V
 HSPLandroid/telephony/-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$uC5syhzl229gIpaK7Jfs__OCJxQ;->runOrThrow()V
+HSPLandroid/telephony/-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$xj3Oc59znNki36q4HkPlDthcris;-><init>(Landroid/telephony/PhoneStateListener;I)V
+HSPLandroid/telephony/-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$xj3Oc59znNki36q4HkPlDthcris;->run()V
 HSPLandroid/telephony/-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$yvQnAlFGg5EWDG2vcA9X-4xnalA;-><init>(Landroid/telephony/PhoneStateListener$IPhoneStateListenerStub;Landroid/telephony/PhoneStateListener;Ljava/util/List;)V
 HSPLandroid/telephony/-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$yvQnAlFGg5EWDG2vcA9X-4xnalA;->runOrThrow()V
 HSPLandroid/telephony/-$$Lambda$SubscriptionManager$R_uORt9bKcmEo6JnjiGP2KgjIOQ;-><init>(Landroid/telephony/SubscriptionManager;)V
 HSPLandroid/telephony/-$$Lambda$SubscriptionManager$R_uORt9bKcmEo6JnjiGP2KgjIOQ;->test(Ljava/lang/Object;)Z
-HSPLandroid/telephony/-$$Lambda$TelephonyFrameworkInitializer$3Kis6wL1IbLustWe9A2o4-2YpGo;->createService(Landroid/content/Context;)Ljava/lang/Object;
-HSPLandroid/telephony/-$$Lambda$TelephonyFrameworkInitializer$b_92_3ZijRrdEa9yLyFA5xu19OM;->createService(Landroid/content/Context;)Ljava/lang/Object;
-HSPLandroid/telephony/-$$Lambda$TelephonyFrameworkInitializer$mpe0Kh92VEQmEtmo60oqykdvnBE;->createService(Landroid/content/Context;)Ljava/lang/Object;
-HSPLandroid/telephony/-$$Lambda$TelephonyFrameworkInitializer$sQClc4rjc9ydh0nXpY79gr33av4;->createService(Landroid/content/Context;)Ljava/lang/Object;
-HSPLandroid/telephony/-$$Lambda$TelephonyManager$1$scMPky6lOZrCjFC3d4STbtLfpHE;-><init>(Landroid/telephony/TelephonyManager$CellInfoCallback;Ljava/util/List;)V
-HSPLandroid/telephony/-$$Lambda$TelephonyManager$1$scMPky6lOZrCjFC3d4STbtLfpHE;->run()V
-HSPLandroid/telephony/-$$Lambda$TelephonyManager$2$l6Pazxfi7QghMr2Z0MpduhNe6yc;-><init>(Landroid/telephony/TelephonyManager$CellInfoCallback;Ljava/util/List;)V
-HSPLandroid/telephony/-$$Lambda$TelephonyManager$2$l6Pazxfi7QghMr2Z0MpduhNe6yc;->run()V
 HSPLandroid/telephony/-$$Lambda$TelephonyRegistryManager$1$cLzLZB4oGnI-HG_-4MhxcXoHys8;-><init>(Landroid/telephony/SubscriptionManager$OnSubscriptionsChangedListener;)V
 HSPLandroid/telephony/-$$Lambda$TelephonyRegistryManager$1$cLzLZB4oGnI-HG_-4MhxcXoHys8;->run()V
-HSPLandroid/telephony/AccessNetworkConstants;->transportTypeToString(I)Ljava/lang/String;
 HSPLandroid/telephony/AccessNetworkUtils;->getDuplexModeForEutranBand(I)I
 HSPLandroid/telephony/AccessNetworkUtils;->getOperatingBandForEarfcn(I)I
-HSPLandroid/telephony/CallAttributes;-><init>(Landroid/telephony/PreciseCallState;ILandroid/telephony/CallQuality;)V
-HSPLandroid/telephony/CallQuality$1;->createFromParcel(Landroid/os/Parcel;)Landroid/telephony/CallQuality;
-HSPLandroid/telephony/CallQuality$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/telephony/CallQuality;-><init>(IIIIIIIIIII)V
-HSPLandroid/telephony/CallQuality;-><init>(IIIIIIIIIIIZZZ)V
-HSPLandroid/telephony/CallQuality;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/telephony/CallQuality;->toString()Ljava/lang/String;
-HPLandroid/telephony/CallQuality;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/telephony/CarrierConfigManager;-><init>(Landroid/content/Context;)V
-HSPLandroid/telephony/CarrierConfigManager;->getConfig()Landroid/os/PersistableBundle;
-HSPLandroid/telephony/CarrierConfigManager;->getConfigForSubId(I)Landroid/os/PersistableBundle;
-HSPLandroid/telephony/CarrierConfigManager;->getDefaultCarrierServicePackageName()Ljava/lang/String;
-HSPLandroid/telephony/CarrierConfigManager;->getDefaultConfig()Landroid/os/PersistableBundle;
-HSPLandroid/telephony/CarrierConfigManager;->getICarrierConfigLoader()Lcom/android/internal/telephony/ICarrierConfigLoader;
 HSPLandroid/telephony/CarrierConfigManager;->isConfigForIdentifiedCarrier(Landroid/os/PersistableBundle;)Z
-HSPLandroid/telephony/CellConfigLte$1;->createFromParcel(Landroid/os/Parcel;)Landroid/telephony/CellConfigLte;
-HSPLandroid/telephony/CellConfigLte$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/telephony/CellConfigLte;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/telephony/CellConfigLte;-><init>(Landroid/os/Parcel;Landroid/telephony/CellConfigLte$1;)V
-HSPLandroid/telephony/CellConfigLte;->toString()Ljava/lang/String;
-HSPLandroid/telephony/CellConfigLte;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/telephony/CellIdentity$1;->createFromParcel(Landroid/os/Parcel;)Landroid/telephony/CellIdentity;
 HSPLandroid/telephony/CellIdentity$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/telephony/CellIdentity;-><init>(Ljava/lang/String;ILandroid/os/Parcel;)V
-HSPLandroid/telephony/CellIdentity;-><init>(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/telephony/CellIdentity;->equals(Ljava/lang/Object;)Z
-HSPLandroid/telephony/CellIdentity;->isMcc(Ljava/lang/String;)Z
-HSPLandroid/telephony/CellIdentity;->isMnc(Ljava/lang/String;)Z
-HSPLandroid/telephony/CellIdentity;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/telephony/CellIdentityCdma$1;->createFromParcel(Landroid/os/Parcel;)Landroid/telephony/CellIdentityCdma;
 HSPLandroid/telephony/CellIdentityCdma$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/telephony/CellIdentityCdma;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/telephony/CellIdentityCdma;->createFromParcelBody(Landroid/os/Parcel;)Landroid/telephony/CellIdentityCdma;
 HSPLandroid/telephony/CellIdentityGsm$1;->createFromParcel(Landroid/os/Parcel;)Landroid/telephony/CellIdentityGsm;
 HSPLandroid/telephony/CellIdentityGsm$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/telephony/CellIdentityGsm;-><init>(Landroid/os/Parcel;)V
 HSPLandroid/telephony/CellIdentityGsm;->createFromParcelBody(Landroid/os/Parcel;)Landroid/telephony/CellIdentityGsm;
 HSPLandroid/telephony/CellIdentityGsm;->toString()Ljava/lang/String;
 HSPLandroid/telephony/CellIdentityGsm;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/telephony/CellIdentityLte$1;->createFromParcel(Landroid/os/Parcel;)Landroid/telephony/CellIdentityLte;
-HSPLandroid/telephony/CellIdentityLte$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/telephony/CellIdentityLte;-><init>(Landroid/os/Parcel;)V
 HSPLandroid/telephony/CellIdentityLte;->asCellLocation()Landroid/telephony/CellLocation;
 HSPLandroid/telephony/CellIdentityLte;->asCellLocation()Landroid/telephony/gsm/GsmCellLocation;
 HSPLandroid/telephony/CellIdentityLte;->createFromParcelBody(Landroid/os/Parcel;)Landroid/telephony/CellIdentityLte;
-HSPLandroid/telephony/CellIdentityLte;->equals(Ljava/lang/Object;)Z
-HSPLandroid/telephony/CellIdentityLte;->getBandwidth()I
-HSPLandroid/telephony/CellIdentityLte;->getCi()I
-HSPLandroid/telephony/CellIdentityLte;->getEarfcn()I
-HSPLandroid/telephony/CellIdentityLte;->getMcc()I
-HSPLandroid/telephony/CellIdentityLte;->getMnc()I
-HSPLandroid/telephony/CellIdentityLte;->getPci()I
-HSPLandroid/telephony/CellIdentityLte;->getTac()I
-HSPLandroid/telephony/CellIdentityLte;->toString()Ljava/lang/String;
-HSPLandroid/telephony/CellIdentityLte;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/telephony/CellIdentityWcdma$1;->createFromParcel(Landroid/os/Parcel;)Landroid/telephony/CellIdentityWcdma;
 HSPLandroid/telephony/CellIdentityWcdma$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/telephony/CellIdentityWcdma;-><init>(Landroid/os/Parcel;)V
 HSPLandroid/telephony/CellIdentityWcdma;->createFromParcelBody(Landroid/os/Parcel;)Landroid/telephony/CellIdentityWcdma;
-HSPLandroid/telephony/CellIdentityWcdma;->equals(Ljava/lang/Object;)Z
-HSPLandroid/telephony/CellIdentityWcdma;->getCid()I
-HSPLandroid/telephony/CellIdentityWcdma;->getLac()I
 HSPLandroid/telephony/CellIdentityWcdma;->getMcc()I
-HSPLandroid/telephony/CellIdentityWcdma;->getMnc()I
 HSPLandroid/telephony/CellIdentityWcdma;->toString()Ljava/lang/String;
 HSPLandroid/telephony/CellIdentityWcdma;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/telephony/CellInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/telephony/CellInfo;
-HSPLandroid/telephony/CellInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/telephony/CellInfo;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/telephony/CellInfo;->isRegistered()Z
-HSPLandroid/telephony/CellInfo;->toString()Ljava/lang/String;
-HSPLandroid/telephony/CellInfo;->writeToParcel(Landroid/os/Parcel;II)V
-HSPLandroid/telephony/CellInfoLte;-><init>(Landroid/os/Parcel;)V
 HSPLandroid/telephony/CellInfoLte;->createFromParcelBody(Landroid/os/Parcel;)Landroid/telephony/CellInfoLte;
-HSPLandroid/telephony/CellInfoLte;->getCellIdentity()Landroid/telephony/CellIdentityLte;
-HSPLandroid/telephony/CellInfoLte;->getCellSignalStrength()Landroid/telephony/CellSignalStrengthLte;
-HSPLandroid/telephony/CellInfoLte;->toString()Ljava/lang/String;
-HSPLandroid/telephony/CellInfoLte;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/telephony/CellInfoWcdma;-><init>(Landroid/os/Parcel;)V
 HSPLandroid/telephony/CellInfoWcdma;->createFromParcelBody(Landroid/os/Parcel;)Landroid/telephony/CellInfoWcdma;
 HSPLandroid/telephony/CellInfoWcdma;->getCellIdentity()Landroid/telephony/CellIdentityWcdma;
 HSPLandroid/telephony/CellInfoWcdma;->toString()Ljava/lang/String;
-HSPLandroid/telephony/CellLocation;-><init>()V
-HSPLandroid/telephony/CellLocation;->getEmpty()Landroid/telephony/CellLocation;
-HSPLandroid/telephony/CellSignalStrength;-><init>()V
-HSPLandroid/telephony/CellSignalStrength;->getNumSignalStrengthLevels()I
-HSPLandroid/telephony/CellSignalStrengthCdma$1;->createFromParcel(Landroid/os/Parcel;)Landroid/telephony/CellSignalStrengthCdma;
-HSPLandroid/telephony/CellSignalStrengthCdma$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/telephony/CellSignalStrengthCdma;-><init>()V
-HSPLandroid/telephony/CellSignalStrengthCdma;-><init>(Landroid/os/Parcel;)V
 HSPLandroid/telephony/CellSignalStrengthCdma;-><init>(Landroid/os/Parcel;Landroid/telephony/CellSignalStrengthCdma$1;)V
 HPLandroid/telephony/CellSignalStrengthCdma;-><init>(Landroid/telephony/CellSignalStrengthCdma;)V
 HPLandroid/telephony/CellSignalStrengthCdma;->copyFrom(Landroid/telephony/CellSignalStrengthCdma;)V
-HSPLandroid/telephony/CellSignalStrengthCdma;->equals(Ljava/lang/Object;)Z
-HSPLandroid/telephony/CellSignalStrengthCdma;->getCdmaDbm()I
-HSPLandroid/telephony/CellSignalStrengthCdma;->getCdmaEcio()I
-HSPLandroid/telephony/CellSignalStrengthCdma;->getCdmaLevel()I
-HSPLandroid/telephony/CellSignalStrengthCdma;->getEvdoDbm()I
-HSPLandroid/telephony/CellSignalStrengthCdma;->getEvdoLevel()I
-HSPLandroid/telephony/CellSignalStrengthCdma;->getEvdoSnr()I
-HSPLandroid/telephony/CellSignalStrengthCdma;->isValid()Z
-HSPLandroid/telephony/CellSignalStrengthCdma;->setDefaultValues()V
-HSPLandroid/telephony/CellSignalStrengthCdma;->toString()Ljava/lang/String;
-HSPLandroid/telephony/CellSignalStrengthCdma;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/telephony/CellSignalStrengthGsm$1;->createFromParcel(Landroid/os/Parcel;)Landroid/telephony/CellSignalStrengthGsm;
-HSPLandroid/telephony/CellSignalStrengthGsm$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/telephony/CellSignalStrengthGsm;-><init>()V
 HSPLandroid/telephony/CellSignalStrengthGsm;-><init>(Landroid/os/Parcel;)V
 HSPLandroid/telephony/CellSignalStrengthGsm;-><init>(Landroid/os/Parcel;Landroid/telephony/CellSignalStrengthGsm$1;)V
 HPLandroid/telephony/CellSignalStrengthGsm;-><init>(Landroid/telephony/CellSignalStrengthGsm;)V
 HPLandroid/telephony/CellSignalStrengthGsm;->copyFrom(Landroid/telephony/CellSignalStrengthGsm;)V
-HSPLandroid/telephony/CellSignalStrengthGsm;->equals(Ljava/lang/Object;)Z
 HSPLandroid/telephony/CellSignalStrengthGsm;->getLevel()I
-HSPLandroid/telephony/CellSignalStrengthGsm;->isValid()Z
-HSPLandroid/telephony/CellSignalStrengthGsm;->setDefaultValues()V
-HSPLandroid/telephony/CellSignalStrengthGsm;->toString()Ljava/lang/String;
-HSPLandroid/telephony/CellSignalStrengthGsm;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/telephony/CellSignalStrengthLte$1;->createFromParcel(Landroid/os/Parcel;)Landroid/telephony/CellSignalStrengthLte;
-HSPLandroid/telephony/CellSignalStrengthLte$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/telephony/CellSignalStrengthLte;-><init>()V
-HSPLandroid/telephony/CellSignalStrengthLte;-><init>(Landroid/os/Parcel;)V
 HSPLandroid/telephony/CellSignalStrengthLte;-><init>(Landroid/os/Parcel;Landroid/telephony/CellSignalStrengthLte$1;)V
 HPLandroid/telephony/CellSignalStrengthLte;-><init>(Landroid/telephony/CellSignalStrengthLte;)V
 HPLandroid/telephony/CellSignalStrengthLte;->copyFrom(Landroid/telephony/CellSignalStrengthLte;)V
-HPLandroid/telephony/CellSignalStrengthLte;->describeContents()I
-HSPLandroid/telephony/CellSignalStrengthLte;->equals(Ljava/lang/Object;)Z
-HSPLandroid/telephony/CellSignalStrengthLte;->getDbm()I
-HSPLandroid/telephony/CellSignalStrengthLte;->getLevel()I
-HSPLandroid/telephony/CellSignalStrengthLte;->getTimingAdvance()I
-HSPLandroid/telephony/CellSignalStrengthLte;->isValid()Z
-HSPLandroid/telephony/CellSignalStrengthLte;->setDefaultValues()V
-HSPLandroid/telephony/CellSignalStrengthLte;->toString()Ljava/lang/String;
-HSPLandroid/telephony/CellSignalStrengthLte;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/telephony/CellSignalStrengthNr$1;->createFromParcel(Landroid/os/Parcel;)Landroid/telephony/CellSignalStrengthNr;
-HSPLandroid/telephony/CellSignalStrengthNr$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/telephony/CellSignalStrengthNr;-><init>()V
-HSPLandroid/telephony/CellSignalStrengthNr;-><init>(Landroid/os/Parcel;)V
 HSPLandroid/telephony/CellSignalStrengthNr;-><init>(Landroid/os/Parcel;Landroid/telephony/CellSignalStrengthNr$1;)V
 HPLandroid/telephony/CellSignalStrengthNr;-><init>(Landroid/telephony/CellSignalStrengthNr;)V
-HSPLandroid/telephony/CellSignalStrengthNr;->equals(Ljava/lang/Object;)Z
-HSPLandroid/telephony/CellSignalStrengthNr;->isValid()Z
-HSPLandroid/telephony/CellSignalStrengthNr;->setDefaultValues()V
-HSPLandroid/telephony/CellSignalStrengthNr;->toString()Ljava/lang/String;
-HSPLandroid/telephony/CellSignalStrengthNr;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/telephony/CellSignalStrengthTdscdma$1;->createFromParcel(Landroid/os/Parcel;)Landroid/telephony/CellSignalStrengthTdscdma;
-HSPLandroid/telephony/CellSignalStrengthTdscdma$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/telephony/CellSignalStrengthTdscdma;-><init>()V
 HSPLandroid/telephony/CellSignalStrengthTdscdma;-><init>(Landroid/os/Parcel;)V
 HSPLandroid/telephony/CellSignalStrengthTdscdma;-><init>(Landroid/os/Parcel;Landroid/telephony/CellSignalStrengthTdscdma$1;)V
 HPLandroid/telephony/CellSignalStrengthTdscdma;-><init>(Landroid/telephony/CellSignalStrengthTdscdma;)V
 HPLandroid/telephony/CellSignalStrengthTdscdma;->copyFrom(Landroid/telephony/CellSignalStrengthTdscdma;)V
-HSPLandroid/telephony/CellSignalStrengthTdscdma;->equals(Ljava/lang/Object;)Z
-HSPLandroid/telephony/CellSignalStrengthTdscdma;->isValid()Z
-HSPLandroid/telephony/CellSignalStrengthTdscdma;->setDefaultValues()V
-HSPLandroid/telephony/CellSignalStrengthTdscdma;->toString()Ljava/lang/String;
-HSPLandroid/telephony/CellSignalStrengthTdscdma;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/telephony/CellSignalStrengthWcdma$1;->createFromParcel(Landroid/os/Parcel;)Landroid/telephony/CellSignalStrengthWcdma;
-HSPLandroid/telephony/CellSignalStrengthWcdma$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/telephony/CellSignalStrengthWcdma;-><init>()V
-HSPLandroid/telephony/CellSignalStrengthWcdma;-><init>(Landroid/os/Parcel;)V
 HSPLandroid/telephony/CellSignalStrengthWcdma;-><init>(Landroid/os/Parcel;Landroid/telephony/CellSignalStrengthWcdma$1;)V
 HPLandroid/telephony/CellSignalStrengthWcdma;-><init>(Landroid/telephony/CellSignalStrengthWcdma;)V
 HPLandroid/telephony/CellSignalStrengthWcdma;->copyFrom(Landroid/telephony/CellSignalStrengthWcdma;)V
-HSPLandroid/telephony/CellSignalStrengthWcdma;->equals(Ljava/lang/Object;)Z
-HSPLandroid/telephony/CellSignalStrengthWcdma;->getDbm()I
 HSPLandroid/telephony/CellSignalStrengthWcdma;->getLevel()I
-HSPLandroid/telephony/CellSignalStrengthWcdma;->isValid()Z
-HSPLandroid/telephony/CellSignalStrengthWcdma;->setDefaultValues()V
-HSPLandroid/telephony/CellSignalStrengthWcdma;->toString()Ljava/lang/String;
-HSPLandroid/telephony/CellSignalStrengthWcdma;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/telephony/DataFailCause;->getFailCause(I)I
 HSPLandroid/telephony/DataFailCause;->toString(I)Ljava/lang/String;
-HSPLandroid/telephony/DataSpecificRegistrationInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/telephony/DataSpecificRegistrationInfo;
-HSPLandroid/telephony/DataSpecificRegistrationInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/telephony/DataSpecificRegistrationInfo;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/telephony/DataSpecificRegistrationInfo;-><init>(Landroid/os/Parcel;Landroid/telephony/DataSpecificRegistrationInfo$1;)V
-HSPLandroid/telephony/DataSpecificRegistrationInfo;-><init>(Landroid/telephony/DataSpecificRegistrationInfo;)V
-HSPLandroid/telephony/DataSpecificRegistrationInfo;->equals(Ljava/lang/Object;)Z
-HSPLandroid/telephony/DataSpecificRegistrationInfo;->isUsingCarrierAggregation()Z
-HSPLandroid/telephony/DataSpecificRegistrationInfo;->toString()Ljava/lang/String;
-HSPLandroid/telephony/DataSpecificRegistrationInfo;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/telephony/ICellInfoCallback$Stub;-><init>()V
-HSPLandroid/telephony/ICellInfoCallback$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/telephony/ICellInfoCallback$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/telephony/LocationAccessPolicy$LocationPermissionQuery$Builder;-><init>()V
 HSPLandroid/telephony/LocationAccessPolicy$LocationPermissionQuery$Builder;->build()Landroid/telephony/LocationAccessPolicy$LocationPermissionQuery;
 HSPLandroid/telephony/LocationAccessPolicy$LocationPermissionQuery$Builder;->setCallingPackage(Ljava/lang/String;)Landroid/telephony/LocationAccessPolicy$LocationPermissionQuery$Builder;
@@ -21616,58 +19129,12 @@
 HSPLandroid/telephony/LocationAccessPolicy;->isCurrentProfile(Landroid/content/Context;I)Z
 HSPLandroid/telephony/LocationAccessPolicy;->isLocationModeEnabled(Landroid/content/Context;I)Z
 HSPLandroid/telephony/LocationAccessPolicy;->logError(Landroid/content/Context;Landroid/telephony/LocationAccessPolicy$LocationPermissionQuery;Ljava/lang/String;)V
-HSPLandroid/telephony/LteVopsSupportInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/telephony/LteVopsSupportInfo;
-HSPLandroid/telephony/LteVopsSupportInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/telephony/LteVopsSupportInfo;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/telephony/LteVopsSupportInfo;-><init>(Landroid/os/Parcel;Landroid/telephony/LteVopsSupportInfo$1;)V
-HSPLandroid/telephony/LteVopsSupportInfo;->equals(Ljava/lang/Object;)Z
-HSPLandroid/telephony/LteVopsSupportInfo;->toString()Ljava/lang/String;
-HSPLandroid/telephony/LteVopsSupportInfo;->writeToParcel(Landroid/os/Parcel;I)V
-HPLandroid/telephony/ModemActivityInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/telephony/ModemActivityInfo;
-HPLandroid/telephony/ModemActivityInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/telephony/ModemActivityInfo$TransmitPower;-><init>(Landroid/telephony/ModemActivityInfo;Landroid/util/Range;I)V
-HSPLandroid/telephony/ModemActivityInfo$TransmitPower;->getTimeInMillis()I
-HSPLandroid/telephony/ModemActivityInfo$TransmitPower;->toString()Ljava/lang/String;
-HSPLandroid/telephony/ModemActivityInfo;-><init>(JII[II)V
-HSPLandroid/telephony/ModemActivityInfo;->getIdleTimeMillis()I
-HSPLandroid/telephony/ModemActivityInfo;->getReceiveTimeMillis()I
-HSPLandroid/telephony/ModemActivityInfo;->getSleepTimeMillis()I
-HSPLandroid/telephony/ModemActivityInfo;->getTimestamp()J
-HSPLandroid/telephony/ModemActivityInfo;->getTransmitPowerInfo()Ljava/util/List;
-HSPLandroid/telephony/ModemActivityInfo;->isEmpty()Z
-HSPLandroid/telephony/ModemActivityInfo;->isValid()Z
-HSPLandroid/telephony/ModemActivityInfo;->populateTransmitPowerRange([I)V
-HSPLandroid/telephony/ModemActivityInfo;->toString()Ljava/lang/String;
-HSPLandroid/telephony/NetworkRegistrationInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/telephony/NetworkRegistrationInfo;
-HSPLandroid/telephony/NetworkRegistrationInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/telephony/NetworkRegistrationInfo;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/telephony/NetworkRegistrationInfo;-><init>(Landroid/os/Parcel;Landroid/telephony/NetworkRegistrationInfo$1;)V
-HSPLandroid/telephony/NetworkRegistrationInfo;-><init>(Landroid/telephony/NetworkRegistrationInfo;)V
 HSPLandroid/telephony/NetworkRegistrationInfo;->copy()Landroid/telephony/NetworkRegistrationInfo;
-HSPLandroid/telephony/NetworkRegistrationInfo;->domainToString(I)Ljava/lang/String;
-HSPLandroid/telephony/NetworkRegistrationInfo;->equals(Ljava/lang/Object;)Z
-HSPLandroid/telephony/NetworkRegistrationInfo;->getAccessNetworkTechnology()I
-HSPLandroid/telephony/NetworkRegistrationInfo;->getDataSpecificInfo()Landroid/telephony/DataSpecificRegistrationInfo;
-HSPLandroid/telephony/NetworkRegistrationInfo;->getDomain()I
-HSPLandroid/telephony/NetworkRegistrationInfo;->getNrState()I
-HSPLandroid/telephony/NetworkRegistrationInfo;->getRegistrationState()I
-HSPLandroid/telephony/NetworkRegistrationInfo;->getRoamingType()I
-HSPLandroid/telephony/NetworkRegistrationInfo;->getTransportType()I
-HSPLandroid/telephony/NetworkRegistrationInfo;->isInService()Z
-HSPLandroid/telephony/NetworkRegistrationInfo;->lambda$toString$0(Ljava/lang/Integer;)Ljava/lang/String;
-HSPLandroid/telephony/NetworkRegistrationInfo;->nrStateToString(I)Ljava/lang/String;
-HSPLandroid/telephony/NetworkRegistrationInfo;->registrationStateToString(I)Ljava/lang/String;
 HSPLandroid/telephony/NetworkRegistrationInfo;->sanitizeLocationInfo()Landroid/telephony/NetworkRegistrationInfo;
-HSPLandroid/telephony/NetworkRegistrationInfo;->serviceTypeToString(I)Ljava/lang/String;
-HSPLandroid/telephony/NetworkRegistrationInfo;->toString()Ljava/lang/String;
-HSPLandroid/telephony/NetworkRegistrationInfo;->writeToParcel(Landroid/os/Parcel;I)V
 PLandroid/telephony/PhoneCapability$1;->createFromParcel(Landroid/os/Parcel;)Landroid/telephony/PhoneCapability;
 HPLandroid/telephony/PhoneCapability$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HPLandroid/telephony/PhoneCapability;-><init>(Landroid/os/Parcel;)V
 PLandroid/telephony/PhoneCapability;-><init>(Landroid/os/Parcel;Landroid/telephony/PhoneCapability$1;)V
-HSPLandroid/telephony/PhoneCapability;->toString()Ljava/lang/String;
-HSPLandroid/telephony/PhoneNumberUtils;->bcdToChar(BI)C
-HSPLandroid/telephony/PhoneNumberUtils;->calledPartyBCDToString([BIII)Ljava/lang/String;
 HSPLandroid/telephony/PhoneNumberUtils;->compare(Ljava/lang/String;Ljava/lang/String;)Z
 HSPLandroid/telephony/PhoneNumberUtils;->compare(Ljava/lang/String;Ljava/lang/String;Z)Z
 HSPLandroid/telephony/PhoneNumberUtils;->compareLoosely(Ljava/lang/String;Ljava/lang/String;)Z
@@ -21675,12 +19142,10 @@
 HSPLandroid/telephony/PhoneNumberUtils;->extractNetworkPortion(Ljava/lang/String;)Ljava/lang/String;
 HSPLandroid/telephony/PhoneNumberUtils;->extractNetworkPortionAlt(Ljava/lang/String;)Ljava/lang/String;
 HSPLandroid/telephony/PhoneNumberUtils;->extractPostDialPortion(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/telephony/PhoneNumberUtils;->formatNumber(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/telephony/PhoneNumberUtils;->formatNumberToE164(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
+HSPLandroid/telephony/PhoneNumberUtils;->formatNumberInternal(Ljava/lang/String;Ljava/lang/String;Lcom/android/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberFormat;)Ljava/lang/String;
 HSPLandroid/telephony/PhoneNumberUtils;->getDefaultVoiceSubId()I
 HSPLandroid/telephony/PhoneNumberUtils;->getMinMatch()I
 HSPLandroid/telephony/PhoneNumberUtils;->indexOfLastNetworkChar(Ljava/lang/String;)I
-HSPLandroid/telephony/PhoneNumberUtils;->internalCalledPartyBCDFragmentToString(Ljava/lang/StringBuilder;[BIII)V
 HSPLandroid/telephony/PhoneNumberUtils;->is12Key(C)Z
 HSPLandroid/telephony/PhoneNumberUtils;->isDialable(C)Z
 HSPLandroid/telephony/PhoneNumberUtils;->isEmergencyNumber(ILjava/lang/String;)Z
@@ -21691,14 +19156,13 @@
 HSPLandroid/telephony/PhoneNumberUtils;->isLocalEmergencyNumber(Landroid/content/Context;ILjava/lang/String;)Z
 HSPLandroid/telephony/PhoneNumberUtils;->isLocalEmergencyNumber(Landroid/content/Context;Ljava/lang/String;)Z
 HSPLandroid/telephony/PhoneNumberUtils;->isLocalEmergencyNumberInternal(ILjava/lang/String;Landroid/content/Context;Z)Z
-HSPLandroid/telephony/PhoneNumberUtils;->isNonSeparator(C)Z
 HSPLandroid/telephony/PhoneNumberUtils;->isUriNumber(Ljava/lang/String;)Z
 HSPLandroid/telephony/PhoneNumberUtils;->minPositive(II)I
-HSPLandroid/telephony/PhoneNumberUtils;->normalizeNumber(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/telephony/PhoneNumberUtils;->stripSeparators(Ljava/lang/String;)Ljava/lang/String;
 HSPLandroid/telephony/PhoneStateListener$IPhoneStateListenerStub;-><init>(Landroid/telephony/PhoneStateListener;Ljava/util/concurrent/Executor;)V
 HSPLandroid/telephony/PhoneStateListener$IPhoneStateListenerStub;->lambda$onActiveDataSubIdChanged$54(Landroid/telephony/PhoneStateListener;I)V
 HSPLandroid/telephony/PhoneStateListener$IPhoneStateListenerStub;->lambda$onActiveDataSubIdChanged$55$PhoneStateListener$IPhoneStateListenerStub(Landroid/telephony/PhoneStateListener;I)V
+HSPLandroid/telephony/PhoneStateListener$IPhoneStateListenerStub;->lambda$onActiveDataSubIdChanged$56(Landroid/telephony/PhoneStateListener;I)V
+HSPLandroid/telephony/PhoneStateListener$IPhoneStateListenerStub;->lambda$onActiveDataSubIdChanged$57$PhoneStateListener$IPhoneStateListenerStub(Landroid/telephony/PhoneStateListener;I)V
 HSPLandroid/telephony/PhoneStateListener$IPhoneStateListenerStub;->lambda$onCallStateChanged$10(Landroid/telephony/PhoneStateListener;ILjava/lang/String;)V
 HSPLandroid/telephony/PhoneStateListener$IPhoneStateListenerStub;->lambda$onCallStateChanged$11$PhoneStateListener$IPhoneStateListenerStub(Landroid/telephony/PhoneStateListener;ILjava/lang/String;)V
 HSPLandroid/telephony/PhoneStateListener$IPhoneStateListenerStub;->lambda$onCellInfoChanged$20(Landroid/telephony/PhoneStateListener;Ljava/util/List;)V
@@ -21729,7 +19193,6 @@
 HSPLandroid/telephony/PhoneStateListener;-><init>(Ljava/util/concurrent/Executor;)V
 HSPLandroid/telephony/PhoneStateListener;->onCallStateChanged(ILjava/lang/String;)V
 HSPLandroid/telephony/PhoneStateListener;->onDataConnectionStateChanged(I)V
-HSPLandroid/telephony/PreciseCallState;-><init>(IIIII)V
 HSPLandroid/telephony/PreciseCallState;->getForegroundCallState()I
 HSPLandroid/telephony/PreciseDataConnectionState$1;->createFromParcel(Landroid/os/Parcel;)Landroid/telephony/PreciseDataConnectionState;
 HSPLandroid/telephony/PreciseDataConnectionState$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
@@ -21741,72 +19204,15 @@
 PLandroid/telephony/PreciseDataConnectionState;->getDataConnectionLinkProperties()Landroid/net/LinkProperties;
 PLandroid/telephony/PreciseDataConnectionState;->getNetworkType()I
 PLandroid/telephony/PreciseDataConnectionState;->getState()I
+HSPLandroid/telephony/PreciseDataConnectionState;->toString()Ljava/lang/String;
 HSPLandroid/telephony/PreciseDataConnectionState;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/telephony/Rlog;->d(Ljava/lang/String;Ljava/lang/String;)I
-HSPLandroid/telephony/ServiceState$1;->createFromParcel(Landroid/os/Parcel;)Landroid/telephony/ServiceState;
-HSPLandroid/telephony/ServiceState$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/telephony/ServiceState;-><init>()V
-HSPLandroid/telephony/ServiceState;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/telephony/ServiceState;-><init>(Landroid/telephony/ServiceState;)V
-HSPLandroid/telephony/ServiceState;->copyFrom(Landroid/telephony/ServiceState;)V
 HSPLandroid/telephony/ServiceState;->createLocationInfoSanitizedCopy(Z)Landroid/telephony/ServiceState;
-HPLandroid/telephony/ServiceState;->describeContents()I
-HSPLandroid/telephony/ServiceState;->equals(Ljava/lang/Object;)Z
-HSPLandroid/telephony/ServiceState;->equalsHandlesNulls(Ljava/lang/Object;Ljava/lang/Object;)Z
-HPLandroid/telephony/ServiceState;->fillInNotifierBundle(Landroid/os/Bundle;)V
-HSPLandroid/telephony/ServiceState;->getCellBandwidths()[I
-HSPLandroid/telephony/ServiceState;->getDataNetworkType()I
-HSPLandroid/telephony/ServiceState;->getDataRegState()I
-HSPLandroid/telephony/ServiceState;->getDataRegistrationState()I
-HSPLandroid/telephony/ServiceState;->getDataRoaming()Z
-HSPLandroid/telephony/ServiceState;->getDataRoamingFromRegistration()Z
-HSPLandroid/telephony/ServiceState;->getDataRoamingType()I
-HSPLandroid/telephony/ServiceState;->getDuplexMode()I
-HSPLandroid/telephony/ServiceState;->getNetworkRegistrationInfo(II)Landroid/telephony/NetworkRegistrationInfo;
-HSPLandroid/telephony/ServiceState;->getNetworkRegistrationInfoList()Ljava/util/List;
-HSPLandroid/telephony/ServiceState;->getNrState()I
-HSPLandroid/telephony/ServiceState;->getOperatorAlphaShort()Ljava/lang/String;
-HPLandroid/telephony/ServiceState;->getRadioTechnology()I
-HSPLandroid/telephony/ServiceState;->getRilDataRadioTechnology()I
-HSPLandroid/telephony/ServiceState;->getRilVoiceRadioTechnology()I
-HSPLandroid/telephony/ServiceState;->getRoaming()Z
-HSPLandroid/telephony/ServiceState;->getState()I
-HSPLandroid/telephony/ServiceState;->getVoiceRegState()I
-HSPLandroid/telephony/ServiceState;->getVoiceRoaming()Z
-HSPLandroid/telephony/ServiceState;->getVoiceRoamingType()I
-HSPLandroid/telephony/ServiceState;->isEmergencyOnly()Z
-HSPLandroid/telephony/ServiceState;->isUsingCarrierAggregation()Z
-HSPLandroid/telephony/ServiceState;->networkTypeToRilRadioTechnology(I)I
-HSPLandroid/telephony/ServiceState;->newFromBundle(Landroid/os/Bundle;)Landroid/telephony/ServiceState;
-HSPLandroid/telephony/ServiceState;->rilRadioTechnologyToString(I)Ljava/lang/String;
-HSPLandroid/telephony/ServiceState;->rilServiceStateToString(I)Ljava/lang/String;
-HSPLandroid/telephony/ServiceState;->roamingTypeToString(I)Ljava/lang/String;
-HSPLandroid/telephony/ServiceState;->setFromNotifierBundle(Landroid/os/Bundle;)V
-HSPLandroid/telephony/ServiceState;->toString()Ljava/lang/String;
-HSPLandroid/telephony/ServiceState;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/telephony/SignalStrength$1;->createFromParcel(Landroid/os/Parcel;)Landroid/telephony/SignalStrength;
-HSPLandroid/telephony/SignalStrength$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/telephony/SignalStrength;-><init>()V
-HSPLandroid/telephony/SignalStrength;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/telephony/SignalStrength;-><init>(Landroid/telephony/CellSignalStrengthCdma;Landroid/telephony/CellSignalStrengthGsm;Landroid/telephony/CellSignalStrengthWcdma;Landroid/telephony/CellSignalStrengthTdscdma;Landroid/telephony/CellSignalStrengthLte;Landroid/telephony/CellSignalStrengthNr;)V
 PLandroid/telephony/SignalStrength;-><init>(Landroid/telephony/SignalStrength;)V
 HPLandroid/telephony/SignalStrength;->copyFrom(Landroid/telephony/SignalStrength;)V
-HSPLandroid/telephony/SignalStrength;->getCellSignalStrengths()Ljava/util/List;
-HSPLandroid/telephony/SignalStrength;->getCellSignalStrengths(Ljava/lang/Class;)Ljava/util/List;
-HSPLandroid/telephony/SignalStrength;->getLevel()I
-HSPLandroid/telephony/SignalStrength;->getPrimary()Landroid/telephony/CellSignalStrength;
 HSPLandroid/telephony/SignalStrength;->isGsm()Z
-HSPLandroid/telephony/SignalStrength;->toString()Ljava/lang/String;
-HSPLandroid/telephony/SignalStrength;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/telephony/SmsManager;-><init>(I)V
-HSPLandroid/telephony/SmsManager;->getDefault()Landroid/telephony/SmsManager;
-HSPLandroid/telephony/SmsManager;->getISmsService()Lcom/android/internal/telephony/ISms;
 HSPLandroid/telephony/SmsManager;->getSmsManagerForSubscriptionId(I)Landroid/telephony/SmsManager;
 HSPLandroid/telephony/SmsManager;->getSubscriptionId()I
-HSPLandroid/telephony/SmsMessage;-><init>(Lcom/android/internal/telephony/SmsMessageBase;)V
-HSPLandroid/telephony/SmsMessage;->createFromPdu([BLjava/lang/String;)Landroid/telephony/SmsMessage;
-HSPLandroid/telephony/SmsMessage;->createFromPdu([BLjava/lang/String;Z)Landroid/telephony/SmsMessage;
-HSPLandroid/telephony/SmsMessage;->getMessageBody()Ljava/lang/String;
 HSPLandroid/telephony/SubscriptionInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/telephony/SubscriptionInfo;
 HSPLandroid/telephony/SubscriptionInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/telephony/SubscriptionInfo;-><init>(ILjava/lang/String;ILjava/lang/CharSequence;Ljava/lang/CharSequence;IILjava/lang/String;ILandroid/graphics/Bitmap;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Z[Landroid/telephony/UiccAccessRule;Ljava/lang/String;IZLjava/lang/String;ZIIILjava/lang/String;[Landroid/telephony/UiccAccessRule;Z)V
@@ -21814,7 +19220,6 @@
 HSPLandroid/telephony/SubscriptionInfo;->getAllAccessRules()Ljava/util/List;
 HSPLandroid/telephony/SubscriptionInfo;->getCarrierId()I
 HSPLandroid/telephony/SubscriptionInfo;->getCarrierName()Ljava/lang/CharSequence;
-HSPLandroid/telephony/SubscriptionInfo;->getDataRoaming()I
 HSPLandroid/telephony/SubscriptionInfo;->getDisplayName()Ljava/lang/CharSequence;
 HSPLandroid/telephony/SubscriptionInfo;->getGroupUuid()Landroid/os/ParcelUuid;
 HSPLandroid/telephony/SubscriptionInfo;->getIccId()Ljava/lang/String;
@@ -21824,163 +19229,27 @@
 HSPLandroid/telephony/SubscriptionInfo;->getNumber()Ljava/lang/String;
 HSPLandroid/telephony/SubscriptionInfo;->getSimSlotIndex()I
 HSPLandroid/telephony/SubscriptionInfo;->getSubscriptionId()I
-HSPLandroid/telephony/SubscriptionInfo;->givePrintableIccid(Ljava/lang/String;)Ljava/lang/String;
 HSPLandroid/telephony/SubscriptionInfo;->isEmbedded()Z
 HSPLandroid/telephony/SubscriptionInfo;->isOpportunistic()Z
 HSPLandroid/telephony/SubscriptionInfo;->setAssociatedPlmns([Ljava/lang/String;[Ljava/lang/String;)V
 HSPLandroid/telephony/SubscriptionInfo;->toString()Ljava/lang/String;
-HSPLandroid/telephony/SubscriptionManager$OnSubscriptionsChangedListener$OnSubscriptionsChangedListenerHandler;-><init>(Landroid/telephony/SubscriptionManager$OnSubscriptionsChangedListener;)V
-HSPLandroid/telephony/SubscriptionManager$OnSubscriptionsChangedListener$OnSubscriptionsChangedListenerHandler;-><init>(Landroid/telephony/SubscriptionManager$OnSubscriptionsChangedListener;Landroid/os/Looper;)V
-HSPLandroid/telephony/SubscriptionManager$OnSubscriptionsChangedListener;-><init>()V
-HSPLandroid/telephony/SubscriptionManager$OnSubscriptionsChangedListener;-><init>(Landroid/os/Looper;)V
-HSPLandroid/telephony/SubscriptionManager$OnSubscriptionsChangedListener;->access$000(Landroid/telephony/SubscriptionManager$OnSubscriptionsChangedListener;)Lcom/android/internal/telephony/util/HandlerExecutor;
-HSPLandroid/telephony/SubscriptionManager;-><init>(Landroid/content/Context;)V
-HSPLandroid/telephony/SubscriptionManager;->addOnSubscriptionsChangedListener(Landroid/telephony/SubscriptionManager$OnSubscriptionsChangedListener;)V
-HSPLandroid/telephony/SubscriptionManager;->addOnSubscriptionsChangedListener(Ljava/util/concurrent/Executor;Landroid/telephony/SubscriptionManager$OnSubscriptionsChangedListener;)V
 HSPLandroid/telephony/SubscriptionManager;->canManageSubscription(Landroid/telephony/SubscriptionInfo;Ljava/lang/String;)Z
-HSPLandroid/telephony/SubscriptionManager;->from(Landroid/content/Context;)Landroid/telephony/SubscriptionManager;
-HSPLandroid/telephony/SubscriptionManager;->getActiveAndHiddenSubscriptionIdList()[I
-HSPLandroid/telephony/SubscriptionManager;->getActiveAndHiddenSubscriptionInfoList()Ljava/util/List;
-HSPLandroid/telephony/SubscriptionManager;->getActiveDataSubscriptionId()I
-HSPLandroid/telephony/SubscriptionManager;->getActiveSubscriptionIdList(Z)[I
-HSPLandroid/telephony/SubscriptionManager;->getActiveSubscriptionInfo(I)Landroid/telephony/SubscriptionInfo;
-HSPLandroid/telephony/SubscriptionManager;->getActiveSubscriptionInfoCount()I
-HSPLandroid/telephony/SubscriptionManager;->getActiveSubscriptionInfoCountMax()I
-HSPLandroid/telephony/SubscriptionManager;->getActiveSubscriptionInfoList()Ljava/util/List;
-HSPLandroid/telephony/SubscriptionManager;->getActiveSubscriptionInfoList(Z)Ljava/util/List;
-HSPLandroid/telephony/SubscriptionManager;->getAvailableSubscriptionInfoList()Ljava/util/List;
-HSPLandroid/telephony/SubscriptionManager;->getDefaultDataSubscriptionId()I
-HSPLandroid/telephony/SubscriptionManager;->getDefaultSmsSubscriptionId()I
-HSPLandroid/telephony/SubscriptionManager;->getDefaultSubscriptionId()I
-HSPLandroid/telephony/SubscriptionManager;->getDefaultVoiceSubscriptionId()I
-HSPLandroid/telephony/SubscriptionManager;->getPhoneId(I)I
-HSPLandroid/telephony/SubscriptionManager;->getResourcesForSubId(Landroid/content/Context;I)Landroid/content/res/Resources;
-HSPLandroid/telephony/SubscriptionManager;->getResourcesForSubId(Landroid/content/Context;IZ)Landroid/content/res/Resources;
-HSPLandroid/telephony/SubscriptionManager;->getSimStateForSlotIndex(I)I
-HSPLandroid/telephony/SubscriptionManager;->getSlotIndex(I)I
 HSPLandroid/telephony/SubscriptionManager;->isSubscriptionVisible(Landroid/telephony/SubscriptionInfo;)Z
-HSPLandroid/telephony/SubscriptionManager;->isUsableSubIdValue(I)Z
-HSPLandroid/telephony/SubscriptionManager;->isValidSlotIndex(I)Z
-HSPLandroid/telephony/SubscriptionManager;->isValidSubscriptionId(I)Z
 HSPLandroid/telephony/SubscriptionManager;->lambda$getActiveSubscriptionInfoList$0$SubscriptionManager(Landroid/telephony/SubscriptionInfo;)Z
 HSPLandroid/telephony/SubscriptionManager;->removeOnSubscriptionsChangedListener(Landroid/telephony/SubscriptionManager$OnSubscriptionsChangedListener;)V
-PLandroid/telephony/SubscriptionPlan$1;->newArray(I)[Landroid/telephony/SubscriptionPlan;
-PLandroid/telephony/SubscriptionPlan$1;->newArray(I)[Ljava/lang/Object;
-HSPLandroid/telephony/TelephonyFrameworkInitializer;->getTelephonyServiceManager()Landroid/os/TelephonyServiceManager;
-HSPLandroid/telephony/TelephonyFrameworkInitializer;->lambda$registerServiceWrappers$0(Landroid/content/Context;)Landroid/telephony/TelephonyManager;
-HSPLandroid/telephony/TelephonyFrameworkInitializer;->lambda$registerServiceWrappers$1(Landroid/content/Context;)Landroid/telephony/SubscriptionManager;
-HSPLandroid/telephony/TelephonyFrameworkInitializer;->lambda$registerServiceWrappers$2(Landroid/content/Context;)Landroid/telephony/CarrierConfigManager;
-HSPLandroid/telephony/TelephonyFrameworkInitializer;->lambda$registerServiceWrappers$3(Landroid/content/Context;)Landroid/telephony/euicc/EuiccManager;
-HSPLandroid/telephony/TelephonyFrameworkInitializer;->setTelephonyServiceManager(Landroid/os/TelephonyServiceManager;)V
-HSPLandroid/telephony/TelephonyManager$1;-><init>(Landroid/telephony/TelephonyManager;Ljava/util/concurrent/Executor;Landroid/telephony/TelephonyManager$CellInfoCallback;)V
-HSPLandroid/telephony/TelephonyManager$1;->lambda$onCellInfo$0(Landroid/telephony/TelephonyManager$CellInfoCallback;Ljava/util/List;)V
-HSPLandroid/telephony/TelephonyManager$1;->onCellInfo(Ljava/util/List;)V
-HSPLandroid/telephony/TelephonyManager$2;-><init>(Landroid/telephony/TelephonyManager;Ljava/util/concurrent/Executor;Landroid/telephony/TelephonyManager$CellInfoCallback;)V
-HSPLandroid/telephony/TelephonyManager$2;->lambda$onCellInfo$0(Landroid/telephony/TelephonyManager$CellInfoCallback;Ljava/util/List;)V
-HSPLandroid/telephony/TelephonyManager$2;->onCellInfo(Ljava/util/List;)V
-HSPLandroid/telephony/TelephonyManager$CellInfoCallback;-><init>()V
-HSPLandroid/telephony/TelephonyManager;-><init>(Landroid/content/Context;)V
-HSPLandroid/telephony/TelephonyManager;-><init>(Landroid/content/Context;I)V
+HSPLandroid/telephony/SubscriptionPlan$1;->newArray(I)[Landroid/telephony/SubscriptionPlan;
+HSPLandroid/telephony/SubscriptionPlan$1;->newArray(I)[Ljava/lang/Object;
 HSPLandroid/telephony/TelephonyManager;->checkCarrierPrivilegesForPackage(Ljava/lang/String;)I
-HSPLandroid/telephony/TelephonyManager;->checkCarrierPrivilegesForPackageAnyPhone(Ljava/lang/String;)I
-HSPLandroid/telephony/TelephonyManager;->createForPhoneAccountHandle(Landroid/telecom/PhoneAccountHandle;)Landroid/telephony/TelephonyManager;
-HSPLandroid/telephony/TelephonyManager;->createForSubscriptionId(I)Landroid/telephony/TelephonyManager;
-HSPLandroid/telephony/TelephonyManager;->from(Landroid/content/Context;)Landroid/telephony/TelephonyManager;
-HSPLandroid/telephony/TelephonyManager;->getActiveModemCount()I
-HSPLandroid/telephony/TelephonyManager;->getAllCellInfo()Ljava/util/List;
 HSPLandroid/telephony/TelephonyManager;->getAllNetworkTypes()[I
-HSPLandroid/telephony/TelephonyManager;->getCallState()I
-HSPLandroid/telephony/TelephonyManager;->getCardIdForDefaultEuicc()I
-HSPLandroid/telephony/TelephonyManager;->getCarrierConfig()Landroid/os/PersistableBundle;
-HSPLandroid/telephony/TelephonyManager;->getCarrierPackageNamesForIntentAndPhone(Landroid/content/Intent;I)Ljava/util/List;
+HSPLandroid/telephony/TelephonyManager;->getAttributionTag()Ljava/lang/String;
 HSPLandroid/telephony/TelephonyManager;->getCarrierPrivilegeStatus(I)I
-HSPLandroid/telephony/TelephonyManager;->getCarrierPrivilegedPackagesForAllActiveSubscriptions()Ljava/util/List;
-HSPLandroid/telephony/TelephonyManager;->getCellLocation()Landroid/telephony/CellLocation;
-HSPLandroid/telephony/TelephonyManager;->getCurrentPhoneType()I
-HSPLandroid/telephony/TelephonyManager;->getCurrentPhoneType(I)I
-HSPLandroid/telephony/TelephonyManager;->getCurrentPhoneTypeForSlot(I)I
-HSPLandroid/telephony/TelephonyManager;->getDataActivity()I
-HSPLandroid/telephony/TelephonyManager;->getDataEnabled()Z
-HSPLandroid/telephony/TelephonyManager;->getDataEnabled(I)Z
-HSPLandroid/telephony/TelephonyManager;->getDataNetworkType()I
-HSPLandroid/telephony/TelephonyManager;->getDataNetworkType(I)I
-HSPLandroid/telephony/TelephonyManager;->getDataState()I
-HSPLandroid/telephony/TelephonyManager;->getDefault()Landroid/telephony/TelephonyManager;
-HSPLandroid/telephony/TelephonyManager;->getDefaultSimCountryIso()Ljava/lang/String;
-HSPLandroid/telephony/TelephonyManager;->getDeviceId()Ljava/lang/String;
-HSPLandroid/telephony/TelephonyManager;->getEmergencyNumberList()Ljava/util/Map;
-HSPLandroid/telephony/TelephonyManager;->getFeatureId()Ljava/lang/String;
 HSPLandroid/telephony/TelephonyManager;->getGroupIdLevel1()Ljava/lang/String;
-HSPLandroid/telephony/TelephonyManager;->getITelephony()Lcom/android/internal/telephony/ITelephony;
-HSPLandroid/telephony/TelephonyManager;->getImei()Ljava/lang/String;
-HSPLandroid/telephony/TelephonyManager;->getImei(I)Ljava/lang/String;
-HSPLandroid/telephony/TelephonyManager;->getLine1Number()Ljava/lang/String;
-HSPLandroid/telephony/TelephonyManager;->getLine1Number(I)Ljava/lang/String;
-HSPLandroid/telephony/TelephonyManager;->getMeid()Ljava/lang/String;
-HSPLandroid/telephony/TelephonyManager;->getMeid(I)Ljava/lang/String;
 HSPLandroid/telephony/TelephonyManager;->getMergedImsisFromGroup()[Ljava/lang/String;
-HSPLandroid/telephony/TelephonyManager;->getMultiSimConfiguration()Landroid/telephony/TelephonyManager$MultiSimVariants;
-HSPLandroid/telephony/TelephonyManager;->getNetworkCountryIso()Ljava/lang/String;
-HSPLandroid/telephony/TelephonyManager;->getNetworkCountryIso(I)Ljava/lang/String;
-HSPLandroid/telephony/TelephonyManager;->getNetworkOperator()Ljava/lang/String;
-HSPLandroid/telephony/TelephonyManager;->getNetworkOperatorForPhone(I)Ljava/lang/String;
-HSPLandroid/telephony/TelephonyManager;->getNetworkOperatorName()Ljava/lang/String;
-HSPLandroid/telephony/TelephonyManager;->getNetworkOperatorName(I)Ljava/lang/String;
-HSPLandroid/telephony/TelephonyManager;->getNetworkType()I
-HSPLandroid/telephony/TelephonyManager;->getNetworkType(I)I
-HSPLandroid/telephony/TelephonyManager;->getNetworkTypeName(I)Ljava/lang/String;
-HSPLandroid/telephony/TelephonyManager;->getOpPackageName()Ljava/lang/String;
-HSPLandroid/telephony/TelephonyManager;->getPhoneCount()I
-HSPLandroid/telephony/TelephonyManager;->getPhoneId()I
-HSPLandroid/telephony/TelephonyManager;->getPhoneType()I
-HSPLandroid/telephony/TelephonyManager;->getPhoneType(I)I
-HSPLandroid/telephony/TelephonyManager;->getPhoneTypeFromNetworkType(I)I
-HSPLandroid/telephony/TelephonyManager;->getPhoneTypeFromProperty(I)I
-HSPLandroid/telephony/TelephonyManager;->getServiceState()Landroid/telephony/ServiceState;
-HSPLandroid/telephony/TelephonyManager;->getServiceStateForSubscriber(I)Landroid/telephony/ServiceState;
-HSPLandroid/telephony/TelephonyManager;->getSimCarrierId()I
-HSPLandroid/telephony/TelephonyManager;->getSimCountryIso()Ljava/lang/String;
-HSPLandroid/telephony/TelephonyManager;->getSimCountryIso(I)Ljava/lang/String;
-HSPLandroid/telephony/TelephonyManager;->getSimCountryIsoForPhone(I)Ljava/lang/String;
-HSPLandroid/telephony/TelephonyManager;->getSimOperator()Ljava/lang/String;
-HSPLandroid/telephony/TelephonyManager;->getSimOperatorName()Ljava/lang/String;
-HSPLandroid/telephony/TelephonyManager;->getSimOperatorNameForPhone(I)Ljava/lang/String;
-HSPLandroid/telephony/TelephonyManager;->getSimOperatorNumeric()Ljava/lang/String;
-HSPLandroid/telephony/TelephonyManager;->getSimOperatorNumeric(I)Ljava/lang/String;
-HSPLandroid/telephony/TelephonyManager;->getSimOperatorNumericForPhone(I)Ljava/lang/String;
-HSPLandroid/telephony/TelephonyManager;->getSimSerialNumber()Ljava/lang/String;
-HSPLandroid/telephony/TelephonyManager;->getSimSerialNumber(I)Ljava/lang/String;
-HSPLandroid/telephony/TelephonyManager;->getSimState()I
-HSPLandroid/telephony/TelephonyManager;->getSimState(I)I
-HSPLandroid/telephony/TelephonyManager;->getSimStateIncludingLoaded()I
-HSPLandroid/telephony/TelephonyManager;->getSlotIndex()I
-HSPLandroid/telephony/TelephonyManager;->getSubId()I
-HSPLandroid/telephony/TelephonyManager;->getSubId(I)I
-HSPLandroid/telephony/TelephonyManager;->getSubscriberId()Ljava/lang/String;
-HSPLandroid/telephony/TelephonyManager;->getSubscriberId(I)Ljava/lang/String;
 HSPLandroid/telephony/TelephonyManager;->getSubscriberInfo()Lcom/android/internal/telephony/IPhoneSubInfo;
 HPLandroid/telephony/TelephonyManager;->getSubscriptionId()I
-HSPLandroid/telephony/TelephonyManager;->getSubscriptionId(Landroid/telecom/PhoneAccountHandle;)I
-HSPLandroid/telephony/TelephonyManager;->getSupportedModemCount()I
-HSPLandroid/telephony/TelephonyManager;->getTelephonyProperty(ILjava/util/List;Ljava/lang/Object;)Ljava/lang/Object;
 HSPLandroid/telephony/TelephonyManager;->getTelephonyRegistry()Lcom/android/internal/telephony/ITelephonyRegistry;
-HSPLandroid/telephony/TelephonyManager;->getVisualVoicemailPackageName()Ljava/lang/String;
-HSPLandroid/telephony/TelephonyManager;->getVoiceNetworkType()I
-HSPLandroid/telephony/TelephonyManager;->getVoiceNetworkType(I)I
-HSPLandroid/telephony/TelephonyManager;->getVtDataUsage(I)Landroid/net/NetworkStats;
-HSPLandroid/telephony/TelephonyManager;->hasCarrierPrivileges(I)Z
-HSPLandroid/telephony/TelephonyManager;->isDataConnectionEnabled()Z
-HSPLandroid/telephony/TelephonyManager;->isDataEnabled()Z
+HSPLandroid/telephony/TelephonyManager;->getVoiceMailNumber(I)Ljava/lang/String;
 HSPLandroid/telephony/TelephonyManager;->isEmergencyNumber(Ljava/lang/String;)Z
-HSPLandroid/telephony/TelephonyManager;->isNetworkRoaming()Z
-HSPLandroid/telephony/TelephonyManager;->isNetworkRoaming(I)Z
-HSPLandroid/telephony/TelephonyManager;->isSmsCapable()Z
-HSPLandroid/telephony/TelephonyManager;->isTetheringApnRequired(I)Z
-HSPLandroid/telephony/TelephonyManager;->isVoiceCapable()Z
-HSPLandroid/telephony/TelephonyManager;->listen(Landroid/telephony/PhoneStateListener;I)V
-HSPLandroid/telephony/TelephonyManager;->requestCellInfoUpdate(Landroid/os/WorkSource;Ljava/util/concurrent/Executor;Landroid/telephony/TelephonyManager$CellInfoCallback;)V
-HSPLandroid/telephony/TelephonyManager;->requestCellInfoUpdate(Ljava/util/concurrent/Executor;Landroid/telephony/TelephonyManager$CellInfoCallback;)V
-HSPLandroid/telephony/TelephonyManager;->requestModemActivityInfo(Landroid/os/ResultReceiver;)V
 HPLandroid/telephony/TelephonyManager;->setPolicyDataEnabled(Z)V
 HSPLandroid/telephony/TelephonyRegistryManager$1;-><init>(Landroid/telephony/TelephonyRegistryManager;Ljava/util/concurrent/Executor;Landroid/telephony/SubscriptionManager$OnSubscriptionsChangedListener;)V
 HSPLandroid/telephony/TelephonyRegistryManager$1;->lambda$onSubscriptionsChanged$0(Landroid/telephony/SubscriptionManager$OnSubscriptionsChangedListener;)V
@@ -21994,54 +19263,14 @@
 HSPLandroid/telephony/UiccAccessRule$1;->newArray(I)[Landroid/telephony/UiccAccessRule;
 HSPLandroid/telephony/UiccAccessRule$1;->newArray(I)[Ljava/lang/Object;
 HSPLandroid/telephony/UiccAccessRule;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/telephony/VoiceSpecificRegistrationInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/telephony/VoiceSpecificRegistrationInfo;
-HSPLandroid/telephony/VoiceSpecificRegistrationInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/telephony/VoiceSpecificRegistrationInfo;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/telephony/VoiceSpecificRegistrationInfo;-><init>(Landroid/os/Parcel;Landroid/telephony/VoiceSpecificRegistrationInfo$1;)V
-HSPLandroid/telephony/VoiceSpecificRegistrationInfo;-><init>(Landroid/telephony/VoiceSpecificRegistrationInfo;)V
-HSPLandroid/telephony/VoiceSpecificRegistrationInfo;->equals(Ljava/lang/Object;)Z
-HSPLandroid/telephony/VoiceSpecificRegistrationInfo;->toString()Ljava/lang/String;
-HSPLandroid/telephony/VoiceSpecificRegistrationInfo;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/telephony/data/ApnSetting$1;->createFromParcel(Landroid/os/Parcel;)Landroid/telephony/data/ApnSetting;
 HSPLandroid/telephony/data/ApnSetting$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/telephony/data/ApnSetting$Builder;-><init>()V
-HSPLandroid/telephony/data/ApnSetting$Builder;->access$000(Landroid/telephony/data/ApnSetting$Builder;)Ljava/lang/String;
-HSPLandroid/telephony/data/ApnSetting$Builder;->access$100(Landroid/telephony/data/ApnSetting$Builder;)Ljava/lang/String;
-HSPLandroid/telephony/data/ApnSetting$Builder;->access$1000(Landroid/telephony/data/ApnSetting$Builder;)I
-HSPLandroid/telephony/data/ApnSetting$Builder;->access$1100(Landroid/telephony/data/ApnSetting$Builder;)I
-HSPLandroid/telephony/data/ApnSetting$Builder;->access$1200(Landroid/telephony/data/ApnSetting$Builder;)Ljava/lang/String;
-HSPLandroid/telephony/data/ApnSetting$Builder;->access$1300(Landroid/telephony/data/ApnSetting$Builder;)I
-HSPLandroid/telephony/data/ApnSetting$Builder;->access$1400(Landroid/telephony/data/ApnSetting$Builder;)I
-HSPLandroid/telephony/data/ApnSetting$Builder;->access$1500(Landroid/telephony/data/ApnSetting$Builder;)I
-HSPLandroid/telephony/data/ApnSetting$Builder;->access$1600(Landroid/telephony/data/ApnSetting$Builder;)Z
-HSPLandroid/telephony/data/ApnSetting$Builder;->access$1700(Landroid/telephony/data/ApnSetting$Builder;)I
-HSPLandroid/telephony/data/ApnSetting$Builder;->access$1800(Landroid/telephony/data/ApnSetting$Builder;)I
-HSPLandroid/telephony/data/ApnSetting$Builder;->access$1900(Landroid/telephony/data/ApnSetting$Builder;)Z
-HSPLandroid/telephony/data/ApnSetting$Builder;->access$200(Landroid/telephony/data/ApnSetting$Builder;)Ljava/lang/String;
-HSPLandroid/telephony/data/ApnSetting$Builder;->access$2000(Landroid/telephony/data/ApnSetting$Builder;)I
-HSPLandroid/telephony/data/ApnSetting$Builder;->access$2100(Landroid/telephony/data/ApnSetting$Builder;)I
-HSPLandroid/telephony/data/ApnSetting$Builder;->access$2200(Landroid/telephony/data/ApnSetting$Builder;)I
-HSPLandroid/telephony/data/ApnSetting$Builder;->access$2300(Landroid/telephony/data/ApnSetting$Builder;)I
-HSPLandroid/telephony/data/ApnSetting$Builder;->access$2400(Landroid/telephony/data/ApnSetting$Builder;)Ljava/lang/String;
-HSPLandroid/telephony/data/ApnSetting$Builder;->access$2500(Landroid/telephony/data/ApnSetting$Builder;)I
-HSPLandroid/telephony/data/ApnSetting$Builder;->access$2600(Landroid/telephony/data/ApnSetting$Builder;)I
-HSPLandroid/telephony/data/ApnSetting$Builder;->access$2700(Landroid/telephony/data/ApnSetting$Builder;)I
 HSPLandroid/telephony/data/ApnSetting$Builder;->access$2800(Landroid/telephony/data/ApnSetting$Builder;I)Landroid/telephony/data/ApnSetting$Builder;
-HSPLandroid/telephony/data/ApnSetting$Builder;->access$300(Landroid/telephony/data/ApnSetting$Builder;)I
-HSPLandroid/telephony/data/ApnSetting$Builder;->access$400(Landroid/telephony/data/ApnSetting$Builder;)Landroid/net/Uri;
-HSPLandroid/telephony/data/ApnSetting$Builder;->access$500(Landroid/telephony/data/ApnSetting$Builder;)Ljava/lang/String;
-HSPLandroid/telephony/data/ApnSetting$Builder;->access$600(Landroid/telephony/data/ApnSetting$Builder;)I
-HSPLandroid/telephony/data/ApnSetting$Builder;->access$700(Landroid/telephony/data/ApnSetting$Builder;)Ljava/lang/String;
-HSPLandroid/telephony/data/ApnSetting$Builder;->access$800(Landroid/telephony/data/ApnSetting$Builder;)Ljava/lang/String;
-HSPLandroid/telephony/data/ApnSetting$Builder;->access$900(Landroid/telephony/data/ApnSetting$Builder;)I
 HSPLandroid/telephony/data/ApnSetting$Builder;->buildWithoutCheck()Landroid/telephony/data/ApnSetting;
-HSPLandroid/telephony/data/ApnSetting$Builder;->setApnName(Ljava/lang/String;)Landroid/telephony/data/ApnSetting$Builder;
 HSPLandroid/telephony/data/ApnSetting$Builder;->setApnSetId(I)Landroid/telephony/data/ApnSetting$Builder;
-HSPLandroid/telephony/data/ApnSetting$Builder;->setApnTypeBitmask(I)Landroid/telephony/data/ApnSetting$Builder;
 HSPLandroid/telephony/data/ApnSetting$Builder;->setAuthType(I)Landroid/telephony/data/ApnSetting$Builder;
 HSPLandroid/telephony/data/ApnSetting$Builder;->setCarrierEnabled(Z)Landroid/telephony/data/ApnSetting$Builder;
 HSPLandroid/telephony/data/ApnSetting$Builder;->setCarrierId(I)Landroid/telephony/data/ApnSetting$Builder;
-HSPLandroid/telephony/data/ApnSetting$Builder;->setEntryName(Ljava/lang/String;)Landroid/telephony/data/ApnSetting$Builder;
 HSPLandroid/telephony/data/ApnSetting$Builder;->setId(I)Landroid/telephony/data/ApnSetting$Builder;
 HSPLandroid/telephony/data/ApnSetting$Builder;->setMaxConns(I)Landroid/telephony/data/ApnSetting$Builder;
 HSPLandroid/telephony/data/ApnSetting$Builder;->setMaxConnsTime(I)Landroid/telephony/data/ApnSetting$Builder;
@@ -22052,40 +19281,18 @@
 HSPLandroid/telephony/data/ApnSetting$Builder;->setMtu(I)Landroid/telephony/data/ApnSetting$Builder;
 HSPLandroid/telephony/data/ApnSetting$Builder;->setMvnoMatchData(Ljava/lang/String;)Landroid/telephony/data/ApnSetting$Builder;
 HSPLandroid/telephony/data/ApnSetting$Builder;->setMvnoType(I)Landroid/telephony/data/ApnSetting$Builder;
-HSPLandroid/telephony/data/ApnSetting$Builder;->setNetworkTypeBitmask(I)Landroid/telephony/data/ApnSetting$Builder;
 HSPLandroid/telephony/data/ApnSetting$Builder;->setOperatorNumeric(Ljava/lang/String;)Landroid/telephony/data/ApnSetting$Builder;
 HSPLandroid/telephony/data/ApnSetting$Builder;->setPassword(Ljava/lang/String;)Landroid/telephony/data/ApnSetting$Builder;
 HSPLandroid/telephony/data/ApnSetting$Builder;->setProfileId(I)Landroid/telephony/data/ApnSetting$Builder;
-HSPLandroid/telephony/data/ApnSetting$Builder;->setProtocol(I)Landroid/telephony/data/ApnSetting$Builder;
 HSPLandroid/telephony/data/ApnSetting$Builder;->setProxyAddress(Ljava/lang/String;)Landroid/telephony/data/ApnSetting$Builder;
 HSPLandroid/telephony/data/ApnSetting$Builder;->setProxyPort(I)Landroid/telephony/data/ApnSetting$Builder;
-HSPLandroid/telephony/data/ApnSetting$Builder;->setRoamingProtocol(I)Landroid/telephony/data/ApnSetting$Builder;
 HSPLandroid/telephony/data/ApnSetting$Builder;->setSkip464Xlat(I)Landroid/telephony/data/ApnSetting$Builder;
 HSPLandroid/telephony/data/ApnSetting$Builder;->setUser(Ljava/lang/String;)Landroid/telephony/data/ApnSetting$Builder;
 HSPLandroid/telephony/data/ApnSetting$Builder;->setWaitTime(I)Landroid/telephony/data/ApnSetting$Builder;
-HSPLandroid/telephony/data/ApnSetting;-><init>(Landroid/telephony/data/ApnSetting$Builder;)V
-HSPLandroid/telephony/data/ApnSetting;-><init>(Landroid/telephony/data/ApnSetting$Builder;Landroid/telephony/data/ApnSetting$1;)V
-HSPLandroid/telephony/data/ApnSetting;->UriToString(Landroid/net/Uri;)Ljava/lang/String;
 HSPLandroid/telephony/data/ApnSetting;->access$2900(Landroid/os/Parcel;)Landroid/telephony/data/ApnSetting;
-HSPLandroid/telephony/data/ApnSetting;->equals(Ljava/lang/Object;)Z
-HSPLandroid/telephony/data/ApnSetting;->getApnTypesBitmaskFromString(Ljava/lang/String;)I
-HSPLandroid/telephony/data/ApnSetting;->getApnTypesStringFromBitmask(I)Ljava/lang/String;
 HSPLandroid/telephony/data/ApnSetting;->makeApnSetting(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILandroid/net/Uri;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;IIIIZIIZIIIIILjava/lang/String;III)Landroid/telephony/data/ApnSetting;
-HSPLandroid/telephony/data/ApnSetting;->portToString(I)Ljava/lang/String;
 HSPLandroid/telephony/data/ApnSetting;->readFromParcel(Landroid/os/Parcel;)Landroid/telephony/data/ApnSetting;
-HSPLandroid/telephony/data/ApnSetting;->toString()Ljava/lang/String;
 HSPLandroid/telephony/data/ApnSetting;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/telephony/emergency/EmergencyNumber$1;->createFromParcel(Landroid/os/Parcel;)Landroid/telephony/emergency/EmergencyNumber;
-HSPLandroid/telephony/emergency/EmergencyNumber$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/telephony/emergency/EmergencyNumber;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/telephony/emergency/EmergencyNumber;->isFromSources(I)Z
-HSPLandroid/telephony/emergency/EmergencyNumber;->toString()Ljava/lang/String;
-HSPLandroid/telephony/euicc/EuiccManager;-><init>(Landroid/content/Context;)V
-HSPLandroid/telephony/euicc/EuiccManager;->getIEuiccController()Lcom/android/internal/telephony/euicc/IEuiccController;
-HSPLandroid/telephony/euicc/EuiccManager;->isEnabled()Z
-HSPLandroid/telephony/euicc/EuiccManager;->refreshCardIdIfUninitialized()Z
-HSPLandroid/telephony/gsm/GsmCellLocation;-><init>()V
-HSPLandroid/telephony/gsm/GsmCellLocation;->isEmpty()Z
 HSPLandroid/telephony/gsm/GsmCellLocation;->setLacAndCid(II)V
 HSPLandroid/telephony/gsm/GsmCellLocation;->setPsc(I)V
 HSPLandroid/telephony/ims/ImsMmTelManager;-><init>(I)V
@@ -22096,17 +19303,11 @@
 HSPLandroid/telephony/ims/ImsReasonInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/telephony/ims/ImsReasonInfo;-><init>(Landroid/os/Parcel;)V
 HSPLandroid/telephony/ims/ImsReasonInfo;-><init>(Landroid/os/Parcel;Landroid/telephony/ims/ImsReasonInfo$1;)V
-HSPLandroid/telephony/ims/ImsReasonInfo;->toString()Ljava/lang/String;
-HSPLandroid/telephony/ims/ImsReasonInfo;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/telephony/ims/RegistrationManager$RegistrationCallback$RegistrationBinder;-><init>(Landroid/telephony/ims/RegistrationManager$RegistrationCallback;)V
-HSPLandroid/telephony/ims/RegistrationManager$RegistrationCallback;-><init>()V
-HSPLandroid/telephony/ims/aidl/IImsRegistrationCallback$Stub;-><init>()V
 HSPLandroid/text/-$$Lambda$Layout$MzjK2UE2G8VG0asK8_KWY3gHAmY;-><init>(Landroid/graphics/Path;)V
 HSPLandroid/text/-$$Lambda$Layout$MzjK2UE2G8VG0asK8_KWY3gHAmY;->accept(FFFFI)V
 HSPLandroid/text/AndroidBidi$EmojiBidiOverride;->classify(I)I
 HSPLandroid/text/AndroidBidi;->bidi(I[C[B)I
 HSPLandroid/text/AndroidBidi;->directions(I[BI[CII)Landroid/text/Layout$Directions;
-HSPLandroid/text/Annotation;-><init>(Ljava/lang/String;Ljava/lang/String;)V
 HSPLandroid/text/AutoGrowArray$ByteArray;-><init>()V
 HSPLandroid/text/AutoGrowArray$ByteArray;-><init>(I)V
 HSPLandroid/text/AutoGrowArray$ByteArray;->clear()V
@@ -22147,7 +19348,6 @@
 HSPLandroid/text/BidiFormatter;->unicodeWrap(Ljava/lang/CharSequence;)Ljava/lang/CharSequence;
 HSPLandroid/text/BidiFormatter;->unicodeWrap(Ljava/lang/CharSequence;Landroid/text/TextDirectionHeuristic;Z)Ljava/lang/CharSequence;
 HSPLandroid/text/BidiFormatter;->unicodeWrap(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/text/BidiFormatter;->unicodeWrap(Ljava/lang/String;Landroid/text/TextDirectionHeuristic;)Ljava/lang/String;
 HSPLandroid/text/BidiFormatter;->unicodeWrap(Ljava/lang/String;Landroid/text/TextDirectionHeuristic;Z)Ljava/lang/String;
 HSPLandroid/text/BoringLayout$Metrics;-><init>()V
 HSPLandroid/text/BoringLayout$Metrics;->access$000(Landroid/text/BoringLayout$Metrics;)V
@@ -22171,6 +19371,7 @@
 HSPLandroid/text/BoringLayout;->getParagraphDirection(I)I
 HSPLandroid/text/BoringLayout;->hasAnyInterestingChars(Ljava/lang/CharSequence;I)Z
 HSPLandroid/text/BoringLayout;->init(Ljava/lang/CharSequence;Landroid/text/TextPaint;Landroid/text/Layout$Alignment;Landroid/text/BoringLayout$Metrics;ZZ)V
+HSPLandroid/text/BoringLayout;->isBoring(Ljava/lang/CharSequence;Landroid/text/TextPaint;)Landroid/text/BoringLayout$Metrics;
 HSPLandroid/text/BoringLayout;->isBoring(Ljava/lang/CharSequence;Landroid/text/TextPaint;Landroid/text/TextDirectionHeuristic;Landroid/text/BoringLayout$Metrics;)Landroid/text/BoringLayout$Metrics;
 HSPLandroid/text/BoringLayout;->make(Ljava/lang/CharSequence;Landroid/text/TextPaint;ILandroid/text/Layout$Alignment;FFLandroid/text/BoringLayout$Metrics;Z)Landroid/text/BoringLayout;
 HSPLandroid/text/BoringLayout;->make(Ljava/lang/CharSequence;Landroid/text/TextPaint;ILandroid/text/Layout$Alignment;FFLandroid/text/BoringLayout$Metrics;ZLandroid/text/TextUtils$TruncateAt;I)Landroid/text/BoringLayout;
@@ -22193,7 +19394,6 @@
 HSPLandroid/text/DynamicLayout$Builder;->access$1300(Landroid/text/DynamicLayout$Builder;)I
 HSPLandroid/text/DynamicLayout$Builder;->access$1400(Landroid/text/DynamicLayout$Builder;)Ljava/lang/CharSequence;
 HSPLandroid/text/DynamicLayout$Builder;->access$1500(Landroid/text/DynamicLayout$Builder;)Z
-HSPLandroid/text/DynamicLayout$Builder;->access$1600(Landroid/text/DynamicLayout$Builder;)I
 HSPLandroid/text/DynamicLayout$Builder;->access$1700(Landroid/text/DynamicLayout$Builder;)Landroid/graphics/Paint$FontMetricsInt;
 HSPLandroid/text/DynamicLayout$Builder;->access$200(Landroid/text/DynamicLayout$Builder;)Landroid/text/TextUtils$TruncateAt;
 HSPLandroid/text/DynamicLayout$Builder;->access$300(Landroid/text/DynamicLayout$Builder;)Ljava/lang/CharSequence;
@@ -22262,40 +19462,22 @@
 HSPLandroid/text/Html;->fromHtml(Ljava/lang/String;)Landroid/text/Spanned;
 HSPLandroid/text/Html;->fromHtml(Ljava/lang/String;I)Landroid/text/Spanned;
 HSPLandroid/text/Html;->fromHtml(Ljava/lang/String;ILandroid/text/Html$ImageGetter;Landroid/text/Html$TagHandler;)Landroid/text/Spanned;
-HSPLandroid/text/Html;->fromHtml(Ljava/lang/String;Landroid/text/Html$ImageGetter;Landroid/text/Html$TagHandler;)Landroid/text/Spanned;
-HSPLandroid/text/HtmlToSpannedConverter$Bold;-><init>()V
-HSPLandroid/text/HtmlToSpannedConverter$Bold;-><init>(Landroid/text/HtmlToSpannedConverter$1;)V
-HSPLandroid/text/HtmlToSpannedConverter$Foreground;-><init>(I)V
-HSPLandroid/text/HtmlToSpannedConverter$Foreground;->access$1500(Landroid/text/HtmlToSpannedConverter$Foreground;)I
-HSPLandroid/text/HtmlToSpannedConverter$Href;-><init>(Ljava/lang/String;)V
-HSPLandroid/text/HtmlToSpannedConverter$Newline;-><init>(I)V
-HSPLandroid/text/HtmlToSpannedConverter$Newline;->access$900(Landroid/text/HtmlToSpannedConverter$Newline;)I
 HSPLandroid/text/HtmlToSpannedConverter;-><init>(Ljava/lang/String;Landroid/text/Html$ImageGetter;Landroid/text/Html$TagHandler;Lorg/ccil/cowan/tagsoup/Parser;I)V
-HSPLandroid/text/HtmlToSpannedConverter;->appendNewlines(Landroid/text/Editable;I)V
 HSPLandroid/text/HtmlToSpannedConverter;->characters([CII)V
 HSPLandroid/text/HtmlToSpannedConverter;->convert()Landroid/text/Spanned;
 HSPLandroid/text/HtmlToSpannedConverter;->end(Landroid/text/Editable;Ljava/lang/Class;Ljava/lang/Object;)V
 HSPLandroid/text/HtmlToSpannedConverter;->endA(Landroid/text/Editable;)V
-HSPLandroid/text/HtmlToSpannedConverter;->endBlockElement(Landroid/text/Editable;)V
-HSPLandroid/text/HtmlToSpannedConverter;->endCssStyle(Landroid/text/Editable;)V
 HSPLandroid/text/HtmlToSpannedConverter;->endDocument()V
 HSPLandroid/text/HtmlToSpannedConverter;->endElement(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/text/HtmlToSpannedConverter;->endFont(Landroid/text/Editable;)V
 HSPLandroid/text/HtmlToSpannedConverter;->endPrefixMapping(Ljava/lang/String;)V
-HSPLandroid/text/HtmlToSpannedConverter;->getHtmlColor(Ljava/lang/String;)I
 HSPLandroid/text/HtmlToSpannedConverter;->getLast(Landroid/text/Spanned;Ljava/lang/Class;)Ljava/lang/Object;
-HSPLandroid/text/HtmlToSpannedConverter;->handleBr(Landroid/text/Editable;)V
 HSPLandroid/text/HtmlToSpannedConverter;->handleEndTag(Ljava/lang/String;)V
 HSPLandroid/text/HtmlToSpannedConverter;->handleStartTag(Ljava/lang/String;Lorg/xml/sax/Attributes;)V
 HSPLandroid/text/HtmlToSpannedConverter;->setDocumentLocator(Lorg/xml/sax/Locator;)V
 HSPLandroid/text/HtmlToSpannedConverter;->setSpanFromMark(Landroid/text/Spannable;Ljava/lang/Object;[Ljava/lang/Object;)V
 HSPLandroid/text/HtmlToSpannedConverter;->start(Landroid/text/Editable;Ljava/lang/Object;)V
-HSPLandroid/text/HtmlToSpannedConverter;->startA(Landroid/text/Editable;Lorg/xml/sax/Attributes;)V
-HSPLandroid/text/HtmlToSpannedConverter;->startBlockElement(Landroid/text/Editable;Lorg/xml/sax/Attributes;I)V
-HSPLandroid/text/HtmlToSpannedConverter;->startCssStyle(Landroid/text/Editable;Lorg/xml/sax/Attributes;)V
 HSPLandroid/text/HtmlToSpannedConverter;->startDocument()V
 HSPLandroid/text/HtmlToSpannedConverter;->startElement(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lorg/xml/sax/Attributes;)V
-HSPLandroid/text/HtmlToSpannedConverter;->startFont(Landroid/text/Editable;Lorg/xml/sax/Attributes;)V
 HSPLandroid/text/HtmlToSpannedConverter;->startPrefixMapping(Ljava/lang/String;Ljava/lang/String;)V
 HSPLandroid/text/Hyphenator;->init()V
 HSPLandroid/text/InputFilter$LengthFilter;-><init>(I)V
@@ -22463,9 +19645,7 @@
 HSPLandroid/text/SpannableStringBuilder;-><init>()V
 HSPLandroid/text/SpannableStringBuilder;-><init>(Ljava/lang/CharSequence;)V
 HSPLandroid/text/SpannableStringBuilder;-><init>(Ljava/lang/CharSequence;II)V
-HSPLandroid/text/SpannableStringBuilder;->append(C)Landroid/text/Editable;
 HSPLandroid/text/SpannableStringBuilder;->append(C)Landroid/text/SpannableStringBuilder;
-HSPLandroid/text/SpannableStringBuilder;->append(Ljava/lang/CharSequence;)Landroid/text/Editable;
 HSPLandroid/text/SpannableStringBuilder;->append(Ljava/lang/CharSequence;)Landroid/text/SpannableStringBuilder;
 HSPLandroid/text/SpannableStringBuilder;->append(Ljava/lang/CharSequence;II)Landroid/text/SpannableStringBuilder;
 HSPLandroid/text/SpannableStringBuilder;->append(Ljava/lang/CharSequence;II)Ljava/lang/Appendable;
@@ -22479,7 +19659,6 @@
 HSPLandroid/text/SpannableStringBuilder;->countSpans(IILjava/lang/Class;I)I
 HSPLandroid/text/SpannableStringBuilder;->delete(II)Landroid/text/Editable;
 HSPLandroid/text/SpannableStringBuilder;->delete(II)Landroid/text/SpannableStringBuilder;
-HSPLandroid/text/SpannableStringBuilder;->drawTextRun(Landroid/graphics/BaseCanvas;IIIIFFZLandroid/graphics/Paint;)V
 HSPLandroid/text/SpannableStringBuilder;->equals(Ljava/lang/Object;)Z
 HSPLandroid/text/SpannableStringBuilder;->getChars(II[CI)V
 HSPLandroid/text/SpannableStringBuilder;->getSpanEnd(Ljava/lang/Object;)I
@@ -22488,7 +19667,6 @@
 HSPLandroid/text/SpannableStringBuilder;->getSpans(IILjava/lang/Class;)[Ljava/lang/Object;
 HSPLandroid/text/SpannableStringBuilder;->getSpans(IILjava/lang/Class;Z)[Ljava/lang/Object;
 HSPLandroid/text/SpannableStringBuilder;->getSpansRec(IILjava/lang/Class;I[Ljava/lang/Object;[I[IIZ)I
-HSPLandroid/text/SpannableStringBuilder;->getTextRunCursor(IIZIILandroid/graphics/Paint;)I
 HSPLandroid/text/SpannableStringBuilder;->getTextWatcherDepth()I
 HSPLandroid/text/SpannableStringBuilder;->hasNonExclusiveExclusiveSpanAt(Ljava/lang/CharSequence;I)Z
 HSPLandroid/text/SpannableStringBuilder;->insert(ILjava/lang/CharSequence;)Landroid/text/Editable;
@@ -22552,7 +19730,6 @@
 HSPLandroid/text/SpannableStringInternal;->setSpan(Ljava/lang/Object;IIIZ)V
 HSPLandroid/text/SpannableStringInternal;->toString()Ljava/lang/String;
 HSPLandroid/text/SpannedString;-><init>(Ljava/lang/CharSequence;)V
-HSPLandroid/text/SpannedString;-><init>(Ljava/lang/CharSequence;II)V
 HSPLandroid/text/SpannedString;-><init>(Ljava/lang/CharSequence;Z)V
 HSPLandroid/text/SpannedString;->equals(Ljava/lang/Object;)Z
 HSPLandroid/text/SpannedString;->getSpanEnd(Ljava/lang/Object;)I
@@ -22670,7 +19847,6 @@
 HSPLandroid/text/TextLine;->updateMetrics(Landroid/graphics/Paint$FontMetricsInt;IIIII)V
 HSPLandroid/text/TextPaint;-><init>()V
 HSPLandroid/text/TextPaint;-><init>(I)V
-HSPLandroid/text/TextPaint;-><init>(Landroid/graphics/Paint;)V
 HSPLandroid/text/TextPaint;->getUnderlineThickness()F
 HSPLandroid/text/TextPaint;->set(Landroid/text/TextPaint;)V
 HSPLandroid/text/TextPaint;->setUnderlineText(IF)V
@@ -22690,19 +19866,16 @@
 HSPLandroid/text/TextUtils;->concat([Ljava/lang/CharSequence;)Ljava/lang/CharSequence;
 HSPLandroid/text/TextUtils;->copySpansFrom(Landroid/text/Spanned;IILjava/lang/Class;Landroid/text/Spannable;I)V
 HSPLandroid/text/TextUtils;->couldAffectRtl(C)Z
-HSPLandroid/text/TextUtils;->delimitedStringContains(Ljava/lang/String;CLjava/lang/String;)Z
 HSPLandroid/text/TextUtils;->doesNotNeedBidi([CII)Z
 HSPLandroid/text/TextUtils;->ellipsize(Ljava/lang/CharSequence;Landroid/text/TextPaint;FLandroid/text/TextUtils$TruncateAt;)Ljava/lang/CharSequence;
 HSPLandroid/text/TextUtils;->ellipsize(Ljava/lang/CharSequence;Landroid/text/TextPaint;FLandroid/text/TextUtils$TruncateAt;ZLandroid/text/TextUtils$EllipsizeCallback;)Ljava/lang/CharSequence;
 HSPLandroid/text/TextUtils;->ellipsize(Ljava/lang/CharSequence;Landroid/text/TextPaint;FLandroid/text/TextUtils$TruncateAt;ZLandroid/text/TextUtils$EllipsizeCallback;Landroid/text/TextDirectionHeuristic;Ljava/lang/String;)Ljava/lang/CharSequence;
 HSPLandroid/text/TextUtils;->emptyIfNull(Ljava/lang/String;)Ljava/lang/String;
 HSPLandroid/text/TextUtils;->equals(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Z
-HSPLandroid/text/TextUtils;->expandTemplate(Ljava/lang/CharSequence;[Ljava/lang/CharSequence;)Ljava/lang/CharSequence;
 HSPLandroid/text/TextUtils;->getCapsMode(Ljava/lang/CharSequence;II)I
 HSPLandroid/text/TextUtils;->getChars(Ljava/lang/CharSequence;II[CI)V
 HSPLandroid/text/TextUtils;->getEllipsisString(Landroid/text/TextUtils$TruncateAt;)Ljava/lang/String;
 HSPLandroid/text/TextUtils;->getLayoutDirectionFromLocale(Ljava/util/Locale;)I
-HSPLandroid/text/TextUtils;->getTrimmedLength(Ljava/lang/CharSequence;)I
 HSPLandroid/text/TextUtils;->indexOf(Ljava/lang/CharSequence;C)I
 HSPLandroid/text/TextUtils;->indexOf(Ljava/lang/CharSequence;CI)I
 HSPLandroid/text/TextUtils;->indexOf(Ljava/lang/CharSequence;CII)I
@@ -22752,14 +19925,11 @@
 HSPLandroid/text/format/DateUtils;->formatDateRange(Landroid/content/Context;JJI)Ljava/lang/String;
 HSPLandroid/text/format/DateUtils;->formatDateRange(Landroid/content/Context;Ljava/util/Formatter;JJI)Ljava/util/Formatter;
 HSPLandroid/text/format/DateUtils;->formatDateRange(Landroid/content/Context;Ljava/util/Formatter;JJILjava/lang/String;)Ljava/util/Formatter;
-HSPLandroid/text/format/DateUtils;->formatDateTime(Landroid/content/Context;JI)Ljava/lang/String;
 HSPLandroid/text/format/DateUtils;->formatElapsedTime(J)Ljava/lang/String;
 HSPLandroid/text/format/DateUtils;->formatElapsedTime(Ljava/lang/StringBuilder;J)Ljava/lang/String;
 HSPLandroid/text/format/DateUtils;->getRelativeTimeSpanString(JJJI)Ljava/lang/CharSequence;
 HSPLandroid/text/format/DateUtils;->initFormatStrings()V
 HSPLandroid/text/format/DateUtils;->initFormatStringsLocked()V
-HSPLandroid/text/format/DateUtils;->isSameDate(JJ)Z
-HSPLandroid/text/format/DateUtils;->isToday(J)Z
 HSPLandroid/text/format/Formatter$BytesResult;-><init>(Ljava/lang/String;Ljava/lang/String;J)V
 HSPLandroid/text/format/Formatter;->bidiWrap(Landroid/content/Context;Ljava/lang/String;)Ljava/lang/String;
 HSPLandroid/text/format/Formatter;->formatBytes(Landroid/content/res/Resources;JI)Landroid/text/format/Formatter$BytesResult;
@@ -22768,19 +19938,10 @@
 HSPLandroid/text/format/Formatter;->formatShortElapsedTime(Landroid/content/Context;J)Ljava/lang/String;
 HSPLandroid/text/format/Formatter;->formatShortElapsedTimeRoundingUpToMinutes(Landroid/content/Context;J)Ljava/lang/String;
 HSPLandroid/text/format/Formatter;->localeFromContext(Landroid/content/Context;)Ljava/util/Locale;
-HSPLandroid/text/format/Time$TimeCalculator;-><init>(Ljava/lang/String;)V
-HSPLandroid/text/format/Time$TimeCalculator;->copyFieldsFromTime(Landroid/text/format/Time;)V
 HSPLandroid/text/format/Time$TimeCalculator;->copyFieldsToTime(Landroid/text/format/Time;)V
 HSPLandroid/text/format/Time$TimeCalculator;->lookupZoneInfo(Ljava/lang/String;)Llibcore/util/ZoneInfo;
 HSPLandroid/text/format/Time$TimeCalculator;->setTimeInMillis(J)V
-HSPLandroid/text/format/Time$TimeCalculator;->toMillis(Z)J
-HSPLandroid/text/format/Time$TimeCalculator;->updateZoneInfoFromTimeZone()V
 HSPLandroid/text/format/Time;-><init>()V
-HSPLandroid/text/format/Time;-><init>(Ljava/lang/String;)V
-HSPLandroid/text/format/Time;->getCurrentTimezone()Ljava/lang/String;
-HSPLandroid/text/format/Time;->getJulianDay(JJ)I
-HSPLandroid/text/format/Time;->initialize(Ljava/lang/String;)V
-HSPLandroid/text/format/Time;->normalize(Z)J
 HSPLandroid/text/format/Time;->set(J)V
 HSPLandroid/text/method/AllCapsTransformationMethod;-><init>(Landroid/content/Context;)V
 HSPLandroid/text/method/AllCapsTransformationMethod;->getTransformation(Ljava/lang/CharSequence;Landroid/view/View;)Ljava/lang/CharSequence;
@@ -22846,10 +20007,10 @@
 HSPLandroid/text/method/SingleLineTransformationMethod;->getOriginal()[C
 HSPLandroid/text/method/SingleLineTransformationMethod;->getReplacement()[C
 HSPLandroid/text/method/TextKeyListener$SettingsObserver;-><init>(Landroid/text/method/TextKeyListener;)V
-HPLandroid/text/method/TextKeyListener$SettingsObserver;->onChange(Z)V
+HSPLandroid/text/method/TextKeyListener$SettingsObserver;->onChange(Z)V
 HSPLandroid/text/method/TextKeyListener;-><init>(Landroid/text/method/TextKeyListener$Capitalize;Z)V
-HPLandroid/text/method/TextKeyListener;->access$000(Landroid/text/method/TextKeyListener;)Ljava/lang/ref/WeakReference;
-HPLandroid/text/method/TextKeyListener;->access$200(Landroid/text/method/TextKeyListener;Landroid/content/ContentResolver;)V
+HSPLandroid/text/method/TextKeyListener;->access$000(Landroid/text/method/TextKeyListener;)Ljava/lang/ref/WeakReference;
+HSPLandroid/text/method/TextKeyListener;->access$200(Landroid/text/method/TextKeyListener;Landroid/content/ContentResolver;)V
 HSPLandroid/text/method/TextKeyListener;->getInstance()Landroid/text/method/TextKeyListener;
 HSPLandroid/text/method/TextKeyListener;->getInstance(ZLandroid/text/method/TextKeyListener$Capitalize;)Landroid/text/method/TextKeyListener;
 HSPLandroid/text/method/TextKeyListener;->getKeyListener(Landroid/view/KeyEvent;)Landroid/text/method/KeyListener;
@@ -22884,17 +20045,10 @@
 HSPLandroid/text/style/CharacterStyle;->getUnderlying()Landroid/text/style/CharacterStyle;
 HSPLandroid/text/style/ClickableSpan;-><init>()V
 HSPLandroid/text/style/ClickableSpan;->updateDrawState(Landroid/text/TextPaint;)V
-HSPLandroid/text/style/DynamicDrawableSpan;-><init>(I)V
-HSPLandroid/text/style/DynamicDrawableSpan;->draw(Landroid/graphics/Canvas;Ljava/lang/CharSequence;IIFIIILandroid/graphics/Paint;)V
-HSPLandroid/text/style/DynamicDrawableSpan;->getCachedDrawable()Landroid/graphics/drawable/Drawable;
-HSPLandroid/text/style/DynamicDrawableSpan;->getSize(Landroid/graphics/Paint;Ljava/lang/CharSequence;IILandroid/graphics/Paint$FontMetricsInt;)I
 HSPLandroid/text/style/ForegroundColorSpan;-><init>(I)V
 HSPLandroid/text/style/ForegroundColorSpan;->getSpanTypeIdInternal()I
 HSPLandroid/text/style/ForegroundColorSpan;->updateDrawState(Landroid/text/TextPaint;)V
 HSPLandroid/text/style/ForegroundColorSpan;->writeToParcelInternal(Landroid/os/Parcel;I)V
-HSPLandroid/text/style/ImageSpan;-><init>(Landroid/graphics/drawable/Drawable;)V
-HSPLandroid/text/style/ImageSpan;-><init>(Landroid/graphics/drawable/Drawable;I)V
-HSPLandroid/text/style/ImageSpan;->getDrawable()Landroid/graphics/drawable/Drawable;
 HSPLandroid/text/style/MetricAffectingSpan;-><init>()V
 HSPLandroid/text/style/MetricAffectingSpan;->getUnderlying()Landroid/text/style/CharacterStyle;
 HSPLandroid/text/style/MetricAffectingSpan;->getUnderlying()Landroid/text/style/MetricAffectingSpan;
@@ -22934,33 +20088,18 @@
 HSPLandroid/text/style/TtsSpan;-><init>(Ljava/lang/String;Landroid/os/PersistableBundle;)V
 HSPLandroid/text/style/TypefaceSpan;-><init>(Ljava/lang/String;)V
 HSPLandroid/text/style/TypefaceSpan;-><init>(Ljava/lang/String;Landroid/graphics/Typeface;)V
-HSPLandroid/text/style/TypefaceSpan;->applyFontFamily(Landroid/graphics/Paint;Ljava/lang/String;)V
-HSPLandroid/text/style/TypefaceSpan;->updateDrawState(Landroid/text/TextPaint;)V
-HSPLandroid/text/style/TypefaceSpan;->updateMeasureState(Landroid/text/TextPaint;)V
-HSPLandroid/text/style/TypefaceSpan;->updateTypeface(Landroid/graphics/Paint;)V
 HSPLandroid/text/style/URLSpan;-><init>(Ljava/lang/String;)V
 HSPLandroid/text/style/URLSpan;->getURL()Ljava/lang/String;
 HSPLandroid/text/style/UnderlineSpan;-><init>()V
 HSPLandroid/text/style/UnderlineSpan;->getSpanTypeIdInternal()I
 HSPLandroid/text/style/UnderlineSpan;->updateDrawState(Landroid/text/TextPaint;)V
 HSPLandroid/text/style/UnderlineSpan;->writeToParcelInternal(Landroid/os/Parcel;I)V
-HSPLandroid/text/util/-$$Lambda$Linkify$7J_-cMhIF2bcttjkxA2jDFP8sKw;->apply(Ljava/lang/Object;)Ljava/lang/Object;
 HSPLandroid/text/util/Linkify$4;-><init>()V
 HSPLandroid/text/util/Linkify;->addLinks(Landroid/text/Spannable;I)Z
 HSPLandroid/text/util/Linkify;->addLinks(Landroid/text/Spannable;ILandroid/content/Context;Ljava/util/function/Function;)Z
-HSPLandroid/text/util/Linkify;->applyLink(Ljava/lang/String;IILandroid/text/Spannable;Ljava/util/function/Function;)V
 HSPLandroid/text/util/Linkify;->containsUnsupportedCharacters(Ljava/lang/String;)Z
 HSPLandroid/text/util/Linkify;->gatherLinks(Ljava/util/ArrayList;Landroid/text/Spannable;Ljava/util/regex/Pattern;[Ljava/lang/String;Landroid/text/util/Linkify$MatchFilter;Landroid/text/util/Linkify$TransformFilter;)V
-HSPLandroid/text/util/Linkify;->gatherMapLinks(Ljava/util/ArrayList;Landroid/text/Spannable;)V
-HSPLandroid/text/util/Linkify;->gatherTelLinks(Ljava/util/ArrayList;Landroid/text/Spannable;Landroid/content/Context;)V
-HSPLandroid/text/util/Linkify;->lambda$static$0(Ljava/lang/String;)Landroid/text/style/URLSpan;
-HSPLandroid/text/util/Linkify;->makeUrl(Ljava/lang/String;[Ljava/lang/String;Ljava/util/regex/Matcher;Landroid/text/util/Linkify$TransformFilter;)Ljava/lang/String;
 HSPLandroid/text/util/Linkify;->pruneOverlaps(Ljava/util/ArrayList;)V
-HSPLandroid/text/util/Rfc822Token;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/text/util/Rfc822Token;->getAddress()Ljava/lang/String;
-HSPLandroid/text/util/Rfc822Tokenizer;->crunch(Ljava/lang/StringBuilder;)V
-HSPLandroid/text/util/Rfc822Tokenizer;->tokenize(Ljava/lang/CharSequence;)[Landroid/text/util/Rfc822Token;
-HSPLandroid/text/util/Rfc822Tokenizer;->tokenize(Ljava/lang/CharSequence;Ljava/util/Collection;)V
 HSPLandroid/transition/ChangeBounds;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
 HSPLandroid/transition/ChangeBounds;->setResizeClip(Z)V
 HSPLandroid/transition/ChangeClipBounds;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
@@ -22977,7 +20116,6 @@
 HSPLandroid/transition/Fade;->getStartAlpha(Landroid/transition/TransitionValues;F)F
 HSPLandroid/transition/Fade;->onAppear(Landroid/view/ViewGroup;Landroid/view/View;Landroid/transition/TransitionValues;Landroid/transition/TransitionValues;)Landroid/animation/Animator;
 HSPLandroid/transition/Fade;->onDisappear(Landroid/view/ViewGroup;Landroid/view/View;Landroid/transition/TransitionValues;Landroid/transition/TransitionValues;)Landroid/animation/Animator;
-HSPLandroid/transition/Scene;-><init>(Landroid/view/ViewGroup;Landroid/view/View;)V
 HSPLandroid/transition/Scene;->enter()V
 HSPLandroid/transition/Scene;->getCurrentScene(Landroid/view/ViewGroup;)Landroid/transition/Scene;
 HSPLandroid/transition/Scene;->getSceneRoot()Landroid/view/ViewGroup;
@@ -23136,7 +20274,6 @@
 HSPLandroid/util/ArrayMap;->putAll(Ljava/util/Map;)V
 HSPLandroid/util/ArrayMap;->remove(Ljava/lang/Object;)Ljava/lang/Object;
 HSPLandroid/util/ArrayMap;->removeAt(I)Ljava/lang/Object;
-HSPLandroid/util/ArrayMap;->retainAll(Ljava/util/Collection;)Z
 HSPLandroid/util/ArrayMap;->setValueAt(ILjava/lang/Object;)Ljava/lang/Object;
 HSPLandroid/util/ArrayMap;->size()I
 HSPLandroid/util/ArrayMap;->toString()Ljava/lang/String;
@@ -23226,9 +20363,6 @@
 HSPLandroid/util/EventLog$Event;-><init>([B)V
 HSPLandroid/util/EventLog$Event;->decodeObject()Ljava/lang/Object;
 HSPLandroid/util/EventLog$Event;->getData()Ljava/lang/Object;
-HSPLandroid/util/EventLog$Event;->getProcessId()I
-HSPLandroid/util/EventLog$Event;->getTag()I
-HSPLandroid/util/EventLog$Event;->getThreadId()I
 HSPLandroid/util/EventLog$Event;->getTimeNanos()J
 HSPLandroid/util/EventLog$Event;->getUid()I
 HSPLandroid/util/EventLog;->getTagCode(Ljava/lang/String;)I
@@ -23244,6 +20378,7 @@
 HSPLandroid/util/FloatProperty;-><init>(Ljava/lang/String;)V
 HSPLandroid/util/FloatProperty;->set(Ljava/lang/Object;Ljava/lang/Float;)V
 HSPLandroid/util/FloatProperty;->set(Ljava/lang/Object;Ljava/lang/Object;)V
+HSPLandroid/util/IconDrawableFactory;-><init>(Landroid/content/Context;Z)V
 HSPLandroid/util/IconDrawableFactory;->newInstance(Landroid/content/Context;)Landroid/util/IconDrawableFactory;
 HSPLandroid/util/IntArray;-><init>()V
 HSPLandroid/util/IntArray;-><init>(I)V
@@ -23262,7 +20397,9 @@
 HSPLandroid/util/JsonReader;-><init>(Ljava/io/Reader;)V
 HSPLandroid/util/JsonReader;->advance()Landroid/util/JsonToken;
 HSPLandroid/util/JsonReader;->beginObject()V
+HSPLandroid/util/JsonReader;->close()V
 HSPLandroid/util/JsonReader;->decodeLiteral()Landroid/util/JsonToken;
+HSPLandroid/util/JsonReader;->endObject()V
 HSPLandroid/util/JsonReader;->expect(Landroid/util/JsonToken;)V
 HSPLandroid/util/JsonReader;->fillBuffer(I)Z
 HSPLandroid/util/JsonReader;->hasNext()Z
@@ -23276,31 +20413,7 @@
 HSPLandroid/util/JsonReader;->nextValue()Landroid/util/JsonToken;
 HSPLandroid/util/JsonReader;->objectValue()Landroid/util/JsonToken;
 HSPLandroid/util/JsonReader;->peek()Landroid/util/JsonToken;
-HSPLandroid/util/JsonReader;->peekStack()Landroid/util/JsonScope;
-HSPLandroid/util/JsonReader;->pop()Landroid/util/JsonScope;
-HSPLandroid/util/JsonReader;->push(Landroid/util/JsonScope;)V
-HSPLandroid/util/JsonReader;->readEscapeCharacter()C
 HSPLandroid/util/JsonReader;->readLiteral()Landroid/util/JsonToken;
-HSPLandroid/util/JsonReader;->replaceTop(Landroid/util/JsonScope;)V
-HSPLandroid/util/JsonReader;->skipValue()V
-HSPLandroid/util/JsonWriter;-><init>(Ljava/io/Writer;)V
-HSPLandroid/util/JsonWriter;->beforeName()V
-HSPLandroid/util/JsonWriter;->beforeValue(Z)V
-HSPLandroid/util/JsonWriter;->beginArray()Landroid/util/JsonWriter;
-HSPLandroid/util/JsonWriter;->beginObject()Landroid/util/JsonWriter;
-HSPLandroid/util/JsonWriter;->close()V
-HSPLandroid/util/JsonWriter;->close(Landroid/util/JsonScope;Landroid/util/JsonScope;Ljava/lang/String;)Landroid/util/JsonWriter;
-HSPLandroid/util/JsonWriter;->endArray()Landroid/util/JsonWriter;
-HSPLandroid/util/JsonWriter;->endObject()Landroid/util/JsonWriter;
-HSPLandroid/util/JsonWriter;->name(Ljava/lang/String;)Landroid/util/JsonWriter;
-HSPLandroid/util/JsonWriter;->newline()V
-HSPLandroid/util/JsonWriter;->open(Landroid/util/JsonScope;Ljava/lang/String;)Landroid/util/JsonWriter;
-HSPLandroid/util/JsonWriter;->peek()Landroid/util/JsonScope;
-HSPLandroid/util/JsonWriter;->replaceTop(Landroid/util/JsonScope;)V
-HSPLandroid/util/JsonWriter;->string(Ljava/lang/String;)V
-HSPLandroid/util/JsonWriter;->value(J)Landroid/util/JsonWriter;
-HSPLandroid/util/JsonWriter;->value(Ljava/lang/String;)Landroid/util/JsonWriter;
-HSPLandroid/util/JsonWriter;->value(Z)Landroid/util/JsonWriter;
 HSPLandroid/util/KeyValueListParser$IntValue;-><init>(Ljava/lang/String;I)V
 HSPLandroid/util/KeyValueListParser$IntValue;->getValue()I
 HSPLandroid/util/KeyValueListParser$IntValue;->parse(Landroid/util/KeyValueListParser;)V
@@ -23313,11 +20426,7 @@
 HSPLandroid/util/KeyValueListParser;->getLong(Ljava/lang/String;J)J
 HSPLandroid/util/KeyValueListParser;->getString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
 HSPLandroid/util/KeyValueListParser;->setString(Ljava/lang/String;)V
-HSPLandroid/util/KeyValueSettingObserver$SettingObserver;-><init>(Landroid/util/KeyValueSettingObserver;Landroid/os/Handler;)V
-HSPLandroid/util/KeyValueSettingObserver$SettingObserver;-><init>(Landroid/util/KeyValueSettingObserver;Landroid/os/Handler;Landroid/util/KeyValueSettingObserver$1;)V
-HSPLandroid/util/KeyValueSettingObserver;-><init>(Landroid/os/Handler;Landroid/content/ContentResolver;Landroid/net/Uri;)V
 HSPLandroid/util/KeyValueSettingObserver;->setParserValue()V
-HSPLandroid/util/KeyValueSettingObserver;->start()V
 HSPLandroid/util/LauncherIcons;-><init>(Landroid/content/Context;)V
 HSPLandroid/util/LauncherIcons;->getBadgedDrawable(Landroid/graphics/drawable/Drawable;II)Landroid/graphics/drawable/Drawable;
 HSPLandroid/util/LocalLog;-><init>(I)V
@@ -23343,7 +20452,6 @@
 HSPLandroid/util/Log;->v(Ljava/lang/String;Ljava/lang/String;)I
 HSPLandroid/util/Log;->w(Ljava/lang/String;Ljava/lang/String;)I
 HSPLandroid/util/Log;->w(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I
-HSPLandroid/util/Log;->w(Ljava/lang/String;Ljava/lang/Throwable;)I
 HSPLandroid/util/Log;->wtf(ILjava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;ZZ)I
 HSPLandroid/util/Log;->wtf(Ljava/lang/String;Ljava/lang/String;)I
 HSPLandroid/util/Log;->wtf(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I
@@ -23445,7 +20553,6 @@
 HSPLandroid/util/MapCollections;->getEntrySet()Ljava/util/Set;
 HSPLandroid/util/MapCollections;->getKeySet()Ljava/util/Set;
 HSPLandroid/util/MapCollections;->getValues()Ljava/util/Collection;
-HSPLandroid/util/MapCollections;->retainAllHelper(Ljava/util/Map;Ljava/util/Collection;)Z
 HSPLandroid/util/MapCollections;->toArrayHelper(I)[Ljava/lang/Object;
 HSPLandroid/util/MapCollections;->toArrayHelper([Ljava/lang/Object;I)[Ljava/lang/Object;
 HSPLandroid/util/MathUtils;->addOrThrow(II)I
@@ -23472,11 +20579,9 @@
 HSPLandroid/util/MemoryIntArray;-><init>(I)V
 HSPLandroid/util/MemoryIntArray;-><init>(Landroid/os/Parcel;)V
 HSPLandroid/util/MemoryIntArray;-><init>(Landroid/os/Parcel;Landroid/util/MemoryIntArray$1;)V
-HSPLandroid/util/MemoryIntArray;->close()V
 HSPLandroid/util/MemoryIntArray;->enforceNotClosed()V
 HSPLandroid/util/MemoryIntArray;->enforceValidIndex(I)V
 HSPLandroid/util/MemoryIntArray;->enforceWritable()V
-HSPLandroid/util/MemoryIntArray;->finalize()V
 HSPLandroid/util/MemoryIntArray;->get(I)I
 HSPLandroid/util/MemoryIntArray;->isClosed()Z
 HSPLandroid/util/MemoryIntArray;->isWritable()Z
@@ -23514,8 +20619,8 @@
 HPLandroid/util/NtpTrustedTime$TimeResult;->currentTimeMillis()J
 HPLandroid/util/NtpTrustedTime$TimeResult;->getAgeMillis()J
 PLandroid/util/NtpTrustedTime$TimeResult;->getCertaintyMillis()J
-PLandroid/util/NtpTrustedTime$TimeResult;->getElapsedRealtimeMillis()J
-PLandroid/util/NtpTrustedTime$TimeResult;->getTimeMillis()J
+HPLandroid/util/NtpTrustedTime$TimeResult;->getElapsedRealtimeMillis()J
+HPLandroid/util/NtpTrustedTime$TimeResult;->getTimeMillis()J
 HSPLandroid/util/NtpTrustedTime;-><init>(Landroid/content/Context;)V
 PLandroid/util/NtpTrustedTime;->access$000(Landroid/util/NtpTrustedTime;)Landroid/content/Context;
 PLandroid/util/NtpTrustedTime;->forceRefresh()Z
@@ -23593,7 +20698,6 @@
 HSPLandroid/util/Singleton;-><init>()V
 HSPLandroid/util/Singleton;->get()Ljava/lang/Object;
 HSPLandroid/util/Size;-><init>(II)V
-HSPLandroid/util/Size;->equals(Ljava/lang/Object;)Z
 HSPLandroid/util/Size;->getHeight()I
 HSPLandroid/util/Size;->getWidth()I
 HSPLandroid/util/Size;->hashCode()I
@@ -23714,11 +20818,6 @@
 HPLandroid/util/TimedRemoteCaller;->getResultTimed(I)Ljava/lang/Object;
 HPLandroid/util/TimedRemoteCaller;->onBeforeRemoteCall()I
 HPLandroid/util/TimedRemoteCaller;->onRemoteMethodResult(Ljava/lang/Object;I)V
-HSPLandroid/util/TimingLogger;-><init>(Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/util/TimingLogger;->addSplit(Ljava/lang/String;)V
-HSPLandroid/util/TimingLogger;->dumpToLog()V
-HSPLandroid/util/TimingLogger;->reset()V
-HSPLandroid/util/TimingLogger;->reset(Ljava/lang/String;Ljava/lang/String;)V
 HSPLandroid/util/TimingsTraceLog;-><init>(Ljava/lang/String;J)V
 HSPLandroid/util/TimingsTraceLog;-><init>(Ljava/lang/String;JI)V
 HSPLandroid/util/TimingsTraceLog;->assertSameThread()V
@@ -23744,7 +20843,6 @@
 HSPLandroid/util/Xml;->newSerializer()Lorg/xmlpull/v1/XmlSerializer;
 HSPLandroid/util/apk/ApkSignatureSchemeV2Verifier$VerifiedSigner;-><init>([[Ljava/security/cert/X509Certificate;[B)V
 HSPLandroid/util/apk/ApkSignatureSchemeV2Verifier;->findSignature(Ljava/io/RandomAccessFile;)Landroid/util/apk/SignatureInfo;
-HSPLandroid/util/apk/ApkSignatureSchemeV2Verifier;->isSupportedSignatureAlgorithm(I)Z
 HSPLandroid/util/apk/ApkSignatureSchemeV2Verifier;->unsafeGetCertsWithoutVerification(Ljava/lang/String;)[[Ljava/security/cert/X509Certificate;
 HSPLandroid/util/apk/ApkSignatureSchemeV2Verifier;->verify(Ljava/io/RandomAccessFile;Landroid/util/apk/SignatureInfo;Z)Landroid/util/apk/ApkSignatureSchemeV2Verifier$VerifiedSigner;
 HSPLandroid/util/apk/ApkSignatureSchemeV2Verifier;->verify(Ljava/io/RandomAccessFile;Z)Landroid/util/apk/ApkSignatureSchemeV2Verifier$VerifiedSigner;
@@ -23754,7 +20852,6 @@
 HSPLandroid/util/apk/ApkSignatureSchemeV2Verifier;->verifySigner(Ljava/nio/ByteBuffer;Ljava/util/Map;Ljava/security/cert/CertificateFactory;)[Ljava/security/cert/X509Certificate;
 HSPLandroid/util/apk/ApkSignatureSchemeV3Verifier$VerifiedSigner;-><init>([Ljava/security/cert/X509Certificate;Landroid/util/apk/ApkSignatureSchemeV3Verifier$VerifiedProofOfRotation;)V
 HSPLandroid/util/apk/ApkSignatureSchemeV3Verifier;->findSignature(Ljava/io/RandomAccessFile;)Landroid/util/apk/SignatureInfo;
-HSPLandroid/util/apk/ApkSignatureSchemeV3Verifier;->isSupportedSignatureAlgorithm(I)Z
 HSPLandroid/util/apk/ApkSignatureSchemeV3Verifier;->unsafeGetCertsWithoutVerification(Ljava/lang/String;)Landroid/util/apk/ApkSignatureSchemeV3Verifier$VerifiedSigner;
 HSPLandroid/util/apk/ApkSignatureSchemeV3Verifier;->verify(Ljava/io/RandomAccessFile;Landroid/util/apk/SignatureInfo;Z)Landroid/util/apk/ApkSignatureSchemeV3Verifier$VerifiedSigner;
 HSPLandroid/util/apk/ApkSignatureSchemeV3Verifier;->verify(Ljava/io/RandomAccessFile;Z)Landroid/util/apk/ApkSignatureSchemeV3Verifier$VerifiedSigner;
@@ -23764,6 +20861,7 @@
 HSPLandroid/util/apk/ApkSignatureSchemeV3Verifier;->verifySigner(Ljava/nio/ByteBuffer;Ljava/util/Map;Ljava/security/cert/CertificateFactory;)Landroid/util/apk/ApkSignatureSchemeV3Verifier$VerifiedSigner;
 HSPLandroid/util/apk/ApkSignatureVerifier;->closeQuietly(Landroid/util/jar/StrictJarFile;)V
 HSPLandroid/util/apk/ApkSignatureVerifier;->convertToSignatures([[Ljava/security/cert/Certificate;)[Landroid/content/pm/Signature;
+HSPLandroid/util/apk/ApkSignatureVerifier;->getMinimumSignatureSchemeVersionForTargetSdk(I)I
 HSPLandroid/util/apk/ApkSignatureVerifier;->loadCertificates(Landroid/util/jar/StrictJarFile;Ljava/util/zip/ZipEntry;)[[Ljava/security/cert/Certificate;
 HSPLandroid/util/apk/ApkSignatureVerifier;->readFullyIgnoringContents(Ljava/io/InputStream;)V
 HSPLandroid/util/apk/ApkSignatureVerifier;->unsafeGetCertsWithoutVerification(Ljava/lang/String;I)Landroid/content/pm/PackageParser$SigningDetails;
@@ -23974,17 +21072,31 @@
 HSPLandroid/view/-$$Lambda$FocusFinder$FocusSorter$h0f2ZYL6peSaaEeCCkAoYs_YZvU;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
 HSPLandroid/view/-$$Lambda$FocusFinder$FocusSorter$kW7K1t9q7Y62V38r-7g6xRzqqq8;-><init>(Landroid/view/FocusFinder$FocusSorter;)V
 HSPLandroid/view/-$$Lambda$FocusFinder$FocusSorter$kW7K1t9q7Y62V38r-7g6xRzqqq8;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
+HSPLandroid/view/-$$Lambda$InsetsAnimationThreadControlRunner$uH4_lrsZqDlpBAfYA-toGwSbZOM;-><init>(Landroid/view/InsetsAnimationThreadControlRunner;Landroid/view/WindowInsetsAnimationControlListener;I)V
+HSPLandroid/view/-$$Lambda$InsetsAnimationThreadControlRunner$uH4_lrsZqDlpBAfYA-toGwSbZOM;->run()V
+HSPLandroid/view/-$$Lambda$InsetsController$1n9XL98Th3ubITpOqj0dyKdV0bw;-><init>(Landroid/view/SurfaceControl;)V
+HSPLandroid/view/-$$Lambda$InsetsController$1n9XL98Th3ubITpOqj0dyKdV0bw;->onFrameDraw(J)V
 HSPLandroid/view/-$$Lambda$InsetsController$6uoSHBPvxV1C0JOZKhH1AyuNXmo;-><init>(Landroid/view/InsetsController;)V
 HSPLandroid/view/-$$Lambda$InsetsController$Cj7UJrCkdHvJAZ_cYKrXuTMsjz8;->evaluate(FLjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
 HSPLandroid/view/-$$Lambda$InsetsController$HI9QZ2HvGm6iykc-WONz2KPG61Q;-><init>(Landroid/view/InsetsController;)V
+HSPLandroid/view/-$$Lambda$InsetsController$InternalAnimationControlListener$SInf91MjJKDQFXwrp7C-HBi0xaQ;-><init>(Landroid/view/InsetsController$InternalAnimationControlListener;Landroid/view/animation/Interpolator;Landroid/view/WindowInsetsAnimationController;Landroid/graphics/Insets;Landroid/graphics/Insets;Landroid/view/animation/Interpolator;)V
+HSPLandroid/view/-$$Lambda$InsetsController$InternalAnimationControlListener$SInf91MjJKDQFXwrp7C-HBi0xaQ;->onAnimationUpdate(Landroid/animation/ValueAnimator;)V
+HSPLandroid/view/-$$Lambda$InsetsController$InternalAnimationControlListener$hxk87AxkClLRhRgGak0NUvJOACM;-><clinit>()V
+HSPLandroid/view/-$$Lambda$InsetsController$InternalAnimationControlListener$hxk87AxkClLRhRgGak0NUvJOACM;-><init>()V
+HSPLandroid/view/-$$Lambda$InsetsController$InternalAnimationControlListener$hxk87AxkClLRhRgGak0NUvJOACM;->getInterpolation(F)F
 HSPLandroid/view/-$$Lambda$InsetsController$RZT3QkL9zMFTeHtZbfcaHIzvlsc;-><clinit>()V
 HSPLandroid/view/-$$Lambda$InsetsController$RZT3QkL9zMFTeHtZbfcaHIzvlsc;-><init>()V
 HSPLandroid/view/-$$Lambda$InsetsController$RZT3QkL9zMFTeHtZbfcaHIzvlsc;->apply(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
 HSPLandroid/view/-$$Lambda$InsetsController$zpmOxHfTFV_3me2u3C8YaXSUauQ;-><init>(Landroid/view/InsetsController;)V
 HSPLandroid/view/-$$Lambda$InsetsController$zpmOxHfTFV_3me2u3C8YaXSUauQ;->run()V
+HSPLandroid/view/-$$Lambda$OPw84JVgjgVWRUjBDztTKZ7zDyc;-><init>(Landroid/view/InsetsController;)V
+HSPLandroid/view/-$$Lambda$OPw84JVgjgVWRUjBDztTKZ7zDyc;->accept(Ljava/lang/Object;)V
 HSPLandroid/view/-$$Lambda$PYGleuqIeCxjTD1pJqqx1opFv1g;-><init>(Landroid/view/SurfaceView;)V
 HSPLandroid/view/-$$Lambda$PYGleuqIeCxjTD1pJqqx1opFv1g;->onScrollChanged()V
 HSPLandroid/view/-$$Lambda$QI1s392qW8l6mC24bcy9050SkuY;-><init>(Landroid/view/View;)V
+HSPLandroid/view/-$$Lambda$Rl1VZmNJ0VZDLK0BAbaVGis0rrA;-><clinit>()V
+HSPLandroid/view/-$$Lambda$Rl1VZmNJ0VZDLK0BAbaVGis0rrA;-><init>()V
+HSPLandroid/view/-$$Lambda$Rl1VZmNJ0VZDLK0BAbaVGis0rrA;->accept(Ljava/lang/Object;)V
 HSPLandroid/view/-$$Lambda$SurfaceView$SyyzxOgxKwZMRgiiTGcRYbOU5JY;-><init>(Landroid/view/SurfaceView;)V
 HSPLandroid/view/-$$Lambda$SurfaceView$SyyzxOgxKwZMRgiiTGcRYbOU5JY;->run()V
 HSPLandroid/view/-$$Lambda$SurfaceView$TWz4D2u33ZlAmRtgKzbqqDue3iM;-><init>(Landroid/view/SurfaceView;)V
@@ -24016,6 +21128,10 @@
 HSPLandroid/view/-$$Lambda$WlJa6OPA72p3gYtA3nVKC7Z1tGY;->run()V
 HSPLandroid/view/-$$Lambda$Y3lG3v_J32-xL0IjMGgNorZjESw;->get()Ljava/lang/Object;
 HSPLandroid/view/-$$Lambda$cZhmLzK8aetUdx4VlP9w5jR7En0;->apply(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroid/view/-$$Lambda$kl-1KEyg7FwPQcg9XfREJM1iCiM;-><init>(Landroid/view/InsetsAnimationControlImpl;)V
+HSPLandroid/view/-$$Lambda$kl-1KEyg7FwPQcg9XfREJM1iCiM;->run()V
+HSPLandroid/view/-$$Lambda$yePAgdxpSSjmKnpPAp6YHM4lpEQ;-><init>(Landroid/view/InsetsAnimationControlCallbacks;)V
+HSPLandroid/view/-$$Lambda$yePAgdxpSSjmKnpPAp6YHM4lpEQ;->accept(Ljava/lang/Object;)V
 HSPLandroid/view/AbsSavedState$2;->createFromParcel(Landroid/os/Parcel;Ljava/lang/ClassLoader;)Landroid/view/AbsSavedState;
 HSPLandroid/view/AbsSavedState$2;->createFromParcel(Landroid/os/Parcel;Ljava/lang/ClassLoader;)Ljava/lang/Object;
 HSPLandroid/view/AbsSavedState;-><init>(Landroid/os/Parcel;Ljava/lang/ClassLoader;)V
@@ -24024,8 +21140,6 @@
 HSPLandroid/view/AbsSavedState;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/view/ActionMode$Callback2;-><init>()V
 HSPLandroid/view/ActionMode;-><init>()V
-HSPLandroid/view/ActionMode;->getType()I
-HSPLandroid/view/ActionMode;->setType(I)V
 HSPLandroid/view/BatchedInputEventReceiver$BatchedInputRunnable;-><init>(Landroid/view/BatchedInputEventReceiver;)V
 HSPLandroid/view/BatchedInputEventReceiver$BatchedInputRunnable;-><init>(Landroid/view/BatchedInputEventReceiver;Landroid/view/BatchedInputEventReceiver$1;)V
 HSPLandroid/view/BatchedInputEventReceiver$BatchedInputRunnable;->run()V
@@ -24137,7 +21251,6 @@
 HSPLandroid/view/Display;->getPresentationDeadlineNanos()J
 HSPLandroid/view/Display;->getRealMetrics(Landroid/util/DisplayMetrics;)V
 HSPLandroid/view/Display;->getRealSize(Landroid/graphics/Point;)V
-HSPLandroid/view/Display;->getRectSize(Landroid/graphics/Rect;)V
 HSPLandroid/view/Display;->getRefreshRate()F
 HSPLandroid/view/Display;->getRotation()I
 HSPLandroid/view/Display;->getSize(Landroid/graphics/Point;)V
@@ -24197,8 +21310,6 @@
 HSPLandroid/view/DisplayCutout$ParcelableWrapper;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/view/DisplayCutout;-><init>(Landroid/graphics/Rect;Landroid/graphics/Insets;[Landroid/graphics/Rect;Z)V
 HSPLandroid/view/DisplayCutout;-><init>(Landroid/graphics/Rect;Landroid/graphics/Insets;[Landroid/graphics/Rect;ZLandroid/view/DisplayCutout$1;)V
-HSPLandroid/view/DisplayCutout;-><init>(Landroid/graphics/Rect;[Landroid/graphics/Rect;Z)V
-HSPLandroid/view/DisplayCutout;-><init>(Landroid/graphics/Rect;[Landroid/graphics/Rect;ZLandroid/view/DisplayCutout$1;)V
 HSPLandroid/view/DisplayCutout;->dumpDebug(Landroid/util/proto/ProtoOutputStream;J)V
 HSPLandroid/view/DisplayCutout;->equals(Ljava/lang/Object;)Z
 HSPLandroid/view/DisplayCutout;->fromResourcesRectApproximation(Landroid/content/res/Resources;II)Landroid/view/DisplayCutout;
@@ -24209,12 +21320,15 @@
 HSPLandroid/view/DisplayCutout;->getSafeInsetRight()I
 HSPLandroid/view/DisplayCutout;->getSafeInsetTop()I
 HSPLandroid/view/DisplayCutout;->getSafeInsets()Landroid/graphics/Rect;
+HSPLandroid/view/DisplayCutout;->inset(IIII)Landroid/view/DisplayCutout;
 HSPLandroid/view/DisplayCutout;->isEmpty()Z
 HSPLandroid/view/DisplayCutout;->loadWaterfallInset(Landroid/content/res/Resources;)Landroid/graphics/Insets;
 HSPLandroid/view/DisplayCutout;->pathAndDisplayCutoutFromSpec(Ljava/lang/String;IIFLandroid/graphics/Insets;)Landroid/util/Pair;
 HSPLandroid/view/DisplayEventReceiver;-><init>(Landroid/os/Looper;II)V
 HSPLandroid/view/DisplayEventReceiver;->dispatchConfigChanged(JJI)V
 HSPLandroid/view/DisplayEventReceiver;->dispatchVsync(JJI)V
+HSPLandroid/view/DisplayEventReceiver;->dispose(Z)V
+HSPLandroid/view/DisplayEventReceiver;->finalize()V
 HSPLandroid/view/DisplayEventReceiver;->scheduleVsync()V
 HSPLandroid/view/DisplayInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/view/DisplayInfo;
 HSPLandroid/view/DisplayInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
@@ -24263,18 +21377,10 @@
 HSPLandroid/view/FocusFinder;->getWeightedDistanceFor(JJ)J
 HSPLandroid/view/FocusFinder;->isBetterCandidate(ILandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;)Z
 HSPLandroid/view/FocusFinder;->isCandidate(Landroid/graphics/Rect;Landroid/graphics/Rect;I)Z
-HSPLandroid/view/FocusFinder;->isToDirectionOf(ILandroid/graphics/Rect;Landroid/graphics/Rect;)Z
 HSPLandroid/view/FocusFinder;->majorAxisDistance(ILandroid/graphics/Rect;Landroid/graphics/Rect;)I
 HSPLandroid/view/FocusFinder;->majorAxisDistanceRaw(ILandroid/graphics/Rect;Landroid/graphics/Rect;)I
-HSPLandroid/view/FocusFinder;->majorAxisDistanceToFarEdge(ILandroid/graphics/Rect;Landroid/graphics/Rect;)I
-HSPLandroid/view/FocusFinder;->majorAxisDistanceToFarEdgeRaw(ILandroid/graphics/Rect;Landroid/graphics/Rect;)I
 HSPLandroid/view/FocusFinder;->minorAxisDistance(ILandroid/graphics/Rect;Landroid/graphics/Rect;)I
 HSPLandroid/view/FocusFinder;->sort([Landroid/view/View;IILandroid/view/ViewGroup;Z)V
-HSPLandroid/view/FrameMetrics;-><init>()V
-HSPLandroid/view/FrameMetrics;->getMetric(I)J
-HSPLandroid/view/FrameMetricsObserver;-><init>(Landroid/view/Window;Landroid/os/Handler;Landroid/view/Window$OnFrameMetricsAvailableListener;)V
-HSPLandroid/view/FrameMetricsObserver;->getRendererObserver()Landroid/graphics/HardwareRendererObserver;
-HSPLandroid/view/FrameMetricsObserver;->onFrameMetricsAvailable(I)V
 HSPLandroid/view/GestureDetector$GestureHandler;-><init>(Landroid/view/GestureDetector;)V
 HSPLandroid/view/GestureDetector$GestureHandler;-><init>(Landroid/view/GestureDetector;Landroid/os/Handler;)V
 HSPLandroid/view/GestureDetector$GestureHandler;->handleMessage(Landroid/os/Message;)V
@@ -24314,7 +21420,6 @@
 HSPLandroid/view/GestureExclusionTracker;->computeChangedRects()Ljava/util/List;
 HSPLandroid/view/GestureExclusionTracker;->updateRectsForView(Landroid/view/View;)V
 HSPLandroid/view/Gravity;->apply(IIILandroid/graphics/Rect;IILandroid/graphics/Rect;)V
-HSPLandroid/view/Gravity;->apply(IIILandroid/graphics/Rect;Landroid/graphics/Rect;)V
 HSPLandroid/view/Gravity;->apply(IIILandroid/graphics/Rect;Landroid/graphics/Rect;I)V
 HSPLandroid/view/Gravity;->applyDisplay(ILandroid/graphics/Rect;Landroid/graphics/Rect;)V
 HSPLandroid/view/Gravity;->getAbsoluteGravity(II)I
@@ -24343,13 +21448,6 @@
 HSPLandroid/view/IDisplayWindowRotationController$Stub;-><init>()V
 HSPLandroid/view/IDisplayWindowRotationController$Stub;->asBinder()Landroid/os/IBinder;
 HSPLandroid/view/IDisplayWindowRotationController$Stub;->asInterface(Landroid/os/IBinder;)Landroid/view/IDisplayWindowRotationController;
-HSPLandroid/view/IDockedStackListener$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/view/IDockedStackListener$Stub$Proxy;->asBinder()Landroid/os/IBinder;
-HSPLandroid/view/IDockedStackListener$Stub$Proxy;->onAdjustedForImeChanged(ZJ)V
-HSPLandroid/view/IDockedStackListener$Stub$Proxy;->onDividerVisibilityChanged(Z)V
-HSPLandroid/view/IDockedStackListener$Stub$Proxy;->onDockedStackExistsChanged(Z)V
-HSPLandroid/view/IDockedStackListener$Stub$Proxy;->onDockedStackMinimizedChanged(ZJZ)V
-HSPLandroid/view/IDockedStackListener$Stub;->asInterface(Landroid/os/IBinder;)Landroid/view/IDockedStackListener;
 HSPLandroid/view/IGraphicsStats$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HSPLandroid/view/IGraphicsStats$Stub$Proxy;->requestBufferForProcess(Ljava/lang/String;Landroid/view/IGraphicsStatsCallback;)Landroid/os/ParcelFileDescriptor;
 HSPLandroid/view/IGraphicsStats$Stub;-><init>()V
@@ -24357,6 +21455,7 @@
 HSPLandroid/view/IGraphicsStats$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/view/IGraphicsStatsCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HSPLandroid/view/IGraphicsStatsCallback$Stub$Proxy;->asBinder()Landroid/os/IBinder;
+PLandroid/view/IGraphicsStatsCallback$Stub$Proxy;->onRotateGraphicsStatsBuffer()V
 HSPLandroid/view/IGraphicsStatsCallback$Stub;->asBinder()Landroid/os/IBinder;
 HSPLandroid/view/IGraphicsStatsCallback$Stub;->asInterface(Landroid/os/IBinder;)Landroid/view/IGraphicsStatsCallback;
 HSPLandroid/view/IGraphicsStatsCallback$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
@@ -24368,18 +21467,14 @@
 PLandroid/view/IInputMonitorHost$Stub;->asBinder()Landroid/os/IBinder;
 HSPLandroid/view/IInputMonitorHost$Stub;->asInterface(Landroid/os/IBinder;)Landroid/view/IInputMonitorHost;
 HPLandroid/view/IInputMonitorHost$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLandroid/view/IPinnedStackController$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HSPLandroid/view/IPinnedStackController$Stub;-><init>()V
 HSPLandroid/view/IPinnedStackController$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/view/IPinnedStackController$Stub;->asInterface(Landroid/os/IBinder;)Landroid/view/IPinnedStackController;
 HSPLandroid/view/IPinnedStackListener$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HSPLandroid/view/IPinnedStackListener$Stub$Proxy;->asBinder()Landroid/os/IBinder;
 HSPLandroid/view/IPinnedStackListener$Stub$Proxy;->onActionsChanged(Landroid/content/pm/ParceledListSlice;)V
 HSPLandroid/view/IPinnedStackListener$Stub$Proxy;->onDisplayInfoChanged(Landroid/view/DisplayInfo;)V
 HSPLandroid/view/IPinnedStackListener$Stub$Proxy;->onImeVisibilityChanged(ZI)V
 HSPLandroid/view/IPinnedStackListener$Stub$Proxy;->onListenerRegistered(Landroid/view/IPinnedStackController;)V
-HSPLandroid/view/IPinnedStackListener$Stub$Proxy;->onMinimizedStateChanged(Z)V
-HSPLandroid/view/IPinnedStackListener$Stub$Proxy;->onMovementBoundsChanged(Landroid/graphics/Rect;ZZ)V
 HPLandroid/view/IPinnedStackListener$Stub$Proxy;->onResetReentryBounds(Landroid/content/ComponentName;)V
 HSPLandroid/view/IPinnedStackListener$Stub;-><init>()V
 HSPLandroid/view/IPinnedStackListener$Stub;->asBinder()Landroid/os/IBinder;
@@ -24416,7 +21511,6 @@
 HSPLandroid/view/IWindow$Stub$Proxy;->asBinder()Landroid/os/IBinder;
 HPLandroid/view/IWindow$Stub$Proxy;->closeSystemDialogs(Ljava/lang/String;)V
 HSPLandroid/view/IWindow$Stub$Proxy;->dispatchAppVisibility(Z)V
-HSPLandroid/view/IWindow$Stub$Proxy;->dispatchWallpaperOffsets(FFFFZ)V
 HPLandroid/view/IWindow$Stub$Proxy;->dispatchWindowShown()V
 HPLandroid/view/IWindow$Stub$Proxy;->insetsChanged(Landroid/view/InsetsState;)V
 HPLandroid/view/IWindow$Stub$Proxy;->resized(Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;ZLandroid/util/MergedConfiguration;Landroid/graphics/Rect;ZZILandroid/view/DisplayCutout$ParcelableWrapper;)V
@@ -24436,10 +21530,10 @@
 HSPLandroid/view/IWindowManager$Stub$Proxy;->createInputConsumer(Landroid/os/IBinder;Ljava/lang/String;ILandroid/view/InputChannel;)V
 HSPLandroid/view/IWindowManager$Stub$Proxy;->destroyInputConsumer(Ljava/lang/String;I)Z
 HSPLandroid/view/IWindowManager$Stub$Proxy;->getCurrentAnimatorScale()F
-HSPLandroid/view/IWindowManager$Stub$Proxy;->getDockedStackSide()I
 HSPLandroid/view/IWindowManager$Stub$Proxy;->getInitialDisplaySize(ILandroid/graphics/Point;)V
 HSPLandroid/view/IWindowManager$Stub$Proxy;->getStableInsets(ILandroid/graphics/Rect;)V
 HSPLandroid/view/IWindowManager$Stub$Proxy;->getWindowInsets(Landroid/view/WindowManager$LayoutParams;ILandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/view/DisplayCutout$ParcelableWrapper;)V
+HSPLandroid/view/IWindowManager$Stub$Proxy;->getWindowInsets(Landroid/view/WindowManager$LayoutParams;ILandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/view/DisplayCutout$ParcelableWrapper;Landroid/view/InsetsState;)Z
 HSPLandroid/view/IWindowManager$Stub$Proxy;->hasNavigationBar(I)Z
 HSPLandroid/view/IWindowManager$Stub$Proxy;->isKeyguardLocked()Z
 HSPLandroid/view/IWindowManager$Stub$Proxy;->isKeyguardSecure(I)Z
@@ -24467,13 +21561,11 @@
 HSPLandroid/view/IWindowSession$Stub$Proxy;->performHapticFeedback(IZ)Z
 HSPLandroid/view/IWindowSession$Stub$Proxy;->pokeDrawLock(Landroid/os/IBinder;)V
 HSPLandroid/view/IWindowSession$Stub$Proxy;->relayout(Landroid/view/IWindow;ILandroid/view/WindowManager$LayoutParams;IIIIJLandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/view/DisplayCutout$ParcelableWrapper;Landroid/util/MergedConfiguration;Landroid/view/SurfaceControl;Landroid/view/InsetsState;)I
-HSPLandroid/view/IWindowSession$Stub$Proxy;->relayout(Landroid/view/IWindow;ILandroid/view/WindowManager$LayoutParams;IIIIJLandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/view/DisplayCutout$ParcelableWrapper;Landroid/util/MergedConfiguration;Landroid/view/SurfaceControl;Landroid/view/InsetsState;Landroid/graphics/Point;)I
 HSPLandroid/view/IWindowSession$Stub$Proxy;->relayout(Landroid/view/IWindow;ILandroid/view/WindowManager$LayoutParams;IIIIJLandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/view/DisplayCutout$ParcelableWrapper;Landroid/util/MergedConfiguration;Landroid/view/SurfaceControl;Landroid/view/InsetsState;Landroid/graphics/Point;Landroid/view/SurfaceControl;)I
 HSPLandroid/view/IWindowSession$Stub$Proxy;->remove(Landroid/view/IWindow;)V
 HSPLandroid/view/IWindowSession$Stub$Proxy;->reportSystemGestureExclusionChanged(Landroid/view/IWindow;Ljava/util/List;)V
 HSPLandroid/view/IWindowSession$Stub$Proxy;->setInsets(Landroid/view/IWindow;ILandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Region;)V
 HSPLandroid/view/IWindowSession$Stub$Proxy;->setTransparentRegion(Landroid/view/IWindow;Landroid/graphics/Region;)V
-HSPLandroid/view/IWindowSession$Stub$Proxy;->updatePointerIcon(Landroid/view/IWindow;)V
 HSPLandroid/view/IWindowSession$Stub$Proxy;->wallpaperOffsetsComplete(Landroid/os/IBinder;)V
 HSPLandroid/view/IWindowSession$Stub;-><init>()V
 HSPLandroid/view/IWindowSession$Stub;->asBinder()Landroid/os/IBinder;
@@ -24503,18 +21595,20 @@
 HSPLandroid/view/ImeFocusController;->updateImeFocusable(Landroid/view/WindowManager$LayoutParams;Z)Z
 HSPLandroid/view/ImeInsetsSourceConsumer;-><init>(Landroid/view/InsetsState;Ljava/util/function/Supplier;Landroid/view/InsetsController;)V
 HSPLandroid/view/ImeInsetsSourceConsumer;->getImm()Landroid/view/inputmethod/InputMethodManager;
+HSPLandroid/view/ImeInsetsSourceConsumer;->hide(ZI)V
 HSPLandroid/view/ImeInsetsSourceConsumer;->isDummyOrEmptyEditor(Landroid/view/inputmethod/EditorInfo;)Z
 HSPLandroid/view/ImeInsetsSourceConsumer;->onServedEditorChanged(Landroid/view/inputmethod/EditorInfo;)V
 HSPLandroid/view/ImeInsetsSourceConsumer;->onWindowFocusGained()V
 HSPLandroid/view/ImeInsetsSourceConsumer;->onWindowFocusLost()V
+HSPLandroid/view/ImeInsetsSourceConsumer;->requestShow(Z)I
 HSPLandroid/view/ImeInsetsSourceConsumer;->setControl(Landroid/view/InsetsSourceControl;[I[I)V
+HSPLandroid/view/ImeInsetsSourceConsumer;->show(Z)V
 HSPLandroid/view/InputApplicationHandle;-><init>(Landroid/os/IBinder;)V
 HPLandroid/view/InputApplicationHandle;->finalize()V
 HSPLandroid/view/InputChannel$1;->createFromParcel(Landroid/os/Parcel;)Landroid/view/InputChannel;
 HSPLandroid/view/InputChannel$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/view/InputChannel;-><init>()V
 HSPLandroid/view/InputChannel;->dispose()V
-HPLandroid/view/InputChannel;->dup()Landroid/view/InputChannel;
 HSPLandroid/view/InputChannel;->finalize()V
 HSPLandroid/view/InputChannel;->getToken()Landroid/os/IBinder;
 HSPLandroid/view/InputChannel;->openInputChannelPair(Ljava/lang/String;)[Landroid/view/InputChannel;
@@ -24532,8 +21626,6 @@
 HSPLandroid/view/InputDevice$MotionRange;->access$600(Landroid/view/InputDevice$MotionRange;)F
 HSPLandroid/view/InputDevice$MotionRange;->access$700(Landroid/view/InputDevice$MotionRange;)F
 HSPLandroid/view/InputDevice$MotionRange;->access$800(Landroid/view/InputDevice$MotionRange;)F
-HSPLandroid/view/InputDevice$MotionRange;->getAxis()I
-HSPLandroid/view/InputDevice$MotionRange;->getSource()I
 HSPLandroid/view/InputDevice;-><init>(IIILjava/lang/String;IILjava/lang/String;ZIILandroid/view/KeyCharacterMap;ZZZ)V
 HSPLandroid/view/InputDevice;-><init>(Landroid/os/Parcel;)V
 HSPLandroid/view/InputDevice;-><init>(Landroid/os/Parcel;Landroid/view/InputDevice$1;)V
@@ -24544,9 +21636,7 @@
 HSPLandroid/view/InputDevice;->getId()I
 HSPLandroid/view/InputDevice;->getKeyCharacterMap()Landroid/view/KeyCharacterMap;
 HSPLandroid/view/InputDevice;->getKeyboardType()I
-HSPLandroid/view/InputDevice;->getMotionRanges()Ljava/util/List;
 HSPLandroid/view/InputDevice;->getSources()I
-HSPLandroid/view/InputDevice;->hasKeys([I)[Z
 HSPLandroid/view/InputDevice;->isExternal()Z
 HSPLandroid/view/InputDevice;->isFullKeyboard()Z
 HSPLandroid/view/InputDevice;->isVirtual()Z
@@ -24590,12 +21680,17 @@
 HSPLandroid/view/InputWindowHandle;-><init>(Landroid/view/InputApplicationHandle;I)V
 HPLandroid/view/InputWindowHandle;->finalize()V
 PLandroid/view/InputWindowHandle;->setTouchableRegionCrop(Landroid/view/SurfaceControl;)V
+HSPLandroid/view/InsetsAnimationControlImpl;-><init>(Landroid/util/SparseArray;Landroid/graphics/Rect;Landroid/view/InsetsState;Landroid/view/WindowInsetsAnimationControlListener;ILandroid/view/InsetsAnimationControlCallbacks;JLandroid/view/animation/Interpolator;I)V
+HSPLandroid/view/InsetsAnimationControlImpl;-><init>(Landroid/util/SparseArray;Landroid/graphics/Rect;Landroid/view/InsetsState;Landroid/view/WindowInsetsAnimationControlListener;ILandroid/view/InsetsAnimationControlCallbacks;JLandroid/view/animation/Interpolator;ZI)V
+HSPLandroid/view/InsetsAnimationControlImpl;-><init>(Landroid/util/SparseArray;Landroid/graphics/Rect;Landroid/view/InsetsState;Landroid/view/WindowInsetsAnimationControlListener;ILandroid/view/InsetsAnimationControlCallbacks;JLandroid/view/animation/Interpolator;ZII)V
 HSPLandroid/view/InsetsAnimationControlImpl;->addTranslationToMatrix(IILandroid/graphics/Matrix;Landroid/graphics/Rect;)V
 HSPLandroid/view/InsetsAnimationControlImpl;->applyChangeInsets(Landroid/view/InsetsState;)Z
 HSPLandroid/view/InsetsAnimationControlImpl;->buildTypeSourcesMap(Landroid/util/SparseIntArray;Landroid/util/SparseSetArray;Landroid/util/SparseArray;)V
 HSPLandroid/view/InsetsAnimationControlImpl;->calculateInsets(Landroid/view/InsetsState;Landroid/graphics/Rect;Landroid/util/SparseArray;ZLandroid/util/SparseIntArray;)Landroid/graphics/Insets;
+HSPLandroid/view/InsetsAnimationControlImpl;->cancel()V
 HSPLandroid/view/InsetsAnimationControlImpl;->finish(Z)V
 HSPLandroid/view/InsetsAnimationControlImpl;->getAnimation()Landroid/view/WindowInsetsAnimation;
+HSPLandroid/view/InsetsAnimationControlImpl;->getAnimationType()I
 HSPLandroid/view/InsetsAnimationControlImpl;->getCurrentAlpha()F
 HSPLandroid/view/InsetsAnimationControlImpl;->getHiddenStateInsets()Landroid/graphics/Insets;
 HSPLandroid/view/InsetsAnimationControlImpl;->getInsetsFromState(Landroid/view/InsetsState;Landroid/graphics/Rect;Landroid/util/SparseIntArray;)Landroid/graphics/Insets;
@@ -24603,37 +21698,79 @@
 HSPLandroid/view/InsetsAnimationControlImpl;->getShownStateInsets()Landroid/graphics/Insets;
 HSPLandroid/view/InsetsAnimationControlImpl;->getTypes()I
 HSPLandroid/view/InsetsAnimationControlImpl;->isCancelled()Z
+HSPLandroid/view/InsetsAnimationControlImpl;->releaseLeashes()V
 HSPLandroid/view/InsetsAnimationControlImpl;->sanitize(F)F
 HSPLandroid/view/InsetsAnimationControlImpl;->sanitize(Landroid/graphics/Insets;)Landroid/graphics/Insets;
 HSPLandroid/view/InsetsAnimationControlImpl;->setInsetsAndAlpha(Landroid/graphics/Insets;FF)V
 HSPLandroid/view/InsetsAnimationControlImpl;->updateLeashesForSide(IIIILjava/util/ArrayList;Landroid/view/InsetsState;Ljava/lang/Float;)V
+HSPLandroid/view/InsetsAnimationControlRunner;->controlsInternalType(I)Z
+HSPLandroid/view/InsetsAnimationThread;-><init>()V
+HSPLandroid/view/InsetsAnimationThread;->ensureThreadLocked()V
+HSPLandroid/view/InsetsAnimationThread;->getHandler()Landroid/os/Handler;
+HSPLandroid/view/InsetsAnimationThread;->release()V
+HSPLandroid/view/InsetsAnimationThreadControlRunner$1;-><init>(Landroid/view/InsetsAnimationThreadControlRunner;)V
+HSPLandroid/view/InsetsAnimationThreadControlRunner$1;->applySurfaceParams([Landroid/view/SyncRtSurfaceTransactionApplier$SurfaceParams;)V
+HSPLandroid/view/InsetsAnimationThreadControlRunner$1;->releaseSurfaceControlFromRt(Landroid/view/SurfaceControl;)V
+HSPLandroid/view/InsetsAnimationThreadControlRunner$1;->scheduleApplyChangeInsets()V
+HSPLandroid/view/InsetsAnimationThreadControlRunner$1;->startAnimation(Landroid/view/InsetsAnimationControlImpl;Landroid/view/WindowInsetsAnimationControlListener;ILandroid/view/WindowInsetsAnimation;Landroid/view/WindowInsetsAnimation$Bounds;)V
+HSPLandroid/view/InsetsAnimationThreadControlRunner;-><init>(Landroid/util/SparseArray;Landroid/graphics/Rect;Landroid/view/InsetsState;Landroid/view/WindowInsetsAnimationControlListener;ILandroid/view/InsetsAnimationControlCallbacks;JLandroid/view/animation/Interpolator;ILandroid/os/Handler;)V
+HSPLandroid/view/InsetsAnimationThreadControlRunner;->access$000(Landroid/view/InsetsAnimationThreadControlRunner;)Landroid/view/InsetsState;
+HSPLandroid/view/InsetsAnimationThreadControlRunner;->access$100(Landroid/view/InsetsAnimationThreadControlRunner;)Landroid/view/InsetsAnimationControlImpl;
+HSPLandroid/view/InsetsAnimationThreadControlRunner;->cancel()V
+HSPLandroid/view/InsetsAnimationThreadControlRunner;->copyControls(Landroid/util/SparseArray;)Landroid/util/SparseArray;
+HSPLandroid/view/InsetsAnimationThreadControlRunner;->getTypes()I
+HSPLandroid/view/InsetsAnimationThreadControlRunner;->lambda$new$0$InsetsAnimationThreadControlRunner(Landroid/view/WindowInsetsAnimationControlListener;I)V
 HSPLandroid/view/InsetsController$1;-><init>(Landroid/view/InsetsController;Landroid/view/InsetsAnimationControlImpl;Landroid/view/WindowInsetsAnimation;Landroid/view/WindowInsetsAnimation$Bounds;Landroid/view/WindowInsetsAnimationControlListener;I)V
 HSPLandroid/view/InsetsController$1;->onPreDraw()Z
 HSPLandroid/view/InsetsController$InsetsProperty;-><init>()V
 HSPLandroid/view/InsetsController$InsetsProperty;->set(Landroid/view/WindowInsetsAnimationController;Landroid/graphics/Insets;)V
 HSPLandroid/view/InsetsController$InsetsProperty;->set(Ljava/lang/Object;Ljava/lang/Object;)V
 HSPLandroid/view/InsetsController$InternalAnimationControlListener$1;-><init>(Landroid/view/InsetsController$InternalAnimationControlListener;)V
+HSPLandroid/view/InsetsController$InternalAnimationControlListener$1;->initialValue()Landroid/animation/AnimationHandler;
+HSPLandroid/view/InsetsController$InternalAnimationControlListener$1;->initialValue()Ljava/lang/Object;
 HSPLandroid/view/InsetsController$InternalAnimationControlListener$1;->onAnimationEnd(Landroid/animation/Animator;)V
+HSPLandroid/view/InsetsController$InternalAnimationControlListener$2;-><init>(Landroid/view/InsetsController$InternalAnimationControlListener;)V
+HSPLandroid/view/InsetsController$InternalAnimationControlListener$2;->onAnimationEnd(Landroid/animation/Animator;)V
 HSPLandroid/view/InsetsController$InternalAnimationControlListener;-><init>(Z)V
+HSPLandroid/view/InsetsController$InternalAnimationControlListener;-><init>(ZZI)V
+HSPLandroid/view/InsetsController$InternalAnimationControlListener;->calculateDurationMs()J
+HSPLandroid/view/InsetsController$InternalAnimationControlListener;->getAlphaInterpolator()Landroid/view/animation/Interpolator;
 HSPLandroid/view/InsetsController$InternalAnimationControlListener;->getDurationMs()J
+HSPLandroid/view/InsetsController$InternalAnimationControlListener;->getInterpolator()Landroid/view/animation/Interpolator;
 HSPLandroid/view/InsetsController$InternalAnimationControlListener;->getRawFraction()F
+HSPLandroid/view/InsetsController$InternalAnimationControlListener;->lambda$getAlphaInterpolator$3(F)F
+HSPLandroid/view/InsetsController$InternalAnimationControlListener;->lambda$onReady$0$InsetsController$InternalAnimationControlListener(Landroid/view/animation/Interpolator;Landroid/view/WindowInsetsAnimationController;Landroid/graphics/Insets;Landroid/graphics/Insets;Landroid/view/animation/Interpolator;Landroid/animation/ValueAnimator;)V
 HSPLandroid/view/InsetsController$InternalAnimationControlListener;->onAnimationFinish()V
+HSPLandroid/view/InsetsController$InternalAnimationControlListener;->onCancelled()V
+HSPLandroid/view/InsetsController$InternalAnimationControlListener;->onCancelled(Landroid/view/WindowInsetsAnimationController;)V
+HSPLandroid/view/InsetsController$InternalAnimationControlListener;->onFinished(Landroid/view/WindowInsetsAnimationController;)V
 HSPLandroid/view/InsetsController$InternalAnimationControlListener;->onReady(Landroid/view/WindowInsetsAnimationController;I)V
 HSPLandroid/view/InsetsController$RunningAnimation;-><init>(Landroid/view/InsetsAnimationControlImpl;I)V
+HSPLandroid/view/InsetsController$RunningAnimation;-><init>(Landroid/view/InsetsAnimationControlRunner;I)V
 HSPLandroid/view/InsetsController;-><init>(Landroid/view/ViewRootImpl;)V
 HSPLandroid/view/InsetsController;-><init>(Landroid/view/ViewRootImpl;Ljava/util/function/BiFunction;Landroid/os/Handler;)V
 HSPLandroid/view/InsetsController;->abortPendingImeControlRequest()V
 HSPLandroid/view/InsetsController;->access$000()Landroid/animation/TypeEvaluator;
 HSPLandroid/view/InsetsController;->access$100(Landroid/view/InsetsController;)Landroid/view/ViewRootImpl;
+HSPLandroid/view/InsetsController;->access$200(Landroid/view/InsetsController;)Ljava/util/ArrayList;
+HSPLandroid/view/InsetsController;->access$300()Landroid/animation/TypeEvaluator;
+HSPLandroid/view/InsetsController;->access$302(Landroid/view/InsetsController;Z)Z
 HSPLandroid/view/InsetsController;->applyAnimation(IZZ)V
 HSPLandroid/view/InsetsController;->applyLocalVisibilityOverride()V
 HSPLandroid/view/InsetsController;->applySurfaceParams([Landroid/view/SyncRtSurfaceTransactionApplier$SurfaceParams;)V
+HSPLandroid/view/InsetsController;->calculateControllableTypes()I
+HSPLandroid/view/InsetsController;->calculateInsets(ZZLandroid/view/DisplayCutout;II)Landroid/view/WindowInsets;
 HSPLandroid/view/InsetsController;->calculateInsets(ZZLandroid/view/DisplayCutout;Landroid/graphics/Rect;Landroid/graphics/Rect;I)Landroid/view/WindowInsets;
 HSPLandroid/view/InsetsController;->calculateInsets(ZZLandroid/view/DisplayCutout;Landroid/graphics/Rect;Landroid/graphics/Rect;II)Landroid/view/WindowInsets;
+HSPLandroid/view/InsetsController;->calculateVisibleInsets(I)Landroid/graphics/Rect;
 HSPLandroid/view/InsetsController;->calculateVisibleInsets(Landroid/graphics/Rect;I)Landroid/graphics/Rect;
 HSPLandroid/view/InsetsController;->cancelAnimation(Landroid/view/InsetsAnimationControlImpl;Z)V
+HSPLandroid/view/InsetsController;->cancelAnimation(Landroid/view/InsetsAnimationControlRunner;Z)V
 HSPLandroid/view/InsetsController;->cancelExistingControllers(I)V
+HSPLandroid/view/InsetsController;->captionInsetsUnchanged()Z
+HSPLandroid/view/InsetsController;->checkDisplayFramesForControlling()Z
 HSPLandroid/view/InsetsController;->collectSourceControls(ZLandroid/util/ArraySet;Landroid/util/SparseArray;I)Landroid/util/Pair;
+HSPLandroid/view/InsetsController;->controlAnimationUnchecked(ILandroid/os/CancellationSignal;Landroid/view/WindowInsetsAnimationControlListener;Landroid/graphics/Rect;ZJLandroid/view/animation/Interpolator;IIZ)V
 HSPLandroid/view/InsetsController;->controlAnimationUnchecked(ILandroid/view/WindowInsetsAnimationControlListener;Landroid/graphics/Rect;ZJLandroid/view/animation/Interpolator;ZII)Landroid/os/CancellationSignal;
 HSPLandroid/view/InsetsController;->dispatchAnimationEnd(Landroid/view/WindowInsetsAnimation;)V
 HSPLandroid/view/InsetsController;->getAnimationType(I)I
@@ -24641,9 +21778,14 @@
 HSPLandroid/view/InsetsController;->getSourceConsumer(I)Landroid/view/InsetsSourceConsumer;
 HSPLandroid/view/InsetsController;->getState()Landroid/view/InsetsState;
 HSPLandroid/view/InsetsController;->getViewRoot()Landroid/view/ViewRootImpl;
+HSPLandroid/view/InsetsController;->hide(I)V
 HSPLandroid/view/InsetsController;->hide(IZ)V
+HSPLandroid/view/InsetsController;->hideDirectly(IZI)V
+HSPLandroid/view/InsetsController;->invokeControllableInsetsChangedListeners()I
+HSPLandroid/view/InsetsController;->isRequestedVisible(I)Z
 HSPLandroid/view/InsetsController;->lambda$new$1(Landroid/view/InsetsController;Ljava/lang/Integer;)Landroid/view/InsetsSourceConsumer;
 HSPLandroid/view/InsetsController;->lambda$new$2$InsetsController()V
+HSPLandroid/view/InsetsController;->lambda$releaseSurfaceControlFromRt$4(Landroid/view/SurfaceControl;J)V
 HSPLandroid/view/InsetsController;->lambda$static$0(FLandroid/graphics/Insets;Landroid/graphics/Insets;)Landroid/graphics/Insets;
 HSPLandroid/view/InsetsController;->notifyControlRevoked(Landroid/view/InsetsSourceConsumer;)V
 HSPLandroid/view/InsetsController;->notifyFinished(Landroid/view/InsetsAnimationControlImpl;Z)V
@@ -24653,9 +21795,12 @@
 HSPLandroid/view/InsetsController;->onStateChanged(Landroid/view/InsetsState;)Z
 HSPLandroid/view/InsetsController;->onWindowFocusGained()V
 HSPLandroid/view/InsetsController;->onWindowFocusLost()V
+HSPLandroid/view/InsetsController;->releaseSurfaceControlFromRt(Landroid/view/SurfaceControl;)V
 HSPLandroid/view/InsetsController;->scheduleApplyChangeInsets()V
 HSPLandroid/view/InsetsController;->sendStateToWindowManager()V
+HSPLandroid/view/InsetsController;->show(I)V
 HSPLandroid/view/InsetsController;->show(IZ)V
+HSPLandroid/view/InsetsController;->showDirectly(I)V
 HSPLandroid/view/InsetsController;->startAnimation(Landroid/view/InsetsAnimationControlImpl;Landroid/view/WindowInsetsAnimationControlListener;ILandroid/view/WindowInsetsAnimation;Landroid/view/WindowInsetsAnimation$Bounds;I)V
 HSPLandroid/view/InsetsController;->updateCompatSysUiVisibility(IZZ)V
 HSPLandroid/view/InsetsFlags;-><init>()V
@@ -24672,11 +21817,12 @@
 HSPLandroid/view/InsetsSource;->calculateVisibleInsets(Landroid/graphics/Rect;)Landroid/graphics/Insets;
 HSPLandroid/view/InsetsSource;->equals(Ljava/lang/Object;)Z
 HSPLandroid/view/InsetsSource;->getFrame()Landroid/graphics/Rect;
+HSPLandroid/view/InsetsSource;->getIntersection(Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;)Z
 HSPLandroid/view/InsetsSource;->getType()I
 HSPLandroid/view/InsetsSource;->isVisible()Z
 HSPLandroid/view/InsetsSource;->setFrame(Landroid/graphics/Rect;)V
 HSPLandroid/view/InsetsSource;->setVisible(Z)V
-HPLandroid/view/InsetsSource;->setVisibleFrame(Landroid/graphics/Rect;)V
+HSPLandroid/view/InsetsSource;->setVisibleFrame(Landroid/graphics/Rect;)V
 HSPLandroid/view/InsetsSource;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/view/InsetsSourceConsumer;-><init>(ILandroid/view/InsetsState;Ljava/util/function/Supplier;Landroid/view/InsetsController;)V
 HSPLandroid/view/InsetsSourceConsumer;->applyHiddenToControl()V
@@ -24684,34 +21830,47 @@
 HSPLandroid/view/InsetsSourceConsumer;->getControl()Landroid/view/InsetsSourceControl;
 HSPLandroid/view/InsetsSourceConsumer;->getType()I
 HSPLandroid/view/InsetsSourceConsumer;->hide()V
+HSPLandroid/view/InsetsSourceConsumer;->hide(ZI)V
 HSPLandroid/view/InsetsSourceConsumer;->isRequestedVisible()Z
+HSPLandroid/view/InsetsSourceConsumer;->notifyHidden()V
 HSPLandroid/view/InsetsSourceConsumer;->onWindowFocusGained()V
 HSPLandroid/view/InsetsSourceConsumer;->onWindowFocusLost()V
+HSPLandroid/view/InsetsSourceConsumer;->requestShow(Z)I
 HSPLandroid/view/InsetsSourceConsumer;->setControl(Landroid/view/InsetsSourceControl;[I[I)V
 HSPLandroid/view/InsetsSourceConsumer;->setRequestedVisible(Z)V
+HSPLandroid/view/InsetsSourceConsumer;->show(Z)V
 HSPLandroid/view/InsetsSourceControl$1;->createFromParcel(Landroid/os/Parcel;)Landroid/view/InsetsSourceControl;
 HSPLandroid/view/InsetsSourceControl$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/view/InsetsSourceControl$1;->newArray(I)[Landroid/view/InsetsSourceControl;
 HSPLandroid/view/InsetsSourceControl$1;->newArray(I)[Ljava/lang/Object;
 HSPLandroid/view/InsetsSourceControl;-><init>(ILandroid/view/SurfaceControl;Landroid/graphics/Point;)V
 HSPLandroid/view/InsetsSourceControl;-><init>(Landroid/os/Parcel;)V
+HSPLandroid/view/InsetsSourceControl;-><init>(Landroid/view/InsetsSourceControl;)V
 HSPLandroid/view/InsetsSourceControl;->getLeash()Landroid/view/SurfaceControl;
 HSPLandroid/view/InsetsSourceControl;->getSurfacePosition()Landroid/graphics/Point;
 HSPLandroid/view/InsetsSourceControl;->getType()I
+HSPLandroid/view/InsetsSourceControl;->release(Landroid/view/InsetsController;)V
+HSPLandroid/view/InsetsSourceControl;->release(Ljava/util/function/Consumer;)V
 HSPLandroid/view/InsetsState$1;->createFromParcel(Landroid/os/Parcel;)Landroid/view/InsetsState;
 HSPLandroid/view/InsetsState$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/view/InsetsState;-><init>()V
 HSPLandroid/view/InsetsState;-><init>(Landroid/os/Parcel;)V
 HSPLandroid/view/InsetsState;-><init>(Landroid/view/InsetsState;Z)V
+HSPLandroid/view/InsetsState;->addSource(Landroid/view/InsetsSource;)V
+HSPLandroid/view/InsetsState;->calculateInsets(Landroid/graphics/Rect;Landroid/view/InsetsState;ZZLandroid/view/DisplayCutout;IILandroid/util/SparseIntArray;)Landroid/view/WindowInsets;
+HSPLandroid/view/InsetsState;->calculateInsets(Landroid/graphics/Rect;Landroid/view/InsetsState;ZZLandroid/view/DisplayCutout;Landroid/graphics/Rect;Landroid/graphics/Rect;IILandroid/util/SparseIntArray;)Landroid/view/WindowInsets;
 HSPLandroid/view/InsetsState;->calculateInsets(Landroid/graphics/Rect;ZZLandroid/view/DisplayCutout;Landroid/graphics/Rect;Landroid/graphics/Rect;IILandroid/util/SparseIntArray;)Landroid/view/WindowInsets;
 HSPLandroid/view/InsetsState;->calculateInsets(Landroid/graphics/Rect;ZZLandroid/view/DisplayCutout;Landroid/graphics/Rect;Landroid/graphics/Rect;ILandroid/util/SparseIntArray;)Landroid/view/WindowInsets;
+HSPLandroid/view/InsetsState;->calculateVisibleInsets(Landroid/graphics/Rect;I)Landroid/graphics/Rect;
 HSPLandroid/view/InsetsState;->calculateVisibleInsets(Landroid/graphics/Rect;Landroid/graphics/Rect;I)Landroid/graphics/Rect;
 HSPLandroid/view/InsetsState;->containsType([II)Z
 HSPLandroid/view/InsetsState;->equals(Ljava/lang/Object;)Z
+HSPLandroid/view/InsetsState;->equals(Ljava/lang/Object;Z)Z
 HSPLandroid/view/InsetsState;->getDefaultVisibility(I)Z
 HSPLandroid/view/InsetsState;->getDisplayFrame()Landroid/graphics/Rect;
 HSPLandroid/view/InsetsState;->getInsetSide(Landroid/graphics/Insets;)I
 HSPLandroid/view/InsetsState;->getSource(I)Landroid/view/InsetsSource;
+HSPLandroid/view/InsetsState;->peekSource(I)Landroid/view/InsetsSource;
 HSPLandroid/view/InsetsState;->processSource(Landroid/view/InsetsSource;Landroid/graphics/Rect;Z[Landroid/graphics/Insets;Landroid/util/SparseIntArray;[Z)V
 HSPLandroid/view/InsetsState;->processSourceAsPublicType(Landroid/view/InsetsSource;[Landroid/graphics/Insets;Landroid/util/SparseIntArray;[ZLandroid/graphics/Insets;I)V
 HSPLandroid/view/InsetsState;->readFromParcel(Landroid/os/Parcel;)V
@@ -24741,7 +21900,6 @@
 HSPLandroid/view/KeyEvent$DispatcherState;->reset(Ljava/lang/Object;)V
 HSPLandroid/view/KeyEvent$DispatcherState;->startTracking(Landroid/view/KeyEvent;Ljava/lang/Object;)V
 HSPLandroid/view/KeyEvent;-><init>()V
-HSPLandroid/view/KeyEvent;-><init>(JJIIIIIII)V
 HPLandroid/view/KeyEvent;-><init>(JJIIIIIIII)V
 HSPLandroid/view/KeyEvent;-><init>(Landroid/os/Parcel;)V
 HSPLandroid/view/KeyEvent;->access$076(Landroid/view/KeyEvent;I)I
@@ -24753,6 +21911,7 @@
 HSPLandroid/view/KeyEvent;->getEventTime()J
 HSPLandroid/view/KeyEvent;->getEventTimeNano()J
 HSPLandroid/view/KeyEvent;->getFlags()I
+HSPLandroid/view/KeyEvent;->getId()I
 HSPLandroid/view/KeyEvent;->getKeyCharacterMap()Landroid/view/KeyCharacterMap;
 HSPLandroid/view/KeyEvent;->getKeyCode()I
 HSPLandroid/view/KeyEvent;->getMetaState()I
@@ -24766,7 +21925,6 @@
 HSPLandroid/view/KeyEvent;->isCanceled()Z
 HSPLandroid/view/KeyEvent;->isConfirmKey(I)Z
 HSPLandroid/view/KeyEvent;->isCtrlPressed()Z
-HSPLandroid/view/KeyEvent;->isGamepadButton(I)Z
 HSPLandroid/view/KeyEvent;->isLongPress()Z
 HPLandroid/view/KeyEvent;->isMetaPressed()Z
 HSPLandroid/view/KeyEvent;->isModifierKey(I)Z
@@ -24777,7 +21935,7 @@
 HSPLandroid/view/KeyEvent;->metaStateToString(I)Ljava/lang/String;
 HSPLandroid/view/KeyEvent;->normalizeMetaState(I)I
 HSPLandroid/view/KeyEvent;->obtain()Landroid/view/KeyEvent;
-HSPLandroid/view/KeyEvent;->obtain(JJIIIIIIIIILjava/lang/String;)Landroid/view/KeyEvent;
+HSPLandroid/view/KeyEvent;->obtain(IJJIIIIIIIII[BLjava/lang/String;)Landroid/view/KeyEvent;
 HSPLandroid/view/KeyEvent;->obtain(JJIIIIIIIII[BLjava/lang/String;)Landroid/view/KeyEvent;
 HSPLandroid/view/KeyEvent;->recycle()V
 HSPLandroid/view/KeyEvent;->recycleIfNeededAfterDispatch()V
@@ -24797,7 +21955,6 @@
 HSPLandroid/view/LayoutInflater;->from(Landroid/content/Context;)Landroid/view/LayoutInflater;
 HSPLandroid/view/LayoutInflater;->getContext()Landroid/content/Context;
 HSPLandroid/view/LayoutInflater;->getFactory()Landroid/view/LayoutInflater$Factory;
-HSPLandroid/view/LayoutInflater;->getFactory2()Landroid/view/LayoutInflater$Factory2;
 HSPLandroid/view/LayoutInflater;->inflate(ILandroid/view/ViewGroup;)Landroid/view/View;
 HSPLandroid/view/LayoutInflater;->inflate(ILandroid/view/ViewGroup;Z)Landroid/view/View;
 HSPLandroid/view/LayoutInflater;->inflate(Lorg/xmlpull/v1/XmlPullParser;Landroid/view/ViewGroup;Z)Landroid/view/View;
@@ -24858,18 +22015,14 @@
 HSPLandroid/view/MotionEvent;->getHistorySize()I
 HSPLandroid/view/MotionEvent;->getId()I
 HSPLandroid/view/MotionEvent;->getMetaState()I
-HSPLandroid/view/MotionEvent;->getOrientation()F
 HSPLandroid/view/MotionEvent;->getPointerCount()I
 HSPLandroid/view/MotionEvent;->getPointerId(I)I
 HSPLandroid/view/MotionEvent;->getPointerIdBits()I
 HSPLandroid/view/MotionEvent;->getPointerProperties(ILandroid/view/MotionEvent$PointerProperties;)V
-HSPLandroid/view/MotionEvent;->getPressure(I)F
 HSPLandroid/view/MotionEvent;->getRawX()F
 HSPLandroid/view/MotionEvent;->getRawY()F
 HSPLandroid/view/MotionEvent;->getSource()I
 HSPLandroid/view/MotionEvent;->getToolType(I)I
-HSPLandroid/view/MotionEvent;->getTouchMajor()F
-HSPLandroid/view/MotionEvent;->getTouchMinor()F
 HSPLandroid/view/MotionEvent;->getX()F
 HSPLandroid/view/MotionEvent;->getX(I)F
 HSPLandroid/view/MotionEvent;->getXPrecision()F
@@ -24902,13 +22055,15 @@
 HSPLandroid/view/NotificationHeaderView$HeaderTouchListener;->addWidthRect()V
 HSPLandroid/view/NotificationHeaderView$HeaderTouchListener;->bindTouchRects()V
 HSPLandroid/view/NotificationHeaderView$HeaderTouchListener;->getRectAroundView(Landroid/view/View;)Landroid/graphics/Rect;
+HSPLandroid/view/NotificationHeaderView$HeaderTouchListener;->isInside(FF)Z
 HSPLandroid/view/NotificationHeaderView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
 HSPLandroid/view/NotificationHeaderView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V
 HSPLandroid/view/NotificationHeaderView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V
 HSPLandroid/view/NotificationHeaderView;->access$100(Landroid/view/NotificationHeaderView;)Lcom/android/internal/widget/CachingIconView;
-HSPLandroid/view/NotificationHeaderView;->access$200(Landroid/view/NotificationHeaderView;)Landroid/widget/ImageView;
 HSPLandroid/view/NotificationHeaderView;->access$300(Landroid/view/NotificationHeaderView;)Landroid/view/View;
 HSPLandroid/view/NotificationHeaderView;->access$400(Landroid/view/NotificationHeaderView;)Landroid/view/View;
+HSPLandroid/view/NotificationHeaderView;->access$500(Landroid/view/NotificationHeaderView;)Z
+HSPLandroid/view/NotificationHeaderView;->access$600(Landroid/view/NotificationHeaderView;)Z
 HSPLandroid/view/NotificationHeaderView;->drawableStateChanged()V
 HSPLandroid/view/NotificationHeaderView;->generateLayoutParams(Landroid/util/AttributeSet;)Landroid/view/ViewGroup$LayoutParams;
 HSPLandroid/view/NotificationHeaderView;->getFirstChildNotGone()Landroid/view/View;
@@ -24926,7 +22081,6 @@
 HSPLandroid/view/NotificationHeaderView;->setHeaderBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V
 HSPLandroid/view/NotificationHeaderView;->setOnClickListener(Landroid/view/View$OnClickListener;)V
 HSPLandroid/view/NotificationHeaderView;->setOriginalIconColor(I)V
-HSPLandroid/view/NotificationHeaderView;->setOriginalNotificationColor(I)V
 HSPLandroid/view/NotificationHeaderView;->setRecentlyAudiblyAlerted(Z)V
 HSPLandroid/view/NotificationHeaderView;->setShowExpandButtonAtEnd(Z)V
 HSPLandroid/view/NotificationHeaderView;->showAppOpsIcons(Landroid/util/ArraySet;)V
@@ -24942,6 +22096,12 @@
 HSPLandroid/view/OrientationEventListener;->access$102(Landroid/view/OrientationEventListener;I)I
 HSPLandroid/view/OrientationEventListener;->disable()V
 HSPLandroid/view/OrientationEventListener;->enable()V
+HSPLandroid/view/PendingInsetsController;-><init>()V
+HSPLandroid/view/PendingInsetsController;->detach()V
+HSPLandroid/view/PendingInsetsController;->getState()Landroid/view/InsetsState;
+HSPLandroid/view/PendingInsetsController;->isRequestedVisible(I)Z
+HSPLandroid/view/PendingInsetsController;->replayAndAttach(Landroid/view/InsetsController;)V
+HSPLandroid/view/PendingInsetsController;->setCaptionInsetsHeight(I)V
 HSPLandroid/view/PixelCopy$1;-><init>(Landroid/view/PixelCopy$OnPixelCopyFinishedListener;I)V
 HSPLandroid/view/PixelCopy$1;->run()V
 HSPLandroid/view/PixelCopy;->request(Landroid/view/Surface;Landroid/graphics/Rect;Landroid/graphics/Bitmap;Landroid/view/PixelCopy$OnPixelCopyFinishedListener;Landroid/os/Handler;)V
@@ -24978,18 +22138,14 @@
 HPLandroid/view/RemoteAnimationDefinition;->hasTransition(ILandroid/util/ArraySet;)Z
 HPLandroid/view/RemoteAnimationDefinition;->linkToDeath(Landroid/os/IBinder$DeathRecipient;)V
 PLandroid/view/RemoteAnimationDefinition;->setCallingPidUid(II)V
-HSPLandroid/view/RemoteAnimationTarget$1;-><init>()V
 HSPLandroid/view/RemoteAnimationTarget$1;->createFromParcel(Landroid/os/Parcel;)Landroid/view/RemoteAnimationTarget;
 HSPLandroid/view/RemoteAnimationTarget$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/view/RemoteAnimationTarget$1;->newArray(I)[Landroid/view/RemoteAnimationTarget;
 HSPLandroid/view/RemoteAnimationTarget$1;->newArray(I)[Ljava/lang/Object;
 HSPLandroid/view/RemoteAnimationTarget;-><clinit>()V
-HPLandroid/view/RemoteAnimationTarget;-><init>(IILandroid/view/SurfaceControl;ZLandroid/graphics/Rect;Landroid/graphics/Rect;ILandroid/graphics/Point;Landroid/graphics/Rect;Landroid/app/WindowConfiguration;ZLandroid/view/SurfaceControl;Landroid/graphics/Rect;)V
 HSPLandroid/view/RemoteAnimationTarget;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/view/RenderNodeAnimator$DelayedAnimationHelper;->addDelayedAnimation(Landroid/view/RenderNodeAnimator;)V
-HSPLandroid/view/RenderNodeAnimator$DelayedAnimationHelper;->run()V
+HPLandroid/view/RemoteAnimationTarget;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/view/RenderNodeAnimator;-><init>(IF)V
-HSPLandroid/view/RenderNodeAnimator;-><init>(IIFF)V
 HSPLandroid/view/RenderNodeAnimator;-><init>(Landroid/graphics/CanvasProperty;F)V
 HSPLandroid/view/RenderNodeAnimator;-><init>(Landroid/graphics/CanvasProperty;IF)V
 HSPLandroid/view/RenderNodeAnimator;->applyInterpolator()V
@@ -25006,7 +22162,6 @@
 HSPLandroid/view/RenderNodeAnimator;->notifyStartListeners()V
 HSPLandroid/view/RenderNodeAnimator;->onFinished()V
 HSPLandroid/view/RenderNodeAnimator;->releaseNativePtr()V
-HSPLandroid/view/RenderNodeAnimator;->setDuration(J)Landroid/animation/Animator;
 HSPLandroid/view/RenderNodeAnimator;->setDuration(J)Landroid/view/RenderNodeAnimator;
 HSPLandroid/view/RenderNodeAnimator;->setInterpolator(Landroid/animation/TimeInterpolator;)V
 HSPLandroid/view/RenderNodeAnimator;->setStartDelay(J)V
@@ -25022,7 +22177,7 @@
 HSPLandroid/view/ScaleGestureDetector;-><init>(Landroid/content/Context;Landroid/view/ScaleGestureDetector$OnScaleGestureListener;)V
 HSPLandroid/view/ScaleGestureDetector;-><init>(Landroid/content/Context;Landroid/view/ScaleGestureDetector$OnScaleGestureListener;Landroid/os/Handler;)V
 HSPLandroid/view/ScaleGestureDetector;->getCurrentSpan()F
-HPLandroid/view/ScaleGestureDetector;->getCurrentSpanX()F
+HSPLandroid/view/ScaleGestureDetector;->getCurrentSpanX()F
 HSPLandroid/view/ScaleGestureDetector;->getFocusX()F
 HSPLandroid/view/ScaleGestureDetector;->getFocusY()F
 HSPLandroid/view/ScaleGestureDetector;->inAnchoredScaleMode()Z
@@ -25051,6 +22206,7 @@
 HSPLandroid/view/Surface;->rotationToString(I)Ljava/lang/String;
 HSPLandroid/view/Surface;->setNativeObjectLocked(J)V
 HSPLandroid/view/Surface;->toString()Ljava/lang/String;
+HSPLandroid/view/Surface;->transferFrom(Landroid/view/Surface;)V
 HSPLandroid/view/Surface;->unlockCanvasAndPost(Landroid/graphics/Canvas;)V
 HSPLandroid/view/Surface;->unlockSwCanvasAndPost(Landroid/graphics/Canvas;)V
 HSPLandroid/view/Surface;->writeToParcel(Landroid/os/Parcel;I)V
@@ -25073,6 +22229,7 @@
 HSPLandroid/view/SurfaceControl$Builder;->setParent(Landroid/view/SurfaceControl;)Landroid/view/SurfaceControl$Builder;
 HSPLandroid/view/SurfaceControl$Builder;->unsetBufferSize()V
 HSPLandroid/view/SurfaceControl$DesiredDisplayConfigSpecs;-><init>(IFF)V
+HSPLandroid/view/SurfaceControl$DisplayConfig;-><init>()V
 HSPLandroid/view/SurfaceControl$ScreenshotGraphicBuffer;-><init>(Landroid/graphics/GraphicBuffer;Landroid/graphics/ColorSpace;Z)V
 HSPLandroid/view/SurfaceControl$ScreenshotGraphicBuffer;->createFromNative(IIIIJIZ)Landroid/view/SurfaceControl$ScreenshotGraphicBuffer;
 HSPLandroid/view/SurfaceControl$ScreenshotGraphicBuffer;->getColorSpace()Landroid/graphics/ColorSpace;
@@ -25086,6 +22243,7 @@
 HSPLandroid/view/SurfaceControl$Transaction;->apply(Z)V
 HSPLandroid/view/SurfaceControl$Transaction;->applyResizedSurfaces()V
 HSPLandroid/view/SurfaceControl$Transaction;->checkPreconditions(Landroid/view/SurfaceControl;)V
+HSPLandroid/view/SurfaceControl$Transaction;->close()V
 HSPLandroid/view/SurfaceControl$Transaction;->deferTransactionUntil(Landroid/view/SurfaceControl;Landroid/view/SurfaceControl;J)Landroid/view/SurfaceControl$Transaction;
 HSPLandroid/view/SurfaceControl$Transaction;->deferTransactionUntilSurface(Landroid/view/SurfaceControl;Landroid/view/Surface;J)Landroid/view/SurfaceControl$Transaction;
 HSPLandroid/view/SurfaceControl$Transaction;->detachChildren(Landroid/view/SurfaceControl;)Landroid/view/SurfaceControl$Transaction;
@@ -25097,6 +22255,7 @@
 HSPLandroid/view/SurfaceControl$Transaction;->setAlpha(Landroid/view/SurfaceControl;F)Landroid/view/SurfaceControl$Transaction;
 HPLandroid/view/SurfaceControl$Transaction;->setAnimationTransaction()Landroid/view/SurfaceControl$Transaction;
 HSPLandroid/view/SurfaceControl$Transaction;->setBufferSize(Landroid/view/SurfaceControl;II)Landroid/view/SurfaceControl$Transaction;
+HSPLandroid/view/SurfaceControl$Transaction;->setColor(Landroid/view/SurfaceControl;[F)Landroid/view/SurfaceControl$Transaction;
 HSPLandroid/view/SurfaceControl$Transaction;->setColorSpaceAgnostic(Landroid/view/SurfaceControl;Z)Landroid/view/SurfaceControl$Transaction;
 HSPLandroid/view/SurfaceControl$Transaction;->setCornerRadius(Landroid/view/SurfaceControl;F)Landroid/view/SurfaceControl$Transaction;
 HSPLandroid/view/SurfaceControl$Transaction;->setDisplayLayerStack(Landroid/os/IBinder;I)Landroid/view/SurfaceControl$Transaction;
@@ -25134,18 +22293,18 @@
 HSPLandroid/view/SurfaceControl;->access$2400(JJF)V
 HSPLandroid/view/SurfaceControl;->access$2600(JJI)V
 HSPLandroid/view/SurfaceControl;->access$2700(JJJJ)V
-HSPLandroid/view/SurfaceControl;->access$2800(JJJJ)V
 HSPLandroid/view/SurfaceControl;->access$300(Landroid/view/SurfaceControl;)V
 HSPLandroid/view/SurfaceControl;->access$3000(JJJ)V
 HSPLandroid/view/SurfaceControl;->access$3100(JJ)V
+HSPLandroid/view/SurfaceControl;->access$3300(JJ[F)V
 HSPLandroid/view/SurfaceControl;->access$3500(JLandroid/os/IBinder;I)V
 HSPLandroid/view/SurfaceControl;->access$3600(JLandroid/os/IBinder;IIIIIIIII)V
 HPLandroid/view/SurfaceControl;->access$3800(J)V
 HSPLandroid/view/SurfaceControl;->access$3900(J)V
 HSPLandroid/view/SurfaceControl;->access$400()J
 HSPLandroid/view/SurfaceControl;->access$4100(JLandroid/os/Parcel;)V
-HSPLandroid/view/SurfaceControl;->access$4300(JLandroid/os/Parcel;)V
 HSPLandroid/view/SurfaceControl;->access$4400(JLandroid/os/Parcel;)V
+HSPLandroid/view/SurfaceControl;->access$4500(Landroid/os/Parcel;)J
 HSPLandroid/view/SurfaceControl;->access$500(JZ)V
 HSPLandroid/view/SurfaceControl;->access$600(Landroid/view/SurfaceControl;)Ljava/lang/Object;
 HSPLandroid/view/SurfaceControl;->access$702(Landroid/view/SurfaceControl;I)I
@@ -25165,6 +22324,7 @@
 HSPLandroid/view/SurfaceControl;->getDesiredDisplayConfigSpecs(Landroid/os/IBinder;)Landroid/view/SurfaceControl$DesiredDisplayConfigSpecs;
 HSPLandroid/view/SurfaceControl;->getDisplayBrightnessSupport(Landroid/os/IBinder;)Z
 HSPLandroid/view/SurfaceControl;->getDisplayColorModes(Landroid/os/IBinder;)[I
+HSPLandroid/view/SurfaceControl;->getDisplayConfigs(Landroid/os/IBinder;)[Landroid/view/SurfaceControl$DisplayConfig;
 HSPLandroid/view/SurfaceControl;->getGameContentTypeSupport(Landroid/os/IBinder;)Z
 HSPLandroid/view/SurfaceControl;->getHdrCapabilities(Landroid/os/IBinder;)Landroid/view/Display$HdrCapabilities;
 HSPLandroid/view/SurfaceControl;->getHeight()I
@@ -25223,6 +22383,7 @@
 HSPLandroid/view/SurfaceView;->gatherTransparentRegion(Landroid/graphics/Region;)Z
 HSPLandroid/view/SurfaceView;->getFixedAlpha()F
 HSPLandroid/view/SurfaceView;->getHolder()Landroid/view/SurfaceHolder;
+HSPLandroid/view/SurfaceView;->getRemoteAccessibilityEmbeddedConnection()Landroid/view/SurfaceView$RemoteAccessibilityEmbeddedConnection;
 HSPLandroid/view/SurfaceView;->getSurfaceCallbacks()[Landroid/view/SurfaceHolder$Callback;
 HSPLandroid/view/SurfaceView;->invalidate(Z)V
 HSPLandroid/view/SurfaceView;->isAboveParent()Z
@@ -25240,6 +22401,7 @@
 HSPLandroid/view/SurfaceView;->runOnUiThread(Ljava/lang/Runnable;)V
 HSPLandroid/view/SurfaceView;->setFrame(IIII)Z
 HSPLandroid/view/SurfaceView;->setParentSpaceRectangle(Landroid/graphics/Rect;J)V
+HSPLandroid/view/SurfaceView;->setRemoteAccessibilityEmbeddedConnection(Landroid/view/accessibility/IAccessibilityEmbeddedConnection;Landroid/os/IBinder;)V
 HSPLandroid/view/SurfaceView;->setVisibility(I)V
 HSPLandroid/view/SurfaceView;->setWindowStopped(Z)V
 HSPLandroid/view/SurfaceView;->setZOrderOnTop(Z)V
@@ -25249,8 +22411,16 @@
 HSPLandroid/view/SurfaceView;->updateOpaqueFlag()V
 HSPLandroid/view/SurfaceView;->updateRelativeZ(Landroid/view/SurfaceControl$Transaction;)V
 HSPLandroid/view/SurfaceView;->updateRequestedVisibility()V
+HSPLandroid/view/SurfaceView;->updateScreenMatrixForEmbeddedHierarchy()V
 HSPLandroid/view/SurfaceView;->updateSurface()V
+HSPLandroid/view/SyncRtSurfaceTransactionApplier$SurfaceParams$Builder;-><init>(Landroid/view/SurfaceControl;)V
+HSPLandroid/view/SyncRtSurfaceTransactionApplier$SurfaceParams$Builder;->build()Landroid/view/SyncRtSurfaceTransactionApplier$SurfaceParams;
+HSPLandroid/view/SyncRtSurfaceTransactionApplier$SurfaceParams$Builder;->withAlpha(F)Landroid/view/SyncRtSurfaceTransactionApplier$SurfaceParams$Builder;
+HSPLandroid/view/SyncRtSurfaceTransactionApplier$SurfaceParams$Builder;->withMatrix(Landroid/graphics/Matrix;)Landroid/view/SyncRtSurfaceTransactionApplier$SurfaceParams$Builder;
+HSPLandroid/view/SyncRtSurfaceTransactionApplier$SurfaceParams$Builder;->withVisibility(Z)Landroid/view/SyncRtSurfaceTransactionApplier$SurfaceParams$Builder;
 HSPLandroid/view/SyncRtSurfaceTransactionApplier$SurfaceParams;-><init>(Landroid/view/SurfaceControl;FLandroid/graphics/Matrix;Landroid/graphics/Rect;IFZ)V
+HSPLandroid/view/SyncRtSurfaceTransactionApplier$SurfaceParams;-><init>(Landroid/view/SurfaceControl;IFLandroid/graphics/Matrix;Landroid/graphics/Rect;IFIZ)V
+HSPLandroid/view/SyncRtSurfaceTransactionApplier$SurfaceParams;-><init>(Landroid/view/SurfaceControl;IFLandroid/graphics/Matrix;Landroid/graphics/Rect;IFIZLandroid/view/SyncRtSurfaceTransactionApplier$1;)V
 HSPLandroid/view/SyncRtSurfaceTransactionApplier$SurfaceParams;->access$000(Landroid/view/SyncRtSurfaceTransactionApplier$SurfaceParams;)I
 HSPLandroid/view/SyncRtSurfaceTransactionApplier;-><init>(Landroid/view/View;)V
 HSPLandroid/view/SyncRtSurfaceTransactionApplier;->applyParams(Landroid/view/SurfaceControl$Transaction;J[Landroid/view/SyncRtSurfaceTransactionApplier$SurfaceParams;)V
@@ -25285,6 +22455,7 @@
 HSPLandroid/view/TextureView;->onVisibilityChanged(Landroid/view/View;I)V
 HSPLandroid/view/TextureView;->releaseSurfaceTexture()V
 HSPLandroid/view/TextureView;->setSurfaceTextureListener(Landroid/view/TextureView$SurfaceTextureListener;)V
+HSPLandroid/view/TextureView;->setTransform(Landroid/graphics/Matrix;)V
 HSPLandroid/view/TextureView;->updateLayer()V
 HSPLandroid/view/TextureView;->updateLayerAndInvalidate()V
 HSPLandroid/view/ThreadedRenderer;-><init>(Landroid/content/Context;ZLjava/lang/String;)V
@@ -25328,8 +22499,6 @@
 HSPLandroid/view/VelocityTracker;->getYVelocity(I)F
 HSPLandroid/view/VelocityTracker;->obtain()Landroid/view/VelocityTracker;
 HSPLandroid/view/VelocityTracker;->recycle()V
-HSPLandroid/view/View$10;->setValue(Landroid/view/View;F)V
-HSPLandroid/view/View$10;->setValue(Ljava/lang/Object;F)V
 HSPLandroid/view/View$12;->get(Landroid/view/View;)Ljava/lang/Float;
 HSPLandroid/view/View$12;->get(Ljava/lang/Object;)Ljava/lang/Object;
 HSPLandroid/view/View$12;->setValue(Landroid/view/View;F)V
@@ -25369,6 +22538,8 @@
 HSPLandroid/view/View$7;->get(Ljava/lang/Object;)Ljava/lang/Object;
 HSPLandroid/view/View$7;->setValue(Landroid/view/View;F)V
 HSPLandroid/view/View$7;->setValue(Ljava/lang/Object;F)V
+HSPLandroid/view/View$9;->setValue(Landroid/view/View;F)V
+HSPLandroid/view/View$9;->setValue(Ljava/lang/Object;F)V
 HSPLandroid/view/View$AccessibilityDelegate;-><init>()V
 HSPLandroid/view/View$AccessibilityDelegate;->createAccessibilityNodeInfo(Landroid/view/View;)Landroid/view/accessibility/AccessibilityNodeInfo;
 HSPLandroid/view/View$AccessibilityDelegate;->dispatchPopulateAccessibilityEvent(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)Z
@@ -25383,7 +22554,6 @@
 HSPLandroid/view/View$AttachInfo$InvalidateInfo;->obtain()Landroid/view/View$AttachInfo$InvalidateInfo;
 HSPLandroid/view/View$AttachInfo$InvalidateInfo;->recycle()V
 HSPLandroid/view/View$AttachInfo;-><init>(Landroid/view/IWindowSession;Landroid/view/IWindow;Landroid/view/Display;Landroid/view/ViewRootImpl;Landroid/os/Handler;Landroid/view/View$AttachInfo$Callbacks;Landroid/content/Context;)V
-HSPLandroid/view/View$AttachInfo;->access$1100(Landroid/view/View$AttachInfo;Landroid/view/contentcapture/ContentCaptureSession;Landroid/view/View;Z)V
 HSPLandroid/view/View$AttachInfo;->delayNotifyContentCaptureEvent(Landroid/view/contentcapture/ContentCaptureSession;Landroid/view/View;Z)V
 HSPLandroid/view/View$AttachInfo;->getContentCaptureManager(Landroid/content/Context;)Landroid/view/contentcapture/ContentCaptureManager;
 HSPLandroid/view/View$BaseSavedState$1;->createFromParcel(Landroid/os/Parcel;Ljava/lang/ClassLoader;)Landroid/view/View$BaseSavedState;
@@ -25406,15 +22576,12 @@
 HSPLandroid/view/View$ForegroundInfo;-><init>(Landroid/view/View$1;)V
 HSPLandroid/view/View$ForegroundInfo;->access$100(Landroid/view/View$ForegroundInfo;)Z
 HSPLandroid/view/View$ForegroundInfo;->access$102(Landroid/view/View$ForegroundInfo;Z)Z
-HSPLandroid/view/View$ForegroundInfo;->access$1500(Landroid/view/View$ForegroundInfo;)Landroid/graphics/drawable/Drawable;
 HSPLandroid/view/View$ForegroundInfo;->access$1600(Landroid/view/View$ForegroundInfo;)Landroid/graphics/drawable/Drawable;
 HSPLandroid/view/View$ForegroundInfo;->access$1602(Landroid/view/View$ForegroundInfo;Landroid/graphics/drawable/Drawable;)Landroid/graphics/drawable/Drawable;
 HSPLandroid/view/View$ForegroundInfo;->access$1700(Landroid/view/View$ForegroundInfo;)Landroid/graphics/drawable/Drawable;
 HSPLandroid/view/View$ForegroundInfo;->access$1702(Landroid/view/View$ForegroundInfo;Landroid/graphics/drawable/Drawable;)Landroid/graphics/drawable/Drawable;
-HSPLandroid/view/View$ForegroundInfo;->access$2102(Landroid/view/View$ForegroundInfo;Z)Z
 HSPLandroid/view/View$ForegroundInfo;->access$2200(Landroid/view/View$ForegroundInfo;)Z
 HSPLandroid/view/View$ForegroundInfo;->access$2202(Landroid/view/View$ForegroundInfo;Z)Z
-HSPLandroid/view/View$ForegroundInfo;->access$2300(Landroid/view/View$ForegroundInfo;)Z
 HSPLandroid/view/View$ForegroundInfo;->access$2302(Landroid/view/View$ForegroundInfo;Z)Z
 HSPLandroid/view/View$ForegroundInfo;->access$2600(Landroid/view/View$ForegroundInfo;)I
 HSPLandroid/view/View$ForegroundInfo;->access$2602(Landroid/view/View$ForegroundInfo;I)I
@@ -25424,14 +22591,11 @@
 HSPLandroid/view/View$ForegroundInfo;->access$2800(Landroid/view/View$ForegroundInfo;)Landroid/graphics/Rect;
 HSPLandroid/view/View$ForegroundInfo;->access$2800(Landroid/view/View$ForegroundInfo;)Landroid/view/View$TintInfo;
 HSPLandroid/view/View$ForegroundInfo;->access$2900(Landroid/view/View$ForegroundInfo;)Landroid/graphics/Rect;
-HSPLandroid/view/View$ForegroundInfo;->access$3000(Landroid/view/View$ForegroundInfo;)Landroid/graphics/Rect;
 HSPLandroid/view/View$ListenerInfo;-><init>()V
-HSPLandroid/view/View$ListenerInfo;->access$1300(Landroid/view/View$ListenerInfo;)Ljava/util/List;
 HSPLandroid/view/View$ListenerInfo;->access$1400(Landroid/view/View$ListenerInfo;)Ljava/util/List;
 HSPLandroid/view/View$ListenerInfo;->access$1402(Landroid/view/View$ListenerInfo;Ljava/util/List;)Ljava/util/List;
 HSPLandroid/view/View$ListenerInfo;->access$1500(Landroid/view/View$ListenerInfo;)Ljava/util/List;
 HSPLandroid/view/View$ListenerInfo;->access$1502(Landroid/view/View$ListenerInfo;Ljava/util/List;)Ljava/util/List;
-HSPLandroid/view/View$ListenerInfo;->access$1700(Landroid/view/View$ListenerInfo;)Landroid/view/View$OnSystemUiVisibilityChangeListener;
 HSPLandroid/view/View$ListenerInfo;->access$1800(Landroid/view/View$ListenerInfo;)Landroid/view/View$OnSystemUiVisibilityChangeListener;
 HSPLandroid/view/View$ListenerInfo;->access$1802(Landroid/view/View$ListenerInfo;Landroid/view/View$OnSystemUiVisibilityChangeListener;)Landroid/view/View$OnSystemUiVisibilityChangeListener;
 HSPLandroid/view/View$ListenerInfo;->access$1900(Landroid/view/View$ListenerInfo;)Landroid/view/View$OnSystemUiVisibilityChangeListener;
@@ -25477,11 +22641,9 @@
 HSPLandroid/view/View$TooltipInfo;->access$4100(Landroid/view/View$TooltipInfo;)V
 HSPLandroid/view/View$TooltipInfo;->clearAnchorPos()V
 HSPLandroid/view/View$TransformationInfo;-><init>()V
-HSPLandroid/view/View$TransformationInfo;->access$2200(Landroid/view/View$TransformationInfo;)Landroid/graphics/Matrix;
 HSPLandroid/view/View$TransformationInfo;->access$2300(Landroid/view/View$TransformationInfo;)Landroid/graphics/Matrix;
 HSPLandroid/view/View$TransformationInfo;->access$2400(Landroid/view/View$TransformationInfo;)F
 HSPLandroid/view/View$TransformationInfo;->access$2400(Landroid/view/View$TransformationInfo;)Landroid/graphics/Matrix;
-HSPLandroid/view/View$TransformationInfo;->access$2402(Landroid/view/View$TransformationInfo;F)F
 HSPLandroid/view/View$TransformationInfo;->access$2402(Landroid/view/View$TransformationInfo;Landroid/graphics/Matrix;)Landroid/graphics/Matrix;
 HSPLandroid/view/View$TransformationInfo;->access$2500(Landroid/view/View$TransformationInfo;)F
 HSPLandroid/view/View$TransformationInfo;->access$2500(Landroid/view/View$TransformationInfo;)Landroid/graphics/Matrix;
@@ -25510,10 +22672,8 @@
 HSPLandroid/view/View;->access$3600(Landroid/view/View;JFFI)V
 HSPLandroid/view/View;->access$3700(Landroid/view/View;)Z
 HSPLandroid/view/View;->access$3700(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V
-HSPLandroid/view/View;->addChildrenForAccessibility(Ljava/util/ArrayList;)V
 HSPLandroid/view/View;->addFocusables(Ljava/util/ArrayList;I)V
 HSPLandroid/view/View;->addFocusables(Ljava/util/ArrayList;II)V
-HSPLandroid/view/View;->addFrameMetricsListener(Landroid/view/Window;Landroid/view/Window$OnFrameMetricsAvailableListener;Landroid/os/Handler;)V
 HSPLandroid/view/View;->addOnAttachStateChangeListener(Landroid/view/View$OnAttachStateChangeListener;)V
 HSPLandroid/view/View;->addOnLayoutChangeListener(Landroid/view/View$OnLayoutChangeListener;)V
 HSPLandroid/view/View;->animate()Landroid/view/ViewPropertyAnimator;
@@ -25540,7 +22700,6 @@
 HSPLandroid/view/View;->canScrollVertically(I)Z
 HSPLandroid/view/View;->canTakeFocus()Z
 HSPLandroid/view/View;->cancel(Landroid/view/View$SendAccessibilityEventThrottle;)V
-HSPLandroid/view/View;->cancel(Landroid/view/View$SendViewScrolledAccessibilityEvent;)V
 HSPLandroid/view/View;->cancelLongPress()V
 HSPLandroid/view/View;->cancelPendingInputEvents()V
 HSPLandroid/view/View;->checkForLongClick(JFFI)V
@@ -25567,7 +22726,6 @@
 HSPLandroid/view/View;->computeVerticalScrollRange()I
 HSPLandroid/view/View;->createAccessibilityNodeInfo()Landroid/view/accessibility/AccessibilityNodeInfo;
 HSPLandroid/view/View;->createAccessibilityNodeInfoInternal()Landroid/view/accessibility/AccessibilityNodeInfo;
-HSPLandroid/view/View;->createContextMenu(Landroid/view/ContextMenu;)V
 HSPLandroid/view/View;->damageInParent()V
 HSPLandroid/view/View;->destroyDrawingCache()V
 HSPLandroid/view/View;->destroyHardwareResources()V
@@ -25591,7 +22749,6 @@
 HSPLandroid/view/View;->dispatchPointerEvent(Landroid/view/MotionEvent;)Z
 HSPLandroid/view/View;->dispatchPopulateAccessibilityEvent(Landroid/view/accessibility/AccessibilityEvent;)Z
 HSPLandroid/view/View;->dispatchPopulateAccessibilityEventInternal(Landroid/view/accessibility/AccessibilityEvent;)Z
-HSPLandroid/view/View;->dispatchProvideAutofillStructure(Landroid/view/ViewStructure;I)V
 HSPLandroid/view/View;->dispatchProvideContentCaptureStructure()V
 HSPLandroid/view/View;->dispatchProvideStructure(Landroid/view/ViewStructure;II)V
 HSPLandroid/view/View;->dispatchRestoreInstanceState(Landroid/util/SparseArray;)V
@@ -25622,10 +22779,8 @@
 HSPLandroid/view/View;->ensureTransformationInfo()V
 HSPLandroid/view/View;->findAccessibilityFocusHost(Z)Landroid/view/View;
 HSPLandroid/view/View;->findFocus()Landroid/view/View;
-HSPLandroid/view/View;->findFrameMetricsObserver(Landroid/view/Window$OnFrameMetricsAvailableListener;)Landroid/view/FrameMetricsObserver;
 HSPLandroid/view/View;->findKeyboardNavigationCluster()Landroid/view/View;
 HSPLandroid/view/View;->findUserSetNextFocus(Landroid/view/View;I)Landroid/view/View;
-HSPLandroid/view/View;->findViewByAutofillIdTraversal(I)Landroid/view/View;
 HSPLandroid/view/View;->findViewById(I)Landroid/view/View;
 HSPLandroid/view/View;->findViewByPredicate(Ljava/util/function/Predicate;)Landroid/view/View;
 HSPLandroid/view/View;->findViewByPredicateInsideOut(Landroid/view/View;Ljava/util/function/Predicate;)Landroid/view/View;
@@ -25667,8 +22822,6 @@
 HSPLandroid/view/View;->getContentCaptureSession()Landroid/view/contentcapture/ContentCaptureSession;
 HSPLandroid/view/View;->getContentDescription()Ljava/lang/CharSequence;
 HSPLandroid/view/View;->getContext()Landroid/content/Context;
-HSPLandroid/view/View;->getContextMenuInfo()Landroid/view/ContextMenu$ContextMenuInfo;
-HSPLandroid/view/View;->getDefaultFocusHighlightEnabled()Z
 HSPLandroid/view/View;->getDefaultSize(II)I
 HSPLandroid/view/View;->getDisplay()Landroid/view/Display;
 HSPLandroid/view/View;->getDrawableRenderNode(Landroid/graphics/drawable/Drawable;Landroid/graphics/RenderNode;)Landroid/graphics/RenderNode;
@@ -25691,8 +22844,6 @@
 HSPLandroid/view/View;->getHeight()I
 HSPLandroid/view/View;->getHitRect(Landroid/graphics/Rect;)V
 HSPLandroid/view/View;->getHorizontalFadingEdgeLength()I
-HSPLandroid/view/View;->getHorizontalScrollBarBounds(Landroid/graphics/Rect;Landroid/graphics/Rect;)V
-HSPLandroid/view/View;->getHorizontalScrollbarHeight()I
 HSPLandroid/view/View;->getId()I
 HSPLandroid/view/View;->getImportantForAccessibility()I
 HSPLandroid/view/View;->getImportantForAutofill()I
@@ -25761,7 +22912,6 @@
 HSPLandroid/view/View;->getTag(I)Ljava/lang/Object;
 HSPLandroid/view/View;->getTextAlignment()I
 HSPLandroid/view/View;->getTextDirection()I
-HSPLandroid/view/View;->getThreadedRenderer()Landroid/view/ThreadedRenderer;
 HSPLandroid/view/View;->getThrottleForAccessibilityEvent(Landroid/view/accessibility/AccessibilityEvent;)Landroid/view/View$SendAccessibilityEventThrottle;
 HSPLandroid/view/View;->getTop()I
 HSPLandroid/view/View;->getTransitionAlpha()F
@@ -25807,6 +22957,8 @@
 HSPLandroid/view/View;->hasTransientState()Z
 HSPLandroid/view/View;->hasUnhandledKeyListener()Z
 HSPLandroid/view/View;->hasWindowFocus()Z
+HSPLandroid/view/View;->hasWindowInsetsAnimationCallback()Z
+HSPLandroid/view/View;->hideAutofillHighlight()Z
 HSPLandroid/view/View;->hideTooltip()V
 HSPLandroid/view/View;->includeForAccessibility()Z
 HSPLandroid/view/View;->inflate(Landroid/content/Context;ILandroid/view/ViewGroup;)Landroid/view/View;
@@ -25919,14 +23071,12 @@
 HSPLandroid/view/View;->onCheckIsTextEditor()Z
 HSPLandroid/view/View;->onCloseSystemDialogs(Ljava/lang/String;)V
 HSPLandroid/view/View;->onConfigurationChanged(Landroid/content/res/Configuration;)V
-HSPLandroid/view/View;->onCreateContextMenu(Landroid/view/ContextMenu;)V
 HSPLandroid/view/View;->onCreateDrawableState(I)[I
 HSPLandroid/view/View;->onCreateInputConnection(Landroid/view/inputmethod/EditorInfo;)Landroid/view/inputmethod/InputConnection;
 HSPLandroid/view/View;->onDetachedFromWindow()V
 HSPLandroid/view/View;->onDetachedFromWindowInternal()V
 HSPLandroid/view/View;->onDraw(Landroid/graphics/Canvas;)V
 HSPLandroid/view/View;->onDrawForeground(Landroid/graphics/Canvas;)V
-HSPLandroid/view/View;->onDrawHorizontalScrollBar(Landroid/graphics/Canvas;Landroid/graphics/drawable/Drawable;IIII)V
 HSPLandroid/view/View;->onDrawScrollBars(Landroid/graphics/Canvas;)V
 HSPLandroid/view/View;->onDrawScrollIndicators(Landroid/graphics/Canvas;)V
 HSPLandroid/view/View;->onDrawVerticalScrollBar(Landroid/graphics/Canvas;Landroid/graphics/drawable/Drawable;IIII)V
@@ -25946,8 +23096,6 @@
 HSPLandroid/view/View;->onMeasure(II)V
 HSPLandroid/view/View;->onPopulateAccessibilityEvent(Landroid/view/accessibility/AccessibilityEvent;)V
 HSPLandroid/view/View;->onPopulateAccessibilityEventInternal(Landroid/view/accessibility/AccessibilityEvent;)V
-HSPLandroid/view/View;->onProvideAutofillStructure(Landroid/view/ViewStructure;I)V
-HSPLandroid/view/View;->onProvideAutofillVirtualStructure(Landroid/view/ViewStructure;I)V
 HSPLandroid/view/View;->onProvideContentCaptureStructure(Landroid/view/ViewStructure;I)V
 HSPLandroid/view/View;->onProvideStructure(Landroid/view/ViewStructure;II)V
 HSPLandroid/view/View;->onResolveDrawables(I)V
@@ -25997,7 +23145,6 @@
 HSPLandroid/view/View;->refreshDrawableState()V
 HSPLandroid/view/View;->registerPendingFrameMetricsObservers()V
 HSPLandroid/view/View;->removeCallbacks(Ljava/lang/Runnable;)Z
-HSPLandroid/view/View;->removeFrameMetricsListener(Landroid/view/Window$OnFrameMetricsAvailableListener;)V
 HSPLandroid/view/View;->removeLongPressCallback()V
 HSPLandroid/view/View;->removeOnAttachStateChangeListener(Landroid/view/View$OnAttachStateChangeListener;)V
 HSPLandroid/view/View;->removeOnLayoutChangeListener(Landroid/view/View$OnLayoutChangeListener;)V
@@ -26052,7 +23199,6 @@
 HSPLandroid/view/View;->sendAccessibilityEventUnchecked(Landroid/view/accessibility/AccessibilityEvent;)V
 HSPLandroid/view/View;->sendAccessibilityEventUncheckedInternal(Landroid/view/accessibility/AccessibilityEvent;)V
 HSPLandroid/view/View;->setAccessibilityDelegate(Landroid/view/View$AccessibilityDelegate;)V
-HSPLandroid/view/View;->setAccessibilityHeading(Z)V
 HSPLandroid/view/View;->setAccessibilityLiveRegion(I)V
 HSPLandroid/view/View;->setAccessibilityPaneTitle(Ljava/lang/CharSequence;)V
 HSPLandroid/view/View;->setAccessibilityTraversalAfter(I)V
@@ -26063,6 +23209,7 @@
 HSPLandroid/view/View;->setAlphaNoInvalidation(F)Z
 HSPLandroid/view/View;->setAnimation(Landroid/view/animation/Animation;)V
 HSPLandroid/view/View;->setAutofilled(Z)V
+HSPLandroid/view/View;->setAutofilled(ZZ)V
 HSPLandroid/view/View;->setBackground(Landroid/graphics/drawable/Drawable;)V
 HSPLandroid/view/View;->setBackgroundBounds()V
 HSPLandroid/view/View;->setBackgroundColor(I)V
@@ -26103,7 +23250,6 @@
 HSPLandroid/view/View;->setKeepScreenOn(Z)V
 HSPLandroid/view/View;->setKeyboardNavigationCluster(Z)V
 HSPLandroid/view/View;->setKeyedTag(ILjava/lang/Object;)V
-HSPLandroid/view/View;->setLabelFor(I)V
 HSPLandroid/view/View;->setLayerPaint(Landroid/graphics/Paint;)V
 HSPLandroid/view/View;->setLayerType(ILandroid/graphics/Paint;)V
 HSPLandroid/view/View;->setLayoutDirection(I)V
@@ -26115,18 +23261,13 @@
 HSPLandroid/view/View;->setMeasuredDimensionRaw(II)V
 HSPLandroid/view/View;->setMinimumHeight(I)V
 HSPLandroid/view/View;->setMinimumWidth(I)V
-HSPLandroid/view/View;->setNextFocusDownId(I)V
-HSPLandroid/view/View;->setNextFocusForwardId(I)V
-HSPLandroid/view/View;->setNextFocusUpId(I)V
 HSPLandroid/view/View;->setNotifiedContentCaptureAppeared()V
 HSPLandroid/view/View;->setOnApplyWindowInsetsListener(Landroid/view/View$OnApplyWindowInsetsListener;)V
 HSPLandroid/view/View;->setOnClickListener(Landroid/view/View$OnClickListener;)V
-HSPLandroid/view/View;->setOnCreateContextMenuListener(Landroid/view/View$OnCreateContextMenuListener;)V
 HSPLandroid/view/View;->setOnFocusChangeListener(Landroid/view/View$OnFocusChangeListener;)V
 HSPLandroid/view/View;->setOnHoverListener(Landroid/view/View$OnHoverListener;)V
 HSPLandroid/view/View;->setOnKeyListener(Landroid/view/View$OnKeyListener;)V
 HSPLandroid/view/View;->setOnLongClickListener(Landroid/view/View$OnLongClickListener;)V
-HSPLandroid/view/View;->setOnScrollChangeListener(Landroid/view/View$OnScrollChangeListener;)V
 HSPLandroid/view/View;->setOnSystemUiVisibilityChangeListener(Landroid/view/View$OnSystemUiVisibilityChangeListener;)V
 HSPLandroid/view/View;->setOnTouchListener(Landroid/view/View$OnTouchListener;)V
 HSPLandroid/view/View;->setOutlineProvider(Landroid/view/ViewOutlineProvider;)V
@@ -26139,7 +23280,6 @@
 HSPLandroid/view/View;->setPointerIcon(Landroid/view/PointerIcon;)V
 HSPLandroid/view/View;->setPressed(Z)V
 HSPLandroid/view/View;->setPressed(ZFF)V
-HSPLandroid/view/View;->setRevealClip(ZFFF)V
 HSPLandroid/view/View;->setRight(I)V
 HSPLandroid/view/View;->setRotation(F)V
 HSPLandroid/view/View;->setRotationX(F)V
@@ -26155,6 +23295,7 @@
 HSPLandroid/view/View;->setScrollIndicators(II)V
 HSPLandroid/view/View;->setScrollX(I)V
 HSPLandroid/view/View;->setScrollY(I)V
+HSPLandroid/view/View;->setScrollbarFadingEnabled(Z)V
 HSPLandroid/view/View;->setSelected(Z)V
 HSPLandroid/view/View;->setSoundEffectsEnabled(Z)V
 HSPLandroid/view/View;->setStateDescription(Ljava/lang/CharSequence;)V
@@ -26182,7 +23323,6 @@
 HSPLandroid/view/View;->setX(F)V
 HSPLandroid/view/View;->setY(F)V
 HSPLandroid/view/View;->shouldDrawRoundScrollbar()Z
-HSPLandroid/view/View;->showContextMenu(FF)Z
 HSPLandroid/view/View;->sizeChange(IIII)V
 HSPLandroid/view/View;->skipInvalidate()Z
 HSPLandroid/view/View;->startActionMode(Landroid/view/ActionMode$Callback;I)Landroid/view/ActionMode;
@@ -26206,7 +23346,6 @@
 HSPLandroid/view/ViewAnimationHostBridge;->isAttached()Z
 HSPLandroid/view/ViewAnimationHostBridge;->registerAnimatingRenderNode(Landroid/graphics/RenderNode;)V
 HSPLandroid/view/ViewAnimationHostBridge;->registerVectorDrawableAnimator(Landroid/view/NativeVectorDrawableAnimator;)V
-HSPLandroid/view/ViewAnimationUtils;->createCircularReveal(Landroid/view/View;IIFF)Landroid/animation/Animator;
 HSPLandroid/view/ViewConfiguration;-><init>(Landroid/content/Context;)V
 HSPLandroid/view/ViewConfiguration;->get(Landroid/content/Context;)Landroid/view/ViewConfiguration;
 HSPLandroid/view/ViewConfiguration;->getAmbiguousGestureMultiplier()F
@@ -26221,7 +23360,6 @@
 HSPLandroid/view/ViewConfiguration;->getScaledAmbiguousGestureMultiplier()F
 HSPLandroid/view/ViewConfiguration;->getScaledDoubleTapSlop()I
 HSPLandroid/view/ViewConfiguration;->getScaledDoubleTapTouchSlop()I
-HSPLandroid/view/ViewConfiguration;->getScaledEdgeSlop()I
 HSPLandroid/view/ViewConfiguration;->getScaledFadingEdgeLength()I
 HSPLandroid/view/ViewConfiguration;->getScaledHorizontalScrollFactor()F
 HSPLandroid/view/ViewConfiguration;->getScaledHoverSlop()I
@@ -26301,7 +23439,6 @@
 HSPLandroid/view/ViewGroup;->access$300(Landroid/view/ViewGroup;)Z
 HSPLandroid/view/ViewGroup;->access$302(Landroid/view/ViewGroup;Z)Z
 HSPLandroid/view/ViewGroup;->access$400(Landroid/view/ViewGroup;)Ljava/util/ArrayList;
-HSPLandroid/view/ViewGroup;->addChildrenForAccessibility(Ljava/util/ArrayList;)V
 HSPLandroid/view/ViewGroup;->addDisappearingView(Landroid/view/View;)V
 HSPLandroid/view/ViewGroup;->addFocusables(Ljava/util/ArrayList;II)V
 HSPLandroid/view/ViewGroup;->addInArray(Landroid/view/View;I)V
@@ -26351,7 +23488,6 @@
 HSPLandroid/view/ViewGroup;->dispatchKeyEvent(Landroid/view/KeyEvent;)Z
 HSPLandroid/view/ViewGroup;->dispatchKeyEventPreIme(Landroid/view/KeyEvent;)Z
 HSPLandroid/view/ViewGroup;->dispatchPopulateAccessibilityEventInternal(Landroid/view/accessibility/AccessibilityEvent;)Z
-HSPLandroid/view/ViewGroup;->dispatchProvideAutofillStructure(Landroid/view/ViewStructure;I)V
 HSPLandroid/view/ViewGroup;->dispatchProvideContentCaptureStructure()V
 HSPLandroid/view/ViewGroup;->dispatchRestoreInstanceState(Landroid/util/SparseArray;)V
 HSPLandroid/view/ViewGroup;->dispatchSaveInstanceState(Landroid/util/SparseArray;)V
@@ -26382,7 +23518,6 @@
 HSPLandroid/view/ViewGroup;->exitHoverTargets()V
 HSPLandroid/view/ViewGroup;->exitTooltipHoverTargets()V
 HSPLandroid/view/ViewGroup;->findFocus()Landroid/view/View;
-HSPLandroid/view/ViewGroup;->findViewByAutofillIdTraversal(I)Landroid/view/View;
 HSPLandroid/view/ViewGroup;->findViewByPredicateTraversal(Ljava/util/function/Predicate;Landroid/view/View;)Landroid/view/View;
 HSPLandroid/view/ViewGroup;->findViewTraversal(I)Landroid/view/View;
 HSPLandroid/view/ViewGroup;->findViewWithTagTraversal(Ljava/lang/Object;)Landroid/view/View;
@@ -26401,7 +23536,6 @@
 HSPLandroid/view/ViewGroup;->getChildTransformation()Landroid/view/animation/Transformation;
 HSPLandroid/view/ViewGroup;->getChildVisibleRect(Landroid/view/View;Landroid/graphics/Rect;Landroid/graphics/Point;)Z
 HSPLandroid/view/ViewGroup;->getChildVisibleRect(Landroid/view/View;Landroid/graphics/Rect;Landroid/graphics/Point;Z)Z
-HSPLandroid/view/ViewGroup;->getChildrenForAutofill(I)Landroid/view/ViewGroup$ChildListForAutoFillOrContentCapture;
 HSPLandroid/view/ViewGroup;->getChildrenForContentCapture()Landroid/view/ViewGroup$ChildListForAutoFillOrContentCapture;
 HSPLandroid/view/ViewGroup;->getClipChildren()Z
 HSPLandroid/view/ViewGroup;->getClipToPadding()Z
@@ -26427,6 +23561,7 @@
 HSPLandroid/view/ViewGroup;->hasFocusableChild(Z)Z
 HSPLandroid/view/ViewGroup;->hasTransientState()Z
 HSPLandroid/view/ViewGroup;->hasUnhandledKeyListener()Z
+HSPLandroid/view/ViewGroup;->hasWindowInsetsAnimationCallback()Z
 HSPLandroid/view/ViewGroup;->indexOfChild(Landroid/view/View;)I
 HSPLandroid/view/ViewGroup;->initFromAttributes(Landroid/content/Context;Landroid/util/AttributeSet;II)V
 HSPLandroid/view/ViewGroup;->initViewGroup()V
@@ -26467,7 +23602,6 @@
 HSPLandroid/view/ViewGroup;->onStartNestedScroll(Landroid/view/View;Landroid/view/View;I)Z
 HSPLandroid/view/ViewGroup;->onViewAdded(Landroid/view/View;)V
 HSPLandroid/view/ViewGroup;->onViewRemoved(Landroid/view/View;)V
-HSPLandroid/view/ViewGroup;->populateChildrenForAutofill(Ljava/util/ArrayList;I)V
 HSPLandroid/view/ViewGroup;->populateChildrenForContentCapture(Ljava/util/ArrayList;)V
 HSPLandroid/view/ViewGroup;->recomputeViewAttributes(Landroid/view/View;)V
 HSPLandroid/view/ViewGroup;->recreateChildDisplayList(Landroid/view/View;)V
@@ -26483,8 +23617,6 @@
 HSPLandroid/view/ViewGroup;->removeViewInLayout(Landroid/view/View;)V
 HSPLandroid/view/ViewGroup;->removeViewInternal(ILandroid/view/View;)V
 HSPLandroid/view/ViewGroup;->removeViewInternal(Landroid/view/View;)Z
-HSPLandroid/view/ViewGroup;->removeViews(II)V
-HSPLandroid/view/ViewGroup;->removeViewsInternal(II)V
 HSPLandroid/view/ViewGroup;->requestChildFocus(Landroid/view/View;Landroid/view/View;)V
 HSPLandroid/view/ViewGroup;->requestChildRectangleOnScreen(Landroid/view/View;Landroid/graphics/Rect;Z)Z
 HSPLandroid/view/ViewGroup;->requestDisallowInterceptTouchEvent(Z)V
@@ -26524,7 +23656,6 @@
 HSPLandroid/view/ViewGroup;->shouldBlockFocusForTouchscreen()Z
 HSPLandroid/view/ViewGroup;->shouldDelayChildPressedState()Z
 HSPLandroid/view/ViewGroup;->showContextMenuForChild(Landroid/view/View;)Z
-HSPLandroid/view/ViewGroup;->showContextMenuForChild(Landroid/view/View;FF)Z
 HSPLandroid/view/ViewGroup;->startActionModeForChild(Landroid/view/View;Landroid/view/ActionMode$Callback;I)Landroid/view/ActionMode;
 HSPLandroid/view/ViewGroup;->startViewTransition(Landroid/view/View;)V
 HSPLandroid/view/ViewGroup;->suppressLayout(Z)V
@@ -26532,7 +23663,6 @@
 HSPLandroid/view/ViewGroup;->transformPointToViewLocal([FLandroid/view/View;)V
 HSPLandroid/view/ViewGroup;->unFocus(Landroid/view/View;)V
 HSPLandroid/view/ViewGroup;->updateLocalSystemUiVisibility(II)Z
-HSPLandroid/view/ViewGroup;->updateViewLayout(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V
 HSPLandroid/view/ViewGroupOverlay;-><init>(Landroid/content/Context;Landroid/view/View;)V
 HSPLandroid/view/ViewGroupOverlay;->add(Landroid/view/View;)V
 HSPLandroid/view/ViewGroupOverlay;->remove(Landroid/view/View;)V
@@ -26604,6 +23734,7 @@
 HSPLandroid/view/ViewRootImpl$1;->onDisplayChanged(I)V
 HSPLandroid/view/ViewRootImpl$1;->onDisplayRemoved(I)V
 HSPLandroid/view/ViewRootImpl$1;->toViewScreenState(I)I
+HSPLandroid/view/ViewRootImpl$2;->run()V
 HSPLandroid/view/ViewRootImpl$4;-><init>(Landroid/view/ViewRootImpl;)V
 HSPLandroid/view/ViewRootImpl$4;->run()V
 HSPLandroid/view/ViewRootImpl$AccessibilityInteractionConnection;-><init>(Landroid/view/ViewRootImpl;)V
@@ -26699,21 +23830,25 @@
 HSPLandroid/view/ViewRootImpl$W;->dispatchAppVisibility(Z)V
 HSPLandroid/view/ViewRootImpl$W;->dispatchSystemUiVisibilityChanged(IIII)V
 HSPLandroid/view/ViewRootImpl$W;->dispatchWindowShown()V
+HSPLandroid/view/ViewRootImpl$W;->hideInsets(IZ)V
 HSPLandroid/view/ViewRootImpl$W;->insetsChanged(Landroid/view/InsetsState;)V
 HSPLandroid/view/ViewRootImpl$W;->insetsControlChanged(Landroid/view/InsetsState;[Landroid/view/InsetsSourceControl;)V
 HSPLandroid/view/ViewRootImpl$W;->moved(II)V
 HSPLandroid/view/ViewRootImpl$W;->resized(Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;ZLandroid/util/MergedConfiguration;Landroid/graphics/Rect;ZZILandroid/view/DisplayCutout$ParcelableWrapper;)V
-HSPLandroid/view/ViewRootImpl$W;->windowFocusChanged(ZZ)V
+HSPLandroid/view/ViewRootImpl$W;->showInsets(IZ)V
 HSPLandroid/view/ViewRootImpl$WindowInputEventReceiver;-><init>(Landroid/view/ViewRootImpl;Landroid/view/InputChannel;Landroid/os/Looper;)V
 HSPLandroid/view/ViewRootImpl$WindowInputEventReceiver;->dispose()V
 HSPLandroid/view/ViewRootImpl$WindowInputEventReceiver;->onBatchedInputEventPending()V
+HSPLandroid/view/ViewRootImpl$WindowInputEventReceiver;->onBatchedInputEventPending(I)V
 HSPLandroid/view/ViewRootImpl$WindowInputEventReceiver;->onFocusEvent(ZZ)V
 HSPLandroid/view/ViewRootImpl$WindowInputEventReceiver;->onInputEvent(Landroid/view/InputEvent;)V
 HSPLandroid/view/ViewRootImpl$WindowInputEventReceiver;->processUnbufferedRequest(Landroid/view/InputEvent;)V
 HSPLandroid/view/ViewRootImpl;-><init>(Landroid/content/Context;Landroid/view/Display;)V
 HSPLandroid/view/ViewRootImpl;-><init>(Landroid/content/Context;Landroid/view/Display;Landroid/view/IWindowSession;)V
+HSPLandroid/view/ViewRootImpl;->access$1000(Landroid/view/ViewRootImpl;)Landroid/view/InsetsController;
 HSPLandroid/view/ViewRootImpl;->access$1000(Landroid/view/ViewRootImpl;Landroid/graphics/Rect;)V
 HSPLandroid/view/ViewRootImpl;->access$1100(Landroid/view/ViewRootImpl;)V
+HSPLandroid/view/ViewRootImpl;->access$1100(Landroid/view/ViewRootImpl;Landroid/graphics/Rect;)V
 HSPLandroid/view/ViewRootImpl;->access$1600(Landroid/view/ViewRootImpl;Landroid/view/ViewRootImpl$QueuedInputEvent;)V
 HSPLandroid/view/ViewRootImpl;->access$1900(Landroid/view/ViewRootImpl;)Landroid/view/ImeFocusController;
 HSPLandroid/view/ViewRootImpl;->access$2000(Landroid/view/ViewRootImpl;Landroid/view/KeyEvent;)Z
@@ -26728,9 +23863,12 @@
 HSPLandroid/view/ViewRootImpl;->access$4000(Landroid/view/ViewRootImpl;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;ZLandroid/util/MergedConfiguration;Landroid/graphics/Rect;ZZILandroid/view/DisplayCutout$ParcelableWrapper;)V
 HSPLandroid/view/ViewRootImpl;->access$4100(Landroid/view/ViewRootImpl;Landroid/view/InsetsState;)V
 HSPLandroid/view/ViewRootImpl;->access$4300(Landroid/view/ViewRootImpl;Landroid/view/InsetsState;[Landroid/view/InsetsSourceControl;)V
+HSPLandroid/view/ViewRootImpl;->access$4400(Landroid/view/ViewRootImpl;IZ)V
+HSPLandroid/view/ViewRootImpl;->access$4500(Landroid/view/ViewRootImpl;IZ)V
 HSPLandroid/view/ViewRootImpl;->access$4500(Landroid/view/ViewRootImpl;Landroid/view/View;Landroid/view/View;)Landroid/view/View;
 HSPLandroid/view/ViewRootImpl;->access$600(Landroid/view/ViewRootImpl;Landroid/graphics/Rect;)V
 HSPLandroid/view/ViewRootImpl;->access$700(Landroid/view/ViewRootImpl;)V
+HSPLandroid/view/ViewRootImpl;->access$700(Landroid/view/ViewRootImpl;Landroid/graphics/Rect;)V
 HSPLandroid/view/ViewRootImpl;->access$800(Landroid/view/View;)V
 HSPLandroid/view/ViewRootImpl;->access$900(Landroid/view/ViewRootImpl;)Landroid/view/InsetsController;
 HSPLandroid/view/ViewRootImpl;->addConfigCallback(Landroid/view/ViewRootImpl$ConfigChangedCallback;)V
@@ -26747,7 +23885,6 @@
 HSPLandroid/view/ViewRootImpl;->clearChildFocus(Landroid/view/View;)V
 HSPLandroid/view/ViewRootImpl;->collectViewAttributes()Z
 HSPLandroid/view/ViewRootImpl;->controlInsetsForCompatibility(Landroid/view/WindowManager$LayoutParams;)V
-HSPLandroid/view/ViewRootImpl;->createContextMenu(Landroid/view/ContextMenu;)V
 HSPLandroid/view/ViewRootImpl;->deliverInputEvent(Landroid/view/ViewRootImpl$QueuedInputEvent;)V
 HSPLandroid/view/ViewRootImpl;->destroyHardwareRenderer()V
 HSPLandroid/view/ViewRootImpl;->destroyHardwareResources()V
@@ -26804,6 +23941,7 @@
 HSPLandroid/view/ViewRootImpl;->getImpliedSystemUiVisibility(Landroid/view/WindowManager$LayoutParams;)I
 HSPLandroid/view/ViewRootImpl;->getInsetsController()Landroid/view/InsetsController;
 HSPLandroid/view/ViewRootImpl;->getNightMode()I
+HSPLandroid/view/ViewRootImpl;->getOrCreateBLASTSurface(II)Landroid/view/Surface;
 HSPLandroid/view/ViewRootImpl;->getParent()Landroid/view/ViewParent;
 HSPLandroid/view/ViewRootImpl;->getRenderSurfaceControl()Landroid/view/SurfaceControl;
 HSPLandroid/view/ViewRootImpl;->getRootMeasureSpec(II)I
@@ -26823,6 +23961,7 @@
 HSPLandroid/view/ViewRootImpl;->handleWindowContentChangedEvent(Landroid/view/accessibility/AccessibilityEvent;)V
 HSPLandroid/view/ViewRootImpl;->handleWindowFocusChanged()V
 HSPLandroid/view/ViewRootImpl;->hasColorModeChanged(I)Z
+HSPLandroid/view/ViewRootImpl;->hideInsets(IZ)V
 HSPLandroid/view/ViewRootImpl;->invalidate()V
 HSPLandroid/view/ViewRootImpl;->invalidateChild(Landroid/view/View;Landroid/graphics/Rect;)V
 HSPLandroid/view/ViewRootImpl;->invalidateChildInParent([ILandroid/graphics/Rect;)Landroid/view/ViewParent;
@@ -26830,7 +23969,6 @@
 HSPLandroid/view/ViewRootImpl;->isContentCaptureEnabled()Z
 HSPLandroid/view/ViewRootImpl;->isContentCaptureReallyEnabled()Z
 HSPLandroid/view/ViewRootImpl;->isInLayout()Z
-HSPLandroid/view/ViewRootImpl;->isInLocalFocusMode()Z
 HSPLandroid/view/ViewRootImpl;->isInTouchMode()Z
 HSPLandroid/view/ViewRootImpl;->isLayoutRequested()Z
 HSPLandroid/view/ViewRootImpl;->isNavigationKey(Landroid/view/KeyEvent;)Z
@@ -26853,13 +23991,13 @@
 HSPLandroid/view/ViewRootImpl;->notifySubtreeAccessibilityStateChanged(Landroid/view/View;Landroid/view/View;I)V
 HSPLandroid/view/ViewRootImpl;->notifySurfaceCreated()V
 HSPLandroid/view/ViewRootImpl;->notifySurfaceDestroyed()V
+HSPLandroid/view/ViewRootImpl;->notifySurfaceReplaced()V
 HSPLandroid/view/ViewRootImpl;->obtainQueuedInputEvent(Landroid/view/InputEvent;Landroid/view/InputEventReceiver;I)Landroid/view/ViewRootImpl$QueuedInputEvent;
 HSPLandroid/view/ViewRootImpl;->onDescendantInvalidated(Landroid/view/View;Landroid/view/View;)V
 HSPLandroid/view/ViewRootImpl;->onDescendantUnbufferedRequested()V
 HSPLandroid/view/ViewRootImpl;->onPostDraw(Landroid/graphics/RecordingCanvas;)V
 HSPLandroid/view/ViewRootImpl;->onPreDraw(Landroid/graphics/RecordingCanvas;)V
 HSPLandroid/view/ViewRootImpl;->onStartNestedScroll(Landroid/view/View;Landroid/view/View;I)Z
-HSPLandroid/view/ViewRootImpl;->onWindowTitleChanged()V
 HSPLandroid/view/ViewRootImpl;->pendingDrawFinished()V
 HSPLandroid/view/ViewRootImpl;->performConfigurationChange(Landroid/util/MergedConfiguration;ZI)V
 HSPLandroid/view/ViewRootImpl;->performContentCaptureInitialReport()V
@@ -26906,10 +24044,12 @@
 HSPLandroid/view/ViewRootImpl;->setView(Landroid/view/View;Landroid/view/WindowManager$LayoutParams;Landroid/view/View;)V
 HSPLandroid/view/ViewRootImpl;->setWindowStopped(Z)V
 HSPLandroid/view/ViewRootImpl;->shouldUseDisplaySize(Landroid/view/WindowManager$LayoutParams;)Z
+HSPLandroid/view/ViewRootImpl;->showInsets(IZ)V
 HSPLandroid/view/ViewRootImpl;->systemGestureExclusionChanged()V
 HSPLandroid/view/ViewRootImpl;->unscheduleConsumeBatchedInput()V
 HSPLandroid/view/ViewRootImpl;->unscheduleTraversals()V
 HSPLandroid/view/ViewRootImpl;->updateBoundsLayer()V
+HSPLandroid/view/ViewRootImpl;->updateCaptionInsets()Z
 HSPLandroid/view/ViewRootImpl;->updateCompatSysUiVisibility(IZZ)V
 HSPLandroid/view/ViewRootImpl;->updateConfiguration(I)V
 HSPLandroid/view/ViewRootImpl;->updateContentDrawBounds()Z
@@ -26917,6 +24057,7 @@
 HSPLandroid/view/ViewRootImpl;->updateInternalDisplay(ILandroid/content/res/Resources;)V
 HSPLandroid/view/ViewRootImpl;->updateSystemGestureExclusionRectsForView(Landroid/view/View;)V
 HSPLandroid/view/ViewRootImpl;->updateVisibleInsets()V
+HSPLandroid/view/ViewRootImpl;->useBLAST()Z
 HSPLandroid/view/ViewRootImpl;->windowFocusChanged(ZZ)V
 HSPLandroid/view/ViewStructure;-><init>()V
 HSPLandroid/view/ViewStructure;->setImportantForAutofill(I)V
@@ -26955,7 +24096,6 @@
 HSPLandroid/view/ViewTreeObserver;-><init>(Landroid/content/Context;)V
 HSPLandroid/view/ViewTreeObserver;->addOnComputeInternalInsetsListener(Landroid/view/ViewTreeObserver$OnComputeInternalInsetsListener;)V
 HSPLandroid/view/ViewTreeObserver;->addOnDrawListener(Landroid/view/ViewTreeObserver$OnDrawListener;)V
-HSPLandroid/view/ViewTreeObserver;->addOnGlobalFocusChangeListener(Landroid/view/ViewTreeObserver$OnGlobalFocusChangeListener;)V
 HSPLandroid/view/ViewTreeObserver;->addOnGlobalLayoutListener(Landroid/view/ViewTreeObserver$OnGlobalLayoutListener;)V
 HSPLandroid/view/ViewTreeObserver;->addOnPreDrawListener(Landroid/view/ViewTreeObserver$OnPreDrawListener;)V
 HSPLandroid/view/ViewTreeObserver;->addOnScrollChangedListener(Landroid/view/ViewTreeObserver$OnScrollChangedListener;)V
@@ -26987,7 +24127,6 @@
 HSPLandroid/view/ViewTreeObserver;->removeOnTouchModeChangeListener(Landroid/view/ViewTreeObserver$OnTouchModeChangeListener;)V
 HSPLandroid/view/Window;-><init>(Landroid/content/Context;)V
 HSPLandroid/view/Window;->addFlags(I)V
-HSPLandroid/view/Window;->addOnFrameMetricsAvailableListener(Landroid/view/Window$OnFrameMetricsAvailableListener;Landroid/os/Handler;)V
 HSPLandroid/view/Window;->adjustLayoutParamsForSubWindow(Landroid/view/WindowManager$LayoutParams;)V
 HSPLandroid/view/Window;->clearFlags(I)V
 HSPLandroid/view/Window;->destroy()V
@@ -26995,7 +24134,6 @@
 HSPLandroid/view/Window;->findViewById(I)Landroid/view/View;
 HSPLandroid/view/Window;->getAttributes()Landroid/view/WindowManager$LayoutParams;
 HSPLandroid/view/Window;->getCallback()Landroid/view/Window$Callback;
-HSPLandroid/view/Window;->getColorMode()I
 HSPLandroid/view/Window;->getContainer()Landroid/view/Window;
 HSPLandroid/view/Window;->getContext()Landroid/content/Context;
 HSPLandroid/view/Window;->getDefaultFeatures(Landroid/content/Context;)I
@@ -27011,9 +24149,8 @@
 HSPLandroid/view/Window;->isActive()Z
 HSPLandroid/view/Window;->isDestroyed()Z
 HSPLandroid/view/Window;->isOutOfBounds(Landroid/content/Context;Landroid/view/MotionEvent;)Z
-HSPLandroid/view/Window;->isWideColorGamut()Z
+HSPLandroid/view/Window;->isOverlayWithDecorCaptionEnabled()Z
 HSPLandroid/view/Window;->makeActive()V
-HSPLandroid/view/Window;->removeOnFrameMetricsAvailableListener(Landroid/view/Window$OnFrameMetricsAvailableListener;)V
 HSPLandroid/view/Window;->requestFeature(I)Z
 HSPLandroid/view/Window;->setAttributes(Landroid/view/WindowManager$LayoutParams;)V
 HSPLandroid/view/Window;->setCallback(Landroid/view/Window$Callback;)V
@@ -27044,8 +24181,10 @@
 HSPLandroid/view/WindowInsets$Builder;->setStableInsets(Landroid/graphics/Insets;)Landroid/view/WindowInsets$Builder;
 HSPLandroid/view/WindowInsets$Builder;->setSystemWindowInsets(Landroid/graphics/Insets;)Landroid/view/WindowInsets$Builder;
 HSPLandroid/view/WindowInsets$Side;->all()I
+HSPLandroid/view/WindowInsets$Type;->displayCutout()I
 HSPLandroid/view/WindowInsets$Type;->ime()I
 HSPLandroid/view/WindowInsets$Type;->indexOf(I)I
+HSPLandroid/view/WindowInsets$Type;->isVisibleInsetsType(II)Z
 HSPLandroid/view/WindowInsets$Type;->navigationBars()I
 HSPLandroid/view/WindowInsets$Type;->statusBars()I
 HSPLandroid/view/WindowInsets$Type;->systemBars()I
@@ -27063,7 +24202,6 @@
 HSPLandroid/view/WindowInsets;->access$700(Landroid/view/WindowInsets;)Z
 HSPLandroid/view/WindowInsets;->assignCompatInsets([Landroid/graphics/Insets;Landroid/graphics/Rect;)V
 HSPLandroid/view/WindowInsets;->consumeDisplayCutout()Landroid/view/WindowInsets;
-HSPLandroid/view/WindowInsets;->consumeStableInsets()Landroid/view/WindowInsets;
 HSPLandroid/view/WindowInsets;->consumeSystemWindowInsets()Landroid/view/WindowInsets;
 HSPLandroid/view/WindowInsets;->createCompatTypeMap(Landroid/graphics/Rect;)[Landroid/graphics/Insets;
 HSPLandroid/view/WindowInsets;->createCompatVisibilityMap([Landroid/graphics/Insets;)[Z
@@ -27079,7 +24217,6 @@
 HSPLandroid/view/WindowInsets;->getStableInsetRight()I
 HSPLandroid/view/WindowInsets;->getStableInsetTop()I
 HSPLandroid/view/WindowInsets;->getStableInsets()Landroid/graphics/Insets;
-HSPLandroid/view/WindowInsets;->getSystemGestureInsets()Landroid/graphics/Insets;
 HSPLandroid/view/WindowInsets;->getSystemWindowInsetBottom()I
 HSPLandroid/view/WindowInsets;->getSystemWindowInsetLeft()I
 HSPLandroid/view/WindowInsets;->getSystemWindowInsetRight()I
@@ -27159,11 +24296,13 @@
 HSPLandroid/view/WindowManagerImpl;->addView(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V
 HSPLandroid/view/WindowManagerImpl;->applyDefaultToken(Landroid/view/ViewGroup$LayoutParams;)V
 HSPLandroid/view/WindowManagerImpl;->computeWindowInsets()Landroid/view/WindowInsets;
+HSPLandroid/view/WindowManagerImpl;->computeWindowInsets(Landroid/graphics/Rect;)Landroid/view/WindowInsets;
 HSPLandroid/view/WindowManagerImpl;->createLocalWindowManager(Landroid/view/Window;)Landroid/view/WindowManagerImpl;
 HSPLandroid/view/WindowManagerImpl;->getDefaultDisplay()Landroid/view/Display;
 HSPLandroid/view/WindowManagerImpl;->getMaximumBounds()Landroid/graphics/Rect;
 HSPLandroid/view/WindowManagerImpl;->getMaximumWindowMetrics()Landroid/view/WindowMetrics;
 HSPLandroid/view/WindowManagerImpl;->getWindowInsetsFromServer(Landroid/view/WindowManager$LayoutParams;)Landroid/view/WindowInsets;
+HSPLandroid/view/WindowManagerImpl;->getWindowInsetsFromServer(Landroid/view/WindowManager$LayoutParams;Landroid/graphics/Rect;)Landroid/view/WindowInsets;
 HSPLandroid/view/WindowManagerImpl;->removeView(Landroid/view/View;)V
 HSPLandroid/view/WindowManagerImpl;->removeViewImmediate(Landroid/view/View;)V
 HSPLandroid/view/WindowManagerImpl;->toSize(Landroid/graphics/Rect;)Landroid/util/Size;
@@ -27199,7 +24338,6 @@
 HSPLandroid/view/accessibility/AccessibilityManager;->access$200(Landroid/view/accessibility/AccessibilityManager;)Landroid/util/ArrayMap;
 HSPLandroid/view/accessibility/AccessibilityManager;->access$400(Landroid/view/accessibility/AccessibilityManager;I)V
 HSPLandroid/view/accessibility/AccessibilityManager;->addAccessibilityInteractionConnection(Landroid/view/IWindow;Landroid/os/IBinder;Ljava/lang/String;Landroid/view/accessibility/IAccessibilityInteractionConnection;)I
-HSPLandroid/view/accessibility/AccessibilityManager;->addAccessibilityInteractionConnection(Landroid/view/IWindow;Ljava/lang/String;Landroid/view/accessibility/IAccessibilityInteractionConnection;)I
 HSPLandroid/view/accessibility/AccessibilityManager;->addAccessibilityServicesStateChangeListener(Landroid/view/accessibility/AccessibilityManager$AccessibilityServicesStateChangeListener;Landroid/os/Handler;)V
 HSPLandroid/view/accessibility/AccessibilityManager;->addAccessibilityStateChangeListener(Landroid/view/accessibility/AccessibilityManager$AccessibilityStateChangeListener;)Z
 HSPLandroid/view/accessibility/AccessibilityManager;->addAccessibilityStateChangeListener(Landroid/view/accessibility/AccessibilityManager$AccessibilityStateChangeListener;Landroid/os/Handler;)V
@@ -27217,8 +24355,9 @@
 HSPLandroid/view/accessibility/AccessibilityManager;->isEnabled()Z
 HSPLandroid/view/accessibility/AccessibilityManager;->isHighTextContrastEnabled()Z
 HSPLandroid/view/accessibility/AccessibilityManager;->isTouchExplorationEnabled()Z
-PLandroid/view/accessibility/AccessibilityManager;->notifyAccessibilityButtonVisibilityChanged(Z)V
+HPLandroid/view/accessibility/AccessibilityManager;->notifyAccessibilityButtonVisibilityChanged(Z)V
 HSPLandroid/view/accessibility/AccessibilityManager;->notifyAccessibilityStateChanged()V
+HSPLandroid/view/accessibility/AccessibilityManager;->registerSystemAction(Landroid/app/RemoteAction;I)V
 HSPLandroid/view/accessibility/AccessibilityManager;->removeAccessibilityInteractionConnection(Landroid/view/IWindow;)V
 HSPLandroid/view/accessibility/AccessibilityManager;->removeAccessibilityStateChangeListener(Landroid/view/accessibility/AccessibilityManager$AccessibilityStateChangeListener;)Z
 HSPLandroid/view/accessibility/AccessibilityManager;->removeHighTextContrastStateChangeListener(Landroid/view/accessibility/AccessibilityManager$HighTextContrastChangeListener;)V
@@ -27239,7 +24378,6 @@
 HSPLandroid/view/accessibility/AccessibilityNodeInfo;->addAction(I)V
 HSPLandroid/view/accessibility/AccessibilityNodeInfo;->addAction(Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction;)V
 HSPLandroid/view/accessibility/AccessibilityNodeInfo;->addChildInternal(Landroid/view/View;IZ)V
-HSPLandroid/view/accessibility/AccessibilityNodeInfo;->addChildUnchecked(Landroid/view/View;)V
 HSPLandroid/view/accessibility/AccessibilityNodeInfo;->enforceNotSealed()V
 HSPLandroid/view/accessibility/AccessibilityNodeInfo;->getAccessibilityViewId(J)I
 HSPLandroid/view/accessibility/AccessibilityNodeInfo;->getBoundsInScreen(Landroid/graphics/Rect;)V
@@ -27256,7 +24394,6 @@
 HSPLandroid/view/accessibility/AccessibilityNodeInfo;->obtain(Landroid/view/View;)Landroid/view/accessibility/AccessibilityNodeInfo;
 HSPLandroid/view/accessibility/AccessibilityNodeInfo;->recycle()V
 HSPLandroid/view/accessibility/AccessibilityNodeInfo;->setAccessibilityFocused(Z)V
-HSPLandroid/view/accessibility/AccessibilityNodeInfo;->setAvailableExtraData(Ljava/util/List;)V
 HSPLandroid/view/accessibility/AccessibilityNodeInfo;->setBooleanProperty(IZ)V
 HSPLandroid/view/accessibility/AccessibilityNodeInfo;->setBoundsInParent(Landroid/graphics/Rect;)V
 HSPLandroid/view/accessibility/AccessibilityNodeInfo;->setBoundsInScreen(Landroid/graphics/Rect;)V
@@ -27269,25 +24406,18 @@
 HSPLandroid/view/accessibility/AccessibilityNodeInfo;->setFocusable(Z)V
 HSPLandroid/view/accessibility/AccessibilityNodeInfo;->setFocused(Z)V
 HSPLandroid/view/accessibility/AccessibilityNodeInfo;->setHeading(Z)V
-HSPLandroid/view/accessibility/AccessibilityNodeInfo;->setHintText(Ljava/lang/CharSequence;)V
 HSPLandroid/view/accessibility/AccessibilityNodeInfo;->setImportantForAccessibility(Z)V
 HSPLandroid/view/accessibility/AccessibilityNodeInfo;->setLiveRegion(I)V
 HSPLandroid/view/accessibility/AccessibilityNodeInfo;->setLongClickable(Z)V
-HSPLandroid/view/accessibility/AccessibilityNodeInfo;->setMovementGranularities(I)V
-HSPLandroid/view/accessibility/AccessibilityNodeInfo;->setMultiLine(Z)V
 HSPLandroid/view/accessibility/AccessibilityNodeInfo;->setPackageName(Ljava/lang/CharSequence;)V
 HSPLandroid/view/accessibility/AccessibilityNodeInfo;->setPaneTitle(Ljava/lang/CharSequence;)V
 HSPLandroid/view/accessibility/AccessibilityNodeInfo;->setParent(Landroid/view/View;)V
 HSPLandroid/view/accessibility/AccessibilityNodeInfo;->setParent(Landroid/view/View;I)V
-HSPLandroid/view/accessibility/AccessibilityNodeInfo;->setPassword(Z)V
 HSPLandroid/view/accessibility/AccessibilityNodeInfo;->setScreenReaderFocusable(Z)V
 HSPLandroid/view/accessibility/AccessibilityNodeInfo;->setSelected(Z)V
 HSPLandroid/view/accessibility/AccessibilityNodeInfo;->setSource(Landroid/view/View;)V
 HSPLandroid/view/accessibility/AccessibilityNodeInfo;->setSource(Landroid/view/View;I)V
 HSPLandroid/view/accessibility/AccessibilityNodeInfo;->setStateDescription(Ljava/lang/CharSequence;)V
-HSPLandroid/view/accessibility/AccessibilityNodeInfo;->setText(Ljava/lang/CharSequence;)V
-HSPLandroid/view/accessibility/AccessibilityNodeInfo;->setTextSelection(II)V
-HSPLandroid/view/accessibility/AccessibilityNodeInfo;->setViewIdResourceName(Ljava/lang/String;)V
 HSPLandroid/view/accessibility/AccessibilityNodeInfo;->setVisibleToUser(Z)V
 HSPLandroid/view/accessibility/AccessibilityNodeProvider;-><init>()V
 HSPLandroid/view/accessibility/AccessibilityRecord;-><init>()V
@@ -27319,35 +24449,26 @@
 HSPLandroid/view/accessibility/AccessibilityRecord;->setToIndex(I)V
 HSPLandroid/view/accessibility/CaptioningManager$1;-><init>(Landroid/view/accessibility/CaptioningManager;)V
 HSPLandroid/view/accessibility/CaptioningManager$CaptionStyle;->getTypeface()Landroid/graphics/Typeface;
-HSPLandroid/view/accessibility/CaptioningManager$CaptionStyle;->hasBackgroundColor()Z
-HSPLandroid/view/accessibility/CaptioningManager$CaptionStyle;->hasEdgeColor()Z
-HSPLandroid/view/accessibility/CaptioningManager$CaptionStyle;->hasEdgeType()Z
-HSPLandroid/view/accessibility/CaptioningManager$CaptionStyle;->hasForegroundColor()Z
-HSPLandroid/view/accessibility/CaptioningManager$CaptionStyle;->hasWindowColor()Z
 HSPLandroid/view/accessibility/CaptioningManager$CaptioningChangeListener;-><init>()V
 HSPLandroid/view/accessibility/CaptioningManager$MyContentObserver;-><init>(Landroid/view/accessibility/CaptioningManager;Landroid/os/Handler;)V
 HSPLandroid/view/accessibility/CaptioningManager;-><init>(Landroid/content/Context;)V
-HSPLandroid/view/accessibility/CaptioningManager;->addCaptioningChangeListener(Landroid/view/accessibility/CaptioningManager$CaptioningChangeListener;)V
 HSPLandroid/view/accessibility/CaptioningManager;->getFontScale()F
 HSPLandroid/view/accessibility/CaptioningManager;->getLocale()Ljava/util/Locale;
 HSPLandroid/view/accessibility/CaptioningManager;->getRawLocale()Ljava/lang/String;
 HSPLandroid/view/accessibility/CaptioningManager;->getRawUserStyle()I
 HSPLandroid/view/accessibility/CaptioningManager;->getUserStyle()Landroid/view/accessibility/CaptioningManager$CaptionStyle;
 HSPLandroid/view/accessibility/CaptioningManager;->isEnabled()Z
-HSPLandroid/view/accessibility/CaptioningManager;->registerObserver(Ljava/lang/String;)V
 HSPLandroid/view/accessibility/CaptioningManager;->removeCaptioningChangeListener(Landroid/view/accessibility/CaptioningManager$CaptioningChangeListener;)V
 HSPLandroid/view/accessibility/IAccessibilityInteractionConnection$Stub;-><init>()V
 HSPLandroid/view/accessibility/IAccessibilityInteractionConnection$Stub;->asBinder()Landroid/os/IBinder;
 HSPLandroid/view/accessibility/IAccessibilityInteractionConnection$Stub;->asInterface(Landroid/os/IBinder;)Landroid/view/accessibility/IAccessibilityInteractionConnection;
-HSPLandroid/view/accessibility/IAccessibilityInteractionConnectionCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/view/accessibility/IAccessibilityInteractionConnectionCallback$Stub;->asInterface(Landroid/os/IBinder;)Landroid/view/accessibility/IAccessibilityInteractionConnectionCallback;
 HSPLandroid/view/accessibility/IAccessibilityManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HSPLandroid/view/accessibility/IAccessibilityManager$Stub$Proxy;->addAccessibilityInteractionConnection(Landroid/view/IWindow;Landroid/os/IBinder;Landroid/view/accessibility/IAccessibilityInteractionConnection;Ljava/lang/String;I)I
-HSPLandroid/view/accessibility/IAccessibilityManager$Stub$Proxy;->addAccessibilityInteractionConnection(Landroid/view/IWindow;Landroid/view/accessibility/IAccessibilityInteractionConnection;Ljava/lang/String;I)I
 HSPLandroid/view/accessibility/IAccessibilityManager$Stub$Proxy;->addClient(Landroid/view/accessibility/IAccessibilityManagerClient;I)J
 HSPLandroid/view/accessibility/IAccessibilityManager$Stub$Proxy;->getAccessibilityShortcutTargets(I)Ljava/util/List;
 HSPLandroid/view/accessibility/IAccessibilityManager$Stub$Proxy;->getEnabledAccessibilityServiceList(II)Ljava/util/List;
 HSPLandroid/view/accessibility/IAccessibilityManager$Stub$Proxy;->getRecommendedTimeoutMillis()J
+HSPLandroid/view/accessibility/IAccessibilityManager$Stub$Proxy;->registerSystemAction(Landroid/app/RemoteAction;I)V
 HSPLandroid/view/accessibility/IAccessibilityManager$Stub$Proxy;->removeAccessibilityInteractionConnection(Landroid/view/IWindow;)V
 HSPLandroid/view/accessibility/IAccessibilityManager$Stub$Proxy;->sendAccessibilityEvent(Landroid/view/accessibility/AccessibilityEvent;I)V
 HSPLandroid/view/accessibility/IAccessibilityManager$Stub$Proxy;->setPictureInPictureActionReplacingConnection(Landroid/view/accessibility/IAccessibilityInteractionConnection;)V
@@ -27526,14 +24647,8 @@
 HSPLandroid/view/animation/TranslateAnimation;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
 HSPLandroid/view/animation/TranslateAnimation;->applyTransformation(FLandroid/view/animation/Transformation;)V
 HSPLandroid/view/animation/TranslateAnimation;->initialize(IIII)V
-HSPLandroid/view/autofill/-$$Lambda$AutofillManager$AutofillManagerClient$qH36EJk2Hkdja9ZZmTxqYPyr0YA;-><init>(Landroid/view/autofill/AutofillManager;I)V
-HSPLandroid/view/autofill/-$$Lambda$AutofillManager$AutofillManagerClient$qH36EJk2Hkdja9ZZmTxqYPyr0YA;->run()V
-HSPLandroid/view/autofill/-$$Lambda$AutofillManager$AutofillManagerClient$vxNm6RuuD-r5pkiSxNSBBd1w_Qc;-><init>(Landroid/view/autofill/AutofillManager;Lcom/android/internal/os/IResultReceiver;)V
-HSPLandroid/view/autofill/-$$Lambda$AutofillManager$AutofillManagerClient$vxNm6RuuD-r5pkiSxNSBBd1w_Qc;->run()V
 HSPLandroid/view/autofill/-$$Lambda$AutofillManager$V76JiQu509LCUz3-ckpb-nB3JhA;-><init>(Landroid/view/autofill/IAutoFillManager;Landroid/view/autofill/IAutoFillManagerClient;I)V
 HSPLandroid/view/autofill/-$$Lambda$AutofillManager$V76JiQu509LCUz3-ckpb-nB3JhA;->run()V
-HSPLandroid/view/autofill/-$$Lambda$AutofillManager$YfpJNFodEuj5lbXfPlc77fsEvC8;-><init>(Landroid/view/autofill/AutofillManager;)V
-HSPLandroid/view/autofill/-$$Lambda$AutofillManager$YfpJNFodEuj5lbXfPlc77fsEvC8;->run()V
 HSPLandroid/view/autofill/AutofillId$1;->createFromParcel(Landroid/os/Parcel;)Landroid/view/autofill/AutofillId;
 HSPLandroid/view/autofill/AutofillId$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/view/autofill/AutofillId;-><init>(I)V
@@ -27545,62 +24660,28 @@
 HSPLandroid/view/autofill/AutofillId;->hashCode()I
 HSPLandroid/view/autofill/AutofillId;->isVirtualInt()Z
 HSPLandroid/view/autofill/AutofillId;->isVirtualLong()Z
-HSPLandroid/view/autofill/AutofillId;->resetSessionId()V
 HSPLandroid/view/autofill/AutofillId;->setSessionId(I)V
 HSPLandroid/view/autofill/AutofillId;->toString()Ljava/lang/String;
 HSPLandroid/view/autofill/AutofillId;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/view/autofill/AutofillManager$AugmentedAutofillManagerClient;-><init>(Landroid/view/autofill/AutofillManager;)V
-HSPLandroid/view/autofill/AutofillManager$AugmentedAutofillManagerClient;-><init>(Landroid/view/autofill/AutofillManager;Landroid/view/autofill/AutofillManager$1;)V
-HSPLandroid/view/autofill/AutofillManager$AugmentedAutofillManagerClient;->getViewCoordinates(Landroid/view/autofill/AutofillId;)Landroid/graphics/Rect;
-HSPLandroid/view/autofill/AutofillManager$AutofillCallback;-><init>()V
 HSPLandroid/view/autofill/AutofillManager$AutofillManagerClient;-><init>(Landroid/view/autofill/AutofillManager;)V
 HSPLandroid/view/autofill/AutofillManager$AutofillManagerClient;-><init>(Landroid/view/autofill/AutofillManager;Landroid/view/autofill/AutofillManager$1;)V
-HSPLandroid/view/autofill/AutofillManager$AutofillManagerClient;->getAugmentedAutofillClient(Lcom/android/internal/os/IResultReceiver;)V
-HSPLandroid/view/autofill/AutofillManager$AutofillManagerClient;->lambda$getAugmentedAutofillClient$12(Landroid/view/autofill/AutofillManager;Lcom/android/internal/os/IResultReceiver;)V
-HSPLandroid/view/autofill/AutofillManager$AutofillManagerClient;->lambda$setState$0(Landroid/view/autofill/AutofillManager;I)V
-HSPLandroid/view/autofill/AutofillManager$AutofillManagerClient;->setState(I)V
 HSPLandroid/view/autofill/AutofillManager;-><init>(Landroid/content/Context;Landroid/view/autofill/IAutoFillManager;)V
-HSPLandroid/view/autofill/AutofillManager;->access$1300(Landroid/view/autofill/AutofillManager;Ljava/lang/Runnable;)V
-HSPLandroid/view/autofill/AutofillManager;->access$1400(Landroid/view/autofill/AutofillManager;Lcom/android/internal/os/IResultReceiver;)V
-HSPLandroid/view/autofill/AutofillManager;->access$2500(Landroid/view/autofill/AutofillManager;I)V
-HSPLandroid/view/autofill/AutofillManager;->access$900(Landroid/view/autofill/AutofillManager;)Landroid/view/autofill/AutofillManager$AutofillClient;
-HSPLandroid/view/autofill/AutofillManager;->addEnteredIdLocked(Landroid/view/autofill/AutofillId;)V
-HSPLandroid/view/autofill/AutofillManager;->cancelLocked()V
-HSPLandroid/view/autofill/AutofillManager;->cancelSessionLocked()V
 HSPLandroid/view/autofill/AutofillManager;->ensureServiceClientAddedIfNeededLocked()V
-HSPLandroid/view/autofill/AutofillManager;->getAugmentedAutofillClient(Lcom/android/internal/os/IResultReceiver;)V
 HSPLandroid/view/autofill/AutofillManager;->getClient()Landroid/view/autofill/AutofillManager$AutofillClient;
 HSPLandroid/view/autofill/AutofillManager;->hasAutofillFeature()Z
 HSPLandroid/view/autofill/AutofillManager;->isActiveLocked()Z
-HSPLandroid/view/autofill/AutofillManager;->isAutofillSupported()Z
 HSPLandroid/view/autofill/AutofillManager;->isAutofillUiShowing()Z
-HSPLandroid/view/autofill/AutofillManager;->isClientDisablingEnterExitEvent()Z
-HSPLandroid/view/autofill/AutofillManager;->isCompatibilityModeEnabledLocked()Z
 HSPLandroid/view/autofill/AutofillManager;->isDisabledByServiceLocked()Z
 HSPLandroid/view/autofill/AutofillManager;->isEnabled()Z
-HSPLandroid/view/autofill/AutofillManager;->isFinishedLocked()Z
 HSPLandroid/view/autofill/AutofillManager;->lambda$ensureServiceClientAddedIfNeededLocked$1(Landroid/view/autofill/IAutoFillManager;Landroid/view/autofill/IAutoFillManagerClient;I)V
-HSPLandroid/view/autofill/AutofillManager;->lambda$onVisibleForAutofill$0$AutofillManager()V
 HSPLandroid/view/autofill/AutofillManager;->notifyValueChanged(Landroid/view/View;)V
-HSPLandroid/view/autofill/AutofillManager;->notifyViewEntered(Landroid/view/View;)V
-HSPLandroid/view/autofill/AutofillManager;->notifyViewEntered(Landroid/view/View;I)V
 HSPLandroid/view/autofill/AutofillManager;->notifyViewEnteredForAugmentedAutofill(Landroid/view/View;)V
-HSPLandroid/view/autofill/AutofillManager;->notifyViewEnteredLocked(Landroid/view/View;I)Landroid/view/autofill/AutofillManager$AutofillCallback;
 HSPLandroid/view/autofill/AutofillManager;->notifyViewExited(Landroid/view/View;)V
 HSPLandroid/view/autofill/AutofillManager;->notifyViewExitedLocked(Landroid/view/View;)V
 HSPLandroid/view/autofill/AutofillManager;->notifyViewVisibilityChanged(Landroid/view/View;Z)V
 HSPLandroid/view/autofill/AutofillManager;->notifyViewVisibilityChangedInternal(Landroid/view/View;IZZ)V
-HSPLandroid/view/autofill/AutofillManager;->onActivityFinishing()V
-HSPLandroid/view/autofill/AutofillManager;->onCreate(Landroid/os/Bundle;)V
-HSPLandroid/view/autofill/AutofillManager;->onInvisibleForAutofill(Z)V
-HSPLandroid/view/autofill/AutofillManager;->onSaveInstanceState(Landroid/os/Bundle;)V
-HSPLandroid/view/autofill/AutofillManager;->onVisibleForAutofill()V
-HSPLandroid/view/autofill/AutofillManager;->post(Ljava/lang/Runnable;)V
-HSPLandroid/view/autofill/AutofillManager;->registerCallback(Landroid/view/autofill/AutofillManager$AutofillCallback;)V
 HSPLandroid/view/autofill/AutofillManager;->requestHideFillUi()V
 HSPLandroid/view/autofill/AutofillManager;->requestHideFillUi(Landroid/view/autofill/AutofillId;Z)V
-HSPLandroid/view/autofill/AutofillManager;->resetSessionLocked(Z)V
-HSPLandroid/view/autofill/AutofillManager;->setState(I)V
 HSPLandroid/view/autofill/AutofillManager;->shouldIgnoreViewEnteredLocked(Landroid/view/autofill/AutofillId;I)Z
 HSPLandroid/view/autofill/AutofillManager;->startAutofillIfNeededLocked(Landroid/view/View;)Z
 HSPLandroid/view/autofill/AutofillManager;->startSessionLocked(Landroid/view/autofill/AutofillId;Landroid/graphics/Rect;Landroid/view/autofill/AutofillValue;I)V
@@ -27616,16 +24697,9 @@
 HSPLandroid/view/autofill/AutofillValue;->getTextValue()Ljava/lang/CharSequence;
 HSPLandroid/view/autofill/AutofillValue;->isText()Z
 HSPLandroid/view/autofill/AutofillValue;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/view/autofill/IAugmentedAutofillManagerClient$Stub;-><init>()V
-HSPLandroid/view/autofill/IAugmentedAutofillManagerClient$Stub;->asBinder()Landroid/os/IBinder;
-HSPLandroid/view/autofill/IAugmentedAutofillManagerClient$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/view/autofill/IAutoFillManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HSPLandroid/view/autofill/IAutoFillManager$Stub$Proxy;->addClient(Landroid/view/autofill/IAutoFillManagerClient;Landroid/content/ComponentName;ILcom/android/internal/os/IResultReceiver;)V
-HSPLandroid/view/autofill/IAutoFillManager$Stub$Proxy;->cancelSession(II)V
-HSPLandroid/view/autofill/IAutoFillManager$Stub$Proxy;->isServiceSupported(ILcom/android/internal/os/IResultReceiver;)V
 HSPLandroid/view/autofill/IAutoFillManager$Stub$Proxy;->removeClient(Landroid/view/autofill/IAutoFillManagerClient;I)V
-HSPLandroid/view/autofill/IAutoFillManager$Stub$Proxy;->restoreSession(ILandroid/os/IBinder;Landroid/os/IBinder;Lcom/android/internal/os/IResultReceiver;)V
-HSPLandroid/view/autofill/IAutoFillManager$Stub$Proxy;->setHasCallback(IIZ)V
 HSPLandroid/view/autofill/IAutoFillManager$Stub$Proxy;->startSession(Landroid/os/IBinder;Landroid/os/IBinder;Landroid/view/autofill/AutofillId;Landroid/graphics/Rect;Landroid/view/autofill/AutofillValue;IZILandroid/content/ComponentName;ZLcom/android/internal/os/IResultReceiver;)V
 HSPLandroid/view/autofill/IAutoFillManager$Stub$Proxy;->updateSession(ILandroid/view/autofill/AutofillId;Landroid/graphics/Rect;Landroid/view/autofill/AutofillValue;III)V
 HSPLandroid/view/autofill/IAutoFillManager$Stub;-><init>()V
@@ -27633,6 +24707,7 @@
 HPLandroid/view/autofill/IAutoFillManager$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HPLandroid/view/autofill/IAutoFillManagerClient$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HPLandroid/view/autofill/IAutoFillManagerClient$Stub$Proxy;->asBinder()Landroid/os/IBinder;
+HPLandroid/view/autofill/IAutoFillManagerClient$Stub$Proxy;->getAugmentedAutofillClient(Lcom/android/internal/os/IResultReceiver;)V
 HSPLandroid/view/autofill/IAutoFillManagerClient$Stub;-><init>()V
 HSPLandroid/view/autofill/IAutoFillManagerClient$Stub;->asBinder()Landroid/os/IBinder;
 HPLandroid/view/autofill/IAutoFillManagerClient$Stub;->asInterface(Landroid/os/IBinder;)Landroid/view/autofill/IAutoFillManagerClient;
@@ -27672,11 +24747,9 @@
 HSPLandroid/view/contentcapture/ContentCaptureManager;->getMainContentCaptureSession()Landroid/view/contentcapture/MainContentCaptureSession;
 HSPLandroid/view/contentcapture/ContentCaptureManager;->isContentCaptureEnabled()Z
 HSPLandroid/view/contentcapture/ContentCaptureManager;->onActivityCreated(Landroid/os/IBinder;Landroid/content/ComponentName;)V
-HSPLandroid/view/contentcapture/ContentCaptureManager;->onActivityDestroyed()V
 HSPLandroid/view/contentcapture/ContentCaptureManager;->onActivityPaused()V
 HSPLandroid/view/contentcapture/ContentCaptureManager;->onActivityResumed()V
 HSPLandroid/view/contentcapture/ContentCaptureManager;->updateWindowAttributes(Landroid/view/WindowManager$LayoutParams;)V
-HSPLandroid/view/contentcapture/ContentCaptureSession;-><clinit>()V
 HSPLandroid/view/contentcapture/ContentCaptureSession;-><init>()V
 HSPLandroid/view/contentcapture/ContentCaptureSession;-><init>(I)V
 HSPLandroid/view/contentcapture/ContentCaptureSession;->destroy()V
@@ -27704,7 +24777,6 @@
 HSPLandroid/view/contentcapture/MainContentCaptureSession$1;-><init>(Landroid/view/contentcapture/MainContentCaptureSession;)V
 HSPLandroid/view/contentcapture/MainContentCaptureSession$1;->lambda$send$1$MainContentCaptureSession$1(ILandroid/os/IBinder;)V
 HSPLandroid/view/contentcapture/MainContentCaptureSession$1;->send(ILandroid/os/Bundle;)V
-HSPLandroid/view/contentcapture/MainContentCaptureSession;-><clinit>()V
 HSPLandroid/view/contentcapture/MainContentCaptureSession;-><init>(Landroid/content/Context;Landroid/view/contentcapture/ContentCaptureManager;Landroid/os/Handler;Landroid/view/contentcapture/IContentCaptureManager;)V
 HSPLandroid/view/contentcapture/MainContentCaptureSession;->access$200(Landroid/view/contentcapture/MainContentCaptureSession;)Landroid/os/Handler;
 HSPLandroid/view/contentcapture/MainContentCaptureSession;->access$300(Landroid/view/contentcapture/MainContentCaptureSession;ILandroid/os/IBinder;)V
@@ -27733,7 +24805,6 @@
 HSPLandroid/view/contentcapture/MainContentCaptureSession;->notifyViewTreeEvent(IZ)V
 HSPLandroid/view/contentcapture/MainContentCaptureSession;->onDestroy()V
 HSPLandroid/view/contentcapture/MainContentCaptureSession;->onSessionStarted(ILandroid/os/IBinder;)V
-HSPLandroid/view/contentcapture/MainContentCaptureSession;->resetSession(I)V
 HSPLandroid/view/contentcapture/MainContentCaptureSession;->scheduleFlush(IZ)V
 HSPLandroid/view/contentcapture/MainContentCaptureSession;->sendEvent(Landroid/view/contentcapture/ContentCaptureEvent;)V
 HSPLandroid/view/contentcapture/MainContentCaptureSession;->sendEvent(Landroid/view/contentcapture/ContentCaptureEvent;Z)V
@@ -27744,7 +24815,6 @@
 HSPLandroid/view/contentcapture/ViewNode$ViewNodeText;->writeToParcel(Landroid/os/Parcel;Z)V
 HSPLandroid/view/contentcapture/ViewNode$ViewStructureImpl;-><init>(Landroid/view/View;)V
 HSPLandroid/view/contentcapture/ViewNode$ViewStructureImpl;->getNodeText()Landroid/view/contentcapture/ViewNode$ViewNodeText;
-HSPLandroid/view/contentcapture/ViewNode$ViewStructureImpl;->setActivated(Z)V
 HSPLandroid/view/contentcapture/ViewNode$ViewStructureImpl;->setAutofillHints([Ljava/lang/String;)V
 HSPLandroid/view/contentcapture/ViewNode$ViewStructureImpl;->setAutofillType(I)V
 HSPLandroid/view/contentcapture/ViewNode$ViewStructureImpl;->setAutofillValue(Landroid/view/autofill/AutofillValue;)V
@@ -27757,7 +24827,6 @@
 HSPLandroid/view/contentcapture/ViewNode$ViewStructureImpl;->setFocusable(Z)V
 HSPLandroid/view/contentcapture/ViewNode$ViewStructureImpl;->setFocused(Z)V
 HSPLandroid/view/contentcapture/ViewNode$ViewStructureImpl;->setHint(Ljava/lang/CharSequence;)V
-HSPLandroid/view/contentcapture/ViewNode$ViewStructureImpl;->setHintIdEntry(Ljava/lang/String;)V
 HSPLandroid/view/contentcapture/ViewNode$ViewStructureImpl;->setId(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
 HSPLandroid/view/contentcapture/ViewNode$ViewStructureImpl;->setInputType(I)V
 HSPLandroid/view/contentcapture/ViewNode$ViewStructureImpl;->setLongClickable(Z)V
@@ -27782,7 +24851,6 @@
 HSPLandroid/view/contentcapture/ViewNode;->access$1402(Landroid/view/contentcapture/ViewNode;Ljava/lang/String;)Ljava/lang/String;
 HSPLandroid/view/contentcapture/ViewNode;->access$1502(Landroid/view/contentcapture/ViewNode;Ljava/lang/CharSequence;)Ljava/lang/CharSequence;
 HSPLandroid/view/contentcapture/ViewNode;->access$1602(Landroid/view/contentcapture/ViewNode;Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/view/contentcapture/ViewNode;->access$1702(Landroid/view/contentcapture/ViewNode;Ljava/lang/String;)Ljava/lang/String;
 HSPLandroid/view/contentcapture/ViewNode;->access$1902(Landroid/view/contentcapture/ViewNode;I)I
 HSPLandroid/view/contentcapture/ViewNode;->access$2002(Landroid/view/contentcapture/ViewNode;[Ljava/lang/String;)[Ljava/lang/String;
 HSPLandroid/view/contentcapture/ViewNode;->access$202(Landroid/view/contentcapture/ViewNode;I)I
@@ -27808,8 +24876,6 @@
 HSPLandroid/view/inputmethod/-$$Lambda$InputMethodManager$DelegateImpl$r2X8PLo_YIORJTYJGDfinf_IvK4;->run()V
 HSPLandroid/view/inputmethod/-$$Lambda$InputMethodManager$dfnCauFoZCf-HfXs1QavrkwWDf0;-><init>(Landroid/view/inputmethod/InputMethodManager;I)V
 HSPLandroid/view/inputmethod/-$$Lambda$InputMethodManager$dfnCauFoZCf-HfXs1QavrkwWDf0;->run()V
-HSPLandroid/view/inputmethod/-$$Lambda$InputMethodManager$i_90CXuqg7HqaqWjKFApAxiw7ac;-><init>(Landroid/view/inputmethod/InputMethodManager;ZLandroid/view/View;III)V
-HSPLandroid/view/inputmethod/-$$Lambda$InputMethodManager$i_90CXuqg7HqaqWjKFApAxiw7ac;->run()V
 HSPLandroid/view/inputmethod/BaseInputConnection;-><init>(Landroid/view/View;Z)V
 HSPLandroid/view/inputmethod/BaseInputConnection;-><init>(Landroid/view/inputmethod/InputMethodManager;Z)V
 HSPLandroid/view/inputmethod/BaseInputConnection;->beginBatchEdit()Z
@@ -27860,9 +24926,6 @@
 HSPLandroid/view/inputmethod/EditorInfo;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/view/inputmethod/ExtractedText;-><init>()V
 HSPLandroid/view/inputmethod/ExtractedTextRequest;-><init>()V
-HSPLandroid/view/inputmethod/InlineSuggestionsRequest$1;-><init>()V
-HSPLandroid/view/inputmethod/InlineSuggestionsRequest;-><clinit>()V
-HSPLandroid/view/inputmethod/InlineSuggestionsRequest;->onConstructed()V
 HSPLandroid/view/inputmethod/InputBinding;-><init>(Landroid/view/inputmethod/InputConnection;Landroid/os/IBinder;II)V
 HPLandroid/view/inputmethod/InputBinding;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/view/inputmethod/InputConnectionInspector;->getMissingMethodFlags(Landroid/view/inputmethod/InputConnection;)I
@@ -27890,7 +24953,6 @@
 HSPLandroid/view/inputmethod/InputMethodInfo;-><init>(Landroid/os/Parcel;)V
 HSPLandroid/view/inputmethod/InputMethodInfo;->computeId(Landroid/content/pm/ResolveInfo;)Ljava/lang/String;
 HSPLandroid/view/inputmethod/InputMethodInfo;->equals(Ljava/lang/Object;)Z
-HSPLandroid/view/inputmethod/InputMethodInfo;->getComponent()Landroid/content/ComponentName;
 HSPLandroid/view/inputmethod/InputMethodInfo;->getId()Ljava/lang/String;
 HSPLandroid/view/inputmethod/InputMethodInfo;->getPackageName()Ljava/lang/String;
 HSPLandroid/view/inputmethod/InputMethodInfo;->getServiceInfo()Landroid/content/pm/ServiceInfo;
@@ -27905,6 +24967,7 @@
 HSPLandroid/view/inputmethod/InputMethodManager$1;->onBindMethod(Lcom/android/internal/view/InputBindResult;)V
 HSPLandroid/view/inputmethod/InputMethodManager$1;->onUnbindMethod(II)V
 HSPLandroid/view/inputmethod/InputMethodManager$1;->reportFullscreenMode(Z)V
+HSPLandroid/view/inputmethod/InputMethodManager$1;->scheduleStartInputIfNecessary(Z)V
 HSPLandroid/view/inputmethod/InputMethodManager$1;->setActive(ZZ)V
 HSPLandroid/view/inputmethod/InputMethodManager$ControlledInputConnectionWrapper;-><init>(Landroid/os/Looper;Landroid/view/inputmethod/InputConnection;Landroid/view/inputmethod/InputMethodManager;)V
 HSPLandroid/view/inputmethod/InputMethodManager$ControlledInputConnectionWrapper;->deactivate()V
@@ -27955,12 +25018,10 @@
 HSPLandroid/view/inputmethod/InputMethodManager;->createRealInstance(ILandroid/os/Looper;)Landroid/view/inputmethod/InputMethodManager;
 HSPLandroid/view/inputmethod/InputMethodManager;->dispatchInputEvent(Landroid/view/InputEvent;Ljava/lang/Object;Landroid/view/inputmethod/InputMethodManager$FinishedInputEventCallback;Landroid/os/Handler;)I
 HSPLandroid/view/inputmethod/InputMethodManager;->dispatchKeyEventFromInputMethod(Landroid/view/View;Landroid/view/KeyEvent;)V
-HSPLandroid/view/inputmethod/InputMethodManager;->displayCompletions(Landroid/view/View;[Landroid/view/inputmethod/CompletionInfo;)V
 HSPLandroid/view/inputmethod/InputMethodManager;->ensureDefaultInstanceForDefaultDisplayIfNecessary()V
 HSPLandroid/view/inputmethod/InputMethodManager;->finishInputLocked()V
 HSPLandroid/view/inputmethod/InputMethodManager;->finishedInputEvent(IZZ)V
 HSPLandroid/view/inputmethod/InputMethodManager;->flushPendingEventsLocked()V
-HSPLandroid/view/inputmethod/InputMethodManager;->focusInLocked(Landroid/view/View;)V
 HSPLandroid/view/inputmethod/InputMethodManager;->forContext(Landroid/content/Context;)Landroid/view/inputmethod/InputMethodManager;
 HSPLandroid/view/inputmethod/InputMethodManager;->forContextInternal(ILandroid/os/Looper;)Landroid/view/inputmethod/InputMethodManager;
 HSPLandroid/view/inputmethod/InputMethodManager;->getDelegate()Landroid/view/inputmethod/InputMethodManager$DelegateImpl;
@@ -27979,17 +25040,13 @@
 HSPLandroid/view/inputmethod/InputMethodManager;->isCursorAnchorInfoEnabled()Z
 HSPLandroid/view/inputmethod/InputMethodManager;->isFullscreenMode()Z
 HSPLandroid/view/inputmethod/InputMethodManager;->isInEditMode()Z
-HSPLandroid/view/inputmethod/InputMethodManager;->lambda$onPostWindowFocus$2$InputMethodManager(ZLandroid/view/View;III)V
 HSPLandroid/view/inputmethod/InputMethodManager;->lambda$startInputInner$1$InputMethodManager(I)V
 HSPLandroid/view/inputmethod/InputMethodManager;->maybeCallServedViewChangedLocked(Landroid/view/inputmethod/EditorInfo;)V
 HSPLandroid/view/inputmethod/InputMethodManager;->obtainPendingEventLocked(Landroid/view/InputEvent;Ljava/lang/Object;Ljava/lang/String;Landroid/view/inputmethod/InputMethodManager$FinishedInputEventCallback;Landroid/os/Handler;)Landroid/view/inputmethod/InputMethodManager$PendingEvent;
-HSPLandroid/view/inputmethod/InputMethodManager;->onPostWindowFocus(Landroid/view/View;Landroid/view/View;II)V
-HSPLandroid/view/inputmethod/InputMethodManager;->onPreWindowFocus(Landroid/view/View;Z)V
 HSPLandroid/view/inputmethod/InputMethodManager;->onViewDetachedFromWindow(Landroid/view/View;)V
 HSPLandroid/view/inputmethod/InputMethodManager;->recyclePendingEventLocked(Landroid/view/inputmethod/InputMethodManager$PendingEvent;)V
 HSPLandroid/view/inputmethod/InputMethodManager;->registerImeConsumer(Landroid/view/ImeInsetsSourceConsumer;)V
 HSPLandroid/view/inputmethod/InputMethodManager;->restartInput(Landroid/view/View;)V
-HSPLandroid/view/inputmethod/InputMethodManager;->scheduleCheckFocusLocked(Landroid/view/View;)V
 HSPLandroid/view/inputmethod/InputMethodManager;->sendInputEventOnMainLooperLocked(Landroid/view/inputmethod/InputMethodManager$PendingEvent;)I
 HSPLandroid/view/inputmethod/InputMethodManager;->setInputChannelLocked(Landroid/view/InputChannel;)V
 HSPLandroid/view/inputmethod/InputMethodManager;->setNextServedViewLocked(Landroid/view/View;)V
@@ -28000,7 +25057,6 @@
 HSPLandroid/view/inputmethod/InputMethodManager;->unregisterImeConsumer(Landroid/view/ImeInsetsSourceConsumer;)V
 HSPLandroid/view/inputmethod/InputMethodManager;->updateSelection(Landroid/view/View;IIII)V
 HSPLandroid/view/inputmethod/InputMethodManager;->viewClicked(Landroid/view/View;)V
-HSPLandroid/view/inputmethod/InputMethodManager;->windowDismissed(Landroid/os/IBinder;)V
 HSPLandroid/view/inputmethod/InputMethodSubtype$1;->createFromParcel(Landroid/os/Parcel;)Landroid/view/inputmethod/InputMethodSubtype;
 HSPLandroid/view/inputmethod/InputMethodSubtype$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/view/inputmethod/InputMethodSubtype$InputMethodSubtypeBuilder;->access$100(Landroid/view/inputmethod/InputMethodSubtype$InputMethodSubtypeBuilder;)I
@@ -28016,7 +25072,6 @@
 HSPLandroid/view/inputmethod/InputMethodSubtype;-><init>(Landroid/os/Parcel;)V
 HSPLandroid/view/inputmethod/InputMethodSubtype;-><init>(Landroid/view/inputmethod/InputMethodSubtype$InputMethodSubtypeBuilder;)V
 HSPLandroid/view/inputmethod/InputMethodSubtype;-><init>(Landroid/view/inputmethod/InputMethodSubtype$InputMethodSubtypeBuilder;Landroid/view/inputmethod/InputMethodSubtype$1;)V
-HSPLandroid/view/inputmethod/InputMethodSubtype;->containsExtraValueKey(Ljava/lang/String;)Z
 HSPLandroid/view/inputmethod/InputMethodSubtype;->getExtraValueHashMap()Ljava/util/HashMap;
 HSPLandroid/view/inputmethod/InputMethodSubtype;->getLocale()Ljava/lang/String;
 HSPLandroid/view/inputmethod/InputMethodSubtype;->getMode()Ljava/lang/String;
@@ -28025,7 +25080,7 @@
 HSPLandroid/view/inputmethod/InputMethodSubtype;->isAuxiliary()Z
 HSPLandroid/view/inputmethod/InputMethodSubtype;->overridesImplicitlyEnabledSubtype()Z
 HSPLandroid/view/inputmethod/InputMethodSubtype;->sort(Landroid/content/Context;ILandroid/view/inputmethod/InputMethodInfo;Ljava/util/List;)Ljava/util/List;
-HPLandroid/view/inputmethod/InputMethodSubtype;->writeToParcel(Landroid/os/Parcel;I)V
+HSPLandroid/view/inputmethod/InputMethodSubtype;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/view/inputmethod/InputMethodSubtypeArray;-><init>(Landroid/os/Parcel;)V
 HSPLandroid/view/inputmethod/InputMethodSubtypeArray;-><init>(Ljava/util/List;)V
 HPLandroid/view/inputmethod/InputMethodSubtypeArray;->compress([B)[B
@@ -28034,7 +25089,6 @@
 HPLandroid/view/inputmethod/InputMethodSubtypeArray;->marshall([Landroid/view/inputmethod/InputMethodSubtype;)[B
 HPLandroid/view/inputmethod/InputMethodSubtypeArray;->writeToParcel(Landroid/os/Parcel;)V
 HSPLandroid/view/textclassifier/-$$Lambda$ActionsModelParamsSupplier$zElxNeuL3A8paTXvw8GWdpp4rFo;-><init>(Landroid/view/textclassifier/ActionsModelParamsSupplier;)V
-HSPLandroid/view/textclassifier/-$$Lambda$EntityConfidence$YPh8hwgSYYK8OyQ1kFlQngc71Q0;-><init>(Landroid/view/textclassifier/EntityConfidence;)V
 HSPLandroid/view/textclassifier/-$$Lambda$TextClassificationManager$JIaezIJbMig_-kVzN6oArzkTsJE;-><init>(Landroid/view/textclassifier/TextClassificationManager;)V
 HSPLandroid/view/textclassifier/-$$Lambda$TextClassificationManager$JIaezIJbMig_-kVzN6oArzkTsJE;->createTextClassificationSession(Landroid/view/textclassifier/TextClassificationContext;)Landroid/view/textclassifier/TextClassifier;
 HSPLandroid/view/textclassifier/-$$Lambda$TextClassifierImpl$iSt_Guet-O6Vtdk0MA4z-Z4lzaM;-><init>(Landroid/view/textclassifier/TextClassifierImpl;)V
@@ -28047,7 +25101,7 @@
 HSPLandroid/view/textclassifier/ConversationActions$Message;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/view/textclassifier/ConversationActions$Request$1;->createFromParcel(Landroid/os/Parcel;)Landroid/view/textclassifier/ConversationActions$Request;
 HSPLandroid/view/textclassifier/ConversationActions$Request$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HPLandroid/view/textclassifier/ConversationActions$Request;-><init>(Ljava/util/List;Landroid/view/textclassifier/TextClassifier$EntityConfig;ILjava/util/List;Landroid/os/Bundle;)V
+HSPLandroid/view/textclassifier/ConversationActions$Request;-><init>(Ljava/util/List;Landroid/view/textclassifier/TextClassifier$EntityConfig;ILjava/util/List;Landroid/os/Bundle;)V
 HPLandroid/view/textclassifier/ConversationActions$Request;->access$300(Landroid/os/Parcel;)Landroid/view/textclassifier/ConversationActions$Request;
 HSPLandroid/view/textclassifier/ConversationActions$Request;->readFromParcel(Landroid/os/Parcel;)Landroid/view/textclassifier/ConversationActions$Request;
 PLandroid/view/textclassifier/ConversationActions$Request;->setCallingPackageName(Ljava/lang/String;)V
@@ -28056,20 +25110,16 @@
 HSPLandroid/view/textclassifier/EntityConfidence$1;->createFromParcel(Landroid/os/Parcel;)Landroid/view/textclassifier/EntityConfidence;
 HSPLandroid/view/textclassifier/EntityConfidence$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/view/textclassifier/EntityConfidence;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/view/textclassifier/EntityConfidence;-><init>(Landroid/os/Parcel;Landroid/view/textclassifier/EntityConfidence$1;)V
 HSPLandroid/view/textclassifier/EntityConfidence;->getEntities()Ljava/util/List;
 HSPLandroid/view/textclassifier/EntityConfidence;->resetSortedEntitiesFromMap()V
 HSPLandroid/view/textclassifier/GenerateLinksLogger;-><init>(I)V
 HSPLandroid/view/textclassifier/Log;->d(Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/view/textclassifier/Log;->w(Ljava/lang/String;Ljava/lang/String;)V
 HSPLandroid/view/textclassifier/ModelFileManager$ModelFileSupplierImpl;-><init>(Ljava/io/File;Ljava/lang/String;Ljava/io/File;Ljava/util/function/Function;Ljava/util/function/Function;)V
 HSPLandroid/view/textclassifier/ModelFileManager;-><init>(Ljava/util/function/Supplier;)V
 HSPLandroid/view/textclassifier/SelectionEvent$1;->createFromParcel(Landroid/os/Parcel;)Landroid/view/textclassifier/SelectionEvent;
 HSPLandroid/view/textclassifier/SelectionEvent$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/view/textclassifier/SelectionEvent;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/view/textclassifier/SelectionEvent;->getEntityType()Ljava/lang/String;
 HSPLandroid/view/textclassifier/SelectionEvent;->getEventIndex()I
-HSPLandroid/view/textclassifier/SelectionEvent;->getEventTime()J
 HSPLandroid/view/textclassifier/SelectionEvent;->getEventType()I
 HSPLandroid/view/textclassifier/SelectionEvent;->getInvocationMethod()I
 HSPLandroid/view/textclassifier/SelectionEvent;->getResultId()Ljava/lang/String;
@@ -28080,31 +25130,26 @@
 HSPLandroid/view/textclassifier/SystemTextClassifier$BlockingCallback;-><init>(Ljava/lang/String;)V
 HSPLandroid/view/textclassifier/SystemTextClassifier$BlockingCallback;->get()Landroid/os/Parcelable;
 HSPLandroid/view/textclassifier/SystemTextClassifier$BlockingCallback;->onSuccess(Landroid/os/Bundle;)V
-HSPLandroid/view/textclassifier/SystemTextClassifier$ResponseReceiver;-><init>(Ljava/lang/String;)V
-HSPLandroid/view/textclassifier/SystemTextClassifier$ResponseReceiver;-><init>(Ljava/lang/String;Landroid/view/textclassifier/SystemTextClassifier$1;)V
 HSPLandroid/view/textclassifier/SystemTextClassifier$ResponseReceiver;->get()Ljava/lang/Object;
-HSPLandroid/view/textclassifier/SystemTextClassifier$ResponseReceiver;->onSuccess(Ljava/lang/Object;)V
 HSPLandroid/view/textclassifier/SystemTextClassifier;-><init>(Landroid/content/Context;Landroid/view/textclassifier/TextClassificationConstants;)V
 HSPLandroid/view/textclassifier/SystemTextClassifier;-><init>(Landroid/content/Context;Landroid/view/textclassifier/TextClassificationConstants;Z)V
 HSPLandroid/view/textclassifier/SystemTextClassifier;->classifyText(Landroid/view/textclassifier/TextClassification$Request;)Landroid/view/textclassifier/TextClassification;
 HSPLandroid/view/textclassifier/SystemTextClassifier;->destroy()V
 HSPLandroid/view/textclassifier/SystemTextClassifier;->initializeRemoteSession(Landroid/view/textclassifier/TextClassificationContext;Landroid/view/textclassifier/TextClassificationSessionId;)V
+HSPLandroid/view/textclassifier/SystemTextClassifierMetadata$1;-><init>()V
+HSPLandroid/view/textclassifier/SystemTextClassifierMetadata;-><clinit>()V
+HSPLandroid/view/textclassifier/SystemTextClassifierMetadata;-><init>(Ljava/lang/String;IZ)V
+HSPLandroid/view/textclassifier/SystemTextClassifierMetadata;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/view/textclassifier/TextClassification$1;->createFromParcel(Landroid/os/Parcel;)Landroid/view/textclassifier/TextClassification;
 HSPLandroid/view/textclassifier/TextClassification$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/view/textclassifier/TextClassification$Request$1;->createFromParcel(Landroid/os/Parcel;)Landroid/view/textclassifier/TextClassification$Request;
 HSPLandroid/view/textclassifier/TextClassification$Request$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/view/textclassifier/TextClassification$Request$Builder;-><init>(Ljava/lang/CharSequence;II)V
-HSPLandroid/view/textclassifier/TextClassification$Request$Builder;->build()Landroid/view/textclassifier/TextClassification$Request;
-HSPLandroid/view/textclassifier/TextClassification$Request$Builder;->setDefaultLocales(Landroid/os/LocaleList;)Landroid/view/textclassifier/TextClassification$Request$Builder;
 HSPLandroid/view/textclassifier/TextClassification$Request;-><init>(Ljava/lang/CharSequence;IILandroid/os/LocaleList;Ljava/time/ZonedDateTime;Landroid/os/Bundle;)V
-HSPLandroid/view/textclassifier/TextClassification$Request;-><init>(Ljava/lang/CharSequence;IILandroid/os/LocaleList;Ljava/time/ZonedDateTime;Landroid/os/Bundle;Landroid/view/textclassifier/TextClassification$1;)V
 HSPLandroid/view/textclassifier/TextClassification$Request;->readFromParcel(Landroid/os/Parcel;)Landroid/view/textclassifier/TextClassification$Request;
 HSPLandroid/view/textclassifier/TextClassification$Request;->setCallingPackageName(Ljava/lang/String;)V
 HSPLandroid/view/textclassifier/TextClassification$Request;->setUserId(I)V
 HSPLandroid/view/textclassifier/TextClassification$Request;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/view/textclassifier/TextClassification;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/view/textclassifier/TextClassification;-><init>(Landroid/os/Parcel;Landroid/view/textclassifier/TextClassification$1;)V
-HSPLandroid/view/textclassifier/TextClassification;->getActions()Ljava/util/List;
 HSPLandroid/view/textclassifier/TextClassificationConstants;-><init>()V
 HSPLandroid/view/textclassifier/TextClassificationConstants;->getGenerateLinksLogSampleRate()I
 HSPLandroid/view/textclassifier/TextClassificationConstants;->getGenerateLinksMaxTextLength()I
@@ -28120,19 +25165,15 @@
 HSPLandroid/view/textclassifier/TextClassificationContext$Builder;->build()Landroid/view/textclassifier/TextClassificationContext;
 HSPLandroid/view/textclassifier/TextClassificationContext;-><init>(Landroid/os/Parcel;)V
 HSPLandroid/view/textclassifier/TextClassificationContext;-><init>(Landroid/os/Parcel;Landroid/view/textclassifier/TextClassificationContext$1;)V
-HSPLandroid/view/textclassifier/TextClassificationContext;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-HSPLandroid/view/textclassifier/TextClassificationContext;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/view/textclassifier/TextClassificationContext$1;)V
 HSPLandroid/view/textclassifier/TextClassificationContext;->getPackageName()Ljava/lang/String;
 HSPLandroid/view/textclassifier/TextClassificationContext;->getUserId()I
 HSPLandroid/view/textclassifier/TextClassificationContext;->getWidgetType()Ljava/lang/String;
 HSPLandroid/view/textclassifier/TextClassificationContext;->getWidgetVersion()Ljava/lang/String;
-HSPLandroid/view/textclassifier/TextClassificationContext;->setUserId(I)V
 HSPLandroid/view/textclassifier/TextClassificationContext;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/view/textclassifier/TextClassificationManager$SettingsObserver;-><init>(Landroid/view/textclassifier/TextClassificationManager;)V
 HSPLandroid/view/textclassifier/TextClassificationManager$SettingsObserver;->onPropertiesChanged(Landroid/provider/DeviceConfig$Properties;)V
 HSPLandroid/view/textclassifier/TextClassificationManager;-><init>(Landroid/content/Context;)V
 HSPLandroid/view/textclassifier/TextClassificationManager;->createTextClassificationSession(Landroid/view/textclassifier/TextClassificationContext;)Landroid/view/textclassifier/TextClassifier;
-HSPLandroid/view/textclassifier/TextClassificationManager;->finalize()V
 HSPLandroid/view/textclassifier/TextClassificationManager;->getLocalTextClassifier()Landroid/view/textclassifier/TextClassifier;
 HSPLandroid/view/textclassifier/TextClassificationManager;->getSettings()Landroid/view/textclassifier/TextClassificationConstants;
 HSPLandroid/view/textclassifier/TextClassificationManager;->getSettings(Landroid/content/Context;)Landroid/view/textclassifier/TextClassificationConstants;
@@ -28141,16 +25182,15 @@
 HSPLandroid/view/textclassifier/TextClassificationManager;->getTextClassifier()Landroid/view/textclassifier/TextClassifier;
 HSPLandroid/view/textclassifier/TextClassificationManager;->getTextClassifier(I)Landroid/view/textclassifier/TextClassifier;
 HSPLandroid/view/textclassifier/TextClassificationManager;->isSystemTextClassifierEnabled()Z
-HSPLandroid/view/textclassifier/TextClassificationManager;->lambda$new$0$TextClassificationManager(Landroid/view/textclassifier/TextClassificationContext;)Landroid/view/textclassifier/TextClassifier;
+HSPLandroid/view/textclassifier/TextClassificationSession$CleanerRunnable;-><init>(Landroid/view/textclassifier/TextClassificationSession$SelectionEventHelper;Landroid/view/textclassifier/TextClassifier;)V
 HSPLandroid/view/textclassifier/TextClassificationSession$SelectionEventHelper;-><init>(Landroid/view/textclassifier/TextClassificationSessionId;Landroid/view/textclassifier/TextClassificationContext;)V
 HSPLandroid/view/textclassifier/TextClassificationSession$SelectionEventHelper;->endSession()V
 HSPLandroid/view/textclassifier/TextClassificationSession;-><init>(Landroid/view/textclassifier/TextClassificationContext;Landroid/view/textclassifier/TextClassifier;)V
 HSPLandroid/view/textclassifier/TextClassificationSession;->destroy()V
-HSPLandroid/view/textclassifier/TextClassificationSession;->initializeRemoteSession()V
 HSPLandroid/view/textclassifier/TextClassificationSessionId$1;->createFromParcel(Landroid/os/Parcel;)Landroid/view/textclassifier/TextClassificationSessionId;
 HSPLandroid/view/textclassifier/TextClassificationSessionId$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/view/textclassifier/TextClassificationSessionId;-><init>()V
 HSPLandroid/view/textclassifier/TextClassificationSessionId;-><init>(Ljava/lang/String;)V
+HSPLandroid/view/textclassifier/TextClassificationSessionId;-><init>(Ljava/lang/String;Landroid/os/IBinder;)V
 HSPLandroid/view/textclassifier/TextClassificationSessionId;->equals(Ljava/lang/Object;)Z
 HSPLandroid/view/textclassifier/TextClassificationSessionId;->hashCode()I
 HSPLandroid/view/textclassifier/TextClassificationSessionId;->writeToParcel(Landroid/os/Parcel;I)V
@@ -28259,148 +25299,22 @@
 HSPLandroid/view/textservice/TextServicesManager;->isSpellCheckerEnabled()Z
 HSPLandroid/view/textservice/TextServicesManager;->newSpellCheckerSession(Landroid/os/Bundle;Ljava/util/Locale;Landroid/view/textservice/SpellCheckerSession$SpellCheckerSessionListener;Z)Landroid/view/textservice/SpellCheckerSession;
 HSPLandroid/view/textservice/TextServicesManager;->parseLanguageFromLocaleString(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/webkit/ConsoleMessage;-><init>(Ljava/lang/String;Ljava/lang/String;ILandroid/webkit/ConsoleMessage$MessageLevel;)V
-HSPLandroid/webkit/ConsoleMessage;->lineNumber()I
-HSPLandroid/webkit/ConsoleMessage;->message()Ljava/lang/String;
-HSPLandroid/webkit/ConsoleMessage;->messageLevel()Landroid/webkit/ConsoleMessage$MessageLevel;
-HSPLandroid/webkit/ConsoleMessage;->sourceId()Ljava/lang/String;
-HSPLandroid/webkit/CookieManager;-><init>()V
 HSPLandroid/webkit/CookieManager;->getInstance()Landroid/webkit/CookieManager;
-HSPLandroid/webkit/CookieSyncManager;->setGetInstanceIsAllowed()V
-HSPLandroid/webkit/FindAddress$ZipRange;-><init>(IIII)V
-HSPLandroid/webkit/FindAddress;-><clinit>()V
-HSPLandroid/webkit/FindAddress;->findAddress(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/webkit/GeolocationPermissions;-><init>()V
-HSPLandroid/webkit/IWebViewUpdateService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLandroid/webkit/IWebViewUpdateService$Stub$Proxy;->getCurrentWebViewPackage()Landroid/content/pm/PackageInfo;
 HSPLandroid/webkit/IWebViewUpdateService$Stub$Proxy;->isMultiProcessEnabled()Z
 HSPLandroid/webkit/IWebViewUpdateService$Stub$Proxy;->waitForAndGetProvider()Landroid/webkit/WebViewProviderResponse;
 HSPLandroid/webkit/IWebViewUpdateService$Stub;-><init>()V
-HSPLandroid/webkit/IWebViewUpdateService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/webkit/IWebViewUpdateService;
 HSPLandroid/webkit/IWebViewUpdateService$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/webkit/MimeTypeMap;-><clinit>()V
 HSPLandroid/webkit/MimeTypeMap;-><init>()V
 HSPLandroid/webkit/MimeTypeMap;->getFileExtensionFromUrl(Ljava/lang/String;)Ljava/lang/String;
 HSPLandroid/webkit/MimeTypeMap;->getMimeTypeFromExtension(Ljava/lang/String;)Ljava/lang/String;
 HSPLandroid/webkit/MimeTypeMap;->getSingleton()Landroid/webkit/MimeTypeMap;
-HSPLandroid/webkit/URLUtil;->isAboutUrl(Ljava/lang/String;)Z
-HSPLandroid/webkit/URLUtil;->isAssetUrl(Ljava/lang/String;)Z
-HSPLandroid/webkit/URLUtil;->isFileUrl(Ljava/lang/String;)Z
-HSPLandroid/webkit/URLUtil;->isHttpUrl(Ljava/lang/String;)Z
-HSPLandroid/webkit/URLUtil;->isHttpsUrl(Ljava/lang/String;)Z
-HSPLandroid/webkit/URLUtil;->isResourceUrl(Ljava/lang/String;)Z
-HSPLandroid/webkit/URLUtil;->isValidUrl(Ljava/lang/String;)Z
 HSPLandroid/webkit/UserPackage;-><init>(Landroid/content/pm/UserInfo;Landroid/content/pm/PackageInfo;)V
 HSPLandroid/webkit/UserPackage;->getAllUsers(Landroid/content/Context;)Ljava/util/List;
 HSPLandroid/webkit/UserPackage;->getPackageInfosAllUsers(Landroid/content/Context;Ljava/lang/String;I)Ljava/util/List;
 HSPLandroid/webkit/UserPackage;->hasCorrectTargetSdkVersion(Landroid/content/pm/PackageInfo;)Z
 HSPLandroid/webkit/UserPackage;->isEnabledPackage()Z
 HSPLandroid/webkit/UserPackage;->isInstalledPackage()Z
-HSPLandroid/webkit/WebChromeClient;-><init>()V
-HSPLandroid/webkit/WebChromeClient;->getVisitedHistory(Landroid/webkit/ValueCallback;)V
-HSPLandroid/webkit/WebChromeClient;->onProgressChanged(Landroid/webkit/WebView;I)V
-HSPLandroid/webkit/WebChromeClient;->onReceivedIcon(Landroid/webkit/WebView;Landroid/graphics/Bitmap;)V
-HSPLandroid/webkit/WebChromeClient;->onReceivedTitle(Landroid/webkit/WebView;Ljava/lang/String;)V
-HSPLandroid/webkit/WebResourceResponse;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/io/InputStream;)V
-HSPLandroid/webkit/WebResourceResponse;->checkImmutable()V
-HSPLandroid/webkit/WebResourceResponse;->getData()Ljava/io/InputStream;
-HSPLandroid/webkit/WebResourceResponse;->getEncoding()Ljava/lang/String;
-HSPLandroid/webkit/WebResourceResponse;->getMimeType()Ljava/lang/String;
-HSPLandroid/webkit/WebResourceResponse;->getReasonPhrase()Ljava/lang/String;
-HSPLandroid/webkit/WebResourceResponse;->getResponseHeaders()Ljava/util/Map;
-HSPLandroid/webkit/WebResourceResponse;->getStatusCode()I
-HSPLandroid/webkit/WebResourceResponse;->setData(Ljava/io/InputStream;)V
-HSPLandroid/webkit/WebSettings$PluginState;-><clinit>()V
-HSPLandroid/webkit/WebSettings$PluginState;-><init>(Ljava/lang/String;I)V
-HSPLandroid/webkit/WebSettings;-><init>()V
-HSPLandroid/webkit/WebSettings;->getDefaultUserAgent(Landroid/content/Context;)Ljava/lang/String;
-HSPLandroid/webkit/WebStorage;-><init>()V
-HSPLandroid/webkit/WebView$HitTestResult;-><init>()V
-HSPLandroid/webkit/WebView$PrivateAccess;-><init>(Landroid/webkit/WebView;)V
-HSPLandroid/webkit/WebView$PrivateAccess;->overScrollBy(IIIIIIIIZ)V
-HSPLandroid/webkit/WebView$PrivateAccess;->setMeasuredDimension(II)V
-HSPLandroid/webkit/WebView$PrivateAccess;->super_getScrollBarStyle()I
-HSPLandroid/webkit/WebView$PrivateAccess;->super_onDrawVerticalScrollBar(Landroid/graphics/Canvas;Landroid/graphics/drawable/Drawable;IIII)V
-HSPLandroid/webkit/WebView$PrivateAccess;->super_requestFocus(ILandroid/graphics/Rect;)Z
-HSPLandroid/webkit/WebView$PrivateAccess;->super_scrollTo(II)V
-HSPLandroid/webkit/WebView$PrivateAccess;->super_setFrame(IIII)Z
-HSPLandroid/webkit/WebView$PrivateAccess;->super_setLayoutParams(Landroid/view/ViewGroup$LayoutParams;)V
-HSPLandroid/webkit/WebView;-><init>(Landroid/content/Context;)V
-HSPLandroid/webkit/WebView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLandroid/webkit/WebView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V
-HSPLandroid/webkit/WebView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V
-HSPLandroid/webkit/WebView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;IILjava/util/Map;Z)V
-HSPLandroid/webkit/WebView;->access$1001(Landroid/webkit/WebView;ILandroid/graphics/Rect;)Z
-HSPLandroid/webkit/WebView;->access$101(Landroid/webkit/WebView;)I
-HSPLandroid/webkit/WebView;->access$1101(Landroid/webkit/WebView;Landroid/view/ViewGroup$LayoutParams;)V
-HSPLandroid/webkit/WebView;->access$1300(Landroid/webkit/WebView;IIIIIIIIZ)Z
-HSPLandroid/webkit/WebView;->access$1800(Landroid/webkit/WebView;II)V
-HSPLandroid/webkit/WebView;->access$201(Landroid/webkit/WebView;II)V
-HSPLandroid/webkit/WebView;->access$701(Landroid/webkit/WebView;IIII)Z
-HSPLandroid/webkit/WebView;->addJavascriptInterface(Ljava/lang/Object;Ljava/lang/String;)V
-HSPLandroid/webkit/WebView;->checkThread()V
-HSPLandroid/webkit/WebView;->computeHorizontalScrollOffset()I
-HSPLandroid/webkit/WebView;->computeHorizontalScrollRange()I
-HSPLandroid/webkit/WebView;->computeScroll()V
-HSPLandroid/webkit/WebView;->computeVerticalScrollExtent()I
-HSPLandroid/webkit/WebView;->computeVerticalScrollOffset()I
-HSPLandroid/webkit/WebView;->computeVerticalScrollRange()I
-HSPLandroid/webkit/WebView;->destroy()V
-HSPLandroid/webkit/WebView;->dispatchDraw(Landroid/graphics/Canvas;)V
-HSPLandroid/webkit/WebView;->ensureProviderCreated()V
-HSPLandroid/webkit/WebView;->evaluateJavascript(Ljava/lang/String;Landroid/webkit/ValueCallback;)V
-HSPLandroid/webkit/WebView;->findAddress(Ljava/lang/String;)Ljava/lang/String;
-HSPLandroid/webkit/WebView;->findFocus()Landroid/view/View;
-HSPLandroid/webkit/WebView;->getContentHeight()I
-HSPLandroid/webkit/WebView;->getCurrentWebViewPackage()Landroid/content/pm/PackageInfo;
-HSPLandroid/webkit/WebView;->getFactory()Landroid/webkit/WebViewFactoryProvider;
-HSPLandroid/webkit/WebView;->getFavicon()Landroid/graphics/Bitmap;
-HSPLandroid/webkit/WebView;->getHandler()Landroid/os/Handler;
-HSPLandroid/webkit/WebView;->getScale()F
-HSPLandroid/webkit/WebView;->getSettings()Landroid/webkit/WebSettings;
-HSPLandroid/webkit/WebView;->getUrl()Ljava/lang/String;
-HSPLandroid/webkit/WebView;->loadUrl(Ljava/lang/String;)V
-HSPLandroid/webkit/WebView;->onAttachedToWindow()V
-HSPLandroid/webkit/WebView;->onCheckIsTextEditor()Z
-HSPLandroid/webkit/WebView;->onCreateInputConnection(Landroid/view/inputmethod/EditorInfo;)Landroid/view/inputmethod/InputConnection;
-HSPLandroid/webkit/WebView;->onDetachedFromWindowInternal()V
-HSPLandroid/webkit/WebView;->onDraw(Landroid/graphics/Canvas;)V
-HSPLandroid/webkit/WebView;->onDrawVerticalScrollBar(Landroid/graphics/Canvas;Landroid/graphics/drawable/Drawable;IIII)V
-HSPLandroid/webkit/WebView;->onFocusChanged(ZILandroid/graphics/Rect;)V
-HSPLandroid/webkit/WebView;->onMeasure(II)V
-HSPLandroid/webkit/WebView;->onOverScrolled(IIZZ)V
-HSPLandroid/webkit/WebView;->onScrollChanged(IIII)V
-HSPLandroid/webkit/WebView;->onSizeChanged(IIII)V
-HSPLandroid/webkit/WebView;->onTouchEvent(Landroid/view/MotionEvent;)Z
-HSPLandroid/webkit/WebView;->onVisibilityChanged(Landroid/view/View;I)V
-HSPLandroid/webkit/WebView;->onWindowFocusChanged(Z)V
-HSPLandroid/webkit/WebView;->onWindowVisibilityChanged(I)V
-HSPLandroid/webkit/WebView;->removeJavascriptInterface(Ljava/lang/String;)V
-HSPLandroid/webkit/WebView;->requestFocus(ILandroid/graphics/Rect;)Z
-HSPLandroid/webkit/WebView;->setBackgroundColor(I)V
-HSPLandroid/webkit/WebView;->setDataDirectorySuffix(Ljava/lang/String;)V
-HSPLandroid/webkit/WebView;->setDownloadListener(Landroid/webkit/DownloadListener;)V
-HSPLandroid/webkit/WebView;->setFrame(IIII)Z
-HSPLandroid/webkit/WebView;->setLayoutParams(Landroid/view/ViewGroup$LayoutParams;)V
-HSPLandroid/webkit/WebView;->setOverScrollMode(I)V
-HSPLandroid/webkit/WebView;->setWebChromeClient(Landroid/webkit/WebChromeClient;)V
-HSPLandroid/webkit/WebView;->setWebViewClient(Landroid/webkit/WebViewClient;)V
-HSPLandroid/webkit/WebViewClient;-><init>()V
-HSPLandroid/webkit/WebViewClient;->doUpdateVisitedHistory(Landroid/webkit/WebView;Ljava/lang/String;Z)V
-HSPLandroid/webkit/WebViewClient;->onLoadResource(Landroid/webkit/WebView;Ljava/lang/String;)V
-HSPLandroid/webkit/WebViewClient;->onPageCommitVisible(Landroid/webkit/WebView;Ljava/lang/String;)V
-HSPLandroid/webkit/WebViewClient;->onPageFinished(Landroid/webkit/WebView;Ljava/lang/String;)V
-HSPLandroid/webkit/WebViewClient;->onPageStarted(Landroid/webkit/WebView;Ljava/lang/String;Landroid/graphics/Bitmap;)V
-HSPLandroid/webkit/WebViewClient;->onReceivedError(Landroid/webkit/WebView;Landroid/webkit/WebResourceRequest;Landroid/webkit/WebResourceError;)V
-HSPLandroid/webkit/WebViewClient;->onScaleChanged(Landroid/webkit/WebView;FF)V
-HSPLandroid/webkit/WebViewClient;->shouldInterceptRequest(Landroid/webkit/WebView;Landroid/webkit/WebResourceRequest;)Landroid/webkit/WebResourceResponse;
-HSPLandroid/webkit/WebViewClient;->shouldInterceptRequest(Landroid/webkit/WebView;Ljava/lang/String;)Landroid/webkit/WebResourceResponse;
-HSPLandroid/webkit/WebViewClient;->shouldOverrideUrlLoading(Landroid/webkit/WebView;Landroid/webkit/WebResourceRequest;)Z
-HSPLandroid/webkit/WebViewDelegate$1;-><init>(Landroid/webkit/WebViewDelegate;Landroid/webkit/WebViewDelegate$OnTraceEnabledChangeListener;)V
-HSPLandroid/webkit/WebViewDelegate$1;->run()V
-HSPLandroid/webkit/WebViewDelegate;-><init>()V
-HSPLandroid/webkit/WebViewDelegate;->addWebViewAssetPath(Landroid/content/Context;)V
-HSPLandroid/webkit/WebViewDelegate;->drawWebViewFunctor(Landroid/graphics/Canvas;I)V
 HSPLandroid/webkit/WebViewDelegate;->getApplication()Landroid/app/Application;
 HSPLandroid/webkit/WebViewDelegate;->getDataDirectorySuffix()Ljava/lang/String;
 HSPLandroid/webkit/WebViewDelegate;->getPackageId(Landroid/content/res/Resources;Ljava/lang/String;)I
@@ -28411,15 +25325,10 @@
 HSPLandroid/webkit/WebViewFactory;->getLoadedPackageInfo()Landroid/content/pm/PackageInfo;
 HSPLandroid/webkit/WebViewFactory;->getProvider()Landroid/webkit/WebViewFactoryProvider;
 HSPLandroid/webkit/WebViewFactory;->getProviderClass()Ljava/lang/Class;
-HSPLandroid/webkit/WebViewFactory;->getUpdateService()Landroid/webkit/IWebViewUpdateService;
-HSPLandroid/webkit/WebViewFactory;->getUpdateServiceUnchecked()Landroid/webkit/IWebViewUpdateService;
 HSPLandroid/webkit/WebViewFactory;->getWebViewContextAndSetProvider()Landroid/content/Context;
 HSPLandroid/webkit/WebViewFactory;->getWebViewLibrary(Landroid/content/pm/ApplicationInfo;)Ljava/lang/String;
-HSPLandroid/webkit/WebViewFactory;->getWebViewProviderClass(Ljava/lang/ClassLoader;)Ljava/lang/Class;
-HSPLandroid/webkit/WebViewFactory;->isWebViewSupported()Z
 HSPLandroid/webkit/WebViewFactory;->onWebViewProviderChanged(Landroid/content/pm/PackageInfo;)I
 HSPLandroid/webkit/WebViewFactory;->prepareWebViewInZygote()V
-HSPLandroid/webkit/WebViewFactory;->setDataDirectorySuffix(Ljava/lang/String;)V
 HSPLandroid/webkit/WebViewFactory;->signaturesEquals([Landroid/content/pm/Signature;[Landroid/content/pm/Signature;)Z
 HSPLandroid/webkit/WebViewFactory;->verifyPackageInfo(Landroid/content/pm/PackageInfo;Landroid/content/pm/PackageInfo;)V
 HSPLandroid/webkit/WebViewLibraryLoader$1;-><init>(Ljava/lang/String;)V
@@ -28432,8 +25341,6 @@
 HSPLandroid/webkit/WebViewProviderResponse$1;->createFromParcel(Landroid/os/Parcel;)Landroid/webkit/WebViewProviderResponse;
 HSPLandroid/webkit/WebViewProviderResponse$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/webkit/WebViewProviderResponse;-><init>(Landroid/content/pm/PackageInfo;I)V
-HSPLandroid/webkit/WebViewProviderResponse;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/webkit/WebViewProviderResponse;-><init>(Landroid/os/Parcel;Landroid/webkit/WebViewProviderResponse$1;)V
 HPLandroid/webkit/WebViewProviderResponse;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/webkit/WebViewZygote;->connectToZygoteIfNeededLocked()V
 HPLandroid/webkit/WebViewZygote;->getPackageName()Ljava/lang/String;
@@ -28443,10 +25350,8 @@
 HSPLandroid/webkit/WebViewZygote;->setMultiprocessEnabled(Z)V
 HSPLandroid/widget/-$$Lambda$DateTimeView$ReceiverInfo$AVLnX7U5lTcE9jLnlKKNAT1GUeI;-><init>(Landroid/widget/DateTimeView;)V
 HSPLandroid/widget/-$$Lambda$DateTimeView$ReceiverInfo$AVLnX7U5lTcE9jLnlKKNAT1GUeI;->run()V
-HSPLandroid/widget/-$$Lambda$Editor$MagnifierMotionAnimator$E-RaelOMgCHAzvKgSSZE-hDYeIg;-><init>(Landroid/widget/Editor$MagnifierMotionAnimator;)V
 HSPLandroid/widget/-$$Lambda$IfzAW5fP9thoftErKAjo9SLZufw;-><init>(Landroid/widget/TextView;)V
 HSPLandroid/widget/-$$Lambda$PopupWindow$8Gc2stI5cSJZbuKX7X4Qr_vU2nI;-><init>(Landroid/widget/PopupWindow;)V
-HSPLandroid/widget/-$$Lambda$PopupWindow$8Gc2stI5cSJZbuKX7X4Qr_vU2nI;->onLayoutChange(Landroid/view/View;IIIIIIII)V
 HSPLandroid/widget/-$$Lambda$PopupWindow$PopupDecorView$T99WKEnQefOCXbbKvW95WY38p_I;-><init>(Landroid/widget/PopupWindow$PopupDecorView;Landroid/transition/Transition$TransitionListener;Landroid/transition/Transition;Landroid/view/View;)V
 HSPLandroid/widget/-$$Lambda$PopupWindow$PopupDecorView$T99WKEnQefOCXbbKvW95WY38p_I;->run()V
 HSPLandroid/widget/-$$Lambda$PopupWindow$nV1HS3Nc6Ck5JRIbIHe3mkyHWzc;-><init>(Landroid/widget/PopupWindow;)V
@@ -28460,12 +25365,10 @@
 HSPLandroid/widget/AbsListView$CheckForTap;-><init>(Landroid/widget/AbsListView;)V
 HSPLandroid/widget/AbsListView$CheckForTap;-><init>(Landroid/widget/AbsListView;Landroid/widget/AbsListView$1;)V
 HSPLandroid/widget/AbsListView$CheckForTap;->run()V
-HSPLandroid/widget/AbsListView$FlingRunnable$1;-><init>(Landroid/widget/AbsListView$FlingRunnable;)V
 HSPLandroid/widget/AbsListView$FlingRunnable;-><init>(Landroid/widget/AbsListView;)V
 HSPLandroid/widget/AbsListView$FlingRunnable;->endFling()V
 HSPLandroid/widget/AbsListView$FlingRunnable;->run()V
 HSPLandroid/widget/AbsListView$FlingRunnable;->start(I)V
-HSPLandroid/widget/AbsListView$LayoutParams;-><init>(II)V
 HSPLandroid/widget/AbsListView$LayoutParams;-><init>(III)V
 HSPLandroid/widget/AbsListView$LayoutParams;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
 HSPLandroid/widget/AbsListView$PerformClick;-><init>(Landroid/widget/AbsListView;)V
@@ -28500,10 +25403,7 @@
 HSPLandroid/widget/AbsListView;->access$1602(Landroid/widget/AbsListView;Ljava/lang/Runnable;)Ljava/lang/Runnable;
 HSPLandroid/widget/AbsListView;->access$1700(Landroid/widget/AbsListView;)Z
 HSPLandroid/widget/AbsListView;->access$2300(Landroid/widget/AbsListView;)Landroid/os/StrictMode$Span;
-HSPLandroid/widget/AbsListView;->access$2302(Landroid/widget/AbsListView;Landroid/os/StrictMode$Span;)Landroid/os/StrictMode$Span;
 HSPLandroid/widget/AbsListView;->access$3000(Landroid/widget/AbsListView;)V
-HSPLandroid/widget/AbsListView;->access$3300(Landroid/widget/AbsListView;)I
-HSPLandroid/widget/AbsListView;->access$3400(Landroid/widget/AbsListView;)I
 HSPLandroid/widget/AbsListView;->access$4500(Landroid/widget/AbsListView;)Landroid/widget/FastScroller;
 HSPLandroid/widget/AbsListView;->access$4600(Landroid/widget/AbsListView;Landroid/view/View;Z)V
 HSPLandroid/widget/AbsListView;->access$600(Landroid/widget/AbsListView;)I
@@ -28546,12 +25446,10 @@
 HSPLandroid/widget/AbsListView;->onAttachedToWindow()V
 HSPLandroid/widget/AbsListView;->onCancelPendingInputEvents()V
 HSPLandroid/widget/AbsListView;->onDetachedFromWindow()V
-HSPLandroid/widget/AbsListView;->onFocusChanged(ZILandroid/graphics/Rect;)V
 HSPLandroid/widget/AbsListView;->onInterceptTouchEvent(Landroid/view/MotionEvent;)Z
 HSPLandroid/widget/AbsListView;->onLayout(ZIIII)V
 HSPLandroid/widget/AbsListView;->onMeasure(II)V
 HSPLandroid/widget/AbsListView;->onOverScrolled(IIZZ)V
-HSPLandroid/widget/AbsListView;->onRestoreInstanceState(Landroid/os/Parcelable;)V
 HSPLandroid/widget/AbsListView;->onRtlPropertiesChanged(I)V
 HSPLandroid/widget/AbsListView;->onSaveInstanceState()Landroid/os/Parcelable;
 HSPLandroid/widget/AbsListView;->onSizeChanged(IIII)V
@@ -28577,7 +25475,6 @@
 HSPLandroid/widget/AbsListView;->setFastScrollAlwaysVisible(Z)V
 HSPLandroid/widget/AbsListView;->setFastScrollEnabled(Z)V
 HSPLandroid/widget/AbsListView;->setFastScrollStyle(I)V
-HSPLandroid/widget/AbsListView;->setFilterText(Ljava/lang/String;)V
 HSPLandroid/widget/AbsListView;->setFrame(IIII)Z
 HSPLandroid/widget/AbsListView;->setItemChecked(IZ)V
 HSPLandroid/widget/AbsListView;->setItemViewLayoutParams(Landroid/view/View;I)V
@@ -28605,9 +25502,9 @@
 HSPLandroid/widget/AbsSeekBar;->drawThumb(Landroid/graphics/Canvas;)V
 HSPLandroid/widget/AbsSeekBar;->drawTickMarks(Landroid/graphics/Canvas;)V
 HSPLandroid/widget/AbsSeekBar;->drawTrack(Landroid/graphics/Canvas;)V
+HSPLandroid/widget/AbsSeekBar;->drawableHotspotChanged(FF)V
 HSPLandroid/widget/AbsSeekBar;->drawableStateChanged()V
 HSPLandroid/widget/AbsSeekBar;->getScale()F
-HSPLandroid/widget/AbsSeekBar;->getThumb()Landroid/graphics/drawable/Drawable;
 HSPLandroid/widget/AbsSeekBar;->getThumbOffset()I
 HSPLandroid/widget/AbsSeekBar;->growRectTo(Landroid/graphics/Rect;I)V
 HSPLandroid/widget/AbsSeekBar;->jumpDrawablesToCurrentState()V
@@ -28628,31 +25525,6 @@
 HSPLandroid/widget/AbsSeekBar;->updateGestureExclusionRects()V
 HSPLandroid/widget/AbsSeekBar;->updateThumbAndTrackPos(II)V
 HSPLandroid/widget/AbsSeekBar;->verifyDrawable(Landroid/graphics/drawable/Drawable;)Z
-HSPLandroid/widget/AbsSpinner$RecycleBin;-><init>(Landroid/widget/AbsSpinner;)V
-HSPLandroid/widget/AbsSpinner$RecycleBin;->clear()V
-HSPLandroid/widget/AbsSpinner$RecycleBin;->get(I)Landroid/view/View;
-HSPLandroid/widget/AbsSpinner$RecycleBin;->put(ILandroid/view/View;)V
-HSPLandroid/widget/AbsSpinner$SavedState$1;-><init>()V
-HSPLandroid/widget/AbsSpinner$SavedState;-><clinit>()V
-HSPLandroid/widget/AbsSpinner$SavedState;-><init>(Landroid/os/Parcelable;)V
-HSPLandroid/widget/AbsSpinner$SavedState;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/widget/AbsSpinner;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V
-HSPLandroid/widget/AbsSpinner;->getAdapter()Landroid/widget/Adapter;
-HSPLandroid/widget/AbsSpinner;->getAdapter()Landroid/widget/SpinnerAdapter;
-HSPLandroid/widget/AbsSpinner;->getAutofillType()I
-HSPLandroid/widget/AbsSpinner;->getChildHeight(Landroid/view/View;)I
-HSPLandroid/widget/AbsSpinner;->getChildWidth(Landroid/view/View;)I
-HSPLandroid/widget/AbsSpinner;->getSelectedView()Landroid/view/View;
-HSPLandroid/widget/AbsSpinner;->initAbsSpinner()V
-HSPLandroid/widget/AbsSpinner;->onMeasure(II)V
-HSPLandroid/widget/AbsSpinner;->onSaveInstanceState()Landroid/os/Parcelable;
-HSPLandroid/widget/AbsSpinner;->recycleAllViews()V
-HSPLandroid/widget/AbsSpinner;->requestLayout()V
-HSPLandroid/widget/AbsSpinner;->setAdapter(Landroid/widget/SpinnerAdapter;)V
-HSPLandroid/widget/AbsSpinner;->setSelection(I)V
-HSPLandroid/widget/AbsoluteLayout;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V
-HSPLandroid/widget/AbsoluteLayout;->onLayout(ZIIII)V
-HSPLandroid/widget/AbsoluteLayout;->onMeasure(II)V
 HSPLandroid/widget/ActionMenuPresenter$1;-><init>(Landroid/widget/ActionMenuPresenter;)V
 HSPLandroid/widget/ActionMenuPresenter$2;-><init>(Landroid/widget/ActionMenuPresenter;)V
 HSPLandroid/widget/ActionMenuPresenter$2;->onViewAttachedToWindow(Landroid/view/View;)V
@@ -28691,7 +25563,6 @@
 HSPLandroid/widget/ActionMenuView;->isOverflowMenuShowing()Z
 HSPLandroid/widget/ActionMenuView;->onConfigurationChanged(Landroid/content/res/Configuration;)V
 HSPLandroid/widget/ActionMenuView;->onDetachedFromWindow()V
-HSPLandroid/widget/ActionMenuView;->onLayout(ZIIII)V
 HSPLandroid/widget/ActionMenuView;->onMeasure(II)V
 HSPLandroid/widget/ActionMenuView;->peekMenu()Lcom/android/internal/view/menu/MenuBuilder;
 HSPLandroid/widget/ActionMenuView;->setExpandedActionViewsExclusive(Z)V
@@ -28704,24 +25575,17 @@
 HSPLandroid/widget/AdapterView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V
 HSPLandroid/widget/AdapterView;->checkFocus()V
 HSPLandroid/widget/AdapterView;->checkSelectionChanged()V
-HSPLandroid/widget/AdapterView;->dispatchOnItemSelected()V
-HSPLandroid/widget/AdapterView;->dispatchRestoreInstanceState(Landroid/util/SparseArray;)V
 HSPLandroid/widget/AdapterView;->dispatchSaveInstanceState(Landroid/util/SparseArray;)V
-HSPLandroid/widget/AdapterView;->fireOnSelected()V
 HSPLandroid/widget/AdapterView;->getCount()I
 HSPLandroid/widget/AdapterView;->getFirstVisiblePosition()I
 HSPLandroid/widget/AdapterView;->getItemIdAtPosition(I)J
 HSPLandroid/widget/AdapterView;->getLastVisiblePosition()I
 HSPLandroid/widget/AdapterView;->getSelectedItemId()J
 HSPLandroid/widget/AdapterView;->getSelectedItemPosition()I
-HSPLandroid/widget/AdapterView;->isInFilterMode()Z
 HSPLandroid/widget/AdapterView;->onDetachedFromWindow()V
 HSPLandroid/widget/AdapterView;->onLayout(ZIIII)V
-HSPLandroid/widget/AdapterView;->onProvideStructure(Landroid/view/ViewStructure;II)V
-HSPLandroid/widget/AdapterView;->performAccessibilityActionsOnSelected()V
 HSPLandroid/widget/AdapterView;->performItemClick(Landroid/view/View;IJ)Z
 HSPLandroid/widget/AdapterView;->rememberSyncState()V
-HSPLandroid/widget/AdapterView;->selectionChanged()V
 HSPLandroid/widget/AdapterView;->setEmptyView(Landroid/view/View;)V
 HSPLandroid/widget/AdapterView;->setFocusable(I)V
 HSPLandroid/widget/AdapterView;->setFocusableInTouchMode(Z)V
@@ -28736,45 +25600,13 @@
 HSPLandroid/widget/ArrayAdapter;-><init>(Landroid/content/Context;ILjava/util/List;)V
 HSPLandroid/widget/ArrayAdapter;->add(Ljava/lang/Object;)V
 HSPLandroid/widget/ArrayAdapter;->clear()V
-HSPLandroid/widget/ArrayAdapter;->createViewFromResource(Landroid/view/LayoutInflater;ILandroid/view/View;Landroid/view/ViewGroup;I)Landroid/view/View;
-HSPLandroid/widget/ArrayAdapter;->getAutofillOptions()[Ljava/lang/CharSequence;
 HSPLandroid/widget/ArrayAdapter;->getContext()Landroid/content/Context;
 HSPLandroid/widget/ArrayAdapter;->getCount()I
-HSPLandroid/widget/ArrayAdapter;->getDropDownViewTheme()Landroid/content/res/Resources$Theme;
 HSPLandroid/widget/ArrayAdapter;->getItem(I)Ljava/lang/Object;
 HSPLandroid/widget/ArrayAdapter;->getItemId(I)J
-HSPLandroid/widget/ArrayAdapter;->getView(ILandroid/view/View;Landroid/view/ViewGroup;)Landroid/view/View;
 HSPLandroid/widget/ArrayAdapter;->notifyDataSetChanged()V
-HSPLandroid/widget/ArrayAdapter;->setDropDownViewTheme(Landroid/content/res/Resources$Theme;)V
-HSPLandroid/widget/AutoCompleteTextView$DropDownItemClickListener;-><init>(Landroid/widget/AutoCompleteTextView;)V
-HSPLandroid/widget/AutoCompleteTextView$DropDownItemClickListener;-><init>(Landroid/widget/AutoCompleteTextView;Landroid/widget/AutoCompleteTextView$1;)V
-HSPLandroid/widget/AutoCompleteTextView$MyWatcher;-><init>(Landroid/widget/AutoCompleteTextView;)V
-HSPLandroid/widget/AutoCompleteTextView$MyWatcher;-><init>(Landroid/widget/AutoCompleteTextView;Landroid/widget/AutoCompleteTextView$1;)V
-HSPLandroid/widget/AutoCompleteTextView$MyWatcher;->afterTextChanged(Landroid/text/Editable;)V
-HSPLandroid/widget/AutoCompleteTextView$MyWatcher;->beforeTextChanged(Ljava/lang/CharSequence;III)V
-HSPLandroid/widget/AutoCompleteTextView$MyWatcher;->onTextChanged(Ljava/lang/CharSequence;III)V
-HSPLandroid/widget/AutoCompleteTextView$PassThroughClickListener;-><init>(Landroid/widget/AutoCompleteTextView;)V
-HSPLandroid/widget/AutoCompleteTextView$PassThroughClickListener;-><init>(Landroid/widget/AutoCompleteTextView;Landroid/widget/AutoCompleteTextView$1;)V
-HSPLandroid/widget/AutoCompleteTextView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V
-HSPLandroid/widget/AutoCompleteTextView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V
-HSPLandroid/widget/AutoCompleteTextView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;IILandroid/content/res/Resources$Theme;)V
-HSPLandroid/widget/AutoCompleteTextView;->dismissDropDown()V
-HSPLandroid/widget/AutoCompleteTextView;->getDropDownAnchor()I
-HSPLandroid/widget/AutoCompleteTextView;->getThreshold()I
-HSPLandroid/widget/AutoCompleteTextView;->isPopupShowing()Z
-HSPLandroid/widget/AutoCompleteTextView;->onAttachedToWindow()V
-HSPLandroid/widget/AutoCompleteTextView;->onDetachedFromWindow()V
-HSPLandroid/widget/AutoCompleteTextView;->onWindowFocusChanged(Z)V
-HSPLandroid/widget/AutoCompleteTextView;->refreshAutoCompleteResults()V
-HSPLandroid/widget/AutoCompleteTextView;->setCompletionHint(Ljava/lang/CharSequence;)V
-HSPLandroid/widget/AutoCompleteTextView;->setDropDownBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V
-HSPLandroid/widget/AutoCompleteTextView;->setFrame(IIII)Z
-HSPLandroid/widget/AutoCompleteTextView;->setOnClickListener(Landroid/view/View$OnClickListener;)V
-HSPLandroid/widget/AutoCompleteTextView;->setOnItemClickListener(Landroid/widget/AdapterView$OnItemClickListener;)V
-HSPLandroid/widget/AutoCompleteTextView;->setOnItemSelectedListener(Landroid/widget/AdapterView$OnItemSelectedListener;)V
 HSPLandroid/widget/BaseAdapter;-><init>()V
 HSPLandroid/widget/BaseAdapter;->areAllItemsEnabled()Z
-HSPLandroid/widget/BaseAdapter;->getAutofillOptions()[Ljava/lang/CharSequence;
 HSPLandroid/widget/BaseAdapter;->getItemViewType(I)I
 HSPLandroid/widget/BaseAdapter;->getViewTypeCount()I
 HSPLandroid/widget/BaseAdapter;->hasStableIds()Z
@@ -28796,12 +25628,10 @@
 HSPLandroid/widget/CheckedTextView;->applyCheckMarkTint()V
 HSPLandroid/widget/CheckedTextView;->drawableStateChanged()V
 HSPLandroid/widget/CheckedTextView;->internalSetPadding(IIII)V
-HSPLandroid/widget/CheckedTextView;->isCheckMarkAtStart()Z
 HSPLandroid/widget/CheckedTextView;->isChecked()Z
 HSPLandroid/widget/CheckedTextView;->jumpDrawablesToCurrentState()V
 HSPLandroid/widget/CheckedTextView;->onCreateDrawableState(I)[I
 HSPLandroid/widget/CheckedTextView;->onRtlPropertiesChanged(I)V
-HSPLandroid/widget/CheckedTextView;->setBasePadding(Z)V
 HSPLandroid/widget/CheckedTextView;->setCheckMarkDrawable(Landroid/graphics/drawable/Drawable;)V
 HSPLandroid/widget/CheckedTextView;->setCheckMarkDrawableInternal(Landroid/graphics/drawable/Drawable;I)V
 HSPLandroid/widget/CheckedTextView;->setChecked(Z)V
@@ -28820,7 +25650,6 @@
 HSPLandroid/widget/CompoundButton$SavedState;-><clinit>()V
 HSPLandroid/widget/CompoundButton$SavedState;-><init>(Landroid/os/Parcelable;)V
 HSPLandroid/widget/CompoundButton$SavedState;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/widget/CompoundButton;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V
 HSPLandroid/widget/CompoundButton;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V
 HSPLandroid/widget/CompoundButton;->applyButtonTint()V
 HSPLandroid/widget/CompoundButton;->drawableHotspotChanged(FF)V
@@ -28841,7 +25670,6 @@
 HSPLandroid/widget/CompoundButton;->onSaveInstanceState()Landroid/os/Parcelable;
 HSPLandroid/widget/CompoundButton;->performClick()Z
 HSPLandroid/widget/CompoundButton;->setButtonDrawable(Landroid/graphics/drawable/Drawable;)V
-HSPLandroid/widget/CompoundButton;->setButtonTintList(Landroid/content/res/ColorStateList;)V
 HSPLandroid/widget/CompoundButton;->setChecked(Z)V
 HSPLandroid/widget/CompoundButton;->setDefaultStateDescritption()V
 HSPLandroid/widget/CompoundButton;->setOnCheckedChangeListener(Landroid/widget/CompoundButton$OnCheckedChangeListener;)V
@@ -28912,7 +25740,6 @@
 HSPLandroid/widget/Editor$CorrectionHighlighter;->draw(Landroid/graphics/Canvas;I)V
 HSPLandroid/widget/Editor$CorrectionHighlighter;->highlight(Landroid/view/inputmethod/CorrectionInfo;)V
 HSPLandroid/widget/Editor$CorrectionHighlighter;->invalidate(Z)V
-HSPLandroid/widget/Editor$CorrectionHighlighter;->stopAnimation()V
 HSPLandroid/widget/Editor$CorrectionHighlighter;->updatePaint()Z
 HSPLandroid/widget/Editor$CorrectionHighlighter;->updatePath()Z
 HSPLandroid/widget/Editor$CursorAnchorInfoNotifier;-><init>(Landroid/widget/Editor;)V
@@ -28922,6 +25749,7 @@
 HSPLandroid/widget/Editor$EditOperation;->access$8300(Landroid/widget/Editor$EditOperation;)Ljava/lang/String;
 HSPLandroid/widget/Editor$EditOperation;->access$8400(Landroid/widget/Editor$EditOperation;)Ljava/lang/String;
 HSPLandroid/widget/Editor$EditOperation;->access$8600(Landroid/widget/Editor$EditOperation;Landroid/widget/Editor$EditOperation;)Z
+HSPLandroid/widget/Editor$EditOperation;->access$8700(Landroid/widget/Editor$EditOperation;)Ljava/lang/String;
 HSPLandroid/widget/Editor$EditOperation;->commit()V
 HSPLandroid/widget/Editor$EditOperation;->forceMergeWith(Landroid/widget/Editor$EditOperation;)V
 HSPLandroid/widget/Editor$EditOperation;->getNewTextEnd()I
@@ -28931,7 +25759,6 @@
 HSPLandroid/widget/Editor$EditOperation;->mergeReplaceWith(Landroid/widget/Editor$EditOperation;)Z
 HSPLandroid/widget/Editor$EditOperation;->mergeWith(Landroid/widget/Editor$EditOperation;)Z
 HSPLandroid/widget/Editor$EditOperation;->modifyText(Landroid/text/Editable;IILjava/lang/CharSequence;II)V
-HSPLandroid/widget/Editor$EditOperation;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/widget/Editor$HandleView;-><init>(Landroid/widget/Editor;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;I)V
 HSPLandroid/widget/Editor$HandleView;-><init>(Landroid/widget/Editor;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;ILandroid/widget/Editor$1;)V
 HSPLandroid/widget/Editor$HandleView;->addPositionToTouchUpFilter(I)V
@@ -28989,8 +25816,6 @@
 HSPLandroid/widget/Editor$InsertionPointCursorController;->show()V
 HSPLandroid/widget/Editor$MagnifierMotionAnimator;-><init>(Landroid/widget/Magnifier;)V
 HSPLandroid/widget/Editor$MagnifierMotionAnimator;-><init>(Landroid/widget/Magnifier;Landroid/widget/Editor$1;)V
-HSPLandroid/widget/Editor$MagnifierMotionAnimator;->access$100(Landroid/widget/Editor$MagnifierMotionAnimator;)V
-HSPLandroid/widget/Editor$MagnifierMotionAnimator;->update()V
 HSPLandroid/widget/Editor$PositionListener;-><init>(Landroid/widget/Editor;)V
 HSPLandroid/widget/Editor$PositionListener;-><init>(Landroid/widget/Editor;Landroid/widget/Editor$1;)V
 HSPLandroid/widget/Editor$PositionListener;->addSubscriber(Landroid/widget/Editor$TextViewPositionListener;Z)V
@@ -29038,7 +25863,6 @@
 HSPLandroid/widget/Editor$UndoInputFilter;->isComposition(Ljava/lang/CharSequence;)Z
 HSPLandroid/widget/Editor$UndoInputFilter;->isInTextWatcher()Z
 HSPLandroid/widget/Editor$UndoInputFilter;->recordEdit(Landroid/widget/Editor$EditOperation;I)V
-HSPLandroid/widget/Editor$UndoInputFilter;->restoreInstanceState(Landroid/os/Parcel;)V
 HSPLandroid/widget/Editor$UndoInputFilter;->saveInstanceState(Landroid/os/Parcel;)V
 HSPLandroid/widget/Editor;-><init>(Landroid/widget/TextView;)V
 HSPLandroid/widget/Editor;->access$000(Landroid/widget/Editor;)Landroid/widget/Editor$MagnifierMotionAnimator;
@@ -29053,7 +25877,6 @@
 HSPLandroid/widget/Editor;->access$6100(Landroid/widget/Editor;)Z
 HSPLandroid/widget/Editor;->access$6200(Landroid/widget/Editor;)Landroid/widget/EditorTouchState;
 HSPLandroid/widget/Editor;->access$7100(Landroid/widget/Editor;)Ljava/lang/Runnable;
-HSPLandroid/widget/Editor;->access$7200(Landroid/widget/Editor;)Z
 HSPLandroid/widget/Editor;->access$8100(Landroid/widget/Editor;)Landroid/content/UndoManager;
 HSPLandroid/widget/Editor;->access$8500(Landroid/widget/Editor;)Landroid/content/UndoOwner;
 HSPLandroid/widget/Editor;->access$8700(Ljava/lang/CharSequence;II)Z
@@ -29112,7 +25935,6 @@
 HSPLandroid/widget/Editor;->prepareCursorControllers()V
 HSPLandroid/widget/Editor;->refreshTextActionMode()V
 HSPLandroid/widget/Editor;->reportExtractedText()Z
-HSPLandroid/widget/Editor;->restoreInstanceState(Landroid/os/ParcelableParcel;)V
 HSPLandroid/widget/Editor;->resumeBlink()V
 HSPLandroid/widget/Editor;->saveInstanceState()Landroid/os/ParcelableParcel;
 HSPLandroid/widget/Editor;->sendOnTextChanged(III)V
@@ -29310,20 +26132,6 @@
 HSPLandroid/widget/GridLayout;->setUseDefaultMargins(Z)V
 HSPLandroid/widget/GridLayout;->spec(IILandroid/widget/GridLayout$Alignment;F)Landroid/widget/GridLayout$Spec;
 HSPLandroid/widget/GridLayout;->validateLayoutParams()V
-HSPLandroid/widget/HeaderViewListAdapter;-><init>(Ljava/util/ArrayList;Ljava/util/ArrayList;Landroid/widget/ListAdapter;)V
-HSPLandroid/widget/HeaderViewListAdapter;->areAllItemsEnabled()Z
-HSPLandroid/widget/HeaderViewListAdapter;->areAllListInfosSelectable(Ljava/util/ArrayList;)Z
-HSPLandroid/widget/HeaderViewListAdapter;->getCount()I
-HSPLandroid/widget/HeaderViewListAdapter;->getFootersCount()I
-HSPLandroid/widget/HeaderViewListAdapter;->getHeadersCount()I
-HSPLandroid/widget/HeaderViewListAdapter;->getItemId(I)J
-HSPLandroid/widget/HeaderViewListAdapter;->getItemViewType(I)I
-HSPLandroid/widget/HeaderViewListAdapter;->getView(ILandroid/view/View;Landroid/view/ViewGroup;)Landroid/view/View;
-HSPLandroid/widget/HeaderViewListAdapter;->getViewTypeCount()I
-HSPLandroid/widget/HeaderViewListAdapter;->hasStableIds()Z
-HSPLandroid/widget/HeaderViewListAdapter;->isEnabled(I)Z
-HSPLandroid/widget/HeaderViewListAdapter;->registerDataSetObserver(Landroid/database/DataSetObserver;)V
-HSPLandroid/widget/HeaderViewListAdapter;->unregisterDataSetObserver(Landroid/database/DataSetObserver;)V
 HSPLandroid/widget/HorizontalScrollView$SavedState$1;->createFromParcel(Landroid/os/Parcel;)Landroid/widget/HorizontalScrollView$SavedState;
 HSPLandroid/widget/HorizontalScrollView$SavedState$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLandroid/widget/HorizontalScrollView$SavedState;-><init>(Landroid/os/Parcel;)V
@@ -29383,8 +26191,6 @@
 HSPLandroid/widget/ImageView;->getBaseline()I
 HSPLandroid/widget/ImageView;->getDrawable()Landroid/graphics/drawable/Drawable;
 HSPLandroid/widget/ImageView;->getImageAlpha()I
-HSPLandroid/widget/ImageView;->getImageMatrix()Landroid/graphics/Matrix;
-HSPLandroid/widget/ImageView;->getMaxHeight()I
 HSPLandroid/widget/ImageView;->getScaleType()Landroid/widget/ImageView$ScaleType;
 HSPLandroid/widget/ImageView;->hasOverlappingRendering()Z
 HSPLandroid/widget/ImageView;->initImageView()V
@@ -29419,9 +26225,7 @@
 HSPLandroid/widget/ImageView;->setImageLevel(I)V
 HSPLandroid/widget/ImageView;->setImageMatrix(Landroid/graphics/Matrix;)V
 HSPLandroid/widget/ImageView;->setImageResource(I)V
-HSPLandroid/widget/ImageView;->setImageTintBlendMode(Landroid/graphics/BlendMode;)V
 HSPLandroid/widget/ImageView;->setImageTintList(Landroid/content/res/ColorStateList;)V
-HSPLandroid/widget/ImageView;->setImageTintMode(Landroid/graphics/PorterDuff$Mode;)V
 HSPLandroid/widget/ImageView;->setMaxHeight(I)V
 HSPLandroid/widget/ImageView;->setMaxWidth(I)V
 HSPLandroid/widget/ImageView;->setScaleType(Landroid/widget/ImageView$ScaleType;)V
@@ -29442,7 +26246,6 @@
 HSPLandroid/widget/LinearLayout;->checkLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Z
 HSPLandroid/widget/LinearLayout;->drawDividersHorizontal(Landroid/graphics/Canvas;)V
 HSPLandroid/widget/LinearLayout;->drawDividersVertical(Landroid/graphics/Canvas;)V
-HSPLandroid/widget/LinearLayout;->drawHorizontalDivider(Landroid/graphics/Canvas;I)V
 HSPLandroid/widget/LinearLayout;->forceUniformHeight(II)V
 HSPLandroid/widget/LinearLayout;->forceUniformWidth(II)V
 HSPLandroid/widget/LinearLayout;->generateDefaultLayoutParams()Landroid/view/ViewGroup$LayoutParams;
@@ -29482,7 +26285,6 @@
 HSPLandroid/widget/ListPopupWindow$ListSelectorHider;-><init>(Landroid/widget/ListPopupWindow;Landroid/widget/ListPopupWindow$1;)V
 HSPLandroid/widget/ListPopupWindow$PopupDataSetObserver;-><init>(Landroid/widget/ListPopupWindow;)V
 HSPLandroid/widget/ListPopupWindow$PopupDataSetObserver;-><init>(Landroid/widget/ListPopupWindow;Landroid/widget/ListPopupWindow$1;)V
-HSPLandroid/widget/ListPopupWindow$PopupDataSetObserver;->onChanged()V
 HSPLandroid/widget/ListPopupWindow$PopupScrollListener;-><init>(Landroid/widget/ListPopupWindow;)V
 HSPLandroid/widget/ListPopupWindow$PopupScrollListener;-><init>(Landroid/widget/ListPopupWindow;Landroid/widget/ListPopupWindow$1;)V
 HSPLandroid/widget/ListPopupWindow$PopupTouchInterceptor;-><init>(Landroid/widget/ListPopupWindow;)V
@@ -29491,29 +26293,17 @@
 HSPLandroid/widget/ListPopupWindow$ResizePopupRunnable;-><init>(Landroid/widget/ListPopupWindow;Landroid/widget/ListPopupWindow$1;)V
 HSPLandroid/widget/ListPopupWindow;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V
 HSPLandroid/widget/ListPopupWindow;->dismiss()V
-HSPLandroid/widget/ListPopupWindow;->isDropDownAlwaysVisible()Z
 HSPLandroid/widget/ListPopupWindow;->isShowing()Z
 HSPLandroid/widget/ListPopupWindow;->setAdapter(Landroid/widget/ListAdapter;)V
 HSPLandroid/widget/ListPopupWindow;->setAnchorView(Landroid/view/View;)V
-HSPLandroid/widget/ListPopupWindow;->setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V
-HSPLandroid/widget/ListPopupWindow;->setHeight(I)V
-HSPLandroid/widget/ListPopupWindow;->setListSelector(Landroid/graphics/drawable/Drawable;)V
 HSPLandroid/widget/ListPopupWindow;->setModal(Z)V
 HSPLandroid/widget/ListPopupWindow;->setOnItemClickListener(Landroid/widget/AdapterView$OnItemClickListener;)V
-HSPLandroid/widget/ListPopupWindow;->setPromptPosition(I)V
-HSPLandroid/widget/ListPopupWindow;->setPromptView(Landroid/view/View;)V
-HSPLandroid/widget/ListPopupWindow;->setSoftInputMode(I)V
-HSPLandroid/widget/ListPopupWindow;->setWidth(I)V
 HSPLandroid/widget/ListView$ArrowScrollFocusResult;-><init>()V
 HSPLandroid/widget/ListView$ArrowScrollFocusResult;-><init>(Landroid/widget/ListView$1;)V
-HSPLandroid/widget/ListView$FixedViewInfo;-><init>(Landroid/widget/ListView;)V
 HSPLandroid/widget/ListView;-><init>(Landroid/content/Context;)V
 HSPLandroid/widget/ListView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
 HSPLandroid/widget/ListView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V
 HSPLandroid/widget/ListView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V
-HSPLandroid/widget/ListView;->addFooterView(Landroid/view/View;Ljava/lang/Object;Z)V
-HSPLandroid/widget/ListView;->addHeaderView(Landroid/view/View;)V
-HSPLandroid/widget/ListView;->addHeaderView(Landroid/view/View;Ljava/lang/Object;Z)V
 HSPLandroid/widget/ListView;->adjustViewsUpOrDown()V
 HSPLandroid/widget/ListView;->clearRecycledState(Ljava/util/ArrayList;)V
 HSPLandroid/widget/ListView;->correctTooHigh(I)V
@@ -29530,7 +26320,6 @@
 HSPLandroid/widget/ListView;->getAccessibilityClassName()Ljava/lang/CharSequence;
 HSPLandroid/widget/ListView;->getAdapter()Landroid/widget/Adapter;
 HSPLandroid/widget/ListView;->getAdapter()Landroid/widget/ListAdapter;
-HSPLandroid/widget/ListView;->getDividerHeight()I
 HSPLandroid/widget/ListView;->getFooterViewsCount()I
 HSPLandroid/widget/ListView;->getHeaderViewsCount()I
 HSPLandroid/widget/ListView;->isOpaque()Z
@@ -29553,7 +26342,6 @@
 HSPLandroid/widget/ListView;->setSelection(I)V
 HSPLandroid/widget/ListView;->setupChild(Landroid/view/View;IIZIZZ)V
 HSPLandroid/widget/ListView;->trackMotionScroll(II)Z
-HSPLandroid/widget/ListView;->wrapHeaderListAdapterInternal(Ljava/util/ArrayList;Ljava/util/ArrayList;Landroid/widget/ListAdapter;)Landroid/widget/HeaderViewListAdapter;
 HSPLandroid/widget/Magnifier$Builder;-><init>(Landroid/view/View;)V
 HSPLandroid/widget/Magnifier$Builder;->access$000(Landroid/widget/Magnifier$Builder;)I
 HSPLandroid/widget/Magnifier$Builder;->access$002(Landroid/widget/Magnifier$Builder;I)I
@@ -29610,7 +26398,6 @@
 HSPLandroid/widget/OverScroller$SplineOverScroller;->onEdgeReached()V
 HSPLandroid/widget/OverScroller$SplineOverScroller;->springback(III)Z
 HSPLandroid/widget/OverScroller$SplineOverScroller;->startAfterEdge(IIII)V
-HSPLandroid/widget/OverScroller$SplineOverScroller;->startBounceAfterEdge(III)V
 HSPLandroid/widget/OverScroller$SplineOverScroller;->startScroll(III)V
 HSPLandroid/widget/OverScroller$SplineOverScroller;->startSpringback(III)V
 HSPLandroid/widget/OverScroller$SplineOverScroller;->update()Z
@@ -29652,8 +26439,6 @@
 HSPLandroid/widget/PopupWindow$PopupDecorView$3;-><init>(Landroid/widget/PopupWindow$PopupDecorView;Landroid/graphics/Rect;)V
 HSPLandroid/widget/PopupWindow$PopupDecorView$4;-><init>(Landroid/widget/PopupWindow$PopupDecorView;)V
 HSPLandroid/widget/PopupWindow$PopupDecorView;-><init>(Landroid/widget/PopupWindow;Landroid/content/Context;)V
-HSPLandroid/widget/PopupWindow$PopupDecorView;->access$400(Landroid/widget/PopupWindow$PopupDecorView;Landroid/transition/Transition;)V
-HSPLandroid/widget/PopupWindow$PopupDecorView;->access$500(Landroid/widget/PopupWindow$PopupDecorView;)Ljava/lang/Runnable;
 HSPLandroid/widget/PopupWindow$PopupDecorView;->cancelTransitions()V
 HSPLandroid/widget/PopupWindow$PopupDecorView;->dispatchTouchEvent(Landroid/view/MotionEvent;)Z
 HSPLandroid/widget/PopupWindow$PopupDecorView;->lambda$startExitTransition$0$PopupWindow$PopupDecorView(Landroid/transition/Transition$TransitionListener;Landroid/transition/Transition;Landroid/view/View;)V
@@ -29661,14 +26446,11 @@
 HSPLandroid/widget/PopupWindow$PopupDecorView;->requestEnterTransition(Landroid/transition/Transition;)V
 HSPLandroid/widget/PopupWindow$PopupDecorView;->startEnterTransition(Landroid/transition/Transition;)V
 HSPLandroid/widget/PopupWindow$PopupDecorView;->startExitTransition(Landroid/transition/Transition;Landroid/view/View;Landroid/graphics/Rect;Landroid/transition/Transition$TransitionListener;)V
-HSPLandroid/widget/PopupWindow;-><init>(Landroid/content/Context;)V
-HSPLandroid/widget/PopupWindow;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
 HSPLandroid/widget/PopupWindow;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V
 HSPLandroid/widget/PopupWindow;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V
 HSPLandroid/widget/PopupWindow;-><init>(Landroid/view/View;)V
 HSPLandroid/widget/PopupWindow;-><init>(Landroid/view/View;II)V
 HSPLandroid/widget/PopupWindow;-><init>(Landroid/view/View;IIZ)V
-HSPLandroid/widget/PopupWindow;->access$200(Landroid/widget/PopupWindow;Landroid/view/View;Landroid/view/ViewGroup;Landroid/view/View;)V
 HSPLandroid/widget/PopupWindow;->access$300(Landroid/widget/PopupWindow;)Landroid/view/View$OnTouchListener;
 HSPLandroid/widget/PopupWindow;->access$700(Landroid/widget/PopupWindow;)Z
 HSPLandroid/widget/PopupWindow;->alignToAnchor()V
@@ -29700,7 +26482,6 @@
 HSPLandroid/widget/PopupWindow;->isShowing()Z
 HSPLandroid/widget/PopupWindow;->isSplitTouchEnabled()Z
 HSPLandroid/widget/PopupWindow;->isTransitioningToDismiss()Z
-HSPLandroid/widget/PopupWindow;->lambda$new$0$PopupWindow(Landroid/view/View;IIIIIIII)V
 HSPLandroid/widget/PopupWindow;->preparePopup(Landroid/view/WindowManager$LayoutParams;)V
 HSPLandroid/widget/PopupWindow;->setAnimationStyle(I)V
 HSPLandroid/widget/PopupWindow;->setAttachedInDecor(Z)V
@@ -29717,7 +26498,6 @@
 HSPLandroid/widget/PopupWindow;->setLayoutDirectionFromAnchor()V
 HSPLandroid/widget/PopupWindow;->setOnDismissListener(Landroid/widget/PopupWindow$OnDismissListener;)V
 HSPLandroid/widget/PopupWindow;->setOutsideTouchable(Z)V
-HSPLandroid/widget/PopupWindow;->setSoftInputMode(I)V
 HSPLandroid/widget/PopupWindow;->setSplitTouchEnabled(Z)V
 HSPLandroid/widget/PopupWindow;->setTouchInterceptor(Landroid/view/View$OnTouchListener;)V
 HSPLandroid/widget/PopupWindow;->setWidth(I)V
@@ -29729,9 +26509,7 @@
 HSPLandroid/widget/PopupWindow;->tryFitVertical(Landroid/view/WindowManager$LayoutParams;IIIIIIIZ)Z
 HSPLandroid/widget/PopupWindow;->update(IIII)V
 HSPLandroid/widget/PopupWindow;->update(IIIIZ)V
-HSPLandroid/widget/PopupWindow;->update(Landroid/view/View;IIII)V
 HSPLandroid/widget/PopupWindow;->update(Landroid/view/View;Landroid/view/WindowManager$LayoutParams;)V
-HSPLandroid/widget/PopupWindow;->update(Landroid/view/View;ZIIII)V
 HSPLandroid/widget/PopupWindow;->updateAboveAnchor(Z)V
 HSPLandroid/widget/ProgressBar$1;-><init>(Landroid/widget/ProgressBar;Ljava/lang/String;)V
 HSPLandroid/widget/ProgressBar$1;->get(Landroid/widget/ProgressBar;)Ljava/lang/Float;
@@ -29825,7 +26603,6 @@
 HSPLandroid/widget/RelativeLayout$DependencyGraph;->getSortedViews([Landroid/view/View;[I)V
 HSPLandroid/widget/RelativeLayout$LayoutParams;-><init>(II)V
 HSPLandroid/widget/RelativeLayout$LayoutParams;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLandroid/widget/RelativeLayout$LayoutParams;-><init>(Landroid/view/ViewGroup$LayoutParams;)V
 HSPLandroid/widget/RelativeLayout$LayoutParams;-><init>(Landroid/view/ViewGroup$MarginLayoutParams;)V
 HSPLandroid/widget/RelativeLayout$LayoutParams;->access$100(Landroid/widget/RelativeLayout$LayoutParams;)I
 HSPLandroid/widget/RelativeLayout$LayoutParams;->access$102(Landroid/widget/RelativeLayout$LayoutParams;I)I
@@ -29850,10 +26627,6 @@
 HSPLandroid/widget/RelativeLayout$LayoutParams;->resolveLayoutDirection(I)V
 HSPLandroid/widget/RelativeLayout$LayoutParams;->resolveRules(I)V
 HSPLandroid/widget/RelativeLayout$LayoutParams;->shouldResolveLayoutDirection(I)Z
-HSPLandroid/widget/RelativeLayout$TopToBottomLeftToRightComparator;-><init>(Landroid/widget/RelativeLayout;)V
-HSPLandroid/widget/RelativeLayout$TopToBottomLeftToRightComparator;-><init>(Landroid/widget/RelativeLayout;Landroid/widget/RelativeLayout$1;)V
-HSPLandroid/widget/RelativeLayout$TopToBottomLeftToRightComparator;->compare(Landroid/view/View;Landroid/view/View;)I
-HSPLandroid/widget/RelativeLayout$TopToBottomLeftToRightComparator;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
 HSPLandroid/widget/RelativeLayout;-><init>(Landroid/content/Context;)V
 HSPLandroid/widget/RelativeLayout;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
 HSPLandroid/widget/RelativeLayout;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V
@@ -29864,7 +26637,6 @@
 HSPLandroid/widget/RelativeLayout;->centerVertical(Landroid/view/View;Landroid/widget/RelativeLayout$LayoutParams;I)V
 HSPLandroid/widget/RelativeLayout;->checkLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Z
 HSPLandroid/widget/RelativeLayout;->compareLayoutPosition(Landroid/widget/RelativeLayout$LayoutParams;Landroid/widget/RelativeLayout$LayoutParams;)I
-HSPLandroid/widget/RelativeLayout;->dispatchPopulateAccessibilityEventInternal(Landroid/view/accessibility/AccessibilityEvent;)Z
 HSPLandroid/widget/RelativeLayout;->generateDefaultLayoutParams()Landroid/view/ViewGroup$LayoutParams;
 HSPLandroid/widget/RelativeLayout;->generateLayoutParams(Landroid/util/AttributeSet;)Landroid/view/ViewGroup$LayoutParams;
 HSPLandroid/widget/RelativeLayout;->generateLayoutParams(Landroid/util/AttributeSet;)Landroid/widget/RelativeLayout$LayoutParams;
@@ -29949,7 +26721,6 @@
 HSPLandroid/widget/RemoteViews$RuntimeAction;-><init>(Landroid/widget/RemoteViews$1;)V
 HSPLandroid/widget/RemoteViews$SetDrawableTint;-><init>(Landroid/widget/RemoteViews;IZILandroid/graphics/PorterDuff$Mode;)V
 HSPLandroid/widget/RemoteViews$SetDrawableTint;->apply(Landroid/view/View;Landroid/view/ViewGroup;Landroid/widget/RemoteViews$OnClickHandler;)V
-HSPLandroid/widget/RemoteViews$SetIntTagAction;-><init>(Landroid/widget/RemoteViews;III)V
 HSPLandroid/widget/RemoteViews$SetIntTagAction;->apply(Landroid/view/View;Landroid/view/ViewGroup;Landroid/widget/RemoteViews$OnClickHandler;)V
 HSPLandroid/widget/RemoteViews$SetOnClickResponse;-><init>(Landroid/widget/RemoteViews;ILandroid/widget/RemoteViews$RemoteResponse;)V
 HSPLandroid/widget/RemoteViews$SetOnClickResponse;-><init>(Landroid/widget/RemoteViews;Landroid/os/Parcel;)V
@@ -29980,7 +26751,6 @@
 HSPLandroid/widget/RemoteViews$ViewTree;-><init>(Landroid/view/View;)V
 HSPLandroid/widget/RemoteViews$ViewTree;-><init>(Landroid/view/View;Landroid/widget/RemoteViews$1;)V
 HSPLandroid/widget/RemoteViews$ViewTree;->access$1400(Landroid/widget/RemoteViews$ViewTree;)Landroid/view/View;
-HSPLandroid/widget/RemoteViews$ViewTree;->access$2002(Landroid/widget/RemoteViews$ViewTree;Ljava/util/ArrayList;)Ljava/util/ArrayList;
 HSPLandroid/widget/RemoteViews$ViewTree;->addChild(Landroid/widget/RemoteViews$ViewTree;I)V
 HSPLandroid/widget/RemoteViews$ViewTree;->addViewChild(Landroid/view/View;)V
 HSPLandroid/widget/RemoteViews$ViewTree;->createTree()V
@@ -30028,7 +26798,6 @@
 HSPLandroid/widget/RemoteViews;->reapply(Landroid/content/Context;Landroid/view/View;)V
 HSPLandroid/widget/RemoteViews;->reapply(Landroid/content/Context;Landroid/view/View;Landroid/widget/RemoteViews$OnClickHandler;)V
 HSPLandroid/widget/RemoteViews;->reapplyAsync(Landroid/content/Context;Landroid/view/View;Ljava/util/concurrent/Executor;Landroid/widget/RemoteViews$OnViewAppliedListener;Landroid/widget/RemoteViews$OnClickHandler;)Landroid/os/CancellationSignal;
-HSPLandroid/widget/RemoteViews;->reduceImageSizes(II)V
 HSPLandroid/widget/RemoteViews;->removeAllViews(I)V
 HSPLandroid/widget/RemoteViews;->setBitmap(ILjava/lang/String;Landroid/graphics/Bitmap;)V
 HSPLandroid/widget/RemoteViews;->setBitmapCache(Landroid/widget/RemoteViews$BitmapCache;)V
@@ -30107,7 +26876,6 @@
 HSPLandroid/widget/ScrollView;->inChild(II)Z
 HSPLandroid/widget/ScrollView;->initScrollView()V
 HSPLandroid/widget/ScrollView;->initVelocityTrackerIfNotExists()V
-HSPLandroid/widget/ScrollView;->isWithinDeltaOfScreen(Landroid/view/View;II)Z
 HSPLandroid/widget/ScrollView;->measureChildWithMargins(Landroid/view/View;IIII)V
 HSPLandroid/widget/ScrollView;->onDetachedFromWindow()V
 HSPLandroid/widget/ScrollView;->onInterceptTouchEvent(Landroid/view/MotionEvent;)Z
@@ -30120,10 +26888,8 @@
 HSPLandroid/widget/ScrollView;->onTouchEvent(Landroid/view/MotionEvent;)Z
 HSPLandroid/widget/ScrollView;->recycleVelocityTracker()V
 HSPLandroid/widget/ScrollView;->requestChildFocus(Landroid/view/View;Landroid/view/View;)V
-HSPLandroid/widget/ScrollView;->requestChildRectangleOnScreen(Landroid/view/View;Landroid/graphics/Rect;Z)Z
 HSPLandroid/widget/ScrollView;->requestLayout()V
 HSPLandroid/widget/ScrollView;->scrollTo(II)V
-HSPLandroid/widget/ScrollView;->scrollToChildRect(Landroid/graphics/Rect;Z)Z
 HSPLandroid/widget/ScrollView;->scrollToDescendant(Landroid/view/View;)V
 HSPLandroid/widget/ScrollView;->setFillViewport(Z)V
 HSPLandroid/widget/ScrollView;->shouldDelayChildPressedState()Z
@@ -30204,28 +26970,6 @@
 HSPLandroid/widget/SpellChecker;->setLocale(Ljava/util/Locale;)V
 HSPLandroid/widget/SpellChecker;->spellCheck()V
 HSPLandroid/widget/SpellChecker;->spellCheck(II)V
-HSPLandroid/widget/Spinner$1;-><init>(Landroid/widget/Spinner;Landroid/view/View;Landroid/widget/Spinner$DropdownPopup;)V
-HSPLandroid/widget/Spinner$DropDownAdapter;-><init>(Landroid/widget/SpinnerAdapter;Landroid/content/res/Resources$Theme;)V
-HSPLandroid/widget/Spinner$DropDownAdapter;->registerDataSetObserver(Landroid/database/DataSetObserver;)V
-HSPLandroid/widget/Spinner$DropdownPopup$1;-><init>(Landroid/widget/Spinner$DropdownPopup;Landroid/widget/Spinner;)V
-HSPLandroid/widget/Spinner$DropdownPopup;-><init>(Landroid/widget/Spinner;Landroid/content/Context;Landroid/util/AttributeSet;II)V
-HSPLandroid/widget/Spinner$DropdownPopup;->setAdapter(Landroid/widget/ListAdapter;)V
-HSPLandroid/widget/Spinner$DropdownPopup;->setPromptText(Ljava/lang/CharSequence;)V
-HSPLandroid/widget/Spinner$SavedState$1;-><init>()V
-HSPLandroid/widget/Spinner$SavedState;-><clinit>()V
-HSPLandroid/widget/Spinner$SavedState;-><init>(Landroid/os/Parcelable;)V
-HSPLandroid/widget/Spinner$SavedState;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/widget/Spinner;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V
-HSPLandroid/widget/Spinner;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;III)V
-HSPLandroid/widget/Spinner;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;IIILandroid/content/res/Resources$Theme;)V
-HSPLandroid/widget/Spinner;->layout(IZ)V
-HSPLandroid/widget/Spinner;->makeView(IZ)Landroid/view/View;
-HSPLandroid/widget/Spinner;->onDetachedFromWindow()V
-HSPLandroid/widget/Spinner;->onLayout(ZIIII)V
-HSPLandroid/widget/Spinner;->onMeasure(II)V
-HSPLandroid/widget/Spinner;->onSaveInstanceState()Landroid/os/Parcelable;
-HSPLandroid/widget/Spinner;->setAdapter(Landroid/widget/SpinnerAdapter;)V
-HSPLandroid/widget/Spinner;->setUpChild(Landroid/view/View;Z)V
 HSPLandroid/widget/Switch$1;->get(Landroid/widget/Switch;)Ljava/lang/Float;
 HSPLandroid/widget/Switch$1;->get(Ljava/lang/Object;)Ljava/lang/Object;
 HSPLandroid/widget/Switch$1;->setValue(Landroid/widget/Switch;F)V
@@ -30299,11 +27043,6 @@
 HSPLandroid/widget/TextView$Drawables;->applyErrorDrawableIfNeeded(I)V
 HSPLandroid/widget/TextView$Drawables;->hasMetadata()Z
 HSPLandroid/widget/TextView$Drawables;->resolveWithLayoutDirection(I)Z
-HSPLandroid/widget/TextView$SavedState$1;->createFromParcel(Landroid/os/Parcel;)Landroid/widget/TextView$SavedState;
-HSPLandroid/widget/TextView$SavedState$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLandroid/widget/TextView$SavedState;-><init>(Landroid/os/Parcel;)V
-HSPLandroid/widget/TextView$SavedState;-><init>(Landroid/os/Parcel;Landroid/widget/TextView$1;)V
-HSPLandroid/widget/TextView$SavedState;-><init>(Landroid/os/Parcelable;)V
 HSPLandroid/widget/TextView$SavedState;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLandroid/widget/TextView$TextAppearanceAttributes;-><init>()V
 HSPLandroid/widget/TextView$TextAppearanceAttributes;-><init>(Landroid/widget/TextView$1;)V
@@ -30324,21 +27063,13 @@
 HSPLandroid/widget/TextView;->beginBatchEdit()V
 HSPLandroid/widget/TextView;->bringPointIntoView(I)Z
 HSPLandroid/widget/TextView;->bringTextIntoView()Z
-HSPLandroid/widget/TextView;->canCopy()Z
-HSPLandroid/widget/TextView;->canCut()Z
 HSPLandroid/widget/TextView;->canMarquee()Z
-HSPLandroid/widget/TextView;->canPaste()Z
-HSPLandroid/widget/TextView;->canProcessText()Z
-HSPLandroid/widget/TextView;->canShare()Z
 HSPLandroid/widget/TextView;->cancelLongPress()V
 HSPLandroid/widget/TextView;->checkForRelayout()V
 HSPLandroid/widget/TextView;->checkForResize()V
-HSPLandroid/widget/TextView;->cleanupAutoSizePresetSizes([I)[I
 HSPLandroid/widget/TextView;->compressText(F)Z
 HSPLandroid/widget/TextView;->computeHorizontalScrollRange()I
 HSPLandroid/widget/TextView;->computeScroll()V
-HSPLandroid/widget/TextView;->computeVerticalScrollExtent()I
-HSPLandroid/widget/TextView;->computeVerticalScrollRange()I
 HSPLandroid/widget/TextView;->convertFromViewportToContentCoordinates(Landroid/graphics/Rect;)V
 HSPLandroid/widget/TextView;->convertToLocalHorizontalCoordinate(F)F
 HSPLandroid/widget/TextView;->createEditorIfNeeded()V
@@ -30348,19 +27079,16 @@
 HSPLandroid/widget/TextView;->drawableHotspotChanged(FF)V
 HSPLandroid/widget/TextView;->drawableStateChanged()V
 HSPLandroid/widget/TextView;->endBatchEdit()V
-HSPLandroid/widget/TextView;->findLargestTextSizeWhichFits(Landroid/graphics/RectF;)I
 HSPLandroid/widget/TextView;->fixFocusableAndClickableSettings()V
 HSPLandroid/widget/TextView;->getAccessibilityClassName()Ljava/lang/CharSequence;
 HSPLandroid/widget/TextView;->getAccessibilitySelectionEnd()I
 HSPLandroid/widget/TextView;->getAccessibilitySelectionStart()I
-HSPLandroid/widget/TextView;->getAutoSizeStepGranularity()I
 HSPLandroid/widget/TextView;->getAutofillType()I
 HSPLandroid/widget/TextView;->getAutofillValue()Landroid/view/autofill/AutofillValue;
 HSPLandroid/widget/TextView;->getBaseline()I
 HSPLandroid/widget/TextView;->getBaselineOffset()I
 HSPLandroid/widget/TextView;->getBottomVerticalOffset(Z)I
 HSPLandroid/widget/TextView;->getBoxHeight(Landroid/text/Layout;)I
-HSPLandroid/widget/TextView;->getBreakStrategy()I
 HSPLandroid/widget/TextView;->getCompoundDrawablePadding()I
 HSPLandroid/widget/TextView;->getCompoundDrawables()[Landroid/graphics/drawable/Drawable;
 HSPLandroid/widget/TextView;->getCompoundDrawablesRelative()[Landroid/graphics/drawable/Drawable;
@@ -30385,16 +27113,13 @@
 HSPLandroid/widget/TextView;->getFreezesText()Z
 HSPLandroid/widget/TextView;->getGravity()I
 HSPLandroid/widget/TextView;->getHint()Ljava/lang/CharSequence;
-HSPLandroid/widget/TextView;->getHorizontalFadingEdgeStrength(FF)F
 HSPLandroid/widget/TextView;->getHorizontalOffsetForDrawables()I
 HSPLandroid/widget/TextView;->getHorizontallyScrolling()Z
-HSPLandroid/widget/TextView;->getHyphenationFrequency()I
 HSPLandroid/widget/TextView;->getIncludeFontPadding()Z
 HSPLandroid/widget/TextView;->getInputMethodManager()Landroid/view/inputmethod/InputMethodManager;
 HSPLandroid/widget/TextView;->getInputType()I
 HSPLandroid/widget/TextView;->getInterestingRect(Landroid/graphics/Rect;I)V
 HSPLandroid/widget/TextView;->getIterableTextForAccessibility()Ljava/lang/CharSequence;
-HSPLandroid/widget/TextView;->getJustificationMode()I
 HSPLandroid/widget/TextView;->getKeyListener()Landroid/text/method/KeyListener;
 HSPLandroid/widget/TextView;->getLayout()Landroid/text/Layout;
 HSPLandroid/widget/TextView;->getLayoutAlignment()Landroid/text/Layout$Alignment;
@@ -30408,8 +27133,6 @@
 HSPLandroid/widget/TextView;->getMaxEms()I
 HSPLandroid/widget/TextView;->getMaxLines()I
 HSPLandroid/widget/TextView;->getMinEms()I
-HSPLandroid/widget/TextView;->getMinHeight()I
-HSPLandroid/widget/TextView;->getMinWidth()I
 HSPLandroid/widget/TextView;->getMovementMethod()Landroid/text/method/MovementMethod;
 HSPLandroid/widget/TextView;->getOffsetAtCoordinate(IF)I
 HSPLandroid/widget/TextView;->getOffsetForPosition(FF)I
@@ -30455,7 +27178,6 @@
 HSPLandroid/widget/TextView;->invalidateRegion(IIZ)V
 HSPLandroid/widget/TextView;->isAutoSizeEnabled()Z
 HSPLandroid/widget/TextView;->isAutofillable()Z
-HSPLandroid/widget/TextView;->isDeviceProvisioned()Z
 HSPLandroid/widget/TextView;->isDirectionalNavigationKey(I)Z
 HSPLandroid/widget/TextView;->isInBatchEditMode()Z
 HSPLandroid/widget/TextView;->isInExtractedMode()Z
@@ -30466,7 +27188,6 @@
 HSPLandroid/widget/TextView;->isPasswordInputType(I)Z
 HSPLandroid/widget/TextView;->isPositionVisible(FF)Z
 HSPLandroid/widget/TextView;->isShowingHint()Z
-HSPLandroid/widget/TextView;->isSingleLine()Z
 HSPLandroid/widget/TextView;->isSuggestionsEnabled()Z
 HSPLandroid/widget/TextView;->isTextEditable()Z
 HSPLandroid/widget/TextView;->isTextSelectable()Z
@@ -30482,7 +27203,6 @@
 HSPLandroid/widget/TextView;->onCheckIsTextEditor()Z
 HSPLandroid/widget/TextView;->onCommitCorrection(Landroid/view/inputmethod/CorrectionInfo;)V
 HSPLandroid/widget/TextView;->onConfigurationChanged(Landroid/content/res/Configuration;)V
-HSPLandroid/widget/TextView;->onCreateContextMenu(Landroid/view/ContextMenu;)V
 HSPLandroid/widget/TextView;->onCreateDrawableState(I)[I
 HSPLandroid/widget/TextView;->onCreateInputConnection(Landroid/view/inputmethod/EditorInfo;)Landroid/view/inputmethod/InputConnection;
 HSPLandroid/widget/TextView;->onDetachedFromWindowInternal()V
@@ -30529,15 +27249,11 @@
 HSPLandroid/widget/TextView;->sendAfterTextChanged(Landroid/text/Editable;)V
 HSPLandroid/widget/TextView;->sendBeforeTextChanged(Ljava/lang/CharSequence;III)V
 HSPLandroid/widget/TextView;->sendOnTextChanged(Ljava/lang/CharSequence;III)V
-HSPLandroid/widget/TextView;->setAllCaps(Z)V
-HSPLandroid/widget/TextView;->setAutoSizeTextTypeUniformWithPresetSizes([II)V
 HSPLandroid/widget/TextView;->setBreakStrategy(I)V
 HSPLandroid/widget/TextView;->setCompoundDrawablePadding(I)V
 HSPLandroid/widget/TextView;->setCompoundDrawableTintList(Landroid/content/res/ColorStateList;)V
 HSPLandroid/widget/TextView;->setCompoundDrawables(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V
 HSPLandroid/widget/TextView;->setCompoundDrawablesRelative(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V
-HSPLandroid/widget/TextView;->setCompoundDrawablesRelativeWithIntrinsicBounds(IIII)V
-HSPLandroid/widget/TextView;->setCompoundDrawablesRelativeWithIntrinsicBounds(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V
 HSPLandroid/widget/TextView;->setCompoundDrawablesWithIntrinsicBounds(IIII)V
 HSPLandroid/widget/TextView;->setCompoundDrawablesWithIntrinsicBounds(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V
 HSPLandroid/widget/TextView;->setCursorVisible(Z)V
@@ -30549,14 +27265,11 @@
 HSPLandroid/widget/TextView;->setFontFeatureSettings(Ljava/lang/String;)V
 HSPLandroid/widget/TextView;->setFrame(IIII)Z
 HSPLandroid/widget/TextView;->setGravity(I)V
-HSPLandroid/widget/TextView;->setHeight(I)V
 HSPLandroid/widget/TextView;->setHighlightColor(I)V
-HSPLandroid/widget/TextView;->setHint(I)V
 HSPLandroid/widget/TextView;->setHint(Ljava/lang/CharSequence;)V
 HSPLandroid/widget/TextView;->setHintInternal(Ljava/lang/CharSequence;)V
 HSPLandroid/widget/TextView;->setHintTextColor(Landroid/content/res/ColorStateList;)V
 HSPLandroid/widget/TextView;->setHorizontallyScrolling(Z)V
-HSPLandroid/widget/TextView;->setImeOptions(I)V
 HSPLandroid/widget/TextView;->setIncludeFontPadding(Z)V
 HSPLandroid/widget/TextView;->setInputType(I)V
 HSPLandroid/widget/TextView;->setInputType(IZ)V
@@ -30581,7 +27294,6 @@
 HSPLandroid/widget/TextView;->setPadding(IIII)V
 HSPLandroid/widget/TextView;->setPaddingRelative(IIII)V
 HSPLandroid/widget/TextView;->setPaintFlags(I)V
-HSPLandroid/widget/TextView;->setPrivateImeOptions(Ljava/lang/String;)V
 HSPLandroid/widget/TextView;->setRawInputType(I)V
 HSPLandroid/widget/TextView;->setRawTextSize(FZ)V
 HSPLandroid/widget/TextView;->setRelativeDrawablesIfNeeded(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V
@@ -30608,15 +27320,12 @@
 HSPLandroid/widget/TextView;->setTypeface(Landroid/graphics/Typeface;I)V
 HSPLandroid/widget/TextView;->setTypefaceFromAttrs(Landroid/graphics/Typeface;Ljava/lang/String;III)V
 HSPLandroid/widget/TextView;->setWidth(I)V
-HSPLandroid/widget/TextView;->setupAutoSizeText()Z
-HSPLandroid/widget/TextView;->setupAutoSizeUniformPresetSizesConfiguration()Z
 HSPLandroid/widget/TextView;->shouldAdvanceFocusOnEnter()Z
 HSPLandroid/widget/TextView;->spanChange(Landroid/text/Spanned;Ljava/lang/Object;IIII)V
 HSPLandroid/widget/TextView;->startMarquee()V
 HSPLandroid/widget/TextView;->startStopMarquee(Z)V
 HSPLandroid/widget/TextView;->stopMarquee()V
 HSPLandroid/widget/TextView;->stopTextActionMode()V
-HSPLandroid/widget/TextView;->suggestedSizeFitsInSpace(ILandroid/graphics/RectF;)Z
 HSPLandroid/widget/TextView;->supportsAutoSizeText()Z
 HSPLandroid/widget/TextView;->textCanBeSelected()Z
 HSPLandroid/widget/TextView;->unregisterForPreDraw()V
@@ -30644,6 +27353,7 @@
 HSPLandroid/widget/Toast;->makeText(Landroid/content/Context;Landroid/os/Looper;Ljava/lang/CharSequence;I)Landroid/widget/Toast;
 HSPLandroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;
 HSPLandroid/widget/Toast;->show()V
+HSPLandroid/widget/ToastPresenter;-><init>(Landroid/content/Context;Landroid/view/accessibility/AccessibilityManager;)V
 HSPLandroid/widget/Toolbar$1;-><init>(Landroid/widget/Toolbar;)V
 HSPLandroid/widget/Toolbar$2;-><init>(Landroid/widget/Toolbar;)V
 HSPLandroid/widget/Toolbar$ExpandedActionViewMenuPresenter;-><init>(Landroid/widget/Toolbar;)V
@@ -30664,7 +27374,6 @@
 HSPLandroid/widget/Toolbar;->ensureMenuView()V
 HSPLandroid/widget/Toolbar;->ensureNavButtonView()V
 HSPLandroid/widget/Toolbar;->generateDefaultLayoutParams()Landroid/widget/Toolbar$LayoutParams;
-HSPLandroid/widget/Toolbar;->getChildTop(Landroid/view/View;I)I
 HSPLandroid/widget/Toolbar;->getContentInsetEnd()I
 HSPLandroid/widget/Toolbar;->getContentInsetStart()I
 HSPLandroid/widget/Toolbar;->getCurrentContentInsetEnd()I
@@ -30727,18 +27436,14 @@
 HSPLandroid/widget/ViewFlipper;->onWindowVisibilityChanged(I)V
 HSPLandroid/widget/ViewFlipper;->updateRunning()V
 HSPLandroid/widget/ViewFlipper;->updateRunning(Z)V
-HSPLandroid/widget/ViewSwitcher;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLandroid/widget/ViewSwitcher;->addView(Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;)V
 HPLcom/android/framework/protobuf/nano/CodedInputByteBufferNano;-><init>([BII)V
-PLcom/android/framework/protobuf/nano/CodedInputByteBufferNano;->checkLastTagWas(I)V
+HPLcom/android/framework/protobuf/nano/CodedInputByteBufferNano;->checkLastTagWas(I)V
 HPLcom/android/framework/protobuf/nano/CodedInputByteBufferNano;->isAtEnd()Z
-PLcom/android/framework/protobuf/nano/CodedInputByteBufferNano;->newInstance([BII)Lcom/android/framework/protobuf/nano/CodedInputByteBufferNano;
+HPLcom/android/framework/protobuf/nano/CodedInputByteBufferNano;->newInstance([BII)Lcom/android/framework/protobuf/nano/CodedInputByteBufferNano;
 PLcom/android/framework/protobuf/nano/CodedInputByteBufferNano;->readBool()Z
-HPLcom/android/framework/protobuf/nano/CodedInputByteBufferNano;->readFloat()F
 HPLcom/android/framework/protobuf/nano/CodedInputByteBufferNano;->readInt32()I
 PLcom/android/framework/protobuf/nano/CodedInputByteBufferNano;->readInt64()J
 HPLcom/android/framework/protobuf/nano/CodedInputByteBufferNano;->readRawByte()B
-HPLcom/android/framework/protobuf/nano/CodedInputByteBufferNano;->readRawLittleEndian32()I
 HPLcom/android/framework/protobuf/nano/CodedInputByteBufferNano;->readRawVarint32()I
 HPLcom/android/framework/protobuf/nano/CodedInputByteBufferNano;->readRawVarint64()J
 HPLcom/android/framework/protobuf/nano/CodedInputByteBufferNano;->readString()Ljava/lang/String;
@@ -30752,6 +27457,8 @@
 HPLcom/android/framework/protobuf/nano/CodedOutputByteBufferNano;->computeInt32SizeNoTag(I)I
 HPLcom/android/framework/protobuf/nano/CodedOutputByteBufferNano;->computeInt64Size(IJ)I
 HPLcom/android/framework/protobuf/nano/CodedOutputByteBufferNano;->computeInt64SizeNoTag(J)I
+HPLcom/android/framework/protobuf/nano/CodedOutputByteBufferNano;->computeMessageSize(ILcom/android/framework/protobuf/nano/MessageNano;)I
+HPLcom/android/framework/protobuf/nano/CodedOutputByteBufferNano;->computeMessageSizeNoTag(Lcom/android/framework/protobuf/nano/MessageNano;)I
 HSPLcom/android/framework/protobuf/nano/CodedOutputByteBufferNano;->computeRawVarint32Size(I)I
 HPLcom/android/framework/protobuf/nano/CodedOutputByteBufferNano;->computeRawVarint64Size(J)I
 HPLcom/android/framework/protobuf/nano/CodedOutputByteBufferNano;->computeStringSize(ILjava/lang/String;)I
@@ -30764,7 +27471,7 @@
 HSPLcom/android/framework/protobuf/nano/CodedOutputByteBufferNano;->spaceLeft()I
 HPLcom/android/framework/protobuf/nano/CodedOutputByteBufferNano;->writeBool(IZ)V
 HPLcom/android/framework/protobuf/nano/CodedOutputByteBufferNano;->writeBoolNoTag(Z)V
-HPLcom/android/framework/protobuf/nano/CodedOutputByteBufferNano;->writeFloat(IF)V
+PLcom/android/framework/protobuf/nano/CodedOutputByteBufferNano;->writeDouble(ID)V
 HPLcom/android/framework/protobuf/nano/CodedOutputByteBufferNano;->writeInt32(II)V
 HPLcom/android/framework/protobuf/nano/CodedOutputByteBufferNano;->writeInt32NoTag(I)V
 HPLcom/android/framework/protobuf/nano/CodedOutputByteBufferNano;->writeInt64(IJ)V
@@ -30773,7 +27480,7 @@
 HPLcom/android/framework/protobuf/nano/CodedOutputByteBufferNano;->writeMessageNoTag(Lcom/android/framework/protobuf/nano/MessageNano;)V
 HSPLcom/android/framework/protobuf/nano/CodedOutputByteBufferNano;->writeRawByte(B)V
 HSPLcom/android/framework/protobuf/nano/CodedOutputByteBufferNano;->writeRawByte(I)V
-HPLcom/android/framework/protobuf/nano/CodedOutputByteBufferNano;->writeRawLittleEndian32(I)V
+PLcom/android/framework/protobuf/nano/CodedOutputByteBufferNano;->writeRawLittleEndian64(J)V
 HSPLcom/android/framework/protobuf/nano/CodedOutputByteBufferNano;->writeRawVarint32(I)V
 HPLcom/android/framework/protobuf/nano/CodedOutputByteBufferNano;->writeRawVarint64(J)V
 HSPLcom/android/framework/protobuf/nano/CodedOutputByteBufferNano;->writeString(ILjava/lang/String;)V
@@ -30784,7 +27491,7 @@
 HPLcom/android/framework/protobuf/nano/MessageNano;->getCachedSize()I
 HSPLcom/android/framework/protobuf/nano/MessageNano;->getSerializedSize()I
 PLcom/android/framework/protobuf/nano/MessageNano;->mergeFrom(Lcom/android/framework/protobuf/nano/MessageNano;[B)Lcom/android/framework/protobuf/nano/MessageNano;
-PLcom/android/framework/protobuf/nano/MessageNano;->mergeFrom(Lcom/android/framework/protobuf/nano/MessageNano;[BII)Lcom/android/framework/protobuf/nano/MessageNano;
+HPLcom/android/framework/protobuf/nano/MessageNano;->mergeFrom(Lcom/android/framework/protobuf/nano/MessageNano;[BII)Lcom/android/framework/protobuf/nano/MessageNano;
 HSPLcom/android/framework/protobuf/nano/MessageNano;->toByteArray(Lcom/android/framework/protobuf/nano/MessageNano;)[B
 HSPLcom/android/framework/protobuf/nano/MessageNano;->toByteArray(Lcom/android/framework/protobuf/nano/MessageNano;[BII)V
 HSPLcom/android/framework/protobuf/nano/MessageNano;->writeTo(Lcom/android/framework/protobuf/nano/CodedOutputByteBufferNano;)V
@@ -30797,62 +27504,65 @@
 HSPLcom/android/i18n/phonenumbers/MultiFileMetadataSourceImpl;-><init>(Lcom/android/i18n/phonenumbers/MetadataLoader;)V
 HSPLcom/android/i18n/phonenumbers/MultiFileMetadataSourceImpl;-><init>(Ljava/lang/String;Lcom/android/i18n/phonenumbers/MetadataLoader;)V
 HSPLcom/android/i18n/phonenumbers/MultiFileMetadataSourceImpl;->getMetadataForRegion(Ljava/lang/String;)Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;
-HSPLcom/android/i18n/phonenumbers/PhoneNumberMatcher$State;-><clinit>()V
-HSPLcom/android/i18n/phonenumbers/PhoneNumberMatcher$State;-><init>(Ljava/lang/String;I)V
-HSPLcom/android/i18n/phonenumbers/PhoneNumberMatcher;-><clinit>()V
-HSPLcom/android/i18n/phonenumbers/PhoneNumberMatcher;-><init>(Lcom/android/i18n/phonenumbers/PhoneNumberUtil;Ljava/lang/CharSequence;Ljava/lang/String;Lcom/android/i18n/phonenumbers/PhoneNumberUtil$Leniency;J)V
-HSPLcom/android/i18n/phonenumbers/PhoneNumberMatcher;->extractInnerMatch(Ljava/lang/CharSequence;I)Lcom/android/i18n/phonenumbers/PhoneNumberMatch;
-HSPLcom/android/i18n/phonenumbers/PhoneNumberMatcher;->extractMatch(Ljava/lang/CharSequence;I)Lcom/android/i18n/phonenumbers/PhoneNumberMatch;
-HSPLcom/android/i18n/phonenumbers/PhoneNumberMatcher;->find(I)Lcom/android/i18n/phonenumbers/PhoneNumberMatch;
-HSPLcom/android/i18n/phonenumbers/PhoneNumberMatcher;->hasNext()Z
-HSPLcom/android/i18n/phonenumbers/PhoneNumberMatcher;->limit(II)Ljava/lang/String;
-HSPLcom/android/i18n/phonenumbers/PhoneNumberMatcher;->parseAndVerify(Ljava/lang/CharSequence;I)Lcom/android/i18n/phonenumbers/PhoneNumberMatch;
-HSPLcom/android/i18n/phonenumbers/PhoneNumberMatcher;->trimAfterFirstMatch(Ljava/util/regex/Pattern;Ljava/lang/CharSequence;)Ljava/lang/CharSequence;
-HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil$1;-><init>(Lcom/android/i18n/phonenumbers/PhoneNumberUtil;Ljava/lang/CharSequence;Ljava/lang/String;Lcom/android/i18n/phonenumbers/PhoneNumberUtil$Leniency;J)V
-HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil$1;->iterator()Ljava/util/Iterator;
-HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil$Leniency$1;->verify(Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;Ljava/lang/CharSequence;Lcom/android/i18n/phonenumbers/PhoneNumberUtil;Lcom/android/i18n/phonenumbers/PhoneNumberMatcher;)Z
 HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;-><init>(Lcom/android/i18n/phonenumbers/MetadataSource;Ljava/util/Map;)V
 HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->buildNationalNumberForParsing(Ljava/lang/String;Ljava/lang/StringBuilder;)V
 HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->checkRegionForParsing(Ljava/lang/CharSequence;Ljava/lang/String;)Z
+HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->chooseFormattingPatternForNumber(Ljava/util/List;Ljava/lang/String;)Lcom/android/i18n/phonenumbers/Phonemetadata$NumberFormat;
 HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->createInstance(Lcom/android/i18n/phonenumbers/MetadataLoader;)Lcom/android/i18n/phonenumbers/PhoneNumberUtil;
 HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->createInstance(Lcom/android/i18n/phonenumbers/MetadataSource;)Lcom/android/i18n/phonenumbers/PhoneNumberUtil;
 HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->extractCountryCode(Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;)I
 HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->extractPossibleNumber(Ljava/lang/CharSequence;)Ljava/lang/CharSequence;
-HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->findNumbers(Ljava/lang/CharSequence;Ljava/lang/String;Lcom/android/i18n/phonenumbers/PhoneNumberUtil$Leniency;J)Ljava/lang/Iterable;
+HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->format(Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;Lcom/android/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberFormat;)Ljava/lang/String;
+HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->format(Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;Lcom/android/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberFormat;Ljava/lang/StringBuilder;)V
+HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->formatInOriginalFormat(Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;Ljava/lang/String;)Ljava/lang/String;
+HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->formatNsn(Ljava/lang/String;Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;Lcom/android/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberFormat;Ljava/lang/CharSequence;)Ljava/lang/String;
+HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->formatNsnUsingPattern(Ljava/lang/String;Lcom/android/i18n/phonenumbers/Phonemetadata$NumberFormat;Lcom/android/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberFormat;Ljava/lang/CharSequence;)Ljava/lang/String;
+HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->getCountryCodeForValidRegion(Ljava/lang/String;)I
 HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->getInstance()Lcom/android/i18n/phonenumbers/PhoneNumberUtil;
 HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->getMetadataForRegion(Ljava/lang/String;)Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;
 HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->getMetadataForRegionOrCallingCode(ILjava/lang/String;)Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;
 HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->getNationalSignificantNumber(Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;)Ljava/lang/String;
 HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->getNumberDescByType(Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;Lcom/android/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberType;)Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;
+HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->getNumberType(Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;)Lcom/android/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberType;
 HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->getNumberTypeHelper(Ljava/lang/String;Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;)Lcom/android/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberType;
 HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->getRegionCodeForCountryCode(I)Ljava/lang/String;
 HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->getRegionCodeForNumber(Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;)Ljava/lang/String;
 HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->getRegionCodeForNumberFromRegionList(Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;Ljava/util/List;)Ljava/lang/String;
+HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->hasFormattingPatternForNumber(Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;)Z
 HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->hasValidCountryCallingCode(I)Z
+HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->isNumberGeographical(Lcom/android/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberType;I)Z
 HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->isNumberMatchingDesc(Ljava/lang/String;Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;)Z
-HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->isPossibleNumber(Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;)Z
-HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->isPossibleNumberForTypeWithReason(Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;Lcom/android/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberType;)Lcom/android/i18n/phonenumbers/PhoneNumberUtil$ValidationResult;
-HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->isPossibleNumberWithReason(Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;)Lcom/android/i18n/phonenumbers/PhoneNumberUtil$ValidationResult;
+HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->isValidNumber(Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;)Z
+HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->isValidNumberForRegion(Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;Ljava/lang/String;)Z
 HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->isValidRegionCode(Ljava/lang/String;)Z
 HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->isViablePhoneNumber(Ljava/lang/CharSequence;)Z
+HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->maybeAppendFormattedExtension(Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;Lcom/android/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberFormat;Ljava/lang/StringBuilder;)V
 HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->maybeExtractCountryCode(Ljava/lang/CharSequence;Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;Ljava/lang/StringBuilder;ZLcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;)I
 HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->maybeStripExtension(Ljava/lang/StringBuilder;)Ljava/lang/String;
 HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->maybeStripInternationalPrefixAndNormalize(Ljava/lang/StringBuilder;Ljava/lang/String;)Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber$CountryCodeSource;
 HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->maybeStripNationalPrefixAndCarrierCode(Ljava/lang/StringBuilder;Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;Ljava/lang/StringBuilder;)Z
 HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->normalize(Ljava/lang/StringBuilder;)Ljava/lang/StringBuilder;
+HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->normalizeDiallableCharsOnly(Ljava/lang/CharSequence;)Ljava/lang/String;
 HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->normalizeDigits(Ljava/lang/CharSequence;Z)Ljava/lang/StringBuilder;
 HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->normalizeDigitsOnly(Ljava/lang/CharSequence;)Ljava/lang/String;
+HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->normalizeHelper(Ljava/lang/CharSequence;Ljava/util/Map;Z)Ljava/lang/String;
 HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->parse(Ljava/lang/CharSequence;Ljava/lang/String;)Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;
 HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->parse(Ljava/lang/CharSequence;Ljava/lang/String;Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;)V
 HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->parseAndKeepRawInput(Ljava/lang/CharSequence;Ljava/lang/String;)Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;
 HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->parseAndKeepRawInput(Ljava/lang/CharSequence;Ljava/lang/String;Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;)V
 HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->parseHelper(Ljava/lang/CharSequence;Ljava/lang/String;ZZLcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;)V
 HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->parsePrefixAsIdd(Ljava/util/regex/Pattern;Ljava/lang/StringBuilder;)Z
+HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->prefixNumberWithCountryCallingCode(ILcom/android/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberFormat;Ljava/lang/StringBuilder;)V
 HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->setInstance(Lcom/android/i18n/phonenumbers/PhoneNumberUtil;)V
 HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->setItalianLeadingZerosForPhoneNumber(Ljava/lang/CharSequence;Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;)V
 HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->testNumberLength(Ljava/lang/CharSequence;Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;)Lcom/android/i18n/phonenumbers/PhoneNumberUtil$ValidationResult;
 HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->testNumberLength(Ljava/lang/CharSequence;Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;Lcom/android/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberType;)Lcom/android/i18n/phonenumbers/PhoneNumberUtil$ValidationResult;
 HSPLcom/android/i18n/phonenumbers/Phonemetadata$NumberFormat;-><init>()V
+HSPLcom/android/i18n/phonenumbers/Phonemetadata$NumberFormat;->getFormat()Ljava/lang/String;
+HSPLcom/android/i18n/phonenumbers/Phonemetadata$NumberFormat;->getLeadingDigitsPattern(I)Ljava/lang/String;
+HSPLcom/android/i18n/phonenumbers/Phonemetadata$NumberFormat;->getNationalPrefixFormattingRule()Ljava/lang/String;
+HSPLcom/android/i18n/phonenumbers/Phonemetadata$NumberFormat;->getPattern()Ljava/lang/String;
+HSPLcom/android/i18n/phonenumbers/Phonemetadata$NumberFormat;->leadingDigitsPatternSize()I
 HSPLcom/android/i18n/phonenumbers/Phonemetadata$NumberFormat;->readExternal(Ljava/io/ObjectInput;)V
 HSPLcom/android/i18n/phonenumbers/Phonemetadata$NumberFormat;->setFormat(Ljava/lang/String;)Lcom/android/i18n/phonenumbers/Phonemetadata$NumberFormat;
 HSPLcom/android/i18n/phonenumbers/Phonemetadata$NumberFormat;->setNationalPrefixFormattingRule(Ljava/lang/String;)Lcom/android/i18n/phonenumbers/Phonemetadata$NumberFormat;
@@ -30863,6 +27573,8 @@
 HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getFixedLine()Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;
 HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getGeneralDesc()Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;
 HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getInternationalPrefix()Ljava/lang/String;
+HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getLeadingDigits()Ljava/lang/String;
+HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getMobile()Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;
 HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getNationalPrefixForParsing()Ljava/lang/String;
 HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getNationalPrefixTransformRule()Ljava/lang/String;
 HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getPager()Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;
@@ -30875,21 +27587,26 @@
 HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getVoicemail()Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;
 HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getVoip()Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;
 HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->hasLeadingDigits()Z
+HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->intlNumberFormats()Ljava/util/List;
+HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->numberFormats()Ljava/util/List;
 HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->readExternal(Ljava/io/ObjectInput;)V
 HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setCountryCode(I)Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;
 HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setFixedLine(Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;)Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;
 HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setGeneralDesc(Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;)Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;
 HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setId(Ljava/lang/String;)Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;
 HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setInternationalPrefix(Ljava/lang/String;)Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;
+HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setLeadingDigits(Ljava/lang/String;)Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;
 HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setLeadingZeroPossible(Z)Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;
 HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setMainCountryForCode(Z)Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;
 HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setMobile(Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;)Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;
 HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setMobileNumberPortableRegion(Z)Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;
 HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setNationalPrefix(Ljava/lang/String;)Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;
 HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setNationalPrefixForParsing(Ljava/lang/String;)Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;
+HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setNationalPrefixTransformRule(Ljava/lang/String;)Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;
 HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setNoInternationalDialling(Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;)Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;
 HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setPager(Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;)Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;
 HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setPersonalNumber(Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;)Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;
+HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setPreferredExtnPrefix(Ljava/lang/String;)Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;
 HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setPremiumRate(Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;)Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;
 HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setSameMobileAndFixedLinePattern(Z)Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;
 HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setSharedCost(Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;)Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;
@@ -30909,12 +27626,20 @@
 HSPLcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;->setNationalNumberPattern(Ljava/lang/String;)Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;
 HSPLcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;-><init>()V
 HSPLcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;->getCountryCode()I
+HSPLcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;->getCountryCodeSource()Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber$CountryCodeSource;
 HSPLcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;->getNationalNumber()J
+HSPLcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;->getRawInput()Ljava/lang/String;
+HSPLcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;->hasCountryCodeSource()Z
+HSPLcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;->hasExtension()Z
+HSPLcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;->hasRawInput()Z
 HSPLcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;->isItalianLeadingZero()Z
 HSPLcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;->setCountryCode(I)Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;
 HSPLcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;->setCountryCodeSource(Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber$CountryCodeSource;)Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;
 HSPLcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;->setNationalNumber(J)Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;
 HSPLcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;->setRawInput(Ljava/lang/String;)Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;
+HSPLcom/android/i18n/phonenumbers/geocoding/PhoneNumberOfflineGeocoder;-><init>(Ljava/lang/String;)V
+HSPLcom/android/i18n/phonenumbers/geocoding/PhoneNumberOfflineGeocoder;->getDescriptionForNumber(Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;Ljava/util/Locale;)Ljava/lang/String;
+HSPLcom/android/i18n/phonenumbers/geocoding/PhoneNumberOfflineGeocoder;->getInstance()Lcom/android/i18n/phonenumbers/geocoding/PhoneNumberOfflineGeocoder;
 HSPLcom/android/i18n/phonenumbers/internal/RegexBasedMatcher;-><init>()V
 HSPLcom/android/i18n/phonenumbers/internal/RegexBasedMatcher;->create()Lcom/android/i18n/phonenumbers/internal/MatcherApi;
 HSPLcom/android/i18n/phonenumbers/internal/RegexBasedMatcher;->match(Ljava/lang/CharSequence;Ljava/util/regex/Pattern;Z)Z
@@ -30927,6 +27652,13 @@
 HSPLcom/android/i18n/phonenumbers/internal/RegexCache$LRUCache;->put(Ljava/lang/Object;Ljava/lang/Object;)V
 HSPLcom/android/i18n/phonenumbers/internal/RegexCache;-><init>(I)V
 HSPLcom/android/i18n/phonenumbers/internal/RegexCache;->getPatternForRegex(Ljava/lang/String;)Ljava/util/regex/Pattern;
+HSPLcom/android/i18n/phonenumbers/prefixmapper/MappingFileProvider;-><clinit>()V
+HSPLcom/android/i18n/phonenumbers/prefixmapper/MappingFileProvider;-><init>()V
+HSPLcom/android/i18n/phonenumbers/prefixmapper/MappingFileProvider;->readExternal(Ljava/io/ObjectInput;)V
+HSPLcom/android/i18n/phonenumbers/prefixmapper/PrefixFileReader;-><clinit>()V
+HSPLcom/android/i18n/phonenumbers/prefixmapper/PrefixFileReader;-><init>(Ljava/lang/String;)V
+HSPLcom/android/i18n/phonenumbers/prefixmapper/PrefixFileReader;->close(Ljava/io/InputStream;)V
+HSPLcom/android/i18n/phonenumbers/prefixmapper/PrefixFileReader;->loadMappingFileProvider()V
 HSPLcom/android/icu/charset/CharsetDecoderICU;-><init>(Ljava/nio/charset/Charset;FJ)V
 HSPLcom/android/icu/charset/CharsetDecoderICU;->decodeLoop(Ljava/nio/ByteBuffer;Ljava/nio/CharBuffer;)Ljava/nio/charset/CoderResult;
 HSPLcom/android/icu/charset/CharsetDecoderICU;->getArray(Ljava/nio/ByteBuffer;)I
@@ -30961,7 +27693,6 @@
 HSPLcom/android/icu/charset/NativeConverter;->setCallbackDecode(JLjava/nio/charset/CharsetDecoder;)V
 HSPLcom/android/icu/charset/NativeConverter;->setCallbackEncode(JLjava/nio/charset/CharsetEncoder;)V
 HSPLcom/android/icu/charset/NativeConverter;->translateCodingErrorAction(Ljava/nio/charset/CodingErrorAction;)I
-HSPLcom/android/icu/util/CaseMapperNative;->toLowerCase(Ljava/lang/String;Ljava/util/Locale;)Ljava/lang/String;
 HSPLcom/android/icu/util/LocaleNative;->getDisplayCountry(Ljava/util/Locale;Ljava/util/Locale;)Ljava/lang/String;
 HSPLcom/android/icu/util/LocaleNative;->getDisplayLanguage(Ljava/util/Locale;Ljava/util/Locale;)Ljava/lang/String;
 HSPLcom/android/icu/util/regex/MatcherNative;-><init>(Lcom/android/icu/util/regex/PatternNative;)V
@@ -30972,13 +27703,16 @@
 HSPLcom/android/icu/util/regex/MatcherNative;->hitEnd()Z
 HSPLcom/android/icu/util/regex/MatcherNative;->lookingAt([I)Z
 HSPLcom/android/icu/util/regex/MatcherNative;->matches([I)Z
-HSPLcom/android/icu/util/regex/MatcherNative;->requireEnd()Z
 HSPLcom/android/icu/util/regex/MatcherNative;->setInput(Ljava/lang/String;II)V
 HSPLcom/android/icu/util/regex/MatcherNative;->useAnchoringBounds(Z)V
 HSPLcom/android/icu/util/regex/MatcherNative;->useTransparentBounds(Z)V
 HSPLcom/android/icu/util/regex/PatternNative;-><init>(Ljava/lang/String;I)V
 HSPLcom/android/icu/util/regex/PatternNative;->create(Ljava/lang/String;I)Lcom/android/icu/util/regex/PatternNative;
 HSPLcom/android/icu/util/regex/PatternNative;->openMatcher()J
+HSPLcom/android/internal/BrightnessSynchronizer;-><clinit>()V
+HSPLcom/android/internal/BrightnessSynchronizer;->brightnessFloatToInt(FFFII)I
+HSPLcom/android/internal/BrightnessSynchronizer;->brightnessFloatToInt(Landroid/content/Context;F)I
+HSPLcom/android/internal/BrightnessSynchronizer;->floatEquals(FF)Z
 HSPLcom/android/internal/accessibility/AccessibilityShortcutController$1;-><init>(Lcom/android/internal/accessibility/AccessibilityShortcutController;Landroid/os/Handler;)V
 HSPLcom/android/internal/accessibility/AccessibilityShortcutController$FrameworkObjectProvider;-><init>()V
 HSPLcom/android/internal/accessibility/AccessibilityShortcutController$ToggleableFrameworkFeatureInfo;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)V
@@ -31028,24 +27762,20 @@
 HSPLcom/android/internal/app/IAppOpsCallback$Stub;->asBinder()Landroid/os/IBinder;
 HPLcom/android/internal/app/IAppOpsCallback$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/app/IAppOpsCallback;
 HSPLcom/android/internal/app/IAppOpsCallback$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-PLcom/android/internal/app/IAppOpsNotedCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+HPLcom/android/internal/app/IAppOpsNotedCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HPLcom/android/internal/app/IAppOpsNotedCallback$Stub$Proxy;->asBinder()Landroid/os/IBinder;
 HPLcom/android/internal/app/IAppOpsNotedCallback$Stub$Proxy;->opNoted(IILjava/lang/String;I)V
 HSPLcom/android/internal/app/IAppOpsNotedCallback$Stub;-><init>()V
 HSPLcom/android/internal/app/IAppOpsNotedCallback$Stub;->asBinder()Landroid/os/IBinder;
-PLcom/android/internal/app/IAppOpsNotedCallback$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/app/IAppOpsNotedCallback;
+HPLcom/android/internal/app/IAppOpsNotedCallback$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/app/IAppOpsNotedCallback;
 HSPLcom/android/internal/app/IAppOpsNotedCallback$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLcom/android/internal/app/IAppOpsService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HSPLcom/android/internal/app/IAppOpsService$Stub$Proxy;->checkOperation(IILjava/lang/String;)I
-HSPLcom/android/internal/app/IAppOpsService$Stub$Proxy;->checkOperationRaw(IILjava/lang/String;)I
 HSPLcom/android/internal/app/IAppOpsService$Stub$Proxy;->checkPackage(ILjava/lang/String;)I
-HSPLcom/android/internal/app/IAppOpsService$Stub$Proxy;->finishOperation(Landroid/os/IBinder;IILjava/lang/String;Ljava/lang/String;)V
-HSPLcom/android/internal/app/IAppOpsService$Stub$Proxy;->getOpsForPackage(ILjava/lang/String;[I)Ljava/util/List;
 HSPLcom/android/internal/app/IAppOpsService$Stub$Proxy;->getPackagesForOps([I)Ljava/util/List;
 HSPLcom/android/internal/app/IAppOpsService$Stub$Proxy;->noteOperation(IILjava/lang/String;Ljava/lang/String;ZLjava/lang/String;)I
 HSPLcom/android/internal/app/IAppOpsService$Stub$Proxy;->noteProxyOperation(IILjava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;ZLjava/lang/String;)I
 HSPLcom/android/internal/app/IAppOpsService$Stub$Proxy;->shouldCollectNotes(I)Z
-HSPLcom/android/internal/app/IAppOpsService$Stub$Proxy;->startOperation(Landroid/os/IBinder;IILjava/lang/String;Ljava/lang/String;ZZLjava/lang/String;)I
 HSPLcom/android/internal/app/IAppOpsService$Stub$Proxy;->startWatchingActive([ILcom/android/internal/app/IAppOpsActiveCallback;)V
 HSPLcom/android/internal/app/IAppOpsService$Stub$Proxy;->startWatchingModeWithFlags(ILjava/lang/String;ILcom/android/internal/app/IAppOpsCallback;)V
 HSPLcom/android/internal/app/IAppOpsService$Stub$Proxy;->startWatchingNoted([ILcom/android/internal/app/IAppOpsNotedCallback;)V
@@ -31053,10 +27783,10 @@
 HSPLcom/android/internal/app/IAppOpsService$Stub;-><init>()V
 HSPLcom/android/internal/app/IAppOpsService$Stub;->asBinder()Landroid/os/IBinder;
 HSPLcom/android/internal/app/IAppOpsService$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/app/IAppOpsService;
+HPLcom/android/internal/app/IAppOpsService$Stub;->getDefaultTransactionName(I)Ljava/lang/String;
 HSPLcom/android/internal/app/IAppOpsService$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLcom/android/internal/app/IBatteryStats$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HSPLcom/android/internal/app/IBatteryStats$Stub$Proxy;->computeChargeTimeRemaining()J
-HSPLcom/android/internal/app/IBatteryStats$Stub$Proxy;->isCharging()Z
 HSPLcom/android/internal/app/IBatteryStats$Stub$Proxy;->takeUidSnapshot(I)Landroid/os/health/HealthStatsParceler;
 HSPLcom/android/internal/app/IBatteryStats$Stub;-><init>()V
 HSPLcom/android/internal/app/IBatteryStats$Stub;->asBinder()Landroid/os/IBinder;
@@ -31070,12 +27800,12 @@
 HSPLcom/android/internal/app/IVoiceInteractionManagerService$Stub;-><init>()V
 HSPLcom/android/internal/app/IVoiceInteractionManagerService$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/app/IVoiceInteractionManagerService;
 HPLcom/android/internal/app/IVoiceInteractionManagerService$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-PLcom/android/internal/app/IVoiceInteractionSessionListener$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-PLcom/android/internal/app/IVoiceInteractionSessionListener$Stub$Proxy;->asBinder()Landroid/os/IBinder;
+HPLcom/android/internal/app/IVoiceInteractionSessionListener$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+HPLcom/android/internal/app/IVoiceInteractionSessionListener$Stub$Proxy;->asBinder()Landroid/os/IBinder;
 HPLcom/android/internal/app/IVoiceInteractionSessionListener$Stub$Proxy;->onSetUiHints(Landroid/os/Bundle;)V
 HSPLcom/android/internal/app/IVoiceInteractionSessionListener$Stub;-><init>()V
 HSPLcom/android/internal/app/IVoiceInteractionSessionListener$Stub;->asBinder()Landroid/os/IBinder;
-PLcom/android/internal/app/IVoiceInteractionSessionListener$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/app/IVoiceInteractionSessionListener;
+HPLcom/android/internal/app/IVoiceInteractionSessionListener$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/app/IVoiceInteractionSessionListener;
 HSPLcom/android/internal/app/IVoiceInteractionSessionListener$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLcom/android/internal/app/IVoiceInteractionSessionShowCallback$Stub$Proxy;->onShown()V
 HSPLcom/android/internal/app/IVoiceInteractionSessionShowCallback$Stub;-><init>()V
@@ -31127,7 +27857,7 @@
 HSPLcom/android/internal/app/procstats/AssociationState;->startSource(ILjava/lang/String;Ljava/lang/String;)Lcom/android/internal/app/procstats/AssociationState$SourceState;
 HPLcom/android/internal/app/procstats/AssociationState;->writeToParcel(Lcom/android/internal/app/procstats/ProcessStats;Landroid/os/Parcel;J)V
 HPLcom/android/internal/app/procstats/DumpUtils;->collapseString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-PLcom/android/internal/app/procstats/DumpUtils;->dumpAdjTimesCheckin(Ljava/io/PrintWriter;Ljava/lang/String;[JIJJ)V
+HPLcom/android/internal/app/procstats/DumpUtils;->dumpAdjTimesCheckin(Ljava/io/PrintWriter;Ljava/lang/String;[JIJJ)V
 HPLcom/android/internal/app/procstats/DumpUtils;->printAdjTag(Ljava/io/PrintWriter;I)V
 HPLcom/android/internal/app/procstats/DumpUtils;->printAdjTagAndValue(Ljava/io/PrintWriter;IJ)V
 HPLcom/android/internal/app/procstats/DumpUtils;->printArrayEntry(Ljava/io/PrintWriter;[Ljava/lang/String;II)I
@@ -31220,7 +27950,6 @@
 HSPLcom/android/internal/app/procstats/ServiceState;->setExecuting(ZIJ)V
 HSPLcom/android/internal/app/procstats/ServiceState;->setForeground(ZIJ)V
 HSPLcom/android/internal/app/procstats/ServiceState;->setMemFactor(IJ)V
-HPLcom/android/internal/app/procstats/ServiceState;->setRestarting(ZIJ)V
 HSPLcom/android/internal/app/procstats/ServiceState;->setStarted(ZIJ)V
 HSPLcom/android/internal/app/procstats/ServiceState;->updateRunning(IJ)V
 HSPLcom/android/internal/app/procstats/ServiceState;->updateStartedState(IJ)V
@@ -31272,10 +28001,7 @@
 PLcom/android/internal/backup/IBackupTransport$Stub$Proxy;->dataManagementIntentLabel()Ljava/lang/CharSequence;
 HPLcom/android/internal/backup/IBackupTransport$Stub$Proxy;->name()Ljava/lang/String;
 HPLcom/android/internal/backup/IBackupTransport$Stub$Proxy;->transportDirName()Ljava/lang/String;
-HSPLcom/android/internal/backup/IBackupTransport$Stub;-><init>()V
-HSPLcom/android/internal/backup/IBackupTransport$Stub;->asBinder()Landroid/os/IBinder;
 HPLcom/android/internal/backup/IBackupTransport$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/backup/IBackupTransport;
-HSPLcom/android/internal/backup/IBackupTransport$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLcom/android/internal/colorextraction/ColorExtractor$GradientColors;-><init>()V
 HSPLcom/android/internal/colorextraction/ColorExtractor$GradientColors;->equals(Ljava/lang/Object;)Z
 HSPLcom/android/internal/colorextraction/ColorExtractor$GradientColors;->getColorPalette()[I
@@ -31337,9 +28063,6 @@
 HSPLcom/android/internal/compat/ChangeReporter;->shouldWriteToDebug(IJI)Z
 HSPLcom/android/internal/compat/ChangeReporter;->shouldWriteToStatsLog(IJI)Z
 HSPLcom/android/internal/compat/ChangeReporter;->stateToString(I)Ljava/lang/String;
-HSPLcom/android/internal/compat/CompatibilityChangeInfo$1;-><init>()V
-HSPLcom/android/internal/compat/CompatibilityChangeInfo;-><clinit>()V
-HSPLcom/android/internal/compat/CompatibilityChangeInfo;-><init>(Ljava/lang/Long;Ljava/lang/String;IZLjava/lang/String;)V
 HSPLcom/android/internal/compat/CompatibilityChangeInfo;->getDisabled()Z
 HSPLcom/android/internal/compat/CompatibilityChangeInfo;->getEnableAfterTargetSdk()I
 HSPLcom/android/internal/compat/CompatibilityChangeInfo;->getId()J
@@ -31348,10 +28071,8 @@
 HSPLcom/android/internal/compat/IPlatformCompat$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/compat/IPlatformCompat;
 HPLcom/android/internal/compat/IPlatformCompat$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLcom/android/internal/compat/IPlatformCompatNative$Stub;-><init>()V
-HPLcom/android/internal/compat/IPlatformCompatNative$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLcom/android/internal/content/NativeLibraryHelper$Handle;->close()V
 HSPLcom/android/internal/content/NativeLibraryHelper$Handle;->create(Landroid/content/pm/PackageParser$PackageLite;)Lcom/android/internal/content/NativeLibraryHelper$Handle;
-HSPLcom/android/internal/content/NativeLibraryHelper$Handle;->create(Landroid/content/pm/parsing/AndroidPackage;)Lcom/android/internal/content/NativeLibraryHelper$Handle;
 PLcom/android/internal/content/NativeLibraryHelper$Handle;->create(Ljava/io/File;)Lcom/android/internal/content/NativeLibraryHelper$Handle;
 HSPLcom/android/internal/content/NativeLibraryHelper$Handle;->create(Ljava/util/List;ZZZ)Lcom/android/internal/content/NativeLibraryHelper$Handle;
 HSPLcom/android/internal/content/NativeLibraryHelper$Handle;->finalize()V
@@ -31364,13 +28085,13 @@
 PLcom/android/internal/content/NativeLibraryHelper;->removeNativeBinariesFromDirLI(Ljava/io/File;Z)V
 HSPLcom/android/internal/content/NativeLibraryHelper;->sumNativeBinariesWithOverride(Lcom/android/internal/content/NativeLibraryHelper$Handle;Ljava/lang/String;)J
 PLcom/android/internal/content/PackageHelper$1;->getAllow3rdPartyOnInternalConfig(Landroid/content/Context;)Z
-PLcom/android/internal/content/PackageHelper$1;->getExistingAppInfo(Landroid/content/Context;Ljava/lang/String;)Landroid/content/pm/ApplicationInfo;
+HPLcom/android/internal/content/PackageHelper$1;->getExistingAppInfo(Landroid/content/Context;Ljava/lang/String;)Landroid/content/pm/ApplicationInfo;
 PLcom/android/internal/content/PackageHelper$1;->getForceAllowOnExternalSetting(Landroid/content/Context;)Z
 PLcom/android/internal/content/PackageHelper$1;->getStorageManager(Landroid/content/Context;)Landroid/os/storage/StorageManager;
 HSPLcom/android/internal/content/PackageHelper;->calculateInstalledSize(Landroid/content/pm/PackageParser$PackageLite;Lcom/android/internal/content/NativeLibraryHelper$Handle;Ljava/lang/String;)J
 HSPLcom/android/internal/content/PackageHelper;->calculateInstalledSize(Landroid/content/pm/PackageParser$PackageLite;Ljava/lang/String;Ljava/io/FileDescriptor;)J
-PLcom/android/internal/content/PackageHelper;->checkFitOnVolume(Landroid/os/storage/StorageManager;Ljava/lang/String;Landroid/content/pm/PackageInstaller$SessionParams;)Z
-PLcom/android/internal/content/PackageHelper;->fitsOnInternal(Landroid/content/Context;Landroid/content/pm/PackageInstaller$SessionParams;)Z
+HPLcom/android/internal/content/PackageHelper;->checkFitOnVolume(Landroid/os/storage/StorageManager;Ljava/lang/String;Landroid/content/pm/PackageInstaller$SessionParams;)Z
+HPLcom/android/internal/content/PackageHelper;->fitsOnInternal(Landroid/content/Context;Landroid/content/pm/PackageInstaller$SessionParams;)Z
 PLcom/android/internal/content/PackageHelper;->getDefaultTestableInterface()Lcom/android/internal/content/PackageHelper$TestableInterface;
 HSPLcom/android/internal/content/PackageHelper;->getStorageManager()Landroid/os/storage/IStorageManager;
 PLcom/android/internal/content/PackageHelper;->resolveInstallLocation(Landroid/content/Context;Landroid/content/pm/PackageInstaller$SessionParams;)I
@@ -31378,11 +28099,11 @@
 PLcom/android/internal/content/PackageHelper;->resolveInstallVolume(Landroid/content/Context;Landroid/content/pm/PackageInstaller$SessionParams;)Ljava/lang/String;
 HPLcom/android/internal/content/PackageHelper;->resolveInstallVolume(Landroid/content/Context;Landroid/content/pm/PackageInstaller$SessionParams;Lcom/android/internal/content/PackageHelper$TestableInterface;)Ljava/lang/String;
 HSPLcom/android/internal/content/PackageMonitor;-><init>()V
-PLcom/android/internal/content/PackageMonitor;->didSomePackagesChange()Z
+HPLcom/android/internal/content/PackageMonitor;->didSomePackagesChange()Z
 HSPLcom/android/internal/content/PackageMonitor;->getChangingUserId()I
 HSPLcom/android/internal/content/PackageMonitor;->getPackageName(Landroid/content/Intent;)Ljava/lang/String;
 HPLcom/android/internal/content/PackageMonitor;->isComponentModified(Ljava/lang/String;)Z
-PLcom/android/internal/content/PackageMonitor;->isPackageAppearing(Ljava/lang/String;)I
+HPLcom/android/internal/content/PackageMonitor;->isPackageAppearing(Ljava/lang/String;)I
 HPLcom/android/internal/content/PackageMonitor;->isPackageDisappearing(Ljava/lang/String;)I
 HPLcom/android/internal/content/PackageMonitor;->isPackageModified(Ljava/lang/String;)Z
 HSPLcom/android/internal/content/PackageMonitor;->onBeginPackageChanges()V
@@ -31421,8 +28142,8 @@
 HSPLcom/android/internal/graphics/ColorUtils;->setAlphaComponent(II)I
 HSPLcom/android/internal/graphics/SfVsyncFrameCallbackProvider;-><init>()V
 HSPLcom/android/internal/graphics/SfVsyncFrameCallbackProvider;-><init>(Landroid/view/Choreographer;)V
-HPLcom/android/internal/graphics/SfVsyncFrameCallbackProvider;->getFrameTime()J
-HPLcom/android/internal/graphics/SfVsyncFrameCallbackProvider;->postFrameCallback(Landroid/view/Choreographer$FrameCallback;)V
+HSPLcom/android/internal/graphics/SfVsyncFrameCallbackProvider;->getFrameTime()J
+HSPLcom/android/internal/graphics/SfVsyncFrameCallbackProvider;->postFrameCallback(Landroid/view/Choreographer$FrameCallback;)V
 HSPLcom/android/internal/graphics/drawable/AnimationScaleListDrawable$AnimationScaleListState;-><init>(Lcom/android/internal/graphics/drawable/AnimationScaleListDrawable$AnimationScaleListState;Lcom/android/internal/graphics/drawable/AnimationScaleListDrawable;Landroid/content/res/Resources;)V
 HSPLcom/android/internal/graphics/drawable/AnimationScaleListDrawable$AnimationScaleListState;->addDrawable(Landroid/graphics/drawable/Drawable;)I
 HSPLcom/android/internal/graphics/drawable/AnimationScaleListDrawable$AnimationScaleListState;->canApplyTheme()Z
@@ -31445,8 +28166,6 @@
 PLcom/android/internal/infra/-$$Lambda$AbstractRemoteService$9IBVTCLLZgndvH7fu1P14PW1_1o;->accept(Ljava/lang/Object;)V
 HSPLcom/android/internal/infra/-$$Lambda$AbstractRemoteService$YSUzqqi1Pbrg2dlwMGMtKWbGXck;->accept(Ljava/lang/Object;)V
 HPLcom/android/internal/infra/-$$Lambda$EbzSql2RHkXox5Myj8A-7kLC4_A;->accept(Ljava/lang/Object;Ljava/lang/Object;)V
-PLcom/android/internal/infra/-$$Lambda$ServiceConnector$Impl$3vLWxkP1Z6JyExzdZboFFp1zM20;-><clinit>()V
-PLcom/android/internal/infra/-$$Lambda$ServiceConnector$Impl$3vLWxkP1Z6JyExzdZboFFp1zM20;-><init>()V
 PLcom/android/internal/infra/-$$Lambda$ServiceConnector$Impl$3vLWxkP1Z6JyExzdZboFFp1zM20;->run(Ljava/lang/Object;)Ljava/lang/Object;
 HSPLcom/android/internal/infra/-$$Lambda$T7zIZMFnvwrmtbuTMXLaZHHp-9s;-><clinit>()V
 HSPLcom/android/internal/infra/-$$Lambda$T7zIZMFnvwrmtbuTMXLaZHHp-9s;-><init>()V
@@ -31454,8 +28173,6 @@
 PLcom/android/internal/infra/-$$Lambda$XuWfs8-IsKaNygi8YjlVGjedkIw;-><clinit>()V
 PLcom/android/internal/infra/-$$Lambda$XuWfs8-IsKaNygi8YjlVGjedkIw;-><init>()V
 HPLcom/android/internal/infra/-$$Lambda$XuWfs8-IsKaNygi8YjlVGjedkIw;->accept(Ljava/lang/Object;)V
-PLcom/android/internal/infra/-$$Lambda$qN_gooelzsUiBhYWznXKzb-8_wA;-><clinit>()V
-PLcom/android/internal/infra/-$$Lambda$qN_gooelzsUiBhYWznXKzb-8_wA;-><init>()V
 PLcom/android/internal/infra/-$$Lambda$qN_gooelzsUiBhYWznXKzb-8_wA;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
 HSPLcom/android/internal/infra/-$$Lambda$rAXGjry3wPGKviARzTYfDiY7xrs;-><clinit>()V
 HSPLcom/android/internal/infra/-$$Lambda$rAXGjry3wPGKviARzTYfDiY7xrs;-><init>()V
@@ -31499,10 +28216,8 @@
 HPLcom/android/internal/infra/AbstractRemoteService;->scheduleUnbind(Z)V
 PLcom/android/internal/infra/AndroidFuture$1;-><init>(Lcom/android/internal/infra/AndroidFuture;)V
 PLcom/android/internal/infra/AndroidFuture$1;->complete(Lcom/android/internal/infra/AndroidFuture;)V
-HSPLcom/android/internal/infra/AndroidFuture$2;-><init>()V
 HSPLcom/android/internal/infra/AndroidFuture$2;->createFromParcel(Landroid/os/Parcel;)Lcom/android/internal/infra/AndroidFuture;
 HSPLcom/android/internal/infra/AndroidFuture$2;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HSPLcom/android/internal/infra/AndroidFuture;-><clinit>()V
 HSPLcom/android/internal/infra/AndroidFuture;-><init>()V
 HSPLcom/android/internal/infra/AndroidFuture;-><init>(Landroid/os/Parcel;)V
 HPLcom/android/internal/infra/AndroidFuture;->callListener(Ljava/util/function/BiConsumer;Ljava/lang/Object;Ljava/lang/Throwable;)V
@@ -31543,14 +28258,14 @@
 HSPLcom/android/internal/infra/ServiceConnector$Impl;->enqueue(Lcom/android/internal/infra/ServiceConnector$Impl$CompletionAwareJob;)V
 HSPLcom/android/internal/infra/ServiceConnector$Impl;->enqueue(Lcom/android/internal/infra/ServiceConnector$Job;)Z
 HPLcom/android/internal/infra/ServiceConnector$Impl;->enqueueJobThread(Lcom/android/internal/infra/ServiceConnector$Job;)V
-PLcom/android/internal/infra/ServiceConnector$Impl;->getAutoDisconnectTimeoutMs()J
+HPLcom/android/internal/infra/ServiceConnector$Impl;->getAutoDisconnectTimeoutMs()J
 HPLcom/android/internal/infra/ServiceConnector$Impl;->getJobHandler()Landroid/os/Handler;
 HSPLcom/android/internal/infra/ServiceConnector$Impl;->getRequestTimeoutMs()J
 HPLcom/android/internal/infra/ServiceConnector$Impl;->isBound()Z
 PLcom/android/internal/infra/ServiceConnector$Impl;->lambda$connect$0(Landroid/os/IInterface;)Landroid/os/IInterface;
 HPLcom/android/internal/infra/ServiceConnector$Impl;->maybeScheduleUnbindTimeout()V
 HPLcom/android/internal/infra/ServiceConnector$Impl;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
-PLcom/android/internal/infra/ServiceConnector$Impl;->onServiceConnectionStatusChanged(Landroid/os/IInterface;Z)V
+HPLcom/android/internal/infra/ServiceConnector$Impl;->onServiceConnectionStatusChanged(Landroid/os/IInterface;Z)V
 PLcom/android/internal/infra/ServiceConnector$Impl;->onServiceUnbound()V
 HPLcom/android/internal/infra/ServiceConnector$Impl;->onTimeout()V
 HSPLcom/android/internal/infra/ServiceConnector$Impl;->postAsync(Lcom/android/internal/infra/ServiceConnector$Job;)Lcom/android/internal/infra/AndroidFuture;
@@ -31569,8 +28284,7 @@
 HPLcom/android/internal/infra/WhitelistHelper;->isWhitelisted(Ljava/lang/String;)Z
 HPLcom/android/internal/infra/WhitelistHelper;->setWhitelist(Landroid/util/ArraySet;Landroid/util/ArraySet;)V
 PLcom/android/internal/infra/WhitelistHelper;->setWhitelist(Ljava/util/List;Ljava/util/List;)V
-PLcom/android/internal/inputmethod/IInputMethodPrivilegedOperations$Stub;-><init>()V
-PLcom/android/internal/inputmethod/IInputMethodPrivilegedOperations$Stub;->asBinder()Landroid/os/IBinder;
+HPLcom/android/internal/inputmethod/IInputMethodPrivilegedOperations$Stub;->asBinder()Landroid/os/IBinder;
 HPLcom/android/internal/inputmethod/IInputMethodPrivilegedOperations$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLcom/android/internal/inputmethod/SubtypeLocaleUtils;->constructLocaleFromString(Ljava/lang/String;)Ljava/util/Locale;
 HSPLcom/android/internal/location/GpsNetInitiatedHandler$1;-><init>(Lcom/android/internal/location/GpsNetInitiatedHandler;)V
@@ -31586,19 +28300,13 @@
 HPLcom/android/internal/location/ILocationProvider$Stub$Proxy;->setRequest(Lcom/android/internal/location/ProviderRequest;Landroid/os/WorkSource;)V
 HSPLcom/android/internal/location/ILocationProvider$Stub;-><init>()V
 HSPLcom/android/internal/location/ILocationProvider$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/location/ILocationProvider;
-HSPLcom/android/internal/location/ILocationProvider$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLcom/android/internal/location/ILocationProviderManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLcom/android/internal/location/ILocationProviderManager$Stub$Proxy;->onSetProperties(Lcom/android/internal/location/ProviderProperties;)V
 HSPLcom/android/internal/location/ILocationProviderManager$Stub;-><init>()V
-PLcom/android/internal/location/ILocationProviderManager$Stub;->asBinder()Landroid/os/IBinder;
-HSPLcom/android/internal/location/ILocationProviderManager$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/location/ILocationProviderManager;
+HPLcom/android/internal/location/ILocationProviderManager$Stub;->asBinder()Landroid/os/IBinder;
 HPLcom/android/internal/location/ILocationProviderManager$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLcom/android/internal/location/ProviderProperties$1;->createFromParcel(Landroid/os/Parcel;)Lcom/android/internal/location/ProviderProperties;
 HSPLcom/android/internal/location/ProviderProperties$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLcom/android/internal/location/ProviderProperties;-><init>(ZZZZZZZII)V
 HSPLcom/android/internal/location/ProviderProperties;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLcom/android/internal/location/ProviderRequest$1;->createFromParcel(Landroid/os/Parcel;)Lcom/android/internal/location/ProviderRequest;
-HSPLcom/android/internal/location/ProviderRequest$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLcom/android/internal/location/ProviderRequest$Builder;-><init>()V
 HSPLcom/android/internal/location/ProviderRequest$Builder;->build()Lcom/android/internal/location/ProviderRequest;
 HSPLcom/android/internal/location/ProviderRequest$Builder;->getInterval()J
@@ -31613,6 +28321,7 @@
 HPLcom/android/internal/location/ProviderRequest;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLcom/android/internal/location/gnssmetrics/GnssMetrics$GnssPowerMetrics;-><init>(Lcom/android/internal/location/gnssmetrics/GnssMetrics;Lcom/android/internal/app/IBatteryStats;)V
 HSPLcom/android/internal/location/gnssmetrics/GnssMetrics$GnssPowerMetrics;-><init>(Lcom/android/internal/location/gnssmetrics/GnssMetrics;Lcom/android/internal/app/IBatteryStats;Lcom/android/internal/location/gnssmetrics/GnssMetrics$1;)V
+PLcom/android/internal/location/gnssmetrics/GnssMetrics$GnssPowerMetrics;->buildProto()Lcom/android/internal/location/nano/GnssLogsProto$PowerMetrics;
 PLcom/android/internal/location/gnssmetrics/GnssMetrics$GnssPowerMetrics;->getGpsBatteryStats()Landroid/os/connectivity/GpsBatteryStats;
 PLcom/android/internal/location/gnssmetrics/GnssMetrics$GnssPowerMetrics;->getSignalLevel(D)I
 HPLcom/android/internal/location/gnssmetrics/GnssMetrics$GnssPowerMetrics;->reportSignalQuality([FI)V
@@ -31621,13 +28330,21 @@
 HPLcom/android/internal/location/gnssmetrics/GnssMetrics$Statistics;->addItem(D)V
 PLcom/android/internal/location/gnssmetrics/GnssMetrics$Statistics;->getCount()I
 HSPLcom/android/internal/location/gnssmetrics/GnssMetrics$Statistics;->reset()V
-HSPLcom/android/internal/location/gnssmetrics/GnssMetrics;-><init>(Lcom/android/internal/app/IBatteryStats;)V
+PLcom/android/internal/location/gnssmetrics/GnssMetrics;->dumpGnssMetricsAsProtoString()Ljava/lang/String;
 HPLcom/android/internal/location/gnssmetrics/GnssMetrics;->isL5Sv(F)Z
 HPLcom/android/internal/location/gnssmetrics/GnssMetrics;->logCn0([FI[F)V
 HPLcom/android/internal/location/gnssmetrics/GnssMetrics;->logCn0L5(I[F[F)V
+HPLcom/android/internal/location/gnssmetrics/GnssMetrics;->logPositionAccuracyMeters(F)V
+HPLcom/android/internal/location/gnssmetrics/GnssMetrics;->logReceivedLocationStatus(Z)V
 HPLcom/android/internal/location/gnssmetrics/GnssMetrics;->logSvStatus(Landroid/location/GnssStatus;)V
+PLcom/android/internal/location/gnssmetrics/GnssMetrics;->logTimeToFirstFixMilliSecs(I)V
 HSPLcom/android/internal/location/gnssmetrics/GnssMetrics;->reset()V
 HSPLcom/android/internal/location/gnssmetrics/GnssMetrics;->resetConstellationTypes()V
+PLcom/android/internal/location/nano/GnssLogsProto$GnssLog;->clear()Lcom/android/internal/location/nano/GnssLogsProto$GnssLog;
+PLcom/android/internal/location/nano/GnssLogsProto$GnssLog;->computeSerializedSize()I
+PLcom/android/internal/location/nano/GnssLogsProto$GnssLog;->writeTo(Lcom/android/framework/protobuf/nano/CodedOutputByteBufferNano;)V
+PLcom/android/internal/location/nano/GnssLogsProto$PowerMetrics;->computeSerializedSize()I
+PLcom/android/internal/location/nano/GnssLogsProto$PowerMetrics;->writeTo(Lcom/android/framework/protobuf/nano/CodedOutputByteBufferNano;)V
 HSPLcom/android/internal/logging/AndroidConfig;-><init>()V
 HSPLcom/android/internal/logging/AndroidHandler$1;->format(Ljava/util/logging/LogRecord;)Ljava/lang/String;
 HSPLcom/android/internal/logging/AndroidHandler;-><init>()V
@@ -31642,6 +28359,7 @@
 HSPLcom/android/internal/logging/InstanceId;-><init>(I)V
 HSPLcom/android/internal/logging/InstanceId;-><init>(Landroid/os/Parcel;)V
 HSPLcom/android/internal/logging/InstanceId;-><init>(Landroid/os/Parcel;Lcom/android/internal/logging/InstanceId$1;)V
+HSPLcom/android/internal/logging/InstanceId;->getId()I
 HSPLcom/android/internal/logging/MetricsLogger;-><init>()V
 HSPLcom/android/internal/logging/MetricsLogger;->action(I)V
 HSPLcom/android/internal/logging/MetricsLogger;->action(II)V
@@ -31653,7 +28371,6 @@
 HSPLcom/android/internal/logging/MetricsLogger;->count(Ljava/lang/String;I)V
 HSPLcom/android/internal/logging/MetricsLogger;->getLogger()Lcom/android/internal/logging/MetricsLogger;
 HSPLcom/android/internal/logging/MetricsLogger;->hidden(I)V
-HPLcom/android/internal/logging/MetricsLogger;->hidden(Landroid/content/Context;I)V
 HSPLcom/android/internal/logging/MetricsLogger;->histogram(Landroid/content/Context;Ljava/lang/String;I)V
 HSPLcom/android/internal/logging/MetricsLogger;->histogram(Ljava/lang/String;I)V
 HSPLcom/android/internal/logging/MetricsLogger;->saveLog(Landroid/metrics/LogMaker;)V
@@ -31662,10 +28379,10 @@
 HPLcom/android/internal/logging/MetricsLogger;->visible(Landroid/content/Context;I)V
 HSPLcom/android/internal/logging/MetricsLogger;->write(Landroid/metrics/LogMaker;)V
 HSPLcom/android/internal/logging/UiEventLoggerImpl;-><init>()V
+HSPLcom/android/internal/logging/UiEventLoggerImpl;->log(Lcom/android/internal/logging/UiEventLogger$UiEventEnum;)V
 HSPLcom/android/internal/logging/UiEventLoggerImpl;->log(Lcom/android/internal/logging/UiEventLogger$UiEventEnum;ILjava/lang/String;)V
 HSPLcom/android/internal/net/INetworkWatchlistManager$Stub;-><init>()V
 PLcom/android/internal/net/INetworkWatchlistManager$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/net/INetworkWatchlistManager;
-HPLcom/android/internal/net/INetworkWatchlistManager$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLcom/android/internal/notification/SystemNotificationChannels;->createAll(Landroid/content/Context;)V
 HSPLcom/android/internal/notification/SystemNotificationChannels;->newAccountChannel(Landroid/content/Context;)Landroid/app/NotificationChannel;
 HSPLcom/android/internal/notification/SystemNotificationChannels;->removeDeprecated(Landroid/content/Context;)V
@@ -31762,13 +28479,16 @@
 HSPLcom/android/internal/os/BatteryStatsHistory;->getNextParcel(Landroid/os/BatteryStats$HistoryItem;)Landroid/os/Parcel;
 HPLcom/android/internal/os/BatteryStatsHistory;->readFileToParcel(Landroid/os/Parcel;Landroid/util/AtomicFile;)Z
 HSPLcom/android/internal/os/BatteryStatsHistory;->readFromParcel(Landroid/os/Parcel;)V
+HSPLcom/android/internal/os/BatteryStatsHistory;->resetAllFiles()V
 HSPLcom/android/internal/os/BatteryStatsHistory;->setActiveFile(I)V
 HPLcom/android/internal/os/BatteryStatsHistory;->skipHead(Landroid/os/Parcel;)Z
 HSPLcom/android/internal/os/BatteryStatsHistory;->startIteratingHistory()Z
 HSPLcom/android/internal/os/BatteryStatsHistory;->startNextFile()V
+HSPLcom/android/internal/os/BatteryStatsHistory;->writeToParcel(Landroid/os/Parcel;)V
 HSPLcom/android/internal/os/BatteryStatsImpl$1;-><init>(Lcom/android/internal/os/BatteryStatsImpl;)V
 HSPLcom/android/internal/os/BatteryStatsImpl$2;-><init>(Lcom/android/internal/os/BatteryStatsImpl;)V
-PLcom/android/internal/os/BatteryStatsImpl$2;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+HPLcom/android/internal/os/BatteryStatsImpl$2;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+HSPLcom/android/internal/os/BatteryStatsImpl$3;->run()V
 HSPLcom/android/internal/os/BatteryStatsImpl$5;-><init>(Lcom/android/internal/os/BatteryStatsImpl;Landroid/os/Parcel;Landroid/util/AtomicFile;)V
 HSPLcom/android/internal/os/BatteryStatsImpl$5;->run()V
 HSPLcom/android/internal/os/BatteryStatsImpl$BatchTimer;-><init>(Lcom/android/internal/os/BatteryStatsImpl$Clocks;Lcom/android/internal/os/BatteryStatsImpl$Uid;ILcom/android/internal/os/BatteryStatsImpl$TimeBase;)V
@@ -31781,6 +28501,7 @@
 HSPLcom/android/internal/os/BatteryStatsImpl$BatchTimer;->recomputeLastDuration(JZ)V
 HSPLcom/android/internal/os/BatteryStatsImpl$BluetoothActivityInfoCache;-><init>(Lcom/android/internal/os/BatteryStatsImpl;)V
 HSPLcom/android/internal/os/BatteryStatsImpl$BluetoothActivityInfoCache;-><init>(Lcom/android/internal/os/BatteryStatsImpl;Lcom/android/internal/os/BatteryStatsImpl$1;)V
+HPLcom/android/internal/os/BatteryStatsImpl$BluetoothActivityInfoCache;->set(Landroid/bluetooth/BluetoothActivityEnergyInfo;)V
 HSPLcom/android/internal/os/BatteryStatsImpl$Constants;-><init>(Lcom/android/internal/os/BatteryStatsImpl;Landroid/os/Handler;)V
 HSPLcom/android/internal/os/BatteryStatsImpl$Constants;->startObserving(Landroid/content/ContentResolver;)V
 HSPLcom/android/internal/os/BatteryStatsImpl$Constants;->updateBatteryChargedDelayMsLocked()V
@@ -31800,40 +28521,46 @@
 HSPLcom/android/internal/os/BatteryStatsImpl$ControllerActivityCounterImpl;->getRxTimeCounter()Lcom/android/internal/os/BatteryStatsImpl$LongSamplingCounter;
 HPLcom/android/internal/os/BatteryStatsImpl$ControllerActivityCounterImpl;->getScanTimeCounter()Landroid/os/BatteryStats$LongCounter;
 HSPLcom/android/internal/os/BatteryStatsImpl$ControllerActivityCounterImpl;->getScanTimeCounter()Lcom/android/internal/os/BatteryStatsImpl$LongSamplingCounter;
-PLcom/android/internal/os/BatteryStatsImpl$ControllerActivityCounterImpl;->getSleepTimeCounter()Landroid/os/BatteryStats$LongCounter;
+HPLcom/android/internal/os/BatteryStatsImpl$ControllerActivityCounterImpl;->getSleepTimeCounter()Landroid/os/BatteryStats$LongCounter;
 HPLcom/android/internal/os/BatteryStatsImpl$ControllerActivityCounterImpl;->getSleepTimeCounter()Lcom/android/internal/os/BatteryStatsImpl$LongSamplingCounter;
 HSPLcom/android/internal/os/BatteryStatsImpl$ControllerActivityCounterImpl;->getTxTimeCounters()[Landroid/os/BatteryStats$LongCounter;
 HSPLcom/android/internal/os/BatteryStatsImpl$ControllerActivityCounterImpl;->getTxTimeCounters()[Lcom/android/internal/os/BatteryStatsImpl$LongSamplingCounter;
 HSPLcom/android/internal/os/BatteryStatsImpl$ControllerActivityCounterImpl;->readSummaryFromParcel(Landroid/os/Parcel;)V
+HSPLcom/android/internal/os/BatteryStatsImpl$ControllerActivityCounterImpl;->reset(Z)V
 HSPLcom/android/internal/os/BatteryStatsImpl$ControllerActivityCounterImpl;->writeSummaryToParcel(Landroid/os/Parcel;)V
 HSPLcom/android/internal/os/BatteryStatsImpl$Counter;-><init>(Lcom/android/internal/os/BatteryStatsImpl$TimeBase;)V
 HPLcom/android/internal/os/BatteryStatsImpl$Counter;->addAtomic(I)V
+HSPLcom/android/internal/os/BatteryStatsImpl$Counter;->detach()V
 HPLcom/android/internal/os/BatteryStatsImpl$Counter;->getCountLocked(I)I
 HSPLcom/android/internal/os/BatteryStatsImpl$Counter;->onTimeStarted(JJJ)V
 HSPLcom/android/internal/os/BatteryStatsImpl$Counter;->onTimeStopped(JJJ)V
 HSPLcom/android/internal/os/BatteryStatsImpl$Counter;->readSummaryFromParcelLocked(Landroid/os/Parcel;)V
+HSPLcom/android/internal/os/BatteryStatsImpl$Counter;->reset(Z)Z
 HSPLcom/android/internal/os/BatteryStatsImpl$Counter;->stepAtomic()V
 HSPLcom/android/internal/os/BatteryStatsImpl$Counter;->writeSummaryFromParcelLocked(Landroid/os/Parcel;)V
 HSPLcom/android/internal/os/BatteryStatsImpl$DualTimer;-><init>(Lcom/android/internal/os/BatteryStatsImpl$Clocks;Lcom/android/internal/os/BatteryStatsImpl$Uid;ILjava/util/ArrayList;Lcom/android/internal/os/BatteryStatsImpl$TimeBase;Lcom/android/internal/os/BatteryStatsImpl$TimeBase;)V
+HSPLcom/android/internal/os/BatteryStatsImpl$DualTimer;->detach()V
 HPLcom/android/internal/os/BatteryStatsImpl$DualTimer;->getSubTimer()Landroid/os/BatteryStats$Timer;
 HPLcom/android/internal/os/BatteryStatsImpl$DualTimer;->getSubTimer()Lcom/android/internal/os/BatteryStatsImpl$DurationTimer;
 HSPLcom/android/internal/os/BatteryStatsImpl$DualTimer;->readSummaryFromParcelLocked(Landroid/os/Parcel;)V
+HSPLcom/android/internal/os/BatteryStatsImpl$DualTimer;->reset(Z)Z
 HSPLcom/android/internal/os/BatteryStatsImpl$DualTimer;->startRunningLocked(J)V
 HSPLcom/android/internal/os/BatteryStatsImpl$DualTimer;->stopRunningLocked(J)V
 HSPLcom/android/internal/os/BatteryStatsImpl$DualTimer;->writeSummaryFromParcelLocked(Landroid/os/Parcel;J)V
-HSPLcom/android/internal/os/BatteryStatsImpl$DurationTimer;-><init>(Lcom/android/internal/os/BatteryStatsImpl$Clocks;Lcom/android/internal/os/BatteryStatsImpl$Uid;ILjava/util/ArrayList;Lcom/android/internal/os/BatteryStatsImpl$TimeBase;)V
 HSPLcom/android/internal/os/BatteryStatsImpl$DurationTimer;->getCurrentDurationMsLocked(J)J
 HSPLcom/android/internal/os/BatteryStatsImpl$DurationTimer;->getMaxDurationMsLocked(J)J
 HSPLcom/android/internal/os/BatteryStatsImpl$DurationTimer;->getTotalDurationMsLocked(J)J
 HSPLcom/android/internal/os/BatteryStatsImpl$DurationTimer;->onTimeStarted(JJJ)V
 HSPLcom/android/internal/os/BatteryStatsImpl$DurationTimer;->onTimeStopped(JJJ)V
 HSPLcom/android/internal/os/BatteryStatsImpl$DurationTimer;->readSummaryFromParcelLocked(Landroid/os/Parcel;)V
+HSPLcom/android/internal/os/BatteryStatsImpl$DurationTimer;->reset(Z)Z
 HSPLcom/android/internal/os/BatteryStatsImpl$DurationTimer;->startRunningLocked(J)V
 HSPLcom/android/internal/os/BatteryStatsImpl$DurationTimer;->stopRunningLocked(J)V
 HSPLcom/android/internal/os/BatteryStatsImpl$DurationTimer;->writeSummaryFromParcelLocked(Landroid/os/Parcel;J)V
 HSPLcom/android/internal/os/BatteryStatsImpl$LongSamplingCounter;-><init>(Lcom/android/internal/os/BatteryStatsImpl$TimeBase;)V
 HSPLcom/android/internal/os/BatteryStatsImpl$LongSamplingCounter;->addCountLocked(J)V
 HSPLcom/android/internal/os/BatteryStatsImpl$LongSamplingCounter;->addCountLocked(JZ)V
+HSPLcom/android/internal/os/BatteryStatsImpl$LongSamplingCounter;->detach()V
 HSPLcom/android/internal/os/BatteryStatsImpl$LongSamplingCounter;->getCountLocked(I)J
 HSPLcom/android/internal/os/BatteryStatsImpl$LongSamplingCounter;->onTimeStarted(JJJ)V
 HSPLcom/android/internal/os/BatteryStatsImpl$LongSamplingCounter;->onTimeStopped(JJJ)V
@@ -31851,12 +28578,14 @@
 HSPLcom/android/internal/os/BatteryStatsImpl$LongSamplingCounterArray;->onTimeStopped(JJJ)V
 HSPLcom/android/internal/os/BatteryStatsImpl$LongSamplingCounterArray;->readSummaryFromParcelLocked(Landroid/os/Parcel;)V
 HSPLcom/android/internal/os/BatteryStatsImpl$LongSamplingCounterArray;->readSummaryFromParcelLocked(Landroid/os/Parcel;Lcom/android/internal/os/BatteryStatsImpl$TimeBase;)Lcom/android/internal/os/BatteryStatsImpl$LongSamplingCounterArray;
+HSPLcom/android/internal/os/BatteryStatsImpl$LongSamplingCounterArray;->reset(Z)Z
 HSPLcom/android/internal/os/BatteryStatsImpl$LongSamplingCounterArray;->writeSummaryToParcelLocked(Landroid/os/Parcel;)V
 HSPLcom/android/internal/os/BatteryStatsImpl$LongSamplingCounterArray;->writeSummaryToParcelLocked(Landroid/os/Parcel;Lcom/android/internal/os/BatteryStatsImpl$LongSamplingCounterArray;)V
 HSPLcom/android/internal/os/BatteryStatsImpl$MyHandler;-><init>(Lcom/android/internal/os/BatteryStatsImpl;Landroid/os/Looper;)V
 HSPLcom/android/internal/os/BatteryStatsImpl$MyHandler;->handleMessage(Landroid/os/Message;)V
 HSPLcom/android/internal/os/BatteryStatsImpl$OverflowArrayMap;-><init>(Lcom/android/internal/os/BatteryStatsImpl;I)V
 HSPLcom/android/internal/os/BatteryStatsImpl$OverflowArrayMap;->add(Ljava/lang/String;Ljava/lang/Object;)V
+HSPLcom/android/internal/os/BatteryStatsImpl$OverflowArrayMap;->cleanup()V
 HSPLcom/android/internal/os/BatteryStatsImpl$OverflowArrayMap;->getMap()Landroid/util/ArrayMap;
 HSPLcom/android/internal/os/BatteryStatsImpl$OverflowArrayMap;->startObject(Ljava/lang/String;)Ljava/lang/Object;
 HSPLcom/android/internal/os/BatteryStatsImpl$OverflowArrayMap;->stopObject(Ljava/lang/String;)Ljava/lang/Object;
@@ -31873,10 +28602,12 @@
 HSPLcom/android/internal/os/BatteryStatsImpl$StopwatchTimer;-><init>(Lcom/android/internal/os/BatteryStatsImpl$Clocks;Lcom/android/internal/os/BatteryStatsImpl$Uid;ILjava/util/ArrayList;Lcom/android/internal/os/BatteryStatsImpl$TimeBase;)V
 HSPLcom/android/internal/os/BatteryStatsImpl$StopwatchTimer;->computeCurrentCountLocked()I
 HSPLcom/android/internal/os/BatteryStatsImpl$StopwatchTimer;->computeRunTimeLocked(J)J
+HSPLcom/android/internal/os/BatteryStatsImpl$StopwatchTimer;->detach()V
 HPLcom/android/internal/os/BatteryStatsImpl$StopwatchTimer;->isRunningLocked()Z
 HSPLcom/android/internal/os/BatteryStatsImpl$StopwatchTimer;->onTimeStopped(JJJ)V
 HSPLcom/android/internal/os/BatteryStatsImpl$StopwatchTimer;->readSummaryFromParcelLocked(Landroid/os/Parcel;)V
 HSPLcom/android/internal/os/BatteryStatsImpl$StopwatchTimer;->refreshTimersLocked(JLjava/util/ArrayList;Lcom/android/internal/os/BatteryStatsImpl$StopwatchTimer;)J
+HSPLcom/android/internal/os/BatteryStatsImpl$StopwatchTimer;->reset(Z)Z
 HPLcom/android/internal/os/BatteryStatsImpl$StopwatchTimer;->setMark(J)V
 HSPLcom/android/internal/os/BatteryStatsImpl$StopwatchTimer;->setTimeout(J)V
 HSPLcom/android/internal/os/BatteryStatsImpl$StopwatchTimer;->startRunningLocked(J)V
@@ -31897,6 +28628,7 @@
 HSPLcom/android/internal/os/BatteryStatsImpl$TimeBase;->setRunning(ZJJ)Z
 HSPLcom/android/internal/os/BatteryStatsImpl$TimeBase;->writeSummaryToParcel(Landroid/os/Parcel;JJ)V
 HSPLcom/android/internal/os/BatteryStatsImpl$Timer;-><init>(Lcom/android/internal/os/BatteryStatsImpl$Clocks;ILcom/android/internal/os/BatteryStatsImpl$TimeBase;)V
+HSPLcom/android/internal/os/BatteryStatsImpl$Timer;->detach()V
 HPLcom/android/internal/os/BatteryStatsImpl$Timer;->getCountLocked(I)I
 HSPLcom/android/internal/os/BatteryStatsImpl$Timer;->getTimeSinceMarkLocked(J)J
 HSPLcom/android/internal/os/BatteryStatsImpl$Timer;->getTotalTimeLocked(JI)J
@@ -31914,6 +28646,7 @@
 HSPLcom/android/internal/os/BatteryStatsImpl$Uid$3;->instantiateObject()Lcom/android/internal/os/BatteryStatsImpl$DualTimer;
 HSPLcom/android/internal/os/BatteryStatsImpl$Uid$3;->instantiateObject()Ljava/lang/Object;
 HSPLcom/android/internal/os/BatteryStatsImpl$Uid$Pkg$Serv;-><init>(Lcom/android/internal/os/BatteryStatsImpl;)V
+HSPLcom/android/internal/os/BatteryStatsImpl$Uid$Pkg$Serv;->detach()V
 HSPLcom/android/internal/os/BatteryStatsImpl$Uid$Pkg$Serv;->getBatteryStats()Lcom/android/internal/os/BatteryStatsImpl;
 HPLcom/android/internal/os/BatteryStatsImpl$Uid$Pkg$Serv;->getLaunches(I)I
 HPLcom/android/internal/os/BatteryStatsImpl$Uid$Pkg$Serv;->getStartTime(JI)J
@@ -31925,6 +28658,7 @@
 HSPLcom/android/internal/os/BatteryStatsImpl$Uid$Pkg$Serv;->stopLaunchedLocked()V
 HPLcom/android/internal/os/BatteryStatsImpl$Uid$Pkg$Serv;->stopRunningLocked()V
 HSPLcom/android/internal/os/BatteryStatsImpl$Uid$Pkg;-><init>(Lcom/android/internal/os/BatteryStatsImpl;)V
+HSPLcom/android/internal/os/BatteryStatsImpl$Uid$Pkg;->detach()V
 HPLcom/android/internal/os/BatteryStatsImpl$Uid$Pkg;->getServiceStats()Landroid/util/ArrayMap;
 HPLcom/android/internal/os/BatteryStatsImpl$Uid$Pkg;->getWakeupAlarmStats()Landroid/util/ArrayMap;
 HPLcom/android/internal/os/BatteryStatsImpl$Uid$Pkg;->noteWakeupAlarmLocked(Ljava/lang/String;)V
@@ -31934,6 +28668,7 @@
 HSPLcom/android/internal/os/BatteryStatsImpl$Uid$Proc;->addCpuTimeLocked(II)V
 HSPLcom/android/internal/os/BatteryStatsImpl$Uid$Proc;->addCpuTimeLocked(IIZ)V
 HPLcom/android/internal/os/BatteryStatsImpl$Uid$Proc;->addForegroundTimeLocked(J)V
+HSPLcom/android/internal/os/BatteryStatsImpl$Uid$Proc;->detach()V
 HSPLcom/android/internal/os/BatteryStatsImpl$Uid$Proc;->getForegroundTime(I)J
 HPLcom/android/internal/os/BatteryStatsImpl$Uid$Proc;->getNumAnrs(I)I
 HPLcom/android/internal/os/BatteryStatsImpl$Uid$Proc;->getNumCrashes(I)I
@@ -31953,6 +28688,7 @@
 HSPLcom/android/internal/os/BatteryStatsImpl$Uid$Wakelock;-><init>(Lcom/android/internal/os/BatteryStatsImpl;Lcom/android/internal/os/BatteryStatsImpl$Uid;)V
 HSPLcom/android/internal/os/BatteryStatsImpl$Uid$Wakelock;->getWakeTime(I)Landroid/os/BatteryStats$Timer;
 HSPLcom/android/internal/os/BatteryStatsImpl$Uid$Wakelock;->getWakeTime(I)Lcom/android/internal/os/BatteryStatsImpl$Timer;
+HSPLcom/android/internal/os/BatteryStatsImpl$Uid$Wakelock;->reset()Z
 HSPLcom/android/internal/os/BatteryStatsImpl$Uid;-><init>(Lcom/android/internal/os/BatteryStatsImpl;I)V
 HSPLcom/android/internal/os/BatteryStatsImpl$Uid;->access$2400(Lcom/android/internal/os/BatteryStatsImpl$Uid;)Lcom/android/internal/os/BatteryStatsImpl$LongSamplingCounter;
 HSPLcom/android/internal/os/BatteryStatsImpl$Uid;->access$2402(Lcom/android/internal/os/BatteryStatsImpl$Uid;Lcom/android/internal/os/BatteryStatsImpl$LongSamplingCounter;)Lcom/android/internal/os/BatteryStatsImpl$LongSamplingCounter;
@@ -31969,6 +28705,7 @@
 HSPLcom/android/internal/os/BatteryStatsImpl$Uid;->createForegroundServiceTimerLocked()Lcom/android/internal/os/BatteryStatsImpl$StopwatchTimer;
 HSPLcom/android/internal/os/BatteryStatsImpl$Uid;->createVibratorOnTimerLocked()Lcom/android/internal/os/BatteryStatsImpl$BatchTimer;
 HSPLcom/android/internal/os/BatteryStatsImpl$Uid;->createVideoTurnedOnTimerLocked()Lcom/android/internal/os/BatteryStatsImpl$StopwatchTimer;
+HSPLcom/android/internal/os/BatteryStatsImpl$Uid;->detachFromTimeBase()V
 HPLcom/android/internal/os/BatteryStatsImpl$Uid;->getAggregatedPartialWakelockTimer()Landroid/os/BatteryStats$Timer;
 HPLcom/android/internal/os/BatteryStatsImpl$Uid;->getAggregatedPartialWakelockTimer()Lcom/android/internal/os/BatteryStatsImpl$Timer;
 HSPLcom/android/internal/os/BatteryStatsImpl$Uid;->getAudioTurnedOnTimer()Landroid/os/BatteryStats$Timer;
@@ -32076,6 +28813,8 @@
 HSPLcom/android/internal/os/BatteryStatsImpl$Uid;->noteUserActivityLocked(I)V
 HPLcom/android/internal/os/BatteryStatsImpl$Uid;->noteVibratorOffLocked()V
 HPLcom/android/internal/os/BatteryStatsImpl$Uid;->noteVibratorOnLocked(J)V
+HPLcom/android/internal/os/BatteryStatsImpl$Uid;->noteVideoTurnedOffLocked(J)V
+HPLcom/android/internal/os/BatteryStatsImpl$Uid;->noteVideoTurnedOnLocked(J)V
 HPLcom/android/internal/os/BatteryStatsImpl$Uid;->noteWifiMulticastDisabledLocked(J)V
 HPLcom/android/internal/os/BatteryStatsImpl$Uid;->noteWifiMulticastEnabledLocked(J)V
 HPLcom/android/internal/os/BatteryStatsImpl$Uid;->noteWifiRadioApWakeupLocked()V
@@ -32087,6 +28826,7 @@
 HSPLcom/android/internal/os/BatteryStatsImpl$Uid;->readSyncSummaryFromParcelLocked(Ljava/lang/String;Landroid/os/Parcel;)V
 HSPLcom/android/internal/os/BatteryStatsImpl$Uid;->readWakeSummaryFromParcelLocked(Ljava/lang/String;Landroid/os/Parcel;)V
 HSPLcom/android/internal/os/BatteryStatsImpl$Uid;->removeIsolatedUid(I)V
+HSPLcom/android/internal/os/BatteryStatsImpl$Uid;->reset(JJ)Z
 HSPLcom/android/internal/os/BatteryStatsImpl$Uid;->updateOnBatteryBgTimeBase(JJ)Z
 HSPLcom/android/internal/os/BatteryStatsImpl$Uid;->updateOnBatteryScreenOffBgTimeBase(JJ)Z
 HSPLcom/android/internal/os/BatteryStatsImpl$Uid;->updateUidProcessStateLocked(I)V
@@ -32135,7 +28875,7 @@
 HSPLcom/android/internal/os/BatteryStatsImpl;->detachIfNotNull([[Lcom/android/internal/os/BatteryStatsImpl$TimeBaseObs;)V
 HPLcom/android/internal/os/BatteryStatsImpl;->excludeFromStringArray([Ljava/lang/String;Ljava/lang/String;)[Ljava/lang/String;
 HSPLcom/android/internal/os/BatteryStatsImpl;->finishAddingCpuLocked(IIIIIIII)V
-PLcom/android/internal/os/BatteryStatsImpl;->finishIteratingHistoryLocked()V
+HPLcom/android/internal/os/BatteryStatsImpl;->finishIteratingHistoryLocked()V
 HPLcom/android/internal/os/BatteryStatsImpl;->getAttributionUid(ILandroid/os/WorkSource$WorkChain;)I
 HSPLcom/android/internal/os/BatteryStatsImpl;->getBatteryRealtime(J)J
 HSPLcom/android/internal/os/BatteryStatsImpl;->getBatteryUptime(J)J
@@ -32231,6 +28971,7 @@
 HSPLcom/android/internal/os/BatteryStatsImpl;->hasWifiActivityReporting()Z
 HPLcom/android/internal/os/BatteryStatsImpl;->includeInStringArray([Ljava/lang/String;Ljava/lang/String;)[Ljava/lang/String;
 HSPLcom/android/internal/os/BatteryStatsImpl;->init(Lcom/android/internal/os/BatteryStatsImpl$Clocks;)V
+HSPLcom/android/internal/os/BatteryStatsImpl;->initActiveHistoryEventsLocked(JJ)V
 HSPLcom/android/internal/os/BatteryStatsImpl;->initDischarge()V
 HSPLcom/android/internal/os/BatteryStatsImpl;->initTimes(JJ)V
 HPLcom/android/internal/os/BatteryStatsImpl;->isCharging()Z
@@ -32288,6 +29029,7 @@
 HPLcom/android/internal/os/BatteryStatsImpl;->notePhoneStateLocked(II)V
 HSPLcom/android/internal/os/BatteryStatsImpl;->notePowerSaveModeLocked(Z)V
 PLcom/android/internal/os/BatteryStatsImpl;->noteProcessAnrLocked(Ljava/lang/String;I)V
+HPLcom/android/internal/os/BatteryStatsImpl;->noteProcessCrashLocked(Ljava/lang/String;I)V
 HSPLcom/android/internal/os/BatteryStatsImpl;->noteProcessDiedLocked(II)V
 HSPLcom/android/internal/os/BatteryStatsImpl;->noteProcessFinishLocked(Ljava/lang/String;I)V
 HSPLcom/android/internal/os/BatteryStatsImpl;->noteProcessStartLocked(Ljava/lang/String;I)V
@@ -32309,6 +29051,8 @@
 HSPLcom/android/internal/os/BatteryStatsImpl;->noteUserActivityLocked(II)V
 HPLcom/android/internal/os/BatteryStatsImpl;->noteVibratorOffLocked(I)V
 HPLcom/android/internal/os/BatteryStatsImpl;->noteVibratorOnLocked(IJ)V
+HPLcom/android/internal/os/BatteryStatsImpl;->noteVideoOffLocked(I)V
+HPLcom/android/internal/os/BatteryStatsImpl;->noteVideoOnLocked(I)V
 HPLcom/android/internal/os/BatteryStatsImpl;->noteWakeUpLocked(Ljava/lang/String;I)V
 HPLcom/android/internal/os/BatteryStatsImpl;->noteWakeupReasonLocked(Ljava/lang/String;)V
 HPLcom/android/internal/os/BatteryStatsImpl;->noteWakupAlarmLocked(Ljava/lang/String;ILandroid/os/WorkSource;Ljava/lang/String;)V
@@ -32345,13 +29089,14 @@
 HSPLcom/android/internal/os/BatteryStatsImpl;->readSummaryFromParcel(Landroid/os/Parcel;)V
 HSPLcom/android/internal/os/BatteryStatsImpl;->recordCurrentTimeChangeLocked(JJJ)V
 HSPLcom/android/internal/os/BatteryStatsImpl;->recordDailyStatsIfNeededLocked(Z)V
+HSPLcom/android/internal/os/BatteryStatsImpl;->recordDailyStatsLocked()V
 HSPLcom/android/internal/os/BatteryStatsImpl;->registerUsbStateReceiver(Landroid/content/Context;)V
 HSPLcom/android/internal/os/BatteryStatsImpl;->removeIsolatedUidLocked(I)V
 HSPLcom/android/internal/os/BatteryStatsImpl;->reportChangesToStatsLog(Landroid/os/BatteryStats$HistoryItem;III)V
 HSPLcom/android/internal/os/BatteryStatsImpl;->requestImmediateCpuUpdate()V
+HSPLcom/android/internal/os/BatteryStatsImpl;->resetAllStatsLocked()V
 HSPLcom/android/internal/os/BatteryStatsImpl;->scheduleRemoveIsolatedUidLocked(II)V
 HSPLcom/android/internal/os/BatteryStatsImpl;->scheduleSyncExternalStatsLocked(Ljava/lang/String;I)V
-HSPLcom/android/internal/os/BatteryStatsImpl;->setBatteryStateLocked(IIIIIIII)V
 HSPLcom/android/internal/os/BatteryStatsImpl;->setCallback(Lcom/android/internal/os/BatteryStatsImpl$BatteryCallback;)V
 HSPLcom/android/internal/os/BatteryStatsImpl;->setChargingLocked(Z)Z
 HSPLcom/android/internal/os/BatteryStatsImpl;->setExternalStatsSyncLocked(Lcom/android/internal/os/BatteryStatsImpl$ExternalStatsSync;)V
@@ -32380,6 +29125,8 @@
 HSPLcom/android/internal/os/BatteryStatsImpl;->updateTimeBasesLocked(ZIJJ)V
 HSPLcom/android/internal/os/BatteryStatsImpl;->updateWifiState(Landroid/os/connectivity/WifiActivityEnergyInfo;)V
 HSPLcom/android/internal/os/BatteryStatsImpl;->writeAsyncLocked()V
+HSPLcom/android/internal/os/BatteryStatsImpl;->writeDailyItemsLocked(Lorg/xmlpull/v1/XmlSerializer;)V
+HSPLcom/android/internal/os/BatteryStatsImpl;->writeDailyLevelSteps(Lorg/xmlpull/v1/XmlSerializer;Ljava/lang/String;Landroid/os/BatteryStats$LevelStepTracker;Ljava/lang/StringBuilder;)V
 HSPLcom/android/internal/os/BatteryStatsImpl;->writeHistoryBuffer(Landroid/os/Parcel;ZZ)V
 HSPLcom/android/internal/os/BatteryStatsImpl;->writeHistoryDelta(Landroid/os/Parcel;Landroid/os/BatteryStats$HistoryItem;Landroid/os/BatteryStats$HistoryItem;)V
 HSPLcom/android/internal/os/BatteryStatsImpl;->writeHistoryLocked(Z)V
@@ -32445,7 +29192,7 @@
 HSPLcom/android/internal/os/CachedDeviceState$TimeInStateStopwatch;-><init>(Lcom/android/internal/os/CachedDeviceState;)V
 HSPLcom/android/internal/os/CachedDeviceState$TimeInStateStopwatch;->access$000(Lcom/android/internal/os/CachedDeviceState$TimeInStateStopwatch;)V
 PLcom/android/internal/os/CachedDeviceState$TimeInStateStopwatch;->elapsedTime()J
-PLcom/android/internal/os/CachedDeviceState$TimeInStateStopwatch;->getMillis()J
+HPLcom/android/internal/os/CachedDeviceState$TimeInStateStopwatch;->getMillis()J
 HSPLcom/android/internal/os/CachedDeviceState$TimeInStateStopwatch;->isRunning()Z
 HSPLcom/android/internal/os/CachedDeviceState$TimeInStateStopwatch;->reset()V
 HSPLcom/android/internal/os/CachedDeviceState$TimeInStateStopwatch;->start()V
@@ -32464,9 +29211,7 @@
 HSPLcom/android/internal/os/ClassLoaderFactory;->createClassLoader(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;IZLjava/lang/String;)Ljava/lang/ClassLoader;
 HSPLcom/android/internal/os/ClassLoaderFactory;->createClassLoader(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;IZLjava/lang/String;Ljava/util/List;)Ljava/lang/ClassLoader;
 HSPLcom/android/internal/os/ClassLoaderFactory;->getPathClassLoaderName()Ljava/lang/String;
-HSPLcom/android/internal/os/ClassLoaderFactory;->isDelegateLastClassLoaderName(Ljava/lang/String;)Z
 HSPLcom/android/internal/os/ClassLoaderFactory;->isPathClassLoaderName(Ljava/lang/String;)Z
-HSPLcom/android/internal/os/ClassLoaderFactory;->isValidClassLoaderName(Ljava/lang/String;)Z
 HSPLcom/android/internal/os/CpuPowerCalculator;-><init>(Lcom/android/internal/os/PowerProfile;)V
 HSPLcom/android/internal/os/CpuPowerCalculator;->calculateApp(Lcom/android/internal/os/BatterySipper;Landroid/os/BatteryStats$Uid;JJI)V
 HSPLcom/android/internal/os/FlashlightPowerCalculator;-><init>(Lcom/android/internal/os/PowerProfile;)V
@@ -32486,10 +29231,9 @@
 HSPLcom/android/internal/os/HandlerCaller;->obtainMessageOOO(ILjava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Landroid/os/Message;
 HSPLcom/android/internal/os/HandlerCaller;->sendMessage(Landroid/os/Message;)V
 HSPLcom/android/internal/os/IDropBoxManagerService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLcom/android/internal/os/IDropBoxManagerService$Stub$Proxy;->add(Landroid/os/DropBoxManager$Entry;)V
-HSPLcom/android/internal/os/IDropBoxManagerService$Stub$Proxy;->getNextEntry(Ljava/lang/String;JLjava/lang/String;)Landroid/os/DropBoxManager$Entry;
 HSPLcom/android/internal/os/IDropBoxManagerService$Stub;-><init>()V
 HSPLcom/android/internal/os/IDropBoxManagerService$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/os/IDropBoxManagerService;
+PLcom/android/internal/os/IDropBoxManagerService$Stub;->getDefaultTransactionName(I)Ljava/lang/String;
 HPLcom/android/internal/os/IDropBoxManagerService$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLcom/android/internal/os/IResultReceiver$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HSPLcom/android/internal/os/IResultReceiver$Stub$Proxy;->asBinder()Landroid/os/IBinder;
@@ -32500,7 +29244,6 @@
 HSPLcom/android/internal/os/IResultReceiver$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLcom/android/internal/os/KernelCpuProcStringReader$ProcFileIterator;-><init>(Lcom/android/internal/os/KernelCpuProcStringReader;I)V
 HSPLcom/android/internal/os/KernelCpuProcStringReader$ProcFileIterator;->close()V
-HSPLcom/android/internal/os/KernelCpuProcStringReader$ProcFileIterator;->hasNextLine()Z
 HSPLcom/android/internal/os/KernelCpuProcStringReader$ProcFileIterator;->nextLine()Ljava/nio/CharBuffer;
 HSPLcom/android/internal/os/KernelCpuProcStringReader;->access$100(Lcom/android/internal/os/KernelCpuProcStringReader;)Ljava/util/concurrent/locks/ReentrantReadWriteLock$ReadLock;
 HSPLcom/android/internal/os/KernelCpuProcStringReader;->asLongs(Ljava/nio/CharBuffer;[J)I
@@ -32542,6 +29285,7 @@
 HPLcom/android/internal/os/KernelCpuThreadReaderDiff;->changeToDiffs(Ljava/util/Map;Lcom/android/internal/os/KernelCpuThreadReader$ProcessCpuUsage;)V
 HPLcom/android/internal/os/KernelCpuThreadReaderDiff;->cpuTimeDiff([I[I)[I
 HPLcom/android/internal/os/KernelCpuThreadReaderDiff;->createCpuUsageMap(Ljava/util/List;)Ljava/util/Map;
+PLcom/android/internal/os/KernelCpuThreadReaderDiff;->getCpuFrequenciesKhz()[I
 HPLcom/android/internal/os/KernelCpuThreadReaderDiff;->getProcessCpuUsageDiffed()Ljava/util/ArrayList;
 HPLcom/android/internal/os/KernelCpuThreadReaderDiff;->totalCpuUsage([I)I
 HSPLcom/android/internal/os/KernelCpuThreadReaderSettingsObserver$UidPredicate;-><init>(Ljava/util/List;)V
@@ -32551,22 +29295,16 @@
 HSPLcom/android/internal/os/KernelCpuThreadReaderSettingsObserver;-><init>(Landroid/content/Context;)V
 HSPLcom/android/internal/os/KernelCpuThreadReaderSettingsObserver;->getSettingsModifiedReader(Landroid/content/Context;)Lcom/android/internal/os/KernelCpuThreadReaderDiff;
 HSPLcom/android/internal/os/KernelCpuUidTimeReader$KernelCpuUidActiveTimeReader;-><init>(Z)V
-HSPLcom/android/internal/os/KernelCpuUidTimeReader$KernelCpuUidActiveTimeReader;->checkPrecondition(Lcom/android/internal/os/KernelCpuProcStringReader$ProcFileIterator;)Z
 HSPLcom/android/internal/os/KernelCpuUidTimeReader$KernelCpuUidActiveTimeReader;->readDeltaImpl(Lcom/android/internal/os/KernelCpuUidTimeReader$Callback;)V
-HSPLcom/android/internal/os/KernelCpuUidTimeReader$KernelCpuUidActiveTimeReader;->sumActiveTime([J)J
 HSPLcom/android/internal/os/KernelCpuUidTimeReader$KernelCpuUidClusterTimeReader;-><init>(Z)V
-HSPLcom/android/internal/os/KernelCpuUidTimeReader$KernelCpuUidClusterTimeReader;->checkPrecondition(Lcom/android/internal/os/KernelCpuProcStringReader$ProcFileIterator;)Z
 HSPLcom/android/internal/os/KernelCpuUidTimeReader$KernelCpuUidClusterTimeReader;->readDeltaImpl(Lcom/android/internal/os/KernelCpuUidTimeReader$Callback;)V
 HSPLcom/android/internal/os/KernelCpuUidTimeReader$KernelCpuUidClusterTimeReader;->sumClusterTime()V
-HSPLcom/android/internal/os/KernelCpuUidTimeReader$KernelCpuUidFreqTimeReader;-><init>(Ljava/lang/String;Lcom/android/internal/os/KernelCpuProcStringReader;Z)V
 HSPLcom/android/internal/os/KernelCpuUidTimeReader$KernelCpuUidFreqTimeReader;-><init>(Z)V
-HSPLcom/android/internal/os/KernelCpuUidTimeReader$KernelCpuUidFreqTimeReader;->checkPrecondition(Lcom/android/internal/os/KernelCpuProcStringReader$ProcFileIterator;)Z
 HSPLcom/android/internal/os/KernelCpuUidTimeReader$KernelCpuUidFreqTimeReader;->copyToCurTimes()V
 HSPLcom/android/internal/os/KernelCpuUidTimeReader$KernelCpuUidFreqTimeReader;->extractClusterInfoFromProcFileFreqs()Landroid/util/IntArray;
 HSPLcom/android/internal/os/KernelCpuUidTimeReader$KernelCpuUidFreqTimeReader;->perClusterTimesAvailable()Z
 HSPLcom/android/internal/os/KernelCpuUidTimeReader$KernelCpuUidFreqTimeReader;->readDeltaImpl(Lcom/android/internal/os/KernelCpuUidTimeReader$Callback;)V
 HSPLcom/android/internal/os/KernelCpuUidTimeReader$KernelCpuUidFreqTimeReader;->readFreqs(Lcom/android/internal/os/PowerProfile;)[J
-HSPLcom/android/internal/os/KernelCpuUidTimeReader$KernelCpuUidFreqTimeReader;->readFreqs(Ljava/lang/String;)[J
 HSPLcom/android/internal/os/KernelCpuUidTimeReader$KernelCpuUidUserSysTimeReader;-><init>(Z)V
 HPLcom/android/internal/os/KernelCpuUidTimeReader$KernelCpuUidUserSysTimeReader;->readAbsoluteImpl(Lcom/android/internal/os/KernelCpuUidTimeReader$Callback;)V
 HSPLcom/android/internal/os/KernelCpuUidTimeReader$KernelCpuUidUserSysTimeReader;->readDeltaImpl(Lcom/android/internal/os/KernelCpuUidTimeReader$Callback;)V
@@ -32589,8 +29327,6 @@
 HSPLcom/android/internal/os/KernelWakelockStats;-><init>()V
 HSPLcom/android/internal/os/LoggingPrintStream$1;-><init>()V
 HSPLcom/android/internal/os/LoggingPrintStream;-><init>()V
-HSPLcom/android/internal/os/LoggingPrintStream;->flush(Z)V
-HSPLcom/android/internal/os/LoggingPrintStream;->println(Ljava/lang/Object;)V
 HSPLcom/android/internal/os/LoggingPrintStream;->println(Ljava/lang/String;)V
 HSPLcom/android/internal/os/LooperStats$Entry;-><init>(Ljava/lang/String;)V
 HSPLcom/android/internal/os/LooperStats$Entry;->idFor(Landroid/os/Message;Z)I
@@ -32603,7 +29339,7 @@
 HPLcom/android/internal/os/LooperStats;->getEntries()Ljava/util/List;
 HSPLcom/android/internal/os/LooperStats;->getSystemUptimeMillis()J
 HSPLcom/android/internal/os/LooperStats;->getThreadTimeMicro()J
-PLcom/android/internal/os/LooperStats;->maybeAddSpecialEntry(Ljava/util/List;Lcom/android/internal/os/LooperStats$Entry;)V
+HPLcom/android/internal/os/LooperStats;->maybeAddSpecialEntry(Ljava/util/List;Lcom/android/internal/os/LooperStats$Entry;)V
 HSPLcom/android/internal/os/LooperStats;->messageDispatchStarting()Ljava/lang/Object;
 HSPLcom/android/internal/os/LooperStats;->messageDispatched(Ljava/lang/Object;Landroid/os/Message;)V
 HSPLcom/android/internal/os/LooperStats;->reset()V
@@ -32744,6 +29480,7 @@
 HSPLcom/android/internal/os/Zygote;->disableExecuteOnly(I)V
 HSPLcom/android/internal/os/Zygote;->forkAndSpecialize(II[II[[IILjava/lang/String;Ljava/lang/String;[I[IZLjava/lang/String;Ljava/lang/String;IZ[Ljava/lang/String;)I
 HSPLcom/android/internal/os/Zygote;->forkAndSpecialize(II[II[[IILjava/lang/String;Ljava/lang/String;[I[IZLjava/lang/String;Ljava/lang/String;Z[Ljava/lang/String;)I
+HSPLcom/android/internal/os/Zygote;->forkAndSpecialize(II[II[[IILjava/lang/String;Ljava/lang/String;[I[IZLjava/lang/String;Ljava/lang/String;Z[Ljava/lang/String;Z)I
 HSPLcom/android/internal/os/Zygote;->forkSystemServer(II[II[[IJJ)I
 HSPLcom/android/internal/os/Zygote;->getConfigurationProperty(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
 HSPLcom/android/internal/os/Zygote;->getConfigurationPropertyBoolean(Ljava/lang/String;Ljava/lang/Boolean;)Z
@@ -32813,40 +29550,25 @@
 HSPLcom/android/internal/os/ZygoteServer;->setForkChild()V
 HSPLcom/android/internal/policy/-$$Lambda$PhoneWindow$9SyKQeTuaYx7qUIMJIr4Lk2OpYw;-><init>(Lcom/android/internal/policy/PhoneWindow;)V
 HSPLcom/android/internal/policy/-$$Lambda$PhoneWindow$9SyKQeTuaYx7qUIMJIr4Lk2OpYw;->onContentApplyWindowInsets(Landroid/view/WindowInsets;)Landroid/util/Pair;
+HSPLcom/android/internal/policy/-$$Lambda$PhoneWindow$F9lizKYeW8CQHD_8FLjKaBpUfBQ;->onContentApplyWindowInsets(Landroid/view/View;Landroid/view/WindowInsets;)Landroid/util/Pair;
 HSPLcom/android/internal/policy/DecorContext;-><init>(Landroid/content/Context;Landroid/content/Context;)V
 HSPLcom/android/internal/policy/DecorContext;->getAutofillOptions()Landroid/content/AutofillOptions;
 HSPLcom/android/internal/policy/DecorContext;->getContentCaptureOptions()Landroid/content/ContentCaptureOptions;
 HSPLcom/android/internal/policy/DecorContext;->getResources()Landroid/content/res/Resources;
 HSPLcom/android/internal/policy/DecorContext;->getSystemService(Ljava/lang/String;)Ljava/lang/Object;
 HSPLcom/android/internal/policy/DecorContext;->setPhoneWindow(Lcom/android/internal/policy/PhoneWindow;)V
-HSPLcom/android/internal/policy/DecorView$2;-><init>(Lcom/android/internal/policy/DecorView;Landroid/graphics/drawable/Drawable;IIII)V
 HSPLcom/android/internal/policy/DecorView$2;->getPadding(Landroid/graphics/Rect;)Z
-HSPLcom/android/internal/policy/DecorView$3;-><init>(Lcom/android/internal/policy/DecorView;Lcom/android/internal/policy/DecorView$ColorViewState;)V
 HSPLcom/android/internal/policy/DecorView$3;->run()V
-HSPLcom/android/internal/policy/DecorView$6;-><init>(Lcom/android/internal/policy/DecorView;Lcom/android/internal/view/FloatingActionMode;)V
-HSPLcom/android/internal/policy/DecorView$6;->onPreDraw()Z
-HSPLcom/android/internal/policy/DecorView$ActionModeCallback2Wrapper;-><init>(Lcom/android/internal/policy/DecorView;Landroid/view/ActionMode$Callback;)V
-HSPLcom/android/internal/policy/DecorView$ActionModeCallback2Wrapper;->onCreateActionMode(Landroid/view/ActionMode;Landroid/view/Menu;)Z
-HSPLcom/android/internal/policy/DecorView$ActionModeCallback2Wrapper;->onDestroyActionMode(Landroid/view/ActionMode;)V
-HSPLcom/android/internal/policy/DecorView$ActionModeCallback2Wrapper;->onGetContentRect(Landroid/view/ActionMode;Landroid/view/View;Landroid/graphics/Rect;)V
-HSPLcom/android/internal/policy/DecorView$ActionModeCallback2Wrapper;->onPrepareActionMode(Landroid/view/ActionMode;Landroid/view/Menu;)Z
 HSPLcom/android/internal/policy/DecorView$ColorViewAttributes;->isPresent(IIZ)Z
 HSPLcom/android/internal/policy/DecorView$ColorViewAttributes;->isPresent(Landroid/view/InsetsState;IZ)Z
+HSPLcom/android/internal/policy/DecorView$ColorViewAttributes;->isPresent(ZIZ)Z
 HSPLcom/android/internal/policy/DecorView$ColorViewAttributes;->isVisible(ZIIZ)Z
 HSPLcom/android/internal/policy/DecorView$ColorViewState;-><init>(Lcom/android/internal/policy/DecorView$ColorViewAttributes;)V
 HSPLcom/android/internal/policy/DecorView;-><init>(Landroid/content/Context;ILcom/android/internal/policy/PhoneWindow;Landroid/view/WindowManager$LayoutParams;)V
-HSPLcom/android/internal/policy/DecorView;->access$500(Lcom/android/internal/policy/DecorView;)Landroid/content/Context;
-HSPLcom/android/internal/policy/DecorView;->access$600(Lcom/android/internal/policy/DecorView;)Landroid/view/ActionMode;
-HSPLcom/android/internal/policy/DecorView;->access$602(Lcom/android/internal/policy/DecorView;Landroid/view/ActionMode;)Landroid/view/ActionMode;
-HSPLcom/android/internal/policy/DecorView;->access$800(Lcom/android/internal/policy/DecorView;)V
-HSPLcom/android/internal/policy/DecorView;->access$900(Lcom/android/internal/policy/DecorView;)Lcom/android/internal/policy/PhoneWindow;
 HSPLcom/android/internal/policy/DecorView;->calculateBarColor(IIIIIIZ)I
 HSPLcom/android/internal/policy/DecorView;->calculateNavigationBarColor()I
 HSPLcom/android/internal/policy/DecorView;->calculateStatusBarColor()I
-HSPLcom/android/internal/policy/DecorView;->cleanupFloatingActionModeViews()V
-HSPLcom/android/internal/policy/DecorView;->createActionMode(ILandroid/view/ActionMode$Callback2;Landroid/view/View;)Landroid/view/ActionMode;
 HSPLcom/android/internal/policy/DecorView;->createDecorCaptionView(Landroid/view/LayoutInflater;)Lcom/android/internal/widget/DecorCaptionView;
-HSPLcom/android/internal/policy/DecorView;->createFloatingActionMode(Landroid/view/View;Landroid/view/ActionMode$Callback2;)Landroid/view/ActionMode;
 HSPLcom/android/internal/policy/DecorView;->dispatchKeyEvent(Landroid/view/KeyEvent;)Z
 HSPLcom/android/internal/policy/DecorView;->dispatchPopulateAccessibilityEventInternal(Landroid/view/accessibility/AccessibilityEvent;)Z
 HSPLcom/android/internal/policy/DecorView;->dispatchTouchEvent(Landroid/view/MotionEvent;)Z
@@ -32861,17 +29583,21 @@
 HSPLcom/android/internal/policy/DecorView;->gatherTransparentRegion(Lcom/android/internal/policy/DecorView$ColorViewState;Landroid/graphics/Region;)Z
 HSPLcom/android/internal/policy/DecorView;->getAccessibilityViewId()I
 HSPLcom/android/internal/policy/DecorView;->getBackground()Landroid/graphics/drawable/Drawable;
+HSPLcom/android/internal/policy/DecorView;->getCaptionHeight()I
+HSPLcom/android/internal/policy/DecorView;->getCaptionInsetsHeight()I
 HSPLcom/android/internal/policy/DecorView;->getColorViewBottomInset(II)I
 HSPLcom/android/internal/policy/DecorView;->getColorViewRightInset(II)I
 HSPLcom/android/internal/policy/DecorView;->getColorViewTopInset(II)I
 HSPLcom/android/internal/policy/DecorView;->getNavBarSize(III)I
 HSPLcom/android/internal/policy/DecorView;->getResources()Landroid/content/res/Resources;
 HSPLcom/android/internal/policy/DecorView;->getTitleSuffix(Landroid/view/WindowManager$LayoutParams;)Ljava/lang/String;
+HSPLcom/android/internal/policy/DecorView;->getWindowInsetsController()Landroid/view/WindowInsetsController;
 HSPLcom/android/internal/policy/DecorView;->initResizingPaints()V
 HSPLcom/android/internal/policy/DecorView;->initializeElevation()V
 HSPLcom/android/internal/policy/DecorView;->isNavBarToLeftEdge(II)Z
 HSPLcom/android/internal/policy/DecorView;->isNavBarToRightEdge(II)Z
 HSPLcom/android/internal/policy/DecorView;->isResizing()Z
+HSPLcom/android/internal/policy/DecorView;->isShowingCaption()Z
 HSPLcom/android/internal/policy/DecorView;->onApplyWindowInsets(Landroid/view/WindowInsets;)Landroid/view/WindowInsets;
 HSPLcom/android/internal/policy/DecorView;->onAttachedToWindow()V
 HSPLcom/android/internal/policy/DecorView;->onCloseSystemDialogs(Ljava/lang/String;)V
@@ -32888,26 +29614,23 @@
 HSPLcom/android/internal/policy/DecorView;->onTouchEvent(Landroid/view/MotionEvent;)Z
 HSPLcom/android/internal/policy/DecorView;->onWindowFocusChanged(Z)V
 HSPLcom/android/internal/policy/DecorView;->onWindowSystemUiVisibilityChanged(I)V
+HSPLcom/android/internal/policy/DecorView;->providePendingInsetsController()Landroid/view/PendingInsetsController;
 HSPLcom/android/internal/policy/DecorView;->releaseThreadedRenderer()V
 HSPLcom/android/internal/policy/DecorView;->sendAccessibilityEvent(I)V
 HSPLcom/android/internal/policy/DecorView;->setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V
 HSPLcom/android/internal/policy/DecorView;->setBackgroundFallback(Landroid/graphics/drawable/Drawable;)V
 HSPLcom/android/internal/policy/DecorView;->setColor(Landroid/view/View;IIZZ)V
 HSPLcom/android/internal/policy/DecorView;->setFrame(IIII)Z
-HSPLcom/android/internal/policy/DecorView;->setHandledActionMode(Landroid/view/ActionMode;)V
-HSPLcom/android/internal/policy/DecorView;->setHandledFloatingActionMode(Landroid/view/ActionMode;)V
 HSPLcom/android/internal/policy/DecorView;->setWindow(Lcom/android/internal/policy/PhoneWindow;)V
 HSPLcom/android/internal/policy/DecorView;->setWindowBackground(Landroid/graphics/drawable/Drawable;)V
 HSPLcom/android/internal/policy/DecorView;->setWindowFrame(Landroid/graphics/drawable/Drawable;)V
-HSPLcom/android/internal/policy/DecorView;->showContextMenuForChildInternal(Landroid/view/View;FF)Z
-HSPLcom/android/internal/policy/DecorView;->startActionMode(Landroid/view/View;Landroid/view/ActionMode$Callback;I)Landroid/view/ActionMode;
-HSPLcom/android/internal/policy/DecorView;->startActionModeForChild(Landroid/view/View;Landroid/view/ActionMode$Callback;I)Landroid/view/ActionMode;
 HSPLcom/android/internal/policy/DecorView;->startChanging()V
 HSPLcom/android/internal/policy/DecorView;->superDispatchKeyEvent(Landroid/view/KeyEvent;)Z
 HSPLcom/android/internal/policy/DecorView;->superDispatchTouchEvent(Landroid/view/MotionEvent;)Z
 HSPLcom/android/internal/policy/DecorView;->updateAvailableWidth()V
 HSPLcom/android/internal/policy/DecorView;->updateBackgroundDrawable()V
 HSPLcom/android/internal/policy/DecorView;->updateColorViewInt(Lcom/android/internal/policy/DecorView$ColorViewState;IIIIZZIZZLandroid/view/InsetsState;)V
+HSPLcom/android/internal/policy/DecorView;->updateColorViewInt(Lcom/android/internal/policy/DecorView$ColorViewState;IIIIZZIZZLandroid/view/WindowInsetsController;)V
 HSPLcom/android/internal/policy/DecorView;->updateColorViewTranslations()V
 HSPLcom/android/internal/policy/DecorView;->updateColorViews(Landroid/view/WindowInsets;Z)Landroid/view/WindowInsets;
 HSPLcom/android/internal/policy/DecorView;->updateDecorCaptionStatus(Landroid/content/res/Configuration;)V
@@ -32954,7 +29677,6 @@
 HSPLcom/android/internal/policy/IKeyguardService$Stub;-><init>()V
 PLcom/android/internal/policy/IKeyguardService$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/policy/IKeyguardService;
 HSPLcom/android/internal/policy/IKeyguardService$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLcom/android/internal/policy/IKeyguardStateCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HSPLcom/android/internal/policy/IKeyguardStateCallback$Stub$Proxy;->onHasLockscreenWallpaperChanged(Z)V
 HSPLcom/android/internal/policy/IKeyguardStateCallback$Stub$Proxy;->onInputRestrictedStateChanged(Z)V
 HSPLcom/android/internal/policy/IKeyguardStateCallback$Stub$Proxy;->onShowingStateChanged(Z)V
@@ -32962,7 +29684,6 @@
 HSPLcom/android/internal/policy/IKeyguardStateCallback$Stub$Proxy;->onTrustedChanged(Z)V
 PLcom/android/internal/policy/IKeyguardStateCallback$Stub;-><init>()V
 PLcom/android/internal/policy/IKeyguardStateCallback$Stub;->asBinder()Landroid/os/IBinder;
-HSPLcom/android/internal/policy/IKeyguardStateCallback$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/policy/IKeyguardStateCallback;
 HPLcom/android/internal/policy/IKeyguardStateCallback$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 PLcom/android/internal/policy/IShortcutService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HSPLcom/android/internal/policy/IShortcutService$Stub;-><init>()V
@@ -33002,7 +29723,6 @@
 HSPLcom/android/internal/policy/PhoneWindow;->closeContextMenu()V
 HSPLcom/android/internal/policy/PhoneWindow;->closePanel(Lcom/android/internal/policy/PhoneWindow$PanelFeatureState;Z)V
 HSPLcom/android/internal/policy/PhoneWindow;->createDefaultContentWindowInsetsListener()Landroid/view/Window$OnContentApplyWindowInsetsListener;
-HSPLcom/android/internal/policy/PhoneWindow;->dismissContextMenu()V
 HSPLcom/android/internal/policy/PhoneWindow;->dispatchWindowAttributesChanged(Landroid/view/WindowManager$LayoutParams;)V
 HSPLcom/android/internal/policy/PhoneWindow;->doInvalidatePanelMenu(I)V
 HSPLcom/android/internal/policy/PhoneWindow;->generateDecor(I)Lcom/android/internal/policy/DecorView;
@@ -33014,17 +29734,15 @@
 HSPLcom/android/internal/policy/PhoneWindow;->getNavigationBarColor()I
 HSPLcom/android/internal/policy/PhoneWindow;->getPanelState(IZ)Lcom/android/internal/policy/PhoneWindow$PanelFeatureState;
 HSPLcom/android/internal/policy/PhoneWindow;->getPanelState(IZLcom/android/internal/policy/PhoneWindow$PanelFeatureState;)Lcom/android/internal/policy/PhoneWindow$PanelFeatureState;
-HSPLcom/android/internal/policy/PhoneWindow;->getStatusBarColor()I
 HSPLcom/android/internal/policy/PhoneWindow;->getTransition(Landroid/transition/Transition;Landroid/transition/Transition;I)Landroid/transition/Transition;
-HSPLcom/android/internal/policy/PhoneWindow;->getTransitionBackgroundFadeDuration()J
 HSPLcom/android/internal/policy/PhoneWindow;->getViewRootImpl()Landroid/view/ViewRootImpl;
-HSPLcom/android/internal/policy/PhoneWindow;->getVolumeControlStream()I
 HSPLcom/android/internal/policy/PhoneWindow;->installDecor()V
 HSPLcom/android/internal/policy/PhoneWindow;->invalidatePanelMenu(I)V
 HSPLcom/android/internal/policy/PhoneWindow;->isFloating()Z
 HSPLcom/android/internal/policy/PhoneWindow;->isShowingWallpaper()Z
 HSPLcom/android/internal/policy/PhoneWindow;->isTranslucent()Z
 HSPLcom/android/internal/policy/PhoneWindow;->lambda$createDefaultContentWindowInsetsListener$0$PhoneWindow(Landroid/view/WindowInsets;)Landroid/util/Pair;
+HSPLcom/android/internal/policy/PhoneWindow;->lambda$static$0(Landroid/view/View;Landroid/view/WindowInsets;)Landroid/util/Pair;
 HSPLcom/android/internal/policy/PhoneWindow;->onActive()V
 HSPLcom/android/internal/policy/PhoneWindow;->onConfigurationChanged(Landroid/content/res/Configuration;)V
 HSPLcom/android/internal/policy/PhoneWindow;->onKeyDown(IILandroid/view/KeyEvent;)Z
@@ -33047,7 +29765,6 @@
 HSPLcom/android/internal/policy/PhoneWindow;->setDefaultWindowFormat(I)V
 HSPLcom/android/internal/policy/PhoneWindow;->setNavigationBarColor(I)V
 HSPLcom/android/internal/policy/PhoneWindow;->setNavigationBarContrastEnforced(Z)V
-HSPLcom/android/internal/policy/PhoneWindow;->setNavigationBarDividerColor(I)V
 HSPLcom/android/internal/policy/PhoneWindow;->setStatusBarColor(I)V
 HSPLcom/android/internal/policy/PhoneWindow;->setTheme(I)V
 HSPLcom/android/internal/policy/PhoneWindow;->setTitle(Ljava/lang/CharSequence;)V
@@ -33056,7 +29773,6 @@
 HSPLcom/android/internal/policy/PhoneWindow;->setVolumeControlStream(I)V
 HSPLcom/android/internal/policy/PhoneWindow;->superDispatchKeyEvent(Landroid/view/KeyEvent;)Z
 HSPLcom/android/internal/policy/PhoneWindow;->superDispatchTouchEvent(Landroid/view/MotionEvent;)Z
-HSPLcom/android/internal/policy/PhoneWindow;->transitionTo(Landroid/transition/Scene;)V
 HSPLcom/android/internal/policy/ScreenDecorationsUtils;->getWindowCornerRadius(Landroid/content/res/Resources;)F
 HSPLcom/android/internal/policy/ScreenDecorationsUtils;->supportsRoundedCornersOnWindows(Landroid/content/res/Resources;)Z
 HSPLcom/android/internal/statusbar/IStatusBar$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
@@ -33069,6 +29785,7 @@
 HPLcom/android/internal/statusbar/IStatusBar$Stub$Proxy;->onSystemBarAppearanceChanged(II[Lcom/android/internal/view/AppearanceRegion;Z)V
 HPLcom/android/internal/statusbar/IStatusBar$Stub$Proxy;->setImeWindowStatus(ILandroid/os/IBinder;IIZZ)V
 HPLcom/android/internal/statusbar/IStatusBar$Stub$Proxy;->setTopAppHidesStatusBar(Z)V
+HPLcom/android/internal/statusbar/IStatusBar$Stub$Proxy;->setWindowState(III)V
 HPLcom/android/internal/statusbar/IStatusBar$Stub$Proxy;->topAppWindowChanged(IZZ)V
 HSPLcom/android/internal/statusbar/IStatusBar$Stub;-><init>()V
 HSPLcom/android/internal/statusbar/IStatusBar$Stub;->asBinder()Landroid/os/IBinder;
@@ -33076,7 +29793,7 @@
 HSPLcom/android/internal/statusbar/IStatusBar$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLcom/android/internal/statusbar/IStatusBarService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HSPLcom/android/internal/statusbar/IStatusBarService$Stub$Proxy;->clearInlineReplyUriPermissions(Ljava/lang/String;)V
-HPLcom/android/internal/statusbar/IStatusBarService$Stub$Proxy;->clearNotificationEffects()V
+HSPLcom/android/internal/statusbar/IStatusBarService$Stub$Proxy;->clearNotificationEffects()V
 HSPLcom/android/internal/statusbar/IStatusBarService$Stub$Proxy;->disableForUser(ILandroid/os/IBinder;Ljava/lang/String;I)V
 HSPLcom/android/internal/statusbar/IStatusBarService$Stub$Proxy;->onNotificationExpansionChanged(Ljava/lang/String;ZZI)V
 HSPLcom/android/internal/statusbar/IStatusBarService$Stub$Proxy;->onNotificationVisibilityChanged([Lcom/android/internal/statusbar/NotificationVisibility;[Lcom/android/internal/statusbar/NotificationVisibility;)V
@@ -33112,24 +29829,20 @@
 HSPLcom/android/internal/statusbar/StatusBarIcon;-><init>(Landroid/os/UserHandle;Ljava/lang/String;Landroid/graphics/drawable/Icon;IILjava/lang/CharSequence;)V
 HSPLcom/android/internal/statusbar/StatusBarIcon;->clone()Lcom/android/internal/statusbar/StatusBarIcon;
 HSPLcom/android/internal/telecom/ITelecomService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLcom/android/internal/telecom/ITelecomService$Stub$Proxy;->getCallCapablePhoneAccounts(ZLjava/lang/String;Ljava/lang/String;)Ljava/util/List;
 HSPLcom/android/internal/telecom/ITelecomService$Stub$Proxy;->getCallState()I
 HSPLcom/android/internal/telecom/ITelecomService$Stub$Proxy;->getCurrentTtyMode(Ljava/lang/String;Ljava/lang/String;)I
 HSPLcom/android/internal/telecom/ITelecomService$Stub$Proxy;->getDefaultDialerPackage()Ljava/lang/String;
-HSPLcom/android/internal/telecom/ITelecomService$Stub$Proxy;->getDefaultOutgoingPhoneAccount(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Landroid/telecom/PhoneAccountHandle;
-HSPLcom/android/internal/telecom/ITelecomService$Stub$Proxy;->getPhoneAccount(Landroid/telecom/PhoneAccountHandle;)Landroid/telecom/PhoneAccount;
 HSPLcom/android/internal/telecom/ITelecomService$Stub$Proxy;->isInCall(Ljava/lang/String;Ljava/lang/String;)Z
 HSPLcom/android/internal/telecom/ITelecomService$Stub;-><init>()V
 HSPLcom/android/internal/telecom/ITelecomService$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/telecom/ITelecomService;
 HSPLcom/android/internal/telecom/ITelecomService$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLcom/android/internal/telecom/IVideoProvider$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/telecom/IVideoProvider;
+HSPLcom/android/internal/telephony/CarrierAppUtils;->disableCarrierAppsUntilPrivileged(Ljava/lang/String;ILandroid/content/Context;)V
 HSPLcom/android/internal/telephony/CarrierAppUtils;->disableCarrierAppsUntilPrivileged(Ljava/lang/String;Landroid/telephony/TelephonyManager;Landroid/content/ContentResolver;ILandroid/util/ArraySet;Landroid/util/ArrayMap;Landroid/content/Context;)V
+HSPLcom/android/internal/telephony/CarrierAppUtils;->getApplicationInfoIfSystemApp(ILjava/lang/String;Landroid/content/Context;)Landroid/content/pm/ApplicationInfo;
 HSPLcom/android/internal/telephony/CarrierAppUtils;->getContentResolverForUser(Landroid/content/Context;I)Landroid/content/ContentResolver;
 HSPLcom/android/internal/telephony/CarrierAppUtils;->getDefaultCarrierAssociatedAppsHelper(ILandroid/util/ArrayMap;Landroid/content/Context;)Ljava/util/Map;
-HSPLcom/android/internal/telephony/GsmAlphabet;->gsm7BitPackedToString([BIIIII)Ljava/lang/String;
-HSPLcom/android/internal/telephony/ICarrierConfigLoader$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLcom/android/internal/telephony/ICarrierConfigLoader$Stub$Proxy;->getConfigForSubIdWithFeature(ILjava/lang/String;Ljava/lang/String;)Landroid/os/PersistableBundle;
-HSPLcom/android/internal/telephony/ICarrierConfigLoader$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/telephony/ICarrierConfigLoader;
+HSPLcom/android/internal/telephony/CarrierAppUtils;->isUpdatedSystemApp(Landroid/content/pm/ApplicationInfo;)Z
 HSPLcom/android/internal/telephony/IMms$Stub;-><init>()V
 HPLcom/android/internal/telephony/IMms$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLcom/android/internal/telephony/IOnSubscriptionsChangedListener$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
@@ -33154,74 +29867,24 @@
 HSPLcom/android/internal/telephony/IPhoneStateListener$Stub;->asBinder()Landroid/os/IBinder;
 HSPLcom/android/internal/telephony/IPhoneStateListener$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/telephony/IPhoneStateListener;
 HSPLcom/android/internal/telephony/IPhoneStateListener$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLcom/android/internal/telephony/IPhoneSubInfo$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HSPLcom/android/internal/telephony/IPhoneSubInfo$Stub$Proxy;->getGroupIdLevel1ForSubscriber(ILjava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLcom/android/internal/telephony/IPhoneSubInfo$Stub$Proxy;->getIccSerialNumberForSubscriber(ILjava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLcom/android/internal/telephony/IPhoneSubInfo$Stub$Proxy;->getLine1NumberForSubscriber(ILjava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLcom/android/internal/telephony/IPhoneSubInfo$Stub$Proxy;->getSubscriberIdForSubscriber(ILjava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLcom/android/internal/telephony/IPhoneSubInfo$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/telephony/IPhoneSubInfo;
-HSPLcom/android/internal/telephony/ISms$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLcom/android/internal/telephony/ISms$Stub$Proxy;->getPreferredSmsSubscription()I
-HSPLcom/android/internal/telephony/ISms$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/telephony/ISms;
-HSPLcom/android/internal/telephony/ISub$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLcom/android/internal/telephony/ISub$Stub$Proxy;->getActiveDataSubscriptionId()I
-HSPLcom/android/internal/telephony/ISub$Stub$Proxy;->getActiveSubIdList(Z)[I
-HSPLcom/android/internal/telephony/ISub$Stub$Proxy;->getActiveSubInfoCount(Ljava/lang/String;Ljava/lang/String;)I
-HSPLcom/android/internal/telephony/ISub$Stub$Proxy;->getActiveSubInfoCountMax()I
+HSPLcom/android/internal/telephony/IPhoneSubInfo$Stub$Proxy;->getVoiceMailNumberForSubscriber(ILjava/lang/String;Ljava/lang/String;)Ljava/lang/String;
 HSPLcom/android/internal/telephony/ISub$Stub$Proxy;->getActiveSubscriptionInfo(ILjava/lang/String;Ljava/lang/String;)Landroid/telephony/SubscriptionInfo;
-HSPLcom/android/internal/telephony/ISub$Stub$Proxy;->getActiveSubscriptionInfoList(Ljava/lang/String;Ljava/lang/String;)Ljava/util/List;
-HSPLcom/android/internal/telephony/ISub$Stub$Proxy;->getAvailableSubscriptionInfoList(Ljava/lang/String;Ljava/lang/String;)Ljava/util/List;
-HSPLcom/android/internal/telephony/ISub$Stub$Proxy;->getDefaultDataSubId()I
-HSPLcom/android/internal/telephony/ISub$Stub$Proxy;->getDefaultSmsSubId()I
-HSPLcom/android/internal/telephony/ISub$Stub$Proxy;->getDefaultSubId()I
-HSPLcom/android/internal/telephony/ISub$Stub$Proxy;->getDefaultVoiceSubId()I
 HSPLcom/android/internal/telephony/ISub$Stub$Proxy;->getPhoneId(I)I
-HSPLcom/android/internal/telephony/ISub$Stub$Proxy;->getSimStateForSlotIndex(I)I
-HSPLcom/android/internal/telephony/ISub$Stub$Proxy;->getSlotIndex(I)I
-HSPLcom/android/internal/telephony/ISub$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/telephony/ISub;
-HSPLcom/android/internal/telephony/ITelephony$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HSPLcom/android/internal/telephony/ITelephony$Stub$Proxy;->checkCarrierPrivilegesForPackage(ILjava/lang/String;)I
-HSPLcom/android/internal/telephony/ITelephony$Stub$Proxy;->checkCarrierPrivilegesForPackageAnyPhone(Ljava/lang/String;)I
-HSPLcom/android/internal/telephony/ITelephony$Stub$Proxy;->getActivePhoneTypeForSlot(I)I
-HSPLcom/android/internal/telephony/ITelephony$Stub$Proxy;->getAllCellInfo(Ljava/lang/String;Ljava/lang/String;)Ljava/util/List;
-HSPLcom/android/internal/telephony/ITelephony$Stub$Proxy;->getCarrierPrivilegeStatus(I)I
 HPLcom/android/internal/telephony/ITelephony$Stub$Proxy;->getCarrierPrivilegeStatusForUid(II)I
-HSPLcom/android/internal/telephony/ITelephony$Stub$Proxy;->getCellLocation(Ljava/lang/String;Ljava/lang/String;)Landroid/telephony/CellIdentity;
-HSPLcom/android/internal/telephony/ITelephony$Stub$Proxy;->getDataActivityForSubId(I)I
-HSPLcom/android/internal/telephony/ITelephony$Stub$Proxy;->getDataNetworkTypeForSubscriber(ILjava/lang/String;Ljava/lang/String;)I
-HSPLcom/android/internal/telephony/ITelephony$Stub$Proxy;->getDataStateForSubId(I)I
-HSPLcom/android/internal/telephony/ITelephony$Stub$Proxy;->getDeviceIdWithFeature(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLcom/android/internal/telephony/ITelephony$Stub$Proxy;->getEmergencyNumberList(Ljava/lang/String;Ljava/lang/String;)Ljava/util/Map;
-HSPLcom/android/internal/telephony/ITelephony$Stub$Proxy;->getImeiForSlot(ILjava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLcom/android/internal/telephony/ITelephony$Stub$Proxy;->getLine1NumberForDisplay(ILjava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLcom/android/internal/telephony/ITelephony$Stub$Proxy;->getMeidForSlot(ILjava/lang/String;Ljava/lang/String;)Ljava/lang/String;
 HSPLcom/android/internal/telephony/ITelephony$Stub$Proxy;->getMergedImsisFromGroup(ILjava/lang/String;)[Ljava/lang/String;
 HSPLcom/android/internal/telephony/ITelephony$Stub$Proxy;->getNetworkCountryIsoForPhone(ILjava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLcom/android/internal/telephony/ITelephony$Stub$Proxy;->getNetworkTypeForSubscriber(ILjava/lang/String;Ljava/lang/String;)I
-HPLcom/android/internal/telephony/ITelephony$Stub$Proxy;->getPackagesWithCarrierPrivilegesForAllPhones()Ljava/util/List;
-HSPLcom/android/internal/telephony/ITelephony$Stub$Proxy;->getServiceStateForSubscriber(ILjava/lang/String;Ljava/lang/String;)Landroid/telephony/ServiceState;
-HSPLcom/android/internal/telephony/ITelephony$Stub$Proxy;->getSubIdForPhoneAccountHandle(Landroid/telecom/PhoneAccountHandle;Ljava/lang/String;Ljava/lang/String;)I
-HSPLcom/android/internal/telephony/ITelephony$Stub$Proxy;->getSubscriptionCarrierId(I)I
-HSPLcom/android/internal/telephony/ITelephony$Stub$Proxy;->getVoiceNetworkTypeForSubscriber(ILjava/lang/String;Ljava/lang/String;)I
-HPLcom/android/internal/telephony/ITelephony$Stub$Proxy;->getVtDataUsage(IZ)Landroid/net/NetworkStats;
 HSPLcom/android/internal/telephony/ITelephony$Stub$Proxy;->isAvailable(III)Z
 HSPLcom/android/internal/telephony/ITelephony$Stub$Proxy;->isDataEnabled(I)Z
 HSPLcom/android/internal/telephony/ITelephony$Stub$Proxy;->isEmergencyNumber(Ljava/lang/String;Z)Z
-HSPLcom/android/internal/telephony/ITelephony$Stub$Proxy;->isTetheringApnRequiredForSubscriber(I)Z
-HSPLcom/android/internal/telephony/ITelephony$Stub$Proxy;->isUserDataEnabled(I)Z
-HSPLcom/android/internal/telephony/ITelephony$Stub$Proxy;->requestCellInfoUpdate(ILandroid/telephony/ICellInfoCallback;Ljava/lang/String;Ljava/lang/String;)V
-HSPLcom/android/internal/telephony/ITelephony$Stub$Proxy;->requestCellInfoUpdateWithWorkSource(ILandroid/telephony/ICellInfoCallback;Ljava/lang/String;Ljava/lang/String;Landroid/os/WorkSource;)V
-HSPLcom/android/internal/telephony/ITelephony$Stub$Proxy;->requestModemActivityInfo(Landroid/os/ResultReceiver;)V
 HPLcom/android/internal/telephony/ITelephony$Stub$Proxy;->setPolicyDataEnabled(ZI)V
-HSPLcom/android/internal/telephony/ITelephony$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/telephony/ITelephony;
 HSPLcom/android/internal/telephony/ITelephonyRegistry$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HSPLcom/android/internal/telephony/ITelephonyRegistry$Stub$Proxy;->addOnSubscriptionsChangedListener(Ljava/lang/String;Ljava/lang/String;Lcom/android/internal/telephony/IOnSubscriptionsChangedListener;)V
 HSPLcom/android/internal/telephony/ITelephonyRegistry$Stub$Proxy;->listenForSubscriber(ILjava/lang/String;Ljava/lang/String;Lcom/android/internal/telephony/IPhoneStateListener;IZ)V
 HSPLcom/android/internal/telephony/ITelephonyRegistry$Stub;-><init>()V
 HSPLcom/android/internal/telephony/ITelephonyRegistry$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/telephony/ITelephonyRegistry;
 HSPLcom/android/internal/telephony/ITelephonyRegistry$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLcom/android/internal/telephony/SmsAddress;-><init>()V
-HSPLcom/android/internal/telephony/SmsAddress;->couldBeEmailGateway()Z
 HSPLcom/android/internal/telephony/SmsApplication$SmsApplicationData;-><init>(Ljava/lang/String;I)V
 HSPLcom/android/internal/telephony/SmsApplication$SmsApplicationData;->access$000(Lcom/android/internal/telephony/SmsApplication$SmsApplicationData;)Ljava/lang/String;
 HSPLcom/android/internal/telephony/SmsApplication$SmsApplicationData;->access$002(Lcom/android/internal/telephony/SmsApplication$SmsApplicationData;Ljava/lang/String;)Ljava/lang/String;
@@ -33245,13 +29908,6 @@
 HSPLcom/android/internal/telephony/SmsApplication;->getDefaultSmsPackage(Landroid/content/Context;I)Ljava/lang/String;
 HSPLcom/android/internal/telephony/SmsApplication;->getIncomingUserId(Landroid/content/Context;)I
 HSPLcom/android/internal/telephony/SmsApplication;->tryFixExclusiveSmsAppops(Landroid/content/Context;Lcom/android/internal/telephony/SmsApplication$SmsApplicationData;Z)Z
-HSPLcom/android/internal/telephony/SmsHeader$ConcatRef;-><init>()V
-HSPLcom/android/internal/telephony/SmsHeader;-><init>()V
-HSPLcom/android/internal/telephony/SmsHeader;->fromByteArray([B)Lcom/android/internal/telephony/SmsHeader;
-HSPLcom/android/internal/telephony/SmsMessageBase;-><init>()V
-HSPLcom/android/internal/telephony/SmsMessageBase;->getMessageBody()Ljava/lang/String;
-HSPLcom/android/internal/telephony/SmsMessageBase;->getOriginatingAddress()Ljava/lang/String;
-HSPLcom/android/internal/telephony/SmsMessageBase;->parseMessageBody()V
 HSPLcom/android/internal/telephony/TelephonyCommonStatsLog;->write(ILjava/lang/String;Ljava/lang/String;ZZ)V
 HSPLcom/android/internal/telephony/TelephonyPermissions;->checkCallingOrSelfReadDeviceIdentifiers(Landroid/content/Context;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z
 HSPLcom/android/internal/telephony/TelephonyPermissions;->checkCallingOrSelfReadDeviceIdentifiers(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z
@@ -33264,27 +29920,7 @@
 HSPLcom/android/internal/telephony/TelephonyPermissions;->enforceCarrierPrivilege(Landroid/content/Context;IILjava/lang/String;)V
 HSPLcom/android/internal/telephony/TelephonyPermissions;->getCarrierPrivilegeStatus(Landroid/content/Context;II)I
 HSPLcom/android/internal/telephony/TelephonyPermissions;->reportAccessDeniedToReadIdentifiers(Landroid/content/Context;IIILjava/lang/String;Ljava/lang/String;)Z
-HSPLcom/android/internal/telephony/euicc/IEuiccController$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/telephony/euicc/IEuiccController;
-HSPLcom/android/internal/telephony/gsm/GsmSmsAddress;-><init>([BII)V
-HSPLcom/android/internal/telephony/gsm/GsmSmsAddress;->isAlphanumeric()Z
-HSPLcom/android/internal/telephony/gsm/SmsMessage$PduParser;-><init>([B)V
-HSPLcom/android/internal/telephony/gsm/SmsMessage$PduParser;->constructUserData(ZZ)I
-HSPLcom/android/internal/telephony/gsm/SmsMessage$PduParser;->getAddress()Lcom/android/internal/telephony/gsm/GsmSmsAddress;
-HSPLcom/android/internal/telephony/gsm/SmsMessage$PduParser;->getByte()I
-HSPLcom/android/internal/telephony/gsm/SmsMessage$PduParser;->getSCAddress()Ljava/lang/String;
-HSPLcom/android/internal/telephony/gsm/SmsMessage$PduParser;->getSCTimestampMillis()J
-HSPLcom/android/internal/telephony/gsm/SmsMessage$PduParser;->getUserData()[B
-HSPLcom/android/internal/telephony/gsm/SmsMessage$PduParser;->getUserDataGSM7Bit(III)Ljava/lang/String;
-HSPLcom/android/internal/telephony/gsm/SmsMessage$PduParser;->getUserDataHeader()Lcom/android/internal/telephony/SmsHeader;
-HSPLcom/android/internal/telephony/gsm/SmsMessage;-><init>()V
-HSPLcom/android/internal/telephony/gsm/SmsMessage;->createFromPdu([B)Lcom/android/internal/telephony/gsm/SmsMessage;
-HSPLcom/android/internal/telephony/gsm/SmsMessage;->parsePdu([B)V
-HSPLcom/android/internal/telephony/gsm/SmsMessage;->parseSmsDeliver(Lcom/android/internal/telephony/gsm/SmsMessage$PduParser;I)V
-HSPLcom/android/internal/telephony/gsm/SmsMessage;->parseUserData(Lcom/android/internal/telephony/gsm/SmsMessage$PduParser;Z)V
 HSPLcom/android/internal/telephony/uicc/IccUtils;->bytesToHexString([B)Ljava/lang/String;
-HSPLcom/android/internal/telephony/uicc/IccUtils;->gsmBcdByteToInt(B)I
-HSPLcom/android/internal/telephony/util/HandlerExecutor;-><init>(Landroid/os/Handler;)V
-HSPLcom/android/internal/telephony/util/HandlerExecutor;->execute(Ljava/lang/Runnable;)V
 HSPLcom/android/internal/textservice/ISpellCheckerSession$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HSPLcom/android/internal/textservice/ISpellCheckerSession$Stub$Proxy;->asBinder()Landroid/os/IBinder;
 HSPLcom/android/internal/textservice/ISpellCheckerSession$Stub$Proxy;->onClose()V
@@ -33323,19 +29959,15 @@
 HSPLcom/android/internal/transition/EpicenterTranslateClipReveal;->captureStartValues(Landroid/transition/TransitionValues;)V
 HSPLcom/android/internal/transition/EpicenterTranslateClipReveal;->captureValues(Landroid/transition/TransitionValues;)V
 HSPLcom/android/internal/transition/EpicenterTranslateClipReveal;->createRectAnimator(Landroid/view/View;Lcom/android/internal/transition/EpicenterTranslateClipReveal$State;Lcom/android/internal/transition/EpicenterTranslateClipReveal$State;FLcom/android/internal/transition/EpicenterTranslateClipReveal$State;Lcom/android/internal/transition/EpicenterTranslateClipReveal$State;FLandroid/transition/TransitionValues;Landroid/animation/TimeInterpolator;Landroid/animation/TimeInterpolator;Landroid/animation/TimeInterpolator;)Landroid/animation/Animator;
-HSPLcom/android/internal/transition/EpicenterTranslateClipReveal;->getBestRect(Landroid/transition/TransitionValues;)Landroid/graphics/Rect;
-HSPLcom/android/internal/transition/EpicenterTranslateClipReveal;->getEpicenterOrCenter(Landroid/graphics/Rect;)Landroid/graphics/Rect;
 HSPLcom/android/internal/transition/EpicenterTranslateClipReveal;->onAppear(Landroid/view/ViewGroup;Landroid/view/View;Landroid/transition/TransitionValues;Landroid/transition/TransitionValues;)Landroid/animation/Animator;
 HSPLcom/android/internal/transition/TransitionConstants;-><clinit>()V
-HPLcom/android/internal/util/-$$Lambda$FunctionalUtils$koCSI8D7Nu5vOJTVTEj0m3leo_U;-><init>(Lcom/android/internal/util/FunctionalUtils$ThrowingRunnable;Ljava/util/function/Consumer;)V
+HPLcom/android/internal/util/-$$Lambda$DumpUtils$vCLO_0ezRxkpSERUWCFrJ0ph5jg;->test(Ljava/lang/Object;)Z
 HPLcom/android/internal/util/-$$Lambda$FunctionalUtils$koCSI8D7Nu5vOJTVTEj0m3leo_U;->run()V
 HSPLcom/android/internal/util/AnnotationValidations;->validate(Ljava/lang/Class;Landroid/annotation/IntRange;ILjava/lang/String;J)V
 HSPLcom/android/internal/util/AnnotationValidations;->validate(Ljava/lang/Class;Landroid/annotation/IntRange;ILjava/lang/String;JLjava/lang/String;J)V
 HSPLcom/android/internal/util/AnnotationValidations;->validate(Ljava/lang/Class;Landroid/annotation/IntRange;JLjava/lang/String;J)V
 HSPLcom/android/internal/util/AnnotationValidations;->validate(Ljava/lang/Class;Landroid/annotation/NonNull;Ljava/lang/Object;)V
 HSPLcom/android/internal/util/AnnotationValidations;->validate(Ljava/lang/Class;Ljava/lang/annotation/Annotation;I)V
-HSPLcom/android/internal/util/ArrayUtils;->add(Ljava/util/ArrayList;ILjava/lang/Object;)Ljava/util/ArrayList;
-HSPLcom/android/internal/util/ArrayUtils;->add(Ljava/util/ArrayList;Ljava/lang/Object;)Ljava/util/ArrayList;
 HSPLcom/android/internal/util/ArrayUtils;->appendElement(Ljava/lang/Class;[Ljava/lang/Object;Ljava/lang/Object;)[Ljava/lang/Object;
 HSPLcom/android/internal/util/ArrayUtils;->appendElement(Ljava/lang/Class;[Ljava/lang/Object;Ljava/lang/Object;Z)[Ljava/lang/Object;
 HSPLcom/android/internal/util/ArrayUtils;->appendInt([II)[I
@@ -33373,7 +30005,6 @@
 HSPLcom/android/internal/util/ArrayUtils;->newUnpaddedLongArray(I)[J
 HSPLcom/android/internal/util/ArrayUtils;->newUnpaddedObjectArray(I)[Ljava/lang/Object;
 HSPLcom/android/internal/util/ArrayUtils;->referenceEquals(Ljava/util/ArrayList;Ljava/util/ArrayList;)Z
-HSPLcom/android/internal/util/ArrayUtils;->remove(Ljava/util/ArrayList;Ljava/lang/Object;)Ljava/util/ArrayList;
 HSPLcom/android/internal/util/ArrayUtils;->removeElement(Ljava/lang/Class;[Ljava/lang/Object;Ljava/lang/Object;)[Ljava/lang/Object;
 HSPLcom/android/internal/util/ArrayUtils;->removeInt([II)[I
 HSPLcom/android/internal/util/ArrayUtils;->size(Ljava/util/Collection;)I
@@ -33395,7 +30026,6 @@
 HSPLcom/android/internal/util/AsyncChannel;->sendMessage(IIILjava/lang/Object;)V
 HSPLcom/android/internal/util/AsyncChannel;->sendMessage(Landroid/os/Message;)V
 HSPLcom/android/internal/util/BitUtils;->bitAt(I)J
-HSPLcom/android/internal/util/BitUtils;->isBitSet(JI)Z
 HSPLcom/android/internal/util/BitUtils;->packBits([I)J
 HSPLcom/android/internal/util/BitUtils;->toBytes(J)[B
 HSPLcom/android/internal/util/BitUtils;->uint8(B)I
@@ -33406,7 +30036,7 @@
 HSPLcom/android/internal/util/CollectionUtils;->isEmpty(Ljava/util/Collection;)Z
 HPLcom/android/internal/util/CollectionUtils;->map(Ljava/util/Set;Ljava/util/function/Function;)Ljava/util/Set;
 HSPLcom/android/internal/util/CollectionUtils;->size(Ljava/util/Collection;)I
-PLcom/android/internal/util/CollectionUtils;->size(Ljava/util/Map;)I
+HSPLcom/android/internal/util/CollectionUtils;->size(Ljava/util/Map;)I
 HSPLcom/android/internal/util/ConcurrentUtils$1$1;-><init>(Lcom/android/internal/util/ConcurrentUtils$1;Ljava/lang/String;Ljava/lang/Runnable;)V
 HSPLcom/android/internal/util/ConcurrentUtils$1$1;->run()V
 HSPLcom/android/internal/util/ConcurrentUtils$1;-><init>(Ljava/lang/String;I)V
@@ -33416,19 +30046,21 @@
 HSPLcom/android/internal/util/ConcurrentUtils;->waitForCountDownNoInterrupt(Ljava/util/concurrent/CountDownLatch;JLjava/lang/String;)V
 HSPLcom/android/internal/util/ConcurrentUtils;->waitForFutureNoInterrupt(Ljava/util/concurrent/Future;Ljava/lang/String;)Ljava/lang/Object;
 HSPLcom/android/internal/util/ConcurrentUtils;->wtfIfLockHeld(Ljava/lang/String;Ljava/lang/Object;)V
+HSPLcom/android/internal/util/ContrastColorUtil$ColorUtilsFromCompat;->LABToColor(DDD)I
 HSPLcom/android/internal/util/ContrastColorUtil$ColorUtilsFromCompat;->LABToXYZ(DDD[D)V
+HSPLcom/android/internal/util/ContrastColorUtil$ColorUtilsFromCompat;->RGBToLAB(III[D)V
 HSPLcom/android/internal/util/ContrastColorUtil$ColorUtilsFromCompat;->RGBToXYZ(III[D)V
 HSPLcom/android/internal/util/ContrastColorUtil$ColorUtilsFromCompat;->XYZToColor(DDD)I
 HSPLcom/android/internal/util/ContrastColorUtil$ColorUtilsFromCompat;->XYZToLAB(DDD[D)V
 HSPLcom/android/internal/util/ContrastColorUtil$ColorUtilsFromCompat;->calculateContrast(II)D
 HSPLcom/android/internal/util/ContrastColorUtil$ColorUtilsFromCompat;->calculateLuminance(I)D
+HSPLcom/android/internal/util/ContrastColorUtil$ColorUtilsFromCompat;->colorToLAB(I[D)V
 HSPLcom/android/internal/util/ContrastColorUtil$ColorUtilsFromCompat;->colorToXYZ(I[D)V
 HSPLcom/android/internal/util/ContrastColorUtil$ColorUtilsFromCompat;->compositeAlpha(II)I
 HSPLcom/android/internal/util/ContrastColorUtil$ColorUtilsFromCompat;->compositeColors(II)I
 HSPLcom/android/internal/util/ContrastColorUtil$ColorUtilsFromCompat;->compositeComponent(IIIII)I
 HSPLcom/android/internal/util/ContrastColorUtil$ColorUtilsFromCompat;->constrain(III)I
 HSPLcom/android/internal/util/ContrastColorUtil$ColorUtilsFromCompat;->getTempDouble3Array()[D
-HSPLcom/android/internal/util/ContrastColorUtil;-><init>(Landroid/content/Context;)V
 HSPLcom/android/internal/util/ContrastColorUtil;->calculateContrast(II)D
 HSPLcom/android/internal/util/ContrastColorUtil;->clearColorSpans(Ljava/lang/CharSequence;)Ljava/lang/CharSequence;
 HSPLcom/android/internal/util/ContrastColorUtil;->compositeColors(II)I
@@ -33437,6 +30069,7 @@
 HSPLcom/android/internal/util/ContrastColorUtil;->findContrastColor(IIZD)I
 HSPLcom/android/internal/util/ContrastColorUtil;->getInstance(Landroid/content/Context;)Lcom/android/internal/util/ContrastColorUtil;
 HSPLcom/android/internal/util/ContrastColorUtil;->resolveColor(Landroid/content/Context;IZ)I
+HSPLcom/android/internal/util/ContrastColorUtil;->resolveContrastColor(Landroid/content/Context;II)I
 HSPLcom/android/internal/util/ContrastColorUtil;->resolveContrastColor(Landroid/content/Context;IIZ)I
 HSPLcom/android/internal/util/ContrastColorUtil;->resolveDefaultColor(Landroid/content/Context;IZ)I
 HSPLcom/android/internal/util/ContrastColorUtil;->resolvePrimaryColor(Landroid/content/Context;IZ)I
@@ -33447,6 +30080,7 @@
 HPLcom/android/internal/util/DumpUtils;->checkDumpPermission(Landroid/content/Context;Ljava/lang/String;Ljava/io/PrintWriter;)Z
 HPLcom/android/internal/util/DumpUtils;->checkUsageStatsPermission(Landroid/content/Context;Ljava/lang/String;Ljava/io/PrintWriter;)Z
 HPLcom/android/internal/util/DumpUtils;->filterRecord(Ljava/lang/String;)Ljava/util/function/Predicate;
+HPLcom/android/internal/util/DumpUtils;->lambda$filterRecord$2(ILjava/lang/String;Landroid/content/ComponentName$WithComponentName;)Z
 HSPLcom/android/internal/util/EmergencyAffordanceManager;-><init>(Landroid/content/Context;)V
 HSPLcom/android/internal/util/ExponentiallyBucketedHistogram;-><init>(I)V
 HSPLcom/android/internal/util/ExponentiallyBucketedHistogram;->add(I)V
@@ -33507,13 +30141,13 @@
 HPLcom/android/internal/util/FileRotator;->writeFile(Ljava/io/File;Lcom/android/internal/util/FileRotator$Writer;)V
 HSPLcom/android/internal/util/FrameworkStatsLog;->write(IIJII)V
 HSPLcom/android/internal/util/FrameworkStatsLog;->write(IILandroid/util/SparseArray;)V
+HSPLcom/android/internal/util/FrameworkStatsLog;->write(IILjava/lang/String;I)V
 HSPLcom/android/internal/util/FrameworkStatsLog;->write(IILjava/lang/String;IZ)V
 HSPLcom/android/internal/util/FrameworkStatsLog;->write(ILjava/lang/String;I)V
 HSPLcom/android/internal/util/FrameworkStatsLog;->write(ILjava/lang/String;IIF)V
 HSPLcom/android/internal/util/FunctionalUtils$RemoteExceptionIgnoringConsumer;->accept(Ljava/lang/Object;)V
 HSPLcom/android/internal/util/FunctionalUtils$ThrowingConsumer;->accept(Ljava/lang/Object;)V
 HPLcom/android/internal/util/FunctionalUtils$ThrowingRunnable;->run()V
-HPLcom/android/internal/util/FunctionalUtils;->handleExceptions(Lcom/android/internal/util/FunctionalUtils$ThrowingRunnable;Ljava/util/function/Consumer;)Ljava/lang/Runnable;
 HSPLcom/android/internal/util/FunctionalUtils;->ignoreRemoteException(Lcom/android/internal/util/FunctionalUtils$RemoteExceptionIgnoringConsumer;)Ljava/util/function/Consumer;
 HPLcom/android/internal/util/FunctionalUtils;->lambda$handleExceptions$0(Lcom/android/internal/util/FunctionalUtils$ThrowingRunnable;Ljava/util/function/Consumer;)V
 HSPLcom/android/internal/util/FunctionalUtils;->uncheckExceptions(Lcom/android/internal/util/FunctionalUtils$ThrowingConsumer;)Ljava/util/function/Consumer;
@@ -33583,6 +30217,8 @@
 HSPLcom/android/internal/util/NotificationMessagingUtil;->isDefaultMessagingApp(Landroid/service/notification/StatusBarNotification;)Z
 HSPLcom/android/internal/util/NotificationMessagingUtil;->isImportantMessaging(Landroid/service/notification/StatusBarNotification;I)Z
 HSPLcom/android/internal/util/ObjectUtils;->compare(Ljava/lang/Comparable;Ljava/lang/Comparable;)I
+HSPLcom/android/internal/util/Parcelling$BuiltIn$ForBoolean;->parcel(Ljava/lang/Boolean;Landroid/os/Parcel;I)V
+HSPLcom/android/internal/util/Parcelling$BuiltIn$ForBoolean;->unparcel(Landroid/os/Parcel;)Ljava/lang/Boolean;
 HSPLcom/android/internal/util/Parcelling$Cache;-><clinit>()V
 HSPLcom/android/internal/util/Parcelling$Cache;->get(Ljava/lang/Class;)Lcom/android/internal/util/Parcelling;
 HSPLcom/android/internal/util/Parcelling$Cache;->put(Lcom/android/internal/util/Parcelling;)Lcom/android/internal/util/Parcelling;
@@ -33627,6 +30263,7 @@
 HSPLcom/android/internal/util/RingBuffer;->getNextSlot()Ljava/lang/Object;
 HSPLcom/android/internal/util/RingBuffer;->indexOf(J)I
 HSPLcom/android/internal/util/RingBuffer;->size()I
+HPLcom/android/internal/util/RingBuffer;->toArray()[Ljava/lang/Object;
 HSPLcom/android/internal/util/RingBufferIndices;-><init>(I)V
 HPLcom/android/internal/util/RingBufferIndices;->add()I
 HSPLcom/android/internal/util/ScreenshotHelper;-><init>(Landroid/content/Context;)V
@@ -33660,12 +30297,16 @@
 HSPLcom/android/internal/util/StateMachine$SmHandler;->getCurrentState()Lcom/android/internal/util/IState;
 HSPLcom/android/internal/util/StateMachine$SmHandler;->handleMessage(Landroid/os/Message;)V
 HSPLcom/android/internal/util/StateMachine$SmHandler;->invokeEnterMethods(I)V
+HSPLcom/android/internal/util/StateMachine$SmHandler;->invokeExitMethods(Lcom/android/internal/util/StateMachine$SmHandler$StateInfo;)V
 HSPLcom/android/internal/util/StateMachine$SmHandler;->isQuit(Landroid/os/Message;)Z
+HSPLcom/android/internal/util/StateMachine$SmHandler;->moveDeferredMessageAtFrontOfQueue()V
 HSPLcom/android/internal/util/StateMachine$SmHandler;->moveTempStateStackToStateStack()I
 HSPLcom/android/internal/util/StateMachine$SmHandler;->performTransitions(Lcom/android/internal/util/State;Landroid/os/Message;)V
 HSPLcom/android/internal/util/StateMachine$SmHandler;->processMsg(Landroid/os/Message;)Lcom/android/internal/util/State;
 HSPLcom/android/internal/util/StateMachine$SmHandler;->setInitialState(Lcom/android/internal/util/State;)V
 HSPLcom/android/internal/util/StateMachine$SmHandler;->setupInitialStateStack()V
+HSPLcom/android/internal/util/StateMachine$SmHandler;->setupTempStateStackWithStatesToEnter(Lcom/android/internal/util/State;)Lcom/android/internal/util/StateMachine$SmHandler$StateInfo;
+HSPLcom/android/internal/util/StateMachine$SmHandler;->transitionTo(Lcom/android/internal/util/IState;)V
 HSPLcom/android/internal/util/StateMachine;-><init>(Ljava/lang/String;)V
 HSPLcom/android/internal/util/StateMachine;-><init>(Ljava/lang/String;Landroid/os/Handler;)V
 HSPLcom/android/internal/util/StateMachine;-><init>(Ljava/lang/String;Landroid/os/Looper;)V
@@ -33685,10 +30326,9 @@
 HSPLcom/android/internal/util/StateMachine;->setInitialState(Lcom/android/internal/util/State;)V
 HSPLcom/android/internal/util/StateMachine;->setLogRecSize(I)V
 HSPLcom/android/internal/util/StateMachine;->start()V
+HSPLcom/android/internal/util/StateMachine;->transitionTo(Lcom/android/internal/util/IState;)V
 HSPLcom/android/internal/util/SyncResultReceiver;-><init>(I)V
 HSPLcom/android/internal/util/SyncResultReceiver;->getIntResult()I
-HSPLcom/android/internal/util/SyncResultReceiver;->getOptionalExtraIntResult(I)I
-HSPLcom/android/internal/util/SyncResultReceiver;->getParcelableResult()Landroid/os/Parcelable;
 HSPLcom/android/internal/util/SyncResultReceiver;->send(ILandroid/os/Bundle;)V
 HSPLcom/android/internal/util/SyncResultReceiver;->waitResult()V
 HSPLcom/android/internal/util/TokenBucket;-><init>(II)V
@@ -33705,7 +30345,6 @@
 HSPLcom/android/internal/util/VirtualRefBasePtr;->release()V
 HSPLcom/android/internal/util/XmlUtils;->beginDocument(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;)V
 HSPLcom/android/internal/util/XmlUtils;->convertValueToBoolean(Ljava/lang/CharSequence;Z)Z
-HSPLcom/android/internal/util/XmlUtils;->convertValueToInt(Ljava/lang/CharSequence;I)I
 HSPLcom/android/internal/util/XmlUtils;->nextElement(Lorg/xmlpull/v1/XmlPullParser;)V
 HSPLcom/android/internal/util/XmlUtils;->nextElementWithin(Lorg/xmlpull/v1/XmlPullParser;I)Z
 HSPLcom/android/internal/util/XmlUtils;->readBooleanAttribute(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;)Z
@@ -33813,7 +30452,7 @@
 HSPLcom/android/internal/view/AppearanceRegion;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLcom/android/internal/view/BaseIWindow;-><init>()V
 HSPLcom/android/internal/view/BaseIWindow;->closeSystemDialogs(Ljava/lang/String;)V
-PLcom/android/internal/view/BaseIWindow;->dispatchAppVisibility(Z)V
+HPLcom/android/internal/view/BaseIWindow;->dispatchAppVisibility(Z)V
 HSPLcom/android/internal/view/BaseIWindow;->dispatchWindowShown()V
 HSPLcom/android/internal/view/BaseIWindow;->insetsChanged(Landroid/view/InsetsState;)V
 HSPLcom/android/internal/view/BaseIWindow;->setSession(Landroid/view/IWindowSession;)V
@@ -33878,7 +30517,6 @@
 HSPLcom/android/internal/view/IInputConnectionWrapper;->obtainMessageISC(IIILcom/android/internal/view/IInputContextCallback;)Landroid/os/Message;
 HSPLcom/android/internal/view/IInputConnectionWrapper;->obtainMessageO(ILjava/lang/Object;)Landroid/os/Message;
 HSPLcom/android/internal/view/IInputConnectionWrapper;->performEditorAction(I)V
-HSPLcom/android/internal/view/IInputConnectionWrapper;->requestUpdateCursorAnchorInfo(IILcom/android/internal/view/IInputContextCallback;)V
 HSPLcom/android/internal/view/IInputConnectionWrapper;->sendKeyEvent(Landroid/view/KeyEvent;)V
 HSPLcom/android/internal/view/IInputConnectionWrapper;->setComposingRegion(II)V
 HSPLcom/android/internal/view/IInputConnectionWrapper;->setComposingText(Ljava/lang/CharSequence;I)V
@@ -33890,18 +30528,17 @@
 HSPLcom/android/internal/view/IInputContext$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLcom/android/internal/view/IInputContextCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HSPLcom/android/internal/view/IInputContextCallback$Stub$Proxy;->setCursorCapsMode(II)V
-HSPLcom/android/internal/view/IInputContextCallback$Stub$Proxy;->setRequestUpdateCursorAnchorInfoResult(ZI)V
 HSPLcom/android/internal/view/IInputContextCallback$Stub$Proxy;->setSelectedText(Ljava/lang/CharSequence;I)V
 HSPLcom/android/internal/view/IInputContextCallback$Stub$Proxy;->setTextAfterCursor(Ljava/lang/CharSequence;I)V
 HSPLcom/android/internal/view/IInputContextCallback$Stub$Proxy;->setTextBeforeCursor(Ljava/lang/CharSequence;I)V
 HSPLcom/android/internal/view/IInputContextCallback$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/view/IInputContextCallback;
-PLcom/android/internal/view/IInputMethod$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+HPLcom/android/internal/view/IInputMethod$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HPLcom/android/internal/view/IInputMethod$Stub$Proxy;->asBinder()Landroid/os/IBinder;
 HPLcom/android/internal/view/IInputMethod$Stub$Proxy;->bindInput(Landroid/view/inputmethod/InputBinding;)V
 HPLcom/android/internal/view/IInputMethod$Stub$Proxy;->createSession(Landroid/view/InputChannel;Lcom/android/internal/view/IInputSessionCallback;)V
-HPLcom/android/internal/view/IInputMethod$Stub$Proxy;->hideSoftInput(ILandroid/os/ResultReceiver;)V
 HPLcom/android/internal/view/IInputMethod$Stub$Proxy;->initializeInternal(Landroid/os/IBinder;ILcom/android/internal/inputmethod/IInputMethodPrivilegedOperations;)V
 HPLcom/android/internal/view/IInputMethod$Stub$Proxy;->setSessionEnabled(Lcom/android/internal/view/IInputMethodSession;Z)V
+HPLcom/android/internal/view/IInputMethod$Stub$Proxy;->showSoftInput(Landroid/os/IBinder;ILandroid/os/ResultReceiver;)V
 HPLcom/android/internal/view/IInputMethod$Stub$Proxy;->startInput(Landroid/os/IBinder;Lcom/android/internal/view/IInputContext;ILandroid/view/inputmethod/EditorInfo;ZZ)V
 HPLcom/android/internal/view/IInputMethod$Stub$Proxy;->unbindInput()V
 HPLcom/android/internal/view/IInputMethod$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/view/IInputMethod;
@@ -33920,6 +30557,7 @@
 HSPLcom/android/internal/view/IInputMethodManager$Stub$Proxy;->getEnabledInputMethodList(I)Ljava/util/List;
 HSPLcom/android/internal/view/IInputMethodManager$Stub$Proxy;->getEnabledInputMethodSubtypeList(Ljava/lang/String;Z)Ljava/util/List;
 HSPLcom/android/internal/view/IInputMethodManager$Stub$Proxy;->hideSoftInput(Lcom/android/internal/view/IInputMethodClient;ILandroid/os/ResultReceiver;)Z
+HSPLcom/android/internal/view/IInputMethodManager$Stub$Proxy;->hideSoftInput(Lcom/android/internal/view/IInputMethodClient;Landroid/os/IBinder;ILandroid/os/ResultReceiver;)Z
 HSPLcom/android/internal/view/IInputMethodManager$Stub$Proxy;->showSoftInput(Lcom/android/internal/view/IInputMethodClient;Landroid/os/IBinder;ILandroid/os/ResultReceiver;)Z
 HSPLcom/android/internal/view/IInputMethodManager$Stub$Proxy;->startInputOrWindowGainedFocus(ILcom/android/internal/view/IInputMethodClient;Landroid/os/IBinder;IIILandroid/view/inputmethod/EditorInfo;Lcom/android/internal/view/IInputContext;II)Lcom/android/internal/view/InputBindResult;
 HSPLcom/android/internal/view/IInputMethodManager$Stub;-><init>()V
@@ -33931,12 +30569,10 @@
 HSPLcom/android/internal/view/IInputMethodSession$Stub$Proxy;->updateSelection(IIIIII)V
 HSPLcom/android/internal/view/IInputMethodSession$Stub$Proxy;->viewClicked(Z)V
 HSPLcom/android/internal/view/IInputMethodSession$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/view/IInputMethodSession;
-HPLcom/android/internal/view/IInputSessionCallback$Stub;-><init>()V
 HPLcom/android/internal/view/IInputSessionCallback$Stub;->asBinder()Landroid/os/IBinder;
 HPLcom/android/internal/view/IInputSessionCallback$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLcom/android/internal/view/InputBindResult$1;->createFromParcel(Landroid/os/Parcel;)Lcom/android/internal/view/InputBindResult;
 HSPLcom/android/internal/view/InputBindResult$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HPLcom/android/internal/view/InputBindResult;-><init>(ILcom/android/internal/view/IInputMethodSession;Landroid/view/InputChannel;Ljava/lang/String;ILandroid/graphics/Matrix;)V
 HSPLcom/android/internal/view/InputBindResult;-><init>(Landroid/os/Parcel;)V
 HSPLcom/android/internal/view/InputBindResult;->getActivityViewToScreenMatrix()Landroid/graphics/Matrix;
 HPLcom/android/internal/view/InputBindResult;->writeToParcel(Landroid/os/Parcel;I)V
@@ -33960,13 +30596,11 @@
 HSPLcom/android/internal/view/menu/BaseMenuPresenter;->initForMenu(Landroid/content/Context;Lcom/android/internal/view/menu/MenuBuilder;)V
 HSPLcom/android/internal/view/menu/BaseMenuPresenter;->setCallback(Lcom/android/internal/view/menu/MenuPresenter$Callback;)V
 HSPLcom/android/internal/view/menu/BaseMenuPresenter;->updateMenuView(Z)V
-HSPLcom/android/internal/view/menu/ContextMenuBuilder;-><init>(Landroid/content/Context;)V
 HSPLcom/android/internal/view/menu/MenuBuilder;-><init>(Landroid/content/Context;)V
 HSPLcom/android/internal/view/menu/MenuBuilder;->add(IIII)Landroid/view/MenuItem;
 HSPLcom/android/internal/view/menu/MenuBuilder;->add(IIILjava/lang/CharSequence;)Landroid/view/MenuItem;
 HSPLcom/android/internal/view/menu/MenuBuilder;->addInternal(IIILjava/lang/CharSequence;)Landroid/view/MenuItem;
 HSPLcom/android/internal/view/menu/MenuBuilder;->addMenuPresenter(Lcom/android/internal/view/menu/MenuPresenter;Landroid/content/Context;)V
-HSPLcom/android/internal/view/menu/MenuBuilder;->clear()V
 HSPLcom/android/internal/view/menu/MenuBuilder;->close()V
 HSPLcom/android/internal/view/menu/MenuBuilder;->close(Z)V
 HSPLcom/android/internal/view/menu/MenuBuilder;->createNewMenuItem(IIIILjava/lang/CharSequence;I)Lcom/android/internal/view/menu/MenuItemImpl;
@@ -33984,14 +30618,11 @@
 HSPLcom/android/internal/view/menu/MenuBuilder;->onItemVisibleChanged(Lcom/android/internal/view/menu/MenuItemImpl;)V
 HSPLcom/android/internal/view/menu/MenuBuilder;->onItemsChanged(Z)V
 HSPLcom/android/internal/view/menu/MenuBuilder;->setCallback(Lcom/android/internal/view/menu/MenuBuilder$Callback;)V
-HSPLcom/android/internal/view/menu/MenuBuilder;->setCurrentMenuInfo(Landroid/view/ContextMenu$ContextMenuInfo;)V
-HSPLcom/android/internal/view/menu/MenuBuilder;->setDefaultShowAsAction(I)Lcom/android/internal/view/menu/MenuBuilder;
 HSPLcom/android/internal/view/menu/MenuBuilder;->setShortcutsVisibleInner(Z)V
 HSPLcom/android/internal/view/menu/MenuBuilder;->size()I
 HSPLcom/android/internal/view/menu/MenuBuilder;->startDispatchingItemsChanged()V
 HSPLcom/android/internal/view/menu/MenuBuilder;->stopDispatchingItemsChanged()V
 HSPLcom/android/internal/view/menu/MenuItemImpl;-><init>(Lcom/android/internal/view/menu/MenuBuilder;IIIILjava/lang/CharSequence;I)V
-HSPLcom/android/internal/view/menu/MenuItemImpl;->applyIconTintIfNecessary(Landroid/graphics/drawable/Drawable;)Landroid/graphics/drawable/Drawable;
 HSPLcom/android/internal/view/menu/MenuItemImpl;->getActionProvider()Landroid/view/ActionProvider;
 HSPLcom/android/internal/view/menu/MenuItemImpl;->getContentDescription()Ljava/lang/CharSequence;
 HSPLcom/android/internal/view/menu/MenuItemImpl;->getGroupId()I
@@ -34001,7 +30632,6 @@
 HSPLcom/android/internal/view/menu/MenuItemImpl;->getSubMenu()Landroid/view/SubMenu;
 HSPLcom/android/internal/view/menu/MenuItemImpl;->getTitle()Ljava/lang/CharSequence;
 HSPLcom/android/internal/view/menu/MenuItemImpl;->getTooltipText()Ljava/lang/CharSequence;
-HSPLcom/android/internal/view/menu/MenuItemImpl;->hasCollapsibleActionView()Z
 HSPLcom/android/internal/view/menu/MenuItemImpl;->hasSubMenu()Z
 HSPLcom/android/internal/view/menu/MenuItemImpl;->isActionButton()Z
 HSPLcom/android/internal/view/menu/MenuItemImpl;->isActionViewExpanded()Z
@@ -34028,6 +30658,8 @@
 HSPLcom/android/internal/view/menu/MenuPopupHelper;-><init>(Landroid/content/Context;Lcom/android/internal/view/menu/MenuBuilder;Landroid/view/View;ZII)V
 HSPLcom/android/internal/view/menu/MenuPopupHelper;->setGravity(I)V
 HSPLcom/android/internal/view/menu/MenuPopupHelper;->setOnDismissListener(Landroid/widget/PopupWindow$OnDismissListener;)V
+HSPLcom/android/internal/widget/-$$Lambda$DKD2sNhLnyRFoBkFvfwKyxoEx10;-><clinit>()V
+HSPLcom/android/internal/widget/-$$Lambda$DKD2sNhLnyRFoBkFvfwKyxoEx10;-><init>()V
 HSPLcom/android/internal/widget/-$$Lambda$FloatingToolbar$FloatingToolbarPopup$-uEfRwR-_1oHxMvRVdmbNRdukDM;-><init>(Lcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup;Landroid/widget/ImageButton;)V
 HSPLcom/android/internal/widget/-$$Lambda$FloatingToolbar$FloatingToolbarPopup$77YZy6kisO5OnjlgtKp0Zi1V8EY;-><init>(Lcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup;)V
 HSPLcom/android/internal/widget/-$$Lambda$FloatingToolbar$FloatingToolbarPopup$77YZy6kisO5OnjlgtKp0Zi1V8EY;->onComputeInternalInsets(Landroid/view/ViewTreeObserver$InternalInsetsInfo;)V
@@ -34132,7 +30764,6 @@
 HSPLcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup$11;-><init>(Lcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup;Landroid/content/Context;)V
 HSPLcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup$11;->onMeasure(II)V
 HSPLcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup$12;-><init>(Lcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup;Landroid/content/Context;I)V
-HSPLcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup$12;->getView(ILandroid/view/View;Landroid/view/ViewGroup;)Landroid/view/View;
 HSPLcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup$13;-><init>(Lcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup;)V
 HSPLcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup$1;-><init>(Lcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup;)V
 HSPLcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup$2;-><init>(Lcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup;)V
@@ -34145,104 +30776,50 @@
 HSPLcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup$LogAccelerateInterpolator;->computeLog(FI)F
 HSPLcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup$OverflowPanel;-><init>(Lcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup;)V
 HSPLcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup$OverflowPanel;->awakenScrollBars()Z
-HSPLcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup$OverflowPanel;->onMeasure(II)V
 HSPLcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup$OverflowPanelViewHelper;-><init>(Landroid/content/Context;I)V
-HSPLcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup$OverflowPanelViewHelper;->calculateWidth(Landroid/view/MenuItem;)I
 HSPLcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup$OverflowPanelViewHelper;->createMenuButton(Landroid/view/MenuItem;)Landroid/view/View;
-HSPLcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup$OverflowPanelViewHelper;->getView(Landroid/view/MenuItem;ILandroid/view/View;)Landroid/view/View;
 HSPLcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup$OverflowPanelViewHelper;->shouldShowIcon(Landroid/view/MenuItem;)Z
 HSPLcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup;-><init>(Landroid/content/Context;Landroid/view/View;)V
 HSPLcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup;->access$1000(Lcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup;)Landroid/widget/PopupWindow;
 HSPLcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup;->access$2100(Lcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup;)Z
-HSPLcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup;->access$2300(Lcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup;)Landroid/util/Size;
-HSPLcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup;->access$2400(Lcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup;)Lcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup$OverflowPanelViewHelper;
-HSPLcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup;->access$2500(Lcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup;)Landroid/content/Context;
-HSPLcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup;->access$2600(Lcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup;)Landroid/util/Size;
-HSPLcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup;->access$400(Lcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup;)Landroid/view/ViewGroup;
-HSPLcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup;->calculateOverflowHeight(I)I
-HSPLcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup;->cancelDismissAndHideAnimations()V
 HSPLcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup;->cancelOverflowAnimations()V
 HSPLcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup;->clearPanels()V
-HSPLcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup;->createMainPanel()Landroid/view/ViewGroup;
-HSPLcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup;->createOverflowAnimationListener()Landroid/view/animation/Animation$AnimationListener;
-HSPLcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup;->createOverflowButton()Landroid/widget/ImageButton;
 HSPLcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup;->createOverflowPanel()Lcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup$OverflowPanel;
-HSPLcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup;->dismiss()V
 HSPLcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup;->getAdjustedToolbarWidth(I)I
-HSPLcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup;->getOverflowWidth()I
-HSPLcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup;->hasOverflow()Z
-HSPLcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup;->hide()V
-HSPLcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup;->isInRTLMode()Z
 HSPLcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup;->isOverflowAnimating()Z
 HSPLcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup;->isShowing()Z
-HSPLcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup;->lambda$new$0$FloatingToolbar$FloatingToolbarPopup(Landroid/view/ViewTreeObserver$InternalInsetsInfo;)V
 HSPLcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup;->layoutMainPanelItems(Ljava/util/List;I)Ljava/util/List;
-HSPLcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup;->layoutMenuItems(Ljava/util/List;Landroid/view/MenuItem$OnMenuItemClickListener;I)V
-HSPLcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup;->layoutOverflowPanelItems(Ljava/util/List;)V
 HSPLcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup;->maybeComputeTransitionDurationScale()V
-HSPLcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup;->measure(Landroid/view/View;)Landroid/util/Size;
 HSPLcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup;->preparePopupContent()V
 HSPLcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup;->refreshCoordinatesAndOverflowDirection(Landroid/graphics/Rect;)V
-HSPLcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup;->refreshViewPort()V
-HSPLcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup;->runDismissAnimation()V
-HSPLcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup;->runShowAnimation()V
-HSPLcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup;->setButtonTagAndClickListener(Landroid/view/View;Landroid/view/MenuItem;)V
 HSPLcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup;->setContentAreaAsTouchableSurface()V
 HSPLcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup;->setPanelsStatesAtRestingPosition()V
-HSPLcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup;->setSize(Landroid/view/View;II)V
-HSPLcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup;->setSize(Landroid/view/View;Landroid/util/Size;)V
-HSPLcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup;->setTouchableSurfaceInsetsComputer()V
-HSPLcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup;->setZeroTouchableSurface()V
 HSPLcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup;->show(Landroid/graphics/Rect;)V
-HSPLcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup;->updateOverflowHeight(I)V
 HSPLcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup;->updatePopupSize()V
 HSPLcom/android/internal/widget/FloatingToolbar;-><init>(Landroid/view/Window;)V
-HSPLcom/android/internal/widget/FloatingToolbar;->access$1100(Landroid/view/View;ILandroid/animation/Animator$AnimatorListener;)Landroid/animation/AnimatorSet;
-HSPLcom/android/internal/widget/FloatingToolbar;->access$2000(Landroid/content/Context;Landroid/view/MenuItem;IZ)Landroid/view/View;
-HSPLcom/android/internal/widget/FloatingToolbar;->access$2700(Landroid/view/View;Landroid/view/MenuItem;IZ)V
-HSPLcom/android/internal/widget/FloatingToolbar;->access$600(Landroid/content/Context;)Landroid/view/ViewGroup;
-HSPLcom/android/internal/widget/FloatingToolbar;->access$700(Landroid/view/ViewGroup;)Landroid/widget/PopupWindow;
-HSPLcom/android/internal/widget/FloatingToolbar;->access$900(Landroid/view/View;)Landroid/animation/AnimatorSet;
 HSPLcom/android/internal/widget/FloatingToolbar;->applyDefaultTheme(Landroid/content/Context;)Landroid/content/Context;
 HSPLcom/android/internal/widget/FloatingToolbar;->createContentContainer(Landroid/content/Context;)Landroid/view/ViewGroup;
 HSPLcom/android/internal/widget/FloatingToolbar;->createEnterAnimation(Landroid/view/View;)Landroid/animation/AnimatorSet;
 HSPLcom/android/internal/widget/FloatingToolbar;->createExitAnimation(Landroid/view/View;ILandroid/animation/Animator$AnimatorListener;)Landroid/animation/AnimatorSet;
-HSPLcom/android/internal/widget/FloatingToolbar;->createMenuItemButton(Landroid/content/Context;Landroid/view/MenuItem;IZ)Landroid/view/View;
 HSPLcom/android/internal/widget/FloatingToolbar;->createPopupWindow(Landroid/view/ViewGroup;)Landroid/widget/PopupWindow;
-HSPLcom/android/internal/widget/FloatingToolbar;->dismiss()V
 HSPLcom/android/internal/widget/FloatingToolbar;->doShow()V
 HSPLcom/android/internal/widget/FloatingToolbar;->getVisibleAndEnabledMenuItems(Landroid/view/Menu;)Ljava/util/List;
-HSPLcom/android/internal/widget/FloatingToolbar;->hide()V
 HSPLcom/android/internal/widget/FloatingToolbar;->isCurrentlyShowing(Ljava/util/List;)Z
 HSPLcom/android/internal/widget/FloatingToolbar;->lambda$new$1(Landroid/view/MenuItem;Landroid/view/MenuItem;)I
-HSPLcom/android/internal/widget/FloatingToolbar;->registerOrientationHandler()V
-HSPLcom/android/internal/widget/FloatingToolbar;->setContentRect(Landroid/graphics/Rect;)Lcom/android/internal/widget/FloatingToolbar;
-HSPLcom/android/internal/widget/FloatingToolbar;->setMenu(Landroid/view/Menu;)Lcom/android/internal/widget/FloatingToolbar;
-HSPLcom/android/internal/widget/FloatingToolbar;->setOnMenuItemClickListener(Landroid/view/MenuItem$OnMenuItemClickListener;)Lcom/android/internal/widget/FloatingToolbar;
-HSPLcom/android/internal/widget/FloatingToolbar;->show()Lcom/android/internal/widget/FloatingToolbar;
-HSPLcom/android/internal/widget/FloatingToolbar;->unregisterOrientationHandler()V
-HSPLcom/android/internal/widget/FloatingToolbar;->updateLayout()Lcom/android/internal/widget/FloatingToolbar;
 HSPLcom/android/internal/widget/FloatingToolbar;->updateMenuItemButton(Landroid/view/View;Landroid/view/MenuItem;IZ)V
-PLcom/android/internal/widget/ICheckCredentialProgressCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HPLcom/android/internal/widget/ICheckCredentialProgressCallback$Stub$Proxy;->onCredentialVerified()V
 HSPLcom/android/internal/widget/ICheckCredentialProgressCallback$Stub;-><init>()V
 HSPLcom/android/internal/widget/ICheckCredentialProgressCallback$Stub;->asBinder()Landroid/os/IBinder;
-PLcom/android/internal/widget/ICheckCredentialProgressCallback$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/widget/ICheckCredentialProgressCallback;
 HSPLcom/android/internal/widget/ICheckCredentialProgressCallback$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLcom/android/internal/widget/ILockSettings$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HSPLcom/android/internal/widget/ILockSettings$Stub$Proxy;->checkCredential(Lcom/android/internal/widget/LockscreenCredential;ILcom/android/internal/widget/ICheckCredentialProgressCallback;)Lcom/android/internal/widget/VerifyCredentialResponse;
 HSPLcom/android/internal/widget/ILockSettings$Stub$Proxy;->checkVoldPassword(I)Z
 HSPLcom/android/internal/widget/ILockSettings$Stub$Proxy;->getBoolean(Ljava/lang/String;ZI)Z
 HSPLcom/android/internal/widget/ILockSettings$Stub$Proxy;->getCredentialType(I)I
-HSPLcom/android/internal/widget/ILockSettings$Stub$Proxy;->getRecoverySecretTypes()[I
 HSPLcom/android/internal/widget/ILockSettings$Stub$Proxy;->getSeparateProfileChallengeEnabled(I)Z
 HSPLcom/android/internal/widget/ILockSettings$Stub$Proxy;->getString(Ljava/lang/String;Ljava/lang/String;I)Ljava/lang/String;
-HSPLcom/android/internal/widget/ILockSettings$Stub$Proxy;->initRecoveryServiceWithSigFile(Ljava/lang/String;[B[B)V
 HSPLcom/android/internal/widget/ILockSettings$Stub$Proxy;->registerStrongAuthTracker(Landroid/app/trust/IStrongAuthTracker;)V
 HSPLcom/android/internal/widget/ILockSettings$Stub$Proxy;->setBoolean(Ljava/lang/String;ZI)V
-HSPLcom/android/internal/widget/ILockSettings$Stub$Proxy;->setRecoverySecretTypes([I)V
-HSPLcom/android/internal/widget/ILockSettings$Stub$Proxy;->setServerParams([B)V
-HSPLcom/android/internal/widget/ILockSettings$Stub$Proxy;->setSnapshotCreatedPendingIntent(Landroid/app/PendingIntent;)V
 HSPLcom/android/internal/widget/ILockSettings$Stub$Proxy;->userPresent(I)V
 HSPLcom/android/internal/widget/ILockSettings$Stub;-><init>()V
 HSPLcom/android/internal/widget/ILockSettings$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/widget/ILockSettings;
@@ -34273,7 +30850,6 @@
 HSPLcom/android/internal/widget/LockPatternUtils$StrongAuthTracker;->getDefaultFlags(Landroid/content/Context;)I
 HSPLcom/android/internal/widget/LockPatternUtils$StrongAuthTracker;->getStrongAuthForUser(I)I
 HSPLcom/android/internal/widget/LockPatternUtils$StrongAuthTracker;->handleStrongAuthRequiredChanged(II)V
-HSPLcom/android/internal/widget/LockPatternUtils$StrongAuthTracker;->isBiometricAllowedForUser(I)Z
 HSPLcom/android/internal/widget/LockPatternUtils$StrongAuthTracker;->isTrustAllowedForUser(I)Z
 PLcom/android/internal/widget/LockPatternUtils$StrongAuthTracker;->onStrongAuthRequiredChanged(I)V
 HSPLcom/android/internal/widget/LockPatternUtils;-><init>(Landroid/content/Context;)V
@@ -34293,9 +30869,8 @@
 HSPLcom/android/internal/widget/LockPatternUtils;->getLockoutAttemptDeadline(I)J
 HSPLcom/android/internal/widget/LockPatternUtils;->getPowerButtonInstantlyLocks(I)Z
 HSPLcom/android/internal/widget/LockPatternUtils;->getString(Ljava/lang/String;I)Ljava/lang/String;
-HSPLcom/android/internal/widget/LockPatternUtils;->getTrustManager()Landroid/app/trust/TrustManager;
 HSPLcom/android/internal/widget/LockPatternUtils;->getUserManager()Landroid/os/UserManager;
-HPLcom/android/internal/widget/LockPatternUtils;->hasSecureLockScreen()Z
+HSPLcom/android/internal/widget/LockPatternUtils;->hasSecureLockScreen()Z
 HSPLcom/android/internal/widget/LockPatternUtils;->hasSeparateChallenge(I)Z
 HSPLcom/android/internal/widget/LockPatternUtils;->isLockScreenDisabled(I)Z
 HSPLcom/android/internal/widget/LockPatternUtils;->isManagedProfile(I)Z
@@ -34320,7 +30895,7 @@
 HPLcom/android/internal/widget/LockscreenCredential;->checkAgainstStoredType(I)Z
 HSPLcom/android/internal/widget/LockscreenCredential;->createNone()Lcom/android/internal/widget/LockscreenCredential;
 HSPLcom/android/internal/widget/LockscreenCredential;->duplicate()Lcom/android/internal/widget/LockscreenCredential;
-HPLcom/android/internal/widget/LockscreenCredential;->ensureNotZeroized()V
+HSPLcom/android/internal/widget/LockscreenCredential;->ensureNotZeroized()V
 HPLcom/android/internal/widget/LockscreenCredential;->getCredential()[B
 HPLcom/android/internal/widget/LockscreenCredential;->getType()I
 HPLcom/android/internal/widget/LockscreenCredential;->isNone()Z
@@ -34329,16 +30904,58 @@
 HSPLcom/android/internal/widget/LockscreenCredential;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLcom/android/internal/widget/LockscreenCredential;->zeroize()V
 HSPLcom/android/internal/widget/MessagingGroup;-><clinit>()V
+HSPLcom/android/internal/widget/MessagingGroup;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
+HSPLcom/android/internal/widget/MessagingGroup;->calculateSendingTextColor()I
+HSPLcom/android/internal/widget/MessagingGroup;->createGroup(Lcom/android/internal/widget/MessagingLinearLayout;)Lcom/android/internal/widget/MessagingGroup;
 HSPLcom/android/internal/widget/MessagingGroup;->dropCache()V
+HSPLcom/android/internal/widget/MessagingGroup;->getMessages()Ljava/util/List;
+HSPLcom/android/internal/widget/MessagingGroup;->getSender()Landroid/app/Person;
+HSPLcom/android/internal/widget/MessagingGroup;->getSenderName()Ljava/lang/CharSequence;
+HSPLcom/android/internal/widget/MessagingGroup;->needsGeneratedAvatar()Z
+HSPLcom/android/internal/widget/MessagingGroup;->onFinishInflate()V
+HSPLcom/android/internal/widget/MessagingGroup;->removeFromParentIfDifferent(Lcom/android/internal/widget/MessagingMessage;Landroid/view/ViewGroup;)Z
+HSPLcom/android/internal/widget/MessagingGroup;->setAvatar(Landroid/graphics/drawable/Icon;)V
+HSPLcom/android/internal/widget/MessagingGroup;->setLayoutColor(I)V
+HSPLcom/android/internal/widget/MessagingGroup;->setMessages(Ljava/util/List;)V
+HSPLcom/android/internal/widget/MessagingGroup;->setSender(Landroid/app/Person;Ljava/lang/CharSequence;)V
+HSPLcom/android/internal/widget/MessagingGroup;->setSending(Z)V
+HSPLcom/android/internal/widget/MessagingGroup;->setTextColors(II)V
+HSPLcom/android/internal/widget/MessagingGroup;->updateImageContainerVisibility()V
+HSPLcom/android/internal/widget/MessagingGroup;->updateMessageColor()V
 HSPLcom/android/internal/widget/MessagingImageMessage;-><clinit>()V
 HSPLcom/android/internal/widget/MessagingImageMessage;->dropCache()V
+HSPLcom/android/internal/widget/MessagingLayout;-><clinit>()V
+HSPLcom/android/internal/widget/MessagingLinearLayout$LayoutParams;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
+HSPLcom/android/internal/widget/MessagingLinearLayout;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
+HSPLcom/android/internal/widget/MessagingLinearLayout;->generateLayoutParams(Landroid/util/AttributeSet;)Landroid/view/ViewGroup$LayoutParams;
+HSPLcom/android/internal/widget/MessagingLinearLayout;->generateLayoutParams(Landroid/util/AttributeSet;)Lcom/android/internal/widget/MessagingLinearLayout$LayoutParams;
 HSPLcom/android/internal/widget/MessagingMessage;->dropCache()V
+HSPLcom/android/internal/widget/MessagingMessage;->getGroup()Lcom/android/internal/widget/MessagingGroup;
+HSPLcom/android/internal/widget/MessagingMessage;->getMessage()Landroid/app/Notification$MessagingStyle$Message;
+HSPLcom/android/internal/widget/MessagingMessage;->getView()Landroid/view/View;
+HSPLcom/android/internal/widget/MessagingMessage;->hasImage(Landroid/app/Notification$MessagingStyle$Message;)Z
+HSPLcom/android/internal/widget/MessagingMessage;->setIsHistoric(Z)V
+HSPLcom/android/internal/widget/MessagingMessage;->setMessage(Landroid/app/Notification$MessagingStyle$Message;)Z
+HSPLcom/android/internal/widget/MessagingMessage;->setMessagingGroup(Lcom/android/internal/widget/MessagingGroup;)V
+HSPLcom/android/internal/widget/MessagingMessageState;-><init>(Landroid/view/View;)V
+HSPLcom/android/internal/widget/MessagingMessageState;->getGroup()Lcom/android/internal/widget/MessagingGroup;
+HSPLcom/android/internal/widget/MessagingMessageState;->getMessage()Landroid/app/Notification$MessagingStyle$Message;
+HSPLcom/android/internal/widget/MessagingMessageState;->setGroup(Lcom/android/internal/widget/MessagingGroup;)V
+HSPLcom/android/internal/widget/MessagingMessageState;->setIsHistoric(Z)V
+HSPLcom/android/internal/widget/MessagingMessageState;->setMessage(Landroid/app/Notification$MessagingStyle$Message;)V
 HSPLcom/android/internal/widget/MessagingPropertyAnimator$1;-><init>(Ljava/lang/String;)V
 HSPLcom/android/internal/widget/MessagingPropertyAnimator;-><clinit>()V
+HSPLcom/android/internal/widget/MessagingPropertyAnimator;-><init>()V
+HSPLcom/android/internal/widget/MessagingPropertyAnimator;->getLayoutTop(Landroid/view/View;)I
 HSPLcom/android/internal/widget/MessagingPropertyAnimator;->getTop(Landroid/view/View;)I
 HSPLcom/android/internal/widget/MessagingPropertyAnimator;->isAnimatingTranslation(Landroid/view/View;)Z
+HSPLcom/android/internal/widget/MessagingPropertyAnimator;->setFirstLayout(Landroid/view/View;Z)V
 HSPLcom/android/internal/widget/MessagingTextMessage;-><clinit>()V
+HSPLcom/android/internal/widget/MessagingTextMessage;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
 HSPLcom/android/internal/widget/MessagingTextMessage;->dropCache()V
+HSPLcom/android/internal/widget/MessagingTextMessage;->getState()Lcom/android/internal/widget/MessagingMessageState;
+HSPLcom/android/internal/widget/MessagingTextMessage;->setColor(I)V
+HSPLcom/android/internal/widget/MessagingTextMessage;->setMessage(Landroid/app/Notification$MessagingStyle$Message;)Z
 HSPLcom/android/internal/widget/NotificationActionListLayout;-><clinit>()V
 HSPLcom/android/internal/widget/NotificationActionListLayout;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
 HSPLcom/android/internal/widget/NotificationActionListLayout;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V
@@ -34383,8 +31000,6 @@
 HSPLcom/android/internal/widget/VerifyCredentialResponse$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
 HSPLcom/android/internal/widget/VerifyCredentialResponse;-><clinit>()V
 HSPLcom/android/internal/widget/VerifyCredentialResponse;-><init>(II[B)V
-HPLcom/android/internal/widget/VerifyCredentialResponse;-><init>([B)V
-HSPLcom/android/internal/widget/VerifyCredentialResponse;->getPayload()[B
 HSPLcom/android/internal/widget/VerifyCredentialResponse;->getResponseCode()I
 HPLcom/android/internal/widget/VerifyCredentialResponse;->writeToParcel(Landroid/os/Parcel;I)V
 HSPLcom/android/internal/widget/ViewClippingUtil$ClippingParameters;->isClippingEnablingAllowed(Landroid/view/View;)Z
@@ -34446,7 +31061,6 @@
 HSPLcom/android/okhttp/Dns$1;->lookup(Ljava/lang/String;)Ljava/util/List;
 HSPLcom/android/okhttp/Handshake;-><init>(Ljava/lang/String;Ljava/util/List;Ljava/util/List;)V
 HSPLcom/android/okhttp/Handshake;->get(Ljavax/net/ssl/SSLSession;)Lcom/android/okhttp/Handshake;
-HSPLcom/android/okhttp/Handshake;->peerCertificates()Ljava/util/List;
 HSPLcom/android/okhttp/Headers$Builder;-><init>()V
 HSPLcom/android/okhttp/Headers$Builder;->access$000(Lcom/android/okhttp/Headers$Builder;)Ljava/util/List;
 HSPLcom/android/okhttp/Headers$Builder;->add(Ljava/lang/String;Ljava/lang/String;)Lcom/android/okhttp/Headers$Builder;
@@ -34465,10 +31079,8 @@
 HSPLcom/android/okhttp/Headers;->newBuilder()Lcom/android/okhttp/Headers$Builder;
 HSPLcom/android/okhttp/Headers;->size()I
 HSPLcom/android/okhttp/Headers;->value(I)Ljava/lang/String;
-HSPLcom/android/okhttp/HttpHandler$CleartextURLFilter;->checkURLPermitted(Ljava/net/URL;)V
 HSPLcom/android/okhttp/HttpHandler;-><init>()V
 HSPLcom/android/okhttp/HttpHandler;->createHttpOkUrlFactory(Ljava/net/Proxy;)Lcom/android/okhttp/OkUrlFactory;
-HSPLcom/android/okhttp/HttpHandler;->newOkUrlFactory(Ljava/net/Proxy;)Lcom/android/okhttp/OkUrlFactory;
 HSPLcom/android/okhttp/HttpHandler;->openConnection(Ljava/net/URL;)Ljava/net/URLConnection;
 HSPLcom/android/okhttp/HttpUrl$Builder;-><init>()V
 HSPLcom/android/okhttp/HttpUrl$Builder;->build()Lcom/android/okhttp/HttpUrl;
@@ -34495,7 +31107,6 @@
 HSPLcom/android/okhttp/HttpUrl;-><init>(Lcom/android/okhttp/HttpUrl$Builder;)V
 HSPLcom/android/okhttp/HttpUrl;-><init>(Lcom/android/okhttp/HttpUrl$Builder;Lcom/android/okhttp/HttpUrl$1;)V
 HSPLcom/android/okhttp/HttpUrl;->access$200(Ljava/lang/String;IILjava/lang/String;)I
-HSPLcom/android/okhttp/HttpUrl;->canonicalize(Lcom/android/okhttp/okio/Buffer;Ljava/lang/String;IILjava/lang/String;ZZZZ)V
 HSPLcom/android/okhttp/HttpUrl;->canonicalize(Ljava/lang/String;IILjava/lang/String;ZZZZ)Ljava/lang/String;
 HSPLcom/android/okhttp/HttpUrl;->canonicalize(Ljava/lang/String;Ljava/lang/String;ZZZZ)Ljava/lang/String;
 HSPLcom/android/okhttp/HttpUrl;->decodeHexDigit(C)I
@@ -34523,7 +31134,6 @@
 HSPLcom/android/okhttp/HttpUrl;->queryStringToNamesAndValues(Ljava/lang/String;)Ljava/util/List;
 HSPLcom/android/okhttp/HttpUrl;->scheme()Ljava/lang/String;
 HSPLcom/android/okhttp/HttpUrl;->uri()Ljava/net/URI;
-HSPLcom/android/okhttp/HttpUrl;->url()Ljava/net/URL;
 HSPLcom/android/okhttp/HttpsHandler;-><init>()V
 HSPLcom/android/okhttp/HttpsHandler;->createHttpsOkUrlFactory(Ljava/net/Proxy;)Lcom/android/okhttp/OkUrlFactory;
 HSPLcom/android/okhttp/HttpsHandler;->newOkUrlFactory(Ljava/net/Proxy;)Lcom/android/okhttp/OkUrlFactory;
@@ -34544,9 +31154,7 @@
 HSPLcom/android/okhttp/OkHttpClient;->getConnectionPool()Lcom/android/okhttp/ConnectionPool;
 HSPLcom/android/okhttp/OkHttpClient;->getConnectionSpecs()Ljava/util/List;
 HSPLcom/android/okhttp/OkHttpClient;->getCookieHandler()Ljava/net/CookieHandler;
-HSPLcom/android/okhttp/OkHttpClient;->getDefaultSSLSocketFactory()Ljavax/net/ssl/SSLSocketFactory;
 HSPLcom/android/okhttp/OkHttpClient;->getDns()Lcom/android/okhttp/Dns;
-HSPLcom/android/okhttp/OkHttpClient;->getFollowRedirects()Z
 HSPLcom/android/okhttp/OkHttpClient;->getHostnameVerifier()Ljavax/net/ssl/HostnameVerifier;
 HSPLcom/android/okhttp/OkHttpClient;->getProtocols()Ljava/util/List;
 HSPLcom/android/okhttp/OkHttpClient;->getProxy()Ljava/net/Proxy;
@@ -34561,17 +31169,14 @@
 HSPLcom/android/okhttp/OkHttpClient;->setConnectTimeout(JLjava/util/concurrent/TimeUnit;)V
 HSPLcom/android/okhttp/OkHttpClient;->setConnectionPool(Lcom/android/okhttp/ConnectionPool;)Lcom/android/okhttp/OkHttpClient;
 HSPLcom/android/okhttp/OkHttpClient;->setConnectionSpecs(Ljava/util/List;)Lcom/android/okhttp/OkHttpClient;
-HSPLcom/android/okhttp/OkHttpClient;->setDns(Lcom/android/okhttp/Dns;)Lcom/android/okhttp/OkHttpClient;
 HSPLcom/android/okhttp/OkHttpClient;->setFollowRedirects(Z)V
 HSPLcom/android/okhttp/OkHttpClient;->setFollowSslRedirects(Z)Lcom/android/okhttp/OkHttpClient;
 HSPLcom/android/okhttp/OkHttpClient;->setHostnameVerifier(Ljavax/net/ssl/HostnameVerifier;)Lcom/android/okhttp/OkHttpClient;
 HSPLcom/android/okhttp/OkHttpClient;->setProtocols(Ljava/util/List;)Lcom/android/okhttp/OkHttpClient;
 HSPLcom/android/okhttp/OkHttpClient;->setProxy(Ljava/net/Proxy;)Lcom/android/okhttp/OkHttpClient;
 HSPLcom/android/okhttp/OkHttpClient;->setReadTimeout(JLjava/util/concurrent/TimeUnit;)V
-HSPLcom/android/okhttp/OkHttpClient;->setSocketFactory(Ljavax/net/SocketFactory;)Lcom/android/okhttp/OkHttpClient;
 HSPLcom/android/okhttp/OkHttpClient;->setSslSocketFactory(Ljavax/net/ssl/SSLSocketFactory;)Lcom/android/okhttp/OkHttpClient;
 HSPLcom/android/okhttp/OkHttpClient;->setWriteTimeout(JLjava/util/concurrent/TimeUnit;)V
-HSPLcom/android/okhttp/OkUrlFactories;->open(Lcom/android/okhttp/OkUrlFactory;Ljava/net/URL;Ljava/net/Proxy;)Ljava/net/HttpURLConnection;
 HSPLcom/android/okhttp/OkUrlFactories;->setUrlFilter(Lcom/android/okhttp/OkUrlFactory;Lcom/android/okhttp/internal/URLFilter;)V
 HSPLcom/android/okhttp/OkUrlFactory;-><init>(Lcom/android/okhttp/OkHttpClient;)V
 HSPLcom/android/okhttp/OkUrlFactory;->client()Lcom/android/okhttp/OkHttpClient;
@@ -34607,8 +31212,6 @@
 HSPLcom/android/okhttp/Request;->isHttps()Z
 HSPLcom/android/okhttp/Request;->method()Ljava/lang/String;
 HSPLcom/android/okhttp/Request;->newBuilder()Lcom/android/okhttp/Request$Builder;
-HSPLcom/android/okhttp/Request;->uri()Ljava/net/URI;
-HSPLcom/android/okhttp/Request;->url()Ljava/net/URL;
 HSPLcom/android/okhttp/Response$Builder;-><init>()V
 HSPLcom/android/okhttp/Response$Builder;-><init>(Lcom/android/okhttp/Response;)V
 HSPLcom/android/okhttp/Response$Builder;-><init>(Lcom/android/okhttp/Response;Lcom/android/okhttp/Response$1;)V
@@ -34650,7 +31253,6 @@
 HSPLcom/android/okhttp/Response;->body()Lcom/android/okhttp/ResponseBody;
 HSPLcom/android/okhttp/Response;->cacheResponse()Lcom/android/okhttp/Response;
 HSPLcom/android/okhttp/Response;->code()I
-HSPLcom/android/okhttp/Response;->handshake()Lcom/android/okhttp/Handshake;
 HSPLcom/android/okhttp/Response;->header(Ljava/lang/String;)Ljava/lang/String;
 HSPLcom/android/okhttp/Response;->header(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
 HSPLcom/android/okhttp/Response;->headers()Lcom/android/okhttp/Headers;
@@ -34662,7 +31264,6 @@
 HSPLcom/android/okhttp/ResponseBody;-><init>()V
 HSPLcom/android/okhttp/ResponseBody;->byteStream()Ljava/io/InputStream;
 HSPLcom/android/okhttp/Route;-><init>(Lcom/android/okhttp/Address;Ljava/net/Proxy;Ljava/net/InetSocketAddress;)V
-HSPLcom/android/okhttp/Route;->equals(Ljava/lang/Object;)Z
 HSPLcom/android/okhttp/Route;->getAddress()Lcom/android/okhttp/Address;
 HSPLcom/android/okhttp/Route;->getProxy()Ljava/net/Proxy;
 HSPLcom/android/okhttp/Route;->getSocketAddress()Ljava/net/InetSocketAddress;
@@ -34680,7 +31281,6 @@
 HSPLcom/android/okhttp/internal/OptionalMethod;->invokeWithoutCheckedException(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;
 HSPLcom/android/okhttp/internal/OptionalMethod;->isSupported(Ljava/lang/Object;)Z
 HSPLcom/android/okhttp/internal/Platform;->afterHandshake(Ljavax/net/ssl/SSLSocket;)V
-HSPLcom/android/okhttp/internal/Platform;->concatLengthPrefixed(Ljava/util/List;)[B
 HSPLcom/android/okhttp/internal/Platform;->configureTlsExtensions(Ljavax/net/ssl/SSLSocket;Ljava/lang/String;Ljava/util/List;)V
 HSPLcom/android/okhttp/internal/Platform;->connectSocket(Ljava/net/Socket;Ljava/net/InetSocketAddress;I)V
 HSPLcom/android/okhttp/internal/Platform;->get()Lcom/android/okhttp/internal/Platform;
@@ -34693,15 +31293,11 @@
 HSPLcom/android/okhttp/internal/RouteDatabase;->shouldPostpone(Lcom/android/okhttp/Route;)Z
 HSPLcom/android/okhttp/internal/Util$1;-><init>(Ljava/lang/String;Z)V
 HSPLcom/android/okhttp/internal/Util$1;->newThread(Ljava/lang/Runnable;)Ljava/lang/Thread;
-HSPLcom/android/okhttp/internal/Util;->checkOffsetAndCount(JJJ)V
-HSPLcom/android/okhttp/internal/Util;->closeQuietly(Ljava/io/Closeable;)V
 HSPLcom/android/okhttp/internal/Util;->closeQuietly(Ljava/net/Socket;)V
-HSPLcom/android/okhttp/internal/Util;->discard(Lcom/android/okhttp/okio/Source;ILjava/util/concurrent/TimeUnit;)Z
 HSPLcom/android/okhttp/internal/Util;->equal(Ljava/lang/Object;Ljava/lang/Object;)Z
 HSPLcom/android/okhttp/internal/Util;->hostHeader(Lcom/android/okhttp/HttpUrl;Z)Ljava/lang/String;
 HSPLcom/android/okhttp/internal/Util;->immutableList(Ljava/util/List;)Ljava/util/List;
 HSPLcom/android/okhttp/internal/Util;->immutableList([Ljava/lang/Object;)Ljava/util/List;
-HSPLcom/android/okhttp/internal/Util;->skipAll(Lcom/android/okhttp/okio/Source;ILjava/util/concurrent/TimeUnit;)Z
 HSPLcom/android/okhttp/internal/Util;->threadFactory(Ljava/lang/String;Z)Ljava/util/concurrent/ThreadFactory;
 HSPLcom/android/okhttp/internal/Util;->toHumanReadableAscii(Ljava/lang/String;)Ljava/lang/String;
 HSPLcom/android/okhttp/internal/http/CacheStrategy$Factory;-><init>(JLcom/android/okhttp/Request;Lcom/android/okhttp/Response;)V
@@ -34709,18 +31305,10 @@
 HSPLcom/android/okhttp/internal/http/CacheStrategy$Factory;->getCandidate()Lcom/android/okhttp/internal/http/CacheStrategy;
 HSPLcom/android/okhttp/internal/http/CacheStrategy;-><init>(Lcom/android/okhttp/Request;Lcom/android/okhttp/Response;)V
 HSPLcom/android/okhttp/internal/http/CacheStrategy;-><init>(Lcom/android/okhttp/Request;Lcom/android/okhttp/Response;Lcom/android/okhttp/internal/http/CacheStrategy$1;)V
-HSPLcom/android/okhttp/internal/http/HeaderParser;->skipUntil(Ljava/lang/String;ILjava/lang/String;)I
-HSPLcom/android/okhttp/internal/http/HeaderParser;->skipWhitespace(Ljava/lang/String;I)I
 HSPLcom/android/okhttp/internal/http/Http1xStream$AbstractSource;-><init>(Lcom/android/okhttp/internal/http/Http1xStream;)V
 HSPLcom/android/okhttp/internal/http/Http1xStream$AbstractSource;-><init>(Lcom/android/okhttp/internal/http/Http1xStream;Lcom/android/okhttp/internal/http/Http1xStream$1;)V
 HSPLcom/android/okhttp/internal/http/Http1xStream$AbstractSource;->endOfInput()V
 HSPLcom/android/okhttp/internal/http/Http1xStream$AbstractSource;->timeout()Lcom/android/okhttp/okio/Timeout;
-HSPLcom/android/okhttp/internal/http/Http1xStream$AbstractSource;->unexpectedEndOfInput()V
-HSPLcom/android/okhttp/internal/http/Http1xStream$ChunkedSink;-><init>(Lcom/android/okhttp/internal/http/Http1xStream;)V
-HSPLcom/android/okhttp/internal/http/Http1xStream$ChunkedSink;-><init>(Lcom/android/okhttp/internal/http/Http1xStream;Lcom/android/okhttp/internal/http/Http1xStream$1;)V
-HSPLcom/android/okhttp/internal/http/Http1xStream$ChunkedSink;->close()V
-HSPLcom/android/okhttp/internal/http/Http1xStream$ChunkedSink;->flush()V
-HSPLcom/android/okhttp/internal/http/Http1xStream$ChunkedSink;->write(Lcom/android/okhttp/okio/Buffer;J)V
 HSPLcom/android/okhttp/internal/http/Http1xStream$ChunkedSource;-><init>(Lcom/android/okhttp/internal/http/Http1xStream;Lcom/android/okhttp/internal/http/HttpEngine;)V
 HSPLcom/android/okhttp/internal/http/Http1xStream$ChunkedSource;->close()V
 HSPLcom/android/okhttp/internal/http/Http1xStream$ChunkedSource;->read(Lcom/android/okhttp/okio/Buffer;J)J
@@ -34740,12 +31328,10 @@
 HSPLcom/android/okhttp/internal/http/Http1xStream;->access$502(Lcom/android/okhttp/internal/http/Http1xStream;I)I
 HSPLcom/android/okhttp/internal/http/Http1xStream;->access$600(Lcom/android/okhttp/internal/http/Http1xStream;)Lcom/android/okhttp/okio/BufferedSource;
 HSPLcom/android/okhttp/internal/http/Http1xStream;->access$700(Lcom/android/okhttp/internal/http/Http1xStream;)Lcom/android/okhttp/internal/http/StreamAllocation;
-HSPLcom/android/okhttp/internal/http/Http1xStream;->cancel()V
 HSPLcom/android/okhttp/internal/http/Http1xStream;->createRequestBody(Lcom/android/okhttp/Request;J)Lcom/android/okhttp/okio/Sink;
 HSPLcom/android/okhttp/internal/http/Http1xStream;->detachTimeout(Lcom/android/okhttp/okio/ForwardingTimeout;)V
 HSPLcom/android/okhttp/internal/http/Http1xStream;->finishRequest()V
 HSPLcom/android/okhttp/internal/http/Http1xStream;->getTransferStream(Lcom/android/okhttp/Response;)Lcom/android/okhttp/okio/Source;
-HSPLcom/android/okhttp/internal/http/Http1xStream;->newChunkedSink()Lcom/android/okhttp/okio/Sink;
 HSPLcom/android/okhttp/internal/http/Http1xStream;->newChunkedSource(Lcom/android/okhttp/internal/http/HttpEngine;)Lcom/android/okhttp/okio/Source;
 HSPLcom/android/okhttp/internal/http/Http1xStream;->newFixedLengthSink(J)Lcom/android/okhttp/okio/Sink;
 HSPLcom/android/okhttp/internal/http/Http1xStream;->newFixedLengthSource(J)Lcom/android/okhttp/okio/Source;
@@ -34766,7 +31352,6 @@
 HSPLcom/android/okhttp/internal/http/HttpEngine;->followUpRequest()Lcom/android/okhttp/Request;
 HSPLcom/android/okhttp/internal/http/HttpEngine;->getBufferedRequestBody()Lcom/android/okhttp/okio/BufferedSink;
 HSPLcom/android/okhttp/internal/http/HttpEngine;->getConnection()Lcom/android/okhttp/Connection;
-HSPLcom/android/okhttp/internal/http/HttpEngine;->getRequest()Lcom/android/okhttp/Request;
 HSPLcom/android/okhttp/internal/http/HttpEngine;->getRequestBody()Lcom/android/okhttp/okio/Sink;
 HSPLcom/android/okhttp/internal/http/HttpEngine;->getResponse()Lcom/android/okhttp/Response;
 HSPLcom/android/okhttp/internal/http/HttpEngine;->hasBody(Lcom/android/okhttp/Response;)Z
@@ -34789,12 +31374,10 @@
 HSPLcom/android/okhttp/internal/http/HttpMethod;->requiresRequestBody(Ljava/lang/String;)Z
 HSPLcom/android/okhttp/internal/http/OkHeaders$1;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
 HSPLcom/android/okhttp/internal/http/OkHeaders$1;->compare(Ljava/lang/String;Ljava/lang/String;)I
-HSPLcom/android/okhttp/internal/http/OkHeaders;->addCookies(Lcom/android/okhttp/Request$Builder;Ljava/util/Map;)V
 HSPLcom/android/okhttp/internal/http/OkHeaders;->contentLength(Lcom/android/okhttp/Headers;)J
 HSPLcom/android/okhttp/internal/http/OkHeaders;->contentLength(Lcom/android/okhttp/Request;)J
 HSPLcom/android/okhttp/internal/http/OkHeaders;->contentLength(Lcom/android/okhttp/Response;)J
 HSPLcom/android/okhttp/internal/http/OkHeaders;->stringToLong(Ljava/lang/String;)J
-HSPLcom/android/okhttp/internal/http/OkHeaders;->toMultimap(Lcom/android/okhttp/Headers;Ljava/lang/String;)Ljava/util/Map;
 HSPLcom/android/okhttp/internal/http/RealResponseBody;-><init>(Lcom/android/okhttp/Headers;Lcom/android/okhttp/okio/BufferedSource;)V
 HSPLcom/android/okhttp/internal/http/RealResponseBody;->source()Lcom/android/okhttp/okio/BufferedSource;
 HSPLcom/android/okhttp/internal/http/RequestLine;->get(Lcom/android/okhttp/Request;Ljava/net/Proxy$Type;)Ljava/lang/String;
@@ -34817,7 +31400,6 @@
 HSPLcom/android/okhttp/internal/http/RouteSelector;->hasNextProxy()Z
 HSPLcom/android/okhttp/internal/http/RouteSelector;->next()Lcom/android/okhttp/Route;
 HSPLcom/android/okhttp/internal/http/RouteSelector;->nextInetSocketAddress()Ljava/net/InetSocketAddress;
-HSPLcom/android/okhttp/internal/http/RouteSelector;->nextPostponed()Lcom/android/okhttp/Route;
 HSPLcom/android/okhttp/internal/http/RouteSelector;->nextProxy()Ljava/net/Proxy;
 HSPLcom/android/okhttp/internal/http/RouteSelector;->resetNextInetSocketAddress(Ljava/net/Proxy;)V
 HSPLcom/android/okhttp/internal/http/RouteSelector;->resetNextProxy(Lcom/android/okhttp/HttpUrl;Ljava/net/Proxy;)V
@@ -34834,8 +31416,6 @@
 HSPLcom/android/okhttp/internal/http/StreamAllocation;->deallocate(ZZZ)V
 HSPLcom/android/okhttp/internal/http/StreamAllocation;->findConnection(IIIZ)Lcom/android/okhttp/internal/io/RealConnection;
 HSPLcom/android/okhttp/internal/http/StreamAllocation;->findHealthyConnection(IIIZZ)Lcom/android/okhttp/internal/io/RealConnection;
-HSPLcom/android/okhttp/internal/http/StreamAllocation;->isRecoverable(Lcom/android/okhttp/internal/http/RouteException;)Z
-HSPLcom/android/okhttp/internal/http/StreamAllocation;->isRecoverable(Ljava/io/IOException;)Z
 HSPLcom/android/okhttp/internal/http/StreamAllocation;->newStream(IIIZZ)Lcom/android/okhttp/internal/http/HttpStream;
 HSPLcom/android/okhttp/internal/http/StreamAllocation;->noNewStreams()V
 HSPLcom/android/okhttp/internal/http/StreamAllocation;->recover(Lcom/android/okhttp/internal/http/RouteException;)Z
@@ -34844,7 +31424,6 @@
 HSPLcom/android/okhttp/internal/http/StreamAllocation;->release(Lcom/android/okhttp/internal/io/RealConnection;)V
 HSPLcom/android/okhttp/internal/http/StreamAllocation;->routeDatabase()Lcom/android/okhttp/internal/RouteDatabase;
 HSPLcom/android/okhttp/internal/http/StreamAllocation;->streamFinished(Lcom/android/okhttp/internal/http/HttpStream;)V
-HSPLcom/android/okhttp/internal/http/StreamAllocation;->toString()Ljava/lang/String;
 HSPLcom/android/okhttp/internal/huc/DelegatingHttpsURLConnection;-><init>(Ljava/net/HttpURLConnection;)V
 HSPLcom/android/okhttp/internal/huc/DelegatingHttpsURLConnection;->addRequestProperty(Ljava/lang/String;Ljava/lang/String;)V
 HSPLcom/android/okhttp/internal/huc/DelegatingHttpsURLConnection;->connect()V
@@ -34852,19 +31431,16 @@
 HSPLcom/android/okhttp/internal/huc/DelegatingHttpsURLConnection;->getContentEncoding()Ljava/lang/String;
 HSPLcom/android/okhttp/internal/huc/DelegatingHttpsURLConnection;->getContentLength()I
 HSPLcom/android/okhttp/internal/huc/DelegatingHttpsURLConnection;->getContentType()Ljava/lang/String;
-HSPLcom/android/okhttp/internal/huc/DelegatingHttpsURLConnection;->getErrorStream()Ljava/io/InputStream;
 HSPLcom/android/okhttp/internal/huc/DelegatingHttpsURLConnection;->getHeaderField(Ljava/lang/String;)Ljava/lang/String;
 HSPLcom/android/okhttp/internal/huc/DelegatingHttpsURLConnection;->getHeaderFields()Ljava/util/Map;
 HSPLcom/android/okhttp/internal/huc/DelegatingHttpsURLConnection;->getInputStream()Ljava/io/InputStream;
 HSPLcom/android/okhttp/internal/huc/DelegatingHttpsURLConnection;->getOutputStream()Ljava/io/OutputStream;
-HSPLcom/android/okhttp/internal/huc/DelegatingHttpsURLConnection;->getRequestProperties()Ljava/util/Map;
 HSPLcom/android/okhttp/internal/huc/DelegatingHttpsURLConnection;->getRequestProperty(Ljava/lang/String;)Ljava/lang/String;
 HSPLcom/android/okhttp/internal/huc/DelegatingHttpsURLConnection;->getResponseCode()I
 HSPLcom/android/okhttp/internal/huc/DelegatingHttpsURLConnection;->getResponseMessage()Ljava/lang/String;
 HSPLcom/android/okhttp/internal/huc/DelegatingHttpsURLConnection;->getURL()Ljava/net/URL;
 HSPLcom/android/okhttp/internal/huc/DelegatingHttpsURLConnection;->setChunkedStreamingMode(I)V
 HSPLcom/android/okhttp/internal/huc/DelegatingHttpsURLConnection;->setConnectTimeout(I)V
-HSPLcom/android/okhttp/internal/huc/DelegatingHttpsURLConnection;->setDefaultUseCaches(Z)V
 HSPLcom/android/okhttp/internal/huc/DelegatingHttpsURLConnection;->setDoInput(Z)V
 HSPLcom/android/okhttp/internal/huc/DelegatingHttpsURLConnection;->setDoOutput(Z)V
 HSPLcom/android/okhttp/internal/huc/DelegatingHttpsURLConnection;->setFixedLengthStreamingMode(I)V
@@ -34880,13 +31456,11 @@
 HSPLcom/android/okhttp/internal/huc/HttpURLConnectionImpl;->defaultUserAgent()Ljava/lang/String;
 HSPLcom/android/okhttp/internal/huc/HttpURLConnectionImpl;->disconnect()V
 HSPLcom/android/okhttp/internal/huc/HttpURLConnectionImpl;->execute(Z)Z
-HSPLcom/android/okhttp/internal/huc/HttpURLConnectionImpl;->getErrorStream()Ljava/io/InputStream;
 HSPLcom/android/okhttp/internal/huc/HttpURLConnectionImpl;->getHeaderField(Ljava/lang/String;)Ljava/lang/String;
 HSPLcom/android/okhttp/internal/huc/HttpURLConnectionImpl;->getHeaderFields()Ljava/util/Map;
 HSPLcom/android/okhttp/internal/huc/HttpURLConnectionImpl;->getHeaders()Lcom/android/okhttp/Headers;
 HSPLcom/android/okhttp/internal/huc/HttpURLConnectionImpl;->getInputStream()Ljava/io/InputStream;
 HSPLcom/android/okhttp/internal/huc/HttpURLConnectionImpl;->getOutputStream()Ljava/io/OutputStream;
-HSPLcom/android/okhttp/internal/huc/HttpURLConnectionImpl;->getRequestProperties()Ljava/util/Map;
 HSPLcom/android/okhttp/internal/huc/HttpURLConnectionImpl;->getRequestProperty(Ljava/lang/String;)Ljava/lang/String;
 HSPLcom/android/okhttp/internal/huc/HttpURLConnectionImpl;->getResponse()Lcom/android/okhttp/internal/http/HttpEngine;
 HSPLcom/android/okhttp/internal/huc/HttpURLConnectionImpl;->getResponseCode()I
@@ -34909,23 +31483,19 @@
 HSPLcom/android/okhttp/internal/huc/HttpsURLConnectionImpl;->getContentEncoding()Ljava/lang/String;
 HSPLcom/android/okhttp/internal/huc/HttpsURLConnectionImpl;->getContentLength()I
 HSPLcom/android/okhttp/internal/huc/HttpsURLConnectionImpl;->getContentType()Ljava/lang/String;
-HSPLcom/android/okhttp/internal/huc/HttpsURLConnectionImpl;->getErrorStream()Ljava/io/InputStream;
 HSPLcom/android/okhttp/internal/huc/HttpsURLConnectionImpl;->getHeaderField(Ljava/lang/String;)Ljava/lang/String;
 HSPLcom/android/okhttp/internal/huc/HttpsURLConnectionImpl;->getHeaderFields()Ljava/util/Map;
 HSPLcom/android/okhttp/internal/huc/HttpsURLConnectionImpl;->getInputStream()Ljava/io/InputStream;
 HSPLcom/android/okhttp/internal/huc/HttpsURLConnectionImpl;->getOutputStream()Ljava/io/OutputStream;
-HSPLcom/android/okhttp/internal/huc/HttpsURLConnectionImpl;->getRequestProperties()Ljava/util/Map;
 HSPLcom/android/okhttp/internal/huc/HttpsURLConnectionImpl;->getRequestProperty(Ljava/lang/String;)Ljava/lang/String;
 HSPLcom/android/okhttp/internal/huc/HttpsURLConnectionImpl;->getResponseCode()I
 HSPLcom/android/okhttp/internal/huc/HttpsURLConnectionImpl;->getResponseMessage()Ljava/lang/String;
 HSPLcom/android/okhttp/internal/huc/HttpsURLConnectionImpl;->getURL()Ljava/net/URL;
 HSPLcom/android/okhttp/internal/huc/HttpsURLConnectionImpl;->setChunkedStreamingMode(I)V
 HSPLcom/android/okhttp/internal/huc/HttpsURLConnectionImpl;->setConnectTimeout(I)V
-HSPLcom/android/okhttp/internal/huc/HttpsURLConnectionImpl;->setDefaultUseCaches(Z)V
 HSPLcom/android/okhttp/internal/huc/HttpsURLConnectionImpl;->setDoInput(Z)V
 HSPLcom/android/okhttp/internal/huc/HttpsURLConnectionImpl;->setDoOutput(Z)V
 HSPLcom/android/okhttp/internal/huc/HttpsURLConnectionImpl;->setFixedLengthStreamingMode(I)V
-HSPLcom/android/okhttp/internal/huc/HttpsURLConnectionImpl;->setHostnameVerifier(Ljavax/net/ssl/HostnameVerifier;)V
 HSPLcom/android/okhttp/internal/huc/HttpsURLConnectionImpl;->setInstanceFollowRedirects(Z)V
 HSPLcom/android/okhttp/internal/huc/HttpsURLConnectionImpl;->setReadTimeout(I)V
 HSPLcom/android/okhttp/internal/huc/HttpsURLConnectionImpl;->setRequestMethod(Ljava/lang/String;)V
@@ -34934,7 +31504,6 @@
 HSPLcom/android/okhttp/internal/huc/HttpsURLConnectionImpl;->setUseCaches(Z)V
 HSPLcom/android/okhttp/internal/io/RealConnection;-><init>(Lcom/android/okhttp/Route;)V
 HSPLcom/android/okhttp/internal/io/RealConnection;->allocationLimit()I
-HSPLcom/android/okhttp/internal/io/RealConnection;->cancel()V
 HSPLcom/android/okhttp/internal/io/RealConnection;->connect(IIILjava/util/List;Z)V
 HSPLcom/android/okhttp/internal/io/RealConnection;->connectSocket(IIILcom/android/okhttp/internal/ConnectionSpecSelector;)V
 HSPLcom/android/okhttp/internal/io/RealConnection;->connectTls(IILcom/android/okhttp/internal/ConnectionSpecSelector;)V
@@ -34948,15 +31517,6 @@
 HSPLcom/android/okhttp/internal/tls/OkHostnameVerifier;->verifyAsIpAddress(Ljava/lang/String;)Z
 HSPLcom/android/okhttp/internal/tls/OkHostnameVerifier;->verifyHostName(Ljava/lang/String;Ljava/lang/String;)Z
 HSPLcom/android/okhttp/internal/tls/OkHostnameVerifier;->verifyHostName(Ljava/lang/String;Ljava/security/cert/X509Certificate;)Z
-HSPLcom/android/okhttp/internalandroidapi/HttpURLConnectionFactory$DnsAdapter;-><init>(Lcom/android/okhttp/internalandroidapi/Dns;)V
-HSPLcom/android/okhttp/internalandroidapi/HttpURLConnectionFactory$DnsAdapter;->equals(Ljava/lang/Object;)Z
-HSPLcom/android/okhttp/internalandroidapi/HttpURLConnectionFactory$DnsAdapter;->hashCode()I
-HSPLcom/android/okhttp/internalandroidapi/HttpURLConnectionFactory$DnsAdapter;->lookup(Ljava/lang/String;)Ljava/util/List;
-HSPLcom/android/okhttp/internalandroidapi/HttpURLConnectionFactory;-><init>()V
-HSPLcom/android/okhttp/internalandroidapi/HttpURLConnectionFactory;->internalOpenConnection(Ljava/net/URL;Ljavax/net/SocketFactory;Ljava/net/Proxy;)Ljava/net/URLConnection;
-HSPLcom/android/okhttp/internalandroidapi/HttpURLConnectionFactory;->openConnection(Ljava/net/URL;Ljavax/net/SocketFactory;Ljava/net/Proxy;)Ljava/net/URLConnection;
-HSPLcom/android/okhttp/internalandroidapi/HttpURLConnectionFactory;->setDns(Lcom/android/okhttp/internalandroidapi/Dns;)V
-HSPLcom/android/okhttp/internalandroidapi/HttpURLConnectionFactory;->setNewConnectionPool(IJLjava/util/concurrent/TimeUnit;)V
 HSPLcom/android/okhttp/okio/AsyncTimeout$1;-><init>(Lcom/android/okhttp/okio/AsyncTimeout;Lcom/android/okhttp/okio/Sink;)V
 HSPLcom/android/okhttp/okio/AsyncTimeout$1;->flush()V
 HSPLcom/android/okhttp/okio/AsyncTimeout$1;->timeout()Lcom/android/okhttp/okio/Timeout;
@@ -34978,9 +31538,6 @@
 HSPLcom/android/okhttp/okio/AsyncTimeout;->scheduleTimeout(Lcom/android/okhttp/okio/AsyncTimeout;JZ)V
 HSPLcom/android/okhttp/okio/AsyncTimeout;->sink(Lcom/android/okhttp/okio/Sink;)Lcom/android/okhttp/okio/Sink;
 HSPLcom/android/okhttp/okio/AsyncTimeout;->source(Lcom/android/okhttp/okio/Source;)Lcom/android/okhttp/okio/Source;
-HSPLcom/android/okhttp/okio/Base64;-><clinit>()V
-HSPLcom/android/okhttp/okio/Base64;->encode([B)Ljava/lang/String;
-HSPLcom/android/okhttp/okio/Base64;->encode([B[B)Ljava/lang/String;
 HSPLcom/android/okhttp/okio/Buffer;-><init>()V
 HSPLcom/android/okhttp/okio/Buffer;->clear()V
 HSPLcom/android/okhttp/okio/Buffer;->completeSegmentByteCount()J
@@ -34993,7 +31550,6 @@
 HSPLcom/android/okhttp/okio/Buffer;->readByte()B
 HSPLcom/android/okhttp/okio/Buffer;->readByteArray()[B
 HSPLcom/android/okhttp/okio/Buffer;->readByteArray(J)[B
-HSPLcom/android/okhttp/okio/Buffer;->readByteString()Lcom/android/okhttp/okio/ByteString;
 HSPLcom/android/okhttp/okio/Buffer;->readFully([B)V
 HSPLcom/android/okhttp/okio/Buffer;->readHexadecimalUnsignedLong()J
 HSPLcom/android/okhttp/okio/Buffer;->readInt()I
@@ -35009,14 +31565,9 @@
 HSPLcom/android/okhttp/okio/Buffer;->write(Lcom/android/okhttp/okio/Buffer;J)V
 HSPLcom/android/okhttp/okio/Buffer;->write([BII)Lcom/android/okhttp/okio/Buffer;
 HSPLcom/android/okhttp/okio/Buffer;->writeByte(I)Lcom/android/okhttp/okio/Buffer;
-HSPLcom/android/okhttp/okio/Buffer;->writeHexadecimalUnsignedLong(J)Lcom/android/okhttp/okio/Buffer;
 HSPLcom/android/okhttp/okio/Buffer;->writeUtf8(Ljava/lang/String;)Lcom/android/okhttp/okio/Buffer;
 HSPLcom/android/okhttp/okio/Buffer;->writeUtf8(Ljava/lang/String;II)Lcom/android/okhttp/okio/Buffer;
 HSPLcom/android/okhttp/okio/Buffer;->writeUtf8CodePoint(I)Lcom/android/okhttp/okio/Buffer;
-HSPLcom/android/okhttp/okio/ByteString;-><init>([B)V
-HSPLcom/android/okhttp/okio/ByteString;->base64()Ljava/lang/String;
-HSPLcom/android/okhttp/okio/ByteString;->hex()Ljava/lang/String;
-HSPLcom/android/okhttp/okio/ByteString;->of([B)Lcom/android/okhttp/okio/ByteString;
 HSPLcom/android/okhttp/okio/ForwardingTimeout;-><init>(Lcom/android/okhttp/okio/Timeout;)V
 HSPLcom/android/okhttp/okio/ForwardingTimeout;->clearDeadline()Lcom/android/okhttp/okio/Timeout;
 HSPLcom/android/okhttp/okio/ForwardingTimeout;->deadlineNanoTime(J)Lcom/android/okhttp/okio/Timeout;
@@ -35041,8 +31592,6 @@
 HSPLcom/android/okhttp/okio/Okio$2;-><init>(Lcom/android/okhttp/okio/Timeout;Ljava/io/InputStream;)V
 HSPLcom/android/okhttp/okio/Okio$2;->read(Lcom/android/okhttp/okio/Buffer;J)J
 HSPLcom/android/okhttp/okio/Okio$3;-><init>(Ljava/net/Socket;)V
-HSPLcom/android/okhttp/okio/Okio$3;->newTimeoutException(Ljava/io/IOException;)Ljava/io/IOException;
-HSPLcom/android/okhttp/okio/Okio$3;->timedOut()V
 HSPLcom/android/okhttp/okio/Okio;->buffer(Lcom/android/okhttp/okio/Sink;)Lcom/android/okhttp/okio/BufferedSink;
 HSPLcom/android/okhttp/okio/Okio;->buffer(Lcom/android/okhttp/okio/Source;)Lcom/android/okhttp/okio/BufferedSource;
 HSPLcom/android/okhttp/okio/Okio;->sink(Ljava/io/OutputStream;Lcom/android/okhttp/okio/Timeout;)Lcom/android/okhttp/okio/Sink;
@@ -35059,13 +31608,11 @@
 HSPLcom/android/okhttp/okio/RealBufferedSink;->access$000(Lcom/android/okhttp/okio/RealBufferedSink;)Z
 HSPLcom/android/okhttp/okio/RealBufferedSink;->buffer()Lcom/android/okhttp/okio/Buffer;
 HSPLcom/android/okhttp/okio/RealBufferedSink;->close()V
-HSPLcom/android/okhttp/okio/RealBufferedSink;->emit()Lcom/android/okhttp/okio/BufferedSink;
 HSPLcom/android/okhttp/okio/RealBufferedSink;->emitCompleteSegments()Lcom/android/okhttp/okio/BufferedSink;
 HSPLcom/android/okhttp/okio/RealBufferedSink;->flush()V
 HSPLcom/android/okhttp/okio/RealBufferedSink;->outputStream()Ljava/io/OutputStream;
 HSPLcom/android/okhttp/okio/RealBufferedSink;->timeout()Lcom/android/okhttp/okio/Timeout;
 HSPLcom/android/okhttp/okio/RealBufferedSink;->write(Lcom/android/okhttp/okio/Buffer;J)V
-HSPLcom/android/okhttp/okio/RealBufferedSink;->writeHexadecimalUnsignedLong(J)Lcom/android/okhttp/okio/BufferedSink;
 HSPLcom/android/okhttp/okio/RealBufferedSink;->writeUtf8(Ljava/lang/String;)Lcom/android/okhttp/okio/BufferedSink;
 HSPLcom/android/okhttp/okio/RealBufferedSource$1;-><init>(Lcom/android/okhttp/okio/RealBufferedSource;)V
 HSPLcom/android/okhttp/okio/RealBufferedSource$1;->available()I
@@ -35110,7 +31657,6 @@
 HSPLcom/android/okhttp/okio/Timeout;->timeout(JLjava/util/concurrent/TimeUnit;)Lcom/android/okhttp/okio/Timeout;
 HSPLcom/android/okhttp/okio/Timeout;->timeoutNanos()J
 HSPLcom/android/okhttp/okio/Util;->checkOffsetAndCount(JJJ)V
-HSPLcom/android/okhttp/okio/Util;->reverseBytesInt(I)I
 HSPLcom/android/org/bouncycastle/asn1/ASN1BitString;-><init>([BI)V
 HSPLcom/android/org/bouncycastle/asn1/ASN1BitString;->derForm([BI)[B
 HSPLcom/android/org/bouncycastle/asn1/ASN1BitString;->fromInputStream(ILjava/io/InputStream;)Lcom/android/org/bouncycastle/asn1/ASN1BitString;
@@ -35134,12 +31680,10 @@
 HSPLcom/android/org/bouncycastle/asn1/ASN1InputStream;->readLength(Ljava/io/InputStream;I)I
 HSPLcom/android/org/bouncycastle/asn1/ASN1InputStream;->readObject()Lcom/android/org/bouncycastle/asn1/ASN1Primitive;
 HSPLcom/android/org/bouncycastle/asn1/ASN1InputStream;->readTagNumber(Ljava/io/InputStream;I)I
-HSPLcom/android/org/bouncycastle/asn1/ASN1Integer;-><init>(J)V
 HSPLcom/android/org/bouncycastle/asn1/ASN1Integer;-><init>(Ljava/math/BigInteger;)V
 HSPLcom/android/org/bouncycastle/asn1/ASN1Integer;-><init>([BZ)V
 HSPLcom/android/org/bouncycastle/asn1/ASN1Integer;->encode(Lcom/android/org/bouncycastle/asn1/ASN1OutputStream;)V
 HSPLcom/android/org/bouncycastle/asn1/ASN1Integer;->encodedLength()I
-HSPLcom/android/org/bouncycastle/asn1/ASN1Integer;->getInstance(Lcom/android/org/bouncycastle/asn1/ASN1TaggedObject;Z)Lcom/android/org/bouncycastle/asn1/ASN1Integer;
 HSPLcom/android/org/bouncycastle/asn1/ASN1Integer;->getInstance(Ljava/lang/Object;)Lcom/android/org/bouncycastle/asn1/ASN1Integer;
 HSPLcom/android/org/bouncycastle/asn1/ASN1Integer;->getPositiveValue()Ljava/math/BigInteger;
 HSPLcom/android/org/bouncycastle/asn1/ASN1Integer;->getValue()Ljava/math/BigInteger;
@@ -35148,9 +31692,7 @@
 HSPLcom/android/org/bouncycastle/asn1/ASN1Object;-><init>()V
 HSPLcom/android/org/bouncycastle/asn1/ASN1Object;->getEncoded(Ljava/lang/String;)[B
 HSPLcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier$OidHandle;-><init>([B)V
-HSPLcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier$OidHandle;->equals(Ljava/lang/Object;)Z
 HSPLcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier$OidHandle;->hashCode()I
-HSPLcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier;-><init>(Ljava/lang/String;)V
 HSPLcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier;-><init>([B)V
 HSPLcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier;->asn1Equals(Lcom/android/org/bouncycastle/asn1/ASN1Primitive;)Z
 HSPLcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier;->doOutput(Ljava/io/ByteArrayOutputStream;)V
@@ -35160,10 +31702,6 @@
 HSPLcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier;->getBody()[B
 HSPLcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier;->getId()Ljava/lang/String;
 HSPLcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier;->getInstance(Ljava/lang/Object;)Lcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier;
-HSPLcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier;->hashCode()I
-HSPLcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier;->intern()Lcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier;
-HSPLcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier;->isValidBranchID(Ljava/lang/String;I)Z
-HSPLcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier;->isValidIdentifier(Ljava/lang/String;)Z
 HSPLcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier;->toString()Ljava/lang/String;
 HSPLcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier;->writeField(Ljava/io/ByteArrayOutputStream;J)V
 HSPLcom/android/org/bouncycastle/asn1/ASN1OutputStream;-><init>(Ljava/io/OutputStream;)V
@@ -35171,7 +31709,6 @@
 HSPLcom/android/org/bouncycastle/asn1/ASN1OutputStream;->write([B)V
 HSPLcom/android/org/bouncycastle/asn1/ASN1OutputStream;->writeEncoded(I[B)V
 HSPLcom/android/org/bouncycastle/asn1/ASN1OutputStream;->writeLength(I)V
-HSPLcom/android/org/bouncycastle/asn1/ASN1OutputStream;->writeTag(II)V
 HSPLcom/android/org/bouncycastle/asn1/ASN1Primitive;-><init>()V
 HSPLcom/android/org/bouncycastle/asn1/ASN1Primitive;->equals(Ljava/lang/Object;)Z
 HSPLcom/android/org/bouncycastle/asn1/ASN1Primitive;->fromByteArray([B)Lcom/android/org/bouncycastle/asn1/ASN1Primitive;
@@ -35179,59 +31716,26 @@
 HSPLcom/android/org/bouncycastle/asn1/ASN1Primitive;->toDERObject()Lcom/android/org/bouncycastle/asn1/ASN1Primitive;
 HSPLcom/android/org/bouncycastle/asn1/ASN1Sequence;-><init>()V
 HSPLcom/android/org/bouncycastle/asn1/ASN1Sequence;-><init>(Lcom/android/org/bouncycastle/asn1/ASN1EncodableVector;)V
-HSPLcom/android/org/bouncycastle/asn1/ASN1Sequence;-><init>([Lcom/android/org/bouncycastle/asn1/ASN1Encodable;)V
 HSPLcom/android/org/bouncycastle/asn1/ASN1Sequence;->getInstance(Ljava/lang/Object;)Lcom/android/org/bouncycastle/asn1/ASN1Sequence;
 HSPLcom/android/org/bouncycastle/asn1/ASN1Sequence;->getObjectAt(I)Lcom/android/org/bouncycastle/asn1/ASN1Encodable;
 HSPLcom/android/org/bouncycastle/asn1/ASN1Sequence;->getObjects()Ljava/util/Enumeration;
 HSPLcom/android/org/bouncycastle/asn1/ASN1Sequence;->size()I
 HSPLcom/android/org/bouncycastle/asn1/ASN1Sequence;->toDERObject()Lcom/android/org/bouncycastle/asn1/ASN1Primitive;
-HSPLcom/android/org/bouncycastle/asn1/ASN1Set;-><init>()V
-HSPLcom/android/org/bouncycastle/asn1/ASN1Set;-><init>(Lcom/android/org/bouncycastle/asn1/ASN1EncodableVector;Z)V
-HSPLcom/android/org/bouncycastle/asn1/ASN1Set;->getInstance(Ljava/lang/Object;)Lcom/android/org/bouncycastle/asn1/ASN1Set;
-HSPLcom/android/org/bouncycastle/asn1/ASN1Set;->getObjectAt(I)Lcom/android/org/bouncycastle/asn1/ASN1Encodable;
-HSPLcom/android/org/bouncycastle/asn1/ASN1Set;->getObjects()Ljava/util/Enumeration;
-HSPLcom/android/org/bouncycastle/asn1/ASN1Set;->size()I
-HSPLcom/android/org/bouncycastle/asn1/ASN1Set;->sort()V
-HSPLcom/android/org/bouncycastle/asn1/ASN1Set;->toDERObject()Lcom/android/org/bouncycastle/asn1/ASN1Primitive;
-HSPLcom/android/org/bouncycastle/asn1/ASN1StreamParser;-><init>(Ljava/io/InputStream;)V
-HSPLcom/android/org/bouncycastle/asn1/ASN1StreamParser;-><init>(Ljava/io/InputStream;I)V
-HSPLcom/android/org/bouncycastle/asn1/ASN1StreamParser;->readObject()Lcom/android/org/bouncycastle/asn1/ASN1Encodable;
-HSPLcom/android/org/bouncycastle/asn1/ASN1StreamParser;->readTaggedObject(ZI)Lcom/android/org/bouncycastle/asn1/ASN1Primitive;
-HSPLcom/android/org/bouncycastle/asn1/ASN1StreamParser;->readVector()Lcom/android/org/bouncycastle/asn1/ASN1EncodableVector;
-HSPLcom/android/org/bouncycastle/asn1/ASN1StreamParser;->set00Check(Z)V
-HSPLcom/android/org/bouncycastle/asn1/ASN1TaggedObject;-><init>(ZILcom/android/org/bouncycastle/asn1/ASN1Encodable;)V
-HSPLcom/android/org/bouncycastle/asn1/ASN1TaggedObject;->getObject()Lcom/android/org/bouncycastle/asn1/ASN1Primitive;
 HSPLcom/android/org/bouncycastle/asn1/DERBitString;-><init>(Lcom/android/org/bouncycastle/asn1/ASN1Encodable;)V
-HSPLcom/android/org/bouncycastle/asn1/DERBitString;-><init>([B)V
 HSPLcom/android/org/bouncycastle/asn1/DERBitString;-><init>([BI)V
 HSPLcom/android/org/bouncycastle/asn1/DERBitString;->encode(Lcom/android/org/bouncycastle/asn1/ASN1OutputStream;)V
 HSPLcom/android/org/bouncycastle/asn1/DERBitString;->encodedLength()I
 HSPLcom/android/org/bouncycastle/asn1/DERBitString;->getInstance(Ljava/lang/Object;)Lcom/android/org/bouncycastle/asn1/DERBitString;
 HSPLcom/android/org/bouncycastle/asn1/DERFactory;->createSequence(Lcom/android/org/bouncycastle/asn1/ASN1EncodableVector;)Lcom/android/org/bouncycastle/asn1/ASN1Sequence;
-HSPLcom/android/org/bouncycastle/asn1/DERFactory;->createSet(Lcom/android/org/bouncycastle/asn1/ASN1EncodableVector;)Lcom/android/org/bouncycastle/asn1/ASN1Set;
-HSPLcom/android/org/bouncycastle/asn1/DERNull;->encode(Lcom/android/org/bouncycastle/asn1/ASN1OutputStream;)V
-HSPLcom/android/org/bouncycastle/asn1/DERNull;->encodedLength()I
 HSPLcom/android/org/bouncycastle/asn1/DEROutputStream;-><init>(Ljava/io/OutputStream;)V
 HSPLcom/android/org/bouncycastle/asn1/DEROutputStream;->getDERSubStream()Lcom/android/org/bouncycastle/asn1/ASN1OutputStream;
 HSPLcom/android/org/bouncycastle/asn1/DEROutputStream;->writeObject(Lcom/android/org/bouncycastle/asn1/ASN1Encodable;)V
-HSPLcom/android/org/bouncycastle/asn1/DERPrintableString;-><init>([B)V
-HSPLcom/android/org/bouncycastle/asn1/DERPrintableString;->encode(Lcom/android/org/bouncycastle/asn1/ASN1OutputStream;)V
-HSPLcom/android/org/bouncycastle/asn1/DERPrintableString;->encodedLength()I
 HSPLcom/android/org/bouncycastle/asn1/DERSequence;-><init>()V
 HSPLcom/android/org/bouncycastle/asn1/DERSequence;-><init>(Lcom/android/org/bouncycastle/asn1/ASN1EncodableVector;)V
-HSPLcom/android/org/bouncycastle/asn1/DERSequence;-><init>([Lcom/android/org/bouncycastle/asn1/ASN1Encodable;)V
 HSPLcom/android/org/bouncycastle/asn1/DERSequence;->encode(Lcom/android/org/bouncycastle/asn1/ASN1OutputStream;)V
 HSPLcom/android/org/bouncycastle/asn1/DERSequence;->encodedLength()I
 HSPLcom/android/org/bouncycastle/asn1/DERSequence;->getBodyLength()I
-HSPLcom/android/org/bouncycastle/asn1/DERSet;-><init>()V
-HSPLcom/android/org/bouncycastle/asn1/DERSet;->encode(Lcom/android/org/bouncycastle/asn1/ASN1OutputStream;)V
-HSPLcom/android/org/bouncycastle/asn1/DERSet;->encodedLength()I
-HSPLcom/android/org/bouncycastle/asn1/DERSet;->getBodyLength()I
-HSPLcom/android/org/bouncycastle/asn1/DERTaggedObject;-><clinit>()V
-HSPLcom/android/org/bouncycastle/asn1/DERTaggedObject;-><init>(ZILcom/android/org/bouncycastle/asn1/ASN1Encodable;)V
 HSPLcom/android/org/bouncycastle/asn1/DLSequence;-><init>(Lcom/android/org/bouncycastle/asn1/ASN1EncodableVector;)V
-HSPLcom/android/org/bouncycastle/asn1/DLSet;-><init>(Lcom/android/org/bouncycastle/asn1/ASN1EncodableVector;)V
-HSPLcom/android/org/bouncycastle/asn1/DateUtil;-><clinit>()V
 HSPLcom/android/org/bouncycastle/asn1/DefiniteLengthInputStream;-><init>(Ljava/io/InputStream;I)V
 HSPLcom/android/org/bouncycastle/asn1/DefiniteLengthInputStream;->getRemaining()I
 HSPLcom/android/org/bouncycastle/asn1/DefiniteLengthInputStream;->read()I
@@ -35243,21 +31747,7 @@
 HSPLcom/android/org/bouncycastle/asn1/OIDTokenizer;->hasMoreTokens()Z
 HSPLcom/android/org/bouncycastle/asn1/OIDTokenizer;->nextToken()Ljava/lang/String;
 HSPLcom/android/org/bouncycastle/asn1/StreamUtil;->calculateBodyLength(I)I
-HSPLcom/android/org/bouncycastle/asn1/StreamUtil;->calculateTagLength(I)I
 HSPLcom/android/org/bouncycastle/asn1/StreamUtil;->findLimit(Ljava/io/InputStream;)I
-HSPLcom/android/org/bouncycastle/asn1/pkcs/RSASSAPSSparams;-><clinit>()V
-HSPLcom/android/org/bouncycastle/asn1/x500/RDN;-><init>(Lcom/android/org/bouncycastle/asn1/ASN1Set;)V
-HSPLcom/android/org/bouncycastle/asn1/x500/RDN;->getInstance(Ljava/lang/Object;)Lcom/android/org/bouncycastle/asn1/x500/RDN;
-HSPLcom/android/org/bouncycastle/asn1/x500/RDN;->toASN1Primitive()Lcom/android/org/bouncycastle/asn1/ASN1Primitive;
-HSPLcom/android/org/bouncycastle/asn1/x500/X500Name;-><clinit>()V
-HSPLcom/android/org/bouncycastle/asn1/x500/X500Name;-><init>(Lcom/android/org/bouncycastle/asn1/ASN1Sequence;)V
-HSPLcom/android/org/bouncycastle/asn1/x500/X500Name;-><init>(Lcom/android/org/bouncycastle/asn1/x500/X500NameStyle;Lcom/android/org/bouncycastle/asn1/ASN1Sequence;)V
-HSPLcom/android/org/bouncycastle/asn1/x500/X500Name;->getInstance(Ljava/lang/Object;)Lcom/android/org/bouncycastle/asn1/x500/X500Name;
-HSPLcom/android/org/bouncycastle/asn1/x500/X500Name;->toASN1Primitive()Lcom/android/org/bouncycastle/asn1/ASN1Primitive;
-HSPLcom/android/org/bouncycastle/asn1/x500/style/AbstractX500NameStyle;-><init>()V
-HSPLcom/android/org/bouncycastle/asn1/x500/style/AbstractX500NameStyle;->copyHashTable(Ljava/util/Hashtable;)Ljava/util/Hashtable;
-HSPLcom/android/org/bouncycastle/asn1/x500/style/BCStyle;-><clinit>()V
-HSPLcom/android/org/bouncycastle/asn1/x500/style/BCStyle;-><init>()V
 HSPLcom/android/org/bouncycastle/asn1/x509/AlgorithmIdentifier;-><init>(Lcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier;Lcom/android/org/bouncycastle/asn1/ASN1Encodable;)V
 HSPLcom/android/org/bouncycastle/asn1/x509/AlgorithmIdentifier;-><init>(Lcom/android/org/bouncycastle/asn1/ASN1Sequence;)V
 HSPLcom/android/org/bouncycastle/asn1/x509/AlgorithmIdentifier;->getAlgorithm()Lcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier;
@@ -35277,17 +31767,8 @@
 HSPLcom/android/org/bouncycastle/asn1/x509/SubjectPublicKeyInfo;->getInstance(Ljava/lang/Object;)Lcom/android/org/bouncycastle/asn1/x509/SubjectPublicKeyInfo;
 HSPLcom/android/org/bouncycastle/asn1/x509/SubjectPublicKeyInfo;->parsePublicKey()Lcom/android/org/bouncycastle/asn1/ASN1Primitive;
 HSPLcom/android/org/bouncycastle/asn1/x509/SubjectPublicKeyInfo;->toASN1Primitive()Lcom/android/org/bouncycastle/asn1/ASN1Primitive;
-HSPLcom/android/org/bouncycastle/asn1/x509/TBSCertificate;-><init>(Lcom/android/org/bouncycastle/asn1/ASN1Sequence;)V
-HSPLcom/android/org/bouncycastle/asn1/x509/TBSCertificate;->getInstance(Ljava/lang/Object;)Lcom/android/org/bouncycastle/asn1/x509/TBSCertificate;
-HSPLcom/android/org/bouncycastle/asn1/x509/Time;->getInstance(Ljava/lang/Object;)Lcom/android/org/bouncycastle/asn1/x509/Time;
-HSPLcom/android/org/bouncycastle/asn1/x509/X509Name;-><clinit>()V
 HSPLcom/android/org/bouncycastle/crypto/BufferedBlockCipher;-><init>()V
-HSPLcom/android/org/bouncycastle/crypto/BufferedBlockCipher;->getBlockSize()I
-HSPLcom/android/org/bouncycastle/crypto/BufferedBlockCipher;->getUnderlyingCipher()Lcom/android/org/bouncycastle/crypto/BlockCipher;
-HSPLcom/android/org/bouncycastle/crypto/BufferedBlockCipher;->reset()V
 HSPLcom/android/org/bouncycastle/crypto/CryptoServicesRegistrar;->getSecureRandom()Ljava/security/SecureRandom;
-HSPLcom/android/org/bouncycastle/crypto/PBEParametersGenerator;-><init>()V
-HSPLcom/android/org/bouncycastle/crypto/PBEParametersGenerator;->PKCS5PasswordToUTF8Bytes([C)[B
 HSPLcom/android/org/bouncycastle/crypto/PBEParametersGenerator;->init([B[BI)V
 HSPLcom/android/org/bouncycastle/crypto/digests/AndroidDigestFactory;->getSHA1()Lcom/android/org/bouncycastle/crypto/Digest;
 HSPLcom/android/org/bouncycastle/crypto/digests/AndroidDigestFactoryOpenSSL;->getSHA1()Lcom/android/org/bouncycastle/crypto/Digest;
@@ -35295,43 +31776,11 @@
 HSPLcom/android/org/bouncycastle/crypto/digests/OpenSSLDigest$SHA1;-><init>()V
 HSPLcom/android/org/bouncycastle/crypto/digests/OpenSSLDigest;-><init>(Ljava/lang/String;I)V
 HSPLcom/android/org/bouncycastle/crypto/digests/OpenSSLDigest;->doFinal([BI)I
-HSPLcom/android/org/bouncycastle/crypto/digests/OpenSSLDigest;->getByteLength()I
 HSPLcom/android/org/bouncycastle/crypto/digests/OpenSSLDigest;->getDigestSize()I
 HSPLcom/android/org/bouncycastle/crypto/digests/OpenSSLDigest;->reset()V
 HSPLcom/android/org/bouncycastle/crypto/digests/OpenSSLDigest;->update([BII)V
 HSPLcom/android/org/bouncycastle/crypto/engines/AESEngine;-><init>()V
-HSPLcom/android/org/bouncycastle/crypto/engines/AESEngine;->getAlgorithmName()Ljava/lang/String;
 HSPLcom/android/org/bouncycastle/crypto/engines/AESEngine;->getBlockSize()I
-HSPLcom/android/org/bouncycastle/crypto/engines/DESEngine;-><clinit>()V
-HSPLcom/android/org/bouncycastle/crypto/engines/DESEngine;-><init>()V
-HSPLcom/android/org/bouncycastle/crypto/engines/DESEngine;->desFunc([I[BI[BI)V
-HSPLcom/android/org/bouncycastle/crypto/engines/DESEngine;->generateWorkingKey(Z[B)[I
-HSPLcom/android/org/bouncycastle/crypto/engines/DESedeEngine;-><init>()V
-HSPLcom/android/org/bouncycastle/crypto/engines/DESedeEngine;->getAlgorithmName()Ljava/lang/String;
-HSPLcom/android/org/bouncycastle/crypto/engines/DESedeEngine;->getBlockSize()I
-HSPLcom/android/org/bouncycastle/crypto/engines/DESedeEngine;->init(ZLcom/android/org/bouncycastle/crypto/CipherParameters;)V
-HSPLcom/android/org/bouncycastle/crypto/engines/DESedeEngine;->processBlock([BI[BI)I
-HSPLcom/android/org/bouncycastle/crypto/engines/DESedeEngine;->reset()V
-HSPLcom/android/org/bouncycastle/crypto/generators/PKCS5S2ParametersGenerator;-><init>(Lcom/android/org/bouncycastle/crypto/Digest;)V
-HSPLcom/android/org/bouncycastle/crypto/generators/PKCS5S2ParametersGenerator;->F([BI[B[BI)V
-HSPLcom/android/org/bouncycastle/crypto/generators/PKCS5S2ParametersGenerator;->generateDerivedKey(I)[B
-HSPLcom/android/org/bouncycastle/crypto/generators/PKCS5S2ParametersGenerator;->generateDerivedMacParameters(I)Lcom/android/org/bouncycastle/crypto/CipherParameters;
-HSPLcom/android/org/bouncycastle/crypto/generators/PKCS5S2ParametersGenerator;->generateDerivedParameters(I)Lcom/android/org/bouncycastle/crypto/CipherParameters;
-HSPLcom/android/org/bouncycastle/crypto/macs/HMac;-><clinit>()V
-HSPLcom/android/org/bouncycastle/crypto/macs/HMac;-><init>(Lcom/android/org/bouncycastle/crypto/Digest;)V
-HSPLcom/android/org/bouncycastle/crypto/macs/HMac;-><init>(Lcom/android/org/bouncycastle/crypto/Digest;I)V
-HSPLcom/android/org/bouncycastle/crypto/macs/HMac;->doFinal([BI)I
-HSPLcom/android/org/bouncycastle/crypto/macs/HMac;->getByteLength(Lcom/android/org/bouncycastle/crypto/Digest;)I
-HSPLcom/android/org/bouncycastle/crypto/macs/HMac;->getMacSize()I
-HSPLcom/android/org/bouncycastle/crypto/macs/HMac;->init(Lcom/android/org/bouncycastle/crypto/CipherParameters;)V
-HSPLcom/android/org/bouncycastle/crypto/macs/HMac;->update([BII)V
-HSPLcom/android/org/bouncycastle/crypto/macs/HMac;->xorPad([BIB)V
-HSPLcom/android/org/bouncycastle/crypto/modes/CBCBlockCipher;-><init>(Lcom/android/org/bouncycastle/crypto/BlockCipher;)V
-HSPLcom/android/org/bouncycastle/crypto/modes/CBCBlockCipher;->getAlgorithmName()Ljava/lang/String;
-HSPLcom/android/org/bouncycastle/crypto/modes/CBCBlockCipher;->getBlockSize()I
-HSPLcom/android/org/bouncycastle/crypto/modes/CBCBlockCipher;->init(ZLcom/android/org/bouncycastle/crypto/CipherParameters;)V
-HSPLcom/android/org/bouncycastle/crypto/modes/CBCBlockCipher;->processBlock([BI[BI)I
-HSPLcom/android/org/bouncycastle/crypto/modes/CBCBlockCipher;->reset()V
 HSPLcom/android/org/bouncycastle/crypto/paddings/PKCS7Padding;-><init>()V
 HSPLcom/android/org/bouncycastle/crypto/paddings/PaddedBufferedBlockCipher;-><init>(Lcom/android/org/bouncycastle/crypto/BlockCipher;)V
 HSPLcom/android/org/bouncycastle/crypto/paddings/PaddedBufferedBlockCipher;-><init>(Lcom/android/org/bouncycastle/crypto/BlockCipher;Lcom/android/org/bouncycastle/crypto/paddings/BlockCipherPadding;)V
@@ -35345,9 +31794,6 @@
 HSPLcom/android/org/bouncycastle/crypto/params/KeyParameter;-><init>([B)V
 HSPLcom/android/org/bouncycastle/crypto/params/KeyParameter;-><init>([BII)V
 HSPLcom/android/org/bouncycastle/crypto/params/KeyParameter;->getKey()[B
-HSPLcom/android/org/bouncycastle/crypto/params/ParametersWithIV;-><init>(Lcom/android/org/bouncycastle/crypto/CipherParameters;[BII)V
-HSPLcom/android/org/bouncycastle/crypto/params/ParametersWithIV;->getIV()[B
-HSPLcom/android/org/bouncycastle/crypto/params/ParametersWithIV;->getParameters()Lcom/android/org/bouncycastle/crypto/CipherParameters;
 HSPLcom/android/org/bouncycastle/jcajce/provider/asymmetric/dsa/BCDSAPublicKey;-><init>(Lcom/android/org/bouncycastle/asn1/x509/SubjectPublicKeyInfo;)V
 HSPLcom/android/org/bouncycastle/jcajce/provider/asymmetric/dsa/BCDSAPublicKey;->equals(Ljava/lang/Object;)Z
 HSPLcom/android/org/bouncycastle/jcajce/provider/asymmetric/dsa/BCDSAPublicKey;->getEncoded()[B
@@ -35372,9 +31818,6 @@
 HSPLcom/android/org/bouncycastle/jcajce/provider/asymmetric/util/BaseKeyFactorySpi;->engineGeneratePublic(Ljava/security/spec/KeySpec;)Ljava/security/PublicKey;
 HSPLcom/android/org/bouncycastle/jcajce/provider/asymmetric/util/KeyUtil;->getEncodedSubjectPublicKeyInfo(Lcom/android/org/bouncycastle/asn1/x509/AlgorithmIdentifier;Lcom/android/org/bouncycastle/asn1/ASN1Encodable;)[B
 HSPLcom/android/org/bouncycastle/jcajce/provider/asymmetric/util/KeyUtil;->getEncodedSubjectPublicKeyInfo(Lcom/android/org/bouncycastle/asn1/x509/SubjectPublicKeyInfo;)[B
-HSPLcom/android/org/bouncycastle/jcajce/provider/asymmetric/util/PKCS12BagAttributeCarrierImpl;-><init>()V
-HSPLcom/android/org/bouncycastle/jcajce/provider/asymmetric/util/PKCS12BagAttributeCarrierImpl;-><init>(Ljava/util/Hashtable;Ljava/util/Vector;)V
-HSPLcom/android/org/bouncycastle/jcajce/provider/asymmetric/x509/CertificateFactory;-><clinit>()V
 HSPLcom/android/org/bouncycastle/jcajce/provider/keystore/bc/BcKeyStoreSpi$Std;-><init>()V
 HSPLcom/android/org/bouncycastle/jcajce/provider/keystore/bc/BcKeyStoreSpi$StoreEntry;-><init>(Lcom/android/org/bouncycastle/jcajce/provider/keystore/bc/BcKeyStoreSpi;Ljava/lang/String;Ljava/security/cert/Certificate;)V
 HSPLcom/android/org/bouncycastle/jcajce/provider/keystore/bc/BcKeyStoreSpi$StoreEntry;->getObject()Ljava/lang/Object;
@@ -35384,61 +31827,29 @@
 HSPLcom/android/org/bouncycastle/jcajce/provider/keystore/bc/BcKeyStoreSpi;->engineGetCertificate(Ljava/lang/String;)Ljava/security/cert/Certificate;
 HSPLcom/android/org/bouncycastle/jcajce/provider/keystore/bc/BcKeyStoreSpi;->engineLoad(Ljava/io/InputStream;[C)V
 HSPLcom/android/org/bouncycastle/jcajce/provider/keystore/bc/BcKeyStoreSpi;->engineSetCertificateEntry(Ljava/lang/String;Ljava/security/cert/Certificate;)V
-HSPLcom/android/org/bouncycastle/jcajce/provider/keystore/bc/BcKeyStoreSpi;->engineSize()I
 HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/AES$ECB$1;-><init>()V
 HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/AES$ECB$1;->get()Lcom/android/org/bouncycastle/crypto/BlockCipher;
 HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/AES$ECB;-><init>()V
-HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/PBEPBKDF2$BasePBKDF2;-><init>(Ljava/lang/String;II)V
-HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/PBEPBKDF2$BasePBKDF2;-><init>(Ljava/lang/String;IIII)V
-HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/PBEPBKDF2$BasePBKDF2;-><init>(Ljava/lang/String;IILcom/android/org/bouncycastle/jcajce/provider/symmetric/PBEPBKDF2$1;)V
-HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/PBEPBKDF2$BasePBKDF2;->engineGenerateSecret(Ljava/security/spec/KeySpec;)Ljavax/crypto/SecretKey;
-HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/PBEPBKDF2$BasePBKDF2WithHmacSHA1;-><init>(Ljava/lang/String;I)V
-HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/PBEPBKDF2$PBKDF2WithHmacSHA1UTF8;-><init>()V
-HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/util/BCPBEKey;-><init>(Ljava/lang/String;Lcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier;IIIILjavax/crypto/spec/PBEKeySpec;Lcom/android/org/bouncycastle/crypto/CipherParameters;)V
-HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/util/BCPBEKey;->getEncoded()[B
 HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/util/BaseBlockCipher$BufferedGenericBlockCipher;-><init>(Lcom/android/org/bouncycastle/crypto/BlockCipher;)V
-HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/util/BaseBlockCipher$BufferedGenericBlockCipher;->doFinal([BI)I
-HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/util/BaseBlockCipher$BufferedGenericBlockCipher;->getOutputSize(I)I
-HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/util/BaseBlockCipher$BufferedGenericBlockCipher;->getUnderlyingCipher()Lcom/android/org/bouncycastle/crypto/BlockCipher;
-HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/util/BaseBlockCipher$BufferedGenericBlockCipher;->init(ZLcom/android/org/bouncycastle/crypto/CipherParameters;)V
-HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/util/BaseBlockCipher$BufferedGenericBlockCipher;->processBytes([BII[BI)I
 HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/util/BaseBlockCipher;-><init>(Lcom/android/org/bouncycastle/jcajce/provider/symmetric/util/BlockCipherProvider;)V
-HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/util/BaseBlockCipher;->engineDoFinal([BII)[B
-HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/util/BaseBlockCipher;->engineGetOutputSize(I)I
-HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/util/BaseBlockCipher;->engineInit(ILjava/security/Key;Ljava/security/SecureRandom;)V
 HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/util/BaseBlockCipher;->engineInit(ILjava/security/Key;Ljava/security/spec/AlgorithmParameterSpec;Ljava/security/SecureRandom;)V
-HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/util/BaseSecretKeyFactory;-><init>(Ljava/lang/String;Lcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier;)V
+HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/util/BaseBlockCipher;->engineSetMode(Ljava/lang/String;)V
+HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/util/BaseBlockCipher;->engineSetPadding(Ljava/lang/String;)V
 HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/util/BaseWrapCipher;-><init>()V
-HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/util/PBE$Util;->convertPassword(ILjavax/crypto/spec/PBEKeySpec;)[B
-HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/util/PBE$Util;->makePBEGenerator(II)Lcom/android/org/bouncycastle/crypto/PBEParametersGenerator;
-HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/util/PBE$Util;->makePBEMacParameters(Ljavax/crypto/spec/PBEKeySpec;III)Lcom/android/org/bouncycastle/crypto/CipherParameters;
-HSPLcom/android/org/bouncycastle/jcajce/util/BCJcaJceHelper;-><init>()V
-HSPLcom/android/org/bouncycastle/jcajce/util/BCJcaJceHelper;->getBouncyCastleProvider()Ljava/security/Provider;
 HSPLcom/android/org/bouncycastle/jcajce/util/DefaultJcaJceHelper;-><init>()V
-HSPLcom/android/org/bouncycastle/jcajce/util/ProviderJcaJceHelper;-><init>(Ljava/security/Provider;)V
 HSPLcom/android/org/bouncycastle/jce/provider/CertStoreCollectionSpi;-><init>(Ljava/security/cert/CertStoreParameters;)V
 HPLcom/android/org/bouncycastle/jce/provider/CertStoreCollectionSpi;->engineGetCertificates(Ljava/security/cert/CertSelector;)Ljava/util/Collection;
 HSPLcom/android/org/bouncycastle/util/Arrays;->areEqual([B[B)Z
 HSPLcom/android/org/bouncycastle/util/Arrays;->clone([B)[B
-HSPLcom/android/org/bouncycastle/util/Arrays;->copyOfRange([BII)[B
-HSPLcom/android/org/bouncycastle/util/Arrays;->fill([BB)V
-HSPLcom/android/org/bouncycastle/util/Arrays;->getLength(II)I
 HSPLcom/android/org/bouncycastle/util/Arrays;->hashCode([B)I
-HSPLcom/android/org/bouncycastle/util/Integers;->valueOf(I)Ljava/lang/Integer;
-HSPLcom/android/org/bouncycastle/util/Pack;->bigEndianToInt([BI)I
-HSPLcom/android/org/bouncycastle/util/Pack;->intToBigEndian(I[BI)V
 HSPLcom/android/org/bouncycastle/util/Properties$1;-><init>(Ljava/lang/String;)V
 HSPLcom/android/org/bouncycastle/util/Properties$1;->run()Ljava/lang/Object;
 HSPLcom/android/org/bouncycastle/util/Properties;->access$000()Ljava/lang/ThreadLocal;
 HSPLcom/android/org/bouncycastle/util/Properties;->fetchProperty(Ljava/lang/String;)Ljava/lang/String;
 HSPLcom/android/org/bouncycastle/util/Properties;->isOverrideSet(Ljava/lang/String;)Z
-HSPLcom/android/org/bouncycastle/util/Strings;->toLowerCase(Ljava/lang/String;)Ljava/lang/String;
-HSPLcom/android/org/bouncycastle/util/Strings;->toUTF8ByteArray([C)[B
-HSPLcom/android/org/bouncycastle/util/Strings;->toUTF8ByteArray([CLjava/io/OutputStream;)V
 HSPLcom/android/org/bouncycastle/util/Strings;->toUpperCase(Ljava/lang/String;)Ljava/lang/String;
 HSPLcom/android/org/bouncycastle/util/io/Streams;->readFully(Ljava/io/InputStream;[B)I
 HSPLcom/android/org/bouncycastle/util/io/Streams;->readFully(Ljava/io/InputStream;[BII)I
-HSPLcom/android/org/bouncycastle/x509/X509Util;-><clinit>()V
 HSPLcom/android/org/kxml2/io/KXmlParser;-><init>()V
 HSPLcom/android/org/kxml2/io/KXmlParser;->adjustNsp()Z
 HSPLcom/android/org/kxml2/io/KXmlParser;->close()V
@@ -35450,15 +31861,12 @@
 HSPLcom/android/org/kxml2/io/KXmlParser;->getAttributePrefix(I)Ljava/lang/String;
 HSPLcom/android/org/kxml2/io/KXmlParser;->getAttributeValue(I)Ljava/lang/String;
 HSPLcom/android/org/kxml2/io/KXmlParser;->getAttributeValue(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLcom/android/org/kxml2/io/KXmlParser;->getColumnNumber()I
 HSPLcom/android/org/kxml2/io/KXmlParser;->getDepth()I
 HSPLcom/android/org/kxml2/io/KXmlParser;->getEventType()I
-HSPLcom/android/org/kxml2/io/KXmlParser;->getLineNumber()I
 HSPLcom/android/org/kxml2/io/KXmlParser;->getName()Ljava/lang/String;
 HSPLcom/android/org/kxml2/io/KXmlParser;->getNamespace()Ljava/lang/String;
 HSPLcom/android/org/kxml2/io/KXmlParser;->getNamespace(Ljava/lang/String;)Ljava/lang/String;
 HSPLcom/android/org/kxml2/io/KXmlParser;->getNamespaceCount(I)I
-HSPLcom/android/org/kxml2/io/KXmlParser;->getPositionDescription()Ljava/lang/String;
 HSPLcom/android/org/kxml2/io/KXmlParser;->getPrefix()Ljava/lang/String;
 HSPLcom/android/org/kxml2/io/KXmlParser;->getText()Ljava/lang/String;
 HSPLcom/android/org/kxml2/io/KXmlParser;->keepNamespaceAttributes()V
@@ -35513,7 +31921,7 @@
 HPLcom/android/server/BootReceiver;->addFileWithFootersToDropBox(Landroid/os/DropBoxManager;Ljava/util/HashMap;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;)V
 HPLcom/android/server/BootReceiver;->addFsckErrorsToDropBoxAndLogFsStat(Landroid/os/DropBoxManager;Ljava/util/HashMap;Ljava/lang/String;ILjava/lang/String;)V
 PLcom/android/server/BootReceiver;->addLastkToDropBox(Landroid/os/DropBoxManager;Ljava/util/HashMap;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;)V
-PLcom/android/server/BootReceiver;->addTextToDropBox(Landroid/os/DropBoxManager;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)V
+HPLcom/android/server/BootReceiver;->addTextToDropBox(Landroid/os/DropBoxManager;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)V
 PLcom/android/server/BootReceiver;->getBootHeadersToLogAndUpdate()Ljava/lang/String;
 PLcom/android/server/BootReceiver;->getCurrentBootHeaders()Ljava/lang/String;
 PLcom/android/server/BootReceiver;->getPreviousBootHeaders()Ljava/lang/String;
@@ -35533,11 +31941,9 @@
 HSPLcom/android/server/NetworkManagementSocketTagger$1;->initialValue()Ljava/lang/Object;
 HSPLcom/android/server/NetworkManagementSocketTagger$SocketTags;-><init>()V
 HSPLcom/android/server/NetworkManagementSocketTagger;-><init>()V
-HSPLcom/android/server/NetworkManagementSocketTagger;->getThreadSocketStatsTag()I
 HSPLcom/android/server/NetworkManagementSocketTagger;->install()V
 HSPLcom/android/server/NetworkManagementSocketTagger;->setKernelCounterSet(II)V
 HSPLcom/android/server/NetworkManagementSocketTagger;->setThreadSocketStatsTag(I)I
-HSPLcom/android/server/NetworkManagementSocketTagger;->setThreadSocketStatsUid(I)I
 HSPLcom/android/server/NetworkManagementSocketTagger;->tag(Ljava/io/FileDescriptor;)V
 HSPLcom/android/server/NetworkManagementSocketTagger;->tagSocketFd(Ljava/io/FileDescriptor;II)V
 HSPLcom/android/server/NetworkManagementSocketTagger;->unTagSocketFd(Ljava/io/FileDescriptor;)V
@@ -35581,17 +31987,21 @@
 HSPLcom/android/server/SystemConfig;->readPermissionsFromXml(Ljava/io/File;I)V
 HSPLcom/android/server/SystemConfig;->readPrivAppPermissions(Lorg/xmlpull/v1/XmlPullParser;Landroid/util/ArrayMap;Landroid/util/ArrayMap;)V
 HSPLcom/android/server/SystemConfig;->readSplitPermission(Lorg/xmlpull/v1/XmlPullParser;Ljava/io/File;)V
-PLcom/android/server/backup/AccountSyncSettingsBackupHelper;-><init>(Landroid/content/Context;I)V
-PLcom/android/server/backup/AccountSyncSettingsBackupHelper;->accountAdded(Landroid/content/Context;I)V
 PLcom/android/server/backup/AccountSyncSettingsBackupHelper;->accountAddedInternal(I)V
 PLcom/android/server/backup/AccountSyncSettingsBackupHelper;->getStashFile(I)Ljava/io/File;
+HPLcom/android/server/connectivity/metrics/nano/IpConnectivityLogClass$DHCPEvent;-><init>()V
+HPLcom/android/server/connectivity/metrics/nano/IpConnectivityLogClass$DHCPEvent;->setErrorCode(I)Lcom/android/server/connectivity/metrics/nano/IpConnectivityLogClass$DHCPEvent;
+HPLcom/android/server/connectivity/metrics/nano/IpConnectivityLogClass$DHCPEvent;->setStateTransition(Ljava/lang/String;)Lcom/android/server/connectivity/metrics/nano/IpConnectivityLogClass$DHCPEvent;
 HPLcom/android/server/connectivity/metrics/nano/IpConnectivityLogClass$DNSLookupBatch;->clear()Lcom/android/server/connectivity/metrics/nano/IpConnectivityLogClass$DNSLookupBatch;
 HPLcom/android/server/connectivity/metrics/nano/IpConnectivityLogClass$IpConnectivityEvent;-><init>()V
 HPLcom/android/server/connectivity/metrics/nano/IpConnectivityLogClass$IpConnectivityEvent;->computeSerializedSize()I
 PLcom/android/server/connectivity/metrics/nano/IpConnectivityLogClass$IpConnectivityEvent;->emptyArray()[Lcom/android/server/connectivity/metrics/nano/IpConnectivityLogClass$IpConnectivityEvent;
+HPLcom/android/server/connectivity/metrics/nano/IpConnectivityLogClass$IpConnectivityEvent;->setDhcpEvent(Lcom/android/server/connectivity/metrics/nano/IpConnectivityLogClass$DHCPEvent;)Lcom/android/server/connectivity/metrics/nano/IpConnectivityLogClass$IpConnectivityEvent;
 PLcom/android/server/connectivity/metrics/nano/IpConnectivityLogClass$IpConnectivityEvent;->setNetworkEvent(Lcom/android/server/connectivity/metrics/nano/IpConnectivityLogClass$NetworkEvent;)Lcom/android/server/connectivity/metrics/nano/IpConnectivityLogClass$IpConnectivityEvent;
 HPLcom/android/server/connectivity/metrics/nano/IpConnectivityLogClass$IpConnectivityEvent;->setValidationProbeEvent(Lcom/android/server/connectivity/metrics/nano/IpConnectivityLogClass$ValidationProbeEvent;)Lcom/android/server/connectivity/metrics/nano/IpConnectivityLogClass$IpConnectivityEvent;
 HPLcom/android/server/connectivity/metrics/nano/IpConnectivityLogClass$IpConnectivityEvent;->writeTo(Lcom/android/framework/protobuf/nano/CodedOutputByteBufferNano;)V
+HPLcom/android/server/connectivity/metrics/nano/IpConnectivityLogClass$IpProvisioningEvent;->computeSerializedSize()I
+HPLcom/android/server/connectivity/metrics/nano/IpConnectivityLogClass$IpProvisioningEvent;->writeTo(Lcom/android/framework/protobuf/nano/CodedOutputByteBufferNano;)V
 HPLcom/android/server/connectivity/metrics/nano/IpConnectivityLogClass$NetworkEvent;-><init>()V
 HPLcom/android/server/connectivity/metrics/nano/IpConnectivityLogClass$Pair;->emptyArray()[Lcom/android/server/connectivity/metrics/nano/IpConnectivityLogClass$Pair;
 HPLcom/android/server/connectivity/metrics/nano/IpConnectivityLogClass$ValidationProbeEvent;-><init>()V
@@ -35616,21 +32026,12 @@
 HPLcom/android/server/wm/nano/WindowManagerProtos$TaskSnapshotProto;-><init>()V
 HPLcom/android/server/wm/nano/WindowManagerProtos$TaskSnapshotProto;->clear()Lcom/android/server/wm/nano/WindowManagerProtos$TaskSnapshotProto;
 HPLcom/android/server/wm/nano/WindowManagerProtos$TaskSnapshotProto;->computeSerializedSize()I
-PLcom/android/server/wm/nano/WindowManagerProtos$TaskSnapshotProto;->mergeFrom(Lcom/android/framework/protobuf/nano/CodedInputByteBufferNano;)Lcom/android/framework/protobuf/nano/MessageNano;
+HPLcom/android/server/wm/nano/WindowManagerProtos$TaskSnapshotProto;->mergeFrom(Lcom/android/framework/protobuf/nano/CodedInputByteBufferNano;)Lcom/android/framework/protobuf/nano/MessageNano;
 HPLcom/android/server/wm/nano/WindowManagerProtos$TaskSnapshotProto;->mergeFrom(Lcom/android/framework/protobuf/nano/CodedInputByteBufferNano;)Lcom/android/server/wm/nano/WindowManagerProtos$TaskSnapshotProto;
 HPLcom/android/server/wm/nano/WindowManagerProtos$TaskSnapshotProto;->parseFrom([B)Lcom/android/server/wm/nano/WindowManagerProtos$TaskSnapshotProto;
 HPLcom/android/server/wm/nano/WindowManagerProtos$TaskSnapshotProto;->writeTo(Lcom/android/framework/protobuf/nano/CodedOutputByteBufferNano;)V
-HSPLcom/android/telephony/Rlog;->d(Ljava/lang/String;Ljava/lang/String;)I
-HSPLcom/android/telephony/Rlog;->e(Ljava/lang/String;Ljava/lang/String;)I
-HSPLcom/android/telephony/Rlog;->isLoggable(Ljava/lang/String;I)Z
-HSPLcom/android/telephony/Rlog;->log(ILjava/lang/String;Ljava/lang/String;)I
-HSPLcom/android/telephony/Rlog;->pii(Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/String;
-HSPLcom/android/telephony/Rlog;->pii(ZLjava/lang/Object;)Ljava/lang/String;
-HSPLcom/android/telephony/Rlog;->secureHash([B)Ljava/lang/String;
-HSPLcom/android/telephony/Rlog;->w(Ljava/lang/String;Ljava/lang/String;)I
 HSPLcom/google/android/collect/Lists;->newArrayList()Ljava/util/ArrayList;
 HSPLcom/google/android/collect/Lists;->newArrayList([Ljava/lang/Object;)Ljava/util/ArrayList;
-HSPLcom/google/android/collect/Maps;->newArrayMap()Landroid/util/ArrayMap;
 HSPLcom/google/android/collect/Maps;->newHashMap()Ljava/util/HashMap;
 HSPLcom/google/android/collect/Sets;->newArraySet()Landroid/util/ArraySet;
 HSPLcom/google/android/collect/Sets;->newArraySet([Ljava/lang/Object;)Landroid/util/ArraySet;
@@ -35638,16 +32039,13 @@
 HSPLcom/google/android/collect/Sets;->newHashSet([Ljava/lang/Object;)Ljava/util/HashSet;
 HSPLcom/google/android/gles_jni/EGLConfigImpl;-><init>(J)V
 HSPLcom/google/android/gles_jni/EGLContextImpl;-><init>(J)V
-HSPLcom/google/android/gles_jni/EGLContextImpl;->equals(Ljava/lang/Object;)Z
 HSPLcom/google/android/gles_jni/EGLContextImpl;->getGL()Ljavax/microedition/khronos/opengles/GL;
 HSPLcom/google/android/gles_jni/EGLDisplayImpl;-><init>(J)V
-HSPLcom/google/android/gles_jni/EGLDisplayImpl;->equals(Ljava/lang/Object;)Z
 HSPLcom/google/android/gles_jni/EGLImpl;->eglCreateContext(Ljavax/microedition/khronos/egl/EGLDisplay;Ljavax/microedition/khronos/egl/EGLConfig;Ljavax/microedition/khronos/egl/EGLContext;[I)Ljavax/microedition/khronos/egl/EGLContext;
 HSPLcom/google/android/gles_jni/EGLImpl;->eglCreatePbufferSurface(Ljavax/microedition/khronos/egl/EGLDisplay;Ljavax/microedition/khronos/egl/EGLConfig;[I)Ljavax/microedition/khronos/egl/EGLSurface;
 HSPLcom/google/android/gles_jni/EGLImpl;->eglCreateWindowSurface(Ljavax/microedition/khronos/egl/EGLDisplay;Ljavax/microedition/khronos/egl/EGLConfig;Ljava/lang/Object;[I)Ljavax/microedition/khronos/egl/EGLSurface;
 HSPLcom/google/android/gles_jni/EGLImpl;->eglGetDisplay(Ljava/lang/Object;)Ljavax/microedition/khronos/egl/EGLDisplay;
 HSPLcom/google/android/gles_jni/EGLSurfaceImpl;-><init>(J)V
-HSPLcom/google/android/gles_jni/EGLSurfaceImpl;->equals(Ljava/lang/Object;)Z
 HSPLcom/google/android/gles_jni/GLImpl;-><init>()V
 HPLcom/google/android/rappor/Encoder;-><init>(Ljava/util/Random;Ljava/security/MessageDigest;Ljava/security/MessageDigest;[BLjava/lang/String;IDDDII)V
 HPLcom/google/android/rappor/Encoder;->checkArgument(ZLjava/lang/Object;)V
@@ -35663,8 +32061,6 @@
 HPLcom/google/android/rappor/HmacDrbg;->nextBytes([B)V
 HPLcom/google/android/rappor/HmacDrbg;->nextBytes([BII)V
 HPLcom/google/android/rappor/HmacDrbg;->setKey([B)V
-HSPLcom/google/android/textclassifier/ActionsSuggestionsModel;->getLocales(I)Ljava/lang/String;
-HSPLcom/google/android/textclassifier/ActionsSuggestionsModel;->getVersion(I)I
 HSPLcom/google/android/textclassifier/AnnotatorModel;->getLocales(I)Ljava/lang/String;
 HSPLcom/google/android/textclassifier/AnnotatorModel;->getVersion(I)I
 HSPLcom/google/android/textclassifier/LangIdModel;->getVersion(I)I
@@ -35710,7 +32106,6 @@
 HSPLdalvik/system/DexFile;-><init>(Ljava/lang/String;Ljava/lang/ClassLoader;[Ldalvik/system/DexPathList$Element;)V
 HSPLdalvik/system/DexFile;->defineClass(Ljava/lang/String;Ljava/lang/ClassLoader;Ljava/lang/Object;Ldalvik/system/DexFile;Ljava/util/List;)Ljava/lang/Class;
 HSPLdalvik/system/DexFile;->finalize()V
-HSPLdalvik/system/DexFile;->getName()Ljava/lang/String;
 HSPLdalvik/system/DexFile;->loadClassBinaryName(Ljava/lang/String;Ljava/lang/ClassLoader;Ljava/util/List;)Ljava/lang/Class;
 HSPLdalvik/system/DexFile;->openDexFile(Ljava/lang/String;Ljava/lang/String;ILjava/lang/ClassLoader;[Ldalvik/system/DexPathList$Element;)Ljava/lang/Object;
 HSPLdalvik/system/DexPathList$Element;-><init>(Ldalvik/system/DexFile;Ljava/io/File;)V
@@ -35751,8 +32146,6 @@
 HSPLdalvik/system/SocketTagger;-><init>()V
 HSPLdalvik/system/SocketTagger;->get()Ldalvik/system/SocketTagger;
 HSPLdalvik/system/SocketTagger;->set(Ldalvik/system/SocketTagger;)V
-HSPLdalvik/system/SocketTagger;->tag(Ljava/net/Socket;)V
-HSPLdalvik/system/SocketTagger;->untag(Ljava/net/Socket;)V
 HSPLdalvik/system/VMRuntime;->getInstructionSet(Ljava/lang/String;)Ljava/lang/String;
 HSPLdalvik/system/VMRuntime;->getRuntime()Ldalvik/system/VMRuntime;
 HSPLdalvik/system/VMRuntime;->getTargetSdkVersion()I
@@ -35810,14 +32203,11 @@
 HSPLjava/io/BufferedReader;->close()V
 HSPLjava/io/BufferedReader;->ensureOpen()V
 HSPLjava/io/BufferedReader;->fill()V
-HSPLjava/io/BufferedReader;->mark(I)V
 HSPLjava/io/BufferedReader;->read()I
 HSPLjava/io/BufferedReader;->read([CII)I
 HSPLjava/io/BufferedReader;->read1([CII)I
 HSPLjava/io/BufferedReader;->readLine()Ljava/lang/String;
 HSPLjava/io/BufferedReader;->readLine(Z)Ljava/lang/String;
-HSPLjava/io/BufferedReader;->reset()V
-HSPLjava/io/BufferedReader;->skip(J)J
 HSPLjava/io/BufferedWriter;-><init>(Ljava/io/Writer;)V
 HSPLjava/io/BufferedWriter;-><init>(Ljava/io/Writer;I)V
 HSPLjava/io/BufferedWriter;->close()V
@@ -35888,9 +32278,6 @@
 HSPLjava/io/DataOutputStream;->writeShort(I)V
 HSPLjava/io/DataOutputStream;->writeUTF(Ljava/lang/String;)V
 HSPLjava/io/DataOutputStream;->writeUTF(Ljava/lang/String;Ljava/io/DataOutput;)I
-HSPLjava/io/DeleteOnExitHook$1;-><init>()V
-HSPLjava/io/DeleteOnExitHook;-><clinit>()V
-HSPLjava/io/DeleteOnExitHook;->add(Ljava/lang/String;)V
 HSPLjava/io/EOFException;-><init>()V
 HSPLjava/io/EOFException;-><init>(Ljava/lang/String;)V
 HSPLjava/io/ExpiringCache;->clear()V
@@ -35906,9 +32293,9 @@
 HSPLjava/io/File;->compareTo(Ljava/io/File;)I
 HSPLjava/io/File;->compareTo(Ljava/lang/Object;)I
 HSPLjava/io/File;->createNewFile()Z
+HSPLjava/io/File;->createTempFile(Ljava/lang/String;Ljava/lang/String;)Ljava/io/File;
 HSPLjava/io/File;->createTempFile(Ljava/lang/String;Ljava/lang/String;Ljava/io/File;)Ljava/io/File;
 HSPLjava/io/File;->delete()Z
-HSPLjava/io/File;->deleteOnExit()V
 HSPLjava/io/File;->equals(Ljava/lang/Object;)Z
 HSPLjava/io/File;->exists()Z
 HSPLjava/io/File;->getAbsoluteFile()Ljava/io/File;
@@ -35938,7 +32325,6 @@
 HSPLjava/io/File;->mkdir()Z
 HSPLjava/io/File;->mkdirs()Z
 HSPLjava/io/File;->renameTo(Ljava/io/File;)Z
-HSPLjava/io/File;->setExecutable(ZZ)Z
 HSPLjava/io/File;->setLastModified(J)Z
 HSPLjava/io/File;->setReadable(ZZ)Z
 HSPLjava/io/File;->setWritable(ZZ)Z
@@ -35949,6 +32335,7 @@
 HSPLjava/io/FileDescriptor$1;->set(Ljava/io/FileDescriptor;I)V
 HSPLjava/io/FileDescriptor;-><init>()V
 HSPLjava/io/FileDescriptor;->access$002(Ljava/io/FileDescriptor;I)I
+HSPLjava/io/FileDescriptor;->cloneForFork()V
 HSPLjava/io/FileDescriptor;->getInt$()I
 HSPLjava/io/FileDescriptor;->getOwnerId$()J
 HSPLjava/io/FileDescriptor;->isSocket$()Z
@@ -35975,7 +32362,6 @@
 HSPLjava/io/FileOutputStream;-><init>(Ljava/io/FileDescriptor;)V
 HSPLjava/io/FileOutputStream;-><init>(Ljava/io/FileDescriptor;Z)V
 HSPLjava/io/FileOutputStream;-><init>(Ljava/lang/String;)V
-HSPLjava/io/FileOutputStream;-><init>(Ljava/lang/String;Z)V
 HSPLjava/io/FileOutputStream;->close()V
 HSPLjava/io/FileOutputStream;->finalize()V
 HSPLjava/io/FileOutputStream;->getChannel()Ljava/nio/channels/FileChannel;
@@ -36004,11 +32390,9 @@
 HSPLjava/io/FilterOutputStream;->write([B)V
 HSPLjava/io/FilterReader;-><init>(Ljava/io/Reader;)V
 HSPLjava/io/FilterReader;->read()I
-HSPLjava/io/FilterWriter;-><init>(Ljava/io/Writer;)V
 HSPLjava/io/IOException;-><init>()V
 HSPLjava/io/IOException;-><init>(Ljava/lang/String;)V
 HSPLjava/io/IOException;-><init>(Ljava/lang/String;Ljava/lang/Throwable;)V
-HSPLjava/io/IOException;-><init>(Ljava/lang/Throwable;)V
 HSPLjava/io/InputStream;-><init>()V
 HSPLjava/io/InputStream;->close()V
 HSPLjava/io/InputStream;->markSupported()Z
@@ -36022,7 +32406,6 @@
 HSPLjava/io/InputStreamReader;->read()I
 HSPLjava/io/InputStreamReader;->read([CII)I
 HSPLjava/io/InputStreamReader;->ready()Z
-HSPLjava/io/InterruptedIOException;-><init>()V
 HSPLjava/io/InterruptedIOException;-><init>(Ljava/lang/String;)V
 HSPLjava/io/ObjectInputStream$BlockDataInputStream;-><init>(Ljava/io/ObjectInputStream;Ljava/io/InputStream;)V
 HSPLjava/io/ObjectInputStream$BlockDataInputStream;->close()V
@@ -36036,7 +32419,6 @@
 HSPLjava/io/ObjectInputStream$BlockDataInputStream;->readBlockHeader(Z)I
 HSPLjava/io/ObjectInputStream$BlockDataInputStream;->readBoolean()Z
 HSPLjava/io/ObjectInputStream$BlockDataInputStream;->readByte()B
-HSPLjava/io/ObjectInputStream$BlockDataInputStream;->readFloat()F
 HSPLjava/io/ObjectInputStream$BlockDataInputStream;->readFloats([FII)V
 HSPLjava/io/ObjectInputStream$BlockDataInputStream;->readFully([BIIZ)V
 HSPLjava/io/ObjectInputStream$BlockDataInputStream;->readInt()I
@@ -36050,12 +32432,6 @@
 HSPLjava/io/ObjectInputStream$BlockDataInputStream;->refill()V
 HSPLjava/io/ObjectInputStream$BlockDataInputStream;->setBlockDataMode(Z)Z
 HSPLjava/io/ObjectInputStream$BlockDataInputStream;->skipBlockData()V
-HSPLjava/io/ObjectInputStream$GetField;-><init>()V
-HSPLjava/io/ObjectInputStream$GetFieldImpl;-><init>(Ljava/io/ObjectInputStream;Ljava/io/ObjectStreamClass;)V
-HSPLjava/io/ObjectInputStream$GetFieldImpl;->get(Ljava/lang/String;I)I
-HSPLjava/io/ObjectInputStream$GetFieldImpl;->get(Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/io/ObjectInputStream$GetFieldImpl;->getFieldOffset(Ljava/lang/String;Ljava/lang/Class;)I
-HSPLjava/io/ObjectInputStream$GetFieldImpl;->readFields()V
 HSPLjava/io/ObjectInputStream$HandleTable$HandleList;-><init>()V
 HSPLjava/io/ObjectInputStream$HandleTable$HandleList;->add(I)V
 HSPLjava/io/ObjectInputStream$HandleTable;-><init>(I)V
@@ -36078,11 +32454,6 @@
 HSPLjava/io/ObjectInputStream$ValidationList;->clear()V
 HSPLjava/io/ObjectInputStream$ValidationList;->doCallbacks()V
 HSPLjava/io/ObjectInputStream;-><init>(Ljava/io/InputStream;)V
-HSPLjava/io/ObjectInputStream;->access$000(Ljava/io/ObjectInputStream;)I
-HSPLjava/io/ObjectInputStream;->access$002(Ljava/io/ObjectInputStream;I)I
-HSPLjava/io/ObjectInputStream;->access$100(Ljava/io/ObjectInputStream;)Ljava/io/ObjectInputStream$HandleTable;
-HSPLjava/io/ObjectInputStream;->access$200(Ljava/io/ObjectInputStream;)Ljava/io/ObjectInputStream$BlockDataInputStream;
-HSPLjava/io/ObjectInputStream;->access$300(Ljava/io/ObjectInputStream;Z)Ljava/lang/Object;
 HSPLjava/io/ObjectInputStream;->access$500(Ljava/io/ObjectInputStream;)Z
 HSPLjava/io/ObjectInputStream;->access$700([BI[FII)V
 HSPLjava/io/ObjectInputStream;->checkResolve(Ljava/lang/Object;)Ljava/lang/Object;
@@ -36098,8 +32469,6 @@
 HSPLjava/io/ObjectInputStream;->readClassDesc(Z)Ljava/io/ObjectStreamClass;
 HSPLjava/io/ObjectInputStream;->readClassDescriptor()Ljava/io/ObjectStreamClass;
 HSPLjava/io/ObjectInputStream;->readEnum(Z)Ljava/lang/Enum;
-HSPLjava/io/ObjectInputStream;->readFields()Ljava/io/ObjectInputStream$GetField;
-HSPLjava/io/ObjectInputStream;->readFloat()F
 HSPLjava/io/ObjectInputStream;->readHandle(Z)Ljava/lang/Object;
 HSPLjava/io/ObjectInputStream;->readInt()I
 HSPLjava/io/ObjectInputStream;->readLong()J
@@ -36124,18 +32493,15 @@
 HSPLjava/io/ObjectOutputStream$BlockDataOutputStream;->getUTFLength(Ljava/lang/String;)J
 HSPLjava/io/ObjectOutputStream$BlockDataOutputStream;->setBlockDataMode(Z)Z
 HSPLjava/io/ObjectOutputStream$BlockDataOutputStream;->warnIfClosed()V
-HSPLjava/io/ObjectOutputStream$BlockDataOutputStream;->write(I)V
 HSPLjava/io/ObjectOutputStream$BlockDataOutputStream;->write([BIIZ)V
 HSPLjava/io/ObjectOutputStream$BlockDataOutputStream;->writeBlockHeader(I)V
 HSPLjava/io/ObjectOutputStream$BlockDataOutputStream;->writeByte(I)V
 HSPLjava/io/ObjectOutputStream$BlockDataOutputStream;->writeBytes(Ljava/lang/String;)V
-HSPLjava/io/ObjectOutputStream$BlockDataOutputStream;->writeFloat(F)V
 HSPLjava/io/ObjectOutputStream$BlockDataOutputStream;->writeInt(I)V
 HSPLjava/io/ObjectOutputStream$BlockDataOutputStream;->writeLong(J)V
 HSPLjava/io/ObjectOutputStream$BlockDataOutputStream;->writeShort(I)V
 HSPLjava/io/ObjectOutputStream$BlockDataOutputStream;->writeUTF(Ljava/lang/String;)V
 HSPLjava/io/ObjectOutputStream$BlockDataOutputStream;->writeUTF(Ljava/lang/String;J)V
-HSPLjava/io/ObjectOutputStream$BlockDataOutputStream;->writeUTFBody(Ljava/lang/String;)V
 HSPLjava/io/ObjectOutputStream$HandleTable;-><init>(IF)V
 HSPLjava/io/ObjectOutputStream$HandleTable;->assign(Ljava/lang/Object;)I
 HSPLjava/io/ObjectOutputStream$HandleTable;->clear()V
@@ -36170,7 +32536,6 @@
 HSPLjava/io/ObjectOutputStream;->writeClassDescriptor(Ljava/io/ObjectStreamClass;)V
 HSPLjava/io/ObjectOutputStream;->writeEnum(Ljava/lang/Enum;Ljava/io/ObjectStreamClass;Z)V
 HSPLjava/io/ObjectOutputStream;->writeFields()V
-HSPLjava/io/ObjectOutputStream;->writeFloat(F)V
 HSPLjava/io/ObjectOutputStream;->writeHandle(I)V
 HSPLjava/io/ObjectOutputStream;->writeInt(I)V
 HSPLjava/io/ObjectOutputStream;->writeLong(J)V
@@ -36266,7 +32631,6 @@
 HSPLjava/io/ObjectStreamClass;->getName()Ljava/lang/String;
 HSPLjava/io/ObjectStreamClass;->getNumObjFields()I
 HSPLjava/io/ObjectStreamClass;->getObjFieldValues(Ljava/lang/Object;[Ljava/lang/Object;)V
-HSPLjava/io/ObjectStreamClass;->getPackageName(Ljava/lang/Class;)Ljava/lang/String;
 HSPLjava/io/ObjectStreamClass;->getPrimDataSize()I
 HSPLjava/io/ObjectStreamClass;->getPrimFieldValues(Ljava/lang/Object;[B)V
 HSPLjava/io/ObjectStreamClass;->getPrivateMethod(Ljava/lang/Class;Ljava/lang/String;[Ljava/lang/Class;Ljava/lang/Class;)Ljava/lang/reflect/Method;
@@ -36294,7 +32658,6 @@
 HSPLjava/io/ObjectStreamClass;->lookup(Ljava/lang/Class;Z)Ljava/io/ObjectStreamClass;
 HSPLjava/io/ObjectStreamClass;->matchFields([Ljava/io/ObjectStreamField;Ljava/io/ObjectStreamClass;)[Ljava/io/ObjectStreamField;
 HSPLjava/io/ObjectStreamClass;->newInstance()Ljava/lang/Object;
-HSPLjava/io/ObjectStreamClass;->packageEquals(Ljava/lang/Class;Ljava/lang/Class;)Z
 HSPLjava/io/ObjectStreamClass;->processQueue(Ljava/lang/ref/ReferenceQueue;Ljava/util/concurrent/ConcurrentMap;)V
 HSPLjava/io/ObjectStreamClass;->readNonProxy(Ljava/io/ObjectInputStream;)V
 HSPLjava/io/ObjectStreamClass;->requireInitialized()V
@@ -36326,28 +32689,14 @@
 HSPLjava/io/OutputStreamWriter;-><init>(Ljava/io/OutputStream;Ljava/nio/charset/Charset;)V
 HSPLjava/io/OutputStreamWriter;->close()V
 HSPLjava/io/OutputStreamWriter;->flush()V
-HSPLjava/io/OutputStreamWriter;->flushBuffer()V
 HSPLjava/io/OutputStreamWriter;->write(I)V
 HSPLjava/io/OutputStreamWriter;->write(Ljava/lang/String;II)V
 HSPLjava/io/OutputStreamWriter;->write([CII)V
-HSPLjava/io/PipedInputStream;-><clinit>()V
-HSPLjava/io/PipedInputStream;->close()V
-HSPLjava/io/PipedInputStream;->receivedLast()V
-HSPLjava/io/PipedOutputStream;->close()V
 HSPLjava/io/PrintStream;-><init>(Ljava/io/OutputStream;)V
 HSPLjava/io/PrintStream;-><init>(Ljava/io/OutputStream;Z)V
-HSPLjava/io/PrintStream;-><init>(Ljava/io/OutputStream;ZLjava/lang/String;)V
 HSPLjava/io/PrintStream;-><init>(ZLjava/io/OutputStream;)V
-HSPLjava/io/PrintStream;-><init>(ZLjava/io/OutputStream;Ljava/nio/charset/Charset;)V
 HSPLjava/io/PrintStream;->close()V
-HSPLjava/io/PrintStream;->ensureOpen()V
-HSPLjava/io/PrintStream;->flush()V
-HSPLjava/io/PrintStream;->getTextOut()Ljava/io/BufferedWriter;
-HSPLjava/io/PrintStream;->print(Ljava/lang/String;)V
 HSPLjava/io/PrintStream;->requireNonNull(Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object;
-HSPLjava/io/PrintStream;->toCharset(Ljava/lang/String;)Ljava/nio/charset/Charset;
-HSPLjava/io/PrintStream;->write(Ljava/lang/String;)V
-HSPLjava/io/PrintStream;->write([BII)V
 HSPLjava/io/PrintWriter;-><init>(Ljava/io/File;)V
 HSPLjava/io/PrintWriter;-><init>(Ljava/io/OutputStream;)V
 HSPLjava/io/PrintWriter;-><init>(Ljava/io/OutputStream;Z)V
@@ -36384,9 +32733,7 @@
 HSPLjava/io/PrintWriter;->write(Ljava/lang/String;II)V
 HSPLjava/io/PrintWriter;->write([CII)V
 HSPLjava/io/PushbackInputStream;-><init>(Ljava/io/InputStream;I)V
-HSPLjava/io/PushbackInputStream;->close()V
 HSPLjava/io/PushbackInputStream;->ensureOpen()V
-HSPLjava/io/PushbackInputStream;->markSupported()Z
 HSPLjava/io/PushbackInputStream;->read()I
 HSPLjava/io/PushbackInputStream;->read([BII)I
 HSPLjava/io/PushbackInputStream;->unread([BII)V
@@ -36410,7 +32757,6 @@
 HSPLjava/io/RandomAccessFile;->readFully([B)V
 HSPLjava/io/RandomAccessFile;->readFully([BII)V
 HSPLjava/io/RandomAccessFile;->readInt()I
-HSPLjava/io/RandomAccessFile;->readLong()J
 HSPLjava/io/RandomAccessFile;->seek(J)V
 HSPLjava/io/RandomAccessFile;->setLength(J)V
 HSPLjava/io/RandomAccessFile;->write(I)V
@@ -36426,8 +32772,6 @@
 HSPLjava/io/Reader;->read(Ljava/nio/CharBuffer;)I
 HSPLjava/io/Reader;->read([C)I
 HSPLjava/io/SequenceInputStream;-><init>(Ljava/io/InputStream;Ljava/io/InputStream;)V
-HSPLjava/io/SequenceInputStream;->available()I
-HSPLjava/io/SequenceInputStream;->close()V
 HSPLjava/io/SequenceInputStream;->nextStream()V
 HSPLjava/io/SequenceInputStream;->read()I
 HSPLjava/io/SequenceInputStream;->read([BII)I
@@ -36449,6 +32793,7 @@
 HSPLjava/io/StringWriter;->append(Ljava/lang/CharSequence;)Ljava/io/Writer;
 HSPLjava/io/StringWriter;->close()V
 HSPLjava/io/StringWriter;->flush()V
+HSPLjava/io/StringWriter;->getBuffer()Ljava/lang/StringBuffer;
 HSPLjava/io/StringWriter;->toString()Ljava/lang/String;
 HSPLjava/io/StringWriter;->write(I)V
 HSPLjava/io/StringWriter;->write(Ljava/lang/String;)V
@@ -36461,7 +32806,6 @@
 HSPLjava/io/UnixFileSystem;->createFileExclusively(Ljava/lang/String;)Z
 HSPLjava/io/UnixFileSystem;->delete(Ljava/io/File;)Z
 HSPLjava/io/UnixFileSystem;->getBooleanAttributes(Ljava/io/File;)I
-HSPLjava/io/UnixFileSystem;->getDefaultParent()Ljava/lang/String;
 HSPLjava/io/UnixFileSystem;->getLastModifiedTime(Ljava/io/File;)J
 HSPLjava/io/UnixFileSystem;->getLength(Ljava/io/File;)J
 HSPLjava/io/UnixFileSystem;->getSpace(Ljava/io/File;I)J
@@ -36512,7 +32856,6 @@
 HSPLjava/lang/AbstractStringBuilder;->length()I
 HSPLjava/lang/AbstractStringBuilder;->newCapacity(I)I
 HSPLjava/lang/AbstractStringBuilder;->replace(IILjava/lang/String;)Ljava/lang/AbstractStringBuilder;
-HSPLjava/lang/AbstractStringBuilder;->reverse()Ljava/lang/AbstractStringBuilder;
 HSPLjava/lang/AbstractStringBuilder;->setCharAt(IC)V
 HSPLjava/lang/AbstractStringBuilder;->setLength(I)V
 HSPLjava/lang/AbstractStringBuilder;->subSequence(II)Ljava/lang/CharSequence;
@@ -36542,13 +32885,9 @@
 HSPLjava/lang/Byte;-><init>(B)V
 HSPLjava/lang/Byte;->byteValue()B
 HSPLjava/lang/Byte;->compare(BB)I
-HSPLjava/lang/Byte;->compareTo(Ljava/lang/Byte;)I
-HSPLjava/lang/Byte;->compareTo(Ljava/lang/Object;)I
 HSPLjava/lang/Byte;->equals(Ljava/lang/Object;)Z
 HSPLjava/lang/Byte;->hashCode()I
 HSPLjava/lang/Byte;->hashCode(B)I
-HSPLjava/lang/Byte;->intValue()I
-HSPLjava/lang/Byte;->parseByte(Ljava/lang/String;)B
 HSPLjava/lang/Byte;->parseByte(Ljava/lang/String;I)B
 HSPLjava/lang/Byte;->toString()Ljava/lang/String;
 HSPLjava/lang/Byte;->toUnsignedInt(B)I
@@ -36576,20 +32915,15 @@
 HSPLjava/lang/Character;->forDigit(II)C
 HSPLjava/lang/Character;->getDirectionality(C)B
 HSPLjava/lang/Character;->getDirectionality(I)B
-HSPLjava/lang/Character;->getNumericValue(C)I
-HSPLjava/lang/Character;->getNumericValue(I)I
 HSPLjava/lang/Character;->getType(C)I
 HSPLjava/lang/Character;->getType(I)I
 HSPLjava/lang/Character;->hashCode()I
 HSPLjava/lang/Character;->hashCode(C)I
 HSPLjava/lang/Character;->highSurrogate(I)C
-HSPLjava/lang/Character;->isAlphabetic(I)Z
 HSPLjava/lang/Character;->isBmpCodePoint(I)Z
 HSPLjava/lang/Character;->isDigit(C)Z
 HSPLjava/lang/Character;->isDigit(I)Z
 HSPLjava/lang/Character;->isHighSurrogate(C)Z
-HSPLjava/lang/Character;->isISOControl(C)Z
-HSPLjava/lang/Character;->isISOControl(I)Z
 HSPLjava/lang/Character;->isLetter(C)Z
 HSPLjava/lang/Character;->isLetter(I)Z
 HSPLjava/lang/Character;->isLetterOrDigit(C)Z
@@ -36598,8 +32932,6 @@
 HSPLjava/lang/Character;->isLowerCase(I)Z
 HSPLjava/lang/Character;->isSpaceChar(C)Z
 HSPLjava/lang/Character;->isSpaceChar(I)Z
-HSPLjava/lang/Character;->isSupplementaryCodePoint(I)Z
-HSPLjava/lang/Character;->isSurrogate(C)Z
 HSPLjava/lang/Character;->isSurrogatePair(CC)Z
 HSPLjava/lang/Character;->isUpperCase(C)Z
 HSPLjava/lang/Character;->isUpperCase(I)Z
@@ -36607,7 +32939,6 @@
 HSPLjava/lang/Character;->isWhitespace(C)Z
 HSPLjava/lang/Character;->isWhitespace(I)Z
 HSPLjava/lang/Character;->lowSurrogate(I)C
-HSPLjava/lang/Character;->offsetByCodePoints(Ljava/lang/CharSequence;II)I
 HSPLjava/lang/Character;->toChars(I)[C
 HSPLjava/lang/Character;->toChars(I[CI)I
 HSPLjava/lang/Character;->toCodePoint(CC)I
@@ -36623,6 +32954,7 @@
 HSPLjava/lang/Class;->asSubclass(Ljava/lang/Class;)Ljava/lang/Class;
 HSPLjava/lang/Class;->cast(Ljava/lang/Object;)Ljava/lang/Object;
 HSPLjava/lang/Class;->classNameImpliesTopLevel()Z
+HSPLjava/lang/Class;->desiredAssertionStatus()Z
 HSPLjava/lang/Class;->findInterfaceMethod(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;
 HSPLjava/lang/Class;->forName(Ljava/lang/String;)Ljava/lang/Class;
 HSPLjava/lang/Class;->forName(Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class;
@@ -36729,13 +33061,10 @@
 HSPLjava/lang/Double;-><init>(D)V
 HSPLjava/lang/Double;->compare(DD)I
 HSPLjava/lang/Double;->compareTo(Ljava/lang/Double;)I
-HSPLjava/lang/Double;->compareTo(Ljava/lang/Object;)I
 HSPLjava/lang/Double;->doubleToLongBits(D)J
 HSPLjava/lang/Double;->doubleValue()D
 HSPLjava/lang/Double;->equals(Ljava/lang/Object;)Z
 HSPLjava/lang/Double;->floatValue()F
-HSPLjava/lang/Double;->hashCode()I
-HSPLjava/lang/Double;->hashCode(D)I
 HSPLjava/lang/Double;->isInfinite(D)Z
 HSPLjava/lang/Double;->isNaN(D)Z
 HSPLjava/lang/Double;->longValue()J
@@ -36779,16 +33108,14 @@
 HSPLjava/lang/Float;->isFinite(F)Z
 HSPLjava/lang/Float;->isInfinite(F)Z
 HSPLjava/lang/Float;->isNaN(F)Z
-HSPLjava/lang/Float;->longValue()J
 HSPLjava/lang/Float;->parseFloat(Ljava/lang/String;)F
 HSPLjava/lang/Float;->toString()Ljava/lang/String;
 HSPLjava/lang/Float;->toString(F)Ljava/lang/String;
 HSPLjava/lang/Float;->valueOf(F)Ljava/lang/Float;
+HSPLjava/lang/Float;->valueOf(Ljava/lang/String;)Ljava/lang/Float;
 HSPLjava/lang/IllegalAccessException;-><init>(Ljava/lang/String;)V
-HSPLjava/lang/IllegalArgumentException;-><init>()V
 HSPLjava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V
 HSPLjava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;Ljava/lang/Throwable;)V
-HSPLjava/lang/IllegalMonitorStateException;-><init>(Ljava/lang/String;)V
 HSPLjava/lang/IllegalStateException;-><init>()V
 HSPLjava/lang/IllegalStateException;-><init>(Ljava/lang/String;)V
 HSPLjava/lang/IllegalStateException;-><init>(Ljava/lang/String;Ljava/lang/Throwable;)V
@@ -36798,7 +33125,6 @@
 HSPLjava/lang/InheritableThreadLocal;->childValue(Ljava/lang/Object;)Ljava/lang/Object;
 HSPLjava/lang/InheritableThreadLocal;->createMap(Ljava/lang/Thread;Ljava/lang/Object;)V
 HSPLjava/lang/InheritableThreadLocal;->getMap(Ljava/lang/Thread;)Ljava/lang/ThreadLocal$ThreadLocalMap;
-HSPLjava/lang/InstantiationException;-><init>(Ljava/lang/String;)V
 HSPLjava/lang/Integer;-><init>(I)V
 HSPLjava/lang/Integer;->bitCount(I)I
 HSPLjava/lang/Integer;->byteValue()B
@@ -36832,7 +33158,6 @@
 HSPLjava/lang/Integer;->shortValue()S
 HSPLjava/lang/Integer;->signum(I)I
 HSPLjava/lang/Integer;->stringSize(I)I
-HSPLjava/lang/Integer;->sum(II)I
 HSPLjava/lang/Integer;->toBinaryString(I)Ljava/lang/String;
 HSPLjava/lang/Integer;->toHexString(I)Ljava/lang/String;
 HSPLjava/lang/Integer;->toString()Ljava/lang/String;
@@ -36897,7 +33222,6 @@
 HSPLjava/lang/Math;->floorDiv(JJ)J
 HSPLjava/lang/Math;->floorMod(II)I
 HSPLjava/lang/Math;->floorMod(JJ)J
-HSPLjava/lang/Math;->getExponent(D)I
 HSPLjava/lang/Math;->getExponent(F)I
 HSPLjava/lang/Math;->max(DD)D
 HSPLjava/lang/Math;->max(FF)F
@@ -37033,7 +33357,6 @@
 HSPLjava/lang/String;->lastIndexOf([CII[CIII)I
 HSPLjava/lang/String;->length()I
 HSPLjava/lang/String;->matches(Ljava/lang/String;)Z
-HSPLjava/lang/String;->offsetByCodePoints(II)I
 HSPLjava/lang/String;->regionMatches(ILjava/lang/String;II)Z
 HSPLjava/lang/String;->regionMatches(ZILjava/lang/String;II)Z
 HSPLjava/lang/String;->replace(CC)Ljava/lang/String;
@@ -37120,7 +33443,6 @@
 HSPLjava/lang/StringBuilder;->lastIndexOf(Ljava/lang/String;I)I
 HSPLjava/lang/StringBuilder;->length()I
 HSPLjava/lang/StringBuilder;->replace(IILjava/lang/String;)Ljava/lang/StringBuilder;
-HSPLjava/lang/StringBuilder;->reverse()Ljava/lang/StringBuilder;
 HSPLjava/lang/StringBuilder;->setCharAt(IC)V
 HSPLjava/lang/StringBuilder;->setLength(I)V
 HSPLjava/lang/StringBuilder;->subSequence(II)Ljava/lang/CharSequence;
@@ -37129,7 +33451,6 @@
 HSPLjava/lang/StringBuilder;->toString()Ljava/lang/String;
 HSPLjava/lang/StringFactory;->newEmptyString()Ljava/lang/String;
 HSPLjava/lang/StringFactory;->newStringFromBytes([B)Ljava/lang/String;
-HSPLjava/lang/StringFactory;->newStringFromBytes([BI)Ljava/lang/String;
 HSPLjava/lang/StringFactory;->newStringFromBytes([BII)Ljava/lang/String;
 HSPLjava/lang/StringFactory;->newStringFromBytes([BIILjava/lang/String;)Ljava/lang/String;
 HSPLjava/lang/StringFactory;->newStringFromBytes([BIILjava/nio/charset/Charset;)Ljava/lang/String;
@@ -37141,6 +33462,7 @@
 HSPLjava/lang/System$PropertiesWithNonOverrideableDefaults;->remove(Ljava/lang/Object;)Ljava/lang/Object;
 HSPLjava/lang/System;->arraycopy([BI[BII)V
 HSPLjava/lang/System;->arraycopy([CI[CII)V
+HSPLjava/lang/System;->arraycopy([DI[DII)V
 HSPLjava/lang/System;->arraycopy([FI[FII)V
 HSPLjava/lang/System;->arraycopy([II[III)V
 HSPLjava/lang/System;->arraycopy([JI[JII)V
@@ -37148,6 +33470,7 @@
 HSPLjava/lang/System;->checkKey(Ljava/lang/String;)V
 HSPLjava/lang/System;->clearProperty(Ljava/lang/String;)Ljava/lang/String;
 HSPLjava/lang/System;->gc()V
+HSPLjava/lang/System;->getProperties()Ljava/util/Properties;
 HSPLjava/lang/System;->getProperty(Ljava/lang/String;)Ljava/lang/String;
 HSPLjava/lang/System;->getProperty(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
 HSPLjava/lang/System;->getSecurityManager()Ljava/lang/SecurityManager;
@@ -37248,9 +33571,6 @@
 HSPLjava/lang/ThreadLocal;->withInitial(Ljava/util/function/Supplier;)Ljava/lang/ThreadLocal;
 HSPLjava/lang/Throwable$PrintStreamOrWriter;-><init>()V
 HSPLjava/lang/Throwable$PrintStreamOrWriter;-><init>(Ljava/lang/Throwable$1;)V
-HSPLjava/lang/Throwable$WrappedPrintStream;-><init>(Ljava/io/PrintStream;)V
-HSPLjava/lang/Throwable$WrappedPrintStream;->lock()Ljava/lang/Object;
-HSPLjava/lang/Throwable$WrappedPrintStream;->println(Ljava/lang/Object;)V
 HSPLjava/lang/Throwable$WrappedPrintWriter;-><init>(Ljava/io/PrintWriter;)V
 HSPLjava/lang/Throwable$WrappedPrintWriter;->lock()Ljava/lang/Object;
 HSPLjava/lang/Throwable$WrappedPrintWriter;->println(Ljava/lang/Object;)V
@@ -37269,8 +33589,6 @@
 HSPLjava/lang/Throwable;->getSuppressed()[Ljava/lang/Throwable;
 HSPLjava/lang/Throwable;->initCause(Ljava/lang/Throwable;)Ljava/lang/Throwable;
 HSPLjava/lang/Throwable;->printEnclosedStackTrace(Ljava/lang/Throwable$PrintStreamOrWriter;[Ljava/lang/StackTraceElement;Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;)V
-HSPLjava/lang/Throwable;->printStackTrace()V
-HSPLjava/lang/Throwable;->printStackTrace(Ljava/io/PrintStream;)V
 HSPLjava/lang/Throwable;->printStackTrace(Ljava/io/PrintWriter;)V
 HSPLjava/lang/Throwable;->printStackTrace(Ljava/lang/Throwable$PrintStreamOrWriter;)V
 HSPLjava/lang/Throwable;->readObject(Ljava/io/ObjectInputStream;)V
@@ -37291,7 +33609,6 @@
 HSPLjava/lang/UNIXProcess;-><init>([B[BI[BI[B[IZ)V
 HSPLjava/lang/UNIXProcess;->access$100(Ljava/lang/UNIXProcess;)I
 HSPLjava/lang/UNIXProcess;->access$200(Ljava/lang/UNIXProcess;I)I
-HSPLjava/lang/UNIXProcess;->destroy()V
 HSPLjava/lang/UNIXProcess;->getErrorStream()Ljava/io/InputStream;
 HSPLjava/lang/UNIXProcess;->getInputStream()Ljava/io/InputStream;
 HSPLjava/lang/UNIXProcess;->getOutputStream()Ljava/io/OutputStream;
@@ -37415,9 +33732,6 @@
 HSPLjava/lang/reflect/Executable;->isDefaultMethodInternal()Z
 HSPLjava/lang/reflect/Executable;->isSynthetic()Z
 HSPLjava/lang/reflect/Executable;->isVarArgs()Z
-HSPLjava/lang/reflect/Executable;->printModifiersIfNonzero(Ljava/lang/StringBuilder;IZ)V
-HSPLjava/lang/reflect/Executable;->separateWithCommas([Ljava/lang/Class;Ljava/lang/StringBuilder;)V
-HSPLjava/lang/reflect/Executable;->sharedToString(IZ[Ljava/lang/Class;[Ljava/lang/Class;)Ljava/lang/String;
 HSPLjava/lang/reflect/Field;->getAnnotation(Ljava/lang/Class;)Ljava/lang/annotation/Annotation;
 HSPLjava/lang/reflect/Field;->getDeclaringClass()Ljava/lang/Class;
 HSPLjava/lang/reflect/Field;->getGenericType()Ljava/lang/reflect/Type;
@@ -37443,8 +33757,6 @@
 HSPLjava/lang/reflect/Method;->isDefault()Z
 HSPLjava/lang/reflect/Method;->isSynthetic()Z
 HSPLjava/lang/reflect/Method;->isVarArgs()Z
-HSPLjava/lang/reflect/Method;->specificToStringHeader(Ljava/lang/StringBuilder;)V
-HSPLjava/lang/reflect/Method;->toString()Ljava/lang/String;
 HSPLjava/lang/reflect/Modifier;->isAbstract(I)Z
 HSPLjava/lang/reflect/Modifier;->isFinal(I)Z
 HSPLjava/lang/reflect/Modifier;->isPrivate(I)Z
@@ -37454,8 +33766,6 @@
 HSPLjava/lang/reflect/Modifier;->isSynthetic(I)Z
 HSPLjava/lang/reflect/Modifier;->isTransient(I)Z
 HSPLjava/lang/reflect/Modifier;->isVolatile(I)Z
-HSPLjava/lang/reflect/Modifier;->methodModifiers()I
-HSPLjava/lang/reflect/Modifier;->toString(I)Ljava/lang/String;
 HSPLjava/lang/reflect/Proxy$1;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
 HSPLjava/lang/reflect/Proxy$1;->compare(Ljava/lang/reflect/Method;Ljava/lang/reflect/Method;)I
 HSPLjava/lang/reflect/Proxy$Key1;-><init>(Ljava/lang/Class;)V
@@ -37494,7 +33804,6 @@
 HSPLjava/math/BigDecimal;-><init>(D)V
 HSPLjava/math/BigDecimal;-><init>(I)V
 HSPLjava/math/BigDecimal;-><init>(II)V
-HSPLjava/math/BigDecimal;-><init>(J)V
 HSPLjava/math/BigDecimal;-><init>(JI)V
 HSPLjava/math/BigDecimal;-><init>(Ljava/lang/String;)V
 HSPLjava/math/BigDecimal;-><init>(Ljava/math/BigInteger;I)V
@@ -37518,13 +33827,11 @@
 HSPLjava/math/BigDecimal;->roundingBehavior(IILjava/math/RoundingMode;)I
 HSPLjava/math/BigDecimal;->safeLongToInt(J)I
 HSPLjava/math/BigDecimal;->scale()I
-HSPLjava/math/BigDecimal;->setScale(II)Ljava/math/BigDecimal;
 HSPLjava/math/BigDecimal;->setScale(ILjava/math/RoundingMode;)Ljava/math/BigDecimal;
 HSPLjava/math/BigDecimal;->setUnscaledValue(Ljava/math/BigInteger;)V
 HSPLjava/math/BigDecimal;->signum()I
 HSPLjava/math/BigDecimal;->stripTrailingZeros()Ljava/math/BigDecimal;
 HSPLjava/math/BigDecimal;->subtract(Ljava/math/BigDecimal;)Ljava/math/BigDecimal;
-HSPLjava/math/BigDecimal;->toBigInteger()Ljava/math/BigInteger;
 HSPLjava/math/BigDecimal;->toBigIntegerExact()Ljava/math/BigInteger;
 HSPLjava/math/BigDecimal;->toPlainString()Ljava/lang/String;
 HSPLjava/math/BigDecimal;->valueExact(I)J
@@ -37540,7 +33847,6 @@
 HSPLjava/math/BigInt;->decString()Ljava/lang/String;
 HSPLjava/math/BigInt;->division(Ljava/math/BigInt;Ljava/math/BigInt;Ljava/math/BigInt;Ljava/math/BigInt;)V
 HSPLjava/math/BigInt;->exp(Ljava/math/BigInt;I)Ljava/math/BigInt;
-HSPLjava/math/BigInt;->gcd(Ljava/math/BigInt;Ljava/math/BigInt;)Ljava/math/BigInt;
 HSPLjava/math/BigInt;->hasNativeBignum()Z
 HSPLjava/math/BigInt;->isBitSet(I)Z
 HSPLjava/math/BigInt;->littleEndianIntsMagnitude()[I
@@ -37587,7 +33893,6 @@
 HSPLjava/math/BigInteger;->multiply(Ljava/math/BigInteger;)Ljava/math/BigInteger;
 HSPLjava/math/BigInteger;->pow(I)Ljava/math/BigInteger;
 HSPLjava/math/BigInteger;->prepareJavaRepresentation()V
-HSPLjava/math/BigInteger;->readObject(Ljava/io/ObjectInputStream;)V
 HSPLjava/math/BigInteger;->setBigInt(Ljava/math/BigInt;)V
 HSPLjava/math/BigInteger;->setJavaRepresentation(II[I)V
 HSPLjava/math/BigInteger;->shiftLeft(I)Ljava/math/BigInteger;
@@ -37609,7 +33914,6 @@
 HSPLjava/math/MathContext;->getPrecision()I
 HSPLjava/math/MathContext;->getRoundingMode()Ljava/math/RoundingMode;
 HSPLjava/math/Multiplication;->powerOf10(J)Ljava/math/BigInteger;
-HSPLjava/math/RoundingMode;->valueOf(I)Ljava/math/RoundingMode;
 HSPLjava/math/RoundingMode;->values()[Ljava/math/RoundingMode;
 HSPLjava/net/AbstractPlainDatagramSocketImpl;-><init>()V
 HSPLjava/net/AbstractPlainDatagramSocketImpl;->bind(ILjava/net/InetAddress;)V
@@ -37621,9 +33925,7 @@
 HSPLjava/net/AbstractPlainDatagramSocketImpl;->receive(Ljava/net/DatagramPacket;)V
 HSPLjava/net/AbstractPlainDatagramSocketImpl;->setOption(ILjava/lang/Object;)V
 HSPLjava/net/AbstractPlainSocketImpl;-><init>()V
-HSPLjava/net/AbstractPlainSocketImpl;->accept(Ljava/net/SocketImpl;)V
 HSPLjava/net/AbstractPlainSocketImpl;->acquireFD()Ljava/io/FileDescriptor;
-HSPLjava/net/AbstractPlainSocketImpl;->bind(Ljava/net/InetAddress;I)V
 HSPLjava/net/AbstractPlainSocketImpl;->close()V
 HSPLjava/net/AbstractPlainSocketImpl;->connect(Ljava/net/SocketAddress;I)V
 HSPLjava/net/AbstractPlainSocketImpl;->connectToAddress(Ljava/net/InetAddress;II)V
@@ -37637,7 +33939,6 @@
 HSPLjava/net/AbstractPlainSocketImpl;->isClosedOrPending()Z
 HSPLjava/net/AbstractPlainSocketImpl;->isConnectionReset()Z
 HSPLjava/net/AbstractPlainSocketImpl;->isConnectionResetPending()Z
-HSPLjava/net/AbstractPlainSocketImpl;->listen(I)V
 HSPLjava/net/AbstractPlainSocketImpl;->releaseFD()V
 HSPLjava/net/AbstractPlainSocketImpl;->setOption(ILjava/lang/Object;)V
 HSPLjava/net/AbstractPlainSocketImpl;->socketClose()V
@@ -37650,30 +33951,16 @@
 HSPLjava/net/AddressCache;->get(Ljava/lang/String;I)Ljava/lang/Object;
 HSPLjava/net/AddressCache;->put(Ljava/lang/String;I[Ljava/net/InetAddress;)V
 HSPLjava/net/AddressCache;->putUnknownHost(Ljava/lang/String;ILjava/lang/String;)V
-HSPLjava/net/ConnectException;-><init>(Ljava/lang/String;)V
-HSPLjava/net/ConnectException;-><init>(Ljava/lang/String;Ljava/lang/Throwable;)V
 HSPLjava/net/CookieHandler;-><init>()V
 HSPLjava/net/CookieHandler;->getDefault()Ljava/net/CookieHandler;
-HSPLjava/net/CookieHandler;->setDefault(Ljava/net/CookieHandler;)V
-HSPLjava/net/CookieManager$CookiePathComparator;-><init>()V
-HSPLjava/net/CookieManager$CookiePathComparator;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
-HSPLjava/net/CookieManager$CookiePathComparator;->compare(Ljava/net/HttpCookie;Ljava/net/HttpCookie;)I
 HSPLjava/net/CookieManager;-><init>()V
 HSPLjava/net/CookieManager;-><init>(Ljava/net/CookieStore;Ljava/net/CookiePolicy;)V
 HSPLjava/net/CookieManager;->get(Ljava/net/URI;Ljava/util/Map;)Ljava/util/Map;
-HSPLjava/net/CookieManager;->getCookieStore()Ljava/net/CookieStore;
-HSPLjava/net/CookieManager;->normalizePath(Ljava/lang/String;)Ljava/lang/String;
-HSPLjava/net/CookieManager;->pathMatches(Ljava/net/URI;Ljava/net/HttpCookie;)Z
 HSPLjava/net/CookieManager;->put(Ljava/net/URI;Ljava/util/Map;)V
-HSPLjava/net/CookieManager;->shouldAcceptInternal(Ljava/net/URI;Ljava/net/HttpCookie;)Z
-HSPLjava/net/CookieManager;->sortByPath(Ljava/util/List;)Ljava/util/List;
-HSPLjava/net/CookiePolicy$3;->shouldAccept(Ljava/net/URI;Ljava/net/HttpCookie;)Z
 HSPLjava/net/DatagramPacket;-><init>([BI)V
 HSPLjava/net/DatagramPacket;-><init>([BII)V
 HSPLjava/net/DatagramPacket;-><init>([BIILjava/net/InetAddress;I)V
-HSPLjava/net/DatagramPacket;-><init>([BIILjava/net/SocketAddress;)V
 HSPLjava/net/DatagramPacket;-><init>([BILjava/net/InetAddress;I)V
-HSPLjava/net/DatagramPacket;-><init>([BILjava/net/SocketAddress;)V
 HSPLjava/net/DatagramPacket;->getAddress()Ljava/net/InetAddress;
 HSPLjava/net/DatagramPacket;->getData()[B
 HSPLjava/net/DatagramPacket;->getLength()I
@@ -37683,7 +33970,6 @@
 HSPLjava/net/DatagramPacket;->setData([BII)V
 HSPLjava/net/DatagramPacket;->setPort(I)V
 HSPLjava/net/DatagramPacket;->setReceivedLength(I)V
-HSPLjava/net/DatagramPacket;->setSocketAddress(Ljava/net/SocketAddress;)V
 HSPLjava/net/DatagramSocket$1;-><init>(Ljava/net/DatagramSocket;)V
 HSPLjava/net/DatagramSocket$1;->run()Ljava/lang/Object;
 HSPLjava/net/DatagramSocket$1;->run()Ljava/lang/Void;
@@ -37701,7 +33987,6 @@
 HSPLjava/net/DatagramSocket;->isClosed()Z
 HSPLjava/net/DatagramSocket;->receive(Ljava/net/DatagramPacket;)V
 HSPLjava/net/DatagramSocket;->send(Ljava/net/DatagramPacket;)V
-HSPLjava/net/DatagramSocket;->setReuseAddress(Z)V
 HSPLjava/net/DatagramSocket;->setSoTimeout(I)V
 HSPLjava/net/DatagramSocketImpl;-><init>()V
 HSPLjava/net/DatagramSocketImpl;->setDatagramSocket(Ljava/net/DatagramSocket;)V
@@ -37709,20 +33994,14 @@
 HSPLjava/net/HttpCookie$11;->assign(Ljava/net/HttpCookie;Ljava/lang/String;Ljava/lang/String;)V
 HSPLjava/net/HttpCookie$4;->assign(Ljava/net/HttpCookie;Ljava/lang/String;Ljava/lang/String;)V
 HSPLjava/net/HttpCookie$6;->assign(Ljava/net/HttpCookie;Ljava/lang/String;Ljava/lang/String;)V
-HSPLjava/net/HttpCookie$8;->assign(Ljava/net/HttpCookie;Ljava/lang/String;Ljava/lang/String;)V
-HSPLjava/net/HttpCookie$9;->assign(Ljava/net/HttpCookie;Ljava/lang/String;Ljava/lang/String;)V
 HSPLjava/net/HttpCookie;-><init>(Ljava/lang/String;Ljava/lang/String;)V
 HSPLjava/net/HttpCookie;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
 HSPLjava/net/HttpCookie;->access$000(Ljava/net/HttpCookie;)J
 HSPLjava/net/HttpCookie;->assignAttribute(Ljava/net/HttpCookie;Ljava/lang/String;Ljava/lang/String;)V
-HSPLjava/net/HttpCookie;->domainMatches(Ljava/lang/String;Ljava/lang/String;)Z
-HSPLjava/net/HttpCookie;->equals(Ljava/lang/Object;)Z
-HSPLjava/net/HttpCookie;->equalsIgnoreCase(Ljava/lang/String;Ljava/lang/String;)Z
 HSPLjava/net/HttpCookie;->getDomain()Ljava/lang/String;
 HSPLjava/net/HttpCookie;->getMaxAge()J
 HSPLjava/net/HttpCookie;->getName()Ljava/lang/String;
 HSPLjava/net/HttpCookie;->getPath()Ljava/lang/String;
-HSPLjava/net/HttpCookie;->getPortlist()Ljava/lang/String;
 HSPLjava/net/HttpCookie;->getValue()Ljava/lang/String;
 HSPLjava/net/HttpCookie;->getVersion()I
 HSPLjava/net/HttpCookie;->guessCookieVersion(Ljava/lang/String;)I
@@ -37732,10 +34011,8 @@
 HSPLjava/net/HttpCookie;->parse(Ljava/lang/String;Z)Ljava/util/List;
 HSPLjava/net/HttpCookie;->parseInternal(Ljava/lang/String;Z)Ljava/net/HttpCookie;
 HSPLjava/net/HttpCookie;->setDomain(Ljava/lang/String;)V
-HSPLjava/net/HttpCookie;->setHttpOnly(Z)V
 HSPLjava/net/HttpCookie;->setMaxAge(J)V
 HSPLjava/net/HttpCookie;->setPath(Ljava/lang/String;)V
-HSPLjava/net/HttpCookie;->setSecure(Z)V
 HSPLjava/net/HttpCookie;->setVersion(I)V
 HSPLjava/net/HttpCookie;->startsWithIgnoreCase(Ljava/lang/String;Ljava/lang/String;)Z
 HSPLjava/net/HttpCookie;->stripOffSurroundingQuote(Ljava/lang/String;)Ljava/lang/String;
@@ -37744,20 +34021,14 @@
 HSPLjava/net/HttpURLConnection;-><init>(Ljava/net/URL;)V
 HSPLjava/net/HttpURLConnection;->getFollowRedirects()Z
 HSPLjava/net/HttpURLConnection;->setChunkedStreamingMode(I)V
-HSPLjava/net/HttpURLConnection;->setRequestMethod(Ljava/lang/String;)V
 HSPLjava/net/IDN;->toASCII(Ljava/lang/String;)Ljava/lang/String;
 HSPLjava/net/IDN;->toASCII(Ljava/lang/String;I)Ljava/lang/String;
 HSPLjava/net/InMemoryCookieStore;-><init>()V
 HSPLjava/net/InMemoryCookieStore;-><init>(I)V
-HSPLjava/net/InMemoryCookieStore;->add(Ljava/net/URI;Ljava/net/HttpCookie;)V
-HSPLjava/net/InMemoryCookieStore;->addIndex(Ljava/util/Map;Ljava/lang/Object;Ljava/net/HttpCookie;)V
 HSPLjava/net/InMemoryCookieStore;->get(Ljava/net/URI;)Ljava/util/List;
-HSPLjava/net/InMemoryCookieStore;->getCookies()Ljava/util/List;
 HSPLjava/net/InMemoryCookieStore;->getEffectiveURI(Ljava/net/URI;)Ljava/net/URI;
 HSPLjava/net/InMemoryCookieStore;->getInternal1(Ljava/util/List;Ljava/util/Map;Ljava/lang/String;)V
 HSPLjava/net/InMemoryCookieStore;->getInternal2(Ljava/util/List;Ljava/util/Map;Ljava/lang/Comparable;)V
-HSPLjava/net/InMemoryCookieStore;->netscapeDomainMatches(Ljava/lang/String;Ljava/lang/String;)Z
-HSPLjava/net/Inet4Address;-><init>()V
 HSPLjava/net/Inet4Address;-><init>(Ljava/lang/String;[B)V
 HSPLjava/net/Inet4Address;->equals(Ljava/lang/Object;)Z
 HSPLjava/net/Inet4Address;->getAddress()[B
@@ -37777,9 +34048,7 @@
 HSPLjava/net/Inet6Address$Inet6AddressHolder;->isLinkLocalAddress()Z
 HSPLjava/net/Inet6Address$Inet6AddressHolder;->isLoopbackAddress()Z
 HSPLjava/net/Inet6Address$Inet6AddressHolder;->isMulticastAddress()Z
-HSPLjava/net/Inet6Address$Inet6AddressHolder;->isSiteLocalAddress()Z
 HSPLjava/net/Inet6Address$Inet6AddressHolder;->setAddr([B)V
-HSPLjava/net/Inet6Address;-><init>()V
 HSPLjava/net/Inet6Address;-><init>(Ljava/lang/String;[BI)V
 HSPLjava/net/Inet6Address;->equals(Ljava/lang/Object;)Z
 HSPLjava/net/Inet6Address;->getAddress()[B
@@ -37791,7 +34060,6 @@
 HSPLjava/net/Inet6Address;->isLinkLocalAddress()Z
 HSPLjava/net/Inet6Address;->isLoopbackAddress()Z
 HSPLjava/net/Inet6Address;->isMulticastAddress()Z
-HSPLjava/net/Inet6Address;->isSiteLocalAddress()Z
 HSPLjava/net/Inet6AddressImpl;->clearAddressCache()V
 HSPLjava/net/Inet6AddressImpl;->lookupAllHostAddr(Ljava/lang/String;I)[Ljava/net/InetAddress;
 HSPLjava/net/Inet6AddressImpl;->lookupHostByName(Ljava/lang/String;I)[Ljava/net/InetAddress;
@@ -37802,13 +34070,11 @@
 HSPLjava/net/InetAddress;-><init>()V
 HSPLjava/net/InetAddress;->clearDnsCache()V
 HSPLjava/net/InetAddress;->getAllByName(Ljava/lang/String;)[Ljava/net/InetAddress;
-HSPLjava/net/InetAddress;->getAllByNameOnNet(Ljava/lang/String;I)[Ljava/net/InetAddress;
 HSPLjava/net/InetAddress;->getByAddress(Ljava/lang/String;[B)Ljava/net/InetAddress;
 HSPLjava/net/InetAddress;->getByAddress(Ljava/lang/String;[BI)Ljava/net/InetAddress;
 HSPLjava/net/InetAddress;->getByAddress([B)Ljava/net/InetAddress;
 HSPLjava/net/InetAddress;->getByName(Ljava/lang/String;)Ljava/net/InetAddress;
 HSPLjava/net/InetAddress;->getByNameOnNet(Ljava/lang/String;I)Ljava/net/InetAddress;
-HSPLjava/net/InetAddress;->getHostName()Ljava/lang/String;
 HSPLjava/net/InetAddress;->holder()Ljava/net/InetAddress$InetAddressHolder;
 HSPLjava/net/InetAddress;->parseNumericAddress(Ljava/lang/String;)Ljava/net/InetAddress;
 HSPLjava/net/InetAddress;->toString()Ljava/lang/String;
@@ -37816,12 +34082,10 @@
 HSPLjava/net/InetSocketAddress$InetSocketAddressHolder;-><init>(Ljava/lang/String;Ljava/net/InetAddress;ILjava/net/InetSocketAddress$1;)V
 HSPLjava/net/InetSocketAddress$InetSocketAddressHolder;->access$400(Ljava/net/InetSocketAddress$InetSocketAddressHolder;)I
 HSPLjava/net/InetSocketAddress$InetSocketAddressHolder;->access$500(Ljava/net/InetSocketAddress$InetSocketAddressHolder;)Ljava/net/InetAddress;
-HSPLjava/net/InetSocketAddress$InetSocketAddressHolder;->access$600(Ljava/net/InetSocketAddress$InetSocketAddressHolder;)Ljava/lang/String;
 HSPLjava/net/InetSocketAddress$InetSocketAddressHolder;->access$700(Ljava/net/InetSocketAddress$InetSocketAddressHolder;)Ljava/lang/String;
 HSPLjava/net/InetSocketAddress$InetSocketAddressHolder;->access$800(Ljava/net/InetSocketAddress$InetSocketAddressHolder;)Z
 HSPLjava/net/InetSocketAddress$InetSocketAddressHolder;->equals(Ljava/lang/Object;)Z
 HSPLjava/net/InetSocketAddress$InetSocketAddressHolder;->getAddress()Ljava/net/InetAddress;
-HSPLjava/net/InetSocketAddress$InetSocketAddressHolder;->getHostName()Ljava/lang/String;
 HSPLjava/net/InetSocketAddress$InetSocketAddressHolder;->getHostString()Ljava/lang/String;
 HSPLjava/net/InetSocketAddress$InetSocketAddressHolder;->getPort()I
 HSPLjava/net/InetSocketAddress$InetSocketAddressHolder;->hashCode()I
@@ -37837,7 +34101,6 @@
 HSPLjava/net/InetSocketAddress;->createUnresolved(Ljava/lang/String;I)Ljava/net/InetSocketAddress;
 HSPLjava/net/InetSocketAddress;->equals(Ljava/lang/Object;)Z
 HSPLjava/net/InetSocketAddress;->getAddress()Ljava/net/InetAddress;
-HSPLjava/net/InetSocketAddress;->getHostName()Ljava/lang/String;
 HSPLjava/net/InetSocketAddress;->getHostString()Ljava/lang/String;
 HSPLjava/net/InetSocketAddress;->getPort()I
 HSPLjava/net/InetSocketAddress;->hashCode()I
@@ -37845,15 +34108,9 @@
 HSPLjava/net/InetSocketAddress;->toString()Ljava/lang/String;
 HSPLjava/net/InterfaceAddress;-><init>(Ljava/net/InetAddress;Ljava/net/Inet4Address;Ljava/net/InetAddress;)V
 HSPLjava/net/InterfaceAddress;->countPrefixLength(Ljava/net/InetAddress;)S
-HSPLjava/net/InterfaceAddress;->getAddress()Ljava/net/InetAddress;
 HSPLjava/net/JarURLConnection;-><init>(Ljava/net/URL;)V
 HSPLjava/net/JarURLConnection;->getEntryName()Ljava/lang/String;
 HSPLjava/net/JarURLConnection;->parseSpecs(Ljava/net/URL;)V
-HSPLjava/net/MalformedURLException;-><init>(Ljava/lang/String;)V
-HSPLjava/net/MulticastSocket;-><init>(I)V
-HSPLjava/net/MulticastSocket;-><init>(Ljava/net/SocketAddress;)V
-HSPLjava/net/MulticastSocket;->setNetworkInterface(Ljava/net/NetworkInterface;)V
-HSPLjava/net/MulticastSocket;->setTimeToLive(I)V
 HSPLjava/net/NetworkInterface$1checkedAddresses;-><init>(Ljava/net/NetworkInterface;)V
 HSPLjava/net/NetworkInterface$1checkedAddresses;->hasMoreElements()Z
 HSPLjava/net/NetworkInterface$1checkedAddresses;->nextElement()Ljava/lang/Object;
@@ -37862,17 +34119,11 @@
 HSPLjava/net/NetworkInterface;->access$000(Ljava/net/NetworkInterface;)[Ljava/net/InetAddress;
 HSPLjava/net/NetworkInterface;->getAll()[Ljava/net/NetworkInterface;
 HSPLjava/net/NetworkInterface;->getByName(Ljava/lang/String;)Ljava/net/NetworkInterface;
-HSPLjava/net/NetworkInterface;->getFlags()I
+HSPLjava/net/NetworkInterface;->getHardwareAddress()[B
 HSPLjava/net/NetworkInterface;->getIndex()I
 HSPLjava/net/NetworkInterface;->getInetAddresses()Ljava/util/Enumeration;
-HSPLjava/net/NetworkInterface;->getInterfaceAddresses()Ljava/util/List;
 HSPLjava/net/NetworkInterface;->getName()Ljava/lang/String;
 HSPLjava/net/NetworkInterface;->getNetworkInterfaces()Ljava/util/Enumeration;
-HSPLjava/net/NetworkInterface;->isLoopback()Z
-HSPLjava/net/NetworkInterface;->isPointToPoint()Z
-HSPLjava/net/NetworkInterface;->isUp()Z
-HSPLjava/net/NetworkInterface;->isVirtual()Z
-HSPLjava/net/NetworkInterface;->supportsMulticast()Z
 HSPLjava/net/Parts;-><init>(Ljava/lang/String;Ljava/lang/String;)V
 HSPLjava/net/Parts;->getPath()Ljava/lang/String;
 HSPLjava/net/Parts;->getQuery()Ljava/lang/String;
@@ -37882,23 +34133,15 @@
 HSPLjava/net/PlainDatagramSocketImpl;->datagramSocketClose()V
 HSPLjava/net/PlainDatagramSocketImpl;->datagramSocketCreate()V
 HSPLjava/net/PlainDatagramSocketImpl;->doRecv(Ljava/net/DatagramPacket;I)V
-HSPLjava/net/PlainDatagramSocketImpl;->join(Ljava/net/InetAddress;Ljava/net/NetworkInterface;)V
-HSPLjava/net/PlainDatagramSocketImpl;->leave(Ljava/net/InetAddress;Ljava/net/NetworkInterface;)V
 HSPLjava/net/PlainDatagramSocketImpl;->receive0(Ljava/net/DatagramPacket;)V
 HSPLjava/net/PlainDatagramSocketImpl;->send(Ljava/net/DatagramPacket;)V
-HSPLjava/net/PlainDatagramSocketImpl;->setTimeToLive(I)V
 HSPLjava/net/PlainDatagramSocketImpl;->socketGetOption(I)Ljava/lang/Object;
-HSPLjava/net/PlainDatagramSocketImpl;->socketSetOption(ILjava/lang/Object;)V
-HSPLjava/net/PlainDatagramSocketImpl;->socketSetOption0(ILjava/lang/Object;)V
 HSPLjava/net/PlainSocketImpl;-><init>()V
 HSPLjava/net/PlainSocketImpl;->getMarkerFD()Ljava/io/FileDescriptor;
-HSPLjava/net/PlainSocketImpl;->socketAccept(Ljava/net/SocketImpl;)V
-HSPLjava/net/PlainSocketImpl;->socketBind(Ljava/net/InetAddress;I)V
 HSPLjava/net/PlainSocketImpl;->socketClose0(Z)V
 HSPLjava/net/PlainSocketImpl;->socketConnect(Ljava/net/InetAddress;II)V
 HSPLjava/net/PlainSocketImpl;->socketCreate(Z)V
 HSPLjava/net/PlainSocketImpl;->socketGetOption(I)Ljava/lang/Object;
-HSPLjava/net/PlainSocketImpl;->socketListen(I)V
 HSPLjava/net/PlainSocketImpl;->socketSetOption(ILjava/lang/Object;)V
 HSPLjava/net/PlainSocketImpl;->socketSetOption0(ILjava/lang/Object;)V
 HSPLjava/net/Proxy;->address()Ljava/net/SocketAddress;
@@ -37908,21 +34151,6 @@
 HSPLjava/net/ProxySelector;->getDefault()Ljava/net/ProxySelector;
 HSPLjava/net/ProxySelector;->setDefault(Ljava/net/ProxySelector;)V
 HSPLjava/net/ResponseCache;->getDefault()Ljava/net/ResponseCache;
-HSPLjava/net/ServerSocket;-><init>()V
-HSPLjava/net/ServerSocket;->accept()Ljava/net/Socket;
-HSPLjava/net/ServerSocket;->bind(Ljava/net/SocketAddress;)V
-HSPLjava/net/ServerSocket;->bind(Ljava/net/SocketAddress;I)V
-HSPLjava/net/ServerSocket;->createImpl()V
-HSPLjava/net/ServerSocket;->getImpl()Ljava/net/SocketImpl;
-HSPLjava/net/ServerSocket;->implAccept(Ljava/net/Socket;)V
-HSPLjava/net/ServerSocket;->isBound()Z
-HSPLjava/net/ServerSocket;->isClosed()Z
-HSPLjava/net/ServerSocket;->setBound()V
-HSPLjava/net/ServerSocket;->setCreated()V
-HSPLjava/net/ServerSocket;->setImpl()V
-HSPLjava/net/Socket$1;-><init>(Ljava/net/Socket;)V
-HSPLjava/net/Socket$1;->run()Ljava/lang/Boolean;
-HSPLjava/net/Socket$1;->run()Ljava/lang/Object;
 HSPLjava/net/Socket$2;-><init>(Ljava/net/Socket;)V
 HSPLjava/net/Socket$2;->run()Ljava/io/InputStream;
 HSPLjava/net/Socket$2;->run()Ljava/lang/Object;
@@ -37934,7 +34162,6 @@
 HSPLjava/net/Socket;-><init>(Ljava/net/SocketImpl;)V
 HSPLjava/net/Socket;-><init>([Ljava/net/InetAddress;ILjava/net/SocketAddress;Z)V
 HSPLjava/net/Socket;->checkAddress(Ljava/net/InetAddress;Ljava/lang/String;)V
-HSPLjava/net/Socket;->checkOldImpl()V
 HSPLjava/net/Socket;->close()V
 HSPLjava/net/Socket;->connect(Ljava/net/SocketAddress;)V
 HSPLjava/net/Socket;->connect(Ljava/net/SocketAddress;I)V
@@ -37963,7 +34190,6 @@
 HSPLjava/net/Socket;->setImpl()V
 HSPLjava/net/Socket;->setSoTimeout(I)V
 HSPLjava/net/Socket;->setTcpNoDelay(Z)V
-HSPLjava/net/Socket;->toString()Ljava/lang/String;
 HSPLjava/net/SocketAddress;-><init>()V
 HSPLjava/net/SocketException;-><init>(Ljava/lang/String;)V
 HSPLjava/net/SocketException;-><init>(Ljava/lang/String;Ljava/lang/Throwable;)V
@@ -37973,7 +34199,6 @@
 HSPLjava/net/SocketImpl;->getLocalPort()I
 HSPLjava/net/SocketImpl;->getPort()I
 HSPLjava/net/SocketImpl;->getSocket()Ljava/net/Socket;
-HSPLjava/net/SocketImpl;->setServerSocket(Ljava/net/ServerSocket;)V
 HSPLjava/net/SocketImpl;->setSocket(Ljava/net/Socket;)V
 HSPLjava/net/SocketInputStream;-><init>(Ljava/net/AbstractPlainSocketImpl;)V
 HSPLjava/net/SocketInputStream;->finalize()V
@@ -37997,7 +34222,6 @@
 HSPLjava/net/URI$Parser;->charAt(I)C
 HSPLjava/net/URI$Parser;->checkChar(IJJLjava/lang/String;)V
 HSPLjava/net/URI$Parser;->checkChars(IIJJLjava/lang/String;)V
-HSPLjava/net/URI$Parser;->fail(Ljava/lang/String;I)V
 HSPLjava/net/URI$Parser;->parse(Z)V
 HSPLjava/net/URI$Parser;->parseAuthority(II)I
 HSPLjava/net/URI$Parser;->parseHierarchical(II)I
@@ -38007,7 +34231,6 @@
 HSPLjava/net/URI$Parser;->scan(IIC)I
 HSPLjava/net/URI$Parser;->scan(IIJJ)I
 HSPLjava/net/URI$Parser;->scan(IILjava/lang/String;Ljava/lang/String;)I
-HSPLjava/net/URI$Parser;->scanByte(II)I
 HSPLjava/net/URI$Parser;->scanEscape(IIC)I
 HSPLjava/net/URI$Parser;->scanIPv4Address(IIZ)I
 HSPLjava/net/URI$Parser;->substring(II)Ljava/lang/String;
@@ -38050,10 +34273,6 @@
 HSPLjava/net/URI;->appendFragment(Ljava/lang/StringBuffer;Ljava/lang/String;)V
 HSPLjava/net/URI;->appendSchemeSpecificPart(Ljava/lang/StringBuffer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)V
 HSPLjava/net/URI;->checkPath(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-HSPLjava/net/URI;->compare(Ljava/lang/String;Ljava/lang/String;)I
-HSPLjava/net/URI;->compareIgnoringCase(Ljava/lang/String;Ljava/lang/String;)I
-HSPLjava/net/URI;->compareTo(Ljava/lang/Object;)I
-HSPLjava/net/URI;->compareTo(Ljava/net/URI;)I
 HSPLjava/net/URI;->create(Ljava/lang/String;)Ljava/net/URI;
 HSPLjava/net/URI;->decode(Ljava/lang/String;)Ljava/lang/String;
 HSPLjava/net/URI;->defineString()V
@@ -38082,12 +34301,8 @@
 HSPLjava/net/URI;->toLower(C)I
 HSPLjava/net/URI;->toString()Ljava/lang/String;
 HSPLjava/net/URI;->toString(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLjava/net/URI;->toURL()Ljava/net/URL;
-HSPLjava/net/URISyntaxException;-><init>(Ljava/lang/String;Ljava/lang/String;I)V
 HSPLjava/net/URL;-><init>(Ljava/lang/String;)V
-HSPLjava/net/URL;-><init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;)V
 HSPLjava/net/URL;-><init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/net/URLStreamHandler;)V
-HSPLjava/net/URL;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
 HSPLjava/net/URL;-><init>(Ljava/net/URL;Ljava/lang/String;)V
 HSPLjava/net/URL;-><init>(Ljava/net/URL;Ljava/lang/String;Ljava/net/URLStreamHandler;)V
 HSPLjava/net/URL;->createBuiltinHandler(Ljava/lang/String;)Ljava/net/URLStreamHandler;
@@ -38113,16 +34328,12 @@
 HSPLjava/net/URLConnection;->getContentLengthLong()J
 HSPLjava/net/URLConnection;->getContentType()Ljava/lang/String;
 HSPLjava/net/URLConnection;->getHeaderFieldLong(Ljava/lang/String;J)J
-HSPLjava/net/URLConnection;->getReadTimeout()I
 HSPLjava/net/URLConnection;->getURL()Ljava/net/URL;
 HSPLjava/net/URLConnection;->getUseCaches()Z
-HSPLjava/net/URLConnection;->setDefaultUseCaches(Z)V
 HSPLjava/net/URLConnection;->setDoInput(Z)V
 HSPLjava/net/URLConnection;->setDoOutput(Z)V
-HSPLjava/net/URLConnection;->setReadTimeout(I)V
 HSPLjava/net/URLConnection;->setUseCaches(Z)V
 HSPLjava/net/URLDecoder;->decode(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLjava/net/URLDecoder;->isValidHexChar(C)Z
 HSPLjava/net/URLEncoder;->encode(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
 HSPLjava/net/URLStreamHandler;-><init>()V
 HSPLjava/net/URLStreamHandler;->parseURL(Ljava/net/URL;Ljava/lang/String;II)V
@@ -38135,7 +34346,6 @@
 HSPLjava/nio/Bits;->getDouble(Ljava/nio/ByteBuffer;IZ)D
 HSPLjava/nio/Bits;->getDoubleL(Ljava/nio/ByteBuffer;I)D
 HSPLjava/nio/Bits;->getFloat(Ljava/nio/ByteBuffer;IZ)F
-HSPLjava/nio/Bits;->getFloatB(Ljava/nio/ByteBuffer;I)F
 HSPLjava/nio/Bits;->getFloatL(Ljava/nio/ByteBuffer;I)F
 HSPLjava/nio/Bits;->getInt(Ljava/nio/ByteBuffer;IZ)I
 HSPLjava/nio/Bits;->getIntB(Ljava/nio/ByteBuffer;I)I
@@ -38167,7 +34377,6 @@
 HSPLjava/nio/Bits;->putCharB(Ljava/nio/ByteBuffer;IC)V
 HSPLjava/nio/Bits;->putCharL(Ljava/nio/ByteBuffer;IC)V
 HSPLjava/nio/Bits;->putFloat(Ljava/nio/ByteBuffer;IFZ)V
-HSPLjava/nio/Bits;->putFloatB(Ljava/nio/ByteBuffer;IF)V
 HSPLjava/nio/Bits;->putInt(Ljava/nio/ByteBuffer;IIZ)V
 HSPLjava/nio/Bits;->putIntB(Ljava/nio/ByteBuffer;II)V
 HSPLjava/nio/Bits;->putIntL(Ljava/nio/ByteBuffer;II)V
@@ -38211,7 +34420,6 @@
 HSPLjava/nio/ByteBuffer;->arrayOffset()I
 HSPLjava/nio/ByteBuffer;->clear()Ljava/nio/Buffer;
 HSPLjava/nio/ByteBuffer;->compare(BB)I
-HSPLjava/nio/ByteBuffer;->compareTo(Ljava/lang/Object;)I
 HSPLjava/nio/ByteBuffer;->compareTo(Ljava/nio/ByteBuffer;)I
 HSPLjava/nio/ByteBuffer;->equals(BB)Z
 HSPLjava/nio/ByteBuffer;->equals(Ljava/lang/Object;)Z
@@ -38242,21 +34450,14 @@
 HSPLjava/nio/ByteBufferAsCharBuffer;->toString(II)Ljava/lang/String;
 HSPLjava/nio/ByteBufferAsFloatBuffer;-><init>(Ljava/nio/ByteBuffer;IIIIILjava/nio/ByteOrder;)V
 HSPLjava/nio/ByteBufferAsFloatBuffer;->ix(I)I
-HSPLjava/nio/ByteBufferAsFloatBuffer;->put(F)Ljava/nio/FloatBuffer;
 HSPLjava/nio/ByteBufferAsFloatBuffer;->put(IF)Ljava/nio/FloatBuffer;
 HSPLjava/nio/ByteBufferAsFloatBuffer;->put([FII)Ljava/nio/FloatBuffer;
 HSPLjava/nio/ByteBufferAsIntBuffer;-><init>(Ljava/nio/ByteBuffer;IIIIILjava/nio/ByteOrder;)V
-HSPLjava/nio/ByteBufferAsIntBuffer;->get()I
-HSPLjava/nio/ByteBufferAsIntBuffer;->get(I)I
 HSPLjava/nio/ByteBufferAsIntBuffer;->get([III)Ljava/nio/IntBuffer;
 HSPLjava/nio/ByteBufferAsIntBuffer;->ix(I)I
-HSPLjava/nio/ByteBufferAsIntBuffer;->put(I)Ljava/nio/IntBuffer;
-HSPLjava/nio/ByteBufferAsIntBuffer;->put(II)Ljava/nio/IntBuffer;
-HSPLjava/nio/ByteBufferAsIntBuffer;->put([III)Ljava/nio/IntBuffer;
 HSPLjava/nio/ByteBufferAsLongBuffer;-><init>(Ljava/nio/ByteBuffer;IIIIILjava/nio/ByteOrder;)V
 HSPLjava/nio/ByteBufferAsLongBuffer;->get([JII)Ljava/nio/LongBuffer;
 HSPLjava/nio/ByteBufferAsLongBuffer;->ix(I)I
-HSPLjava/nio/ByteBufferAsLongBuffer;->put([JII)Ljava/nio/LongBuffer;
 HSPLjava/nio/ByteBufferAsShortBuffer;-><init>(Ljava/nio/ByteBuffer;IIIIILjava/nio/ByteOrder;)V
 HSPLjava/nio/ByteBufferAsShortBuffer;->get([SII)Ljava/nio/ShortBuffer;
 HSPLjava/nio/ByteBufferAsShortBuffer;->ix(I)I
@@ -38304,17 +34505,11 @@
 HSPLjava/nio/DirectByteBuffer;->getChar()C
 HSPLjava/nio/DirectByteBuffer;->getChar(I)C
 HSPLjava/nio/DirectByteBuffer;->getCharUnchecked(I)C
-HSPLjava/nio/DirectByteBuffer;->getDouble(I)D
-HSPLjava/nio/DirectByteBuffer;->getDouble(J)D
-HSPLjava/nio/DirectByteBuffer;->getFloat()F
-HSPLjava/nio/DirectByteBuffer;->getFloat(J)F
 HSPLjava/nio/DirectByteBuffer;->getInt()I
 HSPLjava/nio/DirectByteBuffer;->getInt(I)I
 HSPLjava/nio/DirectByteBuffer;->getInt(J)I
-HSPLjava/nio/DirectByteBuffer;->getLong()J
 HSPLjava/nio/DirectByteBuffer;->getLong(I)J
 HSPLjava/nio/DirectByteBuffer;->getLong(J)J
-HSPLjava/nio/DirectByteBuffer;->getShort()S
 HSPLjava/nio/DirectByteBuffer;->getShort(I)S
 HSPLjava/nio/DirectByteBuffer;->getShort(J)S
 HSPLjava/nio/DirectByteBuffer;->getUnchecked(I[CII)V
@@ -38325,7 +34520,6 @@
 HSPLjava/nio/DirectByteBuffer;->isReadOnly()Z
 HSPLjava/nio/DirectByteBuffer;->ix(I)J
 HSPLjava/nio/DirectByteBuffer;->put(B)Ljava/nio/ByteBuffer;
-HSPLjava/nio/DirectByteBuffer;->put(IB)Ljava/nio/ByteBuffer;
 HSPLjava/nio/DirectByteBuffer;->put(JB)Ljava/nio/ByteBuffer;
 HSPLjava/nio/DirectByteBuffer;->put(Ljava/nio/ByteBuffer;)Ljava/nio/ByteBuffer;
 HSPLjava/nio/DirectByteBuffer;->put([BII)Ljava/nio/ByteBuffer;
@@ -38335,7 +34529,6 @@
 HSPLjava/nio/DirectByteBuffer;->putInt(I)Ljava/nio/ByteBuffer;
 HSPLjava/nio/DirectByteBuffer;->putInt(II)Ljava/nio/ByteBuffer;
 HSPLjava/nio/DirectByteBuffer;->putInt(JI)Ljava/nio/ByteBuffer;
-HSPLjava/nio/DirectByteBuffer;->putLong(IJ)Ljava/nio/ByteBuffer;
 HSPLjava/nio/DirectByteBuffer;->putLong(J)Ljava/nio/ByteBuffer;
 HSPLjava/nio/DirectByteBuffer;->putLong(JJ)Ljava/nio/ByteBuffer;
 HSPLjava/nio/DirectByteBuffer;->putShort(JS)Ljava/nio/ByteBuffer;
@@ -38357,7 +34550,6 @@
 HSPLjava/nio/HeapByteBuffer;->_get(I)B
 HSPLjava/nio/HeapByteBuffer;->_put(IB)V
 HSPLjava/nio/HeapByteBuffer;->asIntBuffer()Ljava/nio/IntBuffer;
-HSPLjava/nio/HeapByteBuffer;->asLongBuffer()Ljava/nio/LongBuffer;
 HSPLjava/nio/HeapByteBuffer;->asReadOnlyBuffer()Ljava/nio/ByteBuffer;
 HSPLjava/nio/HeapByteBuffer;->asShortBuffer()Ljava/nio/ShortBuffer;
 HSPLjava/nio/HeapByteBuffer;->compact()Ljava/nio/ByteBuffer;
@@ -38370,14 +34562,11 @@
 HSPLjava/nio/HeapByteBuffer;->getFloat(I)F
 HSPLjava/nio/HeapByteBuffer;->getInt()I
 HSPLjava/nio/HeapByteBuffer;->getInt(I)I
-HSPLjava/nio/HeapByteBuffer;->getIntUnchecked(I)I
 HSPLjava/nio/HeapByteBuffer;->getLong()J
 HSPLjava/nio/HeapByteBuffer;->getLong(I)J
 HSPLjava/nio/HeapByteBuffer;->getShort()S
 HSPLjava/nio/HeapByteBuffer;->getShort(I)S
 HSPLjava/nio/HeapByteBuffer;->getUnchecked(I[III)V
-HSPLjava/nio/HeapByteBuffer;->getUnchecked(I[JII)V
-HSPLjava/nio/HeapByteBuffer;->getUnchecked(I[SII)V
 HSPLjava/nio/HeapByteBuffer;->isDirect()Z
 HSPLjava/nio/HeapByteBuffer;->isReadOnly()Z
 HSPLjava/nio/HeapByteBuffer;->ix(I)I
@@ -38388,13 +34577,10 @@
 HSPLjava/nio/HeapByteBuffer;->putFloat(F)Ljava/nio/ByteBuffer;
 HSPLjava/nio/HeapByteBuffer;->putInt(I)Ljava/nio/ByteBuffer;
 HSPLjava/nio/HeapByteBuffer;->putInt(II)Ljava/nio/ByteBuffer;
-HSPLjava/nio/HeapByteBuffer;->putIntUnchecked(II)V
 HSPLjava/nio/HeapByteBuffer;->putLong(IJ)Ljava/nio/ByteBuffer;
 HSPLjava/nio/HeapByteBuffer;->putLong(J)Ljava/nio/ByteBuffer;
 HSPLjava/nio/HeapByteBuffer;->putShort(IS)Ljava/nio/ByteBuffer;
 HSPLjava/nio/HeapByteBuffer;->putShort(S)Ljava/nio/ByteBuffer;
-HSPLjava/nio/HeapByteBuffer;->putUnchecked(I[III)V
-HSPLjava/nio/HeapByteBuffer;->putUnchecked(I[JII)V
 HSPLjava/nio/HeapByteBuffer;->putUnchecked(I[SII)V
 HSPLjava/nio/HeapByteBuffer;->slice()Ljava/nio/ByteBuffer;
 HSPLjava/nio/HeapCharBuffer;-><init>(II)V
@@ -38411,22 +34597,14 @@
 HSPLjava/nio/HeapCharBuffer;->toString(II)Ljava/lang/String;
 HSPLjava/nio/IntBuffer;-><init>(IIII)V
 HSPLjava/nio/IntBuffer;-><init>(IIII[II)V
-HSPLjava/nio/IntBuffer;->allocate(I)Ljava/nio/IntBuffer;
-HSPLjava/nio/IntBuffer;->array()Ljava/lang/Object;
-HSPLjava/nio/IntBuffer;->array()[I
-HSPLjava/nio/IntBuffer;->arrayOffset()I
-HSPLjava/nio/IntBuffer;->clear()Ljava/nio/Buffer;
 HSPLjava/nio/IntBuffer;->get([I)Ljava/nio/IntBuffer;
-HSPLjava/nio/IntBuffer;->hasArray()Z
 HSPLjava/nio/IntBuffer;->limit(I)Ljava/nio/Buffer;
 HSPLjava/nio/IntBuffer;->position(I)Ljava/nio/Buffer;
-HSPLjava/nio/IntBuffer;->put([I)Ljava/nio/IntBuffer;
 HSPLjava/nio/LongBuffer;-><init>(IIII)V
 HSPLjava/nio/LongBuffer;-><init>(IIII[JI)V
 HSPLjava/nio/LongBuffer;->get([J)Ljava/nio/LongBuffer;
 HSPLjava/nio/LongBuffer;->limit(I)Ljava/nio/Buffer;
 HSPLjava/nio/LongBuffer;->position(I)Ljava/nio/Buffer;
-HSPLjava/nio/LongBuffer;->put([J)Ljava/nio/LongBuffer;
 HSPLjava/nio/MappedByteBuffer;-><init>(IIII)V
 HSPLjava/nio/MappedByteBuffer;-><init>(IIIILjava/io/FileDescriptor;)V
 HSPLjava/nio/MappedByteBuffer;-><init>(IIII[BI)V
@@ -38448,18 +34626,8 @@
 HSPLjava/nio/ShortBuffer;->put([S)Ljava/nio/ShortBuffer;
 HSPLjava/nio/StringCharBuffer;-><init>(Ljava/lang/CharSequence;II)V
 HSPLjava/nio/StringCharBuffer;->get()C
-HSPLjava/nio/channels/Channels$1;-><init>(Ljava/nio/channels/WritableByteChannel;)V
-HSPLjava/nio/channels/Channels$1;->close()V
-HSPLjava/nio/channels/Channels$1;->write([BII)V
-HSPLjava/nio/channels/Channels$WritableByteChannelImpl;-><init>(Ljava/io/OutputStream;)V
-HSPLjava/nio/channels/Channels$WritableByteChannelImpl;->write(Ljava/nio/ByteBuffer;)I
-HSPLjava/nio/channels/Channels;->access$000(Ljava/nio/channels/WritableByteChannel;Ljava/nio/ByteBuffer;)V
 HSPLjava/nio/channels/Channels;->checkNotNull(Ljava/lang/Object;Ljava/lang/String;)V
-HSPLjava/nio/channels/Channels;->newChannel(Ljava/io/OutputStream;)Ljava/nio/channels/WritableByteChannel;
 HSPLjava/nio/channels/Channels;->newInputStream(Ljava/nio/channels/ReadableByteChannel;)Ljava/io/InputStream;
-HSPLjava/nio/channels/Channels;->newOutputStream(Ljava/nio/channels/WritableByteChannel;)Ljava/io/OutputStream;
-HSPLjava/nio/channels/Channels;->writeFully(Ljava/nio/channels/WritableByteChannel;Ljava/nio/ByteBuffer;)V
-HSPLjava/nio/channels/Channels;->writeFullyImpl(Ljava/nio/channels/WritableByteChannel;Ljava/nio/ByteBuffer;)V
 HSPLjava/nio/channels/FileChannel;-><init>()V
 HSPLjava/nio/channels/FileChannel;->lock()Ljava/nio/channels/FileLock;
 HSPLjava/nio/channels/FileChannel;->open(Ljava/nio/file/Path;Ljava/util/Set;[Ljava/nio/file/attribute/FileAttribute;)Ljava/nio/channels/FileChannel;
@@ -38469,56 +34637,12 @@
 HSPLjava/nio/channels/FileLock;->acquiredBy()Ljava/nio/channels/Channel;
 HSPLjava/nio/channels/FileLock;->position()J
 HSPLjava/nio/channels/FileLock;->size()J
-HSPLjava/nio/channels/SelectableChannel;-><init>()V
-HSPLjava/nio/channels/SelectableChannel;->register(Ljava/nio/channels/Selector;I)Ljava/nio/channels/SelectionKey;
-HSPLjava/nio/channels/SelectionKey;-><init>()V
-HSPLjava/nio/channels/SelectionKey;->attach(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/nio/channels/SelectionKey;->isReadable()Z
-HSPLjava/nio/channels/Selector;-><init>()V
-HSPLjava/nio/channels/Selector;->open()Ljava/nio/channels/Selector;
-HSPLjava/nio/channels/SocketChannel;-><init>(Ljava/nio/channels/spi/SelectorProvider;)V
-HSPLjava/nio/channels/SocketChannel;->open()Ljava/nio/channels/SocketChannel;
-HSPLjava/nio/channels/SocketChannel;->validOps()I
 HSPLjava/nio/channels/spi/AbstractInterruptibleChannel;-><init>()V
 HSPLjava/nio/channels/spi/AbstractInterruptibleChannel;->begin()V
 HSPLjava/nio/channels/spi/AbstractInterruptibleChannel;->blockedOn(Lsun/nio/ch/Interruptible;)V
 HSPLjava/nio/channels/spi/AbstractInterruptibleChannel;->close()V
 HSPLjava/nio/channels/spi/AbstractInterruptibleChannel;->end(Z)V
 HSPLjava/nio/channels/spi/AbstractInterruptibleChannel;->isOpen()Z
-HSPLjava/nio/channels/spi/AbstractSelectableChannel;-><init>(Ljava/nio/channels/spi/SelectorProvider;)V
-HSPLjava/nio/channels/spi/AbstractSelectableChannel;->addKey(Ljava/nio/channels/SelectionKey;)V
-HSPLjava/nio/channels/spi/AbstractSelectableChannel;->blockingLock()Ljava/lang/Object;
-HSPLjava/nio/channels/spi/AbstractSelectableChannel;->configureBlocking(Z)Ljava/nio/channels/SelectableChannel;
-HSPLjava/nio/channels/spi/AbstractSelectableChannel;->findKey(Ljava/nio/channels/Selector;)Ljava/nio/channels/SelectionKey;
-HSPLjava/nio/channels/spi/AbstractSelectableChannel;->implCloseChannel()V
-HSPLjava/nio/channels/spi/AbstractSelectableChannel;->isBlocking()Z
-HSPLjava/nio/channels/spi/AbstractSelectableChannel;->isRegistered()Z
-HSPLjava/nio/channels/spi/AbstractSelectableChannel;->register(Ljava/nio/channels/Selector;ILjava/lang/Object;)Ljava/nio/channels/SelectionKey;
-HSPLjava/nio/channels/spi/AbstractSelectableChannel;->removeKey(Ljava/nio/channels/SelectionKey;)V
-HSPLjava/nio/channels/spi/AbstractSelectionKey;-><init>()V
-HSPLjava/nio/channels/spi/AbstractSelectionKey;->cancel()V
-HSPLjava/nio/channels/spi/AbstractSelectionKey;->invalidate()V
-HSPLjava/nio/channels/spi/AbstractSelectionKey;->isValid()Z
-HSPLjava/nio/channels/spi/AbstractSelector$1;-><init>(Ljava/nio/channels/spi/AbstractSelector;)V
-HSPLjava/nio/channels/spi/AbstractSelector;-><init>(Ljava/nio/channels/spi/SelectorProvider;)V
-HSPLjava/nio/channels/spi/AbstractSelector;->begin()V
-HSPLjava/nio/channels/spi/AbstractSelector;->cancel(Ljava/nio/channels/SelectionKey;)V
-HSPLjava/nio/channels/spi/AbstractSelector;->cancelledKeys()Ljava/util/Set;
-HSPLjava/nio/channels/spi/AbstractSelector;->close()V
-HSPLjava/nio/channels/spi/AbstractSelector;->deregister(Ljava/nio/channels/spi/AbstractSelectionKey;)V
-HSPLjava/nio/channels/spi/AbstractSelector;->end()V
-HSPLjava/nio/channels/spi/AbstractSelector;->isOpen()Z
-HSPLjava/nio/channels/spi/SelectorProvider$1;-><init>()V
-HSPLjava/nio/channels/spi/SelectorProvider$1;->run()Ljava/lang/Object;
-HSPLjava/nio/channels/spi/SelectorProvider$1;->run()Ljava/nio/channels/spi/SelectorProvider;
-HSPLjava/nio/channels/spi/SelectorProvider;-><init>()V
-HSPLjava/nio/channels/spi/SelectorProvider;->access$000()Z
-HSPLjava/nio/channels/spi/SelectorProvider;->access$100()Ljava/nio/channels/spi/SelectorProvider;
-HSPLjava/nio/channels/spi/SelectorProvider;->access$102(Ljava/nio/channels/spi/SelectorProvider;)Ljava/nio/channels/spi/SelectorProvider;
-HSPLjava/nio/channels/spi/SelectorProvider;->access$200()Z
-HSPLjava/nio/channels/spi/SelectorProvider;->loadProviderAsService()Z
-HSPLjava/nio/channels/spi/SelectorProvider;->loadProviderFromProperty()Z
-HSPLjava/nio/channels/spi/SelectorProvider;->provider()Ljava/nio/channels/spi/SelectorProvider;
 HSPLjava/nio/charset/Charset;-><init>(Ljava/lang/String;[Ljava/lang/String;)V
 HSPLjava/nio/charset/Charset;->aliases()Ljava/util/Set;
 HSPLjava/nio/charset/Charset;->atBugLevel(Ljava/lang/String;)Z
@@ -38526,8 +34650,6 @@
 HSPLjava/nio/charset/Charset;->checkName(Ljava/lang/String;)V
 HSPLjava/nio/charset/Charset;->decode(Ljava/nio/ByteBuffer;)Ljava/nio/CharBuffer;
 HSPLjava/nio/charset/Charset;->defaultCharset()Ljava/nio/charset/Charset;
-HSPLjava/nio/charset/Charset;->encode(Ljava/lang/String;)Ljava/nio/ByteBuffer;
-HSPLjava/nio/charset/Charset;->encode(Ljava/nio/CharBuffer;)Ljava/nio/ByteBuffer;
 HSPLjava/nio/charset/Charset;->equals(Ljava/lang/Object;)Z
 HSPLjava/nio/charset/Charset;->forName(Ljava/lang/String;)Ljava/nio/charset/Charset;
 HSPLjava/nio/charset/Charset;->forNameUEE(Ljava/lang/String;)Ljava/nio/charset/Charset;
@@ -38566,24 +34688,29 @@
 HSPLjava/nio/charset/CharsetEncoder;->reset()Ljava/nio/charset/CharsetEncoder;
 HSPLjava/nio/charset/CharsetEncoder;->unmappableCharacterAction()Ljava/nio/charset/CodingErrorAction;
 HSPLjava/nio/charset/CoderResult;->isError()Z
+HSPLjava/nio/charset/CoderResult;->isMalformed()Z
 HSPLjava/nio/charset/CoderResult;->isOverflow()Z
 HSPLjava/nio/charset/CoderResult;->isUnderflow()Z
-HSPLjava/nio/file/AccessMode;->values()[Ljava/nio/file/AccessMode;
-HSPLjava/nio/file/FileAlreadyExistsException;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
+HSPLjava/nio/file/-$$Lambda$Files$powUktDqIsUPxzmcqaqk0NiO6iA;-><init>(Ljava/io/Closeable;)V
 HSPLjava/nio/file/FileSystemException;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
 HSPLjava/nio/file/FileSystemException;->getMessage()Ljava/lang/String;
 HSPLjava/nio/file/FileSystemException;->getReason()Ljava/lang/String;
 HSPLjava/nio/file/FileSystems;->getDefault()Ljava/nio/file/FileSystem;
 PLjava/nio/file/Files$1;-><init>(Ljava/nio/file/PathMatcher;)V
+HPLjava/nio/file/Files$1;->accept(Ljava/lang/Object;)Z
+HPLjava/nio/file/Files$1;->accept(Ljava/nio/file/Path;)Z
+HSPLjava/nio/file/Files$2;-><init>(Ljava/util/Iterator;)V
+HSPLjava/nio/file/Files$2;->hasNext()Z
+HSPLjava/nio/file/Files$2;->next()Ljava/lang/Object;
+HSPLjava/nio/file/Files$2;->next()Ljava/nio/file/Path;
 HSPLjava/nio/file/Files$AcceptAllFilter;->accept(Ljava/lang/Object;)Z
 HSPLjava/nio/file/Files$AcceptAllFilter;->accept(Ljava/nio/file/Path;)Z
+HSPLjava/nio/file/Files;->asUncheckedRunnable(Ljava/io/Closeable;)Ljava/lang/Runnable;
 HPLjava/nio/file/Files;->createLink(Ljava/nio/file/Path;Ljava/nio/file/Path;)Ljava/nio/file/Path;
-HSPLjava/nio/file/Files;->delete(Ljava/nio/file/Path;)V
 HSPLjava/nio/file/Files;->exists(Ljava/nio/file/Path;[Ljava/nio/file/LinkOption;)Z
 HSPLjava/nio/file/Files;->followLinks([Ljava/nio/file/LinkOption;)Z
-HSPLjava/nio/file/Files;->isAccessible(Ljava/nio/file/Path;[Ljava/nio/file/AccessMode;)Z
 HSPLjava/nio/file/Files;->isRegularFile(Ljava/nio/file/Path;[Ljava/nio/file/LinkOption;)Z
-HSPLjava/nio/file/Files;->isWritable(Ljava/nio/file/Path;)Z
+HSPLjava/nio/file/Files;->list(Ljava/nio/file/Path;)Ljava/util/stream/Stream;
 HSPLjava/nio/file/Files;->newBufferedReader(Ljava/nio/file/Path;)Ljava/io/BufferedReader;
 HSPLjava/nio/file/Files;->newBufferedReader(Ljava/nio/file/Path;Ljava/nio/charset/Charset;)Ljava/io/BufferedReader;
 HSPLjava/nio/file/Files;->newByteChannel(Ljava/nio/file/Path;Ljava/util/Set;[Ljava/nio/file/attribute/FileAttribute;)Ljava/nio/channels/SeekableByteChannel;
@@ -38591,7 +34718,6 @@
 HSPLjava/nio/file/Files;->newDirectoryStream(Ljava/nio/file/Path;)Ljava/nio/file/DirectoryStream;
 HPLjava/nio/file/Files;->newDirectoryStream(Ljava/nio/file/Path;Ljava/lang/String;)Ljava/nio/file/DirectoryStream;
 HSPLjava/nio/file/Files;->newInputStream(Ljava/nio/file/Path;[Ljava/nio/file/OpenOption;)Ljava/io/InputStream;
-HSPLjava/nio/file/Files;->newOutputStream(Ljava/nio/file/Path;[Ljava/nio/file/OpenOption;)Ljava/io/OutputStream;
 HSPLjava/nio/file/Files;->provider(Ljava/nio/file/Path;)Ljava/nio/file/spi/FileSystemProvider;
 HSPLjava/nio/file/Files;->read(Ljava/io/InputStream;I)[B
 HSPLjava/nio/file/Files;->readAllBytes(Ljava/nio/file/Path;)[B
@@ -38602,9 +34728,9 @@
 HSPLjava/nio/file/attribute/FileTime;-><init>(JLjava/util/concurrent/TimeUnit;Ljava/time/Instant;)V
 HSPLjava/nio/file/attribute/FileTime;->append(Ljava/lang/StringBuilder;II)Ljava/lang/StringBuilder;
 HSPLjava/nio/file/attribute/FileTime;->from(JLjava/util/concurrent/TimeUnit;)Ljava/nio/file/attribute/FileTime;
+HSPLjava/nio/file/attribute/FileTime;->toMillis()J
 HSPLjava/nio/file/attribute/FileTime;->toString()Ljava/lang/String;
 HSPLjava/nio/file/spi/FileSystemProvider;->newInputStream(Ljava/nio/file/Path;[Ljava/nio/file/OpenOption;)Ljava/io/InputStream;
-HSPLjava/nio/file/spi/FileSystemProvider;->newOutputStream(Ljava/nio/file/Path;[Ljava/nio/file/OpenOption;)Ljava/io/OutputStream;
 HSPLjava/security/AccessControlContext;-><init>([Ljava/security/ProtectionDomain;)V
 HSPLjava/security/AccessController;->doPrivileged(Ljava/security/PrivilegedAction;)Ljava/lang/Object;
 HSPLjava/security/AccessController;->doPrivileged(Ljava/security/PrivilegedExceptionAction;)Ljava/lang/Object;
@@ -38613,48 +34739,32 @@
 HSPLjava/security/AlgorithmParametersSpi;-><init>()V
 HSPLjava/security/CodeSigner;-><init>(Ljava/security/cert/CertPath;Ljava/security/Timestamp;)V
 HSPLjava/security/CodeSigner;->getSignerCertPath()Ljava/security/cert/CertPath;
-HSPLjava/security/DigestInputStream;-><init>(Ljava/io/InputStream;Ljava/security/MessageDigest;)V
-HSPLjava/security/DigestInputStream;->read([BII)I
-HSPLjava/security/DigestInputStream;->setMessageDigest(Ljava/security/MessageDigest;)V
-HSPLjava/security/DigestOutputStream;-><init>(Ljava/io/OutputStream;Ljava/security/MessageDigest;)V
-HSPLjava/security/DigestOutputStream;->setMessageDigest(Ljava/security/MessageDigest;)V
-HSPLjava/security/DigestOutputStream;->write([BII)V
 HSPLjava/security/GeneralSecurityException;-><init>(Ljava/lang/String;)V
 HSPLjava/security/KeyFactory;-><init>(Ljava/lang/String;)V
-HSPLjava/security/KeyFactory;-><init>(Ljava/security/KeyFactorySpi;Ljava/security/Provider;Ljava/lang/String;)V
 HSPLjava/security/KeyFactory;->generatePrivate(Ljava/security/spec/KeySpec;)Ljava/security/PrivateKey;
 HSPLjava/security/KeyFactory;->generatePublic(Ljava/security/spec/KeySpec;)Ljava/security/PublicKey;
 HSPLjava/security/KeyFactory;->getInstance(Ljava/lang/String;)Ljava/security/KeyFactory;
-HSPLjava/security/KeyFactory;->getInstance(Ljava/lang/String;Ljava/lang/String;)Ljava/security/KeyFactory;
-HSPLjava/security/KeyFactory;->getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljava/security/KeyFactory;
 HSPLjava/security/KeyFactory;->nextSpi(Ljava/security/KeyFactorySpi;)Ljava/security/KeyFactorySpi;
 HSPLjava/security/KeyFactorySpi;-><init>()V
 HSPLjava/security/KeyPair;-><init>(Ljava/security/PublicKey;Ljava/security/PrivateKey;)V
 HSPLjava/security/KeyPair;->getPrivate()Ljava/security/PrivateKey;
 HSPLjava/security/KeyPair;->getPublic()Ljava/security/PublicKey;
-HSPLjava/security/KeyPairGenerator$Delegate;-><init>(Ljava/security/KeyPairGeneratorSpi;Ljava/lang/String;)V
-HSPLjava/security/KeyPairGenerator$Delegate;->generateKeyPair()Ljava/security/KeyPair;
-HSPLjava/security/KeyPairGenerator$Delegate;->initialize(Ljava/security/spec/AlgorithmParameterSpec;Ljava/security/SecureRandom;)V
 HSPLjava/security/KeyPairGenerator;-><init>(Ljava/lang/String;)V
 HSPLjava/security/KeyPairGenerator;->getInstance(Ljava/lang/String;)Ljava/security/KeyPairGenerator;
-HSPLjava/security/KeyPairGenerator;->getInstance(Ljava/lang/String;Ljava/lang/String;)Ljava/security/KeyPairGenerator;
 HSPLjava/security/KeyPairGenerator;->getInstance(Lsun/security/jca/GetInstance$Instance;Ljava/lang/String;)Ljava/security/KeyPairGenerator;
 HSPLjava/security/KeyPairGenerator;->initialize(Ljava/security/spec/AlgorithmParameterSpec;)V
 HSPLjava/security/KeyPairGeneratorSpi;-><init>()V
 HSPLjava/security/KeyStore$1;-><init>()V
 HSPLjava/security/KeyStore$1;->run()Ljava/lang/Object;
 HSPLjava/security/KeyStore$1;->run()Ljava/lang/String;
-HSPLjava/security/KeyStore$PrivateKeyEntry;-><init>(Ljava/security/PrivateKey;[Ljava/security/cert/Certificate;)V
-HSPLjava/security/KeyStore$PrivateKeyEntry;-><init>(Ljava/security/PrivateKey;[Ljava/security/cert/Certificate;Ljava/util/Set;)V
-HSPLjava/security/KeyStore$PrivateKeyEntry;->getCertificate()Ljava/security/cert/Certificate;
-HSPLjava/security/KeyStore$PrivateKeyEntry;->getPrivateKey()Ljava/security/PrivateKey;
+HSPLjava/security/KeyStore$SecretKeyEntry;-><init>(Ljavax/crypto/SecretKey;)V
+HSPLjava/security/KeyStore$SecretKeyEntry;->getSecretKey()Ljavax/crypto/SecretKey;
 HSPLjava/security/KeyStore;-><init>(Ljava/security/KeyStoreSpi;Ljava/security/Provider;Ljava/lang/String;)V
 HSPLjava/security/KeyStore;->aliases()Ljava/util/Enumeration;
 HSPLjava/security/KeyStore;->containsAlias(Ljava/lang/String;)Z
+HSPLjava/security/KeyStore;->deleteEntry(Ljava/lang/String;)V
 HSPLjava/security/KeyStore;->getCertificate(Ljava/lang/String;)Ljava/security/cert/Certificate;
-HSPLjava/security/KeyStore;->getCreationDate(Ljava/lang/String;)Ljava/util/Date;
 HSPLjava/security/KeyStore;->getDefaultType()Ljava/lang/String;
-HSPLjava/security/KeyStore;->getEntry(Ljava/lang/String;Ljava/security/KeyStore$ProtectionParameter;)Ljava/security/KeyStore$Entry;
 HSPLjava/security/KeyStore;->getInstance(Ljava/lang/String;)Ljava/security/KeyStore;
 HSPLjava/security/KeyStore;->getInstance(Ljava/lang/String;Ljava/lang/String;)Ljava/security/KeyStore;
 HSPLjava/security/KeyStore;->getKey(Ljava/lang/String;[C)Ljava/security/Key;
@@ -38662,9 +34772,7 @@
 HSPLjava/security/KeyStore;->load(Ljava/io/InputStream;[C)V
 HSPLjava/security/KeyStore;->load(Ljava/security/KeyStore$LoadStoreParameter;)V
 HSPLjava/security/KeyStore;->setCertificateEntry(Ljava/lang/String;Ljava/security/cert/Certificate;)V
-HSPLjava/security/KeyStore;->size()I
 HSPLjava/security/KeyStoreSpi;-><init>()V
-HSPLjava/security/KeyStoreSpi;->engineGetEntry(Ljava/lang/String;Ljava/security/KeyStore$ProtectionParameter;)Ljava/security/KeyStore$Entry;
 HSPLjava/security/KeyStoreSpi;->engineLoad(Ljava/security/KeyStore$LoadStoreParameter;)V
 HSPLjava/security/MessageDigest$Delegate;-><init>(Ljava/security/MessageDigestSpi;Ljava/lang/String;)V
 HSPLjava/security/MessageDigest$Delegate;->clone()Ljava/lang/Object;
@@ -38684,7 +34792,6 @@
 HSPLjava/security/MessageDigest;->digest()[B
 HSPLjava/security/MessageDigest;->digest([B)[B
 HSPLjava/security/MessageDigest;->digest([BII)I
-HSPLjava/security/MessageDigest;->getAlgorithm()Ljava/lang/String;
 HSPLjava/security/MessageDigest;->getDigestLength()I
 HSPLjava/security/MessageDigest;->getInstance(Ljava/lang/String;)Ljava/security/MessageDigest;
 HSPLjava/security/MessageDigest;->getInstance(Ljava/lang/String;Ljava/lang/String;)Ljava/security/MessageDigest;
@@ -38757,7 +34864,6 @@
 HSPLjava/security/SecureRandom;->next(I)I
 HSPLjava/security/SecureRandom;->nextBytes([B)V
 HSPLjava/security/SecureRandom;->setSeed(J)V
-HSPLjava/security/SecureRandom;->setSeed([B)V
 HSPLjava/security/SecureRandomSpi;-><init>()V
 HSPLjava/security/Security;->addProvider(Ljava/security/Provider;)I
 HSPLjava/security/Security;->getImpl(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)[Ljava/lang/Object;
@@ -38774,9 +34880,7 @@
 HSPLjava/security/Signature$Delegate;-><init>(Ljava/lang/String;)V
 HSPLjava/security/Signature$Delegate;->chooseFirstProvider()V
 HSPLjava/security/Signature$Delegate;->chooseProvider(ILjava/security/Key;Ljava/security/SecureRandom;)V
-HSPLjava/security/Signature$Delegate;->engineInitSign(Ljava/security/PrivateKey;)V
 HSPLjava/security/Signature$Delegate;->engineInitVerify(Ljava/security/PublicKey;)V
-HSPLjava/security/Signature$Delegate;->engineSign()[B
 HSPLjava/security/Signature$Delegate;->engineUpdate(Ljava/nio/ByteBuffer;)V
 HSPLjava/security/Signature$Delegate;->engineUpdate([BII)V
 HSPLjava/security/Signature$Delegate;->engineVerify([B)Z
@@ -38786,10 +34890,8 @@
 HSPLjava/security/Signature;->access$000(Ljava/security/Signature;)Ljava/lang/String;
 HSPLjava/security/Signature;->access$200(Ljava/security/Provider$Service;)Z
 HSPLjava/security/Signature;->getInstance(Ljava/lang/String;)Ljava/security/Signature;
-HSPLjava/security/Signature;->initSign(Ljava/security/PrivateKey;)V
 HSPLjava/security/Signature;->initVerify(Ljava/security/PublicKey;)V
 HSPLjava/security/Signature;->isSpi(Ljava/security/Provider$Service;)Z
-HSPLjava/security/Signature;->sign()[B
 HSPLjava/security/Signature;->update(Ljava/nio/ByteBuffer;)V
 HSPLjava/security/Signature;->update([B)V
 HSPLjava/security/Signature;->update([BII)V
@@ -38798,17 +34900,16 @@
 HSPLjava/security/SignatureSpi;->engineUpdate(Ljava/nio/ByteBuffer;)V
 HSPLjava/security/cert/CertPath;-><init>(Ljava/lang/String;)V
 HSPLjava/security/cert/CertPath;->getType()Ljava/lang/String;
-PLjava/security/cert/CertPathBuilder;-><init>(Ljava/security/cert/CertPathBuilderSpi;Ljava/security/Provider;Ljava/lang/String;)V
-PLjava/security/cert/CertPathBuilder;->build(Ljava/security/cert/CertPathParameters;)Ljava/security/cert/CertPathBuilderResult;
+HSPLjava/security/cert/CertPathBuilder;-><init>(Ljava/security/cert/CertPathBuilderSpi;Ljava/security/Provider;Ljava/lang/String;)V
+HSPLjava/security/cert/CertPathBuilder;->build(Ljava/security/cert/CertPathParameters;)Ljava/security/cert/CertPathBuilderResult;
 PLjava/security/cert/CertPathBuilder;->getInstance(Ljava/lang/String;)Ljava/security/cert/CertPathBuilder;
-PLjava/security/cert/CertPathBuilderSpi;-><init>()V
+HSPLjava/security/cert/CertPathBuilderSpi;-><init>()V
 PLjava/security/cert/CertPathHelperImpl;->implSetPathToNames(Ljava/security/cert/X509CertSelector;Ljava/util/Set;)V
 HSPLjava/security/cert/CertPathValidator;-><init>(Ljava/security/cert/CertPathValidatorSpi;Ljava/security/Provider;Ljava/lang/String;)V
 HSPLjava/security/cert/CertPathValidator;->getInstance(Ljava/lang/String;)Ljava/security/cert/CertPathValidator;
 HSPLjava/security/cert/CertPathValidator;->validate(Ljava/security/cert/CertPath;Ljava/security/cert/CertPathParameters;)Ljava/security/cert/CertPathValidatorResult;
 HSPLjava/security/cert/CertPathValidatorSpi;-><init>()V
 HSPLjava/security/cert/CertStore;-><init>(Ljava/security/cert/CertStoreSpi;Ljava/security/Provider;Ljava/lang/String;Ljava/security/cert/CertStoreParameters;)V
-PLjava/security/cert/CertStore;->getCertificates(Ljava/security/cert/CertSelector;)Ljava/util/Collection;
 HSPLjava/security/cert/CertStore;->getInstance(Ljava/lang/String;Ljava/security/cert/CertStoreParameters;)Ljava/security/cert/CertStore;
 HSPLjava/security/cert/CertStoreSpi;-><init>(Ljava/security/cert/CertStoreParameters;)V
 HSPLjava/security/cert/Certificate;-><init>(Ljava/lang/String;)V
@@ -38819,22 +34920,21 @@
 PLjava/security/cert/CertificateFactory;->generateCertPath(Ljava/io/InputStream;)Ljava/security/cert/CertPath;
 HSPLjava/security/cert/CertificateFactory;->generateCertPath(Ljava/util/List;)Ljava/security/cert/CertPath;
 HSPLjava/security/cert/CertificateFactory;->generateCertificate(Ljava/io/InputStream;)Ljava/security/cert/Certificate;
-HSPLjava/security/cert/CertificateFactory;->generateCertificates(Ljava/io/InputStream;)Ljava/util/Collection;
 HSPLjava/security/cert/CertificateFactory;->getInstance(Ljava/lang/String;)Ljava/security/cert/CertificateFactory;
 HSPLjava/security/cert/CertificateFactorySpi;-><init>()V
 HSPLjava/security/cert/CollectionCertStoreParameters;-><init>(Ljava/util/Collection;)V
 HSPLjava/security/cert/CollectionCertStoreParameters;->clone()Ljava/lang/Object;
 HSPLjava/security/cert/CollectionCertStoreParameters;->getCollection()Ljava/util/Collection;
-PLjava/security/cert/PKIXBuilderParameters;-><init>(Ljava/util/Set;Ljava/security/cert/CertSelector;)V
-PLjava/security/cert/PKIXBuilderParameters;->getMaxPathLength()I
-PLjava/security/cert/PKIXCertPathBuilderResult;-><init>(Ljava/security/cert/CertPath;Ljava/security/cert/TrustAnchor;Ljava/security/cert/PolicyNode;Ljava/security/PublicKey;)V
+HSPLjava/security/cert/PKIXBuilderParameters;-><init>(Ljava/util/Set;Ljava/security/cert/CertSelector;)V
+HSPLjava/security/cert/PKIXBuilderParameters;->getMaxPathLength()I
+HSPLjava/security/cert/PKIXCertPathBuilderResult;-><init>(Ljava/security/cert/CertPath;Ljava/security/cert/TrustAnchor;Ljava/security/cert/PolicyNode;Ljava/security/PublicKey;)V
 PLjava/security/cert/PKIXCertPathBuilderResult;->getCertPath()Ljava/security/cert/CertPath;
 HSPLjava/security/cert/PKIXCertPathChecker;-><init>()V
 HSPLjava/security/cert/PKIXCertPathChecker;->clone()Ljava/lang/Object;
 HSPLjava/security/cert/PKIXCertPathValidatorResult;-><init>(Ljava/security/cert/TrustAnchor;Ljava/security/cert/PolicyNode;Ljava/security/PublicKey;)V
 HSPLjava/security/cert/PKIXParameters;-><init>(Ljava/util/Set;)V
 HSPLjava/security/cert/PKIXParameters;->addCertPathChecker(Ljava/security/cert/PKIXCertPathChecker;)V
-PLjava/security/cert/PKIXParameters;->addCertStore(Ljava/security/cert/CertStore;)V
+HSPLjava/security/cert/PKIXParameters;->addCertStore(Ljava/security/cert/CertStore;)V
 HSPLjava/security/cert/PKIXParameters;->getCertPathCheckers()Ljava/util/List;
 HSPLjava/security/cert/PKIXParameters;->getCertStores()Ljava/util/List;
 HSPLjava/security/cert/PKIXParameters;->getDate()Ljava/util/Date;
@@ -38857,9 +34957,9 @@
 HSPLjava/security/cert/TrustAnchor;->getTrustedCert()Ljava/security/cert/X509Certificate;
 HSPLjava/security/cert/TrustAnchor;->setNameConstraints([B)V
 HSPLjava/security/cert/X509CertSelector;-><init>()V
-HPLjava/security/cert/X509CertSelector;->clone()Ljava/lang/Object;
-PLjava/security/cert/X509CertSelector;->getBasicConstraints()I
-PLjava/security/cert/X509CertSelector;->getCertificate()Ljava/security/cert/X509Certificate;
+HSPLjava/security/cert/X509CertSelector;->clone()Ljava/lang/Object;
+HSPLjava/security/cert/X509CertSelector;->getBasicConstraints()I
+HSPLjava/security/cert/X509CertSelector;->getCertificate()Ljava/security/cert/X509Certificate;
 PLjava/security/cert/X509CertSelector;->getExtensionObject(Ljava/security/cert/X509Certificate;I)Ljava/security/cert/Extension;
 PLjava/security/cert/X509CertSelector;->getSubject()Ljavax/security/auth/x500/X500Principal;
 HSPLjava/security/cert/X509CertSelector;->match(Ljava/security/cert/Certificate;)Z
@@ -38874,9 +34974,9 @@
 HSPLjava/security/cert/X509CertSelector;->matchSubjectAlternativeNames(Ljava/security/cert/X509Certificate;)Z
 HSPLjava/security/cert/X509CertSelector;->matchSubjectKeyID(Ljava/security/cert/X509Certificate;)Z
 HSPLjava/security/cert/X509CertSelector;->matchSubjectPublicKeyAlgID(Ljava/security/cert/X509Certificate;)Z
-PLjava/security/cert/X509CertSelector;->setBasicConstraints(I)V
-PLjava/security/cert/X509CertSelector;->setCertificate(Ljava/security/cert/X509Certificate;)V
-PLjava/security/cert/X509CertSelector;->setCertificateValid(Ljava/util/Date;)V
+HSPLjava/security/cert/X509CertSelector;->setBasicConstraints(I)V
+HSPLjava/security/cert/X509CertSelector;->setCertificate(Ljava/security/cert/X509Certificate;)V
+HSPLjava/security/cert/X509CertSelector;->setCertificateValid(Ljava/util/Date;)V
 PLjava/security/cert/X509CertSelector;->setPathToNamesInternal(Ljava/util/Set;)V
 HSPLjava/security/cert/X509CertSelector;->setSubject(Ljavax/security/auth/x500/X500Principal;)V
 HSPLjava/security/cert/X509Certificate;-><init>()V
@@ -38891,21 +34991,14 @@
 HSPLjava/security/spec/ECGenParameterSpec;->getName()Ljava/lang/String;
 HSPLjava/security/spec/ECParameterSpec;-><init>(Ljava/security/spec/EllipticCurve;Ljava/security/spec/ECPoint;Ljava/math/BigInteger;I)V
 HSPLjava/security/spec/ECParameterSpec;->getCurve()Ljava/security/spec/EllipticCurve;
-HSPLjava/security/spec/ECParameterSpec;->getCurveName()Ljava/lang/String;
-HSPLjava/security/spec/ECParameterSpec;->getGenerator()Ljava/security/spec/ECPoint;
 HSPLjava/security/spec/ECParameterSpec;->getOrder()Ljava/math/BigInteger;
 HSPLjava/security/spec/ECParameterSpec;->setCurveName(Ljava/lang/String;)V
 HSPLjava/security/spec/ECPoint;-><init>(Ljava/math/BigInteger;Ljava/math/BigInteger;)V
 HSPLjava/security/spec/ECPoint;->getAffineX()Ljava/math/BigInteger;
 HSPLjava/security/spec/ECPoint;->getAffineY()Ljava/math/BigInteger;
-HSPLjava/security/spec/ECPublicKeySpec;-><init>(Ljava/security/spec/ECPoint;Ljava/security/spec/ECParameterSpec;)V
-HSPLjava/security/spec/ECPublicKeySpec;->getParams()Ljava/security/spec/ECParameterSpec;
-HSPLjava/security/spec/ECPublicKeySpec;->getW()Ljava/security/spec/ECPoint;
 HSPLjava/security/spec/EllipticCurve;-><init>(Ljava/security/spec/ECField;Ljava/math/BigInteger;Ljava/math/BigInteger;)V
 HSPLjava/security/spec/EllipticCurve;-><init>(Ljava/security/spec/ECField;Ljava/math/BigInteger;Ljava/math/BigInteger;[B)V
 HSPLjava/security/spec/EllipticCurve;->checkValidity(Ljava/security/spec/ECField;Ljava/math/BigInteger;Ljava/lang/String;)V
-HSPLjava/security/spec/EllipticCurve;->getA()Ljava/math/BigInteger;
-HSPLjava/security/spec/EllipticCurve;->getB()Ljava/math/BigInteger;
 HSPLjava/security/spec/EllipticCurve;->getField()Ljava/security/spec/ECField;
 HSPLjava/security/spec/EncodedKeySpec;-><init>([B)V
 HSPLjava/security/spec/EncodedKeySpec;->getEncoded()[B
@@ -38913,25 +35006,21 @@
 HSPLjava/security/spec/PKCS8EncodedKeySpec;-><init>([B)V
 HSPLjava/security/spec/PKCS8EncodedKeySpec;->getEncoded()[B
 HSPLjava/security/spec/RSAKeyGenParameterSpec;-><clinit>()V
-HSPLjava/security/spec/RSAKeyGenParameterSpec;-><init>(ILjava/math/BigInteger;)V
-HSPLjava/security/spec/RSAKeyGenParameterSpec;->getKeysize()I
-HSPLjava/security/spec/RSAKeyGenParameterSpec;->getPublicExponent()Ljava/math/BigInteger;
 HSPLjava/security/spec/X509EncodedKeySpec;-><init>([B)V
 HSPLjava/security/spec/X509EncodedKeySpec;->getEncoded()[B
-HSPLjava/sql/Timestamp;-><init>(J)V
 HSPLjava/text/AttributedCharacterIterator$Attribute;-><init>(Ljava/lang/String;)V
 HSPLjava/text/AttributedCharacterIterator$Attribute;->equals(Ljava/lang/Object;)Z
 HSPLjava/text/AttributedCharacterIterator$Attribute;->hashCode()I
 HSPLjava/text/BreakIterator;-><init>()V
-HSPLjava/text/BreakIterator;->getWordInstance()Ljava/text/BreakIterator;
+HSPLjava/text/BreakIterator;->getLineInstance(Ljava/util/Locale;)Ljava/text/BreakIterator;
 HSPLjava/text/BreakIterator;->getWordInstance(Ljava/util/Locale;)Ljava/text/BreakIterator;
 HSPLjava/text/CalendarBuilder;-><init>()V
 HSPLjava/text/CalendarBuilder;->establish(Ljava/util/Calendar;)Ljava/util/Calendar;
 HSPLjava/text/CalendarBuilder;->isSet(I)Z
 HSPLjava/text/CalendarBuilder;->set(II)Ljava/text/CalendarBuilder;
-HSPLjava/text/CollationKey;-><init>(Ljava/lang/String;)V
 HSPLjava/text/Collator;-><init>(Landroid/icu/text/Collator;)V
 HSPLjava/text/Collator;->decompositionMode_Java_ICU(I)I
+HSPLjava/text/Collator;->getInstance()Ljava/text/Collator;
 HSPLjava/text/Collator;->getInstance(Ljava/util/Locale;)Ljava/text/Collator;
 HSPLjava/text/Collator;->setDecomposition(I)V
 HSPLjava/text/Collator;->setStrength(I)V
@@ -38939,11 +35028,7 @@
 HSPLjava/text/DateFormat;->format(Ljava/lang/Object;Ljava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;
 HSPLjava/text/DateFormat;->format(Ljava/util/Date;)Ljava/lang/String;
 HSPLjava/text/DateFormat;->get(IIILjava/util/Locale;)Ljava/text/DateFormat;
-HSPLjava/text/DateFormat;->getDateInstance(ILjava/util/Locale;)Ljava/text/DateFormat;
 HSPLjava/text/DateFormat;->getDateTimeInstance()Ljava/text/DateFormat;
-HSPLjava/text/DateFormat;->getDateTimeInstance(II)Ljava/text/DateFormat;
-HSPLjava/text/DateFormat;->getDateTimeInstance(IILjava/util/Locale;)Ljava/text/DateFormat;
-HSPLjava/text/DateFormat;->getTimeInstance(I)Ljava/text/DateFormat;
 HSPLjava/text/DateFormat;->getTimeInstance(ILjava/util/Locale;)Ljava/text/DateFormat;
 HSPLjava/text/DateFormat;->getTimeZone()Ljava/util/TimeZone;
 HSPLjava/text/DateFormat;->parse(Ljava/lang/String;)Ljava/util/Date;
@@ -38951,7 +35036,6 @@
 HSPLjava/text/DateFormat;->setLenient(Z)V
 HSPLjava/text/DateFormat;->setTimeZone(Ljava/util/TimeZone;)V
 HSPLjava/text/DateFormatSymbols;-><init>(Ljava/util/Locale;)V
-HSPLjava/text/DateFormatSymbols;->copyMembers(Ljava/text/DateFormatSymbols;Ljava/text/DateFormatSymbols;)V
 HSPLjava/text/DateFormatSymbols;->getAmPmStrings()[Ljava/lang/String;
 HSPLjava/text/DateFormatSymbols;->getCachedInstance(Ljava/util/Locale;)Ljava/text/DateFormatSymbols;
 HSPLjava/text/DateFormatSymbols;->getInstanceRef(Ljava/util/Locale;)Ljava/text/DateFormatSymbols;
@@ -38963,12 +35047,10 @@
 HSPLjava/text/DateFormatSymbols;->initializeSupplementaryData(Llibcore/icu/LocaleData;)V
 HSPLjava/text/DecimalFormat;-><init>(Ljava/lang/String;)V
 HSPLjava/text/DecimalFormat;-><init>(Ljava/lang/String;Ljava/text/DecimalFormatSymbols;)V
-HSPLjava/text/DecimalFormat;->adjustForCurrencyDefaultFractionDigits()V
 HSPLjava/text/DecimalFormat;->clone()Ljava/lang/Object;
 HSPLjava/text/DecimalFormat;->equals(Ljava/lang/Object;)Z
 HSPLjava/text/DecimalFormat;->format(DLjava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;
 HSPLjava/text/DecimalFormat;->format(JLjava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;
-HSPLjava/text/DecimalFormat;->format(Ljava/lang/Object;Ljava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;
 HSPLjava/text/DecimalFormat;->getDecimalFormatSymbols()Ljava/text/DecimalFormatSymbols;
 HSPLjava/text/DecimalFormat;->getIcuFieldPosition(Ljava/text/FieldPosition;)Ljava/text/FieldPosition;
 HSPLjava/text/DecimalFormat;->getMaximumFractionDigits()I
@@ -38995,7 +35077,6 @@
 HSPLjava/text/DecimalFormatSymbols;-><init>(Ljava/util/Locale;)V
 HSPLjava/text/DecimalFormatSymbols;->clone()Ljava/lang/Object;
 HSPLjava/text/DecimalFormatSymbols;->fromIcuInstance(Landroid/icu/text/DecimalFormatSymbols;)Ljava/text/DecimalFormatSymbols;
-HSPLjava/text/DecimalFormatSymbols;->getCurrency()Ljava/util/Currency;
 HSPLjava/text/DecimalFormatSymbols;->getDecimalSeparator()C
 HSPLjava/text/DecimalFormatSymbols;->getGroupingSeparator()C
 HSPLjava/text/DecimalFormatSymbols;->getIcuDecimalFormatSymbols()Landroid/icu/text/DecimalFormatSymbols;
@@ -39058,7 +35139,6 @@
 HSPLjava/text/NumberFormat;->clone()Ljava/lang/Object;
 HSPLjava/text/NumberFormat;->format(D)Ljava/lang/String;
 HSPLjava/text/NumberFormat;->format(J)Ljava/lang/String;
-HSPLjava/text/NumberFormat;->getCurrencyInstance(Ljava/util/Locale;)Ljava/text/NumberFormat;
 HSPLjava/text/NumberFormat;->getInstance()Ljava/text/NumberFormat;
 HSPLjava/text/NumberFormat;->getInstance(Ljava/util/Locale;)Ljava/text/NumberFormat;
 HSPLjava/text/NumberFormat;->getInstance(Ljava/util/Locale;I)Ljava/text/NumberFormat;
@@ -39078,13 +35158,10 @@
 HSPLjava/text/ParsePosition;->setIndex(I)V
 HSPLjava/text/RuleBasedCollator;-><init>(Landroid/icu/text/RuleBasedCollator;)V
 HSPLjava/text/RuleBasedCollator;->compare(Ljava/lang/String;Ljava/lang/String;)I
-HSPLjava/text/RuleBasedCollator;->getCollationKey(Ljava/lang/String;)Ljava/text/CollationKey;
 HSPLjava/text/SimpleDateFormat;-><init>()V
 HSPLjava/text/SimpleDateFormat;-><init>(IILjava/util/Locale;)V
 HSPLjava/text/SimpleDateFormat;-><init>(Ljava/lang/String;)V
 HSPLjava/text/SimpleDateFormat;-><init>(Ljava/lang/String;Ljava/util/Locale;)V
-HSPLjava/text/SimpleDateFormat;->applyPattern(Ljava/lang/String;)V
-HSPLjava/text/SimpleDateFormat;->applyPatternImpl(Ljava/lang/String;)V
 HSPLjava/text/SimpleDateFormat;->checkNegativeNumberExpression()V
 HSPLjava/text/SimpleDateFormat;->compile(Ljava/lang/String;)[C
 HSPLjava/text/SimpleDateFormat;->encode(IILjava/lang/StringBuilder;)V
@@ -39093,11 +35170,9 @@
 HSPLjava/text/SimpleDateFormat;->formatMonth(IIILjava/lang/StringBuffer;ZZII)Ljava/lang/String;
 HSPLjava/text/SimpleDateFormat;->formatWeekday(IIZZ)Ljava/lang/String;
 HSPLjava/text/SimpleDateFormat;->getDateTimeFormat(IILjava/util/Locale;)Ljava/lang/String;
-HSPLjava/text/SimpleDateFormat;->getTimeZoneNames()Landroid/icu/text/TimeZoneNames;
 HSPLjava/text/SimpleDateFormat;->initialize(Ljava/util/Locale;)V
 HSPLjava/text/SimpleDateFormat;->initializeCalendar(Ljava/util/Locale;)V
 HSPLjava/text/SimpleDateFormat;->initializeDefaultCentury()V
-HSPLjava/text/SimpleDateFormat;->isDigit(C)Z
 HSPLjava/text/SimpleDateFormat;->matchString(Ljava/lang/String;II[Ljava/lang/String;Ljava/text/CalendarBuilder;)I
 HSPLjava/text/SimpleDateFormat;->parse(Ljava/lang/String;Ljava/text/ParsePosition;)Ljava/util/Date;
 HSPLjava/text/SimpleDateFormat;->parseAmbiguousDatesAsAfter(Ljava/util/Date;)V
@@ -39106,7 +35181,6 @@
 HSPLjava/text/SimpleDateFormat;->parseWeekday(Ljava/lang/String;IIZZLjava/text/CalendarBuilder;)I
 HSPLjava/text/SimpleDateFormat;->subFormat(IILjava/text/Format$FieldDelegate;Ljava/lang/StringBuffer;Z)V
 HSPLjava/text/SimpleDateFormat;->subParse(Ljava/lang/String;IIIZ[ZLjava/text/ParsePosition;ZLjava/text/CalendarBuilder;)I
-HSPLjava/text/SimpleDateFormat;->subParseNumericZone(Ljava/lang/String;IIIZLjava/text/CalendarBuilder;)I
 HSPLjava/text/SimpleDateFormat;->toPattern()Ljava/lang/String;
 HSPLjava/text/SimpleDateFormat;->useDateFormatSymbols()Z
 HSPLjava/text/SimpleDateFormat;->zeroPaddingNumber(IIILjava/lang/StringBuffer;)V
@@ -39120,7 +35194,6 @@
 HSPLjava/text/StringCharacterIterator;->getEndIndex()I
 HSPLjava/text/StringCharacterIterator;->getIndex()I
 HSPLjava/text/StringCharacterIterator;->next()C
-HSPLjava/text/StringCharacterIterator;->previous()C
 HSPLjava/text/StringCharacterIterator;->setIndex(I)C
 HSPLjava/time/-$$Lambda$Bq8PKq1YWr8nyVk9SSfRYKrOu4A;->queryFrom(Ljava/time/temporal/TemporalAccessor;)Ljava/lang/Object;
 HSPLjava/time/-$$Lambda$up1HpCqucM_DXyY-rpDOyCcdmIA;->queryFrom(Ljava/time/temporal/TemporalAccessor;)Ljava/lang/Object;
@@ -39137,11 +35210,16 @@
 HSPLjava/time/DayOfWeek;->of(I)Ljava/time/DayOfWeek;
 HSPLjava/time/DayOfWeek;->plus(J)Ljava/time/DayOfWeek;
 HSPLjava/time/Duration;-><init>(JI)V
-HSPLjava/time/Duration;->addTo(Ljava/time/temporal/Temporal;)Ljava/time/temporal/Temporal;
+HSPLjava/time/Duration;->between(Ljava/time/temporal/Temporal;Ljava/time/temporal/Temporal;)Ljava/time/Duration;
 HSPLjava/time/Duration;->compareTo(Ljava/time/Duration;)I
 HSPLjava/time/Duration;->create(JI)Ljava/time/Duration;
 HSPLjava/time/Duration;->getSeconds()J
+HSPLjava/time/Duration;->ofDays(J)Ljava/time/Duration;
+HSPLjava/time/Duration;->ofHours(J)Ljava/time/Duration;
 HSPLjava/time/Duration;->ofMillis(J)Ljava/time/Duration;
+HSPLjava/time/Duration;->ofMinutes(J)Ljava/time/Duration;
+HSPLjava/time/Duration;->ofNanos(J)Ljava/time/Duration;
+HSPLjava/time/Duration;->ofSeconds(J)Ljava/time/Duration;
 HSPLjava/time/Duration;->toMillis()J
 HSPLjava/time/Duration;->toNanos()J
 HSPLjava/time/Instant;-><init>(JI)V
@@ -39162,8 +35240,6 @@
 HSPLjava/time/Instant;->ofEpochSecond(JJ)Ljava/time/Instant;
 HSPLjava/time/Instant;->plus(JJ)Ljava/time/Instant;
 HSPLjava/time/Instant;->plus(JLjava/time/temporal/TemporalUnit;)Ljava/time/Instant;
-HSPLjava/time/Instant;->plus(JLjava/time/temporal/TemporalUnit;)Ljava/time/temporal/Temporal;
-HSPLjava/time/Instant;->plus(Ljava/time/temporal/TemporalAmount;)Ljava/time/Instant;
 HSPLjava/time/Instant;->plusMillis(J)Ljava/time/Instant;
 HSPLjava/time/Instant;->plusSeconds(J)Ljava/time/Instant;
 HSPLjava/time/Instant;->toEpochMilli()J
@@ -39190,6 +35266,7 @@
 HSPLjava/time/LocalDate;->minus(JLjava/time/temporal/TemporalUnit;)Ljava/time/LocalDate;
 HSPLjava/time/LocalDate;->minus(JLjava/time/temporal/TemporalUnit;)Ljava/time/temporal/Temporal;
 HSPLjava/time/LocalDate;->minusDays(J)Ljava/time/LocalDate;
+PLjava/time/LocalDate;->minusYears(J)Ljava/time/LocalDate;
 HSPLjava/time/LocalDate;->of(III)Ljava/time/LocalDate;
 HSPLjava/time/LocalDate;->of(ILjava/time/Month;I)Ljava/time/LocalDate;
 HSPLjava/time/LocalDate;->ofEpochDay(J)Ljava/time/LocalDate;
@@ -39198,14 +35275,18 @@
 HSPLjava/time/LocalDate;->plus(Ljava/time/temporal/TemporalAmount;)Ljava/time/LocalDate;
 HSPLjava/time/LocalDate;->plusDays(J)Ljava/time/LocalDate;
 HSPLjava/time/LocalDate;->plusMonths(J)Ljava/time/LocalDate;
+PLjava/time/LocalDate;->plusYears(J)Ljava/time/LocalDate;
 HSPLjava/time/LocalDate;->query(Ljava/time/temporal/TemporalQuery;)Ljava/lang/Object;
 HSPLjava/time/LocalDate;->toEpochDay()J
 HSPLjava/time/LocalDate;->toString()Ljava/lang/String;
 HSPLjava/time/LocalDate;->with(Ljava/time/temporal/TemporalAdjuster;)Ljava/time/LocalDate;
+HPLjava/time/LocalDate;->withDayOfMonth(I)Ljava/time/LocalDate;
+PLjava/time/LocalDate;->withMonth(I)Ljava/time/LocalDate;
 HSPLjava/time/LocalDateTime;-><init>(Ljava/time/LocalDate;Ljava/time/LocalTime;)V
 HSPLjava/time/LocalDateTime;->atZone(Ljava/time/ZoneId;)Ljava/time/ZonedDateTime;
 HSPLjava/time/LocalDateTime;->atZone(Ljava/time/ZoneId;)Ljava/time/chrono/ChronoZonedDateTime;
 HSPLjava/time/LocalDateTime;->compareTo0(Ljava/time/LocalDateTime;)I
+PLjava/time/LocalDateTime;->equals(Ljava/lang/Object;)Z
 HSPLjava/time/LocalDateTime;->getDayOfMonth()I
 HSPLjava/time/LocalDateTime;->getHour()I
 HSPLjava/time/LocalDateTime;->getLong(Ljava/time/temporal/TemporalField;)J
@@ -39217,8 +35298,8 @@
 HSPLjava/time/LocalDateTime;->isAfter(Ljava/time/chrono/ChronoLocalDateTime;)Z
 HSPLjava/time/LocalDateTime;->isBefore(Ljava/time/chrono/ChronoLocalDateTime;)Z
 HSPLjava/time/LocalDateTime;->isSupported(Ljava/time/temporal/TemporalField;)Z
+HSPLjava/time/LocalDateTime;->now()Ljava/time/LocalDateTime;
 HSPLjava/time/LocalDateTime;->now(Ljava/time/Clock;)Ljava/time/LocalDateTime;
-HSPLjava/time/LocalDateTime;->of(IIIIII)Ljava/time/LocalDateTime;
 HSPLjava/time/LocalDateTime;->of(Ljava/time/LocalDate;Ljava/time/LocalTime;)Ljava/time/LocalDateTime;
 HSPLjava/time/LocalDateTime;->ofEpochSecond(JILjava/time/ZoneOffset;)Ljava/time/LocalDateTime;
 HSPLjava/time/LocalDateTime;->ofInstant(Ljava/time/Instant;Ljava/time/ZoneId;)Ljava/time/LocalDateTime;
@@ -39230,13 +35311,13 @@
 HSPLjava/time/LocalDateTime;->toLocalDate()Ljava/time/chrono/ChronoLocalDate;
 HSPLjava/time/LocalDateTime;->toLocalTime()Ljava/time/LocalTime;
 HSPLjava/time/LocalDateTime;->toString()Ljava/lang/String;
-HPLjava/time/LocalDateTime;->truncatedTo(Ljava/time/temporal/TemporalUnit;)Ljava/time/LocalDateTime;
 HSPLjava/time/LocalDateTime;->with(Ljava/time/LocalDate;Ljava/time/LocalTime;)Ljava/time/LocalDateTime;
 HSPLjava/time/LocalDateTime;->withSecond(I)Ljava/time/LocalDateTime;
 HSPLjava/time/LocalTime$1;-><clinit>()V
 HSPLjava/time/LocalTime;-><init>(IIII)V
 HSPLjava/time/LocalTime;->compareTo(Ljava/time/LocalTime;)I
 HSPLjava/time/LocalTime;->create(IIII)Ljava/time/LocalTime;
+PLjava/time/LocalTime;->equals(Ljava/lang/Object;)Z
 HSPLjava/time/LocalTime;->from(Ljava/time/temporal/TemporalAccessor;)Ljava/time/LocalTime;
 HSPLjava/time/LocalTime;->get0(Ljava/time/temporal/TemporalField;)I
 HSPLjava/time/LocalTime;->getHour()I
@@ -39246,7 +35327,6 @@
 HSPLjava/time/LocalTime;->getSecond()I
 HSPLjava/time/LocalTime;->isSupported(Ljava/time/temporal/TemporalField;)Z
 HSPLjava/time/LocalTime;->of(II)Ljava/time/LocalTime;
-HSPLjava/time/LocalTime;->of(III)Ljava/time/LocalTime;
 HSPLjava/time/LocalTime;->of(IIII)Ljava/time/LocalTime;
 HSPLjava/time/LocalTime;->ofNanoOfDay(J)Ljava/time/LocalTime;
 HSPLjava/time/LocalTime;->ofSecondOfDay(J)Ljava/time/LocalTime;
@@ -39263,11 +35343,14 @@
 HSPLjava/time/Month;->values()[Ljava/time/Month;
 HSPLjava/time/Period;-><init>(III)V
 HSPLjava/time/Period;->create(III)Ljava/time/Period;
+PLjava/time/Period;->equals(Ljava/lang/Object;)Z
 HSPLjava/time/Period;->getDays()I
 HSPLjava/time/Period;->getMonths()I
 HSPLjava/time/Period;->getYears()I
 HSPLjava/time/Period;->isZero()Z
 HSPLjava/time/Period;->multipliedBy(I)Ljava/time/Period;
+HSPLjava/time/Period;->parse(Ljava/lang/CharSequence;)Ljava/time/Period;
+HSPLjava/time/Period;->parseNumber(Ljava/lang/CharSequence;Ljava/lang/String;I)I
 HSPLjava/time/Period;->toString()Ljava/lang/String;
 HSPLjava/time/Period;->toTotalMonths()J
 HSPLjava/time/ZoneId;-><init>()V
@@ -39293,6 +35376,7 @@
 HSPLjava/time/ZonedDateTime$1;-><clinit>()V
 HSPLjava/time/ZonedDateTime;-><init>(Ljava/time/LocalDateTime;Ljava/time/ZoneOffset;Ljava/time/ZoneId;)V
 HSPLjava/time/ZonedDateTime;->create(JILjava/time/ZoneId;)Ljava/time/ZonedDateTime;
+PLjava/time/ZonedDateTime;->equals(Ljava/lang/Object;)Z
 HSPLjava/time/ZonedDateTime;->format(Ljava/time/format/DateTimeFormatter;)Ljava/lang/String;
 HSPLjava/time/ZonedDateTime;->from(Ljava/time/temporal/TemporalAccessor;)Ljava/time/ZonedDateTime;
 HSPLjava/time/ZonedDateTime;->getDayOfMonth()I
@@ -39313,7 +35397,6 @@
 HSPLjava/time/ZonedDateTime;->toLocalDate()Ljava/time/chrono/ChronoLocalDate;
 HSPLjava/time/ZonedDateTime;->toLocalTime()Ljava/time/LocalTime;
 HSPLjava/time/ZonedDateTime;->toString()Ljava/lang/String;
-HPLjava/time/ZonedDateTime;->truncatedTo(Ljava/time/temporal/TemporalUnit;)Ljava/time/ZonedDateTime;
 HSPLjava/time/ZonedDateTime;->withZoneSameInstant(Ljava/time/ZoneId;)Ljava/time/ZonedDateTime;
 HSPLjava/time/chrono/AbstractChronology;->equals(Ljava/lang/Object;)Z
 HSPLjava/time/chrono/AbstractChronology;->resolveDate(Ljava/util/Map;Ljava/time/format/ResolverStyle;)Ljava/time/chrono/ChronoLocalDate;
@@ -39390,6 +35473,7 @@
 HSPLjava/time/format/DateTimeFormatterBuilder;->appendText(Ljava/time/temporal/TemporalField;Ljava/time/format/TextStyle;)Ljava/time/format/DateTimeFormatterBuilder;
 HSPLjava/time/format/DateTimeFormatterBuilder;->appendValue(Ljava/time/format/DateTimeFormatterBuilder$NumberPrinterParser;)Ljava/time/format/DateTimeFormatterBuilder;
 HSPLjava/time/format/DateTimeFormatterBuilder;->appendValue(Ljava/time/temporal/TemporalField;I)Ljava/time/format/DateTimeFormatterBuilder;
+HSPLjava/time/format/DateTimeFormatterBuilder;->appendValue(Ljava/time/temporal/TemporalField;IILjava/time/format/SignStyle;)Ljava/time/format/DateTimeFormatterBuilder;
 HSPLjava/time/format/DateTimeFormatterBuilder;->lambda$static$0(Ljava/time/temporal/TemporalAccessor;)Ljava/time/ZoneId;
 HSPLjava/time/format/DateTimeFormatterBuilder;->parseField(CILjava/time/temporal/TemporalField;)V
 HSPLjava/time/format/DateTimeFormatterBuilder;->parsePattern(Ljava/lang/String;)V
@@ -39445,6 +35529,7 @@
 HSPLjava/time/format/Parsed;->resolveTimeLenient()V
 HSPLjava/time/format/Parsed;->updateCheckConflict(Ljava/time/LocalTime;Ljava/time/Period;)V
 HSPLjava/time/format/Parsed;->updateCheckConflict(Ljava/time/chrono/ChronoLocalDate;)V
+HPLjava/time/format/SignStyle;->parse(ZZZ)Z
 HSPLjava/time/format/SignStyle;->values()[Ljava/time/format/SignStyle;
 HSPLjava/time/temporal/-$$Lambda$TemporalAdjusters$A9OZwfMlHD1vy7-nYt5NssACu7Q;-><init>(I)V
 HSPLjava/time/temporal/-$$Lambda$TemporalAdjusters$A9OZwfMlHD1vy7-nYt5NssACu7Q;->adjustInto(Ljava/time/temporal/Temporal;)Ljava/time/temporal/Temporal;
@@ -39513,7 +35598,6 @@
 HSPLjava/time/zone/ZoneRulesProvider;->getAvailableZoneIds()Ljava/util/Set;
 HSPLjava/time/zone/ZoneRulesProvider;->getProvider(Ljava/lang/String;)Ljava/time/zone/ZoneRulesProvider;
 HSPLjava/time/zone/ZoneRulesProvider;->getRules(Ljava/lang/String;Z)Ljava/time/zone/ZoneRules;
-HSPLjava/util/-$$Lambda$Comparator$4V5k8aLimtS0VsEILEAqQ9UGZYo;-><init>(Ljava/util/function/ToLongFunction;)V
 HSPLjava/util/-$$Lambda$Comparator$BZSVCoA8i87ehjxxZ1weEounfDQ;-><init>(Ljava/util/Comparator;Ljava/util/Comparator;)V
 HSPLjava/util/-$$Lambda$Comparator$BZSVCoA8i87ehjxxZ1weEounfDQ;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
 HSPLjava/util/-$$Lambda$Comparator$DNgpxUFZqmT4lOBzlVyPjWwvEvw;-><init>(Ljava/util/function/ToIntFunction;)V
@@ -39538,49 +35622,24 @@
 HSPLjava/util/AbstractList$Itr;->hasNext()Z
 HSPLjava/util/AbstractList$Itr;->next()Ljava/lang/Object;
 HSPLjava/util/AbstractList$ListItr;-><init>(Ljava/util/AbstractList;I)V
-HSPLjava/util/AbstractList$ListItr;->hasPrevious()Z
 HSPLjava/util/AbstractList$ListItr;->nextIndex()I
-HSPLjava/util/AbstractList$ListItr;->previous()Ljava/lang/Object;
-HSPLjava/util/AbstractList$ListItr;->previousIndex()I
-HSPLjava/util/AbstractList$RandomAccessSpliterator;-><init>(Ljava/util/List;)V
-HSPLjava/util/AbstractList$RandomAccessSpliterator;->characteristics()I
-HSPLjava/util/AbstractList$RandomAccessSpliterator;->checkAbstractListModCount(Ljava/util/AbstractList;I)V
-HSPLjava/util/AbstractList$RandomAccessSpliterator;->estimateSize()J
-HSPLjava/util/AbstractList$RandomAccessSpliterator;->forEachRemaining(Ljava/util/function/Consumer;)V
-HSPLjava/util/AbstractList$RandomAccessSpliterator;->get(Ljava/util/List;I)Ljava/lang/Object;
-HSPLjava/util/AbstractList$RandomAccessSpliterator;->getFence()I
-HSPLjava/util/AbstractList$RandomAccessSpliterator;->tryAdvance(Ljava/util/function/Consumer;)Z
 HSPLjava/util/AbstractList$RandomAccessSubList;-><init>(Ljava/util/AbstractList;II)V
-HSPLjava/util/AbstractList$SubList$1;-><init>(Ljava/util/AbstractList$SubList;I)V
-HSPLjava/util/AbstractList$SubList$1;->hasNext()Z
-HSPLjava/util/AbstractList$SubList$1;->next()Ljava/lang/Object;
-HSPLjava/util/AbstractList$SubList$1;->nextIndex()I
 HSPLjava/util/AbstractList$SubList;-><init>(Ljava/util/AbstractList;II)V
-HSPLjava/util/AbstractList$SubList;->access$100(Ljava/util/AbstractList$SubList;)I
-HSPLjava/util/AbstractList$SubList;->access$200(Ljava/util/AbstractList$SubList;)Ljava/util/AbstractList;
 HSPLjava/util/AbstractList$SubList;->checkForComodification()V
-HSPLjava/util/AbstractList$SubList;->get(I)Ljava/lang/Object;
 HSPLjava/util/AbstractList$SubList;->iterator()Ljava/util/Iterator;
 HSPLjava/util/AbstractList$SubList;->listIterator(I)Ljava/util/ListIterator;
 HSPLjava/util/AbstractList$SubList;->rangeCheckForAdd(I)V
-HSPLjava/util/AbstractList$SubList;->size()I
 HSPLjava/util/AbstractList;-><init>()V
 HSPLjava/util/AbstractList;->add(Ljava/lang/Object;)Z
 HSPLjava/util/AbstractList;->clear()V
 HSPLjava/util/AbstractList;->equals(Ljava/lang/Object;)Z
 HSPLjava/util/AbstractList;->hashCode()I
-HSPLjava/util/AbstractList;->indexOf(Ljava/lang/Object;)I
 HSPLjava/util/AbstractList;->iterator()Ljava/util/Iterator;
 HSPLjava/util/AbstractList;->listIterator()Ljava/util/ListIterator;
 HSPLjava/util/AbstractList;->listIterator(I)Ljava/util/ListIterator;
 HSPLjava/util/AbstractList;->rangeCheckForAdd(I)V
 HSPLjava/util/AbstractList;->subList(II)Ljava/util/List;
 HSPLjava/util/AbstractList;->subListRangeCheck(III)V
-HSPLjava/util/AbstractMap$1$1;-><init>(Ljava/util/AbstractMap$1;)V
-HSPLjava/util/AbstractMap$1$1;->hasNext()Z
-HSPLjava/util/AbstractMap$1$1;->next()Ljava/lang/Object;
-HSPLjava/util/AbstractMap$1;-><init>(Ljava/util/AbstractMap;)V
-HSPLjava/util/AbstractMap$1;->iterator()Ljava/util/Iterator;
 HSPLjava/util/AbstractMap$2$1;-><init>(Ljava/util/AbstractMap$2;)V
 HSPLjava/util/AbstractMap$2$1;->hasNext()Z
 HSPLjava/util/AbstractMap$2$1;->next()Ljava/lang/Object;
@@ -39603,14 +35662,12 @@
 HSPLjava/util/AbstractMap;->equals(Ljava/lang/Object;)Z
 HSPLjava/util/AbstractMap;->hashCode()I
 HSPLjava/util/AbstractMap;->isEmpty()Z
-HSPLjava/util/AbstractMap;->keySet()Ljava/util/Set;
 HSPLjava/util/AbstractMap;->putAll(Ljava/util/Map;)V
 HSPLjava/util/AbstractMap;->size()I
 HSPLjava/util/AbstractMap;->toString()Ljava/lang/String;
 HSPLjava/util/AbstractMap;->values()Ljava/util/Collection;
 HSPLjava/util/AbstractQueue;-><init>()V
 HSPLjava/util/AbstractQueue;->add(Ljava/lang/Object;)Z
-HSPLjava/util/AbstractQueue;->addAll(Ljava/util/Collection;)Z
 HSPLjava/util/AbstractQueue;->clear()V
 HSPLjava/util/AbstractQueue;->remove()Ljava/lang/Object;
 HSPLjava/util/AbstractSequentialList;-><init>()V
@@ -39674,7 +35731,6 @@
 HSPLjava/util/ArrayList$Itr;->next()Ljava/lang/Object;
 HSPLjava/util/ArrayList$Itr;->remove()V
 HSPLjava/util/ArrayList$ListItr;-><init>(Ljava/util/ArrayList;I)V
-HSPLjava/util/ArrayList$ListItr;->add(Ljava/lang/Object;)V
 HSPLjava/util/ArrayList$ListItr;->hasPrevious()Z
 HSPLjava/util/ArrayList$ListItr;->previous()Ljava/lang/Object;
 HSPLjava/util/ArrayList$ListItr;->set(Ljava/lang/Object;)V
@@ -39734,9 +35790,7 @@
 HSPLjava/util/Arrays$ArrayList;->contains(Ljava/lang/Object;)Z
 HSPLjava/util/Arrays$ArrayList;->get(I)Ljava/lang/Object;
 HSPLjava/util/Arrays$ArrayList;->indexOf(Ljava/lang/Object;)I
-HSPLjava/util/Arrays$ArrayList;->set(ILjava/lang/Object;)Ljava/lang/Object;
 HSPLjava/util/Arrays$ArrayList;->size()I
-HSPLjava/util/Arrays$ArrayList;->sort(Ljava/util/Comparator;)V
 HSPLjava/util/Arrays$ArrayList;->spliterator()Ljava/util/Spliterator;
 HSPLjava/util/Arrays$ArrayList;->toArray()[Ljava/lang/Object;
 HSPLjava/util/Arrays$ArrayList;->toArray([Ljava/lang/Object;)[Ljava/lang/Object;
@@ -39770,7 +35824,6 @@
 HSPLjava/util/Arrays;->copyOfRange([Ljava/lang/Object;IILjava/lang/Class;)[Ljava/lang/Object;
 HSPLjava/util/Arrays;->deepEquals([Ljava/lang/Object;[Ljava/lang/Object;)Z
 HSPLjava/util/Arrays;->deepEquals0(Ljava/lang/Object;Ljava/lang/Object;)Z
-HSPLjava/util/Arrays;->deepHashCode([Ljava/lang/Object;)I
 HSPLjava/util/Arrays;->deepToString([Ljava/lang/Object;)Ljava/lang/String;
 HSPLjava/util/Arrays;->deepToString([Ljava/lang/Object;Ljava/lang/StringBuilder;Ljava/util/Set;)V
 HSPLjava/util/Arrays;->equals([B[B)Z
@@ -39783,7 +35836,6 @@
 HSPLjava/util/Arrays;->fill([BIIB)V
 HSPLjava/util/Arrays;->fill([CC)V
 HSPLjava/util/Arrays;->fill([CIIC)V
-HSPLjava/util/Arrays;->fill([DD)V
 HSPLjava/util/Arrays;->fill([FF)V
 HSPLjava/util/Arrays;->fill([FIIF)V
 HSPLjava/util/Arrays;->fill([II)V
@@ -39793,7 +35845,6 @@
 HSPLjava/util/Arrays;->fill([Ljava/lang/Object;IILjava/lang/Object;)V
 HSPLjava/util/Arrays;->fill([Ljava/lang/Object;Ljava/lang/Object;)V
 HSPLjava/util/Arrays;->fill([SS)V
-HSPLjava/util/Arrays;->fill([ZIIZ)V
 HSPLjava/util/Arrays;->fill([ZZ)V
 HSPLjava/util/Arrays;->hashCode([B)I
 HSPLjava/util/Arrays;->hashCode([F)I
@@ -39867,9 +35918,7 @@
 HSPLjava/util/BitSet;->wordIndex(I)I
 HSPLjava/util/Calendar;-><init>()V
 HSPLjava/util/Calendar;-><init>(Ljava/util/TimeZone;Ljava/util/Locale;)V
-HSPLjava/util/Calendar;->after(Ljava/lang/Object;)Z
 HSPLjava/util/Calendar;->aggregateStamp(II)I
-HSPLjava/util/Calendar;->before(Ljava/lang/Object;)Z
 HSPLjava/util/Calendar;->clear()V
 HSPLjava/util/Calendar;->clone()Ljava/lang/Object;
 HSPLjava/util/Calendar;->compareTo(J)I
@@ -39898,7 +35947,6 @@
 HSPLjava/util/Calendar;->isSet(I)Z
 HSPLjava/util/Calendar;->selectFields()I
 HSPLjava/util/Calendar;->set(II)V
-HSPLjava/util/Calendar;->set(III)V
 HSPLjava/util/Calendar;->set(IIIIII)V
 HSPLjava/util/Calendar;->setFieldsComputed(I)V
 HSPLjava/util/Calendar;->setFieldsNormalized(I)V
@@ -39971,6 +36019,7 @@
 HSPLjava/util/Collections$SingletonList;->iterator()Ljava/util/Iterator;
 HSPLjava/util/Collections$SingletonList;->size()I
 HSPLjava/util/Collections$SingletonMap;-><init>(Ljava/lang/Object;Ljava/lang/Object;)V
+HSPLjava/util/Collections$SingletonMap;->containsKey(Ljava/lang/Object;)Z
 HSPLjava/util/Collections$SingletonMap;->entrySet()Ljava/util/Set;
 HSPLjava/util/Collections$SingletonMap;->get(Ljava/lang/Object;)Ljava/lang/Object;
 HSPLjava/util/Collections$SingletonMap;->keySet()Ljava/util/Set;
@@ -40000,7 +36049,6 @@
 HSPLjava/util/Collections$SynchronizedMap;->entrySet()Ljava/util/Set;
 HSPLjava/util/Collections$SynchronizedMap;->get(Ljava/lang/Object;)Ljava/lang/Object;
 HSPLjava/util/Collections$SynchronizedMap;->isEmpty()Z
-HSPLjava/util/Collections$SynchronizedMap;->keySet()Ljava/util/Set;
 HSPLjava/util/Collections$SynchronizedMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
 HSPLjava/util/Collections$SynchronizedMap;->remove(Ljava/lang/Object;)Ljava/lang/Object;
 HSPLjava/util/Collections$SynchronizedMap;->size()I
@@ -40120,7 +36168,6 @@
 HSPLjava/util/ComparableTimSort;->sort([Ljava/lang/Object;II[Ljava/lang/Object;II)V
 HSPLjava/util/Comparator;->comparing(Ljava/util/function/Function;)Ljava/util/Comparator;
 HSPLjava/util/Comparator;->comparingInt(Ljava/util/function/ToIntFunction;)Ljava/util/Comparator;
-HSPLjava/util/Comparator;->comparingLong(Ljava/util/function/ToLongFunction;)Ljava/util/Comparator;
 HSPLjava/util/Comparator;->lambda$comparing$77a9974f$1(Ljava/util/function/Function;Ljava/lang/Object;Ljava/lang/Object;)I
 HSPLjava/util/Comparator;->lambda$comparingInt$7b0bb60$1(Ljava/util/function/ToIntFunction;Ljava/lang/Object;Ljava/lang/Object;)I
 HSPLjava/util/Comparator;->lambda$thenComparing$36697e65$1(Ljava/util/Comparator;Ljava/util/Comparator;Ljava/lang/Object;Ljava/lang/Object;)I
@@ -40132,7 +36179,6 @@
 HPLjava/util/Comparators$NullComparator;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
 HSPLjava/util/Currency;-><init>(Landroid/icu/util/Currency;)V
 HSPLjava/util/Currency;->getCurrencyCode()Ljava/lang/String;
-HSPLjava/util/Currency;->getDefaultFractionDigits()I
 HSPLjava/util/Currency;->getInstance(Ljava/lang/String;)Ljava/util/Currency;
 HSPLjava/util/Currency;->getInstance(Ljava/util/Locale;)Ljava/util/Currency;
 HSPLjava/util/Currency;->getSymbol(Ljava/util/Locale;)Ljava/lang/String;
@@ -40143,9 +36189,7 @@
 HSPLjava/util/Date;->clone()Ljava/lang/Object;
 HSPLjava/util/Date;->compareTo(Ljava/util/Date;)I
 HSPLjava/util/Date;->convertToAbbr(Ljava/lang/StringBuilder;Ljava/lang/String;)Ljava/lang/StringBuilder;
-HSPLjava/util/Date;->equals(Ljava/lang/Object;)Z
 HSPLjava/util/Date;->from(Ljava/time/Instant;)Ljava/util/Date;
-HSPLjava/util/Date;->getCalendarSystem(I)Lsun/util/calendar/BaseCalendar;
 HSPLjava/util/Date;->getCalendarSystem(J)Lsun/util/calendar/BaseCalendar;
 HSPLjava/util/Date;->getDate()I
 HSPLjava/util/Date;->getHours()I
@@ -40200,7 +36244,6 @@
 HSPLjava/util/EnumMap$Values;-><init>(Ljava/util/EnumMap;Ljava/util/EnumMap$1;)V
 HSPLjava/util/EnumMap$Values;->iterator()Ljava/util/Iterator;
 HSPLjava/util/EnumMap;-><init>(Ljava/lang/Class;)V
-HSPLjava/util/EnumMap;-><init>(Ljava/util/Map;)V
 HSPLjava/util/EnumMap;->access$1100(Ljava/util/EnumMap;)[Ljava/lang/Enum;
 HSPLjava/util/EnumMap;->access$1200(Ljava/util/EnumMap;Ljava/lang/Object;)Ljava/lang/Object;
 HSPLjava/util/EnumMap;->access$200(Ljava/util/EnumMap;)I
@@ -40224,7 +36267,6 @@
 HSPLjava/util/EnumSet;-><init>(Ljava/lang/Class;[Ljava/lang/Enum;)V
 HSPLjava/util/EnumSet;->allOf(Ljava/lang/Class;)Ljava/util/EnumSet;
 HSPLjava/util/EnumSet;->clone()Ljava/util/EnumSet;
-HSPLjava/util/EnumSet;->complementOf(Ljava/util/EnumSet;)Ljava/util/EnumSet;
 HSPLjava/util/EnumSet;->copyOf(Ljava/util/Collection;)Ljava/util/EnumSet;
 HSPLjava/util/EnumSet;->copyOf(Ljava/util/EnumSet;)Ljava/util/EnumSet;
 HSPLjava/util/EnumSet;->getUniverse(Ljava/lang/Class;)[Ljava/lang/Enum;
@@ -40282,7 +36324,6 @@
 HSPLjava/util/Formatter$FormatSpecifier;->print(Ljava/lang/String;)V
 HSPLjava/util/Formatter$FormatSpecifier;->print(Ljava/lang/StringBuilder;DLjava/util/Locale;Ljava/util/Formatter$Flags;CIZ)V
 HSPLjava/util/Formatter$FormatSpecifier;->print(Ljava/lang/StringBuilder;Ljava/util/Calendar;CLjava/util/Locale;)Ljava/lang/Appendable;
-HSPLjava/util/Formatter$FormatSpecifier;->print(Ljava/math/BigInteger;Ljava/util/Locale;)V
 HSPLjava/util/Formatter$FormatSpecifier;->print(Ljava/util/Calendar;CLjava/util/Locale;)V
 HSPLjava/util/Formatter$FormatSpecifier;->print(SLjava/util/Locale;)V
 HSPLjava/util/Formatter$FormatSpecifier;->printBoolean(Ljava/lang/Object;)V
@@ -40320,8 +36361,6 @@
 HSPLjava/util/Formatter;->parse(Ljava/lang/String;)[Ljava/util/Formatter$FormatString;
 HSPLjava/util/Formatter;->toString()Ljava/lang/String;
 HSPLjava/util/GregorianCalendar;-><init>()V
-HSPLjava/util/GregorianCalendar;-><init>(III)V
-HSPLjava/util/GregorianCalendar;-><init>(IIIIII)V
 HSPLjava/util/GregorianCalendar;-><init>(IIIIIII)V
 HSPLjava/util/GregorianCalendar;-><init>(Ljava/util/TimeZone;)V
 HSPLjava/util/GregorianCalendar;-><init>(Ljava/util/TimeZone;Ljava/util/Locale;)V
@@ -40404,6 +36443,7 @@
 HSPLjava/util/HashMap;->capacity()I
 HSPLjava/util/HashMap;->clear()V
 HSPLjava/util/HashMap;->clone()Ljava/lang/Object;
+HSPLjava/util/HashMap;->comparableClassFor(Ljava/lang/Object;)Ljava/lang/Class;
 HSPLjava/util/HashMap;->computeIfAbsent(Ljava/lang/Object;Ljava/util/function/Function;)Ljava/lang/Object;
 HSPLjava/util/HashMap;->containsKey(Ljava/lang/Object;)Z
 HSPLjava/util/HashMap;->containsValue(Ljava/lang/Object;)Z
@@ -40416,7 +36456,6 @@
 HSPLjava/util/HashMap;->internalWriteEntries(Ljava/io/ObjectOutputStream;)V
 HSPLjava/util/HashMap;->isEmpty()Z
 HSPLjava/util/HashMap;->keySet()Ljava/util/Set;
-HSPLjava/util/HashMap;->loadFactor()F
 HSPLjava/util/HashMap;->merge(Ljava/lang/Object;Ljava/lang/Object;Ljava/util/function/BiFunction;)Ljava/lang/Object;
 HSPLjava/util/HashMap;->newNode(ILjava/lang/Object;Ljava/lang/Object;Ljava/util/HashMap$Node;)Ljava/util/HashMap$Node;
 HSPLjava/util/HashMap;->newTreeNode(ILjava/lang/Object;Ljava/lang/Object;Ljava/util/HashMap$Node;)Ljava/util/HashMap$TreeNode;
@@ -40448,11 +36487,9 @@
 HSPLjava/util/HashSet;->contains(Ljava/lang/Object;)Z
 HSPLjava/util/HashSet;->isEmpty()Z
 HSPLjava/util/HashSet;->iterator()Ljava/util/Iterator;
-HSPLjava/util/HashSet;->readObject(Ljava/io/ObjectInputStream;)V
 HSPLjava/util/HashSet;->remove(Ljava/lang/Object;)Z
 HSPLjava/util/HashSet;->size()I
 HSPLjava/util/HashSet;->spliterator()Ljava/util/Spliterator;
-HSPLjava/util/HashSet;->writeObject(Ljava/io/ObjectOutputStream;)V
 HSPLjava/util/Hashtable$EntrySet;-><init>(Ljava/util/Hashtable;)V
 HSPLjava/util/Hashtable$EntrySet;-><init>(Ljava/util/Hashtable;Ljava/util/Hashtable$1;)V
 HSPLjava/util/Hashtable$EntrySet;->iterator()Ljava/util/Iterator;
@@ -40513,11 +36550,9 @@
 HSPLjava/util/IdentityHashMap$IdentityHashMapIterator;->nextIndex()I
 HSPLjava/util/IdentityHashMap$KeyIterator;-><init>(Ljava/util/IdentityHashMap;)V
 HSPLjava/util/IdentityHashMap$KeyIterator;-><init>(Ljava/util/IdentityHashMap;Ljava/util/IdentityHashMap$1;)V
-HSPLjava/util/IdentityHashMap$KeyIterator;->next()Ljava/lang/Object;
 HSPLjava/util/IdentityHashMap$KeySet;-><init>(Ljava/util/IdentityHashMap;)V
 HSPLjava/util/IdentityHashMap$KeySet;-><init>(Ljava/util/IdentityHashMap;Ljava/util/IdentityHashMap$1;)V
 HSPLjava/util/IdentityHashMap$KeySet;->iterator()Ljava/util/Iterator;
-HSPLjava/util/IdentityHashMap$KeySet;->size()I
 HSPLjava/util/IdentityHashMap$ValueIterator;-><init>(Ljava/util/IdentityHashMap;)V
 HSPLjava/util/IdentityHashMap$ValueIterator;-><init>(Ljava/util/IdentityHashMap;Ljava/util/IdentityHashMap$1;)V
 HSPLjava/util/IdentityHashMap$ValueIterator;->next()Ljava/lang/Object;
@@ -40541,7 +36576,6 @@
 HSPLjava/util/IdentityHashMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
 HSPLjava/util/IdentityHashMap;->remove(Ljava/lang/Object;)Ljava/lang/Object;
 HSPLjava/util/IdentityHashMap;->resize(I)Z
-HSPLjava/util/IdentityHashMap;->size()I
 HSPLjava/util/IdentityHashMap;->unmaskNull(Ljava/lang/Object;)Ljava/lang/Object;
 HSPLjava/util/IdentityHashMap;->values()Ljava/util/Collection;
 HSPLjava/util/Iterator;->forEachRemaining(Ljava/util/function/Consumer;)V
@@ -40588,12 +36622,10 @@
 HSPLjava/util/LinkedHashMap;->values()Ljava/util/Collection;
 HSPLjava/util/LinkedHashSet;-><init>()V
 HSPLjava/util/LinkedHashSet;-><init>(I)V
-HSPLjava/util/LinkedHashSet;-><init>(IF)V
 HSPLjava/util/LinkedHashSet;-><init>(Ljava/util/Collection;)V
 HSPLjava/util/LinkedList$LLSpliterator;-><init>(Ljava/util/LinkedList;II)V
 HSPLjava/util/LinkedList$LLSpliterator;->characteristics()I
 HSPLjava/util/LinkedList$LLSpliterator;->estimateSize()J
-HSPLjava/util/LinkedList$LLSpliterator;->forEachRemaining(Ljava/util/function/Consumer;)V
 HSPLjava/util/LinkedList$LLSpliterator;->getEst()I
 HSPLjava/util/LinkedList$ListItr;-><init>(Ljava/util/LinkedList;I)V
 HSPLjava/util/LinkedList$ListItr;->add(Ljava/lang/Object;)V
@@ -40658,9 +36690,6 @@
 HSPLjava/util/Locale$Builder;-><init>()V
 HSPLjava/util/Locale$Builder;->build()Ljava/util/Locale;
 HSPLjava/util/Locale$Builder;->setLanguage(Ljava/lang/String;)Ljava/util/Locale$Builder;
-HSPLjava/util/Locale$Builder;->setRegion(Ljava/lang/String;)Ljava/util/Locale$Builder;
-HSPLjava/util/Locale$Builder;->setScript(Ljava/lang/String;)Ljava/util/Locale$Builder;
-HSPLjava/util/Locale$Builder;->setVariant(Ljava/lang/String;)Ljava/util/Locale$Builder;
 HSPLjava/util/Locale$Cache;->createObject(Ljava/lang/Object;)Ljava/lang/Object;
 HSPLjava/util/Locale$Cache;->createObject(Ljava/util/Locale$LocaleKey;)Ljava/util/Locale;
 HSPLjava/util/Locale$LocaleKey;-><init>(Lsun/util/locale/BaseLocale;Lsun/util/locale/LocaleExtensions;)V
@@ -40674,25 +36703,19 @@
 HSPLjava/util/Locale;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
 HSPLjava/util/Locale;-><init>(Lsun/util/locale/BaseLocale;Lsun/util/locale/LocaleExtensions;)V
 HSPLjava/util/Locale;-><init>(Lsun/util/locale/BaseLocale;Lsun/util/locale/LocaleExtensions;Ljava/util/Locale$1;)V
-HSPLjava/util/Locale;->access$700(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lsun/util/locale/LocaleExtensions;
 HSPLjava/util/Locale;->adjustLanguageCode(Ljava/lang/String;)Ljava/lang/String;
 HSPLjava/util/Locale;->clone()Ljava/lang/Object;
 HSPLjava/util/Locale;->convertOldISOCodes(Ljava/lang/String;)Ljava/lang/String;
 HSPLjava/util/Locale;->equals(Ljava/lang/Object;)Z
 HSPLjava/util/Locale;->forLanguageTag(Ljava/lang/String;)Ljava/util/Locale;
-HSPLjava/util/Locale;->getAvailableLocales()[Ljava/util/Locale;
-HSPLjava/util/Locale;->getBaseLocale()Lsun/util/locale/BaseLocale;
 HSPLjava/util/Locale;->getCompatibilityExtensions(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lsun/util/locale/LocaleExtensions;
 HSPLjava/util/Locale;->getCountry()Ljava/lang/String;
 HSPLjava/util/Locale;->getDefault()Ljava/util/Locale;
 HSPLjava/util/Locale;->getDefault(Ljava/util/Locale$Category;)Ljava/util/Locale;
 HSPLjava/util/Locale;->getDisplayCountry(Ljava/util/Locale;)Ljava/lang/String;
-HSPLjava/util/Locale;->getDisplayLanguage()Ljava/lang/String;
 HSPLjava/util/Locale;->getDisplayLanguage(Ljava/util/Locale;)Ljava/lang/String;
-HSPLjava/util/Locale;->getDisplayName()Ljava/lang/String;
 HSPLjava/util/Locale;->getDisplayName(Ljava/util/Locale;)Ljava/lang/String;
 HSPLjava/util/Locale;->getExtensionKeys()Ljava/util/Set;
-HSPLjava/util/Locale;->getISO3Country()Ljava/lang/String;
 HSPLjava/util/Locale;->getISO3Language()Ljava/lang/String;
 HSPLjava/util/Locale;->getInstance(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lsun/util/locale/LocaleExtensions;)Ljava/util/Locale;
 HSPLjava/util/Locale;->getInstance(Lsun/util/locale/BaseLocale;Lsun/util/locale/LocaleExtensions;)Ljava/util/Locale;
@@ -40704,8 +36727,6 @@
 HSPLjava/util/Locale;->isValidBcp47Alpha(Ljava/lang/String;II)Z
 HSPLjava/util/Locale;->normalizeAndValidateLanguage(Ljava/lang/String;Z)Ljava/lang/String;
 HSPLjava/util/Locale;->normalizeAndValidateRegion(Ljava/lang/String;Z)Ljava/lang/String;
-HSPLjava/util/Locale;->readObject(Ljava/io/ObjectInputStream;)V
-HSPLjava/util/Locale;->readResolve()Ljava/lang/Object;
 HSPLjava/util/Locale;->setDefault(Ljava/util/Locale$Category;Ljava/util/Locale;)V
 HSPLjava/util/Locale;->setDefault(Ljava/util/Locale;)V
 HSPLjava/util/Locale;->toLanguageTag()Ljava/lang/String;
@@ -40714,6 +36735,7 @@
 HSPLjava/util/Map;->computeIfAbsent(Ljava/lang/Object;Ljava/util/function/Function;)Ljava/lang/Object;
 HSPLjava/util/Map;->forEach(Ljava/util/function/BiConsumer;)V
 HSPLjava/util/Map;->getOrDefault(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLjava/util/Map;->remove(Ljava/lang/Object;Ljava/lang/Object;)Z
 HSPLjava/util/MissingResourceException;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
 HSPLjava/util/NoSuchElementException;-><init>()V
 HSPLjava/util/NoSuchElementException;-><init>(Ljava/lang/String;)V
@@ -40731,13 +36753,9 @@
 HSPLjava/util/Observable;->addObserver(Ljava/util/Observer;)V
 HSPLjava/util/Observable;->clearChanged()V
 HSPLjava/util/Observable;->deleteObserver(Ljava/util/Observer;)V
-HSPLjava/util/Observable;->hasChanged()Z
-HSPLjava/util/Observable;->notifyObservers()V
 HSPLjava/util/Observable;->notifyObservers(Ljava/lang/Object;)V
-HSPLjava/util/Observable;->setChanged()V
 HSPLjava/util/Optional;-><init>(Ljava/lang/Object;)V
 HSPLjava/util/Optional;->empty()Ljava/util/Optional;
-HSPLjava/util/Optional;->flatMap(Ljava/util/function/Function;)Ljava/util/Optional;
 HSPLjava/util/Optional;->get()Ljava/lang/Object;
 HSPLjava/util/Optional;->ifPresent(Ljava/util/function/Consumer;)V
 HSPLjava/util/Optional;->isPresent()Z
@@ -40746,18 +36764,12 @@
 HSPLjava/util/Optional;->ofNullable(Ljava/lang/Object;)Ljava/util/Optional;
 HSPLjava/util/Optional;->orElse(Ljava/lang/Object;)Ljava/lang/Object;
 HSPLjava/util/Optional;->orElseGet(Ljava/util/function/Supplier;)Ljava/lang/Object;
-HSPLjava/util/OptionalInt;-><clinit>()V
-HSPLjava/util/OptionalInt;-><init>()V
-HSPLjava/util/OptionalInt;-><init>(I)V
-HSPLjava/util/OptionalInt;->empty()Ljava/util/OptionalInt;
-HSPLjava/util/OptionalInt;->of(I)Ljava/util/OptionalInt;
 HSPLjava/util/PriorityQueue$Itr;-><init>(Ljava/util/PriorityQueue;)V
 HSPLjava/util/PriorityQueue$Itr;-><init>(Ljava/util/PriorityQueue;Ljava/util/PriorityQueue$1;)V
 HSPLjava/util/PriorityQueue$Itr;->hasNext()Z
 HSPLjava/util/PriorityQueue$Itr;->next()Ljava/lang/Object;
 HSPLjava/util/PriorityQueue$Itr;->remove()V
 HSPLjava/util/PriorityQueue;-><init>()V
-HSPLjava/util/PriorityQueue;-><init>(I)V
 HSPLjava/util/PriorityQueue;-><init>(ILjava/util/Comparator;)V
 HSPLjava/util/PriorityQueue;->add(Ljava/lang/Object;)Z
 HSPLjava/util/PriorityQueue;->clear()V
@@ -40794,7 +36806,6 @@
 HSPLjava/util/Properties;->setProperty(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Object;
 HSPLjava/util/Properties;->store(Ljava/io/OutputStream;Ljava/lang/String;)V
 HSPLjava/util/Properties;->store0(Ljava/io/BufferedWriter;Ljava/lang/String;Z)V
-HSPLjava/util/PropertyResourceBundle;-><init>(Ljava/io/Reader;)V
 HSPLjava/util/Random;-><init>()V
 HSPLjava/util/Random;-><init>(J)V
 HSPLjava/util/Random;->initialScramble(J)J
@@ -40820,23 +36831,18 @@
 HSPLjava/util/RegularEnumSet;->addAll()V
 HSPLjava/util/RegularEnumSet;->addAll(Ljava/util/Collection;)Z
 HSPLjava/util/RegularEnumSet;->clear()V
-HSPLjava/util/RegularEnumSet;->complement()V
 HSPLjava/util/RegularEnumSet;->contains(Ljava/lang/Object;)Z
-HSPLjava/util/RegularEnumSet;->containsAll(Ljava/util/Collection;)Z
-HSPLjava/util/RegularEnumSet;->equals(Ljava/lang/Object;)Z
 HSPLjava/util/RegularEnumSet;->isEmpty()Z
 HSPLjava/util/RegularEnumSet;->iterator()Ljava/util/Iterator;
 HSPLjava/util/RegularEnumSet;->remove(Ljava/lang/Object;)Z
 HSPLjava/util/RegularEnumSet;->size()I
 HSPLjava/util/ResourceBundle$BundleReference;-><init>(Ljava/util/ResourceBundle;Ljava/lang/ref/ReferenceQueue;Ljava/util/ResourceBundle$CacheKey;)V
-HSPLjava/util/ResourceBundle$BundleReference;->getCacheKey()Ljava/util/ResourceBundle$CacheKey;
 HSPLjava/util/ResourceBundle$CacheKey;-><init>(Ljava/lang/String;Ljava/util/Locale;Ljava/lang/ClassLoader;)V
 HSPLjava/util/ResourceBundle$CacheKey;->access$400(Ljava/util/ResourceBundle$CacheKey;)Ljava/lang/Throwable;
 HSPLjava/util/ResourceBundle$CacheKey;->access$600(Ljava/util/ResourceBundle$CacheKey;)J
 HSPLjava/util/ResourceBundle$CacheKey;->access$602(Ljava/util/ResourceBundle$CacheKey;J)J
 HSPLjava/util/ResourceBundle$CacheKey;->calculateHashCode()V
 HSPLjava/util/ResourceBundle$CacheKey;->clone()Ljava/lang/Object;
-HSPLjava/util/ResourceBundle$CacheKey;->equals(Ljava/lang/Object;)Z
 HSPLjava/util/ResourceBundle$CacheKey;->getCause()Ljava/lang/Throwable;
 HSPLjava/util/ResourceBundle$CacheKey;->getLoader()Ljava/lang/ClassLoader;
 HSPLjava/util/ResourceBundle$CacheKey;->getLocale()Ljava/util/Locale;
@@ -40844,25 +36850,11 @@
 HSPLjava/util/ResourceBundle$CacheKey;->hashCode()I
 HSPLjava/util/ResourceBundle$CacheKey;->setFormat(Ljava/lang/String;)V
 HSPLjava/util/ResourceBundle$CacheKey;->setLocale(Ljava/util/Locale;)Ljava/util/ResourceBundle$CacheKey;
-HSPLjava/util/ResourceBundle$Control$1;-><init>(Ljava/util/ResourceBundle$Control;ZLjava/lang/ClassLoader;Ljava/lang/String;)V
 HSPLjava/util/ResourceBundle$Control$1;->run()Ljava/io/InputStream;
 HSPLjava/util/ResourceBundle$Control$1;->run()Ljava/lang/Object;
-HSPLjava/util/ResourceBundle$Control$CandidateListCache;-><init>()V
-HSPLjava/util/ResourceBundle$Control$CandidateListCache;-><init>(Ljava/util/ResourceBundle$1;)V
 HSPLjava/util/ResourceBundle$Control$CandidateListCache;->createObject(Ljava/lang/Object;)Ljava/lang/Object;
 HSPLjava/util/ResourceBundle$Control$CandidateListCache;->createObject(Lsun/util/locale/BaseLocale;)Ljava/util/List;
 HSPLjava/util/ResourceBundle$Control$CandidateListCache;->getDefaultList(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/util/List;
-HSPLjava/util/ResourceBundle$Control;-><clinit>()V
-HSPLjava/util/ResourceBundle$Control;-><init>()V
-HSPLjava/util/ResourceBundle$Control;->access$300()Ljava/util/ResourceBundle$Control;
-HSPLjava/util/ResourceBundle$Control;->getCandidateLocales(Ljava/lang/String;Ljava/util/Locale;)Ljava/util/List;
-HSPLjava/util/ResourceBundle$Control;->getFallbackLocale(Ljava/lang/String;Ljava/util/Locale;)Ljava/util/Locale;
-HSPLjava/util/ResourceBundle$Control;->getFormats(Ljava/lang/String;)Ljava/util/List;
-HSPLjava/util/ResourceBundle$Control;->getTimeToLive(Ljava/lang/String;Ljava/util/Locale;)J
-HSPLjava/util/ResourceBundle$Control;->newBundle(Ljava/lang/String;Ljava/util/Locale;Ljava/lang/String;Ljava/lang/ClassLoader;Z)Ljava/util/ResourceBundle;
-HSPLjava/util/ResourceBundle$Control;->toBundleName(Ljava/lang/String;Ljava/util/Locale;)Ljava/lang/String;
-HSPLjava/util/ResourceBundle$Control;->toResourceName(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLjava/util/ResourceBundle$Control;->toResourceName0(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
 HSPLjava/util/ResourceBundle$LoaderReference;-><init>(Ljava/lang/ClassLoader;Ljava/lang/ref/ReferenceQueue;Ljava/util/ResourceBundle$CacheKey;)V
 HSPLjava/util/ResourceBundle;-><init>()V
 HSPLjava/util/ResourceBundle;->access$200()Ljava/lang/ref/ReferenceQueue;
@@ -40882,37 +36874,21 @@
 HSPLjava/util/Scanner$1;->create(Ljava/lang/Object;)Ljava/lang/Object;
 HSPLjava/util/Scanner$1;->create(Ljava/lang/String;)Ljava/util/regex/Pattern;
 HSPLjava/util/Scanner;-><init>(Ljava/io/InputStream;)V
-HSPLjava/util/Scanner;-><init>(Ljava/io/InputStream;Ljava/lang/String;)V
 HSPLjava/util/Scanner;-><init>(Ljava/lang/Readable;Ljava/util/regex/Pattern;)V
 HSPLjava/util/Scanner;-><init>(Ljava/lang/String;)V
 HSPLjava/util/Scanner;->clearCaches()V
-HSPLjava/util/Scanner;->close()V
 HSPLjava/util/Scanner;->ensureOpen()V
 HSPLjava/util/Scanner;->getCompleteTokenInBuffer(Ljava/util/regex/Pattern;)Ljava/lang/String;
 HSPLjava/util/Scanner;->hasNext()Z
 HSPLjava/util/Scanner;->hasTokenInBuffer()Z
-HSPLjava/util/Scanner;->makeReadable(Ljava/io/InputStream;Ljava/nio/charset/Charset;)Ljava/lang/Readable;
 HSPLjava/util/Scanner;->makeSpace()Z
 HSPLjava/util/Scanner;->next()Ljava/lang/String;
 HSPLjava/util/Scanner;->readInput()V
 HSPLjava/util/Scanner;->revertState(Z)Z
 HSPLjava/util/Scanner;->saveState()V
-HSPLjava/util/Scanner;->toCharset(Ljava/lang/String;)Ljava/nio/charset/Charset;
 HSPLjava/util/Scanner;->translateSavedIndexes(I)V
 HSPLjava/util/Scanner;->useDelimiter(Ljava/lang/String;)Ljava/util/Scanner;
 HSPLjava/util/Scanner;->useLocale(Ljava/util/Locale;)Ljava/util/Scanner;
-HSPLjava/util/ServiceLoader$1;-><init>(Ljava/util/ServiceLoader;)V
-HSPLjava/util/ServiceLoader$1;->hasNext()Z
-HSPLjava/util/ServiceLoader$LazyIterator;-><init>(Ljava/util/ServiceLoader;Ljava/lang/Class;Ljava/lang/ClassLoader;)V
-HSPLjava/util/ServiceLoader$LazyIterator;-><init>(Ljava/util/ServiceLoader;Ljava/lang/Class;Ljava/lang/ClassLoader;Ljava/util/ServiceLoader$1;)V
-HSPLjava/util/ServiceLoader$LazyIterator;->hasNext()Z
-HSPLjava/util/ServiceLoader$LazyIterator;->hasNextService()Z
-HSPLjava/util/ServiceLoader;-><init>(Ljava/lang/Class;Ljava/lang/ClassLoader;)V
-HSPLjava/util/ServiceLoader;->access$300(Ljava/util/ServiceLoader;)Ljava/util/LinkedHashMap;
-HSPLjava/util/ServiceLoader;->access$400(Ljava/util/ServiceLoader;)Ljava/util/ServiceLoader$LazyIterator;
-HSPLjava/util/ServiceLoader;->iterator()Ljava/util/Iterator;
-HSPLjava/util/ServiceLoader;->load(Ljava/lang/Class;Ljava/lang/ClassLoader;)Ljava/util/ServiceLoader;
-HSPLjava/util/ServiceLoader;->reload()V
 HSPLjava/util/Set;->spliterator()Ljava/util/Spliterator;
 HSPLjava/util/SimpleTimeZone;-><init>(ILjava/lang/String;)V
 HSPLjava/util/SimpleTimeZone;->clone()Ljava/lang/Object;
@@ -40922,10 +36898,6 @@
 HSPLjava/util/SimpleTimeZone;->hasSameRules(Ljava/util/TimeZone;)Z
 HSPLjava/util/Spliterator$OfInt;->forEachRemaining(Ljava/util/function/Consumer;)V
 HSPLjava/util/Spliterator;->getExactSizeIfKnown()J
-HSPLjava/util/Spliterators$1Adapter;-><init>(Ljava/util/Spliterator;)V
-HSPLjava/util/Spliterators$1Adapter;->accept(Ljava/lang/Object;)V
-HSPLjava/util/Spliterators$1Adapter;->hasNext()Z
-HSPLjava/util/Spliterators$1Adapter;->next()Ljava/lang/Object;
 HSPLjava/util/Spliterators$ArraySpliterator;-><init>([Ljava/lang/Object;I)V
 HSPLjava/util/Spliterators$ArraySpliterator;-><init>([Ljava/lang/Object;III)V
 HSPLjava/util/Spliterators$ArraySpliterator;->characteristics()I
@@ -40941,17 +36913,18 @@
 HSPLjava/util/Spliterators$IntArraySpliterator;->estimateSize()J
 HSPLjava/util/Spliterators$IntArraySpliterator;->forEachRemaining(Ljava/util/function/IntConsumer;)V
 HSPLjava/util/Spliterators$IteratorSpliterator;-><init>(Ljava/util/Collection;I)V
+HSPLjava/util/Spliterators$IteratorSpliterator;-><init>(Ljava/util/Iterator;I)V
 HSPLjava/util/Spliterators$IteratorSpliterator;->characteristics()I
 HSPLjava/util/Spliterators$IteratorSpliterator;->estimateSize()J
 HSPLjava/util/Spliterators$IteratorSpliterator;->forEachRemaining(Ljava/util/function/Consumer;)V
 HSPLjava/util/Spliterators$IteratorSpliterator;->tryAdvance(Ljava/util/function/Consumer;)Z
 HSPLjava/util/Spliterators;->checkFromToBounds(III)V
 HSPLjava/util/Spliterators;->emptySpliterator()Ljava/util/Spliterator;
-HSPLjava/util/Spliterators;->iterator(Ljava/util/Spliterator;)Ljava/util/Iterator;
 HSPLjava/util/Spliterators;->spliterator(Ljava/util/Collection;I)Ljava/util/Spliterator;
 HSPLjava/util/Spliterators;->spliterator([IIII)Ljava/util/Spliterator$OfInt;
 HSPLjava/util/Spliterators;->spliterator([Ljava/lang/Object;I)Ljava/util/Spliterator;
 HSPLjava/util/Spliterators;->spliterator([Ljava/lang/Object;III)Ljava/util/Spliterator;
+HSPLjava/util/Spliterators;->spliteratorUnknownSize(Ljava/util/Iterator;I)Ljava/util/Spliterator;
 HSPLjava/util/Stack;-><init>()V
 HSPLjava/util/Stack;->empty()Z
 HSPLjava/util/Stack;->peek()Ljava/lang/Object;
@@ -40997,14 +36970,15 @@
 HSPLjava/util/TimSort;->pushRun(II)V
 HSPLjava/util/TimSort;->reverseRange([Ljava/lang/Object;II)V
 HSPLjava/util/TimSort;->sort([Ljava/lang/Object;IILjava/util/Comparator;[Ljava/lang/Object;II)V
+HSPLjava/util/TimeZone$NoImagePreloadHolder;-><clinit>()V
 HSPLjava/util/TimeZone;-><init>()V
 HSPLjava/util/TimeZone;->appendNumber(Ljava/lang/StringBuilder;II)V
 HSPLjava/util/TimeZone;->clone()Ljava/lang/Object;
 HSPLjava/util/TimeZone;->createGmtOffsetString(ZZI)Ljava/lang/String;
 HSPLjava/util/TimeZone;->getAvailableIDs()[Ljava/lang/String;
+HSPLjava/util/TimeZone;->getCustomTimeZone(Ljava/lang/String;)Ljava/util/TimeZone;
 HSPLjava/util/TimeZone;->getDefault()Ljava/util/TimeZone;
 HSPLjava/util/TimeZone;->getDefaultRef()Ljava/util/TimeZone;
-HSPLjava/util/TimeZone;->getDisplayName()Ljava/lang/String;
 HSPLjava/util/TimeZone;->getDisplayName(ZILjava/util/Locale;)Ljava/lang/String;
 HSPLjava/util/TimeZone;->getID()Ljava/lang/String;
 HSPLjava/util/TimeZone;->getTimeZone(Ljava/lang/String;)Ljava/util/TimeZone;
@@ -41036,23 +37010,16 @@
 HSPLjava/util/TreeMap$AscendingSubMap;-><init>(Ljava/util/TreeMap;ZLjava/lang/Object;ZZLjava/lang/Object;Z)V
 HSPLjava/util/TreeMap$AscendingSubMap;->entrySet()Ljava/util/Set;
 HSPLjava/util/TreeMap$AscendingSubMap;->keyIterator()Ljava/util/Iterator;
-HSPLjava/util/TreeMap$DescendingSubMap;-><init>(Ljava/util/TreeMap;ZLjava/lang/Object;ZZLjava/lang/Object;Z)V
-HSPLjava/util/TreeMap$DescendingSubMap;->keyIterator()Ljava/util/Iterator;
+HSPLjava/util/TreeMap$AscendingSubMap;->subHighest()Ljava/util/TreeMap$TreeMapEntry;
 HSPLjava/util/TreeMap$EntryIterator;-><init>(Ljava/util/TreeMap;Ljava/util/TreeMap$TreeMapEntry;)V
 HSPLjava/util/TreeMap$EntryIterator;->next()Ljava/lang/Object;
 HSPLjava/util/TreeMap$EntryIterator;->next()Ljava/util/Map$Entry;
 HSPLjava/util/TreeMap$EntrySet;-><init>(Ljava/util/TreeMap;)V
 HSPLjava/util/TreeMap$EntrySet;->iterator()Ljava/util/Iterator;
-HSPLjava/util/TreeMap$EntrySet;->size()I
 HSPLjava/util/TreeMap$KeyIterator;-><init>(Ljava/util/TreeMap;Ljava/util/TreeMap$TreeMapEntry;)V
 HSPLjava/util/TreeMap$KeyIterator;->next()Ljava/lang/Object;
 HSPLjava/util/TreeMap$KeySet;-><init>(Ljava/util/NavigableMap;)V
-HSPLjava/util/TreeMap$KeySet;->contains(Ljava/lang/Object;)Z
-HSPLjava/util/TreeMap$KeySet;->isEmpty()Z
 HSPLjava/util/TreeMap$KeySet;->iterator()Ljava/util/Iterator;
-HSPLjava/util/TreeMap$KeySet;->size()I
-HSPLjava/util/TreeMap$NavigableSubMap$DescendingSubMapKeyIterator;-><init>(Ljava/util/TreeMap$NavigableSubMap;Ljava/util/TreeMap$TreeMapEntry;Ljava/util/TreeMap$TreeMapEntry;)V
-HSPLjava/util/TreeMap$NavigableSubMap$DescendingSubMapKeyIterator;->next()Ljava/lang/Object;
 HSPLjava/util/TreeMap$NavigableSubMap$EntrySetView;-><init>(Ljava/util/TreeMap$NavigableSubMap;)V
 HSPLjava/util/TreeMap$NavigableSubMap$EntrySetView;->isEmpty()Z
 HSPLjava/util/TreeMap$NavigableSubMap$EntrySetView;->size()I
@@ -41063,14 +37030,12 @@
 HSPLjava/util/TreeMap$NavigableSubMap$SubMapIterator;-><init>(Ljava/util/TreeMap$NavigableSubMap;Ljava/util/TreeMap$TreeMapEntry;Ljava/util/TreeMap$TreeMapEntry;)V
 HSPLjava/util/TreeMap$NavigableSubMap$SubMapIterator;->hasNext()Z
 HSPLjava/util/TreeMap$NavigableSubMap$SubMapIterator;->nextEntry()Ljava/util/TreeMap$TreeMapEntry;
-HSPLjava/util/TreeMap$NavigableSubMap$SubMapIterator;->prevEntry()Ljava/util/TreeMap$TreeMapEntry;
 HSPLjava/util/TreeMap$NavigableSubMap$SubMapIterator;->removeAscending()V
 HSPLjava/util/TreeMap$NavigableSubMap$SubMapKeyIterator;-><init>(Ljava/util/TreeMap$NavigableSubMap;Ljava/util/TreeMap$TreeMapEntry;Ljava/util/TreeMap$TreeMapEntry;)V
 HSPLjava/util/TreeMap$NavigableSubMap$SubMapKeyIterator;->next()Ljava/lang/Object;
 HSPLjava/util/TreeMap$NavigableSubMap;-><init>(Ljava/util/TreeMap;ZLjava/lang/Object;ZZLjava/lang/Object;Z)V
 HSPLjava/util/TreeMap$NavigableSubMap;->absHighFence()Ljava/util/TreeMap$TreeMapEntry;
 HSPLjava/util/TreeMap$NavigableSubMap;->absHighest()Ljava/util/TreeMap$TreeMapEntry;
-HSPLjava/util/TreeMap$NavigableSubMap;->absLowFence()Ljava/util/TreeMap$TreeMapEntry;
 HSPLjava/util/TreeMap$NavigableSubMap;->absLowest()Ljava/util/TreeMap$TreeMapEntry;
 HSPLjava/util/TreeMap$NavigableSubMap;->inRange(Ljava/lang/Object;)Z
 HSPLjava/util/TreeMap$NavigableSubMap;->isEmpty()Z
@@ -41098,7 +37063,6 @@
 HSPLjava/util/TreeMap;->access$000(Ljava/util/TreeMap;Ljava/util/TreeMap$TreeMapEntry;)V
 HSPLjava/util/TreeMap;->access$100(Ljava/util/TreeMap;)I
 HSPLjava/util/TreeMap;->access$200()Ljava/lang/Object;
-HSPLjava/util/TreeMap;->access$300(Ljava/util/TreeMap;)Ljava/util/Comparator;
 HSPLjava/util/TreeMap;->addAllForTreeSet(Ljava/util/SortedSet;Ljava/lang/Object;)V
 HSPLjava/util/TreeMap;->buildFromSorted(IIIILjava/util/Iterator;Ljava/io/ObjectInputStream;Ljava/lang/Object;)Ljava/util/TreeMap$TreeMapEntry;
 HSPLjava/util/TreeMap;->buildFromSorted(ILjava/util/Iterator;Ljava/io/ObjectInputStream;Ljava/lang/Object;)V
@@ -41112,8 +37076,6 @@
 HSPLjava/util/TreeMap;->computeRedLevel(I)I
 HSPLjava/util/TreeMap;->containsKey(Ljava/lang/Object;)Z
 HSPLjava/util/TreeMap;->deleteEntry(Ljava/util/TreeMap$TreeMapEntry;)V
-HSPLjava/util/TreeMap;->descendingKeySet()Ljava/util/NavigableSet;
-HSPLjava/util/TreeMap;->descendingMap()Ljava/util/NavigableMap;
 HSPLjava/util/TreeMap;->entrySet()Ljava/util/Set;
 HSPLjava/util/TreeMap;->exportEntry(Ljava/util/TreeMap$TreeMapEntry;)Ljava/util/Map$Entry;
 HSPLjava/util/TreeMap;->firstEntry()Ljava/util/Map$Entry;
@@ -41131,19 +37093,16 @@
 HSPLjava/util/TreeMap;->getLastEntry()Ljava/util/TreeMap$TreeMapEntry;
 HSPLjava/util/TreeMap;->getLowerEntry(Ljava/lang/Object;)Ljava/util/TreeMap$TreeMapEntry;
 HSPLjava/util/TreeMap;->headMap(Ljava/lang/Object;Z)Ljava/util/NavigableMap;
-HSPLjava/util/TreeMap;->higherKey(Ljava/lang/Object;)Ljava/lang/Object;
 HSPLjava/util/TreeMap;->key(Ljava/util/TreeMap$TreeMapEntry;)Ljava/lang/Object;
 HSPLjava/util/TreeMap;->keyIterator()Ljava/util/Iterator;
 HSPLjava/util/TreeMap;->keyOrNull(Ljava/util/TreeMap$TreeMapEntry;)Ljava/lang/Object;
 HSPLjava/util/TreeMap;->keySet()Ljava/util/Set;
-HSPLjava/util/TreeMap;->lastEntry()Ljava/util/Map$Entry;
 HSPLjava/util/TreeMap;->lastKey()Ljava/lang/Object;
 HSPLjava/util/TreeMap;->leftOf(Ljava/util/TreeMap$TreeMapEntry;)Ljava/util/TreeMap$TreeMapEntry;
 HSPLjava/util/TreeMap;->lowerEntry(Ljava/lang/Object;)Ljava/util/Map$Entry;
 HSPLjava/util/TreeMap;->navigableKeySet()Ljava/util/NavigableSet;
 HSPLjava/util/TreeMap;->parentOf(Ljava/util/TreeMap$TreeMapEntry;)Ljava/util/TreeMap$TreeMapEntry;
 HSPLjava/util/TreeMap;->pollFirstEntry()Ljava/util/Map$Entry;
-HSPLjava/util/TreeMap;->predecessor(Ljava/util/TreeMap$TreeMapEntry;)Ljava/util/TreeMap$TreeMapEntry;
 HSPLjava/util/TreeMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
 HSPLjava/util/TreeMap;->putAll(Ljava/util/Map;)V
 HSPLjava/util/TreeMap;->remove(Ljava/lang/Object;)Ljava/lang/Object;
@@ -41161,23 +37120,18 @@
 HSPLjava/util/TreeSet;-><init>(Ljava/util/Collection;)V
 HSPLjava/util/TreeSet;-><init>(Ljava/util/Comparator;)V
 HSPLjava/util/TreeSet;-><init>(Ljava/util/NavigableMap;)V
-HSPLjava/util/TreeSet;-><init>(Ljava/util/SortedSet;)V
 HSPLjava/util/TreeSet;->add(Ljava/lang/Object;)Z
 HSPLjava/util/TreeSet;->addAll(Ljava/util/Collection;)Z
-HSPLjava/util/TreeSet;->ceiling(Ljava/lang/Object;)Ljava/lang/Object;
 HSPLjava/util/TreeSet;->clear()V
 HSPLjava/util/TreeSet;->comparator()Ljava/util/Comparator;
 HSPLjava/util/TreeSet;->contains(Ljava/lang/Object;)Z
 HSPLjava/util/TreeSet;->first()Ljava/lang/Object;
 HSPLjava/util/TreeSet;->headSet(Ljava/lang/Object;Z)Ljava/util/NavigableSet;
-HSPLjava/util/TreeSet;->higher(Ljava/lang/Object;)Ljava/lang/Object;
 HSPLjava/util/TreeSet;->isEmpty()Z
 HSPLjava/util/TreeSet;->iterator()Ljava/util/Iterator;
 HSPLjava/util/TreeSet;->last()Ljava/lang/Object;
 HSPLjava/util/TreeSet;->remove(Ljava/lang/Object;)Z
 HSPLjava/util/TreeSet;->size()I
-HSPLjava/util/TreeSet;->subSet(Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/SortedSet;
-HSPLjava/util/TreeSet;->subSet(Ljava/lang/Object;ZLjava/lang/Object;Z)Ljava/util/NavigableSet;
 HSPLjava/util/TreeSet;->tailSet(Ljava/lang/Object;)Ljava/util/SortedSet;
 HSPLjava/util/TreeSet;->tailSet(Ljava/lang/Object;Z)Ljava/util/NavigableSet;
 HSPLjava/util/UUID;-><init>(JJ)V
@@ -41188,7 +37142,6 @@
 HSPLjava/util/UUID;->getLeastSignificantBits()J
 HSPLjava/util/UUID;->getMostSignificantBits()J
 HSPLjava/util/UUID;->hashCode()I
-HSPLjava/util/UUID;->nameUUIDFromBytes([B)Ljava/util/UUID;
 HSPLjava/util/UUID;->randomUUID()Ljava/util/UUID;
 HSPLjava/util/UUID;->toString()Ljava/lang/String;
 HSPLjava/util/Vector$1;-><init>(Ljava/util/Vector;)V
@@ -41204,7 +37157,6 @@
 HSPLjava/util/Vector;-><init>(I)V
 HSPLjava/util/Vector;-><init>(II)V
 HSPLjava/util/Vector;->add(Ljava/lang/Object;)Z
-HSPLjava/util/Vector;->addAll(Ljava/util/Collection;)Z
 HSPLjava/util/Vector;->addElement(Ljava/lang/Object;)V
 HSPLjava/util/Vector;->clear()V
 HSPLjava/util/Vector;->contains(Ljava/lang/Object;)Z
@@ -41224,7 +37176,6 @@
 HSPLjava/util/Vector;->removeAllElements()V
 HSPLjava/util/Vector;->removeElement(Ljava/lang/Object;)Z
 HSPLjava/util/Vector;->removeElementAt(I)V
-HSPLjava/util/Vector;->setElementAt(Ljava/lang/Object;I)V
 HSPLjava/util/Vector;->size()I
 HSPLjava/util/Vector;->sort(Ljava/util/Comparator;)V
 HSPLjava/util/Vector;->toArray()[Ljava/lang/Object;
@@ -41280,7 +37231,6 @@
 HSPLjava/util/WeakHashMap;->unmaskNull(Ljava/lang/Object;)Ljava/lang/Object;
 HSPLjava/util/WeakHashMap;->values()Ljava/util/Collection;
 HSPLjava/util/concurrent/AbstractExecutorService;-><init>()V
-HSPLjava/util/concurrent/AbstractExecutorService;->invokeAll(Ljava/util/Collection;JLjava/util/concurrent/TimeUnit;)Ljava/util/List;
 HSPLjava/util/concurrent/AbstractExecutorService;->newTaskFor(Ljava/lang/Runnable;Ljava/lang/Object;)Ljava/util/concurrent/RunnableFuture;
 HSPLjava/util/concurrent/AbstractExecutorService;->newTaskFor(Ljava/util/concurrent/Callable;)Ljava/util/concurrent/RunnableFuture;
 HSPLjava/util/concurrent/AbstractExecutorService;->submit(Ljava/lang/Runnable;)Ljava/util/concurrent/Future;
@@ -41299,7 +37249,6 @@
 HSPLjava/util/concurrent/ArrayBlockingQueue;->poll()Ljava/lang/Object;
 HSPLjava/util/concurrent/ArrayBlockingQueue;->poll(JLjava/util/concurrent/TimeUnit;)Ljava/lang/Object;
 HSPLjava/util/concurrent/ArrayBlockingQueue;->put(Ljava/lang/Object;)V
-HSPLjava/util/concurrent/ArrayBlockingQueue;->remainingCapacity()I
 HSPLjava/util/concurrent/ArrayBlockingQueue;->size()I
 HSPLjava/util/concurrent/ArrayBlockingQueue;->take()Ljava/lang/Object;
 HSPLjava/util/concurrent/CancellationException;-><init>()V
@@ -41317,10 +37266,14 @@
 HSPLjava/util/concurrent/CompletableFuture$UniWhenComplete;-><init>(Ljava/util/concurrent/Executor;Ljava/util/concurrent/CompletableFuture;Ljava/util/concurrent/CompletableFuture;Ljava/util/function/BiConsumer;)V
 HSPLjava/util/concurrent/CompletableFuture$UniWhenComplete;->tryFire(I)Ljava/util/concurrent/CompletableFuture;
 HSPLjava/util/concurrent/CompletableFuture;-><init>()V
+HSPLjava/util/concurrent/CompletableFuture;-><init>(Ljava/lang/Object;)V
+HSPLjava/util/concurrent/CompletableFuture;->cancel(Z)Z
 HSPLjava/util/concurrent/CompletableFuture;->casStack(Ljava/util/concurrent/CompletableFuture$Completion;Ljava/util/concurrent/CompletableFuture$Completion;)Z
+HSPLjava/util/concurrent/CompletableFuture;->cleanStack()V
 HSPLjava/util/concurrent/CompletableFuture;->complete(Ljava/lang/Object;)Z
 HSPLjava/util/concurrent/CompletableFuture;->completeExceptionally(Ljava/lang/Throwable;)Z
 HSPLjava/util/concurrent/CompletableFuture;->completeValue(Ljava/lang/Object;)Z
+HSPLjava/util/concurrent/CompletableFuture;->completedFuture(Ljava/lang/Object;)Ljava/util/concurrent/CompletableFuture;
 HSPLjava/util/concurrent/CompletableFuture;->get()Ljava/lang/Object;
 HSPLjava/util/concurrent/CompletableFuture;->get(JLjava/util/concurrent/TimeUnit;)Ljava/lang/Object;
 HSPLjava/util/concurrent/CompletableFuture;->handle(Ljava/util/function/BiFunction;)Ljava/util/concurrent/CompletableFuture;
@@ -41334,7 +37287,6 @@
 HSPLjava/util/concurrent/CompletableFuture;->postFire(Ljava/util/concurrent/CompletableFuture;I)Ljava/util/concurrent/CompletableFuture;
 HSPLjava/util/concurrent/CompletableFuture;->push(Ljava/util/concurrent/CompletableFuture$UniCompletion;)V
 HSPLjava/util/concurrent/CompletableFuture;->reportGet(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/concurrent/CompletableFuture;->reportJoin(Ljava/lang/Object;)Ljava/lang/Object;
 HSPLjava/util/concurrent/CompletableFuture;->timedGet(J)Ljava/lang/Object;
 HSPLjava/util/concurrent/CompletableFuture;->tryPushStack(Ljava/util/concurrent/CompletableFuture$Completion;)Z
 HSPLjava/util/concurrent/CompletableFuture;->uniHandle(Ljava/util/concurrent/CompletableFuture;Ljava/util/function/BiFunction;Ljava/util/concurrent/CompletableFuture$UniHandle;)Z
@@ -41347,7 +37299,6 @@
 HSPLjava/util/concurrent/ConcurrentHashMap$BaseIterator;->hasNext()Z
 HSPLjava/util/concurrent/ConcurrentHashMap$BaseIterator;->remove()V
 HSPLjava/util/concurrent/ConcurrentHashMap$CollectionView;-><init>(Ljava/util/concurrent/ConcurrentHashMap;)V
-HSPLjava/util/concurrent/ConcurrentHashMap$CollectionView;->isEmpty()Z
 HSPLjava/util/concurrent/ConcurrentHashMap$CollectionView;->size()I
 HSPLjava/util/concurrent/ConcurrentHashMap$CollectionView;->toArray()[Ljava/lang/Object;
 HSPLjava/util/concurrent/ConcurrentHashMap$CounterCell;-><init>(J)V
@@ -41374,15 +37325,7 @@
 HSPLjava/util/concurrent/ConcurrentHashMap$ReservationNode;-><init>()V
 HSPLjava/util/concurrent/ConcurrentHashMap$Traverser;-><init>([Ljava/util/concurrent/ConcurrentHashMap$Node;III)V
 HSPLjava/util/concurrent/ConcurrentHashMap$Traverser;->advance()Ljava/util/concurrent/ConcurrentHashMap$Node;
-HSPLjava/util/concurrent/ConcurrentHashMap$TreeBin;-><init>(Ljava/util/concurrent/ConcurrentHashMap$TreeNode;)V
-HSPLjava/util/concurrent/ConcurrentHashMap$TreeBin;->balanceInsertion(Ljava/util/concurrent/ConcurrentHashMap$TreeNode;Ljava/util/concurrent/ConcurrentHashMap$TreeNode;)Ljava/util/concurrent/ConcurrentHashMap$TreeNode;
 HSPLjava/util/concurrent/ConcurrentHashMap$TreeBin;->find(ILjava/lang/Object;)Ljava/util/concurrent/ConcurrentHashMap$Node;
-HSPLjava/util/concurrent/ConcurrentHashMap$TreeBin;->lockRoot()V
-HSPLjava/util/concurrent/ConcurrentHashMap$TreeBin;->putTreeVal(ILjava/lang/Object;Ljava/lang/Object;)Ljava/util/concurrent/ConcurrentHashMap$TreeNode;
-HSPLjava/util/concurrent/ConcurrentHashMap$TreeBin;->rotateLeft(Ljava/util/concurrent/ConcurrentHashMap$TreeNode;Ljava/util/concurrent/ConcurrentHashMap$TreeNode;)Ljava/util/concurrent/ConcurrentHashMap$TreeNode;
-HSPLjava/util/concurrent/ConcurrentHashMap$TreeBin;->rotateRight(Ljava/util/concurrent/ConcurrentHashMap$TreeNode;Ljava/util/concurrent/ConcurrentHashMap$TreeNode;)Ljava/util/concurrent/ConcurrentHashMap$TreeNode;
-HSPLjava/util/concurrent/ConcurrentHashMap$TreeBin;->unlockRoot()V
-HSPLjava/util/concurrent/ConcurrentHashMap$TreeNode;-><init>(ILjava/lang/Object;Ljava/lang/Object;Ljava/util/concurrent/ConcurrentHashMap$Node;Ljava/util/concurrent/ConcurrentHashMap$TreeNode;)V
 HSPLjava/util/concurrent/ConcurrentHashMap$TreeNode;->findTreeNode(ILjava/lang/Object;Ljava/lang/Class;)Ljava/util/concurrent/ConcurrentHashMap$TreeNode;
 HSPLjava/util/concurrent/ConcurrentHashMap$ValueIterator;-><init>([Ljava/util/concurrent/ConcurrentHashMap$Node;IIILjava/util/concurrent/ConcurrentHashMap;)V
 HSPLjava/util/concurrent/ConcurrentHashMap$ValueIterator;->next()Ljava/lang/Object;
@@ -41391,7 +37334,6 @@
 HSPLjava/util/concurrent/ConcurrentHashMap;-><init>()V
 HSPLjava/util/concurrent/ConcurrentHashMap;-><init>(I)V
 HSPLjava/util/concurrent/ConcurrentHashMap;-><init>(IFI)V
-HSPLjava/util/concurrent/ConcurrentHashMap;-><init>(Ljava/util/Map;)V
 HSPLjava/util/concurrent/ConcurrentHashMap;->addCount(JI)V
 HSPLjava/util/concurrent/ConcurrentHashMap;->casTabAt([Ljava/util/concurrent/ConcurrentHashMap$Node;ILjava/util/concurrent/ConcurrentHashMap$Node;Ljava/util/concurrent/ConcurrentHashMap$Node;)Z
 HSPLjava/util/concurrent/ConcurrentHashMap;->clear()V
@@ -41405,13 +37347,11 @@
 HSPLjava/util/concurrent/ConcurrentHashMap;->isEmpty()Z
 HSPLjava/util/concurrent/ConcurrentHashMap;->keySet()Ljava/util/Set;
 HSPLjava/util/concurrent/ConcurrentHashMap;->mappingCount()J
-HSPLjava/util/concurrent/ConcurrentHashMap;->newKeySet()Ljava/util/concurrent/ConcurrentHashMap$KeySetView;
 HSPLjava/util/concurrent/ConcurrentHashMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
 HSPLjava/util/concurrent/ConcurrentHashMap;->putAll(Ljava/util/Map;)V
 HSPLjava/util/concurrent/ConcurrentHashMap;->putIfAbsent(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
 HSPLjava/util/concurrent/ConcurrentHashMap;->putVal(Ljava/lang/Object;Ljava/lang/Object;Z)Ljava/lang/Object;
 HSPLjava/util/concurrent/ConcurrentHashMap;->remove(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/concurrent/ConcurrentHashMap;->remove(Ljava/lang/Object;Ljava/lang/Object;)Z
 HSPLjava/util/concurrent/ConcurrentHashMap;->removeEntryIf(Ljava/util/function/Predicate;)Z
 HSPLjava/util/concurrent/ConcurrentHashMap;->replace(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Z
 HSPLjava/util/concurrent/ConcurrentHashMap;->replaceNode(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
@@ -41423,7 +37363,6 @@
 HSPLjava/util/concurrent/ConcurrentHashMap;->tabAt([Ljava/util/concurrent/ConcurrentHashMap$Node;I)Ljava/util/concurrent/ConcurrentHashMap$Node;
 HSPLjava/util/concurrent/ConcurrentHashMap;->tableSizeFor(I)I
 HSPLjava/util/concurrent/ConcurrentHashMap;->transfer([Ljava/util/concurrent/ConcurrentHashMap$Node;[Ljava/util/concurrent/ConcurrentHashMap$Node;)V
-HSPLjava/util/concurrent/ConcurrentHashMap;->treeifyBin([Ljava/util/concurrent/ConcurrentHashMap$Node;I)V
 HSPLjava/util/concurrent/ConcurrentHashMap;->tryPresize(I)V
 HSPLjava/util/concurrent/ConcurrentHashMap;->values()Ljava/util/Collection;
 HSPLjava/util/concurrent/ConcurrentLinkedDeque$AbstractItr;-><init>(Ljava/util/concurrent/ConcurrentLinkedDeque;)V
@@ -41453,6 +37392,8 @@
 HSPLjava/util/concurrent/ConcurrentLinkedDeque;->peekFirst()Ljava/lang/Object;
 HSPLjava/util/concurrent/ConcurrentLinkedDeque;->pollFirst()Ljava/lang/Object;
 HSPLjava/util/concurrent/ConcurrentLinkedDeque;->prevTerminator()Ljava/util/concurrent/ConcurrentLinkedDeque$Node;
+HSPLjava/util/concurrent/ConcurrentLinkedDeque;->removeFirst()Ljava/lang/Object;
+HSPLjava/util/concurrent/ConcurrentLinkedDeque;->screenNullResult(Ljava/lang/Object;)Ljava/lang/Object;
 HSPLjava/util/concurrent/ConcurrentLinkedDeque;->size()I
 HSPLjava/util/concurrent/ConcurrentLinkedDeque;->skipDeletedPredecessors(Ljava/util/concurrent/ConcurrentLinkedDeque$Node;)V
 HSPLjava/util/concurrent/ConcurrentLinkedDeque;->skipDeletedSuccessors(Ljava/util/concurrent/ConcurrentLinkedDeque$Node;)V
@@ -41464,7 +37405,6 @@
 HSPLjava/util/concurrent/ConcurrentLinkedQueue$Itr;-><init>(Ljava/util/concurrent/ConcurrentLinkedQueue;)V
 HSPLjava/util/concurrent/ConcurrentLinkedQueue$Itr;->hasNext()Z
 HSPLjava/util/concurrent/ConcurrentLinkedQueue$Itr;->next()Ljava/lang/Object;
-HSPLjava/util/concurrent/ConcurrentLinkedQueue$Itr;->remove()V
 HSPLjava/util/concurrent/ConcurrentLinkedQueue$Node;-><init>()V
 HSPLjava/util/concurrent/ConcurrentLinkedQueue$Node;-><init>(Ljava/util/concurrent/ConcurrentLinkedQueue$1;)V
 HSPLjava/util/concurrent/ConcurrentLinkedQueue;-><init>()V
@@ -41473,7 +37413,6 @@
 HSPLjava/util/concurrent/ConcurrentLinkedQueue;->casItem(Ljava/util/concurrent/ConcurrentLinkedQueue$Node;Ljava/lang/Object;Ljava/lang/Object;)Z
 HSPLjava/util/concurrent/ConcurrentLinkedQueue;->casNext(Ljava/util/concurrent/ConcurrentLinkedQueue$Node;Ljava/util/concurrent/ConcurrentLinkedQueue$Node;Ljava/util/concurrent/ConcurrentLinkedQueue$Node;)Z
 HSPLjava/util/concurrent/ConcurrentLinkedQueue;->casTail(Ljava/util/concurrent/ConcurrentLinkedQueue$Node;Ljava/util/concurrent/ConcurrentLinkedQueue$Node;)Z
-HSPLjava/util/concurrent/ConcurrentLinkedQueue;->contains(Ljava/lang/Object;)Z
 HSPLjava/util/concurrent/ConcurrentLinkedQueue;->first()Ljava/util/concurrent/ConcurrentLinkedQueue$Node;
 HSPLjava/util/concurrent/ConcurrentLinkedQueue;->isEmpty()Z
 HSPLjava/util/concurrent/ConcurrentLinkedQueue;->iterator()Ljava/util/Iterator;
@@ -41491,9 +37430,6 @@
 HSPLjava/util/concurrent/ConcurrentSkipListMap$Index;->casRight(Ljava/util/concurrent/ConcurrentSkipListMap$Index;Ljava/util/concurrent/ConcurrentSkipListMap$Index;)Z
 HSPLjava/util/concurrent/ConcurrentSkipListMap$Index;->link(Ljava/util/concurrent/ConcurrentSkipListMap$Index;Ljava/util/concurrent/ConcurrentSkipListMap$Index;)Z
 HSPLjava/util/concurrent/ConcurrentSkipListMap$Index;->unlink(Ljava/util/concurrent/ConcurrentSkipListMap$Index;)Z
-HSPLjava/util/concurrent/ConcurrentSkipListMap$Iter;-><init>(Ljava/util/concurrent/ConcurrentSkipListMap;)V
-HSPLjava/util/concurrent/ConcurrentSkipListMap$Iter;->advance()V
-HSPLjava/util/concurrent/ConcurrentSkipListMap$Iter;->hasNext()Z
 HSPLjava/util/concurrent/ConcurrentSkipListMap$Node;-><init>(Ljava/lang/Object;Ljava/lang/Object;Ljava/util/concurrent/ConcurrentSkipListMap$Node;)V
 HSPLjava/util/concurrent/ConcurrentSkipListMap$Node;-><init>(Ljava/util/concurrent/ConcurrentSkipListMap$Node;)V
 HSPLjava/util/concurrent/ConcurrentSkipListMap$Node;->appendMarker(Ljava/util/concurrent/ConcurrentSkipListMap$Node;)Z
@@ -41501,22 +37437,14 @@
 HSPLjava/util/concurrent/ConcurrentSkipListMap$Node;->casValue(Ljava/lang/Object;Ljava/lang/Object;)Z
 HSPLjava/util/concurrent/ConcurrentSkipListMap;-><init>()V
 HSPLjava/util/concurrent/ConcurrentSkipListMap;->casHead(Ljava/util/concurrent/ConcurrentSkipListMap$HeadIndex;Ljava/util/concurrent/ConcurrentSkipListMap$HeadIndex;)Z
-HSPLjava/util/concurrent/ConcurrentSkipListMap;->clear()V
-HSPLjava/util/concurrent/ConcurrentSkipListMap;->containsKey(Ljava/lang/Object;)Z
 HSPLjava/util/concurrent/ConcurrentSkipListMap;->cpr(Ljava/util/Comparator;Ljava/lang/Object;Ljava/lang/Object;)I
-HSPLjava/util/concurrent/ConcurrentSkipListMap;->doGet(Ljava/lang/Object;)Ljava/lang/Object;
 HSPLjava/util/concurrent/ConcurrentSkipListMap;->doPut(Ljava/lang/Object;Ljava/lang/Object;Z)Ljava/lang/Object;
 HSPLjava/util/concurrent/ConcurrentSkipListMap;->doRemove(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/concurrent/ConcurrentSkipListMap;->findFirst()Ljava/util/concurrent/ConcurrentSkipListMap$Node;
 HSPLjava/util/concurrent/ConcurrentSkipListMap;->findPredecessor(Ljava/lang/Object;Ljava/util/Comparator;)Ljava/util/concurrent/ConcurrentSkipListMap$Node;
 HSPLjava/util/concurrent/ConcurrentSkipListMap;->initialize()V
 HSPLjava/util/concurrent/ConcurrentSkipListMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/concurrent/ConcurrentSkipListMap;->putIfAbsent(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
 HSPLjava/util/concurrent/ConcurrentSkipListMap;->remove(Ljava/lang/Object;)Ljava/lang/Object;
 HSPLjava/util/concurrent/ConcurrentSkipListMap;->tryReduceLevel()V
-HSPLjava/util/concurrent/ConcurrentSkipListSet;-><init>()V
-HSPLjava/util/concurrent/ConcurrentSkipListSet;->add(Ljava/lang/Object;)Z
-HSPLjava/util/concurrent/ConcurrentSkipListSet;->contains(Ljava/lang/Object;)Z
 HSPLjava/util/concurrent/CopyOnWriteArrayList$COWIterator;-><init>([Ljava/lang/Object;I)V
 HSPLjava/util/concurrent/CopyOnWriteArrayList$COWIterator;->hasNext()Z
 HSPLjava/util/concurrent/CopyOnWriteArrayList$COWIterator;->next()Ljava/lang/Object;
@@ -41549,7 +37477,6 @@
 HSPLjava/util/concurrent/CopyOnWriteArrayList;->toString()Ljava/lang/String;
 HSPLjava/util/concurrent/CopyOnWriteArraySet;-><init>()V
 HSPLjava/util/concurrent/CopyOnWriteArraySet;->add(Ljava/lang/Object;)Z
-HSPLjava/util/concurrent/CopyOnWriteArraySet;->clear()V
 HSPLjava/util/concurrent/CopyOnWriteArraySet;->isEmpty()Z
 HSPLjava/util/concurrent/CopyOnWriteArraySet;->iterator()Ljava/util/Iterator;
 HSPLjava/util/concurrent/CopyOnWriteArraySet;->remove(Ljava/lang/Object;)Z
@@ -41580,7 +37507,6 @@
 HSPLjava/util/concurrent/Executors$FinalizableDelegatedExecutorService;->finalize()V
 HSPLjava/util/concurrent/Executors$RunnableAdapter;-><init>(Ljava/lang/Runnable;Ljava/lang/Object;)V
 HSPLjava/util/concurrent/Executors$RunnableAdapter;->call()Ljava/lang/Object;
-HSPLjava/util/concurrent/Executors;->callable(Ljava/lang/Runnable;)Ljava/util/concurrent/Callable;
 HSPLjava/util/concurrent/Executors;->callable(Ljava/lang/Runnable;Ljava/lang/Object;)Ljava/util/concurrent/Callable;
 HSPLjava/util/concurrent/Executors;->defaultThreadFactory()Ljava/util/concurrent/ThreadFactory;
 HSPLjava/util/concurrent/Executors;->newCachedThreadPool()Ljava/util/concurrent/ExecutorService;
@@ -41631,18 +37557,13 @@
 HSPLjava/util/concurrent/LinkedBlockingDeque;->add(Ljava/lang/Object;)Z
 HSPLjava/util/concurrent/LinkedBlockingDeque;->addFirst(Ljava/lang/Object;)V
 HSPLjava/util/concurrent/LinkedBlockingDeque;->addLast(Ljava/lang/Object;)V
-HSPLjava/util/concurrent/LinkedBlockingDeque;->clear()V
 HSPLjava/util/concurrent/LinkedBlockingDeque;->iterator()Ljava/util/Iterator;
 HSPLjava/util/concurrent/LinkedBlockingDeque;->linkFirst(Ljava/util/concurrent/LinkedBlockingDeque$Node;)Z
 HSPLjava/util/concurrent/LinkedBlockingDeque;->linkLast(Ljava/util/concurrent/LinkedBlockingDeque$Node;)Z
 HSPLjava/util/concurrent/LinkedBlockingDeque;->offer(Ljava/lang/Object;)Z
 HSPLjava/util/concurrent/LinkedBlockingDeque;->offerFirst(Ljava/lang/Object;)Z
 HSPLjava/util/concurrent/LinkedBlockingDeque;->offerLast(Ljava/lang/Object;)Z
-HSPLjava/util/concurrent/LinkedBlockingDeque;->peekFirst()Ljava/lang/Object;
-HSPLjava/util/concurrent/LinkedBlockingDeque;->poll()Ljava/lang/Object;
-HSPLjava/util/concurrent/LinkedBlockingDeque;->poll(JLjava/util/concurrent/TimeUnit;)Ljava/lang/Object;
 HSPLjava/util/concurrent/LinkedBlockingDeque;->pollFirst()Ljava/lang/Object;
-HSPLjava/util/concurrent/LinkedBlockingDeque;->pollFirst(JLjava/util/concurrent/TimeUnit;)Ljava/lang/Object;
 HPLjava/util/concurrent/LinkedBlockingDeque;->pop()Ljava/lang/Object;
 HSPLjava/util/concurrent/LinkedBlockingDeque;->remainingCapacity()I
 HSPLjava/util/concurrent/LinkedBlockingDeque;->removeFirst()Ljava/lang/Object;
@@ -41665,7 +37586,6 @@
 HSPLjava/util/concurrent/LinkedBlockingQueue;->iterator()Ljava/util/Iterator;
 HSPLjava/util/concurrent/LinkedBlockingQueue;->offer(Ljava/lang/Object;)Z
 HSPLjava/util/concurrent/LinkedBlockingQueue;->offer(Ljava/lang/Object;JLjava/util/concurrent/TimeUnit;)Z
-HSPLjava/util/concurrent/LinkedBlockingQueue;->peek()Ljava/lang/Object;
 HSPLjava/util/concurrent/LinkedBlockingQueue;->poll()Ljava/lang/Object;
 HSPLjava/util/concurrent/LinkedBlockingQueue;->poll(JLjava/util/concurrent/TimeUnit;)Ljava/lang/Object;
 HSPLjava/util/concurrent/LinkedBlockingQueue;->put(Ljava/lang/Object;)V
@@ -41677,15 +37597,12 @@
 HSPLjava/util/concurrent/PriorityBlockingQueue;-><init>(ILjava/util/Comparator;)V
 HSPLjava/util/concurrent/PriorityBlockingQueue;->add(Ljava/lang/Object;)Z
 HSPLjava/util/concurrent/PriorityBlockingQueue;->dequeue()Ljava/lang/Object;
-HSPLjava/util/concurrent/PriorityBlockingQueue;->indexOf(Ljava/lang/Object;)I
 HSPLjava/util/concurrent/PriorityBlockingQueue;->offer(Ljava/lang/Object;)Z
 HSPLjava/util/concurrent/PriorityBlockingQueue;->peek()Ljava/lang/Object;
 HSPLjava/util/concurrent/PriorityBlockingQueue;->poll()Ljava/lang/Object;
 HSPLjava/util/concurrent/PriorityBlockingQueue;->put(Ljava/lang/Object;)V
 HSPLjava/util/concurrent/PriorityBlockingQueue;->siftDownComparable(ILjava/lang/Object;[Ljava/lang/Object;I)V
-HSPLjava/util/concurrent/PriorityBlockingQueue;->siftDownUsingComparator(ILjava/lang/Object;[Ljava/lang/Object;ILjava/util/Comparator;)V
 HSPLjava/util/concurrent/PriorityBlockingQueue;->siftUpComparable(ILjava/lang/Object;[Ljava/lang/Object;)V
-HSPLjava/util/concurrent/PriorityBlockingQueue;->siftUpUsingComparator(ILjava/lang/Object;[Ljava/lang/Object;Ljava/util/Comparator;)V
 HSPLjava/util/concurrent/PriorityBlockingQueue;->size()I
 HSPLjava/util/concurrent/PriorityBlockingQueue;->take()Ljava/lang/Object;
 HSPLjava/util/concurrent/PriorityBlockingQueue;->tryGrow([Ljava/lang/Object;I)V
@@ -41826,9 +37743,7 @@
 HSPLjava/util/concurrent/ThreadPoolExecutor;->ensurePrestart()V
 HSPLjava/util/concurrent/ThreadPoolExecutor;->execute(Ljava/lang/Runnable;)V
 HSPLjava/util/concurrent/ThreadPoolExecutor;->finalize()V
-HSPLjava/util/concurrent/ThreadPoolExecutor;->getMaximumPoolSize()I
 HSPLjava/util/concurrent/ThreadPoolExecutor;->getQueue()Ljava/util/concurrent/BlockingQueue;
-HSPLjava/util/concurrent/ThreadPoolExecutor;->getRejectedExecutionHandler()Ljava/util/concurrent/RejectedExecutionHandler;
 HSPLjava/util/concurrent/ThreadPoolExecutor;->getTask()Ljava/lang/Runnable;
 HSPLjava/util/concurrent/ThreadPoolExecutor;->getThreadFactory()Ljava/util/concurrent/ThreadFactory;
 HSPLjava/util/concurrent/ThreadPoolExecutor;->interruptIdleWorkers()V
@@ -41839,7 +37754,6 @@
 HSPLjava/util/concurrent/ThreadPoolExecutor;->isShutdown()Z
 HSPLjava/util/concurrent/ThreadPoolExecutor;->onShutdown()V
 HSPLjava/util/concurrent/ThreadPoolExecutor;->prestartAllCoreThreads()I
-HSPLjava/util/concurrent/ThreadPoolExecutor;->prestartCoreThread()Z
 HSPLjava/util/concurrent/ThreadPoolExecutor;->processWorkerExit(Ljava/util/concurrent/ThreadPoolExecutor$Worker;Z)V
 HSPLjava/util/concurrent/ThreadPoolExecutor;->purge()V
 HSPLjava/util/concurrent/ThreadPoolExecutor;->reject(Ljava/lang/Runnable;)V
@@ -41859,12 +37773,9 @@
 HSPLjava/util/concurrent/ThreadPoolExecutor;->tryTerminate()V
 HSPLjava/util/concurrent/ThreadPoolExecutor;->workerCountOf(I)I
 HSPLjava/util/concurrent/TimeUnit$1;->convert(JLjava/util/concurrent/TimeUnit;)J
-HSPLjava/util/concurrent/TimeUnit$1;->excessNanos(JJ)I
-HSPLjava/util/concurrent/TimeUnit$1;->toDays(J)J
 HSPLjava/util/concurrent/TimeUnit$1;->toHours(J)J
 HSPLjava/util/concurrent/TimeUnit$1;->toMicros(J)J
 HSPLjava/util/concurrent/TimeUnit$1;->toMillis(J)J
-HSPLjava/util/concurrent/TimeUnit$1;->toMinutes(J)J
 HSPLjava/util/concurrent/TimeUnit$1;->toNanos(J)J
 HSPLjava/util/concurrent/TimeUnit$1;->toSeconds(J)J
 HSPLjava/util/concurrent/TimeUnit$2;->convert(JLjava/util/concurrent/TimeUnit;)J
@@ -41883,7 +37794,6 @@
 HSPLjava/util/concurrent/TimeUnit$4;->convert(JLjava/util/concurrent/TimeUnit;)J
 HSPLjava/util/concurrent/TimeUnit$4;->toMicros(J)J
 HSPLjava/util/concurrent/TimeUnit$4;->toMillis(J)J
-HSPLjava/util/concurrent/TimeUnit$4;->toMinutes(J)J
 HSPLjava/util/concurrent/TimeUnit$4;->toNanos(J)J
 HSPLjava/util/concurrent/TimeUnit$4;->toSeconds(J)J
 HSPLjava/util/concurrent/TimeUnit$5;->convert(JLjava/util/concurrent/TimeUnit;)J
@@ -41897,13 +37807,10 @@
 HSPLjava/util/concurrent/TimeUnit$6;->toNanos(J)J
 HSPLjava/util/concurrent/TimeUnit$6;->toSeconds(J)J
 HSPLjava/util/concurrent/TimeUnit$7;->convert(JLjava/util/concurrent/TimeUnit;)J
-HSPLjava/util/concurrent/TimeUnit$7;->toHours(J)J
 HSPLjava/util/concurrent/TimeUnit$7;->toMillis(J)J
 HSPLjava/util/concurrent/TimeUnit$7;->toMinutes(J)J
 HSPLjava/util/concurrent/TimeUnit$7;->toNanos(J)J
 HSPLjava/util/concurrent/TimeUnit$7;->toSeconds(J)J
-HSPLjava/util/concurrent/TimeUnit;->sleep(J)V
-HSPLjava/util/concurrent/TimeUnit;->values()[Ljava/util/concurrent/TimeUnit;
 HSPLjava/util/concurrent/TimeUnit;->x(JJJ)J
 HSPLjava/util/concurrent/TimeoutException;-><init>()V
 HSPLjava/util/concurrent/TimeoutException;-><init>(Ljava/lang/String;)V
@@ -41928,16 +37835,11 @@
 HSPLjava/util/concurrent/atomic/AtomicInteger;->incrementAndGet()I
 HSPLjava/util/concurrent/atomic/AtomicInteger;->lazySet(I)V
 HSPLjava/util/concurrent/atomic/AtomicInteger;->set(I)V
-HSPLjava/util/concurrent/atomic/AtomicInteger;->toString()Ljava/lang/String;
-HSPLjava/util/concurrent/atomic/AtomicIntegerArray;-><init>(I)V
-HSPLjava/util/concurrent/atomic/AtomicIntegerArray;->byteOffset(I)J
-HSPLjava/util/concurrent/atomic/AtomicIntegerArray;->checkedByteOffset(I)J
 HSPLjava/util/concurrent/atomic/AtomicIntegerFieldUpdater$AtomicIntegerFieldUpdaterImpl;-><init>(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/Class;)V
 HSPLjava/util/concurrent/atomic/AtomicIntegerFieldUpdater$AtomicIntegerFieldUpdaterImpl;->accessCheck(Ljava/lang/Object;)V
 HSPLjava/util/concurrent/atomic/AtomicIntegerFieldUpdater$AtomicIntegerFieldUpdaterImpl;->compareAndSet(Ljava/lang/Object;II)Z
 HSPLjava/util/concurrent/atomic/AtomicIntegerFieldUpdater$AtomicIntegerFieldUpdaterImpl;->decrementAndGet(Ljava/lang/Object;)I
 HSPLjava/util/concurrent/atomic/AtomicIntegerFieldUpdater$AtomicIntegerFieldUpdaterImpl;->getAndAdd(Ljava/lang/Object;I)I
-HSPLjava/util/concurrent/atomic/AtomicIntegerFieldUpdater$AtomicIntegerFieldUpdaterImpl;->getAndSet(Ljava/lang/Object;I)I
 HSPLjava/util/concurrent/atomic/AtomicIntegerFieldUpdater$AtomicIntegerFieldUpdaterImpl;->set(Ljava/lang/Object;I)V
 HSPLjava/util/concurrent/atomic/AtomicIntegerFieldUpdater;-><init>()V
 HSPLjava/util/concurrent/atomic/AtomicIntegerFieldUpdater;->newUpdater(Ljava/lang/Class;Ljava/lang/String;)Ljava/util/concurrent/atomic/AtomicIntegerFieldUpdater;
@@ -41958,7 +37860,6 @@
 HSPLjava/util/concurrent/atomic/AtomicLongFieldUpdater$CASUpdater;-><init>(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/Class;)V
 HSPLjava/util/concurrent/atomic/AtomicLongFieldUpdater$CASUpdater;->accessCheck(Ljava/lang/Object;)V
 HSPLjava/util/concurrent/atomic/AtomicLongFieldUpdater$CASUpdater;->getAndAdd(Ljava/lang/Object;J)J
-HSPLjava/util/concurrent/atomic/AtomicLongFieldUpdater$CASUpdater;->getAndIncrement(Ljava/lang/Object;)J
 HSPLjava/util/concurrent/atomic/AtomicLongFieldUpdater$CASUpdater;->incrementAndGet(Ljava/lang/Object;)J
 HSPLjava/util/concurrent/atomic/AtomicLongFieldUpdater;-><init>()V
 HSPLjava/util/concurrent/atomic/AtomicLongFieldUpdater;->newUpdater(Ljava/lang/Class;Ljava/lang/String;)Ljava/util/concurrent/atomic/AtomicLongFieldUpdater;
@@ -41990,13 +37891,8 @@
 HSPLjava/util/concurrent/atomic/AtomicReferenceFieldUpdater;->newUpdater(Ljava/lang/Class;Ljava/lang/Class;Ljava/lang/String;)Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater;
 HSPLjava/util/concurrent/atomic/LongAdder;-><init>()V
 HSPLjava/util/concurrent/atomic/LongAdder;->add(J)V
-HSPLjava/util/concurrent/atomic/Striped64$Cell;-><clinit>()V
-HSPLjava/util/concurrent/atomic/Striped64$Cell;-><init>(J)V
 HSPLjava/util/concurrent/atomic/Striped64;-><init>()V
 HSPLjava/util/concurrent/atomic/Striped64;->casBase(JJ)Z
-HSPLjava/util/concurrent/atomic/Striped64;->casCellsBusy()Z
-HSPLjava/util/concurrent/atomic/Striped64;->getProbe()I
-HSPLjava/util/concurrent/atomic/Striped64;->longAccumulate(JLjava/util/function/LongBinaryOperator;Z)V
 HSPLjava/util/concurrent/locks/AbstractOwnableSynchronizer;-><init>()V
 HSPLjava/util/concurrent/locks/AbstractOwnableSynchronizer;->getExclusiveOwnerThread()Ljava/lang/Thread;
 HSPLjava/util/concurrent/locks/AbstractOwnableSynchronizer;->setExclusiveOwnerThread(Ljava/lang/Thread;)V
@@ -42055,7 +37951,6 @@
 HSPLjava/util/concurrent/locks/AbstractQueuedSynchronizer;->shouldParkAfterFailedAcquire(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;)Z
 HSPLjava/util/concurrent/locks/AbstractQueuedSynchronizer;->transferAfterCancelledWait(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;)Z
 HSPLjava/util/concurrent/locks/AbstractQueuedSynchronizer;->transferForSignal(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;)Z
-HSPLjava/util/concurrent/locks/AbstractQueuedSynchronizer;->tryAcquireNanos(IJ)Z
 HSPLjava/util/concurrent/locks/AbstractQueuedSynchronizer;->tryAcquireSharedNanos(IJ)Z
 HSPLjava/util/concurrent/locks/AbstractQueuedSynchronizer;->unparkSuccessor(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;)V
 HSPLjava/util/concurrent/locks/LockSupport;->park(Ljava/lang/Object;)V
@@ -42081,7 +37976,6 @@
 HSPLjava/util/concurrent/locks/ReentrantLock;->lockInterruptibly()V
 HSPLjava/util/concurrent/locks/ReentrantLock;->newCondition()Ljava/util/concurrent/locks/Condition;
 HSPLjava/util/concurrent/locks/ReentrantLock;->tryLock()Z
-HSPLjava/util/concurrent/locks/ReentrantLock;->tryLock(JLjava/util/concurrent/TimeUnit;)Z
 HSPLjava/util/concurrent/locks/ReentrantLock;->unlock()V
 HSPLjava/util/concurrent/locks/ReentrantReadWriteLock$FairSync;-><init>()V
 HSPLjava/util/concurrent/locks/ReentrantReadWriteLock$FairSync;->readerShouldBlock()Z
@@ -42118,23 +38012,21 @@
 HSPLjava/util/function/-$$Lambda$BinaryOperator$V_WUclL0kAOZvMw9EtWtwAvmNJc;-><init>(Ljava/util/Comparator;)V
 HSPLjava/util/function/-$$Lambda$BinaryOperator$V_WUclL0kAOZvMw9EtWtwAvmNJc;->apply(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
 HSPLjava/util/function/-$$Lambda$BinaryOperator$WKN0kahVeFfmJEk_tKszY8tRayo;-><init>(Ljava/util/Comparator;)V
+HSPLjava/util/function/-$$Lambda$BinaryOperator$WKN0kahVeFfmJEk_tKszY8tRayo;->apply(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
 HSPLjava/util/function/-$$Lambda$DoubleUnaryOperator$EzzlhUGRoL66wVBCG-_euZgC-CA;-><init>(Ljava/util/function/DoubleUnaryOperator;Ljava/util/function/DoubleUnaryOperator;)V
 HSPLjava/util/function/-$$Lambda$DoubleUnaryOperator$EzzlhUGRoL66wVBCG-_euZgC-CA;->applyAsDouble(D)D
 HSPLjava/util/function/-$$Lambda$Function$1mm3dZ9IMG2T6zAULCCEh3eoHSY;->apply(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/function/-$$Lambda$Function$T8wYIfMRq5hbW0Q4qNkHIIrI-BA;-><init>(Ljava/util/function/Function;Ljava/util/function/Function;)V
-HSPLjava/util/function/-$$Lambda$Function$T8wYIfMRq5hbW0Q4qNkHIIrI-BA;->apply(Ljava/lang/Object;)Ljava/lang/Object;
 HSPLjava/util/function/-$$Lambda$Predicate$17UUIF1CH_K9duk0ChtjSwOycuM;-><init>(Ljava/util/function/Predicate;Ljava/util/function/Predicate;)V
 HSPLjava/util/function/-$$Lambda$Predicate$17UUIF1CH_K9duk0ChtjSwOycuM;->test(Ljava/lang/Object;)Z
 HPLjava/util/function/-$$Lambda$Predicate$GyIVQ08CWbeMZxHDkkrN-5apRkc;-><init>(Ljava/util/function/Predicate;Ljava/util/function/Predicate;)V
 PLjava/util/function/-$$Lambda$Predicate$GyIVQ08CWbeMZxHDkkrN-5apRkc;->test(Ljava/lang/Object;)Z
 HSPLjava/util/function/BinaryOperator;->lambda$maxBy$1(Ljava/util/Comparator;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLjava/util/function/BinaryOperator;->lambda$minBy$0(Ljava/util/Comparator;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
 HSPLjava/util/function/BinaryOperator;->maxBy(Ljava/util/Comparator;)Ljava/util/function/BinaryOperator;
 HSPLjava/util/function/BinaryOperator;->minBy(Ljava/util/Comparator;)Ljava/util/function/BinaryOperator;
 HSPLjava/util/function/DoubleUnaryOperator;->andThen(Ljava/util/function/DoubleUnaryOperator;)Ljava/util/function/DoubleUnaryOperator;
 HSPLjava/util/function/DoubleUnaryOperator;->lambda$andThen$1(Ljava/util/function/DoubleUnaryOperator;Ljava/util/function/DoubleUnaryOperator;D)D
-HSPLjava/util/function/Function;->andThen(Ljava/util/function/Function;)Ljava/util/function/Function;
 HSPLjava/util/function/Function;->identity()Ljava/util/function/Function;
-HSPLjava/util/function/Function;->lambda$andThen$1(Ljava/util/function/Function;Ljava/util/function/Function;Ljava/lang/Object;)Ljava/lang/Object;
 HSPLjava/util/function/Function;->lambda$identity$2(Ljava/lang/Object;)Ljava/lang/Object;
 HPLjava/util/function/Predicate;->and(Ljava/util/function/Predicate;)Ljava/util/function/Predicate;
 PLjava/util/function/Predicate;->lambda$and$0(Ljava/util/function/Predicate;Ljava/util/function/Predicate;Ljava/lang/Object;)Z
@@ -42173,7 +38065,6 @@
 HSPLjava/util/jar/JarFile;->maybeInstantiateVerifier()V
 HSPLjava/util/jar/JarVerifier$3;-><init>(Ljava/util/jar/JarVerifier;)V
 HSPLjava/util/jar/JarVerifier$VerifierStream;-><init>(Ljava/util/jar/Manifest;Ljava/util/jar/JarEntry;Ljava/io/InputStream;Ljava/util/jar/JarVerifier;)V
-HSPLjava/util/jar/JarVerifier$VerifierStream;->available()I
 HSPLjava/util/jar/JarVerifier$VerifierStream;->close()V
 HSPLjava/util/jar/JarVerifier$VerifierStream;->read()I
 HSPLjava/util/jar/JarVerifier$VerifierStream;->read([BII)I
@@ -42200,43 +38091,15 @@
 HSPLjava/util/jar/Manifest;->read(Ljava/io/InputStream;)V
 HSPLjava/util/jar/Manifest;->toLower(I)I
 HSPLjava/util/logging/ErrorManager;-><init>()V
-HSPLjava/util/logging/FileHandler$1;-><init>(Ljava/util/logging/FileHandler;)V
-HSPLjava/util/logging/FileHandler$1;->run()Ljava/lang/Object;
-HSPLjava/util/logging/FileHandler$InitializationErrorManager;-><init>()V
-HSPLjava/util/logging/FileHandler$InitializationErrorManager;-><init>(Ljava/util/logging/FileHandler$1;)V
-HSPLjava/util/logging/FileHandler$MeteredStream;-><init>(Ljava/util/logging/FileHandler;Ljava/io/OutputStream;I)V
-HSPLjava/util/logging/FileHandler$MeteredStream;->close()V
-HSPLjava/util/logging/FileHandler$MeteredStream;->flush()V
-HSPLjava/util/logging/FileHandler$MeteredStream;->write([BII)V
-HSPLjava/util/logging/FileHandler;-><clinit>()V
-HSPLjava/util/logging/FileHandler;-><init>(Ljava/lang/String;IIZ)V
-HSPLjava/util/logging/FileHandler;->access$100(Ljava/util/logging/FileHandler;)V
-HSPLjava/util/logging/FileHandler;->configure()V
-HSPLjava/util/logging/FileHandler;->generate(Ljava/lang/String;II)Ljava/io/File;
-HSPLjava/util/logging/FileHandler;->isParentWritable(Ljava/nio/file/Path;)Z
-HSPLjava/util/logging/FileHandler;->open(Ljava/io/File;Z)V
-HSPLjava/util/logging/FileHandler;->openFiles()V
-HSPLjava/util/logging/FileHandler;->publish(Ljava/util/logging/LogRecord;)V
-HSPLjava/util/logging/FileHandler;->rotate()V
-HSPLjava/util/logging/Formatter;-><init>()V
-HSPLjava/util/logging/Formatter;->formatMessage(Ljava/util/logging/LogRecord;)Ljava/lang/String;
-HSPLjava/util/logging/Formatter;->getHead(Ljava/util/logging/Handler;)Ljava/lang/String;
-HSPLjava/util/logging/Formatter;->getTail(Ljava/util/logging/Handler;)Ljava/lang/String;
 HSPLjava/util/logging/Handler;-><init>()V
 HSPLjava/util/logging/Handler;->checkPermission()V
-HSPLjava/util/logging/Handler;->getEncoding()Ljava/lang/String;
 HSPLjava/util/logging/Handler;->getFilter()Ljava/util/logging/Filter;
 HSPLjava/util/logging/Handler;->getFormatter()Ljava/util/logging/Formatter;
 HSPLjava/util/logging/Handler;->getLevel()Ljava/util/logging/Level;
 HSPLjava/util/logging/Handler;->isLoggable(Ljava/util/logging/LogRecord;)Z
-HSPLjava/util/logging/Handler;->setEncoding(Ljava/lang/String;)V
-HSPLjava/util/logging/Handler;->setErrorManager(Ljava/util/logging/ErrorManager;)V
-HSPLjava/util/logging/Handler;->setFilter(Ljava/util/logging/Filter;)V
 HSPLjava/util/logging/Handler;->setFormatter(Ljava/util/logging/Formatter;)V
 HSPLjava/util/logging/Handler;->setLevel(Ljava/util/logging/Level;)V
-HSPLjava/util/logging/Level$KnownLevel;->findByName(Ljava/lang/String;)Ljava/util/logging/Level$KnownLevel;
 HSPLjava/util/logging/Level;->equals(Ljava/lang/Object;)Z
-HSPLjava/util/logging/Level;->findLevel(Ljava/lang/String;)Ljava/util/logging/Level;
 HSPLjava/util/logging/Level;->intValue()I
 HSPLjava/util/logging/LogManager$5;-><init>(Ljava/util/logging/LogManager;Ljava/lang/String;Ljava/util/logging/Logger;)V
 HSPLjava/util/logging/LogManager$5;->run()Ljava/lang/Object;
@@ -42281,14 +38144,10 @@
 HSPLjava/util/logging/LogManager;->drainLoggerRefQueueBounded()V
 HSPLjava/util/logging/LogManager;->ensureLogManagerInitialized()V
 HSPLjava/util/logging/LogManager;->getBooleanProperty(Ljava/lang/String;Z)Z
-HSPLjava/util/logging/LogManager;->getFilterProperty(Ljava/lang/String;Ljava/util/logging/Filter;)Ljava/util/logging/Filter;
-HSPLjava/util/logging/LogManager;->getFormatterProperty(Ljava/lang/String;Ljava/util/logging/Formatter;)Ljava/util/logging/Formatter;
-HSPLjava/util/logging/LogManager;->getIntProperty(Ljava/lang/String;I)I
 HSPLjava/util/logging/LogManager;->getLevelProperty(Ljava/lang/String;Ljava/util/logging/Level;)Ljava/util/logging/Level;
 HSPLjava/util/logging/LogManager;->getLogManager()Ljava/util/logging/LogManager;
 HSPLjava/util/logging/LogManager;->getLogger(Ljava/lang/String;)Ljava/util/logging/Logger;
 HSPLjava/util/logging/LogManager;->getProperty(Ljava/lang/String;)Ljava/lang/String;
-HSPLjava/util/logging/LogManager;->getStringProperty(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
 HSPLjava/util/logging/LogManager;->getSystemContext()Ljava/util/logging/LogManager$LoggerContext;
 HSPLjava/util/logging/LogManager;->getUserContext()Ljava/util/logging/LogManager$LoggerContext;
 HSPLjava/util/logging/LogManager;->initializeGlobalHandlers()V
@@ -42301,15 +38160,8 @@
 HSPLjava/util/logging/LogRecord;->getLevel()Ljava/util/logging/Level;
 HSPLjava/util/logging/LogRecord;->getLoggerName()Ljava/lang/String;
 HSPLjava/util/logging/LogRecord;->getMessage()Ljava/lang/String;
-HSPLjava/util/logging/LogRecord;->getMillis()J
-HSPLjava/util/logging/LogRecord;->getParameters()[Ljava/lang/Object;
-HSPLjava/util/logging/LogRecord;->getResourceBundle()Ljava/util/ResourceBundle;
 HSPLjava/util/logging/LogRecord;->getThrown()Ljava/lang/Throwable;
-HSPLjava/util/logging/LogRecord;->setLevel(Ljava/util/logging/Level;)V
 HSPLjava/util/logging/LogRecord;->setLoggerName(Ljava/lang/String;)V
-HSPLjava/util/logging/LogRecord;->setMessage(Ljava/lang/String;)V
-HSPLjava/util/logging/LogRecord;->setMillis(J)V
-HSPLjava/util/logging/LogRecord;->setParameters([Ljava/lang/Object;)V
 HSPLjava/util/logging/LogRecord;->setSourceClassName(Ljava/lang/String;)V
 HSPLjava/util/logging/LogRecord;->setSourceMethodName(Ljava/lang/String;)V
 HSPLjava/util/logging/LogRecord;->setThrown(Ljava/lang/Throwable;)V
@@ -42352,22 +38204,7 @@
 HSPLjava/util/logging/Logger;->setParent(Ljava/util/logging/Logger;)V
 HSPLjava/util/logging/Logger;->setupResourceInfo(Ljava/lang/String;Ljava/lang/Class;)V
 HSPLjava/util/logging/Logger;->updateEffectiveLevel()V
-HSPLjava/util/logging/Logger;->warning(Ljava/lang/String;)V
 HSPLjava/util/logging/LoggingProxyImpl;->getLogger(Ljava/lang/String;)Ljava/lang/Object;
-HSPLjava/util/logging/LoggingProxyImpl;->getProperty(Ljava/lang/String;)Ljava/lang/String;
-HSPLjava/util/logging/LoggingProxyImpl;->parseLevel(Ljava/lang/String;)Ljava/lang/Object;
-HSPLjava/util/logging/SimpleFormatter;-><clinit>()V
-HSPLjava/util/logging/SimpleFormatter;-><init>()V
-HSPLjava/util/logging/StreamHandler;-><init>()V
-HSPLjava/util/logging/StreamHandler;->close()V
-HSPLjava/util/logging/StreamHandler;->configure()V
-HSPLjava/util/logging/StreamHandler;->flush()V
-HSPLjava/util/logging/StreamHandler;->flushAndClose()V
-HSPLjava/util/logging/StreamHandler;->isLoggable(Ljava/util/logging/LogRecord;)Z
-HSPLjava/util/logging/StreamHandler;->publish(Ljava/util/logging/LogRecord;)V
-HSPLjava/util/logging/StreamHandler;->setEncoding(Ljava/lang/String;)V
-HSPLjava/util/logging/StreamHandler;->setOutputStream(Ljava/io/OutputStream;)V
-HSPLjava/util/logging/XMLFormatter;-><init>()V
 HSPLjava/util/regex/Matcher;-><init>(Ljava/util/regex/Pattern;Ljava/lang/CharSequence;)V
 HSPLjava/util/regex/Matcher;->appendEvaluated(Ljava/lang/StringBuffer;Ljava/lang/String;)V
 HSPLjava/util/regex/Matcher;->appendReplacement(Ljava/lang/StringBuffer;Ljava/lang/String;)Ljava/util/regex/Matcher;
@@ -42385,13 +38222,9 @@
 HSPLjava/util/regex/Matcher;->hitEnd()Z
 HSPLjava/util/regex/Matcher;->lookingAt()Z
 HSPLjava/util/regex/Matcher;->matches()Z
-HSPLjava/util/regex/Matcher;->pattern()Ljava/util/regex/Pattern;
 HSPLjava/util/regex/Matcher;->region(II)Ljava/util/regex/Matcher;
-HSPLjava/util/regex/Matcher;->regionEnd()I
-HSPLjava/util/regex/Matcher;->regionStart()I
 HSPLjava/util/regex/Matcher;->replaceAll(Ljava/lang/String;)Ljava/lang/String;
 HSPLjava/util/regex/Matcher;->replaceFirst(Ljava/lang/String;)Ljava/lang/String;
-HSPLjava/util/regex/Matcher;->requireEnd()Z
 HSPLjava/util/regex/Matcher;->reset()Ljava/util/regex/Matcher;
 HSPLjava/util/regex/Matcher;->reset(Ljava/lang/CharSequence;)Ljava/util/regex/Matcher;
 HSPLjava/util/regex/Matcher;->reset(Ljava/lang/CharSequence;II)Ljava/util/regex/Matcher;
@@ -42412,14 +38245,12 @@
 HSPLjava/util/regex/Pattern;->quote(Ljava/lang/String;)Ljava/lang/String;
 HSPLjava/util/regex/Pattern;->split(Ljava/lang/CharSequence;)[Ljava/lang/String;
 HSPLjava/util/regex/Pattern;->split(Ljava/lang/CharSequence;I)[Ljava/lang/String;
+HSPLjava/util/regex/Pattern;->toString()Ljava/lang/String;
 HSPLjava/util/stream/-$$Lambda$Abl7XfE0Z4AgkViLas9vhsO9mjw;-><init>(Ljava/util/stream/Sink;)V
 HSPLjava/util/stream/-$$Lambda$Abl7XfE0Z4AgkViLas9vhsO9mjw;->accept(Ljava/lang/Object;)V
-HSPLjava/util/stream/-$$Lambda$AbstractPipeline$ImXhRLJT29W8lJFXpTT_PieAotg;-><init>(Ljava/util/stream/AbstractPipeline;)V
-HSPLjava/util/stream/-$$Lambda$AbstractPipeline$ImXhRLJT29W8lJFXpTT_PieAotg;->get()Ljava/lang/Object;
 HSPLjava/util/stream/-$$Lambda$Collectors$F7-we3W7I2plNaGHqh_d2lzmvho;-><init>(Ljava/util/function/Function;Ljava/util/function/Supplier;Ljava/util/function/BiConsumer;)V
 HSPLjava/util/stream/-$$Lambda$Collectors$F7-we3W7I2plNaGHqh_d2lzmvho;->accept(Ljava/lang/Object;Ljava/lang/Object;)V
 HSPLjava/util/stream/-$$Lambda$Collectors$TzSZZBK0laNSWMge_uuxANwkkMo;-><init>(Ljava/util/function/BinaryOperator;)V
-HSPLjava/util/stream/-$$Lambda$Collectors$f0IPpRuyw9HZC8FIP30mNjUUUhw;->apply(Ljava/lang/Object;)Ljava/lang/Object;
 HSPLjava/util/stream/-$$Lambda$Collectors$f68RHYk8qNU7alEHPPrPoFuCJO4;-><init>(Ljava/util/function/Supplier;)V
 HSPLjava/util/stream/-$$Lambda$Collectors$f68RHYk8qNU7alEHPPrPoFuCJO4;->apply(Ljava/lang/Object;)Ljava/lang/Object;
 HSPLjava/util/stream/-$$Lambda$Collectors$nKlT6uFghrTzWO44dlFAJFeRr34;-><init>(Ljava/util/function/Function;Ljava/util/function/Function;Ljava/util/function/BinaryOperator;)V
@@ -42427,18 +38258,13 @@
 HSPLjava/util/stream/-$$Lambda$Collectors$pzPeDl3rCgtNVSeZPHZk5f2se60;-><init>(Ljava/lang/CharSequence;Ljava/lang/CharSequence;Ljava/lang/CharSequence;)V
 HSPLjava/util/stream/-$$Lambda$Collectors$pzPeDl3rCgtNVSeZPHZk5f2se60;->get()Ljava/lang/Object;
 HSPLjava/util/stream/-$$Lambda$Drw47GGUtPrz9CklhlT0v26u-5c;->accept(Ljava/lang/Object;Ljava/lang/Object;)V
-HSPLjava/util/stream/-$$Lambda$GF-s38TgrG6hfxe__ZFdhGp-wPw;-><init>(Ljava/util/stream/SpinedBuffer;)V
-HSPLjava/util/stream/-$$Lambda$GF-s38TgrG6hfxe__ZFdhGp-wPw;->accept(Ljava/lang/Object;)V
 HSPLjava/util/stream/-$$Lambda$IntPipeline$R-E7oGjPWog3HR9X-8MdhU1ZGRE;->applyAsInt(Ljava/lang/Object;)I
 HSPLjava/util/stream/-$$Lambda$MatchOps$_LtFSpSMfVwoPv-8p_1cMGGcaHA;-><init>(Ljava/util/stream/MatchOps$MatchKind;Ljava/util/function/Predicate;)V
 HSPLjava/util/stream/-$$Lambda$MatchOps$_LtFSpSMfVwoPv-8p_1cMGGcaHA;->get()Ljava/lang/Object;
 HSPLjava/util/stream/-$$Lambda$ReferencePipeline$mk6xSsLZAKvG89IyN8pzBoM6otw;->applyAsLong(Ljava/lang/Object;)J
-HSPLjava/util/stream/-$$Lambda$StreamSpliterators$WrappingSpliterator$Ky6g3CKkCccuRWAvbAL1cAsdkNk;-><init>(Ljava/util/stream/StreamSpliterators$WrappingSpliterator;)V
-HSPLjava/util/stream/-$$Lambda$StreamSpliterators$WrappingSpliterator$Ky6g3CKkCccuRWAvbAL1cAsdkNk;->getAsBoolean()Z
 HSPLjava/util/stream/-$$Lambda$dplkPhACWDPIy18ogwdupEQaN40;->applyAsLong(JJ)J
 HSPLjava/util/stream/-$$Lambda$ihOtgw0eLCrsEBOphyN7SwoAlDg;->accept(Ljava/lang/Object;Ljava/lang/Object;)V
 HSPLjava/util/stream/-$$Lambda$okJigbB9kSn__oCZ5Do9uFNyF6A;->apply(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/stream/-$$Lambda$ono9Bp0lMrKbIRfAAYdycY0_qag;->applyAsInt(II)I
 HSPLjava/util/stream/-$$Lambda$opQ7JxjVCJzqzgTxGU3LVtqC7is;->get()Ljava/lang/Object;
 HSPLjava/util/stream/-$$Lambda$r-8H_R_mZJjp9wd0XTLoEAHMNQ0;->get()Ljava/lang/Object;
 HSPLjava/util/stream/-$$Lambda$ry7iWszBr7beYy31SdRxibDyciQ;->get()Ljava/lang/Object;
@@ -42457,7 +38283,6 @@
 HSPLjava/util/stream/AbstractPipeline;->exactOutputSizeIfKnown(Ljava/util/Spliterator;)J
 HSPLjava/util/stream/AbstractPipeline;->getStreamAndOpFlags()I
 HSPLjava/util/stream/AbstractPipeline;->isParallel()Z
-HSPLjava/util/stream/AbstractPipeline;->lambda$spliterator$0$AbstractPipeline()Ljava/util/Spliterator;
 HSPLjava/util/stream/AbstractPipeline;->onClose(Ljava/lang/Runnable;)Ljava/util/stream/BaseStream;
 HSPLjava/util/stream/AbstractPipeline;->sequential()Ljava/util/stream/BaseStream;
 HSPLjava/util/stream/AbstractPipeline;->sourceSpliterator(I)Ljava/util/Spliterator;
@@ -42468,7 +38293,6 @@
 HSPLjava/util/stream/AbstractSpinedBuffer;-><init>()V
 HSPLjava/util/stream/AbstractSpinedBuffer;->chunkSize(I)I
 HSPLjava/util/stream/AbstractSpinedBuffer;->count()J
-HSPLjava/util/stream/Collector;->of(Ljava/util/function/Supplier;Ljava/util/function/BiConsumer;Ljava/util/function/BinaryOperator;Ljava/util/function/Function;[Ljava/util/stream/Collector$Characteristics;)Ljava/util/stream/Collector;
 HSPLjava/util/stream/Collectors$CollectorImpl;-><init>(Ljava/util/function/Supplier;Ljava/util/function/BiConsumer;Ljava/util/function/BinaryOperator;Ljava/util/Set;)V
 HSPLjava/util/stream/Collectors$CollectorImpl;-><init>(Ljava/util/function/Supplier;Ljava/util/function/BiConsumer;Ljava/util/function/BinaryOperator;Ljava/util/function/Function;Ljava/util/Set;)V
 HSPLjava/util/stream/Collectors$CollectorImpl;->accumulator()Ljava/util/function/BiConsumer;
@@ -42478,11 +38302,9 @@
 HSPLjava/util/stream/Collectors$CollectorImpl;->supplier()Ljava/util/function/Supplier;
 HSPLjava/util/stream/Collectors;->access$000()Ljava/util/function/Function;
 HSPLjava/util/stream/Collectors;->castingIdentity()Ljava/util/function/Function;
-HSPLjava/util/stream/Collectors;->collectingAndThen(Ljava/util/stream/Collector;Ljava/util/function/Function;)Ljava/util/stream/Collector;
 HSPLjava/util/stream/Collectors;->groupingBy(Ljava/util/function/Function;Ljava/util/function/Supplier;Ljava/util/stream/Collector;)Ljava/util/stream/Collector;
 HSPLjava/util/stream/Collectors;->joining(Ljava/lang/CharSequence;)Ljava/util/stream/Collector;
 HSPLjava/util/stream/Collectors;->joining(Ljava/lang/CharSequence;Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Ljava/util/stream/Collector;
-HSPLjava/util/stream/Collectors;->lambda$castingIdentity$1(Ljava/lang/Object;)Ljava/lang/Object;
 HSPLjava/util/stream/Collectors;->lambda$groupingBy$44(Ljava/util/function/Supplier;Ljava/lang/Object;)Ljava/lang/Object;
 HSPLjava/util/stream/Collectors;->lambda$groupingBy$45(Ljava/util/function/Function;Ljava/util/function/Supplier;Ljava/util/function/BiConsumer;Ljava/util/Map;Ljava/lang/Object;)V
 HSPLjava/util/stream/Collectors;->lambda$joining$6(Ljava/lang/CharSequence;Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Ljava/util/StringJoiner;
@@ -42523,11 +38345,6 @@
 HSPLjava/util/stream/IntPipeline$4$1;->accept(I)V
 HSPLjava/util/stream/IntPipeline$4;-><init>(Ljava/util/stream/IntPipeline;Ljava/util/stream/AbstractPipeline;Ljava/util/stream/StreamShape;ILjava/util/function/IntFunction;)V
 HSPLjava/util/stream/IntPipeline$4;->opWrapSink(ILjava/util/stream/Sink;)Ljava/util/stream/Sink;
-HSPLjava/util/stream/IntPipeline$9$1;-><init>(Ljava/util/stream/IntPipeline$9;Ljava/util/stream/Sink;)V
-HSPLjava/util/stream/IntPipeline$9$1;->accept(I)V
-HSPLjava/util/stream/IntPipeline$9$1;->begin(J)V
-HSPLjava/util/stream/IntPipeline$9;-><init>(Ljava/util/stream/IntPipeline;Ljava/util/stream/AbstractPipeline;Ljava/util/stream/StreamShape;ILjava/util/function/IntPredicate;)V
-HSPLjava/util/stream/IntPipeline$9;->opWrapSink(ILjava/util/stream/Sink;)Ljava/util/stream/Sink;
 HSPLjava/util/stream/IntPipeline$Head;-><init>(Ljava/util/Spliterator;IZ)V
 HSPLjava/util/stream/IntPipeline$StatelessOp;-><init>(Ljava/util/stream/AbstractPipeline;Ljava/util/stream/StreamShape;I)V
 HSPLjava/util/stream/IntPipeline$StatelessOp;->opIsStateful()Z
@@ -42540,8 +38357,6 @@
 HSPLjava/util/stream/IntPipeline;->lambda$distinct$0(Ljava/lang/Integer;)I
 HSPLjava/util/stream/IntPipeline;->makeNodeBuilder(JLjava/util/function/IntFunction;)Ljava/util/stream/Node$Builder;
 HSPLjava/util/stream/IntPipeline;->mapToObj(Ljava/util/function/IntFunction;)Ljava/util/stream/Stream;
-HSPLjava/util/stream/IntPipeline;->reduce(ILjava/util/function/IntBinaryOperator;)I
-HSPLjava/util/stream/IntPipeline;->sum()I
 HSPLjava/util/stream/IntPipeline;->toArray()[I
 PLjava/util/stream/IntStream;->of([I)Ljava/util/stream/IntStream;
 HSPLjava/util/stream/IntStream;->range(II)Ljava/util/stream/IntStream;
@@ -42620,14 +38435,6 @@
 HSPLjava/util/stream/ReduceOps$3ReducingSink;-><init>(Ljava/util/function/Supplier;Ljava/util/function/BiConsumer;Ljava/util/function/BinaryOperator;)V
 HSPLjava/util/stream/ReduceOps$3ReducingSink;->accept(Ljava/lang/Object;)V
 HSPLjava/util/stream/ReduceOps$3ReducingSink;->begin(J)V
-HSPLjava/util/stream/ReduceOps$5;-><init>(Ljava/util/stream/StreamShape;Ljava/util/function/IntBinaryOperator;I)V
-HSPLjava/util/stream/ReduceOps$5;->makeSink()Ljava/util/stream/ReduceOps$5ReducingSink;
-HSPLjava/util/stream/ReduceOps$5;->makeSink()Ljava/util/stream/ReduceOps$AccumulatingSink;
-HSPLjava/util/stream/ReduceOps$5ReducingSink;-><init>(ILjava/util/function/IntBinaryOperator;)V
-HSPLjava/util/stream/ReduceOps$5ReducingSink;->accept(I)V
-HSPLjava/util/stream/ReduceOps$5ReducingSink;->begin(J)V
-HSPLjava/util/stream/ReduceOps$5ReducingSink;->get()Ljava/lang/Integer;
-HSPLjava/util/stream/ReduceOps$5ReducingSink;->get()Ljava/lang/Object;
 HSPLjava/util/stream/ReduceOps$8;-><init>(Ljava/util/stream/StreamShape;Ljava/util/function/LongBinaryOperator;J)V
 HSPLjava/util/stream/ReduceOps$8;->makeSink()Ljava/util/stream/ReduceOps$8ReducingSink;
 HSPLjava/util/stream/ReduceOps$8;->makeSink()Ljava/util/stream/ReduceOps$AccumulatingSink;
@@ -42640,7 +38447,6 @@
 HSPLjava/util/stream/ReduceOps$Box;->get()Ljava/lang/Object;
 HSPLjava/util/stream/ReduceOps$ReduceOp;-><init>(Ljava/util/stream/StreamShape;)V
 HSPLjava/util/stream/ReduceOps$ReduceOp;->evaluateSequential(Ljava/util/stream/PipelineHelper;Ljava/util/Spliterator;)Ljava/lang/Object;
-HSPLjava/util/stream/ReduceOps;->makeInt(ILjava/util/function/IntBinaryOperator;)Ljava/util/stream/TerminalOp;
 HSPLjava/util/stream/ReduceOps;->makeLong(JLjava/util/function/LongBinaryOperator;)Ljava/util/stream/TerminalOp;
 HSPLjava/util/stream/ReduceOps;->makeRef(Ljava/util/function/BinaryOperator;)Ljava/util/stream/TerminalOp;
 HSPLjava/util/stream/ReduceOps;->makeRef(Ljava/util/stream/Collector;)Ljava/util/stream/TerminalOp;
@@ -42683,8 +38489,8 @@
 HSPLjava/util/stream/ReferencePipeline;->findFirst()Ljava/util/Optional;
 HSPLjava/util/stream/ReferencePipeline;->flatMap(Ljava/util/function/Function;)Ljava/util/stream/Stream;
 HSPLjava/util/stream/ReferencePipeline;->forEach(Ljava/util/function/Consumer;)V
+HSPLjava/util/stream/ReferencePipeline;->forEachOrdered(Ljava/util/function/Consumer;)V
 HSPLjava/util/stream/ReferencePipeline;->forEachWithCancel(Ljava/util/Spliterator;Ljava/util/stream/Sink;)V
-HSPLjava/util/stream/ReferencePipeline;->iterator()Ljava/util/Iterator;
 HSPLjava/util/stream/ReferencePipeline;->lambda$count$2(Ljava/lang/Object;)J
 HSPLjava/util/stream/ReferencePipeline;->makeNodeBuilder(JLjava/util/function/IntFunction;)Ljava/util/stream/Node$Builder;
 HSPLjava/util/stream/ReferencePipeline;->map(Ljava/util/function/Function;)Ljava/util/stream/Stream;
@@ -42695,7 +38501,6 @@
 HSPLjava/util/stream/ReferencePipeline;->reduce(Ljava/util/function/BinaryOperator;)Ljava/util/Optional;
 HSPLjava/util/stream/ReferencePipeline;->sorted(Ljava/util/Comparator;)Ljava/util/stream/Stream;
 HSPLjava/util/stream/ReferencePipeline;->toArray(Ljava/util/function/IntFunction;)[Ljava/lang/Object;
-HSPLjava/util/stream/ReferencePipeline;->wrap(Ljava/util/stream/PipelineHelper;Ljava/util/function/Supplier;Z)Ljava/util/Spliterator;
 HSPLjava/util/stream/Sink$ChainedInt;-><init>(Ljava/util/stream/Sink;)V
 HSPLjava/util/stream/Sink$ChainedInt;->begin(J)V
 HSPLjava/util/stream/Sink$ChainedInt;->end()V
@@ -42704,7 +38509,6 @@
 HSPLjava/util/stream/Sink$ChainedReference;->cancellationRequested()Z
 HSPLjava/util/stream/Sink$ChainedReference;->end()V
 HSPLjava/util/stream/Sink;->begin(J)V
-HSPLjava/util/stream/Sink;->cancellationRequested()Z
 HSPLjava/util/stream/Sink;->end()V
 HSPLjava/util/stream/SortedOps$AbstractRefSortingSink;-><init>(Ljava/util/stream/Sink;Ljava/util/Comparator;)V
 HSPLjava/util/stream/SortedOps$OfRef;-><init>(Ljava/util/stream/AbstractPipeline;Ljava/util/Comparator;)V
@@ -42743,9 +38547,7 @@
 HSPLjava/util/stream/SpinedBuffer;->copyInto([Ljava/lang/Object;I)V
 HSPLjava/util/stream/SpinedBuffer;->count()J
 HSPLjava/util/stream/SpinedBuffer;->ensureCapacity(J)V
-HSPLjava/util/stream/SpinedBuffer;->get(J)Ljava/lang/Object;
 HSPLjava/util/stream/SpinedBuffer;->increaseCapacity()V
-HSPLjava/util/stream/SpinedBuffer;->inflateSpine()V
 PLjava/util/stream/Stream;->builder()Ljava/util/stream/Stream$Builder;
 HSPLjava/util/stream/Stream;->concat(Ljava/util/stream/Stream;Ljava/util/stream/Stream;)Ljava/util/stream/Stream;
 HSPLjava/util/stream/Stream;->empty()Ljava/util/stream/Stream;
@@ -42754,18 +38556,6 @@
 HSPLjava/util/stream/StreamOpFlag;->fromCharacteristics(Ljava/util/Spliterator;)I
 HSPLjava/util/stream/StreamOpFlag;->getMask(I)I
 HSPLjava/util/stream/StreamOpFlag;->isKnown(I)Z
-HSPLjava/util/stream/StreamOpFlag;->toCharacteristics(I)I
-HSPLjava/util/stream/StreamOpFlag;->toStreamFlags(I)I
-HSPLjava/util/stream/StreamSpliterators$AbstractWrappingSpliterator;-><init>(Ljava/util/stream/PipelineHelper;Ljava/util/function/Supplier;Z)V
-HSPLjava/util/stream/StreamSpliterators$AbstractWrappingSpliterator;->characteristics()I
-HSPLjava/util/stream/StreamSpliterators$AbstractWrappingSpliterator;->doAdvance()Z
-HSPLjava/util/stream/StreamSpliterators$AbstractWrappingSpliterator;->estimateSize()J
-HSPLjava/util/stream/StreamSpliterators$AbstractWrappingSpliterator;->fillBuffer()Z
-HSPLjava/util/stream/StreamSpliterators$AbstractWrappingSpliterator;->init()V
-HSPLjava/util/stream/StreamSpliterators$WrappingSpliterator;-><init>(Ljava/util/stream/PipelineHelper;Ljava/util/function/Supplier;Z)V
-HSPLjava/util/stream/StreamSpliterators$WrappingSpliterator;->initPartialTraversalState()V
-HSPLjava/util/stream/StreamSpliterators$WrappingSpliterator;->lambda$initPartialTraversalState$0$StreamSpliterators$WrappingSpliterator()Z
-HSPLjava/util/stream/StreamSpliterators$WrappingSpliterator;->tryAdvance(Ljava/util/function/Consumer;)Z
 HSPLjava/util/stream/StreamSupport;->intStream(Ljava/util/Spliterator$OfInt;Z)Ljava/util/stream/IntStream;
 HSPLjava/util/stream/StreamSupport;->stream(Ljava/util/Spliterator;Z)Ljava/util/stream/Stream;
 HSPLjava/util/stream/Streams$2;-><init>(Ljava/util/stream/BaseStream;Ljava/util/stream/BaseStream;)V
@@ -42777,22 +38567,17 @@
 HSPLjava/util/stream/Streams$ConcatSpliterator;-><init>(Ljava/util/Spliterator;Ljava/util/Spliterator;)V
 HSPLjava/util/stream/Streams$ConcatSpliterator;->characteristics()I
 HSPLjava/util/stream/Streams$ConcatSpliterator;->estimateSize()J
-HSPLjava/util/stream/Streams$ConcatSpliterator;->forEachRemaining(Ljava/util/function/Consumer;)V
 HSPLjava/util/stream/Streams$ConcatSpliterator;->tryAdvance(Ljava/util/function/Consumer;)Z
 HSPLjava/util/stream/Streams$RangeIntSpliterator;-><init>(III)V
 HSPLjava/util/stream/Streams$RangeIntSpliterator;-><init>(IIZ)V
 HSPLjava/util/stream/Streams$RangeIntSpliterator;->characteristics()I
-HSPLjava/util/stream/Streams$RangeIntSpliterator;->estimateSize()J
 HSPLjava/util/stream/Streams$RangeIntSpliterator;->forEachRemaining(Ljava/util/function/IntConsumer;)V
 HSPLjava/util/stream/Streams$RangeIntSpliterator;->getComparator()Ljava/util/Comparator;
 PLjava/util/stream/Streams$StreamBuilderImpl;-><init>()V
+HPLjava/util/stream/Streams$StreamBuilderImpl;->build()Ljava/util/stream/Stream;
 HSPLjava/util/stream/Streams$StreamBuilderImpl;->forEachRemaining(Ljava/util/function/Consumer;)V
 HSPLjava/util/stream/Streams;->composedClose(Ljava/util/stream/BaseStream;Ljava/util/stream/BaseStream;)Ljava/lang/Runnable;
 HSPLjava/util/stream/TerminalOp;->getOpFlags()I
-HSPLjava/util/zip/Adler32;-><init>()V
-HSPLjava/util/zip/Adler32;->getValue()J
-HSPLjava/util/zip/Adler32;->update(I)V
-HSPLjava/util/zip/Adler32;->update([BII)V
 HSPLjava/util/zip/CRC32;-><init>()V
 HSPLjava/util/zip/CRC32;->getValue()J
 HSPLjava/util/zip/CRC32;->reset()V
@@ -42803,7 +38588,6 @@
 HSPLjava/util/zip/CheckedInputStream;->read()I
 HSPLjava/util/zip/CheckedInputStream;->read([BII)I
 HSPLjava/util/zip/Deflater;-><init>()V
-HSPLjava/util/zip/Deflater;-><init>(I)V
 HSPLjava/util/zip/Deflater;-><init>(IZ)V
 HSPLjava/util/zip/Deflater;->deflate([B)I
 HSPLjava/util/zip/Deflater;->deflate([BII)I
@@ -42826,7 +38610,6 @@
 HSPLjava/util/zip/DeflaterOutputStream;->deflate()V
 HSPLjava/util/zip/DeflaterOutputStream;->finish()V
 HSPLjava/util/zip/DeflaterOutputStream;->flush()V
-HSPLjava/util/zip/DeflaterOutputStream;->write(I)V
 HSPLjava/util/zip/DeflaterOutputStream;->write([BII)V
 HSPLjava/util/zip/GZIPInputStream$1;-><init>(Ljava/util/zip/GZIPInputStream;Ljava/io/InputStream;)V
 HSPLjava/util/zip/GZIPInputStream;-><init>(Ljava/io/InputStream;)V
@@ -42848,22 +38631,18 @@
 HSPLjava/util/zip/GZIPOutputStream;->writeInt(I[BI)V
 HSPLjava/util/zip/GZIPOutputStream;->writeShort(I[BI)V
 HSPLjava/util/zip/GZIPOutputStream;->writeTrailer([BI)V
-HSPLjava/util/zip/Inflater;-><init>()V
 HSPLjava/util/zip/Inflater;-><init>(Z)V
 HSPLjava/util/zip/Inflater;->end()V
 HSPLjava/util/zip/Inflater;->ended()Z
 HSPLjava/util/zip/Inflater;->ensureOpen()V
 HSPLjava/util/zip/Inflater;->finalize()V
 HSPLjava/util/zip/Inflater;->finished()Z
-HSPLjava/util/zip/Inflater;->getBytesRead()J
 HSPLjava/util/zip/Inflater;->getBytesWritten()J
 HSPLjava/util/zip/Inflater;->getRemaining()I
 HSPLjava/util/zip/Inflater;->getTotalOut()I
-HSPLjava/util/zip/Inflater;->inflate([B)I
 HSPLjava/util/zip/Inflater;->inflate([BII)I
 HSPLjava/util/zip/Inflater;->needsDictionary()Z
 HSPLjava/util/zip/Inflater;->needsInput()Z
-HSPLjava/util/zip/Inflater;->reset()V
 HSPLjava/util/zip/Inflater;->setInput([BII)V
 HSPLjava/util/zip/InflaterInputStream;-><init>(Ljava/io/InputStream;Ljava/util/zip/Inflater;I)V
 HSPLjava/util/zip/InflaterInputStream;->available()I
@@ -42905,13 +38684,11 @@
 HSPLjava/util/zip/ZipFile$ZipFileInflaterInputStream;->fill()V
 HSPLjava/util/zip/ZipFile$ZipFileInflaterInputStream;->finalize()V
 HSPLjava/util/zip/ZipFile$ZipFileInputStream;-><init>(Ljava/util/zip/ZipFile;J)V
-HSPLjava/util/zip/ZipFile$ZipFileInputStream;->available()I
 HSPLjava/util/zip/ZipFile$ZipFileInputStream;->close()V
 HSPLjava/util/zip/ZipFile$ZipFileInputStream;->finalize()V
 HSPLjava/util/zip/ZipFile$ZipFileInputStream;->read()I
 HSPLjava/util/zip/ZipFile$ZipFileInputStream;->read([BII)I
 HSPLjava/util/zip/ZipFile$ZipFileInputStream;->size()J
-HSPLjava/util/zip/ZipFile;-><init>(Ljava/io/File;)V
 HSPLjava/util/zip/ZipFile;-><init>(Ljava/io/File;I)V
 HSPLjava/util/zip/ZipFile;-><init>(Ljava/io/File;ILjava/nio/charset/Charset;)V
 HSPLjava/util/zip/ZipFile;-><init>(Ljava/lang/String;)V
@@ -42937,20 +38714,8 @@
 HSPLjava/util/zip/ZipFile;->getInputStream(Ljava/util/zip/ZipEntry;)Ljava/io/InputStream;
 HSPLjava/util/zip/ZipFile;->getZipEntry(Ljava/lang/String;J)Ljava/util/zip/ZipEntry;
 HSPLjava/util/zip/ZipFile;->releaseInflater(Ljava/util/zip/Inflater;)V
-HSPLjava/util/zip/ZipInputStream;-><init>(Ljava/io/InputStream;)V
-HSPLjava/util/zip/ZipInputStream;-><init>(Ljava/io/InputStream;Ljava/nio/charset/Charset;)V
-HSPLjava/util/zip/ZipInputStream;->close()V
-HSPLjava/util/zip/ZipInputStream;->closeEntry()V
-HSPLjava/util/zip/ZipInputStream;->createZipEntry(Ljava/lang/String;)Ljava/util/zip/ZipEntry;
-HSPLjava/util/zip/ZipInputStream;->ensureOpen()V
-HSPLjava/util/zip/ZipInputStream;->getNextEntry()Ljava/util/zip/ZipEntry;
-HSPLjava/util/zip/ZipInputStream;->read([BII)I
-HSPLjava/util/zip/ZipInputStream;->readEnd(Ljava/util/zip/ZipEntry;)V
-HSPLjava/util/zip/ZipInputStream;->readFully([BII)V
-HSPLjava/util/zip/ZipInputStream;->readLOC()Ljava/util/zip/ZipEntry;
 HSPLjava/util/zip/ZipUtils;->get16([BI)I
 HSPLjava/util/zip/ZipUtils;->get32([BI)J
-HSPLjava/util/zip/ZipUtils;->unixTimeToFileTime(J)Ljava/nio/file/attribute/FileTime;
 HSPLjavax/crypto/Cipher$CipherSpiAndProvider;-><init>(Ljavax/crypto/CipherSpi;Ljava/security/Provider;)V
 HSPLjavax/crypto/Cipher$InitParams;-><init>(Ljavax/crypto/Cipher$InitType;ILjava/security/Key;Ljava/security/SecureRandom;Ljava/security/spec/AlgorithmParameterSpec;Ljava/security/AlgorithmParameters;)V
 HSPLjavax/crypto/Cipher$SpiAndProviderUpdater;-><init>(Ljavax/crypto/Cipher;Ljava/security/Provider;Ljavax/crypto/CipherSpi;)V
@@ -42967,15 +38732,10 @@
 HSPLjavax/crypto/Cipher;->checkOpmode(I)V
 HSPLjavax/crypto/Cipher;->chooseProvider(Ljavax/crypto/Cipher$InitType;ILjava/security/Key;Ljava/security/spec/AlgorithmParameterSpec;Ljava/security/AlgorithmParameters;Ljava/security/SecureRandom;)V
 HSPLjavax/crypto/Cipher;->createCipher(Ljava/lang/String;Ljava/security/Provider;)Ljavax/crypto/Cipher;
-HSPLjavax/crypto/Cipher;->doFinal()[B
 HSPLjavax/crypto/Cipher;->doFinal([B)[B
 HSPLjavax/crypto/Cipher;->doFinal([BII)[B
-HSPLjavax/crypto/Cipher;->doFinal([BII[BI)I
-HSPLjavax/crypto/Cipher;->getBlockSize()I
 HSPLjavax/crypto/Cipher;->getIV()[B
 HSPLjavax/crypto/Cipher;->getInstance(Ljava/lang/String;)Ljavax/crypto/Cipher;
-HSPLjavax/crypto/Cipher;->getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljavax/crypto/Cipher;
-HSPLjavax/crypto/Cipher;->getOutputSize(I)I
 HSPLjavax/crypto/Cipher;->init(ILjava/security/Key;)V
 HSPLjavax/crypto/Cipher;->init(ILjava/security/Key;Ljava/security/SecureRandom;)V
 HSPLjavax/crypto/Cipher;->init(ILjava/security/Key;Ljava/security/spec/AlgorithmParameterSpec;)V
@@ -42985,10 +38745,10 @@
 HSPLjavax/crypto/Cipher;->tryCombinations(Ljavax/crypto/Cipher$InitParams;Ljava/security/Provider;[Ljava/lang/String;)Ljavax/crypto/Cipher$CipherSpiAndProvider;
 HSPLjavax/crypto/Cipher;->tryTransformWithProvider(Ljavax/crypto/Cipher$InitParams;[Ljava/lang/String;Ljavax/crypto/Cipher$NeedToSet;Ljava/security/Provider$Service;)Ljavax/crypto/Cipher$CipherSpiAndProvider;
 HSPLjavax/crypto/Cipher;->unwrap([BLjava/lang/String;I)Ljava/security/Key;
-HSPLjavax/crypto/Cipher;->update([BII)[B
 HSPLjavax/crypto/Cipher;->updateAAD([B)V
 HSPLjavax/crypto/Cipher;->updateAAD([BII)V
 HSPLjavax/crypto/Cipher;->updateProviderIfNeeded()V
+HSPLjavax/crypto/Cipher;->wrap(Ljava/security/Key;)[B
 HSPLjavax/crypto/CipherSpi;-><init>()V
 HSPLjavax/crypto/JarVerifier;-><init>(Ljava/net/URL;Z)V
 HSPLjavax/crypto/JarVerifier;->verify()V
@@ -43019,37 +38779,20 @@
 HSPLjavax/crypto/Mac;->chooseProvider(Ljava/security/Key;Ljava/security/spec/AlgorithmParameterSpec;)V
 HSPLjavax/crypto/Mac;->doFinal()[B
 HSPLjavax/crypto/Mac;->doFinal([B)[B
-HSPLjavax/crypto/Mac;->doFinal([BI)V
 HSPLjavax/crypto/Mac;->getAlgorithm()Ljava/lang/String;
 HSPLjavax/crypto/Mac;->getInstance(Ljava/lang/String;)Ljavax/crypto/Mac;
-HSPLjavax/crypto/Mac;->getMacLength()I
 HSPLjavax/crypto/Mac;->init(Ljava/security/Key;)V
-HSPLjavax/crypto/Mac;->reset()V
 HSPLjavax/crypto/Mac;->update(B)V
 HSPLjavax/crypto/Mac;->update([B)V
 HSPLjavax/crypto/Mac;->update([BII)V
 HSPLjavax/crypto/MacSpi;-><init>()V
-HSPLjavax/crypto/SecretKeyFactory;-><init>(Ljava/lang/String;)V
-HSPLjavax/crypto/SecretKeyFactory;-><init>(Ljavax/crypto/SecretKeyFactorySpi;Ljava/security/Provider;Ljava/lang/String;)V
-HSPLjavax/crypto/SecretKeyFactory;->generateSecret(Ljava/security/spec/KeySpec;)Ljavax/crypto/SecretKey;
-HSPLjavax/crypto/SecretKeyFactory;->getInstance(Ljava/lang/String;)Ljavax/crypto/SecretKeyFactory;
-HSPLjavax/crypto/SecretKeyFactory;->getInstance(Ljava/lang/String;Ljava/lang/String;)Ljavax/crypto/SecretKeyFactory;
-HSPLjavax/crypto/SecretKeyFactory;->getKeySpec(Ljavax/crypto/SecretKey;Ljava/lang/Class;)Ljava/security/spec/KeySpec;
-HSPLjavax/crypto/SecretKeyFactory;->nextSpi(Ljavax/crypto/SecretKeyFactorySpi;)Ljavax/crypto/SecretKeyFactorySpi;
-HSPLjavax/crypto/SecretKeyFactorySpi;-><init>()V
 HSPLjavax/crypto/spec/GCMParameterSpec;-><init>(I[B)V
-HSPLjavax/crypto/spec/GCMParameterSpec;-><init>(I[BII)V
 HSPLjavax/crypto/spec/GCMParameterSpec;->getIV()[B
 HSPLjavax/crypto/spec/GCMParameterSpec;->getTLen()I
 HSPLjavax/crypto/spec/GCMParameterSpec;->init(I[BII)V
 HSPLjavax/crypto/spec/IvParameterSpec;-><init>([B)V
 HSPLjavax/crypto/spec/IvParameterSpec;-><init>([BII)V
 HSPLjavax/crypto/spec/IvParameterSpec;->getIV()[B
-HSPLjavax/crypto/spec/PBEKeySpec;-><init>([C[BII)V
-HSPLjavax/crypto/spec/PBEKeySpec;->getIterationCount()I
-HSPLjavax/crypto/spec/PBEKeySpec;->getKeyLength()I
-HSPLjavax/crypto/spec/PBEKeySpec;->getPassword()[C
-HSPLjavax/crypto/spec/PBEKeySpec;->getSalt()[B
 HSPLjavax/crypto/spec/SecretKeySpec;-><init>([BLjava/lang/String;)V
 HSPLjavax/crypto/spec/SecretKeySpec;->getAlgorithm()Ljava/lang/String;
 HSPLjavax/crypto/spec/SecretKeySpec;->getEncoded()[B
@@ -43088,7 +38831,6 @@
 HSPLjavax/net/ssl/SSLContext;-><init>(Ljavax/net/ssl/SSLContextSpi;Ljava/security/Provider;Ljava/lang/String;)V
 HSPLjavax/net/ssl/SSLContext;->getDefault()Ljavax/net/ssl/SSLContext;
 HSPLjavax/net/ssl/SSLContext;->getInstance(Ljava/lang/String;)Ljavax/net/ssl/SSLContext;
-HSPLjavax/net/ssl/SSLContext;->getInstance(Ljava/lang/String;Ljava/lang/String;)Ljavax/net/ssl/SSLContext;
 HSPLjavax/net/ssl/SSLContext;->getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljavax/net/ssl/SSLContext;
 HSPLjavax/net/ssl/SSLContext;->getSocketFactory()Ljavax/net/ssl/SSLSocketFactory;
 HSPLjavax/net/ssl/SSLContext;->init([Ljavax/net/ssl/KeyManager;[Ljavax/net/ssl/TrustManager;Ljava/security/SecureRandom;)V
@@ -43110,7 +38852,6 @@
 HSPLjavax/net/ssl/SSLEngineResult;->getHandshakeStatus()Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
 HSPLjavax/net/ssl/SSLEngineResult;->getStatus()Ljavax/net/ssl/SSLEngineResult$Status;
 HSPLjavax/net/ssl/SSLException;-><init>(Ljava/lang/String;)V
-HSPLjavax/net/ssl/SSLHandshakeException;-><init>(Ljava/lang/String;)V
 HSPLjavax/net/ssl/SSLParameters;-><init>()V
 HSPLjavax/net/ssl/SSLParameters;->clone([Ljava/lang/String;)[Ljava/lang/String;
 HSPLjavax/net/ssl/SSLParameters;->getApplicationProtocols()[Ljava/lang/String;
@@ -43154,7 +38895,6 @@
 HSPLjavax/security/auth/x500/X500Principal;-><init>([B)V
 HSPLjavax/security/auth/x500/X500Principal;->equals(Ljava/lang/Object;)Z
 HSPLjavax/security/auth/x500/X500Principal;->getEncoded()[B
-HSPLjavax/security/auth/x500/X500Principal;->getName()Ljava/lang/String;
 HSPLjavax/security/auth/x500/X500Principal;->getName(Ljava/lang/String;)Ljava/lang/String;
 HSPLjavax/security/auth/x500/X500Principal;->hashCode()I
 HSPLjavax/xml/parsers/DocumentBuilder;-><init>()V
@@ -43185,25 +38925,16 @@
 HSPLlibcore/content/type/MimeMap;->guessMimeTypeFromExtension(Ljava/lang/String;)Ljava/lang/String;
 HSPLlibcore/content/type/MimeMap;->isValidMimeTypeOrExtension(Ljava/lang/String;)Z
 HSPLlibcore/content/type/MimeMap;->toLowerCase(Ljava/lang/String;)Ljava/lang/String;
-HSPLlibcore/icu/CollationKeyICU;-><init>(Ljava/lang/String;Landroid/icu/text/CollationKey;)V
-HSPLlibcore/icu/CollationKeyICU;->toByteArray()[B
 HSPLlibcore/icu/DateIntervalFormat;->formatDateRange(JJILjava/lang/String;)Ljava/lang/String;
 HSPLlibcore/icu/DateIntervalFormat;->formatDateRange(Landroid/icu/util/ULocale;Landroid/icu/util/TimeZone;JJI)Ljava/lang/String;
 HSPLlibcore/icu/DateIntervalFormat;->getFormatter(Ljava/lang/String;Landroid/icu/util/ULocale;Landroid/icu/util/TimeZone;)Landroid/icu/text/DateIntervalFormat;
 HSPLlibcore/icu/DateIntervalFormat;->isExactlyMidnight(Landroid/icu/util/Calendar;)Z
 HSPLlibcore/icu/DateUtilsBridge;->createIcuCalendar(Landroid/icu/util/TimeZone;Landroid/icu/util/ULocale;J)Landroid/icu/util/Calendar;
-HSPLlibcore/icu/DateUtilsBridge;->dayDistance(Landroid/icu/util/Calendar;Landroid/icu/util/Calendar;)I
 HSPLlibcore/icu/DateUtilsBridge;->fallInSameMonth(Landroid/icu/util/Calendar;Landroid/icu/util/Calendar;)Z
-HSPLlibcore/icu/DateUtilsBridge;->fallInSameYear(Landroid/icu/util/Calendar;Landroid/icu/util/Calendar;)Z
 HSPLlibcore/icu/DateUtilsBridge;->fallOnDifferentDates(Landroid/icu/util/Calendar;Landroid/icu/util/Calendar;)Z
 HSPLlibcore/icu/DateUtilsBridge;->icuTimeZone(Ljava/util/TimeZone;)Landroid/icu/util/TimeZone;
-HSPLlibcore/icu/DateUtilsBridge;->isThisYear(Landroid/icu/util/Calendar;)Z
 HSPLlibcore/icu/DateUtilsBridge;->toSkeleton(Landroid/icu/util/Calendar;Landroid/icu/util/Calendar;I)Ljava/lang/String;
-HSPLlibcore/icu/ICU;->getAvailableLocales()[Ljava/util/Locale;
 HSPLlibcore/icu/ICU;->getBestDateTimePattern(Ljava/lang/String;Ljava/util/Locale;)Ljava/lang/String;
-HSPLlibcore/icu/ICU;->localeFromIcuLocaleId(Ljava/lang/String;)Ljava/util/Locale;
-HSPLlibcore/icu/ICU;->localesFromStrings([Ljava/lang/String;)[Ljava/util/Locale;
-HSPLlibcore/icu/ICU;->parseLangScriptRegionAndVariants(Ljava/lang/String;[Ljava/lang/String;)V
 HSPLlibcore/icu/LocaleData;-><init>()V
 HSPLlibcore/icu/LocaleData;->get(Ljava/util/Locale;)Llibcore/icu/LocaleData;
 HSPLlibcore/icu/LocaleData;->getDateFormat(I)Ljava/lang/String;
@@ -43238,7 +38969,6 @@
 HSPLlibcore/io/BlockGuardOs;->isLingerSocket(Ljava/io/FileDescriptor;)Z
 HSPLlibcore/io/BlockGuardOs;->isUdpSocket(Ljava/io/FileDescriptor;)Z
 HSPLlibcore/io/BlockGuardOs;->lseek(Ljava/io/FileDescriptor;JI)J
-HSPLlibcore/io/BlockGuardOs;->lstat(Ljava/lang/String;)Landroid/system/StructStat;
 HSPLlibcore/io/BlockGuardOs;->mkdir(Ljava/lang/String;I)V
 HSPLlibcore/io/BlockGuardOs;->open(Ljava/lang/String;II)Ljava/io/FileDescriptor;
 HSPLlibcore/io/BlockGuardOs;->poll([Landroid/system/StructPollfd;I)I
@@ -43254,7 +38984,6 @@
 HSPLlibcore/io/BlockGuardOs;->socketpair(IIILjava/io/FileDescriptor;Ljava/io/FileDescriptor;)V
 HSPLlibcore/io/BlockGuardOs;->stat(Ljava/lang/String;)Landroid/system/StructStat;
 HSPLlibcore/io/BlockGuardOs;->statvfs(Ljava/lang/String;)Landroid/system/StructStatVfs;
-HSPLlibcore/io/BlockGuardOs;->symlink(Ljava/lang/String;Ljava/lang/String;)V
 HSPLlibcore/io/BlockGuardOs;->tagSocket(Ljava/io/FileDescriptor;)Ljava/io/FileDescriptor;
 HSPLlibcore/io/BlockGuardOs;->write(Ljava/io/FileDescriptor;[BII)I
 HSPLlibcore/io/BufferIterator;-><init>()V
@@ -43308,7 +39037,6 @@
 HSPLlibcore/io/ForwardingOs;->ioctlInt(Ljava/io/FileDescriptor;ILandroid/system/Int32Ref;)I
 HSPLlibcore/io/ForwardingOs;->listen(Ljava/io/FileDescriptor;I)V
 HSPLlibcore/io/ForwardingOs;->lseek(Ljava/io/FileDescriptor;JI)J
-HSPLlibcore/io/ForwardingOs;->lstat(Ljava/lang/String;)Landroid/system/StructStat;
 HSPLlibcore/io/ForwardingOs;->mkdir(Ljava/lang/String;I)V
 HSPLlibcore/io/ForwardingOs;->mlock(JJ)V
 HSPLlibcore/io/ForwardingOs;->mmap(JJIILjava/io/FileDescriptor;J)J
@@ -43317,7 +39045,6 @@
 HSPLlibcore/io/ForwardingOs;->pipe2(I)[Ljava/io/FileDescriptor;
 HSPLlibcore/io/ForwardingOs;->poll([Landroid/system/StructPollfd;I)I
 HSPLlibcore/io/ForwardingOs;->posix_fallocate(Ljava/io/FileDescriptor;JJ)V
-HSPLlibcore/io/ForwardingOs;->prctl(IJJJJ)I
 HSPLlibcore/io/ForwardingOs;->read(Ljava/io/FileDescriptor;Ljava/nio/ByteBuffer;)I
 HSPLlibcore/io/ForwardingOs;->read(Ljava/io/FileDescriptor;[BII)I
 HSPLlibcore/io/ForwardingOs;->readlink(Ljava/lang/String;)Ljava/lang/String;
@@ -43328,10 +39055,7 @@
 HSPLlibcore/io/ForwardingOs;->setpgid(II)V
 HSPLlibcore/io/ForwardingOs;->setregid(II)V
 HSPLlibcore/io/ForwardingOs;->setreuid(II)V
-HSPLlibcore/io/ForwardingOs;->setsockoptByte(Ljava/io/FileDescriptor;III)V
-HSPLlibcore/io/ForwardingOs;->setsockoptGroupReq(Ljava/io/FileDescriptor;IILandroid/system/StructGroupReq;)V
 HSPLlibcore/io/ForwardingOs;->setsockoptInt(Ljava/io/FileDescriptor;III)V
-HSPLlibcore/io/ForwardingOs;->setsockoptIpMreqn(Ljava/io/FileDescriptor;III)V
 HSPLlibcore/io/ForwardingOs;->setsockoptTimeval(Ljava/io/FileDescriptor;IILandroid/system/StructTimeval;)V
 HSPLlibcore/io/ForwardingOs;->shutdown(Ljava/io/FileDescriptor;I)V
 HSPLlibcore/io/ForwardingOs;->socket(III)Ljava/io/FileDescriptor;
@@ -43339,10 +39063,8 @@
 HSPLlibcore/io/ForwardingOs;->stat(Ljava/lang/String;)Landroid/system/StructStat;
 HSPLlibcore/io/ForwardingOs;->statvfs(Ljava/lang/String;)Landroid/system/StructStatVfs;
 HSPLlibcore/io/ForwardingOs;->strerror(I)Ljava/lang/String;
-HSPLlibcore/io/ForwardingOs;->symlink(Ljava/lang/String;Ljava/lang/String;)V
 HSPLlibcore/io/ForwardingOs;->sysconf(I)J
 HSPLlibcore/io/ForwardingOs;->umask(I)I
-HSPLlibcore/io/ForwardingOs;->uname()Landroid/system/StructUtsname;
 HSPLlibcore/io/ForwardingOs;->write(Ljava/io/FileDescriptor;[BII)I
 HSPLlibcore/io/IoBridge;->bind(Ljava/io/FileDescriptor;Ljava/net/InetAddress;I)V
 HSPLlibcore/io/IoBridge;->booleanFromInt(I)Z
@@ -43355,7 +39077,6 @@
 HSPLlibcore/io/IoBridge;->getSocketOption(Ljava/io/FileDescriptor;I)Ljava/lang/Object;
 HSPLlibcore/io/IoBridge;->getSocketOptionErrno(Ljava/io/FileDescriptor;I)Ljava/lang/Object;
 HSPLlibcore/io/IoBridge;->isConnected(Ljava/io/FileDescriptor;Ljava/net/InetAddress;III)Z
-HSPLlibcore/io/IoBridge;->maybeThrowAfterSendto(ZLandroid/system/ErrnoException;)I
 HSPLlibcore/io/IoBridge;->open(Ljava/lang/String;I)Ljava/io/FileDescriptor;
 HSPLlibcore/io/IoBridge;->poll(Ljava/io/FileDescriptor;II)V
 HSPLlibcore/io/IoBridge;->postRecvfrom(ZLjava/net/DatagramPacket;Ljava/net/InetSocketAddress;I)I
@@ -43466,6 +39187,7 @@
 HSPLlibcore/reflect/ListOfVariables;->add(Ljava/lang/reflect/TypeVariable;)V
 HSPLlibcore/reflect/ListOfVariables;->getArray()[Ljava/lang/reflect/TypeVariable;
 HSPLlibcore/reflect/ParameterizedTypeImpl;-><init>(Llibcore/reflect/ParameterizedTypeImpl;Ljava/lang/String;Llibcore/reflect/ListOfTypes;Ljava/lang/ClassLoader;)V
+HSPLlibcore/reflect/ParameterizedTypeImpl;->equals(Ljava/lang/Object;)Z
 HSPLlibcore/reflect/ParameterizedTypeImpl;->getActualTypeArguments()[Ljava/lang/reflect/Type;
 HSPLlibcore/reflect/ParameterizedTypeImpl;->getOwnerType()Ljava/lang/reflect/Type;
 HSPLlibcore/reflect/ParameterizedTypeImpl;->getRawType()Ljava/lang/Class;
@@ -43491,7 +39213,6 @@
 HSPLlibcore/timezone/ZoneInfoDB$TzData;->checkNotClosed()V
 HSPLlibcore/timezone/ZoneInfoDB$TzData;->close()V
 HSPLlibcore/timezone/ZoneInfoDB$TzData;->finalize()V
-HSPLlibcore/timezone/ZoneInfoDB$TzData;->getAvailableIDs()[Ljava/lang/String;
 HSPLlibcore/timezone/ZoneInfoDB$TzData;->getBufferIterator(Ljava/lang/String;)Llibcore/io/BufferIterator;
 HSPLlibcore/timezone/ZoneInfoDB$TzData;->makeTimeZone(Ljava/lang/String;)Llibcore/util/ZoneInfo;
 HSPLlibcore/timezone/ZoneInfoDB$TzData;->makeTimeZoneUncached(Ljava/lang/String;)Llibcore/util/ZoneInfo;
@@ -43511,6 +39232,7 @@
 HSPLlibcore/timezone/ZoneInfoDb;->getAvailableIDs()[Ljava/lang/String;
 HSPLlibcore/timezone/ZoneInfoDb;->getBufferIterator(Ljava/lang/String;)Llibcore/io/BufferIterator;
 HSPLlibcore/timezone/ZoneInfoDb;->getInstance()Llibcore/timezone/ZoneInfoDb;
+HSPLlibcore/timezone/ZoneInfoDb;->getVersion()Ljava/lang/String;
 HSPLlibcore/timezone/ZoneInfoDb;->makeTimeZone(Ljava/lang/String;)Llibcore/util/ZoneInfo;
 HSPLlibcore/timezone/ZoneInfoDb;->makeTimeZoneUncached(Ljava/lang/String;)Llibcore/util/ZoneInfo;
 HSPLlibcore/util/ArrayUtils;->throwsIfOutOfBounds(III)V
@@ -43556,15 +39278,7 @@
 HSPLlibcore/util/SneakyThrow;->sneakyThrow_(Ljava/lang/Throwable;)V
 HSPLlibcore/util/XmlObjectFactory;->newXmlPullParser()Lorg/xmlpull/v1/XmlPullParser;
 HSPLlibcore/util/XmlObjectFactory;->newXmlSerializer()Lorg/xmlpull/v1/XmlSerializer;
-HSPLlibcore/util/ZoneInfo$OffsetInterval;-><init>(IIII)V
-HSPLlibcore/util/ZoneInfo$OffsetInterval;->containsWallTime(J)Z
-HSPLlibcore/util/ZoneInfo$OffsetInterval;->create(Llibcore/util/ZoneInfo;I)Llibcore/util/ZoneInfo$OffsetInterval;
-HSPLlibcore/util/ZoneInfo$OffsetInterval;->getIsDst()I
-HSPLlibcore/util/ZoneInfo$OffsetInterval;->getTotalOffsetSeconds()I
-HSPLlibcore/util/ZoneInfo$WallTime;-><init>()V
 HSPLlibcore/util/ZoneInfo$WallTime;->copyFieldsFromCalendar()V
-HSPLlibcore/util/ZoneInfo$WallTime;->copyFieldsToCalendar()V
-HSPLlibcore/util/ZoneInfo$WallTime;->doWallTimeSearch(Llibcore/util/ZoneInfo;IIZ)Ljava/lang/Integer;
 HSPLlibcore/util/ZoneInfo$WallTime;->getGmtOffset()I
 HSPLlibcore/util/ZoneInfo$WallTime;->getHour()I
 HSPLlibcore/util/ZoneInfo$WallTime;->getIsDst()I
@@ -43576,31 +39290,15 @@
 HSPLlibcore/util/ZoneInfo$WallTime;->getYear()I
 HSPLlibcore/util/ZoneInfo$WallTime;->getYearDay()I
 HSPLlibcore/util/ZoneInfo$WallTime;->localtime(ILlibcore/util/ZoneInfo;)V
-HSPLlibcore/util/ZoneInfo$WallTime;->mktime(Llibcore/util/ZoneInfo;)I
-HSPLlibcore/util/ZoneInfo$WallTime;->setGmtOffset(I)V
-HSPLlibcore/util/ZoneInfo$WallTime;->setHour(I)V
-HSPLlibcore/util/ZoneInfo$WallTime;->setIsDst(I)V
-HSPLlibcore/util/ZoneInfo$WallTime;->setMinute(I)V
-HSPLlibcore/util/ZoneInfo$WallTime;->setMonth(I)V
-HSPLlibcore/util/ZoneInfo$WallTime;->setMonthDay(I)V
-HSPLlibcore/util/ZoneInfo$WallTime;->setSecond(I)V
-HSPLlibcore/util/ZoneInfo$WallTime;->setWeekDay(I)V
-HSPLlibcore/util/ZoneInfo$WallTime;->setYear(I)V
-HSPLlibcore/util/ZoneInfo$WallTime;->setYearDay(I)V
 HSPLlibcore/util/ZoneInfo;-><init>(Ljava/lang/String;[J[B[I[BJ)V
 HSPLlibcore/util/ZoneInfo;->access$000(Llibcore/util/ZoneInfo;)I
 HSPLlibcore/util/ZoneInfo;->access$100(Llibcore/util/ZoneInfo;)[J
 HSPLlibcore/util/ZoneInfo;->access$300(Llibcore/util/ZoneInfo;)[I
 HSPLlibcore/util/ZoneInfo;->access$400(Llibcore/util/ZoneInfo;)[B
 HSPLlibcore/util/ZoneInfo;->access$500(JI)I
-HSPLlibcore/util/ZoneInfo;->access$600(JI)I
-HSPLlibcore/util/ZoneInfo;->access$700(Llibcore/util/ZoneInfo;)[B
-HSPLlibcore/util/ZoneInfo;->access$800(JI)I
 HSPLlibcore/util/ZoneInfo;->checkTzifVersionAcceptable(Ljava/lang/String;B)V
 HSPLlibcore/util/ZoneInfo;->checked32BitAdd(JI)I
-HSPLlibcore/util/ZoneInfo;->checked32BitSubtract(JI)I
 HSPLlibcore/util/ZoneInfo;->clone()Ljava/lang/Object;
-HSPLlibcore/util/ZoneInfo;->equals(Ljava/lang/Object;)Z
 HSPLlibcore/util/ZoneInfo;->findOffsetIndexForTimeInMilliseconds(J)I
 HSPLlibcore/util/ZoneInfo;->findOffsetIndexForTimeInSeconds(J)I
 HSPLlibcore/util/ZoneInfo;->findTransitionIndex(J)I
@@ -43615,7 +39313,6 @@
 HSPLlibcore/util/ZoneInfo;->readTimeZone(Ljava/lang/String;Llibcore/io/BufferIterator;J)Llibcore/util/ZoneInfo;
 HSPLlibcore/util/ZoneInfo;->roundDownMillisToSeconds(J)J
 HSPLlibcore/util/ZoneInfo;->roundUpMillisToSeconds(J)J
-HSPLlibcore/util/ZoneInfo;->saturated32BitAdd(JI)I
 HSPLlibcore/util/ZoneInfo;->skipOver32BitData(Ljava/lang/String;Llibcore/io/BufferIterator;)V
 HSPLorg/apache/harmony/dalvik/ddmc/Chunk;-><init>(ILjava/nio/ByteBuffer;)V
 HSPLorg/apache/harmony/dalvik/ddmc/Chunk;-><init>(I[BII)V
@@ -43624,6 +39321,8 @@
 HSPLorg/apache/harmony/dalvik/ddmc/DdmServer;->broadcast(I)V
 HSPLorg/apache/harmony/dalvik/ddmc/DdmServer;->dispatch(I[BII)Lorg/apache/harmony/dalvik/ddmc/Chunk;
 HSPLorg/apache/harmony/dalvik/ddmc/DdmServer;->sendChunk(Lorg/apache/harmony/dalvik/ddmc/Chunk;)V
+HSPLorg/apache/harmony/xml/dom/AttrImpl;->getNodeType()S
+HSPLorg/apache/harmony/xml/dom/AttrImpl;->getOwnerElement()Lorg/w3c/dom/Element;
 HSPLorg/apache/harmony/xml/dom/CharacterDataImpl;-><init>(Lorg/apache/harmony/xml/dom/DocumentImpl;Ljava/lang/String;)V
 HSPLorg/apache/harmony/xml/dom/CharacterDataImpl;->getData()Ljava/lang/String;
 HSPLorg/apache/harmony/xml/dom/CharacterDataImpl;->getLength()I
@@ -43683,7 +39382,6 @@
 HSPLorg/apache/harmony/xml/parsers/DocumentBuilderImpl;->setNamespaceAware(Z)V
 HSPLorg/apache/http/params/HttpConnectionParams;->setConnectionTimeout(Lorg/apache/http/params/HttpParams;I)V
 HSPLorg/apache/http/params/HttpConnectionParams;->setSoTimeout(Lorg/apache/http/params/HttpParams;I)V
-HSPLorg/ccil/cowan/tagsoup/AttributesImpl;-><init>()V
 HSPLorg/ccil/cowan/tagsoup/AttributesImpl;-><init>(Lorg/xml/sax/Attributes;)V
 HSPLorg/ccil/cowan/tagsoup/AttributesImpl;->addAttribute(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
 HSPLorg/ccil/cowan/tagsoup/AttributesImpl;->clear()V
@@ -43697,7 +39395,6 @@
 HSPLorg/ccil/cowan/tagsoup/AttributesImpl;->getValue(I)Ljava/lang/String;
 HSPLorg/ccil/cowan/tagsoup/AttributesImpl;->getValue(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
 HSPLorg/ccil/cowan/tagsoup/AttributesImpl;->removeAttribute(I)V
-HSPLorg/ccil/cowan/tagsoup/AttributesImpl;->setAttribute(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
 HSPLorg/ccil/cowan/tagsoup/AttributesImpl;->setAttributes(Lorg/xml/sax/Attributes;)V
 HSPLorg/ccil/cowan/tagsoup/Element;-><init>(Lorg/ccil/cowan/tagsoup/ElementType;Z)V
 HSPLorg/ccil/cowan/tagsoup/Element;->atts()Lorg/ccil/cowan/tagsoup/AttributesImpl;
@@ -43713,7 +39410,6 @@
 HSPLorg/ccil/cowan/tagsoup/Element;->parent()Lorg/ccil/cowan/tagsoup/ElementType;
 HSPLorg/ccil/cowan/tagsoup/Element;->setAttribute(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
 HSPLorg/ccil/cowan/tagsoup/Element;->setNext(Lorg/ccil/cowan/tagsoup/Element;)V
-HSPLorg/ccil/cowan/tagsoup/ElementType;-><init>(Ljava/lang/String;IIILorg/ccil/cowan/tagsoup/Schema;)V
 HSPLorg/ccil/cowan/tagsoup/ElementType;->atts()Lorg/ccil/cowan/tagsoup/AttributesImpl;
 HSPLorg/ccil/cowan/tagsoup/ElementType;->canContain(Lorg/ccil/cowan/tagsoup/ElementType;)Z
 HSPLorg/ccil/cowan/tagsoup/ElementType;->flags()I
@@ -43723,7 +39419,6 @@
 HSPLorg/ccil/cowan/tagsoup/ElementType;->name()Ljava/lang/String;
 HSPLorg/ccil/cowan/tagsoup/ElementType;->namespace()Ljava/lang/String;
 HSPLorg/ccil/cowan/tagsoup/ElementType;->namespace(Ljava/lang/String;Z)Ljava/lang/String;
-HSPLorg/ccil/cowan/tagsoup/ElementType;->normalize(Ljava/lang/String;)Ljava/lang/String;
 HSPLorg/ccil/cowan/tagsoup/ElementType;->parent()Lorg/ccil/cowan/tagsoup/ElementType;
 HSPLorg/ccil/cowan/tagsoup/ElementType;->setAttribute(Lorg/ccil/cowan/tagsoup/AttributesImpl;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
 HSPLorg/ccil/cowan/tagsoup/HTMLScanner;-><init>()V
@@ -43759,16 +39454,13 @@
 HSPLorg/ccil/cowan/tagsoup/Parser;->setProperty(Ljava/lang/String;Ljava/lang/Object;)V
 HSPLorg/ccil/cowan/tagsoup/Parser;->setup()V
 HSPLorg/ccil/cowan/tagsoup/Parser;->stagc([CII)V
-HSPLorg/ccil/cowan/tagsoup/Parser;->stage([CII)V
 HSPLorg/ccil/cowan/tagsoup/Parser;->truthValue(Z)Ljava/lang/Boolean;
-HSPLorg/ccil/cowan/tagsoup/Schema;->elementType(Ljava/lang/String;III)V
 HSPLorg/ccil/cowan/tagsoup/Schema;->getElementType(Ljava/lang/String;)Lorg/ccil/cowan/tagsoup/ElementType;
 HSPLorg/ccil/cowan/tagsoup/Schema;->getEntity(Ljava/lang/String;)I
 HSPLorg/ccil/cowan/tagsoup/Schema;->getPrefix()Ljava/lang/String;
 HSPLorg/ccil/cowan/tagsoup/Schema;->getURI()Ljava/lang/String;
 HSPLorg/json/JSON;->checkDouble(D)D
 HSPLorg/json/JSON;->toBoolean(Ljava/lang/Object;)Ljava/lang/Boolean;
-HSPLorg/json/JSON;->toDouble(Ljava/lang/Object;)Ljava/lang/Double;
 HSPLorg/json/JSON;->toInteger(Ljava/lang/Object;)Ljava/lang/Integer;
 HSPLorg/json/JSON;->toLong(Ljava/lang/Object;)Ljava/lang/Long;
 HSPLorg/json/JSON;->toString(Ljava/lang/Object;)Ljava/lang/String;
@@ -43779,31 +39471,25 @@
 HSPLorg/json/JSONArray;-><init>(Lorg/json/JSONTokener;)V
 HSPLorg/json/JSONArray;->get(I)Ljava/lang/Object;
 HSPLorg/json/JSONArray;->getInt(I)I
-HSPLorg/json/JSONArray;->getJSONArray(I)Lorg/json/JSONArray;
 HSPLorg/json/JSONArray;->getJSONObject(I)Lorg/json/JSONObject;
 HSPLorg/json/JSONArray;->getLong(I)J
 HSPLorg/json/JSONArray;->getString(I)Ljava/lang/String;
 HSPLorg/json/JSONArray;->length()I
 HSPLorg/json/JSONArray;->opt(I)Ljava/lang/Object;
 HSPLorg/json/JSONArray;->optJSONObject(I)Lorg/json/JSONObject;
-HSPLorg/json/JSONArray;->optString(I)Ljava/lang/String;
-HSPLorg/json/JSONArray;->optString(ILjava/lang/String;)Ljava/lang/String;
 HSPLorg/json/JSONArray;->put(I)Lorg/json/JSONArray;
 HSPLorg/json/JSONArray;->put(J)Lorg/json/JSONArray;
 HSPLorg/json/JSONArray;->put(Ljava/lang/Object;)Lorg/json/JSONArray;
 HSPLorg/json/JSONArray;->toString()Ljava/lang/String;
 HSPLorg/json/JSONArray;->writeTo(Lorg/json/JSONStringer;)V
 HSPLorg/json/JSONException;-><init>(Ljava/lang/String;)V
-HSPLorg/json/JSONObject$1;->toString()Ljava/lang/String;
 HSPLorg/json/JSONObject;-><init>()V
 HSPLorg/json/JSONObject;-><init>(Ljava/lang/String;)V
 HSPLorg/json/JSONObject;-><init>(Ljava/util/Map;)V
-HSPLorg/json/JSONObject;-><init>(Lorg/json/JSONObject;[Ljava/lang/String;)V
 HSPLorg/json/JSONObject;-><init>(Lorg/json/JSONTokener;)V
 HSPLorg/json/JSONObject;->checkName(Ljava/lang/String;)Ljava/lang/String;
 HSPLorg/json/JSONObject;->get(Ljava/lang/String;)Ljava/lang/Object;
 HSPLorg/json/JSONObject;->getBoolean(Ljava/lang/String;)Z
-HSPLorg/json/JSONObject;->getDouble(Ljava/lang/String;)D
 HSPLorg/json/JSONObject;->getInt(Ljava/lang/String;)I
 HSPLorg/json/JSONObject;->getJSONArray(Ljava/lang/String;)Lorg/json/JSONArray;
 HSPLorg/json/JSONObject;->getJSONObject(Ljava/lang/String;)Lorg/json/JSONObject;
@@ -43817,8 +39503,6 @@
 HSPLorg/json/JSONObject;->opt(Ljava/lang/String;)Ljava/lang/Object;
 HSPLorg/json/JSONObject;->optBoolean(Ljava/lang/String;)Z
 HSPLorg/json/JSONObject;->optBoolean(Ljava/lang/String;Z)Z
-HSPLorg/json/JSONObject;->optDouble(Ljava/lang/String;)D
-HSPLorg/json/JSONObject;->optDouble(Ljava/lang/String;D)D
 HSPLorg/json/JSONObject;->optInt(Ljava/lang/String;)I
 HSPLorg/json/JSONObject;->optInt(Ljava/lang/String;I)I
 HSPLorg/json/JSONObject;->optJSONArray(Ljava/lang/String;)Lorg/json/JSONArray;
@@ -43833,14 +39517,10 @@
 HSPLorg/json/JSONObject;->put(Ljava/lang/String;Ljava/lang/Object;)Lorg/json/JSONObject;
 HSPLorg/json/JSONObject;->put(Ljava/lang/String;Z)Lorg/json/JSONObject;
 HSPLorg/json/JSONObject;->putOpt(Ljava/lang/String;Ljava/lang/Object;)Lorg/json/JSONObject;
-HSPLorg/json/JSONObject;->quote(Ljava/lang/String;)Ljava/lang/String;
-HSPLorg/json/JSONObject;->remove(Ljava/lang/String;)Ljava/lang/Object;
 HSPLorg/json/JSONObject;->toString()Ljava/lang/String;
-HSPLorg/json/JSONObject;->toString(I)Ljava/lang/String;
 HSPLorg/json/JSONObject;->wrap(Ljava/lang/Object;)Ljava/lang/Object;
 HSPLorg/json/JSONObject;->writeTo(Lorg/json/JSONStringer;)V
 HSPLorg/json/JSONStringer;-><init>()V
-HSPLorg/json/JSONStringer;-><init>(I)V
 HSPLorg/json/JSONStringer;->array()Lorg/json/JSONStringer;
 HSPLorg/json/JSONStringer;->beforeKey()V
 HSPLorg/json/JSONStringer;->beforeValue()V
@@ -43971,8 +39651,6 @@
 HSPLsun/misc/FormattedFloatingDecimal;->create(ZI)[C
 HSPLsun/misc/FormattedFloatingDecimal;->fillDecimal(I[CIIZ)V
 HSPLsun/misc/FormattedFloatingDecimal;->getBuffer()[C
-HSPLsun/misc/FormattedFloatingDecimal;->getExponent()[C
-HSPLsun/misc/FormattedFloatingDecimal;->getExponentRounded()I
 HSPLsun/misc/FormattedFloatingDecimal;->getMantissa()[C
 HSPLsun/misc/FormattedFloatingDecimal;->valueOf(DILsun/misc/FormattedFloatingDecimal$Form;)Lsun/misc/FormattedFloatingDecimal;
 HSPLsun/misc/IOUtils;->readFully(Ljava/io/InputStream;IZ)[B
@@ -43989,8 +39667,6 @@
 HSPLsun/misc/Unsafe;->getAndSetObject(Ljava/lang/Object;JLjava/lang/Object;)Ljava/lang/Object;
 HSPLsun/misc/Unsafe;->getUnsafe()Lsun/misc/Unsafe;
 HSPLsun/misc/Unsafe;->objectFieldOffset(Ljava/lang/reflect/Field;)J
-HSPLsun/misc/VM;->isBooted()Z
-HSPLsun/net/NetHooks;->beforeTcpBind(Ljava/io/FileDescriptor;Ljava/net/InetAddress;I)V
 HSPLsun/net/NetHooks;->beforeTcpConnect(Ljava/io/FileDescriptor;Ljava/net/InetAddress;I)V
 HSPLsun/net/NetProperties;->get(Ljava/lang/String;)Ljava/lang/String;
 HSPLsun/net/ResourceManager;->afterUdpClose()V
@@ -44005,18 +39681,6 @@
 HSPLsun/net/www/ParseUtil;->encodePath(Ljava/lang/String;Z)Ljava/lang/String;
 HSPLsun/net/www/protocol/file/Handler;->parseURL(Ljava/net/URL;Ljava/lang/String;II)V
 HSPLsun/net/www/protocol/jar/Handler;-><init>()V
-HSPLsun/nio/ch/AbstractPollArrayWrapper;-><init>()V
-HSPLsun/nio/ch/AbstractPollArrayWrapper;->getReventOps(I)I
-HSPLsun/nio/ch/AbstractPollArrayWrapper;->putDescriptor(II)V
-HSPLsun/nio/ch/AbstractPollArrayWrapper;->putEventOps(II)V
-HSPLsun/nio/ch/AbstractPollArrayWrapper;->putReventOps(II)V
-HSPLsun/nio/ch/AbstractPollSelectorImpl;-><init>(Ljava/nio/channels/spi/SelectorProvider;II)V
-HSPLsun/nio/ch/AbstractPollSelectorImpl;->implClose()V
-HSPLsun/nio/ch/AbstractPollSelectorImpl;->implRegister(Lsun/nio/ch/SelectionKeyImpl;)V
-HSPLsun/nio/ch/AbstractPollSelectorImpl;->putEventOps(Lsun/nio/ch/SelectionKeyImpl;I)V
-HSPLsun/nio/ch/AbstractPollSelectorImpl;->updateSelectedKeys()I
-HSPLsun/nio/ch/AllocatedNativeObject;-><init>(IZ)V
-HSPLsun/nio/ch/AllocatedNativeObject;->free()V
 HSPLsun/nio/ch/ChannelInputStream;-><init>(Ljava/nio/channels/ReadableByteChannel;)V
 HSPLsun/nio/ch/ChannelInputStream;->available()I
 HSPLsun/nio/ch/ChannelInputStream;->close()V
@@ -44024,7 +39688,6 @@
 HSPLsun/nio/ch/ChannelInputStream;->read(Ljava/nio/ByteBuffer;)I
 HSPLsun/nio/ch/ChannelInputStream;->read(Ljava/nio/channels/ReadableByteChannel;Ljava/nio/ByteBuffer;Z)I
 HSPLsun/nio/ch/ChannelInputStream;->read([BII)I
-HSPLsun/nio/ch/DefaultSelectorProvider;->create()Ljava/nio/channels/spi/SelectorProvider;
 HSPLsun/nio/ch/FileChannelImpl$Unmapper;-><init>(JJILjava/io/FileDescriptor;)V
 HSPLsun/nio/ch/FileChannelImpl$Unmapper;-><init>(JJILjava/io/FileDescriptor;Lsun/nio/ch/FileChannelImpl$1;)V
 HSPLsun/nio/ch/FileChannelImpl$Unmapper;->run()V
@@ -44045,10 +39708,8 @@
 HSPLsun/nio/ch/FileChannelImpl;->read(Ljava/nio/ByteBuffer;)I
 HSPLsun/nio/ch/FileChannelImpl;->release(Lsun/nio/ch/FileLockImpl;)V
 HSPLsun/nio/ch/FileChannelImpl;->size()J
-HSPLsun/nio/ch/FileChannelImpl;->truncate(J)Ljava/nio/channels/FileChannel;
 HSPLsun/nio/ch/FileChannelImpl;->tryLock(JJZ)Ljava/nio/channels/FileLock;
 HSPLsun/nio/ch/FileChannelImpl;->write(Ljava/nio/ByteBuffer;)I
-HSPLsun/nio/ch/FileDescriptorHolderSocketImpl;-><init>(Ljava/io/FileDescriptor;)V
 HSPLsun/nio/ch/FileDispatcher;-><init>()V
 HSPLsun/nio/ch/FileDispatcherImpl;-><init>(Z)V
 HSPLsun/nio/ch/FileDispatcherImpl;->close(Ljava/io/FileDescriptor;)V
@@ -44058,11 +39719,9 @@
 HSPLsun/nio/ch/FileDispatcherImpl;->read(Ljava/io/FileDescriptor;JI)I
 HSPLsun/nio/ch/FileDispatcherImpl;->release(Ljava/io/FileDescriptor;JJ)V
 HSPLsun/nio/ch/FileDispatcherImpl;->size(Ljava/io/FileDescriptor;)J
-HSPLsun/nio/ch/FileDispatcherImpl;->truncate(Ljava/io/FileDescriptor;J)I
 HSPLsun/nio/ch/FileDispatcherImpl;->write(Ljava/io/FileDescriptor;JI)I
 HSPLsun/nio/ch/FileKey;-><init>()V
 HSPLsun/nio/ch/FileKey;->create(Ljava/io/FileDescriptor;)Lsun/nio/ch/FileKey;
-HSPLsun/nio/ch/FileKey;->equals(Ljava/lang/Object;)Z
 HSPLsun/nio/ch/FileKey;->hashCode()I
 HSPLsun/nio/ch/FileLockImpl;-><init>(Ljava/nio/channels/FileChannel;JJZ)V
 HSPLsun/nio/ch/FileLockImpl;->invalidate()V
@@ -44073,93 +39732,24 @@
 HSPLsun/nio/ch/IOStatus;->checkAll(J)Z
 HSPLsun/nio/ch/IOStatus;->normalize(I)I
 HSPLsun/nio/ch/IOStatus;->normalize(J)J
-HSPLsun/nio/ch/IOUtil;->newFD(I)Ljava/io/FileDescriptor;
 HSPLsun/nio/ch/IOUtil;->read(Ljava/io/FileDescriptor;Ljava/nio/ByteBuffer;JLsun/nio/ch/NativeDispatcher;)I
 HSPLsun/nio/ch/IOUtil;->readIntoNativeBuffer(Ljava/io/FileDescriptor;Ljava/nio/ByteBuffer;JLsun/nio/ch/NativeDispatcher;)I
 HSPLsun/nio/ch/IOUtil;->write(Ljava/io/FileDescriptor;Ljava/nio/ByteBuffer;JLsun/nio/ch/NativeDispatcher;)I
 HSPLsun/nio/ch/IOUtil;->writeFromNativeBuffer(Ljava/io/FileDescriptor;Ljava/nio/ByteBuffer;JLsun/nio/ch/NativeDispatcher;)I
 HSPLsun/nio/ch/NativeDispatcher;-><init>()V
-HSPLsun/nio/ch/NativeObject;-><init>(IZ)V
-HSPLsun/nio/ch/NativeObject;->address()J
-HSPLsun/nio/ch/NativeObject;->getShort(I)S
-HSPLsun/nio/ch/NativeObject;->putInt(II)V
-HSPLsun/nio/ch/NativeObject;->putShort(IS)V
 HSPLsun/nio/ch/NativeThreadSet;-><init>(I)V
 HSPLsun/nio/ch/NativeThreadSet;->add()I
 HSPLsun/nio/ch/NativeThreadSet;->remove(I)V
 HSPLsun/nio/ch/NativeThreadSet;->signalAndWait()V
-HSPLsun/nio/ch/Net;->checkAddress(Ljava/net/SocketAddress;)Ljava/net/InetSocketAddress;
-HSPLsun/nio/ch/Net;->connect(Ljava/io/FileDescriptor;Ljava/net/InetAddress;I)I
-HSPLsun/nio/ch/Net;->connect(Ljava/net/ProtocolFamily;Ljava/io/FileDescriptor;Ljava/net/InetAddress;I)I
-HSPLsun/nio/ch/Net;->isIPv6Available()Z
-HSPLsun/nio/ch/Net;->localAddress(Ljava/io/FileDescriptor;)Ljava/net/InetSocketAddress;
-HSPLsun/nio/ch/Net;->socket(Ljava/net/ProtocolFamily;Z)Ljava/io/FileDescriptor;
-HSPLsun/nio/ch/Net;->socket(Z)Ljava/io/FileDescriptor;
-HSPLsun/nio/ch/PollArrayWrapper;-><init>(I)V
-HSPLsun/nio/ch/PollArrayWrapper;->addEntry(Lsun/nio/ch/SelChImpl;)V
-HSPLsun/nio/ch/PollArrayWrapper;->free()V
-HSPLsun/nio/ch/PollArrayWrapper;->initInterrupt(II)V
-HSPLsun/nio/ch/PollArrayWrapper;->interrupt()V
-HSPLsun/nio/ch/PollArrayWrapper;->poll(IIJ)I
-HSPLsun/nio/ch/PollArrayWrapper;->release(I)V
-HSPLsun/nio/ch/PollSelectorImpl;-><init>(Ljava/nio/channels/spi/SelectorProvider;)V
-HSPLsun/nio/ch/PollSelectorImpl;->doSelect(J)I
-HSPLsun/nio/ch/PollSelectorImpl;->implCloseInterrupt()V
-HSPLsun/nio/ch/PollSelectorImpl;->wakeup()Ljava/nio/channels/Selector;
-HSPLsun/nio/ch/PollSelectorProvider;-><init>()V
-HSPLsun/nio/ch/PollSelectorProvider;->openSelector()Ljava/nio/channels/spi/AbstractSelector;
-HSPLsun/nio/ch/SelectionKeyImpl;-><init>(Lsun/nio/ch/SelChImpl;Lsun/nio/ch/SelectorImpl;)V
-HSPLsun/nio/ch/SelectionKeyImpl;->channel()Ljava/nio/channels/SelectableChannel;
-HSPLsun/nio/ch/SelectionKeyImpl;->ensureValid()V
-HSPLsun/nio/ch/SelectionKeyImpl;->getIndex()I
-HSPLsun/nio/ch/SelectionKeyImpl;->interestOps(I)Ljava/nio/channels/SelectionKey;
-HSPLsun/nio/ch/SelectionKeyImpl;->nioInterestOps()I
-HSPLsun/nio/ch/SelectionKeyImpl;->nioInterestOps(I)Ljava/nio/channels/SelectionKey;
-HSPLsun/nio/ch/SelectionKeyImpl;->nioReadyOps()I
-HSPLsun/nio/ch/SelectionKeyImpl;->nioReadyOps(I)V
-HSPLsun/nio/ch/SelectionKeyImpl;->readyOps()I
-HSPLsun/nio/ch/SelectionKeyImpl;->selector()Ljava/nio/channels/Selector;
-HSPLsun/nio/ch/SelectionKeyImpl;->setIndex(I)V
-HSPLsun/nio/ch/SelectorImpl;-><init>(Ljava/nio/channels/spi/SelectorProvider;)V
-HSPLsun/nio/ch/SelectorImpl;->implCloseSelector()V
-HSPLsun/nio/ch/SelectorImpl;->lockAndDoSelect(J)I
-HSPLsun/nio/ch/SelectorImpl;->processDeregisterQueue()V
-HSPLsun/nio/ch/SelectorImpl;->register(Ljava/nio/channels/spi/AbstractSelectableChannel;ILjava/lang/Object;)Ljava/nio/channels/SelectionKey;
-HSPLsun/nio/ch/SelectorImpl;->select(J)I
-HSPLsun/nio/ch/SelectorProviderImpl;-><init>()V
-HSPLsun/nio/ch/SelectorProviderImpl;->openSocketChannel()Ljava/nio/channels/SocketChannel;
 HSPLsun/nio/ch/SharedFileLockTable$FileLockReference;-><init>(Ljava/nio/channels/FileLock;Ljava/lang/ref/ReferenceQueue;Lsun/nio/ch/FileKey;)V
-HSPLsun/nio/ch/SharedFileLockTable$FileLockReference;->fileKey()Lsun/nio/ch/FileKey;
 HSPLsun/nio/ch/SharedFileLockTable;-><init>(Ljava/nio/channels/Channel;Ljava/io/FileDescriptor;)V
 HSPLsun/nio/ch/SharedFileLockTable;->add(Ljava/nio/channels/FileLock;)V
-HSPLsun/nio/ch/SharedFileLockTable;->checkList(Ljava/util/List;JJ)V
 HSPLsun/nio/ch/SharedFileLockTable;->remove(Ljava/nio/channels/FileLock;)V
 HSPLsun/nio/ch/SharedFileLockTable;->removeAll()Ljava/util/List;
 HSPLsun/nio/ch/SharedFileLockTable;->removeKeyIfEmpty(Lsun/nio/ch/FileKey;Ljava/util/List;)V
 HSPLsun/nio/ch/SharedFileLockTable;->removeStaleEntries()V
-HSPLsun/nio/ch/SocketAdaptor;-><init>(Lsun/nio/ch/SocketChannelImpl;)V
-HSPLsun/nio/ch/SocketAdaptor;->create(Lsun/nio/ch/SocketChannelImpl;)Ljava/net/Socket;
-HSPLsun/nio/ch/SocketAdaptor;->isClosed()Z
-HSPLsun/nio/ch/SocketChannelImpl;-><init>(Ljava/nio/channels/spi/SelectorProvider;)V
-HSPLsun/nio/ch/SocketChannelImpl;->connect(Ljava/net/SocketAddress;)Z
-HSPLsun/nio/ch/SocketChannelImpl;->ensureOpenAndUnconnected()V
-HSPLsun/nio/ch/SocketChannelImpl;->finalize()V
-HSPLsun/nio/ch/SocketChannelImpl;->finishConnect()Z
-HSPLsun/nio/ch/SocketChannelImpl;->getFD()Ljava/io/FileDescriptor;
-HSPLsun/nio/ch/SocketChannelImpl;->implCloseSelectableChannel()V
-HSPLsun/nio/ch/SocketChannelImpl;->implConfigureBlocking(Z)V
-HSPLsun/nio/ch/SocketChannelImpl;->isConnected()Z
-HSPLsun/nio/ch/SocketChannelImpl;->kill()V
-HSPLsun/nio/ch/SocketChannelImpl;->readerCleanup()V
-HSPLsun/nio/ch/SocketChannelImpl;->socket()Ljava/net/Socket;
-HSPLsun/nio/ch/SocketChannelImpl;->translateAndSetInterestOps(ILsun/nio/ch/SelectionKeyImpl;)V
-HSPLsun/nio/ch/SocketChannelImpl;->translateAndSetReadyOps(ILsun/nio/ch/SelectionKeyImpl;)Z
-HSPLsun/nio/ch/SocketChannelImpl;->translateReadyOps(IILsun/nio/ch/SelectionKeyImpl;)Z
-HSPLsun/nio/ch/SocketDispatcher;->close(Ljava/io/FileDescriptor;)V
-HSPLsun/nio/ch/SocketDispatcher;->preClose(Ljava/io/FileDescriptor;)V
 HSPLsun/nio/ch/Util$1;->initialValue()Ljava/lang/Object;
 HSPLsun/nio/ch/Util$1;->initialValue()Lsun/nio/ch/Util$BufferCache;
-HSPLsun/nio/ch/Util$3;-><init>(Ljava/util/Set;)V
 HSPLsun/nio/ch/Util$BufferCache;-><init>()V
 HSPLsun/nio/ch/Util$BufferCache;->get(I)Ljava/nio/ByteBuffer;
 HSPLsun/nio/ch/Util$BufferCache;->isEmpty()Z
@@ -44167,13 +39757,11 @@
 HSPLsun/nio/ch/Util$BufferCache;->offerFirst(Ljava/nio/ByteBuffer;)Z
 HSPLsun/nio/ch/Util$BufferCache;->removeFirst()Ljava/nio/ByteBuffer;
 HSPLsun/nio/ch/Util;->access$000()I
-HSPLsun/nio/ch/Util;->atBugLevel(Ljava/lang/String;)Z
 HSPLsun/nio/ch/Util;->free(Ljava/nio/ByteBuffer;)V
 HSPLsun/nio/ch/Util;->getTemporaryDirectBuffer(I)Ljava/nio/ByteBuffer;
 HSPLsun/nio/ch/Util;->isBufferTooLarge(I)Z
 HSPLsun/nio/ch/Util;->isBufferTooLarge(Ljava/nio/ByteBuffer;)Z
 HSPLsun/nio/ch/Util;->offerFirstTemporaryDirectBuffer(Ljava/nio/ByteBuffer;)V
-HSPLsun/nio/ch/Util;->ungrowableSet(Ljava/util/Set;)Ljava/util/Set;
 HSPLsun/nio/cs/StreamDecoder;-><init>(Ljava/io/InputStream;Ljava/lang/Object;Ljava/nio/charset/Charset;)V
 HSPLsun/nio/cs/StreamDecoder;-><init>(Ljava/io/InputStream;Ljava/lang/Object;Ljava/nio/charset/CharsetDecoder;)V
 HSPLsun/nio/cs/StreamDecoder;->close()V
@@ -44195,7 +39783,6 @@
 HSPLsun/nio/cs/StreamEncoder;->close()V
 HSPLsun/nio/cs/StreamEncoder;->ensureOpen()V
 HSPLsun/nio/cs/StreamEncoder;->flush()V
-HSPLsun/nio/cs/StreamEncoder;->flushBuffer()V
 HSPLsun/nio/cs/StreamEncoder;->flushLeftoverChar(Ljava/nio/CharBuffer;Z)V
 HSPLsun/nio/cs/StreamEncoder;->forOutputStreamWriter(Ljava/io/OutputStream;Ljava/lang/Object;Ljava/lang/String;)Lsun/nio/cs/StreamEncoder;
 HSPLsun/nio/cs/StreamEncoder;->forOutputStreamWriter(Ljava/io/OutputStream;Ljava/lang/Object;Ljava/nio/charset/Charset;)Lsun/nio/cs/StreamEncoder;
@@ -44203,26 +39790,23 @@
 HSPLsun/nio/cs/StreamEncoder;->implFlush()V
 HSPLsun/nio/cs/StreamEncoder;->implFlushBuffer()V
 HSPLsun/nio/cs/StreamEncoder;->implWrite([CII)V
-HSPLsun/nio/cs/StreamEncoder;->isOpen()Z
 HSPLsun/nio/cs/StreamEncoder;->write(I)V
 HSPLsun/nio/cs/StreamEncoder;->write(Ljava/lang/String;II)V
 HSPLsun/nio/cs/StreamEncoder;->write([CII)V
 HSPLsun/nio/cs/StreamEncoder;->writeBytes()V
 HSPLsun/nio/cs/ThreadLocalCoders$1;->create(Ljava/lang/Object;)Ljava/lang/Object;
 HSPLsun/nio/cs/ThreadLocalCoders$1;->hasName(Ljava/lang/Object;Ljava/lang/Object;)Z
-HSPLsun/nio/cs/ThreadLocalCoders$2;->create(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLsun/nio/cs/ThreadLocalCoders$2;->hasName(Ljava/lang/Object;Ljava/lang/Object;)Z
 HSPLsun/nio/cs/ThreadLocalCoders$Cache;->forName(Ljava/lang/Object;)Ljava/lang/Object;
 HSPLsun/nio/cs/ThreadLocalCoders$Cache;->moveToFront([Ljava/lang/Object;I)V
 HSPLsun/nio/cs/ThreadLocalCoders;->decoderFor(Ljava/lang/Object;)Ljava/nio/charset/CharsetDecoder;
-HSPLsun/nio/cs/ThreadLocalCoders;->encoderFor(Ljava/lang/Object;)Ljava/nio/charset/CharsetEncoder;
 HSPLsun/nio/fs/AbstractBasicFileAttributeView;-><init>()V
-HSPLsun/nio/fs/AbstractFileSystemProvider;->delete(Ljava/nio/file/Path;)V
 HSPLsun/nio/fs/AbstractPath;-><init>()V
 HSPLsun/nio/fs/AbstractPath;->resolve(Ljava/lang/String;)Ljava/nio/file/Path;
 HSPLsun/nio/fs/AbstractPath;->startsWith(Ljava/lang/String;)Z
 HSPLsun/nio/fs/AbstractPath;->toFile()Ljava/io/File;
 PLsun/nio/fs/Globs;-><clinit>()V
+HPLsun/nio/fs/Globs;->next(Ljava/lang/String;I)C
+HPLsun/nio/fs/Globs;->toRegexPattern(Ljava/lang/String;Z)Ljava/lang/String;
 PLsun/nio/fs/Globs;->toUnixRegexPattern(Ljava/lang/String;)Ljava/lang/String;
 HSPLsun/nio/fs/LinuxFileSystemProvider;->getFileAttributeView(Ljava/nio/file/Path;Ljava/lang/Class;[Ljava/nio/file/LinkOption;)Ljava/nio/file/attribute/FileAttributeView;
 HSPLsun/nio/fs/LinuxFileSystemProvider;->readAttributes(Ljava/nio/file/Path;Ljava/lang/Class;[Ljava/nio/file/LinkOption;)Ljava/nio/file/attribute/BasicFileAttributes;
@@ -44290,6 +39874,7 @@
 HSPLsun/nio/fs/UnixFileAttributes;->toFileTime(JJ)Ljava/nio/file/attribute/FileTime;
 HSPLsun/nio/fs/UnixFileModeAttribute;->toUnixMode(I[Ljava/nio/file/attribute/FileAttribute;)I
 PLsun/nio/fs/UnixFileSystem$3;-><init>(Lsun/nio/fs/UnixFileSystem;Ljava/util/regex/Pattern;)V
+HPLsun/nio/fs/UnixFileSystem$3;->matches(Ljava/nio/file/Path;)Z
 PLsun/nio/fs/UnixFileSystem;->compilePathMatchPattern(Ljava/lang/String;)Ljava/util/regex/Pattern;
 HSPLsun/nio/fs/UnixFileSystem;->getPath(Ljava/lang/String;[Ljava/lang/String;)Ljava/nio/file/Path;
 HPLsun/nio/fs/UnixFileSystem;->getPathMatcher(Ljava/lang/String;)Ljava/nio/file/PathMatcher;
@@ -44297,12 +39882,10 @@
 HSPLsun/nio/fs/UnixFileSystem;->normalizeJavaPath(Ljava/lang/String;)Ljava/lang/String;
 HSPLsun/nio/fs/UnixFileSystem;->normalizeNativePath([C)[C
 HSPLsun/nio/fs/UnixFileSystem;->provider()Ljava/nio/file/spi/FileSystemProvider;
-HSPLsun/nio/fs/UnixFileSystemProvider$3;-><clinit>()V
 HSPLsun/nio/fs/UnixFileSystemProvider;->checkAccess(Ljava/nio/file/Path;[Ljava/nio/file/AccessMode;)V
 HSPLsun/nio/fs/UnixFileSystemProvider;->checkPath(Ljava/nio/file/Path;)Lsun/nio/fs/UnixPath;
 HPLsun/nio/fs/UnixFileSystemProvider;->createLink(Ljava/nio/file/Path;Ljava/nio/file/Path;)V
 HSPLsun/nio/fs/UnixFileSystemProvider;->getFileAttributeView(Ljava/nio/file/Path;Ljava/lang/Class;[Ljava/nio/file/LinkOption;)Ljava/nio/file/attribute/FileAttributeView;
-HSPLsun/nio/fs/UnixFileSystemProvider;->implDelete(Ljava/nio/file/Path;Z)Z
 HSPLsun/nio/fs/UnixFileSystemProvider;->newByteChannel(Ljava/nio/file/Path;Ljava/util/Set;[Ljava/nio/file/attribute/FileAttribute;)Ljava/nio/channels/SeekableByteChannel;
 HSPLsun/nio/fs/UnixFileSystemProvider;->newDirectoryStream(Ljava/nio/file/Path;Ljava/nio/file/DirectoryStream$Filter;)Ljava/nio/file/DirectoryStream;
 HSPLsun/nio/fs/UnixFileSystemProvider;->newFileChannel(Ljava/nio/file/Path;Ljava/util/Set;[Ljava/nio/file/attribute/FileAttribute;)Ljava/nio/channels/FileChannel;
@@ -44316,12 +39899,8 @@
 HSPLsun/nio/fs/UnixNativeDispatcher;->stat(Lsun/nio/fs/UnixPath;Lsun/nio/fs/UnixFileAttributes;)V
 HSPLsun/nio/fs/UnixPath;-><init>(Lsun/nio/fs/UnixFileSystem;Ljava/lang/String;)V
 HSPLsun/nio/fs/UnixPath;-><init>(Lsun/nio/fs/UnixFileSystem;[B)V
-HSPLsun/nio/fs/UnixPath;->asByteArray()[B
-HSPLsun/nio/fs/UnixPath;->checkDelete()V
 HSPLsun/nio/fs/UnixPath;->checkNotNul(Ljava/lang/String;C)V
 HSPLsun/nio/fs/UnixPath;->checkRead()V
-HSPLsun/nio/fs/UnixPath;->checkWrite()V
-HSPLsun/nio/fs/UnixPath;->compareTo(Ljava/nio/file/Path;)I
 HSPLsun/nio/fs/UnixPath;->encode(Lsun/nio/fs/UnixFileSystem;Ljava/lang/String;)[B
 HSPLsun/nio/fs/UnixPath;->getByteArrayForSysCalls()[B
 HSPLsun/nio/fs/UnixPath;->getFileName()Ljava/nio/file/Path;
@@ -44464,6 +40043,7 @@
 HSPLsun/security/provider/certpath/AdaptableX509CertSelector;->setSkiAndSerialNumber(Lsun/security/x509/AuthorityKeyIdentifierExtension;)V
 PLsun/security/provider/certpath/AdaptableX509CertSelector;->setValidityPeriod(Ljava/util/Date;Ljava/util/Date;)V
 PLsun/security/provider/certpath/AdjacencyList;-><init>(Ljava/util/List;)V
+HPLsun/security/provider/certpath/AdjacencyList;->buildList(Ljava/util/List;ILsun/security/provider/certpath/BuildStep;)Z
 HSPLsun/security/provider/certpath/AlgorithmChecker;-><init>(Ljava/security/cert/TrustAnchor;)V
 HSPLsun/security/provider/certpath/AlgorithmChecker;-><init>(Ljava/security/cert/TrustAnchor;Ljava/security/AlgorithmConstraints;)V
 HSPLsun/security/provider/certpath/AlgorithmChecker;->check(Ljava/security/cert/Certificate;Ljava/util/Collection;)V
@@ -44479,47 +40059,32 @@
 HSPLsun/security/provider/certpath/BasicChecker;->verifyNameChaining(Ljava/security/cert/X509Certificate;)V
 HSPLsun/security/provider/certpath/BasicChecker;->verifySignature(Ljava/security/cert/X509Certificate;)V
 HSPLsun/security/provider/certpath/BasicChecker;->verifyTimestamp(Ljava/security/cert/X509Certificate;)V
+HPLsun/security/provider/certpath/BuildStep;-><init>(Lsun/security/provider/certpath/Vertex;I)V
 PLsun/security/provider/certpath/Builder;-><clinit>()V
-PLsun/security/provider/certpath/Builder;-><init>(Lsun/security/provider/certpath/PKIX$BuilderParams;)V
-HPLsun/security/provider/certpath/Builder;->addMatchingCerts(Ljava/security/cert/X509CertSelector;Ljava/util/Collection;Ljava/util/Collection;Z)Z
-PLsun/security/provider/certpath/CertPathHelper;->setPathToNames(Ljava/security/cert/X509CertSelector;Ljava/util/Set;)V
 HSPLsun/security/provider/certpath/ConstraintsChecker;-><init>(I)V
 HSPLsun/security/provider/certpath/ConstraintsChecker;->check(Ljava/security/cert/Certificate;Ljava/util/Collection;)V
 HSPLsun/security/provider/certpath/ConstraintsChecker;->checkBasicConstraints(Ljava/security/cert/X509Certificate;)V
 HSPLsun/security/provider/certpath/ConstraintsChecker;->init(Z)V
 HSPLsun/security/provider/certpath/ConstraintsChecker;->mergeNameConstraints(Ljava/security/cert/X509Certificate;Lsun/security/x509/NameConstraintsExtension;)Lsun/security/x509/NameConstraintsExtension;
 HSPLsun/security/provider/certpath/ConstraintsChecker;->verifyNameConstraints(Ljava/security/cert/X509Certificate;)V
-PLsun/security/provider/certpath/ForwardBuilder$PKIXCertComparator;-><init>(Ljava/util/Set;Lsun/security/x509/X509CertImpl;)V
-HPLsun/security/provider/certpath/ForwardBuilder$PKIXCertComparator;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
-HPLsun/security/provider/certpath/ForwardBuilder$PKIXCertComparator;->compare(Ljava/security/cert/X509Certificate;Ljava/security/cert/X509Certificate;)I
-PLsun/security/provider/certpath/ForwardBuilder$PKIXCertComparator;->getSelector(Lsun/security/x509/X509CertImpl;)Ljava/security/cert/X509CertSelector;
 PLsun/security/provider/certpath/ForwardBuilder;-><clinit>()V
-HPLsun/security/provider/certpath/ForwardBuilder;-><init>(Lsun/security/provider/certpath/PKIX$BuilderParams;Z)V
-PLsun/security/provider/certpath/ForwardBuilder;->access$000()Lsun/security/util/Debug;
 PLsun/security/provider/certpath/ForwardBuilder;->addCertToPath(Ljava/security/cert/X509Certificate;Ljava/util/LinkedList;)V
-HPLsun/security/provider/certpath/ForwardBuilder;->getMatchingCACerts(Lsun/security/provider/certpath/ForwardState;Ljava/util/List;Ljava/util/Collection;)V
-HPLsun/security/provider/certpath/ForwardBuilder;->getMatchingCerts(Lsun/security/provider/certpath/State;Ljava/util/List;)Ljava/util/Collection;
 PLsun/security/provider/certpath/ForwardBuilder;->getMatchingEECerts(Lsun/security/provider/certpath/ForwardState;Ljava/util/List;Ljava/util/Collection;)V
-HPLsun/security/provider/certpath/ForwardBuilder;->isPathCompleted(Ljava/security/cert/X509Certificate;)Z
+HPLsun/security/provider/certpath/ForwardBuilder;->verifyCert(Ljava/security/cert/X509Certificate;Lsun/security/provider/certpath/State;Ljava/util/List;)V
 PLsun/security/provider/certpath/ForwardState;-><clinit>()V
 PLsun/security/provider/certpath/ForwardState;-><init>()V
-HPLsun/security/provider/certpath/ForwardState;->clone()Ljava/lang/Object;
 PLsun/security/provider/certpath/ForwardState;->initState(Ljava/util/List;)V
-PLsun/security/provider/certpath/ForwardState;->isInitial()Z
+HPLsun/security/provider/certpath/ForwardState;->isInitial()Z
 PLsun/security/provider/certpath/ForwardState;->keyParamsNeeded()Z
-HPLsun/security/provider/certpath/ForwardState;->updateState(Ljava/security/cert/X509Certificate;)V
 HSPLsun/security/provider/certpath/KeyChecker;-><init>(ILjava/security/cert/CertSelector;)V
 HSPLsun/security/provider/certpath/KeyChecker;->check(Ljava/security/cert/Certificate;Ljava/util/Collection;)V
 HSPLsun/security/provider/certpath/KeyChecker;->init(Z)V
 HSPLsun/security/provider/certpath/KeyChecker;->verifyCAKeyUsage(Ljava/security/cert/X509Certificate;)V
 PLsun/security/provider/certpath/PKIX$BuilderParams;-><init>(Ljava/security/cert/PKIXBuilderParameters;)V
-HPLsun/security/provider/certpath/PKIX$BuilderParams;->certStores()Ljava/util/List;
 PLsun/security/provider/certpath/PKIX$BuilderParams;->checkParams(Ljava/security/cert/PKIXBuilderParameters;)V
 PLsun/security/provider/certpath/PKIX$BuilderParams;->getTargetSubject(Ljava/util/List;Ljava/security/cert/X509CertSelector;)Ljavax/security/auth/x500/X500Principal;
 PLsun/security/provider/certpath/PKIX$BuilderParams;->maxPathLength()I
 PLsun/security/provider/certpath/PKIX$BuilderParams;->targetSubject()Ljavax/security/auth/x500/X500Principal;
-PLsun/security/provider/certpath/PKIX$CertStoreComparator;-><init>()V
-PLsun/security/provider/certpath/PKIX$CertStoreComparator;-><init>(Lsun/security/provider/certpath/PKIX$1;)V
 HSPLsun/security/provider/certpath/PKIX$ValidatorParams;-><init>(Ljava/security/cert/CertPath;Ljava/security/cert/PKIXParameters;)V
 HSPLsun/security/provider/certpath/PKIX$ValidatorParams;-><init>(Ljava/security/cert/PKIXParameters;)V
 HSPLsun/security/provider/certpath/PKIX$ValidatorParams;->anyPolicyInhibited()Z
@@ -44573,16 +40138,16 @@
 HSPLsun/security/provider/certpath/PolicyNodeImpl;->setImmutable()V
 PLsun/security/provider/certpath/SunCertPathBuilder;-><clinit>()V
 PLsun/security/provider/certpath/SunCertPathBuilder;-><init>()V
+HPLsun/security/provider/certpath/SunCertPathBuilder;->addVertices(Ljava/util/Collection;Ljava/util/List;)Ljava/util/List;
 PLsun/security/provider/certpath/SunCertPathBuilder;->build()Ljava/security/cert/PKIXCertPathBuilderResult;
 PLsun/security/provider/certpath/SunCertPathBuilder;->buildCertPath(ZLjava/util/List;)Ljava/security/cert/PKIXCertPathBuilderResult;
 PLsun/security/provider/certpath/SunCertPathBuilder;->buildForward(Ljava/util/List;Ljava/util/LinkedList;Z)V
+HPLsun/security/provider/certpath/SunCertPathBuilder;->depthFirstSearchForward(Ljavax/security/auth/x500/X500Principal;Lsun/security/provider/certpath/ForwardState;Lsun/security/provider/certpath/ForwardBuilder;Ljava/util/List;Ljava/util/LinkedList;)V
 PLsun/security/provider/certpath/SunCertPathBuilder;->engineBuild(Ljava/security/cert/CertPathParameters;)Ljava/security/cert/CertPathBuilderResult;
 PLsun/security/provider/certpath/SunCertPathBuilderResult;-><clinit>()V
 PLsun/security/provider/certpath/SunCertPathBuilderResult;-><init>(Ljava/security/cert/CertPath;Ljava/security/cert/TrustAnchor;Ljava/security/cert/PolicyNode;Ljava/security/PublicKey;Lsun/security/provider/certpath/AdjacencyList;)V
 PLsun/security/provider/certpath/Vertex;-><clinit>()V
-HPLsun/security/provider/certpath/Vertex;->getCertificate()Ljava/security/cert/X509Certificate;
-HPLsun/security/provider/certpath/Vertex;->getIndex()I
-HPLsun/security/provider/certpath/Vertex;->getThrowable()Ljava/lang/Throwable;
+PLsun/security/provider/certpath/Vertex;-><init>(Ljava/security/cert/X509Certificate;)V
 PLsun/security/provider/certpath/Vertex;->setIndex(I)V
 HSPLsun/security/util/AbstractAlgorithmConstraints;->checkAlgorithm([Ljava/lang/String;Ljava/lang/String;Lsun/security/util/AlgorithmDecomposer;)Z
 HSPLsun/security/util/AlgorithmDecomposer;->decompose(Ljava/lang/String;)Ljava/util/Set;
@@ -44989,7 +40554,6 @@
 HSPLsun/util/locale/Extension;-><init>(CLjava/lang/String;)V
 HSPLsun/util/locale/Extension;->setValue(Ljava/lang/String;)V
 HSPLsun/util/locale/InternalLocaleBuilder;-><init>()V
-HSPLsun/util/locale/InternalLocaleBuilder;->checkVariants(Ljava/lang/String;Ljava/lang/String;)I
 HSPLsun/util/locale/InternalLocaleBuilder;->clear()Lsun/util/locale/InternalLocaleBuilder;
 HSPLsun/util/locale/InternalLocaleBuilder;->clearExtensions()Lsun/util/locale/InternalLocaleBuilder;
 HSPLsun/util/locale/InternalLocaleBuilder;->getBaseLocale()Lsun/util/locale/BaseLocale;
@@ -44997,9 +40561,6 @@
 HSPLsun/util/locale/InternalLocaleBuilder;->setExtensions(Ljava/util/List;Ljava/lang/String;)Lsun/util/locale/InternalLocaleBuilder;
 HSPLsun/util/locale/InternalLocaleBuilder;->setLanguage(Ljava/lang/String;)Lsun/util/locale/InternalLocaleBuilder;
 HSPLsun/util/locale/InternalLocaleBuilder;->setLanguageTag(Lsun/util/locale/LanguageTag;)Lsun/util/locale/InternalLocaleBuilder;
-HSPLsun/util/locale/InternalLocaleBuilder;->setRegion(Ljava/lang/String;)Lsun/util/locale/InternalLocaleBuilder;
-HSPLsun/util/locale/InternalLocaleBuilder;->setScript(Ljava/lang/String;)Lsun/util/locale/InternalLocaleBuilder;
-HSPLsun/util/locale/InternalLocaleBuilder;->setVariant(Ljava/lang/String;)Lsun/util/locale/InternalLocaleBuilder;
 HSPLsun/util/locale/LanguageTag;-><init>()V
 HSPLsun/util/locale/LanguageTag;->canonicalizeLanguage(Ljava/lang/String;)Ljava/lang/String;
 HSPLsun/util/locale/LanguageTag;->canonicalizeRegion(Ljava/lang/String;)Ljava/lang/String;
@@ -45030,8 +40591,6 @@
 HSPLsun/util/locale/LocaleExtensions;-><init>(Ljava/lang/String;Ljava/lang/Character;Lsun/util/locale/Extension;)V
 HSPLsun/util/locale/LocaleObjectCache$CacheEntry;-><init>(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/ref/ReferenceQueue;)V
 HSPLsun/util/locale/LocaleObjectCache$CacheEntry;->getKey()Ljava/lang/Object;
-HSPLsun/util/locale/LocaleObjectCache;-><init>()V
-HSPLsun/util/locale/LocaleObjectCache;-><init>(IFI)V
 HSPLsun/util/locale/LocaleObjectCache;->cleanStaleEntries()V
 HSPLsun/util/locale/LocaleObjectCache;->get(Ljava/lang/Object;)Ljava/lang/Object;
 HSPLsun/util/locale/LocaleObjectCache;->normalizeKey(Ljava/lang/Object;)Ljava/lang/Object;
@@ -45063,21 +40622,7 @@
 HSPLsun/util/locale/StringTokenIterator;->setStart(I)Lsun/util/locale/StringTokenIterator;
 HSPLsun/util/locale/UnicodeLocaleExtension;-><clinit>()V
 HSPLsun/util/locale/UnicodeLocaleExtension;-><init>(Ljava/lang/String;Ljava/lang/String;)V
-HSPLsun/util/logging/LoggingSupport$2;-><init>()V
-HSPLsun/util/logging/LoggingSupport$2;->run()Ljava/lang/Object;
-HSPLsun/util/logging/LoggingSupport$2;->run()Ljava/lang/String;
-HSPLsun/util/logging/LoggingSupport;->ensureAvailable()V
-HSPLsun/util/logging/LoggingSupport;->getLogger(Ljava/lang/String;)Ljava/lang/Object;
-HSPLsun/util/logging/LoggingSupport;->getSimpleFormat()Ljava/lang/String;
-HSPLsun/util/logging/LoggingSupport;->getSimpleFormat(Z)Ljava/lang/String;
-HSPLsun/util/logging/LoggingSupport;->parseLevel(Ljava/lang/String;)Ljava/lang/Object;
-HSPLsun/util/logging/PlatformLogger$JavaLoggerProxy;-><clinit>()V
-HSPLsun/util/logging/PlatformLogger$JavaLoggerProxy;-><init>(Ljava/lang/String;)V
-HSPLsun/util/logging/PlatformLogger$JavaLoggerProxy;-><init>(Ljava/lang/String;Lsun/util/logging/PlatformLogger$Level;)V
-HSPLsun/util/logging/PlatformLogger$Level;->values()[Lsun/util/logging/PlatformLogger$Level;
-HSPLsun/util/logging/PlatformLogger$LoggerProxy;-><init>(Ljava/lang/String;)V
 HSPLsun/util/logging/PlatformLogger;-><init>(Ljava/lang/String;)V
-HSPLsun/util/logging/PlatformLogger;->getLogger(Ljava/lang/String;)Lsun/util/logging/PlatformLogger;
 Landroid/R$styleable;
 Landroid/accessibilityservice/AccessibilityServiceInfo$1;
 Landroid/accessibilityservice/AccessibilityServiceInfo;
@@ -45192,6 +40737,7 @@
 Landroid/animation/PropertyValuesHolder$PropertyValues;
 Landroid/animation/PropertyValuesHolder;
 Landroid/animation/RectEvaluator;
+Landroid/animation/RevealAnimator;
 Landroid/animation/StateListAnimator$1;
 Landroid/animation/StateListAnimator$StateListAnimatorConstantState;
 Landroid/animation/StateListAnimator$Tuple;
@@ -45204,6 +40750,7 @@
 Landroid/animation/ValueAnimator$AnimatorUpdateListener;
 Landroid/animation/ValueAnimator;
 Landroid/annotation/ColorInt;
+Landroid/annotation/CurrentTimeMillisLong;
 Landroid/annotation/IntRange;
 Landroid/annotation/NonNull;
 Landroid/annotation/SystemApi;
@@ -45234,11 +40781,13 @@
 Landroid/app/-$$Lambda$Notification$hOCsSZH8tWalFSbIzQ9x9IcPa9M;
 Landroid/app/-$$Lambda$ResourcesManager$QJ7UiVk_XS90KuXAsIjIEym1DnM;
 Landroid/app/-$$Lambda$SharedPreferencesImpl$EditorImpl$3CAjkhzA131V3V-sLfP2uy0FWZ0;
+Landroid/app/-$$Lambda$SystemServiceRegistry$16$s6mZ42tuGUunhKa_5iwjLY5FGdM;
 Landroid/app/-$$Lambda$SystemServiceRegistry$17$DBwvhMLzjNnBFkaOY1OxllrybH4;
 Landroid/app/-$$Lambda$WallpaperManager$Globals$1AcnQUORvPlCjJoNqdxfQT4o4Nw;
 Landroid/app/-$$Lambda$WallpaperManager$Globals$2yG7V1sbMECCnlFTLyjKWKqNoYI;
 Landroid/app/-$$Lambda$ZsFzoG2loyqNOR2cNbo-thrNK5c;
 Landroid/app/-$$Lambda$oslF4K8Uk6v-6nTRoaEpCmfAptE;
+Landroid/app/-$$Lambda$thfU5Zh-cKOR8p7IfITtlg111Go;
 Landroid/app/ActionBar$LayoutParams;
 Landroid/app/ActionBar;
 Landroid/app/Activity$1;
@@ -45268,6 +40817,7 @@
 Landroid/app/ActivityManager$TaskDescription$1;
 Landroid/app/ActivityManager$TaskDescription;
 Landroid/app/ActivityManager$TaskSnapshot$1;
+Landroid/app/ActivityManager$TaskSnapshot$Builder;
 Landroid/app/ActivityManager$TaskSnapshot;
 Landroid/app/ActivityManager$UidObserver;
 Landroid/app/ActivityManager;
@@ -45320,8 +40870,10 @@
 Landroid/app/AppOpsManager$1;
 Landroid/app/AppOpsManager$2;
 Landroid/app/AppOpsManager$3;
-Landroid/app/AppOpsManager$AppOpsCollector$1;
+Landroid/app/AppOpsManager$4;
 Landroid/app/AppOpsManager$AppOpsCollector;
+Landroid/app/AppOpsManager$AttributedHistoricalOps;
+Landroid/app/AppOpsManager$AttributedOpEntry;
 Landroid/app/AppOpsManager$HistoricalFeatureOps;
 Landroid/app/AppOpsManager$HistoricalOp$1;
 Landroid/app/AppOpsManager$HistoricalOp;
@@ -45333,20 +40885,27 @@
 Landroid/app/AppOpsManager$HistoricalPackageOps;
 Landroid/app/AppOpsManager$HistoricalUidOps$1;
 Landroid/app/AppOpsManager$HistoricalUidOps;
+Landroid/app/AppOpsManager$Mode;
+Landroid/app/AppOpsManager$NoteOpEvent$1;
 Landroid/app/AppOpsManager$NoteOpEvent;
 Landroid/app/AppOpsManager$OnOpActiveChangedInternalListener;
 Landroid/app/AppOpsManager$OnOpActiveChangedListener;
 Landroid/app/AppOpsManager$OnOpChangedInternalListener;
 Landroid/app/AppOpsManager$OnOpChangedListener;
+Landroid/app/AppOpsManager$OnOpNotedCallback$1;
+Landroid/app/AppOpsManager$OnOpNotedCallback;
 Landroid/app/AppOpsManager$OnOpNotedListener;
 Landroid/app/AppOpsManager$OpEntry$1;
 Landroid/app/AppOpsManager$OpEntry;
+Landroid/app/AppOpsManager$OpEventProxyInfo$1;
+Landroid/app/AppOpsManager$OpEventProxyInfo;
 Landroid/app/AppOpsManager$OpFeatureEntry$1;
 Landroid/app/AppOpsManager$OpFeatureEntry$LongSparseArrayParceling;
 Landroid/app/AppOpsManager$OpFeatureEntry;
 Landroid/app/AppOpsManager$PackageOps$1;
 Landroid/app/AppOpsManager$PackageOps;
 Landroid/app/AppOpsManager$PausedNotedAppOpsCollection;
+Landroid/app/AppOpsManager$RestrictionBypass;
 Landroid/app/AppOpsManager;
 Landroid/app/AppOpsManagerInternal;
 Landroid/app/Application$ActivityLifecycleCallbacks;
@@ -45360,6 +40919,8 @@
 Landroid/app/ApplicationErrorReport$ParcelableCrashInfo;
 Landroid/app/ApplicationErrorReport$RunningServiceInfo;
 Landroid/app/ApplicationErrorReport;
+Landroid/app/ApplicationExitInfo$1;
+Landroid/app/ApplicationExitInfo;
 Landroid/app/ApplicationLoaders$CachedClassLoader;
 Landroid/app/ApplicationLoaders;
 Landroid/app/ApplicationPackageManager$1;
@@ -45394,6 +40955,7 @@
 Landroid/app/DownloadManager$Query;
 Landroid/app/DownloadManager$Request;
 Landroid/app/DownloadManager;
+Landroid/app/DreamManager;
 Landroid/app/EnterTransitionCoordinator;
 Landroid/app/EventLogTags;
 Landroid/app/ExitTransitionCoordinator;
@@ -45486,6 +41048,7 @@
 Landroid/app/ITransientNotification$Stub$Proxy;
 Landroid/app/ITransientNotification$Stub;
 Landroid/app/ITransientNotification;
+Landroid/app/ITransientNotificationCallback$Stub$Proxy;
 Landroid/app/ITransientNotificationCallback$Stub;
 Landroid/app/ITransientNotificationCallback;
 Landroid/app/IUiAutomationConnection$Stub$Proxy;
@@ -45547,6 +41110,7 @@
 Landroid/app/Notification$BigPictureStyle;
 Landroid/app/Notification$BigTextStyle;
 Landroid/app/Notification$BubbleMetadata$1;
+Landroid/app/Notification$BubbleMetadata$Builder;
 Landroid/app/Notification$BubbleMetadata;
 Landroid/app/Notification$Builder;
 Landroid/app/Notification$BuilderRemoteViews;
@@ -45593,8 +41157,10 @@
 Landroid/app/ProcessMemoryState;
 Landroid/app/ProfilerInfo$1;
 Landroid/app/ProfilerInfo;
+Landroid/app/ProgressDialog$1;
 Landroid/app/ProgressDialog;
 Landroid/app/PropertyInvalidatedCache$1;
+Landroid/app/PropertyInvalidatedCache$NoPreloadHolder;
 Landroid/app/PropertyInvalidatedCache;
 Landroid/app/QueuedWork$QueuedWorkHandler;
 Landroid/app/QueuedWork;
@@ -45604,6 +41170,7 @@
 Landroid/app/RemoteInput$1;
 Landroid/app/RemoteInput$Builder;
 Landroid/app/RemoteInput;
+Landroid/app/RemoteInputHistoryItem$1;
 Landroid/app/RemoteInputHistoryItem;
 Landroid/app/RemoteServiceException;
 Landroid/app/ResourcesManager$1;
@@ -45613,6 +41180,7 @@
 Landroid/app/ResourcesManager;
 Landroid/app/ResultInfo$1;
 Landroid/app/ResultInfo;
+Landroid/app/RuntimeAppOpAccessMessage;
 Landroid/app/SearchDialog;
 Landroid/app/SearchManager;
 Landroid/app/SearchableInfo$1;
@@ -45632,9 +41200,10 @@
 Landroid/app/SharedPreferencesImpl$MemoryCommitResult;
 Landroid/app/SharedPreferencesImpl;
 Landroid/app/StatsManager$StatsUnavailableException;
-Landroid/app/StatsManager$StatsdDeathRecipient;
 Landroid/app/StatsManager;
 Landroid/app/StatusBarManager;
+Landroid/app/SyncNotedAppOp$1;
+Landroid/app/SyncNotedAppOp;
 Landroid/app/SynchronousUserSwitchObserver;
 Landroid/app/SystemServiceRegistry$100;
 Landroid/app/SystemServiceRegistry$101;
@@ -45660,6 +41229,7 @@
 Landroid/app/SystemServiceRegistry$11;
 Landroid/app/SystemServiceRegistry$120;
 Landroid/app/SystemServiceRegistry$121;
+Landroid/app/SystemServiceRegistry$122;
 Landroid/app/SystemServiceRegistry$12;
 Landroid/app/SystemServiceRegistry$13;
 Landroid/app/SystemServiceRegistry$14;
@@ -45806,6 +41376,7 @@
 Landroid/app/admin/DevicePolicyManagerInternal$OnCrossProfileWidgetProvidersChangeListener;
 Landroid/app/admin/DevicePolicyManagerInternal;
 Landroid/app/admin/DeviceStateCache;
+Landroid/app/admin/FactoryResetProtectionPolicy$1;
 Landroid/app/admin/FactoryResetProtectionPolicy;
 Landroid/app/admin/IDeviceAdminService$Stub$Proxy;
 Landroid/app/admin/IDeviceAdminService$Stub;
@@ -45813,6 +41384,9 @@
 Landroid/app/admin/IDevicePolicyManager$Stub$Proxy;
 Landroid/app/admin/IDevicePolicyManager$Stub;
 Landroid/app/admin/IDevicePolicyManager;
+Landroid/app/admin/IKeyguardCallback$Stub;
+Landroid/app/admin/IKeyguardCallback;
+Landroid/app/admin/NetworkEvent$1;
 Landroid/app/admin/NetworkEvent;
 Landroid/app/admin/PasswordMetrics$1;
 Landroid/app/admin/PasswordMetrics$ComplexityBucket$1;
@@ -45896,20 +41470,26 @@
 Landroid/app/backup/RestoreDescription;
 Landroid/app/backup/SharedPreferencesBackupHelper;
 Landroid/app/blob/-$$Lambda$BlobStoreManagerFrameworkInitializer$WjSRSHMmxWPF4Fq-7TpX23MBh2U;
+Landroid/app/blob/BlobHandle$1;
 Landroid/app/blob/BlobHandle;
 Landroid/app/blob/BlobStoreManager;
 Landroid/app/blob/BlobStoreManagerFrameworkInitializer;
 Landroid/app/blob/IBlobStoreManager$Stub;
 Landroid/app/blob/IBlobStoreManager;
 Landroid/app/blob/IBlobStoreSession;
+Landroid/app/blob/LeaseInfo;
+Landroid/app/contentsuggestions/ClassificationsRequest$1;
 Landroid/app/contentsuggestions/ClassificationsRequest;
 Landroid/app/contentsuggestions/ContentSuggestionsManager;
+Landroid/app/contentsuggestions/IClassificationsCallback$Stub$Proxy;
 Landroid/app/contentsuggestions/IClassificationsCallback$Stub;
 Landroid/app/contentsuggestions/IClassificationsCallback;
 Landroid/app/contentsuggestions/IContentSuggestionsManager$Stub;
 Landroid/app/contentsuggestions/IContentSuggestionsManager;
+Landroid/app/contentsuggestions/ISelectionsCallback$Stub$Proxy;
 Landroid/app/contentsuggestions/ISelectionsCallback$Stub;
 Landroid/app/contentsuggestions/ISelectionsCallback;
+Landroid/app/contentsuggestions/SelectionsRequest$1;
 Landroid/app/contentsuggestions/SelectionsRequest;
 Landroid/app/job/-$$Lambda$FpGlzN9oJcl8o5soW-gU-DyTvXM;
 Landroid/app/job/-$$Lambda$JobSchedulerFrameworkInitializer$PtYe8PQc1PVJQXRnpm3iSxcWTR0;
@@ -46011,6 +41591,8 @@
 Landroid/app/servertransaction/PipModeChangeItem;
 Landroid/app/servertransaction/ResumeActivityItem$1;
 Landroid/app/servertransaction/ResumeActivityItem;
+Landroid/app/servertransaction/StartActivityItem$1;
+Landroid/app/servertransaction/StartActivityItem;
 Landroid/app/servertransaction/StopActivityItem$1;
 Landroid/app/servertransaction/StopActivityItem;
 Landroid/app/servertransaction/TopResumedActivityChangeItem$1;
@@ -46035,16 +41617,21 @@
 Landroid/app/timedetector/ITimeDetectorService;
 Landroid/app/timedetector/ManualTimeSuggestion$1;
 Landroid/app/timedetector/ManualTimeSuggestion;
+Landroid/app/timedetector/NetworkTimeSuggestion$1;
 Landroid/app/timedetector/NetworkTimeSuggestion;
 Landroid/app/timedetector/PhoneTimeSuggestion$1;
 Landroid/app/timedetector/PhoneTimeSuggestion;
+Landroid/app/timedetector/TelephonyTimeSuggestion$1;
 Landroid/app/timedetector/TelephonyTimeSuggestion;
 Landroid/app/timedetector/TimeDetector;
+Landroid/app/timedetector/TimeDetectorImpl;
 Landroid/app/timezone/RulesManager;
 Landroid/app/timezonedetector/ITimeZoneDetectorService$Stub$Proxy;
 Landroid/app/timezonedetector/ITimeZoneDetectorService$Stub;
 Landroid/app/timezonedetector/ITimeZoneDetectorService;
+Landroid/app/timezonedetector/ManualTimeZoneSuggestion$1;
 Landroid/app/timezonedetector/ManualTimeZoneSuggestion;
+Landroid/app/timezonedetector/TelephonyTimeZoneSuggestion$1;
 Landroid/app/timezonedetector/TelephonyTimeZoneSuggestion;
 Landroid/app/timezonedetector/TimeZoneDetector;
 Landroid/app/trust/IStrongAuthTracker$Stub$Proxy;
@@ -46105,6 +41692,7 @@
 Landroid/attention/AttentionManagerInternal$AttentionCallbackInternal;
 Landroid/attention/AttentionManagerInternal;
 Landroid/bluetooth/-$$Lambda$BluetoothAdapter$2$INSd_aND-SGWhhPZUtIqya_Uxw4;
+Landroid/bluetooth/-$$Lambda$BluetoothAdapter$5$eKI2JS6EbiGZOGfQ8La27pm0gy0;
 Landroid/bluetooth/BluetoothA2dp$1;
 Landroid/bluetooth/BluetoothA2dp;
 Landroid/bluetooth/BluetoothA2dpSink;
@@ -46125,8 +41713,11 @@
 Landroid/bluetooth/BluetoothCodecStatus;
 Landroid/bluetooth/BluetoothDevice$1;
 Landroid/bluetooth/BluetoothDevice$2;
+Landroid/bluetooth/BluetoothDevice$3;
 Landroid/bluetooth/BluetoothDevice;
+Landroid/bluetooth/BluetoothGatt;
 Landroid/bluetooth/BluetoothGattCallback;
+Landroid/bluetooth/BluetoothGattServer;
 Landroid/bluetooth/BluetoothGattService$1;
 Landroid/bluetooth/BluetoothGattService;
 Landroid/bluetooth/BluetoothHeadset$1;
@@ -46244,6 +41835,7 @@
 Landroid/bluetooth/le/AdvertisingSetParameters$1;
 Landroid/bluetooth/le/AdvertisingSetParameters;
 Landroid/bluetooth/le/BluetoothLeScanner$1;
+Landroid/bluetooth/le/BluetoothLeScanner$BleScanCallbackWrapper$1;
 Landroid/bluetooth/le/BluetoothLeScanner$BleScanCallbackWrapper;
 Landroid/bluetooth/le/BluetoothLeScanner;
 Landroid/bluetooth/le/BluetoothLeUtils;
@@ -46278,9 +41870,12 @@
 Landroid/companion/IFindDeviceCallback$Stub;
 Landroid/companion/IFindDeviceCallback;
 Landroid/compat/Compatibility$Callbacks;
+Landroid/compat/Compatibility$ChangeConfig;
 Landroid/compat/Compatibility;
 Landroid/content/-$$Lambda$AbstractThreadedSyncAdapter$ISyncAdapterImpl$L6ZtOCe8gjKwJj0908ytPlrD8Rc;
 Landroid/content/-$$Lambda$ClipboardManager$1$hQk8olbGAgUi4WWNG4ZuDZsM39s;
+Landroid/content/-$$Lambda$IntentFilter$WX75RVXUnG63zh-f133zF3i8Szs;
+Landroid/content/-$$Lambda$IntentFilter$fvZpjl2C1djVISORSFvcX_-NkJo;
 Landroid/content/AbstractThreadedSyncAdapter$ISyncAdapterImpl;
 Landroid/content/AbstractThreadedSyncAdapter$SyncThread;
 Landroid/content/AbstractThreadedSyncAdapter;
@@ -46333,6 +41928,8 @@
 Landroid/content/ContentResolver$GetTypeResultListener;
 Landroid/content/ContentResolver$OpenResourceIdResult;
 Landroid/content/ContentResolver$ParcelFileDescriptorInner;
+Landroid/content/ContentResolver$ResultListener;
+Landroid/content/ContentResolver$StringResultListener;
 Landroid/content/ContentResolver;
 Landroid/content/ContentUris;
 Landroid/content/ContentValues$1;
@@ -46402,6 +41999,7 @@
 Landroid/content/PeriodicSync;
 Landroid/content/PermissionChecker;
 Landroid/content/ReceiverCallNotAllowedException;
+Landroid/content/RestrictionEntry$1;
 Landroid/content/RestrictionEntry;
 Landroid/content/RestrictionsManager;
 Landroid/content/SearchRecentSuggestionsProvider$DatabaseHelper;
@@ -46436,6 +42034,8 @@
 Landroid/content/UriPermission$1;
 Landroid/content/UriPermission;
 Landroid/content/integrity/AppIntegrityManager;
+Landroid/content/integrity/IAppIntegrityManager$Stub;
+Landroid/content/integrity/IAppIntegrityManager;
 Landroid/content/om/IOverlayManager$Stub$Proxy;
 Landroid/content/om/IOverlayManager$Stub;
 Landroid/content/om/IOverlayManager;
@@ -46443,7 +42043,9 @@
 Landroid/content/om/OverlayInfo;
 Landroid/content/om/OverlayManager;
 Landroid/content/om/OverlayableInfo;
+Landroid/content/pm/-$$Lambda$ApplicationInfo$1$FDtFc-prTtONpy6YSScuAiML69E;
 Landroid/content/pm/-$$Lambda$B12dZLpdwpXn89QSesmkaZjD72Q;
+Landroid/content/pm/-$$Lambda$IPackageManager$Stub$Proxy$X2I1qlX4SiKMZSjDTNzS_nTibbo;
 Landroid/content/pm/-$$Lambda$IPackageManager$Stub$ZVp6oEh-Gn_bn8lM7TgSgpaGriw;
 Landroid/content/pm/-$$Lambda$PackageParser$0DZRgzfgaIMpCOhJqjw6PUiU5vw;
 Landroid/content/pm/-$$Lambda$PackageParser$0aobsT7Zf7WVZCqMZ5z2clAuQf4;
@@ -46470,18 +42072,22 @@
 Landroid/content/pm/CrossProfileApps;
 Landroid/content/pm/DataLoaderManager;
 Landroid/content/pm/DataLoaderParams;
+Landroid/content/pm/DataLoaderParamsParcel$1;
 Landroid/content/pm/DataLoaderParamsParcel;
 Landroid/content/pm/FallbackCategoryProvider;
 Landroid/content/pm/FeatureGroupInfo$1;
 Landroid/content/pm/FeatureGroupInfo;
 Landroid/content/pm/FeatureInfo$1;
 Landroid/content/pm/FeatureInfo;
+Landroid/content/pm/FileSystemControlParcel;
 Landroid/content/pm/ICrossProfileApps$Stub$Proxy;
 Landroid/content/pm/ICrossProfileApps$Stub;
 Landroid/content/pm/ICrossProfileApps;
 Landroid/content/pm/IDataLoader;
+Landroid/content/pm/IDataLoaderManager$Stub$Proxy;
 Landroid/content/pm/IDataLoaderManager$Stub;
 Landroid/content/pm/IDataLoaderManager;
+Landroid/content/pm/IDataLoaderStatusListener$Stub$Proxy;
 Landroid/content/pm/IDataLoaderStatusListener$Stub;
 Landroid/content/pm/IDataLoaderStatusListener;
 Landroid/content/pm/IDexModuleRegisterCallback$Stub$Proxy;
@@ -46526,6 +42132,7 @@
 Landroid/content/pm/IPackageStatsObserver$Stub$Proxy;
 Landroid/content/pm/IPackageStatsObserver$Stub;
 Landroid/content/pm/IPackageStatsObserver;
+Landroid/content/pm/IShortcutChangeCallback$Stub$Proxy;
 Landroid/content/pm/IShortcutChangeCallback$Stub;
 Landroid/content/pm/IShortcutChangeCallback;
 Landroid/content/pm/IShortcutService$Stub$Proxy;
@@ -46536,6 +42143,7 @@
 Landroid/content/pm/InstantAppIntentFilter$1;
 Landroid/content/pm/InstantAppIntentFilter;
 Landroid/content/pm/InstantAppRequest;
+Landroid/content/pm/InstantAppRequestInfo$1;
 Landroid/content/pm/InstantAppRequestInfo;
 Landroid/content/pm/InstantAppResolveInfo$1;
 Landroid/content/pm/InstantAppResolveInfo$InstantAppDigest$1;
@@ -46571,8 +42179,13 @@
 Landroid/content/pm/PackageInstaller$SessionParams;
 Landroid/content/pm/PackageInstaller;
 Landroid/content/pm/PackageItemInfo;
+Landroid/content/pm/PackageManager$1;
+Landroid/content/pm/PackageManager$2;
+Landroid/content/pm/PackageManager$ApplicationInfoQuery;
+Landroid/content/pm/PackageManager$MoveCallback;
 Landroid/content/pm/PackageManager$NameNotFoundException;
 Landroid/content/pm/PackageManager$OnPermissionsChangedListener;
+Landroid/content/pm/PackageManager$PackageInfoQuery;
 Landroid/content/pm/PackageManager;
 Landroid/content/pm/PackageParser$1;
 Landroid/content/pm/PackageParser$Activity$1;
@@ -46626,6 +42239,8 @@
 Landroid/content/pm/PermissionInfo;
 Landroid/content/pm/ProviderInfo$1;
 Landroid/content/pm/ProviderInfo;
+Landroid/content/pm/ProviderInfoList$1;
+Landroid/content/pm/ProviderInfoList;
 Landroid/content/pm/RegisteredServicesCache$1;
 Landroid/content/pm/RegisteredServicesCache$2;
 Landroid/content/pm/RegisteredServicesCache$3;
@@ -46715,6 +42330,8 @@
 Landroid/content/pm/parsing/ParsedPackage$PackageSettingCallback;
 Landroid/content/pm/parsing/ParsedPackage;
 Landroid/content/pm/parsing/ParsingPackage;
+Landroid/content/pm/parsing/ParsingPackageRead;
+Landroid/content/pm/parsing/ParsingPackageUtils;
 Landroid/content/pm/parsing/library/-$$Lambda$WrPVuoVJehE45tfhLfe_8Tcc-Nw;
 Landroid/content/pm/parsing/library/AndroidHidlUpdater;
 Landroid/content/pm/parsing/library/AndroidTestBaseUpdater;
@@ -46765,6 +42382,7 @@
 Landroid/content/res/ObbInfo;
 Landroid/content/res/ObbScanner;
 Landroid/content/res/ResourceId;
+Landroid/content/res/Resources$AssetManagerUpdateHandler;
 Landroid/content/res/Resources$NotFoundException;
 Landroid/content/res/Resources$Theme;
 Landroid/content/res/Resources$ThemeKey;
@@ -46790,7 +42408,9 @@
 Landroid/content/rollback/IRollbackManager$Stub;
 Landroid/content/rollback/IRollbackManager;
 Landroid/content/rollback/RollbackManager;
+Landroid/content/type/-$$Lambda$DefaultMimeMapFactory$3biOnZOOEGRoeaFehYke-eZnpCg;
 Landroid/content/type/DefaultMimeMapFactory;
+Landroid/database/-$$Lambda$ContentObserver$MgqiYb2qvgLhoXTioYXq9MvvpNk;
 Landroid/database/AbstractCursor$SelfContentObserver;
 Landroid/database/AbstractCursor;
 Landroid/database/AbstractWindowedCursor;
@@ -46912,6 +42532,7 @@
 Landroid/graphics/-$$Lambda$ColorSpace$Rgb$bWzafC8vMHNuVmRuTUPEFUMlfuY;
 Landroid/graphics/-$$Lambda$ColorSpace$Rgb$iMkODTKa3_8kPZUnZZerD2Lv-yo;
 Landroid/graphics/-$$Lambda$ColorSpace$S2rlqJvkXGTpUF6mZhvkElds8JE;
+Landroid/graphics/-$$Lambda$HardwareRendererObserver$Z08IFApIdHoCBfw8BsQ-lVjpUlI;
 Landroid/graphics/BLASTBufferQueue;
 Landroid/graphics/BaseCanvas;
 Landroid/graphics/BaseRecordingCanvas;
@@ -46978,6 +42599,7 @@
 Landroid/graphics/ImageDecoder$OnHeaderDecodedListener;
 Landroid/graphics/ImageDecoder$Source;
 Landroid/graphics/ImageDecoder;
+Landroid/graphics/ImageFormat;
 Landroid/graphics/Insets$1;
 Landroid/graphics/Insets;
 Landroid/graphics/Interpolator$Result;
@@ -47053,8 +42675,12 @@
 Landroid/graphics/Typeface;
 Landroid/graphics/Xfermode;
 Landroid/graphics/YuvImage;
+Landroid/graphics/animation/-$$Lambda$awqPSgriNRe12PWP0zkpAtPsfV4;
+Landroid/graphics/animation/FallbackLUTInterpolator;
+Landroid/graphics/animation/HasNativeInterpolator;
 Landroid/graphics/animation/NativeInterpolator;
 Landroid/graphics/animation/NativeInterpolatorFactory;
+Landroid/graphics/animation/RenderNodeAnimator$DelayedAnimationHelper;
 Landroid/graphics/animation/RenderNodeAnimator$ViewListener;
 Landroid/graphics/animation/RenderNodeAnimator;
 Landroid/graphics/drawable/-$$Lambda$AnimatedVectorDrawable$VectorDrawableAnimatorRT$PzjgSeyQweoFjbEZJP80UteZqm8;
@@ -47199,6 +42825,7 @@
 Landroid/graphics/text/LineBreaker;
 Landroid/graphics/text/MeasuredText$Builder;
 Landroid/graphics/text/MeasuredText;
+Landroid/gsi/AvbPublicKey;
 Landroid/gsi/GsiProgress$1;
 Landroid/gsi/GsiProgress;
 Landroid/gsi/IGsiService$Stub$Proxy;
@@ -47270,6 +42897,7 @@
 Landroid/hardware/biometrics/IBiometricEnabledOnKeyguardCallback$Stub$Proxy;
 Landroid/hardware/biometrics/IBiometricEnabledOnKeyguardCallback$Stub;
 Landroid/hardware/biometrics/IBiometricEnabledOnKeyguardCallback;
+Landroid/hardware/biometrics/IBiometricNativeHandle$1;
 Landroid/hardware/biometrics/IBiometricNativeHandle;
 Landroid/hardware/biometrics/IBiometricService$Stub$Proxy;
 Landroid/hardware/biometrics/IBiometricService$Stub;
@@ -47298,6 +42926,10 @@
 Landroid/hardware/camera2/CameraManager$AvailabilityCallback;
 Landroid/hardware/camera2/CameraManager$CameraManagerGlobal$1;
 Landroid/hardware/camera2/CameraManager$CameraManagerGlobal$3;
+Landroid/hardware/camera2/CameraManager$CameraManagerGlobal$4;
+Landroid/hardware/camera2/CameraManager$CameraManagerGlobal$5;
+Landroid/hardware/camera2/CameraManager$CameraManagerGlobal$6;
+Landroid/hardware/camera2/CameraManager$CameraManagerGlobal$7;
 Landroid/hardware/camera2/CameraManager$CameraManagerGlobal;
 Landroid/hardware/camera2/CameraManager$TorchCallback;
 Landroid/hardware/camera2/CameraManager;
@@ -47373,7 +43005,9 @@
 Landroid/hardware/camera2/marshal/impl/MarshalQueryableSize$MarshalerSize;
 Landroid/hardware/camera2/marshal/impl/MarshalQueryableSize;
 Landroid/hardware/camera2/marshal/impl/MarshalQueryableSizeF;
+Landroid/hardware/camera2/marshal/impl/MarshalQueryableStreamConfiguration$MarshalerStreamConfiguration;
 Landroid/hardware/camera2/marshal/impl/MarshalQueryableStreamConfiguration;
+Landroid/hardware/camera2/marshal/impl/MarshalQueryableStreamConfigurationDuration$MarshalerStreamConfigurationDuration;
 Landroid/hardware/camera2/marshal/impl/MarshalQueryableStreamConfigurationDuration;
 Landroid/hardware/camera2/marshal/impl/MarshalQueryableString;
 Landroid/hardware/camera2/params/BlackLevelPattern;
@@ -47397,6 +43031,7 @@
 Landroid/hardware/camera2/params/StreamConfigurationMap;
 Landroid/hardware/camera2/params/TonemapCurve;
 Landroid/hardware/camera2/utils/ArrayUtils;
+Landroid/hardware/camera2/utils/ConcurrentCameraIdCombination$1;
 Landroid/hardware/camera2/utils/ConcurrentCameraIdCombination;
 Landroid/hardware/camera2/utils/TypeReference$SpecializedBaseTypeReference;
 Landroid/hardware/camera2/utils/TypeReference$SpecializedTypeReference;
@@ -47435,6 +43070,7 @@
 Landroid/hardware/display/DeviceProductInfo;
 Landroid/hardware/display/DisplayManager$DisplayListener;
 Landroid/hardware/display/DisplayManager;
+Landroid/hardware/display/DisplayManagerGlobal$1;
 Landroid/hardware/display/DisplayManagerGlobal$DisplayListenerDelegate;
 Landroid/hardware/display/DisplayManagerGlobal$DisplayManagerCallback;
 Landroid/hardware/display/DisplayManagerGlobal;
@@ -47473,6 +43109,7 @@
 Landroid/hardware/face/FaceManager$AuthenticationCallback;
 Landroid/hardware/face/FaceManager$AuthenticationResult;
 Landroid/hardware/face/FaceManager$EnrollmentCallback;
+Landroid/hardware/face/FaceManager$LockoutResetCallback;
 Landroid/hardware/face/FaceManager$MyHandler;
 Landroid/hardware/face/FaceManager$OnAuthenticationCancelListener;
 Landroid/hardware/face/FaceManager$RemovalCallback;
@@ -47487,6 +43124,8 @@
 Landroid/hardware/fingerprint/Fingerprint;
 Landroid/hardware/fingerprint/FingerprintManager$1;
 Landroid/hardware/fingerprint/FingerprintManager$2;
+Landroid/hardware/fingerprint/FingerprintManager$AuthenticationCallback;
+Landroid/hardware/fingerprint/FingerprintManager$LockoutResetCallback;
 Landroid/hardware/fingerprint/FingerprintManager$MyHandler;
 Landroid/hardware/fingerprint/FingerprintManager;
 Landroid/hardware/fingerprint/IFingerprintClientActiveCallback$Stub$Proxy;
@@ -47523,6 +43162,8 @@
 Landroid/hardware/input/TouchCalibration;
 Landroid/hardware/iris/IrisManager;
 Landroid/hardware/lights/LightsManager;
+Landroid/hardware/location/-$$Lambda$ContextHubManager$3$5yx25kUuvL9qy3uBcIzI3sQQoL8;
+Landroid/hardware/location/-$$Lambda$ContextHubManager$3$KgVQePwT_QpjU9EQTp2L3LsHE5Y;
 Landroid/hardware/location/-$$Lambda$ContextHubManager$3$U9x_HK_GdADIEQ3mS5mDWMNWMu8;
 Landroid/hardware/location/-$$Lambda$ContextHubManager$4$sylEfC1Rx_cxuQRnKuthZXmV8KI;
 Landroid/hardware/location/-$$Lambda$ContextHubTransaction$7a5H6DrY_dOy9M3qnYHhlmDHRNQ;
@@ -47789,10 +43430,13 @@
 Landroid/hardware/radio/deprecated/V1_0/IOemHookResponse$Stub;
 Landroid/hardware/radio/deprecated/V1_0/IOemHookResponse;
 Landroid/hardware/sidekick/SidekickInternal;
+Landroid/hardware/soundtrigger/-$$Lambda$SoundTrigger$ZVJnEi-r8cH99VNOx-TiaTkEQgo;
 Landroid/hardware/soundtrigger/ConversionUtil;
 Landroid/hardware/soundtrigger/IRecognitionStatusCallback$Stub$Proxy;
 Landroid/hardware/soundtrigger/IRecognitionStatusCallback$Stub;
 Landroid/hardware/soundtrigger/IRecognitionStatusCallback;
+Landroid/hardware/soundtrigger/KeyphraseEnrollmentInfo;
+Landroid/hardware/soundtrigger/KeyphraseMetadata$1;
 Landroid/hardware/soundtrigger/KeyphraseMetadata;
 Landroid/hardware/soundtrigger/SoundTrigger$ConfidenceLevel$1;
 Landroid/hardware/soundtrigger/SoundTrigger$ConfidenceLevel;
@@ -47821,6 +43465,7 @@
 Landroid/hardware/soundtrigger/SoundTrigger$SoundModelEvent;
 Landroid/hardware/soundtrigger/SoundTrigger$StatusListener;
 Landroid/hardware/soundtrigger/SoundTrigger;
+Landroid/hardware/soundtrigger/SoundTriggerModule$EventHandlerDelegate$1;
 Landroid/hardware/soundtrigger/SoundTriggerModule$EventHandlerDelegate;
 Landroid/hardware/soundtrigger/SoundTriggerModule;
 Landroid/hardware/thermal/V1_0/IThermal;
@@ -47850,6 +43495,7 @@
 Landroid/hardware/usb/UsbDevice$Builder;
 Landroid/hardware/usb/UsbDevice;
 Landroid/hardware/usb/UsbDeviceConnection;
+Landroid/hardware/usb/UsbInterface$1;
 Landroid/hardware/usb/UsbInterface;
 Landroid/hardware/usb/UsbManager;
 Landroid/hardware/usb/UsbPort;
@@ -47883,6 +43529,7 @@
 Landroid/icu/impl/CurrencyData$CurrencySpacingInfo;
 Landroid/icu/impl/CurrencyData;
 Landroid/icu/impl/DateNumberFormat;
+Landroid/icu/impl/DontCareFieldPosition;
 Landroid/icu/impl/FormattedStringBuilder;
 Landroid/icu/impl/FormattedValueStringBuilderImpl$NullField;
 Landroid/icu/impl/FormattedValueStringBuilderImpl;
@@ -47943,6 +43590,7 @@
 Landroid/icu/impl/ICUResourceBundleReader$ResourceCache;
 Landroid/icu/impl/ICUResourceBundleReader$Table1632;
 Landroid/icu/impl/ICUResourceBundleReader$Table16;
+Landroid/icu/impl/ICUResourceBundleReader$Table32;
 Landroid/icu/impl/ICUResourceBundleReader$Table;
 Landroid/icu/impl/ICUResourceBundleReader;
 Landroid/icu/impl/ICUService$CacheEntry;
@@ -47989,6 +43637,7 @@
 Landroid/icu/impl/StaticUnicodeSets$ParseDataSink;
 Landroid/icu/impl/StaticUnicodeSets;
 Landroid/icu/impl/StringPrepDataReader;
+Landroid/icu/impl/StringRange$1;
 Landroid/icu/impl/StringRange;
 Landroid/icu/impl/StringSegment;
 Landroid/icu/impl/TextTrieMap$Node;
@@ -48021,7 +43670,9 @@
 Landroid/icu/impl/UCaseProps$IsAcceptable;
 Landroid/icu/impl/UCaseProps$LatinCase;
 Landroid/icu/impl/UCaseProps;
+Landroid/icu/impl/UCharacterName$AlgorithmName;
 Landroid/icu/impl/UCharacterName;
+Landroid/icu/impl/UCharacterNameReader;
 Landroid/icu/impl/UCharacterProperty$10;
 Landroid/icu/impl/UCharacterProperty$11;
 Landroid/icu/impl/UCharacterProperty$12;
@@ -48184,6 +43835,7 @@
 Landroid/icu/number/Precision;
 Landroid/icu/number/Scale;
 Landroid/icu/number/ScientificNotation;
+Landroid/icu/number/SimpleNotation;
 Landroid/icu/number/UnlocalizedNumberFormatter;
 Landroid/icu/text/AlphabeticIndex$1;
 Landroid/icu/text/AlphabeticIndex$Bucket;
@@ -48211,6 +43863,7 @@
 Landroid/icu/text/CollatorServiceShim$CService$1CollatorFactory;
 Landroid/icu/text/CollatorServiceShim$CService;
 Landroid/icu/text/CollatorServiceShim;
+Landroid/icu/text/CompactDecimalFormat$CompactStyle;
 Landroid/icu/text/ConstrainedFieldPosition$1;
 Landroid/icu/text/ConstrainedFieldPosition$ConstraintType;
 Landroid/icu/text/ConstrainedFieldPosition;
@@ -48269,6 +43922,7 @@
 Landroid/icu/text/FormattedValue;
 Landroid/icu/text/IDNA;
 Landroid/icu/text/LanguageBreakEngine;
+Landroid/icu/text/ListFormatter$Style;
 Landroid/icu/text/LowercaseTransliterator$1;
 Landroid/icu/text/LowercaseTransliterator;
 Landroid/icu/text/MeasureFormat$FormatWidth;
@@ -48484,12 +44138,16 @@
 Landroid/internal/telephony/sysprop/TelephonyProperties;
 Landroid/location/-$$Lambda$-z-Hjl12STdAybauR3BT-ftvWd0;
 Landroid/location/-$$Lambda$AbstractListenerManager$Registration$TnkXgyOd99JHl00GzK6Oay_sYms;
+Landroid/location/-$$Lambda$AbstractListenerManager$Registration$XpiThbVaDDpOnFWIkrt38Bf4yx0;
 Landroid/location/-$$Lambda$GpsStatus$RTSonBp9m0T0NWA3SCfYgWf1mTo;
 Landroid/location/-$$Lambda$LocationManager$GnssStatusListenerManager$GnssStatusListener$4EPi22o4xuVnpNhFHnDvebH4TG8;
 Landroid/location/-$$Lambda$LocationManager$GnssStatusListenerManager$GnssStatusListener$7Fi5XkeF81eL_OKPS2GJMvyc3-8;
 Landroid/location/-$$Lambda$LocationManager$GnssStatusListenerManager$GnssStatusListener$gYcH61KCtV_OcJJszI1TfvnrJHY;
+Landroid/location/-$$Lambda$LocationManager$LocationListenerTransport$C3xaM63A8GAwfJNN4R634OLsvDc;
 Landroid/location/-$$Lambda$LocationManager$LocationListenerTransport$JzcdERl3Ha8sYr9NxFhb3gNOoCM;
 Landroid/location/-$$Lambda$LocationManager$LocationListenerTransport$OaIkiu4R0h4pgFbCDDlNkbmPaps;
+Landroid/location/-$$Lambda$LocationManager$LocationListenerTransport$enkW18B0WwpQkSIMmVChmQ2YwC8;
+Landroid/location/-$$Lambda$LocationManager$LocationListenerTransport$fHjQXipQePznoEyxLuCfUO-YP1Y;
 Landroid/location/-$$Lambda$LocationManager$LocationListenerTransport$vDJFuk-DvyNgQEXUO2Jkf2ZFeE8;
 Landroid/location/-$$Lambda$LocationManager$LocationListenerTransport$vtBApnyHdgybRqRKlCt1NFEyfeQ;
 Landroid/location/-$$Lambda$UmbtQF279SH5h72Ftfcj_s96jsY;
@@ -48523,6 +44181,7 @@
 Landroid/location/GnssNavigationMessage;
 Landroid/location/GnssReflectingPlane$1;
 Landroid/location/GnssReflectingPlane;
+Landroid/location/GnssRequest$1;
 Landroid/location/GnssRequest;
 Landroid/location/GnssSingleSatCorrection$1;
 Landroid/location/GnssSingleSatCorrection;
@@ -48550,6 +44209,7 @@
 Landroid/location/IGeofenceProvider$Stub$Proxy;
 Landroid/location/IGeofenceProvider$Stub;
 Landroid/location/IGeofenceProvider;
+Landroid/location/IGnssAntennaInfoListener$Stub$Proxy;
 Landroid/location/IGnssAntennaInfoListener$Stub;
 Landroid/location/IGnssAntennaInfoListener;
 Landroid/location/IGnssMeasurementsListener$Stub$Proxy;
@@ -48577,6 +44237,7 @@
 Landroid/location/Location$BearingDistanceCache;
 Landroid/location/Location;
 Landroid/location/LocationListener;
+Landroid/location/LocationManager$1;
 Landroid/location/LocationManager$BatchedLocationCallbackManager;
 Landroid/location/LocationManager$GnssAntennaInfoListenerManager;
 Landroid/location/LocationManager$GnssMeasurementsListenerManager;
@@ -48597,6 +44258,9 @@
 Landroid/media/-$$Lambda$MediaDrm$8rRollK1F3eENvuaBGoS8u_-heQ;
 Landroid/media/-$$Lambda$MediaDrm$IvEWhXQgSYABwC6_1bdnhTJ4V2I;
 Landroid/media/-$$Lambda$MediaDrm$UPVWCanGo24eu9-1S_t6PvJ1Zno;
+Landroid/media/-$$Lambda$ThumbnailUtils$HhGKNQZck57eO__Paj6KyQm6lCk;
+Landroid/media/-$$Lambda$ThumbnailUtils$P13h9YbyD69p6ss1gYpoef43_MU;
+Landroid/media/-$$Lambda$ThumbnailUtils$qOH5vebuTwPi2G92PTa6rgwKGoc;
 Landroid/media/AudioAttributes$1;
 Landroid/media/AudioAttributes$Builder;
 Landroid/media/AudioAttributes;
@@ -48704,6 +44368,8 @@
 Landroid/media/IMediaHTTPService;
 Landroid/media/IMediaResourceMonitor$Stub;
 Landroid/media/IMediaResourceMonitor;
+Landroid/media/IMediaRouter2$Stub;
+Landroid/media/IMediaRouter2;
 Landroid/media/IMediaRouter2Client$Stub$Proxy;
 Landroid/media/IMediaRouter2Client$Stub;
 Landroid/media/IMediaRouter2Client;
@@ -48733,6 +44399,7 @@
 Landroid/media/IRingtonePlayer$Stub$Proxy;
 Landroid/media/IRingtonePlayer$Stub;
 Landroid/media/IRingtonePlayer;
+Landroid/media/IStrategyPreferredDeviceDispatcher$Stub$Proxy;
 Landroid/media/IStrategyPreferredDeviceDispatcher$Stub;
 Landroid/media/IStrategyPreferredDeviceDispatcher;
 Landroid/media/IVolumeController$Stub$Proxy;
@@ -48750,13 +44417,16 @@
 Landroid/media/MediaCodec$BufferInfo;
 Landroid/media/MediaCodec$BufferMap$CodecBuffer;
 Landroid/media/MediaCodec$BufferMap;
+Landroid/media/MediaCodec$Callback;
 Landroid/media/MediaCodec$CodecException;
 Landroid/media/MediaCodec$CryptoException;
 Landroid/media/MediaCodec$CryptoInfo$Pattern;
 Landroid/media/MediaCodec$CryptoInfo;
 Landroid/media/MediaCodec$EventHandler;
 Landroid/media/MediaCodec$GraphicBlock;
+Landroid/media/MediaCodec$IncompatibleWithBlockModelException;
 Landroid/media/MediaCodec$LinearBlock;
+Landroid/media/MediaCodec$OnFrameRenderedListener;
 Landroid/media/MediaCodec$OutputFrame;
 Landroid/media/MediaCodec$PersistentSurface;
 Landroid/media/MediaCodec$QueueRequest;
@@ -48788,6 +44458,7 @@
 Landroid/media/MediaDrm;
 Landroid/media/MediaDrmException;
 Landroid/media/MediaExtractor;
+Landroid/media/MediaFile;
 Landroid/media/MediaFormat;
 Landroid/media/MediaHTTPConnection;
 Landroid/media/MediaHTTPService;
@@ -48848,6 +44519,8 @@
 Landroid/media/MediaRouter$VolumeCallbackInfo;
 Landroid/media/MediaRouter$VolumeChangeReceiver;
 Landroid/media/MediaRouter$WifiDisplayStatusChangedReceiver;
+Landroid/media/MediaRouter2Manager$Callback;
+Landroid/media/MediaRouter2Manager;
 Landroid/media/MediaRouter;
 Landroid/media/MediaRouterClientState$1;
 Landroid/media/MediaRouterClientState$RouteInfo$1;
@@ -48881,7 +44554,9 @@
 Landroid/media/Ringtone$MyOnCompletionListener;
 Landroid/media/Ringtone;
 Landroid/media/RingtoneManager;
+Landroid/media/RouteDiscoveryPreference$1;
 Landroid/media/RouteDiscoveryPreference;
+Landroid/media/RoutingSessionInfo$1;
 Landroid/media/RoutingSessionInfo;
 Landroid/media/SoundPool$Builder;
 Landroid/media/SoundPool$EventHandler;
@@ -48895,16 +44570,20 @@
 Landroid/media/SubtitleData;
 Landroid/media/SubtitleTrack;
 Landroid/media/SyncParams;
+Landroid/media/ThumbnailUtils$Resizer;
+Landroid/media/ThumbnailUtils$SizedThumbnailBitmap;
 Landroid/media/ThumbnailUtils;
 Landroid/media/TimedMetaData;
 Landroid/media/TimedText;
 Landroid/media/ToneGenerator;
 Landroid/media/Utils$1;
 Landroid/media/Utils$2;
+Landroid/media/Utils$ListenerList;
 Landroid/media/Utils;
 Landroid/media/VolumeAutomation;
 Landroid/media/VolumePolicy$1;
 Landroid/media/VolumePolicy;
+Landroid/media/VolumeProvider$Callback;
 Landroid/media/VolumeProvider;
 Landroid/media/VolumeShaper$Configuration$1;
 Landroid/media/VolumeShaper$Configuration$Builder;
@@ -48916,6 +44595,7 @@
 Landroid/media/VolumeShaper$State;
 Landroid/media/VolumeShaper;
 Landroid/media/audiofx/AudioEffect$Descriptor;
+Landroid/media/audiofx/AudioEffect;
 Landroid/media/audiopolicy/-$$Lambda$AudioPolicy$-ztOT0FT3tzGMUr4lm1gv6dBE4c;
 Landroid/media/audiopolicy/AudioMix$Builder;
 Landroid/media/audiopolicy/AudioMix;
@@ -48953,10 +44633,13 @@
 Landroid/media/browse/MediaBrowser$SubscriptionCallback;
 Landroid/media/browse/MediaBrowser;
 Landroid/media/browse/MediaBrowserUtils;
+Landroid/media/midi/IMidiDeviceListener$Stub$Proxy;
 Landroid/media/midi/IMidiDeviceListener$Stub;
 Landroid/media/midi/IMidiDeviceListener;
+Landroid/media/midi/IMidiDeviceOpenCallback$Stub$Proxy;
 Landroid/media/midi/IMidiDeviceOpenCallback$Stub;
 Landroid/media/midi/IMidiDeviceOpenCallback;
+Landroid/media/midi/IMidiDeviceServer$Stub$Proxy;
 Landroid/media/midi/IMidiDeviceServer$Stub;
 Landroid/media/midi/IMidiDeviceServer;
 Landroid/media/midi/IMidiManager$Stub;
@@ -48964,6 +44647,7 @@
 Landroid/media/midi/MidiDevice;
 Landroid/media/midi/MidiDeviceInfo$1;
 Landroid/media/midi/MidiDeviceInfo;
+Landroid/media/midi/MidiDeviceStatus$1;
 Landroid/media/midi/MidiDeviceStatus;
 Landroid/media/midi/MidiManager;
 Landroid/media/projection/IMediaProjection$Stub$Proxy;
@@ -48978,14 +44662,17 @@
 Landroid/media/projection/MediaProjection;
 Landroid/media/projection/MediaProjectionInfo$1;
 Landroid/media/projection/MediaProjectionInfo;
+Landroid/media/projection/MediaProjectionManager$Callback;
 Landroid/media/projection/MediaProjectionManager$CallbackDelegate;
 Landroid/media/projection/MediaProjectionManager;
 Landroid/media/session/-$$Lambda$MediaSessionManager$IEuWPZ528guBgmyKPMUWhBwnMCE;
 Landroid/media/session/IActiveSessionsListener$Stub$Proxy;
 Landroid/media/session/IActiveSessionsListener$Stub;
 Landroid/media/session/IActiveSessionsListener;
+Landroid/media/session/IOnMediaKeyEventDispatchedListener$Stub$Proxy;
 Landroid/media/session/IOnMediaKeyEventDispatchedListener$Stub;
 Landroid/media/session/IOnMediaKeyEventDispatchedListener;
+Landroid/media/session/IOnMediaKeyEventSessionChangedListener$Stub$Proxy;
 Landroid/media/session/IOnMediaKeyEventSessionChangedListener$Stub;
 Landroid/media/session/IOnMediaKeyEventSessionChangedListener;
 Landroid/media/session/IOnMediaKeyListener$Stub$Proxy;
@@ -49053,10 +44740,23 @@
 Landroid/media/soundtrigger/ISoundTriggerDetectionServiceClient$Stub;
 Landroid/media/soundtrigger/ISoundTriggerDetectionServiceClient;
 Landroid/media/soundtrigger/SoundTriggerManager;
+Landroid/media/soundtrigger_middleware/ISoundTriggerCallback$Stub$Proxy;
 Landroid/media/soundtrigger_middleware/ISoundTriggerCallback$Stub;
 Landroid/media/soundtrigger_middleware/ISoundTriggerCallback;
+Landroid/media/soundtrigger_middleware/ISoundTriggerMiddlewareService$Stub$Proxy;
+Landroid/media/soundtrigger_middleware/ISoundTriggerMiddlewareService$Stub;
 Landroid/media/soundtrigger_middleware/ISoundTriggerMiddlewareService;
+Landroid/media/soundtrigger_middleware/ISoundTriggerModule$Stub;
 Landroid/media/soundtrigger_middleware/ISoundTriggerModule;
+Landroid/media/soundtrigger_middleware/PhraseRecognitionExtra;
+Landroid/media/soundtrigger_middleware/RecognitionConfig$1;
+Landroid/media/soundtrigger_middleware/RecognitionConfig;
+Landroid/media/soundtrigger_middleware/SoundModel$1;
+Landroid/media/soundtrigger_middleware/SoundModel;
+Landroid/media/soundtrigger_middleware/SoundTriggerModuleDescriptor$1;
+Landroid/media/soundtrigger_middleware/SoundTriggerModuleDescriptor;
+Landroid/media/soundtrigger_middleware/SoundTriggerModuleProperties$1;
+Landroid/media/soundtrigger_middleware/SoundTriggerModuleProperties;
 Landroid/media/tv/TvInputHardwareInfo$Builder;
 Landroid/media/tv/TvInputManager;
 Landroid/media/tv/TvStreamConfig$1;
@@ -49084,7 +44784,6 @@
 Landroid/mtp/MtpStorageManager;
 Landroid/net/-$$Lambda$FpGXkd3pLxeXY58eJ_84mi1PLWQ;
 Landroid/net/-$$Lambda$Network$KD6DxaMRJIcajhj36TU1K7lJnHQ;
-Landroid/net/-$$Lambda$NetworkFactory$HfslgqyaKc_n0wXX5_qRYVZoGfI;
 Landroid/net/-$$Lambda$NetworkScoreManager$NetworkScoreCallbackProxy$PGkg1UrNyisY0wAts4zoVuYRgkw;
 Landroid/net/-$$Lambda$NetworkScoreManager$NetworkScoreCallbackProxy$TEOhIiY2C9y8yDWwRR6zm_12TGY;
 Landroid/net/-$$Lambda$NetworkStats$3raHHJpnJwsEAXnRXF2pK8-UDFY;
@@ -49092,6 +44791,7 @@
 Landroid/net/-$$Lambda$p1_56lwnt1xBuY1muPblbN1Dtkw;
 Landroid/net/CaptivePortal$1;
 Landroid/net/CaptivePortal;
+Landroid/net/CaptivePortalData$1;
 Landroid/net/CaptivePortalData;
 Landroid/net/ConnectionInfo$1;
 Landroid/net/ConnectionInfo;
@@ -49127,6 +44827,7 @@
 Landroid/net/EventLogTags;
 Landroid/net/ICaptivePortal$Stub;
 Landroid/net/ICaptivePortal;
+Landroid/net/IConnectivityDiagnosticsCallback$Stub$Proxy;
 Landroid/net/IConnectivityDiagnosticsCallback$Stub;
 Landroid/net/IConnectivityDiagnosticsCallback;
 Landroid/net/IConnectivityManager$Stub$Proxy;
@@ -49134,6 +44835,7 @@
 Landroid/net/IConnectivityManager;
 Landroid/net/IEthernetManager$Stub;
 Landroid/net/IEthernetManager;
+Landroid/net/IEthernetServiceListener$Stub$Proxy;
 Landroid/net/IEthernetServiceListener$Stub;
 Landroid/net/IEthernetServiceListener;
 Landroid/net/IIpConnectivityMetrics$Stub$Proxy;
@@ -49173,6 +44875,7 @@
 Landroid/net/ISocketKeepaliveCallback;
 Landroid/net/ITestNetworkManager$Stub;
 Landroid/net/ITestNetworkManager;
+Landroid/net/ITetheredInterfaceCallback$Stub$Proxy;
 Landroid/net/ITetheredInterfaceCallback$Stub;
 Landroid/net/ITetheredInterfaceCallback;
 Landroid/net/ITetheringStatsProvider$Stub$Proxy;
@@ -49188,19 +44891,23 @@
 Landroid/net/IpPrefix$1;
 Landroid/net/IpPrefix$2;
 Landroid/net/IpPrefix;
+Landroid/net/IpSecConfig$1;
 Landroid/net/IpSecConfig;
 Landroid/net/IpSecManager$SpiUnavailableException;
 Landroid/net/IpSecManager$UdpEncapsulationSocket;
 Landroid/net/IpSecManager;
+Landroid/net/IpSecSpiResponse$1;
 Landroid/net/IpSecSpiResponse;
+Landroid/net/IpSecTransformResponse$1;
 Landroid/net/IpSecTransformResponse;
+Landroid/net/IpSecTunnelInterfaceResponse$1;
 Landroid/net/IpSecTunnelInterfaceResponse;
+Landroid/net/IpSecUdpEncapResponse$1;
 Landroid/net/IpSecUdpEncapResponse;
 Landroid/net/KeepalivePacketData;
 Landroid/net/LinkAddress$1;
 Landroid/net/LinkAddress;
 Landroid/net/LinkProperties$1;
-Landroid/net/LinkProperties$CompareResult;
 Landroid/net/LinkProperties;
 Landroid/net/LocalServerSocket;
 Landroid/net/LocalSocket;
@@ -49217,15 +44924,16 @@
 Landroid/net/Network$1;
 Landroid/net/Network$NetworkBoundSocketFactory;
 Landroid/net/Network;
+Landroid/net/NetworkAgent$InitialConfiguration;
+Landroid/net/NetworkAgent$NetworkAgentHandler;
 Landroid/net/NetworkAgent;
+Landroid/net/NetworkAgentConfig$1;
+Landroid/net/NetworkAgentConfig$Builder;
 Landroid/net/NetworkAgentConfig;
 Landroid/net/NetworkCapabilities$1;
 Landroid/net/NetworkCapabilities$NameOf;
 Landroid/net/NetworkCapabilities;
 Landroid/net/NetworkConfig;
-Landroid/net/NetworkFactory$NetworkRequestInfo;
-Landroid/net/NetworkFactory$SerialNumber;
-Landroid/net/NetworkFactory;
 Landroid/net/NetworkIdentity;
 Landroid/net/NetworkInfo$1;
 Landroid/net/NetworkInfo$DetailedState;
@@ -49240,6 +44948,7 @@
 Landroid/net/NetworkPolicyManager$SubscriptionCallback;
 Landroid/net/NetworkPolicyManager$SubscriptionCallbackProxy;
 Landroid/net/NetworkPolicyManager;
+Landroid/net/NetworkProvider$1;
 Landroid/net/NetworkProvider;
 Landroid/net/NetworkQuotaInfo$1;
 Landroid/net/NetworkQuotaInfo;
@@ -49303,6 +45012,7 @@
 Landroid/net/StringNetworkSpecifier;
 Landroid/net/TcpSocketKeepalive;
 Landroid/net/TelephonyNetworkSpecifier$1;
+Landroid/net/TelephonyNetworkSpecifier$Builder;
 Landroid/net/TelephonyNetworkSpecifier;
 Landroid/net/TestNetworkManager;
 Landroid/net/TrafficStats;
@@ -49366,8 +45076,10 @@
 Landroid/net/metrics/ValidationProbeEvent;
 Landroid/net/metrics/WakeupEvent;
 Landroid/net/metrics/WakeupStats;
+Landroid/net/netstats/provider/INetworkStatsProvider$Stub$Proxy;
 Landroid/net/netstats/provider/INetworkStatsProvider$Stub;
 Landroid/net/netstats/provider/INetworkStatsProvider;
+Landroid/net/netstats/provider/INetworkStatsProviderCallback$Stub;
 Landroid/net/netstats/provider/INetworkStatsProviderCallback;
 Landroid/net/nsd/INsdManager$Stub$Proxy;
 Landroid/net/nsd/INsdManager$Stub;
@@ -49391,6 +45103,7 @@
 Landroid/net/util/-$$Lambda$MultinetworkPolicyTracker$8YMQ0fPTKk7Fw-_gJjln0JT-g8E;
 Landroid/net/util/KeepaliveUtils$KeepaliveDeviceConfigurationException;
 Landroid/net/util/KeepaliveUtils;
+Landroid/net/util/LinkPropertiesUtils$CompareResult;
 Landroid/net/util/LinkPropertiesUtils;
 Landroid/net/util/MacAddressUtils;
 Landroid/net/util/MultinetworkPolicyTracker$1;
@@ -49455,8 +45168,11 @@
 Landroid/nfc/TechListParcel;
 Landroid/nfc/cardemulation/AidGroup$1;
 Landroid/nfc/cardemulation/AidGroup;
+Landroid/nfc/cardemulation/ApduServiceInfo$1;
 Landroid/nfc/cardemulation/ApduServiceInfo;
 Landroid/nfc/cardemulation/CardEmulation;
+Landroid/nfc/cardemulation/HostApduService$MsgHandler;
+Landroid/nfc/cardemulation/HostApduService;
 Landroid/opengl/EGL14;
 Landroid/opengl/EGL15;
 Landroid/opengl/EGLConfig;
@@ -49477,11 +45193,25 @@
 Landroid/opengl/GLES31;
 Landroid/opengl/GLES31Ext;
 Landroid/opengl/GLES32;
+Landroid/opengl/GLSurfaceView$BaseConfigChooser;
+Landroid/opengl/GLSurfaceView$ComponentSizeChooser;
+Landroid/opengl/GLSurfaceView$DefaultContextFactory;
+Landroid/opengl/GLSurfaceView$DefaultWindowSurfaceFactory;
+Landroid/opengl/GLSurfaceView$EGLConfigChooser;
+Landroid/opengl/GLSurfaceView$EGLContextFactory;
 Landroid/opengl/GLSurfaceView$EGLWindowSurfaceFactory;
+Landroid/opengl/GLSurfaceView$EglHelper;
+Landroid/opengl/GLSurfaceView$GLThread;
+Landroid/opengl/GLSurfaceView$GLThreadManager;
+Landroid/opengl/GLSurfaceView$Renderer;
+Landroid/opengl/GLSurfaceView$SimpleEGLConfigChooser;
+Landroid/opengl/GLSurfaceView;
 Landroid/opengl/GLUtils;
 Landroid/opengl/Matrix;
 Landroid/opengl/Visibility;
 Landroid/os/-$$Lambda$Binder$IYUHVkWouPK_9CG2s8VwyWBt5_I;
+Landroid/os/-$$Lambda$Binder$aNRcHb8WfLrWjcSlV42Wu5psFwU;
+Landroid/os/-$$Lambda$Binder$sHSgT14Q7D-inZx204V4-ect-uA;
 Landroid/os/-$$Lambda$Build$WrC6eL7oW2Zm9UDTcXXKr0DnOMw;
 Landroid/os/-$$Lambda$FileUtils$0SBPRWOXcbR9EMG_p-55sUuxJ_0;
 Landroid/os/-$$Lambda$FileUtils$TJeD9NeX5giO-5vlBrurGI-g4IY;
@@ -49585,6 +45315,7 @@
 Landroid/os/Environment$UserEnvironment;
 Landroid/os/Environment;
 Landroid/os/EventLogTags;
+Landroid/os/ExternalVibration$1;
 Landroid/os/ExternalVibration;
 Landroid/os/FactoryTest;
 Landroid/os/FileBridge$FileBridgeOutputStream;
@@ -49604,6 +45335,7 @@
 Landroid/os/HandlerThread;
 Landroid/os/HardwarePropertiesManager;
 Landroid/os/HidlMemory;
+Landroid/os/HidlMemoryUtil;
 Landroid/os/HidlSupport$Mutable;
 Landroid/os/HidlSupport;
 Landroid/os/HwBinder;
@@ -49674,6 +45406,7 @@
 Landroid/os/IPullAtomCallback;
 Landroid/os/IRecoverySystem$Stub;
 Landroid/os/IRecoverySystem;
+Landroid/os/IRecoverySystemProgressListener$Stub$Proxy;
 Landroid/os/IRecoverySystemProgressListener$Stub;
 Landroid/os/IRecoverySystemProgressListener;
 Landroid/os/IRemoteCallback$Stub$Proxy;
@@ -49693,6 +45426,8 @@
 Landroid/os/IStoraged$Stub$Proxy;
 Landroid/os/IStoraged$Stub;
 Landroid/os/IStoraged;
+Landroid/os/ISystemConfig$Stub;
+Landroid/os/ISystemConfig;
 Landroid/os/ISystemUpdateManager$Stub$Proxy;
 Landroid/os/ISystemUpdateManager$Stub;
 Landroid/os/ISystemUpdateManager;
@@ -49721,6 +45456,7 @@
 Landroid/os/IVibratorService$Stub$Proxy;
 Landroid/os/IVibratorService$Stub;
 Landroid/os/IVibratorService;
+Landroid/os/IVibratorStateListener$Stub$Proxy;
 Landroid/os/IVibratorStateListener$Stub;
 Landroid/os/IVibratorStateListener;
 Landroid/os/IVold$Stub$Proxy;
@@ -49756,6 +45492,7 @@
 Landroid/os/Parcel$1;
 Landroid/os/Parcel$2;
 Landroid/os/Parcel$ReadWriteHelper;
+Landroid/os/Parcel$SquashReadHelper;
 Landroid/os/Parcel;
 Landroid/os/ParcelFileDescriptor$1;
 Landroid/os/ParcelFileDescriptor$2;
@@ -49782,6 +45519,8 @@
 Landroid/os/PooledStringReader;
 Landroid/os/PooledStringWriter;
 Landroid/os/PowerManager$1;
+Landroid/os/PowerManager$2;
+Landroid/os/PowerManager$3;
 Landroid/os/PowerManager$OnThermalStatusChangedListener;
 Landroid/os/PowerManager$WakeData;
 Landroid/os/PowerManager$WakeLock$1;
@@ -49880,6 +45619,8 @@
 Landroid/os/Temperature$1;
 Landroid/os/Temperature;
 Landroid/os/ThreadLocalWorkSource;
+Landroid/os/TimestampedValue$1;
+Landroid/os/TimestampedValue;
 Landroid/os/TokenWatcher$1;
 Landroid/os/TokenWatcher$Death;
 Landroid/os/TokenWatcher;
@@ -49906,6 +45647,7 @@
 Landroid/os/VibrationAttributes$Builder;
 Landroid/os/VibrationAttributes;
 Landroid/os/VibrationEffect$1;
+Landroid/os/VibrationEffect$Composed$1;
 Landroid/os/VibrationEffect$Composed;
 Landroid/os/VibrationEffect$OneShot$1;
 Landroid/os/VibrationEffect$OneShot;
@@ -50023,6 +45765,10 @@
 Landroid/permission/IPermissionManager;
 Landroid/permission/PermissionControllerManager$1;
 Landroid/permission/PermissionControllerManager;
+Landroid/permission/PermissionManager$1;
+Landroid/permission/PermissionManager$2;
+Landroid/permission/PermissionManager$PackageNamePermissionQuery;
+Landroid/permission/PermissionManager$PermissionQuery;
 Landroid/permission/PermissionManager$SplitPermissionInfo;
 Landroid/permission/PermissionManager;
 Landroid/permission/PermissionManagerInternal;
@@ -50038,13 +45784,16 @@
 Landroid/preference/PreferenceManager$OnPreferenceTreeClickListener;
 Landroid/preference/PreferenceManager;
 Landroid/preference/PreferenceScreen;
+Landroid/print/IPrintDocumentAdapter$Stub$Proxy;
 Landroid/print/IPrintDocumentAdapter$Stub;
 Landroid/print/IPrintDocumentAdapter;
+Landroid/print/IPrintJobStateChangeListener$Stub$Proxy;
 Landroid/print/IPrintJobStateChangeListener$Stub;
 Landroid/print/IPrintJobStateChangeListener;
 Landroid/print/IPrintManager$Stub$Proxy;
 Landroid/print/IPrintManager$Stub;
 Landroid/print/IPrintManager;
+Landroid/print/IPrintServicesChangeListener$Stub$Proxy;
 Landroid/print/IPrintServicesChangeListener$Stub;
 Landroid/print/IPrintServicesChangeListener;
 Landroid/print/IPrintSpooler$Stub$Proxy;
@@ -50054,20 +45803,25 @@
 Landroid/print/IPrintSpoolerCallbacks;
 Landroid/print/IPrintSpoolerClient$Stub;
 Landroid/print/IPrintSpoolerClient;
+Landroid/print/IPrinterDiscoveryObserver$Stub$Proxy;
 Landroid/print/IPrinterDiscoveryObserver$Stub;
 Landroid/print/IPrinterDiscoveryObserver;
+Landroid/print/PrintAttributes$1;
 Landroid/print/PrintAttributes;
 Landroid/print/PrintDocumentAdapter;
+Landroid/print/PrintJobId$1;
 Landroid/print/PrintJobId;
 Landroid/print/PrintJobInfo$1;
 Landroid/print/PrintJobInfo;
 Landroid/print/PrintManager$1;
 Landroid/print/PrintManager;
+Landroid/print/PrinterId$1;
 Landroid/print/PrinterId;
 Landroid/printservice/IPrintServiceClient$Stub;
 Landroid/printservice/IPrintServiceClient;
 Landroid/printservice/PrintServiceInfo$1;
 Landroid/printservice/PrintServiceInfo;
+Landroid/printservice/recommendation/IRecommendationsChangeListener$Stub$Proxy;
 Landroid/printservice/recommendation/IRecommendationsChangeListener$Stub;
 Landroid/printservice/recommendation/IRecommendationsChangeListener;
 Landroid/privacy/DifferentialPrivacyConfig;
@@ -50102,7 +45856,10 @@
 Landroid/provider/ContactsContract$CommonDataKinds$Callable;
 Landroid/provider/ContactsContract$CommonDataKinds$CommonColumns;
 Landroid/provider/ContactsContract$CommonDataKinds$Email;
+Landroid/provider/ContactsContract$CommonDataKinds$Event;
+Landroid/provider/ContactsContract$CommonDataKinds$Im;
 Landroid/provider/ContactsContract$CommonDataKinds$Phone;
+Landroid/provider/ContactsContract$CommonDataKinds$Relation;
 Landroid/provider/ContactsContract$CommonDataKinds$StructuredPostal;
 Landroid/provider/ContactsContract$ContactCounts;
 Landroid/provider/ContactsContract$ContactNameColumns;
@@ -50117,6 +45874,7 @@
 Landroid/provider/ContactsContract$DataUsageStatColumns;
 Landroid/provider/ContactsContract$DeletedContacts;
 Landroid/provider/ContactsContract$DeletedContactsColumns;
+Landroid/provider/ContactsContract$Directory;
 Landroid/provider/ContactsContract$DisplayPhoto;
 Landroid/provider/ContactsContract$Groups;
 Landroid/provider/ContactsContract$GroupsColumns;
@@ -50180,6 +45938,7 @@
 Landroid/provider/Telephony$MmsSms;
 Landroid/provider/Telephony$ServiceStateTable;
 Landroid/provider/Telephony$SimInfo;
+Landroid/provider/Telephony$Sms$Intents;
 Landroid/provider/Telephony$Sms$Sent;
 Landroid/provider/Telephony$Sms;
 Landroid/provider/Telephony$TextBasedSmsColumns;
@@ -50211,6 +45970,8 @@
 Landroid/security/Credentials;
 Landroid/security/FileIntegrityManager;
 Landroid/security/GateKeeper;
+Landroid/security/IFileIntegrityService$Stub;
+Landroid/security/IFileIntegrityService;
 Landroid/security/IKeyChainAliasCallback$Stub;
 Landroid/security/IKeyChainAliasCallback;
 Landroid/security/IKeyChainService$Stub$Proxy;
@@ -50401,10 +46162,12 @@
 Landroid/service/appprediction/IPredictionService$Stub;
 Landroid/service/appprediction/IPredictionService;
 Landroid/service/autofill/AutofillServiceInfo;
+Landroid/service/autofill/Dataset$1;
 Landroid/service/autofill/Dataset;
 Landroid/service/autofill/FieldClassificationUserData;
 Landroid/service/autofill/FillContext$1;
 Landroid/service/autofill/FillContext;
+Landroid/service/autofill/FillEventHistory$1;
 Landroid/service/autofill/FillEventHistory;
 Landroid/service/autofill/FillRequest$1;
 Landroid/service/autofill/FillRequest;
@@ -50418,25 +46181,23 @@
 Landroid/service/autofill/IFillCallback;
 Landroid/service/autofill/ISaveCallback$Stub;
 Landroid/service/autofill/ISaveCallback;
+Landroid/service/autofill/SaveRequest$1;
 Landroid/service/autofill/SaveRequest;
 Landroid/service/autofill/UserData$1;
 Landroid/service/autofill/UserData$Builder;
 Landroid/service/autofill/UserData;
+Landroid/service/autofill/augmented/Helper;
 Landroid/service/autofill/augmented/IAugmentedAutofillService$Stub$Proxy;
 Landroid/service/autofill/augmented/IAugmentedAutofillService$Stub;
 Landroid/service/autofill/augmented/IAugmentedAutofillService;
 Landroid/service/autofill/augmented/IFillCallback$Stub$Proxy;
 Landroid/service/autofill/augmented/IFillCallback$Stub;
 Landroid/service/autofill/augmented/IFillCallback;
-Landroid/service/carrier/CarrierIdentifier$1;
-Landroid/service/carrier/CarrierIdentifier;
 Landroid/service/carrier/CarrierMessagingServiceWrapper$CarrierMessagingCallbackWrapper;
 Landroid/service/carrier/CarrierMessagingServiceWrapper;
-Landroid/service/carrier/ICarrierService$Stub$Proxy;
-Landroid/service/carrier/ICarrierService$Stub;
-Landroid/service/carrier/ICarrierService;
 Landroid/service/contentcapture/ActivityEvent$1;
 Landroid/service/contentcapture/ActivityEvent;
+Landroid/service/contentcapture/ContentCaptureService;
 Landroid/service/contentcapture/ContentCaptureServiceInfo;
 Landroid/service/contentcapture/FlushMetrics$1;
 Landroid/service/contentcapture/FlushMetrics;
@@ -50451,47 +46212,22 @@
 Landroid/service/contentcapture/SnapshotData$1;
 Landroid/service/contentcapture/SnapshotData;
 Landroid/service/dataloader/DataLoaderService;
+Landroid/service/dreams/-$$Lambda$DreamService$DreamServiceWrapper$2R9T6zqLOUvx4z5eu1pSMWsejpU;
+Landroid/service/dreams/-$$Lambda$DreamService$DreamServiceWrapper$fKPQo1GZX03b5-nMg-IFcuuxhKs;
+Landroid/service/dreams/-$$Lambda$DreamService$DreamServiceWrapper$mm-Rh3xCTudFT-WRyQZatcwXBss;
+Landroid/service/dreams/-$$Lambda$DreamService$uqzqbrpptkCH_tc1jkx48W1A6vM;
+Landroid/service/dreams/DreamActivity;
 Landroid/service/dreams/DreamManagerInternal;
+Landroid/service/dreams/DreamService$DreamServiceWrapper;
+Landroid/service/dreams/DreamService;
 Landroid/service/dreams/IDreamManager$Stub$Proxy;
 Landroid/service/dreams/IDreamManager$Stub;
 Landroid/service/dreams/IDreamManager;
 Landroid/service/dreams/IDreamService$Stub$Proxy;
 Landroid/service/dreams/IDreamService$Stub;
 Landroid/service/dreams/IDreamService;
-Landroid/service/euicc/EuiccProfileInfo$1;
-Landroid/service/euicc/EuiccProfileInfo;
-Landroid/service/euicc/GetEuiccProfileInfoListResult$1;
-Landroid/service/euicc/GetEuiccProfileInfoListResult;
-Landroid/service/euicc/IDeleteSubscriptionCallback$Stub;
-Landroid/service/euicc/IDeleteSubscriptionCallback;
-Landroid/service/euicc/IDownloadSubscriptionCallback$Stub;
-Landroid/service/euicc/IDownloadSubscriptionCallback;
-Landroid/service/euicc/IEraseSubscriptionsCallback$Stub;
-Landroid/service/euicc/IEraseSubscriptionsCallback;
-Landroid/service/euicc/IEuiccService$Stub$Proxy;
-Landroid/service/euicc/IEuiccService$Stub;
-Landroid/service/euicc/IEuiccService;
-Landroid/service/euicc/IGetDefaultDownloadableSubscriptionListCallback$Stub;
-Landroid/service/euicc/IGetDefaultDownloadableSubscriptionListCallback;
-Landroid/service/euicc/IGetDownloadableSubscriptionMetadataCallback$Stub;
-Landroid/service/euicc/IGetDownloadableSubscriptionMetadataCallback;
-Landroid/service/euicc/IGetEidCallback$Stub;
-Landroid/service/euicc/IGetEidCallback;
-Landroid/service/euicc/IGetEuiccInfoCallback$Stub;
-Landroid/service/euicc/IGetEuiccInfoCallback;
-Landroid/service/euicc/IGetEuiccProfileInfoListCallback$Stub$Proxy;
-Landroid/service/euicc/IGetEuiccProfileInfoListCallback$Stub;
-Landroid/service/euicc/IGetEuiccProfileInfoListCallback;
-Landroid/service/euicc/IGetOtaStatusCallback$Stub;
-Landroid/service/euicc/IGetOtaStatusCallback;
 Landroid/service/euicc/IOtaStatusChangedCallback$Stub;
 Landroid/service/euicc/IOtaStatusChangedCallback;
-Landroid/service/euicc/IRetainSubscriptionsForFactoryResetCallback$Stub;
-Landroid/service/euicc/IRetainSubscriptionsForFactoryResetCallback;
-Landroid/service/euicc/ISwitchToSubscriptionCallback$Stub;
-Landroid/service/euicc/ISwitchToSubscriptionCallback;
-Landroid/service/euicc/IUpdateSubscriptionNicknameCallback$Stub;
-Landroid/service/euicc/IUpdateSubscriptionNicknameCallback;
 Landroid/service/gatekeeper/GateKeeperResponse$1;
 Landroid/service/gatekeeper/GateKeeperResponse;
 Landroid/service/gatekeeper/IGateKeeperService$Stub$Proxy;
@@ -50567,6 +46303,8 @@
 Landroid/service/persistentdata/IPersistentDataBlockService$Stub;
 Landroid/service/persistentdata/IPersistentDataBlockService;
 Landroid/service/persistentdata/PersistentDataBlockManager;
+Landroid/service/quicksettings/IQSService$Stub;
+Landroid/service/quicksettings/IQSService;
 Landroid/service/textclassifier/ITextClassifierCallback$Stub$Proxy;
 Landroid/service/textclassifier/ITextClassifierCallback$Stub;
 Landroid/service/textclassifier/ITextClassifierCallback;
@@ -50605,6 +46343,9 @@
 Landroid/service/vr/IVrStateCallbacks$Stub$Proxy;
 Landroid/service/vr/IVrStateCallbacks$Stub;
 Landroid/service/vr/IVrStateCallbacks;
+Landroid/service/wallpaper/-$$Lambda$87Do-TfJA3qVM7QF6F_6BpQlQTA;
+Landroid/service/wallpaper/-$$Lambda$vsWBQpiXExY07tlrSzTqh4pNQAQ;
+Landroid/service/wallpaper/IWallpaperConnection$Stub$Proxy;
 Landroid/service/wallpaper/IWallpaperConnection$Stub;
 Landroid/service/wallpaper/IWallpaperConnection;
 Landroid/service/wallpaper/IWallpaperEngine$Stub$Proxy;
@@ -50613,6 +46354,15 @@
 Landroid/service/wallpaper/IWallpaperService$Stub$Proxy;
 Landroid/service/wallpaper/IWallpaperService$Stub;
 Landroid/service/wallpaper/IWallpaperService;
+Landroid/service/wallpaper/WallpaperService$Engine$1;
+Landroid/service/wallpaper/WallpaperService$Engine$2;
+Landroid/service/wallpaper/WallpaperService$Engine$3;
+Landroid/service/wallpaper/WallpaperService$Engine$WallpaperInputEventReceiver;
+Landroid/service/wallpaper/WallpaperService$Engine;
+Landroid/service/wallpaper/WallpaperService$IWallpaperEngineWrapper;
+Landroid/service/wallpaper/WallpaperService$IWallpaperServiceWrapper;
+Landroid/service/wallpaper/WallpaperService$WallpaperCommand;
+Landroid/service/wallpaper/WallpaperService;
 Landroid/service/watchdog/ExplicitHealthCheckService$PackageConfig$1;
 Landroid/service/watchdog/ExplicitHealthCheckService$PackageConfig;
 Landroid/service/watchdog/IExplicitHealthCheckService$Stub$Proxy;
@@ -50622,8 +46372,10 @@
 Landroid/speech/tts/ITextToSpeechCallback$Stub;
 Landroid/speech/tts/ITextToSpeechCallback;
 Landroid/speech/tts/ITextToSpeechService$Stub$Proxy;
+Landroid/speech/tts/ITextToSpeechService$Stub;
 Landroid/speech/tts/ITextToSpeechService;
 Landroid/speech/tts/TextToSpeech$Action;
+Landroid/speech/tts/TextToSpeech$Connection$1;
 Landroid/speech/tts/TextToSpeech$Connection$SetupConnectionAsyncTask;
 Landroid/speech/tts/TextToSpeech$Connection;
 Landroid/speech/tts/TextToSpeech$EngineInfo;
@@ -50754,9 +46506,6 @@
 Landroid/telecom/TimedEvent;
 Landroid/telecom/VideoProfile$1;
 Landroid/telecom/VideoProfile;
-Landroid/telephony/-$$Lambda$DataFailCause$djkZSxdG-s-w2L5rQKiGu6OudyY;
-Landroid/telephony/-$$Lambda$MLKtmRGKP3e0WU7x_KyS5-Vg8q4;
-Landroid/telephony/-$$Lambda$NetworkRegistrationInfo$1JuZmO5PoYGZY8bHhZYwvmqwOB0;
 Landroid/telephony/-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$1M3m0i6211i2YjWyTDT7l0bJm3I;
 Landroid/telephony/-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$1uNdvGRe99lTurQeP2pTQkZS7Vs;
 Landroid/telephony/-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$2XBMUIj05jt4Xm08XAsE57q5gCc;
@@ -50777,6 +46526,7 @@
 Landroid/telephony/-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$E9hw_LXFliykadzCB_mw8nukNGI;
 Landroid/telephony/-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$F-YGB2a8GrHG6CB17lzASQZXVHI;
 Landroid/telephony/-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$FBJGFGXoSvidKfm50cEzC3i9rVk;
+Landroid/telephony/-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$GJ2YJ4ARy5-u2bWutnqrYMAsLYA;
 Landroid/telephony/-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$HEcWn-J1WRb0wLERu2qoMIZDfjY;
 Landroid/telephony/-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$Hbn6-eZxY2p3rjOfStodI04A8E8;
 Landroid/telephony/-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$IU278K5QbmReF-mbpcNVAvVlhFI;
@@ -50788,6 +46538,7 @@
 Landroid/telephony/-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$Q2A8FgYlU8_D6PD78tThGut_rTc;
 Landroid/telephony/-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$RC2x2ijetA-pQrLa4QakzMBjh_k;
 Landroid/telephony/-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$Rh4FuYaAZPAbrOYr6GGF6llSePE;
+Landroid/telephony/-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$SLDsZb_RTXJpIvKJwCENgXrSXcU;
 Landroid/telephony/-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$TqrkuLPlaG_ucU7VbLS4tnf8hG8;
 Landroid/telephony/-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$VCD7izkh9A_sRz9zMUPYy-TktLo;
 Landroid/telephony/-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$W65ui1dCCc-JnQa7gon1I7Bz7Sk;
@@ -50819,331 +46570,57 @@
 Landroid/telephony/-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$yGF2cJtJjwhRqDU8M4yzwgROulY;
 Landroid/telephony/-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$ygzOWFRiY4sZQ4WYUPIefqgiGvM;
 Landroid/telephony/-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$yvQnAlFGg5EWDG2vcA9X-4xnalA;
-Landroid/telephony/-$$Lambda$SubscriptionManager$D5_PmvQ13e0qLtSnBvNd4R7l2qA;
-Landroid/telephony/-$$Lambda$SubscriptionManager$R_uORt9bKcmEo6JnjiGP2KgjIOQ;
-Landroid/telephony/-$$Lambda$TelephonyFrameworkInitializer$3Kis6wL1IbLustWe9A2o4-2YpGo;
-Landroid/telephony/-$$Lambda$TelephonyFrameworkInitializer$MLDtRnX1dj1RKFdjgIsOvcQxhA0;
-Landroid/telephony/-$$Lambda$TelephonyFrameworkInitializer$b_92_3ZijRrdEa9yLyFA5xu19OM;
-Landroid/telephony/-$$Lambda$TelephonyFrameworkInitializer$mpe0Kh92VEQmEtmo60oqykdvnBE;
-Landroid/telephony/-$$Lambda$TelephonyFrameworkInitializer$o3geRfUaRT9tnqKKZbu1EbUxw4Q;
-Landroid/telephony/-$$Lambda$TelephonyFrameworkInitializer$sQClc4rjc9ydh0nXpY79gr33av4;
+Landroid/telephony/-$$Lambda$TelephonyManager$1$scMPky6lOZrCjFC3d4STbtLfpHE;
 Landroid/telephony/-$$Lambda$TelephonyManager$2$l6Pazxfi7QghMr2Z0MpduhNe6yc;
 Landroid/telephony/-$$Lambda$TelephonyRegistryManager$1$cLzLZB4oGnI-HG_-4MhxcXoHys8;
-Landroid/telephony/AccessNetworkConstants$AccessNetworkType;
-Landroid/telephony/AccessNetworkConstants$TransportType;
-Landroid/telephony/AccessNetworkConstants;
-Landroid/telephony/AccessNetworkUtils;
-Landroid/telephony/AnomalyReporter;
-Landroid/telephony/AvailableNetworkInfo;
-Landroid/telephony/CallAttributes$1;
-Landroid/telephony/CallAttributes;
-Landroid/telephony/CallQuality$1;
-Landroid/telephony/CallQuality;
-Landroid/telephony/CarrierConfigManager$Gps;
-Landroid/telephony/CarrierConfigManager;
-Landroid/telephony/CarrierRestrictionRules$1;
+Landroid/telephony/AvailableNetworkInfo$1;
 Landroid/telephony/CarrierRestrictionRules$Builder;
-Landroid/telephony/CarrierRestrictionRules;
-Landroid/telephony/CellConfigLte$1;
-Landroid/telephony/CellConfigLte;
-Landroid/telephony/CellIdentity$1;
-Landroid/telephony/CellIdentity;
-Landroid/telephony/CellIdentityCdma$1;
-Landroid/telephony/CellIdentityCdma;
-Landroid/telephony/CellIdentityGsm$1;
-Landroid/telephony/CellIdentityGsm;
-Landroid/telephony/CellIdentityLte$1;
-Landroid/telephony/CellIdentityLte;
-Landroid/telephony/CellIdentityNr$1;
-Landroid/telephony/CellIdentityNr;
-Landroid/telephony/CellIdentityTdscdma$1;
-Landroid/telephony/CellIdentityTdscdma;
-Landroid/telephony/CellIdentityWcdma$1;
-Landroid/telephony/CellIdentityWcdma;
-Landroid/telephony/CellInfo$1;
-Landroid/telephony/CellInfo;
-Landroid/telephony/CellInfoCdma$1;
-Landroid/telephony/CellInfoCdma;
-Landroid/telephony/CellInfoGsm$1;
-Landroid/telephony/CellInfoGsm;
-Landroid/telephony/CellInfoLte$1;
-Landroid/telephony/CellInfoLte;
-Landroid/telephony/CellInfoNr$1;
-Landroid/telephony/CellInfoNr;
-Landroid/telephony/CellInfoTdscdma$1;
-Landroid/telephony/CellInfoTdscdma;
-Landroid/telephony/CellInfoWcdma$1;
-Landroid/telephony/CellInfoWcdma;
-Landroid/telephony/CellLocation;
-Landroid/telephony/CellSignalStrength;
-Landroid/telephony/CellSignalStrengthCdma$1;
-Landroid/telephony/CellSignalStrengthCdma;
-Landroid/telephony/CellSignalStrengthGsm$1;
-Landroid/telephony/CellSignalStrengthGsm;
-Landroid/telephony/CellSignalStrengthLte$1;
-Landroid/telephony/CellSignalStrengthLte;
-Landroid/telephony/CellSignalStrengthNr$1;
-Landroid/telephony/CellSignalStrengthNr;
-Landroid/telephony/CellSignalStrengthTdscdma$1;
-Landroid/telephony/CellSignalStrengthTdscdma;
-Landroid/telephony/CellSignalStrengthWcdma$1;
-Landroid/telephony/CellSignalStrengthWcdma;
-Landroid/telephony/ClientRequestStats$1;
-Landroid/telephony/ClientRequestStats;
 Landroid/telephony/DataConnectionRealTimeInfo$1;
 Landroid/telephony/DataConnectionRealTimeInfo;
-Landroid/telephony/DataFailCause$1;
-Landroid/telephony/DataFailCause;
-Landroid/telephony/DataSpecificRegistrationInfo$1;
-Landroid/telephony/DataSpecificRegistrationInfo;
 Landroid/telephony/DisconnectCause;
-Landroid/telephony/ICellInfoCallback$Stub$Proxy;
-Landroid/telephony/ICellInfoCallback$Stub;
-Landroid/telephony/ICellInfoCallback;
-Landroid/telephony/INetworkService$Stub$Proxy;
-Landroid/telephony/INetworkService$Stub;
-Landroid/telephony/INetworkService;
 Landroid/telephony/INetworkServiceCallback$Stub$Proxy;
-Landroid/telephony/INetworkServiceCallback$Stub;
-Landroid/telephony/INetworkServiceCallback;
-Landroid/telephony/IccOpenLogicalChannelResponse$1;
-Landroid/telephony/IccOpenLogicalChannelResponse;
-Landroid/telephony/ImsiEncryptionInfo$1;
-Landroid/telephony/ImsiEncryptionInfo;
-Landroid/telephony/JapanesePhoneNumberFormatter;
 Landroid/telephony/LocationAccessPolicy$LocationPermissionQuery$Builder;
 Landroid/telephony/LocationAccessPolicy$LocationPermissionQuery;
 Landroid/telephony/LocationAccessPolicy$LocationPermissionResult;
 Landroid/telephony/LocationAccessPolicy;
-Landroid/telephony/LteVopsSupportInfo$1;
-Landroid/telephony/LteVopsSupportInfo;
 Landroid/telephony/MmsManager;
-Landroid/telephony/ModemActivityInfo$1;
-Landroid/telephony/ModemActivityInfo$TransmitPower;
-Landroid/telephony/ModemActivityInfo;
-Landroid/telephony/ModemInfo$1;
-Landroid/telephony/ModemInfo;
-Landroid/telephony/NeighboringCellInfo$1;
-Landroid/telephony/NeighboringCellInfo;
-Landroid/telephony/NetworkRegistrationInfo$1;
-Landroid/telephony/NetworkRegistrationInfo$Builder;
-Landroid/telephony/NetworkRegistrationInfo;
-Landroid/telephony/NetworkScan;
-Landroid/telephony/NetworkScanRequest$1;
-Landroid/telephony/NetworkScanRequest;
-Landroid/telephony/NetworkService$INetworkServiceWrapper;
-Landroid/telephony/NetworkService$NetworkServiceHandler;
-Landroid/telephony/NetworkService$NetworkServiceProvider;
-Landroid/telephony/NetworkService;
-Landroid/telephony/NetworkServiceCallback;
 Landroid/telephony/NumberVerificationCallback;
 Landroid/telephony/PackageChangeReceiver;
-Landroid/telephony/PhoneCapability$1;
-Landroid/telephony/PhoneCapability;
-Landroid/telephony/PhoneNumberRange$1;
-Landroid/telephony/PhoneNumberRange;
-Landroid/telephony/PhoneNumberUtils;
 Landroid/telephony/PhoneStateListener$IPhoneStateListenerStub;
 Landroid/telephony/PhoneStateListener;
-Landroid/telephony/PhysicalChannelConfig$1;
-Landroid/telephony/PhysicalChannelConfig$Builder;
-Landroid/telephony/PhysicalChannelConfig;
-Landroid/telephony/PreciseCallState$1;
-Landroid/telephony/PreciseCallState;
-Landroid/telephony/PreciseDataConnectionState$1;
-Landroid/telephony/PreciseDataConnectionState;
-Landroid/telephony/RadioAccessFamily$1;
-Landroid/telephony/RadioAccessFamily;
+Landroid/telephony/RadioAccessSpecifier$1;
 Landroid/telephony/RadioAccessSpecifier;
 Landroid/telephony/Rlog;
-Landroid/telephony/ServiceState$1;
-Landroid/telephony/ServiceState;
-Landroid/telephony/SignalStrength$1;
-Landroid/telephony/SignalStrength;
+Landroid/telephony/SmsCbCmasInfo$1;
 Landroid/telephony/SmsCbCmasInfo;
-Landroid/telephony/SmsCbEtwsInfo;
-Landroid/telephony/SmsCbLocation;
-Landroid/telephony/SmsCbMessage;
-Landroid/telephony/SmsManager;
+Landroid/telephony/SmsCbEtwsInfo$1;
+Landroid/telephony/SmsCbLocation$1;
+Landroid/telephony/SmsCbMessage$1;
 Landroid/telephony/SmsMessage$1;
 Landroid/telephony/SmsMessage$MessageClass;
-Landroid/telephony/SmsMessage;
-Landroid/telephony/SubscriptionInfo$1;
-Landroid/telephony/SubscriptionInfo;
-Landroid/telephony/SubscriptionManager$OnOpportunisticSubscriptionsChangedListener;
-Landroid/telephony/SubscriptionManager$OnSubscriptionsChangedListener$OnSubscriptionsChangedListenerHandler;
-Landroid/telephony/SubscriptionManager$OnSubscriptionsChangedListener;
-Landroid/telephony/SubscriptionManager;
 Landroid/telephony/SubscriptionPlan$1;
 Landroid/telephony/SubscriptionPlan;
-Landroid/telephony/TelephonyFrameworkInitializer;
-Landroid/telephony/TelephonyHistogram$1;
-Landroid/telephony/TelephonyHistogram;
+Landroid/telephony/TelephonyDisplayInfo;
 Landroid/telephony/TelephonyManager$1;
 Landroid/telephony/TelephonyManager$2;
-Landroid/telephony/TelephonyManager$5;
-Landroid/telephony/TelephonyManager$7;
-Landroid/telephony/TelephonyManager$CellInfoCallback;
-Landroid/telephony/TelephonyManager$MultiSimVariants;
 Landroid/telephony/TelephonyManager$UssdResponseCallback;
-Landroid/telephony/TelephonyManager;
 Landroid/telephony/TelephonyRegistryManager$1;
 Landroid/telephony/TelephonyRegistryManager$2;
 Landroid/telephony/TelephonyRegistryManager;
 Landroid/telephony/TelephonyScanManager$NetworkScanCallback;
-Landroid/telephony/UiccAccessRule$1;
-Landroid/telephony/UiccAccessRule;
-Landroid/telephony/UiccCardInfo$1;
-Landroid/telephony/UiccCardInfo;
-Landroid/telephony/UiccSlotInfo$1;
-Landroid/telephony/UiccSlotInfo;
+Landroid/telephony/UssdResponse$1;
 Landroid/telephony/UssdResponse;
-Landroid/telephony/VisualVoicemailSmsFilterSettings$1;
-Landroid/telephony/VisualVoicemailSmsFilterSettings$Builder;
-Landroid/telephony/VisualVoicemailSmsFilterSettings;
-Landroid/telephony/VoiceSpecificRegistrationInfo$1;
-Landroid/telephony/VoiceSpecificRegistrationInfo;
-Landroid/telephony/cdma/CdmaCellLocation;
-Landroid/telephony/data/ApnSetting$1;
-Landroid/telephony/data/ApnSetting$Builder;
-Landroid/telephony/data/ApnSetting;
-Landroid/telephony/data/DataCallResponse$1;
-Landroid/telephony/data/DataCallResponse;
-Landroid/telephony/data/DataProfile$1;
-Landroid/telephony/data/DataProfile$Builder;
-Landroid/telephony/data/DataProfile;
-Landroid/telephony/data/DataService$DataCallListChangedIndication;
-Landroid/telephony/data/DataService$DataServiceHandler;
-Landroid/telephony/data/DataService$DataServiceProvider;
-Landroid/telephony/data/DataService$DeactivateDataCallRequest;
-Landroid/telephony/data/DataService$IDataServiceWrapper;
-Landroid/telephony/data/DataService$SetDataProfileRequest;
-Landroid/telephony/data/DataService$SetInitialAttachApnRequest;
-Landroid/telephony/data/DataService$SetupDataCallRequest;
-Landroid/telephony/data/DataService;
-Landroid/telephony/data/DataServiceCallback;
-Landroid/telephony/data/IDataService$Stub$Proxy;
-Landroid/telephony/data/IDataService$Stub;
-Landroid/telephony/data/IDataService;
 Landroid/telephony/data/IDataServiceCallback$Stub$Proxy;
-Landroid/telephony/data/IDataServiceCallback$Stub;
-Landroid/telephony/data/IDataServiceCallback;
-Landroid/telephony/data/IQualifiedNetworksService$Stub$Proxy;
-Landroid/telephony/data/IQualifiedNetworksService$Stub;
-Landroid/telephony/data/IQualifiedNetworksService;
 Landroid/telephony/data/IQualifiedNetworksServiceCallback$Stub$Proxy;
-Landroid/telephony/data/IQualifiedNetworksServiceCallback$Stub;
-Landroid/telephony/data/IQualifiedNetworksServiceCallback;
-Landroid/telephony/emergency/EmergencyNumber$1;
-Landroid/telephony/emergency/EmergencyNumber;
-Landroid/telephony/euicc/DownloadableSubscription;
+Landroid/telephony/euicc/DownloadableSubscription$1;
 Landroid/telephony/euicc/EuiccCardManager$13;
 Landroid/telephony/euicc/EuiccCardManager$1;
-Landroid/telephony/euicc/EuiccCardManager$ResultCallback;
-Landroid/telephony/euicc/EuiccCardManager;
+Landroid/telephony/euicc/EuiccInfo$1;
 Landroid/telephony/euicc/EuiccInfo;
-Landroid/telephony/euicc/EuiccManager;
-Landroid/telephony/gsm/GsmCellLocation;
-Landroid/telephony/ims/-$$Lambda$ImsMmTelManager$CapabilityCallback$CapabilityBinder$4YNlUy9HsD02E7Sbv2VeVtbao08;
-Landroid/telephony/ims/-$$Lambda$ProvisioningManager$Callback$CallbackBinder$R_8jXQuOM7aV7dIwYBzcWwV-YpM;
-Landroid/telephony/ims/-$$Lambda$RegistrationManager$RegistrationCallback$RegistrationBinder$APeqso3VzZZ0eUf5slP1k5xoCME;
-Landroid/telephony/ims/-$$Lambda$RegistrationManager$RegistrationCallback$RegistrationBinder$DX_-dWIBwwX2oqDoRnq49RndG7s;
-Landroid/telephony/ims/-$$Lambda$RegistrationManager$RegistrationCallback$RegistrationBinder$uTxkp6C02qJxic1W_dkZRCQ6aRw;
-Landroid/telephony/ims/ImsCallForwardInfo$1;
-Landroid/telephony/ims/ImsCallForwardInfo;
-Landroid/telephony/ims/ImsCallProfile$1;
-Landroid/telephony/ims/ImsCallProfile;
-Landroid/telephony/ims/ImsException;
-Landroid/telephony/ims/ImsExternalCallState$1;
-Landroid/telephony/ims/ImsExternalCallState;
-Landroid/telephony/ims/ImsManager;
-Landroid/telephony/ims/ImsMmTelManager$3;
-Landroid/telephony/ims/ImsMmTelManager$CapabilityCallback$CapabilityBinder;
-Landroid/telephony/ims/ImsMmTelManager$CapabilityCallback;
-Landroid/telephony/ims/ImsMmTelManager$RegistrationCallback;
-Landroid/telephony/ims/ImsMmTelManager;
-Landroid/telephony/ims/ImsReasonInfo$1;
-Landroid/telephony/ims/ImsReasonInfo;
-Landroid/telephony/ims/ImsService$1;
-Landroid/telephony/ims/ImsService$Listener;
-Landroid/telephony/ims/ImsService;
-Landroid/telephony/ims/ImsSsData;
-Landroid/telephony/ims/ImsSsInfo$1;
-Landroid/telephony/ims/ImsSsInfo;
-Landroid/telephony/ims/ImsUtListener;
-Landroid/telephony/ims/ProvisioningManager$Callback$CallbackBinder;
-Landroid/telephony/ims/ProvisioningManager$Callback;
-Landroid/telephony/ims/RegistrationManager$1;
-Landroid/telephony/ims/RegistrationManager$RegistrationCallback$RegistrationBinder;
-Landroid/telephony/ims/RegistrationManager$RegistrationCallback;
-Landroid/telephony/ims/RegistrationManager;
-Landroid/telephony/ims/aidl/IImsCapabilityCallback$Stub$Proxy;
-Landroid/telephony/ims/aidl/IImsCapabilityCallback$Stub;
-Landroid/telephony/ims/aidl/IImsCapabilityCallback;
-Landroid/telephony/ims/aidl/IImsConfig$Stub$Proxy;
-Landroid/telephony/ims/aidl/IImsConfig$Stub;
-Landroid/telephony/ims/aidl/IImsConfig;
-Landroid/telephony/ims/aidl/IImsConfigCallback$Stub$Proxy;
-Landroid/telephony/ims/aidl/IImsConfigCallback$Stub;
-Landroid/telephony/ims/aidl/IImsConfigCallback;
-Landroid/telephony/ims/aidl/IImsMmTelFeature$Stub$Proxy;
-Landroid/telephony/ims/aidl/IImsMmTelFeature$Stub;
-Landroid/telephony/ims/aidl/IImsMmTelFeature;
-Landroid/telephony/ims/aidl/IImsMmTelListener$Stub$Proxy;
-Landroid/telephony/ims/aidl/IImsMmTelListener$Stub;
-Landroid/telephony/ims/aidl/IImsMmTelListener;
-Landroid/telephony/ims/aidl/IImsRcsFeature$Stub;
-Landroid/telephony/ims/aidl/IImsRcsFeature;
-Landroid/telephony/ims/aidl/IImsRegistration$Stub;
-Landroid/telephony/ims/aidl/IImsRegistration;
-Landroid/telephony/ims/aidl/IImsRegistrationCallback$Stub$Proxy;
-Landroid/telephony/ims/aidl/IImsRegistrationCallback$Stub;
-Landroid/telephony/ims/aidl/IImsRegistrationCallback;
-Landroid/telephony/ims/aidl/IImsServiceController$Stub$Proxy;
-Landroid/telephony/ims/aidl/IImsServiceController$Stub;
-Landroid/telephony/ims/aidl/IImsServiceController;
+Landroid/telephony/ims/ImsSsData$1;
 Landroid/telephony/ims/aidl/IImsServiceControllerListener$Stub$Proxy;
-Landroid/telephony/ims/aidl/IImsServiceControllerListener$Stub;
-Landroid/telephony/ims/aidl/IImsServiceControllerListener;
-Landroid/telephony/ims/aidl/IImsSmsListener$Stub$Proxy;
-Landroid/telephony/ims/aidl/IImsSmsListener$Stub;
-Landroid/telephony/ims/aidl/IImsSmsListener;
-Landroid/telephony/ims/aidl/IRcsMessage$Stub;
-Landroid/telephony/ims/aidl/IRcsMessage;
-Landroid/telephony/ims/feature/-$$Lambda$ImsFeature$9bLETU1BeS-dFzQnbBBs3kwaz-8;
 Landroid/telephony/ims/feature/-$$Lambda$ImsFeature$rPSMsRhoup9jfT6nt1MV2qhomrM;
-Landroid/telephony/ims/feature/CapabilityChangeRequest$1;
-Landroid/telephony/ims/feature/CapabilityChangeRequest$CapabilityPair;
-Landroid/telephony/ims/feature/CapabilityChangeRequest;
-Landroid/telephony/ims/feature/ImsFeature$1;
-Landroid/telephony/ims/feature/ImsFeature$2;
-Landroid/telephony/ims/feature/ImsFeature$Capabilities;
-Landroid/telephony/ims/feature/ImsFeature$CapabilityCallbackProxy;
-Landroid/telephony/ims/feature/ImsFeature;
-Landroid/telephony/ims/feature/MmTelFeature$1;
-Landroid/telephony/ims/feature/MmTelFeature$Listener;
-Landroid/telephony/ims/feature/MmTelFeature$MmTelCapabilities;
-Landroid/telephony/ims/feature/MmTelFeature;
-Landroid/telephony/ims/stub/-$$Lambda$ImsConfigImplBase$yL4863k-FoQyqg_FX2mWsLMqbyA;
-Landroid/telephony/ims/stub/-$$Lambda$ImsRegistrationImplBase$cWwTXSDsk-bWPbsDJYI--DUBMnE;
-Landroid/telephony/ims/stub/-$$Lambda$ImsRegistrationImplBase$s7PspXVbCf1Q_WSzodP2glP9TjI;
-Landroid/telephony/ims/stub/-$$Lambda$ImsRegistrationImplBase$sbjuTvW-brOSWMR74UInSZEIQB0;
-Landroid/telephony/ims/stub/-$$Lambda$ImsRegistrationImplBase$wwtkoeOtGwMjG5I0-ZTfjNpGU-s;
-Landroid/telephony/ims/stub/ImsCallSessionImplBase;
-Landroid/telephony/ims/stub/ImsConfigImplBase$ImsConfigStub;
-Landroid/telephony/ims/stub/ImsConfigImplBase;
-Landroid/telephony/ims/stub/ImsEcbmImplBase$1;
-Landroid/telephony/ims/stub/ImsEcbmImplBase;
-Landroid/telephony/ims/stub/ImsFeatureConfiguration$1;
-Landroid/telephony/ims/stub/ImsFeatureConfiguration$FeatureSlotPair;
-Landroid/telephony/ims/stub/ImsFeatureConfiguration;
-Landroid/telephony/ims/stub/ImsMultiEndpointImplBase$1;
-Landroid/telephony/ims/stub/ImsMultiEndpointImplBase;
-Landroid/telephony/ims/stub/ImsRegistrationImplBase$1;
-Landroid/telephony/ims/stub/ImsRegistrationImplBase;
-Landroid/telephony/ims/stub/ImsSmsImplBase;
-Landroid/telephony/ims/stub/ImsUtImplBase$1;
-Landroid/telephony/ims/stub/ImsUtImplBase;
+Landroid/text/-$$Lambda$Layout$MzjK2UE2G8VG0asK8_KWY3gHAmY;
 Landroid/text/AndroidBidi$EmojiBidiOverride;
 Landroid/text/AndroidBidi;
 Landroid/text/AndroidCharacter;
@@ -51202,6 +46679,7 @@
 Landroid/text/Layout$Directions;
 Landroid/text/Layout$Ellipsizer;
 Landroid/text/Layout$HorizontalMeasurementProvider;
+Landroid/text/Layout$SelectionRectangleConsumer;
 Landroid/text/Layout$SpannedEllipsizer;
 Landroid/text/Layout$TabStops;
 Landroid/text/Layout;
@@ -51272,8 +46750,10 @@
 Landroid/text/method/LinkMovementMethod;
 Landroid/text/method/MetaKeyKeyListener;
 Landroid/text/method/MovementMethod;
+Landroid/text/method/MultiTapKeyListener;
 Landroid/text/method/NumberKeyListener;
 Landroid/text/method/PasswordTransformationMethod;
+Landroid/text/method/QwertyKeyListener$Replaced;
 Landroid/text/method/QwertyKeyListener;
 Landroid/text/method/ReplacementTransformationMethod$ReplacementCharSequence;
 Landroid/text/method/ReplacementTransformationMethod$SpannedReplacementCharSequence;
@@ -51281,6 +46761,7 @@
 Landroid/text/method/ScrollingMovementMethod;
 Landroid/text/method/SingleLineTransformationMethod;
 Landroid/text/method/TextKeyListener$Capitalize;
+Landroid/text/method/TextKeyListener$NullKeyListener;
 Landroid/text/method/TextKeyListener$SettingsObserver;
 Landroid/text/method/TextKeyListener;
 Landroid/text/method/TimeKeyListener;
@@ -51592,6 +47073,7 @@
 Landroid/view/-$$Lambda$InsetsController$6uoSHBPvxV1C0JOZKhH1AyuNXmo;
 Landroid/view/-$$Lambda$InsetsController$Cj7UJrCkdHvJAZ_cYKrXuTMsjz8;
 Landroid/view/-$$Lambda$InsetsController$HI9QZ2HvGm6iykc-WONz2KPG61Q;
+Landroid/view/-$$Lambda$InsetsController$InternalAnimationControlListener$SInf91MjJKDQFXwrp7C-HBi0xaQ;
 Landroid/view/-$$Lambda$InsetsController$RZT3QkL9zMFTeHtZbfcaHIzvlsc;
 Landroid/view/-$$Lambda$InsetsController$zpmOxHfTFV_3me2u3C8YaXSUauQ;
 Landroid/view/-$$Lambda$PYGleuqIeCxjTD1pJqqx1opFv1g;
@@ -51603,6 +47085,8 @@
 Landroid/view/-$$Lambda$ThreadedRenderer$ydBD-R1iP5u-97XYakm-jKvC1b4;
 Landroid/view/-$$Lambda$View$bhR1vB5ZYp3dv-Kth4jtLSS0KEs;
 Landroid/view/-$$Lambda$View$llq76MkPXP4bNcb9oJt_msw0fnQ;
+Landroid/view/-$$Lambda$ViewGroup$ViewLocationHolder$AjKvqdj7SGGIzA5qrlZUuu71jl8;
+Landroid/view/-$$Lambda$ViewGroup$ViewLocationHolder$QbO7cM0ULKe25a7bfXG3VH6DB0c;
 Landroid/view/-$$Lambda$ViewRootImpl$DJd0VUYJgsebcnSohO6h8zc_ONI;
 Landroid/view/-$$Lambda$ViewRootImpl$IReiNMSbDakZSGbIZuL_ifaFWn8;
 Landroid/view/-$$Lambda$ViewRootImpl$YBiqAhbCbXVPSKdbE3K4rH2gpxI;
@@ -51619,6 +47103,7 @@
 Landroid/view/AccessibilityInteractionController$AccessibilityNodePrefetcher;
 Landroid/view/AccessibilityInteractionController$PrivateHandler;
 Landroid/view/AccessibilityInteractionController;
+Landroid/view/ActionMode$Callback2;
 Landroid/view/ActionMode$Callback;
 Landroid/view/ActionMode;
 Landroid/view/ActionProvider$SubUiVisibilityListener;
@@ -51640,6 +47125,8 @@
 Landroid/view/ContextMenu$ContextMenuInfo;
 Landroid/view/ContextMenu;
 Landroid/view/ContextThemeWrapper;
+Landroid/view/CutoutSpecification$Parser;
+Landroid/view/CutoutSpecification;
 Landroid/view/Display$HdrCapabilities$1;
 Landroid/view/Display$HdrCapabilities;
 Landroid/view/Display$Mode$1;
@@ -51688,6 +47175,7 @@
 Landroid/view/IDisplayFoldListener$Stub$Proxy;
 Landroid/view/IDisplayFoldListener$Stub;
 Landroid/view/IDisplayFoldListener;
+Landroid/view/IDisplayWindowInsetsController$Stub$Proxy;
 Landroid/view/IDisplayWindowInsetsController$Stub;
 Landroid/view/IDisplayWindowInsetsController;
 Landroid/view/IDisplayWindowListener$Stub$Proxy;
@@ -51783,6 +47271,15 @@
 Landroid/view/InputQueue;
 Landroid/view/InputWindowHandle;
 Landroid/view/InsetsAnimationControlCallbacks;
+Landroid/view/InsetsAnimationControlImpl;
+Landroid/view/InsetsAnimationControlRunner;
+Landroid/view/InsetsAnimationThread;
+Landroid/view/InsetsController$1;
+Landroid/view/InsetsController$InternalAnimationControlListener$1;
+Landroid/view/InsetsController$InternalAnimationControlListener$2;
+Landroid/view/InsetsController$InternalAnimationControlListener;
+Landroid/view/InsetsController$PendingControlRequest;
+Landroid/view/InsetsController$RunningAnimation;
 Landroid/view/InsetsController;
 Landroid/view/InsetsFlags;
 Landroid/view/InsetsSource$1;
@@ -51819,9 +47316,16 @@
 Landroid/view/MotionEvent$PointerProperties;
 Landroid/view/MotionEvent;
 Landroid/view/NativeVectorDrawableAnimator;
+Landroid/view/NotificationHeaderView$1;
+Landroid/view/NotificationHeaderView$HeaderTouchListener;
+Landroid/view/NotificationHeaderView;
 Landroid/view/OrientationEventListener$SensorEventListenerImpl;
 Landroid/view/OrientationEventListener;
 Landroid/view/OrientationListener;
+Landroid/view/PendingInsetsController;
+Landroid/view/PixelCopy$1;
+Landroid/view/PixelCopy$OnPixelCopyFinishedListener;
+Landroid/view/PixelCopy;
 Landroid/view/PointerIcon$1;
 Landroid/view/PointerIcon$2;
 Landroid/view/PointerIcon;
@@ -51863,6 +47367,7 @@
 Landroid/view/SurfaceControl$Transaction$1;
 Landroid/view/SurfaceControl$Transaction;
 Landroid/view/SurfaceControl;
+Landroid/view/SurfaceControlViewHost$SurfacePackage$1;
 Landroid/view/SurfaceControlViewHost$SurfacePackage;
 Landroid/view/SurfaceHolder$Callback2;
 Landroid/view/SurfaceHolder$Callback;
@@ -51871,6 +47376,9 @@
 Landroid/view/SurfaceView$1;
 Landroid/view/SurfaceView$2;
 Landroid/view/SurfaceView;
+Landroid/view/SyncRtSurfaceTransactionApplier$SurfaceParams$Builder;
+Landroid/view/SyncRtSurfaceTransactionApplier$SurfaceParams;
+Landroid/view/SyncRtSurfaceTransactionApplier;
 Landroid/view/TextureLayer;
 Landroid/view/TextureView$SurfaceTextureListener;
 Landroid/view/TextureView;
@@ -51937,6 +47445,7 @@
 Landroid/view/View$VisibilityChangeForAutofillHandler;
 Landroid/view/View;
 Landroid/view/ViewAnimationHostBridge;
+Landroid/view/ViewAnimationUtils;
 Landroid/view/ViewConfiguration;
 Landroid/view/ViewDebug$ExportedProperty;
 Landroid/view/ViewDebug$FlagToString;
@@ -51953,6 +47462,7 @@
 Landroid/view/ViewGroup$MarginLayoutParams;
 Landroid/view/ViewGroup$OnHierarchyChangeListener;
 Landroid/view/ViewGroup$TouchTarget;
+Landroid/view/ViewGroup$ViewLocationHolder;
 Landroid/view/ViewGroup;
 Landroid/view/ViewGroupOverlay;
 Landroid/view/ViewManager;
@@ -52052,6 +47562,11 @@
 Landroid/view/WindowInsets$Side;
 Landroid/view/WindowInsets$Type;
 Landroid/view/WindowInsets;
+Landroid/view/WindowInsetsAnimation$Bounds;
+Landroid/view/WindowInsetsAnimation$Callback;
+Landroid/view/WindowInsetsAnimation;
+Landroid/view/WindowInsetsAnimationControlListener;
+Landroid/view/WindowInsetsAnimationController;
 Landroid/view/WindowInsetsController;
 Landroid/view/WindowLeaked;
 Landroid/view/WindowManager$BadTokenException;
@@ -52085,7 +47600,9 @@
 Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction;
 Landroid/view/accessibility/AccessibilityNodeInfo$CollectionInfo;
 Landroid/view/accessibility/AccessibilityNodeInfo$CollectionItemInfo;
+Landroid/view/accessibility/AccessibilityNodeInfo$ExtraRenderingInfo;
 Landroid/view/accessibility/AccessibilityNodeInfo$RangeInfo;
+Landroid/view/accessibility/AccessibilityNodeInfo$TouchDelegateInfo$1;
 Landroid/view/accessibility/AccessibilityNodeInfo$TouchDelegateInfo;
 Landroid/view/accessibility/AccessibilityNodeInfo;
 Landroid/view/accessibility/AccessibilityNodeProvider;
@@ -52107,6 +47624,7 @@
 Landroid/view/accessibility/IAccessibilityManagerClient$Stub$Proxy;
 Landroid/view/accessibility/IAccessibilityManagerClient$Stub;
 Landroid/view/accessibility/IAccessibilityManagerClient;
+Landroid/view/accessibility/IWindowMagnificationConnection$Stub$Proxy;
 Landroid/view/accessibility/IWindowMagnificationConnection$Stub;
 Landroid/view/accessibility/IWindowMagnificationConnection;
 Landroid/view/accessibility/WeakSparseArray$WeakReferenceWithId;
@@ -52167,10 +47685,16 @@
 Landroid/view/autofill/IAutoFillManagerClient$Stub$Proxy;
 Landroid/view/autofill/IAutoFillManagerClient$Stub;
 Landroid/view/autofill/IAutoFillManagerClient;
+Landroid/view/autofill/IAutofillWindowPresenter$Stub$Proxy;
 Landroid/view/autofill/IAutofillWindowPresenter$Stub;
 Landroid/view/autofill/IAutofillWindowPresenter;
 Landroid/view/autofill/ParcelableMap$1;
 Landroid/view/autofill/ParcelableMap;
+Landroid/view/contentcapture/-$$Lambda$MainContentCaptureSession$1$JPRO-nNGZpgXrKr4QC_iQiTbQx0;
+Landroid/view/contentcapture/-$$Lambda$MainContentCaptureSession$1$Xhq3WJibbalS1G_W3PRC2m7muhM;
+Landroid/view/contentcapture/-$$Lambda$MainContentCaptureSession$49zT7C2BXrEdkyggyGk1Qs4d46k;
+Landroid/view/contentcapture/-$$Lambda$MainContentCaptureSession$HTmdDf687TPcaTnLyPp3wo0gI60;
+Landroid/view/contentcapture/-$$Lambda$MainContentCaptureSession$UWslDbWedtPhv49PtRsvG4TlYWw;
 Landroid/view/contentcapture/ContentCaptureCondition$1;
 Landroid/view/contentcapture/ContentCaptureCondition;
 Landroid/view/contentcapture/ContentCaptureContext$1;
@@ -52182,17 +47706,27 @@
 Landroid/view/contentcapture/ContentCaptureManager$ContentCaptureClient;
 Landroid/view/contentcapture/ContentCaptureManager;
 Landroid/view/contentcapture/ContentCaptureSession;
+Landroid/view/contentcapture/ContentCaptureSessionId$1;
 Landroid/view/contentcapture/ContentCaptureSessionId;
 Landroid/view/contentcapture/DataRemovalRequest$1;
+Landroid/view/contentcapture/DataRemovalRequest$LocusIdRequest;
 Landroid/view/contentcapture/DataRemovalRequest;
+Landroid/view/contentcapture/DataShareRequest$1;
 Landroid/view/contentcapture/DataShareRequest;
+Landroid/view/contentcapture/IContentCaptureDirectManager$Stub$Proxy;
+Landroid/view/contentcapture/IContentCaptureDirectManager$Stub;
+Landroid/view/contentcapture/IContentCaptureDirectManager;
 Landroid/view/contentcapture/IContentCaptureManager$Stub$Proxy;
 Landroid/view/contentcapture/IContentCaptureManager$Stub;
 Landroid/view/contentcapture/IContentCaptureManager;
+Landroid/view/contentcapture/IDataShareWriteAdapter$Stub$Proxy;
 Landroid/view/contentcapture/IDataShareWriteAdapter$Stub;
 Landroid/view/contentcapture/IDataShareWriteAdapter;
 Landroid/view/contentcapture/MainContentCaptureSession$1;
 Landroid/view/contentcapture/MainContentCaptureSession;
+Landroid/view/contentcapture/ViewNode$ViewNodeText;
+Landroid/view/contentcapture/ViewNode$ViewStructureImpl;
+Landroid/view/contentcapture/ViewNode;
 Landroid/view/inputmethod/-$$Lambda$InputMethodManager$DelegateImpl$r2X8PLo_YIORJTYJGDfinf_IvK4;
 Landroid/view/inputmethod/-$$Lambda$InputMethodManager$dfnCauFoZCf-HfXs1QavrkwWDf0;
 Landroid/view/inputmethod/-$$Lambda$InputMethodManager$iDWn3IGSUFqIcs8Py42UhfrshxI;
@@ -52213,6 +47747,7 @@
 Landroid/view/inputmethod/ExtractedText;
 Landroid/view/inputmethod/ExtractedTextRequest$1;
 Landroid/view/inputmethod/ExtractedTextRequest;
+Landroid/view/inputmethod/InlineSuggestionsRequest$1;
 Landroid/view/inputmethod/InlineSuggestionsRequest;
 Landroid/view/inputmethod/InputBinding$1;
 Landroid/view/inputmethod/InputBinding;
@@ -52252,6 +47787,7 @@
 Landroid/view/textclassifier/-$$Lambda$L_UQMPjXwBN0ch4zL2dD82nf9RI;
 Landroid/view/textclassifier/-$$Lambda$NxwbyZSxofZ4Z5SQhfXmtLQ1nxk;
 Landroid/view/textclassifier/-$$Lambda$OGSS2qx6njxlnp0dnKb4lA3jnw8;
+Landroid/view/textclassifier/-$$Lambda$TextClassification$ysasaE5ZkXkkzjVWIJ06GTV92-g;
 Landroid/view/textclassifier/-$$Lambda$TextClassificationManager$JIaezIJbMig_-kVzN6oArzkTsJE;
 Landroid/view/textclassifier/-$$Lambda$TextClassifierImpl$RRbXefHgcUymI9-P95ArUyMvfbw;
 Landroid/view/textclassifier/-$$Lambda$TextClassifierImpl$ftq-sQqJYwUdrdbbr9jz3p4AWos;
@@ -52290,9 +47826,11 @@
 Landroid/view/textclassifier/SystemTextClassifier$BlockingCallback;
 Landroid/view/textclassifier/SystemTextClassifier$ResponseReceiver;
 Landroid/view/textclassifier/SystemTextClassifier;
+Landroid/view/textclassifier/SystemTextClassifierMetadata;
 Landroid/view/textclassifier/TextClassification$1;
 Landroid/view/textclassifier/TextClassification$Builder;
 Landroid/view/textclassifier/TextClassification$Request$1;
+Landroid/view/textclassifier/TextClassification$Request$Builder;
 Landroid/view/textclassifier/TextClassification$Request;
 Landroid/view/textclassifier/TextClassification;
 Landroid/view/textclassifier/TextClassificationConstants;
@@ -52301,6 +47839,8 @@
 Landroid/view/textclassifier/TextClassificationContext;
 Landroid/view/textclassifier/TextClassificationManager$SettingsObserver;
 Landroid/view/textclassifier/TextClassificationManager;
+Landroid/view/textclassifier/TextClassificationSession$CleanerRunnable;
+Landroid/view/textclassifier/TextClassificationSession$SelectionEventHelper;
 Landroid/view/textclassifier/TextClassificationSession;
 Landroid/view/textclassifier/TextClassificationSessionFactory;
 Landroid/view/textclassifier/TextClassificationSessionId$1;
@@ -52330,9 +47870,11 @@
 Landroid/view/textclassifier/TextLanguage$Request$Builder;
 Landroid/view/textclassifier/TextLanguage$Request;
 Landroid/view/textclassifier/TextLanguage;
+Landroid/view/textclassifier/TextLinks$1;
 Landroid/view/textclassifier/TextLinks$Builder;
 Landroid/view/textclassifier/TextLinks$Request$1;
 Landroid/view/textclassifier/TextLinks$Request;
+Landroid/view/textclassifier/TextLinks$TextLink$1;
 Landroid/view/textclassifier/TextLinks$TextLink;
 Landroid/view/textclassifier/TextLinks$TextLinkSpan;
 Landroid/view/textclassifier/TextLinks;
@@ -52350,6 +47892,8 @@
 Landroid/view/textclassifier/intent/TemplateIntentFactory;
 Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;
 Landroid/view/textclassifier/logging/SmartSelectionEventTracker;
+Landroid/view/textservice/SentenceSuggestionsInfo$1;
+Landroid/view/textservice/SentenceSuggestionsInfo;
 Landroid/view/textservice/SpellCheckerInfo$1;
 Landroid/view/textservice/SpellCheckerInfo;
 Landroid/view/textservice/SpellCheckerSession$1;
@@ -52361,6 +47905,9 @@
 Landroid/view/textservice/SpellCheckerSession;
 Landroid/view/textservice/SpellCheckerSubtype$1;
 Landroid/view/textservice/SpellCheckerSubtype;
+Landroid/view/textservice/SuggestionsInfo$1;
+Landroid/view/textservice/SuggestionsInfo;
+Landroid/view/textservice/TextInfo$1;
 Landroid/view/textservice/TextInfo;
 Landroid/view/textservice/TextServicesManager;
 Landroid/webkit/ConsoleMessage$MessageLevel;
@@ -52368,6 +47915,8 @@
 Landroid/webkit/CookieManager;
 Landroid/webkit/CookieSyncManager;
 Landroid/webkit/DownloadListener;
+Landroid/webkit/FindAddress$ZipRange;
+Landroid/webkit/FindAddress;
 Landroid/webkit/GeolocationPermissions;
 Landroid/webkit/IWebViewUpdateService$Stub$Proxy;
 Landroid/webkit/IWebViewUpdateService$Stub;
@@ -52390,6 +47939,7 @@
 Landroid/webkit/WebMessagePort;
 Landroid/webkit/WebResourceError;
 Landroid/webkit/WebResourceRequest;
+Landroid/webkit/WebResourceResponse;
 Landroid/webkit/WebSettings$PluginState;
 Landroid/webkit/WebSettings;
 Landroid/webkit/WebStorage;
@@ -52420,9 +47970,12 @@
 Landroid/webkit/WebViewProviderResponse$1;
 Landroid/webkit/WebViewProviderResponse;
 Landroid/webkit/WebViewZygote;
+Landroid/widget/-$$Lambda$DZXn7FbDDFyBvNjI-iG9_hfa7kw;
+Landroid/widget/-$$Lambda$DateTimeView$ReceiverInfo$AVLnX7U5lTcE9jLnlKKNAT1GUeI;
 Landroid/widget/-$$Lambda$Editor$MagnifierMotionAnimator$E-RaelOMgCHAzvKgSSZE-hDYeIg;
 Landroid/widget/-$$Lambda$IfzAW5fP9thoftErKAjo9SLZufw;
 Landroid/widget/-$$Lambda$PopupWindow$8Gc2stI5cSJZbuKX7X4Qr_vU2nI;
+Landroid/widget/-$$Lambda$PopupWindow$PopupDecorView$T99WKEnQefOCXbbKvW95WY38p_I;
 Landroid/widget/-$$Lambda$PopupWindow$nV1HS3Nc6Ck5JRIbIHe3mkyHWzc;
 Landroid/widget/-$$Lambda$RemoteViews$FAOkoZgPKPkiYdtkDxAhkeoykww;
 Landroid/widget/-$$Lambda$RemoteViews$Ld8XNSMwygf42608Zln-rjTyHy0;
@@ -52456,6 +48009,7 @@
 Landroid/widget/AbsSeekBar;
 Landroid/widget/AbsSpinner$RecycleBin;
 Landroid/widget/AbsSpinner$SavedState$1;
+Landroid/widget/AbsSpinner$SavedState;
 Landroid/widget/AbsSpinner;
 Landroid/widget/AbsoluteLayout$LayoutParams;
 Landroid/widget/AbsoluteLayout;
@@ -52495,8 +48049,14 @@
 Landroid/widget/Chronometer$OnChronometerTickListener;
 Landroid/widget/Chronometer;
 Landroid/widget/CompoundButton$OnCheckedChangeListener;
+Landroid/widget/CompoundButton$SavedState$1;
 Landroid/widget/CompoundButton$SavedState;
 Landroid/widget/CompoundButton;
+Landroid/widget/DateTimeView$ReceiverInfo$1;
+Landroid/widget/DateTimeView$ReceiverInfo$2;
+Landroid/widget/DateTimeView$ReceiverInfo;
+Landroid/widget/DateTimeView;
+Landroid/widget/DropDownListView;
 Landroid/widget/EdgeEffect;
 Landroid/widget/EditText;
 Landroid/widget/Editor$1;
@@ -52515,7 +48075,9 @@
 Landroid/widget/Editor$HandleView;
 Landroid/widget/Editor$InputContentType;
 Landroid/widget/Editor$InputMethodState;
+Landroid/widget/Editor$InsertionHandleView$1;
 Landroid/widget/Editor$InsertionHandleView;
+Landroid/widget/Editor$InsertionPointCursorController$1;
 Landroid/widget/Editor$InsertionPointCursorController;
 Landroid/widget/Editor$MagnifierMotionAnimator;
 Landroid/widget/Editor$PinnedPopupWindow;
@@ -52541,7 +48103,11 @@
 Landroid/widget/FastScroller$5;
 Landroid/widget/FastScroller$6;
 Landroid/widget/FastScroller;
+Landroid/widget/Filter$Delayer;
 Landroid/widget/Filter$FilterListener;
+Landroid/widget/Filter$FilterResults;
+Landroid/widget/Filter$RequestArguments;
+Landroid/widget/Filter$RequestHandler;
 Landroid/widget/Filter$ResultsHandler;
 Landroid/widget/Filter;
 Landroid/widget/Filterable;
@@ -52605,6 +48171,12 @@
 Landroid/widget/PopupWindow$2;
 Landroid/widget/PopupWindow$3;
 Landroid/widget/PopupWindow$OnDismissListener;
+Landroid/widget/PopupWindow$PopupBackgroundView;
+Landroid/widget/PopupWindow$PopupDecorView$1$1;
+Landroid/widget/PopupWindow$PopupDecorView$1;
+Landroid/widget/PopupWindow$PopupDecorView$2;
+Landroid/widget/PopupWindow$PopupDecorView$3;
+Landroid/widget/PopupWindow$PopupDecorView$4;
 Landroid/widget/PopupWindow$PopupDecorView;
 Landroid/widget/PopupWindow;
 Landroid/widget/ProgressBar$1;
@@ -52680,13 +48252,16 @@
 Landroid/widget/SelectionActionModeHelper;
 Landroid/widget/SmartSelectSprite;
 Landroid/widget/Space;
+Landroid/widget/SpellChecker$1;
 Landroid/widget/SpellChecker$SpellParser;
 Landroid/widget/SpellChecker;
 Landroid/widget/Spinner$1;
+Landroid/widget/Spinner$DialogPopup;
 Landroid/widget/Spinner$DropDownAdapter;
 Landroid/widget/Spinner$DropdownPopup$1;
 Landroid/widget/Spinner$DropdownPopup;
 Landroid/widget/Spinner$SavedState$1;
+Landroid/widget/Spinner$SavedState;
 Landroid/widget/Spinner$SpinnerPopup;
 Landroid/widget/Spinner;
 Landroid/widget/SpinnerAdapter;
@@ -52696,6 +48271,10 @@
 Landroid/widget/TableLayout;
 Landroid/widget/TableRow$ChildrenTracker;
 Landroid/widget/TableRow;
+Landroid/widget/TextClock$1;
+Landroid/widget/TextClock$2;
+Landroid/widget/TextClock$FormatChangeObserver;
+Landroid/widget/TextClock;
 Landroid/widget/TextView$1;
 Landroid/widget/TextView$2;
 Landroid/widget/TextView$3;
@@ -52719,6 +48298,7 @@
 Landroid/widget/Toast$TN$1;
 Landroid/widget/Toast$TN;
 Landroid/widget/Toast;
+Landroid/widget/ToastPresenter;
 Landroid/widget/ToggleButton;
 Landroid/widget/Toolbar$1;
 Landroid/widget/Toolbar$2;
@@ -52729,6 +48309,9 @@
 Landroid/widget/Toolbar$SavedState;
 Landroid/widget/Toolbar;
 Landroid/widget/ViewAnimator;
+Landroid/widget/ViewFlipper$1;
+Landroid/widget/ViewFlipper$2;
+Landroid/widget/ViewFlipper;
 Landroid/widget/ViewSwitcher;
 Landroid/widget/WrapperListAdapter;
 Lcom/android/framework/protobuf/nano/CodedInputByteBufferNano;
@@ -52748,6 +48331,8 @@
 Lcom/android/i18n/phonenumbers/NumberParseException$ErrorType;
 Lcom/android/i18n/phonenumbers/NumberParseException;
 Lcom/android/i18n/phonenumbers/PhoneNumberMatch;
+Lcom/android/i18n/phonenumbers/PhoneNumberMatcher$State;
+Lcom/android/i18n/phonenumbers/PhoneNumberMatcher;
 Lcom/android/i18n/phonenumbers/PhoneNumberUtil$1;
 Lcom/android/i18n/phonenumbers/PhoneNumberUtil$2;
 Lcom/android/i18n/phonenumbers/PhoneNumberUtil$Leniency$1;
@@ -52796,13 +48381,9 @@
 Lcom/android/ims/ImsCall$Listener;
 Lcom/android/ims/ImsCall;
 Lcom/android/ims/ImsCallbackAdapterManager;
-Lcom/android/ims/ImsConfig;
-Lcom/android/ims/ImsConfigListener$Stub;
-Lcom/android/ims/ImsConfigListener;
 Lcom/android/ims/ImsEcbm$ImsEcbmListenerProxy;
 Lcom/android/ims/ImsEcbm;
 Lcom/android/ims/ImsEcbmStateListener;
-Lcom/android/ims/ImsException;
 Lcom/android/ims/ImsExternalCallStateListener;
 Lcom/android/ims/ImsManager$2;
 Lcom/android/ims/ImsManager$3;
@@ -52813,32 +48394,13 @@
 Lcom/android/ims/ImsMultiEndpoint;
 Lcom/android/ims/ImsUt$IImsUtListenerProxy;
 Lcom/android/ims/ImsUt;
-Lcom/android/ims/ImsUtInterface;
 Lcom/android/ims/MmTelFeatureConnection$CapabilityCallbackManager;
 Lcom/android/ims/MmTelFeatureConnection$ImsRegistrationCallbackAdapter;
 Lcom/android/ims/MmTelFeatureConnection$ProvisioningCallbackManager;
 Lcom/android/ims/MmTelFeatureConnection;
 Lcom/android/ims/Registrant;
 Lcom/android/ims/internal/ICall;
-Lcom/android/ims/internal/IImsCallSession;
-Lcom/android/ims/internal/IImsEcbm$Stub;
-Lcom/android/ims/internal/IImsEcbm;
-Lcom/android/ims/internal/IImsEcbmListener$Stub;
-Lcom/android/ims/internal/IImsEcbmListener;
-Lcom/android/ims/internal/IImsExternalCallStateListener$Stub;
-Lcom/android/ims/internal/IImsExternalCallStateListener;
 Lcom/android/ims/internal/IImsFeatureStatusCallback$Stub$Proxy;
-Lcom/android/ims/internal/IImsFeatureStatusCallback$Stub;
-Lcom/android/ims/internal/IImsFeatureStatusCallback;
-Lcom/android/ims/internal/IImsMultiEndpoint$Stub;
-Lcom/android/ims/internal/IImsMultiEndpoint;
-Lcom/android/ims/internal/IImsServiceFeatureCallback$Stub$Proxy;
-Lcom/android/ims/internal/IImsServiceFeatureCallback$Stub;
-Lcom/android/ims/internal/IImsServiceFeatureCallback;
-Lcom/android/ims/internal/IImsUt$Stub;
-Lcom/android/ims/internal/IImsUt;
-Lcom/android/ims/internal/IImsUtListener$Stub;
-Lcom/android/ims/internal/IImsUtListener;
 Lcom/android/ims/internal/ImsVideoCallProviderWrapper$ImsVideoProviderWrapperCallback;
 Lcom/android/ims/internal/uce/UceServiceBase$UceServiceBinder;
 Lcom/android/ims/internal/uce/UceServiceBase;
@@ -52966,15 +48528,24 @@
 Lcom/android/internal/backup/IBackupTransport$Stub;
 Lcom/android/internal/backup/IBackupTransport;
 Lcom/android/internal/colorextraction/ColorExtractor$GradientColors;
+Lcom/android/internal/colorextraction/ColorExtractor$LoadWallpaperColors;
+Lcom/android/internal/colorextraction/ColorExtractor$OnColorsChangedListener;
+Lcom/android/internal/colorextraction/ColorExtractor;
+Lcom/android/internal/colorextraction/drawable/-$$Lambda$ScrimDrawable$UWtyAZ9Ss5P5TukFNvAyvh0pNf0;
+Lcom/android/internal/colorextraction/drawable/ScrimDrawable$1;
+Lcom/android/internal/colorextraction/drawable/ScrimDrawable;
 Lcom/android/internal/colorextraction/types/ExtractionType;
 Lcom/android/internal/colorextraction/types/Tonal$ConfigParser;
 Lcom/android/internal/colorextraction/types/Tonal$TonalPalette;
 Lcom/android/internal/colorextraction/types/Tonal;
+Lcom/android/internal/compat/AndroidBuildClassifier;
 Lcom/android/internal/compat/ChangeReporter$ChangeReport;
 Lcom/android/internal/compat/ChangeReporter;
+Lcom/android/internal/compat/CompatibilityChangeConfig$1;
 Lcom/android/internal/compat/CompatibilityChangeConfig;
 Lcom/android/internal/compat/CompatibilityChangeInfo$1;
 Lcom/android/internal/compat/CompatibilityChangeInfo;
+Lcom/android/internal/compat/IOverrideValidator$Stub;
 Lcom/android/internal/compat/IOverrideValidator;
 Lcom/android/internal/compat/IPlatformCompat$Stub$Proxy;
 Lcom/android/internal/compat/IPlatformCompat$Stub;
@@ -53036,8 +48607,10 @@
 Lcom/android/internal/infra/AndroidFuture$2;
 Lcom/android/internal/infra/AndroidFuture;
 Lcom/android/internal/infra/GlobalWhitelistState;
+Lcom/android/internal/infra/IAndroidFuture$Stub$Proxy;
 Lcom/android/internal/infra/IAndroidFuture$Stub;
 Lcom/android/internal/infra/IAndroidFuture;
+Lcom/android/internal/infra/PerUser;
 Lcom/android/internal/infra/RemoteStream$1;
 Lcom/android/internal/infra/RemoteStream;
 Lcom/android/internal/infra/ServiceConnector$Impl$CompletionAwareJob;
@@ -53069,9 +48642,12 @@
 Lcom/android/internal/location/ProviderProperties$1;
 Lcom/android/internal/location/ProviderProperties;
 Lcom/android/internal/location/ProviderRequest$1;
+Lcom/android/internal/location/ProviderRequest$Builder;
 Lcom/android/internal/location/ProviderRequest;
+Lcom/android/internal/location/gnssmetrics/GnssMetrics$1;
 Lcom/android/internal/location/gnssmetrics/GnssMetrics$GnssPowerMetrics;
 Lcom/android/internal/location/gnssmetrics/GnssMetrics$Statistics;
+Lcom/android/internal/location/gnssmetrics/GnssMetrics$StatsPullAtomCallbackImpl;
 Lcom/android/internal/location/gnssmetrics/GnssMetrics;
 Lcom/android/internal/location/nano/GnssLogsProto$GnssLog;
 Lcom/android/internal/location/nano/GnssLogsProto$PowerMetrics;
@@ -53079,8 +48655,12 @@
 Lcom/android/internal/logging/AndroidHandler$1;
 Lcom/android/internal/logging/AndroidHandler;
 Lcom/android/internal/logging/EventLogTags;
+Lcom/android/internal/logging/InstanceId$1;
 Lcom/android/internal/logging/InstanceId;
 Lcom/android/internal/logging/MetricsLogger;
+Lcom/android/internal/logging/UiEventLogger$UiEventEnum;
+Lcom/android/internal/logging/UiEventLogger;
+Lcom/android/internal/logging/UiEventLoggerImpl;
 Lcom/android/internal/net/INetworkWatchlistManager$Stub$Proxy;
 Lcom/android/internal/net/INetworkWatchlistManager$Stub;
 Lcom/android/internal/net/INetworkWatchlistManager;
@@ -53278,11 +48858,15 @@
 Lcom/android/internal/os/ZygoteServer;
 Lcom/android/internal/os/logging/MetricsLoggerWrapper;
 Lcom/android/internal/policy/-$$Lambda$PhoneWindow$9SyKQeTuaYx7qUIMJIr4Lk2OpYw;
+Lcom/android/internal/policy/-$$Lambda$PhoneWindow$F9lizKYeW8CQHD_8FLjKaBpUfBQ;
 Lcom/android/internal/policy/BackdropFrameRenderer;
 Lcom/android/internal/policy/DecorContext;
 Lcom/android/internal/policy/DecorView$1;
 Lcom/android/internal/policy/DecorView$2;
 Lcom/android/internal/policy/DecorView$3;
+Lcom/android/internal/policy/DecorView$6;
+Lcom/android/internal/policy/DecorView$ActionModeCallback2Wrapper$1;
+Lcom/android/internal/policy/DecorView$ActionModeCallback2Wrapper;
 Lcom/android/internal/policy/DecorView$ColorViewAttributes;
 Lcom/android/internal/policy/DecorView$ColorViewState;
 Lcom/android/internal/policy/DecorView;
@@ -53373,8 +48957,6 @@
 Lcom/android/internal/telephony/-$$Lambda$RIL$Ir4pOMTf7R0Jtw4O3F7JgMVtXO4;
 Lcom/android/internal/telephony/-$$Lambda$RIL$ZGWeCQ9boMO1_J1_yQ82l_jK-Nc;
 Lcom/android/internal/telephony/-$$Lambda$RIL$zYsQZAc3z9bM5fCaq_J0dn5kjjo;
-Lcom/android/internal/telephony/-$$Lambda$RILConstants$ODSbRKyUeaOFMcez-ZudOmaKCBw;
-Lcom/android/internal/telephony/-$$Lambda$RILConstants$zIAjDPNpW8a5C22QbMmMwM64vD8;
 Lcom/android/internal/telephony/-$$Lambda$RILRequest$VaC9ddQXT8qxCl7rcNKtUadFQoI;
 Lcom/android/internal/telephony/-$$Lambda$RadioIndication$GND6XxOOm1d_Ro76zEUFjA9OrEA;
 Lcom/android/internal/telephony/-$$Lambda$SmsApplication$5KAxbm71Dll9xmT5zeXi0i27A10;
@@ -53439,8 +49021,6 @@
 Lcom/android/internal/telephony/CarrierSignalAgent;
 Lcom/android/internal/telephony/CarrierSmsUtils;
 Lcom/android/internal/telephony/CellBroadcastServiceManager;
-Lcom/android/internal/telephony/CellNetworkScanResult$1;
-Lcom/android/internal/telephony/CellNetworkScanResult;
 Lcom/android/internal/telephony/CellularNetworkService$CellularNetworkServiceProvider$1;
 Lcom/android/internal/telephony/CellularNetworkService$CellularNetworkServiceProvider;
 Lcom/android/internal/telephony/CellularNetworkService;
@@ -53454,8 +49034,6 @@
 Lcom/android/internal/telephony/Connection$Listener;
 Lcom/android/internal/telephony/Connection$PostDialState;
 Lcom/android/internal/telephony/Connection;
-Lcom/android/internal/telephony/DctConstants$Activity;
-Lcom/android/internal/telephony/DctConstants$State;
 Lcom/android/internal/telephony/DebugService;
 Lcom/android/internal/telephony/DefaultPhoneNotifier$1;
 Lcom/android/internal/telephony/DefaultPhoneNotifier;
@@ -53467,9 +49045,6 @@
 Lcom/android/internal/telephony/DriverCall$State;
 Lcom/android/internal/telephony/DriverCall;
 Lcom/android/internal/telephony/EncodeException;
-Lcom/android/internal/telephony/ExponentialBackoff$1;
-Lcom/android/internal/telephony/ExponentialBackoff$HandlerAdapter;
-Lcom/android/internal/telephony/ExponentialBackoff;
 Lcom/android/internal/telephony/GlobalSettingsHelper;
 Lcom/android/internal/telephony/GsmAlphabet$TextEncodingDetails;
 Lcom/android/internal/telephony/GsmAlphabet;
@@ -53490,21 +49065,12 @@
 Lcom/android/internal/telephony/HbpcdLookup$MccLookup;
 Lcom/android/internal/telephony/HbpcdUtils;
 Lcom/android/internal/telephony/HexDump;
-Lcom/android/internal/telephony/ICarrierConfigLoader$Stub$Proxy;
-Lcom/android/internal/telephony/ICarrierConfigLoader$Stub;
-Lcom/android/internal/telephony/ICarrierConfigLoader;
 Lcom/android/internal/telephony/IIccPhoneBook$Stub$Proxy;
 Lcom/android/internal/telephony/IIccPhoneBook$Stub;
 Lcom/android/internal/telephony/IIccPhoneBook;
-Lcom/android/internal/telephony/IIntegerConsumer$Stub$Proxy;
-Lcom/android/internal/telephony/IIntegerConsumer$Stub;
-Lcom/android/internal/telephony/IIntegerConsumer;
 Lcom/android/internal/telephony/IMms$Stub$Proxy;
 Lcom/android/internal/telephony/IMms$Stub;
 Lcom/android/internal/telephony/IMms;
-Lcom/android/internal/telephony/INumberVerificationCallback$Stub$Proxy;
-Lcom/android/internal/telephony/INumberVerificationCallback$Stub;
-Lcom/android/internal/telephony/INumberVerificationCallback;
 Lcom/android/internal/telephony/IOnSubscriptionsChangedListener$Stub$Proxy;
 Lcom/android/internal/telephony/IOnSubscriptionsChangedListener$Stub;
 Lcom/android/internal/telephony/IOnSubscriptionsChangedListener;
@@ -53514,30 +49080,12 @@
 Lcom/android/internal/telephony/IPhoneStateListener$Stub$Proxy;
 Lcom/android/internal/telephony/IPhoneStateListener$Stub;
 Lcom/android/internal/telephony/IPhoneStateListener;
-Lcom/android/internal/telephony/IPhoneSubInfo$Stub$Proxy;
-Lcom/android/internal/telephony/IPhoneSubInfo$Stub;
-Lcom/android/internal/telephony/IPhoneSubInfo;
-Lcom/android/internal/telephony/ISetOpportunisticDataCallback$Stub$Proxy;
-Lcom/android/internal/telephony/ISetOpportunisticDataCallback$Stub;
-Lcom/android/internal/telephony/ISetOpportunisticDataCallback;
-Lcom/android/internal/telephony/ISms$Stub$Proxy;
-Lcom/android/internal/telephony/ISms$Stub;
-Lcom/android/internal/telephony/ISms;
-Lcom/android/internal/telephony/ISmsImplBase;
 Lcom/android/internal/telephony/IState;
-Lcom/android/internal/telephony/ISub$Stub$Proxy;
-Lcom/android/internal/telephony/ISub$Stub;
-Lcom/android/internal/telephony/ISub;
-Lcom/android/internal/telephony/ITelephony$Stub$Proxy;
-Lcom/android/internal/telephony/ITelephony$Stub;
-Lcom/android/internal/telephony/ITelephony;
 Lcom/android/internal/telephony/ITelephonyRegistry$Stub$Proxy;
 Lcom/android/internal/telephony/ITelephonyRegistry$Stub;
 Lcom/android/internal/telephony/ITelephonyRegistry;
 Lcom/android/internal/telephony/IUpdateAvailableNetworksCallback;
-Lcom/android/internal/telephony/IWapPushManager;
 Lcom/android/internal/telephony/IccCard;
-Lcom/android/internal/telephony/IccCardConstants$State;
 Lcom/android/internal/telephony/IccPhoneBookInterfaceManager$1;
 Lcom/android/internal/telephony/IccPhoneBookInterfaceManager$Request;
 Lcom/android/internal/telephony/IccPhoneBookInterfaceManager;
@@ -53597,18 +49145,11 @@
 Lcom/android/internal/telephony/NitzStateMachineImpl;
 Lcom/android/internal/telephony/OemHookIndication;
 Lcom/android/internal/telephony/OemHookResponse;
-Lcom/android/internal/telephony/OperatorInfo$1;
-Lcom/android/internal/telephony/OperatorInfo$State;
-Lcom/android/internal/telephony/OperatorInfo;
 Lcom/android/internal/telephony/Phone$1;
 Lcom/android/internal/telephony/Phone;
 Lcom/android/internal/telephony/PhoneConfigurationManager$ConfigManagerHandler;
 Lcom/android/internal/telephony/PhoneConfigurationManager$MockableInterface;
 Lcom/android/internal/telephony/PhoneConfigurationManager;
-Lcom/android/internal/telephony/PhoneConstantConversions$1;
-Lcom/android/internal/telephony/PhoneConstantConversions;
-Lcom/android/internal/telephony/PhoneConstants$DataState;
-Lcom/android/internal/telephony/PhoneConstants$State;
 Lcom/android/internal/telephony/PhoneFactory;
 Lcom/android/internal/telephony/PhoneInternalInterface$DataActivityState;
 Lcom/android/internal/telephony/PhoneInternalInterface$DialArgs$Builder;
@@ -53632,7 +49173,6 @@
 Lcom/android/internal/telephony/RIL$RadioProxyDeathRecipient;
 Lcom/android/internal/telephony/RIL$RilHandler;
 Lcom/android/internal/telephony/RIL;
-Lcom/android/internal/telephony/RILConstants;
 Lcom/android/internal/telephony/RILRequest;
 Lcom/android/internal/telephony/RadioBugDetector;
 Lcom/android/internal/telephony/RadioCapability;
@@ -53677,10 +49217,11 @@
 Lcom/android/internal/telephony/SmsDispatchersController$1;
 Lcom/android/internal/telephony/SmsDispatchersController;
 Lcom/android/internal/telephony/SmsHeader$ConcatRef;
+Lcom/android/internal/telephony/SmsHeader$MiscElt;
 Lcom/android/internal/telephony/SmsHeader$PortAddrs;
+Lcom/android/internal/telephony/SmsHeader$SpecialSmsMsg;
 Lcom/android/internal/telephony/SmsHeader;
 Lcom/android/internal/telephony/SmsMessageBase$SubmitPduBase;
-Lcom/android/internal/telephony/SmsMessageBase;
 Lcom/android/internal/telephony/SmsNumberUtils$NumberEntry;
 Lcom/android/internal/telephony/SmsNumberUtils;
 Lcom/android/internal/telephony/SmsPermissions;
@@ -53710,7 +49251,6 @@
 Lcom/android/internal/telephony/TimeServiceHelper;
 Lcom/android/internal/telephony/TimeUtils;
 Lcom/android/internal/telephony/TimeZoneLookupHelper$CountryResult;
-Lcom/android/internal/telephony/TimeZoneLookupHelper$OffsetResult;
 Lcom/android/internal/telephony/TimeZoneLookupHelper;
 Lcom/android/internal/telephony/UUSInfo;
 Lcom/android/internal/telephony/UiccPhoneBookController;
@@ -53771,7 +49311,7 @@
 Lcom/android/internal/telephony/cdma/EriInfo;
 Lcom/android/internal/telephony/cdma/EriManager$EriFile;
 Lcom/android/internal/telephony/cdma/EriManager;
-Lcom/android/internal/telephony/cdma/SmsMessage;
+Lcom/android/internal/telephony/cdma/sms/BearerData$CodingException;
 Lcom/android/internal/telephony/cdma/sms/BearerData$TimeStamp;
 Lcom/android/internal/telephony/cdma/sms/BearerData;
 Lcom/android/internal/telephony/cdma/sms/CdmaSmsAddress;
@@ -53886,11 +49426,6 @@
 Lcom/android/internal/telephony/euicc/EuiccController$3;
 Lcom/android/internal/telephony/euicc/EuiccController;
 Lcom/android/internal/telephony/euicc/IEuiccCardController$Stub$Proxy;
-Lcom/android/internal/telephony/euicc/IEuiccCardController$Stub;
-Lcom/android/internal/telephony/euicc/IEuiccCardController;
-Lcom/android/internal/telephony/euicc/IEuiccController$Stub$Proxy;
-Lcom/android/internal/telephony/euicc/IEuiccController$Stub;
-Lcom/android/internal/telephony/euicc/IEuiccController;
 Lcom/android/internal/telephony/euicc/IGetAllProfilesCallback$Stub;
 Lcom/android/internal/telephony/euicc/IGetAllProfilesCallback;
 Lcom/android/internal/telephony/euicc/IGetEuiccInfo1Callback$Stub;
@@ -53901,9 +49436,7 @@
 Lcom/android/internal/telephony/gsm/GsmSMSDispatcher;
 Lcom/android/internal/telephony/gsm/GsmSmsAddress;
 Lcom/android/internal/telephony/gsm/SimTlv;
-Lcom/android/internal/telephony/gsm/SmsBroadcastConfigInfo;
 Lcom/android/internal/telephony/gsm/SmsMessage$PduParser;
-Lcom/android/internal/telephony/gsm/SmsMessage;
 Lcom/android/internal/telephony/gsm/SuppServiceNotification;
 Lcom/android/internal/telephony/gsm/UsimDataDownloadHandler;
 Lcom/android/internal/telephony/gsm/UsimPhoneBookManager$File;
@@ -53938,11 +49471,6 @@
 Lcom/android/internal/telephony/ims/ImsServiceFeatureQueryManager$ImsServiceFeatureQuery;
 Lcom/android/internal/telephony/ims/ImsServiceFeatureQueryManager$Listener;
 Lcom/android/internal/telephony/ims/ImsServiceFeatureQueryManager;
-Lcom/android/internal/telephony/ims/RcsEventQueryHelper;
-Lcom/android/internal/telephony/ims/RcsMessageController;
-Lcom/android/internal/telephony/ims/RcsMessageQueryHelper;
-Lcom/android/internal/telephony/ims/RcsMessageStoreUtil;
-Lcom/android/internal/telephony/ims/RcsParticipantQueryHelper;
 Lcom/android/internal/telephony/imsphone/-$$Lambda$ImsPhoneCallTracker$QlPVd_3u4_verjHUDnkn6zaSe54;
 Lcom/android/internal/telephony/imsphone/-$$Lambda$ImsPhoneCallTracker$Zw03itjXT6-LrhiYuD-9nKFg2Wg;
 Lcom/android/internal/telephony/imsphone/ImsExternalCallTracker$1;
@@ -53983,6 +49511,7 @@
 Lcom/android/internal/telephony/imsphone/ImsPhoneFactory;
 Lcom/android/internal/telephony/imsphone/ImsPhoneMmiCode;
 Lcom/android/internal/telephony/imsphone/ImsPullCall;
+Lcom/android/internal/telephony/imsphone/ImsRegistrationCallbackHelper$ImsRegistrationUpdate;
 Lcom/android/internal/telephony/metrics/-$$Lambda$TelephonyMetrics$fLmZDbNadlr6LF7zSJ6jCR1AAsk;
 Lcom/android/internal/telephony/metrics/-$$Lambda$TelephonyMetrics$tQOsX1lKb2eTuPp-1rpkeIAEOoY;
 Lcom/android/internal/telephony/metrics/-$$Lambda$TelephonyMetrics$x2dJi76S2YQdpSTfY8RZ8qC_K6g;
@@ -54068,7 +49597,6 @@
 Lcom/android/internal/telephony/uicc/IccServiceTable;
 Lcom/android/internal/telephony/uicc/IccSlotStatus$SlotState;
 Lcom/android/internal/telephony/uicc/IccSlotStatus;
-Lcom/android/internal/telephony/uicc/IccUtils;
 Lcom/android/internal/telephony/uicc/IccVmNotSupportedException;
 Lcom/android/internal/telephony/uicc/InstallCarrierAppTrampolineActivity;
 Lcom/android/internal/telephony/uicc/InstallCarrierAppUtils;
@@ -54114,19 +49642,14 @@
 Lcom/android/internal/telephony/uicc/UsimServiceTable$UsimService;
 Lcom/android/internal/telephony/uicc/UsimServiceTable;
 Lcom/android/internal/telephony/uicc/VoiceMailConstants;
-Lcom/android/internal/telephony/uicc/asn1/InvalidAsn1DataException;
-Lcom/android/internal/telephony/uicc/asn1/TagNotFoundException;
 Lcom/android/internal/telephony/uicc/euicc/EuiccCard;
 Lcom/android/internal/telephony/uicc/euicc/EuiccSpecVersion;
 Lcom/android/internal/telephony/util/ArrayUtils;
-Lcom/android/internal/telephony/util/HandlerExecutor;
 Lcom/android/internal/telephony/util/NotificationChannelController$1;
 Lcom/android/internal/telephony/util/NotificationChannelController;
-Lcom/android/internal/telephony/util/RemoteCallbackListExt;
 Lcom/android/internal/telephony/util/SMSDispatcherUtil;
 Lcom/android/internal/telephony/util/TelephonyUtils;
 Lcom/android/internal/telephony/util/VoicemailNotificationSettingsUtil;
-Lcom/android/internal/telephony/util/XmlUtils;
 Lcom/android/internal/textservice/ISpellCheckerService$Stub$Proxy;
 Lcom/android/internal/textservice/ISpellCheckerService$Stub;
 Lcom/android/internal/textservice/ISpellCheckerService;
@@ -54145,7 +49668,12 @@
 Lcom/android/internal/textservice/ITextServicesSessionListener$Stub$Proxy;
 Lcom/android/internal/textservice/ITextServicesSessionListener$Stub;
 Lcom/android/internal/textservice/ITextServicesSessionListener;
+Lcom/android/internal/transition/EpicenterTranslateClipReveal$1;
+Lcom/android/internal/transition/EpicenterTranslateClipReveal$State;
+Lcom/android/internal/transition/EpicenterTranslateClipReveal$StateEvaluator;
+Lcom/android/internal/transition/EpicenterTranslateClipReveal$StateProperty;
 Lcom/android/internal/transition/EpicenterTranslateClipReveal;
+Lcom/android/internal/transition/TransitionConstants;
 Lcom/android/internal/usb/DumpUtils;
 Lcom/android/internal/util/-$$Lambda$DumpUtils$D1OlZP6xIpu72ypnJd0fzx0wd6I;
 Lcom/android/internal/util/-$$Lambda$DumpUtils$X8irOs5hfloCKy89_l1HRA1QeG0;
@@ -54166,6 +49694,7 @@
 Lcom/android/internal/util/AsyncChannel;
 Lcom/android/internal/util/BitUtils;
 Lcom/android/internal/util/BitwiseInputStream$AccessException;
+Lcom/android/internal/util/BitwiseOutputStream$AccessException;
 Lcom/android/internal/util/CollectionUtils;
 Lcom/android/internal/util/ConcurrentUtils$1$1;
 Lcom/android/internal/util/ConcurrentUtils$1;
@@ -54176,6 +49705,7 @@
 Lcom/android/internal/util/DumpUtils$1;
 Lcom/android/internal/util/DumpUtils$Dump;
 Lcom/android/internal/util/DumpUtils;
+Lcom/android/internal/util/EmergencyAffordanceManager;
 Lcom/android/internal/util/ExponentiallyBucketedHistogram;
 Lcom/android/internal/util/FastMath;
 Lcom/android/internal/util/FastPrintWriter$DummyWriter;
@@ -54196,6 +49726,7 @@
 Lcom/android/internal/util/GrowingArrayUtils;
 Lcom/android/internal/util/HexDump;
 Lcom/android/internal/util/IState;
+Lcom/android/internal/util/ImageUtils;
 Lcom/android/internal/util/IndentingPrintWriter;
 Lcom/android/internal/util/IntPair;
 Lcom/android/internal/util/JournaledFile;
@@ -54236,6 +49767,7 @@
 Lcom/android/internal/util/SyncResultReceiver;
 Lcom/android/internal/util/ToBooleanFunction;
 Lcom/android/internal/util/TokenBucket;
+Lcom/android/internal/util/TraceBuffer;
 Lcom/android/internal/util/UserIcons;
 Lcom/android/internal/util/VirtualRefBasePtr;
 Lcom/android/internal/util/WakeupMessage;
@@ -54289,11 +49821,17 @@
 Lcom/android/internal/util/function/pooled/PooledSupplier$OfInt;
 Lcom/android/internal/util/function/pooled/PooledSupplier$OfLong;
 Lcom/android/internal/util/function/pooled/PooledSupplier;
+Lcom/android/internal/view/-$$Lambda$FloatingActionMode$LU5MpPuKYDtwlFAuYhXYfzgLNLE;
 Lcom/android/internal/view/ActionBarPolicy;
 Lcom/android/internal/view/AppearanceRegion$1;
 Lcom/android/internal/view/AppearanceRegion;
 Lcom/android/internal/view/BaseIWindow;
 Lcom/android/internal/view/BaseSurfaceHolder;
+Lcom/android/internal/view/FloatingActionMode$1;
+Lcom/android/internal/view/FloatingActionMode$2;
+Lcom/android/internal/view/FloatingActionMode$3;
+Lcom/android/internal/view/FloatingActionMode$FloatingToolbarVisibilityHelper;
+Lcom/android/internal/view/FloatingActionMode;
 Lcom/android/internal/view/IInlineSuggestionsRequestCallback$Stub;
 Lcom/android/internal/view/IInlineSuggestionsRequestCallback;
 Lcom/android/internal/view/IInputConnectionWrapper$MyHandler;
@@ -54331,6 +49869,7 @@
 Lcom/android/internal/view/RotationPolicy;
 Lcom/android/internal/view/SurfaceCallbackHelper$1;
 Lcom/android/internal/view/SurfaceCallbackHelper;
+Lcom/android/internal/view/SurfaceFlingerVsyncChoreographer;
 Lcom/android/internal/view/TooltipPopup;
 Lcom/android/internal/view/WindowManagerPolicyThread;
 Lcom/android/internal/view/animation/FallbackLUTInterpolator;
@@ -54358,6 +49897,14 @@
 Lcom/android/internal/view/menu/MenuView;
 Lcom/android/internal/view/menu/ShowableListMenu;
 Lcom/android/internal/widget/-$$Lambda$FloatingToolbar$7-enOzxeypZYfdFYr1HzBLfj47k;
+Lcom/android/internal/widget/-$$Lambda$FloatingToolbar$FloatingToolbarPopup$-uEfRwR-_1oHxMvRVdmbNRdukDM;
+Lcom/android/internal/widget/-$$Lambda$FloatingToolbar$FloatingToolbarPopup$77YZy6kisO5OnjlgtKp0Zi1V8EY;
+Lcom/android/internal/widget/-$$Lambda$FloatingToolbar$FloatingToolbarPopup$E8FwnPCl7gZpcTlX_UaRPIBRnT0;
+Lcom/android/internal/widget/-$$Lambda$FloatingToolbar$LutnsyBKrZiroTBekgIjhIyrl40;
+Lcom/android/internal/widget/-$$Lambda$MessagingPropertyAnimator$7coWc0tjIUC7grCXucNFbpYTxDI;
+Lcom/android/internal/widget/-$$Lambda$NotificationActionListLayout$uFZFEmIEBpI3kn6c3tNvvgmMSv8;
+Lcom/android/internal/widget/-$$Lambda$TTC7hNz7BTsLwhNRb2L5kl-7mdU;
+Lcom/android/internal/widget/-$$Lambda$gPQuiuEDuOmrh2MixBcV6a5gu5s;
 Lcom/android/internal/widget/AbsActionBarView$VisibilityAnimListener;
 Lcom/android/internal/widget/AbsActionBarView;
 Lcom/android/internal/widget/ActionBarContainer$ActionBarBackgroundDrawable;
@@ -54371,12 +49918,26 @@
 Lcom/android/internal/widget/ActionBarOverlayLayout$ActionBarVisibilityCallback;
 Lcom/android/internal/widget/ActionBarOverlayLayout$LayoutParams;
 Lcom/android/internal/widget/ActionBarOverlayLayout;
+Lcom/android/internal/widget/AlertDialogLayout;
 Lcom/android/internal/widget/BackgroundFallback;
+Lcom/android/internal/widget/ButtonBarLayout;
+Lcom/android/internal/widget/CachingIconView;
 Lcom/android/internal/widget/DecorCaptionView;
 Lcom/android/internal/widget/DecorContentParent;
 Lcom/android/internal/widget/DecorToolbar;
 Lcom/android/internal/widget/DialogTitle;
 Lcom/android/internal/widget/EditableInputConnection;
+Lcom/android/internal/widget/FloatingToolbar$1;
+Lcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup$11;
+Lcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup$12;
+Lcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup$13;
+Lcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup$1;
+Lcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup$2;
+Lcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup$3;
+Lcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup$4;
+Lcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup$LogAccelerateInterpolator;
+Lcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup$OverflowPanel;
+Lcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup$OverflowPanelViewHelper;
 Lcom/android/internal/widget/FloatingToolbar$FloatingToolbarPopup;
 Lcom/android/internal/widget/FloatingToolbar;
 Lcom/android/internal/widget/ICheckCredentialProgressCallback$Stub$Proxy;
@@ -54385,7 +49946,12 @@
 Lcom/android/internal/widget/ILockSettings$Stub$Proxy;
 Lcom/android/internal/widget/ILockSettings$Stub;
 Lcom/android/internal/widget/ILockSettings;
+Lcom/android/internal/widget/ImageFloatingTextView;
+Lcom/android/internal/widget/LockPatternChecker$2;
+Lcom/android/internal/widget/LockPatternChecker$OnCheckCallback;
+Lcom/android/internal/widget/LockPatternChecker;
 Lcom/android/internal/widget/LockPatternUtils$2;
+Lcom/android/internal/widget/LockPatternUtils$CheckCredentialProgressCallback;
 Lcom/android/internal/widget/LockPatternUtils$RequestThrottledException;
 Lcom/android/internal/widget/LockPatternUtils$StrongAuthTracker$1;
 Lcom/android/internal/widget/LockPatternUtils$StrongAuthTracker$H;
@@ -54395,13 +49961,25 @@
 Lcom/android/internal/widget/LockSettingsInternal;
 Lcom/android/internal/widget/LockscreenCredential$1;
 Lcom/android/internal/widget/LockscreenCredential;
+Lcom/android/internal/widget/MessagingGroup;
+Lcom/android/internal/widget/MessagingImageMessage;
+Lcom/android/internal/widget/MessagingLinearLayout$MessagingChild;
+Lcom/android/internal/widget/MessagingMessage;
+Lcom/android/internal/widget/MessagingPropertyAnimator$1;
+Lcom/android/internal/widget/MessagingPropertyAnimator;
+Lcom/android/internal/widget/MessagingTextMessage;
+Lcom/android/internal/widget/NotificationActionListLayout;
+Lcom/android/internal/widget/NotificationExpandButton;
 Lcom/android/internal/widget/PasswordValidationError;
+Lcom/android/internal/widget/RemeasuringLinearLayout;
 Lcom/android/internal/widget/ScrollBarUtils;
 Lcom/android/internal/widget/ScrollingTabContainerView;
 Lcom/android/internal/widget/ToolbarWidgetWrapper$1;
 Lcom/android/internal/widget/ToolbarWidgetWrapper;
 Lcom/android/internal/widget/VerifyCredentialResponse$1;
 Lcom/android/internal/widget/VerifyCredentialResponse;
+Lcom/android/internal/widget/ViewClippingUtil$ClippingParameters;
+Lcom/android/internal/widget/ViewClippingUtil;
 Lcom/android/okhttp/Address;
 Lcom/android/okhttp/AndroidShimResponseCache;
 Lcom/android/okhttp/Authenticator;
@@ -54551,6 +50129,8 @@
 Lcom/android/org/bouncycastle/asn1/ASN1SequenceParser;
 Lcom/android/org/bouncycastle/asn1/ASN1Set;
 Lcom/android/org/bouncycastle/asn1/ASN1String;
+Lcom/android/org/bouncycastle/asn1/ASN1TaggedObject;
+Lcom/android/org/bouncycastle/asn1/ASN1TaggedObjectParser;
 Lcom/android/org/bouncycastle/asn1/BERTags;
 Lcom/android/org/bouncycastle/asn1/DERBitString;
 Lcom/android/org/bouncycastle/asn1/DERFactory;
@@ -54559,6 +50139,7 @@
 Lcom/android/org/bouncycastle/asn1/DEROutputStream;
 Lcom/android/org/bouncycastle/asn1/DERSequence;
 Lcom/android/org/bouncycastle/asn1/DERSet;
+Lcom/android/org/bouncycastle/asn1/DERTaggedObject;
 Lcom/android/org/bouncycastle/asn1/DLSequence;
 Lcom/android/org/bouncycastle/asn1/DefiniteLengthInputStream;
 Lcom/android/org/bouncycastle/asn1/InMemoryRepresentable;
@@ -54572,12 +50153,14 @@
 Lcom/android/org/bouncycastle/asn1/nist/NISTObjectIdentifiers;
 Lcom/android/org/bouncycastle/asn1/oiw/OIWObjectIdentifiers;
 Lcom/android/org/bouncycastle/asn1/pkcs/PKCSObjectIdentifiers;
+Lcom/android/org/bouncycastle/asn1/x500/X500Name;
 Lcom/android/org/bouncycastle/asn1/x509/AlgorithmIdentifier;
 Lcom/android/org/bouncycastle/asn1/x509/Certificate;
 Lcom/android/org/bouncycastle/asn1/x509/DSAParameter;
 Lcom/android/org/bouncycastle/asn1/x509/SubjectPublicKeyInfo;
 Lcom/android/org/bouncycastle/asn1/x509/Time;
 Lcom/android/org/bouncycastle/asn1/x509/V3TBSCertificateGenerator;
+Lcom/android/org/bouncycastle/asn1/x509/X509ExtensionsGenerator;
 Lcom/android/org/bouncycastle/asn1/x509/X509Name;
 Lcom/android/org/bouncycastle/asn1/x509/X509ObjectIdentifiers;
 Lcom/android/org/bouncycastle/asn1/x9/X9ECParameters;
@@ -54639,6 +50222,7 @@
 Lcom/android/org/bouncycastle/jcajce/provider/asymmetric/util/BaseCipherSpi;
 Lcom/android/org/bouncycastle/jcajce/provider/asymmetric/util/BaseKeyFactorySpi;
 Lcom/android/org/bouncycastle/jcajce/provider/asymmetric/util/KeyUtil;
+Lcom/android/org/bouncycastle/jcajce/provider/asymmetric/x509/CertificateFactory;
 Lcom/android/org/bouncycastle/jcajce/provider/config/ConfigurableProvider;
 Lcom/android/org/bouncycastle/jcajce/provider/config/ProviderConfiguration;
 Lcom/android/org/bouncycastle/jcajce/provider/config/ProviderConfigurationPermission;
@@ -54791,7 +50375,6 @@
 Lcom/android/server/usage/AppStandbyInternal$AppIdleStateChangeListener;
 Lcom/android/server/usage/AppStandbyInternal;
 Lcom/android/server/wm/nano/WindowManagerProtos$TaskSnapshotProto;
-Lcom/android/telephony/Rlog;
 Lcom/google/android/collect/Lists;
 Lcom/google/android/collect/Maps;
 Lcom/google/android/collect/Sets;
@@ -54950,6 +50533,7 @@
 Ljava/io/Serializable;
 Ljava/io/SerializablePermission;
 Ljava/io/StreamCorruptedException;
+Ljava/io/StringBufferInputStream;
 Ljava/io/StringReader;
 Ljava/io/StringWriter;
 Ljava/io/UTFDataFormatException;
@@ -55216,6 +50800,8 @@
 Ljava/net/AddressCache$AddressCacheEntry;
 Ljava/net/AddressCache$AddressCacheKey;
 Ljava/net/AddressCache;
+Ljava/net/Authenticator$RequestorType;
+Ljava/net/Authenticator;
 Ljava/net/ConnectException;
 Ljava/net/CookieHandler;
 Ljava/net/CookieManager$CookiePathComparator;
@@ -55267,6 +50853,7 @@
 Ljava/net/NetworkInterface;
 Ljava/net/NoRouteToHostException;
 Ljava/net/Parts;
+Ljava/net/PasswordAuthentication;
 Ljava/net/PlainDatagramSocketImpl;
 Ljava/net/PlainSocketImpl;
 Ljava/net/PortUnreachableException;
@@ -55918,7 +51505,6 @@
 Ljava/util/Queue;
 Ljava/util/Random;
 Ljava/util/RandomAccess;
-Ljava/util/RandomAccessSubList;
 Ljava/util/RegularEnumSet$EnumSetIterator;
 Ljava/util/RegularEnumSet;
 Ljava/util/ResourceBundle$1;
@@ -55957,8 +51543,6 @@
 Ljava/util/Stack;
 Ljava/util/StringJoiner;
 Ljava/util/StringTokenizer;
-Ljava/util/SubList$1;
-Ljava/util/SubList;
 Ljava/util/TaskQueue;
 Ljava/util/TimSort;
 Ljava/util/TimeZone;
@@ -56531,6 +52115,7 @@
 Ljavax/xml/parsers/SAXParserFactory;
 Ljdk/internal/util/Preconditions;
 Llibcore/content/type/-$$Lambda$MimeMap$xJ95jeANwfbnj45hvSUmlPtZWWg;
+Llibcore/content/type/MimeMap$Builder;
 Llibcore/content/type/MimeMap$MemoizingSupplier;
 Llibcore/content/type/MimeMap;
 Llibcore/icu/DateIntervalFormat;
@@ -56590,8 +52175,6 @@
 Llibcore/timezone/TimeZoneFinder$TimeZonesProcessor;
 Llibcore/timezone/TimeZoneFinder;
 Llibcore/timezone/ZoneInfoDB$1;
-Llibcore/timezone/ZoneInfoDB$TzData$1;
-Llibcore/timezone/ZoneInfoDB$TzData;
 Llibcore/timezone/ZoneInfoDB;
 Llibcore/timezone/ZoneInfoDb$1;
 Llibcore/timezone/ZoneInfoDb;
diff --git a/config/preloaded-classes b/config/preloaded-classes
index d5fba70..bd235b8 100644
--- a/config/preloaded-classes
+++ b/config/preloaded-classes
@@ -135,6 +135,7 @@
 android.animation.PropertyValuesHolder$PropertyValues
 android.animation.PropertyValuesHolder
 android.animation.RectEvaluator
+android.animation.RevealAnimator
 android.animation.StateListAnimator$1
 android.animation.StateListAnimator$StateListAnimatorConstantState
 android.animation.StateListAnimator$Tuple
@@ -147,6 +148,7 @@
 android.animation.ValueAnimator$AnimatorUpdateListener
 android.animation.ValueAnimator
 android.annotation.ColorInt
+android.annotation.CurrentTimeMillisLong
 android.annotation.IntRange
 android.annotation.NonNull
 android.annotation.SystemApi
@@ -177,11 +179,13 @@
 android.app.-$$Lambda$Notification$hOCsSZH8tWalFSbIzQ9x9IcPa9M
 android.app.-$$Lambda$ResourcesManager$QJ7UiVk_XS90KuXAsIjIEym1DnM
 android.app.-$$Lambda$SharedPreferencesImpl$EditorImpl$3CAjkhzA131V3V-sLfP2uy0FWZ0
+android.app.-$$Lambda$SystemServiceRegistry$16$s6mZ42tuGUunhKa_5iwjLY5FGdM
 android.app.-$$Lambda$SystemServiceRegistry$17$DBwvhMLzjNnBFkaOY1OxllrybH4
 android.app.-$$Lambda$WallpaperManager$Globals$1AcnQUORvPlCjJoNqdxfQT4o4Nw
 android.app.-$$Lambda$WallpaperManager$Globals$2yG7V1sbMECCnlFTLyjKWKqNoYI
 android.app.-$$Lambda$ZsFzoG2loyqNOR2cNbo-thrNK5c
 android.app.-$$Lambda$oslF4K8Uk6v-6nTRoaEpCmfAptE
+android.app.-$$Lambda$thfU5Zh-cKOR8p7IfITtlg111Go
 android.app.ActionBar$LayoutParams
 android.app.ActionBar
 android.app.Activity$1
@@ -211,6 +215,7 @@
 android.app.ActivityManager$TaskDescription$1
 android.app.ActivityManager$TaskDescription
 android.app.ActivityManager$TaskSnapshot$1
+android.app.ActivityManager$TaskSnapshot$Builder
 android.app.ActivityManager$TaskSnapshot
 android.app.ActivityManager$UidObserver
 android.app.ActivityManager
@@ -263,8 +268,10 @@
 android.app.AppOpsManager$1
 android.app.AppOpsManager$2
 android.app.AppOpsManager$3
-android.app.AppOpsManager$AppOpsCollector$1
+android.app.AppOpsManager$4
 android.app.AppOpsManager$AppOpsCollector
+android.app.AppOpsManager$AttributedHistoricalOps
+android.app.AppOpsManager$AttributedOpEntry
 android.app.AppOpsManager$HistoricalFeatureOps
 android.app.AppOpsManager$HistoricalOp$1
 android.app.AppOpsManager$HistoricalOp
@@ -276,20 +283,27 @@
 android.app.AppOpsManager$HistoricalPackageOps
 android.app.AppOpsManager$HistoricalUidOps$1
 android.app.AppOpsManager$HistoricalUidOps
+android.app.AppOpsManager$Mode
+android.app.AppOpsManager$NoteOpEvent$1
 android.app.AppOpsManager$NoteOpEvent
 android.app.AppOpsManager$OnOpActiveChangedInternalListener
 android.app.AppOpsManager$OnOpActiveChangedListener
 android.app.AppOpsManager$OnOpChangedInternalListener
 android.app.AppOpsManager$OnOpChangedListener
+android.app.AppOpsManager$OnOpNotedCallback$1
+android.app.AppOpsManager$OnOpNotedCallback
 android.app.AppOpsManager$OnOpNotedListener
 android.app.AppOpsManager$OpEntry$1
 android.app.AppOpsManager$OpEntry
+android.app.AppOpsManager$OpEventProxyInfo$1
+android.app.AppOpsManager$OpEventProxyInfo
 android.app.AppOpsManager$OpFeatureEntry$1
 android.app.AppOpsManager$OpFeatureEntry$LongSparseArrayParceling
 android.app.AppOpsManager$OpFeatureEntry
 android.app.AppOpsManager$PackageOps$1
 android.app.AppOpsManager$PackageOps
 android.app.AppOpsManager$PausedNotedAppOpsCollection
+android.app.AppOpsManager$RestrictionBypass
 android.app.AppOpsManager
 android.app.AppOpsManagerInternal
 android.app.Application$ActivityLifecycleCallbacks
@@ -303,6 +317,8 @@
 android.app.ApplicationErrorReport$ParcelableCrashInfo
 android.app.ApplicationErrorReport$RunningServiceInfo
 android.app.ApplicationErrorReport
+android.app.ApplicationExitInfo$1
+android.app.ApplicationExitInfo
 android.app.ApplicationLoaders$CachedClassLoader
 android.app.ApplicationLoaders
 android.app.ApplicationPackageManager$1
@@ -337,6 +353,7 @@
 android.app.DownloadManager$Query
 android.app.DownloadManager$Request
 android.app.DownloadManager
+android.app.DreamManager
 android.app.EnterTransitionCoordinator
 android.app.EventLogTags
 android.app.ExitTransitionCoordinator
@@ -429,6 +446,7 @@
 android.app.ITransientNotification$Stub$Proxy
 android.app.ITransientNotification$Stub
 android.app.ITransientNotification
+android.app.ITransientNotificationCallback$Stub$Proxy
 android.app.ITransientNotificationCallback$Stub
 android.app.ITransientNotificationCallback
 android.app.IUiAutomationConnection$Stub$Proxy
@@ -490,6 +508,7 @@
 android.app.Notification$BigPictureStyle
 android.app.Notification$BigTextStyle
 android.app.Notification$BubbleMetadata$1
+android.app.Notification$BubbleMetadata$Builder
 android.app.Notification$BubbleMetadata
 android.app.Notification$Builder
 android.app.Notification$BuilderRemoteViews
@@ -536,6 +555,7 @@
 android.app.ProcessMemoryState
 android.app.ProfilerInfo$1
 android.app.ProfilerInfo
+android.app.ProgressDialog$1
 android.app.ProgressDialog
 android.app.PropertyInvalidatedCache$1
 android.app.PropertyInvalidatedCache
@@ -547,6 +567,7 @@
 android.app.RemoteInput$1
 android.app.RemoteInput$Builder
 android.app.RemoteInput
+android.app.RemoteInputHistoryItem$1
 android.app.RemoteInputHistoryItem
 android.app.RemoteServiceException
 android.app.ResourcesManager$1
@@ -556,6 +577,7 @@
 android.app.ResourcesManager
 android.app.ResultInfo$1
 android.app.ResultInfo
+android.app.RuntimeAppOpAccessMessage
 android.app.SearchDialog
 android.app.SearchManager
 android.app.SearchableInfo$1
@@ -575,9 +597,10 @@
 android.app.SharedPreferencesImpl$MemoryCommitResult
 android.app.SharedPreferencesImpl
 android.app.StatsManager$StatsUnavailableException
-android.app.StatsManager$StatsdDeathRecipient
 android.app.StatsManager
 android.app.StatusBarManager
+android.app.SyncNotedAppOp$1
+android.app.SyncNotedAppOp
 android.app.SynchronousUserSwitchObserver
 android.app.SystemServiceRegistry$100
 android.app.SystemServiceRegistry$101
@@ -603,6 +626,7 @@
 android.app.SystemServiceRegistry$11
 android.app.SystemServiceRegistry$120
 android.app.SystemServiceRegistry$121
+android.app.SystemServiceRegistry$122
 android.app.SystemServiceRegistry$12
 android.app.SystemServiceRegistry$13
 android.app.SystemServiceRegistry$14
@@ -749,6 +773,7 @@
 android.app.admin.DevicePolicyManagerInternal$OnCrossProfileWidgetProvidersChangeListener
 android.app.admin.DevicePolicyManagerInternal
 android.app.admin.DeviceStateCache
+android.app.admin.FactoryResetProtectionPolicy$1
 android.app.admin.FactoryResetProtectionPolicy
 android.app.admin.IDeviceAdminService$Stub$Proxy
 android.app.admin.IDeviceAdminService$Stub
@@ -756,6 +781,9 @@
 android.app.admin.IDevicePolicyManager$Stub$Proxy
 android.app.admin.IDevicePolicyManager$Stub
 android.app.admin.IDevicePolicyManager
+android.app.admin.IKeyguardCallback$Stub
+android.app.admin.IKeyguardCallback
+android.app.admin.NetworkEvent$1
 android.app.admin.NetworkEvent
 android.app.admin.PasswordMetrics$1
 android.app.admin.PasswordMetrics$ComplexityBucket$1
@@ -839,20 +867,26 @@
 android.app.backup.RestoreDescription
 android.app.backup.SharedPreferencesBackupHelper
 android.app.blob.-$$Lambda$BlobStoreManagerFrameworkInitializer$WjSRSHMmxWPF4Fq-7TpX23MBh2U
+android.app.blob.BlobHandle$1
 android.app.blob.BlobHandle
 android.app.blob.BlobStoreManager
 android.app.blob.BlobStoreManagerFrameworkInitializer
 android.app.blob.IBlobStoreManager$Stub
 android.app.blob.IBlobStoreManager
 android.app.blob.IBlobStoreSession
+android.app.blob.LeaseInfo
+android.app.contentsuggestions.ClassificationsRequest$1
 android.app.contentsuggestions.ClassificationsRequest
 android.app.contentsuggestions.ContentSuggestionsManager
+android.app.contentsuggestions.IClassificationsCallback$Stub$Proxy
 android.app.contentsuggestions.IClassificationsCallback$Stub
 android.app.contentsuggestions.IClassificationsCallback
 android.app.contentsuggestions.IContentSuggestionsManager$Stub
 android.app.contentsuggestions.IContentSuggestionsManager
+android.app.contentsuggestions.ISelectionsCallback$Stub$Proxy
 android.app.contentsuggestions.ISelectionsCallback$Stub
 android.app.contentsuggestions.ISelectionsCallback
+android.app.contentsuggestions.SelectionsRequest$1
 android.app.contentsuggestions.SelectionsRequest
 android.app.job.-$$Lambda$FpGlzN9oJcl8o5soW-gU-DyTvXM
 android.app.job.-$$Lambda$JobSchedulerFrameworkInitializer$PtYe8PQc1PVJQXRnpm3iSxcWTR0
@@ -954,6 +988,8 @@
 android.app.servertransaction.PipModeChangeItem
 android.app.servertransaction.ResumeActivityItem$1
 android.app.servertransaction.ResumeActivityItem
+android.app.servertransaction.StartActivityItem$1
+android.app.servertransaction.StartActivityItem
 android.app.servertransaction.StopActivityItem$1
 android.app.servertransaction.StopActivityItem
 android.app.servertransaction.TopResumedActivityChangeItem$1
@@ -978,16 +1014,21 @@
 android.app.timedetector.ITimeDetectorService
 android.app.timedetector.ManualTimeSuggestion$1
 android.app.timedetector.ManualTimeSuggestion
+android.app.timedetector.NetworkTimeSuggestion$1
 android.app.timedetector.NetworkTimeSuggestion
 android.app.timedetector.PhoneTimeSuggestion$1
 android.app.timedetector.PhoneTimeSuggestion
+android.app.timedetector.TelephonyTimeSuggestion$1
 android.app.timedetector.TelephonyTimeSuggestion
 android.app.timedetector.TimeDetector
+android.app.timedetector.TimeDetectorImpl
 android.app.timezone.RulesManager
 android.app.timezonedetector.ITimeZoneDetectorService$Stub$Proxy
 android.app.timezonedetector.ITimeZoneDetectorService$Stub
 android.app.timezonedetector.ITimeZoneDetectorService
+android.app.timezonedetector.ManualTimeZoneSuggestion$1
 android.app.timezonedetector.ManualTimeZoneSuggestion
+android.app.timezonedetector.TelephonyTimeZoneSuggestion$1
 android.app.timezonedetector.TelephonyTimeZoneSuggestion
 android.app.timezonedetector.TimeZoneDetector
 android.app.trust.IStrongAuthTracker$Stub$Proxy
@@ -1048,6 +1089,7 @@
 android.attention.AttentionManagerInternal$AttentionCallbackInternal
 android.attention.AttentionManagerInternal
 android.bluetooth.-$$Lambda$BluetoothAdapter$2$INSd_aND-SGWhhPZUtIqya_Uxw4
+android.bluetooth.-$$Lambda$BluetoothAdapter$5$eKI2JS6EbiGZOGfQ8La27pm0gy0
 android.bluetooth.BluetoothA2dp$1
 android.bluetooth.BluetoothA2dp
 android.bluetooth.BluetoothA2dpSink
@@ -1068,8 +1110,11 @@
 android.bluetooth.BluetoothCodecStatus
 android.bluetooth.BluetoothDevice$1
 android.bluetooth.BluetoothDevice$2
+android.bluetooth.BluetoothDevice$3
 android.bluetooth.BluetoothDevice
+android.bluetooth.BluetoothGatt
 android.bluetooth.BluetoothGattCallback
+android.bluetooth.BluetoothGattServer
 android.bluetooth.BluetoothGattService$1
 android.bluetooth.BluetoothGattService
 android.bluetooth.BluetoothHeadset$1
@@ -1187,6 +1232,7 @@
 android.bluetooth.le.AdvertisingSetParameters$1
 android.bluetooth.le.AdvertisingSetParameters
 android.bluetooth.le.BluetoothLeScanner$1
+android.bluetooth.le.BluetoothLeScanner$BleScanCallbackWrapper$1
 android.bluetooth.le.BluetoothLeScanner$BleScanCallbackWrapper
 android.bluetooth.le.BluetoothLeScanner
 android.bluetooth.le.BluetoothLeUtils
@@ -1221,9 +1267,12 @@
 android.companion.IFindDeviceCallback$Stub
 android.companion.IFindDeviceCallback
 android.compat.Compatibility$Callbacks
+android.compat.Compatibility$ChangeConfig
 android.compat.Compatibility
 android.content.-$$Lambda$AbstractThreadedSyncAdapter$ISyncAdapterImpl$L6ZtOCe8gjKwJj0908ytPlrD8Rc
 android.content.-$$Lambda$ClipboardManager$1$hQk8olbGAgUi4WWNG4ZuDZsM39s
+android.content.-$$Lambda$IntentFilter$WX75RVXUnG63zh-f133zF3i8Szs
+android.content.-$$Lambda$IntentFilter$fvZpjl2C1djVISORSFvcX_-NkJo
 android.content.AbstractThreadedSyncAdapter$ISyncAdapterImpl
 android.content.AbstractThreadedSyncAdapter$SyncThread
 android.content.AbstractThreadedSyncAdapter
@@ -1275,6 +1324,8 @@
 android.content.ContentResolver$GetTypeResultListener
 android.content.ContentResolver$OpenResourceIdResult
 android.content.ContentResolver$ParcelFileDescriptorInner
+android.content.ContentResolver$ResultListener
+android.content.ContentResolver$StringResultListener
 android.content.ContentResolver
 android.content.ContentUris
 android.content.ContentValues$1
@@ -1344,6 +1395,7 @@
 android.content.PeriodicSync
 android.content.PermissionChecker
 android.content.ReceiverCallNotAllowedException
+android.content.RestrictionEntry$1
 android.content.RestrictionEntry
 android.content.RestrictionsManager
 android.content.SearchRecentSuggestionsProvider$DatabaseHelper
@@ -1378,6 +1430,8 @@
 android.content.UriPermission$1
 android.content.UriPermission
 android.content.integrity.AppIntegrityManager
+android.content.integrity.IAppIntegrityManager$Stub
+android.content.integrity.IAppIntegrityManager
 android.content.om.IOverlayManager$Stub$Proxy
 android.content.om.IOverlayManager$Stub
 android.content.om.IOverlayManager
@@ -1385,7 +1439,9 @@
 android.content.om.OverlayInfo
 android.content.om.OverlayManager
 android.content.om.OverlayableInfo
+android.content.pm.-$$Lambda$ApplicationInfo$1$FDtFc-prTtONpy6YSScuAiML69E
 android.content.pm.-$$Lambda$B12dZLpdwpXn89QSesmkaZjD72Q
+android.content.pm.-$$Lambda$IPackageManager$Stub$Proxy$X2I1qlX4SiKMZSjDTNzS_nTibbo
 android.content.pm.-$$Lambda$IPackageManager$Stub$ZVp6oEh-Gn_bn8lM7TgSgpaGriw
 android.content.pm.-$$Lambda$PackageParser$0DZRgzfgaIMpCOhJqjw6PUiU5vw
 android.content.pm.-$$Lambda$PackageParser$0aobsT7Zf7WVZCqMZ5z2clAuQf4
@@ -1412,18 +1468,22 @@
 android.content.pm.CrossProfileApps
 android.content.pm.DataLoaderManager
 android.content.pm.DataLoaderParams
+android.content.pm.DataLoaderParamsParcel$1
 android.content.pm.DataLoaderParamsParcel
 android.content.pm.FallbackCategoryProvider
 android.content.pm.FeatureGroupInfo$1
 android.content.pm.FeatureGroupInfo
 android.content.pm.FeatureInfo$1
 android.content.pm.FeatureInfo
+android.content.pm.FileSystemControlParcel
 android.content.pm.ICrossProfileApps$Stub$Proxy
 android.content.pm.ICrossProfileApps$Stub
 android.content.pm.ICrossProfileApps
 android.content.pm.IDataLoader
+android.content.pm.IDataLoaderManager$Stub$Proxy
 android.content.pm.IDataLoaderManager$Stub
 android.content.pm.IDataLoaderManager
+android.content.pm.IDataLoaderStatusListener$Stub$Proxy
 android.content.pm.IDataLoaderStatusListener$Stub
 android.content.pm.IDataLoaderStatusListener
 android.content.pm.IDexModuleRegisterCallback$Stub$Proxy
@@ -1468,6 +1528,7 @@
 android.content.pm.IPackageStatsObserver$Stub$Proxy
 android.content.pm.IPackageStatsObserver$Stub
 android.content.pm.IPackageStatsObserver
+android.content.pm.IShortcutChangeCallback$Stub$Proxy
 android.content.pm.IShortcutChangeCallback$Stub
 android.content.pm.IShortcutChangeCallback
 android.content.pm.IShortcutService$Stub$Proxy
@@ -1478,6 +1539,7 @@
 android.content.pm.InstantAppIntentFilter$1
 android.content.pm.InstantAppIntentFilter
 android.content.pm.InstantAppRequest
+android.content.pm.InstantAppRequestInfo$1
 android.content.pm.InstantAppRequestInfo
 android.content.pm.InstantAppResolveInfo$1
 android.content.pm.InstantAppResolveInfo$InstantAppDigest$1
@@ -1513,8 +1575,13 @@
 android.content.pm.PackageInstaller$SessionParams
 android.content.pm.PackageInstaller
 android.content.pm.PackageItemInfo
+android.content.pm.PackageManager$1
+android.content.pm.PackageManager$2
+android.content.pm.PackageManager$ApplicationInfoQuery
+android.content.pm.PackageManager$MoveCallback
 android.content.pm.PackageManager$NameNotFoundException
 android.content.pm.PackageManager$OnPermissionsChangedListener
+android.content.pm.PackageManager$PackageInfoQuery
 android.content.pm.PackageManager
 android.content.pm.PackageParser$1
 android.content.pm.PackageParser$Activity$1
@@ -1568,6 +1635,8 @@
 android.content.pm.PermissionInfo
 android.content.pm.ProviderInfo$1
 android.content.pm.ProviderInfo
+android.content.pm.ProviderInfoList$1
+android.content.pm.ProviderInfoList
 android.content.pm.RegisteredServicesCache$1
 android.content.pm.RegisteredServicesCache$2
 android.content.pm.RegisteredServicesCache$3
@@ -1657,6 +1726,8 @@
 android.content.pm.parsing.ParsedPackage$PackageSettingCallback
 android.content.pm.parsing.ParsedPackage
 android.content.pm.parsing.ParsingPackage
+android.content.pm.parsing.ParsingPackageRead
+android.content.pm.parsing.ParsingPackageUtils
 android.content.pm.parsing.library.-$$Lambda$WrPVuoVJehE45tfhLfe_8Tcc-Nw
 android.content.pm.parsing.library.AndroidHidlUpdater
 android.content.pm.parsing.library.AndroidTestBaseUpdater
@@ -1707,6 +1778,7 @@
 android.content.res.ObbInfo
 android.content.res.ObbScanner
 android.content.res.ResourceId
+android.content.res.Resources$AssetManagerUpdateHandler
 android.content.res.Resources$NotFoundException
 android.content.res.Resources$Theme
 android.content.res.Resources$ThemeKey
@@ -1732,7 +1804,9 @@
 android.content.rollback.IRollbackManager$Stub
 android.content.rollback.IRollbackManager
 android.content.rollback.RollbackManager
+android.content.type.-$$Lambda$DefaultMimeMapFactory$3biOnZOOEGRoeaFehYke-eZnpCg
 android.content.type.DefaultMimeMapFactory
+android.database.-$$Lambda$ContentObserver$MgqiYb2qvgLhoXTioYXq9MvvpNk
 android.database.AbstractCursor$SelfContentObserver
 android.database.AbstractCursor
 android.database.AbstractWindowedCursor
@@ -1853,6 +1927,7 @@
 android.graphics.-$$Lambda$ColorSpace$Rgb$bWzafC8vMHNuVmRuTUPEFUMlfuY
 android.graphics.-$$Lambda$ColorSpace$Rgb$iMkODTKa3_8kPZUnZZerD2Lv-yo
 android.graphics.-$$Lambda$ColorSpace$S2rlqJvkXGTpUF6mZhvkElds8JE
+android.graphics.-$$Lambda$HardwareRendererObserver$Z08IFApIdHoCBfw8BsQ-lVjpUlI
 android.graphics.BLASTBufferQueue
 android.graphics.BaseCanvas
 android.graphics.BaseRecordingCanvas
@@ -1919,6 +1994,7 @@
 android.graphics.ImageDecoder$OnHeaderDecodedListener
 android.graphics.ImageDecoder$Source
 android.graphics.ImageDecoder
+android.graphics.ImageFormat
 android.graphics.Insets$1
 android.graphics.Insets
 android.graphics.Interpolator$Result
@@ -1994,8 +2070,12 @@
 android.graphics.Typeface
 android.graphics.Xfermode
 android.graphics.YuvImage
+android.graphics.animation.-$$Lambda$awqPSgriNRe12PWP0zkpAtPsfV4
+android.graphics.animation.FallbackLUTInterpolator
+android.graphics.animation.HasNativeInterpolator
 android.graphics.animation.NativeInterpolator
 android.graphics.animation.NativeInterpolatorFactory
+android.graphics.animation.RenderNodeAnimator$DelayedAnimationHelper
 android.graphics.animation.RenderNodeAnimator$ViewListener
 android.graphics.animation.RenderNodeAnimator
 android.graphics.drawable.-$$Lambda$AnimatedVectorDrawable$VectorDrawableAnimatorRT$PzjgSeyQweoFjbEZJP80UteZqm8
@@ -2140,6 +2220,7 @@
 android.graphics.text.LineBreaker
 android.graphics.text.MeasuredText$Builder
 android.graphics.text.MeasuredText
+android.gsi.AvbPublicKey
 android.gsi.GsiProgress$1
 android.gsi.GsiProgress
 android.gsi.IGsiService$Stub$Proxy
@@ -2211,6 +2292,7 @@
 android.hardware.biometrics.IBiometricEnabledOnKeyguardCallback$Stub$Proxy
 android.hardware.biometrics.IBiometricEnabledOnKeyguardCallback$Stub
 android.hardware.biometrics.IBiometricEnabledOnKeyguardCallback
+android.hardware.biometrics.IBiometricNativeHandle$1
 android.hardware.biometrics.IBiometricNativeHandle
 android.hardware.biometrics.IBiometricService$Stub$Proxy
 android.hardware.biometrics.IBiometricService$Stub
@@ -2239,6 +2321,10 @@
 android.hardware.camera2.CameraManager$AvailabilityCallback
 android.hardware.camera2.CameraManager$CameraManagerGlobal$1
 android.hardware.camera2.CameraManager$CameraManagerGlobal$3
+android.hardware.camera2.CameraManager$CameraManagerGlobal$4
+android.hardware.camera2.CameraManager$CameraManagerGlobal$5
+android.hardware.camera2.CameraManager$CameraManagerGlobal$6
+android.hardware.camera2.CameraManager$CameraManagerGlobal$7
 android.hardware.camera2.CameraManager$CameraManagerGlobal
 android.hardware.camera2.CameraManager$TorchCallback
 android.hardware.camera2.CameraManager
@@ -2314,7 +2400,9 @@
 android.hardware.camera2.marshal.impl.MarshalQueryableSize$MarshalerSize
 android.hardware.camera2.marshal.impl.MarshalQueryableSize
 android.hardware.camera2.marshal.impl.MarshalQueryableSizeF
+android.hardware.camera2.marshal.impl.MarshalQueryableStreamConfiguration$MarshalerStreamConfiguration
 android.hardware.camera2.marshal.impl.MarshalQueryableStreamConfiguration
+android.hardware.camera2.marshal.impl.MarshalQueryableStreamConfigurationDuration$MarshalerStreamConfigurationDuration
 android.hardware.camera2.marshal.impl.MarshalQueryableStreamConfigurationDuration
 android.hardware.camera2.marshal.impl.MarshalQueryableString
 android.hardware.camera2.params.BlackLevelPattern
@@ -2338,6 +2426,7 @@
 android.hardware.camera2.params.StreamConfigurationMap
 android.hardware.camera2.params.TonemapCurve
 android.hardware.camera2.utils.ArrayUtils
+android.hardware.camera2.utils.ConcurrentCameraIdCombination$1
 android.hardware.camera2.utils.ConcurrentCameraIdCombination
 android.hardware.camera2.utils.TypeReference$SpecializedBaseTypeReference
 android.hardware.camera2.utils.TypeReference$SpecializedTypeReference
@@ -2376,6 +2465,7 @@
 android.hardware.display.DeviceProductInfo
 android.hardware.display.DisplayManager$DisplayListener
 android.hardware.display.DisplayManager
+android.hardware.display.DisplayManagerGlobal$1
 android.hardware.display.DisplayManagerGlobal$DisplayListenerDelegate
 android.hardware.display.DisplayManagerGlobal$DisplayManagerCallback
 android.hardware.display.DisplayManagerGlobal
@@ -2414,6 +2504,7 @@
 android.hardware.face.FaceManager$AuthenticationCallback
 android.hardware.face.FaceManager$AuthenticationResult
 android.hardware.face.FaceManager$EnrollmentCallback
+android.hardware.face.FaceManager$LockoutResetCallback
 android.hardware.face.FaceManager$MyHandler
 android.hardware.face.FaceManager$OnAuthenticationCancelListener
 android.hardware.face.FaceManager$RemovalCallback
@@ -2428,6 +2519,8 @@
 android.hardware.fingerprint.Fingerprint
 android.hardware.fingerprint.FingerprintManager$1
 android.hardware.fingerprint.FingerprintManager$2
+android.hardware.fingerprint.FingerprintManager$AuthenticationCallback
+android.hardware.fingerprint.FingerprintManager$LockoutResetCallback
 android.hardware.fingerprint.FingerprintManager$MyHandler
 android.hardware.fingerprint.FingerprintManager
 android.hardware.fingerprint.IFingerprintClientActiveCallback$Stub$Proxy
@@ -2464,6 +2557,8 @@
 android.hardware.input.TouchCalibration
 android.hardware.iris.IrisManager
 android.hardware.lights.LightsManager
+android.hardware.location.-$$Lambda$ContextHubManager$3$5yx25kUuvL9qy3uBcIzI3sQQoL8
+android.hardware.location.-$$Lambda$ContextHubManager$3$KgVQePwT_QpjU9EQTp2L3LsHE5Y
 android.hardware.location.-$$Lambda$ContextHubManager$3$U9x_HK_GdADIEQ3mS5mDWMNWMu8
 android.hardware.location.-$$Lambda$ContextHubManager$4$sylEfC1Rx_cxuQRnKuthZXmV8KI
 android.hardware.location.-$$Lambda$ContextHubTransaction$7a5H6DrY_dOy9M3qnYHhlmDHRNQ
@@ -2730,10 +2825,13 @@
 android.hardware.radio.deprecated.V1_0.IOemHookResponse$Stub
 android.hardware.radio.deprecated.V1_0.IOemHookResponse
 android.hardware.sidekick.SidekickInternal
+android.hardware.soundtrigger.-$$Lambda$SoundTrigger$ZVJnEi-r8cH99VNOx-TiaTkEQgo
 android.hardware.soundtrigger.ConversionUtil
 android.hardware.soundtrigger.IRecognitionStatusCallback$Stub$Proxy
 android.hardware.soundtrigger.IRecognitionStatusCallback$Stub
 android.hardware.soundtrigger.IRecognitionStatusCallback
+android.hardware.soundtrigger.KeyphraseEnrollmentInfo
+android.hardware.soundtrigger.KeyphraseMetadata$1
 android.hardware.soundtrigger.KeyphraseMetadata
 android.hardware.soundtrigger.SoundTrigger$ConfidenceLevel$1
 android.hardware.soundtrigger.SoundTrigger$ConfidenceLevel
@@ -2762,6 +2860,7 @@
 android.hardware.soundtrigger.SoundTrigger$SoundModelEvent
 android.hardware.soundtrigger.SoundTrigger$StatusListener
 android.hardware.soundtrigger.SoundTrigger
+android.hardware.soundtrigger.SoundTriggerModule$EventHandlerDelegate$1
 android.hardware.soundtrigger.SoundTriggerModule$EventHandlerDelegate
 android.hardware.soundtrigger.SoundTriggerModule
 android.hardware.thermal.V1_0.IThermal
@@ -2791,6 +2890,7 @@
 android.hardware.usb.UsbDevice$Builder
 android.hardware.usb.UsbDevice
 android.hardware.usb.UsbDeviceConnection
+android.hardware.usb.UsbInterface$1
 android.hardware.usb.UsbInterface
 android.hardware.usb.UsbManager
 android.hardware.usb.UsbPort
@@ -2824,6 +2924,7 @@
 android.icu.impl.CurrencyData$CurrencySpacingInfo
 android.icu.impl.CurrencyData
 android.icu.impl.DateNumberFormat
+android.icu.impl.DontCareFieldPosition
 android.icu.impl.FormattedStringBuilder
 android.icu.impl.FormattedValueStringBuilderImpl$NullField
 android.icu.impl.FormattedValueStringBuilderImpl
@@ -2884,6 +2985,7 @@
 android.icu.impl.ICUResourceBundleReader$ResourceCache
 android.icu.impl.ICUResourceBundleReader$Table1632
 android.icu.impl.ICUResourceBundleReader$Table16
+android.icu.impl.ICUResourceBundleReader$Table32
 android.icu.impl.ICUResourceBundleReader$Table
 android.icu.impl.ICUResourceBundleReader
 android.icu.impl.ICUService$CacheEntry
@@ -2930,6 +3032,7 @@
 android.icu.impl.StaticUnicodeSets$ParseDataSink
 android.icu.impl.StaticUnicodeSets
 android.icu.impl.StringPrepDataReader
+android.icu.impl.StringRange$1
 android.icu.impl.StringRange
 android.icu.impl.StringSegment
 android.icu.impl.TextTrieMap$Node
@@ -2962,7 +3065,9 @@
 android.icu.impl.UCaseProps$IsAcceptable
 android.icu.impl.UCaseProps$LatinCase
 android.icu.impl.UCaseProps
+android.icu.impl.UCharacterName$AlgorithmName
 android.icu.impl.UCharacterName
+android.icu.impl.UCharacterNameReader
 android.icu.impl.UCharacterProperty$10
 android.icu.impl.UCharacterProperty$11
 android.icu.impl.UCharacterProperty$12
@@ -3125,6 +3230,7 @@
 android.icu.number.Precision
 android.icu.number.Scale
 android.icu.number.ScientificNotation
+android.icu.number.SimpleNotation
 android.icu.number.UnlocalizedNumberFormatter
 android.icu.text.AlphabeticIndex$1
 android.icu.text.AlphabeticIndex$Bucket
@@ -3152,6 +3258,7 @@
 android.icu.text.CollatorServiceShim$CService$1CollatorFactory
 android.icu.text.CollatorServiceShim$CService
 android.icu.text.CollatorServiceShim
+android.icu.text.CompactDecimalFormat$CompactStyle
 android.icu.text.ConstrainedFieldPosition$1
 android.icu.text.ConstrainedFieldPosition$ConstraintType
 android.icu.text.ConstrainedFieldPosition
@@ -3210,6 +3317,7 @@
 android.icu.text.FormattedValue
 android.icu.text.IDNA
 android.icu.text.LanguageBreakEngine
+android.icu.text.ListFormatter$Style
 android.icu.text.LowercaseTransliterator$1
 android.icu.text.LowercaseTransliterator
 android.icu.text.MeasureFormat$FormatWidth
@@ -3425,12 +3533,16 @@
 android.internal.telephony.sysprop.TelephonyProperties
 android.location.-$$Lambda$-z-Hjl12STdAybauR3BT-ftvWd0
 android.location.-$$Lambda$AbstractListenerManager$Registration$TnkXgyOd99JHl00GzK6Oay_sYms
+android.location.-$$Lambda$AbstractListenerManager$Registration$XpiThbVaDDpOnFWIkrt38Bf4yx0
 android.location.-$$Lambda$GpsStatus$RTSonBp9m0T0NWA3SCfYgWf1mTo
 android.location.-$$Lambda$LocationManager$GnssStatusListenerManager$GnssStatusListener$4EPi22o4xuVnpNhFHnDvebH4TG8
 android.location.-$$Lambda$LocationManager$GnssStatusListenerManager$GnssStatusListener$7Fi5XkeF81eL_OKPS2GJMvyc3-8
 android.location.-$$Lambda$LocationManager$GnssStatusListenerManager$GnssStatusListener$gYcH61KCtV_OcJJszI1TfvnrJHY
+android.location.-$$Lambda$LocationManager$LocationListenerTransport$C3xaM63A8GAwfJNN4R634OLsvDc
 android.location.-$$Lambda$LocationManager$LocationListenerTransport$JzcdERl3Ha8sYr9NxFhb3gNOoCM
 android.location.-$$Lambda$LocationManager$LocationListenerTransport$OaIkiu4R0h4pgFbCDDlNkbmPaps
+android.location.-$$Lambda$LocationManager$LocationListenerTransport$enkW18B0WwpQkSIMmVChmQ2YwC8
+android.location.-$$Lambda$LocationManager$LocationListenerTransport$fHjQXipQePznoEyxLuCfUO-YP1Y
 android.location.-$$Lambda$LocationManager$LocationListenerTransport$vDJFuk-DvyNgQEXUO2Jkf2ZFeE8
 android.location.-$$Lambda$LocationManager$LocationListenerTransport$vtBApnyHdgybRqRKlCt1NFEyfeQ
 android.location.-$$Lambda$UmbtQF279SH5h72Ftfcj_s96jsY
@@ -3464,6 +3576,7 @@
 android.location.GnssNavigationMessage
 android.location.GnssReflectingPlane$1
 android.location.GnssReflectingPlane
+android.location.GnssRequest$1
 android.location.GnssRequest
 android.location.GnssSingleSatCorrection$1
 android.location.GnssSingleSatCorrection
@@ -3491,6 +3604,7 @@
 android.location.IGeofenceProvider$Stub$Proxy
 android.location.IGeofenceProvider$Stub
 android.location.IGeofenceProvider
+android.location.IGnssAntennaInfoListener$Stub$Proxy
 android.location.IGnssAntennaInfoListener$Stub
 android.location.IGnssAntennaInfoListener
 android.location.IGnssMeasurementsListener$Stub$Proxy
@@ -3518,6 +3632,7 @@
 android.location.Location$BearingDistanceCache
 android.location.Location
 android.location.LocationListener
+android.location.LocationManager$1
 android.location.LocationManager$BatchedLocationCallbackManager
 android.location.LocationManager$GnssAntennaInfoListenerManager
 android.location.LocationManager$GnssMeasurementsListenerManager
@@ -3538,6 +3653,9 @@
 android.media.-$$Lambda$MediaDrm$8rRollK1F3eENvuaBGoS8u_-heQ
 android.media.-$$Lambda$MediaDrm$IvEWhXQgSYABwC6_1bdnhTJ4V2I
 android.media.-$$Lambda$MediaDrm$UPVWCanGo24eu9-1S_t6PvJ1Zno
+android.media.-$$Lambda$ThumbnailUtils$HhGKNQZck57eO__Paj6KyQm6lCk
+android.media.-$$Lambda$ThumbnailUtils$P13h9YbyD69p6ss1gYpoef43_MU
+android.media.-$$Lambda$ThumbnailUtils$qOH5vebuTwPi2G92PTa6rgwKGoc
 android.media.AudioAttributes$1
 android.media.AudioAttributes$Builder
 android.media.AudioAttributes
@@ -3645,6 +3763,8 @@
 android.media.IMediaHTTPService
 android.media.IMediaResourceMonitor$Stub
 android.media.IMediaResourceMonitor
+android.media.IMediaRouter2$Stub
+android.media.IMediaRouter2
 android.media.IMediaRouter2Client$Stub$Proxy
 android.media.IMediaRouter2Client$Stub
 android.media.IMediaRouter2Client
@@ -3674,6 +3794,7 @@
 android.media.IRingtonePlayer$Stub$Proxy
 android.media.IRingtonePlayer$Stub
 android.media.IRingtonePlayer
+android.media.IStrategyPreferredDeviceDispatcher$Stub$Proxy
 android.media.IStrategyPreferredDeviceDispatcher$Stub
 android.media.IStrategyPreferredDeviceDispatcher
 android.media.IVolumeController$Stub$Proxy
@@ -3691,13 +3812,16 @@
 android.media.MediaCodec$BufferInfo
 android.media.MediaCodec$BufferMap$CodecBuffer
 android.media.MediaCodec$BufferMap
+android.media.MediaCodec$Callback
 android.media.MediaCodec$CodecException
 android.media.MediaCodec$CryptoException
 android.media.MediaCodec$CryptoInfo$Pattern
 android.media.MediaCodec$CryptoInfo
 android.media.MediaCodec$EventHandler
 android.media.MediaCodec$GraphicBlock
+android.media.MediaCodec$IncompatibleWithBlockModelException
 android.media.MediaCodec$LinearBlock
+android.media.MediaCodec$OnFrameRenderedListener
 android.media.MediaCodec$OutputFrame
 android.media.MediaCodec$PersistentSurface
 android.media.MediaCodec$QueueRequest
@@ -3729,6 +3853,7 @@
 android.media.MediaDrm
 android.media.MediaDrmException
 android.media.MediaExtractor
+android.media.MediaFile
 android.media.MediaFormat
 android.media.MediaHTTPConnection
 android.media.MediaHTTPService
@@ -3789,6 +3914,8 @@
 android.media.MediaRouter$VolumeCallbackInfo
 android.media.MediaRouter$VolumeChangeReceiver
 android.media.MediaRouter$WifiDisplayStatusChangedReceiver
+android.media.MediaRouter2Manager$Callback
+android.media.MediaRouter2Manager
 android.media.MediaRouter
 android.media.MediaRouterClientState$1
 android.media.MediaRouterClientState$RouteInfo$1
@@ -3822,7 +3949,9 @@
 android.media.Ringtone$MyOnCompletionListener
 android.media.Ringtone
 android.media.RingtoneManager
+android.media.RouteDiscoveryPreference$1
 android.media.RouteDiscoveryPreference
+android.media.RoutingSessionInfo$1
 android.media.RoutingSessionInfo
 android.media.SoundPool$Builder
 android.media.SoundPool$EventHandler
@@ -3836,16 +3965,20 @@
 android.media.SubtitleData
 android.media.SubtitleTrack
 android.media.SyncParams
+android.media.ThumbnailUtils$Resizer
+android.media.ThumbnailUtils$SizedThumbnailBitmap
 android.media.ThumbnailUtils
 android.media.TimedMetaData
 android.media.TimedText
 android.media.ToneGenerator
 android.media.Utils$1
 android.media.Utils$2
+android.media.Utils$ListenerList
 android.media.Utils
 android.media.VolumeAutomation
 android.media.VolumePolicy$1
 android.media.VolumePolicy
+android.media.VolumeProvider$Callback
 android.media.VolumeProvider
 android.media.VolumeShaper$Configuration$1
 android.media.VolumeShaper$Configuration$Builder
@@ -3857,6 +3990,7 @@
 android.media.VolumeShaper$State
 android.media.VolumeShaper
 android.media.audiofx.AudioEffect$Descriptor
+android.media.audiofx.AudioEffect
 android.media.audiopolicy.-$$Lambda$AudioPolicy$-ztOT0FT3tzGMUr4lm1gv6dBE4c
 android.media.audiopolicy.AudioMix$Builder
 android.media.audiopolicy.AudioMix
@@ -3894,10 +4028,13 @@
 android.media.browse.MediaBrowser$SubscriptionCallback
 android.media.browse.MediaBrowser
 android.media.browse.MediaBrowserUtils
+android.media.midi.IMidiDeviceListener$Stub$Proxy
 android.media.midi.IMidiDeviceListener$Stub
 android.media.midi.IMidiDeviceListener
+android.media.midi.IMidiDeviceOpenCallback$Stub$Proxy
 android.media.midi.IMidiDeviceOpenCallback$Stub
 android.media.midi.IMidiDeviceOpenCallback
+android.media.midi.IMidiDeviceServer$Stub$Proxy
 android.media.midi.IMidiDeviceServer$Stub
 android.media.midi.IMidiDeviceServer
 android.media.midi.IMidiManager$Stub
@@ -3905,6 +4042,7 @@
 android.media.midi.MidiDevice
 android.media.midi.MidiDeviceInfo$1
 android.media.midi.MidiDeviceInfo
+android.media.midi.MidiDeviceStatus$1
 android.media.midi.MidiDeviceStatus
 android.media.midi.MidiManager
 android.media.projection.IMediaProjection$Stub$Proxy
@@ -3919,14 +4057,17 @@
 android.media.projection.MediaProjection
 android.media.projection.MediaProjectionInfo$1
 android.media.projection.MediaProjectionInfo
+android.media.projection.MediaProjectionManager$Callback
 android.media.projection.MediaProjectionManager$CallbackDelegate
 android.media.projection.MediaProjectionManager
 android.media.session.-$$Lambda$MediaSessionManager$IEuWPZ528guBgmyKPMUWhBwnMCE
 android.media.session.IActiveSessionsListener$Stub$Proxy
 android.media.session.IActiveSessionsListener$Stub
 android.media.session.IActiveSessionsListener
+android.media.session.IOnMediaKeyEventDispatchedListener$Stub$Proxy
 android.media.session.IOnMediaKeyEventDispatchedListener$Stub
 android.media.session.IOnMediaKeyEventDispatchedListener
+android.media.session.IOnMediaKeyEventSessionChangedListener$Stub$Proxy
 android.media.session.IOnMediaKeyEventSessionChangedListener$Stub
 android.media.session.IOnMediaKeyEventSessionChangedListener
 android.media.session.IOnMediaKeyListener$Stub$Proxy
@@ -3994,10 +4135,23 @@
 android.media.soundtrigger.ISoundTriggerDetectionServiceClient$Stub
 android.media.soundtrigger.ISoundTriggerDetectionServiceClient
 android.media.soundtrigger.SoundTriggerManager
+android.media.soundtrigger_middleware.ISoundTriggerCallback$Stub$Proxy
 android.media.soundtrigger_middleware.ISoundTriggerCallback$Stub
 android.media.soundtrigger_middleware.ISoundTriggerCallback
+android.media.soundtrigger_middleware.ISoundTriggerMiddlewareService$Stub$Proxy
+android.media.soundtrigger_middleware.ISoundTriggerMiddlewareService$Stub
 android.media.soundtrigger_middleware.ISoundTriggerMiddlewareService
+android.media.soundtrigger_middleware.ISoundTriggerModule$Stub
 android.media.soundtrigger_middleware.ISoundTriggerModule
+android.media.soundtrigger_middleware.PhraseRecognitionExtra
+android.media.soundtrigger_middleware.RecognitionConfig$1
+android.media.soundtrigger_middleware.RecognitionConfig
+android.media.soundtrigger_middleware.SoundModel$1
+android.media.soundtrigger_middleware.SoundModel
+android.media.soundtrigger_middleware.SoundTriggerModuleDescriptor$1
+android.media.soundtrigger_middleware.SoundTriggerModuleDescriptor
+android.media.soundtrigger_middleware.SoundTriggerModuleProperties$1
+android.media.soundtrigger_middleware.SoundTriggerModuleProperties
 android.media.tv.TvInputHardwareInfo$Builder
 android.media.tv.TvInputManager
 android.media.tv.TvStreamConfig$1
@@ -4025,7 +4179,6 @@
 android.mtp.MtpStorageManager
 android.net.-$$Lambda$FpGXkd3pLxeXY58eJ_84mi1PLWQ
 android.net.-$$Lambda$Network$KD6DxaMRJIcajhj36TU1K7lJnHQ
-android.net.-$$Lambda$NetworkFactory$HfslgqyaKc_n0wXX5_qRYVZoGfI
 android.net.-$$Lambda$NetworkScoreManager$NetworkScoreCallbackProxy$PGkg1UrNyisY0wAts4zoVuYRgkw
 android.net.-$$Lambda$NetworkScoreManager$NetworkScoreCallbackProxy$TEOhIiY2C9y8yDWwRR6zm_12TGY
 android.net.-$$Lambda$NetworkStats$3raHHJpnJwsEAXnRXF2pK8-UDFY
@@ -4033,6 +4186,7 @@
 android.net.-$$Lambda$p1_56lwnt1xBuY1muPblbN1Dtkw
 android.net.CaptivePortal$1
 android.net.CaptivePortal
+android.net.CaptivePortalData$1
 android.net.CaptivePortalData
 android.net.ConnectionInfo$1
 android.net.ConnectionInfo
@@ -4067,6 +4221,7 @@
 android.net.EventLogTags
 android.net.ICaptivePortal$Stub
 android.net.ICaptivePortal
+android.net.IConnectivityDiagnosticsCallback$Stub$Proxy
 android.net.IConnectivityDiagnosticsCallback$Stub
 android.net.IConnectivityDiagnosticsCallback
 android.net.IConnectivityManager$Stub$Proxy
@@ -4074,6 +4229,7 @@
 android.net.IConnectivityManager
 android.net.IEthernetManager$Stub
 android.net.IEthernetManager
+android.net.IEthernetServiceListener$Stub$Proxy
 android.net.IEthernetServiceListener$Stub
 android.net.IEthernetServiceListener
 android.net.IIpConnectivityMetrics$Stub$Proxy
@@ -4113,6 +4269,7 @@
 android.net.ISocketKeepaliveCallback
 android.net.ITestNetworkManager$Stub
 android.net.ITestNetworkManager
+android.net.ITetheredInterfaceCallback$Stub$Proxy
 android.net.ITetheredInterfaceCallback$Stub
 android.net.ITetheredInterfaceCallback
 android.net.ITetheringStatsProvider$Stub$Proxy
@@ -4128,19 +4285,23 @@
 android.net.IpPrefix$1
 android.net.IpPrefix$2
 android.net.IpPrefix
+android.net.IpSecConfig$1
 android.net.IpSecConfig
 android.net.IpSecManager$SpiUnavailableException
 android.net.IpSecManager$UdpEncapsulationSocket
 android.net.IpSecManager
+android.net.IpSecSpiResponse$1
 android.net.IpSecSpiResponse
+android.net.IpSecTransformResponse$1
 android.net.IpSecTransformResponse
+android.net.IpSecTunnelInterfaceResponse$1
 android.net.IpSecTunnelInterfaceResponse
+android.net.IpSecUdpEncapResponse$1
 android.net.IpSecUdpEncapResponse
 android.net.KeepalivePacketData
 android.net.LinkAddress$1
 android.net.LinkAddress
 android.net.LinkProperties$1
-android.net.LinkProperties$CompareResult
 android.net.LinkProperties
 android.net.LocalServerSocket
 android.net.LocalSocket
@@ -4157,15 +4318,16 @@
 android.net.Network$1
 android.net.Network$NetworkBoundSocketFactory
 android.net.Network
+android.net.NetworkAgent$InitialConfiguration
+android.net.NetworkAgent$NetworkAgentHandler
 android.net.NetworkAgent
+android.net.NetworkAgentConfig$1
+android.net.NetworkAgentConfig$Builder
 android.net.NetworkAgentConfig
 android.net.NetworkCapabilities$1
 android.net.NetworkCapabilities$NameOf
 android.net.NetworkCapabilities
 android.net.NetworkConfig
-android.net.NetworkFactory$NetworkRequestInfo
-android.net.NetworkFactory$SerialNumber
-android.net.NetworkFactory
 android.net.NetworkIdentity
 android.net.NetworkInfo$1
 android.net.NetworkInfo$DetailedState
@@ -4180,6 +4342,7 @@
 android.net.NetworkPolicyManager$SubscriptionCallback
 android.net.NetworkPolicyManager$SubscriptionCallbackProxy
 android.net.NetworkPolicyManager
+android.net.NetworkProvider$1
 android.net.NetworkProvider
 android.net.NetworkQuotaInfo$1
 android.net.NetworkQuotaInfo
@@ -4243,6 +4406,7 @@
 android.net.StringNetworkSpecifier
 android.net.TcpSocketKeepalive
 android.net.TelephonyNetworkSpecifier$1
+android.net.TelephonyNetworkSpecifier$Builder
 android.net.TelephonyNetworkSpecifier
 android.net.TestNetworkManager
 android.net.TrafficStats
@@ -4306,8 +4470,10 @@
 android.net.metrics.ValidationProbeEvent
 android.net.metrics.WakeupEvent
 android.net.metrics.WakeupStats
+android.net.netstats.provider.INetworkStatsProvider$Stub$Proxy
 android.net.netstats.provider.INetworkStatsProvider$Stub
 android.net.netstats.provider.INetworkStatsProvider
+android.net.netstats.provider.INetworkStatsProviderCallback$Stub
 android.net.netstats.provider.INetworkStatsProviderCallback
 android.net.nsd.INsdManager$Stub$Proxy
 android.net.nsd.INsdManager$Stub
@@ -4331,6 +4497,7 @@
 android.net.util.-$$Lambda$MultinetworkPolicyTracker$8YMQ0fPTKk7Fw-_gJjln0JT-g8E
 android.net.util.KeepaliveUtils$KeepaliveDeviceConfigurationException
 android.net.util.KeepaliveUtils
+android.net.util.LinkPropertiesUtils$CompareResult
 android.net.util.LinkPropertiesUtils
 android.net.util.MacAddressUtils
 android.net.util.MultinetworkPolicyTracker$1
@@ -4395,8 +4562,11 @@
 android.nfc.TechListParcel
 android.nfc.cardemulation.AidGroup$1
 android.nfc.cardemulation.AidGroup
+android.nfc.cardemulation.ApduServiceInfo$1
 android.nfc.cardemulation.ApduServiceInfo
 android.nfc.cardemulation.CardEmulation
+android.nfc.cardemulation.HostApduService$MsgHandler
+android.nfc.cardemulation.HostApduService
 android.opengl.EGL14
 android.opengl.EGL15
 android.opengl.EGLConfig
@@ -4417,11 +4587,25 @@
 android.opengl.GLES31
 android.opengl.GLES31Ext
 android.opengl.GLES32
+android.opengl.GLSurfaceView$BaseConfigChooser
+android.opengl.GLSurfaceView$ComponentSizeChooser
+android.opengl.GLSurfaceView$DefaultContextFactory
+android.opengl.GLSurfaceView$DefaultWindowSurfaceFactory
+android.opengl.GLSurfaceView$EGLConfigChooser
+android.opengl.GLSurfaceView$EGLContextFactory
 android.opengl.GLSurfaceView$EGLWindowSurfaceFactory
+android.opengl.GLSurfaceView$EglHelper
+android.opengl.GLSurfaceView$GLThread
+android.opengl.GLSurfaceView$GLThreadManager
+android.opengl.GLSurfaceView$Renderer
+android.opengl.GLSurfaceView$SimpleEGLConfigChooser
+android.opengl.GLSurfaceView
 android.opengl.GLUtils
 android.opengl.Matrix
 android.opengl.Visibility
 android.os.-$$Lambda$Binder$IYUHVkWouPK_9CG2s8VwyWBt5_I
+android.os.-$$Lambda$Binder$aNRcHb8WfLrWjcSlV42Wu5psFwU
+android.os.-$$Lambda$Binder$sHSgT14Q7D-inZx204V4-ect-uA
 android.os.-$$Lambda$Build$WrC6eL7oW2Zm9UDTcXXKr0DnOMw
 android.os.-$$Lambda$FileUtils$0SBPRWOXcbR9EMG_p-55sUuxJ_0
 android.os.-$$Lambda$FileUtils$TJeD9NeX5giO-5vlBrurGI-g4IY
@@ -4525,6 +4709,7 @@
 android.os.Environment$UserEnvironment
 android.os.Environment
 android.os.EventLogTags
+android.os.ExternalVibration$1
 android.os.ExternalVibration
 android.os.FactoryTest
 android.os.FileBridge$FileBridgeOutputStream
@@ -4543,6 +4728,7 @@
 android.os.HandlerThread
 android.os.HardwarePropertiesManager
 android.os.HidlMemory
+android.os.HidlMemoryUtil
 android.os.HidlSupport$Mutable
 android.os.HidlSupport
 android.os.HwBinder
@@ -4613,6 +4799,7 @@
 android.os.IPullAtomCallback
 android.os.IRecoverySystem$Stub
 android.os.IRecoverySystem
+android.os.IRecoverySystemProgressListener$Stub$Proxy
 android.os.IRecoverySystemProgressListener$Stub
 android.os.IRecoverySystemProgressListener
 android.os.IRemoteCallback$Stub$Proxy
@@ -4632,6 +4819,8 @@
 android.os.IStoraged$Stub$Proxy
 android.os.IStoraged$Stub
 android.os.IStoraged
+android.os.ISystemConfig$Stub
+android.os.ISystemConfig
 android.os.ISystemUpdateManager$Stub$Proxy
 android.os.ISystemUpdateManager$Stub
 android.os.ISystemUpdateManager
@@ -4660,6 +4849,7 @@
 android.os.IVibratorService$Stub$Proxy
 android.os.IVibratorService$Stub
 android.os.IVibratorService
+android.os.IVibratorStateListener$Stub$Proxy
 android.os.IVibratorStateListener$Stub
 android.os.IVibratorStateListener
 android.os.IVold$Stub$Proxy
@@ -4694,6 +4884,7 @@
 android.os.Parcel$1
 android.os.Parcel$2
 android.os.Parcel$ReadWriteHelper
+android.os.Parcel$SquashReadHelper
 android.os.Parcel
 android.os.ParcelFileDescriptor$1
 android.os.ParcelFileDescriptor$2
@@ -4720,6 +4911,8 @@
 android.os.PooledStringReader
 android.os.PooledStringWriter
 android.os.PowerManager$1
+android.os.PowerManager$2
+android.os.PowerManager$3
 android.os.PowerManager$OnThermalStatusChangedListener
 android.os.PowerManager$WakeData
 android.os.PowerManager$WakeLock$1
@@ -4818,6 +5011,8 @@
 android.os.Temperature$1
 android.os.Temperature
 android.os.ThreadLocalWorkSource
+android.os.TimestampedValue$1
+android.os.TimestampedValue
 android.os.TokenWatcher$1
 android.os.TokenWatcher$Death
 android.os.TokenWatcher
@@ -4844,6 +5039,7 @@
 android.os.VibrationAttributes$Builder
 android.os.VibrationAttributes
 android.os.VibrationEffect$1
+android.os.VibrationEffect$Composed$1
 android.os.VibrationEffect$Composed
 android.os.VibrationEffect$OneShot$1
 android.os.VibrationEffect$OneShot
@@ -4961,6 +5157,10 @@
 android.permission.IPermissionManager
 android.permission.PermissionControllerManager$1
 android.permission.PermissionControllerManager
+android.permission.PermissionManager$1
+android.permission.PermissionManager$2
+android.permission.PermissionManager$PackageNamePermissionQuery
+android.permission.PermissionManager$PermissionQuery
 android.permission.PermissionManager$SplitPermissionInfo
 android.permission.PermissionManagerInternal
 android.preference.GenericInflater$Parent
@@ -4975,13 +5175,16 @@
 android.preference.PreferenceManager$OnPreferenceTreeClickListener
 android.preference.PreferenceManager
 android.preference.PreferenceScreen
+android.print.IPrintDocumentAdapter$Stub$Proxy
 android.print.IPrintDocumentAdapter$Stub
 android.print.IPrintDocumentAdapter
+android.print.IPrintJobStateChangeListener$Stub$Proxy
 android.print.IPrintJobStateChangeListener$Stub
 android.print.IPrintJobStateChangeListener
 android.print.IPrintManager$Stub$Proxy
 android.print.IPrintManager$Stub
 android.print.IPrintManager
+android.print.IPrintServicesChangeListener$Stub$Proxy
 android.print.IPrintServicesChangeListener$Stub
 android.print.IPrintServicesChangeListener
 android.print.IPrintSpooler$Stub$Proxy
@@ -4991,20 +5194,25 @@
 android.print.IPrintSpoolerCallbacks
 android.print.IPrintSpoolerClient$Stub
 android.print.IPrintSpoolerClient
+android.print.IPrinterDiscoveryObserver$Stub$Proxy
 android.print.IPrinterDiscoveryObserver$Stub
 android.print.IPrinterDiscoveryObserver
+android.print.PrintAttributes$1
 android.print.PrintAttributes
 android.print.PrintDocumentAdapter
+android.print.PrintJobId$1
 android.print.PrintJobId
 android.print.PrintJobInfo$1
 android.print.PrintJobInfo
 android.print.PrintManager$1
 android.print.PrintManager
+android.print.PrinterId$1
 android.print.PrinterId
 android.printservice.IPrintServiceClient$Stub
 android.printservice.IPrintServiceClient
 android.printservice.PrintServiceInfo$1
 android.printservice.PrintServiceInfo
+android.printservice.recommendation.IRecommendationsChangeListener$Stub$Proxy
 android.printservice.recommendation.IRecommendationsChangeListener$Stub
 android.printservice.recommendation.IRecommendationsChangeListener
 android.privacy.DifferentialPrivacyConfig
@@ -5039,7 +5247,10 @@
 android.provider.ContactsContract$CommonDataKinds$Callable
 android.provider.ContactsContract$CommonDataKinds$CommonColumns
 android.provider.ContactsContract$CommonDataKinds$Email
+android.provider.ContactsContract$CommonDataKinds$Event
+android.provider.ContactsContract$CommonDataKinds$Im
 android.provider.ContactsContract$CommonDataKinds$Phone
+android.provider.ContactsContract$CommonDataKinds$Relation
 android.provider.ContactsContract$CommonDataKinds$StructuredPostal
 android.provider.ContactsContract$ContactCounts
 android.provider.ContactsContract$ContactNameColumns
@@ -5054,6 +5265,7 @@
 android.provider.ContactsContract$DataUsageStatColumns
 android.provider.ContactsContract$DeletedContacts
 android.provider.ContactsContract$DeletedContactsColumns
+android.provider.ContactsContract$Directory
 android.provider.ContactsContract$DisplayPhoto
 android.provider.ContactsContract$Groups
 android.provider.ContactsContract$GroupsColumns
@@ -5117,6 +5329,7 @@
 android.provider.Telephony$MmsSms
 android.provider.Telephony$ServiceStateTable
 android.provider.Telephony$SimInfo
+android.provider.Telephony$Sms$Intents
 android.provider.Telephony$Sms$Sent
 android.provider.Telephony$Sms
 android.provider.Telephony$TextBasedSmsColumns
@@ -5148,6 +5361,8 @@
 android.security.Credentials
 android.security.FileIntegrityManager
 android.security.GateKeeper
+android.security.IFileIntegrityService$Stub
+android.security.IFileIntegrityService
 android.security.IKeyChainAliasCallback$Stub
 android.security.IKeyChainAliasCallback
 android.security.IKeyChainService$Stub$Proxy
@@ -5335,10 +5550,12 @@
 android.service.appprediction.IPredictionService$Stub
 android.service.appprediction.IPredictionService
 android.service.autofill.AutofillServiceInfo
+android.service.autofill.Dataset$1
 android.service.autofill.Dataset
 android.service.autofill.FieldClassificationUserData
 android.service.autofill.FillContext$1
 android.service.autofill.FillContext
+android.service.autofill.FillEventHistory$1
 android.service.autofill.FillEventHistory
 android.service.autofill.FillRequest$1
 android.service.autofill.FillRequest
@@ -5352,25 +5569,23 @@
 android.service.autofill.IFillCallback
 android.service.autofill.ISaveCallback$Stub
 android.service.autofill.ISaveCallback
+android.service.autofill.SaveRequest$1
 android.service.autofill.SaveRequest
 android.service.autofill.UserData$1
 android.service.autofill.UserData$Builder
 android.service.autofill.UserData
+android.service.autofill.augmented.Helper
 android.service.autofill.augmented.IAugmentedAutofillService$Stub$Proxy
 android.service.autofill.augmented.IAugmentedAutofillService$Stub
 android.service.autofill.augmented.IAugmentedAutofillService
 android.service.autofill.augmented.IFillCallback$Stub$Proxy
 android.service.autofill.augmented.IFillCallback$Stub
 android.service.autofill.augmented.IFillCallback
-android.service.carrier.CarrierIdentifier$1
-android.service.carrier.CarrierIdentifier
 android.service.carrier.CarrierMessagingServiceWrapper$CarrierMessagingCallbackWrapper
 android.service.carrier.CarrierMessagingServiceWrapper
-android.service.carrier.ICarrierService$Stub$Proxy
-android.service.carrier.ICarrierService$Stub
-android.service.carrier.ICarrierService
 android.service.contentcapture.ActivityEvent$1
 android.service.contentcapture.ActivityEvent
+android.service.contentcapture.ContentCaptureService
 android.service.contentcapture.ContentCaptureServiceInfo
 android.service.contentcapture.FlushMetrics$1
 android.service.contentcapture.FlushMetrics
@@ -5385,47 +5600,22 @@
 android.service.contentcapture.SnapshotData$1
 android.service.contentcapture.SnapshotData
 android.service.dataloader.DataLoaderService
+android.service.dreams.-$$Lambda$DreamService$DreamServiceWrapper$2R9T6zqLOUvx4z5eu1pSMWsejpU
+android.service.dreams.-$$Lambda$DreamService$DreamServiceWrapper$fKPQo1GZX03b5-nMg-IFcuuxhKs
+android.service.dreams.-$$Lambda$DreamService$DreamServiceWrapper$mm-Rh3xCTudFT-WRyQZatcwXBss
+android.service.dreams.-$$Lambda$DreamService$uqzqbrpptkCH_tc1jkx48W1A6vM
+android.service.dreams.DreamActivity
 android.service.dreams.DreamManagerInternal
+android.service.dreams.DreamService$DreamServiceWrapper
+android.service.dreams.DreamService
 android.service.dreams.IDreamManager$Stub$Proxy
 android.service.dreams.IDreamManager$Stub
 android.service.dreams.IDreamManager
 android.service.dreams.IDreamService$Stub$Proxy
 android.service.dreams.IDreamService$Stub
 android.service.dreams.IDreamService
-android.service.euicc.EuiccProfileInfo$1
-android.service.euicc.EuiccProfileInfo
-android.service.euicc.GetEuiccProfileInfoListResult$1
-android.service.euicc.GetEuiccProfileInfoListResult
-android.service.euicc.IDeleteSubscriptionCallback$Stub
-android.service.euicc.IDeleteSubscriptionCallback
-android.service.euicc.IDownloadSubscriptionCallback$Stub
-android.service.euicc.IDownloadSubscriptionCallback
-android.service.euicc.IEraseSubscriptionsCallback$Stub
-android.service.euicc.IEraseSubscriptionsCallback
-android.service.euicc.IEuiccService$Stub$Proxy
-android.service.euicc.IEuiccService$Stub
-android.service.euicc.IEuiccService
-android.service.euicc.IGetDefaultDownloadableSubscriptionListCallback$Stub
-android.service.euicc.IGetDefaultDownloadableSubscriptionListCallback
-android.service.euicc.IGetDownloadableSubscriptionMetadataCallback$Stub
-android.service.euicc.IGetDownloadableSubscriptionMetadataCallback
-android.service.euicc.IGetEidCallback$Stub
-android.service.euicc.IGetEidCallback
-android.service.euicc.IGetEuiccInfoCallback$Stub
-android.service.euicc.IGetEuiccInfoCallback
-android.service.euicc.IGetEuiccProfileInfoListCallback$Stub$Proxy
-android.service.euicc.IGetEuiccProfileInfoListCallback$Stub
-android.service.euicc.IGetEuiccProfileInfoListCallback
-android.service.euicc.IGetOtaStatusCallback$Stub
-android.service.euicc.IGetOtaStatusCallback
 android.service.euicc.IOtaStatusChangedCallback$Stub
 android.service.euicc.IOtaStatusChangedCallback
-android.service.euicc.IRetainSubscriptionsForFactoryResetCallback$Stub
-android.service.euicc.IRetainSubscriptionsForFactoryResetCallback
-android.service.euicc.ISwitchToSubscriptionCallback$Stub
-android.service.euicc.ISwitchToSubscriptionCallback
-android.service.euicc.IUpdateSubscriptionNicknameCallback$Stub
-android.service.euicc.IUpdateSubscriptionNicknameCallback
 android.service.gatekeeper.GateKeeperResponse$1
 android.service.gatekeeper.GateKeeperResponse
 android.service.gatekeeper.IGateKeeperService$Stub$Proxy
@@ -5501,6 +5691,8 @@
 android.service.persistentdata.IPersistentDataBlockService$Stub
 android.service.persistentdata.IPersistentDataBlockService
 android.service.persistentdata.PersistentDataBlockManager
+android.service.quicksettings.IQSService$Stub
+android.service.quicksettings.IQSService
 android.service.textclassifier.ITextClassifierCallback$Stub$Proxy
 android.service.textclassifier.ITextClassifierCallback$Stub
 android.service.textclassifier.ITextClassifierCallback
@@ -5539,6 +5731,9 @@
 android.service.vr.IVrStateCallbacks$Stub$Proxy
 android.service.vr.IVrStateCallbacks$Stub
 android.service.vr.IVrStateCallbacks
+android.service.wallpaper.-$$Lambda$87Do-TfJA3qVM7QF6F_6BpQlQTA
+android.service.wallpaper.-$$Lambda$vsWBQpiXExY07tlrSzTqh4pNQAQ
+android.service.wallpaper.IWallpaperConnection$Stub$Proxy
 android.service.wallpaper.IWallpaperConnection$Stub
 android.service.wallpaper.IWallpaperConnection
 android.service.wallpaper.IWallpaperEngine$Stub$Proxy
@@ -5547,6 +5742,15 @@
 android.service.wallpaper.IWallpaperService$Stub$Proxy
 android.service.wallpaper.IWallpaperService$Stub
 android.service.wallpaper.IWallpaperService
+android.service.wallpaper.WallpaperService$Engine$1
+android.service.wallpaper.WallpaperService$Engine$2
+android.service.wallpaper.WallpaperService$Engine$3
+android.service.wallpaper.WallpaperService$Engine$WallpaperInputEventReceiver
+android.service.wallpaper.WallpaperService$Engine
+android.service.wallpaper.WallpaperService$IWallpaperEngineWrapper
+android.service.wallpaper.WallpaperService$IWallpaperServiceWrapper
+android.service.wallpaper.WallpaperService$WallpaperCommand
+android.service.wallpaper.WallpaperService
 android.service.watchdog.ExplicitHealthCheckService$PackageConfig$1
 android.service.watchdog.ExplicitHealthCheckService$PackageConfig
 android.service.watchdog.IExplicitHealthCheckService$Stub$Proxy
@@ -5556,8 +5760,10 @@
 android.speech.tts.ITextToSpeechCallback$Stub
 android.speech.tts.ITextToSpeechCallback
 android.speech.tts.ITextToSpeechService$Stub$Proxy
+android.speech.tts.ITextToSpeechService$Stub
 android.speech.tts.ITextToSpeechService
 android.speech.tts.TextToSpeech$Action
+android.speech.tts.TextToSpeech$Connection$1
 android.speech.tts.TextToSpeech$Connection
 android.speech.tts.TextToSpeech$EngineInfo
 android.speech.tts.TextToSpeech$OnInitListener
@@ -5687,9 +5893,6 @@
 android.telecom.TimedEvent
 android.telecom.VideoProfile$1
 android.telecom.VideoProfile
-android.telephony.-$$Lambda$DataFailCause$djkZSxdG-s-w2L5rQKiGu6OudyY
-android.telephony.-$$Lambda$MLKtmRGKP3e0WU7x_KyS5-Vg8q4
-android.telephony.-$$Lambda$NetworkRegistrationInfo$1JuZmO5PoYGZY8bHhZYwvmqwOB0
 android.telephony.-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$1M3m0i6211i2YjWyTDT7l0bJm3I
 android.telephony.-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$1uNdvGRe99lTurQeP2pTQkZS7Vs
 android.telephony.-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$2XBMUIj05jt4Xm08XAsE57q5gCc
@@ -5710,6 +5913,7 @@
 android.telephony.-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$E9hw_LXFliykadzCB_mw8nukNGI
 android.telephony.-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$F-YGB2a8GrHG6CB17lzASQZXVHI
 android.telephony.-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$FBJGFGXoSvidKfm50cEzC3i9rVk
+android.telephony.-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$GJ2YJ4ARy5-u2bWutnqrYMAsLYA
 android.telephony.-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$HEcWn-J1WRb0wLERu2qoMIZDfjY
 android.telephony.-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$Hbn6-eZxY2p3rjOfStodI04A8E8
 android.telephony.-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$IU278K5QbmReF-mbpcNVAvVlhFI
@@ -5721,6 +5925,7 @@
 android.telephony.-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$Q2A8FgYlU8_D6PD78tThGut_rTc
 android.telephony.-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$RC2x2ijetA-pQrLa4QakzMBjh_k
 android.telephony.-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$Rh4FuYaAZPAbrOYr6GGF6llSePE
+android.telephony.-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$SLDsZb_RTXJpIvKJwCENgXrSXcU
 android.telephony.-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$TqrkuLPlaG_ucU7VbLS4tnf8hG8
 android.telephony.-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$VCD7izkh9A_sRz9zMUPYy-TktLo
 android.telephony.-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$W65ui1dCCc-JnQa7gon1I7Bz7Sk
@@ -5752,331 +5957,57 @@
 android.telephony.-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$yGF2cJtJjwhRqDU8M4yzwgROulY
 android.telephony.-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$ygzOWFRiY4sZQ4WYUPIefqgiGvM
 android.telephony.-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$yvQnAlFGg5EWDG2vcA9X-4xnalA
-android.telephony.-$$Lambda$SubscriptionManager$D5_PmvQ13e0qLtSnBvNd4R7l2qA
-android.telephony.-$$Lambda$SubscriptionManager$R_uORt9bKcmEo6JnjiGP2KgjIOQ
-android.telephony.-$$Lambda$TelephonyFrameworkInitializer$3Kis6wL1IbLustWe9A2o4-2YpGo
-android.telephony.-$$Lambda$TelephonyFrameworkInitializer$MLDtRnX1dj1RKFdjgIsOvcQxhA0
-android.telephony.-$$Lambda$TelephonyFrameworkInitializer$b_92_3ZijRrdEa9yLyFA5xu19OM
-android.telephony.-$$Lambda$TelephonyFrameworkInitializer$mpe0Kh92VEQmEtmo60oqykdvnBE
-android.telephony.-$$Lambda$TelephonyFrameworkInitializer$o3geRfUaRT9tnqKKZbu1EbUxw4Q
-android.telephony.-$$Lambda$TelephonyFrameworkInitializer$sQClc4rjc9ydh0nXpY79gr33av4
+android.telephony.-$$Lambda$TelephonyManager$1$scMPky6lOZrCjFC3d4STbtLfpHE
 android.telephony.-$$Lambda$TelephonyManager$2$l6Pazxfi7QghMr2Z0MpduhNe6yc
 android.telephony.-$$Lambda$TelephonyRegistryManager$1$cLzLZB4oGnI-HG_-4MhxcXoHys8
-android.telephony.AccessNetworkConstants$AccessNetworkType
-android.telephony.AccessNetworkConstants$TransportType
-android.telephony.AccessNetworkConstants
-android.telephony.AccessNetworkUtils
-android.telephony.AnomalyReporter
-android.telephony.AvailableNetworkInfo
-android.telephony.CallAttributes$1
-android.telephony.CallAttributes
-android.telephony.CallQuality$1
-android.telephony.CallQuality
-android.telephony.CarrierConfigManager$Gps
-android.telephony.CarrierConfigManager
-android.telephony.CarrierRestrictionRules$1
+android.telephony.AvailableNetworkInfo$1
 android.telephony.CarrierRestrictionRules$Builder
-android.telephony.CarrierRestrictionRules
-android.telephony.CellConfigLte$1
-android.telephony.CellConfigLte
-android.telephony.CellIdentity$1
-android.telephony.CellIdentity
-android.telephony.CellIdentityCdma$1
-android.telephony.CellIdentityCdma
-android.telephony.CellIdentityGsm$1
-android.telephony.CellIdentityGsm
-android.telephony.CellIdentityLte$1
-android.telephony.CellIdentityLte
-android.telephony.CellIdentityNr$1
-android.telephony.CellIdentityNr
-android.telephony.CellIdentityTdscdma$1
-android.telephony.CellIdentityTdscdma
-android.telephony.CellIdentityWcdma$1
-android.telephony.CellIdentityWcdma
-android.telephony.CellInfo$1
-android.telephony.CellInfo
-android.telephony.CellInfoCdma$1
-android.telephony.CellInfoCdma
-android.telephony.CellInfoGsm$1
-android.telephony.CellInfoGsm
-android.telephony.CellInfoLte$1
-android.telephony.CellInfoLte
-android.telephony.CellInfoNr$1
-android.telephony.CellInfoNr
-android.telephony.CellInfoTdscdma$1
-android.telephony.CellInfoTdscdma
-android.telephony.CellInfoWcdma$1
-android.telephony.CellInfoWcdma
-android.telephony.CellLocation
-android.telephony.CellSignalStrength
-android.telephony.CellSignalStrengthCdma$1
-android.telephony.CellSignalStrengthCdma
-android.telephony.CellSignalStrengthGsm$1
-android.telephony.CellSignalStrengthGsm
-android.telephony.CellSignalStrengthLte$1
-android.telephony.CellSignalStrengthLte
-android.telephony.CellSignalStrengthNr$1
-android.telephony.CellSignalStrengthNr
-android.telephony.CellSignalStrengthTdscdma$1
-android.telephony.CellSignalStrengthTdscdma
-android.telephony.CellSignalStrengthWcdma$1
-android.telephony.CellSignalStrengthWcdma
-android.telephony.ClientRequestStats$1
-android.telephony.ClientRequestStats
 android.telephony.DataConnectionRealTimeInfo$1
 android.telephony.DataConnectionRealTimeInfo
-android.telephony.DataFailCause$1
-android.telephony.DataFailCause
-android.telephony.DataSpecificRegistrationInfo$1
-android.telephony.DataSpecificRegistrationInfo
 android.telephony.DisconnectCause
-android.telephony.ICellInfoCallback$Stub$Proxy
-android.telephony.ICellInfoCallback$Stub
-android.telephony.ICellInfoCallback
-android.telephony.INetworkService$Stub$Proxy
-android.telephony.INetworkService$Stub
-android.telephony.INetworkService
 android.telephony.INetworkServiceCallback$Stub$Proxy
-android.telephony.INetworkServiceCallback$Stub
-android.telephony.INetworkServiceCallback
-android.telephony.IccOpenLogicalChannelResponse$1
-android.telephony.IccOpenLogicalChannelResponse
-android.telephony.ImsiEncryptionInfo$1
-android.telephony.ImsiEncryptionInfo
-android.telephony.JapanesePhoneNumberFormatter
 android.telephony.LocationAccessPolicy$LocationPermissionQuery$Builder
 android.telephony.LocationAccessPolicy$LocationPermissionQuery
 android.telephony.LocationAccessPolicy$LocationPermissionResult
 android.telephony.LocationAccessPolicy
-android.telephony.LteVopsSupportInfo$1
-android.telephony.LteVopsSupportInfo
 android.telephony.MmsManager
-android.telephony.ModemActivityInfo$1
-android.telephony.ModemActivityInfo$TransmitPower
-android.telephony.ModemActivityInfo
-android.telephony.ModemInfo$1
-android.telephony.ModemInfo
-android.telephony.NeighboringCellInfo$1
-android.telephony.NeighboringCellInfo
-android.telephony.NetworkRegistrationInfo$1
-android.telephony.NetworkRegistrationInfo$Builder
-android.telephony.NetworkRegistrationInfo
-android.telephony.NetworkScan
-android.telephony.NetworkScanRequest$1
-android.telephony.NetworkScanRequest
-android.telephony.NetworkService$INetworkServiceWrapper
-android.telephony.NetworkService$NetworkServiceHandler
-android.telephony.NetworkService$NetworkServiceProvider
-android.telephony.NetworkService
-android.telephony.NetworkServiceCallback
 android.telephony.NumberVerificationCallback
 android.telephony.PackageChangeReceiver
-android.telephony.PhoneCapability$1
-android.telephony.PhoneCapability
-android.telephony.PhoneNumberRange$1
-android.telephony.PhoneNumberRange
-android.telephony.PhoneNumberUtils
 android.telephony.PhoneStateListener$IPhoneStateListenerStub
 android.telephony.PhoneStateListener
-android.telephony.PhysicalChannelConfig$1
-android.telephony.PhysicalChannelConfig$Builder
-android.telephony.PhysicalChannelConfig
-android.telephony.PreciseCallState$1
-android.telephony.PreciseCallState
-android.telephony.PreciseDataConnectionState$1
-android.telephony.PreciseDataConnectionState
-android.telephony.RadioAccessFamily$1
-android.telephony.RadioAccessFamily
+android.telephony.RadioAccessSpecifier$1
 android.telephony.RadioAccessSpecifier
 android.telephony.Rlog
-android.telephony.ServiceState$1
-android.telephony.ServiceState
-android.telephony.SignalStrength$1
-android.telephony.SignalStrength
+android.telephony.SmsCbCmasInfo$1
 android.telephony.SmsCbCmasInfo
-android.telephony.SmsCbEtwsInfo
-android.telephony.SmsCbLocation
-android.telephony.SmsCbMessage
-android.telephony.SmsManager
+android.telephony.SmsCbEtwsInfo$1
+android.telephony.SmsCbLocation$1
+android.telephony.SmsCbMessage$1
 android.telephony.SmsMessage$1
 android.telephony.SmsMessage$MessageClass
-android.telephony.SmsMessage
-android.telephony.SubscriptionInfo$1
-android.telephony.SubscriptionInfo
-android.telephony.SubscriptionManager$OnOpportunisticSubscriptionsChangedListener
-android.telephony.SubscriptionManager$OnSubscriptionsChangedListener$OnSubscriptionsChangedListenerHandler
-android.telephony.SubscriptionManager$OnSubscriptionsChangedListener
-android.telephony.SubscriptionManager
 android.telephony.SubscriptionPlan$1
 android.telephony.SubscriptionPlan
-android.telephony.TelephonyFrameworkInitializer
-android.telephony.TelephonyHistogram$1
-android.telephony.TelephonyHistogram
+android.telephony.TelephonyDisplayInfo
 android.telephony.TelephonyManager$1
 android.telephony.TelephonyManager$2
-android.telephony.TelephonyManager$5
-android.telephony.TelephonyManager$7
-android.telephony.TelephonyManager$CellInfoCallback
-android.telephony.TelephonyManager$MultiSimVariants
 android.telephony.TelephonyManager$UssdResponseCallback
-android.telephony.TelephonyManager
 android.telephony.TelephonyRegistryManager$1
 android.telephony.TelephonyRegistryManager$2
 android.telephony.TelephonyRegistryManager
 android.telephony.TelephonyScanManager$NetworkScanCallback
-android.telephony.UiccAccessRule$1
-android.telephony.UiccAccessRule
-android.telephony.UiccCardInfo$1
-android.telephony.UiccCardInfo
-android.telephony.UiccSlotInfo$1
-android.telephony.UiccSlotInfo
+android.telephony.UssdResponse$1
 android.telephony.UssdResponse
-android.telephony.VisualVoicemailSmsFilterSettings$1
-android.telephony.VisualVoicemailSmsFilterSettings$Builder
-android.telephony.VisualVoicemailSmsFilterSettings
-android.telephony.VoiceSpecificRegistrationInfo$1
-android.telephony.VoiceSpecificRegistrationInfo
-android.telephony.cdma.CdmaCellLocation
-android.telephony.data.ApnSetting$1
-android.telephony.data.ApnSetting$Builder
-android.telephony.data.ApnSetting
-android.telephony.data.DataCallResponse$1
-android.telephony.data.DataCallResponse
-android.telephony.data.DataProfile$1
-android.telephony.data.DataProfile$Builder
-android.telephony.data.DataProfile
-android.telephony.data.DataService$DataCallListChangedIndication
-android.telephony.data.DataService$DataServiceHandler
-android.telephony.data.DataService$DataServiceProvider
-android.telephony.data.DataService$DeactivateDataCallRequest
-android.telephony.data.DataService$IDataServiceWrapper
-android.telephony.data.DataService$SetDataProfileRequest
-android.telephony.data.DataService$SetInitialAttachApnRequest
-android.telephony.data.DataService$SetupDataCallRequest
-android.telephony.data.DataService
-android.telephony.data.DataServiceCallback
-android.telephony.data.IDataService$Stub$Proxy
-android.telephony.data.IDataService$Stub
-android.telephony.data.IDataService
 android.telephony.data.IDataServiceCallback$Stub$Proxy
-android.telephony.data.IDataServiceCallback$Stub
-android.telephony.data.IDataServiceCallback
-android.telephony.data.IQualifiedNetworksService$Stub$Proxy
-android.telephony.data.IQualifiedNetworksService$Stub
-android.telephony.data.IQualifiedNetworksService
 android.telephony.data.IQualifiedNetworksServiceCallback$Stub$Proxy
-android.telephony.data.IQualifiedNetworksServiceCallback$Stub
-android.telephony.data.IQualifiedNetworksServiceCallback
-android.telephony.emergency.EmergencyNumber$1
-android.telephony.emergency.EmergencyNumber
-android.telephony.euicc.DownloadableSubscription
+android.telephony.euicc.DownloadableSubscription$1
 android.telephony.euicc.EuiccCardManager$13
 android.telephony.euicc.EuiccCardManager$1
-android.telephony.euicc.EuiccCardManager$ResultCallback
-android.telephony.euicc.EuiccCardManager
+android.telephony.euicc.EuiccInfo$1
 android.telephony.euicc.EuiccInfo
-android.telephony.euicc.EuiccManager
-android.telephony.gsm.GsmCellLocation
-android.telephony.ims.-$$Lambda$ImsMmTelManager$CapabilityCallback$CapabilityBinder$4YNlUy9HsD02E7Sbv2VeVtbao08
-android.telephony.ims.-$$Lambda$ProvisioningManager$Callback$CallbackBinder$R_8jXQuOM7aV7dIwYBzcWwV-YpM
-android.telephony.ims.-$$Lambda$RegistrationManager$RegistrationCallback$RegistrationBinder$APeqso3VzZZ0eUf5slP1k5xoCME
-android.telephony.ims.-$$Lambda$RegistrationManager$RegistrationCallback$RegistrationBinder$DX_-dWIBwwX2oqDoRnq49RndG7s
-android.telephony.ims.-$$Lambda$RegistrationManager$RegistrationCallback$RegistrationBinder$uTxkp6C02qJxic1W_dkZRCQ6aRw
-android.telephony.ims.ImsCallForwardInfo$1
-android.telephony.ims.ImsCallForwardInfo
-android.telephony.ims.ImsCallProfile$1
-android.telephony.ims.ImsCallProfile
-android.telephony.ims.ImsException
-android.telephony.ims.ImsExternalCallState$1
-android.telephony.ims.ImsExternalCallState
-android.telephony.ims.ImsManager
-android.telephony.ims.ImsMmTelManager$3
-android.telephony.ims.ImsMmTelManager$CapabilityCallback$CapabilityBinder
-android.telephony.ims.ImsMmTelManager$CapabilityCallback
-android.telephony.ims.ImsMmTelManager$RegistrationCallback
-android.telephony.ims.ImsMmTelManager
-android.telephony.ims.ImsReasonInfo$1
-android.telephony.ims.ImsReasonInfo
-android.telephony.ims.ImsService$1
-android.telephony.ims.ImsService$Listener
-android.telephony.ims.ImsService
-android.telephony.ims.ImsSsData
-android.telephony.ims.ImsSsInfo$1
-android.telephony.ims.ImsSsInfo
-android.telephony.ims.ImsUtListener
-android.telephony.ims.ProvisioningManager$Callback$CallbackBinder
-android.telephony.ims.ProvisioningManager$Callback
-android.telephony.ims.RegistrationManager$1
-android.telephony.ims.RegistrationManager$RegistrationCallback$RegistrationBinder
-android.telephony.ims.RegistrationManager$RegistrationCallback
-android.telephony.ims.RegistrationManager
-android.telephony.ims.aidl.IImsCapabilityCallback$Stub$Proxy
-android.telephony.ims.aidl.IImsCapabilityCallback$Stub
-android.telephony.ims.aidl.IImsCapabilityCallback
-android.telephony.ims.aidl.IImsConfig$Stub$Proxy
-android.telephony.ims.aidl.IImsConfig$Stub
-android.telephony.ims.aidl.IImsConfig
-android.telephony.ims.aidl.IImsConfigCallback$Stub$Proxy
-android.telephony.ims.aidl.IImsConfigCallback$Stub
-android.telephony.ims.aidl.IImsConfigCallback
-android.telephony.ims.aidl.IImsMmTelFeature$Stub$Proxy
-android.telephony.ims.aidl.IImsMmTelFeature$Stub
-android.telephony.ims.aidl.IImsMmTelFeature
-android.telephony.ims.aidl.IImsMmTelListener$Stub$Proxy
-android.telephony.ims.aidl.IImsMmTelListener$Stub
-android.telephony.ims.aidl.IImsMmTelListener
-android.telephony.ims.aidl.IImsRcsFeature$Stub
-android.telephony.ims.aidl.IImsRcsFeature
-android.telephony.ims.aidl.IImsRegistration$Stub
-android.telephony.ims.aidl.IImsRegistration
-android.telephony.ims.aidl.IImsRegistrationCallback$Stub$Proxy
-android.telephony.ims.aidl.IImsRegistrationCallback$Stub
-android.telephony.ims.aidl.IImsRegistrationCallback
-android.telephony.ims.aidl.IImsServiceController$Stub$Proxy
-android.telephony.ims.aidl.IImsServiceController$Stub
-android.telephony.ims.aidl.IImsServiceController
+android.telephony.ims.ImsSsData$1
 android.telephony.ims.aidl.IImsServiceControllerListener$Stub$Proxy
-android.telephony.ims.aidl.IImsServiceControllerListener$Stub
-android.telephony.ims.aidl.IImsServiceControllerListener
-android.telephony.ims.aidl.IImsSmsListener$Stub$Proxy
-android.telephony.ims.aidl.IImsSmsListener$Stub
-android.telephony.ims.aidl.IImsSmsListener
-android.telephony.ims.aidl.IRcsMessage$Stub
-android.telephony.ims.aidl.IRcsMessage
-android.telephony.ims.feature.-$$Lambda$ImsFeature$9bLETU1BeS-dFzQnbBBs3kwaz-8
 android.telephony.ims.feature.-$$Lambda$ImsFeature$rPSMsRhoup9jfT6nt1MV2qhomrM
-android.telephony.ims.feature.CapabilityChangeRequest$1
-android.telephony.ims.feature.CapabilityChangeRequest$CapabilityPair
-android.telephony.ims.feature.CapabilityChangeRequest
-android.telephony.ims.feature.ImsFeature$1
-android.telephony.ims.feature.ImsFeature$2
-android.telephony.ims.feature.ImsFeature$Capabilities
-android.telephony.ims.feature.ImsFeature$CapabilityCallbackProxy
-android.telephony.ims.feature.ImsFeature
-android.telephony.ims.feature.MmTelFeature$1
-android.telephony.ims.feature.MmTelFeature$Listener
-android.telephony.ims.feature.MmTelFeature$MmTelCapabilities
-android.telephony.ims.feature.MmTelFeature
-android.telephony.ims.stub.-$$Lambda$ImsConfigImplBase$yL4863k-FoQyqg_FX2mWsLMqbyA
-android.telephony.ims.stub.-$$Lambda$ImsRegistrationImplBase$cWwTXSDsk-bWPbsDJYI--DUBMnE
-android.telephony.ims.stub.-$$Lambda$ImsRegistrationImplBase$s7PspXVbCf1Q_WSzodP2glP9TjI
-android.telephony.ims.stub.-$$Lambda$ImsRegistrationImplBase$sbjuTvW-brOSWMR74UInSZEIQB0
-android.telephony.ims.stub.-$$Lambda$ImsRegistrationImplBase$wwtkoeOtGwMjG5I0-ZTfjNpGU-s
-android.telephony.ims.stub.ImsCallSessionImplBase
-android.telephony.ims.stub.ImsConfigImplBase$ImsConfigStub
-android.telephony.ims.stub.ImsConfigImplBase
-android.telephony.ims.stub.ImsEcbmImplBase$1
-android.telephony.ims.stub.ImsEcbmImplBase
-android.telephony.ims.stub.ImsFeatureConfiguration$1
-android.telephony.ims.stub.ImsFeatureConfiguration$FeatureSlotPair
-android.telephony.ims.stub.ImsFeatureConfiguration
-android.telephony.ims.stub.ImsMultiEndpointImplBase$1
-android.telephony.ims.stub.ImsMultiEndpointImplBase
-android.telephony.ims.stub.ImsRegistrationImplBase$1
-android.telephony.ims.stub.ImsRegistrationImplBase
-android.telephony.ims.stub.ImsSmsImplBase
-android.telephony.ims.stub.ImsUtImplBase$1
-android.telephony.ims.stub.ImsUtImplBase
+android.text.-$$Lambda$Layout$MzjK2UE2G8VG0asK8_KWY3gHAmY
 android.text.AndroidBidi$EmojiBidiOverride
 android.text.AndroidBidi
 android.text.AndroidCharacter
@@ -6135,6 +6066,7 @@
 android.text.Layout$Directions
 android.text.Layout$Ellipsizer
 android.text.Layout$HorizontalMeasurementProvider
+android.text.Layout$SelectionRectangleConsumer
 android.text.Layout$SpannedEllipsizer
 android.text.Layout$TabStops
 android.text.Layout
@@ -6205,8 +6137,10 @@
 android.text.method.LinkMovementMethod
 android.text.method.MetaKeyKeyListener
 android.text.method.MovementMethod
+android.text.method.MultiTapKeyListener
 android.text.method.NumberKeyListener
 android.text.method.PasswordTransformationMethod
+android.text.method.QwertyKeyListener$Replaced
 android.text.method.QwertyKeyListener
 android.text.method.ReplacementTransformationMethod$ReplacementCharSequence
 android.text.method.ReplacementTransformationMethod$SpannedReplacementCharSequence
@@ -6214,6 +6148,7 @@
 android.text.method.ScrollingMovementMethod
 android.text.method.SingleLineTransformationMethod
 android.text.method.TextKeyListener$Capitalize
+android.text.method.TextKeyListener$NullKeyListener
 android.text.method.TextKeyListener$SettingsObserver
 android.text.method.TextKeyListener
 android.text.method.TimeKeyListener
@@ -6525,6 +6460,7 @@
 android.view.-$$Lambda$InsetsController$6uoSHBPvxV1C0JOZKhH1AyuNXmo
 android.view.-$$Lambda$InsetsController$Cj7UJrCkdHvJAZ_cYKrXuTMsjz8
 android.view.-$$Lambda$InsetsController$HI9QZ2HvGm6iykc-WONz2KPG61Q
+android.view.-$$Lambda$InsetsController$InternalAnimationControlListener$SInf91MjJKDQFXwrp7C-HBi0xaQ
 android.view.-$$Lambda$InsetsController$RZT3QkL9zMFTeHtZbfcaHIzvlsc
 android.view.-$$Lambda$InsetsController$zpmOxHfTFV_3me2u3C8YaXSUauQ
 android.view.-$$Lambda$PYGleuqIeCxjTD1pJqqx1opFv1g
@@ -6536,6 +6472,8 @@
 android.view.-$$Lambda$ThreadedRenderer$ydBD-R1iP5u-97XYakm-jKvC1b4
 android.view.-$$Lambda$View$bhR1vB5ZYp3dv-Kth4jtLSS0KEs
 android.view.-$$Lambda$View$llq76MkPXP4bNcb9oJt_msw0fnQ
+android.view.-$$Lambda$ViewGroup$ViewLocationHolder$AjKvqdj7SGGIzA5qrlZUuu71jl8
+android.view.-$$Lambda$ViewGroup$ViewLocationHolder$QbO7cM0ULKe25a7bfXG3VH6DB0c
 android.view.-$$Lambda$ViewRootImpl$DJd0VUYJgsebcnSohO6h8zc_ONI
 android.view.-$$Lambda$ViewRootImpl$IReiNMSbDakZSGbIZuL_ifaFWn8
 android.view.-$$Lambda$ViewRootImpl$YBiqAhbCbXVPSKdbE3K4rH2gpxI
@@ -6552,6 +6490,7 @@
 android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher
 android.view.AccessibilityInteractionController$PrivateHandler
 android.view.AccessibilityInteractionController
+android.view.ActionMode$Callback2
 android.view.ActionMode$Callback
 android.view.ActionMode
 android.view.ActionProvider$SubUiVisibilityListener
@@ -6573,6 +6512,8 @@
 android.view.ContextMenu$ContextMenuInfo
 android.view.ContextMenu
 android.view.ContextThemeWrapper
+android.view.CutoutSpecification$Parser
+android.view.CutoutSpecification
 android.view.Display$HdrCapabilities$1
 android.view.Display$HdrCapabilities
 android.view.Display$Mode$1
@@ -6621,6 +6562,7 @@
 android.view.IDisplayFoldListener$Stub$Proxy
 android.view.IDisplayFoldListener$Stub
 android.view.IDisplayFoldListener
+android.view.IDisplayWindowInsetsController$Stub$Proxy
 android.view.IDisplayWindowInsetsController$Stub
 android.view.IDisplayWindowInsetsController
 android.view.IDisplayWindowListener$Stub$Proxy
@@ -6716,6 +6658,15 @@
 android.view.InputQueue
 android.view.InputWindowHandle
 android.view.InsetsAnimationControlCallbacks
+android.view.InsetsAnimationControlImpl
+android.view.InsetsAnimationControlRunner
+android.view.InsetsAnimationThread
+android.view.InsetsController$1
+android.view.InsetsController$InternalAnimationControlListener$1
+android.view.InsetsController$InternalAnimationControlListener$2
+android.view.InsetsController$InternalAnimationControlListener
+android.view.InsetsController$PendingControlRequest
+android.view.InsetsController$RunningAnimation
 android.view.InsetsController
 android.view.InsetsFlags
 android.view.InsetsSource$1
@@ -6752,9 +6703,16 @@
 android.view.MotionEvent$PointerProperties
 android.view.MotionEvent
 android.view.NativeVectorDrawableAnimator
+android.view.NotificationHeaderView$1
+android.view.NotificationHeaderView$HeaderTouchListener
+android.view.NotificationHeaderView
 android.view.OrientationEventListener$SensorEventListenerImpl
 android.view.OrientationEventListener
 android.view.OrientationListener
+android.view.PendingInsetsController
+android.view.PixelCopy$1
+android.view.PixelCopy$OnPixelCopyFinishedListener
+android.view.PixelCopy
 android.view.PointerIcon$1
 android.view.PointerIcon$2
 android.view.PointerIcon
@@ -6796,6 +6754,7 @@
 android.view.SurfaceControl$Transaction$1
 android.view.SurfaceControl$Transaction
 android.view.SurfaceControl
+android.view.SurfaceControlViewHost$SurfacePackage$1
 android.view.SurfaceControlViewHost$SurfacePackage
 android.view.SurfaceHolder$Callback2
 android.view.SurfaceHolder$Callback
@@ -6804,6 +6763,9 @@
 android.view.SurfaceView$1
 android.view.SurfaceView$2
 android.view.SurfaceView
+android.view.SyncRtSurfaceTransactionApplier$SurfaceParams$Builder
+android.view.SyncRtSurfaceTransactionApplier$SurfaceParams
+android.view.SyncRtSurfaceTransactionApplier
 android.view.TextureLayer
 android.view.TextureView$SurfaceTextureListener
 android.view.TextureView
@@ -6870,6 +6832,7 @@
 android.view.View$VisibilityChangeForAutofillHandler
 android.view.View
 android.view.ViewAnimationHostBridge
+android.view.ViewAnimationUtils
 android.view.ViewConfiguration
 android.view.ViewDebug$ExportedProperty
 android.view.ViewDebug$FlagToString
@@ -6886,6 +6849,7 @@
 android.view.ViewGroup$MarginLayoutParams
 android.view.ViewGroup$OnHierarchyChangeListener
 android.view.ViewGroup$TouchTarget
+android.view.ViewGroup$ViewLocationHolder
 android.view.ViewGroup
 android.view.ViewGroupOverlay
 android.view.ViewManager
@@ -6985,6 +6949,11 @@
 android.view.WindowInsets$Side
 android.view.WindowInsets$Type
 android.view.WindowInsets
+android.view.WindowInsetsAnimation$Bounds
+android.view.WindowInsetsAnimation$Callback
+android.view.WindowInsetsAnimation
+android.view.WindowInsetsAnimationControlListener
+android.view.WindowInsetsAnimationController
 android.view.WindowInsetsController
 android.view.WindowLeaked
 android.view.WindowManager$BadTokenException
@@ -7018,7 +6987,9 @@
 android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction
 android.view.accessibility.AccessibilityNodeInfo$CollectionInfo
 android.view.accessibility.AccessibilityNodeInfo$CollectionItemInfo
+android.view.accessibility.AccessibilityNodeInfo$ExtraRenderingInfo
 android.view.accessibility.AccessibilityNodeInfo$RangeInfo
+android.view.accessibility.AccessibilityNodeInfo$TouchDelegateInfo$1
 android.view.accessibility.AccessibilityNodeInfo$TouchDelegateInfo
 android.view.accessibility.AccessibilityNodeInfo
 android.view.accessibility.AccessibilityNodeProvider
@@ -7040,6 +7011,7 @@
 android.view.accessibility.IAccessibilityManagerClient$Stub$Proxy
 android.view.accessibility.IAccessibilityManagerClient$Stub
 android.view.accessibility.IAccessibilityManagerClient
+android.view.accessibility.IWindowMagnificationConnection$Stub$Proxy
 android.view.accessibility.IWindowMagnificationConnection$Stub
 android.view.accessibility.IWindowMagnificationConnection
 android.view.accessibility.WeakSparseArray$WeakReferenceWithId
@@ -7100,10 +7072,16 @@
 android.view.autofill.IAutoFillManagerClient$Stub$Proxy
 android.view.autofill.IAutoFillManagerClient$Stub
 android.view.autofill.IAutoFillManagerClient
+android.view.autofill.IAutofillWindowPresenter$Stub$Proxy
 android.view.autofill.IAutofillWindowPresenter$Stub
 android.view.autofill.IAutofillWindowPresenter
 android.view.autofill.ParcelableMap$1
 android.view.autofill.ParcelableMap
+android.view.contentcapture.-$$Lambda$MainContentCaptureSession$1$JPRO-nNGZpgXrKr4QC_iQiTbQx0
+android.view.contentcapture.-$$Lambda$MainContentCaptureSession$1$Xhq3WJibbalS1G_W3PRC2m7muhM
+android.view.contentcapture.-$$Lambda$MainContentCaptureSession$49zT7C2BXrEdkyggyGk1Qs4d46k
+android.view.contentcapture.-$$Lambda$MainContentCaptureSession$HTmdDf687TPcaTnLyPp3wo0gI60
+android.view.contentcapture.-$$Lambda$MainContentCaptureSession$UWslDbWedtPhv49PtRsvG4TlYWw
 android.view.contentcapture.ContentCaptureCondition$1
 android.view.contentcapture.ContentCaptureCondition
 android.view.contentcapture.ContentCaptureContext$1
@@ -7115,17 +7093,27 @@
 android.view.contentcapture.ContentCaptureManager$ContentCaptureClient
 android.view.contentcapture.ContentCaptureManager
 android.view.contentcapture.ContentCaptureSession
+android.view.contentcapture.ContentCaptureSessionId$1
 android.view.contentcapture.ContentCaptureSessionId
 android.view.contentcapture.DataRemovalRequest$1
+android.view.contentcapture.DataRemovalRequest$LocusIdRequest
 android.view.contentcapture.DataRemovalRequest
+android.view.contentcapture.DataShareRequest$1
 android.view.contentcapture.DataShareRequest
+android.view.contentcapture.IContentCaptureDirectManager$Stub$Proxy
+android.view.contentcapture.IContentCaptureDirectManager$Stub
+android.view.contentcapture.IContentCaptureDirectManager
 android.view.contentcapture.IContentCaptureManager$Stub$Proxy
 android.view.contentcapture.IContentCaptureManager$Stub
 android.view.contentcapture.IContentCaptureManager
+android.view.contentcapture.IDataShareWriteAdapter$Stub$Proxy
 android.view.contentcapture.IDataShareWriteAdapter$Stub
 android.view.contentcapture.IDataShareWriteAdapter
 android.view.contentcapture.MainContentCaptureSession$1
 android.view.contentcapture.MainContentCaptureSession
+android.view.contentcapture.ViewNode$ViewNodeText
+android.view.contentcapture.ViewNode$ViewStructureImpl
+android.view.contentcapture.ViewNode
 android.view.inputmethod.-$$Lambda$InputMethodManager$DelegateImpl$r2X8PLo_YIORJTYJGDfinf_IvK4
 android.view.inputmethod.-$$Lambda$InputMethodManager$dfnCauFoZCf-HfXs1QavrkwWDf0
 android.view.inputmethod.-$$Lambda$InputMethodManager$iDWn3IGSUFqIcs8Py42UhfrshxI
@@ -7146,6 +7134,7 @@
 android.view.inputmethod.ExtractedText
 android.view.inputmethod.ExtractedTextRequest$1
 android.view.inputmethod.ExtractedTextRequest
+android.view.inputmethod.InlineSuggestionsRequest$1
 android.view.inputmethod.InlineSuggestionsRequest
 android.view.inputmethod.InputBinding$1
 android.view.inputmethod.InputBinding
@@ -7185,6 +7174,7 @@
 android.view.textclassifier.-$$Lambda$L_UQMPjXwBN0ch4zL2dD82nf9RI
 android.view.textclassifier.-$$Lambda$NxwbyZSxofZ4Z5SQhfXmtLQ1nxk
 android.view.textclassifier.-$$Lambda$OGSS2qx6njxlnp0dnKb4lA3jnw8
+android.view.textclassifier.-$$Lambda$TextClassification$ysasaE5ZkXkkzjVWIJ06GTV92-g
 android.view.textclassifier.-$$Lambda$TextClassificationManager$JIaezIJbMig_-kVzN6oArzkTsJE
 android.view.textclassifier.-$$Lambda$TextClassifierImpl$RRbXefHgcUymI9-P95ArUyMvfbw
 android.view.textclassifier.-$$Lambda$TextClassifierImpl$ftq-sQqJYwUdrdbbr9jz3p4AWos
@@ -7223,9 +7213,11 @@
 android.view.textclassifier.SystemTextClassifier$BlockingCallback
 android.view.textclassifier.SystemTextClassifier$ResponseReceiver
 android.view.textclassifier.SystemTextClassifier
+android.view.textclassifier.SystemTextClassifierMetadata
 android.view.textclassifier.TextClassification$1
 android.view.textclassifier.TextClassification$Builder
 android.view.textclassifier.TextClassification$Request$1
+android.view.textclassifier.TextClassification$Request$Builder
 android.view.textclassifier.TextClassification$Request
 android.view.textclassifier.TextClassification
 android.view.textclassifier.TextClassificationConstants
@@ -7234,6 +7226,8 @@
 android.view.textclassifier.TextClassificationContext
 android.view.textclassifier.TextClassificationManager$SettingsObserver
 android.view.textclassifier.TextClassificationManager
+android.view.textclassifier.TextClassificationSession$CleanerRunnable
+android.view.textclassifier.TextClassificationSession$SelectionEventHelper
 android.view.textclassifier.TextClassificationSession
 android.view.textclassifier.TextClassificationSessionFactory
 android.view.textclassifier.TextClassificationSessionId$1
@@ -7263,9 +7257,11 @@
 android.view.textclassifier.TextLanguage$Request$Builder
 android.view.textclassifier.TextLanguage$Request
 android.view.textclassifier.TextLanguage
+android.view.textclassifier.TextLinks$1
 android.view.textclassifier.TextLinks$Builder
 android.view.textclassifier.TextLinks$Request$1
 android.view.textclassifier.TextLinks$Request
+android.view.textclassifier.TextLinks$TextLink$1
 android.view.textclassifier.TextLinks$TextLink
 android.view.textclassifier.TextLinks$TextLinkSpan
 android.view.textclassifier.TextLinks
@@ -7283,6 +7279,8 @@
 android.view.textclassifier.intent.TemplateIntentFactory
 android.view.textclassifier.logging.SmartSelectionEventTracker$SelectionEvent
 android.view.textclassifier.logging.SmartSelectionEventTracker
+android.view.textservice.SentenceSuggestionsInfo$1
+android.view.textservice.SentenceSuggestionsInfo
 android.view.textservice.SpellCheckerInfo$1
 android.view.textservice.SpellCheckerInfo
 android.view.textservice.SpellCheckerSession$1
@@ -7294,6 +7292,9 @@
 android.view.textservice.SpellCheckerSession
 android.view.textservice.SpellCheckerSubtype$1
 android.view.textservice.SpellCheckerSubtype
+android.view.textservice.SuggestionsInfo$1
+android.view.textservice.SuggestionsInfo
+android.view.textservice.TextInfo$1
 android.view.textservice.TextInfo
 android.view.textservice.TextServicesManager
 android.webkit.ConsoleMessage$MessageLevel
@@ -7301,6 +7302,8 @@
 android.webkit.CookieManager
 android.webkit.CookieSyncManager
 android.webkit.DownloadListener
+android.webkit.FindAddress$ZipRange
+android.webkit.FindAddress
 android.webkit.GeolocationPermissions
 android.webkit.IWebViewUpdateService$Stub$Proxy
 android.webkit.IWebViewUpdateService$Stub
@@ -7323,6 +7326,7 @@
 android.webkit.WebMessagePort
 android.webkit.WebResourceError
 android.webkit.WebResourceRequest
+android.webkit.WebResourceResponse
 android.webkit.WebSettings$PluginState
 android.webkit.WebSettings
 android.webkit.WebStorage
@@ -7353,9 +7357,12 @@
 android.webkit.WebViewProviderResponse$1
 android.webkit.WebViewProviderResponse
 android.webkit.WebViewZygote
+android.widget.-$$Lambda$DZXn7FbDDFyBvNjI-iG9_hfa7kw
+android.widget.-$$Lambda$DateTimeView$ReceiverInfo$AVLnX7U5lTcE9jLnlKKNAT1GUeI
 android.widget.-$$Lambda$Editor$MagnifierMotionAnimator$E-RaelOMgCHAzvKgSSZE-hDYeIg
 android.widget.-$$Lambda$IfzAW5fP9thoftErKAjo9SLZufw
 android.widget.-$$Lambda$PopupWindow$8Gc2stI5cSJZbuKX7X4Qr_vU2nI
+android.widget.-$$Lambda$PopupWindow$PopupDecorView$T99WKEnQefOCXbbKvW95WY38p_I
 android.widget.-$$Lambda$PopupWindow$nV1HS3Nc6Ck5JRIbIHe3mkyHWzc
 android.widget.-$$Lambda$RemoteViews$FAOkoZgPKPkiYdtkDxAhkeoykww
 android.widget.-$$Lambda$RemoteViews$Ld8XNSMwygf42608Zln-rjTyHy0
@@ -7389,6 +7396,7 @@
 android.widget.AbsSeekBar
 android.widget.AbsSpinner$RecycleBin
 android.widget.AbsSpinner$SavedState$1
+android.widget.AbsSpinner$SavedState
 android.widget.AbsSpinner
 android.widget.AbsoluteLayout$LayoutParams
 android.widget.AbsoluteLayout
@@ -7428,8 +7436,14 @@
 android.widget.Chronometer$OnChronometerTickListener
 android.widget.Chronometer
 android.widget.CompoundButton$OnCheckedChangeListener
+android.widget.CompoundButton$SavedState$1
 android.widget.CompoundButton$SavedState
 android.widget.CompoundButton
+android.widget.DateTimeView$ReceiverInfo$1
+android.widget.DateTimeView$ReceiverInfo$2
+android.widget.DateTimeView$ReceiverInfo
+android.widget.DateTimeView
+android.widget.DropDownListView
 android.widget.EdgeEffect
 android.widget.EditText
 android.widget.Editor$1
@@ -7448,7 +7462,9 @@
 android.widget.Editor$HandleView
 android.widget.Editor$InputContentType
 android.widget.Editor$InputMethodState
+android.widget.Editor$InsertionHandleView$1
 android.widget.Editor$InsertionHandleView
+android.widget.Editor$InsertionPointCursorController$1
 android.widget.Editor$InsertionPointCursorController
 android.widget.Editor$MagnifierMotionAnimator
 android.widget.Editor$PinnedPopupWindow
@@ -7474,7 +7490,11 @@
 android.widget.FastScroller$5
 android.widget.FastScroller$6
 android.widget.FastScroller
+android.widget.Filter$Delayer
 android.widget.Filter$FilterListener
+android.widget.Filter$FilterResults
+android.widget.Filter$RequestArguments
+android.widget.Filter$RequestHandler
 android.widget.Filter$ResultsHandler
 android.widget.Filter
 android.widget.Filterable
@@ -7537,6 +7557,12 @@
 android.widget.PopupWindow$2
 android.widget.PopupWindow$3
 android.widget.PopupWindow$OnDismissListener
+android.widget.PopupWindow$PopupBackgroundView
+android.widget.PopupWindow$PopupDecorView$1$1
+android.widget.PopupWindow$PopupDecorView$1
+android.widget.PopupWindow$PopupDecorView$2
+android.widget.PopupWindow$PopupDecorView$3
+android.widget.PopupWindow$PopupDecorView$4
 android.widget.PopupWindow$PopupDecorView
 android.widget.PopupWindow
 android.widget.ProgressBar$1
@@ -7612,13 +7638,16 @@
 android.widget.SelectionActionModeHelper
 android.widget.SmartSelectSprite
 android.widget.Space
+android.widget.SpellChecker$1
 android.widget.SpellChecker$SpellParser
 android.widget.SpellChecker
 android.widget.Spinner$1
+android.widget.Spinner$DialogPopup
 android.widget.Spinner$DropDownAdapter
 android.widget.Spinner$DropdownPopup$1
 android.widget.Spinner$DropdownPopup
 android.widget.Spinner$SavedState$1
+android.widget.Spinner$SavedState
 android.widget.Spinner$SpinnerPopup
 android.widget.Spinner
 android.widget.SpinnerAdapter
@@ -7628,6 +7657,10 @@
 android.widget.TableLayout
 android.widget.TableRow$ChildrenTracker
 android.widget.TableRow
+android.widget.TextClock$1
+android.widget.TextClock$2
+android.widget.TextClock$FormatChangeObserver
+android.widget.TextClock
 android.widget.TextView$1
 android.widget.TextView$2
 android.widget.TextView$3
@@ -7651,6 +7684,7 @@
 android.widget.Toast$TN$1
 android.widget.Toast$TN
 android.widget.Toast
+android.widget.ToastPresenter
 android.widget.ToggleButton
 android.widget.Toolbar$1
 android.widget.Toolbar$2
@@ -7661,6 +7695,9 @@
 android.widget.Toolbar$SavedState
 android.widget.Toolbar
 android.widget.ViewAnimator
+android.widget.ViewFlipper$1
+android.widget.ViewFlipper$2
+android.widget.ViewFlipper
 android.widget.ViewSwitcher
 android.widget.WrapperListAdapter
 com.android.framework.protobuf.nano.CodedInputByteBufferNano
@@ -7680,6 +7717,8 @@
 com.android.i18n.phonenumbers.NumberParseException$ErrorType
 com.android.i18n.phonenumbers.NumberParseException
 com.android.i18n.phonenumbers.PhoneNumberMatch
+com.android.i18n.phonenumbers.PhoneNumberMatcher$State
+com.android.i18n.phonenumbers.PhoneNumberMatcher
 com.android.i18n.phonenumbers.PhoneNumberUtil$1
 com.android.i18n.phonenumbers.PhoneNumberUtil$2
 com.android.i18n.phonenumbers.PhoneNumberUtil$Leniency$1
@@ -7728,13 +7767,9 @@
 com.android.ims.ImsCall$Listener
 com.android.ims.ImsCall
 com.android.ims.ImsCallbackAdapterManager
-com.android.ims.ImsConfig
-com.android.ims.ImsConfigListener$Stub
-com.android.ims.ImsConfigListener
 com.android.ims.ImsEcbm$ImsEcbmListenerProxy
 com.android.ims.ImsEcbm
 com.android.ims.ImsEcbmStateListener
-com.android.ims.ImsException
 com.android.ims.ImsExternalCallStateListener
 com.android.ims.ImsManager$2
 com.android.ims.ImsManager$3
@@ -7745,32 +7780,13 @@
 com.android.ims.ImsMultiEndpoint
 com.android.ims.ImsUt$IImsUtListenerProxy
 com.android.ims.ImsUt
-com.android.ims.ImsUtInterface
 com.android.ims.MmTelFeatureConnection$CapabilityCallbackManager
 com.android.ims.MmTelFeatureConnection$ImsRegistrationCallbackAdapter
 com.android.ims.MmTelFeatureConnection$ProvisioningCallbackManager
 com.android.ims.MmTelFeatureConnection
 com.android.ims.Registrant
 com.android.ims.internal.ICall
-com.android.ims.internal.IImsCallSession
-com.android.ims.internal.IImsEcbm$Stub
-com.android.ims.internal.IImsEcbm
-com.android.ims.internal.IImsEcbmListener$Stub
-com.android.ims.internal.IImsEcbmListener
-com.android.ims.internal.IImsExternalCallStateListener$Stub
-com.android.ims.internal.IImsExternalCallStateListener
 com.android.ims.internal.IImsFeatureStatusCallback$Stub$Proxy
-com.android.ims.internal.IImsFeatureStatusCallback$Stub
-com.android.ims.internal.IImsFeatureStatusCallback
-com.android.ims.internal.IImsMultiEndpoint$Stub
-com.android.ims.internal.IImsMultiEndpoint
-com.android.ims.internal.IImsServiceFeatureCallback$Stub$Proxy
-com.android.ims.internal.IImsServiceFeatureCallback$Stub
-com.android.ims.internal.IImsServiceFeatureCallback
-com.android.ims.internal.IImsUt$Stub
-com.android.ims.internal.IImsUt
-com.android.ims.internal.IImsUtListener$Stub
-com.android.ims.internal.IImsUtListener
 com.android.ims.internal.ImsVideoCallProviderWrapper$ImsVideoProviderWrapperCallback
 com.android.ims.internal.uce.UceServiceBase$UceServiceBinder
 com.android.ims.internal.uce.UceServiceBase
@@ -7898,15 +7914,24 @@
 com.android.internal.backup.IBackupTransport$Stub
 com.android.internal.backup.IBackupTransport
 com.android.internal.colorextraction.ColorExtractor$GradientColors
+com.android.internal.colorextraction.ColorExtractor$LoadWallpaperColors
+com.android.internal.colorextraction.ColorExtractor$OnColorsChangedListener
+com.android.internal.colorextraction.ColorExtractor
+com.android.internal.colorextraction.drawable.-$$Lambda$ScrimDrawable$UWtyAZ9Ss5P5TukFNvAyvh0pNf0
+com.android.internal.colorextraction.drawable.ScrimDrawable$1
+com.android.internal.colorextraction.drawable.ScrimDrawable
 com.android.internal.colorextraction.types.ExtractionType
 com.android.internal.colorextraction.types.Tonal$ConfigParser
 com.android.internal.colorextraction.types.Tonal$TonalPalette
 com.android.internal.colorextraction.types.Tonal
+com.android.internal.compat.AndroidBuildClassifier
 com.android.internal.compat.ChangeReporter$ChangeReport
 com.android.internal.compat.ChangeReporter
+com.android.internal.compat.CompatibilityChangeConfig$1
 com.android.internal.compat.CompatibilityChangeConfig
 com.android.internal.compat.CompatibilityChangeInfo$1
 com.android.internal.compat.CompatibilityChangeInfo
+com.android.internal.compat.IOverrideValidator$Stub
 com.android.internal.compat.IOverrideValidator
 com.android.internal.compat.IPlatformCompat$Stub$Proxy
 com.android.internal.compat.IPlatformCompat$Stub
@@ -7968,8 +7993,10 @@
 com.android.internal.infra.AndroidFuture$2
 com.android.internal.infra.AndroidFuture
 com.android.internal.infra.GlobalWhitelistState
+com.android.internal.infra.IAndroidFuture$Stub$Proxy
 com.android.internal.infra.IAndroidFuture$Stub
 com.android.internal.infra.IAndroidFuture
+com.android.internal.infra.PerUser
 com.android.internal.infra.RemoteStream$1
 com.android.internal.infra.RemoteStream
 com.android.internal.infra.ServiceConnector$Impl$CompletionAwareJob
@@ -8001,9 +8028,12 @@
 com.android.internal.location.ProviderProperties$1
 com.android.internal.location.ProviderProperties
 com.android.internal.location.ProviderRequest$1
+com.android.internal.location.ProviderRequest$Builder
 com.android.internal.location.ProviderRequest
+com.android.internal.location.gnssmetrics.GnssMetrics$1
 com.android.internal.location.gnssmetrics.GnssMetrics$GnssPowerMetrics
 com.android.internal.location.gnssmetrics.GnssMetrics$Statistics
+com.android.internal.location.gnssmetrics.GnssMetrics$StatsPullAtomCallbackImpl
 com.android.internal.location.gnssmetrics.GnssMetrics
 com.android.internal.location.nano.GnssLogsProto$GnssLog
 com.android.internal.location.nano.GnssLogsProto$PowerMetrics
@@ -8011,8 +8041,12 @@
 com.android.internal.logging.AndroidHandler$1
 com.android.internal.logging.AndroidHandler
 com.android.internal.logging.EventLogTags
+com.android.internal.logging.InstanceId$1
 com.android.internal.logging.InstanceId
 com.android.internal.logging.MetricsLogger
+com.android.internal.logging.UiEventLogger$UiEventEnum
+com.android.internal.logging.UiEventLogger
+com.android.internal.logging.UiEventLoggerImpl
 com.android.internal.net.INetworkWatchlistManager$Stub$Proxy
 com.android.internal.net.INetworkWatchlistManager$Stub
 com.android.internal.net.INetworkWatchlistManager
@@ -8210,11 +8244,15 @@
 com.android.internal.os.ZygoteServer
 com.android.internal.os.logging.MetricsLoggerWrapper
 com.android.internal.policy.-$$Lambda$PhoneWindow$9SyKQeTuaYx7qUIMJIr4Lk2OpYw
+com.android.internal.policy.-$$Lambda$PhoneWindow$F9lizKYeW8CQHD_8FLjKaBpUfBQ
 com.android.internal.policy.BackdropFrameRenderer
 com.android.internal.policy.DecorContext
 com.android.internal.policy.DecorView$1
 com.android.internal.policy.DecorView$2
 com.android.internal.policy.DecorView$3
+com.android.internal.policy.DecorView$6
+com.android.internal.policy.DecorView$ActionModeCallback2Wrapper$1
+com.android.internal.policy.DecorView$ActionModeCallback2Wrapper
 com.android.internal.policy.DecorView$ColorViewAttributes
 com.android.internal.policy.DecorView$ColorViewState
 com.android.internal.policy.DecorView
@@ -8305,8 +8343,6 @@
 com.android.internal.telephony.-$$Lambda$RIL$Ir4pOMTf7R0Jtw4O3F7JgMVtXO4
 com.android.internal.telephony.-$$Lambda$RIL$ZGWeCQ9boMO1_J1_yQ82l_jK-Nc
 com.android.internal.telephony.-$$Lambda$RIL$zYsQZAc3z9bM5fCaq_J0dn5kjjo
-com.android.internal.telephony.-$$Lambda$RILConstants$ODSbRKyUeaOFMcez-ZudOmaKCBw
-com.android.internal.telephony.-$$Lambda$RILConstants$zIAjDPNpW8a5C22QbMmMwM64vD8
 com.android.internal.telephony.-$$Lambda$RILRequest$VaC9ddQXT8qxCl7rcNKtUadFQoI
 com.android.internal.telephony.-$$Lambda$RadioIndication$GND6XxOOm1d_Ro76zEUFjA9OrEA
 com.android.internal.telephony.-$$Lambda$SmsApplication$5KAxbm71Dll9xmT5zeXi0i27A10
@@ -8371,8 +8407,6 @@
 com.android.internal.telephony.CarrierSignalAgent
 com.android.internal.telephony.CarrierSmsUtils
 com.android.internal.telephony.CellBroadcastServiceManager
-com.android.internal.telephony.CellNetworkScanResult$1
-com.android.internal.telephony.CellNetworkScanResult
 com.android.internal.telephony.CellularNetworkService$CellularNetworkServiceProvider$1
 com.android.internal.telephony.CellularNetworkService$CellularNetworkServiceProvider
 com.android.internal.telephony.CellularNetworkService
@@ -8386,8 +8420,6 @@
 com.android.internal.telephony.Connection$Listener
 com.android.internal.telephony.Connection$PostDialState
 com.android.internal.telephony.Connection
-com.android.internal.telephony.DctConstants$Activity
-com.android.internal.telephony.DctConstants$State
 com.android.internal.telephony.DebugService
 com.android.internal.telephony.DefaultPhoneNotifier$1
 com.android.internal.telephony.DefaultPhoneNotifier
@@ -8399,9 +8431,6 @@
 com.android.internal.telephony.DriverCall$State
 com.android.internal.telephony.DriverCall
 com.android.internal.telephony.EncodeException
-com.android.internal.telephony.ExponentialBackoff$1
-com.android.internal.telephony.ExponentialBackoff$HandlerAdapter
-com.android.internal.telephony.ExponentialBackoff
 com.android.internal.telephony.GlobalSettingsHelper
 com.android.internal.telephony.GsmAlphabet$TextEncodingDetails
 com.android.internal.telephony.GsmAlphabet
@@ -8422,21 +8451,12 @@
 com.android.internal.telephony.HbpcdLookup$MccLookup
 com.android.internal.telephony.HbpcdUtils
 com.android.internal.telephony.HexDump
-com.android.internal.telephony.ICarrierConfigLoader$Stub$Proxy
-com.android.internal.telephony.ICarrierConfigLoader$Stub
-com.android.internal.telephony.ICarrierConfigLoader
 com.android.internal.telephony.IIccPhoneBook$Stub$Proxy
 com.android.internal.telephony.IIccPhoneBook$Stub
 com.android.internal.telephony.IIccPhoneBook
-com.android.internal.telephony.IIntegerConsumer$Stub$Proxy
-com.android.internal.telephony.IIntegerConsumer$Stub
-com.android.internal.telephony.IIntegerConsumer
 com.android.internal.telephony.IMms$Stub$Proxy
 com.android.internal.telephony.IMms$Stub
 com.android.internal.telephony.IMms
-com.android.internal.telephony.INumberVerificationCallback$Stub$Proxy
-com.android.internal.telephony.INumberVerificationCallback$Stub
-com.android.internal.telephony.INumberVerificationCallback
 com.android.internal.telephony.IOnSubscriptionsChangedListener$Stub$Proxy
 com.android.internal.telephony.IOnSubscriptionsChangedListener$Stub
 com.android.internal.telephony.IOnSubscriptionsChangedListener
@@ -8446,30 +8466,12 @@
 com.android.internal.telephony.IPhoneStateListener$Stub$Proxy
 com.android.internal.telephony.IPhoneStateListener$Stub
 com.android.internal.telephony.IPhoneStateListener
-com.android.internal.telephony.IPhoneSubInfo$Stub$Proxy
-com.android.internal.telephony.IPhoneSubInfo$Stub
-com.android.internal.telephony.IPhoneSubInfo
-com.android.internal.telephony.ISetOpportunisticDataCallback$Stub$Proxy
-com.android.internal.telephony.ISetOpportunisticDataCallback$Stub
-com.android.internal.telephony.ISetOpportunisticDataCallback
-com.android.internal.telephony.ISms$Stub$Proxy
-com.android.internal.telephony.ISms$Stub
-com.android.internal.telephony.ISms
-com.android.internal.telephony.ISmsImplBase
 com.android.internal.telephony.IState
-com.android.internal.telephony.ISub$Stub$Proxy
-com.android.internal.telephony.ISub$Stub
-com.android.internal.telephony.ISub
-com.android.internal.telephony.ITelephony$Stub$Proxy
-com.android.internal.telephony.ITelephony$Stub
-com.android.internal.telephony.ITelephony
 com.android.internal.telephony.ITelephonyRegistry$Stub$Proxy
 com.android.internal.telephony.ITelephonyRegistry$Stub
 com.android.internal.telephony.ITelephonyRegistry
 com.android.internal.telephony.IUpdateAvailableNetworksCallback
-com.android.internal.telephony.IWapPushManager
 com.android.internal.telephony.IccCard
-com.android.internal.telephony.IccCardConstants$State
 com.android.internal.telephony.IccPhoneBookInterfaceManager$1
 com.android.internal.telephony.IccPhoneBookInterfaceManager$Request
 com.android.internal.telephony.IccPhoneBookInterfaceManager
@@ -8529,18 +8531,11 @@
 com.android.internal.telephony.NitzStateMachineImpl
 com.android.internal.telephony.OemHookIndication
 com.android.internal.telephony.OemHookResponse
-com.android.internal.telephony.OperatorInfo$1
-com.android.internal.telephony.OperatorInfo$State
-com.android.internal.telephony.OperatorInfo
 com.android.internal.telephony.Phone$1
 com.android.internal.telephony.Phone
 com.android.internal.telephony.PhoneConfigurationManager$ConfigManagerHandler
 com.android.internal.telephony.PhoneConfigurationManager$MockableInterface
 com.android.internal.telephony.PhoneConfigurationManager
-com.android.internal.telephony.PhoneConstantConversions$1
-com.android.internal.telephony.PhoneConstantConversions
-com.android.internal.telephony.PhoneConstants$DataState
-com.android.internal.telephony.PhoneConstants$State
 com.android.internal.telephony.PhoneFactory
 com.android.internal.telephony.PhoneInternalInterface$DataActivityState
 com.android.internal.telephony.PhoneInternalInterface$DialArgs$Builder
@@ -8564,7 +8559,6 @@
 com.android.internal.telephony.RIL$RadioProxyDeathRecipient
 com.android.internal.telephony.RIL$RilHandler
 com.android.internal.telephony.RIL
-com.android.internal.telephony.RILConstants
 com.android.internal.telephony.RILRequest
 com.android.internal.telephony.RadioBugDetector
 com.android.internal.telephony.RadioCapability
@@ -8609,10 +8603,11 @@
 com.android.internal.telephony.SmsDispatchersController$1
 com.android.internal.telephony.SmsDispatchersController
 com.android.internal.telephony.SmsHeader$ConcatRef
+com.android.internal.telephony.SmsHeader$MiscElt
 com.android.internal.telephony.SmsHeader$PortAddrs
+com.android.internal.telephony.SmsHeader$SpecialSmsMsg
 com.android.internal.telephony.SmsHeader
 com.android.internal.telephony.SmsMessageBase$SubmitPduBase
-com.android.internal.telephony.SmsMessageBase
 com.android.internal.telephony.SmsNumberUtils$NumberEntry
 com.android.internal.telephony.SmsNumberUtils
 com.android.internal.telephony.SmsPermissions
@@ -8642,7 +8637,6 @@
 com.android.internal.telephony.TimeServiceHelper
 com.android.internal.telephony.TimeUtils
 com.android.internal.telephony.TimeZoneLookupHelper$CountryResult
-com.android.internal.telephony.TimeZoneLookupHelper$OffsetResult
 com.android.internal.telephony.TimeZoneLookupHelper
 com.android.internal.telephony.UUSInfo
 com.android.internal.telephony.UiccPhoneBookController
@@ -8703,7 +8697,7 @@
 com.android.internal.telephony.cdma.EriInfo
 com.android.internal.telephony.cdma.EriManager$EriFile
 com.android.internal.telephony.cdma.EriManager
-com.android.internal.telephony.cdma.SmsMessage
+com.android.internal.telephony.cdma.sms.BearerData$CodingException
 com.android.internal.telephony.cdma.sms.BearerData$TimeStamp
 com.android.internal.telephony.cdma.sms.BearerData
 com.android.internal.telephony.cdma.sms.CdmaSmsAddress
@@ -8818,11 +8812,6 @@
 com.android.internal.telephony.euicc.EuiccController$3
 com.android.internal.telephony.euicc.EuiccController
 com.android.internal.telephony.euicc.IEuiccCardController$Stub$Proxy
-com.android.internal.telephony.euicc.IEuiccCardController$Stub
-com.android.internal.telephony.euicc.IEuiccCardController
-com.android.internal.telephony.euicc.IEuiccController$Stub$Proxy
-com.android.internal.telephony.euicc.IEuiccController$Stub
-com.android.internal.telephony.euicc.IEuiccController
 com.android.internal.telephony.euicc.IGetAllProfilesCallback$Stub
 com.android.internal.telephony.euicc.IGetAllProfilesCallback
 com.android.internal.telephony.euicc.IGetEuiccInfo1Callback$Stub
@@ -8833,9 +8822,7 @@
 com.android.internal.telephony.gsm.GsmSMSDispatcher
 com.android.internal.telephony.gsm.GsmSmsAddress
 com.android.internal.telephony.gsm.SimTlv
-com.android.internal.telephony.gsm.SmsBroadcastConfigInfo
 com.android.internal.telephony.gsm.SmsMessage$PduParser
-com.android.internal.telephony.gsm.SmsMessage
 com.android.internal.telephony.gsm.SuppServiceNotification
 com.android.internal.telephony.gsm.UsimDataDownloadHandler
 com.android.internal.telephony.gsm.UsimPhoneBookManager$File
@@ -8870,11 +8857,6 @@
 com.android.internal.telephony.ims.ImsServiceFeatureQueryManager$ImsServiceFeatureQuery
 com.android.internal.telephony.ims.ImsServiceFeatureQueryManager$Listener
 com.android.internal.telephony.ims.ImsServiceFeatureQueryManager
-com.android.internal.telephony.ims.RcsEventQueryHelper
-com.android.internal.telephony.ims.RcsMessageController
-com.android.internal.telephony.ims.RcsMessageQueryHelper
-com.android.internal.telephony.ims.RcsMessageStoreUtil
-com.android.internal.telephony.ims.RcsParticipantQueryHelper
 com.android.internal.telephony.imsphone.-$$Lambda$ImsPhoneCallTracker$QlPVd_3u4_verjHUDnkn6zaSe54
 com.android.internal.telephony.imsphone.-$$Lambda$ImsPhoneCallTracker$Zw03itjXT6-LrhiYuD-9nKFg2Wg
 com.android.internal.telephony.imsphone.ImsExternalCallTracker$1
@@ -8915,6 +8897,7 @@
 com.android.internal.telephony.imsphone.ImsPhoneFactory
 com.android.internal.telephony.imsphone.ImsPhoneMmiCode
 com.android.internal.telephony.imsphone.ImsPullCall
+com.android.internal.telephony.imsphone.ImsRegistrationCallbackHelper$ImsRegistrationUpdate
 com.android.internal.telephony.metrics.-$$Lambda$TelephonyMetrics$fLmZDbNadlr6LF7zSJ6jCR1AAsk
 com.android.internal.telephony.metrics.-$$Lambda$TelephonyMetrics$tQOsX1lKb2eTuPp-1rpkeIAEOoY
 com.android.internal.telephony.metrics.-$$Lambda$TelephonyMetrics$x2dJi76S2YQdpSTfY8RZ8qC_K6g
@@ -9000,7 +8983,6 @@
 com.android.internal.telephony.uicc.IccServiceTable
 com.android.internal.telephony.uicc.IccSlotStatus$SlotState
 com.android.internal.telephony.uicc.IccSlotStatus
-com.android.internal.telephony.uicc.IccUtils
 com.android.internal.telephony.uicc.IccVmNotSupportedException
 com.android.internal.telephony.uicc.InstallCarrierAppTrampolineActivity
 com.android.internal.telephony.uicc.InstallCarrierAppUtils
@@ -9046,19 +9028,14 @@
 com.android.internal.telephony.uicc.UsimServiceTable$UsimService
 com.android.internal.telephony.uicc.UsimServiceTable
 com.android.internal.telephony.uicc.VoiceMailConstants
-com.android.internal.telephony.uicc.asn1.InvalidAsn1DataException
-com.android.internal.telephony.uicc.asn1.TagNotFoundException
 com.android.internal.telephony.uicc.euicc.EuiccCard
 com.android.internal.telephony.uicc.euicc.EuiccSpecVersion
 com.android.internal.telephony.util.ArrayUtils
-com.android.internal.telephony.util.HandlerExecutor
 com.android.internal.telephony.util.NotificationChannelController$1
 com.android.internal.telephony.util.NotificationChannelController
-com.android.internal.telephony.util.RemoteCallbackListExt
 com.android.internal.telephony.util.SMSDispatcherUtil
 com.android.internal.telephony.util.TelephonyUtils
 com.android.internal.telephony.util.VoicemailNotificationSettingsUtil
-com.android.internal.telephony.util.XmlUtils
 com.android.internal.textservice.ISpellCheckerService$Stub$Proxy
 com.android.internal.textservice.ISpellCheckerService$Stub
 com.android.internal.textservice.ISpellCheckerService
@@ -9077,7 +9054,12 @@
 com.android.internal.textservice.ITextServicesSessionListener$Stub$Proxy
 com.android.internal.textservice.ITextServicesSessionListener$Stub
 com.android.internal.textservice.ITextServicesSessionListener
+com.android.internal.transition.EpicenterTranslateClipReveal$1
+com.android.internal.transition.EpicenterTranslateClipReveal$State
+com.android.internal.transition.EpicenterTranslateClipReveal$StateEvaluator
+com.android.internal.transition.EpicenterTranslateClipReveal$StateProperty
 com.android.internal.transition.EpicenterTranslateClipReveal
+com.android.internal.transition.TransitionConstants
 com.android.internal.usb.DumpUtils
 com.android.internal.util.-$$Lambda$DumpUtils$D1OlZP6xIpu72ypnJd0fzx0wd6I
 com.android.internal.util.-$$Lambda$DumpUtils$X8irOs5hfloCKy89_l1HRA1QeG0
@@ -9098,6 +9080,7 @@
 com.android.internal.util.AsyncChannel
 com.android.internal.util.BitUtils
 com.android.internal.util.BitwiseInputStream$AccessException
+com.android.internal.util.BitwiseOutputStream$AccessException
 com.android.internal.util.CollectionUtils
 com.android.internal.util.ConcurrentUtils$1$1
 com.android.internal.util.ConcurrentUtils$1
@@ -9108,6 +9091,7 @@
 com.android.internal.util.DumpUtils$1
 com.android.internal.util.DumpUtils$Dump
 com.android.internal.util.DumpUtils
+com.android.internal.util.EmergencyAffordanceManager
 com.android.internal.util.ExponentiallyBucketedHistogram
 com.android.internal.util.FastMath
 com.android.internal.util.FastPrintWriter$DummyWriter
@@ -9128,6 +9112,7 @@
 com.android.internal.util.GrowingArrayUtils
 com.android.internal.util.HexDump
 com.android.internal.util.IState
+com.android.internal.util.ImageUtils
 com.android.internal.util.IndentingPrintWriter
 com.android.internal.util.IntPair
 com.android.internal.util.JournaledFile
@@ -9168,6 +9153,7 @@
 com.android.internal.util.SyncResultReceiver
 com.android.internal.util.ToBooleanFunction
 com.android.internal.util.TokenBucket
+com.android.internal.util.TraceBuffer
 com.android.internal.util.UserIcons
 com.android.internal.util.VirtualRefBasePtr
 com.android.internal.util.WakeupMessage
@@ -9221,11 +9207,17 @@
 com.android.internal.util.function.pooled.PooledSupplier$OfInt
 com.android.internal.util.function.pooled.PooledSupplier$OfLong
 com.android.internal.util.function.pooled.PooledSupplier
+com.android.internal.view.-$$Lambda$FloatingActionMode$LU5MpPuKYDtwlFAuYhXYfzgLNLE
 com.android.internal.view.ActionBarPolicy
 com.android.internal.view.AppearanceRegion$1
 com.android.internal.view.AppearanceRegion
 com.android.internal.view.BaseIWindow
 com.android.internal.view.BaseSurfaceHolder
+com.android.internal.view.FloatingActionMode$1
+com.android.internal.view.FloatingActionMode$2
+com.android.internal.view.FloatingActionMode$3
+com.android.internal.view.FloatingActionMode$FloatingToolbarVisibilityHelper
+com.android.internal.view.FloatingActionMode
 com.android.internal.view.IInlineSuggestionsRequestCallback$Stub
 com.android.internal.view.IInlineSuggestionsRequestCallback
 com.android.internal.view.IInputConnectionWrapper$MyHandler
@@ -9263,6 +9255,7 @@
 com.android.internal.view.RotationPolicy
 com.android.internal.view.SurfaceCallbackHelper$1
 com.android.internal.view.SurfaceCallbackHelper
+com.android.internal.view.SurfaceFlingerVsyncChoreographer
 com.android.internal.view.TooltipPopup
 com.android.internal.view.WindowManagerPolicyThread
 com.android.internal.view.animation.FallbackLUTInterpolator
@@ -9290,6 +9283,14 @@
 com.android.internal.view.menu.MenuView
 com.android.internal.view.menu.ShowableListMenu
 com.android.internal.widget.-$$Lambda$FloatingToolbar$7-enOzxeypZYfdFYr1HzBLfj47k
+com.android.internal.widget.-$$Lambda$FloatingToolbar$FloatingToolbarPopup$-uEfRwR-_1oHxMvRVdmbNRdukDM
+com.android.internal.widget.-$$Lambda$FloatingToolbar$FloatingToolbarPopup$77YZy6kisO5OnjlgtKp0Zi1V8EY
+com.android.internal.widget.-$$Lambda$FloatingToolbar$FloatingToolbarPopup$E8FwnPCl7gZpcTlX_UaRPIBRnT0
+com.android.internal.widget.-$$Lambda$FloatingToolbar$LutnsyBKrZiroTBekgIjhIyrl40
+com.android.internal.widget.-$$Lambda$MessagingPropertyAnimator$7coWc0tjIUC7grCXucNFbpYTxDI
+com.android.internal.widget.-$$Lambda$NotificationActionListLayout$uFZFEmIEBpI3kn6c3tNvvgmMSv8
+com.android.internal.widget.-$$Lambda$TTC7hNz7BTsLwhNRb2L5kl-7mdU
+com.android.internal.widget.-$$Lambda$gPQuiuEDuOmrh2MixBcV6a5gu5s
 com.android.internal.widget.AbsActionBarView$VisibilityAnimListener
 com.android.internal.widget.AbsActionBarView
 com.android.internal.widget.ActionBarContainer$ActionBarBackgroundDrawable
@@ -9303,12 +9304,26 @@
 com.android.internal.widget.ActionBarOverlayLayout$ActionBarVisibilityCallback
 com.android.internal.widget.ActionBarOverlayLayout$LayoutParams
 com.android.internal.widget.ActionBarOverlayLayout
+com.android.internal.widget.AlertDialogLayout
 com.android.internal.widget.BackgroundFallback
+com.android.internal.widget.ButtonBarLayout
+com.android.internal.widget.CachingIconView
 com.android.internal.widget.DecorCaptionView
 com.android.internal.widget.DecorContentParent
 com.android.internal.widget.DecorToolbar
 com.android.internal.widget.DialogTitle
 com.android.internal.widget.EditableInputConnection
+com.android.internal.widget.FloatingToolbar$1
+com.android.internal.widget.FloatingToolbar$FloatingToolbarPopup$11
+com.android.internal.widget.FloatingToolbar$FloatingToolbarPopup$12
+com.android.internal.widget.FloatingToolbar$FloatingToolbarPopup$13
+com.android.internal.widget.FloatingToolbar$FloatingToolbarPopup$1
+com.android.internal.widget.FloatingToolbar$FloatingToolbarPopup$2
+com.android.internal.widget.FloatingToolbar$FloatingToolbarPopup$3
+com.android.internal.widget.FloatingToolbar$FloatingToolbarPopup$4
+com.android.internal.widget.FloatingToolbar$FloatingToolbarPopup$LogAccelerateInterpolator
+com.android.internal.widget.FloatingToolbar$FloatingToolbarPopup$OverflowPanel
+com.android.internal.widget.FloatingToolbar$FloatingToolbarPopup$OverflowPanelViewHelper
 com.android.internal.widget.FloatingToolbar$FloatingToolbarPopup
 com.android.internal.widget.FloatingToolbar
 com.android.internal.widget.ICheckCredentialProgressCallback$Stub$Proxy
@@ -9317,7 +9332,12 @@
 com.android.internal.widget.ILockSettings$Stub$Proxy
 com.android.internal.widget.ILockSettings$Stub
 com.android.internal.widget.ILockSettings
+com.android.internal.widget.ImageFloatingTextView
+com.android.internal.widget.LockPatternChecker$2
+com.android.internal.widget.LockPatternChecker$OnCheckCallback
+com.android.internal.widget.LockPatternChecker
 com.android.internal.widget.LockPatternUtils$2
+com.android.internal.widget.LockPatternUtils$CheckCredentialProgressCallback
 com.android.internal.widget.LockPatternUtils$RequestThrottledException
 com.android.internal.widget.LockPatternUtils$StrongAuthTracker$1
 com.android.internal.widget.LockPatternUtils$StrongAuthTracker$H
@@ -9327,13 +9347,25 @@
 com.android.internal.widget.LockSettingsInternal
 com.android.internal.widget.LockscreenCredential$1
 com.android.internal.widget.LockscreenCredential
+com.android.internal.widget.MessagingGroup
+com.android.internal.widget.MessagingImageMessage
+com.android.internal.widget.MessagingLinearLayout$MessagingChild
+com.android.internal.widget.MessagingMessage
+com.android.internal.widget.MessagingPropertyAnimator$1
+com.android.internal.widget.MessagingPropertyAnimator
+com.android.internal.widget.MessagingTextMessage
+com.android.internal.widget.NotificationActionListLayout
+com.android.internal.widget.NotificationExpandButton
 com.android.internal.widget.PasswordValidationError
+com.android.internal.widget.RemeasuringLinearLayout
 com.android.internal.widget.ScrollBarUtils
 com.android.internal.widget.ScrollingTabContainerView
 com.android.internal.widget.ToolbarWidgetWrapper$1
 com.android.internal.widget.ToolbarWidgetWrapper
 com.android.internal.widget.VerifyCredentialResponse$1
 com.android.internal.widget.VerifyCredentialResponse
+com.android.internal.widget.ViewClippingUtil$ClippingParameters
+com.android.internal.widget.ViewClippingUtil
 com.android.okhttp.Address
 com.android.okhttp.AndroidShimResponseCache
 com.android.okhttp.Authenticator
@@ -9483,6 +9515,8 @@
 com.android.org.bouncycastle.asn1.ASN1SequenceParser
 com.android.org.bouncycastle.asn1.ASN1Set
 com.android.org.bouncycastle.asn1.ASN1String
+com.android.org.bouncycastle.asn1.ASN1TaggedObject
+com.android.org.bouncycastle.asn1.ASN1TaggedObjectParser
 com.android.org.bouncycastle.asn1.BERTags
 com.android.org.bouncycastle.asn1.DERBitString
 com.android.org.bouncycastle.asn1.DERFactory
@@ -9491,6 +9525,7 @@
 com.android.org.bouncycastle.asn1.DEROutputStream
 com.android.org.bouncycastle.asn1.DERSequence
 com.android.org.bouncycastle.asn1.DERSet
+com.android.org.bouncycastle.asn1.DERTaggedObject
 com.android.org.bouncycastle.asn1.DLSequence
 com.android.org.bouncycastle.asn1.DefiniteLengthInputStream
 com.android.org.bouncycastle.asn1.InMemoryRepresentable
@@ -9504,12 +9539,14 @@
 com.android.org.bouncycastle.asn1.nist.NISTObjectIdentifiers
 com.android.org.bouncycastle.asn1.oiw.OIWObjectIdentifiers
 com.android.org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers
+com.android.org.bouncycastle.asn1.x500.X500Name
 com.android.org.bouncycastle.asn1.x509.AlgorithmIdentifier
 com.android.org.bouncycastle.asn1.x509.Certificate
 com.android.org.bouncycastle.asn1.x509.DSAParameter
 com.android.org.bouncycastle.asn1.x509.SubjectPublicKeyInfo
 com.android.org.bouncycastle.asn1.x509.Time
 com.android.org.bouncycastle.asn1.x509.V3TBSCertificateGenerator
+com.android.org.bouncycastle.asn1.x509.X509ExtensionsGenerator
 com.android.org.bouncycastle.asn1.x509.X509Name
 com.android.org.bouncycastle.asn1.x509.X509ObjectIdentifiers
 com.android.org.bouncycastle.asn1.x9.X9ECParameters
@@ -9571,6 +9608,7 @@
 com.android.org.bouncycastle.jcajce.provider.asymmetric.util.BaseCipherSpi
 com.android.org.bouncycastle.jcajce.provider.asymmetric.util.BaseKeyFactorySpi
 com.android.org.bouncycastle.jcajce.provider.asymmetric.util.KeyUtil
+com.android.org.bouncycastle.jcajce.provider.asymmetric.x509.CertificateFactory
 com.android.org.bouncycastle.jcajce.provider.config.ConfigurableProvider
 com.android.org.bouncycastle.jcajce.provider.config.ProviderConfiguration
 com.android.org.bouncycastle.jcajce.provider.config.ProviderConfigurationPermission
@@ -9722,7 +9760,6 @@
 com.android.server.usage.AppStandbyInternal$AppIdleStateChangeListener
 com.android.server.usage.AppStandbyInternal
 com.android.server.wm.nano.WindowManagerProtos$TaskSnapshotProto
-com.android.telephony.Rlog
 com.google.android.collect.Lists
 com.google.android.collect.Maps
 com.google.android.collect.Sets
@@ -9881,6 +9918,7 @@
 java.io.Serializable
 java.io.SerializablePermission
 java.io.StreamCorruptedException
+java.io.StringBufferInputStream
 java.io.StringReader
 java.io.StringWriter
 java.io.UTFDataFormatException
@@ -10147,6 +10185,8 @@
 java.net.AddressCache$AddressCacheEntry
 java.net.AddressCache$AddressCacheKey
 java.net.AddressCache
+java.net.Authenticator$RequestorType
+java.net.Authenticator
 java.net.ConnectException
 java.net.CookieHandler
 java.net.CookieManager$CookiePathComparator
@@ -10198,6 +10238,7 @@
 java.net.NetworkInterface
 java.net.NoRouteToHostException
 java.net.Parts
+java.net.PasswordAuthentication
 java.net.PlainDatagramSocketImpl
 java.net.PlainSocketImpl
 java.net.PortUnreachableException
@@ -10849,7 +10890,6 @@
 java.util.Queue
 java.util.Random
 java.util.RandomAccess
-java.util.RandomAccessSubList
 java.util.RegularEnumSet$EnumSetIterator
 java.util.RegularEnumSet
 java.util.ResourceBundle$1
@@ -10888,8 +10928,6 @@
 java.util.Stack
 java.util.StringJoiner
 java.util.StringTokenizer
-java.util.SubList$1
-java.util.SubList
 java.util.TaskQueue
 java.util.TimSort
 java.util.TimeZone
@@ -11461,6 +11499,7 @@
 javax.xml.parsers.SAXParserFactory
 jdk.internal.util.Preconditions
 libcore.content.type.-$$Lambda$MimeMap$xJ95jeANwfbnj45hvSUmlPtZWWg
+libcore.content.type.MimeMap$Builder
 libcore.content.type.MimeMap$MemoizingSupplier
 libcore.content.type.MimeMap
 libcore.icu.DateIntervalFormat
@@ -11520,8 +11559,6 @@
 libcore.timezone.TimeZoneFinder$TimeZonesProcessor
 libcore.timezone.TimeZoneFinder
 libcore.timezone.ZoneInfoDB$1
-libcore.timezone.ZoneInfoDB$TzData$1
-libcore.timezone.ZoneInfoDB$TzData
 libcore.timezone.ZoneInfoDB
 libcore.timezone.ZoneInfoDb$1
 libcore.timezone.ZoneInfoDb
diff --git a/core/java/android/accessibilityservice/AccessibilityService.java b/core/java/android/accessibilityservice/AccessibilityService.java
index 67334f5..18e5c3d 100644
--- a/core/java/android/accessibilityservice/AccessibilityService.java
+++ b/core/java/android/accessibilityservice/AccessibilityService.java
@@ -494,6 +494,13 @@
      */
     public static final int GLOBAL_ACTION_TAKE_SCREENSHOT = 9;
 
+    /**
+     * Action to send the KEYCODE_HEADSETHOOK KeyEvent, which is used to answer/hang up calls and
+     * play/stop media
+     * @hide
+     */
+    public static final int GLOBAL_ACTION_KEYCODE_HEADSETHOOK = 10;
+
     private static final String LOG_TAG = "AccessibilityService";
 
     /**
diff --git a/core/java/android/accessibilityservice/AccessibilityShortcutInfo.java b/core/java/android/accessibilityservice/AccessibilityShortcutInfo.java
index 9a3dad2..623734e 100644
--- a/core/java/android/accessibilityservice/AccessibilityShortcutInfo.java
+++ b/core/java/android/accessibilityservice/AccessibilityShortcutInfo.java
@@ -30,7 +30,6 @@
 import android.content.res.TypedArray;
 import android.content.res.XmlResourceParser;
 import android.graphics.drawable.Drawable;
-import android.text.TextUtils;
 import android.util.AttributeSet;
 import android.util.Xml;
 
@@ -153,7 +152,7 @@
                     com.android.internal.R.styleable.AccessibilityShortcutTarget_settingsActivity);
             asAttributes.recycle();
 
-            if (mDescriptionResId == 0 || mSummaryResId == 0) {
+            if ((mDescriptionResId == 0 && mHtmlDescriptionRes == 0) || mSummaryResId == 0) {
                 throw new XmlPullParserException("No description or summary in meta-data");
             }
         } catch (PackageManager.NameNotFoundException e) {
@@ -243,7 +242,10 @@
     public String loadHtmlDescription(@NonNull PackageManager packageManager) {
         final String htmlDescription = loadResourceString(packageManager, mActivityInfo,
                 mHtmlDescriptionRes);
-        return TextUtils.isEmpty(htmlDescription) ? null : getFilteredHtmlText(htmlDescription);
+        if (htmlDescription != null) {
+            return getFilteredHtmlText(htmlDescription);
+        }
+        return null;
     }
 
     /**
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java
index fd73632..d1b6efd 100644
--- a/core/java/android/app/ActivityManager.java
+++ b/core/java/android/app/ActivityManager.java
@@ -2791,7 +2791,9 @@
         @UnsupportedAppUsage
         public boolean visible;
         // Index of the stack in the display's stack list, can be used for comparison of stack order
+        // TODO: Can be removed since no one is using it.
         @UnsupportedAppUsage
+        @Deprecated
         public int position;
         public WindowContainerToken stackToken;
         /**
diff --git a/core/java/android/app/ActivityOptions.java b/core/java/android/app/ActivityOptions.java
index 7fd02112..0129aab 100644
--- a/core/java/android/app/ActivityOptions.java
+++ b/core/java/android/app/ActivityOptions.java
@@ -22,6 +22,7 @@
 import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
 import static android.view.Display.INVALID_DISPLAY;
 
+import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.RequiresPermission;
 import android.annotation.TestApi;
@@ -51,6 +52,7 @@
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.Window;
+import android.window.WindowContainerToken;
 
 import java.util.ArrayList;
 
@@ -184,6 +186,14 @@
     private static final String KEY_CALLER_DISPLAY_ID = "android.activity.callerDisplayId";
 
     /**
+     * The task display area token the activity should be launched into.
+     * @see #setLaunchTaskDisplayArea(WindowContainerToken)
+     * @hide
+     */
+    private static final String KEY_LAUNCH_TASK_DISPLAY_AREA_TOKEN =
+            "android.activity.launchTaskDisplayAreaToken";
+
+    /**
      * The windowing mode the activity should be launched into.
      * @hide
      */
@@ -334,6 +344,7 @@
     private PendingIntent mUsageTimeReport;
     private int mLaunchDisplayId = INVALID_DISPLAY;
     private int mCallerDisplayId = INVALID_DISPLAY;
+    private WindowContainerToken mLaunchTaskDisplayArea;
     @WindowConfiguration.WindowingMode
     private int mLaunchWindowingMode = WINDOWING_MODE_UNDEFINED;
     @WindowConfiguration.ActivityType
@@ -369,7 +380,7 @@
      */
     public static ActivityOptions makeCustomAnimation(Context context,
             int enterResId, int exitResId) {
-        return makeCustomAnimation(context, enterResId, exitResId, null, null);
+        return makeCustomAnimation(context, enterResId, exitResId, null, null, null);
     }
 
     /**
@@ -404,6 +415,38 @@
     }
 
     /**
+     * Create an ActivityOptions specifying a custom animation to run when
+     * the activity is displayed.
+     *
+     * @param context Who is defining this.  This is the application that the
+     * animation resources will be loaded from.
+     * @param enterResId A resource ID of the animation resource to use for
+     * the incoming activity.  Use 0 for no animation.
+     * @param exitResId A resource ID of the animation resource to use for
+     * the outgoing activity.  Use 0 for no animation.
+     * @param handler If <var>listener</var> is non-null this must be a valid
+     * Handler on which to dispatch the callback; otherwise it should be null.
+     * @param startedListener Optional OnAnimationStartedListener to find out when the
+     * requested animation has started running.  If for some reason the animation
+     * is not executed, the callback will happen immediately.
+     * @param finishedListener Optional OnAnimationFinishedListener when the animation
+     * has finished running.
+     * @return Returns a new ActivityOptions object that you can use to
+     * supply these options as the options Bundle when starting an activity.
+     * @hide
+     */
+    @TestApi
+    public static @NonNull ActivityOptions makeCustomAnimation(@NonNull Context context,
+            int enterResId, int exitResId, @Nullable Handler handler,
+            @Nullable OnAnimationStartedListener startedListener,
+            @Nullable OnAnimationFinishedListener finishedListener) {
+        ActivityOptions opts = makeCustomAnimation(context, enterResId, exitResId, handler,
+                startedListener);
+        opts.setOnAnimationFinishedListener(handler, finishedListener);
+        return opts;
+    }
+
+    /**
      * Creates an ActivityOptions specifying a custom animation to run in place on an existing
      * activity.
      *
@@ -448,6 +491,7 @@
      * to find out when the given animation has started running.
      * @hide
      */
+    @TestApi
     public interface OnAnimationStartedListener {
         void onAnimationStarted();
     }
@@ -474,6 +518,7 @@
      * to find out when the given animation has drawn its last frame.
      * @hide
      */
+    @TestApi
     public interface OnAnimationFinishedListener {
         void onAnimationFinished();
     }
@@ -974,6 +1019,7 @@
         mLockTaskMode = opts.getBoolean(KEY_LOCK_TASK_MODE, false);
         mLaunchDisplayId = opts.getInt(KEY_LAUNCH_DISPLAY_ID, INVALID_DISPLAY);
         mCallerDisplayId = opts.getInt(KEY_CALLER_DISPLAY_ID, INVALID_DISPLAY);
+        mLaunchTaskDisplayArea = opts.getParcelable(KEY_LAUNCH_TASK_DISPLAY_AREA_TOKEN);
         mLaunchWindowingMode = opts.getInt(KEY_LAUNCH_WINDOWING_MODE, WINDOWING_MODE_UNDEFINED);
         mLaunchActivityType = opts.getInt(KEY_LAUNCH_ACTIVITY_TYPE, ACTIVITY_TYPE_UNDEFINED);
         mLaunchTaskId = opts.getInt(KEY_LAUNCH_TASK_ID, -1);
@@ -1089,7 +1135,7 @@
     }
 
     /** @hide */
-    public IRemoteCallback getOnAnimationStartListener() {
+    public IRemoteCallback getAnimationStartedListener() {
         return mAnimationStartedListener;
     }
 
@@ -1245,6 +1291,18 @@
     }
 
     /** @hide */
+    public WindowContainerToken getLaunchTaskDisplayArea() {
+        return mLaunchTaskDisplayArea;
+    }
+
+    /** @hide */
+    public ActivityOptions setLaunchTaskDisplayArea(
+            WindowContainerToken windowContainerToken) {
+        mLaunchTaskDisplayArea = windowContainerToken;
+        return this;
+    }
+
+    /** @hide */
     public int getLaunchWindowingMode() {
         return mLaunchWindowingMode;
     }
@@ -1568,6 +1626,9 @@
         if (mCallerDisplayId != INVALID_DISPLAY) {
             b.putInt(KEY_CALLER_DISPLAY_ID, mCallerDisplayId);
         }
+        if (mLaunchTaskDisplayArea != null) {
+            b.putParcelable(KEY_LAUNCH_TASK_DISPLAY_AREA_TOKEN, mLaunchTaskDisplayArea);
+        }
         if (mLaunchWindowingMode != WINDOWING_MODE_UNDEFINED) {
             b.putInt(KEY_LAUNCH_WINDOWING_MODE, mLaunchWindowingMode);
         }
diff --git a/core/java/android/app/ActivityTaskManager.java b/core/java/android/app/ActivityTaskManager.java
index 1b941de..1cc63da 100644
--- a/core/java/android/app/ActivityTaskManager.java
+++ b/core/java/android/app/ActivityTaskManager.java
@@ -23,8 +23,10 @@
 import android.compat.annotation.UnsupportedAppUsage;
 import android.content.Context;
 import android.content.pm.PackageManager;
+import android.content.res.Configuration;
 import android.content.res.Resources;
 import android.graphics.Rect;
+import android.os.Build;
 import android.os.Handler;
 import android.os.IBinder;
 import android.os.RemoteException;
@@ -430,4 +432,14 @@
             throw e.rethrowFromSystemServer();
         }
     }
+
+    /** Returns whether the current UI mode supports error dialogs (ANR, crash, etc). */
+    public static boolean currentUiModeSupportsErrorDialogs(@NonNull Context context) {
+        final Configuration config = context.getResources().getConfiguration();
+        int modeType = config.uiMode & Configuration.UI_MODE_TYPE_MASK;
+        return (modeType != Configuration.UI_MODE_TYPE_CAR
+                && !(modeType == Configuration.UI_MODE_TYPE_WATCH && Build.IS_USER)
+                && modeType != Configuration.UI_MODE_TYPE_TELEVISION
+                && modeType != Configuration.UI_MODE_TYPE_VR_HEADSET);
+    }
 }
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 21b56d3..7d6ce41 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -375,7 +375,6 @@
     String mInstrumentedLibDir = null;
     boolean mSystemThread = false;
     boolean mSomeActivitiesChanged = false;
-    boolean mUpdatingSystemConfig = false;
     /* package */ boolean mHiddenApiWarningShown = false;
 
     // These can be accessed by multiple threads; mResourcesManager is the lock.
@@ -587,8 +586,11 @@
                     throw new IllegalStateException(
                             "Received config update for non-existing activity");
                 }
+                // Given alwaysReportChange=false because the configuration is from view root, the
+                // activity may not be able to handle the changes. In that case the activity will be
+                // relaunched immediately, then Activity#onConfigurationChanged shouldn't be called.
                 activity.mMainThread.handleActivityConfigurationChanged(token, overrideConfig,
-                        newDisplayId);
+                        newDisplayId, false /* alwaysReportChange */);
             };
         }
 
@@ -2029,12 +2031,7 @@
                     break;
                 }
                 case APPLICATION_INFO_CHANGED:
-                    mUpdatingSystemConfig = true;
-                    try {
-                        handleApplicationInfoChanged((ApplicationInfo) msg.obj);
-                    } finally {
-                        mUpdatingSystemConfig = false;
-                    }
+                    handleApplicationInfoChanged((ApplicationInfo) msg.obj);
                     break;
                 case RUN_ISOLATED_ENTRY_POINT:
                     handleRunIsolatedEntryPoint((String) ((SomeArgs) msg.obj).arg1,
@@ -2238,7 +2235,9 @@
             LoadedApk packageInfo = ref != null ? ref.get() : null;
             if (ai != null && packageInfo != null) {
                 if (!isLoadedApkResourceDirsUpToDate(packageInfo, ai)) {
-                    packageInfo.updateApplicationInfo(ai, null);
+                    List<String> oldPaths = new ArrayList<>();
+                    LoadedApk.makePaths(this, ai, oldPaths);
+                    packageInfo.updateApplicationInfo(ai, oldPaths);
                 }
 
                 if (packageInfo.isSecurityViolation()
@@ -2326,7 +2325,9 @@
 
             if (packageInfo != null) {
                 if (!isLoadedApkResourceDirsUpToDate(packageInfo, aInfo)) {
-                    packageInfo.updateApplicationInfo(aInfo, null);
+                    List<String> oldPaths = new ArrayList<>();
+                    LoadedApk.makePaths(this, aInfo, oldPaths);
+                    packageInfo.updateApplicationInfo(aInfo, oldPaths);
                 }
 
                 return packageInfo;
@@ -4467,7 +4468,8 @@
         // simply finishing, and we are not starting another activity.
         if (!r.activity.mFinished && willBeVisible && r.activity.mDecor != null && !r.hideForNow) {
             if (r.newConfig != null) {
-                performConfigurationChangedForActivity(r, r.newConfig);
+                performConfigurationChangedForActivity(r, r.newConfig,
+                        false /* alwaysReportChange */);
                 if (DEBUG_CONFIGURATION) {
                     Slog.v(TAG, "Resuming activity " + r.activityInfo.name + " with newConfig "
                             + r.activity.mCurrentConfig);
@@ -4787,7 +4789,8 @@
                     }
                 }
                 if (r.newConfig != null) {
-                    performConfigurationChangedForActivity(r, r.newConfig);
+                    performConfigurationChangedForActivity(r, r.newConfig,
+                            false /* alwaysReportChange */);
                     if (DEBUG_CONFIGURATION) Slog.v(TAG, "Updating activity vis "
                             + r.activityInfo.name + " with new config "
                             + r.activity.mCurrentConfig);
@@ -5447,11 +5450,12 @@
      * @param r ActivityClientRecord representing the Activity.
      * @param newBaseConfig The new configuration to use. This may be augmented with
      *                      {@link ActivityClientRecord#overrideConfig}.
+     * @param alwaysReportChange If the configuration is changed, always report to activity.
      */
     private void performConfigurationChangedForActivity(ActivityClientRecord r,
-            Configuration newBaseConfig) {
-        performConfigurationChangedForActivity(r, newBaseConfig,
-                r.activity.getDisplayId(), false /* movedToDifferentDisplay */);
+            Configuration newBaseConfig, boolean alwaysReportChange) {
+        performConfigurationChangedForActivity(r, newBaseConfig, r.activity.getDisplayId(),
+                false /* movedToDifferentDisplay */, alwaysReportChange);
     }
 
     /**
@@ -5464,16 +5468,19 @@
      *                      {@link ActivityClientRecord#overrideConfig}.
      * @param displayId The id of the display where the Activity currently resides.
      * @param movedToDifferentDisplay Indicates if the activity was moved to different display.
+     * @param alwaysReportChange If the configuration is changed, always report to activity.
      * @return {@link Configuration} instance sent to client, null if not sent.
      */
     private Configuration performConfigurationChangedForActivity(ActivityClientRecord r,
-            Configuration newBaseConfig, int displayId, boolean movedToDifferentDisplay) {
+            Configuration newBaseConfig, int displayId, boolean movedToDifferentDisplay,
+            boolean alwaysReportChange) {
         r.tmpConfig.setTo(newBaseConfig);
         if (r.overrideConfig != null) {
             r.tmpConfig.updateFrom(r.overrideConfig);
         }
         final Configuration reportedConfig = performActivityConfigurationChanged(r.activity,
-                r.tmpConfig, r.overrideConfig, displayId, movedToDifferentDisplay);
+                r.tmpConfig, r.overrideConfig, displayId, movedToDifferentDisplay,
+                alwaysReportChange);
         freeTextLayoutCachesIfNeeded(r.activity.mCurrentConfig.diff(r.tmpConfig));
         return reportedConfig;
     }
@@ -5529,11 +5536,12 @@
      *                         ActivityManager.
      * @param displayId Id of the display where activity currently resides.
      * @param movedToDifferentDisplay Indicates if the activity was moved to different display.
+     * @param alwaysReportChange If the configuration is changed, always report to activity.
      * @return Configuration sent to client, null if no changes and not moved to different display.
      */
     private Configuration performActivityConfigurationChanged(Activity activity,
             Configuration newConfig, Configuration amOverrideConfig, int displayId,
-            boolean movedToDifferentDisplay) {
+            boolean movedToDifferentDisplay, boolean alwaysReportChange) {
         if (activity == null) {
             throw new IllegalArgumentException("No activity provided.");
         }
@@ -5556,7 +5564,7 @@
                 // Always send the task-level config changes. For system-level configuration, if
                 // this activity doesn't handle any of the config changes, then don't bother
                 // calling onConfigurationChanged as we're going to destroy it.
-                if (!mUpdatingSystemConfig
+                if (alwaysReportChange
                         || (~activity.mActivityInfo.getRealConfigChanged() & diff) == 0
                         || !REPORT_TO_ACTIVITY) {
                     shouldChangeConfig = true;
@@ -5638,12 +5646,7 @@
     public void handleConfigurationChanged(Configuration config) {
         Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "configChanged");
         mCurDefaultDisplayDpi = config.densityDpi;
-        mUpdatingSystemConfig = true;
-        try {
-            handleConfigurationChanged(config, null /* compat */);
-        } finally {
-            mUpdatingSystemConfig = false;
-        }
+        handleConfigurationChanged(config, null /* compat */);
         Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
     }
 
@@ -5725,7 +5728,7 @@
                     // config and avoid onConfigurationChanged if it hasn't changed.
                     Activity a = (Activity) cb;
                     performConfigurationChangedForActivity(mActivities.get(a.getActivityToken()),
-                            config);
+                            config, false /* alwaysReportChange */);
                 } else if (!equivalent) {
                     performConfigurationChanged(cb, config);
                 } else {
@@ -5832,16 +5835,28 @@
         }
     }
 
+    @Override
+    public void handleActivityConfigurationChanged(IBinder activityToken,
+            Configuration overrideConfig, int displayId) {
+        handleActivityConfigurationChanged(activityToken, overrideConfig, displayId,
+                // This is the only place that uses alwaysReportChange=true. The entry point should
+                // be from ActivityConfigurationChangeItem or MoveToDisplayItem, so the server side
+                // has confirmed the activity should handle the configuration instead of relaunch.
+                // If Activity#onConfigurationChanged is called unexpectedly, then we can know it is
+                // something wrong from server side.
+                true /* alwaysReportChange */);
+    }
+
     /**
      * Handle new activity configuration and/or move to a different display.
      * @param activityToken Target activity token.
      * @param overrideConfig Activity override config.
      * @param displayId Id of the display where activity was moved to, -1 if there was no move and
      *                  value didn't change.
+     * @param alwaysReportChange If the configuration is changed, always report to activity.
      */
-    @Override
-    public void handleActivityConfigurationChanged(IBinder activityToken,
-            Configuration overrideConfig, int displayId) {
+    void handleActivityConfigurationChanged(IBinder activityToken, Configuration overrideConfig,
+            int displayId, boolean alwaysReportChange) {
         ActivityClientRecord r = mActivities.get(activityToken);
         // Check input params.
         if (r == null || r.activity == null) {
@@ -5880,14 +5895,15 @@
                     + ", config=" + overrideConfig);
 
             final Configuration reportedConfig = performConfigurationChangedForActivity(r,
-                    mCompatConfiguration, displayId, true /* movedToDifferentDisplay */);
+                    mCompatConfiguration, displayId, true /* movedToDifferentDisplay */,
+                    alwaysReportChange);
             if (viewRoot != null) {
                 viewRoot.onMovedToDisplay(displayId, reportedConfig);
             }
         } else {
             if (DEBUG_CONFIGURATION) Slog.v(TAG, "Handle activity config changed: "
                     + r.activityInfo.name + ", config=" + overrideConfig);
-            performConfigurationChangedForActivity(r, mCompatConfiguration);
+            performConfigurationChangedForActivity(r, mCompatConfiguration, alwaysReportChange);
         }
         // Notify the ViewRootImpl instance about configuration changes. It may have initiated this
         // update to make sure that resources are updated before updating itself.
diff --git a/core/java/android/app/ActivityView.java b/core/java/android/app/ActivityView.java
index ab7925c..1098fa1 100644
--- a/core/java/android/app/ActivityView.java
+++ b/core/java/android/app/ActivityView.java
@@ -90,11 +90,23 @@
 
     public ActivityView(Context context, AttributeSet attrs, int defStyle,
             boolean singleTaskInstance) {
+        this(context, attrs, defStyle, singleTaskInstance, false /* usePublicVirtualDisplay */);
+    }
+
+    /**
+     * This constructor let's the caller explicitly request a public virtual display as the backing
+     * display. Using a public display is not recommended as it exposes it to other applications,
+     * but it might be needed for backwards compatibility.
+     */
+    public ActivityView(
+            @NonNull Context context, @NonNull AttributeSet attrs, int defStyle,
+            boolean singleTaskInstance, boolean usePublicVirtualDisplay) {
         super(context, attrs, defStyle);
         if (useTaskOrganizer()) {
             mTaskEmbedder = new TaskOrganizerTaskEmbedder(context, this);
         } else {
-            mTaskEmbedder = new VirtualDisplayTaskEmbedder(context, this, singleTaskInstance);
+            mTaskEmbedder = new VirtualDisplayTaskEmbedder(context, this, singleTaskInstance,
+                    usePublicVirtualDisplay);
         }
         mSurfaceView = new SurfaceView(context);
         // Since ActivityView#getAlpha has been overridden, we should use parent class's alpha
diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java
index 3a708a6..37f683e 100644
--- a/core/java/android/app/AppOpsManager.java
+++ b/core/java/android/app/AppOpsManager.java
@@ -233,12 +233,9 @@
                 }
 
                 private void reportStackTraceIfNeeded(@NonNull SyncNotedAppOp op) {
-                    if (sConfig.getSampledOpCode() == OP_NONE
-                            && sConfig.getExpirationTimeSinceBootMillis()
-                            >= SystemClock.elapsedRealtime()) {
+                    if (!isCollectingStackTraces()) {
                         return;
                     }
-
                     MessageSamplingConfig config = sConfig;
                     if (leftCircularDistance(strOpToOp(op.getOp()), config.getSampledOpCode(),
                             _NUM_OP) <= config.getAcceptableLeftDistance()
@@ -2586,6 +2583,44 @@
     }
 
     /**
+     * Returns a listenerId suitable for use with {@link #noteOp(int, int, String, String, String)}.
+     *
+     * This is intended for use client side, when the receiver id must be created before the
+     * associated call is made to the system server. If using {@link PendingIntent} as the receiver,
+     * avoid using this method as it will include a pointless additional x-process call. Instead to
+     * prefer passing the PendingIntent to the system server, and then invoking
+     * {@link #toReceiverId(PendingIntent)} instead.
+     *
+     * @param obj the receiver in use
+     * @return a string representation of the receiver suitable for app ops use
+     * @hide
+     */
+    // TODO: this should probably be @SystemApi as well
+    public static @NonNull String toReceiverId(@NonNull Object obj) {
+        if (obj instanceof PendingIntent) {
+            return toReceiverId((PendingIntent) obj);
+        } else {
+            return obj.getClass().getName() + "@" + System.identityHashCode(obj);
+        }
+    }
+
+    /**
+     * Returns a listenerId suitable for use with {@link #noteOp(int, int, String, String, String)}.
+     *
+     * This is intended for use server side, where ActivityManagerService can be referenced without
+     * an additional x-process call.
+     *
+     * @param pendingIntent the pendingIntent in use
+     * @return a string representation of the pending intent suitable for app ops use
+     * @see #toReceiverId(Object)
+     * @hide
+     */
+    // TODO: this should probably be @SystemApi as well
+    public static @NonNull String toReceiverId(@NonNull PendingIntent pendingIntent) {
+        return pendingIntent.getTag("");
+    }
+
+    /**
      * When to not enforce {@link #setUserRestriction restrictions}.
      *
      * @hide
@@ -8143,7 +8178,22 @@
      * @hide
      */
     public static boolean isListeningForOpNoted() {
-        return sOnOpNotedCallback != null;
+        return sOnOpNotedCallback != null || isCollectingStackTraces();
+    }
+
+    /**
+     * @return {@code true} iff the process is currently sampled for stacktrace collection.
+     *
+     * @see #setOnOpNotedCallback
+     *
+     * @hide
+     */
+    private static boolean isCollectingStackTraces() {
+        if (sConfig.getSampledOpCode() == OP_NONE &&
+                sConfig.getExpirationTimeSinceBootMillis() >= SystemClock.elapsedRealtime()) {
+            return false;
+        }
+        return true;
     }
 
     /**
diff --git a/core/java/android/app/INotificationManager.aidl b/core/java/android/app/INotificationManager.aidl
index 78d3581..8dfce14 100644
--- a/core/java/android/app/INotificationManager.aidl
+++ b/core/java/android/app/INotificationManager.aidl
@@ -58,6 +58,7 @@
 
     void setShowBadge(String pkg, int uid, boolean showBadge);
     boolean canShowBadge(String pkg, int uid);
+    boolean hasSentMessage(String pkg, int uid);
     void setNotificationsEnabledForPackage(String pkg, int uid, boolean enabled);
     /**
      * Updates the notification's enabled state. Additionally locks importance for all of the
@@ -78,10 +79,9 @@
     boolean shouldHideSilentStatusIcons(String callingPkg);
     void setHideSilentStatusIcons(boolean hide);
 
-    void setBubblesAllowed(String pkg, int uid, boolean allowed);
+    void setBubblesAllowed(String pkg, int uid, int bubblePreference);
     boolean areBubblesAllowed(String pkg);
-    boolean areBubblesAllowedForPackage(String pkg, int uid);
-    boolean hasUserApprovedBubblesForPackage(String pkg, int uid);
+    int getBubblePreferenceForPackage(String pkg, int uid);
 
     void createNotificationChannelGroups(String pkg, in ParceledListSlice channelGroupList);
     void createNotificationChannels(String pkg, in ParceledListSlice channelsList);
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index 8edf03d..af02783 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -2301,11 +2301,11 @@
 
         priority = parcel.readInt();
 
-        category = parcel.readString();
+        category = parcel.readString8();
 
-        mGroupKey = parcel.readString();
+        mGroupKey = parcel.readString8();
 
-        mSortKey = parcel.readString();
+        mSortKey = parcel.readString8();
 
         extras = Bundle.setDefusable(parcel.readBundle(), true); // may be null
         fixDuplicateExtras();
@@ -2329,12 +2329,12 @@
         color = parcel.readInt();
 
         if (parcel.readInt() != 0) {
-            mChannelId = parcel.readString();
+            mChannelId = parcel.readString8();
         }
         mTimeout = parcel.readLong();
 
         if (parcel.readInt() != 0) {
-            mShortcutId = parcel.readString();
+            mShortcutId = parcel.readString8();
         }
 
         if (parcel.readInt() != 0) {
@@ -2766,11 +2766,11 @@
 
         parcel.writeInt(priority);
 
-        parcel.writeString(category);
+        parcel.writeString8(category);
 
-        parcel.writeString(mGroupKey);
+        parcel.writeString8(mGroupKey);
 
-        parcel.writeString(mSortKey);
+        parcel.writeString8(mSortKey);
 
         parcel.writeBundle(extras); // null ok
 
@@ -2803,7 +2803,7 @@
 
         if (mChannelId != null) {
             parcel.writeInt(1);
-            parcel.writeString(mChannelId);
+            parcel.writeString8(mChannelId);
         } else {
             parcel.writeInt(0);
         }
@@ -2811,7 +2811,7 @@
 
         if (mShortcutId != null) {
             parcel.writeInt(1);
-            parcel.writeString(mShortcutId);
+            parcel.writeString8(mShortcutId);
         } else {
             parcel.writeInt(0);
         }
@@ -8873,7 +8873,7 @@
             }
             mDesiredHeightResId = in.readInt();
             if (in.readInt() != 0) {
-                mShortcutId = in.readString();
+                mShortcutId = in.readString8();
             }
         }
 
@@ -9029,7 +9029,7 @@
             out.writeInt(mDesiredHeightResId);
             out.writeInt(TextUtils.isEmpty(mShortcutId) ? 0 : 1);
             if (!TextUtils.isEmpty(mShortcutId)) {
-                out.writeString(mShortcutId);
+                out.writeString8(mShortcutId);
             }
         }
 
diff --git a/core/java/android/app/NotificationChannel.java b/core/java/android/app/NotificationChannel.java
index d1d67f0..9f8d3c4 100644
--- a/core/java/android/app/NotificationChannel.java
+++ b/core/java/android/app/NotificationChannel.java
@@ -102,7 +102,7 @@
     private static final String ATT_FG_SERVICE_SHOWN = "fgservice";
     private static final String ATT_GROUP = "group";
     private static final String ATT_BLOCKABLE_SYSTEM = "blockable_system";
-    private static final String ATT_ALLOW_BUBBLE = "can_bubble";
+    private static final String ATT_ALLOW_BUBBLE = "allow_bubbles";
     private static final String ATT_ORIG_IMP = "orig_imp";
     private static final String ATT_PARENT_CHANNEL = "parent";
     private static final String ATT_CONVERSATION_ID = "conv_id";
@@ -168,7 +168,12 @@
             NotificationManager.IMPORTANCE_UNSPECIFIED;
     private static final boolean DEFAULT_DELETED = false;
     private static final boolean DEFAULT_SHOW_BADGE = true;
-    private static final boolean DEFAULT_ALLOW_BUBBLE = true;
+    /**
+     * @hide
+     */
+    public static final int DEFAULT_ALLOW_BUBBLE = -1;
+    private static final int ALLOW_BUBBLE_ON = 1;
+    private static final int ALLOW_BUBBLE_OFF = 0;
 
     @UnsupportedAppUsage
     private String mId;
@@ -193,7 +198,7 @@
     private AudioAttributes mAudioAttributes = Notification.AUDIO_ATTRIBUTES_DEFAULT;
     // If this is a blockable system notification channel.
     private boolean mBlockableSystem = false;
-    private boolean mAllowBubbles = DEFAULT_ALLOW_BUBBLE;
+    private int mAllowBubbles = DEFAULT_ALLOW_BUBBLE;
     private boolean mImportanceLockedByOEM;
     private boolean mImportanceLockedDefaultApp;
     private String mParentId = null;
@@ -261,7 +266,7 @@
         mAudioAttributes = in.readInt() > 0 ? AudioAttributes.CREATOR.createFromParcel(in) : null;
         mLightColor = in.readInt();
         mBlockableSystem = in.readBoolean();
-        mAllowBubbles = in.readBoolean();
+        mAllowBubbles = in.readInt();
         mImportanceLockedByOEM = in.readBoolean();
         mOriginalImportance = in.readInt();
         mParentId = in.readString();
@@ -320,7 +325,7 @@
         }
         dest.writeInt(mLightColor);
         dest.writeBoolean(mBlockableSystem);
-        dest.writeBoolean(mAllowBubbles);
+        dest.writeInt(mAllowBubbles);
         dest.writeBoolean(mImportanceLockedByOEM);
         dest.writeInt(mOriginalImportance);
         dest.writeString(mParentId);
@@ -545,19 +550,19 @@
     }
 
     /**
-     * Sets whether notifications posted to this channel can appear outside of the notification
-     * shade, floating over other apps' content as a bubble.
-     *
-     * <p>This value will be ignored for channels that aren't allowed to pop on screen (that is,
-     * channels whose {@link #getImportance() importance} is <
-     * {@link NotificationManager#IMPORTANCE_HIGH}.</p>
-     *
-     * <p>Only modifiable before the channel is submitted to
-     *      * {@link NotificationManager#createNotificationChannel(NotificationChannel)}.</p>
+     * As of Android 11 this value is no longer respected.
+     * @see #canBubble()
      * @see Notification#getBubbleMetadata()
      */
     public void setAllowBubbles(boolean allowBubbles) {
-        mAllowBubbles = allowBubbles;
+        mAllowBubbles = allowBubbles ? ALLOW_BUBBLE_ON : ALLOW_BUBBLE_OFF;
+    }
+
+    /**
+     * @hide
+     */
+    public void setAllowBubbles(int allowed) {
+        mAllowBubbles = allowed;
     }
 
     /**
@@ -702,10 +707,19 @@
     }
 
     /**
-     * Returns whether notifications posted to this channel can display outside of the notification
-     * shade, in a floating window on top of other apps.
+     * Returns whether notifications posted to this channel are allowed to display outside of the
+     * notification shade, in a floating window on top of other apps.
+     *
+     * @see Notification#getBubbleMetadata()
      */
     public boolean canBubble() {
+        return mAllowBubbles == ALLOW_BUBBLE_ON;
+    }
+
+    /**
+     * @hide
+     */
+    public int getAllowBubbles() {
         return mAllowBubbles;
     }
 
@@ -877,7 +891,7 @@
         lockFields(safeInt(parser, ATT_USER_LOCKED, 0));
         setFgServiceShown(safeBool(parser, ATT_FG_SERVICE_SHOWN, false));
         setBlockable(safeBool(parser, ATT_BLOCKABLE_SYSTEM, false));
-        setAllowBubbles(safeBool(parser, ATT_ALLOW_BUBBLE, DEFAULT_ALLOW_BUBBLE));
+        setAllowBubbles(safeInt(parser, ATT_ALLOW_BUBBLE, DEFAULT_ALLOW_BUBBLE));
         setOriginalImportance(safeInt(parser, ATT_ORIG_IMP, DEFAULT_IMPORTANCE));
         setConversationId(parser.getAttributeValue(null, ATT_PARENT_CHANNEL),
                 parser.getAttributeValue(null, ATT_CONVERSATION_ID));
@@ -1001,8 +1015,8 @@
         if (isBlockable()) {
             out.attribute(null, ATT_BLOCKABLE_SYSTEM, Boolean.toString(isBlockable()));
         }
-        if (canBubble() != DEFAULT_ALLOW_BUBBLE) {
-            out.attribute(null, ATT_ALLOW_BUBBLE, Boolean.toString(canBubble()));
+        if (getAllowBubbles() != DEFAULT_ALLOW_BUBBLE) {
+            out.attribute(null, ATT_ALLOW_BUBBLE, Integer.toString(getAllowBubbles()));
         }
         if (getOriginalImportance() != DEFAULT_IMPORTANCE) {
             out.attribute(null, ATT_ORIG_IMP, Integer.toString(getOriginalImportance()));
@@ -1064,7 +1078,7 @@
         record.put(ATT_DELETED, Boolean.toString(isDeleted()));
         record.put(ATT_GROUP, getGroup());
         record.put(ATT_BLOCKABLE_SYSTEM, isBlockable());
-        record.put(ATT_ALLOW_BUBBLE, canBubble());
+        record.put(ATT_ALLOW_BUBBLE, getAllowBubbles());
         // TODO: original importance
         return record;
     }
diff --git a/core/java/android/app/NotificationManager.java b/core/java/android/app/NotificationManager.java
index 0e97e3f..d6df400 100644
--- a/core/java/android/app/NotificationManager.java
+++ b/core/java/android/app/NotificationManager.java
@@ -452,6 +452,19 @@
      */
     public static final int IMPORTANCE_MAX = 5;
 
+    /**
+     * @hide
+     */
+    public static final int BUBBLE_PREFERENCE_NONE = 0;
+    /**
+     * @hide
+     */
+    public static final int BUBBLE_PREFERENCE_ALL = 1;
+    /**
+     * @hide
+     */
+    public static final int BUBBLE_PREFERENCE_SELECTED = 2;
+
     @UnsupportedAppUsage
     private static INotificationManager sService;
 
@@ -1213,7 +1226,7 @@
 
 
     /**
-     * Sets whether notifications posted by this app can appear outside of the
+     * Gets whether all notifications posted by this app can appear outside of the
      * notification shade, floating over other apps' content.
      *
      * <p>This value will be ignored for notifications that are posted to channels that do not
diff --git a/core/java/android/app/Presentation.java b/core/java/android/app/Presentation.java
index 7a18b81..bae6ab5 100644
--- a/core/java/android/app/Presentation.java
+++ b/core/java/android/app/Presentation.java
@@ -236,7 +236,7 @@
         // to be rare but surprising, so we'll write a log message about it.
         if (!isConfigurationStillValid()) {
             Log.i(TAG, "Presentation is being dismissed because the "
-                    + "display metrics have changed since it was created.");
+                    + "display metrics have changed since it was created while onStart.");
             mHandler.sendEmptyMessage(MSG_CANCEL);
         }
     }
@@ -296,8 +296,8 @@
         // is invalid and the application must recreate the presentation to get
         // a new context.
         if (!isConfigurationStillValid()) {
-            Log.i(TAG, "Presentation is being dismissed because the "
-                    + "display metrics have changed since it was created.");
+            Log.i(TAG, "Presentation is being dismissed because the display metrics have changed "
+                    + "since it was created while handleDisplayChanged.");
             cancel();
         }
     }
diff --git a/core/java/android/app/PropertyInvalidatedCache.java b/core/java/android/app/PropertyInvalidatedCache.java
index ce0d04b..3110e18 100644
--- a/core/java/android/app/PropertyInvalidatedCache.java
+++ b/core/java/android/app/PropertyInvalidatedCache.java
@@ -17,11 +17,17 @@
 package android.app;
 
 import android.annotation.NonNull;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+import android.os.SystemClock;
 import android.os.SystemProperties;
 import android.util.Log;
 
 import com.android.internal.annotations.GuardedBy;
+import com.android.internal.annotations.VisibleForTesting;
 
+import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.Objects;
@@ -154,6 +160,13 @@
  * this local case, there's no IPC, so use of the cache is (depending on exact
  * circumstance) unnecessary.
  *
+ * For security, there is a whitelist of processes that are allowed to invalidate a cache.
+ * The whitelist includes normal runtime processes but does not include test processes.
+ * Test processes must call {@code PropertyInvalidatedCache.disableForTestMode()} to disable
+ * all cache activity in that process.
+ *
+ * Caching can be disabled completely by initializing {@code sEnabled} to false and rebuilding.
+ *
  * @param <Query> The class used to index cache entries: must be hashable and comparable
  * @param <Result> The class holding cache entries; use a boxed primitive if possible
  *
@@ -165,9 +178,25 @@
 
     private static final String TAG = "PropertyInvalidatedCache";
     private static final boolean DEBUG = false;
-    private static final boolean ENABLE = true;
     private static final boolean VERIFY = false;
 
+    /**
+     * If sEnabled is false then all cache operations are stubbed out.  Set
+     * it to false inside test processes.
+     */
+    private static boolean sEnabled = true;
+
+    private static final Object sCorkLock = new Object();
+
+    /**
+     * A map of cache keys that we've "corked". (The values are counts.)  When a cache key is
+     * corked, we skip the cache invalidate when the cache key is in the unset state --- that
+     * is, when a cache key is corked, an invalidation does not enable the cache if somebody
+     * else hasn't disabled it.
+     */
+    @GuardedBy("sCorkLock")
+    private static final HashMap<String, Integer> sCorks = new HashMap<>();
+
     private final Object mLock = new Object();
 
     /**
@@ -284,7 +313,7 @@
      * Return whether the cache is disabled in this process.
      */
     public final boolean isDisabledLocal() {
-        return mDisabled;
+        return mDisabled || !sEnabled;
     }
 
     /**
@@ -292,7 +321,7 @@
      */
     public Result query(Query query) {
         // Let access to mDisabled race: it's atomic anyway.
-        long currentNonce = (ENABLE && !mDisabled) ? getCurrentNonce() : NONCE_DISABLED;
+        long currentNonce = (!isDisabledLocal()) ? getCurrentNonce() : NONCE_DISABLED;
         for (;;) {
             if (currentNonce == NONCE_DISABLED || currentNonce == NONCE_UNSET) {
                 if (DEBUG) {
@@ -403,6 +432,9 @@
      * @param name Name of the cache-key property to invalidate
      */
     public static void disableSystemWide(@NonNull String name) {
+        if (!sEnabled) {
+            return;
+        }
         SystemProperties.set(name, Long.toString(NONCE_DISABLED));
     }
 
@@ -421,6 +453,33 @@
      * @param name Name of the cache-key property to invalidate
      */
     public static void invalidateCache(@NonNull String name) {
+        if (!sEnabled) {
+            if (DEBUG) {
+                Log.w(TAG, String.format(
+                    "cache invalidate %s suppressed", name));
+            }
+            return;
+        }
+
+        // Take the cork lock so invalidateCache() racing against corkInvalidations() doesn't
+        // clobber a cork-written NONCE_UNSET with a cache key we compute before the cork.
+        // The property service is single-threaded anyway, so we don't lose any concurrency by
+        // taking the cork lock around cache invalidations.  If we see contention on this lock,
+        // we're invalidating too often.
+        synchronized (sCorkLock) {
+            Integer numberCorks = sCorks.get(name);
+            if (numberCorks != null && numberCorks > 0) {
+                if (DEBUG) {
+                    Log.d(TAG, "ignoring invalidation due to cork: " + name);
+                }
+                return;
+            }
+            invalidateCacheLocked(name);
+        }
+    }
+
+    @GuardedBy("sCorkLock")
+    private static void invalidateCacheLocked(@NonNull String name) {
         // There's no race here: we don't require that values strictly increase, but instead
         // only that each is unique in a single runtime-restart session.
         final long nonce = SystemProperties.getLong(name, NONCE_UNSET);
@@ -430,6 +489,7 @@
             }
             return;
         }
+
         long newValue;
         do {
             newValue = NoPreloadHolder.next();
@@ -445,6 +505,175 @@
         SystemProperties.set(name, newValueString);
     }
 
+    /**
+     * Temporarily put the cache in the uninitialized state and prevent invalidations from
+     * moving it out of that state: useful in cases where we want to avoid the overhead of a
+     * large number of cache invalidations in a short time.  While the cache is corked, clients
+     * bypass the cache and talk to backing services directly.  This property makes corking
+     * correctness-preserving even if corked outside the lock that controls access to the
+     * cache's backing service.
+     *
+     * corkInvalidations() and uncorkInvalidations() must be called in pairs.
+     *
+     * @param name Name of the cache-key property to cork
+     */
+    public static void corkInvalidations(@NonNull String name) {
+        synchronized (sCorkLock) {
+            int numberCorks = sCorks.getOrDefault(name, 0);
+            if (DEBUG) {
+                Log.d(TAG, String.format("corking %s: numberCorks=%s", name, numberCorks));
+            }
+
+            // If we're the first ones to cork this cache, set the cache to the unset state so
+            // existing caches talk directly to their services while we've corked updates.
+            // Make sure we don't clobber a disabled cache value.
+
+            // TODO(dancol): we can skip this property write and leave the cache enabled if the
+            // caller promises not to make observable changes to the cache backing state before
+            // uncorking the cache, e.g., by holding a read lock across the cork-uncork pair.
+            // Implement this more dangerous mode of operation if necessary.
+            if (numberCorks == 0) {
+                final long nonce = SystemProperties.getLong(name, NONCE_UNSET);
+                if (nonce != NONCE_UNSET && nonce != NONCE_DISABLED) {
+                    SystemProperties.set(name, Long.toString(NONCE_UNSET));
+                }
+            }
+            sCorks.put(name, numberCorks + 1);
+            if (DEBUG) {
+                Log.d(TAG, "corked: " + name);
+            }
+        }
+    }
+
+    /**
+     * Undo the effect of a cork, allowing cache invalidations to proceed normally.
+     * Removing the last cork on a cache name invalidates the cache by side effect,
+     * transitioning it to normal operation (unless explicitly disabled system-wide).
+     *
+     * @param name Name of the cache-key property to uncork
+     */
+    public static void uncorkInvalidations(@NonNull String name) {
+        synchronized (sCorkLock) {
+            int numberCorks = sCorks.getOrDefault(name, 0);
+            if (DEBUG) {
+                Log.d(TAG, String.format("uncorking %s: numberCorks=%s", name, numberCorks));
+            }
+
+            if (numberCorks < 1) {
+                throw new AssertionError("cork underflow: " + name);
+            }
+            if (numberCorks == 1) {
+                sCorks.remove(name);
+                invalidateCacheLocked(name);
+                if (DEBUG) {
+                    Log.d(TAG, "uncorked: " + name);
+                }
+            } else {
+                sCorks.put(name, numberCorks - 1);
+            }
+        }
+    }
+
+    /**
+     * Time-based automatic corking helper. This class allows providers of cached data to
+     * amortize the cost of cache invalidations by corking the cache immediately after a
+     * modification (instructing clients to bypass the cache temporarily) and automatically
+     * uncork after some period of time has elapsed.
+     *
+     * It's better to use explicit cork and uncork pairs that tighly surround big batches of
+     * invalidations, but it's not always practical to tell where these invalidation batches
+     * might occur. AutoCorker's time-based corking is a decent alternative.
+     */
+    public static final class AutoCorker {
+        public static final int DEFAULT_AUTO_CORK_DELAY_MS = 2000;
+
+        private final String mPropertyName;
+        private final int mAutoCorkDelayMs;
+        private final Object mLock = new Object();
+        @GuardedBy("mLock")
+        private long mUncorkDeadlineMs = -1;  // SystemClock.uptimeMillis()
+        @GuardedBy("mLock")
+        private Handler mHandler;
+
+        public AutoCorker(@NonNull String propertyName) {
+            this(propertyName, DEFAULT_AUTO_CORK_DELAY_MS);
+        }
+
+        public AutoCorker(@NonNull String propertyName, int autoCorkDelayMs) {
+            mPropertyName = propertyName;
+            mAutoCorkDelayMs = autoCorkDelayMs;
+            // We can't initialize mHandler here: when we're created, the main loop might not
+            // be set up yet! Wait until we have a main loop to initialize our
+            // corking callback.
+        }
+
+        public void autoCork() {
+            if (Looper.getMainLooper() == null) {
+                // We're not ready to auto-cork yet, so just invalidate the cache immediately.
+                if (DEBUG) {
+                    Log.w(TAG, "invalidating instead of autocorking early in init: "
+                            + mPropertyName);
+                }
+                PropertyInvalidatedCache.invalidateCache(mPropertyName);
+                return;
+            }
+            synchronized (mLock) {
+                boolean alreadyQueued = mUncorkDeadlineMs >= 0;
+                if (DEBUG) {
+                    Log.w(TAG, String.format(
+                                    "autoCork mUncorkDeadlineMs=%s", mUncorkDeadlineMs));
+                }
+                mUncorkDeadlineMs = SystemClock.uptimeMillis() + mAutoCorkDelayMs;
+                if (!alreadyQueued) {
+                    getHandlerLocked().sendEmptyMessageAtTime(0, mUncorkDeadlineMs);
+                    PropertyInvalidatedCache.corkInvalidations(mPropertyName);
+                }
+            }
+        }
+
+        private void handleMessage(Message msg) {
+            synchronized (mLock) {
+                if (DEBUG) {
+                    Log.w(TAG, String.format(
+                                    "handleMsesage mUncorkDeadlineMs=%s", mUncorkDeadlineMs));
+                }
+
+                if (mUncorkDeadlineMs < 0) {
+                    return;  // ???
+                }
+                long nowMs = SystemClock.uptimeMillis();
+                if (mUncorkDeadlineMs > nowMs) {
+                    mUncorkDeadlineMs = nowMs + mAutoCorkDelayMs;
+                    if (DEBUG) {
+                        Log.w(TAG, String.format(
+                                        "scheduling uncork at %s",
+                                        mUncorkDeadlineMs));
+                    }
+                    getHandlerLocked().sendEmptyMessageAtTime(0, mUncorkDeadlineMs);
+                    return;
+                }
+                if (DEBUG) {
+                    Log.w(TAG, "automatic uncorking " + mPropertyName);
+                }
+                mUncorkDeadlineMs = -1;
+                PropertyInvalidatedCache.uncorkInvalidations(mPropertyName);
+            }
+        }
+
+        @GuardedBy("mLock")
+        private Handler getHandlerLocked() {
+            if (mHandler == null) {
+                mHandler = new Handler(Looper.getMainLooper()) {
+                        @Override
+                        public void handleMessage(Message msg) {
+                            AutoCorker.this.handleMessage(msg);
+                        }
+                    };
+            }
+            return mHandler;
+        }
+    }
+
     protected Result maybeCheckConsistency(Query query, Result proposedResult) {
         if (VERIFY) {
             Result resultToCompare = recompute(query);
@@ -471,4 +700,14 @@
     public String queryToString(Query query) {
         return Objects.toString(query);
     }
+
+    /**
+     * Disable all caches in the local process.  Once disabled it is not
+     * possible to re-enable caching in the current process.
+     */
+    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
+    public static void disableForTestMode() {
+        Log.d(TAG, "disabling all caches in the process");
+        sEnabled = false;
+    }
 }
diff --git a/core/java/android/app/ResourcesManager.java b/core/java/android/app/ResourcesManager.java
index 47ccc2f..c2caa40 100644
--- a/core/java/android/app/ResourcesManager.java
+++ b/core/java/android/app/ResourcesManager.java
@@ -1111,7 +1111,6 @@
         }
         int displayId = key.mDisplayId;
         final boolean hasOverrideConfiguration = key.hasOverrideConfiguration();
-        tmpConfig.setTo(config);
 
         // Get new DisplayMetrics based on the DisplayAdjustments given to the ResourcesImpl. Update
         // a copy if the CompatibilityInfo changed, because the ResourcesImpl object will handle the
@@ -1121,17 +1120,15 @@
             daj = new DisplayAdjustments(daj);
             daj.setCompatibilityInfo(compat);
         }
-        if (displayId == Display.DEFAULT_DISPLAY) {
-            daj.setConfiguration(config);
-        }
-        DisplayMetrics dm = getDisplayMetrics(displayId, daj);
-        if (displayId != Display.DEFAULT_DISPLAY) {
-            applyNonDefaultDisplayMetricsToConfiguration(dm, tmpConfig);
-        }
-
+        tmpConfig.setTo(config);
         if (hasOverrideConfiguration) {
             tmpConfig.updateFrom(key.mOverrideConfiguration);
         }
+        // Only apply for default display
+        if (displayId == Display.DEFAULT_DISPLAY) {
+            daj.setConfiguration(tmpConfig);
+        }
+        DisplayMetrics dm = getDisplayMetrics(displayId, daj);
         resourcesImpl.updateConfiguration(tmpConfig, dm, compat);
     }
 
diff --git a/core/java/android/app/TEST_MAPPING b/core/java/android/app/TEST_MAPPING
index ab86860..344a4d7 100644
--- a/core/java/android/app/TEST_MAPPING
+++ b/core/java/android/app/TEST_MAPPING
@@ -20,6 +20,10 @@
         },
         {
             "file_patterns": ["(/|^)AppOpsManager.java"],
+            "name": "UidAtomTests:testAppOps"
+        },
+        {
+            "file_patterns": ["(/|^)AppOpsManager.java"],
             "name": "FrameworksServicesTests",
             "options": [
                 {
diff --git a/core/java/android/app/TaskInfo.java b/core/java/android/app/TaskInfo.java
index 0173731..c7a2a1e 100644
--- a/core/java/android/app/TaskInfo.java
+++ b/core/java/android/app/TaskInfo.java
@@ -20,6 +20,7 @@
 
 import android.annotation.NonNull;
 import android.annotation.Nullable;
+import android.annotation.TestApi;
 import android.compat.annotation.UnsupportedAppUsage;
 import android.content.ComponentName;
 import android.content.Intent;
@@ -196,6 +197,20 @@
         return resizeMode != RESIZE_MODE_UNRESIZEABLE;
     }
 
+    /** @hide */
+    @NonNull
+    @TestApi
+    public WindowContainerToken getToken() {
+        return token;
+    }
+
+    /** @hide */
+    @NonNull
+    @TestApi
+    public Configuration getConfiguration() {
+        return configuration;
+    }
+
     /**
      * Reads the TaskInfo from a parcel.
      */
diff --git a/core/java/android/app/WindowContext.java b/core/java/android/app/WindowContext.java
index 3a06c9d..cb416c9 100644
--- a/core/java/android/app/WindowContext.java
+++ b/core/java/android/app/WindowContext.java
@@ -16,6 +16,7 @@
 package android.app;
 
 import static android.view.WindowManagerGlobal.ADD_OKAY;
+import static android.view.WindowManagerGlobal.ADD_TOO_MANY_TOKENS;
 
 import android.annotation.NonNull;
 import android.annotation.Nullable;
@@ -81,6 +82,11 @@
             mOwnsToken = false;
             throw e.rethrowFromSystemServer();
         }
+        if (result == ADD_TOO_MANY_TOKENS) {
+            throw new UnsupportedOperationException("createWindowContext failed! Too many unused "
+                    + "window contexts. Please see Context#createWindowContext documentation for "
+                    + "detail.");
+        }
         mOwnsToken = result == ADD_OKAY;
         Reference.reachabilityFence(this);
     }
diff --git a/core/java/android/app/WindowTokenClient.java b/core/java/android/app/WindowTokenClient.java
index 301960e..b5d1039 100644
--- a/core/java/android/app/WindowTokenClient.java
+++ b/core/java/android/app/WindowTokenClient.java
@@ -67,13 +67,11 @@
         }
         final int currentDisplayId = context.getDisplayId();
         final boolean displayChanged = newDisplayId != currentDisplayId;
-        final Configuration config = new Configuration(context.getResources()
-                .getConfiguration());
-        final boolean configChanged = config.isOtherSeqNewer(newConfig)
-                && config.updateFrom(newConfig) != 0;
+        final Configuration config = context.getResources().getConfiguration();
+        final boolean configChanged = config.diff(newConfig) != 0;
         if (displayChanged || configChanged) {
             // TODO(ag/9789103): update resource manager logic to track non-activity tokens
-            mResourcesManager.updateResourcesForActivity(this, config, newDisplayId,
+            mResourcesManager.updateResourcesForActivity(this, newConfig, newDisplayId,
                     displayChanged);
         }
         if (displayChanged) {
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index fb9adb7..41e2dc0 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -3666,6 +3666,28 @@
     }
 
     /**
+     * Returns whether the given user's credential will be sufficient for all password policy
+     * requirement, once the user's profile has switched to unified challenge.
+     *
+     * <p>This is different from {@link #isActivePasswordSufficient()} since once the profile
+     * switches to unified challenge, policies set explicitly on the profile will start to affect
+     * the parent user.
+     * @param userHandle the user whose password requirement will be checked
+     * @param profileUser the profile user whose lockscreen challenge will be unified.
+     * @hide
+     */
+    public boolean isPasswordSufficientAfterProfileUnification(int userHandle, int profileUser) {
+        if (mService != null) {
+            try {
+                return mService.isPasswordSufficientAfterProfileUnification(userHandle,
+                        profileUser);
+            } catch (RemoteException e) {
+                throw e.rethrowFromSystemServer();
+            }
+        }
+        return false;
+    }
+    /**
      * Retrieve the number of times the user has failed at entering a password since that last
      * successful password entry.
      * <p>
diff --git a/core/java/android/app/admin/IDevicePolicyManager.aidl b/core/java/android/app/admin/IDevicePolicyManager.aidl
index 591a3f6..d10153c 100644
--- a/core/java/android/app/admin/IDevicePolicyManager.aidl
+++ b/core/java/android/app/admin/IDevicePolicyManager.aidl
@@ -85,6 +85,7 @@
 
     boolean isActivePasswordSufficient(int userHandle, boolean parent);
     boolean isProfileActivePasswordSufficientForParent(int userHandle);
+    boolean isPasswordSufficientAfterProfileUnification(int userHandle, int profileUser);
     int getPasswordComplexity(boolean parent);
     boolean isUsingUnifiedPassword(in ComponentName admin);
     int getCurrentFailedPasswordAttempts(int userHandle, boolean parent);
diff --git a/core/java/android/app/admin/PasswordMetrics.java b/core/java/android/app/admin/PasswordMetrics.java
index 86ebb47..39e1f0d 100644
--- a/core/java/android/app/admin/PasswordMetrics.java
+++ b/core/java/android/app/admin/PasswordMetrics.java
@@ -350,7 +350,7 @@
      *
      * TODO: move to PasswordPolicy
      */
-    private void maxWith(PasswordMetrics other) {
+    public void maxWith(PasswordMetrics other) {
         credType = Math.max(credType, other.credType);
         if (credType != CREDENTIAL_TYPE_PASSWORD) {
             return;
diff --git a/core/java/android/app/usage/IUsageStatsManager.aidl b/core/java/android/app/usage/IUsageStatsManager.aidl
index 1211c73..ed6ba0c 100644
--- a/core/java/android/app/usage/IUsageStatsManager.aidl
+++ b/core/java/android/app/usage/IUsageStatsManager.aidl
@@ -43,7 +43,7 @@
     @UnsupportedAppUsage
     void setAppInactive(String packageName, boolean inactive, int userId);
     @UnsupportedAppUsage
-    boolean isAppInactive(String packageName, int userId);
+    boolean isAppInactive(String packageName, int userId, String callingPackage);
     void onCarrierPrivilegedAppsChanged();
     void reportChooserSelection(String packageName, int userId, String contentType,
             in String[] annotations, String action);
diff --git a/core/java/android/app/usage/UsageStatsManager.java b/core/java/android/app/usage/UsageStatsManager.java
index 0a67802..2ce6a86 100644
--- a/core/java/android/app/usage/UsageStatsManager.java
+++ b/core/java/android/app/usage/UsageStatsManager.java
@@ -622,12 +622,17 @@
      * app hasn't been used directly or indirectly for a period of time defined by the system. This
      * could be of the order of several hours or days. Apps are not considered inactive when the
      * device is charging.
+     * <p> The caller must have {@link android.Manifest.permission#PACKAGE_USAGE_STATS} to query the
+     * inactive state of other apps</p>
+     *
      * @param packageName The package name of the app to query
-     * @return whether the app is currently considered inactive
+     * @return whether the app is currently considered inactive or false if querying another app
+     * without {@link android.Manifest.permission#PACKAGE_USAGE_STATS}
      */
     public boolean isAppInactive(String packageName) {
         try {
-            return mService.isAppInactive(packageName, mContext.getUserId());
+            return mService.isAppInactive(packageName, mContext.getUserId(),
+                    mContext.getOpPackageName());
         } catch (RemoteException e) {
             // fall through and return default
         }
diff --git a/core/java/android/appwidget/AppWidgetHostView.java b/core/java/android/appwidget/AppWidgetHostView.java
index 09d56ec..75ce0dc 100644
--- a/core/java/android/appwidget/AppWidgetHostView.java
+++ b/core/java/android/appwidget/AppWidgetHostView.java
@@ -104,7 +104,7 @@
      */
     public AppWidgetHostView(Context context, OnClickHandler handler) {
         this(context, android.R.anim.fade_in, android.R.anim.fade_out);
-        mOnClickHandler = handler;
+        mOnClickHandler = getHandler(handler);
     }
 
     /**
@@ -131,7 +131,7 @@
      * @hide
      */
     public void setOnClickHandler(OnClickHandler handler) {
-        mOnClickHandler = handler;
+        mOnClickHandler = getHandler(handler);
     }
 
     /**
@@ -423,7 +423,6 @@
             // inflate any requested LayoutParams.
             mRemoteContext = getRemoteContext();
             int layoutId = remoteViews.getLayoutId();
-
             // If our stale view has been prepared to match active, and the new
             // layout matches, try recycling it
             if (content == null && layoutId == mLayoutId) {
@@ -711,4 +710,16 @@
         }
         return null;
     }
+
+    private OnClickHandler getHandler(OnClickHandler handler) {
+        return (view, pendingIntent, response) -> {
+            AppWidgetManager.getInstance(mContext).noteAppWidgetTapped(mAppWidgetId);
+            if (handler != null) {
+                return handler.onClickHandler(view, pendingIntent, response);
+            } else {
+                return RemoteViews.startPendingIntent(view, pendingIntent,
+                        response.getLaunchOptions(view));
+            }
+        };
+    }
 }
diff --git a/core/java/android/appwidget/AppWidgetManager.java b/core/java/android/appwidget/AppWidgetManager.java
index 8441287..009ec52 100644
--- a/core/java/android/appwidget/AppWidgetManager.java
+++ b/core/java/android/appwidget/AppWidgetManager.java
@@ -1243,13 +1243,13 @@
 
     /**
      * Note an app widget is tapped on.
-     * @param uid App UID.
-     * @param packageName App package name.
+     *
+     * @param appWidgetId App widget id.
      * @hide
      */
-    public void noteAppWidgetTapped(int uid, @NonNull String packageName) {
+    public void noteAppWidgetTapped(int appWidgetId) {
         try {
-            mService.noteAppWidgetTapped(uid, packageName);
+            mService.noteAppWidgetTapped(mPackageName, appWidgetId);
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
diff --git a/core/java/android/bluetooth/BluetoothAdapter.java b/core/java/android/bluetooth/BluetoothAdapter.java
index f216db6..29a98fa 100644
--- a/core/java/android/bluetooth/BluetoothAdapter.java
+++ b/core/java/android/bluetooth/BluetoothAdapter.java
@@ -980,16 +980,10 @@
                 @Override
                 protected Integer recompute(Void query) {
                     try {
-                        mServiceLock.readLock().lock();
-                        if (mService != null) {
-                            return mService.getState();
-                        }
+                        return mService.getState();
                     } catch (RemoteException e) {
-                        Log.e(TAG, "", e);
-                    } finally {
-                        mServiceLock.readLock().unlock();
+                        throw e.rethrowFromSystemServer();
                     }
-                    return BluetoothAdapter.STATE_OFF;
                 }
             };
 
@@ -1004,6 +998,30 @@
     }
 
     /**
+     * Fetch the current bluetooth state.  If the service is down, return
+     * OFF.
+     */
+    @AdapterState
+    private int getStateInternal() {
+        int state = BluetoothAdapter.STATE_OFF;
+        try {
+            mServiceLock.readLock().lock();
+            if (mService != null) {
+                state = mBluetoothGetStateCache.query(null);
+            }
+        } catch (RuntimeException e) {
+            if (e.getCause() instanceof RemoteException) {
+                Log.e(TAG, "", e.getCause());
+            } else {
+                throw e;
+            }
+        } finally {
+            mServiceLock.readLock().unlock();
+        }
+        return state;
+    }
+
+    /**
      * Get the current state of the local Bluetooth adapter.
      * <p>Possible return values are
      * {@link #STATE_OFF},
@@ -1016,7 +1034,7 @@
     @RequiresPermission(Manifest.permission.BLUETOOTH)
     @AdapterState
     public int getState() {
-        int state = mBluetoothGetStateCache.query(null);
+        int state = getStateInternal();
 
         // Consider all internal states as OFF
         if (state == BluetoothAdapter.STATE_BLE_ON || state == BluetoothAdapter.STATE_BLE_TURNING_ON
@@ -1054,7 +1072,7 @@
     @UnsupportedAppUsage(publicAlternatives = "Use {@link #getState()} instead to determine "
             + "whether you can use BLE & BT classic.")
     public int getLeState() {
-        int state = mBluetoothGetStateCache.query(null);
+        int state = getStateInternal();
 
         if (VDBG) {
             Log.d(TAG, "getLeState() returning " + BluetoothAdapter.nameForState(state));
diff --git a/core/java/android/content/ClipData.java b/core/java/android/content/ClipData.java
index 9c806fa..1923bf3 100644
--- a/core/java/android/content/ClipData.java
+++ b/core/java/android/content/ClipData.java
@@ -1206,7 +1206,7 @@
             }
         } else {
             dest.writeInt(PARCEL_TYPE_STRING);
-            dest.writeString(text);
+            dest.writeString8(text);
         }
     }
 
@@ -1215,7 +1215,7 @@
      */
     private static String readHtmlTextFromParcel(Parcel in) {
         if (in.readInt() == PARCEL_TYPE_STRING) {
-            return in.readString();
+            return in.readString8();
         }
         ParcelFileDescriptor pfd =
                 in.readParcelable(ParcelFileDescriptor.class.getClassLoader());
diff --git a/core/java/android/content/ContentProviderOperation.java b/core/java/android/content/ContentProviderOperation.java
index 494d2aea..1fb426e 100644
--- a/core/java/android/content/ContentProviderOperation.java
+++ b/core/java/android/content/ContentProviderOperation.java
@@ -91,8 +91,8 @@
     private ContentProviderOperation(Parcel source) {
         mType = source.readInt();
         mUri = Uri.CREATOR.createFromParcel(source);
-        mMethod = source.readInt() != 0 ? source.readString() : null;
-        mArg = source.readInt() != 0 ? source.readString() : null;
+        mMethod = source.readInt() != 0 ? source.readString8() : null;
+        mArg = source.readInt() != 0 ? source.readString8() : null;
         final int valuesSize = source.readInt();
         if (valuesSize != -1) {
             mValues = new ArrayMap<>(valuesSize);
@@ -107,7 +107,7 @@
         } else {
             mExtras = null;
         }
-        mSelection = source.readInt() != 0 ? source.readString() : null;
+        mSelection = source.readInt() != 0 ? source.readString8() : null;
         mSelectionArgs = source.readSparseArray(null);
         mExpectedCount = source.readInt() != 0 ? source.readInt() : null;
         mYieldAllowed = source.readInt() != 0;
@@ -135,13 +135,13 @@
         Uri.writeToParcel(dest, mUri);
         if (mMethod != null) {
             dest.writeInt(1);
-            dest.writeString(mMethod);
+            dest.writeString8(mMethod);
         } else {
             dest.writeInt(0);
         }
         if (mArg != null) {
             dest.writeInt(1);
-            dest.writeString(mArg);
+            dest.writeString8(mArg);
         } else {
             dest.writeInt(0);
         }
@@ -159,7 +159,7 @@
         }
         if (mSelection != null) {
             dest.writeInt(1);
-            dest.writeString(mSelection);
+            dest.writeString8(mSelection);
         } else {
             dest.writeInt(0);
         }
@@ -591,7 +591,7 @@
         public BackReference(Parcel src) {
             this.fromIndex = src.readInt();
             if (src.readInt() != 0) {
-                this.fromKey = src.readString();
+                this.fromKey = src.readString8();
             } else {
                 this.fromKey = null;
             }
@@ -620,7 +620,7 @@
             dest.writeInt(fromIndex);
             if (fromKey != null) {
                 dest.writeInt(1);
-                dest.writeString(fromKey);
+                dest.writeString8(fromKey);
             } else {
                 dest.writeInt(0);
             }
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java
index 7c1b62f..09c6849 100644
--- a/core/java/android/content/Context.java
+++ b/core/java/android/content/Context.java
@@ -5812,6 +5812,12 @@
      * display.</b> If there is a need to add different window types, or non-associated windows,
      * separate Contexts should be used.
      * </p>
+     * <p>
+     * Creating a window context is an expensive operation. Misuse of this API may lead to a huge
+     * performance drop. The best practice is to use the same window context when possible.
+     * An approach is to create one window context with specific window type and display and
+     * use it everywhere it's needed..
+     * </p>
      *
      * @param type Window type in {@link WindowManager.LayoutParams}
      * @param options Bundle used to pass window-related options.
@@ -5824,7 +5830,9 @@
      * @see #WINDOW_SERVICE
      * @see #LAYOUT_INFLATER_SERVICE
      * @see #WALLPAPER_SERVICE
-     * @throws IllegalArgumentException if token is invalid
+     * @throws UnsupportedOperationException if this {@link Context} does not attach to a display or
+     * the current number of window contexts without adding any view by
+     * {@link WindowManager#addView} <b>exceeds five</b>.
      */
     public @NonNull Context createWindowContext(@WindowType int type, @Nullable Bundle options)  {
         throw new RuntimeException("Not implemented. Must override in a subclass.");
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index b1d6c83..def150a 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -888,8 +888,8 @@
 
                 public ShortcutIconResource createFromParcel(Parcel source) {
                     ShortcutIconResource icon = new ShortcutIconResource();
-                    icon.packageName = source.readString();
-                    icon.resourceName = source.readString();
+                    icon.packageName = source.readString8();
+                    icon.resourceName = source.readString8();
                     return icon;
                 }
 
@@ -906,8 +906,8 @@
         }
 
         public void writeToParcel(Parcel dest, int flags) {
-            dest.writeString(packageName);
-            dest.writeString(resourceName);
+            dest.writeString8(packageName);
+            dest.writeString8(resourceName);
         }
 
         @Override
@@ -10807,12 +10807,12 @@
     }
 
     public void writeToParcel(Parcel out, int flags) {
-        out.writeString(mAction);
+        out.writeString8(mAction);
         Uri.writeToParcel(out, mData);
-        out.writeString(mType);
-        out.writeString(mIdentifier);
+        out.writeString8(mType);
+        out.writeString8(mIdentifier);
         out.writeInt(mFlags);
-        out.writeString(mPackage);
+        out.writeString8(mPackage);
         ComponentName.writeToParcel(mComponent, out);
 
         if (mSourceBounds != null) {
@@ -10826,7 +10826,7 @@
             final int N = mCategories.size();
             out.writeInt(N);
             for (int i=0; i<N; i++) {
-                out.writeString(mCategories.valueAt(i));
+                out.writeString8(mCategories.valueAt(i));
             }
         } else {
             out.writeInt(0);
@@ -10865,12 +10865,12 @@
     }
 
     public void readFromParcel(Parcel in) {
-        setAction(in.readString());
+        setAction(in.readString8());
         mData = Uri.CREATOR.createFromParcel(in);
-        mType = in.readString();
-        mIdentifier = in.readString();
+        mType = in.readString8();
+        mIdentifier = in.readString8();
         mFlags = in.readInt();
-        mPackage = in.readString();
+        mPackage = in.readString8();
         mComponent = ComponentName.readFromParcel(in);
 
         if (in.readInt() != 0) {
@@ -10882,7 +10882,7 @@
             mCategories = new ArraySet<String>();
             int i;
             for (i=0; i<N; i++) {
-                mCategories.add(in.readString().intern());
+                mCategories.add(in.readString8().intern());
             }
         } else {
             mCategories = null;
diff --git a/core/java/android/content/pm/ActivityInfo.java b/core/java/android/content/pm/ActivityInfo.java
index f25ce76..b1f8869 100644
--- a/core/java/android/content/pm/ActivityInfo.java
+++ b/core/java/android/content/pm/ActivityInfo.java
@@ -1206,17 +1206,17 @@
         dest.writeInt(theme);
         dest.writeInt(launchMode);
         dest.writeInt(documentLaunchMode);
-        dest.writeString(permission);
-        dest.writeString(taskAffinity);
-        dest.writeString(targetActivity);
-        dest.writeString(launchToken);
+        dest.writeString8(permission);
+        dest.writeString8(taskAffinity);
+        dest.writeString8(targetActivity);
+        dest.writeString8(launchToken);
         dest.writeInt(flags);
         dest.writeInt(privateFlags);
         dest.writeInt(screenOrientation);
         dest.writeInt(configChanges);
         dest.writeInt(softInputMode);
         dest.writeInt(uiOptions);
-        dest.writeString(parentActivityName);
+        dest.writeString8(parentActivityName);
         dest.writeInt(persistableMode);
         dest.writeInt(maxRecents);
         dest.writeInt(lockTaskLaunchMode);
@@ -1227,7 +1227,7 @@
             dest.writeInt(0);
         }
         dest.writeInt(resizeMode);
-        dest.writeString(requestedVrComponent);
+        dest.writeString8(requestedVrComponent);
         dest.writeInt(rotationAnimation);
         dest.writeInt(colorMode);
         dest.writeFloat(maxAspectRatio);
@@ -1327,17 +1327,17 @@
         theme = source.readInt();
         launchMode = source.readInt();
         documentLaunchMode = source.readInt();
-        permission = source.readString();
-        taskAffinity = source.readString();
-        targetActivity = source.readString();
-        launchToken = source.readString();
+        permission = source.readString8();
+        taskAffinity = source.readString8();
+        targetActivity = source.readString8();
+        launchToken = source.readString8();
         flags = source.readInt();
         privateFlags = source.readInt();
         screenOrientation = source.readInt();
         configChanges = source.readInt();
         softInputMode = source.readInt();
         uiOptions = source.readInt();
-        parentActivityName = source.readString();
+        parentActivityName = source.readString8();
         persistableMode = source.readInt();
         maxRecents = source.readInt();
         lockTaskLaunchMode = source.readInt();
@@ -1345,7 +1345,7 @@
             windowLayout = new WindowLayout(source);
         }
         resizeMode = source.readInt();
-        requestedVrComponent = source.readString();
+        requestedVrComponent = source.readString8();
         rotationAnimation = source.readInt();
         colorMode = source.readInt();
         maxAspectRatio = source.readFloat();
@@ -1386,7 +1386,7 @@
             gravity = source.readInt();
             minWidth = source.readInt();
             minHeight = source.readInt();
-            windowLayoutAffinity = source.readString();
+            windowLayoutAffinity = source.readString8();
         }
 
         /**
@@ -1476,7 +1476,7 @@
             dest.writeInt(gravity);
             dest.writeInt(minWidth);
             dest.writeInt(minHeight);
-            dest.writeString(windowLayoutAffinity);
+            dest.writeString8(windowLayoutAffinity);
         }
     }
 }
diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java
index b6706011..b37521b 100644
--- a/core/java/android/content/pm/ApplicationInfo.java
+++ b/core/java/android/content/pm/ApplicationInfo.java
@@ -1704,10 +1704,10 @@
             return;
         }
         super.writeToParcel(dest, parcelableFlags);
-        dest.writeString(taskAffinity);
-        dest.writeString(permission);
-        dest.writeString(processName);
-        dest.writeString(className);
+        dest.writeString8(taskAffinity);
+        dest.writeString8(permission);
+        dest.writeString8(processName);
+        dest.writeString8(className);
         dest.writeInt(theme);
         dest.writeInt(flags);
         dest.writeInt(privateFlags);
@@ -1721,28 +1721,28 @@
         } else {
             dest.writeInt(0);
         }
-        dest.writeString(scanSourceDir);
-        dest.writeString(scanPublicSourceDir);
-        dest.writeString(sourceDir);
-        dest.writeString(publicSourceDir);
+        dest.writeString8(scanSourceDir);
+        dest.writeString8(scanPublicSourceDir);
+        dest.writeString8(sourceDir);
+        dest.writeString8(publicSourceDir);
         dest.writeStringArray(splitNames);
         dest.writeStringArray(splitSourceDirs);
         dest.writeStringArray(splitPublicSourceDirs);
         dest.writeSparseArray((SparseArray) splitDependencies);
-        dest.writeString(nativeLibraryDir);
-        dest.writeString(secondaryNativeLibraryDir);
-        dest.writeString(nativeLibraryRootDir);
+        dest.writeString8(nativeLibraryDir);
+        dest.writeString8(secondaryNativeLibraryDir);
+        dest.writeString8(nativeLibraryRootDir);
         dest.writeInt(nativeLibraryRootRequiresIsa ? 1 : 0);
-        dest.writeString(primaryCpuAbi);
-        dest.writeString(secondaryCpuAbi);
+        dest.writeString8(primaryCpuAbi);
+        dest.writeString8(secondaryCpuAbi);
         dest.writeStringArray(resourceDirs);
-        dest.writeString(seInfo);
-        dest.writeString(seInfoUser);
+        dest.writeString8(seInfo);
+        dest.writeString8(seInfoUser);
         dest.writeStringArray(sharedLibraryFiles);
         dest.writeTypedList(sharedLibraryInfos);
-        dest.writeString(dataDir);
-        dest.writeString(deviceProtectedDataDir);
-        dest.writeString(credentialProtectedDataDir);
+        dest.writeString8(dataDir);
+        dest.writeString8(deviceProtectedDataDir);
+        dest.writeString8(credentialProtectedDataDir);
         dest.writeInt(uid);
         dest.writeInt(minSdkVersion);
         dest.writeInt(targetSdkVersion);
@@ -1750,8 +1750,8 @@
         dest.writeInt(enabled ? 1 : 0);
         dest.writeInt(enabledSetting);
         dest.writeInt(installLocation);
-        dest.writeString(manageSpaceActivityName);
-        dest.writeString(backupAgentName);
+        dest.writeString8(manageSpaceActivityName);
+        dest.writeString8(backupAgentName);
         dest.writeInt(descriptionRes);
         dest.writeInt(uiOptions);
         dest.writeInt(fullBackupContent);
@@ -1759,16 +1759,16 @@
         dest.writeInt(networkSecurityConfigRes);
         dest.writeInt(category);
         dest.writeInt(targetSandboxVersion);
-        dest.writeString(classLoaderName);
+        dest.writeString8(classLoaderName);
         dest.writeStringArray(splitClassLoaderNames);
         dest.writeInt(compileSdkVersion);
-        dest.writeString(compileSdkVersionCodename);
-        dest.writeString(appComponentFactory);
+        dest.writeString8(compileSdkVersionCodename);
+        dest.writeString8(appComponentFactory);
         dest.writeInt(iconRes);
         dest.writeInt(roundIconRes);
         dest.writeInt(mHiddenApiPolicy);
         dest.writeInt(hiddenUntilInstalled ? 1 : 0);
-        dest.writeString(zygotePreloadName);
+        dest.writeString8(zygotePreloadName);
         dest.writeInt(gwpAsanMode);
     }
 
@@ -1788,10 +1788,10 @@
     @SuppressWarnings("unchecked")
     private ApplicationInfo(Parcel source) {
         super(source);
-        taskAffinity = source.readString();
-        permission = source.readString();
-        processName = source.readString();
-        className = source.readString();
+        taskAffinity = source.readString8();
+        permission = source.readString8();
+        processName = source.readString8();
+        className = source.readString8();
         theme = source.readInt();
         flags = source.readInt();
         privateFlags = source.readInt();
@@ -1802,28 +1802,28 @@
             storageUuid = new UUID(source.readLong(), source.readLong());
             volumeUuid = StorageManager.convert(storageUuid);
         }
-        scanSourceDir = source.readString();
-        scanPublicSourceDir = source.readString();
-        sourceDir = source.readString();
-        publicSourceDir = source.readString();
+        scanSourceDir = source.readString8();
+        scanPublicSourceDir = source.readString8();
+        sourceDir = source.readString8();
+        publicSourceDir = source.readString8();
         splitNames = source.readStringArray();
         splitSourceDirs = source.readStringArray();
         splitPublicSourceDirs = source.readStringArray();
         splitDependencies = source.readSparseArray(null);
-        nativeLibraryDir = source.readString();
-        secondaryNativeLibraryDir = source.readString();
-        nativeLibraryRootDir = source.readString();
+        nativeLibraryDir = source.readString8();
+        secondaryNativeLibraryDir = source.readString8();
+        nativeLibraryRootDir = source.readString8();
         nativeLibraryRootRequiresIsa = source.readInt() != 0;
-        primaryCpuAbi = source.readString();
-        secondaryCpuAbi = source.readString();
+        primaryCpuAbi = source.readString8();
+        secondaryCpuAbi = source.readString8();
         resourceDirs = source.readStringArray();
-        seInfo = source.readString();
-        seInfoUser = source.readString();
+        seInfo = source.readString8();
+        seInfoUser = source.readString8();
         sharedLibraryFiles = source.readStringArray();
         sharedLibraryInfos = source.createTypedArrayList(SharedLibraryInfo.CREATOR);
-        dataDir = source.readString();
-        deviceProtectedDataDir = source.readString();
-        credentialProtectedDataDir = source.readString();
+        dataDir = source.readString8();
+        deviceProtectedDataDir = source.readString8();
+        credentialProtectedDataDir = source.readString8();
         uid = source.readInt();
         minSdkVersion = source.readInt();
         targetSdkVersion = source.readInt();
@@ -1831,8 +1831,8 @@
         enabled = source.readInt() != 0;
         enabledSetting = source.readInt();
         installLocation = source.readInt();
-        manageSpaceActivityName = source.readString();
-        backupAgentName = source.readString();
+        manageSpaceActivityName = source.readString8();
+        backupAgentName = source.readString8();
         descriptionRes = source.readInt();
         uiOptions = source.readInt();
         fullBackupContent = source.readInt();
@@ -1840,16 +1840,16 @@
         networkSecurityConfigRes = source.readInt();
         category = source.readInt();
         targetSandboxVersion = source.readInt();
-        classLoaderName = source.readString();
+        classLoaderName = source.readString8();
         splitClassLoaderNames = source.readStringArray();
         compileSdkVersion = source.readInt();
-        compileSdkVersionCodename = source.readString();
-        appComponentFactory = source.readString();
+        compileSdkVersionCodename = source.readString8();
+        appComponentFactory = source.readString8();
         iconRes = source.readInt();
         roundIconRes = source.readInt();
         mHiddenApiPolicy = source.readInt();
         hiddenUntilInstalled = source.readInt() != 0;
-        zygotePreloadName = source.readString();
+        zygotePreloadName = source.readString8();
         gwpAsanMode = source.readInt();
     }
 
diff --git a/core/java/android/content/pm/ComponentInfo.java b/core/java/android/content/pm/ComponentInfo.java
index 362098c..628bcd7 100644
--- a/core/java/android/content/pm/ComponentInfo.java
+++ b/core/java/android/content/pm/ComponentInfo.java
@@ -197,8 +197,8 @@
     public void writeToParcel(Parcel dest, int parcelableFlags) {
         super.writeToParcel(dest, parcelableFlags);
         applicationInfo.writeToParcel(dest, parcelableFlags);
-        dest.writeString(processName);
-        dest.writeString(splitName);
+        dest.writeString8(processName);
+        dest.writeString8(splitName);
         dest.writeInt(descriptionRes);
         dest.writeInt(enabled ? 1 : 0);
         dest.writeInt(exported ? 1 : 0);
@@ -208,8 +208,8 @@
     protected ComponentInfo(Parcel source) {
         super(source);
         applicationInfo = ApplicationInfo.CREATOR.createFromParcel(source);
-        processName = source.readString();
-        splitName = source.readString();
+        processName = source.readString8();
+        splitName = source.readString8();
         descriptionRes = source.readInt();
         enabled = (source.readInt() != 0);
         exported = (source.readInt() != 0);
diff --git a/core/java/android/content/pm/CrossProfileApps.java b/core/java/android/content/pm/CrossProfileApps.java
index 144a07e..99e6d91 100644
--- a/core/java/android/content/pm/CrossProfileApps.java
+++ b/core/java/android/content/pm/CrossProfileApps.java
@@ -279,12 +279,8 @@
      * <ul>
      * <li>{@code UserManager#getEnabledProfileIds(int)} ()} returns at least one other profile for
      * the calling user.</li>
-     * <li>The calling app has requested</li>
-     * {@code android.Manifest.permission.INTERACT_ACROSS_PROFILES} in its manifest.
-     * <li>The calling package has either been whitelisted by default by the OEM or has been
-     * explicitly whitelisted by the admin via
-     * {@link android.app.admin.DevicePolicyManager#setCrossProfilePackages(ComponentName, Set)}.
-     * </li>
+     * <li>The calling app has requested
+     * {@code android.Manifest.permission.INTERACT_ACROSS_PROFILES} in its manifest.</li>
      * </ul>
      *
      * <p>Note that in order for the user to be able to grant the consent, the requesting package
diff --git a/core/java/android/content/pm/DataLoaderManager.java b/core/java/android/content/pm/DataLoaderManager.java
index 4a61938..e8fb241 100644
--- a/core/java/android/content/pm/DataLoaderManager.java
+++ b/core/java/android/content/pm/DataLoaderManager.java
@@ -41,17 +41,16 @@
      * @param dataLoaderId ID for the new data loader binder service.
      * @param params       DataLoaderParamsParcel object that contains data loader params, including
      *                     its package name, class name, and additional parameters.
-     * @param control      FileSystemControlParcel that contains filesystem control handlers.
      * @param listener     Callback for the data loader service to report status back to the
      *                     caller.
      * @return false if 1) target ID collides with a data loader that is already bound to data
      * loader manager; 2) package name is not specified; 3) fails to find data loader package;
      * or 4) fails to bind to the specified data loader service, otherwise return true.
      */
-    public boolean initializeDataLoader(int dataLoaderId, @NonNull DataLoaderParamsParcel params,
-            @NonNull FileSystemControlParcel control, @NonNull IDataLoaderStatusListener listener) {
+    public boolean bindToDataLoader(int dataLoaderId, @NonNull DataLoaderParamsParcel params,
+            @NonNull IDataLoaderStatusListener listener) {
         try {
-            return mService.initializeDataLoader(dataLoaderId, params, control, listener);
+            return mService.bindToDataLoader(dataLoaderId, params, listener);
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
@@ -70,12 +69,13 @@
     }
 
     /**
-     * Destroys the data loader binder service and removes it from data loader manager service.
+     * Unbinds from a data loader binder service, specified by its ID.
+     * DataLoader will receive destroy notification.
      */
     @Nullable
-    public void destroyDataLoader(int dataLoaderId) {
+    public void unbindFromDataLoader(int dataLoaderId) {
         try {
-            mService.destroyDataLoader(dataLoaderId);
+            mService.unbindFromDataLoader(dataLoaderId);
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
diff --git a/core/java/android/content/pm/FeatureInfo.java b/core/java/android/content/pm/FeatureInfo.java
index 9f3ab77..89269e0 100644
--- a/core/java/android/content/pm/FeatureInfo.java
+++ b/core/java/android/content/pm/FeatureInfo.java
@@ -108,7 +108,7 @@
 
     @Override
     public void writeToParcel(Parcel dest, int parcelableFlags) {
-        dest.writeString(name);
+        dest.writeString8(name);
         dest.writeInt(version);
         dest.writeInt(reqGlEsVersion);
         dest.writeInt(flags);
@@ -138,7 +138,7 @@
     };
 
     private FeatureInfo(Parcel source) {
-        name = source.readString();
+        name = source.readString8();
         version = source.readInt();
         reqGlEsVersion = source.readInt();
         flags = source.readInt();
diff --git a/core/java/android/content/pm/IDataLoaderManager.aidl b/core/java/android/content/pm/IDataLoaderManager.aidl
index 1336f72..93b3de7 100644
--- a/core/java/android/content/pm/IDataLoaderManager.aidl
+++ b/core/java/android/content/pm/IDataLoaderManager.aidl
@@ -23,8 +23,8 @@
 
 /** @hide */
 interface IDataLoaderManager {
-    boolean initializeDataLoader(int id, in DataLoaderParamsParcel params,
-            in FileSystemControlParcel control, IDataLoaderStatusListener listener);
+    boolean bindToDataLoader(int id, in DataLoaderParamsParcel params,
+            IDataLoaderStatusListener listener);
     IDataLoader getDataLoader(int dataLoaderId);
-    void destroyDataLoader(int dataLoaderId);
-}
\ No newline at end of file
+    void unbindFromDataLoader(int dataLoaderId);
+}
diff --git a/core/java/android/content/pm/IDataLoaderStatusListener.aidl b/core/java/android/content/pm/IDataLoaderStatusListener.aidl
index 9819b5d..24a62c5 100644
--- a/core/java/android/content/pm/IDataLoaderStatusListener.aidl
+++ b/core/java/android/content/pm/IDataLoaderStatusListener.aidl
@@ -21,17 +21,30 @@
  * @hide
  */
 oneway interface IDataLoaderStatusListener {
-    /** Data loader status */
-    const int DATA_LOADER_CREATED = 0;
-    const int DATA_LOADER_DESTROYED = 1;
+    /** The DataLoader process died, binder disconnected or class destroyed. */
+    const int DATA_LOADER_DESTROYED = 0;
+    /** DataLoader process is running and bound to. */
+    const int DATA_LOADER_BOUND = 1;
+    /** DataLoader has handled onCreate(). */
+    const int DATA_LOADER_CREATED = 2;
 
-    const int DATA_LOADER_STARTED = 2;
-    const int DATA_LOADER_STOPPED = 3;
+    /** DataLoader can receive missing pages and read pages notifications,
+     *  and ready to provide data. */
+    const int DATA_LOADER_STARTED = 3;
+    /** DataLoader no longer ready to provide data and is not receiving
+    *   any notifications from IncFS. */
+    const int DATA_LOADER_STOPPED = 4;
 
-    const int DATA_LOADER_IMAGE_READY = 4;
-    const int DATA_LOADER_IMAGE_NOT_READY = 5;
+    /** DataLoader streamed everything necessary to continue installation. */
+    const int DATA_LOADER_IMAGE_READY = 5;
+    /** Installation can't continue as DataLoader failed to stream necessary data. */
+    const int DATA_LOADER_IMAGE_NOT_READY = 6;
 
-    const int DATA_LOADER_UNRECOVERABLE = 6;
+    /** DataLoader reports that this instance is invalid and can never be restored.
+    *   Warning: this is a terminal status that data loader should use carefully and
+    *            the system should almost never use - e.g. only if all recovery attempts
+    *            fail and all retry limits are exceeded. */
+    const int DATA_LOADER_UNRECOVERABLE = 7;
 
     /** Data loader status callback */
     void onStatusChanged(in int dataLoaderId, in int status);
diff --git a/core/java/android/content/pm/IPackageInstaller.aidl b/core/java/android/content/pm/IPackageInstaller.aidl
index b0b2c33..37baae3 100644
--- a/core/java/android/content/pm/IPackageInstaller.aidl
+++ b/core/java/android/content/pm/IPackageInstaller.aidl
@@ -55,4 +55,6 @@
             in IntentSender statusReceiver, int userId, in List<String> whiteListedPermissions);
 
     void setPermissionsResult(int sessionId, boolean accepted);
+
+    void bypassNextStagedInstallerCheck(boolean value);
 }
diff --git a/core/java/android/content/pm/InstrumentationInfo.java b/core/java/android/content/pm/InstrumentationInfo.java
index 574a1ee..745a6c1 100644
--- a/core/java/android/content/pm/InstrumentationInfo.java
+++ b/core/java/android/content/pm/InstrumentationInfo.java
@@ -157,21 +157,21 @@
 
     public void writeToParcel(Parcel dest, int parcelableFlags) {
         super.writeToParcel(dest, parcelableFlags);
-        dest.writeString(targetPackage);
-        dest.writeString(targetProcesses);
-        dest.writeString(sourceDir);
-        dest.writeString(publicSourceDir);
+        dest.writeString8(targetPackage);
+        dest.writeString8(targetProcesses);
+        dest.writeString8(sourceDir);
+        dest.writeString8(publicSourceDir);
         dest.writeStringArray(splitNames);
         dest.writeStringArray(splitSourceDirs);
         dest.writeStringArray(splitPublicSourceDirs);
         dest.writeSparseArray((SparseArray) splitDependencies);
-        dest.writeString(dataDir);
-        dest.writeString(deviceProtectedDataDir);
-        dest.writeString(credentialProtectedDataDir);
-        dest.writeString(primaryCpuAbi);
-        dest.writeString(secondaryCpuAbi);
-        dest.writeString(nativeLibraryDir);
-        dest.writeString(secondaryNativeLibraryDir);
+        dest.writeString8(dataDir);
+        dest.writeString8(deviceProtectedDataDir);
+        dest.writeString8(credentialProtectedDataDir);
+        dest.writeString8(primaryCpuAbi);
+        dest.writeString8(secondaryCpuAbi);
+        dest.writeString8(nativeLibraryDir);
+        dest.writeString8(secondaryNativeLibraryDir);
         dest.writeInt((handleProfiling == false) ? 0 : 1);
         dest.writeInt((functionalTest == false) ? 0 : 1);
     }
@@ -189,21 +189,21 @@
     @SuppressWarnings("unchecked")
     private InstrumentationInfo(Parcel source) {
         super(source);
-        targetPackage = source.readString();
-        targetProcesses = source.readString();
-        sourceDir = source.readString();
-        publicSourceDir = source.readString();
+        targetPackage = source.readString8();
+        targetProcesses = source.readString8();
+        sourceDir = source.readString8();
+        publicSourceDir = source.readString8();
         splitNames = source.readStringArray();
         splitSourceDirs = source.readStringArray();
         splitPublicSourceDirs = source.readStringArray();
         splitDependencies = source.readSparseArray(null);
-        dataDir = source.readString();
-        deviceProtectedDataDir = source.readString();
-        credentialProtectedDataDir = source.readString();
-        primaryCpuAbi = source.readString();
-        secondaryCpuAbi = source.readString();
-        nativeLibraryDir = source.readString();
-        secondaryNativeLibraryDir = source.readString();
+        dataDir = source.readString8();
+        deviceProtectedDataDir = source.readString8();
+        credentialProtectedDataDir = source.readString8();
+        primaryCpuAbi = source.readString8();
+        secondaryCpuAbi = source.readString8();
+        nativeLibraryDir = source.readString8();
+        secondaryNativeLibraryDir = source.readString8();
         handleProfiling = source.readInt() != 0;
         functionalTest = source.readInt() != 0;
     }
diff --git a/core/java/android/content/pm/PackageInfo.java b/core/java/android/content/pm/PackageInfo.java
index 85c698f..bb56ef7 100644
--- a/core/java/android/content/pm/PackageInfo.java
+++ b/core/java/android/content/pm/PackageInfo.java
@@ -441,14 +441,14 @@
     public void writeToParcel(Parcel dest, int parcelableFlags) {
         // Allow ApplicationInfo to be squashed.
         final boolean prevAllowSquashing = dest.allowSquashing();
-        dest.writeString(packageName);
+        dest.writeString8(packageName);
         dest.writeStringArray(splitNames);
         dest.writeInt(versionCode);
         dest.writeInt(versionCodeMajor);
-        dest.writeString(versionName);
+        dest.writeString8(versionName);
         dest.writeInt(baseRevisionCode);
         dest.writeIntArray(splitRevisionCodes);
-        dest.writeString(sharedUserId);
+        dest.writeString8(sharedUserId);
         dest.writeInt(sharedUserLabel);
         if (applicationInfo != null) {
             dest.writeInt(1);
@@ -475,14 +475,14 @@
         dest.writeInt(isStub ? 1 : 0);
         dest.writeInt(coreApp ? 1 : 0);
         dest.writeInt(requiredForAllUsers ? 1 : 0);
-        dest.writeString(restrictedAccountType);
-        dest.writeString(requiredAccountType);
-        dest.writeString(overlayTarget);
-        dest.writeString(overlayCategory);
+        dest.writeString8(restrictedAccountType);
+        dest.writeString8(requiredAccountType);
+        dest.writeString8(overlayTarget);
+        dest.writeString8(overlayCategory);
         dest.writeInt(overlayPriority);
         dest.writeBoolean(mOverlayIsStatic);
         dest.writeInt(compileSdkVersion);
-        dest.writeString(compileSdkVersionCodename);
+        dest.writeString8(compileSdkVersionCodename);
         if (signingInfo != null) {
             dest.writeInt(1);
             signingInfo.writeToParcel(dest, parcelableFlags);
@@ -508,14 +508,14 @@
 
     @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
     private PackageInfo(Parcel source) {
-        packageName = source.readString();
+        packageName = source.readString8();
         splitNames = source.createStringArray();
         versionCode = source.readInt();
         versionCodeMajor = source.readInt();
-        versionName = source.readString();
+        versionName = source.readString8();
         baseRevisionCode = source.readInt();
         splitRevisionCodes = source.createIntArray();
-        sharedUserId = source.readString();
+        sharedUserId = source.readString8();
         sharedUserLabel = source.readInt();
         int hasApp = source.readInt();
         if (hasApp != 0) {
@@ -540,14 +540,14 @@
         isStub = source.readInt() != 0;
         coreApp = source.readInt() != 0;
         requiredForAllUsers = source.readInt() != 0;
-        restrictedAccountType = source.readString();
-        requiredAccountType = source.readString();
-        overlayTarget = source.readString();
-        overlayCategory = source.readString();
+        restrictedAccountType = source.readString8();
+        requiredAccountType = source.readString8();
+        overlayTarget = source.readString8();
+        overlayCategory = source.readString8();
         overlayPriority = source.readInt();
         mOverlayIsStatic = source.readBoolean();
         compileSdkVersion = source.readInt();
-        compileSdkVersionCodename = source.readString();
+        compileSdkVersionCodename = source.readString8();
         int hasSigningInfo = source.readInt();
         if (hasSigningInfo != 0) {
             signingInfo = SigningInfo.CREATOR.createFromParcel(source);
diff --git a/core/java/android/content/pm/PackageItemInfo.java b/core/java/android/content/pm/PackageItemInfo.java
index 7fd5531..d41ace5 100644
--- a/core/java/android/content/pm/PackageItemInfo.java
+++ b/core/java/android/content/pm/PackageItemInfo.java
@@ -422,8 +422,8 @@
     }
 
     public void writeToParcel(Parcel dest, int parcelableFlags) {
-        dest.writeString(name);
-        dest.writeString(packageName);
+        dest.writeString8(name);
+        dest.writeString8(packageName);
         dest.writeInt(labelRes);
         TextUtils.writeToParcel(nonLocalizedLabel, dest, parcelableFlags);
         dest.writeInt(icon);
@@ -452,8 +452,8 @@
     }
 
     protected PackageItemInfo(Parcel source) {
-        name = source.readString();
-        packageName = source.readString();
+        name = source.readString8();
+        packageName = source.readString8();
         labelRes = source.readInt();
         nonLocalizedLabel
                 = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(source);
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index 9ca2db9..6a5e6ca 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -3158,6 +3158,23 @@
             "android.content.pm.extra.VERIFICATION_LONG_VERSION_CODE";
 
     /**
+     * Extra field name for the Merkle tree root hash of a package.
+     * <p>Passed to a package verifier both prior to verification and as a result
+     * of verification.
+     * <p>The value of the extra is a specially formatted list:
+     * {@code filename1:HASH_1;filename2:HASH_2;...;filenameN:HASH_N}
+     * <p>The extra must include an entry for every APK within an installation. If
+     * a hash is not physically present, a hash value of {@code 0} will be used.
+     * <p>The root hash is generated using SHA-256, no salt with a 4096 byte block
+     * size. See the description of the
+     * <a href="https://www.kernel.org/doc/html/latest/filesystems/fsverity.html#merkle-tree">fs-verity merkle-tree</a>
+     * for more details.
+     * @hide
+     */
+    public static final String EXTRA_VERIFICATION_ROOT_HASH =
+            "android.content.pm.extra.EXTRA_VERIFICATION_ROOT_HASH";
+
+    /**
      * Extra field name for the ID of a intent filter pending verification.
      * Passed to an intent filter verifier and is used to call back to
      * {@link #verifyIntentFilter}
@@ -8054,13 +8071,16 @@
         sApplicationInfoCache.disableLocal();
     }
 
+    private static final PropertyInvalidatedCache.AutoCorker sCacheAutoCorker =
+            new PropertyInvalidatedCache.AutoCorker(PermissionManager.CACHE_KEY_PACKAGE_INFO);
+
     /**
      * Invalidate caches of package and permission information system-wide.
      *
      * @hide
      */
     public static void invalidatePackageInfoCache() {
-        PropertyInvalidatedCache.invalidateCache(PermissionManager.CACHE_KEY_PACKAGE_INFO);
+        sCacheAutoCorker.autoCork();
     }
 
     // Some of the flags don't affect the query result, but let's be conservative and cache
@@ -8150,4 +8170,19 @@
         sPackageInfoCache.disableLocal();
     }
 
+    /**
+     * Inhibit package info cache invalidations when correct.
+     *
+     * @hide */
+    public static void corkPackageInfoCache() {
+        PropertyInvalidatedCache.corkInvalidations(PermissionManager.CACHE_KEY_PACKAGE_INFO);
+    }
+
+    /**
+     * Enable package info cache invalidations.
+     *
+     * @hide */
+    public static void uncorkPackageInfoCache() {
+        PropertyInvalidatedCache.uncorkInvalidations(PermissionManager.CACHE_KEY_PACKAGE_INFO);
+    }
 }
diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java
index 1dadbda..8a57f82 100644
--- a/core/java/android/content/pm/PackageParser.java
+++ b/core/java/android/content/pm/PackageParser.java
@@ -1695,7 +1695,7 @@
         }
 
         // Check to see if overlay should be excluded based on system property condition
-        if (!checkRequiredSystemProperty(requiredSystemPropertyName,
+        if (!checkRequiredSystemProperties(requiredSystemPropertyName,
                 requiredSystemPropertyValue)) {
             Slog.i(TAG, "Skipping target and overlay pair " + targetPackage + " and "
                     + codePath + ": overlay ignored due to required system property: "
@@ -1997,7 +1997,7 @@
                 }
 
                 // check to see if overlay should be excluded based on system property condition
-                if (!checkRequiredSystemProperty(propName, propValue)) {
+                if (!checkRequiredSystemProperties(propName, propValue)) {
                     Slog.i(TAG, "Skipping target and overlay pair " + pkg.mOverlayTarget + " and "
                         + pkg.baseCodePath+ ": overlay ignored due to required system property: "
                         + propName + " with value: " + propValue);
@@ -2427,24 +2427,42 @@
 
     /**
      * Returns {@code true} if both the property name and value are empty or if the given system
-     * property is set to the specified value. In all other cases, returns {@code false}
+     * property is set to the specified value. Properties can be one or more, and if properties are
+     * more than one, they must be separated by comma, and count of names and values must be equal,
+     * and also every given system property must be set to the corresponding value.
+     * In all other cases, returns {@code false}
      */
-    public static boolean checkRequiredSystemProperty(String propName, String propValue) {
-        if (TextUtils.isEmpty(propName) || TextUtils.isEmpty(propValue)) {
-            if (!TextUtils.isEmpty(propName) || !TextUtils.isEmpty(propValue)) {
+    public static boolean checkRequiredSystemProperties(@Nullable String rawPropNames,
+            @Nullable String rawPropValues) {
+        if (TextUtils.isEmpty(rawPropNames) || TextUtils.isEmpty(rawPropValues)) {
+            if (!TextUtils.isEmpty(rawPropNames) || !TextUtils.isEmpty(rawPropValues)) {
                 // malformed condition - incomplete
-                Slog.w(TAG, "Disabling overlay - incomplete property :'" + propName
-                    + "=" + propValue + "' - require both requiredSystemPropertyName"
-                    + " AND requiredSystemPropertyValue to be specified.");
+                Slog.w(TAG, "Disabling overlay - incomplete property :'" + rawPropNames
+                        + "=" + rawPropValues + "' - require both requiredSystemPropertyName"
+                        + " AND requiredSystemPropertyValue to be specified.");
                 return false;
             }
             // no valid condition set - so no exclusion criteria, overlay will be included.
             return true;
         }
 
-        // check property value - make sure it is both set and equal to expected value
-        final String currValue = SystemProperties.get(propName);
-        return (currValue != null && currValue.equals(propValue));
+        final String[] propNames = rawPropNames.split(",");
+        final String[] propValues = rawPropValues.split(",");
+
+        if (propNames.length != propValues.length) {
+            Slog.w(TAG, "Disabling overlay - property :'" + rawPropNames
+                    + "=" + rawPropValues + "' - require both requiredSystemPropertyName"
+                    + " AND requiredSystemPropertyValue lists to have the same size.");
+            return false;
+        }
+        for (int i = 0; i < propNames.length; i++) {
+            // Check property value: make sure it is both set and equal to expected value
+            final String currValue = SystemProperties.get(propNames[i]);
+            if (!TextUtils.equals(currValue, propValues[i])) {
+                return false;
+            }
+        }
+        return true;
     }
 
     /**
@@ -6855,9 +6873,9 @@
 
         /** @hide */
         public boolean canHaveOatDir() {
-            // The following app types CANNOT have oat directory
-            // - non-updated system apps
-            return !isSystem() || isUpdatedSystemApp();
+            // Nobody should be calling this method ever, but we can't rely on this.
+            // Thus no logic here and a reasonable return value.
+            return true;
         }
 
         public boolean isMatch(int flags) {
diff --git a/core/java/android/content/pm/PackageParserCacheHelper.java b/core/java/android/content/pm/PackageParserCacheHelper.java
index 44def33..8212224 100644
--- a/core/java/android/content/pm/PackageParserCacheHelper.java
+++ b/core/java/android/content/pm/PackageParserCacheHelper.java
@@ -78,10 +78,19 @@
         /**
          * Read an string index from a parcel, and returns the corresponding string from the pool.
          */
-        @Override
         public String readString(Parcel p) {
             return mStrings.get(p.readInt());
         }
+
+        @Override
+        public String readString8(Parcel p) {
+            return readString(p);
+        }
+
+        @Override
+        public String readString16(Parcel p) {
+            return readString(p);
+        }
     }
 
     /**
@@ -110,7 +119,6 @@
          * Instead of writing a string directly to a parcel, this method adds it to the pool,
          * and write the index in the pool to the parcel.
          */
-        @Override
         public void writeString(Parcel p, String s) {
             final Integer cur = mIndexes.get(s);
             if (cur != null) {
@@ -133,6 +141,16 @@
             }
         }
 
+        @Override
+        public void writeString8(Parcel p, String s) {
+            writeString(p, s);
+        }
+
+        @Override
+        public void writeString16(Parcel p, String s) {
+            writeString(p, s);
+        }
+
         /**
          * Closes a parcel by appending the string pool at the end and updating the pool offset,
          * which it assumes is at the first byte.  It also uninstalls itself as a read-write helper.
diff --git a/core/java/android/content/pm/ProviderInfo.java b/core/java/android/content/pm/ProviderInfo.java
index 07d42dc..3984ade 100644
--- a/core/java/android/content/pm/ProviderInfo.java
+++ b/core/java/android/content/pm/ProviderInfo.java
@@ -145,9 +145,9 @@
 
     @Override public void writeToParcel(Parcel out, int parcelableFlags) {
         super.writeToParcel(out, parcelableFlags);
-        out.writeString(authority);
-        out.writeString(readPermission);
-        out.writeString(writePermission);
+        out.writeString8(authority);
+        out.writeString8(readPermission);
+        out.writeString8(writePermission);
         out.writeInt(grantUriPermissions ? 1 : 0);
         out.writeInt(forceUriPermissions ? 1 : 0);
         out.writeTypedArray(uriPermissionPatterns, parcelableFlags);
@@ -175,9 +175,9 @@
 
     private ProviderInfo(Parcel in) {
         super(in);
-        authority = in.readString();
-        readPermission = in.readString();
-        writePermission = in.readString();
+        authority = in.readString8();
+        readPermission = in.readString8();
+        writePermission = in.readString8();
         grantUriPermissions = in.readInt() != 0;
         forceUriPermissions = in.readInt() != 0;
         uriPermissionPatterns = in.createTypedArray(PatternMatcher.CREATOR);
diff --git a/core/java/android/content/pm/ServiceInfo.java b/core/java/android/content/pm/ServiceInfo.java
index 5f90b6c..d3f9e24 100644
--- a/core/java/android/content/pm/ServiceInfo.java
+++ b/core/java/android/content/pm/ServiceInfo.java
@@ -244,7 +244,7 @@
 
     public void writeToParcel(Parcel dest, int parcelableFlags) {
         super.writeToParcel(dest, parcelableFlags);
-        dest.writeString(permission);
+        dest.writeString8(permission);
         dest.writeInt(flags);
         dest.writeInt(mForegroundServiceType);
     }
@@ -261,7 +261,7 @@
 
     private ServiceInfo(Parcel source) {
         super(source);
-        permission = source.readString();
+        permission = source.readString8();
         flags = source.readInt();
         mForegroundServiceType = source.readInt();
     }
diff --git a/core/java/android/content/pm/parsing/ApkLiteParseUtils.java b/core/java/android/content/pm/parsing/ApkLiteParseUtils.java
index 27399e4..2f416a2 100644
--- a/core/java/android/content/pm/parsing/ApkLiteParseUtils.java
+++ b/core/java/android/content/pm/parsing/ApkLiteParseUtils.java
@@ -413,7 +413,7 @@
         }
 
         // Check to see if overlay should be excluded based on system property condition
-        if (!PackageParser.checkRequiredSystemProperty(requiredSystemPropertyName,
+        if (!PackageParser.checkRequiredSystemProperties(requiredSystemPropertyName,
                 requiredSystemPropertyValue)) {
             Slog.i(TAG, "Skipping target and overlay pair " + targetPackage + " and "
                     + codePath + ": overlay ignored due to required system property: "
diff --git a/core/java/android/content/pm/parsing/PackageInfoWithoutStateUtils.java b/core/java/android/content/pm/parsing/PackageInfoWithoutStateUtils.java
index 9a1f7c9..216b3bb 100644
--- a/core/java/android/content/pm/parsing/PackageInfoWithoutStateUtils.java
+++ b/core/java/android/content/pm/parsing/PackageInfoWithoutStateUtils.java
@@ -350,9 +350,6 @@
         // TODO(b/135203078): Consolidate the data directory logic, remove initForUser
         ai.initForUser(userId);
 
-        ai.flags = appInfoFlags(pkg);
-        ai.privateFlags = appInfoPrivateFlags(pkg);
-
         if ((flags & PackageManager.GET_META_DATA) == 0) {
             ai.metaData = null;
         }
diff --git a/core/java/android/content/pm/parsing/ParsingPackage.java b/core/java/android/content/pm/parsing/ParsingPackage.java
index 4c95532..2ee0ad6 100644
--- a/core/java/android/content/pm/parsing/ParsingPackage.java
+++ b/core/java/android/content/pm/parsing/ParsingPackage.java
@@ -34,6 +34,7 @@
 import android.content.pm.parsing.component.ParsedService;
 import android.os.Bundle;
 import android.util.SparseArray;
+import android.util.SparseIntArray;
 
 import java.security.PublicKey;
 import java.util.Map;
@@ -258,6 +259,8 @@
 
     ParsingPackage setManageSpaceActivityName(String manageSpaceActivityName);
 
+    ParsingPackage setMinExtensionVersions(@Nullable SparseIntArray minExtensionVersions);
+
     ParsingPackage setMinSdkVersion(int minSdkVersion);
 
     ParsingPackage setNetworkSecurityConfigRes(int networkSecurityConfigRes);
diff --git a/core/java/android/content/pm/parsing/ParsingPackageImpl.java b/core/java/android/content/pm/parsing/ParsingPackageImpl.java
index be1817d..f932bc2 100644
--- a/core/java/android/content/pm/parsing/ParsingPackageImpl.java
+++ b/core/java/android/content/pm/parsing/ParsingPackageImpl.java
@@ -51,6 +51,7 @@
 import android.util.ArraySet;
 import android.util.Pair;
 import android.util.SparseArray;
+import android.util.SparseIntArray;
 
 import com.android.internal.R;
 import com.android.internal.annotations.VisibleForTesting;
@@ -340,6 +341,8 @@
     private String manageSpaceActivityName;
     private float maxAspectRatio;
     private float minAspectRatio;
+    @Nullable
+    private SparseIntArray minExtensionVersions;
     private int minSdkVersion;
     private int networkSecurityConfigRes;
     @Nullable
@@ -847,9 +850,15 @@
     @Deprecated
     @Override
     public ApplicationInfo toAppInfoWithoutState() {
-        ApplicationInfo appInfo = new ApplicationInfo();
+        ApplicationInfo appInfo = toAppInfoWithoutStateWithoutFlags();
         appInfo.flags = PackageInfoWithoutStateUtils.appInfoFlags(this);
         appInfo.privateFlags = PackageInfoWithoutStateUtils.appInfoPrivateFlags(this);
+        return appInfo;
+    }
+
+    @Override
+    public ApplicationInfo toAppInfoWithoutStateWithoutFlags() {
+        ApplicationInfo appInfo = new ApplicationInfo();
 
         appInfo.appComponentFactory = appComponentFactory;
         appInfo.backupAgentName = backupAgentName;
@@ -1100,6 +1109,7 @@
         dest.writeBoolean(this.preserveLegacyExternalStorage);
         dest.writeArraySet(this.mimeGroups);
         dest.writeInt(this.gwpAsanMode);
+        dest.writeSparseIntArray(this.minExtensionVersions);
     }
 
     public ParsingPackageImpl(Parcel in) {
@@ -1259,6 +1269,7 @@
         this.preserveLegacyExternalStorage = in.readBoolean();
         this.mimeGroups = (ArraySet<String>) in.readArraySet(boot);
         this.gwpAsanMode = in.readInt();
+        this.minExtensionVersions = in.readSparseIntArray();
     }
 
     public static final Parcelable.Creator<ParsingPackageImpl> CREATOR =
@@ -1767,6 +1778,12 @@
         return minAspectRatio;
     }
 
+    @Nullable
+    @Override
+    public SparseIntArray getMinExtensionVersions() {
+        return minExtensionVersions;
+    }
+
     @Override
     public int getMinSdkVersion() {
         return minSdkVersion;
@@ -2215,6 +2232,12 @@
     }
 
     @Override
+    public ParsingPackageImpl setMinExtensionVersions(@Nullable SparseIntArray value) {
+        minExtensionVersions = value;
+        return this;
+    }
+
+    @Override
     public ParsingPackageImpl setMinSdkVersion(int value) {
         minSdkVersion = value;
         return this;
diff --git a/core/java/android/content/pm/parsing/ParsingPackageRead.java b/core/java/android/content/pm/parsing/ParsingPackageRead.java
index 687bc23..5b53c18 100644
--- a/core/java/android/content/pm/parsing/ParsingPackageRead.java
+++ b/core/java/android/content/pm/parsing/ParsingPackageRead.java
@@ -41,6 +41,7 @@
 import android.util.ArraySet;
 import android.util.Pair;
 import android.util.SparseArray;
+import android.util.SparseIntArray;
 
 import com.android.internal.R;
 
@@ -609,6 +610,13 @@
     String getManageSpaceActivityName();
 
     /**
+     * @see ApplicationInfo#minExtensionVersions
+     * @see R.styleable#AndroidManifestExtensionSdk
+     */
+    @Nullable
+    SparseIntArray getMinExtensionVersions();
+
+    /**
      * @see ApplicationInfo#minSdkVersion
      * @see R.styleable#AndroidManifestUsesSdk_minSdkVersion
      */
@@ -850,4 +858,9 @@
 
     // TODO(b/135203078): Hide and enforce going through PackageInfoUtils
     ApplicationInfo toAppInfoWithoutState();
+
+    /**
+     * same as toAppInfoWithoutState except without flag computation.
+     */
+    ApplicationInfo toAppInfoWithoutStateWithoutFlags();
 }
diff --git a/core/java/android/content/pm/parsing/ParsingPackageUtils.java b/core/java/android/content/pm/parsing/ParsingPackageUtils.java
index c61362f..4e18979 100644
--- a/core/java/android/content/pm/parsing/ParsingPackageUtils.java
+++ b/core/java/android/content/pm/parsing/ParsingPackageUtils.java
@@ -84,7 +84,6 @@
 import android.os.Bundle;
 import android.os.FileUtils;
 import android.os.RemoteException;
-import android.os.SystemProperties;
 import android.os.Trace;
 import android.os.ext.SdkExtensions;
 import android.text.TextUtils;
@@ -95,6 +94,7 @@
 import android.util.Pair;
 import android.util.Slog;
 import android.util.SparseArray;
+import android.util.SparseIntArray;
 import android.util.TypedValue;
 import android.util.apk.ApkSignatureVerifier;
 
@@ -1255,6 +1255,7 @@
 
                 int type;
                 final int innerDepth = parser.getDepth();
+                SparseIntArray minExtensionVersions = null;
                 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
                         && (type != XmlPullParser.END_TAG || parser.getDepth() > innerDepth)) {
                     if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
@@ -1263,7 +1264,10 @@
 
                     final ParseResult result;
                     if (parser.getName().equals("extension-sdk")) {
-                        result = parseExtensionSdk(input, pkg, res, parser);
+                        if (minExtensionVersions == null) {
+                            minExtensionVersions = new SparseIntArray();
+                        }
+                        result = parseExtensionSdk(input, res, parser, minExtensionVersions);
                         XmlUtils.skipCurrentTag(parser);
                     } else {
                         result = ParsingUtils.unknownTag("<uses-sdk>", pkg, parser, input);
@@ -1273,6 +1277,7 @@
                         return input.error(result);
                     }
                 }
+                pkg.setMinExtensionVersions(exactSizedCopyOfSparseArray(minExtensionVersions));
             } finally {
                 sa.recycle();
             }
@@ -1280,8 +1285,21 @@
         return input.success(pkg);
     }
 
-    private static ParseResult parseExtensionSdk(ParseInput input, ParsingPackage pkg,
-            Resources res, XmlResourceParser parser) {
+    @Nullable
+    private static SparseIntArray exactSizedCopyOfSparseArray(@Nullable SparseIntArray input) {
+        if (input == null) {
+            return null;
+        }
+        SparseIntArray output = new SparseIntArray(input.size());
+        for (int i = 0; i < input.size(); i++) {
+            output.put(input.keyAt(i), input.valueAt(i));
+        }
+        return output;
+    }
+
+    private static ParseResult<SparseIntArray> parseExtensionSdk(
+            ParseInput input, Resources res, XmlResourceParser parser,
+            SparseIntArray minExtensionVersions) {
         int sdkVersion;
         int minVersion;
         TypedArray sa = res.obtainAttributes(parser, R.styleable.AndroidManifestExtensionSdk);
@@ -1316,7 +1334,8 @@
                     PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED,
                     "Specified sdkVersion " + sdkVersion + " is not valid");
         }
-        return input.success(pkg);
+        minExtensionVersions.put(sdkVersion, minVersion);
+        return input.success(minExtensionVersions);
     }
 
     /**
@@ -1511,8 +1530,8 @@
             } else if (parser.getName().equals("package")) {
                 final TypedArray sa = res.obtainAttributes(parser,
                         R.styleable.AndroidManifestQueriesPackage);
-                final String packageName = sa.getString(
-                        R.styleable.AndroidManifestQueriesPackage_name);
+                final String packageName = sa.getNonConfigurationString(
+                        R.styleable.AndroidManifestQueriesPackage_name, 0);
                 if (TextUtils.isEmpty(packageName)) {
                     return input.error("Package name is missing from package tag.");
                 }
@@ -1521,8 +1540,8 @@
                 final TypedArray sa = res.obtainAttributes(parser,
                         R.styleable.AndroidManifestQueriesProvider);
                 try {
-                    final String authorities =
-                            sa.getString(R.styleable.AndroidManifestQueriesProvider_authorities);
+                    final String authorities = sa.getNonConfigurationString(
+                            R.styleable.AndroidManifestQueriesProvider_authorities, 0);
                     if (TextUtils.isEmpty(authorities)) {
                         return input.error(
                                 PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED,
@@ -2328,7 +2347,7 @@
                     R.styleable.AndroidManifestResourceOverlay_requiredSystemPropertyName);
             String propValue = sa.getString(
                     R.styleable.AndroidManifestResourceOverlay_requiredSystemPropertyValue);
-            if (!checkOverlayRequiredSystemProperty(propName, propValue)) {
+            if (!PackageParser.checkRequiredSystemProperties(propName, propValue)) {
                 Slog.i(TAG, "Skipping target and overlay pair " + target + " and "
                         + pkg.getBaseCodePath()
                         + ": overlay ignored due to required system property: "
@@ -2502,24 +2521,6 @@
         }
     }
 
-    private static boolean checkOverlayRequiredSystemProperty(String propName, String propValue) {
-        if (TextUtils.isEmpty(propName) || TextUtils.isEmpty(propValue)) {
-            if (!TextUtils.isEmpty(propName) || !TextUtils.isEmpty(propValue)) {
-                // malformed condition - incomplete
-                Slog.w(TAG, "Disabling overlay - incomplete property :'" + propName
-                        + "=" + propValue + "' - require both requiredSystemPropertyName"
-                        + " AND requiredSystemPropertyValue to be specified.");
-                return false;
-            }
-            // no valid condition set - so no exclusion criteria, overlay will be included.
-            return true;
-        }
-
-        // check property value - make sure it is both set and equal to expected value
-        final String currValue = SystemProperties.get(propName);
-        return (currValue != null && currValue.equals(propValue));
-    }
-
     /**
      * This is a pre-density application which will get scaled - instead of being pixel perfect.
      * This type of application is not resizable.
diff --git a/core/java/android/database/sqlite/SQLiteConnection.java b/core/java/android/database/sqlite/SQLiteConnection.java
index f7c96a3..2f67f6d 100644
--- a/core/java/android/database/sqlite/SQLiteConnection.java
+++ b/core/java/android/database/sqlite/SQLiteConnection.java
@@ -228,19 +228,26 @@
         } catch (SQLiteCantOpenDatabaseException e) {
             String message = String.format("Cannot open database '%s'", file);
 
-            final Path path = FileSystems.getDefault().getPath(file);
-            final Path dir = path.getParent();
+            try {
+                // Try to diagnose for common reasons. If something fails in here, that's fine;
+                // just swallow the exception.
 
-            if (!Files.isDirectory(dir)) {
-                message += ": Directory " + dir + " doesn't exist";
-            } else if (!Files.exists(path)) {
-                message += ": File " + path + " doesn't exist";
-            } else if (!Files.isReadable(path)) {
-                message += ": File " + path + " is not readable";
-            } else if (Files.isDirectory(path)) {
-                message += ": Path " + path + " is a directory";
-            } else {
-                message += ": Unknown reason";
+                final Path path = FileSystems.getDefault().getPath(file);
+                final Path dir = path.getParent();
+
+                if (!Files.isDirectory(dir)) {
+                    message += ": Directory " + dir + " doesn't exist";
+                } else if (!Files.exists(path)) {
+                    message += ": File " + path + " doesn't exist";
+                } else if (!Files.isReadable(path)) {
+                    message += ": File " + path + " is not readable";
+                } else if (Files.isDirectory(path)) {
+                    message += ": Path " + path + " is a directory";
+                } else {
+                    message += ": Unknown reason";
+                }
+            } catch (Throwable th) {
+                message += ": Unknown reason; cannot examine filesystem: " + th.getMessage();
             }
             throw new SQLiteCantOpenDatabaseException(message, e);
         } finally {
diff --git a/core/java/android/debug/AdbNotifications.java b/core/java/android/debug/AdbNotifications.java
new file mode 100644
index 0000000..fed5f5f
--- /dev/null
+++ b/core/java/android/debug/AdbNotifications.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.debug;
+
+import android.annotation.NonNull;
+import android.app.Notification;
+import android.app.PendingIntent;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.res.Resources;
+import android.os.UserHandle;
+import android.provider.Settings;
+
+import com.android.internal.notification.SystemNotificationChannels;
+
+/**
+ * Utility class for building adb notifications.
+ * @hide
+ */
+public final class AdbNotifications {
+    /**
+     * Notification channel for tv types.
+     */
+    private static final String ADB_NOTIFICATION_CHANNEL_ID_TV = "usbdevicemanager.adb.tv";
+
+    /**
+     * Builds a notification to show connected state for adb over a transport type.
+     * @param context the context
+     * @param transportType the adb transport type.
+     * @return a newly created Notification for the transport type.
+     */
+    public static Notification createNotification(@NonNull Context context,
+            byte transportType) {
+        Resources resources = context.getResources();
+        int titleId;
+        int messageId;
+
+        if (transportType == AdbTransportType.USB) {
+            titleId = com.android.internal.R.string.adb_active_notification_title;
+            messageId = com.android.internal.R.string.adb_active_notification_message;
+        } else if (transportType == AdbTransportType.WIFI) {
+            titleId = com.android.internal.R.string.adbwifi_active_notification_title;
+            messageId = com.android.internal.R.string.adbwifi_active_notification_message;
+        } else {
+            throw new IllegalArgumentException(
+                    "createNotification called with unknown transport type=" + transportType);
+        }
+
+        CharSequence title = resources.getText(titleId);
+        CharSequence message = resources.getText(messageId);
+
+        Intent intent = new Intent(Settings.ACTION_APPLICATION_DEVELOPMENT_SETTINGS);
+        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
+        intent.setPackage(context.getPackageManager().resolveActivity(intent,
+                PackageManager.MATCH_SYSTEM_ONLY).activityInfo.packageName);
+        PendingIntent pIntent = PendingIntent.getActivityAsUser(context, 0, intent,
+                PendingIntent.FLAG_IMMUTABLE, null, UserHandle.CURRENT);
+
+        return new Notification.Builder(context, SystemNotificationChannels.DEVELOPER_IMPORTANT)
+                .setSmallIcon(com.android.internal.R.drawable.stat_sys_adb)
+                .setWhen(0)
+                .setOngoing(true)
+                .setTicker(title)
+                .setDefaults(0)  // please be quiet
+                .setColor(context.getColor(
+                            com.android.internal.R.color.system_notification_accent_color))
+                .setContentTitle(title)
+                .setContentText(message)
+                .setContentIntent(pIntent)
+                .setVisibility(Notification.VISIBILITY_PUBLIC)
+                .extend(new Notification.TvExtender()
+                        .setChannelId(ADB_NOTIFICATION_CHANNEL_ID_TV))
+                .build();
+    }
+}
diff --git a/core/java/android/hardware/camera2/CameraCharacteristics.java b/core/java/android/hardware/camera2/CameraCharacteristics.java
index eb6901f6..2012039 100644
--- a/core/java/android/hardware/camera2/CameraCharacteristics.java
+++ b/core/java/android/hardware/camera2/CameraCharacteristics.java
@@ -488,11 +488,7 @@
      * The respective value of such request key can be obtained by calling
      * {@link CaptureRequest.Builder#getPhysicalCameraKey }. Capture requests that contain
      * individual physical device requests must be built via
-     * {@link android.hardware.camera2.CameraDevice#createCaptureRequest(int, Set)}.
-     * Such extended capture requests can be passed only to
-     * {@link CameraCaptureSession#capture } or {@link CameraCaptureSession#captureBurst } and
-     * not to {@link CameraCaptureSession#setRepeatingRequest } or
-     * {@link CameraCaptureSession#setRepeatingBurst }.</p>
+     * {@link android.hardware.camera2.CameraDevice#createCaptureRequest(int, Set)}.</p>
      *
      * <p>The list returned is not modifiable, so any attempts to modify it will throw
      * a {@code UnsupportedOperationException}.</p>
diff --git a/core/java/android/hardware/camera2/legacy/LegacyFaceDetectMapper.java b/core/java/android/hardware/camera2/legacy/LegacyFaceDetectMapper.java
index 882a7f4..b3b4549 100644
--- a/core/java/android/hardware/camera2/legacy/LegacyFaceDetectMapper.java
+++ b/core/java/android/hardware/camera2/legacy/LegacyFaceDetectMapper.java
@@ -233,8 +233,10 @@
         Camera.Parameters params = legacyRequest.parameters;
 
         Rect activeArray = characteristics.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE);
-        ZoomData zoomData = ParameterUtils.convertScalerCropRegion(activeArray,
-                request.get(CaptureRequest.SCALER_CROP_REGION), previewSize, params);
+        ZoomData zoomData = ParameterUtils.convertToLegacyZoom(activeArray,
+                request.get(CaptureRequest.SCALER_CROP_REGION),
+                request.get(CaptureRequest.CONTROL_ZOOM_RATIO),
+                previewSize, params);
 
         List<Face> convertedFaces = new ArrayList<>();
         if (faces != null) {
diff --git a/core/java/android/hardware/camera2/legacy/LegacyMetadataMapper.java b/core/java/android/hardware/camera2/legacy/LegacyMetadataMapper.java
index 6953a5b..362ddfa 100644
--- a/core/java/android/hardware/camera2/legacy/LegacyMetadataMapper.java
+++ b/core/java/android/hardware/camera2/legacy/LegacyMetadataMapper.java
@@ -771,6 +771,7 @@
                     CameraCharacteristics.CONTROL_AWB_AVAILABLE_MODES                     ,
                     CameraCharacteristics.CONTROL_AWB_LOCK_AVAILABLE                      ,
                     CameraCharacteristics.CONTROL_MAX_REGIONS                             ,
+                    CameraCharacteristics.CONTROL_ZOOM_RATIO_RANGE                        ,
                     CameraCharacteristics.FLASH_INFO_AVAILABLE                            ,
                     CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL                   ,
                     CameraCharacteristics.JPEG_AVAILABLE_THUMBNAIL_SIZES                  ,
@@ -828,6 +829,7 @@
                     CaptureRequest.CONTROL_MODE,
                     CaptureRequest.CONTROL_SCENE_MODE,
                     CaptureRequest.CONTROL_VIDEO_STABILIZATION_MODE,
+                    CaptureRequest.CONTROL_ZOOM_RATIO,
                     CaptureRequest.FLASH_MODE,
                     CaptureRequest.JPEG_GPS_COORDINATES,
                     CaptureRequest.JPEG_GPS_PROCESSING_METHOD,
@@ -872,6 +874,7 @@
                     CaptureResult.CONTROL_AWB_MODE                                 ,
                     CaptureResult.CONTROL_AWB_LOCK                                 ,
                     CaptureResult.CONTROL_MODE                                     ,
+                    CaptureResult.CONTROL_ZOOM_RATIO                               ,
                     CaptureResult.FLASH_MODE                                       ,
                     CaptureResult.JPEG_GPS_COORDINATES                             ,
                     CaptureResult.JPEG_GPS_PROCESSING_METHOD                       ,
@@ -935,6 +938,12 @@
 
     private static void mapScaler(CameraMetadataNative m, Parameters p) {
         /*
+         * control.zoomRatioRange
+         */
+        Range<Float> zoomRatioRange = new Range<Float>(1.0f, ParameterUtils.getMaxZoomRatio(p));
+        m.set(CONTROL_ZOOM_RATIO_RANGE, zoomRatioRange);
+
+        /*
          * scaler.availableMaxDigitalZoom
          */
         m.set(SCALER_AVAILABLE_MAX_DIGITAL_ZOOM, ParameterUtils.getMaxZoomRatio(p));
@@ -1383,6 +1392,9 @@
         // control.sceneMode -- DISABLED is always available
         m.set(CaptureRequest.CONTROL_SCENE_MODE, CONTROL_SCENE_MODE_DISABLED);
 
+        // control.zoomRatio -- 1.0
+        m.set(CaptureRequest.CONTROL_ZOOM_RATIO, 1.0f);
+
         /*
          * statistics.*
          */
diff --git a/core/java/android/hardware/camera2/legacy/LegacyRequestMapper.java b/core/java/android/hardware/camera2/legacy/LegacyRequestMapper.java
index 2e06d5f..3a46379 100644
--- a/core/java/android/hardware/camera2/legacy/LegacyRequestMapper.java
+++ b/core/java/android/hardware/camera2/legacy/LegacyRequestMapper.java
@@ -68,8 +68,9 @@
          */
         ParameterUtils.ZoomData zoomData;
         {
-            zoomData = ParameterUtils.convertScalerCropRegion(activeArray,
+            zoomData = ParameterUtils.convertToLegacyZoom(activeArray,
                     request.get(SCALER_CROP_REGION),
+                    request.get(CONTROL_ZOOM_RATIO),
                     previewSize,
                     params);
 
diff --git a/core/java/android/hardware/camera2/legacy/LegacyResultMapper.java b/core/java/android/hardware/camera2/legacy/LegacyResultMapper.java
index dc5823d..09edf74 100644
--- a/core/java/android/hardware/camera2/legacy/LegacyResultMapper.java
+++ b/core/java/android/hardware/camera2/legacy/LegacyResultMapper.java
@@ -118,8 +118,10 @@
 
         Rect activeArraySize = characteristics.get(
                 CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE);
-        ZoomData zoomData = ParameterUtils.convertScalerCropRegion(activeArraySize,
-                request.get(CaptureRequest.SCALER_CROP_REGION), previewSize, params);
+        ZoomData zoomData = ParameterUtils.convertToLegacyZoom(activeArraySize,
+                request.get(CaptureRequest.SCALER_CROP_REGION),
+                request.get(CaptureRequest.CONTROL_ZOOM_RATIO),
+                previewSize, params);
 
         /*
          * colorCorrection
@@ -516,5 +518,12 @@
         {
             m.set(SCALER_CROP_REGION, zoomData.reportedCrop);
         }
+
+        /*
+         * control.zoomRatio
+         */
+        {
+            m.set(CONTROL_ZOOM_RATIO, zoomData.reportedZoomRatio);
+        }
     }
 }
diff --git a/core/java/android/hardware/camera2/legacy/ParameterUtils.java b/core/java/android/hardware/camera2/legacy/ParameterUtils.java
index 3cfd020..eb43598 100644
--- a/core/java/android/hardware/camera2/legacy/ParameterUtils.java
+++ b/core/java/android/hardware/camera2/legacy/ParameterUtils.java
@@ -73,11 +73,15 @@
         public final Rect previewCrop;
         /** Reported crop-region given the zoom index, coordinates relative to active-array */
         public final Rect reportedCrop;
+        /** Reported zoom ratio given the zoom index */
+        public final float reportedZoomRatio;
 
-        public ZoomData(int zoomIndex, Rect previewCrop, Rect reportedCrop) {
+        public ZoomData(int zoomIndex, Rect previewCrop, Rect reportedCrop,
+                float reportedZoomRatio) {
             this.zoomIndex = zoomIndex;
             this.previewCrop = previewCrop;
             this.reportedCrop = reportedCrop;
+            this.reportedZoomRatio = reportedZoomRatio;
         }
     }
 
@@ -371,7 +375,8 @@
      * @throws NullPointerException if any of the args were {@code null}
      */
     public static int getClosestAvailableZoomCrop(
-            Camera.Parameters params, Rect activeArray, Size streamSize, Rect cropRegion,
+            Camera.Parameters params, Rect activeArray,
+            Size streamSize, Rect cropRegion,
             /*out*/
             Rect reportedCropRegion,
             Rect previewCropRegion) {
@@ -733,6 +738,92 @@
     }
 
     /**
+     * Convert the user-specified crop region/zoom into zoom data; which can be used
+     * to set the parameters to a specific zoom index, or to report back to the user what
+     * the actual zoom was, or for other calculations requiring the current preview crop region.
+     *
+     * <p>None of the parameters are mutated.<p>
+     *
+     * @param activeArraySize active array size of the sensor (e.g. max jpeg size)
+     * @param cropRegion the user-specified crop region
+     * @param zoomRatio the user-specified zoom ratio
+     * @param previewSize the current preview size (in pixels)
+     * @param params the current camera parameters (not mutated)
+     *
+     * @return the zoom index, and the effective/reported crop regions (relative to active array)
+     */
+    public static ZoomData convertToLegacyZoom(Rect activeArraySize, Rect
+            cropRegion, Float zoomRatio, Size previewSize, Camera.Parameters params) {
+        final float FLOAT_EQUAL_THRESHOLD = 0.0001f;
+        if (zoomRatio != null &&
+                Math.abs(1.0f - zoomRatio) > FLOAT_EQUAL_THRESHOLD) {
+            // User uses CONTROL_ZOOM_RATIO to control zoom
+            return convertZoomRatio(activeArraySize, zoomRatio, previewSize, params);
+        }
+
+        return convertScalerCropRegion(activeArraySize, cropRegion, previewSize, params);
+    }
+
+    /**
+     * Convert the user-specified zoom ratio into zoom data; which can be used
+     * to set the parameters to a specific zoom index, or to report back to the user what the
+     * actual zoom was, or for other calculations requiring the current preview crop region.
+     *
+     * <p>None of the parameters are mutated.</p>
+     *
+     * @param activeArraySize active array size of the sensor (e.g. max jpeg size)
+     * @param zoomRatio the current zoom ratio
+     * @param previewSize the current preview size (in pixels)
+     * @param params the current camera parameters (not mutated)
+     *
+     * @return the zoom index, and the effective/reported crop regions (relative to active array)
+     */
+    public static ZoomData convertZoomRatio(Rect activeArraySize, float zoomRatio,
+            Size previewSize, Camera.Parameters params) {
+        if (DEBUG) {
+            Log.v(TAG, "convertZoomRatio - user zoom ratio was " + zoomRatio);
+        }
+
+        List<Rect> availableReportedCropRegions =
+                getAvailableZoomCropRectangles(params, activeArraySize);
+        List<Rect> availablePreviewCropRegions =
+                getAvailablePreviewZoomCropRectangles(params, activeArraySize, previewSize);
+        if (availableReportedCropRegions.size() != availablePreviewCropRegions.size()) {
+            throw new AssertionError("available reported/preview crop region size mismatch");
+        }
+
+        // Find the best matched legacy zoom ratio for the requested camera2 zoom ratio.
+        int bestZoomIndex = 0;
+        Rect reportedCropRegion = new Rect(availableReportedCropRegions.get(0));
+        Rect previewCropRegion = new Rect(availablePreviewCropRegions.get(0));
+        float reportedZoomRatio = 1.0f;
+        if (params.isZoomSupported()) {
+            List<Integer> zoomRatios = params.getZoomRatios();
+            for (int i = 1; i < zoomRatios.size(); i++) {
+                if (zoomRatio * ZOOM_RATIO_MULTIPLIER >= zoomRatios.get(i)) {
+                    bestZoomIndex = i;
+                    reportedCropRegion = availableReportedCropRegions.get(i);
+                    previewCropRegion = availablePreviewCropRegions.get(i);
+                    reportedZoomRatio = zoomRatios.get(i);
+                } else {
+                    break;
+                }
+            }
+        }
+
+        if (DEBUG) {
+            Log.v(TAG, "convertZoomRatio - zoom calculated to: " +
+                    "zoomIndex = " + bestZoomIndex +
+                    ", reported crop region = " + reportedCropRegion +
+                    ", preview crop region = " + previewCropRegion +
+                    ", reported zoom ratio = " + reportedZoomRatio);
+        }
+
+        return new ZoomData(bestZoomIndex, reportedCropRegion,
+                previewCropRegion, reportedZoomRatio);
+    }
+
+    /**
      * Convert the user-specified crop region into zoom data; which can be used
      * to set the parameters to a specific zoom index, or to report back to the user what the
      * actual zoom was, or for other calculations requiring the current preview crop region.
@@ -767,15 +858,17 @@
         final int zoomIdx = ParameterUtils.getClosestAvailableZoomCrop(params, activeArraySizeOnly,
                 previewSize, userCropRegion,
                 /*out*/reportedCropRegion, /*out*/previewCropRegion);
+        final float reportedZoomRatio = 1.0f;
 
         if (DEBUG) {
             Log.v(TAG, "convertScalerCropRegion - zoom calculated to: " +
                     "zoomIndex = " + zoomIdx +
                     ", reported crop region = " + reportedCropRegion +
-                    ", preview crop region = " + previewCropRegion);
+                    ", preview crop region = " + previewCropRegion +
+                    ", reported zoom ratio = " + reportedZoomRatio);
         }
 
-        return new ZoomData(zoomIdx, previewCropRegion, reportedCropRegion);
+        return new ZoomData(zoomIdx, previewCropRegion, reportedCropRegion, reportedZoomRatio);
     }
 
     /**
diff --git a/core/java/android/hardware/display/DeviceProductInfo.java b/core/java/android/hardware/display/DeviceProductInfo.java
index ed50d7c..94c5dd8 100644
--- a/core/java/android/hardware/display/DeviceProductInfo.java
+++ b/core/java/android/hardware/display/DeviceProductInfo.java
@@ -19,6 +19,7 @@
 import android.os.Parcel;
 import android.os.Parcelable;
 
+import java.util.Arrays;
 import java.util.Objects;
 
 /**
@@ -33,18 +34,21 @@
     private final String mProductId;
     private final Integer mModelYear;
     private final ManufactureDate mManufactureDate;
+    private final int[] mRelativeAddress;
 
     public DeviceProductInfo(
             String name,
             String manufacturerPnpId,
             String productId,
             Integer modelYear,
-            ManufactureDate manufactureDate) {
+            ManufactureDate manufactureDate,
+            int[] relativeAddress) {
         this.mName = name;
         this.mManufacturerPnpId = manufacturerPnpId;
         this.mProductId = productId;
         this.mModelYear = modelYear;
         this.mManufactureDate = manufactureDate;
+        this.mRelativeAddress = relativeAddress;
     }
 
     private DeviceProductInfo(Parcel in) {
@@ -53,6 +57,7 @@
         mProductId = (String) in.readValue(null);
         mModelYear = (Integer) in.readValue(null);
         mManufactureDate = (ManufactureDate) in.readValue(null);
+        mRelativeAddress = in.createIntArray();
     }
 
     /**
@@ -92,6 +97,14 @@
         return mManufactureDate;
     }
 
+    /**
+     * @return Relative address in the display network. For example, for HDMI connected devices this
+     * can be its physical address. Each component of the address is in the range [0, 255].
+     */
+    public int[] getRelativeAddress() {
+        return mRelativeAddress;
+    }
+
     @Override
     public String toString() {
         return "DeviceProductInfo{"
@@ -105,6 +118,8 @@
                 + mModelYear
                 + ", manufactureDate="
                 + mManufactureDate
+                + ", relativeAddress="
+                + Arrays.toString(mRelativeAddress)
                 + '}';
     }
 
@@ -117,12 +132,14 @@
                 && Objects.equals(mManufacturerPnpId, that.mManufacturerPnpId)
                 && Objects.equals(mProductId, that.mProductId)
                 && Objects.equals(mModelYear, that.mModelYear)
-                && Objects.equals(mManufactureDate, that.mManufactureDate);
+                && Objects.equals(mManufactureDate, that.mManufactureDate)
+                && Arrays.equals(mRelativeAddress, that.mRelativeAddress);
     }
 
     @Override
     public int hashCode() {
-        return Objects.hash(mName, mManufacturerPnpId, mProductId, mModelYear, mManufactureDate);
+        return Objects.hash(mName, mManufacturerPnpId, mProductId, mModelYear, mManufactureDate,
+            mRelativeAddress);
     }
 
     public static final Creator<DeviceProductInfo> CREATOR =
@@ -150,6 +167,7 @@
         dest.writeValue(mProductId);
         dest.writeValue(mModelYear);
         dest.writeValue(mManufactureDate);
+        dest.writeIntArray(mRelativeAddress);
     }
 
     /**
diff --git a/core/java/android/hardware/display/DisplayManagerInternal.java b/core/java/android/hardware/display/DisplayManagerInternal.java
index 462110f..ad9bf07 100644
--- a/core/java/android/hardware/display/DisplayManagerInternal.java
+++ b/core/java/android/hardware/display/DisplayManagerInternal.java
@@ -65,21 +65,23 @@
     public abstract boolean isProximitySensorAvailable();
 
     /**
-     * Take a screenshot of the specified display and return a buffer.
+     * Screenshot for internal system-only use such as rotation, etc.  This method includes
+     * secure layers and the result should never be exposed to non-system applications.
+     * This method does not apply any rotation and provides the output in natural orientation.
      *
      * @param displayId The display id to take the screenshot of.
      * @return The buffer or null if we have failed.
      */
-    public abstract SurfaceControl.ScreenshotGraphicBuffer screenshot(int displayId);
+    public abstract SurfaceControl.ScreenshotGraphicBuffer systemScreenshot(int displayId);
 
     /**
-     * Take a screenshot without secure layer of the specified display and return a buffer.
+     * General screenshot functionality that excludes secure layers and applies appropriate
+     * rotation that the device is currently in.
      *
      * @param displayId The display id to take the screenshot of.
      * @return The buffer or null if we have failed.
      */
-    public abstract SurfaceControl.ScreenshotGraphicBuffer screenshotWithoutSecureLayer(
-            int displayId);
+    public abstract SurfaceControl.ScreenshotGraphicBuffer userScreenshot(int displayId);
 
     /**
      * Returns information about the specified logical display.
diff --git a/core/java/android/hardware/soundtrigger/KeyphraseEnrollmentInfo.java b/core/java/android/hardware/soundtrigger/KeyphraseEnrollmentInfo.java
index 0593545..3a6d508 100644
--- a/core/java/android/hardware/soundtrigger/KeyphraseEnrollmentInfo.java
+++ b/core/java/android/hardware/soundtrigger/KeyphraseEnrollmentInfo.java
@@ -18,6 +18,9 @@
 
 import android.Manifest;
 import android.annotation.IntDef;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.TestApi;
 import android.content.Intent;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
@@ -37,18 +40,22 @@
 import java.io.IOException;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
+import java.util.Arrays;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
+import java.util.Objects;
 
 /**
  * Enrollment information about the different available keyphrases.
  *
  * @hide
  */
+@TestApi
 public class KeyphraseEnrollmentInfo {
     private static final String TAG = "KeyphraseEnrollmentInfo";
     /**
@@ -63,6 +70,7 @@
      * Intent Action: for managing the keyphrases for hotword detection.
      * This needs to be defined by a service that supports enrolling users for hotword/keyphrase
      * detection.
+     * @hide
      */
     public static final String ACTION_MANAGE_VOICE_KEYPHRASES =
             "com.android.intent.action.MANAGE_VOICE_KEYPHRASES";
@@ -72,18 +80,21 @@
      * @see #MANAGE_ACTION_ENROLL
      * @see #MANAGE_ACTION_RE_ENROLL
      * @see #MANAGE_ACTION_UN_ENROLL
+     * @hide
      */
     public static final String EXTRA_VOICE_KEYPHRASE_ACTION =
             "com.android.intent.extra.VOICE_KEYPHRASE_ACTION";
 
     /**
      * Intent extra: The hint text to be shown on the voice keyphrase management UI.
+     * @hide
      */
     public static final String EXTRA_VOICE_KEYPHRASE_HINT_TEXT =
             "com.android.intent.extra.VOICE_KEYPHRASE_HINT_TEXT";
     /**
      * Intent extra: The voice locale to use while managing the keyphrase.
      * This is a BCP-47 language tag.
+     * @hide
      */
     public static final String EXTRA_VOICE_KEYPHRASE_LOCALE =
             "com.android.intent.extra.VOICE_KEYPHRASE_LOCALE";
@@ -125,7 +136,8 @@
 
     private String mParseError;
 
-    public KeyphraseEnrollmentInfo(PackageManager pm) {
+    public KeyphraseEnrollmentInfo(@NonNull PackageManager pm) {
+        Objects.requireNonNull(pm);
         // Find the apps that supports enrollment for hotword keyhphrases,
         // Pick a privileged app and obtain the information about the supported keyphrases
         // from its metadata.
@@ -134,13 +146,13 @@
         if (ris == null || ris.isEmpty()) {
             // No application capable of enrolling for voice keyphrases is present.
             mParseError = "No enrollment applications found";
-            mKeyphrasePackageMap = Collections.<KeyphraseMetadata, String>emptyMap();
+            mKeyphrasePackageMap = Collections.emptyMap();
             mKeyphrases = null;
             return;
         }
 
-        List<String> parseErrors = new LinkedList<String>();
-        mKeyphrasePackageMap = new HashMap<KeyphraseMetadata, String>();
+        List<String> parseErrors = new LinkedList<>();
+        mKeyphrasePackageMap = new HashMap<>();
         for (ResolveInfo ri : ris) {
             try {
                 ApplicationInfo ai = pm.getApplicationInfo(
@@ -178,7 +190,7 @@
             mKeyphrases = null;
         } else {
             mKeyphrases = mKeyphrasePackageMap.keySet().toArray(
-                    new KeyphraseMetadata[mKeyphrasePackageMap.size()]);
+                    new KeyphraseMetadata[0]);
         }
 
         if (!parseErrors.isEmpty()) {
@@ -269,8 +281,8 @@
         if (!TextUtils.isEmpty(searchKeyphraseSupportedLocales)) {
             try {
                 String[] supportedLocalesDelimited = searchKeyphraseSupportedLocales.split(",");
-                for (int i = 0; i < supportedLocalesDelimited.length; i++) {
-                    locales.add(Locale.forLanguageTag(supportedLocalesDelimited[i]));
+                for (String s : supportedLocalesDelimited) {
+                    locales.add(Locale.forLanguageTag(s));
                 }
             } catch (Exception ex) {
                 // We catch a generic exception here because we don't want the system service
@@ -297,6 +309,7 @@
         return new KeyphraseMetadata(searchKeyphraseId, searchKeyphrase, locales, recognitionModes);
     }
 
+    @NonNull
     public String getParseError() {
         return mParseError;
     }
@@ -305,8 +318,9 @@
      * @return An array of available keyphrases that can be enrolled on the system.
      *         It may be null if no keyphrases can be enrolled.
      */
-    public KeyphraseMetadata[] listKeyphraseMetadata() {
-        return mKeyphrases;
+    @NonNull
+    public Collection<KeyphraseMetadata> listKeyphraseMetadata() {
+        return Arrays.asList(mKeyphrases);
     }
 
     /**
@@ -319,8 +333,11 @@
      * @return An {@link Intent} to manage the keyphrase. This can be null if managing the
      *         given keyphrase/locale combination isn't possible.
      */
-    public Intent getManageKeyphraseIntent(@ManageActions int action, String keyphrase,
-            Locale locale) {
+    @Nullable
+    public Intent getManageKeyphraseIntent(@ManageActions int action, @NonNull String keyphrase,
+            @NonNull Locale locale) {
+        Objects.requireNonNull(keyphrase);
+        Objects.requireNonNull(locale);
         if (mKeyphrasePackageMap == null || mKeyphrasePackageMap.isEmpty()) {
             Slog.w(TAG, "No enrollment application exists");
             return null;
@@ -328,12 +345,11 @@
 
         KeyphraseMetadata keyphraseMetadata = getKeyphraseMetadata(keyphrase, locale);
         if (keyphraseMetadata != null) {
-            Intent intent = new Intent(ACTION_MANAGE_VOICE_KEYPHRASES)
+            return new Intent(ACTION_MANAGE_VOICE_KEYPHRASES)
                     .setPackage(mKeyphrasePackageMap.get(keyphraseMetadata))
                     .putExtra(EXTRA_VOICE_KEYPHRASE_HINT_TEXT, keyphrase)
                     .putExtra(EXTRA_VOICE_KEYPHRASE_LOCALE, locale.toLanguageTag())
                     .putExtra(EXTRA_VOICE_KEYPHRASE_ACTION, action);
-            return intent;
         }
         return null;
     }
@@ -348,7 +364,11 @@
      * @return The metadata, if the enrollment client supports the given keyphrase
      *         and locale, null otherwise.
      */
-    public KeyphraseMetadata getKeyphraseMetadata(String keyphrase, Locale locale) {
+    @Nullable
+    public KeyphraseMetadata getKeyphraseMetadata(@NonNull String keyphrase,
+            @NonNull Locale locale) {
+        Objects.requireNonNull(keyphrase);
+        Objects.requireNonNull(locale);
         if (mKeyphrases != null && mKeyphrases.length > 0) {
           for (KeyphraseMetadata keyphraseMetadata : mKeyphrases) {
               // Check if the given keyphrase is supported in the locale provided by
diff --git a/core/java/android/hardware/soundtrigger/KeyphraseMetadata.java b/core/java/android/hardware/soundtrigger/KeyphraseMetadata.java
index 15462de..aa86368 100644
--- a/core/java/android/hardware/soundtrigger/KeyphraseMetadata.java
+++ b/core/java/android/hardware/soundtrigger/KeyphraseMetadata.java
@@ -18,57 +18,78 @@
 
 import android.annotation.NonNull;
 import android.annotation.Nullable;
+import android.annotation.TestApi;
 import android.os.Parcelable;
 import android.util.ArraySet;
 
 import com.android.internal.util.DataClass;
 
 import java.util.Locale;
+import java.util.Set;
 
 /**
  * A Voice Keyphrase metadata read from the enrollment application.
  *
  * @hide
  */
+@TestApi
 @DataClass(
         genEqualsHashCode = true,
         genToString = true,
         genConstructor = false,
         genHiddenConstDefs = true)
 public final class KeyphraseMetadata implements Parcelable {
-    public final int id;
+    private final int mId;
     @NonNull
-    public final String keyphrase;
+    private final String mKeyphrase;
     @NonNull
-    public final ArraySet<Locale> supportedLocales;
-    public final int recognitionModeFlags;
+    private final ArraySet<Locale> mSupportedLocales;
+    private final int mRecognitionModeFlags;
 
     public KeyphraseMetadata(int id, @NonNull String keyphrase,
-            @NonNull ArraySet<Locale> supportedLocales, int recognitionModeFlags) {
-        this.id = id;
-        this.keyphrase = keyphrase;
-        this.supportedLocales = supportedLocales;
-        this.recognitionModeFlags = recognitionModeFlags;
+            @NonNull Set<Locale> supportedLocales, int recognitionModeFlags) {
+        this.mId = id;
+        this.mKeyphrase = keyphrase;
+        this.mSupportedLocales = new ArraySet<>(supportedLocales);
+        this.mRecognitionModeFlags = recognitionModeFlags;
+    }
+
+    public int getId() {
+        return mId;
+    }
+
+    @NonNull
+    public String getKeyphrase() {
+        return mKeyphrase;
+    }
+
+    @NonNull
+    public Set<Locale> getSupportedLocales() {
+        return mSupportedLocales;
+    }
+
+    public int getRecognitionModeFlags() {
+        return mRecognitionModeFlags;
     }
 
     /**
      * @return Indicates if we support the given phrase.
      */
     public boolean supportsPhrase(@Nullable String phrase) {
-        return keyphrase.isEmpty() || keyphrase.equalsIgnoreCase(phrase);
+        return getKeyphrase().isEmpty() || getKeyphrase().equalsIgnoreCase(phrase);
     }
 
     /**
      * @return Indicates if we support the given locale.
      */
     public boolean supportsLocale(@Nullable Locale locale) {
-        return supportedLocales.isEmpty() || supportedLocales.contains(locale);
+        return getSupportedLocales().isEmpty() || getSupportedLocales().contains(locale);
     }
 
 
 
 
-    // Code below generated by codegen v1.0.14.
+    // Code below generated by codegen v1.0.15.
     //
     // DO NOT MODIFY!
     // CHECKSTYLE:OFF Generated code
@@ -88,10 +109,10 @@
         // String fieldNameToString() { ... }
 
         return "KeyphraseMetadata { " +
-                "id = " + id + ", " +
-                "keyphrase = " + keyphrase + ", " +
-                "supportedLocales = " + supportedLocales + ", " +
-                "recognitionModeFlags = " + recognitionModeFlags +
+                "id = " + mId + ", " +
+                "keyphrase = " + mKeyphrase + ", " +
+                "supportedLocales = " + mSupportedLocales + ", " +
+                "recognitionModeFlags = " + mRecognitionModeFlags +
         " }";
     }
 
@@ -108,10 +129,10 @@
         KeyphraseMetadata that = (KeyphraseMetadata) o;
         //noinspection PointlessBooleanExpression
         return true
-                && id == that.id
-                && java.util.Objects.equals(keyphrase, that.keyphrase)
-                && java.util.Objects.equals(supportedLocales, that.supportedLocales)
-                && recognitionModeFlags == that.recognitionModeFlags;
+                && mId == that.mId
+                && java.util.Objects.equals(mKeyphrase, that.mKeyphrase)
+                && java.util.Objects.equals(mSupportedLocales, that.mSupportedLocales)
+                && mRecognitionModeFlags == that.mRecognitionModeFlags;
     }
 
     @Override
@@ -121,10 +142,10 @@
         // int fieldNameHashCode() { ... }
 
         int _hash = 1;
-        _hash = 31 * _hash + id;
-        _hash = 31 * _hash + java.util.Objects.hashCode(keyphrase);
-        _hash = 31 * _hash + java.util.Objects.hashCode(supportedLocales);
-        _hash = 31 * _hash + recognitionModeFlags;
+        _hash = 31 * _hash + mId;
+        _hash = 31 * _hash + java.util.Objects.hashCode(mKeyphrase);
+        _hash = 31 * _hash + java.util.Objects.hashCode(mSupportedLocales);
+        _hash = 31 * _hash + mRecognitionModeFlags;
         return _hash;
     }
 
@@ -134,10 +155,10 @@
         // You can override field parcelling by defining methods like:
         // void parcelFieldName(Parcel dest, int flags) { ... }
 
-        dest.writeInt(id);
-        dest.writeString(keyphrase);
-        dest.writeArraySet(supportedLocales);
-        dest.writeInt(recognitionModeFlags);
+        dest.writeInt(mId);
+        dest.writeString(mKeyphrase);
+        dest.writeArraySet(mSupportedLocales);
+        dest.writeInt(mRecognitionModeFlags);
     }
 
     @Override
@@ -151,19 +172,19 @@
         // You can override field unparcelling by defining methods like:
         // static FieldType unparcelFieldName(Parcel in) { ... }
 
-        int _id = in.readInt();
-        String _keyphrase = in.readString();
-        ArraySet<Locale> _supportedLocales = (ArraySet) in.readArraySet(null);
-        int _recognitionModeFlags = in.readInt();
+        int id = in.readInt();
+        String keyphrase = in.readString();
+        ArraySet<Locale> supportedLocales = (ArraySet) in.readArraySet(null);
+        int recognitionModeFlags = in.readInt();
 
-        this.id = _id;
-        this.keyphrase = _keyphrase;
+        this.mId = id;
+        this.mKeyphrase = keyphrase;
         com.android.internal.util.AnnotationValidations.validate(
-                NonNull.class, null, keyphrase);
-        this.supportedLocales = _supportedLocales;
+                NonNull.class, null, mKeyphrase);
+        this.mSupportedLocales = supportedLocales;
         com.android.internal.util.AnnotationValidations.validate(
-                NonNull.class, null, supportedLocales);
-        this.recognitionModeFlags = _recognitionModeFlags;
+                NonNull.class, null, mSupportedLocales);
+        this.mRecognitionModeFlags = recognitionModeFlags;
 
         // onConstructed(); // You can define this method to get a callback
     }
@@ -183,10 +204,10 @@
     };
 
     @DataClass.Generated(
-            time = 1579290593964L,
-            codegenVersion = "1.0.14",
+            time = 1586191622057L,
+            codegenVersion = "1.0.15",
             sourceFile = "frameworks/base/core/java/android/hardware/soundtrigger/KeyphraseMetadata.java",
-            inputSignatures = "public final  int id\npublic final @android.annotation.NonNull java.lang.String keyphrase\npublic final @android.annotation.NonNull android.util.ArraySet<java.util.Locale> supportedLocales\npublic final  int recognitionModeFlags\npublic  boolean supportsPhrase(java.lang.String)\npublic  boolean supportsLocale(java.util.Locale)\nclass KeyphraseMetadata extends java.lang.Object implements [android.os.Parcelable]\[email protected](genEqualsHashCode=true, genToString=true, genConstructor=false, genHiddenConstDefs=true)")
+            inputSignatures = "private final  int mId\nprivate final @android.annotation.NonNull java.lang.String mKeyphrase\nprivate final @android.annotation.NonNull android.util.ArraySet<java.util.Locale> mSupportedLocales\nprivate final  int mRecognitionModeFlags\npublic  int getId()\npublic @android.annotation.NonNull java.lang.String getKeyphrase()\npublic @android.annotation.NonNull java.util.Set<java.util.Locale> getSupportedLocales()\npublic  int getRecognitionModeFlags()\npublic  boolean supportsPhrase(java.lang.String)\npublic  boolean supportsLocale(java.util.Locale)\nclass KeyphraseMetadata extends java.lang.Object implements [android.os.Parcelable]\[email protected](genEqualsHashCode=true, genToString=true, genConstructor=false, genHiddenConstDefs=true)")
     @Deprecated
     private void __metadata() {}
 
diff --git a/core/java/android/net/NetworkAgent.java b/core/java/android/net/NetworkAgent.java
index 31d7d08..65e772cb 100644
--- a/core/java/android/net/NetworkAgent.java
+++ b/core/java/android/net/NetworkAgent.java
@@ -25,12 +25,14 @@
 import android.content.Context;
 import android.os.Build;
 import android.os.Bundle;
+import android.os.ConditionVariable;
 import android.os.Handler;
 import android.os.Looper;
 import android.os.Message;
 import android.os.Messenger;
 import android.util.Log;
 
+import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.util.AsyncChannel;
 import com.android.internal.util.Protocol;
 
@@ -572,6 +574,37 @@
     }
 
     /**
+     * Register this network agent with a testing harness.
+     *
+     * The returned Messenger sends messages to the Handler. This allows a test to send
+     * this object {@code CMD_*} messages as if they came from ConnectivityService, which
+     * is useful for testing the behavior.
+     *
+     * @hide
+     */
+    public Messenger registerForTest(final Network network) {
+        log("Registering NetworkAgent for test");
+        synchronized (mRegisterLock) {
+            mNetwork = network;
+            mInitialConfiguration = null;
+        }
+        return new Messenger(mHandler);
+    }
+
+    /**
+     * Waits for the handler to be idle.
+     * This is useful for testing, and has smaller scope than an accessor to mHandler.
+     * TODO : move the implementation in common library with the tests
+     * @hide
+     */
+    @VisibleForTesting
+    public boolean waitForIdle(final long timeoutMs) {
+        final ConditionVariable cv = new ConditionVariable(false);
+        mHandler.post(cv::open);
+        return cv.block(timeoutMs);
+    }
+
+    /**
      * @return The Network associated with this agent, or null if it's not registered yet.
      */
     @Nullable
diff --git a/core/java/android/net/NetworkCapabilities.java b/core/java/android/net/NetworkCapabilities.java
index 73c6b3d..52d6fdf 100644
--- a/core/java/android/net/NetworkCapabilities.java
+++ b/core/java/android/net/NetworkCapabilities.java
@@ -680,11 +680,13 @@
     public void restrictCapabilitesForTestNetwork() {
         final long originalCapabilities = mNetworkCapabilities;
         final NetworkSpecifier originalSpecifier = mNetworkSpecifier;
+        final int originalSignalStrength = mSignalStrength;
         clearAll();
         // Reset the transports to only contain TRANSPORT_TEST.
         mTransportTypes = (1 << TRANSPORT_TEST);
         mNetworkCapabilities = originalCapabilities & TEST_NETWORKS_ALLOWED_CAPABILITIES;
         mNetworkSpecifier = originalSpecifier;
+        mSignalStrength = originalSignalStrength;
     }
 
     /**
diff --git a/core/java/android/net/Uri.java b/core/java/android/net/Uri.java
index 525bbfd..1cb4fe8 100644
--- a/core/java/android/net/Uri.java
+++ b/core/java/android/net/Uri.java
@@ -500,7 +500,7 @@
         }
 
         static Uri readFrom(Parcel parcel) {
-            return new StringUri(parcel.readString());
+            return new StringUri(parcel.readString8());
         }
 
         public int describeContents() {
@@ -509,7 +509,7 @@
 
         public void writeToParcel(Parcel parcel, int flags) {
             parcel.writeInt(TYPE_ID);
-            parcel.writeString(uriString);
+            parcel.writeString8(uriString);
         }
 
         /** Cached scheme separator index. */
@@ -875,7 +875,7 @@
 
         static Uri readFrom(Parcel parcel) {
             return new OpaqueUri(
-                parcel.readString(),
+                parcel.readString8(),
                 Part.readFrom(parcel),
                 Part.readFrom(parcel)
             );
@@ -887,7 +887,7 @@
 
         public void writeToParcel(Parcel parcel, int flags) {
             parcel.writeInt(TYPE_ID);
-            parcel.writeString(scheme);
+            parcel.writeString8(scheme);
             ssp.writeTo(parcel);
             fragment.writeTo(parcel);
         }
@@ -1195,7 +1195,7 @@
 
         static Uri readFrom(Parcel parcel) {
             return new HierarchicalUri(
-                parcel.readString(),
+                parcel.readString8(),
                 Part.readFrom(parcel),
                 PathPart.readFrom(parcel),
                 Part.readFrom(parcel),
@@ -1209,7 +1209,7 @@
 
         public void writeToParcel(Parcel parcel, int flags) {
             parcel.writeInt(TYPE_ID);
-            parcel.writeString(scheme);
+            parcel.writeString8(scheme);
             authority.writeTo(parcel);
             path.writeTo(parcel);
             query.writeTo(parcel);
@@ -2028,7 +2028,7 @@
                     + mCanonicalRepresentation + ")");
             }
             parcel.writeInt(mCanonicalRepresentation);
-            parcel.writeString(canonicalValue);
+            parcel.writeString8(canonicalValue);
         }
     }
 
@@ -2060,7 +2060,7 @@
 
         static Part readFrom(Parcel parcel) {
             int representation = parcel.readInt();
-            String value = parcel.readString();
+            String value = parcel.readString8();
             switch (representation) {
                 case REPRESENTATION_ENCODED:
                     return fromEncoded(value);
@@ -2251,9 +2251,9 @@
             int representation = parcel.readInt();
             switch (representation) {
                 case REPRESENTATION_ENCODED:
-                    return fromEncoded(parcel.readString());
+                    return fromEncoded(parcel.readString8());
                 case REPRESENTATION_DECODED:
-                    return fromDecoded(parcel.readString());
+                    return fromDecoded(parcel.readString8());
                 default:
                     throw new IllegalArgumentException("Unknown representation: " + representation);
             }
diff --git a/core/java/android/net/UrlQuerySanitizer.java b/core/java/android/net/UrlQuerySanitizer.java
index cf08b65..b1cf044 100644
--- a/core/java/android/net/UrlQuerySanitizer.java
+++ b/core/java/android/net/UrlQuerySanitizer.java
@@ -306,7 +306,7 @@
                 return null;
             }
             int length = value.length();
-            if ((mFlags & SCRIPT_URL_OK) != 0) {
+            if ((mFlags & SCRIPT_URL_OK) == 0) {
                 if (length >= MIN_SCRIPT_PREFIX_LENGTH) {
                     String asLower = value.toLowerCase(Locale.ROOT);
                     if (asLower.startsWith(JAVASCRIPT_PREFIX)  ||
diff --git a/core/java/android/os/Environment.java b/core/java/android/os/Environment.java
index 5f8c4f5..c7355dd 100644
--- a/core/java/android/os/Environment.java
+++ b/core/java/android/os/Environment.java
@@ -235,6 +235,7 @@
      * @hide
      */
     @SystemApi
+    @TestApi
     public static @NonNull File getOemDirectory() {
         return DIR_OEM_ROOT;
     }
@@ -246,6 +247,7 @@
      * @hide
      */
     @SystemApi
+    @TestApi
     public static @NonNull File getOdmDirectory() {
         return DIR_ODM_ROOT;
     }
@@ -256,6 +258,7 @@
      * @hide
      */
     @SystemApi
+    @TestApi
     public static @NonNull File getVendorDirectory() {
         return DIR_VENDOR_ROOT;
     }
@@ -294,6 +297,7 @@
      * @hide
      */
     @SystemApi
+    @TestApi
     public static @NonNull File getSystemExtDirectory() {
         return DIR_SYSTEM_EXT_ROOT;
     }
diff --git a/core/java/android/os/Handler.java b/core/java/android/os/Handler.java
index af776d1..24aaa58 100644
--- a/core/java/android/os/Handler.java
+++ b/core/java/android/os/Handler.java
@@ -796,6 +796,17 @@
     }
 
     /**
+     * Remove any pending posts of messages with code 'what' and whose obj is
+     * 'object' that are in the message queue.  If <var>object</var> is null,
+     * all messages will be removed.
+     *
+     *@hide
+     */
+    public final void removeEqualMessages(int what, @Nullable Object object) {
+        mQueue.removeEqualMessages(this, what, object);
+    }
+
+    /**
      * Remove any pending posts of callbacks and sent messages whose
      * <var>obj</var> is <var>token</var>.  If <var>token</var> is null,
      * all callbacks and messages will be removed.
@@ -805,6 +816,16 @@
     }
 
     /**
+     * Remove any pending posts of callbacks and sent messages whose
+     * <var>obj</var> is <var>token</var>.  If <var>token</var> is null,
+     * all callbacks and messages will be removed.
+     *
+     *@hide
+     */
+    public final void removeCallbacksAndEqualMessages(@Nullable Object token) {
+        mQueue.removeCallbacksAndEqualMessages(this, token);
+    }
+    /**
      * Check if there are any pending posts of messages with code 'what' in
      * the message queue.
      */
@@ -829,6 +850,16 @@
     }
 
     /**
+     * Check if there are any pending posts of messages with code 'what' and
+     * whose obj is 'object' in the message queue.
+     *
+     *@hide
+     */
+    public final boolean hasEqualMessages(int what, @Nullable Object object) {
+        return mQueue.hasEqualMessages(this, what, object);
+    }
+
+    /**
      * Check if there are any pending posts of messages with callback r in
      * the message queue.
      */
diff --git a/core/java/android/os/MessageQueue.java b/core/java/android/os/MessageQueue.java
index a72795d..dfa5b26 100644
--- a/core/java/android/os/MessageQueue.java
+++ b/core/java/android/os/MessageQueue.java
@@ -617,6 +617,23 @@
         }
     }
 
+    boolean hasEqualMessages(Handler h, int what, Object object) {
+        if (h == null) {
+            return false;
+        }
+
+        synchronized (this) {
+            Message p = mMessages;
+            while (p != null) {
+                if (p.target == h && p.what == what && (object == null || object.equals(p.obj))) {
+                    return true;
+                }
+                p = p.next;
+            }
+            return false;
+        }
+    }
+
     @UnsupportedAppUsage
     boolean hasMessages(Handler h, Runnable r, Object object) {
         if (h == null) {
@@ -686,6 +703,40 @@
         }
     }
 
+    void removeEqualMessages(Handler h, int what, Object object) {
+        if (h == null) {
+            return;
+        }
+
+        synchronized (this) {
+            Message p = mMessages;
+
+            // Remove all messages at front.
+            while (p != null && p.target == h && p.what == what
+                   && (object == null || object.equals(p.obj))) {
+                Message n = p.next;
+                mMessages = n;
+                p.recycleUnchecked();
+                p = n;
+            }
+
+            // Remove all messages after front.
+            while (p != null) {
+                Message n = p.next;
+                if (n != null) {
+                    if (n.target == h && n.what == what
+                            && (object == null || object.equals(n.obj))) {
+                        Message nn = n.next;
+                        n.recycleUnchecked();
+                        p.next = nn;
+                        continue;
+                    }
+                }
+                p = n;
+            }
+        }
+    }
+
     void removeMessages(Handler h, Runnable r, Object object) {
         if (h == null || r == null) {
             return;
@@ -720,6 +771,41 @@
         }
     }
 
+    void removeEqualMessages(Handler h, Runnable r, Object object) {
+        if (h == null || r == null) {
+            return;
+        }
+
+        synchronized (this) {
+            Message p = mMessages;
+
+            // Remove all messages at front.
+            while (p != null && p.target == h && p.callback == r
+                   && (object == null || object.equals(p.obj))) {
+                Message n = p.next;
+                mMessages = n;
+                p.recycleUnchecked();
+                p = n;
+            }
+
+            // Remove all messages after front.
+            while (p != null) {
+                Message n = p.next;
+                if (n != null) {
+                    if (n.target == h && n.callback == r
+                            && (object == null || object.equals(n.obj))) {
+                        Message nn = n.next;
+                        n.recycleUnchecked();
+                        p.next = nn;
+                        continue;
+                    }
+                }
+                p = n;
+            }
+        }
+    }
+
+
     void removeCallbacksAndMessages(Handler h, Object object) {
         if (h == null) {
             return;
@@ -753,6 +839,39 @@
         }
     }
 
+    void removeCallbacksAndEqualMessages(Handler h, Object object) {
+        if (h == null) {
+            return;
+        }
+
+        synchronized (this) {
+            Message p = mMessages;
+
+            // Remove all messages at front.
+            while (p != null && p.target == h
+                    && (object == null || object.equals(p.obj))) {
+                Message n = p.next;
+                mMessages = n;
+                p.recycleUnchecked();
+                p = n;
+            }
+
+            // Remove all messages after front.
+            while (p != null) {
+                Message n = p.next;
+                if (n != null) {
+                    if (n.target == h && (object == null || object.equals(n.obj))) {
+                        Message nn = n.next;
+                        n.recycleUnchecked();
+                        p.next = nn;
+                        continue;
+                    }
+                }
+                p = n;
+            }
+        }
+    }
+
     private void removeAllMessagesLocked() {
         Message p = mMessages;
         while (p != null) {
diff --git a/core/java/android/os/Parcel.java b/core/java/android/os/Parcel.java
index f0b7b5f..93f6607 100644
--- a/core/java/android/os/Parcel.java
+++ b/core/java/android/os/Parcel.java
@@ -307,7 +307,9 @@
     @FastNative
     private static native void nativeWriteDouble(long nativePtr, double val);
     @FastNative
-    static native void nativeWriteString(long nativePtr, String val);
+    private static native void nativeWriteString8(long nativePtr, String val);
+    @FastNative
+    private static native void nativeWriteString16(long nativePtr, String val);
     @FastNative
     private static native void nativeWriteStrongBinder(long nativePtr, IBinder val);
     @FastNative
@@ -325,7 +327,9 @@
     @CriticalNative
     private static native double nativeReadDouble(long nativePtr);
     @FastNative
-    static native String nativeReadString(long nativePtr);
+    private static native String nativeReadString8(long nativePtr);
+    @FastNative
+    private static native String nativeReadString16(long nativePtr);
     @FastNative
     private static native IBinder nativeReadStrongBinder(long nativePtr);
     @FastNative
@@ -386,8 +390,12 @@
          * must use {@link #writeStringNoHelper(String)} to avoid
          * infinity recursive calls.
          */
-        public void writeString(Parcel p, String s) {
-            nativeWriteString(p.mNativePtr, s);
+        public void writeString8(Parcel p, String s) {
+            p.writeString8NoHelper(s);
+        }
+
+        public void writeString16(Parcel p, String s) {
+            p.writeString16NoHelper(s);
         }
 
         /**
@@ -395,8 +403,12 @@
          * must use {@link #readStringNoHelper()} to avoid
          * infinity recursive calls.
          */
-        public String readString(Parcel p) {
-            return nativeReadString(p.mNativePtr);
+        public String readString8(Parcel p) {
+            return p.readString8NoHelper();
+        }
+
+        public String readString16(Parcel p) {
+            return p.readString16NoHelper();
         }
     }
 
@@ -759,7 +771,17 @@
      * growing dataCapacity() if needed.
      */
     public final void writeString(@Nullable String val) {
-        mReadWriteHelper.writeString(this, val);
+        writeString16(val);
+    }
+
+    /** {@hide} */
+    public final void writeString8(@Nullable String val) {
+        mReadWriteHelper.writeString8(this, val);
+    }
+
+    /** {@hide} */
+    public final void writeString16(@Nullable String val) {
+        mReadWriteHelper.writeString16(this, val);
     }
 
     /**
@@ -770,7 +792,17 @@
      * @hide
      */
     public void writeStringNoHelper(@Nullable String val) {
-        nativeWriteString(mNativePtr, val);
+        writeString16NoHelper(val);
+    }
+
+    /** {@hide} */
+    public void writeString8NoHelper(@Nullable String val) {
+        nativeWriteString8(mNativePtr, val);
+    }
+
+    /** {@hide} */
+    public void writeString16NoHelper(@Nullable String val) {
+        nativeWriteString16(mNativePtr, val);
     }
 
     /**
@@ -2337,7 +2369,17 @@
      */
     @Nullable
     public final String readString() {
-        return mReadWriteHelper.readString(this);
+        return readString16();
+    }
+
+    /** {@hide} */
+    public final @Nullable String readString8() {
+        return mReadWriteHelper.readString8(this);
+    }
+
+    /** {@hide} */
+    public final @Nullable String readString16() {
+        return mReadWriteHelper.readString16(this);
     }
 
     /**
@@ -2347,9 +2389,18 @@
      *
      * @hide
      */
-    @Nullable
-    public String readStringNoHelper() {
-        return nativeReadString(mNativePtr);
+    public @Nullable String readStringNoHelper() {
+        return readString16NoHelper();
+    }
+
+    /** {@hide} */
+    public @Nullable String readString8NoHelper() {
+        return nativeReadString8(mNativePtr);
+    }
+
+    /** {@hide} */
+    public @Nullable String readString16NoHelper() {
+        return nativeReadString16(mNativePtr);
     }
 
     /**
diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java
index 0f2060a..187274a 100644
--- a/core/java/android/os/UserManager.java
+++ b/core/java/android/os/UserManager.java
@@ -57,6 +57,7 @@
 
 import com.android.internal.R;
 import com.android.internal.os.RoSystemProperties;
+import com.android.internal.util.FrameworkStatsLog;
 
 import java.io.IOException;
 import java.lang.annotation.Retention;
@@ -1841,6 +1842,35 @@
     }
 
     /**
+     * Returns the enum defined in the statsd UserLifecycleJourneyReported atom corresponding to the
+     * user type.
+     * @hide
+     */
+    public static int getUserTypeForStatsd(@NonNull String userType) {
+        switch (userType) {
+            case USER_TYPE_FULL_SYSTEM:
+                return FrameworkStatsLog.USER_LIFECYCLE_JOURNEY_REPORTED__USER_TYPE__FULL_SYSTEM;
+            case USER_TYPE_FULL_SECONDARY:
+                return FrameworkStatsLog.USER_LIFECYCLE_JOURNEY_REPORTED__USER_TYPE__FULL_SECONDARY;
+            case USER_TYPE_FULL_GUEST:
+                return FrameworkStatsLog.USER_LIFECYCLE_JOURNEY_REPORTED__USER_TYPE__FULL_GUEST;
+            case USER_TYPE_FULL_DEMO:
+                return FrameworkStatsLog.USER_LIFECYCLE_JOURNEY_REPORTED__USER_TYPE__FULL_DEMO;
+            case USER_TYPE_FULL_RESTRICTED:
+                return FrameworkStatsLog
+                        .USER_LIFECYCLE_JOURNEY_REPORTED__USER_TYPE__FULL_RESTRICTED;
+            case USER_TYPE_PROFILE_MANAGED:
+                return FrameworkStatsLog
+                        .USER_LIFECYCLE_JOURNEY_REPORTED__USER_TYPE__PROFILE_MANAGED;
+            case USER_TYPE_SYSTEM_HEADLESS:
+                return FrameworkStatsLog
+                        .USER_LIFECYCLE_JOURNEY_REPORTED__USER_TYPE__SYSTEM_HEADLESS;
+            default:
+                return FrameworkStatsLog.USER_LIFECYCLE_JOURNEY_REPORTED__USER_TYPE__TYPE_UNKNOWN;
+        }
+    }
+
+    /**
      * @hide
      * @deprecated Use {@link #isRestrictedProfile()}
      */
diff --git a/core/java/android/os/VibrationEffect.java b/core/java/android/os/VibrationEffect.java
index ca86157..1fef071 100644
--- a/core/java/android/os/VibrationEffect.java
+++ b/core/java/android/os/VibrationEffect.java
@@ -897,6 +897,34 @@
             return -1;
         }
 
+        /**
+         * Scale all primitives of this effect.
+         *
+         * @param gamma the gamma adjustment to apply
+         * @param maxAmplitude the new maximum amplitude of the effect, must be between 0 and
+         *         MAX_AMPLITUDE
+         * @throws IllegalArgumentException if maxAmplitude less than 0 or more than MAX_AMPLITUDE
+         *
+         * @return A {@link Composed} effect with same but scaled primitives.
+         */
+        public Composed scale(float gamma, int maxAmplitude) {
+            if (maxAmplitude > MAX_AMPLITUDE || maxAmplitude < 0) {
+                throw new IllegalArgumentException(
+                        "Amplitude is negative or greater than MAX_AMPLITUDE");
+            }
+            if (gamma == 1.0f && maxAmplitude == MAX_AMPLITUDE) {
+                // Just return a copy of the original if there's no scaling to be done.
+                return new Composed(mPrimitiveEffects);
+            }
+            List<Composition.PrimitiveEffect> scaledPrimitives = new ArrayList<>();
+            for (Composition.PrimitiveEffect primitive : mPrimitiveEffects) {
+                float adjustedScale = MathUtils.pow(primitive.scale, gamma);
+                float newScale = adjustedScale * maxAmplitude / (float) MAX_AMPLITUDE;
+                scaledPrimitives.add(new Composition.PrimitiveEffect(
+                        primitive.id, newScale, primitive.delay));
+            }
+            return new Composed(scaledPrimitives);
+        }
 
         /**
          * @hide
diff --git a/core/java/android/os/incremental/IncrementalFileStorages.java b/core/java/android/os/incremental/IncrementalFileStorages.java
index 251995a..321dc9e 100644
--- a/core/java/android/os/incremental/IncrementalFileStorages.java
+++ b/core/java/android/os/incremental/IncrementalFileStorages.java
@@ -38,16 +38,10 @@
 import android.content.pm.IDataLoaderStatusListener;
 import android.content.pm.InstallationFileParcel;
 import android.text.TextUtils;
-import android.util.Slog;
 
 import java.io.File;
 import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
 import java.util.List;
-import java.util.Objects;
-import java.util.Random;
 
 /**
  * This class manages storage instances used during a package installation session.
@@ -56,13 +50,9 @@
 public final class IncrementalFileStorages {
     private static final String TAG = "IncrementalFileStorages";
 
-    private static final String TMP_DIR_ROOT = "/data/incremental/tmp";
-    private static final Random TMP_DIR_RANDOM = new Random();
-
+    private @NonNull final IncrementalManager mIncrementalManager;
+    private @NonNull final File mStageDir;
     private @Nullable IncrementalStorage mDefaultStorage;
-    private @Nullable String mDefaultDir;
-    private @NonNull IncrementalManager mIncrementalManager;
-    private @NonNull File mStageDir;
 
     /**
      * Set up files and directories used in an installation session. Only used by Incremental.
@@ -85,72 +75,63 @@
             throw new IOException("Failed to obtain incrementalManager.");
         }
 
-        IncrementalFileStorages result = null;
-        try {
-            result = new IncrementalFileStorages(stageDir, incrementalManager, dataLoaderParams,
-                    dataLoaderStatusListener);
-
-            if (!addedFiles.isEmpty()) {
-                result.mDefaultStorage.bind(stageDir.getAbsolutePath());
-            }
-
-            for (InstallationFileParcel file : addedFiles) {
-                if (file.location == LOCATION_DATA_APP) {
-                    try {
-                        result.addApkFile(file);
-                    } catch (IOException e) {
-                        // TODO(b/146080380): add incremental-specific error code
-                        throw new IOException(
-                                "Failed to add file to IncFS: " + file.name + ", reason: ", e);
-                    }
-                } else {
-                    throw new IOException("Unknown file location: " + file.location);
+        final IncrementalFileStorages result =
+                new IncrementalFileStorages(stageDir, incrementalManager, dataLoaderParams,
+                                            dataLoaderStatusListener);
+        for (InstallationFileParcel file : addedFiles) {
+            if (file.location == LOCATION_DATA_APP) {
+                try {
+                    result.addApkFile(file);
+                } catch (IOException e) {
+                    // TODO(b/146080380): add incremental-specific error code
+                    throw new IOException(
+                            "Failed to add file to IncFS: " + file.name + ", reason: ", e);
                 }
+            } else {
+                throw new IOException("Unknown file location: " + file.location);
             }
-
-            // TODO(b/146080380): remove 5 secs wait in startLoading
-            if (!result.mDefaultStorage.startLoading()) {
-                // TODO(b/146080380): add incremental-specific error code
-                throw new IOException("Failed to start loading data for Incremental installation.");
-            }
-
-            return result;
-        } catch (IOException e) {
-            Slog.e(TAG, "Failed to initialize Incremental file storages. Cleaning up...", e);
-            if (result != null) {
-                result.cleanUp();
-            }
-            throw e;
         }
+
+        if (!result.mDefaultStorage.startLoading()) {
+            // TODO(b/146080380): add incremental-specific error code
+            throw new IOException("Failed to start loading data for Incremental installation.");
+        }
+
+        return result;
     }
 
     private IncrementalFileStorages(@NonNull File stageDir,
             @NonNull IncrementalManager incrementalManager,
             @NonNull DataLoaderParams dataLoaderParams,
             @Nullable IDataLoaderStatusListener dataLoaderStatusListener) throws IOException {
-        mStageDir = stageDir;
-        mIncrementalManager = incrementalManager;
-        if (dataLoaderParams.getComponentName().getPackageName().equals("local")) {
-            final String incrementalPath = dataLoaderParams.getArguments();
-            mDefaultDir = incrementalPath;
-            if (TextUtils.isEmpty(mDefaultDir)) {
-                throw new IOException("Failed to create storage: incrementalPath is empty");
+        try {
+            mStageDir = stageDir;
+            mIncrementalManager = incrementalManager;
+            if (dataLoaderParams.getComponentName().getPackageName().equals("local")) {
+                final String incrementalPath = dataLoaderParams.getArguments();
+                if (TextUtils.isEmpty(incrementalPath)) {
+                    throw new IOException("Failed to create storage: incrementalPath is empty");
+                }
+                mDefaultStorage = mIncrementalManager.openStorage(incrementalPath);
+                if (mDefaultStorage == null) {
+                    throw new IOException(
+                            "Couldn't open incremental storage at " + incrementalPath);
+                }
+                mDefaultStorage.bind(stageDir.getAbsolutePath());
+            } else {
+                mDefaultStorage = mIncrementalManager.createStorage(stageDir.getAbsolutePath(),
+                        dataLoaderParams,
+                        dataLoaderStatusListener,
+                        IncrementalManager.CREATE_MODE_CREATE
+                                | IncrementalManager.CREATE_MODE_TEMPORARY_BIND, false);
+                if (mDefaultStorage == null) {
+                    throw new IOException(
+                            "Couldn't create incremental storage at " + stageDir);
+                }
             }
-            mDefaultStorage = mIncrementalManager.openStorage(incrementalPath);
-        } else {
-            mDefaultDir = getTempDir();
-            if (mDefaultDir == null) {
-                throw new IOException("Failed to create storage: tempDir is empty");
-            }
-            mDefaultStorage = mIncrementalManager.createStorage(mDefaultDir,
-                    dataLoaderParams,
-                    dataLoaderStatusListener,
-                    IncrementalManager.CREATE_MODE_CREATE
-                            | IncrementalManager.CREATE_MODE_TEMPORARY_BIND, false);
-        }
-
-        if (mDefaultStorage == null) {
-            throw new IOException("Failed to create storage");
+        } catch (IOException e) {
+            cleanUp();
+            throw e;
         }
     }
 
@@ -167,27 +148,14 @@
      * TODO(b/136132412): make sure unnecessary binds are removed but useful storages are kept
      */
     public void cleanUp() {
-        Objects.requireNonNull(mDefaultStorage);
+        if (mDefaultStorage == null) {
+            return;
+        }
 
         try {
-            mDefaultStorage.unBind(mDefaultDir);
             mDefaultStorage.unBind(mStageDir.getAbsolutePath());
         } catch (IOException ignored) {
         }
-
-        mDefaultDir = null;
         mDefaultStorage = null;
     }
-
-    private static String getTempDir() {
-        final Path tmpDir = Paths.get(TMP_DIR_ROOT,
-                String.valueOf(TMP_DIR_RANDOM.nextInt(Integer.MAX_VALUE - 1)));
-        try {
-            Files.createDirectories(tmpDir);
-        } catch (Exception ex) {
-            Slog.e(TAG, "Failed to create dir", ex);
-            return null;
-        }
-        return tmpDir.toAbsolutePath().toString();
-    }
 }
diff --git a/core/java/android/os/incremental/IncrementalManager.java b/core/java/android/os/incremental/IncrementalManager.java
index 35518db..916edfa 100644
--- a/core/java/android/os/incremental/IncrementalManager.java
+++ b/core/java/android/os/incremental/IncrementalManager.java
@@ -32,8 +32,12 @@
 import java.io.IOException;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
+import java.nio.file.FileVisitResult;
+import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
+import java.nio.file.SimpleFileVisitor;
+import java.nio.file.attribute.BasicFileAttributes;
 
 /**
  * Provides operations to open or create an IncrementalStorage, using IIncrementalService
@@ -176,25 +180,6 @@
     }
 
     /**
-     * Iterates through path parents to find the base dir of an Incremental Storage.
-     *
-     * @param file Target file to search storage for.
-     * @return Absolute path which is a bind-mount point of Incremental File System.
-     */
-    @Nullable
-    private Path getStoragePathForFile(File file) {
-        File currentPath = new File(file.getParent());
-        while (currentPath.getParent() != null) {
-            IncrementalStorage storage = openStorage(currentPath.getAbsolutePath());
-            if (storage != null) {
-                return currentPath.toPath();
-            }
-            currentPath = new File(currentPath.getParent());
-        }
-        return null;
-    }
-
-    /**
      * Set up an app's code path. The expected outcome of this method is:
      * 1) The actual apk directory under /data/incremental is bind-mounted to the parent directory
      * of {@code afterCodeFile}.
@@ -212,29 +197,27 @@
      */
     public void renameCodePath(File beforeCodeFile, File afterCodeFile)
             throws IllegalArgumentException, IOException {
-        final String beforeCodePath = beforeCodeFile.getAbsolutePath();
-        final String afterCodePathParent = afterCodeFile.getParentFile().getAbsolutePath();
-        if (!isIncrementalPath(beforeCodePath)) {
-            throw new IllegalArgumentException("Not an Incremental path: " + beforeCodePath);
-        }
-        final String afterCodePathName = afterCodeFile.getName();
-        final Path apkStoragePath = Paths.get(beforeCodePath);
-        if (apkStoragePath == null || apkStoragePath.toAbsolutePath() == null) {
-            throw new IOException("Invalid source storage path for: " + beforeCodePath);
-        }
-        final IncrementalStorage apkStorage =
-                openStorage(apkStoragePath.toAbsolutePath().toString());
+        final File beforeCodeAbsolute = beforeCodeFile.getAbsoluteFile();
+        final IncrementalStorage apkStorage = openStorage(beforeCodeAbsolute.toString());
         if (apkStorage == null) {
-            throw new IOException("Failed to retrieve storage from Incremental Service.");
+            throw new IllegalArgumentException("Not an Incremental path: " + beforeCodeAbsolute);
         }
-        final IncrementalStorage linkedApkStorage = createStorage(afterCodePathParent, apkStorage,
-                IncrementalManager.CREATE_MODE_CREATE
-                        | IncrementalManager.CREATE_MODE_PERMANENT_BIND);
+        final String targetStorageDir = afterCodeFile.getAbsoluteFile().getParent();
+        final IncrementalStorage linkedApkStorage =
+                createStorage(targetStorageDir, apkStorage,
+                        IncrementalManager.CREATE_MODE_CREATE
+                                | IncrementalManager.CREATE_MODE_PERMANENT_BIND);
         if (linkedApkStorage == null) {
-            throw new IOException("Failed to create linked storage at dir: " + afterCodePathParent);
+            throw new IOException("Failed to create linked storage at dir: " + targetStorageDir);
         }
-        linkFiles(apkStorage, beforeCodeFile, "", linkedApkStorage, afterCodePathName);
-        apkStorage.unBind(beforeCodePath);
+        try {
+            final String afterCodePathName = afterCodeFile.getName();
+            linkFiles(apkStorage, beforeCodeAbsolute, "", linkedApkStorage, afterCodePathName);
+            apkStorage.unBind(beforeCodeAbsolute.toString());
+        } catch (Exception e) {
+            linkedApkStorage.unBind(targetStorageDir);
+            throw e;
+        }
     }
 
     /**
@@ -252,22 +235,27 @@
     private void linkFiles(IncrementalStorage sourceStorage, File sourceAbsolutePath,
             String sourceRelativePath, IncrementalStorage targetStorage,
             String targetRelativePath) throws IOException {
-        targetStorage.makeDirectory(targetRelativePath);
-        final File[] entryList = sourceAbsolutePath.listFiles();
-        for (int i = 0; i < entryList.length; i++) {
-            final File entry = entryList[i];
-            final String entryName = entryList[i].getName();
-            final String sourceEntryRelativePath =
-                    sourceRelativePath.isEmpty() ? entryName : sourceRelativePath + "/" + entryName;
-            final String targetEntryRelativePath = targetRelativePath + "/" + entryName;
-            if (entry.isFile()) {
-                sourceStorage.makeLink(
-                        sourceEntryRelativePath, targetStorage, targetEntryRelativePath);
-            } else if (entry.isDirectory()) {
-                linkFiles(sourceStorage, entry, sourceEntryRelativePath, targetStorage,
-                        targetEntryRelativePath);
+        final Path sourceBase = sourceAbsolutePath.toPath().resolve(sourceRelativePath);
+        final Path targetRelative = Paths.get(targetRelativePath);
+        Files.walkFileTree(sourceAbsolutePath.toPath(), new SimpleFileVisitor<Path>() {
+            @Override
+            public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs)
+                    throws IOException {
+                final Path relativeDir = sourceBase.relativize(dir);
+                targetStorage.makeDirectory(targetRelative.resolve(relativeDir).toString());
+                return FileVisitResult.CONTINUE;
             }
-        }
+
+            @Override
+            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
+                    throws IOException {
+                final Path relativeFile = sourceBase.relativize(file);
+                sourceStorage.makeLink(
+                        file.toAbsolutePath().toString(), targetStorage,
+                        targetRelative.resolve(relativeFile).toString());
+                return FileVisitResult.CONTINUE;
+            }
+        });
     }
 
     /**
diff --git a/core/java/android/os/incremental/V4Signature.java b/core/java/android/os/incremental/V4Signature.java
index 5cc73ca..d35ce5b 100644
--- a/core/java/android/os/incremental/V4Signature.java
+++ b/core/java/android/os/incremental/V4Signature.java
@@ -16,6 +16,8 @@
 
 package android.os.incremental;
 
+import android.annotation.NonNull;
+import android.annotation.Nullable;
 import android.os.ParcelFileDescriptor;
 
 import java.io.ByteArrayInputStream;
@@ -45,8 +47,8 @@
     public static class HashingInfo {
         public final int hashAlgorithm; // only 1 == SHA256 supported
         public final byte log2BlockSize; // only 12 (block size 4096) supported now
-        public final byte[] salt; // used exactly as in fs-verity, 32 bytes max
-        public final byte[] rawRootHash; // salted digest of the first Merkle tree page
+        @Nullable public final byte[] salt; // used exactly as in fs-verity, 32 bytes max
+        @Nullable public final byte[] rawRootHash; // salted digest of the first Merkle tree page
 
         HashingInfo(int hashAlgorithm, byte log2BlockSize, byte[] salt, byte[] rawRootHash) {
             this.hashAlgorithm = hashAlgorithm;
@@ -58,7 +60,8 @@
         /**
          * Constructs HashingInfo from byte array.
          */
-        public static HashingInfo fromByteArray(byte[] bytes) throws IOException {
+        @NonNull
+        public static HashingInfo fromByteArray(@NonNull byte[] bytes) throws IOException {
             ByteBuffer buffer = ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN);
             final int hashAlgorithm = buffer.getInt();
             final byte log2BlockSize = buffer.get();
@@ -106,8 +109,18 @@
     }
 
     public final int version; // Always 2 for now.
-    public final byte[] hashingInfo;
-    public final byte[] signingInfo; // Passed as-is to the kernel. Can be retrieved later.
+    /**
+     * Raw byte array containing the IncFS hashing data.
+     * @see HashingInfo#fromByteArray(byte[])
+     */
+    @Nullable public final byte[] hashingInfo;
+
+    /**
+     * Raw byte array containing the V4 signature data.
+     * <p>Passed as-is to the kernel. Can be retrieved later.
+     * @see SigningInfo#fromByteArray(byte[])
+     */
+    @Nullable public final byte[] signingInfo;
 
     /**
      * Construct a V4Signature from .idsig file.
@@ -121,7 +134,8 @@
     /**
      * Construct a V4Signature from a byte array.
      */
-    public static V4Signature readFrom(byte[] bytes) throws IOException {
+    @NonNull
+    public static V4Signature readFrom(@NonNull byte[] bytes) throws IOException {
         try (InputStream stream = new ByteArrayInputStream(bytes)) {
             return readFrom(stream);
         }
@@ -169,7 +183,7 @@
         return this.version == SUPPORTED_VERSION;
     }
 
-    private V4Signature(int version, byte[] hashingInfo, byte[] signingInfo) {
+    private V4Signature(int version, @Nullable byte[] hashingInfo, @Nullable byte[] signingInfo) {
         this.version = version;
         this.hashingInfo = hashingInfo;
         this.signingInfo = signingInfo;
diff --git a/core/java/android/os/storage/StorageManager.java b/core/java/android/os/storage/StorageManager.java
index aee32ed..a1a11ed 100644
--- a/core/java/android/os/storage/StorageManager.java
+++ b/core/java/android/os/storage/StorageManager.java
@@ -2447,7 +2447,12 @@
         final String filePath = path.getCanonicalPath();
         final StorageVolume volume = getStorageVolume(path);
         if (volume == null) {
-            throw new IllegalStateException("Failed to update quota type for " + filePath);
+            Log.w(TAG, "Failed to update quota type for " + filePath);
+            return;
+        }
+        if (!volume.isEmulated()) {
+            // We only support quota tracking on emulated filesystems
+            return;
         }
 
         final int userId = volume.getOwner().getIdentifier();
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
old mode 100644
new mode 100755
index 5418833..ac1998a
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -4748,6 +4748,14 @@
         public static final String SHOW_BATTERY_PERCENT = "status_bar_show_battery_percent";
 
         /**
+         * Whether or not to enable multiple audio focus.
+         * When enabled, requires more management by user over application playback activity,
+         * for instance pausing media apps when another starts.
+         * @hide
+         */
+        public static final String MULTI_AUDIO_FOCUS_ENABLED = "multi_audio_focus_enabled";
+
+        /**
          * IMPORTANT: If you add a new public settings you also have to add it to
          * PUBLIC_SETTINGS below. If the new setting is hidden you have to add
          * it to PRIVATE_SETTINGS below. Also add a validator that can validate
@@ -8599,6 +8607,16 @@
         public static final String CONTROLS_ENABLED = "controls_enabled";
 
         /**
+         * Whether power menu content (cards, passes, controls) will be shown when device is locked.
+         *
+         * 0 indicates hide and 1 indicates show. A non existent value will be treated as hide.
+         * @hide
+         */
+        @TestApi
+        public static final String POWER_MENU_LOCKED_SHOW_CONTENT =
+                "power_menu_locked_show_content";
+
+        /**
          * Specifies whether the web action API is enabled.
          *
          * @hide
diff --git a/core/java/android/service/autofill/InlinePresentation.java b/core/java/android/service/autofill/InlinePresentation.java
index 63b3804..9cf1b87 100644
--- a/core/java/android/service/autofill/InlinePresentation.java
+++ b/core/java/android/service/autofill/InlinePresentation.java
@@ -19,7 +19,6 @@
 import android.annotation.NonNull;
 import android.annotation.Size;
 import android.app.slice.Slice;
-import android.compat.annotation.UnsupportedAppUsage;
 import android.os.Parcel;
 import android.os.Parcelable;
 import android.widget.inline.InlinePresentationSpec;
@@ -67,18 +66,6 @@
         return hints.toArray(new String[hints.size()]);
     }
 
-    /**
-     * @hide
-     * @removed
-     */
-    @UnsupportedAppUsage
-    public InlinePresentation(
-            @NonNull Slice slice,
-            @NonNull android.view.inline.InlinePresentationSpec inlinePresentationSpec,
-            boolean pinned) {
-        this(slice, inlinePresentationSpec.toWidget(), pinned);
-    }
-
 
 
     // Code below generated by codegen v1.0.15.
@@ -245,7 +232,7 @@
     };
 
     @DataClass.Generated(
-            time = 1585633564226L,
+            time = 1586992400667L,
             codegenVersion = "1.0.15",
             sourceFile = "frameworks/base/core/java/android/service/autofill/InlinePresentation.java",
             inputSignatures = "private final @android.annotation.NonNull android.app.slice.Slice mSlice\nprivate final @android.annotation.NonNull android.widget.inline.InlinePresentationSpec mInlinePresentationSpec\nprivate final  boolean mPinned\npublic @android.annotation.NonNull @android.annotation.Size(min=0L) java.lang.String[] getAutofillHints()\nclass InlinePresentation extends java.lang.Object implements [android.os.Parcelable]\[email protected](genToString=true, genHiddenConstDefs=true, genEqualsHashCode=true)")
diff --git a/core/java/android/service/autofill/augmented/AugmentedAutofillService.java b/core/java/android/service/autofill/augmented/AugmentedAutofillService.java
index 1efa3dd..b47b2b4 100644
--- a/core/java/android/service/autofill/augmented/AugmentedAutofillService.java
+++ b/core/java/android/service/autofill/augmented/AugmentedAutofillService.java
@@ -31,6 +31,7 @@
 import android.content.Intent;
 import android.graphics.Rect;
 import android.os.Build;
+import android.os.Bundle;
 import android.os.CancellationSignal;
 import android.os.Handler;
 import android.os.IBinder;
@@ -558,9 +559,10 @@
             }
         }
 
-        void reportResult(@Nullable List<Dataset> inlineSuggestionsData) {
+        void reportResult(@Nullable List<Dataset> inlineSuggestionsData,
+                @Nullable Bundle clientState) {
             try {
-                mCallback.onSuccess(inlineSuggestionsData);
+                mCallback.onSuccess(inlineSuggestionsData, clientState);
             } catch (RemoteException e) {
                 Log.e(TAG, "Error calling back with the inline suggestions data: " + e);
             }
diff --git a/core/java/android/service/autofill/augmented/FillCallback.java b/core/java/android/service/autofill/augmented/FillCallback.java
index 526a749..21738d80 100644
--- a/core/java/android/service/autofill/augmented/FillCallback.java
+++ b/core/java/android/service/autofill/augmented/FillCallback.java
@@ -21,6 +21,7 @@
 import android.annotation.Nullable;
 import android.annotation.SystemApi;
 import android.annotation.TestApi;
+import android.os.Bundle;
 import android.service.autofill.Dataset;
 import android.service.autofill.augmented.AugmentedAutofillService.AutofillProxy;
 import android.util.Log;
@@ -55,14 +56,15 @@
 
         if (response == null) {
             mProxy.logEvent(AutofillProxy.REPORT_EVENT_NO_RESPONSE);
-            mProxy.reportResult(/* inlineSuggestionsData */ null);
+            mProxy.reportResult(/* inlineSuggestionsData */ null, /* clientState */ null);
             return;
         }
 
         List<Dataset> inlineSuggestions = response.getInlineSuggestions();
+        Bundle clientState = response.getClientState();
         if (inlineSuggestions != null && !inlineSuggestions.isEmpty()) {
             mProxy.logEvent(AutofillProxy.REPORT_EVENT_INLINE_RESPONSE);
-            mProxy.reportResult(inlineSuggestions);
+            mProxy.reportResult(inlineSuggestions, clientState);
             return;
         }
 
diff --git a/core/java/android/service/autofill/augmented/IFillCallback.aidl b/core/java/android/service/autofill/augmented/IFillCallback.aidl
index 24af1e5..609e382 100644
--- a/core/java/android/service/autofill/augmented/IFillCallback.aidl
+++ b/core/java/android/service/autofill/augmented/IFillCallback.aidl
@@ -30,7 +30,7 @@
  */
 interface IFillCallback {
     void onCancellable(in ICancellationSignal cancellation);
-    void onSuccess(in @nullable List<Dataset> inlineSuggestionsData);
+    void onSuccess(in @nullable List<Dataset> inlineSuggestionsData, in @nullable Bundle clientState);
     boolean isCompleted();
     void cancel();
 }
diff --git a/core/java/android/service/dataloader/DataLoaderService.java b/core/java/android/service/dataloader/DataLoaderService.java
index 60373ac..e35b8b7 100644
--- a/core/java/android/service/dataloader/DataLoaderService.java
+++ b/core/java/android/service/dataloader/DataLoaderService.java
@@ -109,9 +109,7 @@
                 @NonNull IDataLoaderStatusListener listener)
                 throws RuntimeException {
             try {
-                if (!nativeCreateDataLoader(id, control, params, listener)) {
-                    Slog.e(TAG, "Failed to create native loader for " + id);
-                }
+                nativeCreateDataLoader(id, control, params, listener);
             } catch (Exception ex) {
                 Slog.e(TAG, "Failed to create native loader for " + id, ex);
                 destroy(id);
diff --git a/core/java/android/service/dreams/DreamService.java b/core/java/android/service/dreams/DreamService.java
index 0db9771..337027e 100644
--- a/core/java/android/service/dreams/DreamService.java
+++ b/core/java/android/service/dreams/DreamService.java
@@ -182,7 +182,6 @@
     private Window mWindow;
     private Activity mActivity;
     private boolean mInteractive;
-    private boolean mLowProfile = true;
     private boolean mFullscreen;
     private boolean mScreenBright = true;
     private boolean mStarted;
@@ -530,32 +529,6 @@
     }
 
     /**
-     * Sets View.SYSTEM_UI_FLAG_LOW_PROFILE on the content view.
-     *
-     * @param lowProfile True to set View.SYSTEM_UI_FLAG_LOW_PROFILE
-     * @hide There is no reason to have this -- dreams can set this flag
-     * on their own content view, and from there can actually do the
-     * correct interactions with it (seeing when it is cleared etc).
-     */
-    public void setLowProfile(boolean lowProfile) {
-        if (mLowProfile != lowProfile) {
-            mLowProfile = lowProfile;
-            int flag = View.SYSTEM_UI_FLAG_LOW_PROFILE;
-            applySystemUiVisibilityFlags(mLowProfile ? flag : 0, flag);
-        }
-    }
-
-    /**
-     * Returns whether or not this dream is in low profile mode. Defaults to true.
-     *
-     * @see #setLowProfile(boolean)
-     * @hide
-     */
-    public boolean isLowProfile() {
-        return getSystemUiVisibilityFlagValue(View.SYSTEM_UI_FLAG_LOW_PROFILE, mLowProfile);
-    }
-
-    /**
      * Controls {@link android.view.WindowManager.LayoutParams#FLAG_FULLSCREEN}
      * on the dream's window.
      *
@@ -900,10 +873,11 @@
     public final void finish() {
         if (mDebug) Slog.v(TAG, "finish(): mFinished=" + mFinished);
 
-        if (mActivity != null) {
-            if (!mActivity.isFinishing()) {
+        Activity activity = mActivity;
+        if (activity != null) {
+            if (!activity.isFinishing()) {
                 // In case the activity is not finished yet, do it now.
-                mActivity.finishAndRemoveTask();
+                activity.finishAndRemoveTask();
             }
             return;
         }
@@ -1093,10 +1067,6 @@
         // along well. Dreams usually don't need such bars anyways, so disable them by default.
         mWindow.clearFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
 
-        applySystemUiVisibilityFlags(
-                (mLowProfile ? View.SYSTEM_UI_FLAG_LOW_PROFILE : 0),
-                View.SYSTEM_UI_FLAG_LOW_PROFILE);
-
         mWindow.getDecorView().addOnAttachStateChangeListener(
                 new View.OnAttachStateChangeListener() {
                     @Override
@@ -1106,6 +1076,7 @@
 
                     @Override
                     public void onViewDetachedFromWindow(View v) {
+                        mActivity = null;
                         finish();
                     }
                 });
@@ -1124,18 +1095,6 @@
         }
     }
 
-    private boolean getSystemUiVisibilityFlagValue(int flag, boolean defaultValue) {
-        View v = mWindow == null ? null : mWindow.getDecorView();
-        return v == null ? defaultValue : (v.getSystemUiVisibility() & flag) != 0;
-    }
-
-    private void applySystemUiVisibilityFlags(int flags, int mask) {
-        View v = mWindow == null ? null : mWindow.getDecorView();
-        if (v != null) {
-            v.setSystemUiVisibility(applyFlags(v.getSystemUiVisibility(), flags, mask));
-        }
-    }
-
     private int applyFlags(int oldFlags, int flags, int mask) {
         return (oldFlags&~mask) | (flags&mask);
     }
@@ -1161,7 +1120,6 @@
         pw.println("  window: " + mWindow);
         pw.print("  flags:");
         if (isInteractive()) pw.print(" interactive");
-        if (isLowProfile()) pw.print(" lowprofile");
         if (isFullscreen()) pw.print(" fullscreen");
         if (isScreenBright()) pw.print(" bright");
         if (isWindowless()) pw.print(" windowless");
diff --git a/core/java/android/service/notification/StatusBarNotification.java b/core/java/android/service/notification/StatusBarNotification.java
index 21b83c6..5c43f8f 100644
--- a/core/java/android/service/notification/StatusBarNotification.java
+++ b/core/java/android/service/notification/StatusBarNotification.java
@@ -292,6 +292,18 @@
         return this.user.getIdentifier();
     }
 
+    /**
+     * Like {@link #getUserId()} but handles special users.
+     * @hide
+     */
+    public int getNormalizedUserId() {
+        int userId = getUserId();
+        if (userId == UserHandle.USER_ALL) {
+            userId = UserHandle.USER_SYSTEM;
+        }
+        return userId;
+    }
+
     /** The package that the notification belongs to. */
     public String getPackageName() {
         return pkg;
diff --git a/core/java/android/service/notification/ZenModeConfig.java b/core/java/android/service/notification/ZenModeConfig.java
index af91596..1f6555c 100644
--- a/core/java/android/service/notification/ZenModeConfig.java
+++ b/core/java/android/service/notification/ZenModeConfig.java
@@ -102,8 +102,8 @@
     private static final boolean DEFAULT_ALLOW_REMINDERS = false;
     private static final boolean DEFAULT_ALLOW_EVENTS = false;
     private static final boolean DEFAULT_ALLOW_REPEAT_CALLERS = true;
-    private static final boolean DEFAULT_ALLOW_CONV = true;
-    private static final int DEFAULT_ALLOW_CONV_FROM = ZenPolicy.CONVERSATION_SENDERS_IMPORTANT;
+    private static final boolean DEFAULT_ALLOW_CONV = false;
+    private static final int DEFAULT_ALLOW_CONV_FROM = ZenPolicy.CONVERSATION_SENDERS_NONE;
     private static final boolean DEFAULT_CHANNELS_BYPASSING_DND = false;
     private static final int DEFAULT_SUPPRESSED_VISUAL_EFFECTS = 0;
 
@@ -125,8 +125,8 @@
     private static final String ALLOW_ATT_EVENTS = "events";
     private static final String ALLOW_ATT_SCREEN_OFF = "visualScreenOff";
     private static final String ALLOW_ATT_SCREEN_ON = "visualScreenOn";
-    private static final String ALLOW_ATT_CONV = "conv";
-    private static final String ALLOW_ATT_CONV_FROM = "convFrom";
+    private static final String ALLOW_ATT_CONV = "convos";
+    private static final String ALLOW_ATT_CONV_FROM = "convosFrom";
     private static final String DISALLOW_TAG = "disallow";
     private static final String DISALLOW_ATT_VISUAL_EFFECTS = "visualEffects";
     private static final String STATE_TAG = "state";
diff --git a/core/java/android/service/voice/AlwaysOnHotwordDetector.java b/core/java/android/service/voice/AlwaysOnHotwordDetector.java
index 97cd760..6f94112 100644
--- a/core/java/android/service/voice/AlwaysOnHotwordDetector.java
+++ b/core/java/android/service/voice/AlwaysOnHotwordDetector.java
@@ -460,7 +460,7 @@
                     "Getting supported recognition modes for the keyphrase is not supported");
         }
 
-        return mKeyphraseMetadata.recognitionModeFlags;
+        return mKeyphraseMetadata.getRecognitionModeFlags();
     }
 
     /**
@@ -765,8 +765,8 @@
     private int startRecognitionLocked(int recognitionFlags) {
         KeyphraseRecognitionExtra[] recognitionExtra = new KeyphraseRecognitionExtra[1];
         // TODO: Do we need to do something about the confidence level here?
-        recognitionExtra[0] = new KeyphraseRecognitionExtra(mKeyphraseMetadata.id,
-                mKeyphraseMetadata.recognitionModeFlags, 0, new ConfidenceLevel[0]);
+        recognitionExtra[0] = new KeyphraseRecognitionExtra(mKeyphraseMetadata.getId(),
+                mKeyphraseMetadata.getRecognitionModeFlags(), 0, new ConfidenceLevel[0]);
         boolean captureTriggerAudio =
                 (recognitionFlags&RECOGNITION_FLAG_CAPTURE_TRIGGER_AUDIO) != 0;
         boolean allowMultipleTriggers =
@@ -783,7 +783,7 @@
         int code;
         try {
             code = mModelManagementService.startRecognition(
-                    mKeyphraseMetadata.id, mLocale.toLanguageTag(), mInternalCallback,
+                    mKeyphraseMetadata.getId(), mLocale.toLanguageTag(), mInternalCallback,
                     new RecognitionConfig(captureTriggerAudio, allowMultipleTriggers,
                             recognitionExtra, null /* additional data */, audioCapabilities));
         } catch (RemoteException e) {
@@ -799,7 +799,7 @@
     private int stopRecognitionLocked() {
         int code;
         try {
-            code = mModelManagementService.stopRecognition(mKeyphraseMetadata.id,
+            code = mModelManagementService.stopRecognition(mKeyphraseMetadata.getId(),
                     mInternalCallback);
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
@@ -813,7 +813,7 @@
 
     private int setParameterLocked(@ModelParams int modelParam, int value) {
         try {
-            int code = mModelManagementService.setParameter(mKeyphraseMetadata.id, modelParam,
+            int code = mModelManagementService.setParameter(mKeyphraseMetadata.getId(), modelParam,
                     value);
 
             if (code != STATUS_OK) {
@@ -828,7 +828,7 @@
 
     private int getParameterLocked(@ModelParams int modelParam) {
         try {
-            return mModelManagementService.getParameter(mKeyphraseMetadata.id, modelParam);
+            return mModelManagementService.getParameter(mKeyphraseMetadata.getId(), modelParam);
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
@@ -838,7 +838,7 @@
     private ModelParamRange queryParameterLocked(@ModelParams int modelParam) {
         try {
             SoundTrigger.ModelParamRange modelParamRange =
-                    mModelManagementService.queryParameter(mKeyphraseMetadata.id, modelParam);
+                    mModelManagementService.queryParameter(mKeyphraseMetadata.getId(), modelParam);
 
             if (modelParamRange == null) {
                 return null;
diff --git a/core/java/android/speech/RecognizerIntent.java b/core/java/android/speech/RecognizerIntent.java
index 362b94b..3b5a6d5 100644
--- a/core/java/android/speech/RecognizerIntent.java
+++ b/core/java/android/speech/RecognizerIntent.java
@@ -413,6 +413,10 @@
      * {@link #ACTION_VOICE_SEARCH_HANDS_FREE}, {@link #ACTION_WEB_SEARCH} to indicate whether to
      * only use an offline speech recognition engine. The default is false, meaning that either
      * network or offline recognition engines may be used.
+     *
+     * <p>Depending on the recognizer implementation, these values may have
+     * no effect.</p>
+     *
      */
     public static final String EXTRA_PREFER_OFFLINE = "android.speech.extra.PREFER_OFFLINE";
 }
diff --git a/core/java/android/text/TextUtils.java b/core/java/android/text/TextUtils.java
index df4ead1..28639b3 100644
--- a/core/java/android/text/TextUtils.java
+++ b/core/java/android/text/TextUtils.java
@@ -748,7 +748,7 @@
             int parcelableFlags) {
         if (cs instanceof Spanned) {
             p.writeInt(0);
-            p.writeString(cs.toString());
+            p.writeString8(cs.toString());
 
             Spanned sp = (Spanned) cs;
             Object[] os = sp.getSpans(0, cs.length(), Object.class);
@@ -785,9 +785,9 @@
         } else {
             p.writeInt(1);
             if (cs != null) {
-                p.writeString(cs.toString());
+                p.writeString8(cs.toString());
             } else {
-                p.writeString(null);
+                p.writeString8(null);
             }
         }
     }
@@ -807,7 +807,7 @@
         public CharSequence createFromParcel(Parcel p) {
             int kind = p.readInt();
 
-            String string = p.readString();
+            String string = p.readString8();
             if (string == null) {
                 return null;
             }
diff --git a/core/java/android/text/style/DynamicDrawableSpan.java b/core/java/android/text/style/DynamicDrawableSpan.java
index f37e423..d6d99f8 100644
--- a/core/java/android/text/style/DynamicDrawableSpan.java
+++ b/core/java/android/text/style/DynamicDrawableSpan.java
@@ -166,7 +166,7 @@
         if (mVerticalAlignment == ALIGN_BASELINE) {
             transY -= paint.getFontMetricsInt().descent;
         } else if (mVerticalAlignment == ALIGN_CENTER) {
-            transY = (bottom - top) / 2 - b.getBounds().height() / 2;
+            transY = top + (bottom - top) / 2 - b.getBounds().height() / 2;
         }
 
         canvas.translate(x, transY);
diff --git a/core/java/android/view/IScrollCaptureClient.aidl b/core/java/android/view/IScrollCaptureClient.aidl
new file mode 100644
index 0000000..5f135a37
--- /dev/null
+++ b/core/java/android/view/IScrollCaptureClient.aidl
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view;
+
+import android.graphics.Rect;
+import android.view.Surface;
+
+
+ /**
+   * Interface implemented by a client of the Scroll Capture framework to receive requests
+   * to start, capture images and end the session.
+   *
+   * {@hide}
+   */
+interface IScrollCaptureClient {
+
+    /**
+     * Informs the client that it has been selected for scroll capture and should prepare to
+     * to begin handling capture requests.
+     */
+    oneway void startCapture(in Surface surface);
+
+    /**
+     * Request the client capture an image within the provided rectangle.
+     *
+     * @see android.view.ScrollCaptureCallback#onScrollCaptureRequest
+     */
+    oneway void requestImage(in Rect captureArea);
+
+    /**
+     * Inform the client that capture has ended. The client should shut down and release all
+     * local resources in use and prepare for return to normal interactive usage.
+     */
+    oneway void endCapture();
+}
diff --git a/core/java/android/view/IScrollCaptureController.aidl b/core/java/android/view/IScrollCaptureController.aidl
new file mode 100644
index 0000000..8474a00
--- /dev/null
+++ b/core/java/android/view/IScrollCaptureController.aidl
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view;
+
+import android.graphics.Point;
+import android.graphics.Rect;
+import android.view.Surface;
+
+import android.view.IScrollCaptureClient;
+
+/**
+ * Interface to a controller passed to the {@link IScrollCaptureClient} which provides the client an
+ * asynchronous callback channel for responses.
+ *
+ * {@hide}
+ */
+interface IScrollCaptureController {
+    /**
+     * Scroll capture is available, and a client connect has been returned.
+     *
+     * @param client interface to a ScrollCaptureCallback in the window process
+     * @param scrollAreaInWindow the location of scrolling in global (window) coordinate space
+     */
+    oneway void onClientConnected(in IScrollCaptureClient client, in Rect scrollBounds,
+            in Point positionInWindow);
+
+    /**
+     * Nothing in the window can be scrolled, scroll capture not offered.
+     */
+    oneway void onClientUnavailable();
+
+    /**
+     * Notifies the system that the client has confirmed the request and is ready to begin providing
+     * image requests.
+     */
+    oneway void onCaptureStarted();
+
+    /**
+     * Received a response from a capture request.
+     */
+    oneway void onCaptureBufferSent(long frameNumber, in Rect capturedArea);
+
+    /**
+     * Signals that the capture session has completed and the target window may be returned to
+     * normal interactive use. This may be due to normal shutdown, or after a timeout or other
+     * unrecoverable state change such as activity lifecycle, window visibility or focus.
+     */
+    oneway void onConnectionClosed();
+}
diff --git a/core/java/android/view/IWindow.aidl b/core/java/android/view/IWindow.aidl
index 9f2d36d..e09bf9d 100644
--- a/core/java/android/view/IWindow.aidl
+++ b/core/java/android/view/IWindow.aidl
@@ -21,15 +21,16 @@
 import android.graphics.Rect;
 import android.os.Bundle;
 import android.os.ParcelFileDescriptor;
+import android.util.MergedConfiguration;
+import android.view.DisplayCutout;
 import android.view.DragEvent;
+import android.view.InsetsSourceControl;
+import android.view.InsetsState;
+import android.view.IScrollCaptureController;
 import android.view.KeyEvent;
 import android.view.MotionEvent;
-import android.view.DisplayCutout;
-import android.view.InsetsState;
-import android.view.InsetsSourceControl;
 
 import com.android.internal.os.IResultReceiver;
-import android.util.MergedConfiguration;
 
 /**
  * API back to a client window that the Window Manager uses to inform it of
@@ -139,4 +140,11 @@
      * Tell the window that it is either gaining or losing pointer capture.
      */
     void dispatchPointerCaptureChanged(boolean hasCapture);
+
+    /**
+     * Called when Scroll Capture support is requested for a window.
+     *
+     * @param controller the controller to receive responses
+     */
+    void requestScrollCapture(in IScrollCaptureController controller);
 }
diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl
index b0bacb9..b3b53f0 100644
--- a/core/java/android/view/IWindowManager.aidl
+++ b/core/java/android/view/IWindowManager.aidl
@@ -42,6 +42,7 @@
 import android.view.IDisplayWindowRotationController;
 import android.view.IOnKeyguardExitResult;
 import android.view.IPinnedStackListener;
+import android.view.IScrollCaptureController;
 import android.view.RemoteAnimationAdapter;
 import android.view.IRotationWatcher;
 import android.view.ISystemGestureExclusionListener;
@@ -749,4 +750,18 @@
      * @param flags see definition in SurfaceTracing.cpp
      */
     void setLayerTracingFlags(int flags);
+
+    /**
+     * Forwards a scroll capture request to the appropriate window, if available.
+     *
+     * @param displayId the id of the display to target
+     * @param behindClient token for a window, used to filter the search to windows behind it, or
+     *                     {@code null} to accept a window at any zOrder
+     * @param taskId specifies the id of a task the result must belong to, or -1 to ignore task ids
+     * @param controller the controller to receive results, a call to either
+     *      {@link IScrollCaptureController#onClientConnected} or
+     *      {@link IScrollCaptureController#onClientUnavailable}.
+     */
+    void requestScrollCapture(int displayId, IBinder behindClient, int taskId,
+            IScrollCaptureController controller);
 }
diff --git a/core/java/android/view/IWindowSession.aidl b/core/java/android/view/IWindowSession.aidl
index a0527b7..25e8111 100644
--- a/core/java/android/view/IWindowSession.aidl
+++ b/core/java/android/view/IWindowSession.aidl
@@ -225,13 +225,13 @@
      * For multi screen launcher type applications, xstep and ystep indicate
      * how big the increment is from one screen to another.
      */
-    void setWallpaperPosition(IBinder windowToken, float x, float y, float xstep, float ystep);
+    oneway void setWallpaperPosition(IBinder windowToken, float x, float y, float xstep, float ystep);
 
     /**
      * For wallpaper windows, sets the scale of the wallpaper based on
      * SystemUI behavior.
      */
-    void setWallpaperZoomOut(IBinder windowToken, float scale);
+    oneway void setWallpaperZoomOut(IBinder windowToken, float scale);
 
     /**
      * For wallpaper windows, sets whether the wallpaper should actually be
diff --git a/core/java/android/view/ImeInsetsSourceConsumer.java b/core/java/android/view/ImeInsetsSourceConsumer.java
index 2461e96..df89130 100644
--- a/core/java/android/view/ImeInsetsSourceConsumer.java
+++ b/core/java/android/view/ImeInsetsSourceConsumer.java
@@ -49,7 +49,7 @@
      * Tracks whether we have an outstanding request from the IME to show, but weren't able to
      * execute it because we didn't have control yet.
      */
-    private boolean mImeRequestedShow;
+    private boolean mIsRequestedVisibleAwaitingControl;
 
     public ImeInsetsSourceConsumer(
             InsetsState state, Supplier<Transaction> transactionSupplier,
@@ -88,15 +88,7 @@
     public void onWindowFocusLost() {
         super.onWindowFocusLost();
         getImm().unregisterImeConsumer(this);
-        mImeRequestedShow = false;
-    }
-
-    @Override
-    public void show(boolean fromIme) {
-        super.show(fromIme);
-        if (fromIme) {
-            mImeRequestedShow = true;
-        }
+        mIsRequestedVisibleAwaitingControl = false;
     }
 
     @Override
@@ -119,11 +111,14 @@
         // TODO: ResultReceiver for IME.
         // TODO: Set mShowOnNextImeRender to automatically show IME and guard it with a flag.
 
+        if (getControl() == null) {
+            // If control is null, schedule to show IME when control is available.
+            mIsRequestedVisibleAwaitingControl = true;
+        }
         // If we had a request before to show from IME (tracked with mImeRequestedShow), reaching
         // this code here means that we now got control, so we can start the animation immediately.
         // If client window is trying to control IME and IME is already visible, it is immediate.
-        if (fromIme || mImeRequestedShow || mState.getSource(getType()).isVisible()) {
-            mImeRequestedShow = false;
+        if (fromIme || mState.getSource(getType()).isVisible()) {
             return ShowResult.SHOW_IMMEDIATELY;
         }
 
@@ -148,11 +143,19 @@
     public void setControl(@Nullable InsetsSourceControl control, int[] showTypes,
             int[] hideTypes) {
         super.setControl(control, showTypes, hideTypes);
-        if (control == null) {
+        if (control == getControl()) {
+            return;
+        }
+        if (control == null && !mIsRequestedVisibleAwaitingControl) {
             hide();
         }
     }
 
+    @Override
+    protected boolean isRequestedVisibleAwaitingControl() {
+        return mIsRequestedVisibleAwaitingControl || isRequestedVisible();
+    }
+
     private boolean isDummyOrEmptyEditor(EditorInfo info) {
         // TODO(b/123044812): Handle dummy input gracefully in IME Insets API
         return info == null || (info.fieldId <= 0 && info.inputType <= 0);
diff --git a/core/java/android/view/InsetsSourceConsumer.java b/core/java/android/view/InsetsSourceConsumer.java
index 6cb9374..2dcfd89 100644
--- a/core/java/android/view/InsetsSourceConsumer.java
+++ b/core/java/android/view/InsetsSourceConsumer.java
@@ -69,6 +69,13 @@
     private Rect mPendingFrame;
     private Rect mPendingVisibleFrame;
 
+    /**
+     * Indicates if we have the pending animation. When we have the control, we need to play the
+     * animation if the requested visibility is different from the current state. But if we haven't
+     * had a leash yet, we will set this flag, and play the animation once we get the leash.
+     */
+    private boolean mIsAnimationPending;
+
     public InsetsSourceConsumer(@InternalInsetsType int type, InsetsState state,
             Supplier<Transaction> transactionSupplier, InsetsController controller) {
         mType = type;
@@ -107,13 +114,21 @@
         } else {
             // We are gaining control, and need to run an animation since previous state
             // didn't match
-            if (mRequestedVisible != mState.getSource(mType).isVisible()) {
-                if (mRequestedVisible) {
+            final boolean requestedVisible = isRequestedVisibleAwaitingControl();
+            final boolean needAnimation = requestedVisible != mState.getSource(mType).isVisible();
+            if (control.getLeash() != null && (needAnimation || mIsAnimationPending)) {
+                if (requestedVisible) {
                     showTypes[0] |= toPublicType(getType());
                 } else {
                     hideTypes[0] |= toPublicType(getType());
                 }
+                mIsAnimationPending = false;
             } else {
+                if (needAnimation) {
+                    // We need animation but we haven't had a leash yet. Set this flag that when we
+                    // get the leash we can play the deferred animation.
+                    mIsAnimationPending = true;
+                }
                 // We are gaining control, but don't need to run an animation.
                 // However make sure that the leash visibility is still up to date.
                 if (applyLocalVisibilityOverride()) {
@@ -138,6 +153,16 @@
         return mSourceControl;
     }
 
+    /**
+     * Determines if the consumer will be shown after control is available.
+     * Note: for system bars this method is same as {@link #isRequestedVisible()}.
+     *
+     * @return {@code true} if consumer has a pending show.
+     */
+    protected boolean isRequestedVisibleAwaitingControl() {
+        return isRequestedVisible();
+    }
+
     int getType() {
         return mType;
     }
@@ -263,8 +288,11 @@
      * Sets requested visibility from the client, regardless of whether we are able to control it at
      * the moment.
      */
-    private void setRequestedVisible(boolean requestedVisible) {
-        mRequestedVisible = requestedVisible;
+    protected void setRequestedVisible(boolean requestedVisible) {
+        if (mRequestedVisible != requestedVisible) {
+            mRequestedVisible = requestedVisible;
+            mIsAnimationPending = false;
+        }
         if (applyLocalVisibilityOverride()) {
             mController.notifyVisibilityChanged();
         }
diff --git a/core/java/android/view/NotificationHeaderView.java b/core/java/android/view/NotificationHeaderView.java
index a9f3e04..0c50cb7 100644
--- a/core/java/android/view/NotificationHeaderView.java
+++ b/core/java/android/view/NotificationHeaderView.java
@@ -17,7 +17,6 @@
 package android.view;
 
 import android.annotation.Nullable;
-import android.app.AppOpsManager;
 import android.app.Notification;
 import android.compat.annotation.UnsupportedAppUsage;
 import android.content.Context;
@@ -27,7 +26,6 @@
 import android.graphics.Outline;
 import android.graphics.Rect;
 import android.graphics.drawable.Drawable;
-import android.util.ArraySet;
 import android.util.AttributeSet;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
@@ -396,6 +394,7 @@
             addRectAroundView(mIcon);
             mExpandButtonRect = addRectAroundView(mExpandButton);
             mAppOpsRect = addRectAroundView(mAppOps);
+            setTouchDelegate(new TouchDelegate(mAppOpsRect, mAppOps));
             addWidthRect();
             mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop();
         }
diff --git a/core/java/android/view/ScrollCaptureCallback.java b/core/java/android/view/ScrollCaptureCallback.java
new file mode 100644
index 0000000..e1a4e74
--- /dev/null
+++ b/core/java/android/view/ScrollCaptureCallback.java
@@ -0,0 +1,151 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view;
+
+import android.annotation.NonNull;
+import android.annotation.UiThread;
+import android.graphics.Rect;
+
+import java.util.function.Consumer;
+
+/**
+ * A ScrollCaptureCallback is responsible for providing rendered snapshots of scrolling content for
+ * the scroll capture system. A single callback is responsible for providing support to a single
+ * scrolling UI element. At request time, the system will select the best candidate from among all
+ * callbacks registered within the window.
+ * <p>
+ * A callback is assigned to a View using {@link View#setScrollCaptureCallback}, or to the window as
+ * {@link Window#addScrollCaptureCallback}. The point where the callback is registered defines the
+ * frame of reference for the bounds measurements used.
+ * <p>
+ * <b>Terminology</b>
+ * <dl>
+ * <dt>Containing View</dt>
+ * <dd>The view on which this callback is attached, or the root view of the window if the callback
+ * is assigned  directly to a window.</dd>
+ *
+ * <dt>Scroll Bounds</dt>
+ * <dd>A rectangle which describes an area within the containing view where scrolling content may
+ * be positioned. This may be the Containing View bounds itself, or any rectangle within.
+ * Requested by {@link #onScrollCaptureSearch}.</dd>
+ *
+ * <dt>Scroll Delta</dt>
+ * <dd>The distance the scroll position has moved since capture started. Implementations are
+ * responsible for tracking changes in vertical scroll position during capture. This is required to
+ * map the capture area to the correct location, given the current scroll position.
+ *
+ * <dt>Capture Area</dt>
+ * <dd>A rectangle which describes the area to capture, relative to scroll bounds. The vertical
+ * position remains relative to the starting scroll position and any movement since ("Scroll Delta")
+ * should be subtracted to locate the correct local position, and scrolled into view as necessary.
+ * </dd>
+ * </dl>
+ *
+ * @see View#setScrollCaptureHint(int)
+ * @see View#setScrollCaptureCallback(ScrollCaptureCallback)
+ * @see Window#addScrollCaptureCallback(ScrollCaptureCallback)
+ *
+ * @hide
+ */
+@UiThread
+public interface ScrollCaptureCallback {
+
+    /**
+     * The system is searching for the appropriate scrolling container to capture and would like to
+     * know the size and position of scrolling content handled by this callback.
+     * <p>
+     * Implementations should inset {@code containingViewBounds} to cover only the area within the
+     * containing view where scrolling content may be positioned. This should cover only the content
+     * which tracks with scrolling movement.
+     * <p>
+     * Return the updated rectangle to {@code resultConsumer}. If for any reason the scrolling
+     * content is not available to capture, a {@code null} rectangle may be returned, and this view
+     * will be excluded as the target for this request.
+     * <p>
+     * Responses received after XXXms will be discarded.
+     * <p>
+     * TODO: finalize timeout
+     *
+     * @param onReady              consumer for the updated rectangle
+     */
+    void onScrollCaptureSearch(@NonNull Consumer<Rect> onReady);
+
+    /**
+     * Scroll Capture has selected this callback to provide the scrolling image content.
+     * <p>
+     * The onReady signal should be called when ready to begin handling image requests.
+     */
+    void onScrollCaptureStart(@NonNull ScrollCaptureSession session, @NonNull Runnable onReady);
+
+    /**
+     * An image capture has been requested from the scrolling content.
+     * <p>
+     * <code>captureArea</code> contains the bounds of the image requested, relative to the
+     * rectangle provided by {@link ScrollCaptureCallback#onScrollCaptureSearch}, referred to as
+     * {@code scrollBounds}.
+     * here.
+     * <p>
+     * A series of requests will step by a constant vertical amount relative to {@code
+     * scrollBounds}, moving through the scrolling range of content, above and below the current
+     * visible area. The rectangle's vertical position will not account for any scrolling movement
+     * since capture started. Implementations therefore must track any scroll position changes and
+     * subtract this distance from requests.
+     * <p>
+     * To handle a request, the content should be scrolled to maximize the visible area of the
+     * requested rectangle. Offset {@code captureArea} again to account for any further scrolling.
+     * <p>
+     * Finally, clip this rectangle against scrollBounds to determine what portion, if any is
+     * visible content to capture. If the rectangle is completely clipped, set it to {@link
+     * Rect#setEmpty() empty} and skip the next step.
+     * <p>
+     * Make a copy of {@code captureArea}, transform to window coordinates and draw the window,
+     * clipped to this rectangle, into the {@link ScrollCaptureSession#getSurface() surface} at
+     * offset (0,0).
+     * <p>
+     * Finally, return the resulting {@code captureArea} using
+     * {@link ScrollCaptureSession#notifyBufferSent}.
+     * <p>
+     * If the response is not supplied within XXXms, the session will end with a call to {@link
+     * #onScrollCaptureEnd}, after which {@code session} is invalid and should be discarded.
+     * <p>
+     * TODO: finalize timeout
+     * <p>
+     *
+     * @param captureArea the area to capture, a rectangle within {@code scrollBounds}
+     */
+    void onScrollCaptureImageRequest(
+            @NonNull ScrollCaptureSession session, @NonNull Rect captureArea);
+
+    /**
+     * Signals that capture has ended. Implementations should release any temporary resources or
+     * references to objects in use during the capture. Any resources obtained from the session are
+     * now invalid and attempts to use them after this point may throw an exception.
+     * <p>
+     * The window should be returned as much as possible to its original state when capture started.
+     * At a minimum, the content should be scrolled to its original position.
+     * <p>
+     * <code>onReady</code> should be called when the window should be made visible and
+     * interactive. The system will wait up to XXXms for this call before proceeding.
+     * <p>
+     * TODO: finalize timeout
+     *
+     * @param onReady a callback to inform the system that the application has completed any
+     *                cleanup and is ready to become visible
+     */
+    void onScrollCaptureEnd(@NonNull Runnable onReady);
+}
+
diff --git a/core/java/android/view/ScrollCaptureClient.java b/core/java/android/view/ScrollCaptureClient.java
new file mode 100644
index 0000000..f163124
--- /dev/null
+++ b/core/java/android/view/ScrollCaptureClient.java
@@ -0,0 +1,312 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view;
+
+import static java.util.Objects.requireNonNull;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.UiThread;
+import android.annotation.WorkerThread;
+import android.graphics.Point;
+import android.graphics.Rect;
+import android.os.Handler;
+import android.os.RemoteException;
+import android.util.CloseGuard;
+
+import com.android.internal.annotations.VisibleForTesting;
+
+import java.util.concurrent.atomic.AtomicBoolean;
+
+/**
+ * A client of the system providing Scroll Capture capability on behalf of a Window.
+ * <p>
+ * An instance is created to wrap the selected {@link ScrollCaptureCallback}.
+ *
+ * @hide
+ */
+public class ScrollCaptureClient extends IScrollCaptureClient.Stub {
+
+    private static final String TAG = "ScrollCaptureClient";
+    private static final int DEFAULT_TIMEOUT = 1000;
+
+    private final Handler mHandler;
+    private ScrollCaptureTarget mSelectedTarget;
+    private int mTimeoutMillis = DEFAULT_TIMEOUT;
+
+    protected Surface mSurface;
+    private IScrollCaptureController mController;
+
+    private final Rect mScrollBounds;
+    private final Point mPositionInWindow;
+    private final CloseGuard mCloseGuard;
+
+    // The current session instance in use by the callback.
+    private ScrollCaptureSession mSession;
+
+    // Helps manage timeout callbacks registered to handler and aids testing.
+    private DelayedAction mTimeoutAction;
+
+    /**
+     * Constructs a ScrollCaptureClient.
+     *
+     * @param selectedTarget  the target the client is controlling
+     * @param controller the callbacks to reply to system requests
+     *
+     * @hide
+     */
+    public ScrollCaptureClient(
+            @NonNull ScrollCaptureTarget selectedTarget,
+            @NonNull IScrollCaptureController controller) {
+        requireNonNull(selectedTarget, "<selectedTarget> must non-null");
+        requireNonNull(controller, "<controller> must non-null");
+        final Rect scrollBounds = requireNonNull(selectedTarget.getScrollBounds(),
+                "target.getScrollBounds() must be non-null to construct a client");
+
+        mSelectedTarget = selectedTarget;
+        mHandler = selectedTarget.getContainingView().getHandler();
+        mScrollBounds = new Rect(scrollBounds);
+        mPositionInWindow = new Point(selectedTarget.getPositionInWindow());
+
+        mController = controller;
+        mCloseGuard = new CloseGuard();
+        mCloseGuard.open("close");
+
+        selectedTarget.getContainingView().addOnAttachStateChangeListener(
+                new View.OnAttachStateChangeListener() {
+                    @Override
+                    public void onViewAttachedToWindow(View v) {
+
+                    }
+
+                    @Override
+                    public void onViewDetachedFromWindow(View v) {
+                        selectedTarget.getContainingView().removeOnAttachStateChangeListener(this);
+                        endCapture();
+                    }
+                });
+    }
+
+    @VisibleForTesting
+    public void setTimeoutMillis(int timeoutMillis) {
+        mTimeoutMillis = timeoutMillis;
+    }
+
+    @Nullable
+    @VisibleForTesting
+    public DelayedAction getTimeoutAction() {
+        return mTimeoutAction;
+    }
+
+    private void checkConnected() {
+        if (mSelectedTarget == null || mController == null) {
+            throw new IllegalStateException("This client has been disconnected.");
+        }
+    }
+
+    private void checkStarted() {
+        if (mSession == null) {
+            throw new IllegalStateException("Capture session has not been started!");
+        }
+    }
+
+    @WorkerThread // IScrollCaptureClient
+    @Override
+    public void startCapture(Surface surface) throws RemoteException {
+        checkConnected();
+        mSurface = surface;
+        scheduleTimeout(mTimeoutMillis, this::onStartCaptureTimeout);
+        mSession = new ScrollCaptureSession(mSurface, mScrollBounds, mPositionInWindow, this);
+        mHandler.post(() -> mSelectedTarget.getCallback().onScrollCaptureStart(mSession,
+                this::onStartCaptureCompleted));
+    }
+
+    @UiThread
+    private void onStartCaptureCompleted() {
+        if (cancelTimeout()) {
+            mHandler.post(() -> {
+                try {
+                    mController.onCaptureStarted();
+                } catch (RemoteException e) {
+                    doShutdown();
+                }
+            });
+        }
+    }
+
+    @UiThread
+    private void onStartCaptureTimeout() {
+        endCapture();
+    }
+
+    @WorkerThread // IScrollCaptureClient
+    @Override
+    public void requestImage(Rect requestRect) {
+        checkConnected();
+        checkStarted();
+        scheduleTimeout(mTimeoutMillis, this::onRequestImageTimeout);
+        // Response is dispatched via ScrollCaptureSession, to onRequestImageCompleted
+        mHandler.post(() -> mSelectedTarget.getCallback().onScrollCaptureImageRequest(
+                mSession, new Rect(requestRect)));
+    }
+
+    @UiThread
+    void onRequestImageCompleted(long frameNumber, Rect capturedArea) {
+        final Rect finalCapturedArea = new Rect(capturedArea);
+        if (cancelTimeout()) {
+            mHandler.post(() -> {
+                try {
+                    mController.onCaptureBufferSent(frameNumber, finalCapturedArea);
+                } catch (RemoteException e) {
+                    doShutdown();
+                }
+            });
+        }
+    }
+
+    @UiThread
+    private void onRequestImageTimeout() {
+        endCapture();
+    }
+
+    @WorkerThread // IScrollCaptureClient
+    @Override
+    public void endCapture() {
+        if (isStarted()) {
+            scheduleTimeout(mTimeoutMillis, this::onEndCaptureTimeout);
+            mHandler.post(() ->
+                    mSelectedTarget.getCallback().onScrollCaptureEnd(this::onEndCaptureCompleted));
+        } else {
+            disconnect();
+        }
+    }
+
+    private boolean isStarted() {
+        return mController != null && mSelectedTarget != null;
+    }
+
+    @UiThread
+    private void onEndCaptureCompleted() { // onEndCaptureCompleted
+        if (cancelTimeout()) {
+            doShutdown();
+        }
+    }
+
+    @UiThread
+    private void onEndCaptureTimeout() {
+        doShutdown();
+    }
+
+
+    private void doShutdown() {
+        try {
+            if (mController != null) {
+                mController.onConnectionClosed();
+            }
+        } catch (RemoteException e) {
+            // Ignore
+        } finally {
+            disconnect();
+        }
+    }
+
+    /**
+     * Shuts down this client and releases references to dependent objects. No attempt is made
+     * to notify the controller, use with caution!
+     */
+    public void disconnect() {
+        if (mSession != null) {
+            mSession.disconnect();
+            mSession = null;
+        }
+
+        mSelectedTarget = null;
+        mController = null;
+    }
+
+    /** @return a string representation of the state of this client */
+    public String toString() {
+        return "ScrollCaptureClient{"
+                + ", session=" + mSession
+                + ", selectedTarget=" + mSelectedTarget
+                + ", clientCallbacks=" + mController
+                + "}";
+    }
+
+    private boolean cancelTimeout() {
+        if (mTimeoutAction != null) {
+            return mTimeoutAction.cancel();
+        }
+        return false;
+    }
+
+    private void scheduleTimeout(long timeoutMillis, Runnable action) {
+        if (mTimeoutAction != null) {
+            mTimeoutAction.cancel();
+        }
+        mTimeoutAction = new DelayedAction(mHandler, timeoutMillis, action);
+    }
+
+    /** @hide */
+    @VisibleForTesting
+    public static class DelayedAction {
+        private final AtomicBoolean mCompleted = new AtomicBoolean();
+        private final Object mToken = new Object();
+        private final Handler mHandler;
+        private final Runnable mAction;
+
+        @VisibleForTesting
+        public DelayedAction(Handler handler, long timeoutMillis, Runnable action) {
+            mHandler = handler;
+            mAction = action;
+            mHandler.postDelayed(this::onTimeout, mToken, timeoutMillis);
+        }
+
+        private boolean onTimeout() {
+            if (mCompleted.compareAndSet(false, true)) {
+                mAction.run();
+                return true;
+            }
+            return false;
+        }
+
+        /**
+         * Cause the timeout action to run immediately and mark as timed out.
+         *
+         * @return true if the timeout was run, false if the timeout had already been canceled
+         */
+        @VisibleForTesting
+        public boolean timeoutNow() {
+            return onTimeout();
+        }
+
+        /**
+         * Attempt to cancel the timeout action (such as after a callback is made)
+         *
+         * @return true if the timeout was canceled and will not run, false if time has expired and
+         * the timeout action has or will run momentarily
+         */
+        public boolean cancel() {
+            if (!mCompleted.compareAndSet(false, true)) {
+                // Whoops, too late!
+                return false;
+            }
+            mHandler.removeCallbacksAndMessages(mToken);
+            return true;
+        }
+    }
+}
diff --git a/core/java/android/view/ScrollCaptureSession.java b/core/java/android/view/ScrollCaptureSession.java
new file mode 100644
index 0000000..628e23f
--- /dev/null
+++ b/core/java/android/view/ScrollCaptureSession.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.graphics.Point;
+import android.graphics.Rect;
+
+/**
+ * A session represents the scope of interaction between a {@link ScrollCaptureCallback} and the
+ * system during an active scroll capture operation. During the scope of a session, a callback
+ * will receive a series of requests for image data. Resources provided here are valid for use
+ * until {@link ScrollCaptureCallback#onScrollCaptureEnd(Runnable)}.
+ *
+ * @hide
+ */
+public class ScrollCaptureSession {
+
+    private final Surface mSurface;
+    private final Rect mScrollBounds;
+    private final Point mPositionInWindow;
+
+    @Nullable
+    private ScrollCaptureClient mClient;
+
+    /** @hide */
+    public ScrollCaptureSession(Surface surface, Rect scrollBounds, Point positionInWindow,
+            ScrollCaptureClient client) {
+        mSurface = surface;
+        mScrollBounds = scrollBounds;
+        mPositionInWindow = positionInWindow;
+        mClient = client;
+    }
+
+    /**
+     * Returns a
+     * <a href="https://source.android.com/devices/graphics/arch-bq-gralloc">BufferQueue</a> in the
+     * form of a {@link Surface} for transfer of image buffers.
+     *
+     * @return the surface for transferring image buffers
+     * @throws IllegalStateException if the session has been closed
+     */
+    @NonNull
+    public Surface getSurface() {
+        return mSurface;
+    }
+
+    /**
+     * Returns the {@code scroll bounds}, as provided by
+     * {@link ScrollCaptureCallback#onScrollCaptureSearch}.
+     *
+     * @return the area of scrolling content within the containing view
+     */
+    @NonNull
+    public Rect getScrollBounds() {
+        return mScrollBounds;
+    }
+
+    /**
+     * Returns the offset of {@code scroll bounds} within the window.
+     *
+     * @return the area of scrolling content within the containing view
+     */
+    @NonNull
+    public Point getPositionInWindow() {
+        return mPositionInWindow;
+    }
+
+    /**
+     * Notify the system that an a buffer has been posted via the getSurface() channel.
+     *
+     * @param frameNumber  the frame number of the queued buffer
+     * @param capturedArea the area captured, relative to scroll bounds
+     */
+    public void notifyBufferSent(long frameNumber, @NonNull Rect capturedArea) {
+        if (mClient != null) {
+            mClient.onRequestImageCompleted(frameNumber, capturedArea);
+        }
+    }
+
+    /**
+     * @hide
+     */
+    public void disconnect() {
+        mClient = null;
+        if (mSurface.isValid()) {
+            mSurface.release();
+        }
+    }
+}
diff --git a/core/java/android/view/ScrollCaptureTarget.java b/core/java/android/view/ScrollCaptureTarget.java
new file mode 100644
index 0000000..f3fcabb
--- /dev/null
+++ b/core/java/android/view/ScrollCaptureTarget.java
@@ -0,0 +1,135 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.UiThread;
+import android.graphics.Matrix;
+import android.graphics.Point;
+import android.graphics.Rect;
+
+import com.android.internal.util.FastMath;
+
+/**
+ * A target collects the set of contextual information for a ScrollCaptureHandler discovered during
+ * a {@link View#dispatchScrollCaptureSearch scroll capture search}.
+ *
+ * @hide
+ */
+public final class ScrollCaptureTarget {
+    private final View mContainingView;
+    private final ScrollCaptureCallback mCallback;
+    private final Rect mLocalVisibleRect;
+    private final Point mPositionInWindow;
+    private final int mHint;
+    private Rect mScrollBounds;
+
+    private final float[] mTmpFloatArr = new float[2];
+    private final Matrix mMatrixViewLocalToWindow = new Matrix();
+    private final Rect mTmpRect = new Rect();
+
+    public ScrollCaptureTarget(@NonNull View scrollTarget, @NonNull Rect localVisibleRect,
+            @NonNull Point positionInWindow, @NonNull ScrollCaptureCallback callback) {
+        mContainingView = scrollTarget;
+        mHint = mContainingView.getScrollCaptureHint();
+        mCallback = callback;
+        mLocalVisibleRect = localVisibleRect;
+        mPositionInWindow = positionInWindow;
+    }
+
+    /** @return the hint that the {@code containing view} had during the scroll capture search */
+    @View.ScrollCaptureHint
+    public int getHint() {
+        return mHint;
+    }
+
+    /** @return the {@link ScrollCaptureCallback} for this target */
+    @NonNull
+    public ScrollCaptureCallback getCallback() {
+        return mCallback;
+    }
+
+    /** @return the {@code containing view} for this {@link ScrollCaptureCallback callback} */
+    @NonNull
+    public View getContainingView() {
+        return mContainingView;
+    }
+
+    /**
+     * Returns the un-clipped, visible bounds of the containing view during the scroll capture
+     * search. This is used to determine on-screen area to assist in selecting the primary target.
+     *
+     * @return the visible bounds of the {@code containing view} in view-local coordinates
+     */
+    @NonNull
+    public Rect getLocalVisibleRect() {
+        return mLocalVisibleRect;
+    }
+
+    /** @return the position of the {@code containing view} within the window */
+    @NonNull
+    public Point getPositionInWindow() {
+        return mPositionInWindow;
+    }
+
+    /** @return the {@code scroll bounds} for this {@link ScrollCaptureCallback callback} */
+    @Nullable
+    public Rect getScrollBounds() {
+        return mScrollBounds;
+    }
+
+    /**
+     * Sets the scroll bounds rect to the intersection of provided rect and the current bounds of
+     * the {@code containing view}.
+     */
+    public void setScrollBounds(@Nullable Rect scrollBounds) {
+        mScrollBounds = Rect.copyOrNull(scrollBounds);
+        if (mScrollBounds == null) {
+            return;
+        }
+        if (!mScrollBounds.intersect(0, 0,
+                mContainingView.getWidth(), mContainingView.getHeight())) {
+            mScrollBounds.setEmpty();
+        }
+    }
+
+    private static void zero(float[] pointArray) {
+        pointArray[0] = 0;
+        pointArray[1] = 0;
+    }
+
+    private static void roundIntoPoint(Point pointObj, float[] pointArray) {
+        pointObj.x = FastMath.round(pointArray[0]);
+        pointObj.y = FastMath.round(pointArray[1]);
+    }
+
+    /**
+     * Refresh the value of {@link #mLocalVisibleRect} and {@link #mPositionInWindow} based on the
+     * current state of the {@code containing view}.
+     */
+    @UiThread
+    public void updatePositionInWindow() {
+        mMatrixViewLocalToWindow.reset();
+        mContainingView.transformMatrixToGlobal(mMatrixViewLocalToWindow);
+
+        zero(mTmpFloatArr);
+        mMatrixViewLocalToWindow.mapPoints(mTmpFloatArr);
+        roundIntoPoint(mPositionInWindow, mTmpFloatArr);
+    }
+
+}
diff --git a/core/java/android/view/ScrollCaptureTargetResolver.java b/core/java/android/view/ScrollCaptureTargetResolver.java
new file mode 100644
index 0000000..71e82c5
--- /dev/null
+++ b/core/java/android/view/ScrollCaptureTargetResolver.java
@@ -0,0 +1,387 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view;
+
+import android.annotation.AnyThread;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.UiThread;
+import android.graphics.Rect;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.SystemClock;
+import android.util.Log;
+
+import com.android.internal.annotations.VisibleForTesting;
+
+
+import java.util.Queue;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.function.Consumer;
+
+/**
+ * Queries additional state from a list of {@link ScrollCaptureTarget targets} via asynchronous
+ * callbacks, then aggregates and reduces the target list to a single target, or null if no target
+ * is suitable.
+ * <p>
+ * The rules for selection are (in order):
+ * <ul>
+ * <li>prefer getScrollBounds(): non-empty
+ * <li>prefer View.getScrollCaptureHint == SCROLL_CAPTURE_HINT_INCLUDE
+ * <li>prefer descendants before parents
+ * <li>prefer larger area for getScrollBounds() (clipped to view bounds)
+ * </ul>
+ *
+ * <p>
+ * All calls to {@link ScrollCaptureCallback#onScrollCaptureSearch} are made on the main thread,
+ * with results are queued and consumed to the main thread as well.
+ *
+ * @see #start(Handler, long, Consumer)
+ *
+ * @hide
+ */
+@UiThread
+public class ScrollCaptureTargetResolver {
+    private static final String TAG = "ScrollCaptureTargetRes";
+    private static final boolean DEBUG = true;
+
+    private final Object mLock = new Object();
+
+    private final Queue<ScrollCaptureTarget> mTargets;
+    private Handler mHandler;
+    private long mTimeLimitMillis;
+
+    private Consumer<ScrollCaptureTarget> mWhenComplete;
+    private int mPendingBoundsRequests;
+    private long mDeadlineMillis;
+
+    private ScrollCaptureTarget mResult;
+    private boolean mFinished;
+
+    private boolean mStarted;
+
+    private static int area(Rect r) {
+        return r.width() * r.height();
+    }
+
+    private static boolean nullOrEmpty(Rect r) {
+        return r == null || r.isEmpty();
+    }
+
+    /**
+     * Binary operator which selects the best {@link ScrollCaptureTarget}.
+     */
+    private static ScrollCaptureTarget chooseTarget(ScrollCaptureTarget a, ScrollCaptureTarget b) {
+        Log.d(TAG, "chooseTarget: " + a + " or " + b);
+        // Nothing plus nothing is still nothing.
+        if (a == null && b == null) {
+            Log.d(TAG, "chooseTarget: (both null) return " + null);
+            return null;
+        }
+        // Prefer non-null.
+        if (a == null || b == null) {
+            ScrollCaptureTarget c = (a == null) ? b : a;
+            Log.d(TAG, "chooseTarget: (other is null) return " + c);
+            return c;
+
+        }
+
+        boolean emptyScrollBoundsA = nullOrEmpty(a.getScrollBounds());
+        boolean emptyScrollBoundsB = nullOrEmpty(b.getScrollBounds());
+        if (emptyScrollBoundsA || emptyScrollBoundsB) {
+            if (emptyScrollBoundsA && emptyScrollBoundsB) {
+                // Both have an empty or null scrollBounds
+                Log.d(TAG, "chooseTarget: (both have empty or null bounds) return " + null);
+                return null;
+            }
+            // Prefer the one with a non-empty scroll bounds
+            if (emptyScrollBoundsA) {
+                Log.d(TAG, "chooseTarget: (a has empty or null bounds) return " + b);
+                return b;
+            }
+            Log.d(TAG, "chooseTarget: (b has empty or null bounds) return " + a);
+            return a;
+        }
+
+        final View viewA = a.getContainingView();
+        final View viewB = b.getContainingView();
+
+        // Prefer any view with scrollCaptureHint="INCLUDE", over one without
+        // This is an escape hatch for the next rule (descendants first)
+        boolean hintIncludeA = hasIncludeHint(viewA);
+        boolean hintIncludeB = hasIncludeHint(viewB);
+        if (hintIncludeA != hintIncludeB) {
+            ScrollCaptureTarget c = (hintIncludeA) ? a : b;
+            Log.d(TAG, "chooseTarget: (has hint=INCLUDE) return " + c);
+            return c;
+        }
+
+        // If the views are relatives, prefer the descendant. This allows implementations to
+        // leverage nested scrolling APIs by interacting with the innermost scrollable view (as
+        // would happen with touch input).
+        if (isDescendant(viewA, viewB)) {
+            Log.d(TAG, "chooseTarget: (b is descendant of a) return " + b);
+            return b;
+        }
+        if (isDescendant(viewB, viewA)) {
+            Log.d(TAG, "chooseTarget: (a is descendant of b) return " + a);
+            return a;
+        }
+
+        // finally, prefer one with larger scroll bounds
+        int scrollAreaA = area(a.getScrollBounds());
+        int scrollAreaB = area(b.getScrollBounds());
+        ScrollCaptureTarget c = (scrollAreaA >= scrollAreaB) ? a : b;
+        Log.d(TAG, "chooseTarget: return " + c);
+        return c;
+    }
+
+    /**
+     * Creates an instance to query and filter {@code target}.
+     *
+     * @param targets   a list of {@link ScrollCaptureTarget} as collected by {@link
+     *                  View#dispatchScrollCaptureSearch}.
+     * @param uiHandler the UI thread handler for the view tree
+     * @see #start(long, Consumer)
+     */
+    public ScrollCaptureTargetResolver(Queue<ScrollCaptureTarget> targets) {
+        mTargets = targets;
+    }
+
+    void checkThread() {
+        if (mHandler.getLooper() != Looper.myLooper()) {
+            throw new IllegalStateException("Called from wrong thread! ("
+                    + Thread.currentThread().getName() + ")");
+        }
+    }
+
+    /**
+     * Blocks until a result is returned (after completion or timeout).
+     * <p>
+     * For testing only. Normal usage should receive a callback after calling {@link #start}.
+     */
+    @VisibleForTesting
+    public ScrollCaptureTarget waitForResult() throws InterruptedException {
+        synchronized (mLock) {
+            while (!mFinished) {
+                mLock.wait();
+            }
+        }
+        return mResult;
+    }
+
+
+    private void supplyResult(ScrollCaptureTarget target) {
+        checkThread();
+        if (mFinished) {
+            return;
+        }
+        mResult = chooseTarget(mResult, target);
+        boolean finish = mPendingBoundsRequests == 0
+                || SystemClock.elapsedRealtime() >= mDeadlineMillis;
+        if (finish) {
+            System.err.println("We think we're done, or timed out");
+            mPendingBoundsRequests = 0;
+            mWhenComplete.accept(mResult);
+            synchronized (mLock) {
+                mFinished = true;
+                mLock.notify();
+            }
+            mWhenComplete = null;
+        }
+    }
+
+    /**
+     * Asks all targets for {@link ScrollCaptureCallback#onScrollCaptureSearch(Consumer)
+     * scrollBounds}, and selects the primary target according to the {@link
+     * #chooseTarget} function.
+     *
+     * @param timeLimitMillis the amount of time to wait for all responses before delivering the top
+     *                        result
+     * @param resultConsumer  the consumer to receive the primary target
+     */
+    @AnyThread
+    public void start(Handler uiHandler, long timeLimitMillis,
+            Consumer<ScrollCaptureTarget> resultConsumer) {
+        synchronized (mLock) {
+            if (mStarted) {
+                throw new IllegalStateException("already started!");
+            }
+            if (timeLimitMillis < 0) {
+                throw new IllegalArgumentException("Time limit must be positive");
+            }
+            mHandler = uiHandler;
+            mTimeLimitMillis = timeLimitMillis;
+            mWhenComplete = resultConsumer;
+            if (mTargets.isEmpty()) {
+                mHandler.post(() -> supplyResult(null));
+                return;
+            }
+            mStarted = true;
+            uiHandler.post(() -> run(timeLimitMillis, resultConsumer));
+        }
+    }
+
+
+    private void run(long timeLimitMillis, Consumer<ScrollCaptureTarget> resultConsumer) {
+        checkThread();
+
+        mPendingBoundsRequests = mTargets.size();
+        for (ScrollCaptureTarget target : mTargets) {
+            queryTarget(target);
+        }
+        mDeadlineMillis = SystemClock.elapsedRealtime() + mTimeLimitMillis;
+        mHandler.postAtTime(mTimeoutRunnable, mDeadlineMillis);
+    }
+
+    private final Runnable mTimeoutRunnable = new Runnable() {
+        @Override
+        public void run() {
+            checkThread();
+            supplyResult(null);
+        }
+    };
+
+
+    /**
+     * Adds a target to the list and requests {@link ScrollCaptureCallback#onScrollCaptureSearch}
+     * scrollBounds} from it. Results are returned by a call to {@link #onScrollBoundsProvided}.
+     *
+     * @param target the target to add
+     */
+    @UiThread
+    private void queryTarget(@NonNull ScrollCaptureTarget target) {
+        checkThread();
+        final ScrollCaptureCallback callback = target.getCallback();
+        // from the UI thread, request scroll bounds
+        callback.onScrollCaptureSearch(
+                // allow only one callback to onReady.accept():
+                new SingletonConsumer<Rect>(
+                        // Queue and consume on the UI thread
+                        ((scrollBounds) -> mHandler.post(
+                                () -> onScrollBoundsProvided(target, scrollBounds)))));
+
+    }
+
+    @UiThread
+    private void onScrollBoundsProvided(ScrollCaptureTarget target, @Nullable Rect scrollBounds) {
+        checkThread();
+        if (mFinished) {
+            return;
+        }
+
+        // Record progress.
+        mPendingBoundsRequests--;
+
+        // Remove the timeout.
+        mHandler.removeCallbacks(mTimeoutRunnable);
+
+        boolean doneOrTimedOut = mPendingBoundsRequests == 0
+                || SystemClock.elapsedRealtime() >= mDeadlineMillis;
+
+        final View containingView = target.getContainingView();
+        if (!nullOrEmpty(scrollBounds) && containingView.isAggregatedVisible()) {
+            target.updatePositionInWindow();
+            target.setScrollBounds(scrollBounds);
+            supplyResult(target);
+        }
+
+        System.err.println("mPendingBoundsRequests: " + mPendingBoundsRequests);
+        System.err.println("mDeadlineMillis: " + mDeadlineMillis);
+        System.err.println("SystemClock.elapsedRealtime(): " + SystemClock.elapsedRealtime());
+
+        if (!mFinished) {
+            // Reschedule the timeout.
+            System.err.println(
+                    "We think we're NOT done yet and will check back at " + mDeadlineMillis);
+            mHandler.postAtTime(mTimeoutRunnable, mDeadlineMillis);
+        }
+    }
+
+    private static boolean hasIncludeHint(View view) {
+        return (view.getScrollCaptureHint() & View.SCROLL_CAPTURE_HINT_INCLUDE) != 0;
+    }
+
+    /**
+     * Determines if {@code otherView} is a descendant of {@code view}.
+     *
+     * @param view      a view
+     * @param otherView another view
+     * @return true if {@code view} is an ancestor of {@code otherView}
+     */
+    private static boolean isDescendant(@NonNull View view, @NonNull View otherView) {
+        if (view == otherView) {
+            return false;
+        }
+        ViewParent otherParent = otherView.getParent();
+        while (otherParent != view && otherParent != null) {
+            otherParent = otherParent.getParent();
+        }
+        return otherParent == view;
+    }
+
+    private static int findRelation(@NonNull View a, @NonNull View b) {
+        if (a == b) {
+            return 0;
+        }
+
+        ViewParent parentA = a.getParent();
+        ViewParent parentB = b.getParent();
+
+        while (parentA != null || parentB != null) {
+            if (parentA == parentB) {
+                return 0;
+            }
+            if (parentA == b) {
+                return 1; // A is descendant of B
+            }
+            if (parentB == a) {
+                return -1; // B is descendant of A
+            }
+            if (parentA != null) {
+                parentA = parentA.getParent();
+            }
+            if (parentB != null) {
+                parentB = parentB.getParent();
+            }
+        }
+        return 0;
+    }
+
+    /**
+     * A safe wrapper for a consumer callbacks intended to accept a single value. It ensures
+     * that the receiver of the consumer does not retain a reference to {@code target} after use nor
+     * cause race conditions by invoking {@link Consumer#accept accept} more than once.
+     *
+     * @param target the target consumer
+     */
+    static class SingletonConsumer<T> implements Consumer<T> {
+        final AtomicReference<Consumer<T>> mAtomicRef;
+
+        SingletonConsumer(Consumer<T> target) {
+            mAtomicRef = new AtomicReference<>(target);
+        }
+
+        @Override
+        public void accept(T t) {
+            final Consumer<T> consumer = mAtomicRef.getAndSet(null);
+            if (consumer != null) {
+                consumer.accept(t);
+            }
+        }
+    }
+}
diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java
index 1086774..76ed37c 100644
--- a/core/java/android/view/SurfaceControl.java
+++ b/core/java/android/view/SurfaceControl.java
@@ -228,6 +228,7 @@
      */
     public long mNativeObject;
     private long mNativeHandle;
+    private Throwable mReleaseStack = null;
 
     // TODO: Move this to native.
     private final Object mSizeLock = new Object();
@@ -426,11 +427,18 @@
         if (mNativeObject != 0) {
             release();
         }
-      	if (nativeObject != 0) {
+        if (nativeObject != 0) {
             mCloseGuard.open("release");
         }
         mNativeObject = nativeObject;
         mNativeHandle = mNativeObject != 0 ? nativeGetHandle(nativeObject) : 0;
+        if (mNativeObject == 0) {
+            if (Build.IS_DEBUGGABLE) {
+                mReleaseStack = new Throwable("assigned zero nativeObject here");
+            }
+        } else {
+            mReleaseStack = null;
+        }
     }
 
     /**
@@ -989,11 +997,22 @@
             nativeRelease(mNativeObject);
             mNativeObject = 0;
             mNativeHandle = 0;
+            if (Build.IS_DEBUGGABLE) {
+                mReleaseStack = new Throwable("released here");
+            }
             mCloseGuard.close();
         }
     }
 
     /**
+     * Returns the call stack that assigned mNativeObject to zero.
+     * @hide
+     */
+    public Throwable getReleaseStack() {
+        return mReleaseStack;
+    }
+
+    /**
      * Disconnect any client still connected to the surface.
      * @hide
      */
@@ -1004,8 +1023,11 @@
     }
 
     private void checkNotReleased() {
-        if (mNativeObject == 0) throw new NullPointerException(
-                "mNativeObject is null. Have you called release() already?");
+        if (mNativeObject == 0) {
+            Log.wtf(TAG, "Invalid " + this + " caused by:", mReleaseStack);
+            throw new NullPointerException(
+                "mNativeObject of " + this + " is null. Have you called release() already?");
+        }
     }
 
     /**
diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java
index 9880ea0..db6fe0f 100644
--- a/core/java/android/view/SurfaceView.java
+++ b/core/java/android/view/SurfaceView.java
@@ -1173,43 +1173,6 @@
                 TAG, "Layout: x=" + mScreenRect.left + " y=" + mScreenRect.top
                 + " w=" + mScreenRect.width() + " h=" + mScreenRect.height()
                 + ", frame=" + mSurfaceFrame);
-        } else {
-            // Calculate the window position in case RT loses the window
-            // and we need to fallback to a UI-thread driven position update
-            if (positionChanged || layoutSizeChanged) { // Only the position has changed
-                mWindowSpaceLeft = mLocation[0];
-                mWindowSpaceTop = mLocation[1];
-                // For our size changed check, we keep mScreenRect.width() and mScreenRect.height()
-                // in view local space.
-                mLocation[0] = getWidth();
-                mLocation[1] = getHeight();
-
-                mScreenRect.set(mWindowSpaceLeft, mWindowSpaceTop,
-                        mWindowSpaceLeft + mLocation[0], mWindowSpaceTop + mLocation[1]);
-
-                if (translator != null) {
-                    translator.translateRectInAppWindowToScreen(mScreenRect);
-                }
-
-                if (mSurfaceControl == null) {
-                    return;
-                }
-
-                if (!isHardwareAccelerated() || !mRtHandlingPositionUpdates) {
-                    try {
-                        if (DEBUG_POSITION) {
-                            Log.d(TAG, String.format("%d updateSurfacePosition UI, "
-                                            + "position = [%d, %d, %d, %d]",
-                                    System.identityHashCode(this),
-                                    mScreenRect.left, mScreenRect.top,
-                                    mScreenRect.right, mScreenRect.bottom));
-                        }
-                        setParentSpaceRectangle(mScreenRect, -1);
-                    } catch (Exception ex) {
-                        Log.e(TAG, "Exception configuring surface", ex);
-                    }
-                }
-            }
         }
     }
 
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 8abe72f..f98c1f6 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -144,6 +144,7 @@
 
 import com.android.internal.R;
 import com.android.internal.util.FrameworkStatsLog;
+import com.android.internal.view.ScrollCaptureInternal;
 import com.android.internal.view.TooltipPopup;
 import com.android.internal.view.menu.MenuBuilder;
 import com.android.internal.widget.ScrollBarUtils;
@@ -167,6 +168,7 @@
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
+import java.util.Queue;
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.function.Predicate;
@@ -1311,7 +1313,6 @@
      */
     public static final int AUTOFILL_TYPE_LIST = 3;
 
-
     /**
      * Autofill type for a field that contains a date, which is represented by a long representing
      * the number of milliseconds since the standard base time known as "the epoch", namely
@@ -1441,6 +1442,58 @@
      */
     public static final int IMPORTANT_FOR_CONTENT_CAPTURE_NO_EXCLUDE_DESCENDANTS = 0x8;
 
+    /** {@hide} */
+    @IntDef(flag = true, prefix = {"SCROLL_CAPTURE_HINT_"},
+            value = {
+                    SCROLL_CAPTURE_HINT_AUTO,
+                    SCROLL_CAPTURE_HINT_EXCLUDE,
+                    SCROLL_CAPTURE_HINT_INCLUDE,
+                    SCROLL_CAPTURE_HINT_EXCLUDE_DESCENDANTS
+    })
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface ScrollCaptureHint {}
+
+    /**
+     * The content of this view will be considered for scroll capture if scrolling is possible.
+     *
+     * @see #getScrollCaptureHint()
+     * @see #setScrollCaptureHint(int)
+     * @hide
+     */
+    public static final int SCROLL_CAPTURE_HINT_AUTO = 0;
+
+    /**
+     * Explicitly exclcude this view as a potential scroll capture target. The system will not
+     * consider it. Mutually exclusive with {@link #SCROLL_CAPTURE_HINT_INCLUDE}, which this flag
+     * takes precedence over.
+     *
+     * @see #getScrollCaptureHint()
+     * @see #setScrollCaptureHint(int)
+     * @hide
+     */
+    public static final int SCROLL_CAPTURE_HINT_EXCLUDE = 0x1;
+
+    /**
+     * Explicitly include this view as a potential scroll capture target. When locating a scroll
+     * capture target, this view will be prioritized before others without this flag. Mutually
+     * exclusive with {@link #SCROLL_CAPTURE_HINT_EXCLUDE}, which takes precedence.
+     *
+     * @see #getScrollCaptureHint()
+     * @see #setScrollCaptureHint(int)
+     * @hide
+     */
+    public static final int SCROLL_CAPTURE_HINT_INCLUDE = 0x2;
+
+    /**
+     * Explicitly exclude all children of this view as potential scroll capture targets. This view
+     * is unaffected. Note: Excluded children are not considered, regardless of {@link
+     * #SCROLL_CAPTURE_HINT_INCLUDE}.
+     *
+     * @see #getScrollCaptureHint()
+     * @see #setScrollCaptureHint(int)
+     * @hide
+     */
+    public static final int SCROLL_CAPTURE_HINT_EXCLUDE_DESCENDANTS = 0x4;
 
     /**
      * This view is enabled. Interpretation varies by subclass.
@@ -3430,6 +3483,7 @@
      *                         11       PFLAG4_CONTENT_CAPTURE_IMPORTANCE_MASK
      *                        1         PFLAG4_FRAMEWORK_OPTIONAL_FITS_SYSTEM_WINDOWS
      *                       1          PFLAG4_AUTOFILL_HIDE_HIGHLIGHT
+     *                     11           PFLAG4_SCROLL_CAPTURE_HINT_MASK
      * |-------|-------|-------|-------|
      */
 
@@ -3477,6 +3531,15 @@
      */
     private static final int PFLAG4_AUTOFILL_HIDE_HIGHLIGHT = 0x200;
 
+    /**
+     * Shift for the bits in {@link #mPrivateFlags4} related to scroll capture.
+     */
+    static final int PFLAG4_SCROLL_CAPTURE_HINT_SHIFT = 10;
+
+    static final int PFLAG4_SCROLL_CAPTURE_HINT_MASK = (SCROLL_CAPTURE_HINT_INCLUDE
+            | SCROLL_CAPTURE_HINT_EXCLUDE | SCROLL_CAPTURE_HINT_EXCLUDE_DESCENDANTS)
+            << PFLAG4_SCROLL_CAPTURE_HINT_SHIFT;
+
     /* End of masks for mPrivateFlags4 */
 
     /** @hide */
@@ -4690,6 +4753,11 @@
          * Used to track {@link #mSystemGestureExclusionRects}
          */
         public RenderNode.PositionUpdateListener mPositionUpdateListener;
+
+        /**
+         * Allows the application to implement custom scroll capture support.
+         */
+        ScrollCaptureCallback mScrollCaptureCallback;
     }
 
     @UnsupportedAppUsage
@@ -5941,6 +6009,9 @@
                 case R.styleable.View_forceDarkAllowed:
                     mRenderNode.setForceDarkAllowed(a.getBoolean(attr, true));
                     break;
+                case R.styleable.View_scrollCaptureHint:
+                    setScrollCaptureHint((a.getInt(attr, SCROLL_CAPTURE_HINT_AUTO)));
+                    break;
             }
         }
 
@@ -29091,6 +29162,11 @@
         int mLeashedParentAccessibilityViewId;
 
         /**
+         *
+         */
+        ScrollCaptureInternal mScrollCaptureInternal;
+
+        /**
          * Creates a new set of attachment information with the specified
          * events handler and thread.
          *
@@ -29150,6 +29226,14 @@
 
             return events;
         }
+
+        @Nullable
+        ScrollCaptureInternal getScrollCaptureInternal() {
+            if (mScrollCaptureInternal != null) {
+                mScrollCaptureInternal = new ScrollCaptureInternal();
+            }
+            return mScrollCaptureInternal;
+        }
     }
 
     /**
@@ -29683,6 +29767,104 @@
         }
     }
 
+
+    /**
+     * Returns the current scroll capture hint for this view.
+     *
+     * @return the current scroll capture hint
+     *
+     * @hide
+     */
+    @ScrollCaptureHint
+    public int getScrollCaptureHint() {
+        return (mPrivateFlags4 & PFLAG4_SCROLL_CAPTURE_HINT_MASK)
+                >> PFLAG4_SCROLL_CAPTURE_HINT_SHIFT;
+    }
+
+    /**
+     * Sets the scroll capture hint for this View. These flags affect the search for a potential
+     * scroll capture targets.
+     *
+     * @param hint the scrollCaptureHint flags value to set
+     *
+     * @hide
+     */
+    public void setScrollCaptureHint(@ScrollCaptureHint int hint) {
+        mPrivateFlags4 &= ~PFLAG4_SCROLL_CAPTURE_HINT_MASK;
+        mPrivateFlags4 |= ((hint << PFLAG4_SCROLL_CAPTURE_HINT_SHIFT)
+                & PFLAG4_SCROLL_CAPTURE_HINT_MASK);
+    }
+
+    /**
+     * Sets the callback to receive scroll capture requests. This component is the adapter between
+     * the scroll capture API and application UI code. If no callback is set, the system may provide
+     * an implementation. Any value provided here will take precedence over a system version.
+     * <p>
+     * This view will be ignored when {@link #SCROLL_CAPTURE_HINT_EXCLUDE} is set in its {@link
+     * #setScrollCaptureHint(int) scrollCaptureHint}, regardless whether a callback has been set.
+     * <p>
+     * It is recommended to set the scroll capture hint {@link #SCROLL_CAPTURE_HINT_INCLUDE} when
+     * setting a custom callback to help ensure it is selected as the target.
+     *
+     * @param callback the new callback to assign
+     *
+     * @hide
+     */
+    public void setScrollCaptureCallback(@Nullable ScrollCaptureCallback callback) {
+        getListenerInfo().mScrollCaptureCallback = callback;
+    }
+
+    /** {@hide} */
+    @Nullable
+    public ScrollCaptureCallback createScrollCaptureCallbackInternal(@NonNull Rect localVisibleRect,
+            @NonNull Point windowOffset) {
+        if (mAttachInfo == null) {
+            return null;
+        }
+        if (mAttachInfo.mScrollCaptureInternal == null) {
+            mAttachInfo.mScrollCaptureInternal = new ScrollCaptureInternal();
+        }
+        return mAttachInfo.mScrollCaptureInternal.requestCallback(this, localVisibleRect,
+                windowOffset);
+    }
+
+    /**
+     * Called when scroll capture is requested, to search for appropriate content to scroll. If
+     * applicable, this view adds itself to the provided list for consideration, subject to the
+     * flags set by {@link #setScrollCaptureHint}.
+     *
+     * @param localVisibleRect the local visible rect of this view
+     * @param windowOffset     the offset of localVisibleRect within the window
+     * @param targets          a queue which collects potential targets
+     *
+     * @throws IllegalStateException if this view is not attached to a window
+     * @hide
+     */
+    public void dispatchScrollCaptureSearch(@NonNull Rect localVisibleRect,
+            @NonNull Point windowOffset, @NonNull Queue<ScrollCaptureTarget> targets) {
+        int hint = getScrollCaptureHint();
+        if ((hint & SCROLL_CAPTURE_HINT_EXCLUDE) != 0) {
+            return;
+        }
+
+        // Get a callback provided by the framework, library or application.
+        ScrollCaptureCallback callback =
+                (mListenerInfo == null) ? null : mListenerInfo.mScrollCaptureCallback;
+
+        // Try internal support for standard scrolling containers.
+        if (callback == null) {
+            callback = createScrollCaptureCallbackInternal(localVisibleRect, windowOffset);
+        }
+
+        // If found, then add it to the list.
+        if (callback != null) {
+            // Add to the list for consideration
+            Point offset = new Point(windowOffset.x, windowOffset.y);
+            Rect rect = new Rect(localVisibleRect);
+            targets.add(new ScrollCaptureTarget(this, rect, offset, callback));
+        }
+    }
+
     /**
      * Dump all private flags in readable format, useful for documentation and
      * sanity checking.
diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java
index e34e84c..7935eb1 100644
--- a/core/java/android/view/ViewGroup.java
+++ b/core/java/android/view/ViewGroup.java
@@ -40,6 +40,7 @@
 import android.graphics.Insets;
 import android.graphics.Matrix;
 import android.graphics.Paint;
+import android.graphics.Point;
 import android.graphics.PointF;
 import android.graphics.Rect;
 import android.graphics.RectF;
@@ -75,6 +76,7 @@
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Queue;
 import java.util.function.Predicate;
 
 /**
@@ -188,7 +190,16 @@
     private PointF mLocalPoint;
 
     // Lazily-created holder for point computations.
-    private float[] mTempPoint;
+    private float[] mTempPosition;
+
+    // Lazily-created holder for point computations.
+    private Point mTempPoint;
+
+    // Lazily created Rect for dispatch to children
+    private Rect mTempRect;
+
+    // Lazily created int[2] for dispatch to children
+    private int[] mTempLocation;
 
     // Layout animation
     private LayoutAnimationController mLayoutAnimationController;
@@ -1860,7 +1871,7 @@
         final float tx = mCurrentDragStartEvent.mX;
         final float ty = mCurrentDragStartEvent.mY;
 
-        final float[] point = getTempPoint();
+        final float[] point = getTempLocationF();
         point[0] = tx;
         point[1] = ty;
         transformPointToViewLocal(point, child);
@@ -2932,9 +2943,23 @@
         }
     }
 
-    private float[] getTempPoint() {
+    private Rect getTempRect() {
+        if (mTempRect == null) {
+            mTempRect = new Rect();
+        }
+        return mTempRect;
+    }
+
+    private float[] getTempLocationF() {
+        if (mTempPosition == null) {
+            mTempPosition = new float[2];
+        }
+        return mTempPosition;
+    }
+
+    private Point getTempPoint() {
         if (mTempPoint == null) {
-            mTempPoint = new float[2];
+            mTempPoint = new Point();
         }
         return mTempPoint;
     }
@@ -2948,7 +2973,7 @@
     @UnsupportedAppUsage
     protected boolean isTransformedTouchPointInView(float x, float y, View child,
             PointF outLocalPoint) {
-        final float[] point = getTempPoint();
+        final float[] point = getTempLocationF();
         point[0] = x;
         point[1] = y;
         transformPointToViewLocal(point, child);
@@ -4568,7 +4593,7 @@
             final boolean nonActionable = !child.isClickable() && !child.isLongClickable();
             final boolean duplicatesState = (child.mViewFlags & DUPLICATE_PARENT_STATE) != 0;
             if (nonActionable || duplicatesState) {
-                final float[] point = getTempPoint();
+                final float[] point = getTempLocationF();
                 point[0] = x;
                 point[1] = y;
                 transformPointToViewLocal(point, child);
@@ -7354,6 +7379,97 @@
     }
 
     /**
+     * Offsets the given rectangle in parent's local coordinates into child's coordinate space
+     * and clips the result to the child View's bounds, padding and clipRect if appropriate. If the
+     * resulting rectangle is not empty, the request is forwarded to the child.
+     * <p>
+     * Note: This method does not account for any static View transformations which may be
+     * applied to the child view.
+     *
+     * @param child            the child to dispatch to
+     * @param localVisibleRect the visible (clipped) area of this ViewGroup, in local coordinates
+     * @param windowOffset     the offset of localVisibleRect within the window
+     * @param targets          a queue to collect located targets
+     */
+    private void dispatchTransformedScrollCaptureSearch(View child, Rect localVisibleRect,
+            Point windowOffset, Queue<ScrollCaptureTarget> targets) {
+
+        // copy local visible rect for modification and dispatch
+        final Rect childVisibleRect = getTempRect();
+        childVisibleRect.set(localVisibleRect);
+
+        // transform to child coords
+        final Point childWindowOffset = getTempPoint();
+        childWindowOffset.set(windowOffset.x, windowOffset.y);
+
+        final int dx = child.mLeft - mScrollX;
+        final int dy = child.mTop - mScrollY;
+
+        childVisibleRect.offset(-dx, -dy);
+        childWindowOffset.offset(dx, dy);
+
+        boolean rectIsVisible = true;
+        final int width = mRight - mLeft;
+        final int height = mBottom - mTop;
+
+        // Clip to child bounds
+        if (getClipChildren()) {
+            rectIsVisible = childVisibleRect.intersect(0, 0, child.getWidth(), child.getHeight());
+        }
+
+        // Clip to child padding.
+        if (rectIsVisible && (child instanceof ViewGroup)
+                && ((ViewGroup) child).getClipToPadding()) {
+            rectIsVisible = childVisibleRect.intersect(
+                    child.mPaddingLeft, child.mPaddingTop,
+                    child.getWidth() - child.mPaddingRight,
+                    child.getHeight() - child.mPaddingBottom);
+        }
+        // Clip to child clipBounds.
+        if (rectIsVisible && child.mClipBounds != null) {
+            rectIsVisible = childVisibleRect.intersect(child.mClipBounds);
+        }
+        if (rectIsVisible) {
+            child.dispatchScrollCaptureSearch(childVisibleRect, childWindowOffset, targets);
+        }
+    }
+
+    /**
+     * Handle the scroll capture search request by checking this view if applicable, then to each
+     * child view.
+     *
+     * @param localVisibleRect the visible area of this ViewGroup in local coordinates, according to
+     *                         the parent
+     * @param windowOffset     the offset of this view within the window
+     * @param targets          the collected list of scroll capture targets
+     *
+     * @hide
+     */
+    @Override
+    public void dispatchScrollCaptureSearch(
+            @NonNull Rect localVisibleRect, @NonNull Point windowOffset,
+            @NonNull Queue<ScrollCaptureTarget> targets) {
+
+        // Dispatch to self first.
+        super.dispatchScrollCaptureSearch(localVisibleRect, windowOffset, targets);
+
+        // Then dispatch to children, if not excluding descendants.
+        if ((getScrollCaptureHint() & SCROLL_CAPTURE_HINT_EXCLUDE_DESCENDANTS) == 0) {
+            final int childCount = getChildCount();
+            for (int i = 0; i < childCount; i++) {
+                View child = getChildAt(i);
+                // Only visible views can be captured.
+                if (child.getVisibility() != View.VISIBLE) {
+                    continue;
+                }
+                // Transform to child coords and dispatch
+                dispatchTransformedScrollCaptureSearch(child, localVisibleRect, windowOffset,
+                        targets);
+            }
+        }
+    }
+
+    /**
      * Returns the animation listener to which layout animation events are
      * sent.
      *
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index ed1edc3..9d275cd 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -206,6 +206,7 @@
     private static final boolean DEBUG_INPUT_STAGES = false || LOCAL_LOGV;
     private static final boolean DEBUG_KEEP_SCREEN_ON = false || LOCAL_LOGV;
     private static final boolean DEBUG_CONTENT_CAPTURE = false || LOCAL_LOGV;
+    private static final boolean DEBUG_SCROLL_CAPTURE = false || LOCAL_LOGV;
 
     /**
      * Set to false if we do not want to use the multi threaded renderer even though
@@ -653,6 +654,8 @@
     private final InsetsController mInsetsController;
     private final ImeFocusController mImeFocusController;
 
+    private ScrollCaptureClient mScrollCaptureClient;
+
     /**
      * @return {@link ImeFocusController} for this instance.
      */
@@ -661,6 +664,11 @@
         return mImeFocusController;
     }
 
+    /** @return The current {@link ScrollCaptureClient} for this instance, if any is active. */
+    @Nullable
+    public ScrollCaptureClient getScrollCaptureClient() {
+        return mScrollCaptureClient;
+    }
 
     private final GestureExclusionTracker mGestureExclusionTracker = new GestureExclusionTracker();
 
@@ -694,6 +702,8 @@
     // draw returns.
     private SurfaceControl.Transaction mRtBLASTSyncTransaction = new SurfaceControl.Transaction();
 
+    private HashSet<ScrollCaptureCallback> mRootScrollCaptureCallbacks;
+
     private String mTag = TAG;
 
     public ViewRootImpl(Context context, Display display) {
@@ -3769,7 +3779,9 @@
                 mNextReportConsumeBLAST = true;
                 mNextDrawUseBLASTSyncTransaction = false;
 
-                mBlastBufferQueue.setNextTransaction(mRtBLASTSyncTransaction);
+                if (mBlastBufferQueue != null) {
+                    mBlastBufferQueue.setNextTransaction(mRtBLASTSyncTransaction);
+                }
             }
             boolean canUseAsync = draw(fullRedrawNeeded);
             if (usingAsyncReport && !canUseAsync) {
@@ -4778,6 +4790,7 @@
     private static final int MSG_LOCATION_IN_PARENT_DISPLAY_CHANGED = 33;
     private static final int MSG_SHOW_INSETS = 34;
     private static final int MSG_HIDE_INSETS = 35;
+    private static final int MSG_REQUEST_SCROLL_CAPTURE = 36;
 
 
     final class ViewRootHandler extends Handler {
@@ -5080,6 +5093,9 @@
                 case MSG_LOCATION_IN_PARENT_DISPLAY_CHANGED: {
                     updateLocationInParentDisplay(msg.arg1, msg.arg2);
                 } break;
+                case MSG_REQUEST_SCROLL_CAPTURE:
+                    handleScrollCaptureRequest((IScrollCaptureController) msg.obj);
+                    break;
             }
         }
     }
@@ -8789,6 +8805,131 @@
         return false;
     }
 
+    /**
+     * Adds a scroll capture callback to this window.
+     *
+     * @param callback the callback to add
+     */
+    public void addScrollCaptureCallback(ScrollCaptureCallback callback) {
+        if (mRootScrollCaptureCallbacks == null) {
+            mRootScrollCaptureCallbacks = new HashSet<>();
+        }
+        mRootScrollCaptureCallbacks.add(callback);
+    }
+
+    /**
+     * Removes a scroll capture callback from this window.
+     *
+     * @param callback the callback to remove
+     */
+    public void removeScrollCaptureCallback(ScrollCaptureCallback callback) {
+        if (mRootScrollCaptureCallbacks != null) {
+            mRootScrollCaptureCallbacks.remove(callback);
+            if (mRootScrollCaptureCallbacks.isEmpty()) {
+                mRootScrollCaptureCallbacks = null;
+            }
+        }
+    }
+
+    /**
+     * Dispatches a scroll capture request to the view hierarchy on the ui thread.
+     *
+     * @param controller the controller to receive replies
+     */
+    public void dispatchScrollCaptureRequest(@NonNull IScrollCaptureController controller) {
+        mHandler.obtainMessage(MSG_REQUEST_SCROLL_CAPTURE, controller).sendToTarget();
+    }
+
+    /**
+     * Collect and include any ScrollCaptureCallback instances registered with the window.
+     *
+     * @see #addScrollCaptureCallback(ScrollCaptureCallback)
+     * @param targets the search queue for targets
+     */
+    private void collectRootScrollCaptureTargets(Queue<ScrollCaptureTarget> targets) {
+        for (ScrollCaptureCallback cb : mRootScrollCaptureCallbacks) {
+            // Add to the list for consideration
+            Point offset = new Point(mView.getLeft(), mView.getTop());
+            Rect rect = new Rect(0, 0, mView.getWidth(), mView.getHeight());
+            targets.add(new ScrollCaptureTarget(mView, rect, offset, cb));
+        }
+    }
+
+    /**
+     * Handles an inbound request for scroll capture from the system. If a client is not already
+     * active, a search will be dispatched through the view tree to locate scrolling content.
+     * <p>
+     * Either {@link IScrollCaptureController#onClientConnected(IScrollCaptureClient, Rect,
+     * Point)} or {@link IScrollCaptureController#onClientUnavailable()} will be returned
+     * depending on the results of the search.
+     *
+     * @param controller the interface to the system controller
+     * @see ScrollCaptureTargetResolver
+     */
+    private void handleScrollCaptureRequest(@NonNull IScrollCaptureController controller) {
+        LinkedList<ScrollCaptureTarget> targetList = new LinkedList<>();
+
+        // Window (root) level callbacks
+        collectRootScrollCaptureTargets(targetList);
+
+        // Search through View-tree
+        View rootView = getView();
+        Point point = new Point();
+        Rect rect = new Rect(0, 0, rootView.getWidth(), rootView.getHeight());
+        getChildVisibleRect(rootView, rect, point);
+        rootView.dispatchScrollCaptureSearch(rect, point, targetList);
+
+        // No-op path. Scroll capture not offered for this window.
+        if (targetList.isEmpty()) {
+            dispatchScrollCaptureSearchResult(controller, null);
+            return;
+        }
+
+        // Request scrollBounds from each of the targets.
+        // Continues with the consumer once all responses are consumed, or the timeout expires.
+        ScrollCaptureTargetResolver resolver = new ScrollCaptureTargetResolver(targetList);
+        resolver.start(mHandler, 1000,
+                (selected) -> dispatchScrollCaptureSearchResult(controller, selected));
+    }
+
+    /** Called by {@link #handleScrollCaptureRequest} when a result is returned */
+    private void dispatchScrollCaptureSearchResult(
+            @NonNull IScrollCaptureController controller,
+            @Nullable ScrollCaptureTarget selectedTarget) {
+
+        // If timeout or no eligible targets found.
+        if (selectedTarget == null) {
+            try {
+                if (DEBUG_SCROLL_CAPTURE) {
+                    Log.d(TAG, "scrollCaptureSearch returned no targets available.");
+                }
+                controller.onClientUnavailable();
+            } catch (RemoteException e) {
+                if (DEBUG_SCROLL_CAPTURE) {
+                    Log.w(TAG, "Failed to notify controller of scroll capture search result.", e);
+                }
+            }
+            return;
+        }
+
+        // Create a client instance and return it to the caller
+        mScrollCaptureClient = new ScrollCaptureClient(selectedTarget, controller);
+        try {
+            if (DEBUG_SCROLL_CAPTURE) {
+                Log.d(TAG, "scrollCaptureSearch returning client: " + getScrollCaptureClient());
+            }
+            controller.onClientConnected(
+                    mScrollCaptureClient,
+                    selectedTarget.getScrollBounds(),
+                    selectedTarget.getPositionInWindow());
+        } catch (RemoteException e) {
+            if (DEBUG_SCROLL_CAPTURE) {
+                Log.w(TAG, "Failed to notify controller of scroll capture search result.", e);
+            }
+            mScrollCaptureClient.disconnect();
+            mScrollCaptureClient = null;
+        }
+    }
 
     private void reportNextDraw() {
         if (mReportNextDraw == false) {
@@ -9091,6 +9232,13 @@
             }
         }
 
+        @Override
+        public void requestScrollCapture(IScrollCaptureController controller) {
+            final ViewRootImpl viewAncestor = mViewAncestor.get();
+            if (viewAncestor != null) {
+                viewAncestor.dispatchScrollCaptureRequest(controller);
+            }
+        }
     }
 
     public static final class CalledFromWrongThreadException extends AndroidRuntimeException {
diff --git a/core/java/android/view/Window.java b/core/java/android/view/Window.java
index ae9afaba..b153648 100644
--- a/core/java/android/view/Window.java
+++ b/core/java/android/view/Window.java
@@ -2535,6 +2535,33 @@
         return Collections.emptyList();
     }
 
+    /**
+     * System request to begin scroll capture.
+     *
+     * @param controller the controller to receive responses
+     * @hide
+     */
+    public void requestScrollCapture(IScrollCaptureController controller) {
+    }
+
+    /**
+     * Registers a {@link ScrollCaptureCallback} with the root of this window.
+     *
+     * @param callback the callback to add
+     * @hide
+     */
+    public void addScrollCaptureCallback(@NonNull ScrollCaptureCallback callback) {
+    }
+
+    /**
+     * Unregisters a {@link ScrollCaptureCallback} previously registered with this window.
+     *
+     * @param callback the callback to remove
+     * @hide
+     */
+    public void removeScrollCaptureCallback(@NonNull ScrollCaptureCallback callback) {
+    }
+
     /** @hide */
     public void setTheme(int resId) {
     }
diff --git a/core/java/android/view/WindowInsets.java b/core/java/android/view/WindowInsets.java
index ca3dd04..aad1c60 100644
--- a/core/java/android/view/WindowInsets.java
+++ b/core/java/android/view/WindowInsets.java
@@ -473,6 +473,12 @@
     /**
      * Returns the display cutout if there is one.
      *
+     * <p>Note: the display cutout will already be {@link #consumeDisplayCutout consumed} during
+     * dispatch to {@link View#onApplyWindowInsets}, unless the window has requested a
+     * {@link WindowManager.LayoutParams#layoutInDisplayCutoutMode} other than
+     * {@link WindowManager.LayoutParams#LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER never} or
+     * {@link WindowManager.LayoutParams#LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT default}.
+     *
      * @return the display cutout or null if there is none
      * @see DisplayCutout
      */
@@ -1424,7 +1430,13 @@
         /**
          * Returns an insets type representing the area that used by {@link DisplayCutout}.
          *
-         * <p>This is equivalent to the safe insets on {@link #getDisplayCutout()}.</p>
+         * <p>This is equivalent to the safe insets on {@link #getDisplayCutout()}.
+         *
+         * <p>Note: During dispatch to {@link View#onApplyWindowInsets}, if the window is using
+         * the {@link WindowManager.LayoutParams#LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT default}
+         * {@link WindowManager.LayoutParams#layoutInDisplayCutoutMode}, {@link #getDisplayCutout()}
+         * will return {@code null} even if the window overlaps a display cutout area, in which case
+         * the {@link #displayCutout() displayCutout() inset} will still report the accurate value.
          *
          * @see DisplayCutout#getSafeInsetLeft()
          * @see DisplayCutout#getSafeInsetTop()
diff --git a/core/java/android/view/WindowInsetsAnimationController.java b/core/java/android/view/WindowInsetsAnimationController.java
index c191a54..fb9d05e 100644
--- a/core/java/android/view/WindowInsetsAnimationController.java
+++ b/core/java/android/view/WindowInsetsAnimationController.java
@@ -141,7 +141,10 @@
     /**
      * Finishes the animation, and leaves the windows shown or hidden.
      * <p>
-     * After invoking {@link #finish(boolean)}, this instance is no longer {@link #isReady ready}.
+     * After invoking {@link #finish}, this instance is no longer {@link #isReady ready}.
+     * <p>
+     * Note: Finishing an animation implicitly {@link #setInsetsAndAlpha sets insets and alpha}
+     * according to the requested end state without any further animation.
      *
      * @param shown if {@code true}, the windows will be shown after finishing the
      *              animation. Otherwise they will be hidden.
diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java
index cc380f3..e4dbd637 100644
--- a/core/java/android/view/WindowManager.java
+++ b/core/java/android/view/WindowManager.java
@@ -514,33 +514,24 @@
     int TAKE_SCREENSHOT_PROVIDED_IMAGE = 3;
 
     /**
-     * Parcel key for the screen shot bitmap sent with messages of type
-     * {@link #TAKE_SCREENSHOT_PROVIDED_IMAGE}, type {@link android.graphics.Bitmap}
+     * Enum listing the possible sources from which a screenshot was originated. Used for logging.
+     *
      * @hide
      */
-    String PARCEL_KEY_SCREENSHOT_BITMAP = "screenshot_screen_bitmap";
-
-    /**
-     * Parcel key for the screen bounds of the image sent with messages of type
-     * [@link {@link #TAKE_SCREENSHOT_PROVIDED_IMAGE}], type {@link Rect} in screen coordinates.
-     * @hide
-     */
-    String PARCEL_KEY_SCREENSHOT_BOUNDS = "screenshot_screen_bounds";
-
-    /**
-     * Parcel key for the task id of the task that the screen shot was taken of, sent with messages
-     * of type [@link {@link #TAKE_SCREENSHOT_PROVIDED_IMAGE}], type int.
-     * @hide
-     */
-    String PARCEL_KEY_SCREENSHOT_TASK_ID = "screenshot_task_id";
-
-    /**
-     * Parcel key for the visible insets of the image sent with messages of type
-     * [@link {@link #TAKE_SCREENSHOT_PROVIDED_IMAGE}], type {@link android.graphics.Insets} in
-     * screen coordinates.
-     * @hide
-     */
-    String PARCEL_KEY_SCREENSHOT_INSETS = "screenshot_insets";
+    @IntDef({ScreenshotSource.SCREENSHOT_GLOBAL_ACTIONS,
+            ScreenshotSource.SCREENSHOT_KEY_CHORD,
+            ScreenshotSource.SCREENSHOT_KEY_OTHER,
+            ScreenshotSource.SCREENSHOT_OVERVIEW,
+            ScreenshotSource.SCREENSHOT_ACCESSIBILITY_ACTIONS,
+            ScreenshotSource.SCREENSHOT_OTHER})
+    @interface ScreenshotSource {
+        int SCREENSHOT_GLOBAL_ACTIONS = 0;
+        int SCREENSHOT_KEY_CHORD = 1;
+        int SCREENSHOT_KEY_OTHER = 2;
+        int SCREENSHOT_OVERVIEW = 3;
+        int SCREENSHOT_ACCESSIBILITY_ACTIONS = 4;
+        int SCREENSHOT_OTHER = 5;
+    }
 
     /**
      * @hide
diff --git a/core/java/android/view/WindowManagerGlobal.java b/core/java/android/view/WindowManagerGlobal.java
index fba6a55..94591eaf 100644
--- a/core/java/android/view/WindowManagerGlobal.java
+++ b/core/java/android/view/WindowManagerGlobal.java
@@ -145,6 +145,7 @@
     public static final int ADD_INVALID_DISPLAY = -9;
     public static final int ADD_INVALID_TYPE = -10;
     public static final int ADD_INVALID_USER = -11;
+    public static final int ADD_TOO_MANY_TOKENS = -12;
 
     @UnsupportedAppUsage
     private static WindowManagerGlobal sDefaultWindowManager;
diff --git a/core/java/android/view/WindowlessWindowManager.java b/core/java/android/view/WindowlessWindowManager.java
index ec51301..397bce4 100644
--- a/core/java/android/view/WindowlessWindowManager.java
+++ b/core/java/android/view/WindowlessWindowManager.java
@@ -24,7 +24,6 @@
 import android.os.RemoteException;
 import android.util.Log;
 import android.util.MergedConfiguration;
-import android.view.IWindowSession;
 
 import java.util.HashMap;
 
diff --git a/core/java/android/view/accessibility/AccessibilityNodeInfo.java b/core/java/android/view/accessibility/AccessibilityNodeInfo.java
index 4980b33..6646c31 100644
--- a/core/java/android/view/accessibility/AccessibilityNodeInfo.java
+++ b/core/java/android/view/accessibility/AccessibilityNodeInfo.java
@@ -3437,6 +3437,7 @@
      * @hide
      */
     @UnsupportedAppUsage
+    @TestApi
     public long getSourceNodeId() {
         return mSourceNodeId;
     }
diff --git a/core/java/android/view/autofill/AutofillManager.java b/core/java/android/view/autofill/AutofillManager.java
index 83a7934..6d3dbfe 100644
--- a/core/java/android/view/autofill/AutofillManager.java
+++ b/core/java/android/view/autofill/AutofillManager.java
@@ -1258,13 +1258,6 @@
                 }
             }
 
-            if (mForAugmentedAutofillOnly) {
-                if (sVerbose) {
-                    Log.v(TAG,  "notifyValueChanged(): not notifying system server on "
-                            + "augmented-only mode");
-                }
-                return;
-            }
             if (!mEnabled || !isActiveLocked()) {
                 if (!startAutofillIfNeededLocked(view)) {
                     if (sVerbose) {
@@ -1299,10 +1292,6 @@
             return;
         }
         synchronized (mLock) {
-            if (mForAugmentedAutofillOnly) {
-                if (sVerbose) Log.v(TAG,  "notifyValueChanged(): ignoring on augmented only mode");
-                return;
-            }
             if (!mEnabled || !isActiveLocked()) {
                 if (sVerbose) {
                     Log.v(TAG, "notifyValueChanged(" + view.getAutofillId() + ":" + virtualId
diff --git a/core/java/android/view/inline/InlineContentView.java b/core/java/android/view/inline/InlineContentView.java
deleted file mode 100644
index 3df201c..0000000
--- a/core/java/android/view/inline/InlineContentView.java
+++ /dev/null
@@ -1,208 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.view.inline;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.content.Context;
-import android.graphics.PixelFormat;
-import android.util.AttributeSet;
-import android.view.SurfaceControl;
-import android.view.SurfaceControlViewHost;
-import android.view.SurfaceHolder;
-import android.view.SurfaceView;
-import android.view.ViewGroup;
-
-/**
- * This class represents a view that holds opaque content from another app that
- * you can inline in your UI.
- *
- * <p>Since the content presented by this view is from another security domain,it is
- * shown on a remote surface preventing the host application from accessing that content.
- * Also the host application cannot interact with the inlined content by injecting touch
- * events or clicking programmatically.
- *
- * <p>This view can be overlaid by other windows, i.e. redressed, but if this is the case
- * the inined UI would not be interactive. Sometimes this is desirable, e.g. animating
- * transitions.
- *
- * <p>By default the surface backing this view is shown on top of the hosting window such
- * that the inlined content is interactive. However, you can temporarily move the surface
- * under the hosting window which could be useful in some cases, e.g. animating transitions.
- * At this point the inlined content will not be interactive and the touch events would
- * be delivered to your app.
- *
- * @hide
- * @removed
- */
-public class InlineContentView extends ViewGroup {
-
-    /**
-     * Callback for observing the lifecycle of the surface control
-     * that manipulates the backing secure embedded UI surface.
-     */
-    public interface SurfaceControlCallback {
-        /**
-         * Called when the backing surface is being created.
-         *
-         * @param surfaceControl The surface control to manipulate the surface.
-         */
-        void onCreated(@NonNull SurfaceControl surfaceControl);
-
-        /**
-         * Called when the backing surface is being destroyed.
-         *
-         * @param surfaceControl The surface control to manipulate the surface.
-         */
-        void onDestroyed(@NonNull SurfaceControl surfaceControl);
-    }
-
-    private final @NonNull SurfaceHolder.Callback mSurfaceCallback = new SurfaceHolder.Callback() {
-        @Override
-        public void surfaceCreated(@NonNull SurfaceHolder holder) {
-            mSurfaceControlCallback.onCreated(mSurfaceView.getSurfaceControl());
-        }
-
-        @Override
-        public void surfaceChanged(@NonNull SurfaceHolder holder,
-                int format, int width, int height) {
-            /* do nothing */
-        }
-
-        @Override
-        public void surfaceDestroyed(@NonNull SurfaceHolder holder) {
-            mSurfaceControlCallback.onDestroyed(mSurfaceView.getSurfaceControl());
-        }
-    };
-
-    private final @NonNull SurfaceView mSurfaceView;
-
-    private @Nullable SurfaceControlCallback mSurfaceControlCallback;
-
-    /**
-     * @inheritDoc
-     *
-     * @hide
-     */
-    public InlineContentView(@NonNull Context context) {
-        this(context, null);
-    }
-
-    /**
-     * @inheritDoc
-     *
-     * @hide
-     */
-    public InlineContentView(@NonNull Context context, @Nullable AttributeSet attrs) {
-        this(context, attrs, 0);
-    }
-
-    /**
-     * @inheritDoc
-     *
-     * @hide
-     */
-    public InlineContentView(@NonNull Context context, @Nullable AttributeSet attrs,
-            int defStyleAttr) {
-        this(context, attrs, defStyleAttr, 0);
-    }
-
-    /**
-     * Gets the surface control. If the surface is not created this method
-     * returns {@code null}.
-     *
-     * @return The surface control.
-     *
-     * @see #setSurfaceControlCallback(SurfaceControlCallback) 
-     */
-    public @Nullable SurfaceControl getSurfaceControl() {
-        return mSurfaceView.getSurfaceControl();
-    }
-
-    /**
-     * @inheritDoc
-     *
-     * @hide
-     */
-    public InlineContentView(@NonNull Context context, @Nullable AttributeSet attrs,
-            int defStyleAttr, int defStyleRes) {
-        super(context, attrs, defStyleAttr, defStyleRes);
-        mSurfaceView = new SurfaceView(context, attrs, defStyleAttr, defStyleRes);
-        mSurfaceView.setZOrderOnTop(true);
-        mSurfaceView.getHolder().setFormat(PixelFormat.TRANSPARENT);
-        addView(mSurfaceView);
-    }
-
-    /**
-     * Sets the embedded UI.
-     * @param surfacePackage The embedded UI.
-     *
-     * @hide
-     */
-    public void setChildSurfacePackage(
-            @Nullable SurfaceControlViewHost.SurfacePackage surfacePackage) {
-        mSurfaceView.setChildSurfacePackage(surfacePackage);
-    }
-
-    @Override
-    public void onLayout(boolean changed, int l, int t, int r, int b) {
-        mSurfaceView.layout(0, 0, getMeasuredWidth(), getMeasuredHeight());
-    }
-
-    /**
-     * Sets a callback to observe the lifecycle of the surface control for
-     * managing the backing surface.
-     *
-     * @param callback The callback to set or {@code null} to clear.
-     */
-    public void setSurfaceControlCallback(@Nullable SurfaceControlCallback callback) {
-        if (mSurfaceControlCallback != null) {
-            mSurfaceView.getHolder().removeCallback(mSurfaceCallback);
-        }
-        mSurfaceControlCallback = callback;
-        if (mSurfaceControlCallback != null) {
-            mSurfaceView.getHolder().addCallback(mSurfaceCallback);
-        }
-    }
-
-    /**
-     * @return Whether the surface backing this view appears on top of its parent.
-     *
-     * @see #setZOrderedOnTop(boolean)
-     */
-    public boolean isZOrderedOnTop() {
-        return mSurfaceView.isZOrderedOnTop();
-    }
-
-    /**
-     * Controls whether the backing surface is placed on top of this view's window.
-     * Normally, it is placed on top of the window, to allow interaction
-     * with the inlined UI. Via this method, you can place the surface below the
-     * window. This means that all of the contents of the window this view is in
-     * will be visible on top of its surface.
-     *
-     * <p> The Z ordering can be changed dynamically if the backing surface is
-     * created, otherwise the ordering would be applied at surface construction time.
-     *
-     * @param onTop Whether to show the surface on top of this view's window.
-     *
-     * @see #isZOrderedOnTop()
-     */
-    public boolean setZOrderedOnTop(boolean onTop) {
-        return mSurfaceView.setZOrderedOnTop(onTop, /*allowDynamicChange*/ true);
-    }
-}
diff --git a/core/java/android/view/inline/InlinePresentationSpec.aidl b/core/java/android/view/inline/InlinePresentationSpec.aidl
deleted file mode 100644
index 680ee4e..0000000
--- a/core/java/android/view/inline/InlinePresentationSpec.aidl
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2019 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.view.inline;
-
-/**
- * @hide
- * @removed
- */
-parcelable InlinePresentationSpec;
diff --git a/core/java/android/view/inline/InlinePresentationSpec.java b/core/java/android/view/inline/InlinePresentationSpec.java
deleted file mode 100644
index d777cb8..0000000
--- a/core/java/android/view/inline/InlinePresentationSpec.java
+++ /dev/null
@@ -1,347 +0,0 @@
-/*
- * Copyright (C) 2019 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.view.inline;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.compat.annotation.UnsupportedAppUsage;
-import android.os.Bundle;
-import android.os.Parcelable;
-import android.util.Size;
-
-import com.android.internal.util.DataClass;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * This class represents the presentation specification by which an inline suggestion
- * should abide when constructing its UI. Since suggestions are inlined in a
- * host application while provided by another source, they need to be consistent
- * with the host's look at feel to allow building smooth and integrated UIs.
- *
- * @hide
- * @removed
- */
-@DataClass(genEqualsHashCode = true, genToString = true, genBuilder = true)
-public final class InlinePresentationSpec implements Parcelable {
-
-    /** The minimal size of the suggestion. */
-    @NonNull
-    private final Size mMinSize;
-    /** The maximal size of the suggestion. */
-    @NonNull
-    private final Size mMaxSize;
-
-    /**
-     * The extras encoding the UI style information. Defaults to {@code Bundle.EMPTY} in which case
-     * the default system UI style will be used.
-     */
-    @NonNull
-    private final Bundle mStyle;
-
-    private static Bundle defaultStyle() {
-        return Bundle.EMPTY;
-    }
-
-    /** @hide */
-    @DataClass.Suppress({"setMaxSize", "setMinSize"})
-    abstract static class BaseBuilder {
-    }
-
-    /**
-     * @hide
-     */
-    public android.widget.inline.InlinePresentationSpec toWidget() {
-        final android.widget.inline.InlinePresentationSpec.Builder builder =
-                new android.widget.inline.InlinePresentationSpec.Builder(
-                        getMinSize(), getMaxSize());
-        final Bundle style = getStyle();
-        if (style != null) {
-            builder.setStyle(style);
-        }
-        return builder.build();
-    }
-
-    /**
-     * @hide
-     */
-    public static android.view.inline.InlinePresentationSpec fromWidget(
-            android.widget.inline.InlinePresentationSpec widget) {
-        final android.view.inline.InlinePresentationSpec.Builder builder =
-                new android.view.inline.InlinePresentationSpec.Builder(
-                        widget.getMinSize(), widget.getMaxSize());
-        final Bundle style = widget.getStyle();
-        if (style != null) {
-            builder.setStyle(style);
-        }
-        return builder.build();
-    }
-
-    /**
-     * @hide
-     */
-    public static List<android.view.inline.InlinePresentationSpec> fromWidgets(
-            List<android.widget.inline.InlinePresentationSpec> widgets) {
-        final ArrayList<android.view.inline.InlinePresentationSpec> convertedSpecs =
-                new ArrayList<>();
-        for (int i = 0; i < widgets.size(); i++) {
-            convertedSpecs.add(fromWidget(widgets.get(i)));
-        }
-        return convertedSpecs;
-    }
-
-
-
-    // Code below generated by codegen v1.0.15.
-    //
-    // DO NOT MODIFY!
-    // CHECKSTYLE:OFF Generated code
-    //
-    // To regenerate run:
-    // $ codegen $ANDROID_BUILD_TOP/frameworks/base/core/java/android/view/inline/InlinePresentationSpec.java
-    //
-    // To exclude the generated code from IntelliJ auto-formatting enable (one-time):
-    //   Settings > Editor > Code Style > Formatter Control
-    //@formatter:off
-
-
-    @DataClass.Generated.Member
-    /* package-private */ InlinePresentationSpec(
-            @NonNull Size minSize,
-            @NonNull Size maxSize,
-            @NonNull Bundle style) {
-        this.mMinSize = minSize;
-        com.android.internal.util.AnnotationValidations.validate(
-                NonNull.class, null, mMinSize);
-        this.mMaxSize = maxSize;
-        com.android.internal.util.AnnotationValidations.validate(
-                NonNull.class, null, mMaxSize);
-        this.mStyle = style;
-        com.android.internal.util.AnnotationValidations.validate(
-                NonNull.class, null, mStyle);
-
-        // onConstructed(); // You can define this method to get a callback
-    }
-
-    /**
-     * The minimal size of the suggestion.
-     */
-    @UnsupportedAppUsage
-    @DataClass.Generated.Member
-    public @NonNull Size getMinSize() {
-        return mMinSize;
-    }
-
-    /**
-     * The maximal size of the suggestion.
-     */
-    @UnsupportedAppUsage
-    @DataClass.Generated.Member
-    public @NonNull Size getMaxSize() {
-        return mMaxSize;
-    }
-
-    /**
-     * The extras encoding the UI style information. Defaults to {@code Bundle.EMPTY} in which case
-     * the default system UI style will be used.
-     */
-    @DataClass.Generated.Member
-    public @NonNull Bundle getStyle() {
-        return mStyle;
-    }
-
-    @Override
-    @DataClass.Generated.Member
-    public String toString() {
-        // You can override field toString logic by defining methods like:
-        // String fieldNameToString() { ... }
-
-        return "InlinePresentationSpec { " +
-                "minSize = " + mMinSize + ", " +
-                "maxSize = " + mMaxSize + ", " +
-                "style = " + mStyle +
-        " }";
-    }
-
-    @Override
-    @DataClass.Generated.Member
-    public boolean equals(@Nullable Object o) {
-        // You can override field equality logic by defining either of the methods like:
-        // boolean fieldNameEquals(InlinePresentationSpec other) { ... }
-        // boolean fieldNameEquals(FieldType otherValue) { ... }
-
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-        @SuppressWarnings("unchecked")
-        InlinePresentationSpec that = (InlinePresentationSpec) o;
-        //noinspection PointlessBooleanExpression
-        return true
-                && java.util.Objects.equals(mMinSize, that.mMinSize)
-                && java.util.Objects.equals(mMaxSize, that.mMaxSize)
-                && java.util.Objects.equals(mStyle, that.mStyle);
-    }
-
-    @Override
-    @DataClass.Generated.Member
-    public int hashCode() {
-        // You can override field hashCode logic by defining methods like:
-        // int fieldNameHashCode() { ... }
-
-        int _hash = 1;
-        _hash = 31 * _hash + java.util.Objects.hashCode(mMinSize);
-        _hash = 31 * _hash + java.util.Objects.hashCode(mMaxSize);
-        _hash = 31 * _hash + java.util.Objects.hashCode(mStyle);
-        return _hash;
-    }
-
-    @Override
-    @DataClass.Generated.Member
-    public void writeToParcel(@NonNull android.os.Parcel dest, int flags) {
-        // You can override field parcelling by defining methods like:
-        // void parcelFieldName(Parcel dest, int flags) { ... }
-
-        dest.writeSize(mMinSize);
-        dest.writeSize(mMaxSize);
-        dest.writeBundle(mStyle);
-    }
-
-    @Override
-    @DataClass.Generated.Member
-    public int describeContents() { return 0; }
-
-    /** @hide */
-    @SuppressWarnings({"unchecked", "RedundantCast"})
-    @DataClass.Generated.Member
-    /* package-private */ InlinePresentationSpec(@NonNull android.os.Parcel in) {
-        // You can override field unparcelling by defining methods like:
-        // static FieldType unparcelFieldName(Parcel in) { ... }
-
-        Size minSize = (Size) in.readSize();
-        Size maxSize = (Size) in.readSize();
-        Bundle style = in.readBundle();
-
-        this.mMinSize = minSize;
-        com.android.internal.util.AnnotationValidations.validate(
-                NonNull.class, null, mMinSize);
-        this.mMaxSize = maxSize;
-        com.android.internal.util.AnnotationValidations.validate(
-                NonNull.class, null, mMaxSize);
-        this.mStyle = style;
-        com.android.internal.util.AnnotationValidations.validate(
-                NonNull.class, null, mStyle);
-
-        // onConstructed(); // You can define this method to get a callback
-    }
-
-    @DataClass.Generated.Member
-    public static final @NonNull Parcelable.Creator<InlinePresentationSpec> CREATOR
-            = new Parcelable.Creator<InlinePresentationSpec>() {
-        @Override
-        public InlinePresentationSpec[] newArray(int size) {
-            return new InlinePresentationSpec[size];
-        }
-
-        @Override
-        public InlinePresentationSpec createFromParcel(@NonNull android.os.Parcel in) {
-            return new InlinePresentationSpec(in);
-        }
-    };
-
-    /**
-     * A builder for {@link InlinePresentationSpec}
-     */
-    @SuppressWarnings("WeakerAccess")
-    @DataClass.Generated.Member
-    public static final class Builder extends BaseBuilder {
-
-        private @NonNull Size mMinSize;
-        private @NonNull Size mMaxSize;
-        private @NonNull Bundle mStyle;
-
-        private long mBuilderFieldsSet = 0L;
-
-        /**
-         * Creates a new Builder.
-         *
-         * @param minSize
-         *   The minimal size of the suggestion.
-         * @param maxSize
-         *   The maximal size of the suggestion.
-         */
-        @UnsupportedAppUsage
-        public Builder(
-                @NonNull Size minSize,
-                @NonNull Size maxSize) {
-            mMinSize = minSize;
-            com.android.internal.util.AnnotationValidations.validate(
-                    NonNull.class, null, mMinSize);
-            mMaxSize = maxSize;
-            com.android.internal.util.AnnotationValidations.validate(
-                    NonNull.class, null, mMaxSize);
-        }
-
-        /**
-         * The extras encoding the UI style information. Defaults to {@code Bundle.EMPTY} in which case
-         * the default system UI style will be used.
-         */
-        @DataClass.Generated.Member
-        public @NonNull Builder setStyle(@NonNull Bundle value) {
-            checkNotUsed();
-            mBuilderFieldsSet |= 0x4;
-            mStyle = value;
-            return this;
-        }
-
-        /** Builds the instance. This builder should not be touched after calling this! */
-        @UnsupportedAppUsage
-        @NonNull
-        public InlinePresentationSpec build() {
-            checkNotUsed();
-            mBuilderFieldsSet |= 0x8; // Mark builder used
-
-            if ((mBuilderFieldsSet & 0x4) == 0) {
-                mStyle = defaultStyle();
-            }
-            InlinePresentationSpec o = new InlinePresentationSpec(
-                    mMinSize,
-                    mMaxSize,
-                    mStyle);
-            return o;
-        }
-
-        private void checkNotUsed() {
-            if ((mBuilderFieldsSet & 0x8) != 0) {
-                throw new IllegalStateException(
-                        "This Builder should not be reused. Use a new Builder instance instead");
-            }
-        }
-    }
-
-    @DataClass.Generated(
-            time = 1585691139012L,
-            codegenVersion = "1.0.15",
-            sourceFile = "frameworks/base/core/java/android/view/inline/InlinePresentationSpec.java",
-            inputSignatures = "private final @android.annotation.NonNull android.util.Size mMinSize\nprivate final @android.annotation.NonNull android.util.Size mMaxSize\nprivate final @android.annotation.NonNull android.os.Bundle mStyle\nprivate static  android.os.Bundle defaultStyle()\npublic  android.widget.inline.InlinePresentationSpec toWidget()\npublic static  android.view.inline.InlinePresentationSpec fromWidget(android.widget.inline.InlinePresentationSpec)\npublic static  java.util.List<android.view.inline.InlinePresentationSpec> fromWidgets(java.util.List<android.widget.inline.InlinePresentationSpec>)\nclass InlinePresentationSpec extends java.lang.Object implements [android.os.Parcelable]\[email protected](genEqualsHashCode=true, genToString=true, genBuilder=true)\nclass BaseBuilder extends java.lang.Object implements []")
-    @Deprecated
-    private void __metadata() {}
-
-
-    //@formatter:on
-    // End of generated code
-
-}
diff --git a/core/java/android/view/inputmethod/InlineSuggestionInfo.java b/core/java/android/view/inputmethod/InlineSuggestionInfo.java
index 3e9ffa7..1c703ec 100644
--- a/core/java/android/view/inputmethod/InlineSuggestionInfo.java
+++ b/core/java/android/view/inputmethod/InlineSuggestionInfo.java
@@ -20,7 +20,6 @@
 import android.annotation.Nullable;
 import android.annotation.SuppressLint;
 import android.annotation.TestApi;
-import android.compat.annotation.UnsupportedAppUsage;
 import android.os.Parcelable;
 import android.widget.inline.InlinePresentationSpec;
 
@@ -87,17 +86,6 @@
         return new InlineSuggestionInfo(presentationSpec, source, autofillHints, type, isPinned);
     }
 
-    /**
-     * The presentation spec to which the inflated suggestion view abides.
-     *
-     * @hide
-     * @removed
-     */
-    @UnsupportedAppUsage
-    public @NonNull android.view.inline.InlinePresentationSpec getPresentationSpec() {
-        return android.view.inline.InlinePresentationSpec.fromWidget(mInlinePresentationSpec);
-    }
-
 
 
     // Code below generated by codegen v1.0.15.
@@ -358,10 +346,10 @@
     };
 
     @DataClass.Generated(
-            time = 1585633580662L,
+            time = 1586992414034L,
             codegenVersion = "1.0.15",
             sourceFile = "frameworks/base/core/java/android/view/inputmethod/InlineSuggestionInfo.java",
-            inputSignatures = "public static final @android.view.inputmethod.InlineSuggestionInfo.Source java.lang.String SOURCE_AUTOFILL\npublic static final @android.view.inputmethod.InlineSuggestionInfo.Source java.lang.String SOURCE_PLATFORM\npublic static final @android.view.inputmethod.InlineSuggestionInfo.Type java.lang.String TYPE_SUGGESTION\npublic static final @android.annotation.SuppressLint({\"IntentName\"}) @android.view.inputmethod.InlineSuggestionInfo.Type java.lang.String TYPE_ACTION\nprivate final @android.annotation.NonNull android.widget.inline.InlinePresentationSpec mInlinePresentationSpec\nprivate final @android.annotation.NonNull @android.view.inputmethod.InlineSuggestionInfo.Source java.lang.String mSource\nprivate final @android.annotation.Nullable java.lang.String[] mAutofillHints\nprivate final @android.annotation.NonNull @android.view.inputmethod.InlineSuggestionInfo.Type java.lang.String mType\nprivate final  boolean mPinned\npublic static @android.annotation.TestApi @android.annotation.NonNull android.view.inputmethod.InlineSuggestionInfo newInlineSuggestionInfo(android.widget.inline.InlinePresentationSpec,java.lang.String,java.lang.String[],java.lang.String,boolean)\npublic @android.compat.annotation.UnsupportedAppUsage @android.annotation.NonNull android.view.inline.InlinePresentationSpec getPresentationSpec()\nclass InlineSuggestionInfo extends java.lang.Object implements [android.os.Parcelable]\[email protected](genEqualsHashCode=true, genToString=true, genHiddenConstDefs=true, genHiddenConstructor=true)")
+            inputSignatures = "public static final @android.view.inputmethod.InlineSuggestionInfo.Source java.lang.String SOURCE_AUTOFILL\npublic static final @android.view.inputmethod.InlineSuggestionInfo.Source java.lang.String SOURCE_PLATFORM\npublic static final @android.view.inputmethod.InlineSuggestionInfo.Type java.lang.String TYPE_SUGGESTION\npublic static final @android.annotation.SuppressLint({\"IntentName\"}) @android.view.inputmethod.InlineSuggestionInfo.Type java.lang.String TYPE_ACTION\nprivate final @android.annotation.NonNull android.widget.inline.InlinePresentationSpec mInlinePresentationSpec\nprivate final @android.annotation.NonNull @android.view.inputmethod.InlineSuggestionInfo.Source java.lang.String mSource\nprivate final @android.annotation.Nullable java.lang.String[] mAutofillHints\nprivate final @android.annotation.NonNull @android.view.inputmethod.InlineSuggestionInfo.Type java.lang.String mType\nprivate final  boolean mPinned\npublic static @android.annotation.TestApi @android.annotation.NonNull android.view.inputmethod.InlineSuggestionInfo newInlineSuggestionInfo(android.widget.inline.InlinePresentationSpec,java.lang.String,java.lang.String[],java.lang.String,boolean)\nclass InlineSuggestionInfo extends java.lang.Object implements [android.os.Parcelable]\[email protected](genEqualsHashCode=true, genToString=true, genHiddenConstDefs=true, genHiddenConstructor=true)")
     @Deprecated
     private void __metadata() {}
 
diff --git a/core/java/android/view/inputmethod/InlineSuggestionsRequest.java b/core/java/android/view/inputmethod/InlineSuggestionsRequest.java
index af896fc..d282b56 100644
--- a/core/java/android/view/inputmethod/InlineSuggestionsRequest.java
+++ b/core/java/android/view/inputmethod/InlineSuggestionsRequest.java
@@ -19,7 +19,6 @@
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.app.ActivityThread;
-import android.compat.annotation.UnsupportedAppUsage;
 import android.os.Bundle;
 import android.os.IBinder;
 import android.os.LocaleList;
@@ -93,20 +92,6 @@
     private int mHostDisplayId;
 
     /**
-     * The {@link InlinePresentationSpec} for each suggestion in the response. If the max suggestion
-     * count is larger than the number of specs in the list, then the last spec is used for the
-     * remainder of the suggestions. The list should not be empty.
-     *
-     * @hide
-     * @removed
-     */
-    @UnsupportedAppUsage
-    @NonNull
-    public List<android.view.inline.InlinePresentationSpec> getPresentationSpecs() {
-        return android.view.inline.InlinePresentationSpec.fromWidgets(mInlinePresentationSpecs);
-    }
-
-    /**
      * @hide
      * @see {@link #mHostInputToken}.
      */
@@ -170,17 +155,6 @@
 
     /** @hide */
     abstract static class BaseBuilder {
-        /**
-         * @hide
-         * @removed
-         */
-        @UnsupportedAppUsage
-        @NonNull
-        public Builder addPresentationSpecs(
-                @NonNull android.view.inline.InlinePresentationSpec value) {
-            return ((Builder) this).addInlinePresentationSpecs(value.toWidget());
-        }
-
         abstract Builder setInlinePresentationSpecs(
                 @NonNull List<android.widget.inline.InlinePresentationSpec> specs);
 
@@ -608,10 +582,10 @@
     }
 
     @DataClass.Generated(
-            time = 1585768018462L,
+            time = 1586992395497L,
             codegenVersion = "1.0.15",
             sourceFile = "frameworks/base/core/java/android/view/inputmethod/InlineSuggestionsRequest.java",
-            inputSignatures = "public static final  int SUGGESTION_COUNT_UNLIMITED\nprivate final  int mMaxSuggestionCount\nprivate final @android.annotation.NonNull java.util.List<android.widget.inline.InlinePresentationSpec> mInlinePresentationSpecs\nprivate @android.annotation.NonNull java.lang.String mHostPackageName\nprivate @android.annotation.NonNull android.os.LocaleList mSupportedLocales\nprivate @android.annotation.NonNull android.os.Bundle mExtras\nprivate @android.annotation.Nullable android.os.IBinder mHostInputToken\nprivate  int mHostDisplayId\npublic @android.compat.annotation.UnsupportedAppUsage @android.annotation.NonNull java.util.List<android.view.inline.InlinePresentationSpec> getPresentationSpecs()\npublic  void setHostInputToken(android.os.IBinder)\nprivate  boolean extrasEquals(android.os.Bundle)\nprivate  void parcelHostInputToken(android.os.Parcel,int)\nprivate @android.annotation.Nullable android.os.IBinder unparcelHostInputToken(android.os.Parcel)\npublic  void setHostDisplayId(int)\nprivate  void onConstructed()\nprivate static  int defaultMaxSuggestionCount()\nprivate static  java.lang.String defaultHostPackageName()\nprivate static  android.os.LocaleList defaultSupportedLocales()\nprivate static @android.annotation.Nullable android.os.IBinder defaultHostInputToken()\nprivate static @android.annotation.Nullable int defaultHostDisplayId()\nprivate static @android.annotation.NonNull android.os.Bundle defaultExtras()\nclass InlineSuggestionsRequest extends java.lang.Object implements [android.os.Parcelable]\[email protected](genEqualsHashCode=true, genToString=true, genBuilder=true)\npublic @android.compat.annotation.UnsupportedAppUsage @android.annotation.NonNull android.view.inputmethod.InlineSuggestionsRequest.Builder addPresentationSpecs(android.view.inline.InlinePresentationSpec)\nabstract  android.view.inputmethod.InlineSuggestionsRequest.Builder setInlinePresentationSpecs(java.util.List<android.widget.inline.InlinePresentationSpec>)\nabstract  android.view.inputmethod.InlineSuggestionsRequest.Builder setHostPackageName(java.lang.String)\nabstract  android.view.inputmethod.InlineSuggestionsRequest.Builder setHostInputToken(android.os.IBinder)\nabstract  android.view.inputmethod.InlineSuggestionsRequest.Builder setHostDisplayId(int)\nclass BaseBuilder extends java.lang.Object implements []")
+            inputSignatures = "public static final  int SUGGESTION_COUNT_UNLIMITED\nprivate final  int mMaxSuggestionCount\nprivate final @android.annotation.NonNull java.util.List<android.widget.inline.InlinePresentationSpec> mInlinePresentationSpecs\nprivate @android.annotation.NonNull java.lang.String mHostPackageName\nprivate @android.annotation.NonNull android.os.LocaleList mSupportedLocales\nprivate @android.annotation.NonNull android.os.Bundle mExtras\nprivate @android.annotation.Nullable android.os.IBinder mHostInputToken\nprivate  int mHostDisplayId\npublic  void setHostInputToken(android.os.IBinder)\nprivate  boolean extrasEquals(android.os.Bundle)\nprivate  void parcelHostInputToken(android.os.Parcel,int)\nprivate @android.annotation.Nullable android.os.IBinder unparcelHostInputToken(android.os.Parcel)\npublic  void setHostDisplayId(int)\nprivate  void onConstructed()\nprivate static  int defaultMaxSuggestionCount()\nprivate static  java.lang.String defaultHostPackageName()\nprivate static  android.os.LocaleList defaultSupportedLocales()\nprivate static @android.annotation.Nullable android.os.IBinder defaultHostInputToken()\nprivate static @android.annotation.Nullable int defaultHostDisplayId()\nprivate static @android.annotation.NonNull android.os.Bundle defaultExtras()\nclass InlineSuggestionsRequest extends java.lang.Object implements [android.os.Parcelable]\[email protected](genEqualsHashCode=true, genToString=true, genBuilder=true)\nabstract  android.view.inputmethod.InlineSuggestionsRequest.Builder setInlinePresentationSpecs(java.util.List<android.widget.inline.InlinePresentationSpec>)\nabstract  android.view.inputmethod.InlineSuggestionsRequest.Builder setHostPackageName(java.lang.String)\nabstract  android.view.inputmethod.InlineSuggestionsRequest.Builder setHostInputToken(android.os.IBinder)\nabstract  android.view.inputmethod.InlineSuggestionsRequest.Builder setHostDisplayId(int)\nclass BaseBuilder extends java.lang.Object implements []")
     @Deprecated
     private void __metadata() {}
 
diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java
index 9f03d95..16e87f8 100644
--- a/core/java/android/widget/AbsListView.java
+++ b/core/java/android/widget/AbsListView.java
@@ -5863,6 +5863,7 @@
         case KeyEvent.KEYCODE_DPAD_RIGHT:
         case KeyEvent.KEYCODE_DPAD_CENTER:
         case KeyEvent.KEYCODE_ENTER:
+        case KeyEvent.KEYCODE_NUMPAD_ENTER:
             okToSend = false;
             break;
         case KeyEvent.KEYCODE_BACK:
diff --git a/core/java/android/widget/AutoCompleteTextView.java b/core/java/android/widget/AutoCompleteTextView.java
index 8d9ae58..00526d9 100644
--- a/core/java/android/widget/AutoCompleteTextView.java
+++ b/core/java/android/widget/AutoCompleteTextView.java
@@ -821,6 +821,7 @@
             // was a click, the text view gets the selected item
             // from the drop down as its content
             case KeyEvent.KEYCODE_ENTER:
+            case KeyEvent.KEYCODE_NUMPAD_ENTER:
             case KeyEvent.KEYCODE_DPAD_CENTER:
             case KeyEvent.KEYCODE_TAB:
                 if (event.hasNoModifiers()) {
diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java
index 62dd192..51d37a5 100644
--- a/core/java/android/widget/Editor.java
+++ b/core/java/android/widget/Editor.java
@@ -5440,6 +5440,9 @@
 
         @Override
         public boolean onTouchEvent(MotionEvent ev) {
+            if (!mTextView.isFromPrimePointer(ev, true)) {
+                return true;
+            }
             if (mFlagInsertionHandleGesturesEnabled && mFlagCursorDragFromAnywhereEnabled) {
                 // Should only enable touch through when cursor drag is enabled.
                 // Otherwise the insertion handle view cannot be moved.
@@ -5908,6 +5911,9 @@
 
         @Override
         public boolean onTouchEvent(MotionEvent event) {
+            if (!mTextView.isFromPrimePointer(event, true)) {
+                return true;
+            }
             boolean superResult = super.onTouchEvent(event);
 
             switch (event.getActionMasked()) {
diff --git a/core/java/android/widget/ListPopupWindow.java b/core/java/android/widget/ListPopupWindow.java
old mode 100644
new mode 100755
index 8595fec..6425cf1
--- a/core/java/android/widget/ListPopupWindow.java
+++ b/core/java/android/widget/ListPopupWindow.java
@@ -1005,6 +1005,7 @@
                         case KeyEvent.KEYCODE_DPAD_CENTER:
                         case KeyEvent.KEYCODE_DPAD_DOWN:
                         case KeyEvent.KEYCODE_DPAD_UP:
+                        case KeyEvent.KEYCODE_NUMPAD_ENTER:
                             return true;
                     }
                 } else {
diff --git a/core/java/android/widget/NumberPicker.java b/core/java/android/widget/NumberPicker.java
index e9e0c14..baaf2a7 100644
--- a/core/java/android/widget/NumberPicker.java
+++ b/core/java/android/widget/NumberPicker.java
@@ -1033,6 +1033,7 @@
         switch (keyCode) {
             case KeyEvent.KEYCODE_DPAD_CENTER:
             case KeyEvent.KEYCODE_ENTER:
+            case KeyEvent.KEYCODE_NUMPAD_ENTER:
                 removeAllCallbacks();
                 break;
             case KeyEvent.KEYCODE_DPAD_DOWN:
diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java
index 4a27d3a0..7016c5c 100644
--- a/core/java/android/widget/RemoteViews.java
+++ b/core/java/android/widget/RemoteViews.java
@@ -29,7 +29,6 @@
 import android.app.PendingIntent;
 import android.app.RemoteInput;
 import android.appwidget.AppWidgetHostView;
-import android.appwidget.AppWidgetManager;
 import android.compat.annotation.UnsupportedAppUsage;
 import android.content.Context;
 import android.content.ContextWrapper;
@@ -1214,7 +1213,7 @@
 
         BitmapReflectionAction(Parcel in) {
             viewId = in.readInt();
-            methodName = in.readString();
+            methodName = in.readString8();
             bitmapId = in.readInt();
             bitmap = mBitmapCache.getBitmapForId(bitmapId);
         }
@@ -1222,7 +1221,7 @@
         @Override
         public void writeToParcel(Parcel dest, int flags) {
             dest.writeInt(viewId);
-            dest.writeString(methodName);
+            dest.writeString8(methodName);
             dest.writeInt(bitmapId);
         }
 
@@ -1283,7 +1282,7 @@
 
         ReflectionAction(Parcel in) {
             this.viewId = in.readInt();
-            this.methodName = in.readString();
+            this.methodName = in.readString8();
             this.type = in.readInt();
             //noinspection ConstantIfStatement
             if (false) {
@@ -1319,7 +1318,7 @@
                     this.value = (char)in.readInt();
                     break;
                 case STRING:
-                    this.value = in.readString();
+                    this.value = in.readString8();
                     break;
                 case CHAR_SEQUENCE:
                     this.value = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
@@ -1348,7 +1347,7 @@
 
         public void writeToParcel(Parcel out, int flags) {
             out.writeInt(this.viewId);
-            out.writeString(this.methodName);
+            out.writeString8(this.methodName);
             out.writeInt(this.type);
             //noinspection ConstantIfStatement
             if (false) {
@@ -1384,7 +1383,7 @@
                     out.writeInt((int)((Character)this.value).charValue());
                     break;
                 case STRING:
-                    out.writeString((String)this.value);
+                    out.writeString8((String)this.value);
                     break;
                 case CHAR_SEQUENCE:
                     TextUtils.writeToParcel((CharSequence)this.value, out, flags);
@@ -4131,18 +4130,8 @@
             // The NEW_TASK flags are applied through the activity options and not as a part of
             // the call to startIntentSender() to ensure that they are consistently applied to
             // both mutable and immutable PendingIntents.
-            final IntentSender intentSender = pendingIntent.getIntentSender();
-            final int uid = intentSender.getCreatorUid();
-            final String packageName = intentSender.getCreatorPackage();
-            if (uid != -1 && packageName != null) {
-                final AppWidgetManager appWidgetManager =
-                        context.getSystemService(AppWidgetManager.class);
-                if (appWidgetManager != null) {
-                    appWidgetManager.noteAppWidgetTapped(uid, packageName);
-                }
-            }
             context.startIntentSender(
-                    intentSender, options.first,
+                    pendingIntent.getIntentSender(), options.first,
                     0, 0, 0, options.second.toBundle());
         } catch (IntentSender.SendIntentException e) {
             Log.e(LOG_TAG, "Cannot send pending intent: ", e);
diff --git a/core/java/android/widget/SearchView.java b/core/java/android/widget/SearchView.java
old mode 100644
new mode 100755
index 15959c2..6ef570c
--- a/core/java/android/widget/SearchView.java
+++ b/core/java/android/widget/SearchView.java
@@ -1076,7 +1076,8 @@
             // The search key is handled by the dialog's onKeyDown().
             if (!mSearchSrcTextView.isEmpty() && event.hasNoModifiers()) {
                 if (event.getAction() == KeyEvent.ACTION_UP) {
-                    if (keyCode == KeyEvent.KEYCODE_ENTER) {
+                    if (keyCode == KeyEvent.KEYCODE_ENTER
+                            || keyCode == KeyEvent.KEYCODE_NUMPAD_ENTER) {
                         v.cancelLongPress();
 
                         // Launch as a regular search.
diff --git a/core/java/android/widget/SelectionActionModeHelper.java b/core/java/android/widget/SelectionActionModeHelper.java
index 45943f5..a069e643 100644
--- a/core/java/android/widget/SelectionActionModeHelper.java
+++ b/core/java/android/widget/SelectionActionModeHelper.java
@@ -104,16 +104,43 @@
     }
 
     /**
+     * Swap the selection index if the start index is greater than end index.
+     *
+     * @return the swap result, index 0 is the start index and index 1 is the end index.
+     */
+    private static int[] sortSelctionIndices(int selectionStart, int selectionEnd) {
+        if (selectionStart < selectionEnd) {
+            return new int[]{selectionStart, selectionEnd};
+        }
+        return new int[]{selectionEnd, selectionStart};
+    }
+
+    /**
+     * The {@link TextView} selection start and end index may not be sorted, this method will swap
+     * the {@link TextView} selection index if the start index is greater than end index.
+     *
+     * @param textView the selected TextView.
+     * @return the swap result, index 0 is the start index and index 1 is the end index.
+     */
+    private static int[] sortSelctionIndicesFromTextView(TextView textView) {
+        int selectionStart = textView.getSelectionStart();
+        int selectionEnd = textView.getSelectionEnd();
+
+        return sortSelctionIndices(selectionStart, selectionEnd);
+    }
+
+    /**
      * Starts Selection ActionMode.
      */
     public void startSelectionActionModeAsync(boolean adjustSelection) {
         // Check if the smart selection should run for editable text.
         adjustSelection &= getTextClassificationSettings().isSmartSelectionEnabled();
+        int[] sortedSelectionIndices = sortSelctionIndicesFromTextView(mTextView);
 
         mSelectionTracker.onOriginalSelection(
                 getText(mTextView),
-                mTextView.getSelectionStart(),
-                mTextView.getSelectionEnd(),
+                sortedSelectionIndices[0],
+                sortedSelectionIndices[1],
                 false /*isLink*/);
         cancelAsyncTask();
         if (skipTextClassification()) {
@@ -138,12 +165,14 @@
      * Starts Link ActionMode.
      */
     public void startLinkActionModeAsync(int start, int end) {
-        mSelectionTracker.onOriginalSelection(getText(mTextView), start, end, true /*isLink*/);
+        int[] indexResult = sortSelctionIndices(start, end);
+        mSelectionTracker.onOriginalSelection(getText(mTextView), indexResult[0], indexResult[1],
+                true /*isLink*/);
         cancelAsyncTask();
         if (skipTextClassification()) {
             startLinkActionMode(null);
         } else {
-            resetTextClassificationHelper(start, end);
+            resetTextClassificationHelper(indexResult[0], indexResult[1]);
             mTextClassificationAsyncTask = new TextClassificationAsyncTask(
                     mTextView,
                     mTextClassificationHelper.getTimeoutDuration(),
@@ -172,19 +201,23 @@
 
     /** Reports a selection action event. */
     public void onSelectionAction(int menuItemId, @Nullable String actionLabel) {
+        int[] sortedSelectionIndices = sortSelctionIndicesFromTextView(mTextView);
         mSelectionTracker.onSelectionAction(
-                mTextView.getSelectionStart(), mTextView.getSelectionEnd(),
+                sortedSelectionIndices[0], sortedSelectionIndices[1],
                 getActionType(menuItemId), actionLabel, mTextClassification);
     }
 
     public void onSelectionDrag() {
+        int[] sortedSelectionIndices = sortSelctionIndicesFromTextView(mTextView);
         mSelectionTracker.onSelectionAction(
-                mTextView.getSelectionStart(), mTextView.getSelectionEnd(),
+                sortedSelectionIndices[0], sortedSelectionIndices[1],
                 SelectionEvent.ACTION_DRAG, /* actionLabel= */ null, mTextClassification);
     }
 
     public void onTextChanged(int start, int end) {
-        mSelectionTracker.onTextChanged(start, end, mTextClassification);
+        int[] sortedSelectionIndices = sortSelctionIndices(start, end);
+        mSelectionTracker.onTextChanged(sortedSelectionIndices[0], sortedSelectionIndices[1],
+                mTextClassification);
     }
 
     public boolean resetSelection(int textIndex) {
@@ -301,10 +334,10 @@
             startSelectionActionMode(startSelectionResult);
         };
         // TODO do not trigger the animation if the change included only non-printable characters
+        int[] sortedSelectionIndices = sortSelctionIndicesFromTextView(mTextView);
         final boolean didSelectionChange =
-                result != null && (mTextView.getSelectionStart() != result.mStart
-                        || mTextView.getSelectionEnd() != result.mEnd);
-
+                result != null && (sortedSelectionIndices[0] != result.mStart
+                        || sortedSelectionIndices[1] != result.mEnd);
         if (!didSelectionChange) {
             onAnimationEndCallback.run();
             return;
@@ -453,16 +486,18 @@
         if (actionMode != null) {
             actionMode.invalidate();
         }
+        final int[] sortedSelectionIndices = sortSelctionIndicesFromTextView(mTextView);
         mSelectionTracker.onSelectionUpdated(
-                mTextView.getSelectionStart(), mTextView.getSelectionEnd(), mTextClassification);
+                sortedSelectionIndices[0], sortedSelectionIndices[1], mTextClassification);
         mTextClassificationAsyncTask = null;
     }
 
     private void resetTextClassificationHelper(int selectionStart, int selectionEnd) {
         if (selectionStart < 0 || selectionEnd < 0) {
             // Use selection indices
-            selectionStart = mTextView.getSelectionStart();
-            selectionEnd = mTextView.getSelectionEnd();
+            int[] sortedSelectionIndices = sortSelctionIndicesFromTextView(mTextView);
+            selectionStart = sortedSelectionIndices[0];
+            selectionEnd = sortedSelectionIndices[1];
         }
         mTextClassificationHelper.init(
                 mTextView::getTextClassifier,
@@ -602,10 +637,11 @@
                 mAllowReset = false;
                 boolean selected = editor.selectCurrentWord();
                 if (selected) {
-                    mSelectionStart = editor.getTextView().getSelectionStart();
-                    mSelectionEnd = editor.getTextView().getSelectionEnd();
+                    final int[] sortedSelectionIndices = sortSelctionIndicesFromTextView(textView);
+                    mSelectionStart = sortedSelectionIndices[0];
+                    mSelectionEnd = sortedSelectionIndices[1];
                     mLogger.logSelectionAction(
-                            textView.getSelectionStart(), textView.getSelectionEnd(),
+                            sortedSelectionIndices[0], sortedSelectionIndices[1],
                             SelectionEvent.ACTION_RESET,
                             /* actionLabel= */ null, /* classification= */ null);
                 }
@@ -1178,8 +1214,9 @@
 
         SelectionResult(int start, int end,
                 @Nullable TextClassification classification, @Nullable TextSelection selection) {
-            mStart = start;
-            mEnd = end;
+            int[] sortedIndices = sortSelctionIndices(start, end);
+            mStart = sortedIndices[0];
+            mEnd = sortedIndices[1];
             mClassification = classification;
             mSelection = selection;
         }
diff --git a/core/java/android/widget/SimpleMonthView.java b/core/java/android/widget/SimpleMonthView.java
index 217693e..61c77bc 100644
--- a/core/java/android/widget/SimpleMonthView.java
+++ b/core/java/android/widget/SimpleMonthView.java
@@ -420,6 +420,7 @@
                 break;
             case KeyEvent.KEYCODE_DPAD_CENTER:
             case KeyEvent.KEYCODE_ENTER:
+            case KeyEvent.KEYCODE_NUMPAD_ENTER:
                 if (mHighlightedDay != -1) {
                     onDayClicked(mHighlightedDay);
                     return true;
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index e178318..ec07574 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -855,6 +855,19 @@
     int mTextEditSuggestionContainerLayout;
     int mTextEditSuggestionHighlightStyle;
 
+    private static final int NO_POINTER_ID = -1;
+    /**
+     * The prime (the 1st finger) pointer id which is used as a lock to prevent multi touch among
+     * TextView and the handle views which are rendered on popup windows.
+     */
+    private int mPrimePointerId = NO_POINTER_ID;
+
+    /**
+     * Whether the prime pointer is from the event delivered to selection handle or insertion
+     * handle.
+     */
+    private boolean mIsPrimePointerFromHandleView;
+
     /**
      * {@link EditText} specific data, created on demand when one of the Editor fields is used.
      * See {@link #createEditorIfNeeded()}.
@@ -3272,7 +3285,7 @@
 
     /**
      * Applies a tint to the compound drawables. Does not modify the
-     * current tint mode, which is {@link PorterDuff.Mode#SRC_IN} by default.
+     * current tint mode, which is {@link BlendMode#SRC_IN} by default.
      * <p>
      * Subsequent calls to
      * {@link #setCompoundDrawables(Drawable, Drawable, Drawable, Drawable)}
@@ -8346,6 +8359,7 @@
 
         switch (keyCode) {
             case KeyEvent.KEYCODE_ENTER:
+            case KeyEvent.KEYCODE_NUMPAD_ENTER:
                 if (event.hasNoModifiers()) {
                     // When mInputContentType is set, we know that we are
                     // running in a "modern" cupcake environment, so don't need
@@ -8573,6 +8587,7 @@
                 return super.onKeyUp(keyCode, event);
 
             case KeyEvent.KEYCODE_ENTER:
+            case KeyEvent.KEYCODE_NUMPAD_ENTER:
                 if (event.hasNoModifiers()) {
                     if (mEditor != null && mEditor.mInputContentType != null
                             && mEditor.mInputContentType.onEditorActionListener != null
@@ -10886,6 +10901,36 @@
         }
     }
 
+    /**
+     * Called from onTouchEvent() to prevent the touches by secondary fingers.
+     * Dragging on handles can revise cursor/selection, so can dragging on the text view.
+     * This method is a lock to avoid processing multiple fingers on both text view and handles.
+     * Note: multiple fingers on handles (e.g. 2 fingers on the 2 selection handles) should work.
+     *
+     * @param event The motion event that is being handled and carries the pointer info.
+     * @param fromHandleView true if the event is delivered to selection handle or insertion
+     * handle; false if this event is delivered to TextView.
+     * @return Returns true to indicate that onTouchEvent() can continue processing the motion
+     * event, otherwise false.
+     *  - Always returns true for the first finger.
+     *  - For secondary fingers, if the first or current finger is from TextView, returns false.
+     *    This is to make touch mutually exclusive between the TextView and the handles, but
+     *    not among the handles.
+     */
+    boolean isFromPrimePointer(MotionEvent event, boolean fromHandleView) {
+        if (mPrimePointerId == NO_POINTER_ID)  {
+            mPrimePointerId = event.getPointerId(0);
+            mIsPrimePointerFromHandleView = fromHandleView;
+        } else if (mPrimePointerId != event.getPointerId(0)) {
+            return mIsPrimePointerFromHandleView && fromHandleView;
+        }
+        if (event.getActionMasked() == MotionEvent.ACTION_UP
+            || event.getActionMasked() == MotionEvent.ACTION_CANCEL) {
+            mPrimePointerId = -1;
+        }
+        return true;
+    }
+
     @Override
     public boolean onTouchEvent(MotionEvent event) {
         if (DEBUG_CURSOR) {
@@ -10894,6 +10939,9 @@
                     MotionEvent.actionToString(event.getActionMasked()),
                     event.getX(), event.getY());
         }
+        if (!isFromPrimePointer(event, false)) {
+            return true;
+        }
 
         final int action = event.getActionMasked();
         if (mEditor != null) {
diff --git a/core/java/android/window/DisplayAreaInfo.aidl b/core/java/android/window/DisplayAreaInfo.aidl
new file mode 100644
index 0000000..b745017
--- /dev/null
+++ b/core/java/android/window/DisplayAreaInfo.aidl
@@ -0,0 +1,18 @@
+/**
+ * Copyright (c) 2020, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.window;
+
+parcelable DisplayAreaInfo;
diff --git a/core/java/android/window/DisplayAreaInfo.java b/core/java/android/window/DisplayAreaInfo.java
new file mode 100644
index 0000000..0d35bca
--- /dev/null
+++ b/core/java/android/window/DisplayAreaInfo.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.window;
+
+import android.annotation.NonNull;
+import android.annotation.TestApi;
+import android.content.res.Configuration;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * Stores information about a particular {@link com.android.server.wm.DisplayArea}. This object will
+ * be sent to registered {@link DisplayAreaOrganizer} to provide information when the DisplayArea
+ * is added, removed, or changed.
+ *
+ * @hide
+ */
+@TestApi
+public final class DisplayAreaInfo implements Parcelable {
+
+    @NonNull
+    public final WindowContainerToken token;
+
+    @NonNull
+    public final Configuration configuration = new Configuration();
+
+    /**
+     * The id of the display this display area is associated with.
+     */
+    public final int displayId;
+
+    public DisplayAreaInfo(@NonNull WindowContainerToken token, int displayId) {
+        this.token = token;
+        this.displayId = displayId;
+    }
+
+    private DisplayAreaInfo(Parcel in) {
+        token = WindowContainerToken.CREATOR.createFromParcel(in);
+        configuration.readFromParcel(in);
+        displayId = in.readInt();
+    }
+
+    @Override
+    public void writeToParcel(@NonNull Parcel dest, int flags) {
+        token.writeToParcel(dest, flags);
+        configuration.writeToParcel(dest, flags);
+        dest.writeInt(displayId);
+    }
+
+    @NonNull
+    public static final Creator<DisplayAreaInfo> CREATOR = new Creator<DisplayAreaInfo>() {
+        @Override
+        public DisplayAreaInfo createFromParcel(Parcel in) {
+            return new DisplayAreaInfo(in);
+        }
+
+        @Override
+        public DisplayAreaInfo[] newArray(int size) {
+            return new DisplayAreaInfo[size];
+        }
+    };
+
+    @Override
+    public String toString() {
+        return "DisplayAreaInfo{token=" + token
+                + " config=" + configuration + "}";
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+}
diff --git a/core/java/android/window/DisplayAreaOrganizer.java b/core/java/android/window/DisplayAreaOrganizer.java
index 6ae70b7..f3ef5a0 100644
--- a/core/java/android/window/DisplayAreaOrganizer.java
+++ b/core/java/android/window/DisplayAreaOrganizer.java
@@ -52,21 +52,42 @@
         }
     }
 
-    public void onDisplayAreaAppeared(@NonNull WindowContainerToken displayArea) {}
+    /**
+     * @hide
+     */
+    @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS)
+    public void unregisterOrganizer() {
+        try {
+            getController().unregisterOrganizer(mInterface);
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
 
-    public void onDisplayAreaVanished(@NonNull WindowContainerToken displayArea) {}
+    public void onDisplayAreaAppeared(@NonNull DisplayAreaInfo displayAreaInfo) {}
 
+    public void onDisplayAreaVanished(@NonNull DisplayAreaInfo displayAreaInfo) {}
+
+    /**
+     * @hide
+     */
+    public void onDisplayAreaInfoChanged(@NonNull DisplayAreaInfo displayAreaInfo) {}
 
     private final IDisplayAreaOrganizer mInterface = new IDisplayAreaOrganizer.Stub() {
 
         @Override
-        public void onDisplayAreaAppeared(@NonNull WindowContainerToken displayArea) {
-            DisplayAreaOrganizer.this.onDisplayAreaAppeared(displayArea);
+        public void onDisplayAreaAppeared(@NonNull DisplayAreaInfo displayAreaInfo) {
+            DisplayAreaOrganizer.this.onDisplayAreaAppeared(displayAreaInfo);
         }
 
         @Override
-        public void onDisplayAreaVanished(@NonNull WindowContainerToken displayArea) {
-            DisplayAreaOrganizer.this.onDisplayAreaVanished(displayArea);
+        public void onDisplayAreaVanished(@NonNull DisplayAreaInfo displayAreaInfo) {
+            DisplayAreaOrganizer.this.onDisplayAreaVanished(displayAreaInfo);
+        }
+
+        @Override
+        public void onDisplayAreaInfoChanged(@NonNull DisplayAreaInfo displayAreaInfo) {
+            DisplayAreaOrganizer.this.onDisplayAreaInfoChanged(displayAreaInfo);
         }
     };
 
diff --git a/core/java/android/window/IDisplayAreaOrganizer.aidl b/core/java/android/window/IDisplayAreaOrganizer.aidl
index 9c72e60..39a9235 100644
--- a/core/java/android/window/IDisplayAreaOrganizer.aidl
+++ b/core/java/android/window/IDisplayAreaOrganizer.aidl
@@ -16,13 +16,14 @@
 
 package android.window;
 
-import android.window.WindowContainerToken;
+import android.window.DisplayAreaInfo;
 
 /**
  * Interface for WindowManager to delegate control of display areas.
  * {@hide}
  */
 oneway interface IDisplayAreaOrganizer {
-    void onDisplayAreaAppeared(in WindowContainerToken displayArea);
-    void onDisplayAreaVanished(in WindowContainerToken displayArea);
+    void onDisplayAreaAppeared(in DisplayAreaInfo displayAreaInfo);
+    void onDisplayAreaVanished(in DisplayAreaInfo displayAreaInfo);
+    void onDisplayAreaInfoChanged(in DisplayAreaInfo displayAreaInfo);
 }
diff --git a/core/java/android/window/IDisplayAreaOrganizerController.aidl b/core/java/android/window/IDisplayAreaOrganizerController.aidl
index fc6fbef..41b9d02 100644
--- a/core/java/android/window/IDisplayAreaOrganizerController.aidl
+++ b/core/java/android/window/IDisplayAreaOrganizerController.aidl
@@ -23,4 +23,9 @@
 
     /** Register a DisplayAreaOrganizer to manage display areas for a given feature. */
     void registerOrganizer(in IDisplayAreaOrganizer organizer, int displayAreaFeature);
+
+    /**
+     * Unregisters a previously registered display area organizer.
+     */
+    void unregisterOrganizer(in IDisplayAreaOrganizer organizer);
 }
diff --git a/core/java/android/window/VirtualDisplayTaskEmbedder.java b/core/java/android/window/VirtualDisplayTaskEmbedder.java
index 7016469..1c0598b1 100644
--- a/core/java/android/window/VirtualDisplayTaskEmbedder.java
+++ b/core/java/android/window/VirtualDisplayTaskEmbedder.java
@@ -64,6 +64,7 @@
     // For Virtual Displays
     private int mDisplayDensityDpi;
     private final boolean mSingleTaskInstance;
+    private final boolean mUsePublicVirtualDisplay;
     private VirtualDisplay mVirtualDisplay;
     private Insets mForwardedInsets;
     private DisplayMetrics mTmpDisplayMetrics;
@@ -78,9 +79,10 @@
      *                           only applicable if virtual displays are used
      */
     public VirtualDisplayTaskEmbedder(Context context, VirtualDisplayTaskEmbedder.Host host,
-            boolean singleTaskInstance) {
+            boolean singleTaskInstance, boolean usePublicVirtualDisplay) {
         super(context, host);
         mSingleTaskInstance = singleTaskInstance;
+        mUsePublicVirtualDisplay = usePublicVirtualDisplay;
     }
 
     /**
@@ -97,11 +99,16 @@
     public boolean onInitialize() {
         final DisplayManager displayManager = mContext.getSystemService(DisplayManager.class);
         mDisplayDensityDpi = getBaseDisplayDensity();
+
+        int virtualDisplayFlags = VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY
+                | VIRTUAL_DISPLAY_FLAG_DESTROY_CONTENT_ON_REMOVAL;
+        if (mUsePublicVirtualDisplay) {
+            virtualDisplayFlags |= VIRTUAL_DISPLAY_FLAG_PUBLIC;
+        }
+
         mVirtualDisplay = displayManager.createVirtualDisplay(
                 DISPLAY_NAME + "@" + System.identityHashCode(this), mHost.getWidth(),
-                mHost.getHeight(), mDisplayDensityDpi, null,
-                VIRTUAL_DISPLAY_FLAG_PUBLIC | VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY
-                        | VIRTUAL_DISPLAY_FLAG_DESTROY_CONTENT_ON_REMOVAL);
+                mHost.getHeight(), mDisplayDensityDpi, null, virtualDisplayFlags);
 
         if (mVirtualDisplay == null) {
             Log.e(TAG, "Failed to initialize TaskEmbedder");
diff --git a/core/java/com/android/internal/accessibility/AccessibilityShortcutController.java b/core/java/com/android/internal/accessibility/AccessibilityShortcutController.java
index d64b5f1..be66d0c 100644
--- a/core/java/com/android/internal/accessibility/AccessibilityShortcutController.java
+++ b/core/java/com/android/internal/accessibility/AccessibilityShortcutController.java
@@ -232,9 +232,8 @@
     }
 
     /**
-     * Show toast if current assigned shortcut target is an accessibility service and its target
-     * sdk version is less than or equal to Q, or greater than Q and does not request
-     * accessibility button.
+     * Show toast to alert the user that the accessibility shortcut turned on or off an
+     * accessibility service.
      */
     private void showToast() {
         final AccessibilityServiceInfo serviceInfo = getInfoForTargetService();
@@ -247,12 +246,15 @@
         }
         final boolean requestA11yButton = (serviceInfo.flags
                 & AccessibilityServiceInfo.FLAG_REQUEST_ACCESSIBILITY_BUTTON) != 0;
-        if (serviceInfo.getResolveInfo().serviceInfo.applicationInfo
-                .targetSdkVersion > Build.VERSION_CODES.Q && requestA11yButton) {
+        final boolean isServiceEnabled = isServiceEnabled(serviceInfo);
+        if (serviceInfo.getResolveInfo().serviceInfo.applicationInfo.targetSdkVersion
+                > Build.VERSION_CODES.Q && requestA11yButton && isServiceEnabled) {
+            // An accessibility button callback is sent to the target accessibility service.
+            // No need to show up a toast in this case.
             return;
         }
         // For accessibility services, show a toast explaining what we're doing.
-        String toastMessageFormatString = mContext.getString(isServiceEnabled(serviceInfo)
+        String toastMessageFormatString = mContext.getString(isServiceEnabled
                 ? R.string.accessibility_shortcut_disabling_service
                 : R.string.accessibility_shortcut_enabling_service);
         String toastMessage = String.format(toastMessageFormatString, serviceName);
diff --git a/core/java/com/android/internal/accessibility/common/ShortcutConstants.java b/core/java/com/android/internal/accessibility/common/ShortcutConstants.java
index b814e3f..7c9c51c 100644
--- a/core/java/com/android/internal/accessibility/common/ShortcutConstants.java
+++ b/core/java/com/android/internal/accessibility/common/ShortcutConstants.java
@@ -79,21 +79,6 @@
     }
 
     /**
-     * Annotation for different shortcut target.
-     */
-    @Retention(RetentionPolicy.SOURCE)
-    @IntDef({
-            TargetType.ACCESSIBILITY_SERVICE,
-            TargetType.ACCESSIBILITY_ACTIVITY,
-            TargetType.WHITE_LISTING,
-    })
-    public @interface TargetType {
-        int ACCESSIBILITY_SERVICE = 0;
-        int ACCESSIBILITY_ACTIVITY = 1;
-        int WHITE_LISTING = 2;
-    }
-
-    /**
      * Annotation for different shortcut menu mode.
      *
      * {@code LAUNCH} for clicking list item to trigger the service callback.
@@ -108,30 +93,4 @@
         int LAUNCH = 0;
         int EDIT = 1;
     }
-
-    /**
-     * Annotation for align the element index of white listing feature
-     * {@code WHITE_LISTING_FEATURES}.
-     *
-     * {@code COMPONENT_ID} is to get the service component name.
-     * {@code LABEL_ID} is to get the service label text.
-     * {@code ICON_ID} is to get the service icon.
-     * {@code FRAGMENT_TYPE} is to get the service fragment type.
-     * {@code SETTINGS_KEY} is to get the service settings key.
-     */
-    @Retention(RetentionPolicy.SOURCE)
-    @IntDef({
-            WhiteListingFeatureElementIndex.COMPONENT_ID,
-            WhiteListingFeatureElementIndex.LABEL_ID,
-            WhiteListingFeatureElementIndex.ICON_ID,
-            WhiteListingFeatureElementIndex.FRAGMENT_TYPE,
-            WhiteListingFeatureElementIndex.SETTINGS_KEY,
-    })
-    public @interface WhiteListingFeatureElementIndex {
-        int COMPONENT_ID = 0;
-        int LABEL_ID = 1;
-        int ICON_ID = 2;
-        int FRAGMENT_TYPE = 3;
-        int SETTINGS_KEY = 4;
-    }
 }
diff --git a/core/java/com/android/internal/accessibility/dialog/AccessibilityActivityTarget.java b/core/java/com/android/internal/accessibility/dialog/AccessibilityActivityTarget.java
new file mode 100644
index 0000000..4c7d93b
--- /dev/null
+++ b/core/java/com/android/internal/accessibility/dialog/AccessibilityActivityTarget.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.accessibility.dialog;
+
+import static com.android.internal.accessibility.util.ShortcutUtils.convertToKey;
+import static com.android.internal.accessibility.util.ShortcutUtils.convertToUserType;
+import static com.android.internal.accessibility.util.ShortcutUtils.isShortcutContained;
+
+import android.accessibilityservice.AccessibilityShortcutInfo;
+import android.annotation.NonNull;
+import android.content.Context;
+import android.view.accessibility.AccessibilityManager.ShortcutType;
+
+import com.android.internal.accessibility.common.ShortcutConstants.AccessibilityFragmentType;
+
+/**
+ * Base class for creating accessibility activity target.
+ */
+class AccessibilityActivityTarget extends AccessibilityTarget {
+
+    AccessibilityActivityTarget(Context context, @ShortcutType int shortcutType,
+            @NonNull AccessibilityShortcutInfo shortcutInfo) {
+        super(context,
+                shortcutType,
+                AccessibilityFragmentType.LAUNCH_ACTIVITY,
+                isShortcutContained(context, shortcutType,
+                        shortcutInfo.getComponentName().flattenToString()),
+                shortcutInfo.getComponentName().flattenToString(),
+                shortcutInfo.getActivityInfo().loadLabel(context.getPackageManager()),
+                shortcutInfo.getActivityInfo().loadIcon(context.getPackageManager()),
+                convertToKey(convertToUserType(shortcutType)));
+    }
+}
diff --git a/core/java/com/android/internal/accessibility/dialog/AccessibilityServiceTarget.java b/core/java/com/android/internal/accessibility/dialog/AccessibilityServiceTarget.java
new file mode 100644
index 0000000..e64f78a
--- /dev/null
+++ b/core/java/com/android/internal/accessibility/dialog/AccessibilityServiceTarget.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.accessibility.dialog;
+
+import static com.android.internal.accessibility.util.ShortcutUtils.convertToKey;
+import static com.android.internal.accessibility.util.ShortcutUtils.convertToUserType;
+import static com.android.internal.accessibility.util.ShortcutUtils.isShortcutContained;
+
+import android.accessibilityservice.AccessibilityServiceInfo;
+import android.annotation.NonNull;
+import android.content.Context;
+import android.view.accessibility.AccessibilityManager.ShortcutType;
+
+import com.android.internal.accessibility.common.ShortcutConstants.AccessibilityFragmentType;
+
+/**
+ * Base class for creating accessibility service target with various fragment types related to
+ * legacy type, invisible type and intuitive type.
+ */
+class AccessibilityServiceTarget extends AccessibilityTarget {
+
+    AccessibilityServiceTarget(Context context, @ShortcutType int shortcutType,
+            @AccessibilityFragmentType int fragmentType,
+            @NonNull AccessibilityServiceInfo serviceInfo) {
+        super(context,
+                shortcutType,
+                fragmentType,
+                isShortcutContained(context, shortcutType,
+                        serviceInfo.getComponentName().flattenToString()),
+                serviceInfo.getComponentName().flattenToString(),
+                serviceInfo.getResolveInfo().loadLabel(context.getPackageManager()),
+                serviceInfo.getResolveInfo().loadIcon(context.getPackageManager()),
+                convertToKey(convertToUserType(shortcutType)));
+    }
+}
diff --git a/core/java/com/android/internal/accessibility/dialog/AccessibilityShortcutChooserActivity.java b/core/java/com/android/internal/accessibility/dialog/AccessibilityShortcutChooserActivity.java
new file mode 100644
index 0000000..e8d2813
--- /dev/null
+++ b/core/java/com/android/internal/accessibility/dialog/AccessibilityShortcutChooserActivity.java
@@ -0,0 +1,165 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.internal.accessibility.dialog;
+
+import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_BUTTON;
+import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_SHORTCUT_KEY;
+import static android.view.accessibility.AccessibilityManager.ShortcutType;
+
+import static com.android.internal.accessibility.common.ShortcutConstants.ShortcutMenuMode;
+import static com.android.internal.accessibility.dialog.AccessibilityTargetHelper.createEnableDialogContentView;
+import static com.android.internal.accessibility.dialog.AccessibilityTargetHelper.getInstalledTargets;
+import static com.android.internal.accessibility.dialog.AccessibilityTargetHelper.getTargets;
+import static com.android.internal.util.Preconditions.checkArgument;
+
+import android.annotation.Nullable;
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.content.DialogInterface;
+import android.content.res.TypedArray;
+import android.os.Bundle;
+import android.view.View;
+import android.view.Window;
+import android.view.accessibility.AccessibilityManager;
+import android.widget.AdapterView;
+
+import com.android.internal.R;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Activity used to display various targets related to accessibility service, accessibility
+ * activity or white listing feature for volume key shortcut.
+ */
+public class AccessibilityShortcutChooserActivity extends Activity {
+    @ShortcutType
+    private int mShortcutType;
+    private final List<AccessibilityTarget> mTargets = new ArrayList<>();
+    private AlertDialog mMenuDialog;
+    private AlertDialog mPermissionDialog;
+    private ShortcutTargetAdapter mTargetAdapter;
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        final TypedArray theme = getTheme().obtainStyledAttributes(android.R.styleable.Theme);
+        if (!theme.getBoolean(android.R.styleable.Theme_windowNoTitle, /* defValue= */ false)) {
+            requestWindowFeature(Window.FEATURE_NO_TITLE);
+        }
+
+        mShortcutType = getIntent().getIntExtra(AccessibilityManager.EXTRA_SHORTCUT_TYPE,
+                /* unexpectedShortcutType */ -1);
+        final boolean existInShortcutType = (mShortcutType == ACCESSIBILITY_BUTTON)
+                || (mShortcutType == ACCESSIBILITY_SHORTCUT_KEY);
+        checkArgument(existInShortcutType, "Unexpected shortcut type: " + mShortcutType);
+
+        mTargets.addAll(getTargets(this, mShortcutType));
+
+        final String selectDialogTitle =
+                getString(R.string.accessibility_select_shortcut_menu_title);
+        mTargetAdapter = new ShortcutTargetAdapter(mTargets);
+        mMenuDialog = new AlertDialog.Builder(this)
+                .setTitle(selectDialogTitle)
+                .setAdapter(mTargetAdapter, /* listener= */ null)
+                .setPositiveButton(
+                        getString(R.string.edit_accessibility_shortcut_menu_button),
+                        /* listener= */ null)
+                .setOnDismissListener(dialog -> finish())
+                .create();
+        mMenuDialog.setOnShowListener(dialog -> updateDialogListeners());
+        mMenuDialog.show();
+    }
+
+    @Override
+    protected void onDestroy() {
+        mMenuDialog.dismiss();
+        super.onDestroy();
+    }
+
+    private void onTargetSelected(AdapterView<?> parent, View view, int position, long id) {
+        final AccessibilityTarget target = mTargets.get(position);
+        target.onSelected();
+        mMenuDialog.dismiss();
+    }
+
+    private void onTargetChecked(AdapterView<?> parent, View view, int position, long id) {
+        final AccessibilityTarget target = mTargets.get(position);
+
+        if ((target instanceof AccessibilityServiceTarget) && !target.isShortcutEnabled()) {
+            mPermissionDialog = new AlertDialog.Builder(this)
+                    .setView(createEnableDialogContentView(this,
+                            (AccessibilityServiceTarget) target,
+                            v -> {
+                                mPermissionDialog.dismiss();
+                                mTargetAdapter.notifyDataSetChanged();
+                            },
+                            v -> mPermissionDialog.dismiss()))
+                    .create();
+            mPermissionDialog.show();
+            return;
+        }
+
+        target.onCheckedChanged(!target.isShortcutEnabled());
+        mTargetAdapter.notifyDataSetChanged();
+    }
+
+    private void onDoneButtonClicked() {
+        mTargets.clear();
+        mTargets.addAll(getTargets(this, mShortcutType));
+        if (mTargets.isEmpty()) {
+            mMenuDialog.dismiss();
+            return;
+        }
+
+        mTargetAdapter.setShortcutMenuMode(ShortcutMenuMode.LAUNCH);
+        mTargetAdapter.notifyDataSetChanged();
+
+        mMenuDialog.getButton(DialogInterface.BUTTON_POSITIVE).setText(
+                getString(R.string.edit_accessibility_shortcut_menu_button));
+
+        updateDialogListeners();
+    }
+
+    private void onEditButtonClicked() {
+        mTargets.clear();
+        mTargets.addAll(getInstalledTargets(this, mShortcutType));
+        mTargetAdapter.setShortcutMenuMode(ShortcutMenuMode.EDIT);
+        mTargetAdapter.notifyDataSetChanged();
+
+        mMenuDialog.getButton(DialogInterface.BUTTON_POSITIVE).setText(
+                getString(R.string.done_accessibility_shortcut_menu_button));
+
+        updateDialogListeners();
+    }
+
+    private void updateDialogListeners() {
+        final boolean isEditMenuMode =
+                (mTargetAdapter.getShortcutMenuMode() == ShortcutMenuMode.EDIT);
+        final int selectDialogTitleId = R.string.accessibility_select_shortcut_menu_title;
+        final int editDialogTitleId =
+                (mShortcutType == ACCESSIBILITY_BUTTON)
+                        ? R.string.accessibility_edit_shortcut_menu_button_title
+                        : R.string.accessibility_edit_shortcut_menu_volume_title;
+
+        mMenuDialog.setTitle(getString(isEditMenuMode ? editDialogTitleId : selectDialogTitleId));
+        mMenuDialog.getButton(DialogInterface.BUTTON_POSITIVE).setOnClickListener(
+                isEditMenuMode ? view -> onDoneButtonClicked() : view -> onEditButtonClicked());
+        mMenuDialog.getListView().setOnItemClickListener(
+                isEditMenuMode ? this::onTargetChecked : this::onTargetSelected);
+    }
+}
diff --git a/core/java/com/android/internal/accessibility/dialog/AccessibilityTarget.java b/core/java/com/android/internal/accessibility/dialog/AccessibilityTarget.java
new file mode 100644
index 0000000..72ebc58
--- /dev/null
+++ b/core/java/com/android/internal/accessibility/dialog/AccessibilityTarget.java
@@ -0,0 +1,141 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.accessibility.dialog;
+
+import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_BUTTON;
+import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_SHORTCUT_KEY;
+
+import static com.android.internal.accessibility.util.ShortcutUtils.convertToUserType;
+import static com.android.internal.accessibility.util.ShortcutUtils.optInValueToSettings;
+import static com.android.internal.accessibility.util.ShortcutUtils.optOutValueFromSettings;
+
+import android.annotation.NonNull;
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.view.View;
+import android.view.accessibility.AccessibilityManager;
+import android.view.accessibility.AccessibilityManager.ShortcutType;
+
+import com.android.internal.accessibility.common.ShortcutConstants;
+import com.android.internal.accessibility.common.ShortcutConstants.AccessibilityFragmentType;
+import com.android.internal.accessibility.dialog.TargetAdapter.ViewHolder;
+
+/**
+ * Abstract base class for creating various target related to accessibility service,
+ * accessibility activity, and white listing feature.
+ */
+abstract class AccessibilityTarget implements TargetOperations, OnTargetSelectedListener,
+        OnTargetCheckedChangeListener {
+    private Context mContext;
+    @ShortcutType
+    private int mShortcutType;
+    @AccessibilityFragmentType
+    private int mFragmentType;
+    private boolean mShortcutEnabled;
+    private String mId;
+    private CharSequence mLabel;
+    private Drawable mIcon;
+    private String mKey;
+
+    AccessibilityTarget(Context context, @ShortcutType int shortcutType,
+            @AccessibilityFragmentType int fragmentType, boolean isShortcutSwitched, String id,
+            CharSequence label, Drawable icon, String key) {
+        mContext = context;
+        mShortcutType = shortcutType;
+        mFragmentType = fragmentType;
+        mShortcutEnabled = isShortcutSwitched;
+        mId = id;
+        mLabel = label;
+        mIcon = icon;
+        mKey = key;
+    }
+
+    @Override
+    public void updateActionItem(@NonNull ViewHolder holder,
+            @ShortcutConstants.ShortcutMenuMode int shortcutMenuMode) {
+        final boolean isEditMenuMode =
+                shortcutMenuMode == ShortcutConstants.ShortcutMenuMode.EDIT;
+
+        holder.mCheckBoxView.setChecked(isEditMenuMode && isShortcutEnabled());
+        holder.mCheckBoxView.setVisibility(isEditMenuMode ? View.VISIBLE : View.GONE);
+        holder.mIconView.setImageDrawable(getIcon());
+        holder.mLabelView.setText(getLabel());
+        holder.mSwitchItem.setVisibility(View.GONE);
+    }
+
+    @Override
+    public void onSelected() {
+        final AccessibilityManager am =
+                getContext().getSystemService(AccessibilityManager.class);
+        switch (getShortcutType()) {
+            case ACCESSIBILITY_BUTTON:
+                am.notifyAccessibilityButtonClicked(getContext().getDisplayId(), getId());
+                return;
+            case ACCESSIBILITY_SHORTCUT_KEY:
+                am.performAccessibilityShortcut(getId());
+                return;
+            default:
+                throw new IllegalStateException("Unexpected shortcut type");
+        }
+    }
+
+    @Override
+    public void onCheckedChanged(boolean isChecked) {
+        setShortcutEnabled(isChecked);
+        if (isChecked) {
+            optInValueToSettings(getContext(), convertToUserType(getShortcutType()), getId());
+        } else {
+            optOutValueFromSettings(getContext(), convertToUserType(getShortcutType()), getId());
+        }
+    }
+
+    public void setShortcutEnabled(boolean enabled) {
+        mShortcutEnabled = enabled;
+    }
+
+    public Context getContext() {
+        return mContext;
+    }
+
+    public @ShortcutType int getShortcutType() {
+        return mShortcutType;
+    }
+
+    public @AccessibilityFragmentType int getFragmentType() {
+        return mFragmentType;
+    }
+
+    public boolean isShortcutEnabled() {
+        return mShortcutEnabled;
+    }
+
+    public String getId() {
+        return mId;
+    }
+
+    public CharSequence getLabel() {
+        return mLabel;
+    }
+
+    public Drawable getIcon() {
+        return mIcon;
+    }
+
+    public String getKey() {
+        return mKey;
+    }
+}
diff --git a/core/java/com/android/internal/accessibility/dialog/AccessibilityTargetHelper.java b/core/java/com/android/internal/accessibility/dialog/AccessibilityTargetHelper.java
new file mode 100644
index 0000000..f63cbe0
--- /dev/null
+++ b/core/java/com/android/internal/accessibility/dialog/AccessibilityTargetHelper.java
@@ -0,0 +1,261 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.accessibility.dialog;
+
+import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_BUTTON;
+
+import static com.android.internal.accessibility.AccessibilityShortcutController.COLOR_INVERSION_COMPONENT_NAME;
+import static com.android.internal.accessibility.AccessibilityShortcutController.DALTONIZER_COMPONENT_NAME;
+import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_CONTROLLER_NAME;
+import static com.android.internal.accessibility.util.AccessibilityUtils.getAccessibilityServiceFragmentType;
+import static com.android.internal.accessibility.util.ShortcutUtils.isShortcutContained;
+
+import android.accessibilityservice.AccessibilityServiceInfo;
+import android.accessibilityservice.AccessibilityShortcutInfo;
+import android.annotation.NonNull;
+import android.app.ActivityManager;
+import android.content.ComponentName;
+import android.content.Context;
+import android.os.Build;
+import android.os.storage.StorageManager;
+import android.provider.Settings;
+import android.text.BidiFormatter;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.accessibility.AccessibilityManager;
+import android.view.accessibility.AccessibilityManager.ShortcutType;
+import android.widget.Button;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.android.internal.R;
+import com.android.internal.accessibility.common.ShortcutConstants.AccessibilityFragmentType;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Locale;
+
+/**
+ * Collection of utilities for accessibility target.
+ */
+final class AccessibilityTargetHelper {
+    private AccessibilityTargetHelper() {}
+
+    static List<AccessibilityTarget> getTargets(Context context,
+            @ShortcutType int shortcutType) {
+        final List<AccessibilityTarget> targets = getInstalledTargets(context, shortcutType);
+        final AccessibilityManager ams = context.getSystemService(AccessibilityManager.class);
+        final List<String> requiredTargets = ams.getAccessibilityShortcutTargets(shortcutType);
+        targets.removeIf(target -> !requiredTargets.contains(target.getId()));
+
+        return targets;
+    }
+
+    static List<AccessibilityTarget> getInstalledTargets(Context context,
+            @ShortcutType int shortcutType) {
+        final List<AccessibilityTarget> targets = new ArrayList<>();
+        targets.addAll(getAccessibilityFilteredTargets(context, shortcutType));
+        targets.addAll(getWhiteListingFeatureTargets(context, shortcutType));
+
+        return targets;
+    }
+
+    private static List<AccessibilityTarget> getAccessibilityFilteredTargets(Context context,
+            @ShortcutType int shortcutType) {
+        final List<AccessibilityTarget> serviceTargets =
+                getAccessibilityServiceTargets(context, shortcutType);
+        final List<AccessibilityTarget> activityTargets =
+                getAccessibilityActivityTargets(context, shortcutType);
+
+        for (AccessibilityTarget activityTarget : activityTargets) {
+            serviceTargets.removeIf(
+                    serviceTarget -> arePackageNameAndLabelTheSame(serviceTarget, activityTarget));
+        }
+
+        final List<AccessibilityTarget> targets = new ArrayList<>();
+        targets.addAll(serviceTargets);
+        targets.addAll(activityTargets);
+
+        return targets;
+    }
+
+    private static boolean arePackageNameAndLabelTheSame(@NonNull AccessibilityTarget serviceTarget,
+            @NonNull AccessibilityTarget activityTarget) {
+        final ComponentName serviceComponentName =
+                ComponentName.unflattenFromString(serviceTarget.getId());
+        final ComponentName activityComponentName =
+                ComponentName.unflattenFromString(activityTarget.getId());
+        final boolean isSamePackageName = activityComponentName.getPackageName().equals(
+                serviceComponentName.getPackageName());
+        final boolean isSameLabel = activityTarget.getLabel().equals(
+                serviceTarget.getLabel());
+
+        return isSamePackageName && isSameLabel;
+    }
+
+    private static List<AccessibilityTarget> getAccessibilityServiceTargets(Context context,
+            @ShortcutType int shortcutType) {
+        final AccessibilityManager ams = context.getSystemService(AccessibilityManager.class);
+        final List<AccessibilityServiceInfo> installedServices =
+                ams.getInstalledAccessibilityServiceList();
+        if (installedServices == null) {
+            return Collections.emptyList();
+        }
+
+        final List<AccessibilityTarget> targets = new ArrayList<>(installedServices.size());
+        for (AccessibilityServiceInfo info : installedServices) {
+            final int targetSdk =
+                    info.getResolveInfo().serviceInfo.applicationInfo.targetSdkVersion;
+            final boolean hasRequestAccessibilityButtonFlag =
+                    (info.flags & AccessibilityServiceInfo.FLAG_REQUEST_ACCESSIBILITY_BUTTON) != 0;
+            if ((targetSdk <= Build.VERSION_CODES.Q) && !hasRequestAccessibilityButtonFlag
+                    && (shortcutType == ACCESSIBILITY_BUTTON)) {
+                continue;
+            }
+
+            targets.add(createAccessibilityServiceTarget(context, shortcutType, info));
+        }
+
+        return targets;
+    }
+
+    private static List<AccessibilityTarget> getAccessibilityActivityTargets(Context context,
+            @ShortcutType int shortcutType) {
+        final AccessibilityManager ams = context.getSystemService(AccessibilityManager.class);
+        final List<AccessibilityShortcutInfo> installedServices =
+                ams.getInstalledAccessibilityShortcutListAsUser(context,
+                        ActivityManager.getCurrentUser());
+        if (installedServices == null) {
+            return Collections.emptyList();
+        }
+
+        final List<AccessibilityTarget> targets = new ArrayList<>(installedServices.size());
+        for (AccessibilityShortcutInfo info : installedServices) {
+            targets.add(new AccessibilityActivityTarget(context, shortcutType, info));
+        }
+
+        return targets;
+    }
+
+    private static List<AccessibilityTarget> getWhiteListingFeatureTargets(Context context,
+            @ShortcutType int shortcutType) {
+        final List<AccessibilityTarget> targets = new ArrayList<>();
+
+        final InvisibleToggleWhiteListingFeatureTarget magnification =
+                new InvisibleToggleWhiteListingFeatureTarget(context,
+                shortcutType,
+                isShortcutContained(context, shortcutType, MAGNIFICATION_CONTROLLER_NAME),
+                MAGNIFICATION_CONTROLLER_NAME,
+                context.getString(R.string.accessibility_magnification_chooser_text),
+                context.getDrawable(R.drawable.ic_accessibility_magnification),
+                Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_NAVBAR_ENABLED);
+
+        final ToggleWhiteListingFeatureTarget daltonizer =
+                new ToggleWhiteListingFeatureTarget(context,
+                shortcutType,
+                isShortcutContained(context, shortcutType,
+                        DALTONIZER_COMPONENT_NAME.flattenToString()),
+                DALTONIZER_COMPONENT_NAME.flattenToString(),
+                context.getString(R.string.color_correction_feature_name),
+                context.getDrawable(R.drawable.ic_accessibility_color_correction),
+                Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED);
+
+        final ToggleWhiteListingFeatureTarget colorInversion =
+                new ToggleWhiteListingFeatureTarget(context,
+                shortcutType,
+                isShortcutContained(context, shortcutType,
+                        COLOR_INVERSION_COMPONENT_NAME.flattenToString()),
+                COLOR_INVERSION_COMPONENT_NAME.flattenToString(),
+                context.getString(R.string.color_inversion_feature_name),
+                context.getDrawable(R.drawable.ic_accessibility_color_inversion),
+                Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED);
+
+        targets.add(magnification);
+        targets.add(daltonizer);
+        targets.add(colorInversion);
+
+        return targets;
+    }
+
+    private static AccessibilityTarget createAccessibilityServiceTarget(Context context,
+            @ShortcutType int shortcutType, @NonNull AccessibilityServiceInfo info) {
+        switch (getAccessibilityServiceFragmentType(info)) {
+            case AccessibilityFragmentType.VOLUME_SHORTCUT_TOGGLE:
+                return new VolumeShortcutToggleAccessibilityServiceTarget(context, shortcutType,
+                        info);
+            case AccessibilityFragmentType.INVISIBLE_TOGGLE:
+                return new InvisibleToggleAccessibilityServiceTarget(context, shortcutType, info);
+            case AccessibilityFragmentType.TOGGLE:
+                return new ToggleAccessibilityServiceTarget(context, shortcutType, info);
+            default:
+                throw new IllegalStateException("Unexpected fragment type");
+        }
+    }
+
+    static View createEnableDialogContentView(Context context,
+            AccessibilityServiceTarget target, View.OnClickListener allowListener,
+            View.OnClickListener denyListener) {
+        final LayoutInflater inflater = (LayoutInflater) context.getSystemService(
+                Context.LAYOUT_INFLATER_SERVICE);
+
+        final View content = inflater.inflate(
+                R.layout.accessibility_enable_service_encryption_warning, /* root= */ null);
+
+        final TextView encryptionWarningView = (TextView) content.findViewById(
+                R.id.accessibility_encryption_warning);
+        if (StorageManager.isNonDefaultBlockEncrypted()) {
+            final String text = context.getString(
+                    R.string.accessibility_enable_service_encryption_warning,
+                    getServiceName(context, target.getLabel()));
+            encryptionWarningView.setText(text);
+            encryptionWarningView.setVisibility(View.VISIBLE);
+        } else {
+            encryptionWarningView.setVisibility(View.GONE);
+        }
+
+        final ImageView dialogIcon = content.findViewById(
+                R.id.accessibility_permissionDialog_icon);
+        dialogIcon.setImageDrawable(target.getIcon());
+
+        final TextView dialogTitle = content.findViewById(
+                R.id.accessibility_permissionDialog_title);
+        dialogTitle.setText(context.getString(R.string.accessibility_enable_service_title,
+                getServiceName(context, target.getLabel())));
+
+        final Button allowButton = content.findViewById(
+                R.id.accessibility_permission_enable_allow_button);
+        final Button denyButton = content.findViewById(
+                R.id.accessibility_permission_enable_deny_button);
+        allowButton.setOnClickListener((view) -> {
+            target.onCheckedChanged(/* isChecked= */ true);
+            allowListener.onClick(view);
+        });
+        denyButton.setOnClickListener((view) -> {
+            target.onCheckedChanged(/* isChecked= */ false);
+            denyListener.onClick(view);
+        });
+
+        return content;
+    }
+
+    // Gets the service name and bidi wrap it to protect from bidi side effects.
+    private static CharSequence getServiceName(Context context, CharSequence label) {
+        final Locale locale = context.getResources().getConfiguration().getLocales().get(0);
+        return BidiFormatter.getInstance(locale).unicodeWrap(label);
+    }
+}
diff --git a/core/java/com/android/internal/accessibility/dialog/InvisibleToggleAccessibilityServiceTarget.java b/core/java/com/android/internal/accessibility/dialog/InvisibleToggleAccessibilityServiceTarget.java
new file mode 100644
index 0000000..9d5c374
--- /dev/null
+++ b/core/java/com/android/internal/accessibility/dialog/InvisibleToggleAccessibilityServiceTarget.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.accessibility.dialog;
+
+import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_BUTTON;
+import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_SHORTCUT_KEY;
+
+import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType;
+import static com.android.internal.accessibility.util.AccessibilityUtils.setAccessibilityServiceState;
+import static com.android.internal.accessibility.util.ShortcutUtils.isComponentIdExistingInSettings;
+
+import android.accessibilityservice.AccessibilityServiceInfo;
+import android.annotation.NonNull;
+import android.content.ComponentName;
+import android.content.Context;
+import android.view.accessibility.AccessibilityManager.ShortcutType;
+
+import com.android.internal.accessibility.common.ShortcutConstants.AccessibilityFragmentType;
+
+/**
+ * Extension for {@link AccessibilityServiceTarget} with
+ * {@link AccessibilityFragmentType#INVISIBLE_TOGGLE} type.
+ */
+class InvisibleToggleAccessibilityServiceTarget extends AccessibilityServiceTarget {
+
+    InvisibleToggleAccessibilityServiceTarget(Context context, @ShortcutType int shortcutType,
+            @NonNull AccessibilityServiceInfo serviceInfo) {
+        super(context,
+                shortcutType,
+                AccessibilityFragmentType.INVISIBLE_TOGGLE,
+                serviceInfo);
+    }
+
+    @Override
+    public void onCheckedChanged(boolean isChecked) {
+        final ComponentName componentName = ComponentName.unflattenFromString(getId());
+
+        if (!isComponentIdExistingInOtherShortcut()) {
+            setAccessibilityServiceState(getContext(), componentName, isChecked);
+        }
+
+        super.onCheckedChanged(isChecked);
+    }
+
+    private boolean isComponentIdExistingInOtherShortcut() {
+        switch (getShortcutType()) {
+            case ACCESSIBILITY_BUTTON:
+                return isComponentIdExistingInSettings(getContext(), UserShortcutType.HARDWARE,
+                        getId());
+            case ACCESSIBILITY_SHORTCUT_KEY:
+                return isComponentIdExistingInSettings(getContext(), UserShortcutType.SOFTWARE,
+                        getId());
+            default:
+                throw new IllegalStateException("Unexpected shortcut type");
+        }
+    }
+}
diff --git a/core/java/com/android/internal/accessibility/dialog/InvisibleToggleWhiteListingFeatureTarget.java b/core/java/com/android/internal/accessibility/dialog/InvisibleToggleWhiteListingFeatureTarget.java
new file mode 100644
index 0000000..acd101b
--- /dev/null
+++ b/core/java/com/android/internal/accessibility/dialog/InvisibleToggleWhiteListingFeatureTarget.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.accessibility.dialog;
+
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.view.accessibility.AccessibilityManager.ShortcutType;
+
+import com.android.internal.accessibility.common.ShortcutConstants.AccessibilityFragmentType;
+
+/**
+ * Extension for {@link AccessibilityTarget} with {@link AccessibilityFragmentType#INVISIBLE_TOGGLE}
+ * type.
+ */
+class InvisibleToggleWhiteListingFeatureTarget extends AccessibilityTarget {
+
+    InvisibleToggleWhiteListingFeatureTarget(Context context, @ShortcutType int shortcutType,
+            boolean isShortcutSwitched, String id, CharSequence label, Drawable icon, String key) {
+        super(context, shortcutType, AccessibilityFragmentType.INVISIBLE_TOGGLE,
+                isShortcutSwitched, id, label, icon, key);
+    }
+}
diff --git a/core/java/com/android/internal/accessibility/dialog/OnTargetCheckedChangeListener.java b/core/java/com/android/internal/accessibility/dialog/OnTargetCheckedChangeListener.java
new file mode 100644
index 0000000..dab45e4
--- /dev/null
+++ b/core/java/com/android/internal/accessibility/dialog/OnTargetCheckedChangeListener.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.accessibility.dialog;
+
+/**
+ * Interface definition for a callback to be invoked when the checked state
+ * of a accessibility target changed.
+ */
+interface OnTargetCheckedChangeListener {
+    /**
+     * Called when the checked state of a accessibility target has changed.
+     *
+     * @param isChecked The new checked state of accessibility target.
+     */
+    void onCheckedChanged(boolean isChecked);
+}
diff --git a/core/java/com/android/internal/accessibility/dialog/OnTargetSelectedListener.java b/core/java/com/android/internal/accessibility/dialog/OnTargetSelectedListener.java
new file mode 100644
index 0000000..b3e976f2
--- /dev/null
+++ b/core/java/com/android/internal/accessibility/dialog/OnTargetSelectedListener.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.accessibility.dialog;
+
+/**
+ * Interface definition for a callback to be invoked when a accessibility target is selected.
+ */
+interface OnTargetSelectedListener {
+    /**
+     * Called when a accessibility target has been selected.
+     */
+    void onSelected();
+}
diff --git a/core/java/com/android/internal/accessibility/dialog/ShortcutTargetAdapter.java b/core/java/com/android/internal/accessibility/dialog/ShortcutTargetAdapter.java
new file mode 100644
index 0000000..b7605b7
--- /dev/null
+++ b/core/java/com/android/internal/accessibility/dialog/ShortcutTargetAdapter.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.accessibility.dialog;
+
+import android.annotation.NonNull;
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.android.internal.R;
+import com.android.internal.accessibility.common.ShortcutConstants.ShortcutMenuMode;
+
+import java.util.List;
+
+/**
+ * Extension for {@link TargetAdapter} and used for AccessibilityShortcutChooserActivity.
+ */
+class ShortcutTargetAdapter extends TargetAdapter {
+    @ShortcutMenuMode
+    private int mShortcutMenuMode = ShortcutMenuMode.LAUNCH;
+    private final List<AccessibilityTarget> mTargets;
+
+    ShortcutTargetAdapter(@NonNull List<AccessibilityTarget> targets) {
+        mTargets = targets;
+    }
+
+    @Override
+    public int getCount() {
+        return mTargets.size();
+    }
+
+    @Override
+    public Object getItem(int position) {
+        return mTargets.get(position);
+    }
+
+    @Override
+    public long getItemId(int position) {
+        return position;
+    }
+
+    @Override
+    public View getView(int position, View convertView, ViewGroup parent) {
+        final Context context = parent.getContext();
+        ViewHolder holder;
+        if (convertView == null) {
+            convertView = LayoutInflater.from(context).inflate(
+                    R.layout.accessibility_shortcut_chooser_item, parent, /* attachToRoot= */
+                    false);
+            holder = new ViewHolder();
+            holder.mCheckBoxView = convertView.findViewById(
+                    R.id.accessibility_shortcut_target_checkbox);
+            holder.mIconView = convertView.findViewById(R.id.accessibility_shortcut_target_icon);
+            holder.mLabelView = convertView.findViewById(
+                    R.id.accessibility_shortcut_target_label);
+            holder.mSwitchItem = convertView.findViewById(
+                    R.id.accessibility_shortcut_target_switch_item);
+            convertView.setTag(holder);
+        } else {
+            holder = (ViewHolder) convertView.getTag();
+        }
+
+        final AccessibilityTarget target = mTargets.get(position);
+        target.updateActionItem(holder, mShortcutMenuMode);
+
+        return convertView;
+    }
+
+    void setShortcutMenuMode(@ShortcutMenuMode int shortcutMenuMode) {
+        mShortcutMenuMode = shortcutMenuMode;
+    }
+
+    @ShortcutMenuMode
+    int getShortcutMenuMode() {
+        return mShortcutMenuMode;
+    }
+}
diff --git a/core/java/com/android/internal/accessibility/dialog/TargetAdapter.java b/core/java/com/android/internal/accessibility/dialog/TargetAdapter.java
new file mode 100644
index 0000000..1efa17e
--- /dev/null
+++ b/core/java/com/android/internal/accessibility/dialog/TargetAdapter.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.accessibility.dialog;
+
+import android.widget.BaseAdapter;
+import android.widget.CheckBox;
+import android.widget.ImageView;
+import android.widget.Switch;
+import android.widget.TextView;
+
+/**
+ * Abstract base class for creating target adapter for chooser activity.
+ */
+abstract class TargetAdapter extends BaseAdapter {
+    static class ViewHolder{
+        CheckBox mCheckBoxView;
+        ImageView mIconView;
+        TextView mLabelView;
+        Switch mSwitchItem;
+    }
+}
diff --git a/core/java/com/android/internal/accessibility/dialog/TargetOperations.java b/core/java/com/android/internal/accessibility/dialog/TargetOperations.java
new file mode 100644
index 0000000..77cc5b4
--- /dev/null
+++ b/core/java/com/android/internal/accessibility/dialog/TargetOperations.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.accessibility.dialog;
+
+import android.annotation.NonNull;
+
+import com.android.internal.accessibility.common.ShortcutConstants.ShortcutMenuMode;
+import com.android.internal.accessibility.dialog.TargetAdapter.ViewHolder;
+
+/**
+ * Interface definition for operations with a accessibility target that was invoked.
+ */
+interface TargetOperations {
+    /**
+     * Called when a accessibility target has been invoked and notified to update latest status.
+     */
+    void updateActionItem(@NonNull ViewHolder holder,
+            @ShortcutMenuMode int shortcutMenuMode);
+}
diff --git a/core/java/com/android/internal/accessibility/dialog/ToggleAccessibilityServiceTarget.java b/core/java/com/android/internal/accessibility/dialog/ToggleAccessibilityServiceTarget.java
new file mode 100644
index 0000000..3a42f7e
--- /dev/null
+++ b/core/java/com/android/internal/accessibility/dialog/ToggleAccessibilityServiceTarget.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.accessibility.dialog;
+
+import static com.android.internal.accessibility.util.AccessibilityUtils.isAccessibilityServiceEnabled;
+
+import android.accessibilityservice.AccessibilityServiceInfo;
+import android.annotation.NonNull;
+import android.content.Context;
+import android.view.View;
+import android.view.accessibility.AccessibilityManager.ShortcutType;
+
+import com.android.internal.accessibility.common.ShortcutConstants.AccessibilityFragmentType;
+import com.android.internal.accessibility.common.ShortcutConstants.ShortcutMenuMode;
+import com.android.internal.accessibility.dialog.TargetAdapter.ViewHolder;
+
+/**
+ * Extension for {@link AccessibilityServiceTarget} with {@link AccessibilityFragmentType#TOGGLE}
+ * type.
+ */
+class ToggleAccessibilityServiceTarget extends AccessibilityServiceTarget {
+
+    ToggleAccessibilityServiceTarget(Context context, @ShortcutType int shortcutType,
+            @NonNull AccessibilityServiceInfo serviceInfo) {
+        super(context,
+                shortcutType,
+                AccessibilityFragmentType.TOGGLE,
+                serviceInfo);
+    }
+
+    @Override
+    public void updateActionItem(@NonNull ViewHolder holder,
+            @ShortcutMenuMode int shortcutMenuMode) {
+        super.updateActionItem(holder, shortcutMenuMode);
+
+        final boolean isEditMenuMode =
+                shortcutMenuMode == ShortcutMenuMode.EDIT;
+        holder.mSwitchItem.setVisibility(isEditMenuMode ? View.GONE : View.VISIBLE);
+        holder.mSwitchItem.setChecked(isAccessibilityServiceEnabled(getContext(), getId()));
+    }
+}
diff --git a/core/java/com/android/internal/accessibility/dialog/ToggleWhiteListingFeatureTarget.java b/core/java/com/android/internal/accessibility/dialog/ToggleWhiteListingFeatureTarget.java
new file mode 100644
index 0000000..fcbf5ec
--- /dev/null
+++ b/core/java/com/android/internal/accessibility/dialog/ToggleWhiteListingFeatureTarget.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.accessibility.dialog;
+
+import android.annotation.NonNull;
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.provider.Settings;
+import android.view.View;
+import android.view.accessibility.AccessibilityManager.ShortcutType;
+
+import com.android.internal.accessibility.common.ShortcutConstants.AccessibilityFragmentType;
+import com.android.internal.accessibility.common.ShortcutConstants.ShortcutMenuMode;
+import com.android.internal.accessibility.dialog.TargetAdapter.ViewHolder;
+
+/**
+ * Extension for {@link AccessibilityTarget} with {@link AccessibilityFragmentType#TOGGLE}
+ * type.
+ */
+class ToggleWhiteListingFeatureTarget extends AccessibilityTarget {
+
+    ToggleWhiteListingFeatureTarget(Context context, @ShortcutType int shortcutType,
+            boolean isShortcutSwitched, String id, CharSequence label, Drawable icon, String key) {
+        super(context, shortcutType, AccessibilityFragmentType.TOGGLE,
+                isShortcutSwitched, id, label, icon, key);
+    }
+
+    @Override
+    public void updateActionItem(@NonNull ViewHolder holder,
+            @ShortcutMenuMode int shortcutMenuMode) {
+        super.updateActionItem(holder, shortcutMenuMode);
+
+        final boolean isEditMenuMode =
+                shortcutMenuMode == ShortcutMenuMode.EDIT;
+        holder.mSwitchItem.setVisibility(isEditMenuMode ? View.GONE : View.VISIBLE);
+        holder.mSwitchItem.setChecked(isFeatureEnabled());
+    }
+
+    private boolean isFeatureEnabled() {
+        return Settings.Secure.getInt(getContext().getContentResolver(),
+                getKey(), /* settingsValueOff */ 0) == /* settingsValueOn */ 1;
+    }
+}
diff --git a/core/java/com/android/internal/accessibility/dialog/VolumeShortcutToggleAccessibilityServiceTarget.java b/core/java/com/android/internal/accessibility/dialog/VolumeShortcutToggleAccessibilityServiceTarget.java
new file mode 100644
index 0000000..04f5061
--- /dev/null
+++ b/core/java/com/android/internal/accessibility/dialog/VolumeShortcutToggleAccessibilityServiceTarget.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.accessibility.dialog;
+
+import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_BUTTON;
+import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_SHORTCUT_KEY;
+
+import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType;
+import static com.android.internal.accessibility.util.AccessibilityUtils.setAccessibilityServiceState;
+import static com.android.internal.accessibility.util.ShortcutUtils.optOutValueFromSettings;
+
+import android.accessibilityservice.AccessibilityServiceInfo;
+import android.annotation.NonNull;
+import android.content.ComponentName;
+import android.content.Context;
+import android.view.accessibility.AccessibilityManager.ShortcutType;
+import android.widget.Toast;
+
+import com.android.internal.R;
+import com.android.internal.accessibility.common.ShortcutConstants.AccessibilityFragmentType;
+
+/**
+ * Extension for {@link AccessibilityServiceTarget} with
+ * {@link AccessibilityFragmentType#VOLUME_SHORTCUT_TOGGLE} type.
+ */
+class VolumeShortcutToggleAccessibilityServiceTarget extends AccessibilityServiceTarget {
+
+    VolumeShortcutToggleAccessibilityServiceTarget(Context context, @ShortcutType int shortcutType,
+            @NonNull AccessibilityServiceInfo serviceInfo) {
+        super(context,
+                shortcutType,
+                AccessibilityFragmentType.VOLUME_SHORTCUT_TOGGLE,
+                serviceInfo);
+    }
+
+    @Override
+    public void onCheckedChanged(boolean isChecked) {
+        switch (getShortcutType()) {
+            case ACCESSIBILITY_BUTTON:
+                onCheckedFromAccessibilityButton(isChecked);
+                return;
+            case ACCESSIBILITY_SHORTCUT_KEY:
+                super.onCheckedChanged(isChecked);
+                return;
+            default:
+                throw new IllegalStateException("Unexpected shortcut type");
+        }
+    }
+
+    private void onCheckedFromAccessibilityButton(boolean isChecked) {
+        setShortcutEnabled(isChecked);
+        final ComponentName componentName = ComponentName.unflattenFromString(getId());
+        setAccessibilityServiceState(getContext(), componentName, isChecked);
+
+        if (!isChecked) {
+            optOutValueFromSettings(getContext(), UserShortcutType.HARDWARE, getId());
+
+            final String warningText =
+                    getContext().getString(R.string.accessibility_uncheck_legacy_item_warning,
+                            getLabel());
+            Toast.makeText(getContext(), warningText, Toast.LENGTH_SHORT).show();
+        }
+    }
+}
diff --git a/core/java/com/android/internal/accessibility/util/AccessibilityUtils.java b/core/java/com/android/internal/accessibility/util/AccessibilityUtils.java
index bcbd6ab..e50b010 100644
--- a/core/java/com/android/internal/accessibility/util/AccessibilityUtils.java
+++ b/core/java/com/android/internal/accessibility/util/AccessibilityUtils.java
@@ -15,10 +15,12 @@
  */
 
 package com.android.internal.accessibility.util;
+
 import static com.android.internal.accessibility.common.ShortcutConstants.AccessibilityFragmentType;
 import static com.android.internal.accessibility.common.ShortcutConstants.SERVICES_SEPARATOR;
 
 import android.accessibilityservice.AccessibilityServiceInfo;
+import android.annotation.NonNull;
 import android.content.ComponentName;
 import android.content.Context;
 import android.os.Build;
@@ -26,9 +28,11 @@
 import android.provider.Settings;
 import android.text.TextUtils;
 import android.util.ArraySet;
+import android.view.accessibility.AccessibilityManager;
 
 import java.util.Collections;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Set;
 
 /**
@@ -115,7 +119,7 @@
      * @return int from {@link AccessibilityFragmentType}.
      */
     public static @AccessibilityFragmentType int getAccessibilityServiceFragmentType(
-            AccessibilityServiceInfo accessibilityServiceInfo) {
+            @NonNull AccessibilityServiceInfo accessibilityServiceInfo) {
         final int targetSdk = accessibilityServiceInfo.getResolveInfo()
                 .serviceInfo.applicationInfo.targetSdkVersion;
         final boolean requestA11yButton = (accessibilityServiceInfo.flags
@@ -128,4 +132,27 @@
                 ? AccessibilityFragmentType.INVISIBLE_TOGGLE
                 : AccessibilityFragmentType.TOGGLE;
     }
+
+    /**
+     * Returns if a {@code componentId} service is enabled.
+     *
+     * @param context The current context.
+     * @param componentId The component id that need to be checked.
+     * @return {@code true} if a {@code componentId} service is enabled.
+     */
+    public static boolean isAccessibilityServiceEnabled(Context context,
+            @NonNull String componentId) {
+        final AccessibilityManager am = context.getSystemService(AccessibilityManager.class);
+        final List<AccessibilityServiceInfo> enabledServices =
+                am.getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_ALL_MASK);
+
+        for (AccessibilityServiceInfo info : enabledServices) {
+            final String id = info.getComponentName().flattenToString();
+            if (id.equals(componentId)) {
+                return true;
+            }
+        }
+
+        return false;
+    }
 }
diff --git a/core/java/com/android/internal/accessibility/util/ShortcutUtils.java b/core/java/com/android/internal/accessibility/util/ShortcutUtils.java
index 717e780..c338a29 100644
--- a/core/java/com/android/internal/accessibility/util/ShortcutUtils.java
+++ b/core/java/com/android/internal/accessibility/util/ShortcutUtils.java
@@ -25,8 +25,10 @@
 import android.content.Context;
 import android.provider.Settings;
 import android.text.TextUtils;
+import android.view.accessibility.AccessibilityManager;
 import android.view.accessibility.AccessibilityManager.ShortcutType;
 
+import java.util.List;
 import java.util.StringJoiner;
 
 /**
@@ -39,21 +41,21 @@
             new TextUtils.SimpleStringSplitter(SERVICES_SEPARATOR);
 
     /**
-     * Opts in component name into colon-separated {@link UserShortcutType}
-     * key's string in Settings.
+     * Opts in component id into colon-separated {@link UserShortcutType}
+     * key's string from Settings.
      *
      * @param context The current context.
      * @param shortcutType The preferred shortcut type user selected.
-     * @param componentId The component id that need to be opted out from Settings.
+     * @param componentId The component id that need to be opted in Settings.
      */
     public static void optInValueToSettings(Context context, @UserShortcutType int shortcutType,
-            String componentId) {
+            @NonNull String componentId) {
         final StringJoiner joiner = new StringJoiner(String.valueOf(SERVICES_SEPARATOR));
         final String targetKey = convertToKey(shortcutType);
         final String targetString = Settings.Secure.getString(context.getContentResolver(),
                 targetKey);
 
-        if (hasValueInSettings(context, shortcutType, componentId)) {
+        if (isComponentIdExistingInSettings(context, shortcutType, componentId)) {
             return;
         }
 
@@ -66,14 +68,15 @@
     }
 
     /**
-     * Opts out component name into colon-separated {@code shortcutType} key's string in Settings.
+     * Opts out of component id into colon-separated {@link UserShortcutType} key's string from
+     * Settings.
      *
      * @param context The current context.
      * @param shortcutType The preferred shortcut type user selected.
-     * @param componentId The component id that need to be opted out from Settings.
+     * @param componentId The component id that need to be opted out of Settings.
      */
     public static void optOutValueFromSettings(
-            Context context, @UserShortcutType int shortcutType, String componentId) {
+            Context context, @UserShortcutType int shortcutType, @NonNull String componentId) {
         final StringJoiner joiner = new StringJoiner(String.valueOf(SERVICES_SEPARATOR));
         final String targetsKey = convertToKey(shortcutType);
         final String targetsValue = Settings.Secure.getString(context.getContentResolver(),
@@ -96,36 +99,15 @@
     }
 
     /**
-     * Returns if component name existed in one of {@code shortcutTypes} string in Settings.
-     *
-     * @param context The current context.
-     * @param shortcutTypes A combination of {@link UserShortcutType}.
-     * @param componentId The component name that need to be checked existed in Settings.
-     * @return {@code true} if componentName existed in Settings.
-     */
-    public static boolean hasValuesInSettings(Context context, int shortcutTypes,
-            @NonNull String componentId) {
-        boolean exist = false;
-        if ((shortcutTypes & UserShortcutType.SOFTWARE) == UserShortcutType.SOFTWARE) {
-            exist = hasValueInSettings(context, UserShortcutType.SOFTWARE, componentId);
-        }
-        if (((shortcutTypes & UserShortcutType.HARDWARE) == UserShortcutType.HARDWARE)) {
-            exist |= hasValueInSettings(context, UserShortcutType.HARDWARE, componentId);
-        }
-        return exist;
-    }
-
-
-    /**
-     * Returns if component name existed in Settings.
+     * Returns if component id existed in Settings.
      *
      * @param context The current context.
      * @param shortcutType The preferred shortcut type user selected.
      * @param componentId The component id that need to be checked existed in Settings.
-     * @return {@code true} if componentName existed in Settings.
+     * @return {@code true} if component id existed in Settings.
      */
-    public static boolean hasValueInSettings(Context context, @UserShortcutType int shortcutType,
-            @NonNull String componentId) {
+    public static boolean isComponentIdExistingInSettings(Context context,
+            @UserShortcutType int shortcutType, @NonNull String componentId) {
         final String targetKey = convertToKey(shortcutType);
         final String targetString = Settings.Secure.getString(context.getContentResolver(),
                 targetKey);
@@ -146,7 +128,22 @@
     }
 
     /**
-     * Converts {@link UserShortcutType} to key in Settings.
+     * Returns if a {@code shortcutType} shortcut contains {@code componentId}.
+     *
+     * @param context The current context.
+     * @param shortcutType The preferred shortcut type user selected.
+     * @param componentId The component id that need to be checked.
+     * @return {@code true} if a component id is contained.
+     */
+    public static boolean isShortcutContained(Context context, @ShortcutType int shortcutType,
+            @NonNull String componentId) {
+        final AccessibilityManager am = context.getSystemService(AccessibilityManager.class);
+        final List<String> requiredTargets = am.getAccessibilityShortcutTargets(shortcutType);
+        return requiredTargets.contains(componentId);
+    }
+
+    /**
+     * Converts {@link UserShortcutType} to {@link Settings.Secure} key.
      *
      * @param type The shortcut type.
      * @return Mapping key in Settings.
@@ -169,7 +166,7 @@
      * Converts {@link ShortcutType} to {@link UserShortcutType}.
      *
      * @param type The shortcut type.
-     * @return {@link UserShortcutType}.
+     * @return Mapping type from {@link UserShortcutType}.
      */
     public static @UserShortcutType int convertToUserType(@ShortcutType int type) {
         switch (type) {
diff --git a/core/java/com/android/internal/app/AbstractMultiProfilePagerAdapter.java b/core/java/com/android/internal/app/AbstractMultiProfilePagerAdapter.java
index d43333e..bcb32fb 100644
--- a/core/java/com/android/internal/app/AbstractMultiProfilePagerAdapter.java
+++ b/core/java/com/android/internal/app/AbstractMultiProfilePagerAdapter.java
@@ -300,30 +300,26 @@
     }
 
     private boolean rebuildTab(ResolverListAdapter activeListAdapter, boolean doPostProcessing) {
-        UserHandle listUserHandle = activeListAdapter.getUserHandle();
-
-        if (UserHandle.myUserId() != listUserHandle.getIdentifier()) {
-            if (!mInjector.hasCrossProfileIntents(activeListAdapter.getIntents(),
-                    UserHandle.myUserId(), listUserHandle.getIdentifier())) {
-                if (listUserHandle.equals(mPersonalProfileUserHandle)) {
-                    DevicePolicyEventLogger.createEvent(
-                                DevicePolicyEnums.RESOLVER_EMPTY_STATE_NO_SHARING_TO_PERSONAL)
-                            .setStrings(getMetricsCategory())
-                            .write();
-                    showNoWorkToPersonalIntentsEmptyState(activeListAdapter);
-                } else {
-                    DevicePolicyEventLogger.createEvent(
-                            DevicePolicyEnums.RESOLVER_EMPTY_STATE_NO_SHARING_TO_WORK)
-                            .setStrings(getMetricsCategory())
-                            .write();
-                    showNoPersonalToWorkIntentsEmptyState(activeListAdapter);
-                }
-                return false;
-            }
+        if (shouldShowNoCrossProfileIntentsEmptyState(activeListAdapter)) {
+            activeListAdapter.postListReadyRunnable(doPostProcessing);
+            return false;
         }
         return activeListAdapter.rebuildList(doPostProcessing);
     }
 
+    private boolean shouldShowNoCrossProfileIntentsEmptyState(
+            ResolverListAdapter activeListAdapter) {
+        UserHandle listUserHandle = activeListAdapter.getUserHandle();
+        return UserHandle.myUserId() != listUserHandle.getIdentifier()
+                && allowShowNoCrossProfileIntentsEmptyState()
+                && !mInjector.hasCrossProfileIntents(activeListAdapter.getIntents(),
+                        UserHandle.myUserId(), listUserHandle.getIdentifier());
+    }
+
+    boolean allowShowNoCrossProfileIntentsEmptyState() {
+        return true;
+    }
+
     protected abstract void showWorkProfileOffEmptyState(
             ResolverListAdapter activeListAdapter, View.OnClickListener listener);
 
@@ -353,12 +349,35 @@
      * anyway.
      */
     void showEmptyResolverListEmptyState(ResolverListAdapter listAdapter) {
+        if (maybeShowNoCrossProfileIntentsEmptyState(listAdapter)) {
+            return;
+        }
         if (maybeShowWorkProfileOffEmptyState(listAdapter)) {
             return;
         }
         maybeShowNoAppsAvailableEmptyState(listAdapter);
     }
 
+    private boolean maybeShowNoCrossProfileIntentsEmptyState(ResolverListAdapter listAdapter) {
+        if (!shouldShowNoCrossProfileIntentsEmptyState(listAdapter)) {
+            return false;
+        }
+        if (listAdapter.getUserHandle().equals(mPersonalProfileUserHandle)) {
+            DevicePolicyEventLogger.createEvent(
+                    DevicePolicyEnums.RESOLVER_EMPTY_STATE_NO_SHARING_TO_PERSONAL)
+                    .setStrings(getMetricsCategory())
+                    .write();
+            showNoWorkToPersonalIntentsEmptyState(listAdapter);
+        } else {
+            DevicePolicyEventLogger.createEvent(
+                    DevicePolicyEnums.RESOLVER_EMPTY_STATE_NO_SHARING_TO_WORK)
+                    .setStrings(getMetricsCategory())
+                    .write();
+            showNoPersonalToWorkIntentsEmptyState(listAdapter);
+        }
+        return true;
+    }
+
     /**
      * Returns {@code true} if the work profile off empty state screen is shown.
      */
@@ -418,6 +437,9 @@
         resetViewVisibilitiesForWorkProfileEmptyState(emptyStateView);
         emptyStateView.setVisibility(View.VISIBLE);
 
+        View container = emptyStateView.findViewById(R.id.resolver_empty_state_container);
+        setupContainerPadding(container);
+
         TextView title = emptyStateView.findViewById(R.id.resolver_empty_state_title);
         title.setText(titleRes);
 
@@ -429,21 +451,27 @@
             subtitle.setVisibility(View.GONE);
         }
 
-        ImageView icon = emptyStateView.findViewById(R.id.resolver_empty_state_icon);
         Button button = emptyStateView.findViewById(R.id.resolver_empty_state_button);
+        button.setVisibility(buttonOnClick != null ? View.VISIBLE : View.GONE);
+        button.setOnClickListener(buttonOnClick);
+
+        ImageView icon = emptyStateView.findViewById(R.id.resolver_empty_state_icon);
         if (!getContext().getResources().getBoolean(R.bool.resolver_landscape_phone)) {
             icon.setVisibility(View.VISIBLE);
             icon.setImageResource(iconRes);
-            button.setVisibility(buttonOnClick != null ? View.VISIBLE : View.GONE);
-            button.setOnClickListener(buttonOnClick);
         } else {
             icon.setVisibility(View.GONE);
-            button.setVisibility(View.GONE);
         }
 
         activeListAdapter.markTabLoaded();
     }
 
+    /**
+     * Sets up the padding of the view containing the empty state screens.
+     * <p>This method is meant to be overridden so that subclasses can customize the padding.
+     */
+    protected void setupContainerPadding(View container) {}
+
     private void showConsumerUserNoAppsAvailableEmptyState(ResolverListAdapter activeListAdapter) {
         ProfileDescriptor descriptor = getItem(
                 userHandleToPageIndex(activeListAdapter.getUserHandle()));
diff --git a/core/java/com/android/internal/app/AccessibilityButtonChooserActivity.java b/core/java/com/android/internal/app/AccessibilityButtonChooserActivity.java
deleted file mode 100644
index 4f98a63..0000000
--- a/core/java/com/android/internal/app/AccessibilityButtonChooserActivity.java
+++ /dev/null
@@ -1,800 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.internal.app;
-
-import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_BUTTON;
-import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_SHORTCUT_KEY;
-import static android.view.accessibility.AccessibilityManager.ShortcutType;
-
-import static com.android.internal.accessibility.AccessibilityShortcutController.COLOR_INVERSION_COMPONENT_NAME;
-import static com.android.internal.accessibility.AccessibilityShortcutController.DALTONIZER_COMPONENT_NAME;
-import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_CONTROLLER_NAME;
-import static com.android.internal.accessibility.common.ShortcutConstants.AccessibilityFragmentType;
-import static com.android.internal.accessibility.common.ShortcutConstants.ShortcutMenuMode;
-import static com.android.internal.accessibility.common.ShortcutConstants.TargetType;
-import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType;
-import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.HARDWARE;
-import static com.android.internal.accessibility.common.ShortcutConstants.WhiteListingFeatureElementIndex.COMPONENT_ID;
-import static com.android.internal.accessibility.common.ShortcutConstants.WhiteListingFeatureElementIndex.FRAGMENT_TYPE;
-import static com.android.internal.accessibility.common.ShortcutConstants.WhiteListingFeatureElementIndex.ICON_ID;
-import static com.android.internal.accessibility.common.ShortcutConstants.WhiteListingFeatureElementIndex.LABEL_ID;
-import static com.android.internal.accessibility.common.ShortcutConstants.WhiteListingFeatureElementIndex.SETTINGS_KEY;
-import static com.android.internal.accessibility.util.AccessibilityUtils.getAccessibilityServiceFragmentType;
-import static com.android.internal.accessibility.util.AccessibilityUtils.setAccessibilityServiceState;
-import static com.android.internal.accessibility.util.ShortcutUtils.convertToUserType;
-import static com.android.internal.accessibility.util.ShortcutUtils.hasValuesInSettings;
-import static com.android.internal.accessibility.util.ShortcutUtils.optInValueToSettings;
-import static com.android.internal.accessibility.util.ShortcutUtils.optOutValueFromSettings;
-import static com.android.internal.util.Preconditions.checkArgument;
-
-import android.accessibilityservice.AccessibilityServiceInfo;
-import android.accessibilityservice.AccessibilityShortcutInfo;
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.app.Activity;
-import android.app.ActivityManager;
-import android.app.AlertDialog;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.res.TypedArray;
-import android.graphics.drawable.Drawable;
-import android.os.Build;
-import android.os.Bundle;
-import android.os.storage.StorageManager;
-import android.provider.Settings;
-import android.text.BidiFormatter;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.Window;
-import android.view.accessibility.AccessibilityManager;
-import android.widget.AdapterView;
-import android.widget.BaseAdapter;
-import android.widget.Button;
-import android.widget.CheckBox;
-import android.widget.ImageView;
-import android.widget.Switch;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import com.android.internal.R;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Locale;
-
-/**
- * Activity used to display and persist a service or feature target for the Accessibility button.
- */
-public class AccessibilityButtonChooserActivity extends Activity {
-    @ShortcutType
-    private static int sShortcutType;
-    @UserShortcutType
-    private int mShortcutUserType;
-    private final List<AccessibilityButtonTarget> mTargets = new ArrayList<>();
-    private AlertDialog mAlertDialog;
-    private AlertDialog mEnableDialog;
-    private TargetAdapter mTargetAdapter;
-    private AccessibilityButtonTarget mCurrentCheckedTarget;
-
-    private static final String[][] WHITE_LISTING_FEATURES = {
-            {
-                    COLOR_INVERSION_COMPONENT_NAME.flattenToString(),
-                    String.valueOf(R.string.color_inversion_feature_name),
-                    String.valueOf(R.drawable.ic_accessibility_color_inversion),
-                    String.valueOf(AccessibilityFragmentType.TOGGLE),
-                    Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED,
-            },
-            {
-                    DALTONIZER_COMPONENT_NAME.flattenToString(),
-                    String.valueOf(R.string.color_correction_feature_name),
-                    String.valueOf(R.drawable.ic_accessibility_color_correction),
-                    String.valueOf(AccessibilityFragmentType.TOGGLE),
-                    Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED,
-            },
-            {
-                    MAGNIFICATION_CONTROLLER_NAME,
-                    String.valueOf(R.string.accessibility_magnification_chooser_text),
-                    String.valueOf(R.drawable.ic_accessibility_magnification),
-                    String.valueOf(AccessibilityFragmentType.INVISIBLE_TOGGLE),
-                    Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_NAVBAR_ENABLED,
-            },
-    };
-
-    @Override
-    protected void onCreate(@Nullable Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        final TypedArray theme = getTheme().obtainStyledAttributes(android.R.styleable.Theme);
-        if (!theme.getBoolean(android.R.styleable.Theme_windowNoTitle, /* defValue= */ false)) {
-            requestWindowFeature(Window.FEATURE_NO_TITLE);
-        }
-
-        sShortcutType = getIntent().getIntExtra(AccessibilityManager.EXTRA_SHORTCUT_TYPE,
-                /* unexpectedShortcutType */ -1);
-        final boolean existInShortcutType = (sShortcutType == ACCESSIBILITY_BUTTON)
-                || (sShortcutType == ACCESSIBILITY_SHORTCUT_KEY);
-        checkArgument(existInShortcutType, "Unexpected shortcut type: " + sShortcutType);
-
-        mShortcutUserType = convertToUserType(sShortcutType);
-
-        mTargets.addAll(getServiceTargets(this, sShortcutType));
-
-        final String selectDialogTitle =
-                getString(R.string.accessibility_select_shortcut_menu_title);
-        mTargetAdapter = new TargetAdapter(mTargets);
-        mAlertDialog = new AlertDialog.Builder(this)
-                .setTitle(selectDialogTitle)
-                .setAdapter(mTargetAdapter, /* listener= */ null)
-                .setPositiveButton(
-                        getString(R.string.edit_accessibility_shortcut_menu_button),
-                        /* listener= */ null)
-                .setOnDismissListener(dialog -> finish())
-                .create();
-        mAlertDialog.setOnShowListener(dialog -> updateDialogListeners());
-        mAlertDialog.show();
-    }
-
-    @Override
-    protected void onDestroy() {
-        mAlertDialog.dismiss();
-        super.onDestroy();
-    }
-
-    private static List<AccessibilityButtonTarget> getServiceTargets(@NonNull Context context,
-            @ShortcutType int shortcutType) {
-        final List<AccessibilityButtonTarget> targets = getInstalledServiceTargets(context);
-        final AccessibilityManager ams = context.getSystemService(AccessibilityManager.class);
-        final List<String> requiredTargets = ams.getAccessibilityShortcutTargets(shortcutType);
-        targets.removeIf(target -> !requiredTargets.contains(target.getId()));
-
-        return targets;
-    }
-
-    private static List<AccessibilityButtonTarget> getInstalledServiceTargets(
-            @NonNull Context context) {
-        final List<AccessibilityButtonTarget> targets = new ArrayList<>();
-        targets.addAll(getAccessibilityFilteredTargets(context));
-        targets.addAll(getWhiteListingServiceTargets(context));
-
-        return targets;
-    }
-
-    private static List<AccessibilityButtonTarget> getAccessibilityFilteredTargets(
-            @NonNull Context context) {
-        final List<AccessibilityButtonTarget> serviceTargets =
-                getAccessibilityServiceTargets(context);
-        final List<AccessibilityButtonTarget> activityTargets =
-                getAccessibilityActivityTargets(context);
-
-        for (AccessibilityButtonTarget activityTarget : activityTargets) {
-            serviceTargets.removeIf(serviceTarget -> {
-                final ComponentName serviceComponentName =
-                        ComponentName.unflattenFromString(serviceTarget.getId());
-                final ComponentName activityComponentName =
-                        ComponentName.unflattenFromString(activityTarget.getId());
-                final boolean isSamePackageName = activityComponentName.getPackageName().equals(
-                        serviceComponentName.getPackageName());
-                final boolean isSameLabel = activityTarget.getLabel().equals(
-                        serviceTarget.getLabel());
-
-                return isSamePackageName && isSameLabel;
-            });
-        }
-
-        final List<AccessibilityButtonTarget> targets = new ArrayList<>();
-        targets.addAll(serviceTargets);
-        targets.addAll(activityTargets);
-
-        return targets;
-    }
-
-    private static List<AccessibilityButtonTarget> getAccessibilityServiceTargets(
-            @NonNull Context context) {
-        final AccessibilityManager ams = context.getSystemService(AccessibilityManager.class);
-        final List<AccessibilityServiceInfo> installedServices =
-                ams.getInstalledAccessibilityServiceList();
-        if (installedServices == null) {
-            return Collections.emptyList();
-        }
-
-        final List<AccessibilityButtonTarget> targets = new ArrayList<>(installedServices.size());
-        for (AccessibilityServiceInfo info : installedServices) {
-            final int targetSdk =
-                    info.getResolveInfo().serviceInfo.applicationInfo.targetSdkVersion;
-            final boolean hasRequestAccessibilityButtonFlag =
-                    (info.flags & AccessibilityServiceInfo.FLAG_REQUEST_ACCESSIBILITY_BUTTON) != 0;
-            if ((targetSdk < Build.VERSION_CODES.R) && !hasRequestAccessibilityButtonFlag
-                    && (sShortcutType == ACCESSIBILITY_BUTTON)) {
-                continue;
-            }
-            targets.add(new AccessibilityButtonTarget(context, info));
-        }
-
-        return targets;
-    }
-
-    private static List<AccessibilityButtonTarget> getAccessibilityActivityTargets(
-            @NonNull Context context) {
-        final AccessibilityManager ams = context.getSystemService(AccessibilityManager.class);
-        final List<AccessibilityShortcutInfo> installedServices =
-                ams.getInstalledAccessibilityShortcutListAsUser(context,
-                        ActivityManager.getCurrentUser());
-        if (installedServices == null) {
-            return Collections.emptyList();
-        }
-
-        final List<AccessibilityButtonTarget> targets = new ArrayList<>(installedServices.size());
-        for (AccessibilityShortcutInfo info : installedServices) {
-            targets.add(new AccessibilityButtonTarget(context, info));
-        }
-
-        return targets;
-    }
-
-    private static List<AccessibilityButtonTarget> getWhiteListingServiceTargets(
-            @NonNull Context context) {
-        final List<AccessibilityButtonTarget> targets = new ArrayList<>();
-
-        for (int i = 0; i < WHITE_LISTING_FEATURES.length; i++) {
-            final AccessibilityButtonTarget target = new AccessibilityButtonTarget(
-                    context,
-                    WHITE_LISTING_FEATURES[i][COMPONENT_ID],
-                    Integer.parseInt(WHITE_LISTING_FEATURES[i][LABEL_ID]),
-                    Integer.parseInt(WHITE_LISTING_FEATURES[i][ICON_ID]),
-                    Integer.parseInt(WHITE_LISTING_FEATURES[i][FRAGMENT_TYPE]));
-            targets.add(target);
-        }
-
-        return targets;
-    }
-
-    private static boolean isWhiteListingServiceEnabled(@NonNull Context context,
-            AccessibilityButtonTarget target) {
-
-        for (int i = 0; i < WHITE_LISTING_FEATURES.length; i++) {
-            if (WHITE_LISTING_FEATURES[i][COMPONENT_ID].equals(target.getId())) {
-                return Settings.Secure.getInt(context.getContentResolver(),
-                        WHITE_LISTING_FEATURES[i][SETTINGS_KEY],
-                        /* settingsValueOff */ 0) == /* settingsValueOn */ 1;
-            }
-        }
-
-        return false;
-    }
-
-    private static boolean isWhiteListingService(String componentId) {
-        for (int i = 0; i < WHITE_LISTING_FEATURES.length; i++) {
-            if (WHITE_LISTING_FEATURES[i][COMPONENT_ID].equals(componentId)) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    private void setWhiteListingServiceEnabled(String componentId, int settingsValue) {
-        for (int i = 0; i < WHITE_LISTING_FEATURES.length; i++) {
-            if (WHITE_LISTING_FEATURES[i][COMPONENT_ID].equals(componentId)) {
-                Settings.Secure.putInt(getContentResolver(),
-                        WHITE_LISTING_FEATURES[i][SETTINGS_KEY], settingsValue);
-                return;
-            }
-        }
-    }
-
-    private void setServiceEnabled(String componentId, boolean enabled) {
-        if (isWhiteListingService(componentId)) {
-            setWhiteListingServiceEnabled(componentId,
-                    enabled ? /* settingsValueOn */ 1 : /* settingsValueOff */ 0);
-        } else {
-            final ComponentName componentName = ComponentName.unflattenFromString(componentId);
-            setAccessibilityServiceState(this, componentName, enabled);
-        }
-    }
-
-    private static class ViewHolder {
-        View mItemView;
-        CheckBox mCheckBox;
-        ImageView mIconView;
-        TextView mLabelView;
-        Switch mSwitchItem;
-    }
-
-    private static class TargetAdapter extends BaseAdapter {
-        @ShortcutMenuMode
-        private int mShortcutMenuMode = ShortcutMenuMode.LAUNCH;
-        private List<AccessibilityButtonTarget> mButtonTargets;
-
-        TargetAdapter(List<AccessibilityButtonTarget> targets) {
-            this.mButtonTargets = targets;
-        }
-
-        void setShortcutMenuMode(@ShortcutMenuMode int shortcutMenuMode) {
-            mShortcutMenuMode = shortcutMenuMode;
-        }
-
-        @ShortcutMenuMode
-        int getShortcutMenuMode() {
-            return mShortcutMenuMode;
-        }
-
-        @Override
-        public int getCount() {
-            return mButtonTargets.size();
-        }
-
-        @Override
-        public Object getItem(int position) {
-            return mButtonTargets.get(position);
-        }
-
-        @Override
-        public long getItemId(int position) {
-            return position;
-        }
-
-        @Override
-        public View getView(int position, View convertView, ViewGroup parent) {
-            final Context context = parent.getContext();
-            ViewHolder holder;
-            if (convertView == null) {
-                convertView = LayoutInflater.from(context).inflate(
-                        R.layout.accessibility_button_chooser_item, parent, /* attachToRoot= */
-                        false);
-                holder = new ViewHolder();
-                holder.mItemView = convertView;
-                holder.mCheckBox = convertView.findViewById(
-                        R.id.accessibility_button_target_checkbox);
-                holder.mIconView = convertView.findViewById(R.id.accessibility_button_target_icon);
-                holder.mLabelView = convertView.findViewById(
-                        R.id.accessibility_button_target_label);
-                holder.mSwitchItem = convertView.findViewById(
-                        R.id.accessibility_button_target_switch_item);
-                convertView.setTag(holder);
-            } else {
-                holder = (ViewHolder) convertView.getTag();
-            }
-
-            final AccessibilityButtonTarget target = mButtonTargets.get(position);
-            updateActionItem(context, holder, target);
-
-            return convertView;
-        }
-
-        private void updateActionItem(@NonNull Context context,
-                @NonNull ViewHolder holder, AccessibilityButtonTarget target) {
-
-            switch (target.getFragmentType()) {
-                case AccessibilityFragmentType.VOLUME_SHORTCUT_TOGGLE:
-                    updateVolumeShortcutToggleTargetActionItemVisibility(holder, target);
-                    break;
-                case AccessibilityFragmentType.INVISIBLE_TOGGLE:
-                    updateInvisibleToggleTargetActionItemVisibility(holder, target);
-                    break;
-                case AccessibilityFragmentType.TOGGLE:
-                    updateToggleTargetActionItemVisibility(context, holder, target);
-                    break;
-                case AccessibilityFragmentType.LAUNCH_ACTIVITY:
-                    updateLaunchActivityTargetActionItemVisibility(holder, target);
-                    break;
-                default:
-                    throw new IllegalStateException("Unexpected fragment type");
-            }
-        }
-
-        private void updateVolumeShortcutToggleTargetActionItemVisibility(
-                @NonNull ViewHolder holder, AccessibilityButtonTarget target) {
-            final boolean isLaunchMenuMode = (mShortcutMenuMode == ShortcutMenuMode.LAUNCH);
-
-            holder.mCheckBox.setChecked(!isLaunchMenuMode && target.isChecked());
-            holder.mCheckBox.setVisibility(isLaunchMenuMode ? View.GONE : View.VISIBLE);
-            holder.mIconView.setImageDrawable(target.getDrawable());
-            holder.mLabelView.setText(target.getLabel());
-            holder.mSwitchItem.setVisibility(View.GONE);
-        }
-
-        private void updateInvisibleToggleTargetActionItemVisibility(@NonNull ViewHolder holder,
-                AccessibilityButtonTarget target) {
-            final boolean isEditMenuMode = (mShortcutMenuMode == ShortcutMenuMode.EDIT);
-
-            holder.mCheckBox.setChecked(isEditMenuMode && target.isChecked());
-            holder.mCheckBox.setVisibility(isEditMenuMode ? View.VISIBLE : View.GONE);
-            holder.mIconView.setImageDrawable(target.getDrawable());
-            holder.mLabelView.setText(target.getLabel());
-            holder.mSwitchItem.setVisibility(View.GONE);
-        }
-
-        private void updateToggleTargetActionItemVisibility(@NonNull Context context,
-                @NonNull ViewHolder holder, AccessibilityButtonTarget target) {
-            final boolean isEditMenuMode = (mShortcutMenuMode == ShortcutMenuMode.EDIT);
-            final boolean isServiceEnabled = isWhiteListingService(target.getId())
-                    ? isWhiteListingServiceEnabled(context, target)
-                    : isAccessibilityServiceEnabled(context, target);
-
-            holder.mCheckBox.setChecked(isEditMenuMode && target.isChecked());
-            holder.mCheckBox.setVisibility(isEditMenuMode ? View.VISIBLE : View.GONE);
-            holder.mIconView.setImageDrawable(target.getDrawable());
-            holder.mLabelView.setText(target.getLabel());
-            holder.mSwitchItem.setVisibility(isEditMenuMode ? View.GONE : View.VISIBLE);
-            holder.mSwitchItem.setChecked(!isEditMenuMode && isServiceEnabled);
-        }
-
-        private void updateLaunchActivityTargetActionItemVisibility(@NonNull ViewHolder holder,
-                AccessibilityButtonTarget target) {
-            final boolean isEditMenuMode = (mShortcutMenuMode == ShortcutMenuMode.EDIT);
-
-            holder.mCheckBox.setChecked(isEditMenuMode && target.isChecked());
-            holder.mCheckBox.setVisibility(isEditMenuMode ? View.VISIBLE : View.GONE);
-            holder.mIconView.setImageDrawable(target.getDrawable());
-            holder.mLabelView.setText(target.getLabel());
-            holder.mSwitchItem.setVisibility(View.GONE);
-        }
-    }
-
-    private static class AccessibilityButtonTarget {
-        private String mId;
-        @TargetType
-        private int mType;
-        private boolean mChecked;
-        private CharSequence mLabel;
-        private Drawable mDrawable;
-        @AccessibilityFragmentType
-        private int mFragmentType;
-
-        AccessibilityButtonTarget(@NonNull Context context,
-                @NonNull AccessibilityServiceInfo serviceInfo) {
-            this.mId = serviceInfo.getComponentName().flattenToString();
-            this.mType = TargetType.ACCESSIBILITY_SERVICE;
-            this.mChecked = isTargetShortcutUsed(context, mId);
-            this.mLabel = serviceInfo.getResolveInfo().loadLabel(context.getPackageManager());
-            this.mDrawable = serviceInfo.getResolveInfo().loadIcon(context.getPackageManager());
-            this.mFragmentType = getAccessibilityServiceFragmentType(serviceInfo);
-        }
-
-        AccessibilityButtonTarget(@NonNull Context context,
-                @NonNull AccessibilityShortcutInfo shortcutInfo) {
-            this.mId = shortcutInfo.getComponentName().flattenToString();
-            this.mType = TargetType.ACCESSIBILITY_ACTIVITY;
-            this.mChecked = isTargetShortcutUsed(context, mId);
-            this.mLabel = shortcutInfo.getActivityInfo().loadLabel(context.getPackageManager());
-            this.mDrawable = shortcutInfo.getActivityInfo().loadIcon(context.getPackageManager());
-            this.mFragmentType = AccessibilityFragmentType.LAUNCH_ACTIVITY;
-        }
-
-        AccessibilityButtonTarget(Context context, @NonNull String id, int labelResId,
-                int iconRes, @AccessibilityFragmentType int fragmentType) {
-            this.mId = id;
-            this.mType = TargetType.WHITE_LISTING;
-            this.mChecked = isTargetShortcutUsed(context, mId);
-            this.mLabel = context.getText(labelResId);
-            this.mDrawable = context.getDrawable(iconRes);
-            this.mFragmentType = fragmentType;
-        }
-
-        public void setChecked(boolean checked) {
-            mChecked = checked;
-        }
-
-        public String getId() {
-            return mId;
-        }
-
-        public int getType() {
-            return mType;
-        }
-
-        public boolean isChecked() {
-            return mChecked;
-        }
-
-        public CharSequence getLabel() {
-            return mLabel;
-        }
-
-        public Drawable getDrawable() {
-            return mDrawable;
-        }
-
-        public int getFragmentType() {
-            return mFragmentType;
-        }
-    }
-
-    private static boolean isAccessibilityServiceEnabled(@NonNull Context context,
-            AccessibilityButtonTarget target) {
-        final AccessibilityManager ams = context.getSystemService(AccessibilityManager.class);
-        final List<AccessibilityServiceInfo> enabledServices =
-                ams.getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_ALL_MASK);
-
-        for (AccessibilityServiceInfo info : enabledServices) {
-            final String id = info.getComponentName().flattenToString();
-            if (id.equals(target.getId())) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    private void onTargetSelected(AdapterView<?> parent, View view, int position, long id) {
-        final AccessibilityButtonTarget target = mTargets.get(position);
-        switch (target.getFragmentType()) {
-            case AccessibilityFragmentType.VOLUME_SHORTCUT_TOGGLE:
-                onVolumeShortcutToggleTargetSelected(target);
-                break;
-            case AccessibilityFragmentType.INVISIBLE_TOGGLE:
-                onInvisibleToggleTargetSelected(target);
-                break;
-            case AccessibilityFragmentType.TOGGLE:
-                onToggleTargetSelected(target);
-                break;
-            case AccessibilityFragmentType.LAUNCH_ACTIVITY:
-                onLaunchActivityTargetSelected(target);
-                break;
-            default:
-                throw new IllegalStateException("Unexpected fragment type");
-        }
-
-        mAlertDialog.dismiss();
-    }
-
-    private void onVolumeShortcutToggleTargetSelected(AccessibilityButtonTarget target) {
-        if (sShortcutType == ACCESSIBILITY_BUTTON) {
-            final AccessibilityManager ams = getSystemService(AccessibilityManager.class);
-            ams.notifyAccessibilityButtonClicked(getDisplayId(), target.getId());
-        } else if (sShortcutType == ACCESSIBILITY_SHORTCUT_KEY) {
-            switchServiceState(target);
-        }
-    }
-
-    private void onInvisibleToggleTargetSelected(AccessibilityButtonTarget target) {
-        final AccessibilityManager ams = getSystemService(AccessibilityManager.class);
-        if (sShortcutType == ACCESSIBILITY_BUTTON) {
-            ams.notifyAccessibilityButtonClicked(getDisplayId(), target.getId());
-        } else if (sShortcutType == ACCESSIBILITY_SHORTCUT_KEY) {
-            ams.performAccessibilityShortcut(target.getId());
-        }
-    }
-
-    private void onToggleTargetSelected(AccessibilityButtonTarget target) {
-        switchServiceState(target);
-    }
-
-    private void onLaunchActivityTargetSelected(AccessibilityButtonTarget target) {
-        final AccessibilityManager ams = getSystemService(AccessibilityManager.class);
-        if (sShortcutType == ACCESSIBILITY_BUTTON) {
-            ams.notifyAccessibilityButtonClicked(getDisplayId(), target.getId());
-        } else if (sShortcutType == ACCESSIBILITY_SHORTCUT_KEY) {
-            ams.performAccessibilityShortcut(target.getId());
-        }
-    }
-
-    private void switchServiceState(AccessibilityButtonTarget target) {
-        final ComponentName componentName =
-                ComponentName.unflattenFromString(target.getId());
-        final String componentId = componentName.flattenToString();
-
-        if (isWhiteListingService(componentId)) {
-            setWhiteListingServiceEnabled(componentId,
-                    isWhiteListingServiceEnabled(this, target)
-                            ? /* settingsValueOff */ 0
-                            : /* settingsValueOn */ 1);
-        } else {
-            setAccessibilityServiceState(this, componentName,
-                    /* enabled= */!isAccessibilityServiceEnabled(this, target));
-        }
-    }
-
-    private void onTargetChecked(AdapterView<?> parent, View view, int position, long id) {
-        mCurrentCheckedTarget = mTargets.get(position);
-
-        if ((mCurrentCheckedTarget.getType() == TargetType.ACCESSIBILITY_SERVICE)
-                && !mCurrentCheckedTarget.isChecked()) {
-            mEnableDialog = new AlertDialog.Builder(this)
-                    .setView(createEnableDialogContentView(this, mCurrentCheckedTarget,
-                            this::onPermissionAllowButtonClicked,
-                            this::onPermissionDenyButtonClicked))
-                    .create();
-            mEnableDialog.show();
-            return;
-        }
-
-        onTargetChecked(mCurrentCheckedTarget, !mCurrentCheckedTarget.isChecked());
-    }
-
-    private void onTargetChecked(AccessibilityButtonTarget target, boolean checked) {
-        switch (target.getFragmentType()) {
-            case AccessibilityFragmentType.VOLUME_SHORTCUT_TOGGLE:
-                onVolumeShortcutToggleTargetChecked(checked);
-                break;
-            case AccessibilityFragmentType.INVISIBLE_TOGGLE:
-                onInvisibleToggleTargetChecked(checked);
-                break;
-            case AccessibilityFragmentType.TOGGLE:
-                onToggleTargetChecked(checked);
-                break;
-            case AccessibilityFragmentType.LAUNCH_ACTIVITY:
-                onLaunchActivityTargetChecked(checked);
-                break;
-            default:
-                throw new IllegalStateException("Unexpected fragment type");
-        }
-    }
-
-    private void onVolumeShortcutToggleTargetChecked(boolean checked) {
-        if (sShortcutType == ACCESSIBILITY_BUTTON) {
-            setServiceEnabled(mCurrentCheckedTarget.getId(), checked);
-            if (!checked) {
-                optOutValueFromSettings(this, HARDWARE, mCurrentCheckedTarget.getId());
-                final String warningText =
-                        getString(R.string.accessibility_uncheck_legacy_item_warning,
-                                mCurrentCheckedTarget.getLabel());
-                Toast.makeText(this, warningText, Toast.LENGTH_SHORT).show();
-            }
-        } else if (sShortcutType == ACCESSIBILITY_SHORTCUT_KEY) {
-            updateValueToSettings(mCurrentCheckedTarget.getId(), checked);
-        } else {
-            throw new IllegalStateException("Unexpected shortcut type");
-        }
-
-        mCurrentCheckedTarget.setChecked(checked);
-        mTargetAdapter.notifyDataSetChanged();
-    }
-
-    private void onInvisibleToggleTargetChecked(boolean checked) {
-        final int shortcutTypes = UserShortcutType.SOFTWARE | HARDWARE;
-        if (!hasValuesInSettings(this, shortcutTypes, mCurrentCheckedTarget.getId())) {
-            setServiceEnabled(mCurrentCheckedTarget.getId(), checked);
-        }
-
-        updateValueToSettings(mCurrentCheckedTarget.getId(), checked);
-        mCurrentCheckedTarget.setChecked(checked);
-        mTargetAdapter.notifyDataSetChanged();
-    }
-
-    private void onToggleTargetChecked(boolean checked) {
-        updateValueToSettings(mCurrentCheckedTarget.getId(), checked);
-        mCurrentCheckedTarget.setChecked(checked);
-        mTargetAdapter.notifyDataSetChanged();
-    }
-
-    private void onLaunchActivityTargetChecked(boolean checked) {
-        updateValueToSettings(mCurrentCheckedTarget.getId(), checked);
-        mCurrentCheckedTarget.setChecked(checked);
-        mTargetAdapter.notifyDataSetChanged();
-    }
-
-    private void updateValueToSettings(String componentId, boolean checked) {
-        if (checked) {
-            optInValueToSettings(this, mShortcutUserType, componentId);
-        } else  {
-            optOutValueFromSettings(this, mShortcutUserType, componentId);
-        }
-    }
-
-    private void onDoneButtonClicked() {
-        mTargets.clear();
-        mTargets.addAll(getServiceTargets(this, sShortcutType));
-        if (mTargets.isEmpty()) {
-            mAlertDialog.dismiss();
-            return;
-        }
-
-        mTargetAdapter.setShortcutMenuMode(ShortcutMenuMode.LAUNCH);
-        mTargetAdapter.notifyDataSetChanged();
-
-        mAlertDialog.getButton(DialogInterface.BUTTON_POSITIVE).setText(
-                getString(R.string.edit_accessibility_shortcut_menu_button));
-
-        updateDialogListeners();
-    }
-
-    private void onEditButtonClicked() {
-        mTargets.clear();
-        mTargets.addAll(getInstalledServiceTargets(this));
-        mTargetAdapter.setShortcutMenuMode(ShortcutMenuMode.EDIT);
-        mTargetAdapter.notifyDataSetChanged();
-
-        mAlertDialog.getButton(DialogInterface.BUTTON_POSITIVE).setText(
-                getString(R.string.done_accessibility_shortcut_menu_button));
-
-        updateDialogListeners();
-    }
-
-    private void updateDialogListeners() {
-        final boolean isEditMenuMode =
-                (mTargetAdapter.getShortcutMenuMode() == ShortcutMenuMode.EDIT);
-        final int selectDialogTitleId = R.string.accessibility_select_shortcut_menu_title;
-        final int editDialogTitleId =
-                (sShortcutType == ACCESSIBILITY_BUTTON)
-                        ? R.string.accessibility_edit_shortcut_menu_button_title
-                        : R.string.accessibility_edit_shortcut_menu_volume_title;
-
-        mAlertDialog.setTitle(getString(isEditMenuMode ? editDialogTitleId : selectDialogTitleId));
-        mAlertDialog.getButton(DialogInterface.BUTTON_POSITIVE).setOnClickListener(
-                isEditMenuMode ? view -> onDoneButtonClicked() : view -> onEditButtonClicked());
-        mAlertDialog.getListView().setOnItemClickListener(
-                isEditMenuMode ? this::onTargetChecked : this::onTargetSelected);
-    }
-
-    private static boolean isTargetShortcutUsed(@NonNull Context context, String id) {
-        final AccessibilityManager ams = context.getSystemService(AccessibilityManager.class);
-        final List<String> requiredTargets = ams.getAccessibilityShortcutTargets(sShortcutType);
-        return requiredTargets.contains(id);
-    }
-
-    private void onPermissionAllowButtonClicked(View view) {
-        if (mCurrentCheckedTarget.getFragmentType()
-                != AccessibilityFragmentType.VOLUME_SHORTCUT_TOGGLE) {
-            updateValueToSettings(mCurrentCheckedTarget.getId(), /* checked= */ true);
-        }
-        onTargetChecked(mCurrentCheckedTarget, /* checked= */ true);
-        mEnableDialog.dismiss();
-    }
-
-    private void onPermissionDenyButtonClicked(View view) {
-        mEnableDialog.dismiss();
-    }
-
-    private static View createEnableDialogContentView(Context context,
-            AccessibilityButtonTarget target, View.OnClickListener allowListener,
-            View.OnClickListener denyListener) {
-        final LayoutInflater inflater = (LayoutInflater) context.getSystemService(
-                Context.LAYOUT_INFLATER_SERVICE);
-
-        final View content = inflater.inflate(
-                R.layout.accessibility_enable_service_encryption_warning, /* root= */ null);
-
-        final TextView encryptionWarningView = (TextView) content.findViewById(
-                R.id.accessibility_encryption_warning);
-        if (StorageManager.isNonDefaultBlockEncrypted()) {
-            final String text = context.getString(
-                    R.string.accessibility_enable_service_encryption_warning,
-                    getServiceName(context, target.getLabel()));
-            encryptionWarningView.setText(text);
-            encryptionWarningView.setVisibility(View.VISIBLE);
-        } else {
-            encryptionWarningView.setVisibility(View.GONE);
-        }
-
-        final ImageView permissionDialogIcon = content.findViewById(
-                R.id.accessibility_permissionDialog_icon);
-        permissionDialogIcon.setImageDrawable(target.getDrawable());
-
-        final TextView permissionDialogTitle = content.findViewById(
-                R.id.accessibility_permissionDialog_title);
-        permissionDialogTitle.setText(context.getString(R.string.accessibility_enable_service_title,
-                getServiceName(context, target.getLabel())));
-
-        final Button permissionAllowButton = content.findViewById(
-                R.id.accessibility_permission_enable_allow_button);
-        final Button permissionDenyButton = content.findViewById(
-                R.id.accessibility_permission_enable_deny_button);
-        permissionAllowButton.setOnClickListener(allowListener);
-        permissionDenyButton.setOnClickListener(denyListener);
-
-        return content;
-    }
-
-    // Gets the service name and bidi wrap it to protect from bidi side effects.
-    private static CharSequence getServiceName(Context context, CharSequence label) {
-        final Locale locale = context.getResources().getConfiguration().getLocales().get(0);
-        return BidiFormatter.getInstance(locale).unicodeWrap(label);
-    }
-}
diff --git a/core/java/com/android/internal/app/AppPredictionServiceResolverComparator.java b/core/java/com/android/internal/app/AppPredictionServiceResolverComparator.java
index ba8c7b3..def1137 100644
--- a/core/java/com/android/internal/app/AppPredictionServiceResolverComparator.java
+++ b/core/java/com/android/internal/app/AppPredictionServiceResolverComparator.java
@@ -163,6 +163,9 @@
 
     @Override
     List<ComponentName> getTopComponentNames(int topK) {
+        if (mResolverRankerService != null) {
+            return mResolverRankerService.getTopComponentNames(topK);
+        }
         return mTargetRanks.entrySet().stream()
                 .sorted(Entry.comparingByValue())
                 .limit(topK)
diff --git a/core/java/com/android/internal/app/ChooserActivity.java b/core/java/com/android/internal/app/ChooserActivity.java
index c82ab6c..b671fa7 100644
--- a/core/java/com/android/internal/app/ChooserActivity.java
+++ b/core/java/com/android/internal/app/ChooserActivity.java
@@ -169,6 +169,17 @@
     public static final String EXTRA_PRIVATE_RETAIN_IN_ON_STOP
             = "com.android.internal.app.ChooserActivity.EXTRA_PRIVATE_RETAIN_IN_ON_STOP";
 
+    /**
+     * Integer extra to indicate which profile should be automatically selected.
+     * <p>Can only be used if there is a work profile.
+     * <p>Possible values can be either {@link #PROFILE_PERSONAL} or {@link #PROFILE_WORK}.
+     */
+    static final String EXTRA_SELECTED_PROFILE =
+            "com.android.internal.app.ChooserActivity.EXTRA_SELECTED_PROFILE";
+
+    static final int PROFILE_PERSONAL = AbstractMultiProfilePagerAdapter.PROFILE_PERSONAL;
+    static final int PROFILE_WORK = AbstractMultiProfilePagerAdapter.PROFILE_WORK;
+
     private static final String PREF_NUM_SHEET_EXPANSIONS = "pref_num_sheet_expansions";
 
     private static final String CHIP_LABEL_METADATA_KEY = "android.service.chooser.chip_label";
@@ -860,15 +871,31 @@
                 filterLastUsed,
                 mUseLayoutForBrowsables,
                 /* userHandle */ getWorkProfileUserHandle());
+        int selectedProfile = findSelectedProfile();
         return new ChooserMultiProfilePagerAdapter(
                 /* context */ this,
                 personalAdapter,
                 workAdapter,
-                /* defaultProfile */ getCurrentProfile(),
+                selectedProfile,
                 getPersonalProfileUserHandle(),
                 getWorkProfileUserHandle());
     }
 
+    private int findSelectedProfile() {
+        int selectedProfile;
+        if (getIntent().hasExtra(EXTRA_SELECTED_PROFILE)) {
+            selectedProfile = getIntent().getIntExtra(EXTRA_SELECTED_PROFILE, /* defValue = */ -1);
+            if (selectedProfile != PROFILE_PERSONAL && selectedProfile != PROFILE_WORK) {
+                throw new IllegalArgumentException(EXTRA_SELECTED_PROFILE + " has invalid value "
+                        + selectedProfile + ". Must be either ChooserActivity.PROFILE_PERSONAL or "
+                        + "ChooserActivity.PROFILE_WORK.");
+            }
+        } else {
+            selectedProfile = getProfileForUser(getUser());
+        }
+        return selectedProfile;
+    }
+
     @Override
     protected boolean postRebuildList(boolean rebuildCompleted) {
         updateStickyContentPreview();
@@ -2144,7 +2171,7 @@
                         mChooserMultiProfilePagerAdapter.getActiveListAdapter();
                 if (currentListAdapter != null) {
                     currentListAdapter.updateModel(info.getResolvedComponentName());
-                    currentListAdapter.updateChooserCounts(ri.activityInfo.packageName, getUserId(),
+                    currentListAdapter.updateChooserCounts(ri.activityInfo.packageName,
                             targetIntent.getAction());
                 }
                 if (DEBUG) {
@@ -2479,7 +2506,10 @@
                         gridAdapter.getMaxTargetsPerRow());
             }
 
-            if (mChooserMultiProfilePagerAdapter.getCurrentUserHandle() != getUser()) {
+            UserHandle currentUserHandle = mChooserMultiProfilePagerAdapter.getCurrentUserHandle();
+            int currentProfile = getProfileForUser(currentUserHandle);
+            int initialProfile = findSelectedProfile();
+            if (currentProfile != initialProfile) {
                 return;
             }
 
@@ -2576,6 +2606,20 @@
         }
     }
 
+    /**
+     * Returns {@link #PROFILE_PERSONAL}, {@link #PROFILE_WORK}, or -1 if the given user handle
+     * does not match either the personal or work user handle.
+     **/
+    private int getProfileForUser(UserHandle currentUserHandle) {
+        if (currentUserHandle.equals(getPersonalProfileUserHandle())) {
+            return PROFILE_PERSONAL;
+        } else if (currentUserHandle.equals(getWorkProfileUserHandle())) {
+            return PROFILE_WORK;
+        }
+        Log.e(TAG, "User " + currentUserHandle + " does not belong to a personal or work profile.");
+        return -1;
+    }
+
     private ViewGroup getCurrentEmptyStateView() {
         int currentPage = mChooserMultiProfilePagerAdapter.getCurrentPage();
         return mChooserMultiProfilePagerAdapter.getItem(currentPage).getEmptyStateView();
@@ -2677,11 +2721,12 @@
     }
 
     private void setupScrollListener() {
-        if (mResolverDrawerLayout == null || shouldShowTabs()) {
+        if (mResolverDrawerLayout == null) {
             return;
         }
-        final View chooserHeader = mResolverDrawerLayout.findViewById(R.id.chooser_header);
-        final float defaultElevation = chooserHeader.getElevation();
+        int elevatedViewResId = shouldShowTabs() ? R.id.resolver_tab_divider : R.id.chooser_header;
+        final View elevatedView = mResolverDrawerLayout.findViewById(elevatedViewResId);
+        final float defaultElevation = elevatedView.getElevation();
         final float chooserHeaderScrollElevation =
                 getResources().getDimensionPixelSize(R.dimen.chooser_header_scroll_elevation);
 
@@ -2694,12 +2739,12 @@
                         if (view.getChildCount() > 0) {
                             View child = view.getLayoutManager().findViewByPosition(0);
                             if (child == null || child.getTop() < 0) {
-                                chooserHeader.setElevation(chooserHeaderScrollElevation);
+                                elevatedView.setElevation(chooserHeaderScrollElevation);
                                 return;
                             }
                         }
 
-                        chooserHeader.setElevation(defaultElevation);
+                        elevatedView.setElevation(defaultElevation);
                     }
                 });
     }
@@ -2841,6 +2886,13 @@
         return METRICS_CATEGORY_CHOOSER;
     }
 
+    @Override
+    protected void onProfileTabSelected() {
+        ChooserGridAdapter currentRootAdapter =
+                mChooserMultiProfilePagerAdapter.getCurrentRootAdapter();
+        currentRootAdapter.updateDirectShareExpansion();
+    }
+
     /**
      * Adapter for all types of items and targets in ShareSheet.
      * Note that ranked sections like Direct Share - while appearing grid-like - are handled on the
@@ -3313,15 +3365,7 @@
         }
 
         public void handleScroll(View v, int y, int oldy) {
-            // Only expand direct share area if there is a minimum number of shortcuts,
-            // which will help reduce the amount of visible shuffling due to older-style
-            // direct share targets.
-            int orientation = getResources().getConfiguration().orientation;
-            boolean canExpandDirectShare =
-                    mChooserListAdapter.getNumShortcutResults() > getMaxTargetsPerRow()
-                    && orientation == Configuration.ORIENTATION_PORTRAIT
-                    && !isInMultiWindowMode();
-
+            boolean canExpandDirectShare = canExpandDirectShare();
             if (mDirectShareViewHolder != null && canExpandDirectShare) {
                 mDirectShareViewHolder.handleScroll(
                         mChooserMultiProfilePagerAdapter.getActiveAdapterView(), y, oldy,
@@ -3329,6 +3373,18 @@
             }
         }
 
+        /**
+         * Only expand direct share area if there is a minimum number of shortcuts,
+         * which will help reduce the amount of visible shuffling due to older-style
+         * direct share targets.
+         */
+        private boolean canExpandDirectShare() {
+            int orientation = getResources().getConfiguration().orientation;
+            return mChooserListAdapter.getNumShortcutResults() > getMaxTargetsPerRow()
+                    && orientation == Configuration.ORIENTATION_PORTRAIT
+                    && !isInMultiWindowMode();
+        }
+
         public ChooserListAdapter getListAdapter() {
             return mChooserListAdapter;
         }
@@ -3336,6 +3392,19 @@
         boolean shouldCellSpan(int position) {
             return getItemViewType(position) == VIEW_TYPE_NORMAL;
         }
+
+        void updateDirectShareExpansion() {
+            if (mDirectShareViewHolder == null || !canExpandDirectShare()) {
+                return;
+            }
+            RecyclerView activeAdapterView =
+                    mChooserMultiProfilePagerAdapter.getActiveAdapterView();
+            if (mResolverDrawerLayout.isCollapsed()) {
+                mDirectShareViewHolder.collapse(activeAdapterView);
+            } else {
+                mDirectShareViewHolder.expand(activeAdapterView);
+            }
+        }
     }
 
     /**
@@ -3533,6 +3602,20 @@
             newHeight = Math.max(newHeight, mDirectShareMinHeight);
             yDiff = newHeight - prevHeight;
 
+            updateDirectShareRowHeight(view, yDiff, newHeight);
+        }
+
+        void expand(RecyclerView view) {
+            updateDirectShareRowHeight(view, mDirectShareMaxHeight - mDirectShareCurrHeight,
+                    mDirectShareMaxHeight);
+        }
+
+        void collapse(RecyclerView view) {
+            updateDirectShareRowHeight(view, mDirectShareMinHeight - mDirectShareCurrHeight,
+                    mDirectShareMinHeight);
+        }
+
+        private void updateDirectShareRowHeight(RecyclerView view, int yDiff, int newHeight) {
             if (view == null || view.getChildCount() == 0 || yDiff == 0) {
                 return;
             }
diff --git a/core/java/com/android/internal/app/ChooserActivityLogger.java b/core/java/com/android/internal/app/ChooserActivityLogger.java
index 088973c..c26bac4 100644
--- a/core/java/com/android/internal/app/ChooserActivityLogger.java
+++ b/core/java/com/android/internal/app/ChooserActivityLogger.java
@@ -182,7 +182,8 @@
                 return FrameworkStatsLog.SHARESHEET_STARTED__PREVIEW_TYPE__CONTENT_PREVIEW_FILE;
             case ChooserActivity.CONTENT_PREVIEW_TEXT:
             default:
-                return FrameworkStatsLog.SHARESHEET_STARTED__PREVIEW_TYPE__CONTENT_PREVIEW_TEXT;
+                return FrameworkStatsLog
+                        .SHARESHEET_STARTED__PREVIEW_TYPE__CONTENT_PREVIEW_TYPE_UNKNOWN;
         }
     }
 
diff --git a/core/java/com/android/internal/app/ChooserListAdapter.java b/core/java/com/android/internal/app/ChooserListAdapter.java
index 0d90bbf..bdfcda5 100644
--- a/core/java/com/android/internal/app/ChooserListAdapter.java
+++ b/core/java/com/android/internal/app/ChooserListAdapter.java
@@ -207,6 +207,9 @@
         if (mListViewDataChanged) {
             if (mAppendDirectShareEnabled) {
                 appendServiceTargetsWithQuota();
+                if (mPendingChooserTargetService.isEmpty()) {
+                    fillAllServiceTargets();
+                }
             }
             super.notifyDataSetChanged();
         }
@@ -488,13 +491,14 @@
             Map<ChooserTarget, ShortcutInfo> directShareToShortcutInfos,
             List<ChooserActivity.ChooserTargetServiceConnection>
                     pendingChooserTargetServiceConnections) {
-        ComponentName origComponentName = origTarget.getResolvedComponentName();
+        ComponentName origComponentName = origTarget != null ? origTarget.getResolvedComponentName()
+                : !targets.isEmpty() ? targets.get(0).getComponentName() : null;
         mPendingChooserTargetService = pendingChooserTargetServiceConnections.stream()
                 .map(ChooserActivity.ChooserTargetServiceConnection::getComponentName)
                 .filter(componentName -> !componentName.equals(origComponentName))
                 .collect(Collectors.toSet());
         // Park targets in memory
-        if (!targets.isEmpty() && !mParkingDirectShareTargets.containsKey(origComponentName)) {
+        if (!targets.isEmpty()) {
             final boolean isShortcutResult =
                     (targetType == TARGET_TYPE_SHORTCUTS_FROM_SHORTCUT_MANAGER
                             || targetType == TARGET_TYPE_SHORTCUTS_FROM_PREDICTION_SERVICE);
@@ -509,8 +513,11 @@
                                             : null))
                     )
                     .collect(Collectors.toList());
-            mParkingDirectShareTargets.put(origComponentName,
-                    new Pair<>(parkingTargetInfos, 0));
+            Pair<List<ChooserTargetInfo>, Integer> parkingTargetInfoPair =
+                    mParkingDirectShareTargets.getOrDefault(origComponentName,
+                            new Pair<>(new ArrayList<>(), 0));
+            parkingTargetInfoPair.first.addAll(parkingTargetInfos);
+            mParkingDirectShareTargets.put(origComponentName, parkingTargetInfoPair);
             if (isShortcutResult) {
                 mShortcutComponents.add(origComponentName);
             }
@@ -558,6 +565,9 @@
      * Append all remaining targets (parking in memory) into direct share row as per their ranking.
      */
     private void fillAllServiceTargets() {
+        if (mParkingDirectShareTargets.isEmpty()) {
+            return;
+        }
         int maxRankedTargets = mChooserListCommunicator.getMaxRankedTargets();
         List<ComponentName> topComponentNames = getTopComponentNames(maxRankedTargets);
         // Append all remaining targets of top recommended components into direct share row.
@@ -576,16 +586,18 @@
             mParkingDirectShareTargets.remove(component);
         }
         // Append all remaining shortcuts targets into direct share row.
-        List<ChooserTargetInfo> remainingTargets = new ArrayList<>();
         mParkingDirectShareTargets.entrySet().stream()
                 .filter(entry -> mShortcutComponents.contains(entry.getKey()))
                 .map(entry -> entry.getValue())
                 .map(pair -> pair.first)
-                .forEach(remainingTargets::addAll);
-        remainingTargets.sort(
-                (t1, t2) -> -Float.compare(t1.getModifiedScore(), t2.getModifiedScore()));
-        mServiceTargets.addAll(remainingTargets);
-        mNumShortcutResults += remainingTargets.size();
+                .forEach(targets -> {
+                    for (ChooserTargetInfo target : targets) {
+                        if (!checkDuplicateTarget(target)) {
+                            mServiceTargets.add(target);
+                            mNumShortcutResults++;
+                        }
+                    }
+                });
         mParkingDirectShareTargets.clear();
     }
 
diff --git a/core/java/com/android/internal/app/IntentForwarderActivity.java b/core/java/com/android/internal/app/IntentForwarderActivity.java
index 9bdfa4a..2c48925 100644
--- a/core/java/com/android/internal/app/IntentForwarderActivity.java
+++ b/core/java/com/android/internal/app/IntentForwarderActivity.java
@@ -50,6 +50,9 @@
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
 
 /**
  * This is used in conjunction with
@@ -74,11 +77,13 @@
     private Injector mInjector;
 
     private MetricsLogger mMetricsLogger;
+    protected ExecutorService mExecutorService;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         mInjector = createInjector();
+        mExecutorService = Executors.newSingleThreadExecutor();
 
         Intent intentReceived = getIntent();
         String className = intentReceived.getComponent().getClassName();
@@ -108,44 +113,19 @@
             finish();
             return;
         }
+        if (Intent.ACTION_CHOOSER.equals(intentReceived.getAction())) {
+            launchChooserActivityWithCorrectTab(intentReceived, className);
+            return;
+        }
 
         final int callingUserId = getUserId();
         final Intent newIntent = canForward(intentReceived, getUserId(), targetUserId,
                 mInjector.getIPackageManager(), getContentResolver());
         if (newIntent != null) {
-            if (Intent.ACTION_CHOOSER.equals(newIntent.getAction())) {
-                Intent innerIntent = newIntent.getParcelableExtra(Intent.EXTRA_INTENT);
-                // At this point, innerIntent is not null. Otherwise, canForward would have returned
-                // false.
-                innerIntent.prepareToLeaveUser(callingUserId);
-                innerIntent.fixUris(callingUserId);
-            } else {
-                newIntent.prepareToLeaveUser(callingUserId);
-            }
-
-            final ResolveInfo ri = mInjector.resolveActivityAsUser(newIntent, MATCH_DEFAULT_ONLY,
-                    targetUserId);
-            try {
-                startActivityAsCaller(newIntent, null, null, false, targetUserId);
-            } catch (RuntimeException e) {
-                int launchedFromUid = -1;
-                String launchedFromPackage = "?";
-                try {
-                    launchedFromUid = ActivityTaskManager.getService().getLaunchedFromUid(
-                            getActivityToken());
-                    launchedFromPackage = ActivityTaskManager.getService().getLaunchedFromPackage(
-                            getActivityToken());
-                } catch (RemoteException ignored) {
-                }
-
-                Slog.wtf(TAG, "Unable to launch as UID " + launchedFromUid + " package "
-                        + launchedFromPackage + ", while running in "
-                        + ActivityThread.currentProcessName(), e);
-            }
-
-            if (shouldShowDisclosure(ri, intentReceived)) {
-                mInjector.showToast(userMessageId, Toast.LENGTH_LONG);
-            }
+            newIntent.prepareToLeaveUser(callingUserId);
+            maybeShowDisclosureAsync(intentReceived, newIntent, targetUserId, userMessageId);
+            CompletableFuture.runAsync(() -> startActivityAsCaller(
+                    newIntent, targetUserId), mExecutorService);
         } else {
             Slog.wtf(TAG, "the intent: " + intentReceived + " cannot be forwarded from user "
                     + callingUserId + " to user " + targetUserId);
@@ -153,6 +133,71 @@
         finish();
     }
 
+    private void maybeShowDisclosureAsync(
+            Intent intentReceived, Intent newIntent, int userId, int messageId) {
+        final CompletableFuture<ResolveInfo> resolveInfoFuture =
+                mInjector.resolveActivityAsUser(newIntent, MATCH_DEFAULT_ONLY, userId);
+        resolveInfoFuture.thenAcceptAsync(ri -> {
+            if (shouldShowDisclosure(ri, intentReceived)) {
+                mInjector.showToast(messageId, Toast.LENGTH_LONG);
+            }
+        }, getApplicationContext().getMainExecutor());
+    }
+
+    private void startActivityAsCaller(Intent newIntent, int userId) {
+        try {
+            startActivityAsCaller(
+                    newIntent,
+                    /* options= */ null,
+                    /* permissionToken= */ null,
+                    /* ignoreTargetSecurity= */ false,
+                    userId);
+        } catch (RuntimeException e) {
+            int launchedFromUid = -1;
+            String launchedFromPackage = "?";
+            try {
+                launchedFromUid = ActivityTaskManager.getService().getLaunchedFromUid(
+                        getActivityToken());
+                launchedFromPackage = ActivityTaskManager.getService()
+                        .getLaunchedFromPackage(getActivityToken());
+            } catch (RemoteException ignored) {
+            }
+
+            Slog.wtf(TAG, "Unable to launch as UID " + launchedFromUid + " package "
+                    + launchedFromPackage + ", while running in "
+                    + ActivityThread.currentProcessName(), e);
+        } finally {
+            mExecutorService.shutdown();
+        }
+    }
+
+    private void launchChooserActivityWithCorrectTab(Intent intentReceived, String className) {
+        // When showing the sharesheet, instead of forwarding to the other profile,
+        // we launch the sharesheet in the current user and select the other tab.
+        // This fixes b/152866292 where the user can not go back to the original profile
+        // when cross-profile intents are disabled.
+        int selectedProfile = findSelectedProfile(className);
+        sanitizeIntent(intentReceived);
+        intentReceived.putExtra(ChooserActivity.EXTRA_SELECTED_PROFILE, selectedProfile);
+        Intent innerIntent = intentReceived.getParcelableExtra(Intent.EXTRA_INTENT);
+        if (innerIntent == null) {
+            Slog.wtf(TAG, "Cannot start a chooser intent with no extra " + Intent.EXTRA_INTENT);
+            return;
+        }
+        sanitizeIntent(innerIntent);
+        startActivityAsCaller(intentReceived, null, null, false, getUserId());
+        finish();
+    }
+
+    private int findSelectedProfile(String className) {
+        if (className.equals(FORWARD_INTENT_TO_PARENT)) {
+            return ChooserActivity.PROFILE_PERSONAL;
+        } else if (className.equals(FORWARD_INTENT_TO_MANAGED_PROFILE)) {
+            return ChooserActivity.PROFILE_WORK;
+        }
+        return -1;
+    }
+
     private boolean shouldShowDisclosure(@Nullable ResolveInfo ri, Intent intent) {
         if (!isDeviceProvisioned()) {
             return false;
@@ -211,23 +256,7 @@
 
         Intent intentToCheck = forwardIntent;
         if (Intent.ACTION_CHOOSER.equals(forwardIntent.getAction())) {
-            // The EXTRA_INITIAL_INTENTS may not be allowed to be forwarded.
-            if (forwardIntent.hasExtra(Intent.EXTRA_INITIAL_INTENTS)) {
-                Slog.wtf(TAG, "An chooser intent with extra initial intents cannot be forwarded to"
-                        + " a different user");
-                return null;
-            }
-            if (forwardIntent.hasExtra(Intent.EXTRA_REPLACEMENT_EXTRAS)) {
-                Slog.wtf(TAG, "A chooser intent with replacement extras cannot be forwarded to a"
-                        + " different user");
-                return null;
-            }
-            intentToCheck = forwardIntent.getParcelableExtra(Intent.EXTRA_INTENT);
-            if (intentToCheck == null) {
-                Slog.wtf(TAG, "Cannot forward a chooser intent with no extra "
-                        + Intent.EXTRA_INTENT);
-                return null;
-            }
+            return null;
         }
         if (forwardIntent.getSelector() != null) {
             intentToCheck = forwardIntent.getSelector();
@@ -315,8 +344,11 @@
         }
 
         @Override
-        public ResolveInfo resolveActivityAsUser(Intent intent, int flags, int userId) {
-            return getPackageManager().resolveActivityAsUser(intent, flags, userId);
+        @Nullable
+        public CompletableFuture<ResolveInfo> resolveActivityAsUser(
+                Intent intent, int flags, int userId) {
+            return CompletableFuture.supplyAsync(
+                    () -> getPackageManager().resolveActivityAsUser(intent, flags, userId));
         }
 
         @Override
@@ -332,7 +364,7 @@
 
         PackageManager getPackageManager();
 
-        ResolveInfo resolveActivityAsUser(Intent intent, int flags, int userId);
+        CompletableFuture<ResolveInfo> resolveActivityAsUser(Intent intent, int flags, int userId);
 
         void showToast(@StringRes int messageId, int duration);
     }
diff --git a/core/java/com/android/internal/app/ResolverActivity.java b/core/java/com/android/internal/app/ResolverActivity.java
index fc3f20f..00faa3b 100644
--- a/core/java/com/android/internal/app/ResolverActivity.java
+++ b/core/java/com/android/internal/app/ResolverActivity.java
@@ -146,6 +146,7 @@
 
     private static final String TAG = "ResolverActivity";
     private static final boolean DEBUG = false;
+    private static final String LAST_SHOWN_TAB_KEY = "last_shown_tab_key";
 
     private boolean mRegistered;
 
@@ -179,6 +180,7 @@
     public static final String EXTRA_IS_AUDIO_CAPTURE_DEVICE = "is_audio_capture_device";
 
     private BroadcastReceiver mWorkProfileStateReceiver;
+    private boolean mIsHeaderCreated;
 
     /**
      * Get the string resource to be used as a label for the link to the resolver activity for an
@@ -398,11 +400,6 @@
                     | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
             rdl.setOnApplyWindowInsetsListener(this::onApplyWindowInsets);
 
-            if (shouldShowTabs() && isIntentPicker()) {
-                rdl.setMaxCollapsedHeight(getResources()
-                        .getDimensionPixelSize(R.dimen.resolver_max_collapsed_height_with_tabs));
-            }
-
             mResolverDrawerLayout = rdl;
         }
 
@@ -484,13 +481,42 @@
                         == workProfileUserHandle.getIdentifier()),
                 mUseLayoutForBrowsables,
                 /* userHandle */ workProfileUserHandle);
+        // In the edge case when we have 0 apps in the current profile and >1 apps in the other,
+        // the intent resolver is started in the other profile. Since this is the only case when
+        // this happens, we check for it here and set the current profile's tab.
+        int selectedProfile = getCurrentProfile();
+        UserHandle intentUser = UserHandle.of(getLaunchingUserId());
+        if (!getUser().equals(intentUser)) {
+            if (getPersonalProfileUserHandle().equals(intentUser)) {
+                selectedProfile = PROFILE_PERSONAL;
+            } else if (getWorkProfileUserHandle().equals(intentUser)) {
+                selectedProfile = PROFILE_WORK;
+            }
+        }
         return new ResolverMultiProfilePagerAdapter(
                 /* context */ this,
                 personalAdapter,
                 workAdapter,
-                /* defaultProfile */ getCurrentProfile(),
+                selectedProfile,
                 getPersonalProfileUserHandle(),
-                getWorkProfileUserHandle());
+                getWorkProfileUserHandle(),
+                /* shouldShowNoCrossProfileIntentsEmptyState= */ getUser().equals(intentUser));
+    }
+
+    /**
+     * Returns the user id of the user that the starting intent originated from.
+     * <p>This is not necessarily equal to {@link #getUserId()} or {@link UserHandle#myUserId()},
+     * as there are edge cases when the intent resolver is launched in the other profile.
+     * For example, when we have 0 resolved apps in current profile and multiple resolved apps
+     * in the other profile, opening a link from the current profile launches the intent resolver
+     * in the other one. b/148536209 for more info.
+     */
+    private int getLaunchingUserId() {
+        int contentUserHint = getIntent().getContentUserHint();
+        if (contentUserHint == UserHandle.USER_CURRENT) {
+            return UserHandle.myUserId();
+        }
+        return contentUserHint;
     }
 
     protected @Profile int getCurrentProfile() {
@@ -819,9 +845,19 @@
     }
 
     @Override
+    protected void onSaveInstanceState(Bundle outState) {
+        super.onSaveInstanceState(outState);
+        ViewPager viewPager = findViewById(R.id.profile_pager);
+        outState.putInt(LAST_SHOWN_TAB_KEY, viewPager.getCurrentItem());
+    }
+
+    @Override
     protected void onRestoreInstanceState(Bundle savedInstanceState) {
         super.onRestoreInstanceState(savedInstanceState);
         resetButtonBar();
+        ViewPager viewPager = findViewById(R.id.profile_pager);
+        viewPager.setCurrentItem(savedInstanceState.getInt(LAST_SHOWN_TAB_KEY));
+        mMultiProfilePagerAdapter.clearInactiveProfileCache();
     }
 
     private boolean isHttpSchemeAndViewAction(Intent intent) {
@@ -861,7 +897,7 @@
 
     private void setAlwaysButtonEnabled(boolean hasValidSelection, int checkedPos,
             boolean filtered) {
-        if (mMultiProfilePagerAdapter.getCurrentUserHandle() != getUser()) {
+        if (!mMultiProfilePagerAdapter.getCurrentUserHandle().equals(getUser())) {
             // Never allow the inactive profile to always open an app.
             mAlwaysButton.setEnabled(false);
             return;
@@ -1000,10 +1036,7 @@
             mMultiProfilePagerAdapter.showListView(listAdapter);
         }
         if (doPostProcessing) {
-            if (mMultiProfilePagerAdapter.getCurrentUserHandle().getIdentifier()
-                    == UserHandle.myUserId()) {
-                setHeader();
-            }
+            maybeCreateHeader(listAdapter);
             resetButtonBar();
             onListRebuilt(listAdapter);
         }
@@ -1012,6 +1045,15 @@
     protected void onListRebuilt(ResolverListAdapter listAdapter) {
         final ItemClickListener listener = new ItemClickListener();
         setupAdapterListView((ListView) mMultiProfilePagerAdapter.getActiveAdapterView(), listener);
+        if (shouldShowTabs() && isIntentPicker()) {
+            final ResolverDrawerLayout rdl = findViewById(R.id.contentPanel);
+            if (rdl != null) {
+                rdl.setMaxCollapsedHeight(getResources()
+                        .getDimensionPixelSize(useLayoutWithDefault()
+                                ? R.dimen.resolver_max_collapsed_height_with_default_with_tabs
+                                : R.dimen.resolver_max_collapsed_height_with_tabs));
+            }
+        }
     }
 
     protected boolean onTargetSelected(TargetInfo target, boolean alwaysCheck) {
@@ -1554,6 +1596,7 @@
         TabHost tabHost = findViewById(R.id.profile_tabhost);
         tabHost.setup();
         ViewPager viewPager = findViewById(R.id.profile_pager);
+        viewPager.setSaveEnabled(false);
         TabHost.TabSpec tabSpec = tabHost.newTabSpec(TAB_TAG_PERSONAL)
                 .setContent(R.id.profile_pager)
                 .setIndicator(getString(R.string.resolver_personal_tab));
@@ -1579,6 +1622,7 @@
             }
             setupViewVisibilities();
             maybeLogProfileChange();
+            onProfileTabSelected();
             DevicePolicyEventLogger
                     .createEvent(DevicePolicyEnums.RESOLVER_SWITCH_TABS)
                     .setInt(viewPager.getCurrentItem())
@@ -1597,6 +1641,12 @@
         findViewById(R.id.resolver_tab_divider).setVisibility(View.VISIBLE);
     }
 
+    /**
+     * Callback called when user changes the profile tab.
+     * <p>This method is intended to be overridden by subclasses.
+     */
+    protected void onProfileTabSelected() { }
+
     private void resetCheckedItem() {
         if (!isIntentPicker()) {
             return;
@@ -1675,10 +1725,15 @@
 
     /**
      * Configure the area above the app selection list (title, content preview, etc).
+     * <p>The header is created once when first launching the activity and whenever a package is
+     * installed or uninstalled.
      */
-    public void setHeader() {
-        if (mMultiProfilePagerAdapter.getActiveListAdapter().getCount() == 0
-                && mMultiProfilePagerAdapter.getActiveListAdapter().getPlaceholderCount() == 0) {
+    private void maybeCreateHeader(ResolverListAdapter listAdapter) {
+        if (mIsHeaderCreated) {
+            return;
+        }
+        if (!shouldShowTabs()
+                && listAdapter.getCount() == 0 && listAdapter.getPlaceholderCount() == 0) {
             final TextView titleView = findViewById(R.id.title);
             if (titleView != null) {
                 titleView.setVisibility(View.GONE);
@@ -1699,8 +1754,9 @@
 
         final ImageView iconView = findViewById(R.id.icon);
         if (iconView != null) {
-            mMultiProfilePagerAdapter.getActiveListAdapter().loadFilteredItemIconTaskAsync(iconView);
+            listAdapter.loadFilteredItemIconTaskAsync(iconView);
         }
+        mIsHeaderCreated = true;
     }
 
     protected void resetButtonBar() {
@@ -1708,22 +1764,33 @@
             return;
         }
         final ViewGroup buttonLayout = findViewById(R.id.button_bar);
-        if (buttonLayout != null) {
-            buttonLayout.setVisibility(View.VISIBLE);
-
-            if (!useLayoutWithDefault()) {
-                int inset = mSystemWindowInsets != null ? mSystemWindowInsets.bottom : 0;
-                buttonLayout.setPadding(buttonLayout.getPaddingLeft(), buttonLayout.getPaddingTop(),
-                        buttonLayout.getPaddingRight(), getResources().getDimensionPixelSize(
-                                R.dimen.resolver_button_bar_spacing) + inset);
-            }
-            mOnceButton = (Button) buttonLayout.findViewById(R.id.button_once);
-            mAlwaysButton = (Button) buttonLayout.findViewById(R.id.button_always);
-
-            resetAlwaysOrOnceButtonBar();
-        } else {
+        if (buttonLayout == null) {
             Log.e(TAG, "Layout unexpectedly does not have a button bar");
+            return;
         }
+        ResolverListAdapter activeListAdapter =
+                mMultiProfilePagerAdapter.getActiveListAdapter();
+        View buttonBarDivider = findViewById(R.id.resolver_button_bar_divider);
+        if (activeListAdapter.isTabLoaded()
+                && mMultiProfilePagerAdapter.shouldShowEmptyStateScreen(activeListAdapter)) {
+            buttonLayout.setVisibility(View.INVISIBLE);
+            buttonBarDivider.setVisibility(View.INVISIBLE);
+            return;
+        }
+
+        buttonBarDivider.setVisibility(View.VISIBLE);
+        buttonLayout.setVisibility(View.VISIBLE);
+
+        if (!useLayoutWithDefault()) {
+            int inset = mSystemWindowInsets != null ? mSystemWindowInsets.bottom : 0;
+            buttonLayout.setPadding(buttonLayout.getPaddingLeft(), buttonLayout.getPaddingTop(),
+                    buttonLayout.getPaddingRight(), getResources().getDimensionPixelSize(
+                            R.dimen.resolver_button_bar_spacing) + inset);
+        }
+        mOnceButton = (Button) buttonLayout.findViewById(R.id.button_once);
+        mAlwaysButton = (Button) buttonLayout.findViewById(R.id.button_always);
+
+        resetAlwaysOrOnceButtonBar();
     }
 
     private void resetAlwaysOrOnceButtonBar() {
@@ -1800,6 +1867,7 @@
                 // turning on.
                 return;
             }
+            mIsHeaderCreated = false;
             boolean listRebuilt = mMultiProfilePagerAdapter.rebuildActiveTab(true);
             if (listRebuilt) {
                 ResolverListAdapter activeListAdapter =
diff --git a/core/java/com/android/internal/app/ResolverListAdapter.java b/core/java/com/android/internal/app/ResolverListAdapter.java
index 579abee..cee8a92 100644
--- a/core/java/com/android/internal/app/ResolverListAdapter.java
+++ b/core/java/com/android/internal/app/ResolverListAdapter.java
@@ -165,8 +165,9 @@
         mResolverListController.updateModel(componentName);
     }
 
-    public void updateChooserCounts(String packageName, int userId, String action) {
-        mResolverListController.updateChooserCounts(packageName, userId, action);
+    public void updateChooserCounts(String packageName, String action) {
+        mResolverListController.updateChooserCounts(
+                packageName, getUserHandle().getIdentifier(), action);
     }
 
     List<ResolvedComponentInfo> getUnfilteredResolveList() {
@@ -255,6 +256,7 @@
             }
         }
 
+        setPlaceholderCount(0);
         int n;
         if ((currentResolveList != null) && ((n = currentResolveList.size()) > 0)) {
             // We only care about fixing the unfilteredList if the current resolve list and
diff --git a/core/java/com/android/internal/app/ResolverMultiProfilePagerAdapter.java b/core/java/com/android/internal/app/ResolverMultiProfilePagerAdapter.java
index b690a18..885d1bb 100644
--- a/core/java/com/android/internal/app/ResolverMultiProfilePagerAdapter.java
+++ b/core/java/com/android/internal/app/ResolverMultiProfilePagerAdapter.java
@@ -35,6 +35,7 @@
 public class ResolverMultiProfilePagerAdapter extends AbstractMultiProfilePagerAdapter {
 
     private final ResolverProfileDescriptor[] mItems;
+    private final boolean mShouldShowNoCrossProfileIntentsEmptyState;
 
     ResolverMultiProfilePagerAdapter(Context context,
             ResolverListAdapter adapter,
@@ -44,6 +45,7 @@
         mItems = new ResolverProfileDescriptor[] {
                 createProfileDescriptor(adapter)
         };
+        mShouldShowNoCrossProfileIntentsEmptyState = true;
     }
 
     ResolverMultiProfilePagerAdapter(Context context,
@@ -51,13 +53,15 @@
             ResolverListAdapter workAdapter,
             @Profile int defaultProfile,
             UserHandle personalProfileUserHandle,
-            UserHandle workProfileUserHandle) {
+            UserHandle workProfileUserHandle,
+            boolean shouldShowNoCrossProfileIntentsEmptyState) {
         super(context, /* currentPage */ defaultProfile, personalProfileUserHandle,
                 workProfileUserHandle);
         mItems = new ResolverProfileDescriptor[] {
                 createProfileDescriptor(personalAdapter),
                 createProfileDescriptor(workAdapter)
         };
+        mShouldShowNoCrossProfileIntentsEmptyState = shouldShowNoCrossProfileIntentsEmptyState;
     }
 
     private ResolverProfileDescriptor createProfileDescriptor(
@@ -163,6 +167,11 @@
     }
 
     @Override
+    boolean allowShowNoCrossProfileIntentsEmptyState() {
+        return mShouldShowNoCrossProfileIntentsEmptyState;
+    }
+
+    @Override
     protected void showWorkProfileOffEmptyState(ResolverListAdapter activeListAdapter,
             View.OnClickListener listener) {
         showEmptyState(activeListAdapter,
@@ -204,6 +213,12 @@
                 /* subtitleRes */ 0);
     }
 
+    @Override
+    protected void setupContainerPadding(View container) {
+        container.setPadding(container.getPaddingLeft(), container.getPaddingTop(),
+                container.getPaddingRight(), /* bottom */ 0);
+    }
+
     class ResolverProfileDescriptor extends ProfileDescriptor {
         private ResolverListAdapter resolverListAdapter;
         final ListView listView;
diff --git a/core/java/com/android/internal/app/SystemUserHomeActivity.java b/core/java/com/android/internal/app/SystemUserHomeActivity.java
index 26fbf6f..ee936a3 100644
--- a/core/java/com/android/internal/app/SystemUserHomeActivity.java
+++ b/core/java/com/android/internal/app/SystemUserHomeActivity.java
@@ -17,10 +17,27 @@
 package com.android.internal.app;
 
 import android.app.Activity;
+import android.os.Bundle;
+import android.util.Log;
+
+import com.android.internal.R;
 
 /**
  * Placeholder home activity, which is always installed on the system user. At least one home
  * activity must be present and enabled in order for the system to boot.
  */
 public class SystemUserHomeActivity extends Activity {
+    private static final String TAG = "SystemUserHome";
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        Log.i(TAG, "onCreate");
+        setContentView(R.layout.system_user_home);
+    }
+
+    protected void onDestroy() {
+        super.onDestroy();
+        Log.i(TAG, "onDestroy");
+    }
 }
diff --git a/core/java/com/android/internal/app/procstats/DumpUtils.java b/core/java/com/android/internal/app/procstats/DumpUtils.java
index eda04a6..9bdbdc7 100644
--- a/core/java/com/android/internal/app/procstats/DumpUtils.java
+++ b/core/java/com/android/internal/app/procstats/DumpUtils.java
@@ -16,14 +16,39 @@
 
 package com.android.internal.app.procstats;
 
+import static com.android.internal.app.procstats.ProcessStats.ADJ_COUNT;
+import static com.android.internal.app.procstats.ProcessStats.ADJ_MEM_FACTOR_COUNT;
+import static com.android.internal.app.procstats.ProcessStats.ADJ_MEM_FACTOR_CRITICAL;
+import static com.android.internal.app.procstats.ProcessStats.ADJ_MEM_FACTOR_LOW;
+import static com.android.internal.app.procstats.ProcessStats.ADJ_MEM_FACTOR_MODERATE;
+import static com.android.internal.app.procstats.ProcessStats.ADJ_MEM_FACTOR_NORMAL;
+import static com.android.internal.app.procstats.ProcessStats.ADJ_NOTHING;
+import static com.android.internal.app.procstats.ProcessStats.ADJ_SCREEN_MOD;
+import static com.android.internal.app.procstats.ProcessStats.ADJ_SCREEN_OFF;
+import static com.android.internal.app.procstats.ProcessStats.ADJ_SCREEN_ON;
+import static com.android.internal.app.procstats.ProcessStats.STATE_BACKUP;
+import static com.android.internal.app.procstats.ProcessStats.STATE_CACHED_ACTIVITY;
+import static com.android.internal.app.procstats.ProcessStats.STATE_CACHED_ACTIVITY_CLIENT;
+import static com.android.internal.app.procstats.ProcessStats.STATE_CACHED_EMPTY;
+import static com.android.internal.app.procstats.ProcessStats.STATE_COUNT;
+import static com.android.internal.app.procstats.ProcessStats.STATE_HEAVY_WEIGHT;
+import static com.android.internal.app.procstats.ProcessStats.STATE_HOME;
+import static com.android.internal.app.procstats.ProcessStats.STATE_IMPORTANT_BACKGROUND;
+import static com.android.internal.app.procstats.ProcessStats.STATE_IMPORTANT_FOREGROUND;
+import static com.android.internal.app.procstats.ProcessStats.STATE_LAST_ACTIVITY;
+import static com.android.internal.app.procstats.ProcessStats.STATE_NOTHING;
+import static com.android.internal.app.procstats.ProcessStats.STATE_PERSISTENT;
+import static com.android.internal.app.procstats.ProcessStats.STATE_RECEIVER;
+import static com.android.internal.app.procstats.ProcessStats.STATE_SERVICE;
+import static com.android.internal.app.procstats.ProcessStats.STATE_SERVICE_RESTARTING;
+import static com.android.internal.app.procstats.ProcessStats.STATE_TOP;
+
 import android.os.UserHandle;
 import android.service.procstats.ProcessStatsEnums;
 import android.service.procstats.ProcessStatsStateProto;
 import android.util.TimeUtils;
 import android.util.proto.ProtoOutputStream;
 
-import static com.android.internal.app.procstats.ProcessStats.*;
-
 import java.io.PrintWriter;
 import java.util.ArrayList;
 
@@ -38,6 +63,7 @@
     public static final String[] STATE_NAMES_CSV;
     static final String[] STATE_TAGS;
     static final int[] STATE_PROTO_ENUMS;
+    private static final int[] PROCESS_STATS_STATE_TO_AGGREGATED_STATE;
 
     // Make the mapping easy to update.
     static {
@@ -126,6 +152,39 @@
         STATE_PROTO_ENUMS[STATE_CACHED_ACTIVITY_CLIENT] =
                 ProcessStatsEnums.PROCESS_STATE_CACHED_ACTIVITY_CLIENT;
         STATE_PROTO_ENUMS[STATE_CACHED_EMPTY] = ProcessStatsEnums.PROCESS_STATE_CACHED_EMPTY;
+
+        // Remap states, as defined by ProcessStats.java, to a reduced subset of states for data
+        // aggregation / size reduction purposes.
+        PROCESS_STATS_STATE_TO_AGGREGATED_STATE = new int[STATE_COUNT];
+        PROCESS_STATS_STATE_TO_AGGREGATED_STATE[STATE_PERSISTENT] =
+                ProcessStatsEnums.AGGREGATED_PROCESS_STATE_PERSISTENT;
+        PROCESS_STATS_STATE_TO_AGGREGATED_STATE[STATE_TOP] =
+                ProcessStatsEnums.AGGREGATED_PROCESS_STATE_TOP;
+        PROCESS_STATS_STATE_TO_AGGREGATED_STATE[STATE_IMPORTANT_FOREGROUND] =
+                ProcessStatsEnums.AGGREGATED_PROCESS_STATE_IMPORTANT_FOREGROUND;
+        PROCESS_STATS_STATE_TO_AGGREGATED_STATE[STATE_IMPORTANT_BACKGROUND] =
+                ProcessStatsEnums.AGGREGATED_PROCESS_STATE_BACKGROUND;
+        PROCESS_STATS_STATE_TO_AGGREGATED_STATE[STATE_BACKUP] =
+                ProcessStatsEnums.AGGREGATED_PROCESS_STATE_BACKGROUND;
+        PROCESS_STATS_STATE_TO_AGGREGATED_STATE[STATE_SERVICE] =
+                ProcessStatsEnums.AGGREGATED_PROCESS_STATE_BACKGROUND;
+        // "Restarting" is not a real state, so this shouldn't exist.
+        PROCESS_STATS_STATE_TO_AGGREGATED_STATE[STATE_SERVICE_RESTARTING] =
+                ProcessStatsEnums.AGGREGATED_PROCESS_STATE_UNKNOWN;
+        PROCESS_STATS_STATE_TO_AGGREGATED_STATE[STATE_RECEIVER] =
+                ProcessStatsEnums.AGGREGATED_PROCESS_STATE_RECEIVER;
+        PROCESS_STATS_STATE_TO_AGGREGATED_STATE[STATE_HEAVY_WEIGHT] =
+                ProcessStatsEnums.AGGREGATED_PROCESS_STATE_BACKGROUND;
+        PROCESS_STATS_STATE_TO_AGGREGATED_STATE[STATE_HOME] =
+                ProcessStatsEnums.AGGREGATED_PROCESS_STATE_CACHED;
+        PROCESS_STATS_STATE_TO_AGGREGATED_STATE[STATE_LAST_ACTIVITY] =
+                ProcessStatsEnums.AGGREGATED_PROCESS_STATE_CACHED;
+        PROCESS_STATS_STATE_TO_AGGREGATED_STATE[STATE_CACHED_ACTIVITY] =
+                ProcessStatsEnums.AGGREGATED_PROCESS_STATE_CACHED;
+        PROCESS_STATS_STATE_TO_AGGREGATED_STATE[STATE_CACHED_ACTIVITY_CLIENT] =
+                ProcessStatsEnums.AGGREGATED_PROCESS_STATE_CACHED;
+        PROCESS_STATS_STATE_TO_AGGREGATED_STATE[STATE_CACHED_EMPTY] =
+                ProcessStatsEnums.AGGREGATED_PROCESS_STATE_CACHED;
     }
 
     public static final String[] ADJ_SCREEN_NAMES_CSV = new String[] {
@@ -455,4 +514,51 @@
         }
         return itemName;
     }
+
+    /**
+     * Aggregate process states to reduce size of statistics logs.
+     *
+     * <p>Involves unpacking the three parts of state (process state / device memory state /
+     * screen state), manipulating the elements, then re-packing the new values into a single
+     * int. This integer is guaranteed to be unique for any given combination of state elements.
+     *
+     * @param curState current state as used in mCurState in {@class ProcessState} ie. a value
+     *                 combined from the process's state, the device's memory pressure state, and
+     *                 the device's screen on/off state.
+     * @return an integer representing the combination of screen state and process state, where
+     *         process state has been aggregated.
+     */
+    public static int aggregateCurrentProcessState(int curState) {
+        int screenStateIndex = curState / (ADJ_SCREEN_MOD * STATE_COUNT);
+        // extract process state from the compound state variable (discarding memory state)
+        int procStateIndex = curState % STATE_COUNT;
+
+        // Remap process state per array above.
+        try {
+            procStateIndex = PROCESS_STATS_STATE_TO_AGGREGATED_STATE[procStateIndex];
+        } catch (IndexOutOfBoundsException e) {
+            procStateIndex = ProcessStatsEnums.AGGREGATED_PROCESS_STATE_UNKNOWN;
+        }
+
+        // Pack screen & process state using bit shifting
+        return (procStateIndex << 0xf) | screenStateIndex;
+    }
+
+    /** Print aggregated tags generated via {@code #aggregateCurrentProcessState}. */
+    public static void printAggregatedProcStateTagProto(ProtoOutputStream proto, long screenId,
+            long stateId, int state) {
+        // screen state is in lowest 0xf bits, process state is in next 0xf bits up
+
+        try {
+            proto.write(stateId, STATE_PROTO_ENUMS[state >> 0xf]);
+        } catch (IndexOutOfBoundsException e) {
+            proto.write(stateId, ProcessStatsEnums.PROCESS_STATE_UNKNOWN);
+        }
+
+        try {
+            proto.write(screenId, ADJ_SCREEN_PROTO_ENUMS[state & 0xf]);
+        } catch (IndexOutOfBoundsException e) {
+            proto.write(screenId, ProcessStatsEnums.SCREEN_STATE_UNKNOWN);
+        }
+    }
 }
diff --git a/core/java/com/android/internal/app/procstats/ProcessState.java b/core/java/com/android/internal/app/procstats/ProcessState.java
index a6bed5b..79ff594 100644
--- a/core/java/com/android/internal/app/procstats/ProcessState.java
+++ b/core/java/com/android/internal/app/procstats/ProcessState.java
@@ -16,22 +16,6 @@
 
 package com.android.internal.app.procstats;
 
-import android.os.Parcel;
-import android.os.SystemClock;
-import android.os.UserHandle;
-import android.service.procstats.ProcessStatsProto;
-import android.service.procstats.ProcessStatsStateProto;
-import android.util.ArrayMap;
-import android.util.DebugUtils;
-import android.util.Log;
-import android.util.LongSparseArray;
-import android.util.Slog;
-import android.util.SparseLongArray;
-import android.util.TimeUtils;
-import android.util.proto.ProtoOutputStream;
-import android.util.proto.ProtoUtils;
-
-
 import static com.android.internal.app.procstats.ProcessStats.PSS_AVERAGE;
 import static com.android.internal.app.procstats.ProcessStats.PSS_COUNT;
 import static com.android.internal.app.procstats.ProcessStats.PSS_MAXIMUM;
@@ -60,6 +44,21 @@
 import static com.android.internal.app.procstats.ProcessStats.STATE_SERVICE_RESTARTING;
 import static com.android.internal.app.procstats.ProcessStats.STATE_TOP;
 
+import android.os.Parcel;
+import android.os.SystemClock;
+import android.os.UserHandle;
+import android.service.procstats.ProcessStatsProto;
+import android.service.procstats.ProcessStatsStateProto;
+import android.util.ArrayMap;
+import android.util.DebugUtils;
+import android.util.Log;
+import android.util.LongSparseArray;
+import android.util.Slog;
+import android.util.SparseLongArray;
+import android.util.TimeUtils;
+import android.util.proto.ProtoOutputStream;
+import android.util.proto.ProtoUtils;
+
 import com.android.internal.app.procstats.ProcessStats.PackageState;
 import com.android.internal.app.procstats.ProcessStats.ProcessStateHolder;
 import com.android.internal.app.procstats.ProcessStats.TotalMemoryUseCollection;
@@ -1418,4 +1417,109 @@
 
         proto.end(token);
     }
+
+    /** Similar to {@code #dumpDebug}, but with a reduced/aggregated subset of states. */
+    public void dumpAggregatedProtoForStatsd(ProtoOutputStream proto, long fieldId,
+            String procName, int uid, long now) {
+        // Group proc stats by aggregated type (only screen state + process state)
+        SparseLongArray durationByState = new SparseLongArray();
+        boolean didCurState = false;
+        for (int i = 0; i < mDurations.getKeyCount(); i++) {
+            final int key = mDurations.getKeyAt(i);
+            final int type = SparseMappingTable.getIdFromKey(key);
+            final int aggregatedType = DumpUtils.aggregateCurrentProcessState(type);
+
+            long time = mDurations.getValue(key);
+            if (mCurCombinedState == type) {
+                didCurState = true;
+                time += now - mStartTime;
+            }
+            int index = durationByState.indexOfKey(aggregatedType);
+            if (index >= 0) {
+                durationByState.put(aggregatedType, time + durationByState.valueAt(index));
+            } else {
+                durationByState.put(aggregatedType, time);
+            }
+        }
+        if (!didCurState && mCurCombinedState != STATE_NOTHING) {
+            final int aggregatedType = DumpUtils.aggregateCurrentProcessState(mCurCombinedState);
+            int index = durationByState.indexOfKey(aggregatedType);
+            if (index >= 0) {
+                durationByState.put(aggregatedType,
+                        (now - mStartTime) + durationByState.valueAt(index));
+            } else {
+                durationByState.put(aggregatedType, now - mStartTime);
+            }
+        }
+
+        // Now we have total durations, aggregate the RSS values
+        SparseLongArray meanRssByState = new SparseLongArray();
+        SparseLongArray maxRssByState = new SparseLongArray();
+        // compute weighted averages and max-of-max
+        for (int i = 0; i < mPssTable.getKeyCount(); i++) {
+            final int key = mPssTable.getKeyAt(i);
+            final int type = SparseMappingTable.getIdFromKey(key);
+            if (durationByState.indexOfKey(type) < 0) {
+                // state without duration should not have stats!
+                continue;
+            }
+            final int aggregatedType = DumpUtils.aggregateCurrentProcessState(type);
+
+            long[] rssMeanAndMax = mPssTable.getRssMeanAndMax(key);
+
+            // compute mean * duration, then store sum of that in meanRssByState
+            long meanTimesDuration = rssMeanAndMax[0] * mDurations.getValue(key);
+            if (meanRssByState.indexOfKey(aggregatedType) >= 0) {
+                meanRssByState.put(aggregatedType,
+                        meanTimesDuration + meanRssByState.get(aggregatedType));
+            } else {
+                meanRssByState.put(aggregatedType, meanTimesDuration);
+            }
+
+            // accumulate max-of-maxes in maxRssByState
+            if (maxRssByState.indexOfKey(aggregatedType) >= 0
+                    && maxRssByState.get(aggregatedType) < rssMeanAndMax[1]) {
+                maxRssByState.put(aggregatedType, rssMeanAndMax[1]);
+            } else if (maxRssByState.indexOfKey(aggregatedType) < 0) {
+                maxRssByState.put(aggregatedType, rssMeanAndMax[1]);
+            }
+        }
+
+        // divide the means by the durations to get the weighted mean-of-means
+        for (int i = 0; i < durationByState.size(); i++) {
+            int aggregatedKey = durationByState.keyAt(i);
+            if (meanRssByState.indexOfKey(aggregatedKey) < 0) {
+                // these data structures should be consistent
+                continue;
+            }
+            meanRssByState.put(aggregatedKey,
+                    meanRssByState.get(aggregatedKey) / durationByState.get(aggregatedKey));
+        }
+
+        // build the output
+        final long token = proto.start(fieldId);
+        proto.write(ProcessStatsProto.PROCESS, procName);
+        proto.write(ProcessStatsProto.UID, uid);
+
+        for (int i = 0; i < durationByState.size(); i++) {
+            final long stateToken = proto.start(ProcessStatsProto.STATES);
+
+            final int aggregatedKey = durationByState.keyAt(i);
+
+            DumpUtils.printAggregatedProcStateTagProto(proto,
+                    ProcessStatsStateProto.SCREEN_STATE,
+                    ProcessStatsStateProto.PROCESS_STATE,
+                    aggregatedKey);
+            proto.write(ProcessStatsStateProto.DURATION_MS, durationByState.get(aggregatedKey));
+
+            ProtoUtils.toAggStatsProto(proto, ProcessStatsStateProto.RSS,
+                    0, /* do not output a minimum value */
+                    meanRssByState.get(aggregatedKey),
+                    maxRssByState.get(aggregatedKey));
+
+            proto.end(stateToken);
+        }
+
+        proto.end(token);
+    }
 }
diff --git a/core/java/com/android/internal/app/procstats/ProcessStats.java b/core/java/com/android/internal/app/procstats/ProcessStats.java
index 009b1e0..80f6272 100644
--- a/core/java/com/android/internal/app/procstats/ProcessStats.java
+++ b/core/java/com/android/internal/app/procstats/ProcessStats.java
@@ -2178,29 +2178,7 @@
      * Writes to ProtoOutputStream.
      */
     public void dumpDebug(ProtoOutputStream proto, long now, int section) {
-        proto.write(ProcessStatsSectionProto.START_REALTIME_MS, mTimePeriodStartRealtime);
-        proto.write(ProcessStatsSectionProto.END_REALTIME_MS,
-                mRunning ? SystemClock.elapsedRealtime() : mTimePeriodEndRealtime);
-        proto.write(ProcessStatsSectionProto.START_UPTIME_MS, mTimePeriodStartUptime);
-        proto.write(ProcessStatsSectionProto.END_UPTIME_MS, mTimePeriodEndUptime);
-        proto.write(ProcessStatsSectionProto.RUNTIME, mRuntime);
-        proto.write(ProcessStatsSectionProto.HAS_SWAPPED_PSS, mHasSwappedOutPss);
-        boolean partial = true;
-        if ((mFlags & FLAG_SHUTDOWN) != 0) {
-            proto.write(ProcessStatsSectionProto.STATUS, ProcessStatsSectionProto.STATUS_SHUTDOWN);
-            partial = false;
-        }
-        if ((mFlags & FLAG_SYSPROPS) != 0) {
-            proto.write(ProcessStatsSectionProto.STATUS, ProcessStatsSectionProto.STATUS_SYSPROPS);
-            partial = false;
-        }
-        if ((mFlags & FLAG_COMPLETE) != 0) {
-            proto.write(ProcessStatsSectionProto.STATUS, ProcessStatsSectionProto.STATUS_COMPLETE);
-            partial = false;
-        }
-        if (partial) {
-            proto.write(ProcessStatsSectionProto.STATUS, ProcessStatsSectionProto.STATUS_PARTIAL);
-        }
+        dumpProtoPreamble(proto);
 
         final int NPAGETYPES = mPageTypeLabels.size();
         for (int i = 0; i < NPAGETYPES; i++) {
@@ -2247,6 +2225,49 @@
         }
     }
 
+    /** Similar to {@code #dumpDebug}, but with a reduced/aggregated subset of states. */
+    public void dumpAggregatedProtoForStatsd(ProtoOutputStream proto) {
+        dumpProtoPreamble(proto);
+        final ArrayMap<String, SparseArray<ProcessState>> procMap = mProcesses.getMap();
+        for (int ip = 0; ip < procMap.size(); ip++) {
+            final String procName = procMap.keyAt(ip);
+            final SparseArray<ProcessState> uids = procMap.valueAt(ip);
+            for (int iu = 0; iu < uids.size(); iu++) {
+                final int uid = uids.keyAt(iu);
+                final ProcessState procState = uids.valueAt(iu);
+                procState.dumpAggregatedProtoForStatsd(proto,
+                        ProcessStatsSectionProto.PROCESS_STATS,
+                        procName, uid, mTimePeriodEndRealtime);
+            }
+        }
+    }
+
+    private void dumpProtoPreamble(ProtoOutputStream proto) {
+        proto.write(ProcessStatsSectionProto.START_REALTIME_MS, mTimePeriodStartRealtime);
+        proto.write(ProcessStatsSectionProto.END_REALTIME_MS,
+                mRunning ? SystemClock.elapsedRealtime() : mTimePeriodEndRealtime);
+        proto.write(ProcessStatsSectionProto.START_UPTIME_MS, mTimePeriodStartUptime);
+        proto.write(ProcessStatsSectionProto.END_UPTIME_MS, mTimePeriodEndUptime);
+        proto.write(ProcessStatsSectionProto.RUNTIME, mRuntime);
+        proto.write(ProcessStatsSectionProto.HAS_SWAPPED_PSS, mHasSwappedOutPss);
+        boolean partial = true;
+        if ((mFlags & FLAG_SHUTDOWN) != 0) {
+            proto.write(ProcessStatsSectionProto.STATUS, ProcessStatsSectionProto.STATUS_SHUTDOWN);
+            partial = false;
+        }
+        if ((mFlags & FLAG_SYSPROPS) != 0) {
+            proto.write(ProcessStatsSectionProto.STATUS, ProcessStatsSectionProto.STATUS_SYSPROPS);
+            partial = false;
+        }
+        if ((mFlags & FLAG_COMPLETE) != 0) {
+            proto.write(ProcessStatsSectionProto.STATUS, ProcessStatsSectionProto.STATUS_COMPLETE);
+            partial = false;
+        }
+        if (partial) {
+            proto.write(ProcessStatsSectionProto.STATUS, ProcessStatsSectionProto.STATUS_PARTIAL);
+        }
+    }
+
     final public static class ProcessStateHolder {
         public final long appVersion;
         public ProcessState state;
diff --git a/core/java/com/android/internal/app/procstats/PssTable.java b/core/java/com/android/internal/app/procstats/PssTable.java
index fc93c3a..a6bae6e 100644
--- a/core/java/com/android/internal/app/procstats/PssTable.java
+++ b/core/java/com/android/internal/app/procstats/PssTable.java
@@ -16,17 +16,17 @@
 
 package com.android.internal.app.procstats;
 
+import static com.android.internal.app.procstats.ProcessStats.PSS_AVERAGE;
+import static com.android.internal.app.procstats.ProcessStats.PSS_COUNT;
+import static com.android.internal.app.procstats.ProcessStats.PSS_MAXIMUM;
+import static com.android.internal.app.procstats.ProcessStats.PSS_MINIMUM;
 import static com.android.internal.app.procstats.ProcessStats.PSS_RSS_AVERAGE;
 import static com.android.internal.app.procstats.ProcessStats.PSS_RSS_MAXIMUM;
 import static com.android.internal.app.procstats.ProcessStats.PSS_RSS_MINIMUM;
 import static com.android.internal.app.procstats.ProcessStats.PSS_SAMPLE_COUNT;
-import static com.android.internal.app.procstats.ProcessStats.PSS_MINIMUM;
-import static com.android.internal.app.procstats.ProcessStats.PSS_AVERAGE;
-import static com.android.internal.app.procstats.ProcessStats.PSS_MAXIMUM;
-import static com.android.internal.app.procstats.ProcessStats.PSS_USS_MINIMUM;
 import static com.android.internal.app.procstats.ProcessStats.PSS_USS_AVERAGE;
 import static com.android.internal.app.procstats.ProcessStats.PSS_USS_MAXIMUM;
-import static com.android.internal.app.procstats.ProcessStats.PSS_COUNT;
+import static com.android.internal.app.procstats.ProcessStats.PSS_USS_MINIMUM;
 
 import android.service.procstats.ProcessStatsStateProto;
 import android.util.proto.ProtoOutputStream;
@@ -133,7 +133,6 @@
             }
 
             if (stats[statsIndex + PSS_RSS_MINIMUM] > minRss) {
-                stats[statsIndex + PSS_RSS_MINIMUM] = minRss;
             }
 
             stats[statsIndex + PSS_RSS_AVERAGE] = (long)(((stats[statsIndex + PSS_RSS_AVERAGE]
@@ -167,4 +166,10 @@
                 stats[statsIndex + PSS_RSS_AVERAGE],
                 stats[statsIndex + PSS_RSS_MAXIMUM]);
     }
+
+    long[] getRssMeanAndMax(int key) {
+        final long[] stats = getArrayForKey(key);
+        final int statsIndex = SparseMappingTable.getIndexFromKey(key);
+        return new long[]{stats[statsIndex + PSS_RSS_AVERAGE], stats[statsIndex + PSS_RSS_MAXIMUM]};
+    }
 }
diff --git a/core/java/com/android/internal/appwidget/IAppWidgetService.aidl b/core/java/com/android/internal/appwidget/IAppWidgetService.aidl
index 9e09cf3..1186dfe 100644
--- a/core/java/com/android/internal/appwidget/IAppWidgetService.aidl
+++ b/core/java/com/android/internal/appwidget/IAppWidgetService.aidl
@@ -77,6 +77,6 @@
     boolean requestPinAppWidget(String packageName, in ComponentName providerComponent,
             in Bundle extras, in IntentSender resultIntent);
     boolean isRequestPinAppWidgetSupported();
-    void noteAppWidgetTapped(int uid, String packageName);
+    oneway void noteAppWidgetTapped(in String callingPackage, in int appWidgetId);
 }
 
diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java
index 43bd4a6..6432475 100644
--- a/core/java/com/android/internal/os/BatteryStatsImpl.java
+++ b/core/java/com/android/internal/os/BatteryStatsImpl.java
@@ -6093,7 +6093,8 @@
         return array;
     }
 
-    public void noteNetworkInterfaceTypeLocked(String iface, int networkType) {
+    /** @hide */
+    public void noteNetworkInterfaceType(String iface, int networkType) {
         if (TextUtils.isEmpty(iface)) return;
 
         synchronized (mModemNetworkLock) {
diff --git a/core/java/com/android/internal/os/RuntimeInit.java b/core/java/com/android/internal/os/RuntimeInit.java
index 0e9c2c4..dd1e4f4 100644
--- a/core/java/com/android/internal/os/RuntimeInit.java
+++ b/core/java/com/android/internal/os/RuntimeInit.java
@@ -19,6 +19,7 @@
 import android.app.ActivityManager;
 import android.app.ActivityThread;
 import android.app.ApplicationErrorReport;
+import android.app.IActivityManager;
 import android.compat.annotation.UnsupportedAppUsage;
 import android.content.type.DefaultMimeMapFactory;
 import android.os.Build;
@@ -64,6 +65,8 @@
 
     private static volatile boolean mCrashing = false;
 
+    private static volatile ApplicationWtfHandler sDefaultApplicationWtfHandler;
+
     private static final native void nativeFinishInit();
     private static final native void nativeSetExitWithoutCleanup(boolean exitWithoutCleanup);
 
@@ -438,10 +441,27 @@
      */
     public static void wtf(String tag, Throwable t, boolean system) {
         try {
-            if (ActivityManager.getService().handleApplicationWtf(
-                    mApplicationObject, tag, system,
-                    new ApplicationErrorReport.ParcelableCrashInfo(t),
-                    Process.myPid())) {
+            boolean exit = false;
+            final IActivityManager am = ActivityManager.getService();
+            if (am != null) {
+                exit = am.handleApplicationWtf(
+                        mApplicationObject, tag, system,
+                        new ApplicationErrorReport.ParcelableCrashInfo(t),
+                        Process.myPid());
+            } else {
+                // Unlikely but possible in early system boot
+                final ApplicationWtfHandler handler = sDefaultApplicationWtfHandler;
+                if (handler != null) {
+                    exit = handler.handleApplicationWtf(
+                            mApplicationObject, tag, system,
+                            new ApplicationErrorReport.ParcelableCrashInfo(t),
+                            Process.myPid());
+                } else {
+                    // Simply log the error
+                    Slog.e(TAG, "Original WTF:", t);
+                }
+            }
+            if (exit) {
                 // The Activity Manager has already written us off -- now exit.
                 Process.killProcess(Process.myPid());
                 System.exit(10);
@@ -457,6 +477,29 @@
     }
 
     /**
+     * Set the default {@link ApplicationWtfHandler}, in case the ActivityManager is not ready yet.
+     */
+    public static void setDefaultApplicationWtfHandler(final ApplicationWtfHandler handler) {
+        sDefaultApplicationWtfHandler = handler;
+    }
+
+    /**
+     * The handler to deal with the serious application errors.
+     */
+    public interface ApplicationWtfHandler {
+        /**
+         * @param app object of the crashing app, null for the system server
+         * @param tag reported by the caller
+         * @param system whether this wtf is coming from the system
+         * @param crashInfo describing the context of the error
+         * @param immediateCallerPid the caller Pid
+         * @return true if the process should exit immediately (WTF is fatal)
+         */
+        boolean handleApplicationWtf(IBinder app, String tag, boolean system,
+                ApplicationErrorReport.ParcelableCrashInfo crashInfo, int immediateCallerPid);
+    }
+
+    /**
      * Set the object identifying this application/process, for reporting VM
      * errors.
      */
diff --git a/core/java/com/android/internal/policy/DecorView.java b/core/java/com/android/internal/policy/DecorView.java
index b6c58e1..f5d38ca 100644
--- a/core/java/com/android/internal/policy/DecorView.java
+++ b/core/java/com/android/internal/policy/DecorView.java
@@ -1631,9 +1631,7 @@
 
         int opacity = PixelFormat.OPAQUE;
         final WindowConfiguration winConfig = getResources().getConfiguration().windowConfiguration;
-        // TODO(b/149585281) remove when root task has the correct bounds for freeform
-        final boolean renderShadowsInCompositor = mWindow.mRenderShadowsInCompositor
-                && winConfig.getWindowingMode() != WINDOWING_MODE_FREEFORM;
+        final boolean renderShadowsInCompositor = mWindow.mRenderShadowsInCompositor;
         // If we draw shadows in the compositor we don't need to force the surface to be
         // translucent.
         if (winConfig.hasWindowShadow() && !renderShadowsInCompositor) {
@@ -2427,8 +2425,7 @@
     private void updateElevation() {
         final int windowingMode =
                 getResources().getConfiguration().windowConfiguration.getWindowingMode();
-        final boolean renderShadowsInCompositor = mWindow.mRenderShadowsInCompositor
-                && windowingMode != WINDOWING_MODE_FREEFORM;
+        final boolean renderShadowsInCompositor = mWindow.mRenderShadowsInCompositor;
         // If rendering shadows in the compositor, don't set an elevation on the view
         if (renderShadowsInCompositor) {
             return;
diff --git a/core/java/com/android/internal/policy/GestureNavigationSettingsObserver.java b/core/java/com/android/internal/policy/GestureNavigationSettingsObserver.java
index ebfea450..56a6db9 100644
--- a/core/java/com/android/internal/policy/GestureNavigationSettingsObserver.java
+++ b/core/java/com/android/internal/policy/GestureNavigationSettingsObserver.java
@@ -46,6 +46,9 @@
         r.registerContentObserver(
                 Settings.Secure.getUriFor(Settings.Secure.BACK_GESTURE_INSET_SCALE_RIGHT),
                 false, this, UserHandle.USER_ALL);
+        r.registerContentObserver(
+                Settings.Secure.getUriFor(Settings.Secure.USER_SETUP_COMPLETE),
+                false, this, UserHandle.USER_ALL);
     }
 
     public void unregister() {
@@ -68,6 +71,11 @@
         return getSensitivity(userRes, Settings.Secure.BACK_GESTURE_INSET_SCALE_RIGHT);
     }
 
+    public boolean areNavigationButtonForcedVisible() {
+        return Settings.Secure.getIntForUser(mContext.getContentResolver(),
+                Settings.Secure.USER_SETUP_COMPLETE, 0, UserHandle.USER_CURRENT) == 0;
+    }
+
     private int getSensitivity(Resources userRes, String side) {
         final int inset = userRes.getDimensionPixelSize(
                 com.android.internal.R.dimen.config_backGestureInset);
diff --git a/core/java/com/android/internal/policy/PhoneWindow.java b/core/java/com/android/internal/policy/PhoneWindow.java
index 25c114f..23ba653 100644
--- a/core/java/com/android/internal/policy/PhoneWindow.java
+++ b/core/java/com/android/internal/policy/PhoneWindow.java
@@ -79,6 +79,7 @@
 import android.view.ContextThemeWrapper;
 import android.view.Gravity;
 import android.view.IRotationWatcher.Stub;
+import android.view.IScrollCaptureController;
 import android.view.IWindowManager;
 import android.view.InputDevice;
 import android.view.InputEvent;
@@ -89,6 +90,7 @@
 import android.view.Menu;
 import android.view.MenuItem;
 import android.view.MotionEvent;
+import android.view.ScrollCaptureCallback;
 import android.view.SearchEvent;
 import android.view.SurfaceHolder.Callback2;
 import android.view.View;
@@ -3916,4 +3918,35 @@
                     : null);
         }
     }
+
+    /**
+     * System request to begin scroll capture.
+     *
+     * @param controller the controller to receive responses
+     * @hide
+     */
+    @Override
+    public void requestScrollCapture(IScrollCaptureController controller) {
+        getViewRootImpl().dispatchScrollCaptureRequest(controller);
+    }
+
+    /**
+     * Registers a handler providing scrolling capture support for window content.
+     *
+     * @param callback the callback to add
+     */
+    @Override
+    public void addScrollCaptureCallback(@NonNull ScrollCaptureCallback callback) {
+        getViewRootImpl().addScrollCaptureCallback(callback);
+    }
+
+    /**
+     * Unregisters the given {@link ScrollCaptureCallback}.
+     *
+     * @param callback the callback to remove
+     */
+    @Override
+    public void removeScrollCaptureCallback(@NonNull ScrollCaptureCallback callback) {
+        getViewRootImpl().removeScrollCaptureCallback(callback);
+    }
 }
diff --git a/core/java/com/android/internal/statusbar/IStatusBarService.aidl b/core/java/com/android/internal/statusbar/IStatusBarService.aidl
index 1dbd69c..24fe063 100644
--- a/core/java/com/android/internal/statusbar/IStatusBarService.aidl
+++ b/core/java/com/android/internal/statusbar/IStatusBarService.aidl
@@ -77,7 +77,7 @@
     void onNotificationSmartReplySent(in String key, in int replyIndex, in CharSequence reply,
             in int notificationLocation, boolean modifiedBeforeSending);
     void onNotificationSettingsViewed(String key);
-    void onNotificationBubbleChanged(String key, boolean isBubble);
+    void onNotificationBubbleChanged(String key, boolean isBubble, int flags);
     void onBubbleNotificationSuppressionChanged(String key, boolean isSuppressed);
     void grantInlineReplyUriPermission(String key, in Uri uri, in UserHandle user, String packageName);
     void clearInlineReplyUriPermissions(String key);
diff --git a/core/java/com/android/internal/util/ScreenshotHelper.java b/core/java/com/android/internal/util/ScreenshotHelper.java
index 7cff90b..adadc5e 100644
--- a/core/java/com/android/internal/util/ScreenshotHelper.java
+++ b/core/java/com/android/internal/util/ScreenshotHelper.java
@@ -1,5 +1,7 @@
 package com.android.internal.util;
 
+import static android.view.WindowManager.ScreenshotSource.SCREENSHOT_OTHER;
+
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.content.ComponentName;
@@ -10,11 +12,12 @@
 import android.graphics.Insets;
 import android.graphics.Rect;
 import android.net.Uri;
-import android.os.Bundle;
 import android.os.Handler;
 import android.os.IBinder;
 import android.os.Message;
 import android.os.Messenger;
+import android.os.Parcel;
+import android.os.Parcelable;
 import android.os.RemoteException;
 import android.os.UserHandle;
 import android.util.Log;
@@ -23,6 +26,109 @@
 import java.util.function.Consumer;
 
 public class ScreenshotHelper {
+
+    /**
+     * Describes a screenshot request (to make it easier to pass data through to the handler).
+     */
+    public static class ScreenshotRequest implements Parcelable {
+        private int mSource;
+        private boolean mHasStatusBar;
+        private boolean mHasNavBar;
+        private Bitmap mBitmap;
+        private Rect mBoundsInScreen;
+        private Insets mInsets;
+        private int mTaskId;
+
+        ScreenshotRequest(int source, boolean hasStatus, boolean hasNav) {
+            mSource = source;
+            mHasStatusBar = hasStatus;
+            mHasNavBar = hasNav;
+        }
+
+        ScreenshotRequest(
+                int source, Bitmap bitmap, Rect boundsInScreen, Insets insets, int taskId) {
+            mSource = source;
+            mBitmap = bitmap;
+            mBoundsInScreen = boundsInScreen;
+            mInsets = insets;
+            mTaskId = taskId;
+        }
+
+        ScreenshotRequest(Parcel in) {
+            mSource = in.readInt();
+            mHasStatusBar = in.readBoolean();
+            mHasNavBar = in.readBoolean();
+            if (in.readInt() == 1) {
+                mBitmap = in.readParcelable(Bitmap.class.getClassLoader());
+                mBoundsInScreen = in.readParcelable(Rect.class.getClassLoader());
+                mInsets = in.readParcelable(Insets.class.getClassLoader());
+                mTaskId = in.readInt();
+            }
+        }
+
+        public int getSource() {
+            return mSource;
+        }
+
+        public boolean getHasStatusBar() {
+            return mHasStatusBar;
+        }
+
+        public boolean getHasNavBar() {
+            return mHasNavBar;
+        }
+
+        public Bitmap getBitmap() {
+            return mBitmap;
+        }
+
+        public Rect getBoundsInScreen() {
+            return mBoundsInScreen;
+        }
+
+        public Insets getInsets() {
+            return mInsets;
+        }
+
+        public int getTaskId() {
+            return mTaskId;
+        }
+
+        @Override
+        public int describeContents() {
+            return 0;
+        }
+
+        @Override
+        public void writeToParcel(Parcel dest, int flags) {
+            dest.writeInt(mSource);
+            dest.writeBoolean(mHasStatusBar);
+            dest.writeBoolean(mHasNavBar);
+            if (mBitmap == null) {
+                dest.writeInt(0);
+            } else {
+                dest.writeInt(1);
+                dest.writeParcelable(mBitmap, 0);
+                dest.writeParcelable(mBoundsInScreen, 0);
+                dest.writeParcelable(mInsets, 0);
+                dest.writeInt(mTaskId);
+            }
+        }
+
+        public static final @NonNull Parcelable.Creator<ScreenshotRequest> CREATOR =
+                new Parcelable.Creator<ScreenshotRequest>() {
+
+                    @Override
+                    public ScreenshotRequest createFromParcel(Parcel source) {
+                        return new ScreenshotRequest(source);
+                    }
+
+                    @Override
+                    public ScreenshotRequest[] newArray(int size) {
+                        return new ScreenshotRequest[size];
+                    }
+                };
+    }
     private static final String TAG = "ScreenshotHelper";
 
     // Time until we give up on the screenshot & show an error instead.
@@ -36,8 +142,10 @@
         mContext = context;
     }
 
+
+
     /**
-     * Request a screenshot be taken with a specific timeout.
+     * Request a screenshot be taken.
      *
      * Added to support reducing unit test duration; the method variant without a timeout argument
      * is recommended for general use.
@@ -47,6 +155,32 @@
      *                           or
      *                           {@link android.view.WindowManager#TAKE_SCREENSHOT_SELECTED_REGION}
      * @param hasStatus          {@code true} if the status bar is currently showing. {@code false}
+     *                           if not.
+     * @param hasNav             {@code true} if the navigation bar is currently showing. {@code
+     *                           false} if not.
+     * @param source             The source of the screenshot request. One of
+     *                           {SCREENSHOT_GLOBAL_ACTIONS, SCREENSHOT_KEY_CHORD,
+     *                           SCREENSHOT_OVERVIEW, SCREENSHOT_OTHER}
+     * @param handler            A handler used in case the screenshot times out
+     * @param completionConsumer Consumes `false` if a screenshot was not taken, and `true` if the
+     *                           screenshot was taken.
+     */
+    public void takeScreenshot(final int screenshotType, final boolean hasStatus,
+            final boolean hasNav, int source, @NonNull Handler handler,
+            @Nullable Consumer<Uri> completionConsumer) {
+        ScreenshotRequest screenshotRequest = new ScreenshotRequest(source, hasStatus, hasNav);
+        takeScreenshot(screenshotType, SCREENSHOT_TIMEOUT_MS, handler, screenshotRequest,
+                completionConsumer);
+    }
+
+    /**
+     * Request a screenshot be taken, with provided reason.
+     *
+     * @param screenshotType     The type of screenshot, for example either
+     *                           {@link android.view.WindowManager#TAKE_SCREENSHOT_FULLSCREEN}
+     *                           or
+     *                           {@link android.view.WindowManager#TAKE_SCREENSHOT_SELECTED_REGION}
+     * @param hasStatus          {@code true} if the status bar is currently showing. {@code false}
      *                           if
      *                           not.
      * @param hasNav             {@code true} if the navigation bar is currently showing. {@code
@@ -64,7 +198,7 @@
     }
 
     /**
-     * Request a screenshot be taken.
+     * Request a screenshot be taken with a specific timeout.
      *
      * Added to support reducing unit test duration; the method variant without a timeout argument
      * is recommended for general use.
@@ -89,9 +223,9 @@
     public void takeScreenshot(final int screenshotType, final boolean hasStatus,
             final boolean hasNav, long timeoutMs, @NonNull Handler handler,
             @Nullable Consumer<Uri> completionConsumer) {
-        takeScreenshot(screenshotType, hasStatus, hasNav, timeoutMs, handler, null,
-                completionConsumer
-        );
+        ScreenshotRequest screenshotRequest = new ScreenshotRequest(SCREENSHOT_OTHER, hasStatus,
+                hasNav);
+        takeScreenshot(screenshotType, timeoutMs, handler, screenshotRequest, completionConsumer);
     }
 
     /**
@@ -106,23 +240,16 @@
      *                           screenshot was taken.
      */
     public void provideScreenshot(@NonNull Bitmap screenshot, @NonNull Rect boundsInScreen,
-            @NonNull Insets insets, int taskId, @NonNull Handler handler,
-            @Nullable Consumer<Uri> completionConsumer) {
-        Bundle imageBundle = new Bundle();
-        imageBundle.putParcelable(WindowManager.PARCEL_KEY_SCREENSHOT_BITMAP, screenshot);
-        imageBundle.putParcelable(WindowManager.PARCEL_KEY_SCREENSHOT_BOUNDS, boundsInScreen);
-        imageBundle.putParcelable(WindowManager.PARCEL_KEY_SCREENSHOT_INSETS, insets);
-        imageBundle.putInt(WindowManager.PARCEL_KEY_SCREENSHOT_TASK_ID, taskId);
-
-        takeScreenshot(
-                WindowManager.TAKE_SCREENSHOT_PROVIDED_IMAGE,
-                false, false, // ignored when image bundle is set
-                SCREENSHOT_TIMEOUT_MS, handler, imageBundle, completionConsumer);
+            @NonNull Insets insets, int taskId, int source,
+            @NonNull Handler handler, @Nullable Consumer<Uri> completionConsumer) {
+        ScreenshotRequest screenshotRequest =
+                new ScreenshotRequest(source, screenshot, boundsInScreen, insets, taskId);
+        takeScreenshot(WindowManager.TAKE_SCREENSHOT_PROVIDED_IMAGE, SCREENSHOT_TIMEOUT_MS,
+                handler, screenshotRequest, completionConsumer);
     }
 
-    private void takeScreenshot(final int screenshotType, final boolean hasStatus,
-            final boolean hasNav, long timeoutMs, @NonNull Handler handler,
-            @Nullable Bundle providedImage, @Nullable Consumer<Uri> completionConsumer) {
+    private void takeScreenshot(final int screenshotType, long timeoutMs, @NonNull Handler handler,
+            ScreenshotRequest screenshotRequest, @Nullable Consumer<Uri> completionConsumer) {
         synchronized (mScreenshotLock) {
             if (mScreenshotConnection != null) {
                 return;
@@ -157,7 +284,7 @@
                             return;
                         }
                         Messenger messenger = new Messenger(service);
-                        Message msg = Message.obtain(null, screenshotType);
+                        Message msg = Message.obtain(null, screenshotType, screenshotRequest);
                         final ServiceConnection myConn = this;
                         Handler h = new Handler(handler.getLooper()) {
                             @Override
@@ -175,12 +302,6 @@
                             }
                         };
                         msg.replyTo = new Messenger(h);
-                        msg.arg1 = hasStatus ? 1 : 0;
-                        msg.arg2 = hasNav ? 1 : 0;
-
-                        if (screenshotType == WindowManager.TAKE_SCREENSHOT_PROVIDED_IMAGE) {
-                            msg.setData(providedImage);
-                        }
 
                         try {
                             messenger.send(msg);
diff --git a/core/java/com/android/internal/view/BaseIWindow.java b/core/java/com/android/internal/view/BaseIWindow.java
index 47f094f..7f3eb45 100644
--- a/core/java/com/android/internal/view/BaseIWindow.java
+++ b/core/java/com/android/internal/view/BaseIWindow.java
@@ -26,6 +26,7 @@
 import android.util.MergedConfiguration;
 import android.view.DisplayCutout;
 import android.view.DragEvent;
+import android.view.IScrollCaptureController;
 import android.view.IWindow;
 import android.view.IWindowSession;
 import android.view.InsetsSourceControl;
@@ -169,4 +170,13 @@
     @Override
     public void dispatchPointerCaptureChanged(boolean hasCapture) {
     }
+
+    @Override
+    public void requestScrollCapture(IScrollCaptureController controller) {
+        try {
+            controller.onClientUnavailable();
+        } catch (RemoteException ex) {
+            // ignore
+        }
+    }
 }
diff --git a/core/java/com/android/internal/view/ScrollCaptureInternal.java b/core/java/com/android/internal/view/ScrollCaptureInternal.java
new file mode 100644
index 0000000..c589afde
--- /dev/null
+++ b/core/java/com/android/internal/view/ScrollCaptureInternal.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.view;
+
+import android.annotation.Nullable;
+import android.graphics.Point;
+import android.graphics.Rect;
+import android.view.ScrollCaptureCallback;
+import android.view.View;
+import android.view.ViewGroup;
+
+/**
+ * Provides built-in framework level Scroll Capture support for standard scrolling Views.
+ */
+public class ScrollCaptureInternal {
+    private static final String TAG = "ScrollCaptureInternal";
+
+    private static final int UP = -1;
+    private static final int DOWN = 1;
+
+    /**
+     * Not a ViewGroup, or cannot scroll according to View APIs.
+     */
+    public static final int TYPE_FIXED = 0;
+
+    /**
+     * Slides a single child view using mScrollX/mScrollY.
+     */
+    public static final int TYPE_SCROLLING = 1;
+
+    /**
+     * Slides child views through the viewport by translating their layout positions with {@link
+     * View#offsetTopAndBottom(int)}. Manages Child view lifecycle, creating as needed and
+     * binding views to data from an adapter. Views are reused whenever possible.
+     */
+    public static final int TYPE_RECYCLING = 2;
+
+    /**
+     * Performs tests on the given View and determines:
+     * 1. If scrolling is possible
+     * 2. What mechanisms are used for scrolling.
+     * <p>
+     * This needs to be fast and not alloc memory. It's called on everything in the tree not marked
+     * as excluded during scroll capture search.
+     */
+    public static int detectScrollingType(View view) {
+        // Must be a ViewGroup
+        if (!(view instanceof ViewGroup)) {
+            return TYPE_FIXED;
+        }
+        // Confirm that it can scroll.
+        if (!(view.canScrollVertically(DOWN) || view.canScrollVertically(UP))) {
+            // Nothing to scroll here, move along.
+            return TYPE_FIXED;
+        }
+        // ScrollViews accept only a single child.
+        if (((ViewGroup) view).getChildCount() > 1) {
+            return TYPE_RECYCLING;
+        }
+        //Because recycling containers don't use scrollY, a non-zero value means Scroll view.
+        if (view.getScrollY() != 0) {
+            return TYPE_SCROLLING;
+        }
+        // Since scrollY cannot be negative, this means a Recycling view.
+        if (view.canScrollVertically(UP)) {
+            return TYPE_RECYCLING;
+        }
+        // canScrollVertically(UP) == false, getScrollY() == 0, getChildCount() == 1.
+
+        // For Recycling containers, this should be a no-op (RecyclerView logs a warning)
+        view.scrollTo(view.getScrollX(), 1);
+
+        // A scrolling container would have moved by 1px.
+        if (view.getScrollY() == 1) {
+            view.scrollTo(view.getScrollX(), 0);
+            return TYPE_SCROLLING;
+        }
+        return TYPE_RECYCLING;
+    }
+
+    /**
+     * Creates a scroll capture callback for the given view if possible.
+     *
+     * @param view             the view to capture
+     * @param localVisibleRect the visible area of the given view in local coordinates, as supplied
+     *                         by the view parent
+     * @param positionInWindow the offset of localVisibleRect within the window
+     *
+     * @return a new callback or null if the View isn't supported
+     */
+    @Nullable
+    public ScrollCaptureCallback requestCallback(View view, Rect localVisibleRect,
+            Point positionInWindow) {
+        // Nothing to see here yet.
+        int i = detectScrollingType(view);
+        switch (i) {
+            case TYPE_SCROLLING:
+                return new ScrollCaptureViewSupport<>((ViewGroup) view,
+                        new ScrollViewCaptureHelper());
+        }
+        return null;
+    }
+}
diff --git a/core/java/com/android/internal/view/ScrollCaptureViewHelper.java b/core/java/com/android/internal/view/ScrollCaptureViewHelper.java
new file mode 100644
index 0000000..9f100bd
--- /dev/null
+++ b/core/java/com/android/internal/view/ScrollCaptureViewHelper.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.view;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.graphics.Rect;
+import android.view.View;
+
+interface ScrollCaptureViewHelper<V extends View> {
+    int UP = -1;
+    int DOWN = 1;
+
+    /**
+     * Verifies that the view is still visible and scrollable. If true is returned here, expect a
+     * call to {@link #onComputeScrollBounds(View)} to follow.
+     *
+     * @param view the view being captured
+     * @return true if the callback should respond to a request with scroll bounds
+     */
+    default boolean onAcceptSession(@Nullable V view) {
+        return view != null && view.isVisibleToUser()
+                && (view.canScrollVertically(UP) || view.canScrollVertically(DOWN));
+    }
+
+    /**
+     * Given a scroll capture request for a view, adjust the provided rect to cover the scrollable
+     * content area. The default implementation returns the padded content area of {@code view}.
+     *
+     * @param view the view being captured
+     */
+    default Rect onComputeScrollBounds(@Nullable V view) {
+        return new Rect(view.getPaddingLeft(), view.getPaddingTop(),
+                view.getWidth() - view.getPaddingRight(),
+                view.getHeight() - view.getPaddingBottom());
+    }
+    /**
+     * Adjust the target for capture.
+     * <p>
+     * Do not touch anything that may change layout positions or sizes on screen. Anything else may
+     * be adjusted as long as it can be reversed in {@link #onPrepareForEnd(View)}.
+     *
+     * @param view         the view being captured
+     * @param scrollBounds the bounds within {@code view} where content scrolls
+     */
+    void onPrepareForStart(@NonNull V view, Rect scrollBounds);
+
+    /**
+     * Map the request onto the screen.
+     * <p>
+     * Given a  rect describing the area to capture, relative to scrollBounds, take actions
+     * necessary to bring the content within the rectangle into the visible area of the view if
+     * needed and return the resulting rectangle describing the position and bounds of the area
+     * which is visible.
+     *
+     * @param scrollBounds the area in which scrolling content moves, local to the {@code containing
+     *                     view}
+     * @param requestRect  the area relative to {@code scrollBounds} which describes the location of
+     *                     content to capture for the request
+     * @return the visible area within scrollBounds of the requested rectangle, return {@code null}
+     * in the case of an unrecoverable error condition, to abort the capture process
+     */
+    Rect onScrollRequested(@NonNull V view, Rect scrollBounds, Rect requestRect);
+
+    /**
+     * Restore the target after capture.
+     * <p>
+     * Put back anything that was changed in {@link #onPrepareForStart(View, Rect)}.
+     *
+     * @param view the view being captured
+     */
+    void onPrepareForEnd(@NonNull V view);
+}
diff --git a/core/java/com/android/internal/view/ScrollCaptureViewSupport.java b/core/java/com/android/internal/view/ScrollCaptureViewSupport.java
new file mode 100644
index 0000000..4087eda
--- /dev/null
+++ b/core/java/com/android/internal/view/ScrollCaptureViewSupport.java
@@ -0,0 +1,239 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.view;
+
+import android.graphics.HardwareRenderer;
+import android.graphics.Matrix;
+import android.graphics.RecordingCanvas;
+import android.graphics.Rect;
+import android.graphics.RectF;
+import android.graphics.RenderNode;
+import android.os.Handler;
+import android.os.SystemClock;
+import android.util.DisplayMetrics;
+import android.view.ScrollCaptureCallback;
+import android.view.ScrollCaptureSession;
+import android.view.Surface;
+import android.view.View;
+
+import java.lang.ref.WeakReference;
+import java.util.function.Consumer;
+
+/**
+ * Provides a ScrollCaptureCallback implementation for to handle arbitrary View-based scrolling
+ * containers.
+ * <p>
+ * To use this class, supply the target view and an implementation of {@ScrollCaptureViewHelper}
+ * to the callback.
+ *
+ * @param <V> the specific View subclass handled
+ * @hide
+ */
+public class ScrollCaptureViewSupport<V extends View> implements ScrollCaptureCallback {
+
+    private final WeakReference<V> mWeakView;
+    private final ScrollCaptureViewHelper<V> mViewHelper;
+    private ViewRenderer mRenderer;
+    private Handler mUiHandler;
+    private boolean mStarted;
+    private boolean mEnded;
+
+    static <V extends View> ScrollCaptureCallback createCallback(V view,
+            ScrollCaptureViewHelper<V> impl) {
+        return new ScrollCaptureViewSupport<>(view, impl);
+    }
+
+    ScrollCaptureViewSupport(V containingView, ScrollCaptureViewHelper<V> viewHelper) {
+        mWeakView = new WeakReference<>(containingView);
+        mRenderer = new ViewRenderer();
+        mUiHandler = containingView.getHandler();
+        mViewHelper = viewHelper;
+    }
+
+    // Base implementation of ScrollCaptureCallback
+
+    @Override
+    public final void onScrollCaptureSearch(Consumer<Rect> onReady) {
+        V view = mWeakView.get();
+        mStarted = false;
+        mEnded = false;
+
+        if (view != null && view.isVisibleToUser() && mViewHelper.onAcceptSession(view)) {
+            onReady.accept(mViewHelper.onComputeScrollBounds(view));
+            return;
+        }
+        onReady.accept(null);
+    }
+
+    @Override
+    public final void onScrollCaptureStart(ScrollCaptureSession session, Runnable onReady) {
+        V view = mWeakView.get();
+        mEnded = false;
+        mStarted = true;
+
+        // Note: If somehow the view is already gone or detached, the first call to
+        // {@code onScrollCaptureImageRequest} will return an error and request the session to
+        // end.
+        if (view != null && view.isVisibleToUser()) {
+            mRenderer.setSurface(session.getSurface());
+            mViewHelper.onPrepareForStart(view, session.getScrollBounds());
+        }
+        onReady.run();
+    }
+
+    @Override
+    public final void onScrollCaptureImageRequest(ScrollCaptureSession session, Rect requestRect) {
+        V view = mWeakView.get();
+        if (view == null || !view.isVisibleToUser()) {
+            // Signal to the controller that we have a problem and can't continue.
+            session.notifyBufferSent(0, null);
+            return;
+        }
+        Rect captureArea = mViewHelper.onScrollRequested(view, session.getScrollBounds(),
+                requestRect);
+        mRenderer.renderFrame(view, captureArea, mUiHandler,
+                () -> session.notifyBufferSent(0, captureArea));
+    }
+
+    @Override
+    public final void onScrollCaptureEnd(Runnable onReady) {
+        V view = mWeakView.get();
+        if (mStarted && !mEnded) {
+            mViewHelper.onPrepareForEnd(view);
+            /* empty */
+            mEnded = true;
+            mRenderer.trimMemory();
+            mRenderer.setSurface(null);
+        }
+        onReady.run();
+    }
+
+    /**
+     * Internal helper class which assists in rendering sections of the view hierarchy relative to a
+     * given view. Used by framework implementations of ScrollCaptureHandler to render and dispatch
+     * image requests.
+     */
+    static final class ViewRenderer {
+        // alpha, "reasonable default" from Javadoc
+        private static final float AMBIENT_SHADOW_ALPHA = 0.039f;
+        private static final float SPOT_SHADOW_ALPHA = 0.039f;
+
+        // Default values:
+        //    lightX = (screen.width() / 2) - windowLeft
+        //    lightY = 0 - windowTop
+        //    lightZ = 600dp
+        //    lightRadius = 800dp
+        private static final float LIGHT_Z_DP = 400;
+        private static final float LIGHT_RADIUS_DP = 800;
+        private static final String TAG = "ViewRenderer";
+
+        private HardwareRenderer mRenderer;
+        private RenderNode mRootRenderNode;
+        private final RectF mTempRectF = new RectF();
+        private final Rect mSourceRect = new Rect();
+        private final Rect mTempRect = new Rect();
+        private final Matrix mTempMatrix = new Matrix();
+        private final int[] mTempLocation = new int[2];
+        private long mLastRenderedSourceDrawingId = -1;
+
+
+        ViewRenderer() {
+            mRenderer = new HardwareRenderer();
+            mRootRenderNode = new RenderNode("ScrollCaptureRoot");
+            mRenderer.setContentRoot(mRootRenderNode);
+
+            // TODO: Figure out a way to flip this on when we are sure the source window is opaque
+            mRenderer.setOpaque(false);
+        }
+
+        public void setSurface(Surface surface) {
+            mRenderer.setSurface(surface);
+        }
+
+        /**
+         * Cache invalidation check. If the source view is the same as the previous call (which is
+         * mostly always the case, then we can skip setting up lighting on each call (for now)
+         *
+         * @return true if the view changed, false if the view was previously rendered by this class
+         */
+        private boolean updateForView(View source) {
+            if (mLastRenderedSourceDrawingId == source.getUniqueDrawingId()) {
+                return false;
+            }
+            mLastRenderedSourceDrawingId = source.getUniqueDrawingId();
+            return true;
+        }
+
+        // TODO: may need to adjust lightY based on the virtual canvas position to get
+        //       consistent shadow positions across the whole capture. Or possibly just
+        //       pull lightZ way back to make shadows more uniform.
+        private void setupLighting(View mSource) {
+            mLastRenderedSourceDrawingId = mSource.getUniqueDrawingId();
+            DisplayMetrics metrics = mSource.getResources().getDisplayMetrics();
+            mSource.getLocationOnScreen(mTempLocation);
+            final float lightX = metrics.widthPixels / 2f - mTempLocation[0];
+            final float lightY = metrics.heightPixels - mTempLocation[1];
+            final int lightZ = (int) (LIGHT_Z_DP * metrics.density);
+            final int lightRadius = (int) (LIGHT_RADIUS_DP * metrics.density);
+
+            // Enable shadows for elevation/Z
+            mRenderer.setLightSourceGeometry(lightX, lightY, lightZ, lightRadius);
+            mRenderer.setLightSourceAlpha(AMBIENT_SHADOW_ALPHA, SPOT_SHADOW_ALPHA);
+
+        }
+
+        public void renderFrame(View localReference, Rect sourceRect, Handler handler,
+                Runnable onFrameCommitted) {
+            if (updateForView(localReference)) {
+                setupLighting(localReference);
+            }
+            buildRootDisplayList(localReference, sourceRect);
+            HardwareRenderer.FrameRenderRequest request = mRenderer.createRenderRequest();
+            request.setVsyncTime(SystemClock.elapsedRealtimeNanos());
+            request.setFrameCommitCallback(handler::post, onFrameCommitted);
+            request.setWaitForPresent(true);
+            request.syncAndDraw();
+        }
+
+        public void trimMemory() {
+            mRenderer.clearContent();
+        }
+
+        public void destroy() {
+            mRenderer.destroy();
+        }
+
+        private void transformToRoot(View local, Rect localRect, Rect outRect) {
+            mTempMatrix.reset();
+            local.transformMatrixToGlobal(mTempMatrix);
+            mTempRectF.set(localRect);
+            mTempMatrix.mapRect(mTempRectF);
+            mTempRectF.round(outRect);
+        }
+
+        private void buildRootDisplayList(View source, Rect localSourceRect) {
+            final View captureSource = source.getRootView();
+            transformToRoot(source, localSourceRect, mTempRect);
+            mRootRenderNode.setPosition(0, 0, mTempRect.width(), mTempRect.height());
+            RecordingCanvas canvas = mRootRenderNode.beginRecording(mTempRect.width(),
+                    mTempRect.height());
+            canvas.translate(-mTempRect.left, -mTempRect.top);
+            canvas.drawRenderNode(captureSource.updateDisplayListIfDirty());
+            mRootRenderNode.endRecording();
+        }
+    }
+}
diff --git a/core/java/com/android/internal/view/ScrollViewCaptureHelper.java b/core/java/com/android/internal/view/ScrollViewCaptureHelper.java
new file mode 100644
index 0000000..12bd461
--- /dev/null
+++ b/core/java/com/android/internal/view/ScrollViewCaptureHelper.java
@@ -0,0 +1,167 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.view;
+
+import android.annotation.NonNull;
+import android.graphics.Point;
+import android.graphics.Rect;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.ViewParent;
+
+/**
+ * ScrollCapture for ScrollView and <i>ScrollView-like</i> ViewGroups.
+ * <p>
+ * Requirements for proper operation:
+ * <ul>
+ * <li>contains at most 1 child.
+ * <li>scrolls to absolute positions with {@link View#scrollTo(int, int)}.
+ * <li>has a finite, known content height and scrolling range
+ * <li>correctly implements {@link View#canScrollVertically(int)}
+ * <li>correctly implements {@link ViewParent#requestChildRectangleOnScreen(View,
+ * Rect, boolean)}
+ * </ul>
+ */
+public class ScrollViewCaptureHelper implements ScrollCaptureViewHelper<ViewGroup> {
+    private int mStartScrollY;
+    private boolean mScrollBarEnabled;
+    private int mOverScrollMode;
+
+    /** @see ScrollCaptureViewHelper#onPrepareForStart(View, Rect) */
+    public void onPrepareForStart(@NonNull ViewGroup view, Rect scrollBounds) {
+        mStartScrollY = view.getScrollY();
+        mOverScrollMode = view.getOverScrollMode();
+        if (mOverScrollMode != View.OVER_SCROLL_NEVER) {
+            view.setOverScrollMode(View.OVER_SCROLL_NEVER);
+        }
+        mScrollBarEnabled = view.isVerticalScrollBarEnabled();
+        if (mScrollBarEnabled) {
+            view.setVerticalScrollBarEnabled(false);
+        }
+    }
+
+    /** @see ScrollCaptureViewHelper#onScrollRequested(View, Rect, Rect) */
+    public Rect onScrollRequested(@NonNull ViewGroup view, Rect scrollBounds, Rect requestRect) {
+        final View contentView = view.getChildAt(0); // returns null, does not throw IOOBE
+        if (contentView == null) {
+            return null;
+        }
+        /*
+               +---------+ <----+ Content [25,25 - 275,1025] (w=250,h=1000)
+               |         |
+            ...|.........|...  startScrollY=100
+               |         |
+            +--+---------+---+ <--+ Container View [0,0 - 300,300] (scrollY=200)
+            |  .         .   |
+        --- |  . +-----+   <------+ Scroll Bounds [50,50 - 250,250] (200x200)
+         ^  |  . |     | .   |      (Local to Container View, fixed/un-scrolled)
+         |  |  . |     | .   |
+         |  |  . |     | .   |
+         |  |  . +-----+ .   |
+         |  |  .         .   |
+         |  +--+---------+---+
+         |     |         |
+        -+-    | +-----+ |
+               | |#####| |   <--+ Requested Bounds [0,300 - 200,400] (200x100)
+               | +-----+ |       (Local to Scroll Bounds, fixed/un-scrolled)
+               |         |
+               +---------+
+
+        Container View (ScrollView) [0,0 - 300,300] (scrollY = 200)
+        \__ Content [25,25 - 275,1025]  (250x1000) (contentView)
+        \__ Scroll Bounds[50,50 - 250,250]  (w=200,h=200)
+            \__ Requested Bounds[0,300 - 200,400] (200x100)
+       */
+
+        // 0) adjust the requestRect to account for scroll change since start
+        //
+        //  Scroll Bounds[50,50 - 250,250]  (w=200,h=200)
+        //  \__ Requested Bounds[0,200 - 200,300] (200x100)
+
+        // (y-100) (scrollY - mStartScrollY)
+        int scrollDelta = view.getScrollY() - mStartScrollY;
+
+        //  1) Translate request rect to make it relative to container view
+        //
+        //  Container View [0,0 - 300,300] (scrollY=200)
+        //  \__ Requested Bounds[50,250 - 250,350] (w=250, h=100)
+
+        // (x+50,y+50)
+        Rect requestedContainerBounds = new Rect(requestRect);
+        requestedContainerBounds.offset(0, -scrollDelta);
+        requestedContainerBounds.offset(scrollBounds.left, scrollBounds.top);
+
+        //  2) Translate from container to contentView relative (applying container scrollY)
+        //
+        //  Container View [0,0 - 300,300] (scrollY=200)
+        //  \__ Content [25,25 - 275,1025]  (250x1000) (contentView)
+        //      \__ Requested Bounds[25,425 - 200,525] (w=250, h=100)
+
+        // (x-25,y+175) (scrollY - content.top)
+        Rect requestedContentBounds = new Rect(requestedContainerBounds);
+        requestedContentBounds.offset(
+                view.getScrollX() - contentView.getLeft(),
+                view.getScrollY() - contentView.getTop());
+
+
+
+        // requestRect is now local to contentView as requestedContentBounds
+        // contentView (and each parent in turn if possible) will be scrolled
+        // (if necessary) to make all of requestedContent visible, (if possible!)
+        contentView.requestRectangleOnScreen(new Rect(requestedContentBounds), true);
+
+        // update new offset between starting and current scroll position
+        scrollDelta = view.getScrollY() - mStartScrollY;
+
+
+        // TODO: adjust to avoid occlusions/minimize scroll changes
+
+        Point offset = new Point();
+        final Rect capturedRect = new Rect(requestedContentBounds); // empty
+        if (!view.getChildVisibleRect(contentView, capturedRect, offset)) {
+            capturedRect.setEmpty();
+            return capturedRect;
+        }
+        // Transform back from global to content-view local
+        capturedRect.offset(-offset.x, -offset.y);
+
+        // Then back to container view
+        capturedRect.offset(
+                contentView.getLeft() - view.getScrollX(),
+                contentView.getTop() - view.getScrollY());
+
+
+        // And back to relative to scrollBounds
+        capturedRect.offset(-scrollBounds.left, -scrollBounds.top);
+
+        // Apply scrollDelta again to return to make capturedRect relative to scrollBounds at
+        // the scroll position at start of capture.
+        capturedRect.offset(0, scrollDelta);
+        return capturedRect;
+    }
+
+    /** @see ScrollCaptureViewHelper#onPrepareForEnd(View)  */
+    public void onPrepareForEnd(@NonNull ViewGroup view) {
+        view.scrollTo(0, mStartScrollY);
+        if (mOverScrollMode != View.OVER_SCROLL_NEVER) {
+            view.setOverScrollMode(mOverScrollMode);
+        }
+        if (mScrollBarEnabled) {
+            view.setVerticalScrollBarEnabled(true);
+        }
+    }
+}
diff --git a/core/java/com/android/internal/widget/ResolverDrawerLayout.java b/core/java/com/android/internal/widget/ResolverDrawerLayout.java
index 31527e8..fb2ecf3 100644
--- a/core/java/com/android/internal/widget/ResolverDrawerLayout.java
+++ b/core/java/com/android/internal/widget/ResolverDrawerLayout.java
@@ -1084,6 +1084,7 @@
     protected Parcelable onSaveInstanceState() {
         final SavedState ss = new SavedState(super.onSaveInstanceState());
         ss.open = mCollapsibleHeight > 0 && mCollapseOffset == 0;
+        ss.mCollapsibleHeightReserved = mCollapsibleHeightReserved;
         return ss;
     }
 
@@ -1092,6 +1093,7 @@
         final SavedState ss = (SavedState) state;
         super.onRestoreInstanceState(ss.getSuperState());
         mOpenOnLayout = ss.open;
+        mCollapsibleHeightReserved = ss.mCollapsibleHeightReserved;
     }
 
     public static class LayoutParams extends MarginLayoutParams {
@@ -1142,6 +1144,7 @@
 
     static class SavedState extends BaseSavedState {
         boolean open;
+        private int mCollapsibleHeightReserved;
 
         SavedState(Parcelable superState) {
             super(superState);
@@ -1150,12 +1153,14 @@
         private SavedState(Parcel in) {
             super(in);
             open = in.readInt() != 0;
+            mCollapsibleHeightReserved = in.readInt();
         }
 
         @Override
         public void writeToParcel(Parcel out, int flags) {
             super.writeToParcel(out, flags);
             out.writeInt(open ? 1 : 0);
+            out.writeInt(mCollapsibleHeightReserved);
         }
 
         public static final Parcelable.Creator<SavedState> CREATOR =
diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp
index ba7aef7..4cb2e97 100644
--- a/core/jni/AndroidRuntime.cpp
+++ b/core/jni/AndroidRuntime.cpp
@@ -301,6 +301,8 @@
 }
 
 void AndroidRuntime::setArgv0(const char* argv0, bool setProcName) {
+    // Set the kernel's task name, for as much of the name as we can fit.
+    // The kernel's TASK_COMM_LEN minus one for the terminating NUL == 15.
     if (setProcName) {
         int len = strlen(argv0);
         if (len < 15) {
@@ -309,8 +311,14 @@
             pthread_setname_np(pthread_self(), argv0 + len - 15);
         }
     }
+
+    // Directly change the memory pointed to by argv[0].
     memset(mArgBlockStart, 0, mArgBlockLength);
     strlcpy(mArgBlockStart, argv0, mArgBlockLength);
+
+    // Let bionic know that we just did that, because __progname points
+    // into argv[0] (https://issuetracker.google.com/152893281).
+    setprogname(mArgBlockStart);
 }
 
 status_t AndroidRuntime::callMain(const String8& className, jclass clazz,
@@ -1244,12 +1252,11 @@
 {
     if (mExitWithoutCleanup) {
         ALOGI("VM exiting with result code %d, cleanup skipped.", code);
-        ::_exit(code);
     } else {
         ALOGI("VM exiting with result code %d.", code);
         onExit(code);
-        ::exit(code);
     }
+    ::_exit(code);
 }
 
 void AndroidRuntime::onVmCreated(JNIEnv* env)
diff --git a/core/jni/android_os_Parcel.cpp b/core/jni/android_os_Parcel.cpp
index 483b455..e7a2fb4 100644
--- a/core/jni/android_os_Parcel.cpp
+++ b/core/jni/android_os_Parcel.cpp
@@ -273,7 +273,28 @@
     }
 }
 
-static void android_os_Parcel_writeString(JNIEnv* env, jclass clazz, jlong nativePtr, jstring val)
+static void android_os_Parcel_writeString8(JNIEnv* env, jclass clazz, jlong nativePtr, jstring val)
+{
+    Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr);
+    if (parcel != NULL) {
+        status_t err = NO_MEMORY;
+        if (val) {
+            const size_t len = env->GetStringUTFLength(val);
+            const char* str = env->GetStringUTFChars(val, 0);
+            if (str) {
+                err = parcel->writeString8(str, len);
+                env->ReleaseStringUTFChars(val, str);
+            }
+        } else {
+            err = parcel->writeString8(NULL, 0);
+        }
+        if (err != NO_ERROR) {
+            signalExceptionForError(env, clazz, err);
+        }
+    }
+}
+
+static void android_os_Parcel_writeString16(JNIEnv* env, jclass clazz, jlong nativePtr, jstring val)
 {
     Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr);
     if (parcel != NULL) {
@@ -444,7 +465,21 @@
     return 0;
 }
 
-static jstring android_os_Parcel_readString(JNIEnv* env, jclass clazz, jlong nativePtr)
+static jstring android_os_Parcel_readString8(JNIEnv* env, jclass clazz, jlong nativePtr)
+{
+    Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr);
+    if (parcel != NULL) {
+        size_t len;
+        const char* str = parcel->readString8Inplace(&len);
+        if (str) {
+            return env->NewStringUTF(str);
+        }
+        return NULL;
+    }
+    return NULL;
+}
+
+static jstring android_os_Parcel_readString16(JNIEnv* env, jclass clazz, jlong nativePtr)
 {
     Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr);
     if (parcel != NULL) {
@@ -722,7 +757,9 @@
     // @FastNative
     {"nativeWriteDouble",         "(JD)V", (void*)android_os_Parcel_writeDouble},
     // @FastNative
-    {"nativeWriteString",         "(JLjava/lang/String;)V", (void*)android_os_Parcel_writeString},
+    {"nativeWriteString8",        "(JLjava/lang/String;)V", (void*)android_os_Parcel_writeString8},
+    // @FastNative
+    {"nativeWriteString16",       "(JLjava/lang/String;)V", (void*)android_os_Parcel_writeString16},
     // @FastNative
     {"nativeWriteStrongBinder",   "(JLandroid/os/IBinder;)V", (void*)android_os_Parcel_writeStrongBinder},
     // @FastNative
@@ -740,7 +777,9 @@
     // @CriticalNative
     {"nativeReadDouble",          "(J)D", (void*)android_os_Parcel_readDouble},
     // @FastNative
-    {"nativeReadString",          "(J)Ljava/lang/String;", (void*)android_os_Parcel_readString},
+    {"nativeReadString8",         "(J)Ljava/lang/String;", (void*)android_os_Parcel_readString8},
+    // @FastNative
+    {"nativeReadString16",        "(J)Ljava/lang/String;", (void*)android_os_Parcel_readString16},
     // @FastNative
     {"nativeReadStrongBinder",    "(J)Landroid/os/IBinder;", (void*)android_os_Parcel_readStrongBinder},
     // @FastNative
diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp
index 1cfa12d..5869787 100644
--- a/core/jni/android_view_SurfaceControl.cpp
+++ b/core/jni/android_view_SurfaceControl.cpp
@@ -848,8 +848,18 @@
         LOG_FATAL("Unknown alternative for variant DeviceProductInfo::ManufactureOrModelDate");
     }
 
+    jintArray relativeAddress = nullptr;
+    if (info->relativeAddress != DeviceProductInfo::NO_RELATIVE_ADDRESS) {
+        relativeAddress = env->NewIntArray(info->relativeAddress.size());
+        jint* relativeAddressData = env->GetIntArrayElements(relativeAddress, nullptr);
+        for (size_t i = 0; i < info->relativeAddress.size(); i++) {
+            relativeAddressData[i] = static_cast<jint>(info->relativeAddress[i]);
+        }
+        env->ReleaseIntArrayElements(relativeAddress, relativeAddressData, 0);
+    }
     return env->NewObject(gDeviceProductInfoClassInfo.clazz, gDeviceProductInfoClassInfo.ctor, name,
-                          manufacturerPnpId, productId, modelYear, manufactureDate);
+                          manufacturerPnpId, productId, modelYear, manufactureDate,
+                          relativeAddress);
 }
 
 static jobject nativeGetDisplayInfo(JNIEnv* env, jclass clazz, jobject tokenObj) {
@@ -1684,7 +1694,8 @@
                              "Ljava/lang/String;"
                              "Ljava/lang/String;"
                              "Ljava/lang/Integer;"
-                             "Landroid/hardware/display/DeviceProductInfo$ManufactureDate;)V");
+                             "Landroid/hardware/display/DeviceProductInfo$ManufactureDate;"
+                             "[I)V");
 
     jclass deviceProductInfoManufactureDateClazz =
             FindClassOrDie(env, "android/hardware/display/DeviceProductInfo$ManufactureDate");
diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp
index 924dc4b..3a5720fd 100644
--- a/core/jni/com_android_internal_os_Zygote.cpp
+++ b/core/jni/com_android_internal_os_Zygote.cpp
@@ -119,6 +119,7 @@
 
 static pid_t gSystemServerPid = 0;
 
+static constexpr const char* kVoldAppDataIsolation = "persist.sys.vold_app_data_isolation_enabled";
 static constexpr const char* kPropFuse = "persist.sys.fuse";
 static const char kZygoteClassName[] = "com/android/internal/os/Zygote";
 static jclass gZygoteClass;
@@ -831,6 +832,7 @@
              multiuser_get_uid(user_id, AID_EVERYBODY), fail_fn);
 
   bool isFuse = GetBoolProperty(kPropFuse, false);
+  bool isAppDataIsolationEnabled = GetBoolProperty(kVoldAppDataIsolation, false);
 
   if (isFuse) {
     if (mount_mode == MOUNT_EXTERNAL_PASS_THROUGH) {
@@ -840,6 +842,9 @@
     } else if (mount_mode == MOUNT_EXTERNAL_INSTALLER) {
       const std::string installer_source = StringPrintf("/mnt/installer/%d", user_id);
       BindMount(installer_source, "/storage", fail_fn);
+    } else if (isAppDataIsolationEnabled && mount_mode == MOUNT_EXTERNAL_ANDROID_WRITABLE) {
+      const std::string writable_source = StringPrintf("/mnt/androidwritable/%d", user_id);
+      BindMount(writable_source, "/storage", fail_fn);
     } else {
       BindMount(user_source, "/storage", fail_fn);
     }
@@ -1550,22 +1555,15 @@
 static void BindMountStorageToLowerFs(const userid_t user_id, const char* dir_name,
     const char* package, fail_fn_t fail_fn) {
 
-  bool hasPackage = (package != nullptr);
   bool hasSdcardFs = IsFilesystemSupported("sdcardfs");
   std::string source;
   if (hasSdcardFs) {
-    source = hasPackage ?
-        StringPrintf("/mnt/runtime/default/emulated/%d/%s/%s", user_id, dir_name, package) :
-        StringPrintf("/mnt/runtime/default/emulated/%d/%s", user_id, dir_name);
+    source = StringPrintf("/mnt/runtime/default/emulated/%d/%s/%s", user_id, dir_name, package);
   } else {
-    source = hasPackage ?
-        StringPrintf("/mnt/pass_through/%d/emulated/%d/%s/%s",
-            user_id, user_id, dir_name, package) :
-        StringPrintf("/mnt/pass_through/%d/emulated/%d/%s", user_id, user_id, dir_name);
+    source = StringPrintf("/mnt/pass_through/%d/emulated/%d/%s/%s",
+        user_id, user_id, dir_name, package);
   }
-  std::string target = hasPackage ?
-      StringPrintf("/storage/emulated/%d/%s/%s", user_id, dir_name, package) :
-      StringPrintf("/storage/emulated/%d/%s", user_id, dir_name);
+  std::string target = StringPrintf("/storage/emulated/%d/%s/%s", user_id, dir_name, package);
 
   if (access(source.c_str(), F_OK) != 0) {
     fail_fn(CREATE_ERROR("Error accessing %s: %s", source.c_str(), strerror(errno)));
@@ -1589,10 +1587,7 @@
   int size = (pkg_data_info_list != nullptr) ? env->GetArrayLength(pkg_data_info_list) : 0;
 
   if (size == 0) {
-    // App data isolation is not enabled for this process, so we bind mount to whole obb/ dir.
-    BindMountStorageToLowerFs(user_id, "Android/obb", /* package */ nullptr, fail_fn);
-    BindMountStorageToLowerFs(user_id, "Android/data", /* package */ nullptr, fail_fn);
-    return;
+    fail_fn(CREATE_ERROR("Data package list cannot be empty"));
   }
 
   // Bind mount each package obb directory
diff --git a/core/proto/Android.bp b/core/proto/Android.bp
index 6119d71..3b891d6 100644
--- a/core/proto/Android.bp
+++ b/core/proto/Android.bp
@@ -28,13 +28,3 @@
         "android/bluetooth/smp/enums.proto",
     ],
 }
-
-java_library_host {
-    name: "protolog-proto",
-    srcs: [
-        "android/server/protolog.proto"
-    ],
-    proto: {
-        type: "full",
-    },
-}
diff --git a/core/proto/android/app/appexitinfo.proto b/core/proto/android/app/appexitinfo.proto
index 4b9444e..cc3d367 100644
--- a/core/proto/android/app/appexitinfo.proto
+++ b/core/proto/android/app/appexitinfo.proto
@@ -41,7 +41,7 @@
     optional int64 pss = 11;
     optional int64 rss = 12;
     optional int64 timestamp = 13;
-    optional string description = 14;
+    optional string description = 14 [(.android.privacy).dest = DEST_EXPLICIT];
     optional bytes state = 15;
     optional string trace_file = 16;
 }
diff --git a/core/proto/android/app/settings_enums.proto b/core/proto/android/app/settings_enums.proto
index 3e007e4..997829e 100644
--- a/core/proto/android/app/settings_enums.proto
+++ b/core/proto/android/app/settings_enums.proto
@@ -2523,16 +2523,10 @@
     // OS: R
     PANEL_ADD_WIFI_NETWORKS = 1809;
 
-    // OPEN: Settings > Accessibility > Enable accessibility service > Show tutorial dialog
+    // OPEN: Settings > Accessibility > Enable the feature or shortcut > Show tutorial dialog
     // CATEGORY: SETTINGS
     // OS: R
-    DIALOG_TOGGLE_SCREEN_ACCESSIBILITY_BUTTON = 1810;
-
-    // OPEN: Settings > Accessibility > Enable accessibility service > Show tutorial dialog in
-    // gesture mode
-    // CATEGORY: SETTINGS
-    // OS: R
-    DIALOG_TOGGLE_SCREEN_GESTURE_NAVIGATION = 1811;
+    DIALOG_ACCESSIBILITY_TUTORIAL = 1810;
 
     // OPEN: Settings > Accessibility > Edit shortcut dialog
     // CATEGORY: SETTINGS
diff --git a/core/proto/android/app/tvsettings_enums.proto b/core/proto/android/app/tvsettings_enums.proto
index 6804d3f..30d365c 100644
--- a/core/proto/android/app/tvsettings_enums.proto
+++ b/core/proto/android/app/tvsettings_enums.proto
@@ -298,6 +298,12 @@
     // TvSettings > Apps > See all apps > [An app entry] > Permissions
     APPS_ALL_APPS_APP_ENTRY_PERMISSIONS = 0x1611A000;
 
+    // TvSettings > Apps > See all apps > [An app entry] > Enable
+    APPS_ALL_APPS_APP_ENTRY_ENABLE = 0x1611B000;
+
+    // TvSettings > Apps > See all apps > [An app entry] > Open source licenses
+    APPS_ALL_APPS_APP_ENTRY_LICENSES = 0x1611C000;
+
     // TvSettings > Apps > See all apps > Show system apps
     APPS_ALL_APPS_SHOW_SYSTEM_APPS = 0x16120000;
 
diff --git a/core/proto/android/content/locusid.proto b/core/proto/android/content/locusid.proto
index 4f0ce6b..e2ba78d 100644
--- a/core/proto/android/content/locusid.proto
+++ b/core/proto/android/content/locusid.proto
@@ -20,8 +20,10 @@
 
 option java_multiple_files = true;
 
+import "frameworks/base/core/proto/android/privacy.proto";
+
 // On disk representation of android.content.LocusId. Currently used by
 // com.android.server.people.ConversationInfoProto.
 message LocusIdProto {
-  optional string locus_id = 1;
+    optional string locus_id = 1 [(.android.privacy).dest = DEST_EXPLICIT];
 }
diff --git a/core/proto/android/nfc/aid_group.proto b/core/proto/android/nfc/aid_group.proto
index 0636519..8810ff7 100644
--- a/core/proto/android/nfc/aid_group.proto
+++ b/core/proto/android/nfc/aid_group.proto
@@ -23,7 +23,7 @@
 
 // Debugging information for android.nfc.cardemulation.AidGroup
 message AidGroupProto {
-    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_EXPLICIT;
 
     optional string category = 1;
     // A group of Application Identifiers. A hexadecimal string, with an even amount of hexadecimal
diff --git a/core/proto/android/nfc/apdu_service_info.proto b/core/proto/android/nfc/apdu_service_info.proto
index c726ea3..fd110c4 100644
--- a/core/proto/android/nfc/apdu_service_info.proto
+++ b/core/proto/android/nfc/apdu_service_info.proto
@@ -25,7 +25,7 @@
 
 // Debugging information for android.nfc.cardemulation.ApduServiceInfo
 message ApduServiceInfoProto {
-    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_EXPLICIT;
 
     optional .android.content.ComponentNameProto component_name = 1;
     optional string description = 2;
diff --git a/core/proto/android/nfc/card_emulation.proto b/core/proto/android/nfc/card_emulation.proto
index 474d14a..9c3c6d7 100644
--- a/core/proto/android/nfc/card_emulation.proto
+++ b/core/proto/android/nfc/card_emulation.proto
@@ -75,8 +75,8 @@
 message RegisteredAidCacheProto {
     option (.android.msg_privacy).dest = DEST_AUTOMATIC;
     message AidCacheEntry {
-        optional string key = 1;
-        optional string category = 2;
+        optional string key = 1 [(.android.privacy).dest = DEST_EXPLICIT];
+        optional string category = 2 [(.android.privacy).dest = DEST_EXPLICIT];
         optional .android.content.ComponentNameProto default_component = 3;
         repeated .android.nfc.cardemulation.ApduServiceInfoProto services = 4;
     }
@@ -91,7 +91,7 @@
     message Route {
         option (.android.msg_privacy).dest = DEST_AUTOMATIC;
         optional int32 id = 1;
-        repeated string aids = 2;
+        repeated string aids = 2 [(.android.privacy).dest = DEST_EXPLICIT];
     }
     optional int32 default_route = 1;
     repeated Route routes = 2;
@@ -108,7 +108,7 @@
 message SystemCodeRoutingManagerProto {
     option (.android.msg_privacy).dest = DEST_AUTOMATIC;
     message T3tIdentifier {
-        option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+        option (.android.msg_privacy).dest = DEST_EXPLICIT;
         optional string system_code = 1;
         optional string nfcid2 = 2;
     }
diff --git a/core/proto/android/nfc/ndef.proto b/core/proto/android/nfc/ndef.proto
index 52b3238..5e10084 100644
--- a/core/proto/android/nfc/ndef.proto
+++ b/core/proto/android/nfc/ndef.proto
@@ -31,7 +31,7 @@
 message NdefRecordProto {
     option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-    optional bytes type = 1;
-    optional bytes id = 2;
+    optional bytes type = 1 [(.android.privacy).dest = DEST_EXPLICIT];
+    optional bytes id = 2 [(.android.privacy).dest = DEST_EXPLICIT];
     optional int32 payload_bytes = 3;
 }
diff --git a/core/proto/android/nfc/nfc_fservice_info.proto b/core/proto/android/nfc/nfc_fservice_info.proto
index eecd7b0..0c4c72a 100644
--- a/core/proto/android/nfc/nfc_fservice_info.proto
+++ b/core/proto/android/nfc/nfc_fservice_info.proto
@@ -24,7 +24,7 @@
 
 // Debugging information for android.nfc.cardemulation.NfcFServiceInfo
 message NfcFServiceInfoProto {
-    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_EXPLICIT;
 
     optional .android.content.ComponentNameProto component_name = 1;
     // Description of the service
diff --git a/core/proto/android/nfc/nfc_service.proto b/core/proto/android/nfc/nfc_service.proto
index 73a7989..2df1d5d 100644
--- a/core/proto/android/nfc/nfc_service.proto
+++ b/core/proto/android/nfc/nfc_service.proto
@@ -104,7 +104,7 @@
     optional int32 send_flags = 5;
     optional bool send_enabled = 6;
     optional bool receive_enabled = 7;
-    optional string callback_ndef = 8;
+    optional string callback_ndef = 8 [(.android.privacy).dest = DEST_EXPLICIT];
     optional .android.nfc.NdefMessageProto message_to_send = 9;
     repeated string uris_to_send = 10 [(.android.privacy).dest = DEST_EXPLICIT];
 }
diff --git a/core/proto/android/providers/settings/secure.proto b/core/proto/android/providers/settings/secure.proto
index 075aa97..fe8a0f1 100644
--- a/core/proto/android/providers/settings/secure.proto
+++ b/core/proto/android/providers/settings/secure.proto
@@ -397,6 +397,13 @@
     }
     optional ParentalControl parental_control = 43;
 
+    message PowerMenuPrivacy {
+        option (android.msg_privacy).dest = DEST_EXPLICIT;
+
+        optional SettingProto show = 1 [ (android.privacy).dest = DEST_AUTOMATIC ];
+    }
+    optional PowerMenuPrivacy power_menu_privacy = 81;
+
     message PrintService {
         option (android.msg_privacy).dest = DEST_EXPLICIT;
 
@@ -588,5 +595,5 @@
 
     // Please insert fields in alphabetical order and group them into messages
     // if possible (to avoid reaching the method limit).
-    // Next tag = 80;
+    // Next tag = 82;
 }
diff --git a/core/proto/android/server/jobscheduler.proto b/core/proto/android/server/jobscheduler.proto
index bd1bae6..b678d62 100644
--- a/core/proto/android/server/jobscheduler.proto
+++ b/core/proto/android/server/jobscheduler.proto
@@ -523,6 +523,7 @@
                 optional bool is_idle = 1;
                 optional bool is_screen_on = 2;
                 optional bool is_dock_idle = 3;
+                optional bool in_car_mode = 4;
             }
 
             oneof active_tracker {
diff --git a/core/proto/android/server/notificationhistory.proto b/core/proto/android/server/notificationhistory.proto
index 15f4abb..9896ba5 100644
--- a/core/proto/android/server/notificationhistory.proto
+++ b/core/proto/android/server/notificationhistory.proto
@@ -19,6 +19,8 @@
 
 option java_multiple_files = true;
 
+import "frameworks/base/core/proto/android/privacy.proto";
+
 // On disk data store for historical notifications
 message NotificationHistoryProto {
   message StringPool {
@@ -33,7 +35,7 @@
     optional int32 package_index = 2;
 
     // The name of the NotificationChannel this notification was posted to
-    optional string channel_name = 3;
+    optional string channel_name = 3 [(.android.privacy).dest = DEST_EXPLICIT];
     // channel_name_index contains the index + 1 of the channel name in the string pool
     optional int32 channel_name_index = 4;
 
@@ -49,9 +51,9 @@
     // The time at which the notification was posted
     optional int64 posted_time_ms = 9;
     // The title of the notification
-    optional string title = 10;
+    optional string title = 10 [(.android.privacy).dest = DEST_EXPLICIT];
     // The text of the notification
-    optional string text = 11;
+    optional string text = 11 [(.android.privacy).dest = DEST_EXPLICIT];
     // The small icon of the notification
     optional Icon icon = 12;
 
diff --git a/core/proto/android/server/peopleservice.proto b/core/proto/android/server/peopleservice.proto
index e65a2ab..59556c4 100644
--- a/core/proto/android/server/peopleservice.proto
+++ b/core/proto/android/server/peopleservice.proto
@@ -21,6 +21,7 @@
 option java_multiple_files = true;
 
 import "frameworks/base/core/proto/android/content/locusid.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
 
 // On disk data of conversation infos for a user and app package.
 message ConversationInfosProto {
@@ -40,10 +41,10 @@
   optional .android.content.LocusIdProto locus_id_proto = 2;
 
   // The URI of the contact in the conversation.
-  optional string contact_uri = 3;
+  optional string contact_uri = 3 [(.android.privacy).dest = DEST_EXPLICIT];
 
   // The notification channel id of the conversation.
-  optional string notification_channel_id = 4;
+  optional string notification_channel_id = 4 [(.android.privacy).dest = DEST_EXPLICIT];
 
   // Integer representation of shortcut bit flags.
   optional int32 shortcut_flags = 5;
@@ -52,7 +53,7 @@
   optional int32 conversation_flags = 6;
 
   // The phone number of the contact.
-  optional string contact_phone_number = 7;
+  optional string contact_phone_number = 7 [(.android.privacy).dest = DEST_EXPLICIT];
 }
 
 // On disk data of events.
diff --git a/core/proto/android/server/protolog.proto b/core/proto/android/server/protolog.proto
index 3512c0a..34dc55b 100644
--- a/core/proto/android/server/protolog.proto
+++ b/core/proto/android/server/protolog.proto
@@ -20,8 +20,12 @@
 
 option java_multiple_files = true;
 
+import "frameworks/base/core/proto/android/privacy.proto";
+
 /* represents a single log entry */
 message ProtoLogMessage {
+    option (.android.msg_privacy).dest = DEST_LOCAL;
+
     /* log statement identifier, created from message string and log level. */
     optional sfixed32 message_hash = 1;
     /* log time, relative to the elapsed system time clock. */
@@ -40,6 +44,8 @@
    Encoded, it should start with 0x9 0x50 0x52 0x4f 0x54 0x4f 0x4c 0x4f 0x47 (.PROTOLOG), such
    that they can be easily identified. */
 message ProtoLogFileProto {
+    option (.android.msg_privacy).dest = DEST_LOCAL;
+
     /* constant; MAGIC_NUMBER = (long) MAGIC_NUMBER_H << 32 | MagicNumber.MAGIC_NUMBER_L
        (this is needed because enums have to be 32 bits and there's no nice way to put 64bit
         constants into .proto files. */
diff --git a/core/proto/android/server/syncstorageengine.proto b/core/proto/android/server/syncstorageengine.proto
index 87eb1b3..d313747 100644
--- a/core/proto/android/server/syncstorageengine.proto
+++ b/core/proto/android/server/syncstorageengine.proto
@@ -58,7 +58,7 @@
 
     message LastEventInfo {
       optional int64 last_event_time = 1; // time since epoch
-      optional string last_event = 2;
+      optional string last_event = 2 [(.android.privacy).dest = DEST_EXPLICIT];
     }
 
     // Note: version doesn't need to be stored in proto because of how protos store information but
@@ -68,7 +68,7 @@
     optional int32 last_success_source = 4;
     optional int64 last_failure_time = 5; // time since epoch
     optional int32 last_failure_source = 6;
-    optional string last_failure_message = 7;
+    optional string last_failure_message = 7 [(.android.privacy).dest = DEST_EXPLICIT];
     optional int64 initial_failure_time = 8; // time since epoch
     optional bool pending = 9;
     optional bool initialize = 10;
diff --git a/core/proto/android/server/usagestatsservice_v2.proto b/core/proto/android/server/usagestatsservice_v2.proto
index 24b0728..664c22d 100644
--- a/core/proto/android/server/usagestatsservice_v2.proto
+++ b/core/proto/android/server/usagestatsservice_v2.proto
@@ -112,13 +112,13 @@
   optional int32 flags = 4;
   optional int32 type = 5;
   optional .android.content.ConfigurationProto config = 6;
-  optional string shortcut_id = 7;
+  optional string shortcut_id = 7 [(.android.privacy).dest = DEST_EXPLICIT];
   optional int32 standby_bucket = 8;
-  optional string notification_channel_id = 9;
+  optional string notification_channel_id = 9 [(.android.privacy).dest = DEST_EXPLICIT];
   optional int32 instance_id = 10;
   optional string task_root_package = 11;
   optional string task_root_class = 12;
-  optional string locus_id = 13;
+  optional string locus_id = 13 [(.android.privacy).dest = DEST_EXPLICIT];
 }
 
 /**
@@ -128,7 +128,7 @@
   message PackagesMap {
     optional int32 package_token = 1;
     // The list of strings for each package where their indices are the token
-    repeated string strings = 2;
+    repeated string strings = 2 [(.android.privacy).dest = DEST_EXPLICIT];
   }
 
   optional int32 counter = 1;
diff --git a/core/proto/android/server/windowmanagerservice.proto b/core/proto/android/server/windowmanagerservice.proto
index 608925578..0f5616f 100644
--- a/core/proto/android/server/windowmanagerservice.proto
+++ b/core/proto/android/server/windowmanagerservice.proto
@@ -250,7 +250,7 @@
     reserved 3; // activity
     optional bool fills_parent = 4;
     optional .android.graphics.RectProto bounds = 5;
-    optional .android.graphics.RectProto displayed_bounds = 6;
+    optional .android.graphics.RectProto displayed_bounds = 6 [deprecated=true];
     optional bool defer_removal = 7;
     optional int32 surface_width = 8;
     optional int32 surface_height = 9;
@@ -310,7 +310,7 @@
     optional bool visible = 24;
     reserved 25; // configuration_container
     optional IdentifierProto identifier = 26;
-    optional string state = 27;
+    optional string state = 27 [(.android.privacy).dest = DEST_EXPLICIT];
     optional bool front_of_task = 28;
     optional int32 proc_id = 29;
     optional bool translucent = 30;
diff --git a/core/proto/android/service/procstats_enum.proto b/core/proto/android/service/procstats_enum.proto
index cc3fe5a..2abf373 100644
--- a/core/proto/android/service/procstats_enum.proto
+++ b/core/proto/android/service/procstats_enum.proto
@@ -76,3 +76,27 @@
     SERVICE_OPERATION_STATE_BOUND = 4;
     SERVICE_OPERATION_STATE_EXECUTING = 5;
 }
+
+// this enum list is from frameworks/base/core/java/com/android/internal/app/procstats/ProcessStats.java
+// and not frameworks/base/core/java/android/app/ActivityManager.java
+enum AggregatedProcessState {
+    AGGREGATED_PROCESS_STATE_UNKNOWN = 0;
+    // Persistent system process; PERSISTENT or PERSISTENT_UI in ActivityManager
+    AGGREGATED_PROCESS_STATE_PERSISTENT = 1;
+    // Top activity; actually any visible activity; TOP or TOP_SLEEPING in ActivityManager
+    AGGREGATED_PROCESS_STATE_TOP = 2;
+    // Bound top foreground process; BOUND_TOP or BOUND_FOREGROUND_SERVICE in ActivityManager
+    AGGREGATED_PROCESS_STATE_BOUND_TOP_OR_FGS = 3;
+    // Important foreground process; FOREGROUND_SERVICE in ActivityManager
+    AGGREGATED_PROCESS_STATE_FGS = 4;
+    // Important foreground process ; IMPORTANT_FOREGROUND in ActivityManager
+    AGGREGATED_PROCESS_STATE_IMPORTANT_FOREGROUND = 5;
+    // Various background processes; IMPORTANT_BACKGROUND, TRANSIENT_BACKGROUND, BACKUP, SERVICE,
+    // HEAVY_WEIGHT in ActivityManager
+    AGGREGATED_PROCESS_STATE_BACKGROUND = 6;
+    // Process running a receiver; RECEIVER in ActivityManager
+    AGGREGATED_PROCESS_STATE_RECEIVER = 7;
+    // Various cached processes; HOME, LAST_ACTIVITY, CACHED_ACTIVITY, CACHED_RECENT,
+    // CACHED_ACTIVITY_CLIENT, CACHED_EMPTY in ActivityManager
+    AGGREGATED_PROCESS_STATE_CACHED = 8;
+}
\ No newline at end of file
diff --git a/core/proto/android/service/sensor_service.proto b/core/proto/android/service/sensor_service.proto
index 48f6670..7f60534 100644
--- a/core/proto/android/service/sensor_service.proto
+++ b/core/proto/android/service/sensor_service.proto
@@ -166,7 +166,7 @@
     message RecentEventsLog {
         option (android.msg_privacy).dest = DEST_AUTOMATIC;
 
-        optional string name = 1;
+        optional string name = 1 [(.android.privacy).dest = DEST_EXPLICIT];
         optional int32 recent_events_count = 2;
         repeated Event events = 3;
     }
diff --git a/core/proto/android/stats/accessibility/accessibility_enums.proto b/core/proto/android/stats/accessibility/accessibility_enums.proto
new file mode 100644
index 0000000..5118ad5
--- /dev/null
+++ b/core/proto/android/stats/accessibility/accessibility_enums.proto
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+syntax = "proto2";
+package android.stats.accessibility;
+option java_multiple_files = true;
+
+// The entry point of the accessibility shortcut.
+enum ShortcutType {
+  UNKNOWN_TYPE = 0;
+  A11Y_BUTTON = 1;
+  VOLUME_KEY = 2;
+  TRIPLE_TAP = 3;
+  A11Y_BUTTON_LONG_PRESS = 4;
+}
+
+// The service status code.
+enum ServiceStatus {
+  UNKNOWN = 0;
+  ENABLED = 1;
+  DISABLED = 2;
+}
\ No newline at end of file
diff --git a/core/proto/android/stats/dnsresolver/dns_resolver.proto b/core/proto/android/stats/dnsresolver/dns_resolver.proto
index 61b9b25..b17d12c 100644
--- a/core/proto/android/stats/dnsresolver/dns_resolver.proto
+++ b/core/proto/android/stats/dnsresolver/dns_resolver.proto
@@ -211,7 +211,7 @@
 // 1. bionic/libc/kernel/uapi/asm-generic/errno-base.h
 // 2. bionic/libc/kernel/uapi/asm-generic/errno.h
 enum LinuxErrno {
-    SYS_UNKNOWN = 0;
+    SYS_NO_ERROR = 0;
     SYS_EPERM = 1;              // Not super-user
     SYS_ENOENT = 2;             // No such file or directory
     SYS_ESRCH = 3;              // No such process
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 32a79f3..ee25ac2 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -526,6 +526,7 @@
     <protected-broadcast android:name="com.android.settings.wifi.action.NETWORK_REQUEST" />
 
     <protected-broadcast android:name="NotificationManagerService.TIMEOUT" />
+    <protected-broadcast android:name="NotificationHistoryDatabase.CLEANUP" />
     <protected-broadcast android:name="ScheduleConditionProvider.EVALUATE" />
     <protected-broadcast android:name="EventConditionProvider.EVALUATE" />
     <protected-broadcast android:name="SnoozeHelper.EVALUATE" />
@@ -1110,12 +1111,13 @@
          grants your app this permission. If you don't need this permission, be sure your <a
          href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#target">{@code
          targetSdkVersion}</a> is 4 or higher.
-         <p>Protection level: normal
+         <p>Protection level: dangerous
     -->
     <permission android:name="android.permission.READ_PHONE_STATE"
+        android:permissionGroup="android.permission-group.UNDEFINED"
         android:label="@string/permlab_readPhoneState"
         android:description="@string/permdesc_readPhoneState"
-        android:protectionLevel="normal" />
+        android:protectionLevel="dangerous" />
 
     <!-- Allows read access to the device's phone number(s). This is a subset of the capabilities
          granted by {@link #READ_PHONE_STATE} but is exposed to instant applications.
@@ -5060,7 +5062,7 @@
                 <category android:name="android.intent.category.VOICE" />
             </intent-filter>
         </activity>
-        <activity android:name="com.android.internal.app.AccessibilityButtonChooserActivity"
+        <activity android:name="com.android.internal.accessibility.dialog.AccessibilityShortcutChooserActivity"
                   android:exported="false"
                   android:theme="@style/Theme.DeviceDefault.Dialog.Alert.DayNight"
                   android:finishOnCloseSystemDialogs="true"
diff --git a/core/res/res/drawable-hdpi/ic_user_secure.png b/core/res/res/drawable-hdpi/ic_user_secure.png
deleted file mode 100644
index 60dcf2a..0000000
--- a/core/res/res/drawable-hdpi/ic_user_secure.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_user_secure.png b/core/res/res/drawable-mdpi/ic_user_secure.png
deleted file mode 100644
index 0dea77a..0000000
--- a/core/res/res/drawable-mdpi/ic_user_secure.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_user_secure.png b/core/res/res/drawable-xhdpi/ic_user_secure.png
deleted file mode 100644
index a6ef51a..0000000
--- a/core/res/res/drawable-xhdpi/ic_user_secure.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_user_secure.png b/core/res/res/drawable-xxhdpi/ic_user_secure.png
deleted file mode 100644
index e6154e5..0000000
--- a/core/res/res/drawable-xxhdpi/ic_user_secure.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_user_secure.png b/core/res/res/drawable-xxxhdpi/ic_user_secure.png
deleted file mode 100644
index 9a3959b..0000000
--- a/core/res/res/drawable-xxxhdpi/ic_user_secure.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable/ic_user_secure.xml b/core/res/res/drawable/ic_user_secure.xml
new file mode 100644
index 0000000..9e6355c
--- /dev/null
+++ b/core/res/res/drawable/ic_user_secure.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+  <path
+      android:fillColor="#FF000000"
+      android:pathData="M18,8h-1L17,6c0,-2.76 -2.24,-5 -5,-5S7,3.24 7,6v2L6,8c-1.1,0 -2,0.9 -2,2v10c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2L20,10c0,-1.1 -0.9,-2 -2,-2zM9,6c0,-1.66 1.34,-3 3,-3s3,1.34 3,3v2L9,8L9,6zM18,20L6,20L6,10h12v10zM12,17c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2z"/>
+</vector>
diff --git a/core/res/res/layout/accessibility_button_chooser_item.xml b/core/res/res/layout/accessibility_button_chooser_item.xml
deleted file mode 100644
index b7dd892..0000000
--- a/core/res/res/layout/accessibility_button_chooser_item.xml
+++ /dev/null
@@ -1,60 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2017, 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.
-*/
--->
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:gravity="center"
-    android:padding="16dp">
-
-    <CheckBox
-        android:id="@+id/accessibility_button_target_checkbox"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:paddingStart="16dp"
-        android:background="@null"
-        android:clickable="false"
-        android:focusable="false"
-        android:visibility="gone"/>
-
-    <ImageView
-        android:id="@+id/accessibility_button_target_icon"
-        android:layout_width="48dp"
-        android:layout_height="48dp"
-        android:scaleType="fitCenter"/>
-
-    <TextView
-        android:id="@+id/accessibility_button_target_label"
-        android:layout_width="0dp"
-        android:layout_height="wrap_content"
-        android:layout_marginStart="16dp"
-        android:layout_weight="1"
-        android:textSize="20sp"
-        android:textColor="?attr/textColorPrimary"
-        android:fontFamily="sans-serif-medium"/>
-
-    <Switch
-        android:id="@+id/accessibility_button_target_switch_item"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:background="@null"
-        android:clickable="false"
-        android:focusable="false"/>
-</LinearLayout>
-
diff --git a/core/res/res/layout/accessibility_shortcut_chooser_item.xml b/core/res/res/layout/accessibility_shortcut_chooser_item.xml
new file mode 100644
index 0000000..fff22d9
--- /dev/null
+++ b/core/res/res/layout/accessibility_shortcut_chooser_item.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2017, 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.
+*/
+-->
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:gravity="center"
+    android:padding="16dp">
+
+    <CheckBox
+        android:id="@+id/accessibility_shortcut_target_checkbox"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:paddingStart="16dp"
+        android:background="@null"
+        android:clickable="false"
+        android:focusable="false"
+        android:visibility="gone"/>
+
+    <ImageView
+        android:id="@+id/accessibility_shortcut_target_icon"
+        android:layout_width="48dp"
+        android:layout_height="48dp"
+        android:scaleType="fitCenter"/>
+
+    <TextView
+        android:id="@+id/accessibility_shortcut_target_label"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="16dp"
+        android:layout_weight="1"
+        android:textSize="20sp"
+        android:textColor="?attr/textColorPrimary"
+        android:fontFamily="sans-serif-medium"/>
+
+    <Switch
+        android:id="@+id/accessibility_shortcut_target_switch_item"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:background="@null"
+        android:clickable="false"
+        android:focusable="false"/>
+</LinearLayout>
+
diff --git a/core/res/res/layout/notification_material_action_list.xml b/core/res/res/layout/notification_material_action_list.xml
index 4258019..ec54091 100644
--- a/core/res/res/layout/notification_material_action_list.xml
+++ b/core/res/res/layout/notification_material_action_list.xml
@@ -20,16 +20,34 @@
         android:layout_height="wrap_content"
         android:layout_marginTop="@dimen/notification_action_list_margin_top"
         android:layout_gravity="bottom">
-    <com.android.internal.widget.NotificationActionListLayout
-            android:id="@+id/actions"
+
+        <LinearLayout
             android:layout_width="match_parent"
-            android:layout_height="@dimen/notification_action_list_height"
-            android:paddingEnd="12dp"
+            android:layout_height="wrap_content"
             android:orientation="horizontal"
-            android:gravity="center_vertical"
-            android:visibility="gone"
-            android:background="@color/notification_action_list_background_color"
+            android:paddingEnd="12dp"
             >
-        <!-- actions will be added here -->
-    </com.android.internal.widget.NotificationActionListLayout>
+
+            <com.android.internal.widget.NotificationActionListLayout
+                android:id="@+id/actions"
+                android:layout_width="0dp"
+                android:layout_weight="1"
+                android:layout_height="@dimen/notification_action_list_height"
+                android:orientation="horizontal"
+                android:gravity="center_vertical"
+                android:visibility="gone"
+                android:background="@color/notification_action_list_background_color"
+                >
+                <!-- actions will be added here -->
+            </com.android.internal.widget.NotificationActionListLayout>
+
+            <ImageView
+                android:id="@+id/bubble_button"
+                android:layout_width="48dp"
+                android:layout_height="48dp"
+                android:layout_gravity="center_vertical|end"
+                android:visibility="gone"
+                android:scaleType="centerInside"
+                />
+    </LinearLayout>
 </FrameLayout>
diff --git a/core/res/res/layout/notification_template_header.xml b/core/res/res/layout/notification_template_header.xml
index 6f36aae..ece59e2 100644
--- a/core/res/res/layout/notification_template_header.xml
+++ b/core/res/res/layout/notification_template_header.xml
@@ -143,34 +143,35 @@
         android:layout_height="match_parent"
         android:layout_width="wrap_content"
         android:layout_marginStart="6dp"
-        android:orientation="horizontal" >
-        <ImageButton
+        android:background="?android:selectableItemBackgroundBorderless"
+        android:orientation="horizontal">
+        <ImageView
             android:id="@+id/camera"
             android:layout_width="?attr/notificationHeaderIconSize"
             android:layout_height="?attr/notificationHeaderIconSize"
             android:src="@drawable/ic_camera"
-            android:background="?android:selectableItemBackgroundBorderless"
             android:visibility="gone"
+            android:focusable="false"
             android:contentDescription="@string/notification_appops_camera_active"
             />
-        <ImageButton
+        <ImageView
             android:id="@+id/mic"
             android:layout_width="?attr/notificationHeaderIconSize"
             android:layout_height="?attr/notificationHeaderIconSize"
             android:src="@drawable/ic_mic"
-            android:background="?android:selectableItemBackgroundBorderless"
             android:layout_marginStart="4dp"
             android:visibility="gone"
+            android:focusable="false"
             android:contentDescription="@string/notification_appops_microphone_active"
             />
-        <ImageButton
+        <ImageView
             android:id="@+id/overlay"
             android:layout_width="?attr/notificationHeaderIconSize"
             android:layout_height="?attr/notificationHeaderIconSize"
             android:src="@drawable/ic_alert_window_layer"
-            android:background="?android:selectableItemBackgroundBorderless"
             android:layout_marginStart="4dp"
             android:visibility="gone"
+            android:focusable="false"
             android:contentDescription="@string/notification_appops_overlay_active"
             />
     </LinearLayout>
diff --git a/core/res/res/layout/notification_template_material_conversation.xml b/core/res/res/layout/notification_template_material_conversation.xml
index e986b18..8a57e05 100644
--- a/core/res/res/layout/notification_template_material_conversation.xml
+++ b/core/res/res/layout/notification_template_material_conversation.xml
@@ -195,35 +195,36 @@
                         android:layout_width="wrap_content"
                         android:paddingTop="3dp"
                         android:layout_marginStart="2dp"
+                        android:background="?android:selectableItemBackgroundBorderless"
                         android:orientation="horizontal" >
-                        <ImageButton
+                        <ImageView
                             android:layout_marginStart="4dp"
                             android:id="@+id/camera"
                             android:layout_width="?attr/notificationHeaderIconSize"
                             android:layout_height="?attr/notificationHeaderIconSize"
                             android:src="@drawable/ic_camera"
-                            android:background="?android:selectableItemBackgroundBorderless"
                             android:visibility="gone"
+                            android:focusable="false"
                             android:contentDescription="@string/notification_appops_camera_active"
                             />
-                        <ImageButton
+                        <ImageView
                             android:id="@+id/mic"
                             android:layout_width="?attr/notificationHeaderIconSize"
                             android:layout_height="?attr/notificationHeaderIconSize"
                             android:src="@drawable/ic_mic"
-                            android:background="?android:selectableItemBackgroundBorderless"
                             android:layout_marginStart="4dp"
                             android:visibility="gone"
+                            android:focusable="false"
                             android:contentDescription="@string/notification_appops_microphone_active"
                             />
-                        <ImageButton
+                        <ImageView
                             android:id="@+id/overlay"
                             android:layout_width="?attr/notificationHeaderIconSize"
                             android:layout_height="?attr/notificationHeaderIconSize"
                             android:src="@drawable/ic_alert_window_layer"
-                            android:background="?android:selectableItemBackgroundBorderless"
                             android:layout_marginStart="4dp"
                             android:visibility="gone"
+                            android:focusable="false"
                             android:contentDescription="@string/notification_appops_overlay_active"
                             />
                     </LinearLayout>
diff --git a/core/res/res/layout/resolver_empty_states.xml b/core/res/res/layout/resolver_empty_states.xml
index 5890bed..fe11769 100644
--- a/core/res/res/layout/resolver_empty_states.xml
+++ b/core/res/res/layout/resolver_empty_states.xml
@@ -24,6 +24,7 @@
     android:paddingStart="24dp"
     android:paddingEnd="24dp">
     <RelativeLayout
+        android:id="@+id/resolver_empty_state_container"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:paddingTop="48dp"
@@ -43,6 +44,7 @@
             android:fontFamily="@string/config_headlineFontFamilyMedium"
             android:textColor="@color/resolver_empty_state_text"
             android:textSize="14sp"
+            android:gravity="center_horizontal"
             android:layout_centerHorizontal="true" />
         <TextView
             android:id="@+id/resolver_empty_state_subtitle"
diff --git a/core/res/res/layout/resolver_list.xml b/core/res/res/layout/resolver_list.xml
index b754e0c..76ecefc 100644
--- a/core/res/res/layout/resolver_list.xml
+++ b/core/res/res/layout/resolver_list.xml
@@ -112,59 +112,61 @@
             </FrameLayout>
         </LinearLayout>
     </TabHost>
-
-    <View
-        android:layout_alwaysShow="true"
-        android:layout_width="match_parent"
-        android:layout_height="1dp"
-        android:background="?attr/colorBackgroundFloating"
-        android:foreground="?attr/dividerVertical" />
-
     <LinearLayout
-        android:id="@+id/button_bar"
-        android:visibility="gone"
-        style="?attr/buttonBarStyle"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:layout_ignoreOffset="true"
         android:layout_alwaysShow="true"
-        android:layout_hasNestedScrollIndicator="true"
-        android:gravity="end|center_vertical"
-        android:orientation="horizontal"
-        android:layoutDirection="locale"
-        android:measureWithLargestChild="true"
-        android:background="?attr/colorBackgroundFloating"
-        android:paddingTop="@dimen/resolver_button_bar_spacing"
-        android:paddingBottom="@dimen/resolver_button_bar_spacing"
-        android:paddingStart="@dimen/resolver_edge_margin"
-        android:paddingEnd="@dimen/resolver_small_margin"
-        android:elevation="@dimen/resolver_elevation">
-
-        <Button
-            android:id="@+id/button_once"
-            android:layout_width="wrap_content"
-            android:layout_gravity="start"
-            android:maxLines="2"
-            style="?attr/buttonBarButtonStyle"
-            android:fontFamily="@android:string/config_headlineFontFamilyMedium"
+        android:orientation="vertical"
+        android:background="?attr/colorBackgroundFloating">
+        <View
+            android:id="@+id/resolver_button_bar_divider"
+            android:layout_width="match_parent"
+            android:layout_height="1dp"
+            android:background="?attr/colorBackgroundFloating"
+            android:foreground="?attr/dividerVertical" />
+        <LinearLayout
+            android:id="@+id/button_bar"
+            android:visibility="gone"
+            style="?attr/buttonBarStyle"
+            android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:textAllCaps="false"
-            android:enabled="false"
-            android:text="@string/activity_resolver_use_once"
-            android:onClick="onButtonClick" />
+            android:layout_ignoreOffset="true"
+            android:layout_hasNestedScrollIndicator="true"
+            android:gravity="end|center_vertical"
+            android:orientation="horizontal"
+            android:layoutDirection="locale"
+            android:measureWithLargestChild="true"
+            android:paddingTop="@dimen/resolver_button_bar_spacing"
+            android:paddingBottom="@dimen/resolver_button_bar_spacing"
+            android:paddingStart="@dimen/resolver_edge_margin"
+            android:paddingEnd="@dimen/resolver_small_margin"
+            android:elevation="@dimen/resolver_elevation">
 
-        <Button
-            android:id="@+id/button_always"
-            android:layout_width="wrap_content"
-            android:layout_gravity="end"
-            android:maxLines="2"
-            style="?attr/buttonBarButtonStyle"
-            android:fontFamily="@android:string/config_headlineFontFamilyMedium"
-            android:textAllCaps="false"
-            android:layout_height="wrap_content"
-            android:enabled="false"
-            android:text="@string/activity_resolver_use_always"
-            android:onClick="onButtonClick" />
+            <Button
+                android:id="@+id/button_once"
+                android:layout_width="wrap_content"
+                android:layout_gravity="start"
+                android:maxLines="2"
+                style="?attr/buttonBarButtonStyle"
+                android:fontFamily="@android:string/config_headlineFontFamilyMedium"
+                android:layout_height="wrap_content"
+                android:textAllCaps="false"
+                android:enabled="false"
+                android:text="@string/activity_resolver_use_once"
+                android:onClick="onButtonClick" />
+
+            <Button
+                android:id="@+id/button_always"
+                android:layout_width="wrap_content"
+                android:layout_gravity="end"
+                android:maxLines="2"
+                style="?attr/buttonBarButtonStyle"
+                android:fontFamily="@android:string/config_headlineFontFamilyMedium"
+                android:textAllCaps="false"
+                android:layout_height="wrap_content"
+                android:enabled="false"
+                android:text="@string/activity_resolver_use_always"
+                android:onClick="onButtonClick" />
+        </LinearLayout>
     </LinearLayout>
-
 </com.android.internal.widget.ResolverDrawerLayout>
diff --git a/core/res/res/layout/resolver_list_with_default.xml b/core/res/res/layout/resolver_list_with_default.xml
index 06a7633..4a5aa02 100644
--- a/core/res/res/layout/resolver_list_with_default.xml
+++ b/core/res/res/layout/resolver_list_with_default.xml
@@ -21,7 +21,7 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:maxWidth="@dimen/resolver_max_width"
-    android:maxCollapsedHeight="144dp"
+    android:maxCollapsedHeight="@dimen/resolver_max_collapsed_height_with_default"
     android:id="@id/contentPanel">
 
     <LinearLayout
diff --git a/core/res/res/layout/system_user_home.xml b/core/res/res/layout/system_user_home.xml
new file mode 100644
index 0000000..8afa423
--- /dev/null
+++ b/core/res/res/layout/system_user_home.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2020 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License
+  -->
+<FrameLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="#80000000"
+    android:forceHasOverlappingRendering="false">
+    <LinearLayout
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:orientation="vertical"
+        android:layout_gravity="center"
+        android:layout_marginStart="16dp"
+        android:layout_marginEnd="16dp">
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:textSize="20sp"
+            android:textColor="?android:attr/textColorPrimary"
+            android:text="Framework Fallback Home"/>
+        <ProgressBar
+            style="@android:style/Widget.Material.ProgressBar.Horizontal"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="12.75dp"
+            android:colorControlActivated="?android:attr/textColorPrimary"
+            android:indeterminate="true"/>
+    </LinearLayout>
+</FrameLayout>
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index 8facd8a..9d152aa 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -1457,6 +1457,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"Versoek deur <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"Ja"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"Nee"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"By noodligging ingegaan"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"Jou toestelvervaardiger het tydens \'n onlangse noodsessie toegang tot jou ligging gekry"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"Jou diensverskaffer het tydens \'n onlangse noodsessie toegang tot jou ligging gekry"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"Uitveeperk is oorskry"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"Daar is <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> uitgeveede items vir <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>, rekening <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>. Wat wil jy doen?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"Vee die items uit"</string>
@@ -1789,8 +1792,8 @@
     <string name="package_updated_device_owner" msgid="7560272363805506941">"Opgedateer deur jou administrateur"</string>
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"Uitgevee deur jou administrateur"</string>
     <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
-    <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"Batterybespaarder doen die volgende om die batterylewe te verleng:\n·Skakel Donker-tema aan\n·Skakel agtergrondaktiwiteit, sommige visuele effekte en ander kenmerke, soos \"Hey Google\", af of beperk hulle\n\n"<annotation id="url">"Kom meer te wete"</annotation></string>
-    <string name="battery_saver_description" msgid="7618492104632328184">"Batterybespaarder doen die volgende om die batterylewe te verleng:\n·Skakel Donker-tema aan\n·Skakel agtergrondaktiwiteit, sommige visuele effekte en ander kenmerke, soos \"Hey Google\", af of beperk hulle"</string>
+    <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"Batterybespaarder doen die volgende om die batterylewe te verleng:\n·Skakel Donkertema aan\n·Skakel agtergrondaktiwiteit, sommige visuele effekte en ander kenmerke, soos \"Hey Google\", af of beperk hulle\n\n"<annotation id="url">"Kom meer te wete"</annotation></string>
+    <string name="battery_saver_description" msgid="7618492104632328184">"Batterybespaarder doen die volgende om die batterylewe te verleng:\n·Skakel Donkertema aan\n·Skakel agtergrondaktiwiteit, sommige visuele effekte en ander kenmerke, soos \"Hey Google\", af of beperk hulle"</string>
     <string name="data_saver_description" msgid="4995164271550590517">"Databespaarder verhoed sommige programme om data in die agtergrond te stuur of te aanvaar om datagebruik te help verminder. \'n Program wat jy tans gebruik kan by data ingaan, maar sal dit dalk minder gereeld doen. Dit kan byvoorbeeld beteken dat prente nie wys totdat jy op hulle tik nie."</string>
     <string name="data_saver_enable_title" msgid="7080620065745260137">"Skakel Databespaarder aan?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Skakel aan"</string>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index cafa7e8..af6e15f 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -1457,6 +1457,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">" በ፡<xliff:g id="NAME">%1$s</xliff:g>(<xliff:g id="SERVICE">%2$s</xliff:g>) ተጠየቀ"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"አዎ"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"አይ"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"የድንገተኛ ጊዜ አካባቢ ተደርሶበታል"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"የእርስዎ መሣሪያ አምራች በቅርቡ በነበረ የድንገተኛ አደጋ ክፍለ-ጊዜ ላይ አካባቢዎን ደርሷል"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"የእርስዎ አገልግሎት አቅራቢ በቅርቡ በነበረ የድንገተኛ አደጋ ክፍለ-ጊዜ ላይ አካባቢዎን ደርሷል"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"የሰርዝ ወሰን ከመጠን አልፏል"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"<xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> የተሰረዙ ንጥሎች ለ<xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>፣ <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> መለያ አሉ። ምን ማድረግ ትፈልጋለህ?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"ንጥሎቹን ሰርዝ"</string>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index 1ed36a8..7a2639d 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -815,9 +815,9 @@
     <string name="relationTypeFriend" msgid="3192092625893980574">"صديق"</string>
     <string name="relationTypeManager" msgid="2272860813153171857">"مدير"</string>
     <string name="relationTypeMother" msgid="2331762740982699460">"أم"</string>
-    <string name="relationTypeParent" msgid="4177920938333039882">"الوالدان"</string>
+    <string name="relationTypeParent" msgid="4177920938333039882">"ولي أمر"</string>
     <string name="relationTypePartner" msgid="4018017075116766194">"شريك"</string>
-    <string name="relationTypeReferredBy" msgid="5285082289602849400">"جهة الإحالة"</string>
+    <string name="relationTypeReferredBy" msgid="5285082289602849400">"جهة إحالة"</string>
     <string name="relationTypeRelative" msgid="3396498519818009134">"قريب"</string>
     <string name="relationTypeSister" msgid="3721676005094140671">"أخت"</string>
     <string name="relationTypeSpouse" msgid="6916682664436031703">"زوج/زوجة"</string>
@@ -1541,6 +1541,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"مطلوب من <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"نعم"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"لا"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"تم الوصول إلى الموقع الجغرافي أثناء حالة طوارئ"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"وصلت الشركة المصنِّعة إلى موقعك الجغرافي أثناء جلسة الطوارئ الأخيرة."</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"وصل مشغّل شبكة الجوّال إلى موقعك الجغرافي أثناء جلسة الطوارئ الأخيرة."</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"تم تجاوز حد الحذف."</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"هناك <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> من العناصر المحذوفة لـ <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>، في حساب <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>. ماذا تريد أن تفعل؟"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"حذف العناصر"</string>
@@ -1733,7 +1736,7 @@
     <string name="done_accessibility_shortcut_menu_button" msgid="3668407723770815708">"تم"</string>
     <string name="disable_accessibility_shortcut" msgid="5806091378745232383">"إيقاف الاختصار"</string>
     <string name="leave_accessibility_shortcut_on" msgid="6543362062336990814">"استخدام الاختصار"</string>
-    <string name="color_inversion_feature_name" msgid="326050048927789012">"عكس الألوان"</string>
+    <string name="color_inversion_feature_name" msgid="326050048927789012">"قلب الألوان"</string>
     <string name="color_correction_feature_name" msgid="3655077237805422597">"تصحيح الألوان"</string>
     <string name="accessibility_shortcut_enabling_service" msgid="5473495203759847687">"تم الضغط مع الاستمرار على مفتاحَي التحكّم في مستوى الصوت. تم تفعيل <xliff:g id="SERVICE_NAME">%1$s</xliff:g>."</string>
     <string name="accessibility_shortcut_disabling_service" msgid="8675244165062700619">"تم الضغط مع الاستمرار على مفتاحَي التحكّم في مستوى الصوت. تم إيقاف <xliff:g id="SERVICE_NAME">%1$s</xliff:g>."</string>
@@ -1881,9 +1884,9 @@
     <string name="package_updated_device_owner" msgid="7560272363805506941">"تم التحديث بواسطة المشرف"</string>
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"تم الحذف بواسطة المشرف"</string>
     <string name="confirm_battery_saver" msgid="5247976246208245754">"حسنًا"</string>
-    <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"‏لإطالة عمر البطارية، \"توفير شحن البطارية\":\n·تفعيل \"التصميم الداكن\"\n إيقاف النشاط في الخلفية أو تقييده وأيضًا بعض التأثيرات المرئية والميزات الأخرى، مثلاً \"Ok Google\"\n\n"<annotation id="url">"مزيد من المعلومات"</annotation></string>
-    <string name="battery_saver_description" msgid="7618492104632328184">"‏لإطالة عمر البطارية، \"توفير شحن البطارية\":\n·تفعيل \"التصميم الداكن\"\n إيقاف النشاط في الخلفية أو تقييده وأيضًا بعض التأثيرات المرئية والميزات الأخرى، مثلاً \"Ok Google\"."</string>
-    <string name="data_saver_description" msgid="4995164271550590517">"للمساعدة في خفض استخدام البيانات، تمنع ميزة \"توفير البيانات\" بعض التطبيقات من إرسال البيانات وتلقّيها في الخلفية. يمكن للتطبيق الذي تستخدمه الآن الوصول إلى البيانات، ولكن لا يمكنه تنفيذ ذلك كثيرًا. وهذا يعني أن الصور مثلاً لا تظهر حتى تنقر عليها."</string>
+    <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"‏لإطالة عمر البطارية، \"توفير شحن البطارية\":\n·تفعيل \"المظهر الداكن\"\n إيقاف النشاط في الخلفية وأيضًا بعض التأثيرات المرئية والميزات الأخرى، مثلاً \"Ok Google\" أو فرض قيود عليها\n\n"<annotation id="url">"مزيد من المعلومات"</annotation></string>
+    <string name="battery_saver_description" msgid="7618492104632328184">"‏لإطالة عمر البطارية، \"توفير شحن البطارية\":\n·تفعيل \"المظهر الداكن\"\n إيقاف النشاط في الخلفية وأيضًا بعض التأثيرات المرئية والميزات الأخرى، مثلاً \"Ok Google\" أو فرض قيود عليها."</string>
+    <string name="data_saver_description" msgid="4995164271550590517">"للمساعدة في خفض استخدام البيانات، تمنع ميزة \"توفير البيانات\" بعض التطبيقات من إرسال البيانات وتلقّيها في الخلفية. يمكن للتطبيقات المتاحة لديك الآن استخدام البيانات، ولكن لا يمكنها الإكثار من ذلك. وهذا يعني أن الصور مثلاً لا تظهر حتى تنقر عليها."</string>
     <string name="data_saver_enable_title" msgid="7080620065745260137">"هل تريد تفعيل توفير البيانات؟"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"تفعيل"</string>
     <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
@@ -1987,12 +1990,12 @@
     <string name="close_button_text" msgid="10603510034455258">"إغلاق"</string>
     <string name="notification_messaging_title_template" msgid="772857526770251989">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
     <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
-      <item quantity="zero">تم تحديد <xliff:g id="COUNT_1">%1$d</xliff:g> من العناصر</item>
-      <item quantity="two">تم تحديد عنصرين (<xliff:g id="COUNT_1">%1$d</xliff:g>)</item>
-      <item quantity="few">تم تحديد <xliff:g id="COUNT_1">%1$d</xliff:g> عناصر</item>
-      <item quantity="many">تم تحديد <xliff:g id="COUNT_1">%1$d</xliff:g> عنصرًا</item>
-      <item quantity="other">تم تحديد <xliff:g id="COUNT_1">%1$d</xliff:g> من العناصر</item>
-      <item quantity="one">تم تحديد عنصر واحد (<xliff:g id="COUNT_0">%1$d</xliff:g>)</item>
+      <item quantity="zero">تم اختيار <xliff:g id="COUNT_1">%1$d</xliff:g> عنصر</item>
+      <item quantity="two">تم اختيار عنصرين (<xliff:g id="COUNT_1">%1$d</xliff:g>)</item>
+      <item quantity="few">تم اختيار <xliff:g id="COUNT_1">%1$d</xliff:g> عناصر</item>
+      <item quantity="many">تم اختيار <xliff:g id="COUNT_1">%1$d</xliff:g> عنصرًا</item>
+      <item quantity="other">تم اختيار <xliff:g id="COUNT_1">%1$d</xliff:g> عنصر</item>
+      <item quantity="one">تم اختيار عنصر واحد (<xliff:g id="COUNT_0">%1$d</xliff:g>)</item>
     </plurals>
     <string name="default_notification_channel_label" msgid="3697928973567217330">"غير مصنفة"</string>
     <string name="importance_from_user" msgid="2782756722448800447">"لقد عيَّنت أهمية هذه الإشعارات."</string>
diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml
index dae9867..4b38c9b 100644
--- a/core/res/res/values-as/strings.xml
+++ b/core/res/res/values-as/strings.xml
@@ -1457,6 +1457,12 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"<xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)এ অনুৰোধ কৰিছে"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"হয়"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"নহয়"</string>
+    <!-- no translation found for gnss_nfw_notification_title (5004493772059563423) -->
+    <skip />
+    <!-- no translation found for gnss_nfw_notification_message_oem (3683958907027107969) -->
+    <skip />
+    <!-- no translation found for gnss_nfw_notification_message_carrier (815888995791562151) -->
+    <skip />
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"মচি পেলোৱাৰ সীমা পাৰ হ’ল"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"এই <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> ৰ মচি থোৱা <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> টা <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g> বস্তু আছে। আপুনি কি কৰিব বিচাৰে?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"বস্তুবোৰ মচক"</string>
diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml
index 462ca3a..c998ff0 100644
--- a/core/res/res/values-az/strings.xml
+++ b/core/res/res/values-az/strings.xml
@@ -1457,6 +1457,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"<xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>) tərəfindən tələb edilib"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"Bəli"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"Xeyr"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"Fövqəladə sessiyada məkana giriş edilib"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"Son fövqəladə sessiya zamanı cihaz istehsalçısı məkanınıza giriş edib"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"Son fövqəladə sessiya zamanı operator məkanınıza giriş edib"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"Limiti keçəni silin"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"<xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g> üçün <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> silinmiş fayl var, <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> hesabı. Nə etmək istəyirsiniz?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"Elementləri sil"</string>
@@ -1791,7 +1794,7 @@
     <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
     <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"Batareyanın ömrünü artırmaq üçün Enerjiyə Qənaət xüsusiyyəti:\n·Qaranlıq temanı aktiv edir\n·Arxa fondakı fəaliyyəti, bəzi vizual effektləri və “Hey Google” kimi digər xüsusiyyətləri deaktiv edir və ya məhdudlaşdırır\n\n"<annotation id="url">"Ətraflı məlumat"</annotation></string>
     <string name="battery_saver_description" msgid="7618492104632328184">"Batareyanın ömrünü artırmaq üçün Enerjiyə Qənaət xüsusiyyəti:\n·Qaranlıq temanı aktiv edir\n·Arxa fondakı fəaliyyəti, bəzi vizual effektləri və “Hey Google” kimi digər xüsusiyyətləri deaktiv edir və ya məhdudlaşdırır"</string>
-    <string name="data_saver_description" msgid="4995164271550590517">"Data istifadəsini azalatmaq üçün, Data Qanaəti bəzi tətbiqlərin arxafonda data göndərməsini və qəbulunun qarşısını alır. Hazırda istifadə etdiyiniz tətbiq dataya daxil ola bilər, lakin bunu tez-tez edə bilməz. Bu o deməkdir ki, məsələn, Siz üzərinə tıklamadıqca o şəkillər göstərilməyəcək."</string>
+    <string name="data_saver_description" msgid="4995164271550590517">"Data istifadəsini azalatmaq üçün, Data Qanaəti bəzi tətbiqlərin arxafonda data göndərməsinin və qəbulunun qarşısını alır. Hazırda işlətdiyiniz tətbiq dataya daxil ola bilər, ancaq bunu tez-tez edə bilməz. Bu o deməkdir ki, məsələn, Siz üzərinə tıklamadıqca o şəkillər göstərilməyəcək."</string>
     <string name="data_saver_enable_title" msgid="7080620065745260137">"Data Qənaəti aktiv edilsin?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Aktivləşdirin"</string>
     <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
@@ -1901,7 +1904,7 @@
     <string name="pin_specific_target" msgid="7824671240625957415">"İşarələyin: <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="unpin_target" msgid="3963318576590204447">"Çıxarın"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"İşarələməyin: <xliff:g id="LABEL">%1$s</xliff:g>"</string>
-    <string name="app_info" msgid="6113278084877079851">"Tətbiq məlumatı"</string>
+    <string name="app_info" msgid="6113278084877079851">"Tətbiq infosu"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"Demo başlayır…"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"Cihaz sıfırlanır…"</string>
diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml
index 8454589..1bb162d 100644
--- a/core/res/res/values-b+sr+Latn/strings.xml
+++ b/core/res/res/values-b+sr+Latn/strings.xml
@@ -1478,6 +1478,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"Zahteva <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"Da"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"Ne"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"Pristupljeno lokaciji za hitne slučajeve"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"Proizvođač uređaja je pristupio vašoj lokaciji tokom nedavne hitne sesije"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"Mobilni operater je pristupio vašoj lokaciji tokom nedavne hitne sesije"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"Premašeno je ograničenje za brisanje"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"Postoje izbrisane stavke (<xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g>) za <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>, nalog <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>. Šta želite da uradite?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"Izbriši stavke"</string>
@@ -1815,7 +1818,7 @@
     <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"Radi dužeg trajanja baterije, ušteda baterije:\n·uključuje tamnu temu\n·isključuje ili ograničava aktivnosti u pozadini, neke vizuelne efekte i druge funkcije, na primer, „Ok Google“\n\n"<annotation id="url">"Saznajte više"</annotation></string>
     <string name="battery_saver_description" msgid="7618492104632328184">"Radi dužeg trajanja baterije, ušteda baterije:\n·uključuje tamnu temu\n·isključuje ili ograničava aktivnosti u pozadini, neke vizuelne efekte i druge funkcije, na primer, „Ok Google“"</string>
     <string name="data_saver_description" msgid="4995164271550590517">"Da bi se smanjila potrošnja podataka, Ušteda podataka sprečava neke aplikacije da šalju ili primaju podatke u pozadini. Aplikacija koju trenutno koristite može da pristupa podacima, ali će to činiti ređe. Na primer, slike se neće prikazivati dok ih ne dodirnete."</string>
-    <string name="data_saver_enable_title" msgid="7080620065745260137">"Uključiti Uštedu podataka?"</string>
+    <string name="data_saver_enable_title" msgid="7080620065745260137">"Želite da uključite Uštedu podataka?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Uključi"</string>
     <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
       <item quantity="one">%1$d minut (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml
index 9d3ca53..eb2f01b 100644
--- a/core/res/res/values-be/strings.xml
+++ b/core/res/res/values-be/strings.xml
@@ -20,9 +20,9 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="byteShort" msgid="202579285008794431">"б"</string>
+    <string name="byteShort" msgid="202579285008794431">"Б"</string>
     <string name="kilobyteShort" msgid="2214285521564195803">"КБ"</string>
-    <string name="megabyteShort" msgid="6649361267635823443">"Мб"</string>
+    <string name="megabyteShort" msgid="6649361267635823443">"МБ"</string>
     <string name="gigabyteShort" msgid="7515809460261287991">"ГБ"</string>
     <string name="terabyteShort" msgid="1822367128583886496">"Тб"</string>
     <string name="petabyteShort" msgid="5651571254228534832">"Пб"</string>
@@ -1499,6 +1499,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"Запыт ад карыстальнiка <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"Так"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"Не"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"Атрыманы экстранны доступ да геаданых"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"Вытворца вашай прылады атрымаў доступ да даных пра ваша месцазнаходжанне падчас нядаўняга сеанса экстраннага абагульвання"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"Ваш аператар атрымаў доступ да даных пра ваша месцазнаходжанне падчас нядаўняга сеанса экстраннага абагульвання"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"Выдаліць перавышаны ліміт"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"Выдалена элементаў для тыпу сінхранiзацыi \"<xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>\": <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g>. Уліковы запіс <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>. Што вы жадаеце зрабіць?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"Выдаліць элементы."</string>
@@ -1603,7 +1606,7 @@
     <string name="media_route_chooser_title_for_remote_display" msgid="3105906508794326446">"Трансліраваць экран на прыладу"</string>
     <string name="media_route_chooser_searching" msgid="6119673534251329535">"Пошук прылад..."</string>
     <string name="media_route_chooser_extended_settings" msgid="2506352159381327741">"Налады"</string>
-    <string name="media_route_controller_disconnect" msgid="7362617572732576959">"Адлучыць"</string>
+    <string name="media_route_controller_disconnect" msgid="7362617572732576959">"Адключыць"</string>
     <string name="media_route_status_scanning" msgid="8045156315309594482">"Сканiраванне..."</string>
     <string name="media_route_status_connecting" msgid="5845597961412010540">"Падключэнне..."</string>
     <string name="media_route_status_available" msgid="1477537663492007608">"Даступна"</string>
@@ -1837,7 +1840,7 @@
     <string name="confirm_battery_saver" msgid="5247976246208245754">"ОК"</string>
     <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"Каб павялічыць тэрмін службы акумулятара, рэжым эканоміі зараду:\n·уключае цёмную тэму;\n·выключае ці абмяжоўвае дзеянні ў фонавым рэжыме, некаторыя візуальныя эфекты і іншыя функцыі, напрыклад \"Ok Google\"\n\n"<annotation id="url">"Даведацца больш"</annotation></string>
     <string name="battery_saver_description" msgid="7618492104632328184">"Каб павялічыць тэрмін службы акумулятара, рэжым эканоміі зараду:\n·уключае цёмную тэму;\n·выключае ці абмяжоўвае дзеянні ў фонавым рэжыме, некаторыя візуальныя эфекты і іншыя функцыі, напрыклад \"Ok Google\""</string>
-    <string name="data_saver_description" msgid="4995164271550590517">"У рэжыме Эканомія трафіка фонавая перадача для некаторых праграмам адключана. Праграма, якую вы зараз выкарыстоўваеце, можа атрымліваць доступ да даных, але радзей, чым звычайна. Напрыклад, відарысы могуць не загружацца, пакуль вы не націсніце на іх."</string>
+    <string name="data_saver_description" msgid="4995164271550590517">"У рэжыме \"Эканомія трафіка\" фонавая перадача для некаторых праграмам адключана. Праграма, якую вы зараз выкарыстоўваеце, можа атрымліваць доступ да даных, але радзей, чым звычайна. Напрыклад, відарысы могуць не загружацца, пакуль вы не націсніце на іх."</string>
     <string name="data_saver_enable_title" msgid="7080620065745260137">"Уключыць Эканомію трафіка?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Уключыць"</string>
     <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index ff0838d..9e73d42 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -1457,6 +1457,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"Заявено от <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"Да"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"Не"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"Осъщ. е достъп до местоп. при спешен случай"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"Производителят на устройството ви осъществи достъп до местоположението ви по време на скорошна сесия за спешен случай"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"Операторът ви осъществи достъп до местоположението ви по време на скорошна сесия за спешен случай"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"Лимитът за изтриване бе надхвърлен"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"Има <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> изтрити елемента за <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>, профил <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>. Какво искате да направите?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"Изтриване на елементите"</string>
@@ -1789,10 +1792,10 @@
     <string name="package_updated_device_owner" msgid="7560272363805506941">"Актуализирано от администратора ви"</string>
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"Изтрито от администратора ви"</string>
     <string name="confirm_battery_saver" msgid="5247976246208245754">"ОК"</string>
-    <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"С цел удължаване на живота на батерията режимът за запазването й:\n·включва тъмната тема;\n·изключва или ограничава активността на заден план, някои визуални ефекти и други функции, като например „Ok Google“.\n\n"<annotation id="url">"Научете повече"</annotation></string>
-    <string name="battery_saver_description" msgid="7618492104632328184">"С цел удължаване на живота на батерията режимът за запазването й:\n·включва тъмната тема;\n·изключва или ограничава активността на заден план, някои визуални ефекти и други функции, като например „Ok Google“."</string>
+    <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"С цел удължаване на живота на батерията режимът за запазването ѝ:\n·включва тъмната тема;\n·изключва или ограничава активността на заден план, някои визуални ефекти и други функции, като например „Ok Google“.\n\n"<annotation id="url">"Научете повече"</annotation></string>
+    <string name="battery_saver_description" msgid="7618492104632328184">"С цел удължаване на живота на батерията режимът за запазването ѝ:\n·включва тъмната тема;\n·изключва или ограничава активността на заден план, някои визуални ефекти и други функции, като например „Ok Google“."</string>
     <string name="data_saver_description" msgid="4995164271550590517">"С цел намаляване на преноса на данни функцията за икономия на данни не позволява на някои приложения да изпращат или получават данни на заден план. Понастоящем използвано от вас приложение може да използва данни, но по-рядко. Това например може да означава, че изображенията не се показват, докато не ги докоснете."</string>
-    <string name="data_saver_enable_title" msgid="7080620065745260137">"Ще вкл. ли Икономия на данни?"</string>
+    <string name="data_saver_enable_title" msgid="7080620065745260137">"Ще вкл. ли „Икономия на данни“?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Включване"</string>
     <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
       <item quantity="other">За %1$d минути (до <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml
index 4090e21..3ed3341 100644
--- a/core/res/res/values-bn/strings.xml
+++ b/core/res/res/values-bn/strings.xml
@@ -1457,6 +1457,12 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"<xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>) এর দ্বারা অনুরোধকৃত"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"হ্যাঁ"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"না"</string>
+    <!-- no translation found for gnss_nfw_notification_title (5004493772059563423) -->
+    <skip />
+    <!-- no translation found for gnss_nfw_notification_message_oem (3683958907027107969) -->
+    <skip />
+    <!-- no translation found for gnss_nfw_notification_message_carrier (815888995791562151) -->
+    <skip />
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"মুছে ফেলার সীমা ছাড়িয়ে গেছে"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"<xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> অ্যাকাউন্টে <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g> এর জন্য <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g>টি মুছে ফেলা আইটেম রয়েছে৷ আপনি এগুলিকে নিয়ে কি করতে চান?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"আইটেমগুলি মুছুন"</string>
@@ -1790,7 +1796,7 @@
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"আপনার প্রশাসক মুছে দিয়েছেন"</string>
     <string name="confirm_battery_saver" msgid="5247976246208245754">"ঠিক আছে"</string>
     <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"ব্যাটারি আরও বেশিক্ষণ চালাতে, ব্যাটারি সেভার:\n·গাঢ় থিম চালু করে\n·ব্যাকগ্রাউন্ড অ্যাক্টিভিটি, কিছু ভিজ্যুয়াল এফেক্ট, এবং “হ্যালো Google”-এর মতো অন্যান্য ফিচার বন্ধ বা সীমাবদ্ধ করে\n\n"<annotation id="url">"আরও জানুন"</annotation></string>
-    <string name="battery_saver_description" msgid="7618492104632328184">"ব্যাটারি আরও বেশিক্ষণ চালাতে, ব্যাটারি সেভার:\n·গাঢ় থিম চালু করে\n·ব্যাকগ্রাউন্ড অ্যাক্টিভিটি, কিছু ভিজ্যুয়াল এফেক্ট, এবং “হ্যালো Google”-এর মতো অন্যান্য ফিচার বন্ধ বা সীমাবদ্ধ করে"</string>
+    <string name="battery_saver_description" msgid="7618492104632328184">"ব্যাটারি আরও বেশিক্ষণ চালাতে, ব্যাটারি সেভার:\n·গাঢ় থিম চালু করে\n·ব্যাকগ্রাউন্ড অ্যাক্টিভিটি, কিছু ভিজ্যুয়াল এফেক্ট এবং “হ্যালো Google”-এর মতো অন্যান্য ফিচার বন্ধ বা সীমাবদ্ধ করে"</string>
     <string name="data_saver_description" msgid="4995164271550590517">"ডেটার ব্যবহার কমাতে সহায়তা করার জন্য, ডেটা সেভার ব্যাকগ্রাউন্ডে কিছু অ্যাপ্লিকেশনকে ডেটা পাঠাতে বা গ্রহণ করতে বাধা দেয়৷ আপনি বর্তমানে এমন একটি অ্যাপ্লিকেশন ব্যবহার করছেন যেটি ডেটা অ্যাক্সেস করতে পারে, তবে সেটি কমই করে৷ এর ফলে যা হতে পারে, উদাহরণস্বরূপ, আপনি ছবির উপর ট্যাপ না করা পর্যন্ত সেগুলি দেখানো হবে না৷"</string>
     <string name="data_saver_enable_title" msgid="7080620065745260137">"ডেটা সেভার চালু করবেন?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"চালু করুন"</string>
diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml
index bd05452..ee6bdd9 100644
--- a/core/res/res/values-bs/strings.xml
+++ b/core/res/res/values-bs/strings.xml
@@ -293,7 +293,7 @@
     <string name="foreground_service_tap_for_details" msgid="9078123626015586751">"Dodirnite za detalje o potrošnji baterije i prijenosa podataka"</string>
     <string name="foreground_service_multiple_separator" msgid="5002287361849863168">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string>
     <string name="safeMode" msgid="8974401416068943888">"Siguran način rada"</string>
-    <string name="android_system_label" msgid="5974767339591067210">"Android sistem"</string>
+    <string name="android_system_label" msgid="5974767339591067210">"Sistem Android"</string>
     <string name="user_owner_label" msgid="8628726904184471211">"Pređite na lični profil"</string>
     <string name="managed_profile_label" msgid="7316778766973512382">"Pređite na radni profil"</string>
     <string name="permgrouplab_contacts" msgid="4254143639307316920">"Kontakti"</string>
@@ -1480,6 +1480,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"Zahtjev uputio <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"Da"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"Ne"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"Pristup lokaciji zbog hitnog slučaja"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"Proizvođač uređaja je pristupio vašoj lokaciji za vrijeme nedavnog hitnog slučaja"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"Mobilni operater je pristupio vašoj lokaciji za vrijeme nedavnog hitnog slučaja"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"Granica za brisanje prekoračena"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"Izbrisano je <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> stavki za <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>, račun <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>. Šta želite uraditi?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"Izbriši stavke"</string>
@@ -1815,8 +1818,8 @@
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"Izbrisao je vaš administrator"</string>
     <string name="confirm_battery_saver" msgid="5247976246208245754">"Uredu"</string>
     <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"Radi produženja vijeka trajanja baterije, Ušteda baterije:\n·Uključuje Tamnu temu\n·Isključuje ili ograničava aktivnosti u pozadini, određene vizuelne efekte i druge funkcije kao što je \"Hej Google\"\n\n"<annotation id="url">"Saznajte više"</annotation></string>
-    <string name="battery_saver_description" msgid="7618492104632328184">"Radi produženja vijeka trajanja baterije, Ušteda baterije:\n·Uključuje Tamnu temu\n·Isključuje ili ograničava aktivnosti u pozadini, određene vizuelne efekte i druge funkcije kao što je \"Hej Google\""</string>
-    <string name="data_saver_description" msgid="4995164271550590517">"Da bi se smanjio prijenos podataka, Ušteda podataka sprečava da neke aplikacije šalju ili primaju podatke u pozadini. Aplikacija koju trenutno koristite može pristupiti podacima, ali će to činiti rjeđe. To može značiti, naprimjer, da se slike ne prikazuju sve dok ih ne dodirnete."</string>
+    <string name="battery_saver_description" msgid="7618492104632328184">"Radi produženja vijeka trajanja baterije, Ušteda baterije:\n·Uključuje Tamnu temu\n·Isključuje ili ograničava aktivnosti u pozadini, određene vizuelne efekte i druge funkcije kao što je \"Ok Google\""</string>
+    <string name="data_saver_description" msgid="4995164271550590517">"Radi smanjenja prijenosa podataka, Ušteda podataka sprečava da neke aplikacije šalju ili primaju podatke u pozadini. Aplikacija koju trenutno koristite može pristupiti podacima, ali će to činiti rjeđe. Naprimjer, to može značiti da se slike ne prikazuju dok ih ne dodirnete."</string>
     <string name="data_saver_enable_title" msgid="7080620065745260137">"Uključiti Uštedu podataka?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Uključi"</string>
     <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index a0e404a..ed77cdd 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -1457,6 +1457,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"Sol·licitat per <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"Sí"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"No"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"S\'ha accedit a la ubicació per emergència"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"El fabricant del teu dispositiu ha accedit a la teva ubicació durant una sessió d\'emergència recent"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"El teu operador ha accedit a la teva ubicació durant una sessió d\'emergència recent"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"S\'ha superat el límit de supressions"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"Hi ha <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> elements suprimits per a <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>, compte <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>. Què vols fer?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"Suprimeix els elements"</string>
@@ -1645,8 +1648,8 @@
     <string name="done_accessibility_shortcut_menu_button" msgid="3668407723770815708">"Fet"</string>
     <string name="disable_accessibility_shortcut" msgid="5806091378745232383">"Desactiva la drecera"</string>
     <string name="leave_accessibility_shortcut_on" msgid="6543362062336990814">"Utilitza la drecera"</string>
-    <string name="color_inversion_feature_name" msgid="326050048927789012">"Inversió dels colors"</string>
-    <string name="color_correction_feature_name" msgid="3655077237805422597">"Correcció del color"</string>
+    <string name="color_inversion_feature_name" msgid="326050048927789012">"Inversió de colors"</string>
+    <string name="color_correction_feature_name" msgid="3655077237805422597">"Correcció de color"</string>
     <string name="accessibility_shortcut_enabling_service" msgid="5473495203759847687">"S\'han mantingut premudes les tecles de volum. S\'ha activat <xliff:g id="SERVICE_NAME">%1$s</xliff:g>."</string>
     <string name="accessibility_shortcut_disabling_service" msgid="8675244165062700619">"S\'han mantingut premudes les tecles de volum. S\'ha desactivat <xliff:g id="SERVICE_NAME">%1$s</xliff:g>."</string>
     <string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"Mantén premudes les dues tecles de volum durant 3 segons per fer servir <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
@@ -1789,8 +1792,8 @@
     <string name="package_updated_device_owner" msgid="7560272363805506941">"Actualitzat per l\'administrador"</string>
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"Suprimit per l\'administrador"</string>
     <string name="confirm_battery_saver" msgid="5247976246208245754">"D\'acord"</string>
-    <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"Per allargar la durada de la bateria, el mode Estalvi de bateria fa el següent:\n Activa el tema fosc\n Desactiva o restringeix l\'activitat en segon pla, alguns efectes visuals i altres funcions com \"Ok Google\"\n\n"<annotation id="url">"Més informació"</annotation></string>
-    <string name="battery_saver_description" msgid="7618492104632328184">"Per allargar la durada de la bateria, el mode Estalvi de bateria fa el següent:\n Activa el tema fosc\n Desactiva o restringeix l\'activitat en segon pla, alguns efectes visuals i altres funcions com \"Ok Google\""</string>
+    <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"Per allargar la durada de la bateria, el mode Estalvi de bateria:\n Activa el tema fosc\n Desactiva o restringeix l\'activitat en segon pla, alguns efectes visuals i altres funcions com \"Ok Google\"\n\n"<annotation id="url">"Més informació"</annotation></string>
+    <string name="battery_saver_description" msgid="7618492104632328184">"Per allargar la durada de la bateria, el mode Estalvi de bateria:\n Activa el tema fosc\n Desactiva o restringeix l\'activitat en segon pla, alguns efectes visuals i altres funcions com \"Ok Google\""</string>
     <string name="data_saver_description" msgid="4995164271550590517">"Per reduir l\'ús de dades, la funció Economitzador de dades evita que determinades aplicacions enviïn o rebin dades en segon pla. L\'aplicació que estiguis fent servir podrà accedir a les dades, però menys sovint. Això vol dir, per exemple, que les imatges no es mostraran fins que no les toquis."</string>
     <string name="data_saver_enable_title" msgid="7080620065745260137">"Activar Economitzador de dades?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Activa"</string>
@@ -1828,7 +1831,7 @@
     </plurals>
     <string name="zen_mode_until" msgid="2250286190237669079">"Fins a les <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
     <string name="zen_mode_alarm" msgid="7046911727540499275">"Fins a les <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (propera alarma)"</string>
-    <string name="zen_mode_forever" msgid="740585666364912448">"Fins que no ho desactivi"</string>
+    <string name="zen_mode_forever" msgid="740585666364912448">"Fins que no el desactivis"</string>
     <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"Fins que desactivis el mode No molestis"</string>
     <string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
     <string name="toolbar_collapse_description" msgid="8009920446193610996">"Replega"</string>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index f56b8b5..7149a83 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -1499,6 +1499,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"Požadavek od uživatele <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"Ano"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"Ne"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"Byl využit údaj o poloze v nouzi"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"Výrobce vašeho zařízení při nedávném tísňovém volání získal přístup k vaší poloze"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"Váš operátor při nedávném tísňovém volání získal přístup k vaší poloze"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"Byl překročen limit mazání."</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"Počet smazaných položek pro <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g> (účet <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>): <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g>. Co chcete dělat?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"Smazat položky."</string>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index 6e9098b..2c135fb 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -1457,6 +1457,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"Anmodet om af <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"Ja"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"Nej"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"Din placering i nødstilfælde er tilgået"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"Din enheds producent fik adgang til din placering i løbet af en nødsituation for nylig"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"Dit mobilselskab fik adgang til din placering i løbet af en nødsituation for nylig"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"Grænsen for sletning er overskredet"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"Der er <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> slettede emner for <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>, konto <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>. Hvad vil du gøre?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"Slet elementerne"</string>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index bfb7b4d..95d71f6 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -1015,8 +1015,8 @@
     <string name="years" msgid="5797714729103773425">"Jahre"</string>
     <string name="now_string_shortest" msgid="3684914126941650330">"Jetzt"</string>
     <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
-      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> min</item>
-      <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> min</item>
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> Min.</item>
+      <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> Min.</item>
     </plurals>
     <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> h</item>
@@ -1031,8 +1031,8 @@
       <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> J.</item>
     </plurals>
     <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
-      <item quantity="other">in <xliff:g id="COUNT_1">%d</xliff:g> min</item>
-      <item quantity="one">in <xliff:g id="COUNT_0">%d</xliff:g> min</item>
+      <item quantity="other">in <xliff:g id="COUNT_1">%d</xliff:g> Min.</item>
+      <item quantity="one">in <xliff:g id="COUNT_0">%d</xliff:g> Min.</item>
     </plurals>
     <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
       <item quantity="other">in <xliff:g id="COUNT_1">%d</xliff:g> h</item>
@@ -1457,6 +1457,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"Angefordert von <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"\"Ja\""</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"Nein"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"Zugriff auf Gerätestandort bei Notfall"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"Dein Gerätehersteller hat vor Kurzem während eines Notfalls auf deinen Standort zugegriffen"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"Dein Mobilfunkanbieter hat vor Kurzem während eines Notfalls auf deinen Standort zugegriffen"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"Löschbegrenzung überschritten"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"Es sind <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> gelöschte Elemente für <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>, Konto <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>, vorhanden. Wie möchtest du fortfahren?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"Elemente löschen"</string>
@@ -1788,10 +1791,10 @@
     <string name="package_installed_device_owner" msgid="7035926868974878525">"Von deinem Administrator installiert"</string>
     <string name="package_updated_device_owner" msgid="7560272363805506941">"Von deinem Administrator aktualisiert"</string>
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"Von deinem Administrator gelöscht"</string>
-    <string name="confirm_battery_saver" msgid="5247976246208245754">"Ok"</string>
+    <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
     <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"Der Energiesparmodus sorgt für eine längere Akkulaufzeit:\n·Das dunkle Design wird aktiviert\n·Hintergrundaktivitäten, einige optische Effekte und weitere Funktionen wie \"Ok Google\" werden abgeschaltet oder eingeschränkt\n\n"<annotation id="url">"Weitere Informationen"</annotation></string>
-    <string name="battery_saver_description" msgid="7618492104632328184">"Der Energiesparmodus sorgt für eine längere Akkulaufzeit:\n Das dunkle Design wird aktiviert\n·Hintergrundaktivitäten, einige optische Effekte und weitere Funktionen wie \"Ok Google\" werden abgeschaltet oder eingeschränkt"</string>
-    <string name="data_saver_description" msgid="4995164271550590517">"Der Datensparmodus verhindert zum einen, dass Apps im Hintergrund Daten senden oder empfangen, sodass weniger Daten verbraucht werden. Zum anderen werden die Datenzugriffe der gerade aktiven App eingeschränkt, was z. B. dazu führen kann, dass Bilder erst angetippt werden müssen, bevor sie sichtbar werden."</string>
+    <string name="battery_saver_description" msgid="7618492104632328184">"Der Energiesparmodus sorgt für eine längere Akkulaufzeit:\n·Das dunkle Design wird aktiviert\n·Hintergrundaktivitäten, einige optische Effekte und weitere Funktionen wie \"Ok Google\" werden abgeschaltet oder eingeschränkt"</string>
+    <string name="data_saver_description" msgid="4995164271550590517">"Der Datensparmodus verhindert zum einen, dass manche Apps im Hintergrund Daten senden oder empfangen, sodass weniger Daten verbraucht werden. Zum anderen werden die Datenzugriffe der gerade aktiven App eingeschränkt, was z. B. dazu führen kann, dass Bilder erst angetippt werden müssen, bevor sie sichtbar werden."</string>
     <string name="data_saver_enable_title" msgid="7080620065745260137">"Datensparmodus aktivieren?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Aktivieren"</string>
     <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
@@ -1799,8 +1802,8 @@
       <item quantity="one">1 Minute (bis <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
     </plurals>
     <plurals name="zen_mode_duration_minutes_summary_short" formatted="false" msgid="4230730310318858312">
-      <item quantity="other">Für %1$d min (bis <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
-      <item quantity="one">Für 1 min (bis <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
+      <item quantity="other">Für %1$d Min. (bis <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+      <item quantity="one">Für 1 Min. (bis <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
     </plurals>
     <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="7725354244196466758">
       <item quantity="other">%1$d Stunden (bis <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
@@ -1815,8 +1818,8 @@
       <item quantity="one">Für 1 Minute</item>
     </plurals>
     <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
-      <item quantity="other">Für %d min</item>
-      <item quantity="one">Für 1 min</item>
+      <item quantity="other">Für %d Min.</item>
+      <item quantity="one">Für 1 Min.</item>
     </plurals>
     <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
       <item quantity="other">%d Stunden</item>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index 5fdbe9e..05b5e52 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -268,7 +268,7 @@
     <string name="status_bar_notification_info_overflow" msgid="3330152558746563475">"999+"</string>
     <string name="notification_hidden_text" msgid="2835519769868187223">"Νέα ειδοποίηση"</string>
     <string name="notification_channel_virtual_keyboard" msgid="6465975799223304567">"Εικονικό πληκτρολόγιο"</string>
-    <string name="notification_channel_physical_keyboard" msgid="5417306456125988096">"Φυσικό πληκτρολόγιο"</string>
+    <string name="notification_channel_physical_keyboard" msgid="5417306456125988096">"Κανονικό πληκτρολόγιο"</string>
     <string name="notification_channel_security" msgid="8516754650348238057">"Ασφάλεια"</string>
     <string name="notification_channel_car_mode" msgid="2123919247040988436">"Λειτουργία αυτοκινήτου"</string>
     <string name="notification_channel_account" msgid="6436294521740148173">"Κατάσταση λογαριασμού"</string>
@@ -1327,7 +1327,7 @@
     <string name="share_remote_bugreport_action" msgid="7630880678785123682">"ΚΟΙΝΟΠΟΙΗΣΗ"</string>
     <string name="decline_remote_bugreport_action" msgid="4040894777519784346">"ΑΠΟΡΡΙΨΗ"</string>
     <string name="select_input_method" msgid="3971267998568587025">"Επιλογή μεθόδου εισόδου"</string>
-    <string name="show_ime" msgid="6406112007347443383">"Να παραμένει στην οθόνη όταν είναι ενεργό το φυσικό πληκτρολόγιο"</string>
+    <string name="show_ime" msgid="6406112007347443383">"Να παραμένει στην οθόνη όταν είναι ενεργό το κανονικό πληκτρολόγιο"</string>
     <string name="hardware" msgid="1800597768237606953">"Εμφάνιση εικονικού πληκτρολ."</string>
     <string name="select_keyboard_layout_notification_title" msgid="4427643867639774118">"Διαμόρφωση φυσικού πληκτρολογίου"</string>
     <string name="select_keyboard_layout_notification_message" msgid="8835158247369158154">"Πατήστε για να επιλέξετε γλώσσα και διάταξη"</string>
@@ -1457,6 +1457,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"Ζητήθηκε από <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"Ναι"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"Όχι"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"Πρόσβαση στην τοποθεσία έκτακτης ανάγκης"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"Ο κατασκευαστής της συσκευής σας απέκτησε πρόσβαση στην τοποθεσία σας κατά τη διάρκεια μιας πρόσφατης περιόδου λειτουργίας έκτακτης ανάγκης."</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"Η εταιρεία κινητής τηλεφωνίας σας απέκτησε πρόσβαση στην τοποθεσία σας κατά τη διάρκεια μιας πρόσφατης περιόδου λειτουργίας έκτακτης ανάγκης."</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"Έγινε υπέρβαση του ορίου διαγραφής"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"Υπάρχουν <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> διαγραμμένα στοιχεία για τον συγχρονισμό <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>, στον λογαριασμό <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>. Τι θέλετε να κάνετε;"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"Διαγραφή των στοιχείων"</string>
diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml
index ea121ef..0a564d7 100644
--- a/core/res/res/values-en-rAU/strings.xml
+++ b/core/res/res/values-en-rAU/strings.xml
@@ -1457,6 +1457,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"Requested by <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"Yes"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"No"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"Emergency location accessed"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"Your device manufacturer accessed your location during a recent emergency session"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"Your operator accessed your location during a recent emergency session"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"Deletion limit exceeded"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"There are <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> deleted items for <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>, account <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>. What do you want to do?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"Delete the items"</string>
diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml
index a5bbb41..613c439 100644
--- a/core/res/res/values-en-rCA/strings.xml
+++ b/core/res/res/values-en-rCA/strings.xml
@@ -1457,6 +1457,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"Requested by <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"Yes"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"No"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"Emergency location accessed"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"Your device manufacturer accessed your location during a recent emergency session"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"Your operator accessed your location during a recent emergency session"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"Deletion limit exceeded"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"There are <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> deleted items for <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>, account <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>. What do you want to do?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"Delete the items"</string>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index ea121ef..0a564d7 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -1457,6 +1457,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"Requested by <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"Yes"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"No"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"Emergency location accessed"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"Your device manufacturer accessed your location during a recent emergency session"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"Your operator accessed your location during a recent emergency session"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"Deletion limit exceeded"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"There are <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> deleted items for <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>, account <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>. What do you want to do?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"Delete the items"</string>
diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml
index ea121ef..0a564d7 100644
--- a/core/res/res/values-en-rIN/strings.xml
+++ b/core/res/res/values-en-rIN/strings.xml
@@ -1457,6 +1457,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"Requested by <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"Yes"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"No"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"Emergency location accessed"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"Your device manufacturer accessed your location during a recent emergency session"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"Your operator accessed your location during a recent emergency session"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"Deletion limit exceeded"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"There are <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> deleted items for <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>, account <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>. What do you want to do?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"Delete the items"</string>
diff --git a/core/res/res/values-en-rXC/strings.xml b/core/res/res/values-en-rXC/strings.xml
index 2777e0e..77d2f31 100644
--- a/core/res/res/values-en-rXC/strings.xml
+++ b/core/res/res/values-en-rXC/strings.xml
@@ -1457,6 +1457,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‏‏‏‏‏‎‏‎‎‏‎‎‎‏‎‏‎‎‏‏‏‎‎‏‏‏‏‏‏‎‏‎‏‏‎‎‎‏‏‏‎‏‎‎‏‏‏‎‏‎‏‎‏‎‎‎‎‎Requested by ‎‏‎‎‏‏‎<xliff:g id="NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ (‎‏‎‎‏‏‎<xliff:g id="SERVICE">%2$s</xliff:g>‎‏‎‎‏‏‏‎)‎‏‎‎‏‎"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‏‏‎‎‏‏‏‏‏‏‎‎‎‏‎‎‏‏‎‎‏‎‎‏‎‏‏‎‎‎‏‏‏‏‏‏‏‎‎‏‎‏‎‎‏‎‎‏‏‎‎‏‎‏‏‎‎‎Yes‎‏‎‎‏‎"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‏‏‎‎‏‏‎‎‎‏‎‏‎‎‏‏‎‏‎‎‏‏‏‎‏‏‏‏‎‏‎‏‎‎‎‏‎‎‏‏‏‏‏‎‏‎‏‎‏‎‏‏‎‎‎‏‎‏‎No‎‏‎‎‏‎"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‏‎‏‏‏‎‎‏‏‏‎‎‎‏‎‎‎‏‎‎‏‎‎‏‎‎‎‎‏‏‏‎‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‎‏‏‎‎‏‏‏‏‏‎Emergency location accessed‎‏‎‎‏‎"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‏‎‎‏‎‎‎‎‎‎‎‎‎‏‏‎‏‎‎‎‏‏‎‏‏‏‎‎‎‎‏‎‎‎‏‏‏‏‏‎‎‏‎‏‏‎‎‎‎‏‎‎‎‎‎‎‏‎Your device manufacturer accessed your location during a recent emergency session‎‏‎‎‏‎"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‏‎‏‎‏‎‎‏‎‏‎‎‏‏‏‏‎‏‎‏‏‏‎‎‎‎‎‎‎‏‎‏‎‎‏‎‎‏‏‏‎‎‏‏‎‎‏‎‏‏‎‏‎‎‏‏‏‎Your carrier accessed your location during a recent emergency session‎‏‎‎‏‎"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‎‏‎‎‏‎‎‎‏‏‎‎‎‎‎‎‏‎‎‏‎‎‏‏‎‎‏‏‎‎‎‎‏‏‎‎‏‎‎‏‏‎‎‎‎‏‎‎‏‏‏‎‎‏‎‏‎‎‎Delete limit exceeded‎‏‎‎‏‎"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‎‏‏‎‏‎‎‏‏‎‎‏‏‏‎‎‎‏‎‎‎‎‎‎‏‎‏‏‎‎‎‏‎‎‎‏‎‏‎‏‎‏‏‎‎‎‏‎‎‎‎‏‏‏‎‎‎‎There are ‎‏‎‎‏‏‎<xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g>‎‏‎‎‏‏‏‎ deleted items for ‎‏‎‎‏‏‎<xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>‎‏‎‎‏‏‏‎, account ‎‏‎‎‏‏‎<xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>‎‏‎‎‏‏‏‎. What do you want to do?‎‏‎‎‏‎"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‎‏‎‎‎‎‏‎‎‏‏‎‎‏‏‎‎‎‏‎‏‏‏‎‎‏‎‏‎‏‏‏‎‎‎‏‎‏‏‏‏‎‏‎‎‏‏‏‎‏‎‏‎‏‎‏‏‎Delete the items‎‏‎‎‏‎"</string>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index cf58937..6c19031 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -1457,6 +1457,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"Solicitado por <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"Sí"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"No"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"Se accedió a la ubicación en emergencia"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"El fabricante del dispositivo accedió a tu ubicación durante una sesión de emergencia reciente"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"El proveedor accedió a tu ubicación durante una sesión de emergencia reciente"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"Eliminar el límite excedido"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"Hay <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> elementos eliminados para <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g> en la cuenta <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>. ¿Qué quieres hacer?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"Eliminar elementos"</string>
@@ -1790,9 +1793,9 @@
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"Tu administrador borró este paquete"</string>
     <string name="confirm_battery_saver" msgid="5247976246208245754">"Aceptar"</string>
     <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"Para extender la duración de batería, el Ahorro de batería hace lo siguiente:\n·Activa el Tema oscuro.\n·Desactiva o restringe la actividad en segundo plano, algunos efectos visuales y otras funciones, como \"Ok Google\".\n\n"<annotation id="url">"Más información"</annotation></string>
-    <string name="battery_saver_description" msgid="7618492104632328184">"Para extender la duración de batería, el Ahorro de batería hace lo siguiente:\n·Activa el Tema oscuro.\n·Desactiva o restringe la actividad en segundo plano, algunos efectos visuales y otras funciones, como \"Ok Google\"."</string>
-    <string name="data_saver_description" msgid="4995164271550590517">"Para reducir el uso de datos, Ahorro de datos evita que algunas apps envíen y reciban datos en segundo plano. La app que estés usando podrá acceder a los datos, pero con menor frecuencia. De esta forma, por ejemplo, las imágenes no se mostrarán hasta que las presiones."</string>
-    <string name="data_saver_enable_title" msgid="7080620065745260137">"¿Activar Ahorro de datos?"</string>
+    <string name="battery_saver_description" msgid="7618492104632328184">"Para extender la duración de batería, el modo Ahorro de batería hace lo siguiente:\n·Activa el Tema oscuro.\n·Desactiva o restringe la actividad en segundo plano, algunos efectos visuales y otras funciones como \"Ok Google\"."</string>
+    <string name="data_saver_description" msgid="4995164271550590517">"Para reducir el uso de datos, el modo Ahorro de datos evita que algunas apps envíen y reciban datos en segundo plano. La app que estés usando podrá acceder a los datos, pero con menor frecuencia. De esta forma, por ejemplo, las imágenes no se mostrarán hasta que las presiones."</string>
+    <string name="data_saver_enable_title" msgid="7080620065745260137">"¿Deseas activar Ahorro de datos?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Activar"</string>
     <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
       <item quantity="other">Durante %1$d minutos hasta la(s) <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g></item>
@@ -2026,7 +2029,7 @@
       <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> y <xliff:g id="COUNT_3">%d</xliff:g> archivos más</item>
       <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> y <xliff:g id="COUNT_1">%d</xliff:g> archivo más</item>
     </plurals>
-    <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"No hay personas recomendadas con las que compartir"</string>
+    <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"No hay personas recomendadas con quienes compartir"</string>
     <string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Lista de apps"</string>
     <string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Aunque no se le otorgó permiso de grabación a esta app, puede capturar audio con este dispositivo USB."</string>
     <string name="accessibility_system_action_home_label" msgid="3234748160850301870">"Página principal"</string>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index b57b692..b923564 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -192,7 +192,7 @@
     <string name="network_logging_notification_title" msgid="554983187553845004">"El dispositivo está administrado"</string>
     <string name="network_logging_notification_text" msgid="1327373071132562512">"Tu organización administra este dispositivo y puede supervisar el tráfico de red. Toca la notificación para obtener más información."</string>
     <string name="location_changed_notification_title" msgid="3620158742816699316">"Las aplicaciones pueden acceder a tu ubicación"</string>
-    <string name="location_changed_notification_text" msgid="7158423339982706912">"Para obtener más información, ponte en contacto con tu administrador de TI"</string>
+    <string name="location_changed_notification_text" msgid="7158423339982706912">"Contacta con tu admin. de TI para más información"</string>
     <string name="country_detector" msgid="7023275114706088854">"Detector de país"</string>
     <string name="location_service" msgid="2439187616018455546">"Servicio de ubicación"</string>
     <string name="sensor_notification_service" msgid="7474531979178682676">"Servicio de notificación de sensor"</string>
@@ -1457,6 +1457,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"Solicitud enviada por <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"Sí"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"No"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"Ubicación consultada durante emergencia"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"El fabricante de tu dispositivo ha consultado tu ubicación durante una sesión de emergencia reciente"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"Tu operador ha consultado tu ubicación durante una sesión de emergencia reciente"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"Se ha superado el límite de eliminaciones."</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"Hay <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> elementos eliminados para <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g> (cuenta <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>). ¿Qué quieres hacer?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"Eliminar elementos"</string>
@@ -1654,7 +1657,7 @@
     <string name="accessibility_gesture_prompt_text" msgid="8742535972130563952">"Elige la función que se utilizará con el gesto de accesibilidad (deslizar dos dedos hacia arriba desde la parte inferior de la pantalla):"</string>
     <string name="accessibility_gesture_3finger_prompt_text" msgid="5211827854510660203">"Elige la función que se utilizará con el gesto de accesibilidad (deslizar tres dedos hacia arriba desde la parte inferior de la pantalla):"</string>
     <string name="accessibility_button_instructional_text" msgid="8853928358872550500">"Para cambiar de una función a otra, mantén pulsado el botón Accesibilidad."</string>
-    <string name="accessibility_gesture_instructional_text" msgid="9196230728837090497">"Para cambiar de una función a otra, desliza dos dedos hacia arriba y mantén pulsada la pantalla."</string>
+    <string name="accessibility_gesture_instructional_text" msgid="9196230728837090497">"Para cambiar de una función a otra, desliza hacia arriba con dos dedos y mantén pulsada la pantalla."</string>
     <string name="accessibility_gesture_3finger_instructional_text" msgid="3425123684990193765">"Para cambiar de una función a otra, desliza tres dedos hacia arriba y mantén pulsada la pantalla."</string>
     <string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Ampliar"</string>
     <string name="user_switched" msgid="7249833311585228097">"Usuario actual: <xliff:g id="NAME">%1$s</xliff:g>"</string>
@@ -1791,8 +1794,8 @@
     <string name="confirm_battery_saver" msgid="5247976246208245754">"Aceptar"</string>
     <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"Para que la batería dure más, el modo Ahorro de batería:\n· Activa el tema oscuro\n· Desactiva o restringe actividad en segundo plano, algunos efectos visuales y otras funciones como \"Ok Google\"\n\n"<annotation id="url">"Más información"</annotation></string>
     <string name="battery_saver_description" msgid="7618492104632328184">"Para que la batería dure más, el modo Ahorro de batería:\n· Activa el tema oscuro\n· Desactiva o restringe actividad en segundo plano, algunos efectos visuales y otras funciones como \"Ok Google\""</string>
-    <string name="data_saver_description" msgid="4995164271550590517">"El ahorro de datos evita que algunas aplicaciones envíen o reciban datos en segundo plano, lo que permite reducir el uso de datos. Una aplicación activa podrá acceder a los datos, aunque con menos frecuencia. Esto significa que es posible que, por ejemplo, algunas imágenes no se muestren hasta que las toques."</string>
-    <string name="data_saver_enable_title" msgid="7080620065745260137">"¿Activar ahorro de datos?"</string>
+    <string name="data_saver_description" msgid="4995164271550590517">"El modo Ahorro de datos evita que algunas aplicaciones envíen o reciban datos en segundo plano, lo que puede reducir el uso de datos. Una aplicación activa puede acceder a los datos, aunque con menos frecuencia. Esto significa que es posible que, por ejemplo, algunas imágenes no se muestren hasta que las toques."</string>
+    <string name="data_saver_enable_title" msgid="7080620065745260137">"¿Activar Ahorro de datos?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Activar"</string>
     <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
       <item quantity="other">Durante %1$d minutos (hasta las <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
@@ -1901,7 +1904,7 @@
     <string name="pin_specific_target" msgid="7824671240625957415">"Fijar <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="unpin_target" msgid="3963318576590204447">"No fijar"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"No fijar <xliff:g id="LABEL">%1$s</xliff:g>"</string>
-    <string name="app_info" msgid="6113278084877079851">"Acerca de la aplicación"</string>
+    <string name="app_info" msgid="6113278084877079851">"Información de la aplicación"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"Iniciando demostración…"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"Restableciendo dispositivo…"</string>
@@ -1995,8 +1998,8 @@
     <string name="notification_appops_microphone_active" msgid="581333393214739332">"Micrófono"</string>
     <string name="notification_appops_overlay_active" msgid="5571732753262836481">"se muestra sobre otras aplicaciones que haya en la pantalla"</string>
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Notificación sobre el modo rutina"</string>
-    <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Es posible que te quedes sin batería antes de lo habitual"</string>
-    <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Se ha activado el ahorro de batería para aumentar la duración de la batería"</string>
+    <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Puede que se agote la batería antes de lo habitual"</string>
+    <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Se ha activado el modo Ahorro de batería para aumentar la duración de la batería"</string>
     <string name="battery_saver_notification_channel_name" msgid="3918243458067916913">"Ahorro de batería"</string>
     <string name="battery_saver_off_notification_title" msgid="7637255960468032515">"Ahorro de batería desactivado"</string>
     <string name="battery_saver_charged_notification_summary" product="default" msgid="5544457317418624367">"El teléfono tiene suficiente batería. Las funciones ya no están restringidas."</string>
@@ -2026,7 +2029,7 @@
       <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> y <xliff:g id="COUNT_3">%d</xliff:g> archivos</item>
       <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> y <xliff:g id="COUNT_1">%d</xliff:g> archivo</item>
     </plurals>
-    <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"No hay personas recomendadas con las que compartir"</string>
+    <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"No hay sugerencias de personas con las que compartir"</string>
     <string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Lista de aplicaciones"</string>
     <string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Esta aplicación no tiene permiso para grabar, pero podría registrar audio con este dispositivo USB."</string>
     <string name="accessibility_system_action_home_label" msgid="3234748160850301870">"Inicio"</string>
diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml
index 070fd79f..518aa60 100644
--- a/core/res/res/values-et/strings.xml
+++ b/core/res/res/values-et/strings.xml
@@ -1457,6 +1457,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"Taotleja: <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"Jah"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"Ei"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"Hädaolukorra asukohale pääseti juurde"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"Teie seadme tootja pääses hiljutise hädaolukorra seansi ajal teie asukohale juurde"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"Teie operaator pääses hiljutise hädaolukorra seansi ajal teie asukohale juurde"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"Kustutamiste piirarv on ületatud"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"Kustutatavad üksused kontol <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> sünkroonimistüübi <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g> jaoks: <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g>. Mida soovite teha?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"Kustuta üksused"</string>
@@ -1646,7 +1649,7 @@
     <string name="disable_accessibility_shortcut" msgid="5806091378745232383">"Lülita otsetee välja"</string>
     <string name="leave_accessibility_shortcut_on" msgid="6543362062336990814">"Kasuta otseteed"</string>
     <string name="color_inversion_feature_name" msgid="326050048927789012">"Värvide ümberpööramine"</string>
-    <string name="color_correction_feature_name" msgid="3655077237805422597">"Värviparandus"</string>
+    <string name="color_correction_feature_name" msgid="3655077237805422597">"Värvide korrigeerimine"</string>
     <string name="accessibility_shortcut_enabling_service" msgid="5473495203759847687">"Helitugevuse nuppe hoiti all. <xliff:g id="SERVICE_NAME">%1$s</xliff:g> lülitati sisse."</string>
     <string name="accessibility_shortcut_disabling_service" msgid="8675244165062700619">"Helitugevuse nuppe hoiti all. <xliff:g id="SERVICE_NAME">%1$s</xliff:g> lülitati välja."</string>
     <string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"Teenuse <xliff:g id="SERVICE_NAME">%1$s</xliff:g> kasutamiseks hoidke kolm sekundit all mõlemat helitugevuse klahvi"</string>
@@ -1792,7 +1795,7 @@
     <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"Aku tööea pikendamiseks teeb akusäästja järgmist.\n·Lülitab sisse tumeda teema.\n·Lülitab välja taustategevused, mõned visuaalsed efektid ja muud funktsioonid (nt „Hei Google”) või piirab neid.\n\n"<annotation id="url">"Lisateave"</annotation></string>
     <string name="battery_saver_description" msgid="7618492104632328184">"Aku tööea pikendamiseks teeb akusäästja järgmist.\n·Lülitab sisse tumeda teema.\n·Lülitab välja taustategevused, mõned visuaalsed efektid ja muud funktsioonid (nt „Hei Google”) või piirab neid."</string>
     <string name="data_saver_description" msgid="4995164271550590517">"Andmekasutuse vähendamiseks keelab andmemahu säästja mõne rakenduse puhul andmete taustal saatmise ja vastuvõtmise. Rakendus, mida praegu kasutate, pääseb andmesidele juurde, kuid võib seda teha väiksema sagedusega. Seetõttu võidakse näiteks pildid kuvada alles siis, kui neid puudutate."</string>
-    <string name="data_saver_enable_title" msgid="7080620065745260137">"Lül. andmemahu säästja sisse?"</string>
+    <string name="data_saver_enable_title" msgid="7080620065745260137">"Lülitada andmemahu säästja sisse?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Lülita sisse"</string>
     <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
       <item quantity="other">%1$d minutiks (kuni <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
@@ -1901,7 +1904,7 @@
     <string name="pin_specific_target" msgid="7824671240625957415">"PIN-kood <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="unpin_target" msgid="3963318576590204447">"Vabasta"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"Vabasta <xliff:g id="LABEL">%1$s</xliff:g>"</string>
-    <string name="app_info" msgid="6113278084877079851">"Rakenduse teave"</string>
+    <string name="app_info" msgid="6113278084877079851">"Rakenduste teave"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"Demo käivitamine …"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"Seadme lähtestamine …"</string>
@@ -1980,7 +1983,7 @@
     <string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"AVA IKKA"</string>
     <string name="harmful_app_warning_title" msgid="8794823880881113856">"Tuvastati kahjulik rakendus"</string>
     <string name="slices_permission_request" msgid="3677129866636153406">"Rakendus <xliff:g id="APP_0">%1$s</xliff:g> soovib näidata rakenduse <xliff:g id="APP_2">%2$s</xliff:g> lõike"</string>
-    <string name="screenshot_edit" msgid="7408934887203689207">"Muutmine"</string>
+    <string name="screenshot_edit" msgid="7408934887203689207">"Muuda"</string>
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Kõnede ja märguannete puhul seade vibreerib"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Kõned ja märguanded on vaigistatud"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"Süsteemi muudatused"</string>
diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml
index c5922e1..f004b8a 100644
--- a/core/res/res/values-eu/strings.xml
+++ b/core/res/res/values-eu/strings.xml
@@ -297,7 +297,7 @@
     <string name="permgroupdesc_contacts" msgid="9163927941244182567">"atzitu kontaktuak"</string>
     <string name="permgrouplab_location" msgid="1858277002233964394">"Kokapena"</string>
     <string name="permgroupdesc_location" msgid="1995955142118450685">"atzitu gailuaren kokapena"</string>
-    <string name="permgrouplab_calendar" msgid="6426860926123033230">"Egutegia"</string>
+    <string name="permgrouplab_calendar" msgid="6426860926123033230">"Calendar"</string>
     <string name="permgroupdesc_calendar" msgid="6762751063361489379">"atzitu egutegia"</string>
     <string name="permgrouplab_sms" msgid="795737735126084874">"SMS mezuak"</string>
     <string name="permgroupdesc_sms" msgid="5726462398070064542">"bidali eta ikusi SMS mezuak"</string>
@@ -481,7 +481,7 @@
     <string name="permdesc_setTimeZone" product="tv" msgid="9069045914174455938">"Android TV gailuaren ordu-zona aldatzeko baimena ematen die aplikazioei."</string>
     <string name="permdesc_setTimeZone" product="default" msgid="4611828585759488256">"Telefonoaren ordu-zona aldatzeko baimena ematen die aplikazioei."</string>
     <string name="permlab_getAccounts" msgid="5304317160463582791">"bilatu gailuko kontuak"</string>
-    <string name="permdesc_getAccounts" product="tablet" msgid="1784452755887604512">"Tabletak ezagutzen dituen kontuen zerrenda lortzeko baimena ematen die aplikazioei. Instalatuta dituzun aplikazioek sortutako kontuak har daitezke barnean."</string>
+    <string name="permdesc_getAccounts" product="tablet" msgid="1784452755887604512">"Tabletak ezagutzen dituen kontuen zerrenda lortzeko baimena ematen die aplikazioei. Instalatuta dauzkazun aplikazioek sortutako kontuak har daitezke barnean."</string>
     <string name="permdesc_getAccounts" product="tv" msgid="437604680436540822">"Android TV gailuak ezagutzen dituen kontuen zerrenda lortzeko baimena ematen die aplikazioei. Kontu horien artean, instalatuta dituzun aplikazioek sortutako kontuak egon litezke."</string>
     <string name="permdesc_getAccounts" product="default" msgid="2491273043569751867">"Telefonoak ezagutzen dituen kontuen zerrenda lortzeko baimena ematen die aplikazioei. Instalatuta dituzun aplikazioek sortutako kontuak har daitezke barnean."</string>
     <string name="permlab_accessNetworkState" msgid="2349126720783633918">"ikusi sareko konexioak"</string>
@@ -1457,6 +1457,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"<xliff:g id="NAME">%1$s</xliff:g> erabiltzaileak eskatuta (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"Bai"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"Ez"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"Larrialdiko kokapena atzitu da"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"Gailuaren fabrikatzaileak zure kokapena atzitu zuen duela gutxi izandako larrialdiko saio baten harira"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"Operadoreak zure kokapena atzitu zuen duela gutxi izandako larrialdiko saio baten harira"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"Ezabatze-muga gainditu da"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"Ezabatutako <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> elementu daude <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g> sinkronizazioan, <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> kontuan. Zer egin nahi duzu?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"Ezabatu elementuak"</string>
@@ -1789,10 +1792,10 @@
     <string name="package_updated_device_owner" msgid="7560272363805506941">"Administratzaileak eguneratu du"</string>
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"Administratzaileak ezabatu du"</string>
     <string name="confirm_battery_saver" msgid="5247976246208245754">"Ados"</string>
-    <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"Bateriaren iraupena luzatzeko, erabili Bateria-aurrezlea:\n·Gai iluna aktibatzen du\n Desaktibatu edo murriztu egiten ditu atzeko planoko jarduerak, zenbait efektu bisual eta beste eginbide batzuk, hala nola \"Ok Google\"\n\n"<annotation id="url">"Lortu informazio gehiago"</annotation></string>
-    <string name="battery_saver_description" msgid="7618492104632328184">"Bateriaren iraupena luzatzeko, erabili Bateria-aurrezlea:\n·Gai iluna aktibatzen du\n Desaktibatu edo murriztu egiten ditu atzeko planoko jarduerak, zenbait efektu bisual eta beste eginbide batzuk, hala nola \"Ok Google\""</string>
-    <string name="data_saver_description" msgid="4995164271550590517">"Datuen erabilera murrizteko, atzeko planoan datuak bidaltzea eta jasotzea galarazten die datu-aurrezleak aplikazio batzuei. Unean erabiltzen ari zaren aplikazioak atzitu egin ahal izango ditu datuak, baina baliteke maiztasun txikiagoarekin atzitzea. Horrela, adibidez, baliteke irudiak ez erakustea haiek sakatu arte."</string>
-    <string name="data_saver_enable_title" msgid="7080620065745260137">"Datu-aurrezlea aktibatu?"</string>
+    <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"Bateriaren iraupena luzatzeko, erabili bateria-aurrezlea:\n·Gai iluna aktibatzen du\n Desaktibatu edo murriztu egiten ditu atzeko planoko jarduerak, zenbait efektu bisual eta beste eginbide batzuk, hala nola \"Ok Google\"\n\n"<annotation id="url">"Lortu informazio gehiago"</annotation></string>
+    <string name="battery_saver_description" msgid="7618492104632328184">"Bateriaren iraupena luzatzeko, erabili bateria-aurrezlea:\n·Gai iluna aktibatzen du\n Desaktibatu edo murriztu egiten ditu atzeko planoko jarduerak, zenbait efektu bisual eta beste eginbide batzuk, hala nola \"Ok Google\""</string>
+    <string name="data_saver_description" msgid="4995164271550590517">"Datuen erabilera murrizteko, atzeko planoan datuak bidaltzea eta jasotzea galarazten die datu-aurrezleak aplikazio batzuei. Une honetan erabiltzen ari zaren aplikazioak atzitu egin ahal izango ditu datuak, baina baliteke maiztasun txikiagoarekin atzitzea. Horrela, adibidez, baliteke irudiak ez erakustea haiek sakatu arte."</string>
+    <string name="data_saver_enable_title" msgid="7080620065745260137">"Datu-aurrezlea aktibatu nahi duzu?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Aktibatu"</string>
     <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
       <item quantity="other">%1$d minutuz (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> arte)</item>
@@ -1872,7 +1875,7 @@
     <string name="notification_history_title_placeholder" msgid="7748630986182249599">"Aplikazio-jakinarazpen pertsonalizatua"</string>
     <string name="user_creation_account_exists" msgid="2239146360099708035">"<xliff:g id="ACCOUNT">%2$s</xliff:g> kontua duen erabiltzailea sortzeko baimena eman nahi diozu <xliff:g id="APP">%1$s</xliff:g> aplikazioari? (Badago kontu hori duen erabiltzaile bat)"</string>
     <string name="user_creation_adding" msgid="7305185499667958364">"<xliff:g id="ACCOUNT">%2$s</xliff:g> kontua duen erabiltzailea sortzeko baimena eman nahi diozu <xliff:g id="APP">%1$s</xliff:g> aplikazioari?"</string>
-    <string name="language_selection_title" msgid="52674936078683285">"Gehitu hizkuntza"</string>
+    <string name="language_selection_title" msgid="52674936078683285">"Gehitu hizkuntza bat"</string>
     <string name="country_selection_title" msgid="5221495687299014379">"Lurralde-hobespena"</string>
     <string name="search_language_hint" msgid="7004225294308793583">"Adierazi hizkuntza"</string>
     <string name="language_picker_section_suggested" msgid="6556199184638990447">"Iradokitakoak"</string>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index e25dc34..474c803 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -242,16 +242,16 @@
     <string name="global_action_emergency" msgid="1387617624177105088">"اضطراری"</string>
     <string name="global_action_bug_report" msgid="5127867163044170003">"گزارش اشکال"</string>
     <string name="global_action_logout" msgid="6093581310002476511">"پایان جلسه"</string>
-    <string name="global_action_screenshot" msgid="2610053466156478564">"عکس صفحه‌نمایش"</string>
+    <string name="global_action_screenshot" msgid="2610053466156478564">"نماگرفت"</string>
     <string name="bugreport_title" msgid="8549990811777373050">"گزارش اشکال"</string>
     <string name="bugreport_message" msgid="5212529146119624326">"این گزارش اطلاعات مربوط به وضعیت دستگاه کنونی شما را جمع‌آوری می‌کند تا به‌صورت پیام ایمیل ارسال شود. از زمان شروع گزارش اشکال تا آماده شدن برای ارسال اندکی زمان می‌برد؛ لطفاً کمی صبر کنید."</string>
     <string name="bugreport_option_interactive_title" msgid="7968287837902871289">"گزارش تعاملی"</string>
     <string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"در بیشتر شرایط از این گزینه استفاده کنید. به شما امکان ردیابی پیشرفت گزارش و وارد کردن جزئیات بیشتری درباره مشکل را می‌دهد. ممکن است برخی از بخش‌هایی را که کمتر استفاده شده و باعث افزایش طول زمان گزارش می‌شود حذف کند."</string>
     <string name="bugreport_option_full_title" msgid="7681035745950045690">"گزارش کامل"</string>
-    <string name="bugreport_option_full_summary" msgid="1975130009258435885">"از این گزینه برای به‌حداقل رساندن تداخل سیستم هنگام پاسخ‌گو نبودن یا کند بودن دستگاه یا هنگام نیازداشتن به همه بخش‌های گزارش استفاده کنید. عکس صفحه‌نمایش دیگری نمی‌گیرد یا امکان وارد کردن جزئیات بیشتری به شما نمی‌دهد."</string>
+    <string name="bugreport_option_full_summary" msgid="1975130009258435885">"از این گزینه برای به‌حداقل رساندن تداخل سیستم هنگام پاسخ‌گو نبودن یا کند بودن دستگاه یا هنگام نیازداشتن به همه بخش‌های گزارش استفاده کنید. نماگرفت دیگری نمی‌گیرد یا امکان وارد کردن جزئیات بیشتری به شما نمی‌دهد."</string>
     <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
-      <item quantity="one">تا <xliff:g id="NUMBER_1">%d</xliff:g> ثانیه دیگر عکس صفحه‌نمایش برای گزارش اشکال گرفته می‌شود.</item>
-      <item quantity="other">تا <xliff:g id="NUMBER_1">%d</xliff:g> ثانیه دیگر عکس صفحه‌نمایش برای گزارش اشکال گرفته می‌شود.</item>
+      <item quantity="one">تا <xliff:g id="NUMBER_1">%d</xliff:g> ثانیه دیگر نماگرفت برای گزارش اشکال گرفته می‌شود.</item>
+      <item quantity="other">تا <xliff:g id="NUMBER_1">%d</xliff:g> ثانیه دیگر نماگرفت برای گزارش اشکال گرفته می‌شود.</item>
     </plurals>
     <string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"نماگرفت با گزارش اشکال گرفته شد"</string>
     <string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"نماگرفت با گزارش اشکال گرفته نشد"</string>
@@ -1457,6 +1457,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"درخواست‌کننده <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"بله"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"نه"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"از دسترسی به مکان اضطراری استفاده شد"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"سازنده دستگاهتان درحین یکی از جلسه‌های اضطراری اخیر به مکانتان دسترسی پیدا کرد"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"شرکت مخابراتی‌تان درحین یکی از جلسه‌های اضطراری اخیر به مکانتان دسترسی پیدا کرد"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"از حد مجاز حذف فراتر رفت"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"‏<xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> مورد حذف‌شده برای <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>، حساب <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> وجود دارد. می‎خواهید چه کار بکنید؟"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"حذف موارد"</string>
@@ -1556,10 +1559,10 @@
     <string name="default_audio_route_category_name" msgid="5241740395748134483">"سیستم"</string>
     <string name="bluetooth_a2dp_audio_route_name" msgid="4214648773120426288">"بلوتوث‌های صوتی"</string>
     <string name="wireless_display_route_description" msgid="8297563323032966831">"صفحه نمایش بی‌سیم"</string>
-    <string name="media_route_button_content_description" msgid="2299223698196869956">"فرستادن"</string>
+    <string name="media_route_button_content_description" msgid="2299223698196869956">"ارسال محتوا"</string>
     <string name="media_route_chooser_title" msgid="6646594924991269208">"برقراری ارتباط با دستگاه"</string>
-    <string name="media_route_chooser_title_for_remote_display" msgid="3105906508794326446">"فرستادن صفحه نمایش به دستگاه"</string>
-    <string name="media_route_chooser_searching" msgid="6119673534251329535">"در حال جستجو برای دستگاه‌ها..."</string>
+    <string name="media_route_chooser_title_for_remote_display" msgid="3105906508794326446">"فرستادن محتوای صفحه به دستگاه"</string>
+    <string name="media_route_chooser_searching" msgid="6119673534251329535">"درحال جستجوی دستگاه‌ها…"</string>
     <string name="media_route_chooser_extended_settings" msgid="2506352159381327741">"تنظیمات"</string>
     <string name="media_route_controller_disconnect" msgid="7362617572732576959">"قطع ارتباط"</string>
     <string name="media_route_status_scanning" msgid="8045156315309594482">"در حال اسکن کردن…"</string>
@@ -1791,8 +1794,8 @@
     <string name="confirm_battery_saver" msgid="5247976246208245754">"تأیید"</string>
     <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"‏برای افزایش عمر باتری، «بهینه‌سازی باتری»:\n «طرح زمینه تیره» را روشن می‌کند\n فعالیت پس‌زمینه، برخی جلوه‌های بصری، و دیگر ویژگی‌ها مانند «Ok Google» را خاموش یا محدود می‌کند\n\n"<annotation id="url">"بیشتر بدانید"</annotation></string>
     <string name="battery_saver_description" msgid="7618492104632328184">"‏برای افزایش عمر باتری، «بهینه‌سازی باتری»:\n «طرح زمینه تیره» را روشن می‌کند\n فعالیت پس‌زمینه، برخی جلوه‌های بصری، و دیگر ویژگی‌ها مانند «Ok Google» را خاموش یا محدود می‌کند"</string>
-    <string name="data_saver_description" msgid="4995164271550590517">"برای کمک به کاهش مصرف داده، «صرفه‌جویی داده» از ارسال و دریافت داده در پس‌زمینه ازطرف بعضی برنامه‌ها جلوگیری می‌کند. برنامه‌ای که درحال‌حاضر استفاده می‌کنید می‌تواند به داده‌ها دسترسی داشته باشد اما دفعات دسترسی آن محدود است.این یعنی، برای مثال، تصاویر تا زمانی که روی آن‌ها ضربه نزنید نشان داده نمی‌شوند."</string>
-    <string name="data_saver_enable_title" msgid="7080620065745260137">"صرفه‌جویی داده روشن شود؟"</string>
+    <string name="data_saver_description" msgid="4995164271550590517">"«صرفه‌جویی داده»، برای کمک به کاهش مصرف داده، از ارسال و دریافت داده در پس‌زمینه ازطرف بعضی برنامه‌ها جلوگیری می‌کند. برنامه‌ای که درحال‌حاضر استفاده می‌کنید می‌تواند به داده‌ها دسترسی داشته باشد اما دفعات دسترسی آن محدود است.این یعنی، برای مثال، تصاویر تازمانی‌که روی آن‌ها ضربه نزنید نشان داده نمی‌شوند."</string>
+    <string name="data_saver_enable_title" msgid="7080620065745260137">"«صرفه‌جویی داده» روشن شود؟"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"روشن کردن"</string>
     <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
       <item quantity="one">‏به مدت %1$d دقیقه (تا <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
@@ -2037,7 +2040,7 @@
     <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"کادر گفتگوی روشن/خاموش"</string>
     <string name="accessibility_system_action_toggle_split_screen_label" msgid="6626177163849387748">"تغییر وضعیت صفحهٔ دونیمه"</string>
     <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"صفحه قفل"</string>
-    <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"عکس صفحه‌نمایش"</string>
+    <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"نماگرفت"</string>
     <string name="accessibility_system_action_accessibility_menu_label" msgid="8436484650391125184">"منوی دسترس‌پذیری"</string>
     <string name="accessibility_freeform_caption" msgid="8377519323496290122">"نوار شرح <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> در سطل «محدودشده» قرار گرفت"</string>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index 315f7ea..2469327 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -191,7 +191,7 @@
     <string name="device_ownership_relinquished" msgid="4080886992183195724">"Järjestelmänvalvoja luovutti laitteen henkilökohtaiseen käyttöön"</string>
     <string name="network_logging_notification_title" msgid="554983187553845004">"Hallinnoitu laite"</string>
     <string name="network_logging_notification_text" msgid="1327373071132562512">"Organisaatiosi hallinnoi tätä laitetta ja voi tarkkailla verkkoliikennettä. Katso lisätietoja napauttamalla."</string>
-    <string name="location_changed_notification_title" msgid="3620158742816699316">"Sovellukset voivat käyttää sijaintiasi"</string>
+    <string name="location_changed_notification_title" msgid="3620158742816699316">"Sovelluksilla on pääsy sijaintiisi"</string>
     <string name="location_changed_notification_text" msgid="7158423339982706912">"Saat lisätietoja järjestelmänvalvojalta."</string>
     <string name="country_detector" msgid="7023275114706088854">"Maan tunnistin"</string>
     <string name="location_service" msgid="2439187616018455546">"Sijaintipalvelu"</string>
@@ -1307,7 +1307,7 @@
     <string name="usb_unsupported_audio_accessory_title" msgid="2335775548086533065">"Analoginen äänilaite havaittu"</string>
     <string name="usb_unsupported_audio_accessory_message" msgid="1300168007129796621">"Liitetty laite ei ole yhteensopiva puhelimen kanssa. Napauta, niin näet lisätietoja."</string>
     <string name="adb_active_notification_title" msgid="408390247354560331">"USB-vianetsintä yhdistetty"</string>
-    <string name="adb_active_notification_message" msgid="5617264033476778211">"Poista USB-virheenkorjaus käytöstä napauttamalla"</string>
+    <string name="adb_active_notification_message" msgid="5617264033476778211">"Laita USB-vianetsintä pois päältä napauttamalla"</string>
     <string name="adb_active_notification_message" product="tv" msgid="6624498401272780855">"Poista USB-vianetsintä käytöstä valitsemalla tämä."</string>
     <string name="adbwifi_active_notification_title" msgid="6147343659168302473">"Langaton virheenkorjaus yhdistetty"</string>
     <string name="adbwifi_active_notification_message" msgid="930987922852867972">"Poista langaton virheenkorjaus käytöstä napauttamalla"</string>
@@ -1327,7 +1327,7 @@
     <string name="share_remote_bugreport_action" msgid="7630880678785123682">"JAA"</string>
     <string name="decline_remote_bugreport_action" msgid="4040894777519784346">"HYLKÄÄ"</string>
     <string name="select_input_method" msgid="3971267998568587025">"Valitse syöttötapa"</string>
-    <string name="show_ime" msgid="6406112007347443383">"Pidä näytöllä, kun fyysinen näppäimistö on aktiivinen."</string>
+    <string name="show_ime" msgid="6406112007347443383">"Pidä näytöllä, kun fyysinen näppäimistö on aktiivinen"</string>
     <string name="hardware" msgid="1800597768237606953">"Näytä virtuaalinen näppäimistö"</string>
     <string name="select_keyboard_layout_notification_title" msgid="4427643867639774118">"Määritä fyysinen näppäimistö"</string>
     <string name="select_keyboard_layout_notification_message" msgid="8835158247369158154">"Valitse kieli ja asettelu koskettamalla."</string>
@@ -1457,6 +1457,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"Pyytänyt <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"Kyllä"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"Ei"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"Hätätilanteen sijainti nähty"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"Laitteesi valmistaja näki sijaintisi viimeaikaisen hätätilanteen aikana"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"Operaattori näki sijaintisi viimeaikaisen hätätilanteen aikana"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"Poistoraja ylittynyt"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"Tilin <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> synkronointityypissä <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g> on <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> poistettua kohdetta. Mitä tehdään?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"Poista kohteet"</string>
@@ -1828,7 +1831,7 @@
     </plurals>
     <string name="zen_mode_until" msgid="2250286190237669079">"Kunnes kello on <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
     <string name="zen_mode_alarm" msgid="7046911727540499275">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> asti (seuraava hälytys)"</string>
-    <string name="zen_mode_forever" msgid="740585666364912448">"Kunnes poistat sen käytöstä"</string>
+    <string name="zen_mode_forever" msgid="740585666364912448">"Kunnes laitat pois päältä"</string>
     <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"Kunnes poistat Varattu-tilan käytöstä."</string>
     <string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
     <string name="toolbar_collapse_description" msgid="8009920446193610996">"Kutista"</string>
@@ -1909,7 +1912,7 @@
     <string name="conference_call" msgid="5731633152336490471">"Puhelinneuvottelu"</string>
     <string name="tooltip_popup_title" msgid="7863719020269945722">"Työkaluvinkki"</string>
     <string name="app_category_game" msgid="4534216074910244790">"Pelit"</string>
-    <string name="app_category_audio" msgid="8296029904794676222">"Musiikki ja audio"</string>
+    <string name="app_category_audio" msgid="8296029904794676222">"Musiikki ja ääni"</string>
     <string name="app_category_video" msgid="2590183854839565814">"Elokuvat ja videot"</string>
     <string name="app_category_image" msgid="7307840291864213007">"Kuvat ja valokuvat"</string>
     <string name="app_category_social" msgid="2278269325488344054">"Some ja viestintä"</string>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index 6198d0e..38f9c6a 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -798,7 +798,7 @@
     <string name="relationTypeAssistant" msgid="4057605157116589315">"Assistant"</string>
     <string name="relationTypeBrother" msgid="7141662427379247820">"Frère"</string>
     <string name="relationTypeChild" msgid="9076258911292693601">"Enfant"</string>
-    <string name="relationTypeDomesticPartner" msgid="7825306887697559238">"Compagne/Compagnon"</string>
+    <string name="relationTypeDomesticPartner" msgid="7825306887697559238">"Compagnon/Compagne"</string>
     <string name="relationTypeFather" msgid="3856225062864790596">"Père"</string>
     <string name="relationTypeFriend" msgid="3192092625893980574">"Ami(e)"</string>
     <string name="relationTypeManager" msgid="2272860813153171857">"Gestionnaire"</string>
@@ -1457,6 +1457,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"Demande de <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"Oui"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"Non"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"Accès d\'urgence à la position"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"Le fabricant de votre appareil a accédé à votre position durant une session d\'urgence récente"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"Votre fournisseur de services a accédé à votre position durant une session d\'urgence récente"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"Le nombre maximal de suppressions a été atteint."</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"<xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> éléments vont être supprimés lors de la synchronisation <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g> pour le compte <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>. Voulez-vous continuer?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"Supprimer les éléments"</string>
@@ -1789,10 +1792,10 @@
     <string name="package_updated_device_owner" msgid="7560272363805506941">"Mise à jour par votre administrateur"</string>
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"Supprimé par votre administrateur"</string>
     <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
-    <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"Pour prolonger l\'autonomie de la pile, l\'économiseur de pile effectue les actions suivantes :\n·Activer le thème sombre\n·Désactiver ou limiter l\'activité en arrière-plan, certains effets visuels et d\'autres fonctionnalités, comme « Hey Google »\n\n"<annotation id="url">"En savoir plus"</annotation></string>
-    <string name="battery_saver_description" msgid="7618492104632328184">"Pour prolonger l\'autonomie de la pile, l\'économiseur de pile effectue les actions suivantes :\n·Activer le thème sombre\n·Désactiver ou limiter l\'activité en arrière-plan, certains effets visuels et d\'autres fonctionnalités, comme « Hey Google »"</string>
-    <string name="data_saver_description" msgid="4995164271550590517">"Pour aider à diminuer l\'utilisation des données, la fonction Économiseur de données empêche certaines applications d\'envoyer ou de recevoir des données en arrière-plan. Une application que vous utilisez actuellement peut accéder à des données, mais peut le faire moins souvent. Cela peut signifier, par exemple, que les images ne s\'affichent pas jusqu\'à ce que vous les touchiez."</string>
-    <string name="data_saver_enable_title" msgid="7080620065745260137">"Activer l\'Économiseur de données?"</string>
+    <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"Pour prolonger l\'autonomie de la pile, l\'économiseur de pile effectue les actions suivantes :\n·Activer le thème sombre\n·Désactiver ou limiter l\'activité en arrière-plan, certains effets visuels et d\'autres fonctionnalités, comme « Ok Google »\n\n"<annotation id="url">"En savoir plus"</annotation></string>
+    <string name="battery_saver_description" msgid="7618492104632328184">"Pour prolonger l\'autonomie de la pile, l\'économiseur de pile effectue les actions suivantes :\n·Active le thème sombre\n·Désactive ou limite l\'activité en arrière-plan, certains effets visuels et d\'autres fonctionnalités, comme « Ok Google »"</string>
+    <string name="data_saver_description" msgid="4995164271550590517">"Pour aider à diminuer l\'utilisation des données, la fonctionnalité Économiseur de données empêche certaines applications d\'envoyer ou de recevoir des données en arrière-plan. Une application que vous utilisez actuellement peut accéder à des données, mais peut le faire moins souvent. Cela peut signifier, par exemple, que les images ne s\'affichent pas jusqu\'à ce que vous les touchiez."</string>
+    <string name="data_saver_enable_title" msgid="7080620065745260137">"Activer l\'économiseur de données?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Activer"</string>
     <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
       <item quantity="one">Pendant %1$d minute (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
@@ -2026,7 +2029,7 @@
       <item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> fichier</item>
       <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> fichiers</item>
     </plurals>
-    <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Aucune recommandation de personne pour le partage direct"</string>
+    <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Aucune recommandation de personnes avec lesquelles effectuer un partage"</string>
     <string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Liste des applications"</string>
     <string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Cette application n\'a pas été autorisée à effectuer des enregistrements, mais elle pourrait capturer du contenu audio par l\'intermédiaire de cet appareil USB."</string>
     <string name="accessibility_system_action_home_label" msgid="3234748160850301870">"Accueil"</string>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index 3708d3a..86facd4 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -242,7 +242,7 @@
     <string name="global_action_emergency" msgid="1387617624177105088">"Urgences"</string>
     <string name="global_action_bug_report" msgid="5127867163044170003">"Rapport de bug"</string>
     <string name="global_action_logout" msgid="6093581310002476511">"Fermer la session"</string>
-    <string name="global_action_screenshot" msgid="2610053466156478564">"Capture"</string>
+    <string name="global_action_screenshot" msgid="2610053466156478564">"Capture d\'écran"</string>
     <string name="bugreport_title" msgid="8549990811777373050">"Rapport de bug"</string>
     <string name="bugreport_message" msgid="5212529146119624326">"Cela permet de recueillir des informations concernant l\'état actuel de votre appareil. Ces informations sont ensuite envoyées sous forme d\'e-mail. Merci de patienter pendant la préparation du rapport de bug. Cette opération peut prendre quelques instants."</string>
     <string name="bugreport_option_interactive_title" msgid="7968287837902871289">"Rapport interactif"</string>
@@ -800,15 +800,15 @@
     <string name="relationTypeChild" msgid="9076258911292693601">"Enfant"</string>
     <string name="relationTypeDomesticPartner" msgid="7825306887697559238">"Concubin"</string>
     <string name="relationTypeFather" msgid="3856225062864790596">"Père"</string>
-    <string name="relationTypeFriend" msgid="3192092625893980574">"Ami"</string>
+    <string name="relationTypeFriend" msgid="3192092625893980574">"Ami(e)"</string>
     <string name="relationTypeManager" msgid="2272860813153171857">"Responsable"</string>
     <string name="relationTypeMother" msgid="2331762740982699460">"Mère"</string>
-    <string name="relationTypeParent" msgid="4177920938333039882">"Parent"</string>
-    <string name="relationTypePartner" msgid="4018017075116766194">"Partenaire"</string>
-    <string name="relationTypeReferredBy" msgid="5285082289602849400">"Recommandé par"</string>
+    <string name="relationTypeParent" msgid="4177920938333039882">"Parent(e)"</string>
+    <string name="relationTypePartner" msgid="4018017075116766194">"Conjoint(e)"</string>
+    <string name="relationTypeReferredBy" msgid="5285082289602849400">"Parrain(ne)"</string>
     <string name="relationTypeRelative" msgid="3396498519818009134">"Proche"</string>
     <string name="relationTypeSister" msgid="3721676005094140671">"Sœur"</string>
-    <string name="relationTypeSpouse" msgid="6916682664436031703">"Conjoint"</string>
+    <string name="relationTypeSpouse" msgid="6916682664436031703">"Époux(se)"</string>
     <string name="sipAddressTypeCustom" msgid="6283889809842649336">"Personnalisée"</string>
     <string name="sipAddressTypeHome" msgid="5918441930656878367">"Domicile"</string>
     <string name="sipAddressTypeWork" msgid="7873967986701216770">"Professionnelle"</string>
@@ -1457,6 +1457,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"Demande de <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"Oui"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"Non"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"Accès à la localisation d\'urgence"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"Le fabricant de votre appareil a accédé à votre position récemment lors d\'une situation d\'urgence"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"Votre opérateur a accédé à votre position récemment lors d\'une situation d\'urgence"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"Le nombre maximal de suppressions a été atteint."</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"<xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> éléments vont être supprimés lors de la synchronisation <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g> pour le compte <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>. Que voulez-vous faire ?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"Supprimer les éléments"</string>
@@ -1789,8 +1792,8 @@
     <string name="package_updated_device_owner" msgid="7560272363805506941">"Mis à jour par votre administrateur"</string>
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"Supprimé par votre administrateur"</string>
     <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
-    <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"Pour prolonger l\'autonomie de la batterie, l\'économiseur de batterie :\n· active le thème sombre ;\n· désactive ou restreint les activités en arrière-plan, certains effet visuels et d\'autres fonctionnalités, comme \"Ok Google\".\n\n"<annotation id="url">"En savoir plus"</annotation></string>
-    <string name="battery_saver_description" msgid="7618492104632328184">"Pour prolonger l\'autonomie de la batterie, l\'économiseur de batterie :\n· active le thème sombre ;\n· désactive ou restreint les activités en arrière-plan, certains effet visuels et d\'autres fonctionnalités, comme \"Ok Google\"."</string>
+    <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"Pour prolonger l\'autonomie de la batterie, l\'économiseur de batterie :\n· active le thème sombre ;\n· désactive ou restreint les activités en arrière-plan, certains effets visuels et d\'autres fonctionnalités, comme \"Ok Google\".\n\n"<annotation id="url">"En savoir plus"</annotation></string>
+    <string name="battery_saver_description" msgid="7618492104632328184">"Pour prolonger l\'autonomie de la batterie, l\'économiseur de batterie :\n· active le thème sombre ;\n· désactive ou restreint les activités en arrière-plan, certains effets visuels et d\'autres fonctionnalités, comme \"Ok Google\"."</string>
     <string name="data_saver_description" msgid="4995164271550590517">"Pour réduire la consommation de données, l\'économiseur de données empêche certaines applications d\'envoyer ou de recevoir des données en arrière-plan. Ainsi, les applications que vous utilisez peuvent toujours accéder aux données, mais pas en permanence. Par exemple, il se peut que les images ne s\'affichent pas tant que vous n\'appuyez pas dessus."</string>
     <string name="data_saver_enable_title" msgid="7080620065745260137">"Activer l\'économiseur de données ?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Activer"</string>
@@ -2026,7 +2029,7 @@
       <item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> fichier</item>
       <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> fichiers</item>
     </plurals>
-    <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Aucune personne trouvée pour le partage direct"</string>
+    <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Aucune recommandation de personnes avec lesquelles effectuer un partage"</string>
     <string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Liste des applications"</string>
     <string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Cette application n\'a pas reçu l\'autorisation d\'enregistrer des contenus audio, mais peut le faire via ce périphérique USB."</string>
     <string name="accessibility_system_action_home_label" msgid="3234748160850301870">"Accueil"</string>
diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml
index 7f621ca..c7cdd13 100644
--- a/core/res/res/values-gl/strings.xml
+++ b/core/res/res/values-gl/strings.xml
@@ -1457,6 +1457,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"Solicitado por <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"Si"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"Non"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"Localización: accedeuse nunha emerxencia"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"O fabricante do teu dispositivo accedeu á túa localización durante unha sesión de emerxencia recente"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"O teu operador accedeu á túa localización durante unha sesión de emerxencia recente"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"Superouse o límite de elementos eliminados"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"Hai <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> elementos eliminados de <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>, conta <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>. Que queres facer?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"Eliminar os elementos"</string>
diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml
index fa88ebc..07e14fe 100644
--- a/core/res/res/values-gu/strings.xml
+++ b/core/res/res/values-gu/strings.xml
@@ -1457,6 +1457,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"<xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>) દ્વારા વિનંતી કરાઈ"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"હા"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"નહીં"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"ઇમર્જન્સી સમયના સ્થાનને ઍક્સેસ કર્યુ"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"તાજેતરના ઇમર્જન્સી સેશન દરમ્યાન તમારા ડિવાઇસ નિર્માતાએ તમારા સ્થાનને ઍક્સેસ કર્યુ હતું"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"તાજેતરના ઇમર્જન્સી સેશન દરમ્યાન તમારા મોબાઇલ ઑપરેટરે તમારા સ્થાનને ઍક્સેસ કર્યુ હતું"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"કાઢી નાખવાની સીમા ઓળંગાઈ"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"<xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>, એકાઉન્ટ <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> માટે <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> કાઢી નાખેલ આઇટમ્સ છે. તમે શું કરવા માગો છો?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"આઇટમ્સ કાઢી નાખો"</string>
@@ -1558,8 +1561,8 @@
     <string name="wireless_display_route_description" msgid="8297563323032966831">"વાયરલેસ ડિસ્પ્લે"</string>
     <string name="media_route_button_content_description" msgid="2299223698196869956">"કાસ્ટ કરો"</string>
     <string name="media_route_chooser_title" msgid="6646594924991269208">"ઉપકરણ સાથે કનેક્ટ કરો"</string>
-    <string name="media_route_chooser_title_for_remote_display" msgid="3105906508794326446">"ઉપકરણ પર સ્ક્રીન કાસ્ટ કરો"</string>
-    <string name="media_route_chooser_searching" msgid="6119673534251329535">"ઉપકરણો માટે શોધી રહ્યું છે…"</string>
+    <string name="media_route_chooser_title_for_remote_display" msgid="3105906508794326446">"ડિવાઇસ પર સ્ક્રીન કાસ્ટ કરો"</string>
+    <string name="media_route_chooser_searching" msgid="6119673534251329535">"ડિવાઇસ શોધી રહ્યું છે…"</string>
     <string name="media_route_chooser_extended_settings" msgid="2506352159381327741">"સેટિંગ"</string>
     <string name="media_route_controller_disconnect" msgid="7362617572732576959">"ડિસ્કનેક્ટ કરો"</string>
     <string name="media_route_status_scanning" msgid="8045156315309594482">"સ્કેન કરી રહ્યું છે..."</string>
@@ -1791,7 +1794,7 @@
     <string name="confirm_battery_saver" msgid="5247976246208245754">"ઓકે"</string>
     <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"બૅટરીની આવરદા વધારવા માટે, બૅટરી સેવર:\n·ઘેરી થીમ ચાલુ કરે છે\n·બૅકગ્રાઉન્ડ પ્રવૃત્તિ, અમુક વિઝ્યુઅલ ઇફેક્ટ અને “હેય Google” જેવી અન્ય સુવિધાઓ બંધ અથવા પ્રતિબંધિત કરે છે\n\n"<annotation id="url">"વધુ જાણો"</annotation></string>
     <string name="battery_saver_description" msgid="7618492104632328184">"બૅટરીની આવરદા વધારવા માટે, બૅટરી સેવર:\n·ઘેરી થીમ ચાલુ કરે છે\n·બૅકગ્રાઉન્ડ પ્રવૃત્તિ, અમુક વિઝ્યુઅલ ઇફેક્ટ અને “હેય Google” જેવી અન્ય સુવિધાઓ બંધ અથવા પ્રતિબંધિત કરે છે"</string>
-    <string name="data_saver_description" msgid="4995164271550590517">"ડેટા વપરાશને ઘટાડવામાં સહાય માટે, ડેટા સેવર કેટલીક ઍપ્લિકેશનોને પૃષ્ઠભૂમિમાં ડેટા મોકલવા અથવા પ્રાપ્ત કરવાથી અટકાવે છે. તમે હાલમાં ઉપયોગ કરી રહ્યાં છો તે ઍપ્લિકેશન ડેટાને ઍક્સેસ કરી શકે છે, પરંતુ તે આ ક્યારેક જ કરી શકે છે. આનો અર્થ એ હોઈ શકે છે, ઉદાહરણ તરીકે, છબીઓ ત્યાં સુધી પ્રદર્શિત થશે નહીં જ્યાં સુધી તમે તેને ટૅપ નહીં કરો."</string>
+    <string name="data_saver_description" msgid="4995164271550590517">"ડેટા વપરાશને ઘટાડવામાં સહાય માટે, ડેટા સેવર કેટલીક ઍપને બૅકગ્રાઉન્ડમાં ડેટા મોકલવા અથવા પ્રાપ્ત કરવાથી અટકાવે છે. તમે હાલમાં ઉપયોગ કરી રહ્યાં છો તે ઍપ ડેટાને ઍક્સેસ કરી શકે છે, પરંતુ તે આ ક્યારેક જ કરી શકે છે. આનો અર્થ એ હોઈ શકે છે, ઉદાહરણ તરીકે, છબીઓ ત્યાં સુધી પ્રદર્શિત થશે નહીં જ્યાં સુધી તમે તેને ટૅપ નહીં કરો."</string>
     <string name="data_saver_enable_title" msgid="7080620065745260137">"ડેટા સેવર ચાલુ કરીએ?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"ચાલુ કરો"</string>
     <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
@@ -1909,7 +1912,7 @@
     <string name="conference_call" msgid="5731633152336490471">"કોન્ફરન્સ કૉલ"</string>
     <string name="tooltip_popup_title" msgid="7863719020269945722">"ટૂલટિપ"</string>
     <string name="app_category_game" msgid="4534216074910244790">"રમતો"</string>
-    <string name="app_category_audio" msgid="8296029904794676222">"સંગીત અને ઑડિઓ"</string>
+    <string name="app_category_audio" msgid="8296029904794676222">"સંગીત અને ઑડિયો"</string>
     <string name="app_category_video" msgid="2590183854839565814">"મૂવી અને વીડિઓ"</string>
     <string name="app_category_image" msgid="7307840291864213007">"ફોટો અને છબીઓ"</string>
     <string name="app_category_social" msgid="2278269325488344054">"સામાજિક અને સંચાર"</string>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index ca9ad67..ee4741c 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -1457,6 +1457,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"<xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>) द्वारा अनुरोधित"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"हां"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"नहीं"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"आपातकालीन स्थिति में जगह की जानकारी ऐक्सेस की गई"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"हाल ही में हुए आपातकालीन स्थिति के दौरान, डिवाइस बनाने वाली कंपनी ने आपकी जगह की जानकारी को ऐक्सेस किया"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"हाल ही में आपातकालीन स्थिति के दौरान, मोबाइल और इंटरनेट सेवा देने वाली कंपनी ने आपकी जगह की जानकारी को ऐक्सेस किया"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"हटाने की सीमा पार हो गई"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"<xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>, <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> खाते के <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> आइटम हटा दिए गए हैं. आप क्‍या करना चाहते हैं?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"आइटम मिटाएं"</string>
@@ -1790,8 +1793,8 @@
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"आपके व्यवस्थापक ने हटा दिया है"</string>
     <string name="confirm_battery_saver" msgid="5247976246208245754">"ठीक है"</string>
     <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"बैटरी लाइफ़ बढ़ाने के लिए बैटरी सेवर:\n·गहरे रंग वाली थीम चालू करता है\n·बैकग्राउंड की गतिविधि, कुछ विज़ुअल इफ़ेक्ट, और \"Hey Google\" जैसी दूसरी सुविधाएं इस्तेमाल करने से रोकता है या बंद करता है\n\n"<annotation id="url">"ज़्यादा जानें"</annotation></string>
-    <string name="battery_saver_description" msgid="7618492104632328184">"बैटरी लाइफ़ बढ़ाने के लिए, बैटरी सेवर:\n गहरे रंग वाली थीम चालू करता है\nबैकग्राउंड की गतिविधि, कुछ विज़ुअल इफ़ेक्ट, और \"Hey Google\" जैसी दूसरी सुविधाएं इस्तेमाल करने से रोकता है या बंद करता है"</string>
-    <string name="data_saver_description" msgid="4995164271550590517">"डेटा खर्च, कम करने के लिए डेटा सेवर कुछ ऐप्लिकेशन को बैकग्राउंड में डेटा भेजने या डेटा पाने से रोकता है. आप फ़िलहाल जिस ऐप्लिकेशन का इस्तेमाल कर रहे हैं वह डेटा तक पहुंच सकता है लेकिन ऐसा कभी-कभी ही हो पाएगा. उदाहरण के लिए, इमेज तब तक दिखाई नहीं देंगी जब तक कि आप उन्हें टैप नहीं करते."</string>
+    <string name="battery_saver_description" msgid="7618492104632328184">"बैटरी लाइफ़ बढ़ाने के लिए, बैटरी सेवर:\n गहरे रंग वाली थीम चालू करता है\nबैकग्राउंड की गतिविधि, कुछ विज़ुअल इफ़ेक्ट, और \"Hey Google\" जैसी दूसरी सुविधाओं को रोकता या बंद करता है"</string>
+    <string name="data_saver_description" msgid="4995164271550590517">"डेटा खर्च को कम करने के लिए, डेटा सेवर कुछ ऐप्लिकेशन को बैकग्राउंड में डेटा भेजने या डेटा पाने से रोकता है. फ़िलहाल, आप जिस ऐप्लिकेशन का इस्तेमाल कर रहे हैं वह डेटा ऐक्सेस कर सकता है, लेकिन ऐसा कभी-कभी ही हो पाएगा. उदाहरण के लिए, इमेज तब तक दिखाई नहीं देंगी जब तक कि आप उन पर टैप नहीं करते."</string>
     <string name="data_saver_enable_title" msgid="7080620065745260137">"डेटा बचाने की सेटिंग चालू करें?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"चालू करें"</string>
     <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index 4dab599..b446c27 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -1478,6 +1478,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"Zatražio <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"Da"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"Ne"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"Pristup lokaciji tijekom hitnog slučaja"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"Proizvođač vašeg uređaja pristupio je vašoj lokaciji tijekom nedavne hitne sesije"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"Vaš mobilni operater pristupio je vašoj lokaciji tijekom nedavne hitne sesije"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"Prekoračeno je ograničenje za brisanje"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"Postoji sljedeći broj izbrisanih stavki: <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> za vrstu sinkronizacije <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g> i račun <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>. Što želite učiniti?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"Izbriši ove stavke"</string>
@@ -1813,9 +1816,9 @@
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"Izbrisao administrator"</string>
     <string name="confirm_battery_saver" msgid="5247976246208245754">"U redu"</string>
     <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"Da bi se produljilo trajanje baterije, Štednja baterije:\n·Uključuje Tamnu temu.\n·Isključuje ili ograničava aktivnosti u pozadini, neke vizualne efekte i druge značajke kao što je \"Hey Google\".\n\n"<annotation id="url">"Saznajte više"</annotation></string>
-    <string name="battery_saver_description" msgid="7618492104632328184">"Da bi se produljilo trajanje baterije, Štednja baterije:\n·Uključuje Tamnu temu.\n·Isključuje ili ograničava aktivnosti u pozadini, neke vizualne efekte i druge značajke kao što je \"Hey Google\"."</string>
+    <string name="battery_saver_description" msgid="7618492104632328184">"Da bi se produljilo trajanje baterije, Štednja baterije:\n·uključuje Tamnu temu\n·isključuje ili ograničava aktivnosti u pozadini, neke vizualne efekte i druge značajke kao što je \"Hey Google\"."</string>
     <string name="data_saver_description" msgid="4995164271550590517">"Da bi se smanjio podatkovni promet, značajka Štednja podatkovnog prometa onemogućuje nekim aplikacijama slanje ili primanje podataka u pozadini. Aplikacija koju trenutačno upotrebljavate može pristupiti podacima, no možda će to činiti rjeđe. To može značiti da se, na primjer, slike neće prikazivati dok ih ne dodirnete."</string>
-    <string name="data_saver_enable_title" msgid="7080620065745260137">"Uključiti Uštedu podataka?"</string>
+    <string name="data_saver_enable_title" msgid="7080620065745260137">"Uključiti Štednju podatkovnog prometa?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Uključi"</string>
     <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
       <item quantity="one">%1$d minutu (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index a2eac83..1795315 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -1457,6 +1457,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"Igénylő <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"Igen"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"Nem"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"Vészhelyzeti helyadat-hozzáférés"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"Eszköze gyártója hozzáfért a helyadataihoz egy közelmúltbeli vészhelyzet során"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"Szolgáltatója hozzáfért a helyadataihoz egy közelmúltbeli vészhelyzet során"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"A szinkronizálás elérte a törlésre vonatkozó korlátot"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"<xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> törölt elem van a(z) (<xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>) <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> fióknál. Mit szeretne tenni?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"Az elemek törlése"</string>
@@ -1791,7 +1794,7 @@
     <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
     <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"Az Akkumulátorkímélő mód az akkumulátor üzemidejének növelése érdekében a következőket teszi:\n Bekapcsolja a sötét témát.\n Kikapcsolja vagy korlátozza a háttérben futó tevékenységeket, egyes vizuális effekteket, az „Ok Google” parancsot és egyéb funkciókat.\n\n"<annotation id="url">"További információ"</annotation>"."</string>
     <string name="battery_saver_description" msgid="7618492104632328184">"Az Akkumulátorkímélő mód az akkumulátor üzemidejének növelése érdekében a következőket teszi:\n Bekapcsolja a sötét témát.\n Kikapcsolja vagy korlátozza a háttérben futó tevékenységeket, egyes vizuális effekteket, az „Ok Google” parancsot és egyéb funkciókat."</string>
-    <string name="data_saver_description" msgid="4995164271550590517">"Az adatforgalom csökkentése érdekében az Adatforgalom-csökkentő megakadályozza, hogy egyes alkalmazások adatokat küldjenek vagy fogadjanak a háttérben. Az Ön által aktuálisan használt alkalmazások hozzáférhetnek az adatokhoz, de csak ritkábban. Ez például azt jelentheti, hogy a képek csak rákoppintás után jelennek meg."</string>
+    <string name="data_saver_description" msgid="4995164271550590517">"Az adatforgalom csökkentése érdekében az Adatforgalom-csökkentő megakadályozza, hogy egyes alkalmazások adatokat küldjenek vagy fogadjanak a háttérben. Az Ön által jelenleg használt alkalmazások hozzáférhetnek az adatokhoz, de csak ritkábban. Ez például azt jelentheti, hogy a képek csak rákoppintás után jelennek meg."</string>
     <string name="data_saver_enable_title" msgid="7080620065745260137">"Bekapcsolja az Adatforgalom-csökkentőt?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Bekapcsolás"</string>
     <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml
index 8ca3176..441a2ee 100644
--- a/core/res/res/values-hy/strings.xml
+++ b/core/res/res/values-hy/strings.xml
@@ -1457,6 +1457,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"<xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)-ի հարցումով"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"Այո"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"Ոչ"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"Օգտագործվել են տեղադրության տվյալները"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"Ձեր սարքի արտադրողը վերջին շտապ կանչի ժամանակ օգտագործել է ձեր տեղադրության մասին տվյալները"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"Ձեր օպերատորը վերջին շտապ կանչի ժամանակ օգտագործել է ձեր տեղադրության մասին տվյալները"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"Ջնջելու սահմանը գերազանցվել է"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"<xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> ջնջված տարր կա <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>-ի համար, <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>-ի հաշիվ: Ի՞նչ եք ցանկանում անել:"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"Ջնջել տարրերը"</string>
@@ -1558,7 +1561,7 @@
     <string name="wireless_display_route_description" msgid="8297563323032966831">"Անլար էկրան"</string>
     <string name="media_route_button_content_description" msgid="2299223698196869956">"Հեռարձակում"</string>
     <string name="media_route_chooser_title" msgid="6646594924991269208">"Միանալ սարքին"</string>
-    <string name="media_route_chooser_title_for_remote_display" msgid="3105906508794326446">"Հեռարձակել էկրանը սարքի վրա"</string>
+    <string name="media_route_chooser_title_for_remote_display" msgid="3105906508794326446">"Էկրանը հեռարձակել սարքին"</string>
     <string name="media_route_chooser_searching" msgid="6119673534251329535">"Որոնվում են սարքեր..."</string>
     <string name="media_route_chooser_extended_settings" msgid="2506352159381327741">"Կարգավորումներ"</string>
     <string name="media_route_controller_disconnect" msgid="7362617572732576959">"Անջատել"</string>
@@ -1789,9 +1792,9 @@
     <string name="package_updated_device_owner" msgid="7560272363805506941">"Թարմացվել է ձեր ադմինիստրատորի կողմից"</string>
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"Ջնջվել է ձեր ադմինիստրատորի կողմից"</string>
     <string name="confirm_battery_saver" msgid="5247976246208245754">"Եղավ"</string>
-    <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"Մարտկոցի աշխատաժամանակը երկարացնելու համար «Մարտկոցի տնտեսում» գործառույթը՝\n·միացնում է մուգ թեման,\n·անջատում կամ սահմանափակում է աշխատանքը ֆոնային ռեժիմում, որոշ տեսողական էֆեկտներ և այլ գործառույթներ, օրինակ «OK Google» հրահանգը:\n\n"<annotation id="url">"Իմանալ ավելին"</annotation></string>
-    <string name="battery_saver_description" msgid="7618492104632328184">"Մարտկոցի աշխատաժամանակը երկարացնելու համար «Մարտկոցի տնտեսում» գործառույթը՝\n·միացնում է մուգ թեման,\n·անջատում կամ սահմանափակում է աշխատանքը ֆոնային ռեժիմում, որոշ տեսողական էֆեկտներ և այլ գործառույթներ, օրինակ «OK Google» հրահանգը:"</string>
-    <string name="data_saver_description" msgid="4995164271550590517">"Թրաֆիկի տնտեսման ռեժիմում որոշ հավելվածների համար ֆոնային փոխանցումն անջատված է։ Հավելվածը, որն օգտագործում եք, կարող է տվյալներ փոխանցել և ստանալ, սակայն ոչ այնքան հաճախ: Օրինակ՝ պատկերները կցուցադրվեն միայն դրանց վրա սեղմելուց հետո։"</string>
+    <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"Մարտկոցի աշխատաժամանակը երկարացնելու համար «Մարտկոցի տնտեսում» գործառույթը\n·միացնում է մուգ թեման,\n·անջատում կամ սահմանափակում է աշխատանքը ֆոնային ռեժիմում, որոշ վիզուալ էֆեկտներ և այլ գործառույթներ, օրինակ «OK Google» հրահանգը:\n\n"<annotation id="url">"Իմանալ ավելին"</annotation></string>
+    <string name="battery_saver_description" msgid="7618492104632328184">"Մարտկոցի աշխատաժամանակը երկարացնելու համար «Մարտկոցի տնտեսում» գործառույթը\n·միացնում է մուգ թեման,\n·անջատում կամ սահմանափակում է աշխատանքը ֆոնային ռեժիմում, որոշ վիզուալ էֆեկտներ և այլ գործառույթներ, օրինակ «OK Google» հրահանգը:"</string>
+    <string name="data_saver_description" msgid="4995164271550590517">"Թրաֆիկի տնտեսման ռեժիմում որոշ հավելվածների համար տվյալների ֆոնային փոխանցումն անջատված է։ Հավելվածը, որն օգտագործում եք, կարող է տվյալներ փոխանցել և ստանալ, սակայն ոչ այնքան հաճախ: Օրինակ՝ պատկերները կցուցադրվեն միայն դրանց վրա սեղմելուց հետո։"</string>
     <string name="data_saver_enable_title" msgid="7080620065745260137">"Միացնե՞լ թրաֆիկի խնայումը:"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Միացնել"</string>
     <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index 9f3c5a7..b6ff57b 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -212,7 +212,7 @@
     <string name="turn_on_radio" msgid="2961717788170634233">"Hidupkan nirkabel"</string>
     <string name="turn_off_radio" msgid="7222573978109933360">"Matikan nirkabel"</string>
     <string name="screen_lock" msgid="2072642720826409809">"Kunci layar"</string>
-    <string name="power_off" msgid="4111692782492232778">"Matikan perangkat"</string>
+    <string name="power_off" msgid="4111692782492232778">"Matikan"</string>
     <string name="silent_mode_silent" msgid="5079789070221150912">"Pendering mati"</string>
     <string name="silent_mode_vibrate" msgid="8821830448369552678">"Pendering bergetar"</string>
     <string name="silent_mode_ring" msgid="6039011004781526678">"Pendering nyala"</string>
@@ -236,7 +236,7 @@
     <string name="global_actions" product="tv" msgid="3871763739487450369">"Opsi Android TV"</string>
     <string name="global_actions" product="default" msgid="6410072189971495460">"Opsi telepon"</string>
     <string name="global_action_lock" msgid="6949357274257655383">"Kunci layar"</string>
-    <string name="global_action_power_off" msgid="4404936470711393203">"Matikan perangkat"</string>
+    <string name="global_action_power_off" msgid="4404936470711393203">"Matikan"</string>
     <string name="global_action_power_options" msgid="1185286119330160073">"Daya"</string>
     <string name="global_action_restart" msgid="4678451019561687074">"Mulai ulang"</string>
     <string name="global_action_emergency" msgid="1387617624177105088">"Darurat"</string>
@@ -510,7 +510,7 @@
     <string name="permdesc_changeWimaxState" product="tablet" msgid="4011097664859480108">"Memungkinkan aplikasi menyambungkan tablet ke dan memutus tablet dari jaringan WiMAX."</string>
     <string name="permdesc_changeWimaxState" product="tv" msgid="5373274458799425276">"Mengizinkan aplikasi menghubungkan perangkat Android TV ke, dan memutuskan hubungan perangkat Android TV dari, jaringan WiMAX."</string>
     <string name="permdesc_changeWimaxState" product="default" msgid="1551666203780202101">"Memungkinkan aplikasi menyambungkan ponsel ke dan memutus ponsel dari jaringan WiMAX."</string>
-    <string name="permlab_bluetooth" msgid="586333280736937209">"sandingkan dengan perangkat Bluetooth"</string>
+    <string name="permlab_bluetooth" msgid="586333280736937209">"sambungkan dengan perangkat Bluetooth"</string>
     <string name="permdesc_bluetooth" product="tablet" msgid="3053222571491402635">"Memungkinkan aplikasi melihat konfigurasi Bluetooth di tablet, dan membuat serta menerima sambungan dengan perangkat yang disandingkan."</string>
     <string name="permdesc_bluetooth" product="tv" msgid="8851534496561034998">"Mengizinkan aplikasi melihat konfigurasi Bluetooth di perangkat Android TV, serta melakukan dan menerima sambungan dengan perangkat yang tersambung."</string>
     <string name="permdesc_bluetooth" product="default" msgid="2779606714091276746">"Memungkinkan aplikasi melihat konfigurasi Bluetooth di ponsel, dan membuat serta menerima sambungan dengan perangkat yang disandingkan."</string>
@@ -1457,6 +1457,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"Diminta oleh <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"Ya"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"Tidak"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"Lokasi darurat diakses"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"Operator perangkat mengakses lokasi selama sesi darurat baru-baru ini"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"Operator mengakses lokasi selama sesi darurat baru-baru ini"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"Penghapusan melebihi batas"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"Terdapat <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> item yang dihapus untuk <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>, akun <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>. Apa yang ingin Anda lakukan?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"Hapus item"</string>
@@ -1518,7 +1521,7 @@
     <string name="data_usage_limit_snoozed_body" msgid="545146591766765678">"Anda telah menggunakan <xliff:g id="SIZE">%s</xliff:g> melebihi batas yang ditetapkan"</string>
     <string name="data_usage_restricted_title" msgid="126711424380051268">"Data latar belakang dibatasi"</string>
     <string name="data_usage_restricted_body" msgid="5338694433686077733">"Ketuk untuk menghapus batasan."</string>
-    <string name="data_usage_rapid_title" msgid="2950192123248740375">"Penggunaan kuota yang tinggi"</string>
+    <string name="data_usage_rapid_title" msgid="2950192123248740375">"Penggunaan data seluler tinggi"</string>
     <string name="data_usage_rapid_body" msgid="3886676853263693432">"Aplikasi Anda menggunakan lebih banyak kuota daripada biasanya"</string>
     <string name="data_usage_rapid_app_body" msgid="5425779218506513861">"<xliff:g id="APP">%s</xliff:g> menggunakan lebih banyak kuota daripada biasanya"</string>
     <string name="ssl_certificate" msgid="5690020361307261997">"Sertifikat keamanan"</string>
@@ -1791,8 +1794,8 @@
     <string name="confirm_battery_saver" msgid="5247976246208245754">"Oke"</string>
     <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"Untuk memperpanjang masa pakai baterai, Penghemat Baterai:\n·Mengaktifkan Tema gelap\n·Menonaktifkan atau membatasi aktivitas di latar belakang, beberapa efek visual, dan fitur lain seperti “Ok Google”\n\n"<annotation id="url">"Pelajari lebih lanjut"</annotation></string>
     <string name="battery_saver_description" msgid="7618492104632328184">"Untuk memperpanjang masa pakai baterai, Penghemat Baterai:\n·Mengaktifkan Tema gelap\n·Menonaktifkan atau membatasi aktivitas di latar belakang, beberapa efek visual, dan fitur lain seperti “Ok Google”"</string>
-    <string name="data_saver_description" msgid="4995164271550590517">"Untuk membantu mengurangi penggunaan kuota, Penghemat Kuota Internet mencegah beberapa aplikasi mengirim atau menerima data di latar belakang. Aplikasi yang sedang digunakan dapat mengakses data, tetapi frekuensinya agak lebih jarang. Misalnya saja, gambar hanya akan ditampilkan setelah diketuk."</string>
-    <string name="data_saver_enable_title" msgid="7080620065745260137">"Aktifkan Penghemat Kuota?"</string>
+    <string name="data_saver_description" msgid="4995164271550590517">"Untuk membantu mengurangi penggunaan data, Penghemat Data mencegah beberapa aplikasi mengirim atau menerima data di latar belakang. Aplikasi yang sedang digunakan dapat mengakses data, tetapi frekuensinya agak lebih jarang. Misalnya saja, gambar hanya akan ditampilkan setelah diketuk."</string>
+    <string name="data_saver_enable_title" msgid="7080620065745260137">"Aktifkan Penghemat Data?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Aktifkan"</string>
     <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
       <item quantity="other">Selama %1$d menit (hingga <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml
index c45f349..6c017e8 100644
--- a/core/res/res/values-is/strings.xml
+++ b/core/res/res/values-is/strings.xml
@@ -1327,7 +1327,7 @@
     <string name="share_remote_bugreport_action" msgid="7630880678785123682">"DEILA"</string>
     <string name="decline_remote_bugreport_action" msgid="4040894777519784346">"HAFNA"</string>
     <string name="select_input_method" msgid="3971267998568587025">"Veldu innsláttaraðferð"</string>
-    <string name="show_ime" msgid="6406112007347443383">"Haltu því á skjánum meðan vélbúnaðarlyklaborðið er virkt"</string>
+    <string name="show_ime" msgid="6406112007347443383">"Halda því á skjánum meðan vélbúnaðarlyklaborðið er virkt"</string>
     <string name="hardware" msgid="1800597768237606953">"Sýna sýndarlyklaborð"</string>
     <string name="select_keyboard_layout_notification_title" msgid="4427643867639774118">"Stilla vélbúnaðarlyklaborð"</string>
     <string name="select_keyboard_layout_notification_message" msgid="8835158247369158154">"Ýttu til að velja tungumál og útlit"</string>
@@ -1457,6 +1457,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"Beiðni frá <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"Já"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"Nei"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"Aðgangur að staðsetningu"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"Framleiðandi tækisins fékk aðgang að staðsetningu þinni í nýlegri neyðarlotu"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"Símafyrirtækið þitt fékk aðgang að staðsetningu þinni í nýlegri neyðarlotu"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"Hámarki eyðinga náð"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"<xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> atriðum hefur verið eytt fyrir <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g> á reikningnum <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>. Hvað viltu gera?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"Eyða atriðunum"</string>
@@ -1791,7 +1794,7 @@
     <string name="confirm_battery_saver" msgid="5247976246208245754">"Í lagi"</string>
     <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"Til að auka rafhlöðuendingu gerir rafhlöðusparnaður eftirfarandi:\n·Kveikir á dökku þema\n·Slekkur á eða takmarkar bakgrunnsvirkni, tilteknar myndbrellur og aðra eiginleika eins og „Ok Google“.\n\n"<annotation id="url">"Frekari upplýsingar"</annotation></string>
     <string name="battery_saver_description" msgid="7618492104632328184">"Til að auka rafhlöðuendingu gerir rafhlöðusparnaður eftirfarandi:\n·Kveikir á dökku þema\n·Slekkur á eða takmarkar bakgrunnsvirkni, tilteknar myndbrellur og aðra eiginleika eins og „Ok Google“."</string>
-    <string name="data_saver_description" msgid="4995164271550590517">"Gagnasparnaður getur hjálpað til við að draga úr gagnanotkun með því að hindra forrit í að senda eða sækja gögn í bakgrunni. Forrit sem er í notkun getur náð í gögn, en gerir það kannski sjaldnar. Niðurstaðan gæti verið, svo dæmi sé tekið, að myndir séu ekki birtar fyrr en þú ýtir á þær."</string>
+    <string name="data_saver_description" msgid="4995164271550590517">"Gagnasparnaður getur hjálpað til við að draga úr gagnanotkun með því að hindra forrit í að senda eða sækja gögn í bakgrunni. Forrit sem er í notkun getur náð í gögn, en gerir það kannski sjaldnar. Niðurstaðan getur verið, svo dæmi sé tekið, að myndir eru ekki birtar fyrr en þú ýtir á þær."</string>
     <string name="data_saver_enable_title" msgid="7080620065745260137">"Kveikja á gagnasparnaði?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Kveikja"</string>
     <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index 704b233..f656326 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -142,7 +142,7 @@
     <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"Wi-Fi"</string>
     <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"Chiamate Wi-Fi"</string>
     <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string>
-    <string name="wifi_calling_off_summary" msgid="5626710010766902560">"OFF"</string>
+    <string name="wifi_calling_off_summary" msgid="5626710010766902560">"Off"</string>
     <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Chiamata tramite Wi-Fi"</string>
     <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Chiamata su rete mobile"</string>
     <string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Solo Wi-Fi"</string>
@@ -1457,6 +1457,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"Richiesto da <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"Sì"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"No"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"Posizione usata durante un\'emergenza"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"Il produttore del dispositivo ha usato la tua posizione durante una recente sessione di emergenza"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"L\'operatore ha usato la tua posizione durante una recente sessione di emergenza"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"Limite di eliminazioni superato"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"Ci sono <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> elementi eliminati per <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>, account <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> . Come vuoi procedere?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"Elimina gli elementi"</string>
@@ -1790,7 +1793,7 @@
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"Eliminato dall\'amministratore"</string>
     <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
     <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"Per estendere la durata della batteria, il risparmio energetico:\n·Attiva il Tema scuro\n·Disattiva o limita le attività in background, alcuni effetti visivi e altre funzionalità come \"Ok Google\"\n\n"<annotation id="url">"Ulteriori informazioni"</annotation></string>
-    <string name="battery_saver_description" msgid="7618492104632328184">"Per estendere la durata della batteria, il risparmio energetico:\n·Attiva il Tema scuro\n·Disattiva o limita le attività in background, alcuni effetti visivi e altre funzionalità come \"Ok Google\""</string>
+    <string name="battery_saver_description" msgid="7618492104632328184">"Per estendere la durata della batteria, Risparmio energetico:\n·Attiva il Tema scuro\n·Disattiva o limita le attività in background, alcuni effetti visivi e altre funzionalità come \"Ok Google\""</string>
     <string name="data_saver_description" msgid="4995164271550590517">"Per contribuire a ridurre l\'utilizzo dei dati, la funzione Risparmio dati impedisce ad alcune app di inviare o ricevere dati in background. Un\'app in uso può accedere ai dati, ma potrebbe farlo con meno frequenza. Esempio: le immagini non vengono visualizzate finché non le tocchi."</string>
     <string name="data_saver_enable_title" msgid="7080620065745260137">"Attivare Risparmio dati?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Attiva"</string>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index 5c0ab14..87b670a 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -577,7 +577,7 @@
     <string name="permdesc_manageFace" msgid="6204569688492710471">"מאפשרת לאפליקציה להפעיל שיטות להוספה ומחיקה של תבניות פנים שבהן ייעשה שימוש."</string>
     <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"שימוש בחומרה לשחרור נעילה על ידי זיהוי פנים"</string>
     <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"מאפשרת לאפליקציה להשתמש בחומרה לשחרור נעילה על ידי זיהוי פנים לצורך אימות"</string>
-    <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"שחרור נעילה על ידי זיהוי פנים"</string>
+    <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"שחרור נעילה בזיהוי פנים"</string>
     <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"יש לבצע רישום מחדש של הפנים שלך"</string>
     <string name="face_recalibrate_notification_content" msgid="892757485125249962">"לשיפור הזיהוי יש לבצע רישום מחדש של הפנים שלך"</string>
     <string name="face_acquired_insufficient" msgid="2150805835949162453">"לא ניתן היה לקלוט את הפנים במדויק. יש לנסות שוב."</string>
@@ -1499,6 +1499,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"מבוקש על ידי <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"כן"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"לא"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"בוצעה גישה למיקום בזמן מקרה חירום"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"יצרן המכשיר שלך ניגש לנתוני המיקום שלך במהלך פעילות במקרה חירום לאחרונה"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"הספק שלך ניגש לנתוני המיקום שלך במהלך פעילות במקרה חירום לאחרונה"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"חרגת ממגבלת המחיקה"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"יש <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> פריטים שנמחקו עבור <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g> , בחשבון <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>. איזו פעולה ברצונך לבצע?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"מחק את הפריטים"</string>
@@ -1838,7 +1841,7 @@
     <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"‏התכונה \'חיסכון בסוללה\':\n·מפעילה עיצוב כהה\n·מכבה או מגבילה פעילות ברקע, חלק מהאפקטים החזותיים ותכונות אחרות כמו \"Ok Google\", כדי להאריך את חיי הסוללה\n\n"<annotation id="url">"מידע נוסף"</annotation></string>
     <string name="battery_saver_description" msgid="7618492104632328184">"‏התכונה \'חיסכון בסוללה\':\n·מפעילה עיצוב כהה\n·מכבה או מגבילה פעילות ברקע, חלק מהאפקטים החזותיים ותכונות אחרות כמו \"Ok Google\", כדי להאריך את חיי הסוללה"</string>
     <string name="data_saver_description" msgid="4995164271550590517">"‏כדי לסייע בהפחתת השימוש בנתונים, חוסך הנתונים (Data Saver) מונע מאפליקציות מסוימות שליחה או קבלה של נתונים ברקע. אפליקציה שבה נעשה שימוש כרגע יכולה לגשת לנתונים, אבל בתדירות נמוכה יותר. המשמעות היא, למשל, שתמונות יוצגו רק לאחר שמקישים עליהן."</string>
-    <string name="data_saver_enable_title" msgid="7080620065745260137">"‏האם להפעיל את חוסך הנתונים (Data Saver)?"</string>
+    <string name="data_saver_enable_title" msgid="7080620065745260137">"להפעיל את חוסך הנתונים?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"הפעל"</string>
     <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
       <item quantity="two">‏למשך %d דקות (עד <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index 1e5f5ec..17924e4 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -1306,9 +1306,9 @@
     <string name="usb_power_notification_message" msgid="7284765627437897702">"接続されているデバイスを充電しています。タップすると、他の項目が表示されます。"</string>
     <string name="usb_unsupported_audio_accessory_title" msgid="2335775548086533065">"アナログのオーディオ アクセサリを検出"</string>
     <string name="usb_unsupported_audio_accessory_message" msgid="1300168007129796621">"接続したデバイスはこのスマートフォンと互換性がありません。タップすると、詳細を確認できます。"</string>
-    <string name="adb_active_notification_title" msgid="408390247354560331">"USBデバッグが接続されました"</string>
+    <string name="adb_active_notification_title" msgid="408390247354560331">"USB デバッグが接続されました"</string>
     <string name="adb_active_notification_message" msgid="5617264033476778211">"USB デバッグを無効にするにはここをタップしてください"</string>
-    <string name="adb_active_notification_message" product="tv" msgid="6624498401272780855">"USBデバッグを無効にする場合に選択します。"</string>
+    <string name="adb_active_notification_message" product="tv" msgid="6624498401272780855">"USB デバッグを無効にする場合に選択します。"</string>
     <string name="adbwifi_active_notification_title" msgid="6147343659168302473">"ワイヤレス デバッグが接続されました"</string>
     <string name="adbwifi_active_notification_message" msgid="930987922852867972">"ワイヤレス デバッグをUSB デバッグを無効にするにはここをタップしてください"</string>
     <string name="adbwifi_active_notification_message" product="tv" msgid="8633421848366915478">"ワイヤレス デバッグを無効にする場合に選択します。"</string>
@@ -1327,7 +1327,7 @@
     <string name="share_remote_bugreport_action" msgid="7630880678785123682">"共有する"</string>
     <string name="decline_remote_bugreport_action" msgid="4040894777519784346">"共有しない"</string>
     <string name="select_input_method" msgid="3971267998568587025">"入力方法の選択"</string>
-    <string name="show_ime" msgid="6406112007347443383">"物理キーボードが有効になっている間は、画面に表示されます"</string>
+    <string name="show_ime" msgid="6406112007347443383">"物理キーボードが有効になっていても画面に表示させます"</string>
     <string name="hardware" msgid="1800597768237606953">"仮想キーボードの表示"</string>
     <string name="select_keyboard_layout_notification_title" msgid="4427643867639774118">"物理キーボードの設定"</string>
     <string name="select_keyboard_layout_notification_message" msgid="8835158247369158154">"タップして言語とレイアウトを選択してください"</string>
@@ -1457,6 +1457,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"<xliff:g id="NAME">%1$s</xliff:g>さん(<xliff:g id="SERVICE">%2$s</xliff:g>)からのリクエスト"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"はい"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"いいえ"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"緊急対応時に位置情報にアクセスされました"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"最近の緊急対応時にデバイス メーカーが位置情報にアクセスしました"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"最近の緊急対応時に携帯通信会社が位置情報にアクセスしました"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"削除の制限を超えました"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"<xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>アカウントの<xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>で<xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g>件の削除があります。操作を選択してください。"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"アイテムを削除する"</string>
@@ -1508,7 +1511,7 @@
     <string name="storage_usb_drive_label" msgid="6631740655876540521">"<xliff:g id="MANUFACTURER">%s</xliff:g>製USBドライブ"</string>
     <string name="storage_usb" msgid="2391213347883616886">"USBストレージ"</string>
     <string name="extract_edit_menu_button" msgid="63954536535863040">"編集"</string>
-    <string name="data_usage_warning_title" msgid="9034893717078325845">"データ使用の警告"</string>
+    <string name="data_usage_warning_title" msgid="9034893717078325845">"警告するデータ使用量"</string>
     <string name="data_usage_warning_body" msgid="1669325367188029454">"<xliff:g id="APP">%s</xliff:g> のデータを使用しました"</string>
     <string name="data_usage_mobile_limit_title" msgid="3911447354393775241">"モバイルデータの上限に達しました"</string>
     <string name="data_usage_wifi_limit_title" msgid="2069698056520812232">"Wi-Fiデータの上限に達しました"</string>
@@ -1555,7 +1558,7 @@
     <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string>
     <string name="default_audio_route_category_name" msgid="5241740395748134483">"システム"</string>
     <string name="bluetooth_a2dp_audio_route_name" msgid="4214648773120426288">"Bluetooth音声"</string>
-    <string name="wireless_display_route_description" msgid="8297563323032966831">"ワイヤレスディスプレイ"</string>
+    <string name="wireless_display_route_description" msgid="8297563323032966831">"ワイヤレス ディスプレイ"</string>
     <string name="media_route_button_content_description" msgid="2299223698196869956">"キャスト"</string>
     <string name="media_route_chooser_title" msgid="6646594924991269208">"デバイスに接続"</string>
     <string name="media_route_chooser_title_for_remote_display" msgid="3105906508794326446">"デバイスへの画面のキャスト"</string>
@@ -1791,7 +1794,7 @@
     <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
     <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"電池を長持ちさせるためにバッテリー セーバーが行う操作:\n·ダークテーマを ON にする\n·バックグラウンド アクティビティ、一部の視覚効果や、「OK Google」などの機能を OFF にする、または制限する\n\n"<annotation id="url">"詳細"</annotation></string>
     <string name="battery_saver_description" msgid="7618492104632328184">"電池を長持ちさせるためにバッテリー セーバーが行う操作:\n·ダークテーマを ON にする\n·バックグラウンド アクティビティ、一部の視覚効果や、「OK Google」などの機能を OFF にする、または制限する"</string>
-    <string name="data_saver_description" msgid="4995164271550590517">"データセーバーは、一部のアプリによるバックグラウンドでのデータ送受信を停止することでデータ使用量を抑制します。使用中のアプリからデータにアクセスすることはできますが、その頻度は低くなる場合があります。この影響として、たとえば画像はタップしないと表示されないようになります。"</string>
+    <string name="data_saver_description" msgid="4995164271550590517">"データセーバーは、一部のアプリによるバックグラウンドでのデータ送受信を停止することでデータ使用量を抑制します。使用中のアプリからデータを送受信することはできますが、その頻度は低くなる場合があります。この影響として、たとえば画像はタップしないと表示されないようになります。"</string>
     <string name="data_saver_enable_title" msgid="7080620065745260137">"データセーバーを ON にしますか?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"ON にする"</string>
     <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
@@ -2006,7 +2009,7 @@
     <string name="mime_type_apk" msgid="3168784749499623902">"Android アプリ"</string>
     <string name="mime_type_generic" msgid="4606589110116560228">"ファイル"</string>
     <string name="mime_type_generic_ext" msgid="9220220924380909486">"<xliff:g id="EXTENSION">%1$s</xliff:g> ファイル"</string>
-    <string name="mime_type_audio" msgid="4933450584432509875">"音声"</string>
+    <string name="mime_type_audio" msgid="4933450584432509875">"オーディオ"</string>
     <string name="mime_type_audio_ext" msgid="2615491023840514797">"<xliff:g id="EXTENSION">%1$s</xliff:g> 音声"</string>
     <string name="mime_type_video" msgid="7071965726609428150">"動画"</string>
     <string name="mime_type_video_ext" msgid="185438149044230136">"<xliff:g id="EXTENSION">%1$s</xliff:g> 動画"</string>
@@ -2058,7 +2061,7 @@
     <string name="resolver_cant_access_personal_apps" msgid="648291604475669395">"個人用アプリでこのコンテンツを開くことはできません"</string>
     <string name="resolver_cant_access_personal_apps_explanation" msgid="2298773629302296519">"IT 管理者は、個人用プロファイルのアプリでこのコンテンツを開くことを許可していません"</string>
     <string name="resolver_turn_on_work_apps" msgid="884910835250037247">"仕事用プロファイルが一時停止しています"</string>
-    <string name="resolver_switch_on_work" msgid="2873009160846966379">"オンにする"</string>
+    <string name="resolver_switch_on_work" msgid="2873009160846966379">"ON にする"</string>
     <string name="resolver_no_work_apps_available_share" msgid="7933949011797699505">"このコンテンツに対応する仕事用アプリはありません"</string>
     <string name="resolver_no_work_apps_available_resolve" msgid="1244844292366099399">"このコンテンツを開くことができる仕事用アプリはありません"</string>
     <string name="resolver_no_personal_apps_available_share" msgid="5639102815174748732">"このコンテンツに対応する個人用アプリはありません"</string>
diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml
index 89de803..9c85285 100644
--- a/core/res/res/values-ka/strings.xml
+++ b/core/res/res/values-ka/strings.xml
@@ -1457,6 +1457,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"მოთხოვნილია <xliff:g id="NAME">%1$s</xliff:g>-ის მიერ (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"დიახ"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"არა"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"დაფიქსირდა წვდომა საგანგებო მდებარეობაზე"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"დაფიქსირდა თქვენი მოწყობილობის მწარმოებლის წვდომა თქვენს მდებარეობაზე ბოლოდროინდელი საგანგებო სესიის განმავლობაში"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"დაფიქსირდა თქვენი ოპერატორის წვდომა თქვენს მდებარეობაზე ბოლოდროინდელი საგანგებო სესიის განმავლობაში"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"წაშლის შეზღუდვა გადაჭარბებულია"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"<xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> წაშლილი ერთეულია <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>-თვის, ანგარიში <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>. რისი გაკეთება გსურთ?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"ერთეულების წაშლა"</string>
@@ -1789,8 +1792,8 @@
     <string name="package_updated_device_owner" msgid="7560272363805506941">"განახლებულია თქვენი ადმინისტრატორის მიერ"</string>
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"წაიშალა თქვენი ადმინისტრატორის მიერ"</string>
     <string name="confirm_battery_saver" msgid="5247976246208245754">"კარგი"</string>
-    <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"ელემენტის მუშაობის განრძლივობის მიზნით, ელემენტის დამზოგველი:\n·ირთვება ბნელ თემაზე\n·თიშავს ან ზღუდავს ფონის აქტივობებს, გარკვეულ ვიზუალურ ეფექტებს და სახვა შესაძლებლობებს, როგორიც არის “Hey Google”\n\n"<annotation id="url">"შეიტყვეთ მეტი"</annotation></string>
-    <string name="battery_saver_description" msgid="7618492104632328184">"ელემენტის მუშაობის განრძლივობის მიზნით, ელემენტის დამზოგველი:\n·ირთვება ბნელ თემაზე\n·თიშავს ან ზღუდავს ფონის აქტივობებს, გარკვეულ ვიზუალურ ეფექტებს და სახვა შესაძლებლობებს, როგორიც არის “Hey Google”"</string>
+    <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"ბატარეის მუშაობის განრძლივობის მიზნით, ბატარეის დამზოგველი:\n·ირთვება ბნელ თემაზე\n·თიშავს ან ზღუდავს ფონის აქტივობებს, გარკვეულ ვიზუალურ ეფექტებს და სახვა შესაძლებლობებს, როგორიც არის “Hey Google”\n\n"<annotation id="url">"შეიტყვეთ მეტი"</annotation></string>
+    <string name="battery_saver_description" msgid="7618492104632328184">"ბატარეის მუშაობის გახანგრძლივების მიზნით, ბატარეის დამზოგველი:\n·ირთვება ბნელ თემაზე\n·თიშავს ან ზღუდავს ფონის აქტივობებს, გარკვეულ ვიზუალურ ეფექტებს და სახვა შესაძლებლობებს, როგორიც არის “Hey Google”"</string>
     <string name="data_saver_description" msgid="4995164271550590517">"მობილური ინტერნეტის მოხმარების შემცირების მიზნით, მონაცემთა დამზოგველი ზოგიერთ აპს ფონურ რეჟიმში მონაცემთა გაგზავნასა და მიღებას შეუზღუდავს. თქვენ მიერ ამჟამად გამოყენებული აპი მაინც შეძლებს მობილურ ინტერნეტზე წვდომას, თუმცა ამას ნაკლები სიხშირით განახორციელებს. ეს ნიშნავს, რომ, მაგალითად, სურათები არ გამოჩნდება მანამ, სანამ მათ საგანგებოდ არ შეეხებით."</string>
     <string name="data_saver_enable_title" msgid="7080620065745260137">"ჩაირთოს მონაცემთა დამზოგველი?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"ჩართვა"</string>
diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml
index a417eab..d2773a2 100644
--- a/core/res/res/values-kk/strings.xml
+++ b/core/res/res/values-kk/strings.xml
@@ -1457,6 +1457,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"Өтініш жіберген <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"Иә"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"Жоқ"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"Геодерегіңіз пайдаланылды."</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"Жақында құтқару қызметіне қоңырау шалғанда, құрылғы өндірушісі геодерегіңізді пайдаланды."</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"Жақында құтқару қызметіне қоңырау шалғанда, оператор геодерегіңізді пайдаланды."</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"Жою шектеуінен асып кетті"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"Мұнда <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> жойылған <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>, <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> есептік жазбасының элементі бар. Не істеуді қалайсыз?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"Бұл нәрселер жойылсын"</string>
@@ -1559,7 +1562,7 @@
     <string name="media_route_button_content_description" msgid="2299223698196869956">"Трансляциялау"</string>
     <string name="media_route_chooser_title" msgid="6646594924991269208">"Құрылғыға жалғау"</string>
     <string name="media_route_chooser_title_for_remote_display" msgid="3105906508794326446">"Экран трансляциясы"</string>
-    <string name="media_route_chooser_searching" msgid="6119673534251329535">"Құрылғыларды іздеуде…"</string>
+    <string name="media_route_chooser_searching" msgid="6119673534251329535">"Құрылғылар ізделуде…"</string>
     <string name="media_route_chooser_extended_settings" msgid="2506352159381327741">"Параметрлер"</string>
     <string name="media_route_controller_disconnect" msgid="7362617572732576959">"Ажырату"</string>
     <string name="media_route_status_scanning" msgid="8045156315309594482">"Тексеруде..."</string>
@@ -1790,7 +1793,7 @@
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"Әкімші жойған"</string>
     <string name="confirm_battery_saver" msgid="5247976246208245754">"Жарайды"</string>
     <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"Батарея жұмысының ұзақтығын арттыру үшін Battery Saver:\n·Қараңғы тақырыпты іске қосады\n·фондық әрекеттерді, кейбір көрнекі әсерлерді және \"Ok Google\" сияқты басқа да функцияларды өшіреді немесе шектейді.\n\n"<annotation id="url">"Толығырақ"</annotation></string>
-    <string name="battery_saver_description" msgid="7618492104632328184">"Батарея жұмысының ұзақтығын арттыру үшін Battery Saver:\n·Қараңғы тақырыпты іске қосады\n·фондық әрекеттерді, кейбір көрнекі әсерлерді және \"Ok Google\" сияқты басқа да функцияларды өшіреді немесе шектейді."</string>
+    <string name="battery_saver_description" msgid="7618492104632328184">"Батарея жұмысының ұзақтығын арттыру үшін Battery Saver:\n·Қараңғы тақырыпты іске қосады;\n·фондық әрекеттерді, кейбір көрнекі әсерлерді және \"Ok Google\" сияқты басқа да функцияларды өшіреді немесе шектейді."</string>
     <string name="data_saver_description" msgid="4995164271550590517">"Дерек шығынын азайту үшін Data Saver функциясы кейбір қолданбаларға деректерді фондық режимде жіберуге және алуға жол бермейді. Ашық тұрған қолданба деректерді пайдаланады, бірақ шектеулі шамада (мысалы, кескіндер оларды түрткенге дейін көрсетілмейді)."</string>
     <string name="data_saver_enable_title" msgid="7080620065745260137">"Data Saver функциясын қосу керек пе?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Қосу"</string>
diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml
index 50cea44..3b48199 100644
--- a/core/res/res/values-km/strings.xml
+++ b/core/res/res/values-km/strings.xml
@@ -1459,6 +1459,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"បាន​ស្នើ​ដោយ <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"បាទ/ចាស"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"ទេ"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"បានចូលប្រើ​ទីតាំងពេលមាន​អាសន្ន"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"ក្រុមហ៊ុន​ផលិតឧបករណ៍​របស់អ្នកបាន​ចូលប្រើទីតាំង​របស់អ្នក អំឡុងវគ្គពេលមាន​អាសន្នថ្មីៗ"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"ក្រុមហ៊ុនសេវាទូរសព្ទ​របស់អ្នកបាន​ចូលប្រើទីតាំង​របស់អ្នក អំឡុងវគ្គពេលមាន​អាសន្នថ្មីៗ"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"លុប​​លើស​ដែន​កំណត់"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"មាន​ធាតុ​បាន​លុប <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> សម្រាប់ <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g> គណនី <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> ។ តើ​អ្នក​ចង់​ធ្វើ​អ្វី​ខ្លះ​?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"លុប​ធាតុ"</string>
@@ -1794,7 +1797,7 @@
     <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"ដើម្បី​បង្កើនកម្រិត​ថាមពលថ្ម កម្មវិធី​សន្សំ​ថ្ម៖\n·បើករចនាប័ទ្មងងឹត​\n·បិទ ឬដាក់កំហិតលើ​សកម្មភាពផ្ទៃខាងក្រោយ ឥទ្ធិពល​ជារូបភាពមួយចំនួន និងមុខងារផ្សេងទៀត​ដូចជា “Hey Google” ជាដើម\n\n"<annotation id="url">"ស្វែងយល់បន្ថែម"</annotation></string>
     <string name="battery_saver_description" msgid="7618492104632328184">"ដើម្បី​បង្កើនកម្រិត​ថាមពលថ្ម កម្មវិធី​សន្សំ​ថ្ម៖\n·បើករចនាប័ទ្មងងឹត​\n·បិទ ឬដាក់កំហិតលើ​សកម្មភាពផ្ទៃខាងក្រោយ ឥទ្ធិពល​ជារូបភាពមួយចំនួន និងមុខងារផ្សេងទៀត​ដូចជា “Hey Google” ជាដើម"</string>
     <string name="data_saver_description" msgid="4995164271550590517">"ដើម្បីជួយកាត់បន្ថយការប្រើប្រាស់ទិន្នន័យ កម្មវិធីសន្សំសំចៃទិន្នន័យរារាំងកម្មវិធីមួយចំនួនមិនឲ្យបញ្ជូន ឬទទួលទិន្នន័យនៅផ្ទៃខាងក្រោយទេ។ កម្មវិធីដែលអ្នកកំពុងប្រើនាពេលបច្ចុប្បន្នអាចចូលប្រើប្រាស់​ទិន្នន័យបាន ប៉ុន្តែអាចនឹងមិនញឹកញាប់ដូចមុនទេ។ ឧទាហរណ៍ រូបភាពមិនបង្ហាញទេ លុះត្រាតែអ្នកប៉ះរូបភាពទាំងនោះ។"</string>
-    <string name="data_saver_enable_title" msgid="7080620065745260137">"បើកកម្មវិធីសន្សំសំចៃទិន្នន័យឬ?"</string>
+    <string name="data_saver_enable_title" msgid="7080620065745260137">"បើកកម្មវិធីសន្សំសំចៃទិន្នន័យ?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"បើក"</string>
     <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
       <item quantity="other">រយៈពេល %1$d នាទី (រហូតដល់ <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml
index bbe9201..64002ef 100644
--- a/core/res/res/values-kn/strings.xml
+++ b/core/res/res/values-kn/strings.xml
@@ -1091,7 +1091,7 @@
     <string name="elapsed_time_short_format_h_mm_ss" msgid="2302144714803345056">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string>
     <string name="selectAll" msgid="1532369154488982046">"ಎಲ್ಲವನ್ನೂ ಆಯ್ಕೆ ಮಾಡಿ"</string>
     <string name="cut" msgid="2561199725874745819">"ಕತ್ತರಿಸು"</string>
-    <string name="copy" msgid="5472512047143665218">"ನಕಲಿಸು"</string>
+    <string name="copy" msgid="5472512047143665218">"ನಕಲಿಸಿ"</string>
     <string name="failed_to_copy_to_clipboard" msgid="725919885138539875">"ಕ್ಲಿಪ್‌ಬೋರ್ಡ್‌ಗೆ ನಕಲಿಸಲು ವಿಫಲವಾಗಿದೆ"</string>
     <string name="paste" msgid="461843306215520225">"ಅಂಟಿಸಿ"</string>
     <string name="paste_as_plain_text" msgid="7664800665823182587">"ಸರಳ ಪಠ್ಯದಂತೆ ಅಂಟಿಸು"</string>
@@ -1457,6 +1457,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"<xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>) ಅವರಿಂದ ವಿನಂತಿಸಲಾಗಿದೆ"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"ಹೌದು"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"ಇಲ್ಲ"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"ತುರ್ತು ಸ್ಥಳವನ್ನು ಪ್ರವೇಶಿಸಲಾಗಿದೆ"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"ಇತ್ತೀಚಿನ ತುರ್ತು ಸೆಶನ್‌ನ ಸಮಯದಲ್ಲಿ ನಿಮ್ಮ ಸಾಧನದ ತಯಾರಕರು ನಿಮ್ಮ ಸ್ಥಳವನ್ನು ಪ್ರವೇಶಿಸಿದರು"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"ಇತ್ತೀಚಿನ ತುರ್ತು ಸೆಶನ್‌ನ ಸಮಯದಲ್ಲಿ ನಿಮ್ಮ ವಾಹಕ ನಿಮ್ಮ ಸ್ಥಳವನ್ನು ಪ್ರವೇಶಿಸಿದೆ"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"ಅಳಿಸುವ ಮಿತಿ ಮೀರಿದೆ"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"<xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>, <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> ಗಾಗಿ <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> ಅಳಿಸಲಾಗಿರುವ ಐಟಂಗಳು ಕಂಡುಬಂದಿವೆ. ನೀವು ಏನು ಮಾಡಬೇಕೆಂದು ಬಯಸುವಿರಿ?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"ಐಟಂಗಳನ್ನು ಅಳಿಸಿ"</string>
@@ -1792,7 +1795,7 @@
     <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"ಬ್ಯಾಟರಿ ಬಾಳಿಕೆಯನ್ನು ವಿಸ್ತರಿಸಲು, ಬ್ಯಾಟರಿ ಸೇವರ್:\n·ಡಾರ್ಕ್ ಥೀಮ್ ಅನ್ನು ಆನ್ ಮಾಡುತ್ತದೆ\n·ಹಿನ್ನೆಲೆ ಚಟುವಟಿಕೆ, ಕೆಲವು ದೃಶ್ಯಾತ್ಮಕ ಎಫೆಕ್ಟ್‌ಗಳು ಮತ್ತು “ಹೇ Google” ನಂತಹ ಇತರ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಆಫ್ ಮಾಡುತ್ತದೆ ಅಥವಾ ನಿರ್ಬಂಧಿಸುತ್ತದೆ\n\n"<annotation id="url">"ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ"</annotation></string>
     <string name="battery_saver_description" msgid="7618492104632328184">"ಬ್ಯಾಟರಿ ಬಾಳಿಕೆಯನ್ನು ವಿಸ್ತರಿಸಲು, ಬ್ಯಾಟರಿ ಸೇವರ್:\n·ಡಾರ್ಕ್ ಥೀಮ್ ಅನ್ನು ಆನ್ ಮಾಡುತ್ತದೆ\n·ಹಿನ್ನೆಲೆ ಚಟುವಟಿಕೆ, ಕೆಲವು ವಿಷುವಲ್ ಎಫೆಕ್ಟ್‌ಗಳು ಮತ್ತು “ಹೇ Google” ನಂತಹ ಇತರ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಆಫ್ ಮಾಡುತ್ತದೆ ಅಥವಾ ನಿರ್ಬಂಧಿಸುತ್ತದೆ"</string>
     <string name="data_saver_description" msgid="4995164271550590517">"ಡೇಟಾ ಬಳಕೆ ಕಡಿಮೆ ಮಾಡುವ ನಿಟ್ಟಿನಲ್ಲಿ, ಡೇಟಾ ಸೇವರ್ ಕೆಲವು ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಹಿನ್ನೆಲೆಯಲ್ಲಿ ಡೇಟಾ ಕಳುಹಿಸುವುದನ್ನು ಅಥವಾ ಸ್ವೀಕರಿಸುವುದನ್ನು ತಡೆಯುತ್ತದೆ. ನೀವು ಪ್ರಸ್ತುತ ಬಳಸುತ್ತಿರುವ ಅಪ್ಲಿಕೇಶನ್ ಡೇಟಾವನ್ನು ಪ್ರವೇಶಿಸಬಹುದು ಆದರೆ ಪದೇ ಪದೇ ಪ್ರವೇಶಿಸಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ. ಇದರರ್ಥ, ಉದಾಹರಣೆಗೆ, ನೀವು ಅವುಗಳನ್ನು ಟ್ಯಾಪ್ ಮಾಡುವವರೆಗೆ ಆ ಚಿತ್ರಗಳು ಕಾಣಿಸಿಕೊಳ್ಳುವುದಿಲ್ಲ."</string>
-    <string name="data_saver_enable_title" msgid="7080620065745260137">"ಡೇಟಾ ಉಳಿಸುವಿಕೆಯನ್ನು ಆನ್ ಮಾಡುವುದೇ?"</string>
+    <string name="data_saver_enable_title" msgid="7080620065745260137">"ಡೇಟಾ ಸೇವರ್ ಆನ್ ಮಾಡಬೇಕೇ?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"ಆನ್‌ ಮಾಡಿ"</string>
     <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
       <item quantity="one">%1$d ನಿಮಿಷಗಳವರೆಗೆ (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> ವರೆಗೆ)</item>
@@ -1944,7 +1947,7 @@
     <string name="autofill_save_yes" msgid="8035743017382012850">"ಉಳಿಸಿ"</string>
     <string name="autofill_save_no" msgid="9212826374207023544">"ಬೇಡ"</string>
     <string name="autofill_save_notnow" msgid="2853932672029024195">"ಸದ್ಯಕ್ಕೆ ಬೇಡ"</string>
-    <string name="autofill_save_never" msgid="6821841919831402526">"ಎಂದೂ ಇಲ್ಲ"</string>
+    <string name="autofill_save_never" msgid="6821841919831402526">"ಎಂದೂ ಬೇಡ"</string>
     <string name="autofill_update_yes" msgid="4608662968996874445">"ಅಪ್‌ಡೇಟ್"</string>
     <string name="autofill_continue_yes" msgid="7914985605534510385">"ಮುಂದುವರಿಯಿರಿ"</string>
     <string name="autofill_save_type_password" msgid="5624528786144539944">"ಪಾಸ್‌ವರ್ಡ್"</string>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index a5c8832..ac691ae 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -293,7 +293,7 @@
     <string name="android_system_label" msgid="5974767339591067210">"Android 시스템"</string>
     <string name="user_owner_label" msgid="8628726904184471211">"개인 프로필로 전환"</string>
     <string name="managed_profile_label" msgid="7316778766973512382">"직장 프로필로 전환"</string>
-    <string name="permgrouplab_contacts" msgid="4254143639307316920">"주소록"</string>
+    <string name="permgrouplab_contacts" msgid="4254143639307316920">"연락처"</string>
     <string name="permgroupdesc_contacts" msgid="9163927941244182567">"주소록에 액세스"</string>
     <string name="permgrouplab_location" msgid="1858277002233964394">"위치"</string>
     <string name="permgroupdesc_location" msgid="1995955142118450685">"이 기기의 위치정보에 액세스"</string>
@@ -803,7 +803,7 @@
     <string name="relationTypeFriend" msgid="3192092625893980574">"친구"</string>
     <string name="relationTypeManager" msgid="2272860813153171857">"상사"</string>
     <string name="relationTypeMother" msgid="2331762740982699460">"어머니"</string>
-    <string name="relationTypeParent" msgid="4177920938333039882">"부모"</string>
+    <string name="relationTypeParent" msgid="4177920938333039882">"부모님"</string>
     <string name="relationTypePartner" msgid="4018017075116766194">"파트너"</string>
     <string name="relationTypeReferredBy" msgid="5285082289602849400">"추천인"</string>
     <string name="relationTypeRelative" msgid="3396498519818009134">"친척"</string>
@@ -1457,6 +1457,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"요청한 사람: <xliff:g id="NAME">%1$s</xliff:g>(<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"예"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"아니요"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"응급 상황 동안 위치에 액세스함"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"기기 제조업체에서 최근 응급 상황 세션 동안 내 위치에 액세스했습니다."</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"이동통신사에서 최근 응급 상황 세션 동안 내 위치에 액세스했습니다."</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"삭제 한도를 초과했습니다."</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"<xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>, <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> 계정에 대해 <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g>개의 삭제된 항목이 있습니다. 어떻게 하시겠습니까?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"항목 삭제"</string>
@@ -1792,7 +1795,7 @@
     <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"배터리 수명을 늘리기 위해 절전 모드가 다음과 같이 작동합니다.\n·어두운 테마를 사용 설정합니다.\n·백그라운드 활동, 일부 시각 효과 및 \'Hey Google\'과 같은 기타 기능을 사용 중지하거나 제한합니다.\n\n"<annotation id="url">"자세히 알아보기"</annotation></string>
     <string name="battery_saver_description" msgid="7618492104632328184">"배터리 수명을 늘리기 위해 절전 모드가 다음과 같이 작동합니다.\n·어두운 테마를 사용 설정합니다.\n·백그라운드 활동, 일부 시각 효과 및 \'Hey Google\'과 같은 기타 기능을 사용 중지하거나 제한합니다."</string>
     <string name="data_saver_description" msgid="4995164271550590517">"데이터 사용량을 줄이기 위해 데이터 절약 모드는 일부 앱이 백그라운드에서 데이터를 전송하거나 수신하지 못하도록 합니다. 현재 사용 중인 앱에서 데이터에 액세스할 수 있지만 빈도가 줄어듭니다. 예를 들면, 이미지를 탭하기 전에는 이미지가 표시되지 않습니다."</string>
-    <string name="data_saver_enable_title" msgid="7080620065745260137">"데이터 절약 모드를 사용할까요?"</string>
+    <string name="data_saver_enable_title" msgid="7080620065745260137">"데이터 절약 모드를 사용 설정하시겠습니까?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"사용 설정"</string>
     <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
       <item quantity="other">%1$d분 동안(<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>까지)</item>
diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml
index 5ea4383..558b5ef 100644
--- a/core/res/res/values-ky/strings.xml
+++ b/core/res/res/values-ky/strings.xml
@@ -48,7 +48,7 @@
     <string name="invalidPin" msgid="7542498253319440408">"Узундугу 4төн 8ге чейинки сандан турган PIN-кодду териңиз."</string>
     <string name="invalidPuk" msgid="8831151490931907083">"Узундугу 8 же көбүрөөк сандан турган PUK-кодду териңиз."</string>
     <string name="needPuk" msgid="7321876090152422918">"SIM-картаңыз PUK менен кулпуланган. Кулпусун ачуу үчүн PUK-кодду териңиз."</string>
-    <string name="needPuk2" msgid="7032612093451537186">"SIM-картаны бөгөттөн чыгаруу үчүн PUK2 кодун териңиз."</string>
+    <string name="needPuk2" msgid="7032612093451537186">"SIM картаны бөгөттөн чыгаруу үчүн PUK2 кодун териңиз."</string>
     <string name="enablePin" msgid="2543771964137091212">"Оңунан чыкпады, SIM/RUIM бөгөттөөсүн жандырыңыз."</string>
     <plurals name="pinpuk_attempts" formatted="false" msgid="1619867269012213584">
       <item quantity="other">Сизде SIM кулпуланганга чейин <xliff:g id="NUMBER_1">%d</xliff:g> аракет калды.</item>
@@ -238,7 +238,7 @@
     <string name="global_action_lock" msgid="6949357274257655383">"Экран кулпусу"</string>
     <string name="global_action_power_off" msgid="4404936470711393203">"Өчүрүү"</string>
     <string name="global_action_power_options" msgid="1185286119330160073">"Кубат"</string>
-    <string name="global_action_restart" msgid="4678451019561687074">"Кайра баштоо"</string>
+    <string name="global_action_restart" msgid="4678451019561687074">"Өчүрүп күйгүзүү"</string>
     <string name="global_action_emergency" msgid="1387617624177105088">"Тез жардам"</string>
     <string name="global_action_bug_report" msgid="5127867163044170003">"Ката тууралуу билдирүү"</string>
     <string name="global_action_logout" msgid="6093581310002476511">"Сеансты бүтүрүү"</string>
@@ -375,8 +375,8 @@
     <string name="permdesc_systemAlertWindow" msgid="1145660714855738308">"Бул колдонмо башка колдонмолордун же экрандын башка бөлүгүнүн үстүндө көрүнүшү мүмкүн. Ал колдонмолорду пайдаланууга же алардын көрсөтүлүшүнө тоскоолдук жаратышы мүмкүн."</string>
     <string name="permlab_runInBackground" msgid="541863968571682785">"фондо иштей берсин"</string>
     <string name="permdesc_runInBackground" msgid="4344539472115495141">"Бул колдонмо фондо иштей берет. Батареяңыз тез эле отуруп калышы мүмкүн."</string>
-    <string name="permlab_useDataInBackground" msgid="783415807623038947">"фондо дайындарды өткөрө берсин"</string>
-    <string name="permdesc_useDataInBackground" msgid="1230753883865891987">"Бул колдонмо фондо дайындарды өткөрө берет. Дайындарды көбүрөөк өткөрүшү мүмкүн."</string>
+    <string name="permlab_useDataInBackground" msgid="783415807623038947">"фондо дайын-даректерди өткөрө берсин"</string>
+    <string name="permdesc_useDataInBackground" msgid="1230753883865891987">"Бул колдонмо фондо дайын-даректерди өткөрө берет. Дайындарды көбүрөөк өткөрүшү мүмкүн."</string>
     <string name="permlab_persistentActivity" msgid="464970041740567970">"колдонмону үзгүлтүксүз иштетүү"</string>
     <string name="permdesc_persistentActivity" product="tablet" msgid="6055271149187369916">"Колдонмого өзүнүн бөлүктөрүн эстутумда туруктуу кармоого уруксат берет.Бул эстутумдун башка колдонмолорго жетиштүүлүгүн чектеши жана телефондун иштешин жайлатышы мүмкүн."</string>
     <string name="permdesc_persistentActivity" product="tv" msgid="6800526387664131321">"Колдонмого өз бөлүктөрүн эстутумда туруктуу сактоого уруксат берет. Бул башка колдонмолор үчүн жеткиликтүү болгон эстутумду чектеп, Android TV түзмөгүңүздүн иштешин жайлатышы мүмкүн."</string>
@@ -407,14 +407,14 @@
     <string name="permdesc_readCallLog" msgid="8964770895425873433">"Бул колдонмо чалууларыңыздын таржымалын окуй алат."</string>
     <string name="permlab_writeCallLog" msgid="670292975137658895">"чалуулар тизмегин жаздыруу"</string>
     <string name="permdesc_writeCallLog" product="tablet" msgid="2657525794731690397">"Колдонмого планшетиңиздин чалуулар тизмегин, анын ичинде, чыгыш жана кириш чалууларына тиешелүү берилиштерди өзгөртүү уруксатын берет. Зыяндуу колдонмолор муну колдонуп чалуулар тизмегин өзгөртө же жок кыла алышат."</string>
-    <string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Колдонмого Android TV түзмөгүңүздүн чалуулар тизмесин, анын ичинде кирүүчү жана чыгуучу чалуулар тууралуу дайындарды өзгөртүүгө уруксат берет. Зыянкеч колдонмолор ал уруксатты колдонуп чалуулар тизмеңизди тазалап же өзгөртүп коюшу мүмкүн."</string>
+    <string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Колдонмого Android TV түзмөгүңүздүн чалуулар тизмесин, анын ичинде кирүүчү жана чыгуучу чалуулар тууралуу дайын-даректерди өзгөртүүгө уруксат берет. Зыянкеч колдонмолор ал уруксатты колдонуп чалуулар тизмеңизди тазалап же өзгөртүп коюшу мүмкүн."</string>
     <string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Колдонмого телефонуңуздун чалуулар тизмегин, анын ичинде, чыгыш жана кириш чалууларына тиешелүү берилиштерди өзгөртүү уруксатын берет. Зыяндуу колдонмолор муну колдонуп чалуулар тизмегин өзгөртө же жок кыла алышат."</string>
     <string name="permlab_bodySensors" msgid="3411035315357380862">"дене-бой сенсорлоруна (жүрөктүн кагышын өлчөгүчтөр сыяктуу) уруксат"</string>
-    <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Колдонмого жүрөгүңүздүн согушу сыяктуу дене-бой абалыңызды көзөмөлдөгөн сенсорлордогу дайындарды көрүп туруу мүмкүнчүлүгүн берет."</string>
+    <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Колдонмого жүрөгүңүздүн согушу сыяктуу дене-бой абалыңызды көзөмөлдөгөн сенсорлордогу дайын-даректерди көрүп туруу мүмкүнчүлүгүн берет."</string>
     <string name="permlab_readCalendar" msgid="6408654259475396200">"Жылнаамадагы иш-чараларды жана алардын чоо-жайын окуу"</string>
-    <string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"Бул колдонмо планшетиңизде сакталган жылнаамадагы иш-чаралардын баарын окуп жана андагы дайындарды бөлүшүп же сактай алат."</string>
+    <string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"Бул колдонмо планшетиңизде сакталган жылнаамадагы иш-чаралардын баарын окуп жана андагы дайын-даректерди бөлүшүп же сактай алат."</string>
     <string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"Бул колдонмо Android TV түзмөгүңүздө сакталган жылнаама иш-чараларынын баарын окуп, ошондой эле жылнаама дайындарын бөлүшүп же сактай алат."</string>
-    <string name="permdesc_readCalendar" product="default" msgid="9118823807655829957">"Бул колдонмо телефонуңузда сакталган жылнаамадагы иш-чаралардын баарын окуп жана андагы дайындарды бөлүшүп же сактай алат."</string>
+    <string name="permdesc_readCalendar" product="default" msgid="9118823807655829957">"Бул колдонмо телефонуңузда сакталган жылнаамадагы иш-чаралардын баарын окуп жана андагы дайын-даректерди бөлүшүп же сактай алат."</string>
     <string name="permlab_writeCalendar" msgid="6422137308329578076">"ээсинен уруксат албай, күнбаракка иш-аракеттерди кошуу же өзгөртүү жана конокторго чакыруу жөнөтүү"</string>
     <string name="permdesc_writeCalendar" product="tablet" msgid="8722230940717092850">"Бул колдонмо планшетиңизге жылнаама иш-чараларын кошуп, алып салып же өзгөртүшү мүмкүн. Бул колдонмо жылнаама ээсинин атынан билдирүүлөрдү жөнөтүп же ээсине эскертпестен иш-чараларды өзгөртүшү мүмкүн."</string>
     <string name="permdesc_writeCalendar" product="tv" msgid="951246749004952706">"Бул колдонмо Android TV түзмөгүңүзгө жылнаама иш-чараларын кошуп, ошондой эле аларды өчүрүшү же өзгөртүшү мүмкүн. Бул колдонмо жылнаама ээсинин атынан билдирүүлөрдү жөнөтүп же ээсине эскертпестен иш-чараларды өзгөртүшү мүмкүн."</string>
@@ -523,11 +523,11 @@
     <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"экранды бөгөттөөнүн татаалдык деңгээлин суроо"</string>
     <string name="permdesc_requestPasswordComplexity" msgid="1130556896836258567">"Колдонмого экранды бөгөттөөнүн татаалдыгын (татаал, орточо, оңой же такыр жок) үйрөнүүгө мүмкүнчүлүк берет. Татаалдык деңгээли сырсөздүн узундугу жана экранды бөгөттөөнүн түрү боюнча айырмаланат. Колдонмо экранды бөгөттөөнү белгилүү деңгээлге тууралоону колдонуучуларга сунуштай да алат, бирок колдонуучулар ага көңүл бурбай койсо болот. Сырсөздү колдонмо билбеши үчүн, экранды бөгөттөө сырсөзүн кадимки текстте сактоого болбойт."</string>
     <string name="permlab_useBiometric" msgid="6314741124749633786">"биометрикалык аппаратты колдонуу"</string>
-    <string name="permdesc_useBiometric" msgid="7502858732677143410">"Колдонмого аныктыгын текшерүү үчүн биометрикалык аппаратты пайдалануу мүмкүндүгүн берет"</string>
+    <string name="permdesc_useBiometric" msgid="7502858732677143410">"Колдонмого аныктыгын текшерүү үчүн, биометрикалык аппаратты пайдалануу мүмкүндүгүн берет"</string>
     <string name="permlab_manageFingerprint" msgid="7432667156322821178">"манжа изинин аппараттык камсыздоосун башкаруу"</string>
     <string name="permdesc_manageFingerprint" msgid="2025616816437339865">"Колдонмого пайдалануу үчүн манжа изинин үлгүлөрүн кошуу жана жок кылуу мүмкүндүгүн берет."</string>
     <string name="permlab_useFingerprint" msgid="1001421069766751922">"манжа изинин аппараттык камсыздоосун колдонуу"</string>
-    <string name="permdesc_useFingerprint" msgid="412463055059323742">"Колдонмого аныктыгын текшерүү үчүн манжа изинин аппараттык камсыздоосун пайдалануу мүмкүндүгүн берет"</string>
+    <string name="permdesc_useFingerprint" msgid="412463055059323742">"Колдонмого аныктыгын текшерүү үчүн, манжа изинин аппараттык камсыздоосун пайдалануу мүмкүндүгүн берет"</string>
     <string name="permlab_audioWrite" msgid="8501705294265669405">"музыка жыйнагыңызды өчүрүү"</string>
     <string name="permdesc_audioWrite" msgid="8057399517013412431">"Колдонмого музыка жыйнагыңызды өзгөртүүгө мүмкүнчүлүк берет."</string>
     <string name="permlab_videoWrite" msgid="5940738769586451318">"видео жыйнагыңызды өзгөртүү"</string>
@@ -672,9 +672,9 @@
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Сырсөз эрежелерин коюу"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"Экран кулпусунун сырсөздөрү менен PIN\'дерине уруксат берилген узундук менен белгилерди көзөмөлдөө."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"Экран кулпусун ачуу аракеттерин көзөмөлдөө"</string>
-    <string name="policydesc_watchLogin" product="tablet" msgid="2388436408621909298">"Экрандын кулпусу ачылып жатканда туура эмес терилген сырсөздөрдүн санын текшерип, эгер алардын саны өтө эле көп болсо, планшетти кулпулаңыз же планшеттеги бардык дайындарды тазалап салыңыз."</string>
+    <string name="policydesc_watchLogin" product="tablet" msgid="2388436408621909298">"Экрандын кулпусу ачылып жатканда туура эмес терилген сырсөздөрдүн санын текшерип, эгер алардын саны өтө эле көп болсо, планшетти кулпулаңыз же планшеттеги бардык дайын-даректерди тазалап салыңыз."</string>
     <string name="policydesc_watchLogin" product="tv" msgid="2140588224468517507">"Экрандын кулпусун ачуу учурунда сырсөздөр канча жолу туура эмес терилгенин тескөө жана сырсөз өтө көп жолу туура эмес терилген болсо, Android TV түзмөгүңүздү кулпулап же Android TV түзмөгүңүздөгү бардык дайын-даректериңизди тазалап салуу."</string>
-    <string name="policydesc_watchLogin" product="default" msgid="4885030206253600299">"Экрандын кулпусу ачылып жатканда туура эмес терилген сырсөздөрдүн санын текшерип, эгер алардын саны өтө эле көп болсо, телефонду кулпулаңыз же телефондогу бардык дайындарды тазалап салыңыз."</string>
+    <string name="policydesc_watchLogin" product="default" msgid="4885030206253600299">"Экрандын кулпусу ачылып жатканда туура эмес терилген сырсөздөрдүн санын текшерип, эгер алардын саны өтө эле көп болсо, телефонду кулпулаңыз же телефондогу бардык дайын-даректерди тазалап салыңыз."</string>
     <string name="policydesc_watchLogin_secondaryUser" product="tablet" msgid="2049038943004297474">"Экрандын кулпусун ачуу учурунда туура эмес терилген сырсөздөрдү тескөө жана сырсөз өтө көп жолу туура эмес терилген болсо, планшетти кулпулап же бул колдонуучунун бардык дайындарын тазалап салуу."</string>
     <string name="policydesc_watchLogin_secondaryUser" product="tv" msgid="8965224107449407052">"Экрандын кулпусун ачуу учурунда сырсөздөр канча жолу туура эмес терилгенин тескөө жана сырсөз өтө көп жолу туура эмес терилген болсо, Android TV түзмөгүңүздү кулпулап же колдонуучунун бардык дайындарын тазалап салуу."</string>
     <string name="policydesc_watchLogin_secondaryUser" product="default" msgid="9177645136475155924">"Экрандын кулпусун ачуу учурунда туура эмес терилген сырсөздөрдү тескөө жана сырсөз өтө көп жолу туура эмес терилген болсо, телефонду кулпулап же бул колдонуучунун бардык дайындарын тазалап салуу."</string>
@@ -683,9 +683,9 @@
     <string name="policylab_forceLock" msgid="7360335502968476434">"Экранды кулпулоо"</string>
     <string name="policydesc_forceLock" msgid="1008844760853899693">"Экран качан жана кантип кулпулана турганын башкарат."</string>
     <string name="policylab_wipeData" msgid="1359485247727537311">"Бардык маалыматты өчүрүү"</string>
-    <string name="policydesc_wipeData" product="tablet" msgid="7245372676261947507">"Алдын-ала эскертпестен, баштапкы абалга келтирүү функциясы менен планшеттеги бардык дайындарды өчүрөт."</string>
+    <string name="policydesc_wipeData" product="tablet" msgid="7245372676261947507">"Алдын-ала эскертпестен, баштапкы абалга келтирүү функциясы менен планшеттеги бардык дайын-даректерди өчүрөт."</string>
     <string name="policydesc_wipeData" product="tv" msgid="513862488950801261">"Android TV түзмөгүңүздүн дайындарын эскертүүсүз кайра башынан жөндөө аркылуу тазалоо."</string>
-    <string name="policydesc_wipeData" product="default" msgid="8036084184768379022">"Алдын-ала эскертпестен, баштапкы абалга келтирүү функциясы менен телефондогу бардык дайындарды өчүрөт."</string>
+    <string name="policydesc_wipeData" product="default" msgid="8036084184768379022">"Алдын-ала эскертпестен, баштапкы абалга келтирүү функциясы менен телефондогу бардык дайын-даректерди өчүрөт."</string>
     <string name="policylab_wipeData_secondaryUser" msgid="413813645323433166">"Колдонуучунун дайындарын тазалоо"</string>
     <string name="policydesc_wipeData_secondaryUser" product="tablet" msgid="2336676480090926470">"Бул колдонуучунун ушул планшеттеги дайындарын эскертүүсүз тазалоо."</string>
     <string name="policydesc_wipeData_secondaryUser" product="tv" msgid="2293713284515865200">"Бул Android TV түзмөгүндөгү бул колдонуучу дайындарын эскертүүсүз тазалоо."</string>
@@ -840,8 +840,8 @@
     <string name="lockscreen_missing_sim_message" product="tablet" msgid="8596805728510570760">"Планшетте SIM-карта жок."</string>
     <string name="lockscreen_missing_sim_message" product="tv" msgid="2582768023352171073">"Android TV түзмөгүңүздө SIM-карта жок."</string>
     <string name="lockscreen_missing_sim_message" product="default" msgid="1408695081255172556">"Телефондо SIM-карта жок."</string>
-    <string name="lockscreen_missing_sim_instructions" msgid="8473601862688263903">"SIM-картаны салыңыз."</string>
-    <string name="lockscreen_missing_sim_instructions_long" msgid="3664999892038416334">"SIM-карта жок же ал окулбайт. SIM-картаны салыңыз."</string>
+    <string name="lockscreen_missing_sim_instructions" msgid="8473601862688263903">"SIM картаны салыңыз."</string>
+    <string name="lockscreen_missing_sim_instructions_long" msgid="3664999892038416334">"SIM-карта жок же ал окулбайт. SIM картаны салыңыз."</string>
     <string name="lockscreen_permanent_disabled_sim_message_short" msgid="3812893366715730539">"Жараксыз SIM-карта."</string>
     <string name="lockscreen_permanent_disabled_sim_instructions" msgid="4358929052509450807">"SIM картаңыз биротоло өчүрүлдү.\n Башка SIM карта алыш үчүн зымсыз тейлөөчүгө кайрылыңыз."</string>
     <string name="lockscreen_transport_prev_description" msgid="2879469521751181478">"Мурунку трек"</string>
@@ -1216,18 +1216,18 @@
     <string name="dump_heap_ready_text" msgid="5849618132123045516">"<xliff:g id="PROC">%1$s</xliff:g> иштетүүсүнүн үймө дампы сиз үчүн бөлүшүүгө даяр. Абайлаңыз: бул үймө дампты иштетүү процессинде окула турган купуя жеке, анын ичинде терип киргизген маалыматыңыз камтылышы мүмкүн."</string>
     <string name="sendText" msgid="493003724401350724">"Текст үчүн аракет тандаңыз"</string>
     <string name="volume_ringtone" msgid="134784084629229029">"Коңгуроонун үн көлөмү"</string>
-    <string name="volume_music" msgid="7727274216734955095">"Мультимедианын үнү"</string>
+    <string name="volume_music" msgid="7727274216734955095">"Мультимедианын катуулугу"</string>
     <string name="volume_music_hint_playing_through_bluetooth" msgid="2614142915948898228">"Bluetooth аркылуу ойнотулууда"</string>
     <string name="volume_music_hint_silent_ringtone_selected" msgid="1514829655029062233">"Үнсүз рингтон орнотулду"</string>
     <string name="volume_call" msgid="7625321655265747433">"Чалуудагы үн көлөмү"</string>
     <string name="volume_bluetooth_call" msgid="2930204618610115061">"Bluetooth чалуудагы үн көлөмү"</string>
-    <string name="volume_alarm" msgid="4486241060751798448">"Ойготкучтун үнү"</string>
+    <string name="volume_alarm" msgid="4486241060751798448">"Ойготкучтун катуулугу"</string>
     <string name="volume_notification" msgid="6864412249031660057">"Эскертме үн көлөмү"</string>
     <string name="volume_unknown" msgid="4041914008166576293">"Үн көлөмү"</string>
     <string name="volume_icon_description_bluetooth" msgid="7540388479345558400">"Bluetooth үнүнүн деңгээли"</string>
     <string name="volume_icon_description_ringer" msgid="2187800636867423459">"Коңгуроо үнүнүн деңгээли"</string>
     <string name="volume_icon_description_incall" msgid="4491255105381227919">"Чалуунун үн деңгээли"</string>
-    <string name="volume_icon_description_media" msgid="4997633254078171233">"Мультимедианын үнү"</string>
+    <string name="volume_icon_description_media" msgid="4997633254078171233">"Мультимедианын катуулугу"</string>
     <string name="volume_icon_description_notification" msgid="579091344110747279">"Эскертме үнүнүн деңгээли"</string>
     <string name="ringtone_default" msgid="9118299121288174597">"Демейки шыңгыр"</string>
     <string name="ringtone_default_with_actual" msgid="2709686194556159773">"Демейки шыңгыр (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
@@ -1281,8 +1281,8 @@
     <string name="sim_added_message" msgid="6602906609509958680">"Мобилдик түйүнкгө жетки алуу үчүн, түзмөгүңүздү өчүрүп кайра жандырыңыз."</string>
     <string name="sim_restart_button" msgid="8481803851341190038">"Өчүрүп күйгүзүү"</string>
     <string name="install_carrier_app_notification_title" msgid="5712723402213090102">"Мобилдик кызматты жандыруу"</string>
-    <string name="install_carrier_app_notification_text" msgid="2781317581274192728">"Жаңы SIM-картаны жандыруу үчүн байланыш операторунун колдонмосун жүктөп алыңыз"</string>
-    <string name="install_carrier_app_notification_text_app_name" msgid="4086877327264106484">"Жаңы SIM-картаны жандыруу үчүн <xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосун жүктөп алыңыз"</string>
+    <string name="install_carrier_app_notification_text" msgid="2781317581274192728">"Жаңы SIM картаны жандыруу үчүн байланыш операторунун колдонмосун жүктөп алыңыз"</string>
+    <string name="install_carrier_app_notification_text_app_name" msgid="4086877327264106484">"Жаңы SIM картаны жандыруу үчүн <xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосун жүктөп алыңыз"</string>
     <string name="install_carrier_app_notification_button" msgid="6257740533102594290">"Колдонмону жүктөп алуу"</string>
     <string name="carrier_app_notification_title" msgid="5815477368072060250">"Жаңы SIM карта салынды"</string>
     <string name="carrier_app_notification_text" msgid="6567057546341958637">"Аны жөндөө үчүн таптап коюңуз"</string>
@@ -1457,6 +1457,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"<xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>) сурады"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"Ооба"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"Жок"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"Кырсыктагандагы жайгашкан жер аныкталды"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"Акыркы жолу телефон чалганыңызда түзмөктү иштеп чыгуучу кайда турганыңызды аныктады"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"Акыркы жолу телефон чалганыңызда байланыш операторуңуз кайда турганыңызды аныктады"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"Жок кылуу чегинен ашты"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"<xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> эсебине тиешелүү <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g> боюнча <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> өчүрүлгөн элемент бар. Мындан аркы кадамдарыңыз кандай болот?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"Элементтерди жок кылуу"</string>
@@ -1591,7 +1594,7 @@
     <string name="kg_password_wrong_pin_code" msgid="9013856346870572451">"PIN-код туура эмес."</string>
     <string name="kg_invalid_sim_pin_hint" msgid="4821601451222564077">"Узундугу 4төн 8ге чейинки сандан турган PIN-кодду териңиз."</string>
     <string name="kg_invalid_sim_puk_hint" msgid="2539364558870734339">"PUK-код 8 сандан турушу керек."</string>
-    <string name="kg_invalid_puk" msgid="4809502818518963344">"Туура PUK-кодду кайрадан териңиз. Кайталанган аракеттер SIM-картаны биротоло жараксыз кылат."</string>
+    <string name="kg_invalid_puk" msgid="4809502818518963344">"Туура PUK-кодду кайрадан териңиз. Кайталанган аракеттер SIM картаны биротоло жараксыз кылат."</string>
     <string name="kg_invalid_confirm_pin_hint" product="default" msgid="4705368340409816254">"PIN-коддор туура келбеди"</string>
     <string name="kg_login_too_many_attempts" msgid="699292728290654121">"Өтө көп үлгү киргизүү аракети болду"</string>
     <string name="kg_login_instructions" msgid="3619844310339066827">"Бөгөттөн чыгарыш үчүн, Google эсебиңиз менен кириңиз."</string>
@@ -1653,8 +1656,8 @@
     <string name="accessibility_button_prompt_text" msgid="8343213623338605305">"Атайын мүмкүнчүлүктөр баскычын таптаганыңызда иштей турган функцияны тандаңыз:"</string>
     <string name="accessibility_gesture_prompt_text" msgid="8742535972130563952">"Атайын мүмкүнчүлүктөр жаңсоосу үчүн функцияны тандаңыз (эки манжаңыз менен экрандын ылдый жагынан өйдө карай сүрүңүз):"</string>
     <string name="accessibility_gesture_3finger_prompt_text" msgid="5211827854510660203">"Атайын мүмкүнчүлүктөр жаңсоосу аркылуу иштетиле турган функцияны тандаңыз (үч манжаңыз менен экрандын ылдый жагынан өйдө карай сүрүңүз):"</string>
-    <string name="accessibility_button_instructional_text" msgid="8853928358872550500">"Функцияларды которуштуруу үчүн Атайын мүмкүнчүлүктөр баскычын басып, кармап туруңуз."</string>
-    <string name="accessibility_gesture_instructional_text" msgid="9196230728837090497">"Функцияларды которуштуруу үчүн эки манжаңыз менен өйдө сүрүп, кармап туруңуз."</string>
+    <string name="accessibility_button_instructional_text" msgid="8853928358872550500">"Функцияларды которуштуруу үчүн, Атайын мүмкүнчүлүктөр баскычын басып, кармап туруңуз."</string>
+    <string name="accessibility_gesture_instructional_text" msgid="9196230728837090497">"Функцияларды которуштуруу үчүн, эки манжаңыз менен өйдө сүрүп, кармап туруңуз."</string>
     <string name="accessibility_gesture_3finger_instructional_text" msgid="3425123684990193765">"Башка функцияга которулуу үчүн үч манжаңыз менен экранды өйдө сүрүп, кармап туруңуз."</string>
     <string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Чоңойтуу"</string>
     <string name="user_switched" msgid="7249833311585228097">"Учурдагы колдонуучу <xliff:g id="NAME">%1$s</xliff:g>."</string>
@@ -1790,8 +1793,8 @@
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"Администраторуңуз жок кылып салган"</string>
     <string name="confirm_battery_saver" msgid="5247976246208245754">"ЖАРАЙТ"</string>
     <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"Батареяны үнөмдөө үчүн Батареяны үнөмдөгүч:\n·Караңгы теманы күйгүзөт\n·Фондогу аракеттерди, айрым визуалдык эффекттерди жана \"Окей Google\" сыяктуу башка функцияларды өчүрөт же чектейт\n\n"<annotation id="url">"Кеңири маалымат"</annotation></string>
-    <string name="battery_saver_description" msgid="7618492104632328184">"Батареяны үнөмдөө үчүн Батареяны үнөмдөгүч режими:\n·Караңгы теманы күйгүзөт\n·Фондогу аракеттерди, айрым визуалдык эффекттерди жана \"Окей Google\" сыяктуу башка функцияларды өчүрөт же чектейт"</string>
-    <string name="data_saver_description" msgid="4995164271550590517">"Трафикти үнөмдөө режиминде айрым колдонмолор дайындарды фондо өткөрө алышпайт. Учурда сиз пайдаланып жаткан колдонмо дайындарды жөнөтүп/ала алат, бирок адаттагыдан азыраак өткөргөндүктөн, анын айрым функциялары талаптагыдай иштебей коюшу мүмкүн. Мисалы, сүрөттөр басылмайынча жүктөлбөйт."</string>
+    <string name="battery_saver_description" msgid="7618492104632328184">"Батареянын иштешин узартуу үчүн, Батареяны үнөмдөөчү режим:\n·Караңгы теманы күйгүзөт;\n·Фондогу аракеттерди, айрым визуалдык эффекттерди жана \"Окей Google\" сыяктуу башка функцияларды өчүрөт же чектейт"</string>
+    <string name="data_saver_description" msgid="4995164271550590517">"Трафикти үнөмдөө режиминде айрым колдонмолор дайын-даректерди фондо өткөрө алышпайт. Учурда сиз пайдаланып жаткан колдонмо дайын-даректерди жөнөтүп/ала алат, бирок адаттагыдан азыраак өткөргөндүктөн, анын айрым функциялары талаптагыдай иштебей коюшу мүмкүн. Мисалы, сүрөттөр басылмайынча жүктөлбөйт."</string>
     <string name="data_saver_enable_title" msgid="7080620065745260137">"Трафикти үнөмдөө режимин иштетесизби?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Күйгүзүү"</string>
     <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
@@ -1958,12 +1961,12 @@
     <string name="etws_primary_default_message_earthquake" msgid="8401079517718280669">"Эс алып, жакын жерден калканч издеңиз."</string>
     <string name="etws_primary_default_message_tsunami" msgid="5828171463387976279">"Деңиз жана дарыя жээгинде жайгашкан аймактардан бийик тоо сыяктуу коопсуз жерге тезинен чыгып кетиңиз."</string>
     <string name="etws_primary_default_message_earthquake_and_tsunami" msgid="4888224011071875068">"Эс алып, жакын жерден калканч издеңиз."</string>
-    <string name="etws_primary_default_message_test" msgid="4583367373909549421">"Өзгөчө кырдаалда жөнөтүлүүчү билдирүүлөрдү сыноо"</string>
+    <string name="etws_primary_default_message_test" msgid="4583367373909549421">"Кырсыктаганда жөнөтүлүүчү билдирүүлөрдү сыноо"</string>
     <string name="notification_reply_button_accessibility" msgid="5235776156579456126">"Жооп берүү"</string>
     <string name="etws_primary_default_message_others" msgid="7958161706019130739"></string>
-    <string name="mmcc_authentication_reject" msgid="4891965994643876369">"SIM-картаны сүйлөшүү үчүн колдонууга тыюу салынган"</string>
+    <string name="mmcc_authentication_reject" msgid="4891965994643876369">"SIM картаны сүйлөшүү үчүн колдонууга тыюу салынган"</string>
     <string name="mmcc_imsi_unknown_in_hlr" msgid="227760698553988751">"SIM-карта сүйлөшүү үчүн таанылган жок"</string>
-    <string name="mmcc_illegal_ms" msgid="7509650265233909445">"SIM-картаны сүйлөшүү үчүн колдонууга тыюу салынган"</string>
+    <string name="mmcc_illegal_ms" msgid="7509650265233909445">"SIM картаны сүйлөшүү үчүн колдонууга тыюу салынган"</string>
     <string name="mmcc_illegal_me" msgid="6505557881889904915">"Телефонду сүйлөшүү үчүн колдонууга тыюу салынган"</string>
     <string name="mmcc_authentication_reject_msim_template" msgid="4480853038909922153">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> картасына уруксат берилген жок"</string>
     <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="3688508325248599657">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> картасы таанылган жок"</string>
diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml
index b22fa0e..5ff7a69 100644
--- a/core/res/res/values-lo/strings.xml
+++ b/core/res/res/values-lo/strings.xml
@@ -1457,6 +1457,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"ຮ້ອງຂໍໂດຍ <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"ຕົກລົງ"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"ບໍ່"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"ມີການເຂົ້າເຖິງສະຖານທີ່ສຸກເສີນ"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"ຜູ້ຜະລິດອຸປະກອນຂອງທ່ານເຂົ້າເຖິງສະຖານທີ່ທ່ານໃນລະຫວ່າງຊ່ວງເວລາສຸກເສີນຫຼ້າສຸດຂອງທ່ານ"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"ຜູ້ໃຫ້ບໍລິການຂອງທ່ານເຂົ້າເຖິງສະຖານທີ່ທ່ານໃນລະຫວ່າງຊ່ວງເວລາສຸກເສີນຫຼ້າສຸດຂອງທ່ານ"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"ກາຍເຂດກຳນົດການລຶບ"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"ມີ <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> ລາຍການທີ່ຖືກລຶບສຳລັບ <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>, ບັນຊີ <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>. ທ່ານຕ້ອງການຈະເຮັດແນວໃດ?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"ລຶບລາຍການ"</string>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index 1b2d0b5..2b04156 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -1499,6 +1499,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"Užklausą pateikė <xliff:g id="NAME">%1$s</xliff:g> („<xliff:g id="SERVICE">%2$s</xliff:g>“)"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"Taip"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"Ne"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"Pasiekta kritinės padėties vietovės inf."</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"Įrenginio gamintojas pasiekė jūsų vietovės duomenis per naujausią kritinės padėties seansą"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"Operatorius pasiekė jūsų vietovės duomenis per naujausią kritinės padėties seansą"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"Viršytas ištrynimo apribojimas"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"Yra <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> ištr. element., skirt. <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>, „<xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>“ pask. Ką norite daryti?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"Ištrinti elementus"</string>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index 9cb4bd6..c80e3ac 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -1478,6 +1478,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"Pieprasīja: <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"Jā"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"Nē"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"Piekļuve atrašanās vietai ārkārtas brīdī"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"Jūsu ierīces ražotājs piekļuva jūsu atrašanās vietai nesena ārkārtas izsaukuma laikā."</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"Jūsu mobilo sakaru operators piekļuva jūsu atrašanās vietai nesena ārkārtas izsaukuma laikā."</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"Pārsniegts dzēšanas ierobežojums"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"<xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>, konts <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>: izdzēsti <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> vienumi. Kādas darbības vēlaties veikt?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"Dzēsiet šos vienumus."</string>
diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml
index 3807da8..f7e23a8 100644
--- a/core/res/res/values-mk/strings.xml
+++ b/core/res/res/values-mk/strings.xml
@@ -1299,7 +1299,7 @@
     <string name="usb_supplying_notification_title" msgid="5378546632408101811">"Поврзаниот уред се полни преку USB"</string>
     <string name="usb_mtp_notification_title" msgid="1065989144124499810">"Вклучен е пренос на датотеки преку USB"</string>
     <string name="usb_ptp_notification_title" msgid="5043437571863443281">"Вклучен е PTP преку USB"</string>
-    <string name="usb_tether_notification_title" msgid="8828527870612663771">"Вклучено е врзување преку USB"</string>
+    <string name="usb_tether_notification_title" msgid="8828527870612663771">"Вклучен е интернет преку USB"</string>
     <string name="usb_midi_notification_title" msgid="7404506788950595557">"Вклучен е MIDI преку USB"</string>
     <string name="usb_accessory_notification_title" msgid="1385394660861956980">"Поврзан е USB-додаток"</string>
     <string name="usb_notification_message" msgid="4715163067192110676">"Допрете за повеќе опции."</string>
@@ -1457,14 +1457,17 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"Побарано од <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"Да"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"Не"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"Пристапено до локацијата за итни случаи"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"Производителот на уредот пристапи до вашата локација при неодамнешна итна сесија"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"Операторот пристапи до вашата локација при неодамнешна итна сесија"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"Границата на бришење е надмината"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"Постојат <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> избришани ставки за <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>, <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> сметка. Што сакате да направите?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"Избриши ги ставките"</string>
     <string name="sync_undo_deletes" msgid="5786033331266418896">"Врати ги избришаните"</string>
     <string name="sync_do_nothing" msgid="4528734662446469646">"Не прави ништо засега"</string>
     <string name="choose_account_label" msgid="5557833752759831548">"Изберете сметка"</string>
-    <string name="add_account_label" msgid="4067610644298737417">"Додај сметка"</string>
-    <string name="add_account_button_label" msgid="322390749416414097">"Додај сметка"</string>
+    <string name="add_account_label" msgid="4067610644298737417">"Додајте сметка"</string>
+    <string name="add_account_button_label" msgid="322390749416414097">"Додајте сметка"</string>
     <string name="number_picker_increment_button" msgid="7621013714795186298">"Зголеми"</string>
     <string name="number_picker_decrement_button" msgid="5116948444762708204">"Намали"</string>
     <string name="number_picker_increment_scroll_mode" msgid="8403893549806805985">"<xliff:g id="VALUE">%s</xliff:g> допри и задржи."</string>
@@ -1792,9 +1795,9 @@
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"Избришано од администраторот"</string>
     <string name="confirm_battery_saver" msgid="5247976246208245754">"Во ред"</string>
     <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"За да го продолжи траењето на батеријата, „Штедачот на батерија“:\n·вклучува темна тема\n·исклучува или ограничува активност во заднина, некои визуелни ефекти и други функции како „Hey Google“\n\n"<annotation id="url">"Дознајте повеќе"</annotation></string>
-    <string name="battery_saver_description" msgid="7618492104632328184">"За да го продолжи траењето на батеријата, „Штедачот на батерија“:\n·вклучува темна тема\n·исклучува или ограничува активност во заднина, некои визуелни ефекти и други функции како „Hey Google“"</string>
-    <string name="data_saver_description" msgid="4995164271550590517">"За да се намали користењето интернет, „Штедачот на интернет“ спречува дел од апликациите да испраќаат или да примаат податоци во заднина. Апликацијата што ја користите во моментов можеби ќе пристапува до интернет, но тоа ќе го прави поретко. Ова значи, на пример, дека сликите нема да се прикажат додека не ги допрете."</string>
-    <string name="data_saver_enable_title" msgid="7080620065745260137">"Вклучете Штедач на интернет?"</string>
+    <string name="battery_saver_description" msgid="7618492104632328184">"За да го продолжи траењето на батеријата, „Штедачот на батерија“:\n·вклучува „Темна тема“;\n·исклучува или ограничува активност во заднина, некои визуелни ефекти и други функции како „Ok Google“."</string>
+    <string name="data_saver_description" msgid="4995164271550590517">"За да се намали користењето интернет, „Штедачот на интернет“ спречува дел од апликациите да испраќаат или да примаат податоци во заднина. Одредена апликација што ја користите ќе може да користи интернет, но можеби тоа ќе го прави поретко. Ова значи, на пример, дека сликите нема да се прикажуваат додека не ги допрете."</string>
+    <string name="data_saver_enable_title" msgid="7080620065745260137">"Да се вклучи „Штедач на интернет“?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Вклучи"</string>
     <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
       <item quantity="one">За %1$d минута (до <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
@@ -1874,7 +1877,7 @@
     <string name="notification_history_title_placeholder" msgid="7748630986182249599">"Приспособено известување за апликација"</string>
     <string name="user_creation_account_exists" msgid="2239146360099708035">"Дозволувате <xliff:g id="APP">%1$s</xliff:g> да создаде нов корисник со <xliff:g id="ACCOUNT">%2$s</xliff:g>? (Веќе постои корисник со оваа сметка.)"</string>
     <string name="user_creation_adding" msgid="7305185499667958364">"Дозволувате <xliff:g id="APP">%1$s</xliff:g> да создаде нов корисник со <xliff:g id="ACCOUNT">%2$s</xliff:g>?"</string>
-    <string name="language_selection_title" msgid="52674936078683285">"Додај јазик"</string>
+    <string name="language_selection_title" msgid="52674936078683285">"Додајте јазик"</string>
     <string name="country_selection_title" msgid="5221495687299014379">"Претпочитувања за регион"</string>
     <string name="search_language_hint" msgid="7004225294308793583">"Внеси име на јазик"</string>
     <string name="language_picker_section_suggested" msgid="6556199184638990447">"Предложени"</string>
diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml
index e54cf72..3c76caf 100644
--- a/core/res/res/values-ml/strings.xml
+++ b/core/res/res/values-ml/strings.xml
@@ -239,7 +239,7 @@
     <string name="global_action_power_off" msgid="4404936470711393203">"പവർ ഓഫാക്കുക"</string>
     <string name="global_action_power_options" msgid="1185286119330160073">"പവർ"</string>
     <string name="global_action_restart" msgid="4678451019561687074">"റീസ്റ്റാർട്ട് ചെയ്യുക"</string>
-    <string name="global_action_emergency" msgid="1387617624177105088">"അടിയന്തിരാവശ്യം"</string>
+    <string name="global_action_emergency" msgid="1387617624177105088">"അടിയന്തരാവശ്യം"</string>
     <string name="global_action_bug_report" msgid="5127867163044170003">"ബഗ് റിപ്പോർട്ട്"</string>
     <string name="global_action_logout" msgid="6093581310002476511">"സെഷൻ അവസാനിപ്പിക്കുക"</string>
     <string name="global_action_screenshot" msgid="2610053466156478564">"സ്‌ക്രീൻഷോട്ട്"</string>
@@ -1457,6 +1457,12 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"<xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>) അഭ്യർത്ഥിച്ചത്"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"വേണം"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"വേണ്ട"</string>
+    <!-- no translation found for gnss_nfw_notification_title (5004493772059563423) -->
+    <skip />
+    <!-- no translation found for gnss_nfw_notification_message_oem (3683958907027107969) -->
+    <skip />
+    <!-- no translation found for gnss_nfw_notification_message_carrier (815888995791562151) -->
+    <skip />
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"ഇല്ലാതാക്കൽ പരിധി കഴിഞ്ഞു"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"<xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> എന്ന അക്കൗണ്ടിലെ <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g> എന്നതിനായി ഇല്ലാതാക്കിയ <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> ഇനങ്ങളുണ്ട്. നിങ്ങൾ എന്തുചെയ്യാൻ താൽപ്പര്യപ്പെടുന്നു?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"ഇനങ്ങൾ ഇല്ലാതാക്കുക"</string>
@@ -1646,7 +1652,7 @@
     <string name="disable_accessibility_shortcut" msgid="5806091378745232383">"കുറുക്കുവഴി ‌ഓഫാക്കുക"</string>
     <string name="leave_accessibility_shortcut_on" msgid="6543362062336990814">"കുറുക്കുവഴി ഉപയോഗിക്കുക"</string>
     <string name="color_inversion_feature_name" msgid="326050048927789012">"വർണ്ണ വിപര്യയം"</string>
-    <string name="color_correction_feature_name" msgid="3655077237805422597">"വർണ്ണം ക്രമീകരിക്കൽ"</string>
+    <string name="color_correction_feature_name" msgid="3655077237805422597">"നിറം ക്രമീകരിക്കൽ"</string>
     <string name="accessibility_shortcut_enabling_service" msgid="5473495203759847687">"വോളിയം കീകൾ പിടിച്ചു. <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ഓണാക്കി."</string>
     <string name="accessibility_shortcut_disabling_service" msgid="8675244165062700619">"വോളിയം കീകൾ പിടിച്ചു. <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ഓഫാക്കി."</string>
     <string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> ഉപയോഗിക്കാൻ, രണ്ട് വോളിയം കീകളും മൂന്ന് സെക്കൻഡ് അമർത്തിപ്പിടിക്കുക"</string>
diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml
index 4fcbe76..f996343 100644
--- a/core/res/res/values-mn/strings.xml
+++ b/core/res/res/values-mn/strings.xml
@@ -297,7 +297,7 @@
     <string name="permgroupdesc_contacts" msgid="9163927941244182567">"харилцагч руугаа хандах"</string>
     <string name="permgrouplab_location" msgid="1858277002233964394">"Байршил"</string>
     <string name="permgroupdesc_location" msgid="1995955142118450685">"энэ төхөөрөмжийн байршилд хандалт хийх"</string>
-    <string name="permgrouplab_calendar" msgid="6426860926123033230">"Хуанли"</string>
+    <string name="permgrouplab_calendar" msgid="6426860926123033230">"Календарь"</string>
     <string name="permgroupdesc_calendar" msgid="6762751063361489379">"Хуанли руу хандах"</string>
     <string name="permgrouplab_sms" msgid="795737735126084874">"Мессеж"</string>
     <string name="permgroupdesc_sms" msgid="5726462398070064542">"SMS мессежийг илгээх, харах"</string>
@@ -1457,6 +1457,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"<xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>) хүсэлт илгээсэн"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"Тийм"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"Үгүй"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"Яаралтай тусламжийн байршилд хандсан"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"Таны төхөөрөмжийн үйлдвэрлэгч саяхны яаралтай тусламжийн харилцан үйлдлийн үеэр таны байршилд хандсан байна"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"Таны оператор компани саяхны яаралтай тусламжийн харилцан үйлдлийн үеэр таны байршилд хандсан байна"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"Устгах хязгаар хэтрэв"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"<xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>-р <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> бүртгэлийн <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> зүйл устсан . Та юу хиймээр байна?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"Устгах"</string>
@@ -1791,7 +1794,7 @@
     <string name="confirm_battery_saver" msgid="5247976246208245754">"ОК"</string>
     <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"Батарейн ажиллах хугацааг уртасгахын тулд Батарей хэмнэгч нь:\n·Бараан загварыг асаадаг\n·Арын үйл ажиллагаа, зарим визуал эффект болон “Hey Google” зэрэг бусад онцлогийг унтрааж эсвэл хязгаарладаг\n\n"<annotation id="url">"Нэмэлт мэдээлэл авах"</annotation></string>
     <string name="battery_saver_description" msgid="7618492104632328184">"Батарейн ажиллах хугацааг уртасгахын тулд Батарей хэмнэгч нь:\n·Бараан загварыг асаадаг\n·Арын үйл ажиллагаа, зарим визуал эффект болон “Hey Google” зэрэг бусад онцлогийг унтрааж эсвэл хязгаарладаг"</string>
-    <string name="data_saver_description" msgid="4995164271550590517">"Дата ашиглалтыг багасгахын тулд дата хэмнэгч нь зарим апп-н өгөгдлийг дэвсгэрт илгээх болон авахаас сэргийлдэг. Таны одоогийн ашиглаж буй апп нь өгөгдөлд хандах боломжтой хэдий ч тогтмол хандахгүй. Жишээлбэл зургийг товших хүртэл харагдахгүй."</string>
+    <string name="data_saver_description" msgid="4995164271550590517">"Дата ашиглалтыг багасгахын тулд дата хэмнэгч нь ар талд ажиллаж буй зарим апп-н өгөгдлийг илгээх болон авахаас сэргийлдэг. Таны одоогийн ашиглаж буй апп нь өгөгдөлд хандах боломжтой хэдий ч тогтмол хандахгүй. Энэ нь жишээлбэл зургийг товших хүртэл харагдахгүй гэсэн үг юм."</string>
     <string name="data_saver_enable_title" msgid="7080620065745260137">"Дата хэмнэгчийг асаах уу?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Асаах"</string>
     <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
@@ -1901,7 +1904,7 @@
     <string name="pin_specific_target" msgid="7824671240625957415">"<xliff:g id="LABEL">%1$s</xliff:g>-г бэхлэх"</string>
     <string name="unpin_target" msgid="3963318576590204447">"Unpin"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g>-г тогтоосныг болиулах"</string>
-    <string name="app_info" msgid="6113278084877079851">"Апп-н мэдээлэл"</string>
+    <string name="app_info" msgid="6113278084877079851">"Аппын мэдээлэл"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"Жишээг эхлүүлж байна…"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"Төхөөрөмжийг шинэчилж байна…"</string>
diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml
index feba806..5187245 100644
--- a/core/res/res/values-mr/strings.xml
+++ b/core/res/res/values-mr/strings.xml
@@ -236,7 +236,7 @@
     <string name="global_actions" product="tv" msgid="3871763739487450369">"Android TV पर्याय"</string>
     <string name="global_actions" product="default" msgid="6410072189971495460">"फोन पर्याय"</string>
     <string name="global_action_lock" msgid="6949357274257655383">"स्क्रीन लॉक"</string>
-    <string name="global_action_power_off" msgid="4404936470711393203">"बंद"</string>
+    <string name="global_action_power_off" msgid="4404936470711393203">"बंद करा"</string>
     <string name="global_action_power_options" msgid="1185286119330160073">"पॉवर"</string>
     <string name="global_action_restart" msgid="4678451019561687074">"रीस्टार्ट करा"</string>
     <string name="global_action_emergency" msgid="1387617624177105088">"आणीबाणी"</string>
@@ -257,9 +257,9 @@
     <string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"बग रिपोर्टसह स्क्रीनशॉट घेता आला नाही"</string>
     <string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"मूक मोड"</string>
     <string name="global_action_silent_mode_on_status" msgid="2371892537738632013">"ध्वनी बंद आहे"</string>
-    <string name="global_action_silent_mode_off_status" msgid="6608006545950920042">"ध्वनी चालू आहे"</string>
+    <string name="global_action_silent_mode_off_status" msgid="6608006545950920042">"ध्वनी सुरू आहे"</string>
     <string name="global_actions_toggle_airplane_mode" msgid="6911684460146916206">"विमान मोड"</string>
-    <string name="global_actions_airplane_mode_on_status" msgid="5508025516695361936">"विमान मोड चालू आहे"</string>
+    <string name="global_actions_airplane_mode_on_status" msgid="5508025516695361936">"विमान मोड सुरू आहे"</string>
     <string name="global_actions_airplane_mode_off_status" msgid="8522219771500505475">"विमान मोड बंद आहे"</string>
     <string name="global_action_settings" msgid="4671878836947494217">"सेटिंग्ज"</string>
     <string name="global_action_assist" msgid="2517047220311505805">"सहाय्यता"</string>
@@ -284,9 +284,9 @@
     <string name="notification_channel_retail_mode" msgid="3732239154256431213">"रीटेल डेमो"</string>
     <string name="notification_channel_usb" msgid="1528280969406244896">"USB कनेक्‍शन"</string>
     <string name="notification_channel_heavy_weight_app" msgid="17455756500828043">"APP चालत आहे"</string>
-    <string name="notification_channel_foreground_service" msgid="7102189948158885178">"बॅटरी लवकर संपवणारी ॲप्‍स"</string>
+    <string name="notification_channel_foreground_service" msgid="7102189948158885178">"बॅटरी लवकर संपवणारी अ‍ॅप्स"</string>
     <string name="foreground_service_app_in_background" msgid="1439289699671273555">"<xliff:g id="APP_NAME">%1$s</xliff:g> बॅटरी वापरत आहे"</string>
-    <string name="foreground_service_apps_in_background" msgid="7340037176412387863">"<xliff:g id="NUMBER">%1$d</xliff:g> ॲप्‍स बॅटरी वापरत आहेत"</string>
+    <string name="foreground_service_apps_in_background" msgid="7340037176412387863">"<xliff:g id="NUMBER">%1$d</xliff:g> अ‍ॅप्स बॅटरी वापरत आहेत"</string>
     <string name="foreground_service_tap_for_details" msgid="9078123626015586751">"बॅटरी आणि डेटा वापराच्‍या तपशीलांसाठी टॅप करा"</string>
     <string name="foreground_service_multiple_separator" msgid="5002287361849863168">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string>
     <string name="safeMode" msgid="8974401416068943888">"सुरक्षित मोड"</string>
@@ -384,7 +384,7 @@
     <string name="permlab_foregroundService" msgid="1768855976818467491">"पृष्‍ठभाग सेवा रन करा"</string>
     <string name="permdesc_foregroundService" msgid="8720071450020922795">"अ‍ॅपला पृष्‍ठभाग सेवा वापरण्याची अनुमती देते."</string>
     <string name="permlab_getPackageSize" msgid="375391550792886641">"अ‍ॅप संचयन स्थान मोजा"</string>
-    <string name="permdesc_getPackageSize" msgid="742743530909966782">"अ‍ॅप ला त्याचा कोड, डेटा आणि कॅश   आकार पुनर्प्राप्त करण्यासाठी अनुमती देते"</string>
+    <string name="permdesc_getPackageSize" msgid="742743530909966782">"अ‍ॅप ला त्याचा कोड, डेटा आणि कॅशे    आकार पुनर्प्राप्त करण्यासाठी अनुमती देते"</string>
     <string name="permlab_writeSettings" msgid="8057285063719277394">"सिस्टम सेटिंग्ज सुधारित करा"</string>
     <string name="permdesc_writeSettings" msgid="8293047411196067188">"सिस्टीमचा सेटिंग्ज डेटा सुधारित करण्यासाठी अ‍ॅप ला अनुमती देते. दुर्भावनापूर्ण अ‍ॅप्स आपल्या सिस्टीमचे कॉन्फिगरेशन दूषित करू शकतात."</string>
     <string name="permlab_receiveBootCompleted" msgid="6643339400247325379">"सुरूवातीस चालवा"</string>
@@ -1397,9 +1397,9 @@
     <string name="ime_action_go" msgid="5536744546326495436">"जा"</string>
     <string name="ime_action_search" msgid="4501435960587287668">"शोधा"</string>
     <string name="ime_action_send" msgid="8456843745664334138">"पाठवा"</string>
-    <string name="ime_action_next" msgid="4169702997635728543">"पुढील"</string>
+    <string name="ime_action_next" msgid="4169702997635728543">"पुढे"</string>
     <string name="ime_action_done" msgid="6299921014822891569">"पूर्ण झाले"</string>
-    <string name="ime_action_previous" msgid="6548799326860401611">"मागील"</string>
+    <string name="ime_action_previous" msgid="6548799326860401611">"मागे"</string>
     <string name="ime_action_default" msgid="8265027027659800121">"कार्यान्वित करा"</string>
     <string name="dial_number_using" msgid="6060769078933953531">\n"<xliff:g id="NUMBER">%s</xliff:g> वापरून नंबर डायल करा"</string>
     <string name="create_contact_using" msgid="6200708808003692594">\n"<xliff:g id="NUMBER">%s</xliff:g> वापरून संपर्क तयार करा"</string>
@@ -1434,7 +1434,7 @@
     <string name="no_file_chosen" msgid="4146295695162318057">"फाईल निवडली नाही"</string>
     <string name="reset" msgid="3865826612628171429">"रीसेट करा"</string>
     <string name="submit" msgid="862795280643405865">"सबमिट करा"</string>
-    <string name="car_mode_disable_notification_title" msgid="8450693275833142896">"ड्रायव्हिंग अ‍ॅप चालू आहे"</string>
+    <string name="car_mode_disable_notification_title" msgid="8450693275833142896">"ड्रायव्हिंग अ‍ॅप सुरू आहे"</string>
     <string name="car_mode_disable_notification_message" msgid="8954550232288567515">"ड्रायव्हिंग ॲपमधून बाहेर पाडण्यासाठी टॅप करा."</string>
     <string name="back_button_label" msgid="4078224038025043387">"मागे"</string>
     <string name="next_button_label" msgid="6040209156399907780">"पुढील"</string>
@@ -1457,6 +1457,12 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"<xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>) द्वारे विनंती केली"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"होय"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"नाही"</string>
+    <!-- no translation found for gnss_nfw_notification_title (5004493772059563423) -->
+    <skip />
+    <!-- no translation found for gnss_nfw_notification_message_oem (3683958907027107969) -->
+    <skip />
+    <!-- no translation found for gnss_nfw_notification_message_carrier (815888995791562151) -->
+    <skip />
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"ओलांडलेली मर्यादा हटवा"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"<xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> खात्यासाठी <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>, <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> हटविलेले आयटम आहेत. तुम्ही काय करू इच्छिता?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"आयटम हटवा"</string>
@@ -1656,7 +1662,7 @@
     <string name="accessibility_button_instructional_text" msgid="8853928358872550500">"वैशिष्टयांदरम्यान स्विच करण्यासाठी अ‍ॅक्सेसिबिलिटी बटणाला स्पर्श करा आणि धरून ठेवा."</string>
     <string name="accessibility_gesture_instructional_text" msgid="9196230728837090497">"वैशिष्टयांदरम्यान स्विच करण्यासाठी दोन बोटांनी वर स्वाइप करा आणि धरून ठेवा."</string>
     <string name="accessibility_gesture_3finger_instructional_text" msgid="3425123684990193765">"वैशिष्टयांदरम्यान स्विच करण्यासाठी तीन बोटांनी वर स्वाइप करा आणि धरून ठेवा."</string>
-    <string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"मोठे करणे"</string>
+    <string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"मॅग्निफिकेशन"</string>
     <string name="user_switched" msgid="7249833311585228097">"वर्तमान वापरकर्ता <xliff:g id="NAME">%1$s</xliff:g>."</string>
     <string name="user_switching_message" msgid="1912993630661332336">"<xliff:g id="NAME">%1$s</xliff:g> वर स्विच करत आहे…"</string>
     <string name="user_logging_out_message" msgid="7216437629179710359">"<xliff:g id="NAME">%1$s</xliff:g> लॉग आउट करत आहे…"</string>
@@ -1790,9 +1796,9 @@
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"आपल्या प्रशासकाने हटवले"</string>
     <string name="confirm_battery_saver" msgid="5247976246208245754">"ओके"</string>
     <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"बॅटरी सेव्‍हर हे बॅटरीचे आयुष्य वाढवते:\n·गडद थीम सुरू करते \n· बॅकग्राउंड अ‍ॅक्टिव्हिटी, काही व्हिज्युअल इफेक्ट आणि \"Ok Google\" यासारखी वैशिष्ट्ये बंद किंवा मर्यादित करते.\n\n"<annotation id="url">"अधिक जाणून घ्या"</annotation></string>
-    <string name="battery_saver_description" msgid="7618492104632328184">"बॅटरी सेव्‍हर हे बॅटरीचे आयुष्य वाढवते:\n·गडद थीम सुरू करते \n· बॅकग्राउंड अ‍ॅक्टिव्हिटी, काही व्हिज्युअल इफेक्ट आणि \"Ok Google\" यासारखी वैशिष्ट्ये बंद किंवा मर्यादित करते."</string>
-    <string name="data_saver_description" msgid="4995164271550590517">"डेटा सर्व्हर डेटाचा वापर कमी करण्यात मदत करण्यासाठी काही अ‍ॅप्सना पार्श्वभूमीमध्ये डेटा पाठवण्यास किंवा  मिळवण्यास प्रतिबंध करतो. तुम्ही सध्या वापरत असलेले अ‍ॅप डेटा अ‍ॅक्सेस करू शकते, पण तसे खूप कमी वेळा होते. याचाच अर्थ असा की, तुम्ही इमेजवर टॅप करेपर्यंत त्या डिस्प्ले होणार नाहीत असा असू शकतो."</string>
-    <string name="data_saver_enable_title" msgid="7080620065745260137">"डेटा सेव्हर चालू करायचा?"</string>
+    <string name="battery_saver_description" msgid="7618492104632328184">"बॅटरीचे आयुष्य वाढवण्यासाठी बॅटरी सेव्‍हर:\n·गडद थीम सुरू करते \n· बॅकग्राउंड अ‍ॅक्टिव्हिटी, काही व्हिज्युअल इफेक्ट आणि \"Ok Google\" यासारखी वैशिष्ट्ये बंद किंवा मर्यादित करते."</string>
+    <string name="data_saver_description" msgid="4995164271550590517">"डेटाचा वापर कमी करण्यात मदत करण्यासाठी काही अ‍ॅप्सना बॅकग्राउंडमध्ये डेटा पाठवण्यास किंवा मिळवण्यास डेटा सर्व्हर प्रतिबंध करतो. तुम्ही सध्या वापरत असलेले अ‍ॅप डेटा अ‍ॅक्सेस करू शकते, पण तसे खूप कमी वेळा होते. याचाच अर्थ असा की, तुम्ही इमेजवर टॅप करेपर्यंत त्या डिस्प्ले होणार नाहीत असे होऊ शकते."</string>
+    <string name="data_saver_enable_title" msgid="7080620065745260137">"डेटा सेव्हर चालू करायचे?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"चालू करा"</string>
     <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
       <item quantity="other">%1$d मिनिटांसाठी (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> पर्यंत)</item>
diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml
index 1a69a73..8a4148a 100644
--- a/core/res/res/values-ms/strings.xml
+++ b/core/res/res/values-ms/strings.xml
@@ -1457,6 +1457,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"Diminta oleh <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"Ya"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"Tidak"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"Lokasi kecemasan diakses"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"Pengilang peranti anda mengakses lokasi anda semasa sesi kecemasan baru-baru ini"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"Pembawa anda mengakses lokasi anda semasa sesi kecemasan baru-baru ini"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"Melebihi had padam"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"Terdapat <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> item yang dipadamkan untuk <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>, akaun <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>. Apakah yang mahu anda lakukan?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"Padamkan item itu"</string>
diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml
index c93ca0f..7c6f3e7 100644
--- a/core/res/res/values-my/strings.xml
+++ b/core/res/res/values-my/strings.xml
@@ -258,7 +258,7 @@
     <string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"အသံတိတ်စနစ်"</string>
     <string name="global_action_silent_mode_on_status" msgid="2371892537738632013">"အသံပိတ်ထားသည်"</string>
     <string name="global_action_silent_mode_off_status" msgid="6608006545950920042">"အသံဖွင့်ထားသည်"</string>
-    <string name="global_actions_toggle_airplane_mode" msgid="6911684460146916206">"လေယာဥ်ပျံပေါ်အသုံးပြုသောစနစ်"</string>
+    <string name="global_actions_toggle_airplane_mode" msgid="6911684460146916206">"လေယာဉ်ပျံမုဒ်"</string>
     <string name="global_actions_airplane_mode_on_status" msgid="5508025516695361936">"လေယဥ်ပျံပေါ်၌အသုံးပြုသောစနစ်ဖွင့်ထားသည်"</string>
     <string name="global_actions_airplane_mode_off_status" msgid="8522219771500505475">"လေယဥ်ပျံပေါ်၌အသုံးပြုသောစနစ်ပိတ်ထားသည်"</string>
     <string name="global_action_settings" msgid="4671878836947494217">"ဆက်တင်များ"</string>
@@ -1447,7 +1447,7 @@
     </plurals>
     <string name="action_mode_done" msgid="2536182504764803222">"ပြီးပါပြီ"</string>
     <string name="progress_erasing" msgid="6891435992721028004">"မျှဝေထားသည့် သိုလှောင်ခန်းကို ဖျက်နေသည်…"</string>
-    <string name="share" msgid="4157615043345227321">"မျှဝေခြင်း"</string>
+    <string name="share" msgid="4157615043345227321">"မျှဝေရန်"</string>
     <string name="find" msgid="5015737188624767706">"ရှာဖွေရန်"</string>
     <string name="websearch" msgid="5624340204512793290">"ဝဘ်တွင် ရှာရန်"</string>
     <string name="find_next" msgid="5341217051549648153">"နောက်တစ်ခု ရှာဖွေရန်"</string>
@@ -1457,6 +1457,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"<xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)မှတောင်းခံသည်"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"Yes"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"No"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"အရေးပေါ် တည်နေရာကို ဝင်ကြည့်ထားသည်"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"မကြာသေးမီက အရေးပေါ်စက်ရှင်တွင် သင်၏စက်ပစ္စည်းထုတ်လုပ်သူသည် သင့်တည်နေရာကို ဝင်ကြည့်ထားသည်"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"မကြာသေးမီက အရေးပေါ်စက်ရှင်တွင် သင်၏ဝန်ဆောင်မှုပေးသူသည် သင့်တည်နေရာကို ဝင်ကြည့်ထားသည်"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"ပယ်ဖျက်မည့်ကန့်သတ်နှုန်းကျော်လွန်သည်"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"<xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>၊  account <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> အတွက် စုစုပေါင်း <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> အရာဖျက်ထားပါသည်။ သင်ဘာလုပ်ချင်ပါလဲ?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"ဤအရာများကိုဖျက်ပါ"</string>
@@ -1558,10 +1561,10 @@
     <string name="wireless_display_route_description" msgid="8297563323032966831">"ကြိုးမဲ့ပြသခြင်း"</string>
     <string name="media_route_button_content_description" msgid="2299223698196869956">"သရုပ်ဆောင်​များ"</string>
     <string name="media_route_chooser_title" msgid="6646594924991269208">"စက်တစ်ခုကို ချိတ်ဆက်ရန်"</string>
-    <string name="media_route_chooser_title_for_remote_display" msgid="3105906508794326446">"ဖန်သားပြင်ကို စက်ဆီ ပို့လွှတ်ပါ"</string>
+    <string name="media_route_chooser_title_for_remote_display" msgid="3105906508794326446">"ဖန်သားပြင်ကို စက်ထံသို့ ပို့ပါ"</string>
     <string name="media_route_chooser_searching" msgid="6119673534251329535">"စက်များကို ရှာဖွေနေပါသည် ..."</string>
     <string name="media_route_chooser_extended_settings" msgid="2506352159381327741">"ဆက်တင်များ"</string>
-    <string name="media_route_controller_disconnect" msgid="7362617572732576959">"ချိတ်ဆက်ခြင်းရပ်ဆိုင်းရန်"</string>
+    <string name="media_route_controller_disconnect" msgid="7362617572732576959">"ချိတ်ဆက်မှုဖြုတ်ရန်"</string>
     <string name="media_route_status_scanning" msgid="8045156315309594482">"စကင်ပြုလုပ်နေစဉ်..."</string>
     <string name="media_route_status_connecting" msgid="5845597961412010540">"ဆက်သွယ်နေစဉ်..."</string>
     <string name="media_route_status_available" msgid="1477537663492007608">"ရနိုင်သော"</string>
@@ -1790,9 +1793,9 @@
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"သင်၏ စီမံခန့်ခွဲသူက ဖျက်လိုက်ပါပြီ"</string>
     <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
     <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"ဘက်ထရီသက်တမ်း ပိုရှည်စေရန် \'ဘက်ထရီအားထိန်း\' က \n·မှောင်သည့် အပြင်အဆင်ကို ဖွင့်သည် \n·နောက်ခံလုပ်ဆောင်ချက် အချို့ အမြင်အာရုံဆိုင်ရာ အထူးပြုလုပ်ချက်များနှင့် “Hey Google” ကဲ့သို့ အခြား ဝန်ဆောင်မှုများကို ပိတ်ခြင်း သို့မဟုတ် ကန့်သတ်ခြင်းတို့ ပြုလုပ်သည်။\n\n"<annotation id="url">"ပိုမိုလေ့လာရန်"</annotation></string>
-    <string name="battery_saver_description" msgid="7618492104632328184">"ဘက်ထရီသက်တမ်း ပိုရှည်စေရန် \'ဘက်ထရီအားထိန်း\' က \n·မှောင်သည့် အပြင်အဆင်ကို ဖွင့်သည် \n·နောက်ခံလုပ်ဆောင်ချက် အချို့ အမြင်အာရုံဆိုင်ရာ အထူးပြုလုပ်ချက်များနှင့် “Hey Google” ကဲ့သို့ အခြား ဝန်ဆောင်မှုများကို ပိတ်ခြင်း သို့မဟုတ် ကန့်သတ်ခြင်းတို့ ပြုလုပ်သည်။"</string>
+    <string name="battery_saver_description" msgid="7618492104632328184">"ဘက်ထရီသက်တမ်း ပိုရှည်စေရန် \'ဘက်ထရီအားထိန်း\' က- \n·မှောင်သည့် အပြင်အဆင်ကို ဖွင့်သည်\n·နောက်ခံလုပ်ဆောင်ချက်၊ ပြသမှုဆိုင်ရာ အထူးပြုလုပ်ချက်အချို့နှင့် “Hey Google” ကဲ့သို့ အခြား ဝန်ဆောင်မှုများကို ပိတ်သည် သို့မဟုတ် ကန့်သတ်သည်။"</string>
     <string name="data_saver_description" msgid="4995164271550590517">"ဒေတာအသုံးလျှော့ချနိုင်ရန်အတွက် အက်ပ်များကို နောက်ခံတွင် ဒေတာပို့ခြင်းနှင့် လက်ခံခြင်းမပြုရန် \'ဒေတာချွေတာမှု\' စနစ်က တားဆီးထားပါသည်။ ယခုအက်ပ်ဖြင့် ဒေတာအသုံးပြုနိုင်သော်လည်း အကြိမ်လျှော့၍သုံးရပါမည်။ ဥပမာ၊ သင်က မတို့မချင်း ပုံများပေါ်လာမည် မဟုတ်ပါ။"</string>
-    <string name="data_saver_enable_title" msgid="7080620065745260137">"ဒေတာအသုံးပြုမှု ချွေတာမှုစနစ်ကို ဖွင့်မလား။"</string>
+    <string name="data_saver_enable_title" msgid="7080620065745260137">"ဒေတာချွေတာမှုစနစ် ဖွင့်မလား။"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"ဖွင့်ပါ"</string>
     <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
       <item quantity="other">%1$d မိနစ်တွင် (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>အထိ)</item>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index 7858064..9f75ce2 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -1457,6 +1457,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"Forespurt av <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"Ja"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"Nei"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"Posisjonen ble sjekket i nødssituasjon"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"Enhetsprodusenten din sjekket posisjonen din under en nylig nødssituasjonsøkt"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"Operatøren din sjekket posisjonen din under en nylig nødssituasjonsøkt"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"Slettegrense overskredet"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"Det fins <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> slettede elementer for <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g> for kontoen <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>. Hva ønsker du å gjøre?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"Slett elementene"</string>
@@ -1558,7 +1561,7 @@
     <string name="wireless_display_route_description" msgid="8297563323032966831">"Trådløs skjerm"</string>
     <string name="media_route_button_content_description" msgid="2299223698196869956">"Cast"</string>
     <string name="media_route_chooser_title" msgid="6646594924991269208">"Koble til enheten"</string>
-    <string name="media_route_chooser_title_for_remote_display" msgid="3105906508794326446">"Cast skjermen til enheten"</string>
+    <string name="media_route_chooser_title_for_remote_display" msgid="3105906508794326446">"Cast skjermen til enhet"</string>
     <string name="media_route_chooser_searching" msgid="6119673534251329535">"Søker etter enheter …"</string>
     <string name="media_route_chooser_extended_settings" msgid="2506352159381327741">"Innstillinger"</string>
     <string name="media_route_controller_disconnect" msgid="7362617572732576959">"Koble fra"</string>
diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml
index 2ad119f..c42b4d5 100644
--- a/core/res/res/values-ne/strings.xml
+++ b/core/res/res/values-ne/strings.xml
@@ -428,7 +428,7 @@
     <string name="permlab_accessBackgroundLocation" msgid="1721164702777366138">"पृष्ठभूमिमा स्थानसम्बन्धी पहुँच"</string>
     <string name="permdesc_accessBackgroundLocation" msgid="8264885066095638105">"यो अनुप्रयोगले जुनसुकै बेला (अनुप्रयोग नचलाएका बेलामा पनि) स्थानमाथि पहुँच राख्न सक्छ।"</string>
     <string name="permlab_modifyAudioSettings" msgid="6129039778010031815">"तपाईँका अडियो सेटिङहरू परिवर्तन गर्नुहोस्"</string>
-    <string name="permdesc_modifyAudioSettings" msgid="8687227609663124921">"अनुप्रयोगलाई ग्लोबल अडियो सेटिङहरू परिमार्जन गर्न अनुमति दिन्छ, जस्तै आवाजको मात्रा र आउटपुटको लागि कुन स्पिकर प्रयोग गर्ने।"</string>
+    <string name="permdesc_modifyAudioSettings" msgid="8687227609663124921">"अनुप्रयोगलाई ग्लोबल अडियो सेटिङहरू परिमार्जन गर्न अनुमति दिन्छ, जस्तै भोल्युम र आउटपुटको लागि कुन स्पिकर प्रयोग गर्ने।"</string>
     <string name="permlab_recordAudio" msgid="1208457423054219147">"अडियो रेकर्ड गर्नुहोस्"</string>
     <string name="permdesc_recordAudio" msgid="3976213377904701093">"यस अनुप्रयोगले जुनसुकै समय माइक्रोफोनको प्रयोग गरी अडियो रेकर्ड गर्न सक्छ।"</string>
     <string name="permlab_sim_communication" msgid="176788115994050692">"SIM मा आदेशहरू पठाउन दिनुहोस्"</string>
@@ -683,9 +683,9 @@
     <string name="policylab_forceLock" msgid="7360335502968476434">"स्क्रिन लक गर्ने"</string>
     <string name="policydesc_forceLock" msgid="1008844760853899693">"कसरी र कहिले स्क्रिन लक गर्ने नियन्त्रण गर्नुहोस्।"</string>
     <string name="policylab_wipeData" msgid="1359485247727537311">"सबै डेटा मेट्नुहोस्"</string>
-    <string name="policydesc_wipeData" product="tablet" msgid="7245372676261947507">"एउटा फ्याक्ट्रि डेटा पुनःसेट गरेर चेतावनी नआउँदै ट्याबल्टको डेटा मेट्नुहोस्।"</string>
+    <string name="policydesc_wipeData" product="tablet" msgid="7245372676261947507">"एउटा फ्याक्ट्रि डेटा रिसेट गरेर चेतावनी नआउँदै ट्याबल्टको डेटा मेट्नुहोस्।"</string>
     <string name="policydesc_wipeData" product="tv" msgid="513862488950801261">"फ्याक्ट्री डेटा रिसेट गरेर चेतावनी नदिइकन आफ्नो Android TV यन्त्रको डेटा मेटाउनुहोस्।"</string>
-    <string name="policydesc_wipeData" product="default" msgid="8036084184768379022">"एउटा फ्याक्ट्रि डेटा पुनःसेट गरेर चेतावनी नदिइकन फोनको डेटा मेट्न।"</string>
+    <string name="policydesc_wipeData" product="default" msgid="8036084184768379022">"एउटा फ्याक्ट्रि डेटा रिसेट गरेर चेतावनी नदिइकन फोनको डेटा मेट्न।"</string>
     <string name="policylab_wipeData_secondaryUser" msgid="413813645323433166">"प्रयोगकर्ता डेटा मेट्नुहोस्"</string>
     <string name="policydesc_wipeData_secondaryUser" product="tablet" msgid="2336676480090926470">"चेतावनी बिना यो ट्याब्लेटमा यस प्रयोगकर्ताको डेटा मेट्नुहोस्।"</string>
     <string name="policydesc_wipeData_secondaryUser" product="tv" msgid="2293713284515865200">"यो Android TV यन्त्रमा भएको यस प्रयोगकर्ताको डेटा चेतावनी नदिइकन मेटाउनुहोस्।"</string>
@@ -863,12 +863,12 @@
     <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="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>
+    <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>
     <string name="lockscreen_failed_attempts_now_wiping" product="tv" msgid="2205435033340091883">"तपाईंले आफ्नो Android TV यन्त्र <xliff:g id="NUMBER">%d</xliff:g> पटक गलत तरिकाले अनलक गर्ने प्रयास गर्नुभएको छ। अब तपाईंको Android TV यन्त्रलाई रिसेट गरेर पूर्वनिर्धारित फ्याक्ट्री सेटिङ लागू गरिनेछ।"</string>
-    <string name="lockscreen_failed_attempts_now_wiping" product="default" msgid="2203704707679895487">"तपाईंले गलत तरिकाले फोन <xliff:g id="NUMBER">%d</xliff:g> पटक अनलक गर्ने प्रयत्न गर्नुभयो। अब फोन फ्याक्ट्रि पूर्वनिर्धारितमा पुनःसेट हुने छ।"</string>
+    <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>
@@ -1127,7 +1127,7 @@
     <!-- no translation found for whichApplicationNamed (6969946041713975681) -->
     <skip />
     <string name="whichApplicationLabel" msgid="7852182961472531728">"पूर्ण कारबाही"</string>
-    <string name="whichViewApplication" msgid="5733194231473132945">"निम्नमार्फत खोल्नुहोस्"</string>
+    <string name="whichViewApplication" msgid="5733194231473132945">"निम्नबाट खोल्नुहोस्"</string>
     <!-- String.format failed for translation -->
     <!-- no translation found for whichViewApplicationNamed (415164730629690105) -->
     <skip />
@@ -1222,18 +1222,18 @@
     <string name="dump_heap_ready_text" msgid="5849618132123045516">"तपाईंसँग आदान प्रदान गर्नका लागि <xliff:g id="PROC">%1$s</xliff:g> को प्रक्रियासम्बन्धी हिप डम्प उपलब्ध छ। सावधान हुनुहोस्: यस हिप डम्पमा उक्त प्रक्रियाको पहुँच भएको जुनसुकै संवेदनशील व्यक्तिगत जानकारी समावेश हुन सक्छ जसमा तपाईंले टाइप गर्नुभएका कुराहरू पर्न सक्छन्।"</string>
     <string name="sendText" msgid="493003724401350724">"पाठको लागि एउटा प्रकार्य छान्नुहोस्"</string>
     <string name="volume_ringtone" msgid="134784084629229029">"बजाउने मात्रा"</string>
-    <string name="volume_music" msgid="7727274216734955095">"मिडियाको आवाजको मात्रा"</string>
+    <string name="volume_music" msgid="7727274216734955095">"मिडियाको भोल्युम"</string>
     <string name="volume_music_hint_playing_through_bluetooth" msgid="2614142915948898228">"ब्लुटुथको माध्यमद्वारा बजाइदै छ।"</string>
     <string name="volume_music_hint_silent_ringtone_selected" msgid="1514829655029062233">"शान्त रिङ्गटोन सेट"</string>
     <string name="volume_call" msgid="7625321655265747433">"इन-कल भोल्युम"</string>
     <string name="volume_bluetooth_call" msgid="2930204618610115061">"ब्लुटुथ भित्री-कल मात्रा"</string>
-    <string name="volume_alarm" msgid="4486241060751798448">"आलर्मको आवाजको मात्रा"</string>
+    <string name="volume_alarm" msgid="4486241060751798448">"आलर्मको भोल्युम"</string>
     <string name="volume_notification" msgid="6864412249031660057">"सूचना मात्रा"</string>
     <string name="volume_unknown" msgid="4041914008166576293">"मात्रा"</string>
     <string name="volume_icon_description_bluetooth" msgid="7540388479345558400">"ब्लुटुथ भोल्युम"</string>
     <string name="volume_icon_description_ringer" msgid="2187800636867423459">"घन्टिको आवाज मात्रा"</string>
     <string name="volume_icon_description_incall" msgid="4491255105381227919">"कला मात्रा"</string>
-    <string name="volume_icon_description_media" msgid="4997633254078171233">"मिडियाको आवाजको मात्रा"</string>
+    <string name="volume_icon_description_media" msgid="4997633254078171233">"मिडियाको भोल्युम"</string>
     <string name="volume_icon_description_notification" msgid="579091344110747279">"सूचना भोल्युम"</string>
     <string name="ringtone_default" msgid="9118299121288174597">"पूर्वनिर्धारित रिङटोन"</string>
     <string name="ringtone_default_with_actual" msgid="2709686194556159773">"पूर्वनिर्धारित (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
@@ -1463,6 +1463,12 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"<xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>) द्वारा अनुरोध गरिएको"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"हो"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"होइन"</string>
+    <!-- no translation found for gnss_nfw_notification_title (5004493772059563423) -->
+    <skip />
+    <!-- no translation found for gnss_nfw_notification_message_oem (3683958907027107969) -->
+    <skip />
+    <!-- no translation found for gnss_nfw_notification_message_carrier (815888995791562151) -->
+    <skip />
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"सीमा नाघेकाहरू मेट्नुहोस्"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"त्यहाँ <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> मेटाइएका आइटमहरू छन् <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>को लागि, खाता <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>। तपाईं के गर्न चाहनु हुन्छ?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"वस्तुहरू मेट्नुहोस्"</string>
@@ -1564,7 +1570,7 @@
     <string name="wireless_display_route_description" msgid="8297563323032966831">"ताररहित प्रदर्शन"</string>
     <string name="media_route_button_content_description" msgid="2299223698196869956">"कास्ट"</string>
     <string name="media_route_chooser_title" msgid="6646594924991269208">"उपकरणमा जडान गर्नुहोस्"</string>
-    <string name="media_route_chooser_title_for_remote_display" msgid="3105906508794326446">"उपकरणलाई स्क्रिनमा कास्ट गर्नुहोस्"</string>
+    <string name="media_route_chooser_title_for_remote_display" msgid="3105906508794326446">"स्क्रिन उपकरणमा कास्ट गर्नुहोस्"</string>
     <string name="media_route_chooser_searching" msgid="6119673534251329535">"उपकरणको खोजी गरिँदै..."</string>
     <string name="media_route_chooser_extended_settings" msgid="2506352159381327741">"सेटिंङहरू"</string>
     <string name="media_route_controller_disconnect" msgid="7362617572732576959">"विच्छेदन गर्नुहोस्"</string>
@@ -1610,12 +1616,12 @@
     <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="23741434207544038">"तपाईँले गलत तरिकाले तपाईँको PIN <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="3328686432962224215">"तपाईँले तपाईँक पासवर्ड <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="7357404233979139075">"तपाईँले तपाईँको अनलक ढाँचा गलत तरिकाले <xliff:g id="NUMBER_0">%1$d</xliff:g> पटक खिच्नु भएको छ। \n\n <xliff:g id="NUMBER_1">%2$d</xliff:g> सेकेन्डमा फेरि कोसिस गर्नुहोस्।"</string>
-    <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="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_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="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_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>
@@ -1652,7 +1658,7 @@
     <string name="disable_accessibility_shortcut" msgid="5806091378745232383">"सर्टकटलाई निष्क्रिय पार्नुहोस्"</string>
     <string name="leave_accessibility_shortcut_on" msgid="6543362062336990814">"सर्टकट प्रयोग गर्नुहोस्"</string>
     <string name="color_inversion_feature_name" msgid="326050048927789012">"रङ्ग उल्टाउने सुविधा"</string>
-    <string name="color_correction_feature_name" msgid="3655077237805422597">"रङ सच्याउने सुविधा"</string>
+    <string name="color_correction_feature_name" msgid="3655077237805422597">"रङ्ग सच्याउने सुविधा"</string>
     <string name="accessibility_shortcut_enabling_service" msgid="5473495203759847687">"तपाईंले भोल्युम बटनहरू थिचिराख्नुभयो। <xliff:g id="SERVICE_NAME">%1$s</xliff:g> सक्रिय पारियो।"</string>
     <string name="accessibility_shortcut_disabling_service" msgid="8675244165062700619">"तपाईंले भोल्युम बटनहरू थिचिराख्नुभयो। <xliff:g id="SERVICE_NAME">%1$s</xliff:g> निष्क्रिय पारियो।"</string>
     <string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> प्रयोग गर्न दुवै भोल्युम कुञ्जीहरूलाई तीन सेकेन्डसम्म थिचिराख्नुहोस्"</string>
@@ -1795,10 +1801,10 @@
     <string name="package_updated_device_owner" msgid="7560272363805506941">"तपाईंका प्रशासकले अद्यावधिक गर्नुभएको"</string>
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"तपाईंका प्रशासकले मेट्नुभएको"</string>
     <string name="confirm_battery_saver" msgid="5247976246208245754">"ठिक छ"</string>
-    <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"ब्याट्रीको आयु लामो बनाउन ब्याट्री सेभरले:\n·अँध्यारो विषयवस्तु सक्रिय गर्छ\n·पृष्ठभूमिका गतिविधि, कतिपय भिजुअल प्रभाव तथा “Hey Google” जस्ता अन्य सुविधाहरू निष्क्रिय वा सीमित पार्छ।\n\n"<annotation id="url">"थप जान्नुहोस्"</annotation></string>
-    <string name="battery_saver_description" msgid="7618492104632328184">"ब्याट्रीको आयु लामो बनाउन ब्याट्री सेभरले:\n·अँध्यारो विषयवस्तु सक्रिय गर्छ\n·पृष्ठभूमिका गतिविधि, कतिपय भिजुअल प्रभाव तथा “Hey Google” जस्ता अन्य सुविधाहरू निष्क्रिय वा सीमित पार्छ।"</string>
-    <string name="data_saver_description" msgid="4995164271550590517">"डेटाको प्रयोगलाई कम गर्नमा मद्दतका लागि डेटा सर्भरले केही अनुप्रयोगहरूलाई पृष्ठभूमिमा डेटा पठाउन वा प्राप्त गर्नबाट रोक्दछ। तपाईँले हाल प्रयोग गरिरहनुभएको अनु्प्रयोगले डेटामाथि पहुँच राख्न सक्छ, तर त्यसले यो काम थोरै पटक गर्न सक्छ। उदाहरणका लागि यसको मतलब यो हुन सक्छ: तपाईँले छविहरूलाई ट्याप नगरेसम्म ती प्रदर्शन हुँदैनन्।"</string>
-    <string name="data_saver_enable_title" msgid="7080620065745260137">"डेटा सेभरलाई सक्रिय गर्ने हो?"</string>
+    <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"ब्याट्रीको आयु लामो बनाउन ब्याट्री सेभरले:\n·अँध्यारो थिम सक्रिय गर्छ\n·पृष्ठभूमिका गतिविधि, कतिपय भिजुअल प्रभाव तथा “Hey Google” जस्ता अन्य सुविधाहरू निष्क्रिय वा सीमित पार्छ।\n\n"<annotation id="url">"थप जान्नुहोस्"</annotation></string>
+    <string name="battery_saver_description" msgid="7618492104632328184">"ब्याट्रीको आयु बढाउन ब्याट्री सेभरले:\n·अँध्यारो थिम सक्रिय गर्छ\n·पृष्ठभूमिका गतिविधि, कतिपय भिजुअल प्रभाव तथा “Hey Google” जस्ता अन्य सुविधाहरू निष्क्रिय वा सीमित पार्छ।"</string>
+    <string name="data_saver_description" msgid="4995164271550590517">"डेटाको प्रयोगलाई कम गर्न डेटा सर्भरले केही अनुप्रयोगलाई पृष्ठभूमिमा डेटा पठाउन वा प्राप्त गर्न दिँदैन। तपाईंले हाल प्रयोग गरिरहनुभएको अनु्प्रयोगले डेटा चलाउन सक्छ, तर पहिला भन्दा कम अन्तरालमा मात्र। उदाहरणका लागि, तपाईले छविहरूमा ट्याप नगरेसम्म ती छविहरू देखिँदैनन्।"</string>
+    <string name="data_saver_enable_title" msgid="7080620065745260137">"डेटा सेभर सक्रिय गर्ने हो?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"सक्रिय गर्नुहोस्"</string>
     <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
       <item quantity="other"> %1$d मिनेटको लागि (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> सम्म)</item>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index 9017203..17989bf 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -1457,6 +1457,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"Aangevraagd door <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"Ja"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"Nee"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"Locatie bekeken tijdens noodsituatie"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"De fabrikant van je apparaat heeft toegang gehad tot je locatie tijdens een recente noodsessie"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"Je provider heeft toegang gehad tot je locatie tijdens een recente noodsessie"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"Verwijderingslimiet overschreden"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"Er zijn <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> verwijderde items voor <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g> , account <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> . Wat wil je doen?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"De items verwijderen."</string>
@@ -1790,9 +1793,9 @@
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"Verwijderd door je beheerder"</string>
     <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
     <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"Batterijbesparing doet het volgende om de batterijduur te verlengen:\n·Het donkere thema inschakelen\n·Achtergrondactiviteit, bepaalde visuele effecten en andere functies (zoals \'Hey Google\') uitschakelen of beperken\n\n"<annotation id="url">"Meer informatie"</annotation></string>
-    <string name="battery_saver_description" msgid="7618492104632328184">"Batterijbesparing doet het volgende om de batterijduur te verlengen:\n Het donkere thema inschakelen\n·Achtergrondactiviteit, bepaalde visuele effecten en andere functies (zoals \'Hey Google\') uitschakelen of beperken"</string>
+    <string name="battery_saver_description" msgid="7618492104632328184">"Batterijbesparing doet het volgende om de batterijduur te verlengen:\n Het donkere thema aanzetten\n·Achtergrondactiviteit, bepaalde visuele effecten en andere functies (zoals \'Hey Google\') uitzetten of beperken"</string>
     <string name="data_saver_description" msgid="4995164271550590517">"Databesparing beperkt het datagebruik door te voorkomen dat sommige apps gegevens verzenden of ontvangen op de achtergrond. De apps die je open hebt, kunnen nog steeds data verbruiken, maar doen dit minder vaak. Afbeeldingen worden dan bijvoorbeeld niet weergegeven totdat je erop tikt."</string>
-    <string name="data_saver_enable_title" msgid="7080620065745260137">"Databesparing inschakelen?"</string>
+    <string name="data_saver_enable_title" msgid="7080620065745260137">"Databesparing aanzetten?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Inschakelen"</string>
     <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
       <item quantity="other">%1$d minuten (tot <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml
index e28ed6f..57e167b 100644
--- a/core/res/res/values-or/strings.xml
+++ b/core/res/res/values-or/strings.xml
@@ -230,7 +230,7 @@
     <string name="shutdown_confirm_question" msgid="796151167261608447">"ଆପଣ ବନ୍ଦ କରିବାକୁ ଚାହାନ୍ତି?"</string>
     <string name="reboot_safemode_title" msgid="5853949122655346734">"ନିରାପଦ ମୋଡ୍‍ରେ ରିବୁଟ୍‍ କରନ୍ତୁ"</string>
     <string name="reboot_safemode_confirm" msgid="1658357874737219624">"ଆପଣ ନିରାପଦ ମୋଡ୍‍ରେ ରିବୁଟ୍‍ କରିବେ କି? ଆପଣ ଇନଷ୍ଟଲ୍‍ କରିଥିବା ସମସ୍ତ ତୃତୀୟ ପକ୍ଷ ଆପ୍ଲିକେଶନ୍‌, ଏହାଦ୍ୱାରା ଅକ୍ଷମ ହୋଇଯିବ। ଆପଣ ପୁଣି ରିବୁଟ୍‍ କରିବା ପରେ ସେଗୁଡ଼ିକ ରିଷ୍ଟୋର୍‍ ହେବ।"</string>
-    <string name="recent_tasks_title" msgid="8183172372995396653">"କିଛି ସମୟ ପୂର୍ବରୁ"</string>
+    <string name="recent_tasks_title" msgid="8183172372995396653">"ବର୍ତ୍ତମାନର"</string>
     <string name="no_recent_tasks" msgid="9063946524312275906">"କୌଣସି ସମ୍ପ୍ରତି ଆପ୍‌ ନାହିଁ।"</string>
     <string name="global_actions" product="tablet" msgid="4412132498517933867">"ଟାବଲେଟ ବିକଳ୍ପ"</string>
     <string name="global_actions" product="tv" msgid="3871763739487450369">"Android ଟିଭିର ବିକଳ୍ପଗୁଡ଼ିକ"</string>
@@ -678,14 +678,14 @@
     <string name="policydesc_watchLogin_secondaryUser" product="tablet" msgid="2049038943004297474">"ସ୍କ୍ରୀନ୍‍ ଅନଲକ୍‍ କରିବାବେଳେ ଟାଇପ୍‍ କରାଯାଇଥିବା ଭୁଲ ପାସ୍‌ୱର୍ଡର ସଂଖ୍ୟାକୁ ନୀରିକ୍ଷଣ କରେ ଏବଂ ଟାବଲେଟ୍‍କୁ ଲକ୍‍ କରିଦିଏ କିମ୍ବା ଯଦି ଅନେକ ଭୁଲ ପାସ୍‌ୱର୍ଡ ଟାଇପ୍‍ କରାଯାଇଥାଏ, ତେବେ ସମସ୍ତ ଡାଟା ଲିଭାଇଦିଏ।"</string>
     <string name="policydesc_watchLogin_secondaryUser" product="tv" msgid="8965224107449407052">"ସ୍କ୍ରିନ୍ ଅନ୍‌ଲକ୍ କରିବା ସମୟରେ ଟାଇପ୍ କରାଯାଇଥିବା ଭୁଲ ପାସ୍‌ୱାର୍ଡଗୁଡ଼ିକର ସଂଖ୍ୟାକୁ ନିରୀକ୍ଷଣ କରେ ଏବଂ ଆପଣଙ୍କର Android ଟିଭି ଡିଭାଇସ୍‌କୁ ଲକ୍ କରିଦିଏ କିମ୍ବା ଯଦି ଅନେକ ଭୁଲ ପାସ୍‌ୱାର୍ଡ ଟାଇପ୍ କରାଯାଇଥାଏ, ତେବେ ସମସ୍ତ ଡାଟା ଲିଭାଇ ଦିଏ।"</string>
     <string name="policydesc_watchLogin_secondaryUser" product="default" msgid="9177645136475155924">"ସ୍କ୍ରୀନ୍‍ ଅନଲକ୍‍ କରିବାବେଳେ ଟାଇପ୍‍ କରାଯାଇଥିବା ଭୁଲ ପାସ୍‌ୱର୍ଡର ସଂଖ୍ୟାକୁ ନୀରିକ୍ଷଣ କରେ ଏବଂ ଫୋନ୍‍କୁ ଲକ୍‍ କରିଦିଏ କିମ୍ବା ଯଦି ଅନେକ ଭୁଲ ପାସ୍‌ୱର୍ଡ ଟାଇପ୍‍ କରାଯାଇଥାଏ, ତେବେ ସମସ୍ତ ଡାଟା ଲିଭାଇଦିଏ।"</string>
-    <string name="policylab_resetPassword" msgid="214556238645096520">"ସ୍କ୍ରୀନ୍‍ ଲକ୍‍ ବଦଳାଇବା"</string>
-    <string name="policydesc_resetPassword" msgid="4626419138439341851">"ସ୍କ୍ରୀନ୍‍ ଲକ୍‍ ବଦଳାଏ।"</string>
-    <string name="policylab_forceLock" msgid="7360335502968476434">"ସ୍କ୍ରୀନ୍‌କୁ ଲକ୍‌ କରିବା"</string>
-    <string name="policydesc_forceLock" msgid="1008844760853899693">"ସ୍କ୍ରୀନ୍‍ କିପରି ଓ କେତେବେଳେ ଲକ୍‍ କରାଯିବ, ତାହା ନିୟନ୍ତ୍ରଣ କରେ।"</string>
+    <string name="policylab_resetPassword" msgid="214556238645096520">"ସ୍କ୍ରିନ୍ ଲକ୍ ବଦଳାଏ"</string>
+    <string name="policydesc_resetPassword" msgid="4626419138439341851">"ସ୍କ୍ରିନ୍ ଲକ୍‍ ବଦଳାଏ।"</string>
+    <string name="policylab_forceLock" msgid="7360335502968476434">"ସ୍କ୍ରିନ୍ ଲକ୍‌ କରିବା"</string>
+    <string name="policydesc_forceLock" msgid="1008844760853899693">"ସ୍କ୍ରିନ୍ କିପରି ଓ କେତେବେଳେ ଲକ୍‍ କରାଯିବ, ତାହା ନିୟନ୍ତ୍ରଣ କରେ।"</string>
     <string name="policylab_wipeData" msgid="1359485247727537311">"ସମସ୍ତ ଡାଟା ଖାଲି କରିବା"</string>
     <string name="policydesc_wipeData" product="tablet" msgid="7245372676261947507">"ବିନା ଚେତାବନୀରେ ଫ୍ୟାକ୍ଟୋରୀ ସେଟିଙ୍ଗ କରାଇ ଟାବ୍‍ଲେଟ୍‍ର ଡାଟା ଲିଭାଇଥାଏ।"</string>
     <string name="policydesc_wipeData" product="tv" msgid="513862488950801261">"ଏକ ଫ୍ୟାକ୍ଟୋରୀ ଡାଟା ରିସେଟ୍ କରି ବିନା ଆଲର୍ଟରେ ଆପଣଙ୍କର Android ଟିଭି ଡିଭାଇସ୍‌ର ଡାଟା ଲିଭାନ୍ତୁ।"</string>
-    <string name="policydesc_wipeData" product="default" msgid="8036084184768379022">"ବିନା ଚେତାବନୀରେ ଫ୍ୟାକ୍ଟୋରୀ ସେଟିଙ୍ଗ କରାଇ ଫୋନ୍‍ର ଡାଟା ଲିଭାଇଥାଏ।"</string>
+    <string name="policydesc_wipeData" product="default" msgid="8036084184768379022">"ବିନା ଚେତାବନୀରେ ଫ୍ୟାକ୍ଟୋରୀ ଡାଟା ରିସେଟ୍ କରି ଫୋନ୍‍ର ଡାଟା ଲିଭାଇଥାଏ।"</string>
     <string name="policylab_wipeData_secondaryUser" msgid="413813645323433166">"ୟୁଜର୍‍ ଡାଟା ଲିଭାନ୍ତୁ"</string>
     <string name="policydesc_wipeData_secondaryUser" product="tablet" msgid="2336676480090926470">"ବିନା ଚେତାବନୀରେ ଏହି ଟାବଲେଟରେ ଥିବା ଏହି ୟୁଜରଙ୍କ ଡାଟା ଲିଭାଇ ଦିଅନ୍ତୁ।"</string>
     <string name="policydesc_wipeData_secondaryUser" product="tv" msgid="2293713284515865200">"ବିନା ଚେତାବନୀରେ ଏହି Android ଟିଭି ଡିଭାଇସ୍‌ରେ ଏହି ଉପଯୋଗକର୍ତ୍ତାଙ୍କ ଡାଟା ଲିଭାଇ ଦିଅନ୍ତୁ।"</string>
@@ -698,8 +698,8 @@
     <string name="policydesc_encryptedStorage" msgid="1102516950740375617">"ଷ୍ଟୋର୍ କରାଯାଇଥିବା ଡାଟା ଏନ୍‍କ୍ରେପ୍ଟ କରିବା ଆବଶ୍ୟକ।"</string>
     <string name="policylab_disableCamera" msgid="5749486347810162018">"କ୍ୟାମେରାଗୁଡ଼ିକୁ ଅକ୍ଷମ କରନ୍ତୁ"</string>
     <string name="policydesc_disableCamera" msgid="3204405908799676104">"ସମସ୍ତ ଡିଭାଇସ୍‍ର କ୍ୟାମେରା ବ୍ୟବହାର କରିବା ପ୍ରତିରୋଧ କରନ୍ତୁ।"</string>
-    <string name="policylab_disableKeyguardFeatures" msgid="5071855750149949741">"କିଛି ସ୍କ୍ରୀନ୍‍ ଲକ୍‍ ସୁବିଧାକୁ ଅକ୍ଷମ କରିବା"</string>
-    <string name="policydesc_disableKeyguardFeatures" msgid="6641673177041195957">"କିଛି ସ୍କ୍ରୀନ୍‍ ଲକ୍‍ ସୁବିଧା ବ୍ୟବହାର କରିବାରେ ପ୍ରତିରୋଧ କରେ।"</string>
+    <string name="policylab_disableKeyguardFeatures" msgid="5071855750149949741">"କିଛି ସ୍କ୍ରିନ ଲକ୍‍ ଫିଚରକୁ ଅକ୍ଷମ କରିବା"</string>
+    <string name="policydesc_disableKeyguardFeatures" msgid="6641673177041195957">"କିଛି ସ୍କ୍ରିନ ଲକ୍‍ ଫିଚର ବ୍ୟବହାର କରିବାକୁ ପ୍ରତିରୋଧ କରେ।"</string>
   <string-array name="phoneTypes">
     <item msgid="8996339953292723951">"ହୋମ୍"</item>
     <item msgid="7740243458912727194">"ମୋବାଇଲ୍‍"</item>
@@ -717,7 +717,7 @@
     <item msgid="3233938986670468328">"କଷ୍ଟମ୍‌"</item>
   </string-array>
   <string-array name="postalAddressTypes">
-    <item msgid="3861463339764243038">"ହୋମ୍"</item>
+    <item msgid="3861463339764243038">"ମୂଳପୃଷ୍ଠା"</item>
     <item msgid="5472578890164979109">"ୱାର୍କ"</item>
     <item msgid="5718921296646594739">"ଅନ୍ୟାନ୍ୟ"</item>
     <item msgid="5523122236731783179">"କଷ୍ଟମ୍‌"</item>
@@ -744,7 +744,7 @@
     <item msgid="8293711853624033835">"Jabber"</item>
   </string-array>
     <string name="phoneTypeCustom" msgid="5120365721260686814">"କଷ୍ଟମ୍‌"</string>
-    <string name="phoneTypeHome" msgid="3880132427643623588">"ହୋମ୍"</string>
+    <string name="phoneTypeHome" msgid="3880132427643623588">"ମୂଳପୃଷ୍ଠା"</string>
     <string name="phoneTypeMobile" msgid="1178852541462086735">"ମୋବାଇଲ୍‍"</string>
     <string name="phoneTypeWork" msgid="6604967163358864607">"ୱାର୍କ"</string>
     <string name="phoneTypeFaxWork" msgid="6757519896109439123">"ୱାର୍କ ଫାକ୍ସ"</string>
@@ -875,7 +875,7 @@
     <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>
-    <string name="lockscreen_glogin_password_hint" msgid="3031027901286812848">"ପାସ୍‌ୱର୍ଡ:"</string>
+    <string name="lockscreen_glogin_password_hint" msgid="3031027901286812848">"ପାସୱାର୍ଡ"</string>
     <string name="lockscreen_glogin_submit_button" msgid="3590556636347843733">"ସାଇନ୍‍-ଇନ୍"</string>
     <string name="lockscreen_glogin_invalid_input" msgid="4369219936865697679">"ୟୁଜର୍‍ନେମ୍‌ କିମ୍ୱା ପାସ୍‌ୱର୍ଡ ଭୁଲ୍‍ ଅଛି।"</string>
     <string name="lockscreen_glogin_account_recovery_hint" msgid="1683405808525090649">"ଆପଣଙ୍କର ଯୁଜରନେମ୍‌ କିମ୍ୱା ପାସୱାର୍ଡ ଭୁଲି ଯାଇଛନ୍ତି କି?\n"<b>"google.com/accounts/recovery"</b>" ଭିଜିଟ୍‍ କରନ୍ତୁ।"</string>
@@ -1306,8 +1306,8 @@
     <string name="usb_power_notification_message" msgid="7284765627437897702">"ଯୋଡ଼ାଯାଇଥିବା ଡିଭାଇସ୍ ଚାର୍ଜ ହେଉଛି। ଅଧିକ ବିକଳ୍ପ ପାଇଁ ଟାପ୍ କରନ୍ତୁ।"</string>
     <string name="usb_unsupported_audio_accessory_title" msgid="2335775548086533065">"ଆନାଲଗ୍‍ ଅଡିଓ ଆକ୍ସେସରୀ ଚିହ୍ନଟ ହେଲା"</string>
     <string name="usb_unsupported_audio_accessory_message" msgid="1300168007129796621">"ଏହି ଫୋନ୍‌ରେ କନେକ୍ଟ ଥିବା ଡିଭାଇସ୍‍ କମ୍ପାଟିବଲ୍‍ ନୁହେଁ। ଅଧିକ ଜାଣିବା ପାଇଁ ଟାପ୍‌ କରନ୍ତୁ।"</string>
-    <string name="adb_active_notification_title" msgid="408390247354560331">"USB ଡିବଗିଙ୍ଗ ସଂଯୁକ୍ତ ହୋଇଛି"</string>
-    <string name="adb_active_notification_message" msgid="5617264033476778211">"USBର ଡିବଗିଙ୍ଗ ସୁବିଧାକୁ ବନ୍ଦ କରିବା ପାଇଁ ଟାପ୍ କରନ୍ତୁ"</string>
+    <string name="adb_active_notification_title" msgid="408390247354560331">"USB ଡିବଗିଂ ସଂଯୁକ୍ତ ହୋଇଛି"</string>
+    <string name="adb_active_notification_message" msgid="5617264033476778211">"USB ଡିବଗିଂ ସୁବିଧାକୁ ବନ୍ଦ କରିବା ପାଇଁ ଟାପ୍ କରନ୍ତୁ"</string>
     <string name="adb_active_notification_message" product="tv" msgid="6624498401272780855">"USB ଡିବଗିଙ୍ଗକୁ ଅକ୍ଷମ କରିବା ପାଇଁ ଚୟନ କରନ୍ତୁ।"</string>
     <string name="adbwifi_active_notification_title" msgid="6147343659168302473">"ୱାୟାରଲେସ୍ ଡିବଗିଂ ସଂଯୋଗ କରାଯାଇଛି"</string>
     <string name="adbwifi_active_notification_message" msgid="930987922852867972">"ୱାୟାରଲେସ୍ ଡିବଗିଂକୁ ବନ୍ଦ କରିବା ପାଇଁ ଟାପ୍ କରନ୍ତୁ"</string>
@@ -1327,7 +1327,7 @@
     <string name="share_remote_bugreport_action" msgid="7630880678785123682">"ସେୟାର୍‌ କରନ୍ତୁ"</string>
     <string name="decline_remote_bugreport_action" msgid="4040894777519784346">"ପ୍ରତ୍ୟାଖ୍ୟାନ କରନ୍ତୁ"</string>
     <string name="select_input_method" msgid="3971267998568587025">"ଇନପୁଟ୍ ପଦ୍ଧତି ବାଛନ୍ତୁ"</string>
-    <string name="show_ime" msgid="6406112007347443383">"ଫିଜିକାଲ୍‌ କୀ’ବୋର୍ଡ ସକ୍ରିୟ ଥିବାବେଳେ ଏହାକୁ ସ୍କ୍ରୀନ୍‌ ଉପରେ ରଖନ୍ତୁ"</string>
+    <string name="show_ime" msgid="6406112007347443383">"ଫିଜିକାଲ୍‌ କୀବୋର୍ଡ ସକ୍ରିୟ ଥିବାବେଳେ ଏହାକୁ ସ୍କ୍ରିନ୍‌ ଉପରେ ରଖନ୍ତୁ"</string>
     <string name="hardware" msgid="1800597768237606953">"ଭର୍ଚୁଆଲ୍ କୀ’ବୋର୍ଡ ଦେଖାନ୍ତୁ"</string>
     <string name="select_keyboard_layout_notification_title" msgid="4427643867639774118">"ଫିଜିକଲ୍ କୀ\'ବୋର୍ଡ କନଫିଗର୍‍ କରନ୍ତୁ"</string>
     <string name="select_keyboard_layout_notification_message" msgid="8835158247369158154">"ଭାଷା ଓ ଲେଆଉଟ୍‍ ଚୟନ କରିବା ପାଇଁ ଟାପ୍‍ କରନ୍ତୁ"</string>
@@ -1457,14 +1457,20 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"<xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)ଙ୍କ ଦ୍ୱାରା ଅନୁରୋଧ କରାଯାଇଛି"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"ହଁ"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"ନା"</string>
+    <!-- no translation found for gnss_nfw_notification_title (5004493772059563423) -->
+    <skip />
+    <!-- no translation found for gnss_nfw_notification_message_oem (3683958907027107969) -->
+    <skip />
+    <!-- no translation found for gnss_nfw_notification_message_carrier (815888995791562151) -->
+    <skip />
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"ଡିଲିଟ୍‌ କରିବାର ସୀମା ଅତିକ୍ରମ ହୋଇଯାଇଛି"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"<xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> ଆକାଉଣ୍ଟର <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g> ପାଇଁ <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> ଟି ଡିଲିଟ୍‍ କରାଯାଇଥିବା ଆଇଟମ୍‍ ରହିଛି। ଆପଣ କ’ଣ କରିବାକୁ ଚାହାଁନ୍ତି?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"ଆଇଟମ୍‍ ଡିଲିଟ୍‍ କରନ୍ତୁ"</string>
     <string name="sync_undo_deletes" msgid="5786033331266418896">"ଡିଲିଟ୍‍ଗୁଡ଼ିକୁ ପୂର୍ବାବସ୍ଥାକୁ ଫେରାଇ ଆଣନ୍ତୁ"</string>
     <string name="sync_do_nothing" msgid="4528734662446469646">"ଏବେ କିଛି କରନ୍ତୁ ନାହିଁ"</string>
     <string name="choose_account_label" msgid="5557833752759831548">"ଗୋଟିଏ ଆକାଉଣ୍ଟର ଚୟନ କରନ୍ତୁ"</string>
-    <string name="add_account_label" msgid="4067610644298737417">"ଗୋଟିଏ ଆକାଉଣ୍ଟ ଯୋଡ଼ନ୍ତୁ"</string>
-    <string name="add_account_button_label" msgid="322390749416414097">"ଆକାଉଣ୍ଟ ଯୋଡ଼ନ୍ତୁ"</string>
+    <string name="add_account_label" msgid="4067610644298737417">"ଗୋଟିଏ ଆକାଉଣ୍ଟ ଯୋଗ କରନ୍ତୁ"</string>
+    <string name="add_account_button_label" msgid="322390749416414097">"ଆକାଉଣ୍ଟ ଯୋଗ କରନ୍ତୁ"</string>
     <string name="number_picker_increment_button" msgid="7621013714795186298">"ବଢ଼ାନ୍ତୁ"</string>
     <string name="number_picker_decrement_button" msgid="5116948444762708204">"କମ୍‍ କରନ୍ତୁ"</string>
     <string name="number_picker_increment_scroll_mode" msgid="8403893549806805985">"<xliff:g id="VALUE">%s</xliff:g> ସ୍ପର୍ଶ କରନ୍ତୁ ଏବଂ ଧରିରଖନ୍ତୁ"</string>
@@ -1561,7 +1567,7 @@
     <string name="media_route_chooser_title_for_remote_display" msgid="3105906508794326446">"ଡିଭାଇସରେ ସ୍କ୍ରିନ୍‍ କାଷ୍ଟ କରନ୍ତୁ"</string>
     <string name="media_route_chooser_searching" msgid="6119673534251329535">"ଡିଭାଇସ୍‍ ଖୋଜାଯାଉଛି…"</string>
     <string name="media_route_chooser_extended_settings" msgid="2506352159381327741">"ସେଟିଙ୍ଗ"</string>
-    <string name="media_route_controller_disconnect" msgid="7362617572732576959">"ବିଛିନ୍ନ କରନ୍ତୁ"</string>
+    <string name="media_route_controller_disconnect" msgid="7362617572732576959">"ବିଚ୍ଛିନ୍ନ କରନ୍ତୁ"</string>
     <string name="media_route_status_scanning" msgid="8045156315309594482">"ସ୍କାନ୍‌ କରୁଛି…"</string>
     <string name="media_route_status_connecting" msgid="5845597961412010540">"ସଂଯୋଗ କରୁଛି..."</string>
     <string name="media_route_status_available" msgid="1477537663492007608">"ଉପଲବ୍ଧ"</string>
@@ -1596,7 +1602,7 @@
     <string name="kg_login_too_many_attempts" msgid="699292728290654121">"ଅନେକ ପାଟର୍ନ ପ୍ରୟାସ"</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_password_hint" msgid="3330530727273164402">"ପାସୱାର୍ଡ"</string>
     <string name="kg_login_submit_button" msgid="893611277617096870">"ସାଇନ୍-ଇନ୍"</string>
     <string name="kg_login_invalid_input" msgid="8292367491901220210">"ଅମାନ୍ୟ ୟୁଜରନେମ୍‍ କିମ୍ୱା ପାସ୍‌ୱର୍ଡ।"</string>
     <string name="kg_login_account_recovery_hint" msgid="4892466171043541248">"ଆପଣଙ୍କର ୟୁଜରନେମ୍‍ କିମ୍ୱା ପାସ୍‌ୱର୍ଡ ଭୁଲି ଯାଇଛନ୍ତି କି?\n"<b>"google.com/accounts/recovery"</b>" ଭିଜିଟ୍‍ କରନ୍ତୁ।"</string>
@@ -1789,10 +1795,10 @@
     <string name="package_updated_device_owner" msgid="7560272363805506941">"ଆପଣଙ୍କ ଆଡମିନ୍‌‌ ଅପଡେଟ୍‍ କରିଛନ୍ତି"</string>
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"ଆପଣଙ୍କ ଆଡମିନ୍‌‌ ଡିଲିଟ୍‍ କରିଛନ୍ତି"</string>
     <string name="confirm_battery_saver" msgid="5247976246208245754">"ଠିକ୍ ଅଛି"</string>
-    <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"ବ୍ୟାଟେରୀ ଜୀବନ ବଢ଼ାଇବାକୁ ବ୍ୟାଟେରୀ ସେଭର୍:\n·ଗାଢା ଥିମ୍‌ ଚାଲୁ କରେ\n·ପୃଷ୍ଟପଟ କାର୍ଯ୍ୟକଳାପକୁ, କିଛି ଭିଜୁଆଲ୍ ପ୍ରଭାବଗୁଡ଼ିକୁ ଏବଂ “ହେ Google” ପରି ଅନ୍ୟ ଫିଚର୍‌କୁ ବନ୍ଦ ରଖେ କିମ୍ବା ପ୍ରତିବନ୍ଧିତ କରିଥାଏ\n\n"<annotation id="url">"ଅଧିକ ଜାଣନ୍ତୁ"</annotation></string>
-    <string name="battery_saver_description" msgid="7618492104632328184">"ବ୍ୟାଟେରୀ ଜୀବନ ବଢ଼ାଇବାକୁ ବ୍ୟାଟେରୀ ସେଭର୍:\n·ଗାଢା ଥିମ୍‌ ଚାଲୁ କରେ\n·ପୃଷ୍ଟପଟ କାର୍ଯ୍ୟକଳାପକୁ, କିଛି ଭିଜୁଆଲ୍ ପ୍ରଭାବଗୁଡ଼ିକୁ ଏବଂ “ହେ Google” ପରି ଅନ୍ୟ ଫିଚର୍‌କୁ ବନ୍ଦ ରଖେ କିମ୍ବା ପ୍ରତିବନ୍ଧିତ କରିଥାଏ"</string>
-    <string name="data_saver_description" msgid="4995164271550590517">"ଡାଟା ବ୍ୟବହାର କମ୍‍ କରିବାରେ ସାହାଯ୍ୟ କରିବାକୁ, ଡାଟା ସେଭର୍‍ ବ୍ୟାକ୍‌ଗ୍ରାଉଣ୍ଡରେ ଡାଟା ପଠାଇବା କିମ୍ବା ପ୍ରାପ୍ତ କରିବାକୁ କିଛି ଆପ୍‍କୁ ବାରଣ କରେ। ଆପଣ ବର୍ତ୍ତମାନ ବ୍ୟବହାର କରୁଥିବା ଆପ୍‍, ଡାଟା ଆକ୍ସେସ୍‍ କରିପାରେ, କିନ୍ତୁ ଏହା କମ୍‍ ଥର କରିପାରେ। ଏହାର ଅର୍ଥ ହୋଇପାରେ, ଯେପରି, ଆପଣ ଟାପ୍‍ ନକରିବା ପର୍ଯ୍ୟନ୍ତ ଯେଉଁ ଇମେଜ୍‍ ଦେଖାଯାଏ ନାହିଁ।"</string>
-    <string name="data_saver_enable_title" msgid="7080620065745260137">"ଡାଟା ସେଭର୍‌ ଅନ୍ କରିବେ?"</string>
+    <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"ବ୍ୟାଟେରୀ ଜୀବନ ବଢ଼ାଇବାକୁ ବ୍ୟାଟେରୀ ସେଭର୍:\n·ଗାଢା ଥିମ୍‌ ଚାଲୁ କରେ\n·ପୃଷ୍ଠପଟ କାର୍ଯ୍ୟକଳାପକୁ, କିଛି ଭିଜୁଆଲ୍ ପ୍ରଭାବଗୁଡ଼ିକୁ ଏବଂ “ହେ Google” ପରି ଅନ୍ୟ ଫିଚର୍‌କୁ ବନ୍ଦ ରଖେ କିମ୍ବା ପ୍ରତିବନ୍ଧିତ କରିଥାଏ\n\n"<annotation id="url">"ଅଧିକ ଜାଣନ୍ତୁ"</annotation></string>
+    <string name="battery_saver_description" msgid="7618492104632328184">"ବ୍ୟାଟେରୀ ଜୀବନ ବଢ଼ାଇବାକୁ ବ୍ୟାଟେରୀ ସେଭର୍:\n·ଗାଢା ଥିମ୍‌ ଚାଲୁ କରେ\n·ପୃଷ୍ଠପଟ କାର୍ଯ୍ୟକଳାପକୁ, କିଛି ଭିଜୁଆଲ୍ ପ୍ରଭାବଗୁଡ଼ିକୁ ଏବଂ “ହେ Google” ପରି ଅନ୍ୟ ଫିଚର୍‌କୁ ବନ୍ଦ ରଖେ କିମ୍ବା ପ୍ରତିବନ୍ଧିତ କରିଥାଏ"</string>
+    <string name="data_saver_description" msgid="4995164271550590517">"ଡାଟା ବ୍ୟବହାର କମ୍‍ କରିବାରେ ସାହାଯ୍ୟ କରିବାକୁ, ଡାଟା ସେଭର୍‍ ବ୍ୟାକ୍‌ଗ୍ରାଉଣ୍ଡରେ ଡାଟା ପଠାଇବା କିମ୍ବା ପ୍ରାପ୍ତ କରିବାକୁ କିଛି ଆପ୍‍କୁ ବାରଣ କରେ। ଆପଣ ବର୍ତ୍ତମାନ ବ୍ୟବହାର କରୁଥିବା ଆପ୍‍, ଡାଟା ଆକ୍ସେସ୍‍ କରିପାରେ, କିନ୍ତୁ ଏହା କମ୍‍ ଥର କରିପାରେ। ଏହାର ଅର୍ଥ ହୋଇପାରେ ଯେମିତି ଆପଣ ଟାପ୍‍ ନକରିବା ପର୍ଯ୍ୟନ୍ତ ଇମେଜ୍‍ ଡିସପ୍ଲେ ହୁଏ ନାହିଁ।"</string>
+    <string name="data_saver_enable_title" msgid="7080620065745260137">"ଡାଟା ସେଭର୍‌ ଚାଲୁ କରିବେ?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"ଅନ୍ କରନ୍ତୁ"</string>
     <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
       <item quantity="other">%1$d ମିନିଟ୍‍ ପାଇଁ (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> ପର୍ଯ୍ୟନ୍ତ)</item>
@@ -1872,7 +1878,7 @@
     <string name="notification_history_title_placeholder" msgid="7748630986182249599">"କଷ୍ଟମ୍ ଆପ୍ ବିଜ୍ଞପ୍ତି"</string>
     <string name="user_creation_account_exists" msgid="2239146360099708035">"<xliff:g id="APP">%1$s</xliff:g>ରେ ଏକ ନୂଆ ଉପଯୋଗକର୍ତ୍ତା ତିଆରି କରିବା ପାଇଁ <xliff:g id="ACCOUNT">%2$s</xliff:g>କୁ (ପୂର୍ବରୁ ଏହି ଆକାଉଣ୍ଟ ଉପଯୋଗକର୍ତ୍ତାଙ୍କ ନାମରେ ଅଛି) ଅନୁମତି ଦେବେ?"</string>
     <string name="user_creation_adding" msgid="7305185499667958364">"<xliff:g id="APP">%1$s</xliff:g>ରେ ଏକ ନୂଆ ଉପଯୋଗକର୍ତ୍ତା ତିଆରି କରିବା ପାଇଁ <xliff:g id="ACCOUNT">%2$s</xliff:g>କୁ ଅନୁମତି ଦେବେ?"</string>
-    <string name="language_selection_title" msgid="52674936078683285">"ଏକ ଭାଷା ଯୋଡ଼ନ୍ତୁ"</string>
+    <string name="language_selection_title" msgid="52674936078683285">"ଏକ ଭାଷା ଯୋଗ କରନ୍ତୁ"</string>
     <string name="country_selection_title" msgid="5221495687299014379">"ପସନ୍ଦର ଅଞ୍ଚଳ"</string>
     <string name="search_language_hint" msgid="7004225294308793583">"ଭାଷାର ନାମ ଟାଇପ୍‍ କରନ୍ତୁ"</string>
     <string name="language_picker_section_suggested" msgid="6556199184638990447">"ପ୍ରସ୍ତାବିତ"</string>
@@ -1947,7 +1953,7 @@
     <string name="autofill_save_never" msgid="6821841919831402526">"କେବେ ବି ନୁହେଁ"</string>
     <string name="autofill_update_yes" msgid="4608662968996874445">"ଅପ୍‍ଡେଟ୍‌ କରନ୍ତୁ"</string>
     <string name="autofill_continue_yes" msgid="7914985605534510385">"ଜାରି ରଖନ୍ତୁ"</string>
-    <string name="autofill_save_type_password" msgid="5624528786144539944">"ପାସୱର୍ଡ୍"</string>
+    <string name="autofill_save_type_password" msgid="5624528786144539944">"ପାସୱାର୍ଡ"</string>
     <string name="autofill_save_type_address" msgid="3111006395818252885">"ଠିକଣା"</string>
     <string name="autofill_save_type_credit_card" msgid="3583795235862046693">"କ୍ରେଡିଟ୍ କାର୍ଡ"</string>
     <string name="autofill_save_type_debit_card" msgid="3169397504133097468">"ଡେବିଟ୍ କାର୍ଡ"</string>
diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml
index 9a3ae250..4735b57 100644
--- a/core/res/res/values-pa/strings.xml
+++ b/core/res/res/values-pa/strings.xml
@@ -1457,6 +1457,12 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"<xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>) ਵੱਲੋਂ ਬੇਨਤੀ ਕੀਤੀ"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"ਹਾਂ"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"ਨਹੀਂ"</string>
+    <!-- no translation found for gnss_nfw_notification_title (5004493772059563423) -->
+    <skip />
+    <!-- no translation found for gnss_nfw_notification_message_oem (3683958907027107969) -->
+    <skip />
+    <!-- no translation found for gnss_nfw_notification_message_carrier (815888995791562151) -->
+    <skip />
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"ਵਧੀ ਸੀਮਾ ਮਿਟਾਓ"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"<xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>, ਖਾਤੇ <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> ਲਈ <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> ਆਈਟਮਾਂ ਮਿਟਾਈਆਂ ਗਈਆਂ ਹਨ। ਤੁਸੀਂ ਕੀ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"ਆਈਟਮਾਂ ਹਟਾਓ"</string>
@@ -1558,7 +1564,7 @@
     <string name="wireless_display_route_description" msgid="8297563323032966831">"ਵਾਇਰਲੈੱਸ ਡਿਸਪਲੇ"</string>
     <string name="media_route_button_content_description" msgid="2299223698196869956">"ਪ੍ਰਸਾਰਿਤ ਕਰੋ"</string>
     <string name="media_route_chooser_title" msgid="6646594924991269208">"ਡੀਵਾਈਸ ਨਾਲ ਕਨੈਕਟ ਕਰੋ"</string>
-    <string name="media_route_chooser_title_for_remote_display" msgid="3105906508794326446">"ਡੀਵਾਈਸ ਨਾਲ ਸਕ੍ਰੀਨ ਕਾਸਟ ਕਰੋ"</string>
+    <string name="media_route_chooser_title_for_remote_display" msgid="3105906508794326446">"ਡੀਵਾਈਸ \'ਤੇ ਸਕ੍ਰੀਨ ਕਾਸਟ ਕਰੋ"</string>
     <string name="media_route_chooser_searching" msgid="6119673534251329535">"ਡੀਵਾਈਸਾਂ ਦੀ ਖੋਜ ਹੋ ਰਹੀ ਹੈ…"</string>
     <string name="media_route_chooser_extended_settings" msgid="2506352159381327741">"ਸੈਟਿੰਗਾਂ"</string>
     <string name="media_route_controller_disconnect" msgid="7362617572732576959">"ਡਿਸਕਨੈਕਟ ਕਰੋ"</string>
@@ -1790,7 +1796,7 @@
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ ਮਿਟਾਇਆ ਗਿਆ"</string>
     <string name="confirm_battery_saver" msgid="5247976246208245754">"ਠੀਕ ਹੈ"</string>
     <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"ਬੈਟਰੀ ਲਾਈਫ਼ ਵਧਾਉਣ ਲਈ, ਬੈਟਰੀ ਸੇਵਰ:\n ਗੂੜ੍ਹਾ ਥੀਮ ਚਾਲੂ ਕਰਦਾ ਹੈ\n ਬੈਕਗ੍ਰਾਊਂਡ ਸਰਗਰਮੀ, ਕੁਝ ਦ੍ਰਿਸ਼ਟੀਗਤ ਪ੍ਰਭਾਵਾਂ, ਅਤੇ \"Ok Google\" ਵਰਗੀਆਂ ਹੋਰ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਨੂੰ ਬੰਦ ਕਰਦਾ ਹੈ ਜਾਂ ਉਹਨਾਂ \'ਤੇ ਪਾਬੰਦੀ ਲਗਾਉਂਦਾ ਹੈ\n\n"<annotation id="url">"ਹੋਰ ਜਾਣੋ"</annotation></string>
-    <string name="battery_saver_description" msgid="7618492104632328184">"ਬੈਟਰੀ ਲਾਈਫ਼ ਵਧਾਉਣ ਲਈ, ਬੈਟਰੀ ਸੇਵਰ:\n ਗੂੜ੍ਹਾ ਥੀਮ ਚਾਲੂ ਕਰਦਾ ਹੈ\n ਬੈਕਗ੍ਰਾਊਂਡ ਸਰਗਰਮੀ, ਕੁਝ ਦ੍ਰਿਸ਼ ਪ੍ਰਭਾਵਾਂ, ਅਤੇ \"Hey Google\" ਵਰਗੀਆਂ ਹੋਰ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਨੂੰ ਬੰਦ ਕਰਦਾ ਹੈ ਜਾਂ ਉਹਨਾਂ \'ਤੇ ਪਾਬੰਦੀ ਲਗਾਉਂਦਾ ਹੈ"</string>
+    <string name="battery_saver_description" msgid="7618492104632328184">"ਬੈਟਰੀ ਲਾਈਫ਼ ਵਧਾਉਣ ਲਈ, ਬੈਟਰੀ ਸੇਵਰ:\n ਗੂੜ੍ਹਾ ਥੀਮ ਚਾਲੂ ਕਰਦਾ ਹੈ\n ਬੈਕਗ੍ਰਾਊਂਡ ਸਰਗਰਮੀ, ਕੁਝ ਦ੍ਰਿਸ਼ ਪ੍ਰਭਾਵਾਂ, ਅਤੇ \"Ok Google\" ਵਰਗੀਆਂ ਹੋਰ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਨੂੰ ਬੰਦ ਕਰਦਾ ਹੈ ਜਾਂ ਉਹਨਾਂ \'ਤੇ ਪਾਬੰਦੀ ਲਗਾਉਂਦਾ ਹੈ"</string>
     <string name="data_saver_description" msgid="4995164271550590517">"ਡਾਟਾ ਵਰਤੋਂ ਘਟਾਉਣ ਵਿੱਚ ਮਦਦ ਲਈ, ਡਾਟਾ ਸੇਵਰ ਕੁਝ ਐਪਾਂ ਨੂੰ ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਡਾਟਾ ਭੇਜਣ ਜਾਂ ਪ੍ਰਾਪਤ ਕਰਨ ਤੋਂ ਰੋਕਦਾ ਹੈ। ਤੁਹਾਡੇ ਵੱਲੋਂ ਵਰਤਮਾਨ ਤੌਰ \'ਤੇ ਵਰਤੀ ਜਾ ਰਹੀ ਐਪ ਡਾਟਾ \'ਤੇ ਪਹੁੰਚ ਕਰ ਸਕਦੀ ਹੈ, ਪਰ ਉਹ ਇੰਝ ਕਦੇ-ਕਦਾਈਂ ਕਰ ਸਕਦੀ ਹੈ। ਉਦਾਹਰਨ ਲਈ, ਇਸ ਦਾ ਮਤਲਬ ਇਹ ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਚਿੱਤਰ ਤਦ ਤੱਕ ਨਹੀਂ ਪ੍ਰਦਰਸ਼ਿਤ ਕੀਤੇ ਜਾਂਦੇ, ਜਦੋਂ ਤੱਕ ਤੁਸੀਂ ਉਹਨਾਂ \'ਤੇ ਟੈਪ ਨਹੀਂ ਕਰਦੇ।"</string>
     <string name="data_saver_enable_title" msgid="7080620065745260137">"ਕੀ ਡਾਟਾ ਸੇਵਰ ਚਾਲੂ ਕਰਨਾ ਹੈ?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"ਚਾਲੂ ਕਰੋ"</string>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index b2c7606..f219bd3 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -1499,6 +1499,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"Żądane przez <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"Tak"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"Nie"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"Uzyskano alarmowy dostęp do lokalizacji"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"Producent Twojego urządzenia uzyskał dostęp do Twojej lokalizacji podczas ostatniej sytuacji alarmowej"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"Twój operator uzyskał dostęp do Twojej lokalizacji podczas ostatniej sytuacji alarmowej"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"Przekroczono limit usuwania"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"Usuwasz <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> elementy(ów) przez: <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g> (konto: <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>). Co chcesz zrobić?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"Usuń elementy."</string>
@@ -1836,7 +1839,7 @@
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"Usunięty przez administratora"</string>
     <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
     <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"Aby wydłużyć czas pracy na baterii, Oszczędzanie baterii:\n włącza tryb ciemny, \nwyłącza lub ogranicza aktywność w tle, niektóre efekty wizualne oraz inne funkcje, np. „OK Google”.\n\n"<annotation id="url">"Więcej informacji"</annotation></string>
-    <string name="battery_saver_description" msgid="7618492104632328184">"Aby wydłużyć czas pracy na baterii, Oszczędzanie baterii:\n włącza tryb ciemny,\n wyłącza lub ogranicza aktywność w tle, niektóre efekty wizualne oraz inne funkcje, np. „OK Google”."</string>
+    <string name="battery_saver_description" msgid="7618492104632328184">"Aby wydłużyć czas pracy na baterii, Oszczędzanie baterii:\n· włącza tryb ciemny,\n· wyłącza lub ogranicza aktywność w tle, niektóre efekty wizualne oraz inne funkcje, np. „OK Google”."</string>
     <string name="data_saver_description" msgid="4995164271550590517">"Oszczędzanie danych uniemożliwia niektórym aplikacjom wysyłanie i odbieranie danych w tle, zmniejszając w ten sposób ich użycie. Aplikacja, z której w tej chwili korzystasz, może uzyskiwać dostęp do danych, ale rzadziej. Może to powodować, że obrazy będą się wyświetlać dopiero po kliknięciu."</string>
     <string name="data_saver_enable_title" msgid="7080620065745260137">"Włączyć Oszczędzanie danych?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Włącz"</string>
diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml
index 303a28f..1354a37 100644
--- a/core/res/res/values-pt-rBR/strings.xml
+++ b/core/res/res/values-pt-rBR/strings.xml
@@ -1457,6 +1457,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"Solicitado por <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"Sim"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"Não"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"Acesso ao local de emergência"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"O fabricante do dispositivo acessou seu local durante uma sessão de emergência recente"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"A operadora acessou seu local durante uma sessão de emergência recente"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"Limite de exclusão excedido"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"Há <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> itens excluídos para <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>, conta <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>. O que você quer fazer?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"Excluir os itens"</string>
@@ -1790,7 +1793,7 @@
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"Excluído pelo seu administrador"</string>
     <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
     <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"Para aumentar a duração da bateria, a \"Economia de bateria: \n ativa o tema escuro;\n·desativa ou restringe atividades em segundo plano, alguns efeitos visuais e outros recursos, como o \"Ok Google\".\n\n"<annotation id="url">"Saiba mais"</annotation></string>
-    <string name="battery_saver_description" msgid="7618492104632328184">"Para aumentar a duração da bateria, a \"Economia de bateria\": \n ativa o tema escuro;\n desativa ou restringe atividades em segundo plano, alguns efeitos visuais e outros recursos, como o \"Ok Google\"."</string>
+    <string name="battery_saver_description" msgid="7618492104632328184">"Para aumentar a duração da carga, a \"Economia de bateria\": \n·ativa o tema escuro;\n·desativa ou restringe atividades em segundo plano, alguns efeitos visuais e outros recursos, como o \"Ok Google\"."</string>
     <string name="data_saver_description" msgid="4995164271550590517">"Para ajudar a reduzir o uso de dados, a Economia de dados impede que alguns apps enviem ou recebam dados em segundo plano. Um app que você esteja usando no momento pode acessar dados, mas com menos frequência. Isso pode fazer com que imagens não sejam exibidas até que você toque nelas."</string>
     <string name="data_saver_enable_title" msgid="7080620065745260137">"Ativar Economia de dados?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Ativar"</string>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index f07f23511..b5d2e99 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -567,11 +567,11 @@
   <string-array name="fingerprint_error_vendor">
   </string-array>
     <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Ícone de impressão digital"</string>
-    <string name="permlab_manageFace" msgid="4569549381889283282">"gerir hardware de Desbloqueio Através do Rosto"</string>
+    <string name="permlab_manageFace" msgid="4569549381889283282">"gerir hardware de Desbloqueio facial"</string>
     <string name="permdesc_manageFace" msgid="6204569688492710471">"Permite à aplicação invocar métodos para adicionar e eliminar modelos faciais para uso."</string>
-    <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"utilizar hardware de Desbloqueio Através do Rosto"</string>
-    <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"Permite que a aplicação utilize hardware de Desbloqueio Através do Rosto para autenticação"</string>
-    <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Desbloqueio Através do Rosto"</string>
+    <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"utilizar hardware de Desbloqueio facial"</string>
+    <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"Permite que a aplicação utilize hardware de Desbloqueio facial para autenticação"</string>
+    <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Desbloqueio facial"</string>
     <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Volte a inscrever o seu rosto"</string>
     <string name="face_recalibrate_notification_content" msgid="892757485125249962">"Para melhorar o reconhecimento, volte a inscrever o seu rosto."</string>
     <string name="face_acquired_insufficient" msgid="2150805835949162453">"Imp. capt. dados rosto precisos. Tente novamente."</string>
@@ -597,15 +597,15 @@
   <string-array name="face_acquired_vendor">
   </string-array>
     <string name="face_error_hw_not_available" msgid="5085202213036026288">"Não pode validar o rosto. Hardware não disponível."</string>
-    <string name="face_error_timeout" msgid="522924647742024699">"Experimente de novo o Desbloqueio Através do Rosto"</string>
+    <string name="face_error_timeout" msgid="522924647742024699">"Experimente de novo o Desbloqueio facial"</string>
     <string name="face_error_no_space" msgid="5649264057026021723">"Não pode guardar novos dados de rostos. Elimine um antigo."</string>
     <string name="face_error_canceled" msgid="2164434737103802131">"Operação de rosto cancelada."</string>
-    <string name="face_error_user_canceled" msgid="8553045452825849843">"Desbloqueio Através do Rosto cancelado pelo utilizador"</string>
+    <string name="face_error_user_canceled" msgid="8553045452825849843">"Desbloqueio facial cancelado pelo utilizador"</string>
     <string name="face_error_lockout" msgid="7864408714994529437">"Demasiadas tentativas. Tente novamente mais tarde."</string>
-    <string name="face_error_lockout_permanent" msgid="8277853602168960343">"Demasiadas tentativas. O Desbloqueio Através do Rosto está desativado."</string>
+    <string name="face_error_lockout_permanent" msgid="8277853602168960343">"Demasiadas tentativas. O Desbloqueio facial está desativado."</string>
     <string name="face_error_unable_to_process" msgid="5723292697366130070">"Não é possível validar o rosto. Tente novamente."</string>
-    <string name="face_error_not_enrolled" msgid="7369928733504691611">"Não configurou o Desbloqueio Através do Rosto."</string>
-    <string name="face_error_hw_not_present" msgid="1070600921591729944">"Desbloqueio Através do Rosto não suportado neste dispositivo."</string>
+    <string name="face_error_not_enrolled" msgid="7369928733504691611">"Não configurou o Desbloqueio facial."</string>
+    <string name="face_error_hw_not_present" msgid="1070600921591729944">"Desbloqueio facial não suportado neste dispositivo."</string>
     <string name="face_error_security_update_required" msgid="5076017208528750161">"Sensor temporariamente desativado."</string>
     <string name="face_name_template" msgid="3877037340223318119">"Rosto <xliff:g id="FACEID">%d</xliff:g>"</string>
   <string-array name="face_error_vendor">
@@ -835,7 +835,7 @@
     <string name="lockscreen_pattern_wrong" msgid="2940138714468358458">"Tentar novamente"</string>
     <string name="lockscreen_password_wrong" msgid="8605355913868947490">"Tentar novamente"</string>
     <string name="lockscreen_storage_locked" msgid="634993789186443380">"Desbloqueio de todas as funcionalidades e dados"</string>
-    <string name="faceunlock_multiple_failures" msgid="681991538434031708">"Excedido o n.º máximo de tentativas de Desbloqueio Através do Rosto"</string>
+    <string name="faceunlock_multiple_failures" msgid="681991538434031708">"Excedido o n.º máximo de tentativas de Desbloqueio facial"</string>
     <string name="lockscreen_missing_sim_message_short" msgid="1248431165144893792">"Nenhum cartão SIM"</string>
     <string name="lockscreen_missing_sim_message" product="tablet" msgid="8596805728510570760">"Nenhum cartão SIM no tablet."</string>
     <string name="lockscreen_missing_sim_message" product="tv" msgid="2582768023352171073">"Nenhum cartão SIM no seu dispositivo Android TV."</string>
@@ -905,7 +905,7 @@
     <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"Expandir área de desbloqueio."</string>
     <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"Desbloqueio através de deslize."</string>
     <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"Desbloqueio através de sequência."</string>
-    <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"Desbloqueio através do rosto."</string>
+    <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"Desbloqueio facial"</string>
     <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"Desbloqueio através de PIN."</string>
     <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"Desbloqueio do SIM através de PIN."</string>
     <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"Desbloqueio do PUK do SIM."</string>
@@ -1457,6 +1457,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"Pedido por <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"Sim"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"Não"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"Acesso à localização de emergência"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"O fabricante do seu dispositivo acedeu à sua localização durante uma sessão de emergência recente."</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"O seu operador acedeu à sua localização durante uma sessão de emergência recente."</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"Limite de eliminações excedido"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"Há <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> itens eliminados de <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>, conta <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>. O que pretende fazer?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"Eliminar os itens"</string>
@@ -1792,7 +1795,7 @@
     <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"Para prolongar a autonomia da bateria, a Poupança de bateria:\n·Ativa o tema escuro.\n·Desativa ou restringe a atividade em segundo plano, alguns efeitos visuais e outras funcionalidades como \"Ok Google\".\n\n"<annotation id="url">"Saber mais"</annotation></string>
     <string name="battery_saver_description" msgid="7618492104632328184">"Para prolongar a autonomia da bateria, a Poupança de bateria:\n·Ativa o tema escuro.\n·Desativa ou restringe a atividade em segundo plano, alguns efeitos visuais e outras funcionalidades como \"Ok Google\"."</string>
     <string name="data_saver_description" msgid="4995164271550590517">"Para ajudar a reduzir a utilização de dados, a Poupança de dados impede que algumas aplicações enviem ou recebam dados em segundo plano. Uma determinada aplicação que esteja a utilizar atualmente pode aceder aos dados, mas é possível que o faça com menos frequência. Isto pode significar, por exemplo, que as imagens não são apresentadas até que toque nas mesmas."</string>
-    <string name="data_saver_enable_title" msgid="7080620065745260137">"Ativar a Poupança de dados?"</string>
+    <string name="data_saver_enable_title" msgid="7080620065745260137">"Pretende ativar a Poupança de dados?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Ativar"</string>
     <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
       <item quantity="other">Durante %1$d minutos (até à(s) <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index 303a28f..1354a37 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -1457,6 +1457,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"Solicitado por <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"Sim"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"Não"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"Acesso ao local de emergência"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"O fabricante do dispositivo acessou seu local durante uma sessão de emergência recente"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"A operadora acessou seu local durante uma sessão de emergência recente"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"Limite de exclusão excedido"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"Há <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> itens excluídos para <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>, conta <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>. O que você quer fazer?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"Excluir os itens"</string>
@@ -1790,7 +1793,7 @@
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"Excluído pelo seu administrador"</string>
     <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
     <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"Para aumentar a duração da bateria, a \"Economia de bateria: \n ativa o tema escuro;\n·desativa ou restringe atividades em segundo plano, alguns efeitos visuais e outros recursos, como o \"Ok Google\".\n\n"<annotation id="url">"Saiba mais"</annotation></string>
-    <string name="battery_saver_description" msgid="7618492104632328184">"Para aumentar a duração da bateria, a \"Economia de bateria\": \n ativa o tema escuro;\n desativa ou restringe atividades em segundo plano, alguns efeitos visuais e outros recursos, como o \"Ok Google\"."</string>
+    <string name="battery_saver_description" msgid="7618492104632328184">"Para aumentar a duração da carga, a \"Economia de bateria\": \n·ativa o tema escuro;\n·desativa ou restringe atividades em segundo plano, alguns efeitos visuais e outros recursos, como o \"Ok Google\"."</string>
     <string name="data_saver_description" msgid="4995164271550590517">"Para ajudar a reduzir o uso de dados, a Economia de dados impede que alguns apps enviem ou recebam dados em segundo plano. Um app que você esteja usando no momento pode acessar dados, mas com menos frequência. Isso pode fazer com que imagens não sejam exibidas até que você toque nelas."</string>
     <string name="data_saver_enable_title" msgid="7080620065745260137">"Ativar Economia de dados?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Ativar"</string>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index 1db0917..73c3e42 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -1478,6 +1478,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"Solicitat de <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"Da"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"Nu"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"A fost accesată locația de urgență"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"Producătorul dispozitivului v-a accesat locația în timpul unei sesiuni de urgență recente"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"Operatorul v-a accesat locația în timpul unei sesiuni de urgență recente"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"Limita pentru ștergere a fost depășită"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"Există <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g>   elemente șterse pentru <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>, contul <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>. Ce doriți să faceți?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"Ștergeți elementele"</string>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index 3a96385..7b2e882 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -1499,6 +1499,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"Запрашивает <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"Да"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"Нет"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"Получен доступ к вашим геоданным"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"Производитель устройства получил доступ к данным о вашем местоположении во время недавней передачи сведений в экстренной ситуации."</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"Оператор получил доступ к данным о вашем местоположении во время недавней передачи сведений в экстренной ситуации."</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"Превышен предел удаления"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"Удаленных объектов для <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>: <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g>, аккаунт <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>. Что нужно сделать?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"Удалить"</string>
@@ -1837,7 +1840,7 @@
     <string name="confirm_battery_saver" msgid="5247976246208245754">"ОК"</string>
     <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"Чтобы продлить время работы от батареи, в режиме энергосбережения:\nвключается тёмная тема;\nотключаются или ограничиваются фоновые процессы, некоторые визуальные эффекты и другие функции (например, распознавание команды \"Окей, Google\").\n\n"<annotation id="url">"Подробнее…"</annotation></string>
     <string name="battery_saver_description" msgid="7618492104632328184">"Чтобы продлить время работы от батареи, в режиме энергосбережения:\nвключается тёмная тема;\nотключаются или ограничиваются фоновые процессы, некоторые визуальные эффекты и другие функции (например, распознавание команды \"Окей, Google\")."</string>
-    <string name="data_saver_description" msgid="4995164271550590517">"В режиме экономии трафика фоновая передача для некоторых приложений отключена. Приложение, которым вы пользуетесь, может получать и отправлять данные, но реже, чем обычно. Например, изображения могут не загружаться, пока вы не нажмете на них."</string>
+    <string name="data_saver_description" msgid="4995164271550590517">"В режиме экономии трафика фоновая передача данных для некоторых приложений отключена. Приложение, которым вы пользуетесь, может получать и отправлять данные, но реже, чем обычно. Например, изображения могут не загружаться, пока вы не нажмете на них."</string>
     <string name="data_saver_enable_title" msgid="7080620065745260137">"Включить экономию трафика?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Включить"</string>
     <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
@@ -2094,7 +2097,7 @@
       <item quantity="many">\"<xliff:g id="FILE_NAME_2">%s</xliff:g>\" и ещё <xliff:g id="COUNT_3">%d</xliff:g> файлов</item>
       <item quantity="other">\"<xliff:g id="FILE_NAME_2">%s</xliff:g>\" и ещё <xliff:g id="COUNT_3">%d</xliff:g> файла</item>
     </plurals>
-    <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Рекомендованных пользователей нет."</string>
+    <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Рекомендованных получателей нет."</string>
     <string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Список приложений"</string>
     <string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Приложению не разрешено записывать звук, однако оно может делать это с помощью этого USB-устройства."</string>
     <string name="accessibility_system_action_home_label" msgid="3234748160850301870">"Главный экран"</string>
diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml
index a131b18..3a8639e 100644
--- a/core/res/res/values-si/strings.xml
+++ b/core/res/res/values-si/strings.xml
@@ -1459,6 +1459,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"<xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>) විසින් ඉල්ලන ලද"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"ඔව්"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"නැත"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"හදිසි අවස්ථා ස්ථානය වෙත ප්‍රවේශ විය"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"මෑත හදිසි අවස්ථා සැසියක් අතරතුර ඔබගේ උපාංග නිෂ්පාදක ඔබගේ ස්ථානයට ප්‍රවේශ විය"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"මෑත හදිසි අවස්ථා සැසියක් අතරතුර ඔබගේ වාහකය ඔබගේ ස්ථානයට ප්‍රවේශ විය"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"මැකීමේ සීමාව ඉක්මවන ලදි"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"<xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g> සඳහා <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> ගිණුමේ මකන ලද අයිතම <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> ක් ඇත. ඔබට කුමක් කිරීමට අවශ්‍යද?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"අයිතම මකන්න"</string>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index aec983c..dee51d5 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -242,11 +242,11 @@
     <string name="global_action_lock" msgid="6949357274257655383">"Zámka obrazovky"</string>
     <string name="global_action_power_off" msgid="4404936470711393203">"Vypnúť"</string>
     <string name="global_action_power_options" msgid="1185286119330160073">"Vypnutie"</string>
-    <string name="global_action_restart" msgid="4678451019561687074">"Reštart"</string>
-    <string name="global_action_emergency" msgid="1387617624177105088">"Tieseň"</string>
+    <string name="global_action_restart" msgid="4678451019561687074">"Reštartovať"</string>
+    <string name="global_action_emergency" msgid="1387617624177105088">"Tiesňový režim"</string>
     <string name="global_action_bug_report" msgid="5127867163044170003">"Hlásenie o chybách"</string>
     <string name="global_action_logout" msgid="6093581310002476511">"Ukončiť reláciu"</string>
-    <string name="global_action_screenshot" msgid="2610053466156478564">"Snímka"</string>
+    <string name="global_action_screenshot" msgid="2610053466156478564">"Snímka obrazovky"</string>
     <string name="bugreport_title" msgid="8549990811777373050">"Hlásenie chyby"</string>
     <string name="bugreport_message" msgid="5212529146119624326">"Týmto zhromaždíte informácie o aktuálnom stave zariadenia. Informácie je potom možné odoslať e-mailom, chvíľu však potrvá, kým bude hlásenie chyby pripravené na odoslanie. Prosíme vás preto o trpezlivosť."</string>
     <string name="bugreport_option_interactive_title" msgid="7968287837902871289">"Interaktívne nahlásenie"</string>
@@ -1499,6 +1499,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"Žiadosť od používateľa <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"Áno"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"Nie"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"Bola použitá poloha v tiesni"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"Výrobca vášho zariadenia použil vašu polohu počas nedávnej relácie v tiesňovej situácii"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"Váš operátor použil vašu polohu počas nedávnej relácie v tiesňovej situácii"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"Bol prekročený limit odstraňovania"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"Počet odstránených položiek pre <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g> účet <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> je: <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g>. Čo chcete robiť?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"Odstrániť položky"</string>
@@ -1601,7 +1604,7 @@
     <string name="media_route_button_content_description" msgid="2299223698196869956">"Prenášať"</string>
     <string name="media_route_chooser_title" msgid="6646594924991269208">"Pripojenie k zariadeniu"</string>
     <string name="media_route_chooser_title_for_remote_display" msgid="3105906508794326446">"Prenos obrazovky do zariadenia"</string>
-    <string name="media_route_chooser_searching" msgid="6119673534251329535">"Prebieha vyhľadávanie zariadení…"</string>
+    <string name="media_route_chooser_searching" msgid="6119673534251329535">"Vyhľadávajú sa zariadenia…"</string>
     <string name="media_route_chooser_extended_settings" msgid="2506352159381327741">"Nastavenia"</string>
     <string name="media_route_controller_disconnect" msgid="7362617572732576959">"Odpojiť"</string>
     <string name="media_route_status_scanning" msgid="8045156315309594482">"Prebieha vyhľadávanie..."</string>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index 5aa0e02..1511c18 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -242,7 +242,7 @@
     <string name="global_action_lock" msgid="6949357274257655383">"Zaklep zaslona"</string>
     <string name="global_action_power_off" msgid="4404936470711393203">"Izklopi"</string>
     <string name="global_action_power_options" msgid="1185286119330160073">"Vklop/izklop"</string>
-    <string name="global_action_restart" msgid="4678451019561687074">"Vnovični zagon"</string>
+    <string name="global_action_restart" msgid="4678451019561687074">"Znova zaženi"</string>
     <string name="global_action_emergency" msgid="1387617624177105088">"Klic v sili"</string>
     <string name="global_action_bug_report" msgid="5127867163044170003">"Poročilo o napakah"</string>
     <string name="global_action_logout" msgid="6093581310002476511">"Končaj sejo"</string>
@@ -1499,6 +1499,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"Zahtevala oseba <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"Da"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"Ne"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"Dostop do lokacije med klicem v sili"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"Med nedavnim klicem v sili je proizvajalec naprave dostopil do vaše lokacije"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"Med nedavnim klicem v sili je operater dostopil do vaše lokacije"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"Omejitev brisanja je presežena"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"Št. izbrisanih elementov za <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g> v računu <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>: <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g>. Kaj želite narediti?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"Izbris elementov"</string>
@@ -1600,7 +1603,7 @@
     <string name="wireless_display_route_description" msgid="8297563323032966831">"Brezžični prikaz"</string>
     <string name="media_route_button_content_description" msgid="2299223698196869956">"Predvajanje"</string>
     <string name="media_route_chooser_title" msgid="6646594924991269208">"Povezovanje z napravo"</string>
-    <string name="media_route_chooser_title_for_remote_display" msgid="3105906508794326446">"Predvajanje zaslona v napravi"</string>
+    <string name="media_route_chooser_title_for_remote_display" msgid="3105906508794326446">"Predvajanje zaslona v napravo"</string>
     <string name="media_route_chooser_searching" msgid="6119673534251329535">"Iskanje naprav …"</string>
     <string name="media_route_chooser_extended_settings" msgid="2506352159381327741">"Nastavitve"</string>
     <string name="media_route_controller_disconnect" msgid="7362617572732576959">"Prekinitev povezave"</string>
@@ -1836,7 +1839,7 @@
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"Izbrisal skrbnik"</string>
     <string name="confirm_battery_saver" msgid="5247976246208245754">"V redu"</string>
     <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"Funkcija varčevanja z energijo baterije tako podaljša čas delovanja baterije:\n·Vklopi temno temo,\n·izklopi ali omeji izvajanje dejavnosti v ozadju, nekaterih vizualnih učinkov in drugih funkcij, kot je »Hey Google«.\n\n"<annotation id="url">"Več o tem"</annotation></string>
-    <string name="battery_saver_description" msgid="7618492104632328184">"Funkcija varčevanja z energijo baterije tako podaljša čas delovanja baterije:\n·Vklopi temno temo,\n·izklopi ali omeji izvajanje dejavnosti v ozadju, nekaterih vizualnih učinkov in drugih funkcij, kot je »Hey Google«."</string>
+    <string name="battery_saver_description" msgid="7618492104632328184">"Funkcija varčevanja z energijo baterije podaljša čas delovanja baterije tako:\n·vklopi temno temo,\n·izklopi ali omeji izvajanje dejavnosti v ozadju, nekaterih vizualnih učinkov in drugih funkcij, kot je »Hey Google«."</string>
     <string name="data_saver_description" msgid="4995164271550590517">"Zaradi zmanjševanja prenesene količine podatkov funkcija varčevanja s podatki nekaterim aplikacijam preprečuje, da bi v ozadju pošiljale ali prejemale podatke. Aplikacija, ki jo trenutno uporabljate, lahko prenaša podatke, vendar to morda počne manj pogosto. To na primer pomeni, da se slike ne prikažejo, dokler se jih ne dotaknete."</string>
     <string name="data_saver_enable_title" msgid="7080620065745260137">"Vklop varčevanja s podatki?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Vklop"</string>
diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml
index 5e7351a..6bf4306 100644
--- a/core/res/res/values-sq/strings.xml
+++ b/core/res/res/values-sq/strings.xml
@@ -1457,6 +1457,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"Kërkuar nga <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"Po"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"Jo"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"Pati qasje në vendndodhjen e urgjencës"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"Prodhuesi i pajisjes sate u qas në vendndodhjen tënde gjatë një sesioni të fundit urgjence"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"Operatori yt celular u qas në vendndodhjen tënde gjatë një sesioni të fundit urgjence"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"Kufiri i fshirjes u tejkalua"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"Ka <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> artikuj të fshirë për <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g> nga llogaria <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>. Çfarë dëshiron të bësh?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"Fshiji artikujt"</string>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index 995e949..9f0dfb1 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -1478,6 +1478,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"Захтева <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"Да"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"Не"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"Приступљено локацији за хитне случајеве"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"Произвођач уређаја је приступио вашој локацији током недавне хитне сесије"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"Мобилни оператер је приступио вашој локацији током недавне хитне сесије"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"Премашено је ограничење за брисање"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"Постоје избрисане ставке (<xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g>) за <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>, налог <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>. Шта желите да урадите?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"Избриши ставке"</string>
@@ -1815,7 +1818,7 @@
     <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"Ради дужег трајања батерије, уштеда батерије:\n·укључује тамну тему\n·искључује или ограничава активности у позадини, неке визуелне ефекте и друге функције, на пример, „Ок Google“\n\n"<annotation id="url">"Сазнајте више"</annotation></string>
     <string name="battery_saver_description" msgid="7618492104632328184">"Ради дужег трајања батерије, уштеда батерије:\n·укључује тамну тему\n·искључује или ограничава активности у позадини, неке визуелне ефекте и друге функције, на пример, „Ок Google“"</string>
     <string name="data_saver_description" msgid="4995164271550590517">"Да би се смањила потрошња података, Уштеда података спречава неке апликације да шаљу или примају податке у позадини. Апликација коју тренутно користите може да приступа подацима, али ће то чинити ређе. На пример, слике се неће приказивати док их не додирнете."</string>
-    <string name="data_saver_enable_title" msgid="7080620065745260137">"Укључити Уштеду података?"</string>
+    <string name="data_saver_enable_title" msgid="7080620065745260137">"Желите да укључите Уштеду података?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Укључи"</string>
     <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
       <item quantity="one">%1$d минут (до <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index 54eec00..2e6a848 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -1457,6 +1457,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"Begärt av <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"Ja"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"Nej"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"Åtkomst till platsen för nödsituationen"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"Din enhetstillverkare kom åt till din plats vid en nödsituation nyligen"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"Din operatör kom åt till din plats vid en nödsituation nyligen"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"Gränsen för borttagning har överskridits"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"Det finns <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> borttagna objekt för <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>, konto <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>. Vad vill du göra?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"Ta bort objekten"</string>
@@ -1789,10 +1792,10 @@
     <string name="package_updated_device_owner" msgid="7560272363805506941">"Administratören uppdaterade paketet"</string>
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"Administratören raderade paketet"</string>
     <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
-    <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"I syfte att förlänga batteritiden sker följande i batterisparläget:\n·mörkt tema aktiveras\n·aktivitet i bakgrunden, vissa visuella effekter och andra funktioner, som ”Hey Google”, inaktiveras eller begränsas\n\n"<annotation id="url">"Läs mer"</annotation></string>
-    <string name="battery_saver_description" msgid="7618492104632328184">"I syfte att förlänga batteritiden sker följande i batterisparläget:\n·mörkt tema aktiveras\n·aktivitet i bakgrunden, vissa visuella effekter och andra funktioner, som ”Hey Google”, inaktiveras eller begränsas"</string>
+    <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"Batterisparläget förlänger batteritiden genom att:\n·aktivera mörkt tema\n·inaktivera eller begränsa aktivitet i bakgrunden, vissa visuella effekter och andra funktioner, som ”Hey Google”\n\n"<annotation id="url">"Läs mer"</annotation></string>
+    <string name="battery_saver_description" msgid="7618492104632328184">"Batterisparläget förlänger batteritiden genom att:\n·aktivera mörkt tema\n·inaktivera eller begränsa aktivitet i bakgrunden, vissa visuella effekter och andra funktioner, som ”Hey Google”"</string>
     <string name="data_saver_description" msgid="4995164271550590517">"Med databesparing kan du minska dataanvändningen genom att hindra en del appar från att skicka eller ta emot data i bakgrunden. Appar som du använder kan komma åt data, men det sker kanske inte lika ofta. Detta innebär t.ex. att bilder inte visas förrän du trycker på dem."</string>
-    <string name="data_saver_enable_title" msgid="7080620065745260137">"Aktivera Databesparing?"</string>
+    <string name="data_saver_enable_title" msgid="7080620065745260137">"Vill du aktivera Databesparing?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Aktivera"</string>
     <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
       <item quantity="other">I %1$d minuter (till kl. <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index 7e9a1ea..1b5d671 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -242,7 +242,7 @@
     <string name="global_action_emergency" msgid="1387617624177105088">"Dharura"</string>
     <string name="global_action_bug_report" msgid="5127867163044170003">"Ripoti ya hitilafu"</string>
     <string name="global_action_logout" msgid="6093581310002476511">"Maliza kipindi"</string>
-    <string name="global_action_screenshot" msgid="2610053466156478564">"Pichaskrini"</string>
+    <string name="global_action_screenshot" msgid="2610053466156478564">"Picha ya skrini"</string>
     <string name="bugreport_title" msgid="8549990811777373050">"Ripoti ya hitilafu"</string>
     <string name="bugreport_message" msgid="5212529146119624326">"Hii itakusanya maelezo kuhusu hali ya kifaa chako kwa sasa, na itume kama barua pepe. Itachukua muda mfupi tangu ripoti ya hitilafu ianze kuzalishwa hadi iwe tayari kutumwa; vumilia."</string>
     <string name="bugreport_option_interactive_title" msgid="7968287837902871289">"Ripoti ya kushirikiana"</string>
@@ -313,7 +313,7 @@
     <string name="permgroupdesc_calllog" msgid="2026996642917801803">"kusoma na kuandika rekodi ya nambari za simu"</string>
     <string name="permgrouplab_phone" msgid="570318944091926620">"Simu"</string>
     <string name="permgroupdesc_phone" msgid="270048070781478204">"piga na udhibiti simu"</string>
-    <string name="permgrouplab_sensors" msgid="9134046949784064495">"Vihisi vya mwili"</string>
+    <string name="permgrouplab_sensors" msgid="9134046949784064495">"Vitambua shughuli za mwili"</string>
     <string name="permgroupdesc_sensors" msgid="2610631290633747752">"fikia data ya kitambuzi kuhusu alama zako muhimu"</string>
     <string name="capability_title_canRetrieveWindowContent" msgid="7554282892101587296">"Kufikia maudhui ya dirisha"</string>
     <string name="capability_desc_canRetrieveWindowContent" msgid="6195610527625237661">"Kuchunguza maudhui ya dirisha unalotumia."</string>
@@ -409,7 +409,7 @@
     <string name="permdesc_writeCallLog" product="tablet" msgid="2657525794731690397">"Huruhusu programu kurekebisha rajisi ya kompyuta kibao yako, ikiwa ni pamoja na simu zinazoingia na kutoka. Huenda programu hasidi zikatumia hii ili kufuta au kurekebisha rajisi ya simu yako."</string>
     <string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Huruhusu programu irekebishe rekodi ya nambari za simu ya kifaa chako cha Android TV, ikiwa ni pamoja na data kuhusu simu zinazoingia na simu unazopiga. Huenda programu hasidi zikatumia ruhusa hii ili kufuta au kurekebisha rekodi yako ya nambari za simu."</string>
     <string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Huruhusu programu kurekebisha rajisi ya simu yako, ikiwa ni pamoja na simu zinazoingia na kutoka. Huenda programu hasidi zikatumia hii ili kufuta au kurekebisha rajisi ya simu yako."</string>
-    <string name="permlab_bodySensors" msgid="3411035315357380862">"fikia vihisi vya mwili (kama vifuatiliaji vya mapigo ya moyo)"</string>
+    <string name="permlab_bodySensors" msgid="3411035315357380862">"fikia vitambua shughuli za mwili (kama vifuatiliaji vya mapigo ya moyo)"</string>
     <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Huruhusu programu kufikia data kutoka vihisi vinavyofuatilia hali yako ya kimwili, kama vile mapigo ya moyo."</string>
     <string name="permlab_readCalendar" msgid="6408654259475396200">"Soma matukio na maelezo ya kalenda"</string>
     <string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"Programu hii inaweza kusoma matukio yote ya kalenda yaliyohifadhiwa kwenye kompyuta yako kibao na kushiriki au kuhifadhi data yako ya kalenda."</string>
@@ -504,7 +504,7 @@
     <string name="permdesc_bluetoothAdmin" product="tablet" msgid="5370837055438574863">"Inaruhusu programu kusanidi kompyuta kibao ya karibu ya Bluetooth na kutambua na kuoanisha na vifaa vya kudhibiti."</string>
     <string name="permdesc_bluetoothAdmin" product="tv" msgid="1623992984547014588">"Huruhusu programu iweke mipangilio ya Bluetooth kwenye kifaa chako cha Android TV na kugundua na kuoanisha na vifaa vya mbali."</string>
     <string name="permdesc_bluetoothAdmin" product="default" msgid="7381341743021234863">"Inaruhusu programu kusanidi simu ya karibu ya Bluetooth, na kutambua na kuoanisha na vifaa vya mbali."</string>
-    <string name="permlab_accessWimaxState" msgid="7029563339012437434">"unganisha na uukate muunaganisho kutoka kwenye  WiMAX"</string>
+    <string name="permlab_accessWimaxState" msgid="7029563339012437434">"unganisha na utenganishe kutoka kwenye  WiMAX"</string>
     <string name="permdesc_accessWimaxState" msgid="5372734776802067708">"Inaruhusu programu kuthibitisha ikiwa WiMAX imewezeshwa na taarifa kuhusu mitandao yoyote ya WiMAX ambayo imeunganishwa."</string>
     <string name="permlab_changeWimaxState" msgid="6223305780806267462">"badilisha hali ya WiMAX"</string>
     <string name="permdesc_changeWimaxState" product="tablet" msgid="4011097664859480108">"Inaruhusu programu kuunganisha kompyuta kibao,  na kukata kompyuta kibao kutoka mitandao ya WiMAX."</string>
@@ -1457,6 +1457,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"Imeombwa na <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"Ndiyo"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"Hapana"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"Eneo lilifikiwa wakati wa dharura"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"Mtengenezaji wa kifaa chako alifikia maelezo ya mahali ulipo wakati wa dharura hivi majuzi"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"Mtoa huduma wako alifikia maelezo ya mahali ulipo wakati wa dharura hivi majuzi"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"Upeo wa ufutaji umezidishwa"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"Kuna vipengee <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> vilivyofutwa vya <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>, akaunti <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>. Je, unataka kufanya nini?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"Futa vipengee"</string>
@@ -1561,7 +1564,7 @@
     <string name="media_route_chooser_title_for_remote_display" msgid="3105906508794326446">"Tuma skrini kwenye kifaa"</string>
     <string name="media_route_chooser_searching" msgid="6119673534251329535">"Inatafuta vifaa..."</string>
     <string name="media_route_chooser_extended_settings" msgid="2506352159381327741">"Mipangilio"</string>
-    <string name="media_route_controller_disconnect" msgid="7362617572732576959">"Ondoa"</string>
+    <string name="media_route_controller_disconnect" msgid="7362617572732576959">"Tenganisha"</string>
     <string name="media_route_status_scanning" msgid="8045156315309594482">"Inatambaza..."</string>
     <string name="media_route_status_connecting" msgid="5845597961412010540">"Inaunganisha..."</string>
     <string name="media_route_status_available" msgid="1477537663492007608">"Inapatikana"</string>
@@ -1790,7 +1793,7 @@
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"Imefutwa na msimamizi wako"</string>
     <string name="confirm_battery_saver" msgid="5247976246208245754">"Sawa"</string>
     <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"Ili kuongeza muda wa matumizi ya betri, Kiokoa Betri:\n.Huwasha Mandhari meusi\n. Huzima au kuzuia shughuli za chinichini, baadhi ya madoido yanayoonekana na vipengele vingine kama vile \"Ok Google\"\n\n"<annotation id="url">"Pata maelezo zaidi"</annotation></string>
-    <string name="battery_saver_description" msgid="7618492104632328184">"Ili kuongeza muda wa matumizi ya betri, Kiokoa Betri:\n.Huwasha Mandhari meusi\n. Huzima au kuzuia shughuli za chinichini, baadhi ya madoido yanayoonekana na vipengele vingine kama vile \"Ok Google\""</string>
+    <string name="battery_saver_description" msgid="7618492104632328184">"Ili kuongeza muda wa matumizi ya betri, Kiokoa Betri:\n·Huwasha Mandhari meusi\n·Huzima au kuzuia shughuli za chinichini, baadhi ya madoido yanayoonekana na vipengele vingine kama vile \"Ok Google\""</string>
     <string name="data_saver_description" msgid="4995164271550590517">"Ili kusaidia kupunguza matumizi ya data, Kiokoa Data huzuia baadhi ya programu kupokea na kutuma data chinichini. Programu ambayo unatumia sasa inaweza kufikia data, lakini si kila wakati. Kwa mfano, haitaonyesha picha hadi utakapozifungua."</string>
     <string name="data_saver_enable_title" msgid="7080620065745260137">"Ungependa Kuwasha Kiokoa Data?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Washa"</string>
diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml
index 7135240..2a03f36 100644
--- a/core/res/res/values-ta/strings.xml
+++ b/core/res/res/values-ta/strings.xml
@@ -1457,6 +1457,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"<xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>) ஆல் கோரப்பட்டுள்ளது"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"ஆம்"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"இல்லை"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"அவசரகாலத்திற்காக இருப்பிடம் அணுகப்பட்டது"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"சமீபத்திய அவசர அமர்வின் போது உங்கள் சாதனத்தின் உற்பத்தியாளர் உங்களது இருப்பிடத்தை அணுகினார்"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"சமீபத்திய அவசர அமர்வின்போது உங்கள் மொபைல் நிறுவனம் உங்களது இருப்பிடத்தை அணுகியது"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"நீக்கும் வரம்பு கடந்தது"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"<xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> கணக்கின் <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g> க்கான <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> நீக்கப்பட்ட உருப்படிகள் உள்ளன. என்ன செய்ய விரும்புகிறீர்கள்?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"உருப்படிகளை நீக்கு"</string>
@@ -1645,7 +1648,7 @@
     <string name="done_accessibility_shortcut_menu_button" msgid="3668407723770815708">"முடிந்தது"</string>
     <string name="disable_accessibility_shortcut" msgid="5806091378745232383">"ஷார்ட்கட்டை முடக்கு"</string>
     <string name="leave_accessibility_shortcut_on" msgid="6543362062336990814">"ஷார்ட்கட்டைப் பயன்படுத்து"</string>
-    <string name="color_inversion_feature_name" msgid="326050048927789012">"வண்ணத்தை நேர் எதிராக மாற்றுதல்"</string>
+    <string name="color_inversion_feature_name" msgid="326050048927789012">"கலர் இன்வெர்ஷன்"</string>
     <string name="color_correction_feature_name" msgid="3655077237805422597">"வண்ணத் திருத்தம்"</string>
     <string name="accessibility_shortcut_enabling_service" msgid="5473495203759847687">"ஒலியளவுக்கான விசைகளைப் பிடித்திருந்தீர்கள். <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ஆன் செய்யப்பட்டது."</string>
     <string name="accessibility_shortcut_disabling_service" msgid="8675244165062700619">"ஒலியளவுக்கான விசைகளைப் பிடித்திருந்தீர்கள். <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ஆஃப் செய்யப்பட்டது."</string>
@@ -2044,8 +2047,7 @@
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
     <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"உரையாடல்"</string>
     <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"குழு உரையாடல்"</string>
-    <!-- no translation found for unread_convo_overflow (920517615597353833) -->
-    <skip />
+    <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string>
     <string name="resolver_personal_tab" msgid="2051260504014442073">"தனிப்பட்ட சுயவிவரம்"</string>
     <string name="resolver_work_tab" msgid="2690019516263167035">"பணிச் சுயவிவரம்"</string>
     <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"தனிப்பட்ட காட்சி"</string>
diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml
index e0990a2..f848950 100644
--- a/core/res/res/values-te/strings.xml
+++ b/core/res/res/values-te/strings.xml
@@ -295,7 +295,7 @@
     <string name="managed_profile_label" msgid="7316778766973512382">"కార్యాలయ ప్రొఫైల్‌కి మార్చు"</string>
     <string name="permgrouplab_contacts" msgid="4254143639307316920">"కాంటాక్ట్‌లు"</string>
     <string name="permgroupdesc_contacts" msgid="9163927941244182567">"మీ పరిచయాలను యాక్సెస్ చేయడానికి"</string>
-    <string name="permgrouplab_location" msgid="1858277002233964394">"స్థానం"</string>
+    <string name="permgrouplab_location" msgid="1858277002233964394">"లొకేషన్"</string>
     <string name="permgroupdesc_location" msgid="1995955142118450685">"ఈ పరికర స్థానాన్ని యాక్సెస్ చేయడానికి"</string>
     <string name="permgrouplab_calendar" msgid="6426860926123033230">"Calendar"</string>
     <string name="permgroupdesc_calendar" msgid="6762751063361489379">"మీ క్యాలెండర్‌ను యాక్సెస్ చేయడానికి"</string>
@@ -1457,6 +1457,12 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"<xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>) ద్వారా అభ్యర్థించబడింది"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"అవును"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"కాదు"</string>
+    <!-- no translation found for gnss_nfw_notification_title (5004493772059563423) -->
+    <skip />
+    <!-- no translation found for gnss_nfw_notification_message_oem (3683958907027107969) -->
+    <skip />
+    <!-- no translation found for gnss_nfw_notification_message_carrier (815888995791562151) -->
+    <skip />
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"తొలగింపు పరిమితి మించిపోయింది"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"<xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>, ఖాతా <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>కి సంబంధించి <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> తొలగించబడే అంశాలు ఉన్నాయి. మీరు ఏమి చేయాలనుకుంటున్నారు?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"అంశాలను తొలగించు"</string>
@@ -1559,7 +1565,7 @@
     <string name="media_route_button_content_description" msgid="2299223698196869956">"ప్రసారం చేయండి"</string>
     <string name="media_route_chooser_title" msgid="6646594924991269208">"పరికరానికి కనెక్ట్ చేయండి"</string>
     <string name="media_route_chooser_title_for_remote_display" msgid="3105906508794326446">"స్క్రీన్‌ను పరికరానికి ప్రసారం చేయండి"</string>
-    <string name="media_route_chooser_searching" msgid="6119673534251329535">"పరికరాల కోసం వెతుకుతోంది…"</string>
+    <string name="media_route_chooser_searching" msgid="6119673534251329535">"డివైజ్‌ల కోసం వెతుకుతోంది…"</string>
     <string name="media_route_chooser_extended_settings" msgid="2506352159381327741">"సెట్టింగ్‌లు"</string>
     <string name="media_route_controller_disconnect" msgid="7362617572732576959">"డిస్‌కనెక్ట్ చేయి"</string>
     <string name="media_route_status_scanning" msgid="8045156315309594482">"స్కాన్ చేస్తోంది..."</string>
@@ -1789,9 +1795,9 @@
     <string name="package_updated_device_owner" msgid="7560272363805506941">"మీ నిర్వాహకులు నవీకరించారు"</string>
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"మీ నిర్వాహకులు తొలగించారు"</string>
     <string name="confirm_battery_saver" msgid="5247976246208245754">"సరే"</string>
-    <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"బ్యాటరీ జీవితకాలాన్ని పెంచడానికి, బ్యాటరీ సేవర్:\n ముదురు రంగు·థీమ్‌ను ఆన్ చేస్తుంది\n·నేపథ్య కార్యకలాపం, కొన్ని విజువల్ ఎఫెక్ట్స్ మరియు “Hey Google” వంటి ఇతర ఫీచర్‌లను ఆపివేస్తుంది లేదా పరిమితం చేస్తుంది\n\n"<annotation id="url">"మరింత తెలుసుకోండి"</annotation></string>
-    <string name="battery_saver_description" msgid="7618492104632328184">"బ్యాటరీ జీవితకాలాన్ని పెంచడానికి, బ్యాటరీ సేవర్:\n ముదురు రంగు·థీమ్‌ను ఆన్ చేస్తుంది\n·నేపథ్య కార్యకలాపం, కొన్ని విజువల్ ఎఫెక్ట్స్ మరియు “Hey Google” వంటి ఇతర ఫీచర్‌లను ఆపివేస్తుంది లేదా పరిమితం చేస్తుంది"</string>
-    <string name="data_saver_description" msgid="4995164271550590517">"డేటా వినియోగాన్ని తగ్గించడంలో డేటా సేవర్ సహాయకరంగా ఉంటుంది. బ్యాక్‌గ్రౌండ్‌లో కొన్ని యాప్‌లు డేటాను పంపకుండా లేదా స్వీకరించకుండా నిరోధిస్తుంది. మీరు ప్రస్తుతం ఉపయోగిస్తోన్న యాప్‌ డేటాను యాక్సెస్ చేయగలదు. కానీ అలా అరుదుగా చేయవచ్చు. ఉదాహరణకు, మీరు చిత్రాలను నొక్కే వరకు అవి ప్రదర్శించబడవు."</string>
+    <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"బ్యాటరీ జీవితకాలాన్ని పెంచడానికి, బ్యాటరీ సేవర్ వీటిని చేస్తుంది:\n·ముదురు రంగు థీమ్‌ను ఆన్ చేస్తుంది\n·బ్యాక్‌గ్రౌండ్ కార్యకలాపం, కొన్ని విజువల్ ఎఫెక్ట్స్‌లతో పాటు “Ok Google” వంటి ఇతర ఫీచర్‌లను ఆపివేస్తుంది లేదా పరిమితం చేస్తుంది\n\n"<annotation id="url">"మరింత తెలుసుకోండి"</annotation></string>
+    <string name="battery_saver_description" msgid="7618492104632328184">"బ్యాటరీ జీవితకాలాన్ని పెంచడానికి, బ్యాటరీ సేవర్ వీటిని చేస్తుంది:\n·ముదురు రంగు థీమ్‌ను ఆన్ చేస్తుంది\n·బ్యాక్‌గ్రౌండ్ కార్యకలాపం, కొన్ని విజువల్ ఎఫెక్ట్స్‌లతో పాటు “Ok Google” వంటి ఇతర ఫీచర్‌లను ఆపివేస్తుంది లేదా పరిమితం చేస్తుంది"</string>
+    <string name="data_saver_description" msgid="4995164271550590517">"డేటా వినియోగాన్ని తగ్గించడంలో డేటా సేవర్ సహాయకరంగా ఉంటుంది. బ్యాక్‌గ్రౌండ్‌లో కొన్ని యాప్‌లు డేటాను పంపకుండా లేదా స్వీకరించకుండా నిరోధిస్తుంది. మీరు ప్రస్తుతం ఉపయోగిస్తోన్న యాప్‌, డేటాను యాక్సెస్ చేయగలదు. కానీ త‌క్కువ సార్లు మాత్ర‌మే అలా చేయవచ్చు. ఉదాహరణకు, మీరు నొక్కే వరకు ఫోటోలు ప్రదర్శించబడవు."</string>
     <string name="data_saver_enable_title" msgid="7080620065745260137">"డేటా సేవర్‌ను ఆన్ చేయాలా?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"ఆన్ చేయి"</string>
     <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index 83f7a1b..ff5557d 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -187,7 +187,7 @@
     <string name="work_profile_deleted" msgid="5891181538182009328">"ลบโปรไฟล์งานแล้ว"</string>
     <string name="work_profile_deleted_details" msgid="3773706828364418016">"แอปผู้ดูแลระบบโปรไฟล์งานไม่มีอยู่หรือเสียหาย ระบบจึงทำการลบโปรไฟล์งานและข้อมูลที่เกี่ยวข้องของคุณออก โปรดติดต่อผู้ดูแลระบบเพื่อรับความช่วยเหลือ"</string>
     <string name="work_profile_deleted_description_dpm_wipe" msgid="2477244968924647232">"โปรไฟล์งานของคุณไม่สามารถใช้ในอุปกรณ์นี้อีกต่อไป"</string>
-    <string name="work_profile_deleted_reason_maximum_password_failure" msgid="1080323158315663167">"ลองป้อนรหัสผ่านหลายครั้งเกินไป"</string>
+    <string name="work_profile_deleted_reason_maximum_password_failure" msgid="1080323158315663167">"พยายามป้อนรหัสผ่านหลายครั้งเกินไป"</string>
     <string name="device_ownership_relinquished" msgid="4080886992183195724">"ผู้ดูแลระบบปล่อยอุปกรณ์ให้คุณใช้งานส่วนตัว"</string>
     <string name="network_logging_notification_title" msgid="554983187553845004">"อุปกรณ์มีการจัดการ"</string>
     <string name="network_logging_notification_text" msgid="1327373071132562512">"องค์กรของคุณจัดการอุปกรณ์นี้และอาจตรวจสอบการจราจรของข้อมูลในเครือข่าย แตะเพื่อดูรายละเอียด"</string>
@@ -803,7 +803,7 @@
     <string name="relationTypeFriend" msgid="3192092625893980574">"เพื่อน"</string>
     <string name="relationTypeManager" msgid="2272860813153171857">"ผู้จัดการ"</string>
     <string name="relationTypeMother" msgid="2331762740982699460">"มารดา"</string>
-    <string name="relationTypeParent" msgid="4177920938333039882">"บิดามารดา"</string>
+    <string name="relationTypeParent" msgid="4177920938333039882">"ผู้ปกครอง"</string>
     <string name="relationTypePartner" msgid="4018017075116766194">"หุ้นส่วน"</string>
     <string name="relationTypeReferredBy" msgid="5285082289602849400">"แนะนำโดย"</string>
     <string name="relationTypeRelative" msgid="3396498519818009134">"ญาติ"</string>
@@ -1457,6 +1457,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"ร้องขอโดย <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"ใช่"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"ไม่"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"เข้าถึงตำแหน่งฉุกเฉินแล้ว"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"ผู้ผลิตอุปกรณ์เข้าถึงตำแหน่งของคุณระหว่างเซสชันฉุกเฉินเมื่อเร็วๆ นี้"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"ผู้ให้บริการเข้าถึงตำแหน่งของคุณระหว่างเซสชันฉุกเฉินเมื่อเร็วๆ นี้"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"เกินจำนวนการนำออกสูงสุด"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"มีรายการที่จะลบ <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> รายการสำหรับ <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g> ในบัญชี <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> คุณต้องการทำสิ่งใด"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"ลบรายการ"</string>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index 773020b..5de4525 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -1457,6 +1457,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"Hiniling ni <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"Oo"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"Hindi"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"Na-access ang pang-emergency na lokasyon"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"Na-access ng manufacturer ng iyong device ang lokasyon mo sa kamakailang pang-emergency na session"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"Na-access ng iyong carrier ang lokasyon mo sa kamakailang pang-emergency na session"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"Nalagpasan na ang limitasyon sa pagtanggal"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"Mayroong <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> (na) tinanggal na item para sa <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>, account na <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>. Ano ang nais mong gawin?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"I-delete ang mga item"</string>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index 69f41dd..b10d193 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -192,7 +192,7 @@
     <string name="network_logging_notification_title" msgid="554983187553845004">"Cihaz yönetiliyor"</string>
     <string name="network_logging_notification_text" msgid="1327373071132562512">"Kuruluşunuz bu cihazı yönetmekte olup ağ trafiğini izleyebilir. Ayrıntılar için dokunun."</string>
     <string name="location_changed_notification_title" msgid="3620158742816699316">"Uygulamalar konumunuza erişebilir"</string>
-    <string name="location_changed_notification_text" msgid="7158423339982706912">"Daha fazla bilgi edinmek için BT yöneticinizle iletişim kurun"</string>
+    <string name="location_changed_notification_text" msgid="7158423339982706912">"BT yöneticinizden daha fazla bilgi alabilirsiniz."</string>
     <string name="country_detector" msgid="7023275114706088854">"Ülke Algılayıcı"</string>
     <string name="location_service" msgid="2439187616018455546">"Konum Hizmeti"</string>
     <string name="sensor_notification_service" msgid="7474531979178682676">"Sensör Bildirim Hizmeti"</string>
@@ -1457,6 +1457,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"<xliff:g id="NAME">%1$s</xliff:g> tarafından istendi (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"Evet"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"Hayır"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"Acil durum sırasında konuma erişildi"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"Yakın zamanda yaşanan bir acil durum sırasında cihaz üreticiniz konumunuza erişti"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"Yakın zamanda yaşanan bir acil durum sırasında operatörünüz konumunuza erişti"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"Silme sınırı aşıldı"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"<xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> hesabında <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g> için <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> adet silinmiş öğe var. Ne yapmak istiyorsunuz?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"Öğeleri sil"</string>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index c9d29a2..f42d156 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -20,7 +20,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="byteShort" msgid="202579285008794431">"б"</string>
+    <string name="byteShort" msgid="202579285008794431">"Б"</string>
     <string name="kilobyteShort" msgid="2214285521564195803">"КБ"</string>
     <string name="megabyteShort" msgid="6649361267635823443">"МБ"</string>
     <string name="gigabyteShort" msgid="7515809460261287991">"ГБ"</string>
@@ -1347,7 +1347,7 @@
     <string name="usb_unsupported_audio_accessory_title" msgid="2335775548086533065">"Виявлено аналоговий аксесуар для аудіо"</string>
     <string name="usb_unsupported_audio_accessory_message" msgid="1300168007129796621">"Під’єднаний пристрій несумісний із цим телефоном. Торкніться, щоб дізнатися більше."</string>
     <string name="adb_active_notification_title" msgid="408390247354560331">"Налагодження USB підключено"</string>
-    <string name="adb_active_notification_message" msgid="5617264033476778211">"Торкніться, щоб вимкнути налагоджувач USB"</string>
+    <string name="adb_active_notification_message" msgid="5617264033476778211">"Торкніться, щоб вимкнути налагодження через USB"</string>
     <string name="adb_active_notification_message" product="tv" msgid="6624498401272780855">"Виберіть, щоб вимкнути налагодження за USB"</string>
     <string name="adbwifi_active_notification_title" msgid="6147343659168302473">"Налагодження через Wi-Fi активне"</string>
     <string name="adbwifi_active_notification_message" msgid="930987922852867972">"Натисніть, щоб вимкнути налагодження через Wi-Fi"</string>
@@ -1499,6 +1499,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"Запит зроблено користувачем <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"Так"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"Ні"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"Переглянуто геодані в екстреній ситуації"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"Виробник пристрою отримав доступ до ваших геоданих під час нещодавнього екстреного звернення"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"Оператор отримав доступ до ваших геоданих під час нещодавнього екстреного звернення"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"Перевищено ліміт видалень"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"Для <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>, облікового запису <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>, знайдено стільки видалених елементів: <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g>. Що робити?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"Видалити елементи"</string>
@@ -1836,9 +1839,9 @@
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"Видалено адміністратором"</string>
     <string name="confirm_battery_saver" msgid="5247976246208245754">"ОК"</string>
     <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"Щоб подовжити час роботи акумулятора, режим енергозбереження:\n·вмикає темну тему;\n·припиняє або обмежує фонову активність, вимикає деякі візуальні ефекти й інші енергозатратні функції, зокрема Ok Google.\n\n"<annotation id="url">"Докладніше"</annotation></string>
-    <string name="battery_saver_description" msgid="7618492104632328184">"Щоб подовжити час роботи акумулятора, режим енергозбереження:\n·вмикає темну тему;\n·припиняє або обмежує фонову активність, вимикає деякі візуальні ефекти й інші енергозатратні функції, зокрема Ok Google."</string>
+    <string name="battery_saver_description" msgid="7618492104632328184">"Щоб подовжити час роботи акумулятора, режим енергозбереження:\n·вмикає темну тему;\n·припиняє або обмежує фонову активність, вимикає деякі візуальні ефекти й інші енергозатратні функції, зокрема команду \"Ok Google\"."</string>
     <string name="data_saver_description" msgid="4995164271550590517">"Щоб зменшити використання трафіку, функція \"Заощадження трафіку\" не дозволяє деяким додаткам надсилати чи отримувати дані у фоновому режимі. Поточний додаток зможе отримувати доступ до таких даних, але рідше. Наприклад, зображення не відображатиметься, доки ви не торкнетеся його."</string>
-    <string name="data_saver_enable_title" msgid="7080620065745260137">"Увімкнути Заощадження трафіку?"</string>
+    <string name="data_saver_enable_title" msgid="7080620065745260137">"Увімкнути заощадження трафіку?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Увімкнути"</string>
     <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
       <item quantity="one">%1$d хвилину (до <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml
index 216f624..db56194 100644
--- a/core/res/res/values-ur/strings.xml
+++ b/core/res/res/values-ur/strings.xml
@@ -1457,6 +1457,12 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"درخواست کردہ بذریعہ <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"ہاں"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"نہیں"</string>
+    <!-- no translation found for gnss_nfw_notification_title (5004493772059563423) -->
+    <skip />
+    <!-- no translation found for gnss_nfw_notification_message_oem (3683958907027107969) -->
+    <skip />
+    <!-- no translation found for gnss_nfw_notification_message_carrier (815888995791562151) -->
+    <skip />
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"حذف کرنے کی حد سے متجاوز ہو گیا"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"<xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>، اکاؤنٹ <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> کیلئے <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> حذف کردہ آئٹمز ہیں۔ آپ کیا کرنا چاہتے ہیں؟"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"آئٹمز حذف کریں"</string>
@@ -1791,7 +1797,7 @@
     <string name="confirm_battery_saver" msgid="5247976246208245754">"ٹھیک ہے"</string>
     <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"‏بیٹری لائف کو بڑھانے کے لیے، بیٹری سیور:\n گہری تھیم کو آن کرتی ہے\n پس منظر کی سرگرمی، کچھ بصری اثرات اور دیگر خصوصیات جیسے کہ \"Ok Google\" کو آف یا محدود کرتی ہے\n\n"<annotation id="url">"مزید جانیں"</annotation></string>
     <string name="battery_saver_description" msgid="7618492104632328184">"‏بیٹری لائف کو بڑھانے کے لیے، بیٹری سیور:\n گہری تھیم کو آن کرتی ہے\n پس منظر کی سرگرمی، کچھ بصری اثرات اور دیگر خصوصیات جیسے کہ \"Ok Google\" کو آف یا محدود کرتی ہے"</string>
-    <string name="data_saver_description" msgid="4995164271550590517">"ڈیٹا کے استعمال کو کم کرنے میں مدد کیلئے، ڈیٹا سیور پس منظر میں کچھ ایپس کو ڈیٹا بھیجنے یا موصول کرنے سے روکتا ہے۔ آپ جو ایپ فی الحال استعمال کر رہے ہیں وہ ڈیٹا پر رسائی کر سکتی ہے مگر ہو سکتا ہے ایسا زیادہ نہ ہو۔ اس کا مطلب مثال کے طور پر یہ ہو سکتا ہے کہ تصاویر تھپتھپانے تک ظاہر نہ ہوں۔"</string>
+    <string name="data_saver_description" msgid="4995164271550590517">"ڈیٹا کے استعمال کو کم کرنے میں مدد کیلئے، ڈیٹا سیور پس منظر میں کچھ ایپس کو ڈیٹا بھیجنے یا موصول کرنے سے روکتی ہے۔ آپ جو ایپ فی الحال استعمال کر رہے ہیں وہ ڈیٹا تک رسائی کر سکتی ہے مگر ہو سکتا ہے ایسا اکثر نہ ہو۔ اس کا مطلب مثال کے طور پر یہ ہو سکتا ہے کہ تصاویر تھپتھپانے تک ظاہر نہ ہوں۔"</string>
     <string name="data_saver_enable_title" msgid="7080620065745260137">"ڈیٹا سیور آن کریں؟"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"آن کریں"</string>
     <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml
index a1c9faa7..e7574b1 100644
--- a/core/res/res/values-uz/strings.xml
+++ b/core/res/res/values-uz/strings.xml
@@ -1457,6 +1457,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"<xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>) tomonidan so‘raldi"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"Ha"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"Yo‘q"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"Joylashuv axborotingizga ruxsat berildi"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"Qurilmangiz ishlab chiqaruvchisi oxirgi favqulodda holat seansi davomida joylashuvingiz axborotidan foydalandi"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"Aloqa operatoringiz oxirgi favqulodda holat seansi davomida joylashuvingiz axborotidan foydalandi"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"Cheklovdan oshganlarini o‘chirish"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"<xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> hisobi <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g> uchun  <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g>ta o‘chirilgan elementlar bor. Nima qilmoqchisiz?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"Elementlarni o‘chirish"</string>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index 7e24e64..3b2de1c 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -1216,7 +1216,7 @@
     <string name="dump_heap_ready_text" msgid="5849618132123045516">"Bạn hiện có thể chia sẻ tệp báo lỗi của quá trình <xliff:g id="PROC">%1$s</xliff:g>. Lưu ý: tệp báo lỗi này có thể chứa bất kỳ thông tin cá nhân nhạy cảm nào mà quá trình có quyền truy cập, có thể bao gồm cả thông tin bạn vừa nhập."</string>
     <string name="sendText" msgid="493003724401350724">"Chọn một tác vụ cho văn bản"</string>
     <string name="volume_ringtone" msgid="134784084629229029">"Âm lượng chuông"</string>
-    <string name="volume_music" msgid="7727274216734955095">"Âm lượng phương tiện"</string>
+    <string name="volume_music" msgid="7727274216734955095">"Âm lượng nội dung nghe nhìn"</string>
     <string name="volume_music_hint_playing_through_bluetooth" msgid="2614142915948898228">"Đang phát qua Bluetooth"</string>
     <string name="volume_music_hint_silent_ringtone_selected" msgid="1514829655029062233">"Đã đặt nhạc chuông im lặng"</string>
     <string name="volume_call" msgid="7625321655265747433">"Âm lượng cuộc gọi"</string>
@@ -1227,7 +1227,7 @@
     <string name="volume_icon_description_bluetooth" msgid="7540388479345558400">"Âm lượng bluetooth"</string>
     <string name="volume_icon_description_ringer" msgid="2187800636867423459">"Âm lượng nhạc chuông"</string>
     <string name="volume_icon_description_incall" msgid="4491255105381227919">"Âm lượng cuộc gọi"</string>
-    <string name="volume_icon_description_media" msgid="4997633254078171233">"Âm lượng phương tiện"</string>
+    <string name="volume_icon_description_media" msgid="4997633254078171233">"Âm lượng nội dung nghe nhìn"</string>
     <string name="volume_icon_description_notification" msgid="579091344110747279">"Âm lượng thông báo"</string>
     <string name="ringtone_default" msgid="9118299121288174597">"Nhạc chuông mặc định"</string>
     <string name="ringtone_default_with_actual" msgid="2709686194556159773">"Mặc định (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
@@ -1457,6 +1457,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"Được yêu cầu bởi <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"Có"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"Không"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"Đã truy cập dữ liệu vị trí khi khẩn cấp"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"Nhà sản xuất thiết bị đã truy cập vào thông tin vị trí của bạn trong một phiên khẩn cấp gần đây"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"Nhà mạng đã truy cập vào thông tin vị trí của bạn trong một phiên khẩn cấp gần đây"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"Đã vượt quá giới hạn xóa"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"Có <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> mục đã xóa cho <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>, tài khoản <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>. Bạn muốn thực hiện tác vụ nào?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"Xóa mục"</string>
@@ -1646,7 +1649,7 @@
     <string name="disable_accessibility_shortcut" msgid="5806091378745232383">"Tắt phím tắt"</string>
     <string name="leave_accessibility_shortcut_on" msgid="6543362062336990814">"Sử dụng phím tắt"</string>
     <string name="color_inversion_feature_name" msgid="326050048927789012">"Đảo màu"</string>
-    <string name="color_correction_feature_name" msgid="3655077237805422597">"Sửa màu"</string>
+    <string name="color_correction_feature_name" msgid="3655077237805422597">"Chỉnh màu"</string>
     <string name="accessibility_shortcut_enabling_service" msgid="5473495203759847687">"Bạn đã giữ các phím âm lượng. <xliff:g id="SERVICE_NAME">%1$s</xliff:g> đã bật."</string>
     <string name="accessibility_shortcut_disabling_service" msgid="8675244165062700619">"Bạn đã giữ các phím âm lượng. <xliff:g id="SERVICE_NAME">%1$s</xliff:g> đã tắt."</string>
     <string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"Nhấn và giữ đồng thời cả hai phím âm lượng trong 3 giây để sử dụng <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
@@ -1789,8 +1792,8 @@
     <string name="package_updated_device_owner" msgid="7560272363805506941">"Do quản trị viên của bạn cập nhật"</string>
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"Do quản trị viên của bạn xóa"</string>
     <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
-    <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"Để tăng thời lượng pin, Trình tiết kiệm pin:\n·Bật Giao diện tối\n·Tắt hoặc hạn chế hoạt động chạy trong nền, một số hiệu ứng hình ảnh và các tính năng khác như lệnh “Ok Google”\n\n"<annotation id="url">"Tìm hiểu thêm"</annotation></string>
-    <string name="battery_saver_description" msgid="7618492104632328184">"Để tăng thời lượng pin, Trình tiết kiệm pin:\n·Bật Giao diện tối\n·Tắt hoặc hạn chế hoạt động chạy trong nền, một số hiệu ứng hình ảnh và các tính năng khác như lệnh “Ok Google”"</string>
+    <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"Để tăng thời lượng pin, Trình tiết kiệm pin sẽ:\n·Bật Giao diện tối\n·Tắt hoặc hạn chế hoạt động chạy trong nền, một số hiệu ứng hình ảnh và các tính năng khác như lệnh “Ok Google”\n\n"<annotation id="url">"Tìm hiểu thêm"</annotation></string>
+    <string name="battery_saver_description" msgid="7618492104632328184">"Để tăng thời lượng pin, Trình tiết kiệm pin sẽ:\n·Bật giao diện tối\n·Tắt hoặc hạn chế hoạt động chạy trong nền, một số hiệu ứng hình ảnh và các tính năng khác như lệnh “Ok Google”"</string>
     <string name="data_saver_description" msgid="4995164271550590517">"Để giúp giảm mức sử dụng dữ liệu, Trình tiết kiệm dữ liệu sẽ chặn một số ứng dụng gửi hoặc nhận dữ liệu trong nền. Ứng dụng mà bạn hiện sử dụng có thể dùng dữ liệu nhưng tần suất sẽ giảm. Ví dụ: hình ảnh sẽ không hiển thị cho đến khi bạn nhấn vào hình ảnh đó."</string>
     <string name="data_saver_enable_title" msgid="7080620065745260137">"Bật Trình tiết kiệm dữ liệu?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Bật"</string>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index 18eb7d9..dd88759 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -192,7 +192,7 @@
     <string name="network_logging_notification_title" msgid="554983187553845004">"设备为受管理设备"</string>
     <string name="network_logging_notification_text" msgid="1327373071132562512">"贵单位会管理该设备,且可能会监控网络流量。点按即可了解详情。"</string>
     <string name="location_changed_notification_title" msgid="3620158742816699316">"应用可以访问您的位置信息"</string>
-    <string name="location_changed_notification_text" msgid="7158423339982706912">"与您的 IT 管理员联系即可了解详情"</string>
+    <string name="location_changed_notification_text" msgid="7158423339982706912">"详情请与您的 IT 管理员联系"</string>
     <string name="country_detector" msgid="7023275114706088854">"国家/地区检测器"</string>
     <string name="location_service" msgid="2439187616018455546">"位置信息服务"</string>
     <string name="sensor_notification_service" msgid="7474531979178682676">"传感器通知服务"</string>
@@ -844,7 +844,7 @@
     <string name="lockscreen_missing_sim_instructions_long" msgid="3664999892038416334">"SIM卡缺失或无法读取。请插入SIM卡。"</string>
     <string name="lockscreen_permanent_disabled_sim_message_short" msgid="3812893366715730539">"SIM卡无法使用。"</string>
     <string name="lockscreen_permanent_disabled_sim_instructions" msgid="4358929052509450807">"您的SIM卡已永久停用。\n请与您的无线服务提供商联系,以便重新获取一张SIM卡。"</string>
-    <string name="lockscreen_transport_prev_description" msgid="2879469521751181478">"上一曲"</string>
+    <string name="lockscreen_transport_prev_description" msgid="2879469521751181478">"上一首"</string>
     <string name="lockscreen_transport_next_description" msgid="2931509904881099919">"下一曲"</string>
     <string name="lockscreen_transport_pause_description" msgid="6705284702135372494">"暂停"</string>
     <string name="lockscreen_transport_play_description" msgid="106868788691652733">"播放"</string>
@@ -1457,6 +1457,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"请求人:<xliff:g id="NAME">%1$s</xliff:g>(<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"是"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"否"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"外部实体获取了您的紧急位置信息"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"最近发生紧急情况时,您的设备制造商获取了您的位置信息"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"最近发生紧急情况时,您的运营商获取了您的位置信息"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"超出删除限制"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"帐号 <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> 在进行“<xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>”同步时删除了 <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> 项内容。您要如何处理这些删除的内容?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"删除这些内容"</string>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index e6d5395..4d790c46 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -1457,6 +1457,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"要求者:<xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"是"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"否"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"曾存取緊急位置"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"您的裝置製造商曾在最近的緊急情況中存取您的位置"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"您的流動網絡供應商曾在最近的緊急情況中存取您的位置"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"已超過刪除上限"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"帳戶 <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> 的 <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g> 操作會刪除 <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> 項。您要如何處理呢?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"刪除這些項目"</string>
@@ -1558,7 +1561,7 @@
     <string name="wireless_display_route_description" msgid="8297563323032966831">"無線螢幕分享"</string>
     <string name="media_route_button_content_description" msgid="2299223698196869956">"投放"</string>
     <string name="media_route_chooser_title" msgid="6646594924991269208">"連接裝置"</string>
-    <string name="media_route_chooser_title_for_remote_display" msgid="3105906508794326446">"螢幕投放到裝置"</string>
+    <string name="media_route_chooser_title_for_remote_display" msgid="3105906508794326446">"投放螢幕到裝置"</string>
     <string name="media_route_chooser_searching" msgid="6119673534251329535">"正在搜尋裝置…"</string>
     <string name="media_route_chooser_extended_settings" msgid="2506352159381327741">"設定"</string>
     <string name="media_route_controller_disconnect" msgid="7362617572732576959">"中斷連線"</string>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index 59b5cdc..e18b51e 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -798,7 +798,7 @@
     <string name="relationTypeAssistant" msgid="4057605157116589315">"助理"</string>
     <string name="relationTypeBrother" msgid="7141662427379247820">"兄弟"</string>
     <string name="relationTypeChild" msgid="9076258911292693601">"子女"</string>
-    <string name="relationTypeDomesticPartner" msgid="7825306887697559238">"同居人"</string>
+    <string name="relationTypeDomesticPartner" msgid="7825306887697559238">"同居伴侶"</string>
     <string name="relationTypeFather" msgid="3856225062864790596">"父親"</string>
     <string name="relationTypeFriend" msgid="3192092625893980574">"好友"</string>
     <string name="relationTypeManager" msgid="2272860813153171857">"經理"</string>
@@ -1142,7 +1142,7 @@
     <string name="whichSendToApplication" msgid="77101541959464018">"透過以下應用程式傳送:"</string>
     <string name="whichSendToApplicationNamed" msgid="3385686512014670003">"透過「%1$s」傳送"</string>
     <string name="whichSendToApplicationLabel" msgid="3543240188816513303">"傳送"</string>
-    <string name="whichHomeApplication" msgid="8276350727038396616">"選取主螢幕應用程式"</string>
+    <string name="whichHomeApplication" msgid="8276350727038396616">"選取主畫面應用程式"</string>
     <string name="whichHomeApplicationNamed" msgid="5855990024847433794">"使用「%1$s」做為主螢幕"</string>
     <string name="whichHomeApplicationLabel" msgid="8907334282202933959">"擷取圖片"</string>
     <string name="whichImageCaptureApplication" msgid="2737413019463215284">"使用以下應用程式擷取圖片:"</string>
@@ -1457,6 +1457,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"要求者:<xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"是"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"否"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"外部實體存取了你的緊急位置資訊"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"你的裝置製造商在最近的緊急工作階段期間存取了你的位置資訊"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"你的電信業者在最近的緊急工作階段期間存取了你的位置資訊"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"已超過刪除上限"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"帳戶 <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> 的<xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>會刪除 <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> 個項目。你要如何處理?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"刪除這些項目"</string>
@@ -1789,9 +1792,9 @@
     <string name="package_updated_device_owner" msgid="7560272363805506941">"已由你的管理員更新"</string>
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"已由你的管理員刪除"</string>
     <string name="confirm_battery_saver" msgid="5247976246208245754">"確定"</string>
-    <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"為了延長電池續航力,節約耗電量功能會執行以下動作:\n開啟深色主題\n關閉或限制背景活動、部分視覺效果和其他功能,例如「Hey Google」\n\n"<annotation id="url">"瞭解詳情"</annotation></string>
-    <string name="battery_saver_description" msgid="7618492104632328184">"為了延長電池續航力,節約耗電量功能會執行以下動作:\n開啟深色主題\n關閉或限制背景活動、部分視覺效果和其他功能,例如「Hey Google」"</string>
-    <string name="data_saver_description" msgid="4995164271550590517">"「數據節省模式」可防止部分應用程式在背景收發資料,以節省數據用量。你目前使用的某個應用程式可以存取資料,但存取頻率可能不如平時高。舉例來說,圖片可能不會自動顯示,在你輕觸後才會顯示。"</string>
+    <string name="battery_saver_description_with_learn_more" msgid="1817385558636532621">"為了延長電池續航力,節約耗電量功能會執行以下動作:\n開啟深色主題\n關閉或限制背景活動、部分視覺效果和其他功能,例如「Hey Google」啟動字詞\n\n"<annotation id="url">"瞭解詳情"</annotation></string>
+    <string name="battery_saver_description" msgid="7618492104632328184">"為了延長電池續航力,節約耗電量功能會執行以下動作:\n· 開啟深色主題\n· 關閉或限制背景活動、部分視覺效果和其他功能,例如「Hey Google」啟動字詞"</string>
+    <string name="data_saver_description" msgid="4995164271550590517">"「數據節省模式」可防止部分應用程式在背景收發資料,以節省數據用量。你目前使用的應用程式可以存取資料,但存取頻率可能不如平時高。舉例來說,圖片可能不會自動顯示,在你輕觸後才會顯示。"</string>
     <string name="data_saver_enable_title" msgid="7080620065745260137">"要開啟數據節省模式嗎?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"開啟"</string>
     <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index cd5cca2..a9af563 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -1457,6 +1457,9 @@
     <string name="gpsNotifMessage" msgid="7346649122793758032">"Icelwe ngu-:<xliff:g id="NAME">%1$s</xliff:g><xliff:g id="SERVICE">%2$s</xliff:g>"</string>
     <string name="gpsVerifYes" msgid="3719843080744112940">"Yebo"</string>
     <string name="gpsVerifNo" msgid="1671201856091564741">"Cha"</string>
+    <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"Indawo yesimo esiphuthumayo ifinyelelwe"</string>
+    <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"Umkhiqizi wedivayisi yakho ufinyelele indawo yakho phakathi nesikhathi sakamuva sesimo esiphuthumayo"</string>
+    <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"Inkampani yenethiwekhi yakho ifinyelele indawo yakho phakathi nesikhathi sakamuva sesimo esiphuthumayo"</string>
     <string name="sync_too_many_deletes" msgid="6999440774578705300">"Umkhawulo wokususa ufinyelelwe"</string>
     <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"Kunezinto ezingu <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> ezisusiwe <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>, e-akhawuntini <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>. Ingabe ufuna ukwenzani?"</string>
     <string name="sync_really_delete" msgid="5657871730315579051">"Susa izintwana."</string>
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index 4065a6c..a8d1605 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -2527,6 +2527,21 @@
             <flag name="noExcludeDescendants" value="0x8" />
         </attr>
 
+        <!-- Hints the Android System whether the this View should be considered a scroll capture target. -->
+        <attr name="scrollCaptureHint">
+            <!-- Let the Android System  determine if the view can be a scroll capture target. -->
+            <flag name="auto" value="0" />
+            <!-- Hint the Android System that this view is a likely target. If capable, it will
+                 be ranked above other views without this flag. -->
+            <flag name="include" value="0x1" />
+            <!-- Hint the Android System that this view should never be considered a scroll capture
+                 target. -->
+            <flag name="exclude" value="0x2" />
+            <!-- Hint the Android System that this view's children should not be examined and should
+                 be excluded as a scroll capture target. -->
+            <flag name="excludeDescendants" value="0x4" />
+        </attr>
+
         <!-- Boolean that controls whether a view can take focus while in touch mode.
              If this is true for a view, that view can gain focus when clicked on, and can keep
              focus if another view is clicked on that doesn't have this attribute set to true. -->
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 340dd4d..ab79d2d 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -246,7 +246,7 @@
          correctly use them when installed on your device.  Otherwise, keep this disabled
          so that applications can still use their own mechanisms. -->
     <bool name="config_enableAutoPowerModes">false</bool>
- 
+
     <!-- Whether (if true) this is a kind of device that can be moved around (eg. phone/laptop),
          or (if false) something for which movement is either not measurable or should not count
          toward power states (eg. tv/soundbar). -->
@@ -476,10 +476,6 @@
         -->
     </string-array>
 
-    <!-- Package name for the default CellBroadcastService module [DO NOT TRANSLATE] -->
-    <string name="cellbroadcast_default_package" translatable="false">com.android.cellbroadcastservice
-    </string>
-
     <!-- If the mobile hotspot feature requires provisioning, a package name and class name
         can be provided to launch a supported application that provisions the devices.
 
@@ -1908,7 +1904,7 @@
     <!-- The name of the package that will hold the call screening role by default. -->
     <string name="config_defaultCallScreening" translatable="false"></string>
     <!-- The name of the package that will hold the system gallery role. -->
-    <string name="config_systemGallery" translatable="false">com.android.gallery</string>
+    <string name="config_systemGallery" translatable="false">com.android.gallery3d</string>
 
     <!-- The name of the package that will be allowed to change its components' label/icon. -->
     <string name="config_overrideComponentUiPackage" translatable="false"></string>
@@ -3397,7 +3393,7 @@
 
     <!-- Inactivity threshold (in milliseconds) used in JobScheduler. JobScheduler will consider
          the device to be "idle" after being inactive for this long. -->
-    <integer name="config_jobSchedulerInactivityIdleThreshold">4260000</integer>
+    <integer name="config_jobSchedulerInactivityIdleThreshold">1860000</integer>
     <!-- The alarm window (in milliseconds) that JobScheduler uses to enter the idle state -->
     <integer name="config_jobSchedulerIdleWindowSlop">300000</integer>
 
@@ -3447,8 +3443,9 @@
          TODO: move to input HAL once ready. -->
     <string name="config_doubleTouchGestureEnableFile"></string>
 
-    <!-- Package of the unbundled tv remote service which can connect to tv
-         remote provider -->
+    <!-- Comma-separated list of unbundled packages which can connect to the
+         tv remote provider. The tv remote service is an example of such a
+         service. -->
     <string name="config_tvRemoteServicePackage" translatable="false"></string>
 
     <!-- True if the device supports persisting security logs across reboots.
@@ -3495,10 +3492,9 @@
 
     <!-- Do not translate. Mcc codes whose existence trigger the presence of emergency
          affordances-->
-    <integer-array name="config_emergency_mcc_codes" translatable="false">
-        <item>404</item>
-        <item>405</item>
-    </integer-array>
+    <string-array name="config_emergency_iso_country_codes" translatable="false">
+        <item>in</item>
+    </string-array>
 
     <!-- Package name for the device provisioning package. -->
     <string name="config_deviceProvisioningPackage"></string>
@@ -3574,11 +3570,6 @@
     <!-- Flag indicates that whether non-system apps can be installed on internal storage. -->
     <bool name="config_allow3rdPartyAppOnInternal">true</bool>
 
-    <!-- Package names of the default cell broadcast receivers -->
-    <string-array name="config_defaultCellBroadcastReceiverPkgs" translatable="false">
-        <item>com.android.cellbroadcastreceiver</item>
-    </string-array>
-
     <!-- Specifies the path that is used by AdaptiveIconDrawable class to crop launcher icons. -->
     <string name="config_icon_mask" translatable="false">"M50,0L92,0C96.42,0 100,4.58 100 8L100,92C100, 96.42 96.42 100 92 100L8 100C4.58, 100 0 96.42 0 92L0 8 C 0 4.42 4.42 0 8 0L50 0Z"</string>
 
diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml
index 7edb86b..e4aef86 100644
--- a/core/res/res/values/dimens.xml
+++ b/core/res/res/values/dimens.xml
@@ -820,7 +820,9 @@
     <dimen name="resolver_empty_state_height">212dp</dimen>
     <dimen name="resolver_empty_state_height_with_tabs">268dp</dimen>
     <dimen name="resolver_max_collapsed_height">192dp</dimen>
-    <dimen name="resolver_max_collapsed_height_with_tabs">248dp</dimen>
+    <dimen name="resolver_max_collapsed_height_with_tabs">268dp</dimen>
+    <dimen name="resolver_max_collapsed_height_with_default">144dp</dimen>
+    <dimen name="resolver_max_collapsed_height_with_default_with_tabs">300dp</dimen>
     <dimen name="resolver_tab_text_size">14sp</dimen>
 
     <dimen name="chooser_action_button_icon_size">18dp</dimen>
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index 67d20da..fb887c3 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -3020,6 +3020,8 @@
       <public name="preserveLegacyExternalStorage" />
       <public name="mimeGroup" />
       <public name="gwpAsanMode" />
+      <!-- @hide -->
+      <public name="scrollCaptureHint" />
     </public-group>
 
     <public-group type="drawable" first-id="0x010800b5">
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index c9c498e..0e40c98 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -3897,6 +3897,19 @@
          information. -->
     <string name="gpsVerifNo">No</string>
 
+    <!-- Notification title shown to user to inform them their device location was accessed by
+         an external entity during an emergency (usually an emergency phone call).
+         [CHAR LIMIT=40] -->
+    <string name="gnss_nfw_notification_title">Emergency location accessed</string>
+    <!-- Notification message shown to user to inform them their device location was accessed by
+         something OEM related during an emergency (usually an emergency phone call).
+         [CHAR LIMIT=NONE] -->
+    <string name="gnss_nfw_notification_message_oem">Your device manufacturer accessed your location during a recent emergency session</string>
+    <!-- Notification message shown to user to inform them their device location was accessed by
+         something carrier related during an emergency (usually an emergency phone call).
+         [CHAR LIMIT=NONE] -->
+    <string name="gnss_nfw_notification_message_carrier">Your carrier accessed your location during a recent emergency session</string>
+
     <!-- Error message when the sync tried to delete too many things -->
     <string name="sync_too_many_deletes">Delete limit exceeded</string>
     <!-- Dialog message for when there are too many deletes that would take place and we want user confirmation -->
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index ef1e8b7..5f93506d 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -681,7 +681,6 @@
   <java-symbol type="string" name="not_checked" />
   <java-symbol type="array" name="config_ethernet_interfaces" />
   <java-symbol type="array" name="config_wakeonlan_supported_interfaces" />
-  <java-symbol type="string" name="cellbroadcast_default_package" />
   <java-symbol type="string" name="config_forceVoiceInteractionServicePackage" />
   <java-symbol type="string" name="config_mms_user_agent" />
   <java-symbol type="string" name="config_mms_user_agent_profile_url" />
@@ -740,6 +739,9 @@
   <java-symbol type="string" name="gpsNotifTitle" />
   <java-symbol type="string" name="gpsVerifNo" />
   <java-symbol type="string" name="gpsVerifYes" />
+  <java-symbol type="string" name="gnss_nfw_notification_title" />
+  <java-symbol type="string" name="gnss_nfw_notification_message_carrier" />
+  <java-symbol type="string" name="gnss_nfw_notification_message_oem" />
   <java-symbol type="string" name="gsm_alphabet_default_charset" />
   <java-symbol type="string" name="httpError" />
   <java-symbol type="string" name="httpErrorAuth" />
@@ -1468,6 +1470,7 @@
   <java-symbol type="layout" name="select_dialog" />
   <java-symbol type="layout" name="simple_dropdown_hint" />
   <java-symbol type="layout" name="status_bar_latest_event_content" />
+  <java-symbol type="layout" name="system_user_home" />
   <java-symbol type="layout" name="text_edit_action_popup_text" />
   <java-symbol type="layout" name="text_drag_thumbnail" />
   <java-symbol type="layout" name="typing_filter" />
@@ -3081,7 +3084,7 @@
   <java-symbol type="string" name="global_action_emergency" />
   <java-symbol type="string" name="config_emergency_call_number" />
   <java-symbol type="string" name="config_emergency_dialer_package" />
-  <java-symbol type="array" name="config_emergency_mcc_codes" />
+  <java-symbol type="array" name="config_emergency_iso_country_codes" />
 
   <java-symbol type="string" name="config_dozeDoubleTapSensorType" />
   <java-symbol type="string" name="config_dozeTapSensorType" />
@@ -3171,7 +3174,6 @@
   <java-symbol type="drawable" name="lockscreen_selected" />
 
   <java-symbol type="string" name="notification_header_divider_symbol_with_spaces" />
-  <java-symbol type="array" name="config_defaultCellBroadcastReceiverPkgs" />
 
   <java-symbol type="color" name="notification_primary_text_color_light" />
   <java-symbol type="color" name="notification_primary_text_color_dark" />
@@ -3232,12 +3234,13 @@
   <java-symbol type="string" name="accessibility_enable_service_title" />
   <java-symbol type="string" name="accessibility_enable_service_encryption_warning" />
 
+  <java-symbol type="layout" name="accessibility_shortcut_chooser_item" />
+  <java-symbol type="id" name="accessibility_shortcut_target_checkbox" />
+  <java-symbol type="id" name="accessibility_shortcut_target_icon" />
+  <java-symbol type="id" name="accessibility_shortcut_target_label" />
+  <java-symbol type="id" name="accessibility_shortcut_target_switch_item" />
+
   <!-- Accessibility Button -->
-  <java-symbol type="layout" name="accessibility_button_chooser_item" />
-  <java-symbol type="id" name="accessibility_button_target_checkbox" />
-  <java-symbol type="id" name="accessibility_button_target_icon" />
-  <java-symbol type="id" name="accessibility_button_target_label" />
-  <java-symbol type="id" name="accessibility_button_target_switch_item" />
   <java-symbol type="string" name="accessibility_magnification_chooser_text" />
   <java-symbol type="string" name="edit_accessibility_shortcut_menu_button" />
   <java-symbol type="string" name="done_accessibility_shortcut_menu_button" />
@@ -3495,6 +3498,7 @@
   <java-symbol type="id" name="clip_children_set_tag" />
   <java-symbol type="id" name="clip_to_padding_tag" />
   <java-symbol type="id" name="clip_children_tag" />
+  <java-symbol type="id" name="bubble_button" />
   <java-symbol type="dimen" name="messaging_avatar_size" />
   <java-symbol type="dimen" name="messaging_group_sending_progress_size" />
   <java-symbol type="dimen" name="messaging_image_rounding" />
@@ -3916,6 +3920,8 @@
   <java-symbol type="id" name="resolver_empty_state_button" />
   <java-symbol type="id" name="resolver_empty_state_progress" />
   <java-symbol type="id" name="resolver_tab_divider" />
+  <java-symbol type="id" name="resolver_button_bar_divider" />
+  <java-symbol type="id" name="resolver_empty_state_container" />
   <java-symbol type="string" name="resolver_cant_share_with_work_apps" />
   <java-symbol type="string" name="resolver_cant_share_with_work_apps_explanation" />
   <java-symbol type="string" name="resolver_cant_share_with_personal_apps" />
@@ -3936,6 +3942,7 @@
   <java-symbol type="dimen" name="resolver_empty_state_height" />
   <java-symbol type="dimen" name="resolver_empty_state_height_with_tabs" />
   <java-symbol type="dimen" name="resolver_max_collapsed_height_with_tabs" />
+  <java-symbol type="dimen" name="resolver_max_collapsed_height_with_default_with_tabs" />
   <java-symbol type="bool" name="resolver_landscape_phone" />
   <java-symbol type="dimen" name="resolver_tab_text_size" />
 
diff --git a/core/res/res/xml/default_zen_mode_config.xml b/core/res/res/xml/default_zen_mode_config.xml
index 9110661..873b9eb 100644
--- a/core/res/res/xml/default_zen_mode_config.xml
+++ b/core/res/res/xml/default_zen_mode_config.xml
@@ -20,8 +20,8 @@
 <!-- Default configuration for zen mode.  See android.service.notification.ZenModeConfig. -->
 <zen version="9">
     <allow alarms="true" media="true" system="false" calls="true" callsFrom="2" messages="false"
-            reminders="false" events="false" repeatCallers="true" conversations="true"
-            conversationsFrom="2"/>
+            reminders="false" events="false" repeatCallers="true" convos="false"
+            convosFrom="3"/>
     <automatic ruleId="EVENTS_DEFAULT_RULE" enabled="false" snoozing="false" name="Event" zen="1"
                component="android/com.android.server.notification.EventConditionProvider"
                conditionId="condition://android/event?userId=-10000&amp;calendar=&amp;reply=1"/>
diff --git a/core/tests/benchmarks/src/android/os/ParcelStringBenchmark.java b/core/tests/benchmarks/src/android/os/ParcelStringBenchmark.java
new file mode 100644
index 0000000..daa90c2
--- /dev/null
+++ b/core/tests/benchmarks/src/android/os/ParcelStringBenchmark.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.os;
+
+import com.google.caliper.AfterExperiment;
+import com.google.caliper.BeforeExperiment;
+import com.google.caliper.Param;
+
+public class ParcelStringBenchmark {
+
+    @Param({"com.example.typical_package_name", "從不喜歡孤單一個 - 蘇永康/吳雨霏"})
+    String mValue;
+
+    private Parcel mParcel;
+
+    @BeforeExperiment
+    protected void setUp() {
+        mParcel = Parcel.obtain();
+    }
+
+    @AfterExperiment
+    protected void tearDown() {
+        mParcel.recycle();
+        mParcel = null;
+    }
+
+    public void timeWriteString8(int reps) {
+        for (int i = 0; i < reps; i++) {
+            mParcel.setDataPosition(0);
+            mParcel.writeString8(mValue);
+        }
+    }
+
+    public void timeReadString8(int reps) {
+        mParcel.writeString8(mValue);
+
+        for (int i = 0; i < reps; i++) {
+            mParcel.setDataPosition(0);
+            mParcel.readString8();
+        }
+    }
+
+    public void timeWriteString16(int reps) {
+        for (int i = 0; i < reps; i++) {
+            mParcel.setDataPosition(0);
+            mParcel.writeString16(mValue);
+        }
+    }
+
+    public void timeReadString16(int reps) {
+        mParcel.writeString16(mValue);
+
+        for (int i = 0; i < reps; i++) {
+            mParcel.setDataPosition(0);
+            mParcel.readString16();
+        }
+    }
+}
diff --git a/core/tests/coretests/AndroidManifest.xml b/core/tests/coretests/AndroidManifest.xml
index 45490ae..cc9c914 100644
--- a/core/tests/coretests/AndroidManifest.xml
+++ b/core/tests/coretests/AndroidManifest.xml
@@ -142,6 +142,9 @@
     <!-- WindowMetricsTest permissions -->
     <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
 
+    <!-- Allow use of PendingIntent.getIntent() -->
+    <uses-permission android:name="android.permission.GET_INTENT_SENDER_INTENT" />
+
     <application android:theme="@style/Theme" android:supportsRtl="true">
         <uses-library android:name="android.test.runner" />
         <uses-library android:name="org.apache.http.legacy" android:required="false" />
diff --git a/core/tests/coretests/res/raw/install_app1_cert5 b/core/tests/coretests/res/raw/install_app1_cert5
new file mode 100644
index 0000000..138b611
--- /dev/null
+++ b/core/tests/coretests/res/raw/install_app1_cert5
Binary files differ
diff --git a/core/tests/coretests/res/raw/install_app1_cert5_rotated_cert6 b/core/tests/coretests/res/raw/install_app1_cert5_rotated_cert6
new file mode 100644
index 0000000..2da2436
--- /dev/null
+++ b/core/tests/coretests/res/raw/install_app1_cert5_rotated_cert6
Binary files differ
diff --git a/core/tests/coretests/res/raw/install_app1_cert6 b/core/tests/coretests/res/raw/install_app1_cert6
new file mode 100644
index 0000000..256e03a
--- /dev/null
+++ b/core/tests/coretests/res/raw/install_app1_cert6
Binary files differ
diff --git a/core/tests/coretests/res/raw/install_app2_cert5_rotated_cert6 b/core/tests/coretests/res/raw/install_app2_cert5_rotated_cert6
new file mode 100644
index 0000000..30bb647
--- /dev/null
+++ b/core/tests/coretests/res/raw/install_app2_cert5_rotated_cert6
Binary files differ
diff --git a/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java b/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java
index c328d72..ddb39e7 100644
--- a/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java
+++ b/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java
@@ -40,7 +40,10 @@
 import android.app.servertransaction.StopActivityItem;
 import android.content.Intent;
 import android.content.res.Configuration;
+import android.content.res.Resources;
+import android.graphics.Rect;
 import android.os.IBinder;
+import android.util.DisplayMetrics;
 import android.util.MergedConfiguration;
 import android.view.Display;
 import android.view.View;
@@ -307,6 +310,58 @@
     }
 
     @Test
+    public void testHandleConfigurationChangedDoesntOverrideActivityConfig() {
+        final TestActivity activity = mActivityTestRule.launchActivity(new Intent());
+
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> {
+            final Configuration oldActivityConfig =
+                    new Configuration(activity.getResources().getConfiguration());
+            final DisplayMetrics oldActivityMetrics = new DisplayMetrics();
+            activity.getDisplay().getMetrics(oldActivityMetrics);
+            final Resources oldAppResources = activity.getApplication().getResources();
+            final Configuration oldAppConfig =
+                    new Configuration(oldAppResources.getConfiguration());
+            final DisplayMetrics oldApplicationMetrics = new DisplayMetrics();
+            oldApplicationMetrics.setTo(oldAppResources.getDisplayMetrics());
+            assertEquals("Process config must match the top activity config by default",
+                    0, oldActivityConfig.diffPublicOnly(oldAppConfig));
+            assertEquals("Process config must match the top activity config by default",
+                    oldActivityMetrics, oldApplicationMetrics);
+
+            // Update the application configuration separately from activity config
+            final Configuration newAppConfig = new Configuration(oldAppConfig);
+            newAppConfig.densityDpi += 100;
+            newAppConfig.screenHeightDp += 100;
+            final Rect newBounds = new Rect(newAppConfig.windowConfiguration.getAppBounds());
+            newBounds.bottom += 100;
+            newAppConfig.windowConfiguration.setAppBounds(newBounds);
+            newAppConfig.windowConfiguration.setBounds(newBounds);
+            newAppConfig.seq++;
+
+            final ActivityThread activityThread = activity.getActivityThread();
+            activityThread.handleConfigurationChanged(newAppConfig);
+
+            // Verify that application config update was applied, but didn't change activity config.
+            assertEquals("Activity config must not change if the process config changes",
+                    oldActivityConfig, activity.getResources().getConfiguration());
+
+            final DisplayMetrics newActivityMetrics = new DisplayMetrics();
+            activity.getDisplay().getMetrics(newActivityMetrics);
+            assertEquals("Activity display size must not change if the process config changes",
+                    oldActivityMetrics, newActivityMetrics);
+            final Resources newAppResources = activity.getApplication().getResources();
+            assertEquals("Application config must be updated",
+                    newAppConfig, newAppResources.getConfiguration());
+            final DisplayMetrics newApplicationMetrics = new DisplayMetrics();
+            newApplicationMetrics.setTo(newAppResources.getDisplayMetrics());
+            assertNotEquals("Application display size must be updated after config update",
+                    oldApplicationMetrics, newApplicationMetrics);
+            assertNotEquals("Application display size must be updated after config update",
+                    newActivityMetrics, newApplicationMetrics);
+        });
+    }
+
+    @Test
     public void testResumeAfterNewIntent() {
         final Activity activity = mActivityTestRule.launchActivity(new Intent());
         final ActivityThread activityThread = activity.getActivityThread();
@@ -406,7 +461,10 @@
 
     private static ClientTransaction newRelaunchResumeTransaction(Activity activity) {
         final ClientTransactionItem callbackItem = ActivityRelaunchItem.obtain(null,
-                null, 0, new MergedConfiguration(), false /* preserveWindow */);
+                null, 0, new MergedConfiguration(
+                        activity.getApplication().getResources().getConfiguration(),
+                        new Configuration()),
+                false /* preserveWindow */);
         final ResumeActivityItem resumeStateRequest =
                 ResumeActivityItem.obtain(true /* isForward */);
 
diff --git a/core/tests/coretests/src/android/content/pm/PackageManagerTests.java b/core/tests/coretests/src/android/content/pm/PackageManagerTests.java
index ed2436a..79cb1f9 100644
--- a/core/tests/coretests/src/android/content/pm/PackageManagerTests.java
+++ b/core/tests/coretests/src/android/content/pm/PackageManagerTests.java
@@ -1830,27 +1830,35 @@
      * The following series of tests are related to upgrading apps with
      * different certificates.
      */
-    private int APP1_UNSIGNED = R.raw.install_app1_unsigned;
+    private static final int APP1_UNSIGNED = R.raw.install_app1_unsigned;
 
-    private int APP1_CERT1 = R.raw.install_app1_cert1;
+    private static final int APP1_CERT1 = R.raw.install_app1_cert1;
 
-    private int APP1_CERT2 = R.raw.install_app1_cert2;
+    private static final int APP1_CERT2 = R.raw.install_app1_cert2;
 
-    private int APP1_CERT1_CERT2 = R.raw.install_app1_cert1_cert2;
+    private static final int APP1_CERT1_CERT2 = R.raw.install_app1_cert1_cert2;
 
-    private int APP1_CERT3_CERT4 = R.raw.install_app1_cert3_cert4;
+    private static final int APP1_CERT3_CERT4 = R.raw.install_app1_cert3_cert4;
 
-    private int APP1_CERT3 = R.raw.install_app1_cert3;
+    private static final int APP1_CERT3 = R.raw.install_app1_cert3;
 
-    private int APP2_UNSIGNED = R.raw.install_app2_unsigned;
+    private static final int APP1_CERT5 = R.raw.install_app1_cert5;
 
-    private int APP2_CERT1 = R.raw.install_app2_cert1;
+    private static final int APP1_CERT5_ROTATED_CERT6 = R.raw.install_app1_cert5_rotated_cert6;
 
-    private int APP2_CERT2 = R.raw.install_app2_cert2;
+    private static final int APP1_CERT6 = R.raw.install_app1_cert6;
 
-    private int APP2_CERT1_CERT2 = R.raw.install_app2_cert1_cert2;
+    private static final int APP2_UNSIGNED = R.raw.install_app2_unsigned;
 
-    private int APP2_CERT3 = R.raw.install_app2_cert3;
+    private static final int APP2_CERT1 = R.raw.install_app2_cert1;
+
+    private static final int APP2_CERT2 = R.raw.install_app2_cert2;
+
+    private static final int APP2_CERT1_CERT2 = R.raw.install_app2_cert1_cert2;
+
+    private static final int APP2_CERT3 = R.raw.install_app2_cert3;
+
+    private static final int APP2_CERT5_ROTATED_CERT6 = R.raw.install_app2_cert5_rotated_cert6;
 
     private InstallParams replaceCerts(int apk1, int apk2, boolean cleanUp, boolean fail,
             int retCode) throws Exception {
@@ -2473,6 +2481,26 @@
     }
 
     @LargeTest
+    public void testCheckSignaturesRotatedAgainstOriginal() throws Exception {
+        // checkSignatures should be backwards compatible with pre-rotation behavior; this test
+        // verifies that an app signed with a rotated key results in a signature match with an app
+        // signed with the original key in the lineage.
+        int apk1 = APP1_CERT5;
+        int apk2 = APP2_CERT5_ROTATED_CERT6;
+        checkSignatures(apk1, apk2, PackageManager.SIGNATURE_MATCH);
+    }
+
+    @LargeTest
+    public void testCheckSignaturesRotatedAgainstRotated() throws Exception {
+        // checkSignatures should be successful when both apps have been signed with the same
+        // rotated key since the initial signature comparison between the two apps should
+        // return a match.
+        int apk1 = APP1_CERT5_ROTATED_CERT6;
+        int apk2 = APP2_CERT5_ROTATED_CERT6;
+        checkSignatures(apk1, apk2, PackageManager.SIGNATURE_MATCH);
+    }
+
+    @LargeTest
     public void testInstallNoCertificates() throws Exception {
         int apk1 = APP1_UNSIGNED;
         String apk1Name = "install1.apk";
diff --git a/core/tests/coretests/src/android/debug/AdbNotificationsTest.java b/core/tests/coretests/src/android/debug/AdbNotificationsTest.java
new file mode 100644
index 0000000..6c187ea
--- /dev/null
+++ b/core/tests/coretests/src/android/debug/AdbNotificationsTest.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.debug;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+import android.app.Notification;
+import android.content.Context;
+import android.platform.test.annotations.Presubmit;
+import android.text.TextUtils;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+@Presubmit
+public final class AdbNotificationsTest {
+    private Context mContext;
+
+    @Before
+    public void setUp() throws Exception {
+        mContext = InstrumentationRegistry.getContext();
+    }
+
+    @Test
+    public void testCreateNotification_UsbTransportType() throws Exception {
+        CharSequence title = mContext.getResources().getText(
+                com.android.internal.R.string.adb_active_notification_title);
+        CharSequence message = mContext.getResources().getText(
+                com.android.internal.R.string.adb_active_notification_message);
+
+        Notification notification = AdbNotifications.createNotification(mContext,
+                AdbTransportType.USB);
+
+        // Verify that the adb notification for usb connections has the correct text.
+        assertEquals(title, notification.extras.getCharSequence(Notification.EXTRA_TITLE, ""));
+        assertEquals(message, notification.extras.getCharSequence(Notification.EXTRA_TEXT, ""));
+        // Verify the PendingIntent has an explicit intent (b/153356209).
+        assertFalse(TextUtils.isEmpty(notification.contentIntent.getIntent().getPackage()));
+    }
+
+    @Test
+    public void testCreateNotification_WifiTransportType() throws Exception {
+        CharSequence title = mContext.getResources().getText(
+                com.android.internal.R.string.adbwifi_active_notification_title);
+        CharSequence message = mContext.getResources().getText(
+                com.android.internal.R.string.adbwifi_active_notification_message);
+
+        Notification notification = AdbNotifications.createNotification(mContext,
+                AdbTransportType.WIFI);
+
+        // Verify that the adb notification for usb connections has the correct text.
+        assertEquals(title, notification.extras.getCharSequence(Notification.EXTRA_TITLE, ""));
+        assertEquals(message, notification.extras.getCharSequence(Notification.EXTRA_TEXT, ""));
+        // Verify the PendingIntent has an explicit intent (b/153356209).
+        assertFalse(TextUtils.isEmpty(notification.contentIntent.getIntent().getPackage()));
+    }
+}
diff --git a/core/tests/coretests/src/android/os/ParcelTest.java b/core/tests/coretests/src/android/os/ParcelTest.java
index 46873b9..dcb3e2f 100644
--- a/core/tests/coretests/src/android/os/ParcelTest.java
+++ b/core/tests/coretests/src/android/os/ParcelTest.java
@@ -87,4 +87,27 @@
 
         p.recycle();
     }
+
+    /**
+     * Verify that writing/reading UTF-8 and UTF-16 strings works well.
+     */
+    @Test
+    public void testStrings() {
+        final String[] strings = {
+                null, "", "abc\0def", "com.example.typical_package_name",
+                "從不喜歡孤單一個 - 蘇永康/吳雨霏", "example"
+        };
+
+        final Parcel p = Parcel.obtain();
+        for (String string : strings) {
+            p.writeString8(string);
+            p.writeString16(string);
+        }
+
+        p.setDataPosition(0);
+        for (String string : strings) {
+            assertEquals(string, p.readString8());
+            assertEquals(string, p.readString16());
+        }
+    }
 }
diff --git a/core/tests/coretests/src/android/os/VibrationEffectTest.java b/core/tests/coretests/src/android/os/VibrationEffectTest.java
index ea778fd..a354f1d 100644
--- a/core/tests/coretests/src/android/os/VibrationEffectTest.java
+++ b/core/tests/coretests/src/android/os/VibrationEffectTest.java
@@ -22,9 +22,12 @@
 import static junit.framework.Assert.assertTrue;
 import static junit.framework.Assert.fail;
 
+import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
+import android.content.ContentInterface;
+import android.content.ContentResolver;
 import android.content.Context;
 import android.content.res.Resources;
 import android.net.Uri;
@@ -37,6 +40,8 @@
 
 @RunWith(MockitoJUnitRunner.class)
 public class VibrationEffectTest {
+    private static final float SCALE_TOLERANCE = 1e-2f;
+
     private static final String RINGTONE_URI_1 = "content://test/system/ringtone_1";
     private static final String RINGTONE_URI_2 = "content://test/system/ringtone_2";
     private static final String RINGTONE_URI_3 = "content://test/system/ringtone_3";
@@ -54,6 +59,12 @@
             VibrationEffect.createOneShot(TEST_TIMING, VibrationEffect.DEFAULT_AMPLITUDE);
     private static final VibrationEffect TEST_WAVEFORM =
             VibrationEffect.createWaveform(TEST_TIMINGS, TEST_AMPLITUDES, -1);
+    private static final VibrationEffect TEST_COMPOSED =
+            VibrationEffect.startComposition()
+                    .addPrimitive(VibrationEffect.Composition.PRIMITIVE_CLICK)
+                    .addPrimitive(VibrationEffect.Composition.PRIMITIVE_CLICK, 0.5f, 10)
+                    .addPrimitive(VibrationEffect.Composition.PRIMITIVE_CLICK, 0, 100)
+                    .compose();
 
     @Test
     public void getRingtones_noPrebakedRingtones() {
@@ -123,8 +134,14 @@
 
     @Test
     public void testScaleWaveform() {
-        VibrationEffect.Waveform scaled =
-                ((VibrationEffect.Waveform) TEST_WAVEFORM).scale(1.1f, 200);
+        VibrationEffect.Waveform initial = (VibrationEffect.Waveform) TEST_WAVEFORM;
+
+        VibrationEffect.Waveform copied = initial.scale(1f, 255);
+        assertEquals(255, copied.getAmplitudes()[0]);
+        assertEquals(0, copied.getAmplitudes()[1]);
+        assertEquals(-1, copied.getAmplitudes()[2]);
+
+        VibrationEffect.Waveform scaled = initial.scale(1.1f, 200);
         assertEquals(200, scaled.getAmplitudes()[0]);
         assertEquals(0, scaled.getAmplitudes()[1]);
     }
@@ -156,6 +173,66 @@
         }
     }
 
+    @Test
+    public void testScaleComposed() {
+        VibrationEffect.Composed initial = (VibrationEffect.Composed) TEST_COMPOSED;
+
+        VibrationEffect.Composed copied = initial.scale(1, 255);
+        assertEquals(1f, copied.getPrimitiveEffects().get(0).scale);
+        assertEquals(0.5f, copied.getPrimitiveEffects().get(1).scale);
+        assertEquals(0f, copied.getPrimitiveEffects().get(2).scale);
+
+        VibrationEffect.Composed halved = initial.scale(1, 128);
+        assertEquals(0.5f, halved.getPrimitiveEffects().get(0).scale, SCALE_TOLERANCE);
+        assertEquals(0.25f, halved.getPrimitiveEffects().get(1).scale, SCALE_TOLERANCE);
+        assertEquals(0f, halved.getPrimitiveEffects().get(2).scale);
+
+        VibrationEffect.Composed scaledUp = initial.scale(0.5f, 255);
+        assertEquals(1f, scaledUp.getPrimitiveEffects().get(0).scale); // does not scale up from 1
+        assertTrue(0.5f < scaledUp.getPrimitiveEffects().get(1).scale);
+        assertEquals(0f, scaledUp.getPrimitiveEffects().get(2).scale);
+
+        VibrationEffect.Composed restored = scaledUp.scale(2, 255);
+        assertEquals(1f, restored.getPrimitiveEffects().get(0).scale, SCALE_TOLERANCE);
+        assertEquals(0.5f, restored.getPrimitiveEffects().get(1).scale, SCALE_TOLERANCE);
+        assertEquals(0f, restored.getPrimitiveEffects().get(2).scale);
+
+        VibrationEffect.Composed scaledDown = initial.scale(2, 255);
+        assertEquals(1f, scaledDown.getPrimitiveEffects().get(0).scale, SCALE_TOLERANCE);
+        assertTrue(0.5f > scaledDown.getPrimitiveEffects().get(1).scale);
+        assertEquals(0f, scaledDown.getPrimitiveEffects().get(2).scale, SCALE_TOLERANCE);
+
+        VibrationEffect.Composed changeMax = initial.scale(1f, 51);
+        assertEquals(0.2f, changeMax.getPrimitiveEffects().get(0).scale, SCALE_TOLERANCE);
+        assertEquals(0.1f, changeMax.getPrimitiveEffects().get(1).scale, SCALE_TOLERANCE);
+        assertEquals(0f, changeMax.getPrimitiveEffects().get(2).scale);
+    }
+
+    @Test
+    public void testScaleComposedFailsWhenMaxAmplitudeAboveThreshold() {
+        try {
+            ((VibrationEffect.Composed) TEST_COMPOSED).scale(1.1f, 1000);
+            fail("Max amplitude above threshold, should throw IllegalArgumentException");
+        } catch (IllegalArgumentException expected) {
+        }
+    }
+
+    @Test
+    public void testScaleAppliesSameAdjustmentsOnAllEffects() {
+        VibrationEffect.OneShot oneShot = new VibrationEffect.OneShot(TEST_TIMING, TEST_AMPLITUDE);
+        VibrationEffect.Waveform waveform = new VibrationEffect.Waveform(
+                new long[] { TEST_TIMING }, new int[]{ TEST_AMPLITUDE }, -1);
+        VibrationEffect.Composed composed =
+                (VibrationEffect.Composed) VibrationEffect.startComposition()
+                    .addPrimitive(VibrationEffect.Composition.PRIMITIVE_TICK, TEST_AMPLITUDE / 255f)
+                    .compose();
+
+        assertEquals(oneShot.scale(2f, 128).getAmplitude(),
+                waveform.scale(2f, 128).getAmplitudes()[0]);
+        assertEquals(oneShot.scale(2f, 128).getAmplitude() / 255f, // convert amplitude to scale
+                composed.scale(2f, 128).getPrimitiveEffects().get(0).scale,
+                SCALE_TOLERANCE);
+    }
 
     private Resources mockRingtoneResources() {
         return mockRingtoneResources(new String[] {
@@ -172,9 +249,22 @@
         return mockResources;
     }
 
-    private Context mockContext(Resources r) {
-        Context ctx = mock(Context.class);
-        when(ctx.getResources()).thenReturn(r);
-        return ctx;
+    private Context mockContext(Resources resources) {
+        Context context = mock(Context.class);
+        ContentInterface contentInterface = mock(ContentInterface.class);
+        ContentResolver contentResolver = ContentResolver.wrap(contentInterface);
+
+        try {
+            // ContentResolver#uncanonicalize is final, so we need to mock the ContentInterface it
+            // delegates the call to for the tests that require matching with the mocked URIs.
+            when(contentInterface.uncanonicalize(any())).then(
+                    invocation -> invocation.getArgument(0));
+            when(context.getContentResolver()).thenReturn(contentResolver);
+            when(context.getResources()).thenReturn(resources);
+        } catch (RemoteException e) {
+            throw new RuntimeException(e);
+        }
+
+        return context;
     }
 }
diff --git a/core/tests/coretests/src/android/view/ScrollCaptureClientTest.java b/core/tests/coretests/src/android/view/ScrollCaptureClientTest.java
new file mode 100644
index 0000000..e6ac2d6
--- /dev/null
+++ b/core/tests/coretests/src/android/view/ScrollCaptureClientTest.java
@@ -0,0 +1,309 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view;
+
+import static androidx.test.InstrumentationRegistry.getInstrumentation;
+import static androidx.test.InstrumentationRegistry.getTargetContext;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
+import android.graphics.Point;
+import android.graphics.Rect;
+import android.os.Handler;
+
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.mockito.stubbing.Answer;
+
+/**
+ * Tests of {@link ScrollCaptureClient}.
+ */
+@SuppressWarnings("UnnecessaryLocalVariable")
+@RunWith(AndroidJUnit4.class)
+public class ScrollCaptureClientTest {
+
+    private final Point mPositionInWindow = new Point(1, 2);
+    private final Rect mLocalVisibleRect = new Rect(2, 3, 4, 5);
+    private final Rect mScrollBounds = new Rect(3, 4, 5, 6);
+
+    private Handler mHandler;
+    private ScrollCaptureTarget mTarget1;
+
+    @Mock
+    private Surface mSurface;
+    @Mock
+    private IScrollCaptureController mClientCallbacks;
+    @Mock
+    private View mMockView1;
+    @Mock
+    private ScrollCaptureCallback mCallback1;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mHandler = new Handler(getTargetContext().getMainLooper());
+
+        when(mMockView1.getHandler()).thenReturn(mHandler);
+        when(mMockView1.getScrollCaptureHint()).thenReturn(View.SCROLL_CAPTURE_HINT_INCLUDE);
+
+        mTarget1 = new ScrollCaptureTarget(
+                mMockView1, mLocalVisibleRect, mPositionInWindow, mCallback1);
+        mTarget1.setScrollBounds(mScrollBounds);
+    }
+
+    /** Test the DelayedAction timeout helper class works as expected. */
+    @Test
+    public void testDelayedAction() {
+        Runnable action = Mockito.mock(Runnable.class);
+        ScrollCaptureClient.DelayedAction delayed =
+                new ScrollCaptureClient.DelayedAction(mHandler, 100, action);
+        try {
+            Thread.sleep(200);
+        } catch (InterruptedException ex) {
+            /* ignore */
+        }
+        getInstrumentation().waitForIdleSync();
+        assertFalse(delayed.cancel());
+        assertFalse(delayed.timeoutNow());
+        verify(action, times(1)).run();
+    }
+
+    /** Test the DelayedAction cancel() */
+    @Test
+    public void testDelayedAction_cancel() {
+        Runnable action = Mockito.mock(Runnable.class);
+        ScrollCaptureClient.DelayedAction delayed =
+                new ScrollCaptureClient.DelayedAction(mHandler, 100, action);
+        try {
+            Thread.sleep(50);
+        } catch (InterruptedException ex) {
+            /* ignore */
+        }
+        assertTrue(delayed.cancel());
+        assertFalse(delayed.timeoutNow());
+        try {
+            Thread.sleep(200);
+        } catch (InterruptedException ex) {
+            /* ignore */
+        }
+        getInstrumentation().waitForIdleSync();
+        verify(action, never()).run();
+    }
+
+    /** Test the DelayedAction timeoutNow() - for testing only */
+    @Test
+    public void testDelayedAction_timeoutNow() {
+        Runnable action = Mockito.mock(Runnable.class);
+        ScrollCaptureClient.DelayedAction delayed =
+                new ScrollCaptureClient.DelayedAction(mHandler, 100, action);
+        try {
+            Thread.sleep(50);
+        } catch (InterruptedException ex) {
+            /* ignore */
+        }
+        assertTrue(delayed.timeoutNow());
+        assertFalse(delayed.cancel());
+        getInstrumentation().waitForIdleSync();
+        verify(action, times(1)).run();
+    }
+
+    /** Test creating a client with valid info */
+    @Test
+    public void testConstruction() {
+        new ScrollCaptureClient(mTarget1, mClientCallbacks);
+    }
+
+    /** Test creating a client fails if arguments are not valid. */
+    @Test
+    public void testConstruction_requiresScrollBounds() {
+        try {
+            mTarget1.setScrollBounds(null);
+            new ScrollCaptureClient(mTarget1, mClientCallbacks);
+            fail("An exception was expected.");
+        } catch (RuntimeException ex) {
+            // Ignore, expected.
+        }
+    }
+
+    @SuppressWarnings("SameParameterValue")
+    private static Answer<Void> runRunnable(int arg) {
+        return invocation -> {
+            Runnable r = invocation.getArgument(arg);
+            r.run();
+            return null;
+        };
+    }
+
+    @SuppressWarnings("SameParameterValue")
+    private static Answer<Void> reportBufferSent(int sessionArg, long frameNum, Rect capturedArea) {
+        return invocation -> {
+            ScrollCaptureSession session = invocation.getArgument(sessionArg);
+            session.notifyBufferSent(frameNum, capturedArea);
+            return null;
+        };
+    }
+
+    /** @see ScrollCaptureClient#startCapture(Surface) */
+    @Test
+    public void testStartCapture() throws Exception {
+        final ScrollCaptureClient client = new ScrollCaptureClient(mTarget1, mClientCallbacks);
+
+        // Have the session start accepted immediately
+        doAnswer(runRunnable(1)).when(mCallback1)
+                .onScrollCaptureStart(any(ScrollCaptureSession.class), any(Runnable.class));
+        client.startCapture(mSurface);
+        getInstrumentation().waitForIdleSync();
+
+        verify(mCallback1, times(1))
+                .onScrollCaptureStart(any(ScrollCaptureSession.class), any(Runnable.class));
+        verify(mClientCallbacks, times(1)).onCaptureStarted();
+        verifyNoMoreInteractions(mClientCallbacks);
+    }
+
+    @Test
+    public void testStartCaptureTimeout() throws Exception {
+        final ScrollCaptureClient client = new ScrollCaptureClient(mTarget1, mClientCallbacks);
+        client.startCapture(mSurface);
+
+        // Force timeout to fire
+        client.getTimeoutAction().timeoutNow();
+
+        getInstrumentation().waitForIdleSync();
+        verify(mCallback1, times(1)).onScrollCaptureEnd(any(Runnable.class));
+    }
+
+    private void startClient(ScrollCaptureClient client) throws Exception {
+        doAnswer(runRunnable(1)).when(mCallback1)
+                .onScrollCaptureStart(any(ScrollCaptureSession.class), any(Runnable.class));
+        client.startCapture(mSurface);
+        getInstrumentation().waitForIdleSync();
+        reset(mCallback1, mClientCallbacks);
+    }
+
+    /** @see ScrollCaptureClient#requestImage(Rect) */
+    @Test
+    public void testRequestImage() throws Exception {
+        final ScrollCaptureClient client = new ScrollCaptureClient(mTarget1, mClientCallbacks);
+        startClient(client);
+
+        // Stub the callback to complete the request immediately
+        doAnswer(reportBufferSent(/* sessionArg */ 0, /* frameNum */ 1L, new Rect(1, 2, 3, 4)))
+                .when(mCallback1)
+                .onScrollCaptureImageRequest(any(ScrollCaptureSession.class), any(Rect.class));
+
+        // Make the inbound binder call
+        client.requestImage(new Rect(1, 2, 3, 4));
+
+        // Wait for handler thread dispatch
+        getInstrumentation().waitForIdleSync();
+        verify(mCallback1, times(1)).onScrollCaptureImageRequest(
+                any(ScrollCaptureSession.class), eq(new Rect(1, 2, 3, 4)));
+
+        // Wait for binder thread dispatch
+        getInstrumentation().waitForIdleSync();
+        verify(mClientCallbacks, times(1)).onCaptureBufferSent(eq(1L), eq(new Rect(1, 2, 3, 4)));
+
+        verifyNoMoreInteractions(mCallback1, mClientCallbacks);
+    }
+
+    @Test
+    public void testRequestImageTimeout() throws Exception {
+        final ScrollCaptureClient client = new ScrollCaptureClient(mTarget1, mClientCallbacks);
+        startClient(client);
+
+        // Make the inbound binder call
+        client.requestImage(new Rect(1, 2, 3, 4));
+
+        // Wait for handler thread dispatch
+        getInstrumentation().waitForIdleSync();
+        verify(mCallback1, times(1)).onScrollCaptureImageRequest(
+                any(ScrollCaptureSession.class), eq(new Rect(1, 2, 3, 4)));
+
+        // Force timeout to fire
+        client.getTimeoutAction().timeoutNow();
+        getInstrumentation().waitForIdleSync();
+
+        // (callback not stubbed, does nothing)
+        // Timeout triggers request to end capture
+        verify(mCallback1, times(1)).onScrollCaptureEnd(any(Runnable.class));
+        verifyNoMoreInteractions(mCallback1, mClientCallbacks);
+    }
+
+    /** @see ScrollCaptureClient#endCapture() */
+    @Test
+    public void testEndCapture() throws Exception {
+        final ScrollCaptureClient client = new ScrollCaptureClient(mTarget1, mClientCallbacks);
+        startClient(client);
+
+        // Stub the callback to complete the request immediately
+        doAnswer(runRunnable(0))
+                .when(mCallback1)
+                .onScrollCaptureEnd(any(Runnable.class));
+
+        // Make the inbound binder call
+        client.endCapture();
+
+        // Wait for handler thread dispatch
+        getInstrumentation().waitForIdleSync();
+        verify(mCallback1, times(1)).onScrollCaptureEnd(any(Runnable.class));
+
+        // Wait for binder thread dispatch
+        getInstrumentation().waitForIdleSync();
+        verify(mClientCallbacks, times(1)).onConnectionClosed();
+
+        verifyNoMoreInteractions(mCallback1, mClientCallbacks);
+    }
+
+    @Test
+    public void testEndCaptureTimeout() throws Exception {
+        final ScrollCaptureClient client = new ScrollCaptureClient(mTarget1, mClientCallbacks);
+        startClient(client);
+
+        // Make the inbound binder call
+        client.endCapture();
+
+        // Wait for handler thread dispatch
+        getInstrumentation().waitForIdleSync();
+        verify(mCallback1, times(1)).onScrollCaptureEnd(any(Runnable.class));
+
+        // Force timeout to fire
+        client.getTimeoutAction().timeoutNow();
+
+        // Wait for binder thread dispatch
+        getInstrumentation().waitForIdleSync();
+        verify(mClientCallbacks, times(1)).onConnectionClosed();
+
+        verifyNoMoreInteractions(mCallback1, mClientCallbacks);
+    }
+}
diff --git a/core/tests/coretests/src/android/view/ScrollCaptureTargetResolverTest.java b/core/tests/coretests/src/android/view/ScrollCaptureTargetResolverTest.java
new file mode 100644
index 0000000..8b21b8e
--- /dev/null
+++ b/core/tests/coretests/src/android/view/ScrollCaptureTargetResolverTest.java
@@ -0,0 +1,498 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view;
+
+import static androidx.test.InstrumentationRegistry.getTargetContext;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
+
+import android.annotation.Nullable;
+import android.content.Context;
+import android.graphics.Point;
+import android.graphics.Rect;
+import android.os.Handler;
+
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.LinkedList;
+import java.util.function.Consumer;
+
+/**
+ * Tests of {@link ScrollCaptureTargetResolver}.
+ */
+@RunWith(AndroidJUnit4.class)
+public class ScrollCaptureTargetResolverTest {
+
+    private static final long TEST_TIMEOUT_MS = 2000;
+    private static final long RESOLVER_TIMEOUT_MS = 1000;
+
+    private Handler mHandler;
+    private TargetConsumer mTargetConsumer;
+
+    @Before
+    public void setUp() {
+        mTargetConsumer = new TargetConsumer();
+        mHandler = new Handler(getTargetContext().getMainLooper());
+    }
+
+    @Test(timeout = TEST_TIMEOUT_MS)
+    public void testEmptyQueue() throws InterruptedException {
+        ScrollCaptureTargetResolver resolver = new ScrollCaptureTargetResolver(new LinkedList<>());
+        resolver.start(mHandler, RESOLVER_TIMEOUT_MS, mTargetConsumer);
+
+        // Test only
+        resolver.waitForResult();
+
+        ScrollCaptureTarget result = mTargetConsumer.getLastValue();
+        assertNull("Expected null due to empty queue", result);
+    }
+
+    @Test(timeout = TEST_TIMEOUT_MS)
+    public void testNoValidTargets() throws InterruptedException {
+        LinkedList<ScrollCaptureTarget> targetQueue = new LinkedList<>();
+
+        // Supplies scrollBounds = null
+        FakeScrollCaptureCallback callback1 = new FakeScrollCaptureCallback();
+        callback1.setScrollBounds(null);
+        ScrollCaptureTarget target1 = createTarget(callback1, new Rect(20, 30, 40, 50),
+                new Point(0, 0), View.SCROLL_CAPTURE_HINT_AUTO);
+
+        // Supplies scrollBounds = empty rect
+        FakeScrollCaptureCallback callback2 = new FakeScrollCaptureCallback();
+        callback2.setScrollBounds(new Rect());
+        ScrollCaptureTarget target2 = createTarget(callback2, new Rect(20, 30, 40, 50),
+                new Point(0, 20), View.SCROLL_CAPTURE_HINT_INCLUDE);
+
+        targetQueue.add(target1);
+        targetQueue.add(target2);
+
+        ScrollCaptureTargetResolver resolver = new ScrollCaptureTargetResolver(targetQueue);
+        resolver.start(mHandler, RESOLVER_TIMEOUT_MS, mTargetConsumer);
+
+        // Test only
+        resolver.waitForResult();
+
+        ScrollCaptureTarget result = mTargetConsumer.getLastValue();
+        assertNull("Expected null due to no valid targets", result);
+    }
+
+    @Test(timeout = TEST_TIMEOUT_MS)
+    public void testSingleTarget() throws InterruptedException {
+        FakeScrollCaptureCallback callback = new FakeScrollCaptureCallback();
+        ScrollCaptureTarget target = createTarget(callback,
+                new Rect(20, 30, 40, 50), new Point(10, 10),
+                View.SCROLL_CAPTURE_HINT_AUTO);
+        callback.setScrollBounds(new Rect(2, 2, 18, 18));
+
+        LinkedList<ScrollCaptureTarget> targetQueue = new LinkedList<>();
+        targetQueue.add(target);
+        ScrollCaptureTargetResolver resolver = new ScrollCaptureTargetResolver(targetQueue);
+        resolver.start(mHandler, RESOLVER_TIMEOUT_MS, mTargetConsumer);
+
+        // Test only
+        resolver.waitForResult();
+
+        ScrollCaptureTarget result = mTargetConsumer.getLastValue();
+        assertSame("Excepted the same target as a result", target, result);
+        assertEquals("result has wrong scroll bounds",
+                new Rect(2, 2, 18, 18), result.getScrollBounds());
+    }
+
+    @Test(timeout = TEST_TIMEOUT_MS)
+    public void testSingleTarget_backgroundThread() throws InterruptedException {
+        BackgroundTestCallback callback1 = new BackgroundTestCallback();
+        ScrollCaptureTarget target1 = createTarget(callback1,
+                new Rect(20, 30, 40, 50), new Point(10, 10),
+                View.SCROLL_CAPTURE_HINT_AUTO);
+        callback1.setDelay(100);
+        callback1.setScrollBounds(new Rect(2, 2, 18, 18));
+
+        LinkedList<ScrollCaptureTarget> targetQueue = new LinkedList<>();
+        targetQueue.add(target1);
+
+        ScrollCaptureTargetResolver resolver = new ScrollCaptureTargetResolver(targetQueue);
+        resolver.start(mHandler, RESOLVER_TIMEOUT_MS, mTargetConsumer);
+
+        // Test only
+        resolver.waitForResult();
+
+        ScrollCaptureTarget result = mTargetConsumer.getLastValue();
+        assertSame("Excepted the single target1 as a result", target1, result);
+        assertEquals("Result has wrong scroll bounds",
+                new Rect(2, 2, 18, 18), result.getScrollBounds());
+    }
+
+    @Test(timeout = TEST_TIMEOUT_MS)
+    public void testPreferNonEmptyBounds() throws InterruptedException {
+        LinkedList<ScrollCaptureTarget> targetQueue = new LinkedList<>();
+
+        FakeScrollCaptureCallback callback1 = new FakeScrollCaptureCallback();
+        callback1.setScrollBounds(new Rect());
+        ScrollCaptureTarget target1 = createTarget(callback1, new Rect(20, 30, 40, 50),
+                new Point(0, 0), View.SCROLL_CAPTURE_HINT_AUTO);
+
+        FakeScrollCaptureCallback callback2 = new FakeScrollCaptureCallback();
+        callback2.setScrollBounds(new Rect(0, 0, 20, 20));
+        ScrollCaptureTarget target2 = createTarget(callback2, new Rect(20, 30, 40, 50),
+                new Point(0, 20), View.SCROLL_CAPTURE_HINT_INCLUDE);
+
+        FakeScrollCaptureCallback callback3 = new FakeScrollCaptureCallback();
+        callback3.setScrollBounds(null);
+        ScrollCaptureTarget target3 = createTarget(callback3, new Rect(20, 30, 40, 50),
+                new Point(0, 40), View.SCROLL_CAPTURE_HINT_AUTO);
+
+        targetQueue.add(target1);
+        targetQueue.add(target2); // scrollBounds not null or empty()
+        targetQueue.add(target3);
+
+        ScrollCaptureTargetResolver resolver = new ScrollCaptureTargetResolver(targetQueue);
+        resolver.start(mHandler, RESOLVER_TIMEOUT_MS, mTargetConsumer);
+        resolver.waitForResult();
+
+        ScrollCaptureTarget result = mTargetConsumer.getLastValue();
+        assertEquals("Expected " + target2 + " as a result", target2, result);
+        assertEquals("result has wrong scroll bounds",
+                new Rect(0, 0, 20, 20), result.getScrollBounds());
+    }
+
+    @Test(timeout = TEST_TIMEOUT_MS)
+    public void testPreferHintInclude() throws InterruptedException {
+        LinkedList<ScrollCaptureTarget> targetQueue = new LinkedList<>();
+
+        FakeScrollCaptureCallback callback1 = new FakeScrollCaptureCallback();
+        callback1.setScrollBounds(new Rect(0, 0, 20, 20));
+        ScrollCaptureTarget target1 = createTarget(callback1, new Rect(20, 30, 40, 50),
+                new Point(0, 0), View.SCROLL_CAPTURE_HINT_AUTO);
+
+        FakeScrollCaptureCallback callback2 = new FakeScrollCaptureCallback();
+        callback2.setScrollBounds(new Rect(1, 1, 19, 19));
+        ScrollCaptureTarget target2 = createTarget(callback2, new Rect(20, 30, 40, 50),
+                new Point(0, 20), View.SCROLL_CAPTURE_HINT_INCLUDE);
+
+        FakeScrollCaptureCallback callback3 = new FakeScrollCaptureCallback();
+        callback3.setScrollBounds(new Rect(2, 2, 18, 18));
+        ScrollCaptureTarget target3 = createTarget(callback3, new Rect(20, 30, 40, 50),
+                new Point(0, 40), View.SCROLL_CAPTURE_HINT_AUTO);
+
+        targetQueue.add(target1);
+        targetQueue.add(target2); // * INCLUDE > AUTO
+        targetQueue.add(target3);
+
+        ScrollCaptureTargetResolver resolver = new ScrollCaptureTargetResolver(targetQueue);
+        resolver.start(mHandler, RESOLVER_TIMEOUT_MS, mTargetConsumer);
+
+        resolver.waitForResult();
+
+        ScrollCaptureTarget result = mTargetConsumer.getLastValue();
+        assertEquals("input = " + targetQueue + " Expected " + target2
+                + " as the result, due to hint=INCLUDE", target2, result);
+        assertEquals("result has wrong scroll bounds",
+                new Rect(1, 1, 19, 19), result.getScrollBounds());
+    }
+
+    @Test(timeout = TEST_TIMEOUT_MS)
+    public void testDescendantPreferred() throws InterruptedException {
+        LinkedList<ScrollCaptureTarget> targetQueue = new LinkedList<>();
+
+        ViewGroup targetView1 = new FakeRootView(getTargetContext(), 0, 0, 60, 60); // 60x60
+        ViewGroup targetView2 = new FakeRootView(getTargetContext(), 20, 30, 40, 50); // 20x20
+        ViewGroup targetView3 = new FakeRootView(getTargetContext(), 5, 5, 15, 15); // 10x10
+
+        targetView1.addView(targetView2);
+        targetView2.addView(targetView3);
+
+        // Create first target with an unrelated parent
+        FakeScrollCaptureCallback callback1 = new FakeScrollCaptureCallback();
+        callback1.setScrollBounds(new Rect(0, 0, 60, 60));
+        ScrollCaptureTarget target1 = createTargetWithView(targetView1, callback1,
+                new Rect(0, 0, 60, 60),
+                new Point(0, 0), View.SCROLL_CAPTURE_HINT_AUTO);
+
+        // Create second target associated with a view within parent2
+        FakeScrollCaptureCallback callback2 = new FakeScrollCaptureCallback();
+        callback2.setScrollBounds(new Rect(0, 0, 20, 20));
+        ScrollCaptureTarget target2 = createTargetWithView(targetView2, callback2,
+                new Rect(0, 0, 20, 20),
+                new Point(20, 30), View.SCROLL_CAPTURE_HINT_AUTO);
+
+        // Create third target associated with a view within parent3
+        FakeScrollCaptureCallback callback3 = new FakeScrollCaptureCallback();
+        callback3.setScrollBounds(new Rect(0, 0, 15, 15));
+        ScrollCaptureTarget target3 = createTargetWithView(targetView3, callback3,
+                new Rect(0, 0, 15, 15),
+                new Point(25, 35), View.SCROLL_CAPTURE_HINT_AUTO);
+
+        targetQueue.add(target1); // auto, 60x60
+        targetQueue.add(target2); // auto, 20x20
+        targetQueue.add(target3); // auto, 15x15 <- innermost scrollable
+
+        ScrollCaptureTargetResolver resolver = new ScrollCaptureTargetResolver(targetQueue);
+        resolver.start(mHandler, RESOLVER_TIMEOUT_MS, mTargetConsumer);
+
+        // Test only
+        resolver.waitForResult();
+
+        ScrollCaptureTarget result = mTargetConsumer.getLastValue();
+        assertSame("Expected target3 as the result, due to relation", target3, result);
+        assertEquals("result has wrong scroll bounds",
+                new Rect(0, 0, 15, 15), result.getScrollBounds());
+    }
+
+    /**
+     * If a timeout expires, late results are ignored.
+     */
+    @Test(timeout = TEST_TIMEOUT_MS)
+    public void testTimeout() throws InterruptedException {
+        LinkedList<ScrollCaptureTarget> targetQueue = new LinkedList<>();
+
+        // callback 1, 10x10, hint=AUTO, responds immediately from bg thread
+        BackgroundTestCallback callback1 = new BackgroundTestCallback();
+        callback1.setScrollBounds(new Rect(5, 5, 15, 15));
+        ScrollCaptureTarget target1 = createTarget(
+                callback1, new Rect(20, 30, 40, 50), new Point(10, 10),
+                View.SCROLL_CAPTURE_HINT_AUTO);
+        targetQueue.add(target1);
+
+        // callback 2, 20x20, hint=AUTO, responds after 5s from bg thread
+        BackgroundTestCallback callback2 = new BackgroundTestCallback();
+        callback2.setScrollBounds(new Rect(0, 0, 20, 20));
+        callback2.setDelay(5000);
+        ScrollCaptureTarget target2 = createTarget(
+                callback2, new Rect(20, 30, 40, 50), new Point(10, 10),
+                View.SCROLL_CAPTURE_HINT_AUTO);
+        targetQueue.add(target2);
+
+        // callback 3, 20x20, hint=INCLUDE, responds after 10s from bg thread
+        BackgroundTestCallback callback3 = new BackgroundTestCallback();
+        callback3.setScrollBounds(new Rect(0, 0, 20, 20));
+        callback3.setDelay(10000);
+        ScrollCaptureTarget target3 = createTarget(
+                callback3, new Rect(20, 30, 40, 50), new Point(10, 10),
+                View.SCROLL_CAPTURE_HINT_INCLUDE);
+        targetQueue.add(target3);
+
+        // callback 1 will be received
+        // callback 2 & 3 will be ignored due to timeout
+
+        ScrollCaptureTargetResolver resolver = new ScrollCaptureTargetResolver(targetQueue);
+        resolver.start(mHandler, RESOLVER_TIMEOUT_MS, mTargetConsumer);
+
+        resolver.waitForResult();
+
+        ScrollCaptureTarget result = mTargetConsumer.getLastValue();
+        assertSame("Expected target1 as the result, due to timeouts of others", target1, result);
+        assertEquals("result has wrong scroll bounds",
+                new Rect(5, 5, 15, 15), result.getScrollBounds());
+        assertEquals("callback1 should have been called",
+                1, callback1.getOnScrollCaptureSearchCount());
+        assertEquals("callback2 should have been called",
+                1, callback2.getOnScrollCaptureSearchCount());
+        assertEquals("callback3 should have been called",
+                1, callback3.getOnScrollCaptureSearchCount());
+    }
+
+    @Test(timeout = TEST_TIMEOUT_MS)
+    public void testWithCallbackMultipleReplies() throws InterruptedException {
+        // Calls response methods 3 times each
+        RepeatingCaptureCallback callback1 = new RepeatingCaptureCallback(3);
+        callback1.setScrollBounds(new Rect(2, 2, 18, 18));
+        ScrollCaptureTarget target1 = createTarget(callback1, new Rect(20, 30, 40, 50),
+                new Point(10, 10), View.SCROLL_CAPTURE_HINT_AUTO);
+
+        FakeScrollCaptureCallback callback2 = new FakeScrollCaptureCallback();
+        callback2.setScrollBounds(new Rect(0, 0, 20, 20));
+        ScrollCaptureTarget target2 = createTarget(callback2, new Rect(20, 30, 40, 50),
+                new Point(10, 10), View.SCROLL_CAPTURE_HINT_AUTO);
+
+        LinkedList<ScrollCaptureTarget> targetQueue = new LinkedList<>();
+        targetQueue.add(target1);
+        targetQueue.add(target2);
+
+        ScrollCaptureTargetResolver resolver = new ScrollCaptureTargetResolver(targetQueue);
+        resolver.start(mHandler, RESOLVER_TIMEOUT_MS, mTargetConsumer);
+
+        resolver.waitForResult();
+
+        ScrollCaptureTarget result = mTargetConsumer.getLastValue();
+        assertSame("Expected target2 as the result, due to hint=INCLUDE", target2, result);
+        assertEquals("result has wrong scroll bounds",
+                new Rect(0, 0, 20, 20), result.getScrollBounds());
+        assertEquals("callback1 should have been called once",
+                1, callback1.getOnScrollCaptureSearchCount());
+        assertEquals("callback2 should have been called once",
+                1, callback2.getOnScrollCaptureSearchCount());
+    }
+
+    private static class TargetConsumer implements Consumer<ScrollCaptureTarget> {
+        volatile ScrollCaptureTarget mResult;
+        int mAcceptCount;
+
+        ScrollCaptureTarget getLastValue() {
+            return mResult;
+        }
+
+        int acceptCount() {
+            return mAcceptCount;
+        }
+
+        @Override
+        public void accept(@Nullable ScrollCaptureTarget t) {
+            mAcceptCount++;
+            mResult = t;
+        }
+    }
+
+    private void setupTargetView(View view, Rect localVisibleRect, int scrollCaptureHint) {
+        view.setScrollCaptureHint(scrollCaptureHint);
+        view.onVisibilityAggregated(true);
+        // Treat any offset as padding, outset localVisibleRect on all sides and use this as
+        // child bounds
+        Rect bounds = new Rect(localVisibleRect);
+        bounds.inset(-bounds.left, -bounds.top, bounds.left, bounds.top);
+        view.layout(bounds.left, bounds.top, bounds.right, bounds.bottom);
+        view.onVisibilityAggregated(true);
+    }
+
+    private ScrollCaptureTarget createTarget(ScrollCaptureCallback callback, Rect localVisibleRect,
+            Point positionInWindow, int scrollCaptureHint) {
+        View mockView = new View(getTargetContext());
+        return createTargetWithView(mockView, callback, localVisibleRect, positionInWindow,
+                scrollCaptureHint);
+    }
+
+    private ScrollCaptureTarget createTargetWithView(View view, ScrollCaptureCallback callback,
+            Rect localVisibleRect, Point positionInWindow, int scrollCaptureHint) {
+        setupTargetView(view, localVisibleRect, scrollCaptureHint);
+        return new ScrollCaptureTarget(view, localVisibleRect, positionInWindow, callback);
+    }
+
+
+    static class FakeRootView extends ViewGroup implements ViewParent {
+        FakeRootView(Context context, int l, int t, int r, int b) {
+            super(context);
+            layout(l, t, r, b);
+        }
+
+        @Override
+        protected void onLayout(boolean changed, int l, int t, int r, int b) {
+        }
+    }
+
+    static class FakeScrollCaptureCallback implements ScrollCaptureCallback {
+        private Rect mScrollBounds;
+        private long mDelayMillis;
+        private int mOnScrollCaptureSearchCount;
+
+        public int getOnScrollCaptureSearchCount() {
+            return mOnScrollCaptureSearchCount;
+        }
+
+        @Override
+        public void onScrollCaptureSearch(Consumer<Rect> onReady) {
+            mOnScrollCaptureSearchCount++;
+            run(() -> {
+                Rect b = getScrollBounds();
+                onReady.accept(b);
+            });
+        }
+
+        @Override
+        public void onScrollCaptureStart(ScrollCaptureSession session, Runnable onReady) {
+            run(onReady);
+        }
+
+        @Override
+        public void onScrollCaptureImageRequest(ScrollCaptureSession session, Rect captureArea) {
+            run(() -> session.notifyBufferSent(0, captureArea));
+        }
+
+        @Override
+        public void onScrollCaptureEnd(Runnable onReady) {
+            run(onReady);
+        }
+
+        public void setScrollBounds(@Nullable Rect scrollBounds) {
+            mScrollBounds = scrollBounds;
+        }
+
+        public void setDelay(long delayMillis) {
+            mDelayMillis = delayMillis;
+        }
+
+        protected Rect getScrollBounds() {
+            return mScrollBounds;
+        }
+
+        protected void run(Runnable r) {
+            delay();
+            r.run();
+        }
+
+        protected void delay() {
+            if (mDelayMillis > 0) {
+                try {
+                    Thread.sleep(mDelayMillis);
+                } catch (InterruptedException e) {
+                    // Ignore
+                }
+            }
+        }
+    }
+
+    static class RepeatingCaptureCallback extends FakeScrollCaptureCallback {
+        private int mRepeatCount;
+
+        RepeatingCaptureCallback(int repeatCount) {
+            mRepeatCount = repeatCount;
+        }
+
+        protected void run(Runnable r) {
+            delay();
+            for (int i = 0; i < mRepeatCount; i++) {
+                r.run();
+            }
+        }
+    }
+
+    /** Response to async calls on an arbitrary background thread */
+    static class BackgroundTestCallback extends FakeScrollCaptureCallback {
+        static int sCount = 0;
+        private void runOnBackgroundThread(Runnable r) {
+            final Runnable target = () -> {
+                delay();
+                r.run();
+            };
+            Thread t = new Thread(target);
+            synchronized (BackgroundTestCallback.this) {
+                sCount++;
+            }
+            t.setName("Background-Thread-" + sCount);
+            t.start();
+        }
+
+        @Override
+        protected void run(Runnable r) {
+            runOnBackgroundThread(r);
+        }
+    }
+}
diff --git a/core/tests/coretests/src/android/view/ViewGroupScrollCaptureTest.java b/core/tests/coretests/src/android/view/ViewGroupScrollCaptureTest.java
new file mode 100644
index 0000000..3af0533e
--- /dev/null
+++ b/core/tests/coretests/src/android/view/ViewGroupScrollCaptureTest.java
@@ -0,0 +1,480 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view;
+
+import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.testng.AssertJUnit.assertSame;
+
+import android.annotation.Nullable;
+import android.content.Context;
+import android.graphics.Point;
+import android.graphics.Rect;
+import android.platform.test.annotations.Presubmit;
+
+import androidx.test.filters.FlakyTest;
+import androidx.test.filters.MediumTest;
+import androidx.test.filters.SmallTest;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+
+import java.util.LinkedList;
+import java.util.Queue;
+
+/**
+ * Exercises Scroll Capture search in {@link ViewGroup}.
+ */
+@Presubmit
+@SmallTest
+@FlakyTest(detail = "promote once confirmed flake-free")
+@RunWith(MockitoJUnitRunner.class)
+public class ViewGroupScrollCaptureTest {
+
+    @Mock
+    ScrollCaptureCallback mMockCallback;
+    @Mock
+    ScrollCaptureCallback mMockCallback2;
+
+    /** Make sure the hint flags are saved and loaded correctly. */
+    @Test
+    public void testSetScrollCaptureHint() throws Exception {
+        final Context context = getInstrumentation().getContext();
+        final MockViewGroup viewGroup = new MockViewGroup(context);
+
+        assertNotNull(viewGroup);
+        assertEquals("Default scroll capture hint flags should be [SCROLL_CAPTURE_HINT_AUTO]",
+                ViewGroup.SCROLL_CAPTURE_HINT_AUTO, viewGroup.getScrollCaptureHint());
+
+        viewGroup.setScrollCaptureHint(View.SCROLL_CAPTURE_HINT_INCLUDE);
+        assertEquals("The scroll capture hint was not stored correctly.",
+                ViewGroup.SCROLL_CAPTURE_HINT_INCLUDE, viewGroup.getScrollCaptureHint());
+
+        viewGroup.setScrollCaptureHint(ViewGroup.SCROLL_CAPTURE_HINT_EXCLUDE);
+        assertEquals("The scroll capture hint was not stored correctly.",
+                ViewGroup.SCROLL_CAPTURE_HINT_EXCLUDE, viewGroup.getScrollCaptureHint());
+
+        viewGroup.setScrollCaptureHint(ViewGroup.SCROLL_CAPTURE_HINT_EXCLUDE_DESCENDANTS);
+        assertEquals("The scroll capture hint was not stored correctly.",
+                ViewGroup.SCROLL_CAPTURE_HINT_EXCLUDE_DESCENDANTS,
+                viewGroup.getScrollCaptureHint());
+
+        viewGroup.setScrollCaptureHint(ViewGroup.SCROLL_CAPTURE_HINT_INCLUDE
+                | ViewGroup.SCROLL_CAPTURE_HINT_EXCLUDE_DESCENDANTS);
+        assertEquals("The scroll capture hint was not stored correctly.",
+                ViewGroup.SCROLL_CAPTURE_HINT_INCLUDE
+                        | ViewGroup.SCROLL_CAPTURE_HINT_EXCLUDE_DESCENDANTS,
+                viewGroup.getScrollCaptureHint());
+
+        viewGroup.setScrollCaptureHint(ViewGroup.SCROLL_CAPTURE_HINT_EXCLUDE
+                | ViewGroup.SCROLL_CAPTURE_HINT_EXCLUDE_DESCENDANTS);
+        assertEquals("The scroll capture hint was not stored correctly.",
+                ViewGroup.SCROLL_CAPTURE_HINT_EXCLUDE
+                        | ViewGroup.SCROLL_CAPTURE_HINT_EXCLUDE_DESCENDANTS,
+                viewGroup.getScrollCaptureHint());
+    }
+
+    /**
+     * Ensure a ViewGroup with 'scrollCaptureHint=auto', but no ScrollCaptureCallback set dispatches
+     * correctly. Verifies that the framework helper is called. Verifies a that non-null callback
+     * return results in an expected target in the results.
+     */
+    @MediumTest
+    @Test
+    public void testDispatchScrollCaptureSearch_noCallback_hintAuto() throws Exception {
+        final Context context = getInstrumentation().getContext();
+        final MockViewGroup viewGroup = new MockViewGroup(context, 0, 0, 200, 200);
+
+        // When system internal scroll capture is requested, this callback is returned.
+        viewGroup.setScrollCaptureCallbackInternalForTest(mMockCallback);
+
+        Rect localVisibleRect = new Rect(0, 0, 200, 200);
+        Point windowOffset = new Point();
+        LinkedList<ScrollCaptureTarget> targetList = new LinkedList<>();
+
+        // Dispatch
+        viewGroup.dispatchScrollCaptureSearch(localVisibleRect, windowOffset, targetList);
+
+        // Verify the system checked for fallback support
+        viewGroup.assertDispatchScrollCaptureCount(1);
+        viewGroup.assertLastDispatchScrollCaptureArgs(localVisibleRect, windowOffset);
+
+        // Verify the target is as expected.
+        assertEquals(1, targetList.size());
+        ScrollCaptureTarget target = targetList.get(0);
+        assertSame("Target has the wrong callback", mMockCallback, target.getCallback());
+        assertSame("Target has the wrong View", viewGroup, target.getContainingView());
+        assertEquals("Target hint is incorrect", View.SCROLL_CAPTURE_HINT_AUTO,
+                target.getContainingView().getScrollCaptureHint());
+    }
+
+    /**
+     * Ensure a ViewGroup with 'scrollCaptureHint=exclude' is ignored. The Framework helper is
+     * stubbed to return a callback. Verifies that the framework helper is not called (because of
+     * exclude), and no scroll capture target is added to the results.
+     */
+    @MediumTest
+    @Test
+    public void testDispatchScrollCaptureSearch_noCallback_hintExclude() throws Exception {
+        final Context context = getInstrumentation().getContext();
+        final MockViewGroup viewGroup =
+                new MockViewGroup(context, 0, 0, 200, 200, View.SCROLL_CAPTURE_HINT_EXCLUDE);
+
+        // When system internal scroll capture is requested, this callback is returned.
+        viewGroup.setScrollCaptureCallbackInternalForTest(mMockCallback);
+
+        Rect localVisibleRect = new Rect(0, 0, 200, 200);
+        Point windowOffset = new Point();
+        LinkedList<ScrollCaptureTarget> targetList = new LinkedList<>();
+
+        // Dispatch
+        viewGroup.dispatchScrollCaptureSearch(localVisibleRect, windowOffset, targetList);
+
+        // Verify the results.
+        assertEquals("Target list size should be zero.", 0, targetList.size());
+    }
+
+    /**
+     * Ensure that a ViewGroup with 'scrollCaptureHint=auto', and a scroll capture callback set
+     * dispatches as expected. Also verifies that the system fallback support is not called, and the
+     * the returned target is constructed correctly.
+     */
+    @MediumTest
+    @Test
+    public void testDispatchScrollCaptureSearch_withCallback_hintAuto() throws Exception {
+        final Context context = getInstrumentation().getContext();
+        MockViewGroup viewGroup = new MockViewGroup(context, 0, 0, 200, 200);
+
+        // With an already provided scroll capture callback
+        viewGroup.setScrollCaptureCallback(mMockCallback);
+
+        // When system internal scroll capture is requested, this callback is returned.
+        viewGroup.setScrollCaptureCallbackInternalForTest(mMockCallback);
+
+        Rect localVisibleRect = new Rect(0, 0, 200, 200);
+        Point windowOffset = new Point();
+        LinkedList<ScrollCaptureTarget> targetList = new LinkedList<>();
+
+        // Dispatch to the ViewGroup
+        viewGroup.dispatchScrollCaptureSearch(localVisibleRect, windowOffset, targetList);
+
+        // Confirm that framework support was not requested,
+        // because this view already had a callback set.
+        viewGroup.assertCreateScrollCaptureCallbackInternalCount(0);
+
+        // Verify the target is as expected.
+        assertEquals(1, targetList.size());
+        ScrollCaptureTarget target = targetList.get(0);
+        assertSame("Target has the wrong callback", mMockCallback, target.getCallback());
+        assertSame("Target has the wrong View", viewGroup, target.getContainingView());
+        assertEquals("Target hint is incorrect", View.SCROLL_CAPTURE_HINT_AUTO,
+                target.getContainingView().getScrollCaptureHint());
+    }
+
+    /**
+     * Ensure a ViewGroup with a callback set, but 'scrollCaptureHint=exclude' is ignored. The
+     * exclude flag takes precedence.  Verifies that the framework helper is not called (because of
+     * exclude, and a callback being set), and no scroll capture target is added to the results.
+     */
+    @MediumTest
+    @Test
+    public void testDispatchScrollCaptureSearch_withCallback_hintExclude() throws Exception {
+        final Context context = getInstrumentation().getContext();
+        MockViewGroup viewGroup =
+                new MockViewGroup(context, 0, 0, 200, 200, View.SCROLL_CAPTURE_HINT_EXCLUDE);
+        // With an already provided scroll capture callback
+        viewGroup.setScrollCaptureCallback(mMockCallback);
+
+        Rect localVisibleRect = new Rect(0, 0, 200, 200);
+        Point windowOffset = new Point();
+        LinkedList<ScrollCaptureTarget> targetList = new LinkedList<>();
+
+        // Dispatch to the ViewGroup itself
+        viewGroup.dispatchScrollCaptureSearch(localVisibleRect, windowOffset, targetList);
+
+        // Confirm that framework support was not requested, because this view is excluded.
+        // (And because this view has a callback set.)
+        viewGroup.assertCreateScrollCaptureCallbackInternalCount(0);
+
+        // Has callback, but hint=excluded, so excluded.
+        assertTrue(targetList.isEmpty());
+    }
+
+    /**
+     * Test scroll capture search dispatch to child views.
+     * <p>
+     * Verifies computation of child visible bounds.
+     * TODO: with scrollX / scrollY, split up into discrete tests
+     */
+    @MediumTest
+    @Test
+    public void testDispatchScrollCaptureSearch_toChildren() throws Exception {
+        final Context context = getInstrumentation().getContext();
+        final MockViewGroup viewGroup = new MockViewGroup(context, 0, 0, 200, 200);
+
+        Rect localVisibleRect = new Rect(25, 50, 175, 150);
+        Point windowOffset = new Point(0, 0);
+
+        //        visible area
+        //       |<- l=25,    |
+        //       |    r=175 ->|
+        // +--------------------------+
+        // | view1 (0, 0, 200, 25)    |
+        // +---------------+----------+
+        // |               |          |
+        // | view2         | view4    | --+
+        // | (0, 25,       |    (inv) |   | visible area
+        // |      150, 100)|          |   |
+        // +---------------+----------+   | t=50, b=150
+        // | view3         | view5    |   |
+        // | (0, 100       |(150, 100 | --+
+        // |     200, 200) | 200, 200)|
+        // |               |          |
+        // |               |          |
+        // +---------------+----------+ (200,200)
+
+        // View 1 is clipped and not visible.
+        final MockView view1 = new MockView(context, 0, 0, 200, 25);
+        viewGroup.addView(view1);
+
+        // View 2 is partially visible.
+        final MockView view2 = new MockView(context, 0, 25, 150, 100);
+        viewGroup.addView(view2);
+
+        // View 3 is partially visible.
+        // Pretend View3 can scroll by having framework provide fallback support
+        final MockView view3 = new MockView(context, 0, 100, 200, 200);
+        // When system internal scroll capture is requested for this view, return this callback.
+        view3.setScrollCaptureCallbackInternalForTest(mMockCallback);
+        viewGroup.addView(view3);
+
+        // View 4 is invisible and should be ignored.
+        final MockView view4 = new MockView(context, 150, 25, 200, 100, View.INVISIBLE);
+        viewGroup.addView(view4);
+
+        // View 4 is invisible and should be ignored.
+        final MockView view5 = new MockView(context, 150, 100, 200, 200);
+        // When system internal scroll capture is requested for this view, return this callback.
+        view5.setScrollCaptureCallback(mMockCallback2);
+        view5.setScrollCaptureHint(View.SCROLL_CAPTURE_HINT_INCLUDE);
+        viewGroup.addView(view5);
+
+        // Where targets are added
+        final LinkedList<ScrollCaptureTarget> targetList = new LinkedList<>();
+
+        // Dispatch to the ViewGroup
+        viewGroup.dispatchScrollCaptureSearch(localVisibleRect, windowOffset, targetList);
+
+        // View 1 is entirely clipped by the parent and not visible, dispatch
+        // skips this view entirely.
+        view1.assertDispatchScrollCaptureSearchCount(0);
+        view1.assertCreateScrollCaptureCallbackInternalCount(0);
+
+        // View 2, verify the computed localVisibleRect and windowOffset are correctly transformed
+        // to the child coordinate space
+        view2.assertDispatchScrollCaptureSearchCount(1);
+        view2.assertDispatchScrollCaptureSearchLastArgs(
+                new Rect(25, 25, 150, 75), new Point(0, 25));
+        // No callback set, so the framework is asked for support
+        view2.assertCreateScrollCaptureCallbackInternalCount(1);
+
+        // View 3, verify the computed localVisibleRect and windowOffset are correctly transformed
+        // to the child coordinate space
+        view3.assertDispatchScrollCaptureSearchCount(1);
+        view3.assertDispatchScrollCaptureSearchLastArgs(
+                new Rect(25, 0, 175, 50), new Point(0, 100));
+        // No callback set, so the framework is asked for support
+        view3.assertCreateScrollCaptureCallbackInternalCount(1);
+
+        // view4 is invisible, so it should be skipped entirely.
+        view4.assertDispatchScrollCaptureSearchCount(0);
+        view4.assertCreateScrollCaptureCallbackInternalCount(0);
+
+        // view5 is partially visible
+        view5.assertDispatchScrollCaptureSearchCount(1);
+        view5.assertDispatchScrollCaptureSearchLastArgs(
+                new Rect(0, 0, 25, 50), new Point(150, 100));
+        // view5 has a callback set on it, so internal framework support should not be consulted.
+        view5.assertCreateScrollCaptureCallbackInternalCount(0);
+
+        // 2 views should have been returned, view3 & view5
+        assertEquals(2, targetList.size());
+
+        ScrollCaptureTarget target = targetList.get(0);
+        assertSame("First target has the wrong View", view3, target.getContainingView());
+        assertSame("First target has the wrong callback", mMockCallback, target.getCallback());
+        assertEquals("First target hint is incorrect", View.SCROLL_CAPTURE_HINT_AUTO,
+                target.getContainingView().getScrollCaptureHint());
+
+        target = targetList.get(1);
+        assertSame("Second target has the wrong View", view5, target.getContainingView());
+        assertSame("Second target has the wrong callback", mMockCallback2, target.getCallback());
+        assertEquals("Second target hint is incorrect", View.SCROLL_CAPTURE_HINT_INCLUDE,
+                target.getContainingView().getScrollCaptureHint());
+    }
+
+    public static final class MockView extends View {
+        private ScrollCaptureCallback mInternalCallback;
+
+        private int mDispatchScrollCaptureSearchNumCalls;
+        private Rect mDispatchScrollCaptureSearchLastLocalVisibleRect;
+        private Point mDispatchScrollCaptureSearchLastWindowOffset;
+        private int mCreateScrollCaptureCallbackInternalCount;
+
+        MockView(Context context) {
+            this(context, /* left */ 0, /* top */0, /* right */ 0, /* bottom */0);
+        }
+
+        MockView(Context context, int left, int top, int right, int bottom) {
+            this(context, left, top, right, bottom, View.VISIBLE);
+        }
+
+        MockView(Context context, int left, int top, int right, int bottom, int visibility) {
+            super(context);
+            setVisibility(visibility);
+            setFrame(left, top, right, bottom);
+        }
+
+        public void setScrollCaptureCallbackInternalForTest(ScrollCaptureCallback internal) {
+            mInternalCallback = internal;
+        }
+
+        void assertDispatchScrollCaptureSearchCount(int count) {
+            assertEquals("Unexpected number of calls to dispatchScrollCaptureSearch",
+                    count, mDispatchScrollCaptureSearchNumCalls);
+        }
+
+        void assertDispatchScrollCaptureSearchLastArgs(Rect localVisibleRect, Point windowOffset) {
+            assertEquals("arg localVisibleRect was incorrect.",
+                    localVisibleRect, mDispatchScrollCaptureSearchLastLocalVisibleRect);
+            assertEquals("arg windowOffset was incorrect.",
+                    windowOffset, mDispatchScrollCaptureSearchLastWindowOffset);
+        }
+
+        void assertCreateScrollCaptureCallbackInternalCount(int count) {
+            assertEquals("Unexpected number of calls to createScrollCaptureCallackInternal",
+                    count, mCreateScrollCaptureCallbackInternalCount);
+        }
+
+        void reset() {
+            mDispatchScrollCaptureSearchNumCalls = 0;
+            mDispatchScrollCaptureSearchLastWindowOffset = null;
+            mDispatchScrollCaptureSearchLastLocalVisibleRect = null;
+            mCreateScrollCaptureCallbackInternalCount = 0;
+
+        }
+
+        @Override
+        public void dispatchScrollCaptureSearch(Rect localVisibleRect, Point windowOffset,
+                Queue<ScrollCaptureTarget> targets) {
+            mDispatchScrollCaptureSearchNumCalls++;
+            mDispatchScrollCaptureSearchLastLocalVisibleRect = new Rect(localVisibleRect);
+            mDispatchScrollCaptureSearchLastWindowOffset = new Point(windowOffset);
+            super.dispatchScrollCaptureSearch(localVisibleRect, windowOffset, targets);
+        }
+
+        @Override
+        @Nullable
+        public ScrollCaptureCallback createScrollCaptureCallbackInternal(Rect localVisibleRect,
+                Point offsetInWindow) {
+            mCreateScrollCaptureCallbackInternalCount++;
+            return mInternalCallback;
+        }
+    }
+
+    public static final class MockViewGroup extends ViewGroup {
+        private ScrollCaptureCallback mInternalCallback;
+        private int mDispatchScrollCaptureSearchNumCalls;
+        private Rect mDispatchScrollCaptureSearchLastLocalVisibleRect;
+        private Point mDispatchScrollCaptureSearchLastWindowOffset;
+        private int mCreateScrollCaptureCallbackInternalCount;
+
+
+        MockViewGroup(Context context) {
+            this(context, /* left */ 0, /* top */0, /* right */ 0, /* bottom */0);
+        }
+
+        MockViewGroup(Context context, int left, int top, int right, int bottom) {
+            this(context, left, top, right, bottom, View.SCROLL_CAPTURE_HINT_AUTO);
+        }
+
+        MockViewGroup(Context context, int left, int top, int right, int bottom,
+                int scrollCaptureHint) {
+            super(context);
+            setScrollCaptureHint(scrollCaptureHint);
+            setFrame(left, top, right, bottom);
+        }
+
+        public void setScrollCaptureCallbackInternalForTest(ScrollCaptureCallback internal) {
+            mInternalCallback = internal;
+        }
+
+        void assertDispatchScrollCaptureSearchCount(int count) {
+            assertEquals("Unexpected number of calls to dispatchScrollCaptureSearch",
+                    count, mDispatchScrollCaptureSearchNumCalls);
+        }
+
+        @Override
+        @Nullable
+        public ScrollCaptureCallback createScrollCaptureCallbackInternal(Rect localVisibleRect,
+                Point offsetInWindow) {
+            mCreateScrollCaptureCallbackInternalCount++;
+            return mInternalCallback;
+        }
+
+        @Override
+        protected void onLayout(boolean changed, int l, int t, int r, int b) {
+            // We don't layout this view.
+        }
+
+        void assertDispatchScrollCaptureCount(int count) {
+            assertEquals(count, mDispatchScrollCaptureSearchNumCalls);
+        }
+
+        void assertLastDispatchScrollCaptureArgs(Rect localVisibleRect, Point windowOffset) {
+            assertEquals("arg localVisibleRect to dispatchScrollCaptureCallback was incorrect.",
+                    localVisibleRect, mDispatchScrollCaptureSearchLastLocalVisibleRect);
+            assertEquals("arg windowOffset to dispatchScrollCaptureCallback was incorrect.",
+                    windowOffset, mDispatchScrollCaptureSearchLastWindowOffset);
+        }
+        void assertCreateScrollCaptureCallbackInternalCount(int count) {
+            assertEquals("Unexpected number of calls to createScrollCaptureCallackInternal",
+                    count, mCreateScrollCaptureCallbackInternalCount);
+        }
+
+        void reset() {
+            mDispatchScrollCaptureSearchNumCalls = 0;
+            mDispatchScrollCaptureSearchLastWindowOffset = null;
+            mDispatchScrollCaptureSearchLastLocalVisibleRect = null;
+            mCreateScrollCaptureCallbackInternalCount = 0;
+        }
+
+        @Override
+        public void dispatchScrollCaptureSearch(Rect localVisibleRect, Point windowOffset,
+                Queue<ScrollCaptureTarget> targets) {
+            mDispatchScrollCaptureSearchNumCalls++;
+            mDispatchScrollCaptureSearchLastLocalVisibleRect = new Rect(localVisibleRect);
+            mDispatchScrollCaptureSearchLastWindowOffset = new Point(windowOffset);
+            super.dispatchScrollCaptureSearch(localVisibleRect, windowOffset, targets);
+        }
+    }
+}
diff --git a/core/tests/coretests/src/android/widget/EditorCursorDragTest.java b/core/tests/coretests/src/android/widget/EditorCursorDragTest.java
index a9f251e..89cc6e7 100644
--- a/core/tests/coretests/src/android/widget/EditorCursorDragTest.java
+++ b/core/tests/coretests/src/android/widget/EditorCursorDragTest.java
@@ -528,6 +528,47 @@
     }
 
     @Test
+    public void testCursorDrag_multiTouch() throws Throwable {
+        String text = "line1: This is the 1st line: A";
+        onView(withId(R.id.textview)).perform(replaceText(text));
+        TextView tv = mActivity.findViewById(R.id.textview);
+        Editor editor = tv.getEditorForTesting();
+        final int startIndex = text.indexOf("1st line");
+        Layout layout = tv.getLayout();
+        final float cursorStartX =
+                layout.getPrimaryHorizontal(startIndex) + tv.getTotalPaddingLeft();
+        final float cursorStartY = layout.getLineTop(1) + tv.getTotalPaddingTop();
+
+        // Taps to show the insertion handle.
+        tapAtPoint(tv, cursorStartX, cursorStartY);
+        onView(withId(R.id.textview)).check(hasInsertionPointerAtIndex(startIndex));
+        View handleView = editor.getInsertionController().getHandle();
+
+        // Taps & holds the insertion handle.
+        long handleDownTime = sTicker.addAndGet(10_000);
+        long eventTime = handleDownTime;
+        dispatchTouchEvent(handleView, downEvent(handleView, handleDownTime, eventTime++, 0, 0));
+
+        // Tries to Drag the cursor, with the pointer id > 0 (meaning the 2nd finger).
+        long cursorDownTime = eventTime++;
+        dispatchTouchEvent(tv, obtainTouchEventWithPointerId(
+                tv, MotionEvent.ACTION_DOWN, cursorDownTime, eventTime++, 1,
+                cursorStartX - 50, cursorStartY));
+        dispatchTouchEvent(tv, obtainTouchEventWithPointerId(
+                tv, MotionEvent.ACTION_MOVE, cursorDownTime, eventTime++, 1,
+                cursorStartX - 100, cursorStartY));
+        dispatchTouchEvent(tv, obtainTouchEventWithPointerId(
+                tv, MotionEvent.ACTION_UP, cursorDownTime, eventTime++, 1,
+                cursorStartX - 100, cursorStartY));
+
+        // Checks the cursor drag doesn't work while the handle is being hold.
+        onView(withId(R.id.textview)).check(hasInsertionPointerAtIndex(startIndex));
+
+        // Finger up on the  insertion handle.
+        dispatchTouchEvent(handleView, upEvent(handleView, handleDownTime, eventTime, 0, 0));
+    }
+
+    @Test
     public void testCursorDrag_snapDistance() throws Throwable {
         String text = "line1: This is the 1st line: A\n"
                 + "line2: This is the 2nd line: B\n"
@@ -626,6 +667,24 @@
         return event;
     }
 
+    private MotionEvent obtainTouchEventWithPointerId(
+            View view, int action, long downTime, long eventTime, int pointerId, float x, float y) {
+        Rect r = new Rect();
+        view.getBoundsOnScreen(r);
+        float rawX = x + r.left;
+        float rawY = y + r.top;
+        MotionEvent.PointerCoords coordinates = new MotionEvent.PointerCoords();
+        coordinates.x = rawX;
+        coordinates.y = rawY;
+        MotionEvent event = MotionEvent.obtain(
+                downTime, eventTime, action, 1, new int[] {pointerId},
+                new MotionEvent.PointerCoords[] {coordinates},
+                0, 1f, 1f, 0, 0, 0, 0);
+        view.toLocalMotionEvent(event);
+        mMotionEvents.add(event);
+        return event;
+    }
+
     private MotionEvent obtainMouseEvent(
             View view, int action, long downTime, long eventTime, float x, float y) {
         MotionEvent event = obtainTouchEvent(view, action, downTime, eventTime, x, y);
diff --git a/core/tests/coretests/src/com/android/internal/accessibility/AccessibilityShortcutControllerTest.java b/core/tests/coretests/src/com/android/internal/accessibility/AccessibilityShortcutControllerTest.java
index 4a33da6..b21504c 100644
--- a/core/tests/coretests/src/com/android/internal/accessibility/AccessibilityShortcutControllerTest.java
+++ b/core/tests/coretests/src/com/android/internal/accessibility/AccessibilityShortcutControllerTest.java
@@ -462,6 +462,7 @@
         configureValidShortcutService();
         configureApplicationTargetSdkVersion(Build.VERSION_CODES.R);
         configureRequestAccessibilityButton();
+        configureEnabledService();
         Settings.Secure.putInt(mContentResolver, ACCESSIBILITY_SHORTCUT_DIALOG_SHOWN, 1);
         getController().performAccessibilityShortcut();
 
@@ -610,6 +611,11 @@
         }).when(mHandler).sendMessageAtTime(any(), anyLong());
     }
 
+    private void configureEnabledService() throws Exception {
+        when(mAccessibilityManagerService.getEnabledAccessibilityServiceList(anyInt(), anyInt()))
+                .thenReturn(Collections.singletonList(mServiceInfo));
+    }
+
     private AccessibilityShortcutController getController() {
         AccessibilityShortcutController accessibilityShortcutController =
                 new AccessibilityShortcutController(mContext, mHandler, 0);
diff --git a/core/tests/coretests/src/com/android/internal/app/IntentForwarderActivityTest.java b/core/tests/coretests/src/com/android/internal/app/IntentForwarderActivityTest.java
index 8cf146e..43590ba 100644
--- a/core/tests/coretests/src/com/android/internal/app/IntentForwarderActivityTest.java
+++ b/core/tests/coretests/src/com/android/internal/app/IntentForwarderActivityTest.java
@@ -68,6 +68,8 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.TimeUnit;
 
 @RunWith(AndroidJUnit4.class)
 public class IntentForwarderActivityTest {
@@ -213,13 +215,9 @@
     }
 
     @Test
-    public void forwardToManagedProfile_canForward_chooserIntent() throws Exception {
+    public void launchInSameProfile_chooserIntent() {
         sComponentName = FORWARD_TO_MANAGED_PROFILE_COMPONENT_NAME;
 
-        // Intent can be forwarded.
-        when(mIPm.canForwardTo(
-                any(Intent.class), nullable(String.class), anyInt(), anyInt())).thenReturn(true);
-
         // Manage profile exists.
         List<UserInfo> profiles = new ArrayList<>();
         profiles.add(CURRENT_USER_INFO);
@@ -235,10 +233,6 @@
         intent.putExtra(Intent.EXTRA_INTENT, sendIntent);
         IntentForwarderWrapperActivity activity = mActivityRule.launchActivity(intent);
 
-        ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
-        verify(mIPm).canForwardTo(intentCaptor.capture(), eq(TYPE_PLAIN_TEXT), anyInt(), anyInt());
-        assertEquals(Intent.ACTION_SEND, intentCaptor.getValue().getAction());
-
         assertNotNull(activity.mStartActivityIntent);
         assertEquals(Intent.ACTION_CHOOSER, activity.mStartActivityIntent.getAction());
         assertNull(activity.mStartActivityIntent.getPackage());
@@ -249,9 +243,9 @@
         assertEquals(Intent.ACTION_SEND, innerIntent.getAction());
         assertNull(innerIntent.getComponent());
         assertNull(innerIntent.getPackage());
-        assertEquals(CURRENT_USER_INFO.id, innerIntent.getContentUserHint());
+        assertEquals(UserHandle.USER_CURRENT, innerIntent.getContentUserHint());
 
-        assertEquals(MANAGED_PROFILE_INFO.id, activity.mUserIdActivityLaunchedIn);
+        assertEquals(CURRENT_USER_INFO.id, activity.mUserIdActivityLaunchedIn);
     }
 
     @Test
@@ -641,6 +635,11 @@
         public void onCreate(@Nullable Bundle savedInstanceState) {
             getIntent().setComponent(sComponentName);
             super.onCreate(savedInstanceState);
+            try {
+                mExecutorService.awaitTermination(/* timeout= */ 30, TimeUnit.SECONDS);
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
         }
 
         @Override
@@ -679,7 +678,8 @@
         }
 
         @Override
-        public ResolveInfo resolveActivityAsUser(Intent intent, int flags, int userId) {
+        public CompletableFuture<ResolveInfo> resolveActivityAsUser(
+                Intent intent, int flags, int userId) {
             ActivityInfo activityInfo = new ActivityInfo();
             activityInfo.packageName = sPackageName;
             activityInfo.name = sActivityName;
@@ -688,7 +688,7 @@
             ResolveInfo resolveInfo = new ResolveInfo();
             resolveInfo.activityInfo = activityInfo;
 
-            return resolveInfo;
+            return CompletableFuture.completedFuture(resolveInfo);
         }
 
         @Override
diff --git a/core/tests/coretests/src/com/android/internal/app/ResolverActivityTest.java b/core/tests/coretests/src/com/android/internal/app/ResolverActivityTest.java
index eb39d58..07aa654 100644
--- a/core/tests/coretests/src/com/android/internal/app/ResolverActivityTest.java
+++ b/core/tests/coretests/src/com/android/internal/app/ResolverActivityTest.java
@@ -38,13 +38,16 @@
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.when;
+import static org.testng.Assert.assertFalse;
 
 import android.content.Intent;
 import android.content.pm.ResolveInfo;
+import android.net.Uri;
 import android.os.UserHandle;
 import android.text.TextUtils;
 import android.view.View;
 import android.widget.RelativeLayout;
+import android.widget.TextView;
 
 import androidx.test.InstrumentationRegistry;
 import androidx.test.espresso.Espresso;
@@ -543,6 +546,51 @@
         assertThat(activity.getWorkListAdapter().getCount(), is(4));
     }
 
+    @Test
+    public void testWorkTab_headerIsVisibleInPersonalTab() {
+        // enable the work tab feature flag
+        ResolverActivity.ENABLE_TABBED_VIEW = true;
+        markWorkProfileUserAvailable();
+        List<ResolvedComponentInfo> personalResolvedComponentInfos =
+                createResolvedComponentsForTestWithOtherProfile(1);
+        List<ResolvedComponentInfo> workResolvedComponentInfos = createResolvedComponentsForTest(4);
+        setupResolverControllers(personalResolvedComponentInfos, workResolvedComponentInfos);
+        Intent sendIntent = createOpenWebsiteIntent();
+
+        final ResolverWrapperActivity activity = mActivityRule.launchActivity(sendIntent);
+        waitForIdle();
+        TextView headerText = activity.findViewById(R.id.title);
+        String initialText = headerText.getText().toString();
+        assertFalse(initialText.isEmpty(), "Header text is empty.");
+        assertThat(headerText.getVisibility(), is(View.VISIBLE));
+    }
+
+    @Test
+    public void testWorkTab_switchTabs_headerStaysSame() {
+        // enable the work tab feature flag
+        ResolverActivity.ENABLE_TABBED_VIEW = true;
+        markWorkProfileUserAvailable();
+        List<ResolvedComponentInfo> personalResolvedComponentInfos =
+                createResolvedComponentsForTestWithOtherProfile(1);
+        List<ResolvedComponentInfo> workResolvedComponentInfos = createResolvedComponentsForTest(4);
+        setupResolverControllers(personalResolvedComponentInfos, workResolvedComponentInfos);
+        Intent sendIntent = createOpenWebsiteIntent();
+
+        final ResolverWrapperActivity activity = mActivityRule.launchActivity(sendIntent);
+        waitForIdle();
+        TextView headerText = activity.findViewById(R.id.title);
+        String initialText = headerText.getText().toString();
+        onView(withText(R.string.resolver_work_tab))
+                .perform(click());
+
+        waitForIdle();
+        String currentText = headerText.getText().toString();
+        assertThat(headerText.getVisibility(), is(View.VISIBLE));
+        assertThat(String.format("Header text is not the same when switching tabs, personal profile"
+                        + " header was %s but work profile header is %s", initialText, currentText),
+                TextUtils.equals(initialText, currentText));
+    }
+
     @Ignore // b/148156663
     @Test
     public void testWorkTab_noPersonalApps_canStartWorkApps()
@@ -761,6 +809,13 @@
         return sendIntent;
     }
 
+    private Intent createOpenWebsiteIntent() {
+        Intent sendIntent = new Intent();
+        sendIntent.setAction(Intent.ACTION_VIEW);
+        sendIntent.setData(Uri.parse("https://google.com"));
+        return sendIntent;
+    }
+
     private List<ResolvedComponentInfo> createResolvedComponentsForTest(int numberOfResults) {
         List<ResolvedComponentInfo> infoList = new ArrayList<>(numberOfResults);
         for (int i = 0; i < numberOfResults; i++) {
diff --git a/core/tests/coretests/src/com/android/internal/view/ScrollViewCaptureHelperTest.java b/core/tests/coretests/src/com/android/internal/view/ScrollViewCaptureHelperTest.java
new file mode 100644
index 0000000..63a68e9
--- /dev/null
+++ b/core/tests/coretests/src/com/android/internal/view/ScrollViewCaptureHelperTest.java
@@ -0,0 +1,352 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.view;
+
+import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
+import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
+import static android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
+import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
+
+import static androidx.test.InstrumentationRegistry.getContext;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import android.graphics.Color;
+import android.graphics.PixelFormat;
+import android.graphics.Rect;
+import android.view.Gravity;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.WindowManager;
+import android.widget.FrameLayout;
+import android.widget.LinearLayout;
+import android.widget.ScrollView;
+import android.widget.TextView;
+
+import androidx.test.annotation.UiThreadTest;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import java.util.Random;
+
+public class ScrollViewCaptureHelperTest {
+
+    private FrameLayout mParent;
+    private ScrollView mTarget;
+    private LinearLayout mContent;
+    private WindowManager mWm;
+
+    private WindowManager.LayoutParams mWindowLayoutParams;
+
+    private static final int CHILD_VIEWS = 12;
+    public static final int CHILD_VIEW_HEIGHT = 300;
+
+    private static final int WINDOW_WIDTH = 800;
+    private static final int WINDOW_HEIGHT = 1200;
+
+    private static final int CAPTURE_HEIGHT = 600;
+
+    private Random mRandom;
+
+    private static float sDensity;
+
+    @BeforeClass
+    public static void setUpClass() {
+        sDensity = getContext().getResources().getDisplayMetrics().density;
+    }
+
+    @Before
+    @UiThreadTest
+    public void setUp() {
+        mRandom = new Random();
+        mParent = new FrameLayout(getContext());
+
+        mTarget = new ScrollView(getContext());
+        mParent.addView(mTarget, new ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT));
+
+        mContent = new LinearLayout(getContext());
+        mContent.setOrientation(LinearLayout.VERTICAL);
+        mTarget.addView(mContent, new ViewGroup.LayoutParams(MATCH_PARENT, WRAP_CONTENT));
+
+        for (int i = 0; i < CHILD_VIEWS; i++) {
+            TextView view = new TextView(getContext());
+            view.setText("Child #" + i);
+            view.setTextColor(Color.WHITE);
+            view.setTextSize(30f);
+            view.setBackgroundColor(Color.rgb(mRandom.nextFloat(), mRandom.nextFloat(),
+                    mRandom.nextFloat()));
+            mContent.addView(view, new ViewGroup.LayoutParams(MATCH_PARENT, CHILD_VIEW_HEIGHT));
+        }
+
+        // Window -> Parent -> Target -> Content
+
+        mWm = getContext().getSystemService(WindowManager.class);
+
+        // Setup the window that we are going to use
+        mWindowLayoutParams = new WindowManager.LayoutParams(WINDOW_WIDTH, WINDOW_HEIGHT,
+                TYPE_APPLICATION_OVERLAY, FLAG_NOT_TOUCHABLE, PixelFormat.OPAQUE);
+        mWindowLayoutParams.setTitle("ScrollViewCaptureHelper");
+        mWindowLayoutParams.gravity = Gravity.CENTER;
+        mWm.addView(mParent, mWindowLayoutParams);
+    }
+
+    @After
+    @UiThreadTest
+    public void tearDown() {
+        mWm.removeViewImmediate(mParent);
+    }
+
+    @Test
+    @UiThreadTest
+    public void onPrepareForStart() {
+        ScrollViewCaptureHelper svc = new ScrollViewCaptureHelper();
+        Rect scrollBounds = svc.onComputeScrollBounds(mTarget);
+        svc.onPrepareForStart(mTarget, scrollBounds);
+    }
+
+    static void assertEmpty(Rect r) {
+        if (r != null && !r.isEmpty()) {
+            fail("Not true that " + r + " is empty");
+        }
+    }
+
+    static void assertContains(Rect parent, Rect child) {
+        if (!parent.contains(child)) {
+            fail("Not true that " + parent + " contains " + child);
+        }
+    }
+
+    static void assertRectEquals(Rect parent, Rect child) {
+        if (!parent.equals(child)) {
+            fail("Not true that " + parent + " is equal to " + child);
+        }
+    }
+
+    static Rect getVisibleRect(View v) {
+        Rect r = new Rect(0, 0, v.getWidth(), v.getHeight());
+        v.getLocalVisibleRect(r);
+        return r;
+    }
+
+
+    static int assertScrollToY(View v, int scrollY) {
+        v.scrollTo(0, scrollY);
+        int dest = v.getScrollY();
+        assertEquals(scrollY, dest);
+        return scrollY;
+    }
+
+
+    static void assertCapturedAreaCompletelyVisible(int startScrollY, Rect requestRect,
+            Rect localVisibleNow) {
+        Rect captured = new Rect(localVisibleNow);
+        captured.offset(0, -startScrollY); // make relative
+
+        if (!captured.contains(requestRect)) {
+            fail("Not true that all of " + requestRect + " is contained by " + captured);
+        }
+    }
+    static void assertCapturedAreaPartiallyVisible(int startScrollY, Rect requestRect,
+            Rect localVisibleNow) {
+        Rect captured = new Rect(localVisibleNow);
+        captured.offset(0, -startScrollY); // make relative
+
+        if (!Rect.intersects(captured, requestRect)) {
+            fail("Not true that any of " + requestRect + " intersects " + captured);
+        }
+    }
+
+    @Test
+    @UiThreadTest
+    public void onScrollRequested_up_fromTop() {
+        final int startScrollY = assertScrollToY(mTarget, 0);
+
+        ScrollViewCaptureHelper svc = new ScrollViewCaptureHelper();
+        Rect scrollBounds = svc.onComputeScrollBounds(mTarget);
+        svc.onPrepareForStart(mTarget, scrollBounds);
+
+        assertTrue(scrollBounds.height() > CAPTURE_HEIGHT);
+
+        Rect request = new Rect(0, -CAPTURE_HEIGHT, scrollBounds.width(), 0);
+
+        Rect result = svc.onScrollRequested(mTarget, scrollBounds, request);
+
+        // The result is an empty rectangle and no scrolling, since it
+        // is not possible to physically scroll further up to make the
+        // requested area visible at all (it doesn't exist).
+        assertEmpty(result);
+    }
+
+    @Test
+    @UiThreadTest
+    public void onScrollRequested_down_fromTop() {
+        final int startScrollY = assertScrollToY(mTarget, 0);
+
+
+        ScrollViewCaptureHelper svc = new ScrollViewCaptureHelper();
+        Rect scrollBounds = svc.onComputeScrollBounds(mTarget);
+        svc.onPrepareForStart(mTarget, scrollBounds);
+
+        assertTrue(scrollBounds.height() > CAPTURE_HEIGHT);
+
+        // Capture between y = +1200 to +1500 pixels BELOW current top
+        Rect request = new Rect(0, WINDOW_HEIGHT, scrollBounds.width(),
+                WINDOW_HEIGHT + CAPTURE_HEIGHT);
+
+        Rect result = svc.onScrollRequested(mTarget, scrollBounds, request);
+        assertRectEquals(request, result);
+
+        assertCapturedAreaCompletelyVisible(startScrollY, request, getVisibleRect(mContent));
+    }
+
+
+    @Test
+    @UiThreadTest
+    public void onScrollRequested_up_fromMiddle() {
+        final int startScrollY = assertScrollToY(mTarget, WINDOW_HEIGHT);
+
+        ScrollViewCaptureHelper svc = new ScrollViewCaptureHelper();
+        Rect scrollBounds = svc.onComputeScrollBounds(mTarget);
+        svc.onPrepareForStart(mTarget, scrollBounds);
+
+        Rect request = new Rect(0, -CAPTURE_HEIGHT, scrollBounds.width(), 0);
+
+
+        Rect result = svc.onScrollRequested(mTarget, scrollBounds, request);
+
+        assertRectEquals(request, result);
+
+        assertCapturedAreaCompletelyVisible(startScrollY, request, getVisibleRect(mContent));
+    }
+
+    @Test
+    @UiThreadTest
+    public void onScrollRequested_down_fromMiddle() {
+        final int startScrollY = assertScrollToY(mTarget, WINDOW_HEIGHT);
+
+        ScrollViewCaptureHelper svc = new ScrollViewCaptureHelper();
+        Rect scrollBounds = svc.onComputeScrollBounds(mTarget);
+        svc.onPrepareForStart(mTarget, scrollBounds);
+
+        Rect request = new Rect(0, WINDOW_HEIGHT, scrollBounds.width(),
+                WINDOW_HEIGHT + CAPTURE_HEIGHT);
+
+        Rect result = svc.onScrollRequested(mTarget, scrollBounds, request);
+        assertRectEquals(request, result);
+
+        assertCapturedAreaCompletelyVisible(startScrollY, request, getVisibleRect(mContent));
+    }
+
+    @Test
+    @UiThreadTest
+    public void onScrollRequested_up_fromBottom() {
+        final int startScrollY = assertScrollToY(mTarget, WINDOW_HEIGHT * 2);
+
+        ScrollViewCaptureHelper svc = new ScrollViewCaptureHelper();
+        Rect scrollBounds = svc.onComputeScrollBounds(mTarget);
+        svc.onPrepareForStart(mTarget, scrollBounds);
+
+        Rect request = new Rect(0, -CAPTURE_HEIGHT, scrollBounds.width(), 0);
+
+        Rect result = svc.onScrollRequested(mTarget, scrollBounds, request);
+        assertRectEquals(request, result);
+
+        assertCapturedAreaCompletelyVisible(startScrollY, request, getVisibleRect(mContent));
+    }
+
+    @Test
+    @UiThreadTest
+    public void onScrollRequested_down_fromBottom() {
+        final int startScrollY = assertScrollToY(mTarget, WINDOW_HEIGHT * 2);
+
+        ScrollViewCaptureHelper svc = new ScrollViewCaptureHelper();
+        Rect scrollBounds = svc.onComputeScrollBounds(mTarget);
+        svc.onPrepareForStart(mTarget, scrollBounds);
+
+        Rect request = new Rect(0, WINDOW_HEIGHT, scrollBounds.width(),
+                WINDOW_HEIGHT + CAPTURE_HEIGHT);
+
+        Rect result = svc.onScrollRequested(mTarget, scrollBounds, request);
+
+        // The result is an empty rectangle and no scrolling, since it
+        // is not possible to physically scroll further down to make the
+        // requested area visible at all (it doesn't exist).
+        assertEmpty(result);
+    }
+
+    @Test
+    @UiThreadTest
+    public void onScrollRequested_offTopEdge() {
+        final int startScrollY = assertScrollToY(mTarget, 0);
+
+        ScrollViewCaptureHelper svc = new ScrollViewCaptureHelper();
+        Rect scrollBounds = svc.onComputeScrollBounds(mTarget);
+        svc.onPrepareForStart(mTarget, scrollBounds);
+
+        // Create a request which lands halfway off the top of the content
+        //from -1500 to -900, (starting at 1200 = -300 to +300 within the content)
+        int top = 0;
+        Rect request = new Rect(
+                0, top - (CAPTURE_HEIGHT / 2),
+                scrollBounds.width(), top + (CAPTURE_HEIGHT / 2));
+
+        Rect result = svc.onScrollRequested(mTarget, scrollBounds, request);
+        // The result is a partial result
+        Rect expectedResult = new Rect(request);
+        expectedResult.top += 300; // top half clipped
+        assertRectEquals(expectedResult, result);
+        assertCapturedAreaPartiallyVisible(startScrollY, request, getVisibleRect(mContent));
+    }
+
+    @Test
+    @UiThreadTest
+    public void onScrollRequested_offBottomEdge() {
+        final int startScrollY = assertScrollToY(mTarget, WINDOW_HEIGHT * 2); // 2400
+
+        ScrollViewCaptureHelper svc = new ScrollViewCaptureHelper();
+        Rect scrollBounds = svc.onComputeScrollBounds(mTarget);
+        svc.onPrepareForStart(mTarget, scrollBounds);
+
+        // Create a request which lands halfway off the bottom of the content
+        //from 600 to to 1200, (starting at 2400 = 3000 to  3600 within the content)
+
+        int bottom = WINDOW_HEIGHT;
+        Rect request = new Rect(
+                0, bottom - (CAPTURE_HEIGHT / 2),
+                scrollBounds.width(), bottom + (CAPTURE_HEIGHT / 2));
+
+        Rect result = svc.onScrollRequested(mTarget, scrollBounds, request);
+
+        Rect expectedResult = new Rect(request);
+        expectedResult.bottom -= 300; // bottom half clipped
+        assertRectEquals(expectedResult, result);
+        assertCapturedAreaPartiallyVisible(startScrollY, request, getVisibleRect(mContent));
+
+    }
+
+    @Test
+    @UiThreadTest
+    public void onPrepareForEnd() {
+        ScrollViewCaptureHelper svc = new ScrollViewCaptureHelper();
+        svc.onPrepareForEnd(mTarget);
+    }
+}
diff --git a/core/tests/overlaytests/host/TEST_MAPPING b/core/tests/overlaytests/host/TEST_MAPPING
new file mode 100644
index 0000000..e0c03e0
--- /dev/null
+++ b/core/tests/overlaytests/host/TEST_MAPPING
@@ -0,0 +1,7 @@
+{
+  "presubmit": [
+    {
+      "name" : "OverlayHostTests"
+    }
+  ]
+}
\ No newline at end of file
diff --git a/core/tests/screenshothelpertests/src/com/android/internal/util/ScreenshotHelperTest.java b/core/tests/screenshothelpertests/src/com/android/internal/util/ScreenshotHelperTest.java
index cd6b3af..fe33cd8 100644
--- a/core/tests/screenshothelpertests/src/com/android/internal/util/ScreenshotHelperTest.java
+++ b/core/tests/screenshothelpertests/src/com/android/internal/util/ScreenshotHelperTest.java
@@ -36,6 +36,7 @@
 import android.graphics.Rect;
 import android.os.Handler;
 import android.os.Looper;
+import android.view.WindowManager;
 
 import androidx.test.runner.AndroidJUnit4;
 
@@ -91,7 +92,8 @@
     public void testProvidedImageScreenshot() {
         mScreenshotHelper.provideScreenshot(
                 Bitmap.createBitmap(10, 10, Bitmap.Config.ARGB_8888), new Rect(),
-                Insets.of(0, 0, 0, 0), 1, mHandler, null);
+                Insets.of(0, 0, 0, 0), 1,
+                WindowManager.ScreenshotSource.SCREENSHOT_OTHER, mHandler, null);
     }
 
     @Test
diff --git a/data/etc/services.core.protolog.json b/data/etc/services.core.protolog.json
index 18086ec..c5ac451 100644
--- a/data/etc/services.core.protolog.json
+++ b/data/etc/services.core.protolog.json
@@ -283,6 +283,12 @@
       "group": "WM_DEBUG_APP_TRANSITIONS",
       "at": "com\/android\/server\/wm\/ActivityRecord.java"
     },
+    "-1517908912": {
+      "message": "requestScrollCapture: caught exception dispatching to window.token=%s",
+      "level": "WARN",
+      "group": "WM_ERROR",
+      "at": "com\/android\/server\/wm\/WindowManagerService.java"
+    },
     "-1515151503": {
       "message": ">>> OPEN TRANSACTION removeReplacedWindows",
       "level": "INFO",
@@ -1441,6 +1447,12 @@
       "group": "WM_DEBUG_RECENTS_ANIMATIONS",
       "at": "com\/android\/server\/wm\/RecentsAnimation.java"
     },
+    "646981048": {
+      "message": "Invalid displayId for requestScrollCapture: %d",
+      "level": "ERROR",
+      "group": "WM_ERROR",
+      "at": "com\/android\/server\/wm\/WindowManagerService.java"
+    },
     "662572728": {
       "message": "Attempted to add a toast window with bad token %s.  Aborting.",
       "level": "WARN",
@@ -1597,6 +1609,12 @@
       "group": "WM_ERROR",
       "at": "com\/android\/server\/wm\/WindowManagerService.java"
     },
+    "1046922686": {
+      "message": "requestScrollCapture: caught exception dispatching callback: %s",
+      "level": "WARN",
+      "group": "WM_ERROR",
+      "at": "com\/android\/server\/wm\/WindowManagerService.java"
+    },
     "1051545910": {
       "message": "Exit animation finished in %s: remove=%b",
       "level": "VERBOSE",
diff --git a/data/keyboards/Vendor_18d1_Product_0200.kcm b/data/keyboards/Vendor_18d1_Product_0200.kcm
new file mode 100644
index 0000000..231fac6
--- /dev/null
+++ b/data/keyboards/Vendor_18d1_Product_0200.kcm
@@ -0,0 +1,48 @@
+# Copyright (C) 2020 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+type FULL
+
+key BUTTON_A {
+    base:                               fallback DPAD_CENTER
+}
+
+key BUTTON_B {
+    base:                               fallback BACK
+}
+
+key BUTTON_X {
+    base:                               fallback DPAD_CENTER
+}
+
+key BUTTON_Y {
+    base:                               fallback BACK
+}
+
+key BUTTON_THUMBL {
+    base:                               fallback DPAD_CENTER
+}
+
+key BUTTON_THUMBR {
+    base:                               fallback DPAD_CENTER
+}
+
+key BUTTON_SELECT {
+    base:                               fallback MENU
+}
+
+key BUTTON_MODE {
+    base:                               fallback MENU
+}
+
diff --git a/data/keyboards/Vendor_18d1_Product_0200.kl b/data/keyboards/Vendor_18d1_Product_0200.kl
new file mode 100644
index 0000000..d30bcc6
--- /dev/null
+++ b/data/keyboards/Vendor_18d1_Product_0200.kl
@@ -0,0 +1,71 @@
+# Copyright (C) 2020 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+#
+# Keyboard map for the android virtual remote running as a gamepad
+#
+
+key 0x130 BUTTON_A
+key 0x131 BUTTON_B
+key 0x133 BUTTON_X
+key 0x134 BUTTON_Y
+
+key 0x136 BUTTON_L2
+key 0x137 BUTTON_R2
+key 0x138 BUTTON_L1
+key 0x139 BUTTON_R1
+
+key 0x13a BUTTON_SELECT
+key 0x13b BUTTON_START
+key 0x13c BUTTON_MODE
+
+key 0x13d BUTTON_THUMBL
+key 0x13e BUTTON_THUMBR
+
+key 103 DPAD_UP
+key 108 DPAD_DOWN
+key 105 DPAD_LEFT
+key 106 DPAD_RIGHT
+
+# Generic usage buttons
+key 0x2c0 BUTTON_1
+key 0x2c1 BUTTON_2
+key 0x2c2 BUTTON_3
+key 0x2c3 BUTTON_4
+key 0x2c4 BUTTON_5
+key 0x2c5 BUTTON_6
+key 0x2c6 BUTTON_7
+key 0x2c7 BUTTON_8
+key 0x2c8 BUTTON_9
+key 0x2c9 BUTTON_10
+key 0x2ca BUTTON_11
+key 0x2cb BUTTON_12
+key 0x2cc BUTTON_13
+key 0x2cd BUTTON_14
+key 0x2ce BUTTON_15
+key 0x2cf BUTTON_16
+
+# assistant buttons
+key 0x246 VOICE_ASSIST
+key 0x247 ASSIST
+
+axis 0x00 X
+axis 0x01 Y
+axis 0x02 Z
+axis 0x05 RZ
+axis 0x09 RTRIGGER
+axis 0x0a LTRIGGER
+axis 0x10 HAT_X
+axis 0x11 HAT_Y
+
diff --git a/graphics/java/android/graphics/ColorSpace.java b/graphics/java/android/graphics/ColorSpace.java
index ce8ff7d..1aeafa3 100644
--- a/graphics/java/android/graphics/ColorSpace.java
+++ b/graphics/java/android/graphics/ColorSpace.java
@@ -199,6 +199,11 @@
 
     private static final float[] SRGB_PRIMARIES = { 0.640f, 0.330f, 0.300f, 0.600f, 0.150f, 0.060f };
     private static final float[] NTSC_1953_PRIMARIES = { 0.67f, 0.33f, 0.21f, 0.71f, 0.14f, 0.08f };
+    /**
+     * A gray color space does not have meaningful primaries, so we use this arbitrary set.
+     */
+    private static final float[] GRAY_PRIMARIES = { 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f };
+
     private static final float[] ILLUMINANT_D50_XYZ = { 0.964212f, 1.0f, 0.825188f };
 
     private static final Rgb.TransferParameters SRGB_TRANSFER_PARAMETERS =
@@ -1457,6 +1462,7 @@
                 "sRGB IEC61966-2.1",
                 SRGB_PRIMARIES,
                 ILLUMINANT_D65,
+                null,
                 SRGB_TRANSFER_PARAMETERS,
                 Named.SRGB.ordinal()
         );
@@ -1491,6 +1497,7 @@
                 "Rec. ITU-R BT.709-5",
                 new float[] { 0.640f, 0.330f, 0.300f, 0.600f, 0.150f, 0.060f },
                 ILLUMINANT_D65,
+                null,
                 new Rgb.TransferParameters(1 / 1.099, 0.099 / 1.099, 1 / 4.5, 0.081, 1 / 0.45),
                 Named.BT709.ordinal()
         );
@@ -1498,6 +1505,7 @@
                 "Rec. ITU-R BT.2020-1",
                 new float[] { 0.708f, 0.292f, 0.170f, 0.797f, 0.131f, 0.046f },
                 ILLUMINANT_D65,
+                null,
                 new Rgb.TransferParameters(1 / 1.0993, 0.0993 / 1.0993, 1 / 4.5, 0.08145, 1 / 0.45),
                 Named.BT2020.ordinal()
         );
@@ -1513,6 +1521,7 @@
                 "Display P3",
                 new float[] { 0.680f, 0.320f, 0.265f, 0.690f, 0.150f, 0.060f },
                 ILLUMINANT_D65,
+                null,
                 SRGB_TRANSFER_PARAMETERS,
                 Named.DISPLAY_P3.ordinal()
         );
@@ -1520,6 +1529,7 @@
                 "NTSC (1953)",
                 NTSC_1953_PRIMARIES,
                 ILLUMINANT_C,
+                null,
                 new Rgb.TransferParameters(1 / 1.099, 0.099 / 1.099, 1 / 4.5, 0.081, 1 / 0.45),
                 Named.NTSC_1953.ordinal()
         );
@@ -1527,6 +1537,7 @@
                 "SMPTE-C RGB",
                 new float[] { 0.630f, 0.340f, 0.310f, 0.595f, 0.155f, 0.070f },
                 ILLUMINANT_D65,
+                null,
                 new Rgb.TransferParameters(1 / 1.099, 0.099 / 1.099, 1 / 4.5, 0.081, 1 / 0.45),
                 Named.SMPTE_C.ordinal()
         );
@@ -1542,6 +1553,7 @@
                 "ROMM RGB ISO 22028-2:2013",
                 new float[] { 0.7347f, 0.2653f, 0.1596f, 0.8404f, 0.0366f, 0.0001f },
                 ILLUMINANT_D50,
+                null,
                 new Rgb.TransferParameters(1.0, 0.0, 1 / 16.0, 0.031248, 1.8),
                 Named.PRO_PHOTO_RGB.ordinal()
         );
@@ -2471,7 +2483,11 @@
                 @NonNull @Size(min = 1) String name,
                 @NonNull @Size(9) float[] toXYZ,
                 @NonNull TransferParameters function) {
-            this(name, computePrimaries(toXYZ), computeWhitePoint(toXYZ), function, MIN_ID);
+            // Note: when isGray() returns false, this passes null for the transform for
+            // consistency with other constructors, which compute the transform from the primaries
+            // and white point.
+            this(name, isGray(toXYZ) ? GRAY_PRIMARIES : computePrimaries(toXYZ),
+                    computeWhitePoint(toXYZ), isGray(toXYZ) ? toXYZ : null, function, MIN_ID);
         }
 
         /**
@@ -2511,7 +2527,7 @@
                 @NonNull @Size(min = 6, max = 9) float[] primaries,
                 @NonNull @Size(min = 2, max = 3) float[] whitePoint,
                 @NonNull TransferParameters function) {
-            this(name, primaries, whitePoint, function, MIN_ID);
+            this(name, primaries, whitePoint, null, function, MIN_ID);
         }
 
         /**
@@ -2534,6 +2550,8 @@
          * @param name Name of the color space, cannot be null, its length must be >= 1
          * @param primaries RGB primaries as an array of 6 (xy) or 9 (XYZ) floats
          * @param whitePoint Reference white as an array of 2 (xy) or 3 (XYZ) floats
+         * @param transform Computed transform matrix that converts from RGB to XYZ, or
+         *      {@code null} to compute it from {@code primaries} and {@code whitePoint}.
          * @param function Parameters for the transfer functions
          * @param id ID of this color space as an integer between {@link #MIN_ID} and {@link #MAX_ID}
          *
@@ -2552,9 +2570,10 @@
                 @NonNull @Size(min = 1) String name,
                 @NonNull @Size(min = 6, max = 9) float[] primaries,
                 @NonNull @Size(min = 2, max = 3) float[] whitePoint,
+                @Nullable @Size(9) float[] transform,
                 @NonNull TransferParameters function,
                 @IntRange(from = MIN_ID, to = MAX_ID) int id) {
-            this(name, primaries, whitePoint, null,
+            this(name, primaries, whitePoint, transform,
                     function.e == 0.0 && function.f == 0.0 ?
                             x -> rcpResponse(x, function.a, function.b,
                                     function.c, function.d, function.g) :
@@ -2846,7 +2865,7 @@
          *
          * @return The destination array passed as a parameter
          *
-         * @see #getWhitePoint(float[])
+         * @see #getWhitePoint()
          */
         @NonNull
         @Size(min = 2)
@@ -2864,7 +2883,7 @@
          *
          * @return A new non-null array of 2 floats
          *
-         * @see #getWhitePoint()
+         * @see #getWhitePoint(float[])
          */
         @NonNull
         @Size(2)
@@ -2878,12 +2897,16 @@
          * destination. The x and y components of the first primary are written
          * in the array at positions 0 and 1 respectively.
          *
+         * <p>Note: Some ColorSpaces represent gray profiles. The concept of
+         * primaries for such a ColorSpace does not make sense, so we use a special
+         * set of primaries that are all 1s.</p>
+         *
          * @param primaries The destination array, cannot be null, its length
          *                  must be >= 6
          *
          * @return The destination array passed as a parameter
          *
-         * @see #getPrimaries(float[])
+         * @see #getPrimaries()
          */
         @NonNull
         @Size(min = 6)
@@ -2898,9 +2921,13 @@
          * the destination. The x and y components of the first primary are
          * written in the array at positions 0 and 1 respectively.
          *
+         * <p>Note: Some ColorSpaces represent gray profiles. The concept of
+         * primaries for such a ColorSpace does not make sense, so we use a special
+         * set of primaries that are all 1s.</p>
+         *
          * @return A new non-null array of 2 floats
          *
-         * @see #getWhitePoint()
+         * @see #getPrimaries(float[])
          */
         @NonNull
         @Size(6)
@@ -2922,7 +2949,7 @@
          *
          * @return The destination array passed as a parameter
          *
-         * @see #getInverseTransform()
+         * @see #getTransform()
          */
         @NonNull
         @Size(min = 9)
@@ -2942,7 +2969,7 @@
          *
          * @return A new array of 9 floats
          *
-         * @see #getInverseTransform(float[])
+         * @see #getTransform(float[])
          */
         @NonNull
         @Size(9)
@@ -2964,7 +2991,7 @@
          *
          * @return The destination array passed as a parameter
          *
-         * @see #getTransform()
+         * @see #getInverseTransform()
          */
         @NonNull
         @Size(min = 9)
@@ -2984,7 +3011,7 @@
          *
          * @return A new array of 9 floats
          *
-         * @see #getTransform(float[])
+         * @see #getInverseTransform(float[])
          */
         @NonNull
         @Size(9)
@@ -3287,6 +3314,16 @@
             return true;
         }
 
+        /**
+         * Report whether this matrix is a special gray matrix.
+         * @param toXYZ A XYZD50 matrix. Skia uses a special form for a gray profile.
+         * @return true if this is a special gray matrix.
+         */
+        private static boolean isGray(@NonNull @Size(9) float[] toXYZ) {
+            return toXYZ.length == 9 && toXYZ[1] == 0 && toXYZ[2] == 0 && toXYZ[3] == 0
+                    && toXYZ[5] == 0 && toXYZ[6] == 0 && toXYZ[7] == 0;
+        }
+
         private static boolean compare(double point, @NonNull DoubleUnaryOperator a,
                 @NonNull DoubleUnaryOperator b) {
             double rA = a.applyAsDouble(point);
diff --git a/graphics/java/android/graphics/SurfaceTexture.java b/graphics/java/android/graphics/SurfaceTexture.java
index 697daa8..228d03a 100644
--- a/graphics/java/android/graphics/SurfaceTexture.java
+++ b/graphics/java/android/graphics/SurfaceTexture.java
@@ -120,7 +120,7 @@
 
     /**
      * Construct a new SurfaceTexture to stream images to a given OpenGL texture.
-     *
+     * <p>
      * In single buffered mode the application is responsible for serializing access to the image
      * content buffer. Each time the image content is to be updated, the
      * {@link #releaseTexImage()} method must be called before the image content producer takes
@@ -143,7 +143,7 @@
 
     /**
      * Construct a new SurfaceTexture to stream images to a given OpenGL texture.
-     *
+     * <p>
      * In single buffered mode the application is responsible for serializing access to the image
      * content buffer. Each time the image content is to be updated, the
      * {@link #releaseTexImage()} method must be called before the image content producer takes
@@ -152,7 +152,7 @@
      * must be called before each ANativeWindow_lock, or that call will fail. When producing
      * image content with OpenGL ES, {@link #releaseTexImage()} must be called before the first
      * OpenGL ES function call each frame.
-     *
+     * <p>
      * Unlike {@link #SurfaceTexture(int, boolean)}, which takes an OpenGL texture object name,
      * this constructor creates the SurfaceTexture in detached mode. A texture name must be passed
      * in using {@link #attachToGLContext} before calling {@link #releaseTexImage()} and producing
@@ -222,15 +222,15 @@
      * method.  Both video and camera based image producers do override the size.  This method may
      * be used to set the image size when producing images with {@link android.graphics.Canvas} (via
      * {@link android.view.Surface#lockCanvas}), or OpenGL ES (via an EGLSurface).
-     *
+     * <p>
      * The new default buffer size will take effect the next time the image producer requests a
      * buffer to fill.  For {@link android.graphics.Canvas} this will be the next time {@link
      * android.view.Surface#lockCanvas} is called.  For OpenGL ES, the EGLSurface should be
      * destroyed (via eglDestroySurface), made not-current (via eglMakeCurrent), and then recreated
-     * (via eglCreateWindowSurface) to ensure that the new default size has taken effect.
-     *
+     * (via {@code eglCreateWindowSurface}) to ensure that the new default size has taken effect.
+     * <p>
      * The width and height parameters must be no greater than the minimum of
-     * GL_MAX_VIEWPORT_DIMS and GL_MAX_TEXTURE_SIZE (see
+     * {@code GL_MAX_VIEWPORT_DIMS} and {@code GL_MAX_TEXTURE_SIZE} (see
      * {@link javax.microedition.khronos.opengles.GL10#glGetIntegerv glGetIntegerv}).
      * An error due to invalid dimensions might not be reported until
      * updateTexImage() is called.
@@ -242,7 +242,7 @@
     /**
      * Update the texture image to the most recent frame from the image stream.  This may only be
      * called while the OpenGL ES context that owns the texture is current on the calling thread.
-     * It will implicitly bind its texture to the GL_TEXTURE_EXTERNAL_OES texture target.
+     * It will implicitly bind its texture to the {@code GL_TEXTURE_EXTERNAL_OES} texture target.
      */
     public void updateTexImage() {
         nativeUpdateTexImage();
@@ -251,6 +251,7 @@
     /**
      * Releases the the texture content. This is needed in single buffered mode to allow the image
      * content producer to take ownership of the image buffer.
+     * <p>
      * For more information see {@link #SurfaceTexture(int, boolean)}.
      */
     public void releaseTexImage() {
@@ -263,7 +264,7 @@
      * ES texture object will be deleted as a result of this call.  After calling this method all
      * calls to {@link #updateTexImage} will throw an {@link java.lang.IllegalStateException} until
      * a successful call to {@link #attachToGLContext} is made.
-     *
+     * <p>
      * This can be used to access the SurfaceTexture image contents from multiple OpenGL ES
      * contexts.  Note, however, that the image contents are only accessible from one OpenGL ES
      * context at a time.
@@ -279,8 +280,8 @@
      * Attach the SurfaceTexture to the OpenGL ES context that is current on the calling thread.  A
      * new OpenGL ES texture object is created and populated with the SurfaceTexture image frame
      * that was current at the time of the last call to {@link #detachFromGLContext}.  This new
-     * texture is bound to the GL_TEXTURE_EXTERNAL_OES texture target.
-     *
+     * texture is bound to the {@code GL_TEXTURE_EXTERNAL_OES} texture target.
+     * <p>
      * This can be used to access the SurfaceTexture image contents from multiple OpenGL ES
      * contexts.  Note, however, that the image contents are only accessible from one OpenGL ES
      * context at a time.
@@ -297,15 +298,20 @@
 
     /**
      * Retrieve the 4x4 texture coordinate transform matrix associated with the texture image set by
-     * the most recent call to updateTexImage.
-     *
+     * the most recent call to {@link #updateTexImage}.
+     * <p>
      * This transform matrix maps 2D homogeneous texture coordinates of the form (s, t, 0, 1) with s
      * and t in the inclusive range [0, 1] to the texture coordinate that should be used to sample
      * that location from the texture.  Sampling the texture outside of the range of this transform
      * is undefined.
-     *
+     * <p>
      * The matrix is stored in column-major order so that it may be passed directly to OpenGL ES via
-     * the glLoadMatrixf or glUniformMatrix4fv functions.
+     * the {@code glLoadMatrixf} or {@code glUniformMatrix4fv} functions.
+     * <p>
+     * If the underlying buffer has a crop associated with it, the transformation will also include
+     * a slight scale to cut off a 1-texel border around the edge of the crop. This ensures that
+     * when the texture is bilinear sampled that no texels outside of the buffer's valid region
+     * are accessed by the GPU, avoiding any sampling artifacts when scaling.
      *
      * @param mtx the array into which the 4x4 matrix will be stored.  The array must have exactly
      *     16 elements.
@@ -321,7 +327,7 @@
 
     /**
      * Retrieve the timestamp associated with the texture image set by the most recent call to
-     * updateTexImage.
+     * {@link #updateTexImage}.
      *
      * <p>This timestamp is in nanoseconds, and is normally monotonically increasing. The timestamp
      * should be unaffected by time-of-day adjustments. The specific meaning and zero point of the
@@ -332,8 +338,8 @@
      *
      * <p>For camera sources, timestamps should be strictly monotonic. Timestamps from MediaPlayer
      * sources may be reset when the playback position is set. For EGL and Vulkan producers, the
-     * timestamp is the desired present time set with the EGL_ANDROID_presentation_time or
-     * VK_GOOGLE_display_timing extensions.</p>
+     * timestamp is the desired present time set with the {@code EGL_ANDROID_presentation_time} or
+     * {@code VK_GOOGLE_display_timing} extensions.</p>
      */
 
     public long getTimestamp() {
@@ -341,16 +347,17 @@
     }
 
     /**
-     * release() frees all the buffers and puts the SurfaceTexture into the
+     * {@code release()} frees all the buffers and puts the SurfaceTexture into the
      * 'abandoned' state. Once put in this state the SurfaceTexture can never
      * leave it. When in the 'abandoned' state, all methods of the
-     * IGraphicBufferProducer interface will fail with the NO_INIT error.
-     *
+     * {@code IGraphicBufferProducer} interface will fail with the {@code NO_INIT}
+     * error.
+     * <p>
      * Note that while calling this method causes all the buffers to be freed
      * from the perspective of the the SurfaceTexture, if there are additional
      * references on the buffers (e.g. if a buffer is referenced by a client or
      * by OpenGL ES as a texture) then those buffer will remain allocated.
-     *
+     * <p>
      * Always call this method when you are done with SurfaceTexture. Failing
      * to do so may delay resource deallocation for a significant amount of
      * time.
@@ -362,7 +369,7 @@
     }
 
     /**
-     * Returns true if the SurfaceTexture was released.
+     * Returns {@code true} if the SurfaceTexture was released.
      *
      * @see #release()
      */
@@ -395,7 +402,7 @@
     }
 
     /**
-     * Returns true if the SurfaceTexture is single-buffered
+     * Returns {@code true} if the SurfaceTexture is single-buffered.
      * @hide
      */
     public boolean isSingleBuffered() {
diff --git a/identity/java/android/security/identity/IdentityCredential.java b/identity/java/android/security/identity/IdentityCredential.java
index 1db2f63..b351b3d 100644
--- a/identity/java/android/security/identity/IdentityCredential.java
+++ b/identity/java/android/security/identity/IdentityCredential.java
@@ -95,9 +95,7 @@
     /**
      * Sets whether to allow using an authentication key which use count has been exceeded if no
      * other key is available. This must be called prior to calling
-     * {@link #getEntries(byte[], Map, byte[], byte[])} or using a
-     * {@link android.hardware.biometrics.BiometricPrompt.CryptoObject} which references this
-     * object.
+     * {@link #getEntries(byte[], Map, byte[], byte[])}.
      *
      * By default this is set to true.
      *
@@ -123,13 +121,14 @@
      * entries.
      *
      * <p>It is the responsibility of the calling application to know if authentication is needed
-     * and use e.g. {@link android.hardware.biometrics.BiometricPrompt}) to make the user
+     * and use e.g. {@link android.hardware.biometrics.BiometricPrompt} to make the user
      * authenticate using a {@link android.hardware.biometrics.BiometricPrompt.CryptoObject} which
      * references this object. If needed, this must be done before calling
      * {@link #getEntries(byte[], Map, byte[], byte[])}.
      *
-     * <p>If this method returns successfully (i.e. without throwing an exception), it must not be
-     * called again on this instance.
+     * <p>It is permissible to call this method multiple times using the same instance but if this
+     * is done, the {@code sessionTranscript} parameter must be identical for each call. If this is
+     * not the case, the {@link SessionTranscriptMismatchException} exception is thrown.
      *
      * <p>If not {@code null} the {@code requestMessage} parameter must contain data for the request
      * from the verifier. The content can be defined in the way appropriate for the credential, byt
@@ -141,6 +140,9 @@
      *     the example below.</li>
      * </ul>
      *
+     * <p>If these requirements are not met the {@link InvalidRequestMessageException} exception
+     * is thrown.
+     *
      * <p>Here's an example of CBOR which conforms to this requirement:
      * <pre>
      *   ItemsRequest = {
@@ -149,6 +151,8 @@
      *     ? "RequestInfo" : {* tstr => any} ; Additional info the reader wants to provide
      *   }
      *
+     *   DocType = tstr
+     *
      *   NameSpaces = {
      *     + NameSpace => DataElements    ; Requested data elements for each NameSpace
      *   }
@@ -172,16 +176,18 @@
      *     EReaderKeyBytes
      *   ]
      *
-     *   DeviceEngagementBytes = #6.24(bstr .cbor DeviceEngagement)
-     *   EReaderKeyBytes = #6.24(bstr .cbor EReaderKey.Pub)
+     *   DeviceEngagementBytes = #6.24(bstr .cbor DeviceEngagement)  ; Bytes of DeviceEngagement
+     *   EReaderKeyBytes = #6.24(bstr .cbor EReaderKey.Pub)  ; Bytes of EReaderKey.pub
+     *
+     *   EReaderKey.Pub = COSE_Key    ; Ephemeral public key provided by reader
      * </pre>
      *
-     * <p>If the SessionTranscript is not empty, a COSE_Key structure for the public part
-     * of the key-pair previously generated by {@link #createEphemeralKeyPair()} must appear
-     * somewhere in {@code DeviceEngagement} and the X and Y coordinates must both be present
+     * <p>where a {@code COSE_Key} structure for the public part of the key-pair previously
+     * generated by {@link #createEphemeralKeyPair()} must appear somewhere in
+     * {@code DeviceEngagement} and the X and Y coordinates must both be present
      * in uncompressed form.
      *
-     * <p>If {@code readerAuth} is not {@code null} it must be the bytes of a COSE_Sign1
+     * <p>If {@code readerAuth} is not {@code null} it must be the bytes of a {@code COSE_Sign1}
      * structure as defined in RFC 8152. For the payload nil shall be used and the
      * detached payload is the ReaderAuthentication CBOR described below.
      * <pre>
@@ -194,20 +200,23 @@
      *     ItemsRequestBytes = #6.24(bstr .cbor ItemsRequest)   ; Bytes of ItemsRequest
      * </pre>
      *
-     * <p>The public key corresponding to the key used to made signature, can be
-     * found in the {@code x5chain} unprotected header element of the COSE_Sign1
-     * structure (as as described in 'draft-ietf-cose-x509-04'). There will be at
-     * least one certificate in said element and there may be more (and if so,
+     * <p>where {@code ItemsRequestBytes} are the bytes in the {@code requestMessage} parameter.
+     *
+     * <p>The public key corresponding to the key used to make the signature, can be found in the
+     * {@code x5chain} unprotected header element of the {@code COSE_Sign1} structure (as as
+     * described in
+     * <a href="https://tools.ietf.org/html/draft-ietf-cose-x509-04">draft-ietf-cose-x509-04</a>).
+     * There will be at least one certificate in said element and there may be more (and if so,
      * each certificate must be signed by its successor).
      *
-     * <p>Data elements protected by reader authentication is returned if, and only if, they are
+     * <p>Data elements protected by reader authentication are returned if, and only if, they are
      * mentioned in {@code requestMessage}, {@code requestMessage} is signed by the top-most
-     * certificate in {@code readerCertificateChain}, and the data element is configured
-     * with an {@link AccessControlProfile} with a {@link X509Certificate} in
-     * {@code readerCertificateChain}.
+     * certificate in the reader's certificate chain, and the data element is configured
+     * with an {@link AccessControlProfile} configured with an X.509 certificate which appears
+     * in the certificate chain.
      *
      * <p>Note that only items referenced in {@code entriesToRequest} are returned - the
-     * {@code requestMessage} parameter is only used to for enforcing reader authentication.
+     * {@code requestMessage} parameter is used only for enforcing reader authentication.
      *
      * <p>The reason for having {@code requestMessage} and {@code entriesToRequest} as separate
      * parameters is that the former represents a request from the remote verifier device
@@ -219,13 +228,12 @@
      * @param entriesToRequest       The entries to request, organized as a map of namespace
      *                               names with each value being a collection of data elements
      *                               in the given namespace.
-     * @param readerSignature        COSE_Sign1 structure as described above or {@code null}
-     *                               if reader authentication is not being used.
+     * @param readerSignature        A {@code COSE_Sign1} structure as described above or
+     *                               {@code null} if reader authentication is not being used.
      * @return A {@link ResultData} object containing entry data organized by namespace and a
      *         cryptographically authenticated representation of the same data.
      * @throws SessionTranscriptMismatchException     Thrown when trying use multiple different
-     *                                                session transcripts in the same presentation
-     *                                                session.
+     *                                                session transcripts.
      * @throws NoAuthenticationKeyAvailableException  if authentication keys were never
      *                                                provisioned, the method
      *                                             {@link #setAvailableAuthenticationKeys(int, int)}
@@ -255,8 +263,8 @@
      * Sets the number of dynamic authentication keys the {@code IdentityCredential} will maintain,
      * and the number of times each should be used.
      *
-     * <p>{@code IdentityCredential}s will select the least-used dynamic authentication key each
-     * time {@link #getEntries(byte[], Map, byte[], byte[])} is called. {@code IdentityCredential}s
+     * <p>The Identity Credential system will select the least-used dynamic authentication key each
+     * time {@link #getEntries(byte[], Map, byte[], byte[])} is called. Identity Credentials
      * for which this method has not been called behave as though it had been called wit
      * {@code keyCount} 0 and {@code maxUsesPerKey} 1.
      *
@@ -274,9 +282,10 @@
      * <p>When there aren't enough certified dynamic authentication keys, either because the key
      * count has been increased or because one or more keys have reached their usage count, this
      * method will generate replacement keys and certificates and return them for issuer
-     * certification. The issuer certificates and associated static authentication data must then
-     * be provided back to the {@code IdentityCredential} using
-     * {@link #storeStaticAuthenticationData(X509Certificate, byte[])}.
+     * certification.  The issuer certificates and associated static authentication data must then
+     * be provided back to the Identity Credential using
+     * {@link #storeStaticAuthenticationData(X509Certificate, byte[])}.  The private part of
+     * each authentication key never leaves secure hardware.
      *
      * <p>Each X.509 certificate is signed by CredentialKey. The certificate chain for CredentialKey
      * can be obtained using the {@link #getCredentialKeyCertificateChain()} method.
diff --git a/identity/java/android/security/identity/IdentityCredentialStore.java b/identity/java/android/security/identity/IdentityCredentialStore.java
index a1dfc77..4f834d2 100644
--- a/identity/java/android/security/identity/IdentityCredentialStore.java
+++ b/identity/java/android/security/identity/IdentityCredentialStore.java
@@ -78,17 +78,21 @@
 
     /**
      * Specifies that the cipher suite that will be used to secure communications between the reader
-     * is:
+     * and the prover is using the following primitives
      *
      * <ul>
-     * <li>ECDHE with HKDF-SHA-256 for key agreement.</li>
-     * <li>AES-256 with GCM block mode for authenticated encryption (nonces are incremented by one
-     * for every message).</li>
-     * <li>ECDSA with SHA-256 for signing (used for signing session transcripts to defeat
-     * man-in-the-middle attacks), signing keys are not ephemeral. See {@link IdentityCredential}
-     * for details on reader and prover signing keys.</li>
+     * <li>ECKA-DH (Elliptic Curve Key Agreement Algorithm - Diffie-Hellman, see BSI TR-03111).</li>
+     *
+     * <li>HKDF-SHA-256 (see RFC 5869).</li>
+     *
+     * <li>AES-256-GCM (see NIST SP 800-38D).</li>
+     *
+     * <li>HMAC-SHA-256 (see RFC 2104).</li>
      * </ul>
      *
+     * <p>The exact way these primitives are combined to derive the session key is specified in
+     * section 9.2.1.4 of ISO/IEC 18013-5 (see description of cipher suite '1').<p>
+     *
      * <p>
      * At present this is the only supported cipher suite.
      */
@@ -135,9 +139,20 @@
     /**
      * Creates a new credential.
      *
+     * <p>When a credential is created, a cryptographic key-pair - CredentialKey - is created which
+     * is used to authenticate the store to the Issuing Authority.  The private part of this
+     * key-pair never leaves secure hardware and the public part can be obtained using
+     * {@link WritableIdentityCredential#getCredentialKeyCertificateChain(byte[])} on the
+     * returned object.
+     *
+     * <p>In addition, all of the Credential data content is imported and a certificate for the
+     * CredentialKey and a signature produced with the CredentialKey are created.  These latter
+     * values may be checked by an issuing authority to verify that the data was imported into
+     * secure hardware and that it was imported unmodified.
+     *
      * @param credentialName The name used to identify the credential.
      * @param docType        The document type for the credential.
-     * @return A @{link WritableIdentityCredential} that can be used to create a new credential.
+     * @return A {@link WritableIdentityCredential} that can be used to create a new credential.
      * @throws AlreadyPersonalizedException if a credential with the given name already exists.
      * @throws DocTypeNotSupportedException if the given document type isn't supported by the store.
      */
@@ -148,6 +163,10 @@
     /**
      * Retrieve a named credential.
      *
+     * <p>The cipher suite used to communicate with the remote verifier must also be specified.
+     * Currently only a single cipher-suite is supported. Support for other cipher suites may be
+     * added in a future version of this API.
+     *
      * @param credentialName the name of the credential to retrieve.
      * @param cipherSuite    the cipher suite to use for communicating with the verifier.
      * @return The named credential, or null if not found.
diff --git a/identity/java/android/security/identity/ResultData.java b/identity/java/android/security/identity/ResultData.java
index 13552d6..37de2c4 100644
--- a/identity/java/android/security/identity/ResultData.java
+++ b/identity/java/android/security/identity/ResultData.java
@@ -34,23 +34,23 @@
     /** Value was successfully retrieved. */
     public static final int STATUS_OK = 0;
 
-    /** Requested entry does not exist. */
+    /** The entry does not exist. */
     public static final int STATUS_NO_SUCH_ENTRY = 1;
 
-    /** Requested entry was not requested. */
+    /** The entry was not requested. */
     public static final int STATUS_NOT_REQUESTED = 2;
 
-    /** Requested entry wasn't in the request message. */
+    /** The entry wasn't in the request message. */
     public static final int STATUS_NOT_IN_REQUEST_MESSAGE = 3;
 
-    /** The requested entry was not retrieved because user authentication wasn't performed. */
+    /** The entry was not retrieved because user authentication failed. */
     public static final int STATUS_USER_AUTHENTICATION_FAILED = 4;
 
-    /** The requested entry was not retrieved because reader authentication wasn't performed. */
+    /** The entry was not retrieved because reader authentication failed. */
     public static final int STATUS_READER_AUTHENTICATION_FAILED = 5;
 
     /**
-     * The requested entry was not retrieved because it was configured without any access
+     * The entry was not retrieved because it was configured without any access
      * control profile.
      */
     public static final int STATUS_NO_ACCESS_CONTROL_PROFILES = 6;
@@ -88,11 +88,10 @@
      *
      *   DeviceEngagementBytes = #6.24(bstr .cbor DeviceEngagement)
      *   EReaderKeyBytes = #6.24(bstr .cbor EReaderKey.Pub)
-     *
      *   DeviceNameSpacesBytes = #6.24(bstr .cbor DeviceNameSpaces)
      * </pre>
      *
-     * where
+     * <p>where
      *
      * <pre>
      *   DeviceNameSpaces = {
@@ -116,15 +115,16 @@
     public abstract @NonNull byte[] getAuthenticatedData();
 
     /**
-     * Returns a message authentication code over the data returned by
-     * {@link #getAuthenticatedData}, to prove to the reader that the data is from a trusted
-     * credential.
+     * Returns a message authentication code over the {@code DeviceAuthentication} CBOR
+     * specified in {@link #getAuthenticatedData()}, to prove to the reader that the data
+     * is from a trusted credential.
      *
      * <p>The MAC proves to the reader that the data is from a trusted credential. This code is
      * produced by using the key agreement and key derivation function from the ciphersuite
      * with the authentication private key and the reader ephemeral public key to compute a
      * shared message authentication code (MAC) key, then using the MAC function from the
-     * ciphersuite to compute a MAC of the authenticated data.
+     * ciphersuite to compute a MAC of the authenticated data. See section 9.2.3.5 of
+     * ISO/IEC 18013-5 for details of this operation.
      *
      * <p>If the {@code sessionTranscript} parameter passed to
      * {@link IdentityCredential#getEntries(byte[], Map, byte[], byte[])} was {@code null}
@@ -157,7 +157,7 @@
     /**
      * Get the names of all entries.
      *
-     * This includes the name of entries that wasn't successfully retrieved.
+     * <p>This includes the name of entries that wasn't successfully retrieved.
      *
      * @param namespaceName the namespace name to get entries for.
      * @return A collection of names or {@code null} if there are no entries for the given
@@ -168,7 +168,7 @@
     /**
      * Get the names of all entries that was successfully retrieved.
      *
-     * This only return entries for which {@link #getStatus(String, String)} will return
+     * <p>This only return entries for which {@link #getStatus(String, String)} will return
      * {@link #STATUS_OK}.
      *
      * @param namespaceName the namespace name to get entries for.
@@ -181,16 +181,15 @@
     /**
      * Gets the status of an entry.
      *
-     * This returns {@link #STATUS_OK} if the value was retrieved, {@link #STATUS_NO_SUCH_ENTRY}
+     * <p>This returns {@link #STATUS_OK} if the value was retrieved, {@link #STATUS_NO_SUCH_ENTRY}
      * if the given entry wasn't retrieved, {@link #STATUS_NOT_REQUESTED} if it wasn't requested,
      * {@link #STATUS_NOT_IN_REQUEST_MESSAGE} if the request message was set but the entry wasn't
-     * present in the request message,
-     * {@link #STATUS_USER_AUTHENTICATION_FAILED} if the value
+     * present in the request message, {@link #STATUS_USER_AUTHENTICATION_FAILED} if the value
      * wasn't retrieved because the necessary user authentication wasn't performed,
-     * {@link #STATUS_READER_AUTHENTICATION_FAILED} if the supplied reader certificate chain
-     * didn't match the set of certificates the entry was provisioned with, or
-     * {@link #STATUS_NO_ACCESS_CONTROL_PROFILES} if the entry was configured without any
-     * access control profiles.
+     * {@link #STATUS_READER_AUTHENTICATION_FAILED} if the supplied reader certificate chain didn't
+     * match the set of certificates the entry was provisioned with, or
+     * {@link #STATUS_NO_ACCESS_CONTROL_PROFILES} if the entry was configured without any access
+     * control profiles.
      *
      * @param namespaceName the namespace name of the entry.
      * @param name the name of the entry to get the value for.
@@ -201,7 +200,7 @@
     /**
      * Gets the raw CBOR data for the value of an entry.
      *
-     * This should only be called on an entry for which the {@link #getStatus(String, String)}
+     * <p>This should only be called on an entry for which the {@link #getStatus(String, String)}
      * method returns {@link #STATUS_OK}.
      *
      * @param namespaceName the namespace name of the entry.
diff --git a/identity/java/android/security/identity/WritableIdentityCredential.java b/identity/java/android/security/identity/WritableIdentityCredential.java
index e2a389b..c7aa328 100644
--- a/identity/java/android/security/identity/WritableIdentityCredential.java
+++ b/identity/java/android/security/identity/WritableIdentityCredential.java
@@ -41,15 +41,16 @@
      * <a href="https://source.android.com/security/keystore/attestation">Android Keystore</a>
      * attestation extension which describes the key and the security hardware in which it lives.
      *
-     * <p>Additionally, the attestation extension will contain the tag TODO_IC_KEY which indicates
-     * it is an Identity Credential key (which can only sign/MAC very specific messages) and not
-     * an Android Keystore key (which can be used to sign/MAC anything).
+     * <p>Additionally, the attestation extension will contain the tag Tag::IDENTITY_CREDENTIAL_KEY
+     * which indicates it is an Identity Credential key (which can only sign/MAC very specific
+     * messages) and not an Android Keystore key (which can be used to sign/MAC anything).
      *
      * <p>The issuer <b>MUST</b> carefully examine this certificate chain including (but not
-     * limited to) checking that the root certificate is well-known, the tag TODO_IC_KEY is
-     * present, the passed in challenge is present, the device has verified boot enabled, that each
-     * certificate in the chain is signed by its successor, that none of the certificates have been
-     * revoked and so on.
+     * limited to) checking that the root certificate is well-known, the tag
+     * Tag::IDENTITY_CREDENTIAL_KEY present, the passed in challenge is present, the tag
+     * Tag::ATTESTATION_APPLICATION_ID is set to the expected Android application, the device
+     * has verified boot enabled, each certificate in the chain is signed by its successor,
+     * none of the certificates have been revoked, and so on.
      *
      * <p>It is not strictly necessary to use this method to provision a credential if the issuing
      * authority doesn't care about the nature of the security hardware. If called, however, this
diff --git a/libs/hwui/jni/Bitmap.cpp b/libs/hwui/jni/Bitmap.cpp
index ba66905..c0663a9 100755
--- a/libs/hwui/jni/Bitmap.cpp
+++ b/libs/hwui/jni/Bitmap.cpp
@@ -601,6 +601,7 @@
 
     android::Parcel* p = parcelForJavaObject(env, parcel);
 
+    const bool        isMutable = p->readInt32() != 0;
     const SkColorType colorType = (SkColorType)p->readInt32();
     const SkAlphaType alphaType = (SkAlphaType)p->readInt32();
     const uint32_t    colorSpaceSize = p->readUint32();
@@ -649,7 +650,9 @@
 
     // Map the bitmap in place from the ashmem region if possible otherwise copy.
     sk_sp<Bitmap> nativeBitmap;
-    if (blob.fd() >= 0 && !blob.isMutable()) {
+    // If the blob is mutable we have ownership of the region and can always use it
+    // If the blob is immutable _and_ we're immutable, we can then still use it
+    if (blob.fd() >= 0 && (blob.isMutable() || !isMutable)) {
 #if DEBUG_PARCEL
         ALOGD("Bitmap.createFromParcel: mapped contents of bitmap from %s blob "
                 "(fds %s)",
@@ -669,7 +672,7 @@
         // Map the pixels in place and take ownership of the ashmem region. We must also respect the
         // rowBytes value already set on the bitmap instead of attempting to compute our own.
         nativeBitmap = Bitmap::createFrom(bitmap->info(), bitmap->rowBytes(), dupFd,
-                                          const_cast<void*>(blob.data()), size, true);
+                                          const_cast<void*>(blob.data()), size, !isMutable);
         if (!nativeBitmap) {
             close(dupFd);
             blob.release();
@@ -707,7 +710,7 @@
     }
 
     return createBitmap(env, nativeBitmap.release(),
-            getPremulBitmapCreateFlags(false), NULL, NULL, density);
+            getPremulBitmapCreateFlags(isMutable), NULL, NULL, density);
 #else
     doThrowRE(env, "Cannot use parcels outside of Android");
     return NULL;
@@ -728,6 +731,7 @@
     auto bitmapWrapper = reinterpret_cast<BitmapWrapper*>(bitmapHandle);
     bitmapWrapper->getSkBitmap(&bitmap);
 
+    p->writeInt32(!bitmap.isImmutable());
     p->writeInt32(bitmap.colorType());
     p->writeInt32(bitmap.alphaType());
     SkColorSpace* colorSpace = bitmap.colorSpace();
@@ -754,7 +758,7 @@
     // Transfer the underlying ashmem region if we have one and it's immutable.
     android::status_t status;
     int fd = bitmapWrapper->bitmap().getAshmemFd();
-    if (fd >= 0 && p->allowFds()) {
+    if (fd >= 0 && bitmap.isImmutable() && p->allowFds()) {
 #if DEBUG_PARCEL
         ALOGD("Bitmap.writeToParcel: transferring immutable bitmap's ashmem fd as "
                 "immutable blob (fds %s)",
@@ -775,9 +779,10 @@
             p->allowFds() ? "allowed" : "forbidden");
 #endif
 
+    const bool mutableCopy = !bitmap.isImmutable();
     size_t size = bitmap.computeByteSize();
     android::Parcel::WritableBlob blob;
-    status = p->writeBlob(size, false, &blob);
+    status = p->writeBlob(size, mutableCopy, &blob);
     if (status) {
         doThrowRE(env, "Could not copy bitmap to parcel blob.");
         return JNI_FALSE;
diff --git a/location/java/android/location/GnssMeasurement.java b/location/java/android/location/GnssMeasurement.java
index 5e3b8aa..cd2af1b 100644
--- a/location/java/android/location/GnssMeasurement.java
+++ b/location/java/android/location/GnssMeasurement.java
@@ -1373,6 +1373,8 @@
      * <p>Returns "C" for GPS L1 C/A,  GPS L2 C/A, GLONASS G1 C/A, GLONASS G2 C/A, GALILEO E1C,
      * GALILEO E6C, SBAS L1 C/A, QZSS L1 C/A, IRNSS L5C.
      *
+     * <p>Returns "D" for BDS B1C D.
+     *
      * <p>Returns "I" for GPS L5 I, GLONASS G3 I, GALILEO E5a I, GALILEO E5b I, GALILEO E5a+b I,
      * SBAS L5 I, QZSS L5 I, BDS B1 I, BDS B2 I, BDS B3 I.
      *
@@ -1382,7 +1384,7 @@
      *
      * <p>Returns "N" for GPS L1 codeless, GPS L2 codeless.
      *
-     * <p>Returns "P" for GPS L1P, GPS L2P, GLONASS G1P, GLONASS G2P.
+     * <p>Returns "P" for GPS L1P, GPS L2P, GLONASS G1P, GLONASS G2P, BDS B1C P.
      *
      * <p>Returns "Q" for GPS L5 Q, GLONASS G3 Q, GALILEO E5a Q, GALILEO E5b Q, GALILEO E5a+b Q,
      * SBAS L5 Q, QZSS L5 Q, BDS B1 Q, BDS B2 Q, BDS B3 Q.
@@ -1394,7 +1396,7 @@
      * <p>Returns "X" for GPS L1C (D+P), GPS L2C (M+L), GPS L5 (I+Q), GLONASS G3 (I+Q), GALILEO
      * E1 (B+C), GALILEO E5a (I+Q), GALILEO E5b (I+Q), GALILEO E5a+b(I+Q), GALILEO E6 (B+C), SBAS
      * L5 (I+Q), QZSS L1C (D+P), QZSS L2C (M+L), QZSS L5 (I+Q), LEX(6) (S+L), BDS B1 (I+Q), BDS
-     * B2 (I+Q), BDS B3 (I+Q), IRNSS L5 (B+C).
+     * B1C (D+P), BDS B2 (I+Q), BDS B3 (I+Q), IRNSS L5 (B+C).
      *
      * <p>Returns "Y" for GPS L1Y, GPS L2Y.
      *
diff --git a/location/java/android/location/LocationManager.java b/location/java/android/location/LocationManager.java
index d1b41df..9b4aebc 100644
--- a/location/java/android/location/LocationManager.java
+++ b/location/java/android/location/LocationManager.java
@@ -34,6 +34,7 @@
 import android.annotation.SystemService;
 import android.annotation.TestApi;
 import android.app.AlarmManager;
+import android.app.AppOpsManager;
 import android.app.PendingIntent;
 import android.app.PropertyInvalidatedCache;
 import android.compat.Compatibility;
@@ -2561,7 +2562,7 @@
         }
 
         public String getListenerId() {
-            return mConsumer.getClass().getName() + "@" + System.identityHashCode(mConsumer);
+            return AppOpsManager.toReceiverId(mConsumer);
         }
 
         public synchronized void register(AlarmManager alarmManager,
@@ -2690,7 +2691,7 @@
         }
 
         public String getListenerId() {
-            return mListener.getClass().getName() + "@" + System.identityHashCode(mListener);
+            return AppOpsManager.toReceiverId(mListener);
         }
 
         public void register(@NonNull Executor executor) {
diff --git a/media/Android.bp b/media/Android.bp
index 499d0da..0ed1047 100644
--- a/media/Android.bp
+++ b/media/Android.bp
@@ -1,5 +1,6 @@
 aidl_interface {
     name: "audio_common-aidl",
+    unstable: true,
     local_include_dir: "java",
     srcs: [
         "java/android/media/audio/common/AudioChannelMask.aidl",
@@ -23,6 +24,7 @@
 
 aidl_interface {
     name: "soundtrigger_middleware-aidl",
+    unstable: true,
     local_include_dir: "java",
     srcs: [
         "java/android/media/soundtrigger_middleware/ConfidenceLevel.aidl",
diff --git a/media/OWNERS b/media/OWNERS
index be60583..a16373e 100644
--- a/media/OWNERS
+++ b/media/OWNERS
@@ -1,7 +1,7 @@
 [email protected]
 [email protected]
[email protected]
 [email protected]
[email protected]
 [email protected]
 [email protected]
 [email protected]
@@ -15,7 +15,7 @@
 [email protected]
 [email protected]
 [email protected]
[email protected]
[email protected]
 
 # For maintaining sync with AndroidX code
 per-file ExifInterface.java = [email protected], [email protected]
diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java
old mode 100644
new mode 100755
index 8477aa3..8ea6883
--- a/media/java/android/media/AudioManager.java
+++ b/media/java/android/media/AudioManager.java
@@ -2713,6 +2713,32 @@
     }
 
     /**
+     * @hide
+     */
+    public static String audioFocusToString(int focus) {
+        switch (focus) {
+            case AUDIOFOCUS_NONE:
+                return "AUDIOFOCUS_NONE";
+            case AUDIOFOCUS_GAIN:
+                return "AUDIOFOCUS_GAIN";
+            case AUDIOFOCUS_GAIN_TRANSIENT:
+                return "AUDIOFOCUS_GAIN_TRANSIENT";
+            case AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK:
+                return "AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK";
+            case AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE:
+                return "AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE";
+            case AUDIOFOCUS_LOSS:
+                return "AUDIOFOCUS_LOSS";
+            case AUDIOFOCUS_LOSS_TRANSIENT:
+                return "AUDIOFOCUS_LOSS_TRANSIENT";
+            case AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK: // Note CAN_DUCK not MAY_DUCK.
+                return "AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK";
+            default:
+                return "AUDIO_FOCUS_UNKNOWN(" + focus + ")";
+        }
+    }
+
+    /**
      * Used to indicate no audio focus has been gained or lost, or requested.
      */
     public static final int AUDIOFOCUS_NONE = 0;
@@ -6145,6 +6171,17 @@
         }
     }
 
+    /** @hide
+     * TODO: make this a @SystemApi */
+    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    public void setMultiAudioFocusEnabled(boolean enabled) {
+        try {
+            getService().setMultiAudioFocusEnabled(enabled);
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
     //---------------------------------------------------------
     // Inner classes
     //--------------------
diff --git a/media/java/android/media/AudioPortEventHandler.java b/media/java/android/media/AudioPortEventHandler.java
index 14249cb..8e8dfaf 100644
--- a/media/java/android/media/AudioPortEventHandler.java
+++ b/media/java/android/media/AudioPortEventHandler.java
@@ -78,7 +78,8 @@
                                     listeners.add((AudioManager.OnAudioPortUpdateListener)msg.obj);
                                 }
                             } else {
-                                listeners = mListeners;
+                                listeners = (ArrayList<AudioManager.OnAudioPortUpdateListener>)
+                                        mListeners.clone();
                             }
                         }
                         // reset audio port cache if the event corresponds to a change coming
diff --git a/media/java/android/media/AudioSystem.java b/media/java/android/media/AudioSystem.java
index c11762b..373f6e1 100644
--- a/media/java/android/media/AudioSystem.java
+++ b/media/java/android/media/AudioSystem.java
@@ -214,6 +214,175 @@
         }
     }
 
+    /**
+     * @hide
+     * Convert a native audio format integer constant to a string.
+     */
+    public static String audioFormatToString(int audioFormat) {
+        switch (audioFormat) {
+            case /* AUDIO_FORMAT_INVALID         */ 0xFFFFFFFF:
+                return "AUDIO_FORMAT_INVALID";
+            case /* AUDIO_FORMAT_DEFAULT         */ 0:
+                return "AUDIO_FORMAT_DEFAULT";
+            case /* AUDIO_FORMAT_MP3             */ 0x01000000:
+                return "AUDIO_FORMAT_MP3";
+            case /* AUDIO_FORMAT_AMR_NB          */ 0x02000000:
+                return "AUDIO_FORMAT_AMR_NB";
+            case /* AUDIO_FORMAT_AMR_WB          */ 0x03000000:
+                return "AUDIO_FORMAT_AMR_WB";
+            case /* AUDIO_FORMAT_AAC             */ 0x04000000:
+                return "AUDIO_FORMAT_AAC";
+            case /* AUDIO_FORMAT_HE_AAC_V1       */ 0x05000000:
+                return "AUDIO_FORMAT_HE_AAC_V1";
+            case /* AUDIO_FORMAT_HE_AAC_V2       */ 0x06000000:
+                return "AUDIO_FORMAT_HE_AAC_V2";
+            case /* AUDIO_FORMAT_VORBIS          */ 0x07000000:
+                return "AUDIO_FORMAT_VORBIS";
+            case /* AUDIO_FORMAT_OPUS            */ 0x08000000:
+                return "AUDIO_FORMAT_OPUS";
+            case /* AUDIO_FORMAT_AC3             */ 0x09000000:
+                return "AUDIO_FORMAT_AC3";
+            case /* AUDIO_FORMAT_E_AC3           */ 0x0A000000:
+                return "AUDIO_FORMAT_E_AC3";
+            case /* AUDIO_FORMAT_DTS             */ 0x0B000000:
+                return "AUDIO_FORMAT_DTS";
+            case /* AUDIO_FORMAT_DTS_HD          */ 0x0C000000:
+                return "AUDIO_FORMAT_DTS_HD";
+            case /* AUDIO_FORMAT_IEC61937        */ 0x0D000000:
+                return "AUDIO_FORMAT_IEC61937";
+            case /* AUDIO_FORMAT_DOLBY_TRUEHD    */ 0x0E000000:
+                return "AUDIO_FORMAT_DOLBY_TRUEHD";
+            case /* AUDIO_FORMAT_EVRC            */ 0x10000000:
+                return "AUDIO_FORMAT_EVRC";
+            case /* AUDIO_FORMAT_EVRCB           */ 0x11000000:
+                return "AUDIO_FORMAT_EVRCB";
+            case /* AUDIO_FORMAT_EVRCWB          */ 0x12000000:
+                return "AUDIO_FORMAT_EVRCWB";
+            case /* AUDIO_FORMAT_EVRCNW          */ 0x13000000:
+                return "AUDIO_FORMAT_EVRCNW";
+            case /* AUDIO_FORMAT_AAC_ADIF        */ 0x14000000:
+                return "AUDIO_FORMAT_AAC_ADIF";
+            case /* AUDIO_FORMAT_WMA             */ 0x15000000:
+                return "AUDIO_FORMAT_WMA";
+            case /* AUDIO_FORMAT_WMA_PRO         */ 0x16000000:
+                return "AUDIO_FORMAT_WMA_PRO";
+            case /* AUDIO_FORMAT_AMR_WB_PLUS     */ 0x17000000:
+                return "AUDIO_FORMAT_AMR_WB_PLUS";
+            case /* AUDIO_FORMAT_MP2             */ 0x18000000:
+                return "AUDIO_FORMAT_MP2";
+            case /* AUDIO_FORMAT_QCELP           */ 0x19000000:
+                return "AUDIO_FORMAT_QCELP";
+            case /* AUDIO_FORMAT_DSD             */ 0x1A000000:
+                return "AUDIO_FORMAT_DSD";
+            case /* AUDIO_FORMAT_FLAC            */ 0x1B000000:
+                return "AUDIO_FORMAT_FLAC";
+            case /* AUDIO_FORMAT_ALAC            */ 0x1C000000:
+                return "AUDIO_FORMAT_ALAC";
+            case /* AUDIO_FORMAT_APE             */ 0x1D000000:
+                return "AUDIO_FORMAT_APE";
+            case /* AUDIO_FORMAT_AAC_ADTS        */ 0x1E000000:
+                return "AUDIO_FORMAT_AAC_ADTS";
+            case /* AUDIO_FORMAT_SBC             */ 0x1F000000:
+                return "AUDIO_FORMAT_SBC";
+            case /* AUDIO_FORMAT_APTX            */ 0x20000000:
+                return "AUDIO_FORMAT_APTX";
+            case /* AUDIO_FORMAT_APTX_HD         */ 0x21000000:
+                return "AUDIO_FORMAT_APTX_HD";
+            case /* AUDIO_FORMAT_AC4             */ 0x22000000:
+                return "AUDIO_FORMAT_AC4";
+            case /* AUDIO_FORMAT_LDAC            */ 0x23000000:
+                return "AUDIO_FORMAT_LDAC";
+            case /* AUDIO_FORMAT_MAT             */ 0x24000000:
+                return "AUDIO_FORMAT_MAT";
+            case /* AUDIO_FORMAT_AAC_LATM        */ 0x25000000:
+                return "AUDIO_FORMAT_AAC_LATM";
+            case /* AUDIO_FORMAT_CELT            */ 0x26000000:
+                return "AUDIO_FORMAT_CELT";
+            case /* AUDIO_FORMAT_APTX_ADAPTIVE   */ 0x27000000:
+                return "AUDIO_FORMAT_APTX_ADAPTIVE";
+            case /* AUDIO_FORMAT_LHDC            */ 0x28000000:
+                return "AUDIO_FORMAT_LHDC";
+            case /* AUDIO_FORMAT_LHDC_LL         */ 0x29000000:
+                return "AUDIO_FORMAT_LHDC_LL";
+            case /* AUDIO_FORMAT_APTX_TWSP       */ 0x2A000000:
+                return "AUDIO_FORMAT_APTX_TWSP";
+
+            /* Aliases */
+            case /* AUDIO_FORMAT_PCM_16_BIT        */ 0x1:
+                return "AUDIO_FORMAT_PCM_16_BIT";        // (PCM | PCM_SUB_16_BIT)
+            case /* AUDIO_FORMAT_PCM_8_BIT         */ 0x2:
+                return "AUDIO_FORMAT_PCM_8_BIT";        // (PCM | PCM_SUB_8_BIT)
+            case /* AUDIO_FORMAT_PCM_32_BIT        */ 0x3:
+                return "AUDIO_FORMAT_PCM_32_BIT";        // (PCM | PCM_SUB_32_BIT)
+            case /* AUDIO_FORMAT_PCM_8_24_BIT      */ 0x4:
+                return "AUDIO_FORMAT_PCM_8_24_BIT";        // (PCM | PCM_SUB_8_24_BIT)
+            case /* AUDIO_FORMAT_PCM_FLOAT         */ 0x5:
+                return "AUDIO_FORMAT_PCM_FLOAT";        // (PCM | PCM_SUB_FLOAT)
+            case /* AUDIO_FORMAT_PCM_24_BIT_PACKED */ 0x6:
+                return "AUDIO_FORMAT_PCM_24_BIT_PACKED";        // (PCM | PCM_SUB_24_BIT_PACKED)
+            case /* AUDIO_FORMAT_AAC_MAIN          */ 0x4000001:
+                return "AUDIO_FORMAT_AAC_MAIN";  // (AAC | AAC_SUB_MAIN)
+            case /* AUDIO_FORMAT_AAC_LC            */ 0x4000002:
+                return "AUDIO_FORMAT_AAC_LC";  // (AAC | AAC_SUB_LC)
+            case /* AUDIO_FORMAT_AAC_SSR           */ 0x4000004:
+                return "AUDIO_FORMAT_AAC_SSR";  // (AAC | AAC_SUB_SSR)
+            case /* AUDIO_FORMAT_AAC_LTP           */ 0x4000008:
+                return "AUDIO_FORMAT_AAC_LTP";  // (AAC | AAC_SUB_LTP)
+            case /* AUDIO_FORMAT_AAC_HE_V1         */ 0x4000010:
+                return "AUDIO_FORMAT_AAC_HE_V1";  // (AAC | AAC_SUB_HE_V1)
+            case /* AUDIO_FORMAT_AAC_SCALABLE      */ 0x4000020:
+                return "AUDIO_FORMAT_AAC_SCALABLE";  // (AAC | AAC_SUB_SCALABLE)
+            case /* AUDIO_FORMAT_AAC_ERLC          */ 0x4000040:
+                return "AUDIO_FORMAT_AAC_ERLC";  // (AAC | AAC_SUB_ERLC)
+            case /* AUDIO_FORMAT_AAC_LD            */ 0x4000080:
+                return "AUDIO_FORMAT_AAC_LD";  // (AAC | AAC_SUB_LD)
+            case /* AUDIO_FORMAT_AAC_HE_V2         */ 0x4000100:
+                return "AUDIO_FORMAT_AAC_HE_V2";  // (AAC | AAC_SUB_HE_V2)
+            case /* AUDIO_FORMAT_AAC_ELD           */ 0x4000200:
+                return "AUDIO_FORMAT_AAC_ELD";  // (AAC | AAC_SUB_ELD)
+            case /* AUDIO_FORMAT_AAC_XHE           */ 0x4000300:
+                return "AUDIO_FORMAT_AAC_XHE";  // (AAC | AAC_SUB_XHE)
+            case /* AUDIO_FORMAT_AAC_ADTS_MAIN     */ 0x1e000001:
+                return "AUDIO_FORMAT_AAC_ADTS_MAIN"; // (AAC_ADTS | AAC_SUB_MAIN)
+            case /* AUDIO_FORMAT_AAC_ADTS_LC       */ 0x1e000002:
+                return "AUDIO_FORMAT_AAC_ADTS_LC"; // (AAC_ADTS | AAC_SUB_LC)
+            case /* AUDIO_FORMAT_AAC_ADTS_SSR      */ 0x1e000004:
+                return "AUDIO_FORMAT_AAC_ADTS_SSR"; // (AAC_ADTS | AAC_SUB_SSR)
+            case /* AUDIO_FORMAT_AAC_ADTS_LTP      */ 0x1e000008:
+                return "AUDIO_FORMAT_AAC_ADTS_LTP"; // (AAC_ADTS | AAC_SUB_LTP)
+            case /* AUDIO_FORMAT_AAC_ADTS_HE_V1    */ 0x1e000010:
+                return "AUDIO_FORMAT_AAC_ADTS_HE_V1"; // (AAC_ADTS | AAC_SUB_HE_V1)
+            case /* AUDIO_FORMAT_AAC_ADTS_SCALABLE */ 0x1e000020:
+                return "AUDIO_FORMAT_AAC_ADTS_SCALABLE"; // (AAC_ADTS | AAC_SUB_SCALABLE)
+            case /* AUDIO_FORMAT_AAC_ADTS_ERLC     */ 0x1e000040:
+                return "AUDIO_FORMAT_AAC_ADTS_ERLC"; // (AAC_ADTS | AAC_SUB_ERLC)
+            case /* AUDIO_FORMAT_AAC_ADTS_LD       */ 0x1e000080:
+                return "AUDIO_FORMAT_AAC_ADTS_LD"; // (AAC_ADTS | AAC_SUB_LD)
+            case /* AUDIO_FORMAT_AAC_ADTS_HE_V2    */ 0x1e000100:
+                return "AUDIO_FORMAT_AAC_ADTS_HE_V2"; // (AAC_ADTS | AAC_SUB_HE_V2)
+            case /* AUDIO_FORMAT_AAC_ADTS_ELD      */ 0x1e000200:
+                return "AUDIO_FORMAT_AAC_ADTS_ELD"; // (AAC_ADTS | AAC_SUB_ELD)
+            case /* AUDIO_FORMAT_AAC_ADTS_XHE      */ 0x1e000300:
+                return "AUDIO_FORMAT_AAC_ADTS_XHE"; // (AAC_ADTS | AAC_SUB_XHE)
+            case /* AUDIO_FORMAT_AAC_LATM_LC       */ 0x25000002:
+                return "AUDIO_FORMAT_AAC_LATM_LC"; // (AAC_LATM | AAC_SUB_LC)
+            case /* AUDIO_FORMAT_AAC_LATM_HE_V1    */ 0x25000010:
+                return "AUDIO_FORMAT_AAC_LATM_HE_V1"; // (AAC_LATM | AAC_SUB_HE_V1)
+            case /* AUDIO_FORMAT_AAC_LATM_HE_V2    */ 0x25000100:
+                return "AUDIO_FORMAT_AAC_LATM_HE_V2"; // (AAC_LATM | AAC_SUB_HE_V2)
+            case /* AUDIO_FORMAT_E_AC3_JOC         */ 0xA000001:
+                return "AUDIO_FORMAT_E_AC3_JOC";  // (E_AC3 | E_AC3_SUB_JOC)
+            case /* AUDIO_FORMAT_MAT_1_0           */ 0x24000001:
+                return "AUDIO_FORMAT_MAT_1_0"; // (MAT | MAT_SUB_1_0)
+            case /* AUDIO_FORMAT_MAT_2_0           */ 0x24000002:
+                return "AUDIO_FORMAT_MAT_2_0"; // (MAT | MAT_SUB_2_0)
+            case /* AUDIO_FORMAT_MAT_2_1           */ 0x24000003:
+                return "AUDIO_FORMAT_MAT_2_1"; // (MAT | MAT_SUB_2_1)
+            default:
+                return "AUDIO_FORMAT_(" + audioFormat + ")";
+        }
+    }
+
     /* Routing bits for the former setRouting/getRouting API */
     /** @hide @deprecated */
     @Deprecated public static final int ROUTE_EARPIECE          = (1 << 0);
diff --git a/media/java/android/media/ExifInterface.java b/media/java/android/media/ExifInterface.java
index d237975..ed566a5 100644
--- a/media/java/android/media/ExifInterface.java
+++ b/media/java/android/media/ExifInterface.java
@@ -31,6 +31,7 @@
 import android.util.Log;
 import android.util.Pair;
 
+import com.android.internal.annotations.GuardedBy;
 import com.android.internal.util.ArrayUtils;
 
 import libcore.io.IoUtils;
@@ -586,7 +587,9 @@
     private static final int WEBP_CHUNK_SIZE_BYTE_LENGTH = 4;
 
     @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
+    @GuardedBy("sFormatter")
     private static SimpleDateFormat sFormatter;
+    @GuardedBy("sFormatterTz")
     private static SimpleDateFormat sFormatterTz;
 
     // See Exchangeable image file format for digital still cameras: Exif version 2.2.
@@ -2426,12 +2429,17 @@
         try {
             // The exif field is in local time. Parsing it as if it is UTC will yield time
             // since 1/1/1970 local time
-            Date datetime = sFormatter.parse(dateTimeString, pos);
+            Date datetime;
+            synchronized (sFormatter) {
+                datetime = sFormatter.parse(dateTimeString, pos);
+            }
 
             if (offsetString != null) {
                 dateTimeString = dateTimeString + " " + offsetString;
                 ParsePosition position = new ParsePosition(0);
-                datetime = sFormatterTz.parse(dateTimeString, position);
+                synchronized (sFormatterTz) {
+                    datetime = sFormatterTz.parse(dateTimeString, position);
+                }
             }
 
             if (datetime == null) return -1;
@@ -2473,7 +2481,10 @@
 
         ParsePosition pos = new ParsePosition(0);
         try {
-            Date datetime = sFormatter.parse(dateTimeString, pos);
+            final Date datetime;
+            synchronized (sFormatter) {
+                datetime = sFormatter.parse(dateTimeString, pos);
+            }
             if (datetime == null) return -1;
             return datetime.getTime();
         } catch (IllegalArgumentException e) {
diff --git a/media/java/android/media/IAudioService.aidl b/media/java/android/media/IAudioService.aidl
old mode 100644
new mode 100755
index bb10e1f..e3b67f8
--- a/media/java/android/media/IAudioService.aidl
+++ b/media/java/android/media/IAudioService.aidl
@@ -301,4 +301,6 @@
 
     // WARNING: read warning at top of file, new methods that need to be used by native
     // code via IAudioManager.h need to be added to the top section.
+
+    oneway void setMultiAudioFocusEnabled(in boolean enabled);
 }
diff --git a/media/java/android/media/IMediaRouter2.aidl b/media/java/android/media/IMediaRouter2.aidl
index dc06153..a8b82ba 100644
--- a/media/java/android/media/IMediaRouter2.aidl
+++ b/media/java/android/media/IMediaRouter2.aidl
@@ -24,11 +24,15 @@
  * @hide
  */
 oneway interface IMediaRouter2 {
-    void notifyRestoreRoute();
     void notifyRoutesAdded(in List<MediaRoute2Info> routes);
     void notifyRoutesRemoved(in List<MediaRoute2Info> routes);
     void notifyRoutesChanged(in List<MediaRoute2Info> routes);
     void notifySessionCreated(int requestId, in @nullable RoutingSessionInfo sessionInfo);
     void notifySessionInfoChanged(in RoutingSessionInfo sessionInfo);
     void notifySessionReleased(in RoutingSessionInfo sessionInfo);
+    /**
+     * Gets hints of the new session for the given route.
+     * Call MediaRouterService#notifySessionHintsForCreatingSession to pass the result.
+     */
+    void getSessionHintsForCreatingSession(long uniqueRequestId, in MediaRoute2Info route);
 }
diff --git a/media/java/android/media/IMediaRouterService.aidl b/media/java/android/media/IMediaRouterService.aidl
index 0d87736..52bac67 100644
--- a/media/java/android/media/IMediaRouterService.aidl
+++ b/media/java/android/media/IMediaRouterService.aidl
@@ -59,6 +59,8 @@
 
     void requestCreateSessionWithRouter2(IMediaRouter2 router, int requestId,
             in MediaRoute2Info route, in @nullable Bundle sessionHints);
+    void notifySessionHintsForCreatingSession(IMediaRouter2 router, long uniqueRequestId,
+                in MediaRoute2Info route, in @nullable Bundle sessionHints);
     void selectRouteWithRouter2(IMediaRouter2 router, String sessionId, in MediaRoute2Info route);
     void deselectRouteWithRouter2(IMediaRouter2 router, String sessionId, in MediaRoute2Info route);
     void transferToRouteWithRouter2(IMediaRouter2 router, String sessionId,
diff --git a/media/java/android/media/MediaCas.java b/media/java/android/media/MediaCas.java
index 405410a..c652628 100644
--- a/media/java/android/media/MediaCas.java
+++ b/media/java/android/media/MediaCas.java
@@ -388,7 +388,7 @@
             @Override
             public void onReclaimResources() {
                 synchronized (mSessionMap) {
-                    mSessionMap.forEach((casSession, sessionResourceId) -> casSession.close());
+                    mSessionMap.forEach((casSession, sessionResourceHandle) -> casSession.close());
                 }
                 mEventHandler.sendMessage(mEventHandler.obtainMessage(
                         EventHandler.MSG_CAS_RESOURCE_LOST));
@@ -868,7 +868,7 @@
         }
     }
 
-    private int getSessionResourceId() throws MediaCasException {
+    private int getSessionResourceHandle() throws MediaCasException {
         validateInternalStates();
 
         int[] sessionResourceHandle = new int[1];
@@ -881,14 +881,14 @@
                     "insufficient resource to Open Session");
             }
         }
-        return  sessionResourceHandle[0];
+        return sessionResourceHandle[0];
     }
 
-    private void addSessionToResourceMap(Session session, int sessionResourceId) {
+    private void addSessionToResourceMap(Session session, int sessionResourceHandle) {
 
-        if (sessionResourceId != -1) {
+        if (sessionResourceHandle != TunerResourceManager.INVALID_RESOURCE_HANDLE) {
             synchronized (mSessionMap) {
-                mSessionMap.put(session, sessionResourceId);
+                mSessionMap.put(session, sessionResourceHandle);
             }
         }
     }
@@ -897,7 +897,7 @@
 
         synchronized (mSessionMap) {
             if (mSessionMap.get(session) != null) {
-                mTunerResourceManager.releaseCasSession(mSessionMap.get(session));
+                mTunerResourceManager.releaseCasSession(mSessionMap.get(session), mClientId);
                 mSessionMap.remove(session);
             }
         }
@@ -918,13 +918,13 @@
      * @throws MediaCasStateException for CAS-specific state exceptions.
      */
     public Session openSession() throws MediaCasException {
-        int sessionResourceId = getSessionResourceId();
+        int sessionResourceHandle = getSessionResourceHandle();
 
         try {
             OpenSessionCallback cb = new OpenSessionCallback();
             mICas.openSession(cb);
             MediaCasException.throwExceptionIfNeeded(cb.mStatus);
-            addSessionToResourceMap(cb.mSession, sessionResourceId);
+            addSessionToResourceMap(cb.mSession, sessionResourceHandle);
             return cb.mSession;
         } catch (RemoteException e) {
             cleanupAndRethrowIllegalState();
@@ -952,7 +952,7 @@
     @Nullable
     public Session openSession(@SessionUsage int sessionUsage, @ScramblingMode int scramblingMode)
             throws MediaCasException {
-        int sessionResourceId = getSessionResourceId();
+        int sessionResourceHandle = getSessionResourceHandle();
 
         if (mICasV12 == null) {
             Log.d(TAG, "Open Session with scrambling mode is only supported by [email protected]+ interface");
@@ -963,7 +963,7 @@
             OpenSession_1_2_Callback cb = new OpenSession_1_2_Callback();
             mICasV12.openSession_1_2(sessionUsage, scramblingMode, cb);
             MediaCasException.throwExceptionIfNeeded(cb.mStatus);
-            addSessionToResourceMap(cb.mSession, sessionResourceId);
+            addSessionToResourceMap(cb.mSession, sessionResourceHandle);
             return cb.mSession;
         } catch (RemoteException e) {
             cleanupAndRethrowIllegalState();
diff --git a/media/java/android/media/MediaFormat.java b/media/java/android/media/MediaFormat.java
index cbf2364..1bfa999 100644
--- a/media/java/android/media/MediaFormat.java
+++ b/media/java/android/media/MediaFormat.java
@@ -1312,7 +1312,7 @@
     }
 
     /**
-     * Returns the value of an long key, or the default value if the key is missing.
+     * Returns the value of a long key, or the default value if the key is missing.
      *
      * @return defaultValue if the key does not exist or the stored value for the key is null
      * @throws ClassCastException if the stored value for the key is int, float, ByteBuffer or
@@ -1340,19 +1340,15 @@
     }
 
     /**
-     * Returns the value of an float key, or the default value if the key is missing.
+     * Returns the value of a float key, or the default value if the key is missing.
      *
      * @return defaultValue if the key does not exist or the stored value for the key is null
      * @throws ClassCastException if the stored value for the key is int, long, ByteBuffer or
      *         String
      */
     public final float getFloat(@NonNull String name, float defaultValue) {
-        try {
-            return getFloat(name);
-        } catch (NullPointerException  e) {
-            /* no such field or field is null */
-            return defaultValue;
-        }
+        Object value = mMap.get(name);
+        return value != null ? (float) value : defaultValue;
     }
 
     /**
@@ -1366,7 +1362,7 @@
     }
 
     /**
-     * Returns the value of an string key, or the default value if the key is missing.
+     * Returns the value of a string key, or the default value if the key is missing.
      *
      * @return defaultValue if the key does not exist or the stored value for the key is null
      * @throws ClassCastException if the stored value for the key is int, long, float or ByteBuffer
diff --git a/media/java/android/media/MediaMetrics.java b/media/java/android/media/MediaMetrics.java
index 540955f..f6f482d 100644
--- a/media/java/android/media/MediaMetrics.java
+++ b/media/java/android/media/MediaMetrics.java
@@ -38,6 +38,117 @@
 public class MediaMetrics {
     public static final String TAG = "MediaMetrics";
 
+    public static final String SEPARATOR = ".";
+
+    /**
+     * A list of established MediaMetrics names that can be used for Items.
+     */
+    public static class Name {
+        public static final String AUDIO = "audio";
+        public static final String AUDIO_BLUETOOTH = AUDIO + SEPARATOR + "bluetooth";
+        public static final String AUDIO_DEVICE = AUDIO + SEPARATOR + "device";
+        public static final String AUDIO_FOCUS = AUDIO + SEPARATOR + "focus";
+        public static final String AUDIO_FORCE_USE = AUDIO + SEPARATOR + "forceUse";
+        public static final String AUDIO_MIC = AUDIO + SEPARATOR + "mic";
+        public static final String AUDIO_SERVICE = AUDIO + SEPARATOR + "service";
+        public static final String AUDIO_VOLUME = AUDIO + SEPARATOR + "volume";
+        public static final String AUDIO_VOLUME_EVENT = AUDIO_VOLUME + SEPARATOR + "event";
+    }
+
+    /**
+     * A list of established string values.
+     */
+    public static class Value {
+        public static final String CONNECT = "connect";
+        public static final String CONNECTED = "connected";
+        public static final String DISCONNECT = "disconnect";
+        public static final String DISCONNECTED = "disconnected";
+        public static final String DOWN = "down";
+        public static final String MUTE = "mute";
+        public static final String NO = "no";
+        public static final String OFF = "off";
+        public static final String ON = "on";
+        public static final String UNMUTE = "unmute";
+        public static final String UP = "up";
+        public static final String YES = "yes";
+    }
+
+    /**
+     * A list of standard property keys for consistent use and type.
+     */
+    public static class Property {
+        // A use for Bluetooth or USB device addresses
+        public static final Key<String> ADDRESS = createKey("address", String.class);
+        // A string representing the Audio Attributes
+        public static final Key<String> ATTRIBUTES = createKey("attributes", String.class);
+
+        // The calling package responsible for the state change
+        public static final Key<String> CALLING_PACKAGE =
+                createKey("callingPackage", String.class);
+
+        // The client name
+        public static final Key<String> CLIENT_NAME = createKey("clientName", String.class);
+
+        // The device type
+        public static final Key<Integer> DELAY_MS = createKey("delayMs", Integer.class);
+
+        // The device type
+        public static final Key<String> DEVICE = createKey("device", String.class);
+
+        // For volume changes, up or down
+        public static final Key<String> DIRECTION = createKey("direction", String.class);
+
+        // A reason for early return or error
+        public static final Key<String> EARLY_RETURN =
+                createKey("earlyReturn", String.class);
+        // ENCODING_ ... string to match AudioFormat encoding
+        public static final Key<String> ENCODING = createKey("encoding", String.class);
+
+        public static final Key<String> EVENT = createKey("event#", String.class);
+
+        // event generated is external (yes, no)
+        public static final Key<String> EXTERNAL = createKey("external", String.class);
+
+        public static final Key<Integer> FLAGS = createKey("flags", Integer.class);
+        public static final Key<String> FOCUS_CHANGE_HINT =
+                createKey("focusChangeHint", String.class);
+        public static final Key<String> FORCE_USE_DUE_TO =
+                createKey("forceUseDueTo", String.class);
+        public static final Key<String> FORCE_USE_MODE =
+                createKey("forceUseMode", String.class);
+        public static final Key<Double> GAIN_DB =
+                createKey("gainDb", Double.class);
+        public static final Key<String> GROUP =
+                createKey("group", String.class);
+        // For volume
+        public static final Key<Integer> INDEX = createKey("index", Integer.class);
+        public static final Key<Integer> MAX_INDEX = createKey("maxIndex", Integer.class);
+        public static final Key<Integer> MIN_INDEX = createKey("minIndex", Integer.class);
+        public static final Key<String> MODE =
+                createKey("mode", String.class); // audio_mode
+        public static final Key<String> MUTE =
+                createKey("mute", String.class); // microphone, on or off.
+
+        // Bluetooth or Usb device name
+        public static final Key<String> NAME =
+                createKey("name", String.class);
+
+        // Number of observers
+        public static final Key<Integer> OBSERVERS =
+                createKey("observers", Integer.class);
+
+        public static final Key<String> REQUEST =
+                createKey("request", String.class);
+
+        // For Bluetooth
+        public static final Key<String> SCO_AUDIO_MODE =
+                createKey("scoAudioMode", String.class);
+        public static final Key<Integer> SDK = createKey("sdk", Integer.class);
+        public static final Key<String> STATE = createKey("state", String.class);
+        public static final Key<Integer> STATUS = createKey("status", Integer.class);
+        public static final Key<String> STREAM_TYPE = createKey("streamType", String.class);
+    }
+
     /**
      * The TYPE constants below should match those in native MediaMetricsItem.h
      */
diff --git a/media/java/android/media/MediaRouter2.java b/media/java/android/media/MediaRouter2.java
index 25f6059..2c65cc4 100644
--- a/media/java/android/media/MediaRouter2.java
+++ b/media/java/android/media/MediaRouter2.java
@@ -35,7 +35,6 @@
 import com.android.internal.annotations.GuardedBy;
 
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
@@ -237,9 +236,9 @@
                 } catch (RemoteException ex) {
                     Log.e(TAG, "Unable to unregister media router.", ex);
                 }
+                mStub = null;
             }
             mShouldUpdateRoutes = true;
-            mStub = null;
         }
     }
 
@@ -379,11 +378,7 @@
      */
     public void transferTo(@NonNull MediaRoute2Info route) {
         Objects.requireNonNull(route, "route must not be null");
-
-        List<RoutingController> controllers = getControllers();
-        RoutingController controller = controllers.get(controllers.size() - 1);
-
-        transfer(controller, route);
+        transfer(getCurrentController(), route);
     }
 
     /**
@@ -391,10 +386,7 @@
      * controls the media routing, this method is a no-op.
      */
     public void stop() {
-        List<RoutingController> controllers = getControllers();
-        RoutingController controller = controllers.get(controllers.size() - 1);
-
-        controller.release();
+        getCurrentController().release();
     }
 
     /**
@@ -409,7 +401,7 @@
 
         // TODO: Check thread-safety
         if (!mRoutes.containsKey(route.getId())) {
-            notifyTransferFailed(route);
+            notifyTransferFailure(route);
             return;
         }
         if (controller.getRoutingSessionInfo().getTransferableRoutes().contains(route.getId())) {
@@ -417,12 +409,9 @@
             return;
         }
 
-        controller.release();
-
         final int requestId = mControllerCreationRequestCnt.getAndIncrement();
 
-        ControllerCreationRequest request =
-                new ControllerCreationRequest(requestId, controller, route);
+        ControllerCreationRequest request = new ControllerCreationRequest(requestId, route);
         mControllerCreationRequests.add(request);
 
         OnGetControllerHintsListener listener = mOnGetControllerHintsListener;
@@ -450,6 +439,12 @@
         }
     }
 
+    @NonNull
+    private RoutingController getCurrentController() {
+        List<RoutingController> controllers = getControllers();
+        return controllers.get(controllers.size() - 1);
+    }
+
     /**
      * Gets a {@link RoutingController} which can control the routes provided by system.
      * e.g. Phone speaker, wired headset, Bluetooth, etc.
@@ -474,13 +469,8 @@
     public List<RoutingController> getControllers() {
         List<RoutingController> result = new ArrayList<>();
         result.add(0, mSystemController);
-
-        Collection<RoutingController> controllers;
         synchronized (sRouterLock) {
-            controllers = mRoutingControllers.values();
-            if (controllers != null) {
-                result.addAll(controllers);
-            }
+            result.addAll(mRoutingControllers.values());
         }
         return result;
     }
@@ -588,14 +578,14 @@
             if (sessionInfo == null) {
                 // TODO: We may need to distinguish between failure and rejection.
                 //       One way can be introducing 'reason'.
-                notifyTransferFailed(requestedRoute);
+                notifyTransferFailure(requestedRoute);
                 return;
             } else if (!sessionInfo.getSelectedRoutes().contains(requestedRoute.getId())) {
                 Log.w(TAG, "The session does not contain the requested route. "
                         + "(requestedRouteId=" + requestedRoute.getId()
                         + ", actualRoutes=" + sessionInfo.getSelectedRoutes()
                         + ")");
-                notifyTransferFailed(requestedRoute);
+                notifyTransferFailure(requestedRoute);
                 return;
             } else if (!TextUtils.equals(requestedRoute.getProviderId(),
                     sessionInfo.getProviderId())) {
@@ -603,24 +593,38 @@
                         + "(requested route's providerId=" + requestedRoute.getProviderId()
                         + ", actual providerId=" + sessionInfo.getProviderId()
                         + ")");
-                notifyTransferFailed(requestedRoute);
+                notifyTransferFailure(requestedRoute);
                 return;
             }
         }
 
-        if (sessionInfo != null) {
-            RoutingController newController;
-            if (sessionInfo.isSystemSession()) {
-                newController = getSystemController();
-            } else {
-                newController = new RoutingController(sessionInfo);
-                synchronized (sRouterLock) {
-                    mRoutingControllers.put(newController.getId(), newController);
-                }
+        if (sessionInfo == null) {
+            return;
+        }
+
+        RoutingController oldController = getCurrentController();
+        if (!oldController.releaseInternal(
+                /* shouldReleaseSession= */ true, /* shouldNotifyStop= */ false)) {
+            // Could not release the controller since it was just released by other thread.
+            oldController = getSystemController();
+        }
+
+        RoutingController newController;
+        if (sessionInfo.isSystemSession()) {
+            newController = getSystemController();
+            newController.setRoutingSessionInfo(sessionInfo);
+        } else {
+            newController = new RoutingController(sessionInfo);
+            synchronized (sRouterLock) {
+                mRoutingControllers.put(newController.getId(), newController);
             }
-            //TODO: Determine oldController properly when transfer is launched by Output Switcher.
-            notifyTransferred(matchingRequest != null ? matchingRequest.mController :
-                    getSystemController(), newController);
+        }
+
+        // Two controller can be same if stop() is called before the result of Cast -> Phone comes.
+        if (oldController != newController) {
+            notifyTransfer(oldController, newController);
+        } else if (matchingRequest != null) {
+            notifyTransferFailure(matchingRequest.mRoute);
         }
     }
 
@@ -687,14 +691,32 @@
             return;
         }
 
-        boolean removed;
-        synchronized (sRouterLock) {
-            removed = mRoutingControllers.remove(uniqueSessionId, matchingController);
+        matchingController.releaseInternal(
+                /* shouldReleaseSession= */ false, /* shouldNotifyStop= */ true);
+    }
+
+    void onGetControllerHintsForCreatingSessionOnHandler(long uniqueRequestId,
+            MediaRoute2Info route) {
+        OnGetControllerHintsListener listener = mOnGetControllerHintsListener;
+        Bundle controllerHints = null;
+        if (listener != null) {
+            controllerHints = listener.onGetControllerHints(route);
+            if (controllerHints != null) {
+                controllerHints = new Bundle(controllerHints);
+            }
         }
 
-        if (removed) {
-            matchingController.release();
-            notifyStopped(matchingController);
+        MediaRouter2Stub stub;
+        synchronized (sRouterLock) {
+            stub = mStub;
+        }
+        if (stub != null) {
+            try {
+                mMediaRouterService.notifySessionHintsForCreatingSession(
+                        stub, uniqueRequestId, route, controllerHints);
+            } catch (RemoteException ex) {
+                Log.e(TAG, "getSessionHintsOnHandler: Unable to request.", ex);
+            }
         }
     }
 
@@ -736,22 +758,21 @@
         }
     }
 
-    private void notifyTransferred(RoutingController oldController,
-            RoutingController newController) {
+    private void notifyTransfer(RoutingController oldController, RoutingController newController) {
         for (TransferCallbackRecord record: mTransferCallbackRecords) {
             record.mExecutor.execute(
                     () -> record.mTransferCallback.onTransfer(oldController, newController));
         }
     }
 
-    private void notifyTransferFailed(MediaRoute2Info route) {
+    private void notifyTransferFailure(MediaRoute2Info route) {
         for (TransferCallbackRecord record: mTransferCallbackRecords) {
             record.mExecutor.execute(
                     () -> record.mTransferCallback.onTransferFailure(route));
         }
     }
 
-    private void notifyStopped(RoutingController controller) {
+    private void notifyStop(RoutingController controller) {
         for (TransferCallbackRecord record: mTransferCallbackRecords) {
             record.mExecutor.execute(
                     () -> record.mTransferCallback.onStop(controller));
@@ -798,8 +819,9 @@
     public abstract static class TransferCallback {
         /**
          * Called when a media is transferred between two different routing controllers.
-         * This can happen by calling {@link #transferTo(MediaRoute2Info)} or
-         * {@link RoutingController#release()}.
+         * This can happen by calling {@link #transferTo(MediaRoute2Info)}.
+         * The {@code oldController} is released before this method is called, except for the
+         * {@link #getSystemController() system controller}.
          *
          * @param oldController the previous controller that controlled routing
          * @param newController the new controller to control routing
@@ -817,6 +839,9 @@
 
         /**
          * Called when a media routing stops. It can be stopped by a user or a provider.
+         * App should not continue playing media locally when this method is called.
+         * The {@code oldController} is released before this method is called, except for the
+         * {@link #getSystemController() system controller}.
          *
          * @param controller the controller that controlled the stopped media routing.
          */
@@ -829,13 +854,14 @@
      */
     public interface OnGetControllerHintsListener {
         /**
-         * Called when the {@link MediaRouter2} is about to request
-         * the media route provider service to create a controller with the given route.
+         * Called when the {@link MediaRouter2} or the system is about to request
+         * a media route provider service to create a controller with the given route.
          * The {@link Bundle} returned here will be sent to media route provider service as a hint.
          * <p>
-         * To send hints when creating the controller, set the listener before calling
-         * {@link #transferTo(MediaRoute2Info)}. The method will be called
-         * on the same thread which calls {@link #transferTo(MediaRoute2Info)}.
+         * Since controller creation can be requested by the {@link MediaRouter2} and the system,
+         * set the listener as soon as possible after acquiring {@link MediaRouter2} instance.
+         * The method will be called on the same thread that calls
+         * {@link #transferTo(MediaRoute2Info)} or the main thread if it is requested by the system.
          *
          * @param route The route to create controller with
          * @return An optional bundle of app-specific arguments to send to the provider,
@@ -1189,32 +1215,41 @@
          */
         // TODO: Add tests using {@link MediaRouter2Manager#getActiveSessions()}.
         public void release() {
+            releaseInternal(/* shouldReleaseSession= */ true, /* shouldNotifyStop= */ true);
+        }
+
+        /**
+         * Returns {@code true} when succeeded to release, {@code false} if the controller is
+         * already released.
+         */
+        boolean releaseInternal(boolean shouldReleaseSession, boolean shouldNotifyStop) {
             synchronized (mControllerLock) {
                 if (mIsReleased) {
-                    Log.w(TAG, "release() called on released controller. Ignoring.");
-                    return;
+                    Log.w(TAG, "releaseInternal() called on released controller. Ignoring.");
+                    return false;
                 }
                 mIsReleased = true;
             }
 
             MediaRouter2Stub stub;
-            boolean removed;
             synchronized (sRouterLock) {
-                removed = mRoutingControllers.remove(getId(), this);
+                mRoutingControllers.remove(getId(), this);
                 stub = mStub;
             }
 
-            if (removed) {
-                mHandler.post(() -> notifyStopped(RoutingController.this));
-            }
-
-            if (stub != null) {
+            if (shouldReleaseSession && stub != null) {
                 try {
                     mMediaRouterService.releaseSessionWithRouter2(stub, getId());
                 } catch (RemoteException ex) {
-                    Log.e(TAG, "Unable to notify of controller release", ex);
+                    Log.e(TAG, "Unable to release session", ex);
                 }
             }
+
+            if (shouldNotifyStop) {
+                mHandler.sendMessage(obtainMessage(MediaRouter2::notifyStop, MediaRouter2.this,
+                        RoutingController.this));
+            }
+            return true;
         }
 
         @Override
@@ -1271,13 +1306,14 @@
         }
 
         @Override
-        public void release() {
-            // Do nothing. SystemRoutingController will never be released
+        public boolean isReleased() {
+            // SystemRoutingController will never be released
+            return false;
         }
 
         @Override
-        public boolean isReleased() {
-            // SystemRoutingController will never be released
+        boolean releaseInternal(boolean shouldReleaseSession, boolean shouldNotifyStop) {
+            // Do nothing. SystemRoutingController will never be released
             return false;
         }
     }
@@ -1368,22 +1404,16 @@
 
     static final class ControllerCreationRequest {
         public final int mRequestId;
-        public final RoutingController mController;
         public final MediaRoute2Info mRoute;
 
-        ControllerCreationRequest(int requestId, @NonNull RoutingController controller,
-                @NonNull MediaRoute2Info route) {
+        ControllerCreationRequest(int requestId, @NonNull MediaRoute2Info route) {
             mRequestId = requestId;
-            mController = controller;
             mRoute = route;
         }
     }
 
     class MediaRouter2Stub extends IMediaRouter2.Stub {
         @Override
-        public void notifyRestoreRoute() throws RemoteException {}
-
-        @Override
         public void notifyRoutesAdded(List<MediaRoute2Info> routes) {
             mHandler.sendMessage(obtainMessage(MediaRouter2::addRoutesOnHandler,
                     MediaRouter2.this, routes));
@@ -1418,5 +1448,13 @@
             mHandler.sendMessage(obtainMessage(MediaRouter2::releaseControllerOnHandler,
                     MediaRouter2.this, sessionInfo));
         }
+
+        @Override
+        public void getSessionHintsForCreatingSession(long uniqueRequestId,
+                @NonNull MediaRoute2Info route) {
+            mHandler.sendMessage(obtainMessage(
+                    MediaRouter2::onGetControllerHintsForCreatingSessionOnHandler,
+                    MediaRouter2.this, uniqueRequestId, route));
+        }
     }
 }
diff --git a/media/java/android/media/MediaRouter2Manager.java b/media/java/android/media/MediaRouter2Manager.java
index b694fd0..3b570b6 100644
--- a/media/java/android/media/MediaRouter2Manager.java
+++ b/media/java/android/media/MediaRouter2Manager.java
@@ -147,14 +147,16 @@
         }
 
         synchronized (sLock) {
-            if (mCallbackRecords.size() == 0 && mClient != null) {
-                try {
-                    mMediaRouterService.unregisterManager(mClient);
-                } catch (RemoteException ex) {
-                    Log.e(TAG, "Unable to unregister media router manager", ex);
+            if (mCallbackRecords.size() == 0) {
+                if (mClient != null) {
+                    try {
+                        mMediaRouterService.unregisterManager(mClient);
+                    } catch (RemoteException ex) {
+                        Log.e(TAG, "Unable to unregister media router manager", ex);
+                    }
+                    mClient = null;
                 }
-                //TODO: clear mRoutes?
-                mClient = null;
+                mRoutes.clear();
                 mPreferredFeaturesMap.clear();
             }
         }
diff --git a/media/java/android/media/RoutingSessionInfo.java b/media/java/android/media/RoutingSessionInfo.java
index 629cf154..608e29a 100644
--- a/media/java/android/media/RoutingSessionInfo.java
+++ b/media/java/android/media/RoutingSessionInfo.java
@@ -310,19 +310,19 @@
     public String toString() {
         StringBuilder result = new StringBuilder()
                 .append("RoutingSessionInfo{ ")
-                .append("sessionId=").append(mId)
-                .append(", name=").append(mName)
+                .append("sessionId=").append(getId())
+                .append(", name=").append(getName())
                 .append(", selectedRoutes={")
-                .append(String.join(",", mSelectedRoutes))
+                .append(String.join(",", getSelectedRoutes()))
                 .append("}")
                 .append(", selectableRoutes={")
-                .append(String.join(",", mSelectableRoutes))
+                .append(String.join(",", getSelectableRoutes()))
                 .append("}")
                 .append(", deselectableRoutes={")
-                .append(String.join(",", mDeselectableRoutes))
+                .append(String.join(",", getDeselectableRoutes()))
                 .append("}")
                 .append(", transferableRoutes={")
-                .append(String.join(",", mTransferableRoutes))
+                .append(String.join(",", getTransferableRoutes()))
                 .append("}")
                 .append(", volumeHandling=").append(getVolumeHandling())
                 .append(", volumeMax=").append(getVolumeMax())
diff --git a/media/java/android/media/audiopolicy/AudioVolumeGroupChangeHandler.java b/media/java/android/media/audiopolicy/AudioVolumeGroupChangeHandler.java
index adf4d3d..022cfee 100644
--- a/media/java/android/media/audiopolicy/AudioVolumeGroupChangeHandler.java
+++ b/media/java/android/media/audiopolicy/AudioVolumeGroupChangeHandler.java
@@ -80,7 +80,8 @@
                                         (AudioManager.VolumeGroupCallback) msg.obj);
                             }
                         } else {
-                            listeners = mListeners;
+                            listeners = (ArrayList<AudioManager.VolumeGroupCallback>)
+                                    mListeners.clone();
                         }
                     }
                     if (listeners.isEmpty()) {
diff --git a/media/java/android/media/midi/MidiDeviceInfo.java b/media/java/android/media/midi/MidiDeviceInfo.java
index c222985..dd3b6db 100644
--- a/media/java/android/media/midi/MidiDeviceInfo.java
+++ b/media/java/android/media/midi/MidiDeviceInfo.java
@@ -19,7 +19,6 @@
 import android.os.Bundle;
 import android.os.Parcel;
 import android.os.Parcelable;
-
 import android.util.Log;
 
 /**
@@ -205,6 +204,20 @@
     public MidiDeviceInfo(int type, int id, int numInputPorts, int numOutputPorts,
             String[] inputPortNames, String[] outputPortNames, Bundle properties,
             boolean isPrivate) {
+        // Check num ports for out-of-range values. Typical values will be
+        // between zero and three. More than 16 would be very unlikely
+        // because the port index field in the USB packet is only 4 bits.
+        // This check is mainly just to prevent OutOfMemoryErrors when
+        // fuzz testing.
+        final int maxPorts = 256; // arbitrary and very high
+        if (numInputPorts < 0 || numInputPorts > maxPorts) {
+            throw new IllegalArgumentException("numInputPorts out of range = "
+                    + numInputPorts);
+        }
+        if (numOutputPorts < 0 || numOutputPorts > maxPorts) {
+            throw new IllegalArgumentException("numOutputPorts out of range = "
+                    + numOutputPorts);
+        }
         mType = type;
         mId = id;
         mInputPortCount = numInputPorts;
diff --git a/media/java/android/media/soundtrigger_middleware/OWNERS b/media/java/android/media/soundtrigger_middleware/OWNERS
new file mode 100644
index 0000000..e5d0370
--- /dev/null
+++ b/media/java/android/media/soundtrigger_middleware/OWNERS
@@ -0,0 +1,2 @@
[email protected]
[email protected]
diff --git a/media/java/android/media/tv/ITvRemoteServiceInput.aidl b/media/java/android/media/tv/ITvRemoteServiceInput.aidl
index a0b6c9b..0e6563a 100644
--- a/media/java/android/media/tv/ITvRemoteServiceInput.aidl
+++ b/media/java/android/media/tv/ITvRemoteServiceInput.aidl
@@ -39,4 +39,10 @@
     void sendPointerUp(IBinder token, int pointerId);
     @UnsupportedAppUsage
     void sendPointerSync(IBinder token);
-}
\ No newline at end of file
+
+    // API specific to gamepads. Close gamepads with closeInputBridge
+    void openGamepadBridge(IBinder token, String name);
+    void sendGamepadKeyDown(IBinder token, int keyCode);
+    void sendGamepadKeyUp(IBinder token, int keyCode);
+    void sendGamepadAxisValue(IBinder token, int axis, float value);
+}
diff --git a/media/java/android/media/tv/tuner/Descrambler.java b/media/java/android/media/tv/tuner/Descrambler.java
index 975604c..7b58bfc3 100644
--- a/media/java/android/media/tv/tuner/Descrambler.java
+++ b/media/java/android/media/tv/tuner/Descrambler.java
@@ -52,8 +52,12 @@
      */
     public static final int PID_TYPE_MMTP = 2;
 
+    private static final String TAG = "Descrambler";
+
 
     private long mNativeContext;
+    private boolean mIsClosed = false;
+    private final Object mLock = new Object();
 
     private native int nativeAddPid(int pidType, int pid, Filter filter);
     private native int nativeRemovePid(int pidType, int pid, Filter filter);
@@ -80,7 +84,10 @@
      */
     @Result
     public int addPid(@PidType int pidType, int pid, @Nullable Filter filter) {
-        return nativeAddPid(pidType, pid, filter);
+        synchronized (mLock) {
+            TunerUtils.checkResourceState(TAG, mIsClosed);
+            return nativeAddPid(pidType, pid, filter);
+        }
     }
 
     /**
@@ -95,7 +102,10 @@
      */
     @Result
     public int removePid(@PidType int pidType, int pid, @Nullable Filter filter) {
-        return nativeRemovePid(pidType, pid, filter);
+        synchronized (mLock) {
+            TunerUtils.checkResourceState(TAG, mIsClosed);
+            return nativeRemovePid(pidType, pid, filter);
+        }
     }
 
     /**
@@ -109,8 +119,11 @@
      */
     @Result
     public int setKeyToken(@NonNull byte[] keyToken) {
-        Objects.requireNonNull(keyToken, "key token must not be null");
-        return nativeSetKeyToken(keyToken);
+        synchronized (mLock) {
+            TunerUtils.checkResourceState(TAG, mIsClosed);
+            Objects.requireNonNull(keyToken, "key token must not be null");
+            return nativeSetKeyToken(keyToken);
+        }
     }
 
     /**
@@ -118,7 +131,17 @@
      */
     @Override
     public void close() {
-        nativeClose();
+        synchronized (mLock) {
+            if (mIsClosed) {
+                return;
+            }
+            int res = nativeClose();
+            if (res != Tuner.RESULT_SUCCESS) {
+                TunerUtils.throwExceptionForResult(res, "Failed to close descrambler");
+            } else {
+                mIsClosed = true;
+            }
+        }
     }
 
 }
diff --git a/media/java/android/media/tv/tuner/Lnb.java b/media/java/android/media/tv/tuner/Lnb.java
index 9913d23..5e95794 100644
--- a/media/java/android/media/tv/tuner/Lnb.java
+++ b/media/java/android/media/tv/tuner/Lnb.java
@@ -143,9 +143,12 @@
      */
     public static final int EVENT_TYPE_LNB_OVERLOAD = Constants.LnbEventType.LNB_OVERLOAD;
 
+    private static final String TAG = "Lnb";
+
     int mId;
     LnbCallback mCallback;
     Executor mExecutor;
+    Tuner mTuner;
 
 
     private native int nativeSetVoltage(int voltage);
@@ -156,13 +159,17 @@
 
     private long mNativeContext;
 
+    private Boolean mIsClosed = false;
+    private final Object mLock = new Object();
+
     private Lnb(int id) {
         mId = id;
     }
 
-    void setCallback(Executor executor, @Nullable LnbCallback callback) {
+    void setCallback(Executor executor, @Nullable LnbCallback callback, Tuner tuner) {
         mCallback = callback;
         mExecutor = executor;
+        mTuner = tuner;
     }
 
     private void onEvent(int eventType) {
@@ -177,6 +184,12 @@
         }
     }
 
+    /* package */ boolean isClosed() {
+        synchronized (mLock) {
+            return mIsClosed;
+        }
+    }
+
     /**
      * Sets the LNB's power voltage.
      *
@@ -185,7 +198,10 @@
      */
     @Result
     public int setVoltage(@Voltage int voltage) {
-        return nativeSetVoltage(voltage);
+        synchronized (mLock) {
+            TunerUtils.checkResourceState(TAG, mIsClosed);
+            return nativeSetVoltage(voltage);
+        }
     }
 
     /**
@@ -196,7 +212,10 @@
      */
     @Result
     public int setTone(@Tone int tone) {
-        return nativeSetTone(tone);
+        synchronized (mLock) {
+            TunerUtils.checkResourceState(TAG, mIsClosed);
+            return nativeSetTone(tone);
+        }
     }
 
     /**
@@ -207,7 +226,10 @@
      */
     @Result
     public int setSatellitePosition(@Position int position) {
-        return nativeSetSatellitePosition(position);
+        synchronized (mLock) {
+            TunerUtils.checkResourceState(TAG, mIsClosed);
+            return nativeSetSatellitePosition(position);
+        }
     }
 
     /**
@@ -222,16 +244,27 @@
      */
     @Result
     public int sendDiseqcMessage(@NonNull byte[] message) {
-        return nativeSendDiseqcMessage(message);
+        synchronized (mLock) {
+            TunerUtils.checkResourceState(TAG, mIsClosed);
+            return nativeSendDiseqcMessage(message);
+        }
     }
 
     /**
      * Releases the LNB instance.
      */
     public void close() {
-        int res = nativeClose();
-        if (res != Tuner.RESULT_SUCCESS) {
-            TunerUtils.throwExceptionForResult(res, "Failed to close LNB");
+        synchronized (mLock) {
+            if (mIsClosed) {
+                return;
+            }
+            int res = nativeClose();
+            if (res != Tuner.RESULT_SUCCESS) {
+                TunerUtils.throwExceptionForResult(res, "Failed to close LNB");
+            } else {
+                mIsClosed = true;
+                mTuner.releaseLnb();
+            }
         }
     }
 }
diff --git a/media/java/android/media/tv/tuner/Tuner.java b/media/java/android/media/tv/tuner/Tuner.java
index 861eeea..50af60a 100644
--- a/media/java/android/media/tv/tuner/Tuner.java
+++ b/media/java/android/media/tv/tuner/Tuner.java
@@ -57,7 +57,10 @@
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 import java.util.concurrent.Executor;
 
@@ -222,8 +225,8 @@
     private Executor mOnResourceLostListenerExecutor;
 
     private Integer mDemuxHandle;
-    private Integer mDescramblerHandle;
-    private Descrambler mDescrambler;
+    private Map<Integer, Descrambler> mDescramblers = new HashMap<>();
+    private List<Filter> mFilters = new ArrayList<>();
 
     private final TunerResourceManager.ResourcesReclaimListener mResourceListener =
             new TunerResourceManager.ResourcesReclaimListener() {
@@ -263,14 +266,14 @@
     }
 
     private void setFrontendInfoList() {
-        List<Integer> ids = nativeGetFrontendIds();
+        List<Integer> ids = getFrontendIds();
         if (ids == null) {
             return;
         }
         TunerFrontendInfo[] infos = new TunerFrontendInfo[ids.size()];
         for (int i = 0; i < ids.size(); i++) {
             int id = ids.get(i);
-            FrontendInfo frontendInfo = nativeGetFrontendInfo(id);
+            FrontendInfo frontendInfo = getFrontendInfoById(id);
             if (frontendInfo == null) {
                 continue;
             }
@@ -281,6 +284,11 @@
         mTunerResourceManager.setFrontendInfoList(infos);
     }
 
+    /** @hide */
+    public List<Integer> getFrontendIds() {
+        return nativeGetFrontendIds();
+    }
+
     private void setLnbIds() {
         int[] ids = nativeGetLnbIds();
         if (ids == null) {
@@ -345,14 +353,39 @@
     @Override
     public void close() {
         if (mFrontendHandle != null) {
-            mTunerResourceManager.releaseFrontend(mFrontendHandle);
+            int res = nativeCloseFrontend(mFrontendHandle);
+            if (res != Tuner.RESULT_SUCCESS) {
+                TunerUtils.throwExceptionForResult(res, "failed to close frontend");
+            }
+            mTunerResourceManager.releaseFrontend(mFrontendHandle, mClientId);
             mFrontendHandle = null;
+            mFrontend = null;
         }
         if (mLnb != null) {
-            mTunerResourceManager.releaseLnb(mLnbHandle);
-            mLnb = null;
+            mLnb.close();
         }
-        nativeClose();
+        if (!mDescramblers.isEmpty()) {
+            for (Map.Entry<Integer, Descrambler> d : mDescramblers.entrySet()) {
+                d.getValue().close();
+                mTunerResourceManager.releaseDescrambler(d.getKey(), mClientId);
+            }
+            mDescramblers.clear();
+        }
+        if (!mFilters.isEmpty()) {
+            for (Filter f : mFilters) {
+                f.close();
+            }
+            mFilters.clear();
+        }
+        if (mDemuxHandle != null) {
+            int res = nativeCloseDemux(mDemuxHandle);
+            if (res != Tuner.RESULT_SUCCESS) {
+                TunerUtils.throwExceptionForResult(res, "failed to close demux");
+            }
+            mTunerResourceManager.releaseDemux(mDemuxHandle, mClientId);
+            mFrontendHandle = null;
+        }
+        TunerUtils.throwExceptionForResult(nativeClose(), "failed to close tuner");
     }
 
     /**
@@ -374,6 +407,8 @@
      * Native method to open frontend of the given ID.
      */
     private native Frontend nativeOpenFrontendByHandle(int handle);
+    @Result
+    private native int nativeCloseFrontendByHandle(int handle);
     private native int nativeTune(int type, FrontendSettings settings);
     private native int nativeStopTune();
     private native int nativeScan(int settingsType, FrontendSettings settings, int scanType);
@@ -401,6 +436,8 @@
 
     private static native DemuxCapabilities nativeGetDemuxCapabilities();
 
+    private native int nativeCloseDemux(int handle);
+    private native int nativeCloseFrontend(int handle);
     private native int nativeClose();
 
 
@@ -521,9 +558,11 @@
     @Result
     public int tune(@NonNull FrontendSettings settings) {
         mFrontendType = settings.getType();
-        checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_FRONTEND);
-        mFrontendInfo = null;
-        return nativeTune(settings.getType(), settings);
+        if (checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_FRONTEND)) {
+            mFrontendInfo = null;
+            return nativeTune(settings.getType(), settings);
+        }
+        return RESULT_UNAVAILABLE;
     }
 
     /**
@@ -559,11 +598,13 @@
                             + "started.");
         }
         mFrontendType = settings.getType();
-        checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_FRONTEND);
-        mScanCallback = scanCallback;
-        mScanCallbackExecutor = executor;
-        mFrontendInfo = null;
-        return nativeScan(settings.getType(), settings, scanType);
+        if (checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_FRONTEND)) {
+            mScanCallback = scanCallback;
+            mScanCallbackExecutor = executor;
+            mFrontendInfo = null;
+            return nativeScan(settings.getType(), settings, scanType);
+        }
+        return RESULT_UNAVAILABLE;
     }
 
     /**
@@ -646,7 +687,9 @@
      * @return the id of hardware A/V sync.
      */
     public int getAvSyncHwId(@NonNull Filter filter) {
-        checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX);
+        if (!checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX)) {
+            return INVALID_AV_SYNC_ID;
+        }
         Integer id = nativeGetAvSyncHwId(filter);
         return id == null ? INVALID_AV_SYNC_ID : id;
     }
@@ -661,7 +704,9 @@
      * @return the current timestamp of hardware A/V sync.
      */
     public long getAvSyncTime(int avSyncHwId) {
-        checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX);
+        if (!checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX)) {
+            return INVALID_TIMESTAMP;
+        }
         Long time = nativeGetAvSyncTime(avSyncHwId);
         return time == null ? INVALID_TIMESTAMP : time;
     }
@@ -677,8 +722,10 @@
      */
     @Result
     public int connectCiCam(int ciCamId) {
-        checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX);
-        return nativeConnectCiCam(ciCamId);
+        if (checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX)) {
+            return nativeConnectCiCam(ciCamId);
+        }
+        return RESULT_UNAVAILABLE;
     }
 
     /**
@@ -690,8 +737,10 @@
      */
     @Result
     public int disconnectCiCam() {
-        checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX);
-        return nativeDisconnectCiCam();
+        if (checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX)) {
+            return nativeDisconnectCiCam();
+        }
+        return RESULT_UNAVAILABLE;
     }
 
     /**
@@ -701,16 +750,23 @@
      */
     @Nullable
     public FrontendInfo getFrontendInfo() {
-        checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_FRONTEND);
+        if (!checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_FRONTEND)) {
+            return null;
+        }
         if (mFrontend == null) {
             throw new IllegalStateException("frontend is not initialized");
         }
         if (mFrontendInfo == null) {
-            mFrontendInfo = nativeGetFrontendInfo(mFrontend.mId);
+            mFrontendInfo = getFrontendInfoById(mFrontend.mId);
         }
         return mFrontendInfo;
     }
 
+    /** @hide */
+    public FrontendInfo getFrontendInfoById(int id) {
+        return nativeGetFrontendInfo(id);
+    }
+
     /**
      * Gets Demux capabilities.
      *
@@ -831,7 +887,9 @@
     public Filter openFilter(@Type int mainType, @Subtype int subType,
             @BytesLong long bufferSize, @CallbackExecutor @Nullable Executor executor,
             @Nullable FilterCallback cb) {
-        checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX);
+        if (!checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX)) {
+            return null;
+        }
         Filter filter = nativeOpenFilter(
                 mainType, TunerUtils.getFilterSubtype(mainType, subType), bufferSize);
         if (filter != null) {
@@ -841,6 +899,7 @@
             if (mHandler == null) {
                 mHandler = createEventHandler();
             }
+            mFilters.add(filter);
         }
         return filter;
     }
@@ -859,11 +918,16 @@
     public Lnb openLnb(@CallbackExecutor @NonNull Executor executor, @NonNull LnbCallback cb) {
         Objects.requireNonNull(executor, "executor must not be null");
         Objects.requireNonNull(cb, "LnbCallback must not be null");
-        checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_LNB);
         if (mLnb != null) {
-            mLnb.setCallback(executor, cb);
+            mLnb.setCallback(executor, cb, this);
+            return mLnb;
         }
-        return mLnb;
+        if (checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_LNB) && mLnb != null) {
+            mLnb.setCallback(executor, cb, this);
+            setLnb(mLnb);
+            return mLnb;
+        }
+        return null;
     }
 
     /**
@@ -881,9 +945,15 @@
         Objects.requireNonNull(name, "LNB name must not be null");
         Objects.requireNonNull(executor, "executor must not be null");
         Objects.requireNonNull(cb, "LnbCallback must not be null");
-        mLnb = nativeOpenLnbByName(name);
-        if (mLnb != null) {
-            mLnb.setCallback(executor, cb);
+        Lnb newLnb = nativeOpenLnbByName(name);
+        if (newLnb != null) {
+            if (mLnb != null) {
+                mLnb.close();
+                mLnbHandle = null;
+            }
+            mLnb = newLnb;
+            mLnb.setCallback(executor, cb, this);
+            setLnb(mLnb);
         }
         return mLnb;
     }
@@ -906,7 +976,9 @@
      */
     @Nullable
     public TimeFilter openTimeFilter() {
-        checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX);
+        if (!checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX)) {
+            return null;
+        }
         return nativeOpenTimeFilter();
     }
 
@@ -918,8 +990,10 @@
     @RequiresPermission(android.Manifest.permission.ACCESS_TV_DESCRAMBLER)
     @Nullable
     public Descrambler openDescrambler() {
-        checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_DESCRAMBLER);
-        return mDescrambler;
+        if (!checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX)) {
+            return null;
+        }
+        return requestDescrambler();
     }
 
     /**
@@ -939,7 +1013,9 @@
             @NonNull OnRecordStatusChangedListener l) {
         Objects.requireNonNull(executor, "executor must not be null");
         Objects.requireNonNull(l, "OnRecordStatusChangedListener must not be null");
-        checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX);
+        if (!checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX)) {
+            return null;
+        }
         DvrRecorder dvr = nativeOpenDvrRecorder(bufferSize);
         dvr.setListener(executor, l);
         return dvr;
@@ -962,7 +1038,9 @@
             @NonNull OnPlaybackStatusChangedListener l) {
         Objects.requireNonNull(executor, "executor must not be null");
         Objects.requireNonNull(l, "OnPlaybackStatusChangedListener must not be null");
-        checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX);
+        if (!checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX)) {
+            return null;
+        }
         DvrPlayback dvr = nativeOpenDvrPlayback(bufferSize);
         dvr.setListener(executor, l);
         return dvr;
@@ -979,15 +1057,21 @@
         return granted;
     }
 
-    private boolean requestDescrambler() {
+    private Descrambler requestDescrambler() {
         int[] descramblerHandle = new int[1];
         TunerDescramblerRequest request = new TunerDescramblerRequest(mClientId);
         boolean granted = mTunerResourceManager.requestDescrambler(request, descramblerHandle);
-        if (granted) {
-            mDescramblerHandle = descramblerHandle[0];
-            mDescrambler = nativeOpenDescramblerByHandle(mDescramblerHandle);
+        if (!granted) {
+            return null;
         }
-        return granted;
+        int handle = descramblerHandle[0];
+        Descrambler descrambler = nativeOpenDescramblerByHandle(handle);
+        if (descrambler != null) {
+            mDescramblers.put(handle, descrambler);
+        } else {
+            mTunerResourceManager.releaseDescrambler(handle, mClientId);
+        }
+        return descrambler;
     }
 
     private boolean checkResource(int resourceType)  {
@@ -999,7 +1083,7 @@
                 break;
             }
             case TunerResourceManager.TUNER_RESOURCE_TYPE_LNB: {
-                if (mLnbHandle == null && !requestLnb()) {
+                if (mLnb == null && !requestLnb()) {
                     return false;
                 }
                 break;
@@ -1010,13 +1094,15 @@
                 }
                 break;
             }
-            case TunerResourceManager.TUNER_RESOURCE_TYPE_DESCRAMBLER: {
-                if (mDescramblerHandle == null && !requestDescrambler()) {
-                    return false;
-                }
-                break;
-            }
+            default:
+                return false;
         }
         return true;
     }
+
+    /* package */ void releaseLnb() {
+        mTunerResourceManager.releaseLnb(mLnbHandle, mClientId);
+        mLnbHandle = null;
+        mLnb = null;
+    }
 }
diff --git a/media/java/android/media/tv/tuner/TunerUtils.java b/media/java/android/media/tv/tuner/TunerUtils.java
index c1589cf..a13077c7 100644
--- a/media/java/android/media/tv/tuner/TunerUtils.java
+++ b/media/java/android/media/tv/tuner/TunerUtils.java
@@ -157,5 +157,16 @@
         throw new RuntimeException("Unexpected result " + r + ".  " + msg);
     }
 
+    /**
+     * Checks the state of a resource instance.
+     *
+     * @throws IllegalStateException if the resource has already been closed.
+     */
+    public static void checkResourceState(String name, boolean closed) {
+        if (closed) {
+            throw new IllegalStateException(name + " has been closed");
+        }
+    }
+
     private TunerUtils() {}
 }
diff --git a/media/java/android/media/tv/tuner/filter/Filter.java b/media/java/android/media/tv/tuner/filter/Filter.java
index d654b45..cc932da 100644
--- a/media/java/android/media/tv/tuner/filter/Filter.java
+++ b/media/java/android/media/tv/tuner/filter/Filter.java
@@ -180,6 +180,8 @@
      */
     public static final int STATUS_OVERFLOW = Constants.DemuxFilterStatus.OVERFLOW;
 
+    private static final String TAG = "Filter";
+
     private long mNativeContext;
     private FilterCallback mCallback;
     private Executor mExecutor;
@@ -188,6 +190,8 @@
     private int mSubtype;
     private Filter mSource;
     private boolean mStarted;
+    private boolean mIsClosed = false;
+    private final Object mLock = new Object();
 
     private native int nativeConfigureFilter(
             int type, int subType, FilterConfiguration settings);
@@ -244,21 +248,27 @@
      */
     @Result
     public int configure(@NonNull FilterConfiguration config) {
-        Settings s = config.getSettings();
-        int subType = (s == null) ? mSubtype : s.getType();
-        if (mMainType != config.getType() || mSubtype != subType) {
-            throw new IllegalArgumentException("Invalid filter config. filter main type="
-                    + mMainType + ", filter subtype=" + mSubtype + ". config main type="
-                    + config.getType() + ", config subtype=" + subType);
+        synchronized (mLock) {
+            TunerUtils.checkResourceState(TAG, mIsClosed);
+            Settings s = config.getSettings();
+            int subType = (s == null) ? mSubtype : s.getType();
+            if (mMainType != config.getType() || mSubtype != subType) {
+                throw new IllegalArgumentException("Invalid filter config. filter main type="
+                        + mMainType + ", filter subtype=" + mSubtype + ". config main type="
+                        + config.getType() + ", config subtype=" + subType);
+            }
+            return nativeConfigureFilter(config.getType(), subType, config);
         }
-        return nativeConfigureFilter(config.getType(), subType, config);
     }
 
     /**
      * Gets the filter Id.
      */
     public int getId() {
-        return nativeGetId();
+        synchronized (mLock) {
+            TunerUtils.checkResourceState(TAG, mIsClosed);
+            return nativeGetId();
+        }
     }
 
     /**
@@ -276,14 +286,17 @@
      */
     @Result
     public int setDataSource(@Nullable Filter source) {
-        if (mSource != null) {
-            throw new IllegalStateException("Data source is existing");
+        synchronized (mLock) {
+            TunerUtils.checkResourceState(TAG, mIsClosed);
+            if (mSource != null) {
+                throw new IllegalStateException("Data source is existing");
+            }
+            int res = nativeSetDataSource(source);
+            if (res == Tuner.RESULT_SUCCESS) {
+                mSource = source;
+            }
+            return res;
         }
-        int res = nativeSetDataSource(source);
-        if (res == Tuner.RESULT_SUCCESS) {
-            mSource = source;
-        }
-        return res;
     }
 
     /**
@@ -295,7 +308,10 @@
      */
     @Result
     public int start() {
-        return nativeStartFilter();
+        synchronized (mLock) {
+            TunerUtils.checkResourceState(TAG, mIsClosed);
+            return nativeStartFilter();
+        }
     }
 
 
@@ -308,7 +324,10 @@
      */
     @Result
     public int stop() {
-        return nativeStopFilter();
+        synchronized (mLock) {
+            TunerUtils.checkResourceState(TAG, mIsClosed);
+            return nativeStopFilter();
+        }
     }
 
     /**
@@ -321,7 +340,10 @@
      */
     @Result
     public int flush() {
-        return nativeFlushFilter();
+        synchronized (mLock) {
+            TunerUtils.checkResourceState(TAG, mIsClosed);
+            return nativeFlushFilter();
+        }
     }
 
     /**
@@ -333,8 +355,11 @@
      * @return the number of bytes read.
      */
     public int read(@NonNull byte[] buffer, @BytesLong long offset, @BytesLong long size) {
-        size = Math.min(size, buffer.length - offset);
-        return nativeRead(buffer, offset, size);
+        synchronized (mLock) {
+            TunerUtils.checkResourceState(TAG, mIsClosed);
+            size = Math.min(size, buffer.length - offset);
+            return nativeRead(buffer, offset, size);
+        }
     }
 
     /**
@@ -342,9 +367,16 @@
      */
     @Override
     public void close() {
-        int res = nativeClose();
-        if (res != Tuner.RESULT_SUCCESS) {
-            TunerUtils.throwExceptionForResult(res, "Failed to close filter.");
+        synchronized (mLock) {
+            if (mIsClosed) {
+                return;
+            }
+            int res = nativeClose();
+            if (res != Tuner.RESULT_SUCCESS) {
+                TunerUtils.throwExceptionForResult(res, "Failed to close filter.");
+            } else {
+                mIsClosed = true;
+            }
         }
     }
 }
diff --git a/media/java/android/media/tv/tunerresourcemanager/ITunerResourceManager.aidl b/media/java/android/media/tv/tunerresourcemanager/ITunerResourceManager.aidl
index 77cac6e..487b444 100644
--- a/media/java/android/media/tv/tunerresourcemanager/ITunerResourceManager.aidl
+++ b/media/java/android/media/tv/tunerresourcemanager/ITunerResourceManager.aidl
@@ -85,7 +85,8 @@
      * Updates the available Frontend resources information on the current device.
      *
      * <p><strong>Note:</strong> This update must happen before the first
-     * {@link #requestFrontend(TunerFrontendRequest,int[])} and {@link #releaseFrontend(int)} call.
+     * {@link #requestFrontend(TunerFrontendRequest,int[])} and {@link #releaseFrontend(int, int)}
+     * call.
      *
      * @param infos an array of the available {@link TunerFrontendInfo} information.
      */
@@ -95,7 +96,8 @@
      * Updates the available Cas resource information on the current device.
      *
      * <p><strong>Note:</strong> This update must happen before the first
-     * {@link #requestCasSession(CasSessionRequest, int[])} and {@link #releaseCasSession(int)} call.
+     * {@link #requestCasSession(CasSessionRequest, int[])} and {@link #releaseCasSession(int, int)}
+     * call.
      *
      * @param casSystemId id of the updating CAS system.
      * @param maxSessionNum the max session number of the CAS system that is updated.
@@ -106,7 +108,7 @@
      * Updates the available Lnb resource information on the current device.
      *
      * <p><strong>Note:</strong> This update must happen before the first
-     * {@link #requestLnb(TunerLnbRequest, int[])} and {@link #releaseLnb(int)} call.
+     * {@link #requestLnb(TunerLnbRequest, int[])} and {@link #releaseLnb(int, int)} call.
      *
      * @param lnbIds ids of the updating lnbs.
      */
@@ -132,11 +134,11 @@
      * before this request.
      *
      * @param request {@link TunerFrontendRequest} information of the current request.
-     * @param frontendId a one-element array to return the granted frontendId.
+     * @param frontendHandle a one-element array to return the granted frontendHandle.
      *
      * @return true if there is frontend granted.
      */
-    boolean requestFrontend(in TunerFrontendRequest request, out int[] frontendId);
+    boolean requestFrontend(in TunerFrontendRequest request, out int[] frontendHandle);
 
     /*
      * Requests to share frontend with an existing client.
@@ -216,11 +218,11 @@
      * <p><strong>Note:</strong> {@link #updateCasInfo(int, int)} must be called before this request.
      *
      * @param request {@link CasSessionRequest} information of the current request.
-     * @param sessionResourceId a one-element array to return the granted cas session id.
+     * @param casSessionHandle a one-element array to return the granted cas session handle.
      *
      * @return true if there is CAS session granted.
      */
-    boolean requestCasSession(in CasSessionRequest request, out int[] sessionResourceId);
+    boolean requestCasSession(in CasSessionRequest request, out int[] casSessionHandle);
 
     /*
      * This API is used by the Tuner framework to request an available Lnb from the TunerHAL.
@@ -240,11 +242,11 @@
      * <p><strong>Note:</strong> {@link #setLnbInfos(int[])} must be called before this request.
      *
      * @param request {@link TunerLnbRequest} information of the current request.
-     * @param lnbId a one-element array to return the granted Lnb id.
+     * @param lnbHandle a one-element array to return the granted Lnb handle.
      *
      * @return true if there is Lnb granted.
      */
-    boolean requestLnb(in TunerLnbRequest request, out int[] lnbId);
+    boolean requestLnb(in TunerLnbRequest request, out int[] lnbHandle);
 
     /*
      * Notifies the TRM that the given frontend has been released.
@@ -254,9 +256,10 @@
      * <p><strong>Note:</strong> {@link #setFrontendInfoList(TunerFrontendInfo[])} must be called
      * before this release.
      *
-     * @param frontendId the id of the released frontend.
+     * @param frontendHandle the handle of the released frontend.
+     * @param clientId the id of the client that is releasing the frontend.
      */
-    void releaseFrontend(in int frontendId);
+    void releaseFrontend(in int frontendHandle, int clientId);
 
     /*
      * Notifies the TRM that the Demux with the given handle was released.
@@ -264,17 +267,19 @@
      * <p>Client must call this whenever it releases a demux.
      *
      * @param demuxHandle the handle of the released Tuner Demux.
+     * @param clientId the id of the client that is releasing the demux.
      */
-    void releaseDemux(in int demuxHandle);
+    void releaseDemux(in int demuxHandle, int clientId);
 
     /*
      * Notifies the TRM that the Descrambler with the given handle was released.
      *
      * <p>Client must call this whenever it releases a descrambler.
      *
-     * @param demuxHandle the handle of the released Tuner Descrambler.
+     * @param descramblerHandle the handle of the released Tuner Descrambler.
+     * @param clientId the id of the client that is releasing the descrambler.
      */
-    void releaseDescrambler(in int descramblerHandle);
+    void releaseDescrambler(in int descramblerHandle, int clientId);
 
     /*
      * Notifies the TRM that the given Cas session has been released.
@@ -283,20 +288,22 @@
      *
      * <p><strong>Note:</strong> {@link #updateCasInfo(int, int)} must be called before this release.
      *
-     * @param sessionResourceId the id of the released CAS session.
+     * @param casSessionHandle the handle of the released CAS session.
+     * @param clientId the id of the client that is releasing the cas session.
      */
-    void releaseCasSession(in int sessionResourceId);
+    void releaseCasSession(in int casSessionHandle, int clientId);
 
     /*
-     * Notifies the TRM that the Lnb with the given id was released.
+     * Notifies the TRM that the Lnb with the given handle was released.
      *
      * <p>Client must call this whenever it releases an Lnb.
      *
      * <p><strong>Note:</strong> {@link #setLnbInfos(int[])} must be called before this release.
      *
-     * @param lnbId the id of the released Tuner Lnb.
+     * @param lnbHandle the handle of the released Tuner Lnb.
+     * @param clientId the id of the client that is releasing the lnb.
      */
-    void releaseLnb(in int lnbId);
+    void releaseLnb(in int lnbHandle, int clientId);
 
     /*
      * Compare two clients' priority.
diff --git a/media/java/android/media/tv/tunerresourcemanager/TunerResourceManager.java b/media/java/android/media/tv/tunerresourcemanager/TunerResourceManager.java
index 2c8899c..be102d8 100644
--- a/media/java/android/media/tv/tunerresourcemanager/TunerResourceManager.java
+++ b/media/java/android/media/tv/tunerresourcemanager/TunerResourceManager.java
@@ -64,6 +64,7 @@
     private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
 
     public static final int INVALID_RESOURCE_HANDLE = -1;
+    public static final int INVALID_OWNER_ID = -1;
     /**
      * Tuner resource type to help generate resource handle
      */
@@ -73,6 +74,7 @@
         TUNER_RESOURCE_TYPE_DESCRAMBLER,
         TUNER_RESOURCE_TYPE_LNB,
         TUNER_RESOURCE_TYPE_CAS_SESSION,
+        TUNER_RESOURCE_TYPE_MAX,
      })
     @Retention(RetentionPolicy.SOURCE)
     public @interface TunerResourceType {}
@@ -82,6 +84,7 @@
     public static final int TUNER_RESOURCE_TYPE_DESCRAMBLER = 2;
     public static final int TUNER_RESOURCE_TYPE_LNB = 3;
     public static final int TUNER_RESOURCE_TYPE_CAS_SESSION = 4;
+    public static final int TUNER_RESOURCE_TYPE_MAX = 5;
 
     private final ITunerResourceManager mService;
     private final int mUserId;
@@ -177,7 +180,8 @@
      * Updates the current TRM of the TunerHAL Frontend information.
      *
      * <p><strong>Note:</strong> This update must happen before the first
-     * {@link #requestFrontend(TunerFrontendRequest, int[])} and {@link #releaseFrontend(int)} call.
+     * {@link #requestFrontend(TunerFrontendRequest, int[])} and
+     * {@link #releaseFrontend(int, int)} call.
      *
      * @param infos an array of the available {@link TunerFrontendInfo} information.
      */
@@ -193,7 +197,7 @@
      * Updates the TRM of the current CAS information.
      *
      * <p><strong>Note:</strong> This update must happen before the first
-     * {@link #requestCasSession(CasSessionRequest, int[])} and {@link #releaseCasSession(int)}
+     * {@link #requestCasSession(CasSessionRequest, int[])} and {@link #releaseCasSession(int, int)}
      * call.
      *
      * @param casSystemId id of the updating CAS system.
@@ -211,7 +215,7 @@
      * Updates the TRM of the current Lnb information.
      *
      * <p><strong>Note:</strong> This update must happen before the first
-     * {@link #requestLnb(TunerLnbRequest, int[])} and {@link #releaseLnb(int)} call.
+     * {@link #requestLnb(TunerLnbRequest, int[])} and {@link #releaseLnb(int, int)} call.
      *
      * @param lnbIds ids of the updating lnbs.
      */
@@ -243,16 +247,16 @@
      * before this request.
      *
      * @param request {@link TunerFrontendRequest} information of the current request.
-     * @param frontendId a one-element array to return the granted frontendId. If
-     *                   no frontend granted, this will return {@link #INVALID_FRONTEND_ID}.
+     * @param frontendHandle a one-element array to return the granted frontendHandle. If
+     *                       no frontend granted, this will return {@link #INVALID_RESOURCE_HANDLE}.
      *
      * @return true if there is frontend granted.
      */
     public boolean requestFrontend(@NonNull TunerFrontendRequest request,
-                @Nullable int[] frontendId) {
+                @Nullable int[] frontendHandle) {
         boolean result = false;
         try {
-            result = mService.requestFrontend(request, frontendId);
+            result = mService.requestFrontend(request, frontendHandle);
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
@@ -358,17 +362,16 @@
      * request.
      *
      * @param request {@link CasSessionRequest} information of the current request.
-     * @param sessionResourceId a one-element array to return the granted cas session id.
-     *                          If no CAS granted, this will return
-     *                          {@link #INVALID_CAS_SESSION_RESOURCE_ID}.
+     * @param casSessionHandle a one-element array to return the granted cas session handel.
+     *                         If no CAS granted, this will return {@link #INVALID_RESOURCE_HANDLE}.
      *
      * @return true if there is CAS session granted.
      */
     public boolean requestCasSession(@NonNull CasSessionRequest request,
-                @NonNull int[] sessionResourceId) {
+                @NonNull int[] casSessionHandle) {
         boolean result = false;
         try {
-            result = mService.requestCasSession(request, sessionResourceId);
+            result = mService.requestCasSession(request, casSessionHandle);
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
@@ -393,15 +396,15 @@
      * <p><strong>Note:</strong> {@link #setLnbInfoList(int[])} must be called before this request.
      *
      * @param request {@link TunerLnbRequest} information of the current request.
-     * @param lnbId a one-element array to return the granted Lnb id.
-     *              If no Lnb granted, this will return {@link #INVALID_LNB_ID}.
+     * @param lnbHandle a one-element array to return the granted Lnb handle.
+     *                  If no Lnb granted, this will return {@link #INVALID_RESOURCE_HANDLE}.
      *
      * @return true if there is Lnb granted.
      */
-    public boolean requestLnb(@NonNull TunerLnbRequest request, @NonNull int[] lnbId) {
+    public boolean requestLnb(@NonNull TunerLnbRequest request, @NonNull int[] lnbHandle) {
         boolean result = false;
         try {
-            result = mService.requestLnb(request, lnbId);
+            result = mService.requestLnb(request, lnbHandle);
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
@@ -416,11 +419,12 @@
      * <p><strong>Note:</strong> {@link #setFrontendInfoList(TunerFrontendInfo[])} must be called
      * before this release.
      *
-     * @param frontendId the id of the released frontend.
+     * @param frontendHandle the handle of the released frontend.
+     * @param clientId the id of the client that is releasing the frontend.
      */
-    public void releaseFrontend(int frontendId) {
+    public void releaseFrontend(int frontendHandle, int clientId) {
         try {
-            mService.releaseFrontend(frontendId);
+            mService.releaseFrontend(frontendHandle, clientId);
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
@@ -432,10 +436,11 @@
      * <p>Client must call this whenever it releases an Demux.
      *
      * @param demuxHandle the handle of the released Tuner Demux.
+     * @param clientId the id of the client that is releasing the demux.
      */
-    public void releaseDemux(int demuxHandle) {
+    public void releaseDemux(int demuxHandle, int clientId) {
         try {
-            mService.releaseDemux(demuxHandle);
+            mService.releaseDemux(demuxHandle, clientId);
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
@@ -447,10 +452,11 @@
      * <p>Client must call this whenever it releases an Descrambler.
      *
      * @param descramblerHandle the handle of the released Tuner Descrambler.
+     * @param clientId the id of the client that is releasing the descrambler.
      */
-    public void releaseDescrambler(int descramblerHandle) {
+    public void releaseDescrambler(int descramblerHandle, int clientId) {
         try {
-            mService.releaseDescrambler(descramblerHandle);
+            mService.releaseDescrambler(descramblerHandle, clientId);
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
@@ -464,11 +470,12 @@
      * <p><strong>Note:</strong> {@link #updateCasInfo(int, int)} must be called before this
      * release.
      *
-     * @param sessionResourceId the id of the released CAS session.
+     * @param casSessionHandle the handle of the released CAS session.
+     * @param clientId the id of the client that is releasing the cas session.
      */
-    public void releaseCasSession(int sessionResourceId) {
+    public void releaseCasSession(int casSessionHandle, int clientId) {
         try {
-            mService.releaseCasSession(sessionResourceId);
+            mService.releaseCasSession(casSessionHandle, clientId);
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
@@ -481,11 +488,12 @@
      *
      * <p><strong>Note:</strong> {@link #setLnbInfoList(int[])} must be called before this release.
      *
-     * @param lnbId the id of the released Tuner Lnb.
+     * @param lnbHandle the handle of the released Tuner Lnb.
+     * @param clientId the id of the client that is releasing the lnb.
      */
-    public void releaseLnb(int lnbId) {
+    public void releaseLnb(int lnbHandle, int clientId) {
         try {
-            mService.releaseLnb(lnbId);
+            mService.releaseLnb(lnbHandle, clientId);
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
diff --git a/media/java/android/mtp/MtpDatabase.java b/media/java/android/mtp/MtpDatabase.java
index e6962a1..aba74e5 100755
--- a/media/java/android/mtp/MtpDatabase.java
+++ b/media/java/android/mtp/MtpDatabase.java
@@ -46,6 +46,7 @@
 import android.view.WindowManager;
 
 import com.android.internal.annotations.VisibleForNative;
+import com.android.internal.annotations.VisibleForTesting;
 
 import dalvik.system.CloseGuard;
 
@@ -408,7 +409,8 @@
     }
 
     @VisibleForNative
-    private int beginSendObject(String path, int format, int parent, int storageId) {
+    @VisibleForTesting
+    public int beginSendObject(String path, int format, int parent, int storageId) {
         MtpStorageManager.MtpObject parentObj =
                 parent == 0 ? mManager.getStorageRoot(storageId) : mManager.getObject(parent);
         if (parentObj == null) {
@@ -452,7 +454,8 @@
     }
 
     @VisibleForNative
-    private int getNumObjects(int storageID, int format, int parent) {
+    @VisibleForTesting
+    public int getNumObjects(int storageID, int format, int parent) {
         List<MtpStorageManager.MtpObject> objs = mManager.getObjects(parent,
                 format, storageID);
         if (objs == null) {
@@ -830,7 +833,8 @@
     }
 
     @VisibleForNative
-    private boolean getThumbnailInfo(int handle, long[] outLongs) {
+    @VisibleForTesting
+    public boolean getThumbnailInfo(int handle, long[] outLongs) {
         MtpStorageManager.MtpObject obj = mManager.getObject(handle);
         if (obj == null) {
             return false;
@@ -866,7 +870,8 @@
     }
 
     @VisibleForNative
-    private byte[] getThumbnailData(int handle) {
+    @VisibleForTesting
+    public byte[] getThumbnailData(int handle) {
         MtpStorageManager.MtpObject obj = mManager.getObject(handle);
         if (obj == null) {
             return null;
diff --git a/media/java/android/mtp/MtpStorage.java b/media/java/android/mtp/MtpStorage.java
index ba75263..88c32a3 100644
--- a/media/java/android/mtp/MtpStorage.java
+++ b/media/java/android/mtp/MtpStorage.java
@@ -36,7 +36,7 @@
 
     public MtpStorage(StorageVolume volume, int storageId) {
         mStorageId = storageId;
-        mPath = volume.getInternalPath();
+        mPath = volume.getPath();
         mDescription = volume.getDescription(null);
         mRemovable = volume.isRemovable();
         mMaxFileSize = volume.getMaxFileSize();
diff --git a/media/jni/android_media_MediaCodec.cpp b/media/jni/android_media_MediaCodec.cpp
index a31f177..947cfc0 100644
--- a/media/jni/android_media_MediaCodec.cpp
+++ b/media/jni/android_media_MediaCodec.cpp
@@ -132,6 +132,8 @@
     jmethodID asReadOnlyBufferId;
     jmethodID positionId;
     jmethodID limitId;
+    jmethodID getPositionId;
+    jmethodID getLimitId;
 } gByteBufferInfo;
 
 static struct {
@@ -733,14 +735,19 @@
         }
     }
 
-    jobject format;
-    err = getOutputFormat(env, index, &format);
+    jobject formatMap;
+    err = getOutputFormat(env, index, &formatMap);
     if (err != OK) {
         return err;
     }
-    env->SetObjectField(frame, gFields.outputFrameFormatID, format);
-    env->DeleteLocalRef(format);
-    format = nullptr;
+    ScopedLocalRef<jclass> mediaFormatClass{env, env->FindClass("android/media/MediaFormat")};
+    ScopedLocalRef<jobject> format{env, env->NewObject(
+            mediaFormatClass.get(),
+            env->GetMethodID(mediaFormatClass.get(), "<init>", "(Ljava/util/Map;)V"),
+            formatMap)};
+    env->SetObjectField(frame, gFields.outputFrameFormatID, format.get());
+    env->DeleteLocalRef(formatMap);
+    formatMap = nullptr;
 
     sp<RefBase> obj;
     if (buffer->meta()->findObject("changedKeys", &obj) && obj) {
@@ -2033,13 +2040,11 @@
         if (env->IsInstanceOf(jvalue.get(), sFields.mStringClass)) {
             const char *tmp = env->GetStringUTFChars((jstring)jvalue.get(), nullptr);
             AString value;
-            if (tmp) {
-                value.setTo(tmp);
-            }
-            env->ReleaseStringUTFChars((jstring)jvalue.get(), tmp);
-            if (value.empty()) {
+            if (!tmp) {
                 return NO_MEMORY;
             }
+            value.setTo(tmp);
+            env->ReleaseStringUTFChars((jstring)jvalue.get(), tmp);
             result->setString(key.c_str(), value);
         } else if (env->IsInstanceOf(jvalue.get(), sFields.mIntegerClass)) {
             jint value = env->CallIntMethod(jvalue.get(), sFields.mIntegerValueId);
@@ -2051,8 +2056,8 @@
             jfloat value = env->CallFloatMethod(jvalue.get(), sFields.mFloatValueId);
             result->setFloat(key.c_str(), value);
         } else if (env->IsInstanceOf(jvalue.get(), gByteBufferInfo.clazz)) {
-            jint position = env->CallIntMethod(jvalue.get(), gByteBufferInfo.positionId);
-            jint limit = env->CallIntMethod(jvalue.get(), gByteBufferInfo.limitId);
+            jint position = env->CallIntMethod(jvalue.get(), gByteBufferInfo.getPositionId);
+            jint limit = env->CallIntMethod(jvalue.get(), gByteBufferInfo.getLimitId);
             sp<ABuffer> buffer{new ABuffer(limit - position)};
             void *data = env->GetDirectBufferAddress(jvalue.get());
             if (data != nullptr) {
@@ -2773,6 +2778,14 @@
             clazz.get(), "limit", "(I)Ljava/nio/Buffer;");
     CHECK(gByteBufferInfo.limitId != NULL);
 
+    gByteBufferInfo.getPositionId = env->GetMethodID(
+            clazz.get(), "position", "()I");
+    CHECK(gByteBufferInfo.getPositionId != NULL);
+
+    gByteBufferInfo.getLimitId = env->GetMethodID(
+            clazz.get(), "limit", "()I");
+    CHECK(gByteBufferInfo.getLimitId != NULL);
+
     clazz.reset(env->FindClass("java/util/ArrayList"));
     CHECK(clazz.get() != NULL);
 
diff --git a/media/jni/android_media_tv_Tuner.cpp b/media/jni/android_media_tv_Tuner.cpp
index 7579ca5..ab311c0e 100644
--- a/media/jni/android_media_tv_Tuner.cpp
+++ b/media/jni/android_media_tv_Tuner.cpp
@@ -833,6 +833,12 @@
 }
 
 JTuner::~JTuner() {
+    if (mFe != NULL) {
+        mFe->close();
+    }
+    if (mDemux != NULL) {
+        mDemux->close();
+    }
     JNIEnv *env = AndroidRuntime::getJNIEnv();
 
     env->DeleteWeakGlobalRef(mObject);
@@ -908,6 +914,14 @@
             (jint) jId);
 }
 
+jint JTuner::closeFrontendById(int id) {
+    if (mFe != NULL && mFeId == id) {
+        Result r = mFe->close();
+        return (jint) r;
+    }
+    return (jint) Result::SUCCESS;
+}
+
 jobject JTuner::getAnalogFrontendCaps(JNIEnv *env, FrontendInfo::FrontendCapabilities& caps) {
     jclass clazz = env->FindClass("android/media/tv/tuner/frontend/AnalogFrontendCapabilities");
     jmethodID capsInit = env->GetMethodID(clazz, "<init>", "(II)V");
@@ -1116,7 +1130,7 @@
         lnbIds = ids;
         res = r;
     });
-    if (res != Result::SUCCESS || mLnbIds.size() == 0) {
+    if (res != Result::SUCCESS || lnbIds.size() == 0) {
         ALOGW("Lnb isn't available");
         return NULL;
     }
@@ -1271,6 +1285,23 @@
     return res;
 }
 
+jint JTuner::close() {
+    Result res = Result::SUCCESS;
+    if (mFe != NULL) {
+        res = mFe->close();
+        if (res != Result::SUCCESS) {
+            return (jint) res;
+        }
+    }
+    if (mDemux != NULL) {
+        res = mDemux->close();
+        if (res != Result::SUCCESS) {
+            return (jint) res;
+        }
+    }
+    return (jint) res;
+}
+
 jobject JTuner::getAvSyncHwId(sp<Filter> filter) {
     if (mDemux == NULL) {
         return NULL;
@@ -1337,24 +1368,27 @@
 
 jobject JTuner::openDescrambler() {
     ALOGD("JTuner::openDescrambler");
-    if (mTuner == nullptr) {
+    if (mTuner == nullptr || mDemux == nullptr) {
         return NULL;
     }
     sp<IDescrambler> descramblerSp;
-    mTuner->openDescrambler([&](Result, const sp<IDescrambler>& descrambler) {
+    Result res;
+    mTuner->openDescrambler([&](Result r, const sp<IDescrambler>& descrambler) {
+        res = r;
         descramblerSp = descrambler;
     });
 
-    if (descramblerSp == NULL) {
+    if (res != Result::SUCCESS || descramblerSp == NULL) {
         return NULL;
     }
 
+    descramblerSp->setDemuxSource(mDemuxId);
+
     JNIEnv *env = AndroidRuntime::getJNIEnv();
     jobject descramblerObj =
             env->NewObject(
                     env->FindClass("android/media/tv/tuner/Descrambler"),
-                    gFields.descramblerInitID,
-                    mObject);
+                    gFields.descramblerInitID);
 
     descramblerSp->incStrong(descramblerObj);
     env->SetLongField(descramblerObj, gFields.descramblerContext, (jlong)descramblerSp.get());
@@ -1371,11 +1405,13 @@
 
     sp<IFilter> iFilterSp;
     sp<FilterCallback> callback = new FilterCallback();
+    Result res;
     mDemux->openFilter(type, bufferSize, callback,
-            [&](Result, const sp<IFilter>& filter) {
+            [&](Result r, const sp<IFilter>& filter) {
                 iFilterSp = filter;
+                res = r;
             });
-    if (iFilterSp == NULL) {
+    if (res != Result::SUCCESS || iFilterSp == NULL) {
         ALOGD("Failed to open filter, type = %d", type.mainType);
         return NULL;
     }
@@ -1761,6 +1797,22 @@
     return statusObj;
 }
 
+jint JTuner::closeFrontend() {
+    Result r = Result::SUCCESS;
+    if (mFe != NULL) {
+        r = mFe->close();
+    }
+    return (jint) r;
+}
+
+jint JTuner::closeDemux() {
+    Result r = Result::SUCCESS;
+    if (mDemux != NULL) {
+        r = mDemux->close();
+    }
+    return (jint) r;
+}
+
 }  // namespace android
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -2324,8 +2376,7 @@
 
     jclass descramblerClazz = env->FindClass("android/media/tv/tuner/Descrambler");
     gFields.descramblerContext = env->GetFieldID(descramblerClazz, "mNativeContext", "J");
-    gFields.descramblerInitID =
-            env->GetMethodID(descramblerClazz, "<init>", "()V");
+    gFields.descramblerInitID = env->GetMethodID(descramblerClazz, "<init>", "()V");
 
     jclass dvrRecorderClazz = env->FindClass("android/media/tv/tuner/dvr/DvrRecorder");
     gFields.dvrRecorderContext = env->GetFieldID(dvrRecorderClazz, "mNativeContext", "J");
@@ -2362,6 +2413,13 @@
     return tuner->openFrontendById(id);
 }
 
+static jint android_media_tv_Tuner_close_frontend_by_handle(
+        JNIEnv *env, jobject thiz, jint handle) {
+    sp<JTuner> tuner = getTuner(env, thiz);
+    uint32_t id = getResourceIdFromHandle(handle);
+    return tuner->closeFrontendById(id);
+}
+
 static int android_media_tv_Tuner_tune(JNIEnv *env, jobject thiz, jint type, jobject settings) {
     sp<JTuner> tuner = getTuner(env, thiz);
     return tuner->tune(getFrontendSettings(env, type, settings));
@@ -2867,7 +2925,7 @@
     sp<IFilter> iFilterSp = filterSp->getIFilter();
     if (iFilterSp == NULL) {
         ALOGD("Failed to configure filter: filter not found");
-        return (int)Result::INVALID_STATE;
+        return (jint) Result::NOT_INITIALIZED;
     }
     DemuxFilterSettings filterSettings = getFilterConfiguration(env, type, subtype, settings);
     Result res = iFilterSp->configure(filterSettings);
@@ -2898,7 +2956,7 @@
     sp<IFilter> iFilterSp = getFilter(env, filter)->getIFilter();
     if (iFilterSp == NULL) {
         ALOGD("Failed to get filter ID: filter not found");
-        return (int) Result::INVALID_STATE;
+        return (int) Result::NOT_INITIALIZED;
     }
     Result res;
     uint32_t id;
@@ -2918,7 +2976,7 @@
     sp<IFilter> iFilterSp = getFilter(env, filter)->getIFilter();
     if (iFilterSp == NULL) {
         ALOGD("Failed to set filter data source: filter not found");
-        return (jint) Result::INVALID_STATE;
+        return (jint) Result::NOT_INITIALIZED;
     }
     Result r;
     if (srcFilter == NULL) {
@@ -2927,7 +2985,7 @@
         sp<IFilter> srcSp = getFilter(env, srcFilter)->getIFilter();
         if (iFilterSp == NULL) {
             ALOGD("Failed to set filter data source: src filter not found");
-            return (jint) Result::INVALID_STATE;
+            return (jint) Result::INVALID_ARGUMENT;
         }
         r = iFilterSp->setDataSource(srcSp);
     }
@@ -2938,7 +2996,7 @@
     sp<IFilter> iFilterSp = getFilter(env, filter)->getIFilter();
     if (iFilterSp == NULL) {
         ALOGD("Failed to start filter: filter not found");
-        return (jint) Result::INVALID_STATE;
+        return (jint) Result::NOT_INITIALIZED;
     }
     Result r = iFilterSp->start();
     return (jint) r;
@@ -2948,7 +3006,7 @@
     sp<IFilter> iFilterSp = getFilter(env, filter)->getIFilter();
     if (iFilterSp == NULL) {
         ALOGD("Failed to stop filter: filter not found");
-        return (jint) Result::INVALID_STATE;
+        return (jint) Result::NOT_INITIALIZED;
     }
     Result r = iFilterSp->stop();
     return (jint) r;
@@ -2958,7 +3016,7 @@
     sp<IFilter> iFilterSp = getFilter(env, filter)->getIFilter();
     if (iFilterSp == NULL) {
         ALOGD("Failed to flush filter: filter not found");
-        return (jint) Result::INVALID_STATE;
+        return (jint) Result::NOT_INITIALIZED;
     }
     Result r = iFilterSp->flush();
     return (jint) r;
@@ -2978,7 +3036,7 @@
     sp<IFilter> iFilterSp = getFilter(env, filter)->getIFilter();
     if (iFilterSp == NULL) {
         ALOGD("Failed to close filter: filter not found");
-        return (jint) Result::INVALID_STATE;
+        return (jint) Result::NOT_INITIALIZED;
     }
     Result r = iFilterSp->close();
     return (jint) r;
@@ -3083,34 +3141,51 @@
     return tuner->openDescrambler();
 }
 
-static int android_media_tv_Tuner_add_pid(
+static jint android_media_tv_Tuner_descrambler_add_pid(
         JNIEnv *env, jobject descrambler, jint pidType, jint pid, jobject filter) {
     sp<IDescrambler> descramblerSp = getDescrambler(env, descrambler);
     if (descramblerSp == NULL) {
-        return false;
+        return (jint) Result::NOT_INITIALIZED;
     }
     sp<IFilter> iFilterSp = getFilter(env, filter)->getIFilter();
     Result result = descramblerSp->addPid(getDemuxPid((int)pidType, (int)pid), iFilterSp);
-    return (int)result;
+    return (jint) result;
 }
 
-static int android_media_tv_Tuner_remove_pid(
+static jint android_media_tv_Tuner_descrambler_remove_pid(
         JNIEnv *env, jobject descrambler, jint pidType, jint pid, jobject filter) {
     sp<IDescrambler> descramblerSp = getDescrambler(env, descrambler);
     if (descramblerSp == NULL) {
-        return false;
+        return (jint) Result::NOT_INITIALIZED;
     }
     sp<IFilter> iFilterSp = getFilter(env, filter)->getIFilter();
     Result result = descramblerSp->removePid(getDemuxPid((int)pidType, (int)pid), iFilterSp);
-    return (int)result;
+    return (jint) result;
 }
 
-static int android_media_tv_Tuner_set_key_token(JNIEnv, jobject, jbyteArray) {
-    return 0;
+static jint android_media_tv_Tuner_descrambler_set_key_token(
+        JNIEnv* env, jobject descrambler, jbyteArray keyToken) {
+    sp<IDescrambler> descramblerSp = getDescrambler(env, descrambler);
+    if (descramblerSp == NULL) {
+        return (jint) Result::NOT_INITIALIZED;
+    }
+    int size = env->GetArrayLength(keyToken);
+    std::vector<uint8_t> v(size);
+    env->GetByteArrayRegion(keyToken, 0, size, reinterpret_cast<jbyte*>(&v[0]));
+    Result result = descramblerSp->setKeyToken(v);
+    return (jint) result;
 }
 
-static int android_media_tv_Tuner_close_descrambler(JNIEnv, jobject) {
-    return 0;
+static jint android_media_tv_Tuner_close_descrambler(JNIEnv* env, jobject descrambler) {
+    sp<IDescrambler> descramblerSp = getDescrambler(env, descrambler);
+    if (descramblerSp == NULL) {
+        return (jint) Result::NOT_INITIALIZED;
+    }
+    Result r = descramblerSp->close();
+    if (r == Result::SUCCESS) {
+        descramblerSp->decStrong(descrambler);
+    }
+    return (jint) r;
 }
 
 static jobject android_media_tv_Tuner_open_dvr_recorder(
@@ -3135,6 +3210,21 @@
     return (jint) tuner->openDemux();
 }
 
+static jint android_media_tv_Tuner_close_tuner(JNIEnv* env, jobject thiz) {
+    sp<JTuner> tuner = getTuner(env, thiz);
+    return (jint) tuner->close();
+}
+
+static jint android_media_tv_Tuner_close_demux(JNIEnv* env, jobject thiz, jint /* handle */) {
+    sp<JTuner> tuner = getTuner(env, thiz);
+    return tuner->closeDemux();
+}
+
+static jint android_media_tv_Tuner_close_frontend(JNIEnv* env, jobject thiz, jint /* handle */) {
+    sp<JTuner> tuner = getTuner(env, thiz);
+    return tuner->closeFrontend();
+}
+
 static jint android_media_tv_Tuner_attach_filter(JNIEnv *env, jobject dvr, jobject filter) {
     sp<Dvr> dvrSp = getDvr(env, dvr);
     if (dvrSp == NULL) {
@@ -3424,6 +3514,8 @@
             (void *)android_media_tv_Tuner_get_frontend_ids },
     { "nativeOpenFrontendByHandle", "(I)Landroid/media/tv/tuner/Tuner$Frontend;",
             (void *)android_media_tv_Tuner_open_frontend_by_handle },
+    { "nativeCloseFrontendByHandle", "(I)I",
+            (void *)android_media_tv_Tuner_close_frontend_by_handle },
     { "nativeTune", "(ILandroid/media/tv/tuner/frontend/FrontendSettings;)I",
             (void *)android_media_tv_Tuner_tune },
     { "nativeStopTune", "()I", (void *)android_media_tv_Tuner_stop_tune },
@@ -3460,6 +3552,9 @@
     { "nativeGetDemuxCapabilities", "()Landroid/media/tv/tuner/DemuxCapabilities;",
             (void *)android_media_tv_Tuner_get_demux_caps },
     { "nativeOpenDemuxByhandle", "(I)I", (void *)android_media_tv_Tuner_open_demux },
+    { "nativeClose", "()I", (void *)android_media_tv_Tuner_close_tuner },
+    { "nativeCloseFrontend", "(I)I", (void *)android_media_tv_Tuner_close_frontend },
+    { "nativeCloseDemux", "(I)I", (void *)android_media_tv_Tuner_close_demux },
 };
 
 static const JNINativeMethod gFilterMethods[] = {
@@ -3487,10 +3582,10 @@
 
 static const JNINativeMethod gDescramblerMethods[] = {
     { "nativeAddPid", "(IILandroid/media/tv/tuner/filter/Filter;)I",
-            (void *)android_media_tv_Tuner_add_pid },
+            (void *)android_media_tv_Tuner_descrambler_add_pid },
     { "nativeRemovePid", "(IILandroid/media/tv/tuner/filter/Filter;)I",
-            (void *)android_media_tv_Tuner_remove_pid },
-    { "nativeSetKeyToken", "([B)I", (void *)android_media_tv_Tuner_set_key_token },
+            (void *)android_media_tv_Tuner_descrambler_remove_pid },
+    { "nativeSetKeyToken", "([B)I", (void *)android_media_tv_Tuner_descrambler_set_key_token },
     { "nativeClose", "()I", (void *)android_media_tv_Tuner_close_descrambler },
 };
 
diff --git a/media/jni/android_media_tv_Tuner.h b/media/jni/android_media_tv_Tuner.h
index 6749ba0..3da78ac 100644
--- a/media/jni/android_media_tv_Tuner.h
+++ b/media/jni/android_media_tv_Tuner.h
@@ -172,6 +172,7 @@
     int disconnectCiCam();
     jobject getFrontendIds();
     jobject openFrontendById(int id);
+    jint closeFrontendById(int id);
     jobject getFrontendInfo(int id);
     int tune(const FrontendSettings& settings);
     int stopTune();
@@ -189,6 +190,9 @@
     jobject getDemuxCaps();
     jobject getFrontendStatus(jintArray types);
     Result openDemux();
+    jint close();
+    jint closeFrontend();
+    jint closeDemux();
 
 protected:
     virtual ~JTuner();
diff --git a/media/lib/tvremote/java/com/android/media/tv/remoteprovider/TvRemoteProvider.java b/media/lib/tvremote/java/com/android/media/tv/remoteprovider/TvRemoteProvider.java
index 0bf0f97..b97ac26 100644
--- a/media/lib/tvremote/java/com/android/media/tv/remoteprovider/TvRemoteProvider.java
+++ b/media/lib/tvremote/java/com/android/media/tv/remoteprovider/TvRemoteProvider.java
@@ -16,6 +16,8 @@
 
 package com.android.media.tv.remoteprovider;
 
+import android.annotation.FloatRange;
+import android.annotation.NonNull;
 import android.content.Context;
 import android.media.tv.ITvRemoteProvider;
 import android.media.tv.ITvRemoteServiceInput;
@@ -24,6 +26,7 @@
 import android.util.Log;
 
 import java.util.LinkedList;
+import java.util.Objects;
 
 /**
  * Base class for emote providers implemented in unbundled service.
@@ -124,27 +127,75 @@
      * @param maxPointers Maximum supported pointers
      * @throws RuntimeException
      */
-    public void openRemoteInputBridge(IBinder token, String name, int width, int height,
-                                      int maxPointers) throws RuntimeException {
+    public void openRemoteInputBridge(
+            IBinder token, String name, int width, int height, int maxPointers)
+            throws RuntimeException {
+        final IBinder finalToken = Objects.requireNonNull(token);
+        final String finalName = Objects.requireNonNull(name);
+
         synchronized (mOpenBridgeRunnables) {
             if (mRemoteServiceInput == null) {
-                Log.d(TAG, "Delaying openRemoteInputBridge() for " + name);
+                Log.d(TAG, "Delaying openRemoteInputBridge() for " + finalName);
 
                 mOpenBridgeRunnables.add(() -> {
                     try {
                         mRemoteServiceInput.openInputBridge(
-                                token, name, width, height, maxPointers);
-                        Log.d(TAG, "Delayed openRemoteInputBridge() for " + name + ": success");
+                                finalToken, finalName, width, height, maxPointers);
+                        Log.d(TAG, "Delayed openRemoteInputBridge() for " + finalName
+                                + ": success");
                     } catch (RemoteException re) {
-                        Log.e(TAG, "Delayed openRemoteInputBridge() for " + name + ": failure", re);
+                        Log.e(TAG, "Delayed openRemoteInputBridge() for " + finalName
+                                + ": failure", re);
                     }
                 });
                 return;
             }
         }
         try {
-            mRemoteServiceInput.openInputBridge(token, name, width, height, maxPointers);
-            Log.d(TAG, "openRemoteInputBridge() for " + name + ": success");
+            mRemoteServiceInput.openInputBridge(finalToken, finalName, width, height, maxPointers);
+            Log.d(TAG, "openRemoteInputBridge() for " + finalName + ": success");
+        } catch (RemoteException re) {
+            throw re.rethrowFromSystemServer();
+        }
+    }
+
+    /**
+     * Opens an input bridge as a gamepad device.
+     * Clients should pass in a token that can be used to match this request with a token that
+     * will be returned by {@link TvRemoteProvider#onInputBridgeConnected(IBinder token)}
+     * <p>
+     * The token should be used for subsequent calls.
+     * </p>
+     *
+     * @param token       Identifier for this connection
+     * @param name        Device name
+     * @throws RuntimeException
+     *
+     * @hide
+     */
+    public void openGamepadBridge(@NonNull IBinder token, @NonNull  String name)
+            throws RuntimeException {
+        final IBinder finalToken = Objects.requireNonNull(token);
+        final String finalName = Objects.requireNonNull(name);
+        synchronized (mOpenBridgeRunnables) {
+            if (mRemoteServiceInput == null) {
+                Log.d(TAG, "Delaying openGamepadBridge() for " + finalName);
+
+                mOpenBridgeRunnables.add(() -> {
+                    try {
+                        mRemoteServiceInput.openGamepadBridge(finalToken, finalName);
+                        Log.d(TAG, "Delayed openGamepadBridge() for " + finalName + ": success");
+                    } catch (RemoteException re) {
+                        Log.e(TAG, "Delayed openGamepadBridge() for " + finalName + ": failure",
+                                re);
+                    }
+                });
+                return;
+            }
+        }
+        try {
+            mRemoteServiceInput.openGamepadBridge(token, finalName);
+            Log.d(TAG, "openGamepadBridge() for " + finalName + ": success");
         } catch (RemoteException re) {
             throw re.rethrowFromSystemServer();
         }
@@ -157,6 +208,7 @@
      * @throws RuntimeException
      */
     public void closeInputBridge(IBinder token) throws RuntimeException {
+        Objects.requireNonNull(token);
         try {
             mRemoteServiceInput.closeInputBridge(token);
         } catch (RemoteException re) {
@@ -173,6 +225,7 @@
      * @throws RuntimeException
      */
     public void clearInputBridge(IBinder token) throws RuntimeException {
+        Objects.requireNonNull(token);
         if (DEBUG_KEYS) Log.d(TAG, "clearInputBridge() token " + token);
         try {
             mRemoteServiceInput.clearInputBridge(token);
@@ -190,6 +243,7 @@
      * @throws RuntimeException
      */
     public void sendTimestamp(IBinder token, long timestamp) throws RuntimeException {
+        Objects.requireNonNull(token);
         if (DEBUG_KEYS) Log.d(TAG, "sendTimestamp() token: " + token +
                 ", timestamp: " + timestamp);
         try {
@@ -207,6 +261,7 @@
      * @throws RuntimeException
      */
     public void sendKeyUp(IBinder token, int keyCode) throws RuntimeException {
+        Objects.requireNonNull(token);
         if (DEBUG_KEYS) Log.d(TAG, "sendKeyUp() token: " + token + ", keyCode: " + keyCode);
         try {
             mRemoteServiceInput.sendKeyUp(token, keyCode);
@@ -223,6 +278,7 @@
      * @throws RuntimeException
      */
     public void sendKeyDown(IBinder token, int keyCode) throws RuntimeException {
+        Objects.requireNonNull(token);
         if (DEBUG_KEYS) Log.d(TAG, "sendKeyDown() token: " + token +
                 ", keyCode: " + keyCode);
         try {
@@ -241,6 +297,7 @@
      * @throws RuntimeException
      */
     public void sendPointerUp(IBinder token, int pointerId) throws RuntimeException {
+        Objects.requireNonNull(token);
         if (DEBUG_KEYS) Log.d(TAG, "sendPointerUp() token: " + token +
                 ", pointerId: " + pointerId);
         try {
@@ -262,6 +319,7 @@
      */
     public void sendPointerDown(IBinder token, int pointerId, int x, int y)
             throws RuntimeException {
+        Objects.requireNonNull(token);
         if (DEBUG_KEYS) Log.d(TAG, "sendPointerDown() token: " + token +
                 ", pointerId: " + pointerId);
         try {
@@ -278,6 +336,7 @@
      * @throws RuntimeException
      */
     public void sendPointerSync(IBinder token) throws RuntimeException {
+        Objects.requireNonNull(token);
         if (DEBUG_KEYS) Log.d(TAG, "sendPointerSync() token: " + token);
         try {
             mRemoteServiceInput.sendPointerSync(token);
@@ -286,6 +345,94 @@
         }
     }
 
+    /**
+     * Send a notification that a gamepad key was pressed.
+     *
+     * Supported buttons are:
+     * <ul>
+     *   <li> Right-side buttons: BUTTON_A, BUTTON_B, BUTTON_X, BUTTON_Y
+     *   <li> Digital Triggers and bumpers: BUTTON_L1, BUTTON_R1, BUTTON_L2, BUTTON_R2
+     *   <li> Thumb buttons: BUTTON_THUMBL, BUTTON_THUMBR
+     *   <li> DPad buttons: DPAD_UP, DPAD_DOWN, DPAD_LEFT, DPAD_RIGHT
+     *   <li> Gamepad buttons: BUTTON_SELECT, BUTTON_START, BUTTON_MODE
+     *   <li> Generic buttons: BUTTON_1, BUTTON_2, ...., BUTTON16
+     *   <li> Assistant: ASSIST, VOICE_ASSIST
+     * </ul>
+     *
+     * @param token   identifier for the device
+     * @param keyCode the gamepad key that was pressed (like BUTTON_A)
+     *
+     * @hide
+     */
+    public void sendGamepadKeyDown(@NonNull IBinder token, int keyCode) throws RuntimeException {
+        Objects.requireNonNull(token);
+        if (DEBUG_KEYS) {
+            Log.d(TAG, "sendGamepadKeyDown() token: " + token);
+        }
+
+        try {
+            mRemoteServiceInput.sendGamepadKeyDown(token, keyCode);
+        } catch (RemoteException re) {
+            throw re.rethrowFromSystemServer();
+        }
+    }
+
+    /**
+     * Send a notification that a gamepad key was released.
+     *
+     * @see sendGamepadKeyDown for supported key codes.
+     *
+     * @param token identifier for the device
+     * @param keyCode the gamepad key that was pressed
+     *
+     * @hide
+     */
+    public void sendGamepadKeyUp(@NonNull IBinder token, int keyCode) throws RuntimeException {
+        Objects.requireNonNull(token);
+        if (DEBUG_KEYS) {
+            Log.d(TAG, "sendGamepadKeyUp() token: " + token);
+        }
+
+        try {
+            mRemoteServiceInput.sendGamepadKeyUp(token, keyCode);
+        } catch (RemoteException re) {
+            throw re.rethrowFromSystemServer();
+        }
+    }
+
+    /**
+     * Send a gamepad axis value.
+     *
+     * Supported axes:
+     *  <li> Left Joystick: AXIS_X, AXIS_Y
+     *  <li> Right Joystick: AXIS_Z, AXIS_RZ
+     *  <li> Triggers: AXIS_LTRIGGER, AXIS_RTRIGGER
+     *  <li> DPad: AXIS_HAT_X, AXIS_HAT_Y
+     *
+     * For non-trigger axes, the range of acceptable values is [-1, 1]. The trigger axes support
+     * values [0, 1].
+     *
+     * @param token identifier for the device
+     * @param axis  MotionEvent axis
+     * @param value the value to send
+     *
+     * @hide
+     */
+    public void sendGamepadAxisValue(
+            @NonNull IBinder token, int axis, @FloatRange(from = -1.0f, to = 1.0f) float value)
+            throws RuntimeException {
+        Objects.requireNonNull(token);
+        if (DEBUG_KEYS) {
+            Log.d(TAG, "sendGamepadAxisValue() token: " + token);
+        }
+
+        try {
+            mRemoteServiceInput.sendGamepadAxisValue(token, axis, value);
+        } catch (RemoteException re) {
+            throw re.rethrowFromSystemServer();
+        }
+    }
+
     private final class ProviderStub extends ITvRemoteProvider.Stub {
         @Override
         public void setRemoteServiceInputSink(ITvRemoteServiceInput tvServiceInput) {
diff --git a/media/lib/tvremote/tests/src/com/android/media/tv/remoteprovider/TvRemoteProviderTest.java b/media/lib/tvremote/tests/src/com/android/media/tv/remoteprovider/TvRemoteProviderTest.java
index c9ce5613..e6e3939 100644
--- a/media/lib/tvremote/tests/src/com/android/media/tv/remoteprovider/TvRemoteProviderTest.java
+++ b/media/lib/tvremote/tests/src/com/android/media/tv/remoteprovider/TvRemoteProviderTest.java
@@ -83,4 +83,52 @@
 
         assertTrue(tvProvider.verifyTokens());
     }
+
+    @SmallTest
+    public void testOpenGamepadRemoteInputBridge() throws Exception {
+        Binder tokenA = new Binder();
+        Binder tokenB = new Binder();
+        Binder tokenC = new Binder();
+
+        class LocalTvRemoteProvider extends TvRemoteProvider {
+            private final ArrayList<IBinder> mTokens = new ArrayList<IBinder>();
+
+            LocalTvRemoteProvider(Context context) {
+                super(context);
+            }
+
+            @Override
+            public void onInputBridgeConnected(IBinder token) {
+                mTokens.add(token);
+            }
+
+            public boolean verifyTokens() {
+                return mTokens.size() == 3 && mTokens.contains(tokenA) && mTokens.contains(tokenB)
+                        && mTokens.contains(tokenC);
+            }
+        }
+
+        LocalTvRemoteProvider tvProvider = new LocalTvRemoteProvider(getContext());
+        ITvRemoteProvider binder = (ITvRemoteProvider) tvProvider.getBinder();
+
+        ITvRemoteServiceInput tvServiceInput = mock(ITvRemoteServiceInput.class);
+        doAnswer((i) -> {
+            binder.onInputBridgeConnected(i.getArgument(0));
+            return null;
+        })
+                .when(tvServiceInput)
+                .openGamepadBridge(any(), any());
+
+        tvProvider.openGamepadBridge(tokenA, "A");
+        tvProvider.openGamepadBridge(tokenB, "B");
+        binder.setRemoteServiceInputSink(tvServiceInput);
+        tvProvider.openGamepadBridge(tokenC, "C");
+
+        verify(tvServiceInput).openGamepadBridge(tokenA, "A");
+        verify(tvServiceInput).openGamepadBridge(tokenB, "B");
+        verify(tvServiceInput).openGamepadBridge(tokenC, "C");
+        verifyNoMoreInteractions(tvServiceInput);
+
+        assertTrue(tvProvider.verifyTokens());
+    }
 }
diff --git a/media/tests/AudioPolicyTest/Android.bp b/media/tests/AudioPolicyTest/Android.bp
new file mode 100644
index 0000000..ed338375
--- /dev/null
+++ b/media/tests/AudioPolicyTest/Android.bp
@@ -0,0 +1,17 @@
+android_test {
+    name: "audiopolicytest",
+    srcs: ["**/*.java"],
+    libs: [
+        "android.test.runner",
+        "android.test.base",
+    ],
+    static_libs: [
+        "mockito-target-minus-junit4",
+        "androidx.test.rules",
+        "android-ex-camera2",
+        "testng",
+    ],
+    platform_apis: true,
+    certificate: "platform",
+    resource_dirs: ["res"],
+}
diff --git a/media/tests/AudioPolicyTest/AndroidManifest.xml b/media/tests/AudioPolicyTest/AndroidManifest.xml
new file mode 100644
index 0000000..adb058c
--- /dev/null
+++ b/media/tests/AudioPolicyTest/AndroidManifest.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.android.audiopolicytest">
+
+    <uses-permission android:name="android.permission.RECORD_AUDIO" />
+    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
+    <uses-permission android:name="android.permission.MODIFY_AUDIO_ROUTING" />
+    <uses-permission android:name="android.permission.CHANGE_ACCESSIBILITY_VOLUME" />
+
+    <application>
+        <uses-library android:name="android.test.runner" />
+        <activity android:label="@string/app_name" android:name="AudioPolicyTest"
+                  android:screenOrientation="landscape">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER"/>
+            </intent-filter>
+        </activity>
+    </application>
+
+    <!--instrumentation android:name=".AudioPolicyTestRunner"
+            android:targetPackage="com.android.audiopolicytest"
+            android:label="AudioManager policy oriented integration tests InstrumentationRunner">
+    </instrumentation-->
+
+    <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
+            android:targetPackage="com.android.audiopolicytest"
+            android:label="AudioManager policy oriented integration tests InstrumentationRunner">
+    </instrumentation>
+</manifest>
diff --git a/media/tests/AudioPolicyTest/AndroidTest.xml b/media/tests/AudioPolicyTest/AndroidTest.xml
new file mode 100644
index 0000000..f3ca9a1
--- /dev/null
+++ b/media/tests/AudioPolicyTest/AndroidTest.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<configuration description="Runs Media Framework Tests">
+    <target_preparer class="com.android.tradefed.targetprep.TestAppInstallSetup">
+        <option name="test-file-name" value="audiopolicytest.apk" />
+    </target_preparer>
+
+    <option name="test-tag" value="AudioPolicyTest" />
+    <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
+        <option name="package" value="com.android.audiopolicytest" />
+        <option name="runner" value="androidx.test.runner.AndroidJUnitRunner" />
+        <option name="hidden-api-checks" value="false"/>
+    </test>
+</configuration>
diff --git a/media/tests/AudioPolicyTest/res/layout/audiopolicytest.xml b/media/tests/AudioPolicyTest/res/layout/audiopolicytest.xml
new file mode 100644
index 0000000..17fdba6
--- /dev/null
+++ b/media/tests/AudioPolicyTest/res/layout/audiopolicytest.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="fill_parent"
+    android:layout_height="fill_parent"
+    android:orientation="vertical">
+</LinearLayout>
diff --git a/media/tests/AudioPolicyTest/res/values/strings.xml b/media/tests/AudioPolicyTest/res/values/strings.xml
new file mode 100644
index 0000000..0365927
--- /dev/null
+++ b/media/tests/AudioPolicyTest/res/values/strings.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <!-- name of the app [CHAR LIMIT=25]-->
+    <string name="app_name">Audio Policy APIs Tests</string>
+</resources>
diff --git a/media/tests/AudioPolicyTest/src/com/android/audiopolicytest/AudioManagerTest.java b/media/tests/AudioPolicyTest/src/com/android/audiopolicytest/AudioManagerTest.java
new file mode 100644
index 0000000..1131c62
--- /dev/null
+++ b/media/tests/AudioPolicyTest/src/com/android/audiopolicytest/AudioManagerTest.java
@@ -0,0 +1,328 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.audiopolicytest;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.testng.Assert.assertThrows;
+
+import android.media.AudioAttributes;
+import android.media.AudioManager;
+import android.media.AudioSystem;
+import android.media.audiopolicy.AudioProductStrategy;
+import android.media.audiopolicy.AudioVolumeGroup;
+import android.util.Log;
+
+import com.google.common.primitives.Ints;
+
+import java.util.List;
+
+public class AudioManagerTest extends AudioVolumesTestBase {
+    private static final String TAG = "AudioManagerTest";
+
+    //-----------------------------------------------------------------
+    // Test getAudioProductStrategies and validate strategies
+    //-----------------------------------------------------------------
+    public void testGetAndValidateProductStrategies() throws Exception {
+        List<AudioProductStrategy> audioProductStrategies =
+                mAudioManager.getAudioProductStrategies();
+        assertTrue(audioProductStrategies.size() > 0);
+
+        List<AudioVolumeGroup> audioVolumeGroups = mAudioManager.getAudioVolumeGroups();
+        assertTrue(audioVolumeGroups.size() > 0);
+
+        // Validate Audio Product Strategies
+        for (final AudioProductStrategy audioProductStrategy : audioProductStrategies) {
+            AudioAttributes attributes = audioProductStrategy.getAudioAttributes();
+            int strategyStreamType =
+                    audioProductStrategy.getLegacyStreamTypeForAudioAttributes(attributes);
+
+            assertTrue("Strategy shall support the attributes retrieved from its getter API",
+                    audioProductStrategy.supportsAudioAttributes(attributes));
+
+            int volumeGroupId =
+                    audioProductStrategy.getVolumeGroupIdForAudioAttributes(attributes);
+
+            // A strategy must be associated to a volume group
+            assertNotEquals("strategy not assigned to any volume group",
+                    volumeGroupId, AudioVolumeGroup.DEFAULT_VOLUME_GROUP);
+
+            // Valid Group ?
+            AudioVolumeGroup audioVolumeGroup = null;
+            for (final AudioVolumeGroup avg : audioVolumeGroups) {
+                if (avg.getId() == volumeGroupId) {
+                    audioVolumeGroup = avg;
+                    break;
+                }
+            }
+            assertNotNull("Volume Group not found", audioVolumeGroup);
+
+            // Cross check: the group shall have at least one aa / stream types following the
+            // considered strategy
+            boolean strategyAttributesSupported = false;
+            for (final AudioAttributes aa : audioVolumeGroup.getAudioAttributes()) {
+                if (audioProductStrategy.supportsAudioAttributes(aa)) {
+                    strategyAttributesSupported = true;
+                    break;
+                }
+            }
+            assertTrue("Volume Group and Strategy mismatching", strategyAttributesSupported);
+
+            // Some Product strategy may not have corresponding stream types as they intends
+            // to address volume setting per attributes to avoid adding new stream type
+            // and going on deprecating the stream type even for volume
+            if (strategyStreamType != AudioSystem.STREAM_DEFAULT) {
+                boolean strategStreamTypeSupported = false;
+                for (final int vgStreamType : audioVolumeGroup.getLegacyStreamTypes()) {
+                    if (vgStreamType == strategyStreamType) {
+                        strategStreamTypeSupported = true;
+                        break;
+                    }
+                }
+                assertTrue("Volume Group and Strategy mismatching", strategStreamTypeSupported);
+            }
+        }
+    }
+
+    //-----------------------------------------------------------------
+    // Test getAudioVolumeGroups and validate volume groups
+    //-----------------------------------------------------------------
+
+    public void testGetAndValidateVolumeGroups() throws Exception {
+        List<AudioVolumeGroup> audioVolumeGroups = mAudioManager.getAudioVolumeGroups();
+        assertTrue(audioVolumeGroups.size() > 0);
+
+        List<AudioProductStrategy> audioProductStrategies =
+                mAudioManager.getAudioProductStrategies();
+        assertTrue(audioProductStrategies.size() > 0);
+
+        // Validate Audio Volume Groups, check all
+        for (final AudioVolumeGroup audioVolumeGroup : audioVolumeGroups) {
+            List<AudioAttributes> avgAttributes = audioVolumeGroup.getAudioAttributes();
+            int[] avgStreamTypes = audioVolumeGroup.getLegacyStreamTypes();
+
+            // for each volume group attributes, find the matching product strategy and ensure
+            // it is linked the considered volume group
+            for (final AudioAttributes aa : avgAttributes) {
+                if (aa.equals(sDefaultAttributes)) {
+                    // Some volume groups may not have valid attributes, used for internal
+                    // volume management like patch/rerouting
+                    // so bailing out strategy retrieval from attributes
+                    continue;
+                }
+                boolean isVolumeGroupAssociatedToStrategy = false;
+                for (final AudioProductStrategy strategy : audioProductStrategies) {
+                    int groupId = strategy.getVolumeGroupIdForAudioAttributes(aa);
+                    if (groupId != AudioVolumeGroup.DEFAULT_VOLUME_GROUP) {
+
+                        assertEquals("Volume Group ID (" + audioVolumeGroup.toString()
+                                + "), and Volume group ID associated to Strategy ("
+                                + strategy.toString() + ") both supporting attributes "
+                                + aa.toString() + " are mismatching",
+                                audioVolumeGroup.getId(), groupId);
+                        isVolumeGroupAssociatedToStrategy = true;
+                        break;
+                    }
+                }
+                assertTrue("Volume Group (" + audioVolumeGroup.toString()
+                        + ") has no associated strategy for attributes " + aa.toString(),
+                        isVolumeGroupAssociatedToStrategy);
+            }
+
+            // for each volume group stream type, find the matching product strategy and ensure
+            // it is linked the considered volume group
+            for (final int avgStreamType : avgStreamTypes) {
+                if (avgStreamType == AudioSystem.STREAM_DEFAULT) {
+                    // Some Volume Groups may not have corresponding stream types as they
+                    // intends to address volume setting per attributes to avoid adding new
+                    //  stream type and going on deprecating the stream type even for volume
+                    // so bailing out strategy retrieval from stream type
+                    continue;
+                }
+                boolean isVolumeGroupAssociatedToStrategy = false;
+                for (final AudioProductStrategy strategy : audioProductStrategies) {
+                    Log.i(TAG, "strategy:" + strategy.toString());
+                    int groupId = strategy.getVolumeGroupIdForLegacyStreamType(avgStreamType);
+                    if (groupId != AudioVolumeGroup.DEFAULT_VOLUME_GROUP) {
+
+                        assertEquals("Volume Group ID (" + audioVolumeGroup.toString()
+                                + "), and Volume group ID associated to Strategy ("
+                                + strategy.toString() + ") both supporting stream "
+                                + AudioSystem.streamToString(avgStreamType) + "("
+                                + avgStreamType + ") are mismatching",
+                                audioVolumeGroup.getId(), groupId);
+                        isVolumeGroupAssociatedToStrategy = true;
+                        break;
+                    }
+                }
+                assertTrue("Volume Group (" + audioVolumeGroup.toString()
+                        + ") has no associated strategy for stream "
+                        + AudioSystem.streamToString(avgStreamType) + "(" + avgStreamType + ")",
+                        isVolumeGroupAssociatedToStrategy);
+            }
+        }
+    }
+
+    //-----------------------------------------------------------------
+    // Test Volume per Attributes setter/getters
+    //-----------------------------------------------------------------
+    public void testSetGetVolumePerAttributesWithInvalidAttributes() throws Exception {
+        AudioAttributes nullAttributes = null;
+
+        assertThrows(NullPointerException.class,
+                () -> mAudioManager.getMaxVolumeIndexForAttributes(nullAttributes));
+
+        assertThrows(NullPointerException.class,
+                () -> mAudioManager.getMinVolumeIndexForAttributes(nullAttributes));
+
+        assertThrows(NullPointerException.class,
+                () -> mAudioManager.getVolumeIndexForAttributes(nullAttributes));
+
+        assertThrows(NullPointerException.class,
+                () -> mAudioManager.setVolumeIndexForAttributes(
+                        nullAttributes, 0 /*index*/, 0/*flags*/));
+    }
+
+    public void testSetGetVolumePerAttributes() throws Exception {
+        for (int usage : AudioAttributes.SDK_USAGES) {
+            if (usage == AudioAttributes.USAGE_UNKNOWN) {
+                continue;
+            }
+            AudioAttributes aaForUsage = new AudioAttributes.Builder().setUsage(usage).build();
+            int indexMin = 0;
+            int indexMax = 0;
+            int index = 0;
+            Exception ex = null;
+
+            try {
+                indexMax = mAudioManager.getMaxVolumeIndexForAttributes(aaForUsage);
+            } catch (Exception e) {
+                ex = e; // unexpected
+            }
+            assertNull("Exception was thrown for valid attributes", ex);
+            ex = null;
+            try {
+                indexMin = mAudioManager.getMinVolumeIndexForAttributes(aaForUsage);
+            } catch (Exception e) {
+                ex = e; // unexpected
+            }
+            assertNull("Exception was thrown for valid attributes", ex);
+            ex = null;
+            try {
+                index = mAudioManager.getVolumeIndexForAttributes(aaForUsage);
+            } catch (Exception e) {
+                ex = e; // unexpected
+            }
+            assertNull("Exception was thrown for valid attributes", ex);
+            ex = null;
+            try {
+                mAudioManager.setVolumeIndexForAttributes(aaForUsage, indexMin, 0/*flags*/);
+            } catch (Exception e) {
+                ex = e; // unexpected
+            }
+            assertNull("Exception was thrown for valid attributes", ex);
+
+            index = mAudioManager.getVolumeIndexForAttributes(aaForUsage);
+            assertEquals(index, indexMin);
+
+            mAudioManager.setVolumeIndexForAttributes(aaForUsage, indexMax, 0/*flags*/);
+            index = mAudioManager.getVolumeIndexForAttributes(aaForUsage);
+            assertEquals(index, indexMax);
+        }
+    }
+
+    //-----------------------------------------------------------------
+    // Test register/unregister VolumeGroupCallback
+    //-----------------------------------------------------------------
+    public void testVolumeGroupCallback() throws Exception {
+        List<AudioVolumeGroup> audioVolumeGroups = mAudioManager.getAudioVolumeGroups();
+        assertTrue(audioVolumeGroups.size() > 0);
+
+        AudioVolumeGroupCallbackHelper vgCbReceiver = new AudioVolumeGroupCallbackHelper();
+        mAudioManager.registerVolumeGroupCallback(mContext.getMainExecutor(), vgCbReceiver);
+
+        final List<Integer> publicStreams = Ints.asList(PUBLIC_STREAM_TYPES);
+        try {
+            // Validate Audio Volume Groups callback reception
+            for (final AudioVolumeGroup audioVolumeGroup : audioVolumeGroups) {
+                int volumeGroupId = audioVolumeGroup.getId();
+
+                // Set the receiver to filter only the current group callback
+                vgCbReceiver.setExpectedVolumeGroup(volumeGroupId);
+
+                List<AudioAttributes> avgAttributes = audioVolumeGroup.getAudioAttributes();
+                int[] avgStreamTypes = audioVolumeGroup.getLegacyStreamTypes();
+
+                int index = 0;
+                int indexMax = 0;
+                int indexMin = 0;
+
+                // Set the volume per attributes (if valid) and wait the callback
+                for (final AudioAttributes aa : avgAttributes) {
+                    if (aa.equals(sDefaultAttributes)) {
+                        // Some volume groups may not have valid attributes, used for internal
+                        // volume management like patch/rerouting
+                        // so bailing out strategy retrieval from attributes
+                        continue;
+                    }
+                    index = mAudioManager.getVolumeIndexForAttributes(aa);
+                    indexMax = mAudioManager.getMaxVolumeIndexForAttributes(aa);
+                    indexMin = mAudioManager.getMinVolumeIndexForAttributes(aa);
+                    index = incrementVolumeIndex(index, indexMin, indexMax);
+
+                    vgCbReceiver.setExpectedVolumeGroup(volumeGroupId);
+                    mAudioManager.setVolumeIndexForAttributes(aa, index, 0/*flags*/);
+                    assertTrue(vgCbReceiver.waitForExpectedVolumeGroupChanged(
+                            AudioVolumeGroupCallbackHelper.ASYNC_TIMEOUT_MS));
+
+                    int readIndex = mAudioManager.getVolumeIndexForAttributes(aa);
+                    assertEquals(readIndex, index);
+                }
+                // Set the volume per stream type (if valid) and wait the callback
+                for (final int avgStreamType : avgStreamTypes) {
+                    if (avgStreamType == AudioSystem.STREAM_DEFAULT) {
+                        // Some Volume Groups may not have corresponding stream types as they
+                        // intends to address volume setting per attributes to avoid adding new
+                        // stream type and going on deprecating the stream type even for volume
+                        // so bailing out strategy retrieval from stream type
+                        continue;
+                    }
+                    if (!publicStreams.contains(avgStreamType)
+                            || avgStreamType == AudioManager.STREAM_ACCESSIBILITY) {
+                        // Limit scope of test to public stream that do not require any
+                        // permission (e.g. Changing ACCESSIBILITY is subject to permission).
+                        continue;
+                    }
+                    index = mAudioManager.getStreamVolume(avgStreamType);
+                    indexMax = mAudioManager.getStreamMaxVolume(avgStreamType);
+                    indexMin = mAudioManager.getStreamMinVolumeInt(avgStreamType);
+                    index = incrementVolumeIndex(index, indexMin, indexMax);
+
+                    vgCbReceiver.setExpectedVolumeGroup(volumeGroupId);
+                    mAudioManager.setStreamVolume(avgStreamType, index, 0/*flags*/);
+                    assertTrue(vgCbReceiver.waitForExpectedVolumeGroupChanged(
+                            AudioVolumeGroupCallbackHelper.ASYNC_TIMEOUT_MS));
+
+                    int readIndex = mAudioManager.getStreamVolume(avgStreamType);
+                    assertEquals(index, readIndex);
+                }
+            }
+        } finally {
+            mAudioManager.unregisterVolumeGroupCallback(vgCbReceiver);
+        }
+    }
+}
diff --git a/media/tests/AudioPolicyTest/src/com/android/audiopolicytest/AudioPolicyTest.java b/media/tests/AudioPolicyTest/src/com/android/audiopolicytest/AudioPolicyTest.java
new file mode 100644
index 0000000..e0c7b22
--- /dev/null
+++ b/media/tests/AudioPolicyTest/src/com/android/audiopolicytest/AudioPolicyTest.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.audiopolicytest;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+public class AudioPolicyTest extends Activity  {
+
+    public AudioPolicyTest() {
+    }
+
+    /** Called when the activity is first created. */
+    @Override
+    public void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+        setContentView(R.layout.audiopolicytest);
+    }
+
+    @Override
+    public void onDestroy() {
+        super.onDestroy();
+    }
+}
diff --git a/media/tests/AudioPolicyTest/src/com/android/audiopolicytest/AudioProductStrategyTest.java b/media/tests/AudioPolicyTest/src/com/android/audiopolicytest/AudioProductStrategyTest.java
new file mode 100644
index 0000000..c0f596b
--- /dev/null
+++ b/media/tests/AudioPolicyTest/src/com/android/audiopolicytest/AudioProductStrategyTest.java
@@ -0,0 +1,213 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.audiopolicytest;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+
+import android.media.AudioAttributes;
+import android.media.AudioSystem;
+import android.media.audiopolicy.AudioProductStrategy;
+import android.media.audiopolicy.AudioVolumeGroup;
+import android.util.Log;
+
+import java.util.List;
+
+public class AudioProductStrategyTest extends AudioVolumesTestBase {
+    private static final String TAG = "AudioProductStrategyTest";
+
+    //-----------------------------------------------------------------
+    // Test getAudioProductStrategies and validate strategies
+    //-----------------------------------------------------------------
+    public void testGetProductStrategies() throws Exception {
+        List<AudioProductStrategy> audioProductStrategies =
+                AudioProductStrategy.getAudioProductStrategies();
+
+        assertNotNull(audioProductStrategies);
+        assertTrue(audioProductStrategies.size() > 0);
+
+        for (final AudioProductStrategy aps : audioProductStrategies) {
+            assertTrue(aps.getId() >= 0);
+
+            AudioAttributes aa = aps.getAudioAttributes();
+            assertNotNull(aa);
+
+            // Ensure API consistency
+            assertTrue(aps.supportsAudioAttributes(aa));
+
+            int streamType = aps.getLegacyStreamTypeForAudioAttributes(aa);
+            if (streamType == AudioSystem.STREAM_DEFAULT) {
+                // bailing out test for volume group APIs consistency
+                continue;
+            }
+            final int volumeGroupFromStream = aps.getVolumeGroupIdForLegacyStreamType(streamType);
+            final int volumeGroupFromAttributes = aps.getVolumeGroupIdForAudioAttributes(aa);
+            assertNotEquals(volumeGroupFromStream, AudioVolumeGroup.DEFAULT_VOLUME_GROUP);
+            assertEquals(volumeGroupFromStream, volumeGroupFromAttributes);
+        }
+    }
+
+    //-----------------------------------------------------------------
+    // Test stream to/from attributes conversion
+    //-----------------------------------------------------------------
+    public void testAudioAttributesFromStreamTypes() throws Exception {
+        List<AudioProductStrategy> audioProductStrategies =
+                AudioProductStrategy.getAudioProductStrategies();
+
+        assertNotNull(audioProductStrategies);
+        assertTrue(audioProductStrategies.size() > 0);
+
+        for (final int streamType : PUBLIC_STREAM_TYPES) {
+            AudioAttributes aaFromStreamType =
+                    AudioProductStrategy.getAudioAttributesForStrategyWithLegacyStreamType(
+                            streamType);
+
+            // No strategy found for this stream type or no attributes defined for the strategy
+            // hosting this stream type; Bailing out the test, just ensure that any request
+            // for reciproque API with the unknown attributes would return default stream
+            // for volume control, aka STREAM_MUSIC.
+            if (aaFromStreamType.equals(sInvalidAttributes)) {
+                assertEquals(AudioSystem.STREAM_MUSIC,
+                        AudioProductStrategy.getLegacyStreamTypeForStrategyWithAudioAttributes(
+                            aaFromStreamType));
+            } else {
+                // Attributes are valid, i.e. a strategy was found supporting this stream type
+                // with valid attributes. Ensure reciproque works fine
+                int streamTypeFromAttributes =
+                        AudioProductStrategy.getLegacyStreamTypeForStrategyWithAudioAttributes(
+                                aaFromStreamType);
+                assertEquals("stream " + AudioSystem.streamToString(streamType) + "("
+                        + streamType + ") expected to match attributes "
+                        + aaFromStreamType.toString() + " got instead stream "
+                        + AudioSystem.streamToString(streamTypeFromAttributes) + "("
+                        + streamTypeFromAttributes + ") expected to match attributes ",
+                        streamType, streamTypeFromAttributes);
+            }
+
+            // Now identify the strategy supporting this stream type, ensure uniqueness
+            boolean strategyFound = false;
+            for (final AudioProductStrategy aps : audioProductStrategies) {
+                AudioAttributes aaFromAps =
+                        aps.getAudioAttributesForLegacyStreamType(streamType);
+
+                if (aaFromAps == null) {
+                    // not this one...
+                    continue;
+                }
+                // Got it!
+                assertFalse("Unique ProductStrategy shall match for a given stream type",
+                        strategyFound);
+                strategyFound = true;
+
+                // Ensure getters aligned
+                assertEquals(aaFromStreamType, aaFromAps);
+                assertTrue(aps.supportsAudioAttributes(aaFromStreamType));
+
+                // Ensure reciproque works fine
+                assertEquals(streamType,
+                        aps.getLegacyStreamTypeForAudioAttributes(aaFromStreamType));
+
+                // Ensure consistency of volume group getter API
+                final int volumeGroupFromStream =
+                        aps.getVolumeGroupIdForLegacyStreamType(streamType);
+                final int volumeGroupFromAttributes =
+                        aps.getVolumeGroupIdForAudioAttributes(aaFromStreamType);
+                assertNotEquals(volumeGroupFromStream, AudioVolumeGroup.DEFAULT_VOLUME_GROUP);
+                assertEquals(volumeGroupFromStream, volumeGroupFromAttributes);
+            }
+            if (!strategyFound) {
+                // No strategy found, ensure volume control is MUSIC
+                assertEquals(AudioSystem.STREAM_MUSIC,
+                        AudioProductStrategy.getLegacyStreamTypeForStrategyWithAudioAttributes(
+                            aaFromStreamType));
+            }
+        }
+    }
+
+    public void testAudioAttributesToStreamTypes() throws Exception {
+        List<AudioProductStrategy> audioProductStrategies =
+                AudioProductStrategy.getAudioProductStrategies();
+
+        assertNotNull(audioProductStrategies);
+        assertTrue(audioProductStrategies.size() > 0);
+
+        for (int usage : AudioAttributes.SDK_USAGES) {
+            AudioAttributes aaForUsage = new AudioAttributes.Builder().setUsage(usage).build();
+
+            int streamTypeFromUsage =
+                    AudioProductStrategy.getLegacyStreamTypeForStrategyWithAudioAttributes(
+                            aaForUsage);
+
+            // Cannot be undefined, always shall fall back on a valid stream type
+            // to be able to control the volume
+            assertNotEquals(streamTypeFromUsage, AudioSystem.STREAM_DEFAULT);
+
+            Log.w(TAG, "GUSTAVE aaForUsage=" + aaForUsage.toString());
+
+            // Now identify the strategy hosting these Audio Attributes and ensure informations
+            // matches.
+            // Now identify the strategy supporting this stream type, ensure uniqueness
+            boolean strategyFound = false;
+            for (final AudioProductStrategy aps : audioProductStrategies) {
+                if (!aps.supportsAudioAttributes(aaForUsage)) {
+                    // Not this one
+                    continue;
+                }
+                // Got it!
+                String msg = "Unique ProductStrategy shall match for a given audio attributes "
+                        + aaForUsage.toString() + " already associated also matches with"
+                        + aps.toString();
+                assertFalse(msg, strategyFound);
+                strategyFound = true;
+
+                // It may not return the expected stream type if the strategy does not have
+                // associated stream type.
+                // Behavior of member function getLegacyStreamTypeForAudioAttributes is
+                // different than getLegacyStreamTypeForStrategyWithAudioAttributes since it
+                // does not fallback on MUSIC stream type for volume operation
+                int streamTypeFromAps = aps.getLegacyStreamTypeForAudioAttributes(aaForUsage);
+                if (streamTypeFromAps == AudioSystem.STREAM_DEFAULT) {
+                    // No stream type assigned to this strategy
+                    // Expect static API to return default stream type for volume (aka MUSIC)
+                    assertEquals("Strategy (" + aps.toString() + ") has no associated stream "
+                            + ", must fallback on MUSIC stream as default",
+                            streamTypeFromUsage, AudioSystem.STREAM_MUSIC);
+                } else {
+                    assertEquals("Attributes " + aaForUsage.toString() + " associated to stream "
+                            + AudioSystem.streamToString(streamTypeFromUsage)
+                            + " are supported by strategy (" + aps.toString() + ") which reports "
+                            + " these attributes are associated to stream "
+                            + AudioSystem.streamToString(streamTypeFromAps),
+                            streamTypeFromUsage, streamTypeFromAps);
+
+                    // Ensure consistency of volume group getter API
+                    int volumeGroupFromStream =
+                            aps.getVolumeGroupIdForLegacyStreamType(streamTypeFromAps);
+                    int volumeGroupFromAttributes =
+                            aps.getVolumeGroupIdForAudioAttributes(aaForUsage);
+                    assertNotEquals(
+                            volumeGroupFromStream, AudioVolumeGroup.DEFAULT_VOLUME_GROUP);
+                    assertEquals(volumeGroupFromStream, volumeGroupFromAttributes);
+                }
+            }
+            if (!strategyFound) {
+                // No strategy found for the given attributes, the expected stream must be MUSIC
+                assertEquals(streamTypeFromUsage, AudioSystem.STREAM_MUSIC);
+            }
+        }
+    }
+}
diff --git a/media/tests/AudioPolicyTest/src/com/android/audiopolicytest/AudioVolumeGroupCallbackHelper.java b/media/tests/AudioPolicyTest/src/com/android/audiopolicytest/AudioVolumeGroupCallbackHelper.java
new file mode 100644
index 0000000..0c1d52c
--- /dev/null
+++ b/media/tests/AudioPolicyTest/src/com/android/audiopolicytest/AudioVolumeGroupCallbackHelper.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.audiopolicytest;
+
+import static org.junit.Assert.assertNotNull;
+
+import android.media.AudioManager;
+import android.util.Log;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+
+final class AudioVolumeGroupCallbackHelper extends AudioManager.VolumeGroupCallback {
+    private static final String TAG = "AudioVolumeGroupCallbackHelper";
+    public static final long ASYNC_TIMEOUT_MS = 800;
+
+    private int mExpectedVolumeGroupId;
+
+    private CountDownLatch mVolumeGroupChanged = null;
+
+    void setExpectedVolumeGroup(int group) {
+        mVolumeGroupChanged = new CountDownLatch(1);
+        mExpectedVolumeGroupId = group;
+    }
+
+    @Override
+    public void onAudioVolumeGroupChanged(int group, int flags) {
+        if (group != mExpectedVolumeGroupId) {
+            return;
+        }
+        if (mVolumeGroupChanged == null) {
+            Log.wtf(TAG, "Received callback but object not initialized");
+            return;
+        }
+        if (mVolumeGroupChanged.getCount() <= 0) {
+            Log.i(TAG, "callback for group: " + group + " already received");
+            return;
+        }
+        mVolumeGroupChanged.countDown();
+    }
+
+    public boolean waitForExpectedVolumeGroupChanged(long timeOutMs) {
+        assertNotNull("Call first setExpectedVolumeGroup before waiting...", mVolumeGroupChanged);
+        boolean timeoutReached = false;
+        if (mVolumeGroupChanged.getCount() == 0) {
+            // done already...
+            return true;
+        }
+        try {
+            timeoutReached = !mVolumeGroupChanged.await(ASYNC_TIMEOUT_MS, TimeUnit.MILLISECONDS);
+        } catch (InterruptedException e) { }
+        return !timeoutReached;
+    }
+}
diff --git a/media/tests/AudioPolicyTest/src/com/android/audiopolicytest/AudioVolumeGroupChangeHandlerTest.java b/media/tests/AudioPolicyTest/src/com/android/audiopolicytest/AudioVolumeGroupChangeHandlerTest.java
new file mode 100644
index 0000000..221f1f7
--- /dev/null
+++ b/media/tests/AudioPolicyTest/src/com/android/audiopolicytest/AudioVolumeGroupChangeHandlerTest.java
@@ -0,0 +1,180 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.audiopolicytest;
+
+import static org.junit.Assert.assertEquals;
+import static org.testng.Assert.assertThrows;
+
+import android.media.AudioAttributes;
+import android.media.AudioManager;
+import android.media.audiopolicy.AudioVolumeGroup;
+import android.media.audiopolicy.AudioVolumeGroupChangeHandler;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class AudioVolumeGroupChangeHandlerTest extends AudioVolumesTestBase {
+    private static final String TAG = "AudioVolumeGroupChangeHandlerTest";
+
+    public void testRegisterInvalidCallback() throws Exception {
+        final AudioVolumeGroupChangeHandler audioAudioVolumeGroupChangedHandler =
+                new AudioVolumeGroupChangeHandler();
+
+        audioAudioVolumeGroupChangedHandler.init();
+
+        assertThrows(NullPointerException.class, () -> {
+            AudioManager.VolumeGroupCallback nullCb = null;
+            audioAudioVolumeGroupChangedHandler.registerListener(nullCb);
+        });
+    }
+
+    public void testUnregisterInvalidCallback() throws Exception {
+        final AudioVolumeGroupChangeHandler audioAudioVolumeGroupChangedHandler =
+                new AudioVolumeGroupChangeHandler();
+
+        audioAudioVolumeGroupChangedHandler.init();
+
+        final AudioVolumeGroupCallbackHelper cb = new AudioVolumeGroupCallbackHelper();
+        audioAudioVolumeGroupChangedHandler.registerListener(cb);
+
+        assertThrows(NullPointerException.class, () -> {
+            AudioManager.VolumeGroupCallback nullCb = null;
+            audioAudioVolumeGroupChangedHandler.unregisterListener(nullCb);
+        });
+        audioAudioVolumeGroupChangedHandler.unregisterListener(cb);
+    }
+
+    public void testRegisterUnregisterCallback() throws Exception {
+        final AudioVolumeGroupChangeHandler audioAudioVolumeGroupChangedHandler =
+                new AudioVolumeGroupChangeHandler();
+
+        audioAudioVolumeGroupChangedHandler.init();
+        final AudioVolumeGroupCallbackHelper validCb = new AudioVolumeGroupCallbackHelper();
+
+        // Should not assert, otherwise test will fail
+        audioAudioVolumeGroupChangedHandler.registerListener(validCb);
+
+        // Should not assert, otherwise test will fail
+        audioAudioVolumeGroupChangedHandler.unregisterListener(validCb);
+    }
+
+    public void testCallbackReceived() throws Exception {
+        final AudioVolumeGroupChangeHandler audioAudioVolumeGroupChangedHandler =
+                new AudioVolumeGroupChangeHandler();
+
+        audioAudioVolumeGroupChangedHandler.init();
+
+        final AudioVolumeGroupCallbackHelper validCb = new AudioVolumeGroupCallbackHelper();
+        audioAudioVolumeGroupChangedHandler.registerListener(validCb);
+
+        List<AudioVolumeGroup> audioVolumeGroups = mAudioManager.getAudioVolumeGroups();
+        assertTrue(audioVolumeGroups.size() > 0);
+
+        try {
+            for (final AudioVolumeGroup audioVolumeGroup : audioVolumeGroups) {
+                int volumeGroupId = audioVolumeGroup.getId();
+
+                List<AudioAttributes> avgAttributes = audioVolumeGroup.getAudioAttributes();
+                // Set the volume per attributes (if valid) and wait the callback
+                if (avgAttributes.size() == 0 || avgAttributes.get(0).equals(sDefaultAttributes)) {
+                    // Some volume groups may not have valid attributes, used for internal
+                    // volume management like patch/rerouting
+                    // so bailing out strategy retrieval from attributes
+                    continue;
+                }
+                final AudioAttributes aa = avgAttributes.get(0);
+
+                int index = mAudioManager.getVolumeIndexForAttributes(aa);
+                int indexMax = mAudioManager.getMaxVolumeIndexForAttributes(aa);
+                int indexMin = mAudioManager.getMinVolumeIndexForAttributes(aa);
+
+                final int indexForAa = incrementVolumeIndex(index, indexMin, indexMax);
+
+                // Set the receiver to filter only the current group callback
+                validCb.setExpectedVolumeGroup(volumeGroupId);
+                mAudioManager.setVolumeIndexForAttributes(aa, indexForAa, 0/*flags*/);
+                assertTrue(validCb.waitForExpectedVolumeGroupChanged(
+                        AudioVolumeGroupCallbackHelper.ASYNC_TIMEOUT_MS));
+
+                final int readIndex = mAudioManager.getVolumeIndexForAttributes(aa);
+                assertEquals(readIndex, indexForAa);
+            }
+        } finally {
+            audioAudioVolumeGroupChangedHandler.unregisterListener(validCb);
+        }
+    }
+
+    public void testMultipleCallbackReceived() throws Exception {
+
+        final AudioVolumeGroupChangeHandler audioAudioVolumeGroupChangedHandler =
+                new AudioVolumeGroupChangeHandler();
+
+        audioAudioVolumeGroupChangedHandler.init();
+
+        final int callbackCount = 10;
+        final List<AudioVolumeGroupCallbackHelper> validCbs =
+                new ArrayList<AudioVolumeGroupCallbackHelper>();
+        for (int i = 0; i < callbackCount; i++) {
+            validCbs.add(new AudioVolumeGroupCallbackHelper());
+        }
+        for (final AudioVolumeGroupCallbackHelper cb : validCbs) {
+            audioAudioVolumeGroupChangedHandler.registerListener(cb);
+        }
+
+        List<AudioVolumeGroup> audioVolumeGroups = mAudioManager.getAudioVolumeGroups();
+        assertTrue(audioVolumeGroups.size() > 0);
+
+        try {
+            for (final AudioVolumeGroup audioVolumeGroup : audioVolumeGroups) {
+                int volumeGroupId = audioVolumeGroup.getId();
+
+                List<AudioAttributes> avgAttributes = audioVolumeGroup.getAudioAttributes();
+                // Set the volume per attributes (if valid) and wait the callback
+                if (avgAttributes.size() == 0 || avgAttributes.get(0).equals(sDefaultAttributes)) {
+                    // Some volume groups may not have valid attributes, used for internal
+                    // volume management like patch/rerouting
+                    // so bailing out strategy retrieval from attributes
+                    continue;
+                }
+                AudioAttributes aa = avgAttributes.get(0);
+
+                int index = mAudioManager.getVolumeIndexForAttributes(aa);
+                int indexMax = mAudioManager.getMaxVolumeIndexForAttributes(aa);
+                int indexMin = mAudioManager.getMinVolumeIndexForAttributes(aa);
+
+                final int indexForAa = incrementVolumeIndex(index, indexMin, indexMax);
+
+                // Set the receiver to filter only the current group callback
+                for (final AudioVolumeGroupCallbackHelper cb : validCbs) {
+                    cb.setExpectedVolumeGroup(volumeGroupId);
+                }
+                mAudioManager.setVolumeIndexForAttributes(aa, indexForAa, 0/*flags*/);
+
+                for (final AudioVolumeGroupCallbackHelper cb : validCbs) {
+                    assertTrue(cb.waitForExpectedVolumeGroupChanged(
+                            AudioVolumeGroupCallbackHelper.ASYNC_TIMEOUT_MS));
+                }
+                int readIndex = mAudioManager.getVolumeIndexForAttributes(aa);
+                assertEquals(readIndex, indexForAa);
+            }
+        } finally {
+            for (final AudioVolumeGroupCallbackHelper cb : validCbs) {
+                audioAudioVolumeGroupChangedHandler.unregisterListener(cb);
+            }
+        }
+    }
+}
diff --git a/media/tests/AudioPolicyTest/src/com/android/audiopolicytest/AudioVolumeGroupTest.java b/media/tests/AudioPolicyTest/src/com/android/audiopolicytest/AudioVolumeGroupTest.java
new file mode 100644
index 0000000..84b24b8
--- /dev/null
+++ b/media/tests/AudioPolicyTest/src/com/android/audiopolicytest/AudioVolumeGroupTest.java
@@ -0,0 +1,131 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.audiopolicytest;
+
+import static org.junit.Assert.assertNotEquals;
+
+import android.media.AudioAttributes;
+import android.media.AudioSystem;
+import android.media.audiopolicy.AudioProductStrategy;
+import android.media.audiopolicy.AudioVolumeGroup;
+
+import java.util.List;
+
+public class AudioVolumeGroupTest extends AudioVolumesTestBase {
+    private static final String TAG = "AudioVolumeGroupTest";
+
+    //-----------------------------------------------------------------
+    // Test getAudioVolumeGroups and validate groud id
+    //-----------------------------------------------------------------
+    public void testGetVolumeGroupsFromNonServiceCaller() throws Exception {
+        // The transaction behind getAudioVolumeGroups will fail. Check is done at binder level
+        // with policy service. Error is not reported, the list is just empty.
+        // Request must come from service components
+        List<AudioVolumeGroup> audioVolumeGroup = AudioVolumeGroup.getAudioVolumeGroups();
+
+        assertNotNull(audioVolumeGroup);
+        assertEquals(audioVolumeGroup.size(), 0);
+    }
+
+    //-----------------------------------------------------------------
+    // Test getAudioVolumeGroups and validate groud id
+    //-----------------------------------------------------------------
+    public void testGetVolumeGroups() throws Exception {
+        // Through AudioManager, the transaction behind getAudioVolumeGroups will succeed
+        final List<AudioVolumeGroup> audioVolumeGroup = mAudioManager.getAudioVolumeGroups();
+        assertNotNull(audioVolumeGroup);
+        assertTrue(audioVolumeGroup.size() > 0);
+
+        final List<AudioProductStrategy> audioProductStrategies =
+                mAudioManager.getAudioProductStrategies();
+        assertTrue(audioProductStrategies.size() > 0);
+
+        for (final AudioVolumeGroup avg : audioVolumeGroup) {
+            int avgId = avg.getId();
+            assertNotEquals(avgId, AudioVolumeGroup.DEFAULT_VOLUME_GROUP);
+
+            List<AudioAttributes> avgAttributes = avg.getAudioAttributes();
+            assertNotNull(avgAttributes);
+
+            final int[] avgStreamTypes = avg.getLegacyStreamTypes();
+            assertNotNull(avgStreamTypes);
+
+            // for each volume group attributes, find the matching product strategy and ensure
+            // it is linked the considered volume group
+            for (final AudioAttributes aa : avgAttributes) {
+                if (aa.equals(sDefaultAttributes)) {
+                    // Some volume groups may not have valid attributes, used for internal
+                    // volume management like patch/rerouting
+                    // so bailing out strategy retrieval from attributes
+                    continue;
+                }
+                boolean isVolumeGroupAssociatedToStrategy = false;
+                for (final AudioProductStrategy aps : audioProductStrategies) {
+                    int groupId = aps.getVolumeGroupIdForAudioAttributes(aa);
+                    if (groupId != AudioVolumeGroup.DEFAULT_VOLUME_GROUP) {
+                        // Note that Audio Product Strategies are priority ordered, and the
+                        // the first one matching the AudioAttributes will be used to identify
+                        // the volume group associated to the request.
+                        assertTrue(aps.supportsAudioAttributes(aa));
+                        assertEquals("Volume Group ID (" + avg.toString()
+                                + "), and Volume group ID associated to Strategy ("
+                                + aps.toString() + ") both supporting attributes "
+                                + aa.toString() + " are mismatching",
+                                avgId, groupId);
+                        isVolumeGroupAssociatedToStrategy = true;
+                        break;
+                    }
+                }
+                assertTrue("Volume Group (" + avg.toString()
+                        + ") has no associated strategy for attributes " + aa.toString(),
+                        isVolumeGroupAssociatedToStrategy);
+            }
+
+            // for each volume group stream type, find the matching product strategy and ensure
+            // it is linked the considered volume group
+            for (final int avgStreamType : avgStreamTypes) {
+                if (avgStreamType == AudioSystem.STREAM_DEFAULT) {
+                    // Some Volume Groups may not have corresponding stream types as they
+                    // intends to address volume setting per attributes to avoid adding new
+                    // stream type and going on deprecating the stream type even for volume
+                    // so bailing out strategy retrieval from stream type
+                    continue;
+                }
+                boolean isVolumeGroupAssociatedToStrategy = false;
+                for (final AudioProductStrategy aps : audioProductStrategies) {
+                    int groupId = aps.getVolumeGroupIdForLegacyStreamType(avgStreamType);
+                    if (groupId != AudioVolumeGroup.DEFAULT_VOLUME_GROUP) {
+
+                        assertEquals("Volume Group ID (" + avg.toString()
+                                + "), and Volume group ID associated to Strategy ("
+                                + aps.toString() + ") both supporting stream "
+                                + AudioSystem.streamToString(avgStreamType) + "("
+                                + avgStreamType + ") are mismatching",
+                                avgId, groupId);
+
+                        isVolumeGroupAssociatedToStrategy = true;
+                        break;
+                    }
+                }
+                assertTrue("Volume Group (" + avg.toString()
+                        + ") has no associated strategy for stream "
+                        + AudioSystem.streamToString(avgStreamType) + "(" + avgStreamType + ")",
+                        isVolumeGroupAssociatedToStrategy);
+            }
+        }
+    }
+}
diff --git a/media/tests/AudioPolicyTest/src/com/android/audiopolicytest/AudioVolumesTestBase.java b/media/tests/AudioPolicyTest/src/com/android/audiopolicytest/AudioVolumesTestBase.java
new file mode 100644
index 0000000..a17d65c
--- /dev/null
+++ b/media/tests/AudioPolicyTest/src/com/android/audiopolicytest/AudioVolumesTestBase.java
@@ -0,0 +1,146 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.audiopolicytest;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.media.AudioAttributes;
+import android.media.AudioManager;
+import android.media.audiopolicy.AudioProductStrategy;
+import android.media.audiopolicy.AudioVolumeGroup;
+import android.test.ActivityInstrumentationTestCase2;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class AudioVolumesTestBase extends ActivityInstrumentationTestCase2<AudioPolicyTest> {
+    public AudioManager mAudioManager;
+    Context mContext;
+    private Map<Integer, Integer> mOriginalStreamVolumes = new HashMap<>();
+    private Map<Integer, Integer> mOriginalVolumeGroupVolumes = new HashMap<>();
+
+    // Default matches the invalid (empty) attributes from native.
+    // The difference is the input source default which is not aligned between native and java
+    public static final AudioAttributes sDefaultAttributes =
+            AudioProductStrategy.sDefaultAttributes;
+
+    public static final AudioAttributes sInvalidAttributes = new AudioAttributes.Builder().build();
+
+    public final int[] PUBLIC_STREAM_TYPES = { AudioManager.STREAM_VOICE_CALL,
+            AudioManager.STREAM_SYSTEM, AudioManager.STREAM_RING, AudioManager.STREAM_MUSIC,
+            AudioManager.STREAM_ALARM, AudioManager.STREAM_NOTIFICATION,
+            AudioManager.STREAM_DTMF,  AudioManager.STREAM_ACCESSIBILITY };
+
+    public AudioVolumesTestBase() {
+        super("com.android.audiopolicytest", AudioPolicyTest.class);
+    }
+
+    /**
+     * <p>Note: must be called with shell permission (MODIFY_AUDIO_ROUTING)
+     */
+    private void storeAllVolumes() {
+        List<AudioVolumeGroup> audioVolumeGroups = mAudioManager.getAudioVolumeGroups();
+        for (final AudioVolumeGroup avg : audioVolumeGroups) {
+            if (avg.getAudioAttributes().isEmpty()) {
+                // some volume group may not supports volume control per attributes
+                // like rerouting/patch since these groups are internal to audio policy manager
+                continue;
+            }
+            AudioAttributes avgAttributes = sDefaultAttributes;
+            for (final AudioAttributes aa : avg.getAudioAttributes()) {
+                if (!aa.equals(AudioProductStrategy.sDefaultAttributes)) {
+                    avgAttributes = aa;
+                    break;
+                }
+            }
+            if (avgAttributes.equals(sDefaultAttributes)) {
+                // This shall not happen, however, not purpose of this base class.
+                // so bailing out.
+                continue;
+            }
+            mOriginalVolumeGroupVolumes.put(
+                    avg.getId(), mAudioManager.getVolumeIndexForAttributes(avgAttributes));
+        }
+    }
+
+    /**
+     * <p>Note: must be called with shell permission (MODIFY_AUDIO_ROUTING)
+     */
+    private void restoreAllVolumes() {
+        List<AudioVolumeGroup> audioVolumeGroups = mAudioManager.getAudioVolumeGroups();
+        for (Map.Entry<Integer, Integer> e : mOriginalVolumeGroupVolumes.entrySet()) {
+            for (final AudioVolumeGroup avg : audioVolumeGroups) {
+                if (avg.getId() == e.getKey()) {
+                    assertTrue(!avg.getAudioAttributes().isEmpty());
+                    AudioAttributes avgAttributes = sDefaultAttributes;
+                    for (final AudioAttributes aa : avg.getAudioAttributes()) {
+                        if (!aa.equals(AudioProductStrategy.sDefaultAttributes)) {
+                            avgAttributes = aa;
+                            break;
+                        }
+                    }
+                    assertTrue(!avgAttributes.equals(sDefaultAttributes));
+                    mAudioManager.setVolumeIndexForAttributes(
+                            avgAttributes, e.getValue(), AudioManager.FLAG_ALLOW_RINGER_MODES);
+                }
+            }
+        }
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        mContext = getActivity();
+        mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
+
+        assertEquals(PackageManager.PERMISSION_GRANTED,
+                mContext.checkSelfPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING));
+
+        // Store the original volumes that that they can be recovered in tearDown().
+        mOriginalStreamVolumes.clear();
+        for (int streamType : PUBLIC_STREAM_TYPES) {
+            mOriginalStreamVolumes.put(streamType, mAudioManager.getStreamVolume(streamType));
+        }
+        // Store the original volume per attributes so that they can be recovered in tearDown()
+        mOriginalVolumeGroupVolumes.clear();
+        storeAllVolumes();
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        super.tearDown();
+
+        // Recover the volume and the ringer mode that the test may have overwritten.
+        for (Map.Entry<Integer, Integer> e : mOriginalStreamVolumes.entrySet()) {
+            mAudioManager.setStreamVolume(e.getKey(), e.getValue(),
+                                          AudioManager.FLAG_ALLOW_RINGER_MODES);
+        }
+
+        // Recover the original volume per attributes
+        restoreAllVolumes();
+    }
+
+    public static int resetVolumeIndex(int indexMin, int indexMax) {
+        return (indexMax + indexMin) / 2;
+    }
+
+    public static int incrementVolumeIndex(int index, int indexMin, int indexMax) {
+        return (index + 1 > indexMax) ? resetVolumeIndex(indexMin, indexMax) : ++index;
+    }
+}
diff --git a/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouter2ManagerTest.java b/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouter2ManagerTest.java
index 6ca564f..6a1e965 100644
--- a/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouter2ManagerTest.java
+++ b/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouter2ManagerTest.java
@@ -36,6 +36,7 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
 import android.content.Context;
@@ -47,6 +48,7 @@
 import android.media.MediaRouter2Utils;
 import android.media.RouteDiscoveryPreference;
 import android.media.RoutingSessionInfo;
+import android.os.Bundle;
 import android.support.test.InstrumentationRegistry;
 import android.support.test.filters.SmallTest;
 import android.support.test.runner.AndroidJUnit4;
@@ -73,6 +75,8 @@
     private static final String TAG = "MediaRouter2ManagerTest";
     private static final int WAIT_TIME_MS = 2000;
     private static final int TIMEOUT_MS = 5000;
+    private static final String TEST_KEY = "test_key";
+    private static final String TEST_VALUE = "test_value";
 
     private Context mContext;
     private MediaRouter2Manager mManager;
@@ -160,6 +164,7 @@
         });
 
         MediaRoute2Info routeToRemove = routes.get(ROUTE_ID2);
+        assertNotNull(routeToRemove);
 
         StubMediaRoute2ProviderService sInstance =
                 StubMediaRoute2ProviderService.getInstance();
@@ -171,6 +176,52 @@
         assertTrue(addedLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
     }
 
+    @Test
+    public void testGetRoutes_removedRoute_returnsCorrectRoutes() throws Exception {
+        CountDownLatch addedLatch = new CountDownLatch(1);
+        CountDownLatch removedLatch = new CountDownLatch(1);
+
+        RouteCallback routeCallback = new RouteCallback() {
+            // Used to ensure the removed route is added.
+            @Override
+            public void onRoutesAdded(List<MediaRoute2Info> routes) {
+                if (removedLatch.getCount() > 0) {
+                    return;
+                }
+                addedLatch.countDown();
+            }
+
+            @Override
+            public void onRoutesRemoved(List<MediaRoute2Info> routes) {
+                removedLatch.countDown();
+            }
+        };
+
+        mRouter2.registerRouteCallback(mExecutor, routeCallback,
+                new RouteDiscoveryPreference.Builder(FEATURES_ALL, true).build());
+        mRouteCallbacks.add(routeCallback);
+
+        Map<String, MediaRoute2Info> routes = waitAndGetRoutesWithManager(FEATURES_ALL);
+        MediaRoute2Info routeToRemove = routes.get(ROUTE_ID2);
+        assertNotNull(routeToRemove);
+
+        StubMediaRoute2ProviderService sInstance =
+                StubMediaRoute2ProviderService.getInstance();
+        assertNotNull(sInstance);
+        sInstance.removeRoute(ROUTE_ID2);
+
+        // Wait until the route is removed.
+        assertTrue(removedLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
+
+        Map<String, MediaRoute2Info> newRoutes = waitAndGetRoutesWithManager(FEATURES_ALL);
+        assertNull(newRoutes.get(ROUTE_ID2));
+
+        // Revert the removal.
+        sInstance.addRoute(routeToRemove);
+        assertTrue(addedLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
+        mRouter2.unregisterRouteCallback(routeCallback);
+    }
+
     /**
      * Tests if we get proper routes for application that has special route feature.
      */
@@ -465,6 +516,56 @@
         assertEquals(VOLUME_MAX, variableVolumeRoute.getVolumeMax());
     }
 
+    @Test
+    public void testRouter2SetOnGetControllerHintsListener() throws Exception {
+        Map<String, MediaRoute2Info> routes = waitAndGetRoutesWithManager(FEATURES_ALL);
+        addRouterCallback(new RouteCallback() {});
+
+        MediaRoute2Info route = routes.get(ROUTE_ID1);
+        assertNotNull(route);
+
+        final Bundle controllerHints = new Bundle();
+        controllerHints.putString(TEST_KEY, TEST_VALUE);
+        final CountDownLatch hintLatch = new CountDownLatch(1);
+        final MediaRouter2.OnGetControllerHintsListener listener =
+                route1 -> {
+                    hintLatch.countDown();
+                    return controllerHints;
+                };
+
+        final CountDownLatch successLatch = new CountDownLatch(1);
+        final CountDownLatch failureLatch = new CountDownLatch(1);
+
+        addManagerCallback(new MediaRouter2Manager.Callback() {
+            @Override
+            public void onTransferred(RoutingSessionInfo oldSession,
+                    RoutingSessionInfo newSession) {
+                assertTrue(newSession.getSelectedRoutes().contains(route.getId()));
+                // The StubMediaRoute2ProviderService is supposed to set control hints
+                // with the given controllerHints.
+                Bundle controlHints = newSession.getControlHints();
+                assertNotNull(controlHints);
+                assertTrue(controlHints.containsKey(TEST_KEY));
+                assertEquals(TEST_VALUE, controlHints.getString(TEST_KEY));
+
+                successLatch.countDown();
+            }
+
+            @Override
+            public void onTransferFailed(RoutingSessionInfo session,
+                    MediaRoute2Info requestedRoute) {
+                failureLatch.countDown();
+            }
+        });
+
+        mRouter2.setOnGetControllerHintsListener(listener);
+        mManager.selectRoute(mPackageName, route);
+        assertTrue(hintLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
+        assertTrue(successLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
+
+        assertFalse(failureLatch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS));
+    }
+
     Map<String, MediaRoute2Info> waitAndGetRoutesWithManager(List<String> routeFeatures)
             throws Exception {
         CountDownLatch addedLatch = new CountDownLatch(1);
@@ -475,8 +576,8 @@
         MediaRouter2Manager.Callback managerCallback = new MediaRouter2Manager.Callback() {
             @Override
             public void onRoutesAdded(List<MediaRoute2Info> routes) {
-                for (int i = 0; i < routes.size(); i++) {
-                    if (!routes.get(i).isSystemRoute()) {
+                for (MediaRoute2Info route : routes) {
+                    if (!route.isSystemRoute()) {
                         addedLatch.countDown();
                         break;
                     }
diff --git a/media/tests/MediaRouter/src/com/android/mediaroutertest/StubMediaRoute2ProviderService.java b/media/tests/MediaRouter/src/com/android/mediaroutertest/StubMediaRoute2ProviderService.java
index 6d46ba5..4e398f2 100644
--- a/media/tests/MediaRouter/src/com/android/mediaroutertest/StubMediaRoute2ProviderService.java
+++ b/media/tests/MediaRouter/src/com/android/mediaroutertest/StubMediaRoute2ProviderService.java
@@ -65,9 +65,9 @@
     public static final String ROUTE_NAME_VARIABLE_VOLUME = "Variable Volume Route";
 
     public static final String FEATURE_SAMPLE =
-            "com.android.mediarouteprovider.FEATURE_SAMPLE";
+            "com.android.mediaroutertest.FEATURE_SAMPLE";
     public static final String FEATURE_SPECIAL =
-            "com.android.mediarouteprovider.FEATURE_SPECIAL";
+            "com.android.mediaroutertest..FEATURE_SPECIAL";
 
     Map<String, MediaRoute2Info> mRoutes = new HashMap<>();
     Map<String, String> mRouteIdToSessionId = new HashMap<>();
diff --git a/media/tests/MtpTests/res/raw/test_bad_thumb.jpg b/media/tests/MtpTests/res/raw/test_bad_thumb.jpg
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/media/tests/MtpTests/res/raw/test_bad_thumb.jpg
diff --git a/media/tests/MtpTests/src/android/mtp/MtpDatabaseTest.java b/media/tests/MtpTests/src/android/mtp/MtpDatabaseTest.java
new file mode 100644
index 0000000..e2e8ff4
--- /dev/null
+++ b/media/tests/MtpTests/src/android/mtp/MtpDatabaseTest.java
@@ -0,0 +1,316 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.mtp;
+
+import android.annotation.NonNull;
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.os.Build;
+import android.os.FileUtils;
+import android.os.UserHandle;
+import android.os.storage.StorageManager;
+import android.os.storage.StorageVolume;
+import android.util.Log;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import com.android.internal.util.Preconditions;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Assume;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+/**
+ * Tests for MtpDatabase functionality.
+ */
+@RunWith(AndroidJUnit4.class)
+public class MtpDatabaseTest {
+    private static final String TAG = MtpDatabaseTest.class.getSimpleName();
+
+    private final Context mContext = InstrumentationRegistry.getContext();
+
+    private static final File mBaseDir = InstrumentationRegistry.getContext().getExternalCacheDir();
+    private static final String MAIN_STORAGE_DIR = mBaseDir.getPath() + "/" + TAG + "/";
+    private static final String TEST_DIRNAME = "/TestIs";
+
+    private static final int MAIN_STORAGE_ID = 0x10001;
+    private static final int SCND_STORAGE_ID = 0x20001;
+    private static final String MAIN_STORAGE_ID_STR = Integer.toHexString(MAIN_STORAGE_ID);
+    private static final String SCND_STORAGE_ID_STR = Integer.toHexString(SCND_STORAGE_ID);
+
+    private static final File mMainStorageDir = new File(MAIN_STORAGE_DIR);
+
+    private static ServerHolder mServerHolder;
+    private MtpDatabase mMtpDatabase;
+
+    private static void logMethodName() {
+        Log.d(TAG, Thread.currentThread().getStackTrace()[3].getMethodName());
+    }
+
+    private static File createNewDir(File parent, String name) {
+        File ret = new File(parent, name);
+        if (!ret.mkdir())
+            throw new AssertionError(
+                    "Failed to create file: name=" + name + ", " + parent.getPath());
+        return ret;
+    }
+
+    private static void writeNewFile(File newFile) {
+        try {
+            new FileOutputStream(newFile).write(new byte[] {0, 0, 0});
+        } catch (IOException e) {
+            Assert.fail();
+        }
+    }
+
+    private static void writeNewFileFromByte(File newFile, byte[] byteData) {
+        try {
+            new FileOutputStream(newFile).write(byteData);
+        } catch (IOException e) {
+            Assert.fail();
+        }
+    }
+
+    private static class ServerHolder {
+        @NonNull final MtpServer server;
+        @NonNull final MtpDatabase database;
+
+        ServerHolder(@NonNull MtpServer server, @NonNull MtpDatabase database) {
+            Preconditions.checkNotNull(server);
+            Preconditions.checkNotNull(database);
+            this.server = server;
+            this.database = database;
+        }
+
+        void close() {
+            this.database.setServer(null);
+        }
+    }
+
+    private class OnServerTerminated implements Runnable {
+        @Override
+        public void run() {
+            if (mServerHolder == null) {
+                Log.e(TAG, "mServerHolder is unexpectedly null.");
+                return;
+            }
+            mServerHolder.close();
+            mServerHolder = null;
+        }
+    }
+
+    @Before
+    public void setUp() {
+        FileUtils.deleteContentsAndDir(mMainStorageDir);
+        Assert.assertTrue(mMainStorageDir.mkdir());
+
+        StorageVolume mainStorage = new StorageVolume(MAIN_STORAGE_ID_STR,
+                mMainStorageDir, mMainStorageDir, "Primary Storage",
+				true, false, true, false, -1, UserHandle.CURRENT, "", "");
+
+        final StorageVolume primary = mainStorage;
+
+        mMtpDatabase = new MtpDatabase(mContext, null);
+
+        final MtpServer server =
+                new MtpServer(mMtpDatabase, null, false,
+                        new OnServerTerminated(), Build.MANUFACTURER,
+                        Build.MODEL, "1.0");
+        mMtpDatabase.setServer(server);
+        mServerHolder = new ServerHolder(server, mMtpDatabase);
+
+        mMtpDatabase.addStorage(mainStorage);
+    }
+
+    @After
+    public void tearDown() {
+        FileUtils.deleteContentsAndDir(mMainStorageDir);
+    }
+
+    private File stageFile(int resId, File file) throws IOException {
+        try (InputStream source = mContext.getResources().openRawResource(resId);
+                OutputStream target = new FileOutputStream(file)) {
+            android.os.FileUtils.copy(source, target);
+        }
+        return file;
+    }
+
+    /**
+     * Refer to BitmapUtilTests, but keep here,
+	 * so as to be aware of the behavior or interface change there
+     */
+    private void assertBitmapSize(int expectedWidth, int expectedHeight, Bitmap bitmap) {
+        Assert.assertTrue(
+                "Abnormal bitmap.width: " + bitmap.getWidth(), bitmap.getWidth() >= expectedWidth);
+        Assert.assertTrue(
+                "Abnormal bitmap.height: " + bitmap.getHeight(),
+                bitmap.getHeight() >= expectedHeight);
+    }
+
+    private byte[] createJpegRawData(int sourceWidth, int sourceHeight) throws IOException {
+        return createRawData(Bitmap.CompressFormat.JPEG, sourceWidth, sourceHeight);
+    }
+
+    private byte[] createPngRawData(int sourceWidth, int sourceHeight) throws IOException {
+        return createRawData(Bitmap.CompressFormat.PNG, sourceWidth, sourceHeight);
+    }
+
+    private byte[] createRawData(Bitmap.CompressFormat format, int sourceWidth, int sourceHeight)
+            throws IOException {
+        // Create a temp bitmap as our source
+        Bitmap b = Bitmap.createBitmap(sourceWidth, sourceHeight, Bitmap.Config.ARGB_8888);
+        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+        b.compress(format, 50, outputStream);
+        final byte[] data = outputStream.toByteArray();
+        outputStream.close();
+        return data;
+    }
+
+    /**
+     * Decodes the bitmap with the given sample size
+     */
+    public static Bitmap decodeBitmapFromBytes(byte[] bytes, int sampleSize) {
+        final BitmapFactory.Options options;
+        if (sampleSize <= 1) {
+            options = null;
+        } else {
+            options = new BitmapFactory.Options();
+            options.inSampleSize = sampleSize;
+        }
+        return BitmapFactory.decodeByteArray(bytes, 0, bytes.length, options);
+    }
+
+    private void testThumbnail(int fileHandle, File imgFile, boolean isGoodThumb)
+            throws IOException {
+        boolean isValidThumb;
+        byte[] byteArray;
+        long[] outLongs = new long[3];
+
+        isValidThumb = mMtpDatabase.getThumbnailInfo(fileHandle, outLongs);
+        Assert.assertTrue(isValidThumb);
+
+        byteArray = mMtpDatabase.getThumbnailData(fileHandle);
+
+        if (isGoodThumb) {
+            Assert.assertNotNull("Fail to generate thumbnail:" + imgFile.getPath(), byteArray);
+
+            Bitmap testBitmap = decodeBitmapFromBytes(byteArray, 4);
+            assertBitmapSize(32, 16, testBitmap);
+        } else Assert.assertNull("Bad image should return null:" + imgFile.getPath(), byteArray);
+    }
+
+    @Test
+    @SmallTest
+    public void testMtpDatabaseThumbnail() throws IOException {
+        int baseHandle;
+        int handleJpgBadThumb, handleJpgNoThumb, handleJpgBad;
+        int handlePng1, handlePngBad;
+        final String baseTestDirStr = mMainStorageDir.getPath() + TEST_DIRNAME;
+
+        logMethodName();
+
+        Log.d(TAG, "testMtpDatabaseThumbnail: Generate and insert tested files.");
+
+        baseHandle = mMtpDatabase.beginSendObject(baseTestDirStr,
+                MtpConstants.FORMAT_ASSOCIATION, 0, MAIN_STORAGE_ID);
+
+        File baseDir = new File(baseTestDirStr);
+        baseDir.mkdirs();
+
+        final File jpgfileBadThumb = new File(baseDir, "jpgfileBadThumb.jpg");
+        final File jpgFileNoThumb = new File(baseDir, "jpgFileNoThumb.jpg");
+        final File jpgfileBad = new File(baseDir, "jpgfileBad.jpg");
+        final File pngFile1 = new File(baseDir, "pngFile1.png");
+        final File pngFileBad = new File(baseDir, "pngFileBad.png");
+
+        handleJpgBadThumb = mMtpDatabase.beginSendObject(jpgfileBadThumb.getPath(),
+                MtpConstants.FORMAT_EXIF_JPEG, baseHandle, MAIN_STORAGE_ID);
+        stageFile(R.raw.test_bad_thumb, jpgfileBadThumb);
+
+        handleJpgNoThumb = mMtpDatabase.beginSendObject(jpgFileNoThumb.getPath(),
+                MtpConstants.FORMAT_EXIF_JPEG, baseHandle, MAIN_STORAGE_ID);
+        writeNewFileFromByte(jpgFileNoThumb, createJpegRawData(128, 64));
+
+        handleJpgBad = mMtpDatabase.beginSendObject(jpgfileBad.getPath(),
+                MtpConstants.FORMAT_EXIF_JPEG, baseHandle, MAIN_STORAGE_ID);
+        writeNewFile(jpgfileBad);
+
+        handlePng1 = mMtpDatabase.beginSendObject(pngFile1.getPath(),
+                MtpConstants.FORMAT_PNG, baseHandle, MAIN_STORAGE_ID);
+        writeNewFileFromByte(pngFile1, createPngRawData(128, 64));
+
+        handlePngBad = mMtpDatabase.beginSendObject(pngFileBad.getPath(),
+                MtpConstants.FORMAT_PNG, baseHandle, MAIN_STORAGE_ID);
+        writeNewFile(pngFileBad);
+
+        Log.d(TAG, "testMtpDatabaseThumbnail: Test bad JPG");
+
+        testThumbnail(handleJpgBadThumb, jpgfileBadThumb, false);
+
+        testThumbnail(handleJpgNoThumb, jpgFileNoThumb, false);
+
+        testThumbnail(handleJpgBad, jpgfileBad, false);
+
+        Log.d(TAG, "testMtpDatabaseThumbnail: Test PNG");
+
+        testThumbnail(handlePng1, pngFile1, true);
+
+        Log.d(TAG, "testMtpDatabaseThumbnail: Test bad PNG");
+
+        testThumbnail(handlePngBad, pngFileBad, false);
+    }
+
+    @Test
+    @SmallTest
+    public void testMtpDatabaseExtStorage() throws IOException {
+        int numObj;
+        StorageVolume[] mVolumes;
+
+        logMethodName();
+
+        mVolumes = StorageManager.getVolumeList(UserHandle.myUserId(), 0);
+        // Currently it may need manual setup for 2nd storage on virtual device testing.
+        // Thus only run test when 2nd storage exists.
+        Assume.assumeTrue(
+                "Skip when 2nd storage not available, volume numbers = " + mVolumes.length,
+                mVolumes.length >= 2);
+
+        for (int ii = 0; ii < mVolumes.length; ii++) {
+            StorageVolume volume = mVolumes[ii];
+            // Skip Actual Main storage (Internal Storage),
+            // since we use manipulated path as testing Main storage
+            if (ii > 0)
+                mMtpDatabase.addStorage(volume);
+        }
+
+        numObj = mMtpDatabase.getNumObjects(SCND_STORAGE_ID, 0, 0xFFFFFFFF);
+        Assert.assertTrue(
+                "Fail to get objects in 2nd storage, object numbers = " + numObj, numObj >= 0);
+    }
+}
diff --git a/packages/CarSystemUI/res-keyguard/layout/keyguard_password_view.xml b/packages/CarSystemUI/res-keyguard/layout/keyguard_password_view.xml
index 7004fb6..8b235e6 100644
--- a/packages/CarSystemUI/res-keyguard/layout/keyguard_password_view.xml
+++ b/packages/CarSystemUI/res-keyguard/layout/keyguard_password_view.xml
@@ -29,8 +29,6 @@
     android:orientation="vertical"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    androidprv:layout_maxWidth="@dimen/keyguard_security_width"
-    androidprv:layout_maxHeight="@dimen/keyguard_security_height"
     android:gravity="center">
 
     <include layout="@layout/keyguard_message_area" />
diff --git a/packages/CarSystemUI/res/drawable/unlock_dialog_background.xml b/packages/CarSystemUI/res/drawable/unlock_dialog_background.xml
deleted file mode 100644
index bec6ba7..0000000
--- a/packages/CarSystemUI/res/drawable/unlock_dialog_background.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2019 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">
-  <solid android:color="@color/unlock_dialog_background_color"/>
-  <padding
-      android:bottom="@*android:dimen/car_padding_2"
-      android:left="@*android:dimen/car_padding_2"
-      android:right="@*android:dimen/car_padding_2"
-      android:top="@*android:dimen/car_padding_2"/>
-  <corners
-      android:radius="@dimen/unlock_dialog_radius"/>
-</shape>
\ No newline at end of file
diff --git a/packages/CarSystemUI/res/layout/car_left_navigation_bar.xml b/packages/CarSystemUI/res/layout/car_left_navigation_bar.xml
index 71e74cf..d0916b5 100644
--- a/packages/CarSystemUI/res/layout/car_left_navigation_bar.xml
+++ b/packages/CarSystemUI/res/layout/car_left_navigation_bar.xml
@@ -17,7 +17,7 @@
 */
 -->
 
-<com.android.systemui.navigationbar.car.CarNavigationBarView
+<com.android.systemui.car.navigationbar.CarNavigationBarView
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:systemui="http://schemas.android.com/apk/res-auto"
     android:layout_height="match_parent"
@@ -36,7 +36,7 @@
         android:background="@drawable/system_bar_background"
         android:animateLayoutChanges="true">
 
-        <com.android.systemui.navigationbar.car.CarNavigationButton
+        <com.android.systemui.car.navigationbar.CarNavigationButton
             android:id="@+id/home"
             android:layout_height="wrap_content"
             android:layout_width="match_parent"
@@ -47,7 +47,7 @@
             android:paddingBottom="30dp"
         />
 
-        <com.android.systemui.navigationbar.car.CarNavigationButton
+        <com.android.systemui.car.navigationbar.CarNavigationButton
             android:id="@+id/grid"
             android:layout_height="wrap_content"
             android:layout_width="match_parent"
@@ -59,7 +59,7 @@
             android:paddingBottom="30dp"
         />
 
-        <com.android.systemui.navigationbar.car.CarNavigationButton
+        <com.android.systemui.car.navigationbar.CarNavigationButton
             android:id="@+id/hvac"
             android:layout_height="wrap_content"
             android:layout_width="match_parent"
@@ -110,4 +110,4 @@
 
     </LinearLayout>
 
-</com.android.systemui.navigationbar.car.CarNavigationBarView>
+</com.android.systemui.car.navigationbar.CarNavigationBarView>
diff --git a/packages/CarSystemUI/res/layout/car_left_navigation_bar_unprovisioned.xml b/packages/CarSystemUI/res/layout/car_left_navigation_bar_unprovisioned.xml
index f016dbf..de5a150 100644
--- a/packages/CarSystemUI/res/layout/car_left_navigation_bar_unprovisioned.xml
+++ b/packages/CarSystemUI/res/layout/car_left_navigation_bar_unprovisioned.xml
@@ -17,7 +17,7 @@
 */
 -->
 
-<com.android.systemui.navigationbar.car.CarNavigationBarView
+<com.android.systemui.car.navigationbar.CarNavigationBarView
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:systemui="http://schemas.android.com/apk/res-auto"
     android:layout_height="match_parent"
@@ -36,7 +36,7 @@
         android:background="@drawable/system_bar_background"
         android:animateLayoutChanges="true">
 
-        <com.android.systemui.navigationbar.car.CarNavigationButton
+        <com.android.systemui.car.navigationbar.CarNavigationButton
             android:id="@+id/home"
             android:layout_height="wrap_content"
             android:layout_width="match_parent"
@@ -47,7 +47,7 @@
             android:paddingBottom="30dp"
         />
 
-        <com.android.systemui.navigationbar.car.CarNavigationButton
+        <com.android.systemui.car.navigationbar.CarNavigationButton
             android:id="@+id/hvac"
             android:layout_height="wrap_content"
             android:layout_width="match_parent"
@@ -59,4 +59,4 @@
             android:paddingBottom="30dp"
         />
     </LinearLayout>
-</com.android.systemui.navigationbar.car.CarNavigationBarView>
+</com.android.systemui.car.navigationbar.CarNavigationBarView>
diff --git a/packages/CarSystemUI/res/layout/car_navigation_bar.xml b/packages/CarSystemUI/res/layout/car_navigation_bar.xml
index e2e9a33..1418bf8 100644
--- a/packages/CarSystemUI/res/layout/car_navigation_bar.xml
+++ b/packages/CarSystemUI/res/layout/car_navigation_bar.xml
@@ -15,7 +15,7 @@
   ~ limitations under the License
   -->
 
-<com.android.systemui.navigationbar.car.CarNavigationBarView
+<com.android.systemui.car.navigationbar.CarNavigationBarView
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:systemui="http://schemas.android.com/apk/res-auto"
     android:layout_width="match_parent"
@@ -33,7 +33,7 @@
         android:paddingEnd="20dp"
         android:gravity="center">
 
-        <com.android.systemui.navigationbar.car.CarNavigationButton
+        <com.android.systemui.car.navigationbar.CarNavigationButton
             android:id="@+id/home"
             style="@style/NavigationBarButton"
             systemui:componentNames="com.android.car.carlauncher/.CarLauncher"
@@ -48,7 +48,7 @@
             android:layout_height="match_parent"
             android:layout_weight="1"/>
 
-        <com.android.systemui.navigationbar.car.CarNavigationButton
+        <com.android.systemui.car.navigationbar.CarNavigationButton
             android:id="@+id/maps_nav"
             style="@style/NavigationBarButton"
             systemui:categories="android.intent.category.APP_MAPS"
@@ -63,7 +63,7 @@
             android:layout_height="match_parent"
             android:layout_weight="1"/>
 
-        <com.android.systemui.navigationbar.car.CarNavigationButton
+        <com.android.systemui.car.navigationbar.CarNavigationButton
             android:id="@+id/music_nav"
             style="@style/NavigationBarButton"
             systemui:categories="android.intent.category.APP_MUSIC"
@@ -79,7 +79,7 @@
             android:layout_height="match_parent"
             android:layout_weight="1"/>
 
-        <com.android.systemui.navigationbar.car.CarNavigationButton
+        <com.android.systemui.car.navigationbar.CarNavigationButton
             android:id="@+id/phone_nav"
             style="@style/NavigationBarButton"
             systemui:icon="@drawable/car_ic_phone"
@@ -94,7 +94,7 @@
             android:layout_height="match_parent"
             android:layout_weight="1"/>
 
-        <com.android.systemui.navigationbar.car.CarNavigationButton
+        <com.android.systemui.car.navigationbar.CarNavigationButton
             android:id="@+id/grid_nav"
             style="@style/NavigationBarButton"
             systemui:componentNames="com.android.car.carlauncher/.AppGridActivity"
@@ -109,7 +109,7 @@
             android:layout_height="match_parent"
             android:layout_weight="1"/>
 
-        <com.android.systemui.navigationbar.car.CarNavigationButton
+        <com.android.systemui.car.navigationbar.CarNavigationButton
             android:id="@+id/notifications"
             style="@style/NavigationBarButton"
             systemui:icon="@drawable/car_ic_notification"
@@ -121,7 +121,7 @@
             android:layout_height="match_parent"
             android:layout_weight="1"/>
 
-        <com.android.systemui.navigationbar.car.AssitantButton
+        <com.android.systemui.car.navigationbar.AssitantButton
             android:id="@+id/assist"
             style="@style/NavigationBarButton"
             systemui:icon="@drawable/ic_mic_white"
@@ -140,4 +140,4 @@
         android:visibility="gone"
     />
 
-</com.android.systemui.navigationbar.car.CarNavigationBarView>
\ No newline at end of file
+</com.android.systemui.car.navigationbar.CarNavigationBarView>
\ No newline at end of file
diff --git a/packages/CarSystemUI/res/layout/car_navigation_bar_unprovisioned.xml b/packages/CarSystemUI/res/layout/car_navigation_bar_unprovisioned.xml
index 1c5d37f..a040e80 100644
--- a/packages/CarSystemUI/res/layout/car_navigation_bar_unprovisioned.xml
+++ b/packages/CarSystemUI/res/layout/car_navigation_bar_unprovisioned.xml
@@ -15,7 +15,7 @@
   ~ limitations under the License
   -->
 
-<com.android.systemui.navigationbar.car.CarNavigationBarView
+<com.android.systemui.car.navigationbar.CarNavigationBarView
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:systemui="http://schemas.android.com/apk/res-auto"
     android:layout_width="match_parent"
@@ -31,7 +31,7 @@
         android:paddingStart="@*android:dimen/car_padding_5"
         android:paddingEnd="@*android:dimen/car_padding_5">
 
-        <com.android.systemui.navigationbar.car.CarNavigationButton
+        <com.android.systemui.car.navigationbar.CarNavigationButton
             android:id="@+id/home"
             android:layout_width="@*android:dimen/car_touch_target_size"
             android:layout_height="match_parent"
@@ -42,5 +42,5 @@
             systemui:highlightWhenSelected="true"
         />
     </LinearLayout>
-</com.android.systemui.navigationbar.car.CarNavigationBarView>
+</com.android.systemui.car.navigationbar.CarNavigationBarView>
 
diff --git a/packages/CarSystemUI/res/layout/car_qs_footer.xml b/packages/CarSystemUI/res/layout/car_qs_footer.xml
deleted file mode 100644
index bf96c00..0000000
--- a/packages/CarSystemUI/res/layout/car_qs_footer.xml
+++ /dev/null
@@ -1,83 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2018 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.
--->
-<!-- extends RelativeLayout -->
-<com.android.systemui.qs.car.CarQSFooter
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/qs_footer"
-    android:layout_width="match_parent"
-    android:layout_height="@dimen/car_qs_footer_height"
-    android:baselineAligned="false"
-    android:clickable="false"
-    android:clipChildren="false"
-    android:clipToPadding="false"
-    android:paddingBottom="@dimen/car_qs_footer_padding_bottom"
-    android:paddingTop="@dimen/car_qs_footer_padding_top"
-    android:paddingEnd="@dimen/car_qs_footer_padding_end"
-    android:paddingStart="@dimen/car_qs_footer_padding_start"
-    android:gravity="center_vertical">
-
-    <com.android.systemui.statusbar.phone.MultiUserSwitch
-        android:id="@+id/multi_user_switch"
-        android:layout_alignParentStart="true"
-        android:layout_centerVertical="true"
-        android:layout_width="@dimen/car_qs_footer_icon_width"
-        android:layout_height="@dimen/car_qs_footer_icon_height"
-        android:background="?android:attr/selectableItemBackground"
-        android:focusable="true">
-
-        <ImageView
-            android:id="@+id/multi_user_avatar"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:layout_gravity="center"
-            android:scaleType="fitCenter"/>
-    </com.android.systemui.statusbar.phone.MultiUserSwitch>
-
-    <ImageView
-        android:id="@+id/user_switch_expand_icon"
-        android:layout_height="match_parent"
-        android:layout_width="@dimen/car_qs_footer_user_switch_icon_width"
-        android:layout_centerVertical="true"
-        android:layout_toEndOf="@+id/multi_user_switch"
-        android:layout_marginLeft="@dimen/car_qs_footer_user_switch_icon_margin"
-        android:layout_marginRight="@dimen/car_qs_footer_user_switch_icon_margin"
-        android:src="@drawable/car_ic_arrow_drop_up"
-        android:scaleType="fitCenter">
-    </ImageView>
-
-    <TextView android:id="@+id/user_name"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:textSize="@dimen/car_qs_footer_user_name_text_size"
-        android:textColor="@color/car_qs_footer_user_name_color"
-        android:gravity="start|center_vertical"
-        android:layout_centerVertical="true"
-        android:layout_toEndOf="@id/user_switch_expand_icon" />
-
-    <com.android.systemui.statusbar.phone.SettingsButton
-        android:id="@+id/settings_button"
-        android:layout_alignParentEnd="true"
-        android:layout_centerVertical="true"
-        android:layout_width="@dimen/car_qs_footer_icon_width"
-        android:layout_height="@dimen/car_qs_footer_icon_height"
-        android:background="@drawable/ripple_drawable"
-        android:contentDescription="@string/accessibility_quick_settings_settings"
-        android:scaleType="centerCrop"
-        android:src="@drawable/ic_settings_16dp"
-        android:tint="?android:attr/colorForeground"
-        style="@android:style/Widget.Material.Button.Borderless" />
-
-</com.android.systemui.qs.car.CarQSFooter>
diff --git a/packages/CarSystemUI/res/layout/car_qs_panel.xml b/packages/CarSystemUI/res/layout/car_qs_panel.xml
deleted file mode 100644
index 0c6f322..0000000
--- a/packages/CarSystemUI/res/layout/car_qs_panel.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2018 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.
--->
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/quick_settings_container"
-    android:clipChildren="false"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:background="@color/car_qs_background_primary"
-    android:orientation="vertical"
-    android:elevation="4dp">
-
-    <include layout="@layout/car_status_bar_header"/>
-    <include layout="@layout/car_qs_footer"/>
-
-    <RelativeLayout
-        xmlns:android="http://schemas.android.com/apk/res/android"
-        android:id="@+id/user_switcher_container"
-        android:clipChildren="false"
-        android:layout_width="match_parent"
-        android:layout_height="@dimen/car_user_switcher_container_height">
-
-        <com.android.systemui.car.userswitcher.UserGridRecyclerView
-            android:id="@+id/user_grid"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"/>
-
-    </RelativeLayout>
-
-</LinearLayout>
diff --git a/packages/CarSystemUI/res/layout/car_right_navigation_bar.xml b/packages/CarSystemUI/res/layout/car_right_navigation_bar.xml
index 327610a89..d386ce3 100644
--- a/packages/CarSystemUI/res/layout/car_right_navigation_bar.xml
+++ b/packages/CarSystemUI/res/layout/car_right_navigation_bar.xml
@@ -17,7 +17,7 @@
 */
 -->
 
-<com.android.systemui.navigationbar.car.CarNavigationBarView
+<com.android.systemui.car.navigationbar.CarNavigationBarView
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:systemui="http://schemas.android.com/apk/res-auto"
     android:layout_height="match_parent"
@@ -39,7 +39,7 @@
         android:background="@drawable/system_bar_background"
         android:animateLayoutChanges="true">
 
-        <com.android.systemui.navigationbar.car.CarNavigationButton
+        <com.android.systemui.car.navigationbar.CarNavigationButton
             android:id="@+id/home"
             android:layout_height="wrap_content"
             android:layout_width="match_parent"
@@ -50,7 +50,7 @@
             android:paddingBottom="30dp"
         />
 
-        <com.android.systemui.navigationbar.car.CarNavigationButton
+        <com.android.systemui.car.navigationbar.CarNavigationButton
             android:id="@+id/grid"
             android:layout_height="wrap_content"
             android:layout_width="match_parent"
@@ -62,7 +62,7 @@
             android:paddingBottom="30dp"
         />
 
-        <com.android.systemui.navigationbar.car.CarNavigationButton
+        <com.android.systemui.car.navigationbar.CarNavigationButton
             android:id="@+id/hvac"
             android:layout_height="wrap_content"
             android:layout_width="match_parent"
@@ -113,4 +113,4 @@
 
     </LinearLayout>
 
-</com.android.systemui.navigationbar.car.CarNavigationBarView>
+</com.android.systemui.car.navigationbar.CarNavigationBarView>
diff --git a/packages/CarSystemUI/res/layout/car_right_navigation_bar_unprovisioned.xml b/packages/CarSystemUI/res/layout/car_right_navigation_bar_unprovisioned.xml
index f016dbf..de5a150 100644
--- a/packages/CarSystemUI/res/layout/car_right_navigation_bar_unprovisioned.xml
+++ b/packages/CarSystemUI/res/layout/car_right_navigation_bar_unprovisioned.xml
@@ -17,7 +17,7 @@
 */
 -->
 
-<com.android.systemui.navigationbar.car.CarNavigationBarView
+<com.android.systemui.car.navigationbar.CarNavigationBarView
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:systemui="http://schemas.android.com/apk/res-auto"
     android:layout_height="match_parent"
@@ -36,7 +36,7 @@
         android:background="@drawable/system_bar_background"
         android:animateLayoutChanges="true">
 
-        <com.android.systemui.navigationbar.car.CarNavigationButton
+        <com.android.systemui.car.navigationbar.CarNavigationButton
             android:id="@+id/home"
             android:layout_height="wrap_content"
             android:layout_width="match_parent"
@@ -47,7 +47,7 @@
             android:paddingBottom="30dp"
         />
 
-        <com.android.systemui.navigationbar.car.CarNavigationButton
+        <com.android.systemui.car.navigationbar.CarNavigationButton
             android:id="@+id/hvac"
             android:layout_height="wrap_content"
             android:layout_width="match_parent"
@@ -59,4 +59,4 @@
             android:paddingBottom="30dp"
         />
     </LinearLayout>
-</com.android.systemui.navigationbar.car.CarNavigationBarView>
+</com.android.systemui.car.navigationbar.CarNavigationBarView>
diff --git a/packages/CarSystemUI/res/layout/car_status_bar_header.xml b/packages/CarSystemUI/res/layout/car_status_bar_header.xml
index 81c7108..12c9f11 100644
--- a/packages/CarSystemUI/res/layout/car_status_bar_header.xml
+++ b/packages/CarSystemUI/res/layout/car_status_bar_header.xml
@@ -15,7 +15,7 @@
   ~ limitations under the License
   -->
 <!-- Extends LinearLayout -->
-<com.android.systemui.qs.car.CarStatusBarHeader
+<com.android.systemui.car.userswitcher.CarStatusBarHeader
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:id="@+id/header"
     android:layout_width="match_parent"
@@ -27,4 +27,4 @@
         android:layout_height="match_parent"
         android:layout_weight="1"
     />
-</com.android.systemui.qs.car.CarStatusBarHeader>
+</com.android.systemui.car.userswitcher.CarStatusBarHeader>
diff --git a/packages/CarSystemUI/res/layout/car_top_navigation_bar.xml b/packages/CarSystemUI/res/layout/car_top_navigation_bar.xml
index ce0d31c..3389a7a 100644
--- a/packages/CarSystemUI/res/layout/car_top_navigation_bar.xml
+++ b/packages/CarSystemUI/res/layout/car_top_navigation_bar.xml
@@ -15,7 +15,7 @@
   ~ limitations under the License
   -->
 
-<com.android.systemui.navigationbar.car.CarNavigationBarView
+<com.android.systemui.car.navigationbar.CarNavigationBarView
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:systemui="http://schemas.android.com/apk/res-auto"
     android:id="@+id/car_top_bar"
@@ -36,7 +36,7 @@
             android:layout_alignParentStart="true"
         >
 
-            <com.android.systemui.navigationbar.car.CarNavigationButton
+            <com.android.systemui.car.navigationbar.CarNavigationButton
                 android:id="@+id/hvacleft"
                 android:layout_width="match_parent"
                 android:layout_height="match_parent"
@@ -45,7 +45,7 @@
                 systemui:intent="intent:#Intent;action=android.car.intent.action.TOGGLE_HVAC_CONTROLS;end"
             />
 
-            <com.android.systemui.statusbar.hvac.AnimatedTemperatureView
+            <com.android.systemui.car.hvac.AnimatedTemperatureView
                 android:id="@+id/lefttext"
                 android:layout_width="wrap_content"
                 android:layout_height="match_parent"
@@ -71,7 +71,7 @@
             android:layout_height="match_parent"
             android:layout_centerInParent="true"
         >
-            <com.android.systemui.navigationbar.car.CarNavigationButton
+            <com.android.systemui.car.navigationbar.CarNavigationButton
                 android:id="@+id/qs"
                 android:layout_width="match_parent"
                 android:layout_height="match_parent"
@@ -118,7 +118,7 @@
             android:layout_alignParentEnd="true"
         >
 
-            <com.android.systemui.navigationbar.car.CarNavigationButton
+            <com.android.systemui.car.navigationbar.CarNavigationButton
                 android:id="@+id/hvacright"
                 android:layout_width="match_parent"
                 android:layout_height="match_parent"
@@ -127,7 +127,7 @@
                 systemui:intent="intent:#Intent;action=android.car.intent.action.TOGGLE_HVAC_CONTROLS;end"
             />
 
-            <com.android.systemui.statusbar.hvac.AnimatedTemperatureView
+            <com.android.systemui.car.hvac.AnimatedTemperatureView
                 android:id="@+id/righttext"
                 android:layout_width="wrap_content"
                 android:layout_height="match_parent"
@@ -148,4 +148,4 @@
         </FrameLayout>
     </RelativeLayout>
 
-</com.android.systemui.navigationbar.car.CarNavigationBarView>
+</com.android.systemui.car.navigationbar.CarNavigationBarView>
diff --git a/packages/CarSystemUI/res/layout/car_top_navigation_bar_unprovisioned.xml b/packages/CarSystemUI/res/layout/car_top_navigation_bar_unprovisioned.xml
index a71567c..9634950 100644
--- a/packages/CarSystemUI/res/layout/car_top_navigation_bar_unprovisioned.xml
+++ b/packages/CarSystemUI/res/layout/car_top_navigation_bar_unprovisioned.xml
@@ -15,7 +15,7 @@
   ~ limitations under the License
   -->
 
-<com.android.systemui.navigationbar.car.CarNavigationBarView
+<com.android.systemui.car.navigationbar.CarNavigationBarView
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:systemui="http://schemas.android.com/apk/res-auto"
     android:id="@+id/car_top_bar"
@@ -36,7 +36,7 @@
         android:layout_alignParentStart="true"
         >
 
-      <com.android.systemui.navigationbar.car.CarNavigationButton
+      <com.android.systemui.car.navigationbar.CarNavigationButton
           android:id="@+id/hvacleft"
           android:layout_width="match_parent"
           android:layout_height="match_parent"
@@ -45,7 +45,7 @@
           systemui:intent="intent:#Intent;action=android.car.intent.action.TOGGLE_HVAC_CONTROLS;end"
           />
 
-      <com.android.systemui.statusbar.hvac.AnimatedTemperatureView
+      <com.android.systemui.car.hvac.AnimatedTemperatureView
           android:id="@+id/lefttext"
           android:layout_width="wrap_content"
           android:layout_height="match_parent"
@@ -70,7 +70,7 @@
         android:layout_width="wrap_content"
         android:layout_height="match_parent"
         android:layout_centerInParent="true">
-      <com.android.systemui.navigationbar.car.CarNavigationButton
+      <com.android.systemui.car.navigationbar.CarNavigationButton
           android:id="@+id/qs"
           android:layout_width="match_parent"
           android:layout_height="match_parent"
@@ -114,7 +114,7 @@
         android:layout_alignParentEnd="true"
         >
 
-      <com.android.systemui.navigationbar.car.CarNavigationButton
+      <com.android.systemui.car.navigationbar.CarNavigationButton
           android:id="@+id/hvacright"
           android:layout_width="match_parent"
           android:layout_height="match_parent"
@@ -123,7 +123,7 @@
           systemui:intent="intent:#Intent;action=android.car.intent.action.TOGGLE_HVAC_CONTROLS;end"
           />
 
-      <com.android.systemui.statusbar.hvac.AnimatedTemperatureView
+      <com.android.systemui.car.hvac.AnimatedTemperatureView
           android:id="@+id/righttext"
           android:layout_width="wrap_content"
           android:layout_height="match_parent"
@@ -144,4 +144,4 @@
     </FrameLayout>
   </RelativeLayout>
 
-</com.android.systemui.navigationbar.car.CarNavigationBarView>
+</com.android.systemui.car.navigationbar.CarNavigationBarView>
diff --git a/packages/CarSystemUI/res/layout/trust_agent_unlock_dialog.xml b/packages/CarSystemUI/res/layout/trust_agent_unlock_dialog.xml
deleted file mode 100644
index 9df78f1..0000000
--- a/packages/CarSystemUI/res/layout/trust_agent_unlock_dialog.xml
+++ /dev/null
@@ -1,73 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2019 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/unlock_dialog_parent"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:gravity="center">
-
-    <LinearLayout
-        android:id="@+id/unlock_dialog"
-        android:layout_width="@dimen/unlock_dialog_width"
-        android:layout_height="wrap_content"
-        android:gravity="center"
-        android:layout_gravity="center"
-        android:orientation="vertical"
-        android:background="@drawable/unlock_dialog_background"
-        android:padding="@*android:dimen/car_padding_2">
-        <FrameLayout
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content">
-            <ProgressBar
-                android:layout_gravity="center"
-                android:layout_width="@dimen/unlock_dialog_progress_bar_size"
-                android:layout_height="@dimen/unlock_dialog_progress_bar_size" />
-            <ImageView
-                android:id="@+id/avatar"
-                android:layout_gravity="center"
-                android:layout_width="@dimen/unlock_dialog_avatar_size"
-                android:layout_height="@dimen/unlock_dialog_avatar_size"
-                android:scaleType="fitCenter"/>
-        </FrameLayout>
-
-        <TextView
-            android:id="@+id/user_name"
-            android:layout_height="wrap_content"
-            android:layout_width="wrap_content"
-            android:text="@string/unlock_dialog_default_user_name"
-            android:textSize="@*android:dimen/car_body1_size"
-            android:textColor="@android:color/white"/>
-
-        <TextView
-            android:id="@+id/unlocking_text"
-            android:layout_height="wrap_content"
-            android:layout_width="wrap_content"
-            android:layout_marginTop="@*android:dimen/car_padding_1"
-            android:text="@string/unlock_dialog_message_default"
-            android:textSize="@*android:dimen/car_body4_size"
-            android:textColor="@color/unlock_dialog_message_text_default"/>
-
-        <Button
-            android:id="@+id/enter_pin_button"
-            android:layout_marginTop="@*android:dimen/car_padding_1"
-            android:layout_height="wrap_content"
-            android:layout_width="wrap_content"
-            android:text="@string/unlock_dialog_button_text_pin"
-            style="@style/UnlockDialogButton"/>
-    </LinearLayout>
-</FrameLayout>
\ No newline at end of file
diff --git a/packages/CarSystemUI/res/values-af/strings.xml b/packages/CarSystemUI/res/values-af/strings.xml
new file mode 100644
index 0000000..8a54c3b
--- /dev/null
+++ b/packages/CarSystemUI/res/values-af/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"Min."</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"Maks."</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"Stemherkenning nou deur gekoppelde Bluetooth-toestel hanteer"</string>
+    <string name="car_guest" msgid="318393171202663722">"Gas"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"Gas"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"Voeg gebruiker by"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"Nuwe gebruiker"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Wanneer jy \'n nuwe gebruiker byvoeg, moet daardie persoon hul spasie opstel."</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"Enige gebruiker kan programme vir al die ander gebruikers opdateer."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-af/strings_car.xml b/packages/CarSystemUI/res/values-af/strings_car.xml
new file mode 100644
index 0000000..a6b6093
--- /dev/null
+++ b/packages/CarSystemUI/res/values-af/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"Gas"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"Gas"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"Voeg gebruiker by"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"Nuwe gebruiker"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"Wanneer jy \'n nuwe gebruiker byvoeg, moet daardie persoon hul spasie opstel."</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"Enige gebruiker kan programme vir al die ander gebruikers opdateer."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-am/strings.xml b/packages/CarSystemUI/res/values-am/strings.xml
new file mode 100644
index 0000000..733349c
--- /dev/null
+++ b/packages/CarSystemUI/res/values-am/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"ዝቅተኛ"</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"ከፍተኛ"</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"የድምፅ ለይቶ ማወቅ አሁን በተገናኘ የብሉቱዝ መሣሪያ ይስተናገዳል"</string>
+    <string name="car_guest" msgid="318393171202663722">"እንግዳ"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"እንግዳ"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"ተጠቃሚ አክል"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"አዲስ ተጠቃሚ"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"አዲስ ተጠቃሚ ሲያክሉ ያ ሰው የራሳቸውን ቦታ ማቀናበር አለባቸው።"</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"ማንኛውም ተጠቃሚ መተግበሪያዎችን ለሌሎች ተጠቃሚዎች ሁሉ ማዘመን ይችላል።"</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-am/strings_car.xml b/packages/CarSystemUI/res/values-am/strings_car.xml
new file mode 100644
index 0000000..7f5895a
--- /dev/null
+++ b/packages/CarSystemUI/res/values-am/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"እንግዳ"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"እንግዳ"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"ተጠቃሚ አክል"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"አዲስ ተጠቃሚ"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"አዲስ ተጠቃሚ ሲያክሉ ያ ሰው የራሳቸውን ቦታ ማቀናበር አለባቸው።"</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"ማንኛውም ተጠቃሚ መተግበሪያዎችን ለሌሎች ተጠቃሚዎች ሁሉ ማዘመን ይችላል።"</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-ar/strings.xml b/packages/CarSystemUI/res/values-ar/strings.xml
new file mode 100644
index 0000000..320df58
--- /dev/null
+++ b/packages/CarSystemUI/res/values-ar/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"حد أدنى"</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"حد أقصى"</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"تتم معالجة التعرّف على الصوت الآن من خلال جهاز بلوتوث متصل."</string>
+    <string name="car_guest" msgid="318393171202663722">"ضيف"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"ضيف"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"إضافة مستخدم"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"مستخدم جديد"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"عند إضافة مستخدم جديد، على هذا المستخدم إعداد مساحته."</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"يمكن لأي مستخدم تحديث التطبيقات لجميع المستخدمين الآخرين."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-as/strings.xml b/packages/CarSystemUI/res/values-as/strings.xml
new file mode 100644
index 0000000..abd090e
--- /dev/null
+++ b/packages/CarSystemUI/res/values-as/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"সর্বনিম্ন"</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"সৰ্বাধিক"</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"কণ্ঠস্বৰৰ চিনাক্তকৰণ এতিয়া সংযুক্ত ব্লুটুথ ডিভাইচে নিয়ন্ত্ৰণ কৰে"</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-as/strings_car.xml b/packages/CarSystemUI/res/values-as/strings_car.xml
new file mode 100644
index 0000000..6eabbd4
--- /dev/null
+++ b/packages/CarSystemUI/res/values-as/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"অতিথি"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"অতিথি"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"ব্যৱহাৰকাৰী যোগ কৰক"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"নতুন ব্যৱহাৰকাৰী"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"আপুনি যেতিয়া এজন নতুন ব্যৱহাৰকাৰীক যোগ কৰে, তেতিয়া তেওঁ নিজৰ ঠাই ছেট আপ কৰাটো প্ৰয়োজন হয়।"</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"অন্য সকলো ব্যৱহাৰকাৰীৰ বাবে যিকোনো এজন ব্যৱহাৰকাৰীয়ে এপ্‌সমূহ আপডে\'ট কৰিব পাৰে।"</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-az/strings.xml b/packages/CarSystemUI/res/values-az/strings.xml
new file mode 100644
index 0000000..98dd49b
--- /dev/null
+++ b/packages/CarSystemUI/res/values-az/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"Min"</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"Maks"</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"Səs tanınması qoşulmuş Bluetooth cihazı ilə icra edilir"</string>
+    <string name="car_guest" msgid="318393171202663722">"Qonaq"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"Qonaq"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"İstifadəçi əlavə edin"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"Yeni İstifadəçi"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Yeni istifadəçi əlavə etdiyinizdə həmin şəxs öz yerini təyin etməlidir."</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"İstənilən istifadəçi digər bütün istifadəçilər üçün tətbiqləri güncəlləyə bilər."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-az/strings_car.xml b/packages/CarSystemUI/res/values-az/strings_car.xml
new file mode 100644
index 0000000..aeee105
--- /dev/null
+++ b/packages/CarSystemUI/res/values-az/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"Qonaq"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"Qonaq"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"İstifadəçi əlavə edin"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"Yeni istifadəçi"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"Yeni istifadəçi əlavə etdiyinizdə həmin şəxs öz yerini təyin etməlidir."</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"İstənilən istifadəçi digər bütün istifadəçilər üçün tətbiqləri güncəlləyə bilər."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-b+sr+Latn/strings.xml b/packages/CarSystemUI/res/values-b+sr+Latn/strings.xml
new file mode 100644
index 0000000..3f01a3a
--- /dev/null
+++ b/packages/CarSystemUI/res/values-b+sr+Latn/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"Min."</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"Maks."</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"Prepoznavanjem glasa sada upravlja povezani Bluetooth uređaj"</string>
+    <string name="car_guest" msgid="318393171202663722">"Gost"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"Gost"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"Dodaj korisnika"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"Novi korisnik"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Kada dodate novog korisnika, ta osoba treba da podesi svoj prostor."</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"Svaki korisnik može da ažurira aplikacije za sve ostale korisnike."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-b+sr+Latn/strings_car.xml b/packages/CarSystemUI/res/values-b+sr+Latn/strings_car.xml
new file mode 100644
index 0000000..f3b53a5
--- /dev/null
+++ b/packages/CarSystemUI/res/values-b+sr+Latn/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"Gost"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"Gost"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"Dodaj korisnika"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"Novi korisnik"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"Kada dodate novog korisnika, ta osoba treba da podesi svoj prostor."</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"Svaki korisnik može da ažurira aplikacije za sve ostale korisnike."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-be/strings.xml b/packages/CarSystemUI/res/values-be/strings.xml
new file mode 100644
index 0000000..1b26c37
--- /dev/null
+++ b/packages/CarSystemUI/res/values-be/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"Мін"</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"Макс"</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"Распазнаванне голасу выконвае падключаная прылада Bluetooth"</string>
+    <string name="car_guest" msgid="318393171202663722">"Госць"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"Госць"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"Дадаць карыстальніка"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"Новы карыстальнік"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Калі вы дадаяце новага карыстальніка, яму трэба наладзіць свой профіль."</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"Кожны карыстальнік прылады можа абнаўляць праграмы для ўсіх іншых карыстальнікаў."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-be/strings_car.xml b/packages/CarSystemUI/res/values-be/strings_car.xml
new file mode 100644
index 0000000..1215af2
--- /dev/null
+++ b/packages/CarSystemUI/res/values-be/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"Госць"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"Госць"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"Дадаць карыстальніка"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"Новы карыстальнік"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"Калі вы дадаяце новага карыстальніка, яму трэба наладзіць свой профіль."</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"Кожны карыстальнік прылады можа абнаўляць праграмы для ўсіх іншых карыстальнікаў."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-bg/strings.xml b/packages/CarSystemUI/res/values-bg/strings.xml
new file mode 100644
index 0000000..dda69ec
--- /dev/null
+++ b/packages/CarSystemUI/res/values-bg/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"Мин."</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"Макс."</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"Гл. разпознаване се обработва от свързаното у-во с Bluetooth"</string>
+    <string name="car_guest" msgid="318393171202663722">"Гост"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"Гост"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"Добавяне на потребител"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"Нов потребител"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Когато добавите нов потребител, той трябва да настрои работната си област."</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"Всеки потребител може да актуализира приложенията за всички останали потребители."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-bg/strings_car.xml b/packages/CarSystemUI/res/values-bg/strings_car.xml
new file mode 100644
index 0000000..d95b18e
--- /dev/null
+++ b/packages/CarSystemUI/res/values-bg/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"Гост"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"Гост"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"Добавяне на потребител"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"Нов потребител"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"Когато добавите нов потребител, той трябва да настрои работното си пространство."</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"Всеки потребител може да актуализира приложенията за всички останали потребители."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-bn/strings.xml b/packages/CarSystemUI/res/values-bn/strings.xml
new file mode 100644
index 0000000..1c56256
--- /dev/null
+++ b/packages/CarSystemUI/res/values-bn/strings.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"সর্বনিম্ন"</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"সর্বাধিক"</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"কানেক্ট করা ব্লুটুথ ডিভাইস এখন ভয়েস শনাক্তকরণ ম্যানেজ করছে"</string>
+    <!-- no translation found for car_guest (318393171202663722) -->
+    <skip />
+    <!-- no translation found for start_guest_session (497784785761754874) -->
+    <skip />
+    <!-- no translation found for car_add_user (4067337059622483269) -->
+    <skip />
+    <!-- no translation found for car_new_user (6637442369728092473) -->
+    <skip />
+    <!-- no translation found for user_add_user_message_setup (1035578846007352323) -->
+    <skip />
+    <!-- no translation found for user_add_user_message_update (7061671307004867811) -->
+    <skip />
+</resources>
diff --git a/packages/CarSystemUI/res/values-bn/strings_car.xml b/packages/CarSystemUI/res/values-bn/strings_car.xml
new file mode 100644
index 0000000..f44ba6e
--- /dev/null
+++ b/packages/CarSystemUI/res/values-bn/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"অতিথি"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"অতিথি সেশন শুরু করুন"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"ব্যবহারকারী যোগ করুন"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"নতুন ব্যবহারকারী"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"নতুন ব্যবহারকারী যোগ করলে, তার স্পেস তাকে সেট-আপ করে নিতে হবে।"</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"যেকোনও ব্যবহারকারী বাকি সব ব্যবহারকারীর জন্য অ্যাপ আপডেট করতে পারবেন।"</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-bs/strings.xml b/packages/CarSystemUI/res/values-bs/strings.xml
new file mode 100644
index 0000000..4b096d6
--- /dev/null
+++ b/packages/CarSystemUI/res/values-bs/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"Min."</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"Maks."</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"Prepoznavanjem glasa sada upravlja povezani Bluetooth uređaj"</string>
+    <string name="car_guest" msgid="318393171202663722">"Gost"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"Gost"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"Dodaj korisnika"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"Novi korisnik"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Kada dodate novog korisnika, ta osoba treba postaviti svoj prostor."</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"Bilo koji korisnik može ažurirati aplikacije za sve druge korisnike."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-bs/strings_car.xml b/packages/CarSystemUI/res/values-bs/strings_car.xml
new file mode 100644
index 0000000..e56f861
--- /dev/null
+++ b/packages/CarSystemUI/res/values-bs/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"Gost"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"Gost"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"Dodaj korisnika"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"Novi korisnik"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"Kada dodate novog korisnika, ta osoba treba postaviti svoj prostor."</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"Svaki korisnik može ažurirati aplikacije za sve druge korisnike."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-ca/strings.xml b/packages/CarSystemUI/res/values-ca/strings.xml
new file mode 100644
index 0000000..a78bff1
--- /dev/null
+++ b/packages/CarSystemUI/res/values-ca/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"Mín."</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"Màx."</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"Reconeixement de veu gestionat per disp. Bluetooth connectat"</string>
+    <string name="car_guest" msgid="318393171202663722">"Convidat"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"Convidat"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"Afegeix un usuari"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"Usuari nou"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Quan s\'afegeix un usuari nou, aquest usuari ha de configurar el seu espai."</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"Qualsevol usuari pot actualitzar les aplicacions de la resta d\'usuaris."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-ca/strings_car.xml b/packages/CarSystemUI/res/values-ca/strings_car.xml
new file mode 100644
index 0000000..89725a2
--- /dev/null
+++ b/packages/CarSystemUI/res/values-ca/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"Convidat"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"Convidat"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"Afegeix un usuari"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"Usuari nou"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"Quan s\'afegeix un usuari nou, aquest usuari ha de configurar el seu espai."</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"Qualsevol usuari pot actualitzar les aplicacions de la resta d\'usuaris."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-cs/strings.xml b/packages/CarSystemUI/res/values-cs/strings.xml
new file mode 100644
index 0000000..d2fdf36
--- /dev/null
+++ b/packages/CarSystemUI/res/values-cs/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"Min"</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"Max"</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"Rozpoznávání hlasu teď provádí připojené zařízení Bluetooth"</string>
+    <string name="car_guest" msgid="318393171202663722">"Host"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"Host"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"Přidat uživatele"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"Nový uživatel"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Každý nově přidaný uživatel si musí nastavit vlastní prostor."</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"Každý uživatel může aktualizovat aplikace všech ostatních uživatelů."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-cs/strings_car.xml b/packages/CarSystemUI/res/values-cs/strings_car.xml
new file mode 100644
index 0000000..1043950
--- /dev/null
+++ b/packages/CarSystemUI/res/values-cs/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"Host"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"Host"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"Přidat uživatele"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"Nový uživatel"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"Každý nově přidaný uživatel si musí nastavit vlastní prostor."</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"Každý uživatel může aktualizovat aplikace všech ostatních uživatelů."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-da/strings.xml b/packages/CarSystemUI/res/values-da/strings.xml
new file mode 100644
index 0000000..90bd0ac
--- /dev/null
+++ b/packages/CarSystemUI/res/values-da/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"Min."</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"Maks."</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"Talegenkendelse sker nu med den forbundne Blutetooth-enhed"</string>
+    <string name="car_guest" msgid="318393171202663722">"Gæst"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"Gæst"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"Tilføj bruger"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"Ny bruger"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Når du tilføjer en ny bruger, skal vedkommende konfigurere sit område."</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"Alle brugere kan opdatere apps for alle andre brugere."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-da/strings_car.xml b/packages/CarSystemUI/res/values-da/strings_car.xml
new file mode 100644
index 0000000..7a63ec1
--- /dev/null
+++ b/packages/CarSystemUI/res/values-da/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"Gæst"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"Gæst"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"Tilføj bruger"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"Ny bruger"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"Når du tilføjer en ny bruger, skal vedkommende konfigurere sit område."</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"Alle brugere kan opdatere apps for alle andre brugere."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-de/strings.xml b/packages/CarSystemUI/res/values-de/strings.xml
new file mode 100644
index 0000000..e5695f7
--- /dev/null
+++ b/packages/CarSystemUI/res/values-de/strings.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"Min."</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"Max."</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"Spracherkennung jetzt über das verbundene Bluetooth-Gerät"</string>
+    <!-- no translation found for car_guest (318393171202663722) -->
+    <skip />
+    <!-- no translation found for start_guest_session (497784785761754874) -->
+    <skip />
+    <!-- no translation found for car_add_user (4067337059622483269) -->
+    <skip />
+    <!-- no translation found for car_new_user (6637442369728092473) -->
+    <skip />
+    <!-- no translation found for user_add_user_message_setup (1035578846007352323) -->
+    <skip />
+    <!-- no translation found for user_add_user_message_update (7061671307004867811) -->
+    <skip />
+</resources>
diff --git a/packages/CarSystemUI/res/values-de/strings_car.xml b/packages/CarSystemUI/res/values-de/strings_car.xml
new file mode 100644
index 0000000..c1acc65
--- /dev/null
+++ b/packages/CarSystemUI/res/values-de/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"Gast"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"Gast"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"Nutzer hinzufügen"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"Neuer Nutzer"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"Wenn du einen neuen Nutzer hinzufügst, muss dieser seinen Bereich einrichten."</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"Jeder Nutzer kann Apps für alle anderen Nutzer aktualisieren."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-el/strings.xml b/packages/CarSystemUI/res/values-el/strings.xml
new file mode 100644
index 0000000..fcbb0fd
--- /dev/null
+++ b/packages/CarSystemUI/res/values-el/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"Ελάχ."</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"Μεγ."</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"Φωνητική αναγνωση από συνδεδεμένη συσκευή Bluetooth"</string>
+    <string name="car_guest" msgid="318393171202663722">"Επισκέπτης"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"Επισκέπτης"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"Προσθήκη χρήστη"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"Νέος χρήστης"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Κατά την προσθήκη ενός νέου χρήστη, αυτός θα πρέπει να ρυθμίσει τον χώρο του."</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"Οποιοσδήποτε χρήστης μπορεί να ενημερώσει τις εφαρμογές για όλους τους άλλους χρήστες."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-el/strings_car.xml b/packages/CarSystemUI/res/values-el/strings_car.xml
new file mode 100644
index 0000000..48c5c3e
--- /dev/null
+++ b/packages/CarSystemUI/res/values-el/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"Επισκέπτης"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"Επισκέπτης"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"Προσθήκη χρήστη"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"Νέος χρήστης"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"Κατά την προσθήκη ενός νέου χρήστη, αυτός θα πρέπει να ρυθμίσει τον χώρο του."</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"Οποιοσδήποτε χρήστης μπορεί να ενημερώσει τις εφαρμογές για όλους τους άλλους χρήστες."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-en-rAU/strings.xml b/packages/CarSystemUI/res/values-en-rAU/strings.xml
new file mode 100644
index 0000000..a87eb87
--- /dev/null
+++ b/packages/CarSystemUI/res/values-en-rAU/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"Min"</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"Max"</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"Voice recognition now handled by connected Bluetooth device"</string>
+    <string name="car_guest" msgid="318393171202663722">"Guest"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"Guest"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"Add user"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"New user"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"When you add a new user, that person needs to set up their space."</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"Any user can update apps for all other users."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-en-rAU/strings_car.xml b/packages/CarSystemUI/res/values-en-rAU/strings_car.xml
new file mode 100644
index 0000000..55dc48c
--- /dev/null
+++ b/packages/CarSystemUI/res/values-en-rAU/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"Guest"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"Guest"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"Add user"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"New user"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"When you add a new user, that person needs to set up their space."</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"Any user can update apps for all other users."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-en-rCA/strings.xml b/packages/CarSystemUI/res/values-en-rCA/strings.xml
new file mode 100644
index 0000000..a87eb87
--- /dev/null
+++ b/packages/CarSystemUI/res/values-en-rCA/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"Min"</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"Max"</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"Voice recognition now handled by connected Bluetooth device"</string>
+    <string name="car_guest" msgid="318393171202663722">"Guest"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"Guest"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"Add user"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"New user"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"When you add a new user, that person needs to set up their space."</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"Any user can update apps for all other users."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-en-rCA/strings_car.xml b/packages/CarSystemUI/res/values-en-rCA/strings_car.xml
new file mode 100644
index 0000000..55dc48c
--- /dev/null
+++ b/packages/CarSystemUI/res/values-en-rCA/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"Guest"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"Guest"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"Add user"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"New user"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"When you add a new user, that person needs to set up their space."</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"Any user can update apps for all other users."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-en-rGB/strings.xml b/packages/CarSystemUI/res/values-en-rGB/strings.xml
new file mode 100644
index 0000000..a87eb87
--- /dev/null
+++ b/packages/CarSystemUI/res/values-en-rGB/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"Min"</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"Max"</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"Voice recognition now handled by connected Bluetooth device"</string>
+    <string name="car_guest" msgid="318393171202663722">"Guest"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"Guest"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"Add user"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"New user"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"When you add a new user, that person needs to set up their space."</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"Any user can update apps for all other users."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-en-rGB/strings_car.xml b/packages/CarSystemUI/res/values-en-rGB/strings_car.xml
new file mode 100644
index 0000000..55dc48c
--- /dev/null
+++ b/packages/CarSystemUI/res/values-en-rGB/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"Guest"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"Guest"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"Add user"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"New user"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"When you add a new user, that person needs to set up their space."</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"Any user can update apps for all other users."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-en-rIN/strings.xml b/packages/CarSystemUI/res/values-en-rIN/strings.xml
new file mode 100644
index 0000000..a87eb87
--- /dev/null
+++ b/packages/CarSystemUI/res/values-en-rIN/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"Min"</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"Max"</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"Voice recognition now handled by connected Bluetooth device"</string>
+    <string name="car_guest" msgid="318393171202663722">"Guest"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"Guest"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"Add user"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"New user"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"When you add a new user, that person needs to set up their space."</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"Any user can update apps for all other users."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-en-rIN/strings_car.xml b/packages/CarSystemUI/res/values-en-rIN/strings_car.xml
new file mode 100644
index 0000000..55dc48c
--- /dev/null
+++ b/packages/CarSystemUI/res/values-en-rIN/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"Guest"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"Guest"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"Add user"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"New user"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"When you add a new user, that person needs to set up their space."</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"Any user can update apps for all other users."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-en-rXC/strings.xml b/packages/CarSystemUI/res/values-en-rXC/strings.xml
new file mode 100644
index 0000000..6821c3e
--- /dev/null
+++ b/packages/CarSystemUI/res/values-en-rXC/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‎‏‎‏‎‏‏‏‎‏‏‏‎‏‎‎‏‎‏‏‏‎‎‏‎‏‏‏‎‎‎‎‏‎‏‏‎‏‏‎‏‏‏‏‎‏‏‏‎‎‏‎‎‎‎‎‎Min‎‏‎‎‏‎"</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‏‎‎‏‎‏‏‏‎‏‏‎‏‎‏‎‏‏‏‏‎‏‎‏‎‏‏‎‏‏‏‎‏‎‏‎‏‎‎‎‏‏‏‏‏‎‎‎‎‎‏‎‏‏‏‎‏‏‏‏‏‎Max‎‏‎‎‏‎"</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‏‏‎‎‎‏‏‎‏‎‏‏‏‎‏‏‏‎‏‏‎‎‎‏‏‎‏‎‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‏‎‏‎‎Voice recognition now handled by connected Bluetooth device‎‏‎‎‏‎"</string>
+    <string name="car_guest" msgid="318393171202663722">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‏‏‎‎‎‏‏‎‏‎‏‏‎‎‏‎‏‎‎‎‏‏‏‎‎‏‏‎‏‏‏‏‏‏‎‎‎‏‏‏‎‎‎‏‏‏‏‎‎‏‎‏‎‎‏‎‏‎‏‎‎Guest‎‏‎‎‏‎"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‏‏‏‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‎‎‎‎‎‎‎‎‏‎‎‎‏‏‏‏‎‏‏‎‎‎‏‎‏‏‏‏‎‏‏‏‏‏‎‏‎‎Guest‎‏‎‎‏‎"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‏‏‎‎‎‎‏‏‏‎‎‏‎‎‎‎‏‎‏‎‏‏‎‎‎‎‎‎‏‏‎‎‎‏‏‎‎‏‎‎‏‎‏‎‎‎‏‏‏‎‏‎‏‎‏‎‎‎‏‎‏‎Add User‎‏‎‎‏‎"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‏‏‎‎‎‎‎‏‏‏‎‎‏‏‏‎‏‏‏‎‏‎‏‎‏‎‏‏‎‎‏‎‏‎‎‎‏‏‎‎‎‏‎‏‎‎‎‏‏‎‎‏‎‎‏‏‏‎‎‏‎New User‎‏‎‎‏‎"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‎‎‏‎‏‏‏‏‏‎‎‎‏‏‏‎‏‎‏‏‏‏‎‎‏‎‏‎‎‎‏‎‏‎‎‏‎‏‏‎‏‎‏‎‏‏‏‎‎‎‎‎‎‎‎‏‏‎When you add a new user, that person needs to set up their space.‎‏‎‎‏‎"</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‎‎‎‎‎‎‎‎‎‎‎‎‏‏‎‎‎‏‎‏‎‎‎‏‏‏‎‏‎‏‏‏‎‏‎‎‏‎‏‏‏‏‏‏‏‎‏‎‎‏‏‏‎‎‎‏‏‎Any user can update apps for all other users.‎‏‎‎‏‎"</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-en-rXC/strings_car.xml b/packages/CarSystemUI/res/values-en-rXC/strings_car.xml
new file mode 100644
index 0000000..17ad62c
--- /dev/null
+++ b/packages/CarSystemUI/res/values-en-rXC/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‏‎‎‏‏‏‏‎‏‎‏‏‏‏‏‎‎‎‎‏‎‎‎‏‏‏‎‎‏‏‎‏‏‎‏‎‏‎‏‎‏‏‏‏‏‎‏‏‏‏‎‎‏‎‎‎‎Guest‎‏‎‎‏‎"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‏‏‏‏‏‎‎‏‏‏‏‎‎‎‎‎‎‎‏‏‎‎‏‏‏‏‏‎‎‎‎‏‏‎‏‏‎‎‏‎‎‏‎‏‎‏‏‎‎‏‎‎‏‏‎‏‏‏‎‎‎Guest‎‏‎‎‏‎"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‎‎‎‎‏‎‎‎‏‎‎‎‎‎‎‏‎‏‏‎‎‏‏‎‏‎‏‎‎‏‎‎‎‎‎‏‏‏‎‎‎‎‎‏‏‏‏‎‏‏‏‏‏‎Add User‎‏‎‎‏‎"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‎‏‏‎‎‏‎‎‎‎‎‏‎‎‎‎‎‏‎‏‏‏‎‏‎‏‎‏‏‎‎‏‎‎‏‏‏‎‎‏‎‏‎‏‎‎‏‏‏‎‏‏‎‎‎‏‎‎‎New User‎‏‎‎‏‎"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‎‎‏‏‏‏‎‎‎‏‎‎‏‎‏‎‎‏‎‏‎‏‏‏‎‎‎‏‏‏‏‏‎‎‏‎‎‎‏‎‏‎‏‏‎‏‎‎‎‏‎‏‏‏‎‎When you add a new user, that person needs to set up their space.‎‏‎‎‏‎"</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‏‏‏‏‎‏‏‏‎‏‏‏‎‏‎‏‏‎‏‎‎‏‏‏‎‎‎‏‎‏‏‏‎‎‏‏‏‏‏‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‎‏‏‎‏‏‎Any user can update apps for all other users.‎‏‎‎‏‎"</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-es-rUS/strings.xml b/packages/CarSystemUI/res/values-es-rUS/strings.xml
new file mode 100644
index 0000000..060c812
--- /dev/null
+++ b/packages/CarSystemUI/res/values-es-rUS/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"Mín."</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"Máx."</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"El dispositivo Bluetooth administra el reconocimiento de voz"</string>
+    <string name="car_guest" msgid="318393171202663722">"Invitado"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"Invitado"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"Agregar usuario"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"Usuario nuevo"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Cuando agregues un usuario nuevo, esa persona deberá configurar su espacio."</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"Cualquier usuario podrá actualizar las apps de otras personas."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-es-rUS/strings_car.xml b/packages/CarSystemUI/res/values-es-rUS/strings_car.xml
new file mode 100644
index 0000000..cc31ae4
--- /dev/null
+++ b/packages/CarSystemUI/res/values-es-rUS/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"Invitado"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"Invitado"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"Agregar usuario"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"Usuario nuevo"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"Cuando agregues un usuario nuevo, esa persona deberá configurar su espacio."</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"Cualquier usuario podrá actualizar las apps de otras personas."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-es/strings.xml b/packages/CarSystemUI/res/values-es/strings.xml
new file mode 100644
index 0000000..c3cc86a
--- /dev/null
+++ b/packages/CarSystemUI/res/values-es/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"Mín."</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"Máx."</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"El dispositivo Bluetooth gestiona el reconocimiento de voz"</string>
+    <string name="car_guest" msgid="318393171202663722">"Invitado"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"Invitado"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"Añadir usuario"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"Nuevo usuario"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Cuando añades un usuario, esa persona debe configurar su espacio."</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"Cualquier usuario puede actualizar las aplicaciones del resto de los usuarios."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-es/strings_car.xml b/packages/CarSystemUI/res/values-es/strings_car.xml
new file mode 100644
index 0000000..26ce2f1
--- /dev/null
+++ b/packages/CarSystemUI/res/values-es/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"Invitado"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"Invitado"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"Añadir usuario"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"Nuevo usuario"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"Al añadir un usuario, esta persona debe configurar su espacio."</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"Cualquier usuario puede actualizar las aplicaciones del resto de los usuarios."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-et/strings.xml b/packages/CarSystemUI/res/values-et/strings.xml
new file mode 100644
index 0000000..1bf7ce5
--- /dev/null
+++ b/packages/CarSystemUI/res/values-et/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"Min"</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"Max"</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"Häältuvastust haldab nüüd ühendatud Bluetoothi seade"</string>
+    <string name="car_guest" msgid="318393171202663722">"Külaline"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"Külaline"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"Lisa kasutaja"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"Uus kasutaja"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Kui lisate uue kasutaja, siis peab ta seadistama oma ruumi."</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"Iga kasutaja saab rakendusi värskendada kõigi teiste kasutajate jaoks."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-et/strings_car.xml b/packages/CarSystemUI/res/values-et/strings_car.xml
new file mode 100644
index 0000000..ce475b1
--- /dev/null
+++ b/packages/CarSystemUI/res/values-et/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"Külaline"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"Külaline"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"Lisa kasutaja"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"Uus kasutaja"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"Kui lisate uue kasutaja, siis peab ta seadistama oma ruumi."</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"Iga kasutaja saab rakendusi värskendada kõigi teiste kasutajate jaoks."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-eu/strings.xml b/packages/CarSystemUI/res/values-eu/strings.xml
new file mode 100644
index 0000000..1786381
--- /dev/null
+++ b/packages/CarSystemUI/res/values-eu/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"Min."</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"Max."</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"Konektatutako Bluetooth bidezko gailuak kudeatzen du ahotsa ezagutzeko eginbidea"</string>
+    <string name="car_guest" msgid="318393171202663722">"Gonbidatua"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"Gonbidatua"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"Gehitu erabiltzaile bat"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"Erabiltzaile berria"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Erabiltzaile bat gehitzen duzunean, bere eremua konfiguratu beharko du."</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"Edozein erabiltzailek egunera ditzake beste erabiltzaile guztien aplikazioak."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-eu/strings_car.xml b/packages/CarSystemUI/res/values-eu/strings_car.xml
new file mode 100644
index 0000000..be7c6dc
--- /dev/null
+++ b/packages/CarSystemUI/res/values-eu/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"Gonbidatua"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"Gonbidatua"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"Gehitu erabiltzaile bat"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"Erabiltzaile berria"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"Erabiltzaile bat gehitzen duzunean, bere eremua konfiguratu beharko du."</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"Edozein erabiltzailek egunera ditzake beste erabiltzaile guztien aplikazioak."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-fa/strings.xml b/packages/CarSystemUI/res/values-fa/strings.xml
new file mode 100644
index 0000000..0bd79ba
--- /dev/null
+++ b/packages/CarSystemUI/res/values-fa/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"حداقل"</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"حداکثر"</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"اکنون تشخیص صدا را دستگاه بلوتوث متصل کنترل می‌کند"</string>
+    <string name="car_guest" msgid="318393171202663722">"مهمان"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"مهمان"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"افزودن کاربر"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"کاربر جدید"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"وقتی کاربر جدیدی اضافه می‌کنید، آن فرد باید فضای خود را تنظیم کند."</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"هر کاربری می‌تواند برنامه‌ها را برای همه کاربران دیگر به‌روزرسانی کند."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-fa/strings_car.xml b/packages/CarSystemUI/res/values-fa/strings_car.xml
new file mode 100644
index 0000000..5138d5f
--- /dev/null
+++ b/packages/CarSystemUI/res/values-fa/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"مهمان"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"مهمان"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"افزودن کاربر"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"کاربر جدید"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"وقتی کاربری جدید اضافه می‌کنید، آن فرد باید فضای خود را تنظیم کند."</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"هر کاربری می‌تواند برنامه‌ها را برای همه کاربران دیگر به‌روزرسانی کند."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-fi/strings.xml b/packages/CarSystemUI/res/values-fi/strings.xml
new file mode 100644
index 0000000..7aa5a54
--- /dev/null
+++ b/packages/CarSystemUI/res/values-fi/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"Alin"</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"Ylin"</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"Äänentunnistus tehdään nyt yhdistetyllä Bluetooth-laitteella"</string>
+    <string name="car_guest" msgid="318393171202663722">"Vieras"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"Vieras"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"Lisää käyttäjä"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"Uusi käyttäjä"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Kun lisäät uuden käyttäjän, hänen on valittava oman tilansa asetukset."</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"Kaikki käyttäjät voivat päivittää muiden käyttäjien sovelluksia."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-fi/strings_car.xml b/packages/CarSystemUI/res/values-fi/strings_car.xml
new file mode 100644
index 0000000..5963b52
--- /dev/null
+++ b/packages/CarSystemUI/res/values-fi/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"Vieras"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"Vieras"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"Lisää käyttäjä"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"Uusi käyttäjä"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"Kun lisäät uuden käyttäjän, hänen on valittava oman tilansa asetukset."</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"Kaikki käyttäjät voivat päivittää muiden käyttäjien sovelluksia."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-fr-rCA/strings.xml b/packages/CarSystemUI/res/values-fr-rCA/strings.xml
new file mode 100644
index 0000000..22b4409
--- /dev/null
+++ b/packages/CarSystemUI/res/values-fr-rCA/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"Min"</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"Max"</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"La reconn. voc. est gérée par l\'appareil Bluetooth connecté"</string>
+    <string name="car_guest" msgid="318393171202663722">"Invité"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"Invité"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"Ajouter un utilisateur"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"Nouvel utilisateur"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Lorsque vous ajoutez un utilisateur, celui-ci doit configurer son espace."</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"Tout utilisateur peut mettre à jour les applications pour tous les autres utilisateurs."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-fr-rCA/strings_car.xml b/packages/CarSystemUI/res/values-fr-rCA/strings_car.xml
new file mode 100644
index 0000000..ab0a302
--- /dev/null
+++ b/packages/CarSystemUI/res/values-fr-rCA/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"Invité"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"Invité"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"Ajouter un utilisateur"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"Nouvel utilisateur"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"Lorsque vous ajoutez un utilisateur, celui-ci doit configurer son espace."</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"Tout utilisateur peut mettre à jour les applications pour tous les autres utilisateurs."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-fr/strings.xml b/packages/CarSystemUI/res/values-fr/strings.xml
new file mode 100644
index 0000000..b28c620
--- /dev/null
+++ b/packages/CarSystemUI/res/values-fr/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"Min"</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"Max"</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"L\'appareil Bluetooth connecté gère la reconnaissance vocale"</string>
+    <string name="car_guest" msgid="318393171202663722">"Invité"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"Invité"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"Ajouter un utilisateur"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"Nouvel utilisateur"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Lorsque vous ajoutez un utilisateur, celui-ci doit configurer son espace."</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"N\'importe quel utilisateur peut mettre à jour les applications pour tous les autres utilisateurs."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-fr/strings_car.xml b/packages/CarSystemUI/res/values-fr/strings_car.xml
new file mode 100644
index 0000000..b072ecc
--- /dev/null
+++ b/packages/CarSystemUI/res/values-fr/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"Invité"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"Invité"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"Ajouter un utilisateur"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"Nouvel utilisateur"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"Lorsque vous ajoutez un utilisateur, celui-ci doit configurer son espace."</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"N\'importe quel utilisateur peut mettre à jour les applications pour tous les autres utilisateurs."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-gl/strings.xml b/packages/CarSystemUI/res/values-gl/strings.xml
new file mode 100644
index 0000000..d2178ab
--- /dev/null
+++ b/packages/CarSystemUI/res/values-gl/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"Mín."</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"Máx."</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"O dispositivo Bluetooth xestionará o recoñecemento de voz"</string>
+    <string name="car_guest" msgid="318393171202663722">"Convidado"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"Convidado"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"Engadir usuario"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"Novo usuario"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Cando engadas un novo usuario, este deberá configurar o seu espazo."</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"Calquera usuario pode actualizar as aplicacións para o resto dos usuarios."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-gl/strings_car.xml b/packages/CarSystemUI/res/values-gl/strings_car.xml
new file mode 100644
index 0000000..fc4af28
--- /dev/null
+++ b/packages/CarSystemUI/res/values-gl/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"Convidado"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"Convidado"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"Engadir usuario"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"Novo usuario"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"Cando engadas un usuario novo, este deberá configurar o seu espazo."</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"Calquera usuario pode actualizar as aplicacións para o resto dos usuarios."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-gu/strings.xml b/packages/CarSystemUI/res/values-gu/strings.xml
new file mode 100644
index 0000000..151fbde
--- /dev/null
+++ b/packages/CarSystemUI/res/values-gu/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"ન્યૂનતમ"</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"મહત્તમ"</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"અવાજની ઓળખ હવે કનેક્ટેડ બ્લૂટૂથ ડિવાઇસ વડે નિયંત્રિત થશે"</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-gu/strings_car.xml b/packages/CarSystemUI/res/values-gu/strings_car.xml
new file mode 100644
index 0000000..48a9daca
--- /dev/null
+++ b/packages/CarSystemUI/res/values-gu/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"અતિથિ"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"અતિથિ"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"વપરાશકર્તા ઉમેરો"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"નવા વપરાશકર્તા"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"જ્યારે તમે કોઈ નવા વપરાશકર્તાને ઉમેરો છો, ત્યારે તે વ્યક્તિએ તેમની સ્પેસ સેટ કરવાની જરૂર રહે છે."</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"કોઈપણ વપરાશકર્તા અન્ય બધા વપરાશકર્તાઓ માટે ઍપને અપડેટ કરી શકે છે."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-hi/strings.xml b/packages/CarSystemUI/res/values-hi/strings.xml
new file mode 100644
index 0000000..3913f27
--- /dev/null
+++ b/packages/CarSystemUI/res/values-hi/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"कम से कम"</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"ज़्यादा से ज़्यादा"</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"अब आवाज़ पहचानने का काम, कनेक्ट किए गए ब्लूटूथ डिवाइस करते हैं"</string>
+    <string name="car_guest" msgid="318393171202663722">"मेहमान प्रोफ़ाइल"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"मेहमान सेशन शुरू करें"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"उपयोगकर्ता जोड़ें"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"नया उपयोगकर्ता"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"जब आप कोई नया उपयोगकर्ता जोड़ते हैं, तब उसे अपनी जगह सेट करनी होती है."</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"कोई भी उपयोगकर्ता, बाकी सभी उपयोगकर्ताओं के लिए ऐप्लिकेशन अपडेट कर सकता है."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-hi/strings_car.xml b/packages/CarSystemUI/res/values-hi/strings_car.xml
new file mode 100644
index 0000000..ec83e95
--- /dev/null
+++ b/packages/CarSystemUI/res/values-hi/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"मेहमान"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"मेहमान"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"उपयोगकर्ता जोड़ें"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"नया उपयोगकर्ता"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"जब आप कोई नया उपयोगकर्ता जोड़ते हैं, तब उसे अपनी जगह सेट करनी होती है."</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"कोई भी उपयोगकर्ता बाकी सभी उपयोगकर्ताओं के लिए ऐप्लिकेशन अपडेट कर सकता है."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-hr/strings.xml b/packages/CarSystemUI/res/values-hr/strings.xml
new file mode 100644
index 0000000..befdbe9
--- /dev/null
+++ b/packages/CarSystemUI/res/values-hr/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"Min."</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"Maks."</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"Prepoznavanjem glasa rukuje se s povezanog Bluetooth uređaja"</string>
+    <string name="car_guest" msgid="318393171202663722">"Gost"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"Gost"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"Dodajte korisnika"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"Novi korisnik"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Kada dodate novog korisnika, ta osoba mora postaviti vlastiti prostor."</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"Svaki korisnik može ažurirati aplikacije za ostale korisnike."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-hr/strings_car.xml b/packages/CarSystemUI/res/values-hr/strings_car.xml
new file mode 100644
index 0000000..d707145
--- /dev/null
+++ b/packages/CarSystemUI/res/values-hr/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"Gost"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"Gost"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"Dodajte korisnika"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"Novi korisnik"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"Kada dodate novog korisnika, ta osoba mora postaviti vlastiti prostor."</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"Svaki korisnik može ažurirati aplikacije za ostale korisnike."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-hu/strings.xml b/packages/CarSystemUI/res/values-hu/strings.xml
new file mode 100644
index 0000000..bd1e6dc
--- /dev/null
+++ b/packages/CarSystemUI/res/values-hu/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"Min."</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"Max."</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"A hangfelismerést a csatlakoztatott Bluetooth-eszköz kezeli"</string>
+    <string name="car_guest" msgid="318393171202663722">"Vendég"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"Vendég"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"Felhasználó hozzáadása"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"Új felhasználó"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Ha új felhasználót ad hozzá, az illetőnek be kell állítania saját felületét."</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"Bármely felhasználó frissítheti az alkalmazásokat az összes felhasználó számára."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-hu/strings_car.xml b/packages/CarSystemUI/res/values-hu/strings_car.xml
new file mode 100644
index 0000000..4f11ec2
--- /dev/null
+++ b/packages/CarSystemUI/res/values-hu/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"Vendég"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"Vendég"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"Felhasználó hozzáadása"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"Új felhasználó"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"Ha új felhasználót ad hozzá, az illetőnek be kell állítania saját felületét."</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"Bármely felhasználó frissítheti az alkalmazásokat az összes felhasználó számára."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-hy/strings.xml b/packages/CarSystemUI/res/values-hy/strings.xml
new file mode 100644
index 0000000..048d44a
--- /dev/null
+++ b/packages/CarSystemUI/res/values-hy/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"Նվազ․"</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"Առավ․"</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"Ձայնի ճանաչումը մշակվում է միացված Bluetooth սարքի կողմից"</string>
+    <string name="car_guest" msgid="318393171202663722">"Հյուր"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"Հյուրի ռեժիմ"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"Ավելացնել օգտատեր"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"Նոր օգտատեր"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Երբ դուք նոր օգտատեր եք ավելացնում, նա պետք է կարգավորի իր պրոֆիլը։"</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"Ցանկացած օգտատեր կարող է թարմացնել հավելվածները բոլոր մյուս հաշիվների համար։"</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-hy/strings_car.xml b/packages/CarSystemUI/res/values-hy/strings_car.xml
new file mode 100644
index 0000000..5559999
--- /dev/null
+++ b/packages/CarSystemUI/res/values-hy/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"Հյուր"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"Հյուրի ռեժիմ"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"Ավելացնել օգտատեր"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"Նոր օգտատեր"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"Երբ դուք նոր օգտատեր եք ավելացնում, նա պետք է կարգավորի իր պրոֆիլը։"</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"Ցանկացած օգտատեր կարող է թարմացնել հավելվածները բոլոր մյուս հաշիվների համար։"</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-in/strings.xml b/packages/CarSystemUI/res/values-in/strings.xml
new file mode 100644
index 0000000..d6d7cfb
--- /dev/null
+++ b/packages/CarSystemUI/res/values-in/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"Min"</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"Maks"</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"Pengenalan suara ditangani perangkat Bluetooth terhubung"</string>
+    <string name="car_guest" msgid="318393171202663722">"Tamu"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"Tamu"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"Tambahkan Pengguna"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"Pengguna Baru"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Saat Anda menambahkan pengguna baru, orang tersebut perlu menyiapkan ruangnya sendiri."</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"Setiap pengguna dapat mengupdate aplikasi untuk semua pengguna lain."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-in/strings_car.xml b/packages/CarSystemUI/res/values-in/strings_car.xml
new file mode 100644
index 0000000..69f23ce
--- /dev/null
+++ b/packages/CarSystemUI/res/values-in/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"Tamu"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"Tamu"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"Tambahkan Pengguna"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"Pengguna Baru"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"Saat Anda menambahkan pengguna baru, orang tersebut perlu menyiapkan ruangnya sendiri."</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"Setiap pengguna dapat mengupdate aplikasi untuk semua pengguna lain."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-is/strings.xml b/packages/CarSystemUI/res/values-is/strings.xml
new file mode 100644
index 0000000..2b205b8
--- /dev/null
+++ b/packages/CarSystemUI/res/values-is/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"Lágm."</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"Hám."</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"Raddgreiningu er nú stjórnað af tengdu Bluetooth-tæki"</string>
+    <string name="car_guest" msgid="318393171202663722">"Gestur"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"Gestur"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"Bæta notanda við"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"Nýr notandi"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Þegar þú bætir nýjum notanda við þarf viðkomandi að setja upp sitt eigið svæði."</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"Allir notendur geta uppfært forrit fyrir alla aðra notendur."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-is/strings_car.xml b/packages/CarSystemUI/res/values-is/strings_car.xml
new file mode 100644
index 0000000..430e902
--- /dev/null
+++ b/packages/CarSystemUI/res/values-is/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"Gestur"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"Gestur"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"Bæta notanda við"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"Nýr notandi"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"Þegar þú bætir nýjum notanda við þarf viðkomandi að setja upp sitt eigið svæði."</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"Allir notendur geta uppfært forrit fyrir alla aðra notendur."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-it/strings.xml b/packages/CarSystemUI/res/values-it/strings.xml
new file mode 100644
index 0000000..707f2f4
--- /dev/null
+++ b/packages/CarSystemUI/res/values-it/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"Min"</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"Max"</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"Riconoscimento vocale gestito da dispos. Bluetooth connesso"</string>
+    <string name="car_guest" msgid="318393171202663722">"Ospite"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"Ospite"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"Aggiungi utente"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"Nuovo utente"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Il nuovo utente, una volta aggiunto, dovrà configurare il suo spazio."</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"Qualsiasi utente può aggiornare le app per tutti gli altri."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-it/strings_car.xml b/packages/CarSystemUI/res/values-it/strings_car.xml
new file mode 100644
index 0000000..9c498df
--- /dev/null
+++ b/packages/CarSystemUI/res/values-it/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"Ospite"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"Ospite"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"Aggiungi utente"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"Nuovo utente"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"Il nuovo utente, una volta aggiunto, dovrà configurare il suo spazio."</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"Qualsiasi utente può aggiornare le app per tutti gli altri."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-iw/strings.xml b/packages/CarSystemUI/res/values-iw/strings.xml
new file mode 100644
index 0000000..93f2401
--- /dev/null
+++ b/packages/CarSystemUI/res/values-iw/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"מינ\'"</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"מקס\'"</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"הזיהוי הקולי מתבצע עכשיו במכשיר Bluetooth מחובר"</string>
+    <string name="car_guest" msgid="318393171202663722">"אורח"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"אורח"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"הוספת משתמש"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"משתמש חדש"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"בעת הוספת משתמש חדש, על משתמש זה להגדיר את המרחב שלו."</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"כל משתמש יכול לעדכן אפליקציות לכל שאר המשתמשים."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-ja/strings.xml b/packages/CarSystemUI/res/values-ja/strings.xml
new file mode 100644
index 0000000..85bd0bf
--- /dev/null
+++ b/packages/CarSystemUI/res/values-ja/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"最小"</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"最大"</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"Bluetooth 接続デバイスで音声認識が処理されるようになりました"</string>
+    <string name="car_guest" msgid="318393171202663722">"ゲスト"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"ゲスト"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"ユーザーを追加"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"新しいユーザー"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"新しいユーザーを追加したら、そのユーザーは自分のスペースをセットアップする必要があります。"</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"どのユーザーも他のすべてのユーザーに代わってアプリを更新できます。"</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-ja/strings_car.xml b/packages/CarSystemUI/res/values-ja/strings_car.xml
new file mode 100644
index 0000000..d59b267
--- /dev/null
+++ b/packages/CarSystemUI/res/values-ja/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"ゲスト"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"ゲスト"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"ユーザーを追加"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"新しいユーザー"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"新しいユーザーを追加したら、そのユーザーは自分のスペースをセットアップする必要があります。"</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"どのユーザーも他のすべてのユーザーに代わってアプリを更新できます。"</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-ka/strings.xml b/packages/CarSystemUI/res/values-ka/strings.xml
new file mode 100644
index 0000000..0e67f2a
--- /dev/null
+++ b/packages/CarSystemUI/res/values-ka/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"მინ"</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"მაქს"</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"ხმის ამოცნობა დამუშავდება დაკავშირებული Bluetooth-მოწყობილობით"</string>
+    <string name="car_guest" msgid="318393171202663722">"სტუმარი"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"სტუმარი"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"მომხმარებლის დამატება"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"ახალი მომხმარებელი"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"ახალი მომხმარებლის დამატებისას, ამ მომხმარებელს საკუთარი სივრცის გამართვა მოუწევს."</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"ნებისმიერ მომხმარებელს შეუძლია აპები ყველა სხვა მომხმარებლისათვის განაახლოს."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-ka/strings_car.xml b/packages/CarSystemUI/res/values-ka/strings_car.xml
new file mode 100644
index 0000000..cb0e8fd
--- /dev/null
+++ b/packages/CarSystemUI/res/values-ka/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"სტუმარი"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"სტუმარი"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"მომხმარებლის დამატება"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"ახალი მომხმარებელი"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"ახალი მომხმარებლის დამატებისას, ამ მომხმარებელს საკუთარი სივრცის შექმნა მოუწევს."</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"ნებისმიერ მომხმარებელს შეუძლია აპები ყველა სხვა მომხმარებლისათვის განაახლოს."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-kk/strings.xml b/packages/CarSystemUI/res/values-kk/strings.xml
new file mode 100644
index 0000000..94a192e
--- /dev/null
+++ b/packages/CarSystemUI/res/values-kk/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"Мин."</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"Макс."</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"Дауысты тану үшін Bluetooth құрылғысы пайдаланылады."</string>
+    <string name="car_guest" msgid="318393171202663722">"Қонақ"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"Қонақ"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"Пайдаланушыны енгізу"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"Жаңа пайдаланушы"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Енгізілген жаңа пайдаланушы өз профилін реттеуі керек."</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"Кез келген пайдаланушы қолданбаларды басқа пайдаланушылар үшін жаңарта алады."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-km/strings.xml b/packages/CarSystemUI/res/values-km/strings.xml
new file mode 100644
index 0000000..47b659f
--- /dev/null
+++ b/packages/CarSystemUI/res/values-km/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"អប្បបរមា"</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"អតិបរិមា"</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"ឥឡូវនេះ ការសម្គាល់សំឡេងត្រូវបានចាត់ចែងដោយឧបករណ៍ដែលបានភ្ជាប់ប៊្លូធូស"</string>
+    <string name="car_guest" msgid="318393171202663722">"ភ្ញៀវ"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"ភ្ញៀវ"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"បញ្ចូល​អ្នក​ប្រើប្រាស់"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"អ្នក​ប្រើប្រាស់​ថ្មី"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"នៅពេលដែល​អ្នក​បញ្ចូល​អ្នក​ប្រើប្រាស់​ថ្មី បុគ្គល​នោះ​ត្រូវតែ​រៀបចំ​ទំហំ​ផ្ទុក​របស់គេ។"</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"អ្នកប្រើប្រាស់​ណាក៏​អាច​ដំឡើងកំណែ​កម្មវិធី​សម្រាប់​អ្នកប្រើប្រាស់ទាំងអស់​ផ្សេងទៀត​បានដែរ។"</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-km/strings_car.xml b/packages/CarSystemUI/res/values-km/strings_car.xml
new file mode 100644
index 0000000..b6a9864
--- /dev/null
+++ b/packages/CarSystemUI/res/values-km/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"ភ្ញៀវ"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"ភ្ញៀវ"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"បញ្ចូល​អ្នក​ប្រើប្រាស់"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"អ្នក​ប្រើប្រាស់​ថ្មី"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"នៅពេលដែល​អ្នកបញ្ចូល​អ្នក​ប្រើប្រាស់ថ្មី បុគ្គល​នោះ​ត្រូវរៀបចំ​ទំហំផ្ទុក​របស់គេ។"</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"អ្នកប្រើប្រាស់​ណាក៏​អាច​ដំឡើងកំណែ​កម្មវិធី​សម្រាប់​អ្នកប្រើប្រាស់ទាំងអស់​ផ្សេងទៀត​បានដែរ។"</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-kn/strings.xml b/packages/CarSystemUI/res/values-kn/strings.xml
new file mode 100644
index 0000000..50e1721
--- /dev/null
+++ b/packages/CarSystemUI/res/values-kn/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"ಕನಿಷ್ಠ"</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"ಗರಿಷ್ಠ"</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"ಇದೀಗ ಕನೆಕ್ಟ್ ಆದ ಬ್ಲೂಟೂತ್ ಸಾಧನ ಧ್ವನಿ ಗುರುತಿಸುವಿಕೆ ನಿರ್ವಹಿಸಿದೆ"</string>
+    <string name="car_guest" msgid="318393171202663722">"ಅತಿಥಿ"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"ಅತಿಥಿ"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"ಬಳಕೆದಾರರನ್ನು ಸೇರಿಸಿ"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"ಹೊಸ ಬಳಕೆದಾರ"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"ನೀವು ಹೊಸ ಬಳಕೆದಾರರನ್ನು ಸೇರಿಸಿದಾಗ, ಆ ವ್ಯಕ್ತಿಯು ಅವರ ಸ್ಥಳವನ್ನು ಸೆಟಪ್ ಮಾಡಬೇಕಾಗುತ್ತದೆ."</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"ಯಾವುದೇ ಬಳಕೆದಾರರು ಎಲ್ಲಾ ಇತರೆ ಬಳಕೆದಾರರಿಗಾಗಿ ಆ್ಯಪ್‌ಗಳನ್ನು ಅಪ್‌ಡೇಟ್‌ ಮಾಡಬಹುದು."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-kn/strings_car.xml b/packages/CarSystemUI/res/values-kn/strings_car.xml
new file mode 100644
index 0000000..23e5415
--- /dev/null
+++ b/packages/CarSystemUI/res/values-kn/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"ಅತಿಥಿ"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"ಅತಿಥಿ"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"ಬಳಕೆದಾರರನ್ನು ಸೇರಿಸಿ"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"ಹೊಸ ಬಳಕೆದಾರ"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"ನೀವು ಹೊಸ ಬಳಕೆದಾರರನ್ನು ಸೇರಿಸಿದಾಗ, ಆ ವ್ಯಕ್ತಿಯು ಅವರ ಸ್ಥಳವನ್ನು ಸೆಟಪ್ ಮಾಡಬೇಕಾಗುತ್ತದೆ."</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"ಯಾವುದೇ ಬಳಕೆದಾರರು ಎಲ್ಲಾ ಇತರೆ ಬಳಕೆದಾರರಿಗಾಗಿ ಆ್ಯಪ್‌ಗಳನ್ನು ಅಪ್‌ಡೇಟ್‌ ಮಾಡಬಹುದು."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-ko/strings.xml b/packages/CarSystemUI/res/values-ko/strings.xml
new file mode 100644
index 0000000..75b16a8
--- /dev/null
+++ b/packages/CarSystemUI/res/values-ko/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"최소"</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"최대"</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"이제 연결된 블루투스 기기에서 음성 인식이 처리됩니다."</string>
+    <string name="car_guest" msgid="318393171202663722">"게스트"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"게스트"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"사용자 추가"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"신규 사용자"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"추가된 신규 사용자는 자신만의 공간을 설정해야 합니다."</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"누구나 다른 모든 사용자를 위해 앱을 업데이트할 수 있습니다."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-ko/strings_car.xml b/packages/CarSystemUI/res/values-ko/strings_car.xml
new file mode 100644
index 0000000..3997c0f
--- /dev/null
+++ b/packages/CarSystemUI/res/values-ko/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"게스트"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"게스트"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"사용자 추가"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"신규 사용자"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"추가된 신규 사용자는 자신만의 공간을 설정해야 합니다."</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"누구나 다른 모든 사용자를 위해 앱을 업데이트할 수 있습니다."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-ky/strings.xml b/packages/CarSystemUI/res/values-ky/strings.xml
new file mode 100644
index 0000000..e9da09d
--- /dev/null
+++ b/packages/CarSystemUI/res/values-ky/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"Мин."</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"Макс."</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"Үндү эми туташкан Bluetooth түзмөгү менен тааныса болот"</string>
+    <string name="car_guest" msgid="318393171202663722">"Конок"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"Конок"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"Колдонуучу кошуу"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"Жаңы колдонуучу"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Жаңы колдонуучу кошулганда, ал өзүнүн профилин жөндөп алышы керек."</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"Колдонмолорду бир колдонуучу калган бардык колдонуучулар үчүн да жаңырта алат."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-lo/strings.xml b/packages/CarSystemUI/res/values-lo/strings.xml
new file mode 100644
index 0000000..1721377
--- /dev/null
+++ b/packages/CarSystemUI/res/values-lo/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"ນທ"</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"ສູງສຸດ"</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"ການຈຳແນກສຽງເວົ້າດຽວນີ້ຈັດການໂດຍອຸປະກອນ Bluetooth ທີ່ເຊື່ອມຕໍ່"</string>
+    <string name="car_guest" msgid="318393171202663722">"ແຂກ"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"ແຂກ"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"ເພີ່ມຜູ້ໃຊ້"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"ຜູ້ໃຊ້ໃໝ່"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"ເມື່ອທ່ານເພີ່ມຜູ້ໃຊ້ໃໝ່, ບຸກຄົນນັ້ນຈຳເປັນຕ້ອງຕັ້ງຄ່າພື້ນທີ່ຂອງເຂົາເຈົ້າ."</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"ຜູ້ໃຊ້ຕ່າງໆສາມາດອັບເດດແອັບສຳລັບຜູ້ໃຊ້ອື່ນທັງໝົດໄດ້."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-lt/strings.xml b/packages/CarSystemUI/res/values-lt/strings.xml
new file mode 100644
index 0000000..d504c12
--- /dev/null
+++ b/packages/CarSystemUI/res/values-lt/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"Min."</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"Didž."</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"Balso atpažinimą dabar tvarko susietas „Bluetooth“ įrenginys"</string>
+    <string name="car_guest" msgid="318393171202663722">"Svečias"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"Svečias"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"Pridėti naudotoją"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"Naujas naudotojas"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Kai pridedate naują naudotoją, šis asmuo turi nustatyti savo vietą."</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"Bet kuris naudotojas gali atnaujinti visų kitų naudotojų programas."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-lt/strings_car.xml b/packages/CarSystemUI/res/values-lt/strings_car.xml
new file mode 100644
index 0000000..a8cf0a7
--- /dev/null
+++ b/packages/CarSystemUI/res/values-lt/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"Svečias"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"Svečias"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"Pridėti naudotoją"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"Naujas naudotojas"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"Kai pridedate naują naudotoją, šis asmuo turi nustatyti savo vietą."</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"Bet kuris naudotojas gali atnaujinti visų kitų naudotojų programas."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-lv/strings.xml b/packages/CarSystemUI/res/values-lv/strings.xml
new file mode 100644
index 0000000..8a0be70
--- /dev/null
+++ b/packages/CarSystemUI/res/values-lv/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"Min."</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"Maks."</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"Balss atpazīšanu tagad nodrošina pievienotā Bluetooth ierīce"</string>
+    <string name="car_guest" msgid="318393171202663722">"Viesis"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"Viesis"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"Pievienot lietotāju"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"Jauns lietotājs"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Kad pievienojat jaunu lietotāju, viņam ir jāizveido savs profils."</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"Ikviens lietotājs var atjaunināt lietotnes visu lietotāju vārdā."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-lv/strings_car.xml b/packages/CarSystemUI/res/values-lv/strings_car.xml
new file mode 100644
index 0000000..3b7f386
--- /dev/null
+++ b/packages/CarSystemUI/res/values-lv/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"Viesis"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"Viesis"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"Pievienot lietotāju"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"Jauns lietotājs"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"Kad pievienojat jaunu lietotāju, viņam ir jāizveido savs profils."</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"Ikviens lietotājs var atjaunināt lietotnes visu lietotāju vārdā."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-mk/strings.xml b/packages/CarSystemUI/res/values-mk/strings.xml
new file mode 100644
index 0000000..63cea06
--- /dev/null
+++ b/packages/CarSystemUI/res/values-mk/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"Мин."</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"Макс."</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"Поврзаниот уред со Bluetooth управува со препознавањето глас"</string>
+    <string name="car_guest" msgid="318393171202663722">"Гостин"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"Гостин"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"Додај корисник"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"Нов корисник"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Кога додавате нов корисник, тоа лице треба да го постави својот простор."</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"Секој корисник може да ажурира апликации за сите други корисници."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-mk/strings_car.xml b/packages/CarSystemUI/res/values-mk/strings_car.xml
new file mode 100644
index 0000000..c1941467
--- /dev/null
+++ b/packages/CarSystemUI/res/values-mk/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"Гостин"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"Гостин"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"Додај корисник"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"Нов корисник"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"Кога додавате нов корисник, тоа лице треба да го постави својот простор."</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"Секој корисник може да ажурира апликации за сите други корисници."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-ml/strings.xml b/packages/CarSystemUI/res/values-ml/strings.xml
new file mode 100644
index 0000000..f7934d1
--- /dev/null
+++ b/packages/CarSystemUI/res/values-ml/strings.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"മിനിമം"</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"മാക്സിമം"</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"കണക്റ്റ് ചെയ്ത Bluetooth ഉപകരണം വഴി ഇപ്പോൾ വോയ്‌സ് തിരിച്ചറിയൽ കെെകാര്യം ചെയ്യുന്നു"</string>
+    <!-- no translation found for car_guest (318393171202663722) -->
+    <skip />
+    <!-- no translation found for start_guest_session (497784785761754874) -->
+    <skip />
+    <!-- no translation found for car_add_user (4067337059622483269) -->
+    <skip />
+    <!-- no translation found for car_new_user (6637442369728092473) -->
+    <skip />
+    <!-- no translation found for user_add_user_message_setup (1035578846007352323) -->
+    <skip />
+    <!-- no translation found for user_add_user_message_update (7061671307004867811) -->
+    <skip />
+</resources>
diff --git a/packages/CarSystemUI/res/values-ml/strings_car.xml b/packages/CarSystemUI/res/values-ml/strings_car.xml
new file mode 100644
index 0000000..3ce44f7
--- /dev/null
+++ b/packages/CarSystemUI/res/values-ml/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"അതിഥി"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"അതിഥി"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"ഉപയോക്താവിനെ ചേർക്കുക"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"പുതിയ ഉപയോക്താവ്"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"നിങ്ങളൊരു പുതിയ ഉപയോക്താവിനെ ചേർക്കുമ്പോൾ, ആ വ്യക്തി സ്വന്തം ഇടം സജ്ജീകരിക്കേണ്ടതുണ്ട്."</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"മറ്റെല്ലാ ഉപയോക്താക്കൾക്കുമായി ആപ്പുകൾ അപ്‌ഡേറ്റ് ചെയ്യാൻ ഏതൊരു ഉപയോക്താവിനും കഴിയും."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-mn/strings.xml b/packages/CarSystemUI/res/values-mn/strings.xml
new file mode 100644
index 0000000..bae5c64
--- /dev/null
+++ b/packages/CarSystemUI/res/values-mn/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"Бага"</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"Их"</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"Одоо дуугаар танихыг холбогдсон Bluetooth төхөөрөмж удирдана"</string>
+    <string name="car_guest" msgid="318393171202663722">"Зочин"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"Зочин"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"Хэрэглэгч нэмэх"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"Шинэ хэрэглэгч"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Та шинэ хэрэглэгч нэмэх үед тухайн хэрэглэгч хувийн орон зайгаа тохируулах шаардлагатай."</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"Бусад бүх хэрэглэгчийн аппыг дурын хэрэглэгч шинэчлэх боломжтой."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-mn/strings_car.xml b/packages/CarSystemUI/res/values-mn/strings_car.xml
new file mode 100644
index 0000000..9628f7b
--- /dev/null
+++ b/packages/CarSystemUI/res/values-mn/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"Зочин"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"Зочин"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"Хэрэглэгч нэмэх"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"Шинэ хэрэглэгч"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"Та шинэ хэрэглэгчийг нэмэх үед тухайн хэрэглэгч хувийн орон зайгаа тохируулах шаардлагатай."</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"Дурын хэрэглэгч бусад бүх хэрэглэгчийн аппуудыг шинэчлэх боломжтой."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-mr/strings.xml b/packages/CarSystemUI/res/values-mr/strings.xml
new file mode 100644
index 0000000..60d9231
--- /dev/null
+++ b/packages/CarSystemUI/res/values-mr/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"मि"</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"कमाल"</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"आता कनेक्ट केलेले ब्लूटूथ डिव्हाइस व्हॉइस रेकग्निशन हाताळते"</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-mr/strings_car.xml b/packages/CarSystemUI/res/values-mr/strings_car.xml
new file mode 100644
index 0000000..cf2ad5e
--- /dev/null
+++ b/packages/CarSystemUI/res/values-mr/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"अतिथी"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"अतिथी"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"वापरकर्ता जोडा"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"नवीन वापरकर्ता"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"तुम्ही नवीन वापरकर्ता जोडल्यावर, त्या व्यक्तीने त्यांची जागा सेट करणे आवश्यक असते."</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"कोणत्याही वापरकर्त्याला इतर सर्व वापरकर्त्यांसाठी अ‍ॅप्स अपडेट करता येतात."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-ms/strings.xml b/packages/CarSystemUI/res/values-ms/strings.xml
new file mode 100644
index 0000000..868a060
--- /dev/null
+++ b/packages/CarSystemUI/res/values-ms/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"Min"</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"Maks"</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"Pengecaman suara kini dikendalikan peranti Bluetooth tersmbg"</string>
+    <string name="car_guest" msgid="318393171202663722">"Tetamu"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"Tetamu"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"Tambah Pengguna"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"Pengguna Baharu"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Apabila anda menambahkan pengguna baharu, orang itu perlu menyediakan ruang mereka."</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"Mana-mana pengguna boleh mengemas kini apl untuk semua pengguna lain."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-ms/strings_car.xml b/packages/CarSystemUI/res/values-ms/strings_car.xml
new file mode 100644
index 0000000..e846b62
--- /dev/null
+++ b/packages/CarSystemUI/res/values-ms/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"Tetamu"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"Tetamu"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"Tambah Pengguna"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"Pengguna Baharu"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"Apabila anda menambahkan pengguna baharu, orang itu perlu menyediakan ruang mereka."</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"Mana-mana pengguna boleh mengemas kini apl untuk semua pengguna lain."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-my/strings.xml b/packages/CarSystemUI/res/values-my/strings.xml
new file mode 100644
index 0000000..231b41f
--- /dev/null
+++ b/packages/CarSystemUI/res/values-my/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"နိမ့်"</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"မြင့်"</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"ချိတ်ထားသော ဘလူးတုသ်စက်ဖြင့် အသံမှတ်သားမှုကို ထိန်းချုပ်သည်"</string>
+    <string name="car_guest" msgid="318393171202663722">"ဧည့်သည်"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"ဧည့်သည်"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"အသုံးပြုသူ ထည့်ရန်"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"အသုံးပြုသူ အသစ်"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"အသုံးပြုသူအသစ် ထည့်သည့်အခါ ထိုသူသည် မိမိ၏ နေရာကို စနစ်ထည့်သွင်းရပါမည်။"</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"မည်သူမဆို အသုံးပြုသူအားလုံးအတွက် အက်ပ်များကို အပ်ဒိတ်လုပ်နိုင်သည်။"</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-my/strings_car.xml b/packages/CarSystemUI/res/values-my/strings_car.xml
new file mode 100644
index 0000000..e5e67d1
--- /dev/null
+++ b/packages/CarSystemUI/res/values-my/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"ဧည့်သည်"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"ဧည့်သည်"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"အသုံးပြုသူ ထည့်ရန်"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"အသုံးပြုသူ အသစ်"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"အသုံးပြုသူအသစ် ထည့်သည့်အခါ ထိုသူသည် မိမိ၏ နေရာကို စနစ်ထည့်သွင်းရပါမည်။"</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"အခြားအသုံးပြုသူ အားလုံးအတွက် အက်ပ်များကို မည်သူမဆို အပ်ဒိတ်လုပ်နိုင်သည်။"</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-nb/strings.xml b/packages/CarSystemUI/res/values-nb/strings.xml
new file mode 100644
index 0000000..9141cfc
--- /dev/null
+++ b/packages/CarSystemUI/res/values-nb/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"Min."</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"Maks."</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"Talegjenkjenning håndteres nå av tilkoblet Bluetooth-enhet"</string>
+    <string name="car_guest" msgid="318393171202663722">"Gjest"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"Gjest"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"Legg til bruker"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"Ny bruker"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Når du legger til en ny bruker, må vedkommende konfigurere sitt eget område."</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"Alle brukere kan oppdatere apper for alle andre brukere."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-nb/strings_car.xml b/packages/CarSystemUI/res/values-nb/strings_car.xml
new file mode 100644
index 0000000..2c10092
--- /dev/null
+++ b/packages/CarSystemUI/res/values-nb/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"Gjest"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"Gjest"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"Legg til en bruker"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"Ny bruker"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"Når du legger til en ny bruker, må vedkommende konfigurere sitt eget område."</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"Alle brukere kan oppdatere apper for alle andre brukere."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-ne/strings.xml b/packages/CarSystemUI/res/values-ne/strings.xml
new file mode 100644
index 0000000..b17c8b4
--- /dev/null
+++ b/packages/CarSystemUI/res/values-ne/strings.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"न्यूनतम"</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"अधिकतम"</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"अब ब्लुटुथ मार्फत जोडिएको यन्त्रले आवाज पहिचान गर्ने कार्य सम्हाल्छ"</string>
+    <!-- no translation found for car_guest (318393171202663722) -->
+    <skip />
+    <!-- no translation found for start_guest_session (497784785761754874) -->
+    <skip />
+    <!-- no translation found for car_add_user (4067337059622483269) -->
+    <skip />
+    <!-- no translation found for car_new_user (6637442369728092473) -->
+    <skip />
+    <!-- no translation found for user_add_user_message_setup (1035578846007352323) -->
+    <skip />
+    <!-- no translation found for user_add_user_message_update (7061671307004867811) -->
+    <skip />
+</resources>
diff --git a/packages/CarSystemUI/res/values-nl/strings.xml b/packages/CarSystemUI/res/values-nl/strings.xml
new file mode 100644
index 0000000..5ba7ce4
--- /dev/null
+++ b/packages/CarSystemUI/res/values-nl/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"Min."</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"Max."</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"Spraakherkenning actief via een verbonden bluetooth-apparaat"</string>
+    <string name="car_guest" msgid="318393171202663722">"Gast"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"Gast"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"Gebruiker toevoegen"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"Nieuwe gebruiker"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Als je een nieuwe gebruiker toevoegt, moet die persoon een eigen profiel instellen."</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"Elke gebruiker kan apps updaten voor alle andere gebruikers"</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-nl/strings_car.xml b/packages/CarSystemUI/res/values-nl/strings_car.xml
new file mode 100644
index 0000000..8f008a6
--- /dev/null
+++ b/packages/CarSystemUI/res/values-nl/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"Gast"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"Gast"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"Gebruiker toevoegen"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"Nieuwe gebruiker"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"Als je een nieuwe gebruiker toevoegt, moet die persoon een eigen profiel instellen."</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"Elke gebruiker kan apps updaten voor alle andere gebruikers"</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-or/strings.xml b/packages/CarSystemUI/res/values-or/strings.xml
new file mode 100644
index 0000000..4d1a6ac
--- /dev/null
+++ b/packages/CarSystemUI/res/values-or/strings.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"ସର୍ବନିମ୍ନ"</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"ସର୍ବାଧିକ"</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"ଭଏସ ଚିହ୍ନଟକରଣ ଏବେ ସଂଯୁକ୍ତ ଥିବା ବ୍ଲୁଟୁଥ ଡିଭାଇସ ଦ୍ୱାରା ପରିଚାଳିତ"</string>
+    <!-- no translation found for car_guest (318393171202663722) -->
+    <skip />
+    <!-- no translation found for start_guest_session (497784785761754874) -->
+    <skip />
+    <!-- no translation found for car_add_user (4067337059622483269) -->
+    <skip />
+    <!-- no translation found for car_new_user (6637442369728092473) -->
+    <skip />
+    <!-- no translation found for user_add_user_message_setup (1035578846007352323) -->
+    <skip />
+    <!-- no translation found for user_add_user_message_update (7061671307004867811) -->
+    <skip />
+</resources>
diff --git a/packages/CarSystemUI/res/values-pa/strings.xml b/packages/CarSystemUI/res/values-pa/strings.xml
new file mode 100644
index 0000000..8184c2c
--- /dev/null
+++ b/packages/CarSystemUI/res/values-pa/strings.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"ਨਿਊਨਤਮ"</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"ਅਧਿਕਤਮ"</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"ਅਵਾਜ਼ ਦੀ ਪਛਾਣ ਨੂੰ ਹੁਣ ਕਨੈਕਟ ਕੀਤਾ ਬਲੂਟੁੱਥ ਡੀਵਾਈਸ ਸੰਭਾਲਦਾ ਹੈ"</string>
+    <!-- no translation found for car_guest (318393171202663722) -->
+    <skip />
+    <!-- no translation found for start_guest_session (497784785761754874) -->
+    <skip />
+    <!-- no translation found for car_add_user (4067337059622483269) -->
+    <skip />
+    <!-- no translation found for car_new_user (6637442369728092473) -->
+    <skip />
+    <!-- no translation found for user_add_user_message_setup (1035578846007352323) -->
+    <skip />
+    <!-- no translation found for user_add_user_message_update (7061671307004867811) -->
+    <skip />
+</resources>
diff --git a/packages/CarSystemUI/res/values-pa/strings_car.xml b/packages/CarSystemUI/res/values-pa/strings_car.xml
new file mode 100644
index 0000000..a15a6a5
--- /dev/null
+++ b/packages/CarSystemUI/res/values-pa/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"ਮਹਿਮਾਨ"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"ਮਹਿਮਾਨ"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"ਵਰਤੋਂਕਾਰ ਸ਼ਾਮਲ ਕਰੋ"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"ਨਵਾਂ ਵਰਤੋਂਕਾਰ"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"ਜਦੋਂ ਤੁਸੀਂ ਇੱਕ ਨਵਾਂ ਵਰਤੋਂਕਾਰ ਸ਼ਾਮਲ ਕਰਦੇ ਹੋ, ਤਾਂ ਉਸ ਵਿਅਕਤੀ ਨੂੰ ਆਪਣੀ ਜਗ੍ਹਾ ਸੈੱਟਅੱਪ ਕਰਨ ਦੀ ਲੋੜ ਹੁੰਦੀ ਹੈ।"</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"ਕੋਈ ਵੀ ਵਰਤੋਂਕਾਰ ਹੋਰ ਸਾਰੇ ਵਰਤੋਂਕਾਰਾਂ ਦੀਆਂ ਐਪਾਂ ਨੂੰ ਅੱਪਡੇਟ ਕਰ ਸਕਦਾ ਹੈ।"</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-pl/strings.xml b/packages/CarSystemUI/res/values-pl/strings.xml
new file mode 100644
index 0000000..35d735b
--- /dev/null
+++ b/packages/CarSystemUI/res/values-pl/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"Min."</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"Maks."</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"Rozpoznawanie mowy przez połączone urządzenie Bluetooth"</string>
+    <string name="car_guest" msgid="318393171202663722">"Gość"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"Gość"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"Dodaj użytkownika"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"Nowy użytkownik"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Gdy dodasz nowego użytkownika, musi on skonfigurować swój profil."</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"Każdy użytkownik może aktualizować aplikacje wszystkich innych użytkowników."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-pl/strings_car.xml b/packages/CarSystemUI/res/values-pl/strings_car.xml
new file mode 100644
index 0000000..0c48dcf
--- /dev/null
+++ b/packages/CarSystemUI/res/values-pl/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"Gość"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"Gość"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"Dodaj użytkownika"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"Nowy użytkownik"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"Gdy dodasz nowego użytkownika, musi on skonfigurować swój profil."</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"Każdy użytkownik może aktualizować aplikacje wszystkich innych użytkowników."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-pt-rPT/strings.xml b/packages/CarSystemUI/res/values-pt-rPT/strings.xml
new file mode 100644
index 0000000..7b0ee14
--- /dev/null
+++ b/packages/CarSystemUI/res/values-pt-rPT/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"Mín."</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"Máx."</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"Reconhecimento de voz agora através do disp. Bluetooth lig."</string>
+    <string name="car_guest" msgid="318393171202663722">"Convidado"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"Convidado"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"Adicionar utilizador"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"Novo utilizador"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Ao adicionar um novo utilizador, essa pessoa tem de configurar o respetivo espaço."</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"Qualquer utilizador pode atualizar apps para todos os outros utilizadores."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-pt-rPT/strings_car.xml b/packages/CarSystemUI/res/values-pt-rPT/strings_car.xml
new file mode 100644
index 0000000..640e535
--- /dev/null
+++ b/packages/CarSystemUI/res/values-pt-rPT/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"Convidado"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"Convidado"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"Adicionar utilizador"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"Novo utilizador"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"Ao adicionar um novo utilizador, essa pessoa tem de configurar o respetivo espaço."</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"Qualquer utilizador pode atualizar apps para todos os outros utilizadores."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-pt/strings.xml b/packages/CarSystemUI/res/values-pt/strings.xml
new file mode 100644
index 0000000..fab603d
--- /dev/null
+++ b/packages/CarSystemUI/res/values-pt/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"Mín"</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"Máx"</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"Reconhecimento de voz com dispositivo Bluetooth conectado"</string>
+    <string name="car_guest" msgid="318393171202663722">"Convidado"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"Convidado"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"Adicionar usuário"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"Novo usuário"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Quando você adiciona um usuário novo, essa pessoa precisa configurar o espaço dela."</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"Qualquer usuário pode atualizar apps para os demais usuários."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-pt/strings_car.xml b/packages/CarSystemUI/res/values-pt/strings_car.xml
new file mode 100644
index 0000000..6b53b5b
--- /dev/null
+++ b/packages/CarSystemUI/res/values-pt/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"Convidado"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"Convidado"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"Adicionar usuário"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"Novo usuário"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"Quando você adiciona um usuário novo, essa pessoa precisa configurar o espaço dela."</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"Qualquer usuário pode atualizar apps para os demais usuários."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-ro/strings.xml b/packages/CarSystemUI/res/values-ro/strings.xml
new file mode 100644
index 0000000..adf83a3
--- /dev/null
+++ b/packages/CarSystemUI/res/values-ro/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"Min"</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"Max"</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"Recunoașterea vocală acum gestionată de dispozitivul Bluetooth conectat"</string>
+    <string name="car_guest" msgid="318393171202663722">"Invitat"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"Invitat"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"Adăugați un utilizator"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"Utilizator nou"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Când adăugați un utilizator nou, acesta trebuie să-și configureze spațiul."</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"Orice utilizator poate actualiza aplicațiile pentru toți ceilalți utilizatori."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-ro/strings_car.xml b/packages/CarSystemUI/res/values-ro/strings_car.xml
new file mode 100644
index 0000000..7f4fe7a
--- /dev/null
+++ b/packages/CarSystemUI/res/values-ro/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"Invitat"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"Invitat"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"Adăugați un utilizator"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"Utilizator nou"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"Când adăugați un utilizator nou, acesta trebuie să-și configureze spațiul."</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"Orice utilizator poate actualiza aplicațiile pentru toți ceilalți utilizatori."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-ru/strings.xml b/packages/CarSystemUI/res/values-ru/strings.xml
new file mode 100644
index 0000000..69ee939
--- /dev/null
+++ b/packages/CarSystemUI/res/values-ru/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"Мин."</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"Макс."</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"Для распознавания речи используется Bluetooth-устройство."</string>
+    <string name="car_guest" msgid="318393171202663722">"Гость"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"Гость"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"Добавить пользователя"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"Новый пользователь"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Когда вы добавите пользователя, ему потребуется настроить профиль."</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"Любой пользователь устройства может обновлять приложения для всех аккаунтов."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-ru/strings_car.xml b/packages/CarSystemUI/res/values-ru/strings_car.xml
new file mode 100644
index 0000000..99819dd
--- /dev/null
+++ b/packages/CarSystemUI/res/values-ru/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"Гость"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"Гость"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"Добавить пользователя"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"Новый пользователь"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"Когда вы добавите пользователя, ему потребуется настроить профиль."</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"Любой пользователь устройства может обновлять приложения для всех аккаунтов."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-si/strings.xml b/packages/CarSystemUI/res/values-si/strings.xml
new file mode 100644
index 0000000..061d4ed
--- /dev/null
+++ b/packages/CarSystemUI/res/values-si/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"අවම"</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"උපරිම"</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"හඬ හැඳුනුම දැන් සම්බන්ධ බ්ලූටූත් උපාංගය මගින් හසුරුවනු ලැබේ"</string>
+    <string name="car_guest" msgid="318393171202663722">"අමුත්තා"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"අමුත්තා"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"පරිශීලක එක් කරන්න"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"නව පරිශීලක"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"ඔබ අලුත් පරිශීලකයෙකු එක් කරන විට, එම පුද්ගලයා තමන්ගේ ඉඩ සකසා ගැනීමට අවශ්‍ය වේ."</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"සියලුම අනෙක් පරිශීලකයින් සඳහා ඕනෑම පරිශීලකයෙකුට යෙදුම් යාවත්කාලීන කළ හැක."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-si/strings_car.xml b/packages/CarSystemUI/res/values-si/strings_car.xml
new file mode 100644
index 0000000..6444e91f
--- /dev/null
+++ b/packages/CarSystemUI/res/values-si/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"අමුත්තා"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"අමුත්තා"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"පරිශීලක එක් කරන්න"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"නව පරිශීලක"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"ඔබ අලුත් පරිශීලකයෙක් එක් කරන විට, එම පුද්ගලයාට තමන්ගේ ඉඩ සකසා ගැනීමට අවශ්‍ය වේ."</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"සියලුම අනෙක් පරිශීලකයින් සඳහා ඕනෑම පරිශීලකයෙකුට යෙදුම් යාවත්කාලීන කළ හැක."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-sk/strings.xml b/packages/CarSystemUI/res/values-sk/strings.xml
new file mode 100644
index 0000000..619cf29
--- /dev/null
+++ b/packages/CarSystemUI/res/values-sk/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"min."</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"max."</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"Rozpoznávanie hlasu teraz prebieha v pripoj. zar. Bluetooth"</string>
+    <string name="car_guest" msgid="318393171202663722">"Hosť"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"Hosť"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"Pridať používateľa"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"Nový používateľ"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Keď pridáte nového používateľa, musí si nastaviť vlastný priestor."</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"Akýkoľvek používateľ môže aktualizovať aplikácie všetkých ostatných používateľov."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-sk/strings_car.xml b/packages/CarSystemUI/res/values-sk/strings_car.xml
new file mode 100644
index 0000000..c058a32
--- /dev/null
+++ b/packages/CarSystemUI/res/values-sk/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"Hosť"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"Hosť"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"Pridať používateľa"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"Nový používateľ"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"Keď pridáte nového používateľa, musí si nastaviť vlastný priestor."</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"Akýkoľvek používateľ môže aktualizovať aplikácie všetkých ostatných používateľov."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-sl/strings.xml b/packages/CarSystemUI/res/values-sl/strings.xml
new file mode 100644
index 0000000..b386591
--- /dev/null
+++ b/packages/CarSystemUI/res/values-sl/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"Najn."</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"Najv."</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"Prepoznavanje glasu zdaj izvaja povezana naprava Bluetooth"</string>
+    <string name="car_guest" msgid="318393171202663722">"Gost"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"Gost"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"Dodaj uporabnika"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"Nov uporabnik"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Ko dodate novega uporabnika, mora ta nastaviti svoj prostor."</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"Vsak uporabnik lahko posodobi aplikacije za vse druge uporabnike."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-sl/strings_car.xml b/packages/CarSystemUI/res/values-sl/strings_car.xml
new file mode 100644
index 0000000..b8324e0
--- /dev/null
+++ b/packages/CarSystemUI/res/values-sl/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"Gost"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"Gost"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"Dodaj uporabnika"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"Nov uporabnik"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"Ko dodate novega uporabnika, mora ta nastaviti svoj prostor."</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"Vsak uporabnik lahko posodobi aplikacije za vse druge uporabnike."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-sq/strings.xml b/packages/CarSystemUI/res/values-sq/strings.xml
new file mode 100644
index 0000000..c75782b
--- /dev/null
+++ b/packages/CarSystemUI/res/values-sq/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"Min."</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"Maks."</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"Njohja zanore trajtohet nga pajisja me Bluetooth-in e lidhur"</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-sq/strings_car.xml b/packages/CarSystemUI/res/values-sq/strings_car.xml
new file mode 100644
index 0000000..7e676ba
--- /dev/null
+++ b/packages/CarSystemUI/res/values-sq/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"I ftuar"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"I ftuar"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"Shto përdorues"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"Përdorues i ri"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"Kur shton një përdorues të ri, ai person duhet të konfigurojë hapësirën e vet."</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"Çdo përdorues mund t\'i përditësojë aplikacionet për të gjithë përdoruesit e tjerë."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-sr/strings.xml b/packages/CarSystemUI/res/values-sr/strings.xml
new file mode 100644
index 0000000..2096967
--- /dev/null
+++ b/packages/CarSystemUI/res/values-sr/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"Мин."</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"Maкс."</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"Препознавањем гласа сада управља повезани Bluetooth уређај"</string>
+    <string name="car_guest" msgid="318393171202663722">"Гост"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"Гост"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"Додај корисника"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"Нови корисник"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Када додате новог корисника, та особа треба да подеси свој простор."</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"Сваки корисник може да ажурира апликације за све остале кориснике."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-sr/strings_car.xml b/packages/CarSystemUI/res/values-sr/strings_car.xml
new file mode 100644
index 0000000..4d23fdb
--- /dev/null
+++ b/packages/CarSystemUI/res/values-sr/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"Гост"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"Гост"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"Додај корисника"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"Нови корисник"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"Када додате новог корисника, та особа треба да подеси свој простор."</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"Сваки корисник може да ажурира апликације за све остале кориснике."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-sv/strings.xml b/packages/CarSystemUI/res/values-sv/strings.xml
new file mode 100644
index 0000000..af3f5b8
--- /dev/null
+++ b/packages/CarSystemUI/res/values-sv/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"Min"</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"Max"</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"Nu hanteras röstigenkänning via en anstluten Bluetooth-enhet"</string>
+    <string name="car_guest" msgid="318393171202663722">"Gäst"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"Gäst"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"Lägg till användare"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"Ny användare"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"När du lägger till en ny användare måste den personen konfigurera sitt utrymme."</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"Alla användare kan uppdatera appar för andra användare."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-sv/strings_car.xml b/packages/CarSystemUI/res/values-sv/strings_car.xml
new file mode 100644
index 0000000..36fcdaa
--- /dev/null
+++ b/packages/CarSystemUI/res/values-sv/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"Gäst"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"Gäst"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"Lägg till användare"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"Ny användare"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"När du lägger till en ny användare måste den personen konfigurera sitt utrymme."</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"Alla användare kan uppdatera appar för andra användare."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-sw/strings.xml b/packages/CarSystemUI/res/values-sw/strings.xml
new file mode 100644
index 0000000..1aa0868
--- /dev/null
+++ b/packages/CarSystemUI/res/values-sw/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"Chini"</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"Juu"</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"Utambuzi wa sauti sasa unashughulikiwa na kifaa kilichounganishwa cha Bluetooth"</string>
+    <string name="car_guest" msgid="318393171202663722">"Mgeni"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"Mgeni"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"Ongeza Mtumiaji"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"Mtumiaji Mpya"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Ukiongeza mtumiaji mpya, ni lazima aweke kikundi chake."</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"Mtumiaji yeyote anaweza kusasisha programu za watumiaji wengine."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-sw/strings_car.xml b/packages/CarSystemUI/res/values-sw/strings_car.xml
new file mode 100644
index 0000000..75573d7
--- /dev/null
+++ b/packages/CarSystemUI/res/values-sw/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"Mgeni"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"Mgeni"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"Weka Mtumiaji"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"Mtumiaji Mpya"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"Ukiongeza mtumiaji mpya, ni lazima aweke kikundi chake."</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"Mtumiaji yeyote anaweza kusasisha programu za watumiaji wengine wote."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-ta/strings.xml b/packages/CarSystemUI/res/values-ta/strings.xml
new file mode 100644
index 0000000..9f76f77
--- /dev/null
+++ b/packages/CarSystemUI/res/values-ta/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"குறைந்தபட்சம்"</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"அதிகபட்சம்"</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"இணைக்கப்பட்ட புளூடூத் சாதனத்தால் \'குரல் அறிதல்\' கையாளப்படுகிறது"</string>
+    <string name="car_guest" msgid="318393171202663722">"கெஸ்ட்"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"கெஸ்ட்"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"பயனரைச் சேருங்கள்"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"புதிய பயனர்"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"புதிய பயனரைச் சேர்க்கும்போது அவர் தனக்கான சேமிப்பிடத்தை அமைக்க வேண்டும்."</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"எந்தப் பயனரும் பிற பயனர்கள் சார்பாக ஆப்ஸைப் புதுப்பிக்க முடியும்."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-te/strings.xml b/packages/CarSystemUI/res/values-te/strings.xml
new file mode 100644
index 0000000..bfa586f
--- /dev/null
+++ b/packages/CarSystemUI/res/values-te/strings.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"కని."</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"గరి."</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"నేడు వాయిస్ గుర్తింపును కనెక్ట్ అయిన బ్లూటూత్ నిర్వహిస్తోంది"</string>
+    <!-- no translation found for car_guest (318393171202663722) -->
+    <skip />
+    <!-- no translation found for start_guest_session (497784785761754874) -->
+    <skip />
+    <!-- no translation found for car_add_user (4067337059622483269) -->
+    <skip />
+    <!-- no translation found for car_new_user (6637442369728092473) -->
+    <skip />
+    <!-- no translation found for user_add_user_message_setup (1035578846007352323) -->
+    <skip />
+    <!-- no translation found for user_add_user_message_update (7061671307004867811) -->
+    <skip />
+</resources>
diff --git a/packages/CarSystemUI/res/values-te/strings_car.xml b/packages/CarSystemUI/res/values-te/strings_car.xml
new file mode 100644
index 0000000..7f0d090
--- /dev/null
+++ b/packages/CarSystemUI/res/values-te/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"గెస్ట్"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"గెస్ట్"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"యూజర్‌ను జోడించండి"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"కొత్త యూజర్"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"మీరు కొత్త యూజర్‌ను జోడించినప్పుడు, ఆ వ్యక్తి తన ప్రదేశాన్ని సెటప్ చేసుకోవాలి."</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"ఏ యూజర్ అయినా మిగతా అందరు యూజర్‌ల కోసం యాప్‌లను అప్‌డేట్ చేయవచ్చు."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-th/strings.xml b/packages/CarSystemUI/res/values-th/strings.xml
new file mode 100644
index 0000000..57ac7dc
--- /dev/null
+++ b/packages/CarSystemUI/res/values-th/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"Min"</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"Max"</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"ตอนนี้อุปกรณ์บลูทูธที่เชื่อมต่อจะจัดการการจดจำเสียง"</string>
+    <string name="car_guest" msgid="318393171202663722">"ผู้ใช้ชั่วคราว"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"ผู้ใช้ชั่วคราว"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"เพิ่มผู้ใช้"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"ผู้ใช้ใหม่"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"เมื่อคุณเพิ่มผู้ใช้ใหม่ ผู้ใช้ดังกล่าวจะต้องตั้งค่าพื้นที่ของตนเอง"</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"ผู้ใช้ทุกคนจะอัปเดตแอปให้แก่ผู้ใช้คนอื่นๆ ได้"</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-th/strings_car.xml b/packages/CarSystemUI/res/values-th/strings_car.xml
new file mode 100644
index 0000000..8e47499
--- /dev/null
+++ b/packages/CarSystemUI/res/values-th/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"ผู้ใช้ชั่วคราว"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"ผู้ใช้ชั่วคราว"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"เพิ่มผู้ใช้"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"ผู้ใช้ใหม่"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"เมื่อคุณเพิ่มผู้ใช้ใหม่ ผู้ใช้ดังกล่าวจะต้องตั้งค่าพื้นที่ของตนเอง"</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"ผู้ใช้ทุกคนจะอัปเดตแอปให้ผู้ใช้คนอื่นๆ ได้"</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-tl/strings.xml b/packages/CarSystemUI/res/values-tl/strings.xml
new file mode 100644
index 0000000..5e0af6d
--- /dev/null
+++ b/packages/CarSystemUI/res/values-tl/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"Minuto"</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"Max"</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"Hawak na ngayon ng Bluetooth device ang Pagkilala ng boses"</string>
+    <string name="car_guest" msgid="318393171202663722">"Bisita"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"Bisita"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"Magdagdag ng User"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"Bagong User"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Kapag nagdagdag ka ng bagong user, kailangang i-set up ng taong iyon ang kanyang espasyo."</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"Puwedeng i-update ng sinumang user ang mga app para sa lahat ng iba pang user."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-tl/strings_car.xml b/packages/CarSystemUI/res/values-tl/strings_car.xml
new file mode 100644
index 0000000..b8a44e6
--- /dev/null
+++ b/packages/CarSystemUI/res/values-tl/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"Bisita"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"Bisita"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"Magdagdag ng User"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"Bagong User"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"Kapag nagdagdag ka ng bagong user, kailangang i-set up ng taong iyon ang kanyang espasyo."</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"Puwedeng i-update ng sinumang user ang mga app para sa lahat ng iba pang user."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-tr/strings.xml b/packages/CarSystemUI/res/values-tr/strings.xml
new file mode 100644
index 0000000..7949329
--- /dev/null
+++ b/packages/CarSystemUI/res/values-tr/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"Min."</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"Maks."</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"Artık ses tanıma, bağlı Bluetooth cihazı tarafından işleniyor"</string>
+    <string name="car_guest" msgid="318393171202663722">"Misafir"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"Misafir"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"Kullanıcı Ekle"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"Yeni Kullanıcı"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Yeni kullanıcı eklediğinizde, bu kişinin alanını ayarlaması gerekir."</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"Herhangi bir kullanıcı, diğer tüm kullanıcılar için uygulamaları güncelleyebilir."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-tr/strings_car.xml b/packages/CarSystemUI/res/values-tr/strings_car.xml
new file mode 100644
index 0000000..c59aff8
--- /dev/null
+++ b/packages/CarSystemUI/res/values-tr/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"Misafir"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"Misafir"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"Kullanıcı Ekle"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"Yeni Kullanıcı"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"Yeni kullanıcı eklediğinizde, bu kişinin alanını ayarlaması gerekir."</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"Herhangi bir kullanıcı, diğer tüm kullanıcılar için uygulamaları güncelleyebilir."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-uk/strings.xml b/packages/CarSystemUI/res/values-uk/strings.xml
new file mode 100644
index 0000000..f61ddf4
--- /dev/null
+++ b/packages/CarSystemUI/res/values-uk/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"Мін."</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"Макс."</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"Голос розпізнається через підключений пристрій Bluetooth"</string>
+    <string name="car_guest" msgid="318393171202663722">"Гість"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"Гість"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"Додати користувача"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"Новий користувач"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Коли ви додаєте нового користувача, він має налаштувати свій профіль."</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"Усі користувачі можуть оновлювати додатки для решти людей."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-uk/strings_car.xml b/packages/CarSystemUI/res/values-uk/strings_car.xml
new file mode 100644
index 0000000..b1aee0d
--- /dev/null
+++ b/packages/CarSystemUI/res/values-uk/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"Гість"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"Гість"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"Додати користувача"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"Новий користувач"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"Коли ви додаєте нового користувача, він має налаштувати свій профіль."</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"Будь-який користувач може оновлювати додатки для решти людей."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-ur/strings.xml b/packages/CarSystemUI/res/values-ur/strings.xml
new file mode 100644
index 0000000..50342a3
--- /dev/null
+++ b/packages/CarSystemUI/res/values-ur/strings.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"کم از کم"</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"زیادہ سے زیادہ"</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"آواز کی شناخت اب منسلک کردہ بلوٹوتھ آلے سے ہوتی ہے"</string>
+    <!-- no translation found for car_guest (318393171202663722) -->
+    <skip />
+    <!-- no translation found for start_guest_session (497784785761754874) -->
+    <skip />
+    <!-- no translation found for car_add_user (4067337059622483269) -->
+    <skip />
+    <!-- no translation found for car_new_user (6637442369728092473) -->
+    <skip />
+    <!-- no translation found for user_add_user_message_setup (1035578846007352323) -->
+    <skip />
+    <!-- no translation found for user_add_user_message_update (7061671307004867811) -->
+    <skip />
+</resources>
diff --git a/packages/CarSystemUI/res/values-uz/strings.xml b/packages/CarSystemUI/res/values-uz/strings.xml
new file mode 100644
index 0000000..e0f8378
--- /dev/null
+++ b/packages/CarSystemUI/res/values-uz/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"Daq."</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"Maks."</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"Endi ovozni tanish Bluetooth qurilma ulanganda amalga oshadi"</string>
+    <string name="car_guest" msgid="318393171202663722">"Mehmon"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"Mehmon"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"Foydalanuvchi kiritish"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"Yangi foydalanuvchi"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Yangi profil kiritilgach, uni sozlash lozim."</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"Qurilmaning istalgan foydalanuvchisi ilovalarni barcha hisoblar uchun yangilashi mumkin."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-uz/strings_car.xml b/packages/CarSystemUI/res/values-uz/strings_car.xml
new file mode 100644
index 0000000..eb4712c
--- /dev/null
+++ b/packages/CarSystemUI/res/values-uz/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"Mehmon"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"Mehmon"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"Foydalanuvchi kiritish"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"Yangi foydalanuvchi"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"Yangi profil kiritilgach, uni sozlash lozim."</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"Qurilmaning istalgan foydalanuvchisi ilovalarni barcha hisoblar uchun yangilashi mumkin."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-vi/strings.xml b/packages/CarSystemUI/res/values-vi/strings.xml
new file mode 100644
index 0000000..ce1826bc
--- /dev/null
+++ b/packages/CarSystemUI/res/values-vi/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"Tối thiểu"</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"Tối đa"</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"Thiết bị Bluetooth được kết nối đang xử lý vấn đề nhận dạng giọng nói"</string>
+    <string name="car_guest" msgid="318393171202663722">"Khách"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"Khách"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"Thêm người dùng"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"Người dùng mới"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Khi bạn thêm một người dùng mới, người đó cần thiết lập không gian của mình."</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"Bất kỳ người dùng nào cũng có thể cập nhật ứng dụng cho tất cả những người dùng khác."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-vi/strings_car.xml b/packages/CarSystemUI/res/values-vi/strings_car.xml
new file mode 100644
index 0000000..452257a
--- /dev/null
+++ b/packages/CarSystemUI/res/values-vi/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"Khách"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"Bắt đầu phiên khách"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"Thêm người dùng"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"Người dùng mới"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"Khi bạn thêm một người dùng mới, họ cần thiết lập không gian của mình."</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"Bất kỳ người dùng nào cũng có thể cập nhật ứng dụng cho tất cả những người dùng khác."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-zh-rCN/strings.xml b/packages/CarSystemUI/res/values-zh-rCN/strings.xml
new file mode 100644
index 0000000..431fd62
--- /dev/null
+++ b/packages/CarSystemUI/res/values-zh-rCN/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"最小"</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"最大"</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"现在由已连接的蓝牙设备处理语音识别操作"</string>
+    <string name="car_guest" msgid="318393171202663722">"访客"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"访客"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"添加用户"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"新用户"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"当您添加新用户时,该用户需要自行设置个人空间。"</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"任何用户均可为所有其他用户更新应用。"</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-zh-rCN/strings_car.xml b/packages/CarSystemUI/res/values-zh-rCN/strings_car.xml
new file mode 100644
index 0000000..d8aea67
--- /dev/null
+++ b/packages/CarSystemUI/res/values-zh-rCN/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"访客"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"访客"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"添加用户"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"新用户"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"当您添加新用户后,该用户需要自行设置个人空间。"</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"任何用户都可以为所有其他用户更新应用。"</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-zh-rHK/strings.xml b/packages/CarSystemUI/res/values-zh-rHK/strings.xml
new file mode 100644
index 0000000..24efc22
--- /dev/null
+++ b/packages/CarSystemUI/res/values-zh-rHK/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"最小"</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"最大"</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"現在由已連線的藍牙裝置處理語音辨識作業"</string>
+    <string name="car_guest" msgid="318393171202663722">"訪客"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"訪客"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"新增使用者"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"新使用者"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"新增的使用者需要自行設定個人空間。"</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"任何使用者都可以為所有其他使用者更新應用程式。"</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-zh-rHK/strings_car.xml b/packages/CarSystemUI/res/values-zh-rHK/strings_car.xml
new file mode 100644
index 0000000..1970ec9
--- /dev/null
+++ b/packages/CarSystemUI/res/values-zh-rHK/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"訪客"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"訪客"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"新增使用者"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"新使用者"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"你新增的使用者必須自行設定個人空間。"</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"任何使用者皆可為所有其他使用者更新應用程式。"</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-zh-rTW/strings.xml b/packages/CarSystemUI/res/values-zh-rTW/strings.xml
new file mode 100644
index 0000000..e1356ca
--- /dev/null
+++ b/packages/CarSystemUI/res/values-zh-rTW/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"最小"</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"最大"</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"現在由已連線的藍牙裝置處理語音辨識作業"</string>
+    <string name="car_guest" msgid="318393171202663722">"訪客"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"訪客"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"新增使用者"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"新使用者"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"新使用者必須自行設定個人空間。"</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"任何使用者都能為所有其他使用者更新應用程式。"</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-zh-rTW/strings_car.xml b/packages/CarSystemUI/res/values-zh-rTW/strings_car.xml
new file mode 100644
index 0000000..1970ec9
--- /dev/null
+++ b/packages/CarSystemUI/res/values-zh-rTW/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"訪客"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"訪客"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"新增使用者"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"新使用者"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"你新增的使用者必須自行設定個人空間。"</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"任何使用者皆可為所有其他使用者更新應用程式。"</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-zu/strings.xml b/packages/CarSystemUI/res/values-zu/strings.xml
new file mode 100644
index 0000000..94381b7
--- /dev/null
+++ b/packages/CarSystemUI/res/values-zu/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (c) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="hvac_min_text" msgid="8167124789068494624">"Okuncane"</string>
+    <string name="hvac_max_text" msgid="3669693372074755551">"Okuningi"</string>
+    <string name="voice_recognition_toast" msgid="1149934534584052842">"Ukubonwa kwezwi manje kuphethwe idivayisi exhunyiwe ye-Bluetooth"</string>
+    <string name="car_guest" msgid="318393171202663722">"Isihambeli"</string>
+    <string name="start_guest_session" msgid="497784785761754874">"Isihambeli"</string>
+    <string name="car_add_user" msgid="4067337059622483269">"Engeza umsebenzisi"</string>
+    <string name="car_new_user" msgid="6637442369728092473">"Umsebenzisi omusha"</string>
+    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Uma ungeza umsebenzisi omusha, loyo muntu udinga ukusetha izikhala zakhe."</string>
+    <string name="user_add_user_message_update" msgid="7061671307004867811">"Noma yimuphi umsebenzisi angabuyekeza izinhlelo zokusebenza zabanye abasebenzisi."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values-zu/strings_car.xml b/packages/CarSystemUI/res/values-zu/strings_car.xml
new file mode 100644
index 0000000..1f8227d
--- /dev/null
+++ b/packages/CarSystemUI/res/values-zu/strings_car.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="car_guest" msgid="1125545940563459016">"Isihambeli"</string>
+    <string name="start_guest_session" msgid="548879769864070364">"Isihambeli"</string>
+    <string name="car_add_user" msgid="9196649698797257695">"Engeza umsebenzisi"</string>
+    <string name="car_new_user" msgid="2994965724661108420">"Umsebenzisi omusha"</string>
+    <string name="user_add_user_message_setup" msgid="116571509380700718">"Uma ungeza umsebenzisi omusha, loyo muntu udinga ukusetha izikhala zakhe."</string>
+    <string name="user_add_user_message_update" msgid="537998123816022363">"Noma yimuphi umsebenzisi angabuyekeza izinhlelo zokusebenza zabanye abasebenzisi."</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values/colors.xml b/packages/CarSystemUI/res/values/colors.xml
index 7972e09..3e44721 100644
--- a/packages/CarSystemUI/res/values/colors.xml
+++ b/packages/CarSystemUI/res/values/colors.xml
@@ -20,6 +20,7 @@
     <color name="car_user_switcher_background_color">#000000</color>
     <color name="car_user_switcher_name_text_color">@*android:color/car_body1_light</color>
     <color name="car_user_switcher_add_user_background_color">#131313</color>
+    <color name="car_user_switcher_add_user_add_sign_color">@*android:color/car_body1_light</color>
     <color name="car_nav_icon_fill_color">#8Fffffff</color>
     <color name="car_nav_icon_fill_color_selected">#ffffff</color>
     <!-- colors for seekbar -->
diff --git a/packages/CarSystemUI/res/values/colors_car.xml b/packages/CarSystemUI/res/values/colors_car.xml
deleted file mode 100644
index 0a3f7aa..0000000
--- a/packages/CarSystemUI/res/values/colors_car.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
- * Copyright 2018, 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>
-    <color name="car_qs_background_primary">#263238</color> <!-- Blue Gray 900 -->
-    <color name="car_qs_footer_user_name_color">@*android:color/car_grey_50</color>
-
-    <!-- colors for user switcher -->
-    <color name="car_user_switcher_background_color">@*android:color/car_card_dark</color>
-    <color name="car_user_switcher_name_text_color">@*android:color/car_body1_light</color>
-    <color name="car_user_switcher_add_user_background_color">@*android:color/car_dark_blue_grey_600</color>
-    <color name="car_user_switcher_add_user_add_sign_color">@*android:color/car_body1_light</color>
-
-    <!-- colors for unlock dialog -->
-    <color name="unlock_dialog_background_color">#ff282a2d</color>
-    <color name="unlock_dialog_message_text_default">@*android:color/car_grey_400</color>
-    <color name="unlock_dialog_enter_pin_text_color">#ff66b5ff</color>
-
-</resources>
diff --git a/packages/CarSystemUI/res/values/config.xml b/packages/CarSystemUI/res/values/config.xml
index bf1bf38..eb1d9d0 100644
--- a/packages/CarSystemUI/res/values/config.xml
+++ b/packages/CarSystemUI/res/values/config.xml
@@ -25,6 +25,7 @@
     <bool name="config_enableFullscreenUserSwitcher">true</bool>
 
     <!-- configure which system ui bars should be displayed -->
+    <bool name="config_enableTopNavigationBar">true</bool>
     <bool name="config_enableLeftNavigationBar">false</bool>
     <bool name="config_enableRightNavigationBar">false</bool>
     <bool name="config_enableBottomNavigationBar">true</bool>
@@ -76,33 +77,39 @@
         <item>com.android.systemui.car.userswitcher.FullscreenUserSwitcherViewMediator</item>
     </string-array>
 
+    <!-- List of package names that are allowed sources of app installation. -->
+    <string-array name="config_allowedAppInstallSources" translatable="false">
+        <item>com.android.vending</item>
+    </string-array>
+
     <!-- SystemUI Services: The classes of the stuff to start. -->
     <string-array name="config_systemUIServiceComponents" translatable="false">
         <item>com.android.systemui.util.NotificationChannels</item>
         <item>com.android.systemui.keyguard.KeyguardViewMediator</item>
-        <item>com.android.systemui.recents.Recents</item>
-        <item>com.android.systemui.volume.VolumeUI</item>
-        <item>com.android.systemui.stackdivider.Divider</item>
-        <item>com.android.systemui.statusbar.phone.StatusBar</item>
+<!--        <item>com.android.systemui.recents.Recents</item>-->
+<!--        <item>com.android.systemui.volume.VolumeUI</item>-->
+<!--        <item>com.android.systemui.stackdivider.Divider</item>-->
+<!--        <item>com.android.systemui.statusbar.phone.StatusBar</item>-->
         <item>com.android.systemui.usb.StorageNotification</item>
         <item>com.android.systemui.power.PowerUI</item>
         <item>com.android.systemui.media.RingtonePlayer</item>
-        <item>com.android.systemui.keyboard.KeyboardUI</item>
-        <item>com.android.systemui.pip.PipUI</item>
-        <item>com.android.systemui.shortcut.ShortcutKeyDispatcher</item>
+<!--        <item>com.android.systemui.keyboard.KeyboardUI</item>-->
+<!--        <item>com.android.systemui.pip.PipUI</item>-->
+<!--        <item>com.android.systemui.shortcut.ShortcutKeyDispatcher</item>-->
         <item>@string/config_systemUIVendorServiceComponent</item>
         <item>com.android.systemui.util.leak.GarbageMonitor$Service</item>
-        <item>com.android.systemui.LatencyTester</item>
-        <item>com.android.systemui.globalactions.GlobalActionsComponent</item>
+<!--        <item>com.android.systemui.LatencyTester</item>-->
+<!--        <item>com.android.systemui.globalactions.GlobalActionsComponent</item>-->
         <item>com.android.systemui.ScreenDecorations</item>
         <item>com.android.systemui.biometrics.AuthController</item>
-        <item>com.android.systemui.SliceBroadcastRelayHandler</item>
+<!--        <item>com.android.systemui.SliceBroadcastRelayHandler</item>-->
         <item>com.android.systemui.SizeCompatModeActivityController</item>
-        <item>com.android.systemui.statusbar.notification.InstantAppNotifier</item>
+<!--        <item>com.android.systemui.statusbar.notification.InstantAppNotifier</item>-->
         <item>com.android.systemui.theme.ThemeOverlayController</item>
-        <item>com.android.systemui.navigationbar.car.CarNavigationBar</item>
         <item>com.android.systemui.toast.ToastUI</item>
-        <item>com.android.systemui.voicerecognition.car.ConnectedDeviceVoiceRecognitionNotifier</item>
-        <item>com.android.systemui.window.SystemUIOverlayWindowManager</item>
+        <item>com.android.systemui.car.navigationbar.CarNavigationBar</item>
+        <item>com.android.systemui.car.voicerecognition.ConnectedDeviceVoiceRecognitionNotifier</item>
+        <item>com.android.systemui.car.window.SystemUIOverlayWindowManager</item>
+        <item>com.android.systemui.car.volume.VolumeUI</item>
     </string-array>
 </resources>
diff --git a/packages/CarSystemUI/res/values/dimens.xml b/packages/CarSystemUI/res/values/dimens.xml
index f68d034..9014eb1 100644
--- a/packages/CarSystemUI/res/values/dimens.xml
+++ b/packages/CarSystemUI/res/values/dimens.xml
@@ -22,16 +22,11 @@
 
     <dimen name="status_bar_icon_drawing_size_dark">36dp</dimen>
     <dimen name="status_bar_icon_drawing_size">36dp</dimen>
-    <dimen name="car_qs_header_system_icons_area_height">96dp</dimen>
     <!-- The amount by which to scale up the status bar icons. -->
     <item name="status_bar_icon_scale_factor" format="float" type="dimen">1.75</item>
 
     <dimen name="car_primary_icon_size">@*android:dimen/car_primary_icon_size</dimen>
 
-    <!-- dimensions for the car user switcher -->
-    <dimen name="car_user_switcher_name_text_size">@dimen/car_body1_size</dimen>
-    <dimen name="car_user_switcher_vertical_spacing_between_users">124dp</dimen>
-
     <!--These values represent MIN and MAX for hvac-->
     <item name="hvac_min_value" format="float" type="dimen">0</item>
     <item name="hvac_max_value" format="float" type="dimen">126</item>
@@ -90,9 +85,6 @@
     <!-- The width of panel holding the notification card. -->
     <dimen name="notification_panel_width">522dp</dimen>
 
-    <!-- The width of the quick settings panel. -1 for match_parent. -->
-    <dimen name="qs_panel_width">-1px</dimen>
-
     <!-- Height of a small notification in the status bar-->
     <dimen name="notification_min_height">192dp</dimen>
 
@@ -149,7 +141,19 @@
          child closer so there is less wasted space. -->
     <dimen name="notification_children_container_margin_top">68dp</dimen>
 
-    <!-- The height of the quick settings footer that holds the user switcher, settings icon,
-         etc. in the car setting.-->
-    <dimen name="qs_footer_height">74dp</dimen>
+    <!-- dimensions for the car user switcher -->
+    <dimen name="car_user_switcher_name_text_size">@*android:dimen/car_body1_size</dimen>
+    <dimen name="car_user_switcher_image_avatar_size">@*android:dimen/car_large_avatar_size</dimen>
+    <dimen name="car_user_switcher_vertical_spacing_between_users">@*android:dimen/car_padding_5</dimen>
+    <dimen name="car_user_switcher_vertical_spacing_between_name_and_avatar">@*android:dimen/car_padding_4</dimen>
+    <dimen name="car_user_switcher_margin_top">@*android:dimen/car_padding_4</dimen>
+
+    <dimen name="car_navigation_button_width">64dp</dimen>
+    <dimen name="car_navigation_bar_width">760dp</dimen>
+    <dimen name="car_left_navigation_bar_width">96dp</dimen>
+    <dimen name="car_right_navigation_bar_width">96dp</dimen>
+
+    <dimen name="car_user_switcher_container_height">420dp</dimen>
+    <!-- This must be the negative of car_user_switcher_container_height for the animation. -->
+    <dimen name="car_user_switcher_container_anim_height">-420dp</dimen>
 </resources>
diff --git a/packages/CarSystemUI/res/values/dimens_car.xml b/packages/CarSystemUI/res/values/dimens_car.xml
deleted file mode 100644
index 9cb09c9..0000000
--- a/packages/CarSystemUI/res/values/dimens_car.xml
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- * Copyright (c) 2018, 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>
-    <!-- dimensions for the car user switcher -->
-    <dimen name="car_user_switcher_name_text_size">@*android:dimen/car_body1_size</dimen>
-    <dimen name="car_user_switcher_image_avatar_size">@*android:dimen/car_large_avatar_size</dimen>
-    <dimen name="car_user_switcher_vertical_spacing_between_users">@*android:dimen/car_padding_5</dimen>
-    <dimen name="car_user_switcher_vertical_spacing_between_name_and_avatar">@*android:dimen/car_padding_4</dimen>
-    <dimen name="car_user_switcher_margin_top">@*android:dimen/car_padding_4</dimen>
-
-    <dimen name="car_navigation_button_width">64dp</dimen>
-    <dimen name="car_navigation_bar_width">760dp</dimen>
-    <dimen name="car_left_navigation_bar_width">96dp</dimen>
-    <dimen name="car_right_navigation_bar_width">96dp</dimen>
-
-    <dimen name="car_qs_footer_height">112dp</dimen>
-    <dimen name="car_qs_footer_padding_bottom">16dp</dimen>
-    <dimen name="car_qs_footer_padding_top">16dp</dimen>
-    <dimen name="car_qs_footer_padding_end">46dp</dimen>
-    <dimen name="car_qs_footer_padding_start">46dp</dimen>
-    <dimen name="car_qs_footer_icon_width">56dp</dimen>
-    <dimen name="car_qs_footer_icon_height">56dp</dimen>
-    <dimen name="car_qs_footer_user_switch_icon_margin">5dp</dimen>
-    <dimen name="car_qs_footer_user_switch_icon_width">36dp</dimen>
-    <dimen name="car_qs_footer_user_name_text_size">@*android:dimen/car_body2_size</dimen>
-
-    <dimen name="car_user_switcher_container_height">420dp</dimen>
-    <!-- This must be the negative of car_user_switcher_container_height for the animation. -->
-    <dimen name="car_user_switcher_container_anim_height">-420dp</dimen>
-
-    <!-- dimensions for the unlock dialog -->
-    <dimen name="unlock_dialog_width">500dp</dimen>
-    <dimen name="unlock_dialog_radius">16dp</dimen>
-    <dimen name="unlock_dialog_avatar_size">100dp</dimen>
-    <dimen name="unlock_dialog_progress_bar_size">140dp</dimen>
-
-</resources>
diff --git a/packages/CarSystemUI/res/values/ids_car.xml b/packages/CarSystemUI/res/values/ids.xml
similarity index 100%
rename from packages/CarSystemUI/res/values/ids_car.xml
rename to packages/CarSystemUI/res/values/ids.xml
diff --git a/packages/CarSystemUI/res/values/integers.xml b/packages/CarSystemUI/res/values/integers.xml
index 8b87c74..5ae5555 100644
--- a/packages/CarSystemUI/res/values/integers.xml
+++ b/packages/CarSystemUI/res/values/integers.xml
@@ -16,5 +16,19 @@
 -->
 
 <resources>
-    <integer name="user_fullscreen_switcher_num_col">2</integer>
+    <!-- Full screen user switcher column number -->
+    <integer name="user_fullscreen_switcher_num_col">3</integer>
+
+    <!--Percentage of the screen height, from the bottom, that a notification panel being
+    partially closed at will result in it remaining open if released-->
+    <integer name="notification_settle_open_percentage">20</integer>
+    <!--Percentage of the screen height, from the bottom, that a notification panel being peeked
+    at will result in remaining closed the panel if released-->
+    <integer name="notification_settle_close_percentage">80</integer>
+
+    <!-- Timeout values in milliseconds for displaying volume dialog-->
+    <integer name="car_volume_dialog_display_normal_timeout">3000</integer>
+    <integer name="car_volume_dialog_display_hovering_timeout">16000</integer>
+    <integer name="car_volume_dialog_display_expanded_normal_timeout">6000</integer>
+    <integer name="car_volume_dialog_display_expanded_hovering_timeout">32000</integer>
 </resources>
diff --git a/packages/CarSystemUI/res/values/integers_car.xml b/packages/CarSystemUI/res/values/integers_car.xml
deleted file mode 100644
index d245f67..0000000
--- a/packages/CarSystemUI/res/values/integers_car.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  Copyright (c) 2018, The Android Open Source Project
-
-  Licensed under the Apache License, Version 2.0 (the "License");
-  you may not use this file except in compliance with the License.
-  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
--->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android">
-    <integer name="car_user_switcher_anim_cascade_delay_ms">27</integer>
-    <!-- Full screen user switcher column number TODO: move to support library-->
-    <integer name="user_fullscreen_switcher_num_col">3</integer>
-
-    <!--Percentage of the screen height, from the bottom, that a notification panel being
-    partially closed at will result in it remaining open if released-->
-    <integer name="notification_settle_open_percentage">20</integer>
-    <!--Percentage of the screen height, from the bottom, that a notification panel being peeked
-    at will result in remaining closed the panel if released-->
-    <integer name="notification_settle_close_percentage">80</integer>
-    <!-- The delay before the unlock dialog pops up -->
-    <integer name="unlock_dialog_delay_ms">0</integer>
-
-    <!-- Timeout values in milliseconds for displaying volume dialog-->
-    <integer name="car_volume_dialog_display_normal_timeout">3000</integer>
-    <integer name="car_volume_dialog_display_hovering_timeout">16000</integer>
-    <integer name="car_volume_dialog_display_expanded_normal_timeout">6000</integer>
-    <integer name="car_volume_dialog_display_expanded_hovering_timeout">32000</integer>
-</resources>
diff --git a/packages/CarSystemUI/res/values/strings.xml b/packages/CarSystemUI/res/values/strings.xml
index 9ea7ed0..881e746 100644
--- a/packages/CarSystemUI/res/values/strings.xml
+++ b/packages/CarSystemUI/res/values/strings.xml
@@ -22,4 +22,16 @@
     <string name="hvac_max_text">Max</string>
     <!-- Text for voice recognition toast. [CHAR LIMIT=60] -->
     <string name="voice_recognition_toast">Voice recognition now handled by connected Bluetooth device</string>
+    <!-- Name of Guest Profile. [CHAR LIMIT=30] -->
+    <string name="car_guest">Guest</string>
+    <!-- Title for button that starts a guest session. [CHAR LIMIT=30] -->
+    <string name="start_guest_session">Guest</string>
+    <!-- Title for button that  adds a new user. [CHAR LIMIT=30] -->
+    <string name="car_add_user">Add User</string>
+    <!-- Default name of the new user created. [CHAR LIMIT=30] -->
+    <string name="car_new_user">New User</string>
+    <!-- Message to inform user that creation of new user requires that user to set up their space. [CHAR LIMIT=100] -->
+    <string name="user_add_user_message_setup">When you add a new user, that person needs to set up their space.</string>
+    <!-- Message to inform user that the newly created user will have permissions to update apps for all other users. [CHAR LIMIT=100] -->
+    <string name="user_add_user_message_update">Any user can update apps for all other users.</string>
 </resources>
diff --git a/packages/CarSystemUI/res/values/strings_car.xml b/packages/CarSystemUI/res/values/strings_car.xml
deleted file mode 100644
index 717692e..0000000
--- a/packages/CarSystemUI/res/values/strings_car.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/**
- * Copyright (c) 2018, 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>
-    <!-- Name of Guest Profile. [CHAR LIMIT=30] -->
-    <string name="car_guest">Guest</string>
-    <!-- Title for button that starts a guest session. [CHAR LIMIT=30] -->
-    <string name="start_guest_session">Guest</string>
-    <!-- Title for button that  adds a new user. [CHAR LIMIT=30] -->
-    <string name="car_add_user">Add User</string>
-    <!-- Default name of the new user created. [CHAR LIMIT=30] -->
-    <string name="car_new_user">New User</string>
-    <!-- Message to inform user that creation of new user requires that user to set up their space. [CHAR LIMIT=100] -->
-    <string name="user_add_user_message_setup">When you add a new user, that person needs to set up their space.</string>
-    <!-- Message to inform user that the newly created user will have permissions to update apps for all other users. [CHAR LIMIT=100] -->
-    <string name="user_add_user_message_update">Any user can update apps for all other users.</string>
-    <!-- Default messages displayed on the unlock dialog before unlock advertising started. [CHAR LIMIT=30]-->
-    <string name="unlock_dialog_message_default">Waiting\u2026</string>
-    <!-- Message to inform user that the IHU is looking for trusted device. [CHAR LIMIT=30] -->
-    <string name="unlock_dialog_message_start">Looking for trusted device\u2026</string>
-
-    <!-- Cancel Button text for user who has PIN as security lock. [CHAR LIMIT=30] -->
-    <string name="unlock_dialog_button_text_pin">Enter PIN instead</string>
-    <!-- Cancel Button text for user who has Pattern as security lock. [CHAR LIMIT=30] -->
-    <string name="unlock_dialog_button_text_pattern">Enter Pattern instead</string>
-    <!-- Cancel Button text for user who has Password as security lock. [CHAR LIMIT=30] -->
-    <string name="unlock_dialog_button_text_password">Enter Password instead</string>
-    <!-- Default user name shows on unlock dialog -->
-    <string name="unlock_dialog_default_user_name">Default Name</string>
-    <!-- Default title for unlock dialog -->
-    <string name="unlock_dialog_title">Unlock Dialogue</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values/styles.xml b/packages/CarSystemUI/res/values/styles.xml
index a9423bf..371bebd 100644
--- a/packages/CarSystemUI/res/values/styles.xml
+++ b/packages/CarSystemUI/res/values/styles.xml
@@ -46,12 +46,4 @@
         <item name="android:layout_width">96dp</item>
         <item name="android:background">@drawable/nav_button_background</item>
     </style>
-
-    <style name="UnlockDialogButton">
-        <item name="android:background">?android:attr/selectableItemBackground</item>
-        <item name="android:textAlignment">center</item>
-        <item name="android:textColor">@color/unlock_dialog_enter_pin_text_color</item>
-        <item name="android:paddingHorizontal">16dp</item>
-        <item name="android:textAllCaps">false</item>
-    </style>
 </resources>
\ No newline at end of file
diff --git a/packages/CarSystemUI/src/com/android/systemui/CarSystemUIBinder.java b/packages/CarSystemUI/src/com/android/systemui/CarSystemUIBinder.java
index 59fa9d0..58e4b9a 100644
--- a/packages/CarSystemUI/src/com/android/systemui/CarSystemUIBinder.java
+++ b/packages/CarSystemUI/src/com/android/systemui/CarSystemUIBinder.java
@@ -18,19 +18,23 @@
 
 import com.android.systemui.biometrics.AuthController;
 import com.android.systemui.bubbles.dagger.BubbleModule;
+import com.android.systemui.car.navigationbar.CarNavigationBar;
 import com.android.systemui.car.notification.CarNotificationModule;
+import com.android.systemui.car.statusbar.CarStatusBar;
+import com.android.systemui.car.statusbar.CarStatusBarModule;
+import com.android.systemui.car.voicerecognition.ConnectedDeviceVoiceRecognitionNotifier;
+import com.android.systemui.car.volume.VolumeUI;
+import com.android.systemui.car.window.OverlayWindowModule;
+import com.android.systemui.car.window.SystemUIOverlayWindowManager;
 import com.android.systemui.globalactions.GlobalActionsComponent;
 import com.android.systemui.keyguard.KeyguardViewMediator;
 import com.android.systemui.keyguard.dagger.KeyguardModule;
-import com.android.systemui.navigationbar.car.CarNavigationBar;
 import com.android.systemui.pip.PipUI;
 import com.android.systemui.power.PowerUI;
 import com.android.systemui.recents.Recents;
 import com.android.systemui.recents.RecentsModule;
 import com.android.systemui.shortcut.ShortcutKeyDispatcher;
 import com.android.systemui.stackdivider.Divider;
-import com.android.systemui.statusbar.car.CarStatusBar;
-import com.android.systemui.statusbar.car.CarStatusBarModule;
 import com.android.systemui.statusbar.notification.InstantAppNotifier;
 import com.android.systemui.statusbar.notification.dagger.NotificationsModule;
 import com.android.systemui.statusbar.phone.StatusBar;
@@ -38,10 +42,6 @@
 import com.android.systemui.theme.ThemeOverlayController;
 import com.android.systemui.toast.ToastUI;
 import com.android.systemui.util.leak.GarbageMonitor;
-import com.android.systemui.voicerecognition.car.ConnectedDeviceVoiceRecognitionNotifier;
-import com.android.systemui.volume.VolumeUI;
-import com.android.systemui.window.OverlayWindowModule;
-import com.android.systemui.window.SystemUIOverlayWindowManager;
 
 import dagger.Binds;
 import dagger.Module;
@@ -65,7 +65,7 @@
     @ClassKey(Divider.class)
     public abstract SystemUI bindDivider(Divider sysui);
 
-    /** */
+    /** Inject Car Navigation Bar. */
     @Binds
     @IntoMap
     @ClassKey(CarNavigationBar.class)
diff --git a/packages/CarSystemUI/src/com/android/systemui/CarSystemUIModule.java b/packages/CarSystemUI/src/com/android/systemui/CarSystemUIModule.java
index 4ea48ba..f066bf5 100644
--- a/packages/CarSystemUI/src/com/android/systemui/CarSystemUIModule.java
+++ b/packages/CarSystemUI/src/com/android/systemui/CarSystemUIModule.java
@@ -25,6 +25,9 @@
 import com.android.systemui.car.CarDeviceProvisionedController;
 import com.android.systemui.car.CarDeviceProvisionedControllerImpl;
 import com.android.systemui.car.keyguard.CarKeyguardViewController;
+import com.android.systemui.car.statusbar.CarStatusBar;
+import com.android.systemui.car.statusbar.CarStatusBarKeyguardViewManager;
+import com.android.systemui.car.volume.CarVolumeDialogComponent;
 import com.android.systemui.dagger.SystemUIRootComponent;
 import com.android.systemui.dock.DockManager;
 import com.android.systemui.dock.DockManagerImpl;
@@ -39,8 +42,6 @@
 import com.android.systemui.statusbar.CommandQueue;
 import com.android.systemui.statusbar.NotificationLockscreenUserManager;
 import com.android.systemui.statusbar.NotificationLockscreenUserManagerImpl;
-import com.android.systemui.statusbar.car.CarStatusBar;
-import com.android.systemui.statusbar.car.CarStatusBarKeyguardViewManager;
 import com.android.systemui.statusbar.notification.NotificationEntryManager;
 import com.android.systemui.statusbar.phone.HeadsUpManagerPhone;
 import com.android.systemui.statusbar.phone.KeyguardBypassController;
@@ -55,7 +56,6 @@
 import com.android.systemui.statusbar.policy.ConfigurationController;
 import com.android.systemui.statusbar.policy.DeviceProvisionedController;
 import com.android.systemui.statusbar.policy.HeadsUpManager;
-import com.android.systemui.volume.CarVolumeDialogComponent;
 import com.android.systemui.volume.VolumeDialogComponent;
 
 import javax.inject.Named;
@@ -87,9 +87,6 @@
                 groupManager, configurationController);
     }
 
-    @Binds
-    abstract HeadsUpManager bindHeadsUpManagerPhone(HeadsUpManagerPhone headsUpManagerPhone);
-
     @Singleton
     @Provides
     @Named(LEAK_REPORT_EMAIL_NAME)
@@ -97,6 +94,16 @@
         return "[email protected]";
     }
 
+    @Provides
+    @Singleton
+    static Recents provideRecents(Context context, RecentsImplementation recentsImplementation,
+            CommandQueue commandQueue) {
+        return new Recents(context, recentsImplementation, commandQueue);
+    }
+
+    @Binds
+    abstract HeadsUpManager bindHeadsUpManagerPhone(HeadsUpManagerPhone headsUpManagerPhone);
+
     @Binds
     abstract EnhancedEstimates bindEnhancedEstimates(EnhancedEstimatesImpl enhancedEstimates);
 
@@ -123,13 +130,6 @@
     @Binds
     abstract ShadeController provideShadeController(ShadeControllerImpl shadeController);
 
-    @Provides
-    @Singleton
-    static Recents provideRecents(Context context, RecentsImplementation recentsImplementation,
-            CommandQueue commandQueue) {
-        return new Recents(context, recentsImplementation, commandQueue);
-    }
-
     @Binds
     abstract SystemUIRootComponent bindSystemUIRootComponent(
             CarSystemUIRootComponent systemUIRootComponent);
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/bluetooth/CarBatteryController.java b/packages/CarSystemUI/src/com/android/systemui/car/bluetooth/CarBatteryController.java
new file mode 100644
index 0000000..9b5e2712
--- /dev/null
+++ b/packages/CarSystemUI/src/com/android/systemui/car/bluetooth/CarBatteryController.java
@@ -0,0 +1,292 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.car.bluetooth;
+
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothDevice;
+import android.bluetooth.BluetoothHeadsetClient;
+import android.bluetooth.BluetoothProfile;
+import android.bluetooth.BluetoothProfile.ServiceListener;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.Bundle;
+import android.util.Log;
+
+import com.android.systemui.statusbar.policy.BatteryController;
+
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+
+/**
+ * A {@link BatteryController} that is specific to the Auto use-case. For Auto, the battery icon
+ * displays the battery status of a device that is connected via bluetooth and not the system's
+ * battery.
+ */
+public class CarBatteryController extends BroadcastReceiver implements BatteryController {
+    private static final String TAG = "CarBatteryController";
+
+    // According to the Bluetooth HFP 1.5 specification, battery levels are indicated by a
+    // value from 1-5, where these values represent the following:
+    // 0%% - 0, 1-25%% - 1, 26-50%% - 2, 51-75%% - 3, 76-99%% - 4, 100%% - 5
+    // As a result, set the level as the average within that range.
+    private static final int BATTERY_LEVEL_EMPTY = 0;
+    private static final int BATTERY_LEVEL_1 = 12;
+    private static final int BATTERY_LEVEL_2 = 28;
+    private static final int BATTERY_LEVEL_3 = 63;
+    private static final int BATTERY_LEVEL_4 = 87;
+    private static final int BATTERY_LEVEL_FULL = 100;
+
+    private static final int INVALID_BATTERY_LEVEL = -1;
+
+    private final Context mContext;
+
+    private final BluetoothAdapter mAdapter = BluetoothAdapter.getDefaultAdapter();
+    private final ArrayList<BatteryStateChangeCallback> mChangeCallbacks = new ArrayList<>();
+    private BluetoothHeadsetClient mBluetoothHeadsetClient;
+    private final ServiceListener mHfpServiceListener = new ServiceListener() {
+        @Override
+        public void onServiceConnected(int profile, BluetoothProfile proxy) {
+            if (profile == BluetoothProfile.HEADSET_CLIENT) {
+                mBluetoothHeadsetClient = (BluetoothHeadsetClient) proxy;
+            }
+        }
+
+        @Override
+        public void onServiceDisconnected(int profile) {
+            if (profile == BluetoothProfile.HEADSET_CLIENT) {
+                mBluetoothHeadsetClient = null;
+            }
+        }
+    };
+    private int mLevel;
+    private BatteryViewHandler mBatteryViewHandler;
+
+    public CarBatteryController(Context context) {
+        mContext = context;
+
+        if (mAdapter == null) {
+            return;
+        }
+
+        mAdapter.getProfileProxy(context.getApplicationContext(), mHfpServiceListener,
+                BluetoothProfile.HEADSET_CLIENT);
+    }
+
+    @Override
+    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
+        pw.println("CarBatteryController state:");
+        pw.print("    mLevel=");
+        pw.println(mLevel);
+    }
+
+    @Override
+    public void setPowerSaveMode(boolean powerSave) {
+        // No-op. No power save mode for the car.
+    }
+
+    @Override
+    public void addCallback(BatteryController.BatteryStateChangeCallback cb) {
+        mChangeCallbacks.add(cb);
+
+        // There is no way to know if the phone is plugged in or charging via bluetooth, so pass
+        // false for these values.
+        cb.onBatteryLevelChanged(mLevel, false /* pluggedIn */, false /* charging */);
+        cb.onPowerSaveChanged(false /* isPowerSave */);
+    }
+
+    @Override
+    public void removeCallback(BatteryController.BatteryStateChangeCallback cb) {
+        mChangeCallbacks.remove(cb);
+    }
+
+    /** Sets {@link BatteryViewHandler}. */
+    public void addBatteryViewHandler(BatteryViewHandler batteryViewHandler) {
+        mBatteryViewHandler = batteryViewHandler;
+    }
+
+    /** Starts listening for bluetooth broadcast messages. */
+    public void startListening() {
+        IntentFilter filter = new IntentFilter();
+        filter.addAction(BluetoothHeadsetClient.ACTION_CONNECTION_STATE_CHANGED);
+        filter.addAction(BluetoothHeadsetClient.ACTION_AG_EVENT);
+        mContext.registerReceiver(this, filter);
+    }
+
+    /** Stops listening for bluetooth broadcast messages. */
+    public void stopListening() {
+        mContext.unregisterReceiver(this);
+    }
+
+    @Override
+    public void onReceive(Context context, Intent intent) {
+        String action = intent.getAction();
+
+        if (Log.isLoggable(TAG, Log.DEBUG)) {
+            Log.d(TAG, "onReceive(). action: " + action);
+        }
+
+        if (BluetoothHeadsetClient.ACTION_AG_EVENT.equals(action)) {
+            if (Log.isLoggable(TAG, Log.DEBUG)) {
+                Log.d(TAG, "Received ACTION_AG_EVENT");
+            }
+
+            int batteryLevel = intent.getIntExtra(BluetoothHeadsetClient.EXTRA_BATTERY_LEVEL,
+                    INVALID_BATTERY_LEVEL);
+
+            updateBatteryLevel(batteryLevel);
+
+            if (batteryLevel != INVALID_BATTERY_LEVEL && mBatteryViewHandler != null) {
+                mBatteryViewHandler.showBatteryView();
+            }
+        } else if (BluetoothHeadsetClient.ACTION_CONNECTION_STATE_CHANGED.equals(action)) {
+            int newState = intent.getIntExtra(BluetoothProfile.EXTRA_STATE, -1);
+
+            if (Log.isLoggable(TAG, Log.DEBUG)) {
+                int oldState = intent.getIntExtra(BluetoothProfile.EXTRA_PREVIOUS_STATE, -1);
+                Log.d(TAG, "ACTION_CONNECTION_STATE_CHANGED event: "
+                        + oldState + " -> " + newState);
+
+            }
+            BluetoothDevice device =
+                    (BluetoothDevice) intent.getExtra(BluetoothDevice.EXTRA_DEVICE);
+            updateBatteryIcon(device, newState);
+        }
+    }
+
+    /**
+     * Converts the battery level to a percentage that can be displayed on-screen and notifies
+     * any {@link BatteryStateChangeCallback}s of this.
+     */
+    private void updateBatteryLevel(int batteryLevel) {
+        if (batteryLevel == INVALID_BATTERY_LEVEL) {
+            if (Log.isLoggable(TAG, Log.DEBUG)) {
+                Log.d(TAG, "Battery level invalid. Ignoring.");
+            }
+            return;
+        }
+
+        // The battery level is a value between 0-5. Let the default battery level be 0.
+        switch (batteryLevel) {
+            case 5:
+                mLevel = BATTERY_LEVEL_FULL;
+                break;
+            case 4:
+                mLevel = BATTERY_LEVEL_4;
+                break;
+            case 3:
+                mLevel = BATTERY_LEVEL_3;
+                break;
+            case 2:
+                mLevel = BATTERY_LEVEL_2;
+                break;
+            case 1:
+                mLevel = BATTERY_LEVEL_1;
+                break;
+            case 0:
+            default:
+                mLevel = BATTERY_LEVEL_EMPTY;
+        }
+
+        if (Log.isLoggable(TAG, Log.DEBUG)) {
+            Log.d(TAG, "Battery level: " + batteryLevel + "; setting mLevel as: " + mLevel);
+        }
+
+        notifyBatteryLevelChanged();
+    }
+
+    /**
+     * Updates the display of the battery icon depending on the given connection state from the
+     * given {@link BluetoothDevice}.
+     */
+    private void updateBatteryIcon(BluetoothDevice device, int newState) {
+        if (newState == BluetoothProfile.STATE_CONNECTED) {
+            if (Log.isLoggable(TAG, Log.DEBUG)) {
+                Log.d(TAG, "Device connected");
+            }
+
+            if (mBatteryViewHandler != null) {
+                mBatteryViewHandler.showBatteryView();
+            }
+
+            if (mBluetoothHeadsetClient == null || device == null) {
+                return;
+            }
+
+            // Check if battery information is available and immediately update.
+            Bundle featuresBundle = mBluetoothHeadsetClient.getCurrentAgEvents(device);
+            if (featuresBundle == null) {
+                return;
+            }
+
+            int batteryLevel = featuresBundle.getInt(BluetoothHeadsetClient.EXTRA_BATTERY_LEVEL,
+                    INVALID_BATTERY_LEVEL);
+            updateBatteryLevel(batteryLevel);
+        } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
+            if (Log.isLoggable(TAG, Log.DEBUG)) {
+                Log.d(TAG, "Device disconnected");
+            }
+
+            if (mBatteryViewHandler != null) {
+                mBatteryViewHandler.hideBatteryView();
+            }
+        }
+    }
+
+    @Override
+    public void dispatchDemoCommand(String command, Bundle args) {
+        // TODO: Car demo mode.
+    }
+
+    @Override
+    public boolean isPluggedIn() {
+        return true;
+    }
+
+    @Override
+    public boolean isPowerSave() {
+        // Power save is not valid for the car, so always return false.
+        return false;
+    }
+
+    @Override
+    public boolean isAodPowerSave() {
+        return false;
+    }
+
+    private void notifyBatteryLevelChanged() {
+        for (int i = 0, size = mChangeCallbacks.size(); i < size; i++) {
+            mChangeCallbacks.get(i)
+                    .onBatteryLevelChanged(mLevel, false /* pluggedIn */, false /* charging */);
+        }
+    }
+
+    /**
+     * An interface indicating the container of a View that will display what the information
+     * in the {@link CarBatteryController}.
+     */
+    public interface BatteryViewHandler {
+        /** Hides the battery view. */
+        void hideBatteryView();
+
+        /** Shows the battery view. */
+        void showBatteryView();
+    }
+
+}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/bluetooth/ConnectedDeviceSignalController.java b/packages/CarSystemUI/src/com/android/systemui/car/bluetooth/ConnectedDeviceSignalController.java
new file mode 100644
index 0000000..4642868
--- /dev/null
+++ b/packages/CarSystemUI/src/com/android/systemui/car/bluetooth/ConnectedDeviceSignalController.java
@@ -0,0 +1,272 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.car.bluetooth;
+
+import static com.android.systemui.statusbar.phone.StatusBar.DEBUG;
+
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothDevice;
+import android.bluetooth.BluetoothHeadsetClient;
+import android.bluetooth.BluetoothProfile;
+import android.bluetooth.BluetoothProfile.ServiceListener;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.Bundle;
+import android.telephony.SignalStrength;
+import android.util.Log;
+import android.util.TypedValue;
+import android.view.View;
+import android.widget.ImageView;
+
+import com.android.settingslib.graph.SignalDrawable;
+import com.android.systemui.Dependency;
+import com.android.systemui.R;
+import com.android.systemui.statusbar.ScalingDrawableWrapper;
+import com.android.systemui.statusbar.policy.BluetoothController;
+
+/**
+ * Controller that monitors signal strength for a device that is connected via bluetooth.
+ */
+public class ConnectedDeviceSignalController extends BroadcastReceiver implements
+        BluetoothController.Callback {
+    private static final String TAG = "DeviceSignalCtlr";
+
+    /**
+     * The value that indicates if a network is unavailable. This value is according ot the
+     * Bluetooth HFP 1.5 spec, which indicates this value is one of two: 0 or 1. These stand
+     * for network unavailable and available respectively.
+     */
+    private static final int NETWORK_UNAVAILABLE = 0;
+    private static final int NETWORK_UNAVAILABLE_ICON_ID = R.drawable.stat_sys_signal_null;
+
+    /**
+     * All possible signal strength icons. According to the Bluetooth HFP 1.5 specification,
+     * signal strength is indicated by a value from 1-5, where these values represent the following:
+     *
+     * <p>0%% - 0, 1-25%% - 1, 26-50%% - 2, 51-75%% - 3, 76-99%% - 4, 100%% - 5
+     *
+     * <p>As a result, these are treated as an index into this array for the corresponding icon.
+     * Note that the icon is the same for 0 and 1.
+     */
+    private static final int[] SIGNAL_STRENGTH_ICONS = {
+            0,
+            0,
+            1,
+            2,
+            3,
+            4,
+    };
+
+    private static final int INVALID_SIGNAL = -1;
+
+    private final BluetoothAdapter mAdapter = BluetoothAdapter.getDefaultAdapter();
+    private final Context mContext;
+    private final BluetoothController mController;
+
+    private final View mSignalsView;
+    private final ImageView mNetworkSignalView;
+
+    private final float mIconScaleFactor;
+    private final SignalDrawable mSignalDrawable;
+
+    private BluetoothHeadsetClient mBluetoothHeadsetClient;
+    private final ServiceListener mHfpServiceListener = new ServiceListener() {
+        @Override
+        public void onServiceConnected(int profile, BluetoothProfile proxy) {
+            if (profile == BluetoothProfile.HEADSET_CLIENT) {
+                mBluetoothHeadsetClient = (BluetoothHeadsetClient) proxy;
+            }
+        }
+
+        @Override
+        public void onServiceDisconnected(int profile) {
+            if (profile == BluetoothProfile.HEADSET_CLIENT) {
+                mBluetoothHeadsetClient = null;
+            }
+        }
+    };
+
+    public ConnectedDeviceSignalController(Context context, View signalsView) {
+        mContext = context;
+        mController = Dependency.get(BluetoothController.class);
+
+        mSignalsView = signalsView;
+        mNetworkSignalView = (ImageView)
+                mSignalsView.findViewById(R.id.connected_device_network_signal);
+
+        TypedValue typedValue = new TypedValue();
+        context.getResources().getValue(R.dimen.status_bar_icon_scale_factor, typedValue, true);
+        mIconScaleFactor = typedValue.getFloat();
+        mSignalDrawable = new SignalDrawable(mNetworkSignalView.getContext());
+        mNetworkSignalView.setImageDrawable(
+                new ScalingDrawableWrapper(mSignalDrawable, mIconScaleFactor));
+
+        if (mAdapter == null) {
+            return;
+        }
+
+        mAdapter.getProfileProxy(context.getApplicationContext(), mHfpServiceListener,
+                BluetoothProfile.HEADSET_CLIENT);
+    }
+
+    /** Starts listening for bluetooth broadcast messages. */
+    public void startListening() {
+        IntentFilter filter = new IntentFilter();
+        filter.addAction(BluetoothHeadsetClient.ACTION_CONNECTION_STATE_CHANGED);
+        filter.addAction(BluetoothHeadsetClient.ACTION_AG_EVENT);
+        mContext.registerReceiver(this, filter);
+
+        mController.addCallback(this);
+    }
+
+    /** Stops listening for bluetooth broadcast messages. */
+    public void stopListening() {
+        mContext.unregisterReceiver(this);
+        mController.removeCallback(this);
+    }
+
+    @Override
+    public void onBluetoothDevicesChanged() {
+        // Nothing to do here because this Controller is not displaying a list of possible
+        // bluetooth devices.
+    }
+
+    @Override
+    public void onBluetoothStateChange(boolean enabled) {
+        if (DEBUG) {
+            Log.d(TAG, "onBluetoothStateChange(). enabled: " + enabled);
+        }
+
+        // Only need to handle the case if bluetooth has been disabled, in which case the
+        // signal indicators are hidden. If bluetooth has been enabled, then this class should
+        // receive updates to the connection state via onReceive().
+        if (!enabled) {
+            mNetworkSignalView.setVisibility(View.GONE);
+            mSignalsView.setVisibility(View.GONE);
+        }
+    }
+
+    @Override
+    public void onReceive(Context context, Intent intent) {
+        String action = intent.getAction();
+
+        if (DEBUG) {
+            Log.d(TAG, "onReceive(). action: " + action);
+        }
+
+        if (BluetoothHeadsetClient.ACTION_AG_EVENT.equals(action)) {
+            if (DEBUG) {
+                Log.d(TAG, "Received ACTION_AG_EVENT");
+            }
+
+            processActionAgEvent(intent);
+        } else if (BluetoothHeadsetClient.ACTION_CONNECTION_STATE_CHANGED.equals(action)) {
+            int newState = intent.getIntExtra(BluetoothProfile.EXTRA_STATE, -1);
+
+            if (DEBUG) {
+                int oldState = intent.getIntExtra(BluetoothProfile.EXTRA_PREVIOUS_STATE, -1);
+                Log.d(TAG, "ACTION_CONNECTION_STATE_CHANGED event: "
+                        + oldState + " -> " + newState);
+            }
+            BluetoothDevice device =
+                    (BluetoothDevice) intent.getExtra(BluetoothDevice.EXTRA_DEVICE);
+            updateViewVisibility(device, newState);
+        }
+    }
+
+    /**
+     * Processes an {@link Intent} that had an action of
+     * {@link BluetoothHeadsetClient#ACTION_AG_EVENT}.
+     */
+    private void processActionAgEvent(Intent intent) {
+        int networkStatus = intent.getIntExtra(BluetoothHeadsetClient.EXTRA_NETWORK_STATUS,
+                INVALID_SIGNAL);
+        if (networkStatus != INVALID_SIGNAL) {
+            if (DEBUG) {
+                Log.d(TAG, "EXTRA_NETWORK_STATUS: " + " " + networkStatus);
+            }
+
+            if (networkStatus == NETWORK_UNAVAILABLE) {
+                setNetworkSignalIcon(NETWORK_UNAVAILABLE_ICON_ID);
+            }
+        }
+
+        int signalStrength = intent.getIntExtra(
+                BluetoothHeadsetClient.EXTRA_NETWORK_SIGNAL_STRENGTH, INVALID_SIGNAL);
+        if (signalStrength != INVALID_SIGNAL) {
+            if (DEBUG) {
+                Log.d(TAG, "EXTRA_NETWORK_SIGNAL_STRENGTH: " + signalStrength);
+            }
+
+            setNetworkSignalIcon(SIGNAL_STRENGTH_ICONS[signalStrength]);
+        }
+
+        int roamingStatus = intent.getIntExtra(BluetoothHeadsetClient.EXTRA_NETWORK_ROAMING,
+                INVALID_SIGNAL);
+        if (roamingStatus != INVALID_SIGNAL) {
+            if (DEBUG) {
+                Log.d(TAG, "EXTRA_NETWORK_ROAMING: " + roamingStatus);
+            }
+        }
+    }
+
+    private void setNetworkSignalIcon(int level) {
+        // Setting the icon on a child view of mSignalView, so toggle this container visible.
+        mSignalsView.setVisibility(View.VISIBLE);
+
+        mSignalDrawable.setLevel(SignalDrawable.getState(level,
+                SignalStrength.NUM_SIGNAL_STRENGTH_BINS, false));
+        mNetworkSignalView.setVisibility(View.VISIBLE);
+    }
+
+    private void updateViewVisibility(BluetoothDevice device, int newState) {
+        if (newState == BluetoothProfile.STATE_CONNECTED) {
+            if (DEBUG) {
+                Log.d(TAG, "Device connected");
+            }
+
+            if (mBluetoothHeadsetClient == null || device == null) {
+                return;
+            }
+
+            // Check if battery information is available and immediately update.
+            Bundle featuresBundle = mBluetoothHeadsetClient.getCurrentAgEvents(device);
+            if (featuresBundle == null) {
+                return;
+            }
+
+            int signalStrength = featuresBundle.getInt(
+                    BluetoothHeadsetClient.EXTRA_NETWORK_SIGNAL_STRENGTH, INVALID_SIGNAL);
+            if (signalStrength != INVALID_SIGNAL) {
+                if (DEBUG) {
+                    Log.d(TAG, "EXTRA_NETWORK_SIGNAL_STRENGTH: " + signalStrength);
+                }
+
+                setNetworkSignalIcon(SIGNAL_STRENGTH_ICONS[signalStrength]);
+            }
+        } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
+            if (DEBUG) {
+                Log.d(TAG, "Device disconnected");
+            }
+
+            mNetworkSignalView.setVisibility(View.GONE);
+            mSignalsView.setVisibility(View.GONE);
+        }
+    }
+}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/hvac/AnimatedTemperatureView.java b/packages/CarSystemUI/src/com/android/systemui/car/hvac/AnimatedTemperatureView.java
new file mode 100644
index 0000000..a729431
--- /dev/null
+++ b/packages/CarSystemUI/src/com/android/systemui/car/hvac/AnimatedTemperatureView.java
@@ -0,0 +1,277 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.car.hvac;
+
+import android.animation.ObjectAnimator;
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Color;
+import android.graphics.Rect;
+import android.graphics.drawable.ColorDrawable;
+import android.util.AttributeSet;
+import android.util.Property;
+import android.view.Gravity;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.ViewTreeObserver;
+import android.widget.FrameLayout;
+import android.widget.ImageView;
+import android.widget.TextSwitcher;
+import android.widget.TextView;
+
+import com.android.systemui.R;
+
+/**
+ * Simple text display of HVAC properties, It is designed to show mTemperature and is configured in
+ * the XML.
+ * XML properties:
+ * hvacPropertyId - Example: CarHvacManager.ID_ZONED_TEMP_SETPOINT (16385)
+ * hvacAreaId - Example: VehicleSeat.SEAT_ROW_1_LEFT (1)
+ * hvacTempFormat - Example: "%.1f\u00B0" (1 decimal and the degree symbol)
+ * hvacOrientaion = Example: left
+ */
+public class AnimatedTemperatureView extends FrameLayout implements TemperatureView {
+
+    private static final float TEMPERATURE_EQUIVALENT_DELTA = .01f;
+    private static final Property<ColorDrawable, Integer> COLOR_PROPERTY =
+            new Property<ColorDrawable, Integer>(Integer.class, "color") {
+
+                @Override
+                public Integer get(ColorDrawable object) {
+                    return object.getColor();
+                }
+
+                @Override
+                public void set(ColorDrawable object, Integer value) {
+                    object.setColor(value);
+                }
+            };
+
+    static boolean isHorizontal(int gravity) {
+        return Gravity.isHorizontal(gravity)
+                && (gravity & Gravity.HORIZONTAL_GRAVITY_MASK) != Gravity.CENTER_HORIZONTAL;
+    }
+
+    @SuppressLint("RtlHardcoded")
+    static boolean isLeft(int gravity, int layoutDirection) {
+        return Gravity
+                .getAbsoluteGravity(gravity & Gravity.HORIZONTAL_GRAVITY_MASK, layoutDirection)
+                == Gravity.LEFT;
+    }
+
+    static boolean isVertical(int gravity) {
+        return Gravity.isVertical(gravity)
+                && (gravity & Gravity.VERTICAL_GRAVITY_MASK) != Gravity.CENTER_VERTICAL;
+    }
+
+    static boolean isTop(int gravity) {
+        return (gravity & Gravity.VERTICAL_GRAVITY_MASK) == Gravity.TOP;
+    }
+
+    private final int mAreaId;
+    private final int mPropertyId;
+    private final int mPivotOffset;
+    private final int mGravity;
+    private final int mTextAppearanceRes;
+    private final int mMinEms;
+    private final Rect mPaddingRect;
+    private final float mMinValue;
+    private final float mMaxValue;
+
+    private final ColorDrawable mBackgroundColor;
+
+    private final TemperatureColorStore mColorStore = new TemperatureColorStore();
+    private final TemperatureBackgroundAnimator mBackgroundAnimator;
+    private final TemperatureTextAnimator mTextAnimator;
+    boolean mDisplayInFahrenheit = false;
+
+    public AnimatedTemperatureView(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        TypedArray typedArray = context.obtainStyledAttributes(attrs,
+                R.styleable.AnimatedTemperatureView);
+        mAreaId = typedArray.getInt(R.styleable.AnimatedTemperatureView_hvacAreaId, -1);
+        mPropertyId = typedArray.getInt(R.styleable.AnimatedTemperatureView_hvacPropertyId, -1);
+        mPivotOffset =
+                typedArray.getDimensionPixelOffset(
+                        R.styleable.AnimatedTemperatureView_hvacPivotOffset, 0);
+        mGravity = typedArray.getInt(R.styleable.AnimatedTemperatureView_android_gravity,
+                Gravity.START);
+        mTextAppearanceRes =
+                typedArray.getResourceId(R.styleable.AnimatedTemperatureView_android_textAppearance,
+                        0);
+        mMinEms = typedArray.getInteger(R.styleable.AnimatedTemperatureView_android_minEms, 0);
+        mMinValue = typedArray.getFloat(R.styleable.AnimatedTemperatureView_hvacMinValue,
+                Float.NaN);
+        mMaxValue = typedArray.getFloat(R.styleable.AnimatedTemperatureView_hvacMaxValue,
+                Float.NaN);
+
+
+        mPaddingRect =
+                new Rect(getPaddingLeft(), getPaddingTop(), getPaddingRight(), getPaddingBottom());
+        setPadding(0, 0, 0, 0);
+
+        setClipChildren(false);
+        setClipToPadding(false);
+
+        // init Views
+        TextSwitcher textSwitcher = new TextSwitcher(context);
+        textSwitcher.setFactory(this::generateTextView);
+        ImageView background = new ImageView(context);
+        mBackgroundColor = new ColorDrawable(Color.TRANSPARENT);
+        background.setImageDrawable(mBackgroundColor);
+        background.setVisibility(View.GONE);
+
+        mBackgroundAnimator = new TemperatureBackgroundAnimator(this, background);
+
+
+        String format = typedArray.getString(R.styleable.AnimatedTemperatureView_hvacTempFormat);
+        format = (format == null) ? "%.1f\u00B0" : format;
+        CharSequence minText = typedArray.getString(
+                R.styleable.AnimatedTemperatureView_hvacMinText);
+        CharSequence maxText = typedArray.getString(
+                R.styleable.AnimatedTemperatureView_hvacMaxText);
+        mTextAnimator = new TemperatureTextAnimator(this, textSwitcher, format, mPivotOffset,
+                minText, maxText);
+
+        addView(background, ViewGroup.LayoutParams.MATCH_PARENT,
+                ViewGroup.LayoutParams.MATCH_PARENT);
+        addView(textSwitcher, ViewGroup.LayoutParams.MATCH_PARENT,
+                ViewGroup.LayoutParams.MATCH_PARENT);
+
+        typedArray.recycle();
+    }
+
+
+    private TextView generateTextView() {
+        TextView textView = new TextView(getContext());
+        textView.setTextAppearance(mTextAppearanceRes);
+        textView.setAllCaps(true);
+        textView.setMinEms(mMinEms);
+        textView.setGravity(mGravity);
+        textView.setPadding(mPaddingRect.left, mPaddingRect.top, mPaddingRect.right,
+                mPaddingRect.bottom);
+        textView.getViewTreeObserver()
+                .addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
+                    @Override
+                    public boolean onPreDraw() {
+                        if (isHorizontal(mGravity)) {
+                            if (isLeft(mGravity, getLayoutDirection())) {
+                                textView.setPivotX(-mPivotOffset);
+                            } else {
+                                textView.setPivotX(textView.getWidth() + mPivotOffset);
+                            }
+                        }
+                        textView.getViewTreeObserver().removeOnPreDrawListener(this);
+                        return true;
+                    }
+                });
+        textView.setLayoutParams(new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
+                ViewGroup.LayoutParams.MATCH_PARENT));
+
+        return textView;
+    }
+
+    /**
+     * Formats the float for display
+     *
+     * @param temp - The current temp or NaN
+     */
+    @Override
+    public void setTemp(float temp) {
+        if (mDisplayInFahrenheit) {
+            temp = convertToFahrenheit(temp);
+        }
+        mTextAnimator.setTemp(temp);
+        if (Float.isNaN(temp)) {
+            mBackgroundAnimator.hideCircle();
+            return;
+        }
+        int color;
+        if (isMinValue(temp)) {
+            color = mColorStore.getMinColor();
+        } else if (isMaxValue(temp)) {
+            color = mColorStore.getMaxColor();
+        } else {
+            color = mColorStore.getColorForTemperature(temp);
+        }
+        if (mBackgroundAnimator.isOpen()) {
+            ObjectAnimator colorAnimator =
+                    ObjectAnimator.ofInt(mBackgroundColor, COLOR_PROPERTY, color);
+            colorAnimator.setEvaluator((fraction, startValue, endValue) -> mColorStore
+                    .lerpColor(fraction, (int) startValue, (int) endValue));
+            colorAnimator.start();
+        } else {
+            mBackgroundColor.setColor(color);
+        }
+
+        mBackgroundAnimator.animateOpen();
+    }
+
+    @Override
+    public void setDisplayInFahrenheit(boolean displayInFahrenheit) {
+        mDisplayInFahrenheit = displayInFahrenheit;
+    }
+
+    boolean isMinValue(float temp) {
+        return !Float.isNaN(mMinValue) && isApproxEqual(temp, mMinValue);
+    }
+
+    boolean isMaxValue(float temp) {
+        return !Float.isNaN(mMaxValue) && isApproxEqual(temp, mMaxValue);
+    }
+
+    private boolean isApproxEqual(float left, float right) {
+        return Math.abs(left - right) <= TEMPERATURE_EQUIVALENT_DELTA;
+    }
+
+    int getGravity() {
+        return mGravity;
+    }
+
+    int getPivotOffset() {
+        return mPivotOffset;
+    }
+
+    Rect getPaddingRect() {
+        return mPaddingRect;
+    }
+
+    /**
+     * @return propertiyId  Example: CarHvacManager.ID_ZONED_TEMP_SETPOINT (358614275)
+     */
+    @Override
+    public int getPropertyId() {
+        return mPropertyId;
+    }
+
+    /**
+     * @return hvac AreaId - Example: VehicleSeat.SEAT_ROW_1_LEFT (1)
+     */
+    @Override
+    public int getAreaId() {
+        return mAreaId;
+    }
+
+    @Override
+    protected void onDetachedFromWindow() {
+        super.onDetachedFromWindow();
+        mBackgroundAnimator.stopAnimations();
+    }
+
+}
+
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/hvac/HvacController.java b/packages/CarSystemUI/src/com/android/systemui/car/hvac/HvacController.java
new file mode 100644
index 0000000..af8ddb6
--- /dev/null
+++ b/packages/CarSystemUI/src/com/android/systemui/car/hvac/HvacController.java
@@ -0,0 +1,221 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.car.hvac;
+
+import static android.car.VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL;
+import static android.car.VehiclePropertyIds.HVAC_TEMPERATURE_DISPLAY_UNITS;
+
+import android.car.Car;
+import android.car.VehicleUnit;
+import android.car.hardware.CarPropertyValue;
+import android.car.hardware.hvac.CarHvacManager;
+import android.car.hardware.hvac.CarHvacManager.CarHvacEventCallback;
+import android.util.Log;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.android.systemui.car.CarServiceProvider;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+/**
+ * Manages the connection to the Car service and delegates value changes to the registered
+ * {@link TemperatureView}s
+ */
+@Singleton
+public class HvacController {
+    public static final String TAG = "HvacController";
+
+    private final CarServiceProvider mCarServiceProvider;
+    private final Set<TemperatureView> mRegisteredViews = new HashSet<>();
+
+    private CarHvacManager mHvacManager;
+    private HashMap<HvacKey, List<TemperatureView>> mTempComponents = new HashMap<>();
+
+    /**
+     * Callback for getting changes from {@link CarHvacManager} and setting the UI elements to
+     * match.
+     */
+    private final CarHvacEventCallback mHardwareCallback = new CarHvacEventCallback() {
+        @Override
+        public void onChangeEvent(final CarPropertyValue val) {
+            try {
+                int areaId = val.getAreaId();
+                int propertyId = val.getPropertyId();
+                List<TemperatureView> temperatureViews = mTempComponents.get(
+                        new HvacKey(propertyId, areaId));
+                if (temperatureViews != null && !temperatureViews.isEmpty()) {
+                    float value = (float) val.getValue();
+                    for (TemperatureView tempView : temperatureViews) {
+                        tempView.setTemp(value);
+                    }
+                } // else the data is not of interest
+            } catch (Exception e) {
+                // catch all so we don't take down the sysui if a new data type is
+                // introduced.
+                Log.e(TAG, "Failed handling hvac change event", e);
+            }
+        }
+
+        @Override
+        public void onErrorEvent(final int propertyId, final int zone) {
+            Log.d(TAG, "HVAC error event, propertyId: " + propertyId
+                    + " zone: " + zone);
+        }
+    };
+
+    private final CarServiceProvider.CarServiceOnConnectedListener mCarServiceLifecycleListener =
+            car -> {
+                try {
+                    mHvacManager = (CarHvacManager) car.getCarManager(Car.HVAC_SERVICE);
+                    mHvacManager.registerCallback(mHardwareCallback);
+                    initComponents();
+                } catch (Exception e) {
+                    Log.e(TAG, "Failed to correctly connect to HVAC", e);
+                }
+            };
+
+    @Inject
+    public HvacController(CarServiceProvider carServiceProvider) {
+        mCarServiceProvider = carServiceProvider;
+    }
+
+    /**
+     * Create connection to the Car service. Note: call backs from the Car service
+     * ({@link CarHvacManager}) will happen on the same thread this method was called from.
+     */
+    public void connectToCarService() {
+        mCarServiceProvider.addListener(mCarServiceLifecycleListener);
+    }
+
+    /**
+     * Add component to list and initialize it if the connection is up.
+     */
+    private void addHvacTextView(TemperatureView temperatureView) {
+        if (mRegisteredViews.contains(temperatureView)) {
+            return;
+        }
+
+        HvacKey hvacKey = new HvacKey(temperatureView.getPropertyId(), temperatureView.getAreaId());
+        if (!mTempComponents.containsKey(hvacKey)) {
+            mTempComponents.put(hvacKey, new ArrayList<>());
+        }
+        mTempComponents.get(hvacKey).add(temperatureView);
+        initComponent(temperatureView);
+
+        mRegisteredViews.add(temperatureView);
+    }
+
+    private void initComponents() {
+        Iterator<Map.Entry<HvacKey, List<TemperatureView>>> iterator =
+                mTempComponents.entrySet().iterator();
+        while (iterator.hasNext()) {
+            Map.Entry<HvacKey, List<TemperatureView>> next = iterator.next();
+            List<TemperatureView> temperatureViews = next.getValue();
+            for (TemperatureView view : temperatureViews) {
+                initComponent(view);
+            }
+        }
+    }
+
+    private void initComponent(TemperatureView view) {
+        int id = view.getPropertyId();
+        int zone = view.getAreaId();
+
+        try {
+            if (mHvacManager != null
+                    && mHvacManager.isPropertyAvailable(HVAC_TEMPERATURE_DISPLAY_UNITS,
+                            VEHICLE_AREA_TYPE_GLOBAL)) {
+                if (mHvacManager.getIntProperty(HVAC_TEMPERATURE_DISPLAY_UNITS,
+                        VEHICLE_AREA_TYPE_GLOBAL) == VehicleUnit.FAHRENHEIT) {
+                    view.setDisplayInFahrenheit(true);
+                }
+
+            }
+            if (mHvacManager == null || !mHvacManager.isPropertyAvailable(id, zone)) {
+                view.setTemp(Float.NaN);
+                return;
+            }
+            view.setTemp(mHvacManager.getFloatProperty(id, zone));
+        } catch (Exception e) {
+            view.setTemp(Float.NaN);
+            Log.e(TAG, "Failed to get value from hvac service", e);
+        }
+    }
+
+    /**
+     * Removes all registered components. This is useful if you need to rebuild the UI since
+     * components self register.
+     */
+    public void removeAllComponents() {
+        mTempComponents.clear();
+        mRegisteredViews.clear();
+    }
+
+    /**
+     * Iterate through a view, looking for {@link TemperatureView} instances and add them to the
+     * controller if found.
+     */
+    public void addTemperatureViewToController(View v) {
+        if (v instanceof TemperatureView) {
+            addHvacTextView((TemperatureView) v);
+        } else if (v instanceof ViewGroup) {
+            ViewGroup viewGroup = (ViewGroup) v;
+            for (int i = 0; i < viewGroup.getChildCount(); i++) {
+                addTemperatureViewToController(viewGroup.getChildAt(i));
+            }
+        }
+    }
+
+    /**
+     * Key for storing {@link TemperatureView}s in a hash map
+     */
+    private static class HvacKey {
+
+        int mPropertyId;
+        int mAreaId;
+
+        private HvacKey(int propertyId, int areaId) {
+            mPropertyId = propertyId;
+            mAreaId = areaId;
+        }
+
+        @Override
+        public boolean equals(Object o) {
+            if (this == o) return true;
+            if (o == null || getClass() != o.getClass()) return false;
+            HvacKey hvacKey = (HvacKey) o;
+            return mPropertyId == hvacKey.mPropertyId
+                    && mAreaId == hvacKey.mAreaId;
+        }
+
+        @Override
+        public int hashCode() {
+            return Objects.hash(mPropertyId, mAreaId);
+        }
+    }
+}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/hvac/TemperatureBackgroundAnimator.java b/packages/CarSystemUI/src/com/android/systemui/car/hvac/TemperatureBackgroundAnimator.java
new file mode 100644
index 0000000..a4c4573
--- /dev/null
+++ b/packages/CarSystemUI/src/com/android/systemui/car/hvac/TemperatureBackgroundAnimator.java
@@ -0,0 +1,340 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.car.hvac;
+
+import static com.android.systemui.car.hvac.AnimatedTemperatureView.isHorizontal;
+import static com.android.systemui.car.hvac.AnimatedTemperatureView.isLeft;
+import static com.android.systemui.car.hvac.AnimatedTemperatureView.isTop;
+import static com.android.systemui.car.hvac.AnimatedTemperatureView.isVertical;
+
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.AnimatorSet;
+import android.animation.ObjectAnimator;
+import android.annotation.IntDef;
+import android.graphics.Rect;
+import android.view.View;
+import android.view.ViewAnimationUtils;
+import android.view.animation.AnticipateInterpolator;
+import android.widget.ImageView;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Controls circular reveal animation of temperature background
+ */
+class TemperatureBackgroundAnimator {
+
+    private static final AnticipateInterpolator ANTICIPATE_INTERPOLATOR =
+            new AnticipateInterpolator();
+    private static final float MAX_OPACITY = .6f;
+
+    private final View mAnimatedView;
+
+    private int mPivotX;
+    private int mPivotY;
+    private int mGoneRadius;
+    private int mOvershootRadius;
+    private int mRestingRadius;
+    private int mBumpRadius;
+
+    @CircleState
+    private int mCircleState;
+
+    private Animator mCircularReveal;
+    private boolean mAnimationsReady;
+
+    @IntDef({CircleState.GONE, CircleState.ENTERING, CircleState.OVERSHOT, CircleState.RESTING,
+            CircleState.RESTED, CircleState.BUMPING, CircleState.BUMPED, CircleState.EXITING})
+    private @interface CircleState {
+        int GONE = 0;
+        int ENTERING = 1;
+        int OVERSHOT = 2;
+        int RESTING = 3;
+        int RESTED = 4;
+        int BUMPING = 5;
+        int BUMPED = 6;
+        int EXITING = 7;
+    }
+
+    TemperatureBackgroundAnimator(
+            AnimatedTemperatureView parent,
+            ImageView animatedView) {
+        mAnimatedView = animatedView;
+        mAnimatedView.setAlpha(0);
+
+        parent.addOnLayoutChangeListener(
+                (v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) ->
+                        setupAnimations(parent.getGravity(), parent.getPivotOffset(),
+                                parent.getPaddingRect(), parent.getWidth(), parent.getHeight()));
+    }
+
+    private void setupAnimations(int gravity, int pivotOffset, Rect paddingRect,
+            int width, int height) {
+        int padding;
+        if (isHorizontal(gravity)) {
+            mGoneRadius = pivotOffset;
+            if (isLeft(gravity, mAnimatedView.getLayoutDirection())) {
+                mPivotX = -pivotOffset;
+                padding = paddingRect.right;
+            } else {
+                mPivotX = width + pivotOffset;
+                padding = paddingRect.left;
+            }
+            mPivotY = height / 2;
+            mOvershootRadius = pivotOffset + width;
+        } else if (isVertical(gravity)) {
+            mGoneRadius = pivotOffset;
+            if (isTop(gravity)) {
+                mPivotY = -pivotOffset;
+                padding = paddingRect.bottom;
+            } else {
+                mPivotY = height + pivotOffset;
+                padding = paddingRect.top;
+            }
+            mPivotX = width / 2;
+            mOvershootRadius = pivotOffset + height;
+        } else {
+            mPivotX = width / 2;
+            mPivotY = height / 2;
+            mGoneRadius = 0;
+            if (width > height) {
+                mOvershootRadius = height;
+                padding = Math.max(paddingRect.top, paddingRect.bottom);
+            } else {
+                mOvershootRadius = width;
+                padding = Math.max(paddingRect.left, paddingRect.right);
+            }
+        }
+        mRestingRadius = mOvershootRadius - padding;
+        mBumpRadius = mOvershootRadius - padding / 3;
+        mAnimationsReady = true;
+    }
+
+    boolean isOpen() {
+        return mCircleState != CircleState.GONE;
+    }
+
+    void animateOpen() {
+        if (!mAnimationsReady
+                || !mAnimatedView.isAttachedToWindow()
+                || mCircleState == CircleState.ENTERING) {
+            return;
+        }
+
+        AnimatorSet set = new AnimatorSet();
+        List<Animator> animators = new ArrayList<>();
+        switch (mCircleState) {
+            case CircleState.ENTERING:
+                throw new AssertionError("Should not be able to reach this statement");
+            case CircleState.GONE: {
+                Animator startCircle = createEnterAnimator();
+                markState(startCircle, CircleState.ENTERING);
+                animators.add(startCircle);
+                Animator holdOvershoot = ViewAnimationUtils
+                        .createCircularReveal(mAnimatedView, mPivotX, mPivotY, mOvershootRadius,
+                                mOvershootRadius);
+                holdOvershoot.setDuration(50);
+                markState(holdOvershoot, CircleState.OVERSHOT);
+                animators.add(holdOvershoot);
+                Animator rest = ViewAnimationUtils
+                        .createCircularReveal(mAnimatedView, mPivotX, mPivotY, mOvershootRadius,
+                                mRestingRadius);
+                markState(rest, CircleState.RESTING);
+                animators.add(rest);
+                Animator holdRest = ViewAnimationUtils
+                        .createCircularReveal(mAnimatedView, mPivotX, mPivotY, mRestingRadius,
+                                mRestingRadius);
+                markState(holdRest, CircleState.RESTED);
+                holdRest.setDuration(1000);
+                animators.add(holdRest);
+                Animator exit = createExitAnimator(mRestingRadius);
+                markState(exit, CircleState.EXITING);
+                animators.add(exit);
+            }
+            break;
+            case CircleState.RESTED:
+            case CircleState.RESTING:
+            case CircleState.EXITING:
+            case CircleState.OVERSHOT:
+                int startRadius =
+                        mCircleState == CircleState.OVERSHOT ? mOvershootRadius : mRestingRadius;
+                Animator bump = ViewAnimationUtils
+                        .createCircularReveal(mAnimatedView, mPivotX, mPivotY, startRadius,
+                                mBumpRadius);
+                bump.setDuration(50);
+                markState(bump, CircleState.BUMPING);
+                animators.add(bump);
+                // fallthrough intentional
+            case CircleState.BUMPED:
+            case CircleState.BUMPING:
+                Animator holdBump = ViewAnimationUtils
+                        .createCircularReveal(mAnimatedView, mPivotX, mPivotY, mBumpRadius,
+                                mBumpRadius);
+                holdBump.setDuration(100);
+                markState(holdBump, CircleState.BUMPED);
+                animators.add(holdBump);
+                Animator rest = ViewAnimationUtils
+                        .createCircularReveal(mAnimatedView, mPivotX, mPivotY, mBumpRadius,
+                                mRestingRadius);
+                markState(rest, CircleState.RESTING);
+                animators.add(rest);
+                Animator holdRest = ViewAnimationUtils
+                        .createCircularReveal(mAnimatedView, mPivotX, mPivotY, mRestingRadius,
+                                mRestingRadius);
+                holdRest.setDuration(1000);
+                markState(holdRest, CircleState.RESTED);
+                animators.add(holdRest);
+                Animator exit = createExitAnimator(mRestingRadius);
+                markState(exit, CircleState.EXITING);
+                animators.add(exit);
+                break;
+        }
+        set.playSequentially(animators);
+        set.addListener(new AnimatorListenerAdapter() {
+            private boolean mCanceled = false;
+
+            @Override
+            public void onAnimationStart(Animator animation) {
+                if (mCircularReveal != null) {
+                    mCircularReveal.cancel();
+                }
+                mCircularReveal = animation;
+                mAnimatedView.setVisibility(View.VISIBLE);
+            }
+
+            @Override
+            public void onAnimationCancel(Animator animation) {
+                mCanceled = true;
+            }
+
+            @Override
+            public void onAnimationEnd(Animator animation) {
+                if (mCanceled) {
+                    return;
+                }
+                mCircularReveal = null;
+                mCircleState = CircleState.GONE;
+                mAnimatedView.setVisibility(View.GONE);
+            }
+        });
+
+        set.start();
+    }
+
+    private Animator createEnterAnimator() {
+        AnimatorSet animatorSet = new AnimatorSet();
+        Animator circularReveal = ViewAnimationUtils
+                .createCircularReveal(mAnimatedView, mPivotX, mPivotY, mGoneRadius,
+                        mOvershootRadius);
+        Animator fade = ObjectAnimator.ofFloat(mAnimatedView, View.ALPHA, MAX_OPACITY);
+        animatorSet.playTogether(circularReveal, fade);
+        return animatorSet;
+    }
+
+    private Animator createExitAnimator(int startRadius) {
+        AnimatorSet animatorSet = new AnimatorSet();
+        Animator circularHide = ViewAnimationUtils
+                .createCircularReveal(mAnimatedView, mPivotX, mPivotY, startRadius,
+                        (mGoneRadius + startRadius) / 2);
+        circularHide.setInterpolator(ANTICIPATE_INTERPOLATOR);
+        Animator fade = ObjectAnimator.ofFloat(mAnimatedView, View.ALPHA, 0);
+        fade.setStartDelay(50);
+        animatorSet.playTogether(circularHide, fade);
+        return animatorSet;
+    }
+
+    void hideCircle() {
+        if (!mAnimationsReady || mCircleState == CircleState.GONE
+                || mCircleState == CircleState.EXITING) {
+            return;
+        }
+
+        int startRadius;
+        switch (mCircleState) {
+            // Unreachable, but here to exhaust switch cases
+            //noinspection ConstantConditions
+            case CircleState.EXITING:
+                //noinspection ConstantConditions
+            case CircleState.GONE:
+                throw new AssertionError("Should not be able to reach this statement");
+            case CircleState.BUMPED:
+            case CircleState.BUMPING:
+                startRadius = mBumpRadius;
+                break;
+            case CircleState.OVERSHOT:
+                startRadius = mOvershootRadius;
+                break;
+            case CircleState.ENTERING:
+            case CircleState.RESTED:
+            case CircleState.RESTING:
+                startRadius = mRestingRadius;
+                break;
+            default:
+                throw new IllegalStateException("Unknown CircleState: " + mCircleState);
+        }
+
+        Animator hideAnimation = createExitAnimator(startRadius);
+        if (startRadius == mRestingRadius) {
+            hideAnimation.setInterpolator(ANTICIPATE_INTERPOLATOR);
+        }
+        hideAnimation.addListener(new AnimatorListenerAdapter() {
+            private boolean mCanceled = false;
+
+            @Override
+            public void onAnimationStart(Animator animation) {
+                mCircleState = CircleState.EXITING;
+                if (mCircularReveal != null) {
+                    mCircularReveal.cancel();
+                }
+                mCircularReveal = animation;
+            }
+
+            @Override
+            public void onAnimationCancel(Animator animation) {
+                mCanceled = true;
+            }
+
+            @Override
+            public void onAnimationEnd(Animator animation) {
+                if (mCanceled) {
+                    return;
+                }
+                mCircularReveal = null;
+                mCircleState = CircleState.GONE;
+                mAnimatedView.setVisibility(View.GONE);
+            }
+        });
+        hideAnimation.start();
+    }
+
+    void stopAnimations() {
+        if (mCircularReveal != null) {
+            mCircularReveal.end();
+        }
+    }
+
+    private void markState(Animator animator, @CircleState int startState) {
+        animator.addListener(new AnimatorListenerAdapter() {
+            @Override
+            public void onAnimationStart(Animator animation) {
+                mCircleState = startState;
+            }
+        });
+    }
+}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/hvac/TemperatureColorStore.java b/packages/CarSystemUI/src/com/android/systemui/car/hvac/TemperatureColorStore.java
new file mode 100644
index 0000000..9a7b0b9
--- /dev/null
+++ b/packages/CarSystemUI/src/com/android/systemui/car/hvac/TemperatureColorStore.java
@@ -0,0 +1,202 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.car.hvac;
+
+import android.graphics.Color;
+
+/**
+ * Contains the logic for mapping colors to temperatures
+ */
+class TemperatureColorStore {
+
+    private static class TemperatureColorValue {
+        final float mTemperature;
+        final int mColor;
+
+        private TemperatureColorValue(float temperature, int color) {
+            this.mTemperature = temperature;
+            this.mColor = color;
+        }
+
+        float getTemperature() {
+            return mTemperature;
+        }
+
+        int getColor() {
+            return mColor;
+        }
+    }
+
+    private static TemperatureColorValue tempToColor(float temperature, int color) {
+        return new TemperatureColorValue(temperature, color);
+    }
+
+    private static final int COLOR_COLDEST = 0xFF406DFF;
+    private static final int COLOR_COLD = 0xFF4094FF;
+    private static final int COLOR_NEUTRAL = 0xFFF4F4F4;
+    private static final int COLOR_WARM = 0xFFFF550F;
+    private static final int COLOR_WARMEST = 0xFFFF0000;
+    // must be sorted by temperature
+    private static final TemperatureColorValue[] sTemperatureColorValues =
+            {
+                    // Celsius
+                    tempToColor(19, COLOR_COLDEST),
+                    tempToColor(21, COLOR_COLD),
+                    tempToColor(23, COLOR_NEUTRAL),
+                    tempToColor(25, COLOR_WARM),
+                    tempToColor(27, COLOR_WARMEST),
+
+                    // Switch over
+                    tempToColor(45, COLOR_WARMEST),
+                    tempToColor(45.00001f, COLOR_COLDEST),
+
+                    // Farenheight
+                    tempToColor(66, COLOR_COLDEST),
+                    tempToColor(70, COLOR_COLD),
+                    tempToColor(74, COLOR_NEUTRAL),
+                    tempToColor(76, COLOR_WARM),
+                    tempToColor(80, COLOR_WARMEST)
+            };
+
+    private static final int COLOR_UNSET = Color.BLACK;
+
+    private final float[] mTempHsv1 = new float[3];
+    private final float[] mTempHsv2 = new float[3];
+    private final float[] mTempHsv3 = new float[3];
+
+    int getMinColor() {
+        return COLOR_COLDEST;
+    }
+
+    int getMaxColor() {
+        return COLOR_WARMEST;
+    }
+
+    int getColorForTemperature(float temperature) {
+        if (Float.isNaN(temperature)) {
+            return COLOR_UNSET;
+        }
+        TemperatureColorValue bottomValue = sTemperatureColorValues[0];
+        if (temperature <= bottomValue.getTemperature()) {
+            return bottomValue.getColor();
+        }
+        TemperatureColorValue topValue =
+                sTemperatureColorValues[sTemperatureColorValues.length - 1];
+        if (temperature >= topValue.getTemperature()) {
+            return topValue.getColor();
+        }
+
+        int index = binarySearch(temperature);
+        if (index >= 0) {
+            return sTemperatureColorValues[index].getColor();
+        }
+
+        index = -index - 1; // move to the insertion point
+
+        TemperatureColorValue startValue = sTemperatureColorValues[index - 1];
+        TemperatureColorValue endValue = sTemperatureColorValues[index];
+        float fraction = (temperature - startValue.getTemperature()) / (endValue.getTemperature()
+                - startValue.getTemperature());
+        return lerpColor(fraction, startValue.getColor(), endValue.getColor());
+    }
+
+    int lerpColor(float fraction, int startColor, int endColor) {
+        float[] startHsv = mTempHsv1;
+        Color.colorToHSV(startColor, startHsv);
+        float[] endHsv = mTempHsv2;
+        Color.colorToHSV(endColor, endHsv);
+
+        // If a target color is white/gray, it should use the same hue as the other target
+        if (startHsv[1] == 0) {
+            startHsv[0] = endHsv[0];
+        }
+        if (endHsv[1] == 0) {
+            endHsv[0] = startHsv[0];
+        }
+
+        float[] outColor = mTempHsv3;
+        outColor[0] = hueLerp(fraction, startHsv[0], endHsv[0]);
+        outColor[1] = lerp(fraction, startHsv[1], endHsv[1]);
+        outColor[2] = lerp(fraction, startHsv[2], endHsv[2]);
+
+        return Color.HSVToColor(outColor);
+    }
+
+    private float hueLerp(float fraction, float start, float end) {
+        // If in flat part of curve, no interpolation necessary
+        if (start == end) {
+            return start;
+        }
+
+        // If the hues are more than 180 degrees apart, go the other way around the color wheel
+        // by moving the smaller value above 360
+        if (Math.abs(start - end) > 180f) {
+            if (start < end) {
+                start += 360f;
+            } else {
+                end += 360f;
+            }
+        }
+        // Lerp and ensure the final output is within [0, 360)
+        return lerp(fraction, start, end) % 360f;
+
+    }
+
+    private float lerp(float fraction, float start, float end) {
+        // If in flat part of curve, no interpolation necessary
+        if (start == end) {
+            return start;
+        }
+
+        // If outside bounds, use boundary value
+        if (fraction >= 1) {
+            return end;
+        }
+        if (fraction <= 0) {
+            return start;
+        }
+
+        return (end - start) * fraction + start;
+    }
+
+    private int binarySearch(float temperature) {
+        int low = 0;
+        int high = sTemperatureColorValues.length;
+
+        while (low <= high) {
+            int mid = (low + high) >>> 1;
+            float midVal = sTemperatureColorValues[mid].getTemperature();
+
+            if (midVal < temperature) {
+                low = mid + 1;  // Neither val is NaN, thisVal is smaller
+            } else if (midVal > temperature) {
+                high = mid - 1; // Neither val is NaN, thisVal is larger
+            } else {
+                int midBits = Float.floatToIntBits(midVal);
+                int keyBits = Float.floatToIntBits(temperature);
+                if (midBits == keyBits) {    // Values are equal
+                    return mid;             // Key found
+                } else if (midBits < keyBits) { // (-0.0, 0.0) or (!NaN, NaN)
+                    low = mid + 1;
+                } else {                        /* (0.0, -0.0) or (NaN, !NaN)*/
+                    high = mid - 1;
+                }
+            }
+        }
+        return -(low + 1);  // key not found.
+    }
+}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/hvac/TemperatureTextAnimator.java b/packages/CarSystemUI/src/com/android/systemui/car/hvac/TemperatureTextAnimator.java
new file mode 100644
index 0000000..74d9704
--- /dev/null
+++ b/packages/CarSystemUI/src/com/android/systemui/car/hvac/TemperatureTextAnimator.java
@@ -0,0 +1,164 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.car.hvac;
+
+import static com.android.systemui.car.hvac.AnimatedTemperatureView.isHorizontal;
+import static com.android.systemui.car.hvac.AnimatedTemperatureView.isLeft;
+
+import android.annotation.NonNull;
+import android.view.animation.AccelerateDecelerateInterpolator;
+import android.view.animation.AlphaAnimation;
+import android.view.animation.Animation;
+import android.view.animation.AnimationSet;
+import android.view.animation.DecelerateInterpolator;
+import android.view.animation.RotateAnimation;
+import android.view.animation.TranslateAnimation;
+import android.widget.TextSwitcher;
+
+/**
+ * Controls animating TemperatureView's text
+ */
+class TemperatureTextAnimator {
+
+    private static final DecelerateInterpolator DECELERATE_INTERPOLATOR =
+            new DecelerateInterpolator();
+    private static final AccelerateDecelerateInterpolator ACCELERATE_DECELERATE_INTERPOLATOR =
+            new AccelerateDecelerateInterpolator();
+
+    private static final int ROTATION_DEGREES = 15;
+    private static final int DURATION_MILLIS = 200;
+
+    private AnimatedTemperatureView mParent;
+    private final TextSwitcher mTextSwitcher;
+    private final String mTempFormat;
+    private final int mPivotOffset;
+    private final CharSequence mMinText;
+    private final CharSequence mMaxText;
+
+    private Animation mTextInAnimationUp;
+    private Animation mTextOutAnimationUp;
+    private Animation mTextInAnimationDown;
+    private Animation mTextOutAnimationDown;
+    private Animation mTextFadeInAnimation;
+    private Animation mTextFadeOutAnimation;
+
+    private float mLastTemp = Float.NaN;
+
+    TemperatureTextAnimator(AnimatedTemperatureView parent, TextSwitcher textSwitcher,
+            String tempFormat, int pivotOffset,
+            CharSequence minText, CharSequence maxText) {
+        mParent = parent;
+        mTextSwitcher = textSwitcher;
+        mTempFormat = tempFormat;
+        mPivotOffset = pivotOffset;
+        mMinText = minText;
+        mMaxText = maxText;
+
+        mParent.addOnLayoutChangeListener(
+                (v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) ->
+                        setupAnimations(mParent.getGravity()));
+    }
+
+    void setTemp(float temp) {
+        if (Float.isNaN(temp)) {
+            mTextSwitcher.setInAnimation(mTextFadeInAnimation);
+            mTextSwitcher.setOutAnimation(mTextFadeOutAnimation);
+            mTextSwitcher.setText("--");
+            mLastTemp = temp;
+            return;
+        }
+        boolean isMinValue = mParent.isMinValue(temp);
+        boolean isMaxValue = mParent.isMaxValue(temp);
+        if (Float.isNaN(mLastTemp)) {
+            mTextSwitcher.setInAnimation(mTextFadeInAnimation);
+            mTextSwitcher.setOutAnimation(mTextFadeOutAnimation);
+        } else if (!isMinValue && (isMaxValue || temp > mLastTemp)) {
+            mTextSwitcher.setInAnimation(mTextInAnimationUp);
+            mTextSwitcher.setOutAnimation(mTextOutAnimationUp);
+        } else {
+            mTextSwitcher.setInAnimation(mTextInAnimationDown);
+            mTextSwitcher.setOutAnimation(mTextOutAnimationDown);
+        }
+        CharSequence text;
+        if (isMinValue) {
+            text = mMinText;
+        } else if (isMaxValue) {
+            text = mMaxText;
+        } else {
+            text = String.format(mTempFormat, temp);
+        }
+        mTextSwitcher.setText(text);
+        mLastTemp = temp;
+    }
+
+    private void setupAnimations(int gravity) {
+        mTextFadeInAnimation = createFadeAnimation(true);
+        mTextFadeOutAnimation = createFadeAnimation(false);
+        if (!isHorizontal(gravity)) {
+            mTextInAnimationUp = createTranslateFadeAnimation(true, true);
+            mTextOutAnimationUp = createTranslateFadeAnimation(false, true);
+            mTextInAnimationDown = createTranslateFadeAnimation(true, false);
+            mTextOutAnimationDown = createTranslateFadeAnimation(false, false);
+        } else {
+            boolean isLeft = isLeft(gravity, mTextSwitcher.getLayoutDirection());
+            mTextInAnimationUp = createRotateFadeAnimation(true, isLeft, true);
+            mTextOutAnimationUp = createRotateFadeAnimation(false, isLeft, true);
+            mTextInAnimationDown = createRotateFadeAnimation(true, isLeft, false);
+            mTextOutAnimationDown = createRotateFadeAnimation(false, isLeft, false);
+        }
+    }
+
+    @NonNull
+    private Animation createFadeAnimation(boolean in) {
+        AnimationSet set = new AnimationSet(true);
+        AlphaAnimation alphaAnimation = new AlphaAnimation(in ? 0 : 1, in ? 1 : 0);
+        alphaAnimation.setDuration(DURATION_MILLIS);
+        set.addAnimation(new RotateAnimation(0, 0)); // Undo any previous rotation
+        set.addAnimation(alphaAnimation);
+        return set;
+    }
+
+    @NonNull
+    private Animation createTranslateFadeAnimation(boolean in, boolean up) {
+        AnimationSet set = new AnimationSet(true);
+        set.setInterpolator(ACCELERATE_DECELERATE_INTERPOLATOR);
+        set.setDuration(DURATION_MILLIS);
+        int fromYDelta = in ? (up ? 1 : -1) : 0;
+        int toYDelta = in ? 0 : (up ? -1 : 1);
+        set.addAnimation(
+                new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 0,
+                        Animation.RELATIVE_TO_SELF, fromYDelta, Animation.RELATIVE_TO_SELF,
+                        toYDelta));
+        set.addAnimation(new AlphaAnimation(in ? 0 : 1, in ? 1 : 0));
+        return set;
+    }
+
+    @NonNull
+    private Animation createRotateFadeAnimation(boolean in, boolean isLeft, boolean up) {
+        AnimationSet set = new AnimationSet(true);
+        set.setInterpolator(DECELERATE_INTERPOLATOR);
+        set.setDuration(DURATION_MILLIS);
+
+        float degrees = isLeft == up ? -ROTATION_DEGREES : ROTATION_DEGREES;
+        int pivotX = isLeft ? -mPivotOffset : mParent.getWidth() + mPivotOffset;
+        set.addAnimation(
+                new RotateAnimation(in ? -degrees : 0f, in ? 0f : degrees, Animation.ABSOLUTE,
+                        pivotX, Animation.ABSOLUTE, 0f));
+        set.addAnimation(new AlphaAnimation(in ? 0 : 1, in ? 1 : 0));
+        return set;
+    }
+}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/hvac/TemperatureTextView.java b/packages/CarSystemUI/src/com/android/systemui/car/hvac/TemperatureTextView.java
new file mode 100644
index 0000000..521a665
--- /dev/null
+++ b/packages/CarSystemUI/src/com/android/systemui/car/hvac/TemperatureTextView.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.car.hvac;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.util.AttributeSet;
+import android.widget.TextView;
+
+import com.android.systemui.R;
+
+/**
+ * Simple text display of HVAC properties, It is designed to show temperature and is configured in
+ * the XML.
+ * XML properties:
+ * hvacPropertyId - Example: CarHvacManager.ID_ZONED_TEMP_SETPOINT (16385)
+ * hvacAreaId - Example: VehicleSeat.SEAT_ROW_1_LEFT (1)
+ * hvacTempFormat - Example: "%.1f\u00B0" (1 decimal and the degree symbol)
+ */
+public class TemperatureTextView extends TextView implements TemperatureView {
+
+    private final int mAreaId;
+    private final int mPropertyId;
+    private final String mTempFormat;
+    private boolean mDisplayFahrenheit = false;
+
+    public TemperatureTextView(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.TemperatureView);
+        mAreaId = typedArray.getInt(R.styleable.TemperatureView_hvacAreaId, -1);
+        mPropertyId = typedArray.getInt(R.styleable.TemperatureView_hvacPropertyId, -1);
+        String format = typedArray.getString(R.styleable.TemperatureView_hvacTempFormat);
+        mTempFormat = (format == null) ? "%.1f\u00B0" : format;
+    }
+
+    /**
+     * Formats the float for display
+     *
+     * @param temp - The current temp or NaN
+     */
+    @Override
+    public void setTemp(float temp) {
+        if (Float.isNaN(temp)) {
+            setText("--");
+            return;
+        }
+        if (mDisplayFahrenheit) {
+            temp = convertToFahrenheit(temp);
+        }
+        setText(String.format(mTempFormat, temp));
+    }
+
+    @Override
+    public void setDisplayInFahrenheit(boolean displayFahrenheit) {
+        mDisplayFahrenheit = displayFahrenheit;
+    }
+
+    /**
+     * @return propertiyId  Example: CarHvacManager.ID_ZONED_TEMP_SETPOINT (16385)
+     */
+    @Override
+    public int getPropertyId() {
+        return mPropertyId;
+    }
+
+    /**
+     * @return hvac AreaId - Example: VehicleSeat.SEAT_ROW_1_LEFT (1)
+     */
+    @Override
+    public int getAreaId() {
+        return mAreaId;
+    }
+}
+
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/hvac/TemperatureView.java b/packages/CarSystemUI/src/com/android/systemui/car/hvac/TemperatureView.java
new file mode 100644
index 0000000..6b903fa
--- /dev/null
+++ b/packages/CarSystemUI/src/com/android/systemui/car/hvac/TemperatureView.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.car.hvac;
+
+/**
+ * Interface for Views that display temperature HVAC properties
+ */
+public interface TemperatureView {
+    /**
+     * Formats the float for display
+     *
+     * @param temp - The current temp in Celsius or NaN
+     */
+    void setTemp(float temp);
+
+    /**
+     * Render the displayed temperature in Fahrenheit
+     *
+     * @param displayFahrenheit - True if temperature should be displayed in Fahrenheit
+     */
+    void setDisplayInFahrenheit(boolean displayFahrenheit);
+
+    /**
+     * Convert the given temperature in Celsius into Fahrenheit
+     *
+     * @param realTemp - The temperature in Celsius
+     * @return Temperature in Fahrenheit.
+     */
+    default float convertToFahrenheit(float realTemp) {
+        return (realTemp * 9f / 5f) + 32;
+    }
+
+    /**
+     * @return propertiyId  Example: CarHvacManager.ID_ZONED_TEMP_SETPOINT (16385)
+     */
+    int getPropertyId();
+
+    /**
+     * @return hvac AreaId - Example: VehicleSeat.SEAT_ROW_1_LEFT (1)
+     */
+    int getAreaId();
+}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/keyguard/CarKeyguardViewController.java b/packages/CarSystemUI/src/com/android/systemui/car/keyguard/CarKeyguardViewController.java
index 1814fd0..b5f648b 100644
--- a/packages/CarSystemUI/src/com/android/systemui/car/keyguard/CarKeyguardViewController.java
+++ b/packages/CarSystemUI/src/com/android/systemui/car/keyguard/CarKeyguardViewController.java
@@ -26,6 +26,8 @@
 import android.view.ViewGroup;
 import android.view.ViewRootImpl;
 
+import androidx.annotation.VisibleForTesting;
+
 import com.android.internal.widget.LockPatternUtils;
 import com.android.keyguard.KeyguardUpdateMonitor;
 import com.android.keyguard.KeyguardViewController;
@@ -33,9 +35,11 @@
 import com.android.systemui.R;
 import com.android.systemui.SystemUIFactory;
 import com.android.systemui.car.CarServiceProvider;
+import com.android.systemui.car.navigationbar.CarNavigationBarController;
+import com.android.systemui.car.window.OverlayViewController;
+import com.android.systemui.car.window.OverlayViewGlobalStateController;
 import com.android.systemui.dagger.qualifiers.Main;
 import com.android.systemui.keyguard.DismissCallbackRegistry;
-import com.android.systemui.navigationbar.car.CarNavigationBarController;
 import com.android.systemui.plugins.FalsingManager;
 import com.android.systemui.statusbar.phone.BiometricUnlockController;
 import com.android.systemui.statusbar.phone.KeyguardBouncer;
@@ -43,8 +47,6 @@
 import com.android.systemui.statusbar.phone.NotificationPanelViewController;
 import com.android.systemui.statusbar.phone.StatusBar;
 import com.android.systemui.statusbar.policy.KeyguardStateController;
-import com.android.systemui.window.OverlayViewController;
-import com.android.systemui.window.OverlayViewGlobalStateController;
 
 import javax.inject.Inject;
 import javax.inject.Singleton;
@@ -90,7 +92,7 @@
                 }
             };
     private final CarUserManager.UserLifecycleListener mUserLifecycleListener = (e) -> {
-        if (e.getEventType() == CarUserManager.USER_LIFECYCLE_EVENT_TYPE_UNLOCKED) {
+        if (e.getEventType() == CarUserManager.USER_LIFECYCLE_EVENT_TYPE_SWITCHING) {
             revealKeyguardIfBouncerPrepared();
         }
     };
@@ -203,6 +205,9 @@
 
     @Override
     public void onCancelClicked() {
+        getOverlayViewGlobalStateController().setWindowFocusable(/* focusable= */ false);
+        getOverlayViewGlobalStateController().setWindowNeedsInput(/* needsInput= */ false);
+
         mBouncer.hide(/* destroyView= */ true);
         mKeyguardCancelClickedListener.onCancelClicked();
     }
@@ -224,7 +229,8 @@
 
     @Override
     public void setNeedsInput(boolean needsInput) {
-        getLayout().setFocusable(needsInput);
+        getOverlayViewGlobalStateController().setWindowFocusable(needsInput);
+        getOverlayViewGlobalStateController().setWindowNeedsInput(needsInput);
     }
 
     /**
@@ -332,6 +338,11 @@
         getLayout().setVisibility(View.INVISIBLE);
     }
 
+    @VisibleForTesting
+    void setKeyguardBouncer(KeyguardBouncer keyguardBouncer) {
+        mBouncer = keyguardBouncer;
+    }
+
     private void revealKeyguardIfBouncerPrepared() {
         int reattemptDelayMillis = 50;
         Runnable revealKeyguard = () -> {
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/keyguard/CarKeyguardViewMediator.java b/packages/CarSystemUI/src/com/android/systemui/car/keyguard/CarKeyguardViewMediator.java
index db0f5d8..5a35c48 100644
--- a/packages/CarSystemUI/src/com/android/systemui/car/keyguard/CarKeyguardViewMediator.java
+++ b/packages/CarSystemUI/src/com/android/systemui/car/keyguard/CarKeyguardViewMediator.java
@@ -17,7 +17,7 @@
 package com.android.systemui.car.keyguard;
 
 import com.android.systemui.car.userswitcher.FullScreenUserSwitcherViewController;
-import com.android.systemui.window.OverlayViewMediator;
+import com.android.systemui.car.window.OverlayViewMediator;
 
 import javax.inject.Inject;
 import javax.inject.Singleton;
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/AssitantButton.java b/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/AssitantButton.java
new file mode 100644
index 0000000..69ec78e
--- /dev/null
+++ b/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/AssitantButton.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.car.navigationbar;
+
+import static android.service.voice.VoiceInteractionSession.SHOW_SOURCE_ASSIST_GESTURE;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.os.Bundle;
+import android.util.AttributeSet;
+import android.util.Log;
+
+import com.android.internal.app.AssistUtils;
+import com.android.internal.app.IVoiceInteractionSessionShowCallback;
+
+/**
+ * AssitantButton is a ui component that will trigger the Voice Interaction Service.
+ */
+public class AssitantButton extends CarNavigationButton {
+
+    private static final String TAG = "AssistantButton";
+    private final AssistUtils mAssistUtils;
+    private IVoiceInteractionSessionShowCallback mShowCallback =
+            new IVoiceInteractionSessionShowCallback.Stub() {
+                @Override
+                public void onFailed() {
+                    Log.w(TAG, "Failed to show VoiceInteractionSession");
+                }
+
+                @Override
+                public void onShown() {
+                    Log.d(TAG, "IVoiceInteractionSessionShowCallback onShown()");
+                }
+            };
+
+    public AssitantButton(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        mAssistUtils = new AssistUtils(context);
+        setOnClickListener(v -> {
+            showAssistant();
+        });
+    }
+
+    private void showAssistant() {
+        final Bundle args = new Bundle();
+        mAssistUtils.showSessionForActiveService(args,
+                SHOW_SOURCE_ASSIST_GESTURE, mShowCallback, /*activityToken=*/ null);
+    }
+
+    @Override
+    protected void setUpIntents(TypedArray typedArray) {
+        // left blank because for the assistant button Intent will not be passed from the layout.
+    }
+}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/ButtonSelectionStateController.java b/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/ButtonSelectionStateController.java
new file mode 100644
index 0000000..eedcfa5
--- /dev/null
+++ b/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/ButtonSelectionStateController.java
@@ -0,0 +1,232 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.car.navigationbar;
+
+import android.app.ActivityManager;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.view.Display;
+import android.view.View;
+import android.view.ViewGroup;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+/**
+ * CarNavigationButtons can optionally have selection state that toggles certain visual indications
+ * based on whether the active application on screen is associated with it. This is basically a
+ * similar concept to a radio button group.
+ *
+ * This class controls the selection state of CarNavigationButtons that have opted in to have such
+ * selection state-dependent visual indications.
+ */
+@Singleton
+public class ButtonSelectionStateController {
+
+    private final Set<CarNavigationButton> mRegisteredViews = new HashSet<>();
+
+    protected ButtonMap mButtonsByCategory = new ButtonMap();
+    protected ButtonMap mButtonsByPackage = new ButtonMap();
+    protected ButtonMap mButtonsByComponentName = new ButtonMap();
+    protected HashSet<CarNavigationButton> mSelectedButtons;
+    protected Context mContext;
+
+    @Inject
+    public ButtonSelectionStateController(Context context) {
+        mContext = context;
+        mSelectedButtons = new HashSet<>();
+    }
+
+    /**
+     * Iterate through a view looking for CarNavigationButton and add it to the controller if it
+     * opted in to be highlighted when the active application is associated with it.
+     *
+     * @param v the View that may contain CarFacetButtons
+     */
+    protected void addAllButtonsWithSelectionState(View v) {
+        if (v instanceof CarNavigationButton) {
+            if (((CarNavigationButton) v).hasSelectionState()) {
+                addButtonWithSelectionState((CarNavigationButton) v);
+            }
+        } else if (v instanceof ViewGroup) {
+            ViewGroup viewGroup = (ViewGroup) v;
+            for (int i = 0; i < viewGroup.getChildCount(); i++) {
+                addAllButtonsWithSelectionState(viewGroup.getChildAt(i));
+            }
+        }
+    }
+
+    /** Removes all buttons from the button maps. */
+    protected void removeAll() {
+        mButtonsByCategory.clear();
+        mButtonsByPackage.clear();
+        mButtonsByComponentName.clear();
+        mSelectedButtons.clear();
+        mRegisteredViews.clear();
+    }
+
+    /**
+     * This will unselect the currently selected CarNavigationButton and determine which one should
+     * be selected next. It does this by reading the properties on the CarNavigationButton and
+     * seeing if they are a match with the supplied StackInfo list.
+     * The order of selection detection is ComponentName, PackageName then Category
+     * They will then be compared with the supplied StackInfo list.
+     * The StackInfo is expected to be supplied in order of recency and StackInfo will only be used
+     * for consideration if it has the same displayId as the CarNavigationButton.
+     *
+     * @param stackInfoList of the currently running application
+     * @param validDisplay index of the valid display
+     */
+
+    protected void taskChanged(List<ActivityManager.StackInfo> stackInfoList, int validDisplay) {
+        ActivityManager.StackInfo validStackInfo = null;
+        for (ActivityManager.StackInfo stackInfo : stackInfoList) {
+            // Find the first stack info with a topActivity in the primary display.
+            // TODO: We assume that CarFacetButton will launch an app only in the primary display.
+            // We need to extend the functionality to handle the multiple display properly.
+            if (stackInfo.topActivity != null && stackInfo.displayId == validDisplay) {
+                validStackInfo = stackInfo;
+                break;
+            }
+        }
+
+        if (validStackInfo == null) {
+            // No stack was found that was on the same display as the buttons thus return
+            return;
+        }
+        int displayId = validStackInfo.displayId;
+
+        mSelectedButtons.forEach(carNavigationButton -> {
+            if (carNavigationButton.getDisplayId() == displayId) {
+                carNavigationButton.setSelected(false);
+            }
+        });
+        mSelectedButtons.clear();
+
+        HashSet<CarNavigationButton> selectedButtons = findSelectedButtons(validStackInfo);
+
+        if (selectedButtons != null) {
+            selectedButtons.forEach(carNavigationButton -> {
+                if (carNavigationButton.getDisplayId() == displayId) {
+                    carNavigationButton.setSelected(true);
+                    mSelectedButtons.add(carNavigationButton);
+                }
+            });
+        }
+    }
+
+    /**
+     * Defaults to Display.DEFAULT_DISPLAY when no parameter is provided for the validDisplay.
+     *
+     * @param stackInfoList
+     */
+    protected void taskChanged(List<ActivityManager.StackInfo> stackInfoList) {
+        taskChanged(stackInfoList, Display.DEFAULT_DISPLAY);
+    }
+
+    /**
+     * Add navigation button to this controller if it uses selection state.
+     */
+    private void addButtonWithSelectionState(CarNavigationButton carNavigationButton) {
+        if (mRegisteredViews.contains(carNavigationButton)) {
+            return;
+        }
+        String[] categories = carNavigationButton.getCategories();
+        for (int i = 0; i < categories.length; i++) {
+            mButtonsByCategory.add(categories[i], carNavigationButton);
+        }
+
+        String[] packages = carNavigationButton.getPackages();
+        for (int i = 0; i < packages.length; i++) {
+            mButtonsByPackage.add(packages[i], carNavigationButton);
+        }
+        String[] componentNames = carNavigationButton.getComponentName();
+        for (int i = 0; i < componentNames.length; i++) {
+            mButtonsByComponentName.add(componentNames[i], carNavigationButton);
+        }
+
+        mRegisteredViews.add(carNavigationButton);
+    }
+
+    private HashSet<CarNavigationButton> findSelectedButtons(
+            ActivityManager.StackInfo validStackInfo) {
+        String packageName = validStackInfo.topActivity.getPackageName();
+
+        HashSet<CarNavigationButton> selectedButtons =
+                findButtonsByComponentName(validStackInfo.topActivity);
+        if (selectedButtons == null) {
+            selectedButtons = mButtonsByPackage.get(packageName);
+        }
+        if (selectedButtons == null) {
+            String category = getPackageCategory(packageName);
+            if (category != null) {
+                selectedButtons = mButtonsByCategory.get(category);
+            }
+        }
+
+        return selectedButtons;
+    }
+
+    private HashSet<CarNavigationButton> findButtonsByComponentName(
+            ComponentName componentName) {
+        HashSet<CarNavigationButton> buttons =
+                mButtonsByComponentName.get(componentName.flattenToShortString());
+        return (buttons != null) ? buttons :
+                mButtonsByComponentName.get(componentName.flattenToString());
+    }
+
+    private String getPackageCategory(String packageName) {
+        PackageManager pm = mContext.getPackageManager();
+        Set<String> supportedCategories = mButtonsByCategory.keySet();
+        for (String category : supportedCategories) {
+            Intent intent = new Intent();
+            intent.setPackage(packageName);
+            intent.setAction(Intent.ACTION_MAIN);
+            intent.addCategory(category);
+            List<ResolveInfo> list = pm.queryIntentActivities(intent, 0);
+            if (list.size() > 0) {
+                // Cache this package name into ButtonsByPackage map, so we won't have to query
+                // all categories next time this package name shows up.
+                mButtonsByPackage.put(packageName, mButtonsByCategory.get(category));
+                return category;
+            }
+        }
+        return null;
+    }
+
+    // simple multi-map
+    private static class ButtonMap extends HashMap<String, HashSet<CarNavigationButton>> {
+
+        public boolean add(String key, CarNavigationButton value) {
+            if (containsKey(key)) {
+                return get(key).add(value);
+            }
+            HashSet<CarNavigationButton> set = new HashSet<>();
+            set.add(value);
+            put(key, set);
+            return true;
+        }
+    }
+}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/ButtonSelectionStateListener.java b/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/ButtonSelectionStateListener.java
new file mode 100644
index 0000000..1361798
--- /dev/null
+++ b/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/ButtonSelectionStateListener.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.car.navigationbar;
+
+import android.app.ActivityTaskManager;
+import android.util.Log;
+
+import com.android.systemui.shared.system.TaskStackChangeListener;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+/**
+ * An implementation of TaskStackChangeListener, that listens for changes in the system
+ * task stack and notifies the navigation bar.
+ */
+@Singleton
+class ButtonSelectionStateListener extends TaskStackChangeListener {
+    private static final String TAG = ButtonSelectionStateListener.class.getSimpleName();
+
+    private final ButtonSelectionStateController mButtonSelectionStateController;
+
+    @Inject
+    ButtonSelectionStateListener(ButtonSelectionStateController carNavigationButtonController) {
+        mButtonSelectionStateController = carNavigationButtonController;
+    }
+
+    @Override
+    public void onTaskStackChanged() {
+        try {
+            mButtonSelectionStateController.taskChanged(
+                    ActivityTaskManager.getService().getAllStackInfos());
+        } catch (Exception e) {
+            Log.e(TAG, "Getting StackInfo from activity manager failed", e);
+        }
+    }
+
+    @Override
+    public void onTaskDisplayChanged(int taskId, int newDisplayId) {
+        try {
+            mButtonSelectionStateController.taskChanged(
+                    ActivityTaskManager.getService().getAllStackInfos());
+        } catch (Exception e) {
+            Log.e(TAG, "Getting StackInfo from activity manager failed", e);
+        }
+
+    }
+}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/CarNavigationBar.java b/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/CarNavigationBar.java
new file mode 100644
index 0000000..2b5cab7
--- /dev/null
+++ b/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/CarNavigationBar.java
@@ -0,0 +1,524 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.car.navigationbar;
+
+import static android.view.InsetsState.ITYPE_NAVIGATION_BAR;
+import static android.view.InsetsState.ITYPE_STATUS_BAR;
+import static android.view.InsetsState.containsType;
+import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
+
+import static com.android.systemui.statusbar.phone.BarTransitions.MODE_SEMI_TRANSPARENT;
+import static com.android.systemui.statusbar.phone.BarTransitions.MODE_TRANSPARENT;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.PixelFormat;
+import android.inputmethodservice.InputMethodService;
+import android.os.Binder;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.view.Display;
+import android.view.Gravity;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.WindowManager;
+
+import androidx.annotation.VisibleForTesting;
+
+import com.android.internal.statusbar.IStatusBarService;
+import com.android.internal.statusbar.RegisterStatusBarResult;
+import com.android.systemui.R;
+import com.android.systemui.SystemUI;
+import com.android.systemui.car.CarDeviceProvisionedController;
+import com.android.systemui.car.CarDeviceProvisionedListener;
+import com.android.systemui.dagger.qualifiers.Main;
+import com.android.systemui.shared.system.ActivityManagerWrapper;
+import com.android.systemui.statusbar.AutoHideUiElement;
+import com.android.systemui.statusbar.CommandQueue;
+import com.android.systemui.statusbar.phone.AutoHideController;
+import com.android.systemui.statusbar.phone.BarTransitions;
+import com.android.systemui.statusbar.phone.PhoneStatusBarPolicy;
+import com.android.systemui.statusbar.phone.StatusBarIconController;
+import com.android.systemui.statusbar.phone.StatusBarSignalPolicy;
+import com.android.systemui.statusbar.policy.KeyguardStateController;
+
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
+
+import javax.inject.Inject;
+
+import dagger.Lazy;
+
+/** Navigation bars customized for the automotive use case. */
+public class CarNavigationBar extends SystemUI implements CommandQueue.Callbacks {
+
+    private final Resources mResources;
+    private final CarNavigationBarController mCarNavigationBarController;
+    private final WindowManager mWindowManager;
+    private final CarDeviceProvisionedController mCarDeviceProvisionedController;
+    private final CommandQueue mCommandQueue;
+    private final AutoHideController mAutoHideController;
+    private final ButtonSelectionStateListener mButtonSelectionStateListener;
+    private final Handler mMainHandler;
+    private final Lazy<KeyguardStateController> mKeyguardStateControllerLazy;
+    private final ButtonSelectionStateController mButtonSelectionStateController;
+    private final PhoneStatusBarPolicy mIconPolicy;
+    private final StatusBarIconController mIconController;
+
+    private final int mDisplayId;
+
+    private StatusBarSignalPolicy mSignalPolicy;
+    private IStatusBarService mBarService;
+    private ActivityManagerWrapper mActivityManagerWrapper;
+
+    // If the nav bar should be hidden when the soft keyboard is visible.
+    private boolean mHideNavBarForKeyboard;
+    private boolean mBottomNavBarVisible;
+
+    // Nav bar views.
+    private ViewGroup mTopNavigationBarWindow;
+    private ViewGroup mBottomNavigationBarWindow;
+    private ViewGroup mLeftNavigationBarWindow;
+    private ViewGroup mRightNavigationBarWindow;
+    private CarNavigationBarView mTopNavigationBarView;
+    private CarNavigationBarView mBottomNavigationBarView;
+    private CarNavigationBarView mLeftNavigationBarView;
+    private CarNavigationBarView mRightNavigationBarView;
+
+    // To be attached to the navigation bars such that they can close the notification panel if
+    // it's open.
+    private boolean mDeviceIsSetUpForUser = true;
+    private boolean mIsUserSetupInProgress = false;
+
+    private @BarTransitions.TransitionMode int mStatusBarMode;
+    private @BarTransitions.TransitionMode int mNavigationBarMode;
+    private boolean mStatusBarTransientShown;
+    private boolean mNavBarTransientShown;
+
+    @Inject
+    public CarNavigationBar(Context context,
+            @Main Resources resources,
+            CarNavigationBarController carNavigationBarController,
+            WindowManager windowManager,
+            CarDeviceProvisionedController deviceProvisionedController,
+            CommandQueue commandQueue,
+            AutoHideController autoHideController,
+            ButtonSelectionStateListener buttonSelectionStateListener,
+            @Main Handler mainHandler,
+            Lazy<KeyguardStateController> keyguardStateControllerLazy,
+            ButtonSelectionStateController buttonSelectionStateController,
+            PhoneStatusBarPolicy iconPolicy,
+            StatusBarIconController iconController
+    ) {
+        super(context);
+        mResources = resources;
+        mCarNavigationBarController = carNavigationBarController;
+        mWindowManager = windowManager;
+        mCarDeviceProvisionedController = deviceProvisionedController;
+        mCommandQueue = commandQueue;
+        mAutoHideController = autoHideController;
+        mButtonSelectionStateListener = buttonSelectionStateListener;
+        mMainHandler = mainHandler;
+        mKeyguardStateControllerLazy = keyguardStateControllerLazy;
+        mButtonSelectionStateController = buttonSelectionStateController;
+        mIconPolicy = iconPolicy;
+        mIconController = iconController;
+
+        mDisplayId = context.getDisplayId();
+    }
+
+    @Override
+    public void start() {
+        // Set initial state.
+        mHideNavBarForKeyboard = mResources.getBoolean(
+                com.android.internal.R.bool.config_automotiveHideNavBarForKeyboard);
+        mBottomNavBarVisible = false;
+
+        // Get bar service.
+        mBarService = IStatusBarService.Stub.asInterface(
+                ServiceManager.getService(Context.STATUS_BAR_SERVICE));
+
+        // Connect into the status bar manager service
+        mCommandQueue.addCallback(this);
+
+        RegisterStatusBarResult result = null;
+        try {
+            result = mBarService.registerStatusBar(mCommandQueue);
+        } catch (RemoteException ex) {
+            ex.rethrowFromSystemServer();
+        }
+
+        // StatusBarManagerService has a back up of IME token and it's restored here.
+        setImeWindowStatus(mDisplayId, result.mImeToken, result.mImeWindowVis,
+                result.mImeBackDisposition, result.mShowImeSwitcher);
+
+        // Set up the initial icon state
+        int numIcons = result.mIcons.size();
+        for (int i = 0; i < numIcons; i++) {
+            mCommandQueue.setIcon(result.mIcons.keyAt(i), result.mIcons.valueAt(i));
+        }
+
+        mAutoHideController.setStatusBar(new AutoHideUiElement() {
+            @Override
+            public void synchronizeState() {
+                // No op.
+            }
+
+            @Override
+            public boolean isVisible() {
+                return mStatusBarTransientShown;
+            }
+
+            @Override
+            public void hide() {
+                clearTransient();
+            }
+        });
+
+        mAutoHideController.setNavigationBar(new AutoHideUiElement() {
+            @Override
+            public void synchronizeState() {
+                // No op.
+            }
+
+            @Override
+            public boolean isVisible() {
+                return mNavBarTransientShown;
+            }
+
+            @Override
+            public void hide() {
+                clearTransient();
+            }
+        });
+
+        mDeviceIsSetUpForUser = mCarDeviceProvisionedController.isCurrentUserSetup();
+        mIsUserSetupInProgress = mCarDeviceProvisionedController.isCurrentUserSetupInProgress();
+        mCarDeviceProvisionedController.addCallback(
+                new CarDeviceProvisionedListener() {
+                    @Override
+                    public void onUserSetupInProgressChanged() {
+                        mMainHandler.post(() -> restartNavBarsIfNecessary());
+                    }
+
+                    @Override
+                    public void onUserSetupChanged() {
+                        mMainHandler.post(() -> restartNavBarsIfNecessary());
+                    }
+
+                    @Override
+                    public void onUserSwitched() {
+                        mMainHandler.post(() -> restartNavBarsIfNecessary());
+                    }
+                });
+
+        createNavigationBar(result);
+
+        mActivityManagerWrapper = ActivityManagerWrapper.getInstance();
+        mActivityManagerWrapper.registerTaskStackListener(mButtonSelectionStateListener);
+
+        mCarNavigationBarController.connectToHvac();
+
+        // Lastly, call to the icon policy to install/update all the icons.
+        mIconPolicy.init();
+        mSignalPolicy = new StatusBarSignalPolicy(mContext, mIconController);
+    }
+
+    private void restartNavBarsIfNecessary() {
+        boolean currentUserSetup = mCarDeviceProvisionedController.isCurrentUserSetup();
+        boolean currentUserSetupInProgress = mCarDeviceProvisionedController
+                .isCurrentUserSetupInProgress();
+        if (mIsUserSetupInProgress != currentUserSetupInProgress
+                || mDeviceIsSetUpForUser != currentUserSetup) {
+            mDeviceIsSetUpForUser = currentUserSetup;
+            mIsUserSetupInProgress = currentUserSetupInProgress;
+            restartNavBars();
+        }
+    }
+
+    /**
+     * Remove all content from navbars and rebuild them. Used to allow for different nav bars
+     * before and after the device is provisioned. . Also for change of density and font size.
+     */
+    private void restartNavBars() {
+        // remove and reattach all hvac components such that we don't keep a reference to unused
+        // ui elements
+        mCarNavigationBarController.removeAllFromHvac();
+        mButtonSelectionStateController.removeAll();
+
+        if (mTopNavigationBarWindow != null) {
+            mTopNavigationBarWindow.removeAllViews();
+            mTopNavigationBarView = null;
+        }
+
+        if (mBottomNavigationBarWindow != null) {
+            mBottomNavigationBarWindow.removeAllViews();
+            mBottomNavigationBarView = null;
+        }
+
+        if (mLeftNavigationBarWindow != null) {
+            mLeftNavigationBarWindow.removeAllViews();
+            mLeftNavigationBarView = null;
+        }
+
+        if (mRightNavigationBarWindow != null) {
+            mRightNavigationBarWindow.removeAllViews();
+            mRightNavigationBarView = null;
+        }
+
+        buildNavBarContent();
+        // If the UI was rebuilt (day/night change or user change) while the keyguard was up we need
+        // to correctly respect that state.
+        if (mKeyguardStateControllerLazy.get().isShowing()) {
+            mCarNavigationBarController.showAllKeyguardButtons(isDeviceSetupForUser());
+        } else {
+            mCarNavigationBarController.hideAllKeyguardButtons(isDeviceSetupForUser());
+        }
+
+        // Upon restarting the Navigation Bar, CarFacetButtonController should immediately apply the
+        // selection state that reflects the current task stack.
+        mButtonSelectionStateListener.onTaskStackChanged();
+    }
+
+    private boolean isDeviceSetupForUser() {
+        return mDeviceIsSetUpForUser && !mIsUserSetupInProgress;
+    }
+
+    private void createNavigationBar(RegisterStatusBarResult result) {
+        buildNavBarWindows();
+        buildNavBarContent();
+        attachNavBarWindows();
+
+        // Try setting up the initial state of the nav bar if applicable.
+        if (result != null) {
+            setImeWindowStatus(Display.DEFAULT_DISPLAY, result.mImeToken,
+                    result.mImeWindowVis, result.mImeBackDisposition,
+                    result.mShowImeSwitcher);
+        }
+    }
+
+    private void buildNavBarWindows() {
+        mTopNavigationBarWindow = mCarNavigationBarController.getTopWindow();
+        mBottomNavigationBarWindow = mCarNavigationBarController.getBottomWindow();
+        mLeftNavigationBarWindow = mCarNavigationBarController.getLeftWindow();
+        mRightNavigationBarWindow = mCarNavigationBarController.getRightWindow();
+    }
+
+    private void buildNavBarContent() {
+        mTopNavigationBarView = mCarNavigationBarController.getTopBar(isDeviceSetupForUser());
+        if (mTopNavigationBarView != null) {
+            mTopNavigationBarWindow.addView(mTopNavigationBarView);
+        }
+
+        mBottomNavigationBarView = mCarNavigationBarController.getBottomBar(isDeviceSetupForUser());
+        if (mBottomNavigationBarView != null) {
+            mBottomNavigationBarWindow.addView(mBottomNavigationBarView);
+        }
+
+        mLeftNavigationBarView = mCarNavigationBarController.getLeftBar(isDeviceSetupForUser());
+        if (mLeftNavigationBarView != null) {
+            mLeftNavigationBarWindow.addView(mLeftNavigationBarView);
+        }
+
+        mRightNavigationBarView = mCarNavigationBarController.getRightBar(isDeviceSetupForUser());
+        if (mRightNavigationBarView != null) {
+            mRightNavigationBarWindow.addView(mRightNavigationBarView);
+        }
+    }
+
+    private void attachNavBarWindows() {
+        if (mTopNavigationBarWindow != null) {
+            int height = mResources.getDimensionPixelSize(
+                    com.android.internal.R.dimen.status_bar_height);
+            WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
+                    ViewGroup.LayoutParams.MATCH_PARENT,
+                    height,
+                    WindowManager.LayoutParams.TYPE_STATUS_BAR,
+                    WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
+                            | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH
+                            | WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS,
+                    PixelFormat.TRANSLUCENT);
+            lp.token = new Binder();
+            lp.gravity = Gravity.TOP;
+            lp.setFitInsetsTypes(0 /* types */);
+            lp.setTitle("TopCarNavigationBar");
+            lp.packageName = mContext.getPackageName();
+            lp.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
+            mWindowManager.addView(mTopNavigationBarWindow, lp);
+        }
+
+        if (mBottomNavigationBarWindow != null && !mBottomNavBarVisible) {
+            mBottomNavBarVisible = true;
+
+            WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
+                    ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT,
+                    WindowManager.LayoutParams.TYPE_NAVIGATION_BAR,
+                    WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
+                            | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
+                            | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
+                            | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH,
+                    PixelFormat.TRANSLUCENT);
+            lp.setTitle("BottomCarNavigationBar");
+            lp.windowAnimations = 0;
+            mWindowManager.addView(mBottomNavigationBarWindow, lp);
+        }
+
+        if (mLeftNavigationBarWindow != null) {
+            int width = mResources.getDimensionPixelSize(
+                    R.dimen.car_left_navigation_bar_width);
+            WindowManager.LayoutParams leftlp = new WindowManager.LayoutParams(
+                    width, ViewGroup.LayoutParams.MATCH_PARENT,
+                    WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL,
+                    WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
+                            | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
+                            | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
+                            | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH,
+                    PixelFormat.TRANSLUCENT);
+            leftlp.setTitle("LeftCarNavigationBar");
+            leftlp.windowAnimations = 0;
+            leftlp.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_IS_SCREEN_DECOR;
+            leftlp.gravity = Gravity.LEFT;
+            leftlp.setFitInsetsTypes(0 /* types */);
+            mWindowManager.addView(mLeftNavigationBarWindow, leftlp);
+        }
+        if (mRightNavigationBarWindow != null) {
+            int width = mResources.getDimensionPixelSize(
+                    R.dimen.car_right_navigation_bar_width);
+            WindowManager.LayoutParams rightlp = new WindowManager.LayoutParams(
+                    width, ViewGroup.LayoutParams.MATCH_PARENT,
+                    WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL,
+                    WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
+                            | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
+                            | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
+                            | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH,
+                    PixelFormat.TRANSLUCENT);
+            rightlp.setTitle("RightCarNavigationBar");
+            rightlp.windowAnimations = 0;
+            rightlp.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_IS_SCREEN_DECOR;
+            rightlp.gravity = Gravity.RIGHT;
+            rightlp.setFitInsetsTypes(0 /* types */);
+            mWindowManager.addView(mRightNavigationBarWindow, rightlp);
+        }
+    }
+
+    /**
+     * We register for soft keyboard visibility events such that we can hide the navigation bar
+     * giving more screen space to the IME. Note: this is optional and controlled by
+     * {@code com.android.internal.R.bool.config_automotiveHideNavBarForKeyboard}.
+     */
+    @Override
+    public void setImeWindowStatus(int displayId, IBinder token, int vis, int backDisposition,
+            boolean showImeSwitcher) {
+        if (!mHideNavBarForKeyboard) {
+            return;
+        }
+
+        if (mContext.getDisplayId() != displayId) {
+            return;
+        }
+
+        boolean isKeyboardVisible = (vis & InputMethodService.IME_VISIBLE) != 0;
+        mCarNavigationBarController.setBottomWindowVisibility(
+                isKeyboardVisible ? View.GONE : View.VISIBLE);
+    }
+
+    @Override
+    public void showTransient(int displayId, int[] types) {
+        if (displayId != mDisplayId) {
+            return;
+        }
+        if (containsType(types, ITYPE_STATUS_BAR)) {
+            if (!mStatusBarTransientShown) {
+                mStatusBarTransientShown = true;
+                handleTransientChanged();
+            }
+        }
+        if (containsType(types, ITYPE_NAVIGATION_BAR)) {
+            if (!mNavBarTransientShown) {
+                mNavBarTransientShown = true;
+                handleTransientChanged();
+            }
+        }
+    }
+
+    @Override
+    public void abortTransient(int displayId, int[] types) {
+        if (displayId != mDisplayId) {
+            return;
+        }
+        if (!containsType(types, ITYPE_STATUS_BAR) && !containsType(types, ITYPE_NAVIGATION_BAR)) {
+            return;
+        }
+        clearTransient();
+    }
+
+    private void clearTransient() {
+        if (mStatusBarTransientShown) {
+            mStatusBarTransientShown = false;
+            handleTransientChanged();
+        }
+        if (mNavBarTransientShown) {
+            mNavBarTransientShown = false;
+            handleTransientChanged();
+        }
+    }
+
+    @VisibleForTesting
+    boolean isStatusBarTransientShown() {
+        return mStatusBarTransientShown;
+    }
+
+    @VisibleForTesting
+    boolean isNavBarTransientShown() {
+        return mNavBarTransientShown;
+    }
+
+    @Override
+    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
+        pw.print("  mTaskStackListener=");
+        pw.println(mButtonSelectionStateListener);
+        pw.print("  mBottomNavigationBarView=");
+        pw.println(mBottomNavigationBarView);
+    }
+
+    private void handleTransientChanged() {
+        updateStatusBarMode(mStatusBarTransientShown ? MODE_SEMI_TRANSPARENT : MODE_TRANSPARENT);
+        updateNavBarMode(mNavBarTransientShown ? MODE_SEMI_TRANSPARENT : MODE_TRANSPARENT);
+    }
+
+    // Returns true if the status bar mode has changed.
+    private boolean updateStatusBarMode(int barMode) {
+        if (mStatusBarMode != barMode) {
+            mStatusBarMode = barMode;
+            mAutoHideController.touchAutoHide();
+            return true;
+        }
+        return false;
+    }
+
+    // Returns true if the nav bar mode has changed.
+    private boolean updateNavBarMode(int barMode) {
+        if (mNavigationBarMode != barMode) {
+            mNavigationBarMode = barMode;
+            mAutoHideController.touchAutoHide();
+            return true;
+        }
+        return false;
+    }
+}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/CarNavigationBarController.java b/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/CarNavigationBarController.java
new file mode 100644
index 0000000..55c1153
--- /dev/null
+++ b/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/CarNavigationBarController.java
@@ -0,0 +1,336 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.car.navigationbar;
+
+import android.content.Context;
+import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import com.android.systemui.R;
+import com.android.systemui.car.hvac.HvacController;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import dagger.Lazy;
+
+/** A single class which controls the navigation bar views. */
+@Singleton
+public class CarNavigationBarController {
+
+    private final Context mContext;
+    private final NavigationBarViewFactory mNavigationBarViewFactory;
+    private final ButtonSelectionStateController mButtonSelectionStateController;
+    private final Lazy<HvacController> mHvacControllerLazy;
+
+    private boolean mShowTop;
+    private boolean mShowBottom;
+    private boolean mShowLeft;
+    private boolean mShowRight;
+
+    private View.OnTouchListener mTopBarTouchListener;
+    private View.OnTouchListener mBottomBarTouchListener;
+    private View.OnTouchListener mLeftBarTouchListener;
+    private View.OnTouchListener mRightBarTouchListener;
+    private NotificationsShadeController mNotificationsShadeController;
+
+    private CarNavigationBarView mTopView;
+    private CarNavigationBarView mBottomView;
+    private CarNavigationBarView mLeftView;
+    private CarNavigationBarView mRightView;
+
+    @Inject
+    public CarNavigationBarController(Context context,
+            NavigationBarViewFactory navigationBarViewFactory,
+            ButtonSelectionStateController buttonSelectionStateController,
+            Lazy<HvacController> hvacControllerLazy) {
+        mContext = context;
+        mNavigationBarViewFactory = navigationBarViewFactory;
+        mButtonSelectionStateController = buttonSelectionStateController;
+        mHvacControllerLazy = hvacControllerLazy;
+
+        // Read configuration.
+        mShowTop = mContext.getResources().getBoolean(R.bool.config_enableTopNavigationBar);
+        mShowBottom = mContext.getResources().getBoolean(R.bool.config_enableBottomNavigationBar);
+        mShowLeft = mContext.getResources().getBoolean(R.bool.config_enableLeftNavigationBar);
+        mShowRight = mContext.getResources().getBoolean(R.bool.config_enableRightNavigationBar);
+    }
+
+    /**
+     * Hides all navigation bars.
+     */
+    public void hideBars() {
+        if (mTopView != null) {
+            mTopView.setVisibility(View.GONE);
+        }
+        setBottomWindowVisibility(View.GONE);
+        setLeftWindowVisibility(View.GONE);
+        setRightWindowVisibility(View.GONE);
+    }
+
+    /**
+     * Shows all navigation bars.
+     */
+    public void showBars() {
+        if (mTopView != null) {
+            mTopView.setVisibility(View.VISIBLE);
+        }
+        setBottomWindowVisibility(View.VISIBLE);
+        setLeftWindowVisibility(View.VISIBLE);
+        setRightWindowVisibility(View.VISIBLE);
+    }
+
+    /** Connect to hvac service. */
+    public void connectToHvac() {
+        mHvacControllerLazy.get().connectToCarService();
+    }
+
+    /** Clean up hvac. */
+    public void removeAllFromHvac() {
+        mHvacControllerLazy.get().removeAllComponents();
+    }
+
+    /** Gets the top window if configured to do so. */
+    @Nullable
+    public ViewGroup getTopWindow() {
+        return mShowTop ? mNavigationBarViewFactory.getTopWindow() : null;
+    }
+
+    /** Gets the bottom window if configured to do so. */
+    @Nullable
+    public ViewGroup getBottomWindow() {
+        return mShowBottom ? mNavigationBarViewFactory.getBottomWindow() : null;
+    }
+
+    /** Gets the left window if configured to do so. */
+    @Nullable
+    public ViewGroup getLeftWindow() {
+        return mShowLeft ? mNavigationBarViewFactory.getLeftWindow() : null;
+    }
+
+    /** Gets the right window if configured to do so. */
+    @Nullable
+    public ViewGroup getRightWindow() {
+        return mShowRight ? mNavigationBarViewFactory.getRightWindow() : null;
+    }
+
+    /** Toggles the bottom nav bar visibility. */
+    public boolean setBottomWindowVisibility(@View.Visibility int visibility) {
+        return setWindowVisibility(getBottomWindow(), visibility);
+    }
+
+    /** Toggles the left nav bar visibility. */
+    public boolean setLeftWindowVisibility(@View.Visibility int visibility) {
+        return setWindowVisibility(getLeftWindow(), visibility);
+    }
+
+    /** Toggles the right nav bar visibility. */
+    public boolean setRightWindowVisibility(@View.Visibility int visibility) {
+        return setWindowVisibility(getRightWindow(), visibility);
+    }
+
+    private boolean setWindowVisibility(ViewGroup window, @View.Visibility int visibility) {
+        if (window == null) {
+            return false;
+        }
+
+        if (window.getVisibility() == visibility) {
+            return false;
+        }
+
+        window.setVisibility(visibility);
+        return true;
+    }
+
+    /** Gets the top navigation bar with the appropriate listeners set. */
+    @NonNull
+    public CarNavigationBarView getTopBar(boolean isSetUp) {
+        mTopView = mNavigationBarViewFactory.getTopBar(isSetUp);
+        setupBar(mTopView, mTopBarTouchListener, mNotificationsShadeController);
+        return mTopView;
+    }
+
+    /** Gets the bottom navigation bar with the appropriate listeners set. */
+    @Nullable
+    public CarNavigationBarView getBottomBar(boolean isSetUp) {
+        if (!mShowBottom) {
+            return null;
+        }
+
+        mBottomView = mNavigationBarViewFactory.getBottomBar(isSetUp);
+        setupBar(mBottomView, mBottomBarTouchListener, mNotificationsShadeController);
+        return mBottomView;
+    }
+
+    /** Gets the left navigation bar with the appropriate listeners set. */
+    @Nullable
+    public CarNavigationBarView getLeftBar(boolean isSetUp) {
+        if (!mShowLeft) {
+            return null;
+        }
+
+        mLeftView = mNavigationBarViewFactory.getLeftBar(isSetUp);
+        setupBar(mLeftView, mLeftBarTouchListener, mNotificationsShadeController);
+        return mLeftView;
+    }
+
+    /** Gets the right navigation bar with the appropriate listeners set. */
+    @Nullable
+    public CarNavigationBarView getRightBar(boolean isSetUp) {
+        if (!mShowRight) {
+            return null;
+        }
+
+        mRightView = mNavigationBarViewFactory.getRightBar(isSetUp);
+        setupBar(mRightView, mRightBarTouchListener, mNotificationsShadeController);
+        return mRightView;
+    }
+
+    private void setupBar(CarNavigationBarView view, View.OnTouchListener statusBarTouchListener,
+            NotificationsShadeController notifShadeController) {
+        view.setStatusBarWindowTouchListener(statusBarTouchListener);
+        view.setNotificationsPanelController(notifShadeController);
+        mButtonSelectionStateController.addAllButtonsWithSelectionState(view);
+        mHvacControllerLazy.get().addTemperatureViewToController(view);
+    }
+
+    /** Sets a touch listener for the top navigation bar. */
+    public void registerTopBarTouchListener(View.OnTouchListener listener) {
+        mTopBarTouchListener = listener;
+        if (mTopView != null) {
+            mTopView.setStatusBarWindowTouchListener(mTopBarTouchListener);
+        }
+    }
+
+    /** Sets a touch listener for the bottom navigation bar. */
+    public void registerBottomBarTouchListener(View.OnTouchListener listener) {
+        mBottomBarTouchListener = listener;
+        if (mBottomView != null) {
+            mBottomView.setStatusBarWindowTouchListener(mBottomBarTouchListener);
+        }
+    }
+
+    /** Sets a touch listener for the left navigation bar. */
+    public void registerLeftBarTouchListener(View.OnTouchListener listener) {
+        mLeftBarTouchListener = listener;
+        if (mLeftView != null) {
+            mLeftView.setStatusBarWindowTouchListener(mLeftBarTouchListener);
+        }
+    }
+
+    /** Sets a touch listener for the right navigation bar. */
+    public void registerRightBarTouchListener(View.OnTouchListener listener) {
+        mRightBarTouchListener = listener;
+        if (mRightView != null) {
+            mRightView.setStatusBarWindowTouchListener(mRightBarTouchListener);
+        }
+    }
+
+    /** Sets a notification controller which toggles the notification panel. */
+    public void registerNotificationController(
+            NotificationsShadeController notificationsShadeController) {
+        mNotificationsShadeController = notificationsShadeController;
+        if (mTopView != null) {
+            mTopView.setNotificationsPanelController(mNotificationsShadeController);
+        }
+        if (mBottomView != null) {
+            mBottomView.setNotificationsPanelController(mNotificationsShadeController);
+        }
+        if (mLeftView != null) {
+            mLeftView.setNotificationsPanelController(mNotificationsShadeController);
+        }
+        if (mRightView != null) {
+            mRightView.setNotificationsPanelController(mNotificationsShadeController);
+        }
+    }
+
+    /**
+     * Shows all of the keyguard specific buttons on the valid instances of
+     * {@link CarNavigationBarView}.
+     */
+    public void showAllKeyguardButtons(boolean isSetUp) {
+        checkAllBars(isSetUp);
+        if (mTopView != null) {
+            mTopView.showKeyguardButtons();
+        }
+        if (mBottomView != null) {
+            mBottomView.showKeyguardButtons();
+        }
+        if (mLeftView != null) {
+            mLeftView.showKeyguardButtons();
+        }
+        if (mRightView != null) {
+            mRightView.showKeyguardButtons();
+        }
+    }
+
+    /**
+     * Hides all of the keyguard specific buttons on the valid instances of
+     * {@link CarNavigationBarView}.
+     */
+    public void hideAllKeyguardButtons(boolean isSetUp) {
+        checkAllBars(isSetUp);
+        if (mTopView != null) {
+            mTopView.hideKeyguardButtons();
+        }
+        if (mBottomView != null) {
+            mBottomView.hideKeyguardButtons();
+        }
+        if (mLeftView != null) {
+            mLeftView.hideKeyguardButtons();
+        }
+        if (mRightView != null) {
+            mRightView.hideKeyguardButtons();
+        }
+    }
+
+    /** Toggles whether the notifications icon has an unseen indicator or not. */
+    public void toggleAllNotificationsUnseenIndicator(boolean isSetUp, boolean hasUnseen) {
+        checkAllBars(isSetUp);
+        if (mTopView != null) {
+            mTopView.toggleNotificationUnseenIndicator(hasUnseen);
+        }
+        if (mBottomView != null) {
+            mBottomView.toggleNotificationUnseenIndicator(hasUnseen);
+        }
+        if (mLeftView != null) {
+            mLeftView.toggleNotificationUnseenIndicator(hasUnseen);
+        }
+        if (mRightView != null) {
+            mRightView.toggleNotificationUnseenIndicator(hasUnseen);
+        }
+    }
+
+    /** Interface for controlling the notifications shade. */
+    public interface NotificationsShadeController {
+        /** Toggles the visibility of the notifications shade. */
+        void togglePanel();
+
+        /** Returns {@code true} if the panel is open. */
+        boolean isNotificationPanelOpen();
+    }
+
+    private void checkAllBars(boolean isSetUp) {
+        mTopView = getTopBar(isSetUp);
+        mBottomView = getBottomBar(isSetUp);
+        mLeftView = getLeftBar(isSetUp);
+        mRightView = getRightBar(isSetUp);
+    }
+}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/CarNavigationBarView.java b/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/CarNavigationBarView.java
new file mode 100644
index 0000000..46a720b
--- /dev/null
+++ b/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/CarNavigationBarView.java
@@ -0,0 +1,167 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.car.navigationbar;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.MotionEvent;
+import android.view.View;
+import android.widget.LinearLayout;
+
+import com.android.systemui.Dependency;
+import com.android.systemui.R;
+import com.android.systemui.car.navigationbar.CarNavigationBarController.NotificationsShadeController;
+import com.android.systemui.statusbar.CommandQueue;
+import com.android.systemui.statusbar.phone.StatusBarIconController;
+
+/**
+ * A custom navigation bar for the automotive use case.
+ * <p>
+ * The navigation bar in the automotive use case is more like a list of shortcuts, rendered
+ * in a linear layout.
+ */
+public class CarNavigationBarView extends LinearLayout {
+    private final boolean mConsumeTouchWhenPanelOpen;
+
+    private View mNavButtons;
+    private CarNavigationButton mNotificationsButton;
+    private NotificationsShadeController mNotificationsShadeController;
+    private View mLockScreenButtons;
+    // used to wire in open/close gestures for notifications
+    private OnTouchListener mStatusBarWindowTouchListener;
+
+
+    public CarNavigationBarView(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        mConsumeTouchWhenPanelOpen = getResources().getBoolean(
+                R.bool.config_consumeNavigationBarTouchWhenNotificationPanelOpen);
+    }
+
+    @Override
+    public void onFinishInflate() {
+        mNavButtons = findViewById(R.id.nav_buttons);
+        mLockScreenButtons = findViewById(R.id.lock_screen_nav_buttons);
+
+        mNotificationsButton = findViewById(R.id.notifications);
+        if (mNotificationsButton != null) {
+            mNotificationsButton.setOnClickListener(this::onNotificationsClick);
+        }
+        View mStatusIcons = findViewById(R.id.statusIcons);
+        if (mStatusIcons != null) {
+            // Attach the controllers for Status icons such as wifi and bluetooth if the standard
+            // container is in the view.
+            StatusBarIconController.DarkIconManager mDarkIconManager =
+                    new StatusBarIconController.DarkIconManager(
+                            mStatusIcons.findViewById(R.id.statusIcons),
+                            Dependency.get(CommandQueue.class));
+            mDarkIconManager.setShouldLog(true);
+            Dependency.get(StatusBarIconController.class).addIconGroup(mDarkIconManager);
+        }
+        // needs to be clickable so that it will receive ACTION_MOVE events
+        setClickable(true);
+    }
+
+    // Used to forward touch events even if the touch was initiated from a child component
+    @Override
+    public boolean onInterceptTouchEvent(MotionEvent ev) {
+        if (mStatusBarWindowTouchListener != null) {
+            boolean shouldConsumeEvent = mNotificationsShadeController == null ? false
+                    : mNotificationsShadeController.isNotificationPanelOpen();
+
+            // Forward touch events to the status bar window so it can drag
+            // windows if required (Notification shade)
+            mStatusBarWindowTouchListener.onTouch(this, ev);
+
+            if (mConsumeTouchWhenPanelOpen && shouldConsumeEvent) {
+                return true;
+            }
+        }
+        return super.onInterceptTouchEvent(ev);
+    }
+
+    /** Sets the notifications panel controller. */
+    public void setNotificationsPanelController(NotificationsShadeController controller) {
+        mNotificationsShadeController = controller;
+    }
+
+    /** Gets the notifications panel controller. */
+    public NotificationsShadeController getNotificationsPanelController() {
+        return mNotificationsShadeController;
+    }
+
+    /**
+     * Sets a touch listener that will be called from onInterceptTouchEvent and onTouchEvent
+     *
+     * @param statusBarWindowTouchListener The listener to call from touch and intercept touch
+     */
+    public void setStatusBarWindowTouchListener(OnTouchListener statusBarWindowTouchListener) {
+        mStatusBarWindowTouchListener = statusBarWindowTouchListener;
+    }
+
+    /** Gets the touch listener that will be called from onInterceptTouchEvent and onTouchEvent. */
+    public OnTouchListener getStatusBarWindowTouchListener() {
+        return mStatusBarWindowTouchListener;
+    }
+
+    @Override
+    public boolean onTouchEvent(MotionEvent event) {
+        if (mStatusBarWindowTouchListener != null) {
+            mStatusBarWindowTouchListener.onTouch(this, event);
+        }
+        return super.onTouchEvent(event);
+    }
+
+    protected void onNotificationsClick(View v) {
+        if (mNotificationsShadeController != null) {
+            mNotificationsShadeController.togglePanel();
+        }
+    }
+
+    /**
+     * If there are buttons declared in the layout they will be shown and the normal
+     * Nav buttons will be hidden.
+     */
+    public void showKeyguardButtons() {
+        if (mLockScreenButtons == null) {
+            return;
+        }
+        mLockScreenButtons.setVisibility(View.VISIBLE);
+        mNavButtons.setVisibility(View.GONE);
+    }
+
+    /**
+     * If there are buttons declared in the layout they will be hidden and the normal
+     * Nav buttons will be shown.
+     */
+    public void hideKeyguardButtons() {
+        if (mLockScreenButtons == null) return;
+
+        mNavButtons.setVisibility(View.VISIBLE);
+        mLockScreenButtons.setVisibility(View.GONE);
+    }
+
+    /**
+     * Toggles the notification unseen indicator on/off.
+     *
+     * @param hasUnseen true if the unseen notification count is great than 0.
+     */
+    public void toggleNotificationUnseenIndicator(Boolean hasUnseen) {
+        if (mNotificationsButton == null) return;
+
+        mNotificationsButton.setUnseen(hasUnseen);
+    }
+}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/CarNavigationButton.java b/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/CarNavigationButton.java
new file mode 100644
index 0000000..5f4ac2d
--- /dev/null
+++ b/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/CarNavigationButton.java
@@ -0,0 +1,284 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.car.navigationbar;
+
+import android.app.ActivityOptions;
+import android.content.Context;
+import android.content.Intent;
+import android.content.res.TypedArray;
+import android.os.Build;
+import android.os.UserHandle;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.Display;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+
+import com.android.keyguard.AlphaOptimizedImageButton;
+import com.android.systemui.R;
+
+import java.net.URISyntaxException;
+
+/**
+ * CarNavigationButton is an image button that allows for a bit more configuration at the
+ * xml file level. This allows for more control via overlays instead of having to update
+ * code.
+ */
+public class CarNavigationButton extends LinearLayout {
+
+    protected static final float DEFAULT_SELECTED_ALPHA = 1f;
+    protected static final float DEFAULT_UNSELECTED_ALPHA = 0.75f;
+
+    private static final String TAG = "CarNavigationButton";
+    private static final String BUTTON_FILTER_DELIMITER = ";";
+    private static final String EXTRA_BUTTON_CATEGORIES = "categories";
+    private static final String EXTRA_BUTTON_PACKAGES = "packages";
+
+    private Context mContext;
+    private AlphaOptimizedImageButton mIcon;
+    private AlphaOptimizedImageButton mMoreIcon;
+    private ImageView mUnseenIcon;
+    private String mIntent;
+    private String mLongIntent;
+    private boolean mBroadcastIntent;
+    private boolean mHasUnseen = false;
+    private boolean mSelected = false;
+    private float mSelectedAlpha;
+    private float mUnselectedAlpha;
+    private int mSelectedIconResourceId;
+    private int mIconResourceId;
+    private String[] mComponentNames;
+    /** App categories that are to be used with this widget */
+    private String[] mButtonCategories;
+    /** App packages that are allowed to be used with this widget */
+    private String[] mButtonPackages;
+    /** Whether to display more icon beneath the primary icon when the button is selected */
+    private boolean mShowMoreWhenSelected = false;
+    /** Whether to highlight the button if the active application is associated with it */
+    private boolean mHighlightWhenSelected = false;
+
+    public CarNavigationButton(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        mContext = context;
+        View.inflate(mContext, R.layout.car_navigation_button, /* root= */ this);
+        // CarNavigationButton attrs
+        TypedArray typedArray = context.obtainStyledAttributes(attrs,
+                R.styleable.CarNavigationButton);
+
+        setUpIntents(typedArray);
+        setUpIcons(typedArray);
+        typedArray.recycle();
+    }
+
+    /**
+     * @param selected true if should indicate if this is a selected state, false otherwise
+     */
+    public void setSelected(boolean selected) {
+        super.setSelected(selected);
+        mSelected = selected;
+        if (mHighlightWhenSelected) {
+            setAlpha(mSelected ? mSelectedAlpha : mUnselectedAlpha);
+        }
+        if (mShowMoreWhenSelected && mMoreIcon != null) {
+            mMoreIcon.setVisibility(selected ? VISIBLE : GONE);
+        }
+        updateImage();
+    }
+
+    /**
+     * @param hasUnseen true if should indicate if this is a Unseen state, false otherwise.
+     */
+    public void setUnseen(boolean hasUnseen) {
+        mHasUnseen = hasUnseen;
+        updateImage();
+    }
+
+    /** Gets whether the icon is in an unseen state. */
+    public boolean getUnseen() {
+        return mHasUnseen;
+    }
+
+    /**
+     * @return The app categories the component represents
+     */
+    public String[] getCategories() {
+        if (mButtonCategories == null) {
+            return new String[0];
+        }
+        return mButtonCategories;
+    }
+
+    /**
+     * @return The valid packages that should be considered.
+     */
+    public String[] getPackages() {
+        if (mButtonPackages == null) {
+            return new String[0];
+        }
+        return mButtonPackages;
+    }
+
+    /**
+     * @return The list of component names.
+     */
+    public String[] getComponentName() {
+        if (mComponentNames == null) {
+            return new String[0];
+        }
+        return mComponentNames;
+    }
+
+    /**
+     * @return The id of the display the button is on or Display.INVALID_DISPLAY if it's not yet on
+     * a display.
+     */
+    protected int getDisplayId() {
+        Display display = getDisplay();
+        if (display == null) {
+            return Display.INVALID_DISPLAY;
+        }
+        return display.getDisplayId();
+    }
+
+    protected boolean hasSelectionState() {
+        return mHighlightWhenSelected || mShowMoreWhenSelected;
+    }
+
+    /**
+     * Sets up intents for click, long touch, and broadcast.
+     */
+    protected void setUpIntents(TypedArray typedArray) {
+        mIntent = typedArray.getString(R.styleable.CarNavigationButton_intent);
+        mLongIntent = typedArray.getString(R.styleable.CarNavigationButton_longIntent);
+        mBroadcastIntent = typedArray.getBoolean(R.styleable.CarNavigationButton_broadcast, false);
+
+        String categoryString = typedArray.getString(R.styleable.CarNavigationButton_categories);
+        String packageString = typedArray.getString(R.styleable.CarNavigationButton_packages);
+        String componentNameString =
+                typedArray.getString(R.styleable.CarNavigationButton_componentNames);
+
+        try {
+            if (mIntent != null) {
+                final Intent intent = Intent.parseUri(mIntent, Intent.URI_INTENT_SCHEME);
+                setOnClickListener(getButtonClickListener(intent));
+                if (packageString != null) {
+                    mButtonPackages = packageString.split(BUTTON_FILTER_DELIMITER);
+                    intent.putExtra(EXTRA_BUTTON_PACKAGES, mButtonPackages);
+                }
+                if (categoryString != null) {
+                    mButtonCategories = categoryString.split(BUTTON_FILTER_DELIMITER);
+                    intent.putExtra(EXTRA_BUTTON_CATEGORIES, mButtonCategories);
+                }
+                if (componentNameString != null) {
+                    mComponentNames = componentNameString.split(BUTTON_FILTER_DELIMITER);
+                }
+            }
+        } catch (URISyntaxException e) {
+            throw new RuntimeException("Failed to attach intent", e);
+        }
+
+        try {
+            if (mLongIntent != null && (Build.IS_ENG || Build.IS_USERDEBUG)) {
+                final Intent intent = Intent.parseUri(mLongIntent, Intent.URI_INTENT_SCHEME);
+                setOnLongClickListener(getButtonLongClickListener(intent));
+            }
+        } catch (URISyntaxException e) {
+            throw new RuntimeException("Failed to attach long press intent", e);
+        }
+    }
+
+    /** Defines the behavior of a button click. */
+    protected OnClickListener getButtonClickListener(Intent toSend) {
+        return v -> {
+            mContext.sendBroadcastAsUser(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS),
+                    UserHandle.CURRENT);
+            try {
+                if (mBroadcastIntent) {
+                    mContext.sendBroadcastAsUser(toSend, UserHandle.CURRENT);
+                    return;
+                }
+                ActivityOptions options = ActivityOptions.makeBasic();
+                options.setLaunchDisplayId(mContext.getDisplayId());
+                mContext.startActivityAsUser(toSend, options.toBundle(),
+                        UserHandle.CURRENT);
+            } catch (Exception e) {
+                Log.e(TAG, "Failed to launch intent", e);
+            }
+        };
+    }
+
+    /** Defines the behavior of a long click. */
+    protected OnLongClickListener getButtonLongClickListener(Intent toSend) {
+        return v -> {
+            mContext.sendBroadcastAsUser(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS),
+                    UserHandle.CURRENT);
+            try {
+                ActivityOptions options = ActivityOptions.makeBasic();
+                options.setLaunchDisplayId(mContext.getDisplayId());
+                mContext.startActivityAsUser(toSend, options.toBundle(),
+                        UserHandle.CURRENT);
+            } catch (Exception e) {
+                Log.e(TAG, "Failed to launch intent", e);
+            }
+            // consume event either way
+            return true;
+        };
+    }
+
+
+    /**
+     * Initializes view-related aspects of the button.
+     */
+    private void setUpIcons(TypedArray typedArray) {
+        mSelectedAlpha = typedArray.getFloat(
+                R.styleable.CarNavigationButton_selectedAlpha, DEFAULT_SELECTED_ALPHA);
+        mUnselectedAlpha = typedArray.getFloat(
+                R.styleable.CarNavigationButton_unselectedAlpha, DEFAULT_UNSELECTED_ALPHA);
+        mHighlightWhenSelected = typedArray.getBoolean(
+                R.styleable.CarNavigationButton_highlightWhenSelected,
+                mHighlightWhenSelected);
+        mShowMoreWhenSelected = typedArray.getBoolean(
+                R.styleable.CarNavigationButton_showMoreWhenSelected,
+                mShowMoreWhenSelected);
+
+        mSelectedIconResourceId = typedArray.getResourceId(
+                R.styleable.CarNavigationButton_selectedIcon, mIconResourceId);
+        mIconResourceId = typedArray.getResourceId(
+                R.styleable.CarNavigationButton_icon, 0);
+
+        mIcon = findViewById(R.id.car_nav_button_icon_image);
+        mIcon.setScaleType(ImageView.ScaleType.CENTER);
+        // Always apply selected alpha if the button does not toggle alpha based on selection state.
+        mIcon.setAlpha(mHighlightWhenSelected ? mUnselectedAlpha : mSelectedAlpha);
+        mIcon.setImageResource(mIconResourceId);
+
+        mMoreIcon = findViewById(R.id.car_nav_button_more_icon);
+        mMoreIcon.setAlpha(mSelectedAlpha);
+        mMoreIcon.setVisibility(GONE);
+
+        mUnseenIcon = findViewById(R.id.car_nav_button_unseen_icon);
+
+        mUnseenIcon.setVisibility(mHasUnseen ? VISIBLE : GONE);
+    }
+
+    private void updateImage() {
+        mIcon.setImageResource(mSelected ? mSelectedIconResourceId : mIconResourceId);
+        mUnseenIcon.setVisibility(mHasUnseen ? VISIBLE : GONE);
+    }
+
+}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/NavigationBarViewFactory.java b/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/NavigationBarViewFactory.java
new file mode 100644
index 0000000..3b7b48a
--- /dev/null
+++ b/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/NavigationBarViewFactory.java
@@ -0,0 +1,152 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.car.navigationbar;
+
+import android.content.Context;
+import android.util.ArrayMap;
+import android.util.Log;
+import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.annotation.LayoutRes;
+
+import com.android.systemui.R;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+/** A factory that creates and caches views for navigation bars. */
+@Singleton
+public class NavigationBarViewFactory {
+
+    private static final String TAG = NavigationBarViewFactory.class.getSimpleName();
+    private static final ArrayMap<Type, Integer> sLayoutMap = setupLayoutMapping();
+
+    private static ArrayMap<Type, Integer> setupLayoutMapping() {
+        ArrayMap<Type, Integer> map = new ArrayMap<>();
+        map.put(Type.TOP, R.layout.car_top_navigation_bar);
+        map.put(Type.TOP_UNPROVISIONED, R.layout.car_top_navigation_bar_unprovisioned);
+        map.put(Type.BOTTOM, R.layout.car_navigation_bar);
+        map.put(Type.BOTTOM_UNPROVISIONED, R.layout.car_navigation_bar_unprovisioned);
+        map.put(Type.LEFT, R.layout.car_left_navigation_bar);
+        map.put(Type.LEFT_UNPROVISIONED, R.layout.car_left_navigation_bar_unprovisioned);
+        map.put(Type.RIGHT, R.layout.car_right_navigation_bar);
+        map.put(Type.RIGHT_UNPROVISIONED, R.layout.car_right_navigation_bar_unprovisioned);
+        return map;
+    }
+
+    private final Context mContext;
+    private final ArrayMap<Type, CarNavigationBarView> mCachedViewMap = new ArrayMap<>(
+            Type.values().length);
+    private final ArrayMap<Type, ViewGroup> mCachedContainerMap = new ArrayMap<>();
+
+    /** Type of navigation bar to be created. */
+    private enum Type {
+        TOP,
+        TOP_UNPROVISIONED,
+        BOTTOM,
+        BOTTOM_UNPROVISIONED,
+        LEFT,
+        LEFT_UNPROVISIONED,
+        RIGHT,
+        RIGHT_UNPROVISIONED
+    }
+
+    @Inject
+    public NavigationBarViewFactory(Context context) {
+        mContext = context;
+    }
+
+    /** Gets the top window. */
+    public ViewGroup getTopWindow() {
+        return getWindowCached(Type.TOP);
+    }
+
+    /** Gets the bottom window. */
+    public ViewGroup getBottomWindow() {
+        return getWindowCached(Type.BOTTOM);
+    }
+
+    /** Gets the left window. */
+    public ViewGroup getLeftWindow() {
+        return getWindowCached(Type.LEFT);
+    }
+
+    /** Gets the right window. */
+    public ViewGroup getRightWindow() {
+        return getWindowCached(Type.RIGHT);
+    }
+
+    /** Gets the top bar. */
+    public CarNavigationBarView getTopBar(boolean isSetUp) {
+        return getBar(isSetUp, Type.TOP, Type.TOP_UNPROVISIONED);
+    }
+
+    /** Gets the bottom bar. */
+    public CarNavigationBarView getBottomBar(boolean isSetUp) {
+        return getBar(isSetUp, Type.BOTTOM, Type.BOTTOM_UNPROVISIONED);
+    }
+
+    /** Gets the left bar. */
+    public CarNavigationBarView getLeftBar(boolean isSetUp) {
+        return getBar(isSetUp, Type.LEFT, Type.LEFT_UNPROVISIONED);
+    }
+
+    /** Gets the right bar. */
+    public CarNavigationBarView getRightBar(boolean isSetUp) {
+        return getBar(isSetUp, Type.RIGHT, Type.RIGHT_UNPROVISIONED);
+    }
+
+    private ViewGroup getWindowCached(Type type) {
+        if (mCachedContainerMap.containsKey(type)) {
+            return mCachedContainerMap.get(type);
+        }
+
+        ViewGroup window = (ViewGroup) View.inflate(mContext,
+                R.layout.navigation_bar_window, /* root= */ null);
+        mCachedContainerMap.put(type, window);
+        return mCachedContainerMap.get(type);
+    }
+
+    private CarNavigationBarView getBar(boolean isSetUp, Type provisioned, Type unprovisioned) {
+        CarNavigationBarView view;
+        if (isSetUp) {
+            view = getBarCached(provisioned, sLayoutMap.get(provisioned));
+        } else {
+            view = getBarCached(unprovisioned, sLayoutMap.get(unprovisioned));
+        }
+
+        if (view == null) {
+            String name = isSetUp ? provisioned.name() : unprovisioned.name();
+            Log.e(TAG, "CarStatusBar failed inflate for " + name);
+            throw new RuntimeException(
+                    "Unable to build " + name + " nav bar due to missing layout");
+        }
+        return view;
+    }
+
+    private CarNavigationBarView getBarCached(Type type, @LayoutRes int barLayout) {
+        if (mCachedViewMap.containsKey(type)) {
+            return mCachedViewMap.get(type);
+        }
+
+        CarNavigationBarView view = (CarNavigationBarView) View.inflate(mContext, barLayout,
+                /* root= */ null);
+        mCachedViewMap.put(type, view);
+        return mCachedViewMap.get(type);
+    }
+}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/notification/CarHeadsUpNotificationSystemContainer.java b/packages/CarSystemUI/src/com/android/systemui/car/notification/CarHeadsUpNotificationSystemContainer.java
index 53e5d9f..20fcca0 100644
--- a/packages/CarSystemUI/src/com/android/systemui/car/notification/CarHeadsUpNotificationSystemContainer.java
+++ b/packages/CarSystemUI/src/com/android/systemui/car/notification/CarHeadsUpNotificationSystemContainer.java
@@ -30,7 +30,6 @@
 import com.android.car.notification.headsup.CarHeadsUpNotificationContainer;
 import com.android.systemui.car.CarDeviceProvisionedController;
 import com.android.systemui.dagger.qualifiers.Main;
-import com.android.systemui.statusbar.car.CarStatusBar;
 
 import javax.inject.Inject;
 import javax.inject.Singleton;
@@ -43,7 +42,7 @@
 @Singleton
 public class CarHeadsUpNotificationSystemContainer implements CarHeadsUpNotificationContainer {
     private final CarDeviceProvisionedController mCarDeviceProvisionedController;
-    private final Lazy<CarStatusBar> mCarStatusBarLazy;
+    private final Lazy<NotificationPanelViewController> mNotificationPanelViewControllerLazy;
 
     private final ViewGroup mWindow;
     private final FrameLayout mHeadsUpContentFrame;
@@ -55,10 +54,9 @@
             @Main Resources resources,
             CarDeviceProvisionedController deviceProvisionedController,
             WindowManager windowManager,
-            // TODO: Remove dependency on CarStatusBar
-            Lazy<CarStatusBar> carStatusBarLazy) {
+            Lazy<NotificationPanelViewController> notificationPanelViewControllerLazy) {
         mCarDeviceProvisionedController = deviceProvisionedController;
-        mCarStatusBarLazy = carStatusBarLazy;
+        mNotificationPanelViewControllerLazy = notificationPanelViewControllerLazy;
 
         boolean showOnBottom = resources.getBoolean(R.bool.config_showHeadsUpNotificationOnBottom);
 
@@ -87,7 +85,8 @@
 
     private void animateShow() {
         if ((mEnableHeadsUpNotificationWhenNotificationShadeOpen
-                || !mCarStatusBarLazy.get().isPanelExpanded()) && isCurrentUserSetup()) {
+                || !mNotificationPanelViewControllerLazy.get().isPanelExpanded())
+                && mCarDeviceProvisionedController.isCurrentUserFullySetup()) {
             mWindow.setVisibility(View.VISIBLE);
         }
     }
@@ -114,9 +113,4 @@
     public boolean isVisible() {
         return mWindow.getVisibility() == View.VISIBLE;
     }
-
-    private boolean isCurrentUserSetup() {
-        return mCarDeviceProvisionedController.isCurrentUserSetup()
-                && !mCarDeviceProvisionedController.isCurrentUserSetupInProgress();
-    }
 }
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewController.java b/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewController.java
index d8a894c..a17a0e9 100644
--- a/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewController.java
+++ b/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewController.java
@@ -45,13 +45,13 @@
 import com.android.systemui.R;
 import com.android.systemui.car.CarDeviceProvisionedController;
 import com.android.systemui.car.CarServiceProvider;
+import com.android.systemui.car.window.OverlayPanelViewController;
+import com.android.systemui.car.window.OverlayViewGlobalStateController;
 import com.android.systemui.dagger.qualifiers.Main;
 import com.android.systemui.plugins.statusbar.StatusBarStateController;
 import com.android.systemui.statusbar.CommandQueue;
 import com.android.systemui.statusbar.FlingAnimationUtils;
 import com.android.systemui.statusbar.StatusBarState;
-import com.android.systemui.window.OverlayPanelViewController;
-import com.android.systemui.window.OverlayViewGlobalStateController;
 
 import javax.inject.Inject;
 import javax.inject.Singleton;
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewMediator.java b/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewMediator.java
index 9d71797..24a84d9 100644
--- a/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewMediator.java
+++ b/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewMediator.java
@@ -20,10 +20,9 @@
 import android.content.res.Configuration;
 
 import com.android.systemui.car.CarDeviceProvisionedController;
-import com.android.systemui.navigationbar.car.CarNavigationBarController;
-import com.android.systemui.statusbar.car.PowerManagerHelper;
+import com.android.systemui.car.navigationbar.CarNavigationBarController;
+import com.android.systemui.car.window.OverlayViewMediator;
 import com.android.systemui.statusbar.policy.ConfigurationController;
-import com.android.systemui.window.OverlayViewMediator;
 
 import javax.inject.Inject;
 import javax.inject.Singleton;
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/notification/PowerManagerHelper.java b/packages/CarSystemUI/src/com/android/systemui/car/notification/PowerManagerHelper.java
new file mode 100644
index 0000000..92a11d8
--- /dev/null
+++ b/packages/CarSystemUI/src/com/android/systemui/car/notification/PowerManagerHelper.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.car.notification;
+
+import android.annotation.NonNull;
+import android.car.Car;
+import android.car.hardware.power.CarPowerManager;
+import android.car.hardware.power.CarPowerManager.CarPowerStateListener;
+import android.util.Log;
+
+import com.android.systemui.car.CarServiceProvider;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+/**
+ * Helper class for connecting to the {@link CarPowerManager} and listening for power state changes.
+ */
+@Singleton
+public class PowerManagerHelper {
+    public static final String TAG = "PowerManagerHelper";
+
+    private final CarServiceProvider mCarServiceProvider;
+
+    private CarPowerManager mCarPowerManager;
+    private CarPowerStateListener mCarPowerStateListener;
+
+    private final CarServiceProvider.CarServiceOnConnectedListener mCarServiceLifecycleListener;
+
+    @Inject
+    public PowerManagerHelper(CarServiceProvider carServiceProvider) {
+        mCarServiceProvider = carServiceProvider;
+        mCarServiceLifecycleListener = car -> {
+            Log.d(TAG, "Car Service connected");
+            mCarPowerManager = (CarPowerManager) car.getCarManager(Car.POWER_SERVICE);
+            if (mCarPowerManager != null) {
+                mCarPowerManager.setListener(mCarPowerStateListener);
+            } else {
+                Log.e(TAG, "CarPowerManager service not available");
+            }
+        };
+    }
+
+    /**
+     * Sets a {@link CarPowerStateListener}. Should be set before {@link #connectToCarService()}.
+     */
+    public void setCarPowerStateListener(@NonNull CarPowerStateListener listener) {
+        mCarPowerStateListener = listener;
+    }
+
+    /**
+     * Connect to Car service.
+     */
+    public void connectToCarService() {
+        mCarServiceProvider.addListener(mCarServiceLifecycleListener);
+    }
+}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/sideloaded/CarSideLoadedAppDetector.java b/packages/CarSystemUI/src/com/android/systemui/car/sideloaded/CarSideLoadedAppDetector.java
new file mode 100644
index 0000000..f145b14
--- /dev/null
+++ b/packages/CarSystemUI/src/com/android/systemui/car/sideloaded/CarSideLoadedAppDetector.java
@@ -0,0 +1,136 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.car.sideloaded;
+
+import android.annotation.NonNull;
+import android.app.ActivityManager;
+import android.content.ComponentName;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.InstallSourceInfo;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.content.res.Resources;
+import android.os.UserHandle;
+import android.util.Log;
+
+import com.android.systemui.R;
+import com.android.systemui.car.CarDeviceProvisionedController;
+import com.android.systemui.dagger.qualifiers.Main;
+
+import java.util.Arrays;
+import java.util.List;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+/**
+ * A class that detects unsafe apps.
+ * An app is considered safe if is a system app or installed through whitelisted sources.
+ */
+@Singleton
+public class CarSideLoadedAppDetector {
+    private static final String TAG = "CarSideLoadedDetector";
+
+    private final PackageManager mPackageManager;
+    private final CarDeviceProvisionedController mCarDeviceProvisionedController;
+    private final List<String> mAllowedAppInstallSources;
+
+    @Inject
+    public CarSideLoadedAppDetector(@Main Resources resources, PackageManager packageManager,
+            CarDeviceProvisionedController deviceProvisionedController) {
+        mAllowedAppInstallSources = Arrays.asList(
+                resources.getStringArray(R.array.config_allowedAppInstallSources));
+        mPackageManager = packageManager;
+        mCarDeviceProvisionedController = deviceProvisionedController;
+    }
+
+    boolean hasUnsafeInstalledApps() {
+        int userId = mCarDeviceProvisionedController.getCurrentUser();
+
+        List<PackageInfo> packages = mPackageManager.getInstalledPackagesAsUser(
+                PackageManager.MATCH_DIRECT_BOOT_AWARE
+                        | PackageManager.MATCH_DIRECT_BOOT_UNAWARE,
+                userId);
+        for (PackageInfo info : packages) {
+            if (info.applicationInfo == null) {
+                Log.w(TAG, info.packageName + " does not have application info.");
+                return true;
+            }
+
+            if (!isSafe(info.applicationInfo)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    boolean isSafe(@NonNull ActivityManager.StackInfo stackInfo) {
+        ComponentName componentName = stackInfo.topActivity;
+        if (componentName == null) {
+            Log.w(TAG, "Stack info does not have top activity: " + stackInfo.stackId);
+            return false;
+        }
+        return isSafe(componentName.getPackageName());
+    }
+
+    private boolean isSafe(@NonNull String packageName) {
+        if (packageName == null) {
+            return false;
+        }
+
+        ApplicationInfo applicationInfo;
+        try {
+            int userId = mCarDeviceProvisionedController.getCurrentUser();
+            applicationInfo = mPackageManager.getApplicationInfoAsUser(packageName,
+                    PackageManager.MATCH_DIRECT_BOOT_AWARE
+                            | PackageManager.MATCH_DIRECT_BOOT_UNAWARE,
+                    UserHandle.of(userId));
+
+            if (applicationInfo == null) {
+                Log.e(TAG, packageName + " did not have an application info!");
+                return false;
+            }
+        } catch (PackageManager.NameNotFoundException e) {
+            Log.e(TAG, "Could not get application info for package:" + packageName, e);
+            return false;
+        }
+
+        return isSafe(applicationInfo);
+    }
+
+    private boolean isSafe(@NonNull ApplicationInfo applicationInfo) {
+        String packageName = applicationInfo.packageName;
+
+        if (applicationInfo.isSystemApp() || applicationInfo.isUpdatedSystemApp()) {
+            return true;
+        }
+
+        String initiatingPackageName;
+        try {
+            InstallSourceInfo sourceInfo = mPackageManager.getInstallSourceInfo(packageName);
+            initiatingPackageName = sourceInfo.getInitiatingPackageName();
+            if (initiatingPackageName == null) {
+                Log.w(TAG, packageName + " does not have an installer name.");
+                return false;
+            }
+
+            return mAllowedAppInstallSources.contains(initiatingPackageName);
+        } catch (IllegalArgumentException | PackageManager.NameNotFoundException e) {
+            return false;
+        }
+    }
+}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/statusbar/CarStatusBar.java b/packages/CarSystemUI/src/com/android/systemui/car/statusbar/CarStatusBar.java
new file mode 100644
index 0000000..b6eb015
--- /dev/null
+++ b/packages/CarSystemUI/src/com/android/systemui/car/statusbar/CarStatusBar.java
@@ -0,0 +1,514 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.car.statusbar;
+
+import static com.android.systemui.Dependency.TIME_TICK_HANDLER_NAME;
+
+import android.annotation.Nullable;
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.os.Handler;
+import android.os.PowerManager;
+import android.util.DisplayMetrics;
+import android.util.Log;
+import android.view.View;
+
+import com.android.internal.logging.MetricsLogger;
+import com.android.internal.statusbar.RegisterStatusBarResult;
+import com.android.keyguard.KeyguardUpdateMonitor;
+import com.android.keyguard.ViewMediatorCallback;
+import com.android.systemui.BatteryMeterView;
+import com.android.systemui.Dependency;
+import com.android.systemui.InitController;
+import com.android.systemui.Prefs;
+import com.android.systemui.R;
+import com.android.systemui.assist.AssistManager;
+import com.android.systemui.broadcast.BroadcastDispatcher;
+import com.android.systemui.bubbles.BubbleController;
+import com.android.systemui.car.CarDeviceProvisionedController;
+import com.android.systemui.car.CarDeviceProvisionedListener;
+import com.android.systemui.car.bluetooth.CarBatteryController;
+import com.android.systemui.car.navigationbar.CarNavigationBarController;
+import com.android.systemui.classifier.FalsingLog;
+import com.android.systemui.colorextraction.SysuiColorExtractor;
+import com.android.systemui.dagger.qualifiers.UiBackground;
+import com.android.systemui.fragments.FragmentHostManager;
+import com.android.systemui.keyguard.DismissCallbackRegistry;
+import com.android.systemui.keyguard.KeyguardViewMediator;
+import com.android.systemui.keyguard.ScreenLifecycle;
+import com.android.systemui.keyguard.WakefulnessLifecycle;
+import com.android.systemui.plugins.DarkIconDispatcher;
+import com.android.systemui.plugins.FalsingManager;
+import com.android.systemui.plugins.PluginDependencyProvider;
+import com.android.systemui.plugins.qs.QS;
+import com.android.systemui.recents.Recents;
+import com.android.systemui.recents.ScreenPinningRequest;
+import com.android.systemui.shared.plugins.PluginManager;
+import com.android.systemui.stackdivider.Divider;
+import com.android.systemui.statusbar.CommandQueue;
+import com.android.systemui.statusbar.KeyguardIndicationController;
+import com.android.systemui.statusbar.NavigationBarController;
+import com.android.systemui.statusbar.NotificationLockscreenUserManager;
+import com.android.systemui.statusbar.NotificationMediaManager;
+import com.android.systemui.statusbar.NotificationRemoteInputManager;
+import com.android.systemui.statusbar.NotificationShadeDepthController;
+import com.android.systemui.statusbar.NotificationViewHierarchyManager;
+import com.android.systemui.statusbar.PulseExpansionHandler;
+import com.android.systemui.statusbar.SuperStatusBarViewFactory;
+import com.android.systemui.statusbar.SysuiStatusBarStateController;
+import com.android.systemui.statusbar.VibratorHelper;
+import com.android.systemui.statusbar.notification.DynamicPrivacyController;
+import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator;
+import com.android.systemui.statusbar.notification.VisualStabilityManager;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
+import com.android.systemui.statusbar.notification.init.NotificationsController;
+import com.android.systemui.statusbar.notification.interruption.BypassHeadsUpNotifier;
+import com.android.systemui.statusbar.notification.interruption.NotificationInterruptStateProvider;
+import com.android.systemui.statusbar.notification.interruption.NotificationInterruptSuppressor;
+import com.android.systemui.statusbar.notification.logging.NotificationLogger;
+import com.android.systemui.statusbar.notification.row.NotificationGutsManager;
+import com.android.systemui.statusbar.phone.AutoHideController;
+import com.android.systemui.statusbar.phone.BiometricUnlockController;
+import com.android.systemui.statusbar.phone.CollapsedStatusBarFragment;
+import com.android.systemui.statusbar.phone.DozeParameters;
+import com.android.systemui.statusbar.phone.DozeScrimController;
+import com.android.systemui.statusbar.phone.DozeServiceHost;
+import com.android.systemui.statusbar.phone.HeadsUpManagerPhone;
+import com.android.systemui.statusbar.phone.KeyguardBypassController;
+import com.android.systemui.statusbar.phone.KeyguardDismissUtil;
+import com.android.systemui.statusbar.phone.LightBarController;
+import com.android.systemui.statusbar.phone.LightsOutNotifController;
+import com.android.systemui.statusbar.phone.LockscreenLockIconController;
+import com.android.systemui.statusbar.phone.LockscreenWallpaper;
+import com.android.systemui.statusbar.phone.NotificationGroupManager;
+import com.android.systemui.statusbar.phone.NotificationShadeWindowController;
+import com.android.systemui.statusbar.phone.PhoneStatusBarPolicy;
+import com.android.systemui.statusbar.phone.ScrimController;
+import com.android.systemui.statusbar.phone.ShadeController;
+import com.android.systemui.statusbar.phone.StatusBar;
+import com.android.systemui.statusbar.phone.StatusBarIconController;
+import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
+import com.android.systemui.statusbar.phone.StatusBarNotificationActivityStarter;
+import com.android.systemui.statusbar.phone.StatusBarTouchableRegionManager;
+import com.android.systemui.statusbar.phone.dagger.StatusBarComponent;
+import com.android.systemui.statusbar.policy.BatteryController;
+import com.android.systemui.statusbar.policy.ConfigurationController;
+import com.android.systemui.statusbar.policy.ExtensionController;
+import com.android.systemui.statusbar.policy.KeyguardStateController;
+import com.android.systemui.statusbar.policy.NetworkController;
+import com.android.systemui.statusbar.policy.RemoteInputQuickSettingsDisabler;
+import com.android.systemui.statusbar.policy.UserInfoControllerImpl;
+import com.android.systemui.statusbar.policy.UserSwitcherController;
+import com.android.systemui.volume.VolumeComponent;
+
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
+import java.util.Map;
+import java.util.Optional;
+import java.util.concurrent.Executor;
+
+import javax.inject.Named;
+import javax.inject.Provider;
+
+import dagger.Lazy;
+
+/**
+ * A status bar tailored for the automotive use case.
+ */
+public class CarStatusBar extends StatusBar implements CarBatteryController.BatteryViewHandler {
+    private static final String TAG = "CarStatusBar";
+
+    private final UserSwitcherController mUserSwitcherController;
+    private final ScrimController mScrimController;
+
+    private CarBatteryController mCarBatteryController;
+    private BatteryMeterView mBatteryMeterView;
+    private Drawable mNotificationPanelBackground;
+
+    private final Object mQueueLock = new Object();
+    private final CarNavigationBarController mCarNavigationBarController;
+    private final CarDeviceProvisionedController mCarDeviceProvisionedController;
+    private final ScreenLifecycle mScreenLifecycle;
+
+    private boolean mDeviceIsSetUpForUser = true;
+    private boolean mIsUserSetupInProgress = false;
+
+    public CarStatusBar(
+            Context context,
+            NotificationsController notificationsController,
+            LightBarController lightBarController,
+            AutoHideController autoHideController,
+            KeyguardUpdateMonitor keyguardUpdateMonitor,
+            StatusBarIconController statusBarIconController,
+            PulseExpansionHandler pulseExpansionHandler,
+            NotificationWakeUpCoordinator notificationWakeUpCoordinator,
+            KeyguardBypassController keyguardBypassController,
+            KeyguardStateController keyguardStateController,
+            HeadsUpManagerPhone headsUpManagerPhone,
+            DynamicPrivacyController dynamicPrivacyController,
+            BypassHeadsUpNotifier bypassHeadsUpNotifier,
+            FalsingManager falsingManager,
+            BroadcastDispatcher broadcastDispatcher,
+            RemoteInputQuickSettingsDisabler remoteInputQuickSettingsDisabler,
+            NotificationGutsManager notificationGutsManager,
+            NotificationLogger notificationLogger,
+            NotificationInterruptStateProvider notificationInterruptStateProvider,
+            NotificationViewHierarchyManager notificationViewHierarchyManager,
+            KeyguardViewMediator keyguardViewMediator,
+            DisplayMetrics displayMetrics,
+            MetricsLogger metricsLogger,
+            @UiBackground Executor uiBgExecutor,
+            NotificationMediaManager notificationMediaManager,
+            NotificationLockscreenUserManager lockScreenUserManager,
+            NotificationRemoteInputManager remoteInputManager,
+            UserSwitcherController userSwitcherController,
+            NetworkController networkController,
+            BatteryController batteryController,
+            SysuiColorExtractor colorExtractor,
+            ScreenLifecycle screenLifecycle,
+            WakefulnessLifecycle wakefulnessLifecycle,
+            SysuiStatusBarStateController statusBarStateController,
+            VibratorHelper vibratorHelper,
+            BubbleController bubbleController,
+            NotificationGroupManager groupManager,
+            VisualStabilityManager visualStabilityManager,
+            CarDeviceProvisionedController carDeviceProvisionedController,
+            NavigationBarController navigationBarController,
+            Lazy<AssistManager> assistManagerLazy,
+            ConfigurationController configurationController,
+            NotificationShadeWindowController notificationShadeWindowController,
+            LockscreenLockIconController lockscreenLockIconController,
+            DozeParameters dozeParameters,
+            ScrimController scrimController,
+            Lazy<LockscreenWallpaper> lockscreenWallpaperLazy,
+            Lazy<BiometricUnlockController> biometricUnlockControllerLazy,
+            DozeServiceHost dozeServiceHost,
+            PowerManager powerManager,
+            ScreenPinningRequest screenPinningRequest,
+            DozeScrimController dozeScrimController,
+            VolumeComponent volumeComponent,
+            CommandQueue commandQueue,
+            Optional<Recents> recents,
+            Provider<StatusBarComponent.Builder> statusBarComponentBuilder,
+            PluginManager pluginManager,
+            Optional<Divider> dividerOptional,
+            SuperStatusBarViewFactory superStatusBarViewFactory,
+            LightsOutNotifController lightsOutNotifController,
+            StatusBarNotificationActivityStarter.Builder
+                    statusBarNotificationActivityStarterBuilder,
+            ShadeController shadeController,
+            StatusBarKeyguardViewManager statusBarKeyguardViewManager,
+            ViewMediatorCallback viewMediatorCallback,
+            InitController initController,
+            DarkIconDispatcher darkIconDispatcher,
+            @Named(TIME_TICK_HANDLER_NAME) Handler timeTickHandler,
+            PluginDependencyProvider pluginDependencyProvider,
+            KeyguardDismissUtil keyguardDismissUtil,
+            ExtensionController extensionController,
+            UserInfoControllerImpl userInfoControllerImpl,
+            PhoneStatusBarPolicy phoneStatusBarPolicy,
+            KeyguardIndicationController keyguardIndicationController,
+            DismissCallbackRegistry dismissCallbackRegistry,
+            StatusBarTouchableRegionManager statusBarTouchableRegionManager,
+            Lazy<NotificationShadeDepthController> depthControllerLazy,
+            /* Car Settings injected components. */
+            CarNavigationBarController carNavigationBarController) {
+        super(
+                context,
+                notificationsController,
+                lightBarController,
+                autoHideController,
+                keyguardUpdateMonitor,
+                statusBarIconController,
+                pulseExpansionHandler,
+                notificationWakeUpCoordinator,
+                keyguardBypassController,
+                keyguardStateController,
+                headsUpManagerPhone,
+                dynamicPrivacyController,
+                bypassHeadsUpNotifier,
+                falsingManager,
+                broadcastDispatcher,
+                remoteInputQuickSettingsDisabler,
+                notificationGutsManager,
+                notificationLogger,
+                notificationInterruptStateProvider,
+                notificationViewHierarchyManager,
+                keyguardViewMediator,
+                displayMetrics,
+                metricsLogger,
+                uiBgExecutor,
+                notificationMediaManager,
+                lockScreenUserManager,
+                remoteInputManager,
+                userSwitcherController,
+                networkController,
+                batteryController,
+                colorExtractor,
+                screenLifecycle,
+                wakefulnessLifecycle,
+                statusBarStateController,
+                vibratorHelper,
+                bubbleController,
+                groupManager,
+                visualStabilityManager,
+                carDeviceProvisionedController,
+                navigationBarController,
+                assistManagerLazy,
+                configurationController,
+                notificationShadeWindowController,
+                lockscreenLockIconController,
+                dozeParameters,
+                scrimController,
+                null /* keyguardLiftController */,
+                lockscreenWallpaperLazy,
+                biometricUnlockControllerLazy,
+                dozeServiceHost,
+                powerManager,
+                screenPinningRequest,
+                dozeScrimController,
+                volumeComponent,
+                commandQueue,
+                recents,
+                statusBarComponentBuilder,
+                pluginManager,
+                dividerOptional,
+                lightsOutNotifController,
+                statusBarNotificationActivityStarterBuilder,
+                shadeController,
+                superStatusBarViewFactory,
+                statusBarKeyguardViewManager,
+                viewMediatorCallback,
+                initController,
+                darkIconDispatcher,
+                timeTickHandler,
+                pluginDependencyProvider,
+                keyguardDismissUtil,
+                extensionController,
+                userInfoControllerImpl,
+                phoneStatusBarPolicy,
+                keyguardIndicationController,
+                dismissCallbackRegistry,
+                depthControllerLazy,
+                statusBarTouchableRegionManager);
+        mUserSwitcherController = userSwitcherController;
+        mScrimController = scrimController;
+        mCarDeviceProvisionedController = carDeviceProvisionedController;
+        mCarNavigationBarController = carNavigationBarController;
+        mScreenLifecycle = screenLifecycle;
+    }
+
+    @Override
+    public void start() {
+        mDeviceIsSetUpForUser = mCarDeviceProvisionedController.isCurrentUserSetup();
+        mIsUserSetupInProgress = mCarDeviceProvisionedController.isCurrentUserSetupInProgress();
+
+        super.start();
+
+        createBatteryController();
+        mCarBatteryController.startListening();
+
+        mCarDeviceProvisionedController.addCallback(
+                new CarDeviceProvisionedListener() {
+                    @Override
+                    public void onUserSetupInProgressChanged() {
+                        mDeviceIsSetUpForUser = mCarDeviceProvisionedController
+                                .isCurrentUserSetup();
+                        mIsUserSetupInProgress = mCarDeviceProvisionedController
+                                .isCurrentUserSetupInProgress();
+                    }
+
+                    @Override
+                    public void onUserSetupChanged() {
+                        mDeviceIsSetUpForUser = mCarDeviceProvisionedController
+                                .isCurrentUserSetup();
+                        mIsUserSetupInProgress = mCarDeviceProvisionedController
+                                .isCurrentUserSetupInProgress();
+                    }
+
+                    @Override
+                    public void onUserSwitched() {
+                        mDeviceIsSetUpForUser = mCarDeviceProvisionedController
+                                .isCurrentUserSetup();
+                        mIsUserSetupInProgress = mCarDeviceProvisionedController
+                                .isCurrentUserSetupInProgress();
+                    }
+                });
+
+        mNotificationInterruptStateProvider.addSuppressor(new NotificationInterruptSuppressor() {
+            @Override
+            public String getName() {
+                return TAG;
+            }
+
+            @Override
+            public boolean suppressInterruptions(NotificationEntry entry) {
+                // Because space is usually constrained in the auto use-case, there should not be a
+                // pinned notification when the shade has been expanded.
+                // Ensure this by not allowing any interruptions (ie: pinning any notifications) if
+                // the shade is already opened.
+                return !getPresenter().isPresenterFullyCollapsed();
+            }
+        });
+    }
+
+    @Override
+    public boolean hideKeyguard() {
+        boolean result = super.hideKeyguard();
+        mCarNavigationBarController.hideAllKeyguardButtons(isDeviceSetupForUser());
+        return result;
+    }
+
+    @Override
+    public void showKeyguard() {
+        super.showKeyguard();
+        mCarNavigationBarController.showAllKeyguardButtons(isDeviceSetupForUser());
+    }
+
+    private boolean isDeviceSetupForUser() {
+        return mDeviceIsSetUpForUser && !mIsUserSetupInProgress;
+    }
+
+    @Override
+    protected void makeStatusBarView(@Nullable RegisterStatusBarResult result) {
+        super.makeStatusBarView(result);
+
+        mNotificationPanelBackground = getDefaultWallpaper();
+        mScrimController.setScrimBehindDrawable(mNotificationPanelBackground);
+
+        FragmentHostManager manager = FragmentHostManager.get(mPhoneStatusBarWindow);
+        manager.addTagListener(CollapsedStatusBarFragment.TAG, (tag, fragment) -> {
+            mBatteryMeterView = fragment.getView().findViewById(R.id.battery);
+
+            // By default, the BatteryMeterView should not be visible. It will be toggled
+            // when a device has connected by bluetooth.
+            mBatteryMeterView.setVisibility(View.GONE);
+        });
+    }
+
+    @Override
+    public void animateExpandNotificationsPanel() {
+        // No op.
+    }
+
+    @Override
+    protected QS createDefaultQSFragment() {
+        return null;
+    }
+
+    private BatteryController createBatteryController() {
+        mCarBatteryController = new CarBatteryController(mContext);
+        mCarBatteryController.addBatteryViewHandler(this);
+        return mCarBatteryController;
+    }
+
+    @Override
+    protected void createNavigationBar(@Nullable RegisterStatusBarResult result) {
+        // No op.
+    }
+
+    @Override
+    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
+        //When executing dump() function simultaneously, we need to serialize them
+        //to get mStackScroller's position correctly.
+        synchronized (mQueueLock) {
+            pw.println("  mStackScroller: " + viewInfo(mStackScroller));
+            pw.println("  mStackScroller: " + viewInfo(mStackScroller)
+                    + " scroll " + mStackScroller.getScrollX()
+                    + "," + mStackScroller.getScrollY());
+        }
+        pw.print("  mCarBatteryController=");
+        pw.println(mCarBatteryController);
+        pw.print("  mBatteryMeterView=");
+        pw.println(mBatteryMeterView);
+
+        if (Dependency.get(KeyguardUpdateMonitor.class) != null) {
+            Dependency.get(KeyguardUpdateMonitor.class).dump(fd, pw, args);
+        }
+
+        FalsingLog.dump(pw);
+
+        pw.println("SharedPreferences:");
+        for (Map.Entry<String, ?> entry : Prefs.getAll(mContext).entrySet()) {
+            pw.print("  ");
+            pw.print(entry.getKey());
+            pw.print("=");
+            pw.println(entry.getValue());
+        }
+    }
+
+    @Override
+    public void showBatteryView() {
+        if (Log.isLoggable(TAG, Log.DEBUG)) {
+            Log.d(TAG, "showBatteryView(). mBatteryMeterView: " + mBatteryMeterView);
+        }
+
+        if (mBatteryMeterView != null) {
+            mBatteryMeterView.setVisibility(View.VISIBLE);
+        }
+    }
+
+    @Override
+    public void hideBatteryView() {
+        if (Log.isLoggable(TAG, Log.DEBUG)) {
+            Log.d(TAG, "hideBatteryView(). mBatteryMeterView: " + mBatteryMeterView);
+        }
+
+        if (mBatteryMeterView != null) {
+            mBatteryMeterView.setVisibility(View.GONE);
+        }
+    }
+
+    @Override
+    protected void createUserSwitcher() {
+        if (!mUserSwitcherController.useFullscreenUserSwitcher()) {
+            super.createUserSwitcher();
+        }
+    }
+
+    /**
+     * Dismisses the keyguard and shows bouncer if authentication is necessary.
+     */
+    public void dismissKeyguard() {
+        // Don't dismiss keyguard when the screen is off.
+        if (mScreenLifecycle.getScreenState() == ScreenLifecycle.SCREEN_OFF) {
+            return;
+        }
+        executeRunnableDismissingKeyguard(null/* runnable */, null /* cancelAction */,
+                true /* dismissShade */, true /* afterKeyguardGone */, true /* deferred */);
+    }
+
+    /**
+     * Ensures that relevant child views are appropriately recreated when the device's density
+     * changes.
+     */
+    @Override
+    public void onDensityOrFontScaleChanged() {
+        super.onDensityOrFontScaleChanged();
+        // Need to update the background on density changed in case the change was due to night
+        // mode.
+        mNotificationPanelBackground = getDefaultWallpaper();
+        mScrimController.setScrimBehindDrawable(mNotificationPanelBackground);
+    }
+
+    /**
+     * Returns the {@link Drawable} that represents the wallpaper that the user has currently set.
+     */
+    private Drawable getDefaultWallpaper() {
+        return mContext.getDrawable(com.android.internal.R.drawable.default_wallpaper);
+    }
+}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/statusbar/CarStatusBarKeyguardViewManager.java b/packages/CarSystemUI/src/com/android/systemui/car/statusbar/CarStatusBarKeyguardViewManager.java
new file mode 100644
index 0000000..96a998a
--- /dev/null
+++ b/packages/CarSystemUI/src/com/android/systemui/car/statusbar/CarStatusBarKeyguardViewManager.java
@@ -0,0 +1,137 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.car.statusbar;
+
+import android.content.Context;
+import android.view.View;
+
+import com.android.internal.widget.LockPatternUtils;
+import com.android.keyguard.KeyguardUpdateMonitor;
+import com.android.keyguard.ViewMediatorCallback;
+import com.android.systemui.R;
+import com.android.systemui.car.navigationbar.CarNavigationBarController;
+import com.android.systemui.dock.DockManager;
+import com.android.systemui.statusbar.NotificationMediaManager;
+import com.android.systemui.statusbar.SysuiStatusBarStateController;
+import com.android.systemui.statusbar.phone.NavigationModeController;
+import com.android.systemui.statusbar.phone.NotificationShadeWindowController;
+import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
+import com.android.systemui.statusbar.policy.ConfigurationController;
+import com.android.systemui.statusbar.policy.KeyguardStateController;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+/** Car implementation of the {@link StatusBarKeyguardViewManager}. */
+@Singleton
+public class CarStatusBarKeyguardViewManager extends StatusBarKeyguardViewManager {
+
+    protected boolean mShouldHideNavBar;
+    private final CarNavigationBarController mCarNavigationBarController;
+    private Set<OnKeyguardCancelClickedListener> mKeygaurdCancelClickedListenerSet;
+
+    @Inject
+    public CarStatusBarKeyguardViewManager(Context context,
+            ViewMediatorCallback callback,
+            LockPatternUtils lockPatternUtils,
+            SysuiStatusBarStateController sysuiStatusBarStateController,
+            ConfigurationController configurationController,
+            KeyguardUpdateMonitor keyguardUpdateMonitor,
+            NavigationModeController navigationModeController,
+            DockManager dockManager,
+            NotificationShadeWindowController notificationShadeWindowController,
+            KeyguardStateController keyguardStateController,
+            NotificationMediaManager notificationMediaManager,
+            CarNavigationBarController carNavigationBarController) {
+        super(context, callback, lockPatternUtils, sysuiStatusBarStateController,
+                configurationController, keyguardUpdateMonitor, navigationModeController,
+                dockManager, notificationShadeWindowController, keyguardStateController,
+                notificationMediaManager);
+        mShouldHideNavBar = context.getResources()
+                .getBoolean(R.bool.config_hideNavWhenKeyguardBouncerShown);
+        mCarNavigationBarController = carNavigationBarController;
+        mKeygaurdCancelClickedListenerSet = new HashSet<>();
+    }
+
+    @Override
+    protected void updateNavigationBarVisibility(boolean navBarVisible) {
+        if (!mShouldHideNavBar) {
+            return;
+        }
+        int visibility = navBarVisible ? View.VISIBLE : View.GONE;
+        mCarNavigationBarController.setBottomWindowVisibility(visibility);
+        mCarNavigationBarController.setLeftWindowVisibility(visibility);
+        mCarNavigationBarController.setRightWindowVisibility(visibility);
+    }
+
+    /**
+     * Car is a multi-user system.  There's a cancel button on the bouncer that allows the user to
+     * go back to the user switcher and select another user.  Different user may have different
+     * security mode which requires bouncer container to be resized.  For this reason, the bouncer
+     * view is destroyed on cancel.
+     */
+    @Override
+    protected boolean shouldDestroyViewOnReset() {
+        return true;
+    }
+
+    /**
+     * Called when cancel button in bouncer is pressed.
+     */
+    @Override
+    public void onCancelClicked() {
+        mKeygaurdCancelClickedListenerSet.forEach(OnKeyguardCancelClickedListener::onCancelClicked);
+    }
+
+    /**
+     * Do nothing on this change.
+     * The base class hides the keyguard which for automotive we want to avoid b/c this would happen
+     * on a configuration change due to day/night (headlight state).
+     */
+    @Override
+    public void onDensityOrFontScaleChanged() {  }
+
+    /**
+     * Add listener for keyguard cancel clicked.
+     */
+    public void addOnKeyguardCancelClickedListener(
+            OnKeyguardCancelClickedListener keyguardCancelClickedListener) {
+        mKeygaurdCancelClickedListenerSet.add(keyguardCancelClickedListener);
+    }
+
+    /**
+     * Remove listener for keyguard cancel clicked.
+     */
+    public void removeOnKeyguardCancelClickedListener(
+            OnKeyguardCancelClickedListener keyguardCancelClickedListener) {
+        mKeygaurdCancelClickedListenerSet.remove(keyguardCancelClickedListener);
+    }
+
+
+    /**
+     * Defines a callback for keyguard cancel button clicked listeners.
+     */
+    public interface OnKeyguardCancelClickedListener {
+        /**
+         * Called when keyguard cancel button is clicked.
+         */
+        void onCancelClicked();
+    }
+}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/statusbar/CarStatusBarModule.java b/packages/CarSystemUI/src/com/android/systemui/car/statusbar/CarStatusBarModule.java
new file mode 100644
index 0000000..dc2eb04
--- /dev/null
+++ b/packages/CarSystemUI/src/com/android/systemui/car/statusbar/CarStatusBarModule.java
@@ -0,0 +1,283 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.car.statusbar;
+
+import static com.android.systemui.Dependency.TIME_TICK_HANDLER_NAME;
+
+import android.content.Context;
+import android.os.Handler;
+import android.os.PowerManager;
+import android.util.DisplayMetrics;
+
+import com.android.internal.logging.MetricsLogger;
+import com.android.keyguard.KeyguardUpdateMonitor;
+import com.android.keyguard.ViewMediatorCallback;
+import com.android.systemui.InitController;
+import com.android.systemui.assist.AssistManager;
+import com.android.systemui.broadcast.BroadcastDispatcher;
+import com.android.systemui.bubbles.BubbleController;
+import com.android.systemui.car.CarDeviceProvisionedController;
+import com.android.systemui.car.navigationbar.CarNavigationBarController;
+import com.android.systemui.colorextraction.SysuiColorExtractor;
+import com.android.systemui.dagger.qualifiers.UiBackground;
+import com.android.systemui.keyguard.DismissCallbackRegistry;
+import com.android.systemui.keyguard.KeyguardViewMediator;
+import com.android.systemui.keyguard.ScreenLifecycle;
+import com.android.systemui.keyguard.WakefulnessLifecycle;
+import com.android.systemui.plugins.DarkIconDispatcher;
+import com.android.systemui.plugins.FalsingManager;
+import com.android.systemui.plugins.PluginDependencyProvider;
+import com.android.systemui.recents.Recents;
+import com.android.systemui.recents.ScreenPinningRequest;
+import com.android.systemui.shared.plugins.PluginManager;
+import com.android.systemui.stackdivider.Divider;
+import com.android.systemui.statusbar.CommandQueue;
+import com.android.systemui.statusbar.KeyguardIndicationController;
+import com.android.systemui.statusbar.NavigationBarController;
+import com.android.systemui.statusbar.NotificationLockscreenUserManager;
+import com.android.systemui.statusbar.NotificationMediaManager;
+import com.android.systemui.statusbar.NotificationRemoteInputManager;
+import com.android.systemui.statusbar.NotificationShadeDepthController;
+import com.android.systemui.statusbar.NotificationViewHierarchyManager;
+import com.android.systemui.statusbar.PulseExpansionHandler;
+import com.android.systemui.statusbar.SuperStatusBarViewFactory;
+import com.android.systemui.statusbar.SysuiStatusBarStateController;
+import com.android.systemui.statusbar.VibratorHelper;
+import com.android.systemui.statusbar.dagger.StatusBarDependenciesModule;
+import com.android.systemui.statusbar.notification.DynamicPrivacyController;
+import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator;
+import com.android.systemui.statusbar.notification.VisualStabilityManager;
+import com.android.systemui.statusbar.notification.init.NotificationsController;
+import com.android.systemui.statusbar.notification.interruption.BypassHeadsUpNotifier;
+import com.android.systemui.statusbar.notification.interruption.NotificationInterruptStateProvider;
+import com.android.systemui.statusbar.notification.logging.NotificationLogger;
+import com.android.systemui.statusbar.notification.row.NotificationGutsManager;
+import com.android.systemui.statusbar.notification.row.NotificationRowModule;
+import com.android.systemui.statusbar.phone.AutoHideController;
+import com.android.systemui.statusbar.phone.BiometricUnlockController;
+import com.android.systemui.statusbar.phone.DozeParameters;
+import com.android.systemui.statusbar.phone.DozeScrimController;
+import com.android.systemui.statusbar.phone.DozeServiceHost;
+import com.android.systemui.statusbar.phone.HeadsUpManagerPhone;
+import com.android.systemui.statusbar.phone.KeyguardBypassController;
+import com.android.systemui.statusbar.phone.KeyguardDismissUtil;
+import com.android.systemui.statusbar.phone.LightBarController;
+import com.android.systemui.statusbar.phone.LightsOutNotifController;
+import com.android.systemui.statusbar.phone.LockscreenLockIconController;
+import com.android.systemui.statusbar.phone.LockscreenWallpaper;
+import com.android.systemui.statusbar.phone.NotificationGroupManager;
+import com.android.systemui.statusbar.phone.NotificationShadeWindowController;
+import com.android.systemui.statusbar.phone.PhoneStatusBarPolicy;
+import com.android.systemui.statusbar.phone.ScrimController;
+import com.android.systemui.statusbar.phone.ShadeController;
+import com.android.systemui.statusbar.phone.StatusBarIconController;
+import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
+import com.android.systemui.statusbar.phone.StatusBarNotificationActivityStarter;
+import com.android.systemui.statusbar.phone.StatusBarTouchableRegionManager;
+import com.android.systemui.statusbar.phone.dagger.StatusBarComponent;
+import com.android.systemui.statusbar.phone.dagger.StatusBarPhoneDependenciesModule;
+import com.android.systemui.statusbar.policy.BatteryController;
+import com.android.systemui.statusbar.policy.ConfigurationController;
+import com.android.systemui.statusbar.policy.ExtensionController;
+import com.android.systemui.statusbar.policy.KeyguardStateController;
+import com.android.systemui.statusbar.policy.NetworkController;
+import com.android.systemui.statusbar.policy.RemoteInputQuickSettingsDisabler;
+import com.android.systemui.statusbar.policy.UserInfoControllerImpl;
+import com.android.systemui.statusbar.policy.UserSwitcherController;
+import com.android.systemui.volume.VolumeComponent;
+
+import java.util.Optional;
+import java.util.concurrent.Executor;
+
+import javax.inject.Named;
+import javax.inject.Provider;
+import javax.inject.Singleton;
+
+import dagger.Lazy;
+import dagger.Module;
+import dagger.Provides;
+
+/**
+ * Dagger Module providing {@link CarStatusBar}.
+ */
+@Module(includes = {StatusBarDependenciesModule.class, StatusBarPhoneDependenciesModule.class,
+        NotificationRowModule.class})
+public class CarStatusBarModule {
+    /**
+     * Provides our instance of StatusBar which is considered optional.
+     */
+    @Provides
+    @Singleton
+    static CarStatusBar provideStatusBar(
+            Context context,
+            NotificationsController notificationsController,
+            LightBarController lightBarController,
+            AutoHideController autoHideController,
+            KeyguardUpdateMonitor keyguardUpdateMonitor,
+            StatusBarIconController statusBarIconController,
+            PulseExpansionHandler pulseExpansionHandler,
+            NotificationWakeUpCoordinator notificationWakeUpCoordinator,
+            KeyguardBypassController keyguardBypassController,
+            KeyguardStateController keyguardStateController,
+            HeadsUpManagerPhone headsUpManagerPhone,
+            DynamicPrivacyController dynamicPrivacyController,
+            BypassHeadsUpNotifier bypassHeadsUpNotifier,
+            FalsingManager falsingManager,
+            BroadcastDispatcher broadcastDispatcher,
+            RemoteInputQuickSettingsDisabler remoteInputQuickSettingsDisabler,
+            NotificationGutsManager notificationGutsManager,
+            NotificationLogger notificationLogger,
+            NotificationInterruptStateProvider notificationInterruptionStateProvider,
+            NotificationViewHierarchyManager notificationViewHierarchyManager,
+            KeyguardViewMediator keyguardViewMediator,
+            DisplayMetrics displayMetrics,
+            MetricsLogger metricsLogger,
+            @UiBackground Executor uiBgExecutor,
+            NotificationMediaManager notificationMediaManager,
+            NotificationLockscreenUserManager lockScreenUserManager,
+            NotificationRemoteInputManager remoteInputManager,
+            UserSwitcherController userSwitcherController,
+            NetworkController networkController,
+            BatteryController batteryController,
+            SysuiColorExtractor colorExtractor,
+            ScreenLifecycle screenLifecycle,
+            WakefulnessLifecycle wakefulnessLifecycle,
+            SysuiStatusBarStateController statusBarStateController,
+            VibratorHelper vibratorHelper,
+            BubbleController bubbleController,
+            NotificationGroupManager groupManager,
+            VisualStabilityManager visualStabilityManager,
+            CarDeviceProvisionedController carDeviceProvisionedController,
+            NavigationBarController navigationBarController,
+            Lazy<AssistManager> assistManagerLazy,
+            ConfigurationController configurationController,
+            NotificationShadeWindowController notificationShadeWindowController,
+            LockscreenLockIconController lockscreenLockIconController,
+            DozeParameters dozeParameters,
+            ScrimController scrimController,
+            Lazy<LockscreenWallpaper> lockscreenWallpaperLazy,
+            Lazy<BiometricUnlockController> biometricUnlockControllerLazy,
+            DozeServiceHost dozeServiceHost,
+            PowerManager powerManager,
+            ScreenPinningRequest screenPinningRequest,
+            DozeScrimController dozeScrimController,
+            VolumeComponent volumeComponent,
+            CommandQueue commandQueue,
+            Optional<Recents> recentsOptional,
+            Provider<StatusBarComponent.Builder> statusBarComponentBuilder,
+            PluginManager pluginManager,
+            Optional<Divider> dividerOptional,
+            SuperStatusBarViewFactory superStatusBarViewFactory,
+            LightsOutNotifController lightsOutNotifController,
+            StatusBarNotificationActivityStarter.Builder
+                    statusBarNotificationActivityStarterBuilder,
+            ShadeController shadeController,
+            StatusBarKeyguardViewManager statusBarKeyguardViewManager,
+            ViewMediatorCallback viewMediatorCallback,
+            InitController initController,
+            DarkIconDispatcher darkIconDispatcher,
+            @Named(TIME_TICK_HANDLER_NAME) Handler timeTickHandler,
+            PluginDependencyProvider pluginDependencyProvider,
+            KeyguardDismissUtil keyguardDismissUtil,
+            ExtensionController extensionController,
+            UserInfoControllerImpl userInfoControllerImpl,
+            PhoneStatusBarPolicy phoneStatusBarPolicy,
+            KeyguardIndicationController keyguardIndicationController,
+            DismissCallbackRegistry dismissCallbackRegistry,
+            StatusBarTouchableRegionManager statusBarTouchableRegionManager,
+            Lazy<NotificationShadeDepthController> notificationShadeDepthControllerLazy,
+            CarNavigationBarController carNavigationBarController) {
+        return new CarStatusBar(
+                context,
+                notificationsController,
+                lightBarController,
+                autoHideController,
+                keyguardUpdateMonitor,
+                statusBarIconController,
+                pulseExpansionHandler,
+                notificationWakeUpCoordinator,
+                keyguardBypassController,
+                keyguardStateController,
+                headsUpManagerPhone,
+                dynamicPrivacyController,
+                bypassHeadsUpNotifier,
+                falsingManager,
+                broadcastDispatcher,
+                remoteInputQuickSettingsDisabler,
+                notificationGutsManager,
+                notificationLogger,
+                notificationInterruptionStateProvider,
+                notificationViewHierarchyManager,
+                keyguardViewMediator,
+                displayMetrics,
+                metricsLogger,
+                uiBgExecutor,
+                notificationMediaManager,
+                lockScreenUserManager,
+                remoteInputManager,
+                userSwitcherController,
+                networkController,
+                batteryController,
+                colorExtractor,
+                screenLifecycle,
+                wakefulnessLifecycle,
+                statusBarStateController,
+                vibratorHelper,
+                bubbleController,
+                groupManager,
+                visualStabilityManager,
+                carDeviceProvisionedController,
+                navigationBarController,
+                assistManagerLazy,
+                configurationController,
+                notificationShadeWindowController,
+                lockscreenLockIconController,
+                dozeParameters,
+                scrimController,
+                lockscreenWallpaperLazy,
+                biometricUnlockControllerLazy,
+                dozeServiceHost,
+                powerManager,
+                screenPinningRequest,
+                dozeScrimController,
+                volumeComponent,
+                commandQueue,
+                recentsOptional,
+                statusBarComponentBuilder,
+                pluginManager,
+                dividerOptional,
+                superStatusBarViewFactory,
+                lightsOutNotifController,
+                statusBarNotificationActivityStarterBuilder,
+                shadeController,
+                statusBarKeyguardViewManager,
+                viewMediatorCallback,
+                initController,
+                darkIconDispatcher,
+                timeTickHandler,
+                pluginDependencyProvider,
+                keyguardDismissUtil,
+                extensionController,
+                userInfoControllerImpl,
+                phoneStatusBarPolicy,
+                keyguardIndicationController,
+                dismissCallbackRegistry,
+                statusBarTouchableRegionManager,
+                notificationShadeDepthControllerLazy,
+                carNavigationBarController);
+    }
+}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/CarStatusBarHeader.java b/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/CarStatusBarHeader.java
new file mode 100644
index 0000000..bab6715
--- /dev/null
+++ b/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/CarStatusBarHeader.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.car.userswitcher;
+
+import android.content.Context;
+import android.graphics.Color;
+import android.graphics.Rect;
+import android.util.AttributeSet;
+import android.view.View;
+import android.widget.LinearLayout;
+
+import androidx.annotation.IdRes;
+
+import com.android.settingslib.Utils;
+import com.android.systemui.BatteryMeterView;
+import com.android.systemui.R;
+import com.android.systemui.plugins.DarkIconDispatcher;
+
+/**
+ * A view that forms the header of the notification panel. This view will ensure that any
+ * status icons that are displayed are tinted accordingly to the current theme.
+ */
+public class CarStatusBarHeader extends LinearLayout {
+    public CarStatusBarHeader(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    @Override
+    protected void onFinishInflate() {
+        super.onFinishInflate();
+
+        // Set the light/dark theming on the header status UI to match the current theme.
+        int colorForeground = Utils.getColorAttrDefaultColor(getContext(),
+                android.R.attr.colorForeground);
+        float intensity = colorForeground == Color.WHITE ? 0f : 1f;
+        Rect tintArea = new Rect(0, 0, 0, 0);
+
+        applyDarkness(R.id.battery, tintArea, intensity, colorForeground);
+        applyDarkness(R.id.clock, tintArea, intensity, colorForeground);
+
+        ((BatteryMeterView) findViewById(R.id.battery)).setForceShowPercent(true);
+    }
+
+    private void applyDarkness(@IdRes int id, Rect tintArea, float intensity, int color) {
+        View v = findViewById(id);
+        if (v instanceof DarkIconDispatcher.DarkReceiver) {
+            ((DarkIconDispatcher.DarkReceiver) v).onDarkChanged(tintArea, intensity, color);
+        }
+    }
+}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/FullScreenUserSwitcherViewController.java b/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/FullScreenUserSwitcherViewController.java
index 45ceb6d..10b2b97 100644
--- a/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/FullScreenUserSwitcherViewController.java
+++ b/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/FullScreenUserSwitcherViewController.java
@@ -25,9 +25,9 @@
 import androidx.recyclerview.widget.GridLayoutManager;
 
 import com.android.systemui.R;
+import com.android.systemui.car.window.OverlayViewController;
+import com.android.systemui.car.window.OverlayViewGlobalStateController;
 import com.android.systemui.dagger.qualifiers.Main;
-import com.android.systemui.window.OverlayViewController;
-import com.android.systemui.window.OverlayViewGlobalStateController;
 
 import javax.inject.Inject;
 import javax.inject.Singleton;
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/FullscreenUserSwitcherViewMediator.java b/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/FullscreenUserSwitcherViewMediator.java
index 149531f..346c38c 100644
--- a/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/FullscreenUserSwitcherViewMediator.java
+++ b/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/FullscreenUserSwitcherViewMediator.java
@@ -17,9 +17,9 @@
 package com.android.systemui.car.userswitcher;
 
 import com.android.systemui.car.keyguard.CarKeyguardViewController;
+import com.android.systemui.car.window.OverlayViewMediator;
 import com.android.systemui.plugins.statusbar.StatusBarStateController;
 import com.android.systemui.statusbar.StatusBarState;
-import com.android.systemui.window.OverlayViewMediator;
 
 import javax.inject.Inject;
 import javax.inject.Singleton;
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/UserGridRecyclerView.java b/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/UserGridRecyclerView.java
index 58add17..2ff6670 100644
--- a/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/UserGridRecyclerView.java
+++ b/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/UserGridRecyclerView.java
@@ -368,7 +368,7 @@
 
         private void applyCarSysUIDialogFlags(AlertDialog dialog) {
             final Window window = dialog.getWindow();
-            window.setType(WindowManager.LayoutParams.TYPE_STATUS_BAR_SUB_PANEL);
+            window.setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
             window.addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM
                     | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
             window.getAttributes().setFitInsetsTypes(
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/voicerecognition/ConnectedDeviceVoiceRecognitionNotifier.java b/packages/CarSystemUI/src/com/android/systemui/car/voicerecognition/ConnectedDeviceVoiceRecognitionNotifier.java
new file mode 100644
index 0000000..c054d20
--- /dev/null
+++ b/packages/CarSystemUI/src/com/android/systemui/car/voicerecognition/ConnectedDeviceVoiceRecognitionNotifier.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.car.voicerecognition;
+
+import android.bluetooth.BluetoothHeadsetClient;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.Handler;
+import android.os.UserHandle;
+import android.util.Log;
+import android.widget.Toast;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.systemui.R;
+import com.android.systemui.SysUIToast;
+import com.android.systemui.SystemUI;
+import com.android.systemui.dagger.qualifiers.Main;
+
+import javax.inject.Inject;
+
+/**
+ * Controller responsible for showing toast message when voice recognition over bluetooth device
+ * getting activated.
+ */
+public class ConnectedDeviceVoiceRecognitionNotifier extends SystemUI {
+
+    private static final String TAG = "CarVoiceRecognition";
+    @VisibleForTesting
+    static final int INVALID_VALUE = -1;
+    @VisibleForTesting
+    static final int VOICE_RECOGNITION_STARTED = 1;
+
+    private Handler mHandler;
+
+    private final BroadcastReceiver mVoiceRecognitionReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            if (Log.isLoggable(TAG, Log.DEBUG)) {
+                Log.d(TAG, "Voice recognition received an intent!");
+            }
+            if (intent == null
+                    || intent.getAction() == null
+                    || !BluetoothHeadsetClient.ACTION_AG_EVENT.equals(intent.getAction())
+                    || !intent.hasExtra(BluetoothHeadsetClient.EXTRA_VOICE_RECOGNITION)) {
+                return;
+            }
+
+            int voiceRecognitionState = intent.getIntExtra(
+                    BluetoothHeadsetClient.EXTRA_VOICE_RECOGNITION, INVALID_VALUE);
+
+            if (voiceRecognitionState == VOICE_RECOGNITION_STARTED) {
+                showToastMessage();
+            }
+        }
+    };
+
+    private void showToastMessage() {
+        mHandler.post(() -> SysUIToast.makeText(mContext, R.string.voice_recognition_toast,
+                Toast.LENGTH_LONG).show());
+    }
+
+    @Inject
+    public ConnectedDeviceVoiceRecognitionNotifier(Context context, @Main Handler handler) {
+        super(context);
+        mHandler = handler;
+    }
+
+    @Override
+    public void start() {
+    }
+
+    @Override
+    protected void onBootCompleted() {
+        IntentFilter filter = new IntentFilter();
+        filter.addAction(BluetoothHeadsetClient.ACTION_AG_EVENT);
+        mContext.registerReceiverAsUser(mVoiceRecognitionReceiver, UserHandle.ALL, filter,
+                /* broadcastPermission= */ null, /* scheduler= */ null);
+    }
+}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/volume/CarVolumeDialogComponent.java b/packages/CarSystemUI/src/com/android/systemui/car/volume/CarVolumeDialogComponent.java
new file mode 100644
index 0000000..98d24b1
--- /dev/null
+++ b/packages/CarSystemUI/src/com/android/systemui/car/volume/CarVolumeDialogComponent.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.car.volume;
+
+import android.content.Context;
+
+import com.android.systemui.car.CarServiceProvider;
+import com.android.systemui.keyguard.KeyguardViewMediator;
+import com.android.systemui.plugins.VolumeDialog;
+import com.android.systemui.volume.VolumeDialogComponent;
+import com.android.systemui.volume.VolumeDialogControllerImpl;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+/**
+ * Allows for adding car specific dialog when the volume dialog is created.
+ */
+@Singleton
+public class CarVolumeDialogComponent extends VolumeDialogComponent {
+
+    private CarVolumeDialogImpl mCarVolumeDialog;
+
+    @Inject
+    public CarVolumeDialogComponent(Context context, KeyguardViewMediator keyguardViewMediator,
+            VolumeDialogControllerImpl volumeDialogController,
+            CarServiceProvider carServiceProvider) {
+        super(context, keyguardViewMediator, volumeDialogController);
+        mCarVolumeDialog.setCarServiceProvider(carServiceProvider);
+    }
+
+    /** This method is called while calling the super constructor. */
+    @Override
+    protected VolumeDialog createDefault() {
+        mCarVolumeDialog = new CarVolumeDialogImpl(mContext);
+        return mCarVolumeDialog;
+    }
+}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/volume/CarVolumeDialogImpl.java b/packages/CarSystemUI/src/com/android/systemui/car/volume/CarVolumeDialogImpl.java
new file mode 100644
index 0000000..1281884
--- /dev/null
+++ b/packages/CarSystemUI/src/com/android/systemui/car/volume/CarVolumeDialogImpl.java
@@ -0,0 +1,658 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.car.volume;
+
+import android.animation.Animator;
+import android.animation.AnimatorInflater;
+import android.animation.AnimatorSet;
+import android.annotation.DrawableRes;
+import android.annotation.Nullable;
+import android.app.Dialog;
+import android.app.KeyguardManager;
+import android.car.Car;
+import android.car.media.CarAudioManager;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.res.TypedArray;
+import android.content.res.XmlResourceParser;
+import android.graphics.Color;
+import android.graphics.PixelFormat;
+import android.graphics.drawable.ColorDrawable;
+import android.graphics.drawable.Drawable;
+import android.media.AudioManager;
+import android.os.Debug;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+import android.os.UserHandle;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.util.SparseArray;
+import android.util.Xml;
+import android.view.Gravity;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.Window;
+import android.view.WindowManager;
+import android.widget.SeekBar;
+import android.widget.SeekBar.OnSeekBarChangeListener;
+
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.android.systemui.R;
+import com.android.systemui.car.CarServiceProvider;
+import com.android.systemui.plugins.VolumeDialog;
+import com.android.systemui.volume.Events;
+import com.android.systemui.volume.SystemUIInterpolators;
+import com.android.systemui.volume.VolumeDialogImpl;
+
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Car version of the volume dialog.
+ *
+ * Methods ending in "H" must be called on the (ui) handler.
+ */
+public class CarVolumeDialogImpl implements VolumeDialog {
+
+    private static final String TAG = "CarVolumeDialog";
+    private static final boolean DEBUG = false;
+
+    private static final String XML_TAG_VOLUME_ITEMS = "carVolumeItems";
+    private static final String XML_TAG_VOLUME_ITEM = "item";
+    private static final int LISTVIEW_ANIMATION_DURATION_IN_MILLIS = 250;
+    private static final int DISMISS_DELAY_IN_MILLIS = 50;
+    private static final int ARROW_FADE_IN_START_DELAY_IN_MILLIS = 100;
+
+    private final Context mContext;
+    private final H mHandler = new H();
+    // All the volume items.
+    private final SparseArray<VolumeItem> mVolumeItems = new SparseArray<>();
+    // Available volume items in car audio manager.
+    private final List<VolumeItem> mAvailableVolumeItems = new ArrayList<>();
+    // Volume items in the RecyclerView.
+    private final List<CarVolumeItem> mCarVolumeLineItems = new ArrayList<>();
+    private final KeyguardManager mKeyguard;
+    private final int mNormalTimeout;
+    private final int mHoveringTimeout;
+    private final int mExpNormalTimeout;
+    private final int mExpHoveringTimeout;
+
+    private Window mWindow;
+    private CustomDialog mDialog;
+    private RecyclerView mListView;
+    private CarVolumeItemAdapter mVolumeItemsAdapter;
+    private CarAudioManager mCarAudioManager;
+    private boolean mHovering;
+    private int mCurrentlyDisplayingGroupId;
+    private int mPreviouslyDisplayingGroupId;
+    private boolean mShowing;
+    private boolean mDismissing;
+    private boolean mExpanded;
+    private View mExpandIcon;
+
+    private final CarAudioManager.CarVolumeCallback mVolumeChangeCallback =
+            new CarAudioManager.CarVolumeCallback() {
+                @Override
+                public void onGroupVolumeChanged(int zoneId, int groupId, int flags) {
+                    // TODO: Include zoneId into consideration.
+                    // For instance
+                    // - single display + single-zone, ignore zoneId
+                    // - multi-display + single-zone, zoneId is fixed, may show volume bar on all
+                    // displays
+                    // - single-display + multi-zone, may show volume bar on primary display only
+                    // - multi-display + multi-zone, may show volume bar on display specified by
+                    // zoneId
+                    VolumeItem volumeItem = mAvailableVolumeItems.get(groupId);
+                    int value = getSeekbarValue(mCarAudioManager, groupId);
+                    // find if the group id for which the volume changed is currently being
+                    // displayed.
+                    boolean isShowing = mCarVolumeLineItems.stream().anyMatch(
+                            item -> item.getGroupId() == groupId);
+                    // Do not update the progress if it is the same as before. When car audio
+                    // manager sets
+                    // its group volume caused by the seekbar progress changed, it also triggers
+                    // this
+                    // callback. Updating the seekbar at the same time could block the continuous
+                    // seeking.
+                    if (value != volumeItem.mProgress && isShowing) {
+                        volumeItem.mCarVolumeItem.setProgress(value);
+                        volumeItem.mProgress = value;
+                    }
+                    if ((flags & AudioManager.FLAG_SHOW_UI) != 0) {
+                        mPreviouslyDisplayingGroupId = mCurrentlyDisplayingGroupId;
+                        mCurrentlyDisplayingGroupId = groupId;
+                        mHandler.obtainMessage(H.SHOW,
+                                Events.SHOW_REASON_VOLUME_CHANGED).sendToTarget();
+                    }
+                }
+
+                @Override
+                public void onMasterMuteChanged(int zoneId, int flags) {
+                    // ignored
+                }
+            };
+
+    private final CarServiceProvider.CarServiceOnConnectedListener mCarServiceOnConnectedListener =
+            car -> {
+                mExpanded = false;
+                mCarAudioManager = (CarAudioManager) car.getCarManager(Car.AUDIO_SERVICE);
+                int volumeGroupCount = mCarAudioManager.getVolumeGroupCount();
+                // Populates volume slider items from volume groups to UI.
+                for (int groupId = 0; groupId < volumeGroupCount; groupId++) {
+                    VolumeItem volumeItem = getVolumeItemForUsages(
+                            mCarAudioManager.getUsagesForVolumeGroupId(groupId));
+                    mAvailableVolumeItems.add(volumeItem);
+                    // The first one is the default item.
+                    if (groupId == 0) {
+                        clearAllAndSetupDefaultCarVolumeLineItem(0);
+                    }
+                }
+
+                // If list is already initiated, update its content.
+                if (mVolumeItemsAdapter != null) {
+                    mVolumeItemsAdapter.notifyDataSetChanged();
+                }
+                mCarAudioManager.registerCarVolumeCallback(mVolumeChangeCallback);
+            };
+
+    private final BroadcastReceiver mHomeButtonPressedBroadcastReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            if (!intent.getAction().equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) {
+                return;
+            }
+
+            dismissH(Events.DISMISS_REASON_VOLUME_CONTROLLER);
+        }
+    };
+
+    public CarVolumeDialogImpl(Context context) {
+        mContext = context;
+        mKeyguard = (KeyguardManager) mContext.getSystemService(Context.KEYGUARD_SERVICE);
+        mNormalTimeout = mContext.getResources().getInteger(
+                R.integer.car_volume_dialog_display_normal_timeout);
+        mHoveringTimeout = mContext.getResources().getInteger(
+                R.integer.car_volume_dialog_display_hovering_timeout);
+        mExpNormalTimeout = mContext.getResources().getInteger(
+                R.integer.car_volume_dialog_display_expanded_normal_timeout);
+        mExpHoveringTimeout = mContext.getResources().getInteger(
+                R.integer.car_volume_dialog_display_expanded_hovering_timeout);
+    }
+
+    /** Sets a {@link CarServiceProvider} which connects to the audio service. */
+    public void setCarServiceProvider(CarServiceProvider carServiceProvider) {
+        carServiceProvider.addListener(mCarServiceOnConnectedListener);
+    }
+
+    private static int getSeekbarValue(CarAudioManager carAudioManager, int volumeGroupId) {
+        return carAudioManager.getGroupVolume(volumeGroupId);
+    }
+
+    private static int getMaxSeekbarValue(CarAudioManager carAudioManager, int volumeGroupId) {
+        return carAudioManager.getGroupMaxVolume(volumeGroupId);
+    }
+
+    /**
+     * Build the volume window and connect to the CarService which registers with car audio
+     * manager.
+     */
+    @Override
+    public void init(int windowType, Callback callback) {
+        initDialog();
+
+        mContext.registerReceiverAsUser(mHomeButtonPressedBroadcastReceiver, UserHandle.CURRENT,
+                new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS), /* broadcastPermission= */
+                null, /* scheduler= */ null);
+    }
+
+    @Override
+    public void destroy() {
+        mHandler.removeCallbacksAndMessages(/* token= */ null);
+
+        mContext.unregisterReceiver(mHomeButtonPressedBroadcastReceiver);
+
+        cleanupAudioManager();
+    }
+
+    /**
+     * Reveals volume dialog.
+     */
+    public void show(int reason) {
+        mHandler.obtainMessage(H.SHOW, reason).sendToTarget();
+    }
+
+    /**
+     * Hides volume dialog.
+     */
+    public void dismiss(int reason) {
+        mHandler.obtainMessage(H.DISMISS, reason).sendToTarget();
+    }
+
+    private void initDialog() {
+        loadAudioUsageItems();
+        mCarVolumeLineItems.clear();
+        mDialog = new CustomDialog(mContext);
+
+        mHovering = false;
+        mShowing = false;
+        mDismissing = false;
+        mExpanded = false;
+        mWindow = mDialog.getWindow();
+        mWindow.requestFeature(Window.FEATURE_NO_TITLE);
+        mWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
+        mWindow.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND
+                | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR);
+        mWindow.addFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
+                | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
+                | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
+                | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
+                | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
+                | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
+        mWindow.setType(WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY);
+        mWindow.setWindowAnimations(com.android.internal.R.style.Animation_Toast);
+        final WindowManager.LayoutParams lp = mWindow.getAttributes();
+        lp.format = PixelFormat.TRANSLUCENT;
+        lp.setTitle(VolumeDialogImpl.class.getSimpleName());
+        lp.gravity = Gravity.TOP | Gravity.CENTER_HORIZONTAL;
+        lp.windowAnimations = -1;
+        mWindow.setAttributes(lp);
+
+        mDialog.setContentView(R.layout.car_volume_dialog);
+        mWindow.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
+
+        mDialog.setCanceledOnTouchOutside(true);
+        mDialog.setOnShowListener(dialog -> {
+            mListView.setTranslationY(-mListView.getHeight());
+            mListView.setAlpha(0);
+            mListView.animate()
+                    .alpha(1)
+                    .translationY(0)
+                    .setDuration(LISTVIEW_ANIMATION_DURATION_IN_MILLIS)
+                    .setInterpolator(new SystemUIInterpolators.LogDecelerateInterpolator())
+                    .start();
+        });
+        mListView = mWindow.findViewById(R.id.volume_list);
+        mListView.setOnHoverListener((v, event) -> {
+            int action = event.getActionMasked();
+            mHovering = (action == MotionEvent.ACTION_HOVER_ENTER)
+                    || (action == MotionEvent.ACTION_HOVER_MOVE);
+            rescheduleTimeoutH();
+            return true;
+        });
+
+        mVolumeItemsAdapter = new CarVolumeItemAdapter(mContext, mCarVolumeLineItems);
+        mListView.setAdapter(mVolumeItemsAdapter);
+        mListView.setLayoutManager(new LinearLayoutManager(mContext));
+    }
+
+
+    private void showH(int reason) {
+        if (DEBUG) {
+            Log.d(TAG, "showH r=" + Events.DISMISS_REASONS[reason]);
+        }
+
+        mHandler.removeMessages(H.SHOW);
+        mHandler.removeMessages(H.DISMISS);
+
+        rescheduleTimeoutH();
+
+        // Refresh the data set before showing.
+        mVolumeItemsAdapter.notifyDataSetChanged();
+
+        if (mShowing) {
+            if (mPreviouslyDisplayingGroupId == mCurrentlyDisplayingGroupId || mExpanded) {
+                return;
+            }
+
+            clearAllAndSetupDefaultCarVolumeLineItem(mCurrentlyDisplayingGroupId);
+            return;
+        }
+
+        mShowing = true;
+        clearAllAndSetupDefaultCarVolumeLineItem(mCurrentlyDisplayingGroupId);
+        mDialog.show();
+        Events.writeEvent(Events.EVENT_SHOW_DIALOG, reason, mKeyguard.isKeyguardLocked());
+    }
+
+    private void clearAllAndSetupDefaultCarVolumeLineItem(int groupId) {
+        mCarVolumeLineItems.clear();
+        VolumeItem volumeItem = mAvailableVolumeItems.get(groupId);
+        volumeItem.mDefaultItem = true;
+        addCarVolumeListItem(volumeItem, /* volumeGroupId = */ groupId,
+                R.drawable.car_ic_keyboard_arrow_down, new ExpandIconListener());
+    }
+
+    protected void rescheduleTimeoutH() {
+        mHandler.removeMessages(H.DISMISS);
+        final int timeout = computeTimeoutH();
+        mHandler.sendMessageDelayed(mHandler
+                .obtainMessage(H.DISMISS, Events.DISMISS_REASON_TIMEOUT), timeout);
+
+        if (DEBUG) {
+            Log.d(TAG, "rescheduleTimeout " + timeout + " " + Debug.getCaller());
+        }
+    }
+
+    private int computeTimeoutH() {
+        if (mExpanded) {
+            return mHovering ? mExpHoveringTimeout : mExpNormalTimeout;
+        } else {
+            return mHovering ? mHoveringTimeout : mNormalTimeout;
+        }
+    }
+
+    private void dismissH(int reason) {
+        if (DEBUG) {
+            Log.d(TAG, "dismissH r=" + Events.DISMISS_REASONS[reason]);
+        }
+
+        mHandler.removeMessages(H.DISMISS);
+        mHandler.removeMessages(H.SHOW);
+        if (!mShowing || mDismissing) {
+            return;
+        }
+
+        mDismissing = true;
+        mListView.animate()
+                .alpha(0)
+                .translationY(-mListView.getHeight())
+                .setDuration(LISTVIEW_ANIMATION_DURATION_IN_MILLIS)
+                .setInterpolator(new SystemUIInterpolators.LogAccelerateInterpolator())
+                .withEndAction(() -> mHandler.postDelayed(() -> {
+                    if (DEBUG) {
+                        Log.d(TAG, "mDialog.dismiss()");
+                    }
+                    mDialog.dismiss();
+                    mShowing = false;
+                    mDismissing = false;
+                    // if mExpandIcon is null that means user never clicked on the expanded arrow
+                    // which implies that the dialog is still not expanded. In that case we do
+                    // not want to reset the state
+                    if (mExpandIcon != null && mExpanded) {
+                        toggleDialogExpansion(/* isClicked = */ false);
+                    }
+                }, DISMISS_DELAY_IN_MILLIS))
+                .start();
+
+        Events.writeEvent(Events.EVENT_DISMISS_DIALOG, reason);
+    }
+
+    private void loadAudioUsageItems() {
+        try (XmlResourceParser parser = mContext.getResources().getXml(R.xml.car_volume_items)) {
+            AttributeSet attrs = Xml.asAttributeSet(parser);
+            int type;
+            // Traverse to the first start tag
+            while ((type = parser.next()) != XmlResourceParser.END_DOCUMENT
+                    && type != XmlResourceParser.START_TAG) {
+                // Do Nothing (moving parser to start element)
+            }
+
+            if (!XML_TAG_VOLUME_ITEMS.equals(parser.getName())) {
+                throw new RuntimeException("Meta-data does not start with carVolumeItems tag");
+            }
+            int outerDepth = parser.getDepth();
+            int rank = 0;
+            while ((type = parser.next()) != XmlResourceParser.END_DOCUMENT
+                    && (type != XmlResourceParser.END_TAG || parser.getDepth() > outerDepth)) {
+                if (type == XmlResourceParser.END_TAG) {
+                    continue;
+                }
+                if (XML_TAG_VOLUME_ITEM.equals(parser.getName())) {
+                    TypedArray item = mContext.getResources().obtainAttributes(
+                            attrs, R.styleable.carVolumeItems_item);
+                    int usage = item.getInt(R.styleable.carVolumeItems_item_usage,
+                            /* defValue= */ -1);
+                    if (usage >= 0) {
+                        VolumeItem volumeItem = new VolumeItem();
+                        volumeItem.mRank = rank;
+                        volumeItem.mIcon = item.getResourceId(
+                                R.styleable.carVolumeItems_item_icon, /* defValue= */ 0);
+                        mVolumeItems.put(usage, volumeItem);
+                        rank++;
+                    }
+                    item.recycle();
+                }
+            }
+        } catch (XmlPullParserException | IOException e) {
+            Log.e(TAG, "Error parsing volume groups configuration", e);
+        }
+    }
+
+    private VolumeItem getVolumeItemForUsages(int[] usages) {
+        int rank = Integer.MAX_VALUE;
+        VolumeItem result = null;
+        for (int usage : usages) {
+            VolumeItem volumeItem = mVolumeItems.get(usage);
+            if (volumeItem.mRank < rank) {
+                rank = volumeItem.mRank;
+                result = volumeItem;
+            }
+        }
+        return result;
+    }
+
+    private CarVolumeItem createCarVolumeListItem(VolumeItem volumeItem, int volumeGroupId,
+            Drawable supplementalIcon, int seekbarProgressValue,
+            @Nullable View.OnClickListener supplementalIconOnClickListener) {
+        CarVolumeItem carVolumeItem = new CarVolumeItem();
+        carVolumeItem.setMax(getMaxSeekbarValue(mCarAudioManager, volumeGroupId));
+        carVolumeItem.setProgress(seekbarProgressValue);
+        carVolumeItem.setOnSeekBarChangeListener(
+                new CarVolumeDialogImpl.VolumeSeekBarChangeListener(volumeGroupId,
+                        mCarAudioManager));
+        carVolumeItem.setGroupId(volumeGroupId);
+
+        int color = mContext.getColor(R.color.car_volume_dialog_tint);
+        Drawable primaryIcon = mContext.getDrawable(volumeItem.mIcon);
+        primaryIcon.mutate().setTint(color);
+        carVolumeItem.setPrimaryIcon(primaryIcon);
+        if (supplementalIcon != null) {
+            supplementalIcon.mutate().setTint(color);
+            carVolumeItem.setSupplementalIcon(supplementalIcon,
+                    /* showSupplementalIconDivider= */ true);
+            carVolumeItem.setSupplementalIconListener(supplementalIconOnClickListener);
+        } else {
+            carVolumeItem.setSupplementalIcon(/* drawable= */ null,
+                    /* showSupplementalIconDivider= */ false);
+        }
+
+        volumeItem.mCarVolumeItem = carVolumeItem;
+        volumeItem.mProgress = seekbarProgressValue;
+
+        return carVolumeItem;
+    }
+
+    private CarVolumeItem addCarVolumeListItem(VolumeItem volumeItem, int volumeGroupId,
+            int supplementalIconId,
+            @Nullable View.OnClickListener supplementalIconOnClickListener) {
+        int seekbarProgressValue = getSeekbarValue(mCarAudioManager, volumeGroupId);
+        Drawable supplementalIcon = supplementalIconId == 0 ? null : mContext.getDrawable(
+                supplementalIconId);
+        CarVolumeItem carVolumeItem = createCarVolumeListItem(volumeItem, volumeGroupId,
+                supplementalIcon, seekbarProgressValue, supplementalIconOnClickListener);
+        mCarVolumeLineItems.add(carVolumeItem);
+        return carVolumeItem;
+    }
+
+    private void cleanupAudioManager() {
+        mCarAudioManager.unregisterCarVolumeCallback(mVolumeChangeCallback);
+        mCarVolumeLineItems.clear();
+        mCarAudioManager = null;
+    }
+
+    /**
+     * Wrapper class which contains information of each volume group.
+     */
+    private static class VolumeItem {
+        private int mRank;
+        private boolean mDefaultItem = false;
+        @DrawableRes
+        private int mIcon;
+        private CarVolumeItem mCarVolumeItem;
+        private int mProgress;
+    }
+
+    private final class H extends Handler {
+
+        private static final int SHOW = 1;
+        private static final int DISMISS = 2;
+
+        private H() {
+            super(Looper.getMainLooper());
+        }
+
+        @Override
+        public void handleMessage(Message msg) {
+            switch (msg.what) {
+                case SHOW:
+                    showH(msg.arg1);
+                    break;
+                case DISMISS:
+                    dismissH(msg.arg1);
+                    break;
+                default:
+            }
+        }
+    }
+
+    private final class CustomDialog extends Dialog implements DialogInterface {
+
+        private CustomDialog(Context context) {
+            super(context, com.android.systemui.R.style.qs_theme);
+        }
+
+        @Override
+        public boolean dispatchTouchEvent(MotionEvent ev) {
+            rescheduleTimeoutH();
+            return super.dispatchTouchEvent(ev);
+        }
+
+        @Override
+        protected void onStart() {
+            super.setCanceledOnTouchOutside(true);
+            super.onStart();
+        }
+
+        @Override
+        protected void onStop() {
+            super.onStop();
+        }
+
+        @Override
+        public boolean onTouchEvent(MotionEvent event) {
+            if (isShowing()) {
+                if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {
+                    mHandler.obtainMessage(
+                            H.DISMISS, Events.DISMISS_REASON_TOUCH_OUTSIDE).sendToTarget();
+                    return true;
+                }
+            }
+            return false;
+        }
+    }
+
+    private final class ExpandIconListener implements View.OnClickListener {
+        @Override
+        public void onClick(final View v) {
+            mExpandIcon = v;
+            toggleDialogExpansion(true);
+            rescheduleTimeoutH();
+        }
+    }
+
+    private void toggleDialogExpansion(boolean isClicked) {
+        mExpanded = !mExpanded;
+        Animator inAnimator;
+        if (mExpanded) {
+            for (int groupId = 0; groupId < mAvailableVolumeItems.size(); ++groupId) {
+                if (groupId != mCurrentlyDisplayingGroupId) {
+                    VolumeItem volumeItem = mAvailableVolumeItems.get(groupId);
+                    addCarVolumeListItem(volumeItem, groupId, /* supplementalIconId= */ 0,
+                            /* supplementalIconOnClickListener= */ null);
+                }
+            }
+            inAnimator = AnimatorInflater.loadAnimator(
+                    mContext, R.anim.car_arrow_fade_in_rotate_up);
+
+        } else {
+            clearAllAndSetupDefaultCarVolumeLineItem(mCurrentlyDisplayingGroupId);
+            inAnimator = AnimatorInflater.loadAnimator(
+                    mContext, R.anim.car_arrow_fade_in_rotate_down);
+        }
+
+        Animator outAnimator = AnimatorInflater.loadAnimator(
+                mContext, R.anim.car_arrow_fade_out);
+        inAnimator.setStartDelay(ARROW_FADE_IN_START_DELAY_IN_MILLIS);
+        AnimatorSet animators = new AnimatorSet();
+        animators.playTogether(outAnimator, inAnimator);
+        if (!isClicked) {
+            // Do not animate when the state is called to reset the dialogs view and not clicked
+            // by user.
+            animators.setDuration(0);
+        }
+        animators.setTarget(mExpandIcon);
+        animators.start();
+        mVolumeItemsAdapter.notifyDataSetChanged();
+    }
+
+    private final class VolumeSeekBarChangeListener implements OnSeekBarChangeListener {
+
+        private final int mVolumeGroupId;
+        private final CarAudioManager mCarAudioManager;
+
+        private VolumeSeekBarChangeListener(int volumeGroupId, CarAudioManager carAudioManager) {
+            mVolumeGroupId = volumeGroupId;
+            mCarAudioManager = carAudioManager;
+        }
+
+        @Override
+        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
+            if (!fromUser) {
+                // For instance, if this event is originated from AudioService,
+                // we can ignore it as it has already been handled and doesn't need to be
+                // sent back down again.
+                return;
+            }
+            if (mCarAudioManager == null) {
+                Log.w(TAG, "Ignoring volume change event because the car isn't connected");
+                return;
+            }
+            mAvailableVolumeItems.get(mVolumeGroupId).mProgress = progress;
+            mAvailableVolumeItems.get(
+                    mVolumeGroupId).mCarVolumeItem.setProgress(progress);
+            mCarAudioManager.setGroupVolume(mVolumeGroupId, progress, 0);
+        }
+
+        @Override
+        public void onStartTrackingTouch(SeekBar seekBar) {
+        }
+
+        @Override
+        public void onStopTrackingTouch(SeekBar seekBar) {
+        }
+    }
+}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/volume/CarVolumeItem.java b/packages/CarSystemUI/src/com/android/systemui/car/volume/CarVolumeItem.java
new file mode 100644
index 0000000..1e7e534
--- /dev/null
+++ b/packages/CarSystemUI/src/com/android/systemui/car/volume/CarVolumeItem.java
@@ -0,0 +1,135 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.car.volume;
+
+import android.graphics.drawable.Drawable;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.SeekBar;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.android.systemui.R;
+
+/** Holds all related data to represent a volume group. */
+public class CarVolumeItem {
+
+    private Drawable mPrimaryIcon;
+    private Drawable mSupplementalIcon;
+    private View.OnClickListener mSupplementalIconOnClickListener;
+    private boolean mShowSupplementalIconDivider;
+    private int mGroupId;
+
+    private int mMax;
+    private int mProgress;
+    private SeekBar.OnSeekBarChangeListener mOnSeekBarChangeListener;
+
+    /**
+     * Called when {@link CarVolumeItem} is bound to its ViewHolder.
+     */
+    void bind(CarVolumeItemViewHolder viewHolder) {
+        viewHolder.bind(/* carVolumeItem= */ this);
+    }
+
+    /** Sets progress of seekbar. */
+    public void setProgress(int progress) {
+        mProgress = progress;
+    }
+
+    /** Sets max value of seekbar. */
+    public void setMax(int max) {
+        mMax = max;
+    }
+
+    /** Sets {@link SeekBar.OnSeekBarChangeListener}. */
+    public void setOnSeekBarChangeListener(SeekBar.OnSeekBarChangeListener listener) {
+        mOnSeekBarChangeListener = listener;
+    }
+
+    /** Sets the primary icon. */
+    public void setPrimaryIcon(Drawable drawable) {
+        mPrimaryIcon = drawable;
+    }
+
+    /** Sets the supplemental icon and the visibility of the supplemental icon divider. */
+    public void setSupplementalIcon(Drawable drawable, boolean showSupplementalIconDivider) {
+        mSupplementalIcon = drawable;
+        mShowSupplementalIconDivider = showSupplementalIconDivider;
+    }
+
+    /**
+     * Gets the group id associated.
+     */
+    public int getGroupId() {
+        return mGroupId;
+    }
+
+    /**
+     * Sets the group id associated.
+     */
+    public void setGroupId(int groupId) {
+        this.mGroupId = groupId;
+    }
+
+    /** Sets {@code OnClickListener} for the supplemental icon. */
+    public void setSupplementalIconListener(View.OnClickListener listener) {
+        mSupplementalIconOnClickListener = listener;
+    }
+
+    /** Defines the view holder which shows the information held by {@link CarVolumeItem}. */
+    public static class CarVolumeItemViewHolder extends RecyclerView.ViewHolder {
+
+        private SeekBar mSeekBar;
+        private ImageView mPrimaryIcon;
+        private View mSupplementalIconDivider;
+        private ImageView mSupplementalIcon;
+
+        public CarVolumeItemViewHolder(@NonNull View itemView) {
+            super(itemView);
+
+            mSeekBar = itemView.findViewById(R.id.seek_bar);
+            mPrimaryIcon = itemView.findViewById(R.id.primary_icon);
+            mSupplementalIcon = itemView.findViewById(R.id.supplemental_icon);
+            mSupplementalIconDivider = itemView.findViewById(R.id.supplemental_icon_divider);
+        }
+
+        /**
+         * Binds {@link CarVolumeItem} to the {@link CarVolumeItemViewHolder}.
+         */
+        void bind(CarVolumeItem carVolumeItem) {
+            // Progress bar
+            mSeekBar.setMax(carVolumeItem.mMax);
+            mSeekBar.setProgress(carVolumeItem.mProgress);
+            mSeekBar.setOnSeekBarChangeListener(carVolumeItem.mOnSeekBarChangeListener);
+
+            // Primary icon
+            mPrimaryIcon.setVisibility(View.VISIBLE);
+            mPrimaryIcon.setImageDrawable(carVolumeItem.mPrimaryIcon);
+
+            // Supplemental icon
+            mSupplementalIcon.setVisibility(View.VISIBLE);
+            mSupplementalIconDivider.setVisibility(
+                    carVolumeItem.mShowSupplementalIconDivider ? View.VISIBLE : View.INVISIBLE);
+            mSupplementalIcon.setImageDrawable(carVolumeItem.mSupplementalIcon);
+            mSupplementalIcon.setOnClickListener(
+                    carVolumeItem.mSupplementalIconOnClickListener);
+            mSupplementalIcon.setClickable(
+                    carVolumeItem.mSupplementalIconOnClickListener != null);
+        }
+    }
+}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/volume/CarVolumeItemAdapter.java b/packages/CarSystemUI/src/com/android/systemui/car/volume/CarVolumeItemAdapter.java
new file mode 100644
index 0000000..7f336b5
--- /dev/null
+++ b/packages/CarSystemUI/src/com/android/systemui/car/volume/CarVolumeItemAdapter.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.car.volume;
+
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.android.systemui.R;
+
+import java.util.List;
+
+/** The {@link RecyclerView.Adapter} to show the volume items in the sysUI volume dialog. */
+public class CarVolumeItemAdapter extends
+        RecyclerView.Adapter<CarVolumeItem.CarVolumeItemViewHolder> {
+
+    private final Context mContext;
+    private final List<CarVolumeItem> mItems;
+
+    public CarVolumeItemAdapter(Context context, List<CarVolumeItem> items) {
+        mContext = context;
+        mItems = items;
+    }
+
+    @Override
+    public CarVolumeItem.CarVolumeItemViewHolder onCreateViewHolder(ViewGroup parent,
+            int viewType) {
+        LayoutInflater inflater = LayoutInflater.from(mContext);
+        View view = inflater.inflate(R.layout.car_volume_item, parent, false);
+        return new CarVolumeItem.CarVolumeItemViewHolder(view);
+    }
+
+    @Override
+    public void onBindViewHolder(CarVolumeItem.CarVolumeItemViewHolder holder, int position) {
+        mItems.get(position).bind(holder);
+    }
+
+    @Override
+    public int getItemCount() {
+        return mItems.size();
+    }
+}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/volume/VolumeUI.java b/packages/CarSystemUI/src/com/android/systemui/car/volume/VolumeUI.java
new file mode 100644
index 0000000..2bdb85f
--- /dev/null
+++ b/packages/CarSystemUI/src/com/android/systemui/car/volume/VolumeUI.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.car.volume;
+
+import android.car.Car;
+import android.car.media.CarAudioManager;
+import android.content.Context;
+import android.content.res.Configuration;
+import android.content.res.Resources;
+import android.os.Handler;
+import android.util.Log;
+
+import com.android.systemui.R;
+import com.android.systemui.SystemUI;
+import com.android.systemui.car.CarServiceProvider;
+import com.android.systemui.dagger.qualifiers.Main;
+import com.android.systemui.volume.VolumeDialogComponent;
+
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import dagger.Lazy;
+
+/** The entry point for controlling the volume ui in cars. */
+@Singleton
+public class VolumeUI extends SystemUI {
+
+    private static final String TAG = "VolumeUI";
+    private final Resources mResources;
+    private final Handler mMainHandler;
+    private final CarServiceProvider mCarServiceProvider;
+    private final Lazy<VolumeDialogComponent> mVolumeDialogComponentLazy;
+
+    private final CarAudioManager.CarVolumeCallback mVolumeChangeCallback =
+            new CarAudioManager.CarVolumeCallback() {
+                @Override
+                public void onGroupVolumeChanged(int zoneId, int groupId, int flags) {
+                    if (mVolumeDialogComponent == null) {
+                        mMainHandler.post(() -> {
+                            mVolumeDialogComponent = mVolumeDialogComponentLazy.get();
+                            mVolumeDialogComponent.register();
+                        });
+                        mCarAudioManager.unregisterCarVolumeCallback(mVolumeChangeCallback);
+                    }
+                }
+
+                @Override
+                public void onMasterMuteChanged(int zoneId, int flags) {
+                    // ignored
+                }
+            };
+
+    private boolean mEnabled;
+    private CarAudioManager mCarAudioManager;
+    private VolumeDialogComponent mVolumeDialogComponent;
+
+    @Inject
+    public VolumeUI(
+            Context context,
+            @Main Resources resources,
+            @Main Handler mainHandler,
+            CarServiceProvider carServiceProvider,
+            Lazy<VolumeDialogComponent> volumeDialogComponentLazy
+    ) {
+        super(context);
+        mResources = resources;
+        mMainHandler = mainHandler;
+        mCarServiceProvider = carServiceProvider;
+        mVolumeDialogComponentLazy = volumeDialogComponentLazy;
+    }
+
+    @Override
+    public void start() {
+        boolean enableVolumeUi = mResources.getBoolean(R.bool.enable_volume_ui);
+        mEnabled = enableVolumeUi;
+        if (!mEnabled) return;
+
+        mCarServiceProvider.addListener(car -> {
+            if (mCarAudioManager != null) {
+                return;
+            }
+
+            mCarAudioManager = (CarAudioManager) car.getCarManager(Car.AUDIO_SERVICE);
+            Log.d(TAG, "Registering mVolumeChangeCallback.");
+            // This volume call back is never unregistered because CarStatusBar is
+            // never destroyed.
+            mCarAudioManager.registerCarVolumeCallback(mVolumeChangeCallback);
+        });
+    }
+
+    @Override
+    protected void onConfigurationChanged(Configuration newConfig) {
+        super.onConfigurationChanged(newConfig);
+        if (!mEnabled) return;
+        if (mVolumeDialogComponent != null) {
+            mVolumeDialogComponent.onConfigurationChanged(newConfig);
+        }
+    }
+
+    @Override
+    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
+        pw.print("mEnabled="); pw.println(mEnabled);
+        if (!mEnabled) return;
+        if (mVolumeDialogComponent != null) {
+            mVolumeDialogComponent.dump(fd, pw, args);
+        }
+    }
+}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayPanelViewController.java b/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayPanelViewController.java
new file mode 100644
index 0000000..90892d5
--- /dev/null
+++ b/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayPanelViewController.java
@@ -0,0 +1,563 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.car.window;
+
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.ValueAnimator;
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Rect;
+import android.util.Log;
+import android.view.GestureDetector;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewTreeObserver;
+
+import androidx.annotation.CallSuper;
+
+import com.android.systemui.R;
+import com.android.systemui.car.CarDeviceProvisionedController;
+import com.android.systemui.dagger.qualifiers.Main;
+import com.android.systemui.statusbar.FlingAnimationUtils;
+
+/**
+ * The {@link OverlayPanelViewController} provides additional dragging animation capabilities to
+ * {@link OverlayViewController}.
+ */
+public abstract class OverlayPanelViewController extends OverlayViewController {
+
+    private static final boolean DEBUG = true;
+    private static final String TAG = "OverlayPanelViewController";
+
+    // used to calculate how fast to open or close the window
+    protected static final float DEFAULT_FLING_VELOCITY = 0;
+    // max time a fling animation takes
+    protected static final float FLING_ANIMATION_MAX_TIME = 0.5f;
+    // acceleration rate for the fling animation
+    protected static final float FLING_SPEED_UP_FACTOR = 0.6f;
+
+    protected static final int SWIPE_DOWN_MIN_DISTANCE = 25;
+    protected static final int SWIPE_MAX_OFF_PATH = 75;
+    protected static final int SWIPE_THRESHOLD_VELOCITY = 200;
+
+    private final FlingAnimationUtils mFlingAnimationUtils;
+    private final CarDeviceProvisionedController mCarDeviceProvisionedController;
+    private final View.OnTouchListener mDragOpenTouchListener;
+    private final View.OnTouchListener mDragCloseTouchListener;
+
+    private final int mSettleClosePercentage;
+    private int mPercentageFromBottom;
+
+    private boolean mPanelVisible;
+    private boolean mPanelExpanded;
+
+    private float mOpeningVelocity = DEFAULT_FLING_VELOCITY;
+    private float mClosingVelocity = DEFAULT_FLING_VELOCITY;
+
+    private boolean mIsAnimating;
+    private boolean mIsTracking;
+
+    public OverlayPanelViewController(
+            Context context,
+            @Main Resources resources,
+            int stubId,
+            OverlayViewGlobalStateController overlayViewGlobalStateController,
+            FlingAnimationUtils.Builder flingAnimationUtilsBuilder,
+            CarDeviceProvisionedController carDeviceProvisionedController
+    ) {
+        super(stubId, overlayViewGlobalStateController);
+
+        mFlingAnimationUtils = flingAnimationUtilsBuilder
+                .setMaxLengthSeconds(FLING_ANIMATION_MAX_TIME)
+                .setSpeedUpFactor(FLING_SPEED_UP_FACTOR)
+                .build();
+        mCarDeviceProvisionedController = carDeviceProvisionedController;
+
+        mSettleClosePercentage = resources.getInteger(
+                R.integer.notification_settle_close_percentage);
+
+        // Attached to the top navigation bar (i.e. status bar) to detect pull down of the
+        // notification shade.
+        GestureDetector openGestureDetector = new GestureDetector(context,
+                new OpenGestureListener() {
+                    @Override
+                    protected void open() {
+                        animateExpandPanel();
+                    }
+                });
+
+        // Attached to the NavBars to close the notification shade
+        GestureDetector navBarCloseNotificationGestureDetector = new GestureDetector(context,
+                new SystemBarCloseGestureListener() {
+                    @Override
+                    protected void close() {
+                        if (isPanelExpanded()) {
+                            animateCollapsePanel();
+                        }
+                    }
+                });
+
+        mDragOpenTouchListener = (v, event) -> {
+            if (!mCarDeviceProvisionedController.isCurrentUserFullySetup()) {
+                return true;
+            }
+            if (!isInflated()) {
+                getOverlayViewGlobalStateController().inflateView(this);
+            }
+
+            boolean consumed = openGestureDetector.onTouchEvent(event);
+            if (consumed) {
+                return true;
+            }
+            maybeCompleteAnimation(event);
+            return true;
+        };
+
+        mDragCloseTouchListener = (v, event) -> {
+            if (!isInflated()) {
+                return true;
+            }
+            boolean consumed = navBarCloseNotificationGestureDetector.onTouchEvent(event);
+            if (consumed) {
+                return true;
+            }
+            maybeCompleteAnimation(event);
+            return true;
+        };
+    }
+
+    /** Toggles the visibility of the panel. */
+    public void toggle() {
+        if (!isInflated()) {
+            getOverlayViewGlobalStateController().inflateView(this);
+        }
+        if (isPanelExpanded()) {
+            animateCollapsePanel();
+        } else {
+            animateExpandPanel();
+        }
+    }
+
+    /* ***************************************************************************************** *
+     * Panel Animation
+     * ***************************************************************************************** */
+
+    /** Animates the closing of the panel. */
+    protected void animateCollapsePanel() {
+        if (!shouldAnimateCollapsePanel()) {
+            return;
+        }
+
+        if (!isPanelExpanded() || !isPanelVisible()) {
+            return;
+        }
+
+        onAnimateCollapsePanel();
+        getOverlayViewGlobalStateController().setWindowFocusable(false);
+        animatePanel(mClosingVelocity, /* isClosing= */ true);
+    }
+
+    /** Determines whether {@link #animateCollapsePanel()} should collapse the panel. */
+    protected abstract boolean shouldAnimateCollapsePanel();
+
+    /** Called when the panel is beginning to collapse. */
+    protected abstract void onAnimateCollapsePanel();
+
+    /** Animates the expansion of the panel. */
+    protected void animateExpandPanel() {
+        if (!shouldAnimateExpandPanel()) {
+            return;
+        }
+
+        if (!mCarDeviceProvisionedController.isCurrentUserFullySetup()) {
+            return;
+        }
+
+        onAnimateExpandPanel();
+        setPanelVisible(true);
+        animatePanel(mOpeningVelocity, /* isClosing= */ false);
+
+        setPanelExpanded(true);
+    }
+
+    /** Determines whether {@link #animateExpandPanel()}} should expand the panel. */
+    protected abstract boolean shouldAnimateExpandPanel();
+
+    /** Called when the panel is beginning to expand. */
+    protected abstract void onAnimateExpandPanel();
+
+    /**
+     * Depending on certain conditions, determines whether to fully expand or collapse the panel.
+     */
+    protected void maybeCompleteAnimation(MotionEvent event) {
+        if (event.getActionMasked() == MotionEvent.ACTION_UP
+                && isPanelVisible()) {
+            if (mSettleClosePercentage < mPercentageFromBottom) {
+                animatePanel(DEFAULT_FLING_VELOCITY, false);
+            } else {
+                animatePanel(DEFAULT_FLING_VELOCITY, true);
+            }
+        }
+    }
+
+    /**
+     * Animates the panel from one position to other. This is used to either open or
+     * close the panel completely with a velocity. If the animation is to close the
+     * panel this method also makes the view invisible after animation ends.
+     */
+    protected void animatePanel(float velocity, boolean isClosing) {
+        float to = 0;
+        if (!isClosing) {
+            to = getLayout().getHeight();
+        }
+
+        Rect rect = getLayout().getClipBounds();
+        if (rect != null && rect.bottom != to) {
+            float from = rect.bottom;
+            animate(from, to, velocity, isClosing);
+            return;
+        }
+
+        // We will only be here if the shade is being opened programmatically or via button when
+        // height of the layout was not calculated.
+        ViewTreeObserver notificationTreeObserver = getLayout().getViewTreeObserver();
+        notificationTreeObserver.addOnGlobalLayoutListener(
+                new ViewTreeObserver.OnGlobalLayoutListener() {
+                    @Override
+                    public void onGlobalLayout() {
+                        ViewTreeObserver obs = getLayout().getViewTreeObserver();
+                        obs.removeOnGlobalLayoutListener(this);
+                        float to = getLayout().getHeight();
+                        animate(/* from= */ 0, to, velocity, isClosing);
+                    }
+                });
+    }
+
+    private void animate(float from, float to, float velocity, boolean isClosing) {
+        if (mIsAnimating) {
+            return;
+        }
+        mIsAnimating = true;
+        mIsTracking = true;
+        ValueAnimator animator = ValueAnimator.ofFloat(from, to);
+        animator.addUpdateListener(
+                animation -> {
+                    float animatedValue = (Float) animation.getAnimatedValue();
+                    setViewClipBounds((int) animatedValue);
+                });
+        animator.addListener(new AnimatorListenerAdapter() {
+            @Override
+            public void onAnimationEnd(Animator animation) {
+                super.onAnimationEnd(animation);
+                mIsAnimating = false;
+                mIsTracking = false;
+                mOpeningVelocity = DEFAULT_FLING_VELOCITY;
+                mClosingVelocity = DEFAULT_FLING_VELOCITY;
+                if (isClosing) {
+                    setPanelVisible(false);
+                    getLayout().setClipBounds(null);
+                    onCollapseAnimationEnd();
+                    setPanelExpanded(false);
+                } else {
+                    onExpandAnimationEnd();
+                    setPanelExpanded(true);
+                }
+            }
+        });
+        getFlingAnimationUtils().apply(animator, from, to, Math.abs(velocity));
+        animator.start();
+    }
+
+    /**
+     * Called in {@link Animator.AnimatorListener#onAnimationEnd(Animator)} when the panel is
+     * closing.
+     */
+    protected abstract void onCollapseAnimationEnd();
+
+    /**
+     * Called in {@link Animator.AnimatorListener#onAnimationEnd(Animator)} when the panel is
+     * opening.
+     */
+    protected abstract void onExpandAnimationEnd();
+
+    /* ***************************************************************************************** *
+     * Panel Visibility
+     * ***************************************************************************************** */
+
+    /** Set the panel view to be visible. */
+    protected final void setPanelVisible(boolean visible) {
+        mPanelVisible = visible;
+        onPanelVisible(visible);
+    }
+
+    /** Returns {@code true} if panel is visible. */
+    public final boolean isPanelVisible() {
+        return mPanelVisible;
+    }
+
+    /** Business logic run when panel visibility is set. */
+    @CallSuper
+    protected void onPanelVisible(boolean visible) {
+        if (DEBUG) {
+            Log.e(TAG, "onPanelVisible: " + visible);
+        }
+
+        if (visible && !getOverlayViewGlobalStateController().isWindowVisible()) {
+            getOverlayViewGlobalStateController().setWindowVisible(true);
+        }
+        if (!visible && getOverlayViewGlobalStateController().isWindowVisible()) {
+            getOverlayViewGlobalStateController().setWindowVisible(false);
+        }
+        getLayout().setVisibility(visible ? View.VISIBLE : View.INVISIBLE);
+        getOverlayViewGlobalStateController().setWindowFocusable(visible);
+    }
+
+    /* ***************************************************************************************** *
+     * Panel Expansion
+     * ***************************************************************************************** */
+
+    /**
+     * Set the panel state to expanded. This will expand or collapse the overlay window if
+     * necessary.
+     */
+    protected final void setPanelExpanded(boolean expand) {
+        mPanelExpanded = expand;
+        onPanelExpanded(expand);
+    }
+
+    /** Returns {@code true} if panel is expanded. */
+    public final boolean isPanelExpanded() {
+        return mPanelExpanded;
+    }
+
+    @CallSuper
+    protected void onPanelExpanded(boolean expand) {
+        if (DEBUG) {
+            Log.e(TAG, "onPanelExpanded: " + expand);
+        }
+    }
+
+    /* ***************************************************************************************** *
+     * Misc
+     * ***************************************************************************************** */
+
+    protected void calculatePercentageFromBottom(float height) {
+        if (getLayout().getHeight() > 0) {
+            mPercentageFromBottom = (int) Math.abs(
+                    height / getLayout().getHeight() * 100);
+        }
+    }
+
+    protected void setViewClipBounds(int height) {
+        if (height > getLayout().getHeight()) {
+            height = getLayout().getHeight();
+        }
+        Rect clipBounds = new Rect();
+        clipBounds.set(0, 0, getLayout().getWidth(), height);
+        getLayout().setClipBounds(clipBounds);
+        onScroll(height);
+    }
+
+    /** Called while scrolling. */
+    protected abstract void onScroll(int height);
+
+    /* ***************************************************************************************** *
+     * Getters
+     * ***************************************************************************************** */
+
+    /** Returns the open touch listener. */
+    public final View.OnTouchListener getDragOpenTouchListener() {
+        return mDragOpenTouchListener;
+    }
+
+    /** Returns the close touch listener. */
+    public final View.OnTouchListener getDragCloseTouchListener() {
+        return mDragCloseTouchListener;
+    }
+
+    /** Gets the fling animation utils used for animating this panel. */
+    protected final FlingAnimationUtils getFlingAnimationUtils() {
+        return mFlingAnimationUtils;
+    }
+
+    /** Returns {@code true} if the panel is currently tracking. */
+    protected final boolean isTracking() {
+        return mIsTracking;
+    }
+
+    /** Returns {@code true} if the panel is currently animating. */
+    protected final boolean isAnimating() {
+        return mIsAnimating;
+    }
+
+    /** Returns the percentage of the panel that is open from the bottom. */
+    protected final int getPercentageFromBottom() {
+        return mPercentageFromBottom;
+    }
+
+    /** Returns the percentage at which we've determined whether to open or close the panel. */
+    protected final int getSettleClosePercentage() {
+        return mSettleClosePercentage;
+    }
+
+    /* ***************************************************************************************** *
+     * Gesture Listeners
+     * ***************************************************************************************** */
+
+    /** Called when the user is beginning to scroll down the panel. */
+    protected abstract void onOpenScrollStart();
+
+    /**
+     * Only responsible for open hooks. Since once the panel opens it covers all elements
+     * there is no need to merge with close.
+     */
+    protected abstract class OpenGestureListener extends
+            GestureDetector.SimpleOnGestureListener {
+
+        @Override
+        public boolean onScroll(MotionEvent event1, MotionEvent event2, float distanceX,
+                float distanceY) {
+
+            if (!isPanelVisible()) {
+                onOpenScrollStart();
+            }
+            setPanelVisible(true);
+
+            // clips the view for the notification shade when the user scrolls to open.
+            setViewClipBounds((int) event2.getRawY());
+
+            // Initially the scroll starts with height being zero. This checks protects from divide
+            // by zero error.
+            calculatePercentageFromBottom(event2.getRawY());
+
+            mIsTracking = true;
+            return true;
+        }
+
+
+        @Override
+        public boolean onFling(MotionEvent event1, MotionEvent event2,
+                float velocityX, float velocityY) {
+            if (velocityY > SWIPE_THRESHOLD_VELOCITY) {
+                mOpeningVelocity = velocityY;
+                open();
+                return true;
+            }
+            animatePanel(DEFAULT_FLING_VELOCITY, true);
+
+            return false;
+        }
+
+        protected abstract void open();
+    }
+
+    /** Determines whether the scroll event should allow closing of the panel. */
+    protected abstract boolean shouldAllowClosingScroll();
+
+    protected abstract class CloseGestureListener extends
+            GestureDetector.SimpleOnGestureListener {
+
+        @Override
+        public boolean onSingleTapUp(MotionEvent motionEvent) {
+            if (isPanelExpanded()) {
+                animatePanel(DEFAULT_FLING_VELOCITY, true);
+            }
+            return true;
+        }
+
+        @Override
+        public boolean onScroll(MotionEvent event1, MotionEvent event2, float distanceX,
+                float distanceY) {
+            // should not clip while scroll to the bottom of the list.
+            if (!shouldAllowClosingScroll()) {
+                return false;
+            }
+            float actualNotificationHeight =
+                    getLayout().getHeight() - (event1.getRawY() - event2.getRawY());
+            if (actualNotificationHeight > getLayout().getHeight()) {
+                actualNotificationHeight = getLayout().getHeight();
+            }
+            if (getLayout().getHeight() > 0) {
+                mPercentageFromBottom = (int) Math.abs(
+                        actualNotificationHeight / getLayout().getHeight() * 100);
+                boolean isUp = distanceY > 0;
+
+                // This check is to figure out if onScroll was called while swiping the card at
+                // bottom of the list. At that time we should not allow notification shade to
+                // close. We are also checking for the upwards swipe gesture here because it is
+                // possible if a user is closing the notification shade and while swiping starts
+                // to open again but does not fling. At that time we should allow the
+                // notification shade to close fully or else it would stuck in between.
+                if (Math.abs(getLayout().getHeight() - actualNotificationHeight)
+                        > SWIPE_DOWN_MIN_DISTANCE && isUp) {
+                    setViewClipBounds((int) actualNotificationHeight);
+                    mIsTracking = true;
+                } else if (!isUp) {
+                    setViewClipBounds((int) actualNotificationHeight);
+                }
+            }
+            // if we return true the items in RV won't be scrollable.
+            return false;
+        }
+
+
+        @Override
+        public boolean onFling(MotionEvent event1, MotionEvent event2,
+                float velocityX, float velocityY) {
+            // should not fling if the touch does not start when view is at the bottom of the list.
+            if (!shouldAllowClosingScroll()) {
+                return false;
+            }
+            if (Math.abs(event1.getX() - event2.getX()) > SWIPE_MAX_OFF_PATH
+                    || Math.abs(velocityY) < SWIPE_THRESHOLD_VELOCITY) {
+                // swipe was not vertical or was not fast enough
+                return false;
+            }
+            boolean isUp = velocityY < 0;
+            if (isUp) {
+                close();
+                return true;
+            } else {
+                // we should close the shade
+                animatePanel(velocityY, false);
+            }
+            return false;
+        }
+
+        protected abstract void close();
+    }
+
+    protected abstract class SystemBarCloseGestureListener extends CloseGestureListener {
+        @Override
+        public boolean onSingleTapUp(MotionEvent e) {
+            mClosingVelocity = DEFAULT_FLING_VELOCITY;
+            if (isPanelExpanded()) {
+                close();
+            }
+            return super.onSingleTapUp(e);
+        }
+
+        @Override
+        public boolean onScroll(MotionEvent event1, MotionEvent event2, float distanceX,
+                float distanceY) {
+            calculatePercentageFromBottom(event2.getRawY());
+            setViewClipBounds((int) event2.getRawY());
+            return true;
+        }
+    }
+}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewController.java b/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewController.java
new file mode 100644
index 0000000..87f2020
--- /dev/null
+++ b/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewController.java
@@ -0,0 +1,128 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.car.window;
+
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.ViewStub;
+
+/**
+ * Owns a {@link View} that is present in SystemUIOverlayWindow.
+ */
+public class OverlayViewController {
+    private final int mStubId;
+    private final OverlayViewGlobalStateController mOverlayViewGlobalStateController;
+
+    private View mLayout;
+
+    public OverlayViewController(int stubId,
+            OverlayViewGlobalStateController overlayViewGlobalStateController) {
+        mLayout = null;
+        mStubId = stubId;
+        mOverlayViewGlobalStateController = overlayViewGlobalStateController;
+    }
+
+    /**
+     * Shows content of {@link OverlayViewController}.
+     *
+     * Should be used to show view externally and in particular by {@link OverlayViewMediator}.
+     */
+    public final void start() {
+        mOverlayViewGlobalStateController.showView(/* viewController= */ this, this::show);
+    }
+
+    /**
+     * Hides content of {@link OverlayViewController}.
+     *
+     * Should be used to hide view externally and in particular by {@link OverlayViewMediator}.
+     */
+    public final void stop() {
+        mOverlayViewGlobalStateController.hideView(/* viewController= */ this, this::hide);
+    }
+
+
+    /**
+     * Inflate layout owned by controller.
+     */
+    public final void inflate(ViewGroup baseLayout) {
+        ViewStub viewStub = baseLayout.findViewById(mStubId);
+        mLayout = viewStub.inflate();
+        onFinishInflate();
+    }
+
+    /**
+     * Called once inflate finishes.
+     */
+    protected void onFinishInflate() {
+        // no-op
+    }
+
+    /**
+     * Returns [@code true} if layout owned by controller has been inflated.
+     */
+    public final boolean isInflated() {
+        return mLayout != null;
+    }
+
+    private void show() {
+        if (mLayout == null) {
+            // layout must be inflated before show() is called.
+            return;
+        }
+        showInternal();
+    }
+
+    /**
+     * Subclasses should override this method to implement reveal animations and implement logic
+     * specific to when the layout owned by the controller is shown.
+     *
+     * Should only be overridden by Superclass but not called by any {@link OverlayViewMediator}.
+     */
+    protected void showInternal() {
+        mLayout.setVisibility(View.VISIBLE);
+    }
+
+    private void hide() {
+        if (mLayout == null) {
+            // layout must be inflated before hide() is called.
+            return;
+        }
+        hideInternal();
+    }
+
+    /**
+     * Subclasses should override this method to implement conceal animations and implement logic
+     * specific to when the layout owned by the controller is hidden.
+     *
+     * Should only be overridden by Superclass but not called by any {@link OverlayViewMediator}.
+     */
+    protected void hideInternal() {
+        mLayout.setVisibility(View.GONE);
+    }
+
+    /**
+     * Provides access to layout owned by controller.
+     */
+    protected final View getLayout() {
+        return mLayout;
+    }
+
+    /** Returns the {@link OverlayViewGlobalStateController}. */
+    protected final OverlayViewGlobalStateController getOverlayViewGlobalStateController() {
+        return mOverlayViewGlobalStateController;
+    }
+}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewGlobalStateController.java b/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewGlobalStateController.java
new file mode 100644
index 0000000..290505f
--- /dev/null
+++ b/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewGlobalStateController.java
@@ -0,0 +1,143 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.car.window;
+
+import android.util.Log;
+
+import androidx.annotation.VisibleForTesting;
+
+import com.android.systemui.car.navigationbar.CarNavigationBarController;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+/**
+ * This controller is responsible for the following:
+ * <p><ul>
+ * <li>Holds the global state for SystemUIOverlayWindow.
+ * <li>Allows {@link SystemUIOverlayWindowManager} to register {@link OverlayViewMediator}(s).
+ * <li>Enables {@link OverlayViewController)(s) to reveal/conceal themselves while respecting the
+ * global state of SystemUIOverlayWindow.
+ * </ul>
+ */
+@Singleton
+public class OverlayViewGlobalStateController {
+    private static final String TAG = OverlayViewGlobalStateController.class.getSimpleName();
+    private final SystemUIOverlayWindowController mSystemUIOverlayWindowController;
+    private final CarNavigationBarController mCarNavigationBarController;
+    @VisibleForTesting
+    Set<String> mShownSet;
+
+    @Inject
+    public OverlayViewGlobalStateController(
+            CarNavigationBarController carNavigationBarController,
+            SystemUIOverlayWindowController systemUIOverlayWindowController) {
+        mSystemUIOverlayWindowController = systemUIOverlayWindowController;
+        mSystemUIOverlayWindowController.attach();
+        mCarNavigationBarController = carNavigationBarController;
+        mShownSet = new HashSet<>();
+    }
+
+    /**
+     * Register {@link OverlayViewMediator} to use in SystemUIOverlayWindow.
+     */
+    public void registerMediator(OverlayViewMediator overlayViewMediator) {
+        Log.d(TAG, "Registering content mediator: " + overlayViewMediator.getClass().getName());
+
+        overlayViewMediator.registerListeners();
+        overlayViewMediator.setupOverlayContentViewControllers();
+    }
+
+    /**
+     * Show content in Overlay Window.
+     */
+    public void showView(OverlayViewController viewController, Runnable show) {
+        if (mShownSet.isEmpty()) {
+            mCarNavigationBarController.hideBars();
+            setWindowVisible(true);
+        }
+
+        inflateView(viewController);
+
+        show.run();
+        mShownSet.add(viewController.getClass().getName());
+
+        Log.d(TAG, "Content shown: " + viewController.getClass().getName());
+    }
+
+    /**
+     * Hide content in Overlay Window.
+     */
+    public void hideView(OverlayViewController viewController, Runnable hide) {
+        if (!viewController.isInflated()) {
+            Log.d(TAG, "Content cannot be hidden since it isn't inflated: "
+                    + viewController.getClass().getName());
+            return;
+        }
+        if (!mShownSet.contains(viewController.getClass().getName())) {
+            Log.d(TAG, "Content cannot be hidden since it isn't shown: "
+                    + viewController.getClass().getName());
+            return;
+        }
+
+        hide.run();
+        mShownSet.remove(viewController.getClass().getName());
+
+        if (mShownSet.isEmpty()) {
+            mCarNavigationBarController.showBars();
+            setWindowVisible(false);
+        }
+
+        Log.d(TAG, "Content hidden: " + viewController.getClass().getName());
+    }
+
+    /** Sets the window visibility state. */
+    public void setWindowVisible(boolean expanded) {
+        mSystemUIOverlayWindowController.setWindowVisible(expanded);
+    }
+
+    /** Returns {@code true} is the window is visible. */
+    public boolean isWindowVisible() {
+        return mSystemUIOverlayWindowController.isWindowVisible();
+    }
+
+    /** Sets the focusable flag of the sysui overlawy window. */
+    public void setWindowFocusable(boolean focusable) {
+        mSystemUIOverlayWindowController.setWindowFocusable(focusable);
+    }
+
+    /** Sets the {@link android.view.WindowManager.LayoutParams#FLAG_ALT_FOCUSABLE_IM} flag of the
+     * sysui overlay window */
+    public void setWindowNeedsInput(boolean needsInput) {
+        mSystemUIOverlayWindowController.setWindowNeedsInput(needsInput);
+    }
+
+    /** Returns {@code true} if the window is focusable. */
+    public boolean isWindowFocusable() {
+        return mSystemUIOverlayWindowController.isWindowFocusable();
+    }
+
+    /** Inflates the view controlled by the given view controller. */
+    public void inflateView(OverlayViewController viewController) {
+        if (!viewController.isInflated()) {
+            viewController.inflate(mSystemUIOverlayWindowController.getBaseLayout());
+        }
+    }
+}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewMediator.java b/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewMediator.java
new file mode 100644
index 0000000..ac574ed
--- /dev/null
+++ b/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewMediator.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.car.window;
+
+/**
+ * Controls when to show and hide {@link OverlayViewController}(s).
+ */
+public interface OverlayViewMediator {
+
+    /**
+     * Register listeners that could use ContentVisibilityAdjuster to show/hide content.
+     */
+    void registerListeners();
+
+    /**
+     * Allows for post-inflation callbacks and listeners to be set inside required {@link
+     * OverlayViewController}(s).
+     */
+    void setupOverlayContentViewControllers();
+}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayWindowModule.java b/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayWindowModule.java
new file mode 100644
index 0000000..c46b287
--- /dev/null
+++ b/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayWindowModule.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.car.window;
+
+import com.android.systemui.car.keyguard.CarKeyguardViewMediator;
+import com.android.systemui.car.notification.NotificationPanelViewMediator;
+import com.android.systemui.car.userswitcher.FullscreenUserSwitcherViewMediator;
+
+import dagger.Binds;
+import dagger.Module;
+import dagger.multibindings.ClassKey;
+import dagger.multibindings.IntoMap;
+
+/**
+ * Dagger injection module for {@link SystemUIOverlayWindowManager}
+ */
+@Module
+public abstract class OverlayWindowModule {
+
+    /** Injects NotificationPanelViewMediator. */
+    @Binds
+    @IntoMap
+    @ClassKey(NotificationPanelViewMediator.class)
+    public abstract OverlayViewMediator bindNotificationPanelViewMediator(
+            NotificationPanelViewMediator notificationPanelViewMediator);
+
+    /** Inject into CarKeyguardViewMediator. */
+    @Binds
+    @IntoMap
+    @ClassKey(CarKeyguardViewMediator.class)
+    public abstract OverlayViewMediator bindCarKeyguardViewMediator(
+            CarKeyguardViewMediator carKeyguardViewMediator);
+
+    /** Injects FullscreenUserSwitcherViewsMediator. */
+    @Binds
+    @IntoMap
+    @ClassKey(FullscreenUserSwitcherViewMediator.class)
+    public abstract OverlayViewMediator bindFullscreenUserSwitcherViewsMediator(
+            FullscreenUserSwitcherViewMediator overlayViewsMediator);
+}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/window/SystemUIOverlayWindowController.java b/packages/CarSystemUI/src/com/android/systemui/car/window/SystemUIOverlayWindowController.java
new file mode 100644
index 0000000..bcd96f6
--- /dev/null
+++ b/packages/CarSystemUI/src/com/android/systemui/car/window/SystemUIOverlayWindowController.java
@@ -0,0 +1,161 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.car.window;
+
+import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
+
+import android.content.Context;
+import android.graphics.PixelFormat;
+import android.os.Binder;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.WindowManager;
+
+import com.android.systemui.R;
+import com.android.systemui.statusbar.policy.ConfigurationController;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+/**
+ * Controls the expansion state of the primary window which will contain all of the fullscreen sysui
+ * behavior. This window still has a collapsed state in order to watch for swipe events to expand
+ * this window for the notification panel.
+ */
+@Singleton
+public class SystemUIOverlayWindowController implements
+        ConfigurationController.ConfigurationListener {
+
+    private final Context mContext;
+    private final WindowManager mWindowManager;
+
+    private ViewGroup mBaseLayout;
+    private WindowManager.LayoutParams mLp;
+    private WindowManager.LayoutParams mLpChanged;
+    private boolean mIsAttached = false;
+    private boolean mVisible = false;
+    private boolean mFocusable = false;
+
+    @Inject
+    public SystemUIOverlayWindowController(
+            Context context,
+            WindowManager windowManager,
+            ConfigurationController configurationController
+    ) {
+        mContext = context;
+        mWindowManager = windowManager;
+
+        mLpChanged = new WindowManager.LayoutParams();
+        mBaseLayout = (ViewGroup) LayoutInflater.from(context)
+                .inflate(R.layout.sysui_overlay_window, /* root= */ null, false);
+
+        configurationController.addCallback(this);
+    }
+
+    /** Returns the base view of the primary window. */
+    public ViewGroup getBaseLayout() {
+        return mBaseLayout;
+    }
+
+    /** Returns {@code true} if the window is already attached. */
+    public boolean isAttached() {
+        return mIsAttached;
+    }
+
+    /** Attaches the window to the window manager. */
+    public void attach() {
+        if (mIsAttached) {
+            return;
+        }
+        mIsAttached = true;
+        // Now that the status bar window encompasses the sliding panel and its
+        // translucent backdrop, the entire thing is made TRANSLUCENT and is
+        // hardware-accelerated.
+        mLp = new WindowManager.LayoutParams(
+                ViewGroup.LayoutParams.MATCH_PARENT,
+                ViewGroup.LayoutParams.MATCH_PARENT,
+                WindowManager.LayoutParams.TYPE_NOTIFICATION_SHADE,
+                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
+                        | WindowManager.LayoutParams.FLAG_TOUCHABLE_WHEN_WAKING
+                        | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH
+                        | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
+                        | WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS,
+                PixelFormat.TRANSLUCENT);
+        mLp.token = new Binder();
+        mLp.gravity = Gravity.TOP;
+        mLp.setFitInsetsTypes(/* types= */ 0);
+        mLp.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE;
+        mLp.setTitle("SystemUIOverlayWindow");
+        mLp.packageName = mContext.getPackageName();
+        mLp.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
+
+        mWindowManager.addView(mBaseLayout, mLp);
+        mLpChanged.copyFrom(mLp);
+        setWindowVisible(false);
+    }
+
+    /** Sets the window to the visible state. */
+    public void setWindowVisible(boolean visible) {
+        mVisible = visible;
+        if (visible) {
+            mBaseLayout.setVisibility(View.VISIBLE);
+        } else {
+            mBaseLayout.setVisibility(View.INVISIBLE);
+        }
+        updateWindow();
+    }
+
+    /** Sets the window to be focusable. */
+    public void setWindowFocusable(boolean focusable) {
+        mFocusable = focusable;
+        if (focusable) {
+            mLpChanged.flags &= ~WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
+        } else {
+            mLpChanged.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
+        }
+        updateWindow();
+    }
+
+    /** Sets the window to enable IME. */
+    public void setWindowNeedsInput(boolean needsInput) {
+        if (needsInput) {
+            mLpChanged.flags &= ~WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
+        } else {
+            mLpChanged.flags |= WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
+        }
+        updateWindow();
+    }
+
+    /** Returns {@code true} if the window is visible */
+    public boolean isWindowVisible() {
+        return mVisible;
+    }
+
+    public boolean isWindowFocusable() {
+        return mFocusable;
+    }
+
+    private void updateWindow() {
+        if (mLp != null && mLp.copyFrom(mLpChanged) != 0) {
+            if (isAttached()) {
+                mWindowManager.updateViewLayout(mBaseLayout, mLp);
+            }
+        }
+    }
+}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/window/SystemUIOverlayWindowManager.java b/packages/CarSystemUI/src/com/android/systemui/car/window/SystemUIOverlayWindowManager.java
new file mode 100644
index 0000000..3f88422
--- /dev/null
+++ b/packages/CarSystemUI/src/com/android/systemui/car/window/SystemUIOverlayWindowManager.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.car.window;
+
+import android.content.Context;
+
+import com.android.systemui.R;
+import com.android.systemui.SystemUI;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.util.Map;
+
+import javax.inject.Inject;
+import javax.inject.Provider;
+import javax.inject.Singleton;
+
+/**
+ * Registers {@link OverlayViewMediator}(s) and synchronizes their calls to hide/show {@link
+ * OverlayViewController}(s) to allow for the correct visibility of system bars.
+ */
+@Singleton
+public class SystemUIOverlayWindowManager extends SystemUI {
+    private static final String TAG = "SystemUIOverlayWindowManager";
+    private final Map<Class<?>, Provider<OverlayViewMediator>>
+            mContentMediatorCreators;
+    private final OverlayViewGlobalStateController mOverlayViewGlobalStateController;
+
+    @Inject
+    public SystemUIOverlayWindowManager(
+            Context context,
+            Map<Class<?>, Provider<OverlayViewMediator>> contentMediatorCreators,
+            OverlayViewGlobalStateController overlayViewGlobalStateController) {
+        super(context);
+        mContentMediatorCreators = contentMediatorCreators;
+        mOverlayViewGlobalStateController = overlayViewGlobalStateController;
+    }
+
+    @Override
+    public void start() {
+        String[] names = mContext.getResources().getStringArray(
+                R.array.config_carSystemUIOverlayViewsMediators);
+        startServices(names);
+    }
+
+    private void startServices(String[] services) {
+        for (String clsName : services) {
+            try {
+                OverlayViewMediator obj = resolveContentMediator(clsName);
+                if (obj == null) {
+                    Constructor constructor = Class.forName(clsName).getConstructor(Context.class);
+                    obj = (OverlayViewMediator) constructor.newInstance(this);
+                }
+                mOverlayViewGlobalStateController.registerMediator(obj);
+            } catch (ClassNotFoundException
+                    | NoSuchMethodException
+                    | IllegalAccessException
+                    | InstantiationException
+                    | InvocationTargetException ex) {
+                throw new RuntimeException(ex);
+            }
+        }
+    }
+
+    private OverlayViewMediator resolveContentMediator(String className) {
+        return resolve(className, mContentMediatorCreators);
+    }
+
+    private <T> T resolve(String className, Map<Class<?>, Provider<T>> creators) {
+        try {
+            Class<?> clazz = Class.forName(className);
+            Provider<T> provider = creators.get(clazz);
+            return provider == null ? null : provider.get();
+        } catch (ClassNotFoundException e) {
+            return null;
+        }
+    }
+}
diff --git a/packages/CarSystemUI/src/com/android/systemui/navigationbar/car/AssitantButton.java b/packages/CarSystemUI/src/com/android/systemui/navigationbar/car/AssitantButton.java
deleted file mode 100644
index 98cc00e..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/navigationbar/car/AssitantButton.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (C) 2019 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.navigationbar.car;
-
-import static android.service.voice.VoiceInteractionSession.SHOW_SOURCE_ASSIST_GESTURE;
-
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.os.Bundle;
-import android.util.AttributeSet;
-import android.util.Log;
-
-import com.android.internal.app.AssistUtils;
-import com.android.internal.app.IVoiceInteractionSessionShowCallback;
-
-/**
- * AssitantButton is a ui component that will trigger the Voice Interaction Service.
- */
-public class AssitantButton extends CarNavigationButton {
-
-    private static final String TAG = "AssistantButton";
-    private final AssistUtils mAssistUtils;
-    private IVoiceInteractionSessionShowCallback mShowCallback =
-            new IVoiceInteractionSessionShowCallback.Stub() {
-                @Override
-                public void onFailed() {
-                    Log.w(TAG, "Failed to show VoiceInteractionSession");
-                }
-
-                @Override
-                public void onShown() {
-                    Log.d(TAG, "IVoiceInteractionSessionShowCallback onShown()");
-                }
-            };
-
-    public AssitantButton(Context context, AttributeSet attrs) {
-        super(context, attrs);
-        mAssistUtils = new AssistUtils(context);
-        setOnClickListener(v -> {
-            showAssistant();
-        });
-    }
-
-    private void showAssistant() {
-        final Bundle args = new Bundle();
-        mAssistUtils.showSessionForActiveService(args,
-                SHOW_SOURCE_ASSIST_GESTURE, mShowCallback, /*activityToken=*/ null);
-    }
-
-    @Override
-    protected void setUpIntents(TypedArray typedArray) {
-        // left blank because for the assistant button Intent will not be passed from the layout.
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/navigationbar/car/ButtonSelectionStateController.java b/packages/CarSystemUI/src/com/android/systemui/navigationbar/car/ButtonSelectionStateController.java
deleted file mode 100644
index c36aaa0..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/navigationbar/car/ButtonSelectionStateController.java
+++ /dev/null
@@ -1,232 +0,0 @@
-/*
- * Copyright (C) 2019 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.navigationbar.car;
-
-import android.app.ActivityManager;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.view.Display;
-import android.view.View;
-import android.view.ViewGroup;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import javax.inject.Inject;
-import javax.inject.Singleton;
-
-/**
- * CarNavigationButtons can optionally have selection state that toggles certain visual indications
- * based on whether the active application on screen is associated with it. This is basically a
- * similar concept to a radio button group.
- *
- * This class controls the selection state of CarNavigationButtons that have opted in to have such
- * selection state-dependent visual indications.
- */
-@Singleton
-public class ButtonSelectionStateController {
-
-    private final Set<CarNavigationButton> mRegisteredViews = new HashSet<>();
-
-    protected ButtonMap mButtonsByCategory = new ButtonMap();
-    protected ButtonMap mButtonsByPackage = new ButtonMap();
-    protected ButtonMap mButtonsByComponentName = new ButtonMap();
-    protected HashSet<CarNavigationButton> mSelectedButtons;
-    protected Context mContext;
-
-    @Inject
-    public ButtonSelectionStateController(Context context) {
-        mContext = context;
-        mSelectedButtons = new HashSet<>();
-    }
-
-    /**
-     * Iterate through a view looking for CarNavigationButton and add it to the controller if it
-     * opted in to be highlighted when the active application is associated with it.
-     *
-     * @param v the View that may contain CarFacetButtons
-     */
-    protected void addAllButtonsWithSelectionState(View v) {
-        if (v instanceof CarNavigationButton) {
-            if (((CarNavigationButton) v).hasSelectionState()) {
-                addButtonWithSelectionState((CarNavigationButton) v);
-            }
-        } else if (v instanceof ViewGroup) {
-            ViewGroup viewGroup = (ViewGroup) v;
-            for (int i = 0; i < viewGroup.getChildCount(); i++) {
-                addAllButtonsWithSelectionState(viewGroup.getChildAt(i));
-            }
-        }
-    }
-
-    /** Removes all buttons from the button maps. */
-    protected void removeAll() {
-        mButtonsByCategory.clear();
-        mButtonsByPackage.clear();
-        mButtonsByComponentName.clear();
-        mSelectedButtons.clear();
-        mRegisteredViews.clear();
-    }
-
-    /**
-     * This will unselect the currently selected CarNavigationButton and determine which one should
-     * be selected next. It does this by reading the properties on the CarNavigationButton and
-     * seeing if they are a match with the supplied StackInfo list.
-     * The order of selection detection is ComponentName, PackageName then Category
-     * They will then be compared with the supplied StackInfo list.
-     * The StackInfo is expected to be supplied in order of recency and StackInfo will only be used
-     * for consideration if it has the same displayId as the CarNavigationButton.
-     *
-     * @param stackInfoList of the currently running application
-     * @param validDisplay index of the valid display
-     */
-
-    protected void taskChanged(List<ActivityManager.StackInfo> stackInfoList, int validDisplay) {
-        ActivityManager.StackInfo validStackInfo = null;
-        for (ActivityManager.StackInfo stackInfo : stackInfoList) {
-            // Find the first stack info with a topActivity in the primary display.
-            // TODO: We assume that CarFacetButton will launch an app only in the primary display.
-            // We need to extend the functionality to handle the multiple display properly.
-            if (stackInfo.topActivity != null && stackInfo.displayId == validDisplay) {
-                validStackInfo = stackInfo;
-                break;
-            }
-        }
-
-        if (validStackInfo == null) {
-            // No stack was found that was on the same display as the buttons thus return
-            return;
-        }
-        int displayId = validStackInfo.displayId;
-
-        mSelectedButtons.forEach(carNavigationButton -> {
-            if (carNavigationButton.getDisplayId() == displayId) {
-                carNavigationButton.setSelected(false);
-            }
-        });
-        mSelectedButtons.clear();
-
-        HashSet<CarNavigationButton> selectedButtons = findSelectedButtons(validStackInfo);
-
-        if (selectedButtons != null) {
-            selectedButtons.forEach(carNavigationButton -> {
-                if (carNavigationButton.getDisplayId() == displayId) {
-                    carNavigationButton.setSelected(true);
-                    mSelectedButtons.add(carNavigationButton);
-                }
-            });
-        }
-    }
-
-    /**
-     * Defaults to Display.DEFAULT_DISPLAY when no parameter is provided for the validDisplay.
-     *
-     * @param stackInfoList
-     */
-    protected void taskChanged(List<ActivityManager.StackInfo> stackInfoList) {
-        taskChanged(stackInfoList, Display.DEFAULT_DISPLAY);
-    }
-
-    /**
-     * Add navigation button to this controller if it uses selection state.
-     */
-    private void addButtonWithSelectionState(CarNavigationButton carNavigationButton) {
-        if (mRegisteredViews.contains(carNavigationButton)) {
-            return;
-        }
-        String[] categories = carNavigationButton.getCategories();
-        for (int i = 0; i < categories.length; i++) {
-            mButtonsByCategory.add(categories[i], carNavigationButton);
-        }
-
-        String[] packages = carNavigationButton.getPackages();
-        for (int i = 0; i < packages.length; i++) {
-            mButtonsByPackage.add(packages[i], carNavigationButton);
-        }
-        String[] componentNames = carNavigationButton.getComponentName();
-        for (int i = 0; i < componentNames.length; i++) {
-            mButtonsByComponentName.add(componentNames[i], carNavigationButton);
-        }
-
-        mRegisteredViews.add(carNavigationButton);
-    }
-
-    private HashSet<CarNavigationButton> findSelectedButtons(
-            ActivityManager.StackInfo validStackInfo) {
-        String packageName = validStackInfo.topActivity.getPackageName();
-
-        HashSet<CarNavigationButton> selectedButtons =
-                findButtonsByComponentName(validStackInfo.topActivity);
-        if (selectedButtons == null) {
-            selectedButtons = mButtonsByPackage.get(packageName);
-        }
-        if (selectedButtons == null) {
-            String category = getPackageCategory(packageName);
-            if (category != null) {
-                selectedButtons = mButtonsByCategory.get(category);
-            }
-        }
-
-        return selectedButtons;
-    }
-
-    private HashSet<CarNavigationButton> findButtonsByComponentName(
-            ComponentName componentName) {
-        HashSet<CarNavigationButton> buttons =
-                mButtonsByComponentName.get(componentName.flattenToShortString());
-        return (buttons != null) ? buttons :
-                mButtonsByComponentName.get(componentName.flattenToString());
-    }
-
-    private String getPackageCategory(String packageName) {
-        PackageManager pm = mContext.getPackageManager();
-        Set<String> supportedCategories = mButtonsByCategory.keySet();
-        for (String category : supportedCategories) {
-            Intent intent = new Intent();
-            intent.setPackage(packageName);
-            intent.setAction(Intent.ACTION_MAIN);
-            intent.addCategory(category);
-            List<ResolveInfo> list = pm.queryIntentActivities(intent, 0);
-            if (list.size() > 0) {
-                // Cache this package name into ButtonsByPackage map, so we won't have to query
-                // all categories next time this package name shows up.
-                mButtonsByPackage.put(packageName, mButtonsByCategory.get(category));
-                return category;
-            }
-        }
-        return null;
-    }
-
-    // simple multi-map
-    private static class ButtonMap extends HashMap<String, HashSet<CarNavigationButton>> {
-
-        public boolean add(String key, CarNavigationButton value) {
-            if (containsKey(key)) {
-                return get(key).add(value);
-            }
-            HashSet<CarNavigationButton> set = new HashSet<>();
-            set.add(value);
-            put(key, set);
-            return true;
-        }
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/navigationbar/car/ButtonSelectionStateListener.java b/packages/CarSystemUI/src/com/android/systemui/navigationbar/car/ButtonSelectionStateListener.java
deleted file mode 100644
index 9da4121..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/navigationbar/car/ButtonSelectionStateListener.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (C) 2019 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.navigationbar.car;
-
-import android.app.ActivityTaskManager;
-import android.util.Log;
-
-import com.android.systemui.shared.system.TaskStackChangeListener;
-
-import javax.inject.Inject;
-import javax.inject.Singleton;
-
-/**
- * An implementation of TaskStackChangeListener, that listens for changes in the system
- * task stack and notifies the navigation bar.
- */
-@Singleton
-class ButtonSelectionStateListener extends TaskStackChangeListener {
-    private static final String TAG = ButtonSelectionStateListener.class.getSimpleName();
-
-    private final ButtonSelectionStateController mButtonSelectionStateController;
-
-    @Inject
-    ButtonSelectionStateListener(ButtonSelectionStateController carNavigationButtonController) {
-        mButtonSelectionStateController = carNavigationButtonController;
-    }
-
-    @Override
-    public void onTaskStackChanged() {
-        try {
-            mButtonSelectionStateController.taskChanged(
-                    ActivityTaskManager.getService().getAllStackInfos());
-        } catch (Exception e) {
-            Log.e(TAG, "Getting StackInfo from activity manager failed", e);
-        }
-    }
-
-    @Override
-    public void onTaskDisplayChanged(int taskId, int newDisplayId) {
-        try {
-            mButtonSelectionStateController.taskChanged(
-                    ActivityTaskManager.getService().getAllStackInfos());
-        } catch (Exception e) {
-            Log.e(TAG, "Getting StackInfo from activity manager failed", e);
-        }
-
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/navigationbar/car/CarNavigationBar.java b/packages/CarSystemUI/src/com/android/systemui/navigationbar/car/CarNavigationBar.java
deleted file mode 100644
index df82753..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/navigationbar/car/CarNavigationBar.java
+++ /dev/null
@@ -1,437 +0,0 @@
-/*
- * Copyright (C) 2019 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.navigationbar.car;
-
-import static android.view.InsetsState.ITYPE_NAVIGATION_BAR;
-import static android.view.InsetsState.containsType;
-
-import static com.android.systemui.statusbar.phone.BarTransitions.MODE_SEMI_TRANSPARENT;
-import static com.android.systemui.statusbar.phone.BarTransitions.MODE_TRANSPARENT;
-
-import android.content.Context;
-import android.graphics.PixelFormat;
-import android.inputmethodservice.InputMethodService;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.RemoteException;
-import android.os.ServiceManager;
-import android.view.Display;
-import android.view.Gravity;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.WindowManager;
-
-import com.android.internal.statusbar.IStatusBarService;
-import com.android.internal.statusbar.RegisterStatusBarResult;
-import com.android.systemui.R;
-import com.android.systemui.SystemUI;
-import com.android.systemui.car.CarDeviceProvisionedController;
-import com.android.systemui.car.CarDeviceProvisionedListener;
-import com.android.systemui.dagger.qualifiers.Main;
-import com.android.systemui.shared.system.ActivityManagerWrapper;
-import com.android.systemui.statusbar.AutoHideUiElement;
-import com.android.systemui.statusbar.CommandQueue;
-import com.android.systemui.statusbar.NavigationBarController;
-import com.android.systemui.statusbar.SuperStatusBarViewFactory;
-import com.android.systemui.statusbar.phone.AutoHideController;
-import com.android.systemui.statusbar.phone.BarTransitions;
-import com.android.systemui.statusbar.policy.KeyguardStateController;
-
-import java.io.FileDescriptor;
-import java.io.PrintWriter;
-
-import javax.inject.Inject;
-
-import dagger.Lazy;
-
-/** Navigation bars customized for the automotive use case. */
-public class CarNavigationBar extends SystemUI implements CommandQueue.Callbacks {
-
-    private final CarNavigationBarController mCarNavigationBarController;
-    private final WindowManager mWindowManager;
-    private final CarDeviceProvisionedController mCarDeviceProvisionedController;
-    private final CommandQueue mCommandQueue;
-    private final AutoHideController mAutoHideController;
-    private final ButtonSelectionStateListener mButtonSelectionStateListener;
-    private final Handler mMainHandler;
-    private final Lazy<KeyguardStateController> mKeyguardStateControllerLazy;
-    private final Lazy<NavigationBarController> mNavigationBarControllerLazy;
-    private final SuperStatusBarViewFactory mSuperStatusBarViewFactory;
-    private final ButtonSelectionStateController mButtonSelectionStateController;
-
-    private final int mDisplayId;
-
-    private IStatusBarService mBarService;
-    private ActivityManagerWrapper mActivityManagerWrapper;
-
-    // If the nav bar should be hidden when the soft keyboard is visible.
-    private boolean mHideNavBarForKeyboard;
-    private boolean mBottomNavBarVisible;
-
-    // Nav bar views.
-    private ViewGroup mTopNavigationBarWindow;
-    private ViewGroup mBottomNavigationBarWindow;
-    private ViewGroup mLeftNavigationBarWindow;
-    private ViewGroup mRightNavigationBarWindow;
-    private CarNavigationBarView mTopNavigationBarView;
-    private CarNavigationBarView mBottomNavigationBarView;
-    private CarNavigationBarView mLeftNavigationBarView;
-    private CarNavigationBarView mRightNavigationBarView;
-
-    // To be attached to the navigation bars such that they can close the notification panel if
-    // it's open.
-    private boolean mDeviceIsSetUpForUser = true;
-    private boolean mIsUserSetupInProgress = false;
-
-    private @BarTransitions.TransitionMode int mNavigationBarMode;
-    private boolean mTransientShown;
-
-    @Inject
-    public CarNavigationBar(Context context,
-            CarNavigationBarController carNavigationBarController,
-            WindowManager windowManager,
-            CarDeviceProvisionedController deviceProvisionedController,
-            CommandQueue commandQueue,
-            AutoHideController autoHideController,
-            ButtonSelectionStateListener buttonSelectionStateListener,
-            @Main Handler mainHandler,
-            Lazy<KeyguardStateController> keyguardStateControllerLazy,
-            Lazy<NavigationBarController> navigationBarControllerLazy,
-            SuperStatusBarViewFactory superStatusBarViewFactory,
-            ButtonSelectionStateController buttonSelectionStateController) {
-        super(context);
-        mCarNavigationBarController = carNavigationBarController;
-        mWindowManager = windowManager;
-        mCarDeviceProvisionedController = deviceProvisionedController;
-        mCommandQueue = commandQueue;
-        mAutoHideController = autoHideController;
-        mButtonSelectionStateListener = buttonSelectionStateListener;
-        mMainHandler = mainHandler;
-        mKeyguardStateControllerLazy = keyguardStateControllerLazy;
-        mNavigationBarControllerLazy = navigationBarControllerLazy;
-        mSuperStatusBarViewFactory = superStatusBarViewFactory;
-        mButtonSelectionStateController = buttonSelectionStateController;
-
-        mDisplayId = mWindowManager.getDefaultDisplay().getDisplayId();
-    }
-
-    @Override
-    public void start() {
-        // Set initial state.
-        mHideNavBarForKeyboard = mContext.getResources().getBoolean(
-                com.android.internal.R.bool.config_automotiveHideNavBarForKeyboard);
-        mBottomNavBarVisible = false;
-
-        // Get bar service.
-        mBarService = IStatusBarService.Stub.asInterface(
-                ServiceManager.getService(Context.STATUS_BAR_SERVICE));
-
-        // Connect into the status bar manager service
-        mCommandQueue.addCallback(this);
-
-        RegisterStatusBarResult result = null;
-        try {
-            result = mBarService.registerStatusBar(mCommandQueue);
-        } catch (RemoteException ex) {
-            ex.rethrowFromSystemServer();
-        }
-
-        mAutoHideController.setNavigationBar(new AutoHideUiElement() {
-            @Override
-            public void synchronizeState() {
-                // No op.
-            }
-
-            @Override
-            public boolean isVisible() {
-                return mTransientShown;
-            }
-
-            @Override
-            public void hide() {
-                clearTransient();
-            }
-        });
-
-        mDeviceIsSetUpForUser = mCarDeviceProvisionedController.isCurrentUserSetup();
-        mIsUserSetupInProgress = mCarDeviceProvisionedController.isCurrentUserSetupInProgress();
-        mCarDeviceProvisionedController.addCallback(
-                new CarDeviceProvisionedListener() {
-                    @Override
-                    public void onUserSetupInProgressChanged() {
-                        mMainHandler.post(() -> restartNavBarsIfNecessary());
-                    }
-
-                    @Override
-                    public void onUserSetupChanged() {
-                        mMainHandler.post(() -> restartNavBarsIfNecessary());
-                    }
-
-                    @Override
-                    public void onUserSwitched() {
-                        mMainHandler.post(() -> restartNavBarsIfNecessary());
-                    }
-                });
-
-        createNavigationBar(result);
-
-        mActivityManagerWrapper = ActivityManagerWrapper.getInstance();
-        mActivityManagerWrapper.registerTaskStackListener(mButtonSelectionStateListener);
-
-        mCarNavigationBarController.connectToHvac();
-    }
-
-    private void restartNavBarsIfNecessary() {
-        boolean currentUserSetup = mCarDeviceProvisionedController.isCurrentUserSetup();
-        boolean currentUserSetupInProgress = mCarDeviceProvisionedController
-                .isCurrentUserSetupInProgress();
-        if (mIsUserSetupInProgress != currentUserSetupInProgress
-                || mDeviceIsSetUpForUser != currentUserSetup) {
-            mDeviceIsSetUpForUser = currentUserSetup;
-            mIsUserSetupInProgress = currentUserSetupInProgress;
-            restartNavBars();
-        }
-    }
-
-    /**
-     * Remove all content from navbars and rebuild them. Used to allow for different nav bars
-     * before and after the device is provisioned. . Also for change of density and font size.
-     */
-    private void restartNavBars() {
-        // remove and reattach all hvac components such that we don't keep a reference to unused
-        // ui elements
-        mCarNavigationBarController.removeAllFromHvac();
-        mButtonSelectionStateController.removeAll();
-
-        if (mTopNavigationBarWindow != null) {
-            mTopNavigationBarWindow.removeAllViews();
-            mTopNavigationBarView = null;
-        }
-
-        if (mBottomNavigationBarWindow != null) {
-            mBottomNavigationBarWindow.removeAllViews();
-            mBottomNavigationBarView = null;
-        }
-
-        if (mLeftNavigationBarWindow != null) {
-            mLeftNavigationBarWindow.removeAllViews();
-            mLeftNavigationBarView = null;
-        }
-
-        if (mRightNavigationBarWindow != null) {
-            mRightNavigationBarWindow.removeAllViews();
-            mRightNavigationBarView = null;
-        }
-
-        buildNavBarContent();
-        // If the UI was rebuilt (day/night change or user change) while the keyguard was up we need
-        // to correctly respect that state.
-        if (mKeyguardStateControllerLazy.get().isShowing()) {
-            mCarNavigationBarController.showAllKeyguardButtons(isDeviceSetupForUser());
-        } else {
-            mCarNavigationBarController.hideAllKeyguardButtons(isDeviceSetupForUser());
-        }
-
-        // Upon restarting the Navigation Bar, CarFacetButtonController should immediately apply the
-        // selection state that reflects the current task stack.
-        mButtonSelectionStateListener.onTaskStackChanged();
-    }
-
-    private boolean isDeviceSetupForUser() {
-        return mDeviceIsSetUpForUser && !mIsUserSetupInProgress;
-    }
-
-    private void createNavigationBar(RegisterStatusBarResult result) {
-        buildNavBarWindows();
-        buildNavBarContent();
-        attachNavBarWindows();
-
-        // Try setting up the initial state of the nav bar if applicable.
-        if (result != null) {
-            setImeWindowStatus(Display.DEFAULT_DISPLAY, result.mImeToken,
-                    result.mImeWindowVis, result.mImeBackDisposition,
-                    result.mShowImeSwitcher);
-        }
-
-        // There has been a car customized nav bar on the default display, so just create nav bars
-        // on external displays.
-        mNavigationBarControllerLazy.get().createNavigationBars(/* includeDefaultDisplay= */ false,
-                result);
-    }
-
-    private void buildNavBarWindows() {
-        mTopNavigationBarWindow = mSuperStatusBarViewFactory
-                .getStatusBarWindowView()
-                .findViewById(R.id.car_top_navigation_bar_container);
-        mBottomNavigationBarWindow = mCarNavigationBarController.getBottomWindow();
-        mLeftNavigationBarWindow = mCarNavigationBarController.getLeftWindow();
-        mRightNavigationBarWindow = mCarNavigationBarController.getRightWindow();
-    }
-
-    private void buildNavBarContent() {
-        mTopNavigationBarView = mCarNavigationBarController.getTopBar(isDeviceSetupForUser());
-        if (mTopNavigationBarView != null) {
-            mTopNavigationBarWindow.addView(mTopNavigationBarView);
-        }
-
-        mBottomNavigationBarView = mCarNavigationBarController.getBottomBar(isDeviceSetupForUser());
-        if (mBottomNavigationBarView != null) {
-            mBottomNavigationBarWindow.addView(mBottomNavigationBarView);
-        }
-
-        mLeftNavigationBarView = mCarNavigationBarController.getLeftBar(isDeviceSetupForUser());
-        if (mLeftNavigationBarView != null) {
-            mLeftNavigationBarWindow.addView(mLeftNavigationBarView);
-        }
-
-        mRightNavigationBarView = mCarNavigationBarController.getRightBar(isDeviceSetupForUser());
-        if (mRightNavigationBarView != null) {
-            mRightNavigationBarWindow.addView(mRightNavigationBarView);
-        }
-    }
-
-    private void attachNavBarWindows() {
-        if (mBottomNavigationBarWindow != null && !mBottomNavBarVisible) {
-            mBottomNavBarVisible = true;
-
-            WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
-                    ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT,
-                    WindowManager.LayoutParams.TYPE_NAVIGATION_BAR,
-                    WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
-                            | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
-                            | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
-                            | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH,
-                    PixelFormat.TRANSLUCENT);
-            lp.setTitle("CarNavigationBar");
-            lp.windowAnimations = 0;
-            mWindowManager.addView(mBottomNavigationBarWindow, lp);
-        }
-
-        if (mLeftNavigationBarWindow != null) {
-            int width = mContext.getResources().getDimensionPixelSize(
-                    R.dimen.car_left_navigation_bar_width);
-            WindowManager.LayoutParams leftlp = new WindowManager.LayoutParams(
-                    width, ViewGroup.LayoutParams.MATCH_PARENT,
-                    WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL,
-                    WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
-                            | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
-                            | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
-                            | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH,
-                    PixelFormat.TRANSLUCENT);
-            leftlp.setTitle("LeftCarNavigationBar");
-            leftlp.windowAnimations = 0;
-            leftlp.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_IS_SCREEN_DECOR;
-            leftlp.gravity = Gravity.LEFT;
-            leftlp.setFitInsetsTypes(0 /* types */);
-            mWindowManager.addView(mLeftNavigationBarWindow, leftlp);
-        }
-        if (mRightNavigationBarWindow != null) {
-            int width = mContext.getResources().getDimensionPixelSize(
-                    R.dimen.car_right_navigation_bar_width);
-            WindowManager.LayoutParams rightlp = new WindowManager.LayoutParams(
-                    width, ViewGroup.LayoutParams.MATCH_PARENT,
-                    WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL,
-                    WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
-                            | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
-                            | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
-                            | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH,
-                    PixelFormat.TRANSLUCENT);
-            rightlp.setTitle("RightCarNavigationBar");
-            rightlp.windowAnimations = 0;
-            rightlp.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_IS_SCREEN_DECOR;
-            rightlp.gravity = Gravity.RIGHT;
-            rightlp.setFitInsetsTypes(0 /* types */);
-            mWindowManager.addView(mRightNavigationBarWindow, rightlp);
-        }
-    }
-
-    /**
-     * We register for soft keyboard visibility events such that we can hide the navigation bar
-     * giving more screen space to the IME. Note: this is optional and controlled by
-     * {@code com.android.internal.R.bool.config_automotiveHideNavBarForKeyboard}.
-     */
-    @Override
-    public void setImeWindowStatus(int displayId, IBinder token, int vis, int backDisposition,
-            boolean showImeSwitcher) {
-        if (!mHideNavBarForKeyboard) {
-            return;
-        }
-
-        if (mContext.getDisplay().getDisplayId() != displayId) {
-            return;
-        }
-
-        boolean isKeyboardVisible = (vis & InputMethodService.IME_VISIBLE) != 0;
-        mCarNavigationBarController.setBottomWindowVisibility(
-                isKeyboardVisible ? View.GONE : View.VISIBLE);
-    }
-
-    @Override
-    public void showTransient(int displayId, int[] types) {
-        if (displayId != mDisplayId) {
-            return;
-        }
-        if (!containsType(types, ITYPE_NAVIGATION_BAR)) {
-            return;
-        }
-
-        if (!mTransientShown) {
-            mTransientShown = true;
-            handleTransientChanged();
-        }
-    }
-
-    @Override
-    public void abortTransient(int displayId, int[] types) {
-        if (displayId != mDisplayId) {
-            return;
-        }
-        if (!containsType(types, ITYPE_NAVIGATION_BAR)) {
-            return;
-        }
-        clearTransient();
-    }
-
-    private void clearTransient() {
-        if (mTransientShown) {
-            mTransientShown = false;
-            handleTransientChanged();
-        }
-    }
-
-    @Override
-    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
-        pw.print("  mTaskStackListener=");
-        pw.println(mButtonSelectionStateListener);
-        pw.print("  mBottomNavigationBarView=");
-        pw.println(mBottomNavigationBarView);
-    }
-
-    private void handleTransientChanged() {
-        updateBarMode(mTransientShown ? MODE_SEMI_TRANSPARENT : MODE_TRANSPARENT);
-    }
-
-    // Returns true if the bar mode is changed.
-    private boolean updateBarMode(int barMode) {
-        if (mNavigationBarMode != barMode) {
-            mNavigationBarMode = barMode;
-            mAutoHideController.touchAutoHide();
-            return true;
-        }
-        return false;
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/navigationbar/car/CarNavigationBarController.java b/packages/CarSystemUI/src/com/android/systemui/navigationbar/car/CarNavigationBarController.java
deleted file mode 100644
index fbcd878..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/navigationbar/car/CarNavigationBarController.java
+++ /dev/null
@@ -1,328 +0,0 @@
-/*
- * Copyright (C) 2019 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.navigationbar.car;
-
-import android.content.Context;
-import android.view.View;
-import android.view.ViewGroup;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-import com.android.systemui.R;
-import com.android.systemui.navigationbar.car.hvac.HvacController;
-
-import javax.inject.Inject;
-import javax.inject.Singleton;
-
-import dagger.Lazy;
-
-/** A single class which controls the navigation bar views. */
-@Singleton
-public class CarNavigationBarController {
-
-    private final Context mContext;
-    private final NavigationBarViewFactory mNavigationBarViewFactory;
-    private final ButtonSelectionStateController mButtonSelectionStateController;
-    private final Lazy<HvacController> mHvacControllerLazy;
-
-    private boolean mShowBottom;
-    private boolean mShowLeft;
-    private boolean mShowRight;
-
-    private View.OnTouchListener mTopBarTouchListener;
-    private View.OnTouchListener mBottomBarTouchListener;
-    private View.OnTouchListener mLeftBarTouchListener;
-    private View.OnTouchListener mRightBarTouchListener;
-    private NotificationsShadeController mNotificationsShadeController;
-
-    private CarNavigationBarView mTopView;
-    private CarNavigationBarView mBottomView;
-    private CarNavigationBarView mLeftView;
-    private CarNavigationBarView mRightView;
-
-    @Inject
-    public CarNavigationBarController(Context context,
-            NavigationBarViewFactory navigationBarViewFactory,
-            ButtonSelectionStateController buttonSelectionStateController,
-            Lazy<HvacController> hvacControllerLazy) {
-        mContext = context;
-        mNavigationBarViewFactory = navigationBarViewFactory;
-        mButtonSelectionStateController = buttonSelectionStateController;
-        mHvacControllerLazy = hvacControllerLazy;
-
-        // Read configuration.
-        mShowBottom = mContext.getResources().getBoolean(R.bool.config_enableBottomNavigationBar);
-        mShowLeft = mContext.getResources().getBoolean(R.bool.config_enableLeftNavigationBar);
-        mShowRight = mContext.getResources().getBoolean(R.bool.config_enableRightNavigationBar);
-    }
-
-    /**
-     * Hides all navigation bars.
-     */
-    public void hideBars() {
-        if (mTopView != null) {
-            mTopView.setVisibility(View.GONE);
-        }
-        setBottomWindowVisibility(View.GONE);
-        setLeftWindowVisibility(View.GONE);
-        setRightWindowVisibility(View.GONE);
-    }
-
-    /**
-     * Shows all navigation bars.
-     */
-    public void showBars() {
-        if (mTopView != null) {
-            mTopView.setVisibility(View.VISIBLE);
-        }
-        setBottomWindowVisibility(View.VISIBLE);
-        setLeftWindowVisibility(View.VISIBLE);
-        setRightWindowVisibility(View.VISIBLE);
-    }
-
-    /** Connect to hvac service. */
-    public void connectToHvac() {
-        mHvacControllerLazy.get().connectToCarService();
-    }
-
-    /** Clean up hvac. */
-    public void removeAllFromHvac() {
-        mHvacControllerLazy.get().removeAllComponents();
-    }
-
-    /** Gets the bottom window if configured to do so. */
-    @Nullable
-    public ViewGroup getBottomWindow() {
-        return mShowBottom ? mNavigationBarViewFactory.getBottomWindow() : null;
-    }
-
-    /** Gets the left window if configured to do so. */
-    @Nullable
-    public ViewGroup getLeftWindow() {
-        return mShowLeft ? mNavigationBarViewFactory.getLeftWindow() : null;
-    }
-
-    /** Gets the right window if configured to do so. */
-    @Nullable
-    public ViewGroup getRightWindow() {
-        return mShowRight ? mNavigationBarViewFactory.getRightWindow() : null;
-    }
-
-    /** Toggles the bottom nav bar visibility. */
-    public boolean setBottomWindowVisibility(@View.Visibility int visibility) {
-        return setWindowVisibility(getBottomWindow(), visibility);
-    }
-
-    /** Toggles the left nav bar visibility. */
-    public boolean setLeftWindowVisibility(@View.Visibility int visibility) {
-        return setWindowVisibility(getLeftWindow(), visibility);
-    }
-
-    /** Toggles the right nav bar visibility. */
-    public boolean setRightWindowVisibility(@View.Visibility int visibility) {
-        return setWindowVisibility(getRightWindow(), visibility);
-    }
-
-    private boolean setWindowVisibility(ViewGroup window, @View.Visibility int visibility) {
-        if (window == null) {
-            return false;
-        }
-
-        if (window.getVisibility() == visibility) {
-            return false;
-        }
-
-        window.setVisibility(visibility);
-        return true;
-    }
-
-    /** Gets the top navigation bar with the appropriate listeners set. */
-    @NonNull
-    public CarNavigationBarView getTopBar(boolean isSetUp) {
-        mTopView = mNavigationBarViewFactory.getTopBar(isSetUp);
-        setupBar(mTopView, mTopBarTouchListener, mNotificationsShadeController);
-        return mTopView;
-    }
-
-    /** Gets the bottom navigation bar with the appropriate listeners set. */
-    @Nullable
-    public CarNavigationBarView getBottomBar(boolean isSetUp) {
-        if (!mShowBottom) {
-            return null;
-        }
-
-        mBottomView = mNavigationBarViewFactory.getBottomBar(isSetUp);
-        setupBar(mBottomView, mBottomBarTouchListener, mNotificationsShadeController);
-        return mBottomView;
-    }
-
-    /** Gets the left navigation bar with the appropriate listeners set. */
-    @Nullable
-    public CarNavigationBarView getLeftBar(boolean isSetUp) {
-        if (!mShowLeft) {
-            return null;
-        }
-
-        mLeftView = mNavigationBarViewFactory.getLeftBar(isSetUp);
-        setupBar(mLeftView, mLeftBarTouchListener, mNotificationsShadeController);
-        return mLeftView;
-    }
-
-    /** Gets the right navigation bar with the appropriate listeners set. */
-    @Nullable
-    public CarNavigationBarView getRightBar(boolean isSetUp) {
-        if (!mShowRight) {
-            return null;
-        }
-
-        mRightView = mNavigationBarViewFactory.getRightBar(isSetUp);
-        setupBar(mRightView, mRightBarTouchListener, mNotificationsShadeController);
-        return mRightView;
-    }
-
-    private void setupBar(CarNavigationBarView view, View.OnTouchListener statusBarTouchListener,
-            NotificationsShadeController notifShadeController) {
-        view.setStatusBarWindowTouchListener(statusBarTouchListener);
-        view.setNotificationsPanelController(notifShadeController);
-        mButtonSelectionStateController.addAllButtonsWithSelectionState(view);
-        mHvacControllerLazy.get().addTemperatureViewToController(view);
-    }
-
-    /** Sets a touch listener for the top navigation bar. */
-    public void registerTopBarTouchListener(View.OnTouchListener listener) {
-        mTopBarTouchListener = listener;
-        if (mTopView != null) {
-            mTopView.setStatusBarWindowTouchListener(mTopBarTouchListener);
-        }
-    }
-
-    /** Sets a touch listener for the bottom navigation bar. */
-    public void registerBottomBarTouchListener(View.OnTouchListener listener) {
-        mBottomBarTouchListener = listener;
-        if (mBottomView != null) {
-            mBottomView.setStatusBarWindowTouchListener(mBottomBarTouchListener);
-        }
-    }
-
-    /** Sets a touch listener for the left navigation bar. */
-    public void registerLeftBarTouchListener(View.OnTouchListener listener) {
-        mLeftBarTouchListener = listener;
-        if (mLeftView != null) {
-            mLeftView.setStatusBarWindowTouchListener(mLeftBarTouchListener);
-        }
-    }
-
-    /** Sets a touch listener for the right navigation bar. */
-    public void registerRightBarTouchListener(View.OnTouchListener listener) {
-        mRightBarTouchListener = listener;
-        if (mRightView != null) {
-            mRightView.setStatusBarWindowTouchListener(mRightBarTouchListener);
-        }
-    }
-
-    /** Sets a notification controller which toggles the notification panel. */
-    public void registerNotificationController(
-            NotificationsShadeController notificationsShadeController) {
-        mNotificationsShadeController = notificationsShadeController;
-        if (mTopView != null) {
-            mTopView.setNotificationsPanelController(mNotificationsShadeController);
-        }
-        if (mBottomView != null) {
-            mBottomView.setNotificationsPanelController(mNotificationsShadeController);
-        }
-        if (mLeftView != null) {
-            mLeftView.setNotificationsPanelController(mNotificationsShadeController);
-        }
-        if (mRightView != null) {
-            mRightView.setNotificationsPanelController(mNotificationsShadeController);
-        }
-    }
-
-    /**
-     * Shows all of the keyguard specific buttons on the valid instances of
-     * {@link CarNavigationBarView}.
-     */
-    public void showAllKeyguardButtons(boolean isSetUp) {
-        checkAllBars(isSetUp);
-        if (mTopView != null) {
-            mTopView.showKeyguardButtons();
-        }
-        if (mBottomView != null) {
-            mBottomView.showKeyguardButtons();
-        }
-        if (mLeftView != null) {
-            mLeftView.showKeyguardButtons();
-        }
-        if (mRightView != null) {
-            mRightView.showKeyguardButtons();
-        }
-    }
-
-    /**
-     * Hides all of the keyguard specific buttons on the valid instances of
-     * {@link CarNavigationBarView}.
-     */
-    public void hideAllKeyguardButtons(boolean isSetUp) {
-        checkAllBars(isSetUp);
-        if (mTopView != null) {
-            mTopView.hideKeyguardButtons();
-        }
-        if (mBottomView != null) {
-            mBottomView.hideKeyguardButtons();
-        }
-        if (mLeftView != null) {
-            mLeftView.hideKeyguardButtons();
-        }
-        if (mRightView != null) {
-            mRightView.hideKeyguardButtons();
-        }
-    }
-
-    /** Toggles whether the notifications icon has an unseen indicator or not. */
-    public void toggleAllNotificationsUnseenIndicator(boolean isSetUp, boolean hasUnseen) {
-        checkAllBars(isSetUp);
-        if (mTopView != null) {
-            mTopView.toggleNotificationUnseenIndicator(hasUnseen);
-        }
-        if (mBottomView != null) {
-            mBottomView.toggleNotificationUnseenIndicator(hasUnseen);
-        }
-        if (mLeftView != null) {
-            mLeftView.toggleNotificationUnseenIndicator(hasUnseen);
-        }
-        if (mRightView != null) {
-            mRightView.toggleNotificationUnseenIndicator(hasUnseen);
-        }
-    }
-
-    /** Interface for controlling the notifications shade. */
-    public interface NotificationsShadeController {
-        /** Toggles the visibility of the notifications shade. */
-        void togglePanel();
-
-        /** Returns {@code true} if the panel is open. */
-        boolean isNotificationPanelOpen();
-    }
-
-    private void checkAllBars(boolean isSetUp) {
-        mTopView = getTopBar(isSetUp);
-        mBottomView = getBottomBar(isSetUp);
-        mLeftView = getLeftBar(isSetUp);
-        mRightView = getRightBar(isSetUp);
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/navigationbar/car/CarNavigationBarView.java b/packages/CarSystemUI/src/com/android/systemui/navigationbar/car/CarNavigationBarView.java
deleted file mode 100644
index 5b99f53..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/navigationbar/car/CarNavigationBarView.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- * Copyright (C) 2019 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.navigationbar.car;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.view.MotionEvent;
-import android.view.View;
-import android.widget.LinearLayout;
-
-import com.android.systemui.Dependency;
-import com.android.systemui.R;
-import com.android.systemui.navigationbar.car.CarNavigationBarController.NotificationsShadeController;
-import com.android.systemui.statusbar.CommandQueue;
-import com.android.systemui.statusbar.phone.StatusBarIconController;
-
-/**
- * A custom navigation bar for the automotive use case.
- * <p>
- * The navigation bar in the automotive use case is more like a list of shortcuts, rendered
- * in a linear layout.
- */
-public class CarNavigationBarView extends LinearLayout {
-    private final boolean mConsumeTouchWhenPanelOpen;
-
-    private View mNavButtons;
-    private CarNavigationButton mNotificationsButton;
-    private NotificationsShadeController mNotificationsShadeController;
-    private View mLockScreenButtons;
-    // used to wire in open/close gestures for notifications
-    private OnTouchListener mStatusBarWindowTouchListener;
-
-
-    public CarNavigationBarView(Context context, AttributeSet attrs) {
-        super(context, attrs);
-        mConsumeTouchWhenPanelOpen = getResources().getBoolean(
-                R.bool.config_consumeNavigationBarTouchWhenNotificationPanelOpen);
-    }
-
-    @Override
-    public void onFinishInflate() {
-        mNavButtons = findViewById(R.id.nav_buttons);
-        mLockScreenButtons = findViewById(R.id.lock_screen_nav_buttons);
-
-        mNotificationsButton = findViewById(R.id.notifications);
-        if (mNotificationsButton != null) {
-            mNotificationsButton.setOnClickListener(this::onNotificationsClick);
-        }
-        View mStatusIcons = findViewById(R.id.statusIcons);
-        if (mStatusIcons != null) {
-            // Attach the controllers for Status icons such as wifi and bluetooth if the standard
-            // container is in the view.
-            StatusBarIconController.DarkIconManager mDarkIconManager =
-                    new StatusBarIconController.DarkIconManager(
-                            mStatusIcons.findViewById(R.id.statusIcons),
-                            Dependency.get(CommandQueue.class));
-            mDarkIconManager.setShouldLog(true);
-            Dependency.get(StatusBarIconController.class).addIconGroup(mDarkIconManager);
-        }
-        // needs to be clickable so that it will receive ACTION_MOVE events
-        setClickable(true);
-    }
-
-    // Used to forward touch events even if the touch was initiated from a child component
-    @Override
-    public boolean onInterceptTouchEvent(MotionEvent ev) {
-        if (mStatusBarWindowTouchListener != null) {
-            boolean shouldConsumeEvent = mNotificationsShadeController == null ? false
-                    : mNotificationsShadeController.isNotificationPanelOpen();
-
-            // Forward touch events to the status bar window so it can drag
-            // windows if required (Notification shade)
-            mStatusBarWindowTouchListener.onTouch(this, ev);
-
-            if (mConsumeTouchWhenPanelOpen && shouldConsumeEvent) {
-                return true;
-            }
-        }
-        return super.onInterceptTouchEvent(ev);
-    }
-
-    /** Sets the notifications panel controller. */
-    public void setNotificationsPanelController(NotificationsShadeController controller) {
-        mNotificationsShadeController = controller;
-    }
-
-    /** Gets the notifications panel controller. */
-    public NotificationsShadeController getNotificationsPanelController() {
-        return mNotificationsShadeController;
-    }
-
-    /**
-     * Sets a touch listener that will be called from onInterceptTouchEvent and onTouchEvent
-     *
-     * @param statusBarWindowTouchListener The listener to call from touch and intercept touch
-     */
-    public void setStatusBarWindowTouchListener(OnTouchListener statusBarWindowTouchListener) {
-        mStatusBarWindowTouchListener = statusBarWindowTouchListener;
-    }
-
-    /** Gets the touch listener that will be called from onInterceptTouchEvent and onTouchEvent. */
-    public OnTouchListener getStatusBarWindowTouchListener() {
-        return mStatusBarWindowTouchListener;
-    }
-
-    @Override
-    public boolean onTouchEvent(MotionEvent event) {
-        if (mStatusBarWindowTouchListener != null) {
-            mStatusBarWindowTouchListener.onTouch(this, event);
-        }
-        return super.onTouchEvent(event);
-    }
-
-    protected void onNotificationsClick(View v) {
-        if (mNotificationsShadeController != null) {
-            mNotificationsShadeController.togglePanel();
-        }
-    }
-
-    /**
-     * If there are buttons declared in the layout they will be shown and the normal
-     * Nav buttons will be hidden.
-     */
-    public void showKeyguardButtons() {
-        if (mLockScreenButtons == null) {
-            return;
-        }
-        mLockScreenButtons.setVisibility(View.VISIBLE);
-        mNavButtons.setVisibility(View.GONE);
-    }
-
-    /**
-     * If there are buttons declared in the layout they will be hidden and the normal
-     * Nav buttons will be shown.
-     */
-    public void hideKeyguardButtons() {
-        if (mLockScreenButtons == null) return;
-
-        mNavButtons.setVisibility(View.VISIBLE);
-        mLockScreenButtons.setVisibility(View.GONE);
-    }
-
-    /**
-     * Toggles the notification unseen indicator on/off.
-     *
-     * @param hasUnseen true if the unseen notification count is great than 0.
-     */
-    public void toggleNotificationUnseenIndicator(Boolean hasUnseen) {
-        if (mNotificationsButton == null) return;
-
-        mNotificationsButton.setUnseen(hasUnseen);
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/navigationbar/car/CarNavigationButton.java b/packages/CarSystemUI/src/com/android/systemui/navigationbar/car/CarNavigationButton.java
deleted file mode 100644
index b4d4785..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/navigationbar/car/CarNavigationButton.java
+++ /dev/null
@@ -1,284 +0,0 @@
-/*
- * Copyright (C) 2019 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.navigationbar.car;
-
-import android.app.ActivityOptions;
-import android.content.Context;
-import android.content.Intent;
-import android.content.res.TypedArray;
-import android.os.Build;
-import android.os.UserHandle;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.view.Display;
-import android.view.View;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
-
-import com.android.keyguard.AlphaOptimizedImageButton;
-import com.android.systemui.R;
-
-import java.net.URISyntaxException;
-
-/**
- * CarNavigationButton is an image button that allows for a bit more configuration at the
- * xml file level. This allows for more control via overlays instead of having to update
- * code.
- */
-public class CarNavigationButton extends LinearLayout {
-
-    protected static final float DEFAULT_SELECTED_ALPHA = 1f;
-    protected static final float DEFAULT_UNSELECTED_ALPHA = 0.75f;
-
-    private static final String TAG = "CarNavigationButton";
-    private static final String BUTTON_FILTER_DELIMITER = ";";
-    private static final String EXTRA_BUTTON_CATEGORIES = "categories";
-    private static final String EXTRA_BUTTON_PACKAGES = "packages";
-
-    private Context mContext;
-    private AlphaOptimizedImageButton mIcon;
-    private AlphaOptimizedImageButton mMoreIcon;
-    private ImageView mUnseenIcon;
-    private String mIntent;
-    private String mLongIntent;
-    private boolean mBroadcastIntent;
-    private boolean mHasUnseen = false;
-    private boolean mSelected = false;
-    private float mSelectedAlpha;
-    private float mUnselectedAlpha;
-    private int mSelectedIconResourceId;
-    private int mIconResourceId;
-    private String[] mComponentNames;
-    /** App categories that are to be used with this widget */
-    private String[] mButtonCategories;
-    /** App packages that are allowed to be used with this widget */
-    private String[] mButtonPackages;
-    /** Whether to display more icon beneath the primary icon when the button is selected */
-    private boolean mShowMoreWhenSelected = false;
-    /** Whether to highlight the button if the active application is associated with it */
-    private boolean mHighlightWhenSelected = false;
-
-    public CarNavigationButton(Context context, AttributeSet attrs) {
-        super(context, attrs);
-        mContext = context;
-        View.inflate(mContext, R.layout.car_navigation_button, /* root= */ this);
-        // CarNavigationButton attrs
-        TypedArray typedArray = context.obtainStyledAttributes(attrs,
-                R.styleable.CarNavigationButton);
-
-        setUpIntents(typedArray);
-        setUpIcons(typedArray);
-        typedArray.recycle();
-    }
-
-    /**
-     * @param selected true if should indicate if this is a selected state, false otherwise
-     */
-    public void setSelected(boolean selected) {
-        super.setSelected(selected);
-        mSelected = selected;
-        if (mHighlightWhenSelected) {
-            setAlpha(mSelected ? mSelectedAlpha : mUnselectedAlpha);
-        }
-        if (mShowMoreWhenSelected && mMoreIcon != null) {
-            mMoreIcon.setVisibility(selected ? VISIBLE : GONE);
-        }
-        updateImage();
-    }
-
-    /**
-     * @param hasUnseen true if should indicate if this is a Unseen state, false otherwise.
-     */
-    public void setUnseen(boolean hasUnseen) {
-        mHasUnseen = hasUnseen;
-        updateImage();
-    }
-
-    /** Gets whether the icon is in an unseen state. */
-    public boolean getUnseen() {
-        return mHasUnseen;
-    }
-
-    /**
-     * @return The app categories the component represents
-     */
-    public String[] getCategories() {
-        if (mButtonCategories == null) {
-            return new String[0];
-        }
-        return mButtonCategories;
-    }
-
-    /**
-     * @return The valid packages that should be considered.
-     */
-    public String[] getPackages() {
-        if (mButtonPackages == null) {
-            return new String[0];
-        }
-        return mButtonPackages;
-    }
-
-    /**
-     * @return The list of component names.
-     */
-    public String[] getComponentName() {
-        if (mComponentNames == null) {
-            return new String[0];
-        }
-        return mComponentNames;
-    }
-
-    /**
-     * @return The id of the display the button is on or Display.INVALID_DISPLAY if it's not yet on
-     * a display.
-     */
-    protected int getDisplayId() {
-        Display display = getDisplay();
-        if (display == null) {
-            return Display.INVALID_DISPLAY;
-        }
-        return display.getDisplayId();
-    }
-
-    protected boolean hasSelectionState() {
-        return mHighlightWhenSelected || mShowMoreWhenSelected;
-    }
-
-    /**
-     * Sets up intents for click, long touch, and broadcast.
-     */
-    protected void setUpIntents(TypedArray typedArray) {
-        mIntent = typedArray.getString(R.styleable.CarNavigationButton_intent);
-        mLongIntent = typedArray.getString(R.styleable.CarNavigationButton_longIntent);
-        mBroadcastIntent = typedArray.getBoolean(R.styleable.CarNavigationButton_broadcast, false);
-
-        String categoryString = typedArray.getString(R.styleable.CarNavigationButton_categories);
-        String packageString = typedArray.getString(R.styleable.CarNavigationButton_packages);
-        String componentNameString =
-                typedArray.getString(R.styleable.CarNavigationButton_componentNames);
-
-        try {
-            if (mIntent != null) {
-                final Intent intent = Intent.parseUri(mIntent, Intent.URI_INTENT_SCHEME);
-                setOnClickListener(getButtonClickListener(intent));
-                if (packageString != null) {
-                    mButtonPackages = packageString.split(BUTTON_FILTER_DELIMITER);
-                    intent.putExtra(EXTRA_BUTTON_PACKAGES, mButtonPackages);
-                }
-                if (categoryString != null) {
-                    mButtonCategories = categoryString.split(BUTTON_FILTER_DELIMITER);
-                    intent.putExtra(EXTRA_BUTTON_CATEGORIES, mButtonCategories);
-                }
-                if (componentNameString != null) {
-                    mComponentNames = componentNameString.split(BUTTON_FILTER_DELIMITER);
-                }
-            }
-        } catch (URISyntaxException e) {
-            throw new RuntimeException("Failed to attach intent", e);
-        }
-
-        try {
-            if (mLongIntent != null && (Build.IS_ENG || Build.IS_USERDEBUG)) {
-                final Intent intent = Intent.parseUri(mLongIntent, Intent.URI_INTENT_SCHEME);
-                setOnLongClickListener(getButtonLongClickListener(intent));
-            }
-        } catch (URISyntaxException e) {
-            throw new RuntimeException("Failed to attach long press intent", e);
-        }
-    }
-
-    /** Defines the behavior of a button click. */
-    protected OnClickListener getButtonClickListener(Intent toSend) {
-        return v -> {
-            mContext.sendBroadcastAsUser(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS),
-                    UserHandle.CURRENT);
-            try {
-                if (mBroadcastIntent) {
-                    mContext.sendBroadcastAsUser(toSend, UserHandle.CURRENT);
-                    return;
-                }
-                ActivityOptions options = ActivityOptions.makeBasic();
-                options.setLaunchDisplayId(mContext.getDisplayId());
-                mContext.startActivityAsUser(toSend, options.toBundle(),
-                        UserHandle.CURRENT);
-            } catch (Exception e) {
-                Log.e(TAG, "Failed to launch intent", e);
-            }
-        };
-    }
-
-    /** Defines the behavior of a long click. */
-    protected OnLongClickListener getButtonLongClickListener(Intent toSend) {
-        return v -> {
-            mContext.sendBroadcastAsUser(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS),
-                    UserHandle.CURRENT);
-            try {
-                ActivityOptions options = ActivityOptions.makeBasic();
-                options.setLaunchDisplayId(mContext.getDisplayId());
-                mContext.startActivityAsUser(toSend, options.toBundle(),
-                        UserHandle.CURRENT);
-            } catch (Exception e) {
-                Log.e(TAG, "Failed to launch intent", e);
-            }
-            // consume event either way
-            return true;
-        };
-    }
-
-
-    /**
-     * Initializes view-related aspects of the button.
-     */
-    private void setUpIcons(TypedArray typedArray) {
-        mSelectedAlpha = typedArray.getFloat(
-                R.styleable.CarNavigationButton_selectedAlpha, DEFAULT_SELECTED_ALPHA);
-        mUnselectedAlpha = typedArray.getFloat(
-                R.styleable.CarNavigationButton_unselectedAlpha, DEFAULT_UNSELECTED_ALPHA);
-        mHighlightWhenSelected = typedArray.getBoolean(
-                R.styleable.CarNavigationButton_highlightWhenSelected,
-                mHighlightWhenSelected);
-        mShowMoreWhenSelected = typedArray.getBoolean(
-                R.styleable.CarNavigationButton_showMoreWhenSelected,
-                mShowMoreWhenSelected);
-
-        mSelectedIconResourceId = typedArray.getResourceId(
-                R.styleable.CarNavigationButton_selectedIcon, mIconResourceId);
-        mIconResourceId = typedArray.getResourceId(
-                R.styleable.CarNavigationButton_icon, 0);
-
-        mIcon = findViewById(R.id.car_nav_button_icon_image);
-        mIcon.setScaleType(ImageView.ScaleType.CENTER);
-        // Always apply selected alpha if the button does not toggle alpha based on selection state.
-        mIcon.setAlpha(mHighlightWhenSelected ? mUnselectedAlpha : mSelectedAlpha);
-        mIcon.setImageResource(mIconResourceId);
-
-        mMoreIcon = findViewById(R.id.car_nav_button_more_icon);
-        mMoreIcon.setAlpha(mSelectedAlpha);
-        mMoreIcon.setVisibility(GONE);
-
-        mUnseenIcon = findViewById(R.id.car_nav_button_unseen_icon);
-
-        mUnseenIcon.setVisibility(mHasUnseen ? VISIBLE : GONE);
-    }
-
-    private void updateImage() {
-        mIcon.setImageResource(mSelected ? mSelectedIconResourceId : mIconResourceId);
-        mUnseenIcon.setVisibility(mHasUnseen ? VISIBLE : GONE);
-    }
-
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/navigationbar/car/NavigationBarViewFactory.java b/packages/CarSystemUI/src/com/android/systemui/navigationbar/car/NavigationBarViewFactory.java
deleted file mode 100644
index 519b33a2..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/navigationbar/car/NavigationBarViewFactory.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Copyright (C) 2019 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.navigationbar.car;
-
-import android.content.Context;
-import android.util.ArrayMap;
-import android.util.Log;
-import android.view.View;
-import android.view.ViewGroup;
-
-import androidx.annotation.LayoutRes;
-
-import com.android.systemui.R;
-
-import javax.inject.Inject;
-import javax.inject.Singleton;
-
-/** A factory that creates and caches views for navigation bars. */
-@Singleton
-public class NavigationBarViewFactory {
-
-    private static final String TAG = NavigationBarViewFactory.class.getSimpleName();
-    private static final ArrayMap<Type, Integer> sLayoutMap = setupLayoutMapping();
-
-    private static ArrayMap<Type, Integer> setupLayoutMapping() {
-        ArrayMap<Type, Integer> map = new ArrayMap<>();
-        map.put(Type.TOP, R.layout.car_top_navigation_bar);
-        map.put(Type.TOP_UNPROVISIONED, R.layout.car_top_navigation_bar_unprovisioned);
-        map.put(Type.BOTTOM, R.layout.car_navigation_bar);
-        map.put(Type.BOTTOM_UNPROVISIONED, R.layout.car_navigation_bar_unprovisioned);
-        map.put(Type.LEFT, R.layout.car_left_navigation_bar);
-        map.put(Type.LEFT_UNPROVISIONED, R.layout.car_left_navigation_bar_unprovisioned);
-        map.put(Type.RIGHT, R.layout.car_right_navigation_bar);
-        map.put(Type.RIGHT_UNPROVISIONED, R.layout.car_right_navigation_bar_unprovisioned);
-        return map;
-    }
-
-    private final Context mContext;
-    private final ArrayMap<Type, CarNavigationBarView> mCachedViewMap = new ArrayMap<>(
-            Type.values().length);
-    private final ArrayMap<Type, ViewGroup> mCachedContainerMap = new ArrayMap<>();
-
-    /** Type of navigation bar to be created. */
-    private enum Type {
-        TOP,
-        TOP_UNPROVISIONED,
-        BOTTOM,
-        BOTTOM_UNPROVISIONED,
-        LEFT,
-        LEFT_UNPROVISIONED,
-        RIGHT,
-        RIGHT_UNPROVISIONED
-    }
-
-    @Inject
-    public NavigationBarViewFactory(Context context) {
-        mContext = context;
-    }
-
-    /** Gets the bottom window. */
-    public ViewGroup getBottomWindow() {
-        return getWindowCached(Type.BOTTOM);
-    }
-
-    /** Gets the left window. */
-    public ViewGroup getLeftWindow() {
-        return getWindowCached(Type.LEFT);
-    }
-
-    /** Gets the right window. */
-    public ViewGroup getRightWindow() {
-        return getWindowCached(Type.RIGHT);
-    }
-
-    /** Gets the top bar. */
-    public CarNavigationBarView getTopBar(boolean isSetUp) {
-        return getBar(isSetUp, Type.TOP, Type.TOP_UNPROVISIONED);
-    }
-
-    /** Gets the bottom bar. */
-    public CarNavigationBarView getBottomBar(boolean isSetUp) {
-        return getBar(isSetUp, Type.BOTTOM, Type.BOTTOM_UNPROVISIONED);
-    }
-
-    /** Gets the left bar. */
-    public CarNavigationBarView getLeftBar(boolean isSetUp) {
-        return getBar(isSetUp, Type.LEFT, Type.LEFT_UNPROVISIONED);
-    }
-
-    /** Gets the right bar. */
-    public CarNavigationBarView getRightBar(boolean isSetUp) {
-        return getBar(isSetUp, Type.RIGHT, Type.RIGHT_UNPROVISIONED);
-    }
-
-    private ViewGroup getWindowCached(Type type) {
-        if (mCachedContainerMap.containsKey(type)) {
-            return mCachedContainerMap.get(type);
-        }
-
-        ViewGroup window = (ViewGroup) View.inflate(mContext,
-                R.layout.navigation_bar_window, /* root= */ null);
-        mCachedContainerMap.put(type, window);
-        return mCachedContainerMap.get(type);
-    }
-
-    private CarNavigationBarView getBar(boolean isSetUp, Type provisioned, Type unprovisioned) {
-        CarNavigationBarView view;
-        if (isSetUp) {
-            view = getBarCached(provisioned, sLayoutMap.get(provisioned));
-        } else {
-            view = getBarCached(unprovisioned, sLayoutMap.get(unprovisioned));
-        }
-
-        if (view == null) {
-            String name = isSetUp ? provisioned.name() : unprovisioned.name();
-            Log.e(TAG, "CarStatusBar failed inflate for " + name);
-            throw new RuntimeException(
-                    "Unable to build " + name + " nav bar due to missing layout");
-        }
-        return view;
-    }
-
-    private CarNavigationBarView getBarCached(Type type, @LayoutRes int barLayout) {
-        if (mCachedViewMap.containsKey(type)) {
-            return mCachedViewMap.get(type);
-        }
-
-        CarNavigationBarView view = (CarNavigationBarView) View.inflate(mContext, barLayout,
-                /* root= */ null);
-        mCachedViewMap.put(type, view);
-        return mCachedViewMap.get(type);
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/navigationbar/car/hvac/HvacController.java b/packages/CarSystemUI/src/com/android/systemui/navigationbar/car/hvac/HvacController.java
deleted file mode 100644
index fd9c488..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/navigationbar/car/hvac/HvacController.java
+++ /dev/null
@@ -1,221 +0,0 @@
-/*
- * Copyright (C) 2019 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.navigationbar.car.hvac;
-
-import static android.car.VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL;
-import static android.car.VehiclePropertyIds.HVAC_TEMPERATURE_DISPLAY_UNITS;
-
-import android.car.Car;
-import android.car.VehicleUnit;
-import android.car.hardware.CarPropertyValue;
-import android.car.hardware.hvac.CarHvacManager;
-import android.car.hardware.hvac.CarHvacManager.CarHvacEventCallback;
-import android.util.Log;
-import android.view.View;
-import android.view.ViewGroup;
-
-import com.android.systemui.car.CarServiceProvider;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
-
-import javax.inject.Inject;
-import javax.inject.Singleton;
-
-/**
- * Manages the connection to the Car service and delegates value changes to the registered
- * {@link TemperatureView}s
- */
-@Singleton
-public class HvacController {
-    public static final String TAG = "HvacController";
-
-    private final CarServiceProvider mCarServiceProvider;
-    private final Set<TemperatureView> mRegisteredViews = new HashSet<>();
-
-    private CarHvacManager mHvacManager;
-    private HashMap<HvacKey, List<TemperatureView>> mTempComponents = new HashMap<>();
-
-    /**
-     * Callback for getting changes from {@link CarHvacManager} and setting the UI elements to
-     * match.
-     */
-    private final CarHvacEventCallback mHardwareCallback = new CarHvacEventCallback() {
-        @Override
-        public void onChangeEvent(final CarPropertyValue val) {
-            try {
-                int areaId = val.getAreaId();
-                int propertyId = val.getPropertyId();
-                List<TemperatureView> temperatureViews = mTempComponents.get(
-                        new HvacKey(propertyId, areaId));
-                if (temperatureViews != null && !temperatureViews.isEmpty()) {
-                    float value = (float) val.getValue();
-                    for (TemperatureView tempView : temperatureViews) {
-                        tempView.setTemp(value);
-                    }
-                } // else the data is not of interest
-            } catch (Exception e) {
-                // catch all so we don't take down the sysui if a new data type is
-                // introduced.
-                Log.e(TAG, "Failed handling hvac change event", e);
-            }
-        }
-
-        @Override
-        public void onErrorEvent(final int propertyId, final int zone) {
-            Log.d(TAG, "HVAC error event, propertyId: " + propertyId
-                    + " zone: " + zone);
-        }
-    };
-
-    private final CarServiceProvider.CarServiceOnConnectedListener mCarServiceLifecycleListener =
-            car -> {
-                try {
-                    mHvacManager = (CarHvacManager) car.getCarManager(Car.HVAC_SERVICE);
-                    mHvacManager.registerCallback(mHardwareCallback);
-                    initComponents();
-                } catch (Exception e) {
-                    Log.e(TAG, "Failed to correctly connect to HVAC", e);
-                }
-            };
-
-    @Inject
-    public HvacController(CarServiceProvider carServiceProvider) {
-        mCarServiceProvider = carServiceProvider;
-    }
-
-    /**
-     * Create connection to the Car service. Note: call backs from the Car service
-     * ({@link CarHvacManager}) will happen on the same thread this method was called from.
-     */
-    public void connectToCarService() {
-        mCarServiceProvider.addListener(mCarServiceLifecycleListener);
-    }
-
-    /**
-     * Add component to list and initialize it if the connection is up.
-     */
-    private void addHvacTextView(TemperatureView temperatureView) {
-        if (mRegisteredViews.contains(temperatureView)) {
-            return;
-        }
-
-        HvacKey hvacKey = new HvacKey(temperatureView.getPropertyId(), temperatureView.getAreaId());
-        if (!mTempComponents.containsKey(hvacKey)) {
-            mTempComponents.put(hvacKey, new ArrayList<>());
-        }
-        mTempComponents.get(hvacKey).add(temperatureView);
-        initComponent(temperatureView);
-
-        mRegisteredViews.add(temperatureView);
-    }
-
-    private void initComponents() {
-        Iterator<Map.Entry<HvacKey, List<TemperatureView>>> iterator =
-                mTempComponents.entrySet().iterator();
-        while (iterator.hasNext()) {
-            Map.Entry<HvacKey, List<TemperatureView>> next = iterator.next();
-            List<TemperatureView> temperatureViews = next.getValue();
-            for (TemperatureView view : temperatureViews) {
-                initComponent(view);
-            }
-        }
-    }
-
-    private void initComponent(TemperatureView view) {
-        int id = view.getPropertyId();
-        int zone = view.getAreaId();
-
-        try {
-            if (mHvacManager != null
-                    && mHvacManager.isPropertyAvailable(HVAC_TEMPERATURE_DISPLAY_UNITS,
-                            VEHICLE_AREA_TYPE_GLOBAL)) {
-                if (mHvacManager.getIntProperty(HVAC_TEMPERATURE_DISPLAY_UNITS,
-                        VEHICLE_AREA_TYPE_GLOBAL) == VehicleUnit.FAHRENHEIT) {
-                    view.setDisplayInFahrenheit(true);
-                }
-
-            }
-            if (mHvacManager == null || !mHvacManager.isPropertyAvailable(id, zone)) {
-                view.setTemp(Float.NaN);
-                return;
-            }
-            view.setTemp(mHvacManager.getFloatProperty(id, zone));
-        } catch (Exception e) {
-            view.setTemp(Float.NaN);
-            Log.e(TAG, "Failed to get value from hvac service", e);
-        }
-    }
-
-    /**
-     * Removes all registered components. This is useful if you need to rebuild the UI since
-     * components self register.
-     */
-    public void removeAllComponents() {
-        mTempComponents.clear();
-        mRegisteredViews.clear();
-    }
-
-    /**
-     * Iterate through a view, looking for {@link TemperatureView} instances and add them to the
-     * controller if found.
-     */
-    public void addTemperatureViewToController(View v) {
-        if (v instanceof TemperatureView) {
-            addHvacTextView((TemperatureView) v);
-        } else if (v instanceof ViewGroup) {
-            ViewGroup viewGroup = (ViewGroup) v;
-            for (int i = 0; i < viewGroup.getChildCount(); i++) {
-                addTemperatureViewToController(viewGroup.getChildAt(i));
-            }
-        }
-    }
-
-    /**
-     * Key for storing {@link TemperatureView}s in a hash map
-     */
-    private static class HvacKey {
-
-        int mPropertyId;
-        int mAreaId;
-
-        private HvacKey(int propertyId, int areaId) {
-            mPropertyId = propertyId;
-            mAreaId = areaId;
-        }
-
-        @Override
-        public boolean equals(Object o) {
-            if (this == o) return true;
-            if (o == null || getClass() != o.getClass()) return false;
-            HvacKey hvacKey = (HvacKey) o;
-            return mPropertyId == hvacKey.mPropertyId
-                    && mAreaId == hvacKey.mAreaId;
-        }
-
-        @Override
-        public int hashCode() {
-            return Objects.hash(mPropertyId, mAreaId);
-        }
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/navigationbar/car/hvac/TemperatureTextView.java b/packages/CarSystemUI/src/com/android/systemui/navigationbar/car/hvac/TemperatureTextView.java
deleted file mode 100644
index ad4fcd9..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/navigationbar/car/hvac/TemperatureTextView.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Copyright (C) 2019 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.navigationbar.car.hvac;
-
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.util.AttributeSet;
-import android.widget.TextView;
-
-import com.android.systemui.R;
-
-/**
- * Simple text display of HVAC properties, It is designed to show temperature and is configured in
- * the XML.
- * XML properties:
- * hvacPropertyId - Example: CarHvacManager.ID_ZONED_TEMP_SETPOINT (16385)
- * hvacAreaId - Example: VehicleSeat.SEAT_ROW_1_LEFT (1)
- * hvacTempFormat - Example: "%.1f\u00B0" (1 decimal and the degree symbol)
- */
-public class TemperatureTextView extends TextView implements TemperatureView {
-
-    private final int mAreaId;
-    private final int mPropertyId;
-    private final String mTempFormat;
-    private boolean mDisplayFahrenheit = false;
-
-    public TemperatureTextView(Context context, AttributeSet attrs) {
-        super(context, attrs);
-        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.TemperatureView);
-        mAreaId = typedArray.getInt(R.styleable.TemperatureView_hvacAreaId, -1);
-        mPropertyId = typedArray.getInt(R.styleable.TemperatureView_hvacPropertyId, -1);
-        String format = typedArray.getString(R.styleable.TemperatureView_hvacTempFormat);
-        mTempFormat = (format == null) ? "%.1f\u00B0" : format;
-    }
-
-    /**
-     * Formats the float for display
-     *
-     * @param temp - The current temp or NaN
-     */
-    @Override
-    public void setTemp(float temp) {
-        if (Float.isNaN(temp)) {
-            setText("--");
-            return;
-        }
-        if (mDisplayFahrenheit) {
-            temp = convertToFahrenheit(temp);
-        }
-        setText(String.format(mTempFormat, temp));
-    }
-
-    @Override
-    public void setDisplayInFahrenheit(boolean displayFahrenheit) {
-        mDisplayFahrenheit = displayFahrenheit;
-    }
-
-    /**
-     * @return propertiyId  Example: CarHvacManager.ID_ZONED_TEMP_SETPOINT (16385)
-     */
-    @Override
-    public int getPropertyId() {
-        return mPropertyId;
-    }
-
-    /**
-     * @return hvac AreaId - Example: VehicleSeat.SEAT_ROW_1_LEFT (1)
-     */
-    @Override
-    public int getAreaId() {
-        return mAreaId;
-    }
-}
-
diff --git a/packages/CarSystemUI/src/com/android/systemui/navigationbar/car/hvac/TemperatureView.java b/packages/CarSystemUI/src/com/android/systemui/navigationbar/car/hvac/TemperatureView.java
deleted file mode 100644
index 963f318..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/navigationbar/car/hvac/TemperatureView.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (C) 2019 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.navigationbar.car.hvac;
-
-/**
- * Interface for Views that display temperature HVAC properties
- */
-public interface TemperatureView {
-    /**
-     * Formats the float for display
-     *
-     * @param temp - The current temp in Celsius or NaN
-     */
-    void setTemp(float temp);
-
-    /**
-     * Render the displayed temperature in Fahrenheit
-     *
-     * @param displayFahrenheit - True if temperature should be displayed in Fahrenheit
-     */
-    void setDisplayInFahrenheit(boolean displayFahrenheit);
-
-    /**
-     * Convert the given temperature in Celsius into Fahrenheit
-     *
-     * @param realTemp - The temperature in Celsius
-     * @return Temperature in Fahrenheit.
-     */
-    default float convertToFahrenheit(float realTemp) {
-        return (realTemp * 9f / 5f) + 32;
-    }
-
-    /**
-     * @return propertiyId  Example: CarHvacManager.ID_ZONED_TEMP_SETPOINT (16385)
-     */
-    int getPropertyId();
-
-    /**
-     * @return hvac AreaId - Example: VehicleSeat.SEAT_ROW_1_LEFT (1)
-     */
-    int getAreaId();
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/qs/car/CarQSFooter.java b/packages/CarSystemUI/src/com/android/systemui/qs/car/CarQSFooter.java
deleted file mode 100644
index b74f199..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/qs/car/CarQSFooter.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.qs.car;
-
-import android.content.Context;
-import android.content.Intent;
-import android.graphics.drawable.Drawable;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.widget.ImageView;
-import android.widget.RelativeLayout;
-import android.widget.TextView;
-
-import androidx.annotation.Nullable;
-
-import com.android.systemui.Dependency;
-import com.android.systemui.R;
-import com.android.systemui.plugins.ActivityStarter;
-import com.android.systemui.qs.QSFooter;
-import com.android.systemui.qs.QSPanel;
-import com.android.systemui.statusbar.phone.MultiUserSwitch;
-import com.android.systemui.statusbar.policy.DeviceProvisionedController;
-import com.android.systemui.statusbar.policy.UserInfoController;
-
-/**
- * The footer view that displays below the status bar in the auto use-case. This view shows the
- * user switcher and access to settings.
- */
-public class CarQSFooter extends RelativeLayout implements QSFooter,
-        UserInfoController.OnUserInfoChangedListener {
-    private static final String TAG = "CarQSFooter";
-
-    private UserInfoController mUserInfoController;
-
-    private MultiUserSwitch mMultiUserSwitch;
-    private TextView mUserName;
-    private ImageView mMultiUserAvatar;
-    private CarQSFragment.UserSwitchCallback mUserSwitchCallback;
-
-    public CarQSFooter(Context context, AttributeSet attrs) {
-        super(context, attrs);
-    }
-
-    @Override
-    protected void onFinishInflate() {
-        super.onFinishInflate();
-        mMultiUserSwitch = findViewById(R.id.multi_user_switch);
-        mMultiUserAvatar = mMultiUserSwitch.findViewById(R.id.multi_user_avatar);
-        mUserName = findViewById(R.id.user_name);
-
-        mUserInfoController = Dependency.get(UserInfoController.class);
-
-        mMultiUserSwitch.setOnClickListener(v -> {
-            if (mUserSwitchCallback == null) {
-                Log.e(TAG, "CarQSFooter not properly set up; cannot display user switcher.");
-                return;
-            }
-
-            if (!mUserSwitchCallback.isShowing()) {
-                mUserSwitchCallback.show();
-            } else {
-                mUserSwitchCallback.hide();
-            }
-        });
-
-        findViewById(R.id.settings_button).setOnClickListener(v -> {
-            ActivityStarter activityStarter = Dependency.get(ActivityStarter.class);
-
-            if (!Dependency.get(DeviceProvisionedController.class).isCurrentUserSetup()) {
-                // If user isn't setup just unlock the device and dump them back at SUW.
-                activityStarter.postQSRunnableDismissingKeyguard(() -> { });
-                return;
-            }
-
-            activityStarter.startActivity(new Intent(android.provider.Settings.ACTION_SETTINGS),
-                    true /* dismissShade */);
-        });
-    }
-
-    @Override
-    public void onUserInfoChanged(String name, Drawable picture, String userAccount) {
-        mMultiUserAvatar.setImageDrawable(picture);
-        mUserName.setText(name);
-    }
-
-    @Override
-    public void setQSPanel(@Nullable QSPanel panel) {
-        if (panel != null) {
-            mMultiUserSwitch.setQsPanel(panel);
-        }
-    }
-
-    public void setUserSwitchCallback(CarQSFragment.UserSwitchCallback callback) {
-        mUserSwitchCallback = callback;
-    }
-
-    @Override
-    public void setListening(boolean listening) {
-        if (listening) {
-            mUserInfoController.addCallback(this);
-        } else {
-            mUserInfoController.removeCallback(this);
-        }
-    }
-
-    @Override
-    public void setExpandClickListener(OnClickListener onClickListener) {
-        // No view that should expand/collapse the quick settings.
-    }
-
-    @Override
-    public void setExpanded(boolean expanded) {
-        // Do nothing because the quick settings cannot be expanded.
-    }
-
-    @Override
-    public void setExpansion(float expansion) {
-        // Do nothing because the quick settings cannot be expanded.
-    }
-
-    @Override
-    public void setKeyguardShowing(boolean keyguardShowing) {
-        // Do nothing because the footer will not be shown when the keyguard is up.
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/qs/car/CarQSFragment.java b/packages/CarSystemUI/src/com/android/systemui/qs/car/CarQSFragment.java
deleted file mode 100644
index 31965c5..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/qs/car/CarQSFragment.java
+++ /dev/null
@@ -1,274 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.qs.car;
-
-import android.animation.Animator;
-import android.animation.AnimatorInflater;
-import android.animation.AnimatorListenerAdapter;
-import android.animation.AnimatorSet;
-import android.animation.ObjectAnimator;
-import android.animation.ValueAnimator;
-import android.app.Fragment;
-import android.content.Context;
-import android.os.Bundle;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.ViewGroup;
-
-import androidx.annotation.Nullable;
-import androidx.annotation.VisibleForTesting;
-import androidx.recyclerview.widget.GridLayoutManager;
-
-import com.android.systemui.R;
-import com.android.systemui.car.userswitcher.UserGridRecyclerView;
-import com.android.systemui.plugins.qs.QS;
-import com.android.systemui.qs.QSFooter;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * A quick settings fragment for the car. For auto, there is no row for quick settings or ability
- * to expand the quick settings panel. Instead, the only thing is that displayed is the
- * status bar, and a static row with access to the user switcher and settings.
- */
-public class CarQSFragment extends Fragment implements QS {
-    private View mHeader;
-    private View mUserSwitcherContainer;
-    private CarQSFooter mFooter;
-    private View mFooterUserName;
-    private View mFooterExpandIcon;
-    private UserGridRecyclerView mUserGridView;
-    private AnimatorSet mAnimatorSet;
-    private UserSwitchCallback mUserSwitchCallback;
-
-    @Override
-    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
-            Bundle savedInstanceState) {
-        return inflater.inflate(R.layout.car_qs_panel, container, false);
-    }
-
-    @Override
-    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
-        super.onViewCreated(view, savedInstanceState);
-        mHeader = view.findViewById(R.id.header);
-        mFooter = view.findViewById(R.id.qs_footer);
-        mFooterUserName = mFooter.findViewById(R.id.user_name);
-        mFooterExpandIcon = mFooter.findViewById(R.id.user_switch_expand_icon);
-
-        mUserSwitcherContainer = view.findViewById(R.id.user_switcher_container);
-
-        updateUserSwitcherHeight(0);
-
-        Context context = getContext();
-        mUserGridView = mUserSwitcherContainer.findViewById(R.id.user_grid);
-        GridLayoutManager layoutManager = new GridLayoutManager(context,
-                context.getResources().getInteger(R.integer.user_fullscreen_switcher_num_col));
-        mUserGridView.setLayoutManager(layoutManager);
-        mUserGridView.buildAdapter();
-
-        mUserSwitchCallback = new UserSwitchCallback();
-        mFooter.setUserSwitchCallback(mUserSwitchCallback);
-    }
-
-    @Override
-    public void hideImmediately() {
-        getView().setVisibility(View.INVISIBLE);
-    }
-
-    @Override
-    public void setQsExpansion(float qsExpansionFraction, float headerTranslation) {
-        // If the header is to be completed translated down, then set it to be visible.
-        getView().setVisibility(headerTranslation == 0 ? View.VISIBLE : View.INVISIBLE);
-    }
-
-    @Override
-    public View getHeader() {
-        return mHeader;
-    }
-
-    @VisibleForTesting
-    QSFooter getFooter() {
-        return mFooter;
-    }
-
-    @Override
-    public void setHeaderListening(boolean listening) {
-        mFooter.setListening(listening);
-    }
-
-    @Override
-    public void setListening(boolean listening) {
-        mFooter.setListening(listening);
-    }
-
-    @Override
-    public int getQsMinExpansionHeight() {
-        return getView().getHeight();
-    }
-
-    @Override
-    public int getDesiredHeight() {
-        return getView().getHeight();
-    }
-
-    @Override
-    public void setPanelView(HeightListener notificationPanelView) {
-        // No quick settings panel.
-    }
-
-    @Override
-    public void setHeightOverride(int desiredHeight) {
-        // No ability to expand quick settings.
-    }
-
-    @Override
-    public void setHeaderClickable(boolean qsExpansionEnabled) {
-        // Usually this sets the expand button to be clickable, but there is no quick settings to
-        // expand.
-    }
-
-    @Override
-    public boolean isCustomizing() {
-        // No ability to customize the quick settings.
-        return false;
-    }
-
-    @Override
-    public void setOverscrolling(boolean overscrolling) {
-        // No overscrolling to reveal quick settings.
-    }
-
-    @Override
-    public void setExpanded(boolean qsExpanded) {
-        // No quick settings to expand
-    }
-
-    @Override
-    public boolean isShowingDetail() {
-        // No detail panel to close.
-        return false;
-    }
-
-    @Override
-    public void closeDetail() {
-        // No detail panel to close.
-    }
-
-    @Override
-    public void animateHeaderSlidingIn(long delay) {
-        // No header to animate.
-    }
-
-    @Override
-    public void animateHeaderSlidingOut() {
-        // No header to animate.
-    }
-
-    @Override
-    public void notifyCustomizeChanged() {
-        // There is no ability to customize quick settings.
-    }
-
-    @Override
-    public void setContainer(ViewGroup container) {
-        // No quick settings, so no container to set.
-    }
-
-    @Override
-    public void setExpandClickListener(OnClickListener onClickListener) {
-        // No ability to expand the quick settings.
-    }
-
-    public class UserSwitchCallback {
-        private boolean mShowing;
-
-        public boolean isShowing() {
-            return mShowing;
-        }
-
-        public void show() {
-            mShowing = true;
-            animateHeightChange(true /* opening */);
-        }
-
-        public void hide() {
-            mShowing = false;
-            animateHeightChange(false /* opening */);
-        }
-    }
-
-    private void updateUserSwitcherHeight(int height) {
-        ViewGroup.LayoutParams layoutParams = mUserSwitcherContainer.getLayoutParams();
-        layoutParams.height = height;
-        mUserSwitcherContainer.requestLayout();
-    }
-
-    private void animateHeightChange(boolean opening) {
-        // Animation in progress; cancel it to avoid contention.
-        if (mAnimatorSet != null) {
-            mAnimatorSet.cancel();
-        }
-
-        List<Animator> allAnimators = new ArrayList<>();
-        ValueAnimator heightAnimator = (ValueAnimator) AnimatorInflater.loadAnimator(getContext(),
-                opening ? R.anim.car_user_switcher_open_animation
-                        : R.anim.car_user_switcher_close_animation);
-        heightAnimator.addUpdateListener(valueAnimator -> {
-            updateUserSwitcherHeight((Integer) valueAnimator.getAnimatedValue());
-        });
-        allAnimators.add(heightAnimator);
-
-        Animator nameAnimator = AnimatorInflater.loadAnimator(getContext(),
-                opening ? R.anim.car_user_switcher_open_name_animation
-                        : R.anim.car_user_switcher_close_name_animation);
-        nameAnimator.setTarget(mFooterUserName);
-        allAnimators.add(nameAnimator);
-
-        Animator iconAnimator = AnimatorInflater.loadAnimator(getContext(),
-                opening ? R.anim.car_user_switcher_open_icon_animation
-                        : R.anim.car_user_switcher_close_icon_animation);
-        iconAnimator.setTarget(mFooterExpandIcon);
-        allAnimators.add(iconAnimator);
-
-        mAnimatorSet = new AnimatorSet();
-        mAnimatorSet.addListener(new AnimatorListenerAdapter() {
-            @Override
-            public void onAnimationEnd(Animator animation) {
-                mAnimatorSet = null;
-            }
-        });
-        mAnimatorSet.playTogether(allAnimators.toArray(new Animator[0]));
-
-        // Setup all values to the start values in the animations, since there are delays, but need
-        // to have all values start at the beginning.
-        setupInitialValues(mAnimatorSet);
-
-        mAnimatorSet.start();
-    }
-
-    private void setupInitialValues(Animator anim) {
-        if (anim instanceof AnimatorSet) {
-            for (Animator a : ((AnimatorSet) anim).getChildAnimations()) {
-                setupInitialValues(a);
-            }
-        } else if (anim instanceof ObjectAnimator) {
-            ((ObjectAnimator) anim).setCurrentFraction(0.0f);
-        }
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/qs/car/CarStatusBarHeader.java b/packages/CarSystemUI/src/com/android/systemui/qs/car/CarStatusBarHeader.java
deleted file mode 100644
index 4ef926f..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/qs/car/CarStatusBarHeader.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.qs.car;
-
-import android.content.Context;
-import android.graphics.Color;
-import android.graphics.Rect;
-import android.util.AttributeSet;
-import android.view.View;
-import android.widget.LinearLayout;
-
-import androidx.annotation.IdRes;
-
-import com.android.settingslib.Utils;
-import com.android.systemui.BatteryMeterView;
-import com.android.systemui.R;
-import com.android.systemui.plugins.DarkIconDispatcher;
-
-/**
- * A view that forms the header of the notification panel. This view will ensure that any
- * status icons that are displayed are tinted accordingly to the current theme.
- */
-public class CarStatusBarHeader extends LinearLayout {
-    public CarStatusBarHeader(Context context, AttributeSet attrs) {
-        super(context, attrs);
-    }
-
-    @Override
-    protected void onFinishInflate() {
-        super.onFinishInflate();
-
-        // Set the light/dark theming on the header status UI to match the current theme.
-        int colorForeground = Utils.getColorAttrDefaultColor(getContext(),
-                android.R.attr.colorForeground);
-        float intensity = colorForeground == Color.WHITE ? 0f : 1f;
-        Rect tintArea = new Rect(0, 0, 0, 0);
-
-        applyDarkness(R.id.battery, tintArea, intensity, colorForeground);
-        applyDarkness(R.id.clock, tintArea, intensity, colorForeground);
-
-        ((BatteryMeterView) findViewById(R.id.battery)).setForceShowPercent(true);
-    }
-
-    private void applyDarkness(@IdRes int id, Rect tintArea, float intensity, int color) {
-        View v = findViewById(id);
-        if (v instanceof DarkIconDispatcher.DarkReceiver) {
-            ((DarkIconDispatcher.DarkReceiver) v).onDarkChanged(tintArea, intensity, color);
-        }
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarBatteryController.java b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarBatteryController.java
deleted file mode 100644
index 4e0fd4a..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarBatteryController.java
+++ /dev/null
@@ -1,287 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.statusbar.car;
-
-import android.bluetooth.BluetoothAdapter;
-import android.bluetooth.BluetoothDevice;
-import android.bluetooth.BluetoothHeadsetClient;
-import android.bluetooth.BluetoothProfile;
-import android.bluetooth.BluetoothProfile.ServiceListener;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.os.Bundle;
-import android.util.Log;
-
-import com.android.systemui.statusbar.policy.BatteryController;
-
-import java.io.FileDescriptor;
-import java.io.PrintWriter;
-import java.util.ArrayList;
-
-/**
- * A {@link BatteryController} that is specific to the Auto use-case. For Auto, the battery icon
- * displays the battery status of a device that is connected via bluetooth and not the system's
- * battery.
- */
-public class CarBatteryController extends BroadcastReceiver implements BatteryController {
-    private static final String TAG = "CarBatteryController";
-
-    // According to the Bluetooth HFP 1.5 specification, battery levels are indicated by a
-    // value from 1-5, where these values represent the following:
-    // 0%% - 0, 1-25%% - 1, 26-50%% - 2, 51-75%% - 3, 76-99%% - 4, 100%% - 5
-    // As a result, set the level as the average within that range.
-    private static final int BATTERY_LEVEL_EMPTY = 0;
-    private static final int BATTERY_LEVEL_1 = 12;
-    private static final int BATTERY_LEVEL_2 = 28;
-    private static final int BATTERY_LEVEL_3 = 63;
-    private static final int BATTERY_LEVEL_4 = 87;
-    private static final int BATTERY_LEVEL_FULL = 100;
-
-    private static final int INVALID_BATTERY_LEVEL = -1;
-
-    private final Context mContext;
-
-    private final BluetoothAdapter mAdapter = BluetoothAdapter.getDefaultAdapter();
-    private final ArrayList<BatteryStateChangeCallback> mChangeCallbacks = new ArrayList<>();
-    private BluetoothHeadsetClient mBluetoothHeadsetClient;
-    private final ServiceListener mHfpServiceListener = new ServiceListener() {
-        @Override
-        public void onServiceConnected(int profile, BluetoothProfile proxy) {
-            if (profile == BluetoothProfile.HEADSET_CLIENT) {
-                mBluetoothHeadsetClient = (BluetoothHeadsetClient) proxy;
-            }
-        }
-
-        @Override
-        public void onServiceDisconnected(int profile) {
-            if (profile == BluetoothProfile.HEADSET_CLIENT) {
-                mBluetoothHeadsetClient = null;
-            }
-        }
-    };
-    private int mLevel;
-    private BatteryViewHandler mBatteryViewHandler;
-
-    public CarBatteryController(Context context) {
-        mContext = context;
-
-        if (mAdapter == null) {
-            return;
-        }
-
-        mAdapter.getProfileProxy(context.getApplicationContext(), mHfpServiceListener,
-                BluetoothProfile.HEADSET_CLIENT);
-    }
-
-    @Override
-    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
-        pw.println("CarBatteryController state:");
-        pw.print("    mLevel=");
-        pw.println(mLevel);
-    }
-
-    @Override
-    public void setPowerSaveMode(boolean powerSave) {
-        // No-op. No power save mode for the car.
-    }
-
-    @Override
-    public void addCallback(BatteryController.BatteryStateChangeCallback cb) {
-        mChangeCallbacks.add(cb);
-
-        // There is no way to know if the phone is plugged in or charging via bluetooth, so pass
-        // false for these values.
-        cb.onBatteryLevelChanged(mLevel, false /* pluggedIn */, false /* charging */);
-        cb.onPowerSaveChanged(false /* isPowerSave */);
-    }
-
-    @Override
-    public void removeCallback(BatteryController.BatteryStateChangeCallback cb) {
-        mChangeCallbacks.remove(cb);
-    }
-
-    public void addBatteryViewHandler(BatteryViewHandler batteryViewHandler) {
-        mBatteryViewHandler = batteryViewHandler;
-    }
-
-    public void startListening() {
-        IntentFilter filter = new IntentFilter();
-        filter.addAction(BluetoothHeadsetClient.ACTION_CONNECTION_STATE_CHANGED);
-        filter.addAction(BluetoothHeadsetClient.ACTION_AG_EVENT);
-        mContext.registerReceiver(this, filter);
-    }
-
-    public void stopListening() {
-        mContext.unregisterReceiver(this);
-    }
-
-    @Override
-    public void onReceive(Context context, Intent intent) {
-        String action = intent.getAction();
-
-        if (Log.isLoggable(TAG, Log.DEBUG)) {
-            Log.d(TAG, "onReceive(). action: " + action);
-        }
-
-        if (BluetoothHeadsetClient.ACTION_AG_EVENT.equals(action)) {
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                Log.d(TAG, "Received ACTION_AG_EVENT");
-            }
-
-            int batteryLevel = intent.getIntExtra(BluetoothHeadsetClient.EXTRA_BATTERY_LEVEL,
-                    INVALID_BATTERY_LEVEL);
-
-            updateBatteryLevel(batteryLevel);
-
-            if (batteryLevel != INVALID_BATTERY_LEVEL && mBatteryViewHandler != null) {
-                mBatteryViewHandler.showBatteryView();
-            }
-        } else if (BluetoothHeadsetClient.ACTION_CONNECTION_STATE_CHANGED.equals(action)) {
-            int newState = intent.getIntExtra(BluetoothProfile.EXTRA_STATE, -1);
-
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                int oldState = intent.getIntExtra(BluetoothProfile.EXTRA_PREVIOUS_STATE, -1);
-                Log.d(TAG, "ACTION_CONNECTION_STATE_CHANGED event: "
-                        + oldState + " -> " + newState);
-
-            }
-            BluetoothDevice device =
-                    (BluetoothDevice) intent.getExtra(BluetoothDevice.EXTRA_DEVICE);
-            updateBatteryIcon(device, newState);
-        }
-    }
-
-    /**
-     * Converts the battery level to a percentage that can be displayed on-screen and notifies
-     * any {@link BatteryStateChangeCallback}s of this.
-     */
-    private void updateBatteryLevel(int batteryLevel) {
-        if (batteryLevel == INVALID_BATTERY_LEVEL) {
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                Log.d(TAG, "Battery level invalid. Ignoring.");
-            }
-            return;
-        }
-
-        // The battery level is a value between 0-5. Let the default battery level be 0.
-        switch (batteryLevel) {
-            case 5:
-                mLevel = BATTERY_LEVEL_FULL;
-                break;
-            case 4:
-                mLevel = BATTERY_LEVEL_4;
-                break;
-            case 3:
-                mLevel = BATTERY_LEVEL_3;
-                break;
-            case 2:
-                mLevel = BATTERY_LEVEL_2;
-                break;
-            case 1:
-                mLevel = BATTERY_LEVEL_1;
-                break;
-            case 0:
-            default:
-                mLevel = BATTERY_LEVEL_EMPTY;
-        }
-
-        if (Log.isLoggable(TAG, Log.DEBUG)) {
-            Log.d(TAG, "Battery level: " + batteryLevel + "; setting mLevel as: " + mLevel);
-        }
-
-        notifyBatteryLevelChanged();
-    }
-
-    /**
-     * Updates the display of the battery icon depending on the given connection state from the
-     * given {@link BluetoothDevice}.
-     */
-    private void updateBatteryIcon(BluetoothDevice device, int newState) {
-        if (newState == BluetoothProfile.STATE_CONNECTED) {
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                Log.d(TAG, "Device connected");
-            }
-
-            if (mBatteryViewHandler != null) {
-                mBatteryViewHandler.showBatteryView();
-            }
-
-            if (mBluetoothHeadsetClient == null || device == null) {
-                return;
-            }
-
-            // Check if battery information is available and immediately update.
-            Bundle featuresBundle = mBluetoothHeadsetClient.getCurrentAgEvents(device);
-            if (featuresBundle == null) {
-                return;
-            }
-
-            int batteryLevel = featuresBundle.getInt(BluetoothHeadsetClient.EXTRA_BATTERY_LEVEL,
-                    INVALID_BATTERY_LEVEL);
-            updateBatteryLevel(batteryLevel);
-        } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                Log.d(TAG, "Device disconnected");
-            }
-
-            if (mBatteryViewHandler != null) {
-                mBatteryViewHandler.hideBatteryView();
-            }
-        }
-    }
-
-    @Override
-    public void dispatchDemoCommand(String command, Bundle args) {
-        // TODO: Car demo mode.
-    }
-
-    @Override
-    public boolean isPluggedIn() {
-        return true;
-    }
-
-    @Override
-    public boolean isPowerSave() {
-        // Power save is not valid for the car, so always return false.
-        return false;
-    }
-
-    @Override
-    public boolean isAodPowerSave() {
-        return false;
-    }
-
-    private void notifyBatteryLevelChanged() {
-        for (int i = 0, size = mChangeCallbacks.size(); i < size; i++) {
-            mChangeCallbacks.get(i)
-                    .onBatteryLevelChanged(mLevel, false /* pluggedIn */, false /* charging */);
-        }
-    }
-
-    /**
-     * An interface indicating the container of a View that will display what the information
-     * in the {@link CarBatteryController}.
-     */
-    public interface BatteryViewHandler {
-        void hideBatteryView();
-
-        void showBatteryView();
-    }
-
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java
deleted file mode 100644
index cd45fc9..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java
+++ /dev/null
@@ -1,517 +0,0 @@
-/*
- * Copyright (C) 2018 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.statusbar.car;
-
-import static com.android.systemui.Dependency.TIME_TICK_HANDLER_NAME;
-
-import android.annotation.Nullable;
-import android.content.Context;
-import android.graphics.drawable.Drawable;
-import android.os.Handler;
-import android.os.PowerManager;
-import android.util.DisplayMetrics;
-import android.util.Log;
-import android.view.View;
-
-import com.android.internal.logging.MetricsLogger;
-import com.android.internal.statusbar.RegisterStatusBarResult;
-import com.android.keyguard.KeyguardUpdateMonitor;
-import com.android.keyguard.ViewMediatorCallback;
-import com.android.systemui.BatteryMeterView;
-import com.android.systemui.Dependency;
-import com.android.systemui.InitController;
-import com.android.systemui.Prefs;
-import com.android.systemui.R;
-import com.android.systemui.assist.AssistManager;
-import com.android.systemui.broadcast.BroadcastDispatcher;
-import com.android.systemui.bubbles.BubbleController;
-import com.android.systemui.car.CarDeviceProvisionedController;
-import com.android.systemui.car.CarDeviceProvisionedListener;
-import com.android.systemui.classifier.FalsingLog;
-import com.android.systemui.colorextraction.SysuiColorExtractor;
-import com.android.systemui.dagger.qualifiers.UiBackground;
-import com.android.systemui.fragments.FragmentHostManager;
-import com.android.systemui.keyguard.DismissCallbackRegistry;
-import com.android.systemui.keyguard.KeyguardViewMediator;
-import com.android.systemui.keyguard.ScreenLifecycle;
-import com.android.systemui.keyguard.WakefulnessLifecycle;
-import com.android.systemui.navigationbar.car.CarNavigationBarController;
-import com.android.systemui.plugins.DarkIconDispatcher;
-import com.android.systemui.plugins.FalsingManager;
-import com.android.systemui.plugins.PluginDependencyProvider;
-import com.android.systemui.plugins.qs.QS;
-import com.android.systemui.qs.car.CarQSFragment;
-import com.android.systemui.recents.Recents;
-import com.android.systemui.recents.ScreenPinningRequest;
-import com.android.systemui.shared.plugins.PluginManager;
-import com.android.systemui.stackdivider.Divider;
-import com.android.systemui.statusbar.CommandQueue;
-import com.android.systemui.statusbar.KeyguardIndicationController;
-import com.android.systemui.statusbar.NavigationBarController;
-import com.android.systemui.statusbar.NotificationLockscreenUserManager;
-import com.android.systemui.statusbar.NotificationMediaManager;
-import com.android.systemui.statusbar.NotificationRemoteInputManager;
-import com.android.systemui.statusbar.NotificationShadeDepthController;
-import com.android.systemui.statusbar.NotificationViewHierarchyManager;
-import com.android.systemui.statusbar.PulseExpansionHandler;
-import com.android.systemui.statusbar.SuperStatusBarViewFactory;
-import com.android.systemui.statusbar.SysuiStatusBarStateController;
-import com.android.systemui.statusbar.VibratorHelper;
-import com.android.systemui.statusbar.notification.DynamicPrivacyController;
-import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator;
-import com.android.systemui.statusbar.notification.VisualStabilityManager;
-import com.android.systemui.statusbar.notification.collection.NotificationEntry;
-import com.android.systemui.statusbar.notification.init.NotificationsController;
-import com.android.systemui.statusbar.notification.interruption.BypassHeadsUpNotifier;
-import com.android.systemui.statusbar.notification.interruption.NotificationAlertingManager;
-import com.android.systemui.statusbar.notification.interruption.NotificationInterruptStateProvider;
-import com.android.systemui.statusbar.notification.interruption.NotificationInterruptSuppressor;
-import com.android.systemui.statusbar.notification.logging.NotificationLogger;
-import com.android.systemui.statusbar.notification.row.NotificationGutsManager;
-import com.android.systemui.statusbar.phone.AutoHideController;
-import com.android.systemui.statusbar.phone.BiometricUnlockController;
-import com.android.systemui.statusbar.phone.CollapsedStatusBarFragment;
-import com.android.systemui.statusbar.phone.DozeParameters;
-import com.android.systemui.statusbar.phone.DozeScrimController;
-import com.android.systemui.statusbar.phone.DozeServiceHost;
-import com.android.systemui.statusbar.phone.HeadsUpManagerPhone;
-import com.android.systemui.statusbar.phone.KeyguardBypassController;
-import com.android.systemui.statusbar.phone.KeyguardDismissUtil;
-import com.android.systemui.statusbar.phone.LightBarController;
-import com.android.systemui.statusbar.phone.LightsOutNotifController;
-import com.android.systemui.statusbar.phone.LockscreenLockIconController;
-import com.android.systemui.statusbar.phone.LockscreenWallpaper;
-import com.android.systemui.statusbar.phone.NotificationGroupManager;
-import com.android.systemui.statusbar.phone.NotificationShadeWindowController;
-import com.android.systemui.statusbar.phone.PhoneStatusBarPolicy;
-import com.android.systemui.statusbar.phone.ScrimController;
-import com.android.systemui.statusbar.phone.ShadeController;
-import com.android.systemui.statusbar.phone.StatusBar;
-import com.android.systemui.statusbar.phone.StatusBarIconController;
-import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
-import com.android.systemui.statusbar.phone.StatusBarNotificationActivityStarter;
-import com.android.systemui.statusbar.phone.StatusBarTouchableRegionManager;
-import com.android.systemui.statusbar.phone.dagger.StatusBarComponent;
-import com.android.systemui.statusbar.policy.BatteryController;
-import com.android.systemui.statusbar.policy.ConfigurationController;
-import com.android.systemui.statusbar.policy.ExtensionController;
-import com.android.systemui.statusbar.policy.KeyguardStateController;
-import com.android.systemui.statusbar.policy.NetworkController;
-import com.android.systemui.statusbar.policy.RemoteInputQuickSettingsDisabler;
-import com.android.systemui.statusbar.policy.UserInfoControllerImpl;
-import com.android.systemui.statusbar.policy.UserSwitcherController;
-import com.android.systemui.volume.VolumeComponent;
-
-import java.io.FileDescriptor;
-import java.io.PrintWriter;
-import java.util.Map;
-import java.util.Optional;
-import java.util.concurrent.Executor;
-
-import javax.inject.Named;
-import javax.inject.Provider;
-
-import dagger.Lazy;
-
-/**
- * A status bar tailored for the automotive use case.
- */
-public class CarStatusBar extends StatusBar implements CarBatteryController.BatteryViewHandler {
-    private static final String TAG = "CarStatusBar";
-
-    private final UserSwitcherController mUserSwitcherController;
-    private final ScrimController mScrimController;
-
-    private CarBatteryController mCarBatteryController;
-    private BatteryMeterView mBatteryMeterView;
-    private Drawable mNotificationPanelBackground;
-
-    private final Object mQueueLock = new Object();
-    private final CarNavigationBarController mCarNavigationBarController;
-    private final CarDeviceProvisionedController mCarDeviceProvisionedController;
-    private final ScreenLifecycle mScreenLifecycle;
-
-    private boolean mDeviceIsSetUpForUser = true;
-    private boolean mIsUserSetupInProgress = false;
-
-    public CarStatusBar(
-            Context context,
-            NotificationsController notificationsController,
-            LightBarController lightBarController,
-            AutoHideController autoHideController,
-            KeyguardUpdateMonitor keyguardUpdateMonitor,
-            StatusBarIconController statusBarIconController,
-            PulseExpansionHandler pulseExpansionHandler,
-            NotificationWakeUpCoordinator notificationWakeUpCoordinator,
-            KeyguardBypassController keyguardBypassController,
-            KeyguardStateController keyguardStateController,
-            HeadsUpManagerPhone headsUpManagerPhone,
-            DynamicPrivacyController dynamicPrivacyController,
-            BypassHeadsUpNotifier bypassHeadsUpNotifier,
-            FalsingManager falsingManager,
-            BroadcastDispatcher broadcastDispatcher,
-            RemoteInputQuickSettingsDisabler remoteInputQuickSettingsDisabler,
-            NotificationGutsManager notificationGutsManager,
-            NotificationLogger notificationLogger,
-            NotificationInterruptStateProvider notificationInterruptStateProvider,
-            NotificationViewHierarchyManager notificationViewHierarchyManager,
-            KeyguardViewMediator keyguardViewMediator,
-            NotificationAlertingManager notificationAlertingManager,
-            DisplayMetrics displayMetrics,
-            MetricsLogger metricsLogger,
-            @UiBackground Executor uiBgExecutor,
-            NotificationMediaManager notificationMediaManager,
-            NotificationLockscreenUserManager lockScreenUserManager,
-            NotificationRemoteInputManager remoteInputManager,
-            UserSwitcherController userSwitcherController,
-            NetworkController networkController,
-            BatteryController batteryController,
-            SysuiColorExtractor colorExtractor,
-            ScreenLifecycle screenLifecycle,
-            WakefulnessLifecycle wakefulnessLifecycle,
-            SysuiStatusBarStateController statusBarStateController,
-            VibratorHelper vibratorHelper,
-            BubbleController bubbleController,
-            NotificationGroupManager groupManager,
-            VisualStabilityManager visualStabilityManager,
-            CarDeviceProvisionedController carDeviceProvisionedController,
-            NavigationBarController navigationBarController,
-            Lazy<AssistManager> assistManagerLazy,
-            ConfigurationController configurationController,
-            NotificationShadeWindowController notificationShadeWindowController,
-            LockscreenLockIconController lockscreenLockIconController,
-            DozeParameters dozeParameters,
-            ScrimController scrimController,
-            Lazy<LockscreenWallpaper> lockscreenWallpaperLazy,
-            Lazy<BiometricUnlockController> biometricUnlockControllerLazy,
-            DozeServiceHost dozeServiceHost,
-            PowerManager powerManager,
-            ScreenPinningRequest screenPinningRequest,
-            DozeScrimController dozeScrimController,
-            VolumeComponent volumeComponent,
-            CommandQueue commandQueue,
-            Optional<Recents> recents,
-            Provider<StatusBarComponent.Builder> statusBarComponentBuilder,
-            PluginManager pluginManager,
-            Optional<Divider> dividerOptional,
-            SuperStatusBarViewFactory superStatusBarViewFactory,
-            LightsOutNotifController lightsOutNotifController,
-            StatusBarNotificationActivityStarter.Builder
-                    statusBarNotificationActivityStarterBuilder,
-            ShadeController shadeController,
-            StatusBarKeyguardViewManager statusBarKeyguardViewManager,
-            ViewMediatorCallback viewMediatorCallback,
-            InitController initController,
-            DarkIconDispatcher darkIconDispatcher,
-            @Named(TIME_TICK_HANDLER_NAME) Handler timeTickHandler,
-            PluginDependencyProvider pluginDependencyProvider,
-            KeyguardDismissUtil keyguardDismissUtil,
-            ExtensionController extensionController,
-            UserInfoControllerImpl userInfoControllerImpl,
-            PhoneStatusBarPolicy phoneStatusBarPolicy,
-            KeyguardIndicationController keyguardIndicationController,
-            DismissCallbackRegistry dismissCallbackRegistry,
-            StatusBarTouchableRegionManager statusBarTouchableRegionManager,
-            Lazy<NotificationShadeDepthController> depthControllerLazy,
-            /* Car Settings injected components. */
-            CarNavigationBarController carNavigationBarController) {
-        super(
-                context,
-                notificationsController,
-                lightBarController,
-                autoHideController,
-                keyguardUpdateMonitor,
-                statusBarIconController,
-                pulseExpansionHandler,
-                notificationWakeUpCoordinator,
-                keyguardBypassController,
-                keyguardStateController,
-                headsUpManagerPhone,
-                dynamicPrivacyController,
-                bypassHeadsUpNotifier,
-                falsingManager,
-                broadcastDispatcher,
-                remoteInputQuickSettingsDisabler,
-                notificationGutsManager,
-                notificationLogger,
-                notificationInterruptStateProvider,
-                notificationViewHierarchyManager,
-                keyguardViewMediator,
-                notificationAlertingManager,
-                displayMetrics,
-                metricsLogger,
-                uiBgExecutor,
-                notificationMediaManager,
-                lockScreenUserManager,
-                remoteInputManager,
-                userSwitcherController,
-                networkController,
-                batteryController,
-                colorExtractor,
-                screenLifecycle,
-                wakefulnessLifecycle,
-                statusBarStateController,
-                vibratorHelper,
-                bubbleController,
-                groupManager,
-                visualStabilityManager,
-                carDeviceProvisionedController,
-                navigationBarController,
-                assistManagerLazy,
-                configurationController,
-                notificationShadeWindowController,
-                lockscreenLockIconController,
-                dozeParameters,
-                scrimController,
-                null /* keyguardLiftController */,
-                lockscreenWallpaperLazy,
-                biometricUnlockControllerLazy,
-                dozeServiceHost,
-                powerManager,
-                screenPinningRequest,
-                dozeScrimController,
-                volumeComponent,
-                commandQueue,
-                recents,
-                statusBarComponentBuilder,
-                pluginManager,
-                dividerOptional,
-                lightsOutNotifController,
-                statusBarNotificationActivityStarterBuilder,
-                shadeController,
-                superStatusBarViewFactory,
-                statusBarKeyguardViewManager,
-                viewMediatorCallback,
-                initController,
-                darkIconDispatcher,
-                timeTickHandler,
-                pluginDependencyProvider,
-                keyguardDismissUtil,
-                extensionController,
-                userInfoControllerImpl,
-                phoneStatusBarPolicy,
-                keyguardIndicationController,
-                dismissCallbackRegistry,
-                depthControllerLazy,
-                statusBarTouchableRegionManager);
-        mUserSwitcherController = userSwitcherController;
-        mScrimController = scrimController;
-        mCarDeviceProvisionedController = carDeviceProvisionedController;
-        mCarNavigationBarController = carNavigationBarController;
-        mScreenLifecycle = screenLifecycle;
-    }
-
-    @Override
-    public void start() {
-        mDeviceIsSetUpForUser = mCarDeviceProvisionedController.isCurrentUserSetup();
-        mIsUserSetupInProgress = mCarDeviceProvisionedController.isCurrentUserSetupInProgress();
-
-        super.start();
-
-        createBatteryController();
-        mCarBatteryController.startListening();
-
-        mCarDeviceProvisionedController.addCallback(
-                new CarDeviceProvisionedListener() {
-                    @Override
-                    public void onUserSetupInProgressChanged() {
-                        mDeviceIsSetUpForUser = mCarDeviceProvisionedController
-                                .isCurrentUserSetup();
-                        mIsUserSetupInProgress = mCarDeviceProvisionedController
-                                .isCurrentUserSetupInProgress();
-                    }
-
-                    @Override
-                    public void onUserSetupChanged() {
-                        mDeviceIsSetUpForUser = mCarDeviceProvisionedController
-                                .isCurrentUserSetup();
-                        mIsUserSetupInProgress = mCarDeviceProvisionedController
-                                .isCurrentUserSetupInProgress();
-                    }
-
-                    @Override
-                    public void onUserSwitched() {
-                        mDeviceIsSetUpForUser = mCarDeviceProvisionedController
-                                .isCurrentUserSetup();
-                        mIsUserSetupInProgress = mCarDeviceProvisionedController
-                                .isCurrentUserSetupInProgress();
-                    }
-                });
-
-        mNotificationInterruptStateProvider.addSuppressor(new NotificationInterruptSuppressor() {
-            @Override
-            public String getName() {
-                return TAG;
-            }
-
-            @Override
-            public boolean suppressInterruptions(NotificationEntry entry) {
-                // Because space is usually constrained in the auto use-case, there should not be a
-                // pinned notification when the shade has been expanded.
-                // Ensure this by not allowing any interruptions (ie: pinning any notifications) if
-                // the shade is already opened.
-                return !getPresenter().isPresenterFullyCollapsed();
-            }
-        });
-    }
-
-    @Override
-    public boolean hideKeyguard() {
-        boolean result = super.hideKeyguard();
-        mCarNavigationBarController.hideAllKeyguardButtons(isDeviceSetupForUser());
-        return result;
-    }
-
-    @Override
-    public void showKeyguard() {
-        super.showKeyguard();
-        mCarNavigationBarController.showAllKeyguardButtons(isDeviceSetupForUser());
-    }
-
-    private boolean isDeviceSetupForUser() {
-        return mDeviceIsSetUpForUser && !mIsUserSetupInProgress;
-    }
-
-    @Override
-    protected void makeStatusBarView(@Nullable RegisterStatusBarResult result) {
-        super.makeStatusBarView(result);
-
-        mNotificationPanelBackground = getDefaultWallpaper();
-        mScrimController.setScrimBehindDrawable(mNotificationPanelBackground);
-
-        FragmentHostManager manager = FragmentHostManager.get(mPhoneStatusBarWindow);
-        manager.addTagListener(CollapsedStatusBarFragment.TAG, (tag, fragment) -> {
-            mBatteryMeterView = fragment.getView().findViewById(R.id.battery);
-
-            // By default, the BatteryMeterView should not be visible. It will be toggled
-            // when a device has connected by bluetooth.
-            mBatteryMeterView.setVisibility(View.GONE);
-        });
-    }
-
-    @Override
-    public void animateExpandNotificationsPanel() {
-        // No op.
-    }
-
-    @Override
-    protected QS createDefaultQSFragment() {
-        return new CarQSFragment();
-    }
-
-    private BatteryController createBatteryController() {
-        mCarBatteryController = new CarBatteryController(mContext);
-        mCarBatteryController.addBatteryViewHandler(this);
-        return mCarBatteryController;
-    }
-
-    @Override
-    protected void createNavigationBar(@Nullable RegisterStatusBarResult result) {
-        // No op.
-    }
-
-    @Override
-    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
-        //When executing dump() function simultaneously, we need to serialize them
-        //to get mStackScroller's position correctly.
-        synchronized (mQueueLock) {
-            pw.println("  mStackScroller: " + viewInfo(mStackScroller));
-            pw.println("  mStackScroller: " + viewInfo(mStackScroller)
-                    + " scroll " + mStackScroller.getScrollX()
-                    + "," + mStackScroller.getScrollY());
-        }
-        pw.print("  mCarBatteryController=");
-        pw.println(mCarBatteryController);
-        pw.print("  mBatteryMeterView=");
-        pw.println(mBatteryMeterView);
-
-        if (Dependency.get(KeyguardUpdateMonitor.class) != null) {
-            Dependency.get(KeyguardUpdateMonitor.class).dump(fd, pw, args);
-        }
-
-        FalsingLog.dump(pw);
-
-        pw.println("SharedPreferences:");
-        for (Map.Entry<String, ?> entry : Prefs.getAll(mContext).entrySet()) {
-            pw.print("  ");
-            pw.print(entry.getKey());
-            pw.print("=");
-            pw.println(entry.getValue());
-        }
-    }
-
-    @Override
-    public void showBatteryView() {
-        if (Log.isLoggable(TAG, Log.DEBUG)) {
-            Log.d(TAG, "showBatteryView(). mBatteryMeterView: " + mBatteryMeterView);
-        }
-
-        if (mBatteryMeterView != null) {
-            mBatteryMeterView.setVisibility(View.VISIBLE);
-        }
-    }
-
-    @Override
-    public void hideBatteryView() {
-        if (Log.isLoggable(TAG, Log.DEBUG)) {
-            Log.d(TAG, "hideBatteryView(). mBatteryMeterView: " + mBatteryMeterView);
-        }
-
-        if (mBatteryMeterView != null) {
-            mBatteryMeterView.setVisibility(View.GONE);
-        }
-    }
-
-    @Override
-    protected void createUserSwitcher() {
-        if (!mUserSwitcherController.useFullscreenUserSwitcher()) {
-            super.createUserSwitcher();
-        }
-    }
-
-    /**
-     * Dismisses the keyguard and shows bouncer if authentication is necessary.
-     */
-    public void dismissKeyguard() {
-        // Don't dismiss keyguard when the screen is off.
-        if (mScreenLifecycle.getScreenState() == ScreenLifecycle.SCREEN_OFF) {
-            return;
-        }
-        executeRunnableDismissingKeyguard(null/* runnable */, null /* cancelAction */,
-                true /* dismissShade */, true /* afterKeyguardGone */, true /* deferred */);
-    }
-
-    /**
-     * Ensures that relevant child views are appropriately recreated when the device's density
-     * changes.
-     */
-    @Override
-    public void onDensityOrFontScaleChanged() {
-        super.onDensityOrFontScaleChanged();
-        // Need to update the background on density changed in case the change was due to night
-        // mode.
-        mNotificationPanelBackground = getDefaultWallpaper();
-        mScrimController.setScrimBehindDrawable(mNotificationPanelBackground);
-    }
-
-    /**
-     * Returns the {@link Drawable} that represents the wallpaper that the user has currently set.
-     */
-    private Drawable getDefaultWallpaper() {
-        return mContext.getDrawable(com.android.internal.R.drawable.default_wallpaper);
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBarKeyguardViewManager.java b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBarKeyguardViewManager.java
deleted file mode 100644
index e1c051f..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBarKeyguardViewManager.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * Copyright (C) 2018 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.statusbar.car;
-
-import android.content.Context;
-import android.view.View;
-
-import com.android.internal.widget.LockPatternUtils;
-import com.android.keyguard.KeyguardUpdateMonitor;
-import com.android.keyguard.ViewMediatorCallback;
-import com.android.systemui.R;
-import com.android.systemui.dock.DockManager;
-import com.android.systemui.navigationbar.car.CarNavigationBarController;
-import com.android.systemui.statusbar.NotificationMediaManager;
-import com.android.systemui.statusbar.SysuiStatusBarStateController;
-import com.android.systemui.statusbar.phone.NavigationModeController;
-import com.android.systemui.statusbar.phone.NotificationShadeWindowController;
-import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
-import com.android.systemui.statusbar.policy.ConfigurationController;
-import com.android.systemui.statusbar.policy.KeyguardStateController;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import javax.inject.Inject;
-import javax.inject.Singleton;
-
-/** Car implementation of the {@link StatusBarKeyguardViewManager}. */
-@Singleton
-public class CarStatusBarKeyguardViewManager extends StatusBarKeyguardViewManager {
-
-    protected boolean mShouldHideNavBar;
-    private final CarNavigationBarController mCarNavigationBarController;
-    private Set<OnKeyguardCancelClickedListener> mKeygaurdCancelClickedListenerSet;
-
-    @Inject
-    public CarStatusBarKeyguardViewManager(Context context,
-            ViewMediatorCallback callback,
-            LockPatternUtils lockPatternUtils,
-            SysuiStatusBarStateController sysuiStatusBarStateController,
-            ConfigurationController configurationController,
-            KeyguardUpdateMonitor keyguardUpdateMonitor,
-            NavigationModeController navigationModeController,
-            DockManager dockManager,
-            NotificationShadeWindowController notificationShadeWindowController,
-            KeyguardStateController keyguardStateController,
-            NotificationMediaManager notificationMediaManager,
-            CarNavigationBarController carNavigationBarController) {
-        super(context, callback, lockPatternUtils, sysuiStatusBarStateController,
-                configurationController, keyguardUpdateMonitor, navigationModeController,
-                dockManager, notificationShadeWindowController, keyguardStateController,
-                notificationMediaManager);
-        mShouldHideNavBar = context.getResources()
-                .getBoolean(R.bool.config_hideNavWhenKeyguardBouncerShown);
-        mCarNavigationBarController = carNavigationBarController;
-        mKeygaurdCancelClickedListenerSet = new HashSet<>();
-    }
-
-    @Override
-    protected void updateNavigationBarVisibility(boolean navBarVisible) {
-        if (!mShouldHideNavBar) {
-            return;
-        }
-        int visibility = navBarVisible ? View.VISIBLE : View.GONE;
-        mCarNavigationBarController.setBottomWindowVisibility(visibility);
-        mCarNavigationBarController.setLeftWindowVisibility(visibility);
-        mCarNavigationBarController.setRightWindowVisibility(visibility);
-    }
-
-    /**
-     * Car is a multi-user system.  There's a cancel button on the bouncer that allows the user to
-     * go back to the user switcher and select another user.  Different user may have different
-     * security mode which requires bouncer container to be resized.  For this reason, the bouncer
-     * view is destroyed on cancel.
-     */
-    @Override
-    protected boolean shouldDestroyViewOnReset() {
-        return true;
-    }
-
-    /**
-     * Called when cancel button in bouncer is pressed.
-     */
-    @Override
-    public void onCancelClicked() {
-        mKeygaurdCancelClickedListenerSet.forEach(OnKeyguardCancelClickedListener::onCancelClicked);
-    }
-
-    /**
-     * Do nothing on this change.
-     * The base class hides the keyguard which for automotive we want to avoid b/c this would happen
-     * on a configuration change due to day/night (headlight state).
-     */
-    @Override
-    public void onDensityOrFontScaleChanged() {  }
-
-    /**
-     * Add listener for keyguard cancel clicked.
-     */
-    public void addOnKeyguardCancelClickedListener(
-            OnKeyguardCancelClickedListener keyguardCancelClickedListener) {
-        mKeygaurdCancelClickedListenerSet.add(keyguardCancelClickedListener);
-    }
-
-    /**
-     * Remove listener for keyguard cancel clicked.
-     */
-    public void removeOnKeyguardCancelClickedListener(
-            OnKeyguardCancelClickedListener keyguardCancelClickedListener) {
-        mKeygaurdCancelClickedListenerSet.remove(keyguardCancelClickedListener);
-    }
-
-
-    /**
-     * Defines a callback for keyguard cancel button clicked listeners.
-     */
-    public interface OnKeyguardCancelClickedListener {
-        /**
-         * Called when keyguard cancel button is clicked.
-         */
-        void onCancelClicked();
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBarModule.java b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBarModule.java
deleted file mode 100644
index e163173..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBarModule.java
+++ /dev/null
@@ -1,286 +0,0 @@
-/*
- * Copyright (C) 2019 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.statusbar.car;
-
-import static com.android.systemui.Dependency.TIME_TICK_HANDLER_NAME;
-
-import android.content.Context;
-import android.os.Handler;
-import android.os.PowerManager;
-import android.util.DisplayMetrics;
-
-import com.android.internal.logging.MetricsLogger;
-import com.android.keyguard.KeyguardUpdateMonitor;
-import com.android.keyguard.ViewMediatorCallback;
-import com.android.systemui.InitController;
-import com.android.systemui.assist.AssistManager;
-import com.android.systemui.broadcast.BroadcastDispatcher;
-import com.android.systemui.bubbles.BubbleController;
-import com.android.systemui.car.CarDeviceProvisionedController;
-import com.android.systemui.colorextraction.SysuiColorExtractor;
-import com.android.systemui.dagger.qualifiers.UiBackground;
-import com.android.systemui.keyguard.DismissCallbackRegistry;
-import com.android.systemui.keyguard.KeyguardViewMediator;
-import com.android.systemui.keyguard.ScreenLifecycle;
-import com.android.systemui.keyguard.WakefulnessLifecycle;
-import com.android.systemui.navigationbar.car.CarNavigationBarController;
-import com.android.systemui.plugins.DarkIconDispatcher;
-import com.android.systemui.plugins.FalsingManager;
-import com.android.systemui.plugins.PluginDependencyProvider;
-import com.android.systemui.recents.Recents;
-import com.android.systemui.recents.ScreenPinningRequest;
-import com.android.systemui.shared.plugins.PluginManager;
-import com.android.systemui.stackdivider.Divider;
-import com.android.systemui.statusbar.CommandQueue;
-import com.android.systemui.statusbar.KeyguardIndicationController;
-import com.android.systemui.statusbar.NavigationBarController;
-import com.android.systemui.statusbar.NotificationLockscreenUserManager;
-import com.android.systemui.statusbar.NotificationMediaManager;
-import com.android.systemui.statusbar.NotificationRemoteInputManager;
-import com.android.systemui.statusbar.NotificationShadeDepthController;
-import com.android.systemui.statusbar.NotificationViewHierarchyManager;
-import com.android.systemui.statusbar.PulseExpansionHandler;
-import com.android.systemui.statusbar.SuperStatusBarViewFactory;
-import com.android.systemui.statusbar.SysuiStatusBarStateController;
-import com.android.systemui.statusbar.VibratorHelper;
-import com.android.systemui.statusbar.dagger.StatusBarDependenciesModule;
-import com.android.systemui.statusbar.notification.DynamicPrivacyController;
-import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator;
-import com.android.systemui.statusbar.notification.VisualStabilityManager;
-import com.android.systemui.statusbar.notification.init.NotificationsController;
-import com.android.systemui.statusbar.notification.interruption.BypassHeadsUpNotifier;
-import com.android.systemui.statusbar.notification.interruption.NotificationAlertingManager;
-import com.android.systemui.statusbar.notification.interruption.NotificationInterruptStateProvider;
-import com.android.systemui.statusbar.notification.logging.NotificationLogger;
-import com.android.systemui.statusbar.notification.row.NotificationGutsManager;
-import com.android.systemui.statusbar.notification.row.NotificationRowModule;
-import com.android.systemui.statusbar.phone.AutoHideController;
-import com.android.systemui.statusbar.phone.BiometricUnlockController;
-import com.android.systemui.statusbar.phone.DozeParameters;
-import com.android.systemui.statusbar.phone.DozeScrimController;
-import com.android.systemui.statusbar.phone.DozeServiceHost;
-import com.android.systemui.statusbar.phone.HeadsUpManagerPhone;
-import com.android.systemui.statusbar.phone.KeyguardBypassController;
-import com.android.systemui.statusbar.phone.KeyguardDismissUtil;
-import com.android.systemui.statusbar.phone.LightBarController;
-import com.android.systemui.statusbar.phone.LightsOutNotifController;
-import com.android.systemui.statusbar.phone.LockscreenLockIconController;
-import com.android.systemui.statusbar.phone.LockscreenWallpaper;
-import com.android.systemui.statusbar.phone.NotificationGroupManager;
-import com.android.systemui.statusbar.phone.NotificationShadeWindowController;
-import com.android.systemui.statusbar.phone.PhoneStatusBarPolicy;
-import com.android.systemui.statusbar.phone.ScrimController;
-import com.android.systemui.statusbar.phone.ShadeController;
-import com.android.systemui.statusbar.phone.StatusBarIconController;
-import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
-import com.android.systemui.statusbar.phone.StatusBarNotificationActivityStarter;
-import com.android.systemui.statusbar.phone.StatusBarTouchableRegionManager;
-import com.android.systemui.statusbar.phone.dagger.StatusBarComponent;
-import com.android.systemui.statusbar.phone.dagger.StatusBarPhoneDependenciesModule;
-import com.android.systemui.statusbar.policy.BatteryController;
-import com.android.systemui.statusbar.policy.ConfigurationController;
-import com.android.systemui.statusbar.policy.ExtensionController;
-import com.android.systemui.statusbar.policy.KeyguardStateController;
-import com.android.systemui.statusbar.policy.NetworkController;
-import com.android.systemui.statusbar.policy.RemoteInputQuickSettingsDisabler;
-import com.android.systemui.statusbar.policy.UserInfoControllerImpl;
-import com.android.systemui.statusbar.policy.UserSwitcherController;
-import com.android.systemui.volume.VolumeComponent;
-
-import java.util.Optional;
-import java.util.concurrent.Executor;
-
-import javax.inject.Named;
-import javax.inject.Provider;
-import javax.inject.Singleton;
-
-import dagger.Lazy;
-import dagger.Module;
-import dagger.Provides;
-
-/**
- * Dagger Module providing {@link CarStatusBar}.
- */
-@Module(includes = {StatusBarDependenciesModule.class, StatusBarPhoneDependenciesModule.class,
-        NotificationRowModule.class})
-public class CarStatusBarModule {
-    /**
-     * Provides our instance of StatusBar which is considered optional.
-     */
-    @Provides
-    @Singleton
-    static CarStatusBar provideStatusBar(
-            Context context,
-            NotificationsController notificationsController,
-            LightBarController lightBarController,
-            AutoHideController autoHideController,
-            KeyguardUpdateMonitor keyguardUpdateMonitor,
-            StatusBarIconController statusBarIconController,
-            PulseExpansionHandler pulseExpansionHandler,
-            NotificationWakeUpCoordinator notificationWakeUpCoordinator,
-            KeyguardBypassController keyguardBypassController,
-            KeyguardStateController keyguardStateController,
-            HeadsUpManagerPhone headsUpManagerPhone,
-            DynamicPrivacyController dynamicPrivacyController,
-            BypassHeadsUpNotifier bypassHeadsUpNotifier,
-            FalsingManager falsingManager,
-            BroadcastDispatcher broadcastDispatcher,
-            RemoteInputQuickSettingsDisabler remoteInputQuickSettingsDisabler,
-            NotificationGutsManager notificationGutsManager,
-            NotificationLogger notificationLogger,
-            NotificationInterruptStateProvider notificationInterruptionStateProvider,
-            NotificationViewHierarchyManager notificationViewHierarchyManager,
-            KeyguardViewMediator keyguardViewMediator,
-            NotificationAlertingManager notificationAlertingManager,
-            DisplayMetrics displayMetrics,
-            MetricsLogger metricsLogger,
-            @UiBackground Executor uiBgExecutor,
-            NotificationMediaManager notificationMediaManager,
-            NotificationLockscreenUserManager lockScreenUserManager,
-            NotificationRemoteInputManager remoteInputManager,
-            UserSwitcherController userSwitcherController,
-            NetworkController networkController,
-            BatteryController batteryController,
-            SysuiColorExtractor colorExtractor,
-            ScreenLifecycle screenLifecycle,
-            WakefulnessLifecycle wakefulnessLifecycle,
-            SysuiStatusBarStateController statusBarStateController,
-            VibratorHelper vibratorHelper,
-            BubbleController bubbleController,
-            NotificationGroupManager groupManager,
-            VisualStabilityManager visualStabilityManager,
-            CarDeviceProvisionedController carDeviceProvisionedController,
-            NavigationBarController navigationBarController,
-            Lazy<AssistManager> assistManagerLazy,
-            ConfigurationController configurationController,
-            NotificationShadeWindowController notificationShadeWindowController,
-            LockscreenLockIconController lockscreenLockIconController,
-            DozeParameters dozeParameters,
-            ScrimController scrimController,
-            Lazy<LockscreenWallpaper> lockscreenWallpaperLazy,
-            Lazy<BiometricUnlockController> biometricUnlockControllerLazy,
-            DozeServiceHost dozeServiceHost,
-            PowerManager powerManager,
-            ScreenPinningRequest screenPinningRequest,
-            DozeScrimController dozeScrimController,
-            VolumeComponent volumeComponent,
-            CommandQueue commandQueue,
-            Optional<Recents> recentsOptional,
-            Provider<StatusBarComponent.Builder> statusBarComponentBuilder,
-            PluginManager pluginManager,
-            Optional<Divider> dividerOptional,
-            SuperStatusBarViewFactory superStatusBarViewFactory,
-            LightsOutNotifController lightsOutNotifController,
-            StatusBarNotificationActivityStarter.Builder
-                    statusBarNotificationActivityStarterBuilder,
-            ShadeController shadeController,
-            StatusBarKeyguardViewManager statusBarKeyguardViewManager,
-            ViewMediatorCallback viewMediatorCallback,
-            InitController initController,
-            DarkIconDispatcher darkIconDispatcher,
-            @Named(TIME_TICK_HANDLER_NAME) Handler timeTickHandler,
-            PluginDependencyProvider pluginDependencyProvider,
-            KeyguardDismissUtil keyguardDismissUtil,
-            ExtensionController extensionController,
-            UserInfoControllerImpl userInfoControllerImpl,
-            PhoneStatusBarPolicy phoneStatusBarPolicy,
-            KeyguardIndicationController keyguardIndicationController,
-            DismissCallbackRegistry dismissCallbackRegistry,
-            StatusBarTouchableRegionManager statusBarTouchableRegionManager,
-            Lazy<NotificationShadeDepthController> notificationShadeDepthControllerLazy,
-            CarNavigationBarController carNavigationBarController) {
-        return new CarStatusBar(
-                context,
-                notificationsController,
-                lightBarController,
-                autoHideController,
-                keyguardUpdateMonitor,
-                statusBarIconController,
-                pulseExpansionHandler,
-                notificationWakeUpCoordinator,
-                keyguardBypassController,
-                keyguardStateController,
-                headsUpManagerPhone,
-                dynamicPrivacyController,
-                bypassHeadsUpNotifier,
-                falsingManager,
-                broadcastDispatcher,
-                remoteInputQuickSettingsDisabler,
-                notificationGutsManager,
-                notificationLogger,
-                notificationInterruptionStateProvider,
-                notificationViewHierarchyManager,
-                keyguardViewMediator,
-                notificationAlertingManager,
-                displayMetrics,
-                metricsLogger,
-                uiBgExecutor,
-                notificationMediaManager,
-                lockScreenUserManager,
-                remoteInputManager,
-                userSwitcherController,
-                networkController,
-                batteryController,
-                colorExtractor,
-                screenLifecycle,
-                wakefulnessLifecycle,
-                statusBarStateController,
-                vibratorHelper,
-                bubbleController,
-                groupManager,
-                visualStabilityManager,
-                carDeviceProvisionedController,
-                navigationBarController,
-                assistManagerLazy,
-                configurationController,
-                notificationShadeWindowController,
-                lockscreenLockIconController,
-                dozeParameters,
-                scrimController,
-                lockscreenWallpaperLazy,
-                biometricUnlockControllerLazy,
-                dozeServiceHost,
-                powerManager,
-                screenPinningRequest,
-                dozeScrimController,
-                volumeComponent,
-                commandQueue,
-                recentsOptional,
-                statusBarComponentBuilder,
-                pluginManager,
-                dividerOptional,
-                superStatusBarViewFactory,
-                lightsOutNotifController,
-                statusBarNotificationActivityStarterBuilder,
-                shadeController,
-                statusBarKeyguardViewManager,
-                viewMediatorCallback,
-                initController,
-                darkIconDispatcher,
-                timeTickHandler,
-                pluginDependencyProvider,
-                keyguardDismissUtil,
-                extensionController,
-                userInfoControllerImpl,
-                phoneStatusBarPolicy,
-                keyguardIndicationController,
-                dismissCallbackRegistry,
-                statusBarTouchableRegionManager,
-                notificationShadeDepthControllerLazy,
-                carNavigationBarController);
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/ConnectedDeviceSignalController.java b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/ConnectedDeviceSignalController.java
deleted file mode 100644
index 3288927..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/ConnectedDeviceSignalController.java
+++ /dev/null
@@ -1,270 +0,0 @@
-/*
- * Copyright (C) 2018 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.statusbar.car;
-
-import static com.android.systemui.statusbar.phone.StatusBar.DEBUG;
-
-import android.bluetooth.BluetoothAdapter;
-import android.bluetooth.BluetoothDevice;
-import android.bluetooth.BluetoothHeadsetClient;
-import android.bluetooth.BluetoothProfile;
-import android.bluetooth.BluetoothProfile.ServiceListener;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.os.Bundle;
-import android.telephony.SignalStrength;
-import android.util.Log;
-import android.util.TypedValue;
-import android.view.View;
-import android.widget.ImageView;
-
-import com.android.settingslib.graph.SignalDrawable;
-import com.android.systemui.Dependency;
-import com.android.systemui.R;
-import com.android.systemui.statusbar.ScalingDrawableWrapper;
-import com.android.systemui.statusbar.policy.BluetoothController;
-
-/**
- * Controller that monitors signal strength for a device that is connected via bluetooth.
- */
-public class ConnectedDeviceSignalController extends BroadcastReceiver implements
-        BluetoothController.Callback {
-    private static final String TAG = "DeviceSignalCtlr";
-
-    /**
-     * The value that indicates if a network is unavailable. This value is according ot the
-     * Bluetooth HFP 1.5 spec, which indicates this value is one of two: 0 or 1. These stand
-     * for network unavailable and available respectively.
-     */
-    private static final int NETWORK_UNAVAILABLE = 0;
-    private static final int NETWORK_UNAVAILABLE_ICON_ID = R.drawable.stat_sys_signal_null;
-
-    /**
-     * All possible signal strength icons. According to the Bluetooth HFP 1.5 specification,
-     * signal strength is indicated by a value from 1-5, where these values represent the following:
-     *
-     * <p>0%% - 0, 1-25%% - 1, 26-50%% - 2, 51-75%% - 3, 76-99%% - 4, 100%% - 5
-     *
-     * <p>As a result, these are treated as an index into this array for the corresponding icon.
-     * Note that the icon is the same for 0 and 1.
-     */
-    private static final int[] SIGNAL_STRENGTH_ICONS = {
-            0,
-            0,
-            1,
-            2,
-            3,
-            4,
-    };
-
-    private static final int INVALID_SIGNAL = -1;
-
-    private final BluetoothAdapter mAdapter = BluetoothAdapter.getDefaultAdapter();
-    private final Context mContext;
-    private final BluetoothController mController;
-
-    private final View mSignalsView;
-    private final ImageView mNetworkSignalView;
-
-    private final float mIconScaleFactor;
-    private final SignalDrawable mSignalDrawable;
-
-    private BluetoothHeadsetClient mBluetoothHeadsetClient;
-    private final ServiceListener mHfpServiceListener = new ServiceListener() {
-        @Override
-        public void onServiceConnected(int profile, BluetoothProfile proxy) {
-            if (profile == BluetoothProfile.HEADSET_CLIENT) {
-                mBluetoothHeadsetClient = (BluetoothHeadsetClient) proxy;
-            }
-        }
-
-        @Override
-        public void onServiceDisconnected(int profile) {
-            if (profile == BluetoothProfile.HEADSET_CLIENT) {
-                mBluetoothHeadsetClient = null;
-            }
-        }
-    };
-
-    public ConnectedDeviceSignalController(Context context, View signalsView) {
-        mContext = context;
-        mController = Dependency.get(BluetoothController.class);
-
-        mSignalsView = signalsView;
-        mNetworkSignalView = (ImageView)
-                mSignalsView.findViewById(R.id.connected_device_network_signal);
-
-        TypedValue typedValue = new TypedValue();
-        context.getResources().getValue(R.dimen.status_bar_icon_scale_factor, typedValue, true);
-        mIconScaleFactor = typedValue.getFloat();
-        mSignalDrawable = new SignalDrawable(mNetworkSignalView.getContext());
-        mNetworkSignalView.setImageDrawable(
-                new ScalingDrawableWrapper(mSignalDrawable, mIconScaleFactor));
-
-        if (mAdapter == null) {
-            return;
-        }
-
-        mAdapter.getProfileProxy(context.getApplicationContext(), mHfpServiceListener,
-                BluetoothProfile.HEADSET_CLIENT);
-    }
-
-    public void startListening() {
-        IntentFilter filter = new IntentFilter();
-        filter.addAction(BluetoothHeadsetClient.ACTION_CONNECTION_STATE_CHANGED);
-        filter.addAction(BluetoothHeadsetClient.ACTION_AG_EVENT);
-        mContext.registerReceiver(this, filter);
-
-        mController.addCallback(this);
-    }
-
-    public void stopListening() {
-        mContext.unregisterReceiver(this);
-        mController.removeCallback(this);
-    }
-
-    @Override
-    public void onBluetoothDevicesChanged() {
-        // Nothing to do here because this Controller is not displaying a list of possible
-        // bluetooth devices.
-    }
-
-    @Override
-    public void onBluetoothStateChange(boolean enabled) {
-        if (DEBUG) {
-            Log.d(TAG, "onBluetoothStateChange(). enabled: " + enabled);
-        }
-
-        // Only need to handle the case if bluetooth has been disabled, in which case the
-        // signal indicators are hidden. If bluetooth has been enabled, then this class should
-        // receive updates to the connection state via onReceive().
-        if (!enabled) {
-            mNetworkSignalView.setVisibility(View.GONE);
-            mSignalsView.setVisibility(View.GONE);
-        }
-    }
-
-    @Override
-    public void onReceive(Context context, Intent intent) {
-        String action = intent.getAction();
-
-        if (DEBUG) {
-            Log.d(TAG, "onReceive(). action: " + action);
-        }
-
-        if (BluetoothHeadsetClient.ACTION_AG_EVENT.equals(action)) {
-            if (DEBUG) {
-                Log.d(TAG, "Received ACTION_AG_EVENT");
-            }
-
-            processActionAgEvent(intent);
-        } else if (BluetoothHeadsetClient.ACTION_CONNECTION_STATE_CHANGED.equals(action)) {
-            int newState = intent.getIntExtra(BluetoothProfile.EXTRA_STATE, -1);
-
-            if (DEBUG) {
-                int oldState = intent.getIntExtra(BluetoothProfile.EXTRA_PREVIOUS_STATE, -1);
-                Log.d(TAG, "ACTION_CONNECTION_STATE_CHANGED event: "
-                        + oldState + " -> " + newState);
-            }
-            BluetoothDevice device =
-                    (BluetoothDevice) intent.getExtra(BluetoothDevice.EXTRA_DEVICE);
-            updateViewVisibility(device, newState);
-        }
-    }
-
-    /**
-     * Processes an {@link Intent} that had an action of
-     * {@link BluetoothHeadsetClient#ACTION_AG_EVENT}.
-     */
-    private void processActionAgEvent(Intent intent) {
-        int networkStatus = intent.getIntExtra(BluetoothHeadsetClient.EXTRA_NETWORK_STATUS,
-                INVALID_SIGNAL);
-        if (networkStatus != INVALID_SIGNAL) {
-            if (DEBUG) {
-                Log.d(TAG, "EXTRA_NETWORK_STATUS: " + " " + networkStatus);
-            }
-
-            if (networkStatus == NETWORK_UNAVAILABLE) {
-                setNetworkSignalIcon(NETWORK_UNAVAILABLE_ICON_ID);
-            }
-        }
-
-        int signalStrength = intent.getIntExtra(
-                BluetoothHeadsetClient.EXTRA_NETWORK_SIGNAL_STRENGTH, INVALID_SIGNAL);
-        if (signalStrength != INVALID_SIGNAL) {
-            if (DEBUG) {
-                Log.d(TAG, "EXTRA_NETWORK_SIGNAL_STRENGTH: " + signalStrength);
-            }
-
-            setNetworkSignalIcon(SIGNAL_STRENGTH_ICONS[signalStrength]);
-        }
-
-        int roamingStatus = intent.getIntExtra(BluetoothHeadsetClient.EXTRA_NETWORK_ROAMING,
-                INVALID_SIGNAL);
-        if (roamingStatus != INVALID_SIGNAL) {
-            if (DEBUG) {
-                Log.d(TAG, "EXTRA_NETWORK_ROAMING: " + roamingStatus);
-            }
-        }
-    }
-
-    private void setNetworkSignalIcon(int level) {
-        // Setting the icon on a child view of mSignalView, so toggle this container visible.
-        mSignalsView.setVisibility(View.VISIBLE);
-
-        mSignalDrawable.setLevel(SignalDrawable.getState(level,
-                SignalStrength.NUM_SIGNAL_STRENGTH_BINS, false));
-        mNetworkSignalView.setVisibility(View.VISIBLE);
-    }
-
-    private void updateViewVisibility(BluetoothDevice device, int newState) {
-        if (newState == BluetoothProfile.STATE_CONNECTED) {
-            if (DEBUG) {
-                Log.d(TAG, "Device connected");
-            }
-
-            if (mBluetoothHeadsetClient == null || device == null) {
-                return;
-            }
-
-            // Check if battery information is available and immediately update.
-            Bundle featuresBundle = mBluetoothHeadsetClient.getCurrentAgEvents(device);
-            if (featuresBundle == null) {
-                return;
-            }
-
-            int signalStrength = featuresBundle.getInt(
-                    BluetoothHeadsetClient.EXTRA_NETWORK_SIGNAL_STRENGTH, INVALID_SIGNAL);
-            if (signalStrength != INVALID_SIGNAL) {
-                if (DEBUG) {
-                    Log.d(TAG, "EXTRA_NETWORK_SIGNAL_STRENGTH: " + signalStrength);
-                }
-
-                setNetworkSignalIcon(SIGNAL_STRENGTH_ICONS[signalStrength]);
-            }
-        } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
-            if (DEBUG) {
-                Log.d(TAG, "Device disconnected");
-            }
-
-            mNetworkSignalView.setVisibility(View.GONE);
-            mSignalsView.setVisibility(View.GONE);
-        }
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/PowerManagerHelper.java b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/PowerManagerHelper.java
deleted file mode 100644
index 615a7bae..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/PowerManagerHelper.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (C) 2019 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.statusbar.car;
-
-import android.annotation.NonNull;
-import android.car.Car;
-import android.car.hardware.power.CarPowerManager;
-import android.car.hardware.power.CarPowerManager.CarPowerStateListener;
-import android.util.Log;
-
-import com.android.systemui.car.CarServiceProvider;
-
-import javax.inject.Inject;
-import javax.inject.Singleton;
-
-/**
- * Helper class for connecting to the {@link CarPowerManager} and listening for power state changes.
- */
-@Singleton
-public class PowerManagerHelper {
-    public static final String TAG = "PowerManagerHelper";
-
-    private final CarServiceProvider mCarServiceProvider;
-
-    private CarPowerManager mCarPowerManager;
-    private CarPowerStateListener mCarPowerStateListener;
-
-    private final CarServiceProvider.CarServiceOnConnectedListener mCarServiceLifecycleListener;
-
-    @Inject
-    public PowerManagerHelper(CarServiceProvider carServiceProvider) {
-        mCarServiceProvider = carServiceProvider;
-        mCarServiceLifecycleListener = car -> {
-            Log.d(TAG, "Car Service connected");
-            mCarPowerManager = (CarPowerManager) car.getCarManager(Car.POWER_SERVICE);
-            if (mCarPowerManager != null) {
-                mCarPowerManager.setListener(mCarPowerStateListener);
-            } else {
-                Log.e(TAG, "CarPowerManager service not available");
-            }
-        };
-    }
-
-    /**
-     * Sets a {@link CarPowerStateListener}. Should be set before {@link #connectToCarService()}.
-     */
-    public void setCarPowerStateListener(@NonNull CarPowerStateListener listener) {
-        mCarPowerStateListener = listener;
-    }
-
-    /**
-     * Connect to Car service.
-     */
-    public void connectToCarService() {
-        mCarServiceProvider.addListener(mCarServiceLifecycleListener);
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/statusbar/hvac/AnimatedTemperatureView.java b/packages/CarSystemUI/src/com/android/systemui/statusbar/hvac/AnimatedTemperatureView.java
deleted file mode 100644
index 908aaad..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/statusbar/hvac/AnimatedTemperatureView.java
+++ /dev/null
@@ -1,278 +0,0 @@
-/*
- * Copyright (c) 2018 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.statusbar.hvac;
-
-import android.animation.ObjectAnimator;
-import android.annotation.SuppressLint;
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.graphics.Color;
-import android.graphics.Rect;
-import android.graphics.drawable.ColorDrawable;
-import android.util.AttributeSet;
-import android.util.Property;
-import android.view.Gravity;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.ViewTreeObserver;
-import android.widget.FrameLayout;
-import android.widget.ImageView;
-import android.widget.TextSwitcher;
-import android.widget.TextView;
-
-import com.android.systemui.R;
-import com.android.systemui.navigationbar.car.hvac.TemperatureView;
-
-/**
- * Simple text display of HVAC properties, It is designed to show mTemperature and is configured in
- * the XML.
- * XML properties:
- * hvacPropertyId - Example: CarHvacManager.ID_ZONED_TEMP_SETPOINT (16385)
- * hvacAreaId - Example: VehicleSeat.SEAT_ROW_1_LEFT (1)
- * hvacTempFormat - Example: "%.1f\u00B0" (1 decimal and the degree symbol)
- * hvacOrientaion = Example: left
- */
-public class AnimatedTemperatureView extends FrameLayout implements TemperatureView {
-
-    private static final float TEMPERATURE_EQUIVALENT_DELTA = .01f;
-    private static final Property<ColorDrawable, Integer> COLOR_PROPERTY =
-            new Property<ColorDrawable, Integer>(Integer.class, "color") {
-
-                @Override
-                public Integer get(ColorDrawable object) {
-                    return object.getColor();
-                }
-
-                @Override
-                public void set(ColorDrawable object, Integer value) {
-                    object.setColor(value);
-                }
-            };
-
-    static boolean isHorizontal(int gravity) {
-        return Gravity.isHorizontal(gravity)
-                && (gravity & Gravity.HORIZONTAL_GRAVITY_MASK) != Gravity.CENTER_HORIZONTAL;
-    }
-
-    @SuppressLint("RtlHardcoded")
-    static boolean isLeft(int gravity, int layoutDirection) {
-        return Gravity
-                .getAbsoluteGravity(gravity & Gravity.HORIZONTAL_GRAVITY_MASK, layoutDirection)
-                == Gravity.LEFT;
-    }
-
-    static boolean isVertical(int gravity) {
-        return Gravity.isVertical(gravity)
-                && (gravity & Gravity.VERTICAL_GRAVITY_MASK) != Gravity.CENTER_VERTICAL;
-    }
-
-    static boolean isTop(int gravity) {
-        return (gravity & Gravity.VERTICAL_GRAVITY_MASK) == Gravity.TOP;
-    }
-
-    private final int mAreaId;
-    private final int mPropertyId;
-    private final int mPivotOffset;
-    private final int mGravity;
-    private final int mTextAppearanceRes;
-    private final int mMinEms;
-    private final Rect mPaddingRect;
-    private final float mMinValue;
-    private final float mMaxValue;
-
-    private final ColorDrawable mBackgroundColor;
-
-    private final TemperatureColorStore mColorStore = new TemperatureColorStore();
-    private final TemperatureBackgroundAnimator mBackgroundAnimator;
-    private final TemperatureTextAnimator mTextAnimator;
-    boolean mDisplayInFahrenheit = false;
-
-    public AnimatedTemperatureView(Context context, AttributeSet attrs) {
-        super(context, attrs);
-        TypedArray typedArray = context.obtainStyledAttributes(attrs,
-                R.styleable.AnimatedTemperatureView);
-        mAreaId = typedArray.getInt(R.styleable.AnimatedTemperatureView_hvacAreaId, -1);
-        mPropertyId = typedArray.getInt(R.styleable.AnimatedTemperatureView_hvacPropertyId, -1);
-        mPivotOffset =
-                typedArray.getDimensionPixelOffset(
-                        R.styleable.AnimatedTemperatureView_hvacPivotOffset, 0);
-        mGravity = typedArray.getInt(R.styleable.AnimatedTemperatureView_android_gravity,
-                Gravity.START);
-        mTextAppearanceRes =
-                typedArray.getResourceId(R.styleable.AnimatedTemperatureView_android_textAppearance,
-                        0);
-        mMinEms = typedArray.getInteger(R.styleable.AnimatedTemperatureView_android_minEms, 0);
-        mMinValue = typedArray.getFloat(R.styleable.AnimatedTemperatureView_hvacMinValue,
-                Float.NaN);
-        mMaxValue = typedArray.getFloat(R.styleable.AnimatedTemperatureView_hvacMaxValue,
-                Float.NaN);
-
-
-        mPaddingRect =
-                new Rect(getPaddingLeft(), getPaddingTop(), getPaddingRight(), getPaddingBottom());
-        setPadding(0, 0, 0, 0);
-
-        setClipChildren(false);
-        setClipToPadding(false);
-
-        // init Views
-        TextSwitcher textSwitcher = new TextSwitcher(context);
-        textSwitcher.setFactory(this::generateTextView);
-        ImageView background = new ImageView(context);
-        mBackgroundColor = new ColorDrawable(Color.TRANSPARENT);
-        background.setImageDrawable(mBackgroundColor);
-        background.setVisibility(View.GONE);
-
-        mBackgroundAnimator = new TemperatureBackgroundAnimator(this, background);
-
-
-        String format = typedArray.getString(R.styleable.AnimatedTemperatureView_hvacTempFormat);
-        format = (format == null) ? "%.1f\u00B0" : format;
-        CharSequence minText = typedArray.getString(
-                R.styleable.AnimatedTemperatureView_hvacMinText);
-        CharSequence maxText = typedArray.getString(
-                R.styleable.AnimatedTemperatureView_hvacMaxText);
-        mTextAnimator = new TemperatureTextAnimator(this, textSwitcher, format, mPivotOffset,
-                minText, maxText);
-
-        addView(background, ViewGroup.LayoutParams.MATCH_PARENT,
-                ViewGroup.LayoutParams.MATCH_PARENT);
-        addView(textSwitcher, ViewGroup.LayoutParams.MATCH_PARENT,
-                ViewGroup.LayoutParams.MATCH_PARENT);
-
-        typedArray.recycle();
-    }
-
-
-    private TextView generateTextView() {
-        TextView textView = new TextView(getContext());
-        textView.setTextAppearance(mTextAppearanceRes);
-        textView.setAllCaps(true);
-        textView.setMinEms(mMinEms);
-        textView.setGravity(mGravity);
-        textView.setPadding(mPaddingRect.left, mPaddingRect.top, mPaddingRect.right,
-                mPaddingRect.bottom);
-        textView.getViewTreeObserver()
-                .addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
-                    @Override
-                    public boolean onPreDraw() {
-                        if (isHorizontal(mGravity)) {
-                            if (isLeft(mGravity, getLayoutDirection())) {
-                                textView.setPivotX(-mPivotOffset);
-                            } else {
-                                textView.setPivotX(textView.getWidth() + mPivotOffset);
-                            }
-                        }
-                        textView.getViewTreeObserver().removeOnPreDrawListener(this);
-                        return true;
-                    }
-                });
-        textView.setLayoutParams(new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
-                ViewGroup.LayoutParams.MATCH_PARENT));
-
-        return textView;
-    }
-
-    /**
-     * Formats the float for display
-     *
-     * @param temp - The current temp or NaN
-     */
-    @Override
-    public void setTemp(float temp) {
-        if (mDisplayInFahrenheit) {
-            temp = convertToFahrenheit(temp);
-        }
-        mTextAnimator.setTemp(temp);
-        if (Float.isNaN(temp)) {
-            mBackgroundAnimator.hideCircle();
-            return;
-        }
-        int color;
-        if (isMinValue(temp)) {
-            color = mColorStore.getMinColor();
-        } else if (isMaxValue(temp)) {
-            color = mColorStore.getMaxColor();
-        } else {
-            color = mColorStore.getColorForTemperature(temp);
-        }
-        if (mBackgroundAnimator.isOpen()) {
-            ObjectAnimator colorAnimator =
-                    ObjectAnimator.ofInt(mBackgroundColor, COLOR_PROPERTY, color);
-            colorAnimator.setEvaluator((fraction, startValue, endValue) -> mColorStore
-                    .lerpColor(fraction, (int) startValue, (int) endValue));
-            colorAnimator.start();
-        } else {
-            mBackgroundColor.setColor(color);
-        }
-
-        mBackgroundAnimator.animateOpen();
-    }
-
-    @Override
-    public void setDisplayInFahrenheit(boolean displayInFahrenheit) {
-        mDisplayInFahrenheit = displayInFahrenheit;
-    }
-
-    boolean isMinValue(float temp) {
-        return !Float.isNaN(mMinValue) && isApproxEqual(temp, mMinValue);
-    }
-
-    boolean isMaxValue(float temp) {
-        return !Float.isNaN(mMaxValue) && isApproxEqual(temp, mMaxValue);
-    }
-
-    private boolean isApproxEqual(float left, float right) {
-        return Math.abs(left - right) <= TEMPERATURE_EQUIVALENT_DELTA;
-    }
-
-    int getGravity() {
-        return mGravity;
-    }
-
-    int getPivotOffset() {
-        return mPivotOffset;
-    }
-
-    Rect getPaddingRect() {
-        return mPaddingRect;
-    }
-
-    /**
-     * @return propertiyId  Example: CarHvacManager.ID_ZONED_TEMP_SETPOINT (358614275)
-     */
-    @Override
-    public int getPropertyId() {
-        return mPropertyId;
-    }
-
-    /**
-     * @return hvac AreaId - Example: VehicleSeat.SEAT_ROW_1_LEFT (1)
-     */
-    @Override
-    public int getAreaId() {
-        return mAreaId;
-    }
-
-    @Override
-    protected void onDetachedFromWindow() {
-        super.onDetachedFromWindow();
-        mBackgroundAnimator.stopAnimations();
-    }
-
-}
-
diff --git a/packages/CarSystemUI/src/com/android/systemui/statusbar/hvac/TemperatureBackgroundAnimator.java b/packages/CarSystemUI/src/com/android/systemui/statusbar/hvac/TemperatureBackgroundAnimator.java
deleted file mode 100644
index 3c6d623..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/statusbar/hvac/TemperatureBackgroundAnimator.java
+++ /dev/null
@@ -1,340 +0,0 @@
-/*
- * Copyright (c) 2018 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.statusbar.hvac;
-
-import static com.android.systemui.statusbar.hvac.AnimatedTemperatureView.isHorizontal;
-import static com.android.systemui.statusbar.hvac.AnimatedTemperatureView.isLeft;
-import static com.android.systemui.statusbar.hvac.AnimatedTemperatureView.isTop;
-import static com.android.systemui.statusbar.hvac.AnimatedTemperatureView.isVertical;
-
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.animation.AnimatorSet;
-import android.animation.ObjectAnimator;
-import android.annotation.IntDef;
-import android.graphics.Rect;
-import android.view.View;
-import android.view.ViewAnimationUtils;
-import android.view.animation.AnticipateInterpolator;
-import android.widget.ImageView;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Controls circular reveal animation of temperature background
- */
-class TemperatureBackgroundAnimator {
-
-    private static final AnticipateInterpolator ANTICIPATE_INTERPOLATOR =
-            new AnticipateInterpolator();
-    private static final float MAX_OPACITY = .6f;
-
-    private final View mAnimatedView;
-
-    private int mPivotX;
-    private int mPivotY;
-    private int mGoneRadius;
-    private int mOvershootRadius;
-    private int mRestingRadius;
-    private int mBumpRadius;
-
-    @CircleState
-    private int mCircleState;
-
-    private Animator mCircularReveal;
-    private boolean mAnimationsReady;
-
-    @IntDef({CircleState.GONE, CircleState.ENTERING, CircleState.OVERSHOT, CircleState.RESTING,
-            CircleState.RESTED, CircleState.BUMPING, CircleState.BUMPED, CircleState.EXITING})
-    private @interface CircleState {
-        int GONE = 0;
-        int ENTERING = 1;
-        int OVERSHOT = 2;
-        int RESTING = 3;
-        int RESTED = 4;
-        int BUMPING = 5;
-        int BUMPED = 6;
-        int EXITING = 7;
-    }
-
-    TemperatureBackgroundAnimator(
-            AnimatedTemperatureView parent,
-            ImageView animatedView) {
-        mAnimatedView = animatedView;
-        mAnimatedView.setAlpha(0);
-
-        parent.addOnLayoutChangeListener(
-                (v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) ->
-                        setupAnimations(parent.getGravity(), parent.getPivotOffset(),
-                                parent.getPaddingRect(), parent.getWidth(), parent.getHeight()));
-    }
-
-    private void setupAnimations(int gravity, int pivotOffset, Rect paddingRect,
-            int width, int height) {
-        int padding;
-        if (isHorizontal(gravity)) {
-            mGoneRadius = pivotOffset;
-            if (isLeft(gravity, mAnimatedView.getLayoutDirection())) {
-                mPivotX = -pivotOffset;
-                padding = paddingRect.right;
-            } else {
-                mPivotX = width + pivotOffset;
-                padding = paddingRect.left;
-            }
-            mPivotY = height / 2;
-            mOvershootRadius = pivotOffset + width;
-        } else if (isVertical(gravity)) {
-            mGoneRadius = pivotOffset;
-            if (isTop(gravity)) {
-                mPivotY = -pivotOffset;
-                padding = paddingRect.bottom;
-            } else {
-                mPivotY = height + pivotOffset;
-                padding = paddingRect.top;
-            }
-            mPivotX = width / 2;
-            mOvershootRadius = pivotOffset + height;
-        } else {
-            mPivotX = width / 2;
-            mPivotY = height / 2;
-            mGoneRadius = 0;
-            if (width > height) {
-                mOvershootRadius = height;
-                padding = Math.max(paddingRect.top, paddingRect.bottom);
-            } else {
-                mOvershootRadius = width;
-                padding = Math.max(paddingRect.left, paddingRect.right);
-            }
-        }
-        mRestingRadius = mOvershootRadius - padding;
-        mBumpRadius = mOvershootRadius - padding / 3;
-        mAnimationsReady = true;
-    }
-
-    boolean isOpen() {
-        return mCircleState != CircleState.GONE;
-    }
-
-    void animateOpen() {
-        if (!mAnimationsReady
-                || !mAnimatedView.isAttachedToWindow()
-                || mCircleState == CircleState.ENTERING) {
-            return;
-        }
-
-        AnimatorSet set = new AnimatorSet();
-        List<Animator> animators = new ArrayList<>();
-        switch (mCircleState) {
-            case CircleState.ENTERING:
-                throw new AssertionError("Should not be able to reach this statement");
-            case CircleState.GONE: {
-                Animator startCircle = createEnterAnimator();
-                markState(startCircle, CircleState.ENTERING);
-                animators.add(startCircle);
-                Animator holdOvershoot = ViewAnimationUtils
-                        .createCircularReveal(mAnimatedView, mPivotX, mPivotY, mOvershootRadius,
-                                mOvershootRadius);
-                holdOvershoot.setDuration(50);
-                markState(holdOvershoot, CircleState.OVERSHOT);
-                animators.add(holdOvershoot);
-                Animator rest = ViewAnimationUtils
-                        .createCircularReveal(mAnimatedView, mPivotX, mPivotY, mOvershootRadius,
-                                mRestingRadius);
-                markState(rest, CircleState.RESTING);
-                animators.add(rest);
-                Animator holdRest = ViewAnimationUtils
-                        .createCircularReveal(mAnimatedView, mPivotX, mPivotY, mRestingRadius,
-                                mRestingRadius);
-                markState(holdRest, CircleState.RESTED);
-                holdRest.setDuration(1000);
-                animators.add(holdRest);
-                Animator exit = createExitAnimator(mRestingRadius);
-                markState(exit, CircleState.EXITING);
-                animators.add(exit);
-            }
-            break;
-            case CircleState.RESTED:
-            case CircleState.RESTING:
-            case CircleState.EXITING:
-            case CircleState.OVERSHOT:
-                int startRadius =
-                        mCircleState == CircleState.OVERSHOT ? mOvershootRadius : mRestingRadius;
-                Animator bump = ViewAnimationUtils
-                        .createCircularReveal(mAnimatedView, mPivotX, mPivotY, startRadius,
-                                mBumpRadius);
-                bump.setDuration(50);
-                markState(bump, CircleState.BUMPING);
-                animators.add(bump);
-                // fallthrough intentional
-            case CircleState.BUMPED:
-            case CircleState.BUMPING:
-                Animator holdBump = ViewAnimationUtils
-                        .createCircularReveal(mAnimatedView, mPivotX, mPivotY, mBumpRadius,
-                                mBumpRadius);
-                holdBump.setDuration(100);
-                markState(holdBump, CircleState.BUMPED);
-                animators.add(holdBump);
-                Animator rest = ViewAnimationUtils
-                        .createCircularReveal(mAnimatedView, mPivotX, mPivotY, mBumpRadius,
-                                mRestingRadius);
-                markState(rest, CircleState.RESTING);
-                animators.add(rest);
-                Animator holdRest = ViewAnimationUtils
-                        .createCircularReveal(mAnimatedView, mPivotX, mPivotY, mRestingRadius,
-                                mRestingRadius);
-                holdRest.setDuration(1000);
-                markState(holdRest, CircleState.RESTED);
-                animators.add(holdRest);
-                Animator exit = createExitAnimator(mRestingRadius);
-                markState(exit, CircleState.EXITING);
-                animators.add(exit);
-                break;
-        }
-        set.playSequentially(animators);
-        set.addListener(new AnimatorListenerAdapter() {
-            private boolean mCanceled = false;
-
-            @Override
-            public void onAnimationStart(Animator animation) {
-                if (mCircularReveal != null) {
-                    mCircularReveal.cancel();
-                }
-                mCircularReveal = animation;
-                mAnimatedView.setVisibility(View.VISIBLE);
-            }
-
-            @Override
-            public void onAnimationCancel(Animator animation) {
-                mCanceled = true;
-            }
-
-            @Override
-            public void onAnimationEnd(Animator animation) {
-                if (mCanceled) {
-                    return;
-                }
-                mCircularReveal = null;
-                mCircleState = CircleState.GONE;
-                mAnimatedView.setVisibility(View.GONE);
-            }
-        });
-
-        set.start();
-    }
-
-    private Animator createEnterAnimator() {
-        AnimatorSet animatorSet = new AnimatorSet();
-        Animator circularReveal = ViewAnimationUtils
-                .createCircularReveal(mAnimatedView, mPivotX, mPivotY, mGoneRadius,
-                        mOvershootRadius);
-        Animator fade = ObjectAnimator.ofFloat(mAnimatedView, View.ALPHA, MAX_OPACITY);
-        animatorSet.playTogether(circularReveal, fade);
-        return animatorSet;
-    }
-
-    private Animator createExitAnimator(int startRadius) {
-        AnimatorSet animatorSet = new AnimatorSet();
-        Animator circularHide = ViewAnimationUtils
-                .createCircularReveal(mAnimatedView, mPivotX, mPivotY, startRadius,
-                        (mGoneRadius + startRadius) / 2);
-        circularHide.setInterpolator(ANTICIPATE_INTERPOLATOR);
-        Animator fade = ObjectAnimator.ofFloat(mAnimatedView, View.ALPHA, 0);
-        fade.setStartDelay(50);
-        animatorSet.playTogether(circularHide, fade);
-        return animatorSet;
-    }
-
-    void hideCircle() {
-        if (!mAnimationsReady || mCircleState == CircleState.GONE
-                || mCircleState == CircleState.EXITING) {
-            return;
-        }
-
-        int startRadius;
-        switch (mCircleState) {
-            // Unreachable, but here to exhaust switch cases
-            //noinspection ConstantConditions
-            case CircleState.EXITING:
-                //noinspection ConstantConditions
-            case CircleState.GONE:
-                throw new AssertionError("Should not be able to reach this statement");
-            case CircleState.BUMPED:
-            case CircleState.BUMPING:
-                startRadius = mBumpRadius;
-                break;
-            case CircleState.OVERSHOT:
-                startRadius = mOvershootRadius;
-                break;
-            case CircleState.ENTERING:
-            case CircleState.RESTED:
-            case CircleState.RESTING:
-                startRadius = mRestingRadius;
-                break;
-            default:
-                throw new IllegalStateException("Unknown CircleState: " + mCircleState);
-        }
-
-        Animator hideAnimation = createExitAnimator(startRadius);
-        if (startRadius == mRestingRadius) {
-            hideAnimation.setInterpolator(ANTICIPATE_INTERPOLATOR);
-        }
-        hideAnimation.addListener(new AnimatorListenerAdapter() {
-            private boolean mCanceled = false;
-
-            @Override
-            public void onAnimationStart(Animator animation) {
-                mCircleState = CircleState.EXITING;
-                if (mCircularReveal != null) {
-                    mCircularReveal.cancel();
-                }
-                mCircularReveal = animation;
-            }
-
-            @Override
-            public void onAnimationCancel(Animator animation) {
-                mCanceled = true;
-            }
-
-            @Override
-            public void onAnimationEnd(Animator animation) {
-                if (mCanceled) {
-                    return;
-                }
-                mCircularReveal = null;
-                mCircleState = CircleState.GONE;
-                mAnimatedView.setVisibility(View.GONE);
-            }
-        });
-        hideAnimation.start();
-    }
-
-    void stopAnimations() {
-        if (mCircularReveal != null) {
-            mCircularReveal.end();
-        }
-    }
-
-    private void markState(Animator animator, @CircleState int startState) {
-        animator.addListener(new AnimatorListenerAdapter() {
-            @Override
-            public void onAnimationStart(Animator animation) {
-                mCircleState = startState;
-            }
-        });
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/statusbar/hvac/TemperatureColorStore.java b/packages/CarSystemUI/src/com/android/systemui/statusbar/hvac/TemperatureColorStore.java
deleted file mode 100644
index a40ffaf..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/statusbar/hvac/TemperatureColorStore.java
+++ /dev/null
@@ -1,202 +0,0 @@
-/*
- * Copyright (c) 2018 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.statusbar.hvac;
-
-import android.graphics.Color;
-
-/**
- * Contains the logic for mapping colors to temperatures
- */
-class TemperatureColorStore {
-
-    private static class TemperatureColorValue {
-        final float mTemperature;
-        final int mColor;
-
-        private TemperatureColorValue(float temperature, int color) {
-            this.mTemperature = temperature;
-            this.mColor = color;
-        }
-
-        float getTemperature() {
-            return mTemperature;
-        }
-
-        int getColor() {
-            return mColor;
-        }
-    }
-
-    private static TemperatureColorValue tempToColor(float temperature, int color) {
-        return new TemperatureColorValue(temperature, color);
-    }
-
-    private static final int COLOR_COLDEST = 0xFF406DFF;
-    private static final int COLOR_COLD = 0xFF4094FF;
-    private static final int COLOR_NEUTRAL = 0xFFF4F4F4;
-    private static final int COLOR_WARM = 0xFFFF550F;
-    private static final int COLOR_WARMEST = 0xFFFF0000;
-    // must be sorted by temperature
-    private static final TemperatureColorValue[] sTemperatureColorValues =
-            {
-                    // Celsius
-                    tempToColor(19, COLOR_COLDEST),
-                    tempToColor(21, COLOR_COLD),
-                    tempToColor(23, COLOR_NEUTRAL),
-                    tempToColor(25, COLOR_WARM),
-                    tempToColor(27, COLOR_WARMEST),
-
-                    // Switch over
-                    tempToColor(45, COLOR_WARMEST),
-                    tempToColor(45.00001f, COLOR_COLDEST),
-
-                    // Farenheight
-                    tempToColor(66, COLOR_COLDEST),
-                    tempToColor(70, COLOR_COLD),
-                    tempToColor(74, COLOR_NEUTRAL),
-                    tempToColor(76, COLOR_WARM),
-                    tempToColor(80, COLOR_WARMEST)
-            };
-
-    private static final int COLOR_UNSET = Color.BLACK;
-
-    private final float[] mTempHsv1 = new float[3];
-    private final float[] mTempHsv2 = new float[3];
-    private final float[] mTempHsv3 = new float[3];
-
-    int getMinColor() {
-        return COLOR_COLDEST;
-    }
-
-    int getMaxColor() {
-        return COLOR_WARMEST;
-    }
-
-    int getColorForTemperature(float temperature) {
-        if (Float.isNaN(temperature)) {
-            return COLOR_UNSET;
-        }
-        TemperatureColorValue bottomValue = sTemperatureColorValues[0];
-        if (temperature <= bottomValue.getTemperature()) {
-            return bottomValue.getColor();
-        }
-        TemperatureColorValue topValue =
-                sTemperatureColorValues[sTemperatureColorValues.length - 1];
-        if (temperature >= topValue.getTemperature()) {
-            return topValue.getColor();
-        }
-
-        int index = binarySearch(temperature);
-        if (index >= 0) {
-            return sTemperatureColorValues[index].getColor();
-        }
-
-        index = -index - 1; // move to the insertion point
-
-        TemperatureColorValue startValue = sTemperatureColorValues[index - 1];
-        TemperatureColorValue endValue = sTemperatureColorValues[index];
-        float fraction = (temperature - startValue.getTemperature()) / (endValue.getTemperature()
-                - startValue.getTemperature());
-        return lerpColor(fraction, startValue.getColor(), endValue.getColor());
-    }
-
-    int lerpColor(float fraction, int startColor, int endColor) {
-        float[] startHsv = mTempHsv1;
-        Color.colorToHSV(startColor, startHsv);
-        float[] endHsv = mTempHsv2;
-        Color.colorToHSV(endColor, endHsv);
-
-        // If a target color is white/gray, it should use the same hue as the other target
-        if (startHsv[1] == 0) {
-            startHsv[0] = endHsv[0];
-        }
-        if (endHsv[1] == 0) {
-            endHsv[0] = startHsv[0];
-        }
-
-        float[] outColor = mTempHsv3;
-        outColor[0] = hueLerp(fraction, startHsv[0], endHsv[0]);
-        outColor[1] = lerp(fraction, startHsv[1], endHsv[1]);
-        outColor[2] = lerp(fraction, startHsv[2], endHsv[2]);
-
-        return Color.HSVToColor(outColor);
-    }
-
-    private float hueLerp(float fraction, float start, float end) {
-        // If in flat part of curve, no interpolation necessary
-        if (start == end) {
-            return start;
-        }
-
-        // If the hues are more than 180 degrees apart, go the other way around the color wheel
-        // by moving the smaller value above 360
-        if (Math.abs(start - end) > 180f) {
-            if (start < end) {
-                start += 360f;
-            } else {
-                end += 360f;
-            }
-        }
-        // Lerp and ensure the final output is within [0, 360)
-        return lerp(fraction, start, end) % 360f;
-
-    }
-
-    private float lerp(float fraction, float start, float end) {
-        // If in flat part of curve, no interpolation necessary
-        if (start == end) {
-            return start;
-        }
-
-        // If outside bounds, use boundary value
-        if (fraction >= 1) {
-            return end;
-        }
-        if (fraction <= 0) {
-            return start;
-        }
-
-        return (end - start) * fraction + start;
-    }
-
-    private int binarySearch(float temperature) {
-        int low = 0;
-        int high = sTemperatureColorValues.length;
-
-        while (low <= high) {
-            int mid = (low + high) >>> 1;
-            float midVal = sTemperatureColorValues[mid].getTemperature();
-
-            if (midVal < temperature) {
-                low = mid + 1;  // Neither val is NaN, thisVal is smaller
-            } else if (midVal > temperature) {
-                high = mid - 1; // Neither val is NaN, thisVal is larger
-            } else {
-                int midBits = Float.floatToIntBits(midVal);
-                int keyBits = Float.floatToIntBits(temperature);
-                if (midBits == keyBits) {    // Values are equal
-                    return mid;             // Key found
-                } else if (midBits < keyBits) { // (-0.0, 0.0) or (!NaN, NaN)
-                    low = mid + 1;
-                } else {                        /* (0.0, -0.0) or (NaN, !NaN)*/
-                    high = mid - 1;
-                }
-            }
-        }
-        return -(low + 1);  // key not found.
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/statusbar/hvac/TemperatureTextAnimator.java b/packages/CarSystemUI/src/com/android/systemui/statusbar/hvac/TemperatureTextAnimator.java
deleted file mode 100644
index 8ee5ef6..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/statusbar/hvac/TemperatureTextAnimator.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * Copyright (c) 2018 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.statusbar.hvac;
-
-import static com.android.systemui.statusbar.hvac.AnimatedTemperatureView.isHorizontal;
-import static com.android.systemui.statusbar.hvac.AnimatedTemperatureView.isLeft;
-
-import android.annotation.NonNull;
-import android.view.animation.AccelerateDecelerateInterpolator;
-import android.view.animation.AlphaAnimation;
-import android.view.animation.Animation;
-import android.view.animation.AnimationSet;
-import android.view.animation.DecelerateInterpolator;
-import android.view.animation.RotateAnimation;
-import android.view.animation.TranslateAnimation;
-import android.widget.TextSwitcher;
-
-/**
- * Controls animating TemperatureView's text
- */
-class TemperatureTextAnimator {
-
-    private static final DecelerateInterpolator DECELERATE_INTERPOLATOR =
-            new DecelerateInterpolator();
-    private static final AccelerateDecelerateInterpolator ACCELERATE_DECELERATE_INTERPOLATOR =
-            new AccelerateDecelerateInterpolator();
-
-    private static final int ROTATION_DEGREES = 15;
-    private static final int DURATION_MILLIS = 200;
-
-    private AnimatedTemperatureView mParent;
-    private final TextSwitcher mTextSwitcher;
-    private final String mTempFormat;
-    private final int mPivotOffset;
-    private final CharSequence mMinText;
-    private final CharSequence mMaxText;
-
-    private Animation mTextInAnimationUp;
-    private Animation mTextOutAnimationUp;
-    private Animation mTextInAnimationDown;
-    private Animation mTextOutAnimationDown;
-    private Animation mTextFadeInAnimation;
-    private Animation mTextFadeOutAnimation;
-
-    private float mLastTemp = Float.NaN;
-
-    TemperatureTextAnimator(AnimatedTemperatureView parent, TextSwitcher textSwitcher,
-            String tempFormat, int pivotOffset,
-            CharSequence minText, CharSequence maxText) {
-        mParent = parent;
-        mTextSwitcher = textSwitcher;
-        mTempFormat = tempFormat;
-        mPivotOffset = pivotOffset;
-        mMinText = minText;
-        mMaxText = maxText;
-
-        mParent.addOnLayoutChangeListener(
-                (v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) ->
-                        setupAnimations(mParent.getGravity()));
-    }
-
-    void setTemp(float temp) {
-        if (Float.isNaN(temp)) {
-            mTextSwitcher.setInAnimation(mTextFadeInAnimation);
-            mTextSwitcher.setOutAnimation(mTextFadeOutAnimation);
-            mTextSwitcher.setText("--");
-            mLastTemp = temp;
-            return;
-        }
-        boolean isMinValue = mParent.isMinValue(temp);
-        boolean isMaxValue = mParent.isMaxValue(temp);
-        if (Float.isNaN(mLastTemp)) {
-            mTextSwitcher.setInAnimation(mTextFadeInAnimation);
-            mTextSwitcher.setOutAnimation(mTextFadeOutAnimation);
-        } else if (!isMinValue && (isMaxValue || temp > mLastTemp)) {
-            mTextSwitcher.setInAnimation(mTextInAnimationUp);
-            mTextSwitcher.setOutAnimation(mTextOutAnimationUp);
-        } else {
-            mTextSwitcher.setInAnimation(mTextInAnimationDown);
-            mTextSwitcher.setOutAnimation(mTextOutAnimationDown);
-        }
-        CharSequence text;
-        if (isMinValue) {
-            text = mMinText;
-        } else if (isMaxValue) {
-            text = mMaxText;
-        } else {
-            text = String.format(mTempFormat, temp);
-        }
-        mTextSwitcher.setText(text);
-        mLastTemp = temp;
-    }
-
-    private void setupAnimations(int gravity) {
-        mTextFadeInAnimation = createFadeAnimation(true);
-        mTextFadeOutAnimation = createFadeAnimation(false);
-        if (!isHorizontal(gravity)) {
-            mTextInAnimationUp = createTranslateFadeAnimation(true, true);
-            mTextOutAnimationUp = createTranslateFadeAnimation(false, true);
-            mTextInAnimationDown = createTranslateFadeAnimation(true, false);
-            mTextOutAnimationDown = createTranslateFadeAnimation(false, false);
-        } else {
-            boolean isLeft = isLeft(gravity, mTextSwitcher.getLayoutDirection());
-            mTextInAnimationUp = createRotateFadeAnimation(true, isLeft, true);
-            mTextOutAnimationUp = createRotateFadeAnimation(false, isLeft, true);
-            mTextInAnimationDown = createRotateFadeAnimation(true, isLeft, false);
-            mTextOutAnimationDown = createRotateFadeAnimation(false, isLeft, false);
-        }
-    }
-
-    @NonNull
-    private Animation createFadeAnimation(boolean in) {
-        AnimationSet set = new AnimationSet(true);
-        AlphaAnimation alphaAnimation = new AlphaAnimation(in ? 0 : 1, in ? 1 : 0);
-        alphaAnimation.setDuration(DURATION_MILLIS);
-        set.addAnimation(new RotateAnimation(0, 0)); // Undo any previous rotation
-        set.addAnimation(alphaAnimation);
-        return set;
-    }
-
-    @NonNull
-    private Animation createTranslateFadeAnimation(boolean in, boolean up) {
-        AnimationSet set = new AnimationSet(true);
-        set.setInterpolator(ACCELERATE_DECELERATE_INTERPOLATOR);
-        set.setDuration(DURATION_MILLIS);
-        int fromYDelta = in ? (up ? 1 : -1) : 0;
-        int toYDelta = in ? 0 : (up ? -1 : 1);
-        set.addAnimation(
-                new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 0,
-                        Animation.RELATIVE_TO_SELF, fromYDelta, Animation.RELATIVE_TO_SELF,
-                        toYDelta));
-        set.addAnimation(new AlphaAnimation(in ? 0 : 1, in ? 1 : 0));
-        return set;
-    }
-
-    @NonNull
-    private Animation createRotateFadeAnimation(boolean in, boolean isLeft, boolean up) {
-        AnimationSet set = new AnimationSet(true);
-        set.setInterpolator(DECELERATE_INTERPOLATOR);
-        set.setDuration(DURATION_MILLIS);
-
-        float degrees = isLeft == up ? -ROTATION_DEGREES : ROTATION_DEGREES;
-        int pivotX = isLeft ? -mPivotOffset : mParent.getWidth() + mPivotOffset;
-        set.addAnimation(
-                new RotateAnimation(in ? -degrees : 0f, in ? 0f : degrees, Animation.ABSOLUTE,
-                        pivotX, Animation.ABSOLUTE, 0f));
-        set.addAnimation(new AlphaAnimation(in ? 0 : 1, in ? 1 : 0));
-        return set;
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/voicerecognition/car/ConnectedDeviceVoiceRecognitionNotifier.java b/packages/CarSystemUI/src/com/android/systemui/voicerecognition/car/ConnectedDeviceVoiceRecognitionNotifier.java
deleted file mode 100644
index 2f79f96..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/voicerecognition/car/ConnectedDeviceVoiceRecognitionNotifier.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.voicerecognition.car;
-
-import android.bluetooth.BluetoothHeadsetClient;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.os.Handler;
-import android.os.UserHandle;
-import android.util.Log;
-import android.widget.Toast;
-
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.systemui.R;
-import com.android.systemui.SysUIToast;
-import com.android.systemui.SystemUI;
-import com.android.systemui.dagger.qualifiers.Main;
-
-import javax.inject.Inject;
-
-/**
- * Controller responsible for showing toast message when voice recognition over bluetooth device
- * getting activated.
- */
-public class ConnectedDeviceVoiceRecognitionNotifier extends SystemUI {
-
-    private static final String TAG = "CarVoiceRecognition";
-    @VisibleForTesting
-    static final int INVALID_VALUE = -1;
-    @VisibleForTesting
-    static final int VOICE_RECOGNITION_STARTED = 1;
-
-    private Handler mHandler;
-
-    private final BroadcastReceiver mVoiceRecognitionReceiver = new BroadcastReceiver() {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                Log.d(TAG, "Voice recognition received an intent!");
-            }
-            if (intent == null
-                    || intent.getAction() == null
-                    || !BluetoothHeadsetClient.ACTION_AG_EVENT.equals(intent.getAction())
-                    || !intent.hasExtra(BluetoothHeadsetClient.EXTRA_VOICE_RECOGNITION)) {
-                return;
-            }
-
-            int voiceRecognitionState = intent.getIntExtra(
-                    BluetoothHeadsetClient.EXTRA_VOICE_RECOGNITION, INVALID_VALUE);
-
-            if (voiceRecognitionState == VOICE_RECOGNITION_STARTED) {
-                showToastMessage();
-            }
-        }
-    };
-
-    private void showToastMessage() {
-        mHandler.post(() -> SysUIToast.makeText(mContext, R.string.voice_recognition_toast,
-                Toast.LENGTH_LONG).show());
-    }
-
-    @Inject
-    public ConnectedDeviceVoiceRecognitionNotifier(Context context, @Main Handler handler) {
-        super(context);
-        mHandler = handler;
-    }
-
-    @Override
-    public void start() {
-    }
-
-    @Override
-    protected void onBootCompleted() {
-        IntentFilter filter = new IntentFilter();
-        filter.addAction(BluetoothHeadsetClient.ACTION_AG_EVENT);
-        mContext.registerReceiverAsUser(mVoiceRecognitionReceiver, UserHandle.ALL, filter,
-                /* broadcastPermission= */ null, /* scheduler= */ null);
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/volume/CarVolumeDialogComponent.java b/packages/CarSystemUI/src/com/android/systemui/volume/CarVolumeDialogComponent.java
deleted file mode 100644
index 5a34436..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/volume/CarVolumeDialogComponent.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (C) 2018 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.volume;
-
-import android.content.Context;
-
-import com.android.systemui.car.CarServiceProvider;
-import com.android.systemui.keyguard.KeyguardViewMediator;
-import com.android.systemui.plugins.VolumeDialog;
-
-import javax.inject.Inject;
-import javax.inject.Singleton;
-
-/**
- * Allows for adding car specific dialog when the volume dialog is created.
- */
-@Singleton
-public class CarVolumeDialogComponent extends VolumeDialogComponent {
-
-    private CarVolumeDialogImpl mCarVolumeDialog;
-
-    @Inject
-    public CarVolumeDialogComponent(Context context, KeyguardViewMediator keyguardViewMediator,
-            VolumeDialogControllerImpl volumeDialogController,
-            CarServiceProvider carServiceProvider) {
-        super(context, keyguardViewMediator, volumeDialogController);
-        mCarVolumeDialog.setCarServiceProvider(carServiceProvider);
-    }
-
-    /** This method is called while calling the super constructor. */
-    @Override
-    protected VolumeDialog createDefault() {
-        mCarVolumeDialog = new CarVolumeDialogImpl(mContext);
-        return mCarVolumeDialog;
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/volume/CarVolumeDialogImpl.java b/packages/CarSystemUI/src/com/android/systemui/volume/CarVolumeDialogImpl.java
deleted file mode 100644
index 873d7d7..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/volume/CarVolumeDialogImpl.java
+++ /dev/null
@@ -1,641 +0,0 @@
-/*
- * Copyright (C) 2018 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.volume;
-
-import android.animation.Animator;
-import android.animation.AnimatorInflater;
-import android.animation.AnimatorSet;
-import android.annotation.DrawableRes;
-import android.annotation.Nullable;
-import android.app.Dialog;
-import android.app.KeyguardManager;
-import android.car.Car;
-import android.car.media.CarAudioManager;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.res.TypedArray;
-import android.content.res.XmlResourceParser;
-import android.graphics.Color;
-import android.graphics.PixelFormat;
-import android.graphics.drawable.ColorDrawable;
-import android.graphics.drawable.Drawable;
-import android.media.AudioManager;
-import android.os.Debug;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.Message;
-import android.os.UserHandle;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.util.SparseArray;
-import android.util.Xml;
-import android.view.Gravity;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.Window;
-import android.view.WindowManager;
-import android.widget.SeekBar;
-import android.widget.SeekBar.OnSeekBarChangeListener;
-
-import androidx.recyclerview.widget.LinearLayoutManager;
-import androidx.recyclerview.widget.RecyclerView;
-
-import com.android.systemui.R;
-import com.android.systemui.car.CarServiceProvider;
-import com.android.systemui.plugins.VolumeDialog;
-
-import org.xmlpull.v1.XmlPullParserException;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Car version of the volume dialog.
- *
- * Methods ending in "H" must be called on the (ui) handler.
- */
-public class CarVolumeDialogImpl implements VolumeDialog {
-
-    private static final String TAG = Util.logTag(CarVolumeDialogImpl.class);
-
-    private static final String XML_TAG_VOLUME_ITEMS = "carVolumeItems";
-    private static final String XML_TAG_VOLUME_ITEM = "item";
-    private static final int LISTVIEW_ANIMATION_DURATION_IN_MILLIS = 250;
-    private static final int DISMISS_DELAY_IN_MILLIS = 50;
-    private static final int ARROW_FADE_IN_START_DELAY_IN_MILLIS = 100;
-
-    private final Context mContext;
-    private final H mHandler = new H();
-    // All the volume items.
-    private final SparseArray<VolumeItem> mVolumeItems = new SparseArray<>();
-    // Available volume items in car audio manager.
-    private final List<VolumeItem> mAvailableVolumeItems = new ArrayList<>();
-    // Volume items in the RecyclerView.
-    private final List<CarVolumeItem> mCarVolumeLineItems = new ArrayList<>();
-    private final KeyguardManager mKeyguard;
-    private final int mNormalTimeout;
-    private final int mHoveringTimeout;
-    private final int mExpNormalTimeout;
-    private final int mExpHoveringTimeout;
-
-    private Window mWindow;
-    private CustomDialog mDialog;
-    private RecyclerView mListView;
-    private CarVolumeItemAdapter mVolumeItemsAdapter;
-    private CarAudioManager mCarAudioManager;
-    private boolean mHovering;
-    private int mCurrentlyDisplayingGroupId;
-    private int mPreviouslyDisplayingGroupId;
-    private boolean mShowing;
-    private boolean mDismissing;
-    private boolean mExpanded;
-    private View mExpandIcon;
-
-    private final CarAudioManager.CarVolumeCallback mVolumeChangeCallback =
-            new CarAudioManager.CarVolumeCallback() {
-                @Override
-                public void onGroupVolumeChanged(int zoneId, int groupId, int flags) {
-                    // TODO: Include zoneId into consideration.
-                    // For instance
-                    // - single display + single-zone, ignore zoneId
-                    // - multi-display + single-zone, zoneId is fixed, may show volume bar on all
-                    // displays
-                    // - single-display + multi-zone, may show volume bar on primary display only
-                    // - multi-display + multi-zone, may show volume bar on display specified by
-                    // zoneId
-                    VolumeItem volumeItem = mAvailableVolumeItems.get(groupId);
-                    int value = getSeekbarValue(mCarAudioManager, groupId);
-                    // find if the group id for which the volume changed is currently being
-                    // displayed.
-                    boolean isShowing = mCarVolumeLineItems.stream().anyMatch(
-                            item -> item.getGroupId() == groupId);
-                    // Do not update the progress if it is the same as before. When car audio
-                    // manager sets
-                    // its group volume caused by the seekbar progress changed, it also triggers
-                    // this
-                    // callback. Updating the seekbar at the same time could block the continuous
-                    // seeking.
-                    if (value != volumeItem.progress && isShowing) {
-                        volumeItem.carVolumeItem.setProgress(value);
-                        volumeItem.progress = value;
-                    }
-                    if ((flags & AudioManager.FLAG_SHOW_UI) != 0) {
-                        mPreviouslyDisplayingGroupId = mCurrentlyDisplayingGroupId;
-                        mCurrentlyDisplayingGroupId = groupId;
-                        mHandler.obtainMessage(H.SHOW,
-                                Events.SHOW_REASON_VOLUME_CHANGED).sendToTarget();
-                    }
-                }
-
-                @Override
-                public void onMasterMuteChanged(int zoneId, int flags) {
-                    // ignored
-                }
-            };
-
-    private final CarServiceProvider.CarServiceOnConnectedListener mCarServiceOnConnectedListener =
-            car -> {
-                mExpanded = false;
-                mCarAudioManager = (CarAudioManager) car.getCarManager(Car.AUDIO_SERVICE);
-                int volumeGroupCount = mCarAudioManager.getVolumeGroupCount();
-                // Populates volume slider items from volume groups to UI.
-                for (int groupId = 0; groupId < volumeGroupCount; groupId++) {
-                    VolumeItem volumeItem = getVolumeItemForUsages(
-                            mCarAudioManager.getUsagesForVolumeGroupId(groupId));
-                    mAvailableVolumeItems.add(volumeItem);
-                    // The first one is the default item.
-                    if (groupId == 0) {
-                        clearAllAndSetupDefaultCarVolumeLineItem(0);
-                    }
-                }
-
-                // If list is already initiated, update its content.
-                if (mVolumeItemsAdapter != null) {
-                    mVolumeItemsAdapter.notifyDataSetChanged();
-                }
-                mCarAudioManager.registerCarVolumeCallback(mVolumeChangeCallback);
-            };
-
-    private final BroadcastReceiver mHomeButtonPressedBroadcastReceiver = new BroadcastReceiver() {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            if (!intent.getAction().equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) {
-                return;
-            }
-
-            dismissH(Events.DISMISS_REASON_VOLUME_CONTROLLER);
-        }
-    };
-
-    public CarVolumeDialogImpl(Context context) {
-        mContext = context;
-        mKeyguard = (KeyguardManager) mContext.getSystemService(Context.KEYGUARD_SERVICE);
-        mNormalTimeout = mContext.getResources().getInteger(
-                R.integer.car_volume_dialog_display_normal_timeout);
-        mHoveringTimeout = mContext.getResources().getInteger(
-                R.integer.car_volume_dialog_display_hovering_timeout);
-        mExpNormalTimeout = mContext.getResources().getInteger(
-                R.integer.car_volume_dialog_display_expanded_normal_timeout);
-        mExpHoveringTimeout = mContext.getResources().getInteger(
-                R.integer.car_volume_dialog_display_expanded_hovering_timeout);
-    }
-
-    /** Sets a {@link CarServiceProvider} which connects to the audio service. */
-    public void setCarServiceProvider(CarServiceProvider carServiceProvider) {
-        carServiceProvider.addListener(mCarServiceOnConnectedListener);
-    }
-
-    private static int getSeekbarValue(CarAudioManager carAudioManager, int volumeGroupId) {
-        return carAudioManager.getGroupVolume(volumeGroupId);
-    }
-
-    private static int getMaxSeekbarValue(CarAudioManager carAudioManager, int volumeGroupId) {
-        return carAudioManager.getGroupMaxVolume(volumeGroupId);
-    }
-
-    /**
-     * Build the volume window and connect to the CarService which registers with car audio
-     * manager.
-     */
-    @Override
-    public void init(int windowType, Callback callback) {
-        initDialog();
-
-        mContext.registerReceiverAsUser(mHomeButtonPressedBroadcastReceiver, UserHandle.CURRENT,
-                new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS), /* broadcastPermission= */
-                null, /* scheduler= */ null);
-    }
-
-    @Override
-    public void destroy() {
-        mHandler.removeCallbacksAndMessages(/* token= */ null);
-
-        mContext.unregisterReceiver(mHomeButtonPressedBroadcastReceiver);
-
-        cleanupAudioManager();
-    }
-
-    private void initDialog() {
-        loadAudioUsageItems();
-        mCarVolumeLineItems.clear();
-        mDialog = new CustomDialog(mContext);
-
-        mHovering = false;
-        mShowing = false;
-        mDismissing = false;
-        mExpanded = false;
-        mWindow = mDialog.getWindow();
-        mWindow.requestFeature(Window.FEATURE_NO_TITLE);
-        mWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
-        mWindow.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND
-                | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR);
-        mWindow.addFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
-                | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
-                | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
-                | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
-                | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
-                | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
-        mWindow.setType(WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY);
-        mWindow.setWindowAnimations(com.android.internal.R.style.Animation_Toast);
-        final WindowManager.LayoutParams lp = mWindow.getAttributes();
-        lp.format = PixelFormat.TRANSLUCENT;
-        lp.setTitle(VolumeDialogImpl.class.getSimpleName());
-        lp.gravity = Gravity.TOP | Gravity.CENTER_HORIZONTAL;
-        lp.windowAnimations = -1;
-        mWindow.setAttributes(lp);
-
-        mDialog.setContentView(R.layout.car_volume_dialog);
-        mWindow.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
-
-        mDialog.setCanceledOnTouchOutside(true);
-        mDialog.setOnShowListener(dialog -> {
-            mListView.setTranslationY(-mListView.getHeight());
-            mListView.setAlpha(0);
-            mListView.animate()
-                    .alpha(1)
-                    .translationY(0)
-                    .setDuration(LISTVIEW_ANIMATION_DURATION_IN_MILLIS)
-                    .setInterpolator(new SystemUIInterpolators.LogDecelerateInterpolator())
-                    .start();
-        });
-        mListView = mWindow.findViewById(R.id.volume_list);
-        mListView.setOnHoverListener((v, event) -> {
-            int action = event.getActionMasked();
-            mHovering = (action == MotionEvent.ACTION_HOVER_ENTER)
-                    || (action == MotionEvent.ACTION_HOVER_MOVE);
-            rescheduleTimeoutH();
-            return true;
-        });
-
-        mVolumeItemsAdapter = new CarVolumeItemAdapter(mContext, mCarVolumeLineItems);
-        mListView.setAdapter(mVolumeItemsAdapter);
-        mListView.setLayoutManager(new LinearLayoutManager(mContext));
-    }
-
-
-    private void showH(int reason) {
-        if (D.BUG) {
-            Log.d(TAG, "showH r=" + Events.DISMISS_REASONS[reason]);
-        }
-
-        mHandler.removeMessages(H.SHOW);
-        mHandler.removeMessages(H.DISMISS);
-
-        rescheduleTimeoutH();
-
-        // Refresh the data set before showing.
-        mVolumeItemsAdapter.notifyDataSetChanged();
-
-        if (mShowing) {
-            if (mPreviouslyDisplayingGroupId == mCurrentlyDisplayingGroupId || mExpanded) {
-                return;
-            }
-
-            clearAllAndSetupDefaultCarVolumeLineItem(mCurrentlyDisplayingGroupId);
-            return;
-        }
-
-        mShowing = true;
-        clearAllAndSetupDefaultCarVolumeLineItem(mCurrentlyDisplayingGroupId);
-        mDialog.show();
-        Events.writeEvent(Events.EVENT_SHOW_DIALOG, reason, mKeyguard.isKeyguardLocked());
-    }
-
-    private void clearAllAndSetupDefaultCarVolumeLineItem(int groupId) {
-        mCarVolumeLineItems.clear();
-        VolumeItem volumeItem = mAvailableVolumeItems.get(groupId);
-        volumeItem.defaultItem = true;
-        addCarVolumeListItem(volumeItem, /* volumeGroupId = */ groupId,
-                R.drawable.car_ic_keyboard_arrow_down, new ExpandIconListener());
-    }
-
-    protected void rescheduleTimeoutH() {
-        mHandler.removeMessages(H.DISMISS);
-        final int timeout = computeTimeoutH();
-        mHandler.sendMessageDelayed(mHandler
-                .obtainMessage(H.DISMISS, Events.DISMISS_REASON_TIMEOUT), timeout);
-
-        if (D.BUG) {
-            Log.d(TAG, "rescheduleTimeout " + timeout + " " + Debug.getCaller());
-        }
-    }
-
-    private int computeTimeoutH() {
-        if (mExpanded) {
-            return mHovering ? mExpHoveringTimeout : mExpNormalTimeout;
-        } else {
-            return mHovering ? mHoveringTimeout : mNormalTimeout;
-        }
-    }
-
-    private void dismissH(int reason) {
-        if (D.BUG) {
-            Log.d(TAG, "dismissH r=" + Events.DISMISS_REASONS[reason]);
-        }
-
-        mHandler.removeMessages(H.DISMISS);
-        mHandler.removeMessages(H.SHOW);
-        if (!mShowing || mDismissing) {
-            return;
-        }
-
-        mDismissing = true;
-        mListView.animate()
-                .alpha(0)
-                .translationY(-mListView.getHeight())
-                .setDuration(LISTVIEW_ANIMATION_DURATION_IN_MILLIS)
-                .setInterpolator(new SystemUIInterpolators.LogAccelerateInterpolator())
-                .withEndAction(() -> mHandler.postDelayed(() -> {
-                    if (D.BUG) {
-                        Log.d(TAG, "mDialog.dismiss()");
-                    }
-                    mDialog.dismiss();
-                    mShowing = false;
-                    mDismissing = false;
-                    // if mExpandIcon is null that means user never clicked on the expanded arrow
-                    // which implies that the dialog is still not expanded. In that case we do
-                    // not want to reset the state
-                    if (mExpandIcon != null && mExpanded) {
-                        toggleDialogExpansion(/* isClicked = */ false);
-                    }
-                }, DISMISS_DELAY_IN_MILLIS))
-                .start();
-
-        Events.writeEvent(Events.EVENT_DISMISS_DIALOG, reason);
-    }
-
-    private void loadAudioUsageItems() {
-        try (XmlResourceParser parser = mContext.getResources().getXml(R.xml.car_volume_items)) {
-            AttributeSet attrs = Xml.asAttributeSet(parser);
-            int type;
-            // Traverse to the first start tag
-            while ((type = parser.next()) != XmlResourceParser.END_DOCUMENT
-                    && type != XmlResourceParser.START_TAG) {
-                // Do Nothing (moving parser to start element)
-            }
-
-            if (!XML_TAG_VOLUME_ITEMS.equals(parser.getName())) {
-                throw new RuntimeException("Meta-data does not start with carVolumeItems tag");
-            }
-            int outerDepth = parser.getDepth();
-            int rank = 0;
-            while ((type = parser.next()) != XmlResourceParser.END_DOCUMENT
-                    && (type != XmlResourceParser.END_TAG || parser.getDepth() > outerDepth)) {
-                if (type == XmlResourceParser.END_TAG) {
-                    continue;
-                }
-                if (XML_TAG_VOLUME_ITEM.equals(parser.getName())) {
-                    TypedArray item = mContext.getResources().obtainAttributes(
-                            attrs, R.styleable.carVolumeItems_item);
-                    int usage = item.getInt(R.styleable.carVolumeItems_item_usage,
-                            /* defValue= */ -1);
-                    if (usage >= 0) {
-                        VolumeItem volumeItem = new VolumeItem();
-                        volumeItem.rank = rank;
-                        volumeItem.icon = item.getResourceId(
-                                R.styleable.carVolumeItems_item_icon, /* defValue= */ 0);
-                        mVolumeItems.put(usage, volumeItem);
-                        rank++;
-                    }
-                    item.recycle();
-                }
-            }
-        } catch (XmlPullParserException | IOException e) {
-            Log.e(TAG, "Error parsing volume groups configuration", e);
-        }
-    }
-
-    private VolumeItem getVolumeItemForUsages(int[] usages) {
-        int rank = Integer.MAX_VALUE;
-        VolumeItem result = null;
-        for (int usage : usages) {
-            VolumeItem volumeItem = mVolumeItems.get(usage);
-            if (volumeItem.rank < rank) {
-                rank = volumeItem.rank;
-                result = volumeItem;
-            }
-        }
-        return result;
-    }
-
-    private CarVolumeItem createCarVolumeListItem(VolumeItem volumeItem, int volumeGroupId,
-            Drawable supplementalIcon, int seekbarProgressValue,
-            @Nullable View.OnClickListener supplementalIconOnClickListener) {
-        CarVolumeItem carVolumeItem = new CarVolumeItem();
-        carVolumeItem.setMax(getMaxSeekbarValue(mCarAudioManager, volumeGroupId));
-        carVolumeItem.setProgress(seekbarProgressValue);
-        carVolumeItem.setOnSeekBarChangeListener(
-                new CarVolumeDialogImpl.VolumeSeekBarChangeListener(volumeGroupId,
-                        mCarAudioManager));
-        carVolumeItem.setGroupId(volumeGroupId);
-
-        int color = mContext.getColor(R.color.car_volume_dialog_tint);
-        Drawable primaryIcon = mContext.getDrawable(volumeItem.icon);
-        primaryIcon.mutate().setTint(color);
-        carVolumeItem.setPrimaryIcon(primaryIcon);
-        if (supplementalIcon != null) {
-            supplementalIcon.mutate().setTint(color);
-            carVolumeItem.setSupplementalIcon(supplementalIcon,
-                    /* showSupplementalIconDivider= */ true);
-            carVolumeItem.setSupplementalIconListener(supplementalIconOnClickListener);
-        } else {
-            carVolumeItem.setSupplementalIcon(/* drawable= */ null,
-                    /* showSupplementalIconDivider= */ false);
-        }
-
-        volumeItem.carVolumeItem = carVolumeItem;
-        volumeItem.progress = seekbarProgressValue;
-
-        return carVolumeItem;
-    }
-
-    private CarVolumeItem addCarVolumeListItem(VolumeItem volumeItem, int volumeGroupId,
-            int supplementalIconId,
-            @Nullable View.OnClickListener supplementalIconOnClickListener) {
-        int seekbarProgressValue = getSeekbarValue(mCarAudioManager, volumeGroupId);
-        Drawable supplementalIcon = supplementalIconId == 0 ? null : mContext.getDrawable(
-                supplementalIconId);
-        CarVolumeItem carVolumeItem = createCarVolumeListItem(volumeItem, volumeGroupId,
-                supplementalIcon, seekbarProgressValue, supplementalIconOnClickListener);
-        mCarVolumeLineItems.add(carVolumeItem);
-        return carVolumeItem;
-    }
-
-    private void cleanupAudioManager() {
-        mCarAudioManager.unregisterCarVolumeCallback(mVolumeChangeCallback);
-        mCarVolumeLineItems.clear();
-        mCarAudioManager = null;
-    }
-
-    /**
-     * Wrapper class which contains information of each volume group.
-     */
-    private static class VolumeItem {
-
-        private int rank;
-        private boolean defaultItem = false;
-        @DrawableRes
-        private int icon;
-        private CarVolumeItem carVolumeItem;
-        private int progress;
-    }
-
-    private final class H extends Handler {
-
-        private static final int SHOW = 1;
-        private static final int DISMISS = 2;
-
-        private H() {
-            super(Looper.getMainLooper());
-        }
-
-        @Override
-        public void handleMessage(Message msg) {
-            switch (msg.what) {
-                case SHOW:
-                    showH(msg.arg1);
-                    break;
-                case DISMISS:
-                    dismissH(msg.arg1);
-                    break;
-                default:
-            }
-        }
-    }
-
-    private final class CustomDialog extends Dialog implements DialogInterface {
-
-        private CustomDialog(Context context) {
-            super(context, com.android.systemui.R.style.qs_theme);
-        }
-
-        @Override
-        public boolean dispatchTouchEvent(MotionEvent ev) {
-            rescheduleTimeoutH();
-            return super.dispatchTouchEvent(ev);
-        }
-
-        @Override
-        protected void onStart() {
-            super.setCanceledOnTouchOutside(true);
-            super.onStart();
-        }
-
-        @Override
-        protected void onStop() {
-            super.onStop();
-        }
-
-        @Override
-        public boolean onTouchEvent(MotionEvent event) {
-            if (isShowing()) {
-                if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {
-                    mHandler.obtainMessage(
-                            H.DISMISS, Events.DISMISS_REASON_TOUCH_OUTSIDE).sendToTarget();
-                    return true;
-                }
-            }
-            return false;
-        }
-    }
-
-    private final class ExpandIconListener implements View.OnClickListener {
-        @Override
-        public void onClick(final View v) {
-            mExpandIcon = v;
-            toggleDialogExpansion(true);
-            rescheduleTimeoutH();
-        }
-    }
-
-    private void toggleDialogExpansion(boolean isClicked) {
-        mExpanded = !mExpanded;
-        Animator inAnimator;
-        if (mExpanded) {
-            for (int groupId = 0; groupId < mAvailableVolumeItems.size(); ++groupId) {
-                if (groupId != mCurrentlyDisplayingGroupId) {
-                    VolumeItem volumeItem = mAvailableVolumeItems.get(groupId);
-                    addCarVolumeListItem(volumeItem, groupId, /* supplementalIconId= */ 0,
-                            /* supplementalIconOnClickListener= */ null);
-                }
-            }
-            inAnimator = AnimatorInflater.loadAnimator(
-                    mContext, R.anim.car_arrow_fade_in_rotate_up);
-
-        } else {
-            clearAllAndSetupDefaultCarVolumeLineItem(mCurrentlyDisplayingGroupId);
-            inAnimator = AnimatorInflater.loadAnimator(
-                    mContext, R.anim.car_arrow_fade_in_rotate_down);
-        }
-
-        Animator outAnimator = AnimatorInflater.loadAnimator(
-                mContext, R.anim.car_arrow_fade_out);
-        inAnimator.setStartDelay(ARROW_FADE_IN_START_DELAY_IN_MILLIS);
-        AnimatorSet animators = new AnimatorSet();
-        animators.playTogether(outAnimator, inAnimator);
-        if (!isClicked) {
-            // Do not animate when the state is called to reset the dialogs view and not clicked
-            // by user.
-            animators.setDuration(0);
-        }
-        animators.setTarget(mExpandIcon);
-        animators.start();
-        mVolumeItemsAdapter.notifyDataSetChanged();
-    }
-
-    private final class VolumeSeekBarChangeListener implements OnSeekBarChangeListener {
-
-        private final int mVolumeGroupId;
-        private final CarAudioManager mCarAudioManager;
-
-        private VolumeSeekBarChangeListener(int volumeGroupId, CarAudioManager carAudioManager) {
-            mVolumeGroupId = volumeGroupId;
-            mCarAudioManager = carAudioManager;
-        }
-
-        @Override
-        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
-            if (!fromUser) {
-                // For instance, if this event is originated from AudioService,
-                // we can ignore it as it has already been handled and doesn't need to be
-                // sent back down again.
-                return;
-            }
-            if (mCarAudioManager == null) {
-                Log.w(TAG, "Ignoring volume change event because the car isn't connected");
-                return;
-            }
-            mAvailableVolumeItems.get(mVolumeGroupId).progress = progress;
-            mAvailableVolumeItems.get(
-                    mVolumeGroupId).carVolumeItem.setProgress(progress);
-            mCarAudioManager.setGroupVolume(mVolumeGroupId, progress, 0);
-        }
-
-        @Override
-        public void onStartTrackingTouch(SeekBar seekBar) {
-        }
-
-        @Override
-        public void onStopTrackingTouch(SeekBar seekBar) {
-        }
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/volume/CarVolumeItem.java b/packages/CarSystemUI/src/com/android/systemui/volume/CarVolumeItem.java
deleted file mode 100644
index b83740f..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/volume/CarVolumeItem.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Copyright (C) 2019 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.volume;
-
-import android.graphics.drawable.Drawable;
-import android.view.View;
-import android.widget.ImageView;
-import android.widget.SeekBar;
-
-import androidx.annotation.NonNull;
-import androidx.recyclerview.widget.RecyclerView;
-
-import com.android.systemui.R;
-
-/** Holds all related data to represent a volume group. */
-public class CarVolumeItem {
-
-    private Drawable mPrimaryIcon;
-    private Drawable mSupplementalIcon;
-    private View.OnClickListener mSupplementalIconOnClickListener;
-    private boolean mShowSupplementalIconDivider;
-    private int mGroupId;
-
-    private int mMax;
-    private int mProgress;
-    private SeekBar.OnSeekBarChangeListener mOnSeekBarChangeListener;
-    
-    /**
-     * Called when {@link CarVolumeItem} is bound to its ViewHolder.
-     */
-    void bind(CarVolumeItemViewHolder viewHolder) {
-            viewHolder.bind(/* carVolumeItem= */ this);
-    }
-
-    /** Sets progress of seekbar. */
-    public void setProgress(int progress) {
-        mProgress = progress;
-    }
-
-    /** Sets max value of seekbar. */
-    public void setMax(int max) {
-        mMax = max;
-    }
-
-    /** Sets {@link SeekBar.OnSeekBarChangeListener}. */
-    public void setOnSeekBarChangeListener(SeekBar.OnSeekBarChangeListener listener) {
-        mOnSeekBarChangeListener = listener;
-    }
-
-    /** Sets the primary icon. */
-    public void setPrimaryIcon(Drawable drawable) {
-        mPrimaryIcon = drawable;
-    }
-
-    /** Sets the supplemental icon and the visibility of the supplemental icon divider. */
-    public void setSupplementalIcon(Drawable drawable, boolean showSupplementalIconDivider) {
-        mSupplementalIcon = drawable;
-        mShowSupplementalIconDivider = showSupplementalIconDivider;
-    }
-
-    /**
-     * Gets the group id associated.
-     */
-    public int getGroupId() {
-        return mGroupId;
-    }
-
-    /**
-     * Sets the group id associated.
-     */
-    public void setGroupId(int groupId) {
-        this.mGroupId = groupId;
-    }
-
-    /** Sets {@code OnClickListener} for the supplemental icon. */
-    public void setSupplementalIconListener(View.OnClickListener listener) {
-        mSupplementalIconOnClickListener = listener;
-    }
-
-    /** Defines the view holder which shows the information held by {@link CarVolumeItem}. */
-    public static class CarVolumeItemViewHolder extends RecyclerView.ViewHolder {
-
-        private SeekBar mSeekBar;
-        private ImageView mPrimaryIcon;
-        private View mSupplementalIconDivider;
-        private ImageView mSupplementalIcon;
-
-        public CarVolumeItemViewHolder(@NonNull View itemView) {
-            super(itemView);
-
-            mSeekBar = itemView.findViewById(R.id.seek_bar);
-            mPrimaryIcon = itemView.findViewById(R.id.primary_icon);
-            mSupplementalIcon = itemView.findViewById(R.id.supplemental_icon);
-            mSupplementalIconDivider = itemView.findViewById(R.id.supplemental_icon_divider);
-        }
-
-        /**
-         * Binds {@link CarVolumeItem} to the {@link CarVolumeItemViewHolder}.
-         */
-        void bind(CarVolumeItem carVolumeItem) {
-            // Progress bar
-            mSeekBar.setMax(carVolumeItem.mMax);
-            mSeekBar.setProgress(carVolumeItem.mProgress);
-            mSeekBar.setOnSeekBarChangeListener(carVolumeItem.mOnSeekBarChangeListener);
-
-            // Primary icon
-            mPrimaryIcon.setVisibility(View.VISIBLE);
-            mPrimaryIcon.setImageDrawable(carVolumeItem.mPrimaryIcon);
-
-            // Supplemental icon
-            mSupplementalIcon.setVisibility(View.VISIBLE);
-            mSupplementalIconDivider.setVisibility(
-                    carVolumeItem.mShowSupplementalIconDivider ? View.VISIBLE : View.INVISIBLE);
-            mSupplementalIcon.setImageDrawable(carVolumeItem.mSupplementalIcon);
-            mSupplementalIcon.setOnClickListener(
-                    carVolumeItem.mSupplementalIconOnClickListener);
-            mSupplementalIcon.setClickable(
-                    carVolumeItem.mSupplementalIconOnClickListener != null);
-        }
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/volume/CarVolumeItemAdapter.java b/packages/CarSystemUI/src/com/android/systemui/volume/CarVolumeItemAdapter.java
deleted file mode 100644
index 5c1f817..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/volume/CarVolumeItemAdapter.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (C) 2019 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.volume;
-
-import android.content.Context;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-
-import androidx.recyclerview.widget.RecyclerView;
-
-import com.android.systemui.R;
-
-import java.util.List;
-
-/** The {@link RecyclerView.Adapter} to show the volume items in the sysUI volume dialog. */
-public class CarVolumeItemAdapter extends
-        RecyclerView.Adapter<CarVolumeItem.CarVolumeItemViewHolder> {
-
-    private final Context mContext;
-    private final List<CarVolumeItem> mItems;
-
-    public CarVolumeItemAdapter(Context context, List<CarVolumeItem> items) {
-        mContext = context;
-        mItems = items;
-    }
-
-    @Override
-    public CarVolumeItem.CarVolumeItemViewHolder onCreateViewHolder(ViewGroup parent,
-            int viewType) {
-        LayoutInflater inflater = LayoutInflater.from(mContext);
-        View view = inflater.inflate(R.layout.car_volume_item, parent, false);
-        return new CarVolumeItem.CarVolumeItemViewHolder(view);
-    }
-
-    @Override
-    public void onBindViewHolder(CarVolumeItem.CarVolumeItemViewHolder holder, int position) {
-        mItems.get(position).bind(holder);
-    }
-
-    @Override
-    public int getItemCount() {
-        return mItems.size();
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/window/OverlayPanelViewController.java b/packages/CarSystemUI/src/com/android/systemui/window/OverlayPanelViewController.java
deleted file mode 100644
index 58022f1..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/window/OverlayPanelViewController.java
+++ /dev/null
@@ -1,563 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.window;
-
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.animation.ValueAnimator;
-import android.content.Context;
-import android.content.res.Resources;
-import android.graphics.Rect;
-import android.util.Log;
-import android.view.GestureDetector;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewTreeObserver;
-
-import androidx.annotation.CallSuper;
-
-import com.android.systemui.R;
-import com.android.systemui.car.CarDeviceProvisionedController;
-import com.android.systemui.dagger.qualifiers.Main;
-import com.android.systemui.statusbar.FlingAnimationUtils;
-
-/**
- * The {@link OverlayPanelViewController} provides additional dragging animation capabilities to
- * {@link OverlayViewController}.
- */
-public abstract class OverlayPanelViewController extends OverlayViewController {
-
-    private static final boolean DEBUG = true;
-    private static final String TAG = "OverlayPanelViewController";
-
-    // used to calculate how fast to open or close the window
-    protected static final float DEFAULT_FLING_VELOCITY = 0;
-    // max time a fling animation takes
-    protected static final float FLING_ANIMATION_MAX_TIME = 0.5f;
-    // acceleration rate for the fling animation
-    protected static final float FLING_SPEED_UP_FACTOR = 0.6f;
-
-    protected static final int SWIPE_DOWN_MIN_DISTANCE = 25;
-    protected static final int SWIPE_MAX_OFF_PATH = 75;
-    protected static final int SWIPE_THRESHOLD_VELOCITY = 200;
-
-    private final FlingAnimationUtils mFlingAnimationUtils;
-    private final CarDeviceProvisionedController mCarDeviceProvisionedController;
-    private final View.OnTouchListener mDragOpenTouchListener;
-    private final View.OnTouchListener mDragCloseTouchListener;
-
-    private final int mSettleClosePercentage;
-    private int mPercentageFromBottom;
-
-    private boolean mPanelVisible;
-    private boolean mPanelExpanded;
-
-    private float mOpeningVelocity = DEFAULT_FLING_VELOCITY;
-    private float mClosingVelocity = DEFAULT_FLING_VELOCITY;
-
-    private boolean mIsAnimating;
-    private boolean mIsTracking;
-
-    public OverlayPanelViewController(
-            Context context,
-            @Main Resources resources,
-            int stubId,
-            OverlayViewGlobalStateController overlayViewGlobalStateController,
-            FlingAnimationUtils.Builder flingAnimationUtilsBuilder,
-            CarDeviceProvisionedController carDeviceProvisionedController
-    ) {
-        super(stubId, overlayViewGlobalStateController);
-
-        mFlingAnimationUtils = flingAnimationUtilsBuilder
-                .setMaxLengthSeconds(FLING_ANIMATION_MAX_TIME)
-                .setSpeedUpFactor(FLING_SPEED_UP_FACTOR)
-                .build();
-        mCarDeviceProvisionedController = carDeviceProvisionedController;
-
-        mSettleClosePercentage = resources.getInteger(
-                R.integer.notification_settle_close_percentage);
-
-        // Attached to the top navigation bar (i.e. status bar) to detect pull down of the
-        // notification shade.
-        GestureDetector openGestureDetector = new GestureDetector(context,
-                new OpenGestureListener() {
-                    @Override
-                    protected void open() {
-                        animateExpandPanel();
-                    }
-                });
-
-        // Attached to the NavBars to close the notification shade
-        GestureDetector navBarCloseNotificationGestureDetector = new GestureDetector(context,
-                new SystemBarCloseGestureListener() {
-                    @Override
-                    protected void close() {
-                        if (isPanelExpanded()) {
-                            animateCollapsePanel();
-                        }
-                    }
-                });
-
-        mDragOpenTouchListener = (v, event) -> {
-            if (!mCarDeviceProvisionedController.isCurrentUserFullySetup()) {
-                return true;
-            }
-            if (!isInflated()) {
-                getOverlayViewGlobalStateController().inflateView(this);
-            }
-
-            boolean consumed = openGestureDetector.onTouchEvent(event);
-            if (consumed) {
-                return true;
-            }
-            maybeCompleteAnimation(event);
-            return true;
-        };
-
-        mDragCloseTouchListener = (v, event) -> {
-            if (!isInflated()) {
-                return true;
-            }
-            boolean consumed = navBarCloseNotificationGestureDetector.onTouchEvent(event);
-            if (consumed) {
-                return true;
-            }
-            maybeCompleteAnimation(event);
-            return true;
-        };
-    }
-
-    /** Toggles the visibility of the panel. */
-    public void toggle() {
-        if (!isInflated()) {
-            getOverlayViewGlobalStateController().inflateView(this);
-        }
-        if (isPanelExpanded()) {
-            animateCollapsePanel();
-        } else {
-            animateExpandPanel();
-        }
-    }
-
-    /* ***************************************************************************************** *
-     * Panel Animation
-     * ***************************************************************************************** */
-
-    /** Animates the closing of the panel. */
-    protected void animateCollapsePanel() {
-        if (!shouldAnimateCollapsePanel()) {
-            return;
-        }
-
-        if (!isPanelExpanded() || !isPanelVisible()) {
-            return;
-        }
-
-        onAnimateCollapsePanel();
-        getOverlayViewGlobalStateController().setWindowFocusable(false);
-        animatePanel(mClosingVelocity, /* isClosing= */ true);
-    }
-
-    /** Determines whether {@link #animateCollapsePanel()} should collapse the panel. */
-    protected abstract boolean shouldAnimateCollapsePanel();
-
-    /** Called when the panel is beginning to collapse. */
-    protected abstract void onAnimateCollapsePanel();
-
-    /** Animates the expansion of the panel. */
-    protected void animateExpandPanel() {
-        if (!shouldAnimateExpandPanel()) {
-            return;
-        }
-
-        if (!mCarDeviceProvisionedController.isCurrentUserFullySetup()) {
-            return;
-        }
-
-        onAnimateExpandPanel();
-        setPanelVisible(true);
-        animatePanel(mOpeningVelocity, /* isClosing= */ false);
-
-        setPanelExpanded(true);
-    }
-
-    /** Determines whether {@link #animateExpandPanel()}} should expand the panel. */
-    protected abstract boolean shouldAnimateExpandPanel();
-
-    /** Called when the panel is beginning to expand. */
-    protected abstract void onAnimateExpandPanel();
-
-    /**
-     * Depending on certain conditions, determines whether to fully expand or collapse the panel.
-     */
-    protected void maybeCompleteAnimation(MotionEvent event) {
-        if (event.getActionMasked() == MotionEvent.ACTION_UP
-                && isPanelVisible()) {
-            if (mSettleClosePercentage < mPercentageFromBottom) {
-                animatePanel(DEFAULT_FLING_VELOCITY, false);
-            } else {
-                animatePanel(DEFAULT_FLING_VELOCITY, true);
-            }
-        }
-    }
-
-    /**
-     * Animates the panel from one position to other. This is used to either open or
-     * close the panel completely with a velocity. If the animation is to close the
-     * panel this method also makes the view invisible after animation ends.
-     */
-    protected void animatePanel(float velocity, boolean isClosing) {
-        float to = 0;
-        if (!isClosing) {
-            to = getLayout().getHeight();
-        }
-
-        Rect rect = getLayout().getClipBounds();
-        if (rect != null && rect.bottom != to) {
-            float from = rect.bottom;
-            animate(from, to, velocity, isClosing);
-            return;
-        }
-
-        // We will only be here if the shade is being opened programmatically or via button when
-        // height of the layout was not calculated.
-        ViewTreeObserver notificationTreeObserver = getLayout().getViewTreeObserver();
-        notificationTreeObserver.addOnGlobalLayoutListener(
-                new ViewTreeObserver.OnGlobalLayoutListener() {
-                    @Override
-                    public void onGlobalLayout() {
-                        ViewTreeObserver obs = getLayout().getViewTreeObserver();
-                        obs.removeOnGlobalLayoutListener(this);
-                        float to = getLayout().getHeight();
-                        animate(/* from= */ 0, to, velocity, isClosing);
-                    }
-                });
-    }
-
-    private void animate(float from, float to, float velocity, boolean isClosing) {
-        if (mIsAnimating) {
-            return;
-        }
-        mIsAnimating = true;
-        mIsTracking = true;
-        ValueAnimator animator = ValueAnimator.ofFloat(from, to);
-        animator.addUpdateListener(
-                animation -> {
-                    float animatedValue = (Float) animation.getAnimatedValue();
-                    setViewClipBounds((int) animatedValue);
-                });
-        animator.addListener(new AnimatorListenerAdapter() {
-            @Override
-            public void onAnimationEnd(Animator animation) {
-                super.onAnimationEnd(animation);
-                mIsAnimating = false;
-                mIsTracking = false;
-                mOpeningVelocity = DEFAULT_FLING_VELOCITY;
-                mClosingVelocity = DEFAULT_FLING_VELOCITY;
-                if (isClosing) {
-                    setPanelVisible(false);
-                    getLayout().setClipBounds(null);
-                    onCollapseAnimationEnd();
-                    setPanelExpanded(false);
-                } else {
-                    onExpandAnimationEnd();
-                    setPanelExpanded(true);
-                }
-            }
-        });
-        getFlingAnimationUtils().apply(animator, from, to, Math.abs(velocity));
-        animator.start();
-    }
-
-    /**
-     * Called in {@link Animator.AnimatorListener#onAnimationEnd(Animator)} when the panel is
-     * closing.
-     */
-    protected abstract void onCollapseAnimationEnd();
-
-    /**
-     * Called in {@link Animator.AnimatorListener#onAnimationEnd(Animator)} when the panel is
-     * opening.
-     */
-    protected abstract void onExpandAnimationEnd();
-
-    /* ***************************************************************************************** *
-     * Panel Visibility
-     * ***************************************************************************************** */
-
-    /** Set the panel view to be visible. */
-    protected final void setPanelVisible(boolean visible) {
-        mPanelVisible = visible;
-        onPanelVisible(visible);
-    }
-
-    /** Returns {@code true} if panel is visible. */
-    public final boolean isPanelVisible() {
-        return mPanelVisible;
-    }
-
-    /** Business logic run when panel visibility is set. */
-    @CallSuper
-    protected void onPanelVisible(boolean visible) {
-        if (DEBUG) {
-            Log.e(TAG, "onPanelVisible: " + visible);
-        }
-
-        if (visible && !getOverlayViewGlobalStateController().isWindowVisible()) {
-            getOverlayViewGlobalStateController().setWindowVisible(true);
-        }
-        if (!visible && getOverlayViewGlobalStateController().isWindowVisible()) {
-            getOverlayViewGlobalStateController().setWindowVisible(false);
-        }
-        getLayout().setVisibility(visible ? View.VISIBLE : View.INVISIBLE);
-        getOverlayViewGlobalStateController().setWindowFocusable(visible);
-    }
-
-    /* ***************************************************************************************** *
-     * Panel Expansion
-     * ***************************************************************************************** */
-
-    /**
-     * Set the panel state to expanded. This will expand or collapse the overlay window if
-     * necessary.
-     */
-    protected final void setPanelExpanded(boolean expand) {
-        mPanelExpanded = expand;
-        onPanelExpanded(expand);
-    }
-
-    /** Returns {@code true} if panel is expanded. */
-    public final boolean isPanelExpanded() {
-        return mPanelExpanded;
-    }
-
-    @CallSuper
-    protected void onPanelExpanded(boolean expand) {
-        if (DEBUG) {
-            Log.e(TAG, "onPanelExpanded: " + expand);
-        }
-    }
-
-    /* ***************************************************************************************** *
-     * Misc
-     * ***************************************************************************************** */
-
-    protected void calculatePercentageFromBottom(float height) {
-        if (getLayout().getHeight() > 0) {
-            mPercentageFromBottom = (int) Math.abs(
-                    height / getLayout().getHeight() * 100);
-        }
-    }
-
-    protected void setViewClipBounds(int height) {
-        if (height > getLayout().getHeight()) {
-            height = getLayout().getHeight();
-        }
-        Rect clipBounds = new Rect();
-        clipBounds.set(0, 0, getLayout().getWidth(), height);
-        getLayout().setClipBounds(clipBounds);
-        onScroll(height);
-    }
-
-    /** Called while scrolling. */
-    protected abstract void onScroll(int height);
-
-    /* ***************************************************************************************** *
-     * Getters
-     * ***************************************************************************************** */
-
-    /** Returns the open touch listener. */
-    public final View.OnTouchListener getDragOpenTouchListener() {
-        return mDragOpenTouchListener;
-    }
-
-    /** Returns the close touch listener. */
-    public final View.OnTouchListener getDragCloseTouchListener() {
-        return mDragCloseTouchListener;
-    }
-
-    /** Gets the fling animation utils used for animating this panel. */
-    protected final FlingAnimationUtils getFlingAnimationUtils() {
-        return mFlingAnimationUtils;
-    }
-
-    /** Returns {@code true} if the panel is currently tracking. */
-    protected final boolean isTracking() {
-        return mIsTracking;
-    }
-
-    /** Returns {@code true} if the panel is currently animating. */
-    protected final boolean isAnimating() {
-        return mIsAnimating;
-    }
-
-    /** Returns the percentage of the panel that is open from the bottom. */
-    protected final int getPercentageFromBottom() {
-        return mPercentageFromBottom;
-    }
-
-    /** Returns the percentage at which we've determined whether to open or close the panel. */
-    protected final int getSettleClosePercentage() {
-        return mSettleClosePercentage;
-    }
-
-    /* ***************************************************************************************** *
-     * Gesture Listeners
-     * ***************************************************************************************** */
-
-    /** Called when the user is beginning to scroll down the panel. */
-    protected abstract void onOpenScrollStart();
-
-    /**
-     * Only responsible for open hooks. Since once the panel opens it covers all elements
-     * there is no need to merge with close.
-     */
-    protected abstract class OpenGestureListener extends
-            GestureDetector.SimpleOnGestureListener {
-
-        @Override
-        public boolean onScroll(MotionEvent event1, MotionEvent event2, float distanceX,
-                float distanceY) {
-
-            if (!isPanelVisible()) {
-                onOpenScrollStart();
-            }
-            setPanelVisible(true);
-
-            // clips the view for the notification shade when the user scrolls to open.
-            setViewClipBounds((int) event2.getRawY());
-
-            // Initially the scroll starts with height being zero. This checks protects from divide
-            // by zero error.
-            calculatePercentageFromBottom(event2.getRawY());
-
-            mIsTracking = true;
-            return true;
-        }
-
-
-        @Override
-        public boolean onFling(MotionEvent event1, MotionEvent event2,
-                float velocityX, float velocityY) {
-            if (velocityY > SWIPE_THRESHOLD_VELOCITY) {
-                mOpeningVelocity = velocityY;
-                open();
-                return true;
-            }
-            animatePanel(DEFAULT_FLING_VELOCITY, true);
-
-            return false;
-        }
-
-        protected abstract void open();
-    }
-
-    /** Determines whether the scroll event should allow closing of the panel. */
-    protected abstract boolean shouldAllowClosingScroll();
-
-    protected abstract class CloseGestureListener extends
-            GestureDetector.SimpleOnGestureListener {
-
-        @Override
-        public boolean onSingleTapUp(MotionEvent motionEvent) {
-            if (isPanelExpanded()) {
-                animatePanel(DEFAULT_FLING_VELOCITY, true);
-            }
-            return true;
-        }
-
-        @Override
-        public boolean onScroll(MotionEvent event1, MotionEvent event2, float distanceX,
-                float distanceY) {
-            // should not clip while scroll to the bottom of the list.
-            if (!shouldAllowClosingScroll()) {
-                return false;
-            }
-            float actualNotificationHeight =
-                    getLayout().getHeight() - (event1.getRawY() - event2.getRawY());
-            if (actualNotificationHeight > getLayout().getHeight()) {
-                actualNotificationHeight = getLayout().getHeight();
-            }
-            if (getLayout().getHeight() > 0) {
-                mPercentageFromBottom = (int) Math.abs(
-                        actualNotificationHeight / getLayout().getHeight() * 100);
-                boolean isUp = distanceY > 0;
-
-                // This check is to figure out if onScroll was called while swiping the card at
-                // bottom of the list. At that time we should not allow notification shade to
-                // close. We are also checking for the upwards swipe gesture here because it is
-                // possible if a user is closing the notification shade and while swiping starts
-                // to open again but does not fling. At that time we should allow the
-                // notification shade to close fully or else it would stuck in between.
-                if (Math.abs(getLayout().getHeight() - actualNotificationHeight)
-                        > SWIPE_DOWN_MIN_DISTANCE && isUp) {
-                    setViewClipBounds((int) actualNotificationHeight);
-                    mIsTracking = true;
-                } else if (!isUp) {
-                    setViewClipBounds((int) actualNotificationHeight);
-                }
-            }
-            // if we return true the items in RV won't be scrollable.
-            return false;
-        }
-
-
-        @Override
-        public boolean onFling(MotionEvent event1, MotionEvent event2,
-                float velocityX, float velocityY) {
-            // should not fling if the touch does not start when view is at the bottom of the list.
-            if (!shouldAllowClosingScroll()) {
-                return false;
-            }
-            if (Math.abs(event1.getX() - event2.getX()) > SWIPE_MAX_OFF_PATH
-                    || Math.abs(velocityY) < SWIPE_THRESHOLD_VELOCITY) {
-                // swipe was not vertical or was not fast enough
-                return false;
-            }
-            boolean isUp = velocityY < 0;
-            if (isUp) {
-                close();
-                return true;
-            } else {
-                // we should close the shade
-                animatePanel(velocityY, false);
-            }
-            return false;
-        }
-
-        protected abstract void close();
-    }
-
-    protected abstract class SystemBarCloseGestureListener extends CloseGestureListener {
-        @Override
-        public boolean onSingleTapUp(MotionEvent e) {
-            mClosingVelocity = DEFAULT_FLING_VELOCITY;
-            if (isPanelExpanded()) {
-                close();
-            }
-            return super.onSingleTapUp(e);
-        }
-
-        @Override
-        public boolean onScroll(MotionEvent event1, MotionEvent event2, float distanceX,
-                float distanceY) {
-            calculatePercentageFromBottom(event2.getRawY());
-            setViewClipBounds((int) event2.getRawY());
-            return true;
-        }
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/window/OverlayViewController.java b/packages/CarSystemUI/src/com/android/systemui/window/OverlayViewController.java
deleted file mode 100644
index 15ef0be..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/window/OverlayViewController.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.window;
-
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.ViewStub;
-
-/**
- * Owns a {@link View} that is present in SystemUIOverlayWindow.
- */
-public class OverlayViewController {
-    private final int mStubId;
-    private final OverlayViewGlobalStateController mOverlayViewGlobalStateController;
-
-    private View mLayout;
-
-    public OverlayViewController(int stubId,
-            OverlayViewGlobalStateController overlayViewGlobalStateController) {
-        mLayout = null;
-        mStubId = stubId;
-        mOverlayViewGlobalStateController = overlayViewGlobalStateController;
-    }
-
-    /**
-     * Shows content of {@link OverlayViewController}.
-     *
-     * Should be used to show view externally and in particular by {@link OverlayViewMediator}.
-     */
-    public final void start() {
-        mOverlayViewGlobalStateController.showView(/* viewController= */ this, this::show);
-    }
-
-    /**
-     * Hides content of {@link OverlayViewController}.
-     *
-     * Should be used to hide view externally and in particular by {@link OverlayViewMediator}.
-     */
-    public final void stop() {
-        mOverlayViewGlobalStateController.hideView(/* viewController= */ this, this::hide);
-    }
-
-
-    /**
-     * Inflate layout owned by controller.
-     */
-    public final void inflate(ViewGroup baseLayout) {
-        ViewStub viewStub = baseLayout.findViewById(mStubId);
-        mLayout = viewStub.inflate();
-        onFinishInflate();
-    }
-
-    /**
-     * Called once inflate finishes.
-     */
-    protected void onFinishInflate() {
-        // no-op
-    }
-
-    /**
-     * Returns [@code true} if layout owned by controller has been inflated.
-     */
-    public final boolean isInflated() {
-        return mLayout != null;
-    }
-
-    private void show() {
-        if (mLayout == null) {
-            // layout must be inflated before show() is called.
-            return;
-        }
-        showInternal();
-    }
-
-    /**
-     * Subclasses should override this method to implement reveal animations and implement logic
-     * specific to when the layout owned by the controller is shown.
-     *
-     * Should only be overridden by Superclass but not called by any {@link OverlayViewMediator}.
-     */
-    protected void showInternal() {
-        mLayout.setVisibility(View.VISIBLE);
-    }
-
-    private void hide() {
-        if (mLayout == null) {
-            // layout must be inflated before hide() is called.
-            return;
-        }
-        hideInternal();
-    }
-
-    /**
-     * Subclasses should override this method to implement conceal animations and implement logic
-     * specific to when the layout owned by the controller is hidden.
-     *
-     * Should only be overridden by Superclass but not called by any {@link OverlayViewMediator}.
-     */
-    protected void hideInternal() {
-        mLayout.setVisibility(View.GONE);
-    }
-
-    /**
-     * Provides access to layout owned by controller.
-     */
-    protected final View getLayout() {
-        return mLayout;
-    }
-
-    /** Returns the {@link OverlayViewGlobalStateController}. */
-    protected final OverlayViewGlobalStateController getOverlayViewGlobalStateController() {
-        return mOverlayViewGlobalStateController;
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/window/OverlayViewGlobalStateController.java b/packages/CarSystemUI/src/com/android/systemui/window/OverlayViewGlobalStateController.java
deleted file mode 100644
index 402d742..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/window/OverlayViewGlobalStateController.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.window;
-
-import android.util.Log;
-
-import androidx.annotation.VisibleForTesting;
-
-import com.android.systemui.navigationbar.car.CarNavigationBarController;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import javax.inject.Inject;
-import javax.inject.Singleton;
-
-/**
- * This controller is responsible for the following:
- * <p><ul>
- * <li>Holds the global state for SystemUIOverlayWindow.
- * <li>Allows {@link SystemUIOverlayWindowManager} to register {@link OverlayViewMediator}(s).
- * <li>Enables {@link OverlayViewController)(s) to reveal/conceal themselves while respecting the
- * global state of SystemUIOverlayWindow.
- * </ul>
- */
-@Singleton
-public class OverlayViewGlobalStateController {
-    private static final String TAG = OverlayViewGlobalStateController.class.getSimpleName();
-    private final SystemUIOverlayWindowController mSystemUIOverlayWindowController;
-    private final CarNavigationBarController mCarNavigationBarController;
-    @VisibleForTesting
-    Set<String> mShownSet;
-
-    @Inject
-    public OverlayViewGlobalStateController(
-            CarNavigationBarController carNavigationBarController,
-            SystemUIOverlayWindowController systemUIOverlayWindowController) {
-        mSystemUIOverlayWindowController = systemUIOverlayWindowController;
-        mSystemUIOverlayWindowController.attach();
-        mCarNavigationBarController = carNavigationBarController;
-        mShownSet = new HashSet<>();
-    }
-
-    /**
-     * Register {@link OverlayViewMediator} to use in SystemUIOverlayWindow.
-     */
-    public void registerMediator(OverlayViewMediator overlayViewMediator) {
-        Log.d(TAG, "Registering content mediator: " + overlayViewMediator.getClass().getName());
-
-        overlayViewMediator.registerListeners();
-        overlayViewMediator.setupOverlayContentViewControllers();
-    }
-
-    /**
-     * Show content in Overlay Window.
-     */
-    public void showView(OverlayViewController viewController, Runnable show) {
-        if (mShownSet.isEmpty()) {
-            mCarNavigationBarController.hideBars();
-            setWindowVisible(true);
-        }
-
-        inflateView(viewController);
-
-        show.run();
-        mShownSet.add(viewController.getClass().getName());
-
-        Log.d(TAG, "Content shown: " + viewController.getClass().getName());
-    }
-
-    /**
-     * Hide content in Overlay Window.
-     */
-    public void hideView(OverlayViewController viewController, Runnable hide) {
-        if (!viewController.isInflated()) {
-            Log.d(TAG, "Content cannot be hidden since it isn't inflated: "
-                    + viewController.getClass().getName());
-            return;
-        }
-        if (!mShownSet.contains(viewController.getClass().getName())) {
-            Log.d(TAG, "Content cannot be hidden since it isn't shown: "
-                    + viewController.getClass().getName());
-            return;
-        }
-
-        hide.run();
-        mShownSet.remove(viewController.getClass().getName());
-
-        if (mShownSet.isEmpty()) {
-            mCarNavigationBarController.showBars();
-            setWindowVisible(false);
-        }
-
-        Log.d(TAG, "Content hidden: " + viewController.getClass().getName());
-    }
-
-    /** Sets the window visibility state. */
-    public void setWindowVisible(boolean expanded) {
-        mSystemUIOverlayWindowController.setWindowVisible(expanded);
-    }
-
-    /** Returns {@code true} is the window is visible. */
-    public boolean isWindowVisible() {
-        return mSystemUIOverlayWindowController.isWindowVisible();
-    }
-
-    /** Sets the focusable flag of the sysui overlawy window. */
-    public void setWindowFocusable(boolean focusable) {
-        mSystemUIOverlayWindowController.setWindowFocusable(focusable);
-    }
-
-    /** Returns {@code true} if the window is focusable. */
-    public boolean isWindowFocusable() {
-        return mSystemUIOverlayWindowController.isWindowFocusable();
-    }
-
-    /** Inflates the view controlled by the given view controller. */
-    public void inflateView(OverlayViewController viewController) {
-        if (!viewController.isInflated()) {
-            viewController.inflate(mSystemUIOverlayWindowController.getBaseLayout());
-        }
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/window/OverlayViewMediator.java b/packages/CarSystemUI/src/com/android/systemui/window/OverlayViewMediator.java
deleted file mode 100644
index 7c34fb4..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/window/OverlayViewMediator.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.window;
-
-/**
- * Controls when to show and hide {@link OverlayViewController}(s).
- */
-public interface OverlayViewMediator {
-
-    /**
-     * Register listeners that could use ContentVisibilityAdjuster to show/hide content.
-     */
-    void registerListeners();
-
-    /**
-     * Allows for post-inflation callbacks and listeners to be set inside required {@link
-     * OverlayViewController}(s).
-     */
-    void setupOverlayContentViewControllers();
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/window/OverlayWindowModule.java b/packages/CarSystemUI/src/com/android/systemui/window/OverlayWindowModule.java
deleted file mode 100644
index 6b4f3e3..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/window/OverlayWindowModule.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.window;
-
-import com.android.systemui.car.keyguard.CarKeyguardViewMediator;
-import com.android.systemui.car.notification.NotificationPanelViewMediator;
-import com.android.systemui.car.userswitcher.FullscreenUserSwitcherViewMediator;
-
-import dagger.Binds;
-import dagger.Module;
-import dagger.multibindings.ClassKey;
-import dagger.multibindings.IntoMap;
-
-/**
- * Dagger injection module for {@link SystemUIOverlayWindowManager}
- */
-@Module
-public abstract class OverlayWindowModule {
-
-    /** Injects NotificationPanelViewMediator. */
-    @Binds
-    @IntoMap
-    @ClassKey(NotificationPanelViewMediator.class)
-    public abstract OverlayViewMediator bindNotificationPanelViewMediator(
-            NotificationPanelViewMediator notificationPanelViewMediator);
-
-    /** Inject into CarKeyguardViewMediator. */
-    @Binds
-    @IntoMap
-    @ClassKey(CarKeyguardViewMediator.class)
-    public abstract OverlayViewMediator bindCarKeyguardViewMediator(
-            CarKeyguardViewMediator carKeyguardViewMediator);
-
-    /** Injects FullscreenUserSwitcherViewsMediator. */
-    @Binds
-    @IntoMap
-    @ClassKey(FullscreenUserSwitcherViewMediator.class)
-    public abstract OverlayViewMediator bindFullscreenUserSwitcherViewsMediator(
-            FullscreenUserSwitcherViewMediator overlayViewsMediator);
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/window/SystemUIOverlayWindowController.java b/packages/CarSystemUI/src/com/android/systemui/window/SystemUIOverlayWindowController.java
deleted file mode 100644
index 0dbe1a3..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/window/SystemUIOverlayWindowController.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.window;
-
-import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
-
-import android.content.Context;
-import android.graphics.PixelFormat;
-import android.os.Binder;
-import android.view.Gravity;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.WindowManager;
-
-import com.android.systemui.R;
-import com.android.systemui.statusbar.policy.ConfigurationController;
-
-import javax.inject.Inject;
-import javax.inject.Singleton;
-
-/**
- * Controls the expansion state of the primary window which will contain all of the fullscreen sysui
- * behavior. This window still has a collapsed state in order to watch for swipe events to expand
- * this window for the notification panel.
- */
-@Singleton
-public class SystemUIOverlayWindowController implements
-        ConfigurationController.ConfigurationListener {
-
-    private final Context mContext;
-    private final WindowManager mWindowManager;
-
-    private ViewGroup mBaseLayout;
-    private WindowManager.LayoutParams mLp;
-    private WindowManager.LayoutParams mLpChanged;
-    private boolean mIsAttached = false;
-    private boolean mVisible = false;
-    private boolean mFocusable = false;
-
-    @Inject
-    public SystemUIOverlayWindowController(
-            Context context,
-            WindowManager windowManager,
-            ConfigurationController configurationController
-    ) {
-        mContext = context;
-        mWindowManager = windowManager;
-
-        mLpChanged = new WindowManager.LayoutParams();
-        mBaseLayout = (ViewGroup) LayoutInflater.from(context)
-                .inflate(R.layout.sysui_overlay_window, /* root= */ null, false);
-
-        configurationController.addCallback(this);
-    }
-
-    /** Returns the base view of the primary window. */
-    public ViewGroup getBaseLayout() {
-        return mBaseLayout;
-    }
-
-    /** Returns {@code true} if the window is already attached. */
-    public boolean isAttached() {
-        return mIsAttached;
-    }
-
-    /** Attaches the window to the window manager. */
-    public void attach() {
-        if (mIsAttached) {
-            return;
-        }
-        mIsAttached = true;
-        // Now that the status bar window encompasses the sliding panel and its
-        // translucent backdrop, the entire thing is made TRANSLUCENT and is
-        // hardware-accelerated.
-        mLp = new WindowManager.LayoutParams(
-                ViewGroup.LayoutParams.MATCH_PARENT,
-                ViewGroup.LayoutParams.MATCH_PARENT,
-                WindowManager.LayoutParams.TYPE_STATUS_BAR_SUB_PANEL,
-                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
-                        | WindowManager.LayoutParams.FLAG_TOUCHABLE_WHEN_WAKING
-                        | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH
-                        | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
-                        | WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS,
-                PixelFormat.TRANSLUCENT);
-        mLp.token = new Binder();
-        mLp.gravity = Gravity.TOP;
-        mLp.setFitInsetsTypes(/* types= */ 0);
-        mLp.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE;
-        mLp.setTitle("SystemUIOverlayWindow");
-        mLp.packageName = mContext.getPackageName();
-        mLp.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
-
-        mWindowManager.addView(mBaseLayout, mLp);
-        mLpChanged.copyFrom(mLp);
-        setWindowVisible(false);
-    }
-
-    /** Sets the window to the visible state. */
-    public void setWindowVisible(boolean visible) {
-        mVisible = visible;
-        if (visible) {
-            mBaseLayout.setVisibility(View.VISIBLE);
-        } else {
-            mBaseLayout.setVisibility(View.INVISIBLE);
-        }
-        updateWindow();
-    }
-
-    /** Sets the window to be focusable. */
-    public void setWindowFocusable(boolean focusable) {
-        mFocusable = focusable;
-        if (focusable) {
-            mLpChanged.flags &= ~WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
-        } else {
-            mLpChanged.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
-        }
-        updateWindow();
-    }
-
-    /** Returns {@code true} if the window is visible */
-    public boolean isWindowVisible() {
-        return mVisible;
-    }
-
-    public boolean isWindowFocusable() {
-        return mFocusable;
-    }
-
-    private void updateWindow() {
-        if (mLp != null && mLp.copyFrom(mLpChanged) != 0) {
-            if (isAttached()) {
-                mWindowManager.updateViewLayout(mBaseLayout, mLp);
-            }
-        }
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/window/SystemUIOverlayWindowManager.java b/packages/CarSystemUI/src/com/android/systemui/window/SystemUIOverlayWindowManager.java
deleted file mode 100644
index af0f17d..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/window/SystemUIOverlayWindowManager.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.window;
-
-import android.content.Context;
-
-import com.android.systemui.R;
-import com.android.systemui.SystemUI;
-
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
-import java.util.Map;
-
-import javax.inject.Inject;
-import javax.inject.Provider;
-import javax.inject.Singleton;
-
-/**
- * Registers {@link OverlayViewMediator}(s) and synchronizes their calls to hide/show {@link
- * OverlayViewController}(s) to allow for the correct visibility of system bars.
- */
-@Singleton
-public class SystemUIOverlayWindowManager extends SystemUI {
-    private static final String TAG = "SystemUIOverlayWindowManager";
-    private final Map<Class<?>, Provider<OverlayViewMediator>>
-            mContentMediatorCreators;
-    private final OverlayViewGlobalStateController mOverlayViewGlobalStateController;
-
-    @Inject
-    public SystemUIOverlayWindowManager(
-            Context context,
-            Map<Class<?>, Provider<OverlayViewMediator>> contentMediatorCreators,
-            OverlayViewGlobalStateController overlayViewGlobalStateController) {
-        super(context);
-        mContentMediatorCreators = contentMediatorCreators;
-        mOverlayViewGlobalStateController = overlayViewGlobalStateController;
-    }
-
-    @Override
-    public void start() {
-        String[] names = mContext.getResources().getStringArray(
-                R.array.config_carSystemUIOverlayViewsMediators);
-        startServices(names);
-    }
-
-    private void startServices(String[] services) {
-        for (String clsName : services) {
-            try {
-                OverlayViewMediator obj = resolveContentMediator(clsName);
-                if (obj == null) {
-                    Constructor constructor = Class.forName(clsName).getConstructor(Context.class);
-                    obj = (OverlayViewMediator) constructor.newInstance(this);
-                }
-                mOverlayViewGlobalStateController.registerMediator(obj);
-            } catch (ClassNotFoundException
-                    | NoSuchMethodException
-                    | IllegalAccessException
-                    | InstantiationException
-                    | InvocationTargetException ex) {
-                throw new RuntimeException(ex);
-            }
-        }
-    }
-
-    private OverlayViewMediator resolveContentMediator(String className) {
-        return resolve(className, mContentMediatorCreators);
-    }
-
-    private <T> T resolve(String className, Map<Class<?>, Provider<T>> creators) {
-        try {
-            Class<?> clazz = Class.forName(className);
-            Provider<T> provider = creators.get(clazz);
-            return provider == null ? null : provider.get();
-        } catch (ClassNotFoundException e) {
-            return null;
-        }
-    }
-}
diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/car/hvac/HvacControllerTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/car/hvac/HvacControllerTest.java
new file mode 100644
index 0000000..7996170
--- /dev/null
+++ b/packages/CarSystemUI/tests/src/com/android/systemui/car/hvac/HvacControllerTest.java
@@ -0,0 +1,135 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.car.hvac;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.car.Car;
+import android.car.hardware.hvac.CarHvacManager;
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper;
+
+import androidx.test.filters.SmallTest;
+
+import com.android.systemui.SysuiTestCase;
+import com.android.systemui.car.CarServiceProvider;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidTestingRunner.class)
[email protected]
+@SmallTest
+public class HvacControllerTest extends SysuiTestCase {
+
+    private static final int PROPERTY_ID = 1;
+    private static final int AREA_ID = 1;
+    private static final float VALUE = 72.0f;
+
+    private HvacController mHvacController;
+    private CarServiceProvider mCarServiceProvider;
+
+    @Mock
+    private Car mCar;
+    @Mock
+    private CarHvacManager mCarHvacManager;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        when(mCar.isConnected()).thenReturn(true);
+        when(mCar.getCarManager(Car.HVAC_SERVICE)).thenReturn(mCarHvacManager);
+
+        mCarServiceProvider = new CarServiceProvider(mContext, mCar);
+        mHvacController = new HvacController(mCarServiceProvider);
+        mHvacController.connectToCarService();
+    }
+
+    @Test
+    public void connectToCarService_registersCallback() {
+        verify(mCarHvacManager).registerCallback(any());
+    }
+
+    @Test
+    public void addTemperatureViewToController_usingTemperatureView_registersView() {
+        TemperatureTextView v = setupMockTemperatureTextView(PROPERTY_ID, AREA_ID, VALUE);
+        mHvacController.addTemperatureViewToController(v);
+
+        verify(v).setTemp(VALUE);
+    }
+
+    @Test
+    public void addTemperatureViewToController_usingSameTemperatureView_registersFirstView() {
+        TemperatureTextView v = setupMockTemperatureTextView(PROPERTY_ID, AREA_ID, VALUE);
+        mHvacController.addTemperatureViewToController(v);
+        verify(v).setTemp(VALUE);
+        resetTemperatureView(v, PROPERTY_ID, AREA_ID);
+
+        mHvacController.addTemperatureViewToController(v);
+        verify(v, never()).setTemp(VALUE);
+    }
+
+    @Test
+    public void addTemperatureViewToController_usingDifferentTemperatureView_registersBothViews() {
+        TemperatureTextView v1 = setupMockTemperatureTextView(PROPERTY_ID, AREA_ID, VALUE);
+        mHvacController.addTemperatureViewToController(v1);
+        verify(v1).setTemp(VALUE);
+
+        TemperatureTextView v2 = setupMockTemperatureTextView(
+                PROPERTY_ID + 1,
+                AREA_ID + 1,
+                VALUE + 1);
+        mHvacController.addTemperatureViewToController(v2);
+        verify(v2).setTemp(VALUE + 1);
+    }
+
+    @Test
+    public void removeAllComponents_ableToRegisterSameView() {
+        TemperatureTextView v = setupMockTemperatureTextView(PROPERTY_ID, AREA_ID, VALUE);
+        mHvacController.addTemperatureViewToController(v);
+        verify(v).setTemp(VALUE);
+
+        mHvacController.removeAllComponents();
+        resetTemperatureView(v, PROPERTY_ID, AREA_ID);
+
+        mHvacController.addTemperatureViewToController(v);
+        verify(v).setTemp(VALUE);
+    }
+
+    private TemperatureTextView setupMockTemperatureTextView(int propertyId, int areaId,
+            float value) {
+        TemperatureTextView v = mock(TemperatureTextView.class);
+        resetTemperatureView(v, propertyId, areaId);
+        when(mCarHvacManager.isPropertyAvailable(propertyId, areaId)).thenReturn(true);
+        when(mCarHvacManager.getFloatProperty(propertyId, areaId)).thenReturn(value);
+        return v;
+    }
+
+    private void resetTemperatureView(TemperatureTextView view, int propertyId, int areaId) {
+        reset(view);
+        when(view.getPropertyId()).thenReturn(propertyId);
+        when(view.getAreaId()).thenReturn(areaId);
+    }
+}
diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/car/keyguard/CarKeyguardViewControllerTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/car/keyguard/CarKeyguardViewControllerTest.java
new file mode 100644
index 0000000..d40b1af
--- /dev/null
+++ b/packages/CarSystemUI/tests/src/com/android/systemui/car/keyguard/CarKeyguardViewControllerTest.java
@@ -0,0 +1,209 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.car.keyguard;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.os.Handler;
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.android.internal.widget.LockPatternUtils;
+import com.android.keyguard.KeyguardUpdateMonitor;
+import com.android.keyguard.ViewMediatorCallback;
+import com.android.systemui.R;
+import com.android.systemui.SysuiTestCase;
+import com.android.systemui.car.CarServiceProvider;
+import com.android.systemui.car.navigationbar.CarNavigationBarController;
+import com.android.systemui.car.window.OverlayViewGlobalStateController;
+import com.android.systemui.car.window.SystemUIOverlayWindowController;
+import com.android.systemui.keyguard.DismissCallbackRegistry;
+import com.android.systemui.plugins.FalsingManager;
+import com.android.systemui.statusbar.phone.BiometricUnlockController;
+import com.android.systemui.statusbar.phone.KeyguardBouncer;
+import com.android.systemui.statusbar.phone.KeyguardBypassController;
+import com.android.systemui.statusbar.policy.KeyguardStateController;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidTestingRunner.class)
[email protected]
+public class CarKeyguardViewControllerTest extends SysuiTestCase {
+
+    private TestableCarKeyguardViewController mCarKeyguardViewController;
+    private OverlayViewGlobalStateController mOverlayViewGlobalStateController;
+    private ViewGroup mBaseLayout;
+
+    @Mock
+    private KeyguardBouncer mBouncer;
+    @Mock
+    private CarNavigationBarController mCarNavigationBarController;
+    @Mock
+    private SystemUIOverlayWindowController mSystemUIOverlayWindowController;
+    @Mock
+    private CarKeyguardViewController.OnKeyguardCancelClickedListener mCancelClickedListener;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        mOverlayViewGlobalStateController = new OverlayViewGlobalStateController(
+                mCarNavigationBarController, mSystemUIOverlayWindowController);
+        mBaseLayout = (ViewGroup) LayoutInflater.from(mContext).inflate(
+                R.layout.sysui_overlay_window, /* root= */ null);
+        when(mSystemUIOverlayWindowController.getBaseLayout()).thenReturn(mBaseLayout);
+
+        mCarKeyguardViewController = new TestableCarKeyguardViewController(
+                mContext,
+                Handler.getMain(),
+                mock(CarServiceProvider.class),
+                mOverlayViewGlobalStateController,
+                mock(KeyguardStateController.class),
+                mock(KeyguardUpdateMonitor.class),
+                mock(BiometricUnlockController.class),
+                mock(ViewMediatorCallback.class),
+                mock(CarNavigationBarController.class),
+                mock(LockPatternUtils.class),
+                mock(DismissCallbackRegistry.class),
+                mock(FalsingManager.class),
+                mock(KeyguardBypassController.class)
+        );
+    }
+
+    @Test
+    public void onShow_bouncerIsSecure_showsBouncerWithSecuritySelectionReset() {
+        when(mBouncer.isSecure()).thenReturn(true);
+        mCarKeyguardViewController.show(/* options= */ null);
+
+        verify(mBouncer).show(/* resetSecuritySelection= */ true);
+    }
+
+    @Test
+    public void onShow_bouncerIsSecure_keyguardIsVisible() {
+        when(mBouncer.isSecure()).thenReturn(true);
+        mCarKeyguardViewController.show(/* options= */ null);
+
+        assertThat(mBaseLayout.findViewById(R.id.keyguard_container).getVisibility()).isEqualTo(
+                View.VISIBLE);
+    }
+
+    @Test
+    public void onShow_bouncerNotSecure_hidesBouncerAndDestroysTheView() {
+        when(mBouncer.isSecure()).thenReturn(false);
+        mCarKeyguardViewController.show(/* options= */ null);
+
+        verify(mBouncer).hide(/* destroyView= */ true);
+    }
+
+    @Test
+    public void onShow_bouncerNotSecure_keyguardIsNotVisible() {
+        when(mBouncer.isSecure()).thenReturn(false);
+        mCarKeyguardViewController.show(/* options= */ null);
+
+        assertThat(mBaseLayout.findViewById(R.id.keyguard_container).getVisibility()).isEqualTo(
+                View.GONE);
+    }
+
+    @Test
+    public void onHide_keyguardShowing_hidesBouncerAndDestroysTheView() {
+        when(mBouncer.isSecure()).thenReturn(true);
+        mCarKeyguardViewController.show(/* options= */ null);
+        mCarKeyguardViewController.hide(/* startTime= */ 0, /* fadeoutDelay= */ 0);
+
+        verify(mBouncer).hide(/* destroyView= */ true);
+    }
+
+    @Test
+    public void onHide_keyguardNotShown_doesNotHideOrDestroyBouncer() {
+        mCarKeyguardViewController.hide(/* startTime= */ 0, /* fadeoutDelay= */ 0);
+
+        verify(mBouncer, never()).hide(anyBoolean());
+    }
+
+    @Test
+    public void onHide_KeyguardNotVisible() {
+        when(mBouncer.isSecure()).thenReturn(true);
+        mCarKeyguardViewController.show(/* options= */ null);
+        mCarKeyguardViewController.hide(/* startTime= */ 0, /* fadeoutDelay= */ 0);
+
+        assertThat(mBaseLayout.findViewById(R.id.keyguard_container).getVisibility()).isEqualTo(
+                View.GONE);
+    }
+
+    @Test
+    public void onCancelClicked_callsCancelClickedListener() {
+        when(mBouncer.isSecure()).thenReturn(true);
+        mCarKeyguardViewController.show(/* options= */ null);
+        mCarKeyguardViewController.registerOnKeyguardCancelClickedListener(mCancelClickedListener);
+        mCarKeyguardViewController.onCancelClicked();
+
+        verify(mCancelClickedListener).onCancelClicked();
+    }
+
+    @Test
+    public void onCancelClicked_hidesBouncerAndDestroysTheView() {
+        when(mBouncer.isSecure()).thenReturn(true);
+        mCarKeyguardViewController.show(/* options= */ null);
+        mCarKeyguardViewController.registerOnKeyguardCancelClickedListener(mCancelClickedListener);
+        mCarKeyguardViewController.onCancelClicked();
+
+        verify(mBouncer).hide(/* destroyView= */ true);
+    }
+
+    private class TestableCarKeyguardViewController extends CarKeyguardViewController {
+
+        TestableCarKeyguardViewController(Context context,
+                Handler mainHandler,
+                CarServiceProvider carServiceProvider,
+                OverlayViewGlobalStateController overlayViewGlobalStateController,
+                KeyguardStateController keyguardStateController,
+                KeyguardUpdateMonitor keyguardUpdateMonitor,
+                BiometricUnlockController biometricUnlockController,
+                ViewMediatorCallback viewMediatorCallback,
+                CarNavigationBarController carNavigationBarController,
+                LockPatternUtils lockPatternUtils,
+                DismissCallbackRegistry dismissCallbackRegistry,
+                FalsingManager falsingManager,
+                KeyguardBypassController keyguardBypassController) {
+            super(context, mainHandler, carServiceProvider, overlayViewGlobalStateController,
+                    keyguardStateController, keyguardUpdateMonitor, biometricUnlockController,
+                    viewMediatorCallback, carNavigationBarController, lockPatternUtils,
+                    dismissCallbackRegistry, falsingManager, keyguardBypassController);
+        }
+
+        @Override
+        public void onFinishInflate() {
+            super.onFinishInflate();
+            setKeyguardBouncer(CarKeyguardViewControllerTest.this.mBouncer);
+        }
+    }
+
+}
diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/car/navigationbar/ButtonSelectionStateControllerTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/car/navigationbar/ButtonSelectionStateControllerTest.java
new file mode 100644
index 0000000..893057e
--- /dev/null
+++ b/packages/CarSystemUI/tests/src/com/android/systemui/car/navigationbar/ButtonSelectionStateControllerTest.java
@@ -0,0 +1,136 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.car.navigationbar;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.app.ActivityManager;
+import android.content.ComponentName;
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper;
+import android.view.LayoutInflater;
+import android.widget.LinearLayout;
+
+import androidx.test.filters.SmallTest;
+
+import com.android.systemui.SysuiTestCase;
+import com.android.systemui.tests.R;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.MockitoAnnotations;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@RunWith(AndroidTestingRunner.class)
[email protected]
+@SmallTest
+public class ButtonSelectionStateControllerTest extends SysuiTestCase {
+
+    private static final String TEST_COMPONENT_NAME_PACKAGE = "com.android.car.carlauncher";
+    private static final String TEST_COMPONENT_NAME_CLASS = ".CarLauncher";
+    private static final String TEST_CATEGORY = "com.google.android.apps.maps";
+    private static final String TEST_CATEGORY_CLASS = ".APP_MAPS";
+    private static final String TEST_PACKAGE = "com.android.car.dialer";
+    private static final String TEST_PACKAGE_CLASS = ".Dialer";
+
+    // LinearLayout with CarNavigationButtons with different configurations.
+    private LinearLayout mTestView;
+    private ButtonSelectionStateController mButtonSelectionStateController;
+    private ComponentName mComponentName;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        mTestView = (LinearLayout) LayoutInflater.from(mContext).inflate(
+                R.layout.car_button_selection_state_controller_test, /* root= */ null);
+        mButtonSelectionStateController = new ButtonSelectionStateController(mContext);
+        mButtonSelectionStateController.addAllButtonsWithSelectionState(mTestView);
+    }
+
+    @Test
+    public void onTaskChanged_buttonDetectableByComponentName_selectsAssociatedButton() {
+        CarNavigationButton testButton = mTestView.findViewById(R.id.detectable_by_component_name);
+        mComponentName = new ComponentName(TEST_COMPONENT_NAME_PACKAGE, TEST_COMPONENT_NAME_CLASS);
+        List<ActivityManager.StackInfo> testStack = createTestStack(mComponentName);
+        testButton.setSelected(false);
+        mButtonSelectionStateController.taskChanged(testStack, /* validDisplay= */ -1);
+
+        assertbuttonSelected(testButton);
+    }
+
+    @Test
+    public void onTaskChanged_buttonDetectableByCategory_selectsAssociatedButton() {
+        CarNavigationButton testButton = mTestView.findViewById(R.id.detectable_by_category);
+        mComponentName = new ComponentName(TEST_CATEGORY, TEST_CATEGORY_CLASS);
+        List<ActivityManager.StackInfo> testStack = createTestStack(mComponentName);
+        testButton.setSelected(false);
+        mButtonSelectionStateController.taskChanged(testStack, /* validDisplay= */ -1);
+
+        assertbuttonSelected(testButton);
+    }
+
+    @Test
+    public void onTaskChanged_buttonDetectableByPackage_selectsAssociatedButton() {
+        CarNavigationButton testButton = mTestView.findViewById(R.id.detectable_by_package);
+        mComponentName = new ComponentName(TEST_PACKAGE, TEST_PACKAGE_CLASS);
+        List<ActivityManager.StackInfo> testStack = createTestStack(mComponentName);
+        testButton.setSelected(false);
+        mButtonSelectionStateController.taskChanged(testStack, /* validDisplay= */ -1);
+
+        assertbuttonSelected(testButton);
+    }
+
+    @Test
+    public void onTaskChanged_deselectsPreviouslySelectedButton() {
+        CarNavigationButton oldButton = mTestView.findViewById(R.id.detectable_by_component_name);
+        mComponentName = new ComponentName(TEST_COMPONENT_NAME_PACKAGE, TEST_COMPONENT_NAME_CLASS);
+        List<ActivityManager.StackInfo> oldStack = createTestStack(mComponentName);
+        oldButton.setSelected(false);
+        mButtonSelectionStateController.taskChanged(oldStack, /* validDisplay= */ -1);
+
+        mComponentName = new ComponentName(TEST_PACKAGE, TEST_PACKAGE_CLASS);
+        List<ActivityManager.StackInfo> newStack = createTestStack(mComponentName);
+        mButtonSelectionStateController.taskChanged(newStack, /* validDisplay= */ -1);
+
+        assertButtonUnselected(oldButton);
+    }
+
+    // Comparing alpha is a valid way to verify button selection state because all test buttons use
+    // highlightWhenSelected = true.
+    private void assertbuttonSelected(CarNavigationButton button) {
+        assertThat(button.getAlpha()).isEqualTo(CarNavigationButton.DEFAULT_SELECTED_ALPHA);
+    }
+
+    private void assertButtonUnselected(CarNavigationButton button) {
+        assertThat(button.getAlpha()).isEqualTo(CarNavigationButton.DEFAULT_UNSELECTED_ALPHA);
+    }
+
+    private List<ActivityManager.StackInfo> createTestStack(ComponentName componentName) {
+        ActivityManager.StackInfo validStackInfo = new ActivityManager.StackInfo();
+        validStackInfo.displayId = -1; // No display is assigned to this test view
+        validStackInfo.topActivity = componentName;
+
+        List<ActivityManager.StackInfo> testStack = new ArrayList<>();
+        testStack.add(validStackInfo);
+
+        return testStack;
+    }
+}
diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/car/navigationbar/CarNavigationBarControllerTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/car/navigationbar/CarNavigationBarControllerTest.java
new file mode 100644
index 0000000..911f624
--- /dev/null
+++ b/packages/CarSystemUI/tests/src/com/android/systemui/car/navigationbar/CarNavigationBarControllerTest.java
@@ -0,0 +1,440 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.car.navigationbar;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper;
+import android.testing.TestableResources;
+import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.test.filters.SmallTest;
+
+import com.android.systemui.R;
+import com.android.systemui.SysuiTestCase;
+import com.android.systemui.car.hvac.HvacController;
+import com.android.systemui.plugins.DarkIconDispatcher;
+import com.android.systemui.statusbar.phone.StatusBarIconController;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidTestingRunner.class)
[email protected]
+@SmallTest
+public class CarNavigationBarControllerTest extends SysuiTestCase {
+
+    private CarNavigationBarController mCarNavigationBar;
+    private NavigationBarViewFactory mNavigationBarViewFactory;
+    private TestableResources mTestableResources;
+
+    @Mock
+    private ButtonSelectionStateController mButtonSelectionStateController;
+    @Mock
+    private HvacController mHvacController;
+
+    @Before
+    public void setUp() throws Exception {
+        MockitoAnnotations.initMocks(this);
+        mNavigationBarViewFactory = new NavigationBarViewFactory(mContext);
+        mTestableResources = mContext.getOrCreateTestableResources();
+
+        // Needed to inflate top navigation bar.
+        mDependency.injectMockDependency(DarkIconDispatcher.class);
+        mDependency.injectMockDependency(StatusBarIconController.class);
+    }
+
+    @Test
+    public void testConnectToHvac_callsConnect() {
+        mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory,
+                mButtonSelectionStateController, () -> mHvacController);
+
+        mCarNavigationBar.connectToHvac();
+
+        verify(mHvacController).connectToCarService();
+    }
+
+    @Test
+    public void testRemoveAllFromHvac_callsRemoveAll() {
+        mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory,
+                mButtonSelectionStateController, () -> mHvacController);
+
+        mCarNavigationBar.removeAllFromHvac();
+
+        verify(mHvacController).removeAllComponents();
+    }
+
+    @Test
+    public void testGetTopWindow_topDisabled_returnsNull() {
+        mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, false);
+        mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory,
+                mButtonSelectionStateController, () -> mHvacController);
+
+        ViewGroup window = mCarNavigationBar.getTopWindow();
+
+        assertThat(window).isNull();
+    }
+
+    @Test
+    public void testGetTopWindow_topEnabled_returnsWindow() {
+        mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, true);
+        mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory,
+                mButtonSelectionStateController, () -> mHvacController);
+
+        ViewGroup window = mCarNavigationBar.getTopWindow();
+
+        assertThat(window).isNotNull();
+    }
+
+    @Test
+    public void testGetTopWindow_topEnabled_calledTwice_returnsSameWindow() {
+        mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, true);
+        mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory,
+                mButtonSelectionStateController, () -> mHvacController);
+
+        ViewGroup window1 = mCarNavigationBar.getTopWindow();
+        ViewGroup window2 = mCarNavigationBar.getTopWindow();
+
+        assertThat(window1).isEqualTo(window2);
+    }
+
+    @Test
+    public void testGetBottomWindow_bottomDisabled_returnsNull() {
+        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, false);
+        mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory,
+                mButtonSelectionStateController, () -> mHvacController);
+
+        ViewGroup window = mCarNavigationBar.getBottomWindow();
+
+        assertThat(window).isNull();
+    }
+
+    @Test
+    public void testGetBottomWindow_bottomEnabled_returnsWindow() {
+        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
+        mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory,
+                mButtonSelectionStateController, () -> mHvacController);
+
+        ViewGroup window = mCarNavigationBar.getBottomWindow();
+
+        assertThat(window).isNotNull();
+    }
+
+    @Test
+    public void testGetBottomWindow_bottomEnabled_calledTwice_returnsSameWindow() {
+        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
+        mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory,
+                mButtonSelectionStateController, () -> mHvacController);
+
+        ViewGroup window1 = mCarNavigationBar.getBottomWindow();
+        ViewGroup window2 = mCarNavigationBar.getBottomWindow();
+
+        assertThat(window1).isEqualTo(window2);
+    }
+
+    @Test
+    public void testGetLeftWindow_leftDisabled_returnsNull() {
+        mTestableResources.addOverride(R.bool.config_enableLeftNavigationBar, false);
+        mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory,
+                mButtonSelectionStateController, () -> mHvacController);
+        ViewGroup window = mCarNavigationBar.getLeftWindow();
+        assertThat(window).isNull();
+    }
+
+    @Test
+    public void testGetLeftWindow_leftEnabled_returnsWindow() {
+        mTestableResources.addOverride(R.bool.config_enableLeftNavigationBar, true);
+        mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory,
+                mButtonSelectionStateController, () -> mHvacController);
+
+        ViewGroup window = mCarNavigationBar.getLeftWindow();
+
+        assertThat(window).isNotNull();
+    }
+
+    @Test
+    public void testGetLeftWindow_leftEnabled_calledTwice_returnsSameWindow() {
+        mTestableResources.addOverride(R.bool.config_enableLeftNavigationBar, true);
+        mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory,
+                mButtonSelectionStateController, () -> mHvacController);
+
+        ViewGroup window1 = mCarNavigationBar.getLeftWindow();
+        ViewGroup window2 = mCarNavigationBar.getLeftWindow();
+
+        assertThat(window1).isEqualTo(window2);
+    }
+
+    @Test
+    public void testGetRightWindow_rightDisabled_returnsNull() {
+        mTestableResources.addOverride(R.bool.config_enableRightNavigationBar, false);
+        mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory,
+                mButtonSelectionStateController, () -> mHvacController);
+
+        ViewGroup window = mCarNavigationBar.getRightWindow();
+
+        assertThat(window).isNull();
+    }
+
+    @Test
+    public void testGetRightWindow_rightEnabled_returnsWindow() {
+        mTestableResources.addOverride(R.bool.config_enableRightNavigationBar, true);
+        mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory,
+                mButtonSelectionStateController, () -> mHvacController);
+
+        ViewGroup window = mCarNavigationBar.getRightWindow();
+
+        assertThat(window).isNotNull();
+    }
+
+    @Test
+    public void testGetRightWindow_rightEnabled_calledTwice_returnsSameWindow() {
+        mTestableResources.addOverride(R.bool.config_enableRightNavigationBar, true);
+        mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory,
+                mButtonSelectionStateController, () -> mHvacController);
+
+        ViewGroup window1 = mCarNavigationBar.getRightWindow();
+        ViewGroup window2 = mCarNavigationBar.getRightWindow();
+
+        assertThat(window1).isEqualTo(window2);
+    }
+
+    @Test
+    public void testSetBottomWindowVisibility_setTrue_isVisible() {
+        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
+        mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory,
+                mButtonSelectionStateController, () -> mHvacController);
+
+        ViewGroup window = mCarNavigationBar.getBottomWindow();
+        mCarNavigationBar.setBottomWindowVisibility(View.VISIBLE);
+
+        assertThat(window.getVisibility()).isEqualTo(View.VISIBLE);
+    }
+
+    @Test
+    public void testSetBottomWindowVisibility_setFalse_isGone() {
+        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
+        mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory,
+                mButtonSelectionStateController, () -> mHvacController);
+
+        ViewGroup window = mCarNavigationBar.getBottomWindow();
+        mCarNavigationBar.setBottomWindowVisibility(View.GONE);
+
+        assertThat(window.getVisibility()).isEqualTo(View.GONE);
+    }
+
+    @Test
+    public void testSetLeftWindowVisibility_setTrue_isVisible() {
+        mTestableResources.addOverride(R.bool.config_enableLeftNavigationBar, true);
+        mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory,
+                mButtonSelectionStateController, () -> mHvacController);
+
+        ViewGroup window = mCarNavigationBar.getLeftWindow();
+        mCarNavigationBar.setLeftWindowVisibility(View.VISIBLE);
+
+        assertThat(window.getVisibility()).isEqualTo(View.VISIBLE);
+    }
+
+    @Test
+    public void testSetLeftWindowVisibility_setFalse_isGone() {
+        mTestableResources.addOverride(R.bool.config_enableLeftNavigationBar, true);
+        mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory,
+                mButtonSelectionStateController, () -> mHvacController);
+
+        ViewGroup window = mCarNavigationBar.getLeftWindow();
+        mCarNavigationBar.setLeftWindowVisibility(View.GONE);
+
+        assertThat(window.getVisibility()).isEqualTo(View.GONE);
+    }
+
+    @Test
+    public void testSetRightWindowVisibility_setTrue_isVisible() {
+        mTestableResources.addOverride(R.bool.config_enableRightNavigationBar, true);
+        mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory,
+                mButtonSelectionStateController, () -> mHvacController);
+
+        ViewGroup window = mCarNavigationBar.getRightWindow();
+        mCarNavigationBar.setRightWindowVisibility(View.VISIBLE);
+
+        assertThat(window.getVisibility()).isEqualTo(View.VISIBLE);
+    }
+
+    @Test
+    public void testSetRightWindowVisibility_setFalse_isGone() {
+        mTestableResources.addOverride(R.bool.config_enableRightNavigationBar, true);
+        mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory,
+                mButtonSelectionStateController, () -> mHvacController);
+
+        ViewGroup window = mCarNavigationBar.getRightWindow();
+        mCarNavigationBar.setRightWindowVisibility(View.GONE);
+
+        assertThat(window.getVisibility()).isEqualTo(View.GONE);
+    }
+
+    @Test
+    public void testRegisterBottomBarTouchListener_createViewFirst_registrationSuccessful() {
+        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
+        mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory,
+                mButtonSelectionStateController, () -> mHvacController);
+
+        CarNavigationBarView bottomBar = mCarNavigationBar.getBottomBar(/* isSetUp= */ true);
+        View.OnTouchListener controller = bottomBar.getStatusBarWindowTouchListener();
+        assertThat(controller).isNull();
+        mCarNavigationBar.registerBottomBarTouchListener(mock(View.OnTouchListener.class));
+        controller = bottomBar.getStatusBarWindowTouchListener();
+
+        assertThat(controller).isNotNull();
+    }
+
+    @Test
+    public void testRegisterBottomBarTouchListener_registerFirst_registrationSuccessful() {
+        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
+        mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory,
+                mButtonSelectionStateController, () -> mHvacController);
+
+        mCarNavigationBar.registerBottomBarTouchListener(mock(View.OnTouchListener.class));
+        CarNavigationBarView bottomBar = mCarNavigationBar.getBottomBar(/* isSetUp= */ true);
+        View.OnTouchListener controller = bottomBar.getStatusBarWindowTouchListener();
+
+        assertThat(controller).isNotNull();
+    }
+
+    @Test
+    public void testRegisterNotificationController_createViewFirst_registrationSuccessful() {
+        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
+        mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory,
+                mButtonSelectionStateController, () -> mHvacController);
+
+        CarNavigationBarView bottomBar = mCarNavigationBar.getBottomBar(/* isSetUp= */ true);
+        CarNavigationBarController.NotificationsShadeController controller =
+                bottomBar.getNotificationsPanelController();
+        assertThat(controller).isNull();
+        mCarNavigationBar.registerNotificationController(
+                mock(CarNavigationBarController.NotificationsShadeController.class));
+        controller = bottomBar.getNotificationsPanelController();
+
+        assertThat(controller).isNotNull();
+    }
+
+    @Test
+    public void testRegisterNotificationController_registerFirst_registrationSuccessful() {
+        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
+        mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory,
+                mButtonSelectionStateController, () -> mHvacController);
+
+        mCarNavigationBar.registerNotificationController(
+                mock(CarNavigationBarController.NotificationsShadeController.class));
+        CarNavigationBarView bottomBar = mCarNavigationBar.getBottomBar(/* isSetUp= */ true);
+        CarNavigationBarController.NotificationsShadeController controller =
+                bottomBar.getNotificationsPanelController();
+
+        assertThat(controller).isNotNull();
+    }
+
+    @Test
+    public void testShowAllKeyguardButtons_bottomEnabled_bottomKeyguardButtonsVisible() {
+        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
+        mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory,
+                mButtonSelectionStateController, () -> mHvacController);
+        CarNavigationBarView bottomBar = mCarNavigationBar.getBottomBar(/* isSetUp= */ true);
+        View bottomKeyguardButtons = bottomBar.findViewById(R.id.lock_screen_nav_buttons);
+
+        mCarNavigationBar.showAllKeyguardButtons(/* isSetUp= */ true);
+
+        assertThat(bottomKeyguardButtons.getVisibility()).isEqualTo(View.VISIBLE);
+    }
+
+    @Test
+    public void testShowAllKeyguardButtons_bottomEnabled_bottomNavButtonsGone() {
+        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
+        mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory,
+                mButtonSelectionStateController, () -> mHvacController);
+        CarNavigationBarView bottomBar = mCarNavigationBar.getBottomBar(/* isSetUp= */ true);
+        View bottomButtons = bottomBar.findViewById(R.id.nav_buttons);
+
+        mCarNavigationBar.showAllKeyguardButtons(/* isSetUp= */ true);
+
+        assertThat(bottomButtons.getVisibility()).isEqualTo(View.GONE);
+    }
+
+    @Test
+    public void testHideAllKeyguardButtons_bottomEnabled_bottomKeyguardButtonsGone() {
+        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
+        mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory,
+                mButtonSelectionStateController, () -> mHvacController);
+        CarNavigationBarView bottomBar = mCarNavigationBar.getBottomBar(/* isSetUp= */ true);
+        View bottomKeyguardButtons = bottomBar.findViewById(R.id.lock_screen_nav_buttons);
+
+        mCarNavigationBar.showAllKeyguardButtons(/* isSetUp= */ true);
+        assertThat(bottomKeyguardButtons.getVisibility()).isEqualTo(View.VISIBLE);
+        mCarNavigationBar.hideAllKeyguardButtons(/* isSetUp= */ true);
+
+        assertThat(bottomKeyguardButtons.getVisibility()).isEqualTo(View.GONE);
+    }
+
+    @Test
+    public void testHideAllKeyguardButtons_bottomEnabled_bottomNavButtonsVisible() {
+        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
+        mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory,
+                mButtonSelectionStateController, () -> mHvacController);
+        CarNavigationBarView bottomBar = mCarNavigationBar.getBottomBar(/* isSetUp= */ true);
+        View bottomButtons = bottomBar.findViewById(R.id.nav_buttons);
+
+        mCarNavigationBar.showAllKeyguardButtons(/* isSetUp= */ true);
+        assertThat(bottomButtons.getVisibility()).isEqualTo(View.GONE);
+        mCarNavigationBar.hideAllKeyguardButtons(/* isSetUp= */ true);
+
+        assertThat(bottomButtons.getVisibility()).isEqualTo(View.VISIBLE);
+    }
+
+    @Test
+    public void testToggleAllNotificationsUnseenIndicator_bottomEnabled_hasUnseen_setCorrectly() {
+        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
+        mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory,
+                mButtonSelectionStateController, () -> mHvacController);
+        CarNavigationBarView bottomBar = mCarNavigationBar.getBottomBar(/* isSetUp= */ true);
+        CarNavigationButton notifications = bottomBar.findViewById(R.id.notifications);
+
+        boolean hasUnseen = true;
+        mCarNavigationBar.toggleAllNotificationsUnseenIndicator(/* isSetUp= */ true,
+                hasUnseen);
+
+        assertThat(notifications.getUnseen()).isTrue();
+    }
+
+    @Test
+    public void testToggleAllNotificationsUnseenIndicator_bottomEnabled_noUnseen_setCorrectly() {
+        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
+        mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory,
+                mButtonSelectionStateController, () -> mHvacController);
+        CarNavigationBarView bottomBar = mCarNavigationBar.getBottomBar(/* isSetUp= */ true);
+        CarNavigationButton notifications = bottomBar.findViewById(R.id.notifications);
+
+        boolean hasUnseen = false;
+        mCarNavigationBar.toggleAllNotificationsUnseenIndicator(/* isSetUp= */ true,
+                hasUnseen);
+
+        assertThat(notifications.getUnseen()).isFalse();
+    }
+}
diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/car/navigationbar/CarNavigationBarTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/car/navigationbar/CarNavigationBarTest.java
new file mode 100644
index 0000000..6620e9d
--- /dev/null
+++ b/packages/CarSystemUI/tests/src/com/android/systemui/car/navigationbar/CarNavigationBarTest.java
@@ -0,0 +1,297 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.car.navigationbar;
+
+import static android.view.InsetsState.ITYPE_NAVIGATION_BAR;
+import static android.view.InsetsState.ITYPE_STATUS_BAR;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.os.Handler;
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper;
+import android.testing.TestableResources;
+import android.view.Display;
+import android.view.WindowManager;
+
+import androidx.test.filters.SmallTest;
+
+import com.android.systemui.R;
+import com.android.systemui.SysuiTestCase;
+import com.android.systemui.car.CarDeviceProvisionedController;
+import com.android.systemui.statusbar.CommandQueue;
+import com.android.systemui.statusbar.phone.AutoHideController;
+import com.android.systemui.statusbar.phone.PhoneStatusBarPolicy;
+import com.android.systemui.statusbar.phone.StatusBarIconController;
+import com.android.systemui.statusbar.policy.KeyguardStateController;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidTestingRunner.class)
[email protected]
+@SmallTest
+public class CarNavigationBarTest extends SysuiTestCase {
+
+    private CarNavigationBar mCarNavigationBar;
+    private TestableResources mTestableResources;
+    private Handler mHandler;
+
+    @Mock
+    private CarNavigationBarController mCarNavigationBarController;
+    @Mock
+    private WindowManager mWindowManager;
+    @Mock
+    private CarDeviceProvisionedController mDeviceProvisionedController;
+    @Mock
+    private AutoHideController mAutoHideController;
+    @Mock
+    private ButtonSelectionStateListener mButtonSelectionStateListener;
+    @Mock
+    private KeyguardStateController mKeyguardStateController;
+    @Mock
+    private ButtonSelectionStateController mButtonSelectionStateController;
+    @Mock
+    private PhoneStatusBarPolicy mIconPolicy;
+    @Mock
+    private StatusBarIconController mIconController;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mTestableResources = mContext.getOrCreateTestableResources();
+        mHandler = Handler.getMain();
+        mCarNavigationBar = new CarNavigationBar(mContext, mTestableResources.getResources(),
+                mCarNavigationBarController, mWindowManager, mDeviceProvisionedController,
+                new CommandQueue(mContext), mAutoHideController, mButtonSelectionStateListener,
+                mHandler, () -> mKeyguardStateController, mButtonSelectionStateController,
+                mIconPolicy, mIconController);
+    }
+
+    @Test
+    public void restartNavbars_refreshesTaskChanged() {
+        mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, true);
+        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
+        ArgumentCaptor<CarDeviceProvisionedController.DeviceProvisionedListener>
+                deviceProvisionedCallbackCaptor = ArgumentCaptor.forClass(
+                CarDeviceProvisionedController.DeviceProvisionedListener.class);
+        when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(true);
+        mCarNavigationBar.start();
+        // switching the currentUserSetup value to force restart the navbars.
+        when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(false);
+        verify(mDeviceProvisionedController).addCallback(deviceProvisionedCallbackCaptor.capture());
+
+        deviceProvisionedCallbackCaptor.getValue().onUserSwitched();
+        waitForIdleSync(mHandler);
+
+        verify(mButtonSelectionStateListener).onTaskStackChanged();
+    }
+
+    @Test
+    public void restartNavBars_newUserNotSetupWithKeyguardShowing_showsKeyguardButtons() {
+        mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, true);
+        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
+        ArgumentCaptor<CarDeviceProvisionedController.DeviceProvisionedListener>
+                deviceProvisionedCallbackCaptor = ArgumentCaptor.forClass(
+                CarDeviceProvisionedController.DeviceProvisionedListener.class);
+        when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(true);
+        mCarNavigationBar.start();
+        when(mKeyguardStateController.isShowing()).thenReturn(true);
+        // switching the currentUserSetup value to force restart the navbars.
+        when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(false);
+        verify(mDeviceProvisionedController).addCallback(deviceProvisionedCallbackCaptor.capture());
+
+        deviceProvisionedCallbackCaptor.getValue().onUserSwitched();
+        waitForIdleSync(mHandler);
+
+        verify(mCarNavigationBarController).showAllKeyguardButtons(false);
+    }
+
+    @Test
+    public void restartNavbars_newUserIsSetupWithKeyguardHidden_hidesKeyguardButtons() {
+        mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, true);
+        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
+        ArgumentCaptor<CarDeviceProvisionedController.DeviceProvisionedListener>
+                deviceProvisionedCallbackCaptor = ArgumentCaptor.forClass(
+                CarDeviceProvisionedController.DeviceProvisionedListener.class);
+        when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(true);
+        mCarNavigationBar.start();
+        when(mKeyguardStateController.isShowing()).thenReturn(true);
+        // switching the currentUserSetup value to force restart the navbars.
+        when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(false);
+        verify(mDeviceProvisionedController).addCallback(deviceProvisionedCallbackCaptor.capture());
+        deviceProvisionedCallbackCaptor.getValue().onUserSwitched();
+        waitForIdleSync(mHandler);
+        when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(true);
+        when(mKeyguardStateController.isShowing()).thenReturn(false);
+
+        deviceProvisionedCallbackCaptor.getValue().onUserSetupChanged();
+        waitForIdleSync(mHandler);
+
+        verify(mCarNavigationBarController).hideAllKeyguardButtons(true);
+    }
+
+    @Test
+    public void showTransient_wrongDisplayId_transientModeNotUpdated() {
+        mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, true);
+        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
+        when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(true);
+        mCarNavigationBar.start();
+
+        int randomDisplay = Display.DEFAULT_DISPLAY + 10;
+        int[] insetTypes = new int[]{};
+        mCarNavigationBar.showTransient(randomDisplay, insetTypes);
+
+        assertThat(mCarNavigationBar.isStatusBarTransientShown()).isFalse();
+    }
+
+    @Test
+    public void showTransient_correctDisplayId_noStatusBarInset_transientModeNotUpdated() {
+        mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, true);
+        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
+        when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(true);
+        mCarNavigationBar.start();
+
+        int[] insetTypes = new int[]{};
+        mCarNavigationBar.showTransient(Display.DEFAULT_DISPLAY, insetTypes);
+
+        assertThat(mCarNavigationBar.isStatusBarTransientShown()).isFalse();
+    }
+
+    @Test
+    public void showTransient_correctDisplayId_statusBarInset_transientModeUpdated() {
+        mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, true);
+        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
+        when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(true);
+        mCarNavigationBar.start();
+
+        int[] insetTypes = new int[]{ITYPE_STATUS_BAR};
+        mCarNavigationBar.showTransient(Display.DEFAULT_DISPLAY, insetTypes);
+
+        assertThat(mCarNavigationBar.isStatusBarTransientShown()).isTrue();
+    }
+
+    @Test
+    public void showTransient_correctDisplayId_noNavBarInset_transientModeNotUpdated() {
+        mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, true);
+        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
+        when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(true);
+        mCarNavigationBar.start();
+
+        int[] insetTypes = new int[]{};
+        mCarNavigationBar.showTransient(Display.DEFAULT_DISPLAY, insetTypes);
+
+        assertThat(mCarNavigationBar.isNavBarTransientShown()).isFalse();
+    }
+
+    @Test
+    public void showTransient_correctDisplayId_navBarInset_transientModeUpdated() {
+        mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, true);
+        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
+        when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(true);
+        mCarNavigationBar.start();
+
+        int[] insetTypes = new int[]{ITYPE_NAVIGATION_BAR};
+        mCarNavigationBar.showTransient(Display.DEFAULT_DISPLAY, insetTypes);
+
+        assertThat(mCarNavigationBar.isNavBarTransientShown()).isTrue();
+    }
+
+    @Test
+    public void abortTransient_wrongDisplayId_transientModeNotCleared() {
+        mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, true);
+        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
+        when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(true);
+        mCarNavigationBar.start();
+        mCarNavigationBar.showTransient(Display.DEFAULT_DISPLAY,
+                new int[]{ITYPE_STATUS_BAR, ITYPE_NAVIGATION_BAR});
+        assertThat(mCarNavigationBar.isStatusBarTransientShown()).isTrue();
+        assertThat(mCarNavigationBar.isNavBarTransientShown()).isTrue();
+
+        int[] insetTypes = new int[]{};
+        int randomDisplay = Display.DEFAULT_DISPLAY + 10;
+        mCarNavigationBar.abortTransient(randomDisplay, insetTypes);
+
+        // The transient booleans were not cleared.
+        assertThat(mCarNavigationBar.isStatusBarTransientShown()).isTrue();
+        assertThat(mCarNavigationBar.isNavBarTransientShown()).isTrue();
+    }
+
+    @Test
+    public void abortTransient_correctDisplayId_noInsets_transientModeNotCleared() {
+        mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, true);
+        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
+        when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(true);
+        mCarNavigationBar.start();
+        mCarNavigationBar.showTransient(Display.DEFAULT_DISPLAY,
+                new int[]{ITYPE_STATUS_BAR, ITYPE_NAVIGATION_BAR});
+        assertThat(mCarNavigationBar.isStatusBarTransientShown()).isTrue();
+        assertThat(mCarNavigationBar.isNavBarTransientShown()).isTrue();
+
+        int[] insetTypes = new int[]{};
+        mCarNavigationBar.abortTransient(Display.DEFAULT_DISPLAY, insetTypes);
+
+        // The transient booleans were not cleared.
+        assertThat(mCarNavigationBar.isStatusBarTransientShown()).isTrue();
+        assertThat(mCarNavigationBar.isNavBarTransientShown()).isTrue();
+    }
+
+    @Test
+    public void abortTransient_correctDisplayId_statusBarInset_transientModeCleared() {
+        mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, true);
+        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
+        when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(true);
+        mCarNavigationBar.start();
+        mCarNavigationBar.showTransient(Display.DEFAULT_DISPLAY,
+                new int[]{ITYPE_STATUS_BAR, ITYPE_NAVIGATION_BAR});
+        assertThat(mCarNavigationBar.isStatusBarTransientShown()).isTrue();
+        assertThat(mCarNavigationBar.isNavBarTransientShown()).isTrue();
+
+        int[] insetTypes = new int[]{ITYPE_STATUS_BAR};
+        mCarNavigationBar.abortTransient(Display.DEFAULT_DISPLAY, insetTypes);
+
+        // The transient booleans were cleared.
+        assertThat(mCarNavigationBar.isStatusBarTransientShown()).isFalse();
+        assertThat(mCarNavigationBar.isNavBarTransientShown()).isFalse();
+    }
+
+    @Test
+    public void abortTransient_correctDisplayId_navBarInset_transientModeCleared() {
+        mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, true);
+        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
+        when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(true);
+        mCarNavigationBar.start();
+        mCarNavigationBar.showTransient(Display.DEFAULT_DISPLAY,
+                new int[]{ITYPE_STATUS_BAR, ITYPE_NAVIGATION_BAR});
+        assertThat(mCarNavigationBar.isStatusBarTransientShown()).isTrue();
+        assertThat(mCarNavigationBar.isNavBarTransientShown()).isTrue();
+
+        int[] insetTypes = new int[]{ITYPE_NAVIGATION_BAR};
+        mCarNavigationBar.abortTransient(Display.DEFAULT_DISPLAY, insetTypes);
+
+        // The transient booleans were cleared.
+        assertThat(mCarNavigationBar.isStatusBarTransientShown()).isFalse();
+        assertThat(mCarNavigationBar.isNavBarTransientShown()).isFalse();
+    }
+}
diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/car/navigationbar/CarNavigationBarViewTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/car/navigationbar/CarNavigationBarViewTest.java
new file mode 100644
index 0000000..19e394f
--- /dev/null
+++ b/packages/CarSystemUI/tests/src/com/android/systemui/car/navigationbar/CarNavigationBarViewTest.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.car.navigationbar;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper;
+import android.view.LayoutInflater;
+import android.view.MotionEvent;
+import android.view.View;
+
+import androidx.test.filters.SmallTest;
+
+import com.android.systemui.R;
+import com.android.systemui.SysuiTestCase;
+
+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;
+
+@RunWith(AndroidTestingRunner.class)
[email protected]
+@SmallTest
+public class CarNavigationBarViewTest extends SysuiTestCase {
+
+    private CarNavigationBarView mNavBarView;
+
+    @Mock
+    private CarNavigationBarController.NotificationsShadeController mNotificationsShadeController;
+
+    @Mock
+    private View.OnTouchListener mNavBarTouchListener;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+    }
+
+    @After
+    public void tearDown() {
+        getContext().getOrCreateTestableResources().addOverride(
+                R.bool.config_consumeNavigationBarTouchWhenNotificationPanelOpen, false);
+    }
+
+    @Test
+    public void dispatchTouch_shadeOpen_flagOff_doesNotConsumeTouch() {
+        getContext().getOrCreateTestableResources().addOverride(
+                R.bool.config_consumeNavigationBarTouchWhenNotificationPanelOpen, false);
+        when(mNotificationsShadeController.isNotificationPanelOpen()).thenReturn(true);
+        mNavBarView = (CarNavigationBarView) LayoutInflater.from(getContext()).inflate(
+                R.layout.car_navigation_bar_view_test, /* root= */ null);
+        mNavBarView.setNotificationsPanelController(mNotificationsShadeController);
+        mNavBarView.setStatusBarWindowTouchListener(mNavBarTouchListener);
+
+        boolean consume = mNavBarView.onInterceptTouchEvent(
+                MotionEvent.obtain(/* downTime= */ 200, /* eventTime= */ 300,
+                        MotionEvent.ACTION_MOVE, mNavBarView.getX(),
+                        mNavBarView.getY(), /* metaState= */ 0));
+
+        assertThat(consume).isFalse();
+    }
+
+    @Test
+    public void dispatchTouch_shadeOpen_flagOn_consumesTouch() {
+        getContext().getOrCreateTestableResources().addOverride(
+                R.bool.config_consumeNavigationBarTouchWhenNotificationPanelOpen, true);
+        when(mNotificationsShadeController.isNotificationPanelOpen()).thenReturn(true);
+        mNavBarView = (CarNavigationBarView) LayoutInflater.from(getContext()).inflate(
+                R.layout.car_navigation_bar_view_test, /* root= */ null);
+        mNavBarView.setNotificationsPanelController(mNotificationsShadeController);
+        mNavBarView.setStatusBarWindowTouchListener(mNavBarTouchListener);
+
+        boolean consume = mNavBarView.onInterceptTouchEvent(
+                MotionEvent.obtain(/* downTime= */ 200, /* eventTime= */ 300,
+                        MotionEvent.ACTION_MOVE, mNavBarView.getX(),
+                        mNavBarView.getY(), /* metaState= */ 0));
+
+        assertThat(consume).isTrue();
+    }
+}
diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/car/navigationbar/CarNavigationButtonTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/car/navigationbar/CarNavigationButtonTest.java
new file mode 100644
index 0000000..11f2fa4
--- /dev/null
+++ b/packages/CarSystemUI/tests/src/com/android/systemui/car/navigationbar/CarNavigationButtonTest.java
@@ -0,0 +1,239 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.car.navigationbar;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.argThat;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+
+import android.app.ActivityManager;
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.drawable.Drawable;
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+
+import androidx.test.filters.SmallTest;
+
+import com.android.keyguard.AlphaOptimizedImageButton;
+import com.android.systemui.SysuiTestCase;
+import com.android.systemui.tests.R;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentMatcher;
+
+@RunWith(AndroidTestingRunner.class)
[email protected]
+@SmallTest
+public class CarNavigationButtonTest extends SysuiTestCase {
+
+    private static final String DEFAULT_BUTTON_ACTIVITY_NAME =
+            "com.android.car.carlauncher/.CarLauncher";
+    private static final String APP_GRID_BUTTON_ACTIVITY_NAME =
+            "com.android.car.carlauncher/.AppGridActivity";
+    private static final String BROADCAST_ACTION_NAME =
+            "android.car.intent.action.TOGGLE_HVAC_CONTROLS";
+
+    private ActivityManager mActivityManager;
+    // LinearLayout with CarNavigationButtons with different configurations.
+    private LinearLayout mTestView;
+    // Does not have any selection state which is the default configuration.
+    private CarNavigationButton mDefaultButton;
+
+    @Before
+    public void setUp() {
+        mContext = spy(mContext);
+        mTestView = (LinearLayout) LayoutInflater.from(mContext).inflate(
+                R.layout.car_navigation_button_test, /* root= */ null);
+        mDefaultButton = mTestView.findViewById(R.id.default_no_selection_state);
+        mActivityManager = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
+    }
+
+    @Test
+    public void onCreate_iconIsVisible() {
+        AlphaOptimizedImageButton icon = mDefaultButton.findViewById(
+                R.id.car_nav_button_icon_image);
+
+        assertThat(icon.getDrawable()).isNotNull();
+    }
+
+    @Test
+    public void onSelected_selectedIconDefined_togglesIcon() {
+        mDefaultButton.setSelected(true);
+        Drawable selectedIconDrawable = ((AlphaOptimizedImageButton) mDefaultButton.findViewById(
+                R.id.car_nav_button_icon_image)).getDrawable();
+
+
+        mDefaultButton.setSelected(false);
+        Drawable unselectedIconDrawable = ((AlphaOptimizedImageButton) mDefaultButton.findViewById(
+                R.id.car_nav_button_icon_image)).getDrawable();
+
+        assertThat(selectedIconDrawable).isNotEqualTo(unselectedIconDrawable);
+    }
+
+    @Test
+    public void onSelected_selectedIconUndefined_displaysSameIcon() {
+        CarNavigationButton selectedIconUndefinedButton = mTestView.findViewById(
+                R.id.selected_icon_undefined);
+
+        selectedIconUndefinedButton.setSelected(true);
+        Drawable selectedIconDrawable = ((AlphaOptimizedImageButton) mDefaultButton.findViewById(
+                R.id.car_nav_button_icon_image)).getDrawable();
+
+
+        selectedIconUndefinedButton.setSelected(false);
+        Drawable unselectedIconDrawable = ((AlphaOptimizedImageButton) mDefaultButton.findViewById(
+                R.id.car_nav_button_icon_image)).getDrawable();
+
+        assertThat(selectedIconDrawable).isEqualTo(unselectedIconDrawable);
+    }
+
+    @Test
+    public void onUnselected_doesNotHighlightWhenSelected_applySelectedAlpha() {
+        mDefaultButton.setSelected(false);
+
+        assertThat(mDefaultButton.getAlpha()).isEqualTo(
+                CarNavigationButton.DEFAULT_SELECTED_ALPHA);
+    }
+
+    @Test
+    public void onSelected_doesNotHighlightWhenSelected_applySelectedAlpha() {
+        mDefaultButton.setSelected(true);
+
+        assertThat(mDefaultButton.getAlpha()).isEqualTo(
+                CarNavigationButton.DEFAULT_SELECTED_ALPHA);
+    }
+
+    @Test
+    public void onUnselected_highlightWhenSelected_applyDefaultUnselectedAlpha() {
+        CarNavigationButton highlightWhenSelectedButton = mTestView.findViewById(
+                R.id.highlightable_no_more_button);
+        highlightWhenSelectedButton.setSelected(false);
+
+        assertThat(highlightWhenSelectedButton.getAlpha()).isEqualTo(
+                CarNavigationButton.DEFAULT_UNSELECTED_ALPHA);
+    }
+
+    @Test
+    public void onSelected_highlightWhenSelected_applyDefaultSelectedAlpha() {
+        CarNavigationButton highlightWhenSelectedButton = mTestView.findViewById(
+                R.id.highlightable_no_more_button);
+        highlightWhenSelectedButton.setSelected(true);
+
+        assertThat(highlightWhenSelectedButton.getAlpha()).isEqualTo(
+                CarNavigationButton.DEFAULT_SELECTED_ALPHA);
+    }
+
+    @Test
+    public void onSelected_doesNotShowMoreWhenSelected_doesNotShowMoreIcon() {
+        mDefaultButton.setSelected(true);
+        AlphaOptimizedImageButton moreIcon = mDefaultButton.findViewById(
+                R.id.car_nav_button_more_icon);
+
+        assertThat(moreIcon.getVisibility()).isEqualTo(View.GONE);
+    }
+
+    @Test
+    public void onSelected_showMoreWhenSelected_showsMoreIcon() {
+        CarNavigationButton showMoreWhenSelected = mTestView.findViewById(
+                R.id.not_highlightable_more_button);
+        showMoreWhenSelected.setSelected(true);
+        AlphaOptimizedImageButton moreIcon = showMoreWhenSelected.findViewById(
+                R.id.car_nav_button_more_icon);
+
+        assertThat(moreIcon.getVisibility()).isEqualTo(View.VISIBLE);
+    }
+
+    @Test
+    public void onUnselected_showMoreWhenSelected_doesNotShowMoreIcon() {
+        CarNavigationButton showMoreWhenSelected = mTestView.findViewById(
+                R.id.highlightable_no_more_button);
+        showMoreWhenSelected.setSelected(true);
+        showMoreWhenSelected.setSelected(false);
+        AlphaOptimizedImageButton moreIcon = showMoreWhenSelected.findViewById(
+                R.id.car_nav_button_more_icon);
+
+        assertThat(moreIcon.getVisibility()).isEqualTo(View.GONE);
+    }
+
+    @Test
+    public void onClick_launchesIntentActivity() {
+        mDefaultButton.performClick();
+
+        assertThat(getCurrentActivityName()).isEqualTo(DEFAULT_BUTTON_ACTIVITY_NAME);
+
+        CarNavigationButton appGridButton = mTestView.findViewById(R.id.app_grid_activity);
+        appGridButton.performClick();
+
+        assertThat(getCurrentActivityName()).isEqualTo(APP_GRID_BUTTON_ACTIVITY_NAME);
+    }
+
+    @Test
+    public void onLongClick_longIntentDefined_launchesLongIntentActivity() {
+        mDefaultButton.performClick();
+
+        assertThat(getCurrentActivityName()).isEqualTo(DEFAULT_BUTTON_ACTIVITY_NAME);
+
+        CarNavigationButton appGridButton = mTestView.findViewById(
+                R.id.long_click_app_grid_activity);
+        appGridButton.performLongClick();
+
+        assertThat(getCurrentActivityName()).isEqualTo(APP_GRID_BUTTON_ACTIVITY_NAME);
+    }
+
+    @Test
+    public void onClick_useBroadcast_broadcastsIntent() {
+        CarNavigationButton appGridButton = mTestView.findViewById(R.id.broadcast);
+        appGridButton.performClick();
+
+        verify(mContext).sendBroadcastAsUser(argThat(new ArgumentMatcher<Intent>() {
+            @Override
+            public boolean matches(Intent argument) {
+                return argument.getAction().equals(BROADCAST_ACTION_NAME);
+            }
+        }), any());
+    }
+
+    @Test
+    public void onSetUnseen_hasUnseen_showsUnseenIndicator() {
+        mDefaultButton.setUnseen(true);
+        ImageView hasUnseenIndicator = mDefaultButton.findViewById(R.id.car_nav_button_unseen_icon);
+
+        assertThat(hasUnseenIndicator.getVisibility()).isEqualTo(View.VISIBLE);
+    }
+
+    @Test
+    public void onSetUnseen_doesNotHaveUnseen_hidesUnseenIndicator() {
+        mDefaultButton.setUnseen(false);
+        ImageView hasUnseenIndicator = mDefaultButton.findViewById(R.id.car_nav_button_unseen_icon);
+
+        assertThat(hasUnseenIndicator.getVisibility()).isEqualTo(View.GONE);
+    }
+
+    private String getCurrentActivityName() {
+        return mActivityManager.getRunningTasks(1).get(0).topActivity.flattenToShortString();
+    }
+}
diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/car/notification/CarHeadsUpNotificationSystemContainerTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/car/notification/CarHeadsUpNotificationSystemContainerTest.java
index 05b8e6a..6ac72a6 100644
--- a/packages/CarSystemUI/tests/src/com/android/systemui/car/notification/CarHeadsUpNotificationSystemContainerTest.java
+++ b/packages/CarSystemUI/tests/src/com/android/systemui/car/notification/CarHeadsUpNotificationSystemContainerTest.java
@@ -31,7 +31,6 @@
 import com.android.systemui.R;
 import com.android.systemui.SysuiTestCase;
 import com.android.systemui.car.CarDeviceProvisionedController;
-import com.android.systemui.statusbar.car.CarStatusBar;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -48,7 +47,7 @@
     @Mock
     private CarDeviceProvisionedController mCarDeviceProvisionedController;
     @Mock
-    private CarStatusBar mCarStatusBar;
+    private NotificationPanelViewController mNotificationPanelViewController;
     @Mock
     private WindowManager mWindowManager;
 
@@ -61,7 +60,7 @@
     public void setUp() {
         MockitoAnnotations.initMocks(this);
 
-        when(mCarStatusBar.isPanelExpanded()).thenReturn(false);
+        when(mNotificationPanelViewController.isPanelExpanded()).thenReturn(false);
         when(mCarDeviceProvisionedController.isCurrentUserSetup()).thenReturn(true);
         when(mCarDeviceProvisionedController.isCurrentUserSetupInProgress()).thenReturn(false);
 
@@ -72,14 +71,14 @@
 
         mDefaultController = new CarHeadsUpNotificationSystemContainer(mContext,
                 testableResources.getResources(), mCarDeviceProvisionedController, mWindowManager,
-                () -> mCarStatusBar);
+                () -> mNotificationPanelViewController);
 
         testableResources.addOverride(
                 R.bool.config_enableHeadsUpNotificationWhenNotificationShadeOpen, true);
 
         mOverrideEnabledController = new CarHeadsUpNotificationSystemContainer(mContext,
                 testableResources.getResources(), mCarDeviceProvisionedController, mWindowManager,
-                () -> mCarStatusBar);
+                () -> mNotificationPanelViewController);
     }
 
     @Test
@@ -120,14 +119,14 @@
 
     @Test
     public void testDisplayNotification_notificationPanelExpanded_isInvisible() {
-        when(mCarStatusBar.isPanelExpanded()).thenReturn(true);
+        when(mNotificationPanelViewController.isPanelExpanded()).thenReturn(true);
         mDefaultController.displayNotification(mNotificationView);
         assertThat(mDefaultController.isVisible()).isFalse();
     }
 
     @Test
     public void testDisplayNotification_notificationPanelExpandedEnabledHUNWhenOpen_isVisible() {
-        when(mCarStatusBar.isPanelExpanded()).thenReturn(true);
+        when(mNotificationPanelViewController.isPanelExpanded()).thenReturn(true);
         mOverrideEnabledController.displayNotification(mNotificationView);
         assertThat(mOverrideEnabledController.isVisible()).isTrue();
     }
diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/car/sideloaded/CarSideLoadedAppDetectorTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/car/sideloaded/CarSideLoadedAppDetectorTest.java
new file mode 100644
index 0000000..80f3d1ee
--- /dev/null
+++ b/packages/CarSystemUI/tests/src/com/android/systemui/car/sideloaded/CarSideLoadedAppDetectorTest.java
@@ -0,0 +1,164 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.car.sideloaded;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.when;
+
+import android.app.ActivityManager;
+import android.content.ComponentName;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.InstallSourceInfo;
+import android.content.pm.PackageManager;
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper;
+import android.testing.TestableResources;
+
+import androidx.test.filters.SmallTest;
+
+import com.android.systemui.R;
+import com.android.systemui.SysuiTestCase;
+import com.android.systemui.car.CarDeviceProvisionedController;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidTestingRunner.class)
[email protected]
+@SmallTest
+public class CarSideLoadedAppDetectorTest extends SysuiTestCase {
+
+    private static final String SAFE_VENDOR = "com.safe.vendor";
+    private static final String UNSAFE_VENDOR = "com.unsafe.vendor";
+    private static final String APP_PACKAGE_NAME = "com.test";
+    private static final String APP_CLASS_NAME = ".TestClass";
+
+    private CarSideLoadedAppDetector mSideLoadedAppDetector;
+
+    @Mock
+    private PackageManager mPackageManager;
+    @Mock
+    private CarDeviceProvisionedController mCarDeviceProvisionedController;
+
+    @Before
+    public void setUp() throws Exception {
+        MockitoAnnotations.initMocks(this);
+
+        TestableResources testableResources = mContext.getOrCreateTestableResources();
+        String[] allowedAppInstallSources = new String[] {SAFE_VENDOR};
+        testableResources.addOverride(R.array.config_allowedAppInstallSources,
+                allowedAppInstallSources);
+
+        mSideLoadedAppDetector = new CarSideLoadedAppDetector(testableResources.getResources(),
+                mPackageManager,
+                mCarDeviceProvisionedController);
+    }
+
+    @Test
+    public void isSafe_systemApp_returnsTrue() throws Exception {
+        ActivityManager.StackInfo stackInfo = new ActivityManager.StackInfo();
+        stackInfo.topActivity = new ComponentName(APP_PACKAGE_NAME, APP_CLASS_NAME);
+
+        ApplicationInfo applicationInfo = new ApplicationInfo();
+        applicationInfo.packageName = APP_PACKAGE_NAME;
+        applicationInfo.flags = ApplicationInfo.FLAG_SYSTEM;
+
+        when(mPackageManager.getApplicationInfoAsUser(eq(APP_PACKAGE_NAME), anyInt(), any()))
+                .thenReturn(applicationInfo);
+
+        assertThat(mSideLoadedAppDetector.isSafe(stackInfo)).isTrue();
+    }
+
+    @Test
+    public void isSafe_updatedSystemApp_returnsTrue() throws Exception {
+        ActivityManager.StackInfo stackInfo = new ActivityManager.StackInfo();
+        stackInfo.topActivity = new ComponentName(APP_PACKAGE_NAME, APP_CLASS_NAME);
+
+        ApplicationInfo applicationInfo = new ApplicationInfo();
+        applicationInfo.packageName = APP_PACKAGE_NAME;
+        applicationInfo.flags = ApplicationInfo.FLAG_UPDATED_SYSTEM_APP;
+
+        when(mPackageManager.getApplicationInfoAsUser(eq(APP_PACKAGE_NAME), anyInt(), any()))
+                .thenReturn(applicationInfo);
+
+        assertThat(mSideLoadedAppDetector.isSafe(stackInfo)).isTrue();
+    }
+
+    @Test
+    public void isSafe_nonSystemApp_withSafeSource_returnsTrue() throws Exception {
+        InstallSourceInfo sourceInfo = new InstallSourceInfo(SAFE_VENDOR,
+                /* initiatingPackageSigningInfo= */null,
+                /* originatingPackageName= */ null,
+                /* installingPackageName= */ null);
+        ActivityManager.StackInfo stackInfo = new ActivityManager.StackInfo();
+        stackInfo.topActivity = new ComponentName(APP_PACKAGE_NAME, APP_CLASS_NAME);
+
+        ApplicationInfo applicationInfo = new ApplicationInfo();
+        applicationInfo.packageName = APP_PACKAGE_NAME;
+
+        when(mPackageManager.getApplicationInfoAsUser(eq(APP_PACKAGE_NAME), anyInt(), any()))
+                .thenReturn(applicationInfo);
+        when(mPackageManager.getInstallSourceInfo(APP_PACKAGE_NAME)).thenReturn(sourceInfo);
+
+        assertThat(mSideLoadedAppDetector.isSafe(stackInfo)).isTrue();
+    }
+
+    @Test
+    public void isSafe_nonSystemApp_withUnsafeSource_returnsFalse() throws Exception {
+        InstallSourceInfo sourceInfo = new InstallSourceInfo(UNSAFE_VENDOR,
+                /* initiatingPackageSigningInfo= */null,
+                /* originatingPackageName= */ null,
+                /* installingPackageName= */ null);
+        ActivityManager.StackInfo stackInfo = new ActivityManager.StackInfo();
+        stackInfo.topActivity = new ComponentName(APP_PACKAGE_NAME, APP_CLASS_NAME);
+
+        ApplicationInfo applicationInfo = new ApplicationInfo();
+        applicationInfo.packageName = APP_PACKAGE_NAME;
+
+        when(mPackageManager.getApplicationInfoAsUser(eq(APP_PACKAGE_NAME), anyInt(), any()))
+                .thenReturn(applicationInfo);
+        when(mPackageManager.getInstallSourceInfo(APP_PACKAGE_NAME)).thenReturn(sourceInfo);
+
+        assertThat(mSideLoadedAppDetector.isSafe(stackInfo)).isFalse();
+    }
+
+    @Test
+    public void isSafe_nonSystemApp_withoutSource_returnsFalse() throws Exception {
+        InstallSourceInfo sourceInfo = new InstallSourceInfo(null,
+                /* initiatingPackageSigningInfo= */null,
+                /* originatingPackageName= */ null,
+                /* installingPackageName= */ null);
+        ActivityManager.StackInfo stackInfo = new ActivityManager.StackInfo();
+        stackInfo.topActivity = new ComponentName(APP_PACKAGE_NAME, APP_CLASS_NAME);
+
+        ApplicationInfo applicationInfo = new ApplicationInfo();
+        applicationInfo.packageName = APP_PACKAGE_NAME;
+
+        when(mPackageManager.getApplicationInfoAsUser(eq(APP_PACKAGE_NAME), anyInt(), any()))
+                .thenReturn(applicationInfo);
+        when(mPackageManager.getInstallSourceInfo(APP_PACKAGE_NAME)).thenReturn(sourceInfo);
+
+        assertThat(mSideLoadedAppDetector.isSafe(stackInfo)).isFalse();
+    }
+}
diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/car/voicerecognition/ConnectedDeviceVoiceRecognitionNotifierTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/car/voicerecognition/ConnectedDeviceVoiceRecognitionNotifierTest.java
new file mode 100644
index 0000000..eca51e3
--- /dev/null
+++ b/packages/CarSystemUI/tests/src/com/android/systemui/car/voicerecognition/ConnectedDeviceVoiceRecognitionNotifierTest.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.car.voicerecognition;
+
+import static com.android.systemui.car.voicerecognition.ConnectedDeviceVoiceRecognitionNotifier.INVALID_VALUE;
+import static com.android.systemui.car.voicerecognition.ConnectedDeviceVoiceRecognitionNotifier.VOICE_RECOGNITION_STARTED;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+
+import android.bluetooth.BluetoothHeadsetClient;
+import android.content.Intent;
+import android.os.Handler;
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper;
+
+import androidx.test.filters.SmallTest;
+
+import com.android.systemui.SysuiTestCase;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidTestingRunner.class)
[email protected]
+@SmallTest
+public class ConnectedDeviceVoiceRecognitionNotifierTest extends SysuiTestCase {
+
+    private static final String BLUETOOTH_PERM = android.Manifest.permission.BLUETOOTH;
+
+    private ConnectedDeviceVoiceRecognitionNotifier mVoiceRecognitionNotifier;
+    private Handler mTestHandler;
+
+    @Before
+    public void setUp() throws Exception {
+        TestableLooper testableLooper = TestableLooper.get(this);
+        mTestHandler = spy(new Handler(testableLooper.getLooper()));
+        mVoiceRecognitionNotifier = new ConnectedDeviceVoiceRecognitionNotifier(
+                mContext, mTestHandler);
+        mVoiceRecognitionNotifier.onBootCompleted();
+    }
+
+    @Test
+    public void testReceiveIntent_started_showToast() {
+        Intent intent = new Intent(BluetoothHeadsetClient.ACTION_AG_EVENT);
+        intent.putExtra(BluetoothHeadsetClient.EXTRA_VOICE_RECOGNITION, VOICE_RECOGNITION_STARTED);
+        mContext.sendBroadcast(intent, BLUETOOTH_PERM);
+        waitForIdleSync();
+
+        verify(mTestHandler).post(any());
+    }
+
+    @Test
+    public void testReceiveIntent_invalidExtra_noToast() {
+        Intent intent = new Intent(BluetoothHeadsetClient.ACTION_AG_EVENT);
+        intent.putExtra(BluetoothHeadsetClient.EXTRA_VOICE_RECOGNITION, INVALID_VALUE);
+        mContext.sendBroadcast(intent, BLUETOOTH_PERM);
+        waitForIdleSync();
+
+        verify(mTestHandler, never()).post(any());
+    }
+
+    @Test
+    public void testReceiveIntent_noExtra_noToast() {
+        Intent intent = new Intent(BluetoothHeadsetClient.ACTION_AG_EVENT);
+        mContext.sendBroadcast(intent, BLUETOOTH_PERM);
+        waitForIdleSync();
+
+        verify(mTestHandler, never()).post(any());
+    }
+
+    @Test
+    public void testReceiveIntent_invalidIntent_noToast() {
+        Intent intent = new Intent(BluetoothHeadsetClient.ACTION_AUDIO_STATE_CHANGED);
+        mContext.sendBroadcast(intent, BLUETOOTH_PERM);
+        waitForIdleSync();
+
+        verify(mTestHandler, never()).post(any());
+    }
+}
diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/car/window/OverlayPanelViewControllerTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/car/window/OverlayPanelViewControllerTest.java
new file mode 100644
index 0000000..70f1d25
--- /dev/null
+++ b/packages/CarSystemUI/tests/src/com/android/systemui/car/window/OverlayPanelViewControllerTest.java
@@ -0,0 +1,431 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.car.window;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.anyFloat;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper;
+import android.view.LayoutInflater;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.test.filters.SmallTest;
+
+import com.android.systemui.SysuiTestCase;
+import com.android.systemui.car.CarDeviceProvisionedController;
+import com.android.systemui.statusbar.FlingAnimationUtils;
+import com.android.systemui.tests.R;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@RunWith(AndroidTestingRunner.class)
[email protected]
+@SmallTest
+public class OverlayPanelViewControllerTest extends SysuiTestCase {
+    private TestOverlayPanelViewController mOverlayPanelViewController;
+    private ViewGroup mBaseLayout;
+
+    @Mock
+    private OverlayViewGlobalStateController mOverlayViewGlobalStateController;
+    @Mock
+    private FlingAnimationUtils.Builder mFlingAnimationUtilsBuilder;
+    @Mock
+    private FlingAnimationUtils mFlingAnimationUtils;
+    @Mock
+    private CarDeviceProvisionedController mCarDeviceProvisionedController;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        mBaseLayout = (ViewGroup) LayoutInflater.from(mContext).inflate(
+                R.layout.overlay_view_controller_test, /* root= */ null);
+
+        when(mFlingAnimationUtilsBuilder.setMaxLengthSeconds(anyFloat())).thenReturn(
+                mFlingAnimationUtilsBuilder);
+        when(mFlingAnimationUtilsBuilder.setSpeedUpFactor(anyFloat())).thenReturn(
+                mFlingAnimationUtilsBuilder);
+        when(mFlingAnimationUtilsBuilder.build()).thenReturn(mFlingAnimationUtils);
+        mOverlayPanelViewController = new TestOverlayPanelViewController(
+                getContext(),
+                getContext().getOrCreateTestableResources().getResources(),
+                R.id.overlay_view_controller_stub,
+                mOverlayViewGlobalStateController,
+                mFlingAnimationUtilsBuilder,
+                mCarDeviceProvisionedController);
+    }
+
+    @Test
+    public void toggle_notInflated_inflates() {
+        assertThat(mOverlayPanelViewController.isInflated()).isFalse();
+
+        mOverlayPanelViewController.toggle();
+
+        verify(mOverlayViewGlobalStateController).inflateView(mOverlayPanelViewController);
+    }
+
+    @Test
+    public void toggle_inflated_doesNotInflate() {
+        mOverlayPanelViewController.inflate(mBaseLayout);
+        assertThat(mOverlayPanelViewController.isInflated()).isTrue();
+
+        mOverlayPanelViewController.toggle();
+
+        verify(mOverlayViewGlobalStateController, never()).inflateView(mOverlayPanelViewController);
+    }
+
+    @Test
+    public void toggle_notExpanded_panelExpands() {
+        mOverlayPanelViewController.inflate(mBaseLayout);
+        mOverlayPanelViewController.setPanelExpanded(false);
+
+        mOverlayPanelViewController.toggle();
+
+        assertThat(mOverlayPanelViewController.mAnimateExpandPanelCalled).isTrue();
+    }
+
+    @Test
+    public void toggle_expanded_panelCollapses() {
+        mOverlayPanelViewController.inflate(mBaseLayout);
+        mOverlayPanelViewController.setPanelExpanded(true);
+
+        mOverlayPanelViewController.toggle();
+
+        assertThat(mOverlayPanelViewController.mAnimateCollapsePanelCalled).isTrue();
+    }
+
+    @Test
+    public void animateCollapsePanel_shouldNotAnimateCollapsePanel_doesNotCollapse() {
+        mOverlayPanelViewController.inflate(mBaseLayout);
+        mOverlayPanelViewController.setShouldAnimateCollapsePanel(false);
+
+        mOverlayPanelViewController.animateCollapsePanel();
+
+        assertThat(mOverlayPanelViewController.mAnimateCollapsePanelCalled).isTrue();
+        assertThat(mOverlayPanelViewController.mOnAnimateCollapsePanelCalled).isFalse();
+    }
+
+    @Test
+    public void animateCollapsePanel_isNotExpanded_doesNotCollapse() {
+        mOverlayPanelViewController.inflate(mBaseLayout);
+        mOverlayPanelViewController.setShouldAnimateCollapsePanel(true);
+        mOverlayPanelViewController.setPanelExpanded(false);
+
+        mOverlayPanelViewController.animateCollapsePanel();
+
+        assertThat(mOverlayPanelViewController.mAnimateCollapsePanelCalled).isTrue();
+        assertThat(mOverlayPanelViewController.mOnAnimateCollapsePanelCalled).isFalse();
+    }
+
+    @Test
+    public void animateCollapsePanel_isNotVisible_doesNotCollapse() {
+        mOverlayPanelViewController.inflate(mBaseLayout);
+        mOverlayPanelViewController.setShouldAnimateCollapsePanel(true);
+        mOverlayPanelViewController.setPanelExpanded(true);
+        mOverlayPanelViewController.setPanelVisible(false);
+
+        mOverlayPanelViewController.animateCollapsePanel();
+
+        assertThat(mOverlayPanelViewController.mAnimateCollapsePanelCalled).isTrue();
+        assertThat(mOverlayPanelViewController.mOnAnimateCollapsePanelCalled).isFalse();
+    }
+
+    @Test
+    public void animateCollapsePanel_collapses() {
+        mOverlayPanelViewController.inflate(mBaseLayout);
+        mOverlayPanelViewController.setShouldAnimateCollapsePanel(true);
+        mOverlayPanelViewController.setPanelExpanded(true);
+        mOverlayPanelViewController.setPanelVisible(true);
+
+        mOverlayPanelViewController.animateCollapsePanel();
+
+        assertThat(mOverlayPanelViewController.mOnAnimateCollapsePanelCalled).isTrue();
+    }
+
+    @Test
+    public void animateCollapsePanel_removesWindowFocus() {
+        mOverlayPanelViewController.inflate(mBaseLayout);
+        mOverlayPanelViewController.setShouldAnimateCollapsePanel(true);
+        mOverlayPanelViewController.setPanelExpanded(true);
+        mOverlayPanelViewController.setPanelVisible(true);
+
+        mOverlayPanelViewController.animateCollapsePanel();
+
+        verify(mOverlayViewGlobalStateController).setWindowFocusable(false);
+    }
+
+    @Test
+    public void animateExpandPanel_shouldNotAnimateExpandPanel_doesNotExpand() {
+        mOverlayPanelViewController.inflate(mBaseLayout);
+        mOverlayPanelViewController.setShouldAnimateExpandPanel(false);
+
+        mOverlayPanelViewController.animateExpandPanel();
+
+        assertThat(mOverlayPanelViewController.mAnimateExpandPanelCalled).isTrue();
+        assertThat(mOverlayPanelViewController.mOnAnimateExpandPanelCalled).isFalse();
+    }
+
+    @Test
+    public void animateExpandPanel_userNotSetup_doesNotExpand() {
+        mOverlayPanelViewController.inflate(mBaseLayout);
+        mOverlayPanelViewController.setShouldAnimateExpandPanel(true);
+        when(mCarDeviceProvisionedController.isCurrentUserFullySetup()).thenReturn(false);
+
+        mOverlayPanelViewController.animateExpandPanel();
+
+        assertThat(mOverlayPanelViewController.mAnimateExpandPanelCalled).isTrue();
+        assertThat(mOverlayPanelViewController.mOnAnimateExpandPanelCalled).isFalse();
+    }
+
+    @Test
+    public void animateExpandPanel_expands() {
+        mOverlayPanelViewController.inflate(mBaseLayout);
+        mOverlayPanelViewController.setShouldAnimateExpandPanel(true);
+        when(mCarDeviceProvisionedController.isCurrentUserFullySetup()).thenReturn(true);
+
+        mOverlayPanelViewController.animateExpandPanel();
+
+        assertThat(mOverlayPanelViewController.mOnAnimateExpandPanelCalled).isTrue();
+    }
+
+    @Test
+    public void animateExpandPanel_setsPanelVisible() {
+        mOverlayPanelViewController.inflate(mBaseLayout);
+        mOverlayPanelViewController.setShouldAnimateExpandPanel(true);
+        when(mCarDeviceProvisionedController.isCurrentUserFullySetup()).thenReturn(true);
+
+        mOverlayPanelViewController.animateExpandPanel();
+
+        assertThat(mOverlayPanelViewController.isPanelVisible()).isTrue();
+    }
+
+    @Test
+    public void animateExpandPanel_setsPanelExpanded() {
+        mOverlayPanelViewController.inflate(mBaseLayout);
+        mOverlayPanelViewController.setShouldAnimateExpandPanel(true);
+        when(mCarDeviceProvisionedController.isCurrentUserFullySetup()).thenReturn(true);
+
+        mOverlayPanelViewController.animateExpandPanel();
+
+        assertThat(mOverlayPanelViewController.isPanelExpanded()).isTrue();
+    }
+
+    @Test
+    public void setPanelVisible_setTrue_windowNotVisible_setsWindowVisible() {
+        mOverlayPanelViewController.inflate(mBaseLayout);
+        when(mOverlayViewGlobalStateController.isWindowVisible()).thenReturn(false);
+
+        mOverlayPanelViewController.setPanelVisible(true);
+
+        verify(mOverlayViewGlobalStateController).setWindowVisible(true);
+    }
+
+    @Test
+    public void setPanelVisible_setTrue_windowVisible_doesNotSetWindowVisible() {
+        mOverlayPanelViewController.inflate(mBaseLayout);
+        when(mOverlayViewGlobalStateController.isWindowVisible()).thenReturn(true);
+
+        mOverlayPanelViewController.setPanelVisible(true);
+
+        verify(mOverlayViewGlobalStateController, never()).setWindowVisible(true);
+    }
+
+    @Test
+    public void setPanelVisible_setTrue_setLayoutVisible() {
+        mOverlayPanelViewController.inflate(mBaseLayout);
+        mOverlayPanelViewController.getLayout().setVisibility(View.INVISIBLE);
+
+        mOverlayPanelViewController.setPanelVisible(true);
+
+        assertThat(mOverlayPanelViewController.getLayout().getVisibility()).isEqualTo(View.VISIBLE);
+    }
+
+    @Test
+    public void setPanelVisible_setTrue_setWindowFocusable() {
+        mOverlayPanelViewController.inflate(mBaseLayout);
+        mOverlayPanelViewController.setPanelVisible(true);
+
+        verify(mOverlayViewGlobalStateController).setWindowFocusable(true);
+    }
+
+    @Test
+    public void setPanelVisible_setFalse_windowVisible_setsWindowNotVisible() {
+        mOverlayPanelViewController.inflate(mBaseLayout);
+        when(mOverlayViewGlobalStateController.isWindowVisible()).thenReturn(true);
+
+        mOverlayPanelViewController.setPanelVisible(false);
+
+        verify(mOverlayViewGlobalStateController).setWindowVisible(false);
+    }
+
+    @Test
+    public void setPanelVisible_setFalse_windowNotVisible_doesNotSetWindowNotVisible() {
+        mOverlayPanelViewController.inflate(mBaseLayout);
+        when(mOverlayViewGlobalStateController.isWindowVisible()).thenReturn(false);
+
+        mOverlayPanelViewController.setPanelVisible(false);
+
+        verify(mOverlayViewGlobalStateController, never()).setWindowVisible(false);
+    }
+
+    @Test
+    public void setPanelVisible_setFalse_setLayoutInvisible() {
+        mOverlayPanelViewController.inflate(mBaseLayout);
+        mOverlayPanelViewController.getLayout().setVisibility(View.VISIBLE);
+
+        mOverlayPanelViewController.setPanelVisible(false);
+
+        assertThat(mOverlayPanelViewController.getLayout().getVisibility()).isEqualTo(
+                View.INVISIBLE);
+    }
+
+    @Test
+    public void setPanelVisible_setFalse_setWindowNotFocusable() {
+        mOverlayPanelViewController.inflate(mBaseLayout);
+
+        mOverlayPanelViewController.setPanelVisible(false);
+
+        verify(mOverlayViewGlobalStateController).setWindowFocusable(false);
+    }
+
+    @Test
+    public void dragOpenTouchListener_isNotInflated_inflatesView() {
+        when(mCarDeviceProvisionedController.isCurrentUserFullySetup()).thenReturn(true);
+        assertThat(mOverlayPanelViewController.isInflated()).isFalse();
+
+        mOverlayPanelViewController.getDragOpenTouchListener().onTouch(/* v= */ null,
+                MotionEvent.obtain(/* downTime= */ 200, /* eventTime= */ 300,
+                        MotionEvent.ACTION_MOVE, /* x= */ 0, /* y= */ 0, /* metaState= */ 0));
+
+        verify(mOverlayViewGlobalStateController).inflateView(mOverlayPanelViewController);
+    }
+
+    private static class TestOverlayPanelViewController extends OverlayPanelViewController {
+
+        private boolean mShouldAnimateCollapsePanel;
+        private boolean mShouldAnimateExpandPanel;
+        private boolean mShouldAllowClosingScroll;
+
+        boolean mOnAnimateCollapsePanelCalled;
+        boolean mAnimateCollapsePanelCalled;
+        boolean mOnAnimateExpandPanelCalled;
+        boolean mAnimateExpandPanelCalled;
+        boolean mOnCollapseAnimationEndCalled;
+        boolean mOnExpandAnimationEndCalled;
+        boolean mOnOpenScrollStartEnd;
+        List<Integer> mOnScrollHeights;
+
+        TestOverlayPanelViewController(
+                Context context,
+                Resources resources,
+                int stubId,
+                OverlayViewGlobalStateController overlayViewGlobalStateController,
+                FlingAnimationUtils.Builder flingAnimationUtilsBuilder,
+                CarDeviceProvisionedController carDeviceProvisionedController) {
+            super(context, resources, stubId, overlayViewGlobalStateController,
+                    flingAnimationUtilsBuilder,
+                    carDeviceProvisionedController);
+
+            mOnScrollHeights = new ArrayList<>();
+        }
+
+        public void setShouldAnimateCollapsePanel(boolean shouldAnimate) {
+            mShouldAnimateCollapsePanel = shouldAnimate;
+        }
+
+        @Override
+        protected boolean shouldAnimateCollapsePanel() {
+            return mShouldAnimateCollapsePanel;
+        }
+
+        @Override
+        protected void animateCollapsePanel() {
+            super.animateCollapsePanel();
+            mAnimateCollapsePanelCalled = true;
+        }
+
+        @Override
+        protected void onAnimateCollapsePanel() {
+            mOnAnimateCollapsePanelCalled = true;
+        }
+
+        public void setShouldAnimateExpandPanel(boolean shouldAnimate) {
+            mShouldAnimateExpandPanel = shouldAnimate;
+        }
+
+        @Override
+        protected boolean shouldAnimateExpandPanel() {
+            return mShouldAnimateExpandPanel;
+        }
+
+        @Override
+        protected void animateExpandPanel() {
+            super.animateExpandPanel();
+            mAnimateExpandPanelCalled = true;
+        }
+
+        @Override
+        protected void onAnimateExpandPanel() {
+            mOnAnimateExpandPanelCalled = true;
+        }
+
+        @Override
+        protected void onCollapseAnimationEnd() {
+            mOnCollapseAnimationEndCalled = true;
+        }
+
+        @Override
+        protected void onExpandAnimationEnd() {
+            mOnExpandAnimationEndCalled = true;
+        }
+
+        @Override
+        protected void onScroll(int height) {
+            mOnScrollHeights.add(height);
+        }
+
+        @Override
+        protected void onOpenScrollStart() {
+            mOnOpenScrollStartEnd = true;
+        }
+
+        public void setShouldAllowClosingScroll(boolean shouldAllow) {
+            mShouldAllowClosingScroll = shouldAllow;
+        }
+
+        @Override
+        protected boolean shouldAllowClosingScroll() {
+            return mShouldAllowClosingScroll;
+        }
+    }
+}
diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/car/window/OverlayViewControllerTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/car/window/OverlayViewControllerTest.java
new file mode 100644
index 0000000..c24a3b5
--- /dev/null
+++ b/packages/CarSystemUI/tests/src/com/android/systemui/car/window/OverlayViewControllerTest.java
@@ -0,0 +1,158 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.car.window;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.verify;
+
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper;
+import android.view.LayoutInflater;
+import android.view.ViewGroup;
+
+import androidx.test.filters.SmallTest;
+
+import com.android.systemui.SysuiTestCase;
+import com.android.systemui.tests.R;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidTestingRunner.class)
[email protected]
+@SmallTest
+public class OverlayViewControllerTest extends SysuiTestCase {
+    private TestOverlayViewController mOverlayViewController;
+    private ViewGroup mBaseLayout;
+
+    @Mock
+    private OverlayViewGlobalStateController mOverlayViewGlobalStateController;
+
+    @Captor
+    private ArgumentCaptor<Runnable> mRunnableArgumentCaptor;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(/* testClass= */ this);
+
+        mOverlayViewController = new TestOverlayViewController(R.id.overlay_view_controller_stub,
+                mOverlayViewGlobalStateController);
+
+        mBaseLayout = (ViewGroup) LayoutInflater.from(mContext).inflate(
+                R.layout.overlay_view_controller_test, /* root= */ null);
+    }
+
+    @Test
+    public void inflate_layoutInitialized() {
+        mOverlayViewController.inflate(mBaseLayout);
+
+        assertThat(mOverlayViewController.getLayout().getId()).isEqualTo(
+                R.id.overlay_view_controller_test);
+    }
+
+    @Test
+    public void inflate_onFinishInflateCalled() {
+        mOverlayViewController.inflate(mBaseLayout);
+
+        assertThat(mOverlayViewController.mOnFinishInflateCalled).isTrue();
+    }
+
+    @Test
+    public void start_viewInflated_viewShown() {
+        mOverlayViewController.inflate(mBaseLayout);
+
+        mOverlayViewController.start();
+
+        verify(mOverlayViewGlobalStateController).showView(eq(mOverlayViewController),
+                mRunnableArgumentCaptor.capture());
+
+        mRunnableArgumentCaptor.getValue().run();
+
+        assertThat(mOverlayViewController.mShowInternalCalled).isTrue();
+    }
+
+    @Test
+    public void stop_viewInflated_viewHidden() {
+        mOverlayViewController.inflate(mBaseLayout);
+
+        mOverlayViewController.stop();
+
+        verify(mOverlayViewGlobalStateController).hideView(eq(mOverlayViewController),
+                mRunnableArgumentCaptor.capture());
+
+        mRunnableArgumentCaptor.getValue().run();
+
+        assertThat(mOverlayViewController.mHideInternalCalled).isTrue();
+    }
+
+    @Test
+    public void start_viewNotInflated_viewNotShown() {
+        mOverlayViewController.start();
+
+        verify(mOverlayViewGlobalStateController).showView(eq(mOverlayViewController),
+                mRunnableArgumentCaptor.capture());
+
+        mRunnableArgumentCaptor.getValue().run();
+
+        assertThat(mOverlayViewController.mShowInternalCalled).isFalse();
+    }
+
+    @Test
+    public void stop_viewNotInflated_viewNotHidden() {
+        mOverlayViewController.stop();
+
+        verify(mOverlayViewGlobalStateController).hideView(eq(mOverlayViewController),
+                mRunnableArgumentCaptor.capture());
+
+        mRunnableArgumentCaptor.getValue().run();
+
+        assertThat(mOverlayViewController.mHideInternalCalled).isFalse();
+    }
+
+    private static class TestOverlayViewController extends OverlayViewController {
+        boolean mOnFinishInflateCalled = false;
+        boolean mShowInternalCalled = false;
+        boolean mHideInternalCalled = false;
+
+        TestOverlayViewController(int stubId,
+                OverlayViewGlobalStateController overlayViewGlobalStateController) {
+            super(stubId, overlayViewGlobalStateController);
+        }
+
+        @Override
+        protected void onFinishInflate() {
+            mOnFinishInflateCalled = true;
+        }
+
+        @Override
+        protected void showInternal() {
+            mShowInternalCalled = true;
+        }
+
+        @Override
+        protected void hideInternal() {
+            mHideInternalCalled = true;
+        }
+    }
+}
diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/car/window/OverlayViewGlobalStateControllerTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/car/window/OverlayViewGlobalStateControllerTest.java
new file mode 100644
index 0000000..25dd4f5
--- /dev/null
+++ b/packages/CarSystemUI/tests/src/com/android/systemui/car/window/OverlayViewGlobalStateControllerTest.java
@@ -0,0 +1,268 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.car.window;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper;
+import android.view.ViewGroup;
+import android.widget.FrameLayout;
+
+import androidx.test.filters.SmallTest;
+
+import com.android.systemui.SysuiTestCase;
+import com.android.systemui.car.navigationbar.CarNavigationBarController;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidTestingRunner.class)
[email protected]
+@SmallTest
+public class OverlayViewGlobalStateControllerTest extends SysuiTestCase {
+    private static final String MOCK_OVERLAY_VIEW_CONTROLLER_NAME = "OverlayViewController";
+
+    private OverlayViewGlobalStateController mOverlayViewGlobalStateController;
+    private ViewGroup mBaseLayout;
+
+    @Mock
+    private CarNavigationBarController mCarNavigationBarController;
+    @Mock
+    private SystemUIOverlayWindowController mSystemUIOverlayWindowController;
+    @Mock
+    private OverlayViewMediator mOverlayViewMediator;
+    @Mock
+    private OverlayViewController mOverlayViewController;
+    @Mock
+    private Runnable mRunnable;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(/* testClass= */ this);
+
+        mOverlayViewGlobalStateController = new OverlayViewGlobalStateController(
+                mCarNavigationBarController, mSystemUIOverlayWindowController);
+
+        verify(mSystemUIOverlayWindowController).attach();
+
+        mBaseLayout = new FrameLayout(mContext);
+
+        when(mSystemUIOverlayWindowController.getBaseLayout()).thenReturn(mBaseLayout);
+    }
+
+    @Test
+    public void registerMediator_overlayViewMediatorListenersRegistered() {
+        mOverlayViewGlobalStateController.registerMediator(mOverlayViewMediator);
+
+        verify(mOverlayViewMediator).registerListeners();
+    }
+
+    @Test
+    public void registerMediator_overlayViewMediatorViewControllerSetup() {
+        mOverlayViewGlobalStateController.registerMediator(mOverlayViewMediator);
+
+        verify(mOverlayViewMediator).setupOverlayContentViewControllers();
+    }
+
+    @Test
+    public void showView_nothingAlreadyShown_navigationBarsHidden() {
+        mOverlayViewGlobalStateController.showView(mOverlayViewController, mRunnable);
+
+        verify(mCarNavigationBarController).hideBars();
+    }
+
+    @Test
+    public void showView_nothingAlreadyShown_windowIsExpanded() {
+        mOverlayViewGlobalStateController.showView(mOverlayViewController, mRunnable);
+
+        verify(mSystemUIOverlayWindowController).setWindowVisible(true);
+    }
+
+    @Test
+    public void showView_somethingAlreadyShown_navigationBarsHidden() {
+        mOverlayViewGlobalStateController.mShownSet.add(MOCK_OVERLAY_VIEW_CONTROLLER_NAME);
+
+        mOverlayViewGlobalStateController.showView(mOverlayViewController, mRunnable);
+
+        verify(mCarNavigationBarController, never()).hideBars();
+    }
+
+    @Test
+    public void showView_somethingAlreadyShown_windowIsExpanded() {
+        mOverlayViewGlobalStateController.mShownSet.add(MOCK_OVERLAY_VIEW_CONTROLLER_NAME);
+
+        mOverlayViewGlobalStateController.showView(mOverlayViewController, mRunnable);
+
+        verify(mSystemUIOverlayWindowController, never()).setWindowVisible(true);
+    }
+
+    @Test
+    public void showView_viewControllerNotInflated_inflateViewController() {
+        when(mOverlayViewController.isInflated()).thenReturn(false);
+
+        mOverlayViewGlobalStateController.showView(mOverlayViewController, mRunnable);
+
+        verify(mOverlayViewController).inflate(mBaseLayout);
+    }
+
+    @Test
+    public void showView_viewControllerInflated_inflateViewControllerNotCalled() {
+        when(mOverlayViewController.isInflated()).thenReturn(true);
+
+        mOverlayViewGlobalStateController.showView(mOverlayViewController, mRunnable);
+
+        verify(mOverlayViewController, never()).inflate(mBaseLayout);
+    }
+
+    @Test
+    public void showView_showRunnableCalled() {
+        mOverlayViewGlobalStateController.showView(mOverlayViewController, mRunnable);
+
+        verify(mRunnable).run();
+    }
+
+    @Test
+    public void showView_overlayViewControllerAddedToShownSet() {
+        mOverlayViewGlobalStateController.showView(mOverlayViewController, mRunnable);
+
+        assertThat(mOverlayViewGlobalStateController.mShownSet.contains(
+                mOverlayViewController.getClass().getName())).isTrue();
+    }
+
+    @Test
+    public void hideView_viewControllerNotInflated_hideRunnableNotCalled() {
+        when(mOverlayViewController.isInflated()).thenReturn(false);
+
+        mOverlayViewGlobalStateController.hideView(mOverlayViewController, mRunnable);
+
+        verify(mRunnable, never()).run();
+    }
+
+    @Test
+    public void hideView_nothingShown_hideRunnableNotCalled() {
+        when(mOverlayViewController.isInflated()).thenReturn(true);
+        mOverlayViewGlobalStateController.mShownSet.clear();
+
+        mOverlayViewGlobalStateController.hideView(mOverlayViewController, mRunnable);
+
+        verify(mRunnable, never()).run();
+    }
+
+    @Test
+    public void hideView_viewControllerNotShown_hideRunnableNotCalled() {
+        when(mOverlayViewController.isInflated()).thenReturn(true);
+        mOverlayViewGlobalStateController.mShownSet.add(MOCK_OVERLAY_VIEW_CONTROLLER_NAME);
+
+        mOverlayViewGlobalStateController.hideView(mOverlayViewController, mRunnable);
+
+        verify(mRunnable, never()).run();
+    }
+
+    @Test
+    public void hideView_viewControllerShown_hideRunnableCalled() {
+        when(mOverlayViewController.isInflated()).thenReturn(true);
+        mOverlayViewGlobalStateController.mShownSet.add(
+                mOverlayViewController.getClass().getName());
+
+        mOverlayViewGlobalStateController.hideView(mOverlayViewController, mRunnable);
+
+        verify(mRunnable).run();
+    }
+
+    @Test
+    public void hideView_viewControllerOnlyShown_nothingShown() {
+        when(mOverlayViewController.isInflated()).thenReturn(true);
+        mOverlayViewGlobalStateController.mShownSet.add(
+                mOverlayViewController.getClass().getName());
+
+        mOverlayViewGlobalStateController.hideView(mOverlayViewController, mRunnable);
+
+        assertThat(mOverlayViewGlobalStateController.mShownSet.isEmpty()).isTrue();
+    }
+
+    @Test
+    public void hideView_viewControllerNotOnlyShown_navigationBarNotShown() {
+        when(mOverlayViewController.isInflated()).thenReturn(true);
+        mOverlayViewGlobalStateController.mShownSet.add(
+                mOverlayViewController.getClass().getName());
+        mOverlayViewGlobalStateController.mShownSet.add(MOCK_OVERLAY_VIEW_CONTROLLER_NAME);
+
+        mOverlayViewGlobalStateController.hideView(mOverlayViewController, mRunnable);
+
+        verify(mCarNavigationBarController, never()).showBars();
+    }
+
+    @Test
+    public void hideView_viewControllerNotOnlyShown_windowNotCollapsed() {
+        when(mOverlayViewController.isInflated()).thenReturn(true);
+        mOverlayViewGlobalStateController.mShownSet.add(
+                mOverlayViewController.getClass().getName());
+        mOverlayViewGlobalStateController.mShownSet.add(MOCK_OVERLAY_VIEW_CONTROLLER_NAME);
+
+        mOverlayViewGlobalStateController.hideView(mOverlayViewController, mRunnable);
+
+        verify(mSystemUIOverlayWindowController, never()).setWindowVisible(false);
+    }
+
+    @Test
+    public void hideView_viewControllerOnlyShown_navigationBarShown() {
+        when(mOverlayViewController.isInflated()).thenReturn(true);
+        mOverlayViewGlobalStateController.mShownSet.add(
+                mOverlayViewController.getClass().getName());
+
+        mOverlayViewGlobalStateController.hideView(mOverlayViewController, mRunnable);
+
+        verify(mCarNavigationBarController).showBars();
+    }
+
+    @Test
+    public void hideView_viewControllerOnlyShown_windowCollapsed() {
+        when(mOverlayViewController.isInflated()).thenReturn(true);
+        mOverlayViewGlobalStateController.mShownSet.add(
+                mOverlayViewController.getClass().getName());
+
+        mOverlayViewGlobalStateController.hideView(mOverlayViewController, mRunnable);
+
+        verify(mSystemUIOverlayWindowController).setWindowVisible(false);
+    }
+
+    @Test
+    public void inflateView_notInflated_inflates() {
+        when(mOverlayViewController.isInflated()).thenReturn(false);
+
+        mOverlayViewGlobalStateController.inflateView(mOverlayViewController);
+
+        verify(mOverlayViewController).inflate(mBaseLayout);
+    }
+
+    @Test
+    public void inflateView_alreadyInflated_doesNotInflate() {
+        when(mOverlayViewController.isInflated()).thenReturn(true);
+
+        mOverlayViewGlobalStateController.inflateView(mOverlayViewController);
+
+        verify(mOverlayViewController, never()).inflate(mBaseLayout);
+    }
+}
diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/navigationbar/car/ButtonSelectionStateControllerTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/navigationbar/car/ButtonSelectionStateControllerTest.java
deleted file mode 100644
index f94dd82..0000000
--- a/packages/CarSystemUI/tests/src/com/android/systemui/navigationbar/car/ButtonSelectionStateControllerTest.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Copyright (C) 2019 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.navigationbar.car;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.app.ActivityManager;
-import android.content.ComponentName;
-import android.testing.AndroidTestingRunner;
-import android.testing.TestableLooper;
-import android.view.LayoutInflater;
-import android.widget.LinearLayout;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.tests.R;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.MockitoAnnotations;
-
-import java.util.ArrayList;
-import java.util.List;
-
-@RunWith(AndroidTestingRunner.class)
[email protected]
-@SmallTest
-public class ButtonSelectionStateControllerTest extends SysuiTestCase {
-
-    private static final String TEST_COMPONENT_NAME_PACKAGE = "com.android.car.carlauncher";
-    private static final String TEST_COMPONENT_NAME_CLASS = ".CarLauncher";
-    private static final String TEST_CATEGORY = "com.google.android.apps.maps";
-    private static final String TEST_CATEGORY_CLASS = ".APP_MAPS";
-    private static final String TEST_PACKAGE = "com.android.car.dialer";
-    private static final String TEST_PACKAGE_CLASS = ".Dialer";
-
-    // LinearLayout with CarNavigationButtons with different configurations.
-    private LinearLayout mTestView;
-    private ButtonSelectionStateController mButtonSelectionStateController;
-    private ComponentName mComponentName;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-
-        mTestView = (LinearLayout) LayoutInflater.from(mContext).inflate(
-                R.layout.car_button_selection_state_controller_test, /* root= */ null);
-        mButtonSelectionStateController = new ButtonSelectionStateController(mContext);
-        mButtonSelectionStateController.addAllButtonsWithSelectionState(mTestView);
-    }
-
-    @Test
-    public void onTaskChanged_buttonDetectableByComponentName_selectsAssociatedButton() {
-        CarNavigationButton testButton = mTestView.findViewById(R.id.detectable_by_component_name);
-        mComponentName = new ComponentName(TEST_COMPONENT_NAME_PACKAGE, TEST_COMPONENT_NAME_CLASS);
-        List<ActivityManager.StackInfo> testStack = createTestStack(mComponentName);
-        testButton.setSelected(false);
-        mButtonSelectionStateController.taskChanged(testStack, /* validDisplay= */ -1);
-
-        assertbuttonSelected(testButton);
-    }
-
-    @Test
-    public void onTaskChanged_buttonDetectableByCategory_selectsAssociatedButton() {
-        CarNavigationButton testButton = mTestView.findViewById(R.id.detectable_by_category);
-        mComponentName = new ComponentName(TEST_CATEGORY, TEST_CATEGORY_CLASS);
-        List<ActivityManager.StackInfo> testStack = createTestStack(mComponentName);
-        testButton.setSelected(false);
-        mButtonSelectionStateController.taskChanged(testStack, /* validDisplay= */ -1);
-
-        assertbuttonSelected(testButton);
-    }
-
-    @Test
-    public void onTaskChanged_buttonDetectableByPackage_selectsAssociatedButton() {
-        CarNavigationButton testButton = mTestView.findViewById(R.id.detectable_by_package);
-        mComponentName = new ComponentName(TEST_PACKAGE, TEST_PACKAGE_CLASS);
-        List<ActivityManager.StackInfo> testStack = createTestStack(mComponentName);
-        testButton.setSelected(false);
-        mButtonSelectionStateController.taskChanged(testStack, /* validDisplay= */ -1);
-
-        assertbuttonSelected(testButton);
-    }
-
-    @Test
-    public void onTaskChanged_deselectsPreviouslySelectedButton() {
-        CarNavigationButton oldButton = mTestView.findViewById(R.id.detectable_by_component_name);
-        mComponentName = new ComponentName(TEST_COMPONENT_NAME_PACKAGE, TEST_COMPONENT_NAME_CLASS);
-        List<ActivityManager.StackInfo> oldStack = createTestStack(mComponentName);
-        oldButton.setSelected(false);
-        mButtonSelectionStateController.taskChanged(oldStack, /* validDisplay= */ -1);
-
-        mComponentName = new ComponentName(TEST_PACKAGE, TEST_PACKAGE_CLASS);
-        List<ActivityManager.StackInfo> newStack = createTestStack(mComponentName);
-        mButtonSelectionStateController.taskChanged(newStack, /* validDisplay= */ -1);
-
-        assertButtonUnselected(oldButton);
-    }
-
-    // Comparing alpha is a valid way to verify button selection state because all test buttons use
-    // highlightWhenSelected = true.
-    private void assertbuttonSelected(CarNavigationButton button) {
-        assertThat(button.getAlpha()).isEqualTo(CarNavigationButton.DEFAULT_SELECTED_ALPHA);
-    }
-
-    private void assertButtonUnselected(CarNavigationButton button) {
-        assertThat(button.getAlpha()).isEqualTo(CarNavigationButton.DEFAULT_UNSELECTED_ALPHA);
-    }
-
-    private List<ActivityManager.StackInfo> createTestStack(ComponentName componentName) {
-        ActivityManager.StackInfo validStackInfo = new ActivityManager.StackInfo();
-        validStackInfo.displayId = -1; // No display is assigned to this test view
-        validStackInfo.topActivity = componentName;
-
-        List<ActivityManager.StackInfo> testStack = new ArrayList<>();
-        testStack.add(validStackInfo);
-
-        return testStack;
-    }
-}
diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/navigationbar/car/CarNavigationBarControllerTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/navigationbar/car/CarNavigationBarControllerTest.java
deleted file mode 100644
index e0c13ed..0000000
--- a/packages/CarSystemUI/tests/src/com/android/systemui/navigationbar/car/CarNavigationBarControllerTest.java
+++ /dev/null
@@ -1,406 +0,0 @@
-/*
- * Copyright (C) 2019 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.navigationbar.car;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-
-import android.testing.AndroidTestingRunner;
-import android.testing.TestableLooper;
-import android.testing.TestableResources;
-import android.view.View;
-import android.view.ViewGroup;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.systemui.R;
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.navigationbar.car.hvac.HvacController;
-import com.android.systemui.plugins.DarkIconDispatcher;
-import com.android.systemui.statusbar.phone.StatusBarIconController;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-@RunWith(AndroidTestingRunner.class)
[email protected]
-@SmallTest
-public class CarNavigationBarControllerTest extends SysuiTestCase {
-
-    private CarNavigationBarController mCarNavigationBar;
-    private NavigationBarViewFactory mNavigationBarViewFactory;
-    private TestableResources mTestableResources;
-
-    @Mock
-    private ButtonSelectionStateController mButtonSelectionStateController;
-    @Mock
-    private HvacController mHvacController;
-
-    @Before
-    public void setUp() throws Exception {
-        MockitoAnnotations.initMocks(this);
-        mNavigationBarViewFactory = new NavigationBarViewFactory(mContext);
-        mTestableResources = mContext.getOrCreateTestableResources();
-
-        // Needed to inflate top navigation bar.
-        mDependency.injectMockDependency(DarkIconDispatcher.class);
-        mDependency.injectMockDependency(StatusBarIconController.class);
-    }
-
-    @Test
-    public void testConnectToHvac_callsConnect() {
-        mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory,
-                mButtonSelectionStateController, () -> mHvacController);
-
-        mCarNavigationBar.connectToHvac();
-
-        verify(mHvacController).connectToCarService();
-    }
-
-    @Test
-    public void testRemoveAllFromHvac_callsRemoveAll() {
-        mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory,
-                mButtonSelectionStateController, () -> mHvacController);
-
-        mCarNavigationBar.removeAllFromHvac();
-
-        verify(mHvacController).removeAllComponents();
-    }
-
-    @Test
-    public void testGetBottomWindow_bottomDisabled_returnsNull() {
-        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, false);
-        mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory,
-                mButtonSelectionStateController, () -> mHvacController);
-
-        ViewGroup window = mCarNavigationBar.getBottomWindow();
-
-        assertThat(window).isNull();
-    }
-
-    @Test
-    public void testGetBottomWindow_bottomEnabled_returnsWindow() {
-        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
-        mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory,
-                mButtonSelectionStateController, () -> mHvacController);
-
-        ViewGroup window = mCarNavigationBar.getBottomWindow();
-
-        assertThat(window).isNotNull();
-    }
-
-    @Test
-    public void testGetBottomWindow_bottomEnabled_calledTwice_returnsSameWindow() {
-        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
-        mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory,
-                mButtonSelectionStateController, () -> mHvacController);
-
-        ViewGroup window1 = mCarNavigationBar.getBottomWindow();
-        ViewGroup window2 = mCarNavigationBar.getBottomWindow();
-
-        assertThat(window1).isEqualTo(window2);
-    }
-
-    @Test
-    public void testGetLeftWindow_leftDisabled_returnsNull() {
-        mTestableResources.addOverride(R.bool.config_enableLeftNavigationBar, false);
-        mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory,
-                mButtonSelectionStateController, () -> mHvacController);
-        ViewGroup window = mCarNavigationBar.getLeftWindow();
-        assertThat(window).isNull();
-    }
-
-    @Test
-    public void testGetLeftWindow_leftEnabled_returnsWindow() {
-        mTestableResources.addOverride(R.bool.config_enableLeftNavigationBar, true);
-        mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory,
-                mButtonSelectionStateController, () -> mHvacController);
-
-        ViewGroup window = mCarNavigationBar.getLeftWindow();
-
-        assertThat(window).isNotNull();
-    }
-
-    @Test
-    public void testGetLeftWindow_leftEnabled_calledTwice_returnsSameWindow() {
-        mTestableResources.addOverride(R.bool.config_enableLeftNavigationBar, true);
-        mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory,
-                mButtonSelectionStateController, () -> mHvacController);
-
-        ViewGroup window1 = mCarNavigationBar.getLeftWindow();
-        ViewGroup window2 = mCarNavigationBar.getLeftWindow();
-
-        assertThat(window1).isEqualTo(window2);
-    }
-
-    @Test
-    public void testGetRightWindow_rightDisabled_returnsNull() {
-        mTestableResources.addOverride(R.bool.config_enableRightNavigationBar, false);
-        mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory,
-                mButtonSelectionStateController, () -> mHvacController);
-
-        ViewGroup window = mCarNavigationBar.getRightWindow();
-
-        assertThat(window).isNull();
-    }
-
-    @Test
-    public void testGetRightWindow_rightEnabled_returnsWindow() {
-        mTestableResources.addOverride(R.bool.config_enableRightNavigationBar, true);
-        mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory,
-                mButtonSelectionStateController, () -> mHvacController);
-
-        ViewGroup window = mCarNavigationBar.getRightWindow();
-
-        assertThat(window).isNotNull();
-    }
-
-    @Test
-    public void testGetRightWindow_rightEnabled_calledTwice_returnsSameWindow() {
-        mTestableResources.addOverride(R.bool.config_enableRightNavigationBar, true);
-        mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory,
-                mButtonSelectionStateController, () -> mHvacController);
-
-        ViewGroup window1 = mCarNavigationBar.getRightWindow();
-        ViewGroup window2 = mCarNavigationBar.getRightWindow();
-
-        assertThat(window1).isEqualTo(window2);
-    }
-
-    @Test
-    public void testSetBottomWindowVisibility_setTrue_isVisible() {
-        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
-        mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory,
-                mButtonSelectionStateController, () -> mHvacController);
-
-        ViewGroup window = mCarNavigationBar.getBottomWindow();
-        mCarNavigationBar.setBottomWindowVisibility(View.VISIBLE);
-
-        assertThat(window.getVisibility()).isEqualTo(View.VISIBLE);
-    }
-
-    @Test
-    public void testSetBottomWindowVisibility_setFalse_isGone() {
-        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
-        mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory,
-                mButtonSelectionStateController, () -> mHvacController);
-
-        ViewGroup window = mCarNavigationBar.getBottomWindow();
-        mCarNavigationBar.setBottomWindowVisibility(View.GONE);
-
-        assertThat(window.getVisibility()).isEqualTo(View.GONE);
-    }
-
-    @Test
-    public void testSetLeftWindowVisibility_setTrue_isVisible() {
-        mTestableResources.addOverride(R.bool.config_enableLeftNavigationBar, true);
-        mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory,
-                mButtonSelectionStateController, () -> mHvacController);
-
-        ViewGroup window = mCarNavigationBar.getLeftWindow();
-        mCarNavigationBar.setLeftWindowVisibility(View.VISIBLE);
-
-        assertThat(window.getVisibility()).isEqualTo(View.VISIBLE);
-    }
-
-    @Test
-    public void testSetLeftWindowVisibility_setFalse_isGone() {
-        mTestableResources.addOverride(R.bool.config_enableLeftNavigationBar, true);
-        mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory,
-                mButtonSelectionStateController, () -> mHvacController);
-
-        ViewGroup window = mCarNavigationBar.getLeftWindow();
-        mCarNavigationBar.setLeftWindowVisibility(View.GONE);
-
-        assertThat(window.getVisibility()).isEqualTo(View.GONE);
-    }
-
-    @Test
-    public void testSetRightWindowVisibility_setTrue_isVisible() {
-        mTestableResources.addOverride(R.bool.config_enableRightNavigationBar, true);
-        mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory,
-                mButtonSelectionStateController, () -> mHvacController);
-
-        ViewGroup window = mCarNavigationBar.getRightWindow();
-        mCarNavigationBar.setRightWindowVisibility(View.VISIBLE);
-
-        assertThat(window.getVisibility()).isEqualTo(View.VISIBLE);
-    }
-
-    @Test
-    public void testSetRightWindowVisibility_setFalse_isGone() {
-        mTestableResources.addOverride(R.bool.config_enableRightNavigationBar, true);
-        mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory,
-                mButtonSelectionStateController, () -> mHvacController);
-
-        ViewGroup window = mCarNavigationBar.getRightWindow();
-        mCarNavigationBar.setRightWindowVisibility(View.GONE);
-
-        assertThat(window.getVisibility()).isEqualTo(View.GONE);
-    }
-
-    @Test
-    public void testRegisterBottomBarTouchListener_createViewFirst_registrationSuccessful() {
-        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
-        mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory,
-                mButtonSelectionStateController, () -> mHvacController);
-
-        CarNavigationBarView bottomBar = mCarNavigationBar.getBottomBar(/* isSetUp= */ true);
-        View.OnTouchListener controller = bottomBar.getStatusBarWindowTouchListener();
-        assertThat(controller).isNull();
-        mCarNavigationBar.registerBottomBarTouchListener(mock(View.OnTouchListener.class));
-        controller = bottomBar.getStatusBarWindowTouchListener();
-
-        assertThat(controller).isNotNull();
-    }
-
-    @Test
-    public void testRegisterBottomBarTouchListener_registerFirst_registrationSuccessful() {
-        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
-        mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory,
-                mButtonSelectionStateController, () -> mHvacController);
-
-        mCarNavigationBar.registerBottomBarTouchListener(mock(View.OnTouchListener.class));
-        CarNavigationBarView bottomBar = mCarNavigationBar.getBottomBar(/* isSetUp= */ true);
-        View.OnTouchListener controller = bottomBar.getStatusBarWindowTouchListener();
-
-        assertThat(controller).isNotNull();
-    }
-
-    @Test
-    public void testRegisterNotificationController_createViewFirst_registrationSuccessful() {
-        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
-        mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory,
-                mButtonSelectionStateController, () -> mHvacController);
-
-        CarNavigationBarView bottomBar = mCarNavigationBar.getBottomBar(/* isSetUp= */ true);
-        CarNavigationBarController.NotificationsShadeController controller =
-                bottomBar.getNotificationsPanelController();
-        assertThat(controller).isNull();
-        mCarNavigationBar.registerNotificationController(
-                mock(CarNavigationBarController.NotificationsShadeController.class));
-        controller = bottomBar.getNotificationsPanelController();
-
-        assertThat(controller).isNotNull();
-    }
-
-    @Test
-    public void testRegisterNotificationController_registerFirst_registrationSuccessful() {
-        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
-        mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory,
-                mButtonSelectionStateController, () -> mHvacController);
-
-        mCarNavigationBar.registerNotificationController(
-                mock(CarNavigationBarController.NotificationsShadeController.class));
-        CarNavigationBarView bottomBar = mCarNavigationBar.getBottomBar(/* isSetUp= */ true);
-        CarNavigationBarController.NotificationsShadeController controller =
-                bottomBar.getNotificationsPanelController();
-
-        assertThat(controller).isNotNull();
-    }
-
-    @Test
-    public void testShowAllKeyguardButtons_bottomEnabled_bottomKeyguardButtonsVisible() {
-        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
-        mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory,
-                mButtonSelectionStateController, () -> mHvacController);
-        CarNavigationBarView bottomBar = mCarNavigationBar.getBottomBar(/* isSetUp= */ true);
-        View bottomKeyguardButtons = bottomBar.findViewById(R.id.lock_screen_nav_buttons);
-
-        mCarNavigationBar.showAllKeyguardButtons(/* isSetUp= */ true);
-
-        assertThat(bottomKeyguardButtons.getVisibility()).isEqualTo(View.VISIBLE);
-    }
-
-    @Test
-    public void testShowAllKeyguardButtons_bottomEnabled_bottomNavButtonsGone() {
-        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
-        mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory,
-                mButtonSelectionStateController, () -> mHvacController);
-        CarNavigationBarView bottomBar = mCarNavigationBar.getBottomBar(/* isSetUp= */ true);
-        View bottomButtons = bottomBar.findViewById(R.id.nav_buttons);
-
-        mCarNavigationBar.showAllKeyguardButtons(/* isSetUp= */ true);
-
-        assertThat(bottomButtons.getVisibility()).isEqualTo(View.GONE);
-    }
-
-    @Test
-    public void testHideAllKeyguardButtons_bottomEnabled_bottomKeyguardButtonsGone() {
-        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
-        mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory,
-                mButtonSelectionStateController, () -> mHvacController);
-        CarNavigationBarView bottomBar = mCarNavigationBar.getBottomBar(/* isSetUp= */ true);
-        View bottomKeyguardButtons = bottomBar.findViewById(R.id.lock_screen_nav_buttons);
-
-        mCarNavigationBar.showAllKeyguardButtons(/* isSetUp= */ true);
-        assertThat(bottomKeyguardButtons.getVisibility()).isEqualTo(View.VISIBLE);
-        mCarNavigationBar.hideAllKeyguardButtons(/* isSetUp= */ true);
-
-        assertThat(bottomKeyguardButtons.getVisibility()).isEqualTo(View.GONE);
-    }
-
-    @Test
-    public void testHideAllKeyguardButtons_bottomEnabled_bottomNavButtonsVisible() {
-        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
-        mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory,
-                mButtonSelectionStateController, () -> mHvacController);
-        CarNavigationBarView bottomBar = mCarNavigationBar.getBottomBar(/* isSetUp= */ true);
-        View bottomButtons = bottomBar.findViewById(R.id.nav_buttons);
-
-        mCarNavigationBar.showAllKeyguardButtons(/* isSetUp= */ true);
-        assertThat(bottomButtons.getVisibility()).isEqualTo(View.GONE);
-        mCarNavigationBar.hideAllKeyguardButtons(/* isSetUp= */ true);
-
-        assertThat(bottomButtons.getVisibility()).isEqualTo(View.VISIBLE);
-    }
-
-    @Test
-    public void testToggleAllNotificationsUnseenIndicator_bottomEnabled_hasUnseen_setCorrectly() {
-        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
-        mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory,
-                mButtonSelectionStateController, () -> mHvacController);
-        CarNavigationBarView bottomBar = mCarNavigationBar.getBottomBar(/* isSetUp= */ true);
-        CarNavigationButton notifications = bottomBar.findViewById(R.id.notifications);
-
-        boolean hasUnseen = true;
-        mCarNavigationBar.toggleAllNotificationsUnseenIndicator(/* isSetUp= */ true,
-                hasUnseen);
-
-        assertThat(notifications.getUnseen()).isTrue();
-    }
-
-    @Test
-    public void testToggleAllNotificationsUnseenIndicator_bottomEnabled_noUnseen_setCorrectly() {
-        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
-        mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory,
-                mButtonSelectionStateController, () -> mHvacController);
-        CarNavigationBarView bottomBar = mCarNavigationBar.getBottomBar(/* isSetUp= */ true);
-        CarNavigationButton notifications = bottomBar.findViewById(R.id.notifications);
-
-        boolean hasUnseen = false;
-        mCarNavigationBar.toggleAllNotificationsUnseenIndicator(/* isSetUp= */ true,
-                hasUnseen);
-
-        assertThat(notifications.getUnseen()).isFalse();
-    }
-}
diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/navigationbar/car/CarNavigationBarTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/navigationbar/car/CarNavigationBarTest.java
deleted file mode 100644
index 76557fd..0000000
--- a/packages/CarSystemUI/tests/src/com/android/systemui/navigationbar/car/CarNavigationBarTest.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.navigationbar.car;
-
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.os.Handler;
-import android.testing.AndroidTestingRunner;
-import android.testing.TestableLooper;
-import android.testing.TestableResources;
-import android.view.LayoutInflater;
-import android.view.WindowManager;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.systemui.R;
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.car.CarDeviceProvisionedController;
-import com.android.systemui.plugins.DarkIconDispatcher;
-import com.android.systemui.statusbar.CommandQueue;
-import com.android.systemui.statusbar.NavigationBarController;
-import com.android.systemui.statusbar.SuperStatusBarViewFactory;
-import com.android.systemui.statusbar.phone.AutoHideController;
-import com.android.systemui.statusbar.phone.StatusBarIconController;
-import com.android.systemui.statusbar.phone.StatusBarWindowView;
-import com.android.systemui.statusbar.policy.KeyguardStateController;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-@RunWith(AndroidTestingRunner.class)
[email protected]
-@SmallTest
-public class CarNavigationBarTest extends SysuiTestCase {
-
-    private CarNavigationBar mCarNavigationBar;
-    private TestableResources mTestableResources;
-    private Handler mHandler;
-
-    @Mock
-    private CarNavigationBarController mCarNavigationBarController;
-    @Mock
-    private WindowManager mWindowManager;
-    @Mock
-    private CarDeviceProvisionedController mDeviceProvisionedController;
-    @Mock
-    private AutoHideController mAutoHideController;
-    @Mock
-    private ButtonSelectionStateListener mButtonSelectionStateListener;
-    @Mock
-    private KeyguardStateController mKeyguardStateController;
-    @Mock
-    private NavigationBarController mNavigationBarController;
-    @Mock
-    private SuperStatusBarViewFactory mSuperStatusBarViewFactory;
-    @Mock
-    private ButtonSelectionStateController mButtonSelectionStateController;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-        mTestableResources = mContext.getOrCreateTestableResources();
-        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
-        mHandler = Handler.getMain();
-        mCarNavigationBar = new CarNavigationBar(mContext, mCarNavigationBarController,
-                mWindowManager, mDeviceProvisionedController, new CommandQueue(mContext),
-                mAutoHideController, mButtonSelectionStateListener, mHandler,
-                () -> mKeyguardStateController, () -> mNavigationBarController,
-                mSuperStatusBarViewFactory, mButtonSelectionStateController);
-        StatusBarWindowView statusBarWindowView = (StatusBarWindowView) LayoutInflater.from(
-                mContext).inflate(R.layout.super_status_bar, /* root= */ null);
-        when(mSuperStatusBarViewFactory.getStatusBarWindowView()).thenReturn(statusBarWindowView);
-        when(mKeyguardStateController.isShowing()).thenReturn(false);
-        mDependency.injectMockDependency(WindowManager.class);
-        // Needed to inflate top navigation bar.
-        mDependency.injectMockDependency(DarkIconDispatcher.class);
-        mDependency.injectMockDependency(StatusBarIconController.class);
-    }
-
-    @Test
-    public void restartNavbars_refreshesTaskChanged() {
-        ArgumentCaptor<CarDeviceProvisionedController.DeviceProvisionedListener>
-                deviceProvisionedCallbackCaptor = ArgumentCaptor.forClass(
-                CarDeviceProvisionedController.DeviceProvisionedListener.class);
-        when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(true);
-        mCarNavigationBar.start();
-        // switching the currentUserSetup value to force restart the navbars.
-        when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(false);
-        verify(mDeviceProvisionedController).addCallback(deviceProvisionedCallbackCaptor.capture());
-
-        deviceProvisionedCallbackCaptor.getValue().onUserSwitched();
-        waitForIdleSync(mHandler);
-
-        verify(mButtonSelectionStateListener).onTaskStackChanged();
-    }
-
-    @Test
-    public void restartNavBars_newUserNotSetupWithKeyguardShowing_showsKeyguardButtons() {
-        ArgumentCaptor<CarDeviceProvisionedController.DeviceProvisionedListener>
-                deviceProvisionedCallbackCaptor = ArgumentCaptor.forClass(
-                CarDeviceProvisionedController.DeviceProvisionedListener.class);
-        when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(true);
-        mCarNavigationBar.start();
-        when(mKeyguardStateController.isShowing()).thenReturn(true);
-        // switching the currentUserSetup value to force restart the navbars.
-        when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(false);
-        verify(mDeviceProvisionedController).addCallback(deviceProvisionedCallbackCaptor.capture());
-
-        deviceProvisionedCallbackCaptor.getValue().onUserSwitched();
-        waitForIdleSync(mHandler);
-
-        verify(mCarNavigationBarController).showAllKeyguardButtons(false);
-    }
-
-    @Test
-    public void restartNavbars_newUserIsSetupWithKeyguardHidden_hidesKeyguardButtons() {
-        ArgumentCaptor<CarDeviceProvisionedController.DeviceProvisionedListener>
-                deviceProvisionedCallbackCaptor = ArgumentCaptor.forClass(
-                CarDeviceProvisionedController.DeviceProvisionedListener.class);
-        when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(true);
-        mCarNavigationBar.start();
-        when(mKeyguardStateController.isShowing()).thenReturn(true);
-        // switching the currentUserSetup value to force restart the navbars.
-        when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(false);
-        verify(mDeviceProvisionedController).addCallback(deviceProvisionedCallbackCaptor.capture());
-        deviceProvisionedCallbackCaptor.getValue().onUserSwitched();
-        waitForIdleSync(mHandler);
-        when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(true);
-        when(mKeyguardStateController.isShowing()).thenReturn(false);
-
-        deviceProvisionedCallbackCaptor.getValue().onUserSetupChanged();
-        waitForIdleSync(mHandler);
-
-        verify(mCarNavigationBarController).hideAllKeyguardButtons(true);
-    }
-}
diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/navigationbar/car/CarNavigationBarViewTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/navigationbar/car/CarNavigationBarViewTest.java
deleted file mode 100644
index 9e2131c..0000000
--- a/packages/CarSystemUI/tests/src/com/android/systemui/navigationbar/car/CarNavigationBarViewTest.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.navigationbar.car;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.when;
-
-import android.testing.AndroidTestingRunner;
-import android.testing.TestableLooper;
-import android.view.LayoutInflater;
-import android.view.MotionEvent;
-import android.view.View;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.systemui.R;
-import com.android.systemui.SysuiTestCase;
-
-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;
-
-@RunWith(AndroidTestingRunner.class)
[email protected]
-@SmallTest
-public class CarNavigationBarViewTest extends SysuiTestCase {
-
-    private CarNavigationBarView mNavBarView;
-
-    @Mock
-    private CarNavigationBarController.NotificationsShadeController mNotificationsShadeController;
-
-    @Mock
-    private View.OnTouchListener mNavBarTouchListener;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-    }
-
-    @After
-    public void tearDown() {
-        getContext().getOrCreateTestableResources().addOverride(
-                R.bool.config_consumeNavigationBarTouchWhenNotificationPanelOpen, false);
-    }
-
-    @Test
-    public void dispatchTouch_shadeOpen_flagOff_doesNotConsumeTouch() {
-        getContext().getOrCreateTestableResources().addOverride(
-                R.bool.config_consumeNavigationBarTouchWhenNotificationPanelOpen, false);
-        when(mNotificationsShadeController.isNotificationPanelOpen()).thenReturn(true);
-        mNavBarView = (CarNavigationBarView) LayoutInflater.from(getContext()).inflate(
-                R.layout.car_navigation_bar_view_test, /* root= */ null);
-        mNavBarView.setNotificationsPanelController(mNotificationsShadeController);
-        mNavBarView.setStatusBarWindowTouchListener(mNavBarTouchListener);
-
-        boolean consume = mNavBarView.onInterceptTouchEvent(
-                MotionEvent.obtain(/* downTime= */ 200, /* eventTime= */ 300,
-                        MotionEvent.ACTION_MOVE, mNavBarView.getX(),
-                        mNavBarView.getY(), /* metaState= */ 0));
-
-        assertThat(consume).isFalse();
-    }
-
-    @Test
-    public void dispatchTouch_shadeOpen_flagOn_consumesTouch() {
-        getContext().getOrCreateTestableResources().addOverride(
-                R.bool.config_consumeNavigationBarTouchWhenNotificationPanelOpen, true);
-        when(mNotificationsShadeController.isNotificationPanelOpen()).thenReturn(true);
-        mNavBarView = (CarNavigationBarView) LayoutInflater.from(getContext()).inflate(
-                R.layout.car_navigation_bar_view_test, /* root= */ null);
-        mNavBarView.setNotificationsPanelController(mNotificationsShadeController);
-        mNavBarView.setStatusBarWindowTouchListener(mNavBarTouchListener);
-
-        boolean consume = mNavBarView.onInterceptTouchEvent(
-                MotionEvent.obtain(/* downTime= */ 200, /* eventTime= */ 300,
-                        MotionEvent.ACTION_MOVE, mNavBarView.getX(),
-                        mNavBarView.getY(), /* metaState= */ 0));
-
-        assertThat(consume).isTrue();
-    }
-}
diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/navigationbar/car/CarNavigationButtonTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/navigationbar/car/CarNavigationButtonTest.java
deleted file mode 100644
index 96d567d..0000000
--- a/packages/CarSystemUI/tests/src/com/android/systemui/navigationbar/car/CarNavigationButtonTest.java
+++ /dev/null
@@ -1,239 +0,0 @@
-/*
- * Copyright (C) 2019 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.navigationbar.car;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.argThat;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-
-import android.app.ActivityManager;
-import android.content.Context;
-import android.content.Intent;
-import android.graphics.drawable.Drawable;
-import android.testing.AndroidTestingRunner;
-import android.testing.TestableLooper;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.keyguard.AlphaOptimizedImageButton;
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.tests.R;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentMatcher;
-
-@RunWith(AndroidTestingRunner.class)
[email protected]
-@SmallTest
-public class CarNavigationButtonTest extends SysuiTestCase {
-
-    private static final String DEFAULT_BUTTON_ACTIVITY_NAME =
-            "com.android.car.carlauncher/.CarLauncher";
-    private static final String APP_GRID_BUTTON_ACTIVITY_NAME =
-            "com.android.car.carlauncher/.AppGridActivity";
-    private static final String BROADCAST_ACTION_NAME =
-            "android.car.intent.action.TOGGLE_HVAC_CONTROLS";
-
-    private ActivityManager mActivityManager;
-    // LinearLayout with CarNavigationButtons with different configurations.
-    private LinearLayout mTestView;
-    // Does not have any selection state which is the default configuration.
-    private CarNavigationButton mDefaultButton;
-
-    @Before
-    public void setUp() {
-        mContext = spy(mContext);
-        mTestView = (LinearLayout) LayoutInflater.from(mContext).inflate(
-                R.layout.car_navigation_button_test, /* root= */ null);
-        mDefaultButton = mTestView.findViewById(R.id.default_no_selection_state);
-        mActivityManager = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
-    }
-
-    @Test
-    public void onCreate_iconIsVisible() {
-        AlphaOptimizedImageButton icon = mDefaultButton.findViewById(
-                R.id.car_nav_button_icon_image);
-
-        assertThat(icon.getDrawable()).isNotNull();
-    }
-
-    @Test
-    public void onSelected_selectedIconDefined_togglesIcon() {
-        mDefaultButton.setSelected(true);
-        Drawable selectedIconDrawable = ((AlphaOptimizedImageButton) mDefaultButton.findViewById(
-                R.id.car_nav_button_icon_image)).getDrawable();
-
-
-        mDefaultButton.setSelected(false);
-        Drawable unselectedIconDrawable = ((AlphaOptimizedImageButton) mDefaultButton.findViewById(
-                R.id.car_nav_button_icon_image)).getDrawable();
-
-        assertThat(selectedIconDrawable).isNotEqualTo(unselectedIconDrawable);
-    }
-
-    @Test
-    public void onSelected_selectedIconUndefined_displaysSameIcon() {
-        CarNavigationButton selectedIconUndefinedButton = mTestView.findViewById(
-                R.id.selected_icon_undefined);
-
-        selectedIconUndefinedButton.setSelected(true);
-        Drawable selectedIconDrawable = ((AlphaOptimizedImageButton) mDefaultButton.findViewById(
-                R.id.car_nav_button_icon_image)).getDrawable();
-
-
-        selectedIconUndefinedButton.setSelected(false);
-        Drawable unselectedIconDrawable = ((AlphaOptimizedImageButton) mDefaultButton.findViewById(
-                R.id.car_nav_button_icon_image)).getDrawable();
-
-        assertThat(selectedIconDrawable).isEqualTo(unselectedIconDrawable);
-    }
-
-    @Test
-    public void onUnselected_doesNotHighlightWhenSelected_applySelectedAlpha() {
-        mDefaultButton.setSelected(false);
-
-        assertThat(mDefaultButton.getAlpha()).isEqualTo(
-                CarNavigationButton.DEFAULT_SELECTED_ALPHA);
-    }
-
-    @Test
-    public void onSelected_doesNotHighlightWhenSelected_applySelectedAlpha() {
-        mDefaultButton.setSelected(true);
-
-        assertThat(mDefaultButton.getAlpha()).isEqualTo(
-                CarNavigationButton.DEFAULT_SELECTED_ALPHA);
-    }
-
-    @Test
-    public void onUnselected_highlightWhenSelected_applyDefaultUnselectedAlpha() {
-        CarNavigationButton highlightWhenSelectedButton = mTestView.findViewById(
-                R.id.highlightable_no_more_button);
-        highlightWhenSelectedButton.setSelected(false);
-
-        assertThat(highlightWhenSelectedButton.getAlpha()).isEqualTo(
-                CarNavigationButton.DEFAULT_UNSELECTED_ALPHA);
-    }
-
-    @Test
-    public void onSelected_highlightWhenSelected_applyDefaultSelectedAlpha() {
-        CarNavigationButton highlightWhenSelectedButton = mTestView.findViewById(
-                R.id.highlightable_no_more_button);
-        highlightWhenSelectedButton.setSelected(true);
-
-        assertThat(highlightWhenSelectedButton.getAlpha()).isEqualTo(
-                CarNavigationButton.DEFAULT_SELECTED_ALPHA);
-    }
-
-    @Test
-    public void onSelected_doesNotShowMoreWhenSelected_doesNotShowMoreIcon() {
-        mDefaultButton.setSelected(true);
-        AlphaOptimizedImageButton moreIcon = mDefaultButton.findViewById(
-                R.id.car_nav_button_more_icon);
-
-        assertThat(moreIcon.getVisibility()).isEqualTo(View.GONE);
-    }
-
-    @Test
-    public void onSelected_showMoreWhenSelected_showsMoreIcon() {
-        CarNavigationButton showMoreWhenSelected = mTestView.findViewById(
-                R.id.not_highlightable_more_button);
-        showMoreWhenSelected.setSelected(true);
-        AlphaOptimizedImageButton moreIcon = showMoreWhenSelected.findViewById(
-                R.id.car_nav_button_more_icon);
-
-        assertThat(moreIcon.getVisibility()).isEqualTo(View.VISIBLE);
-    }
-
-    @Test
-    public void onUnselected_showMoreWhenSelected_doesNotShowMoreIcon() {
-        CarNavigationButton showMoreWhenSelected = mTestView.findViewById(
-                R.id.highlightable_no_more_button);
-        showMoreWhenSelected.setSelected(true);
-        showMoreWhenSelected.setSelected(false);
-        AlphaOptimizedImageButton moreIcon = showMoreWhenSelected.findViewById(
-                R.id.car_nav_button_more_icon);
-
-        assertThat(moreIcon.getVisibility()).isEqualTo(View.GONE);
-    }
-
-    @Test
-    public void onClick_launchesIntentActivity() {
-        mDefaultButton.performClick();
-
-        assertThat(getCurrentActivityName()).isEqualTo(DEFAULT_BUTTON_ACTIVITY_NAME);
-
-        CarNavigationButton appGridButton = mTestView.findViewById(R.id.app_grid_activity);
-        appGridButton.performClick();
-
-        assertThat(getCurrentActivityName()).isEqualTo(APP_GRID_BUTTON_ACTIVITY_NAME);
-    }
-
-    @Test
-    public void onLongClick_longIntentDefined_launchesLongIntentActivity() {
-        mDefaultButton.performClick();
-
-        assertThat(getCurrentActivityName()).isEqualTo(DEFAULT_BUTTON_ACTIVITY_NAME);
-
-        CarNavigationButton appGridButton = mTestView.findViewById(
-                R.id.long_click_app_grid_activity);
-        appGridButton.performLongClick();
-
-        assertThat(getCurrentActivityName()).isEqualTo(APP_GRID_BUTTON_ACTIVITY_NAME);
-    }
-
-    @Test
-    public void onClick_useBroadcast_broadcastsIntent() {
-        CarNavigationButton appGridButton = mTestView.findViewById(R.id.broadcast);
-        appGridButton.performClick();
-
-        verify(mContext).sendBroadcastAsUser(argThat(new ArgumentMatcher<Intent>() {
-            @Override
-            public boolean matches(Intent argument) {
-                return argument.getAction().equals(BROADCAST_ACTION_NAME);
-            }
-        }), any());
-    }
-
-    @Test
-    public void onSetUnseen_hasUnseen_showsUnseenIndicator() {
-        mDefaultButton.setUnseen(true);
-        ImageView hasUnseenIndicator = mDefaultButton.findViewById(R.id.car_nav_button_unseen_icon);
-
-        assertThat(hasUnseenIndicator.getVisibility()).isEqualTo(View.VISIBLE);
-    }
-
-    @Test
-    public void onSetUnseen_doesNotHaveUnseen_hidesUnseenIndicator() {
-        mDefaultButton.setUnseen(false);
-        ImageView hasUnseenIndicator = mDefaultButton.findViewById(R.id.car_nav_button_unseen_icon);
-
-        assertThat(hasUnseenIndicator.getVisibility()).isEqualTo(View.GONE);
-    }
-
-    private String getCurrentActivityName() {
-        return mActivityManager.getRunningTasks(1).get(0).topActivity.flattenToShortString();
-    }
-}
diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/navigationbar/car/hvac/HvacControllerTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/navigationbar/car/hvac/HvacControllerTest.java
deleted file mode 100644
index a71d1db..0000000
--- a/packages/CarSystemUI/tests/src/com/android/systemui/navigationbar/car/hvac/HvacControllerTest.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Copyright (C) 2019 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.navigationbar.car.hvac;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.reset;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.car.Car;
-import android.car.hardware.hvac.CarHvacManager;
-import android.testing.AndroidTestingRunner;
-import android.testing.TestableLooper;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.car.CarServiceProvider;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-@RunWith(AndroidTestingRunner.class)
[email protected]
-@SmallTest
-public class HvacControllerTest extends SysuiTestCase {
-
-    private static final int PROPERTY_ID = 1;
-    private static final int AREA_ID = 1;
-    private static final float VALUE = 72.0f;
-
-    private HvacController mHvacController;
-    private CarServiceProvider mCarServiceProvider;
-
-    @Mock
-    private Car mCar;
-    @Mock
-    private CarHvacManager mCarHvacManager;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-        when(mCar.isConnected()).thenReturn(true);
-        when(mCar.getCarManager(Car.HVAC_SERVICE)).thenReturn(mCarHvacManager);
-
-        mCarServiceProvider = new CarServiceProvider(mContext, mCar);
-        mHvacController = new HvacController(mCarServiceProvider);
-        mHvacController.connectToCarService();
-    }
-
-    @Test
-    public void connectToCarService_registersCallback() {
-        verify(mCarHvacManager).registerCallback(any());
-    }
-
-    @Test
-    public void addTemperatureViewToController_usingTemperatureView_registersView() {
-        TemperatureTextView v = setupMockTemperatureTextView(PROPERTY_ID, AREA_ID, VALUE);
-        mHvacController.addTemperatureViewToController(v);
-
-        verify(v).setTemp(VALUE);
-    }
-
-    @Test
-    public void addTemperatureViewToController_usingSameTemperatureView_registersFirstView() {
-        TemperatureTextView v = setupMockTemperatureTextView(PROPERTY_ID, AREA_ID, VALUE);
-        mHvacController.addTemperatureViewToController(v);
-        verify(v).setTemp(VALUE);
-        resetTemperatureView(v, PROPERTY_ID, AREA_ID);
-
-        mHvacController.addTemperatureViewToController(v);
-        verify(v, never()).setTemp(VALUE);
-    }
-
-    @Test
-    public void addTemperatureViewToController_usingDifferentTemperatureView_registersBothViews() {
-        TemperatureTextView v1 = setupMockTemperatureTextView(PROPERTY_ID, AREA_ID, VALUE);
-        mHvacController.addTemperatureViewToController(v1);
-        verify(v1).setTemp(VALUE);
-
-        TemperatureTextView v2 = setupMockTemperatureTextView(
-                PROPERTY_ID + 1,
-                AREA_ID + 1,
-                VALUE + 1);
-        mHvacController.addTemperatureViewToController(v2);
-        verify(v2).setTemp(VALUE + 1);
-    }
-
-    @Test
-    public void removeAllComponents_ableToRegisterSameView() {
-        TemperatureTextView v = setupMockTemperatureTextView(PROPERTY_ID, AREA_ID, VALUE);
-        mHvacController.addTemperatureViewToController(v);
-        verify(v).setTemp(VALUE);
-
-        mHvacController.removeAllComponents();
-        resetTemperatureView(v, PROPERTY_ID, AREA_ID);
-
-        mHvacController.addTemperatureViewToController(v);
-        verify(v).setTemp(VALUE);
-    }
-
-    private TemperatureTextView setupMockTemperatureTextView(int propertyId, int areaId,
-            float value) {
-        TemperatureTextView v = mock(TemperatureTextView.class);
-        resetTemperatureView(v, propertyId, areaId);
-        when(mCarHvacManager.isPropertyAvailable(propertyId, areaId)).thenReturn(true);
-        when(mCarHvacManager.getFloatProperty(propertyId, areaId)).thenReturn(value);
-        return v;
-    }
-
-    private void resetTemperatureView(TemperatureTextView view, int propertyId, int areaId) {
-        reset(view);
-        when(view.getPropertyId()).thenReturn(propertyId);
-        when(view.getAreaId()).thenReturn(areaId);
-    }
-}
diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/voicerecognition/car/ConnectedDeviceVoiceRecognitionNotifierTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/voicerecognition/car/ConnectedDeviceVoiceRecognitionNotifierTest.java
deleted file mode 100644
index 38b47d0..0000000
--- a/packages/CarSystemUI/tests/src/com/android/systemui/voicerecognition/car/ConnectedDeviceVoiceRecognitionNotifierTest.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (C) 2019 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.voicerecognition.car;
-
-import static com.android.systemui.voicerecognition.car.ConnectedDeviceVoiceRecognitionNotifier.INVALID_VALUE;
-import static com.android.systemui.voicerecognition.car.ConnectedDeviceVoiceRecognitionNotifier.VOICE_RECOGNITION_STARTED;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-
-import android.bluetooth.BluetoothHeadsetClient;
-import android.content.Intent;
-import android.os.Handler;
-import android.testing.AndroidTestingRunner;
-import android.testing.TestableLooper;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.systemui.SysuiTestCase;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidTestingRunner.class)
[email protected]
-@SmallTest
-public class ConnectedDeviceVoiceRecognitionNotifierTest extends SysuiTestCase {
-
-    private static final String BLUETOOTH_PERM = android.Manifest.permission.BLUETOOTH;
-
-    private ConnectedDeviceVoiceRecognitionNotifier mVoiceRecognitionNotifier;
-    private Handler mTestHandler;
-
-    @Before
-    public void setUp() throws Exception {
-        TestableLooper testableLooper = TestableLooper.get(this);
-        mTestHandler = spy(new Handler(testableLooper.getLooper()));
-        mVoiceRecognitionNotifier = new ConnectedDeviceVoiceRecognitionNotifier(
-                mContext, mTestHandler);
-        mVoiceRecognitionNotifier.onBootCompleted();
-    }
-
-    @Test
-    public void testReceiveIntent_started_showToast() {
-        Intent intent = new Intent(BluetoothHeadsetClient.ACTION_AG_EVENT);
-        intent.putExtra(BluetoothHeadsetClient.EXTRA_VOICE_RECOGNITION, VOICE_RECOGNITION_STARTED);
-        mContext.sendBroadcast(intent, BLUETOOTH_PERM);
-        waitForIdleSync();
-
-        verify(mTestHandler).post(any());
-    }
-
-    @Test
-    public void testReceiveIntent_invalidExtra_noToast() {
-        Intent intent = new Intent(BluetoothHeadsetClient.ACTION_AG_EVENT);
-        intent.putExtra(BluetoothHeadsetClient.EXTRA_VOICE_RECOGNITION, INVALID_VALUE);
-        mContext.sendBroadcast(intent, BLUETOOTH_PERM);
-        waitForIdleSync();
-
-        verify(mTestHandler, never()).post(any());
-    }
-
-    @Test
-    public void testReceiveIntent_noExtra_noToast() {
-        Intent intent = new Intent(BluetoothHeadsetClient.ACTION_AG_EVENT);
-        mContext.sendBroadcast(intent, BLUETOOTH_PERM);
-        waitForIdleSync();
-
-        verify(mTestHandler, never()).post(any());
-    }
-
-    @Test
-    public void testReceiveIntent_invalidIntent_noToast() {
-        Intent intent = new Intent(BluetoothHeadsetClient.ACTION_AUDIO_STATE_CHANGED);
-        mContext.sendBroadcast(intent, BLUETOOTH_PERM);
-        waitForIdleSync();
-
-        verify(mTestHandler, never()).post(any());
-    }
-}
diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/window/OverlayPanelViewControllerTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/window/OverlayPanelViewControllerTest.java
deleted file mode 100644
index 04f2d06..0000000
--- a/packages/CarSystemUI/tests/src/com/android/systemui/window/OverlayPanelViewControllerTest.java
+++ /dev/null
@@ -1,431 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.window;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.anyFloat;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.testing.AndroidTestingRunner;
-import android.testing.TestableLooper;
-import android.view.LayoutInflater;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewGroup;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.car.CarDeviceProvisionedController;
-import com.android.systemui.statusbar.FlingAnimationUtils;
-import com.android.systemui.tests.R;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-import java.util.ArrayList;
-import java.util.List;
-
-@RunWith(AndroidTestingRunner.class)
[email protected]
-@SmallTest
-public class OverlayPanelViewControllerTest extends SysuiTestCase {
-    private TestOverlayPanelViewController mOverlayPanelViewController;
-    private ViewGroup mBaseLayout;
-
-    @Mock
-    private OverlayViewGlobalStateController mOverlayViewGlobalStateController;
-    @Mock
-    private FlingAnimationUtils.Builder mFlingAnimationUtilsBuilder;
-    @Mock
-    private FlingAnimationUtils mFlingAnimationUtils;
-    @Mock
-    private CarDeviceProvisionedController mCarDeviceProvisionedController;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-
-        mBaseLayout = (ViewGroup) LayoutInflater.from(mContext).inflate(
-                R.layout.overlay_view_controller_test, /* root= */ null);
-
-        when(mFlingAnimationUtilsBuilder.setMaxLengthSeconds(anyFloat())).thenReturn(
-                mFlingAnimationUtilsBuilder);
-        when(mFlingAnimationUtilsBuilder.setSpeedUpFactor(anyFloat())).thenReturn(
-                mFlingAnimationUtilsBuilder);
-        when(mFlingAnimationUtilsBuilder.build()).thenReturn(mFlingAnimationUtils);
-        mOverlayPanelViewController = new TestOverlayPanelViewController(
-                getContext(),
-                getContext().getOrCreateTestableResources().getResources(),
-                R.id.overlay_view_controller_stub,
-                mOverlayViewGlobalStateController,
-                mFlingAnimationUtilsBuilder,
-                mCarDeviceProvisionedController);
-    }
-
-    @Test
-    public void toggle_notInflated_inflates() {
-        assertThat(mOverlayPanelViewController.isInflated()).isFalse();
-
-        mOverlayPanelViewController.toggle();
-
-        verify(mOverlayViewGlobalStateController).inflateView(mOverlayPanelViewController);
-    }
-
-    @Test
-    public void toggle_inflated_doesNotInflate() {
-        mOverlayPanelViewController.inflate(mBaseLayout);
-        assertThat(mOverlayPanelViewController.isInflated()).isTrue();
-
-        mOverlayPanelViewController.toggle();
-
-        verify(mOverlayViewGlobalStateController, never()).inflateView(mOverlayPanelViewController);
-    }
-
-    @Test
-    public void toggle_notExpanded_panelExpands() {
-        mOverlayPanelViewController.inflate(mBaseLayout);
-        mOverlayPanelViewController.setPanelExpanded(false);
-
-        mOverlayPanelViewController.toggle();
-
-        assertThat(mOverlayPanelViewController.mAnimateExpandPanelCalled).isTrue();
-    }
-
-    @Test
-    public void toggle_expanded_panelCollapses() {
-        mOverlayPanelViewController.inflate(mBaseLayout);
-        mOverlayPanelViewController.setPanelExpanded(true);
-
-        mOverlayPanelViewController.toggle();
-
-        assertThat(mOverlayPanelViewController.mAnimateCollapsePanelCalled).isTrue();
-    }
-
-    @Test
-    public void animateCollapsePanel_shouldNotAnimateCollapsePanel_doesNotCollapse() {
-        mOverlayPanelViewController.inflate(mBaseLayout);
-        mOverlayPanelViewController.setShouldAnimateCollapsePanel(false);
-
-        mOverlayPanelViewController.animateCollapsePanel();
-
-        assertThat(mOverlayPanelViewController.mAnimateCollapsePanelCalled).isTrue();
-        assertThat(mOverlayPanelViewController.mOnAnimateCollapsePanelCalled).isFalse();
-    }
-
-    @Test
-    public void animateCollapsePanel_isNotExpanded_doesNotCollapse() {
-        mOverlayPanelViewController.inflate(mBaseLayout);
-        mOverlayPanelViewController.setShouldAnimateCollapsePanel(true);
-        mOverlayPanelViewController.setPanelExpanded(false);
-
-        mOverlayPanelViewController.animateCollapsePanel();
-
-        assertThat(mOverlayPanelViewController.mAnimateCollapsePanelCalled).isTrue();
-        assertThat(mOverlayPanelViewController.mOnAnimateCollapsePanelCalled).isFalse();
-    }
-
-    @Test
-    public void animateCollapsePanel_isNotVisible_doesNotCollapse() {
-        mOverlayPanelViewController.inflate(mBaseLayout);
-        mOverlayPanelViewController.setShouldAnimateCollapsePanel(true);
-        mOverlayPanelViewController.setPanelExpanded(true);
-        mOverlayPanelViewController.setPanelVisible(false);
-
-        mOverlayPanelViewController.animateCollapsePanel();
-
-        assertThat(mOverlayPanelViewController.mAnimateCollapsePanelCalled).isTrue();
-        assertThat(mOverlayPanelViewController.mOnAnimateCollapsePanelCalled).isFalse();
-    }
-
-    @Test
-    public void animateCollapsePanel_collapses() {
-        mOverlayPanelViewController.inflate(mBaseLayout);
-        mOverlayPanelViewController.setShouldAnimateCollapsePanel(true);
-        mOverlayPanelViewController.setPanelExpanded(true);
-        mOverlayPanelViewController.setPanelVisible(true);
-
-        mOverlayPanelViewController.animateCollapsePanel();
-
-        assertThat(mOverlayPanelViewController.mOnAnimateCollapsePanelCalled).isTrue();
-    }
-
-    @Test
-    public void animateCollapsePanel_removesWindowFocus() {
-        mOverlayPanelViewController.inflate(mBaseLayout);
-        mOverlayPanelViewController.setShouldAnimateCollapsePanel(true);
-        mOverlayPanelViewController.setPanelExpanded(true);
-        mOverlayPanelViewController.setPanelVisible(true);
-
-        mOverlayPanelViewController.animateCollapsePanel();
-
-        verify(mOverlayViewGlobalStateController).setWindowFocusable(false);
-    }
-
-    @Test
-    public void animateExpandPanel_shouldNotAnimateExpandPanel_doesNotExpand() {
-        mOverlayPanelViewController.inflate(mBaseLayout);
-        mOverlayPanelViewController.setShouldAnimateExpandPanel(false);
-
-        mOverlayPanelViewController.animateExpandPanel();
-
-        assertThat(mOverlayPanelViewController.mAnimateExpandPanelCalled).isTrue();
-        assertThat(mOverlayPanelViewController.mOnAnimateExpandPanelCalled).isFalse();
-    }
-
-    @Test
-    public void animateExpandPanel_userNotSetup_doesNotExpand() {
-        mOverlayPanelViewController.inflate(mBaseLayout);
-        mOverlayPanelViewController.setShouldAnimateExpandPanel(true);
-        when(mCarDeviceProvisionedController.isCurrentUserFullySetup()).thenReturn(false);
-
-        mOverlayPanelViewController.animateExpandPanel();
-
-        assertThat(mOverlayPanelViewController.mAnimateExpandPanelCalled).isTrue();
-        assertThat(mOverlayPanelViewController.mOnAnimateExpandPanelCalled).isFalse();
-    }
-
-    @Test
-    public void animateExpandPanel_expands() {
-        mOverlayPanelViewController.inflate(mBaseLayout);
-        mOverlayPanelViewController.setShouldAnimateExpandPanel(true);
-        when(mCarDeviceProvisionedController.isCurrentUserFullySetup()).thenReturn(true);
-
-        mOverlayPanelViewController.animateExpandPanel();
-
-        assertThat(mOverlayPanelViewController.mOnAnimateExpandPanelCalled).isTrue();
-    }
-
-    @Test
-    public void animateExpandPanel_setsPanelVisible() {
-        mOverlayPanelViewController.inflate(mBaseLayout);
-        mOverlayPanelViewController.setShouldAnimateExpandPanel(true);
-        when(mCarDeviceProvisionedController.isCurrentUserFullySetup()).thenReturn(true);
-
-        mOverlayPanelViewController.animateExpandPanel();
-
-        assertThat(mOverlayPanelViewController.isPanelVisible()).isTrue();
-    }
-
-    @Test
-    public void animateExpandPanel_setsPanelExpanded() {
-        mOverlayPanelViewController.inflate(mBaseLayout);
-        mOverlayPanelViewController.setShouldAnimateExpandPanel(true);
-        when(mCarDeviceProvisionedController.isCurrentUserFullySetup()).thenReturn(true);
-
-        mOverlayPanelViewController.animateExpandPanel();
-
-        assertThat(mOverlayPanelViewController.isPanelExpanded()).isTrue();
-    }
-
-    @Test
-    public void setPanelVisible_setTrue_windowNotVisible_setsWindowVisible() {
-        mOverlayPanelViewController.inflate(mBaseLayout);
-        when(mOverlayViewGlobalStateController.isWindowVisible()).thenReturn(false);
-
-        mOverlayPanelViewController.setPanelVisible(true);
-
-        verify(mOverlayViewGlobalStateController).setWindowVisible(true);
-    }
-
-    @Test
-    public void setPanelVisible_setTrue_windowVisible_doesNotSetWindowVisible() {
-        mOverlayPanelViewController.inflate(mBaseLayout);
-        when(mOverlayViewGlobalStateController.isWindowVisible()).thenReturn(true);
-
-        mOverlayPanelViewController.setPanelVisible(true);
-
-        verify(mOverlayViewGlobalStateController, never()).setWindowVisible(true);
-    }
-
-    @Test
-    public void setPanelVisible_setTrue_setLayoutVisible() {
-        mOverlayPanelViewController.inflate(mBaseLayout);
-        mOverlayPanelViewController.getLayout().setVisibility(View.INVISIBLE);
-
-        mOverlayPanelViewController.setPanelVisible(true);
-
-        assertThat(mOverlayPanelViewController.getLayout().getVisibility()).isEqualTo(View.VISIBLE);
-    }
-
-    @Test
-    public void setPanelVisible_setTrue_setWindowFocusable() {
-        mOverlayPanelViewController.inflate(mBaseLayout);
-        mOverlayPanelViewController.setPanelVisible(true);
-
-        verify(mOverlayViewGlobalStateController).setWindowFocusable(true);
-    }
-
-    @Test
-    public void setPanelVisible_setFalse_windowVisible_setsWindowNotVisible() {
-        mOverlayPanelViewController.inflate(mBaseLayout);
-        when(mOverlayViewGlobalStateController.isWindowVisible()).thenReturn(true);
-
-        mOverlayPanelViewController.setPanelVisible(false);
-
-        verify(mOverlayViewGlobalStateController).setWindowVisible(false);
-    }
-
-    @Test
-    public void setPanelVisible_setFalse_windowNotVisible_doesNotSetWindowNotVisible() {
-        mOverlayPanelViewController.inflate(mBaseLayout);
-        when(mOverlayViewGlobalStateController.isWindowVisible()).thenReturn(false);
-
-        mOverlayPanelViewController.setPanelVisible(false);
-
-        verify(mOverlayViewGlobalStateController, never()).setWindowVisible(false);
-    }
-
-    @Test
-    public void setPanelVisible_setFalse_setLayoutInvisible() {
-        mOverlayPanelViewController.inflate(mBaseLayout);
-        mOverlayPanelViewController.getLayout().setVisibility(View.VISIBLE);
-
-        mOverlayPanelViewController.setPanelVisible(false);
-
-        assertThat(mOverlayPanelViewController.getLayout().getVisibility()).isEqualTo(
-                View.INVISIBLE);
-    }
-
-    @Test
-    public void setPanelVisible_setFalse_setWindowNotFocusable() {
-        mOverlayPanelViewController.inflate(mBaseLayout);
-
-        mOverlayPanelViewController.setPanelVisible(false);
-
-        verify(mOverlayViewGlobalStateController).setWindowFocusable(false);
-    }
-
-    @Test
-    public void dragOpenTouchListener_isNotInflated_inflatesView() {
-        when(mCarDeviceProvisionedController.isCurrentUserFullySetup()).thenReturn(true);
-        assertThat(mOverlayPanelViewController.isInflated()).isFalse();
-
-        mOverlayPanelViewController.getDragOpenTouchListener().onTouch(/* v= */ null,
-                MotionEvent.obtain(/* downTime= */ 200, /* eventTime= */ 300,
-                        MotionEvent.ACTION_MOVE, /* x= */ 0, /* y= */ 0, /* metaState= */ 0));
-
-        verify(mOverlayViewGlobalStateController).inflateView(mOverlayPanelViewController);
-    }
-
-    private static class TestOverlayPanelViewController extends OverlayPanelViewController {
-
-        private boolean mShouldAnimateCollapsePanel;
-        private boolean mShouldAnimateExpandPanel;
-        private boolean mShouldAllowClosingScroll;
-
-        boolean mOnAnimateCollapsePanelCalled;
-        boolean mAnimateCollapsePanelCalled;
-        boolean mOnAnimateExpandPanelCalled;
-        boolean mAnimateExpandPanelCalled;
-        boolean mOnCollapseAnimationEndCalled;
-        boolean mOnExpandAnimationEndCalled;
-        boolean mOnOpenScrollStartEnd;
-        List<Integer> mOnScrollHeights;
-
-        TestOverlayPanelViewController(
-                Context context,
-                Resources resources,
-                int stubId,
-                OverlayViewGlobalStateController overlayViewGlobalStateController,
-                FlingAnimationUtils.Builder flingAnimationUtilsBuilder,
-                CarDeviceProvisionedController carDeviceProvisionedController) {
-            super(context, resources, stubId, overlayViewGlobalStateController,
-                    flingAnimationUtilsBuilder,
-                    carDeviceProvisionedController);
-
-            mOnScrollHeights = new ArrayList<>();
-        }
-
-        public void setShouldAnimateCollapsePanel(boolean shouldAnimate) {
-            mShouldAnimateCollapsePanel = shouldAnimate;
-        }
-
-        @Override
-        protected boolean shouldAnimateCollapsePanel() {
-            return mShouldAnimateCollapsePanel;
-        }
-
-        @Override
-        protected void animateCollapsePanel() {
-            super.animateCollapsePanel();
-            mAnimateCollapsePanelCalled = true;
-        }
-
-        @Override
-        protected void onAnimateCollapsePanel() {
-            mOnAnimateCollapsePanelCalled = true;
-        }
-
-        public void setShouldAnimateExpandPanel(boolean shouldAnimate) {
-            mShouldAnimateExpandPanel = shouldAnimate;
-        }
-
-        @Override
-        protected boolean shouldAnimateExpandPanel() {
-            return mShouldAnimateExpandPanel;
-        }
-
-        @Override
-        protected void animateExpandPanel() {
-            super.animateExpandPanel();
-            mAnimateExpandPanelCalled = true;
-        }
-
-        @Override
-        protected void onAnimateExpandPanel() {
-            mOnAnimateExpandPanelCalled = true;
-        }
-
-        @Override
-        protected void onCollapseAnimationEnd() {
-            mOnCollapseAnimationEndCalled = true;
-        }
-
-        @Override
-        protected void onExpandAnimationEnd() {
-            mOnExpandAnimationEndCalled = true;
-        }
-
-        @Override
-        protected void onScroll(int height) {
-            mOnScrollHeights.add(height);
-        }
-
-        @Override
-        protected void onOpenScrollStart() {
-            mOnOpenScrollStartEnd = true;
-        }
-
-        public void setShouldAllowClosingScroll(boolean shouldAllow) {
-            mShouldAllowClosingScroll = shouldAllow;
-        }
-
-        @Override
-        protected boolean shouldAllowClosingScroll() {
-            return mShouldAllowClosingScroll;
-        }
-    }
-}
diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/window/OverlayViewControllerTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/window/OverlayViewControllerTest.java
deleted file mode 100644
index 3313261..0000000
--- a/packages/CarSystemUI/tests/src/com/android/systemui/window/OverlayViewControllerTest.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.window;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.verify;
-
-import android.testing.AndroidTestingRunner;
-import android.testing.TestableLooper;
-import android.view.LayoutInflater;
-import android.view.ViewGroup;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.tests.R;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Captor;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-@RunWith(AndroidTestingRunner.class)
[email protected]
-@SmallTest
-public class OverlayViewControllerTest extends SysuiTestCase {
-    private TestOverlayViewController mOverlayViewController;
-    private ViewGroup mBaseLayout;
-
-    @Mock
-    private OverlayViewGlobalStateController mOverlayViewGlobalStateController;
-
-    @Captor
-    private ArgumentCaptor<Runnable> mRunnableArgumentCaptor;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(/* testClass= */ this);
-
-        mOverlayViewController = new TestOverlayViewController(R.id.overlay_view_controller_stub,
-                mOverlayViewGlobalStateController);
-
-        mBaseLayout = (ViewGroup) LayoutInflater.from(mContext).inflate(
-                R.layout.overlay_view_controller_test, /* root= */ null);
-    }
-
-    @Test
-    public void inflate_layoutInitialized() {
-        mOverlayViewController.inflate(mBaseLayout);
-
-        assertThat(mOverlayViewController.getLayout().getId()).isEqualTo(
-                R.id.overlay_view_controller_test);
-    }
-
-    @Test
-    public void inflate_onFinishInflateCalled() {
-        mOverlayViewController.inflate(mBaseLayout);
-
-        assertThat(mOverlayViewController.mOnFinishInflateCalled).isTrue();
-    }
-
-    @Test
-    public void start_viewInflated_viewShown() {
-        mOverlayViewController.inflate(mBaseLayout);
-
-        mOverlayViewController.start();
-
-        verify(mOverlayViewGlobalStateController).showView(eq(mOverlayViewController),
-                mRunnableArgumentCaptor.capture());
-
-        mRunnableArgumentCaptor.getValue().run();
-
-        assertThat(mOverlayViewController.mShowInternalCalled).isTrue();
-    }
-
-    @Test
-    public void stop_viewInflated_viewHidden() {
-        mOverlayViewController.inflate(mBaseLayout);
-
-        mOverlayViewController.stop();
-
-        verify(mOverlayViewGlobalStateController).hideView(eq(mOverlayViewController),
-                mRunnableArgumentCaptor.capture());
-
-        mRunnableArgumentCaptor.getValue().run();
-
-        assertThat(mOverlayViewController.mHideInternalCalled).isTrue();
-    }
-
-    @Test
-    public void start_viewNotInflated_viewNotShown() {
-        mOverlayViewController.start();
-
-        verify(mOverlayViewGlobalStateController).showView(eq(mOverlayViewController),
-                mRunnableArgumentCaptor.capture());
-
-        mRunnableArgumentCaptor.getValue().run();
-
-        assertThat(mOverlayViewController.mShowInternalCalled).isFalse();
-    }
-
-    @Test
-    public void stop_viewNotInflated_viewNotHidden() {
-        mOverlayViewController.stop();
-
-        verify(mOverlayViewGlobalStateController).hideView(eq(mOverlayViewController),
-                mRunnableArgumentCaptor.capture());
-
-        mRunnableArgumentCaptor.getValue().run();
-
-        assertThat(mOverlayViewController.mHideInternalCalled).isFalse();
-    }
-
-    private static class TestOverlayViewController extends OverlayViewController {
-        boolean mOnFinishInflateCalled = false;
-        boolean mShowInternalCalled = false;
-        boolean mHideInternalCalled = false;
-
-        TestOverlayViewController(int stubId,
-                OverlayViewGlobalStateController overlayViewGlobalStateController) {
-            super(stubId, overlayViewGlobalStateController);
-        }
-
-        @Override
-        protected void onFinishInflate() {
-            mOnFinishInflateCalled = true;
-        }
-
-        @Override
-        protected void showInternal() {
-            mShowInternalCalled = true;
-        }
-
-        @Override
-        protected void hideInternal() {
-            mHideInternalCalled = true;
-        }
-    }
-}
diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/window/OverlayViewGlobalStateControllerTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/window/OverlayViewGlobalStateControllerTest.java
deleted file mode 100644
index a96b906..0000000
--- a/packages/CarSystemUI/tests/src/com/android/systemui/window/OverlayViewGlobalStateControllerTest.java
+++ /dev/null
@@ -1,268 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.window;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.testing.AndroidTestingRunner;
-import android.testing.TestableLooper;
-import android.view.ViewGroup;
-import android.widget.FrameLayout;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.navigationbar.car.CarNavigationBarController;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-@RunWith(AndroidTestingRunner.class)
[email protected]
-@SmallTest
-public class OverlayViewGlobalStateControllerTest extends SysuiTestCase {
-    private static final String MOCK_OVERLAY_VIEW_CONTROLLER_NAME = "OverlayViewController";
-
-    private OverlayViewGlobalStateController mOverlayViewGlobalStateController;
-    private ViewGroup mBaseLayout;
-
-    @Mock
-    private CarNavigationBarController mCarNavigationBarController;
-    @Mock
-    private SystemUIOverlayWindowController mSystemUIOverlayWindowController;
-    @Mock
-    private OverlayViewMediator mOverlayViewMediator;
-    @Mock
-    private OverlayViewController mOverlayViewController;
-    @Mock
-    private Runnable mRunnable;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(/* testClass= */ this);
-
-        mOverlayViewGlobalStateController = new OverlayViewGlobalStateController(
-                mCarNavigationBarController, mSystemUIOverlayWindowController);
-
-        verify(mSystemUIOverlayWindowController).attach();
-
-        mBaseLayout = new FrameLayout(mContext);
-
-        when(mSystemUIOverlayWindowController.getBaseLayout()).thenReturn(mBaseLayout);
-    }
-
-    @Test
-    public void registerMediator_overlayViewMediatorListenersRegistered() {
-        mOverlayViewGlobalStateController.registerMediator(mOverlayViewMediator);
-
-        verify(mOverlayViewMediator).registerListeners();
-    }
-
-    @Test
-    public void registerMediator_overlayViewMediatorViewControllerSetup() {
-        mOverlayViewGlobalStateController.registerMediator(mOverlayViewMediator);
-
-        verify(mOverlayViewMediator).setupOverlayContentViewControllers();
-    }
-
-    @Test
-    public void showView_nothingAlreadyShown_navigationBarsHidden() {
-        mOverlayViewGlobalStateController.showView(mOverlayViewController, mRunnable);
-
-        verify(mCarNavigationBarController).hideBars();
-    }
-
-    @Test
-    public void showView_nothingAlreadyShown_windowIsExpanded() {
-        mOverlayViewGlobalStateController.showView(mOverlayViewController, mRunnable);
-
-        verify(mSystemUIOverlayWindowController).setWindowVisible(true);
-    }
-
-    @Test
-    public void showView_somethingAlreadyShown_navigationBarsHidden() {
-        mOverlayViewGlobalStateController.mShownSet.add(MOCK_OVERLAY_VIEW_CONTROLLER_NAME);
-
-        mOverlayViewGlobalStateController.showView(mOverlayViewController, mRunnable);
-
-        verify(mCarNavigationBarController, never()).hideBars();
-    }
-
-    @Test
-    public void showView_somethingAlreadyShown_windowIsExpanded() {
-        mOverlayViewGlobalStateController.mShownSet.add(MOCK_OVERLAY_VIEW_CONTROLLER_NAME);
-
-        mOverlayViewGlobalStateController.showView(mOverlayViewController, mRunnable);
-
-        verify(mSystemUIOverlayWindowController, never()).setWindowVisible(true);
-    }
-
-    @Test
-    public void showView_viewControllerNotInflated_inflateViewController() {
-        when(mOverlayViewController.isInflated()).thenReturn(false);
-
-        mOverlayViewGlobalStateController.showView(mOverlayViewController, mRunnable);
-
-        verify(mOverlayViewController).inflate(mBaseLayout);
-    }
-
-    @Test
-    public void showView_viewControllerInflated_inflateViewControllerNotCalled() {
-        when(mOverlayViewController.isInflated()).thenReturn(true);
-
-        mOverlayViewGlobalStateController.showView(mOverlayViewController, mRunnable);
-
-        verify(mOverlayViewController, never()).inflate(mBaseLayout);
-    }
-
-    @Test
-    public void showView_showRunnableCalled() {
-        mOverlayViewGlobalStateController.showView(mOverlayViewController, mRunnable);
-
-        verify(mRunnable).run();
-    }
-
-    @Test
-    public void showView_overlayViewControllerAddedToShownSet() {
-        mOverlayViewGlobalStateController.showView(mOverlayViewController, mRunnable);
-
-        assertThat(mOverlayViewGlobalStateController.mShownSet.contains(
-                mOverlayViewController.getClass().getName())).isTrue();
-    }
-
-    @Test
-    public void hideView_viewControllerNotInflated_hideRunnableNotCalled() {
-        when(mOverlayViewController.isInflated()).thenReturn(false);
-
-        mOverlayViewGlobalStateController.hideView(mOverlayViewController, mRunnable);
-
-        verify(mRunnable, never()).run();
-    }
-
-    @Test
-    public void hideView_nothingShown_hideRunnableNotCalled() {
-        when(mOverlayViewController.isInflated()).thenReturn(true);
-        mOverlayViewGlobalStateController.mShownSet.clear();
-
-        mOverlayViewGlobalStateController.hideView(mOverlayViewController, mRunnable);
-
-        verify(mRunnable, never()).run();
-    }
-
-    @Test
-    public void hideView_viewControllerNotShown_hideRunnableNotCalled() {
-        when(mOverlayViewController.isInflated()).thenReturn(true);
-        mOverlayViewGlobalStateController.mShownSet.add(MOCK_OVERLAY_VIEW_CONTROLLER_NAME);
-
-        mOverlayViewGlobalStateController.hideView(mOverlayViewController, mRunnable);
-
-        verify(mRunnable, never()).run();
-    }
-
-    @Test
-    public void hideView_viewControllerShown_hideRunnableCalled() {
-        when(mOverlayViewController.isInflated()).thenReturn(true);
-        mOverlayViewGlobalStateController.mShownSet.add(
-                mOverlayViewController.getClass().getName());
-
-        mOverlayViewGlobalStateController.hideView(mOverlayViewController, mRunnable);
-
-        verify(mRunnable).run();
-    }
-
-    @Test
-    public void hideView_viewControllerOnlyShown_nothingShown() {
-        when(mOverlayViewController.isInflated()).thenReturn(true);
-        mOverlayViewGlobalStateController.mShownSet.add(
-                mOverlayViewController.getClass().getName());
-
-        mOverlayViewGlobalStateController.hideView(mOverlayViewController, mRunnable);
-
-        assertThat(mOverlayViewGlobalStateController.mShownSet.isEmpty()).isTrue();
-    }
-
-    @Test
-    public void hideView_viewControllerNotOnlyShown_navigationBarNotShown() {
-        when(mOverlayViewController.isInflated()).thenReturn(true);
-        mOverlayViewGlobalStateController.mShownSet.add(
-                mOverlayViewController.getClass().getName());
-        mOverlayViewGlobalStateController.mShownSet.add(MOCK_OVERLAY_VIEW_CONTROLLER_NAME);
-
-        mOverlayViewGlobalStateController.hideView(mOverlayViewController, mRunnable);
-
-        verify(mCarNavigationBarController, never()).showBars();
-    }
-
-    @Test
-    public void hideView_viewControllerNotOnlyShown_windowNotCollapsed() {
-        when(mOverlayViewController.isInflated()).thenReturn(true);
-        mOverlayViewGlobalStateController.mShownSet.add(
-                mOverlayViewController.getClass().getName());
-        mOverlayViewGlobalStateController.mShownSet.add(MOCK_OVERLAY_VIEW_CONTROLLER_NAME);
-
-        mOverlayViewGlobalStateController.hideView(mOverlayViewController, mRunnable);
-
-        verify(mSystemUIOverlayWindowController, never()).setWindowVisible(false);
-    }
-
-    @Test
-    public void hideView_viewControllerOnlyShown_navigationBarShown() {
-        when(mOverlayViewController.isInflated()).thenReturn(true);
-        mOverlayViewGlobalStateController.mShownSet.add(
-                mOverlayViewController.getClass().getName());
-
-        mOverlayViewGlobalStateController.hideView(mOverlayViewController, mRunnable);
-
-        verify(mCarNavigationBarController).showBars();
-    }
-
-    @Test
-    public void hideView_viewControllerOnlyShown_windowCollapsed() {
-        when(mOverlayViewController.isInflated()).thenReturn(true);
-        mOverlayViewGlobalStateController.mShownSet.add(
-                mOverlayViewController.getClass().getName());
-
-        mOverlayViewGlobalStateController.hideView(mOverlayViewController, mRunnable);
-
-        verify(mSystemUIOverlayWindowController).setWindowVisible(false);
-    }
-
-    @Test
-    public void inflateView_notInflated_inflates() {
-        when(mOverlayViewController.isInflated()).thenReturn(false);
-
-        mOverlayViewGlobalStateController.inflateView(mOverlayViewController);
-
-        verify(mOverlayViewController).inflate(mBaseLayout);
-    }
-
-    @Test
-    public void inflateView_alreadyInflated_doesNotInflate() {
-        when(mOverlayViewController.isInflated()).thenReturn(true);
-
-        mOverlayViewGlobalStateController.inflateView(mOverlayViewController);
-
-        verify(mOverlayViewController, never()).inflate(mBaseLayout);
-    }
-}
diff --git a/packages/CtsShim/apk/arm/CtsShim.apk b/packages/CtsShim/apk/arm/CtsShim.apk
index 7d9f8e3..7bdb2a8 100644
--- a/packages/CtsShim/apk/arm/CtsShim.apk
+++ b/packages/CtsShim/apk/arm/CtsShim.apk
Binary files differ
diff --git a/packages/CtsShim/apk/arm/CtsShimPriv.apk b/packages/CtsShim/apk/arm/CtsShimPriv.apk
index dcccada..8efd3b2 100644
--- a/packages/CtsShim/apk/arm/CtsShimPriv.apk
+++ b/packages/CtsShim/apk/arm/CtsShimPriv.apk
Binary files differ
diff --git a/packages/CtsShim/apk/x86/CtsShim.apk b/packages/CtsShim/apk/x86/CtsShim.apk
index 7d9f8e3..7bdb2a8 100644
--- a/packages/CtsShim/apk/x86/CtsShim.apk
+++ b/packages/CtsShim/apk/x86/CtsShim.apk
Binary files differ
diff --git a/packages/CtsShim/apk/x86/CtsShimPriv.apk b/packages/CtsShim/apk/x86/CtsShimPriv.apk
index 3501fa4..eed29d1 100644
--- a/packages/CtsShim/apk/x86/CtsShimPriv.apk
+++ b/packages/CtsShim/apk/x86/CtsShimPriv.apk
Binary files differ
diff --git a/packages/CtsShim/build/Android.bp b/packages/CtsShim/build/Android.bp
index 587109d..be79010 100644
--- a/packages/CtsShim/build/Android.bp
+++ b/packages/CtsShim/build/Android.bp
@@ -69,6 +69,15 @@
     // Explicitly uncompress native libs rather than letting the build system doing it and destroy the
     // v2/v3 signature.
     use_embedded_native_libs: true,
+    apex_available: [
+        "//apex_available:platform",
+        "com.android.apex.cts.shim.v1",
+        "com.android.apex.cts.shim.v2",
+        "com.android.apex.cts.shim.v2_no_hashtree",
+        "com.android.apex.cts.shim.v2_legacy",
+        "com.android.apex.cts.shim.v2_sdk_target_p",
+        "com.android.apex.cts.shim.v3",
+    ],
 }
 
 //##########################################################
@@ -110,7 +119,11 @@
     dex_preopt: {
         enabled: false,
     },
-    manifest: "shim/AndroidManifestTargetPSdk.xml"
+    manifest: "shim/AndroidManifestTargetPSdk.xml",
+    apex_available: [
+        "//apex_available:platform",
+        "com.android.apex.cts.shim.v2_apk_in_apex_sdk_target_p",
+    ],
 }
 
 //##########################################################
@@ -128,4 +141,13 @@
     },
 
     manifest: "shim/AndroidManifest.xml",
+    apex_available: [
+        "//apex_available:platform",
+        "com.android.apex.cts.shim.v1",
+        "com.android.apex.cts.shim.v2",
+        "com.android.apex.cts.shim.v2_no_hashtree",
+        "com.android.apex.cts.shim.v2_legacy",
+        "com.android.apex.cts.shim.v2_sdk_target_p",
+        "com.android.apex.cts.shim.v3",
+    ],
 }
diff --git a/packages/CtsShim/build/jni/Android.bp b/packages/CtsShim/build/jni/Android.bp
index ea15b43..7a5b07e 100644
--- a/packages/CtsShim/build/jni/Android.bp
+++ b/packages/CtsShim/build/jni/Android.bp
@@ -18,4 +18,13 @@
     name: "libshim_jni",
     srcs: ["Shim.c"],
     sdk_version: "24",
+    apex_available: [
+        "//apex_available:platform",
+        "com.android.apex.cts.shim.v1",
+        "com.android.apex.cts.shim.v2",
+        "com.android.apex.cts.shim.v2_no_hashtree",
+        "com.android.apex.cts.shim.v2_legacy",
+        "com.android.apex.cts.shim.v2_sdk_target_p",
+        "com.android.apex.cts.shim.v3",
+    ],
 }
diff --git a/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java b/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java
index 617305c..f1ec606 100644
--- a/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java
+++ b/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java
@@ -433,7 +433,7 @@
         final int splitIndex = docId.indexOf(':', 1);
         final String path = docId.substring(splitIndex + 1);
 
-        File target = visible ? root.visiblePath : root.path;
+        File target = root.visiblePath != null ? root.visiblePath : root.path;
         if (target == null) {
             return null;
         }
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/InstallStart.java b/packages/PackageInstaller/src/com/android/packageinstaller/InstallStart.java
index c11e1a0..6fbee16 100644
--- a/packages/PackageInstaller/src/com/android/packageinstaller/InstallStart.java
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/InstallStart.java
@@ -30,13 +30,17 @@
 import android.content.pm.PackageInstaller;
 import android.content.pm.PackageManager;
 import android.content.pm.ProviderInfo;
+import android.content.pm.UserInfo;
 import android.net.Uri;
 import android.os.Build;
 import android.os.Bundle;
 import android.os.RemoteException;
+import android.os.UserManager;
 import android.permission.IPermissionManager;
 import android.util.Log;
 
+import java.util.List;
+
 /**
  * Select which activity is the first visible activity of the installation and forward the intent to
  * it.
@@ -47,6 +51,7 @@
     private static final String DOWNLOADS_AUTHORITY = "downloads";
     private IPackageManager mIPackageManager;
     private IPermissionManager mIPermissionManager;
+    private UserManager mUserManager;
     private boolean mAbortInstall = false;
 
     @Override
@@ -54,6 +59,7 @@
         super.onCreate(savedInstanceState);
         mIPackageManager = AppGlobals.getPackageManager();
         mIPermissionManager = AppGlobals.getPermissionManager();
+        mUserManager = getSystemService(UserManager.class);
         Intent intent = getIntent();
         String callingPackage = getCallingPackage();
 
@@ -144,13 +150,16 @@
             if (packages == null) {
                 return false;
             }
+            final List<UserInfo> users = mUserManager.getUsers();
             for (String packageName : packages) {
-                try {
-                    if (uid == getPackageManager().getPackageUid(packageName, 0)) {
-                        return true;
+                for (UserInfo user : users) {
+                    try {
+                        if (uid == getPackageManager().getPackageUidAsUser(packageName, user.id)) {
+                            return true;
+                        }
+                    } catch (PackageManager.NameNotFoundException e) {
+                        // Ignore and try the next package
                     }
-                } catch (PackageManager.NameNotFoundException e) {
-                    // Ignore and try the next package
                 }
             }
         } catch (RemoteException rexc) {
diff --git a/packages/SettingsLib/RestrictedLockUtils/res/values-or/strings.xml b/packages/SettingsLib/RestrictedLockUtils/res/values-or/strings.xml
index 6b1f259..1d23c31 100644
--- a/packages/SettingsLib/RestrictedLockUtils/res/values-or/strings.xml
+++ b/packages/SettingsLib/RestrictedLockUtils/res/values-or/strings.xml
@@ -17,6 +17,6 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="enabled_by_admin" msgid="6630472777476410137">"ବ୍ୟବସ୍ଥାପକଙ୍କ ଦ୍ୱାରା ସକ୍ଷମ କରାଯାଇଛି"</string>
+    <string name="enabled_by_admin" msgid="6630472777476410137">"ଆଡମିନଙ୍କ ଦ୍ୱାରା ସକ୍ଷମ କରାଯାଇଛି"</string>
     <string name="disabled_by_admin" msgid="4023569940620832713">"ବ୍ୟବସ୍ଥାପକଙ୍କ ଦ୍ଵାରା ଅକ୍ଷମ କରାଯାଇଛି"</string>
 </resources>
diff --git a/packages/SettingsLib/RestrictedLockUtils/src/com/android/settingslib/RestrictedLockUtils.java b/packages/SettingsLib/RestrictedLockUtils/src/com/android/settingslib/RestrictedLockUtils.java
index fa2ec55..a77e34b 100644
--- a/packages/SettingsLib/RestrictedLockUtils/src/com/android/settingslib/RestrictedLockUtils.java
+++ b/packages/SettingsLib/RestrictedLockUtils/src/com/android/settingslib/RestrictedLockUtils.java
@@ -147,6 +147,28 @@
         public EnforcedAdmin() {
         }
 
+        /**
+         * Combines two {@link EnforcedAdmin} into one: if one of them is null, then just return
+         * the other. If both of them are the same, then return that. Otherwise return the symbolic
+         * {@link #MULTIPLE_ENFORCED_ADMIN}
+         */
+        public static EnforcedAdmin combine(EnforcedAdmin admin1, EnforcedAdmin admin2) {
+            if (admin1 == null) {
+                return admin2;
+            }
+            if (admin2 == null) {
+                return admin1;
+            }
+            if (admin1.equals(admin2)) {
+                return admin1;
+            }
+            if (!admin1.enforcedRestriction.equals(admin2.enforcedRestriction)) {
+                throw new IllegalArgumentException(
+                        "Admins with different restriction cannot be combined");
+            }
+            return MULTIPLE_ENFORCED_ADMIN;
+        }
+
         @Override
         public boolean equals(Object o) {
             if (this == o) return true;
diff --git a/packages/SettingsLib/SearchWidget/res/values-be/strings.xml b/packages/SettingsLib/SearchWidget/res/values-be/strings.xml
index 4fc722f..c72f819 100644
--- a/packages/SettingsLib/SearchWidget/res/values-be/strings.xml
+++ b/packages/SettingsLib/SearchWidget/res/values-be/strings.xml
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="search_menu" msgid="1914043873178389845">"Налады пошуку"</string>
+    <string name="search_menu" msgid="1914043873178389845">"Пошук налад"</string>
 </resources>
diff --git a/packages/SettingsLib/SearchWidget/res/values-pa/strings.xml b/packages/SettingsLib/SearchWidget/res/values-pa/strings.xml
index 8c7dd6f..09a285b 100644
--- a/packages/SettingsLib/SearchWidget/res/values-pa/strings.xml
+++ b/packages/SettingsLib/SearchWidget/res/values-pa/strings.xml
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="search_menu" msgid="1914043873178389845">"ਖੋਜ ਸੈਟਿੰਗਾਂ"</string>
+    <string name="search_menu" msgid="1914043873178389845">"ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਖੋਜੋ"</string>
 </resources>
diff --git a/packages/SettingsLib/res/values-af/strings.xml b/packages/SettingsLib/res/values-af/strings.xml
index a5bac27..1eef0b7 100644
--- a/packages/SettingsLib/res/values-af/strings.xml
+++ b/packages/SettingsLib/res/values-af/strings.xml
@@ -212,7 +212,7 @@
     <string name="adb_wireless_settings" msgid="2295017847215680229">"Draadlose ontfouting"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Skakel draadlose ontfouting aan om beskikbare toestelle te sien en te gebruik"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Gebruik QR-kode om toestel saam te bind"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"Gebruik QR-kodeskandeerder om nuwe toestelle saam te bind"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"Gebruik QR-kodeskandeerder om nuwe toestelle saam te bind"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Gebruik saambindkode om toestel saam te bind"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Gebruik \'n sessyferkode om nuwe toestelle saam te bind"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"Saamgebinde toestelle"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Kon nie die toestel saambind nie. Óf die QR-kode is verkeerd, óf die toestel is nie aan dieselfde netwerk gekoppel nie."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"IP-adres en -poort"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"Skandeer QR-kode"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"Bind toestel oor Wi-Fi saam deur \'n QR-kode te skandeer"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Bind toestel oor Wi-Fi saam deur \'n QR-kode te skandeer"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Koppel asseblief aan \'n Wi-Fi-netwerk"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, debug, dev"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"Kortpad na foutverslag"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"Draadlose skermsertifisering"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"Aktiveer Wi-Fi-woordryke aanmelding"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"Regulering van Wi-Fi-opsporing"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"Wi‑Fi‑verbeterde MAC-verewekansiging"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"Mobiele data is altyd aktief"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"Hardewareversnelling vir verbinding"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Wys Bluetooth-toestelle sonder name"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Wys opsies vir draadlose skermsertifisering"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Verhoog Wi-Fi-aantekeningvlak, wys per SSID RSSI in Wi‑Fi-kieser"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Verlaag batteryverbruik en verbeter netwerk se werkverrigting"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Hierdie skakelaar beïnvloed MAC-verewekansiginggedrag net vir klantmodus.\nWanneer hierdie modus geaktiveer is, kan enige netwerke waarvoor MAC-verewekansiging geaktiveer is, se MAC-adresse tydens die assosiasie weer verewigkansig word, na gelang van wanneer die klant laas van die netwerk ontkoppel het. Herverewekansiging vind nie plaas as die toestel binne 4 uur of korter herkoppel nie."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"Beperk"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"Onbeperk"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"Loggerbuffer se groottes"</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"Wys Program Reageer Nie-dialoog vir agtergrondprogramme"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Wys kennisgewingkanaalwaarskuwings"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Wys waarskuwing op skerm wanneer \'n program \'n kennisgewing sonder \'n geldige kanaal plaas"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Dwing kortpaaie vir gesprekkennisgewings af"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Kennisgewings moet deur \'n langleef-delingkortpad gerugsteun word om in gesprekafdeling te kan verskyn"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"Dwing toelating op eksterne berging"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Maak dat enige program na eksterne berging geskryf kan word, ongeag manifeswaardes"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"Dwing aktiwiteite om verstelbaar te wees"</string>
@@ -432,10 +436,14 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"Sal waarskynlik hou tot omtrent <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"Tot <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Battery kan teen <xliff:g id="TIME">%1$s</xliff:g> afloop"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"Minder as <xliff:g id="THRESHOLD">%1$s</xliff:g> oor"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"Minder as <xliff:g id="THRESHOLD">%1$s</xliff:g> oor (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"Meer as <xliff:g id="TIME_REMAINING">%1$s</xliff:g> oor (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"Meer as <xliff:g id="TIME_REMAINING">%1$s</xliff:g> oor"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"Foon sal dalk binnekort afgaan"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"Tablet sal dalk binnekort afgaan"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"Toestel sal dalk binnekort afgaan"</string>
diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml
index 126efcc..f8dcb3a 100644
--- a/packages/SettingsLib/res/values-am/strings.xml
+++ b/packages/SettingsLib/res/values-am/strings.xml
@@ -212,7 +212,7 @@
     <string name="adb_wireless_settings" msgid="2295017847215680229">"ገመድ-አልባ debugging"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"የሚገኙ መሣሪያዎችን ለመመልከትና ለመጠቀም ገመድ-አልባ debuggingን ያብሩ"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"የQR ኮድን በመጠቀም መሣሪያን ያጣምሩ"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"የQR ኮድ መቃኛን በመጠቀም አዲስ መሣሪያዎችን ያጣምሩ"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"የQR ኮድ መቃኛን በመጠቀም አዲስ መሣሪያዎችን ያጣምሩ"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"የማጣመሪያ ኮድን በመጠቀም መሣሪያን ያጣምሩ"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"የስድስት አኃዝ ኮድ በመጠቀም አዲስ መሣሪያዎችን ያጣምሩ"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"የተጣመሩ መሣሪያዎች"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"መሣሪያውን ማጣመር አልተሳካም። ወይም QR ኮዱ ትክክል አልነበረም፣ ወይም መሣሪያው ከተመሳሳዩ አውታረ መረብ ጋር አልተገናኘም።"</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"የአይፒ አድራሻ እና ወደብ"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"QR ኮድን ይቃኙ"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"የQR ኮድ በመጠቀም መሣሪያን በመቃኘት በWi-Fi ላይ ያጣምሩ"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"የQR ኮድ በመጠቀም መሣሪያን በመቃኘት በWi-Fi ላይ ያጣምሩ"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"እባክዎ ከWi-Fi አውታረ መረብ ጋር ያገናኙ"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb፣ ማረም፣ ግንባታ"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"የሳንካ ሪፖርት አቋራጭ"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"የገመድ አልባ ማሳያ እውቅና ማረጋገጫ"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"የWi‑Fi ተጨማሪ ቃላት ምዝግብ ማስታወሻ መያዝ"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"Wi‑Fi scan throttling"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"Wi‑Fi‑የተሻሻለ የማክ ዘፈቀደ ማድረጊያ"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"የተንቀሳቃሽ ስልክ ውሂብ ሁልጊዜ ገቢር ነው"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"የሃርድዌር ማቀላጠፊያን በማስተሳሰር ላይ"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"የብሉቱዝ መሣሪያዎችን ያለ ስሞች አሳይ"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"የገመድ አልባ ማሳያ እውቅና ማረጋገጫ አማራጮችን አሳይ"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"የWi‑Fi ምዝግብ ማስታወሻ አያያዝ ደረጃ ጨምር፣ በWi‑Fi መምረጫ ውስጥ በአንድ SSID RSSI አሳይ"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"የባትሪ መላሸቅን ይቀንሳል እንዲሁም የአውታረ መረብ አፈጻጸም ብቃትን ያሻሽላል"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"ይህ ማብሪያ/ማጥፊያ የማክ ዘፈቀደ ማድረጊያ ባህሪ ላይ ተጽዕኖ የሚያሳርፈው ለደንበኛ ሁነታ ብቻ ነው።\nይህ ሁነታ ገቢር ሲደረግ የማክ ዘፈቀደ ማድረጊያ የነቃላቸው ማናቸውም አውታረ መረቦች ደንበኛው ከአውታረ መረቡ ጋር የተላቀቀበት መጨረሻ ጊዜ ላይ የሚወሰን ሆኖ በጉድኝቱ ጊዜ የማክ አድራሻዎቻቸው የዘፈቀደ ተደርጎ ሊሆን ይችላል። መሣሪያው በ4 ሰዓቶች ወይም ከዚያ ባነሰ ጊዜ ውስጥ ዳግም ከተገናኘ ዳግም የዘፈቀደ አይደረግም።"</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"የሚለካ"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"ያልተለካ"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"የምዝግብ ማስታወሻ ያዥ መጠኖች"</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"ለጀርባ መተግበሪያዎች የመተግበሪያ ምላሽ አይሰጥም መገናኛን አሳይ"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"የማሳወቂያ ሰርጥ ማስጠንቀቂያዎችን አሳይ"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"አንድ መተግበሪያ የሚሰራ ሰርጥ ሳይኖረው ማሳወቂያ ሲለጥፍ በማያ ገጽ-ላይ ማስጠንቀቂያን ያሳያል"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"ለውይይት ማሳወቂያዎች አቋራጮች ተፈጻሚ ያድርጉ"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"በውይይት ክፍል ውስጥ እንዲታይ በረዥም ጊዜ የሚቆይ የማጋራት አቋርጭ እንዲደገፉ ማሳወቂያዎችን ይጠይቁ"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"በውጫዊ ላይ ሃይል ይፈቀዳል"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"የዝርዝር ሰነዶች እሴቶች ግምት ውስጥ ሳያስገባ ማንኛውም መተግበሪያ ወደ ውጫዊ ማከማቻው ለመጻፍ ብቁ ያደርጋል"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"እንቅስቃሴዎች ዳግመኛ እንዲመጣጠኑ አስገድድ"</string>
@@ -432,10 +436,14 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"እስከ <xliff:g id="TIME">%1$s</xliff:g> ገደማ መቆየት አለበት"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"እስከ <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"ባትሪ እስከ <xliff:g id="TIME">%1$s</xliff:g> ድረስ ሊያልቅ ይችላል"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"ከ<xliff:g id="THRESHOLD">%1$s</xliff:g> ያነሰ ይቀራል"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"ከ<xliff:g id="THRESHOLD">%1$s</xliff:g> ያነሰ ይቀራል (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"ከ<xliff:g id="TIME_REMAINING">%1$s</xliff:g> በላይ ይቀራል (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"ከ<xliff:g id="TIME_REMAINING">%1$s</xliff:g> በላይ ይቀራል"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"ስልኩ በቅርቡ ሊዘጋ ይችላል"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"ጡባዊው በቅርቡ ሊዘጋ ይችላል"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"መሣሪያው በቅርቡ ሊዘጋ ይችላል"</string>
diff --git a/packages/SettingsLib/res/values-ar/arrays.xml b/packages/SettingsLib/res/values-ar/arrays.xml
index d65d821..bb97618 100644
--- a/packages/SettingsLib/res/values-ar/arrays.xml
+++ b/packages/SettingsLib/res/values-ar/arrays.xml
@@ -141,13 +141,13 @@
     <item msgid="1241278021345116816">"تحسين جودة الصوت (٩٩٠ كيلوبت في الثانية / ٩٠٩ كيلوبت في الثانية)"</item>
     <item msgid="3523665555859696539">"جودة متوازنة للصوت والاتصال (660 كيلوبت في الثانية/606 كيلوبت في الثانية)"</item>
     <item msgid="886408010459747589">"تحسين جودة الاتصال (٣٣٠ كيلوبت في الثانية / ٣٠٣ كيلوبت في الثانية)"</item>
-    <item msgid="3808414041654351577">"أفضل جهد (معدل سرعة المعلومات التكيُّفي)"</item>
+    <item msgid="3808414041654351577">"أفضل جهد (معدل نقل البيانات التكيُّفي)"</item>
   </string-array>
   <string-array name="bluetooth_a2dp_codec_ldac_playback_quality_summaries">
     <item msgid="804499336721569838">"تحسين جودة الصوت"</item>
     <item msgid="7451422070435297462">"جودة متوازنة للصوت والاتصال"</item>
     <item msgid="6173114545795428901">"تحسين جودة الاتصال"</item>
-    <item msgid="4349908264188040530">"أفضل جهد (معدل سرعة المعلومات التكيُّفي)"</item>
+    <item msgid="4349908264188040530">"أفضل جهد (معدل نقل البيانات التكيُّفي)"</item>
   </string-array>
   <string-array name="bluetooth_audio_active_device_summaries">
     <item msgid="8019740759207729126"></item>
diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml
index 88d4c03..aee5061 100644
--- a/packages/SettingsLib/res/values-ar/strings.xml
+++ b/packages/SettingsLib/res/values-ar/strings.xml
@@ -206,13 +206,13 @@
     <string name="enable_adb" msgid="8072776357237289039">"‏تصحيح أخطاء USB"</string>
     <string name="enable_adb_summary" msgid="3711526030096574316">"‏وضع تصحيح الأخطاء عند توصيل USB"</string>
     <string name="clear_adb_keys" msgid="3010148733140369917">"‏إلغاء عمليات تفويض تصحيح أخطاء USB"</string>
-    <string name="enable_adb_wireless" msgid="6973226350963971018">"‏تصحيح الأخطاء عبر شبكة Wi-Fi"</string>
+    <string name="enable_adb_wireless" msgid="6973226350963971018">"تصحيح الأخطاء اللاسلكي"</string>
     <string name="enable_adb_wireless_summary" msgid="7344391423657093011">"‏وضع تصحيح الأخطاء عندما يتم الاتصال بشبكة Wi‑Fi"</string>
     <string name="adb_wireless_error" msgid="721958772149779856">"خطأ"</string>
-    <string name="adb_wireless_settings" msgid="2295017847215680229">"‏تصحيح الأخطاء عبر شبكة Wi-Fi"</string>
-    <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"لعرض الأجهزة المتاحة واستخدامها، فعِّل ميزة تصحيح الأخطاء لاسلكيًا."</string>
+    <string name="adb_wireless_settings" msgid="2295017847215680229">"تصحيح الأخطاء اللاسلكي"</string>
+    <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"لعرض الأجهزة المتاحة واستخدامها، فعِّل ميزة \"تصحيح الأخطاء اللاسلكي\"."</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"إقران الجهاز باستخدام رمز الاستجابة السريعة"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"إقران الأجهزة الجديدة باستخدام الماسح الضوئي لرموز الاستجابة السريعة"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"إقران الأجهزة الجديدة باستخدام الماسح الضوئي لرموز الاستجابة السريعة"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"إقران الجهاز باستخدام رمز الإقران"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"إقران الأجهزة الجديدة باستخدام رمز مكوّن من 6 أعداد"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"الأجهزة المقترنة"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"تعذّر إقران الجهاز. إما أن رمز الاستجابة السريعة غير صحيح أو أن الجهاز غير متصل بالشبكة نفسها."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"‏عنوان IP والمنفذ"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"المسح الضوئي لرمز الاستجابة السريعة"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"‏إقران الجهاز من خلال شبكة Wi‑Fi عن طريق المسح الضوئي لرمز استجابة سريعة"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"‏إقران الجهاز من خلال شبكة Wi‑Fi عن طريق المسح الضوئي لرمز استجابة سريعة"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"‏يُرجى الاتصال بشبكة Wi-Fi."</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"‏adb، تصحيح الأخطاء، مطور برامج"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"اختصار تقرير الأخطاء"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"شهادة عرض شاشة لاسلكي"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"‏تفعيل تسجيل Wi‑Fi Verbose"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"‏تقييد البحث عن شبكات Wi-Fi"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"‏التوزيع العشوائي لعنوان MAC الذي تدعمه شبكة Wi‑Fi"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"بيانات الجوّال نشطة دائمًا"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"تسريع الأجهزة للتوصيل"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"عرض أجهزة البلوتوث بدون أسماء"</string>
@@ -274,7 +275,7 @@
     <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="7274396574659784285">"‏اختيار برنامج ترميز LDAC\nلصوت مشغّل البلوتوث: جودة التشغيل"</string>
     <string name="bluetooth_select_a2dp_codec_streaming_label" msgid="2040810756832027227">"البث: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
     <string name="select_private_dns_configuration_title" msgid="7887550926056143018">"نظام أسماء النطاقات الخاص"</string>
-    <string name="select_private_dns_configuration_dialog_title" msgid="3731422918335951912">"تحديد وضع \"نظام أسماء النطاقات الخاص\""</string>
+    <string name="select_private_dns_configuration_dialog_title" msgid="3731422918335951912">"اختيار وضع \"نظام أسماء النطاقات الخاص\""</string>
     <string name="private_dns_mode_off" msgid="7065962499349997041">"غير مفعّل"</string>
     <string name="private_dns_mode_opportunistic" msgid="1947864819060442354">"تلقائي"</string>
     <string name="private_dns_mode_provider" msgid="3619040641762557028">"اسم مضيف مزوّد \"نظام أسماء النطاقات الخاص\""</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"عرض خيارات شهادة عرض شاشة لاسلكي"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"‏زيادة مستوى تسجيل Wi-Fi، وعرض لكل SSID RSSI في منتقي Wi-Fi"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"لتقليل استنفاد البطارية وتحسين أداء الشبكة."</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"‏يؤثر مفتاح التبديل هذا في سلوك التوزيع العشوائي لعنوان MAC في وضع العميل فقط.\nعند تفعيل هذا الوضع، قد تتم عشوائيًا إعادة توزيع عناوين MAC أثناء الربط على أي شبكات تم تفعيل ميزة التوزيع العشوائي لعناوين MAC عليها، ويعتمد ذلك على آخر مرة تم فصل العميل فيها من الشبكة. لن تتم إعادة التوزيع العشوائي إذا تمت إعادة اتصال الجهاز خلال 4 ساعات أو أقل."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"تفرض تكلفة استخدام"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"بدون قياس"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"أحجام ذاكرة التخزين المؤقت للتسجيل"</string>
@@ -300,8 +302,8 @@
     <string name="tethering_hardware_offload_summary" msgid="7801345335142803029">"استخدام إعداد تسريع الأجهزة للتوصيل إن كان متاحًا"</string>
     <string name="adb_warning_title" msgid="7708653449506485728">"‏هل تريد السماح بتصحيح أخطاء USB؟"</string>
     <string name="adb_warning_message" msgid="8145270656419669221">"‏تم تصميم تصحيح أخطاء USB لأغراض التطوير فقط. يمكن استخدامه لنسخ البيانات بين الكمبيوتر والجهاز، وتثبيت التطبيقات على جهازك بدون تنبيه، وقراءة بيانات السجل."</string>
-    <string name="adbwifi_warning_title" msgid="727104571653031865">"‏هل تريد السماح بتصحيح الأخطاء عبر شبكة Wi-Fi؟"</string>
-    <string name="adbwifi_warning_message" msgid="8005936574322702388">"‏تم تصميم ميزة \"تصحيح الأخطاء عبر شبكة Wi-Fi\" لأغراض التطوير فقط. يمكن استخدامها لنسخ البيانات بين الكمبيوتر والجهاز وتثبيت التطبيقات على جهازك بدون إرسال إشعار وقراءة بيانات السجلّ."</string>
+    <string name="adbwifi_warning_title" msgid="727104571653031865">"هل تريد السماح بتفعيل ميزة \"تصحيح الأخطاء اللاسلكي\"؟"</string>
+    <string name="adbwifi_warning_message" msgid="8005936574322702388">"تم تصميم ميزة \"تصحيح الأخطاء اللاسلكي\" لأغراض التطوير فقط. ويمكن استخدامها لنسخ البيانات بين الكمبيوتر والجهاز ، وتثبيت التطبيقات على جهازك بدون إرسال إشعار، وقراءة بيانات السجلّ."</string>
     <string name="adb_keys_warning_message" msgid="2968555274488101220">"‏هل تريد إلغاء إمكانية الدخول إلى تصحيح أخطاء USB من جميع أجهزة الكمبيوتر التي تم التصريح لها سابقًا؟"</string>
     <string name="dev_settings_warning_title" msgid="8251234890169074553">"هل تريد السماح لإعدادات التطوير؟"</string>
     <string name="dev_settings_warning_message" msgid="37741686486073668">"هذه الإعدادات مخصصة لاستخدام التطوير فقط. قد يتسبب هذا في حدوث أعطال أو خلل في أداء الجهاز والتطبيقات المثبتة عليه."</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"عرض مربع الحوار \"التطبيق لا يستجيب\" مع تطبيقات الخلفية"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"عرض تحذيرات قناة الإشعار"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"عرض تحذير على الشاشة عندما ينشر تطبيق إشعارًا بدون قناة صالحة"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"فرض اختصارات لإشعارات المحادثات"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"يجب دعم الإشعارات باختصار مشاركة قديم لتظهر في قسم المحادثات."</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"السماح بإدراج التطبيقات في وحدة تخزين خارجية"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"تأهيل أي تطبيق بحيث تتم كتابته على وحدة تخزين خارجية، بغض النظر عن قيم البيان"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"فرض إمكانية تغيير حجم الأنشطة"</string>
@@ -432,10 +436,14 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"قد تكفي طاقة البطارية حتى حوالي الساعة <xliff:g id="TIME">%1$s</xliff:g>."</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"حتى <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"قد ينفد شحن البطارية قبل <xliff:g id="TIME">%1$s</xliff:g>."</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"يتبقى أقل من <xliff:g id="THRESHOLD">%1$s</xliff:g>."</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"يتبقى أقل من <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)."</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"يتبقى أكثر من <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)."</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"يتبقى أكثر من <xliff:g id="TIME_REMAINING">%1$s</xliff:g>."</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"قد يتم إغلاق الهاتف قريبًا"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"قد يتم إغلاق الجهاز اللوحي قريبًا"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"قد يتم إغلاق الجهاز قريبًا"</string>
diff --git a/packages/SettingsLib/res/values-as/strings.xml b/packages/SettingsLib/res/values-as/strings.xml
index 73a5e7c..9f8e9dd 100644
--- a/packages/SettingsLib/res/values-as/strings.xml
+++ b/packages/SettingsLib/res/values-as/strings.xml
@@ -206,13 +206,13 @@
     <string name="enable_adb" msgid="8072776357237289039">"ইউএছবি ডিবাগিং"</string>
     <string name="enable_adb_summary" msgid="3711526030096574316">"ইউএছবি সংযোগ হৈ থকাৰ অৱস্থাত ডিবাগ ম\'ড"</string>
     <string name="clear_adb_keys" msgid="3010148733140369917">"ইউএছবি ডিবাগিং অনুমতিসমূহ প্ৰত্যাহাৰ কৰক"</string>
-    <string name="enable_adb_wireless" msgid="6973226350963971018">"ৱায়াৰলেছ ডিবাগিং"</string>
+    <string name="enable_adb_wireless" msgid="6973226350963971018">"ৱায়াৰলেচ ডি\'বাগিং"</string>
     <string name="enable_adb_wireless_summary" msgid="7344391423657093011">"ৱাই-ফাই সংযোজিত হৈ থকা সময়ত ডিবাগ ম’ড"</string>
     <string name="adb_wireless_error" msgid="721958772149779856">"আসোঁৱাহ"</string>
-    <string name="adb_wireless_settings" msgid="2295017847215680229">"ৱায়াৰলেছ ডিবাগিং"</string>
-    <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"উপলব্ধ ডিভাইচসমূহ চাবলৈ আৰু ব্যৱহাৰ কৰিবলৈ, ৱায়াৰলেছ ডিবাগিং অন কৰক"</string>
+    <string name="adb_wireless_settings" msgid="2295017847215680229">"ৱায়াৰলেচ ডি\'বাগিং"</string>
+    <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"উপলব্ধ ডিভাইচসমূহ চাবলৈ আৰু ব্যৱহাৰ কৰিবলৈ, ৱায়াৰলেচ ডি\'বাগিং অন কৰক"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"কিউআৰ ক’ডৰ জৰিয়তে ডিভাইচ পেয়াৰ কৰক"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"কিউআৰ ক’ড স্কেনাৰ ব্যৱহাৰ কৰি নতুন ডিভাইচসমূহ পেয়াৰ কৰক"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"কিউআৰ ক’ড স্কেনাৰ ব্যৱহাৰ কৰি নতুন ডিভাইচসমূহ পেয়াৰ কৰক"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"পেয়াৰ কৰা ক’ডৰ জৰিয়তে ডিভাইচ পেয়াৰ কৰক"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"ছটা অংকৰ ক’ড ব্যৱহাৰ কৰি নতুন ডিভাইচসমূহ পেয়াৰ কৰক"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"পেয়াৰ কৰি থোৱা ডিভাইচসমূহ"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"ডিভাইচটো পেয়াৰ কৰিব পৰা নগ’ল। কিউআৰ ক’ডটো ভুল অথবা ডিভাইচটো একেটা নেটৱৰ্কৰ সৈতে সংযোগ কৰা হোৱা নাই।"</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"আইপি ঠিকনা &amp; প’ৰ্ট"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"কিউআৰ ক’ড স্কেন কৰক"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"এটা কিউআৰ ক’ড স্কেন কৰি ৱাই-ফাইৰে ডিভাইচ পেয়াৰ কৰক"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"এটা কিউআৰ ক’ড স্কেন কৰি ৱাই-ফাইৰে ডিভাইচ পেয়াৰ কৰক"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"অনুগ্ৰহ কৰি এটা ৱাই-ফাই নেটৱর্কলৈ সংযোগ কৰক"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, ডিবাগ, dev"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"বাগ ৰিপৰ্টৰ শ্ৱৰ্টকাট"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"বেতাঁৰ ডিছপ্লে’ প্ৰমাণীকৰণ"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"ৱাই-ফাই ভাৰ্ব\'ছ লগিং সক্ষম কৰক"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"ৱাই-ফাই স্কেনৰ নিয়ন্ত্ৰণ"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"ৱাই-ফাই বৰ্ধিত MAC যাদৃচ্ছিকীকৰণ"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"ম’বাইল ডেটা সদা-সক্ৰিয়"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"টেডাৰিং হাৰ্ডৱেৰ ত্বৰণ"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"নামবিহীন ব্লুটুথ ডিভাইচসমূহ দেখুৱাওক"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"বেতাঁৰ ডিছপ্লে’ প্ৰমাণপত্ৰৰ বাবে বিকল্পসমূহ দেখুৱাওক"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"ৱাই-ফাই লগিঙৰ মাত্ৰা বঢ়াওক, Wi‑Fi পিকাৰত প্ৰতি SSID RSSI দেখুৱাওক"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"বেটাৰীৰ খৰচ কমায় আৰু নেটৱৰ্কৰ কাৰ্যক্ষমতা বৃদ্ধি কৰে"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"এই ট\'গল কৰা কার্যই MAC যাদৃচ্ছিকীকৰণৰ আচৰণ কেৱল ক্লায়েণ্ট ম\'ডৰ বাবে প্ৰভাৱিত কৰে।\nএই ম\'ডটো সক্ৰিয় কৰাৰ সময়ত, ক্লায়েণ্টে শেষবাৰৰ বাবে নেটৱর্কটোৰ পৰা কেতিয়া সংযোগ বিচ্ছিন্ন কৰিছে তাৰ ভিত্তিত MAC যাদৃচ্ছিকীকৰণ সক্ষম কৰি থোৱা যিকোনো নেটৱর্কৰ সংযোজনৰ সময়ত MAC ঠিকনাসমূহৰ পুনৰ যাদৃচ্ছিকীকৰণ হ\'ব পাৰে। ডিভাইচটো ৪ ঘণ্টা অথবা তাতকৈ কম সময়ৰ ভিতৰত পুনৰ সংযুক্ত হ\'লে পুনৰ যাদৃচ্ছিকীকৰণ নহয়।"</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"নিৰিখ-নিৰ্দিষ্ট"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"নিৰিখ অনিৰ্দিষ্ট"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"লগাৰৰ বাফাৰৰ আকাৰ"</string>
@@ -300,8 +302,8 @@
     <string name="tethering_hardware_offload_summary" msgid="7801345335142803029">"যদিহে উপলব্ধ হয় তেন্তে টেডাৰিং হাৰ্ডৱেৰ ত্বৰণ ব্যৱহাৰ কৰক"</string>
     <string name="adb_warning_title" msgid="7708653449506485728">"ইউএছবি ডিবাগিঙৰ অনুমতি দিয়েনে?"</string>
     <string name="adb_warning_message" msgid="8145270656419669221">"ইউএছবি ডিবাগ কৰা কাৰ্য কেৱল বিকাশৰ উদ্দেশ্যৰেহে কৰা হৈছে৷ আপোনাৰ কম্পিউটাৰ আৰু আপোনাৰ ডিভাইচৰ মাজত ডেটা প্ৰতিলিপি কৰিবলৈ এইটো ব্যৱহাৰ কৰক, কোনো জাননী নিদিয়াকৈয়ে আপোনাৰ ডিভাইচত এপ্‌সমূহ ইনষ্টল কৰক আৰু লগ ডেটা পঢ়ক৷"</string>
-    <string name="adbwifi_warning_title" msgid="727104571653031865">"ৱায়াৰলেছ ডিবাগিঙৰ অনুমতি দিবনে?"</string>
-    <string name="adbwifi_warning_message" msgid="8005936574322702388">"ৱায়াৰলেছ ডিবাগিং কেৱল বিকাশৰ উদ্দেশ্যেৰে কৰা হয়। আপোনাৰ কম্পিউটাৰ আৰু আপোনাৰ ডিভাইচৰ মাজত ডেটা প্ৰতিলিপি কৰিবলৈ, কোনো জাননী নিদিয়াকৈয়ে আপোনাৰ ডিভাইচত এপ্‌সমূহ ইনষ্টল কৰিবলৈ আৰু লগ ডেটা পঢ়িবলৈ এইটো ব্যৱহাৰ কৰক।"</string>
+    <string name="adbwifi_warning_title" msgid="727104571653031865">"ৱায়াৰলেচ ডি\'বাগিংৰ অনুমতি দিবনে?"</string>
+    <string name="adbwifi_warning_message" msgid="8005936574322702388">"ৱায়াৰলেচ ডি\'বাগিং কেৱল বিকাশৰ উদ্দেশ্যেৰে কৰা হয়। আপোনাৰ কম্পিউটাৰ আৰু আপোনাৰ ডিভাইচৰ মাজত ডেটা প্ৰতিলিপি কৰিবলৈ, কোনো জাননী নিদিয়াকৈয়ে আপোনাৰ ডিভাইচত এপ্‌সমূহ ইনষ্টল কৰিবলৈ আৰু লগ ডেটা পঢ়িবলৈ এইটো ব্যৱহাৰ কৰক।"</string>
     <string name="adb_keys_warning_message" msgid="2968555274488101220">"আপুনি আগতে ইউএছবি ডিবাগিঙৰ বাবে প্ৰৱেশৰ অনুমতি দিয়া সকলো কম্পিউটাৰৰ পৰা সেই অনুমতি প্ৰত্যাহাৰ কৰেনে?"</string>
     <string name="dev_settings_warning_title" msgid="8251234890169074553">"বিকাশৰ কামৰ বাবে থকা ছেটিংবিলাকক অনুমতি দিবনে?"</string>
     <string name="dev_settings_warning_message" msgid="37741686486073668">"এই ছেটিংসমূহ বিকাশৰ কামত ব্যৱহাৰ কৰিবলৈ তৈয়াৰ কৰা হৈছে। সেইবিলাকে আপোনাৰ ডিভাইচ আৰু তাত থকা এপ্লিকেশ্বনসমূহক অকামিলা কৰি পেলাব পাৰে আৰু সেইবিলাকৰ কাৰণে এপ্লিকেশ্বনসমূহে অদ্ভুত আচৰণ কৰিব পাৰে।"</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"নেপথ্য এপসমূহৰ বাবে এপে সঁহাৰি দিয়া নাই ডায়ল\'গ প্ৰদৰ্শন কৰক"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"জাননী চ্চেনেলৰ সকীয়নিসমূহ দেখুৱাওক"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"কোনো এপে বৈধ চ্চেনেল নোহোৱাকৈ কোনো জাননী প\'ষ্ট কৰিলে স্ক্ৰীণত সকীয়নি প্ৰদৰ্শন হয়"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"বার্তালাপৰ জাননীৰ বাবে শ্বৰ্টকাট কাৰ্যকৰী কৰক"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"বার্তালাপৰ শাখাত প্ৰদর্শিত হ\'বলৈ জাননী কোনো দীর্ঘস্থায়ী শ্বেয়াৰিং শ্বৰ্টকাটৰ সমৰ্থিত হ\'ব লাগে"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"বাহ্যিক সঞ্চয়াগাৰত এপক বলেৰে অনুমতি দিয়ক"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"মেনিফেষ্টৰ মান যিয়েই নহওক, বাহ্যিক সঞ্চয়াগাৰত লিখিবলৈ যিকোনো এপক উপযুক্ত কৰি তোলে"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"বলেৰে কাৰ্যকলাপসমূহৰ আকাৰ সলনি কৰিব পৰা কৰক"</string>
diff --git a/packages/SettingsLib/res/values-az/strings.xml b/packages/SettingsLib/res/values-az/strings.xml
index 4cb4017..40eb00b 100644
--- a/packages/SettingsLib/res/values-az/strings.xml
+++ b/packages/SettingsLib/res/values-az/strings.xml
@@ -206,13 +206,13 @@
     <string name="enable_adb" msgid="8072776357237289039">"USB debaq prosesi"</string>
     <string name="enable_adb_summary" msgid="3711526030096574316">"USB qoşulu olan zaman debaq rejimi"</string>
     <string name="clear_adb_keys" msgid="3010148733140369917">"USB debaq avtorizasiyasını ləğv edin"</string>
-    <string name="enable_adb_wireless" msgid="6973226350963971018">"Simsiz sazlama"</string>
+    <string name="enable_adb_wireless" msgid="6973226350963971018">"WiFi sazlaması"</string>
     <string name="enable_adb_wireless_summary" msgid="7344391423657093011">"Wi‑Fi qoşulduqda sazlama rejimi"</string>
     <string name="adb_wireless_error" msgid="721958772149779856">"Xəta"</string>
-    <string name="adb_wireless_settings" msgid="2295017847215680229">"Simsiz sazlama"</string>
-    <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Əlçatan cihazları görmək və onlardan istifadə etmək üçün simsiz sazlamanı yandırın"</string>
+    <string name="adb_wireless_settings" msgid="2295017847215680229">"WiFi sazlaması"</string>
+    <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Əlçatan cihazları görmək və onlardan istifadə etmək üçün WiFi sazlamasını yandırın"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"QR kodu ilə cihazı cütləşdirin"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"QR kod Skanerindən istifadə etməklə yeni cihazları cütləşdirin"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"QR kod skanerindən istifadə etməklə yeni cihazları birləşdirin"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Cütləşdirmə kodu ilə cihazı cütləşdirin"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Altı rəqəmli koddan istifadə etməklə yeni cihazları cütləşdirin"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"Cütləşdirilmiş cihazlar"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Cihazı cütləşdirmək alınmadı. Ya QR kodu yanlış idi, ya da cihaz eyni şəbəkəyə qoşulmayıb."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"IP ünvanı və Port"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"QR kodu skanlayın"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"QR Kodu skanlamaqla cihazı Wi‑Fi vasitəsilə cütləşdirin"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"QR kodu skanlamaqla cihazı Wi‑Fi vasitəsilə birləşdirin"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Wi-Fi şəbəkəsinə qoşulun"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, debug, dev"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"Baq raportu qısa yolu"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"Simsiz displey sertifikatlaşması"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"Wi‑Fi Çoxsözlü Girişə icazə verin"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"Wi‑Fi skanlamasının tənzimlənməsi"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"Wi‑Fi ilə qabaqcıl MAC randomizasiyası"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"Mobil data həmişə aktiv"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"Birləşmə üçün avadanlıq akselerasiyası"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Bluetooth cihazlarını adsız göstərin"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Simsiz displey sertifikatlaşması üçün seçimləri göstərir"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Wi‑Fi giriş səviyyəsini qaldırın, Wi‑Fi seçəndə hər SSID RSSI üzrə göstərin"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Batareya istifadəsini azaldır &amp; şəbəkə performansını yaxşılaşdırır"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Bu keçid yalnız müştəri rejimi üçün MAC randomizasiyasına təsir edir.\nBu rejim aktivləşdirildikdə müştərinin şəbəkədən sonuncu dəfə ayrıldığı vaxtdan asılı olaraq, əlaqələndirmə zamanı MAC randomizasiyası aktivləşdirilmiş istənilən şəbəkənin MAC ünvanı təkrar randomizasiya olunacaq. Cihaz 4 saat və ya daha qısa zaman sonra təkrar qoşularsa, təkrar randomizasiya baş vermir."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"Ödənişli"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"Limitsiz"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"Logger bufer ölçüləri"</string>
@@ -300,8 +302,8 @@
     <string name="tethering_hardware_offload_summary" msgid="7801345335142803029">"Əlçatan oldarsa, birləşmə üçün avadanlıq akselerasiyasından istifadə edin"</string>
     <string name="adb_warning_title" msgid="7708653449506485728">"USB debaq funksiyasına icazə verilsin?"</string>
     <string name="adb_warning_message" msgid="8145270656419669221">"USB sazlanması yalnız inkişaf məqsədlidir. Kompüteriniz və cihazınız arasında datanı kopyalamaq üçün ondan istifadə edin, bildiriş olmadan tətbiqləri cihazınıza quraşdırın və qeydiyyat datasını oxuyun."</string>
-    <string name="adbwifi_warning_title" msgid="727104571653031865">"Simsiz sazlamaya icazə verilsin?"</string>
-    <string name="adbwifi_warning_message" msgid="8005936574322702388">"Simsiz sazlama yalnız inkişaf məqsədlidir. Ondan kompüteriniz və cihazınız arasında datanı kopyalamaq, cihazınızda bildiriş olmadan tətbiqləri quraşdırmaq və qeydiyyat datasını oxumaq üçün istifadə edin."</string>
+    <string name="adbwifi_warning_title" msgid="727104571653031865">"WiFi sazlamasına icazə verilsin?"</string>
+    <string name="adbwifi_warning_message" msgid="8005936574322702388">"WiFi sazlaması yalnız inkişaf məqsədlidir. Ondan kompüteriniz və cihazınız arasında datanı kopyalamaq, cihazınızda bildiriş olmadan tətbiqləri quraşdırmaq və qeydiyyat datasını oxumaq üçün istifadə edin."</string>
     <string name="adb_keys_warning_message" msgid="2968555274488101220">"Əvvəl icazə verdiyiniz kompüterlərdən USB debaq əməliyyatına giriş ləğv olunsun?"</string>
     <string name="dev_settings_warning_title" msgid="8251234890169074553">"İnkişaf ayarlarına icazə verilsin mi?"</string>
     <string name="dev_settings_warning_message" msgid="37741686486073668">"Bu parametrlər yalnız inkişafetdirici istifadə üçün nəzərdə tutulub. Onlar cihaz və tətbiqlərinizin sınması və ya pis işləməsinə səbəb ola bilər."</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"Arxa fon tətbiqləri üçün Tətbiq Cavab Vermir dialoqunu göstərin"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Xəbərdarlıqları göstərin"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Bildiriş paylaşıldıqda xəbərdarlıq göstərir"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Söhbət bildirişləri üçün qısayolları tətbiq edin"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Söhbət bölməsində görünmək üçün bildirişlərin uzunmüddətli paylaşım qısayolu ilə dəstəklənməsini tələb edin"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"Tətbiqlərə xaricdən məcburi icazə"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Seçilmiş hər hansı tətbiqi bəyannamə dəyərlərindən aslı olmayaraq xarici yaddaşa yazılabilən edir."</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"Ölçü dəyişdirmək üçün məcburi fəaliyyətlər"</string>
@@ -432,10 +436,14 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"Təxminən <xliff:g id="TIME">%1$s</xliff:g> olana qədər davam edəcək"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"<xliff:g id="TIME">%1$s</xliff:g> olana qədər"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Batareya <xliff:g id="TIME">%1$s</xliff:g> radələrinə qədər boşala bilər"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"Qalan vaxt <xliff:g id="THRESHOLD">%1$s</xliff:g> və daha azdır"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"Qalan vaxt <xliff:g id="THRESHOLD">%1$s</xliff:g> və daha azdır (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"Qalan vaxt <xliff:g id="TIME_REMAINING">%1$s</xliff:g> və daha çoxdur (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"Qalan vaxt <xliff:g id="TIME_REMAINING">%1$s</xliff:g> və daha çoxdur"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"Telefon tezliklə sönə bilər"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"Planşet tezliklə sönə bilər"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"Cihaz tezliklə sönə bilər"</string>
diff --git a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
index 839b85a..e9d314b 100644
--- a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
+++ b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
@@ -212,7 +212,7 @@
     <string name="adb_wireless_settings" msgid="2295017847215680229">"Bežično otklanjanje grešaka"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Da biste videli i koristili dostupne uređaje, uključite bežično otklanjanje grešaka"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Uparite uređaj pomoću QR koda"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"Uparite nove uređaje pomoću čitača QR koda"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"Uparite nove uređaje pomoću čitača QR koda"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Uparite uređaj pomoću koda za uparivanje"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Uparite nove uređaje pomoću šestocifrenog koda"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"Upareni uređaji"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Uparivanje uređaja nije uspelo. QR kôd je pogrešan ili uređaj nije povezan sa istom mrežom."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"IP adresa i port"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"Skeniraj QR kôd"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"Uparite uređaj pomoću Wi‑Fi mreže ili tako što ćete skenirati QR kôd"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Uparite uređaj pomoću Wi‑Fi mreže tako što ćete skenirati QR kôd"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Povežite se na Wi-Fi mrežu"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, otklanjanje grešaka, programer"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"Prečica za izveštaj o greškama"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"Sertifikacija bežičnog ekrana"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"Omogući detaljniju evidenciju za Wi‑Fi"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"Usporavanje Wi-Fi skeniranja"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"Nasumično MAC razvrstavanje po Wi‑Fi‑ju"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"Mobilni podaci su uvek aktivni"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"Hardversko ubrzanje privezivanja"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Prikaži Bluetooth uređaje bez naziva"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Prikaz opcija za sertifikaciju bežičnog ekrana"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Povećava nivo evidentiranja za Wi‑Fi. Prikaz po SSID RSSI-u u biraču Wi‑Fi mreže"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Smanjuje potrošnju baterije i poboljšava učinak mreže"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Ovaj prekidač utiče na ponašanje nasumičnog razvrstavanja MAC adresa samo za režim klijenta.\nKada se ovaj režim aktivira, za mreže na kojima je omogućeno nasumično razvrstavanje MAC adresa može da dođe do ponovnog nasumičnog razvrstavanja MAC adresa tokom povezivanja, u zavisnosti od toga kada se klijent pre toga isključio sa mreže. Do ponovnog nasumičnog razvrstavanja ne dolazi ako se uređaj ponovo poveže za 4 sata ili manje."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"Sa ograničenjem"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"Bez ograničenja"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"Veličine bafera podataka u programu za evidentiranje"</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"Prikaži dijalog Aplikacija ne reaguje za aplikacije u pozadini"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Prikazuj upozorenja zbog kanala za obaveštenja"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Prikazuje upozorenje na ekranu kada aplikacija postavi obaveštenje bez važećeg kanala"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Primenjuj prečice za obaveštenja o konverzacijama"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Zahteva da obaveštenja imaju i dugoročnu prečicu za deljenje kako bi se pojavljivala u odeljku za konverzacije"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"Prinudno dozvoli aplikacije u spoljnoj"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Omogućava upisivanje svih aplikacija u spoljnu memoriju, bez obzira na vrednosti manifesta"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"Prinudno omogući promenu veličine aktivnosti"</string>
@@ -432,10 +436,14 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"Trajaće približno do <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"Do <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Baterija će se možda isprazniti do <xliff:g id="TIME">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"Preostalo je manje od <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"Preostalo je manje od <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"Preostalo je više od <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"Preostalo je više od <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"Telefon će se uskoro isključiti"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"Tablet će se uskoro isključiti"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"Uređaj će se uskoro isključiti"</string>
diff --git a/packages/SettingsLib/res/values-be/strings.xml b/packages/SettingsLib/res/values-be/strings.xml
index cc0d286..713c7cd 100644
--- a/packages/SettingsLib/res/values-be/strings.xml
+++ b/packages/SettingsLib/res/values-be/strings.xml
@@ -112,7 +112,7 @@
     <string name="bluetooth_opp_profile_summary_use_for" msgid="461981154387015457">"Выкарыстоўваць для перадачы файлаў"</string>
     <string name="bluetooth_hid_profile_summary_use_for" msgid="4289460627406490952">"Выкарыстоўваць для ўводу"</string>
     <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="7689393730163320483">"Выкарыстоўваць для слыхавых апаратаў"</string>
-    <string name="bluetooth_pairing_accept" msgid="2054232610815498004">"Падлучыць"</string>
+    <string name="bluetooth_pairing_accept" msgid="2054232610815498004">"Спалучыць"</string>
     <string name="bluetooth_pairing_accept_all_caps" msgid="2734383073450506220">"СПАЛУЧЫЦЬ"</string>
     <string name="bluetooth_pairing_decline" msgid="6483118841204885890">"Скасаваць"</string>
     <string name="bluetooth_pairing_will_share_phonebook" msgid="3064334458659165176">"Спалучэнне дае доступ да вашых кантактаў і гісторыі выклікаў пры падключэнні."</string>
@@ -156,7 +156,7 @@
     <string name="launch_defaults_none" msgid="8049374306261262709">"Параметры па змаўчанні не ўсталяваныя"</string>
     <string name="tts_settings" msgid="8130616705989351312">"Налады Text-to-speech"</string>
     <string name="tts_settings_title" msgid="7602210956640483039">"Сінтэз маўлення"</string>
-    <string name="tts_default_rate_title" msgid="3964187817364304022">"Хуткасць гаворкі"</string>
+    <string name="tts_default_rate_title" msgid="3964187817364304022">"Хуткасць маўлення"</string>
     <string name="tts_default_rate_summary" msgid="3781937042151716987">"Хуткасць, з якой кажуць тэкст"</string>
     <string name="tts_default_pitch_title" msgid="6988592215554485479">"Тон"</string>
     <string name="tts_default_pitch_summary" msgid="9132719475281551884">"Уплывае на тон сінтэзаванага маўлення"</string>
@@ -206,19 +206,19 @@
     <string name="enable_adb" msgid="8072776357237289039">"Адладка USB"</string>
     <string name="enable_adb_summary" msgid="3711526030096574316">"Рэжым адладкі, калі USB падключаны"</string>
     <string name="clear_adb_keys" msgid="3010148733140369917">"Адклікаць дазвол USB-адладкі"</string>
-    <string name="enable_adb_wireless" msgid="6973226350963971018">"Бесправадная адладка"</string>
+    <string name="enable_adb_wireless" msgid="6973226350963971018">"Адладка па Wi-Fi"</string>
     <string name="enable_adb_wireless_summary" msgid="7344391423657093011">"Рэжым адладкі з падключанай сеткай Wi‑Fi"</string>
     <string name="adb_wireless_error" msgid="721958772149779856">"Памылка"</string>
-    <string name="adb_wireless_settings" msgid="2295017847215680229">"Бесправадная адладка"</string>
-    <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Каб праглядаць і выкарыстоўваць даступныя прылады, уключыце бесправадную адладку"</string>
+    <string name="adb_wireless_settings" msgid="2295017847215680229">"Адладка па Wi-Fi"</string>
+    <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Каб праглядаць і выкарыстоўваць даступныя прылады, уключыце адладку па Wi-Fi"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Спалучыць прыладу з дапамогай QR-кода"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"Спалучаць новыя прылады з дапамогай сканера QR-кода"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"Спалучаць новыя прылады з дапамогай сканера QR-кода"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Спалучыць прыладу з дапамогай кода спалучэння"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Спалучаць новыя прылады з дапамогай шасцізначнага кода"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"Спалучаныя прылады"</string>
     <string name="adb_wireless_device_connected_summary" msgid="3039660790249148713">"Цяпер падключана"</string>
     <string name="adb_wireless_device_details_title" msgid="7129369670526565786">"Падрабязныя звесткі пра прыладу"</string>
-    <string name="adb_device_forget" msgid="193072400783068417">"Ігнараваць"</string>
+    <string name="adb_device_forget" msgid="193072400783068417">"Забыць"</string>
     <string name="adb_device_fingerprint_title_format" msgid="291504822917843701">"Лічбавы адбітак прылады: <xliff:g id="FINGERPRINT_PARAM">%1$s</xliff:g>"</string>
     <string name="adb_wireless_connection_failed_title" msgid="664211177427438438">"Не ўдалося падключыцца"</string>
     <string name="adb_wireless_connection_failed_message" msgid="9213896700171602073">"Пераканайцеся, што прылада \"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>\" падключана да правільнай сеткі"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Не ўдалося спалучыць прыладу. QR-код няправільны, ці прылада падключана не да той самай сеткі."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"IP-адрас і порт"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"Сканіраваць QR-код"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"Спалучыць прыладу праз Wi‑Fi шляхам сканіравання QR-кода"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Спалучэнне прылады праз Wi‑Fi шляхам сканіравання QR-кода"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Падключыцеся да сеткі Wi-Fi"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, адладка, распрацоўшчык"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"Ярлык для справаздачы пра памылкі"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"Сертыфікацыя бесправаднога экрана"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"Уключыць падрабязны журнал Wi‑Fi"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"Рэгуляванне пошуку сетак Wi‑Fi"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"Палепшаная Wi‑Fi рандамізацыя MAC-адраса"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"Мабільная перадача даных заўсёды актыўная"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"Апаратнае паскарэнне ў рэжыме мадэма"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Паказваць прылады Bluetooth без назваў"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Паказаць опцыі сертыфікацыі бесправаднога экрана"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Пры выбары сеткі Wi-Fi указваць у журнале RSSI для кожнага SSID"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Зніжае расход зараду акумулятара і павышае прадукцыйнасць мабільных сетак"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Гэты пераключальнік уплывае на рандамізацыю MAC-адрасоў толькі ў кліенцкім рэжыме.\nКалі гэты рэжым актываваны, ва ўсіх сетках з уключанай рандамізацыяй MAC-адрасоў падчас прывязвання можа выконвацца паўторная рандамізацыя ў залежнасці ад таго, калі кліент адключаўся ад сеткі ў апошні раз. Паўторная рандамізацыя не выконваецца, калі прылада зноў падключаецца да сеткі менш чым праз 4 гадзіны."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"Сетка з улікам трафіка"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"Сетка без уліку трафіка"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"Памеры буфера журнала"</string>
@@ -300,8 +302,8 @@
     <string name="tethering_hardware_offload_summary" msgid="7801345335142803029">"Выкарыстоўваць апаратнае паскарэнне ў рэжыме мадэма пры наяўнасці"</string>
     <string name="adb_warning_title" msgid="7708653449506485728">"Дазволіць адладку USB?"</string>
     <string name="adb_warning_message" msgid="8145270656419669221">"Адладка USB прызначана толькі для мэтаў распрацоўкі. Яна можа выкарыстоўвацца, каб капіяваць дадзеныя паміж кампутарам і прыладай, усталёўваць прыкладанні на прыладзе без папярэдняга апавяшчэння і чытаць дадзеныя дзённiка."</string>
-    <string name="adbwifi_warning_title" msgid="727104571653031865">"Дазволіць бесправадную адладку?"</string>
-    <string name="adbwifi_warning_message" msgid="8005936574322702388">"Бесправадная адладка прызначана толькі для мэт распрацоўкі. Яна можа выкарыстоўвацца, каб капіраваць даныя паміж камп\'ютарам і прыладай, усталёўваць праграмы на прыладзе без апавяшчэння і чытаць даныя журнала."</string>
+    <string name="adbwifi_warning_title" msgid="727104571653031865">"Дазволіць адладку па Wi-Fi?"</string>
+    <string name="adbwifi_warning_message" msgid="8005936574322702388">"Адладка па Wi-Fi прызначана толькі для мэт распрацоўкі. Яна можа выкарыстоўвацца, каб капіраваць даныя паміж камп\'ютарам і прыладай, усталёўваць праграмы на прыладзе без апавяшчэння і чытаць даныя журнала."</string>
     <string name="adb_keys_warning_message" msgid="2968555274488101220">"Адклікаць доступ да адладкі USB з усіх камп\'ютараў, на якiх вы уваходзiлi ў сiстэму?"</string>
     <string name="dev_settings_warning_title" msgid="8251234890169074553">"Дазволiць налады распрацоўшчыка?"</string>
     <string name="dev_settings_warning_message" msgid="37741686486073668">"Гэтыя налады прызначаны толькi для распрацоўшыкаў. Яны могуць выклікаць збоi прылад i ўсталяваных на iх прыкладанняў, а таксама перашкаджаць iх працы."</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"Паведамляць аб тым, што праграма не адказвае"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Паказваць папярэджанні канала апавяшчэннаў"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Паказвае папярэджанне на экране, калі праграма публікуе апавяшчэнне без сапраўднага канала"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Выкарыстоўваць ярлыкі для апавяшчэнняў з размоў"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Каб апавяшчэнні паяўляліся ў раздзеле размоў, абавязкова дубліраваць іх з дапамогай ярлыкоў з працяглым паказам"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"Прымусова дазволіць праграмы на вонкавым сховішчы"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Робіць любую праграму даступнай для запісу на вонкавае сховішча, незалежна ад значэнняў маніфеста"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"Зрабіць вокны дзеянняў даступнымі для змены памеру"</string>
@@ -432,10 +436,14 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"Зараду хопіць прыблізна да <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"Да <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Акумулятар разрадзіцца ў <xliff:g id="TIME">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"Засталося менш за <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"Узровень зараду батарэі: <xliff:g id="LEVEL">%2$s</xliff:g> (хопіць менш чым на <xliff:g id="THRESHOLD">%1$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"Узровень зараду батарэі: <xliff:g id="LEVEL">%2$s</xliff:g> (хопіць больш чым на <xliff:g id="TIME_REMAINING">%1$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"Хопіць больш чым на <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"Тэлефон у хуткім часе выключыцца"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"Планшэт у хуткім часе выключыцца"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"Прылада ў хуткім часе выключыцца"</string>
@@ -541,7 +549,7 @@
     <string name="user_add_user_type_title" msgid="551279664052914497">"Дадаць"</string>
     <string name="user_new_user_name" msgid="60979820612818840">"Новы карыстальнік"</string>
     <string name="user_new_profile_name" msgid="2405500423304678841">"Новы профiль"</string>
-    <string name="user_info_settings_title" msgid="6351390762733279907">"Інфармацыя карыстальніка"</string>
+    <string name="user_info_settings_title" msgid="6351390762733279907">"Звесткі карыстальніка"</string>
     <string name="profile_info_settings_title" msgid="105699672534365099">"Звесткi профiлю"</string>
     <string name="user_need_lock_message" msgid="4311424336209509301">"Перш чым вы зможаце стварыць профіль з абмежаваннямi, вам трэба наладзіць блакiроўку экрана для абароны сваiх дадаткаў і асабістай інфармацыі."</string>
     <string name="user_set_lock_button" msgid="1427128184982594856">"Усталёўка блакiроўкi"</string>
diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml
index ef0951c..57456d9 100644
--- a/packages/SettingsLib/res/values-bg/strings.xml
+++ b/packages/SettingsLib/res/values-bg/strings.xml
@@ -210,9 +210,9 @@
     <string name="enable_adb_wireless_summary" msgid="7344391423657093011">"Режим за отстраняване на грешки при връзка с Wi-Fi"</string>
     <string name="adb_wireless_error" msgid="721958772149779856">"Грешка"</string>
     <string name="adb_wireless_settings" msgid="2295017847215680229">"Безжично отстраняване на грешки"</string>
-    <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"За да виждате и използвате наличните устройства, включете функцията за отстраняване на грешки през безжична мрежа"</string>
+    <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"За да виждате и използвате наличните устройства, включете функцията за безжично отстраняване на грешки"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Сдвояване на устройството чрез QR код"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"Сдвояване на новите устройства чрез скенер за QR кодове"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"Сдвояване на новите устройства чрез скенер за QR кодове"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Сдвояване на устройството чрез код за сдвояване"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Сдвояване на новите устройства чрез шестцифрен код"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"Сдвоени устройства"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Сдвояването на устройството не бе успешно. QR кодът е неправилен или устройството не е свързано със същата мрежа."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"IP адрес и порт"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"Сканиране на QR код"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"Сдвояване на устройството през Wi‑Fi чрез сканиране на QR код"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Сдвояване на устройството през Wi‑Fi чрез сканиране на QR код"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Моля, свържете се с Wi-Fi мрежа"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, отстраняване на грешки, програмиране"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"Пряк път за сигнал за програмна грешка"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"Безжичен дисплей"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"„Многословно“ регистр. на Wi‑Fi: Актив."</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"Ограничаване на сканирането за Wi-Fi"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"Подобр. рандом. на MAC адреса чрез Wi-Fi"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"Винаги активни мобилни данни"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"Хардуерно ускорение за тетъринга"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Показване на устройствата с Bluetooth без имена"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Показване на опциите за сертифициране на безжичния дисплей"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"По-подробно регистр. на Wi‑Fi – данни за RSSI на SSID в инстр. за избор на Wi‑Fi"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Намалява изразходването на батерията и подобрява ефективността на мрежата"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Този превключвател оказва влияние върху поведението при рандомизиране на MAC адреси само в режим на клиентска програма.\nКогато този режим е активиран, MAC адресът на всяка мрежа, за която функцията за рандомизиране е включена, може да бъде повторно рандомизиран по време на свързването в зависимост от това, кога последно клиентската програма е прекратила връзката си с мрежата. Не възниква повторно рандомизиране, ако устройството отново установи връзка до 4 часа."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"С отчитане"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"Без отчитане"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"Размери на регистрац. буфери"</string>
@@ -300,8 +302,8 @@
     <string name="tethering_hardware_offload_summary" msgid="7801345335142803029">"Да се използва хардуерно ускорение на тетъринга, ако е налице"</string>
     <string name="adb_warning_title" msgid="7708653449506485728">"Разрешаване на отстраняването на грешки през USB?"</string>
     <string name="adb_warning_message" msgid="8145270656419669221">"Отстраняването на грешки през USB е предназначено само за програмни цели. Използвайте го за копиране на данни между компютъра и устройството си, за инсталиране на приложения на устройството си без известяване и за четене на регистрационни данни."</string>
-    <string name="adbwifi_warning_title" msgid="727104571653031865">"Да се разреши ли отстраняването на грешки през безжична мрежа?"</string>
-    <string name="adbwifi_warning_message" msgid="8005936574322702388">"Отстраняването на грешки през безжична мрежа е предназначено само за програмни цели. Използвайте го за копиране на данни между компютъра и устройството си, за инсталиране на приложения на устройството си без известяване и за четене на регистрационни данни."</string>
+    <string name="adbwifi_warning_title" msgid="727104571653031865">"Да се разреши ли безжичното отстраняване на грешки?"</string>
+    <string name="adbwifi_warning_message" msgid="8005936574322702388">"Безжичното отстраняване на грешки е предназначено само за програмни цели. Използвайте го за копиране на данни между компютъра и устройството си, за инсталиране на приложения на устройството си без известяване и за четене на регистрационни данни."</string>
     <string name="adb_keys_warning_message" msgid="2968555274488101220">"Да се отмени ли достъпът до отстраняването на грешки през USB от всички по-рано упълномощени от вас компютри?"</string>
     <string name="dev_settings_warning_title" msgid="8251234890169074553">"Да се разрешат ли настройките за програмиране?"</string>
     <string name="dev_settings_warning_message" msgid="37741686486073668">"Тези настройки са предназначени само за програмиране. Те могат да доведат до прекъсване на работата или неправилно функциониране на устройството ви и приложенията в него."</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"Показване на диалоговия прозорец за грешки от типа ANR за приложенията на заден план"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Предупрежд. за канала за известия"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Показва се предупреждение, когато приложение публикува известие без валиден канал"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Налагане на преки пътища за извест. за разговори"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"За известията да се създава рез. копие чрез постоянен пряк път за споделяне, за да се показват в секцията с разговори"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"Външно хран.: принуд. разрешаване на приложенията"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Всички приложения ще отговарят на условията да бъдат записвани във външното хранилище независимо от стойностите в манифеста"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"Възможност за преоразмеряване на активностите"</string>
@@ -432,10 +436,14 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"Следва да издържи до около <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"До <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Батерията може да се изтощи до <xliff:g id="TIME">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"Остава/т по-малко от <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"Остава/т по-малко от <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"Остава/т повече от <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"Остава/т повече от <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"Възможно е телефонът да се изключи скоро"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"Възможно е таблетът да се изключи скоро"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"Възможно е устройството да се изключи скоро"</string>
diff --git a/packages/SettingsLib/res/values-bn/strings.xml b/packages/SettingsLib/res/values-bn/strings.xml
index 1cd8eea..decb3da 100644
--- a/packages/SettingsLib/res/values-bn/strings.xml
+++ b/packages/SettingsLib/res/values-bn/strings.xml
@@ -21,7 +21,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="wifi_fail_to_scan" msgid="2333336097603822490">"নেটওয়ার্কগুলির জন্য স্ক্যান করা যাবে না"</string>
-    <string name="wifi_security_none" msgid="7392696451280611452">"কোনো কিছুই নয়"</string>
+    <string name="wifi_security_none" msgid="7392696451280611452">"কোনও কিছুই নয়"</string>
     <string name="wifi_remembered" msgid="3266709779723179188">"সংরক্ষিত"</string>
     <string name="wifi_disconnected" msgid="7054450256284661757">"কানেকশন নেই"</string>
     <string name="wifi_disabled_generic" msgid="2651916945380294607">"অক্ষম হয়েছে"</string>
@@ -117,7 +117,7 @@
     <string name="bluetooth_pairing_decline" msgid="6483118841204885890">"বাতিল করুন"</string>
     <string name="bluetooth_pairing_will_share_phonebook" msgid="3064334458659165176">"চেনানো থাকলে তা কানেক্ট থাকাকালীন অবস্থায় আপনার পরিচিতিগুলি এবং কলের ইতিহাসকে অ্যাক্সেস করতে অনুমোদিত করে৷"</string>
     <string name="bluetooth_pairing_error_message" msgid="6626399020672335565">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> এর সাথে চেনানো যায়নি।"</string>
-    <string name="bluetooth_pairing_pin_error_message" msgid="264422127613704940">"ভুল পিন বা কোড দেওয়ার কারণে <xliff:g id="DEVICE_NAME">%1$s</xliff:g> এর সঙ্গে চেনানো যায়নি।"</string>
+    <string name="bluetooth_pairing_pin_error_message" msgid="264422127613704940">"ভুল পিন বা কোড দেওয়ার কারণে <xliff:g id="DEVICE_NAME">%1$s</xliff:g>-এর সঙ্গে যুক্ত করা যায়নি।"</string>
     <string name="bluetooth_pairing_device_down_error_message" msgid="2554424863101358857">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> এর সঙ্গে যোগাযোগ করতে পারবেন না।"</string>
     <string name="bluetooth_pairing_rejected_error_message" msgid="5943444352777314442">"চেনানো <xliff:g id="DEVICE_NAME">%1$s</xliff:g> প্রত্যাখ্যান করেছে।"</string>
     <string name="bluetooth_talkback_computer" msgid="3736623135703893773">"কম্পিউটার"</string>
@@ -212,7 +212,7 @@
     <string name="adb_wireless_settings" msgid="2295017847215680229">"ওয়্যারলেস ডিবাগিং"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"কোন কোন ডিভাইস উপলভ্য আছে তা দেখে নিয়ে ব্যবহার করার জন্য, ওয়্যারলেস ডিবাগিং চালু করুন"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"QR কোড ব্যবহার করে ডিভাইস যোগ করুন"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"QR কোড স্ক্যানার ব্যবহার করে নতুন ডিভাইস যোগ করুন"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"QR কোড স্ক্যানার ব্যবহার করে নতুন ডিভাইস যোগ করুন"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"যোগ করার কোড ব্যবহার করে ডিভাইস যোগ করুন"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"ছয় সংখ্যার কোড ব্যবহার করে নতুন ডিভাইস যোগ করুন"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"যোগ করা ডিভাইস"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"ডিভাইস যোগ করা যায়নি। এটি দুটি কারণে হয়ে থাকে - QR কোডটি সঠিক নয় বা ডিভাইসটি একই নেটওয়ার্কে কানেক্ট করা নেই।"</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"IP অ্যাড্রেস ও পোর্ট"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"QR কোড স্ক্যান করুন"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"QR কোড স্ক্যান করে ওয়াই-ফাই ব্যবহার করে ডিভাইস যোগ করুন"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"QR কোড স্ক্যান করে ওয়াই-ফাইয়ের সাহায্যে ডিভাইস যোগ করুন"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"একটি ওয়াই-ফাই নেটওয়ার্কের সাথে কানেক্ট করুন"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, debug, dev"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"ত্রুটি প্রতিবেদনের শর্টকাট"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"ওয়্যারলেস ডিসপ্লে সার্টিফিকেশন"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"ওয়াই-ফাই ভারবোস লগিং চালু করুন"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"ওয়াই-ফাই স্ক্যান থ্রোটলিং"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"ওয়াই-ফাই উন্নত MAC র‍্যান্ডমাইজেশন"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"মোবাইল ডেটা সব সময় সক্রিয় থাক"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"টিথারিং হার্ডওয়্যার অ্যাক্সিলারেশন"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"নামহীন ব্লুটুথ ডিভাইসগুলি দেখুন"</string>
@@ -273,7 +274,7 @@
     <string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3233402355917446304">"ব্লুটুথ অডিও LDAC কোডেক: প্লেব্যাক গুণমান"</string>
     <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="7274396574659784285">"ব্লুটুথ অডিও LDAC কোডেক ট্রিগার করুন\nএটি বেছে নেওয়া আছে: প্লেব্যাকের কোয়ালিটি"</string>
     <string name="bluetooth_select_a2dp_codec_streaming_label" msgid="2040810756832027227">"স্ট্রিমিং: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
-    <string name="select_private_dns_configuration_title" msgid="7887550926056143018">"ব্যক্তিগত ডিএনএস"</string>
+    <string name="select_private_dns_configuration_title" msgid="7887550926056143018">"প্রাইভেট ডিএনএস"</string>
     <string name="select_private_dns_configuration_dialog_title" msgid="3731422918335951912">"ব্যক্তিগত ডিএনএস মোড বেছে নিন"</string>
     <string name="private_dns_mode_off" msgid="7065962499349997041">"বন্ধ আছে"</string>
     <string name="private_dns_mode_opportunistic" msgid="1947864819060442354">"অটোমেটিক"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"ওয়্যারলেস প্রদর্শন সার্টিফিকেশন জন্য বিকল্পগুলি দেখান"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"ওয়াই-ফাই লগিং স্তর বাড়ান, ওয়াই-ফাই চয়নকারীতে SSID RSSI অনুযায়ী দেখান"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"ব্যাটারির খরচ কমায় এবং নেটওয়ার্কের পারফর্ম্যান্স উন্নত করে"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"এই টগলটি কেবল ক্লায়েন্ট মোডের জন্য ম্যাক র‍্যান্ডমাইজেশন আচরণকে প্রভাবিত করে।\nযখন এই মোডটি চালু করা হয়, তখন ক্লায়েন্টটি কখন নেটওয়ার্ক থেকে ডিসকানেক্ট হয়েছিল তার উপর নির্ভর করে কানেকশনটি সর্বশেষ কানেক্ট হওয়ার পরে MAC র‍্যান্ডম দ্বারা চালু করা যেকোনও MAC অ্যাড্রেস যেকোনও নেটওয়ার্কে আবার র‍্যান্ডমাইজেশন করা যেতে পারে। যদি ডিভাইসটি ৪ ঘন্টা বা তারও কম সময়ে আবার কানেক্ট করা হয় তবে এটি আর র‍্যান্ডমাইজেশন হবে না।"</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"মিটার্ড"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"পরিমাপ করা নয়"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"লগার বাফারের আকারগুলি"</string>
@@ -301,7 +303,7 @@
     <string name="adb_warning_title" msgid="7708653449506485728">"USB ডিবাগিং মঞ্জুর করবেন?"</string>
     <string name="adb_warning_message" msgid="8145270656419669221">"USB ডিবাগিং কেবলমাত্র বিকাশ করার উদ্দেশ্যে। আপনার কম্পিউটার এবং আপনার ডিভাইসের মধ্যে ডেটা অনুলিপি করতে এটি ব্যবহার করুন, বিজ্ঞপ্তি ছাড়া আপনার ডিভাইসে অ্যাপ্লিকেশানগুলি ইনস্টল করুন এবং ডেটা লগ পড়ুন।"</string>
     <string name="adbwifi_warning_title" msgid="727104571653031865">"ওয়্যারলেস ডিবাগিং-এর অনুমতি দেবেন?"</string>
-    <string name="adbwifi_warning_message" msgid="8005936574322702388">"ওয়্যারলেস ডিবাগিং কেবলমাত্র বিকাশ করার উদ্দেশ্যে। আপনার কম্পিউটার এবং আপনার ডিভাইসের মধ্যে ডেটা কপি করতে এটি ব্যবহার করুন, বিজ্ঞপ্তি ছাড়া আপনার ডিভাইসে অ্যাপ ইনস্টল করুন এবং ডেটা লগ পড়ুন।"</string>
+    <string name="adbwifi_warning_message" msgid="8005936574322702388">"ওয়্যারলেস ডিবাগিং কেবলমাত্র ডেভেলপ করার উদ্দেশ্যে। আপনার কম্পিউটার এবং আপনার ডিভাইসের মধ্যে ডেটা কপি করতে এটি ব্যবহার করুন, বিজ্ঞপ্তি ছাড়া আপনার ডিভাইসে অ্যাপ ইনস্টল করুন এবং ডেটা লগ পড়ুন।"</string>
     <string name="adb_keys_warning_message" msgid="2968555274488101220">"আপনি আগে যে সব কম্পিউটার USB ডিবাগিং এর অ্যাক্সেসের অনুমতি দিয়েছিলেন তা প্রত্যাহার করবেন?"</string>
     <string name="dev_settings_warning_title" msgid="8251234890169074553">"উন্নতি সেটিংসের অনুমতি দেবেন?"</string>
     <string name="dev_settings_warning_message" msgid="37741686486073668">"এইসব সেটিংস কেবলমাত্র উন্নত করার উদ্দেশ্য। সেগুলি কারণে আপনার ডিভাইস ভেঙ্গে এবং অ্যাপ্লিকেশানগুলি ভালো ভাবে কাজ করা নাও কারতে পারে।"</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"ব্যাকগ্রাউন্ডের অ্যাপগুলির জন্য \'অ্যাপ থেকে সাড়া পাওয়া যাচ্ছে না\' মেসেজ দেখান"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"বিজ্ঞপ্তির সতর্কতা দেখুন"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"অ্যাপ সঠিক চ্যানেল ছাড়া বিজ্ঞপ্তি দেখালে সতর্ক করে"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"কথোপকথনের বিজ্ঞপ্তির জন্য শর্টকাট ব্যবহার করুন"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"কথোপকথন বিভাগে দেখানোর জন্য বিজ্ঞপ্তিতে অনেকটা সময় ধরে চলে এমন শেয়ারিং শর্টকাট যেন থাকে"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"বহিরাগততে বলপূর্বক মঞ্জুরি"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"ম্যানিফেস্ট মানগুলি নির্বিশেষে যেকোনো অ্যাপ্লিকেশানকে বাহ্যিক সঞ্চয়স্থানে লেখার উপযুক্ত বানায়"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"আকার পরিবর্তনযোগ্য করার জন্য ক্রিয়াকলাপগুলিকে জোর করুন"</string>
@@ -432,10 +436,14 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"আনুমানিক <xliff:g id="TIME">%1$s</xliff:g> পর্যন্ত চলবে"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"<xliff:g id="TIME">%1$s</xliff:g> পর্যন্ত"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"ব্যাটারির চার্জ <xliff:g id="TIME">%1$s</xliff:g>-এ শেষ হয়ে যেতে পারে"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"<xliff:g id="THRESHOLD">%1$s</xliff:g> এর থেকেও কম বাকি আছে"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"আর <xliff:g id="THRESHOLD">%1$s</xliff:g>-এর কম চার্জ বাকি আছে (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"আরও <xliff:g id="TIME_REMAINING">%1$s</xliff:g>-এর বেশি চলবে (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"আরও <xliff:g id="TIME_REMAINING">%1$s</xliff:g>-এর বেশি চলবে"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"ফোন শীঘ্রই বন্ধ হয়ে যেতে পারে"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"ট্যাবলেটটি শীঘ্রই বন্ধ হয়ে যেতে পারে"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"ডিভাইসটি শীঘ্রই বন্ধ হয়ে যেতে পারে"</string>
@@ -456,7 +464,7 @@
     <string name="disabled" msgid="8017887509554714950">"অক্ষম হয়েছে"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"অনুমোদিত"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"অনুমোদিত নয়"</string>
-    <string name="install_other_apps" msgid="3232595082023199454">"অজানা অ্যাপ ইনস্টল করুন"</string>
+    <string name="install_other_apps" msgid="3232595082023199454">"অজানা অ্যাপ ইনস্টল করা"</string>
     <string name="home" msgid="973834627243661438">"সেটিংস হোম"</string>
   <string-array name="battery_labels">
     <item msgid="7878690469765357158">"০%"</item>
diff --git a/packages/SettingsLib/res/values-bs/strings.xml b/packages/SettingsLib/res/values-bs/strings.xml
index c72411c..0a9d260 100644
--- a/packages/SettingsLib/res/values-bs/strings.xml
+++ b/packages/SettingsLib/res/values-bs/strings.xml
@@ -93,7 +93,7 @@
     <string name="bluetooth_profile_sap" msgid="8304170950447934386">"Pristup SIM-u"</string>
     <string name="bluetooth_profile_a2dp_high_quality" msgid="4739440941324792775">"HD audio: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
     <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="2477639096903834374">"HD audio"</string>
-    <string name="bluetooth_profile_hearing_aid" msgid="58154575573984914">"Slušni aparat"</string>
+    <string name="bluetooth_profile_hearing_aid" msgid="58154575573984914">"Slušni aparati"</string>
     <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="8191273236809964030">"Povezan na slušne aparate"</string>
     <string name="bluetooth_a2dp_profile_summary_connected" msgid="7422607970115444153">"Povezano sa zvukom medija"</string>
     <string name="bluetooth_headset_profile_summary_connected" msgid="2420981566026949688">"Povezano na zvuk telefona"</string>
@@ -161,7 +161,7 @@
     <string name="tts_default_pitch_title" msgid="6988592215554485479">"Visina glasa"</string>
     <string name="tts_default_pitch_summary" msgid="9132719475281551884">"Utiče na ton sintetiziranog govora"</string>
     <string name="tts_default_lang_title" msgid="4698933575028098940">"Jezik"</string>
-    <string name="tts_lang_use_system" msgid="6312945299804012406">"Korištenje sistemskog jezika"</string>
+    <string name="tts_lang_use_system" msgid="6312945299804012406">"Koristi jezik sistema"</string>
     <string name="tts_lang_not_selected" msgid="7927823081096056147">"Jezik nije izabran"</string>
     <string name="tts_default_lang_summary" msgid="9042620014800063470">"Postavlja glas za dati jezik za izgovoreni tekst"</string>
     <string name="tts_play_example_title" msgid="1599468547216481684">"Poslušajte primjer"</string>
@@ -210,9 +210,9 @@
     <string name="enable_adb_wireless_summary" msgid="7344391423657093011">"Način rada otklanjanja grešaka kada je WiFi mreža povezana"</string>
     <string name="adb_wireless_error" msgid="721958772149779856">"Greška"</string>
     <string name="adb_wireless_settings" msgid="2295017847215680229">"Bežično otklanjanje grešaka"</string>
-    <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Da vidite i koristite dostupne uređaje, uključite otklanjanje grešaka putem bežične veze"</string>
+    <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Da vidite i koristite dostupne uređaje, uključite bežično otklanjanje grešaka"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Uparite uređaj pomoću QR koda"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"Uparite nove uređaje pomoću skenera QR koda"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"Uparite nove uređaje pomoću skenera QR koda"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Uparite uređaj pomoću koda za uparivanje"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Uparite nove uređaje pomoću šestocifrenog koda"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"Upareni uređaji"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Uparivanje uređaja nije uspjelo. QR kȏd nije tačan ili uređaj nije povezan na istu mrežu."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"IP adresa i priključak"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"Skenirajte QR kôd"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"Uparite uređaj putem WiFi-ja skeniranjem QR koda"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Uparite uređaj putem WiFi-ja skeniranjem QR koda"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Povežite se na WiFi mrežu"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, otklanjanje grešaka, programer"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"Prečica za izvještaj o greškama"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"Certifikacija bežičnog prikaza"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"Omogući detaljni zapisnik za WiFi"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"Reguliranje skeniranja WiFi mreže"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"Nasum. odabir MAC-a poboljšan WiFi-jem"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"Prijenos podataka na mobilnoj mreži je uvijek aktivan"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"Hardversko ubrzavanje za povezivanje putem mobitela"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Prikaži Bluetooth uređaje bez naziva"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Prikaz opcija za certifikaciju bežičnog prikaza"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Povećani nivo zapisnika za WiFi. Prikaz po SSID RSSI-ju u Biraču WiFi-ja"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Smanjuje potrošnju baterije i poboljšava performanse mreže"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Ovo aktiviranje/deaktiviranje utiče na ponašanje nasumičnog odabira MAC adrese isključivo za način rada klijenta.\nKada je taj način aktiviran, na svakoj mreži na kojoj je omogućen nasumični odabir MAC adrese može doći do ponovnog nasumičnog odabira MAC adrese za vrijeme povezivanja, u zavisnosti od toga kada je posljednji put prekinuta povezanost klijenta s mrežom. Do ponovnog nasumičnog odabira ne dolazi ako se uređaj ponovo poveže u roku od 4 sata ili ranije."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"S naplatom"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"Mreža bez naplate"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"Veličine međumemorije zapisnika"</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"Prikaz dijaloga \"Aplikacija ne reagira\" za aplikacije pokrenute u pozadini"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Prikaži upozorenja kanala obavještenja"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Prikaz upozorenja na ekranu kada aplikacija pošalje obavještenje bez važećeg kanala"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Primijeni prečice za obavještenja o razgovorima"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Traži da obavještenja imaju dugotrajnu prečicu za dijeljenje radi prikaza u odjeljku za razgovore"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"Nametni aplikacije na vanjskoj pohrani"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Omogućava upisivanje svih aplikacija u vanjsku pohranu, bez obzira na prikazane vrijednosti"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"Nametni aktivnostima mijenjanje veličina"</string>
@@ -417,7 +421,7 @@
     <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomalija (crveno-zeleno)"</string>
     <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomalija (plavo-žuto)"</string>
     <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Ispravka boje"</string>
-    <string name="accessibility_display_daltonizer_preference_subtitle" msgid="1284746051652993443">"Korekcija boje vam dozvoljava da prilagodite način prikazivanja boja na uređaju"</string>
+    <string name="accessibility_display_daltonizer_preference_subtitle" msgid="1284746051652993443">"Ispravka boje vam dozvoljava da prilagodite način prikazivanja boja na uređaju"</string>
     <string name="daltonizer_type_overridden" msgid="4509604753672535721">"Zamjenjuje <xliff:g id="TITLE">%1$s</xliff:g>"</string>
     <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> – <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
     <string name="power_remaining_duration_only" msgid="8264199158671531431">"Preostalo je još oko <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
@@ -432,10 +436,14 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"Trebala bi trajati otprilike do <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"Do <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Baterija bi se mogla isprazniti do <xliff:g id="TIME">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"Preostalo je manje od <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"Preostalo je manje od <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"Preostalo je više od <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"Preostalo je više od: <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"Telefon će se uskoro isključiti"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"Tablet će se uskoro isključiti"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"Uređaj će se uskoro isključiti"</string>
@@ -476,7 +484,7 @@
     <string name="retail_demo_reset_next" msgid="3688129033843885362">"Naprijed"</string>
     <string name="retail_demo_reset_title" msgid="1866911701095959800">"Potrebna je lozinka"</string>
     <string name="active_input_method_subtypes" msgid="4232680535471633046">"Aktivne metode unosa"</string>
-    <string name="use_system_language_to_select_input_method_subtypes" msgid="4865195835541387040">"Koristite jezik sistema"</string>
+    <string name="use_system_language_to_select_input_method_subtypes" msgid="4865195835541387040">"Koristi jezik sistema"</string>
     <string name="failed_to_open_app_settings_toast" msgid="764897252657692092">"Otvaranje postavki za <xliff:g id="SPELL_APPLICATION_NAME">%1$s</xliff:g> nije uspjelo"</string>
     <string name="ime_security_warning" msgid="6547562217880551450">"Ovaj način unosa može prikupiti sav tekst koji upišete, uključujući lične podatke kao što su lozinke i brojevi kreditnih kartica. Način omogućava aplikacija <xliff:g id="IME_APPLICATION_NAME">%1$s</xliff:g>. Da li želite koristiti ovaj način unosa?"</string>
     <string name="direct_boot_unaware_dialog_message" msgid="7845398276735021548">"Napomena: Nakon ponovnog pokretanja, ova aplikacija se neće moći pokrenuti dok ne otključate telefon"</string>
@@ -530,7 +538,7 @@
     <string name="user_add_user_item_title" msgid="2394272381086965029">"Korisnik"</string>
     <string name="user_add_profile_item_title" msgid="3111051717414643029">"Ograničeni profil"</string>
     <string name="user_add_user_title" msgid="5457079143694924885">"Dodati novog korisnika?"</string>
-    <string name="user_add_user_message_long" msgid="1527434966294733380">"Za dijeljenje ovog uređaja s drugima možete napraviti dodatne korisnike. Svaki korisnik ima svoj prostor koji može prilagoditi pomoću aplikacija, pozadinske slike i slično. Korisnici također mogu prilagoditi postavke uređaja koje utiču na sve ostale korisnike, kao što je WiFi.\n\nKada dodate novog korisnika, ta osoba treba postaviti svoj prostor.\n\nSvaki korisnik može ažurirati aplikacije za sve ostale korisnike. Postavke i usluge pristupačnosti možda se neće prenijeti na novog korisnika."</string>
+    <string name="user_add_user_message_long" msgid="1527434966294733380">"Ovaj uređaj možete dijeliti s drugima ako napravite dodatne korisnike. Svaki korisnik ima svoj prostor koji može prilagoditi pomoću aplikacija, pozadinske slike i slično. Korisnici također mogu prilagoditi postavke uređaja koje utiču na sve ostale korisnike, kao što je WiFi.\n\nKada dodate novog korisnika, ta osoba treba postaviti svoj prostor.\n\nSvaki korisnik može ažurirati aplikacije za sve ostale korisnike. Postavke i usluge pristupačnosti možda se neće prenijeti na novog korisnika."</string>
     <string name="user_add_user_message_short" msgid="3295959985795716166">"Kada dodate novog korisnika, ta osoba treba postaviti svoj prostor. \n\n Svaki korisnik može ažurirati aplikacije za sve ostale korisnike."</string>
     <string name="user_setup_dialog_title" msgid="8037342066381939995">"Postaviti korisnika sada?"</string>
     <string name="user_setup_dialog_message" msgid="269931619868102841">"Provjerite može li osoba uzeti uređaj i postaviti svoj prostor"</string>
@@ -540,8 +548,8 @@
     <string name="user_add_user_type_title" msgid="551279664052914497">"Dodaj"</string>
     <string name="user_new_user_name" msgid="60979820612818840">"Novi korisnik"</string>
     <string name="user_new_profile_name" msgid="2405500423304678841">"Novi profil"</string>
-    <string name="user_info_settings_title" msgid="6351390762733279907">"Podaci o korisniku"</string>
-    <string name="profile_info_settings_title" msgid="105699672534365099">"Podaci o profilu"</string>
+    <string name="user_info_settings_title" msgid="6351390762733279907">"Informacije o korisniku"</string>
+    <string name="profile_info_settings_title" msgid="105699672534365099">"Informacije o profilu"</string>
     <string name="user_need_lock_message" msgid="4311424336209509301">"Prije nego vam se omogući kreiranje ograničenog profila, morate postaviti zaključavanje ekrana da biste zaštitili svoje aplikacije i lične podatke."</string>
     <string name="user_set_lock_button" msgid="1427128184982594856">"Postaviti zaključavanje"</string>
     <string name="user_switch_to_user" msgid="6975428297154968543">"Prebaci na korisnika <xliff:g id="USER_NAME">%s</xliff:g>"</string>
diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml
index 765d442..ffa55af 100644
--- a/packages/SettingsLib/res/values-ca/strings.xml
+++ b/packages/SettingsLib/res/values-ca/strings.xml
@@ -61,7 +61,7 @@
     <string name="speed_label_medium" msgid="9078405312828606976">"Mitjana"</string>
     <string name="speed_label_fast" msgid="2677719134596044051">"Ràpida"</string>
     <string name="speed_label_very_fast" msgid="8215718029533182439">"Molt ràpida"</string>
-    <string name="wifi_passpoint_expired" msgid="6540867261754427561">"Caducat"</string>
+    <string name="wifi_passpoint_expired" msgid="6540867261754427561">"Caducada"</string>
     <string name="preference_summary_default_combination" msgid="2644094566845577901">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
     <string name="bluetooth_disconnected" msgid="7739366554710388701">"Desconnectat"</string>
     <string name="bluetooth_disconnecting" msgid="7638892134401574338">"S\'està desconnectant..."</string>
@@ -88,7 +88,7 @@
     <string name="bluetooth_profile_pan" msgid="1006235139308318188">"Accés a Internet"</string>
     <string name="bluetooth_profile_pbap" msgid="7064307749579335765">"Compartició de contactes"</string>
     <string name="bluetooth_profile_pbap_summary" msgid="2955819694801952056">"S\'utilitza per compartir contactes."</string>
-    <string name="bluetooth_profile_pan_nap" msgid="7871974753822470050">"Connexió compartida a Internet"</string>
+    <string name="bluetooth_profile_pan_nap" msgid="7871974753822470050">"Compartició de connexió d\'Internet"</string>
     <string name="bluetooth_profile_map" msgid="8907204701162107271">"Missatges de text"</string>
     <string name="bluetooth_profile_sap" msgid="8304170950447934386">"Accés a la SIM"</string>
     <string name="bluetooth_profile_a2dp_high_quality" msgid="4739440941324792775">"Àudio HD: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
@@ -195,7 +195,7 @@
   </string-array>
     <string name="choose_profile" msgid="343803890897657450">"Tria un perfil"</string>
     <string name="category_personal" msgid="6236798763159385225">"Personal"</string>
-    <string name="category_work" msgid="4014193632325996115">"Feina"</string>
+    <string name="category_work" msgid="4014193632325996115">"Treball"</string>
     <string name="development_settings_title" msgid="140296922921597393">"Opcions per a desenvolupadors"</string>
     <string name="development_settings_enable" msgid="4285094651288242183">"Activa les opcions per a desenvolupadors"</string>
     <string name="development_settings_summary" msgid="8718917813868735095">"Defineix les opcions per al desenvolupament d\'aplicacions"</string>
@@ -212,7 +212,7 @@
     <string name="adb_wireless_settings" msgid="2295017847215680229">"Depuració sense fil"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Per veure i utilitzar els dispositius disponibles, activa la depuració sense fil"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Vincula el dispositiu amb un codi QR"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"Vincula dispositius nous utilitzant l\'escàner de codis QR"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"Vincula dispositius nous utilitzant l\'escàner de codis QR"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Vincula el dispositiu amb un codi de vinculació"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Vincula dispositius nous utilitzant un codi de sis dígits"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"Dispositius vinculats"</string>
@@ -226,12 +226,12 @@
     <string name="adb_pairing_device_dialog_pairing_code_label" msgid="3639239786669722731">"Codi de vinculació Wi‑Fi"</string>
     <string name="adb_pairing_device_dialog_failed_title" msgid="3426758947882091735">"No s\'ha pogut vincular"</string>
     <string name="adb_pairing_device_dialog_failed_msg" msgid="6611097519661997148">"Assegura\'t que el dispositiu estigui connectat a la mateixa xarxa."</string>
-    <string name="adb_wireless_qrcode_summary" msgid="8051414549011801917">"Vincula el dispositiu per Wi‑Fi escanejant un codi QR"</string>
+    <string name="adb_wireless_qrcode_summary" msgid="8051414549011801917">"Escaneja un codi QR per vincular el dispositiu per Wi‑Fi"</string>
     <string name="adb_wireless_verifying_qrcode_text" msgid="6123192424916029207">"S\'està vinculant el dispositiu…"</string>
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"No s\'ha pogut vincular el dispositiu. O bé el codi QR és incorrecte, o bé el dispositiu no està connectat a la mateixa xarxa."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"Adreça IP i port"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"Escaneja un codi QR"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"Vincula el dispositiu per Wi‑Fi escanejant un codi QR"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Vincula el dispositiu per Wi‑Fi escanejant un codi QR"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Connecta\'t a una xarxa Wi‑Fi"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, depurar, desenvolupador"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"Drecera per a informe d\'errors"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"Certificació de pantalla sense fil"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"Activa el registre Wi‑Fi detallat"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"Limitació de la cerca de xarxes Wi‑Fi"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"Aleatorització de MAC millorada per Wi‑Fi"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"Dades mòbils sempre actives"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"Acceleració per maquinari per a compartició de xarxa"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Mostra els dispositius Bluetooth sense el nom"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Mostra les opcions per a la certificació de pantalla sense fil"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Augmenta nivell de registre Wi‑Fi, mostra\'l per SSID RSSI al selector de Wi‑Fi"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Redueix el consum de bateria i millora el rendiment de la xarxa"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Aquest commutador afecta el comportament de l\'aleatorització d\'adreces MAC només en el mode client.\nQuan aquest mode està activat, és possible que les adreces MAC de les xarxes que tinguin activada l’aleatorització es tornin a ordenar de manera aleatòria durant l’associació, en funció de l\'última vegada que el client s\'ha desconnectat de la xarxa. Les adreces no es tornen a ordenar de manera aleatòria si el dispositiu es torna a connectar abans de 4 hores."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"D\'ús mesurat"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"D\'ús no mesurat"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"Mides de la mem. intermèdia del registrador"</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"Mostra el quadre de diàleg L\'aplicació no respon per a aplicacions en segon pla"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Mostra avisos del canal de notificacions"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Mostra un avís en pantalla quan una aplicació publica una notificació sense un canal vàlid"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Aplica dreceres per a notificacions de converses"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Requereix que les notificacions tinguin una drecera permanent de compartició perquè apareguin a la secció de converses"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"Força permetre aplicacions de manera externa"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Permet que qualsevol aplicació es pugui escriure en un dispositiu d’emmagatzematge extern, independentment dels valors definits"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"Força l\'ajust de la mida de les activitats"</string>
@@ -416,8 +420,8 @@
     <string name="daltonizer_mode_deuteranomaly" msgid="3507284319584683963">"Deuteranomalia (vermell-verd)"</string>
     <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomalia (vermell-verd)"</string>
     <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomalia (blau-groc)"</string>
-    <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Correcció del color"</string>
-    <string name="accessibility_display_daltonizer_preference_subtitle" msgid="1284746051652993443">"La correcció del color permet ajustar com es mostren els colors al teu dispositiu"</string>
+    <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Correcció de color"</string>
+    <string name="accessibility_display_daltonizer_preference_subtitle" msgid="1284746051652993443">"La correcció de color permet ajustar com es mostren els colors al teu dispositiu"</string>
     <string name="daltonizer_type_overridden" msgid="4509604753672535721">"S\'ha substituït per <xliff:g id="TITLE">%1$s</xliff:g>"</string>
     <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g>: <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
     <string name="power_remaining_duration_only" msgid="8264199158671531431">"Temps restant aproximat: <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
@@ -432,10 +436,14 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"Hauria de durar aproximadament fins a les <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"Fins a les <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"És possible que la bateria s\'esgoti a les <xliff:g id="TIME">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"Temps restant inferior a <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"Temps restant inferior a <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"Temps restant superior a <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"Temps restant superior a <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"És possible que el telèfon s\'apagui aviat"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"És possible que la tauleta s\'apagui aviat"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"És possible que el dispositiu s\'apagui aviat"</string>
@@ -504,7 +512,7 @@
     <string name="alarm_template_far" msgid="6382760514842998629">"Data: <xliff:g id="WHEN">%1$s</xliff:g>"</string>
     <string name="zen_mode_duration_settings_title" msgid="1553451650289651489">"Durada"</string>
     <string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Pregunta sempre"</string>
-    <string name="zen_mode_forever" msgid="3339224497605461291">"Fins que no ho desactivis"</string>
+    <string name="zen_mode_forever" msgid="3339224497605461291">"Fins que no el desactivis"</string>
     <string name="time_unit_just_now" msgid="3006134267292728099">"Ara mateix"</string>
     <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Altaveu del telèfon"</string>
     <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Hi ha hagut un problema amb la connexió. Desactiva el dispositiu i torna\'l a activar."</string>
@@ -529,17 +537,17 @@
     <string name="user_add_user_item_title" msgid="2394272381086965029">"Usuari"</string>
     <string name="user_add_profile_item_title" msgid="3111051717414643029">"Perfil restringit"</string>
     <string name="user_add_user_title" msgid="5457079143694924885">"Vols afegir un usuari nou?"</string>
-    <string name="user_add_user_message_long" msgid="1527434966294733380">"Pots compartir aquest dispositiu amb altres usuaris creant usuaris addicionals. Cada usuari té el seu propi espai, que pot personalitzar amb aplicacions i fons de pantalla, entre d\'altres. Els usuaris també poden ajustar opcions de configuració del dispositiu, com ara la Wi-Fi, que afecten els altres usuaris.\n\nQuan afegeixis un usuari nou, haurà de configurar el seu espai.\n\nTots els usuaris poden actualitzar les aplicacions de la resta. És possible que la configuració i els serveis d\'accessibilitat no es transfereixin a l\'usuari nou."</string>
+    <string name="user_add_user_message_long" msgid="1527434966294733380">"Pots compartir aquest dispositiu amb altres persones creant usuaris addicionals. Cada usuari té el seu propi espai, que pot personalitzar amb aplicacions i fons de pantalla, entre d\'altres. Els usuaris també poden ajustar opcions de configuració del dispositiu, com ara la Wi-Fi, que afecten els altres usuaris.\n\nQuan afegeixis un usuari nou, haurà de configurar el seu espai.\n\nTots els usuaris poden actualitzar les aplicacions de la resta. És possible que la configuració i els serveis d\'accessibilitat no es transfereixin a l\'usuari nou."</string>
     <string name="user_add_user_message_short" msgid="3295959985795716166">"Quan s\'afegeix un usuari nou, aquest usuari ha de configurar el seu espai.\n\nQualsevol usuari pot actualitzar les aplicacions dels altres usuaris."</string>
     <string name="user_setup_dialog_title" msgid="8037342066381939995">"Vols configurar l\'usuari ara?"</string>
-    <string name="user_setup_dialog_message" msgid="269931619868102841">"Comprova que l\'usuari pugui accedir al dispositiu i configurar el seu espai."</string>
+    <string name="user_setup_dialog_message" msgid="269931619868102841">"Assegura\'t que la persona estigui disponible per accedir al dispositiu i configurar el seu espai."</string>
     <string name="user_setup_profile_dialog_message" msgid="4788197052296962620">"Vols configurar el perfil ara?"</string>
     <string name="user_setup_button_setup_now" msgid="1708269547187760639">"Configura ara"</string>
     <string name="user_setup_button_setup_later" msgid="8712980133555493516">"Ara no"</string>
     <string name="user_add_user_type_title" msgid="551279664052914497">"Afegeix"</string>
     <string name="user_new_user_name" msgid="60979820612818840">"Usuari nou"</string>
     <string name="user_new_profile_name" msgid="2405500423304678841">"Perfil nou"</string>
-    <string name="user_info_settings_title" msgid="6351390762733279907">"Info. de l\'usuari"</string>
+    <string name="user_info_settings_title" msgid="6351390762733279907">"Informació de l\'usuari"</string>
     <string name="profile_info_settings_title" msgid="105699672534365099">"Informació de perfil"</string>
     <string name="user_need_lock_message" msgid="4311424336209509301">"Per crear un perfil restringit, has de configurar una pantalla de bloqueig per protegir les aplicacions i les dades personals."</string>
     <string name="user_set_lock_button" msgid="1427128184982594856">"Defineix un bloqueig"</string>
diff --git a/packages/SettingsLib/res/values-cs/strings.xml b/packages/SettingsLib/res/values-cs/strings.xml
index ed2db3a..504cc5e 100644
--- a/packages/SettingsLib/res/values-cs/strings.xml
+++ b/packages/SettingsLib/res/values-cs/strings.xml
@@ -212,7 +212,7 @@
     <string name="adb_wireless_settings" msgid="2295017847215680229">"Bezdrátové ladění"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Chcete-li zobrazit a použít dostupná zařízení, zapněte bezdrátové ladění"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Párovat zařízení pomocí QR kódu"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"Párovat nová zařízení pomocí skenování QR kódu"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"Párovat nová zařízení pomocí skeneru QR kódů"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Párovat zařízení pomocí párovacího kódu"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Párovat nová zařízení pomocí šestimístného kódu"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"Spárovaná zařízení"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Spárování zařízení se nezdařilo. Buď byl QR kód chybný, nebo zařízení není připojeno ke stejné síti."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"IP adresa a port"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"Naskenování QR kódu"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"Párovat zařízení přes Wi-Fi naskenováním QR kódu"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Párovat zařízení přes Wi-Fi naskenováním QR kódu"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Připojte se k síti Wi-Fi"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, ladění, vývoj"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"Zástupce hlášení chyb"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"Certifikace bezdrát. displeje"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"Podrobné protokolování Wi‑Fi"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"Přibrždění vyhledávání Wi‑Fi"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"Vylepšená randomizace adres MAC pro WiFi"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"Mobilní data jsou vždy aktivní"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"Hardwarová akcelerace tetheringu"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Zobrazovat zařízení Bluetooth bez názvů"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Zobrazit možnosti certifikace bezdrátového displeje"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Zvýšit úroveň protokolování Wi‑Fi zobrazenou v SSID a RSSI při výběru sítě Wi‑Fi."</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Snižuje vyčerpávání baterie a vylepšuje výkon sítě"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Tento přepínač má vliv pouze na chování randomizace adres MAC pro režim klienta.\nKdyž je tento režim aktivován, u sítí s povolenou randomizací adresa MAC mohou být během přidružování adresy MAC randomizovány znovu, podle toho, kdy se klient od sítě naposledy odpojil. Opětovná randomizace se neprovádí, pokud se zařízení připojí znovu do 4 hodin."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"Měřená"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"Neměřená"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"Vyrovnávací paměť protokol. nástroje"</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"Zobrazovat dialog „Aplikace neodpovídá“ pro aplikace na pozadí"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Zobrazovat upozornění ohledně kanálu oznámení"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Když aplikace odešle oznámení bez platného kanálu, na obrazovce se zobrazí upozornění"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"U oznámení konverzací vyžadovat zkratky"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"V sekci konverzace zobrazovat pouze oznámení podložená dlouhodobými sdílecími zkratkami"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"Vynutit povolení aplikací na externím úložišti"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Každou aplikaci bude možné zapsat do externího úložiště, bez ohledu na hodnoty manifestu"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"Vynutit možnost změny velikosti aktivit"</string>
@@ -432,10 +436,14 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"Vydrží asi do <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"Do <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Baterie se může vybít do <xliff:g id="TIME">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"Zbývá méně než <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"Zbývá méně než <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"Zbývá více než <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"Zbývá více než <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"Telefon se brzy vypne"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"Tablet se brzy vypne"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"Zařízení se brzy vypne"</string>
diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml
index f682b15..2f929f7 100644
--- a/packages/SettingsLib/res/values-da/strings.xml
+++ b/packages/SettingsLib/res/values-da/strings.xml
@@ -206,13 +206,13 @@
     <string name="enable_adb" msgid="8072776357237289039">"USB-fejlretning"</string>
     <string name="enable_adb_summary" msgid="3711526030096574316">"Fejlretningstilstand, når USB er tilsluttet"</string>
     <string name="clear_adb_keys" msgid="3010148733140369917">"Tilbagekald tilladelser for USB-fejlretning"</string>
-    <string name="enable_adb_wireless" msgid="6973226350963971018">"Trådløs fejlfinding"</string>
+    <string name="enable_adb_wireless" msgid="6973226350963971018">"Trådløs fejlretning"</string>
     <string name="enable_adb_wireless_summary" msgid="7344391423657093011">"Fejlfindingstilstand, når der er Wi-Fi-forbindelse"</string>
     <string name="adb_wireless_error" msgid="721958772149779856">"Fejl"</string>
-    <string name="adb_wireless_settings" msgid="2295017847215680229">"Trådløs fejlfinding"</string>
+    <string name="adb_wireless_settings" msgid="2295017847215680229">"Trådløs fejlretning"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Du kan se og bruge tilgængelige enheder ved at aktivere trådløs fejlretning"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Dan par med en enhed ved hjælp af en QR-kode"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"Dan par med nye enheder ved hjælp af QR-kodescanneren"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"Dan par med nye enheder ved hjælp af QR-kodescanneren"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Dan par med en enhed ved hjælp af en parringskode"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Dan par med nye enheder ved hjælp af den sekscifrede kode"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"Parrede enheder"</string>
@@ -231,11 +231,11 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Enheden blev ikke parret. Det skyldes enten, at QR-koden var forkert, eller at enheden ikke er forbundet til det samme netværk."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"IP-adresse og port"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"Scan QR-kode"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"Dan par med en enhed via Wi-Fi ved at scanne en QR-kode"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Dan par med en enhed via Wi-Fi ved at scanne en QR-kode"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Opret forbindelse til et Wi-Fi-netværk"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, fejlfinding, dev"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"Genvej til fejlrapportering"</string>
-    <string name="bugreport_in_power_summary" msgid="1885529649381831775">"Vis en knap til oprettelse af fejlrapporter i afbrydermenuen"</string>
+    <string name="bugreport_in_power_summary" msgid="1885529649381831775">"Vis en knap til oprettelse af fejlrapporter i menuen for afbryderknappen"</string>
     <string name="keep_screen_on" msgid="1187161672348797558">"Lås ikke"</string>
     <string name="keep_screen_on_summary" msgid="1510731514101925829">"Skærmen går ikke i dvale under opladning"</string>
     <string name="bt_hci_snoop_log" msgid="7291287955649081448">"Aktivér Bluetooth HCI spionlog"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"Certificering af trådløs skærm"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"Aktivér detaljeret Wi-Fi-logføring"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"Begrænsning af Wi-Fi-scanning"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"Wi‑Fi‑forbedret MAC-randomisering"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"Mobildata er altid aktiveret"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"Hardwareacceleration ved netdeling"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Vis Bluetooth-enheder uden navne"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Vis valgmuligheder for certificering af trådløs skærm"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Øg mængden af Wi‑Fi-logføring. Vis opdelt efter SSID RSSI i Wi‑Fi-vælgeren"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Reducerer batteriforbruget og forbedrer netværkets effektivitet"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Denne skift påvirker kun MAC-randomisering for klienttilstand.\nNår denne tilstand er aktiveret, kan netværk, der har Mac-randomisering aktiveret, få deres MAC-adresser randomiseret igen, når der oprettes forbindelse, afhængigt af hvornår klienten sidst afbrød forbindelse til netværket. Randomisering sker ikke igen, hvis enheden forbinder igen inden for højst 4 timer."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"Forbrugsafregnet"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"Ikke forbrugsafregnet"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"Størrelser for Logger-buffer"</string>
@@ -300,7 +302,7 @@
     <string name="tethering_hardware_offload_summary" msgid="7801345335142803029">"Brug hardwareacceleration ved netdeling, hvis det er muligt"</string>
     <string name="adb_warning_title" msgid="7708653449506485728">"Vil du tillade USB-fejlretning?"</string>
     <string name="adb_warning_message" msgid="8145270656419669221">"USB-fejlretning er kun beregnet til udvikling og kan bruges til at kopiere data mellem din computer og enheden, installere apps på enheden uden notifikation og læse logdata."</string>
-    <string name="adbwifi_warning_title" msgid="727104571653031865">"Vil du tillade trådløs fejlfinding?"</string>
+    <string name="adbwifi_warning_title" msgid="727104571653031865">"Vil du tillade trådløs fejlretning?"</string>
     <string name="adbwifi_warning_message" msgid="8005936574322702388">"Trådløs fejlretning er kun beregnet til udvikling og kan bruges til at kopiere data mellem din computer og enheden, installere apps på enheden uden notifikation og læse logdata."</string>
     <string name="adb_keys_warning_message" msgid="2968555274488101220">"Vil du ophæve adgangen til USB-fejlretning for alle computere, du tidligere har godkendt?"</string>
     <string name="dev_settings_warning_title" msgid="8251234890169074553">"Vil du tillade udviklingsindstillinger?"</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"Vis dialogboksen \"Appen svarer ikke\" for baggrundsapps"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Vis advarsler om notifikationskanal"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Viser en advarsel, når en app sender en notifikation uden en gyldig kanal"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Kræv genveje til samtalenotifikationer"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Kræv, at notifikationer bakkes op af en langvarig delingsgenvej, hvis de skal vises i samtalesektionen"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"Gennemtving tilladelse til eksternt lager"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Gør det muligt at overføre enhver app til et eksternt lager uafhængigt af manifestværdier"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"Gennemtving, at aktiviteter kan tilpasses"</string>
@@ -432,10 +436,14 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"Bør holde indtil ca. <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"Indtil <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Enheden løber muligvis tør for batteri inden <xliff:g id="TIME">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"Der er mindre end <xliff:g id="THRESHOLD">%1$s</xliff:g> tilbage"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"Der er mindre end <xliff:g id="THRESHOLD">%1$s</xliff:g> tilbage (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"Der er mere end <xliff:g id="TIME_REMAINING">%1$s</xliff:g> tilbage (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"Der er mere end <xliff:g id="TIME_REMAINING">%1$s</xliff:g> tilbage"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"Telefonen lukker muligvis snart ned"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"Denne tablet lukker muligvis snart ned"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"Enheden lukker muligvis snart ned"</string>
@@ -529,7 +537,7 @@
     <string name="user_add_user_item_title" msgid="2394272381086965029">"Bruger"</string>
     <string name="user_add_profile_item_title" msgid="3111051717414643029">"Begrænset profil"</string>
     <string name="user_add_user_title" msgid="5457079143694924885">"Vil du tilføje en ny bruger?"</string>
-    <string name="user_add_user_message_long" msgid="1527434966294733380">"Du kan dele denne enhed med andre ved at oprette ekstra brugere. Hver bruger har sit eget rum, som kan tilpasses med apps, baggrund osv. Brugerne kan også justere enhedsindstillinger, som for eksempel Wi-Fi, som påvirker alle.\n\nNår du tilføjer en ny bruger, skal vedkommende konfigurere sit rum.\n\nAlle brugere kan opdatere apps for alle andre brugere. Indstillinger og tjenester for hjælpefunktioner overføres muligvis ikke til den nye bruger."</string>
+    <string name="user_add_user_message_long" msgid="1527434966294733380">"Du kan dele denne enhed med andre ved at oprette ekstra brugere. Hver bruger har sit personlige område, som kan tilpasses med apps, baggrund osv. Brugerne kan også justere enhedsindstillinger, som for eksempel Wi-Fi, som påvirker alle.\n\nNår du tilføjer en ny bruger, skal vedkommende konfigurere sit område.\n\nAlle brugere kan opdatere apps for alle andre brugere. Indstillinger og tjenester for hjælpefunktioner overføres muligvis ikke til den nye bruger."</string>
     <string name="user_add_user_message_short" msgid="3295959985795716166">"Når du tilføjer en ny bruger, skal personen konfigurere sit rum.\n\nEnhver bruger kan opdatere apps for alle andre brugere."</string>
     <string name="user_setup_dialog_title" msgid="8037342066381939995">"Vil du konfigurere brugeren nu?"</string>
     <string name="user_setup_dialog_message" msgid="269931619868102841">"Sørg for, at brugeren har mulighed for at tage enheden og konfigurere sit eget rum"</string>
diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml
index 7918022..7838a0c 100644
--- a/packages/SettingsLib/res/values-de/strings.xml
+++ b/packages/SettingsLib/res/values-de/strings.xml
@@ -194,7 +194,7 @@
     <item msgid="581904787661470707">"Am schnellsten"</item>
   </string-array>
     <string name="choose_profile" msgid="343803890897657450">"Profil auswählen"</string>
-    <string name="category_personal" msgid="6236798763159385225">"Nutzer"</string>
+    <string name="category_personal" msgid="6236798763159385225">"Privat"</string>
     <string name="category_work" msgid="4014193632325996115">"Geschäftlich"</string>
     <string name="development_settings_title" msgid="140296922921597393">"Entwickleroptionen"</string>
     <string name="development_settings_enable" msgid="4285094651288242183">"Entwickleroptionen aktivieren"</string>
@@ -206,13 +206,13 @@
     <string name="enable_adb" msgid="8072776357237289039">"USB-Debugging"</string>
     <string name="enable_adb_summary" msgid="3711526030096574316">"Debugmodus bei Anschluss über USB"</string>
     <string name="clear_adb_keys" msgid="3010148733140369917">"USB-Debugging-Autorisierungen aufheben"</string>
-    <string name="enable_adb_wireless" msgid="6973226350963971018">"Kabelloses Debugging"</string>
+    <string name="enable_adb_wireless" msgid="6973226350963971018">"Debugging über WLAN"</string>
     <string name="enable_adb_wireless_summary" msgid="7344391423657093011">"Debugging-Modus, wenn eine WLAN-Verbindung besteht"</string>
     <string name="adb_wireless_error" msgid="721958772149779856">"Fehler"</string>
-    <string name="adb_wireless_settings" msgid="2295017847215680229">"Kabelloses Debugging"</string>
-    <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Aktiviere das kabellose Debugging, um verfügbare Geräte zu sehen und zu verwenden"</string>
+    <string name="adb_wireless_settings" msgid="2295017847215680229">"Debugging über WLAN"</string>
+    <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Aktiviere \"Debugging über WLAN\", um verfügbare Geräte zu sehen und zu verwenden"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Gerät über einen QR-Code koppeln"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"Neue Geräte über QR-Codescanner koppeln"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"Neue Geräte über QR-Codescanner koppeln"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Gerät über einen Kopplungscode koppeln"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Neue Geräte mit sechsstelligem Code koppeln"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"Gekoppelte Geräte"</string>
@@ -231,11 +231,11 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Das Gerät konnte nicht gekoppelt werden. Der QR-Code war nicht korrekt oder das Gerät ist nicht mit demselben Netzwerk verbunden."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"IP-Adresse &amp; Port"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"QR-Code scannen"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"Scanne einen QR-Code, um ein Gerät über WLAN zu koppeln"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Scanne einen QR-Code, um ein Gerät über WLAN zu koppeln"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Bitte stell eine WLAN-Verbindung her"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"ADB, Debug, Dev"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"Verknüpfung zu Fehlerbericht"</string>
-    <string name="bugreport_in_power_summary" msgid="1885529649381831775">"Im Menü \"Ein/Aus\" wird eine Option zum Erstellen eines Fehlerberichts angezeigt"</string>
+    <string name="bugreport_in_power_summary" msgid="1885529649381831775">"Im Ein-/Aus-Menü wird eine Option zum Erstellen eines Fehlerberichts angezeigt"</string>
     <string name="keep_screen_on" msgid="1187161672348797558">"Aktiv lassen"</string>
     <string name="keep_screen_on_summary" msgid="1510731514101925829">"Display wird beim Laden nie in den Ruhezustand versetzt"</string>
     <string name="bt_hci_snoop_log" msgid="7291287955649081448">"Bluetooth HCI-Snoop-Protokoll aktivieren"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"Zertifizierung für kabellose Übertragung"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"Ausführliche WLAN-Protokollierung aktivieren"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"Drosselung der WLAN-Suche"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"WLAN-erweiterte MAC-Adressrandomisierung"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"Mobile Datennutzung immer aktiviert"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"Hardwarebeschleunigung für Tethering"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Bluetooth-Geräte ohne Namen anzeigen"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Optionen zur Zertifizierung für kabellose Übertragung anzeigen"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"WLAN-Protokollierungsebene erhöhen, pro SSID RSSI in WiFi Picker anzeigen"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Verringert den Akkuverbrauch und verbessert die Netzwerkleistung"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Hiermit wird das Verhalten der MAC-Adressrandomisierung ausschließlich für den Clientmodus umgeschaltet.\nWenn dieser Modus aktiviert ist, werden bei allen Netzwerken, bei denen die MAC-Randomisierung aktiviert ist, die MAC-Adressen während der Verknüpfung abhängig davon, wann der Client zuletzt vom Netzwerk getrennt wurde, wieder randomisiert. Die erneute Randomisierung findet nicht statt, wenn die Verbindung des Geräts innerhalb von maximal 4 Stunden wiederhergestellt wird."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"Kostenpflichtig"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"Kostenlos"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"Logger-Puffergrößen"</string>
@@ -300,8 +302,8 @@
     <string name="tethering_hardware_offload_summary" msgid="7801345335142803029">"Falls verfügbar, Hardwarebeschleunigung für Tethering verwenden"</string>
     <string name="adb_warning_title" msgid="7708653449506485728">"USB-Debugging zulassen?"</string>
     <string name="adb_warning_message" msgid="8145270656419669221">"USB-Debugging ist nur für Entwicklungszwecke vorgesehen. Damit kannst du Daten zwischen deinem Computer und deinem Gerät kopieren, Apps auf deinem Gerät ohne Benachrichtigung installieren und Protokolldaten lesen."</string>
-    <string name="adbwifi_warning_title" msgid="727104571653031865">"Kabelloses Debugging zulassen?"</string>
-    <string name="adbwifi_warning_message" msgid="8005936574322702388">"Das kabellose Debugging ist nur für Entwicklungszwecke vorgesehen. Damit kannst du Daten zwischen deinem Computer und deinem Gerät kopieren, Apps auf deinem Gerät ohne Benachrichtigung installieren und Protokolldaten lesen."</string>
+    <string name="adbwifi_warning_title" msgid="727104571653031865">"\"Debugging über WLAN\" zulassen?"</string>
+    <string name="adbwifi_warning_message" msgid="8005936574322702388">"\"Debugging über WLAN\" ist nur für Entwicklungszwecke vorgesehen. Damit kannst du Daten zwischen deinem Computer und deinem Gerät kopieren, Apps auf deinem Gerät ohne Benachrichtigung installieren und Protokolldaten lesen."</string>
     <string name="adb_keys_warning_message" msgid="2968555274488101220">"Zugriff auf USB-Debugging für alle zuvor autorisierten Computer aufheben?"</string>
     <string name="dev_settings_warning_title" msgid="8251234890169074553">"Entwicklungseinstellungen zulassen?"</string>
     <string name="dev_settings_warning_message" msgid="37741686486073668">"Diese Einstellungen sind ausschließlich für Entwicklungszwecke gedacht. Sie können dein Gerät und die darauf installierten Apps beschädigen oder zu unerwünschtem Verhalten führen."</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"Bei Abstürzen von Hintergrund-Apps \"App reagiert nicht\"-Dialog anzeigen"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Benachrichtigungskanal- Warnungen anzeigen"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Bei Benachrichtigungen ohne gültigen Kanal wird eine Warnung angezeigt"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Tastenkombination für Benachrichtigungen zur Unterhaltung erzwingen"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Benachrichtigungen müssen durch eine langlebige Tastenkombination zum Teilen unterstützt werden, um im Bereich der Unterhaltung zu erscheinen"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"Sperrung des externen Speichers für alle Apps aufheben"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Jede App kann, ungeachtet der Manifestwerte, in den externen Speicher geschrieben werden"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"Aktivitätengröße darf immer angepasst werden"</string>
@@ -432,10 +436,14 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"Sollte etwa bis <xliff:g id="TIME">%1$s</xliff:g> reichen"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"Bis <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Der Akku ist voraussichtlich um <xliff:g id="TIME">%1$s</xliff:g> leer"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"Weniger als <xliff:g id="THRESHOLD">%1$s</xliff:g> verbleibend"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"Weniger als <xliff:g id="THRESHOLD">%1$s</xliff:g> verbleibend (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"Mehr als <xliff:g id="TIME_REMAINING">%1$s</xliff:g> verbleibend (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"Mehr als <xliff:g id="TIME_REMAINING">%1$s</xliff:g> verbleibend"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"Smartphone wird eventuell bald ausgeschaltet"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"Tablet wird eventuell bald ausgeschaltet"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"Gerät wird eventuell bald ausgeschaltet"</string>
@@ -492,7 +500,7 @@
     <string name="accessibility_manual_zen_more_time" msgid="5141801092071134235">"Mehr Zeit."</string>
     <string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Weniger Zeit."</string>
     <string name="cancel" msgid="5665114069455378395">"Abbrechen"</string>
-    <string name="okay" msgid="949938843324579502">"Ok"</string>
+    <string name="okay" msgid="949938843324579502">"OK"</string>
     <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Aktivieren"</string>
     <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"\"Bitte nicht stören\" aktivieren"</string>
     <string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Nie"</string>
diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml
index b4d7c87..f617a93 100644
--- a/packages/SettingsLib/res/values-el/strings.xml
+++ b/packages/SettingsLib/res/values-el/strings.xml
@@ -206,13 +206,13 @@
     <string name="enable_adb" msgid="8072776357237289039">"Εντοπισμός σφαλμάτων USB"</string>
     <string name="enable_adb_summary" msgid="3711526030096574316">"Λειτουργία εντοπισμού σφαλμάτων όταν το USB είναι συνδεδεμένο"</string>
     <string name="clear_adb_keys" msgid="3010148733140369917">"Ανάκληση εξ/σεων εντ/σμού σφ/των USB"</string>
-    <string name="enable_adb_wireless" msgid="6973226350963971018">"Εντοπισμός σφαλμ. ασύρ. σύνδεσης"</string>
+    <string name="enable_adb_wireless" msgid="6973226350963971018">"Ασύρματος εντοπισμός σφαλμάτων"</string>
     <string name="enable_adb_wireless_summary" msgid="7344391423657093011">"Λειτουργία εντοπισμού σφαλμάτων όταν το Wi‑Fi είναι συνδεδεμένο"</string>
     <string name="adb_wireless_error" msgid="721958772149779856">"Σφάλμα"</string>
-    <string name="adb_wireless_settings" msgid="2295017847215680229">"Εντοπισμός σφαλμ. ασύρ. σύνδεσης"</string>
-    <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Για να δείτε και να χρησιμοποιήσετε τις διαθέσιμες συσκευές, ενεργοποιήστε τον εντοπισμό σφαλμάτων ασύρματης σύνδεσης"</string>
+    <string name="adb_wireless_settings" msgid="2295017847215680229">"Ασύρματος εντοπισμός σφαλμάτων"</string>
+    <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Για να δείτε και να χρησιμοποιήσετε τις διαθέσιμες συσκευές, ενεργοποιήστε τον ασύρματο εντοπισμό σφαλμάτων"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Σύζευξη συσκευής με κωδικό QR"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"Σύζευξη νέων συσκευών με τη χρήση σαρωτή κωδικών QR"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"Σύζευξη νέων συσκευών με τη χρήση σαρωτή κωδικών QR"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Σύζευξη συσκευής με κωδικό σύζευξης"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Σύζευξη νέων συσκευών με τη χρήση εξαψήφιου κωδικού"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"Συσκευές σε σύζευξη"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Η σύζευξη της συσκευής απέτυχε. Ο κωδικός QR ήταν λανθασμένος ή η συσκευή δεν είναι συνδεδεμένη στο ίδιο δίκτυο."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"Διεύθυνση IP και θύρα"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"Σάρωση κωδικού QR"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"Σύζευξη συσκευής μέσω Wi‑Fi με τη σάρωση ενός κωδικού QR"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Σύζευξη συσκευής μέσω Wi‑Fi με τη σάρωση ενός κωδικού QR"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Συνδεθείτε σε ένα δίκτυο Wi-Fi"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, εντοπισμός σφαλμάτων, προγραμματιστής"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"Συντόμευση αναφοράς σφαλμάτων"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"Πιστοποίηση ασύρματης οθόνης"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"Ενεργοποίηση λεπτομερ. καταγραφής Wi-Fi"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"Περιορισμός σάρωσης Wi-Fi"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"Ρύθμ. τυχαίας σειράς MAC με βελτ. Wi‑Fi"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"Πάντα ενεργά δεδομένα κινητής τηλεφωνίας"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"Σύνδεση επιτάχυνσης υλικού"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Εμφάνιση συσκευών Bluetooth χωρίς ονόματα"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Εμφάνιση επιλογών για πιστοποίηση ασύρματης οθόνης"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Αύξηση επιπέδου καταγ. Wi-Fi, εμφάνιση ανά SSID RSSI στο εργαλείο επιλογής Wi-Fi"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Περιορίζει την κατανάλωση της μπαταρίας και βελτιώνει την απόδοση του δικτύου"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Αυτός ο διακόπτης επηρεάζει τη συμπεριφορά της ρύθμισης τυχαίας σειράς διευθύνσεων MAC μόνο για τη λειτουργία εφαρμογής πελάτη.\nΌταν αυτή η λειτουργία είναι ενεργοποιημένη, σε όλα τα δίκτυα που είναι ενεργή η ρύθμιση τυχαίας σειράς διευθύνσεων MAC ενδέχεται να αλλάξει ξανά η τυχαία σειρά των διευθύνσεων MAC κατά τη συσχέτιση, ανάλογα με το πότε έγινε η τελευταία αποσύνδεση της εφαρμογής πελάτη από το δίκτυο. Αν η συσκευή επανασυνδεθεί μέσα σε 4 ώρες ή λιγότερες, τότε δεν θα αλλάξει η τυχαία σειρά."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"Μέτρηση με βάση τη χρήση"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"Χωρίς μέτρηση με βάση τη χρήση"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"Μέγεθος προσωρινής μνήμης για τη λειτουργία καταγραφής"</string>
@@ -300,8 +302,8 @@
     <string name="tethering_hardware_offload_summary" msgid="7801345335142803029">"Χρήση της σύνδεσης επιτάχυνσης υλικού εάν υπάρχει"</string>
     <string name="adb_warning_title" msgid="7708653449506485728">"Να επιτρέπεται ο εντοπισμός σφαλμάτων USB;"</string>
     <string name="adb_warning_message" msgid="8145270656419669221">"Ο εντοπισμός σφαλμάτων USB προορίζεται μόνο για σκοπούς προγραμματισμού. Χρησιμοποιήστε τον για αντιγραφή δεδομένων μεταξύ του υπολογιστή και της συσκευής σας, για την εγκατάσταση εφαρμογών στη συσκευή σας χωρίς προειδοποίηση και για την ανάγνωση δεδομένων καταγραφής."</string>
-    <string name="adbwifi_warning_title" msgid="727104571653031865">"Να επιτρέπεται ο εντοπισμός σφαλμάτων ασύρματης σύνδεσης;"</string>
-    <string name="adbwifi_warning_message" msgid="8005936574322702388">"Ο εντοπισμός σφαλμάτων ασύρματης σύνδεσης προορίζεται μόνο για σκοπούς προγραμματισμού. Χρησιμοποιήστε τον για αντιγραφή δεδομένων μεταξύ του υπολογιστή και της συσκευής σας, για την εγκατάσταση εφαρμογών στη συσκευή σας χωρίς ειδοποίηση και για την ανάγνωση δεδομένων καταγραφής."</string>
+    <string name="adbwifi_warning_title" msgid="727104571653031865">"Να επιτρέπεται ο ασύρματος εντοπισμός σφαλμάτων;"</string>
+    <string name="adbwifi_warning_message" msgid="8005936574322702388">"Ο ασύρματος εντοπισμός σφαλμάτων προορίζεται μόνο για σκοπούς προγραμματισμού. Χρησιμοποιήστε τον για αντιγραφή δεδομένων μεταξύ του υπολογιστή και της συσκευής σας, για την εγκατάσταση εφαρμογών στη συσκευή σας χωρίς ειδοποίηση και για την ανάγνωση δεδομένων καταγραφής."</string>
     <string name="adb_keys_warning_message" msgid="2968555274488101220">"Ανάκληση πρόσβασης στον εντοπισμό σφαλμάτων USB από όλους τους υπολογιστές για τους οποίους είχατε εξουσιοδότηση στο παρελθόν;"</string>
     <string name="dev_settings_warning_title" msgid="8251234890169074553">"Να επιτρέπεται η χρήση των ρυθμίσεων ανάπτυξης;"</string>
     <string name="dev_settings_warning_message" msgid="37741686486073668">"Αυτές οι ρυθμίσεις προορίζονται για χρήση κατά την ανάπτυξη. Μπορούν να προκαλέσουν προβλήματα στη λειτουργία της συσκευής και των εφαρμογών σας."</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"Εμφάνιση του παραθύρου \"Η εφαρμογή δεν αποκρίνεται\" για εφαρμογές παρασκηνίου"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Εμφάνιση προειδοπ. καναλιού ειδοπ."</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Εμφανίζει προειδοποίηση όταν μια εφαρμογή δημοσιεύει ειδοποίηση χωρίς έγκυρο κανάλι"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Επιβολή συντομεύσεων για ειδοποιήσεις συνομιλίας"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Να απαιτείται η υποστήριξη των ειδοπ. από μια συντόμευση κοινοποίησης μεγάλης διάρκειας για να εμφανίζονται στην ενότητα συνομιλίας"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"Να επιτρέπονται υποχρεωτικά εφαρμογές σε εξωτ.συσ."</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Κάνει κάθε εφαρμογή κατάλληλη για εγγραφή σε εξωτερικό αποθηκευτικό χώρο, ανεξάρτητα από τις τιμές του μανιφέστου"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"Αναγκαστική δυνατότητα αλλαγής μεγέθους δραστηριοτήτων"</string>
@@ -432,10 +436,14 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"Θα διαρκέσει μέχρι τις <xliff:g id="TIME">%1$s</xliff:g> περίπου"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"Έως τις <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Η μπαταρία μπορεί να εξαντληθεί έως τις <xliff:g id="TIME">%1$s</xliff:g>."</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"Απομένει/ουν λιγότερo/α από <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"Απομένει/ουν λιγότερo/α από <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"Απομένουν περισσότερα/ες από <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"Απομένουν περισσότερα/ες από <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"Το τηλέφωνο μπορεί να απενεργοποιηθεί σύντομα"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"Το tablet μπορεί να απενεργοποιηθεί σύντομα"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"Η συσκευή μπορεί να απενεργοποιηθεί σύντομα"</string>
@@ -529,7 +537,7 @@
     <string name="user_add_user_item_title" msgid="2394272381086965029">"Χρήστης"</string>
     <string name="user_add_profile_item_title" msgid="3111051717414643029">"Προφίλ περιορ. πρόσβασης"</string>
     <string name="user_add_user_title" msgid="5457079143694924885">"Προσθήκη νέου χρήστη;"</string>
-    <string name="user_add_user_message_long" msgid="1527434966294733380">"Μπορείτε να μοιραστείτε αυτήν τη συσκευή με άλλα άτομα, δημιουργώντας επιπλέον χρήστες. Κάθε χρήστης θα έχει το δικό του χώρο, τον οποίο μπορεί να προσαρμόσει με τις δικές του εφαρμογές, ταπετσαρία κ.λπ. Οι χρήστες μπορούν επίσης να προσαρμόσουν ρυθμίσεις της συσκευής, όπως το Wi‑Fi, που επηρεάζουν τους πάντες.\n\nΚατά την προσθήκη ενός νέου χρήστη, αυτός θα πρέπει να ρυθμίσει τον χώρο του.\n\nΟποιοσδήποτε χρήστης μπορεί να ενημερώσει τις εφαρμογές για όλους τους άλλους χρήστες. Οι ρυθμίσεις και οι υπηρεσίες προσβασιμότητας ενδέχεται να μην μεταφερθούν στον νέο χρήστη"</string>
+    <string name="user_add_user_message_long" msgid="1527434966294733380">"Μπορείτε να μοιραστείτε αυτήν τη συσκευή με άλλα άτομα, δημιουργώντας επιπλέον χρήστες. Κάθε χρήστης θα έχει το δικό του χώρο, τον οποίο μπορεί να προσαρμόσει με τις δικές του εφαρμογές, ταπετσαρία κ.λπ. Οι χρήστες μπορούν επίσης να προσαρμόσουν ρυθμίσεις της συσκευής, όπως το Wi‑Fi, που επηρεάζουν τους πάντες.\n\nΚατά την προσθήκη ενός νέου χρήστη, αυτός θα πρέπει να ρυθμίσει τον χώρο του.\n\nΟποιοσδήποτε χρήστης μπορεί να ενημερώσει τις εφαρμογές για όλους τους άλλους χρήστες. Οι ρυθμίσεις και οι υπηρεσίες προσβασιμότητας ενδέχεται να μην μεταφερθούν στον νέο χρήστη."</string>
     <string name="user_add_user_message_short" msgid="3295959985795716166">"Κατά την προσθήκη ενός νέου χρήστη, αυτός θα πρέπει να ρυθμίσει το χώρο του.\n\nΟποιοσδήποτε χρήστης μπορεί να ενημερώσει τις εφαρμογές για όλους τους άλλους χρήστες."</string>
     <string name="user_setup_dialog_title" msgid="8037342066381939995">"Να γίνει ρύθμιση χρήστη τώρα;"</string>
     <string name="user_setup_dialog_message" msgid="269931619868102841">"Βεβαιωθείτε ότι ο χρήστης μπορεί να πάρει τη συσκευή και ρυθμίστε το χώρο του"</string>
diff --git a/packages/SettingsLib/res/values-en-rAU/strings.xml b/packages/SettingsLib/res/values-en-rAU/strings.xml
index 4cc2744..f6d6d77 100644
--- a/packages/SettingsLib/res/values-en-rAU/strings.xml
+++ b/packages/SettingsLib/res/values-en-rAU/strings.xml
@@ -212,7 +212,7 @@
     <string name="adb_wireless_settings" msgid="2295017847215680229">"Wireless debugging"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"To see and use available devices, turn on wireless debugging"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Pair device with QR code"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"Pair new devices using QR code scanner"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"Pair new devices using QR code scanner"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Pair device with pairing code"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Pair new devices using six-digit code"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"Paired devices"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Failed to pair the device. Either the QR code was incorrect, or the device is not connected to the same network."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"IP address &amp; port"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"Scan QR code"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"Pair device over Wi‑Fi by scanning a QR code"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Pair device over Wi‑Fi by scanning a QR code"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Please connect to a Wi‑Fi network"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, debug, dev"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"Bug report shortcut"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"Wireless display certification"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"Enable Wi‑Fi verbose logging"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"Wi‑Fi scan throttling"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"Wi‑Fi‑enhanced MAC randomisation"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"Mobile data always active"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"Tethering hardware acceleration"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Show Bluetooth devices without names"</string>
@@ -274,7 +275,7 @@
     <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="7274396574659784285">"Trigger Bluetooth Audio LDAC\nCodec Selection: Playback Quality"</string>
     <string name="bluetooth_select_a2dp_codec_streaming_label" msgid="2040810756832027227">"Streaming: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
     <string name="select_private_dns_configuration_title" msgid="7887550926056143018">"Private DNS"</string>
-    <string name="select_private_dns_configuration_dialog_title" msgid="3731422918335951912">"Select private DNS mode"</string>
+    <string name="select_private_dns_configuration_dialog_title" msgid="3731422918335951912">"Select Private DNS Mode"</string>
     <string name="private_dns_mode_off" msgid="7065962499349997041">"Off"</string>
     <string name="private_dns_mode_opportunistic" msgid="1947864819060442354">"Automatic"</string>
     <string name="private_dns_mode_provider" msgid="3619040641762557028">"Private DNS provider hostname"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Show options for wireless display certification"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Increase Wi‑Fi logging level, show per SSID RSSI in Wi‑Fi Picker"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Reduces battery drain and improves network performance"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"This toggle affects MAC randomisation behaviour for client mode only.\nWhen this mode is activated, any networks that have MAC randomisation enabled may have their MAC addresses re‑randomised during association, depending on when the client last disconnected from the network. Re‑randomisation does not occur if the device reconnects in four hours or less."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"Metered"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"Unmetered"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"Logger buffer sizes"</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"Display App Not Responding dialogue for background apps"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Show notification channel warnings"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Displays on-screen warning when an app posts a notification without a valid channel"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Enforce shortcuts for conversation notifications"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Require notifications to be backed by a long-lived sharing shortcut in order to appear in the conversation section"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"Force allow apps on external"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Makes any app eligible to be written to external storage, regardless of manifest values"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"Force activities to be resizeable"</string>
@@ -432,10 +436,14 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"Should last until about <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"Until <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Battery may run out by <xliff:g id="TIME">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"Less than <xliff:g id="THRESHOLD">%1$s</xliff:g> remaining"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"Less than <xliff:g id="THRESHOLD">%1$s</xliff:g> remaining (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"More than <xliff:g id="TIME_REMAINING">%1$s</xliff:g> remaining (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"More than <xliff:g id="TIME_REMAINING">%1$s</xliff:g> remaining"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"Phone may shut down soon"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"Tablet may shut down soon"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"Device may shut down soon"</string>
diff --git a/packages/SettingsLib/res/values-en-rCA/strings.xml b/packages/SettingsLib/res/values-en-rCA/strings.xml
index 4cc2744..f6d6d77 100644
--- a/packages/SettingsLib/res/values-en-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-en-rCA/strings.xml
@@ -212,7 +212,7 @@
     <string name="adb_wireless_settings" msgid="2295017847215680229">"Wireless debugging"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"To see and use available devices, turn on wireless debugging"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Pair device with QR code"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"Pair new devices using QR code scanner"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"Pair new devices using QR code scanner"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Pair device with pairing code"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Pair new devices using six-digit code"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"Paired devices"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Failed to pair the device. Either the QR code was incorrect, or the device is not connected to the same network."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"IP address &amp; port"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"Scan QR code"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"Pair device over Wi‑Fi by scanning a QR code"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Pair device over Wi‑Fi by scanning a QR code"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Please connect to a Wi‑Fi network"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, debug, dev"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"Bug report shortcut"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"Wireless display certification"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"Enable Wi‑Fi verbose logging"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"Wi‑Fi scan throttling"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"Wi‑Fi‑enhanced MAC randomisation"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"Mobile data always active"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"Tethering hardware acceleration"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Show Bluetooth devices without names"</string>
@@ -274,7 +275,7 @@
     <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="7274396574659784285">"Trigger Bluetooth Audio LDAC\nCodec Selection: Playback Quality"</string>
     <string name="bluetooth_select_a2dp_codec_streaming_label" msgid="2040810756832027227">"Streaming: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
     <string name="select_private_dns_configuration_title" msgid="7887550926056143018">"Private DNS"</string>
-    <string name="select_private_dns_configuration_dialog_title" msgid="3731422918335951912">"Select private DNS mode"</string>
+    <string name="select_private_dns_configuration_dialog_title" msgid="3731422918335951912">"Select Private DNS Mode"</string>
     <string name="private_dns_mode_off" msgid="7065962499349997041">"Off"</string>
     <string name="private_dns_mode_opportunistic" msgid="1947864819060442354">"Automatic"</string>
     <string name="private_dns_mode_provider" msgid="3619040641762557028">"Private DNS provider hostname"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Show options for wireless display certification"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Increase Wi‑Fi logging level, show per SSID RSSI in Wi‑Fi Picker"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Reduces battery drain and improves network performance"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"This toggle affects MAC randomisation behaviour for client mode only.\nWhen this mode is activated, any networks that have MAC randomisation enabled may have their MAC addresses re‑randomised during association, depending on when the client last disconnected from the network. Re‑randomisation does not occur if the device reconnects in four hours or less."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"Metered"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"Unmetered"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"Logger buffer sizes"</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"Display App Not Responding dialogue for background apps"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Show notification channel warnings"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Displays on-screen warning when an app posts a notification without a valid channel"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Enforce shortcuts for conversation notifications"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Require notifications to be backed by a long-lived sharing shortcut in order to appear in the conversation section"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"Force allow apps on external"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Makes any app eligible to be written to external storage, regardless of manifest values"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"Force activities to be resizeable"</string>
@@ -432,10 +436,14 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"Should last until about <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"Until <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Battery may run out by <xliff:g id="TIME">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"Less than <xliff:g id="THRESHOLD">%1$s</xliff:g> remaining"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"Less than <xliff:g id="THRESHOLD">%1$s</xliff:g> remaining (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"More than <xliff:g id="TIME_REMAINING">%1$s</xliff:g> remaining (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"More than <xliff:g id="TIME_REMAINING">%1$s</xliff:g> remaining"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"Phone may shut down soon"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"Tablet may shut down soon"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"Device may shut down soon"</string>
diff --git a/packages/SettingsLib/res/values-en-rGB/strings.xml b/packages/SettingsLib/res/values-en-rGB/strings.xml
index 4cc2744..f6d6d77 100644
--- a/packages/SettingsLib/res/values-en-rGB/strings.xml
+++ b/packages/SettingsLib/res/values-en-rGB/strings.xml
@@ -212,7 +212,7 @@
     <string name="adb_wireless_settings" msgid="2295017847215680229">"Wireless debugging"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"To see and use available devices, turn on wireless debugging"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Pair device with QR code"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"Pair new devices using QR code scanner"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"Pair new devices using QR code scanner"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Pair device with pairing code"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Pair new devices using six-digit code"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"Paired devices"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Failed to pair the device. Either the QR code was incorrect, or the device is not connected to the same network."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"IP address &amp; port"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"Scan QR code"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"Pair device over Wi‑Fi by scanning a QR code"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Pair device over Wi‑Fi by scanning a QR code"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Please connect to a Wi‑Fi network"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, debug, dev"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"Bug report shortcut"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"Wireless display certification"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"Enable Wi‑Fi verbose logging"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"Wi‑Fi scan throttling"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"Wi‑Fi‑enhanced MAC randomisation"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"Mobile data always active"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"Tethering hardware acceleration"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Show Bluetooth devices without names"</string>
@@ -274,7 +275,7 @@
     <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="7274396574659784285">"Trigger Bluetooth Audio LDAC\nCodec Selection: Playback Quality"</string>
     <string name="bluetooth_select_a2dp_codec_streaming_label" msgid="2040810756832027227">"Streaming: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
     <string name="select_private_dns_configuration_title" msgid="7887550926056143018">"Private DNS"</string>
-    <string name="select_private_dns_configuration_dialog_title" msgid="3731422918335951912">"Select private DNS mode"</string>
+    <string name="select_private_dns_configuration_dialog_title" msgid="3731422918335951912">"Select Private DNS Mode"</string>
     <string name="private_dns_mode_off" msgid="7065962499349997041">"Off"</string>
     <string name="private_dns_mode_opportunistic" msgid="1947864819060442354">"Automatic"</string>
     <string name="private_dns_mode_provider" msgid="3619040641762557028">"Private DNS provider hostname"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Show options for wireless display certification"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Increase Wi‑Fi logging level, show per SSID RSSI in Wi‑Fi Picker"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Reduces battery drain and improves network performance"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"This toggle affects MAC randomisation behaviour for client mode only.\nWhen this mode is activated, any networks that have MAC randomisation enabled may have their MAC addresses re‑randomised during association, depending on when the client last disconnected from the network. Re‑randomisation does not occur if the device reconnects in four hours or less."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"Metered"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"Unmetered"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"Logger buffer sizes"</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"Display App Not Responding dialogue for background apps"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Show notification channel warnings"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Displays on-screen warning when an app posts a notification without a valid channel"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Enforce shortcuts for conversation notifications"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Require notifications to be backed by a long-lived sharing shortcut in order to appear in the conversation section"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"Force allow apps on external"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Makes any app eligible to be written to external storage, regardless of manifest values"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"Force activities to be resizeable"</string>
@@ -432,10 +436,14 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"Should last until about <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"Until <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Battery may run out by <xliff:g id="TIME">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"Less than <xliff:g id="THRESHOLD">%1$s</xliff:g> remaining"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"Less than <xliff:g id="THRESHOLD">%1$s</xliff:g> remaining (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"More than <xliff:g id="TIME_REMAINING">%1$s</xliff:g> remaining (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"More than <xliff:g id="TIME_REMAINING">%1$s</xliff:g> remaining"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"Phone may shut down soon"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"Tablet may shut down soon"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"Device may shut down soon"</string>
diff --git a/packages/SettingsLib/res/values-en-rIN/strings.xml b/packages/SettingsLib/res/values-en-rIN/strings.xml
index 4cc2744..f6d6d77 100644
--- a/packages/SettingsLib/res/values-en-rIN/strings.xml
+++ b/packages/SettingsLib/res/values-en-rIN/strings.xml
@@ -212,7 +212,7 @@
     <string name="adb_wireless_settings" msgid="2295017847215680229">"Wireless debugging"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"To see and use available devices, turn on wireless debugging"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Pair device with QR code"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"Pair new devices using QR code scanner"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"Pair new devices using QR code scanner"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Pair device with pairing code"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Pair new devices using six-digit code"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"Paired devices"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Failed to pair the device. Either the QR code was incorrect, or the device is not connected to the same network."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"IP address &amp; port"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"Scan QR code"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"Pair device over Wi‑Fi by scanning a QR code"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Pair device over Wi‑Fi by scanning a QR code"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Please connect to a Wi‑Fi network"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, debug, dev"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"Bug report shortcut"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"Wireless display certification"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"Enable Wi‑Fi verbose logging"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"Wi‑Fi scan throttling"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"Wi‑Fi‑enhanced MAC randomisation"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"Mobile data always active"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"Tethering hardware acceleration"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Show Bluetooth devices without names"</string>
@@ -274,7 +275,7 @@
     <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="7274396574659784285">"Trigger Bluetooth Audio LDAC\nCodec Selection: Playback Quality"</string>
     <string name="bluetooth_select_a2dp_codec_streaming_label" msgid="2040810756832027227">"Streaming: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
     <string name="select_private_dns_configuration_title" msgid="7887550926056143018">"Private DNS"</string>
-    <string name="select_private_dns_configuration_dialog_title" msgid="3731422918335951912">"Select private DNS mode"</string>
+    <string name="select_private_dns_configuration_dialog_title" msgid="3731422918335951912">"Select Private DNS Mode"</string>
     <string name="private_dns_mode_off" msgid="7065962499349997041">"Off"</string>
     <string name="private_dns_mode_opportunistic" msgid="1947864819060442354">"Automatic"</string>
     <string name="private_dns_mode_provider" msgid="3619040641762557028">"Private DNS provider hostname"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Show options for wireless display certification"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Increase Wi‑Fi logging level, show per SSID RSSI in Wi‑Fi Picker"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Reduces battery drain and improves network performance"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"This toggle affects MAC randomisation behaviour for client mode only.\nWhen this mode is activated, any networks that have MAC randomisation enabled may have their MAC addresses re‑randomised during association, depending on when the client last disconnected from the network. Re‑randomisation does not occur if the device reconnects in four hours or less."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"Metered"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"Unmetered"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"Logger buffer sizes"</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"Display App Not Responding dialogue for background apps"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Show notification channel warnings"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Displays on-screen warning when an app posts a notification without a valid channel"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Enforce shortcuts for conversation notifications"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Require notifications to be backed by a long-lived sharing shortcut in order to appear in the conversation section"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"Force allow apps on external"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Makes any app eligible to be written to external storage, regardless of manifest values"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"Force activities to be resizeable"</string>
@@ -432,10 +436,14 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"Should last until about <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"Until <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Battery may run out by <xliff:g id="TIME">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"Less than <xliff:g id="THRESHOLD">%1$s</xliff:g> remaining"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"Less than <xliff:g id="THRESHOLD">%1$s</xliff:g> remaining (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"More than <xliff:g id="TIME_REMAINING">%1$s</xliff:g> remaining (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"More than <xliff:g id="TIME_REMAINING">%1$s</xliff:g> remaining"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"Phone may shut down soon"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"Tablet may shut down soon"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"Device may shut down soon"</string>
diff --git a/packages/SettingsLib/res/values-en-rXC/strings.xml b/packages/SettingsLib/res/values-en-rXC/strings.xml
index e935a74..b0424e2 100644
--- a/packages/SettingsLib/res/values-en-rXC/strings.xml
+++ b/packages/SettingsLib/res/values-en-rXC/strings.xml
@@ -212,7 +212,7 @@
     <string name="adb_wireless_settings" msgid="2295017847215680229">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‏‏‏‏‏‏‏‏‎‏‏‎‎‏‏‎‎‎‏‎‏‎‏‎‎‏‎‎‏‎‏‎‎‏‎‎‎‎‎‏‏‏‏‎‎‎‏‏‏‎‏‎‏‎‏‏‏‎‎‏‎‏‎Wireless debugging‎‏‎‎‏‎"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‏‏‎‏‏‏‏‏‎‎‏‎‎‎‎‏‎‏‎‎‎‎‎‏‎‏‎‎‏‎‏‎‎‏‎‏‎‏‎‏‎‏‎‎‏‎‏‏‏‏‎‎‏‏‎‏‎‎‎‎‏‎‎To see and use available devices, turn on wireless debugging‎‏‎‎‏‎"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‎‎‎‎‎‏‏‏‎‏‎‎‎‎‏‎‎‎‎‏‎‎‏‎‎‎‏‏‏‎‏‎‎‎‏‏‎‏‏‏‎‎‏‎‎‏‏‎‏‏‎‏‎‏‏‎‏‏‎‏‎‎Pair device with QR code‎‏‎‎‏‎"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‏‎‎‏‏‏‏‎‎‎‎‏‏‎‏‎‎‎‏‎‏‏‎‏‎‎‏‏‎‎‏‎‎‎‏‏‏‎‏‎‏‎‎‏‏‏‎‏‏‎‏‎‏‏‎‎‎‏‎‏‎‎Pair new devices using QR code Scanner‎‏‎‎‏‎"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‎‎‎‏‎‏‏‏‏‎‏‎‏‎‏‎‏‎‎‎‎‏‎‏‎‏‎‏‎‎‏‎‎‎‏‎‎‎‎‏‎‎‏‎‎‏‏‎‎‎‎‏‏‏‎‎‎‏‎‎‎‎Pair new devices using QR code scanner‎‏‎‎‏‎"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‎‏‏‏‏‏‎‎‏‎‏‎‎‎‎‏‏‏‏‎‏‏‏‏‎‏‏‏‎‎‎‏‏‎‏‏‎‎‏‎‏‎‏‎‎‏‏‏‎‏‏‏‏‎‏‏‏‏‎‎‎‎Pair device with pairing code‎‏‎‎‏‎"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‏‏‎‎‎‎‏‏‎‏‎‎‎‎‏‎‎‎‎‏‎‎‎‏‏‏‏‏‏‎‎‎‎‎‏‎‎‎‎‎‎‏‎‎‏‏‎‏‏‎‏‏‏‏‏‎‎‎‎‎‏‎Pair new devices using six digit code‎‏‎‎‏‎"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‏‎‎‏‎‎‎‏‏‏‏‏‎‎‏‏‏‏‎‏‎‎‏‎‏‎‏‎‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‏‏‏‎‏‎‎‏‎‏‎‎‏‎‎‏‎‎Paired devices‎‏‎‎‏‎"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‎‎‎‎‎‎‏‎‎‎‎‏‎‏‎‏‎‏‎‎‎‏‏‏‎‏‎‎‎‎‏‏‏‏‏‎‏‎‏‎‏‏‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‎‏‎‎‎Failed to pair the device. Either the QR code was incorrect, or the device is not connected to the same network.‎‏‎‎‏‎"</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‎‎‏‏‏‎‏‎‏‏‎‎‎‏‎‏‎‏‏‎‎‏‏‏‏‏‎‏‏‎‎‏‎‏‎‎‎‏‎‏‎‎‏‎‏‏‏‏‏‎‎‎‎‏‏‏‎‎‏‎‎IP address &amp; Port‎‏‎‎‏‎"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‏‏‏‎‏‎‎‏‏‏‎‏‎‎‏‏‏‎‏‏‎‏‎‏‏‏‏‏‏‎‎‎‎‎‏‏‏‎‎‎‏‏‎‏‏‎‎‏‏‏‎‏‎‏‏‎‎‏‎‎‏‏‎Scan QR code‎‏‎‎‏‎"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‎‏‏‏‎‎‎‎‏‏‏‎‎‏‎‎‎‎‏‏‎‎‎‎‏‎‎‏‏‎‏‏‏‏‎‎‏‏‎‏‏‏‏‏‏‎‎‏‎‏‏‏‎‏‏‏‎‎‏‏‎Pair device over Wi‑Fi by scanning a QR Code‎‏‎‎‏‎"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‏‎‎‏‏‎‏‏‏‎‏‏‎‎‏‏‏‎‎‏‏‏‎‎‎‏‏‏‎‎‎‏‏‏‏‎‎‏‏‎‏‏‏‎‏‏‏‏‏‏‏‏‎‎‎‏‎‏‎‏‏‎Pair device over Wi‑Fi by scanning a QR code‎‏‎‎‏‎"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‎‎‎‎‎‏‏‎‏‎‏‎‎‏‏‏‏‏‏‏‎‎‎‏‏‏‏‎‏‏‎‎‏‎‏‎‎‏‏‎‎‎‎‎‏‎‎‎‏‎‎‏‏‏‏‎‎‎‎‏‎‎Please connect to a Wi‑Fi network‎‏‎‎‏‎"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‏‏‎‏‎‎‏‎‎‏‏‏‏‎‏‎‎‏‏‎‏‏‏‎‏‏‎‎‏‎‎‏‏‎‏‎‏‏‏‏‏‎‏‎‏‎‏‎‏‏‏‏‏‎‏‏‎‏‎‎‎‎adb, debug, dev‎‏‎‎‏‎"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‏‎‎‎‎‎‏‏‏‏‎‏‎‎‎‎‎‏‏‏‎‎‎‏‏‎‏‏‎‏‏‎‏‏‏‎‏‏‎‎‎‏‎‏‎‏‎‏‎‎‎‎‎‏‏‏‎‏‎‏‎Bug report shortcut‎‏‎‎‏‎"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‏‏‏‎‎‏‎‎‎‎‏‏‏‎‏‎‏‏‎‏‎‏‎‎‎‎‎‎‎‏‏‏‎‎‏‏‏‎‏‏‎‏‏‏‏‏‏‏‎‏‏‏‏‎‏‎‏‏‏‏‎‏‎Wireless display certification‎‏‎‎‏‎"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‏‏‏‎‎‎‏‏‎‎‏‎‎‎‏‏‎‏‎‏‎‎‎‎‎‏‎‏‏‏‏‎‎‏‎‏‎‏‎‏‏‏‏‏‎‎‎‎‏‎‎‏‏‎‎‎‎‎‏‎‏‏‎Enable Wi‑Fi Verbose Logging‎‏‎‎‏‎"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‎‏‎‎‏‎‏‏‎‏‏‏‏‎‎‎‏‎‎‎‏‏‏‏‎‏‏‎‏‎‎‏‏‎‏‏‏‏‎‏‏‏‎‏‏‏‏‏‏‎‎‏‎‎‎‎‏‎‎‎‏‎Wi‑Fi scan throttling‎‏‎‎‏‎"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‏‎‏‏‎‏‏‏‎‏‎‏‎‏‏‏‎‎‏‎‏‏‎‏‎‎‎‎‏‎‎‎‎‎‏‎‏‏‏‏‎‏‏‏‏‎‏‏‎‎‎‏‏‏‎‏‎‎‏‏‎Wi‑Fi‑enhanced MAC randomization‎‏‎‎‏‎"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‎‎‏‎‏‏‎‏‏‎‏‎‎‎‎‏‏‏‎‎‎‎‎‎‏‎‏‏‏‎‏‏‎‏‏‎‎‏‎‎‏‏‏‏‎‎‎‏‏‏‎‎‎‎‏‏‎‏‎‎‎Mobile data always active‎‏‎‎‏‎"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‏‏‎‎‏‎‎‎‏‏‏‏‏‎‎‏‎‏‎‎‏‎‎‎‎‏‏‎‎‏‎‏‏‎‏‎‏‏‏‎‏‎‏‎‏‏‎‎‎‏‎‎‎‎‎‎‏‏‎‎‏‎Tethering hardware acceleration‎‏‎‎‏‎"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‎‏‏‎‎‏‏‎‏‎‎‎‏‎‎‏‏‏‎‏‏‎‎‏‏‏‎‏‏‏‏‎‎‎‏‎‎‎‏‏‎‎‏‏‏‎‏‏‏‎‎‏‏‏‏‏‏‏‎‏‏‎Show Bluetooth devices without names‎‏‎‎‏‎"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‎‎‎‎‏‎‎‏‎‎‎‎‏‎‎‏‏‎‎‏‎‎‏‎‏‏‎‏‎‎‏‎‎‏‏‏‎‏‎‏‎‏‏‏‏‏‎‎‏‏‏‏‎‏‏‏‏‎‎‏‎Show options for wireless display certification‎‏‎‎‏‎"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‎‏‎‏‎‏‎‎‏‏‎‏‏‎‎‏‏‏‏‏‏‎‏‏‏‎‏‏‎‏‎‏‎‏‏‏‏‏‏‏‏‏‏‎‏‏‎‏‎‏‏‏‎‏‎‏‎‏‎‎‎Increase Wi‑Fi logging level, show per SSID RSSI in Wi‑Fi Picker‎‏‎‎‏‎"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‎‎‎‏‏‏‏‎‎‎‎‏‏‏‎‏‏‎‏‏‏‏‏‎‎‎‏‎‏‏‏‎‏‎‎‎‎‎‏‎‎‏‏‏‏‎‏‏‎‏‏‏‏‎‏‏‏‏‏‏‎‎Reduces battery drain &amp; improves network performance‎‏‎‎‏‎"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‏‏‏‏‏‎‎‏‏‎‎‎‏‎‎‏‎‏‏‏‎‎‏‏‏‎‎‎‎‏‎‎‏‎‏‎‏‏‎‏‏‏‏‏‏‎‏‎‎‎‏‏‏‏‏‎This toggle affects MAC randomization behavior for client mode only.‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎When this mode is activated, any networks that have MAC randomization enabled may have their MAC addresses re‑randomized during association, depending on when the client last disconnected from the network. Re‑randomization does not occur if the device reconnects in 4 hours or less.‎‏‎‎‏‎"</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‏‎‎‏‎‏‎‎‎‎‎‎‏‎‏‏‏‎‎‏‏‏‏‎‏‎‎‏‏‎‏‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‏‎‎‎‏‎‏‎‎‏‏‏‎‎Metered‎‏‎‎‏‎"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‏‎‏‎‏‏‎‏‎‏‏‏‎‏‏‏‏‎‏‏‎‎‎‏‏‎‎‏‏‏‎‏‎‏‎‏‎‎‏‏‎‎‏‎‏‏‏‎‏‏‎‎‎‏‏‏‏‎‏‎‏‎Unmetered‎‏‎‎‏‎"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‏‏‎‏‏‎‎‏‎‎‎‏‎‎‏‎‎‏‏‎‏‏‎‏‎‏‏‏‏‎‎‎‏‎‎‏‎‏‏‏‎‏‎‎‏‏‏‎‎‏‏‎‏‏‎‏‏‎‎‏‎‏‎Logger buffer sizes‎‏‎‎‏‎"</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‎‏‏‎‏‏‎‏‎‏‎‏‎‎‏‎‎‎‏‏‎‎‎‏‎‎‏‏‏‏‎‎‏‎‏‎‏‏‏‏‏‏‏‏‏‎‏‏‎‎‎‎‎‏‎‎‎‎‎‎‎Display App Not Responding dialog for background apps‎‏‎‎‏‎"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‎‏‏‏‏‏‏‎‏‏‎‏‎‏‏‎‎‎‎‏‎‏‎‎‏‎‎‏‎‏‎‏‏‏‎‎‎‏‏‎‏‎‏‏‎‎‎‏‏‏‎‏‏‎‎‎‏‎‎‏‏‎Show notification channel warnings‎‏‎‎‏‎"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‎‎‎‏‏‏‏‎‎‎‏‏‎‏‏‎‎‎‏‏‏‏‏‎‏‏‎‏‏‏‏‏‏‎‎‏‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‏‏‎‎‎‎‏‏‎Displays on-screen warning when an app posts a notification without a valid channel‎‏‎‎‏‎"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‎‎‎‎‏‏‎‏‏‎‏‎‏‏‎‏‏‎‏‏‏‎‏‎‏‎‏‎‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‎‏‏‏‎‏‏‎‏‏‏‏‎‏‏‎Enforce shortcuts for conversation notifications‎‏‎‎‏‎"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‏‏‏‎‎‏‏‏‎‏‎‎‎‎‏‎‏‎‎‏‎‎‏‏‏‏‏‎‎‏‎‏‏‎‏‏‎‎‏‏‎‎‎‎‎‏‏‏‎‏‎‎‎‎‎‎‎‏‎‏‏‎‎Require notifications to be backed by a long-lived sharing shortcut in order to appear in the conversation section‎‏‎‎‏‎"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‎‎‎‏‏‏‏‏‏‏‎‎‏‎‎‏‎‏‏‏‏‏‏‎‏‎‏‏‎‏‎‏‏‏‏‎‏‎‏‏‏‎‏‏‎‏‏‏‏‎‎‎‎Force allow apps on external‎‏‎‎‏‎"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‎‏‏‎‎‏‎‏‎‎‎‎‎‏‏‎‎‏‎‏‏‎‎‏‎‏‎‎‎‏‎‏‏‏‏‎‏‎‏‏‎‎‏‏‎‏‏‎‎‎‎‏‎‎‏‎‏‏‏‎‎Makes any app eligible to be written to external storage, regardless of manifest values‎‏‎‎‏‎"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‎‎‎‏‏‎‎‏‎‎‎‏‏‎‎‏‏‎‏‎‏‎‏‏‎‎‏‎‏‏‎‎‏‏‎‎‎‎‎‏‎‎‎‎‎‎‏‎‎‎‏‏‎‎‎‏‏‎‏‏‎‎Force activities to be resizable‎‏‎‎‏‎"</string>
@@ -432,10 +436,10 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‎‎‏‏‎‏‎‎‏‎‎‎‏‏‎‎‏‎‎‏‏‏‎‎‎‏‏‎‏‏‏‎‎‎‏‏‏‏‏‎‏‏‏‏‏‎‏‎‏‎‎‎‎‏‏‎‏‎‎‎‎Should last until about ‎‏‎‎‏‏‎<xliff:g id="TIME">%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‏‎‎‎‏‏‎‏‎‎‏‎‎‏‏‎‎‎‎‏‏‎‎‎‏‎‏‎‎‏‏‎‏‎‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‎‎‎‎‏‎‎‎‏‏‏‎‎Until ‎‏‎‎‏‏‎<xliff:g id="TIME">%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‏‎‏‏‏‏‏‏‎‎‎‎‎‎‎‎‏‏‎‎‏‏‎‏‎‏‏‎‏‎‎‏‏‎‏‏‏‎‎‎‏‏‏‏‏‏‏‎‏‎‏‎‏‎‏‎‎‏‏‏‏‎Battery may run out by ‎‏‎‎‏‏‎<xliff:g id="TIME">%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‏‎‎‎‎‏‎‎‎‎‏‎‏‏‎‎‎‏‎‎‏‏‏‎‏‏‏‏‏‏‎‎‏‎‏‏‎‎‎‎‎‎‎‎‎‏‎‏‎‏‏‏‎‏‏‎‎‎‎‎‏‎Less than ‎‏‎‎‏‏‎<xliff:g id="THRESHOLD">%1$s</xliff:g>‎‏‎‎‏‏‏‎ remaining‎‏‎‎‏‎"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‏‏‏‎‎‏‎‎‏‎‎‏‏‏‏‏‏‎‎‏‎‎‎‎‏‏‎‎‎‏‎‏‎‎‎‎‎‏‎‏‎‎‏‎‎‏‏‏‎‏‎‎‎‏‏‎‎‏‎‏‎‎‎Less than ‎‏‎‎‏‏‎<xliff:g id="THRESHOLD">%1$s</xliff:g>‎‏‎‎‏‏‏‎ remaining (‎‏‎‎‏‏‎<xliff:g id="LEVEL">%2$s</xliff:g>‎‏‎‎‏‏‏‎)‎‏‎‎‏‎"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‏‏‎‎‏‏‎‎‏‎‏‏‏‎‏‎‏‏‎‏‏‎‏‎‏‏‎‎‏‏‏‎‏‎‎‎‎‎‏‎‎‎‏‏‏‎‏‎‎‎‎‎‎‎‎‎More than ‎‏‎‎‏‏‎<xliff:g id="TIME_REMAINING">%1$s</xliff:g>‎‏‎‎‏‏‏‎ remaining (‎‏‎‎‏‏‎<xliff:g id="LEVEL">%2$s</xliff:g>‎‏‎‎‏‏‏‎)‎‏‎‎‏‎"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‎‏‏‎‏‎‏‏‏‎‎‎‏‎‏‎‏‏‎‎‎‏‏‏‎‏‎‎‏‏‎‏‎‏‏‏‏‎‏‏‏‎‎‎‏‎‎‎‏‏‎‎‏‏‏‎‏‎‎‎‎‎More than ‎‏‎‎‏‏‎<xliff:g id="TIME_REMAINING">%1$s</xliff:g>‎‏‎‎‏‏‏‎ remaining‎‏‎‎‏‎"</string>
+    <string name="power_remaining_less_than_duration_only" msgid="8956656616031395152">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‎‎‏‏‎‎‎‏‏‎‏‏‏‏‏‎‏‏‏‏‎‎‏‏‏‎‎‏‎‏‏‎‏‏‎‏‎‎‎‎‎‏‏‏‎‏‎‏‎‏‎‎‎‎‎Less than ‎‏‎‎‏‏‎<xliff:g id="THRESHOLD">%1$s</xliff:g>‎‏‎‎‏‏‏‎ left‎‏‎‎‏‎"</string>
+    <string name="power_remaining_less_than_duration" msgid="318215464914990578">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‎‏‏‏‎‎‎‏‏‎‏‎‏‎‏‎‎‎‎‏‏‏‎‏‎‎‎‏‏‏‏‎‎‎‎‏‎‎‎‏‎‎‏‎‏‏‎‎‏‏‎‏‎‏‏‏‏‏‎‎‏‎‎Less than ‎‏‎‎‏‏‎<xliff:g id="THRESHOLD">%1$s</xliff:g>‎‏‎‎‏‏‏‎ left (‎‏‎‎‏‏‎<xliff:g id="LEVEL">%2$s</xliff:g>‎‏‎‎‏‏‏‎)‎‏‎‎‏‎"</string>
+    <string name="power_remaining_more_than_subtext" msgid="446388082266121894">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‎‏‏‏‏‎‎‎‏‏‎‎‎‏‏‏‏‎‎‎‏‏‏‎‎‏‏‎‎‎‏‎‎‎‎‎‏‏‎‏‏‏‎‎‎‎‏‎‏‎‎‏‏‎‏‎‏‎‎‏‏‎‎More than ‎‏‎‎‏‏‎<xliff:g id="TIME_REMAINING">%1$s</xliff:g>‎‏‎‎‏‏‏‎ left (‎‏‎‎‏‏‎<xliff:g id="LEVEL">%2$s</xliff:g>‎‏‎‎‏‏‏‎)‎‏‎‎‏‎"</string>
+    <string name="power_remaining_only_more_than_subtext" msgid="4873750633368888062">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‎‎‏‏‏‎‏‎‎‎‏‏‎‎‎‎‏‎‏‎‎‏‏‎‎‎‎‎‏‏‏‏‏‎‎‏‏‏‎‎‏‎‎‏‏‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎More than ‎‏‎‎‏‏‎<xliff:g id="TIME_REMAINING">%1$s</xliff:g>‎‏‎‎‏‏‏‎ left‎‏‎‎‏‎"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‎‎‏‏‏‏‏‎‎‏‏‏‏‏‏‎‎‏‎‎‏‏‏‎‏‎‏‎‏‎‎‏‎‎‏‎‏‎‏‎‎‎‎‎‎‏‏‏‏‏‎‎‎‏‎‎‎‏‏‎‎Phone may shut down soon‎‏‎‎‏‎"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‎‏‎‏‎‎‎‎‎‎‏‎‎‏‏‏‎‎‎‎‏‏‎‎‎‏‏‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‎‎‎‏‏‏‏‎‎‏‎‏‏‏‎‎‏‎‎‎Tablet may shut down soon‎‏‎‎‏‎"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‎‏‏‏‎‏‏‎‏‏‎‏‏‎‏‏‎‎‏‏‏‎‎‎‏‎‏‏‎‏‎‎‎‎‏‎‏‎‏‎‎‏‏‎‎‎‏‏‎‎‏‎‎‎‏‎‎‏‏‏‎‎Device may shut down soon‎‏‎‎‏‎"</string>
diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml
index 6cb975f..dcfee98 100644
--- a/packages/SettingsLib/res/values-es-rUS/strings.xml
+++ b/packages/SettingsLib/res/values-es-rUS/strings.xml
@@ -23,7 +23,7 @@
     <string name="wifi_fail_to_scan" msgid="2333336097603822490">"No se pueden buscar las redes."</string>
     <string name="wifi_security_none" msgid="7392696451280611452">"Ninguna"</string>
     <string name="wifi_remembered" msgid="3266709779723179188">"Guardada"</string>
-    <string name="wifi_disconnected" msgid="7054450256284661757">"Desconectada"</string>
+    <string name="wifi_disconnected" msgid="7054450256284661757">"Desconectado"</string>
     <string name="wifi_disabled_generic" msgid="2651916945380294607">"Inhabilitada"</string>
     <string name="wifi_disabled_network_failure" msgid="2660396183242399585">"Error de configuración IP"</string>
     <string name="wifi_disabled_by_recommendation_provider" msgid="1302938248432705534">"No se estableció conexión debido a la mala calidad de la red"</string>
@@ -212,7 +212,7 @@
     <string name="adb_wireless_settings" msgid="2295017847215680229">"Depuración inalámbrica"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Para ver y usar los dispositivos disponibles, activa la depuración inalámbrica"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Vincular dispositivo mediante código QR"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"Vincular dispositivos nuevos mediante escáner de código QR"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"Vincular dispositivos nuevos mediante escáner de código QR"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Vincular dispositivo mediante código de sincroniz."</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Vincular dispositivos nuevos mediante código de seis dígitos"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"Dispositivos vinculados"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Error al vincular el dispositivo. El código QR era incorrecto o el dispositivo no está conectado a la misma red."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"Dirección IP y puerto"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"Escanear código QR"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"Escanea un código QR para vincular el dispositivo mediante Wi‑Fi"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Escanea un código QR para vincular el dispositivo mediante Wi‑Fi"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Conéctate a una red Wi-Fi"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, debug, dev"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"Acceso directo para informes de errores"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"Certificación de pantalla inalámbrica"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"Habilitar registro detallado de Wi-Fi"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"Limitación de búsqueda de Wi-Fi"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"Aleatorización de MAC de Wi-Fi Enhanced"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"Datos móviles siempre activados"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"Aceleración de hardware de conexión mediante dispositivo móvil"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Mostrar dispositivos Bluetooth sin nombre"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Mostrar opciones de certificación de pantalla inalámbrica"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Aumentar nivel de registro Wi-Fi; mostrar por SSID RSSI en el selector de Wi-Fi"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Reduce el consumo de batería y mejora el rendimiento de la red"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Esta activación afecta el comportamiento de aleatorización de MAC para el modo de cliente solamente.\nCuando este modo está activado, todas las redes que tienen aleatorización de MAC habilitada pueden volver a establecer de manera aleatoria sus direcciones MAC durante la asociación, según cuándo el cliente se desconectó por última vez de la red. El proceso volver a establecer de manera aleatoria no se produce si el dispositivo se vuelve a conectar en 4 horas o menos."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"Con uso medido"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"Sin tarifa plana"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"Tamaños de búfer de Logger"</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"Mostrar diálogo cuando las apps en segundo plano no responden"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Alertas de notificaciones"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Advertencia en pantalla cuando una app publica una notificación sin canal válido"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Acc. dir. notif. de conv."</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Notif. requieren acc. dir. permanente de uso comp."</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"Forzar permisos en almacenamiento externo"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Cualquier app puede escribirse en un almacenamiento externo, sin importar los valores del manifiesto"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"Forzar actividades para que cambien de tamaño"</string>
@@ -429,13 +433,17 @@
     <string name="power_discharge_by_enhanced" msgid="563438403581662942">"Duración aproximada hasta <xliff:g id="TIME">%1$s</xliff:g> según el uso (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
     <string name="power_discharge_by_only_enhanced" msgid="3268796172652988877">"Debería durar aproximadamente hasta <xliff:g id="TIME">%1$s</xliff:g> según el uso"</string>
     <string name="power_discharge_by" msgid="4113180890060388350">"Duración aproximada hasta: <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_discharge_by_only" msgid="92545648425937000">"Debería durar aproximadamente hasta <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <string name="power_discharge_by_only" msgid="92545648425937000">"Debería durar aproximadamente hasta: <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"Hasta <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Es posible que la batería se agote para las <xliff:g id="TIME">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"Tiempo restante: menos de <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"Tiempo restante: menos de <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"Tiempo restante: más de <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"Tiempo restante: más de <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"Es posible que pronto se apague el teléfono"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"Es posible que pronto se apague la tablet"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"Es posible que pronto se apague el dispositivo"</string>
@@ -454,7 +462,7 @@
     <string name="battery_info_status_full" msgid="4443168946046847468">"Cargado"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Controlada por el administrador"</string>
     <string name="disabled" msgid="8017887509554714950">"Inhabilitada"</string>
-    <string name="external_source_trusted" msgid="1146522036773132905">"Permitida"</string>
+    <string name="external_source_trusted" msgid="1146522036773132905">"Con permiso"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"No permitida"</string>
     <string name="install_other_apps" msgid="3232595082023199454">"Instalar apps desconocidas"</string>
     <string name="home" msgid="973834627243661438">"Pantalla de configuración"</string>
diff --git a/packages/SettingsLib/res/values-es/arrays.xml b/packages/SettingsLib/res/values-es/arrays.xml
index a403e3e6..6e69c71 100644
--- a/packages/SettingsLib/res/values-es/arrays.xml
+++ b/packages/SettingsLib/res/values-es/arrays.xml
@@ -26,7 +26,7 @@
     <item msgid="6050951078202663628">"Estableciendo conexión..."</item>
     <item msgid="8356618438494652335">"Autenticando..."</item>
     <item msgid="2837871868181677206">"Obteniendo dirección IP…"</item>
-    <item msgid="4613015005934755724">"Conexión establecida"</item>
+    <item msgid="4613015005934755724">"Conectado"</item>
     <item msgid="3763530049995655072">"Suspendida"</item>
     <item msgid="7852381437933824454">"Desconectando..."</item>
     <item msgid="5046795712175415059">"Desconectado"</item>
diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml
index d777723..e7a8475 100644
--- a/packages/SettingsLib/res/values-es/strings.xml
+++ b/packages/SettingsLib/res/values-es/strings.xml
@@ -212,7 +212,7 @@
     <string name="adb_wireless_settings" msgid="2295017847215680229">"Depuración inalámbrica"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Para ver y utilizar los dispositivos disponibles, activa la depuración inalámbrica"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Vincular dispositivo con código QR"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"Vincula nuevos dispositivos con el escáner de códigos QR"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"Vincula nuevos dispositivos con el escáner de códigos QR"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Vincular dispositivo con código de sincronización"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Vincula nuevos dispositivos con un código de seis dígitos"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"Dispositivos vinculados"</string>
@@ -230,8 +230,8 @@
     <string name="adb_wireless_verifying_qrcode_text" msgid="6123192424916029207">"Vinculando dispositivo…"</string>
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"No se ha podido vincular el dispositivo. El código QR no era correcto o el dispositivo no estaba conectado a la misma red."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"Dirección IP y puerto"</string>
-    <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"Escanear código QR"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"Vincula un dispositivo a través de Wi‑Fi con un código QR"</string>
+    <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"Escanea el código QR"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Vincula un dispositivo a través de Wi‑Fi escaneando un código QR"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Conéctate a una red Wi-Fi"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, depuración, desarrollo"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"Atajo a informe de errores"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"Certificación de pantalla inalámbrica"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"Habilitar registro de Wi-Fi detallado"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"Limitación de búsqueda de redes Wi‑Fi"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"Aleatorización de MAC mejorada por Wi-Fi"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"Datos móviles siempre activos"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"Aceleración por hardware para conexión compartida"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Mostrar dispositivos Bluetooth sin nombre"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Mostrar opciones para la certificación de la pantalla inalámbrica"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Aumentar el nivel de registro de Wi-Fi y mostrar por SSID RSSI en el selector Wi-Fi"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Reduce el consumo de batería y mejora el rendimiento de las redes"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Este interruptor solo afecta al comportamiento al aleatorizar direcciones MAC en el modo cliente.\nCuando este modo está activado, las direcciones MAC de las redes que tengan activada la aleatorización de la dirección MAC se pueden volver a aleatorizar durante la asociación. Esto depende de la última vez en la que el cliente se desconectó de la red. No se volverán a aleatorizar si transcurrieron 4 horas o menos desde la última conexión del dispositivo."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"Medida"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"No medida"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"Tamaños del búfer para registrar"</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"Mostrar el diálogo de que la aplicación no responde para aplicaciones en segundo plano"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Ver advertencias del canal de notificaciones"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Mostrar una advertencia en pantalla cuando una aplicación publica una notificación sin un canal válido"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Implementar atajos en notific. de conversaciones"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Exigir que las notificaciones tengan un atajo para compartir y que así aparezcan en la sección de conversaciones"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"Forzar permitir aplicaciones de forma externa"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Hacer que cualquier aplicación se pueda escribir en un dispositivo de almacenamiento externo independientemente de los valores definidos"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"Forzar el ajuste de tamaño de las actividades"</string>
@@ -427,15 +431,19 @@
     <!-- no translation found for power_remaining_duration_only_short (7438846066602840588) -->
     <skip />
     <string name="power_discharge_by_enhanced" msgid="563438403581662942">"Debería durar aproximadamente hasta <xliff:g id="TIME">%1$s</xliff:g> según el uso (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_discharge_by_only_enhanced" msgid="3268796172652988877">"Duración aproximada hasta: <xliff:g id="TIME">%1$s</xliff:g> (según el uso)"</string>
+    <string name="power_discharge_by_only_enhanced" msgid="3268796172652988877">"Debería durar hasta las <xliff:g id="TIME">%1$s</xliff:g> basado en tu uso"</string>
     <string name="power_discharge_by" msgid="4113180890060388350">"Debería durar aproximadamente hasta <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_discharge_by_only" msgid="92545648425937000">"Duración aproximada hasta: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <string name="power_discharge_by_only" msgid="92545648425937000">"Debería durar hasta las <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"Hasta: <xliff:g id="TIME">%1$s</xliff:g>"</string>
-    <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Es probable que te quedes sin batería sobre esta hora: <xliff:g id="TIME">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"Tiempo restante: menos de <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"Queda menos del <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"Queda más del <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"Tiempo restante: más de <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+    <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Puede que se agote la batería sobre las <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"Es posible que el teléfono se apague pronto"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"Es posible que el tablet se apague pronto"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"Es posible que el dispositivo se apague pronto"</string>
@@ -443,14 +451,14 @@
     <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"Es posible que el tablet se apague pronto (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
     <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"Es posible que el dispositivo se apague pronto (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
     <string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
-    <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"<xliff:g id="TIME">%1$s</xliff:g> hasta que termine de cargarse"</string>
-    <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> (<xliff:g id="TIME">%2$s</xliff:g> hasta que termine de cargarse)"</string>
+    <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"<xliff:g id="TIME">%1$s</xliff:g> hasta cargarse completamente"</string>
+    <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> (<xliff:g id="TIME">%2$s</xliff:g> hasta cargarse completamente)"</string>
     <string name="battery_info_status_unknown" msgid="268625384868401114">"Desconocido"</string>
     <string name="battery_info_status_charging" msgid="4279958015430387405">"Cargando"</string>
     <string name="battery_info_status_charging_fast" msgid="8027559755902954885">"Cargando rápidamente"</string>
     <string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Cargando lentamente"</string>
     <string name="battery_info_status_discharging" msgid="6962689305413556485">"No se está cargando"</string>
-    <string name="battery_info_status_not_charging" msgid="8330015078868707899">"Se ha conectado, pero no se puede cargar en este momento"</string>
+    <string name="battery_info_status_not_charging" msgid="8330015078868707899">"Enchufado, pero no se puede cargar en este momento"</string>
     <string name="battery_info_status_full" msgid="4443168946046847468">"Completa"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Controlada por el administrador"</string>
     <string name="disabled" msgid="8017887509554714950">"Inhabilitada"</string>
@@ -505,7 +513,7 @@
     <string name="zen_mode_duration_settings_title" msgid="1553451650289651489">"Duración"</string>
     <string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Preguntar siempre"</string>
     <string name="zen_mode_forever" msgid="3339224497605461291">"Hasta que se desactive"</string>
-    <string name="time_unit_just_now" msgid="3006134267292728099">"Justo ahora"</string>
+    <string name="time_unit_just_now" msgid="3006134267292728099">"justo ahora"</string>
     <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Altavoz del teléfono"</string>
     <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"No se ha podido conectar; reinicia el dispositivo"</string>
     <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispositivo de audio con cable"</string>
@@ -532,7 +540,7 @@
     <string name="user_add_user_message_long" msgid="1527434966294733380">"Puedes compartir este dispositivo si creas más usuarios. Cada uno tendrá su propio espacio y podrá personalizarlo con aplicaciones, un fondo de pantalla y mucho más. Los usuarios también pueden ajustar opciones del dispositivo, como la conexión Wi‑Fi, que afectan a todos los usuarios.\n\nCuando añadas un usuario, tendrá que configurar su espacio.\n\nCualquier usuario puede actualizar aplicaciones de todos los usuarios. Es posible que no se transfieran los servicios y opciones de accesibilidad al nuevo usuario."</string>
     <string name="user_add_user_message_short" msgid="3295959985795716166">"Al añadir un usuario nuevo, este debe configurar su espacio.\n\nCualquier usuario puede actualizar las aplicaciones del resto de usuarios."</string>
     <string name="user_setup_dialog_title" msgid="8037342066381939995">"¿Configurar usuario ahora?"</string>
-    <string name="user_setup_dialog_message" msgid="269931619868102841">"Asegúrate de que la persona pueda acceder al dispositivo y configurar su espacio."</string>
+    <string name="user_setup_dialog_message" msgid="269931619868102841">"Asegúrate de que la persona está disponible en este momento para usar el dispositivo y configurar su espacio."</string>
     <string name="user_setup_profile_dialog_message" msgid="4788197052296962620">"¿Quieres configurar un perfil ahora?"</string>
     <string name="user_setup_button_setup_now" msgid="1708269547187760639">"Configurar ahora"</string>
     <string name="user_setup_button_setup_later" msgid="8712980133555493516">"Ahora no"</string>
diff --git a/packages/SettingsLib/res/values-et/strings.xml b/packages/SettingsLib/res/values-et/strings.xml
index 1fa4159..f42111d 100644
--- a/packages/SettingsLib/res/values-et/strings.xml
+++ b/packages/SettingsLib/res/values-et/strings.xml
@@ -212,7 +212,7 @@
     <string name="adb_wireless_settings" msgid="2295017847215680229">"Juhtmevaba silumine"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Saadaolevate seadmete nägemiseks ja kasutamiseks lülitage sisse juhtmevaba silumine"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Seadme sidumine QR-koodiga"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"Uute seadmete sidumine QR-koodi skanneriga"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"Uute seadmete sidumine QR-koodi skanneriga"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Seadme sidumine sidumiskoodiga"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Uute seadmete sidumine kuuekohalise koodiga"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"Seotud seadmed"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Seadme sidumine ebaõnnestus. QR-kood oli vale või seade ei ole ühendatud samasse võrku."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"IP-aadress ja port"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"QR-koodi skannimine"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"Siduge seade WiFi kaudu, skannides QR-koodi"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Siduge seade WiFi kaudu, skannides QR-koodi"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Looge ühendus WiFi-võrguga"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, silumine, arendus"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"Veaaruande otsetee"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"Juhtmeta ekraaniühenduse sertifitseerimine"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"Luba WiFi sõnaline logimine"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"WiFi-skannimise ahendamine"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"WiFi-põhine MAC-i juhuslikustamine"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"Hoia mobiilne andmeside alati aktiivne"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"Ühenduse jagamise riistvaraline kiirendus"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Kuva ilma nimedeta Bluetoothi seadmed"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Juhtmeta ekraaniühenduse sertifitseerimisvalikute kuvamine"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Suurenda WiFi logimistaset, kuva WiFi valijas SSID RSSI järgi"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Aeglustab aku tühjenemist ja parandab võrgu toimivust"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"See lüliti mõjutab MAC-aadressi juhuslikustamise käitumist ainult kliendirežiimis.\nSelle režiimi aktiveerimisel võidakse seostamise ajal MAC-aadressid uuesti juhuslikustada kõigi võrkude jaoks, millel on MAC-aadressi juhuslikustamine lubatud, olenevalt sellest, millal klient viimati ühenduse võrguga katkestas. Uuesti juhuslikustamist ei toimu juhul, kui seade loob uuesti ühenduse kuni 4 tunni jooksul."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"Mahupõhine"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"Mittemahupõhine"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"Logija puhvri suurused"</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"Kuva taustarakenduste puhul dialoog Rakendus ei reageeri"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Kuva märguandekanali hoiatused"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Esitab ekraanil hoiatuse, kui rakendus postitab kehtiva kanalita märguande"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Otseteede jõustamine vestluste märguannete jaoks"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Nõutakse märguannete toetamist pikaajalise jagamise otseteega, et selle saaks vestluse jaotises kuvada"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"Luba rakendused välises salvestusruumis"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Lubab mis tahes rakendusi kirjutada välisesse salvestusruumi manifesti väärtustest olenemata"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"Muuda tegevuste suurused muudetavaks"</string>
@@ -417,7 +421,7 @@
     <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomaalia (punane-roheline)"</string>
     <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomaalia (sinine-kollane)"</string>
     <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Värvide korrigeerimine"</string>
-    <string name="accessibility_display_daltonizer_preference_subtitle" msgid="1284746051652993443">"Värviparandus võimaldab kohandada seadmes kuvatavaid värve"</string>
+    <string name="accessibility_display_daltonizer_preference_subtitle" msgid="1284746051652993443">"Värvikorrigeerimine võimaldab kohandada seadmes kuvatavaid värve"</string>
     <string name="daltonizer_type_overridden" msgid="4509604753672535721">"Alistas <xliff:g id="TITLE">%1$s</xliff:g>"</string>
     <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> – <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
     <string name="power_remaining_duration_only" msgid="8264199158671531431">"Ligikaudu <xliff:g id="TIME_REMAINING">%1$s</xliff:g> jäänud"</string>
@@ -432,10 +436,14 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"Peaks kestma kuni <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"Kuni <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Aku võib tühjaks saada kell <xliff:g id="TIME">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"Jäänud on alla <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"Jäänud on alla <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"Jäänud on üle <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"Jäänud on üle <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"Telefon võib peagi välja lülituda"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"Tahvelarvuti võib peagi välja lülituda"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"Seade võib peagi välja lülituda"</string>
diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml
index 2700162..85260fe 100644
--- a/packages/SettingsLib/res/values-eu/strings.xml
+++ b/packages/SettingsLib/res/values-eu/strings.xml
@@ -126,7 +126,7 @@
     <string name="bluetooth_talkback_imaging" msgid="8781682986822514331">"Irudietarako gailua"</string>
     <string name="bluetooth_talkback_headphone" msgid="8613073829180337091">"Entzungailua"</string>
     <string name="bluetooth_talkback_input_peripheral" msgid="5133944817800149942">"Idazteko gailua"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1143241359781999989">"Bluetooth gailua"</string>
+    <string name="bluetooth_talkback_bluetooth" msgid="1143241359781999989">"Bluetooth bidezko gailua"</string>
     <string name="bluetooth_hearingaid_left_pairing_message" msgid="8561855779703533591">"Ezkerreko audifonoa parekatzen…"</string>
     <string name="bluetooth_hearingaid_right_pairing_message" msgid="2655347721696331048">"Eskuineko audifonoa parekatzen…"</string>
     <string name="bluetooth_hearingaid_left_battery_level" msgid="7375621694748104876">"Ezkerrekoa. Bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
@@ -144,10 +144,10 @@
     <string name="data_usage_uninstalled_apps_users" msgid="5533981546921913295">"Kendutako aplikazioak eta erabiltzaileak"</string>
     <string name="data_usage_ota" msgid="7984667793701597001">"Sistemaren eguneratzeak"</string>
     <string name="tether_settings_title_usb" msgid="3728686573430917722">"Konexioa partekatzea (USB)"</string>
-    <string name="tether_settings_title_wifi" msgid="4803402057533895526">"Sare publiko eramangarria"</string>
+    <string name="tether_settings_title_wifi" msgid="4803402057533895526">"Wifi-gune eramangarria"</string>
     <string name="tether_settings_title_bluetooth" msgid="916519902721399656">"Konexioa partekatzea (Bluetooth)"</string>
     <string name="tether_settings_title_usb_bluetooth" msgid="1727111807207577322">"Konexioa partekatzea"</string>
-    <string name="tether_settings_title_all" msgid="8910259483383010470">"Konexioa partekatzea eta sare publikoak"</string>
+    <string name="tether_settings_title_all" msgid="8910259483383010470">"Konexioa partekatzea eta wifi-gune eramangarriak"</string>
     <string name="managed_user_title" msgid="449081789742645723">"Laneko aplikazio guztiak"</string>
     <string name="user_guest" msgid="6939192779649870792">"Gonbidatua"</string>
     <string name="unknown" msgid="3544487229740637809">"Ezezaguna"</string>
@@ -212,7 +212,7 @@
     <string name="adb_wireless_settings" msgid="2295017847215680229">"Hari gabeko arazketa"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Erabilgarri dauden gailuak ikusteko eta erabiltzeko, aktibatu hari gabeko arazketa"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Parekatu gailua QR kodearekin"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"Parekatu gailu gehiago QR kodea eskaneatuta"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"Parekatu gailu gehiago QR kodea eskaneatuta"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Parekatu gailua parekatze-kodearekin"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Parekatu gailu gehiago sei digituko kodearekin"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"Parekatutako gailuak"</string>
@@ -231,11 +231,11 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Ezin izan da parekatu gailua. QR kodea ez da zuzena edo gailua ez dago sare berera konektatuta."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"IP helbidea eta ataka"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"Eskaneatu QR kodea"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"Parekatu gailua wifi-sare baten bidez QR kode bat eskaneatuta"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Parekatu gailua wifi-sare baten bidez QR kode bat eskaneatuta"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Konektatu wifi-sare batera"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, araztu, gailua"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"Akatsen txostenerako lasterbidea"</string>
-    <string name="bugreport_in_power_summary" msgid="1885529649381831775">"Pizteko menuan, erakutsi akatsen txostena sortzeko botoia"</string>
+    <string name="bugreport_in_power_summary" msgid="1885529649381831775">"Itzaltzeko menuan, erakutsi akatsen txostena sortzeko botoia"</string>
     <string name="keep_screen_on" msgid="1187161672348797558">"Mantendu aktibo"</string>
     <string name="keep_screen_on_summary" msgid="1510731514101925829">"Pantaila ez da ezarriko inoiz inaktibo kargatu bitartean"</string>
     <string name="bt_hci_snoop_log" msgid="7291287955649081448">"Gaitu Bluetooth HCI miatze-erregistroa"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"Hari gabe bistaratzeko ziurtagiria"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"Gaitu wifi-sareetan saioa hasteko modu xehatua"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"Wifi-sareen bilaketaren muga"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"Wifi bidez hobetutako MAC helbideak ausaz aukeratzeko eginbidea"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"Datu-konexioa beti aktibo"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"Konexioa partekatzeko hardwarearen azelerazioa"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Erakutsi Bluetooth bidezko gailuak izenik gabe"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Erakutsi hari gabe bistaratzeko ziurtagiriaren aukerak"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Erakutsi datu gehiago wifi-sareetan saioa hastean. Erakutsi sarearen identifikatzailea eta seinalearen indarra wifi-sareen hautatzailean."</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Bateria gutxiago kontsumituko da, eta sarearen errendimendua hobetuko."</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Bezero modurako soilik MAC helbideak ausaz aukeratzeko eginbidearen portaerari eragiten dio etengailu honek.\nModu hau aktibatuta dagoenean, baliteke MAC helbideak ausaz aukeratzeko eginbidea aktibatuta daukaten sareen MAC helbideak berriro ausaz aukeratzea haiek lotu bitartean, bezeroa saretik deskonektatuta ematen duen denboraren arabera. Gailua lau ordu edo gutxiagoren buruan berriro konektatzen bada, ez da berriro MAC helbiderik ausaz aukeratuko."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"Sare neurtua"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"Neurtu gabeko sarea"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"Erregistroen buffer-tamainak"</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"Erakutsi aplikazioak ez erantzutearen (ANR) leihoa atzeko planoan dabiltzan aplikazioen kasuan"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Erakutsi jakinarazpenen kanalen abisuak"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Bistaratu abisuak aplikazioek baliozko kanalik gabeko jakinarazpenak argitaratzean"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Erabili lasterbideak elkarrizketen jakinarazpenetan"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Eskatu jakinarazpenak partekatze-lasterbide iragankor batean oinarrituta egotea elkarrizketa-atalean agertzeko"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"Behartu aplikazioak onartzea kanpoko memorian"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Aplikazioek kanpoko memorian idatz dezakete, ezarritako balioak kontuan izan gabe"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"Behartu jardueren tamaina doitu ahal izatea"</string>
@@ -432,10 +436,14 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"Ordu honetara arte iraungo du, gutxi gorabehera: <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"<xliff:g id="TIME">%1$s</xliff:g> arte"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Baliteke bateria ordu honetan agortzea: <xliff:g id="TIME">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"<xliff:g id="THRESHOLD">%1$s</xliff:g> baino gutxiago gelditzen dira"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"<xliff:g id="THRESHOLD">%1$s</xliff:g> baino gutxiago gelditzen da (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> baino gehiago gelditzen da (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> baino gehiago gelditzen da"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"Baliteke telefonoa laster itzaltzea"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"Baliteke tableta laster itzaltzea"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"Baliteke gailua laster itzaltzea"</string>
@@ -456,7 +464,7 @@
     <string name="disabled" msgid="8017887509554714950">"Desgaituta"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"Baimena dauka"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"Ez dauka baimenik"</string>
-    <string name="install_other_apps" msgid="3232595082023199454">"Aplikazio ezezagunak instalatzea"</string>
+    <string name="install_other_apps" msgid="3232595082023199454">"Instalatu aplikazio ezezagunak"</string>
     <string name="home" msgid="973834627243661438">"Ezarpenen hasierako pantaila"</string>
   <string-array name="battery_labels">
     <item msgid="7878690469765357158">"% 0"</item>
diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml
index 1c32926..6afa889 100644
--- a/packages/SettingsLib/res/values-fa/strings.xml
+++ b/packages/SettingsLib/res/values-fa/strings.xml
@@ -212,7 +212,7 @@
     <string name="adb_wireless_settings" msgid="2295017847215680229">"اشکال‌زدایی بی‌سیم"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"برای مشاهده و استفاده از دستگاه‌های در دسترس، اشکال‌زدایی بی‌سیم را روشن کنید"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"‏مرتبط کردن دستگاه با کد QR"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"‏دستگاه‌های جدید را با استفاده از اسکنر کد QR مرتبط کنید"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"‏دستگاه‌های جدید را بااستفاده از اسکنر کد QR مرتبط کنید"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"مرتبط کردن دستگاه با کد مرتبط‌سازی"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"دستگاه‌های جدید را با استفاده از کد شش رقمی مرتبط کنید"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"دستگاه‌های مرتبط‌شده"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"‏مرتبط کردن دستگاه انجام نشد. یا کد QR اشتباه بوده است، یا دستگاه به همان شبکه متصل نیست."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"‏نشانی IP و درگاه"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"‏اسکن کد QR"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"‏دستگاه را ازطریق Wi‑Fi و با اسکن کردن کد QR مرتبط کنید"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"‏دستگاه را ازطریق Wi‑Fi و با اسکن کردن کد QR مرتبط کنید"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"‏لطفاً به شبکه Wi-Fi متصل شوید"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"‏ADB (پل اشکال‌زدایی Android)، اشکال‌زدایی کردن، برنامه‌نویس"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"میان‌بر گزارش مشکل"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"گواهینامه نمایش بی‌سیم"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"‏فعال کردن گزارش‌گیری طولانی Wi‑Fi"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"‏محدود کردن اسکن کردن Wi‑Fi"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"‏تصادفی‌سازی MAC بهبودیافته برای Wi-Fi"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"داده تلفن همراه همیشه فعال باشد"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"شتاب سخت‌افزاری اتصال به اینترنت با تلفن همراه"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"نمایش دستگاه‌های بلوتوث بدون نام"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"نمایش گزینه‌ها برای گواهینامه نمایش بی‌سیم"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"‏افزایش سطح گزارش‌گیری Wi‑Fi، نمایش به ازای SSID RSSI در انتخاب‌کننده Wi‑Fi"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"تخلیه باتری راکاهش می‌دهد و عملکرد شبکه را بهبود می‌بخشد"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"‏فعال/غیرفعال کردن این تنظیم فقط درحالت کارخواه بر عملکرد تصادفی‌سازی MAC تأثیر می‌گذارد.\nوقتی این حالت فعال باشد، ممکن است در شبکه‌هایی که تصادفی‌سازی MAC فعال است، نشانی‌های MAC درطول ارتباط دوباره تصادفی‌سازی شوند، بسته به اینکه اتصال کارخواه آخرین بار چه زمانی از شبکه قطع شده باشد. اگر دستگاه ظرف ۴ ساعت یا کمتر دوباره متصل شود، تصادفی‌سازی مجدد انجام نمی‌شود."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"محدودشده"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"محدودنشده"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"اندازه‌های حافظه موقت ثبت‌کننده"</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"نمایش گفتگوی \"برنامه پاسخ نمی‌دهد\" برای برنامه‌های پس‌زمینه"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"نمایش هشدارهای کانال اعلان"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"هنگامی که برنامه‌ای بدون وجود کانالی معتبر، اعلانی پست می‌کند، هشدار روی صفحه‌ای نمایش می‌دهد"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"اجرای میان‌برها برای اعلان‌های مکالمه"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"اعلان‌ها باید با میان‌بر ماندگار هم‌رسانی پشتیبانی شوند تا در بخش مکالمه نشان داده شوند"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"اجازه اجباری به برنامه‌های دستگاه ذخیره خارجی"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"بدون توجه به مقادیر آشکار، هر برنامه‌ای را برای نوشتن در حافظه خارجی واجد شرایط می‌کند"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"اجبار فعالیت‌ها به قابل تغییر اندازه بودن"</string>
@@ -432,10 +436,14 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"باید حدوداً تا <xliff:g id="TIME">%1$s</xliff:g> شارژ داشته باشید"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"تا <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"ممکن است باتری در <xliff:g id="TIME">%1$s</xliff:g> تمام شود"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"کمتر از <xliff:g id="THRESHOLD">%1$s</xliff:g> باقی مانده"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"کمتر از <xliff:g id="THRESHOLD">%1$s</xliff:g> شارژ باقی مانده است (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"بیش از <xliff:g id="TIME_REMAINING">%1$s</xliff:g> شارژ باقی مانده است (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"بیش از <xliff:g id="TIME_REMAINING">%1$s</xliff:g> باقی مانده است"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"ممکن است تلفن به‌زودی خاموش شود"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"ممکن است رایانه لوحی به‌زودی خاموش شود"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"ممکن است دستگاه به‌زودی خاموش شود"</string>
diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml
index 765e08e..9e1fa76 100644
--- a/packages/SettingsLib/res/values-fi/strings.xml
+++ b/packages/SettingsLib/res/values-fi/strings.xml
@@ -212,7 +212,7 @@
     <string name="adb_wireless_settings" msgid="2295017847215680229">"Langaton virheenkorjaus"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Laita langaton virheenkorjaus päälle, niin voit nähdä saatavilla olevat laitteet ja käyttää niitä"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Muodosta laitepari QR-koodilla"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"Muodosta uusia laitepareja QR-koodiskannerilla"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"Muodosta uusia laitepareja QR-koodiskannerilla"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Yhdistä laite laiteparikoodilla"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Muodosta uusia laitepareja kuusinumeroisella koodilla"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"Laiteparit"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Laiteparin muodostus ei onnistunut. QR-koodi oli virheellinen, tai laitetta ei ole yhdistetty samaan verkkoon."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"IP-osoite &amp; portti"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"Skannaa QR-koodi"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"Muodosta laitepari Wi-Fi-yhteyden kautta skannaamalla QR-koodi"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Muodosta laitepari Wi-Fi-yhteyden kautta skannaamalla QR-koodi"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Yhdistä langattomaan verkkoon"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, virheenkorjaus, kehittäminen"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"Virheraportin pikakuvake"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"Langattoman näytön sertifiointi"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"Käytä Wi-Fin laajennettua lokikirjausta"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"Wi‑Fi-haun rajoitus"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"Wi-Fi-paranneltu MAC-satunnaistaminen"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"Mobiilidata aina käytössä"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"Laitteistokiihdytyksen yhteyden jakaminen"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Näytä nimettömät Bluetooth-laitteet"</string>
@@ -278,11 +279,12 @@
     <string name="private_dns_mode_off" msgid="7065962499349997041">"Pois käytöstä"</string>
     <string name="private_dns_mode_opportunistic" msgid="1947864819060442354">"Automaattinen"</string>
     <string name="private_dns_mode_provider" msgid="3619040641762557028">"Yksityisen DNS-tarjoajan isäntänimi"</string>
-    <string name="private_dns_mode_provider_hostname_hint" msgid="6564868953748514595">"Anna isäntänimi tai DNS-tarjoaja."</string>
+    <string name="private_dns_mode_provider_hostname_hint" msgid="6564868953748514595">"Anna isäntänimi tai DNS-tarjoaja"</string>
     <string name="private_dns_mode_provider_failure" msgid="8356259467861515108">"Ei yhteyttä"</string>
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Näytä langattoman näytön sertifiointiin liittyvät asetukset."</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Lisää Wi‑Fin lokikirjaustasoa, näytä SSID RSSI -kohtaisesti Wi‑Fi-valitsimessa."</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Vähentää virrankulutusta ja parantaa verkon toimintaa"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Tämä vaihto vaikuttaa MAC-satunnaistamistoimintaan vain asiakastilassa.\nTämän tilan ollessa aktivoituna niiden verkkojen, joissa MAC-satunnaistaminen on käytössä, MAC-osoitteet voidaan satunnaistaa uudelleen yhdistämisen aikana riippuen siitä, milloin asiakas katkaisi viimeksi yhteyden verkkoon. Uudelleensatunnaistamista ei tapahdu, jos laite yhdistetään uudelleen enintään neljän tunnin sisällä."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"Maksullinen"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"Maksuton"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"Lokipuskurien koot"</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"Näytä taustalla olevien sovellusten Sovellus ei vastaa ‑valintaikkunat."</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Näytä ilmoituskanavan varoitukset"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Näyttää varoituksen, kun sovellus julkaisee ilmoituksen ilman kelvollista kanavaa."</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Pakota pikanäppäimet keskusteluilmoituksissa"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Vaadi ilmoitusten tukemista pitkäaikaisella jakopikanäppäimellä, jotta ne näkyvät keskusteluosiossa"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"Salli aina ulkoinen tallennus"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Mahdollistaa sovelluksen tietojen tallentamisen ulkoiseen tallennustilaan luetteloarvoista riippumatta."</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"Pakota kaikki toiminnot hyväksymään koon muutos"</string>
@@ -416,7 +420,7 @@
     <string name="daltonizer_mode_deuteranomaly" msgid="3507284319584683963">"Deuteranomalia (puna-vihersokeus)"</string>
     <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomalia (puna-vihersokeus)"</string>
     <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomalia (sini-keltasokeus)"</string>
-    <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Värikorjaus"</string>
+    <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Värinkorjaus"</string>
     <string name="accessibility_display_daltonizer_preference_subtitle" msgid="1284746051652993443">"Värinkorjauksella voit muuttaa värien näkymistä laitteellasi"</string>
     <string name="daltonizer_type_overridden" msgid="4509604753672535721">"Tämän ohittaa <xliff:g id="TITLE">%1$s</xliff:g>"</string>
     <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> – <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
@@ -432,10 +436,14 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"Varaus loppuu noin <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"<xliff:g id="TIME">%1$s</xliff:g> saakka"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Akku voi loppua <xliff:g id="TIME">%1$s</xliff:g> mennessä"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"Alle <xliff:g id="THRESHOLD">%1$s</xliff:g> jäljellä"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"Alle <xliff:g id="THRESHOLD">%1$s</xliff:g> jäljellä (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"Yli <xliff:g id="TIME_REMAINING">%1$s</xliff:g> jäljellä (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"Yli <xliff:g id="TIME_REMAINING">%1$s</xliff:g> jäljellä"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"Puhelin voi sammua pian"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"Tabletti voi sammua pian"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"Laite voi sammua pian"</string>
@@ -504,7 +512,7 @@
     <string name="alarm_template_far" msgid="6382760514842998629">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
     <string name="zen_mode_duration_settings_title" msgid="1553451650289651489">"Kesto"</string>
     <string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Kysy aina"</string>
-    <string name="zen_mode_forever" msgid="3339224497605461291">"Kunnes poistat sen käytöstä"</string>
+    <string name="zen_mode_forever" msgid="3339224497605461291">"Kunnes laitat pois päältä"</string>
     <string name="time_unit_just_now" msgid="3006134267292728099">"Äsken"</string>
     <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Puhelimen kaiutin"</string>
     <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Yhteysvirhe. Sammuta laite ja käynnistä se uudelleen."</string>
diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml
index d118e1f..146fbe9 100644
--- a/packages/SettingsLib/res/values-fr-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml
@@ -212,7 +212,7 @@
     <string name="adb_wireless_settings" msgid="2295017847215680229">"Débogage sans fil"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Pour afficher et utiliser les appareils à proximité, activez le débogage sans fil"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Associer l\'appareil à l\'aide d\'un code QR"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"Associer les nouveaux appareils à l\'aide d\'un lecteur de code QR"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"Associer les nouveaux appareils à l\'aide d\'un lecteur de code QR"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Associer l\'appareil avec un code d\'association"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Associer les nouveaux appareils à l\'aide d\'un code à six chiffres"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"Appareils associés"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Échec de l\'association de l\'appareil Soit le code QR est incorrect, soit l\'appareil n\'est pas connecté au même réseau."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"Adresse IP et port"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"Numériser le code QR"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"Associer un appareil par Wi-Fi en numérisant un code QR"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Associer un appareil par Wi-Fi en numérisant un code QR"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Veuillez vous connecter à un réseau Wi-Fi"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, débogage, concepteur"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"Raccourci de rapport de bogue"</string>
@@ -243,7 +243,7 @@
     <string name="oem_unlock_enable" msgid="5334869171871566731">"Déverrouillage par le fabricant"</string>
     <string name="oem_unlock_enable_summary" msgid="5857388174390953829">"Autoriser le déverrouillage du fichier d\'amorce"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="8249318129774367535">"Permettre le déverrouillage par le fabricant?"</string>
-    <string name="confirm_enable_oem_unlock_text" msgid="854131050791011970">"AVERTISSEMENT : Les fonctions de protection de l\'appareil ne fonctionneront pas sur cet appareil lorsque ce paramètre est activé."</string>
+    <string name="confirm_enable_oem_unlock_text" msgid="854131050791011970">"AVERTISSEMENT : Les fonctionnalités de protection de l\'appareil ne fonctionneront pas sur cet appareil lorsque ce paramètre est activé."</string>
     <string name="mock_location_app" msgid="6269380172542248304">"Sélectionner l\'application de localisation factice"</string>
     <string name="mock_location_app_not_set" msgid="6972032787262831155">"Aucune application de localisation factice définie"</string>
     <string name="mock_location_app_set" msgid="4706722469342913843">"Application de localisation factice : <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"Certification de l\'affichage sans fil"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"Autoriser enreg. données Wi-Fi détaillées"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"Limiter la recherche de réseaux Wi-Fi"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"Sélect. aléatoire adr. MAC optim. par Wi‑Fi"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"Données cellulaires toujours actives"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"Accélération matérielle pour le partage de connexion"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Afficher les appareils Bluetooth sans nom"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Afficher les options pour la certification d\'affichage sans fil"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Détailler davantage les données Wi-Fi, afficher par SSID RSSI dans sélect. Wi-Fi"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Réduit l\'utilisation de la pile et améliore les performances réseau"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Ce commutateur a un impact sur le comportement de sélection aléatoire des adresses MAC pour le mode client uniquement.\nLorsque ce mode est activé, l\'association pourrait forcer la réorganisation de manière aléatoire des adresses MAC pour les réseaux sur lesquels la sélection aléatoire des adresses MAC est activée, en fonction de la dernière fois que le client s\'est déconnecté du réseau. La réorganisation de manière aléatoire des adresses MAC ne se produit pas si l\'appareil se reconnecte d\'ici quatre heures ou moins."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"Facturé à l\'usage"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"Non mesuré"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"Tailles des mémoires tampons d\'enregistreur"</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"Afficher le message « L\'application ne répond plus » pour les applications en arrière-plan"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Affich. avertiss. canal notification"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Afficher avertiss. à l\'écran quand une app présente une notific. sans canal valide"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Appliquer les raccourcis pour les notifications de conversation"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Exiger le soutien des notifications par un raccourci de partage longue durée pour qu\'elles s\'affichent dans la section des conversations"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"Forcer l\'autor. d\'applis sur stockage externe"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Rend possible l\'enregistrement de toute application sur un espace de stockage externe, indépendamment des valeurs du fichier manifeste"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"Forcer les activités à être redimensionnables"</string>
@@ -432,10 +436,14 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"Devrait durer jusqu\'à environ <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"Jusqu\'à <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"La pile risque d\'être épuisée à <xliff:g id="TIME">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"Il reste moins de <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"Il reste moins de <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"Il reste plus de <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"Il reste plus de <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"Il se peut que le téléphone s\'éteigne bientôt"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"Il se peut que la tablette s\'éteigne bientôt"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"Il se peut que l\'appareil s\'éteigne bientôt"</string>
diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml
index f2dcbba..c2a8d49 100644
--- a/packages/SettingsLib/res/values-fr/strings.xml
+++ b/packages/SettingsLib/res/values-fr/strings.xml
@@ -143,7 +143,7 @@
     <string name="data_usage_uninstalled_apps" msgid="1933665711856171491">"Applications supprimées"</string>
     <string name="data_usage_uninstalled_apps_users" msgid="5533981546921913295">"Applications et utilisateurs supprimés"</string>
     <string name="data_usage_ota" msgid="7984667793701597001">"Mises à jour du système"</string>
-    <string name="tether_settings_title_usb" msgid="3728686573430917722">"Partage connexion Bluetooth par USB"</string>
+    <string name="tether_settings_title_usb" msgid="3728686573430917722">"Partage de connexion via USB"</string>
     <string name="tether_settings_title_wifi" msgid="4803402057533895526">"Point d\'accès Wi-Fi mobile"</string>
     <string name="tether_settings_title_bluetooth" msgid="916519902721399656">"Partage connexion Bluetooth"</string>
     <string name="tether_settings_title_usb_bluetooth" msgid="1727111807207577322">"Partage de connexion"</string>
@@ -206,13 +206,13 @@
     <string name="enable_adb" msgid="8072776357237289039">"Débogage USB"</string>
     <string name="enable_adb_summary" msgid="3711526030096574316">"Mode débogage lorsqu\'un câble USB est connecté"</string>
     <string name="clear_adb_keys" msgid="3010148733140369917">"Annuler autorisations pour débog. USB"</string>
-    <string name="enable_adb_wireless" msgid="6973226350963971018">"Débogage via Wi-Fi"</string>
+    <string name="enable_adb_wireless" msgid="6973226350963971018">"Débogage sans fil"</string>
     <string name="enable_adb_wireless_summary" msgid="7344391423657093011">"Mode de débogage en connexion Wi-Fi"</string>
     <string name="adb_wireless_error" msgid="721958772149779856">"Erreur"</string>
-    <string name="adb_wireless_settings" msgid="2295017847215680229">"Débogage via Wi-Fi"</string>
+    <string name="adb_wireless_settings" msgid="2295017847215680229">"Débogage sans fil"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Pour afficher et utiliser les appareils disponibles, activez le débogage sans fil"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Associer l\'appareil avec un code QR"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"Associer les nouveaux appareils à l\'aide d\'un lecteur de code QR"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"Associer les nouveaux appareils à l\'aide d\'un lecteur de code QR"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Associer l\'appareil avec un code d\'association"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Associer les nouveaux appareils à l\'aide d\'un code à six chiffres"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"Appareils associés"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Échec de l\'association à l\'appareil. Le code QR est incorrect, ou l\'appareil n\'est pas connecté au même réseau."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"Adresse IP et port"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"Scanner un code QR"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"Associer l\'appareil via le Wi‑Fi à l\'aide d\'un code QR"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Associer l\'appareil via le Wi‑Fi à l\'aide d\'un code QR"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Connectez-vous à un réseau Wi-Fi"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, débogage, dev"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"Raccourci vers rapport de bug"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"Certification affichage sans fil"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"Autoriser l\'enregistrement d\'infos Wi-Fi détaillées"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"Limiter la recherche Wi‑Fi"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"Chgt aléatoire d\'adresse MAC sur Wi-Fi"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"Données mobiles toujours actives"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"Accélération matérielle pour le partage de connexion"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Afficher les appareils Bluetooth sans nom"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Afficher les options pour la certification de l\'affichage sans fil"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Détailler les infos Wi-Fi, afficher par RSSI de SSID dans l\'outil de sélection Wi-Fi"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Réduit la décharge de la batterie et améliore les performances du réseau"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Ce paramètre modifie uniquement le changement aléatoire de l\'adresse MAC en mode client.\nSi ce mode est activé, les réseaux pour lesquels le changement aléatoire d\'adresse MAC est activé peuvent faire l\'objet de nouveaux changements aléatoires d\'adresse lors des associations, en fonction du temps écoulé depuis la dernière fois que le client s\'est déconnecté du réseau. Aucun changement aléatoire d\'adresse n\'a lieu si un appareil se connecte à nouveau après un délai inférieur à quatre heures."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"Facturé à l\'usage"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"Non facturé à l\'usage"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"Tailles des tampons de l\'enregistreur"</string>
@@ -300,8 +302,8 @@
     <string name="tethering_hardware_offload_summary" msgid="7801345335142803029">"Utiliser l\'accélération matérielle pour le partage de connexion, si disponible"</string>
     <string name="adb_warning_title" msgid="7708653449506485728">"Autoriser le débogage USB ?"</string>
     <string name="adb_warning_message" msgid="8145270656419669221">"Le débogage USB est conçu uniquement pour le développement. Utilisez-le pour copier des données entre votre ordinateur et votre appareil, installer des applications sur votre appareil sans notification et lire les données de journal."</string>
-    <string name="adbwifi_warning_title" msgid="727104571653031865">"Autoriser le débogage via Wi-Fi ?"</string>
-    <string name="adbwifi_warning_message" msgid="8005936574322702388">"Le débogage via Wi-Fi est conçu uniquement pour le développement. Utilisez-le pour copier des données entre votre ordinateur et votre appareil, installer des applications sur votre appareil sans notification et lire les données des journaux."</string>
+    <string name="adbwifi_warning_title" msgid="727104571653031865">"Autoriser le débogage sans fil ?"</string>
+    <string name="adbwifi_warning_message" msgid="8005936574322702388">"Le débogage sans fil est conçu uniquement pour le développement. Utilisez-le pour copier des données entre votre ordinateur et votre appareil, installer des applications sur votre appareil sans notification et lire les données des journaux."</string>
     <string name="adb_keys_warning_message" msgid="2968555274488101220">"Voulez-vous vraiment désactiver l\'accès au débogage USB de tous les ordinateurs précédemment autorisés ?"</string>
     <string name="dev_settings_warning_title" msgid="8251234890169074553">"Activer les paramètres de développement ?"</string>
     <string name="dev_settings_warning_message" msgid="37741686486073668">"Ces paramètres sont en cours de développement. Ils peuvent endommager votre appareil et les applications qui s\'y trouvent, ou provoquer leur dysfonctionnement."</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"Afficher la boîte de dialogue \"L\'application ne répond plus\" pour les applications en arrière-plan"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Afficher les avertissements liés aux canaux de notification"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Afficher un avertissement lorsqu\'une application publie une notification sans canal valide"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Utiliser des raccourcis pour les notifications des conversations"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Exiger la sauvegarde des notifications via un raccourci de partage permanent pour qu\'elles s\'affichent dans la section des conversations"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"Forcer l\'autorisation d\'applis sur stockage externe"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Autoriser l\'enregistrement de toute application sur un espace de stockage externe, indépendamment des valeurs du fichier manifeste"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"Forcer le redimensionnement des activités"</string>
@@ -416,7 +420,7 @@
     <string name="daltonizer_mode_deuteranomaly" msgid="3507284319584683963">"Deutéranomalie (rouge/vert)"</string>
     <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomalie (rouge/vert)"</string>
     <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomalie (bleu-jaune)"</string>
-    <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Correction couleur"</string>
+    <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Correction des couleurs"</string>
     <string name="accessibility_display_daltonizer_preference_subtitle" msgid="1284746051652993443">"La correction des couleurs vous permet d\'ajuster l\'affichage des couleurs sur votre appareil"</string>
     <string name="daltonizer_type_overridden" msgid="4509604753672535721">"Remplacé par <xliff:g id="TITLE">%1$s</xliff:g>"</string>
     <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> – <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
@@ -432,10 +436,14 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"Devrait durer jusqu\'à environ <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"Jusqu\'à <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"La batterie risque d\'être épuisée à <xliff:g id="TIME">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"Il reste moins de <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"Il reste moins de <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"Il reste plus de <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"Il reste plus de <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"Le téléphone va bientôt s\'éteindre"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"La tablette va bientôt s\'éteindre"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"L\'appareil va bientôt s\'éteindre"</string>
diff --git a/packages/SettingsLib/res/values-gl/strings.xml b/packages/SettingsLib/res/values-gl/strings.xml
index 9ee490f..2a6bcfc 100644
--- a/packages/SettingsLib/res/values-gl/strings.xml
+++ b/packages/SettingsLib/res/values-gl/strings.xml
@@ -206,13 +206,13 @@
     <string name="enable_adb" msgid="8072776357237289039">"Depuración por USB"</string>
     <string name="enable_adb_summary" msgid="3711526030096574316">"Modo de depuración de erros cando o USB está conectado"</string>
     <string name="clear_adb_keys" msgid="3010148733140369917">"Revogar as autorizacións de depuración por USB"</string>
-    <string name="enable_adb_wireless" msgid="6973226350963971018">"Depuración de erros sen fíos"</string>
+    <string name="enable_adb_wireless" msgid="6973226350963971018">"Depuración sen fíos"</string>
     <string name="enable_adb_wireless_summary" msgid="7344391423657093011">"Modo de depuración de erros ao conectarse a wifi"</string>
     <string name="adb_wireless_error" msgid="721958772149779856">"Produciuse un erro"</string>
-    <string name="adb_wireless_settings" msgid="2295017847215680229">"Depuración de erros sen fíos"</string>
-    <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Para ver e usar os dispositivos dispoñibles, activa a depuración de erros sen fíos"</string>
+    <string name="adb_wireless_settings" msgid="2295017847215680229">"Depuración sen fíos"</string>
+    <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Para ver e usar os dispositivos dispoñibles, activa a depuración sen fíos"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Vincular o dispositivo cun código QR"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"Vincula dispositivos novos mediante un escáner de códigos QR"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"Vincula dispositivos novos mediante un escáner de códigos QR"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Vincular o dispositivo co código de sincronización"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Vincula dispositivos novos mediante un código de seis díxitos"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"Dispositivos vinculados"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Produciuse un erro ao sincronizar o dispositivo. O código QR era incorrecto ou o dispositivo non está conectado á mesma rede."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"Enderezo IP e porto"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"Escanear o código QR"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"Vincula o dispositivo a través da wifi escaneando un código QR"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Vincula o dispositivo a través da wifi escaneando un código QR"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Conéctate a unha rede wifi"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, depuración, programador"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"Atallo do informe de erros"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"Certificado de visualización sen fíos"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"Activar rexistro detallado da wifi"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"Limitación da busca de wifi"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"Selección aleatoria de enderezo MAC"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"Datos móbiles sempre activados"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"Aceleración de hardware para conexión compartida"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Mostrar dispositivos Bluetooth sen nomes"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Mostra opcións para o certificado de visualización sen fíos"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Aumenta o nivel de rexistro da wifi, móstrao por SSID RSSI no selector de wifi"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Reduce o consumo de batería e mellora o rendemento da rede"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Esta opción só lle afecta ao comportamento da selección aleatoria de enderezo MAC do modo de cliente.\nCando este modo está activado, os enderezos MAC das redes que teñan activada a selección automática de enderezo MAC pódense volver seleccionar aleatoriamente durante a asociación. Isto depende de cando se desconectase da rede cada cliente por última vez, xa que a selección aleatoria non se repite se transcorreron 4 horas ou menos desde a última conexión."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"Sen tarifa plana"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"Con tarifa plana"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"Tamaño dos búfers do rexistrador"</string>
@@ -300,8 +302,8 @@
     <string name="tethering_hardware_offload_summary" msgid="7801345335142803029">"Se está dispoñible, úsase a aceleración de hardware para conexión compartida"</string>
     <string name="adb_warning_title" msgid="7708653449506485728">"Queres permitir a depuración por USB?"</string>
     <string name="adb_warning_message" msgid="8145270656419669221">"A depuración de erros USB está deseñada unicamente para fins de programación. Utilízaa para copiar datos entre o ordenador e o dispositivo, instalar aplicacións no dispositivo sen enviar notificacións e ler os datos do rexistro."</string>
-    <string name="adbwifi_warning_title" msgid="727104571653031865">"Queres permitir a depuración de erros sen fíos?"</string>
-    <string name="adbwifi_warning_message" msgid="8005936574322702388">"A depuración de erros sen fíos está deseñada unicamente para fins de programación. Utilízaa para copiar datos entre o ordenador e o dispositivo, instalar aplicacións no dispositivo sen recibir notificacións e ler os datos do rexistro."</string>
+    <string name="adbwifi_warning_title" msgid="727104571653031865">"Queres permitir a depuración sen fíos?"</string>
+    <string name="adbwifi_warning_message" msgid="8005936574322702388">"A depuración sen fíos está deseñada unicamente para fins de programación. Utilízaa para copiar datos entre o ordenador e o dispositivo, instalar aplicacións no dispositivo sen recibir notificacións e ler os datos do rexistro."</string>
     <string name="adb_keys_warning_message" msgid="2968555274488101220">"Queres revogar o acceso á depuración por USB desde todos os ordenadores que autorizaches previamente?"</string>
     <string name="dev_settings_warning_title" msgid="8251234890169074553">"Permitir a configuración de programación?"</string>
     <string name="dev_settings_warning_message" msgid="37741686486073668">"Esta configuración só está destinada á programación. Esta pode provocar que o dispositivo e as aplicacións fallen ou se comporten incorrectamente."</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"Indica que unha aplicación en segundo plano non responde"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Mostrar avisos de notificacións"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Mostra avisos cando unha aplicación publica notificacións sen unha canle válida"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Usar atallos para notificacións de conversas"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Require que as notificacións teñan un atallo de uso compartido permanente para aparecer na sección de conversas"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"Forzar permiso de aplicacións de forma externa"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Permite que calquera aplicación compatible se poida escribir nun almacenamento externo, independentemente dos valores do manifesto"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"Forzar o axuste do tamaño das actividades"</string>
@@ -432,10 +436,14 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"Debería durar aproximadamente ata a seguinte hora: <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"Ata: <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"A batería pode esgotarse á seguinte hora: <xliff:g id="TIME">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"Tempo restante inferior a <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"Tempo restante: menos de <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"Tempo restante: máis de <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"Tempo restante: máis de <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"O teléfono pode apagarse en breve"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"A tableta pode apagarse en breve"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"O dispositivo pode apagarse en breve"</string>
diff --git a/packages/SettingsLib/res/values-gu/arrays.xml b/packages/SettingsLib/res/values-gu/arrays.xml
index 8e28b8b..2a40a9e 100644
--- a/packages/SettingsLib/res/values-gu/arrays.xml
+++ b/packages/SettingsLib/res/values-gu/arrays.xml
@@ -89,16 +89,16 @@
     <item msgid="2494959071796102843">"સિસ્ટમ પસંદગીનો ઉપયોગ કરો (ડિફૉલ્ટ)"</item>
     <item msgid="4055460186095649420">"SBC"</item>
     <item msgid="720249083677397051">"AAC"</item>
-    <item msgid="1049450003868150455">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> ઑડિઓ"</item>
-    <item msgid="2908219194098827570">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> ઑડિઓ"</item>
+    <item msgid="1049450003868150455">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> ઑડિયો"</item>
+    <item msgid="2908219194098827570">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> ઑડિયો"</item>
     <item msgid="3825367753087348007">"LDAC"</item>
   </string-array>
   <string-array name="bluetooth_a2dp_codec_summaries">
     <item msgid="8868109554557331312">"સિસ્ટમ પસંદગીનો ઉપયોગ કરો (ડિફૉલ્ટ)"</item>
     <item msgid="9024885861221697796">"SBC"</item>
     <item msgid="4688890470703790013">"AAC"</item>
-    <item msgid="8627333814413492563">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> ઑડિઓ"</item>
-    <item msgid="3517061573669307965">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> ઑડિઓ"</item>
+    <item msgid="8627333814413492563">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> ઑડિયો"</item>
+    <item msgid="3517061573669307965">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> ઑડિયો"</item>
     <item msgid="2553206901068987657">"LDAC"</item>
   </string-array>
   <string-array name="bluetooth_a2dp_codec_sample_rate_titles">
diff --git a/packages/SettingsLib/res/values-gu/strings.xml b/packages/SettingsLib/res/values-gu/strings.xml
index 2fced2b..7ff8337 100644
--- a/packages/SettingsLib/res/values-gu/strings.xml
+++ b/packages/SettingsLib/res/values-gu/strings.xml
@@ -212,7 +212,7 @@
     <string name="adb_wireless_settings" msgid="2295017847215680229">"વાયરલેસ ડિબગીંગ"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"ઉપલબ્ધ ડિવાઇસને જોવા અને તેનો ઉપયોગ કરવા માટે, વાયરલેસ ડિબગીંગ ચાલુ કરો"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"QR કોડ વડે ડિવાઇસનું જોડાણ બનાવો"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"QR કોડ સ્કૅનરનો ઉપયોગ કરીને નવા ડિવાઇસનું જોડાણ બનાવો"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"QR કોડ સ્કૅનરનો ઉપયોગ કરીને નવા ડિવાઇસનું જોડાણ બનાવો"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"જોડાણ કરવાના કોડ વડે ડિવાઇસનું જોડાણ બનાવો"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"છ અંકના કોડનો ઉપયોગ કરીને નવા ડિવાઇસનું જોડાણ બનાવો"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"જોડાણ કરેલા ડિવાઇસ"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"ડિવાઇસનું જોડાણ કરવામાં નિષ્ફળ રહ્યાં. કાં તો QR કોડ ખોટો હતો અથવા ડિવાઇસ સમાન નેટવર્ક સાથે કનેક્ટ કરેલું નથી."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"IP ઍડ્રેસ &amp; પોર્ટ"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"QR કોડ સ્કૅન કરો"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"QR કોડને સ્કૅન કરીને વાઇ-ફાઇ પર ડિવાઇસનું જોડાણ બનાવો"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"QR કોડને સ્કૅન કરીને વાઇ-ફાઇ પર ડિવાઇસનું જોડાણ બનાવો"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"કૃપા કરીને વાઇ-ફાઇ નેટવર્કથી કનેક્ટ કરો"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, ડિબગ, ડેવ"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"બગ રિપોર્ટ શોર્ટકટ"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"વાયરલેસ ડિસ્પ્લે પ્રમાણન"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"વાઇ-ફાઇ વર્બોઝ લૉગિંગ ચાલુ કરો"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"વાઇ-ફાઇ સ્કૅનની ક્ષમતા મર્યાદિત કરવી"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"MAC રેન્ડમાઇઝ કરવામાં વાઇ-ફાઇનો ઉપયોગ"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"મોબાઇલ ડેટા હંમેશાં સક્રિય"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"ટિથરિંગ માટે હાર્ડવેર ગતિવૃદ્ધિ"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"નામ વિનાના બ્લૂટૂથ ઉપકરણો બતાવો"</string>
@@ -276,13 +277,14 @@
     <string name="select_private_dns_configuration_title" msgid="7887550926056143018">"ખાનગી DNS"</string>
     <string name="select_private_dns_configuration_dialog_title" msgid="3731422918335951912">"ખાનગી DNS મોડને પસંદ કરો"</string>
     <string name="private_dns_mode_off" msgid="7065962499349997041">"બંધ"</string>
-    <string name="private_dns_mode_opportunistic" msgid="1947864819060442354">"આપમેળે"</string>
+    <string name="private_dns_mode_opportunistic" msgid="1947864819060442354">"ઑટોમૅટિક"</string>
     <string name="private_dns_mode_provider" msgid="3619040641762557028">"ખાનગી DNS પ્રદાતા હોસ્ટનું નામ"</string>
     <string name="private_dns_mode_provider_hostname_hint" msgid="6564868953748514595">"DNS પ્રદાતાના હોસ્ટનું નામ દાખલ કરો"</string>
     <string name="private_dns_mode_provider_failure" msgid="8356259467861515108">"કનેક્ટ કરી શકાયું નથી"</string>
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"વાયરલેસ ડિસ્પ્લે પ્રમાણપત્ર માટેના વિકલ્પો બતાવો"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"વાઇ-ફાઇ લોગિંગ સ્તર વધારો, વાઇ-ફાઇ પીકરમાં SSID RSSI દીઠ બતાવો"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"બૅટરીનો ચાર્જ ઝડપથી ઓછો થવાનું ટાળે છે અને નેટવર્કની કાર્યક્ષમતામાં સુધારો કરે છે"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"આ ટોગલ માત્ર ક્લાયન્ટ મોડ માટે MAC રેન્ડમાઇઝ કરવાની વર્તણૂકને અસર કરે છે.\nઆ મોડ સક્રિય કરાય, ત્યારે MAC રેન્ડમાઇઝ કરવાનું ચાલુ કર્યું હોય તેવા કોઈપણ નેટવર્કના સંકલન દરમિયાન તેમના MAC ઍડ્રેસને રેન્ડમાઇઝ કરી શકાય છે અને તેનો આધાર ક્લાયન્ટ દ્વારા છેલ્લે ક્યારે નેટવર્કમાંથી ડિસ્કનેક્ટ કરાયું હતું તેના પર રહે છે. ડિવાઇસ 4 કલાક કે તેથી ઓછા સમયમાં ફરીથી કનેક્ટ થાય તો ફરી રેન્ડમાઇઝ કરાતું નથી."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"મીટર કરેલ"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"મીટર ન કરેલ"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"લોગર બફર કદ"</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"બૅકગ્રાઉન્ડ ઍપ માટે \"ઍપ પ્રતિસાદ આપતી નથી\" સંવાદ બતાવો"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"નોટિફિકેશન ચૅનલની ચેતવણી બતાવો"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"ઍપ્લિકેશન માન્ય ચૅનલ વિના નોટિફિકેશન પોસ્ટ કરે તો સ્ક્રીન પર ચેતવણી દેખાય છે"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"વાતચીત સૂચનો માટે શૉર્ટકટ"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"વાતચીત વિભાગમાં દેખાવા એક લાંબું ટકતા શેરિંગ શૉર્ટકટ દ્વારા ટેકો મેળવતા નોટિફિકેશન જરૂરી છે"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"બાહ્ય પર એપ્લિકેશનોને મંજૂરી આપવાની ફરજ પાડો"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"મેનિફેસ્ટ મૂલ્યોને ધ્યાનમાં લીધા સિવાય, કોઈપણ ઍપ્લિકેશનને બાહ્ય સ્ટોરેજ પર લખાવા માટે લાયક બનાવે છે"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"પ્રવૃત્તિઓને ફરીથી કદ યોગ્ય થવા માટે ફરજ પાડો"</string>
@@ -529,7 +533,7 @@
     <string name="user_add_user_item_title" msgid="2394272381086965029">"વપરાશકર્તા"</string>
     <string name="user_add_profile_item_title" msgid="3111051717414643029">"પ્રતિબંધિત પ્રોફાઇલ"</string>
     <string name="user_add_user_title" msgid="5457079143694924885">"નવા વપરાશકર્તાને ઉમેરીએ?"</string>
-    <string name="user_add_user_message_long" msgid="1527434966294733380">"તમે વધારાના વપરાશકર્તાઓ બનાવીને અન્ય લોકો સાથે આ ઉપકરણને શેર કરી શકો છો. દરેક વપરાશકર્તા પાસે તેમની પોતાની સ્પેસ છે, જેને તેઓ ઍપ, વૉલપેપર, વગેરે સાથે કસ્ટમાઇઝ કરી શકે છે. વપરાશકર્તાઓ પ્રત્યેક વ્યક્તિને અસર કરતી હોય તેવી ઉપકરણ સેટિંગ જેમ કે વાઇ-ફાઇને પણ સમાયોજિત કરી શકે છે.\n\nજ્યારે તમે કોઈ નવા વપરાશકર્તાને ઉમેરો છો, ત્યારે તે વ્યક્તિને તેમની સ્પેસ સેટ કરવાની જરૂર પડે છે.\n\nકોઈપણ વપરાશકર્તા અન્ય બધા વપરાશકર્તાઓ માટે ઍપને અપડેટ કરી શકે છે. નવા વપરાશકર્તાને ઍક્સેસિબિલિટી સેટિંગ અને સેવાઓ ટ્રાન્સફર ન પણ થાય."</string>
+    <string name="user_add_user_message_long" msgid="1527434966294733380">"તમે વધારાના વપરાશકર્તાઓ બનાવીને અન્ય લોકો સાથે આ ડિવાઇસને શેર કરી શકો છો. દરેક વપરાશકર્તા પાસે તેમની પોતાની સ્પેસ છે, જેને તેઓ ઍપ, વૉલપેપર, વગેરે સાથે કસ્ટમાઇઝ કરી શકે છે. વપરાશકર્તાઓ પ્રત્યેક વ્યક્તિને અસર કરતી હોય તેવી ડિવાઇસ સેટિંગ જેમ કે વાઇ-ફાઇને પણ સમાયોજિત કરી શકે છે.\n\nજ્યારે તમે કોઈ નવા વપરાશકર્તાને ઉમેરો છો, ત્યારે તે વ્યક્તિને તેમની સ્પેસ સેટ કરવાની જરૂર પડે છે.\n\nકોઈપણ વપરાશકર્તા અન્ય બધા વપરાશકર્તાઓ માટે ઍપને અપડેટ કરી શકે છે. નવા વપરાશકર્તાને ઍક્સેસિબિલિટી સેટિંગ અને સેવાઓ ટ્રાન્સફર ન પણ થાય."</string>
     <string name="user_add_user_message_short" msgid="3295959985795716166">"જ્યારે તમે કોઈ નવા વપરાશકર્તાને ઉમેરો છો, ત્યારે તે વ્યક્તિને તેમનું સ્થાન સેટ અપ કરવાની જરૂર પડે છે.\n\nકોઈપણ વપરાશકર્તા બધા અન્ય વપરાશકર્તાઓ માટે એપ્લિકેશન્સને અપડેટ કરી શકે છે."</string>
     <string name="user_setup_dialog_title" msgid="8037342066381939995">"અત્યારે જ વપરાશકર્તાને સેટ અપ કરીએ?"</string>
     <string name="user_setup_dialog_message" msgid="269931619868102841">"ખાતરી કરો કે વ્યક્તિ ઉપકરણ લેવા અને તેમના સ્થાનનું સેટ અપ કરવા માટે ઉપલબ્ધ છે"</string>
diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml
index cb41100..4be85c7 100644
--- a/packages/SettingsLib/res/values-hi/strings.xml
+++ b/packages/SettingsLib/res/values-hi/strings.xml
@@ -85,7 +85,7 @@
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"फ़ोन कॉल"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"फ़ाइल स्थानांतरण"</string>
     <string name="bluetooth_profile_hid" msgid="2969922922664315866">"इनपुट डिवाइस"</string>
-    <string name="bluetooth_profile_pan" msgid="1006235139308318188">"इंटरनेट पहुंच"</string>
+    <string name="bluetooth_profile_pan" msgid="1006235139308318188">"इंटरनेट ऐक्सेस"</string>
     <string name="bluetooth_profile_pbap" msgid="7064307749579335765">"संपर्क शेयर करना"</string>
     <string name="bluetooth_profile_pbap_summary" msgid="2955819694801952056">"संपर्क साझाकरण के लिए उपयोग करें"</string>
     <string name="bluetooth_profile_pan_nap" msgid="7871974753822470050">"इंटरनेट कनेक्शन साझाकरण"</string>
@@ -206,13 +206,13 @@
     <string name="enable_adb" msgid="8072776357237289039">"USB डीबग करना"</string>
     <string name="enable_adb_summary" msgid="3711526030096574316">"डीबग मोड जब USB कनेक्‍ट किया गया हो"</string>
     <string name="clear_adb_keys" msgid="3010148733140369917">"USB डीबग करने की मंज़ूरी रद्द करें"</string>
-    <string name="enable_adb_wireless" msgid="6973226350963971018">"वायरलेस डीबग करना"</string>
+    <string name="enable_adb_wireless" msgid="6973226350963971018">"वॉयरलेस डीबगिंग"</string>
     <string name="enable_adb_wireless_summary" msgid="7344391423657093011">"डिवाइस के वाई-फ़ाई से कनेक्ट हाेने पर, डीबग मोड चालू करें"</string>
     <string name="adb_wireless_error" msgid="721958772149779856">"गड़बड़ी"</string>
-    <string name="adb_wireless_settings" msgid="2295017847215680229">"वायरलेस डीबग करना"</string>
-    <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"उपलब्ध डिवाइस देखने और इस्तेमाल करने के लिए, वायरलेस डीबग करने की सुविधा चालू करें"</string>
+    <string name="adb_wireless_settings" msgid="2295017847215680229">"वॉयरलेस डीबगिंग"</string>
+    <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"उपलब्ध डिवाइस देखने और इस्तेमाल करने के लिए, वॉयरलेस डीबगिंग की सुविधा चालू करें"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"क्यूआर कोड की मदद से डिवाइस जोड़ें"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"क्यूआर कोड स्कैनर का इस्तेमाल करके, नए डिवाइस जोड़ें"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"क्यूआर कोड स्कैनर का इस्तेमाल करके, नए डिवाइस जोड़ें"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"जोड़ने का कोड इस्तेमाल करके, डिवाइस जोड़ें"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"छह अंकों का कोड इस्तेमाल करके, नए डिवाइस जोड़ें"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"जोड़े गए डिवाइस"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"डिवाइस को जोड़ा नहीं जा सका. शायद, क्यूआर कोड ठीक नहीं था या फिर आपका डिवाइस और दूसरा डिवाइस, दाेनाें एक ही नेटवर्क से नहीं जुड़े हैं."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"आईपी पता और पोर्ट"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"क्यूआर कोड स्कैन करें"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"क्यूआर कोड स्कैन करके, वाई-फ़ाई से डिवाइस को जोड़ें"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"क्यूआर कोड स्कैन करके, वाई-फ़ाई नेटवर्क से डिवाइस जोड़ें"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"कृपया किसी वाई-फ़ाई नेटवर्क से कनेक्ट करें"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, debug, dev"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"गड़बड़ी की रिपोर्ट का शॉर्टकट"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"वायरलेस डिसप्ले सर्टिफ़िकेशन"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"वाई-फ़ाई वर्बोस लॉगिंग चालू करें"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"वाई-फ़ाई के लिए स्कैन की संख्या कम करें"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"बेहतर वाई-फ़ाई नेटवर्क से जुड़ने पर मैक पता बदलने की सुविधा"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"मोबाइल डेटा हमेशा चालू"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"हार्डवेयर से तेज़ी लाने के लिए टेदर करें"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"बिना नाम वाले ब्लूटूथ डिवाइस दिखाएं"</string>
@@ -276,13 +277,14 @@
     <string name="select_private_dns_configuration_title" msgid="7887550926056143018">"निजी डीएनएस"</string>
     <string name="select_private_dns_configuration_dialog_title" msgid="3731422918335951912">"निजी डीएनएस मोड चुनें"</string>
     <string name="private_dns_mode_off" msgid="7065962499349997041">"बंद"</string>
-    <string name="private_dns_mode_opportunistic" msgid="1947864819060442354">"अपने आप"</string>
+    <string name="private_dns_mode_opportunistic" msgid="1947864819060442354">"अपने-आप"</string>
     <string name="private_dns_mode_provider" msgid="3619040641762557028">"निजी डीएनएस सेवा देने वाले का होस्टनाम"</string>
     <string name="private_dns_mode_provider_hostname_hint" msgid="6564868953748514595">"डीएनएस सेवा देने वाले का होस्टनाम डालें"</string>
     <string name="private_dns_mode_provider_failure" msgid="8356259467861515108">"कनेक्‍ट नहीं हो सका"</string>
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"वायरलेस डिसप्ले सर्टिफ़िकेशन के विकल्प दिखाएं"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"वाई-फ़ाई लॉगिंग का स्तर बढ़ाएं, वाई-फ़ाई पिकर में प्रति SSID RSSI दिखाएं"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"बैटरी की खपत कम और नेटवर्क की परफ़ॉर्मेंस बेहतर होती है"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"इस टॉगल से सिर्फ़ क्लाइंट मोड में, वाई-फ़ाई नेटवर्क से जुड़ते समय मैक पते को बदलने की सुविधा पर असर पड़ता है.\nजब इस मोड को चालू किया जाता है, तब ऐसे किसी भी नेटवर्क का मैक पता फिर से बदला जा सकता है जिन पर मैक पते को बदलने की सुविधा चालू होती है. ऐसा तभी होता है, जब वे नेटवर्क जुड़े हों. यह इस पर भी निर्भर करता है कि क्लाइंट ने उसे नेटवर्क से कब डिसकनेक्ट किया था. अगर डिवाइस चार घंटे या उससे कम में, फिर से कनेक्ट होता है, तो मैक पते को दोबारा बदला नहीं जा सकता."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"डेटा इस्तेमाल करने की सीमा तय की गई है"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"डेटा इस्तेमाल करने की सीमा तय नहीं की गई है"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"लॉगर बफ़र आकार"</string>
@@ -300,8 +302,8 @@
     <string name="tethering_hardware_offload_summary" msgid="7801345335142803029">"हार्डवेयर से तेज़ी लाने के लिए टेदर करने की सुविधा मौजूद होने पर उसका इस्तेमाल करें"</string>
     <string name="adb_warning_title" msgid="7708653449506485728">"USB डीबग करने की अनुमति दें?"</string>
     <string name="adb_warning_message" msgid="8145270656419669221">"USB डीबग करने का मकसद केवल डेवेलप करना है. इसका इस्तेमाल आपके कंप्‍यूटर और आपके डिवाइस के बीच डेटा को कॉपी करने, बिना सूचना के आपके डिवाइस पर ऐप इंस्‍टॉल करने और लॉग डेटा पढ़ने के लिए करें."</string>
-    <string name="adbwifi_warning_title" msgid="727104571653031865">"वायरलेस डीबग करने की अनुमति देना चाहते हैं?"</string>
-    <string name="adbwifi_warning_message" msgid="8005936574322702388">"वायरलेस डीबग करने का मकसद सिर्फ़ डेवलपमेंट करना है. इसका इस्तेमाल, आपके कंप्यूटर और डिवाइस के बीच डेटा कॉपी करने, बिना सूचना के आपके डिवाइस पर ऐप्लिकेशन इंस्टॉल करने, और लॉग डेटा पढ़ने के लिए करें."</string>
+    <string name="adbwifi_warning_title" msgid="727104571653031865">"वॉयरलेस डीबगिंग की अनुमति देना चाहते हैं?"</string>
+    <string name="adbwifi_warning_message" msgid="8005936574322702388">"वॉयरलेस डीबगिंग का मकसद सिर्फ़ डेवलपमेंट करना है. इसका इस्तेमाल, आपके कंप्यूटर और डिवाइस के बीच डेटा कॉपी करने, बिना सूचना के आपके डिवाइस पर ऐप्लिकेशन इंस्टॉल करने, और लॉग डेटा पढ़ने के लिए करें."</string>
     <string name="adb_keys_warning_message" msgid="2968555274488101220">"उन सभी कंप्यूटरों से USB डीबग करने की पहुंचर रद्द करें, जिन्हें आपने पहले इसकी मंज़ूरी दी थी?"</string>
     <string name="dev_settings_warning_title" msgid="8251234890169074553">"विकास सेटिंग की अनुमति दें?"</string>
     <string name="dev_settings_warning_message" msgid="37741686486073668">"ये सेटिंग केवल विकास संबंधी उपयोग के प्रयोजन से हैं. वे आपके डिवाइस और उस पर स्‍थित ऐप्लिकेशन  को खराब कर सकती हैं या उनके दुर्व्यवहार का कारण हो सकती हैं."</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"बैकग्राउंड में चलने वाले ऐप्लिकेशन के लिए, यह ऐप्लिकेशन नहीं चल रहा मैसेज दिखाएं"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"सूचना चैनल चेतावनी दिखाएं"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"ऐप्लिकेशन, मान्य चैनल के बिना सूचना पोस्ट करे तो स्क्रीन पर चेतावनी दिखाएं"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"सिर्फ़ वही सूचनाएं दिखाएं जो बातचीत सेक्शन में सही शॉर्टकट के साथ भी लिंक हैं"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"ज़रूरी सूचनाओं के लिए ऐसा शेयरिंग शॉर्टकट होना चाहिए जो हमेशा (long-lived) मौजूद रहे, ताकि सूचनाओं को बातचीत वाले सेक्शन में देखा जा सके"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"ऐप्लिकेशन को बाहरी मेमोरी पर ही चलाएं"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"इससे कोई भी ऐप्लिकेशन बाहरी मेमोरी में रखने लायक बन जाता है चाहे उसकी मेनिफ़ेस्ट वैल्यू कुछ भी हो"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"विंडो के हिसाब से गतिविधियों का आकार बदल दें"</string>
@@ -429,13 +433,17 @@
     <string name="power_discharge_by_enhanced" msgid="563438403581662942">"आपके इस्तेमाल के हिसाब से बैटरी करीब <xliff:g id="TIME">%1$s</xliff:g> तक चलेगी (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
     <string name="power_discharge_by_only_enhanced" msgid="3268796172652988877">"आपके इस्तेमाल के हिसाब से बैटरी करीब <xliff:g id="TIME">%1$s</xliff:g> तक चलेगी"</string>
     <string name="power_discharge_by" msgid="4113180890060388350">"बैटरी करीब <xliff:g id="TIME">%1$s</xliff:g> चलेगी (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_discharge_by_only" msgid="92545648425937000">"बैटरी करीब <xliff:g id="TIME">%1$s</xliff:g> चलेगी"</string>
+    <string name="power_discharge_by_only" msgid="92545648425937000">"बैटरी करीब <xliff:g id="TIME">%1$s</xliff:g> तक चलेगी"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"<xliff:g id="TIME">%1$s</xliff:g> तक"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"बैटरी <xliff:g id="TIME">%1$s</xliff:g> तक खत्म हो जाएगी"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"<xliff:g id="THRESHOLD">%1$s</xliff:g> से कम समय बचा है"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"<xliff:g id="THRESHOLD">%1$s</xliff:g> से कम बैटरी बची है (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> से ज़्यादा चलने लायक बैटरी बची है (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> से ज़्यादा चलने लायक बैटरी बची है"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"फ़ोन जल्द ही बंद हो सकता है"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"टैबलेट जल्द ही बंद हो सकता है"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"डिवाइस जल्द ही बंद हो सकता है"</string>
@@ -456,7 +464,7 @@
     <string name="disabled" msgid="8017887509554714950">"बंद किया गया"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"अनुमति है"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"अनुमति नहीं है"</string>
-    <string name="install_other_apps" msgid="3232595082023199454">"अज्ञात ऐप्लिकेशन इंस्टॉल करने का ऐक्सेस"</string>
+    <string name="install_other_apps" msgid="3232595082023199454">"अनजान ऐप्लिकेशन इंस्टॉल करने का ऐक्सेस"</string>
     <string name="home" msgid="973834627243661438">"सेटिंग का होम पेज"</string>
   <string-array name="battery_labels">
     <item msgid="7878690469765357158">"0%"</item>
diff --git a/packages/SettingsLib/res/values-hr/strings.xml b/packages/SettingsLib/res/values-hr/strings.xml
index f1608d0d..115fef8 100644
--- a/packages/SettingsLib/res/values-hr/strings.xml
+++ b/packages/SettingsLib/res/values-hr/strings.xml
@@ -212,7 +212,7 @@
     <string name="adb_wireless_settings" msgid="2295017847215680229">"Bežično otklanjanje pogrešaka"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Da biste vidjeli dostupne uređaje i mogli se njima koristiti, uključite bežično otklanjanje pogrešaka"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Uparivanje uređaja pomoću QR koda"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"Uparivanje novih uređaja pomoću čitača QR koda"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"Uparivanje novih uređaja pomoću čitača QR koda"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Uparivanje uređaja pomoću koda za uparivanje"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Uparivanje novih uređaja pomoću šesteroznamenkastog koda"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"Upareni uređaji"</string>
@@ -230,8 +230,8 @@
     <string name="adb_wireless_verifying_qrcode_text" msgid="6123192424916029207">"Uparivanje uređaja…"</string>
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Uparivanje uređaja nije uspjelo. QR kôd je neispravan ili uređaj nije povezan na istu mrežu."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"IP adresa i priključak"</string>
-    <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"Skeniraj QR kôd"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"Uparivanje uređaja putem Wi-Fija skeniranjem QR koda"</string>
+    <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"Skenirajte QR kôd"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Uparivanje uređaja putem Wi-Fija skeniranjem QR koda"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Povežite se s Wifi mrežom"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, otklanjanje pogrešaka, razvoj"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"Prečac izvješća o pogreškama"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"Certifikacija bežičnog prikaza"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"Omogući opširnu prijavu na Wi-Fi"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"Usporavanje traženja Wi-Fija"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"Nasum. odabir MAC-a poboljšan Wi‑Fi‑jem"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"Mobilni podaci uvijek aktivni"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"Hardversko ubrzanje za modemsko povezivanje"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Prikaži Bluetooth uređaje bez naziva"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Prikaz opcija za certifikaciju bežičnog prikaza"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Povećana razina prijave na Wi‑Fi, prikaz po SSID RSSI-ju u Biraču Wi‑Fi-ja"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Smanjuje potrošnju baterije i poboljšava rad mreže"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Ovaj prekidač utječe na ponašanje nasumičnog odabira MAC-a samo za način korisnika.\nKad je aktiviran ovaj način rada, kod bilo koje mreže koja ima omogućen nasumični odabir MAC-a može doći do ponovnog nasumičnog odabira MAC adrese tijekom povezivanja, ovisno o tome kad se klijent posljednji put odspojio s mreže. Nema ponovnog nasumičnog odabira ako se uređaj ponovno spoji za manje od 4 sata."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"S ograničenim prometom"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"Bez ograničenja prometa"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"Veličine međuspremnika zapisnika"</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"Dijalog o pozadinskim aplikacijama koje ne reagiraju"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Prikaži upozorenja kanala obavijesti"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Prikazuje upozorenje na zaslonu kada aplikacija objavi obavijest bez važećeg kanala"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Primjena prečaca za obavijesti razgovora"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Obavijesti moraju imati dugotrajni prečac za dijeljenje da bi se prikazale u odjeljku razgovora"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"Prisilno dopusti aplikacije u vanjskoj pohrani"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Aplikacije se mogu zapisivati u vanjsku pohranu neovisno o vrijednostima manifesta"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"Nametni mogućnost promjene veličine za aktivnosti"</string>
@@ -426,16 +430,20 @@
     <string name="power_discharging_duration_enhanced" msgid="1800465736237672323">"Još otprilike <xliff:g id="TIME_REMAINING">%1$s</xliff:g> na temelju vaše upotrebe (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
     <!-- no translation found for power_remaining_duration_only_short (7438846066602840588) -->
     <skip />
-    <string name="power_discharge_by_enhanced" msgid="563438403581662942">"Otprilike bi trebalo trajati do <xliff:g id="TIME">%1$s</xliff:g> na temelju vaše upotrebe (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_discharge_by_only_enhanced" msgid="3268796172652988877">"Otprilike bi trebalo trajati do <xliff:g id="TIME">%1$s</xliff:g> na temelju vaše upotrebe"</string>
-    <string name="power_discharge_by" msgid="4113180890060388350">"Otprilike bi trebalo trajati do <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_discharge_by_only" msgid="92545648425937000">"Otprilike bi trebalo trajati do <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <string name="power_discharge_by_enhanced" msgid="563438403581662942">"Na temelju vaše upotrebe trebala bi trajati do <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+    <string name="power_discharge_by_only_enhanced" msgid="3268796172652988877">"Na temelju vaše upotrebe trebala bi trajati do <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <string name="power_discharge_by" msgid="4113180890060388350">"Trebala bi trajati do <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+    <string name="power_discharge_by_only" msgid="92545648425937000">"Trebala bi trajati do <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"Do <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Baterija bi se mogla isprazniti do <xliff:g id="TIME">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"Preostalo je manje od <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"Preostalo je manje od <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"Preostalo je više od <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"Preostalo je više od <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"Telefon bi se uskoro mogao isključiti"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"Tablet bi se uskoro mogao isključiti"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"Uređaj bi se uskoro mogao isključiti"</string>
diff --git a/packages/SettingsLib/res/values-hu/strings.xml b/packages/SettingsLib/res/values-hu/strings.xml
index bb2f17c..a223b4d 100644
--- a/packages/SettingsLib/res/values-hu/strings.xml
+++ b/packages/SettingsLib/res/values-hu/strings.xml
@@ -212,7 +212,7 @@
     <string name="adb_wireless_settings" msgid="2295017847215680229">"Vezeték nélküli hibakeresés"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"A rendelkezésre álló eszközök megtekintéséhez és használatához kapcsolja be a vezeték nélküli hibakeresést"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Eszköz párosítása QR-kóddal"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"Párosítsa az új eszközöket QR-kód-szkennelő használatával"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"Párosítsa az új eszközöket QR-kód-szkennelő használatával"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Eszköz párosítása párosítókóddal"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Párosítsa az új eszközöket hatjegyű kód használatával"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"Párosított eszközök"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Nem sikerült az eszközzel való párosítás. Vagy helytelen volt a QR-kód, vagy az eszköz másik hálózathoz csatlakozott."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"IP-cím és port"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"QR-kód beolvasása"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"Párosítsa az eszközt Wi-Fi-n keresztül QR-kód beolvasásával"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Párosítsa az eszközt Wi-Fi-n keresztül QR-kód beolvasásával"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Csatlakozzon Wi-Fi-hálózathoz"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, debug, dev"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"Hibabejelentési gomb"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"Vezeték nélküli kijelző tanúsítványa"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"Részletes Wi-Fi-naplózás engedélyezése"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"Wi-Fi-hálózat szabályozása"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"Wi‑Fi‑re kiterjesztett, randomizált MAC"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"A mobilhálózati kapcsolat mindig aktív"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"Internetmegosztás hardveres gyorsítása"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Név nélküli Bluetooth-eszközök megjelenítése"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Vezeték nélküli kijelző tanúsítványával kapcsolatos lehetőségek megjelenítése"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Wi‑Fi-naplózási szint növelése, RSSI/SSID megjelenítése a Wi‑Fi-választóban"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Csökkenti az akkumulátorhasználatot, és javítja a hálózat teljesítményét"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Kizárólag ügyfélmód esetében be- vagy kikapcsolja a MAC-címet randomizáló viselkedést.\nHa a mód aktív, az olyan hálózatokon, amelyeken engedélyezve van a MAC-címek randomizálása, a társítás során újra megtörténhet a randomizálás, attól függően, hogy az ügyfél mikor bontotta utoljára a kapcsolatot a hálózattal. Az ismételt randomizálás nem következik be, ha az eszköz négy órán belül újracsatlakozik."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"Forgalomkorlátos"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"Nem forgalomkorlátos"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"Naplózási puffer mérete"</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"Az Alkalmazás nem válaszol ablak megjelenítése a háttérben futó alkalmazásoknál"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Értesítő csatorna figyelmeztetései"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Figyelmeztet, ha egy alkalmazás érvényes csatorna nélkül küld értesítést"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Gyorsparancsok kényszerítése beszélgetésértesítésekhez"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Megköveteli, hogy az értesítéseket hosszú életű megosztási gyorsparancs támogassa, hogy megjelenhessenek a beszélgetési szakaszban"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"Külső tárhely alkalmazásainak engedélyezése"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Lehetővé teszi bármely alkalmazás külső tárhelyre való írását a jegyzékértékektől függetlenül"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"Tevékenységek átméretezésének kényszerítése"</string>
@@ -426,16 +430,20 @@
     <string name="power_discharging_duration_enhanced" msgid="1800465736237672323">"Körülbelül <xliff:g id="TIME_REMAINING">%1$s</xliff:g> maradt hátra az eszköz használata alapján (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
     <!-- no translation found for power_remaining_duration_only_short (7438846066602840588) -->
     <skip />
-    <string name="power_discharge_by_enhanced" msgid="563438403581662942">"A használat alapján nagyjából még ennyit bír: <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_discharge_by_only_enhanced" msgid="3268796172652988877">"A használat alapján nagyjából még ennyit bír: <xliff:g id="TIME">%1$s</xliff:g>"</string>
-    <string name="power_discharge_by" msgid="4113180890060388350">"Nagyjából még ennyit bír: <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_discharge_by_only" msgid="92545648425937000">"Nagyjából még ennyit bír: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <string name="power_discharge_by_enhanced" msgid="563438403581662942">"A használat alapján nagyjából eddig bírja: <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+    <string name="power_discharge_by_only_enhanced" msgid="3268796172652988877">"A használat alapján nagyjából eddig bírja: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <string name="power_discharge_by" msgid="4113180890060388350">"Nagyjából eddig bírja: <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+    <string name="power_discharge_by_only" msgid="92545648425937000">"Nagyjából eddig bírja: <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"Eddig: <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Az akkumulátor lemerülhet a következő időpontig: <xliff:g id="TIME">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"Kevesebb mint <xliff:g id="THRESHOLD">%1$s</xliff:g> van hátra"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"Kevesebb mint <xliff:g id="THRESHOLD">%1$s</xliff:g> van hátra (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"Kevesebb mint <xliff:g id="TIME_REMAINING">%1$s</xliff:g> van hátra (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"Több mint <xliff:g id="TIME_REMAINING">%1$s</xliff:g> van hátra"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"Előfordulhat, hogy a telefon hamarosan kikapcsol"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"Előfordulhat, hogy a táblagép hamarosan kikapcsol"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"Előfordulhat, hogy az eszköz hamarosan kikapcsol"</string>
@@ -443,7 +451,7 @@
     <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"Előfordulhat, hogy a táblagép hamarosan kikapcsol (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
     <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"Előfordulhat, hogy az eszköz hamarosan kikapcsol (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
     <string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string>
-    <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"<xliff:g id="TIME">%1$s</xliff:g> van hátra a feltöltésig"</string>
+    <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"<xliff:g id="TIME">%1$s</xliff:g> van hátra a feltöltésből"</string>
     <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> a feltöltésig"</string>
     <string name="battery_info_status_unknown" msgid="268625384868401114">"Ismeretlen"</string>
     <string name="battery_info_status_charging" msgid="4279958015430387405">"Töltés"</string>
diff --git a/packages/SettingsLib/res/values-hy/strings.xml b/packages/SettingsLib/res/values-hy/strings.xml
index 9cc883a..8d40abc9 100644
--- a/packages/SettingsLib/res/values-hy/strings.xml
+++ b/packages/SettingsLib/res/values-hy/strings.xml
@@ -112,8 +112,8 @@
     <string name="bluetooth_opp_profile_summary_use_for" msgid="461981154387015457">"Օգտագործել ֆայլի փոխանցման համար"</string>
     <string name="bluetooth_hid_profile_summary_use_for" msgid="4289460627406490952">"Օգտագործել ներմուծման համար"</string>
     <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="7689393730163320483">"Օգտագործել լսողական ապարատի համար"</string>
-    <string name="bluetooth_pairing_accept" msgid="2054232610815498004">"Զուգավորել"</string>
-    <string name="bluetooth_pairing_accept_all_caps" msgid="2734383073450506220">"Զուգավորել"</string>
+    <string name="bluetooth_pairing_accept" msgid="2054232610815498004">"Զուգակցել"</string>
+    <string name="bluetooth_pairing_accept_all_caps" msgid="2734383073450506220">"Զուգակցել"</string>
     <string name="bluetooth_pairing_decline" msgid="6483118841204885890">"Չեղարկել"</string>
     <string name="bluetooth_pairing_will_share_phonebook" msgid="3064334458659165176">"Զուգակցում է մուտքի թույլտվությունը դեպի ձեր կոնտակտները և զանգերի պատմությունը, երբ միացված է:"</string>
     <string name="bluetooth_pairing_error_message" msgid="6626399020672335565">"Չհաջողվեց զուգավորել <xliff:g id="DEVICE_NAME">%1$s</xliff:g>-ի հետ:"</string>
@@ -212,7 +212,7 @@
     <string name="adb_wireless_settings" msgid="2295017847215680229">"Անլար վրիպազերծում"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Հասանելի սարքերը տեսնելու և օգտագործելու համար միացրեք անլար վրիպազերծումը"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Զուգակցեք սարքը՝ օգտագործելով QR կոդը"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"Զուգակցեք նոր սարքեր՝ օգտագործելով QR կոդերի սկաները"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"Զուգակցեք նոր սարքեր՝ օգտագործելով QR կոդերի սկաները"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Զուգակցեք սարքը՝ օգտագործելով զուգակցման կոդը"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Զուգակցեք նոր սարքեր՝ օգտագործելով վեցանիշ կոդը"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"Զուգակցված սարքեր"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Չհաջողվեց զուգակցել սարքի հետ։ Հնարավոր է, որ QR կոդը սխալ է, կամ սարքը միացված չէ միևնույն ցանցին։"</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"IP հասցե և միացք"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"QR կոդի սկանավորում"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"Զուգակցեք սարքը՝ Wi‑Fi-ի օգնությամբ սկանավորելով QR կոդը"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Զուգակցեք սարքը՝ Wi‑Fi-ի օգնությամբ սկանավորելով QR կոդը"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Միացեք Wi-Fi ցանցի"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, վրիպազերծում, ծրագրավորող"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"Սխալի հաղորդման դյուրանցում"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"Անլար էկրանների հավաստագրում"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"Միացնել Wi‑Fi մանրամասն գրանցամատյանները"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"Wi‑Fi-ի որոնման սահմանափակում"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"MAC հասցեների պատահական ընտրություն Wi-Fi-ին միանալիս"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"Բջջային ինտերնետը միշտ ակտիվ է"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"Սարքակազմի արագացման միացում"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Ցուցադրել Bluetooth սարքերն առանց անունների"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Ցույց տալ անլար էկրանների հավաստագրման ընտրանքները"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Բարձրացնել մակարդակը, Wi‑Fi ընտրիչում ամեն մի SSID-ի համար ցույց տալ RSSI"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Նվազեցնում է մարտկոցի սպառումը և լավացնում ցանցի աշխատանքը"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Այս կարգավորումը միացնում է MAC հասցեների պատահական ընտրությունը միայն սպասառուի ռեժիմում։\nԵրբ այս ռեժիմն ակտիվացված է, բոլոր ցանցերը, որոնց համար միացված է MAC հասցեների պատահական ընտրությունը, կապակցման ժամանակ կարող են նորից պատահական MAC հասցե ընտրել՝ կախված այն բանից, թե երբ է սպասառուն վերջին անգամ անջատվել ցանցից։ Պատահական ընտրության կրկնությունը տեղի չի ունենում, եթե սարքը նորից է միանում ցանցին 4 ժամից պակաս ժամանակահատվածում։"</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"Վճարովի թրաֆիկ"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"Անսահմանափակ թրաֆիկ"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"Մատյանի բուֆերի չափերը"</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"Ցուցադրել «Հավելվածը չի արձագանքում» պատուհանը ֆոնային հավելվածների համար"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Ցուցադրել ծանուցումների ալիքի զգուշացումները"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Էկրանին ցուցադրվում է զգուշացում, երբ որևէ հավելված փակցնում է ծանուցում առանց վավեր ալիքի"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Միացնել զրույցների ծանուցումների դյուրանցումները"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Պահանջել, որ ծանուցումները պահվեն երկարաժամկետ հասանելիության դյուրանցումով՝ զրույցների բաժնում հայտնվելու համար"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"Թույլատրել պահումն արտաքին կրիչներում"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Թույլ է տալիս ցանկացած հավելված պահել արտաքին սարքում՝ մանիֆեստի արժեքներից անկախ"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"Չափերի փոփոխում բազմապատուհան ռեժիմում"</string>
@@ -432,10 +436,14 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"Լիցքը պետք է որ բավականացնի մինչև <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"Մինչև <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Մարտկոցի լիցքը կարող է սպառվել մինչև <xliff:g id="TIME">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"Մնացել է <xliff:g id="THRESHOLD">%1$s</xliff:g>-ից պակաս"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"Մնացել է <xliff:g id="THRESHOLD">%1$s</xliff:g>-ից պակաս (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"Մնացել է ավելի քան <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"Մնացել է ավելի քան <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"Հեռախոսը շուտով կանջատվի"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"Պլանշետը շուտով կանջատվի"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"Սարքը շուտով կանջատվի"</string>
@@ -503,7 +511,7 @@
     <string name="alarm_template" msgid="3346777418136233330">"<xliff:g id="WHEN">%1$s</xliff:g>-ին"</string>
     <string name="alarm_template_far" msgid="6382760514842998629">"<xliff:g id="WHEN">%1$s</xliff:g>-ին"</string>
     <string name="zen_mode_duration_settings_title" msgid="1553451650289651489">"Տևողություն"</string>
-    <string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Հարցնել ամեն անգամ"</string>
+    <string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Ամեն անգամ հարցնել"</string>
     <string name="zen_mode_forever" msgid="3339224497605461291">"Մինչև չանջատեք"</string>
     <string name="time_unit_just_now" msgid="3006134267292728099">"Հենց նոր"</string>
     <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Հեռախոսի բարձրախոս"</string>
diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml
index d80eba2..3f11da3 100644
--- a/packages/SettingsLib/res/values-in/strings.xml
+++ b/packages/SettingsLib/res/values-in/strings.xml
@@ -112,8 +112,8 @@
     <string name="bluetooth_opp_profile_summary_use_for" msgid="461981154387015457">"Gunakan untuk transfer file"</string>
     <string name="bluetooth_hid_profile_summary_use_for" msgid="4289460627406490952">"Gunakan untuk masukan"</string>
     <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="7689393730163320483">"Gunakan untuk Alat Bantu Dengar"</string>
-    <string name="bluetooth_pairing_accept" msgid="2054232610815498004">"Sandingkan"</string>
-    <string name="bluetooth_pairing_accept_all_caps" msgid="2734383073450506220">"SANDINGKAN"</string>
+    <string name="bluetooth_pairing_accept" msgid="2054232610815498004">"Sambungkan"</string>
+    <string name="bluetooth_pairing_accept_all_caps" msgid="2734383073450506220">"SAMBUNGKAN"</string>
     <string name="bluetooth_pairing_decline" msgid="6483118841204885890">"Batal"</string>
     <string name="bluetooth_pairing_will_share_phonebook" msgid="3064334458659165176">"Penyandingan memberi akses ke kontak dan histori panggilan saat tersambung"</string>
     <string name="bluetooth_pairing_error_message" msgid="6626399020672335565">"Tidak dapat menyandingkan dengan <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
@@ -212,7 +212,7 @@
     <string name="adb_wireless_settings" msgid="2295017847215680229">"Proses debug nirkabel"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Untuk melihat dan menggunakan perangkat yang tersedia, aktifkan proses debug nirkabel"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Sambungkan perangkat dengan kode QR"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"Sambungkan perangkat baru menggunakan Pemindai kode QR"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"Sambungkan perangkat baru menggunakan pemindai kode QR"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Sambungkan perangkat dengan kode penghubung"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Sambungkan perangkat baru menggunakan kode enam digit"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"Perangkat disambungkan"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Gagal menyambungkan perangkat. Kode QR salah, atau perangkat tidak tersambung ke jaringan yang sama."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"Alamat IP &amp; Port"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"Memindai kode QR"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"Menyambungkan perangkat melalui Wi‑Fi dengan memindai Kode QR"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Menyambungkan perangkat melalui Wi‑Fi dengan memindai Kode QR"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Harap sambungkan ke jaringan Wi-Fi"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, debug, dev"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"Pintasan laporan bug"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"Sertifikasi layar nirkabel"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"Aktifkan Pencatatan Log Panjang Wi-Fi"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"Pembatasan pemindaian Wi‑Fi"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"Pengacakan MAC yang ditingkatkan Wi-Fi"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"Kuota selalu aktif"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"Akselerasi hardware tethering"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Tampilkan perangkat Bluetooth tanpa nama"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Tampilkan opsi untuk sertifikasi layar nirkabel"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Tingkatkan level pencatatan log Wi-Fi, tampilkan per SSID RSSI di Pemilih Wi‑Fi"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Memperlambat kehabisan baterai &amp; meningkatkan performa jaringan"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Pengaktifan mode ini memengaruhi perilaku pengacakan MAC hanya untuk mode klien.\nSaat mode ini diaktifkan, jaringan yang mengaktifkan pengacakan MAC mungkin mengalami pengacakan ulang alamat MAC selama terhubung, bergantung pada kapan klien terakhir kali terputus dari jaringan. Pengacakan ulang tidak terjadi jika perangkat terhubung kembali dalam 4 jam atau kurang."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"Berbayar"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"Tidak berbayar"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"Ukuran buffer pencatat log"</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"Tampilkan dialog Aplikasi Tidak Merespons untuk aplikasi yang berjalan di background"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Tampilkan peringatan saluran notifikasi"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Menampilkan peringatan di layar saat aplikasi memposting notifikasi tanpa channel yang valid"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Terapkan pintasan untuk notifikasi percakapan"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Mengharuskan notifikasi didukung oleh pintasan berbagi yang berdurasi panjang untuk muncul di bagian percakapan"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"Paksa izinkan aplikasi di eksternal"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Membuat semua aplikasi dapat ditulis ke penyimpanan eksternal, terlepas dari nilai manifes"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"Paksa aktivitas agar ukurannya dapat diubah"</string>
@@ -432,10 +436,14 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"Akan bertahan kira-kira sampai pukul <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"Hingga <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Baterai mungkin habis pada <xliff:g id="TIME">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"Tersisa kurang dari <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"Tersisa kurang dari <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"Tersisa lebih dari <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"Tersisa lebih dari <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"Ponsel akan segera dimatikan"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"Tablet akan segera dimatikan"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"Perangkat akan segera dimatikan"</string>
@@ -483,7 +491,7 @@
     <string name="ims_reg_title" msgid="8197592958123671062">"Status pendaftaran IMS"</string>
     <string name="ims_reg_status_registered" msgid="884916398194885457">"Terdaftar"</string>
     <string name="ims_reg_status_not_registered" msgid="2989287366045704694">"Tidak terdaftar"</string>
-    <string name="status_unavailable" msgid="5279036186589861608">"Tidak Tersedia"</string>
+    <string name="status_unavailable" msgid="5279036186589861608">"Tidak tersedia"</string>
     <string name="wifi_status_mac_randomized" msgid="466382542497832189">"MAC diacak"</string>
     <plurals name="wifi_tether_connected_summary" formatted="false" msgid="6317236306047306139">
       <item quantity="other">%1$d perangkat terhubung</item>
@@ -529,7 +537,7 @@
     <string name="user_add_user_item_title" msgid="2394272381086965029">"Pengguna"</string>
     <string name="user_add_profile_item_title" msgid="3111051717414643029">"Profil dibatasi"</string>
     <string name="user_add_user_title" msgid="5457079143694924885">"Tambahkan pengguna baru?"</string>
-    <string name="user_add_user_message_long" msgid="1527434966294733380">"Anda dapat berbagi penggunaan perangkat ini dengan orang lain dengan membuat pengguna tambahan. Setiap pengguna memiliki ruang sendiri, yang dapat disesuaikan dengan aplikasi, wallpaper, dan lainnya.\n\nSaat Anda menambahkan pengguna baru, pengguna tersebut perlu menyiapkan ruangnya.\n\nPengguna mana pun dapat mengupdate aplikasi untuk semua pengguna lainnya. Layanan dan setelan aksesibilitas mungkin tidak ditransfer ke pengguna baru."</string>
+    <string name="user_add_user_message_long" msgid="1527434966294733380">"Anda dapat menggunakan perangkat ini bersama orang lain dengan membuat pengguna tambahan. Setiap pengguna memiliki ruang sendiri, yang dapat disesuaikan dengan aplikasi, wallpaper, dan lainnya. Pengguna juga dapat menyesuaikan setelan perangkat seperti Wi-Fi yang dapat memengaruhi semua pengguna lain.\n\nSaat Anda menambahkan pengguna baru, pengguna tersebut perlu menyiapkan ruangnya.\n\nPengguna mana pun dapat mengupdate aplikasi untuk semua pengguna lainnya. Layanan dan setelan aksesibilitas mungkin tidak ditransfer ke pengguna baru."</string>
     <string name="user_add_user_message_short" msgid="3295959985795716166">"Saat Anda menambahkan pengguna baru, orang tersebut perlu menyiapkan ruang mereka sendiri.\n\nPengguna mana pun dapat memperbarui aplikasi untuk semua pengguna lain."</string>
     <string name="user_setup_dialog_title" msgid="8037342066381939995">"Siapkan pengguna sekarang?"</string>
     <string name="user_setup_dialog_message" msgid="269931619868102841">"Pastikan orang tersebut ada untuk mengambil perangkat dan menyiapkan ruangnya"</string>
diff --git a/packages/SettingsLib/res/values-is/strings.xml b/packages/SettingsLib/res/values-is/strings.xml
index 2e96446..d925df3 100644
--- a/packages/SettingsLib/res/values-is/strings.xml
+++ b/packages/SettingsLib/res/values-is/strings.xml
@@ -212,7 +212,7 @@
     <string name="adb_wireless_settings" msgid="2295017847215680229">"Þráðlaus villuleit"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Til að sjá og nota tiltæk tæki skal kveikja á þráðlausri villuleit"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Para tæki með QR-kóða"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"Para ný tæki með QR-kóðaskanna"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"Para ný tæki með QR-kóðaskanna"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Para tæki með pörunarkóða"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Para ný tæki með sex tölustafa kóða"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"Pöruð tæki"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Ekki tókst að para við tækið. Annað hvort var QR-kóðinn rangur eða tækið ekki tengt sama neti."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"IP-tala og gátt"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"Skanna QR-kóða"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"Tengja tæki með Wi-Fi með því að skanna QR-kóða"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Tengja tæki með Wi-Fi með því að skanna QR-kóða"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Tengstu Wi-Fi neti"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, villuleit, dev"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"Flýtileið í villutilkynningu"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"Vottun þráðlausra skjáa"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"Kveikja á ítarlegri skráningu Wi-Fi"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"Hægja á Wi‑Fi leit"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"Slembival MAC-vistfanga með Wi-Fi styrk"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"Alltaf kveikt á farsímagögnum"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"Vélbúnaðarhröðun fyrir tjóðrun"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Sýna Bluetooth-tæki án heita"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Sýna valkosti fyrir vottun þráðlausra skjáa"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Auka skráningarstig Wi-Fi, sýna RSSI fyrir hvert SSID í Wi-Fi vali"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Dregur úr rafhlöðunotkun og eykur netafköst"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Þessi rofi hefur eingöngu áhrif á slembival MAC-vistfanga fyrir biðlarastillingu.\nÞegar þessi stilling er virk geta öll netkerfi sem eru með slembival MAC-vistfanga virkt látið slembiraða MAC-vistföngum aftur við tengingu, allt eftir því hvenær biðlarinn aftengdist netinu síðast. Endurslembiröðun á sér ekki stað ef tækið tengist aftur innan fjögurra klukkustunda."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"Mæld notkun"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"Notkun ekki mæld"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"Annálsritastærðir biðminna"</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"Sýna „Forrit svarar ekki“ fyrir bakgrunnsforrit"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Sýna viðvaranir tilkynningarásar"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Birtir viðvörun á skjánum þegar forrit birtir tilkynningu án gildrar rásar"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Þvinga flýtileiðir fyrir tilkynningar um samtöl"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Krefjast þess að flýtileiðir séu studdar af langvarandi deilingarflýtileið fyrir birtingu í samtalshluta"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"Þvinga fram leyfi forrita í ytri geymslu"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Gerir öll forrit skrifanleg í ytra geymslurými, óháð gildum í upplýsingaskrá"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"Þvinga breytanlega stærð virkni"</string>
@@ -432,10 +436,14 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"Ætti að endast til u.þ.b. <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"Til klukkan <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Rafhlaðan gæti tæmst kl. <xliff:g id="TIME">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"Minna en <xliff:g id="THRESHOLD">%1$s</xliff:g> eftir"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"Minna en <xliff:g id="THRESHOLD">%1$s</xliff:g> eftir (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"Meira en <xliff:g id="TIME_REMAINING">%1$s</xliff:g> eftir (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"Meira en <xliff:g id="TIME_REMAINING">%1$s</xliff:g> eftir"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"Síminn gæti slökkt á sér fljótlega"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"Spjaldtölvan gæti slökkt á sér fljótlega"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"Tækið gæti slökkt á sér fljótlega"</string>
@@ -540,7 +548,7 @@
     <string name="user_new_user_name" msgid="60979820612818840">"Nýr notandi"</string>
     <string name="user_new_profile_name" msgid="2405500423304678841">"Nýtt snið"</string>
     <string name="user_info_settings_title" msgid="6351390762733279907">"Notandaupplýsingar"</string>
-    <string name="profile_info_settings_title" msgid="105699672534365099">"Upplýsingar um snið"</string>
+    <string name="profile_info_settings_title" msgid="105699672534365099">"Notandaupplýsingar"</string>
     <string name="user_need_lock_message" msgid="4311424336209509301">"Áður en þú getur búið til takmarkað snið þarftu að setja upp skjálás til að vernda forritin þín og persónuleg gögn."</string>
     <string name="user_set_lock_button" msgid="1427128184982594856">"Velja lás"</string>
     <string name="user_switch_to_user" msgid="6975428297154968543">"Skipta yfir í <xliff:g id="USER_NAME">%s</xliff:g>"</string>
diff --git a/packages/SettingsLib/res/values-it/arrays.xml b/packages/SettingsLib/res/values-it/arrays.xml
index 0bca8ea..de38625 100644
--- a/packages/SettingsLib/res/values-it/arrays.xml
+++ b/packages/SettingsLib/res/values-it/arrays.xml
@@ -156,7 +156,7 @@
     <item msgid="5001852592115448348">", attivo (telefono)"</item>
   </string-array>
   <string-array name="select_logd_size_titles">
-    <item msgid="1191094707770726722">"OFF"</item>
+    <item msgid="1191094707770726722">"Off"</item>
     <item msgid="7839165897132179888">"64 kB"</item>
     <item msgid="2715700596495505626">"256 kB"</item>
     <item msgid="7099386891713159947">"1 MB"</item>
@@ -164,13 +164,13 @@
     <item msgid="8243549501764402572">"16 MB"</item>
   </string-array>
   <string-array name="select_logd_size_lowram_titles">
-    <item msgid="1145807928339101085">"OFF"</item>
+    <item msgid="1145807928339101085">"Off"</item>
     <item msgid="4064786181089783077">"64 kB"</item>
     <item msgid="3052710745383602630">"256 kB"</item>
     <item msgid="3691785423374588514">"1 MB"</item>
   </string-array>
   <string-array name="select_logd_size_summaries">
-    <item msgid="409235464399258501">"OFF"</item>
+    <item msgid="409235464399258501">"Off"</item>
     <item msgid="4195153527464162486">"64 kB/buffer log"</item>
     <item msgid="7464037639415220106">"256 kB/buffer log"</item>
     <item msgid="8539423820514360724">"1 MB/buffer log"</item>
@@ -178,13 +178,13 @@
     <item msgid="7892098981256010498">"16 MB/buffer log"</item>
   </string-array>
   <string-array name="select_logpersist_titles">
-    <item msgid="704720725704372366">"OFF"</item>
+    <item msgid="704720725704372366">"Off"</item>
     <item msgid="6014837961827347618">"Tutti"</item>
     <item msgid="7387060437894578132">"Tutti tranne il segnale radio"</item>
     <item msgid="7300881231043255746">"solo kernel"</item>
   </string-array>
   <string-array name="select_logpersist_summaries">
-    <item msgid="97587758561106269">"OFF"</item>
+    <item msgid="97587758561106269">"Off"</item>
     <item msgid="7126170197336963369">"Tutti i buffer log"</item>
     <item msgid="7167543126036181392">"Tutti tranne i buffer log del segnale radio"</item>
     <item msgid="5135340178556563979">"solo buffer log kernel"</item>
@@ -237,17 +237,17 @@
     <item msgid="7345673972166571060">"Stack di chiamate su glGetError"</item>
   </string-array>
   <string-array name="show_non_rect_clip_entries">
-    <item msgid="2482978351289846212">"OFF"</item>
+    <item msgid="2482978351289846212">"Off"</item>
     <item msgid="3405519300199774027">"Area ritaglio non rettangolare blu"</item>
     <item msgid="1212561935004167943">"Evidenzia cmd disegno test in verde"</item>
   </string-array>
   <string-array name="track_frame_time_entries">
-    <item msgid="634406443901014984">"OFF"</item>
+    <item msgid="634406443901014984">"Off"</item>
     <item msgid="1288760936356000927">"Su schermo sotto forma di barre"</item>
     <item msgid="5023908510820531131">"Tra <xliff:g id="AS_TYPED_COMMAND">adb shell dumpsys gfxinfo</xliff:g>"</item>
   </string-array>
   <string-array name="debug_hw_overdraw_entries">
-    <item msgid="1968128556747588800">"OFF"</item>
+    <item msgid="1968128556747588800">"Off"</item>
     <item msgid="3033215374382962216">"Mostra aree overdraw"</item>
     <item msgid="3474333938380896988">"Mostra aree con deuteranomalia"</item>
   </string-array>
diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml
index 2de543d..3f38597 100644
--- a/packages/SettingsLib/res/values-it/strings.xml
+++ b/packages/SettingsLib/res/values-it/strings.xml
@@ -23,7 +23,7 @@
     <string name="wifi_fail_to_scan" msgid="2333336097603822490">"Impossibile cercare reti"</string>
     <string name="wifi_security_none" msgid="7392696451280611452">"Nessuna"</string>
     <string name="wifi_remembered" msgid="3266709779723179188">"Salvata"</string>
-    <string name="wifi_disconnected" msgid="7054450256284661757">"Nessuna connessione"</string>
+    <string name="wifi_disconnected" msgid="7054450256284661757">"Non connessa"</string>
     <string name="wifi_disabled_generic" msgid="2651916945380294607">"Disattivata"</string>
     <string name="wifi_disabled_network_failure" msgid="2660396183242399585">"Errore configurazione IP"</string>
     <string name="wifi_disabled_by_recommendation_provider" msgid="1302938248432705534">"Impossibile connettersi a causa della bassa qualità della rete"</string>
@@ -212,7 +212,7 @@
     <string name="adb_wireless_settings" msgid="2295017847215680229">"Debug wireless"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Per trovare e utilizzare i dispositivi disponibili, attiva il debug wireless"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Accoppia il dispositivo con il codice QR"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"Accoppia i nuovi dispositivi utilizzando lo scanner di codici QR"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"Accoppia i nuovi dispositivi utilizzando lo scanner di codici QR"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Accoppia dispositivo con codice di accoppiamento"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Accoppia i nuovi dispositivi utilizzando un codice di sei cifre"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"Dispositivi accoppiati"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Impossibile accoppiare il dispositivo. Il codice QR non era corretto oppure il dispositivo non è connesso alla stessa rete."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"Indirizzo IP e porta"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"Scansiona codice QR"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"Accoppia il dispositivo tramite Wi-Fi eseguendo la scansione di un codice QR"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Accoppia il dispositivo tramite Wi-Fi scansionando un codice QR"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Collegati a una rete Wi-Fi"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"ADB, debug, sviluppatori"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"Scorciatoia segnalazione bug"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"Certificazione display wireless"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"Attiva logging dettagliato Wi-Fi"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"Limita ricerca di reti Wi‑Fi"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"Randomizzazione MAC con Wi‑Fi migliorato"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"Dati mobili sempre attivi"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"Tethering accelerazione hardware"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Mostra dispositivi Bluetooth senza nome"</string>
@@ -275,7 +276,7 @@
     <string name="bluetooth_select_a2dp_codec_streaming_label" msgid="2040810756832027227">"Streaming: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
     <string name="select_private_dns_configuration_title" msgid="7887550926056143018">"DNS privato"</string>
     <string name="select_private_dns_configuration_dialog_title" msgid="3731422918335951912">"Seleziona modalità DNS privato"</string>
-    <string name="private_dns_mode_off" msgid="7065962499349997041">"OFF"</string>
+    <string name="private_dns_mode_off" msgid="7065962499349997041">"Off"</string>
     <string name="private_dns_mode_opportunistic" msgid="1947864819060442354">"Automatico"</string>
     <string name="private_dns_mode_provider" msgid="3619040641762557028">"Nome host del provider DNS privato"</string>
     <string name="private_dns_mode_provider_hostname_hint" msgid="6564868953748514595">"Inserisci il nome host del provider DNS"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Mostra opzioni per la certificazione display wireless"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Aumenta livello di logging Wi-Fi, mostra SSID RSSI nel selettore Wi-Fi"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Riduce il consumo della batteria e migliora le prestazioni della rete"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Questa opzione influenza il comportamento della randomizzazione MAC solo nella modalità client.\nQuando questa modalità è attiva, durante l\'associazione gli indirizzi MAC di tutte le reti con randomizzazione MAC abilitata potrebbero essere nuovamente sottoposti a randomizzazione, a seconda di quando il client è stato disconnesso l\'ultima volta dalla rete. La randomizzazione non viene eseguita nuovamente se il dispositivo si riconnette entro quattro ore."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"A consumo"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"Non a consumo"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"Dimensioni buffer logger"</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"Mostra finestra di dialogo ANR per app in background"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Mostra avvisi canale di notifica"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Viene mostrato un avviso sullo schermo quando un\'app pubblica una notifica senza un canale valido"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Applica scorciatoie per notifiche delle conversazioni"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Richiedi il supporto di una scorciatoia di condivisione di lunga durata per la visualizzazione delle notifiche nella sezione delle conversazioni"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"Forza autorizzazione app su memoria esterna"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Consente l\'installazione di qualsiasi app su memoria esterna, indipendentemente dai valori manifest"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"Imponi formato modificabile alle attività"</string>
@@ -426,16 +430,20 @@
     <string name="power_discharging_duration_enhanced" msgid="1800465736237672323">"Tempo rimanente in base al tuo utilizzo (<xliff:g id="LEVEL">%2$s</xliff:g>): <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
     <!-- no translation found for power_remaining_duration_only_short (7438846066602840588) -->
     <skip />
-    <string name="power_discharge_by_enhanced" msgid="563438403581662942">"Tempo stimato rimanente in base al tuo utilizzo: <xliff:g id="TIME">%1$s</xliff:g> circa (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_discharge_by_only_enhanced" msgid="3268796172652988877">"Tempo stimato rimanente in base al tuo utilizzo: <xliff:g id="TIME">%1$s</xliff:g> circa"</string>
-    <string name="power_discharge_by" msgid="4113180890060388350">"Tempo stimato rimanente: <xliff:g id="TIME">%1$s</xliff:g> circa (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_discharge_by_only" msgid="92545648425937000">"Tempo stimato rimanente: <xliff:g id="TIME">%1$s</xliff:g> circa"</string>
+    <string name="power_discharge_by_enhanced" msgid="563438403581662942">"Ora stimata esaurimento batteria in base al tuo utilizzo: <xliff:g id="TIME">%1$s</xliff:g> circa (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+    <string name="power_discharge_by_only_enhanced" msgid="3268796172652988877">"Ora stimata esaurimento batteria in base al tuo utilizzo: <xliff:g id="TIME">%1$s</xliff:g> circa"</string>
+    <string name="power_discharge_by" msgid="4113180890060388350">"Ora stimata esaurimento batteria: <xliff:g id="TIME">%1$s</xliff:g> circa (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+    <string name="power_discharge_by_only" msgid="92545648425937000">"Ora stimata esaurimento batteria: <xliff:g id="TIME">%1$s</xliff:g> circa"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"Fino alle ore <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"La batteria potrebbe esaurirsi entro <xliff:g id="TIME">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"Tempo rimanente: meno di <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"Tempo rimanente: meno di <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"Tempo rimanente: più di <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"Tempo rimanente: più di <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"Il telefono potrebbe spegnersi a breve"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"Il tablet potrebbe spegnersi a breve"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"Il dispositivo potrebbe spegnersi a breve"</string>
@@ -454,7 +462,7 @@
     <string name="battery_info_status_full" msgid="4443168946046847468">"Carica"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Gestita dall\'amministratore"</string>
     <string name="disabled" msgid="8017887509554714950">"Disattivato"</string>
-    <string name="external_source_trusted" msgid="1146522036773132905">"Consentite"</string>
+    <string name="external_source_trusted" msgid="1146522036773132905">"Autorizzate"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"Non consentite"</string>
     <string name="install_other_apps" msgid="3232595082023199454">"Installa app sconosciute"</string>
     <string name="home" msgid="973834627243661438">"Home page Impostazioni"</string>
@@ -539,7 +547,7 @@
     <string name="user_add_user_type_title" msgid="551279664052914497">"Aggiungi"</string>
     <string name="user_new_user_name" msgid="60979820612818840">"Nuovo utente"</string>
     <string name="user_new_profile_name" msgid="2405500423304678841">"Nuovo profilo"</string>
-    <string name="user_info_settings_title" msgid="6351390762733279907">"Dati utente"</string>
+    <string name="user_info_settings_title" msgid="6351390762733279907">"Informazioni utente"</string>
     <string name="profile_info_settings_title" msgid="105699672534365099">"Informazioni profilo"</string>
     <string name="user_need_lock_message" msgid="4311424336209509301">"Prima di poter creare un profilo con limitazioni, devi impostare un blocco schermo per proteggere le tue app e i tuoi dati personali."</string>
     <string name="user_set_lock_button" msgid="1427128184982594856">"Imposta blocco"</string>
diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml
index 61f35ab..53f82eb 100644
--- a/packages/SettingsLib/res/values-iw/strings.xml
+++ b/packages/SettingsLib/res/values-iw/strings.xml
@@ -212,7 +212,7 @@
     <string name="adb_wireless_settings" msgid="2295017847215680229">"ניפוי באגים אלחוטי"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"כדי להציג את המכשירים הזמינים ולהשתמש בהם, יש להפעיל ניפוי באגים אלחוטי"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"‏התאמת מכשיר באמצעות קוד QR"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"‏התאמת מכשירים חדשים באמצעות סורק של קודי QR"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"‏התאמת מכשירים חדשים באמצעות סורק של קודי QR"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"התאמת מכשיר באמצעות קוד התאמה"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"התאמת מכשירים חדשים באמצעות קוד בן שש ספרות"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"מכשירים מותאמים"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"‏התאמת המכשיר נכשלה. קוד ה-QR היה שגוי או שהמכשיר לא מחובר לאותה רשת."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"‏יציאה וכתובת IP"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"‏סריקת קוד QR"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"‏יש לסרוק קוד QR כדי להתאים מכשיר באמצעות Wi‑Fi"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"‏יש לסרוק קוד QR כדי להתאים מכשיר באמצעות Wi‑Fi"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"‏יש להתחבר לרשת Wi-Fi"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"‏adb, ניפוי באגים, פיתוח"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"קיצור של דוח באגים"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"‏אישור של תצוגת WiFi"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"‏הפעלת רישום מפורט של Wi‑Fi ביומן"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"‏ויסות סריקה לנקודות Wi-Fi"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"‏רנדומיזציה משופרת של כתובות MAC ב-Wi‑Fi"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"חבילת הגלישה פעילה תמיד"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"שיפור מהירות באמצעות חומרה לצורך שיתוף אינטרנט בין ניידים"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"‏הצגת מכשירי Bluetooth ללא שמות"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"‏הצג אפשרויות עבור אישור של תצוגת WiFi"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"‏העלה את רמת הרישום של Wi‑Fi ביומן, הצג לכל SSID RSSI ב-Wi‑Fi Picker"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"מפחית את קצב התרוקנות הסוללה ומשפר את ביצועי הרשת"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"‏לחצן החלפת המצב משפיע על התנהגות הרנדומיזציה של כתובות MAC במצב לקוח בלבד.\nכשמצב זה מופעל, ברשת שבה מופעלת רנדומיזציה של כתובות MAC, ייתכן שתתבצע רנדומיזציה מחדש של כתובות ה-MAC במהלך השיוך, בהתאם למועד הניתוק האחרון של הלקוח מהרשת. לא תתבצע רנדומיזציה מחדש אם המכשיר מתחבר מחדש תוך ארבע שעות או פחות."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"נמדדת"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"לא נמדדת"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"גדלי מאגר של יומן רישום"</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"הצגת תיבת דו-שיח של \'אפליקציה לא מגיבה\' עבור אפליקציות שפועלות ברקע"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"אזהרות לגבי ערוץ התראות"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"הצגת אזהרה כשאפליקציה שולחת התראה ללא ערוץ חוקי"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"אילוץ קיצורי דרך להתראות על שיחות"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"כדי שההודעות יופיעו בקטע השיחות, יש צורך בגיבוי שלהן באמצעות קיצור דרך לשיתוף בעל מחזור חיים ארוך"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"אילוץ הרשאת אפליקציות באחסון חיצוני"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"מאפשר כתיבה של כל אפליקציה באחסון חיצוני, ללא התחשבות בערכי המניפסט"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"אלץ יכולת קביעת גודל של הפעילויות"</string>
@@ -417,7 +421,7 @@
     <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"פרוטנומליה (אדום-ירוק)"</string>
     <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"טריטנומליה (כחול-צהוב)"</string>
     <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"תיקון צבע"</string>
-    <string name="accessibility_display_daltonizer_preference_subtitle" msgid="1284746051652993443">"תיקון צבעים מאפשר לשנות את האופן שבו צבעים מוצגים במכשיר שלך"</string>
+    <string name="accessibility_display_daltonizer_preference_subtitle" msgid="1284746051652993443">"תיקון צבע מאפשר לשנות את האופן שבו צבעים מוצגים במכשיר שלך"</string>
     <string name="daltonizer_type_overridden" msgid="4509604753672535721">"נעקף על ידי <xliff:g id="TITLE">%1$s</xliff:g>"</string>
     <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
     <string name="power_remaining_duration_only" msgid="8264199158671531431">"הזמן הנותר: בערך <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
@@ -432,10 +436,14 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"אמורה להחזיק מעמד בערך עד <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"עד <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"ייתכן שהסוללה תתרוקן עד <xliff:g id="TIME">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"נותרו פחות מ-<xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"נותרו פחות מ-<xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"נותרו יותר מ-<xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"הזמן שנותר: יותר מ-<xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"הטלפון עלול להיכבות בקרוב"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"הטאבלט עלול להיכבות בקרוב"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"המכשיר עלול להיכבות בקרוב"</string>
diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml
index ea9cfd8..2f91ea6 100644
--- a/packages/SettingsLib/res/values-ja/strings.xml
+++ b/packages/SettingsLib/res/values-ja/strings.xml
@@ -204,15 +204,15 @@
     <string name="tethering_settings_not_available" msgid="266821736434699780">"このユーザーはテザリング設定を利用できません"</string>
     <string name="apn_settings_not_available" msgid="1147111671403342300">"このユーザーはアクセスポイント名設定を利用できません"</string>
     <string name="enable_adb" msgid="8072776357237289039">"USB デバッグ"</string>
-    <string name="enable_adb_summary" msgid="3711526030096574316">"USB接続時はデバッグモードにする"</string>
-    <string name="clear_adb_keys" msgid="3010148733140369917">"USBデバッグの許可の取り消し"</string>
+    <string name="enable_adb_summary" msgid="3711526030096574316">"USB 接続時はデバッグモードにする"</string>
+    <string name="clear_adb_keys" msgid="3010148733140369917">"USB デバッグの許可の取り消し"</string>
     <string name="enable_adb_wireless" msgid="6973226350963971018">"ワイヤレス デバッグ"</string>
     <string name="enable_adb_wireless_summary" msgid="7344391423657093011">"Wi-Fi 接続時にデバッグモード"</string>
     <string name="adb_wireless_error" msgid="721958772149779856">"エラー"</string>
     <string name="adb_wireless_settings" msgid="2295017847215680229">"ワイヤレス デバッグ"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"利用可能なデバイスを確認して使用するには、ワイヤレス デバッグをオンにしてください"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"QR コードによるデバイスのペア設定"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"QR コードスキャナを使って新しいデバイスをペア設定します"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"QR コードスキャナを使って新しいデバイスをペア設定します"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"ペア設定コードによるデバイスのペア設定"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"6 桁のコードを使って新しいデバイスをペア設定します"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"ペア設定済みのデバイス"</string>
@@ -231,26 +231,27 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"デバイスをペア設定できませんでした。QR コードが間違っているか、デバイスが同じネットワークに接続されていません。"</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"IP アドレスとポート"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"QR コードのスキャン"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"QR コードをスキャンして Wi-Fi 経由でデバイスをペア設定します"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"QR コードをスキャンして Wi-Fi 経由でデバイスをペア設定します"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Wi-Fi ネットワークに接続してください"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, デバッグ, dev"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"バグレポートのショートカット"</string>
     <string name="bugreport_in_power_summary" msgid="1885529649381831775">"電源メニューにバグレポートを取得するボタンを表示する"</string>
     <string name="keep_screen_on" msgid="1187161672348797558">"スリープモードにしない"</string>
     <string name="keep_screen_on_summary" msgid="1510731514101925829">"充電中に画面をスリープにしない"</string>
-    <string name="bt_hci_snoop_log" msgid="7291287955649081448">"Bluetooth HCIスヌープログをON"</string>
+    <string name="bt_hci_snoop_log" msgid="7291287955649081448">"Bluetooth HCI スヌープログ"</string>
     <string name="bt_hci_snoop_log_summary" msgid="6808538971394092284">"Bluetooth パケットをキャプチャします(この設定を変更した場合は Bluetooth を切り替えてください)。"</string>
-    <string name="oem_unlock_enable" msgid="5334869171871566731">"OEMロック解除"</string>
+    <string name="oem_unlock_enable" msgid="5334869171871566731">"OEM ロック解除"</string>
     <string name="oem_unlock_enable_summary" msgid="5857388174390953829">"ブートローダーによるロック解除を許可する"</string>
-    <string name="confirm_enable_oem_unlock_title" msgid="8249318129774367535">"OEMロック解除の許可"</string>
+    <string name="confirm_enable_oem_unlock_title" msgid="8249318129774367535">"OEM ロック解除の許可"</string>
     <string name="confirm_enable_oem_unlock_text" msgid="854131050791011970">"警告: この設定をONにしている場合、このデバイスではデバイス保護機能を利用できません。"</string>
     <string name="mock_location_app" msgid="6269380172542248304">"仮の現在地情報アプリを選択"</string>
     <string name="mock_location_app_not_set" msgid="6972032787262831155">"仮の現在地情報アプリが設定されていません"</string>
     <string name="mock_location_app_set" msgid="4706722469342913843">"仮の現在地情報アプリ: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="debug_networking_category" msgid="6829757985772659599">"ネットワーク"</string>
-    <string name="wifi_display_certification" msgid="1805579519992520381">"ワイヤレスディスプレイ認証"</string>
-    <string name="wifi_verbose_logging" msgid="1785910450009679371">"Wi-Fi詳細ログの有効化"</string>
+    <string name="wifi_display_certification" msgid="1805579519992520381">"ワイヤレス ディスプレイ認証"</string>
+    <string name="wifi_verbose_logging" msgid="1785910450009679371">"Wi-Fi 詳細ログの有効化"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"Wi‑Fi スキャン スロットリング"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"Wi-Fi-enhanced MAC ランダム化"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"モバイルデータを常に ON にする"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"テザリング時のハードウェア アクセラレーション"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Bluetooth デバイスを名前なしで表示"</string>
@@ -280,9 +281,10 @@
     <string name="private_dns_mode_provider" msgid="3619040641762557028">"プライベート DNS プロバイダのホスト名"</string>
     <string name="private_dns_mode_provider_hostname_hint" msgid="6564868953748514595">"DNS プロバイダのホスト名を入力"</string>
     <string name="private_dns_mode_provider_failure" msgid="8356259467861515108">"接続できませんでした"</string>
-    <string name="wifi_display_certification_summary" msgid="8111151348106907513">"ワイヤレスディスプレイ認証のオプションを表示"</string>
-    <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Wi-Fiログレベルを上げて、Wi-Fi選択ツールでSSID RSSIごとに表示します"</string>
+    <string name="wifi_display_certification_summary" msgid="8111151348106907513">"ワイヤレス ディスプレイ認証のオプションを表示"</string>
+    <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Wi-Fi ログレベルを上げて、Wi-Fi 選択ツールで SSID RSSI ごとに表示します"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"電池の消耗が軽減され、ネットワーク パフォーマンスが改善されます"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"この切り替えは、クライアント モードの MAC のランダム化動作にのみ影響します。\nこのモードがアクティブの場合、MAC のランダム化が有効になっているすべてのネットワークで、クライアントがネットワークから最後に切断されたタイミングに応じて、関連付けの際に MAC アドレスが再ランダム化されることがあります。再ランダム化は、デバイスが 4 時間以内に再接続された場合は行われません。"</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"従量制"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"定額制"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"ログバッファのサイズ"</string>
@@ -298,11 +300,11 @@
     <string name="debug_view_attributes" msgid="3539609843984208216">"表示属性検査を有効にする"</string>
     <string name="mobile_data_always_on_summary" msgid="1112156365594371019">"Wi‑Fiが(ネットワークの自動切り替えで)ONのときでもモバイルデータが常にONになります。"</string>
     <string name="tethering_hardware_offload_summary" msgid="7801345335142803029">"テザリング時にハードウェア アクセラレーションを使用します(使用可能な場合)"</string>
-    <string name="adb_warning_title" msgid="7708653449506485728">"USBデバッグを許可しますか?"</string>
-    <string name="adb_warning_message" msgid="8145270656419669221">"USBデバッグは開発専用に設計されています。パソコンとデバイスの間でデータをコピーする場合や、アプリを通知なしでデバイスにインストールする場合、ログデータを読み取る場合に使用できます。"</string>
+    <string name="adb_warning_title" msgid="7708653449506485728">"USB デバッグを許可しますか?"</string>
+    <string name="adb_warning_message" msgid="8145270656419669221">"USB デバッグは開発専用に設計されています。パソコンとデバイスの間でデータをコピーする場合や、アプリを通知なしでデバイスにインストールする場合、ログデータを読み取る場合に使用できます。"</string>
     <string name="adbwifi_warning_title" msgid="727104571653031865">"ワイヤレス デバッグを許可しますか?"</string>
     <string name="adbwifi_warning_message" msgid="8005936574322702388">"ワイヤレス デバッグは開発専用に設計されています。パソコンとデバイスの間でデータをコピーする場合や、アプリを通知なしでデバイスにインストールする場合、ログデータを読み取る場合に使用できます。"</string>
-    <string name="adb_keys_warning_message" msgid="2968555274488101220">"以前に許可したすべてのパソコンからのUSBデバッグへのアクセスを取り消しますか?"</string>
+    <string name="adb_keys_warning_message" msgid="2968555274488101220">"以前に許可したすべてのパソコンからの USB デバッグへのアクセスを取り消しますか?"</string>
     <string name="dev_settings_warning_title" msgid="8251234890169074553">"開発用の設定を許可しますか?"</string>
     <string name="dev_settings_warning_message" msgid="37741686486073668">"これらの設定は開発専用に設計されています。そのためデバイスやデバイス上のアプリが故障したり正常に動作しなくなったりするおそれがあります。"</string>
     <string name="verify_apps_over_usb_title" msgid="6031809675604442636">"USB経由のアプリを確認"</string>
@@ -371,13 +373,15 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"バックグラウンド アプリが応答しない場合にダイアログを表示"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"通知チャネルの警告を表示"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"アプリから有効なチャネルのない通知が投稿されたときに画面上に警告を表示します"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"会話通知用のショートカット"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"会話セクションに表示されるように、通知が長期の共有ショートカットに対応することを要件とします"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"外部ストレージへのアプリの書き込みを許可"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"マニフェストの値に関係なく、すべてのアプリを外部ストレージに書き込めるようになります"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"アクティビティをサイズ変更可能にする"</string>
     <string name="force_resizable_activities_summary" msgid="2490382056981583062">"マニフェストの値に関係なく、マルチウィンドウですべてのアクティビティのサイズを変更できるようにします。"</string>
     <string name="enable_freeform_support" msgid="7599125687603914253">"フリーフォーム ウィンドウの有効化"</string>
     <string name="enable_freeform_support_summary" msgid="1822862728719276331">"試験運用機能のフリーフォーム ウィンドウのサポートを有効にします。"</string>
-    <string name="local_backup_password_title" msgid="4631017948933578709">"PCバックアップパスワード"</string>
+    <string name="local_backup_password_title" msgid="4631017948933578709">"PC バックアップ パスワード"</string>
     <string name="local_backup_password_summary_none" msgid="7646898032616361714">"デスクトップのフルバックアップは現在保護されていません"</string>
     <string name="local_backup_password_summary_change" msgid="1707357670383995567">"デスクトップのフルバックアップ用のパスワードを変更または削除する場合にタップします"</string>
     <string name="local_backup_password_toast_success" msgid="4891666204428091604">"新しいバックアップパスワードが設定されました"</string>
@@ -417,7 +421,7 @@
     <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"第一色弱(赤緑)"</string>
     <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"第三色弱(青黄)"</string>
     <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"色補正"</string>
-    <string name="accessibility_display_daltonizer_preference_subtitle" msgid="1284746051652993443">"色補正機能を使用して、デバイスで色をどのように表示するかを調整できます"</string>
+    <string name="accessibility_display_daltonizer_preference_subtitle" msgid="1284746051652993443">"色補正機能では、デバイスで色をどのように表示するかを調整できます"</string>
     <string name="daltonizer_type_overridden" msgid="4509604753672535721">"<xliff:g id="TITLE">%1$s</xliff:g>によって上書き済み"</string>
     <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
     <string name="power_remaining_duration_only" msgid="8264199158671531431">"残り時間: 約 <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
@@ -426,16 +430,20 @@
     <string name="power_discharging_duration_enhanced" msgid="1800465736237672323">"残り時間: 約 <xliff:g id="TIME_REMAINING">%1$s</xliff:g>(使用状況に基づく)(<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
     <!-- no translation found for power_remaining_duration_only_short (7438846066602840588) -->
     <skip />
-    <string name="power_discharge_by_enhanced" msgid="563438403581662942">"電池切れの推定時刻: <xliff:g id="TIME">%1$s</xliff:g>(使用状況に基づく)(<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_discharge_by_only_enhanced" msgid="3268796172652988877">"電池切れの推定時刻: <xliff:g id="TIME">%1$s</xliff:g>(使用状況に基づく)"</string>
-    <string name="power_discharge_by" msgid="4113180890060388350">"電池切れの推定時刻: <xliff:g id="TIME">%1$s</xliff:g>(<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_discharge_by_only" msgid="92545648425937000">"電池切れの推定時刻: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <string name="power_discharge_by_enhanced" msgid="563438403581662942">"電池が切れる推定時刻: <xliff:g id="TIME">%1$s</xliff:g>(使用状況に基づく)(<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+    <string name="power_discharge_by_only_enhanced" msgid="3268796172652988877">"電池が切れる推定時刻: <xliff:g id="TIME">%1$s</xliff:g>(使用状況に基づく)"</string>
+    <string name="power_discharge_by" msgid="4113180890060388350">"電池が切れる推定時刻: <xliff:g id="TIME">%1$s</xliff:g>(<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+    <string name="power_discharge_by_only" msgid="92545648425937000">"電池が切れる推定時刻: <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"<xliff:g id="TIME">%1$s</xliff:g> まで"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"<xliff:g id="TIME">%1$s</xliff:g> 頃に電池がなくなります"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"残り時間: <xliff:g id="THRESHOLD">%1$s</xliff:g>未満"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"残り時間: <xliff:g id="THRESHOLD">%1$s</xliff:g>未満(<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"残り時間: <xliff:g id="TIME_REMAINING">%1$s</xliff:g>以上(<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"残り時間: <xliff:g id="TIME_REMAINING">%1$s</xliff:g>以上"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"スマートフォンの電源がもうすぐ切れます"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"タブレットの電源がもうすぐ切れます"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"デバイスの電源がもうすぐ切れます"</string>
@@ -502,7 +510,7 @@
     <string name="zen_alarm_warning" msgid="245729928048586280">"次回のアラーム(<xliff:g id="WHEN">%1$s</xliff:g>)は鳴りません"</string>
     <string name="alarm_template" msgid="3346777418136233330">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
     <string name="alarm_template_far" msgid="6382760514842998629">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
-    <string name="zen_mode_duration_settings_title" msgid="1553451650289651489">"期間"</string>
+    <string name="zen_mode_duration_settings_title" msgid="1553451650289651489">"時間"</string>
     <string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"毎回確認"</string>
     <string name="zen_mode_forever" msgid="3339224497605461291">"OFF にするまで"</string>
     <string name="time_unit_just_now" msgid="3006134267292728099">"たった今"</string>
diff --git a/packages/SettingsLib/res/values-ka/strings.xml b/packages/SettingsLib/res/values-ka/strings.xml
index 106bc18..21ebced 100644
--- a/packages/SettingsLib/res/values-ka/strings.xml
+++ b/packages/SettingsLib/res/values-ka/strings.xml
@@ -212,7 +212,7 @@
     <string name="adb_wireless_settings" msgid="2295017847215680229">"შეცდომების უსადენო გამართვა"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"ხელმისაწვდომი მოწყობილობების სანახავად და გამოსაყენებლად ჩართეთ შეცდომების უსადენო გამართვა"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"ახალი მოწყობილობების დაწყვილება QR კოდით"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"ახალი მოწყობილობების დაწყვილება QR კოდის სკანერის გამოყენებით"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"ახალი მოწყობილობების დაწყვილება QR კოდის სკანერის გამოყენებით"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"მოწყობილობის დაწყვილება დაკავშირების კოდით"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"ახალი მოწყობილობების დაწყვილება ექვსნიშნა კოდის გამოყენებით"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"დაწყვილებული მოწყობილობები"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"მოწყობილობის დაწყვილება ვერ მოხერხდა. QR კოდი არასწორი იყო ან მოწყობილობა იმავე ქსელთან არ არის დაკავშირებული."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"IP მისამართი და პორტი"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"QR კოდის სკანირება"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"მოწყობილობის დაწყვილება Wi-Fi-ის მეშვეობით QR კოდის სკანირებით"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"მოწყობილობის დაწყვილება Wi-Fi-ის მეშვეობით QR კოდის სკანირებით"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"დაუკავშირდით Wi-Fi ქსელს"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, შეცდომების გამართვა, დეველოპერული"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"ხარვეზის შეტყობინების მალსახმობი"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"უსადენო ეკრანის სერტიფიცირება"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"Wi‑Fi-ს დაწვრილებითი აღრიცხვის ჩართვა"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"Wi‑Fi სკანირების რეგულირება"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"Wi‑Fi‑თ გაძლიერებული MAC მისამართის შემთხვევითობა"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"მობილური ინტერნეტის ყოველთვის გააქტიურება"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"ტეტერინგის აპარატურული აჩქარება"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Bluetooth-მოწყობილობების ჩვენება სახელების გარეშე"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"უსადენო ეკრანის სერტიფიცირების ვარიანტების ჩვენება"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Wi‑Fi-ს აღრიცხვის დონის გაზრდა, Wi‑Fi ამომრჩეველში ყოველ SSID RSSI-ზე ჩვენება"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"ამცირებს ბატარეის ხარჯვას და აუმჯობესებს ქსელის მუშაობას"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"ეს გადასართავი მხოლოდ კლიენტის რეჟიმში მოქმედებს MAC მისამართის შემთხვევითობაზე.\nამ რეჟიმის გააქტიურების შემთხვევაში, ნებისმიერმა ქსელმა, რომლისთვისაც MAC მისამართის შემთხვევითობა ჩართულია, შეიძლება ხელახლა მოახდინოს MAC მისამართთა შემთხვევითობის განხორციელება დაკავშირებისას, იმის გათვალისწინებით, თუ როდის გაწყვიტა კლიენტმა ბოლოს ქსელთან კავშირი. შემთხვევითობა აღარ განმეორდება, თუ ეს მოწყობილობა ქსელს 4 საათის ფარგლებში ან უფრო ნაკლებ დროში დაუკავშირდება."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"ლიმიტირებული"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"არალიმიტირებული"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"ჟურნალიზაციის ბუფერის ზომები"</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"„აპი არ რეაგირებს“ შეტყობინების ჩვენება, როცა ფონური აპლიკაცია არ პასუხობს"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"შეტყობინებათა არხის გაფრთხილებების ჩვენება"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"ეკრანზე აჩვენებს გაფრთხილებას, როცა აპი შეტყობინებას სწორი არხის გარეშე განათავსებს"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"მალსახმობების მოთხოვნა მიმოწერის შეტყობინებებისთვის"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"მოითხოვეთ, შეტყობინებები ეყრდნობოდეს ხანგრძლივად არსებულ გაზიარების მალსახმობებს მიმოწერის სექციაში გამოსაჩენად"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"აპების დაშვება გარე მეხსიერებაში"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"აპები ჩაიწერება გარე მეხსიერებაზე აღწერის ფაილების მნიშვნელობების მიუხედავად"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"ზომაცვლადი აქტივობების იძულება"</string>
@@ -428,14 +432,18 @@
     <skip />
     <string name="power_discharge_by_enhanced" msgid="563438403581662942">"უნდა იმუშაოს დაახლოებით <xliff:g id="TIME">%1$s</xliff:g>, ოხმარების გათვალისწინებით (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
     <string name="power_discharge_by_only_enhanced" msgid="3268796172652988877">"უნდა იმუშაოს დაახლოებით <xliff:g id="TIME">%1$s</xliff:g>, მოხმარების გათვალისწინებით"</string>
-    <string name="power_discharge_by" msgid="4113180890060388350">"უნდა იმუშაოს დაახლოებით <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_discharge_by_only" msgid="92545648425937000">"უნდა იმუშაოს დაახლოებით <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <string name="power_discharge_by" msgid="4113180890060388350">"უნდა იმუშაოს დაახლოებით <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)-მდე"</string>
+    <string name="power_discharge_by_only" msgid="92545648425937000">"უნდა იმუშაოს დაახლოებით <xliff:g id="TIME">%1$s</xliff:g>-მდე"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"<xliff:g id="TIME">%1$s</xliff:g>-მდე"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"ბატარეა შესაძლოა ამოიწუროს <xliff:g id="TIME">%1$s</xliff:g>-ისთვის"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"დარჩენილია <xliff:g id="THRESHOLD">%1$s</xliff:g>-ზე ნაკლები"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"დარჩენილია <xliff:g id="THRESHOLD">%1$s</xliff:g>-ზე ნაკლები დრო (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"დარჩენილია <xliff:g id="TIME_REMAINING">%1$s</xliff:g>-ზე მეტი დრო (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"დარჩენილია <xliff:g id="TIME_REMAINING">%1$s</xliff:g>-ზე მეტი დრო"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"ტელეფონი შეიძლება მალე გათიშოს"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"ტაბლეტი შეიძლება მალე გაითიშოს"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"მოწყობილობა შეიძლება მალე გაითიშოს"</string>
diff --git a/packages/SettingsLib/res/values-kk/arrays.xml b/packages/SettingsLib/res/values-kk/arrays.xml
index 3c96f43..fe5b5d2 100644
--- a/packages/SettingsLib/res/values-kk/arrays.xml
+++ b/packages/SettingsLib/res/values-kk/arrays.xml
@@ -26,7 +26,7 @@
     <item msgid="6050951078202663628">"Қосылуда..."</item>
     <item msgid="8356618438494652335">"Растауда…"</item>
     <item msgid="2837871868181677206">"IP мекенжайына қол жеткізуде…"</item>
-    <item msgid="4613015005934755724">"Қосылған"</item>
+    <item msgid="4613015005934755724">"Жалғанған"</item>
     <item msgid="3763530049995655072">"Уақытша тоқтатылды"</item>
     <item msgid="7852381437933824454">"Ажыратуда…"</item>
     <item msgid="5046795712175415059">"Ажыратылған"</item>
diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml
index 0ef83bb..f33a094 100644
--- a/packages/SettingsLib/res/values-kk/strings.xml
+++ b/packages/SettingsLib/res/values-kk/strings.xml
@@ -206,13 +206,13 @@
     <string name="enable_adb" msgid="8072776357237289039">"USB жөндеу"</string>
     <string name="enable_adb_summary" msgid="3711526030096574316">"USB жалғанғандағы жөндеу режимі"</string>
     <string name="clear_adb_keys" msgid="3010148733140369917">"USB жөндеу рұқсаттарынан бас тарту"</string>
-    <string name="enable_adb_wireless" msgid="6973226350963971018">"Сымсыз желі арқылы түзету"</string>
+    <string name="enable_adb_wireless" msgid="6973226350963971018">"Сымсыз түзету"</string>
     <string name="enable_adb_wireless_summary" msgid="7344391423657093011">"Wi‑Fi желісіне жалғанған кездегі түзету режимі"</string>
     <string name="adb_wireless_error" msgid="721958772149779856">"Қате"</string>
-    <string name="adb_wireless_settings" msgid="2295017847215680229">"Сымсыз желі арқылы түзету"</string>
-    <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Қолжетімді құрылғыларды көру және пайдалану үшін сымсыз желі арқылы түзетуді іске қосыңыз."</string>
+    <string name="adb_wireless_settings" msgid="2295017847215680229">"Сымсыз түзету"</string>
+    <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Қолжетімді құрылғыларды көру және пайдалану үшін сымсыз түзетуді іске қосыңыз."</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Құрылғыны QR коды арқылы жұптау"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"Жаңа құрылғыларды QR коды сканері арқылы жұптау"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"Жаңа құрылғыларды QR коды сканерімен жұптау"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Құрылғыны кодпен жұптау"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Жаңа құрылғыларды алты цифрлық код арқылы жұптау"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"Жұпталған құрылғылар"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Құрылғы жұпталмады. QR коды дұрыс емес немесе құрылғы бір желіге жалғанбаған."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"IP мекенжайы және порт"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"QR кодын сканерлеу"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"QR кодын сканерлеп, құрылғыны Wi‑Fi арқылы жұптау"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"QR кодын сканерлеп, құрылғыны Wi‑Fi арқылы жұптау"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Wi-Fi желісіне қосылыңыз."</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, түзету, әзірлеуші"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"Қате туралы хабарлау"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"Сымсыз дисплей сертификаты"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"Wi‑Fi егжей-тегжейлі журналы"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"Wi‑Fi іздеуін шектеу"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"Wi‑Fi жақсартылған MAC рандомизациясы"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"Мобильдік интернет әрқашан қосулы"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"Тетеринг режиміндегі аппараттық жеделдету"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Bluetooth құрылғыларын атаусыз көрсету"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Сымсыз дисплей сертификаты опцияларын көрсету"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Wi‑Fi тіркеу деңгейін арттыру, Wi‑Fi таңдағанда әр SSID RSSI бойынша көрсету"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Батарея зарядының шығынын азайтады және желі жұмысын жақсартады."</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Бұл қосқыш тек клиент режимі үшін MAC рандомизациясының әрекетіне әсер етеді.\nБұл режим қосылған кезде, MAC рандомизациясы қосулы кез келген желі MAC мекенжайларын қайта рандомизациялайды. Бұл үшін клиенттің желіден ең соңғы ажыратылған уақыты негізге алынады. Құрылғы желіге 4 сағат немесе одан аз уақыт ішінде қайта қосылса, қайта рандомизацияланбайды."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"Трафик саналады"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"Трафик саналмайды"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"Журналға тіркеуші буферінің өлшемдері"</string>
@@ -300,8 +302,8 @@
     <string name="tethering_hardware_offload_summary" msgid="7801345335142803029">"Тетеринг режиміндегі аппараттық жеделдетуді пайдалану (қолжетімді болса)"</string>
     <string name="adb_warning_title" msgid="7708653449506485728">"USB жөндеулеріне рұқсат берілсін бе?"</string>
     <string name="adb_warning_message" msgid="8145270656419669221">"USB жөндеу дамыту мақсаттарына ғана арналған. Оны компьютер және құрылғы арасында дерек көшіру, құрылғыға ескертусіз қолданба орнату және тіркелім деректерін оқу үшін қолданыңыз."</string>
-    <string name="adbwifi_warning_title" msgid="727104571653031865">"Сымсыз желі арқылы түзетуге рұқсат берілсін бе?"</string>
-    <string name="adbwifi_warning_message" msgid="8005936574322702388">"Сымсыз желі арқылы түзету функциясы дамыту мақсаттарына ғана арналған. Оны компьютер және құрылғы арасында дерек көшіру, құрылғыға ескертусіз қолданба орнату және журнал деректерін оқу үшін қолданыңыз."</string>
+    <string name="adbwifi_warning_title" msgid="727104571653031865">"Сымсыз түзетуге рұқсат берілсін бе?"</string>
+    <string name="adbwifi_warning_message" msgid="8005936574322702388">"Сымсыз түзету функциясы дамыту мақсаттарына ғана арналған. Оны компьютер және құрылғы арасында дерек көшіру, құрылғыға ескертусіз қолданба орнату және журнал деректерін оқу үшін қолданыңыз."</string>
     <string name="adb_keys_warning_message" msgid="2968555274488101220">"Бұған дейін рұқсат берілген барлық компьютерлерде USB жөндеу функциясына тыйым салынсын ба?"</string>
     <string name="dev_settings_warning_title" msgid="8251234890169074553">"Жетілдіру параметрлеріне рұқсат берілсін бе?"</string>
     <string name="dev_settings_warning_message" msgid="37741686486073668">"Бұл параметрлер жетілдіру мақсатында ғана қолданылады. Олар құрылғыңыз бен қолданбаларыңыздың бұзылуына немесе әдеттен тыс әрекеттерге себеп болуы мүмкін."</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"Фондық қолданбалар үшін \"Қолданба жауап бермейді\" терезесін шығару"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Хабарландыру арнасының ескертулерін көрсету"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Қолданба жарамсыз арна арқылы хабарландыру жариялағанда, экранға ескерту шығарады"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Чат хабарландырулары үшін таңбашаларды пайдалану"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Хабарландырулар чат бөлімінде көрсетілуі үшін, оларды ұзақ көрсетілетін таңбаша арқылы міндетті түрде қайталап көрсету"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"Сыртқы жадта қолданбаларға рұқсат ету"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Манифест мәндеріне қарамастан, кез келген қолданбаны сыртқы жадқа жазу мүмкіндігін береді"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"Әрекеттердің өлшемін өзгертуге рұқсат ету"</string>
@@ -426,16 +430,20 @@
     <string name="power_discharging_duration_enhanced" msgid="1800465736237672323">"Пайдалану деректеріңізге сәйкес енді шамамен <xliff:g id="TIME_REMAINING">%1$s</xliff:g> қалды (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
     <!-- no translation found for power_remaining_duration_only_short (7438846066602840588) -->
     <skip />
-    <string name="power_discharge_by_enhanced" msgid="563438403581662942">"Пайдалануға байланысты шамамен <xliff:g id="TIME">%1$s</xliff:g> уақытқа жетеді (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_discharge_by_only_enhanced" msgid="3268796172652988877">"Пайдалануға байланысты шамамен <xliff:g id="TIME">%1$s</xliff:g> уақытқа жетеді"</string>
-    <string name="power_discharge_by" msgid="4113180890060388350">"Шамамен <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>) уақытқа жетеді"</string>
-    <string name="power_discharge_by_only" msgid="92545648425937000">"Шамамен <xliff:g id="TIME">%1$s</xliff:g> уақытқа жетеді"</string>
+    <string name="power_discharge_by_enhanced" msgid="563438403581662942">"Пайдалануға байланысты шамамен <xliff:g id="TIME">%1$s</xliff:g> дейін жетеді (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+    <string name="power_discharge_by_only_enhanced" msgid="3268796172652988877">"Пайдалануға байланысты шамамен <xliff:g id="TIME">%1$s</xliff:g> дейін жетеді"</string>
+    <string name="power_discharge_by" msgid="4113180890060388350">"Шамамен <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>) дейін жетеді"</string>
+    <string name="power_discharge_by_only" msgid="92545648425937000">"Шамамен <xliff:g id="TIME">%1$s</xliff:g> дейін жетеді"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"<xliff:g id="TIME">%1$s</xliff:g> дейін"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Батарея заряды <xliff:g id="TIME">%1$s</xliff:g> сағатқа қарай бітуі мүмкін."</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"<xliff:g id="THRESHOLD">%1$s</xliff:g> шамасынан аз қалды"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"<xliff:g id="THRESHOLD">%1$s</xliff:g> шамасынан аз қалды (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> шамасынан көп уақыт қалды (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> шамасынан көп уақыт қалды"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"Телефон көп ұзамай өшуі мүмкін"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"Планшет көп ұзамай өшуі мүмкін"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"Құрылғы көп ұзамай өшуі мүмкін"</string>
@@ -470,7 +478,7 @@
     <string name="screen_zoom_summary_large" msgid="4706951482598978984">"Үлкен"</string>
     <string name="screen_zoom_summary_very_large" msgid="7317423942896999029">"Үлкенірек"</string>
     <string name="screen_zoom_summary_extremely_large" msgid="1438045624562358554">"Ең үлкен"</string>
-    <string name="screen_zoom_summary_custom" msgid="3468154096832912210">"Арнаулы (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
+    <string name="screen_zoom_summary_custom" msgid="3468154096832912210">"Басқа (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
     <string name="content_description_menu_button" msgid="6254844309171779931">"Mәзір"</string>
     <string name="retail_demo_reset_message" msgid="5392824901108195463">"Демо режимде зауыттық мәндерге қайтару үшін құпия сөзді енгізу"</string>
     <string name="retail_demo_reset_next" msgid="3688129033843885362">"Келесі"</string>
@@ -532,7 +540,7 @@
     <string name="user_add_user_message_long" msgid="1527434966294733380">"Қосымша профильдер жасай отырып, бұл құрылғыны басқалармен ортақ пайдалануға болады. Әр пайдаланушы қолданбаларды, тұсқағаздарды орнатып, профилін өз қалауынша реттей алады. Сондай-ақ барлығы ортақ қолданатын Wi‑Fi сияқты параметрлерді де реттеуге болады.\n\nЖаңа пайдаланушы енгізілгенде, ол өз профилін реттеуі керек болады.\n\nКез келген пайдаланушы барлық басқа пайдаланушылар үшін қолданбаларды жаңарта алады. Арнайы мүмкіндіктерге қатысты параметрлер мен қызметтер жаңа пайдаланушыға өтпейді."</string>
     <string name="user_add_user_message_short" msgid="3295959985795716166">"Жаңа пайдаланушыны қосқанда сол адам өз кеңістігін реттеуі керек.\n\nКез келген пайдаланушы барлық басқа пайдаланушылар үшін қолданбаларды жаңарта алады."</string>
     <string name="user_setup_dialog_title" msgid="8037342066381939995">"Профиль құру керек пе?"</string>
-    <string name="user_setup_dialog_message" msgid="269931619868102841">"Пайдаланушы құрылығыны алып, өз профилін реттеуі керек."</string>
+    <string name="user_setup_dialog_message" msgid="269931619868102841">"Пайдаланушы құрылғыны алып, өз профилін реттеуі керек."</string>
     <string name="user_setup_profile_dialog_message" msgid="4788197052296962620">"Профайл қазір жасақталсын ба?"</string>
     <string name="user_setup_button_setup_now" msgid="1708269547187760639">"Қазір құру"</string>
     <string name="user_setup_button_setup_later" msgid="8712980133555493516">"Қазір емес"</string>
diff --git a/packages/SettingsLib/res/values-km/strings.xml b/packages/SettingsLib/res/values-km/strings.xml
index 4cf8bed..aa52052 100644
--- a/packages/SettingsLib/res/values-km/strings.xml
+++ b/packages/SettingsLib/res/values-km/strings.xml
@@ -212,7 +212,7 @@
     <string name="adb_wireless_settings" msgid="2295017847215680229">"ការជួសជុល​ដោយឥតខ្សែ"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"ដើម្បី​មើលឃើញ និងប្រើ​ឧបករណ៍​ដែលមាន សូមបើក​ការជួសជុល​ដោយឥតខ្សែ"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"ផ្គូផ្គង​ឧបករណ៍​ដោយប្រើ​កូដ QR"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"ផ្គូផ្គង​ឧបករណ៍​ថ្មី​ដោយប្រើ​កម្មវិធីស្កេន​កូដ QR"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"ផ្គូផ្គង​ឧបករណ៍ថ្មី​ដោយប្រើ​កម្មវិធីស្កេន​កូដ QR"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"ផ្គូផ្គង​ឧបករណ៍​ដោយប្រើ​កូដផ្គូផ្គង"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"ផ្គូផ្គង​ឧបករណ៍​ថ្មី​ដោយប្រើ​កូដ​ប្រាំមួយ​ខ្ទង់"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"ឧបករណ៍​ដែល​បាន​ផ្គូផ្គង"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"មិនអាច​ផ្គូផ្គង​ឧបករណ៍​បានទេ។ កូដ QR មិនត្រឹមត្រូវ ឬមិនបានភ្ជាប់​ឧបករណ៍​ទៅ​បណ្ដាញ​ដូចគ្នា។"</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"អាសយដ្ឋាន IP និងច្រក"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"ស្កេន​កូដ QR"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"ផ្គូផ្គង​ឧបករណ៍​តាមរយៈ Wi‑Fi ដោយស្កេន​កូដ QR"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"ផ្គូផ្គង​ឧបករណ៍​តាមរយៈ Wi‑Fi ដោយស្កេន​កូដ QR"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"សូម​ភ្ជាប់ទៅ​បណ្តាញ Wi-Fi"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, ជួសជុល, dev"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"ផ្លូវកាត់រាយការណ៍​កំហុស"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"សេចក្តីបញ្ជាក់ការបង្ហាញ​ឥត​ខ្សែ"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"បើក​កំណត់ហេតុ​រៀបរាប់​ Wi-Fi"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"ការពន្យឺតការស្កេន Wi‑Fi"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"ការតម្រៀប MAC តាមលំដាប់ចៃដន្យដែលកែលម្អតាម Wi-Fi"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"ទិន្នន័យទូរសព្ទចល័តដំណើរការជានិច្ច"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"ការ​បង្កើនល្បឿន​ផ្នែករឹងសម្រាប់​ការភ្ជាប់"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"បង្ហាញ​ឧបករណ៍​ប្ល៊ូធូស​គ្មានឈ្មោះ"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"បង្ហាញ​ជម្រើស​សម្រាប់​សេចក្តីបញ្ជាក់ការបង្ហាញ​ឥត​ខ្សែ"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"បង្កើនកម្រិតកំណត់ហេតុ Wi-Fi បង្ហាញក្នុង SSID RSSI ក្នុងកម្មវិធីជ្រើសរើស Wi-Fi"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"កាត់បន្ថយ​ការប្រើប្រាស់ថ្ម និងកែលម្អប្រតិបត្តិការ​បណ្ដាញ"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"ការបិទ/បើកនេះ​ប៉ះពាល់​ដល់សកម្មភាព​តម្រៀប MAC តាមលំដាប់​ចៃដន្យសម្រាប់មុខងារភ្ញៀវតែប៉ុណ្ណោះ។\nនៅពេលបើកដំណើរការមុខងារនេះ បណ្ដាញ​ទាំងឡាយដែល​បានបើក​ការតម្រៀប MAC តាមលំដាប់​ចៃដន្យប្រហែលជាត្រូវបានតម្រៀបអាសយដ្ឋាន MAC របស់វាតាមលំដាប់​ចៃដន្យឡើងវិញ អំឡុងពេលភ្ជាប់ ដោយផ្អែកលើពេលវេលាដែលមុខងារភ្ញៀវបានផ្ដាច់លើកចុងក្រោយពីបណ្ដាញ។ ការតម្រៀប​តាមលំដាប់​ចៃដន្យឡើងវិញ​មិនកើតឡើងទេ ប្រសិនបើ​ឧបករណ៍​ភ្ជាប់ឡើងវិញ​ក្នុងរយៈពេល 4 ម៉ោង ឬ​ឆាប់ជាងនេះ។"</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"មានការកំណត់"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"មិនមានការកំណត់"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"ទំហំកន្លែងផ្ទុករបស់ logger"</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"បង្ហាញ​ប្រអប់​កម្មវិធី​មិន​ឆ្លើយតប​សម្រាប់​កម្មវិធី​ផ្ទៃ​ខាង​ក្រោយ"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"បង្ហាញការព្រមានអំពីបណ្តាញជូនដំណឹង"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"បង្ហាញការព្រមាននៅលើអេក្រង់ នៅពេលកម្មវិធីបង្ហោះការជូនដំណឹងដោយមិនមានបណ្តាញត្រឹមត្រូវ"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"ជំរុញឱ្យប្រើផ្លូវកាត់សម្រាប់ការជូនដំណឹងពីការសន្ទនា"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"តម្រូវឱ្យបម្រុងទុកការជូនដំណឹង តាមរយៈផ្លូវកាត់ចែករំលែកដែលមានអាយុកាលយូរទើបអាចបង្ហាញនៅក្នុងផ្នែកនៃការសន្ទនាបាន"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"បង្ខំឲ្យអនុញ្ញាតកម្មវិធីលើឧបករណ៍ផ្ទុកខាងក្រៅ"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"ធ្វើឲ្យកម្មវិធីទាំងឡាយមានសិទ្ធិសរសេរទៅកាន់ឧបករណ៍ផ្ទុកខាងក្រៅ ដោយមិនគិតពីតម្លៃជាក់លាក់"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"បង្ខំឲ្យសកម្មភាពអាចប្តូរទំហំបាន"</string>
@@ -432,10 +436,14 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"គួរ​តែ​អាច​ប្រើបាន​រហូតដល់​ម៉ោងប្រហែល <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"រហូតដល់​ម៉ោង <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"អាចនឹង​អស់ថ្ម​ត្រឹមម៉ោង <xliff:g id="TIME">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"នៅ​សល់​តិច​ជាង <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"នៅសល់​តិចជាង <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"នៅសល់​ច្រើនជាង <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"នៅ​សល់​ច្រើន​ជាង <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"ទូរសព្ទ​អាច​នឹង​បិទ​ក្នុង​ពេល​បន្តិច​ទៀត"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"ថេប្លេត​អាចនឹង​បិទក្នុង​ពេលបន្តិច​ទៀត"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"ឧបករណ៍​អាចនឹង​បិទក្នុង​ពេលបន្តិច​ទៀត"</string>
diff --git a/packages/SettingsLib/res/values-kn/strings.xml b/packages/SettingsLib/res/values-kn/strings.xml
index ed854ac..aece31f 100644
--- a/packages/SettingsLib/res/values-kn/strings.xml
+++ b/packages/SettingsLib/res/values-kn/strings.xml
@@ -112,7 +112,7 @@
     <string name="bluetooth_opp_profile_summary_use_for" msgid="461981154387015457">"ಫೈಲ್‌ ವರ್ಗಾವಣೆಗಾಗಿ ಬಳಸು"</string>
     <string name="bluetooth_hid_profile_summary_use_for" msgid="4289460627406490952">"ಇನ್‌ಪುಟ್‌ಗಾಗಿ ಬಳಸು"</string>
     <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="7689393730163320483">"ಶ್ರವಣ ಸಾಧನಗಳಿಗಾಗಿ ಬಳಸಿ"</string>
-    <string name="bluetooth_pairing_accept" msgid="2054232610815498004">"ಜೋಡಿ"</string>
+    <string name="bluetooth_pairing_accept" msgid="2054232610815498004">"ಜೋಡಿಸಿ"</string>
     <string name="bluetooth_pairing_accept_all_caps" msgid="2734383073450506220">"ಜೋಡಿ ಮಾಡು"</string>
     <string name="bluetooth_pairing_decline" msgid="6483118841204885890">"ರದ್ದುಮಾಡಿ"</string>
     <string name="bluetooth_pairing_will_share_phonebook" msgid="3064334458659165176">"ಸಂಪರ್ಕಗೊಳಿಸಿದಾಗ, ಜೋಡಿಸುವಿಕೆಯು ನಿಮ್ಮ ಸಂಪರ್ಕಗಳು ಮತ್ತು ಕರೆ ಇತಿಹಾಸಕ್ಕೆ ಪ್ರವೇಶವನ್ನು ಅನುಮತಿಸುತ್ತದೆ."</string>
@@ -212,7 +212,7 @@
     <string name="adb_wireless_settings" msgid="2295017847215680229">"ವೈರ್‌ಲೆಸ್ ಡೀಬಗ್ ಮಾಡುವಿಕೆ"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"ಲಭ್ಯವಿರುವ ಸಾಧನಗಳನ್ನು ನೋಡಲು ಮತ್ತು ಬಳಸಲು, ವೈರ್‌ಲೆಸ್ ಡೀಬಗ್ ಮಾಡುವಿಕೆಯನ್ನು ಆನ್ ಮಾಡಿ"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"QR ಕೋಡ್ ಬಳಸಿ ಸಾಧನವನ್ನು ಜೋಡಿಸಿ"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"QR ಕೋಡ್ ಸ್ಕ್ಯಾನರ್ ಬಳಸಿ ಹೊಸ ಸಾಧನಗಳನ್ನು ಜೋಡಿಸಿ"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"QR ಕೋಡ್ ಸ್ಕ್ಯಾನರ್ ಬಳಸಿ ಹೊಸ ಸಾಧನಗಳನ್ನು ಜೋಡಿಸಿ"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"ಜೋಡಿಸುವ ಕೋಡ್ ಬಳಸಿ ಸಾಧನವನ್ನು ಜೋಡಿಸಿ"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"ಆರು ಅಂಕಿಯ ಕೋಡ್ ಬಳಸಿ ಹೊಸ ಸಾಧನಗಳನ್ನು ಜೋಡಿಸಿ"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"ಜೋಡಿಸಲಾದ ಸಾಧನಗಳು"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"ಸಾಧನವನ್ನು ಜೋಡಿಸಲು ವಿಫಲವಾಗಿದೆ. QR ಕೋಡ್ ತಪ್ಪಾಗಿದೆ ಅಥವಾ ಸಾಧನವು ಒಂದೇ ನೆಟ್‌ವರ್ಕ್‌ಗೆ ಕನೆಕ್ಟ್ ಆಗಿಲ್ಲ."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"IP ವಿಳಾಸ ಮತ್ತು ಪೋರ್ಟ್"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"QR ಕೋಡ್ ಸ್ಕ್ಯಾನ್ ಮಾಡಿ"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"QR ಕೋಡ್ ಅನ್ನು ಸ್ಕ್ಯಾನ್ ಮಾಡುವ ಮೂಲಕ ವೈ-ಫೈ ನೆಟ್‌ವರ್ಕ್‌ನಲ್ಲಿ ಸಾಧನವನ್ನು ಜೋಡಿಸಿ"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"QR ಕೋಡ್ ಅನ್ನು ಸ್ಕ್ಯಾನ್ ಮಾಡುವ ಮೂಲಕ ವೈ-ಫೈನಲ್ಲಿ ಸಾಧನವನ್ನು ಜೋಡಿಸಿ"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"ವೈ-ಫೈ ನೆಟ್‌ವರ್ಕ್‌ಗೆ ಸಂಪರ್ಕಿಸಿ"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, ಡೀಬಗ್, dev"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"ದೋಷ ವರದಿಯ ಶಾರ್ಟ್‌ಕಟ್‌‌"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"ವೈರ್‌ಲೆಸ್ ಪ್ರದರ್ಶನ ಪ್ರಮಾಣೀಕರಣ"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"Wi‑Fi ವೆರ್ಬೋಸ್ ಲಾಗಿಂಗ್ ಸಕ್ರಿಯಗೊಳಿಸಿ"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"ವೈ-ಫೈ ಸ್ಕ್ಯಾನ್ ನಿರ್ಬಂಧಿಸಲಾಗುತ್ತಿದೆ"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"Wi‑Fi‑ವರ್ಧಿತ MAC ಯಾದೃಚ್ಛಿಕರಣ"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"ಮೊಬೈಲ್ ಡೇಟಾ ಯಾವಾಗಲೂ ಸಕ್ರಿಯ"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"ಟೆಥರಿಂಗ್‍‍ಗಾಗಿ ಹಾರ್ಡ್‍ವೇರ್ ವೇಗವರ್ಧನೆ"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"ಹೆಸರುಗಳಿಲ್ಲದ ಬ್ಲೂಟೂತ್ ಸಾಧನಗಳನ್ನು ತೋರಿಸಿ"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"ವೈರ್‌ಲೆಸ್‌‌‌ ಪ್ರದರ್ಶನ ಪ್ರಮಾಣೀಕರಣಕ್ಕಾಗಿ ಆಯ್ಕೆಗಳನ್ನು ತೋರಿಸು"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Wi‑Fi ಲಾಗಿಂಗ್ ಮಟ್ಟನ್ನು ಹೆಚ್ಚಿಸಿ, Wi‑Fi ಆಯ್ಕೆಯಲ್ಲಿ ಪ್ರತಿಯೊಂದು SSID RSSI ತೋರಿಸಿ"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"ಬ್ಯಾಟರಿ ಹೆಚ್ಚು ಬಾಳಿಕೆ ಬರುವಂತೆ ಮಾಡುತ್ತದೆ ಮತ್ತು ನೆಟ್‌ವರ್ಕ್‌ ಕಾರ್ಯಕ್ಷಮತೆಯನ್ನು ಸುಧಾರಿಸುತ್ತದೆ"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"ಈ ಟಾಗಲ್, ಕ್ಲೈಂಟ್‌ ಮೋಡ್‌ಗಾಗಿ ಮಾತ್ರ MAC ಯಾದೃಚ್ಛಿಕರಣ ವರ್ತನೆಯ ಮೇಲೆ ಪರಿಣಾಮ ಬೀರುತ್ತದೆ.\nಈ ಮೋಡ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿದಾಗ, MAC ಯಾದೃಚ್ಛಿಕರಣವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿದ ಯಾವುದೇ ನೆಟ್‌ವರ್ಕ್ ಸಂಯೋಜನೆಯನ್ನು ಸ್ಥಾಪಿಸುವಾಗ MAC ವಿಳಾಸವನ್ನು ಮರು-ಯಾದೃಚ್ಛಿಕರಣಗೊಳಿಸಬಹುದು (ಕ್ಲೈಂಟ್ ಕೊನೆಯದಾಗಿ ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸಿರುವುದನ್ನು ಅವಲಂಬಿಸಿರುತ್ತದೆ). ಸಾಧನವು 4 ಗಂಟೆಗಳು ಅಥವಾ ಕಡಿಮೆ ಸಮಯದಲ್ಲಿ ಮರುಸಂಪರ್ಕಿಸಿದರೆ, ಯಾವುದೇ ಮರು-ಯಾದೃಚ್ಛಿಕರಣ ಸಂಭವಿಸುವುದಿಲ್ಲ."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"ಮೀಟರ್ ಮಾಡಲಾಗಿದೆ"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"ಮೀಟರ್ ಮಾಡಲಾಗಿಲ್ಲ"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"ಲಾಗರ್ ಬಫರ್ ಗಾತ್ರಗಳು"</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"ಹಿನ್ನೆಲೆ ಅಪ್ಲಿಕೇಶನ್‌ಗಳಿಗಾಗಿ ಅಪ್ಲಿಕೇಶನ್ ಪ್ರತಿಕ್ರಿಯಿಸುತ್ತಿಲ್ಲ ಎಂಬ ಸಂಭಾಷಣೆ ತೋರಿಸಿ"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"ಅಧಿಸೂಚನೆ ಎಚ್ಚರಿಕೆ ತೋರಿಸಿ"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"ಅಮಾನ್ಯ ಚಾನಲ್ ಅಧಿಸೂಚನೆಗಾಗಿ ಪರದೆಯಲ್ಲಿ ಎಚ್ಚರಿಕೆ"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"ಸಂಭಾಷಣೆ ಅಧಿಸೂಚನೆಗಳಿಗಾಗಿ ಶಾರ್ಟ್‌ಕಟ್‌ಗಳನ್ನು ಜಾರಿಗೊಳಿಸಿ"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"ಸಂಭಾಷಣೆ ವಿಭಾಗದಲ್ಲಿ ಕಾಣಿಸಿಕೊಳ್ಳಲು, ಅಧಿಸೂಚನೆಗಳನ್ನು ದೀರ್ಘಕಾಲದ ಹಂಚಿಕೆ ಶಾರ್ಟ್‌ಕಟ್ ಮೂಲಕ ಬೆಂಬಲಿಸುವ ಅಗತ್ಯವಿದೆ"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"ಬಾಹ್ಯವಾಗಿ ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ಒತ್ತಾಯವಾಗಿ ಅನುಮತಿಸಿ"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"ಮ್ಯಾನಿಫೆಸ್ಟ್ ಮೌಲ್ಯಗಳು ಯಾವುದೇ ಆಗಿದ್ದರೂ, ಬಾಹ್ಯ ಸಂಗ್ರಹಣೆಗೆ ಬರೆಯಲು ಯಾವುದೇ ಅಪ್ಲಿಕೇಶನ್‌ ಅನ್ನು ಅರ್ಹಗೊಳಿಸುತ್ತದೆ"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"ಚಟುವಟಿಕೆಗಳನ್ನು ಮರುಗಾತ್ರಗೊಳಿಸುವಂತೆ ಒತ್ತಾಯ ಮಾಡಿ"</string>
@@ -432,10 +436,14 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"<xliff:g id="TIME">%1$s</xliff:g> ಸಮಯದವರೆಗೆ ಫೋನ್‌ ರನ್‌ ಆಗಬೇಕು"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"<xliff:g id="TIME">%1$s</xliff:g> ರವರೆಗೆ"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"<xliff:g id="TIME">%1$s</xliff:g> ಗಳಲ್ಲಿ ಬ್ಯಾಟರಿ ಮುಕ್ತಾಯವಾಗಬಹುದು"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"<xliff:g id="THRESHOLD">%1$s</xliff:g> ನಿಮಿಷಕ್ಕಿಂತ ಕಡಿಮೆ ಸಮಯ ಉಳಿದಿದೆ"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"<xliff:g id="THRESHOLD">%1$s</xliff:g> ಕ್ಕಿಂತ ಕಡಿಮೆ (<xliff:g id="LEVEL">%2$s</xliff:g>) ಬಾಕಿ"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> ಕ್ಕಿಂತ ಹೆಚ್ಚು (<xliff:g id="LEVEL">%2$s</xliff:g>) ಬಾಕಿ"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> ಕ್ಕಿಂತ ಹೆಚ್ಚು ಸಮಯ ಉಳಿದಿದೆ"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"ಫೋನ್ ಶೀಘ್ರದಲ್ಲೇ ಶಟ್ ಡೌನ್ ಆಗಬಹುದು"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"ಟ್ಯಾಬ್ಲೆಟ್‌‌ ಶೀಘ್ರದಲ್ಲೇ ಶಟ್ ಡೌನ್ ಆಗಬಹುದು"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"ಸಾಧನವು ಶೀಘ್ರದಲ್ಲೇ ಶಟ್ ಡೌನ್ ಆಗಬಹುದು"</string>
@@ -531,7 +539,7 @@
     <string name="user_add_user_title" msgid="5457079143694924885">"ಹೊಸ ಬಳಕೆದಾರರನ್ನು ಸೇರಿಸುವುದೇ?"</string>
     <string name="user_add_user_message_long" msgid="1527434966294733380">"ನೀವು ಹೆಚ್ಚುವರಿ ಬಳಕೆದಾರರನ್ನು ರಚಿಸುವ ಮೂಲಕ ಇತರ ಜನರ ಜೊತೆಗೆ ಈ ಸಾಧನವನ್ನು ಹಂಚಿಕೊಳ್ಳಬಹುದು. ಪ್ರತಿ ಬಳಕೆದಾರರು ತಮ್ಮದೇ ಸ್ಥಳವನ್ನು ಹೊಂದಿರುತ್ತಾರೆ, ಇದರಲ್ಲಿ ಅವರು ತಮ್ಮದೇ ಅಪ್ಲಿಕೇಶನ್‌ಗಳು, ವಾಲ್‌ಪೇಪರ್ ಮತ್ತು ಮುಂತಾದವುಗಳ ಮೂಲಕ ಕಸ್ಟಮೈಸ್ ಮಾಡಿಕೊಳ್ಳಬಹುದು. ಎಲ್ಲರ ಮೇಲೂ ಪರಿಣಾಮ ಬೀರುವಂತೆ ವೈ-ಫೈ ರೀತಿಯ ಸಾಧನ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಬಳಕೆದಾರರು ಸರಿಹೊಂದಿಸಬಹುದು.\n\nನೀವು ಒಬ್ಬ ಹೊಸ ಬಳಕೆದಾರರನ್ನು ಸೇರಿಸಿದಾಗ, ಆ ವ್ಯಕ್ತಿಯು ಅವರ ಸ್ಥಳವನ್ನು ಹೊಂದಿಸಬೇಕಾಗುತ್ತದೆ.\n\nಯಾವುದೇ ಬಳಕೆದಾರರು ಎಲ್ಲಾ ಇತರೆ ಬಳಕೆದಾರರಿಗೆ ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ಅಪ್‌ಡೇಟ್‌ ಮಾಡಬಹುದು. ಪ್ರವೇಶಿಸುವಿಕೆ ಸೆಟ್ಟಿಂಗ್‌ಗಳು ಮತ್ತು ಸೇವೆಗಳು ಹೊಸ ಬಳಕೆದಾರರಿಗೆ ವರ್ಗಾವಣೆ ಆಗದಿರಬಹುದು."</string>
     <string name="user_add_user_message_short" msgid="3295959985795716166">"ನೀವು ಒಬ್ಬ ಹೊಸ ಬಳಕೆದಾರರನ್ನು ಸೇರಿಸಿದಾಗ, ಆ ವ್ಯಕ್ತಿಯು ಅವರ ಸ್ಥಳವನ್ನು ಸ್ಥಾಪಿಸಬೇಕಾಗುತ್ತದೆ.\n\nಯಾವುದೇ ಬಳಕೆದಾರರು ಎಲ್ಲಾ ಇತರೆ ಬಳಕೆದಾರರಿಗಾಗಿ ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ಅಪ್‌ಡೇಟ್‌ ಮಾಡಬಹುದು."</string>
-    <string name="user_setup_dialog_title" msgid="8037342066381939995">"ಈಗ ಬಳಕೆದಾರರನ್ನು ಸೆಟಪ್‌‌ ಮಾಡುವುದೇ?"</string>
+    <string name="user_setup_dialog_title" msgid="8037342066381939995">"ಈಗ ಬಳಕೆದಾರರನ್ನು ಸೆಟ್ ಮಾಡುವುದೇ?"</string>
     <string name="user_setup_dialog_message" msgid="269931619868102841">"ಸಾಧನವನ್ನು ತೆಗೆದುಕೊಳ್ಳಲು ಮತ್ತು ಅದರ ಸ್ಥಳವನ್ನು ಹೊಂದಿಸಲು ವ್ಯಕ್ತಿಯು ಲಭ್ಯವಿದ್ದಾರೆಯೇ ಎಂಬುದನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ"</string>
     <string name="user_setup_profile_dialog_message" msgid="4788197052296962620">"ಇದೀಗ ಪ್ರೊಫೈಲ್‌ ಅನ್ನು ಹೊಂದಿಸುವುದೇ?"</string>
     <string name="user_setup_button_setup_now" msgid="1708269547187760639">"ಇದೀಗ ಹೊಂದಿಸಿ"</string>
diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml
index 6f642c3..9dbeb45 100644
--- a/packages/SettingsLib/res/values-ko/strings.xml
+++ b/packages/SettingsLib/res/values-ko/strings.xml
@@ -212,7 +212,7 @@
     <string name="adb_wireless_settings" msgid="2295017847215680229">"무선 디버깅"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"사용 가능한 기기를 보고 사용하려면 무선 디버깅을 사용 설정하세요."</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"QR 코드로 기기 페어링"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"QR 코드 스캐너를 사용하여 새 기기 페어링"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"QR 코드 스캐너를 사용하여 새 기기 페어링"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"페어링 코드로 기기 페어링"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"6자리 코드를 사용하여 새 기기 페어링"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"페어링된 기기"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"기기를 페어링할 수 없습니다. QR 코드가 잘못되었거나 기기가 동일한 네트워크에 연결되어 있지 않습니다."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"IP 주소 및 포트"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"QR 코드 스캔"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"QR 코드를 스캔하여 Wi‑Fi를 통해 기기 페어링"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"QR 코드를 스캔하여 Wi‑Fi를 통해 기기 페어링"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Wi-Fi 네트워크에 연결하세요."</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, 디버그, 개발자"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"버그 신고 바로가기"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"무선 디스플레이 인증서"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"Wi-Fi 상세 로깅 사용"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"Wi‑Fi 검색 제한"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"Wi‑Fi로 MAC 무작위 순서 지정 개선"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"항상 모바일 데이터 활성화"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"테더링 하드웨어 가속"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"이름이 없는 블루투스 기기 표시"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"무선 디스플레이 인증서 옵션 표시"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Wi‑Fi 로깅 수준을 높이고, Wi‑Fi 선택도구에서 SSID RSSI당 값을 표시"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"배터리 소모를 줄이고 네트워크 성능 개선"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"이 전환은 클라이언트 모드의 MAC 무작위 순서 지정 방식에만 영향을 줍니다.\n이 모드를 활성화하면 네트워크와 클라이언트 연결이 끊긴 마지막 시점에 따라 MAC 무작위 순서 지정이 사용 설정된 네트워크에서 연결 중에 MAC 주소를 다시 무작위 순서로 지정할 수 있습니다. 기기가 4시간 이내에 재연결된 경우 무작위 순서 지정이 다시 발생하지 않습니다."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"종량제 네트워크"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"무제한 네트워크"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"로거 버퍼 크기"</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"백그라운드 앱과 관련해 앱 응답 없음 대화상자 표시"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"알림 채널 경고 표시"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"앱에서 유효한 채널 없이 알림을 게시하면 화면에 경고 표시"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"대화 알림에 단축키 적용"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"알림이 대화 섹션에 표시되려면 오래 지속되는 공유 단축키의 지원을 받도록 요구"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"외부에서 앱 강제 허용"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"매니페스트 값과 관계없이 모든 앱이 외부 저장소에 작성되도록 허용"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"활동의 크기가 조정 가능하도록 설정"</string>
@@ -416,7 +420,7 @@
     <string name="daltonizer_mode_deuteranomaly" msgid="3507284319584683963">"녹색약(적녹)"</string>
     <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"적색약(적녹)"</string>
     <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"청색약(청황)"</string>
-    <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"색보정"</string>
+    <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"색상 보정"</string>
     <string name="accessibility_display_daltonizer_preference_subtitle" msgid="1284746051652993443">"색상 보정을 사용하면 기기에 표시되는 색상을 조절할 수 있습니다."</string>
     <string name="daltonizer_type_overridden" msgid="4509604753672535721">"<xliff:g id="TITLE">%1$s</xliff:g> 우선 적용됨"</string>
     <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g>, <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
@@ -428,14 +432,18 @@
     <skip />
     <string name="power_discharge_by_enhanced" msgid="563438403581662942">"사용량(<xliff:g id="LEVEL">%2$s</xliff:g>)을 기준으로 약 <xliff:g id="TIME">%1$s</xliff:g>까지 사용 가능"</string>
     <string name="power_discharge_by_only_enhanced" msgid="3268796172652988877">"사용량을 기준으로 약 <xliff:g id="TIME">%1$s</xliff:g>까지 사용 가능"</string>
-    <string name="power_discharge_by" msgid="4113180890060388350">"약 <xliff:g id="TIME">%1$s</xliff:g>까지 사용 가능(<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_discharge_by_only" msgid="92545648425937000">"약 <xliff:g id="TIME">%1$s</xliff:g>까지 사용 가능"</string>
+    <string name="power_discharge_by" msgid="4113180890060388350">"대략 <xliff:g id="TIME">%1$s</xliff:g>까지 사용 가능(<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+    <string name="power_discharge_by_only" msgid="92545648425937000">"대략 <xliff:g id="TIME">%1$s</xliff:g>까지 사용 가능"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"<xliff:g id="TIME">%1$s</xliff:g>까지"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"예상 배터리 종료 시간: <xliff:g id="TIME">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"<xliff:g id="THRESHOLD">%1$s</xliff:g> 미만 남음"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"<xliff:g id="THRESHOLD">%1$s</xliff:g> 미만 남음(<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> 이상 남음(<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> 이상 남음"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"휴대전화가 곧 종료될 수 있음"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"태블릿이 곧 종료될 수 있음"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"기기가 곧 종료될 수 있음"</string>
@@ -532,7 +540,7 @@
     <string name="user_add_user_message_long" msgid="1527434966294733380">"추가 사용자를 만들어 다른 사용자와 기기를 공유할 수 있습니다. 각 사용자는 앱, 배경화면 등으로 맞춤설정할 수 있는 자신만의 공간을 갖게 됩니다. 또한 모든 사용자에게 영향을 미치는 Wi‑Fi와 같은 기기 설정도 조정할 수 있습니다.\n\n추가된 신규 사용자는 자신의 공간을 설정해야 합니다.\n\n모든 사용자가 앱을 업데이트할 수 있으며, 업데이트는 다른 사용자에게도 적용됩니다. 접근성 설정 및 서비스는 신규 사용자에게 이전되지 않을 수도 있습니다."</string>
     <string name="user_add_user_message_short" msgid="3295959985795716166">"추가된 새로운 사용자는 자신의 공간을 설정해야 합니다.\n\n모든 사용자는 다른 사용자들을 위하여 앱을 업데이트할 수 있습니다."</string>
     <string name="user_setup_dialog_title" msgid="8037342066381939995">"지금 사용자를 설정하시겠습니까?"</string>
-    <string name="user_setup_dialog_message" msgid="269931619868102841">"사용자가 기기에서 자신의 공간을 설정하도록 하세요."</string>
+    <string name="user_setup_dialog_message" msgid="269931619868102841">"사용자가 기기를 사용하여 자신의 공간을 설정할 수 있도록 하세요."</string>
     <string name="user_setup_profile_dialog_message" msgid="4788197052296962620">"지금 프로필을 설정하시겠습니까?"</string>
     <string name="user_setup_button_setup_now" msgid="1708269547187760639">"지금 설정"</string>
     <string name="user_setup_button_setup_later" msgid="8712980133555493516">"나중에"</string>
diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml
index 417e511..66c5c4f 100644
--- a/packages/SettingsLib/res/values-ky/strings.xml
+++ b/packages/SettingsLib/res/values-ky/strings.xml
@@ -37,7 +37,7 @@
     <string name="wifi_no_internet" msgid="1774198889176926299">"Интернетке туташпай турат"</string>
     <string name="saved_network" msgid="7143698034077223645">"<xliff:g id="NAME">%1$s</xliff:g> тарабынан сакталды"</string>
     <string name="connected_via_network_scorer" msgid="7665725527352893558">"%1$s аркылуу автоматтык түрдө туташты"</string>
-    <string name="connected_via_network_scorer_default" msgid="7973529709744526285">"Тармактар рейтингинин автору аркылуу автоматтык түрдө туташты"</string>
+    <string name="connected_via_network_scorer_default" msgid="7973529709744526285">"Тармактар рейтингинин булагы аркылуу автоматтык түрдө туташты"</string>
     <string name="connected_via_passpoint" msgid="7735442932429075684">"%1$s аркылуу жеткиликтүү"</string>
     <string name="connected_via_app" msgid="3532267661404276584">"<xliff:g id="NAME">%1$s</xliff:g> аркылуу туташты"</string>
     <string name="available_via_passpoint" msgid="1716000261192603682">"%1$s аркылуу жеткиликтүү"</string>
@@ -146,7 +146,7 @@
     <string name="tether_settings_title_usb" msgid="3728686573430917722">"USB модем"</string>
     <string name="tether_settings_title_wifi" msgid="4803402057533895526">"Wi-Fi байланыш түйүнү"</string>
     <string name="tether_settings_title_bluetooth" msgid="916519902721399656">"Bluetooth модем"</string>
-    <string name="tether_settings_title_usb_bluetooth" msgid="1727111807207577322">"Жалгаштыруу"</string>
+    <string name="tether_settings_title_usb_bluetooth" msgid="1727111807207577322">"Модем режими"</string>
     <string name="tether_settings_title_all" msgid="8910259483383010470">"Модем режими"</string>
     <string name="managed_user_title" msgid="449081789742645723">"Жумуш профилинин колднмлр"</string>
     <string name="user_guest" msgid="6939192779649870792">"Конок"</string>
@@ -171,7 +171,7 @@
     <string name="tts_engine_security_warning" msgid="3372432853837988146">"Бул кепти синтездөө каражаты бардык айтыла турган текстти, анын ичинде сырсөздөр жана насыя карточкасынын номери сыяктуу жеке маалыматты, топтошу мүмкүн. Ал <xliff:g id="TTS_PLUGIN_ENGINE_NAME">%s</xliff:g> каражатынан алынат. Бул кепти синтездөө каражаты колдонулсунбу?"</string>
     <string name="tts_engine_network_required" msgid="8722087649733906851">"Бул тилде кеп синтезаторун иштетүү үчүн Интернетке туташуу керек."</string>
     <string name="tts_default_sample_string" msgid="6388016028292967973">"Бул айтылганды синтездөөнүн мисалы"</string>
-    <string name="tts_status_title" msgid="8190784181389278640">"Абалкы тилдин абалы"</string>
+    <string name="tts_status_title" msgid="8190784181389278640">"Демейки тилдин абалы"</string>
     <string name="tts_status_ok" msgid="8583076006537547379">"<xliff:g id="LOCALE">%1$s</xliff:g> толук колдоого алынган"</string>
     <string name="tts_status_requires_network" msgid="8327617638884678896">"<xliff:g id="LOCALE">%1$s</xliff:g> желеге туташууну талап кылат"</string>
     <string name="tts_status_not_supported" msgid="2702997696245523743">"<xliff:g id="LOCALE">%1$s</xliff:g> колдоого алынган эмес"</string>
@@ -201,18 +201,18 @@
     <string name="development_settings_summary" msgid="8718917813868735095">"Колдонмо өндүрүү мүмкүнчүлүктөрүн орнотуу"</string>
     <string name="development_settings_not_available" msgid="355070198089140951">"Бул колдонуучуга өнүктүүрүүчү мүмкүнчүлүктөрү берилген эмес."</string>
     <string name="vpn_settings_not_available" msgid="2894137119965668920">"Бул колдонуучу VPN жөндөөлөрүн колдоно албайт"</string>
-    <string name="tethering_settings_not_available" msgid="266821736434699780">"Бул колдонуучу тетеринг жөндөөлөрүн колдоно албайт"</string>
+    <string name="tethering_settings_not_available" msgid="266821736434699780">"Бул колдонуучу модем режиминин жөндөөлөрүн өзгөртө албайт"</string>
     <string name="apn_settings_not_available" msgid="1147111671403342300">"Бул колдонуучу мүмкүндүк алуу түйүнүнүн аталышынын жөндөөлөрүн колдоно албайт"</string>
     <string name="enable_adb" msgid="8072776357237289039">"USB аркылуу мүчүлүштүктөрдү оңдоо"</string>
     <string name="enable_adb_summary" msgid="3711526030096574316">"USB компьютерге сайылганда мүчүлүштүктөрдү оңдоо режими иштейт"</string>
     <string name="clear_adb_keys" msgid="3010148733140369917">"USB аркылуу мүчүлүштүктөрдү оңдоо уруксатын артка кайтаруу"</string>
-    <string name="enable_adb_wireless" msgid="6973226350963971018">"Мүчүлүштүктөрдү зымсыз оңдоо"</string>
+    <string name="enable_adb_wireless" msgid="6973226350963971018">"Мүчүлүштүктөрдү Wi-Fi аркылуу оңдоо"</string>
     <string name="enable_adb_wireless_summary" msgid="7344391423657093011">"Wi‑Fi\'га туташтырылганда мүчүлүштүктөрдү оңдоо режими"</string>
     <string name="adb_wireless_error" msgid="721958772149779856">"Ката"</string>
-    <string name="adb_wireless_settings" msgid="2295017847215680229">"Мүчүлүштүктөрдү зымсыз оңдоо"</string>
-    <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Жеткиликтүү түзмөктөрдү көрүү үчүн мүчүлүштүктөрдү зымсыз оңдоону күйгүзүңүз"</string>
+    <string name="adb_wireless_settings" msgid="2295017847215680229">"Мүчүлүштүктөрдү Wi-Fi аркылуу оңдоо"</string>
+    <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Жеткиликтүү түзмөктөрдү көрүү үчүн мүчүлүштүктөрдү Wi-Fi аркылуу оңдоону күйгүзүңүз"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"QR кодун колдонуп, түзмөктү жупташтырыңыз"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"QR кодунун сканерин колдонуп, жаңы түзмөктөрдү жупташтырыңыз"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"QR кодунун сканерин колдонуп, жаңы түзмөктөрдү жупташтырыңыз"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Жупташтыруучу код менен түзмөктү жупташтырыңыз"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Алты сандан турган кодду колдонуп, жаңы түзмөктөрдү жупташтырыңыз"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"Жупташтырылган түзмөктөр"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Түзмөк жупташтырылган жок. QR коду туура эмес же түзмөк бир тармакка туташпай турат."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"IP дареги жана Оюкча"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"QR кодун скандоо"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"QR кодун скандап, түзмөктү Wi‑Fi аркылуу жупташтырыңыз"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"QR кодун скандап, түзмөктү Wi‑Fi аркылуу жупташтырыңыз"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Wi-Fi тармагына туташыңыз"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, мүчүлүштүктөрдү оңдоо, иштеп чыгуу"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"Ката жөнүндө кабарлоо"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"Зымсыз мониторлорду тастыктамалоо"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"Wi‑Fi дайын-даректүү журналы"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"Wi‑Fi тармактарын издөөнү жөнгө салуу"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"Wi‑Fi иштетилген MAC даректерин башаламан түзүү"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"Мобилдик Интернет иштей берет"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"Модем режиминде аппараттын иштешин тездетүү"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Аталышсыз Bluetooth түзмөктөрү көрсөтүлсүн"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Зымсыз мониторлорду тастыктамалоо параметрлери көрүнүп турат"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Wi-Fi тандалганда ар бир SSID үчүн RSSI көрүнүп турат"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Батареянын коротулушун чектеп, тармактын иштешин жакшыртат"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Бул жөндөөнүн өчүрүлүшү/күйгүзүлүшү MAC даректерин башаламан түзүү тартибине кардар режиминде гана таасирин тийгизет.\nБул режим иштетилсе, MAC даректерин башаламан түзүү иштетилген бардык тармактарда байланышуу учурунда, кардар тармактан акыркы жолу качан ажыратылганына жараша, алардын MAC даректери кайрадан башаламан түзүлүшү мүмкүн. Эгер түзмөк 4 саатка жетпеген убакытта кайра туташтырылса, даректерди башаламан түзүү аракети аткарылбайт."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"Трафик ченелет"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"Чектелбеген тармак"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"Журнал буферинин өлчөмү"</string>
@@ -300,8 +302,8 @@
     <string name="tethering_hardware_offload_summary" msgid="7801345335142803029">"Мүмкүнчүлүккө жараша, модем режиминде аппарат тезирээк иштей баштайт"</string>
     <string name="adb_warning_title" msgid="7708653449506485728">"USB аркылуу жөндөөгө уруксат бересизби?"</string>
     <string name="adb_warning_message" msgid="8145270656419669221">"USB-жөндөө - өндүрүү максатында гана  түзүлгөн. Аны компүтериңиз менен түзмөгүңүздүн ортосунда берилиштерди алмашуу, түзмөгүңүзгө колдонмолорду эскертүүсүз орнотуу жана лог берилиштерин окуу үчүн колдонсоңуз болот."</string>
-    <string name="adbwifi_warning_title" msgid="727104571653031865">"Мүчүлүштүктөрдү зымсыз оңдоого уруксат берилсинби?"</string>
-    <string name="adbwifi_warning_message" msgid="8005936574322702388">"Мүчүлүштүктөрдү зымсыз оңдоо – өндүрүү максатында гана түзүлгөн. Аны компьютериңиз менен түзмөгүңүздүн ортосунда маалыматты алмашуу, колдонмолорду түзмөгүңүзгө эскертүүсүз орнотуу жана маалыматтар таржымалын окуу үчүн колдонсоңуз болот."</string>
+    <string name="adbwifi_warning_title" msgid="727104571653031865">"Мүчүлүштүктөрдү Wi-Fi аркылуу оңдоого уруксат берилсинби?"</string>
+    <string name="adbwifi_warning_message" msgid="8005936574322702388">"Мүчүлүштүктөрдү Wi-Fi аркылуу оңдоо – өндүрүү максатында гана түзүлгөн. Аны компьютериңиз менен түзмөгүңүздүн ортосунда маалыматты алмашуу, колдонмолорду түзмөгүңүзгө эскертүүсүз орнотуу жана маалыматтар таржымалын окуу үчүн колдонсоңуз болот."</string>
     <string name="adb_keys_warning_message" msgid="2968555274488101220">"Сиз мурун USB жөндөөлөрүнө уруксат берген бардык компүтерлердин жеткиси жокко чыгарылсынбы?"</string>
     <string name="dev_settings_warning_title" msgid="8251234890169074553">"Жөндөөлөрдү өзгөртүү"</string>
     <string name="dev_settings_warning_message" msgid="37741686486073668">"Бул орнотуулар өндүрүүчүлөр үчүн гана берилген. Булар түзмөгүңүздүн колдонмолорун бузулушуна же туура эмес иштешине алып келиши мүмкүн."</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"Фондогу колдонмо жооп бербей жатат деп билдирип турат"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Билдирмелер каналынын эскертүүлөрүн көрсөтүү"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Тыюу салынган каналдын колдонмосунун жаңы билдирмелери тууралуу эскертүүлөр көрүнөт"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Жазышуу билдирмелери үчүн ыкчам баскычтарды иштетиңиз"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Жазышуу бөлүмүндө көрсөтүү үчүн билдирмелерди узак убакытка колдонулуучу ыкчам баскычтар менен колдоону талап кылыңыз"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"Тышкы сактагычка сактоого уруксат берүү"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Манифест маанилерине карабастан бардык колдонмолорду тышкы сактагычка сактоого уруксат берет"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"Бир нече терезе режиминде өлчөмдү өзгөртүү"</string>
@@ -428,14 +432,18 @@
     <skip />
     <string name="power_discharge_by_enhanced" msgid="563438403581662942">"Колдонгонуңузга караганда болжол менен <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>) кийин өчөт"</string>
     <string name="power_discharge_by_only_enhanced" msgid="3268796172652988877">"Колдонгонуңузга караганда болжол менен <xliff:g id="TIME">%1$s</xliff:g> кийин өчөт"</string>
-    <string name="power_discharge_by" msgid="4113180890060388350">"Болжол менен <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>) кийин өчөт"</string>
-    <string name="power_discharge_by_only" msgid="92545648425937000">"Болжол менен <xliff:g id="TIME">%1$s</xliff:g> кийин өчөт"</string>
+    <string name="power_discharge_by" msgid="4113180890060388350">"Болжол менен саат <xliff:g id="TIME">%1$s</xliff:g> өчөт, (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+    <string name="power_discharge_by_only" msgid="92545648425937000">"Болжол менен саат <xliff:g id="TIME">%1$s</xliff:g> өчөт"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"<xliff:g id="TIME">%1$s</xliff:g> чейин"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Батарея <xliff:g id="TIME">%1$s</xliff:g> отуруп калышы мүмкүн"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"<xliff:g id="THRESHOLD">%1$s</xliff:g> жетпеген убакыт калды"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"<xliff:g id="THRESHOLD">%1$s</xliff:g> жетпеген убакыт калды (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> ашыгыраак убакыт калды (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> ашыгыраак убакыт калды"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"Телефон бир аздан кийин өчүп калышы мүмкүн"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"Планшет бир аздан кийин өчүп калышы мүмкүн"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"Түзмөк бир аздан кийин өчүп калышы мүмкүн"</string>
@@ -505,7 +513,7 @@
     <string name="zen_mode_duration_settings_title" msgid="1553451650289651489">"Узактыгы"</string>
     <string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Ар дайым суралсын"</string>
     <string name="zen_mode_forever" msgid="3339224497605461291">"Бул функция өчүрүлгөнгө чейин"</string>
-    <string name="time_unit_just_now" msgid="3006134267292728099">"Азыр эле"</string>
+    <string name="time_unit_just_now" msgid="3006134267292728099">"Жаңы эле"</string>
     <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Телефондун динамиги"</string>
     <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Туташууда маселе келип чыкты. Түзмөктү өчүрүп, кайра күйгүзүп көрүңүз"</string>
     <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Зымдуу аудио түзмөк"</string>
@@ -532,7 +540,7 @@
     <string name="user_add_user_message_long" msgid="1527434966294733380">"Эгер түзмөгүңүздү дагы бир адам колдонуп жаткан болсо, кошумча профилдерди түзүп коюңуз. Профилдин ээси аны өзү каалагандай жөндөп, тушкагаздарды коюп, керектүү колдонмолорду орнотуп алат. Мындан тышкары, колдонуучулар түзмөктүн Wi‑Fi´ды өчүрүү/күйгүзүү сыяктуу жалпы жөндөөлөрүн өзгөртө алат.\n\nПрофиль түзүлгөндөн кийин, аны жөндөп алуу керек.\n\nЖалпы колдонмолорду баары жаңырта алат, бирок атайын мүмкүнчүлүктөр өз-өзүнчө жөндөлөт."</string>
     <string name="user_add_user_message_short" msgid="3295959985795716166">"Жаңы колдонуучу кошулганда, ал өз мейкиндигин түзүп алышы керек.\n\nКолдонмолорду бир колдонуучу жаңыртканда, ал калган бардык колдонуучулар үчүн да жаңырат."</string>
     <string name="user_setup_dialog_title" msgid="8037342066381939995">"Профилди жөндөйсүзбү?"</string>
-    <string name="user_setup_dialog_message" msgid="269931619868102841">"Өз мейкиндигин жөндөп алышы үчүн түзмөктү колдонуучуга беришиңиз керек."</string>
+    <string name="user_setup_dialog_message" msgid="269931619868102841">"Өз мейкиндигин жөндөп алышы үчүн, түзмөктү колдонуучуга беришиңиз керек."</string>
     <string name="user_setup_profile_dialog_message" msgid="4788197052296962620">"Профайл азыр түзүлсүнбү?"</string>
     <string name="user_setup_button_setup_now" msgid="1708269547187760639">"Азыр түзүү"</string>
     <string name="user_setup_button_setup_later" msgid="8712980133555493516">"Азыр эмес"</string>
diff --git a/packages/SettingsLib/res/values-lo/strings.xml b/packages/SettingsLib/res/values-lo/strings.xml
index 58c8c39b..f5816b3 100644
--- a/packages/SettingsLib/res/values-lo/strings.xml
+++ b/packages/SettingsLib/res/values-lo/strings.xml
@@ -212,7 +212,7 @@
     <string name="adb_wireless_settings" msgid="2295017847215680229">"ການດີບັກໄຮ້ສາຍ"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"ເພື່ອເບິ່ງ ແລະ ໃຊ້ອຸປະກອນທີ່ມີຢູ່, ກະລຸນາເປີດການດີບັກໄຮ້ສາຍ"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"ຈັບຄູ່ອຸປະກອນດ້ວຍລະຫັດ QR"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"ຈັບຄູ່ອຸປະກອນໃໝ່ໂດຍໃຊ້ຕົວສະແກນລະຫັດ QR"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"ຈັບຄູ່ອຸປະກອນໃໝ່ໂດຍໃຊ້ຕົວສະແກນລະຫັດ QR"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"ຈັບຄູ່ອຸປະກອນໂດຍໃຊ້ລະຫັດການຈັບຄູ່"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"ຈັບຄູ່ອຸປະກອນໃໝ່ໂດຍໃຊ້ລະຫັດຫົກຕົວເລກ"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"ອຸປະກອນທີ່ຈັບຄູ່ແລ້ວ"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"ຈັບຄູ່ອຸປະກອນບໍ່ສຳເລັດ. ລະຫັດ QR ບໍ່ຖືກຕ້ອງ ຫຼື ອຸປະກອນບໍ່ໄດ້ເຊື່ອມຕໍ່ຫາເຄືອຂ່າຍດຽວກັນ."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"ທີ່ຢູ່ IP ແລະ ຜອດ"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"ສະແກນລະຫັດ QR"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"ຈັບຄູ່ອຸປະກອນຜ່ານ Wi‑Fi ໂດຍການສະແກນລະຫັດ QR"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"ຈັບຄູ່ອຸປະກອນຜ່ານ Wi‑Fi ໂດຍການສະແກນລະຫັດ QR"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"ກະ​ລຸ​ນາ​ເຊື່ອມ​ຕໍ່​ກັບ​ເຄືອ​ຂ່າຍ Wi​-Fi"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, debug, dev"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"ທາງ​ລັດລ​າຍງານ​ຂໍ້​ຜິດພາດ"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"ສະແດງການຮັບຮອງຂອງລະບົບໄຮ້ສາຍ"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"​ເປີດ​ນຳ​ໃຊ້ການ​ເກັບ​ປະ​ຫວັດ​ Verbose Wi‑Fi"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"ການຈຳກັດການສະແກນ Wi‑Fi"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"ການສຸ່ມ MAC ສຳລັບ Wi‑Fi ແບບປັບປຸງແລ້ວ"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"ເປີດໃຊ້ອິນເຕີເນັດມືຖືຕະຫຼອດເວລາ"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"ເປີດໃຊ້ການເລັ່ງຄວາມໄວດ້ວຍຮາດແວ"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"ສະແດງອຸປະກອນ Bluetooth ທີ່ບໍ່ມີຊື່"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"ສະແດງໂຕເລືອກສຳລັບການສະແດງການຮັບຮອງລະບົບໄຮ້ສາຍ"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"ເພີ່ມ​ລະ​ດັບ​ການ​ເກັບ​ປະ​ຫວັດ Wi‑Fi, ສະ​ແດງ​ຕໍ່ SSID RSSI ​ໃນ​ Wi‑Fi Picker"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"ຫຼຸດການໃຊ້ແບັດເຕີຣີ ແລະ ປັບປຸງປະສິດທິພາບເຄືອຂ່າຍ"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"ການເປີດ/ປິດນີ້ຈະມີຜົນກັບພຶດຕິກຳການສຸ່ມ MAC ສຳລັບໂໝດລູກຂ່າຍເທົ່ານັ້ນ.\nເມື່ອເປີດໃຊ້ໂໝດນີ້, ເຄືອຂ່າຍໃດກໍຕາມທີ່ເປີດການນຳໃຊ້ການສຸ່ມ MAC ອາດສຸ່ມທີ່ຢູ່ MAC ຂອງເຂົາເຈົ້າຄືນໃໝ່ໃນລະຫວ່າງການເຊື່ອມໂຍງ, ຂຶ້ນກັບວ່າລູກຂ່າຍຕັດການເຊື່ອມຕໍ່ຈາກເຄືອຂ່າຍຫຼ້າສຸດຕອນໃດ. ການສຸ່ມໃໝ່ຈະບໍ່ເກີດຂຶ້ນຫາກອຸປະກອນເຊື່ອມຕໍ່ຄືນໃໝ່ພາຍໃນ 4 ຊົ່ວໂມງ ຫຼື ໜ້ອຍກວ່ານັ້ນ."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"ມີການວັດແທກ"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"ບໍ່ໄດ້ວັດແທກ"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"ຂະໜາດບັບເຟີຕົວບັນທຶກ"</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"ສະແດງກ່ອງຂໍ້ຄວາມບໍ່ຕອບສະໜອງແອັບສຳລັບແອັບພື້ນຫຼັງ"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"ສະແດງຄຳເຕືອນຊ່ອງການແຈ້ງເຕືອນ"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"ສະແດງຄຳເຕືອນໃນໜ້າຈໍເມື່ອແອັບໂພສການແຈ້ງເຕືອນໂດຍບໍ່ມີຊ່ອງທີ່ຖືກຕ້ອງ"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"ບັງຄັບໃຊ້ທາງລັດສຳລັບການແຈ້ງເຕືອນການສົນທະນາ"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"ຕ້ອງໃຊ້ການແຈ້ງເຕືອນເພື່ອຮັບການສະໜັບສະໜຸນໂດຍທາງລັດການແບ່ງປັນທີ່ຢູ່ດົນເພື່ອໃຫ້ປາກົດໃນພາກສ່ວນການສົນທະນາ"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"ບັງຄັບອະນຸຍາດແອັບ​ຢູ່​ພາຍນອກ"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"ເຮັດໃຫ້ທຸກແອັບມີສິດໄດ້ຮັບການຂຽນໃສ່ພື້ນທີ່ຈັດເກັບຂໍ້ມູນພາຍນອກ, ໂດຍບໍ່ຄຳນຶງເຖິງຄ່າ manifest"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"ບັງ​ຄັງ​ໃຫ້​ການ​ເຄື່ອນ​ໄຫວ​ປ່ຽນ​ຂະ​ໜາດ​ໄດ້"</string>
@@ -432,10 +436,14 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"ໜ້າຈະໃຊ້ໄດ້ຈົນຮອດປະມານ <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"ຈົນກວ່າຈະຮອດ <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"ແບັດເຕີຣີອາດຈະໝົດພາຍໃນເວລາ <xliff:g id="TIME">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"ຍັງເຫຼືອໜ້ອຍກວ່າ <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"ຍັງເຫຼືອໜ້ອຍກວ່າ <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"ຍັງເຫຼືອຫຼາຍກວ່າ <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"ຍັງເຫຼືອຫຼາຍກວ່າ <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"ໂທລະສັບອາດປິດໃນໄວໆນີ້"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"ແທັບເລັດອາດປິດໃນໄວໆນີ້"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"ອຸປະກອນອາດປິດໃນໄວໆນີ້"</string>
diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml
index 94800ea..4772124 100644
--- a/packages/SettingsLib/res/values-lt/strings.xml
+++ b/packages/SettingsLib/res/values-lt/strings.xml
@@ -212,7 +212,7 @@
     <string name="adb_wireless_settings" msgid="2295017847215680229">"Belaidžio ryšio derinimas"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Jei norite peržiūrėti ir naudoti pasiekiamus įrenginius, įjunkite belaidžio ryšio derinimą"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Įrenginio susiejimas naudojant QR kodą"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"Susiekite naujus įrenginius naudodami QR kodų skaitytuvą"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"Susiekite naujus įrenginius naudodami QR kodų skaitytuvą"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Įrenginio susiejimas naudojant susiejimo kodą"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Susiekite naujus įrenginius naudodami šešių skaitmenų kodą"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"Susieti įrenginiai"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Nepavyko susieti įrenginio. Netinkamas QR kodas arba įrenginys neprijungtas prie to paties tinklo."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"IP adresas ir prievadas"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"QR kodo nuskaitymas"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"Susiekite įrenginį „Wi‑Fi“ ryšiu nuskaitydami QR kodą"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Susiekite įrenginį „Wi‑Fi“ ryšiu nuskaitydami QR kodą"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Prisijunkite prie „Wi-Fi“ tinklo"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"ADB, derinti, kūrėjas"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"Pranešimo apie riktą spartusis klavišas"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"Belaidžio rodymo sertifikavimas"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"Įgal. „Wi‑Fi“ daugiaž. įraš. į žurnalą"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"„Wi‑Fi“ nuskaitymo ribojimas"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"„Wi‑Fi“ patob. atsit. MAC adr. parink."</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"Mobiliojo ryšio duomenys visada suaktyvinti"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"Įrenginio kaip modemo naudojimo aparatinės įrangos spartinimas"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Rodyti „Bluetooth“ įrenginius be pavadinimų"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Rodyti belaidžio rodymo sertifikavimo parinktis"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Padidinti „Wi‑Fi“ įrašymo į žurnalą lygį, rodyti SSID RSSI „Wi-Fi“ rinkiklyje"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Sumažinamas akumuliatoriaus eikvojimas ir patobulinamas tinklo našumas"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Perjungiamas tik atsitiktinis MAC adreso parinkimas dirbant kliento režimu.\nKai suaktyvintas šis režimas, visuose tinkluose, kuriuose įgalintas atsitiktinis MAC adreso parinkimas, susiejant šie adresai gali būti atsitiktinai parenkami iš naujo, atsižvelgiant į tai, kada klientas paskutinį kartą atsijungė nuo tinklo. Atsitiktinis MAC adreso parinkimas nevykdomas iš naujo, jei įrenginys vėl prisijungia ne daugiau nei po keturių valandų."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"Matuojamas"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"Neišmatuotas"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"Registruotuvo buferio dydžiai"</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"Foninėse programose rodyti dialogo langą „Programa neatsako“"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Rodyti pran. kan. įspėj."</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Ekr. rod. įsp., kai progr. pask. pr. be tink. kan."</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Nustatyti pokalbio pranešimų šaukinius"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Kad pranešimai būtų rodomi pokalbių skiltyje, būtinas ilgalaikis jų bendrinimo šaukinys"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"Priverstinai leisti programas išorinėje atmintin."</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Nustatoma, kad visas programas būtų galima įrašyti į išorinę saugyklą, nepaisant aprašo verčių"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"Priv. nust., kad veiksm. b. g. atl. kelių d. lang."</string>
@@ -432,10 +436,14 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"Turėtų išsikrauti maždaug po <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"Iki <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Akumuliatoriaus energija gali išsekti <xliff:g id="TIME">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"Liko mažiau nei <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"Liko mažiau nei <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"Liko daugiau nei <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"Liko daugiau nei <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"Telefonas netrukus gali būti išjungtas"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"Planšetinis komp. netrukus gali būti išjungtas"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"Įrenginys netrukus gali būti išjungtas"</string>
diff --git a/packages/SettingsLib/res/values-lv/strings.xml b/packages/SettingsLib/res/values-lv/strings.xml
index d7816aa..9b9da06 100644
--- a/packages/SettingsLib/res/values-lv/strings.xml
+++ b/packages/SettingsLib/res/values-lv/strings.xml
@@ -212,7 +212,7 @@
     <string name="adb_wireless_settings" msgid="2295017847215680229">"Bezvadu atkļūdošana"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Lai skatītu un izmantotu pieejamās ierīces, ieslēdziet bezvadu atkļūdošanu."</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Ierīču savienošana pārī, izmantojot QR kodu"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"Savienot pārī jaunas ierīces, izmantojot QR koda skeneri"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"Savienot pārī jaunas ierīces, izmantojot QR koda skeneri"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Ierīču savienošana pārī, izmantojot kodu"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Savienojiet pārī jaunas ierīces, izmantojot sešu ciparu kodu"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"Pārī savienotās ierīces"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Neizdevās izveidot savienojumu pārī ar ierīci. QR kods nebija pareizs, vai ierīcei nebija izveidots savienojums ar to pašu tīklu."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"IP adrese un ports"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"QR koda skenēšana"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"Izveidojiet savienojumu pārī ar ierīci Wi‑Fi tīklā, skenējot QR kodu."</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Izveidojiet savienojumu pārī ar ierīci Wi‑Fi tīklā, skenējot QR kodu."</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Lūdzu, izveidojiet savienojumu ar Wi-Fi tīklu"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, atkļūdošana, izstrādātājiem"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"Kļūdu pārskata saīsne"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"Bezvadu attēlošanas sertifikācija"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"Iespējot Wi‑Fi detalizēto reģistrēšanu"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"Wi‑Fi meklēšanas ierobežošana"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"MAC adrešu nejauša izveide ar Wi-Fi"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"Vienmēr aktīvs mobilo datu savienojums"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"Paātrināta aparatūras darbība piesaistei"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Rādīt Bluetooth ierīces bez nosaukumiem"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Rādīt bezvadu attēlošanas sertifikācijas iespējas"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Palieliniet Wi‑Fi reģistrēšanas līmeni; rādīt katram SSID RSSI Wi‑Fi atlasītājā."</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Samazina akumulatora izlādi un uzlabo tīkla veiktspēju"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Šis slēdzis ietekmē MAC adrešu nejaušas izveides darbību tikai klienta režīmā.\nJa šis režīms ir aktivizēts, visos tīklos, kuros MAC adrešu nejauša izveide ir iespējota, saistīšanas laikā MAC adreses var tikt atkārtoti nejauši izveidotas atkarībā no tā, kad klients pēdējoreiz pārtrauca savienojumu ar tīklu. Atkārtota nejauša izveide netiek veikta, ja ierīces savienojums tiek atjaunots ne vairāk kā 4 stundu laikā."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"Maksas"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"Bezmaksas"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"Reģistrētāja buferu lielumi"</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"Rādīt fona lietotņu dialoglodziņu Lietotne nereaģē"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Paziņojumu kanāla brīdinājumi"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Brīdinājums ekrānā, kad lietotne publicē paziņojumu, nenorādot derīgu kanālu"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Ieviest saīsnes sarunu paziņojumiem"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Pieprasīt izmantot paziņojumiem ilgstošas darbības kopīgošanas saīsni rādīšanai sarunu sadaļā"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"Lietotņu piespiedu atļaušana ārējā krātuvē"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Ļauj jebkuru lietotni ierakstīt ārējā krātuvē neatkarīgi no manifesta vērtības."</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"Pielāgot darbības"</string>
@@ -432,10 +436,14 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"Darbosies aptuveni līdz <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"Līdz <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Iespējams, akumulators izlādēsies līdz <xliff:g id="TIME">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"Atlikušais laiks — mazāk nekā <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"Atlicis mazāk nekā <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"Atlicis vairāk nekā <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"Atlicis vairāk nekā <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"Tālrunis, iespējams, drīz izslēgsies."</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"Planšetdators, iespējams, drīz izslēgsies."</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"Ierīce, iespējams, drīz izslēgsies."</string>
diff --git a/packages/SettingsLib/res/values-mk/strings.xml b/packages/SettingsLib/res/values-mk/strings.xml
index 754c3a0..c272c5a 100644
--- a/packages/SettingsLib/res/values-mk/strings.xml
+++ b/packages/SettingsLib/res/values-mk/strings.xml
@@ -23,7 +23,7 @@
     <string name="wifi_fail_to_scan" msgid="2333336097603822490">"Не може да скенира за мрежи"</string>
     <string name="wifi_security_none" msgid="7392696451280611452">"Ниедна"</string>
     <string name="wifi_remembered" msgid="3266709779723179188">"Зачувано"</string>
-    <string name="wifi_disconnected" msgid="7054450256284661757">"Исклучен"</string>
+    <string name="wifi_disconnected" msgid="7054450256284661757">"Прекината врска"</string>
     <string name="wifi_disabled_generic" msgid="2651916945380294607">"Оневозможено"</string>
     <string name="wifi_disabled_network_failure" msgid="2660396183242399585">"Конфигурирањето ИП не успеа"</string>
     <string name="wifi_disabled_by_recommendation_provider" msgid="1302938248432705534">"Не е поврзано поради нискиот квалитет на мрежата"</string>
@@ -37,7 +37,7 @@
     <string name="wifi_no_internet" msgid="1774198889176926299">"Нема пристап до интернет"</string>
     <string name="saved_network" msgid="7143698034077223645">"Зачувано од <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="connected_via_network_scorer" msgid="7665725527352893558">"Автоматски поврзано преку %1$s"</string>
-    <string name="connected_via_network_scorer_default" msgid="7973529709744526285">"Автоматски поврзано преку оператор за оценување мрежа"</string>
+    <string name="connected_via_network_scorer_default" msgid="7973529709744526285">"Автоматски поврзано преку оценувач на мрежа"</string>
     <string name="connected_via_passpoint" msgid="7735442932429075684">"Поврзано преку %1$s"</string>
     <string name="connected_via_app" msgid="3532267661404276584">"Поврзано преку <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1716000261192603682">"Достапно преку %1$s"</string>
@@ -143,10 +143,10 @@
     <string name="data_usage_uninstalled_apps" msgid="1933665711856171491">"Отстранети апликации"</string>
     <string name="data_usage_uninstalled_apps_users" msgid="5533981546921913295">"Отстранети апликации и корисници"</string>
     <string name="data_usage_ota" msgid="7984667793701597001">"Ажурирања на системот"</string>
-    <string name="tether_settings_title_usb" msgid="3728686573430917722">"Поврзување со USB"</string>
+    <string name="tether_settings_title_usb" msgid="3728686573430917722">"Интернет преку USB"</string>
     <string name="tether_settings_title_wifi" msgid="4803402057533895526">"Преносл. точка на пристап"</string>
-    <string name="tether_settings_title_bluetooth" msgid="916519902721399656">"Поврзување со Bluetooth"</string>
-    <string name="tether_settings_title_usb_bluetooth" msgid="1727111807207577322">"Поврзување"</string>
+    <string name="tether_settings_title_bluetooth" msgid="916519902721399656">"Интернет преку Bluetooth"</string>
+    <string name="tether_settings_title_usb_bluetooth" msgid="1727111807207577322">"Врзување"</string>
     <string name="tether_settings_title_all" msgid="8910259483383010470">"Поврзување и пренослива точка на пристап"</string>
     <string name="managed_user_title" msgid="449081789742645723">"Сите апликации за работа"</string>
     <string name="user_guest" msgid="6939192779649870792">"Гостин"</string>
@@ -161,7 +161,7 @@
     <string name="tts_default_pitch_title" msgid="6988592215554485479">"Интензитет"</string>
     <string name="tts_default_pitch_summary" msgid="9132719475281551884">"Влијае на тонот на синтетизираниот говор"</string>
     <string name="tts_default_lang_title" msgid="4698933575028098940">"Јазик"</string>
-    <string name="tts_lang_use_system" msgid="6312945299804012406">"Користете системски јазик"</string>
+    <string name="tts_lang_use_system" msgid="6312945299804012406">"Користи системски јазик"</string>
     <string name="tts_lang_not_selected" msgid="7927823081096056147">"Јазикот не е избран"</string>
     <string name="tts_default_lang_summary" msgid="9042620014800063470">"Поставува глас специфичен за јазикот за говорниот текст"</string>
     <string name="tts_play_example_title" msgid="1599468547216481684">"Слушни пример"</string>
@@ -212,7 +212,7 @@
     <string name="adb_wireless_settings" msgid="2295017847215680229">"Безжично отстранување грешки"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"За да ги гледате и користите достапните уреди, вклучете го безжичното отстранување грешки"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Спарете уред преку QR-код"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"Спарете нови уреди преку скенер за QR-код"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"Спарете нови уреди преку скенер за QR-код"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Спарете уред преку код за спарување"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Спарете нови уреди преку шестцифрен код"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"Спарени уреди"</string>
@@ -231,8 +231,8 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Уредот не успеа да се спари. Или QR-кодот беше погрешен или уредот не е поврзан на истата мрежа."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"IP-адреса и порта"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"Скенирајте QR-код"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"Спарете го уредот преку Wi‑Fi со скенирање QR-код"</string>
-    <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Поврзете се на Wi-Fi-мрежа"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Спарете го уредот преку Wi‑Fi со скенирање QR-код"</string>
+    <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Поврзете се на Wi-Fi мрежа"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, отстранува грешка, програмер"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"Кратенка за извештај за грешка"</string>
     <string name="bugreport_in_power_summary" msgid="1885529649381831775">"Прикажи копче во менито за вклучување за да се направи извештај за грешка"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"Приказ на сертификација на безжична мрежа"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"Овозможи преопширно пријавување Wi‑Fi"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"Регулирање на скенирањето за Wi‑Fi"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"Рандомизација на MAC подобрена со Wi‑Fi"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"Мобилниот интернет е секогаш активен"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"Хардверско забрзување за врзување"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Прикажувај уреди со Bluetooth без имиња"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Покажи ги опциите за безжичен приказ на сертификат"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Зголеми Wi‑Fi ниво на пријавување, прикажи по SSID RSSI во Wi‑Fi бирач"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Го намалува искористувањето на батеријата и ја подобрува изведбата на мрежата"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Овој прекинувач влијае на однесувањето на рандомизацијата на MAC само за клиентски режим.\nКога е активиран режимов, можно е да се изврши повторна рандомизација на MAC-адресите на сите мрежи што имаат овозможена рандомизација на MAC за време на асоцијацијата, зависно од тоа кога клиентот последен пат се исклучил од мрежата. Повторната рандомизација не се случува ако уредот се поврзе повторно во рок од 4 часа или помалку."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"Со ограничен интернет"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"Без ограничен интернет"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"Величини на меѓумеморија за дневникот"</string>
@@ -301,7 +303,7 @@
     <string name="adb_warning_title" msgid="7708653449506485728">"Овозможи отстранување грешки на USB?"</string>
     <string name="adb_warning_message" msgid="8145270656419669221">"Отстранувањето грешки на USB е наменето само за целите на развој. Користете го за копирање податоци меѓу вашиот компјутер и вашиот уред, за инсталирање апликации на вашиот уред без известување и за читање евиденција на податоци."</string>
     <string name="adbwifi_warning_title" msgid="727104571653031865">"Да се дозволи безжично отстранување грешки?"</string>
-    <string name="adbwifi_warning_message" msgid="8005936574322702388">"Безжичното отстранување грешки е наменето само за развојни цели. Користете го за копирање податоци помеѓу компјутерот и уредот, за инсталирање апликации на уредот без известување и за читање податоци од евиденцијата."</string>
+    <string name="adbwifi_warning_message" msgid="8005936574322702388">"Безжичното отстранување грешки е наменето само за програмирање. Користете го за копирање податоци помеѓу компјутерот и уредот, за инсталирање апликации на уредот без известување и за читање податоци од евиденцијата."</string>
     <string name="adb_keys_warning_message" msgid="2968555274488101220">"Отповикај пристап кон отстранување грешка од USB од сите претходно овластени компјутери?"</string>
     <string name="dev_settings_warning_title" msgid="8251234890169074553">"Дозволи поставки за развој?"</string>
     <string name="dev_settings_warning_message" msgid="37741686486073668">"Овие поставки се наменети само за употреба за развој. Тие може да предизвикаат уредот и апликациите во него да се расипат или да се однесуваат необично."</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"Прикажи го дијалогот „Апликацијата не реагира“ за апликации во заднина"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Прикажи ги предупредувањата на каналот за известувањe"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Предупредува кога апликација дава известување без важечки канал"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Кратенки за известувањата"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Известувања со долготрајна кратенка за споделување"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"Принуд. дозволете апликации на надворешна меморија"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Прави секоја апликација да биде подобна за запишување на надворешна меморија, независно од вредностите на манифестот"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"Принуди ги активностите да ја менуваат големината"</string>
@@ -432,10 +436,14 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"Треба да трае до околу <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"До <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Може да снема батерија до <xliff:g id="TIME">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"Уште помалку од <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"Уште помалку од <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"Уште повеќе од <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"Уште повеќе од <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"Телефон може да се исклучи наскоро"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"Таблетот може да се исклучи наскоро"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"Уредот може да се исклучи наскоро"</string>
@@ -483,7 +491,7 @@
     <string name="ims_reg_title" msgid="8197592958123671062">"Состојба на IMS-регистрација"</string>
     <string name="ims_reg_status_registered" msgid="884916398194885457">"Регистриран"</string>
     <string name="ims_reg_status_not_registered" msgid="2989287366045704694">"Не е регистриран"</string>
-    <string name="status_unavailable" msgid="5279036186589861608">"Недостапен"</string>
+    <string name="status_unavailable" msgid="5279036186589861608">"Недостапно"</string>
     <string name="wifi_status_mac_randomized" msgid="466382542497832189">"MAC-адресата е рандомизирана"</string>
     <plurals name="wifi_tether_connected_summary" formatted="false" msgid="6317236306047306139">
       <item quantity="one">Поврзан е %1$d уред</item>
@@ -529,7 +537,7 @@
     <string name="user_add_user_item_title" msgid="2394272381086965029">"Корисник"</string>
     <string name="user_add_profile_item_title" msgid="3111051717414643029">"Ограничен профил"</string>
     <string name="user_add_user_title" msgid="5457079143694924885">"Да се додаде нов корисник?"</string>
-    <string name="user_add_user_message_long" msgid="1527434966294733380">"Уредов може да го споделувате со други лица преку создавање дополнителни корисници. Секој корисник има сопствен простор што може да го приспособува со апликации, тапети и слично. Корисниците може да приспособуваат и поставки на уредот, како на пр., Wi‑Fi, што се однесуваат на сите.\n\nКога додавате нов корисник, тоа лице треба да го постави својот простор.\n\nСекој корисник може да ажурира апликации за сите други корисници. Поставките и услугите за пристапност не може да се префрлат на новиот корисник."</string>
+    <string name="user_add_user_message_long" msgid="1527434966294733380">"Уредов може да го споделувате со други лица ако додадете дополнителни корисници. Секој корисник има сопствен простор што може да го приспособува со апликации, тапети и слично. Корисниците може да приспособуваат и поставки за уредот, како на пр., Wi‑Fi, што важат за сите.\n\nКога додавате нов корисник, тоа лице треба да го постави својот простор.\n\nСекој корисник може да ажурира апликации за сите други корисници. Поставките и услугите за пристапност не може да се префрлат на новиот корисник."</string>
     <string name="user_add_user_message_short" msgid="3295959985795716166">"Кога додавате нов корисник, тоа лице треба да го постави својот простор.\n\nСекој корисник може да ажурира апликации за сите други корисници."</string>
     <string name="user_setup_dialog_title" msgid="8037342066381939995">"Ќе поставите корисник сега?"</string>
     <string name="user_setup_dialog_message" msgid="269931619868102841">"Проверете дали лицето е достапно да го земе уредот и да го постави својот простор"</string>
diff --git a/packages/SettingsLib/res/values-ml/strings.xml b/packages/SettingsLib/res/values-ml/strings.xml
index c593bee..f61c44c 100644
--- a/packages/SettingsLib/res/values-ml/strings.xml
+++ b/packages/SettingsLib/res/values-ml/strings.xml
@@ -156,7 +156,7 @@
     <string name="launch_defaults_none" msgid="8049374306261262709">"സ്ഥിരമായൊന്നും സജ്ജീകരിച്ചിട്ടില്ല"</string>
     <string name="tts_settings" msgid="8130616705989351312">"ടെക്‌സ്റ്റ്-ടു-സ്‌പീച്ച് ക്രമീകരണങ്ങൾ"</string>
     <string name="tts_settings_title" msgid="7602210956640483039">"ടെക്‌സ്റ്റ്-ടു-സ്‌പീച്ച് ഔട്ട്‌പുട്ട്"</string>
-    <string name="tts_default_rate_title" msgid="3964187817364304022">"വായനാ നിരക്ക്"</string>
+    <string name="tts_default_rate_title" msgid="3964187817364304022">"വായനയുടെ വേഗത"</string>
     <string name="tts_default_rate_summary" msgid="3781937042151716987">"ടെക്സ്റ്റ് ചെയ്യൽ പറയുമ്പോഴുടെക്കുന്ന വേഗത"</string>
     <string name="tts_default_pitch_title" msgid="6988592215554485479">"പിച്ച്"</string>
     <string name="tts_default_pitch_summary" msgid="9132719475281551884">"സിന്തസൈസ് ചെയ്ത സംസാരത്തിന്റെ സ്വരഭേദത്തെ ബാധിക്കുന്നു"</string>
@@ -178,7 +178,7 @@
     <string name="tts_status_checking" msgid="8026559918948285013">"പരിശോധിക്കുന്നു…"</string>
     <string name="tts_engine_settings_title" msgid="7849477533103566291">"<xliff:g id="TTS_ENGINE_NAME">%s</xliff:g> എന്നതിനായുള്ള ക്രമീകരണങ്ങൾ"</string>
     <string name="tts_engine_settings_button" msgid="477155276199968948">"എഞ്ചിൻ ക്രമീകരണങ്ങൾ സമാരംഭിക്കുക"</string>
-    <string name="tts_engine_preference_section_title" msgid="3861562305498624904">"തിരഞ്ഞെടുത്ത എഞ്ചിൻ"</string>
+    <string name="tts_engine_preference_section_title" msgid="3861562305498624904">"മുൻഗണന നൽകുന്ന എഞ്ചിൻ"</string>
     <string name="tts_general_section_title" msgid="8919671529502364567">"പൊതുവായ കാര്യങ്ങൾ"</string>
     <string name="tts_reset_speech_pitch_title" msgid="7149398585468413246">"സംസാരത്തിന്റെ ശബ്ദനില പുനഃക്രമീകരിക്കുക"</string>
     <string name="tts_reset_speech_pitch_summary" msgid="6822904157021406449">"ടെക്‌സ്റ്റ് സംസാരിക്കപ്പെടുന്ന ശബ്ദനില \'ഡിഫോൾട്ടി\'ലേക്ക് പുനഃക്രമീകരിക്കുക."</string>
@@ -194,7 +194,7 @@
     <item msgid="581904787661470707">"ഏറ്റവും വേഗത്തിൽ"</item>
   </string-array>
     <string name="choose_profile" msgid="343803890897657450">"പ്രൊഫൈൽ തിരഞ്ഞെടുക്കുക"</string>
-    <string name="category_personal" msgid="6236798763159385225">"വ്യക്തിഗതം"</string>
+    <string name="category_personal" msgid="6236798763159385225">"വ്യക്തിപരം"</string>
     <string name="category_work" msgid="4014193632325996115">"ഔദ്യോഗികം"</string>
     <string name="development_settings_title" msgid="140296922921597393">"ഡെവലപ്പർ ഓ‌പ്ഷനുകൾ"</string>
     <string name="development_settings_enable" msgid="4285094651288242183">"ഡെവലപ്പർ ഓ‌പ്ഷനുകൾ പ്രവർത്തനക്ഷമമാക്കുക"</string>
@@ -206,13 +206,13 @@
     <string name="enable_adb" msgid="8072776357237289039">"USB ഡീബഗ്ഗിംഗ്"</string>
     <string name="enable_adb_summary" msgid="3711526030096574316">"USB കണ‌ക്റ്റുചെയ്‌തിരിക്കുമ്പോഴുള്ള ഡീബഗ് മോഡ്"</string>
     <string name="clear_adb_keys" msgid="3010148733140369917">"USB ഡീബഗ്ഗിംഗ് അംഗീകാരം പിൻവലിക്കുക"</string>
-    <string name="enable_adb_wireless" msgid="6973226350963971018">"വയർലെസ് ഡീബഗ് ചെയ്യൽ"</string>
+    <string name="enable_adb_wireless" msgid="6973226350963971018">"വയർലെസ് ഡീബഗ്ഗിംഗ്"</string>
     <string name="enable_adb_wireless_summary" msgid="7344391423657093011">"വൈഫൈ കണക്റ്റ് ചെയ്‌തിരിക്കുമ്പോൾ ഡീബഗ് ചെയ്യൽ മോഡിലാക്കുക"</string>
     <string name="adb_wireless_error" msgid="721958772149779856">"പിശക്"</string>
-    <string name="adb_wireless_settings" msgid="2295017847215680229">"വയർലെസ് ഡീബഗ് ചെയ്യൽ"</string>
-    <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"ലഭ്യമായ ഉപകരണങ്ങൾ കാണാനും ഉപയോഗിക്കാനും വയർലെസ് ഡീബഗ് ചെയ്യൽ ഓണാക്കുക"</string>
+    <string name="adb_wireless_settings" msgid="2295017847215680229">"വയർലെസ് ഡീബഗ്ഗിംഗ്"</string>
+    <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"ലഭ്യമായ ഉപകരണങ്ങൾ കാണാനും ഉപയോഗിക്കാനും വയർലെസ് ഡീബഗ്ഗിംഗ് ഓണാക്കുക"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"QR കോഡ് ഉപയോഗിച്ച് ഉപകരണം ജോടിയാക്കുക"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"QR കോഡ് സ്‌കാനർ ഉപയോഗിച്ച് പുതിയ ഉപകരണങ്ങൾ ജോടിയാക്കുക"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"QR കോഡ് സ്‌കാനർ ഉപയോഗിച്ച് പുതിയ ഉപകരണങ്ങൾ ജോടിയാക്കുക"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"ജോടിയാക്കൽ കോഡ് ഉപയോഗിച്ച് ഉപകരണം ജോടിയാക്കുക"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"ആറക്ക കോഡ് ഉപയോഗിച്ച് പുതിയ ഉപകരണങ്ങൾ ജോടിയാക്കുക"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"ജോടിയാക്കിയ ഉപകരണങ്ങൾ"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"ഉപകരണം ജോടിയാക്കാനായില്ല. ഒന്നുകിൽ QR കോഡ് തെറ്റായിരുന്നു അല്ലെങ്കിൽ ഉപകരണം ഒരേ നെറ്റ്‌വർക്കിൽ അല്ല കണക്റ്റ് ചെയ്‌തിട്ടുള്ളത്."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"IP വിലാസവും പോർട്ടും"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"QR കോഡ് സ്‌കാൻ ചെയ്യുക"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"QR കോഡ് സ്‌കാൻ ചെയ്‌ത് വൈഫൈയിലൂടെ ഉപകരണം ജോടിയാക്കുക"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"QR കോഡ് സ്‌കാൻ ചെയ്‌ത് വൈഫൈയിലൂടെ ഉപകരണം ജോടിയാക്കുക"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"ഒരു വൈഫൈ നെറ്റ്‌വർക്കിലേക്ക് കണക്റ്റ് ചെയ്യുക"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, debug, dev"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"ബഗ് റിപ്പോർട്ട് കുറുക്കുവഴി"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"വയർലെസ് ഡിസ്‌പ്ലേ സർട്ടിഫിക്കേഷൻ"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"വൈഫൈ വെർബോസ് ലോഗിംഗ് പ്രവർത്തനക്ഷമമാക്കുക"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"വൈഫൈ സ്‌കാൻ പ്രവർത്തനരഹിതമാക്കുന്നു"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"വൈഫൈ മെച്ചപ്പെടുത്തിയ MAC ക്രമരഹിതമാക്കൽ"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"മൊബൈൽ ഡാറ്റ എല്ലായ്‌പ്പോഴും സജീവം"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"ടെതറിംഗ് ഹാർഡ്‌വെയർ ത്വരിതപ്പെടുത്തൽ"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"പേരില്ലാത്ത Bluetooth ഉപകരണങ്ങൾ കാണിക്കുക"</string>
@@ -277,13 +278,14 @@
     <string name="select_private_dns_configuration_dialog_title" msgid="3731422918335951912">"സ്വകാര്യ DNS മോഡ് തിരഞ്ഞെടുക്കുക"</string>
     <string name="private_dns_mode_off" msgid="7065962499349997041">"ഓഫ്"</string>
     <string name="private_dns_mode_opportunistic" msgid="1947864819060442354">"സ്വയമേവ"</string>
-    <string name="private_dns_mode_provider" msgid="3619040641762557028">"സ്വകാര്യ DNS ദാതാവിന്‍റെ ഹോസ്റ്റുനാമം"</string>
-    <string name="private_dns_mode_provider_hostname_hint" msgid="6564868953748514595">"DNS ദാതാവിന്‍റെ ഹോസ്റ്റുനാമം നൽകുക"</string>
+    <string name="private_dns_mode_provider" msgid="3619040641762557028">"സ്വകാര്യ DNS ദാതാവിന്‍റെ ഹോസ്റ്റ് നാമം"</string>
+    <string name="private_dns_mode_provider_hostname_hint" msgid="6564868953748514595">"DNS ദാതാവിന്‍റെ ഹോസ്റ്റ് നാമം നൽകുക"</string>
     <string name="private_dns_mode_provider_failure" msgid="8356259467861515108">"കണക്റ്റ് ചെയ്യാനായില്ല"</string>
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"വയർലെസ് ഡിസ്‌പ്ലേ സർട്ടിഫിക്കേഷനായി ഓപ്‌ഷനുകൾ ദൃശ്യമാക്കുക"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"വൈഫൈ പിക്കറിൽ ഓരോ SSID RSSI പ്രകാരം കാണിക്കാൻ വൈഫൈ ലോഗിംഗ് നില വർദ്ധിപ്പിക്കുക"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"ബാറ്ററി ചാർജ് വേഗത്തിൽ തീരുന്ന അവസ്ഥ കുറച്ച് നെറ്റ്‌വർക്ക് പ്രകടനം മെച്ചപ്പെടുത്തുന്നു"</string>
-    <string name="wifi_metered_label" msgid="8737187690304098638">"മീറ്റർചെയ്ത"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"ഈ മാറ്റം ക്ലയന്റ് മോഡിലെ MAC ക്രമരഹിതമാക്കൽ പ്രവർത്തനരീതിയെ മാത്രമേ ബാധിക്കുകയുള്ളൂ.\nഈ മോഡ് സജീവമാക്കിക്കഴിഞ്ഞാൽ, MAC ക്രമരഹിതമാക്കൽ പ്രവർത്തനക്ഷമമാക്കിയിരിക്കുന്ന എല്ലാ നെറ്റ്‌വർക്കുകളിലും അസോസിയേഷൻ സമയത്ത്, ക്ലയന്റ് അവസാനമായി നെറ്റ്‌വർക്കിൽ നിന്ന് വിച്‌ഛേദിച്ച സമയത്തിന്റെ അടിസ്ഥാനത്തിൽ അവരുടെ MAC വിലാസങ്ങൾ വീണ്ടും ക്രമരഹിതമാക്കപ്പെടും. നാല് മണിക്കൂറോ അതിൽ കുറവ് സമയത്തിനുള്ളിലോ ഉപകരണം വീണ്ടും കണക്‌റ്റ് ചെയ്യുന്നില്ലെങ്കിൽ വീണ്ടും ക്രമരഹിതമാക്കൽ സംഭവിക്കില്ല."</string>
+    <string name="wifi_metered_label" msgid="8737187690304098638">"മീറ്റർ ചെയ്തത്"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"മീറ്റർമാപകമല്ലാത്തത്"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"ലോഗർ ബഫർ വലുപ്പം"</string>
     <string name="select_logd_size_dialog_title" msgid="2105401994681013578">"ഓരോ ലോഗ് ബഫറിനും വലുപ്പം തിരഞ്ഞെടുക്കൂ"</string>
@@ -300,8 +302,8 @@
     <string name="tethering_hardware_offload_summary" msgid="7801345335142803029">"ലഭ്യമാണെങ്കിൽ \'ടെതറിംഗ് ഹാർഡ്‌വെയർ ത്വരിതപ്പെടുത്തൽ\' ഉപയോഗിക്കുക"</string>
     <string name="adb_warning_title" msgid="7708653449506485728">"USB ഡീബഗ്ഗുചെയ്യാൻ അനുവദിക്കണോ?"</string>
     <string name="adb_warning_message" msgid="8145270656419669221">"USB ഡീബഗ്ഗിംഗ് വികസന ആവശ്യകതകൾക്ക് മാത്രമുള്ളതാണ്. നിങ്ങളുടെ കമ്പ്യൂട്ടറിനും ഉപകരണത്തിനുമിടയിൽ ഡാറ്റ പകർത്തുന്നതിനും അറിയിപ്പില്ലാതെ തന്നെ നിങ്ങളുടെ ഉപകരണത്തിൽ അപ്ലിക്കേഷനുകൾ ഇൻസ്‌റ്റാളുചെയ്യുന്നതിനും ലോഗ് ഡാറ്റ റീഡുചെയ്യുന്നതിനും ഇത് ഉപയോഗിക്കുക."</string>
-    <string name="adbwifi_warning_title" msgid="727104571653031865">"വയർലെസ് ഡീബഗ് ചെയ്യൽ അനുവദിക്കണോ?"</string>
-    <string name="adbwifi_warning_message" msgid="8005936574322702388">"വയർലെസ് ഡീബഗ് ചെയ്യൽ ഡെവലപ്മെന്റ് ആവശ്യങ്ങൾക്ക് മാത്രമുള്ളതാണ്. നിങ്ങളുടെ കമ്പ്യൂട്ടറിൽ നിന്ന് ഉപകരണത്തിലേക്കും തിരിച്ചും ഡാറ്റ പകർത്തുന്നതിനും ലോഗ് ഡാറ്റ റീഡ് ചെയ്യുന്നതിനും അറിയിപ്പില്ലാതെ നിങ്ങളുടെ ഉപകരണത്തിൽ ആപ്പുകൾ ഇൻസ്റ്റാൾ ചെയ്യുന്നതിനും ഇത് ഉപയോഗിക്കുക."</string>
+    <string name="adbwifi_warning_title" msgid="727104571653031865">"വയർലെസ് ഡീബഗ്ഗിംഗ് അനുവദിക്കണോ?"</string>
+    <string name="adbwifi_warning_message" msgid="8005936574322702388">"വയർലെസ് ഡീബഗ്ഗിംഗ് ഡെവലപ്മെന്റ് ആവശ്യങ്ങൾക്ക് മാത്രമുള്ളതാണ്. നിങ്ങളുടെ കമ്പ്യൂട്ടറിൽ നിന്ന് ഉപകരണത്തിലേക്കും തിരിച്ചും ഡാറ്റ പകർത്തുന്നതിനും അറിയിപ്പില്ലാതെ തന്നെ നിങ്ങളുടെ ഉപകരണത്തിൽ ആപ്പുകൾ ഇൻസ്റ്റാൾ ചെയ്യുന്നതിനും ലോഗ് ഡാറ്റ റീഡ് ചെയ്യുന്നതിനും ഇത് ഉപയോഗിക്കുക."</string>
     <string name="adb_keys_warning_message" msgid="2968555274488101220">"നിങ്ങൾ മുമ്പ് അംഗീകരിച്ച എല്ലാ കമ്പ്യൂട്ടറുകളിൽ നിന്നും USB ഡീബഗ്ഗുചെയ്യുന്നതിനുള്ള ആക്‌സസ്സ് പിൻവലിക്കണോ?"</string>
     <string name="dev_settings_warning_title" msgid="8251234890169074553">"വികസന ക്രമീകരണങ്ങൾ അനുവദിക്കണോ?"</string>
     <string name="dev_settings_warning_message" msgid="37741686486073668">"ഈ ക്രമീകരണങ്ങൾ വികസന ഉപയോഗത്തിന് മാത്രമായുള്ളതാണ്. അവ നിങ്ങളുടെ ഉപകരണവും അതിലെ അപ്ലിക്കേഷനുകളും തകരാറിലാക്കുന്നതിനോ തെറ്റായി പ്രവർത്തിക്കുന്നതിനോ ഇടയാക്കാം."</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"പ‌ശ്ചാത്തല ആപ്പുകൾക്കായി \'ആപ്പ് പ്രതികരിക്കുന്നില്ല\' ഡയലോഗ് പ്രദര്‍ശിപ്പിക്കുക"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"ചാനൽ മുന്നറിയിപ്പ് കാണിക്കൂ"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"സാധുതയുള്ള ചാനലിൽ അല്ലാതെ ഒരു ആപ്പ്, അറിയിപ്പ് പോസ്റ്റ് ചെയ്യുമ്പോൾ ഓൺ-സ്‌ക്രീൻ മുന്നറിയിപ്പ് ‌പ്രദർശിപ്പിക്കുന്നു"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"സംഭാഷണ അറിയിപ്പിലേക്ക് കുറുക്കുവഴികൾ നടപ്പിലാക്കൂ"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"സംഭാഷണ വിഭാഗത്തിൽ ദൃശ്യമാകാൻ അറിയിപ്പുകൾ ദീർഘകാലമായി പങ്കിടൽ കുറുക്കുവഴി പിന്തുടരണം"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"ബാഹ്യമായതിൽ നിർബന്ധിച്ച് അനുവദിക്കുക"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"മാനിഫെസ്റ്റ് മൂല്യങ്ങൾ പരിഗണിക്കാതെ, ബാഹ്യ സ്റ്റോറേജിലേക്ക് എഴുതപ്പെടുന്നതിന് ഏതൊരു ആപ്പിനെയും യോഗ്യമാക്കുന്നു"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"വലുപ്പം മാറ്റാൻ പ്രവർത്തനങ്ങളെ നിർബന്ധിക്കുക"</string>
@@ -416,8 +420,8 @@
     <string name="daltonizer_mode_deuteranomaly" msgid="3507284319584683963">"വർണ്ണാന്ധത (ചുവപ്പ്-പച്ച‌)"</string>
     <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"പ്രോട്ടാനോമലി (ചുവപ്പ്-പച്ച)"</string>
     <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"ട്രിട്ടാനോമലി (നീല-മഞ്ഞ)"</string>
-    <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"വർണ്ണം ക്രമീകരിക്കൽ"</string>
-    <string name="accessibility_display_daltonizer_preference_subtitle" msgid="1284746051652993443">"നിങ്ങളുടെ ഉപകരണത്തിൽ നിറങ്ങൾ എങ്ങനെ പ്രദർശിപ്പിക്കുന്നു എന്നത് ക്രമീകരിക്കാൻ നിറം തിരുത്തൽ അനുവദിക്കുന്നു"</string>
+    <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"നിറം ക്രമീകരിക്കൽ"</string>
+    <string name="accessibility_display_daltonizer_preference_subtitle" msgid="1284746051652993443">"നിങ്ങളുടെ ഉപകരണത്തിൽ നിറങ്ങൾ എങ്ങനെ പ്രദർശിപ്പിക്കുന്നു എന്നത് ക്രമീകരിക്കാൻ \'നിറം ക്രമീകരിക്കൽ\' അനുവദിക്കുന്നു"</string>
     <string name="daltonizer_type_overridden" msgid="4509604753672535721">"<xliff:g id="TITLE">%1$s</xliff:g> ഉപയോഗിച്ച് അസാധുവാക്കി"</string>
     <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
     <string name="power_remaining_duration_only" msgid="8264199158671531431">"ഏതാണ്ട് <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ശേഷിക്കുന്നു"</string>
@@ -432,10 +436,14 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"ഏകദേശം <xliff:g id="TIME">%1$s</xliff:g> വരെ നീണ്ടുനിൽക്കേണ്ടതാണ്"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"<xliff:g id="TIME">%1$s</xliff:g> വരെ"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"<xliff:g id="TIME">%1$s</xliff:g> ആവുമ്പോഴേക്ക് ബാറ്ററി തീർന്നേക്കാം"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"<xliff:g id="THRESHOLD">%1$s</xliff:g>-ൽ കുറവ് സമയം ശേഷിക്കുന്നു"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"<xliff:g id="THRESHOLD">%1$s</xliff:g>-ൽ കുറവ് സമയം ശേഷിക്കുന്നു (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g>-ൽ കൂടുതൽ സമയം ശേഷിക്കുന്നു (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g>-ൽ കൂടുതൽ സമയം ശേഷിക്കുന്നു"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"ഫോൺ ഉടൻ ഷട്ട് ഡൗൺ ആയേക്കാം"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"ടാബ്‌ലെറ്റ് ഉടൻ ഷട്ട് ഡൗൺ ആയേക്കാം"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"ഉപകരണം ഉടൻ ഷട്ട് ഡൗൺ ആയേക്കാം"</string>
@@ -529,7 +537,7 @@
     <string name="user_add_user_item_title" msgid="2394272381086965029">"ഉപയോക്താവ്"</string>
     <string name="user_add_profile_item_title" msgid="3111051717414643029">"നിയന്ത്രിത പ്രൊഫൈൽ"</string>
     <string name="user_add_user_title" msgid="5457079143694924885">"പുതിയ ഉപയോക്താവിനെ ചേർക്കണോ?"</string>
-    <string name="user_add_user_message_long" msgid="1527434966294733380">"കൂടുതൽ ഉപയോക്താക്കളെ സൃഷ്‌ടിച്ചുകൊണ്ട് ഈ ഉപകരണം മറ്റുള്ളവരുമായി നിങ്ങൾക്ക് പങ്കിടാം. ആപ്പുകളും വാൾപേപ്പറുകളും മറ്റും ഉപയോഗിച്ച് ഇഷ്‌ടാനുസൃതമാക്കാൻ ഓരോ ഉപയോക്താവിനും സാധിക്കും. വൈഫൈ പോലെ എല്ലാവരെയും ബാധിക്കുന്ന ഉപകരണ ക്രമീകരണവും ഉപയോക്താക്കൾക്ക് ക്രമീകരിക്കാം.\n\nനിങ്ങളൊരു പുതിയ ഉപയോക്താവിനെ ചേർക്കുമ്പോൾ, ആ വ്യക്തിക്ക് സ്വന്തമായ ഇടം സജ്ജീകരിക്കേണ്ടതുണ്ട്.\n\n എല്ലാ ഉപയോക്താക്കൾക്കുമായി ആപ്പുകൾ അപ്‌ഡേറ്റ് ചെയ്യാൻ ഏതൊരു ഉപയോക്താവിനുമാവും. ഉപയോഗസഹായി ക്രമീകരണവും സേവനങ്ങളും പുതിയ ഉപയോക്താവിന് കൈമാറിയേക്കില്ല."</string>
+    <string name="user_add_user_message_long" msgid="1527434966294733380">"കൂടുതൽ ഉപയോക്താക്കളെ സൃഷ്‌ടിച്ചുകൊണ്ട് ഈ ഉപകരണം മറ്റുള്ളവരുമായി നിങ്ങൾക്ക് പങ്കിടാം. ആപ്പുകളും വാൾപേപ്പറുകളും മറ്റും ഉപയോഗിച്ച് ഇഷ്‌ടാനുസൃതമാക്കാൻ ഓരോ ഉപയോക്താവിനും സാധിക്കും. വൈഫൈ പോലെ എല്ലാവരെയും ബാധിക്കുന്ന ഉപകരണ ക്രമീകരണവും ഉപയോക്താക്കൾക്ക് ക്രമീകരിക്കാം.\n\nനിങ്ങളൊരു പുതിയ ഉപയോക്താവിനെ ചേർക്കുമ്പോൾ, ആ വ്യക്തിക്ക് സ്വന്തമായ ഇടം സജ്ജീകരിക്കേണ്ടതുണ്ട്.\n\n എല്ലാ ഉപയോക്താക്കൾക്കുമായി ആപ്പുകൾ അപ്‌ഡേറ്റ് ചെയ്യാൻ ഏതൊരു ഉപയോക്താവിനുമാവും. ഉപയോഗസഹായി ക്രമീകരണവും സേവനങ്ങളും പുതിയ ഉപയോക്താവിന് കൈമാറുകയില്ല."</string>
     <string name="user_add_user_message_short" msgid="3295959985795716166">"നിങ്ങൾ ഒരു പുതിയ ഉപയോക്താവിനെ ചേർക്കുമ്പോൾ, ആ വ്യക്തിയ്‌ക്ക് അവരുടെ ഇടം സജ്ജീകരിക്കേണ്ടതുണ്ട്.\n\nമറ്റ് എല്ലാ ഉപയോക്താക്കൾക്കുമായി ഏതൊരു ഉപയോക്താവിനും അപ്ലിക്കേഷനുകൾ അപ്‌ഡേറ്റുചെയ്യാനാവും."</string>
     <string name="user_setup_dialog_title" msgid="8037342066381939995">"ഉപയോക്താവിനെ ഇപ്പോൾ സജ്ജീകരിക്കണോ?"</string>
     <string name="user_setup_dialog_message" msgid="269931619868102841">"ഉപകരണം എടുത്ത് ഇടം സജ്ജീകരിക്കുന്നതിന് വ്യക്തി ലഭ്യമാണെന്ന് ഉറപ്പാക്കുക"</string>
diff --git a/packages/SettingsLib/res/values-mn/strings.xml b/packages/SettingsLib/res/values-mn/strings.xml
index d3e41f7..3380645 100644
--- a/packages/SettingsLib/res/values-mn/strings.xml
+++ b/packages/SettingsLib/res/values-mn/strings.xml
@@ -206,13 +206,13 @@
     <string name="enable_adb" msgid="8072776357237289039">"USB дебаг"</string>
     <string name="enable_adb_summary" msgid="3711526030096574316">"USB холбодсон үеийн согог засах горим"</string>
     <string name="clear_adb_keys" msgid="3010148733140369917">"USB дебагын зөвшөөрлийг хураах"</string>
-    <string name="enable_adb_wireless" msgid="6973226350963971018">"Утасгүй алдаа засах"</string>
+    <string name="enable_adb_wireless" msgid="6973226350963971018">"Wireless debugging"</string>
     <string name="enable_adb_wireless_summary" msgid="7344391423657093011">"Wi-Fi холбогдсон үед дебаг хийх горим"</string>
     <string name="adb_wireless_error" msgid="721958772149779856">"Алдаа"</string>
-    <string name="adb_wireless_settings" msgid="2295017847215680229">"Утасгүй алдаа засах"</string>
-    <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Боломжтой төхөөрөмжүүдийг харах болох ашиглахын тулд утасгүй алдаа засахыг асаана уу"</string>
+    <string name="adb_wireless_settings" msgid="2295017847215680229">"Wireless debugging"</string>
+    <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Боломжтой төхөөрөмжүүдийг харах болох ашиглахын тулд wireless debugging-г асаана уу"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Хурдан хариу үйлдлийн кодоор төхөөрөмжийг хослуул"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"Хурдан хариу үйлдлийн кодын сканнерыг ашиглан шинэ төхөөрөмжүүдийг хослуулна уу"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"Хурдан хариу үйлдлийн кодын сканнер ашиглан шинэ төхөөрөмжүүдийг хослуулна уу"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Хослуулах кодоор төхөөрөмжийг хослуулна уу"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Зургаан оронтой кодыг ашиглан шинэ төхөөрөмжүүдийг хослуулна уу"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"Хослуулсан төхөөрөмжүүд"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Төхөөрөмжийг хослуулж чадсангүй. Хурдан хариу үйлдлийн код буруу эсвэл төхөөрөмжийг ижил сүлжээнд холбоогүй байна."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"IP хаяг ба порт"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"Хурдан хариу үйлдлийн кодыг скан хийх"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"Хурдан хариу үйлдлийн кодыг скан хийж Wi-Fi-р төхөөрөмжийг хослуулна уу"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Хурдан хариу үйлдлийн кодыг скан хийж Wi-Fi-р төхөөрөмжийг хослуулна уу"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Wi-Fi сүлжээнд холбогдоно уу"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, дебаг хийх, dev"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"Алдаа мэдээлэх товчлол"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"Утасгүй дэлгэцийн сертификат"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"Wi‑Fi дэлгэрэнгүй лог-г идэвхжүүлэх"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"Wi‑Fi скан бууруулалт"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"MAC-г санамсаргүй байдлаар Wi‑Fi‑н сайжруулалттай эмхлэх"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"Мобайл дата байнга идэвхтэй"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"Модем болгох техник хангамжийн хурдасгуур"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Нэргүй Bluetooth төхөөрөмжийг харуулах"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Утасгүй дэлгэцийн сертификатын сонголтыг харуулах"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Wi‑Fi лог-н түвшинг нэмэгдүүлэх, Wi‑Fi Сонгогч дээрх SSID-д ногдох RSSI-г харуулах"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Батарей зарцуулалтыг бууруулж, сүлжээний гүйцэтгэлийг сайжруулдаг"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Унтраах эсвэл асаах нь зөвхөн клиент горимын MAC-г санамсаргүй байдлаар эмхлэх төлөвт нөлөөлнө.\nЭнэ горимыг идэвхжүүлсэн тохиолдолд клиентийг сүлжээнээс хамгийн сүүлд хэзээ салгаснаас хамаараад, холбоотой байх үеэр MAC-г санамсаргүй байдлаар эмхлэхийг идэвхжүүлсэн дурын сүлжээний MAC хаягуудыг санамсаргүй байдлаар дахин эмхэлж болзошгүй. Төхөөрөмж 4 цаг буюу түүнээс бага хугацаанд дахин холбогдвол санамсаргүй байдлаар дахин эмхлэх төлөв хэрэгжихгүй."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"Хязгаартай"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"Хязгааргүй"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"Логгерын буферын хэмжээ"</string>
@@ -300,8 +302,8 @@
     <string name="tethering_hardware_offload_summary" msgid="7801345335142803029">"Модем болгох техник хангамжийн хурдасгуурыг боломжтой тохиолдолд ашиглах"</string>
     <string name="adb_warning_title" msgid="7708653449506485728">"USB дебаг хийхийг зөвшөөрөх үү?"</string>
     <string name="adb_warning_message" msgid="8145270656419669221">"USB дебаг нь зөвхөн хөгжүүлэлтийн зорилготой. Үүнийг өөрийн компьютер болон төхөөрөмжийн хооронд өгөгдөл хуулах, өөрийн төхөөрөмж дээр мэдэгдэлгүйгээр аппликейшн суулгах, лог датаг унших зэрэгт ашиглаж болно."</string>
-    <string name="adbwifi_warning_title" msgid="727104571653031865">"Утасгүй алдаа засахыг зөвшөөрөх үү?"</string>
-    <string name="adbwifi_warning_message" msgid="8005936574322702388">"Утасгүй алдаа засах нь зөвхөн хөгжүүлэлтийн зориулалттай. Үүнийг компьютер болон төхөөрөмж хооронд өгөгдөл хуулах, төхөөрөмждөө мэдэгдэлгүйгээр аппууд суулгах болон лог өгөгдлийг унших зэрэгт ашиглана уу."</string>
+    <string name="adbwifi_warning_title" msgid="727104571653031865">"Wireless debugging-г зөвшөөрөх үү?"</string>
+    <string name="adbwifi_warning_message" msgid="8005936574322702388">"Wireless debugging нь зөвхөн хөгжүүлэлтийн зориулалттай. Үүнийг компьютер болон төхөөрөмж хооронд өгөгдөл хуулах, төхөөрөмждөө мэдэгдэлгүйгээр аппууд суулгах болон лог өгөгдлийг унших зэрэгт ашиглана уу."</string>
     <string name="adb_keys_warning_message" msgid="2968555274488101220">"Таны өмнө нь зөвшөөрөл өгсөн бүх компьютерээс USB дебаг хандалтыг нь хураах уу?"</string>
     <string name="dev_settings_warning_title" msgid="8251234890169074553">"Хөгжлийн тохиргоог зөвшөөрөх үү?"</string>
     <string name="dev_settings_warning_message" msgid="37741686486073668">"Эдгээр тохиргоо нь зөвхөн хөгжүүлэлтэд ашиглах зорилготой. Эдгээр нь таны төхөөрөмж буюу түүн дээрх аппликейшнүүдийг эвдрэх, буруу ажиллах шалтгаан нь болж болно."</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"Апп хариу өгөхгүй байна гэсэн харилцах цонхыг цаана байгаа аппад харуулах"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Мэдэгдлийн сувгийн анхааруулгыг харуулах"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Апп хүчинтэй суваггүйгээр мэдэгдэл гаргах үед дэлгэцэд сануулга харуулна"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Харилцан ярианы мэдэгдлийн товчлолыг хэрэгжүүлэх"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Харилцан ярианы хэсэгт харуулахын тулд санах ойд хадгалсан хуваалцах товчлолоор мэдэгдлийг нөөцлөхийг шаардах"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"Аппыг гадаад санах ойд хадгалахыг зөвшөөрөх"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Манифест утгыг нь үл хамааран дурын апп-г гадаад санах ойд бичих боломжтой болгодог"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"Үйл ажиллагааны хэмжээг өөрчилж болохуйц болгох"</string>
@@ -432,10 +436,14 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"Ойролцоогоор <xliff:g id="TIME">%1$s</xliff:g> хүртэл барих ёстой"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"<xliff:g id="TIME">%1$s</xliff:g> хүртэл"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Батарейн цэнэг <xliff:g id="TIME">%1$s</xliff:g> гээд дуусаж болзошгүй"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"<xliff:g id="THRESHOLD">%1$s</xliff:g>-с бага хугацаа үлдсэн"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"<xliff:g id="THRESHOLD">%1$s</xliff:g>-с бага хугацаа үлдсэн (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g>-с их хугацаа үлдсэн (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g>-с их хугацаа үлдсэн"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"Утас удахгүй унтарч болзошгүй"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"Таблет удахгүй унтарч болзошгүй"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"Төхөөрөмж удахгүй унтарч болзошгүй"</string>
diff --git a/packages/SettingsLib/res/values-mr/strings.xml b/packages/SettingsLib/res/values-mr/strings.xml
index c222bd3..8862de0 100644
--- a/packages/SettingsLib/res/values-mr/strings.xml
+++ b/packages/SettingsLib/res/values-mr/strings.xml
@@ -93,7 +93,7 @@
     <string name="bluetooth_profile_sap" msgid="8304170950447934386">"सिम अ‍ॅक्सेस"</string>
     <string name="bluetooth_profile_a2dp_high_quality" msgid="4739440941324792775">"HD ऑडिओ: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
     <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="2477639096903834374">"HD ऑडिओ"</string>
-    <string name="bluetooth_profile_hearing_aid" msgid="58154575573984914">"श्रवण यंत्रे"</string>
+    <string name="bluetooth_profile_hearing_aid" msgid="58154575573984914">"श्रवणयंत्रे"</string>
     <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="8191273236809964030">"श्रवण यंत्रांशी कनेक्ट केले आहे"</string>
     <string name="bluetooth_a2dp_profile_summary_connected" msgid="7422607970115444153">"मीडिया ऑडिओवर कनेक्ट केले"</string>
     <string name="bluetooth_headset_profile_summary_connected" msgid="2420981566026949688">"फोन ऑडिओ वर कनेक्ट केले"</string>
@@ -127,16 +127,16 @@
     <string name="bluetooth_talkback_headphone" msgid="8613073829180337091">"हेडफोन"</string>
     <string name="bluetooth_talkback_input_peripheral" msgid="5133944817800149942">"इनपुट परिधीय"</string>
     <string name="bluetooth_talkback_bluetooth" msgid="1143241359781999989">"ब्लूटूथ"</string>
-    <string name="bluetooth_hearingaid_left_pairing_message" msgid="8561855779703533591">"डावीकडील श्रवण यंत्र जोडत आहे…"</string>
-    <string name="bluetooth_hearingaid_right_pairing_message" msgid="2655347721696331048">"उजवीकडील श्रवण यंत्र जोडत आहे…"</string>
+    <string name="bluetooth_hearingaid_left_pairing_message" msgid="8561855779703533591">"डावीकडील श्रवणयंत्र जोडत आहे…"</string>
+    <string name="bluetooth_hearingaid_right_pairing_message" msgid="2655347721696331048">"उजवीकडील श्रवणयंत्र जोडत आहे…"</string>
     <string name="bluetooth_hearingaid_left_battery_level" msgid="7375621694748104876">"डावी - <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> बॅटरी"</string>
     <string name="bluetooth_hearingaid_right_battery_level" msgid="1850094448499089312">"उजवी - <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> बॅटरी"</string>
-    <string name="accessibility_wifi_off" msgid="1195445715254137155">"वाय फाय बंद."</string>
-    <string name="accessibility_no_wifi" msgid="5297119459491085771">"वाय फाय डिस्कनेक्ट झाले."</string>
-    <string name="accessibility_wifi_one_bar" msgid="6025652717281815212">"वाय फाय एक बार."</string>
-    <string name="accessibility_wifi_two_bars" msgid="687800024970972270">"वाय फाय दोन बार."</string>
-    <string name="accessibility_wifi_three_bars" msgid="779895671061950234">"वाय फाय तीन बार."</string>
-    <string name="accessibility_wifi_signal_full" msgid="7165262794551355617">"वाय फाय सिग्नल संपूर्ण आहे."</string>
+    <string name="accessibility_wifi_off" msgid="1195445715254137155">"वाय-फाय बंद."</string>
+    <string name="accessibility_no_wifi" msgid="5297119459491085771">"वाय-फाय डिस्कनेक्ट झाले."</string>
+    <string name="accessibility_wifi_one_bar" msgid="6025652717281815212">"वाय-फाय एक बार."</string>
+    <string name="accessibility_wifi_two_bars" msgid="687800024970972270">"वाय-फाय दोन बार."</string>
+    <string name="accessibility_wifi_three_bars" msgid="779895671061950234">"वाय-फाय तीन बार."</string>
+    <string name="accessibility_wifi_signal_full" msgid="7165262794551355617">"वाय-फाय सिग्नल संपूर्ण आहे."</string>
     <string name="accessibility_wifi_security_type_none" msgid="162352241518066966">"नेटवर्क उघडा"</string>
     <string name="accessibility_wifi_security_type_secured" msgid="2399774097343238942">"सुरक्षित नेटवर्क"</string>
     <string name="process_kernel_label" msgid="950292573930336765">"Android OS"</string>
@@ -156,7 +156,7 @@
     <string name="launch_defaults_none" msgid="8049374306261262709">"कोणतेही डीफॉल्ट सेट केले नाही"</string>
     <string name="tts_settings" msgid="8130616705989351312">"टेक्स्ट-टू-स्पीच सेटिंग्ज"</string>
     <string name="tts_settings_title" msgid="7602210956640483039">"टेक्स्ट-टू-स्पीच आउटपुट"</string>
-    <string name="tts_default_rate_title" msgid="3964187817364304022">"बोलण्याचा रेट"</string>
+    <string name="tts_default_rate_title" msgid="3964187817364304022">"स्पीच रेट"</string>
     <string name="tts_default_rate_summary" msgid="3781937042151716987">"ज्या गतीने मजकूर बोलला जातो ती"</string>
     <string name="tts_default_pitch_title" msgid="6988592215554485479">"पिच"</string>
     <string name="tts_default_pitch_summary" msgid="9132719475281551884">"संश्लेषित उच्चारांच्या आवाजास प्रभावित करते"</string>
@@ -212,7 +212,7 @@
     <string name="adb_wireless_settings" msgid="2295017847215680229">"वायरलेस डीबगिंग"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"उपलब्ध डिव्हाइस पाहण्यासाठी आणि वापरण्यासाठी वायरलेस डीबगिंग सुरू करा"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"QR कोडसह डिव्हाइस जोडा"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"QR कोड स्कॅनर वापरून नवीन डिव्हाइस जोडा"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"QR कोड स्कॅनर वापरून नवीन डिव्हाइस पेअर करा"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"पेअरींग कोडसह डिव्हाइस जोडा"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"सहा अंकी कोड वापरून नवीन डिव्हाइस जोडा"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"पेअर केलेले डिव्हाइस"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"डिव्हाइस पेअर करता आले नाही. QR कोड चुकीचा होता किंवा डिव्हाइस समान नेटवर्कशी कनेक्ट केलेले नाही."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"आयपी अ‍ॅड्रेस आणि पोर्ट"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"QR कोड स्कॅन करा"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"QR कोड स्कॅन करून वाय-फाय वापरून डिव्हाइस पेअर करा"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"QR कोड स्कॅन करून वाय-फाय वरून डिव्हाइस पेअर करा"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"कृपया एका वाय-फाय नेटवर्कशी कनेक्ट करा"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"ADB, डीबग, डेव्हलपर"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"बग रिपोर्ट शॉर्टकट"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"वायरलेस डिस्प्ले प्रमाणीकरण"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"वाय-फाय व्हर्बोझ लॉगिंग सुरू करा"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"वाय-फाय स्कॅन थ्रॉटलिंग"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"वाय-फाय वर्धित केलेले MAC रँडमायझेशन"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"मोबाइल डेटा नेहमी सक्रिय"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"टेदरिंग हार्डवेअर प्रवेग"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"नावांशिवाय ब्‍लूटूथ डिव्‍हाइस दाखवा"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"वायरलेस डिस्प्ले प्रमाणिकरणाचे पर्याय दाखवा"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"वाय-फाय लॉगिंग स्‍तर वाढवा, वाय-फाय सिलेक्टरमध्‍ये प्रति SSID RSSI दर्शवा"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"बॅटरी जलदरीतीने संपण्यापासून रोखते आणि नेटवर्क परफॉर्मन्समध्ये सुधारणा करते"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"या टॉगलचा फक्त क्लायंट मोडसाठी MAC रँडमायझेशन वर्तनावर परिणाम होतो.\nहा मोड अ‍ॅक्टिव्हेट केलेला असताना, तुमच्या नेटवर्कवरून क्लायंट शेवटचा कधी डिस्कनेक्ट केला गेला त्यावर अवलंबून, संबद्धीकरणादरम्यान MAC रँडमायझेशन सुरू असलेल्या कोणत्याही नेटवर्कचे MAC अ‍ॅड्रेस पुन्हा रँडमाइझ केले जाऊ शकतात. डिव्हाइस चार तासांत किंवा त्यापेक्षा कमी वेळात पुन्हा कनेक्ट झाल्यास पुन्हा रँडमायझेशन होत नाही."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"मीटरने मोजलेले"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"मीटरने न मोजलेले"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"लॉगर बफर आकार"</string>
@@ -301,7 +303,7 @@
     <string name="adb_warning_title" msgid="7708653449506485728">"USB डीबग करण्यास अनुमती द्यायची?"</string>
     <string name="adb_warning_message" msgid="8145270656419669221">"USB डीबग करण्याचा हेतू फक्त विकास उद्देशांसाठी आहे. याचा वापर तुमचा कॉंप्युटर आणि तुमचे डिव्हाइस यांच्या दरम्यान डेटा कॉपी करण्यासाठी करा, सूचनेशिवाय तुमच्या डिव्हाइस वर अ‍ॅप्स इंस्टॉल करा आणि लॉग डेटा वाचा."</string>
     <string name="adbwifi_warning_title" msgid="727104571653031865">"वायरलेस डीबगिंग करण्याची अनुमती द्यायची आहे का?"</string>
-    <string name="adbwifi_warning_message" msgid="8005936574322702388">"वायरलेस डीबग करण्याचा हेतू फक्त विकास उद्देशांसाठी आहे. याचा वापर तुमचा कॉंप्युटर आणि तुमचे डिव्हाइस यांच्या दरम्यान डेटा कॉपी करण्यासाठी करा, सूचनेशिवाय तुमच्या डिव्हाइसवर अ‍ॅप्स इंस्टॉल करा आणि लॉग डेटा वाचा."</string>
+    <string name="adbwifi_warning_message" msgid="8005936574322702388">"वायरलेस डीबगिंग करण्याचा हेतू फक्त विकास उद्देशांसाठी आहे. याचा वापर तुमचा कॉंप्युटर आणि तुमचे डिव्हाइस यांच्या दरम्यान डेटा कॉपी करण्यासाठी करा, सूचनेशिवाय तुमच्या डिव्हाइसवर अ‍ॅप्स इंस्टॉल करा आणि लॉग डेटा वाचा."</string>
     <string name="adb_keys_warning_message" msgid="2968555274488101220">"तुम्ही पूर्वी ऑथोराइझ केलेल्या सर्व संगणकांवरुन USB डीबग करण्यासाठी अ‍ॅक्सेस रीव्होक करायचा?"</string>
     <string name="dev_settings_warning_title" msgid="8251234890169074553">"विकास सेटिंग्जला अनुमती द्यायची?"</string>
     <string name="dev_settings_warning_message" msgid="37741686486073668">"या सेटिंग्जचा हेतू फक्त विकास वापरासाठी आहे. त्यामुळे तुमचे डिव्हाइस आणि त्यावरील ॲप्लिकेशन ब्रेक होऊ शकतात किंवा नेहमीपेक्षा वेगळे वर्तन करू शकतात."</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"बॅकग्राउंड अ‍ॅप्ससाठी अ‍ॅप प्रतिसाद देत नाही दाखवते"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"सूचना चॅनेल चेतावण्या दाखवा"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"एखादे अ‍ॅप वैध चॅनेलशिवाय सूचना पोस्ट करते तेव्हा स्क्रीनवर चेतावणी देते"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"संभाषण सूचना शॉर्टकट ठेवा"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"सूचनांना जुन्या शॉर्टकटचा सपोर्ट आवश्यक"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"बाह्यवर ॲप्सना अनुमती देण्याची सक्ती करा"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"manifest मूल्यांकडे दुर्लक्ष करून, कोणत्याही ॲपला बाह्य स्टोरेजवर लेखन केले जाण्यासाठी पात्र बनविते"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"ॲक्टिव्हिटीचा आकार बदलण्यायोग्य होण्याची सक्ती करा"</string>
@@ -532,7 +536,7 @@
     <string name="user_add_user_message_long" msgid="1527434966294733380">"अतिरिक्त वापरकर्ते तयार करून तुम्ही इतर लोकांसोबत हे डिव्हाइस शेअर करू शकता. प्रत्येक वापरकर्त्यास त्यांची स्वतःची स्पेस असते, जी ते अ‍ॅप्स, वॉलपेपर आणि यासारख्या गोष्टींनी कस्टमाइझ करू शकतात. वापरकर्ते प्रत्येकाला प्रभावित करणाऱ्या वाय-फाय सारख्या डिव्हाइस सेटिंग्ज अ‍ॅडजस्ट देखील करू शकतात.\n\nतुम्ही एक नवीन वापरकर्ता जोडता, तेव्हा त्या व्यक्तीला त्याची स्पेस सेट अप करण्याची आवश्यकता असते.\n\nकोणताही वापरकर्ता इतर सर्व वापरकर्त्यांसाठी अ‍ॅप अपडेट करू शकतो. अ‍ॅक्सेसिबिलिटी सेटिंग्ज आणि सेवा नवीन वापरकर्त्याला कदाचित ट्रान्सफर होणार नाहीत."</string>
     <string name="user_add_user_message_short" msgid="3295959985795716166">"तुम्ही एक नवीन वापरकर्ता जोडता तेव्हा, त्या व्यक्तीस त्यांचे स्थान सेट करण्याची आवश्यकता असते.\n\nकोणताही वापरकर्ता इतर सर्व वापरकर्त्यांसाठी अ‍ॅप्स अपडेट करू शकतो."</string>
     <string name="user_setup_dialog_title" msgid="8037342066381939995">"आता वापरकर्ता सेट करायचा?"</string>
-    <string name="user_setup_dialog_message" msgid="269931619868102841">"डिव्हाइस घेण्यासाठी आणि त्यांचे स्थान सेट करण्यासाठी व्यक्ती उपलब्ध असल्याची खात्री करा"</string>
+    <string name="user_setup_dialog_message" msgid="269931619868102841">"तो वापरकर्ता डिव्हाइसजवळ आहे आणि त्याचे स्थान सेट करण्यासाठी उपलब्ध आहे याची खात्री करा"</string>
     <string name="user_setup_profile_dialog_message" msgid="4788197052296962620">"आता प्रोफाईल सेट करायचा?"</string>
     <string name="user_setup_button_setup_now" msgid="1708269547187760639">"आता सेट करा"</string>
     <string name="user_setup_button_setup_later" msgid="8712980133555493516">"आत्ता नाही"</string>
diff --git a/packages/SettingsLib/res/values-ms/strings.xml b/packages/SettingsLib/res/values-ms/strings.xml
index 1dc3dc4..294ab274 100644
--- a/packages/SettingsLib/res/values-ms/strings.xml
+++ b/packages/SettingsLib/res/values-ms/strings.xml
@@ -155,7 +155,7 @@
     <string name="launch_defaults_some" msgid="3631650616557252926">"Beberapa lalai ditetapkan"</string>
     <string name="launch_defaults_none" msgid="8049374306261262709">"Tiada lalai ditetapkan"</string>
     <string name="tts_settings" msgid="8130616705989351312">"Tetapan teks kepada pertuturan"</string>
-    <string name="tts_settings_title" msgid="7602210956640483039">"Output teks ke pertuturan"</string>
+    <string name="tts_settings_title" msgid="7602210956640483039">"Output teks kepada pertuturan"</string>
     <string name="tts_default_rate_title" msgid="3964187817364304022">"Kadar pertuturan"</string>
     <string name="tts_default_rate_summary" msgid="3781937042151716987">"Kelajuan pertuturan teks"</string>
     <string name="tts_default_pitch_title" msgid="6988592215554485479">"Pic"</string>
@@ -212,7 +212,7 @@
     <string name="adb_wireless_settings" msgid="2295017847215680229">"Penyahpepijatan wayarles"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Untuk melihat dan menggunakan peranti yang tersedia, hidupkan penyahpepijatan wayarles"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Gandingkan peranti dengan kod QR"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"Gandingkan peranti baharu menggunakan Pengimbas kod QR"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"Gandingkan peranti baharu menggunakan pengimbas kod QR"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Gandingkan peranti dengan kod gandingan"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Gandingkan peranti baharu menggunakan kod enam digit"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"Peranti gandingan"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Gagal menggandingkan peranti. Kod QR salah atau peranti tidak disambungkan kepada rangkaian yang sama."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"Alamat IP &amp; Port"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"Imbas kod QR"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"Gandingkan peranti melalui Wi-Fi dengan mengimbas Kod QR"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Gandingkan peranti melalui Wi-Fi dengan mengimbas kod QR"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Sila sambungkan kepada rangkaian Wi-Fi"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, debug, dev"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"Pintasan laporan pepijat"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"Pensijilan paparan wayarles"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"Dayakan Pengelogan Berjela-jela Wi-Fi"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"Pendikitan pengimbasan Wi-Fi"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"Perawakan MAC dipertingkat Wi‑Fi"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"Data mudah alih sentiasa aktif"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"Pecutan perkakasan penambatan"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Tunjukkan peranti Bluetooth tanpa nama"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Tunjukkan pilihan untuk pensijilan paparan wayarles"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Tingkatkan tahap pengelogan Wi-Fi, tunjuk setiap SSID RSSI dalam Pemilih Wi-Fi"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Mengurangkan penyusutan bateri &amp; meningkatkan prestasi rangkaian"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Togol ini melibatkan gelagat perawakan MAC untuk mod pelanggan sahaja.\nApabila mod ini diaktifkan, alamat MAC bagi mana-mana rangkaian yang telah mendayakan perawakan MAC mungkin dirawakkan semula semasa perkaitan, bergantung pada kali terakhir pelanggan diputuskan sambungan daripada rangkaian. Perawakan semula tidak berlaku jika peranti menyambung semula dalam tempoh 4 jam atau kurang."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"Bermeter"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"Tidak bermeter"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"Saiz penimbal pengelog"</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"Paparkan dialog Apl Tiada Respons untuk apl latar belakang"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Papar amaran saluran pemberitahuan"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Memaparkan amaran pada skrin apabila apl menyiarkan pemberitahuan tanpa saluran sah"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Kuat kuasakan pintasan utk pemberitahuan perbualan"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Perlukan pemberitahuan disokong oleh pintasan perkongsian hayat panjang untuk muncul dalam bahagian perbualan"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"Benarkan apl secara paksa pada storan luaran"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Menjadikan sebarang apl layak ditulis ke storan luaran, tanpa mengambil kira nilai manifes"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"Paksa aktiviti supaya boleh diubah saiz"</string>
@@ -432,10 +436,14 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"Seharusnya boleh digunakan hingga kira-kira <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"Hingga <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Bateri mungkin kehabisan selewat-lewatnya <xliff:g id="TIME">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"Tinggal kurang daripada <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"Kurang daripada <xliff:g id="THRESHOLD">%1$s</xliff:g> lagi (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"Lebih daripada <xliff:g id="TIME_REMAINING">%1$s</xliff:g> lagi (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"Lebih daripada <xliff:g id="TIME_REMAINING">%1$s</xliff:g> lagi"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"Telefon mungkin ditutup tidak lama lagi"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"Tablet mungkin ditutup tidak lama lagi"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"Peranti mungkin ditutup tidak lama lagi"</string>
diff --git a/packages/SettingsLib/res/values-my/arrays.xml b/packages/SettingsLib/res/values-my/arrays.xml
index dbeabc0..779d587 100644
--- a/packages/SettingsLib/res/values-my/arrays.xml
+++ b/packages/SettingsLib/res/values-my/arrays.xml
@@ -249,7 +249,7 @@
   <string-array name="debug_hw_overdraw_entries">
     <item msgid="1968128556747588800">"ပိတ်ရန်"</item>
     <item msgid="3033215374382962216">"ရှိရင်းစွဲထက်ပိုသော ဧရိယာများကိုပြရန်"</item>
-    <item msgid="3474333938380896988">"အရောင်ရောနှောသောဧရိယာများပြရန်"</item>
+    <item msgid="3474333938380896988">"အစိမ်းရောင် မမြင်ရသောဧရိယာများ ပြရန်"</item>
   </string-array>
   <string-array name="app_process_limit_entries">
     <item msgid="794656271086646068">"သတ်မှတ်စံနှုန်း"</item>
diff --git a/packages/SettingsLib/res/values-my/strings.xml b/packages/SettingsLib/res/values-my/strings.xml
index e6ebaf9..7525a0f 100644
--- a/packages/SettingsLib/res/values-my/strings.xml
+++ b/packages/SettingsLib/res/values-my/strings.xml
@@ -116,7 +116,7 @@
     <string name="bluetooth_pairing_accept_all_caps" msgid="2734383073450506220">"ချိတ်တွဲရန်"</string>
     <string name="bluetooth_pairing_decline" msgid="6483118841204885890">"မလုပ်တော့"</string>
     <string name="bluetooth_pairing_will_share_phonebook" msgid="3064334458659165176">"ချိတ်တွဲမှုက ချိတ်ဆက်ထားလျှင် သင်၏ အဆက်အသွယ်များ နှင့် ခေါ်ဆိုမှု မှတ်တမ်းကို ရယူခွင့် ပြုသည်။"</string>
-    <string name="bluetooth_pairing_error_message" msgid="6626399020672335565">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>နှင့် တွဲချိတ်မရပါ"</string>
+    <string name="bluetooth_pairing_error_message" msgid="6626399020672335565">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> နှင့် တွဲချိတ်မရပါ"</string>
     <string name="bluetooth_pairing_pin_error_message" msgid="264422127613704940">"ပင်နံပါတ် သို့မဟုတ် ဖြတ်သန်းခွင့်ကီးမမှန်ကန်သောကြောင့်<xliff:g id="DEVICE_NAME">%1$s</xliff:g>နှင့် တွဲချိတ်မရပါ။"</string>
     <string name="bluetooth_pairing_device_down_error_message" msgid="2554424863101358857">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>နှင့်ဆက်သွယ်မရပါ"</string>
     <string name="bluetooth_pairing_rejected_error_message" msgid="5943444352777314442">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>နှင့်တွဲချိတ်ရန် ပယ်ချခံရသည်"</string>
@@ -212,12 +212,12 @@
     <string name="adb_wireless_settings" msgid="2295017847215680229">"ကြိုးမဲ့ အမှားရှာပြင်ခြင်း"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"ရနိုင်သည့် စက်ပစ္စည်းများကို ကြည့်ပြီး အသုံးပြုနိုင်ရန် ကြိုးမဲ့ အမှားရှာပြင်ခြင်းကို ဖွင့်ပါ"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"QR ကုဒ်ဖြင့် စက်ပစ္စည်းကို အတူတွဲပါ"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"QR ကုဒ်ဖတ်စက် သုံး၍ စက်ပစ္စည်းသစ်များကို အတူတွဲပါ"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"QR ကုဒ် စကင်ဖတ်စက် သုံး၍ စက်အသစ်များကို အတူတွဲနိုင်သည်"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"တွဲချိတ်ကုဒ်ဖြင့် စက်ပစ္စည်းကို အတူတွဲပါ"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"ဂဏန်းခြောက်လုံးကုဒ်ဖြင့် စက်ပစ္စည်းသစ်များကို အတူတွဲပါ"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"တွဲချိတ်ပြီး စက်ပစ္စည်းများ"</string>
     <string name="adb_wireless_device_connected_summary" msgid="3039660790249148713">"လက်ရှိ ချိတ်ဆက်ထားသည်"</string>
-    <string name="adb_wireless_device_details_title" msgid="7129369670526565786">"စက်ပစ္စည်း အသေးစိတ်"</string>
+    <string name="adb_wireless_device_details_title" msgid="7129369670526565786">"စက်အသေးစိတ်များ"</string>
     <string name="adb_device_forget" msgid="193072400783068417">"မေ့ပစ်ရန်"</string>
     <string name="adb_device_fingerprint_title_format" msgid="291504822917843701">"စက်ပစ္စည်း လက်ဗွေ- <xliff:g id="FINGERPRINT_PARAM">%1$s</xliff:g>"</string>
     <string name="adb_wireless_connection_failed_title" msgid="664211177427438438">"ချိတ်ဆက်ခြင်း မအောင်မြင်ပါ"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"စက်ပစ္စည်းကို အတူတွဲ၍မရပါ။ QR ကုဒ်မမှန်ပါ သို့မဟုတ် စက်ပစ္စည်းသည် ကွန်ရက်တစ်ခုတည်းသို့ ချိတ်ဆက်မထားပါ။"</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"အိုင်ပီ (IP) လိပ်စာနှင့် ပို့တ်"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"QR ကုဒ်ကို စကင်ဖတ်ပါ"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"QR ကုဒ် စကင်ဖတ်ခြင်းဖြင့် Wi-Fi ပေါ်တွင် စက်ပစ္စည်းကို အတူတွဲပါ"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"QR ကုဒ် စကင်ဖတ်ခြင်းဖြင့် Wi-Fi ပေါ်တွင် စက်ကို အတူတွဲနိုင်သည်"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Wi-Fi ကွန်ရက်သို့ ချိတ်ဆက်ပါ"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, debug, dev"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"ချွတ်ယွင်းမှု အစီရင်ခံရန် ဖြတ်လမ်း"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"ကြိုးမဲ့ပြသမှု အသိအမှတ်ပြုလက်မှတ်"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"Wi‑Fi Verbose မှတ်တမ်းတင်ခြင်းအား ဖွင့်မည်"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"Wi‑Fi ရှာဖွေခြင်း ထိန်းချုပ်မှု"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"Wi‑Fi တိုးမြှင့် MAC ကျပန်းပြုလုပ်ခြင်း"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"မိုဘိုင်းဒေတာကို အမြဲဖွင့်ထားရန်"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"ဖုန်းကို မိုဒမ်အဖြစ်အသုံးပြုမှု စက်ပစ္စည်းဖြင့် အရှိန်မြှင့်တင်ခြင်း"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"အမည်မရှိသော ဘလူးတုသ်စက်ပစ္စည်းများကို ပြသရန်"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"ကြိုးမဲ့ အခင်းအကျင်း အသိအမှတ်ပြုလက်မှတ်အတွက် ရွေးချယ်စရာများပြရန်"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Wi‑Fi မှတ်တမ်းတင်ခြင်း နှုန်းအားမြင့်ကာ၊ Wi‑Fi ရွေးရာတွင် SSID RSSI ဖြင့်ပြပါ"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"ဘက်ထရီ အသုံးပြုမှုကို လျှော့ကျစေပြီး ကွန်ရက်စွမ်းဆောင်ရည်ကို ပိုမိုကောင်းမွန်စေသည်"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"ဤဖွင့်ပိတ်ခလုတ်က ကလိုင်းယင့်မုဒ် အတွက်သာ MAC ကျပန်းပြုလုပ်ခြင်း အပြုအမူကို သက်ရောက်စေသည်။\nဤမုဒ်အသုံးပြုသည့်အခါ MAC ကျပန်းပြုလုပ်ခြင်း ဖွင့်ထားသော ကွန်ရက်များသည် ကွန်ရက်မှ ကလိုင်းယင့် ချိတ်ဆက်မှုဖြုတ်သည့် နောက်ဆုံးအချိန်ပေါ် မူတည်၍ ချိတ်ဆက်နေစဉ်အတွင်း ၎င်းတို့၏ MAC လိပ်စာများကို ပြန်လည်ကျပန်းပြုလုပ်နိုင်သည်။ စက်သည် ၄ နာရီအတွင်း ပြန်ချိန်ဆက်ထားပါက ပြန်လည်ကျပန်းပြုလုပ်မည် မဟုတ်ပါ။"</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"အခမဲ့ မဟုတ်ပါ"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"အခမဲ့"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"မှတ်တမ်းကြားခံနယ် အရွယ်အစားများ"</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"နောက်ခံ အက်ပ်များအတွက် \'အက်ပ်တုံ့ပြန်မှုမရှိ\' ဟု ပြရန်"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"ချန်နယ်သတိပေးချက်များပြပါ"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"ချန်နယ်မရှိဘဲ အကြောင်းကြားလျှင် စကရင်တွင်သတိပေးသည်"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"ဖြတ်လမ်းလင့်ခ် သုံးရန်"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"အချိန်ကြာမျှဝေသော ဖြတ်လမ်းလင့်ခ် သုံးရန် လိုအပ်သည်"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"ပြင်ပစက်တွင် အက်ပ်များခွင့်ပြုရန်"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"တိကျစွာ သတ်မှတ်ထားသည့်တန်ဖိုးများရှိသော်လည်း၊ ပြင်ပသိုလှောင်ခန်းများသို့ မည်သည့်အက်ပ်ကိုမဆို ဝင်ရောက်ခွင့်ပြုပါ"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"လုပ်ဆောင်ချက်များ အရွယ်ပြောင်းနိုင်ခြင်း"</string>
@@ -432,10 +436,14 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"<xliff:g id="TIME">%1$s</xliff:g> ခန့်အထိ သုံးနိုင်သည်"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"<xliff:g id="TIME">%1$s</xliff:g> အထိ"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"<xliff:g id="TIME">%1$s</xliff:g> တွင် ဘက်ထရီကုန်သွားနိုင်သည်"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"<xliff:g id="THRESHOLD">%1$s</xliff:g> ခန့်သာ ကျန်တော့သည်"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"<xliff:g id="THRESHOLD">%1$s</xliff:g> အောက်သာ ကျန်သည် (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> ကျော် ကျန်သည် (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> ကျော် ကျန်သေးသည်"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"မကြာမီ ဖုန်းပိတ်သွားနိုင်သည်"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"မကြာမီ တက်ဘလက် ပိတ်သွားနိုင်သည်"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"မကြာမီ စက်ပိတ်သွားနိုင်သည်"</string>
@@ -464,7 +472,7 @@
     <item msgid="7529124349186240216">"၁၀၀%"</item>
   </string-array>
     <string name="charge_length_format" msgid="6941645744588690932">"ပြီးခဲ့သည့် <xliff:g id="ID_1">%1$s</xliff:g> က"</string>
-    <string name="remaining_length_format" msgid="4310625772926171089">"<xliff:g id="ID_1">%1$s</xliff:g> ကျန်ပါသည်"</string>
+    <string name="remaining_length_format" msgid="4310625772926171089">"<xliff:g id="ID_1">%1$s</xliff:g> ကျန်"</string>
     <string name="screen_zoom_summary_small" msgid="6050633151263074260">"သေး"</string>
     <string name="screen_zoom_summary_default" msgid="1888865694033865408">"မူရင်း"</string>
     <string name="screen_zoom_summary_large" msgid="4706951482598978984">"ကြီး"</string>
@@ -539,7 +547,7 @@
     <string name="user_add_user_type_title" msgid="551279664052914497">"ထပ်ထည့်ရန်"</string>
     <string name="user_new_user_name" msgid="60979820612818840">"အသုံးပြုသူအသစ်"</string>
     <string name="user_new_profile_name" msgid="2405500423304678841">"ကိုယ်ရေးအချက်အလက်အသစ်"</string>
-    <string name="user_info_settings_title" msgid="6351390762733279907">"သုံးစွဲသူအကြောင်း"</string>
+    <string name="user_info_settings_title" msgid="6351390762733279907">"အသုံးပြုသူအကြောင်း"</string>
     <string name="profile_info_settings_title" msgid="105699672534365099">"ကိုယ်ရေးအချက်အလက်"</string>
     <string name="user_need_lock_message" msgid="4311424336209509301">"ကန့်သတ်ကိုယ်ရေးအချက်အလက်တစ်ခုကို မပြုလုပ်မီ သင်၏ အပလီကေးရှင်းများနှင့် ကိုယ်ပိုင်အချက်အလက်များကို ကာကွယ်ရန် မျက်နှာပြင်သော့ချခြင်းကို စီမံရန် လိုအပ်လိမ့်မည်"</string>
     <string name="user_set_lock_button" msgid="1427128184982594856">"သော့ချရန် သတ်မှတ်ပါ"</string>
diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml
index 58213a7..3f38771 100644
--- a/packages/SettingsLib/res/values-nb/strings.xml
+++ b/packages/SettingsLib/res/values-nb/strings.xml
@@ -112,7 +112,7 @@
     <string name="bluetooth_opp_profile_summary_use_for" msgid="461981154387015457">"Bruk til filoverføring"</string>
     <string name="bluetooth_hid_profile_summary_use_for" msgid="4289460627406490952">"Bruk for inndata"</string>
     <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="7689393730163320483">"Bruk for høreapparater"</string>
-    <string name="bluetooth_pairing_accept" msgid="2054232610815498004">"Sammenkoble"</string>
+    <string name="bluetooth_pairing_accept" msgid="2054232610815498004">"Koble til"</string>
     <string name="bluetooth_pairing_accept_all_caps" msgid="2734383073450506220">"KOBLE TIL"</string>
     <string name="bluetooth_pairing_decline" msgid="6483118841204885890">"Avbryt"</string>
     <string name="bluetooth_pairing_will_share_phonebook" msgid="3064334458659165176">"Med sammenkobling får den andre enheten tilgang til kontaktene og anropsloggen din når den er tilkoblet."</string>
@@ -212,7 +212,7 @@
     <string name="adb_wireless_settings" msgid="2295017847215680229">"Trådløs feilsøking"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"For å se og bruke tilgjengelige enheter, slå på trådløs feilsøking"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Koble til enheten med en QR-kode"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"Koble til nye enheter med en QR-kodeskanner"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"Koble til nye enheter med en QR-kodeskanner"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Koble til enheten med en tilkoblingskode"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Koble til nye enheter med en sekssifret kode"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"Tilkoblede enheter"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Kunne ikke koble til enheten. Enten var QR-koden feil, eller enheten er ikke koblet til samme nettverk."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"IP-adresse og port"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"Skann QR-koden"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"Koble til enheten via Wi-Fi ved å skanne en QR-kode"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Koble til enheten via Wi-Fi ved å skanne en QR-kode"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Koble til et Wi-Fi-nettverk"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, feilsøking, utvikler"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"Snarvei til feilrapport"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"Trådløs skjermsertifisering"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"Slå på detaljert Wi-Fi-loggføring"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"Begrensning av Wi‑Fi-skanning"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"Wi‑Fi‑forbedret MAC-tilfeldiggjøring"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"Mobildata er alltid aktiv"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"Maskinvareakselerasjon for internettdeling"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Vis Bluetooth-enheter uten navn"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Vis alternativer for sertifisering av trådløs skjerm"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Øk Wi-Fi-loggenivå – vis per SSID RSSI i Wi-Fi-velgeren"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Reduserer batteriforbruket og forbedrer nettverksytelsen"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Denne av/på-bryteren påvirker bare atferden til MAC-tilfeldiggjøring for klientmodus.\nNår denne modusen er aktivert, kan nettverk som har tilfeldig valgt MAC, få MAC-adressen tilfeldig valgt på nytt under tilknytning, avhengig av når klienten sist ble koblet fra nettverket. Ny tilfeldiggjøring oppstår ikke hvis enheten kobler seg til igjen innen fire timer."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"Med datamåling"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"Uten datamåling"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"Bufferstørrelser for logg"</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"Vis Appen svarer ikke-dialog for bakgrunnsapper"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Vis varselskanaladvarsler"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Viser advarsler på skjermen når apper publiserer varsler uten en gyldig kanal"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Håndhev snarveier for samtalevarsler"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Krev at varsler støttes av en langvarig delingssnarvei for å vises i samtaledelen"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"Tving frem tillatelse for ekstern lagring av apper"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Dette gjør at alle apper kan lagres på eksterne lagringsmedier – uavhengig av manifestverdier"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"Tving aktiviteter til å kunne endre størrelse"</string>
@@ -432,10 +436,14 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"Skal vare til omtrent <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"Til <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Batteriet kan gå tomt <xliff:g id="TIME">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"Mindre enn <xliff:g id="THRESHOLD">%1$s</xliff:g> gjenstår"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"Mindre enn <xliff:g id="THRESHOLD">%1$s</xliff:g> gjenstår (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"Mer enn <xliff:g id="TIME_REMAINING">%1$s</xliff:g> gjenstår (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"Mer enn <xliff:g id="TIME_REMAINING">%1$s</xliff:g> gjenstår"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"Telefonen slås kanskje av snart"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"Nettbrettet slås kanskje av snart"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"Enheten slås kanskje av snart"</string>
diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml
index cc26483..200e0ec 100644
--- a/packages/SettingsLib/res/values-ne/strings.xml
+++ b/packages/SettingsLib/res/values-ne/strings.xml
@@ -161,7 +161,7 @@
     <string name="tts_default_pitch_title" msgid="6988592215554485479">"पिच"</string>
     <string name="tts_default_pitch_summary" msgid="9132719475281551884">"संश्लेषित बोलीको टोनमा प्रभाव पार्छ"</string>
     <string name="tts_default_lang_title" msgid="4698933575028098940">"भाषा"</string>
-    <string name="tts_lang_use_system" msgid="6312945299804012406">"प्रणाली भाषा प्रयोग गर्नुहोस्"</string>
+    <string name="tts_lang_use_system" msgid="6312945299804012406">"प्रणालीको भाषा प्रयोग गर्नुहोस्"</string>
     <string name="tts_lang_not_selected" msgid="7927823081096056147">"भाषा चयन गरिएको छैन"</string>
     <string name="tts_default_lang_summary" msgid="9042620014800063470">"बोली पाठका लागि भाषा-विशेष आवाज सेट गर्दछ"</string>
     <string name="tts_play_example_title" msgid="1599468547216481684">"एउटा उदाहरणलाई सुन्नुहोस्"</string>
@@ -206,13 +206,13 @@
     <string name="enable_adb" msgid="8072776357237289039">"USB डिबग गर्दै"</string>
     <string name="enable_adb_summary" msgid="3711526030096574316">"USB जडित हुँदा डिबग मोड"</string>
     <string name="clear_adb_keys" msgid="3010148733140369917">"USB डिबग गर्ने प्राधिकरणहरू उल्टाउनुहोस्"</string>
-    <string name="enable_adb_wireless" msgid="6973226350963971018">"वायरलेस डिबग गर्ने प्रक्रिया"</string>
+    <string name="enable_adb_wireless" msgid="6973226350963971018">"वायरलेस डिबगिङ"</string>
     <string name="enable_adb_wireless_summary" msgid="7344391423657093011">"Wi‑Fi मा जोडिँदा डिबग मोड सक्षम पार्ने कि नपार्ने"</string>
     <string name="adb_wireless_error" msgid="721958772149779856">"त्रुटि"</string>
-    <string name="adb_wireless_settings" msgid="2295017847215680229">"वायरलेस डिबग गर्ने प्रक्रिया"</string>
-    <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"उपलब्ध यन्त्रहरू हेर्न र प्रयोग गर्न वायरलेस डिबग गर्ने प्रक्रिया सक्रिय गर्नुहोस्"</string>
+    <string name="adb_wireless_settings" msgid="2295017847215680229">"वायरलेस डिबगिङ"</string>
+    <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"उपलब्ध यन्त्रहरू हेर्न र प्रयोग गर्न वायरलेस डिबगिङ सेवा सक्रिय गर्नुहोस्"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"QR कोडमार्फत यन्त्रको जोडा बनाउनुहोस्"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"QR कोड स्क्यानर प्रयोग गरी नयाँ यन्त्रहरूको जोडा बनाउनुहोस्"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"QR कोड स्क्यानर प्रयोग गरी नयाँ यन्त्रहरूको जोडा बनाउनुहोस्"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"जोडा मिलाउने कोडमार्फत यन्त्रको जोडा बनाउनुहोस्"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"छ अङ्कको कोड प्रयोग गरी नयाँ यन्त्रहरूको जोडा बनाउनुहोस्"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"जोडा बनाइएका यन्त्रहरू"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"यन्त्रसँग जोडा बनाउन सकिएन। कि त QR कोड गलत छ कि यन्त्र उही नेटवर्कमा जोडिएको छैन।"</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"IP ठेगाना र पोर्ट"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"QR कोड स्क्यान गर्नुहोस्"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"QR कोड स्क्यान गरेर Wi‑Fi प्रयोग गरी यन्त्रको जोडा बनाउनुहोस्"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"QR कोड स्क्यान गरी Wi‑Fi मार्फत यन्त्रको जोडा बनाउनुहोस्"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"कृपया कुनै Wi-Fi मा कनेक्ट गर्नुहोस्"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, debug, dev"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"बग प्रतिवेदन सर्टकट"</string>
@@ -251,6 +251,8 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"ताररहित प्रदर्शन प्रमाणीकरण"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"Wi-Fi वर्बोज लग सक्षम पार्नुहोस्"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"Wi‑Fi स्क्यान थ्रोटलिङ"</string>
+    <!-- no translation found for wifi_enhanced_mac_randomization (5437378364995776979) -->
+    <skip />
     <string name="mobile_data_always_on" msgid="8275958101875563572">"मोबाइल डेटा सधैँ सक्रिय राख्नुहोस्"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"टेदरिङको लागि हार्डवेयरको प्रवेग"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"नामकरण नगरिएका ब्लुटुथ यन्त्रहरू देखाउनुहोस्"</string>
@@ -283,6 +285,8 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"ताररहित प्रदर्शन प्रमाणीकरणका लागि विकल्पहरू देखाउनुहोस्"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Wi-Fi लग स्तर बढाउनुहोस्, Wi-Fi चयनकर्तामा प्रति SSID RSSI देखाइन्छ"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"ब्याट्रीको खपत कम गरी नेटवर्कको कार्यसम्पादनमा सुधार गर्दछ"</string>
+    <!-- no translation found for wifi_enhanced_mac_randomization_summary (7925425746373704991) -->
+    <skip />
     <string name="wifi_metered_label" msgid="8737187690304098638">"सशुल्क वाइफाइ"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"मिटर नगरिएको"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"लगर बफर आकारहरू"</string>
@@ -300,8 +304,8 @@
     <string name="tethering_hardware_offload_summary" msgid="7801345335142803029">"उपलब्ध भएमा टेदरिङको लागि हार्डवेयरको प्रवेग प्रयोग गर्नुहोस्"</string>
     <string name="adb_warning_title" msgid="7708653449506485728">"USB डिबग गर्न लागि अनुमति दिने हो?"</string>
     <string name="adb_warning_message" msgid="8145270656419669221">"युएसबी डिबगिङ विकास प्रयोजनका लागि मात्र निर्मित हुन्छ। यसलाई तपाईँको कम्प्युटर र तपाईँको उपकरणका बीच डेटा प्रतिलिपि गर्न, बिना सूचना तपाईँको उपकरणमा अनुप्रयोगहरू स्थापना गर्न र लग डेटा पढ्नका लागि प्रयोग गर्नुहोस्।"</string>
-    <string name="adbwifi_warning_title" msgid="727104571653031865">"वायरलेस डिबग गर्ने प्रक्रिया सक्षम पार्ने हो?"</string>
-    <string name="adbwifi_warning_message" msgid="8005936574322702388">"वायरलेस डिबग गर्ने प्रक्रिया विकास प्रयोजनका लागि मात्रै हो। यसलाई आफ्ना कम्प्युटर र उपकरणका बिच डेटा प्रतिलिपि गर्न, सूचना नदिई आफ्नो उपकरणमा अनुप्रयोगहरू स्थापना गर्न र लगसम्बन्धी डेटा रिड गर्नका लागि प्रयोग गर्नुहोस्।"</string>
+    <string name="adbwifi_warning_title" msgid="727104571653031865">"वायरलेस डिबगिङ सेवा सक्षम पार्ने हो?"</string>
+    <string name="adbwifi_warning_message" msgid="8005936574322702388">"वायरलेस डिबगिङ डिभलपमेन्ट प्रयोजनका लागि मात्रै हो। यसलाई आफ्ना कम्प्युटर र उपकरणका बिच डेटा प्रतिलिपि गर्न, सूचना नदिई आफ्नो उपकरणमा अनुप्रयोगहरू स्थापना गर्न र लग डेटा पढ्न प्रयोग गर्नुहोस्।"</string>
     <string name="adb_keys_warning_message" msgid="2968555274488101220">"तपाईं पहिले नै अधिकृत गर्नुभएका सबै कम्प्यूटरबाट USB डिबग गर्नको लागि पहुँच रद्द गर्ने हो?"</string>
     <string name="dev_settings_warning_title" msgid="8251234890169074553">"विकास सेटिङहरू अनुमति दिने हो?"</string>
     <string name="dev_settings_warning_message" msgid="37741686486073668">"यी सेटिङहरू केवल विकास प्रयोगको लागि विचार गरिएको हो। तिनीहरूले तपाईंको उपकरण र अनुप्रयोगहरूलाई विच्छेदन गर्न वा दुर्व्यवहार गर्न सक्दछ।"</string>
@@ -371,6 +375,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"पृष्ठभूमिका अनुप्रयोगहरूको संवादको प्रतिक्रिया नदिइरहेका अनुप्रयोगहरू प्रदर्शन गर्नुहोस्"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"सूचना च्यानलका चेतावनी देखाउनुहोस्"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"अनुप्रयोगले कुनै मान्य च्यानल बिना सूचना पोस्ट गर्दा स्क्रिनमा चेतावनी देखाउँछ"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"कुराकानी नामक स्थानमा मान्य सर्टकटसँग पनि लिंक गरिएका सूचनाहरू मात्र देखाइयोस्"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"कुराकानी नामक स्थानमा सूचनाहरू देखिन सकून् भन्नाका खातिर ती सूचनामा सधैँ सक्रिय रहने (long-lived) सेयरिङ सर्टकट समावेश भएको हुनु पर्छ"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"बाह्यमा बल प्रयोगको अनुमति प्राप्त अनुप्रयोगहरू"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"म्यानिफेेस्टका मानहरूको ख्याल नगरी कुनै पनि अनुप्रयोगलाई बाह्य भण्डारणमा लेख्न सकिने खाले बनाउँछ"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"आकार बदल्न योग्य हुने बनाउन गतिविधिहरूलाई बाध्यात्मक बनाउनुहोस्।"</string>
@@ -417,7 +423,7 @@
     <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"प्रोटानेमली (रातो, हरियो)"</string>
     <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"ट्रिटानोमेली (निलो-पंहेलो)"</string>
     <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"रङ्ग सुधार"</string>
-    <string name="accessibility_display_daltonizer_preference_subtitle" msgid="1284746051652993443">"रङ सच्याउने सुविधाले तपाईंलाई आफ्नो यन्त्रमा रङहरू कस्ता देखिन्छन् भन्ने कुरा समायोजन गर्न दिन्छ"</string>
+    <string name="accessibility_display_daltonizer_preference_subtitle" msgid="1284746051652993443">"रंङ सच्याउने सुविधाले तपाईंलाई आफ्नो यन्त्रमा रंङहरू कसरी देखाउने भन्ने कुरा निर्धारण गर्न दिन्छ"</string>
     <string name="daltonizer_type_overridden" msgid="4509604753672535721">"<xliff:g id="TITLE">%1$s</xliff:g> द्वारा अधिरोहित"</string>
     <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
     <string name="power_remaining_duration_only" msgid="8264199158671531431">"लगभग <xliff:g id="TIME_REMAINING">%1$s</xliff:g> बाँकी छ"</string>
@@ -432,10 +438,14 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"लगभग <xliff:g id="TIME">%1$s</xliff:g> सम्म टिक्नु पर्छ"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"<xliff:g id="TIME">%1$s</xliff:g> सम्म"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"ब्याट्री <xliff:g id="TIME">%1$s</xliff:g> बजेसम्ममा सकिन सक्छ"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"<xliff:g id="THRESHOLD">%1$s</xliff:g> भन्दा कम समय बाँकी छ"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"<xliff:g id="THRESHOLD">%1$s</xliff:g> भन्दा कम समय बाँकी (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> भन्दा बढी समय बाँकी (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> भन्दा बढी समय बाँकी"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"फोन चाँडै बन्द हुन सक्छ"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"ट्याब्लेट चाँडै बन्द हुन सक्छ"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"यन्त्र चाँडै बन्द हुन सक्छ"</string>
@@ -467,9 +477,9 @@
     <string name="remaining_length_format" msgid="4310625772926171089">"<xliff:g id="ID_1">%1$s</xliff:g> बाँकी"</string>
     <string name="screen_zoom_summary_small" msgid="6050633151263074260">"सानो"</string>
     <string name="screen_zoom_summary_default" msgid="1888865694033865408">"पूर्वनिर्धारित"</string>
-    <string name="screen_zoom_summary_large" msgid="4706951482598978984">"ठूलो"</string>
-    <string name="screen_zoom_summary_very_large" msgid="7317423942896999029">"अझ ठूलो"</string>
-    <string name="screen_zoom_summary_extremely_large" msgid="1438045624562358554">"सबैभन्दा ठूलो"</string>
+    <string name="screen_zoom_summary_large" msgid="4706951482598978984">"ठुलो"</string>
+    <string name="screen_zoom_summary_very_large" msgid="7317423942896999029">"अझ ठुलो"</string>
+    <string name="screen_zoom_summary_extremely_large" msgid="1438045624562358554">"सबैभन्दा ठुलो"</string>
     <string name="screen_zoom_summary_custom" msgid="3468154096832912210">"आफू अनुकूल (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
     <string name="content_description_menu_button" msgid="6254844309171779931">"मेनु"</string>
     <string name="retail_demo_reset_message" msgid="5392824901108195463">"डेमो मोडमा फ्याक्ट्री रिसेट गर्न पासवर्ड प्रविष्टि गर्नुहोस्"</string>
@@ -529,10 +539,10 @@
     <string name="user_add_user_item_title" msgid="2394272381086965029">"प्रयोगकर्ता"</string>
     <string name="user_add_profile_item_title" msgid="3111051717414643029">"प्रतिबन्धित प्रोफाइल"</string>
     <string name="user_add_user_title" msgid="5457079143694924885">"नयाँ प्रयोगकर्ता थप्ने हो?"</string>
-    <string name="user_add_user_message_long" msgid="1527434966294733380">"तपाईं थप प्रयोगकर्ताहरू सिर्जना गरेर यो यन्त्र अन्य मान्छेहरूसँग साझा रूपमा प्रयोग गर्न सक्नुहुन्छ। हरेक प्रयोगकर्ताको आफ्नै ठाउँ हुन्छ, जसलाई उनीहरू अनुप्रयोग, वालपेपर इत्यादिमार्फत आफू अनुकूल पार्न सक्छन्। प्रयोगकर्ताहरू सबैजनालाई असर पार्ने Wi-Fi जस्ता यन्त्रका सेटिङहरू पनि समायोजन गर्न सक्छन्।\n\nतपाईंले नयाँ प्रयोगकर्ता थप्दा उक्त व्यक्तिले आफ्नो ठाउँ सेटअप गर्नु पर्ने हुन्छ।\n\nकुनै पनि प्रयोगकर्ताले अन्य सबै प्रयोगकर्ताहरूका लागि अनुप्रयोगहरू अद्यावधिक गर्न सक्छन्। पहुँचसम्बन्धी सेटिङ तथा सेवाहरू नयाँ प्रयोगकर्तामा स्थानान्तरण नहुन सक्छन्।"</string>
+    <string name="user_add_user_message_long" msgid="1527434966294733380">"तपाईं थप प्रयोगकर्ताहरू सिर्जना गरेर ती प्रयोगकर्तालाई यो यन्त्र प्रयोग गर्न दिन सक्नुहुन्छ। हरेक प्रयोगकर्ताको आफ्नै ठाउँ हुन्छ। उनीहरू यो ठाउँमा आफ्नै अनुप्रयोग, वालपेपर आदिका लागि प्रयोग गर्न सक्छन्। उनीहरू सबैजनालाई असर पार्ने Wi-Fi जस्ता यन्त्रका सेटिङहरू पनि परिवर्तन गर्न सक्छन्।\n\nतपाईंले नयाँ प्रयोगकर्ता थप्दा उक्त व्यक्तिले आफ्नो ठाउँ सेटअप गर्नु पर्ने हुन्छ।\n\nसबै प्रयोगकर्ता अन्य सबै प्रयोगकर्ताले प्रयोग गर्ने अनुप्रयोगहरू अद्यावधिक गर्न सक्छन्। तर पहुँचसम्बन्धी सेटिङ तथा सेवाहरू नयाँ प्रयोगकर्तामा नसर्न सक्छ।"</string>
     <string name="user_add_user_message_short" msgid="3295959985795716166">"जब तपाईंले नयाँ प्रयोगकर्ता थप्नुहुन्छ, त्यो व्यक्तिले आफ्नो ठाउँ सेट गर्न आवश्यक छ।\n\nकुनै पनि प्रयोगकर्ताले सबै अन्य प्रयोगकर्ताहरूका लागि अनुप्रयोगहरू अद्यावधिक गर्न सक्छन्।"</string>
     <string name="user_setup_dialog_title" msgid="8037342066381939995">"अहिले प्रयोगकर्ता सेटअप गर्ने हो?"</string>
-    <string name="user_setup_dialog_message" msgid="269931619868102841">"यन्त्र लिन र आफ्नो ठाउँ बनाउन व्यक्ति उपलब्ध छ भन्ने कुराको निश्चित गर्नुहोस्"</string>
+    <string name="user_setup_dialog_message" msgid="269931619868102841">"यी व्यक्ति यन्त्र यो यन्त्र चलाउन र आफ्नो ठाउँ सेट गर्न उपलब्ध छन् भन्ने कुरा सुनिश्चित गर्नुहोस्"</string>
     <string name="user_setup_profile_dialog_message" msgid="4788197052296962620">"अहिले प्रोफाइल सेटअप गर्ने हो?"</string>
     <string name="user_setup_button_setup_now" msgid="1708269547187760639">"अब सेटअप गर्नुहोस्"</string>
     <string name="user_setup_button_setup_later" msgid="8712980133555493516">"अहिले होइन"</string>
@@ -540,7 +550,7 @@
     <string name="user_new_user_name" msgid="60979820612818840">"नयाँ प्रयोगकर्ता"</string>
     <string name="user_new_profile_name" msgid="2405500423304678841">"नयाँ प्रोफाइल"</string>
     <string name="user_info_settings_title" msgid="6351390762733279907">"प्रयोगकर्ता जानकारी"</string>
-    <string name="profile_info_settings_title" msgid="105699672534365099">"प्रोफाइल जानकारी"</string>
+    <string name="profile_info_settings_title" msgid="105699672534365099">"प्रोफाइलको जानकारी"</string>
     <string name="user_need_lock_message" msgid="4311424336209509301">"निषेधयुक्त प्रोफाइल बनाउनु अघि तपाईँको अनुप्रयोग र व्यक्तिगत डेटा सुरक्षा गर्नाका लागि तपाईँले स्क्रिन लक सेटअप गर्नु पर्दछ ।"</string>
     <string name="user_set_lock_button" msgid="1427128184982594856">"लक सेट गर्नुहोस्"</string>
     <string name="user_switch_to_user" msgid="6975428297154968543">"प्रयोगकर्ता बदलेर <xliff:g id="USER_NAME">%s</xliff:g> पार्नुहोस्"</string>
diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml
index 57fc87a..176a8b7 100644
--- a/packages/SettingsLib/res/values-nl/strings.xml
+++ b/packages/SettingsLib/res/values-nl/strings.xml
@@ -212,7 +212,7 @@
     <string name="adb_wireless_settings" msgid="2295017847215680229">"Draadloze foutopsporing"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Schakel draadloze foutopsporing in om beschikbare apparaten te bekijken en te gebruiken"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Apparaat koppelen met QR-code"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"Nieuwe apparaten koppelen via QR-codescanner"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"Nieuwe apparaten koppelen via QR-codescanner"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Apparaat koppelen met koppelingscode"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Nieuwe apparaten koppelen via een zescijferige code"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"Gekoppelde apparaten"</string>
@@ -231,11 +231,11 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Kan het apparaat niet koppelen. De QR-code was onjuist of het apparaat is niet verbonden met hetzelfde netwerk."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"IP-adres en poort"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"QR-code scannen"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"Apparaat koppelen via wifi door een QR-code te scannen"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Apparaat koppelen via wifi door een QR-code te scannen"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Maak verbinding met een wifi-netwerk"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, foutopsporing, ontwikkeling"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"Snelle link naar bugrapport"</string>
-    <string name="bugreport_in_power_summary" msgid="1885529649381831775">"Een knop in het voedingsmenu weergeven om een bugrapport te maken"</string>
+    <string name="bugreport_in_power_summary" msgid="1885529649381831775">"Een knop in het aan/uit-menu weergeven om een bugrapport te maken"</string>
     <string name="keep_screen_on" msgid="1187161672348797558">"Stand-by"</string>
     <string name="keep_screen_on_summary" msgid="1510731514101925829">"Scherm gaat nooit uit tijdens het opladen"</string>
     <string name="bt_hci_snoop_log" msgid="7291287955649081448">"Snoop-logbestand voor Bluetooth-HCI inschakelen"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"Certificering van draadloze weergave"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"Uitgebreide wifi-logregistratie insch."</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"Wifi-scannen beperken"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"Via wifi ondersteunde MAC-herschikking"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"Mobiele data altijd actief"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"Hardwareversnelling voor tethering"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Bluetooth-apparaten zonder namen weergeven"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Opties weergeven voor certificering van draadloze weergave"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Logniveau voor wifi verhogen, weergeven per SSID RSSI in wifi-kiezer"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Verlaagt het batterijverbruik en verbetert de netwerkprestaties"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Deze schakelaar beïnvloedt het gedrag van MAC-herschikking uitsluitend voor de clientmodus.\nAls deze modus is ingeschakeld, worden de MAC-adressen van netwerken die MAC-herschikking hebben ingeschakeld, mogelijk opnieuw in willekeurige volgorde herschikt als verbinding wordt gemaakt. Dit is afhankelijk van wanneer de client voor het laatst de verbinding met het netwerk verbrak. Opnieuw herschikken gebeurt niet als het apparaat binnen vier uur opnieuw verbinding maakt."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"Met datalimiet"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"Gratis"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"Logger-buffergrootten"</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"Dialoogvenster \'App reageert niet\' weergeven voor achtergrond-apps"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Kanaalwaarschuwingen voor meldingen weergeven"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Geeft een waarschuwing op het scherm weer wanneer een app een melding post zonder geldig kanaal"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Snelkoppelingen voor gespreksmeldingen afdwingen"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Vereisen dat meldingen een langdurige snelkoppeling voor delen krijgen om bij gesprekken te kunnen worden getoond"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"Toestaan van apps op externe opslag afdwingen"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Hiermee komt elke app in aanmerking voor schrijven naar externe opslag, ongeacht de manifestwaarden"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"Formaat activiteiten geforceerd aanpasbaar maken"</string>
@@ -432,10 +436,14 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"Is nog genoeg tot ongeveer <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"Tot <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Batterij is waarschijnlijk leeg om <xliff:g id="TIME">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"Nog minder dan <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"Nog minder dan <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"Nog meer dan <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"Nog meer dan <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"Telefoon wordt binnenkort mogelijk uitgeschakeld"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"Tablet wordt binnenkort mogelijk uitgeschakeld"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"Apparaat wordt binnenkort mogelijk uitgeschakeld"</string>
diff --git a/packages/SettingsLib/res/values-or/strings.xml b/packages/SettingsLib/res/values-or/strings.xml
index 3a7f2c5..a38a3ea 100644
--- a/packages/SettingsLib/res/values-or/strings.xml
+++ b/packages/SettingsLib/res/values-or/strings.xml
@@ -86,7 +86,7 @@
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"ଫାଇଲ୍‌ ଟ୍ରାନ୍ସଫର୍‌"</string>
     <string name="bluetooth_profile_hid" msgid="2969922922664315866">"ଇନ୍‌ପୁଟ୍‌ ଡିଭାଇସ୍"</string>
     <string name="bluetooth_profile_pan" msgid="1006235139308318188">"ଇଣ୍ଟର୍‌ନେଟ୍‌ ଆକ୍ସେସ୍"</string>
-    <string name="bluetooth_profile_pbap" msgid="7064307749579335765">"ଯୋଗାଯୋଗ ସେୟାରିଙ୍ଗ୍"</string>
+    <string name="bluetooth_profile_pbap" msgid="7064307749579335765">"ଯୋଗାଯୋଗ ସେୟାରିଂ"</string>
     <string name="bluetooth_profile_pbap_summary" msgid="2955819694801952056">"ଯୋଗାଯୋଗ ସେୟାର୍‌ କରିବା ପାଇଁ ବ୍ୟବହାର କରନ୍ତୁ"</string>
     <string name="bluetooth_profile_pan_nap" msgid="7871974753822470050">"ଇଣ୍ଟର୍‌ନେଟ୍‌ ସଂଯୋଗ ଶେୟାରିଙ୍ଗ"</string>
     <string name="bluetooth_profile_map" msgid="8907204701162107271">"ଟେକ୍ସଟ୍ ମେସେଜ୍"</string>
@@ -126,7 +126,7 @@
     <string name="bluetooth_talkback_imaging" msgid="8781682986822514331">"ଇମେଜିଙ୍ଗ"</string>
     <string name="bluetooth_talkback_headphone" msgid="8613073829180337091">"ହେଡ୍‌ଫୋନ୍‌"</string>
     <string name="bluetooth_talkback_input_peripheral" msgid="5133944817800149942">"ଇନ୍‌ପୁଟ୍‌ ଉପକରଣ"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1143241359781999989">"ବ୍ଲୁଟୂଥ୍‍‌"</string>
+    <string name="bluetooth_talkback_bluetooth" msgid="1143241359781999989">"ବ୍ଲୁଟୁଥ"</string>
     <string name="bluetooth_hearingaid_left_pairing_message" msgid="8561855779703533591">"ବାମ ଶ୍ରବଣ ଯନ୍ତ୍ର ପେୟାର୍ କରାଯାଉଛି…"</string>
     <string name="bluetooth_hearingaid_right_pairing_message" msgid="2655347721696331048">"ଡାହାଣ ଶ୍ରବଣ ଯନ୍ତ୍ର ପେୟାର୍ କରାଯାଉଛି…"</string>
     <string name="bluetooth_hearingaid_left_battery_level" msgid="7375621694748104876">"ବାମ - <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ବ୍ୟାଟେରୀ"</string>
@@ -143,10 +143,10 @@
     <string name="data_usage_uninstalled_apps" msgid="1933665711856171491">"କଢ଼ାଯାଇଥିବା ଆପ୍‌ଗୁଡ଼ିକ"</string>
     <string name="data_usage_uninstalled_apps_users" msgid="5533981546921913295">"ଆପ୍‌ ଏବଂ ଉପଯୋଗକର୍ତ୍ତା ବାହାର କରାଗଲା"</string>
     <string name="data_usage_ota" msgid="7984667793701597001">"ସିଷ୍ଟମ୍ ଅପ୍‌ଡେଟ୍"</string>
-    <string name="tether_settings_title_usb" msgid="3728686573430917722">"USB ଟିଥରିଙ୍ଗ"</string>
+    <string name="tether_settings_title_usb" msgid="3728686573430917722">"USB ଟିଥରିଂ"</string>
     <string name="tether_settings_title_wifi" msgid="4803402057533895526">"ପୋର୍ଟବଲ୍‌ ହଟସ୍ପଟ୍‌"</string>
-    <string name="tether_settings_title_bluetooth" msgid="916519902721399656">"ବ୍ଲୁଟୂଥ ଟିଥରିଙ୍ଗ"</string>
-    <string name="tether_settings_title_usb_bluetooth" msgid="1727111807207577322">"ଟିଥର୍‌ କରୁଛି"</string>
+    <string name="tether_settings_title_bluetooth" msgid="916519902721399656">"ବ୍ଲୁଟୁଥ ଟିଥରିଂ"</string>
+    <string name="tether_settings_title_usb_bluetooth" msgid="1727111807207577322">"ଟିଥରିଂ"</string>
     <string name="tether_settings_title_all" msgid="8910259483383010470">"ଟିଥରିଙ୍ଗ ଓ ପୋର୍ଟବଲ୍ ହଟ୍‌ସ୍ପଟ୍‌"</string>
     <string name="managed_user_title" msgid="449081789742645723">"ସମସ୍ତ କାର୍ଯ୍ୟ ଆପ୍‌"</string>
     <string name="user_guest" msgid="6939192779649870792">"ଅତିଥି"</string>
@@ -206,13 +206,13 @@
     <string name="enable_adb" msgid="8072776357237289039">"USB ଡିବଗ୍‌ ହେଉଛି"</string>
     <string name="enable_adb_summary" msgid="3711526030096574316">"USB ସଂଯୁକ୍ତ ହେବାବେଳେ ଡିବଗ୍‌ ମୋଡ୍‌"</string>
     <string name="clear_adb_keys" msgid="3010148733140369917">"USB ଡିବଗିଙ୍ଗ ଅଧିକାରକୁ କାଢ଼ିଦିଅନ୍ତୁ"</string>
-    <string name="enable_adb_wireless" msgid="6973226350963971018">"ୱେୟାରଲେସ୍ ଡିବଗିଂ"</string>
+    <string name="enable_adb_wireless" msgid="6973226350963971018">"ୱାୟାରଲେସ୍ ଡିବଗିଂ"</string>
     <string name="enable_adb_wireless_summary" msgid="7344391423657093011">"ୱାଇ-ଫାଇ ସଂଯୁକ୍ତ ଥିବା ବେଳେ ଡିବଗ୍ ମୋଡ୍"</string>
     <string name="adb_wireless_error" msgid="721958772149779856">"ତ୍ରୁଟି"</string>
-    <string name="adb_wireless_settings" msgid="2295017847215680229">"ୱେୟାରଲେସ୍ ଡିବଗିଂ"</string>
-    <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"ଉପଲବ୍ଧ ଡିଭାଇସଗୁଡ଼ିକୁ ଦେଖିବାକୁ ଏବଂ ବ୍ୟବହାର କରିବାକୁ ୱେୟାରଲେସ୍ ଡିବଗିଂ ଚାଲୁ କରନ୍ତୁ"</string>
+    <string name="adb_wireless_settings" msgid="2295017847215680229">"ୱାୟାରଲେସ୍ ଡିବଗିଂ"</string>
+    <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"ଉପଲବ୍ଧ ଡିଭାଇସଗୁଡ଼ିକୁ ଦେଖିବାକୁ ଏବଂ ବ୍ୟବହାର କରିବାକୁ ୱାୟାରଲେସ୍ ଡିବଗିଂ ଚାଲୁ କରନ୍ତୁ"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"QR କୋଡରେ ଡିଭାଇସକୁ ପେୟାର୍ କରନ୍ତୁ"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"QR କୋଡ୍ ସ୍କାନର୍ ବ୍ୟବହାର କରି ନୂଆ ଡିଭାଇସଗୁଡ଼ିକୁ ପେୟାର୍ କରନ୍ତୁ"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"QR କୋଡ୍ ସ୍କାନର୍ ବ୍ୟବହାର କରି ନୂଆ ଡିଭାଇସଗୁଡ଼ିକୁ ପେୟାର୍ କରନ୍ତୁ"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"ପେୟାରିଂ କୋଡରେ ଡିଭାଇସକୁ ପେୟାର୍ କରନ୍ତୁ"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"ଛଅ ଡିଜିଟ୍ କୋଡ୍ ବ୍ୟବହାର କରି ନୂଆ ଡିଭାଇସଗୁଡ଼ିକୁ ପେୟାର୍ କରନ୍ତୁ"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"ପେୟାର୍ ହୋଇଥିବା ଡିଭାଇସଗୁଡ଼ିକ"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"ଡିଭାଇସରୁ ପେୟାର୍ ହେବାରେ ବିଫଳ ହୋଇଛି। QR କୋଡ୍ ସଠିକ୍ ନଥିଲା ବା ଡିଭାଇସ୍ ସମାନ ନେଟୱାର୍କରେ ସଂଯୋଗ ହୋଇନାହିଁ।"</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"IP ଠିକଣା ଓ ପୋର୍ଟ"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"QR କୋଡ୍ ସ୍କାନ୍ କରନ୍ତୁ"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"ଏକ QR କୋଡ୍ ସ୍କାନ୍ କରି ୱାଇ-ଫାଇରେ ଡିଭାଇସ୍ ପେୟାର୍ କରନ୍ତୁ"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"ଏକ QR କୋଡ୍ ସ୍କାନ୍ କରି ୱାଇ-ଫାଇ ମାଧ୍ୟମରେ ଡିଭାଇସ୍ ପେୟାର୍ କରନ୍ତୁ"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"ଦୟାକରି ଏକ ୱାଇ-ଫାଇ ନେଟୱାର୍କରେ ସଂଯୋଗ କରନ୍ତୁ"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, ଡିବଗ୍, dev"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"ବଗ୍ ରିପୋର୍ଟ ସର୍ଟକଟ୍‌"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"ୱାୟରଲେସ୍‌ ଡିସ୍‌ପ୍ଲେ ସାର୍ଟିଫିକେସନ୍"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"ୱାଇ-ଫାଇ ଭର୍ବୋସ୍‌ ଲଗିଙ୍ଗ ସକ୍ଷମ କରନ୍ତୁ"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"ୱାଇ-ଫାଇ ସ୍କାନ୍ ନିୟନ୍ତ୍ରଣ"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"ୱାଇ‑ଫାଇ-ଉନ୍ନତ MAC ରେଣ୍ଡମାଇଜେସନ୍"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"ମୋବାଇଲ୍‌ ଡାଟା ସର୍ବଦା ସକ୍ରିୟ"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"ଟିଥରିଙ୍ଗ ହାର୍ଡୱେର ଆକ୍ସିଲିରେସନ୍"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"ବ୍ଲୁଟୂଥ୍‍‌ ଡିଭାଇସ୍‌ଗୁଡ଼ିକୁ ନାମ ବିନା ଦେଖନ୍ତୁ"</string>
@@ -278,11 +279,12 @@
     <string name="private_dns_mode_off" msgid="7065962499349997041">"ଅଫ୍"</string>
     <string name="private_dns_mode_opportunistic" msgid="1947864819060442354">"ସ୍ଵଚାଳିତ"</string>
     <string name="private_dns_mode_provider" msgid="3619040641762557028">"ବ୍ୟକ୍ତିଗତ DNS ପ୍ରଦାତା ହୋଷ୍ଟନାମ"</string>
-    <string name="private_dns_mode_provider_hostname_hint" msgid="6564868953748514595">"DNS ପ୍ରଦାନକାରୀଙ୍କ ହୋଷ୍ଟନାମ ପ୍ରବେଶ କରନ୍ତୁ"</string>
+    <string name="private_dns_mode_provider_hostname_hint" msgid="6564868953748514595">"DNS ପ୍ରଦାନକାରୀଙ୍କ ହୋଷ୍ଟନାମ ଲେଖନ୍ତୁ"</string>
     <string name="private_dns_mode_provider_failure" msgid="8356259467861515108">"କନେକ୍ଟ କରିହେଲା ନାହିଁ"</string>
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"ୱେୟାରଲେସ୍‌ ଡିସ୍‌ପ୍ଲେ ସାର୍ଟିଫିକେସନ୍ ପାଇଁ ବିକଳ୍ପ ଦେଖାନ୍ତୁ"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"ୱାଇ-ଫାଇ ଲଗିଙ୍ଗ ସ୍ତର ବଢ଼ାନ୍ତୁ, ୱାଇ-ଫାଇ ପିକର୍‌ରେ ପ୍ରତି SSID RSSI ଦେଖାନ୍ତୁ"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"ବ୍ୟାଟେରୀ ଖର୍ଚ୍ଚ କମ୍ ଏବଂ ନେଟ୍‌ୱାର୍କ କାର୍ଯ୍ୟକ୍ଷମତା ଉନ୍ନତ କରିଥାଏ"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"ଏହି ଟୋଗଲ୍ କେବଳ କ୍ଲାଏଣ୍ଟ ମୋଡ୍ ପାଇଁ MAC ରେଣ୍ଡମାଇଜେସନ୍ ବ୍ୟବହାରକୁ ପ୍ରଭାବିତ କରେ।\nଯେତେବେଳେ ଏହି ମୋଡକୁ ସକ୍ରିୟ କରାଯାଏ, ସେତେବେଳେ କ୍ଲାଏଣ୍ଟ ଗତଥର କେତେବେଳେ ନେଟୱାର୍କରୁ ସଂଯୋଗ ବିଚ୍ଛିନ୍ନ କରିଥିଲେ ତାହା ଉପରେ ନିର୍ଭର କରି, MAC ରେଣ୍ଡମାଇଜେସନ୍ ସକ୍ଷମ କରାଯାଇଥିବା ଯେ କୌଣସି ନେଟୱାର୍କର MAC ଠିକଣାଗୁଡ଼ିକୁ ସଂଯୋଜନ ସମୟରେ ପୁଣି ରେଣ୍ଡମାଇଜ୍ କରାଯାଇପାରେ। ଯଦି ଡିଭାଇସଟି 4 ଘଣ୍ଟା କିମ୍ବା ତାଠାରୁ କମ୍ ସମୟରେ ପୁଣି ସଂଯୋଗ କରେ, ତେବେ ପୁଣି ରେଣ୍ଡମାଇଜେସନ୍ ହୁଏ ନାହିଁ।"</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"ମପାଯାଉଥିବା"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"ମପାଯାଉନଥିବା"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"ଲଗର୍‌ ବଫର୍‌ ସାଇଜ୍"</string>
@@ -300,8 +302,8 @@
     <string name="tethering_hardware_offload_summary" msgid="7801345335142803029">"ଯଦି ଉପଲବ୍ଧ ଥାଏ, ଟିଥରିଙ୍ଗ ହାର୍ଡୱେର୍‌ ଆକ୍ସିଲିରେସନ୍ ବ୍ୟବହାର କରନ୍ତୁ"</string>
     <string name="adb_warning_title" msgid="7708653449506485728">"USB ଡିବଗିଙ୍ଗ କରିବେ?"</string>
     <string name="adb_warning_message" msgid="8145270656419669221">"USB ଡିବଗିଂ କେବଳ ଡେଭଲପମେଣ୍ଟ ଉଦ୍ଦେଶ୍ୟ ପାଇଁ ଉଦ୍ଦିଷ୍ଟ ଅଟେ। ଆପଣଙ୍କ କମ୍ପ୍ୟୁଟର ଏବଂ ଡିଭାଇସ୍‌ ମଧ୍ୟରେ ଡାଟା କପି କରିବାକୁ, ବିନା ବିଜ୍ଞପ୍ତିରେ ଆପଣଙ୍କ ଡିଭାଇସରେ ଆପସ୍‌ ସଂସ୍ଥାପନ କରିବାକୁ, ଏବଂ ଲଗ୍‌ ଡାଟା ପଢିବାକୁ ଏହା ବ୍ୟବହାର କରନ୍ତୁ।"</string>
-    <string name="adbwifi_warning_title" msgid="727104571653031865">"ୱେୟାରଲେସ୍ ଡିବଗିଂ ପାଇଁ ଅନୁମତି ଦେବେ?"</string>
-    <string name="adbwifi_warning_message" msgid="8005936574322702388">"ୱେୟାରଲେସ୍ ଡିବଗିଂ କେବଳ ଉନ୍ନତି ଉଦ୍ଦେଶ୍ୟ ପାଇଁ ଉଦ୍ଦିଷ୍ଟ ଅଟେ। ଆପଣଙ୍କ କମ୍ପ୍ୟୁଟର ଏବଂ ଡିଭାଇସ୍ ମଧ୍ୟରେ ଡାଟା କପି କରିବାକୁ, ବିନା ବିଜ୍ଞପ୍ତିରେ ଆପଣଙ୍କ ଡିଭାଇସରେ ଆପ୍ସ ଇନଷ୍ଟଲ୍ କରିବାକୁ ଏବଂ ଲଗ୍ ଡାଟା ପଢ଼ିବା ପାଇଁ ଏହାକୁ ବ୍ୟବହାର କରନ୍ତୁ।"</string>
+    <string name="adbwifi_warning_title" msgid="727104571653031865">"ୱାୟାରଲେସ୍ ଡିବଗିଂ ପାଇଁ ଅନୁମତି ଦେବେ?"</string>
+    <string name="adbwifi_warning_message" msgid="8005936574322702388">"ୱାୟାରଲେସ୍ ଡିବଗିଂ କେବଳ ଉନ୍ନତି ପାଇଁ ଉଦ୍ଦିଷ୍ଟ ଅଟେ। ଆପଣଙ୍କ କମ୍ପ୍ୟୁଟର ଏବଂ ଡିଭାଇସ୍ ମଧ୍ୟରେ ଡାଟା କପି କରିବାକୁ, ବିନା ବିଜ୍ଞପ୍ତିରେ ଆପଣଙ୍କ ଡିଭାଇସରେ ଆପ୍ସ ଇନଷ୍ଟଲ୍ କରିବାକୁ ଏବଂ ଲଗ୍ ଡାଟା ପଢ଼ିବା ପାଇଁ ଏହାକୁ ବ୍ୟବହାର କରନ୍ତୁ।"</string>
     <string name="adb_keys_warning_message" msgid="2968555274488101220">"ଅଧିକୃତ ସମସ୍ତ କମ୍ପ୍ୟୁଟରରୁ USB ଡିବଗ୍‌ କରିବା ଆକ୍ସେସ୍‌ ପ୍ରତ୍ୟାହାର କରିବେ କି?"</string>
     <string name="dev_settings_warning_title" msgid="8251234890169074553">"ଡେଭଲପମେଣ୍ଟ ସେଟିଙ୍ଗ ଅନୁମତି ଦେବେ?"</string>
     <string name="dev_settings_warning_message" msgid="37741686486073668">"ଏହି ସେଟିଙ୍ଗଗୁଡ଼ିକ କେବଳ ବିକାଶ ବ୍ୟବହାର ପାଇଁ ଉଦ୍ଦିଷ୍ଟ। ସେଗୁଡ଼ିକ କାରଣରୁ ଆପଣଙ୍କ ଡିଭାଇସ୍‌ ଓ ଆପ୍ଲିକେଶନ୍‍‍ଗୁଡ଼ିକ ଠିକ୍‌ ଭାବେ କାମ ନକରିପାରେ।"</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"ବ୍ୟାକ୍‌ଗ୍ରାଉଣ୍ଡ ଆପ୍‌ଗୁଡ଼ିକ ପାଇଁ \"ଆପ୍‌ ଉତ୍ତର ଦେଉନାହିଁ\" ଡାୟଲଗ୍‌ ଦେଖାନ୍ତୁ"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"ବିଜ୍ଞପ୍ତି ଚେନାଲ୍ ଚେତାବନୀ ଦେଖାନ୍ତୁ"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"ବୈଧ ଚ୍ୟାନେଲ୍‌ ବିନା ଗୋଟିଏ ଆପ୍‌ ଏକ ବିଜ୍ଞପ୍ତି ପୋଷ୍ଟ କରିବାବେଳେ ଅନ୍‌-ସ୍କ୍ରୀନ୍‌ ସତର୍କତା ଦେଖାଏ"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"ବାର୍ତ୍ତାଳାପ ବିଜ୍ଞପ୍ତି ପାଇଁ ସର୍ଟକଟ ଲାଗୁ କରନ୍ତୁ"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"ବାର୍ତ୍ତାଳାପ ବିଭାଗରେ ଦେଖାଯିବା ପାଇଁ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ଏକ ଦୀର୍ଘ-ସ୍ଥାୟୀ ସେୟାରିଂ ସର୍ଟକଟର ସମର୍ଥନ ଆବଶ୍ୟକ"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"ଆପ୍‌କୁ ଏକ୍ସଟର୍ନଲ୍ ମେମୋରୀରେ ଫୋର୍ସ୍ ଅନୁମତି ଦିଅନ୍ତୁ"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"ଯେକୌଣସି ଆପ୍‌କୁ ଏକ୍ସଟର୍ନଲ୍ ଷ୍ଟୋରେଜ୍‌ରେ ଲେଖାଯୋଗ୍ୟ କରନ୍ତୁ, ମେନିଫେଷ୍ଟ ମୂଲ୍ୟ ଯାହା ହୋଇଥାଉ ନା କାହିଁକି"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"ୱିଣ୍ଡୋ ହିସାବରେ କାର୍ଯ୍ୟକଳାପର ଆକାର ବଦଳାନ୍ତୁ"</string>
@@ -432,10 +436,14 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"ବ୍ୟାଟେରୀ <xliff:g id="TIME">%1$s</xliff:g> ପର୍ଯ୍ୟନ୍ତ ଚାଲିବ"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"<xliff:g id="TIME">%1$s</xliff:g> ପର୍ଯ୍ୟନ୍ତ"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"<xliff:g id="TIME">%1$s</xliff:g> ସୁଦ୍ଧା ବ୍ୟାଟେରୀର ଚାର୍ଜ ଶେଷ ହୋଇ ଯାଇପାରେ"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"<xliff:g id="THRESHOLD">%1$s</xliff:g>ରୁ କମ୍ ସମୟ ବଳକା ଅଛି"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"<xliff:g id="THRESHOLD">%1$s</xliff:g> ରୁ କମ୍ ସମୟ ବଳକା ଅଛି (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g>ରୁ ଅଧିକ ସମୟ ବଳକା ଅଛି(<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g>ରୁ ଅଧିକ ବଳକା ଅଛି"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"ଫୋନ୍ ଶୀଘ୍ର ବନ୍ଦ ହୋଇଯାଇପାରେ"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"ଟାବଲେଟ୍ ଶୀଘ୍ର ବନ୍ଦ ହୋଇଯାଇପାରେ"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"ଡିଭାଇସ୍ ଶୀଘ୍ର ବନ୍ଦ ହୋଇଯାଇପାରେ"</string>
diff --git a/packages/SettingsLib/res/values-pa/strings.xml b/packages/SettingsLib/res/values-pa/strings.xml
index 9802257..4ba370b 100644
--- a/packages/SettingsLib/res/values-pa/strings.xml
+++ b/packages/SettingsLib/res/values-pa/strings.xml
@@ -112,8 +112,8 @@
     <string name="bluetooth_opp_profile_summary_use_for" msgid="461981154387015457">"ਫਾਈਲ ਟ੍ਰਾਂਸਫਰ ਲਈ ਵਰਤੋ"</string>
     <string name="bluetooth_hid_profile_summary_use_for" msgid="4289460627406490952">"ਇਨਪੁਟ ਲਈ ਵਰਤੋ"</string>
     <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="7689393730163320483">"ਸੁਣਨ ਦੇ ਸਾਧਨਾਂ ਲਈ ਵਰਤੋ"</string>
-    <string name="bluetooth_pairing_accept" msgid="2054232610815498004">"ਪੇਅਰ ਕਰੋ"</string>
-    <string name="bluetooth_pairing_accept_all_caps" msgid="2734383073450506220">"ਪੇਅਰ ਕਰੋ"</string>
+    <string name="bluetooth_pairing_accept" msgid="2054232610815498004">"ਜੋੜਾਬੱਧ ਕਰੋ"</string>
+    <string name="bluetooth_pairing_accept_all_caps" msgid="2734383073450506220">"ਜੋੜਾਬੱਧ ਕਰੋ"</string>
     <string name="bluetooth_pairing_decline" msgid="6483118841204885890">"ਰੱਦ ਕਰੋ"</string>
     <string name="bluetooth_pairing_will_share_phonebook" msgid="3064334458659165176">"ਜੋੜਾਬੱਧ ਕਰਨਾ ਕਨੈਕਟ ਕੀਤੇ ਜਾਣ ਤੇ ਤੁਹਾਡੇ ਸੰਪਰਕਾਂ ਅਤੇ ਕਾਲ ਇਤਿਹਾਸ ਤੱਕ ਪਹੁੰਚ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
     <string name="bluetooth_pairing_error_message" msgid="6626399020672335565">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ਨਾਲ ਪੇਅਰ ਨਹੀਂ ਕਰ ਸਕਿਆ।"</string>
@@ -195,7 +195,7 @@
   </string-array>
     <string name="choose_profile" msgid="343803890897657450">"ਪ੍ਰੋਫਾਈਲ ਚੁਣੋ"</string>
     <string name="category_personal" msgid="6236798763159385225">"ਨਿੱਜੀ"</string>
-    <string name="category_work" msgid="4014193632325996115">"ਦਫ਼ਤਰ"</string>
+    <string name="category_work" msgid="4014193632325996115">"ਕਾਰਜ-ਸਥਾਨ"</string>
     <string name="development_settings_title" msgid="140296922921597393">"ਵਿਕਾਸਕਾਰ ਵਿਕਲਪ"</string>
     <string name="development_settings_enable" msgid="4285094651288242183">"ਵਿਕਾਸਕਾਰ ਵਿਕਲਪਾਂ ਨੂੰ ਚਾਲੂ ਕਰੋ"</string>
     <string name="development_settings_summary" msgid="8718917813868735095">"ਐਪ ਵਿਕਾਸ ਲਈ ਚੋਣਾਂ ਸੈੱਟ ਕਰੋ"</string>
@@ -212,7 +212,7 @@
     <string name="adb_wireless_settings" msgid="2295017847215680229">"ਵਾਇਰਲੈੱਸ ਡੀਬੱਗਿੰਗ"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"ਉਪਲਬਧ ਡੀਵਾਈਸਾਂ ਨੂੰ ਦੇਖਣ ਅਤੇ ਵਰਤਣ ਲਈ, ਵਾਇਰਲੈੱਸ ਡੀਬੱਗਿੰਗ ਚਾਲੂ ਕਰੋ"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"QR ਕੋਡ ਨਾਲ ਡੀਵਾਈਸ ਨੂੰ ਜੋੜਾਬੱਧ ਕਰੋ"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"QR ਕੋਡ ਸਕੈਨਰ ਵਰਤ ਕੇ ਨਵੇਂ ਡੀਵਾਈਸਾਂ ਨੂੰ ਜੋੜਾਬੱਧ ਕਰੋ"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"QR ਕੋਡ ਸਕੈਨਰ ਵਰਤ ਕੇ ਨਵੇਂ ਡੀਵਾਈਸਾਂ ਨੂੰ ਜੋੜਾਬੱਧ ਕਰੋ"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"ਜੋੜਾਬੱਧਕਰਨ ਕੋਡ ਨਾਲ ਡੀਵਾਈਸ ਜੋੜਾਬੱਧ ਕਰੋ"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"ਛੇ ਅੰਕਾਂ ਵਾਲਾ ਕੋਡ ਵਰਤ ਕੇ ਨਵੇਂ ਡੀਵਾਈਸਾਂ ਨੂੰ ਜੋੜਾਬੱਧ ਕਰੋ"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"ਜੋੜਾਬੱਧ ਕੀਤੇ ਡੀਵਾਈਸ"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"ਡੀਵਾਈਸ ਨੂੰ ਜੋੜਾਬੱਧ ਕਰਨਾ ਅਸਫਲ ਰਿਹਾ। ਜਾਂ ਤਾਂ QR ਕੋਡ ਗਲਤ ਸੀ, ਜਾਂ ਡੀਵਾਈਸ ਉਸੇ ਨੈੱਟਵਰਕ ਨਾਲ ਕਨੈਕਟ ਨਹੀਂ ਹੈ।"</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"IP ਪਤਾ &amp; ਪੋਰਟ"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"QR ਕੋਡ ਸਕੈਨ ਕਰੋ"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"QR ਕੋਡ ਸਕੈਨ ਕਰਕੇ ਵਾਈ-ਫਾਈ \'ਤੇ ਡੀਵਾਈਸ ਜੋੜਾਬੱਧ ਕਰੋ"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"QR ਕੋਡ ਸਕੈਨ ਕਰਕੇ ਵਾਈ-ਫਾਈ \'ਤੇ ਡੀਵਾਈਸ ਜੋੜਾਬੱਧ ਕਰੋ"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"ਕਿਰਪਾ ਕਰਕੇ ਕਿਸੇ ਵਾਈ-ਫਾਈ ਨੈੱਟਵਰਕ ਨਾਲ ਕਨੈਕਟ ਕਰੋ"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, ਡੀਬੱਗ, dev"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"ਬੱਗ ਰਿਪੋਰਟ ਸ਼ਾਰਟਕੱਟ"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"ਵਾਇਰਲੈੱਸ ਡਿਸਪਲੇ ਪ੍ਰਮਾਣੀਕਰਨ"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"ਵਾਈ-ਫਾਈ ਵਰਬੋਸ ਲੌਗਿੰਗ ਚਾਲੂ ਕਰੋ"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"ਸੀਮਤ ਵਾਈ‑ਫਾਈ ਸਕੈਨ"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"ਵਾਈ-ਫਾਈ ਵਿਸਤ੍ਰਿਤ MAC ਬੇਤਰਤੀਬਵਾਰ"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"ਮੋਬਾਈਲ ਡਾਟਾ ਹਮੇਸ਼ਾਂ ਕਿਰਿਆਸ਼ੀਲ"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"ਟੈਦਰਿੰਗ ਹਾਰਡਵੇਅਰ ਐਕਸੈੱਲਰੇਸ਼ਨ"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"ਅਨਾਮ ਬਲੂਟੁੱਥ ਡੀਵਾਈਸਾਂ ਦਿਖਾਓ"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"ਵਾਇਰਲੈੱਸ ਡਿਸਪਲੇ ਪ੍ਰਮਾਣੀਕਰਨ ਲਈ ਚੋਣਾਂ ਪ੍ਰਦਰਸ਼ਿਤ ਕਰੋ"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"ਵਾਈ‑ਫਾਈ ਲੌਗਿੰਗ ਪੱਧਰ ਵਧਾਓ, ਵਾਈ‑ਫਾਈ Picker ਵਿੱਚ ਪ੍ਰਤੀ SSID RSSI ਦਿਖਾਓ"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"ਬੈਟਰੀ ਦੀ ਵਰਤੋਂ ਘਟਾ ਕੇ ਨੈੱਟਵਰਕ ਕਾਰਗੁਜ਼ਾਰੀ ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਂਦਾ ਹੈ"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"ਇਹ ਟੌਗਲ ਸਿਰਫ਼ ਕਲਾਇੰਟ ਮੋਡ ਲਈ MAC ਦੇ ਬੇਤਰਤੀਬਵਾਰ ਵਿਵਹਾਰ \'ਤੇ ਅਸਰ ਪਾਉਂਦਾ ਹੈ।\nਜਦੋਂ ਇਸ ਮੋਡ ਨੂੰ ਕਿਰਿਆਸ਼ੀਲ ਕੀਤਾ ਜਾਂਦਾ ਹੈ, ਤਾਂ ਜਿਹੜੇ ਵੀ ਨੈੱਟਵਰਕਾਂ ਵਿੱਚ MAC ਬੇਤਰਤੀਬਵਾਰ ਚਾਲੂ ਹੈ ਉਹਨਾਂ ਦੇ MAC ਪਤਿਆਂ ਦਾ ਸਾਂਝੇਦਾਰੀ ਦੌਰਾਨ ਮੁੜ-ਬੇਤਰਤੀਬੀਕਰਨ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ, ਜੋ ਕਲਾਇੰਟ ਦੇ ਪਿਛਲੀ ਵਾਰ ਨੈੱਟਵਰਕ ਤੋਂ ਡਿਸਕਨੈਕਟ ਹੋਣ \'ਤੇ ਨਿਰਭਰ ਕਰਦਾ ਹੈ। ਜੇ ਡੀਵਾਈਸ 4 ਘੰਟੇ ਜਾਂ ਘੱਟ ਸਮੇਂ ਵਿੱਚ ਮੁੜ-ਕਨੈਕਟ ਹੋ ਜਾਂਦਾ ਹੈ, ਤਾਂ ਮੁੜ-ਬੇਤਰਤੀਬਵਾਰ ਨਹੀਂ ਹੋਵੇਗਾ।"</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"ਮੀਟਰਬੱਧ ਕੀਤਾ ਗਿਆ"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"ਗੈਰ-ਮੀਟਰਬੱਧ ਕੀਤਾ ਗਿਆ"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"ਲੌਗਰ ਬਫ਼ਰ ਆਕਾਰ"</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"ਬੈਕਗ੍ਰਾਊਂਡ ਐਪਾਂ ਲਈ \'ਐਪ ਪ੍ਰਤਿਕਿਰਿਆ ਨਹੀਂ ਦੇ ਰਹੀ ਹੈ\' ਵਿੰਡੋ ਦਿਖਾਓ"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"ਸੂਚਨਾ ਚੈਨਲ ਚਿਤਾਵਨੀਆਂ ਦਿਖਾਓ"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"ਐਪ ਵੱਲੋਂ ਵੈਧ ਚੈਨਲ ਤੋਂ ਬਿਨਾਂ ਸੂਚਨਾ ਪੋਸਟ ਕਰਨ \'ਤੇ ਸਕ੍ਰੀਨ \'ਤੇ ਚਿਤਾਵਨੀ ਦਿਖਾਉਂਦੀ ਹੈ"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"ਗੱਲਬਾਤ ਸੰਬੰਧੀ ਸੂਚਨਾਵਾਂ ਲਈ ਸ਼ਾਰਟਕੱਟ ਲਾਗੂ ਕਰੋ"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"ਗੱਲਬਾਤ ਸੈਕਸ਼ਨ ਵਿੱਚ ਦਿਸਣ ਲਈ ਚਿਰਸਥਾਈ ਸਾਂਝਾਕਰਨ ਸ਼ਾਰਟਕੱਟ ਨਾਲ ਸੂਚਨਾਵਾਂ ਦਾ ਬੈਕਅੱਪ ਲੈਣਾ ਲੋੜੀਂਦਾ ਹੈ"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"ਐਪਾਂ ਨੂੰ ਜ਼ਬਰਦਸਤੀ ਬਾਹਰੀ ਸਟੋਰੇਜ \'ਤੇ ਆਗਿਆ ਦਿਓ"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"ਮੈਨੀਫੈਸਟ ਮੁੱਲਾਂ ਦੀ ਪਰਵਾਹ ਕੀਤੇ ਬਿਨਾਂ, ਕਿਸੇ ਵੀ ਐਪ ਨੂੰ ਬਾਹਰੀ ਸਟੋਰੇਜ \'ਤੇ ਲਿਖਣ ਦੇ ਯੋਗ ਬਣਾਉਂਦੀ ਹੈ"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"ਮੁੜ-ਆਕਾਰ ਬਦਲਣ ਲਈ ਸਰਗਰਮੀਆਂ \'ਤੇ ਜ਼ੋਰ ਦਿਓ"</string>
@@ -432,10 +436,14 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"ਲਗਭਗ <xliff:g id="TIME">%1$s</xliff:g> ਤੱਕ ਚੱਲੇਗੀ"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"<xliff:g id="TIME">%1$s</xliff:g> ਤੱਕ"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"ਬੈਟਰੀ <xliff:g id="TIME">%1$s</xliff:g> ਤੱਕ ਖਤਮ ਹੋ ਸਕਦੀ ਹੈ"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"<xliff:g id="THRESHOLD">%1$s</xliff:g> ਤੋਂ ਘੱਟ ਸਮਾਂ ਬਾਕੀ"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"<xliff:g id="THRESHOLD">%1$s</xliff:g> ਤੋਂ ਘੱਟ ਸਮਾਂ ਬਾਕੀ (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> ਤੋਂ ਵੱਧ ਸਮਾਂ ਬਾਕੀ (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> ਤੋਂ ਵੱਧ ਸਮਾਂ ਬਾਕੀ"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"ਫ਼ੋਨ ਛੇਤੀ ਹੀ ਬੰਦ ਹੋ ਸਕਦਾ ਹੈ"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"ਟੈਬਲੈੱਟ ਛੇਤੀ ਹੀ ਬੰਦ ਹੋ ਸਕਦਾ ਹੈ"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"ਡੀਵਾਈਸ ਛੇਤੀ ਹੀ ਬੰਦ ਹੋ ਸਕਦਾ ਹੈ"</string>
@@ -539,7 +547,7 @@
     <string name="user_add_user_type_title" msgid="551279664052914497">"ਸ਼ਾਮਲ ਕਰੋ"</string>
     <string name="user_new_user_name" msgid="60979820612818840">"ਨਵਾਂ ਵਰਤੋਂਕਾਰ"</string>
     <string name="user_new_profile_name" msgid="2405500423304678841">"ਨਵੀਂ ਪ੍ਰੋਫਾਈਲ"</string>
-    <string name="user_info_settings_title" msgid="6351390762733279907">"ਉਪਭੋਗਤਾ ਜਾਣਕਾਰੀ"</string>
+    <string name="user_info_settings_title" msgid="6351390762733279907">"ਵਰਤੋਂਕਾਰ ਜਾਣਕਾਰੀ"</string>
     <string name="profile_info_settings_title" msgid="105699672534365099">"ਪ੍ਰੋਫਾਈਲ ਜਾਣਕਾਰੀ"</string>
     <string name="user_need_lock_message" msgid="4311424336209509301">"ਇਸਤੋਂ ਪਹਿਲਾਂ ਕਿ ਤੁਸੀਂ ਇੱਕ ਪ੍ਰਤਿਬੰਧਿਤ ਪ੍ਰੋਫਾਈਲ ਬਣਾ ਸਕੋ, ਤੁਹਾਨੂੰ ਆਪਣੀਆਂ ਐਪਾਂ ਅਤੇ ਨਿੱਜੀ ਡਾਟਾ ਸੁਰੱਖਿਅਤ ਕਰਨ ਲਈ ਇੱਕ ਸਕ੍ਰੀਨ  ਲਾਕ  ਸੈੱਟ ਅੱਪ ਕਰਨ ਦੀ ਲੋੜ ਹੈ।"</string>
     <string name="user_set_lock_button" msgid="1427128184982594856">" ਲਾਕ  ਸੈੱਟ ਕਰੋ"</string>
diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml
index 734b257..d371c52 100644
--- a/packages/SettingsLib/res/values-pl/strings.xml
+++ b/packages/SettingsLib/res/values-pl/strings.xml
@@ -212,7 +212,7 @@
     <string name="adb_wireless_settings" msgid="2295017847215680229">"Debugowanie bezprzewodowe"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Aby wyświetlić dostępne urządzenia i ich używać, włącz debugowanie bezprzewodowe"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Sparuj urządzenie przy pomocy kodu QR"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"Sparuj nowe urządzenie, skanując kod QR"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"Sparuj nowe urządzenie, skanując kod QR"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Sparuj urządzenie przy pomocy kodu parowania"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Sparuj nowe urządzenie przy pomocy 6-cyfrowego kodu"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"Sparowane urządzenia"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Nie udało się sparować z urządzeniem. Kod QR jest nieprawidłowy albo urządzenie nie jest podłączone do tej samej sieci."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"Adres IP i port"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"Zeskanuj kod QR"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"Sparuj urządzenia przez Wi-Fi, skanując kod QR"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Sparuj urządzenia przez Wi-Fi, skanując kod QR"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Połącz się z siecią Wi-Fi"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, debug, dev"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"Skrót do zgłoszenia błędu"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"Wyświetlacz bezprzewodowy"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"Szczegółowy dziennik Wi-Fi"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"Ograniczanie skanowania Wi-Fi"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"Randomizacja MAC ulepszona w zakresie Wi‑Fi"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"Mobilna transmisja danych zawsze aktywna"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"Akceleracja sprzętowa tetheringu"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Pokaż urządzenia Bluetooth bez nazw"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Pokaż opcje certyfikacji wyświetlacza bezprzewodowego"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Zwiększ poziom rejestrowania Wi‑Fi, pokazuj według RSSI SSID w selektorze Wi‑Fi"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Zmniejsza zużycie baterii i zwiększa wydajność sieci"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Ten przełącznik wpływa na zachowanie randomizacji MAC tylko w przypadku trybu klienta.\nKiedy ten tryb jest aktywny, adresy MAC dowolnej sieci, która ma włączoną randomizację MAC, podczas powiązywania mogą zostać poddane ponownej randomizacji, w zależności od tego, kiedy klient ostatni raz rozłączył się z siecią. Ponowna randomizacja nie zachodzi, jeśli urządzenie połączy się ponownie w ciągu 4 lub mniejszej liczby godzin."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"Użycie danych jest mierzone"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"Użycie danych nie jest mierzone"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"Rozmiary bufora rejestratora"</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"Wyświetlaj okno Aplikacja nie odpowiada dla aplikacji w tle"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Pokaż ostrzeżenia kanału powiadomień"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Wyświetla ostrzeżenie, gdy aplikacja publikuje powiadomienie bez prawidłowego kanału"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Wymuszaj skróty do powiadomień o rozmowie"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Wymagaj używania długoterminowych skrótów do udostępniania powiadomień, które pojawiałyby się w sekcji rozmowy"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"Wymuś zezwalanie na aplikacje w pamięci zewnętrznej"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Pozwala na zapis aplikacji w pamięci zewnętrznej niezależnie od wartości w pliku manifestu"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"Wymuś zmianę rozmiaru okien aktywności"</string>
@@ -432,10 +436,14 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"Powinno wystarczyć do <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"Do <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Bateria może się wyczerpać do <xliff:g id="TIME">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"Pozostało mniej niż <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"Pozostało mniej niż <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"Pozostało ponad: <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"Pozostało ponad: <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"Wkrótce telefon może się wyłączyć"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"Tablet może się wkrótce wyłączyć"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"Urządzenie może się wkrótce wyłączyć"</string>
@@ -534,14 +542,14 @@
     <string name="user_add_user_message_long" msgid="1527434966294733380">"Z tego urządzenia możesz korzystać wraz z innymi osobami, dodając na nim konta użytkowników. Każdy użytkownik ma własne miejsce na swoje aplikacje, tapety i inne dane. Może też zmieniać ustawienia, które wpływają na wszystkich użytkowników urządzenia (np. Wi‑Fi).\n\nGdy dodasz nowego użytkownika, musi on skonfigurować swoje miejsce na dane.\n\nKażdy użytkownik może aktualizować aplikacje w imieniu wszystkich pozostałych użytkowników. Ułatwienia dostępu i usługi mogą nie zostać przeniesione na konto nowego użytkownika."</string>
     <string name="user_add_user_message_short" msgid="3295959985795716166">"Gdy dodasz nowego użytkownika, musi on skonfigurować swoją przestrzeń.\n\nKażdy użytkownik może aktualizować aplikacje wszystkich innych użytkowników."</string>
     <string name="user_setup_dialog_title" msgid="8037342066381939995">"Skonfigurować ustawienia dla użytkownika?"</string>
-    <string name="user_setup_dialog_message" msgid="269931619868102841">"Upewnij się, że ta osoba jest w pobliżu i może skonfigurować swój profil."</string>
+    <string name="user_setup_dialog_message" msgid="269931619868102841">"Upewnij się, że ta osoba jest w pobliżu i może skonfigurować swój profil"</string>
     <string name="user_setup_profile_dialog_message" msgid="4788197052296962620">"Skonfigurować teraz profil?"</string>
     <string name="user_setup_button_setup_now" msgid="1708269547187760639">"Skonfiguruj"</string>
     <string name="user_setup_button_setup_later" msgid="8712980133555493516">"Nie teraz"</string>
     <string name="user_add_user_type_title" msgid="551279664052914497">"Dodaj"</string>
     <string name="user_new_user_name" msgid="60979820612818840">"Nowy użytkownik"</string>
     <string name="user_new_profile_name" msgid="2405500423304678841">"Nowy profil"</string>
-    <string name="user_info_settings_title" msgid="6351390762733279907">"Użytkownik – informacje"</string>
+    <string name="user_info_settings_title" msgid="6351390762733279907">"Informacje o użytkowniku"</string>
     <string name="profile_info_settings_title" msgid="105699672534365099">"Informacje o profilu"</string>
     <string name="user_need_lock_message" msgid="4311424336209509301">"Zanim utworzysz profil z ograniczeniami, musisz skonfigurować ekran blokady, by chronić aplikacje i osobiste dane."</string>
     <string name="user_set_lock_button" msgid="1427128184982594856">"Ustaw blokadę"</string>
diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml
index d98c9ff..9124958 100644
--- a/packages/SettingsLib/res/values-pt-rBR/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml
@@ -161,7 +161,7 @@
     <string name="tts_default_pitch_title" msgid="6988592215554485479">"Tom de voz"</string>
     <string name="tts_default_pitch_summary" msgid="9132719475281551884">"Afeta o tom da voz sintetizada"</string>
     <string name="tts_default_lang_title" msgid="4698933575028098940">"Idioma"</string>
-    <string name="tts_lang_use_system" msgid="6312945299804012406">"Usa o idioma do sistema"</string>
+    <string name="tts_lang_use_system" msgid="6312945299804012406">"Usar o idioma do sistema"</string>
     <string name="tts_lang_not_selected" msgid="7927823081096056147">"Idioma não selecionado"</string>
     <string name="tts_default_lang_summary" msgid="9042620014800063470">"Define a voz específica do idioma para o texto falado"</string>
     <string name="tts_play_example_title" msgid="1599468547216481684">"Ouça um exemplo"</string>
@@ -212,7 +212,7 @@
     <string name="adb_wireless_settings" msgid="2295017847215680229">"Depuração por Wi-Fi"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Para ver e usar dispositivos disponíveis, ative a depuração por Wi-Fi"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Parear o dispositivo com um código QR"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"Parear novos dispositivos usando um leitor de código QR"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"Parear novos dispositivos usando um leitor de código QR"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Parear o dispositivo com um código de pareamento"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Parear novos dispositivos usando um código de seis dígitos"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"Dispositivos pareados"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Falha ao parear o dispositivo. O código QR está incorreto ou o dispositivo não está conectado à mesma rede."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"Endereço IP e porta"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"Ler código QR"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"Parear dispositivo na rede Wi‑Fi fazendo a leitura do código QR"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Parear dispositivo na rede Wi‑Fi fazendo a leitura do código QR"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Conecte-se a uma rede Wi-Fi"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, debug, dev"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"Atalho para relatório de bugs"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"Certificação de Display sem fio"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"Ativar registro detalhado de Wi-Fi"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"Limitar busca por Wi-Fi"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"MAC aleatório melhorado por Wi-Fi"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"Dados móveis sempre ativos"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"Aceleração de hardware de tethering"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Mostrar dispositivos Bluetooth sem nomes"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Mostrar opções de certificação de Display sem fio"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Aumentar o nível de registro de Wi-Fi; mostrar conforme o RSSI do SSID no seletor de Wi-Fi"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Reduz o consumo de bateria e melhora o desempenho da rede"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Essa opção afeta o comportamento de ordem aleatória de MAC somente para o modo cliente.\nQuando esse modo é ativado, todas as redes que tiverem a ordem aleatória de MAC ativada poderão ter a ordem aleatória refeita durante a associação, dependendo de quando o cliente se desconectou da rede pela última vez. A ordem aleatória não será refeita se o dispositivo se reconectar em até quatro horas."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"Limitada"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"Ilimitada"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"Tamanhos de buffer de logger"</string>
@@ -300,8 +302,8 @@
     <string name="tethering_hardware_offload_summary" msgid="7801345335142803029">"Usar aceleração de hardware de tethering quando disponível"</string>
     <string name="adb_warning_title" msgid="7708653449506485728">"Permitir a depuração USB?"</string>
     <string name="adb_warning_message" msgid="8145270656419669221">"A depuração USB serve apenas para fins de desenvolvimento. Use-a para copiar dados entre o computador e o dispositivo, instalar apps no seu aparelho sem notificação e ler dados de registro."</string>
-    <string name="adbwifi_warning_title" msgid="727104571653031865">"Permitir a depuração sem fio?"</string>
-    <string name="adbwifi_warning_message" msgid="8005936574322702388">"A depuração sem fio serve apenas para fins de desenvolvimento. Use-a para copiar dados entre o computador e o dispositivo, instalar apps no seu aparelho sem notificação e ler dados de registro."</string>
+    <string name="adbwifi_warning_title" msgid="727104571653031865">"Permitir a depuração por Wi-Fi?"</string>
+    <string name="adbwifi_warning_message" msgid="8005936574322702388">"A depuração por Wi-Fi serve apenas para fins de desenvolvimento. Use para copiar dados entre o computador e o dispositivo, instalar apps no seu aparelho sem notificação e ler dados de registro."</string>
     <string name="adb_keys_warning_message" msgid="2968555274488101220">"Revogar o acesso à depuração USB para todos os computadores autorizados?"</string>
     <string name="dev_settings_warning_title" msgid="8251234890169074553">"Ativar as configurações de desenvolvimento?"</string>
     <string name="dev_settings_warning_message" msgid="37741686486073668">"Essas configurações são destinadas apenas para o uso de desenvolvedores. Elas podem causar a desativação ou mau funcionamento do dispositivo e dos apps contidos nele."</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"Exibir a caixa de diálogo \"App não responde\" para apps em segundo plano"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Mostrar avisos de notificações"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Exibir aviso na tela quando um app posta notificação sem canal válido"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Usar atalhos para notificações de conversa"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Exigir que as notificações sejam apoiadas por um atalho de compartilhamento de longa duração para que elas possam aparecer na seção de conversa"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"Forçar permissão de apps em armazenamento externo"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Qualificar apps para gravação em armazenamento externo, independentemente de valores de manifestos"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"Forçar atividades a serem redimensionáveis"</string>
@@ -426,16 +430,20 @@
     <string name="power_discharging_duration_enhanced" msgid="1800465736237672323">"Tempo restante aproximado, com base no seu uso: <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
     <!-- no translation found for power_remaining_duration_only_short (7438846066602840588) -->
     <skip />
-    <string name="power_discharge_by_enhanced" msgid="563438403581662942">"Deve durar até cerca de <xliff:g id="TIME">%1$s</xliff:g> com base no seu uso (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_discharge_by_only_enhanced" msgid="3268796172652988877">"Deve durar até cerca de <xliff:g id="TIME">%1$s</xliff:g> com base no seu uso"</string>
-    <string name="power_discharge_by" msgid="4113180890060388350">"Deve durar até cerca de <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_discharge_by_only" msgid="92545648425937000">"Deve durar até cerca de <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <string name="power_discharge_by_enhanced" msgid="563438403581662942">"Deve durar até por volta de <xliff:g id="TIME">%1$s</xliff:g> com base no seu uso (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+    <string name="power_discharge_by_only_enhanced" msgid="3268796172652988877">"Deve durar até por volta de <xliff:g id="TIME">%1$s</xliff:g> com base no seu uso"</string>
+    <string name="power_discharge_by" msgid="4113180890060388350">"Deve durar até por volta de <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+    <string name="power_discharge_by_only" msgid="92545648425937000">"Deve durar até por volta de <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"Até <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"A bateria pode acabar neste horário: <xliff:g id="TIME">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"Menos de <xliff:g id="THRESHOLD">%1$s</xliff:g> restante(s)"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"Menos de <xliff:g id="THRESHOLD">%1$s</xliff:g> restante(s) (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"Mais de <xliff:g id="TIME_REMAINING">%1$s</xliff:g> restante(s) (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"Mais de <xliff:g id="TIME_REMAINING">%1$s</xliff:g> restante(s)"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"O smartphone pode ser desligado em breve"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"O tablet pode ser desligado em breve"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"O dispositivo pode ser desligado em breve"</string>
diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml
index c12f2d7..6082965 100644
--- a/packages/SettingsLib/res/values-pt-rPT/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml
@@ -212,7 +212,7 @@
     <string name="adb_wireless_settings" msgid="2295017847215680229">"Depuração sem fios"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Para ver e utilizar dispositivos disponíveis, ative a depuração sem fios."</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Sincronize o dispositivo com o código QR"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"Sincronize novos dispositivos com o leitor de códigos QR."</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"Sincronize novos dispositivos com o leitor de códigos QR."</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Sincronize dispositivo com código de sincronização"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Sincronize novos dispositivos através do código de seis dígitos."</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"Dispositivos sincronizados"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Falha ao sincronizar o dispositivo. O código QR estava incorreto ou o dispositivo não está ligado à mesma rede."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"Porta e endereço IP"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"Leia o código QR"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"Sincronize o dispositivo através de Wi-Fi ao ler um código QR."</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Sincronize o dispositivo através de Wi-Fi ao ler um código QR."</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Estabeleça ligação a uma rede Wi-Fi."</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, depurar, programador"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"Atalho para relatório de erro"</string>
@@ -242,7 +242,7 @@
     <string name="bt_hci_snoop_log_summary" msgid="6808538971394092284">"Capturar os pacotes Bluetooth (ative/desative o Bluetooth após alterar esta definição)"</string>
     <string name="oem_unlock_enable" msgid="5334869171871566731">"Desbloqueio de OEM"</string>
     <string name="oem_unlock_enable_summary" msgid="5857388174390953829">"Permitir o desbloqueio do carregador de arranque"</string>
-    <string name="confirm_enable_oem_unlock_title" msgid="8249318129774367535">"Pretende permitir o desbloqueio de OEM?"</string>
+    <string name="confirm_enable_oem_unlock_title" msgid="8249318129774367535">"Permitir o desbloqueio de OEM?"</string>
     <string name="confirm_enable_oem_unlock_text" msgid="854131050791011970">"AVISO: as funcionalidades de proteção do dispositivo não funcionam neste dispositivo enquanto esta definição estiver ativada."</string>
     <string name="mock_location_app" msgid="6269380172542248304">"Selecionar aplicação de localização fictícia"</string>
     <string name="mock_location_app_not_set" msgid="6972032787262831155">"Aplicação de localização fictícia não definida"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"Certificação de display sem fios"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"Ativar o registo verboso de Wi-Fi"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"Controlo da procura de Wi‑Fi"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"Seleção aleatória do MAC otimizado Wi-Fi"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"Dados móveis sempre ativos"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"Aceleração de hardware para ligação (à Internet) via telemóvel"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Mostrar dispositivos Bluetooth sem nomes"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Mostrar opções da certificação de display sem fios"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Aumentar o nível de reg. de Wi-Fi, mostrar por RSSI de SSID no Selec. de Wi-Fi"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Reduz o consumo rápido da bateria e melhora o desempenho da rede"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Este botão ativar/desativar afeta o comportamento da seleção aleatória do MAC apenas para o modo de cliente.\nQuando este modo está ativado, qualquer rede que tenha a seleção aleatória do MAC ativa pode fazer com que os seus endereços MAC sejam novamente selecionados de forma aleatória durante a associação, dependendo de quando o cliente se desligou da rede pela última vez. A nova seleção aleatória não ocorre se a ligação do dispositivo for restabelecida em 4 horas ou menos."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"Acesso limitado"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"Acesso ilimitado"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"Tamanhos da memória intermédia do registo"</string>
@@ -300,7 +302,7 @@
     <string name="tethering_hardware_offload_summary" msgid="7801345335142803029">"Se disponível, utilizar a aceleração de hardware para ligação (à Internet) via telemóvel"</string>
     <string name="adb_warning_title" msgid="7708653449506485728">"Permitir depuração USB?"</string>
     <string name="adb_warning_message" msgid="8145270656419669221">"A depuração USB é utilizada apenas para fins de programação. Utilize-a para copiar dados entre o computador e o aparelho, instalar aplicações no aparelho sem notificação e ler dados de registo."</string>
-    <string name="adbwifi_warning_title" msgid="727104571653031865">"Pretende permitir a depuração sem fios?"</string>
+    <string name="adbwifi_warning_title" msgid="727104571653031865">"Permitir a depuração sem fios?"</string>
     <string name="adbwifi_warning_message" msgid="8005936574322702388">"A depuração sem fios é utilizada apenas para fins de programação. Utilize-a para copiar dados entre o computador e o dispositivo, instalar apps no dispositivo sem notificação e ler dados de registo."</string>
     <string name="adb_keys_warning_message" msgid="2968555274488101220">"Revogar acesso à depuração USB de todos os computadores anteriormente autorizados?"</string>
     <string name="dev_settings_warning_title" msgid="8251234890169074553">"Permitir definições de programação?"</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"Mostrar caixa de diálogo A aplicação não está a responder para aplicações em segundo plano"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Mostrar avisos do canal de notificações"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Mostra um aviso no ecrã quando uma aplicação publica uma notificação sem o canal ser válido"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Aplicar atalhos para notificações de conversas"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Solicitar cópia de seg. das notif. por atalho de partilha de longa duração p/ apresentação na secção de conversas"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"Forçar permissão de apps no armazenamento externo"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Torna qualquer aplicação elegível para ser gravada no armazenamento externo, independentemente dos valores do manifesto"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"Forçar as atividades a serem redimensionáveis"</string>
@@ -432,10 +436,14 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"Deve durar até cerca da(s) <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"Até à(s) <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Poderá ficar sem bateria à(s) <xliff:g id="TIME">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"Resta(m) menos de <xliff:g id="THRESHOLD">%1$s</xliff:g>."</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"Resta(m) menos de <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)."</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"Resta(m) mais de <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)."</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"Resta(m) mais de <xliff:g id="TIME_REMAINING">%1$s</xliff:g>."</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"O telemóvel poderá ser encerrado em breve"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"O tablet poderá ser encerrado em breve"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"O dispositivo poderá ser encerrado em breve"</string>
@@ -451,7 +459,7 @@
     <string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Carregamento lento"</string>
     <string name="battery_info_status_discharging" msgid="6962689305413556485">"Não está a carregar"</string>
     <string name="battery_info_status_not_charging" msgid="8330015078868707899">"Ligada à corrente, não é possível carregar neste momento"</string>
-    <string name="battery_info_status_full" msgid="4443168946046847468">"Completo"</string>
+    <string name="battery_info_status_full" msgid="4443168946046847468">"Carregada"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Controlado pelo gestor"</string>
     <string name="disabled" msgid="8017887509554714950">"Desativada"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"Autorizada"</string>
diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml
index d98c9ff..9124958 100644
--- a/packages/SettingsLib/res/values-pt/strings.xml
+++ b/packages/SettingsLib/res/values-pt/strings.xml
@@ -161,7 +161,7 @@
     <string name="tts_default_pitch_title" msgid="6988592215554485479">"Tom de voz"</string>
     <string name="tts_default_pitch_summary" msgid="9132719475281551884">"Afeta o tom da voz sintetizada"</string>
     <string name="tts_default_lang_title" msgid="4698933575028098940">"Idioma"</string>
-    <string name="tts_lang_use_system" msgid="6312945299804012406">"Usa o idioma do sistema"</string>
+    <string name="tts_lang_use_system" msgid="6312945299804012406">"Usar o idioma do sistema"</string>
     <string name="tts_lang_not_selected" msgid="7927823081096056147">"Idioma não selecionado"</string>
     <string name="tts_default_lang_summary" msgid="9042620014800063470">"Define a voz específica do idioma para o texto falado"</string>
     <string name="tts_play_example_title" msgid="1599468547216481684">"Ouça um exemplo"</string>
@@ -212,7 +212,7 @@
     <string name="adb_wireless_settings" msgid="2295017847215680229">"Depuração por Wi-Fi"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Para ver e usar dispositivos disponíveis, ative a depuração por Wi-Fi"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Parear o dispositivo com um código QR"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"Parear novos dispositivos usando um leitor de código QR"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"Parear novos dispositivos usando um leitor de código QR"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Parear o dispositivo com um código de pareamento"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Parear novos dispositivos usando um código de seis dígitos"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"Dispositivos pareados"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Falha ao parear o dispositivo. O código QR está incorreto ou o dispositivo não está conectado à mesma rede."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"Endereço IP e porta"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"Ler código QR"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"Parear dispositivo na rede Wi‑Fi fazendo a leitura do código QR"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Parear dispositivo na rede Wi‑Fi fazendo a leitura do código QR"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Conecte-se a uma rede Wi-Fi"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, debug, dev"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"Atalho para relatório de bugs"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"Certificação de Display sem fio"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"Ativar registro detalhado de Wi-Fi"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"Limitar busca por Wi-Fi"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"MAC aleatório melhorado por Wi-Fi"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"Dados móveis sempre ativos"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"Aceleração de hardware de tethering"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Mostrar dispositivos Bluetooth sem nomes"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Mostrar opções de certificação de Display sem fio"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Aumentar o nível de registro de Wi-Fi; mostrar conforme o RSSI do SSID no seletor de Wi-Fi"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Reduz o consumo de bateria e melhora o desempenho da rede"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Essa opção afeta o comportamento de ordem aleatória de MAC somente para o modo cliente.\nQuando esse modo é ativado, todas as redes que tiverem a ordem aleatória de MAC ativada poderão ter a ordem aleatória refeita durante a associação, dependendo de quando o cliente se desconectou da rede pela última vez. A ordem aleatória não será refeita se o dispositivo se reconectar em até quatro horas."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"Limitada"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"Ilimitada"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"Tamanhos de buffer de logger"</string>
@@ -300,8 +302,8 @@
     <string name="tethering_hardware_offload_summary" msgid="7801345335142803029">"Usar aceleração de hardware de tethering quando disponível"</string>
     <string name="adb_warning_title" msgid="7708653449506485728">"Permitir a depuração USB?"</string>
     <string name="adb_warning_message" msgid="8145270656419669221">"A depuração USB serve apenas para fins de desenvolvimento. Use-a para copiar dados entre o computador e o dispositivo, instalar apps no seu aparelho sem notificação e ler dados de registro."</string>
-    <string name="adbwifi_warning_title" msgid="727104571653031865">"Permitir a depuração sem fio?"</string>
-    <string name="adbwifi_warning_message" msgid="8005936574322702388">"A depuração sem fio serve apenas para fins de desenvolvimento. Use-a para copiar dados entre o computador e o dispositivo, instalar apps no seu aparelho sem notificação e ler dados de registro."</string>
+    <string name="adbwifi_warning_title" msgid="727104571653031865">"Permitir a depuração por Wi-Fi?"</string>
+    <string name="adbwifi_warning_message" msgid="8005936574322702388">"A depuração por Wi-Fi serve apenas para fins de desenvolvimento. Use para copiar dados entre o computador e o dispositivo, instalar apps no seu aparelho sem notificação e ler dados de registro."</string>
     <string name="adb_keys_warning_message" msgid="2968555274488101220">"Revogar o acesso à depuração USB para todos os computadores autorizados?"</string>
     <string name="dev_settings_warning_title" msgid="8251234890169074553">"Ativar as configurações de desenvolvimento?"</string>
     <string name="dev_settings_warning_message" msgid="37741686486073668">"Essas configurações são destinadas apenas para o uso de desenvolvedores. Elas podem causar a desativação ou mau funcionamento do dispositivo e dos apps contidos nele."</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"Exibir a caixa de diálogo \"App não responde\" para apps em segundo plano"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Mostrar avisos de notificações"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Exibir aviso na tela quando um app posta notificação sem canal válido"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Usar atalhos para notificações de conversa"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Exigir que as notificações sejam apoiadas por um atalho de compartilhamento de longa duração para que elas possam aparecer na seção de conversa"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"Forçar permissão de apps em armazenamento externo"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Qualificar apps para gravação em armazenamento externo, independentemente de valores de manifestos"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"Forçar atividades a serem redimensionáveis"</string>
@@ -426,16 +430,20 @@
     <string name="power_discharging_duration_enhanced" msgid="1800465736237672323">"Tempo restante aproximado, com base no seu uso: <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
     <!-- no translation found for power_remaining_duration_only_short (7438846066602840588) -->
     <skip />
-    <string name="power_discharge_by_enhanced" msgid="563438403581662942">"Deve durar até cerca de <xliff:g id="TIME">%1$s</xliff:g> com base no seu uso (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_discharge_by_only_enhanced" msgid="3268796172652988877">"Deve durar até cerca de <xliff:g id="TIME">%1$s</xliff:g> com base no seu uso"</string>
-    <string name="power_discharge_by" msgid="4113180890060388350">"Deve durar até cerca de <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_discharge_by_only" msgid="92545648425937000">"Deve durar até cerca de <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <string name="power_discharge_by_enhanced" msgid="563438403581662942">"Deve durar até por volta de <xliff:g id="TIME">%1$s</xliff:g> com base no seu uso (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+    <string name="power_discharge_by_only_enhanced" msgid="3268796172652988877">"Deve durar até por volta de <xliff:g id="TIME">%1$s</xliff:g> com base no seu uso"</string>
+    <string name="power_discharge_by" msgid="4113180890060388350">"Deve durar até por volta de <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+    <string name="power_discharge_by_only" msgid="92545648425937000">"Deve durar até por volta de <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"Até <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"A bateria pode acabar neste horário: <xliff:g id="TIME">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"Menos de <xliff:g id="THRESHOLD">%1$s</xliff:g> restante(s)"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"Menos de <xliff:g id="THRESHOLD">%1$s</xliff:g> restante(s) (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"Mais de <xliff:g id="TIME_REMAINING">%1$s</xliff:g> restante(s) (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"Mais de <xliff:g id="TIME_REMAINING">%1$s</xliff:g> restante(s)"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"O smartphone pode ser desligado em breve"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"O tablet pode ser desligado em breve"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"O dispositivo pode ser desligado em breve"</string>
diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml
index 5860409..fa43c13 100644
--- a/packages/SettingsLib/res/values-ro/strings.xml
+++ b/packages/SettingsLib/res/values-ro/strings.xml
@@ -206,13 +206,13 @@
     <string name="enable_adb" msgid="8072776357237289039">"Remedierea erorilor prin USB"</string>
     <string name="enable_adb_summary" msgid="3711526030096574316">"Mod de depanare când este conectat USB"</string>
     <string name="clear_adb_keys" msgid="3010148733140369917">"Revoc autorizații remediere a erorilor prin USB"</string>
-    <string name="enable_adb_wireless" msgid="6973226350963971018">"Remedierea erorilor prin wireless"</string>
+    <string name="enable_adb_wireless" msgid="6973226350963971018">"Remedierea erorilor wireless"</string>
     <string name="enable_adb_wireless_summary" msgid="7344391423657093011">"Modul de remediere a erorilor când rețeaua Wi-Fi este conectată"</string>
     <string name="adb_wireless_error" msgid="721958772149779856">"Eroare"</string>
-    <string name="adb_wireless_settings" msgid="2295017847215680229">"Remedierea erorilor prin wireless"</string>
+    <string name="adb_wireless_settings" msgid="2295017847215680229">"Remedierea erorilor wireless"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Activați remedierea erorilor wireless pentru a vedea și a folosi dispozitivele disponibile"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Asociați dispozitivul folosind codul QR"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"Asociați dispozitive noi folosind scannerul de coduri QR"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"Asociați dispozitive noi folosind scannerul de coduri QR"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Asociați dispozitivul folosind codul de conectare"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Asociați dispozitive noi folosind codul din șase cifre"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"Dispozitive asociate"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Nu s-a asociat dispozitivul. Codul QR este incorect sau dispozitivul nu este conectat la aceeași rețea."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"Adresa IP și portul"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"Scanați codul QR"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"Asociați dispozitivul prin Wi-Fi scanând un cod QR"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Asociați dispozitivul prin Wi-Fi scanând un cod QR"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Conectați-vă la o rețea Wi-Fi"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, remedierea erorilor, dev"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"Comandă rapidă pentru raportul de erori"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"Certificare Ecran wireless"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"Înregistrare prin Wi-Fi de volume mari de date"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"Limitare căutare de rețele Wi-Fi"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"Randomizare MAC îmbunătățită prin Wi-Fi"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"Date mobile permanent active"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"Accelerare hardware pentru tethering"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Afișați dispozitivele Bluetooth fără nume"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Afișați opțiunile pentru certificarea Ecran wireless"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Măriți niv. de înr. prin Wi‑Fi, afișați în fcț. de SSID RSSI în Selectorul Wi‑Fi"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Reduce descărcarea bateriei și îmbunătățește performanța rețelei"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Acest comutator influențează comportamentul de randomizare a adresei MAC numai pentru modul client.\nCând este activat acest mod, toate rețelele care au activată randomizarea adresei MAC pot randomiza din nou adresele MAC în timpul asocierii, în funcție de ora ultimei deconectări a clientului de la rețea. Randomizarea nu se repetă dacă dispozitivul se reconectează în decurs de 4 ore."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"Contorizată"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"Necontorizată"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"Dimensiunile memoriei temporare a jurnalului"</string>
@@ -300,8 +302,8 @@
     <string name="tethering_hardware_offload_summary" msgid="7801345335142803029">"Folosiți accelerarea hardware pentru tethering, dacă este disponibilă"</string>
     <string name="adb_warning_title" msgid="7708653449506485728">"Permiteți remedierea erorilor prin USB?"</string>
     <string name="adb_warning_message" msgid="8145270656419669221">"Remedierea erorilor prin USB are exclusiv scopuri de dezvoltare. Utilizați-o pentru a copia date de pe computer pe dispozitiv, pentru a instala aplicații pe dispozitiv fără notificare și pentru a citi datele din jurnale."</string>
-    <string name="adbwifi_warning_title" msgid="727104571653031865">"Permiteți remedierea erorilor prin wireless?"</string>
-    <string name="adbwifi_warning_message" msgid="8005936574322702388">"Remedierea erorilor prin wireless are exclusiv scopuri de dezvoltare. Folosiți-o pentru a copia date de pe computer pe dispozitiv, pentru a instala aplicații pe dispozitiv fără notificare și pentru a citi datele din jurnale."</string>
+    <string name="adbwifi_warning_title" msgid="727104571653031865">"Permiteți remedierea erorilor wireless?"</string>
+    <string name="adbwifi_warning_message" msgid="8005936574322702388">"Remedierea erorilor wireless are exclusiv scopuri de dezvoltare. Folosiți-o pentru a copia date de pe computer pe dispozitiv, pentru a instala aplicații pe dispozitiv fără notificare și pentru a citi datele din jurnale."</string>
     <string name="adb_keys_warning_message" msgid="2968555274488101220">"Revocați accesul la remedierea erorilor prin USB de pe toate computerele pe care le-ați autorizat anterior?"</string>
     <string name="dev_settings_warning_title" msgid="8251234890169074553">"Permiteți setările pentru dezvoltare?"</string>
     <string name="dev_settings_warning_message" msgid="37741686486073668">"Aceste setări sunt destinate exclusiv utilizării pentru dezvoltare. Din cauza lor, este posibil ca dispozitivul dvs. și aplicațiile de pe acesta să nu mai funcționeze sau să funcționeze necorespunzător."</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"Afișați dialogul Aplicația nu răspunde pentru aplicațiile din fundal"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Afișați avertismentele de pe canalul de notificări"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Afișați avertisment pe ecran când o aplicație postează o notificare fără canal valid"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Comenzi rapide pt. notif. de conversație"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Notificările trebuie susținute de o comandă rapidă veche de trimitere ca să apară în secțiunea conversației"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"Forțați accesul aplicațiilor la stocarea externă"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Faceți ca orice aplicație eligibilă să fie scrisă în stocarea externă, indiferent de valorile manifestului"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"Forțați redimensionarea activităților"</string>
@@ -432,10 +436,14 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"Ar trebui să reziste până la <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"Până la <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Bateria se poate descărca până la <xliff:g id="TIME">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"a mai rămas mai puțin de <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"A mai rămas mai puțin de <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"A mai rămas mai mult de <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"A mai rămas mai mult de <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"Telefonul se poate închide în curând"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"Tableta se poate închide în curând"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"Dispozitivul se poate închide în curând"</string>
diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml
index ab230b7..bb06071 100644
--- a/packages/SettingsLib/res/values-ru/strings.xml
+++ b/packages/SettingsLib/res/values-ru/strings.xml
@@ -112,7 +112,7 @@
     <string name="bluetooth_opp_profile_summary_use_for" msgid="461981154387015457">"Используется для передачи файлов"</string>
     <string name="bluetooth_hid_profile_summary_use_for" msgid="4289460627406490952">"Использовать для ввода"</string>
     <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="7689393730163320483">"Использовать для слухового аппарата"</string>
-    <string name="bluetooth_pairing_accept" msgid="2054232610815498004">"Подключить"</string>
+    <string name="bluetooth_pairing_accept" msgid="2054232610815498004">"Добавить"</string>
     <string name="bluetooth_pairing_accept_all_caps" msgid="2734383073450506220">"ДОБАВИТЬ"</string>
     <string name="bluetooth_pairing_decline" msgid="6483118841204885890">"Отмена"</string>
     <string name="bluetooth_pairing_will_share_phonebook" msgid="3064334458659165176">"Установление соединения обеспечивает доступ к вашим контактам и журналу звонков при подключении."</string>
@@ -194,8 +194,8 @@
     <item msgid="581904787661470707">"Максимальная"</item>
   </string-array>
     <string name="choose_profile" msgid="343803890897657450">"Выбор профиля"</string>
-    <string name="category_personal" msgid="6236798763159385225">"Личные данные"</string>
-    <string name="category_work" msgid="4014193632325996115">"Работа"</string>
+    <string name="category_personal" msgid="6236798763159385225">"Личный профиль"</string>
+    <string name="category_work" msgid="4014193632325996115">"Рабочий профиль"</string>
     <string name="development_settings_title" msgid="140296922921597393">"Для разработчиков"</string>
     <string name="development_settings_enable" msgid="4285094651288242183">"Включить параметры для разработчиков"</string>
     <string name="development_settings_summary" msgid="8718917813868735095">"Настройка параметров для разработчиков"</string>
@@ -212,7 +212,7 @@
     <string name="adb_wireless_settings" msgid="2295017847215680229">"Отладка по Wi-Fi"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Чтобы посмотреть и использовать доступные устройства, включите отладку по Wi-Fi"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Подключить устройство с помощью QR-кода"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"Подключение новых устройств с помощью сканера QR-кодов"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"Подключение новых устройств с помощью сканера QR-кодов"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Подключить устройство с помощью кода подключения"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Подключение новых устройств с помощью шестизначного кода"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"Подключенные устройства"</string>
@@ -230,8 +230,8 @@
     <string name="adb_wireless_verifying_qrcode_text" msgid="6123192424916029207">"Подключение устройства…"</string>
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Не удалось подключить устройство. QR-код неверный, или устройство находится в другой сети."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"IP-адрес и порт"</string>
-    <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"Сканировать QR-код"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"Подключение устройства через Wi‑Fi с использованием QR-кода"</string>
+    <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"Отсканируйте QR-код"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Подключение устройства через Wi‑Fi с использованием QR-кода"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Подключите устройство к сети Wi-Fi."</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, отладка, разработчик"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"Отчет об ошибке"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"Серт. беспроводн. мониторов"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"Подробный журнал Wi‑Fi"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"Ограничивать поиск сетей Wi‑Fi"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"Случайные MAC-адреса в сети Wi-Fi"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"Не отключать мобильный Интернет"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"Аппаратное ускорение в режиме модема"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Показывать Bluetooth-устройства без названий"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Показывать параметры сертификации беспроводных мониторов"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Вести подробный журнал, показывать RSSI для каждого SSID при выборе сети"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Уменьшает расход заряда батареи и улучшает работу сети"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Эта настройка влияет на использование случайных MAC-адресов только в клиентском режиме.\nВо время подключения к любой сети происходит повторное создание случайного MAC-адреса в зависимости от того, когда клиент последний раз отключался от сети. Это не происходит, если соединение возобновляется через четыре часа или раньше."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"Сеть с тарификацией трафика"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"Сеть без тарификации трафика"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"Размер буфера журнала"</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"Уведомлять о том, что приложение, запущенное в фоновом режиме, не отвечает"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Показывать предупреждения канала передачи уведомлений"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Показывать предупреждение о новых уведомлениях приложения вне допустимого канала"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Принудительное использование ярлыков для уведомлений из чатов"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Обязательно дублировать уведомления с помощью долго отображаемых ярлыков, чтобы уведомления появлялись в разделе чатов"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"Разрешить сохранение на внешние накопители"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Разрешить сохранение приложений на внешних накопителях (независимо от значений в манифесте)"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"Изменение размера в многооконном режиме"</string>
@@ -432,10 +436,14 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"Заряда хватит примерно до <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"До <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Батарея может разрядиться к <xliff:g id="TIME">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"Осталось менее <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"Уровень заряда батареи: <xliff:g id="LEVEL">%2$s</xliff:g> (хватит менее чем на <xliff:g id="THRESHOLD">%1$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"Уровень заряда батареи: <xliff:g id="LEVEL">%2$s</xliff:g> (хватит более чем на <xliff:g id="TIME_REMAINING">%1$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"Хватит более чем на <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"Телефон скоро выключится"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"Планшет скоро выключится"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"Устройство скоро выключится"</string>
@@ -534,7 +542,7 @@
     <string name="user_add_user_message_long" msgid="1527434966294733380">"Если этим устройством пользуются сразу несколько человек, для каждого из них можно создать отдельный профиль – практически собственное пространство со своими приложениями, обоями и т. д. При этом из профиля можно поменять и настройки устройства, общие для всех, например выбрать сеть Wi-Fi.\n\nКогда вы добавляете нового пользователя, ему нужно настроить свой профиль.\n\nОбновлять общие приложения может любой пользователь, однако специальные возможности настраиваются индивидуально."</string>
     <string name="user_add_user_message_short" msgid="3295959985795716166">"После создания профиля его потребуется настроить.\n\nЛюбой пользователь устройства может обновлять приложения для всех аккаунтов."</string>
     <string name="user_setup_dialog_title" msgid="8037342066381939995">"Настроить профиль?"</string>
-    <string name="user_setup_dialog_message" msgid="269931619868102841">"Вам потребуется передать устройство пользователю, чтобы он мог настроить свое личное пространство."</string>
+    <string name="user_setup_dialog_message" msgid="269931619868102841">"Вам потребуется передать устройство пользователю, чтобы он мог настроить свой профиль."</string>
     <string name="user_setup_profile_dialog_message" msgid="4788197052296962620">"Настроить профиль?"</string>
     <string name="user_setup_button_setup_now" msgid="1708269547187760639">"Настроить"</string>
     <string name="user_setup_button_setup_later" msgid="8712980133555493516">"Не сейчас"</string>
diff --git a/packages/SettingsLib/res/values-si/strings.xml b/packages/SettingsLib/res/values-si/strings.xml
index d87e288..9595bd1 100644
--- a/packages/SettingsLib/res/values-si/strings.xml
+++ b/packages/SettingsLib/res/values-si/strings.xml
@@ -212,7 +212,7 @@
     <string name="adb_wireless_settings" msgid="2295017847215680229">"නොරැහැන් දෝෂාවේක්ෂණය"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"ලබා ගත හැකි උපාංග බැලීමට, නොරැහැන් දෝෂාවේක්ෂණය ක්‍රියාත්මක කරන්න"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"QR කේතය සමගින් උපාංගය යුගල කරන්න"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"QR කේත ස්කෑනරය භාවිතයෙන් නව උපාංග යුගල කරන්න"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"QR කේත ස්කෑනරය භාවිතයෙන් නව උපාංග යුගල කරන්න"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"යුගල කිරීමේ කේතය සමගින් උපාංගය යුගල කරන්න"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"ඉලක්කම් හයක කේතය භාවිතයෙන් නව උපාංග යුගල කරන්න"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"යුගල කළ උපාංග"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"උපාංගය යුගල කිරීමට අසමත් විය. QR කේතය වැරදිය නැතහොත් එකම ජාලයට සම්බන්ධ කර නැත."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"IP ලිපිනය &amp; තොට"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"QR කේතය ස්කෑන් කරන්න"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"QR කේතය ස්කෑන් කිරීමෙන් Wi‑Fi හරහා උපාංගය යුගල කරන්න"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"QR කේතය ස්කෑන් කිරීමෙන් Wi‑Fi හරහා උපාංගය යුගල කරන්න"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"කරුණාකර Wi-Fi ජාලයකට සම්බන්ධ වන්න"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, දෝෂාවෙක්ෂණ, dev"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"දෝෂය වාර්තා කිරීමේ කෙටිමඟ"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"නොරැහැන් සංදර්ශක සහතිකය"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"විස්තරාත්මක Wi‑Fi ලොග් කිරීම සබල කරන්න"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"Wi‑Fi ස්කෑන් අවකරණය"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"Wi-Fi‑වැඩිදියුණු කළ MAC සසම්භාවීකරණය"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"ජංගම දත්ත සැමවිට ක්‍රියාකාරීය"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"ටෙදරින් දෘඪාංග ත්වරණය"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"නම් නොමැති බ්ලූටූත් උපාංග පෙන්වන්න"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"නොරැහැන් සංදර්ශක සහතිකය සඳහා විකල්ප පෙන්වන්න"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Wi‑Fi ලොග් මට්ටම වැඩි කරන්න, Wi‑Fi තෝරනයෙහි SSID RSSI අනුව පෙන්වන්න"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"බැටරි බැසීම අඩු කරන අතර ජාල කාර්ය සාධනය වැඩි දියුණු කරයි"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"මෙම ටොගලය සේවාලාභී ප්‍රකාරය සඳහා පමණක් MAC සසම්භාවීකරණ හැසිරීමට බලපායි.\nමෙම ප්‍රකාරය සක්‍රිය කර ඇති විට, MAC සසම්භාවීකරණය සබල කර ඇති ඕනෑම ජාලයකට, සේවාලාභියා අවසන් වරට ජාලයෙන් විසන්ධි වූයේ කවදාද යන්න මත පදනම්ව සම්බන්ධය අතරතුර ඔවුන්ගේ MAC ලිපින යළි සසම්භාවිකරණය කර තිබිය හැකිය. උපාංගය පැය 4කින් හෝ ඊට අඩු කාලයකදී නැවත සම්බන්ධ වන්නේ නම් යළි සසම්භාවිකරණය සිදු නොවේ."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"මනිනු ලැබේ"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"මනින්නේ නැත"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"ලෝගයේ අන්තරාවක ප්‍රමාණය"</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"පසුබිම් යෙදුම්වලට යෙදුම ප්‍රතිචාර නොදක්වයි කවුළුව සංදර්ශනය කරන්න"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"දැනුම්දීම් නාලිකා අනතුරු ඇඟවීම් පෙන්."</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"යෙදුමක් වලංගු නාලිකාවකින් තොරව දැනුම්දීමක් පළ කරන විට තිරය-මත අනතුරු ඇඟවීමක් සංදර්ශනය කරයි."</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"සංවාද දැනුම් දීම් සඳහා කෙටිමං බලාත්මක කරන්න"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"සංවාද කොටසේ පෙනී සිටීම පිණිස දිගු කාලයක් පවතින බෙදා ගැනීමේ කෙටිමඟක් මඟින් දැනුම් දීම් අවහිර කිරීමට අවශ්‍ය වේ"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"බාහිර මත යෙදුම් ඉඩ දීම බල කරන්න"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"මැනිෆෙස්ට් අගයන් නොසලකා, ඕනෑම යෙදුමක් බාහිර ගබඩාවට ලිවීමට සුදුසුකම් ලබා දෙයි"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"ක්‍රියාකාරකම් ප්‍රතිප්‍රමාණ කළ හැකි බවට බල කරන්න"</string>
@@ -432,10 +436,14 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"<xliff:g id="TIME">%1$s</xliff:g> පමණ වන තෙක් තිබිය යුතුය"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"<xliff:g id="TIME">%1$s</xliff:g> දක්වා"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"බැටරි බලය <xliff:g id="TIME">%1$s</xliff:g> වන විට අවසන් විය හැකිය"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"<xliff:g id="THRESHOLD">%1$s</xliff:g>ට වඩා අඩුවෙන් ඉතිරිව ඇත"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"<xliff:g id="THRESHOLD">%1$s</xliff:g>ට වඩා අඩුවෙන් ඉතිරිය (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g>ට වඩා වැඩියෙන් ඉතිරිය (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g>කට වඩා වැඩියෙන් ඉතිරිය"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"දුරකථනය ඉක්මනින් වැසිය හැකිය"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"ටැබ්ලට් පරිගණකය ඉක්මනින් වැසිය හැකිය"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"උපාංගය ඉක්මනින් වැසිය හැකිය"</string>
diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml
index 73cfce1..ea8cf73 100644
--- a/packages/SettingsLib/res/values-sk/strings.xml
+++ b/packages/SettingsLib/res/values-sk/strings.xml
@@ -212,7 +212,7 @@
     <string name="adb_wireless_settings" msgid="2295017847215680229">"Bezdrôtové ladenie"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Ak chcete zobraziť a používať dostupné zariadenia, zapnite bezdrôtové ladenie"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Spárovať zariadenie pomocou QR kódu"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"Spárujte nové zariadenia pomocou skenera QR kódov"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"Spárujte nové zariadenia pomocou skenera QR kódov"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Spárovať zariadenie pomocou párovacieho kódu"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Spárujte nové zariadenia pomocou šesťmiestneho kódu"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"Spárované zariadenia"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Zariadenie sa nepodarilo spárovať. Buď bol QR kód nesprávny, alebo zariadenie nie je pripojené k rovnakej sieti."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"Adresa IP a port"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"Naskenujte QR kód"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"Spárujte zariadenie cez sieť Wi-Fi naskenovaním QR kódu"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Spárujte zariadenie cez sieť Wi-Fi naskenovaním QR kódu"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Pripojte sa k sieti Wi‑Fi"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, ladenie, dev"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"Skratka hlásenia chyby"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"Certifikácia bezdrôtového zobrazenia"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"Podrobné denníky Wi‑Fi"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"Pribrzdenie vyhľadávania sietí Wi‑Fi"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"Zlepš. randomizácia adr. MAC prip. Wi‑Fi"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"Mobilné dáta ponechať vždy aktívne"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"Hardvérová akcelerácia tetheringu"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Zobrazovať zariadenia Bluetooth bez názvov"</string>
@@ -277,12 +278,13 @@
     <string name="select_private_dns_configuration_dialog_title" msgid="3731422918335951912">"Výber súkromného režimu DNS"</string>
     <string name="private_dns_mode_off" msgid="7065962499349997041">"Vypnuté"</string>
     <string name="private_dns_mode_opportunistic" msgid="1947864819060442354">"Automaticky"</string>
-    <string name="private_dns_mode_provider" msgid="3619040641762557028">"Súkromný názov hostiteľa poskytovateľa DNS"</string>
+    <string name="private_dns_mode_provider" msgid="3619040641762557028">"Názov hostiteľa poskytovateľa súkromného DNS"</string>
     <string name="private_dns_mode_provider_hostname_hint" msgid="6564868953748514595">"Zadajte názov hostiteľa poskytovateľa DNS"</string>
     <string name="private_dns_mode_provider_failure" msgid="8356259467861515108">"Nepodarilo sa pripojiť"</string>
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Zobraziť možnosti certifikácie bezdrôtového zobrazenia"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Zvýšiť úroveň denníkov Wi‑Fi, zobrazovať podľa SSID RSSI pri výbere siete Wi‑Fi"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Znižuje používanie batérie a zlepšuje výkon siete"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Tento prepínač ovplyvňuje správanie randomizácie adresy MAC len pre režim klienta.\nKeď je tento režim aktivovaný, všetky siete s povolenou randomizáciou adresy MAC môžu mať svoje adresy MAC počas spájania opätovne randomizované v závislosti od toho, kedy sa klient od siete naposledy odpojil. Opätovná randomizácia nenastane, ak sa zariadenie znova pripojí do štyroch hodín."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"Merané"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"Bez merania dát"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"Vyrovnávacia pamäť nástroja denníkov"</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"Zobrazovať dialógové okno „Aplikácia nereaguje“ pre aplikácie na pozadí"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Zobraziť hlásenia kanála upozornení"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Zobrazuje varovné hlásenie na obrazovke, keď aplikácia zverejní upozornenie bez platného kanála"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Vynútiť skratky pre upozornenia na konverzácie"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Vyžadovať zastúpenie upozornení dlhodobou skratkou na zdieľanie, aby sa zobrazili v sekcii konverzácie"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"Vynútiť povolenie aplikácií na externom úložisku"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Umožňuje zapísať akúkoľvek aplikáciu do externého úložiska bez ohľadu na hodnoty v manifeste"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"Vynútiť možnosť zmeny veľkosti aktivít"</string>
@@ -432,10 +436,14 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"Vydrží asi do <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"Do <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Batéria sa môže do <xliff:g id="TIME">%1$s</xliff:g> minúť"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"Zostáva menej ako <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"Zostáva menej ako <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"Zostáva viac ako <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"Zostáva viac ako <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"Telefón sa môže čoskoro vypnúť"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"Tablet sa môže čoskoro vypnúť"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"Zariadenie sa môže čoskoro vypnúť"</string>
@@ -476,7 +484,7 @@
     <string name="retail_demo_reset_next" msgid="3688129033843885362">"Ďalej"</string>
     <string name="retail_demo_reset_title" msgid="1866911701095959800">"Vyžaduje sa heslo"</string>
     <string name="active_input_method_subtypes" msgid="4232680535471633046">"Aktívne metódy vstupu"</string>
-    <string name="use_system_language_to_select_input_method_subtypes" msgid="4865195835541387040">"Použiť jazyky systému"</string>
+    <string name="use_system_language_to_select_input_method_subtypes" msgid="4865195835541387040">"Jazyky systému"</string>
     <string name="failed_to_open_app_settings_toast" msgid="764897252657692092">"Nastavenia aplikácie <xliff:g id="SPELL_APPLICATION_NAME">%1$s</xliff:g> sa nepodarilo otvoriť"</string>
     <string name="ime_security_warning" msgid="6547562217880551450">"Pri tejto metóde vstupu sa môže zhromažďovať zadávaný text vrátane osobných údajov, ako sú heslá alebo čísla kreditných kariet. Táto metóda je poskytovaná aplikáciou <xliff:g id="IME_APPLICATION_NAME">%1$s</xliff:g>. Chcete použiť túto metódu vstupu?"</string>
     <string name="direct_boot_unaware_dialog_message" msgid="7845398276735021548">"Poznámka: Po reštartovaní sa táto aplikácia spustí až vtedy, keď odomknete telefón"</string>
diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml
index 8e3782c..893b2073 100644
--- a/packages/SettingsLib/res/values-sl/strings.xml
+++ b/packages/SettingsLib/res/values-sl/strings.xml
@@ -78,7 +78,7 @@
     <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"Povezano (brez telefona ali predstavnosti), raven napolnjenosti akumulatorja je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Aktivna, akumulator na <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
     <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Aktivno, L: napolnjenost akumulatorja je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, D: napolnjenost akumulatorja je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
-    <string name="bluetooth_battery_level" msgid="2893696778200201555">"Akumulator na <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_battery_level" msgid="2893696778200201555">"Baterija na <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
     <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: napolnjenost akumulatorja je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, D: napolnjenost akumulatorja je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
     <string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Aktivna"</string>
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Zvok predstavnosti"</string>
@@ -86,7 +86,7 @@
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Prenos datoteke"</string>
     <string name="bluetooth_profile_hid" msgid="2969922922664315866">"Vnosna naprava"</string>
     <string name="bluetooth_profile_pan" msgid="1006235139308318188">"Internetni dostop"</string>
-    <string name="bluetooth_profile_pbap" msgid="7064307749579335765">"Dajanje stikov v skupno rabo"</string>
+    <string name="bluetooth_profile_pbap" msgid="7064307749579335765">"Deljenje stikov"</string>
     <string name="bluetooth_profile_pbap_summary" msgid="2955819694801952056">"Uporabi za dajanje stikov v skupno rabo"</string>
     <string name="bluetooth_profile_pan_nap" msgid="7871974753822470050">"Skupna raba internetne povezave"</string>
     <string name="bluetooth_profile_map" msgid="8907204701162107271">"Sporočila SMS"</string>
@@ -212,7 +212,7 @@
     <string name="adb_wireless_settings" msgid="2295017847215680229">"Brezžično odpravljanje napak"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Če si želite ogledati in uporabljati razpoložljive naprave, vklopite brezžično odpravljanje napak"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Seznanjanje naprave s kodo QR"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"Seznanjanje novih naprav z optičnim bralnikom kod QR"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"Seznanitev novih naprav z optičnim bralnikom kod QR"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Seznanjanje naprave s kodo za seznanjanje"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Seznanjanje novih naprav s šestmestno kodo"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"Seznanjene naprave"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Seznanitev naprave ni uspela. Koda QR je nepravilna ali pa naprava ni povezana v isto omrežje."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"Naslov IP in vrata"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"Optično branje kode QR"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"Seznanitev naprave prek Wi‑Fi-ja z optičnim branjem kode QR"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Seznanitev naprave prek Wi‑Fi-ja z optičnim branjem kode QR"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Vzpostavite povezavo z omrežjem Wi-Fi"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, odpravljanje napak, razvoj"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"Bližnjica za poročanje o napakah"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"Potrdilo brezžičnega zaslona"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"Omogoči podrobno zapisovanje dnevnika za Wi-Fi"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"Omejevanje iskanja omrežij Wi-Fi"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"Naključen naslov MAC s podporo Wi‑Fi‑ja"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"Prenos podatkov v mobilnem omrežju je vedno aktiven"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"Strojno pospeševanje za internetno povezavo prek mobilnega telefona"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Prikaži naprave Bluetooth brez imen"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Pokaži možnosti za potrdilo brezžičnega zaslona"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Povečaj raven zapisovanja dnevnika za Wi-Fi; v izbirniku Wi‑Fi-ja pokaži glede na SSID RSSI"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Zmanjša porabo energije akumulatorja in izboljša delovanje omrežja"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"To stikalo vpliva na dodeljevanje naključnega naslova MAC samo v načinu odjemalca.\nKo je ta način aktiviran, se omrežjem, pri katerih je omogočeno naključno dodeljevanje naslova MAC, med povezovanjem morda dodeli nov naključen naslov MAC, kar je odvisno od tega, kdaj je odjemalec nazadnje prekinil povezavo z omrežjem. Dodelitev novega naključnega naslova se ne izvede, če naprava znova vzpostavi povezavo po največ štirih urah."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"Omejen prenos podatkov"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"Z neomejenim prenosom podatkov"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"Velikosti medpomnilnikov zapisovalnika dnevnika"</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"Prikaz pogovornega okna za neodzivanje aplikacij v ozadju"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Pokaži opozorila kanala za obvestila"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Na zaslonu se pokaže opozorilo, ko aplikacija objavi obvestilo brez veljavnega kanala"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Uveljavitev bližnjic za obvestila pogovora"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Zahteva, da obvestila podpira dolgotrajna bližnjica za deljenje, da se prikažejo v razdelku s pogovorom"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"Vsili omogočanje aplikacij v zunanji shrambi"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Poskrbi, da je ne glede na vrednosti v manifestu mogoče vsako aplikacijo zapisati v zunanjo shrambo"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"Vsili spremembo velikosti za aktivnosti"</string>
@@ -432,10 +436,14 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"Moralo bi zadostovati do približno <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"Do <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Energije baterije lahko zmanjka do <xliff:g id="TIME">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"Preostalo manj kot <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"Preostanek: manj kot <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"Preostali čas delovanja: manj kot <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"Preostali čas delovanja: več kot <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"Telefon se bo morda kmalu zaustavil"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"Tablični računalnik se bo morda kmalu zaustavil"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"Naprava se bo morda kmalu zaustavila"</string>
@@ -531,7 +539,7 @@
     <string name="user_add_user_item_title" msgid="2394272381086965029">"Uporabnik"</string>
     <string name="user_add_profile_item_title" msgid="3111051717414643029">"Omejen profil"</string>
     <string name="user_add_user_title" msgid="5457079143694924885">"Dodajanje novega uporabnika?"</string>
-    <string name="user_add_user_message_long" msgid="1527434966294733380">"To napravo lahko daste v skupno rabo z drugimi tako, da ustvarite dodatne uporabnike. Vsak ima svoj prostor, ki ga lahko prilagodi z aplikacijami, ozadji in drugim. Uporabniki lahko tudi prilagodijo nastavitve naprave, ki vplivajo na vse, na primer nastavitve omrežja Wi-Fi.\n\nKo dodate novega uporabnika, mora ta nastaviti svoj prostor.\n\nVsak uporabnik lahko posodobi aplikacije za vse druge uporabnike. Nastavitve in storitve funkcij za ljudi s posebnimi potrebami morda ne bodo prenesene v prostor novega uporabnika."</string>
+    <string name="user_add_user_message_long" msgid="1527434966294733380">"To napravo lahko delite z drugimi tako, da ustvarite dodatne uporabnike. Vsak ima svoj prostor, ki ga lahko prilagodi z aplikacijami, ozadji in drugim. Uporabniki lahko tudi prilagodijo nastavitve naprave, ki vplivajo na vse, na primer nastavitve omrežja Wi-Fi.\n\nKo dodate novega uporabnika, mora ta nastaviti svoj prostor.\n\nVsak uporabnik lahko posodobi aplikacije za vse druge uporabnike. Nastavitve in storitve funkcij za ljudi s posebnimi potrebami morda ne bodo prenesene v prostor novega uporabnika."</string>
     <string name="user_add_user_message_short" msgid="3295959985795716166">"Ko dodate novega uporabnika, mora ta nastaviti svoj prostor.\n\nVsak uporabnik lahko posodobi aplikacije za vse druge uporabnike."</string>
     <string name="user_setup_dialog_title" msgid="8037342066381939995">"Želite uporabnika nastaviti zdaj?"</string>
     <string name="user_setup_dialog_message" msgid="269931619868102841">"Prepričajte se, da ima oseba čas za nastavitev svojega prostora."</string>
diff --git a/packages/SettingsLib/res/values-sq/strings.xml b/packages/SettingsLib/res/values-sq/strings.xml
index 6d1e80a..4debe74 100644
--- a/packages/SettingsLib/res/values-sq/strings.xml
+++ b/packages/SettingsLib/res/values-sq/strings.xml
@@ -206,13 +206,13 @@
     <string name="enable_adb" msgid="8072776357237289039">"Korrigjimi i USB-së"</string>
     <string name="enable_adb_summary" msgid="3711526030096574316">"Korrigjo gabimet e modalitetit kur UBS-ja është e lidhur"</string>
     <string name="clear_adb_keys" msgid="3010148733140369917">"Anulo autorizimet e korrigjimeve të gabimeve të USB-së"</string>
-    <string name="enable_adb_wireless" msgid="6973226350963971018">"Korrigjimi me valë"</string>
+    <string name="enable_adb_wireless" msgid="6973226350963971018">"Korrigjimi përmes Wi-Fi"</string>
     <string name="enable_adb_wireless_summary" msgid="7344391423657093011">"Regjimi i korrigjimit kur Wi‑Fi është i lidhur"</string>
     <string name="adb_wireless_error" msgid="721958772149779856">"Gabim"</string>
-    <string name="adb_wireless_settings" msgid="2295017847215680229">"Korrigjimi me valë"</string>
-    <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Për të parë dhe përdorur pajisjet e disponueshme, aktivizo korrigjimin me valë"</string>
+    <string name="adb_wireless_settings" msgid="2295017847215680229">"Korrigjimi përmes Wi-Fi"</string>
+    <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Për të parë dhe përdorur pajisjet e disponueshme, aktivizo korrigjimin përmes Wi-Fi"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Çifto pajisjen me kod QR"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"Çifto pajisjet e reja duke përdorur skanerin e kodeve QR"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"Çifto pajisjet e reja duke përdorur skanerin e kodeve QR"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Çifto pajisjen me kodin e çiftimit"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Çifto pajisjet e reja duke përdorur kodin me gjashtë shifra"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"Pajisjet e çiftuara"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Çiftimi i pajisjes dështoi. Ose kodi QR nuk ishte i saktë, ose pajisja nuk është e lidhur me të njëjtin rrjet."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"Adresa e IP-së dhe porta"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"Skano kodin QR"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"Çifto pajisjen përmes Wi‑Fi duke skanuar një kod QR"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Çifto pajisjen përmes Wi‑Fi duke skanuar një kod QR"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Lidhu me një rrjet Wi-Fi"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, korrigjimi, zhvilluesi"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"Shkurtorja e raportit të defektit në kod"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"Certifikimi i ekranit valor"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"Aktivizo hyrjen Wi-Fi Verbose"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"Përshpejtimi i skanimit të Wi‑Fi"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"Renditja e rastësishme e adresave MAC të përmirësuara me Wi-Fi"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"Të dhënat celulare gjithmonë aktive"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"Përshpejtimi i harduerit për ndarjen e lidhjes (internet)"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Shfaq pajisjet me Bluetooth pa emra"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Shfaq opsionet për certifikimin e ekranit valor"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Rrit nivelin regjistrues të Wi‑Fi duke shfaqur SSID RSSI-në te Zgjedhësi i Wi‑Fi"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Zvogëlon shkarkimin e baterisë dhe përmirëson cilësinë e funksionimit të rrjetit"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Ky ndryshim ndikon te sjellja e renditjes së rastësishme të adresave MAC vetëm për modalitetin e klientit.\nKur aktivizohet ky modalitet, çdo rrjet që ka të aktivizuar renditjen e rastësishme të adresave MAC mund t\'i rirendisë adresat e veta MAC gjatë shoqërimit, në varësi të kohës kur është shkëputur klienti për herë të fundit nga rrjeti. Rirenditja e rastësishme nuk ndodh nëse pajisja lidhet brenda 4 orëve ose më pak."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"Me matje"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"Pa matje"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"Madhësitë e regjistruesit"</string>
@@ -300,8 +302,8 @@
     <string name="tethering_hardware_offload_summary" msgid="7801345335142803029">"Përdor përshpejtimin e harduerit për ndarjen e lidhjes (internet) nëse është i disponueshëm"</string>
     <string name="adb_warning_title" msgid="7708653449506485728">"Të lejohet korrigjimi i USB-së?"</string>
     <string name="adb_warning_message" msgid="8145270656419669221">"Korrigjuesi i USB-së është vetëm për qëllime zhvillimore. Përdore për të kopjuar të dhëna mes kompjuterit dhe pajisjes tënde, për të instaluar aplikacione në pajisjen tënde pa asnjë njoftim si dhe për të lexuar të dhënat e ditarit."</string>
-    <string name="adbwifi_warning_title" msgid="727104571653031865">"Të lejohet korrigjimi me valë?"</string>
-    <string name="adbwifi_warning_message" msgid="8005936574322702388">"Korrigjimi me valë është vetëm për qëllime zhvillimore. Përdore për të kopjuar të dhëna mes kompjuterit dhe pajisjes sate, për të instaluar aplikacione në pajisjen tënde pa asnjë njoftim si dhe për të lexuar të dhënat e regjistrit."</string>
+    <string name="adbwifi_warning_title" msgid="727104571653031865">"Të lejohet korrigjimi përmes Wi-Fi?"</string>
+    <string name="adbwifi_warning_message" msgid="8005936574322702388">"Korrigjimin përmes Wi-Fi është vetëm për qëllime zhvillimore. Përdore për të kopjuar të dhëna mes kompjuterit dhe pajisjes sate, për të instaluar aplikacione në pajisjen tënde pa asnjë njoftim si dhe për të lexuar të dhënat e regjistrit."</string>
     <string name="adb_keys_warning_message" msgid="2968555274488101220">"Të bllokohet qasja për korrigjim të USB-së nga të gjithë kompjuterët që ke autorizuar më parë?"</string>
     <string name="dev_settings_warning_title" msgid="8251234890169074553">"Të lejohen cilësimet e zhvillimit?"</string>
     <string name="dev_settings_warning_message" msgid="37741686486073668">"Këto cilësime janë të projektuara vetëm për përdorim në programim. Ato mund të shkaktojnë që pajisja dhe aplikacionet në të, të mos punojnë ose të veprojnë në mënyrë të gabuar."</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"Shfaq raportet ANR (Aplikacioni nuk përgjigjet) për aplikacionet në sfond"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Shfaq paralajmërimet e kanalit të njoftimeve"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Shfaq paralajmërimin në ekran kur një aplikacion poston një njoftim pa një kanal të vlefshëm"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Zbato shkurtoret për njoftimet e bisedave"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Kërko që informacionet të mbështeten nga një shkurtore ndarjeje afatgjatë që ato të shfaqen në seksionin e bashkëbisedimit"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"Detyro lejimin në hapësirën e jashtme"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Bën që çdo aplikacion të jetë i përshtatshëm për t\'u shkruar në hapësirën ruajtëse të jashtme, pavarësisht nga vlerat e manifestit"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"Detyro madhësinë e ndryshueshme për aktivitetet"</string>
@@ -432,10 +436,14 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"Duhet të zgjasë deri në rreth <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"Deri në <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Bateria mund të mbarojë deri në <xliff:g id="TIME">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"Më pak se <xliff:g id="THRESHOLD">%1$s</xliff:g> të mbetura"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"Mbeten më pak se <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"Mbeten më shumë se <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"Mbeten më shumë se <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"Telefoni mund të fiket së shpejti"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"Tableti mund të fiket së shpejti"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"Pajisja mund të fiket së shpejti"</string>
@@ -443,7 +451,7 @@
     <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"Tableti mund të fiket së shpejti (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
     <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"Pajisja mund të fiket së shpejti (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
     <string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
-    <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"<xliff:g id="TIME">%1$s</xliff:g> të mbetura për karikimin"</string>
+    <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"<xliff:g id="TIME">%1$s</xliff:g> të mbetura deri në karikim"</string>
     <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> deri sa të karikohen"</string>
     <string name="battery_info_status_unknown" msgid="268625384868401114">"I panjohur"</string>
     <string name="battery_info_status_charging" msgid="4279958015430387405">"Po karikohet"</string>
@@ -466,7 +474,7 @@
     <string name="charge_length_format" msgid="6941645744588690932">"<xliff:g id="ID_1">%1$s</xliff:g> më parë"</string>
     <string name="remaining_length_format" msgid="4310625772926171089">"<xliff:g id="ID_1">%1$s</xliff:g> të mbetura"</string>
     <string name="screen_zoom_summary_small" msgid="6050633151263074260">"I vogël"</string>
-    <string name="screen_zoom_summary_default" msgid="1888865694033865408">"I parazgjedhur"</string>
+    <string name="screen_zoom_summary_default" msgid="1888865694033865408">"E parazgjedhur"</string>
     <string name="screen_zoom_summary_large" msgid="4706951482598978984">"I madh"</string>
     <string name="screen_zoom_summary_very_large" msgid="7317423942896999029">"Më i madh"</string>
     <string name="screen_zoom_summary_extremely_large" msgid="1438045624562358554">"Më i madhi"</string>
diff --git a/packages/SettingsLib/res/values-sr/strings.xml b/packages/SettingsLib/res/values-sr/strings.xml
index 775b7d5..e47969c 100644
--- a/packages/SettingsLib/res/values-sr/strings.xml
+++ b/packages/SettingsLib/res/values-sr/strings.xml
@@ -212,7 +212,7 @@
     <string name="adb_wireless_settings" msgid="2295017847215680229">"Бежично отклањање грешака"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Да бисте видели и користили доступне уређаје, укључите бежично отклањање грешака"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Упарите уређај помоћу QR кода"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"Упарите нове уређаје помоћу читача QR кода"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"Упарите нове уређаје помоћу читача QR кода"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Упарите уређај помоћу кода за упаривање"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Упарите нове уређаје помоћу шестоцифреног кода"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"Упарени уређаји"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Упаривање уређаја није успело. QR кôд је погрешан или уређај није повезан са истом мрежом."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"IP адреса и порт"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"Скенирај QR кôд"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"Упарите уређај помоћу Wi‑Fi мреже или тако што ћете скенирати QR кôд"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Упарите уређај помоћу Wi‑Fi мреже тако што ћете скенирати QR кôд"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Повежите се на Wi-Fi мрежу"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, отклањање грешака, програмер"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"Пречица за извештај о грешкама"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"Сертификација бежичног екрана"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"Омогући детаљнију евиденцију за Wi‑Fi"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"Успоравање Wi-Fi скенирања"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"Насумично MAC разврставање по Wi‑Fi‑ју"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"Мобилни подаци су увек активни"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"Хардверско убрзање привезивања"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Прикажи Bluetooth уређаје без назива"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Приказ опција за сертификацију бежичног екрана"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Повећава ниво евидентирања за Wi‑Fi. Приказ по SSID RSSI-у у бирачу Wi‑Fi мреже"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Смањује потрошњу батерије и побољшава учинак мреже"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Овај прекидач утиче на понашање насумичног разврставања MAC адреса само за режим клијента.\nКада се овај режим активира, за мреже на којима је омогућено насумично разврставање MAC адреса може да дође до поновног насумичног разврставања MAC адреса током повезивања, у зависности од тога када се клијент пре тога искључио са мреже. До поновног насумичног разврставања не долази ако се уређај поново повеже за 4 сата или мање."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"Са ограничењем"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"Без ограничења"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"Величине бафера података у програму за евидентирање"</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"Прикажи дијалог Апликација не реагује за апликације у позадини"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Приказуј упозорења због канала за обавештења"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Приказује упозорење на екрану када апликација постави обавештење без важећег канала"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Примењуј пречице за обавештења о конверзацијама"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Захтева да обавештења имају и дугорочну пречицу за дељење како би се појављивала у одељку за конверзације"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"Принудно дозволи апликације у спољној"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Омогућава уписивање свих апликација у спољну меморију, без обзира на вредности манифеста"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"Принудно омогући промену величине активности"</string>
@@ -432,10 +436,14 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"Трајаће приближно до <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"До <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Батерија ће се можда испразнити до <xliff:g id="TIME">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"Преостало је мање од <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"Преостало је мање од <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"Преостало је више од <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"Преостало је више од <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"Телефон ће се ускоро искључити"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"Таблет ће се ускоро искључити"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"Уређај ће се ускоро искључити"</string>
diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml
index e40ba29..c21e624 100644
--- a/packages/SettingsLib/res/values-sv/strings.xml
+++ b/packages/SettingsLib/res/values-sv/strings.xml
@@ -212,7 +212,7 @@
     <string name="adb_wireless_settings" msgid="2295017847215680229">"Trådlös felsökning"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Aktivera trådlös felsökning om du vill se tillgängliga enheter"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Parkoppla enheten med en QR-kod"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"Koppla nya enheter med QR-kodsläsare"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"Parkoppla nya enheter med QR-kodsläsare"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Koppla enheten med en kopplingskod"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Koppla nya enheter med en sexsiffrig kod"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"Kopplade enheter"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Det gick inte att parkoppla enheten. Antingen var det fel QR-kod eller är enheten inte ansluten till samma nätverk."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"IP-adress och port"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"Skanna QR-kod"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"Parkoppla enheten via Wi-Fi genom att skanna en QR-kod"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Parkoppla enheten via Wi-Fi genom att skanna en QR-kod"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Anslut till ett Wi-Fi-nätverk"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, debug, dev, felsöka, felsökning"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"Genväg till felrapport"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"Certifiering för Wi-Fi-skärmdelning"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"Aktivera utförlig loggning för Wi-Fi"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"Begränsning av Wi-Fi-sökning"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"Wi‑Fi‑förstärkt MAC-slumpgenerering"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"Mobildata alltid aktiverad"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"Maskinvaruacceleration för internetdelning"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Visa namnlösa Bluetooth-enheter"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Visa certifieringsalternativ för Wi-Fi-skärmdelning"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Öka loggningsnivån för Wi-Fi, visa per SSID RSSI i Wi‑Fi Picker"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Sänker batteriförbrukningen och förbättrar nätverksprestandan"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Detta läge påverkar endast MAC-slumpgenereringens beteende för klientläget.\nNär läget aktiveras kan alla nätverk som har MAC-slumpgenerering aktiverat få sina adresser slumpgenererade på nytt under kopplingen, beroende på när klienten senast kopplade från nätverket. Det sker ingen ny slumpgenerering om enheten återansluter inom fyra timmar."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"Med datapriser"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"Utan datapriser"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"Buffertstorlekar för logg"</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"Visa dialogrutan om att appen inte svarar för bakgrundsappar"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Visa varningar om aviseringskanal"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Visa varningar på skärmen när en app lägger upp en avisering utan en giltig kanal"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Kräv genvägar för konversationsaviseringar"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Kräv att aviseringar har en långlivad delningsgenväg för att få visas i konversationsavsnittet"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"Tillåt appar i externt lagringsutrymme"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Allar appar kan skrivas till extern lagring, oavsett manifestvärden"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"Framtvinga storleksanpassning för aktiviteter"</string>
@@ -432,10 +436,14 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"Bör räcka ungefär till klockan <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"Till kl. <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Batteriet kan ta slut klockan <xliff:g id="TIME">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"Mindre än <xliff:g id="THRESHOLD">%1$s</xliff:g> återstår"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"Mindre än <xliff:g id="THRESHOLD">%1$s</xliff:g> återstår (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"Mer än <xliff:g id="TIME_REMAINING">%1$s</xliff:g> återstår (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"Mer än <xliff:g id="TIME_REMAINING">%1$s</xliff:g> återstår"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"Telefonen kanske stängs av snart"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"Surfplattan kanske stängs av snart"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"Enheten kanske stängs av snart"</string>
@@ -476,7 +484,7 @@
     <string name="retail_demo_reset_next" msgid="3688129033843885362">"Nästa"</string>
     <string name="retail_demo_reset_title" msgid="1866911701095959800">"Lösenord krävs"</string>
     <string name="active_input_method_subtypes" msgid="4232680535471633046">"Aktiva inmatningsmetoder"</string>
-    <string name="use_system_language_to_select_input_method_subtypes" msgid="4865195835541387040">"Använda systemspråk"</string>
+    <string name="use_system_language_to_select_input_method_subtypes" msgid="4865195835541387040">"Använd systemspråk"</string>
     <string name="failed_to_open_app_settings_toast" msgid="764897252657692092">"Det gick inte att öppna inställningarna för <xliff:g id="SPELL_APPLICATION_NAME">%1$s</xliff:g>"</string>
     <string name="ime_security_warning" msgid="6547562217880551450">"Den här inmatningsmetoden kan samla all text som du skriver, inklusive personliga uppgifter som lösenord och kreditkortsnummer. Den kommer från appen <xliff:g id="IME_APPLICATION_NAME">%1$s</xliff:g>. Vill du använda inmatningsmetoden?"</string>
     <string name="direct_boot_unaware_dialog_message" msgid="7845398276735021548">"Obs! När du har startat om enheten måste du låsa upp mobilen innan du kan starta den här appen"</string>
@@ -539,8 +547,8 @@
     <string name="user_add_user_type_title" msgid="551279664052914497">"Lägg till"</string>
     <string name="user_new_user_name" msgid="60979820612818840">"Ny användare"</string>
     <string name="user_new_profile_name" msgid="2405500423304678841">"Ny profil"</string>
-    <string name="user_info_settings_title" msgid="6351390762733279907">"Användarinfo"</string>
-    <string name="profile_info_settings_title" msgid="105699672534365099">"Profilinfo"</string>
+    <string name="user_info_settings_title" msgid="6351390762733279907">"Användarinformation"</string>
+    <string name="profile_info_settings_title" msgid="105699672534365099">"Profilinformation"</string>
     <string name="user_need_lock_message" msgid="4311424336209509301">"Innan du skapar en begränsad profil måste du konfigurera ett skärmlås för att skydda dina appar och personliga data."</string>
     <string name="user_set_lock_button" msgid="1427128184982594856">"Konfigurera lås"</string>
     <string name="user_switch_to_user" msgid="6975428297154968543">"Byt till <xliff:g id="USER_NAME">%s</xliff:g>"</string>
diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml
index 815896d..66846fa 100644
--- a/packages/SettingsLib/res/values-sw/strings.xml
+++ b/packages/SettingsLib/res/values-sw/strings.xml
@@ -212,7 +212,7 @@
     <string name="adb_wireless_settings" msgid="2295017847215680229">"Utatuzi usiotumia waya"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Ili kungalia na kutumia vifaa vinavyopatikana, washa utatuzi usiotumia waya"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Oanisha kifaa ukitumia msimbo wa QR"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"Oanisha vifaa vipya ukitumia Kichanganuzi cha Msimbo wa QR"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"Oanisha vifaa vipya ukitumia kichanganuzi cha Msimbo wa QR"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Oanisha kifaa ukitumia msimbo wa kuoanisha"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Oanisha vifaa vipya ukitumia msimbo wa tarakimu sita"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"Vifaa vilivyooanishwa"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Imeshindwa kuoanisha kifaa. Huenda msimbo wa QR haukuwa sahihi au kifaa hakijaunganishwa kwenye mtandao mmoja."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"Anwani ya IP na Mlango"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"Changanua msimbo wa QR"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"Oanisha kifaa kupitia Wi-Fi kwa kuchanganua Msimbo wa QR"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Oanisha kifaa kupitia Wi-Fi kwa kuchanganua msimbo wa QR"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Tafadhali unganisha kwenye mtandao wa Wi-Fi"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, tatua, dev"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"Njia ya mkato ya kuripoti hitilafu"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"Chaguo za cheti cha kuonyesha pasiwaya"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"Washa Uwekaji kumbukumbu za WiFi kutumia Sauti"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"Kudhibiti utafutaji wa Wi-Fi"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"Kuweka nasibu kwenye MAC iliyoimarishwa na Wi-Fi"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"Iendelee kutumia data ya simu"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"Kuongeza kasi kwa kutumia maunzi ili kusambaza mtandao"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Onyesha vifaa vya Bluetooth visivyo na majina"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Onyesha chaguo za cheti cha kuonyesha pasiwaya"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Ongeza hatua ya uwekaji kumbukumbu ya Wi-Fi, onyesha kwa kila SSID RSSI kwenye Kichukuzi cha Wi-Fi"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Hupunguza matumizi ya chaji ya betri na kuboresha utendaji wa mtandao"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Hali hii ya kugeuza huathiri utendaji wa kuweka nasibu kwenye anwani ya MAC katika hali ya kiteja pekee.\nWakati hali hii imewashwa, mitandao yoyote ambapo kipengele cha unasibu wa MAC kimewashwa inaweza kuruhusu anwani zao za MAC kuwekwa nasibu tena wakati wa ushirikiano, kulingana na mara ya mwisho kiteja kilipoacha kuunganisha kwenye mtandao. Tukio la kuweka unasibu tena halitokei ikiwa kifaa kitaunganisha tena baada ya muda usiozidi saa nne."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"Mtandao unapima data"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"Mtandao usiopima data"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"Ukubwa wa kiweka bafa ya kumbukumbu"</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"Onyesha kidirisha cha Programu Kutorejesha Majibu kwa programu zinazotumika chinichini"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Onyesha arifa za maonyo ya kituo"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Huonyesha onyo kwenye skrini programu inapochapisha arifa bila kituo sahihi."</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Tekeleza njia za mkato za arifa za mazungumzo"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Weka mipangilio ili nakala za arifa zihifadhiwe kwa njia ya zamani ya mkato ya kushiriki ili zionekane katika sehemu ya mazungumzo"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"Lazima uruhusu programu kwenye hifadhi ya nje"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Huruhusu programu yoyote iwekwe kwenye hifadhi ya nje, bila kujali thamani za faili ya maelezo"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"Lazimisha shughuli ziweze kubadilishwa ukubwa"</string>
@@ -432,10 +436,14 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"Inapaswa kudumu hadi <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"Hadi <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Huenda chaji ikaisha kufikia <xliff:g id="TIME">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"Zimesalia chini ya <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"Zimesalia chini ya <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"Zimesalia zaidi ya <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"Zimesalia zaidi ya <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"Huenda simu ikazima hivi karibuni"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"Huenda kompyuta yako kibao ikazima hivi karibuni"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"Huenda kifaa kikazima hivi karibuni"</string>
@@ -443,8 +451,8 @@
     <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"Huenda kompyuta kibao ikazima hivi karibuni (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
     <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"Huenda kifaa kikazima hivi karibuni (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
     <string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
-    <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"Zimesalia <xliff:g id="TIME">%1$s</xliff:g> hadi ijae chaji"</string>
-    <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> hadi ijae chaji"</string>
+    <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"Imebakisha <xliff:g id="TIME">%1$s</xliff:g> ijae chaji"</string>
+    <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> ijae chaji"</string>
     <string name="battery_info_status_unknown" msgid="268625384868401114">"Haijulikani"</string>
     <string name="battery_info_status_charging" msgid="4279958015430387405">"Inachaji"</string>
     <string name="battery_info_status_charging_fast" msgid="8027559755902954885">"Inachaji kwa kasi"</string>
@@ -483,7 +491,7 @@
     <string name="ims_reg_title" msgid="8197592958123671062">"Hali ya usajili wa IMS"</string>
     <string name="ims_reg_status_registered" msgid="884916398194885457">"Imesajiliwa"</string>
     <string name="ims_reg_status_not_registered" msgid="2989287366045704694">"Haijasajiliwa"</string>
-    <string name="status_unavailable" msgid="5279036186589861608">"Hapatikani"</string>
+    <string name="status_unavailable" msgid="5279036186589861608">"Haipatikani"</string>
     <string name="wifi_status_mac_randomized" msgid="466382542497832189">"Imechagua anwani ya MAC kwa nasibu"</string>
     <plurals name="wifi_tether_connected_summary" formatted="false" msgid="6317236306047306139">
       <item quantity="other">Imeunganisha vifaa %1$d</item>
@@ -529,7 +537,7 @@
     <string name="user_add_user_item_title" msgid="2394272381086965029">"Mtumiaji"</string>
     <string name="user_add_profile_item_title" msgid="3111051717414643029">"Wasifu uliozuiwa"</string>
     <string name="user_add_user_title" msgid="5457079143694924885">"Ungependa kuongeza mtumiaji?"</string>
-    <string name="user_add_user_message_long" msgid="1527434966294733380">"Unaweza kutumia kifaa hiki pamoja na watu wengine kwa kuongeza watumiaji wa ziada. Kila mtumiaji ana nafasi yake mwenyewe, ambayo anaweza kuweka programu, mandhari na vipengee vingine anavyopenda. Watumiaji pia wanaweza kurekebisha mipangilio ya kifaa inayoathiri kila mtu kama vile Wi-Fi.\n\nUnapomwongeza mtumiaji mpya, mtu huyo anahitaji kujitayarishia nafasi yake.\n\nMtumiaji yeyote anaweza kuwasasishia watumiaji wengine wote programu. Huenda mipangilio na huduma za walio na matatizo ya kuona na kusikia zisihamishiwe mtumiaji mgeni."</string>
+    <string name="user_add_user_message_long" msgid="1527434966294733380">"Unaweza kutumia kifaa hiki pamoja na watu wengine kwa kuongeza watumiaji wa ziada. Kila mtumiaji ana nafasi yake mwenyewe, ambayo anaweza kuweka programu, mandhari na vipengee vingine anavyopenda. Watumiaji pia wanaweza kurekebisha mipangilio ya kifaa inayoathiri kila mtu kama vile Wi-Fi.\n\nUnapomwongeza mtumiaji mpya, mtu huyo anahitaji kujitayarishia nafasi yake.\n\nMtumiaji yeyote anaweza kuwasasishia watumiaji wengine wote programu. Huenda mipangilio na huduma za ufikivu zisihamishiwe mtumiaji mgeni."</string>
     <string name="user_add_user_message_short" msgid="3295959985795716166">"Mtumiaji mpya utakayemwongeza atahitaji kuongeza akaunti yake.\n\nMtumiaji yoyote anaweza kusasisha programu kwa niaba ya wengine wote."</string>
     <string name="user_setup_dialog_title" msgid="8037342066381939995">"Mtumiaji aongezwe sasa?"</string>
     <string name="user_setup_dialog_message" msgid="269931619868102841">"Hakikisha kuwa mtu huyu anaweza kuchukua kifaa na kuweka mapendeleo yake"</string>
diff --git a/packages/SettingsLib/res/values-ta/strings.xml b/packages/SettingsLib/res/values-ta/strings.xml
index 5080c31..4494d1a 100644
--- a/packages/SettingsLib/res/values-ta/strings.xml
+++ b/packages/SettingsLib/res/values-ta/strings.xml
@@ -206,13 +206,13 @@
     <string name="enable_adb" msgid="8072776357237289039">"USB பிழைதிருத்தம்"</string>
     <string name="enable_adb_summary" msgid="3711526030096574316">"USB இணைக்கப்பட்டிருக்கும்போது பிழைத்திருத்தப் பயன்முறையை அமை"</string>
     <string name="clear_adb_keys" msgid="3010148733140369917">"USB பிழைத்திருத்த அங்கீகரிப்புகளை நிராகரி"</string>
-    <string name="enable_adb_wireless" msgid="6973226350963971018">"வயர்லெஸ் பிழைதிருத்தம்"</string>
+    <string name="enable_adb_wireless" msgid="6973226350963971018">"வைஃபை பிழைதிருத்தம்"</string>
     <string name="enable_adb_wireless_summary" msgid="7344391423657093011">"வைஃபையை இணைக்கும்போது பிழைதிருத்தப் பயன்முறை இயக்கப்படும்"</string>
     <string name="adb_wireless_error" msgid="721958772149779856">"பிழை"</string>
-    <string name="adb_wireless_settings" msgid="2295017847215680229">"வயர்லெஸ் பிழைதிருத்தம்"</string>
-    <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"கிடைக்கும் சாதனங்களைப் பார்க்கவும் பயன்படுத்தவும் வயர்லெஸ் பிழைதிருத்தத்தை ஆன் செய்யவும்"</string>
+    <string name="adb_wireless_settings" msgid="2295017847215680229">"வைஃபை பிழைதிருத்தம்"</string>
+    <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"கிடைக்கும் சாதனங்களைப் பார்க்கவும் பயன்படுத்தவும் வைஃபை பிழைதிருத்தத்தை ஆன் செய்யவும்"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"QR குறியீட்டின் மூலம் சாதனத்தை இணைத்தல்"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"QR குறியீடு ஸ்கேனரைப் பயன்படுத்தி புதிய சாதனங்களை இணைக்கலாம்"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"QR குறியீடு ஸ்கேனரைப் பயன்படுத்தி புதிய சாதனங்களை இணைக்கலாம்"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"இணைத்தல் குறியீட்டின் மூலம் சாதனத்தை இணைத்தல்"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"ஆறு இலக்கக் குறியீட்டைப் பயன்படுத்தி புதிய சாதனங்களை இணைக்கலாம்"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"இணைக்கப்பட்ட சாதனங்கள்"</string>
@@ -231,9 +231,8 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"சாதனத்துடன் இணைக்க முடியவில்லை. தவறான QR குறியீடாகவோ சாதனம் அதே நெர்வொர்க்குடன் இணைக்கப்படாமலோ இருக்கலாம்."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"IP முகவரி &amp; போர்ட்"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"QR குறியீட்டை ஸ்கேன் செய்தல்"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"QR குறியீட்டை ஸ்கேன் செய்வதன் மூலம் சாதனத்தை வைஃபை மூலம் இணைக்கலாம்"</string>
-    <!-- no translation found for adb_wireless_no_network_msg (2365795244718494658) -->
-    <skip />
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"QR குறியீட்டை ஸ்கேன் செய்வதன் மூலம் சாதனத்தை வைஃபை மூலம் இணைக்கலாம்"</string>
+    <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"வைஃபை நெட்வொர்க்குடன் இணைக்கவும்"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, debug, dev"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"பிழைப் புகாருக்கான ஷார்ட்கட்"</string>
     <string name="bugreport_in_power_summary" msgid="1885529649381831775">"பிழை அறிக்கையைப் பெற பவர் மெனுவில் விருப்பத்தைக் காட்டு"</string>
@@ -252,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"வயர்லெஸ் காட்சிக்கான சான்றிதழ்"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"வைஃபை அதிவிவர நுழைவை இயக்கு"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"வைஃபை ஸ்கேனிங்கை வரம்பிடுதல்"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"வைஃபை மேம்பாட்டுடன் MAC ரேண்டம் ஆக்குதல்"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"மொபைல் டேட்டாவை எப்போதும் இயக்கத்திலேயே வை"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"வன்பொருள் விரைவுப்படுத்துதல் இணைப்பு முறை"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"பெயர்கள் இல்லாத புளூடூத் சாதனங்களைக் காட்டு"</string>
@@ -284,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"வயர்லெஸ் காட்சி சான்றுக்கான விருப்பங்களைக் காட்டு"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"வைஃபை நுழைவு அளவை அதிகரித்து, வைஃபை தேர்வுக் கருவியில் ஒவ்வொன்றிற்கும் SSID RSSI ஐ காட்டுக"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"பேட்டரி தீர்ந்துபோவதைக் குறைத்து நெட்வொர்க்கின் செயல்திறனை மேம்படுத்தும்"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"கிளையண்ட் பயன்முறைக்கான MAC ரேண்டம் ஆக்குதலை மட்டுமே இந்த நிலைமாற்றி பாதிக்கும்.\nஇந்தப் பயன்முறை இயக்கப்பட்டால் நெட்வொர்க்கிலிருந்து கிளையண்ட் கடைசியாக எப்போது துண்டிக்கப்பட்டது என்பதைப் பொறுத்து, MAC ரேண்டம் ஆக்குதல் இயக்கப்பட்டிருக்கும் நெட்வொர்க்குகள் இணைக்கப்படும்போது தங்கள் MAC முகவரிகளை மீண்டும் ரேண்டம் ஆக்கக்கூடும். சாதனம் 4 மணிநேரத்திலோ அதற்கு முன்னரோ மீண்டும் இணைக்கப்பட்டால் மீண்டும் ரேண்டம் ஆக்குதல் நிகழாது."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"கட்டண நெட்வொர்க்"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"கட்டணமில்லா நெட்வொர்க்"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"லாகர் பஃபர் அளவுகள்"</string>
@@ -301,8 +302,8 @@
     <string name="tethering_hardware_offload_summary" msgid="7801345335142803029">"வன்பொருள் விரைவுப்படுத்துதல் இணைப்பு முறை கிடைக்கும் போது, அதைப் பயன்படுத்தும்"</string>
     <string name="adb_warning_title" msgid="7708653449506485728">"USB பிழைதிருத்தத்தை அனுமதிக்கவா?"</string>
     <string name="adb_warning_message" msgid="8145270656419669221">"USB பிழைதிருத்தம் மேம்படுத்தல் நோக்கங்களுக்காக மட்டுமே. அதை உங்கள் கணினி மற்றும் சாதனத்திற்கு இடையில் தரவை நகலெடுக்கவும், அறிவிப்பு இல்லாமல் உங்கள் சாதனத்தில் ஆப்ஸை நிறுவவும், பதிவு தரவைப் படிக்கவும் பயன்படுத்தவும்."</string>
-    <string name="adbwifi_warning_title" msgid="727104571653031865">"வயர்லெஸ் பிழைதிருத்தத்தை அனுமதிக்கவா?"</string>
-    <string name="adbwifi_warning_message" msgid="8005936574322702388">"\'வயர்லெஸ் பிழைதிருத்தம்\' டெவெலப்மெண்ட் நோக்கங்களுக்காக மட்டுமே. அதை உங்கள் கம்ப்யூட்டருக்கும் சாதனத்திற்கும் இடையே தரவை நகலெடுக்கவும், உங்கள் சாதனத்தில் அறிவிப்பின்றி ஆப்ஸை நிறுவவும், பதிவுத் தரவைப் படிக்கவும் பயன்படுத்தவும்."</string>
+    <string name="adbwifi_warning_title" msgid="727104571653031865">"வைஃபை பிழைதிருத்தத்தை அனுமதிக்கவா?"</string>
+    <string name="adbwifi_warning_message" msgid="8005936574322702388">"\'வைஃபை பிழைதிருத்தம்\' டெவெலப்மெண்ட் நோக்கங்களுக்காக மட்டுமே. அதை உங்கள் கம்ப்யூட்டருக்கும் சாதனத்திற்கும் இடையே தரவை நகலெடுக்கவும், உங்கள் சாதனத்தில் அறிவிப்பின்றி ஆப்ஸை நிறுவவும், பதிவுத் தரவைப் படிக்கவும் பயன்படுத்தவும்."</string>
     <string name="adb_keys_warning_message" msgid="2968555274488101220">"நீங்கள் ஏற்கனவே அனுமதித்த எல்லா கணினிகளிலிருந்தும் USB பிழைத்திருத்தத்திற்கான அணுகலைத் திரும்பப்பெற வேண்டுமா?"</string>
     <string name="dev_settings_warning_title" msgid="8251234890169074553">"மேம்பட்ட அமைப்புகளை அனுமதிக்கவா?"</string>
     <string name="dev_settings_warning_message" msgid="37741686486073668">"இந்த அமைப்பு மேம்பட்டப் பயன்பாட்டிற்காக மட்டுமே. உங்கள் சாதனம் மற்றும் அதில் உள்ள பயன்பாடுகளைச் சிதைக்கும் அல்லது தவறாகச் செயல்படும் வகையில் பாதிப்பை ஏற்படுத்தும்."</string>
@@ -372,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"பின்புல ஆப்ஸுக்கு, ஆப்ஸ் பதிலளிக்கவில்லை என்ற செய்தியைக் காட்டும்"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"அறிவிப்புச் சேனல் எச்சரிக்கைகளைக் காட்டு"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"ஆப்ஸானது சரியான சேனல் இல்லாமல் அறிவிப்பை இடுகையிடும் போது, திரையில் எச்சரிக்கையைக் காட்டும்"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"உரையாடல் அறிவிப்புகளுக்கான ஷார்ட்கட்களை செயல்படுத்து"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"அறிவிப்புகளானது உரையாடல் பிரிவில் தோன்ற வேண்டும் எனில் அவை நீண்ட காலம் செயல்பாட்டில் இருந்த பகிர்தலுக்கான ஷார்ட்கட் ஆதரவைக் கொண்டிருக்க வேண்டும்"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"ஆப்ஸை வெளிப்புறச் சேமிப்பிடத்தில் அனுமதி"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"மேனிஃபெஸ்ட் மதிப்புகளைப் பொருட்படுத்தாமல், எல்லா ஆப்ஸையும் வெளிப்புறச் சேமிப்பிடத்தில் எழுத அனுமதிக்கும்"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"செயல்பாடுகளை அளவுமாறக்கூடியதாக அமை"</string>
@@ -418,7 +421,7 @@
     <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"நிறம் அடையாளங்காண முடியாமை (சிவப்பு-பச்சை)"</string>
     <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"நிறம் அடையாளங்காண முடியாமை (நீலம்-மஞ்சள்)"</string>
     <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"வண்ணத்திருத்தம்"</string>
-    <string name="accessibility_display_daltonizer_preference_subtitle" msgid="1284746051652993443">"வண்ணத் திருத்தத்தைப் பயன்படுத்தி உங்கள் சாதனத்தில் வண்ணம் காண்பிக்கப்படும் விதத்தைச் சரிசெய்யலாம்"</string>
+    <string name="accessibility_display_daltonizer_preference_subtitle" msgid="1284746051652993443">"கலர் கரெக்‌ஷனைப் பயன்படுத்தி உங்கள் சாதனத்தில் வண்ணங்கள் காண்பிக்கப்படும் விதத்தைச் சரிசெய்யலாம்"</string>
     <string name="daltonizer_type_overridden" msgid="4509604753672535721">"<xliff:g id="TITLE">%1$s</xliff:g> மூலம் மேலெழுதப்பட்டது"</string>
     <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
     <string name="power_remaining_duration_only" msgid="8264199158671531431">"கிட்டத்தட்ட <xliff:g id="TIME_REMAINING">%1$s</xliff:g> மீதமுள்ளது"</string>
@@ -432,12 +435,15 @@
     <string name="power_discharge_by" msgid="4113180890060388350">"<xliff:g id="TIME">%1$s</xliff:g> வரை பயன்படுத்த முடியும் (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
     <string name="power_discharge_by_only" msgid="92545648425937000">"<xliff:g id="TIME">%1$s</xliff:g> வரை பயன்படுத்த முடியும்"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"<xliff:g id="TIME">%1$s</xliff:g> வரை"</string>
-    <!-- no translation found for power_suggestion_battery_run_out (6332089307827787087) -->
+    <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"<xliff:g id="TIME">%1$s</xliff:g>க்கு பேட்டரி காலியாகிவிடக்கூடும்"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
     <skip />
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"<xliff:g id="THRESHOLD">%1$s</xliff:g>க்கும் குறைவாகவே பயன்படுத்த முடியும்"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"<xliff:g id="THRESHOLD">%1$s</xliff:g>க்கும் குறைவாகவே பயன்படுத்த முடியும் (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g>க்கும் மேல் பயன்படுத்த முடியும் (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g>க்கும் மேல் பயன்படுத்த முடியும்"</string>
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"மொபைல் விரைவில் ஆஃப் ஆகக்கூடும்"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"டேப்லெட் விரைவில் ஆஃப் ஆகக்கூடும்"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"சாதனம் விரைவில் ஆஃப் ஆகக்கூடும்"</string>
@@ -511,32 +517,21 @@
     <string name="media_transfer_this_device_name" msgid="2716555073132169240">"மொபைல் ஸ்பீக்கர்"</string>
     <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"இணைப்பதில் சிக்கல். சாதனத்தை ஆஃப் செய்து மீண்டும் ஆன் செய்யவும்"</string>
     <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"வயருடன்கூடிய ஆடியோ சாதனம்"</string>
-    <!-- no translation found for help_label (3528360748637781274) -->
-    <skip />
-    <!-- no translation found for storage_category (2287342585424631813) -->
-    <skip />
-    <!-- no translation found for shared_data_title (1017034836800864953) -->
-    <skip />
-    <!-- no translation found for shared_data_summary (5516326713822885652) -->
-    <skip />
+    <string name="help_label" msgid="3528360748637781274">"உதவியும் கருத்தும்"</string>
+    <string name="storage_category" msgid="2287342585424631813">"சேமிப்பகம்"</string>
+    <string name="shared_data_title" msgid="1017034836800864953">"பகிரப்பட்ட தரவு"</string>
+    <string name="shared_data_summary" msgid="5516326713822885652">"பகிரப்பட்ட தரவைப் பார்க்கலாம், மாற்றலாம்"</string>
     <string name="shared_data_no_blobs_text" msgid="3108114670341737434">"இந்தப் பயனருடன் பகிரப்பட்ட தரவு எதுவும் இல்லை."</string>
     <string name="shared_data_query_failure_text" msgid="3489828881998773687">"பகிரப்பட்ட தரவைப் பெறுவதில் பிழை. மீண்டும் முயலவும்."</string>
-    <!-- no translation found for blob_id_text (8680078988996308061) -->
-    <skip />
-    <!-- no translation found for blob_expires_text (7882727111491739331) -->
-    <skip />
+    <string name="blob_id_text" msgid="8680078988996308061">"பகிர்ந்த தரவு ஐடி: <xliff:g id="BLOB_ID">%d</xliff:g>"</string>
+    <string name="blob_expires_text" msgid="7882727111491739331">"<xliff:g id="DATE">%s</xliff:g> அன்று காலாவதியாகும்"</string>
     <string name="shared_data_delete_failure_text" msgid="3842701391009628947">"பகிரப்பட்ட தரவை நீக்குவதில் பிழை."</string>
     <string name="shared_data_no_accessors_dialog_text" msgid="8903738462570715315">"இந்தப் பகிரப்பட்ட தரவிற்காகப் பெறப்பட்ட ஒப்பந்தங்கள் எதுவும் இல்லை. இதை நீக்க விரும்புகிறீர்களா?"</string>
-    <!-- no translation found for accessor_info_title (8289823651512477787) -->
-    <skip />
-    <!-- no translation found for accessor_no_description_text (7510967452505591456) -->
-    <skip />
-    <!-- no translation found for accessor_expires_text (4625619273236786252) -->
-    <skip />
-    <!-- no translation found for delete_blob_text (2819192607255625697) -->
-    <skip />
-    <!-- no translation found for delete_blob_confirmation_text (7807446938920827280) -->
-    <skip />
+    <string name="accessor_info_title" msgid="8289823651512477787">"தரவைப் பகிர்ந்துகொள்ளும் ஆப்ஸ்"</string>
+    <string name="accessor_no_description_text" msgid="7510967452505591456">"ஆப்ஸ் எந்த விளக்கத்தையும் வழங்கவில்லை."</string>
+    <string name="accessor_expires_text" msgid="4625619273236786252">"<xliff:g id="DATE">%s</xliff:g> அன்று குத்தகை காலாவதியாகும்"</string>
+    <string name="delete_blob_text" msgid="2819192607255625697">"பகிரப்பட்ட தரவை நீக்கு"</string>
+    <string name="delete_blob_confirmation_text" msgid="7807446938920827280">"பகிரப்பட்ட இந்தத் தரவை நிச்சயமாக நீக்க வேண்டுமா?"</string>
     <string name="user_add_user_item_summary" msgid="5748424612724703400">"பயனர்கள் தங்களுக்குச் சொந்தமான ஆப்ஸ் மற்றும் உள்ளடக்கத்தை வைத்திருக்க வேண்டும்"</string>
     <string name="user_add_profile_item_summary" msgid="5418602404308968028">"உங்கள் கணக்கிலிருந்து ஆப்ஸ் மற்றும் உள்ளடக்கத்திற்கான அணுகலை நீங்கள் வரையறுக்கலாம்"</string>
     <string name="user_add_user_item_title" msgid="2394272381086965029">"பயனர்"</string>
@@ -556,12 +551,8 @@
     <string name="profile_info_settings_title" msgid="105699672534365099">"சுயவிவரத் தகவல்"</string>
     <string name="user_need_lock_message" msgid="4311424336209509301">"நீங்கள் வரையறுக்கப்பட்டச் சுயவிவரத்தை உருவாக்குவதற்கு முன்பு, உங்கள் ஆப்ஸ் மற்றும் தனிப்பட்ட தரவைப் பாதுகாக்கும் வகையில் நீங்கள் திரைப் பூட்டை அமைக்க வேண்டும்."</string>
     <string name="user_set_lock_button" msgid="1427128184982594856">"பூட்டை அமை"</string>
-    <!-- no translation found for user_switch_to_user (6975428297154968543) -->
-    <skip />
-    <!-- no translation found for guest_new_guest (3482026122932643557) -->
-    <skip />
-    <!-- no translation found for guest_exit_guest (5908239569510734136) -->
-    <skip />
-    <!-- no translation found for guest_nickname (6332276931583337261) -->
-    <skip />
+    <string name="user_switch_to_user" msgid="6975428297154968543">"<xliff:g id="USER_NAME">%s</xliff:g>க்கு மாறு"</string>
+    <string name="guest_new_guest" msgid="3482026122932643557">"கெஸ்ட்டைச் சேர்"</string>
+    <string name="guest_exit_guest" msgid="5908239569510734136">"கெஸ்ட்டை அகற்று"</string>
+    <string name="guest_nickname" msgid="6332276931583337261">"கெஸ்ட்"</string>
 </resources>
diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml
index 0e763dd..ff958ea 100644
--- a/packages/SettingsLib/res/values-te/strings.xml
+++ b/packages/SettingsLib/res/values-te/strings.xml
@@ -86,7 +86,7 @@
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"ఫైల్ బదిలీ"</string>
     <string name="bluetooth_profile_hid" msgid="2969922922664315866">"ఇన్‌పుట్ పరికరం"</string>
     <string name="bluetooth_profile_pan" msgid="1006235139308318188">"ఇంటర్నెట్ యాక్సెస్"</string>
-    <string name="bluetooth_profile_pbap" msgid="7064307749579335765">"పరిచయ భాగస్వామ్యం"</string>
+    <string name="bluetooth_profile_pbap" msgid="7064307749579335765">"కాంటాక్ట్ షేరింగ్"</string>
     <string name="bluetooth_profile_pbap_summary" msgid="2955819694801952056">"పరిచయ భాగస్వామ్యం కోసం ఉపయోగించు"</string>
     <string name="bluetooth_profile_pan_nap" msgid="7871974753822470050">"ఇంటర్నెట్ కనెక్షన్ భాగస్వామ్యం"</string>
     <string name="bluetooth_profile_map" msgid="8907204701162107271">"వచన సందేశాలు"</string>
@@ -212,7 +212,7 @@
     <string name="adb_wireless_settings" msgid="2295017847215680229">"వైర్‌లెస్ డీబగ్గింగ్"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"అందుబాటులో వున్న పరికరాలను చూడటానికి, ఉపయోగించడానికి, వైర్‌లెస్ డీబగ్గింగ్‌ను ఆన్ చేయండి"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"QR కోడ్‌తో పరికరాన్ని పెయిర్ చేయండి"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"QR కోడ్ స్కానర్‌ను ఉపయోగించి కొత్త పరికరాలను పెయిర్ చేయండి"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"QR కోడ్ స్కానర్‌ను ఉపయోగించి కొత్త పరికరాలను పెయిర్ చేయండి"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"పెయిరింగ్ కోడ్‌తో పరికరాన్ని పెయిర్ చేయండి"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"ఆరు అంకెల కోడ్‌ను ఉపయోగించి కొత్త పరికరాలను పెయిర్ చేయండి"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"పెయిర్ చేయబడిన పరికరాలు"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"పరికరాన్ని పెయిర్ చేయడం విఫలమైంది. QR కోడ్ తప్పుగా ఉండడం గాని, లేదా పరికరం అదే నెట్‌వర్క్‌కు కనెక్ట్ అయి లేకపోవడం గాని జరిగింది."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"IP చిరునామా &amp; పోర్ట్"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"QR కోడ్‌ను స్కాన్ చేయండి"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"పరికరాన్ని Wi-Fi ద్వారా పెయిర్ చేయడానికి QR కోడ్‌ను స్కాన్ చేయండి"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"QR కోడ్‌ను స్కాన్ చేయడం ద్వారా Wi-Fiని ఉపయోగించి పరికరాన్ని పెయిర్ చెయ్యండి"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"దయచేసి Wi-Fi నెట్‌వర్క్‌కు కనెక్ట్ చేయండి"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, డీబగ్, dev"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"బగ్ నివేదిక షార్ట్‌కట్"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"వైర్‌లెస్ ప్రదర్శన ప్రామాణీకరణ"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"Wi‑Fi విశదీకృత లాగింగ్‌ను ప్రారంభించండి"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"Wi‑Fi స్కాన్ కుదింపు"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"Wi‑Fi ద్వారా మెరుగయిన MAC ర్యాండమైజేషన్"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"మొబైల్ డేటాని ఎల్లప్పుడూ యాక్టివ్‌గా ఉంచు"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"టెథెరింగ్ హార్డ్‌వేర్ వేగవృద్ధి"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"పేర్లు లేని బ్లూటూత్ పరికరాలు  చూపించు"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"వైర్‌లెస్ ప్రదర్శన సర్టిఫికెట్ కోసం ఎంపికలను చూపు"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Wi‑Fi ఎంపికలో SSID RSSI ప్రకారం చూపబడే Wi‑Fi లాగింగ్ స్థాయిని పెంచండి"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"బ్యాటరీ శక్తి వినియోగాన్ని తగ్గించి &amp; నెట్‌వర్క్ పనితీరును మెరుగుపరుస్తుంది"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"క్లయింట్ మోడ్‌లో మాత్రమే MAC ర్యాండమైజేషన్ ప్రవర్తనను ఈ టోగుల్ ప్రభావితం చేస్తుంది.\nఈ మోడ్‌ను యాక్టివేట్ చేసినప్పుడు, క్లయింట్ చివరిసారిగా నెట్‌వర్క్ నుండి ఎప్పుడు డిస్‌కనెక్ట్ చేసారనే దానిని బట్టి, అనుబంధం జరిగేటప్పుడు MAC ర్యాండమైజేషన్ ఎనేబుల్ చేయబడిన ఏ నెట్‌వర్క్‌లు అయినా వాటి MAC చిరునామాలను తిరిగి ర్యాండమైజేషన్ చేయవచ్చు. పరికరం 4 గంటలు లేదా అంతకన్నా తక్కువ సమయంలో మళ్లీ కనెక్ట్ చేయబడితే తిరిగి ర్యాండమైజేషన్ చేయడమనేది జరగదు."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"గణించబడుతోంది"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"గణించబడటం లేదు"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"లాగర్ బఫర్ పరిమాణాలు"</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"నేపథ్య యాప్‌ల కోసం యాప్ ప్రతిస్పందించడం లేదు అనే డైలాగ్‌ను చూపు"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"ఛానెల్ హెచ్చరికల నోటిఫికేషన్‌‌ను చూపు"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"చెల్లుబాటు అయ్యే ఛానెల్ లేకుండా యాప్ నోటిఫికేషన్‌ను పోస్ట్ చేస్తున్నప్పుడు స్క్రీన్‌పై హెచ్చరికను చూపిస్తుంది"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"సంభాషణ నోటిఫికేషన్‌లకు షార్ట్‌కట్‌ల అమలు"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"సంభాషణల విభాగంలో కనిపించడానికి చిరకాలం నిలిచిపోయే భాగస్వామ్య సత్వరమార్గం ద్వారా నోటిఫికేషన్‌లకు మద్దతు ఉండాలి."</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"యాప్‌లను బాహ్య నిల్వలో తప్పనిసరిగా అనుమతించు"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"ఏ యాప్‌ని అయినా మానిఫెస్ట్ విలువలతో సంబంధం లేకుండా బాహ్య నిల్వలో సేవ్ చేయడానికి అనుమతిస్తుంది"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"కార్య‌క‌లాపాల విండోల ప‌రిమాణం మార్చ‌గ‌లిగేలా నిర్బంధించు"</string>
@@ -432,10 +436,14 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"దాదాపు <xliff:g id="TIME">%1$s</xliff:g> వరకు ఉండాలి"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"<xliff:g id="TIME">%1$s</xliff:g> వరకు"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"బ్యాటరీ <xliff:g id="TIME">%1$s</xliff:g> సమయానికి ఖాళీ అవ్వచ్చు"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"<xliff:g id="THRESHOLD">%1$s</xliff:g> కంటే తక్కువ సమయం మిగిలి ఉంది"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"<xliff:g id="THRESHOLD">%1$s</xliff:g> కంటే తక్కువ సమయం మిగిలి ఉంది (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> కంటే ఎక్కువ సమయం మిగిలి ఉంది (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> కంటే ఎక్కువ సమయం మిగిలి ఉంది"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"ఫోన్ త్వరలో షట్‌డౌన్ కావచ్చు"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"టాబ్లెట్ త్వరలో షట్‌డౌన్ కావచ్చు"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"పరికరం త్వరలో షట్‌డౌన్ కావచ్చు"</string>
@@ -529,7 +537,7 @@
     <string name="user_add_user_item_title" msgid="2394272381086965029">"వినియోగదారు"</string>
     <string name="user_add_profile_item_title" msgid="3111051717414643029">"పరిమితం చేయబడిన ప్రొఫైల్"</string>
     <string name="user_add_user_title" msgid="5457079143694924885">"కొత్త వినియోగదారుని జోడించాలా?"</string>
-    <string name="user_add_user_message_long" msgid="1527434966294733380">"అదనపు వినియోగదారులను సృష్టించడం ద్వారా మీరు ఈ పరికరాన్ని ఇతరులతో షేర్ చేయవచ్చు. ప్రతి వినియోగదారుకు వారికంటూ ప్రత్యేక స్థలం ఉంటుంది, వారు ఆ స్థలాన్ని యాప్‌లు, వాల్‌పేపర్ మొదలైనవాటితో అనుకూలీకరించవచ్చు. వినియోగదారులు ప్రతి ఒక్కరిపై ప్రభావం చూపే Wi‑Fi వంటి పరికర సెట్టింగ్‌లను కూడా సర్దుబాటు చేయవచ్చు.\n\nమీరు కొత్త వినియోగదారును జోడించినప్పుడు, ఆ వ్యక్తి వారికంటూ స్వంత స్థలం సెట్ చేసుకోవాలి.\n\nఏ వినియోగదారు అయినా మిగిలిన అందరు వినియోగదారుల కోసం యాప్‌లను అప్‌డేట్ చేయవచ్చు. యాక్సెస్ సామర్ధ్యం సెట్టింగ్‌లు మరియు సేవలు కొత్త వినియోగదారుకి బదిలీ కాకపోవచ్చు."</string>
+    <string name="user_add_user_message_long" msgid="1527434966294733380">"అదనపు యూజర్‌లను సృష్టించడం ద్వారా మీరు ఈ దేవైజ్‌ను ఇతరులతో షేర్ చేయవచ్చు. ప్రతి యూజర్‌కు‌ వారికంటూ ప్రత్యేక స్థలం ఉంటుంది, వారు ఆ స్థలాన్ని యాప్‌లు, వాల్‌పేపర్ మొదలైనవాటితో అనుకూలీకరించవచ్చు. యూజర్‌లు ప్రతి ఒక్కరిపై ప్రభావం చూపే Wi‑Fi వంటి పరికర సెట్టింగ్‌లను కూడా సర్దుబాటు చేయవచ్చు.\n\nమీరు కొత్త యూజర్ ను జోడించినప్పుడు, ఆ వ్యక్తి వారికంటూ స్వంత స్థలం సెట్ చేసుకోవాలి.\n\nఏ వినియోగదారు అయినా మిగిలిన అందరు యూజర్‌ల కోసం యాప్‌లను అప్‌డేట్ చేయవచ్చు. యాక్సెస్ సామర్ధ్యం సెట్టింగ్‌లు మరియు సేవలు కొత్త యూజర్‌కి బదిలీ కాకపోవచ్చు."</string>
     <string name="user_add_user_message_short" msgid="3295959985795716166">"మీరు కొత్త వినియోగదారుని జోడించినప్పుడు, ఆ వ్యక్తి తన స్థలాన్ని సెటప్ చేసుకోవాలి.\n\nఏ వినియోగదారు అయినా మిగతా అందరు వినియోగదారుల కోసం యాప్‌లను అప్‌డేట్‌ చేయగలరు."</string>
     <string name="user_setup_dialog_title" msgid="8037342066381939995">"ఇప్పుడు వినియోగదారుని సెటప్ చేయాలా?"</string>
     <string name="user_setup_dialog_message" msgid="269931619868102841">"పరికరాన్ని తీసుకోవడానికి వ్యక్తి అందుబాటులో ఉన్నారని నిర్ధారించుకొని, ఆపై వారికి నిల్వ స్థలాన్ని సెటప్ చేయండి"</string>
diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml
index b24f006d..844a329 100644
--- a/packages/SettingsLib/res/values-th/strings.xml
+++ b/packages/SettingsLib/res/values-th/strings.xml
@@ -23,7 +23,7 @@
     <string name="wifi_fail_to_scan" msgid="2333336097603822490">"ไม่สามารถสแกนหาเครือข่าย"</string>
     <string name="wifi_security_none" msgid="7392696451280611452">"ไม่มี"</string>
     <string name="wifi_remembered" msgid="3266709779723179188">"บันทึกแล้ว"</string>
-    <string name="wifi_disconnected" msgid="7054450256284661757">"เลิกเชื่อมต่อแล้ว"</string>
+    <string name="wifi_disconnected" msgid="7054450256284661757">"ยกเลิกการเชื่อมต่อแล้ว"</string>
     <string name="wifi_disabled_generic" msgid="2651916945380294607">"ปิดอยู่"</string>
     <string name="wifi_disabled_network_failure" msgid="2660396183242399585">"การกำหนดค่า IP ล้มเหลว"</string>
     <string name="wifi_disabled_by_recommendation_provider" msgid="1302938248432705534">"ไม่ได้เชื่อมต่อเนื่องจากเครือข่ายคุณภาพต่ำ"</string>
@@ -35,7 +35,7 @@
     <string name="wifi_not_in_range" msgid="1541760821805777772">"ไม่อยู่ในพื้นที่ให้บริการ"</string>
     <string name="wifi_no_internet_no_reconnect" msgid="821591791066497347">"จะไม่เชื่อมต่อโดยอัตโนมัติ"</string>
     <string name="wifi_no_internet" msgid="1774198889176926299">"เข้าถึงอินเทอร์เน็ตไม่ได้"</string>
-    <string name="saved_network" msgid="7143698034077223645">"บันทึกโดย <xliff:g id="NAME">%1$s</xliff:g> แล้ว"</string>
+    <string name="saved_network" msgid="7143698034077223645">"บันทึกโดย<xliff:g id="NAME">%1$s</xliff:g> แล้ว"</string>
     <string name="connected_via_network_scorer" msgid="7665725527352893558">"เชื่อมต่ออัตโนมัติผ่าน %1$s แล้ว"</string>
     <string name="connected_via_network_scorer_default" msgid="7973529709744526285">"เชื่อมต่ออัตโนมัติผ่านผู้ให้บริการการจัดอันดับเครือข่าย"</string>
     <string name="connected_via_passpoint" msgid="7735442932429075684">"เชื่อมต่อผ่าน %1$s แล้ว"</string>
@@ -93,8 +93,8 @@
     <string name="bluetooth_profile_sap" msgid="8304170950447934386">"การเข้าถึงซิม"</string>
     <string name="bluetooth_profile_a2dp_high_quality" msgid="4739440941324792775">"เสียง HD: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
     <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="2477639096903834374">"เสียง HD"</string>
-    <string name="bluetooth_profile_hearing_aid" msgid="58154575573984914">"เครื่องช่วยการได้ยิน"</string>
-    <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="8191273236809964030">"เชื่อมต่อกับเครื่องช่วยการได้ยินแล้ว"</string>
+    <string name="bluetooth_profile_hearing_aid" msgid="58154575573984914">"เครื่องช่วยฟัง"</string>
+    <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="8191273236809964030">"เชื่อมต่อกับเครื่องช่วยฟังแล้ว"</string>
     <string name="bluetooth_a2dp_profile_summary_connected" msgid="7422607970115444153">"เชื่อมต่อกับระบบเสียงของสื่อแล้ว"</string>
     <string name="bluetooth_headset_profile_summary_connected" msgid="2420981566026949688">"เชื่อมต่อกับระบบเสียงของโทรศัพท์แล้ว"</string>
     <string name="bluetooth_opp_profile_summary_connected" msgid="2393521801478157362">"เชื่อมต่อกับเซิร์ฟเวอร์สำหรับโอนไฟล์แล้ว"</string>
@@ -111,7 +111,7 @@
     <string name="bluetooth_headset_profile_summary_use_for" msgid="808970643123744170">"ใช้สำหรับระบบเสียงของโทรศัพท์"</string>
     <string name="bluetooth_opp_profile_summary_use_for" msgid="461981154387015457">"ใช้สำหรับการโอนไฟล์"</string>
     <string name="bluetooth_hid_profile_summary_use_for" msgid="4289460627406490952">"ใช้สำหรับการป้อนข้อมูล"</string>
-    <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="7689393730163320483">"ใช้สำหรับเครื่องช่วยการได้ยิน"</string>
+    <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="7689393730163320483">"ใช้สำหรับเครื่องช่วยฟัง"</string>
     <string name="bluetooth_pairing_accept" msgid="2054232610815498004">"จับคู่อุปกรณ์"</string>
     <string name="bluetooth_pairing_accept_all_caps" msgid="2734383073450506220">"จับคู่อุปกรณ์"</string>
     <string name="bluetooth_pairing_decline" msgid="6483118841204885890">"ยกเลิก"</string>
@@ -127,8 +127,8 @@
     <string name="bluetooth_talkback_headphone" msgid="8613073829180337091">"หูฟัง"</string>
     <string name="bluetooth_talkback_input_peripheral" msgid="5133944817800149942">"อุปกรณ์อินพุต"</string>
     <string name="bluetooth_talkback_bluetooth" msgid="1143241359781999989">"บลูทูธ"</string>
-    <string name="bluetooth_hearingaid_left_pairing_message" msgid="8561855779703533591">"กำลังจับคู่กับเครื่องช่วยการได้ยินข้างซ้าย…"</string>
-    <string name="bluetooth_hearingaid_right_pairing_message" msgid="2655347721696331048">"กำลังจับคู่กับเครื่องช่วยการได้ยินข้างขวา…"</string>
+    <string name="bluetooth_hearingaid_left_pairing_message" msgid="8561855779703533591">"กำลังจับคู่กับเครื่องช่วยฟังข้างซ้าย…"</string>
+    <string name="bluetooth_hearingaid_right_pairing_message" msgid="2655347721696331048">"กำลังจับคู่กับเครื่องช่วยฟังข้างขวา…"</string>
     <string name="bluetooth_hearingaid_left_battery_level" msgid="7375621694748104876">"ข้างซ้าย - แบตเตอรี่ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
     <string name="bluetooth_hearingaid_right_battery_level" msgid="1850094448499089312">"ข้างขวา - แบตเตอรี่ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
     <string name="accessibility_wifi_off" msgid="1195445715254137155">"Wi-Fi ปิดอยู่"</string>
@@ -149,13 +149,13 @@
     <string name="tether_settings_title_usb_bluetooth" msgid="1727111807207577322">"การปล่อยสัญญาณ"</string>
     <string name="tether_settings_title_all" msgid="8910259483383010470">"การปล่อยสัญญาณและฮอตสปอต"</string>
     <string name="managed_user_title" msgid="449081789742645723">"แอปการทำงานทั้งหมด"</string>
-    <string name="user_guest" msgid="6939192779649870792">"ผู้เข้าร่วม"</string>
+    <string name="user_guest" msgid="6939192779649870792">"ผู้ใช้ชั่วคราว"</string>
     <string name="unknown" msgid="3544487229740637809">"ไม่ทราบ"</string>
     <string name="running_process_item_user_label" msgid="3988506293099805796">"ผู้ใช้: <xliff:g id="USER_NAME">%1$s</xliff:g>"</string>
     <string name="launch_defaults_some" msgid="3631650616557252926">"ตั้งค่าเริ่มต้นไว้บางส่วน"</string>
     <string name="launch_defaults_none" msgid="8049374306261262709">"ไม่ได้ตั้งค่าเริ่มต้น"</string>
     <string name="tts_settings" msgid="8130616705989351312">"การตั้งค่าการอ่านออกเสียงข้อความ"</string>
-    <string name="tts_settings_title" msgid="7602210956640483039">"เอาต์พุตการอ่านออกเสียง"</string>
+    <string name="tts_settings_title" msgid="7602210956640483039">"เอาต์พุตการอ่านออกเสียงข้อความ"</string>
     <string name="tts_default_rate_title" msgid="3964187817364304022">"ความเร็วของคำพูด"</string>
     <string name="tts_default_rate_summary" msgid="3781937042151716987">"ความเร็วในการพูดข้อความ"</string>
     <string name="tts_default_pitch_title" msgid="6988592215554485479">"ความสูง-ต่ำของเสียง"</string>
@@ -196,7 +196,7 @@
     <string name="choose_profile" msgid="343803890897657450">"เลือกโปรไฟล์"</string>
     <string name="category_personal" msgid="6236798763159385225">"ส่วนตัว"</string>
     <string name="category_work" msgid="4014193632325996115">"ที่ทำงาน"</string>
-    <string name="development_settings_title" msgid="140296922921597393">"สำหรับนักพัฒนาซอฟต์แวร์"</string>
+    <string name="development_settings_title" msgid="140296922921597393">"ตัวเลือกสำหรับนักพัฒนาซอฟต์แวร์"</string>
     <string name="development_settings_enable" msgid="4285094651288242183">"เปิดใช้ตัวเลือกสำหรับนักพัฒนาซอฟต์แวร์"</string>
     <string name="development_settings_summary" msgid="8718917813868735095">"ตั้งค่าตัวเลือกสำหรับการพัฒนาแอปพลิเคชัน"</string>
     <string name="development_settings_not_available" msgid="355070198089140951">"ตัวเลือกสำหรับนักพัฒนาซอฟต์แวร์ไม่สามารถใช้ได้สำหรับผู้ใช้นี้"</string>
@@ -212,7 +212,7 @@
     <string name="adb_wireless_settings" msgid="2295017847215680229">"การแก้ไขข้อบกพร่องผ่าน Wi-Fi"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"หากต้องการดูและใช้อุปกรณ์ที่มีอยู่ ให้เปิดการแก้ไขข้อบกพร่องผ่าน Wi-Fi"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"จับคู่อุปกรณ์ด้วยคิวอาร์โค้ด"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"จับคู่อุปกรณ์เครื่องใหม่โดยใช้เครื่องมือสแกนคิวอาร์โค้ด"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"จับคู่อุปกรณ์เครื่องใหม่โดยใช้เครื่องมือสแกนคิวอาร์โค้ด"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"จับคู่อุปกรณ์ด้วยรหัสการจับคู่"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"จับคู่อุปกรณ์เครื่องใหม่โดยใช้รหัสตัวเลข 6 หลัก"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"อุปกรณ์ที่จับคู่"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"จับคู่อุปกรณ์ไม่สำเร็จ คิวอาร์โค้ดไม่ถูกต้อง หรืออุปกรณ์ไม่ได้เชื่อมต่อกับเครือข่ายเดียวกัน"</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"ที่อยู่ IP และพอร์ต"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"สแกนคิวอาร์โค้ด"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"จับคู่อุปกรณ์ผ่าน Wi‑Fi ด้วยการสแกนคิวอาร์โค้ด"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"จับคู่อุปกรณ์ผ่าน Wi‑Fi ด้วยการสแกนคิวอาร์โค้ด"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"โปรดเชื่อมต่อกับเครือข่าย Wi-Fi"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, แก้ไขข้อบกพร่อง, พัฒนา"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"ทางลัดรายงานข้อบกพร่อง"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"การรับรองการแสดงผลแบบไร้สาย"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"เปิดใช้การบันทึกรายละเอียด Wi-Fi"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"การควบคุมการสแกนหา Wi‑Fi"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"การสุ่ม MAC เพื่อเพิ่มความปลอดภัย Wi-Fi"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"เปิดใช้เน็ตมือถือเสมอ"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"การเร่งฮาร์ดแวร์การเชื่อมต่ออินเทอร์เน็ตผ่านมือถือ"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"แสดงอุปกรณ์บลูทูธที่ไม่มีชื่อ"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"แสดงตัวเลือกสำหรับการรับรองการแสดงผล แบบไร้สาย"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"เพิ่มระดับการบันทึก Wi‑Fi แสดงต่อ SSID RSSI ในตัวเลือก Wi‑Fi"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"ลดการเปลืองแบตเตอรี่และเพิ่มประสิทธิภาพเครือข่าย"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"การตั้งค่านี้ส่งผลต่อลักษณะการสุ่ม MAC ในโหมดไคลเอ็นต์เท่านั้น\nเมื่อเปิดใช้งานโหมดนี้ ทุกเครือข่ายที่มีการเปิดใช้การสุ่ม MAC อาจสุ่มที่อยู่ MAC ซ้ำในระหว่างการเชื่อมโยง ทั้งนี้ขึ้นอยู่กับว่าไคลเอ็นต์ยกเลิกการเชื่อมต่อกับเครือข่ายครั้งสุดท้ายเมื่อใด การสุ่มซ้ำจะไม่เกิดขึ้นหากอุปกรณ์เชื่อมต่ออีกครั้งภายในไม่เกิน 4 ชั่วโมง"</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"มีการวัดปริมาณอินเทอร์เน็ต"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"ไม่มีการวัดปริมาณอินเทอร์เน็ต"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"ขนาดบัฟเฟอร์ของตัวบันทึก"</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"แสดงกล่องโต้ตอบ \"แอปไม่ตอบสนอง\" สำหรับแอปพื้นหลัง"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"แสดงคำเตือนจากช่องทางการแจ้งเตือน"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"แสดงคำเตือนบนหน้าจอเมื่อแอปโพสต์การแจ้งเตือนโดยไม่มีช่องทางที่ถูกต้อง"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"บังคับใช้ทางลัดสำหรับการแจ้งเตือนการสนทนา"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"ต้องทำให้การแจ้งเตือนปรากฏในส่วนการสนทนาได้อีกถ้ามีการปิดไปโดยใช้ทางลัดการแชร์ที่แสดงอยู่ตลอด"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"บังคับให้แอปสามารถใช้ที่เก็บภายนอก"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"เขียนแอปในพื้นที่เก็บข้อมูลภายนอกได้ โดยไม่คำนึงถึงค่าไฟล์ Manifest"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"บังคับให้กิจกรรมปรับขนาดได้"</string>
@@ -432,10 +436,14 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"น่าจะใช้งานได้ถึงเวลาประมาณ <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"จนถึง <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"แบตเตอรี่อาจหมดภายใน <xliff:g id="TIME">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"เหลืออีกไม่ถึง <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"เหลือเวลาอีกไม่ถึง <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"เหลือเวลามากกว่า <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"เหลือเวลามากกว่า <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"โทรศัพท์อาจปิดเครื่องในไม่ช้า"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"แท็บเล็ตอาจปิดเครื่องในไม่ช้า"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"อุปกรณ์อาจปิดเครื่องในไม่ช้า"</string>
@@ -443,11 +451,11 @@
     <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"แท็บเล็ตอาจปิดเครื่องในไม่ช้า (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
     <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"อุปกรณ์อาจปิดเครื่องในไม่ช้า (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
     <string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
-    <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"เหลือ <xliff:g id="TIME">%1$s</xliff:g> จนกว่าจะชาร์จ"</string>
+    <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"เหลือ <xliff:g id="TIME">%1$s</xliff:g> จนกว่าจะชาร์จเต็ม"</string>
     <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> จนกว่าจะชาร์จ"</string>
     <string name="battery_info_status_unknown" msgid="268625384868401114">"ไม่ทราบ"</string>
     <string name="battery_info_status_charging" msgid="4279958015430387405">"กำลังชาร์จ"</string>
-    <string name="battery_info_status_charging_fast" msgid="8027559755902954885">"กำลังชาร์จเร็ว"</string>
+    <string name="battery_info_status_charging_fast" msgid="8027559755902954885">"กำลังชาร์จอย่างเร็ว"</string>
     <string name="battery_info_status_charging_slow" msgid="3190803837168962319">"กำลังชาร์จอย่างช้าๆ"</string>
     <string name="battery_info_status_discharging" msgid="6962689305413556485">"ไม่ได้ชาร์จ"</string>
     <string name="battery_info_status_not_charging" msgid="8330015078868707899">"เสียบอยู่ ไม่สามารถชาร์จได้ในขณะนี้"</string>
@@ -483,7 +491,7 @@
     <string name="ims_reg_title" msgid="8197592958123671062">"สถานะการลงทะเบียน IMS"</string>
     <string name="ims_reg_status_registered" msgid="884916398194885457">"ลงทะเบียนแล้ว"</string>
     <string name="ims_reg_status_not_registered" msgid="2989287366045704694">"ไม่ได้ลงทะเบียน"</string>
-    <string name="status_unavailable" msgid="5279036186589861608">"ไม่ว่าง"</string>
+    <string name="status_unavailable" msgid="5279036186589861608">"ไม่มี"</string>
     <string name="wifi_status_mac_randomized" msgid="466382542497832189">"MAC เป็นแบบสุ่ม"</string>
     <plurals name="wifi_tether_connected_summary" formatted="false" msgid="6317236306047306139">
       <item quantity="other">มีอุปกรณ์ที่เชื่อมต่อ %1$d เครื่อง</item>
@@ -546,5 +554,5 @@
     <string name="user_switch_to_user" msgid="6975428297154968543">"เปลี่ยนเป็น <xliff:g id="USER_NAME">%s</xliff:g>"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"เพิ่มผู้เข้าร่วม"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"นำผู้เข้าร่วมออก"</string>
-    <string name="guest_nickname" msgid="6332276931583337261">"ผู้เข้าร่วม"</string>
+    <string name="guest_nickname" msgid="6332276931583337261">"ผู้ใช้ชั่วคราว"</string>
 </resources>
diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml
index 8d70718..412be0f 100644
--- a/packages/SettingsLib/res/values-tl/strings.xml
+++ b/packages/SettingsLib/res/values-tl/strings.xml
@@ -112,7 +112,7 @@
     <string name="bluetooth_opp_profile_summary_use_for" msgid="461981154387015457">"Ginagamit para sa paglilipat ng file"</string>
     <string name="bluetooth_hid_profile_summary_use_for" msgid="4289460627406490952">"Gamitin para sa input"</string>
     <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="7689393730163320483">"Gamitin para sa Mga Hearing Aid"</string>
-    <string name="bluetooth_pairing_accept" msgid="2054232610815498004">"Pares"</string>
+    <string name="bluetooth_pairing_accept" msgid="2054232610815498004">"Ipares"</string>
     <string name="bluetooth_pairing_accept_all_caps" msgid="2734383073450506220">"IPARES"</string>
     <string name="bluetooth_pairing_decline" msgid="6483118841204885890">"Kanselahin"</string>
     <string name="bluetooth_pairing_will_share_phonebook" msgid="3064334458659165176">"Nagbibigay ang pagpapares ng access sa iyong mga contact at history ng tawag kapag nakakonekta."</string>
@@ -212,7 +212,7 @@
     <string name="adb_wireless_settings" msgid="2295017847215680229">"Wireless na pag-debug"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Para makita at magamit ang mga available na device, i-on ang wireless na pag-debug"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Magpares ng device gamit ang QR code"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"Magpares ng mga bagong device gamit ang QR code Scanner"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"Magpares ng mga bagong device gamit ang pang-scan ng QR code"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Pinapares ang device gamit ang code ng pagpapares"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Magpares ng mga bagong device gamit ang six digit na code"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"Mga nakapares na device"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Hindi nagawang ipares ang device. Hindi tama ang QR code, o hindi nakakonekta ang device sa parehong network."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"IP address at Port"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"I-scan ang QR code"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"Ipares ang device gamit ang Wi‑Fi sa pamamagitan ng pag-scan ng isang QR Code"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Magpares ng device gamit ang Wi‑Fi sa pamamagitan ng pag-scan ng isang QR code"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Kumonekta sa Wi-Fi network"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, debug, dev"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"Shortcut ng ulat sa bug"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"Certification ng wireless display"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"I-enable ang Pagla-log sa Wi‑Fi Verbose"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"Pag-throttle ng pag-scan ng Wi‑Fi"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"MAC randomization na pinahusay ng Wi‑Fi"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"Palaging aktibo ang mobile data"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"Hardware acceleration para sa pag-tether"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Ipakita ang mga Bluetooth device na walang pangalan"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Ipakita ang mga opsyon para sa certification ng wireless display"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Pataasin ang antas ng Wi‑Fi logging, ipakita sa bawat SSID RSSI sa Wi‑Fi Picker"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Binabawasan ang pagkaubos ng baterya at pinapahusay ang performance ng network"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Nakakaapekto ang toggle na ito sa pag-kilos ng pag-randomize ng MAC para lang sa client mode.\nKapag na-activate ang mode na ito, baka ma-randomize ulit ang MAC address ng anumang network na naka-enable ang pag-randomize sa MAC habang nagaganap ang pag-uugnay, depende kung kailan huling nadiskonekta ang client sa network. Hindi nangyayari ang pag-randomize ulit kung kumonekta ulit ang device sa loob ng 4 na oras o mas maaga."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"Nakametro"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"Hindi Nakametro"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"Mga laki ng buffer ng Logger"</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"Ipakita ang dialog na Hindi Tumutugon ang App para sa mga app sa background"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Ipakita ang mga babala sa notification channel"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Nagpapakita ng babala sa screen kapag nag-post ang app ng notification nang walang wastong channel"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Magpatupad ng mga shortcut para sa mga notification ng pag-uusap"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Ipa-back up ang mga notification gamit ang long-lived na shortcut sa pagbabahagi para lumabas sa seksyong pag-uusap"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"Puwersahang payagan ang mga app sa external"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Ginagawang kwalipikado ang anumang app na mailagay sa external na storage, anuman ang mga value ng manifest"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"Sapilitang gawing resizable ang mga aktibidad"</string>
@@ -432,10 +436,14 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"Tatagal hanggang mga <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"Hanggang <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Posibleng maubos ang baterya sa loob ng <xliff:g id="TIME">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"Wala nang <xliff:g id="THRESHOLD">%1$s</xliff:g> ang natitira"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"Wala nang <xliff:g id="THRESHOLD">%1$s</xliff:g> ang natitira (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"Mahigit <xliff:g id="TIME_REMAINING">%1$s</xliff:g> pa ang natitira (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"Mahigit <xliff:g id="TIME_REMAINING">%1$s</xliff:g> pa ang natitira"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"Baka mag-shut down na ang telepono"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"Baka mag-shut down na ang tablet"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"Baka mag-shut down na ang device"</string>
diff --git a/packages/SettingsLib/res/values-tr/arrays.xml b/packages/SettingsLib/res/values-tr/arrays.xml
index 7ce6c24..cea17e5 100644
--- a/packages/SettingsLib/res/values-tr/arrays.xml
+++ b/packages/SettingsLib/res/values-tr/arrays.xml
@@ -249,7 +249,7 @@
   <string-array name="debug_hw_overdraw_entries">
     <item msgid="1968128556747588800">"Kapalı"</item>
     <item msgid="3033215374382962216">"Fazla çizilen alanları göster"</item>
-    <item msgid="3474333938380896988">"Alanları renk körlüğüne uygun olarak göster"</item>
+    <item msgid="3474333938380896988">"Alanları Döteranomaliye uygun olarak göster"</item>
   </string-array>
   <string-array name="app_process_limit_entries">
     <item msgid="794656271086646068">"Standart sınır"</item>
diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml
index 3579957..26f94bf1 100644
--- a/packages/SettingsLib/res/values-tr/strings.xml
+++ b/packages/SettingsLib/res/values-tr/strings.xml
@@ -212,7 +212,7 @@
     <string name="adb_wireless_settings" msgid="2295017847215680229">"Kablosuz hata ayıklama"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Mevcut cihazları görmek ve kullanmak için kablosuz hata ayıklamayı açın"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Cihazı QR kodu ile eşle"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"Yeni cihazları QR kodu Tarayıcıyı kullanarak eşleyin"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"Yeni cihazları QR kodu tarayıcıyı kullanarak eşleyin"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Eşleme kodu ile cihaz eşleme"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Yeni cihazları altı basamaklı kodu kullanarak eşleyin"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"Eşlenen cihazlar"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Cihaz eşlenemedi. QR kodu hatalı ya da cihaz aynı ağa bağlı değil."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"IP adresi ve Bağlantı noktası"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"QR kodunu tara"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"QR kodu tarayarak kablosuz ağ üzerinden cihaz eşleyin"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"QR kodu tarayarak kablosuz ağ üzerinden cihaz eşleyin"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Lütfen Kablosuz bir ağa bağlanın"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, hata ayıklama, dev"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"Hata raporu kısayolu"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"Kablosuz ekran sertifikası"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"Kablosuz Ayrıntılı Günlük Kaydını etkinleştir"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"Kablosuz ağ taramasını kısma"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"Kablosuz için geliştirilmiş MAC rastgele seçimi"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"Mobil veri her zaman etkin"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"Tethering donanım hızlandırıcısı"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Adsız Bluetooth cihazlarını göster"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Kablosuz ekran sertifikası seçeneklerini göster"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Kablosuz günlük kaydı seviyesini artır. Kablosuz Seçici\'de her bir SSID RSSI için göster."</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Pili daha az harcar ve ağ performansını iyileştirir"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Bu geçiş, yalnızca istemci modu için MAC rastgele hale getirme davranışını etkiler.\nBu mod etkinleştirildiğinde, MAC rastgele seçimi etkin olan tüm ağların MAC adresleri, istemcinin ağla bağlantısının en son kesildiği zamana bağlı olarak ilişkilendirme sırasında yeniden rastgele seçilebilir. Cihaz 4 saat veya daha kısa süre içinde tekrar bağlanırsa yeniden rastgele hale getirme gerçekleşmez."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"Sayaçlı"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"Sayaçsız"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"Günlük Kaydedici arabellek boyutları"</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"Arka plan uygulamalar için Uygulama Yanıt Vermiyor mesajını göster"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Bildirim kanalı uyarılarını göster"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Bir uygulama geçerli kanal olmadan bildirim yayınladığında ekranda uyarı gösterir"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Görüşme bildirimleri için kısayolları zorunlu kıl"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Bildirimlerin, görüşme bölümünde görünebilmesi için uzun ömürlü paylaşma kısayolu ile desteklenmesini gerektir"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"Harici birimdeki uygulamalara izin vermeye zorla"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Manifest değerlerinden bağımsız olarak uygulamaları harici depolamaya yazmak için uygun hale getirir"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"Etkinlikleri yeniden boyutlandırılabilmeye zorla"</string>
@@ -413,9 +417,9 @@
     <string name="picture_color_mode_desc" msgid="151780973768136200">"sRGB\'yi kullan"</string>
     <string name="daltonizer_mode_disabled" msgid="403424372812399228">"Devre dışı"</string>
     <string name="daltonizer_mode_monochromacy" msgid="362060873835885014">"Tam renk körlüğü"</string>
-    <string name="daltonizer_mode_deuteranomaly" msgid="3507284319584683963">"Yeşil renk körlüğü (kırmızı-yeşil)"</string>
-    <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Kırmızı renk körlüğü (kırmızı-yeşil)"</string>
-    <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Mavi renk körlüğü (mavi-sarı)"</string>
+    <string name="daltonizer_mode_deuteranomaly" msgid="3507284319584683963">"Döteranomali (kırmızı-yeşil)"</string>
+    <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomali (kırmızı-yeşil)"</string>
+    <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomali (mavi-sarı)"</string>
     <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Renk düzeltme"</string>
     <string name="accessibility_display_daltonizer_preference_subtitle" msgid="1284746051652993443">"Renk düzeltme, renklerin cihazınızda nasıl görüntüleneceğini düzenlemenize olanak sağlar."</string>
     <string name="daltonizer_type_overridden" msgid="4509604753672535721">"<xliff:g id="TITLE">%1$s</xliff:g> tarafından geçersiz kılındı"</string>
@@ -432,10 +436,14 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"Saat yaklaşık <xliff:g id="TIME">%1$s</xliff:g> olana kadar kullanılabilmelidir"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"Şu saate kadar: <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Pilin tahmini bitiş zamanı: <xliff:g id="TIME">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"En fazla <xliff:g id="THRESHOLD">%1$s</xliff:g> kaldı"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"En çok <xliff:g id="THRESHOLD">%1$s</xliff:g> kaldı (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"En az <xliff:g id="TIME_REMAINING">%1$s</xliff:g> kaldı (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"En az <xliff:g id="TIME_REMAINING">%1$s</xliff:g> kaldı"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"Telefon kısa süre içinde kapanabilir"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"Tablet kısa süre içinde kapanabilir"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"Cihaz kısa süre içinde kapanabilir"</string>
diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml
index 5dae4f0..6f6b3fc 100644
--- a/packages/SettingsLib/res/values-uk/strings.xml
+++ b/packages/SettingsLib/res/values-uk/strings.xml
@@ -206,13 +206,13 @@
     <string name="enable_adb" msgid="8072776357237289039">"Налагодження USB"</string>
     <string name="enable_adb_summary" msgid="3711526030096574316">"Вмикати налагодження, коли телефон підключено через USB"</string>
     <string name="clear_adb_keys" msgid="3010148733140369917">"Скасувати доступ до налагодження USB"</string>
-    <string name="enable_adb_wireless" msgid="6973226350963971018">"Бездротове налагодження"</string>
+    <string name="enable_adb_wireless" msgid="6973226350963971018">"Налагодження через Wi-Fi"</string>
     <string name="enable_adb_wireless_summary" msgid="7344391423657093011">"Вмикати режим налагодження, коли пристрій підключено до мережі Wi-Fi"</string>
     <string name="adb_wireless_error" msgid="721958772149779856">"Помилка"</string>
-    <string name="adb_wireless_settings" msgid="2295017847215680229">"Бездротове налагодження"</string>
-    <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Щоб переглядати та використовувати доступні пристрої, увімкніть бездротове налагодження"</string>
+    <string name="adb_wireless_settings" msgid="2295017847215680229">"Налагодження через Wi-Fi"</string>
+    <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Щоб переглядати та використовувати доступні пристрої, увімкніть налагодження через Wi-Fi"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Підключати пристрій за допомогою QR-коду"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"Підключати нові пристрої за допомогою сканера QR-кодів"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"Підключати нові пристрої за допомогою сканера QR-кодів"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Підключати пристрій за допомогою коду підключення"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Підключати нові пристрої за допомогою шестизначного коду"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"Підключені пристрої"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Не вдалося підключитися до пристрою. Надано неправильний QR-код або пристрій не підключено до тієї ж мережі."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"IP-адреса та порт"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"Сканувати QR-код"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"Підключати пристрій через Wi‑Fi за допомогою QR-коду"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Підключати пристрій через Wi‑Fi за допомогою QR-коду"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Підключіть пристрій до мережі Wi-Fi"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, налагодження, розробка"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"Ярлик звіту про помилки"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"Сертифікація бездрот. екрана"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"Докладний запис у журнал Wi-Fi"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"Зменшити радіус пошуку мереж Wi‑Fi"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"Довільний вибір MAC-адрес із Wi‑Fi"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"Не вимикати мобільне передавання даних"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"Апаратне прискорення під час використання телефона в режимі модема"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Показувати пристрої Bluetooth без назв"</string>
@@ -273,16 +274,17 @@
     <string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3233402355917446304">"Кодек для аудіо Bluetooth LDAC: якість відтворення"</string>
     <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="7274396574659784285">"Активувати LDAC для аудіо Bluetooth\nВибір кодека: якість відтворення"</string>
     <string name="bluetooth_select_a2dp_codec_streaming_label" msgid="2040810756832027227">"Трансляція: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
-    <string name="select_private_dns_configuration_title" msgid="7887550926056143018">"Приватна DNS"</string>
-    <string name="select_private_dns_configuration_dialog_title" msgid="3731422918335951912">"Режим приватної системи DNS"</string>
+    <string name="select_private_dns_configuration_title" msgid="7887550926056143018">"Приватний DNS-сервер"</string>
+    <string name="select_private_dns_configuration_dialog_title" msgid="3731422918335951912">"Режим приватного DNS-сервера"</string>
     <string name="private_dns_mode_off" msgid="7065962499349997041">"Вимкнено"</string>
     <string name="private_dns_mode_opportunistic" msgid="1947864819060442354">"Автоматично"</string>
-    <string name="private_dns_mode_provider" msgid="3619040641762557028">"Ім’я хосту приватного постачальника послуг DNS"</string>
+    <string name="private_dns_mode_provider" msgid="3619040641762557028">"Ім’я хосту постачальника приватного DNS-сервера"</string>
     <string name="private_dns_mode_provider_hostname_hint" msgid="6564868953748514595">"Введіть ім’я хосту постачальника послуг DNS"</string>
     <string name="private_dns_mode_provider_failure" msgid="8356259467861515108">"Не вдалося під’єднатися"</string>
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Показати параметри сертифікації бездротового екрана"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Показувати в журналі RSSI для кожного SSID під час вибору Wi-Fi"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Зменшує споживання заряду акумулятора й підвищує ефективність роботи мережі"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Цей перемикач впливає на поведінку довільного вибору MAC-адрес лише для клієнтського режиму.\nКоли цей режим активовано, MAC-адреси мереж із довільним вибором цих адрес переназначаються під час зв\'язування залежно від часу останнього відключення клієнта від мережі. Повторний довільний вибір адрес не відбувається, якщо пристрій знову підключається протягом 4 годин."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"З тарифікацією трафіку"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"Без тарифікації трафіку"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"Розміри буфера журналу"</string>
@@ -300,8 +302,8 @@
     <string name="tethering_hardware_offload_summary" msgid="7801345335142803029">"Якщо доступно, вмикати апаратне прискорення під час використання телефона в режимі модема"</string>
     <string name="adb_warning_title" msgid="7708653449506485728">"Дозвол. налагодж. USB?"</string>
     <string name="adb_warning_message" msgid="8145270656419669221">"Налагодження USB застосовується лише з метою розробки. Його можна використовувати для копіювання даних між комп’ютером і пристроєм, встановлення програм на вашому пристрої без сповіщення та читання даних журналу."</string>
-    <string name="adbwifi_warning_title" msgid="727104571653031865">"Дозволити бездротове налагодження?"</string>
-    <string name="adbwifi_warning_message" msgid="8005936574322702388">"Бездротове налагодження застосовується лише з метою розробки. Його можна використовувати, щоб копіювати дані між комп\'ютером і пристроєм, встановлювати додатки на пристрої без сповіщення та переглядати дані журналу."</string>
+    <string name="adbwifi_warning_title" msgid="727104571653031865">"Дозволити налагодження через Wi-Fi?"</string>
+    <string name="adbwifi_warning_message" msgid="8005936574322702388">"Налагодження через Wi-Fi застосовується лише з метою розробки. Його можна використовувати, щоб копіювати дані між комп\'ютером і пристроєм, встановлювати додатки на пристрої без сповіщення та переглядати дані журналу."</string>
     <string name="adb_keys_warning_message" msgid="2968555274488101220">"Скасувати доступ до налагодження USB для всіх комп’ютерів, які раніше отримали таке право?"</string>
     <string name="dev_settings_warning_title" msgid="8251234890169074553">"Дозволити налаштування розробки?"</string>
     <string name="dev_settings_warning_message" msgid="37741686486073668">"Ці налаштування застосовуються лише з метою розробки. Вони можуть спричиняти вихід з ладу або неправильне функціонування вашого пристрою чи програм у ньому."</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"Показувати вікно \"Додаток не відповідає\" для додатків у фоновому режимі"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Показувати застереження про канал"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"З’являється застереження, коли додаток надсилає сповіщення через недійсний канал"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Використовувати ярлики для сповіщень про чати"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Вимагати для сповіщень постійних ярликів доступу, щоб показувати їх у розділі чатів"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"Примусово записувати додатки в зовнішню пам’ять"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Можна записувати додатки в зовнішню пам’ять, незалежно від значень у маніфесті"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"Примусово масштабувати активність"</string>
@@ -432,10 +436,14 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"Вистачить приблизно до <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"До <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Акумулятор може розрядитися до <xliff:g id="TIME">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"Залишилося менше ніж <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"Залишилося менше ніж <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"Залишилося понад <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"Залишилося понад <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"Телефон може невдовзі вимкнутися"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"Планшет може невдовзі вимкнутися"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"Пристрій може невдовзі вимкнутися"</string>
diff --git a/packages/SettingsLib/res/values-ur/strings.xml b/packages/SettingsLib/res/values-ur/strings.xml
index ce25f2f..df1e46f 100644
--- a/packages/SettingsLib/res/values-ur/strings.xml
+++ b/packages/SettingsLib/res/values-ur/strings.xml
@@ -212,7 +212,7 @@
     <string name="adb_wireless_settings" msgid="2295017847215680229">"وائرلیس ڈیبگنگ"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"دستیاب آلات کو دیکھنے اور استعمال کرنے کے لیے، وائرلیس ڈیبگنگ آن کریں"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"‏QR کوڈ کے ذریعے آلہ کا جوڑا بنائیں"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"‏QR کوڈ اسکینر کا استعمال کر کے نئے آلہ کا جوڑا بنائیں"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"‏QR کوڈ اسکینر کا استعمال کر کے نئے آلات کا جوڑا بنائیں"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"جوڑا بنانے کے کوڈ کے ذریعے آلہ کا جوڑا بنائیں"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"چھ ہندسوں کا کوڈ استعمال کر کے نئے آلات کا جوڑا بنائیں"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"جوڑا بنائے گئے آلات"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"‏آلہ کا جوڑا بنانے میں ناکام۔ یا تو QR کوڈ غلط تھا، یا آلہ اسی نیٹ ورک سے منسلک نہیں ہے۔"</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"‏IP پتہ اور پورٹ"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"‏QR کوڈ اسکین کریں"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"‏QR کوڈ اسکین کر کے Wi-Fi پر آلہ کا جوڑا بنائیں"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"‏QR کوڈ اسکین کر کے Wi-Fi پر آلہ کا جوڑا بنائیں"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"‏براہ کرم ایک Wi-Fi نیٹ ورک سے منسلک ہوں"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"‏adb، ڈیبگ، dev"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"بگ رپورٹ کا شارٹ کٹ"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"وائرلیس ڈسپلے سرٹیفیکیشن"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"‏Wi‑Fi وربوس لاگنگ فعال کریں"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"‏Wi‑Fi اسکین کو زبردستی روکا جا رہا ہے"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"‏بہتر Wi-Fi ‏ MAC رینڈمائزیشن"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"موبائل ڈیٹا ہمیشہ فعال رکھیں"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"ٹیدرنگ ہارڈویئر سرعت کاری"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"بغیر نام والے بلوٹوتھ آلات دکھائیں"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"وائرلیس ڈسپلے سرٹیفیکیشن کیلئے اختیارات دکھائیں"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"‏Wi‑Fi لاگنگ لیول میں اضافہ کریں، Wi‑Fi منتخب کنندہ میں فی SSID RSSI دکھائیں"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"بیٹری ڈرین کم کرتا ہے اور نیٹ ورک کارکردگی کو بہتر بناتا ہے"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"‏یہ ٹوگل صرف کلائنٹ وضع کے لئے MAC کی رینڈمائزیشن کو متاثر کرتا ہے۔\nجب یہ وضع فعال کی جاتی ہے، تو کسی بھی نیٹ ورکس میں جو MAC رینڈمائزیشن کو فعال کرتا ہے ان کے MAC ایڈریسز ایسوسی ایشن کے دوران دوبارہ رینڈمائز ہو سکتے ہیں، اس پر منحصر ہے کہ کلائنٹ کب آخری بار نیٹ ورک سے غیر منسلک ہوا۔ اگر آلہ 4 گھنٹوں یا اس سے کم وقت میں دوبارہ منسلک ہو، تو پھر دوبارہ رینڈمائزیشن کا امکان نہیں ہوتا ہے۔"</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"میٹرڈ"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"غیر میٹر شدہ"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"لاگر بفر کے سائز"</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"پس منظر کی ایپس کیلئے \'ایپ جواب نہیں دے رہی ہے\' ڈائلاگ ڈسپلے کریں"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"چینل کی اطلاعی تنبیہات دکھائیں"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"کسی ایپ کی طرف سے درست چینل کے بغیر اطلاع پوسٹ ہونے پر آن اسکرین تنبیہ ڈسپلے کرتا ہے"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"بات چیت کی اطلاعات کے لیے شارٹ کٹس نافذ کریں"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"بات چیت کے سیکشن میں ظاہر ہونے کے لئے اطلاعات کو طویل مدت والے شیئرنگ شارٹ کٹ کے ذریعے حمایت کی ضرورت ہے"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"بیرونی پر ایپس کو زبردستی اجازت دیں"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"‏manifest اقدار سے قطع نظر، کسی بھی ایپ کو بیرونی اسٹوریج پر لکھے جانے کا اہل بناتا ہے"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"سرگرمیوں کو ری سائز ایبل بنائیں"</string>
@@ -534,7 +538,7 @@
     <string name="user_setup_dialog_title" msgid="8037342066381939995">"صارف کو ابھی سیٹ اپ کریں؟"</string>
     <string name="user_setup_dialog_message" msgid="269931619868102841">"یقینی بنائیں کہ وہ شخص آلہ لینے اور اپنی جگہ کو سیٹ اپ کرنے کیلئے دستیاب ہے"</string>
     <string name="user_setup_profile_dialog_message" msgid="4788197052296962620">"پروفائل کو ابھی ترتیب دیں؟"</string>
-    <string name="user_setup_button_setup_now" msgid="1708269547187760639">"ابھی ترتیب دیں"</string>
+    <string name="user_setup_button_setup_now" msgid="1708269547187760639">"ابھی سیٹ اپ کریں"</string>
     <string name="user_setup_button_setup_later" msgid="8712980133555493516">"ابھی نہیں"</string>
     <string name="user_add_user_type_title" msgid="551279664052914497">"شامل کریں"</string>
     <string name="user_new_user_name" msgid="60979820612818840">"نیا صارف"</string>
diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml
index 07f3a6e..215cb4c 100644
--- a/packages/SettingsLib/res/values-uz/strings.xml
+++ b/packages/SettingsLib/res/values-uz/strings.xml
@@ -206,13 +206,13 @@
     <string name="enable_adb" msgid="8072776357237289039">"USB orqali nosozliklarni aniqlash"</string>
     <string name="enable_adb_summary" msgid="3711526030096574316">"USB orqali kompyuterga ulanganda tuzatish rejimi yoqilsin"</string>
     <string name="clear_adb_keys" msgid="3010148733140369917">"USB orqali nosozliklarni tuzatishni taqiqlash"</string>
-    <string name="enable_adb_wireless" msgid="6973226350963971018">"Simsiz nosozliklarni aniqlash"</string>
+    <string name="enable_adb_wireless" msgid="6973226350963971018">"Wi-Fi orqali debagging"</string>
     <string name="enable_adb_wireless_summary" msgid="7344391423657093011">"Wi‑Fi tarmoqqa ulanganda nosozliklarni aniqlash rejimi"</string>
     <string name="adb_wireless_error" msgid="721958772149779856">"Xato"</string>
-    <string name="adb_wireless_settings" msgid="2295017847215680229">"Simsiz nosozliklarni aniqlash"</string>
-    <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Mavjud qurilmalarni koʻrish va ulardan foydalanish uchun simsiz nosozliklarni aniqlash funksiyasini yoqing"</string>
+    <string name="adb_wireless_settings" msgid="2295017847215680229">"Wi-Fi orqali debagging"</string>
+    <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Mavjud qurilmalarni koʻrish va ulardan foydalanish uchun Wi-Fi orqali debagging funksiyasini yoqing"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"QR kod yordamida qurilmani ulang"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"QR kod skaneri yordamida yangi qurilmalarni ulash mumkin"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"QR kod skaneri yordamida yangi qurilmalarni ulang"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Ulanish kodi yordamida qurilmani ulang"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Olti xonali kod yordamida yangi qurilmalarni ulash mumkin"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"Ulangan qurilmalar"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Qurilma ulanmadi. QR kod xato yoki qurilma bir xil tarmoqqa ulanmagan."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"IP manzil va port"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"QR kodni skanerlash"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"QR kodni skanerlab, Wi-Fi orqali qurilmani ulang"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"QR kodni skanerlab, Wi-Fi orqali qurilmani ulang"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Wi-Fi tarmoqqa ulaning"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, debag, dev"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"Xatoliklar hisoboti"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"Simsiz monitor sertifikatlari"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"Batafsil Wi-Fi jurnali"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"Wi‑Fi tarmoqni taqsimlab skanlash"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"Wi‑Fi tarmoqdagi tasodifiy MAC manzil"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"Mobil internet doim yoniq tursin"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"Modem rejimida apparatli tezlashtirish"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Bluetooth qurilmalarini nomlarisiz ko‘rsatish"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Simsiz monitorlarni sertifikatlash parametrini ko‘rsatish"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Wi-Fi ulanishini tanlashda har bir SSID uchun jurnalda ko‘rsatilsin"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Batareya sarfini tejaydi va tarmoq samaradorligini oshiradi"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Bu sozlama faqat mijoz rejimida tasodifiy MAC manzillardan foydalanishga taʼsir qiladi.\nHar qanday tarmoqqa ulanishda mijoz oxirgi marta tarmoqdan qachon uzilganiga qarab tasodifiy MAC manzili qayta yaratiladi. Agar ulanish 4 soat yoki kamroq davom etsa, tasodifiy MAC manzili qayta yaratilmaydi."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"Trafik hisoblanadigan tarmoq"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"Trafik hisobi yuritilmaydigan tarmoq"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"Jurnal buferi hajmi"</string>
@@ -300,8 +302,8 @@
     <string name="tethering_hardware_offload_summary" msgid="7801345335142803029">"Modem rejimida apparatli tezlashtirishdan foydalanish (agar mavjud bo‘lsa)"</string>
     <string name="adb_warning_title" msgid="7708653449506485728">"USB orqali nosozliklarni tuzatishga ruxsat berilsinmi?"</string>
     <string name="adb_warning_message" msgid="8145270656419669221">"USB orqali nosozliklarni aniqlash faqat dasturlash maqsadlarida yoqiladi. Undan maʼlumotlarni qurilmangiz va kompyuter o‘rtasida ko‘chirish, ilovalarni xabarnomasiz o‘rnatish va jurnal maʼlumotlarini o‘qish uchun foydalaniladi."</string>
-    <string name="adbwifi_warning_title" msgid="727104571653031865">"Simsiz nosozliklarni aniqlashga ruxsat berilsinmi?"</string>
-    <string name="adbwifi_warning_message" msgid="8005936574322702388">"Simsiz nosozliklarni aniqlash faqat dasturlash maqsadlarida yoqiladi. Undan maʼlumotlarni qurilmangiz va kompyuter oʻrtasida koʻchirish, ilovalarni bildirishnomasiz oʻrnatish va jurnal maʼlumotlarini oʻqish uchun foydalaniladi."</string>
+    <string name="adbwifi_warning_title" msgid="727104571653031865">"Wi-Fi orqali debagging uchun ruxsat berilsinmi?"</string>
+    <string name="adbwifi_warning_message" msgid="8005936574322702388">"Wi-Fi orqali debagging faqat dasturlash maqsadlarida yoqiladi. Undan maʼlumotlarni qurilmangiz va kompyuter oʻrtasida koʻchirish, ilovalarni bildirishnomasiz oʻrnatish va jurnal maʼlumotlarini oʻqish uchun foydalaniladi."</string>
     <string name="adb_keys_warning_message" msgid="2968555274488101220">"USB orqali nosozliklarni tuzatishga berilgan ruxsat siz hisobingizga kirgan barcha kompyuterlar uchun bekor qilinsinmi?"</string>
     <string name="dev_settings_warning_title" msgid="8251234890169074553">"Dasturlash sozlamalariga ruxsat berilsinmi?"</string>
     <string name="dev_settings_warning_message" msgid="37741686486073668">"Bu sozlamalar faqat dasturlash maqsadlariga mo‘ljallangan. Shuning uchun, ular qurilmangizga va undagi ilovalariga shikast yetkazib, noto‘g‘ri ishlashiga sabab bo‘lishi mumkin."</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"Ilova javob bermayotgani haqida xabar qilish"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Xabarlar kanali ogohlantirishlarini ko‘rsatish"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Yaroqli kanalsiz yuborilgan yangi ilova xabarnomalari haqida ogohlantirishlarni ko‘rsatish"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Suhbat bildirishnomalari uchun yorliqlardan majburiy foydalanish"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Bildirishnoma suhbat qismida chiqishi uchun uzoq koʻrinadigan belgilar yordamida ularni nusxalash kerak"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"Tashqi xotira qurilmasidagi ilova dasturlariga majburiy ruxsat berish"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Manifest qiymatidan qat’i nazar istalgan ilovani tashqi xotiraga saqlash imkonini beradi"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"Harakatlarni moslashuvchan o‘lchamga keltirish"</string>
@@ -432,10 +436,14 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"Taxminan <xliff:g id="TIME">%1$s</xliff:g> gacha davom etadi"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"<xliff:g id="TIME">%1$s</xliff:g> gacha"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Batareya quvvati tugash vaqti: <xliff:g id="TIME">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"<xliff:g id="THRESHOLD">%1$s</xliff:g>dan kamroq vaqt qoldi"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"<xliff:g id="THRESHOLD">%1$s</xliff:g>dan kamroq vaqt qoldi (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g>dan ko‘proq vaqt qoldi (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g>dan ko‘proq vaqt qoldi"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"Telefon tez orada oʻchib qolishi mumkin"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"Planshet tez orada oʻchib qolishi mumkin"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"Qurilma tez orada oʻchib qolishi mumkin"</string>
diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml
index 10ac60d..e118ec0 100644
--- a/packages/SettingsLib/res/values-vi/strings.xml
+++ b/packages/SettingsLib/res/values-vi/strings.xml
@@ -86,8 +86,8 @@
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Chuyển tệp"</string>
     <string name="bluetooth_profile_hid" msgid="2969922922664315866">"Thiết bị đầu vào"</string>
     <string name="bluetooth_profile_pan" msgid="1006235139308318188">"Truy cập Internet"</string>
-    <string name="bluetooth_profile_pbap" msgid="7064307749579335765">"Chia sẻ liên hệ"</string>
-    <string name="bluetooth_profile_pbap_summary" msgid="2955819694801952056">"Sử dụng để chia sẻ liên hệ"</string>
+    <string name="bluetooth_profile_pbap" msgid="7064307749579335765">"Chia sẻ người liên hệ"</string>
+    <string name="bluetooth_profile_pbap_summary" msgid="2955819694801952056">"Sử dụng để chia sẻ người liên hệ"</string>
     <string name="bluetooth_profile_pan_nap" msgid="7871974753822470050">"Chia sẻ kết nối internet"</string>
     <string name="bluetooth_profile_map" msgid="8907204701162107271">"Tin nhắn văn bản"</string>
     <string name="bluetooth_profile_sap" msgid="8304170950447934386">"Truy cập SIM"</string>
@@ -99,7 +99,7 @@
     <string name="bluetooth_headset_profile_summary_connected" msgid="2420981566026949688">"Đã kết nối với âm thanh điện thoại"</string>
     <string name="bluetooth_opp_profile_summary_connected" msgid="2393521801478157362">"Đã kết nối với máy chủ chuyển tệp"</string>
     <string name="bluetooth_map_profile_summary_connected" msgid="4141725591784669181">"Đã kết nối với bản đồ"</string>
-    <string name="bluetooth_sap_profile_summary_connected" msgid="1280297388033001037">"Được kết nối với SAP"</string>
+    <string name="bluetooth_sap_profile_summary_connected" msgid="1280297388033001037">"Đã kết nối với SAP"</string>
     <string name="bluetooth_opp_profile_summary_not_connected" msgid="3959741824627764954">"Chưa kết nối với máy chủ chuyển tệp"</string>
     <string name="bluetooth_hid_profile_summary_connected" msgid="3923653977051684833">"Đã kết nối với thiết bị nhập"</string>
     <string name="bluetooth_pan_user_profile_summary_connected" msgid="380469653827505727">"Đã kết nối với thiết bị để truy cập Internet"</string>
@@ -143,11 +143,11 @@
     <string name="data_usage_uninstalled_apps" msgid="1933665711856171491">"Ứng dụng đã xóa"</string>
     <string name="data_usage_uninstalled_apps_users" msgid="5533981546921913295">"Ứng dụng và người dùng bị xóa"</string>
     <string name="data_usage_ota" msgid="7984667793701597001">"Bản cập nhật hệ thống"</string>
-    <string name="tether_settings_title_usb" msgid="3728686573430917722">"Chia sẻ kết nối Internet qua USB"</string>
+    <string name="tether_settings_title_usb" msgid="3728686573430917722">"Chia sẻ Internet qua USB"</string>
     <string name="tether_settings_title_wifi" msgid="4803402057533895526">"Điểm phát sóng di động"</string>
-    <string name="tether_settings_title_bluetooth" msgid="916519902721399656">"Chia sẻ kết nối Internet qua Bluetooth"</string>
-    <string name="tether_settings_title_usb_bluetooth" msgid="1727111807207577322">"Đang dùng làm điểm truy cập Internet"</string>
-    <string name="tether_settings_title_all" msgid="8910259483383010470">"USB Internet &amp; điểm truy cập di động"</string>
+    <string name="tether_settings_title_bluetooth" msgid="916519902721399656">"Chia sẻ Internet qua Bluetooth"</string>
+    <string name="tether_settings_title_usb_bluetooth" msgid="1727111807207577322">"Chia sẻ Internet"</string>
+    <string name="tether_settings_title_all" msgid="8910259483383010470">"Chia sẻ Internet và điểm phát sóng di động"</string>
     <string name="managed_user_title" msgid="449081789742645723">"Tất cả ứng dụng làm việc"</string>
     <string name="user_guest" msgid="6939192779649870792">"Khách"</string>
     <string name="unknown" msgid="3544487229740637809">"Không xác định"</string>
@@ -201,7 +201,7 @@
     <string name="development_settings_summary" msgid="8718917813868735095">"Đặt tùy chọn cho phát triển ứng dụng"</string>
     <string name="development_settings_not_available" msgid="355070198089140951">"Tùy chọn dành cho nhà phát triển không khả dụng cho người dùng này"</string>
     <string name="vpn_settings_not_available" msgid="2894137119965668920">"Cài đặt VPN không khả dụng cho người dùng này"</string>
-    <string name="tethering_settings_not_available" msgid="266821736434699780">"Cài đặt cách chia sẻ kết nối không khả dụng cho người dùng này"</string>
+    <string name="tethering_settings_not_available" msgid="266821736434699780">"Các tùy chọn cài đặt của tính năng chia sẻ Internet không có sẵn cho người dùng này"</string>
     <string name="apn_settings_not_available" msgid="1147111671403342300">"Cài đặt tên điểm truy cập không khả dụng cho người dùng này"</string>
     <string name="enable_adb" msgid="8072776357237289039">"Gỡ lỗi qua USB"</string>
     <string name="enable_adb_summary" msgid="3711526030096574316">"Bật chế độ gỡ lỗi khi kết nối USB"</string>
@@ -212,7 +212,7 @@
     <string name="adb_wireless_settings" msgid="2295017847215680229">"Gỡ lỗi qua Wi-Fi"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Để xem và sử dụng các thiết bị có sẵn, hãy bật tính năng gỡ lỗi qua Wi-Fi"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Ghép nối thiết bị bằng mã QR"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"Ghép nối các thiết bị mới bằng Trình quét mã QR"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"Ghép nối các thiết bị mới bằng trình quét mã QR"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Ghép nối thiết bị bằng mã ghép nối"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Ghép nối các thiết bị mới bằng mã gồm 6 chữ số"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"Thiết bị được ghép nối"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Không ghép nối được thiết bị. Mã QR không chính xác hoặc bạn không kết nối thiết bị với cùng một mạng."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"Địa chỉ IP và cổng"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"Quét mã QR"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"Ghép nối thiết bị qua Wi-Fi bằng cách quét mã QR"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Ghép nối thiết bị qua Wi-Fi bằng cách quét mã QR"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Hãy kết nối mạng Wi-Fi"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, gỡ lỗi, nhà phát triển"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"Phím tắt báo cáo lỗi"</string>
@@ -251,8 +251,9 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"Chứng nhận hiển thị không dây"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"Bật ghi nhật ký chi tiết Wi‑Fi"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"Hạn chế quét tìm Wi-Fi"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"Sử dụng địa chỉ MAC Wi‑Fi ngẫu nhiên"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"Dữ liệu di động luôn hoạt động"</string>
-    <string name="tethering_hardware_offload" msgid="4116053719006939161">"Tăng tốc phần cứng khi chia sẻ kết nối"</string>
+    <string name="tethering_hardware_offload" msgid="4116053719006939161">"Tăng tốc phần cứng khi chia sẻ Internet"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Hiển thị các thiết bị Bluetooth không có tên"</string>
     <string name="bluetooth_disable_absolute_volume" msgid="1452342324349203434">"Vô hiệu hóa âm lượng tuyệt đối"</string>
     <string name="bluetooth_enable_gabeldorsche" msgid="9131730396242883416">"Bật tính năng Gabeldorsche"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Hiển thị tùy chọn chứng nhận hiển thị không dây"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Tăng mức ghi nhật ký Wi‑Fi, hiển thị mỗi SSID RSSI trong bộ chọn Wi‑Fi"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Giảm hao pin và cải thiện hiệu suất mạng"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Thao tác bật/tắt này chỉ ảnh hưởng đến hành vi tạo địa chỉ MAC ngẫu nhiên ở chế độ máy khách.\nKhi bạn kích hoạt chế độ này, tất cả các mạng đã bật tính năng tạo địa chỉ MAC ngẫu nhiên có thể tạo lại địa chỉ MAC ngẫu nhiên của chúng trong quá trình liên kết, tùy thuộc vào lần gần đây nhất máy khách ngắt kết nối với mạng. Các mạng này sẽ không thể tạo ngẫu nhiên lại nếu thiết bị kết nối lại trong vòng 4 giờ."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"Đo lượng dữ liệu"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"Không đo lượng dữ liệu"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"Kích thước bộ đệm của trình ghi nhật ký"</string>
@@ -297,7 +299,7 @@
     <string name="allow_mock_location_summary" msgid="179780881081354579">"Cho phép vị trí mô phỏng"</string>
     <string name="debug_view_attributes" msgid="3539609843984208216">"Cho phép kiểm tra thuộc tính của chế độ xem"</string>
     <string name="mobile_data_always_on_summary" msgid="1112156365594371019">"Luôn bật dữ liệu di động ngay cả khi Wi-Fi đang hoạt động (để chuyển đổi mạng nhanh)."</string>
-    <string name="tethering_hardware_offload_summary" msgid="7801345335142803029">"Sử dụng tính năng tăng tốc phần cứng khi chia sẻ kết nối nếu có"</string>
+    <string name="tethering_hardware_offload_summary" msgid="7801345335142803029">"Sử dụng tính năng tăng tốc phần cứng khi chia sẻ Internet nếu có"</string>
     <string name="adb_warning_title" msgid="7708653449506485728">"Cho phép gỡ lỗi qua USB?"</string>
     <string name="adb_warning_message" msgid="8145270656419669221">"Gỡ lỗi USB chỉ dành cho mục đích phát triển. Hãy sử dụng tính năng này để sao chép dữ liệu giữa máy tính và thiết bị của bạn, cài đặt ứng dụng trên thiết bị của bạn mà không thông báo và đọc dữ liệu nhật ký."</string>
     <string name="adbwifi_warning_title" msgid="727104571653031865">"Bật tính năng gỡ lỗi qua Wi-Fi?"</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"Hiện hộp thoại Ứng dụng không phản hồi cho các ứng dụng nền"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Hiện cảnh báo kênh thông báo"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Hiện cảnh báo trên màn hình khi ứng dụng đăng thông báo mà không có kênh hợp lệ"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Áp dụng lối tắt cho thông báo của cuộc trò chuyện"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Để xuất hiện trong phần cuộc trò chuyện, thông báo phải có sự hỗ trợ của lối tắt chia sẻ lâu dài"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"Buộc cho phép các ứng dụng trên bộ nhớ ngoài"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Cho phép ghi mọi ứng dụng đủ điều kiện vào bộ nhớ ngoài, bất kể giá trị tệp kê khai là gì"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"Buộc các hoạt động có thể thay đổi kích thước"</string>
@@ -416,8 +420,8 @@
     <string name="daltonizer_mode_deuteranomaly" msgid="3507284319584683963">"Mù màu xanh lục nhẹ (đỏ-xanh lục)"</string>
     <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Mù màu đỏ không hoàn toàn (đỏ-xanh lục)"</string>
     <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Mù màu (xanh lam-vàng)"</string>
-    <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Sửa màu"</string>
-    <string name="accessibility_display_daltonizer_preference_subtitle" msgid="1284746051652993443">"Với chế độ hiệu chỉnh màu sắc, bạn có thể điều chỉnh cách các màu hiển thị trên thiết bị"</string>
+    <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Chỉnh màu"</string>
+    <string name="accessibility_display_daltonizer_preference_subtitle" msgid="1284746051652993443">"Với chế độ chỉnh màu, bạn có thể điều chỉnh cách các màu hiển thị trên thiết bị"</string>
     <string name="daltonizer_type_overridden" msgid="4509604753672535721">"Bị ghi đè bởi <xliff:g id="TITLE">%1$s</xliff:g>"</string>
     <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
     <string name="power_remaining_duration_only" msgid="8264199158671531431">"Còn khoảng <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
@@ -426,16 +430,20 @@
     <string name="power_discharging_duration_enhanced" msgid="1800465736237672323">"Còn khoảng <xliff:g id="TIME_REMAINING">%1$s</xliff:g> dựa trên mức sử dụng của bạn (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
     <!-- no translation found for power_remaining_duration_only_short (7438846066602840588) -->
     <skip />
-    <string name="power_discharge_by_enhanced" msgid="563438403581662942">"Sẽ hết pin cho tới khoảng <xliff:g id="TIME">%1$s</xliff:g> dựa trên mức sử dụng của bạn (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_discharge_by_only_enhanced" msgid="3268796172652988877">"Sẽ hết pin cho tới khoảng <xliff:g id="TIME">%1$s</xliff:g> dựa trên mức sử dụng của bạn"</string>
-    <string name="power_discharge_by" msgid="4113180890060388350">"Sẽ hết pin cho tới khoảng <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_discharge_by_only" msgid="92545648425937000">"Sẽ hết pin cho tới khoảng <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <string name="power_discharge_by_enhanced" msgid="563438403581662942">"Pin sẽ hết vào khoảng <xliff:g id="TIME">%1$s</xliff:g> dựa trên mức sử dụng của bạn (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+    <string name="power_discharge_by_only_enhanced" msgid="3268796172652988877">"Pin sẽ hết vào khoảng <xliff:g id="TIME">%1$s</xliff:g> dựa trên mức sử dụng của bạn"</string>
+    <string name="power_discharge_by" msgid="4113180890060388350">"Pin sẽ hết vào khoảng <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+    <string name="power_discharge_by_only" msgid="92545648425937000">"Pin sẽ hết vào khoảng <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"Cho đến <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Điện thoại có thể hết pin vào <xliff:g id="TIME">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"Còn lại không đến <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"Còn lại không đến <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"Còn lại hơn <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"Còn lại hơn <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"Điện thoại có thể sắp tắt"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"Máy tính bảng có thể sắp tắt"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"Thiết bị có thể sắp tắt"</string>
@@ -443,8 +451,8 @@
     <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7703677921000858479">"Máy tính bảng có thể sắp tắt (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
     <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="4374784375644214578">"Thiết bị có thể sắp tắt (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
     <string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
-    <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"Còn <xliff:g id="TIME">%1$s</xliff:g> nữa là sạc xong"</string>
-    <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> nữa là sạc xong"</string>
+    <string name="power_remaining_charging_duration_only" msgid="7415639699283965818">"Còn <xliff:g id="TIME">%1$s</xliff:g> nữa là sạc đầy"</string>
+    <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> nữa là sạc đầy"</string>
     <string name="battery_info_status_unknown" msgid="268625384868401114">"Không xác định"</string>
     <string name="battery_info_status_charging" msgid="4279958015430387405">"Đang sạc"</string>
     <string name="battery_info_status_charging_fast" msgid="8027559755902954885">"Đang sạc nhanh"</string>
diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml
index c24f72d..9edcff2 100644
--- a/packages/SettingsLib/res/values-zh-rCN/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml
@@ -78,7 +78,7 @@
     <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"已连接(无手机或媒体信号),电量为 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"使用中,电池电量:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
     <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"已启用,左:目前电量为 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>;右:目前电量为 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
-    <string name="bluetooth_battery_level" msgid="2893696778200201555">"电池电量:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> 的电量"</string>
     <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"左:目前电量为 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>;右:目前电量为 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string>
     <string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"使用中"</string>
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"媒体音频"</string>
@@ -212,7 +212,7 @@
     <string name="adb_wireless_settings" msgid="2295017847215680229">"无线调试"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"要查看和使用可用的设备,请开启无线调试"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"使用二维码配对设备"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"使用二维码扫描器配对新设备"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"使用二维码扫描器配对新设备"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"使用配对码配对设备"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"使用六位数验证码配对新设备"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"已配对的设备"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"无法配对设备。可能是因为二维码不正确,或者设备未连接到同一网络。"</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"IP 地址和端口"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"扫描二维码"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"扫描二维码即可通过 WLAN 配对设备"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"扫描二维码即可通过 WLAN 配对设备"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"请连接到 WLAN 网络"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, 调试, debug, 开发, dev"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"错误报告快捷方式"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"无线显示认证"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"启用 WLAN 详细日志记录功能"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"WLAN 扫描调节"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"WLAN 增强型随机分配 MAC 地址功能"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"始终开启移动数据网络"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"网络共享硬件加速"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"显示没有名称的蓝牙设备"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"显示无线显示认证选项"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"提升 WLAN 日志记录级别(在 WLAN 选择器中显示每个 SSID 的 RSSI)"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"降低耗电量以及改善网络性能"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"此切换开关仅会影响客户端模式的 MAC 地址随机分配行为。\n此模式开启后,系统可能会为已启用随机分配 MAC 地址功能的所有网络在关联期间重新随机分配 MAC 地址,具体取决于客户端上次断开网络连接的时间。如果设备在 4 小时或更短时间内重新连接到网络,系统便不会执行重新随机分配操作。"</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"按流量计费"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"不按流量计费"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"日志记录器缓冲区大小"</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"为后台应用显示“应用无响应”对话框"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"显示通知渠道警告"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"当应用未经有效渠道发布通知时,在屏幕上显示警告"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"强制执行会话通知快捷方式"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"要求通知必须有长期共享快捷方式支持,才能显示在会话部分中"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"强制允许将应用写入外部存储设备"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"允许将任何应用写入外部存储设备(无论清单值是什么)"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"强制将活动设为可调整大小"</string>
@@ -432,10 +436,14 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"估计能用到<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"直到<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"电池电量可能在<xliff:g id="TIME">%1$s</xliff:g> 前耗尽"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"剩余电池续航时间不到 <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"电量剩余使用时间不到 <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"电量剩余使用时间超过 <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"电量剩余使用时间超过 <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"手机可能即将关机"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"平板电脑可能即将关机"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"设备可能即将关机"</string>
@@ -464,7 +472,7 @@
     <item msgid="7529124349186240216">"100%"</item>
   </string-array>
     <string name="charge_length_format" msgid="6941645744588690932">"<xliff:g id="ID_1">%1$s</xliff:g>前"</string>
-    <string name="remaining_length_format" msgid="4310625772926171089">"还剩 <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+    <string name="remaining_length_format" msgid="4310625772926171089">"还需 <xliff:g id="ID_1">%1$s</xliff:g>"</string>
     <string name="screen_zoom_summary_small" msgid="6050633151263074260">"小"</string>
     <string name="screen_zoom_summary_default" msgid="1888865694033865408">"默认"</string>
     <string name="screen_zoom_summary_large" msgid="4706951482598978984">"大"</string>
@@ -494,7 +502,7 @@
     <string name="cancel" msgid="5665114069455378395">"取消"</string>
     <string name="okay" msgid="949938843324579502">"确定"</string>
     <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"开启"</string>
-    <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"开启“勿扰”模式"</string>
+    <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"开启勿扰模式"</string>
     <string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"永不"</string>
     <string name="zen_interruption_level_priority" msgid="5392140786447823299">"仅限优先事项"</string>
     <string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>。<xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml
index a4c2336..b6ad4fd 100644
--- a/packages/SettingsLib/res/values-zh-rHK/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml
@@ -212,7 +212,7 @@
     <string name="adb_wireless_settings" msgid="2295017847215680229">"無線偵錯"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"如要查看並使用可用的裝置,請開啟無線偵錯"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"使用二維條碼配對裝置"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"使用二維條碼掃瞄器配對新裝置"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"使用二維條碼掃瞄器配對新裝置"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"使用配對碼配對裝置"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"使用六位數的配對碼配對新裝置"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"已配對的裝置"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"無法配對裝置,可能是二維條碼錯誤,或裝置未連線至相同的網絡。"</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"IP 位址和連接埠"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"掃瞄二維條碼"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"掃瞄二維條碼即可透過 Wi-Fi 配對裝置"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"掃瞄二維條碼即可透過 Wi-Fi 配對裝置"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"請連線至 Wi-Fi 網絡"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"ADB, 偵錯, 開發"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"錯誤舉報捷徑"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"無線螢幕分享認證"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"啟用 Wi‑Fi 詳細記錄"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"Wi‑Fi 掃瞄限流"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"Wi-Fi 強化 MAC 隨機處理"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"一律保持啟用流動數據"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"網絡共享硬件加速"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"顯示沒有名稱的藍牙裝置"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"顯示無線螢幕分享認證的選項"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"讓 Wi‑Fi 記錄功能升級,在 Wi‑Fi 選擇器中依每個 SSID RSSI 顯示 Wi‑Fi 詳細紀錄"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"減低耗電量並改善網絡表現"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"此切換只會影響用戶端模式的 MAC 隨機處理。\n啟動此模式後,視乎用戶端上次中斷網絡連線的時間,系統可能會重新為任何已啟用 MAC 隨機處理的網絡在關聯期間隨機處理其 MAC 地址。如裝置在 4 小時或以內重新連線,系統便不會重新進行隨機處理。"</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"按用量收費"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"不限數據用量收費"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"記錄器緩衝區空間"</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"為背景應用程式顯示「應用程式無回應」對話框"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"顯示通知渠道警告"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"當應用程式未經有效渠道發佈通知時,在螢幕上顯示警告"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"執行對話通知捷徑"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"通知必須採用永久共用捷徑,以便在對話部分中顯示"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"強制允許應用程式寫入到外部儲存空間"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"在任何資訊清單值下,允許將所有符合資格的應用程式寫入到外部儲存完間"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"強制將活動設為可調整尺寸"</string>
@@ -417,7 +421,7 @@
     <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"紅色弱視 (紅綠)"</string>
     <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"藍色弱視 (藍黃)"</string>
     <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"色彩校正"</string>
-    <string name="accessibility_display_daltonizer_preference_subtitle" msgid="1284746051652993443">"你可以用色彩校正調整裝置顯示嘅顏色"</string>
+    <string name="accessibility_display_daltonizer_preference_subtitle" msgid="1284746051652993443">"色彩校正功能讓您調整裝置顯示的顏色"</string>
     <string name="daltonizer_type_overridden" msgid="4509604753672535721">"已由「<xliff:g id="TITLE">%1$s</xliff:g>」覆寫"</string>
     <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
     <string name="power_remaining_duration_only" msgid="8264199158671531431">"還有大約 <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
@@ -429,13 +433,17 @@
     <string name="power_discharge_by_enhanced" msgid="563438403581662942">"根據您的使用情況 (<xliff:g id="LEVEL">%2$s</xliff:g>),電量剩餘約 <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_discharge_by_only_enhanced" msgid="3268796172652988877">"根據您的使用情況,電量剩餘約 <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_discharge_by" msgid="4113180890060388350">"電量剩餘約 <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_discharge_by_only" msgid="92545648425937000">"電量剩餘約 <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <string name="power_discharge_by_only" msgid="92545648425937000">"電量大約可用到<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"還可用到<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"電池電量可能將於<xliff:g id="TIME">%1$s</xliff:g>耗盡"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"剩餘電量時間少於 <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"還有少於 <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"還有超過 <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"還有超過 <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"手機可能即將關閉"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"平板電腦可能即將關機"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"裝置可能即將關機"</string>
@@ -529,17 +537,17 @@
     <string name="user_add_user_item_title" msgid="2394272381086965029">"使用者"</string>
     <string name="user_add_profile_item_title" msgid="3111051717414643029">"限制存取的個人檔案"</string>
     <string name="user_add_user_title" msgid="5457079143694924885">"新增使用者?"</string>
-    <string name="user_add_user_message_long" msgid="1527434966294733380">"您可以建立其他使用者,與他人共用這部裝置。每位使用者都有專屬的空間,並可使用應用程式、桌布等項目自訂個人空間。此外,使用者也可以調整會影響所有人的裝置設定,例如 Wi‑Fi 設定。\n\n新增的使用者需要自行設定個人空間。\n\n任何使用者都可以為所有其他使用者更新應用程式。無障礙功能設定和服務可能無法轉移至新的使用者。"</string>
+    <string name="user_add_user_message_long" msgid="1527434966294733380">"您可以建立其他使用者,與他人共用這部裝置。每位使用者都有屬於自己的空間,並可以自訂應用程式、桌布等等。此外,使用者也可以調整會影響所有人的裝置設定,例如 Wi‑Fi 設定。\n\n新加入的使用者需要自行設定個人空間。\n\n任何使用者都可以為所有其他使用者更新應用程式。無障礙功能設定和服務則未必適用於新的使用者。"</string>
     <string name="user_add_user_message_short" msgid="3295959985795716166">"新增的使用者需要自行設定個人空間。\n\n任何使用者都可以為其他所有使用者更新應用程式。"</string>
     <string name="user_setup_dialog_title" msgid="8037342066381939995">"立即設定使用者?"</string>
-    <string name="user_setup_dialog_message" msgid="269931619868102841">"請確定對方現在可以使用裝置設定自己的空間"</string>
+    <string name="user_setup_dialog_message" msgid="269931619868102841">"請確保對方現在可以在裝置上設定自己的空間"</string>
     <string name="user_setup_profile_dialog_message" msgid="4788197052296962620">"立即設定個人檔案?"</string>
     <string name="user_setup_button_setup_now" msgid="1708269547187760639">"立即設定"</string>
     <string name="user_setup_button_setup_later" msgid="8712980133555493516">"暫時不要"</string>
     <string name="user_add_user_type_title" msgid="551279664052914497">"新增"</string>
     <string name="user_new_user_name" msgid="60979820612818840">"新使用者"</string>
     <string name="user_new_profile_name" msgid="2405500423304678841">"新個人檔案"</string>
-    <string name="user_info_settings_title" msgid="6351390762733279907">"使用者資訊"</string>
+    <string name="user_info_settings_title" msgid="6351390762733279907">"使用者資料"</string>
     <string name="profile_info_settings_title" msgid="105699672534365099">"個人檔案資料"</string>
     <string name="user_need_lock_message" msgid="4311424336209509301">"建立限制存取的個人檔案前,您必須先設定上鎖畫面來保護您的應用程式和個人資料。"</string>
     <string name="user_set_lock_button" msgid="1427128184982594856">"設定上鎖畫面"</string>
diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml
index 5183df3..04b5cb6 100644
--- a/packages/SettingsLib/res/values-zh-rTW/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml
@@ -212,7 +212,7 @@
     <string name="adb_wireless_settings" msgid="2295017847215680229">"無線偵錯"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"如要查看並使用可用的裝置,請開啟無線偵錯"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"使用 QR 圖碼配對裝置"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"使用 QR 圖碼掃描器配對新裝置"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"使用 QR 圖碼掃描器配對新裝置"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"使用配對碼配對裝置"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"使用六位數的配對碼配對新裝置"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"已配對的裝置"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"無法配對裝置。可能是QR 圖碼錯誤,或是裝置未連上相同的網路。"</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"IP 位址和通訊埠"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"掃描 QR 圖碼"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"掃描 QR 圖碼即可透過 Wi-Fi 配對裝置"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"掃描 QR 圖碼即可透過 Wi-Fi 配對裝置"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"請連上 Wi-Fi 網路"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"ADB, 偵錯, 開發"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"錯誤回報捷徑"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"無線螢幕分享認證"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"啟用 Wi‑Fi 詳細記錄設定"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"Wi-Fi 掃描調節"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"Wi‑Fi 加強型 MAC 隨機化"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"行動數據連線一律保持啟用狀態"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"數據連線硬體加速"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"顯示沒有名稱的藍牙裝置"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"顯示無線螢幕分享認證的選項"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"讓 Wi‑Fi 記錄功能升級,在 Wi‑Fi 選擇器中依每個 SSID RSSI 顯示 Wi‑Fi 詳細記錄"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"降低耗電量以及改善網路效能"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"這個切換鈕只會影響用戶端模式的 MAC 隨機化行為。\n這個模式開啟時,任何已啟用 MAC 隨機化的網路可能會在建立關聯時重新將 MAC 位址隨機化 (取決於用戶端上次中斷連線的時間)。如果裝置在 4 個小時內重新連線,就不會進行重新隨機化作業。"</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"計量付費"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"非計量付費"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"記錄器緩衝區空間"</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"為背景應用程式顯示「應用程式無回應」對話方塊"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"顯示通知管道警告"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"當應用程式未經有效管道發布通知時,在畫面上顯示警告"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"強制執行對話通知捷徑"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"要求通知必須有永久分享捷徑支援,才能顯示在對話部分中"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"強制允許將應用程式寫入外部儲存空間"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"允許將任何應用程式寫入外部儲存空間 (無論資訊清單值為何)"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"將活動強制設為可調整大小"</string>
@@ -429,13 +433,17 @@
     <string name="power_discharge_by_enhanced" msgid="563438403581662942">"根據你的使用情形,目前電量為 <xliff:g id="LEVEL">%2$s</xliff:g>,預估可持續使用到<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_discharge_by_only_enhanced" msgid="3268796172652988877">"根據你的使用情形,預估可持續使用到<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_discharge_by" msgid="4113180890060388350">"目前電量 <xliff:g id="LEVEL">%2$s</xliff:g>,預估還能持續使用到<xliff:g id="TIME">%1$s</xliff:g>"</string>
-    <string name="power_discharge_by_only" msgid="92545648425937000">"預估還能持續使用到<xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <string name="power_discharge_by_only" msgid="92545648425937000">"預估電力大約可使用到<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"還能持續使用到<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"電池電力可能於<xliff:g id="TIME">%1$s</xliff:g> 前耗盡"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"電池可用時間不到 <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"電池可用時間不到 <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"電池可用時間超過 <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"電池可用時間超過 <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"手機可能即將關機"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"平板電腦可能即將關機"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"裝置可能即將關機"</string>
diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml
index eb4ace6..7e84918 100644
--- a/packages/SettingsLib/res/values-zu/strings.xml
+++ b/packages/SettingsLib/res/values-zu/strings.xml
@@ -212,7 +212,7 @@
     <string name="adb_wireless_settings" msgid="2295017847215680229">"Ukulungisa amaphutha okungenantambo"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Ukubona futhi usebenzise amadivayisi atholakalayo, vula ukulungisa amaphutha okungenantambo"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Bhangqa idivayisi ngekhodi ye-QR"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="3729901496856458634">"Bhangqa amadivayisi amasha usebenzisa iskena sekhodi ye-QR"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"Bhangqa amadivayisi amasha usebenzisa isiphequluli sekhodi ye-QR"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Bhangqa idivayisi ngekhodi yokumatanisa"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Bhangqa amadivayisi amasha usebenzisa ikhodi yamadijithi ayisithupha"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"Amadivaysi abhangqene"</string>
@@ -231,7 +231,7 @@
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Yehlulekile ukubhangqa idivayisi. Kungenzeka ukuthi ikhodi ye-QR kade ingalungile, noma idivayisi ayixhunyiwe kunethiwekhi efanayo."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"Ikheli le-IP nembobo"</string>
     <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"Skena ikhodi ye-QR"</string>
-    <string name="adb_wireless_qrcode_pairing_description" msgid="8578868049289910131">"Bhangqa idivayisi nge-Wi‑Fi ngokuskena ikhodi ye-QR"</string>
+    <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Bhangqa idivayisi nge-Wi‑Fi ngokuskena ikhodi ye-QR"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Sicela uxhume kunethiwekhi ye-Wi-Fi"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"i-adb, ukulungisa amaphutha, i-dev"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"Isinqamuleli sombiko wesiphazamisi"</string>
@@ -251,6 +251,7 @@
     <string name="wifi_display_certification" msgid="1805579519992520381">"Ukunikezwa isitifiketi sokubukeka okungenantambo"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"Nika amandlaukungena kwe-Wi-Fi Verbose"</string>
     <string name="wifi_scan_throttling" msgid="2985624788509913617">"I-throttling yokuskena kwe-Wi-Fi"</string>
+    <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"Okungahleliwe kwe-Wi-Fi ethuthukisiwe ye-MAC"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"Idatha yeselula ihlala isebenza"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"I-Tethering hardware acceleration"</string>
     <string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Bonisa amadivayisi e-Bluetooth ngaphandle kwamagama"</string>
@@ -283,6 +284,7 @@
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Bonisa izinketho zokunikeza isitifiketi ukubukeka okungenantambo"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"khuphula izinga lokungena le-Wi-Fi, bonisa nge-SSID RSSI engayodwana kusikhethi se-Wi-Fi"</string>
     <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Yehlisa ukuphela kwebhethri futhi ithuthukise ukusebenza kwenethiwekhi"</string>
+    <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Lokhu kuguqula kuthinta ukuziphatha kokungahleliwe kwe-MAC kwemodi yeklayenti kuphela.\nLapho le modi yenziwe yasebenza, noma yimaphi amanethiwekhi anokungahleliwe kwe-MAC okunikwe amandla angase abe nekheli lawo le-MAC libe okungahleliwe kabusha phakathi nokuhlobana, kuya ngokuthi iklayenti igcine nini ukunqamula kusuka kunethiwekhi. Ukwenza kube okungahleliwe kabusha akuveli uma idivayisi ixhuma kabusha emahoreni angu-4 noma ngaphansi."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"Kulinganisiwe"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"Akulinganiselwa"</string>
     <string name="select_logd_size_title" msgid="1604578195914595173">"Amasayizi weloga ngebhafa"</string>
@@ -371,6 +373,8 @@
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"Uhlelo lokusebenza lwesibonisi aluphenduli kungxoxo yezinhlelo zokusebenza zangemuva"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Bonisa izexwayiso zesiteshi sesaziso"</string>
     <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Ibonisa isexwayiso esikusikrini uma uhlelo lokusebenza luthumela isaziso ngaphandle kwesiteshi esivumelekile"</string>
+    <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Phoqelela izinqamuleli zezaziso zengxoxo"</string>
+    <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Kudinga ukuba izaziso zisekelwe yisinqamuleli sokwabelana sesikhathi eside ukuze zivele esigabeni sengxoxo"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"Phoqelela ukuvumela izinhlelo zokusebenza ngaphandle"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Yenza noma uluphi uhlelo lokusebenza lifaneleke ukuthi libhalwe kusitoreji sangaphandle, ngaphandle kwamavelu we-manifest"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"Imisebenzi yamandla izonikezwa usayizi omusha"</string>
@@ -432,10 +436,14 @@
     <string name="power_discharge_by_only" msgid="92545648425937000">"Kumele ihlale cishe kube ngu-<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_discharge_by_only_short" msgid="5883041507426914446">"Kuze kube ngu-<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Ibhethri lingaphela ngo-<xliff:g id="TIME">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"Kusele okungaphansi kunokungu-<xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
-    <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"Ngaphansi kuka-<xliff:g id="THRESHOLD">%1$s</xliff:g> osele (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"Ngaphezu kuka-<xliff:g id="TIME_REMAINING">%1$s</xliff:g> osele (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"Ngaphezulu kokungu-<xliff:g id="TIME_REMAINING">%1$s</xliff:g> okusele"</string>
+    <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) -->
+    <skip />
+    <!-- no translation found for power_remaining_less_than_duration (318215464914990578) -->
+    <skip />
+    <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) -->
+    <skip />
+    <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) -->
+    <skip />
     <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"Ifoni ingacisha maduze"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"Ithebulethi ingacisha maduze"</string>
     <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"Idivayisi ingacisha maduze"</string>
diff --git a/packages/SettingsLib/res/values/strings.xml b/packages/SettingsLib/res/values/strings.xml
index 1007d83..7baaf49 100644
--- a/packages/SettingsLib/res/values/strings.xml
+++ b/packages/SettingsLib/res/values/strings.xml
@@ -1080,14 +1080,14 @@
     <string name="power_suggestion_battery_run_out">Battery may run out by <xliff:g id="time" example="12 PM">%1$s</xliff:g></string>
 
     <!-- [CHAR_LIMIT=60] label for estimated remaining duration of battery when under a certain amount -->
-    <string name="power_remaining_less_than_duration_only">Less than <xliff:g id="threshold">%1$s</xliff:g> remaining</string>
+    <string name="power_remaining_less_than_duration_only">Less than <xliff:g id="threshold">%1$s</xliff:g> left</string>
     <!-- [CHAR_LIMIT=60] label for estimated remaining duration of battery when under a certain amount with the percentage -->
-    <string name="power_remaining_less_than_duration">Less than <xliff:g id="threshold">%1$s</xliff:g> remaining (<xliff:g id="level">%2$s</xliff:g>)</string>
+    <string name="power_remaining_less_than_duration">Less than <xliff:g id="threshold">%1$s</xliff:g> left (<xliff:g id="level">%2$s</xliff:g>)</string>
 
     <!-- Used to let users know that they have more than some amount of battery life remaining with percentage. ex: 75% - more than 1 day remaining [CHAR LIMIT = 80] -->
-    <string name="power_remaining_more_than_subtext">More than <xliff:g id="time_remaining">%1$s</xliff:g> remaining (<xliff:g id="level">%2$s</xliff:g>)</string>
+    <string name="power_remaining_more_than_subtext">More than <xliff:g id="time_remaining">%1$s</xliff:g> left (<xliff:g id="level">%2$s</xliff:g>)</string>
     <!-- Used to let users know that they have more than some amount of battery life remaining. ex: more than 1 day remaining [CHAR LIMIT = 40] -->
-    <string name="power_remaining_only_more_than_subtext">More than <xliff:g id="time_remaining">%1$s</xliff:g> remaining</string>
+    <string name="power_remaining_only_more_than_subtext">More than <xliff:g id="time_remaining">%1$s</xliff:g> left</string>
 
     <!-- [CHAR_LIMIT=50] Short label for imminent shutdown warning of device -->
     <string name="power_remaining_duration_only_shutdown_imminent" product="default">Phone may shut down soon</string>
diff --git a/packages/SettingsLib/src/com/android/settingslib/media/BluetoothMediaDevice.java b/packages/SettingsLib/src/com/android/settingslib/media/BluetoothMediaDevice.java
index e551b69..ee8fb38 100644
--- a/packages/SettingsLib/src/com/android/settingslib/media/BluetoothMediaDevice.java
+++ b/packages/SettingsLib/src/com/android/settingslib/media/BluetoothMediaDevice.java
@@ -38,7 +38,7 @@
 
     BluetoothMediaDevice(Context context, CachedBluetoothDevice device,
             MediaRouter2Manager routerManager, MediaRoute2Info info, String packageName) {
-        super(context, MediaDeviceType.TYPE_BLUETOOTH_DEVICE, routerManager, info, packageName);
+        super(context, routerManager, info, packageName);
         mCachedDevice = device;
         initDeviceRecord();
     }
diff --git a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaDevice.java b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaDevice.java
index 85fa988..83a9671 100644
--- a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaDevice.java
+++ b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaDevice.java
@@ -38,7 +38,7 @@
 
     InfoMediaDevice(Context context, MediaRouter2Manager routerManager, MediaRoute2Info info,
             String packageName) {
-        super(context, MediaDeviceType.TYPE_CAST_DEVICE, routerManager, info, packageName);
+        super(context, routerManager, info, packageName);
         initDeviceRecord();
     }
 
diff --git a/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java b/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java
index 3024b84..a62d76f 100644
--- a/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java
+++ b/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java
@@ -401,6 +401,11 @@
         }
 
         private List<MediaDevice> buildDisconnectedBluetoothDevice() {
+            if (mBluetoothAdapter == null) {
+                Log.w(TAG, "buildDisconnectedBluetoothDevice() BluetoothAdapter is null");
+                return new ArrayList<>();
+            }
+
             final List<BluetoothDevice> bluetoothDevices =
                     mBluetoothAdapter.getMostRecentlyConnectedDevices();
             final CachedBluetoothDeviceManager cachedDeviceManager =
diff --git a/packages/SettingsLib/src/com/android/settingslib/media/MediaDevice.java b/packages/SettingsLib/src/com/android/settingslib/media/MediaDevice.java
index 39e6a12..6aff301 100644
--- a/packages/SettingsLib/src/com/android/settingslib/media/MediaDevice.java
+++ b/packages/SettingsLib/src/com/android/settingslib/media/MediaDevice.java
@@ -15,6 +15,16 @@
  */
 package com.android.settingslib.media;
 
+import static android.media.MediaRoute2Info.TYPE_BLUETOOTH_A2DP;
+import static android.media.MediaRoute2Info.TYPE_BUILTIN_SPEAKER;
+import static android.media.MediaRoute2Info.TYPE_GROUP;
+import static android.media.MediaRoute2Info.TYPE_HEARING_AID;
+import static android.media.MediaRoute2Info.TYPE_REMOTE_SPEAKER;
+import static android.media.MediaRoute2Info.TYPE_REMOTE_TV;
+import static android.media.MediaRoute2Info.TYPE_UNKNOWN;
+import static android.media.MediaRoute2Info.TYPE_WIRED_HEADPHONES;
+import static android.media.MediaRoute2Info.TYPE_WIRED_HEADSET;
+
 import android.content.Context;
 import android.content.pm.PackageManager;
 import android.graphics.drawable.Drawable;
@@ -38,13 +48,21 @@
     private static final String TAG = "MediaDevice";
 
     @Retention(RetentionPolicy.SOURCE)
-    @IntDef({MediaDeviceType.TYPE_CAST_DEVICE,
+    @IntDef({MediaDeviceType.TYPE_USB_C_AUDIO_DEVICE,
+            MediaDeviceType.TYPE_3POINT5_MM_AUDIO_DEVICE,
+            MediaDeviceType.TYPE_FAST_PAIR_BLUETOOTH_DEVICE,
             MediaDeviceType.TYPE_BLUETOOTH_DEVICE,
+            MediaDeviceType.TYPE_CAST_DEVICE,
+            MediaDeviceType.TYPE_CAST_GROUP_DEVICE,
             MediaDeviceType.TYPE_PHONE_DEVICE})
     public @interface MediaDeviceType {
-        int TYPE_PHONE_DEVICE = 1;
-        int TYPE_CAST_DEVICE = 2;
-        int TYPE_BLUETOOTH_DEVICE = 3;
+        int TYPE_USB_C_AUDIO_DEVICE = 1;
+        int TYPE_3POINT5_MM_AUDIO_DEVICE = 2;
+        int TYPE_FAST_PAIR_BLUETOOTH_DEVICE = 3;
+        int TYPE_BLUETOOTH_DEVICE = 4;
+        int TYPE_CAST_DEVICE = 5;
+        int TYPE_CAST_GROUP_DEVICE = 6;
+        int TYPE_PHONE_DEVICE = 7;
     }
 
     @VisibleForTesting
@@ -58,13 +76,43 @@
     protected final MediaRouter2Manager mRouterManager;
     protected final String mPackageName;
 
-    MediaDevice(Context context, @MediaDeviceType int type, MediaRouter2Manager routerManager,
-            MediaRoute2Info info, String packageName) {
-        mType = type;
+    MediaDevice(Context context, MediaRouter2Manager routerManager, MediaRoute2Info info,
+            String packageName) {
         mContext = context;
         mRouteInfo = info;
         mRouterManager = routerManager;
         mPackageName = packageName;
+        setType(info);
+    }
+
+    private void setType(MediaRoute2Info info) {
+        if (info == null) {
+            mType = MediaDeviceType.TYPE_BLUETOOTH_DEVICE;
+            return;
+        }
+
+        switch (info.getType()) {
+            case TYPE_GROUP:
+                mType = MediaDeviceType.TYPE_CAST_GROUP_DEVICE;
+                break;
+            case TYPE_BUILTIN_SPEAKER:
+                mType = MediaDeviceType.TYPE_PHONE_DEVICE;
+                break;
+            case TYPE_WIRED_HEADSET:
+            case TYPE_WIRED_HEADPHONES:
+                mType = MediaDeviceType.TYPE_3POINT5_MM_AUDIO_DEVICE;
+                break;
+            case TYPE_HEARING_AID:
+            case TYPE_BLUETOOTH_A2DP:
+                mType = MediaDeviceType.TYPE_BLUETOOTH_DEVICE;
+                break;
+            case TYPE_UNKNOWN:
+            case TYPE_REMOTE_TV:
+            case TYPE_REMOTE_SPEAKER:
+            default:
+                mType = MediaDeviceType.TYPE_CAST_DEVICE;
+                break;
+        }
     }
 
     void initDeviceRecord() {
diff --git a/packages/SettingsLib/src/com/android/settingslib/media/PhoneMediaDevice.java b/packages/SettingsLib/src/com/android/settingslib/media/PhoneMediaDevice.java
index af88723..c6c5ade 100644
--- a/packages/SettingsLib/src/com/android/settingslib/media/PhoneMediaDevice.java
+++ b/packages/SettingsLib/src/com/android/settingslib/media/PhoneMediaDevice.java
@@ -42,7 +42,7 @@
 
     PhoneMediaDevice(Context context, MediaRouter2Manager routerManager, MediaRoute2Info info,
             String packageName) {
-        super(context, MediaDeviceType.TYPE_PHONE_DEVICE, routerManager, info, packageName);
+        super(context, routerManager, info, packageName);
 
         initDeviceRecord();
     }
diff --git a/packages/SettingsLib/src/com/android/settingslib/notification/EnableZenModeDialog.java b/packages/SettingsLib/src/com/android/settingslib/notification/EnableZenModeDialog.java
index 653c8ad..a210e90 100644
--- a/packages/SettingsLib/src/com/android/settingslib/notification/EnableZenModeDialog.java
+++ b/packages/SettingsLib/src/com/android/settingslib/notification/EnableZenModeDialog.java
@@ -33,6 +33,7 @@
 import android.util.Slog;
 import android.view.LayoutInflater;
 import android.view.View;
+import android.view.ViewGroup;
 import android.widget.CompoundButton;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
@@ -357,46 +358,46 @@
             }
         });
 
-        // minus button
-        final ImageView button1 = (ImageView) row.findViewById(android.R.id.button1);
-        button1.setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                onClickTimeButton(row, tag, false /*down*/, rowId);
-                tag.lines.setAccessibilityLiveRegion(View.ACCESSIBILITY_LIVE_REGION_POLITE);
-            }
-        });
-
-        // plus button
-        final ImageView button2 = (ImageView) row.findViewById(android.R.id.button2);
-        button2.setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                onClickTimeButton(row, tag, true /*up*/, rowId);
-                tag.lines.setAccessibilityLiveRegion(View.ACCESSIBILITY_LIVE_REGION_POLITE);
-            }
-        });
-
         final long time = ZenModeConfig.tryParseCountdownConditionId(conditionId);
+        final ImageView minusButton = (ImageView) row.findViewById(android.R.id.button1);
+        final ImageView plusButton = (ImageView) row.findViewById(android.R.id.button2);
         if (rowId == COUNTDOWN_CONDITION_INDEX && time > 0) {
-            button1.setVisibility(View.VISIBLE);
-            button2.setVisibility(View.VISIBLE);
+            minusButton.setOnClickListener(new View.OnClickListener() {
+                @Override
+                public void onClick(View v) {
+                    onClickTimeButton(row, tag, false /*down*/, rowId);
+                    tag.lines.setAccessibilityLiveRegion(View.ACCESSIBILITY_LIVE_REGION_POLITE);
+                }
+            });
+
+            plusButton.setOnClickListener(new View.OnClickListener() {
+                @Override
+                public void onClick(View v) {
+                    onClickTimeButton(row, tag, true /*up*/, rowId);
+                    tag.lines.setAccessibilityLiveRegion(View.ACCESSIBILITY_LIVE_REGION_POLITE);
+                }
+            });
             if (mBucketIndex > -1) {
-                button1.setEnabled(mBucketIndex > 0);
-                button2.setEnabled(mBucketIndex < MINUTE_BUCKETS.length - 1);
+                minusButton.setEnabled(mBucketIndex > 0);
+                plusButton.setEnabled(mBucketIndex < MINUTE_BUCKETS.length - 1);
             } else {
                 final long span = time - System.currentTimeMillis();
-                button1.setEnabled(span > MIN_BUCKET_MINUTES * MINUTES_MS);
+                minusButton.setEnabled(span > MIN_BUCKET_MINUTES * MINUTES_MS);
                 final Condition maxCondition = ZenModeConfig.toTimeCondition(mContext,
                         MAX_BUCKET_MINUTES, ActivityManager.getCurrentUser());
-                button2.setEnabled(!Objects.equals(condition.summary, maxCondition.summary));
+                plusButton.setEnabled(!Objects.equals(condition.summary, maxCondition.summary));
             }
 
-            button1.setAlpha(button1.isEnabled() ? 1f : .5f);
-            button2.setAlpha(button2.isEnabled() ? 1f : .5f);
+            minusButton.setAlpha(minusButton.isEnabled() ? 1f : .5f);
+            plusButton.setAlpha(plusButton.isEnabled() ? 1f : .5f);
         } else {
-            button1.setVisibility(View.GONE);
-            button2.setVisibility(View.GONE);
+            if (minusButton != null) {
+                ((ViewGroup) row).removeView(minusButton);
+            }
+
+            if (plusButton != null) {
+                ((ViewGroup) row).removeView(plusButton);
+            }
         }
     }
 
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiStatusTracker.java b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiStatusTracker.java
index c713d78..d7e76a1 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiStatusTracker.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiStatusTracker.java
@@ -133,6 +133,35 @@
         }
     }
 
+    /**
+     * Fetches initial state as if a WifiManager.NETWORK_STATE_CHANGED_ACTION have been received.
+     * This replaces the dependency on the initial sticky broadcast.
+     */
+    public void fetchInitialState() {
+        if (mWifiManager == null) {
+            return;
+        }
+        updateWifiState();
+        final NetworkInfo networkInfo =
+                mConnectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
+        connected = networkInfo != null && networkInfo.isConnected();
+        mWifiInfo = null;
+        ssid = null;
+        if (connected) {
+            mWifiInfo = mWifiManager.getConnectionInfo();
+            if (mWifiInfo != null) {
+                if (mWifiInfo.isPasspointAp() || mWifiInfo.isOsuAp()) {
+                    ssid = mWifiInfo.getPasspointProviderFriendlyName();
+                } else {
+                    ssid = getValidSsid(mWifiInfo);
+                }
+                updateRssi(mWifiInfo.getRssi());
+                maybeRequestNetworkScore();
+            }
+        }
+        updateStatusLabel();
+    }
+
     public void handleBroadcast(Intent intent) {
         if (mWifiManager == null) {
             return;
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/LocalMediaManagerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/LocalMediaManagerTest.java
index 7ddd64c..206c859 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/LocalMediaManagerTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/LocalMediaManagerTest.java
@@ -691,4 +691,28 @@
         assertThat(mLocalMediaManager.mMediaDevices).hasSize(7);
         verify(mCallback).onDeviceListUpdate(any());
     }
+
+    @Test
+    public void onDeviceListAdded_bluetoothAdapterIsNull_noDisconnectedDeviceAdded() {
+        final List<MediaDevice> devices = new ArrayList<>();
+        final MediaDevice device1 = mock(MediaDevice.class);
+        final MediaDevice device2 = mock(MediaDevice.class);
+        final MediaDevice device3 = mock(MediaDevice.class);
+        mLocalMediaManager.mPhoneDevice = mock(PhoneMediaDevice.class);
+        devices.add(device1);
+        devices.add(device2);
+        mLocalMediaManager.mMediaDevices.add(device3);
+        mLocalMediaManager.mMediaDevices.add(mLocalMediaManager.mPhoneDevice);
+
+        mShadowBluetoothAdapter = null;
+
+        when(mLocalMediaManager.mPhoneDevice.getId()).thenReturn("test_phone_id");
+
+        assertThat(mLocalMediaManager.mMediaDevices).hasSize(2);
+        mLocalMediaManager.registerCallback(mCallback);
+        mLocalMediaManager.mMediaDeviceCallback.onDeviceListAdded(devices);
+
+        assertThat(mLocalMediaManager.mMediaDevices).hasSize(2);
+        verify(mCallback).onDeviceListUpdate(any());
+    }
 }
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/MediaDeviceTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/MediaDeviceTest.java
index 4b08387..db05b76 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/MediaDeviceTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/MediaDeviceTest.java
@@ -15,6 +15,10 @@
  */
 package com.android.settingslib.media;
 
+import static android.media.MediaRoute2Info.TYPE_BLUETOOTH_A2DP;
+import static android.media.MediaRoute2Info.TYPE_BUILTIN_SPEAKER;
+import static android.media.MediaRoute2Info.TYPE_REMOTE_SPEAKER;
+
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.Mockito.verify;
@@ -144,12 +148,19 @@
         when(mCachedDevice2.isConnected()).thenReturn(true);
         when(mCachedDevice3.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED);
         when(mCachedDevice3.isConnected()).thenReturn(true);
+        when(mBluetoothRouteInfo1.getType()).thenReturn(TYPE_BLUETOOTH_A2DP);
+        when(mBluetoothRouteInfo2.getType()).thenReturn(TYPE_BLUETOOTH_A2DP);
+        when(mBluetoothRouteInfo3.getType()).thenReturn(TYPE_BLUETOOTH_A2DP);
         when(mRouteInfo1.getId()).thenReturn(ROUTER_ID_1);
         when(mRouteInfo2.getId()).thenReturn(ROUTER_ID_2);
         when(mRouteInfo3.getId()).thenReturn(ROUTER_ID_3);
         when(mRouteInfo1.getName()).thenReturn(DEVICE_NAME_1);
         when(mRouteInfo2.getName()).thenReturn(DEVICE_NAME_2);
         when(mRouteInfo3.getName()).thenReturn(DEVICE_NAME_3);
+        when(mRouteInfo1.getType()).thenReturn(TYPE_REMOTE_SPEAKER);
+        when(mRouteInfo2.getType()).thenReturn(TYPE_REMOTE_SPEAKER);
+        when(mRouteInfo3.getType()).thenReturn(TYPE_REMOTE_SPEAKER);
+        when(mPhoneRouteInfo.getType()).thenReturn(TYPE_BUILTIN_SPEAKER);
         when(mLocalBluetoothManager.getProfileManager()).thenReturn(mProfileManager);
         when(mProfileManager.getA2dpProfile()).thenReturn(mA2dpProfile);
         when(mProfileManager.getHearingAidProfile()).thenReturn(mHapProfile);
@@ -271,12 +282,12 @@
 
     @Test
     public void compareTo_info_bluetooth_infoFirst() {
-        mMediaDevices.add(mBluetoothMediaDevice1);
         mMediaDevices.add(mInfoMediaDevice1);
+        mMediaDevices.add(mBluetoothMediaDevice1);
 
-        assertThat(mMediaDevices.get(0)).isEqualTo(mBluetoothMediaDevice1);
-        Collections.sort(mMediaDevices, COMPARATOR);
         assertThat(mMediaDevices.get(0)).isEqualTo(mInfoMediaDevice1);
+        Collections.sort(mMediaDevices, COMPARATOR);
+        assertThat(mMediaDevices.get(0)).isEqualTo(mBluetoothMediaDevice1);
     }
 
     @Test
@@ -327,7 +338,7 @@
     // 5.mBluetoothMediaDevice2: * 2 times usage
     // 6.mBluetoothMediaDevice3: * 1 time usage
     // 7.mPhoneMediaDevice:      * 0 time usage
-    // Order: 7 -> 2 -> 1 -> 3 -> 5 -> 4 -> 6
+    // Order: 7 -> 2 -> 1 -> 5 -> 3 -> 6 -> 4
     @Test
     public void compareTo_mixedDevices_carKitFirst() {
         when(mDevice1.getBluetoothClass()).thenReturn(mCarkitClass);
@@ -352,10 +363,10 @@
         assertThat(mMediaDevices.get(0)).isEqualTo(mPhoneMediaDevice);
         assertThat(mMediaDevices.get(1)).isEqualTo(mBluetoothMediaDevice1);
         assertThat(mMediaDevices.get(2)).isEqualTo(mInfoMediaDevice1);
-        assertThat(mMediaDevices.get(3)).isEqualTo(mInfoMediaDevice2);
-        assertThat(mMediaDevices.get(4)).isEqualTo(mBluetoothMediaDevice2);
-        assertThat(mMediaDevices.get(5)).isEqualTo(mInfoMediaDevice3);
-        assertThat(mMediaDevices.get(6)).isEqualTo(mBluetoothMediaDevice3);
+        assertThat(mMediaDevices.get(3)).isEqualTo(mBluetoothMediaDevice2);
+        assertThat(mMediaDevices.get(4)).isEqualTo(mInfoMediaDevice2);
+        assertThat(mMediaDevices.get(5)).isEqualTo(mBluetoothMediaDevice3);
+        assertThat(mMediaDevices.get(6)).isEqualTo(mInfoMediaDevice3);
     }
 
     // 1.mInfoMediaDevice1:      Last Selected device
@@ -365,7 +376,7 @@
     // 5.mBluetoothMediaDevice2: * 4 times usage not connected
     // 6.mBluetoothMediaDevice3: * 1 time usage
     // 7.mPhoneMediaDevice:      * 0 time usage
-    // Order: 7 -> 1 -> 3 -> 4 -> 6 -> 2 -> 5
+    // Order: 7 -> 1 -> 3 -> 6 -> 4  -> 2 -> 5
     @Test
     public void compareTo_mixedDevices_connectDeviceFirst() {
         when(mDevice1.getBluetoothClass()).thenReturn(mCarkitClass);
@@ -394,8 +405,8 @@
         assertThat(mMediaDevices.get(0)).isEqualTo(mPhoneMediaDevice);
         assertThat(mMediaDevices.get(1)).isEqualTo(mInfoMediaDevice1);
         assertThat(mMediaDevices.get(2)).isEqualTo(mInfoMediaDevice2);
-        assertThat(mMediaDevices.get(3)).isEqualTo(mInfoMediaDevice3);
-        assertThat(mMediaDevices.get(4)).isEqualTo(mBluetoothMediaDevice3);
+        assertThat(mMediaDevices.get(3)).isEqualTo(mBluetoothMediaDevice3);
+        assertThat(mMediaDevices.get(4)).isEqualTo(mInfoMediaDevice3);
         assertThat(mMediaDevices.get(5)).isEqualTo(mBluetoothMediaDevice1);
         assertThat(mMediaDevices.get(6)).isEqualTo(mBluetoothMediaDevice2);
     }
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/utils/PowerUtilTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/utils/PowerUtilTest.java
index 342d127a..4b779ac 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/utils/PowerUtilTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/utils/PowerUtilTest.java
@@ -137,9 +137,9 @@
                 true /* basedOnUsage */);
 
         // shortened string should not have percentage
-        assertThat(info).isEqualTo("Less than 15 min remaining");
+        assertThat(info).isEqualTo("Less than 15 min left");
         // Add percentage to string when provided
-        assertThat(info2).isEqualTo("Less than 15 min remaining (10%)");
+        assertThat(info2).isEqualTo("Less than 15 min left (10%)");
     }
 
     @Test
@@ -171,9 +171,9 @@
                 true /* basedOnUsage */);
 
         // shortened string should not have percentage
-        assertThat(info).isEqualTo("More than 2 days remaining");
+        assertThat(info).isEqualTo("More than 2 days left");
         // Add percentage to string when provided
-        assertThat(info2).isEqualTo("More than 2 days remaining (10%)");
+        assertThat(info2).isEqualTo("More than 2 days left (10%)");
     }
 
     @Test
@@ -181,7 +181,7 @@
         String info = PowerUtil.getBatteryTipStringFormatted(mContext,
                 THREE_DAYS_MILLIS);
 
-        assertThat(info).isEqualTo("More than 3 days remaining");
+        assertThat(info).isEqualTo("More than 3 days left");
     }
 
     @Test
diff --git a/packages/SettingsProvider/res/values-eu/strings.xml b/packages/SettingsProvider/res/values-eu/strings.xml
index 7ca91d8..e7d2c67 100644
--- a/packages/SettingsProvider/res/values-eu/strings.xml
+++ b/packages/SettingsProvider/res/values-eu/strings.xml
@@ -20,6 +20,6 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_label" msgid="4567566098528588863">"Ezarpenen biltegia"</string>
-    <string name="wifi_softap_config_change" msgid="5688373762357941645">"Sare publikoaren ezarpenak aldatu dira"</string>
+    <string name="wifi_softap_config_change" msgid="5688373762357941645">"Wifi-gunearen ezarpenak aldatu dira"</string>
     <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"Sakatu hau xehetasunak ikusteko"</string>
 </resources>
diff --git a/packages/SettingsProvider/res/values-ky/strings.xml b/packages/SettingsProvider/res/values-ky/strings.xml
index e5b82c69..8058b4d 100644
--- a/packages/SettingsProvider/res/values-ky/strings.xml
+++ b/packages/SettingsProvider/res/values-ky/strings.xml
@@ -20,6 +20,6 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_label" msgid="4567566098528588863">"Жөндөөлөрдү сактоо"</string>
-    <string name="wifi_softap_config_change" msgid="5688373762357941645">"Хотспот жөндөөлөрү өзгөрдү"</string>
+    <string name="wifi_softap_config_change" msgid="5688373762357941645">"Байланыш түйүнү  жөндөөлөрү өзгөрдү"</string>
     <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"Чоо-жайын билүү үчүн басыңыз"</string>
 </resources>
diff --git a/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java b/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java
index 736e995..c04a1ba 100644
--- a/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java
+++ b/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java
@@ -97,6 +97,7 @@
         Settings.Secure.SYSTEM_NAVIGATION_KEYS_ENABLED,
         Settings.Secure.QS_TILES,
         Settings.Secure.CONTROLS_ENABLED,
+        Settings.Secure.POWER_MENU_LOCKED_SHOW_CONTENT,
         Settings.Secure.DOZE_ENABLED,
         Settings.Secure.DOZE_ALWAYS_ON,
         Settings.Secure.DOZE_PICK_UP_GESTURE,
diff --git a/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java b/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java
index b413e8e..76746e5 100644
--- a/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java
+++ b/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java
@@ -142,6 +142,7 @@
         VALIDATORS.put(Secure.SYSTEM_NAVIGATION_KEYS_ENABLED, BOOLEAN_VALIDATOR);
         VALIDATORS.put(Secure.QS_TILES, TILE_LIST_VALIDATOR);
         VALIDATORS.put(Secure.CONTROLS_ENABLED, BOOLEAN_VALIDATOR);
+        VALIDATORS.put(Secure.POWER_MENU_LOCKED_SHOW_CONTENT, BOOLEAN_VALIDATOR);
         VALIDATORS.put(Secure.DOZE_ENABLED, BOOLEAN_VALIDATOR);
         VALIDATORS.put(Secure.DOZE_ALWAYS_ON, BOOLEAN_VALIDATOR);
         VALIDATORS.put(Secure.DOZE_PICK_UP_GESTURE, BOOLEAN_VALIDATOR);
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
index 8a7b913..a5dce6d 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
@@ -2278,6 +2278,12 @@
                 SecureSettingsProto.ParentalControl.REDIRECT_URL);
         p.end(parentalControlToken);
 
+        final long powerMenuPrivacyToken = p.start(SecureSettingsProto.POWER_MENU_PRIVACY);
+        dumpSetting(s, p,
+                Settings.Secure.POWER_MENU_LOCKED_SHOW_CONTENT,
+                SecureSettingsProto.PowerMenuPrivacy.SHOW);
+        p.end(powerMenuPrivacyToken);
+
         final long printServiceToken = p.start(SecureSettingsProto.PRINT_SERVICE);
         dumpSetting(s, p,
                 Settings.Secure.PRINT_SERVICE_SEARCH_URI,
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
index d3d04e5..74eee63 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
@@ -3437,7 +3437,7 @@
         }
 
         private final class UpgradeController {
-            private static final int SETTINGS_VERSION = 189;
+            private static final int SETTINGS_VERSION = 190;
 
             private final int mUserId;
 
@@ -4777,6 +4777,28 @@
                     currentVersion = 189;
                 }
 
+                if (currentVersion == 189) {
+                    final SettingsState secureSettings = getSecureSettingsLocked(userId);
+                    final Setting showNotifications = secureSettings.getSettingLocked(
+                            Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS);
+                    final Setting allowPrivateNotifications = secureSettings.getSettingLocked(
+                            Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS);
+                    if ("1".equals(showNotifications.getValue())
+                            && "1".equals(allowPrivateNotifications.getValue())) {
+                        secureSettings.insertSettingLocked(
+                                Secure.POWER_MENU_LOCKED_SHOW_CONTENT,
+                                "1", null /* tag */, false /* makeDefault */,
+                                SettingsState.SYSTEM_PACKAGE_NAME);
+                    } else if ("0".equals(showNotifications.getValue())
+                            || "0".equals(allowPrivateNotifications.getValue())) {
+                        secureSettings.insertSettingLocked(
+                                Secure.POWER_MENU_LOCKED_SHOW_CONTENT,
+                                "0", null /* tag */, false /* makeDefault */,
+                                SettingsState.SYSTEM_PACKAGE_NAME);
+                    }
+                    currentVersion = 190;
+                }
+
                 // vXXX: Add new settings above this point.
 
                 if (currentVersion != newVersion) {
diff --git a/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java b/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java
index 01a2b69..03f6df0 100644
--- a/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java
+++ b/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java
@@ -101,7 +101,8 @@
                     Settings.System.MIN_REFRESH_RATE, // depends on hardware capabilities
                     Settings.System.PEAK_REFRESH_RATE, // depends on hardware capabilities
                     Settings.System.SCREEN_BRIGHTNESS_FLOAT,
-                    Settings.System.SCREEN_BRIGHTNESS_FOR_VR_FLOAT
+                    Settings.System.SCREEN_BRIGHTNESS_FOR_VR_FLOAT,
+                    Settings.System.MULTI_AUDIO_FOCUS_ENABLED // form-factor/OEM specific
                     );
 
     private static final Set<String> BACKUP_BLACKLISTED_GLOBAL_SETTINGS =
diff --git a/packages/SystemUI/res/anim/control_state_list_animator.xml b/packages/SystemUI/res/anim/control_state_list_animator.xml
new file mode 100644
index 0000000..a20a925
--- /dev/null
+++ b/packages/SystemUI/res/anim/control_state_list_animator.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2020 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_pressed="true">
+        <set>
+            <objectAnimator
+                android:interpolator="@interpolator/control_state"
+                android:duration="50"
+                android:propertyName="scaleX"
+                android:valueTo="0.97"
+                android:valueType="floatType" />
+            <objectAnimator
+                android:interpolator="@interpolator/control_state"
+                android:duration="50"
+                android:propertyName="scaleY"
+                android:valueTo="0.97"
+                android:valueType="floatType" />
+
+        </set>
+    </item>
+    <item>
+        <set>
+            <objectAnimator
+                android:interpolator="@interpolator/control_state"
+                android:duration="250"
+                android:propertyName="scaleX"
+                android:valueTo="1"
+                android:valueType="floatType" />
+            <objectAnimator
+                android:interpolator="@interpolator/control_state"
+                android:duration="250"
+                android:propertyName="scaleY"
+                android:valueTo="1"
+                android:valueType="floatType" />
+        </set>
+    </item>
+</selector>
\ No newline at end of file
diff --git a/packages/SystemUI/res/drawable-nodpi/controls_btn_star.xml b/packages/SystemUI/res/drawable-nodpi/controls_btn_star.xml
deleted file mode 100644
index cfe7838..0000000
--- a/packages/SystemUI/res/drawable-nodpi/controls_btn_star.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2020 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<selector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="24dp"
-    android:height="24dp">
-    <item android:state_checked="true"
-          android:drawable="@drawable/star_filled"
-          android:tint="@color/control_primary_text"/>
-    <item android:drawable="@drawable/star_outline"
-          android:tint="@color/control_primary_text"/>
-</selector>
diff --git a/packages/SystemUI/res/drawable-nodpi/star_filled.xml b/packages/SystemUI/res/drawable-nodpi/star_filled.xml
deleted file mode 100644
index 62802d3..0000000
--- a/packages/SystemUI/res/drawable-nodpi/star_filled.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2020 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-
-<vector
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="24dp"
-    android:height="24dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path
-        android:pathData="M 11.99 0.027 L 8.628 8.382 L 0.027 9.15 L 6.559 15.111 L 4.597 23.97 L 11.99 19.27 L 19.383 23.97 L 17.421 15.111 L 23.953 9.15 L 15.352 8.382 Z"
-        android:fillColor="#FFFFFFFF"/>
-</vector>
diff --git a/packages/SystemUI/res/drawable-nodpi/star_outline.xml b/packages/SystemUI/res/drawable-nodpi/star_outline.xml
deleted file mode 100644
index 13983c6..0000000
--- a/packages/SystemUI/res/drawable-nodpi/star_outline.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2020 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-
-<vector
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="24dp"
-    android:height="24dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path
-        android:pathData="M 11.99 6.491 L 13.15 9.377 L 13.713 10.776 L 15.148 10.902 L 18.103 11.167 L 15.854 13.221 L 14.766 14.216 L 15.089 15.703 L 15.759 18.74 L 13.222 17.127 L 11.99 16.321 L 10.758 17.102 L 8.222 18.715 L 8.891 15.678 L 9.215 14.191 L 8.126 13.196 L 5.877 11.141 L 8.832 10.877 L 10.267 10.751 L 10.83 9.352 L 11.99 6.491 M 11.99 0.027 L 8.628 8.382 L 0.027 9.15 L 6.559 15.111 L 4.597 23.97 L 11.99 19.27 L 19.383 23.97 L 17.421 15.111 L 23.953 9.15 L 15.352 8.382 Z"
-        android:fillColor="#FFFFFFFF"/>
-</vector>
diff --git a/packages/SystemUI/res/drawable/bubble_manage_menu_row.xml b/packages/SystemUI/res/drawable/bubble_manage_menu_row.xml
new file mode 100644
index 0000000..a793680
--- /dev/null
+++ b/packages/SystemUI/res/drawable/bubble_manage_menu_row.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2020 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License
+  -->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_pressed="true">
+        <ripple android:color="#99999999" />
+    </item>
+</selector>
\ No newline at end of file
diff --git a/packages/SystemUI/res/drawable/control_background.xml b/packages/SystemUI/res/drawable/control_background.xml
index 29b4efa..cf298b7 100644
--- a/packages/SystemUI/res/drawable/control_background.xml
+++ b/packages/SystemUI/res/drawable/control_background.xml
@@ -17,7 +17,8 @@
 */
 -->
 <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
-  <item>
+  <item
+      android:id="@+id/background">
     <shape>
       <solid android:color="@color/control_default_background" />
       <corners android:radius="@dimen/control_corner_radius" />
diff --git a/packages/SystemUI/res/drawable/ic_create_bubble.xml b/packages/SystemUI/res/drawable/ic_create_bubble.xml
index 1947f58..d58e9a3 100644
--- a/packages/SystemUI/res/drawable/ic_create_bubble.xml
+++ b/packages/SystemUI/res/drawable/ic_create_bubble.xml
@@ -14,16 +14,12 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportWidth="24"
-        android:viewportHeight="24">
-    <path
-        android:pathData="M12,3c-4.97,0 -9,4.03 -9,9c0,1.39 0.32,2.69 0.88,3.86l1.53,-1.53C5.15,13.6 5,12.82 5,12c0,-3.86 3.14,-7 7,-7s7,3.14 7,7s-3.14,7 -7,7c-0.83,0 -1.62,-0.15 -2.35,-0.42l-1.53,1.53C9.3,20.67 10.61,21 12,21c4.97,0 9,-4.03 9,-9C21,7.03 16.97,3 12,3z"
-        android:fillColor="#000000"/>
-    <path
-        android:pathData="M12.99,15.99l2,0l0,-7l-7,0l0,2l3.59,0l-8.79,8.8l1.41,1.41l8.79,-8.79z"
-        android:fillColor="#000000"/>
-</vector>
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+  <path
+      android:fillColor="#FF000000"
+      android:pathData="M22,12C22,12 22,12 22,12C22,12 22,12 22,12c0,0.56 -0.06,1.1 -0.15,1.64l-1.97,-0.33c0.15,-0.91 0.15,-1.84 -0.02,-2.75c-0.01,-0.03 -0.01,-0.07 -0.02,-0.1c-0.03,-0.18 -0.08,-0.36 -0.13,-0.54c-0.02,-0.08 -0.04,-0.16 -0.06,-0.24c-0.04,-0.14 -0.09,-0.27 -0.14,-0.41c-0.04,-0.12 -0.08,-0.24 -0.13,-0.35c-0.04,-0.09 -0.08,-0.18 -0.13,-0.27c-0.07,-0.15 -0.14,-0.3 -0.22,-0.45c-0.03,-0.05 -0.06,-0.09 -0.08,-0.14c-0.72,-1.26 -1.77,-2.31 -3.03,-3.03c-0.05,-0.03 -0.09,-0.06 -0.14,-0.08c-0.15,-0.08 -0.3,-0.15 -0.45,-0.22c-0.09,-0.04 -0.18,-0.09 -0.27,-0.13c-0.11,-0.05 -0.23,-0.09 -0.35,-0.13c-0.14,-0.05 -0.27,-0.1 -0.41,-0.14c-0.08,-0.02 -0.16,-0.04 -0.23,-0.06c-0.18,-0.05 -0.36,-0.1 -0.54,-0.13c-0.03,-0.01 -0.07,-0.01 -0.1,-0.01c-0.95,-0.17 -1.93,-0.17 -2.88,0c-0.03,0.01 -0.07,0.01 -0.1,0.01c-0.18,0.04 -0.36,0.08 -0.54,0.13C9.85,4.3 9.77,4.32 9.69,4.34C9.55,4.38 9.42,4.44 9.28,4.49C9.17,4.53 9.05,4.57 8.93,4.61C8.84,4.65 8.75,4.7 8.66,4.74c-0.15,0.07 -0.3,0.14 -0.45,0.22C8.16,4.98 8.12,5.01 8.07,5.04C5.64,6.42 4,9.02 4,12c0,2.74 1.39,5.16 3.49,6.6c0.01,0.01 0.03,0.02 0.04,0.03c0.16,0.11 0.33,0.2 0.49,0.3c0.06,0.04 0.12,0.08 0.19,0.11c0.13,0.07 0.27,0.13 0.4,0.19c0.11,0.05 0.21,0.1 0.32,0.15c0.1,0.04 0.2,0.07 0.29,0.11c0.15,0.06 0.31,0.11 0.46,0.16c0.05,0.02 0.11,0.03 0.17,0.04c1.11,0.31 2.27,0.35 3.4,0.18l0.35,1.98c-0.54,0.09 -1.08,0.14 -1.62,0.14V22c-0.65,0 -1.28,-0.07 -1.9,-0.19c-0.01,0 -0.01,0 -0.02,0c-0.25,-0.05 -0.49,-0.11 -0.73,-0.18c-0.08,-0.02 -0.16,-0.04 -0.23,-0.06c-0.19,-0.06 -0.37,-0.13 -0.55,-0.19c-0.13,-0.05 -0.26,-0.09 -0.39,-0.14c-0.13,-0.05 -0.25,-0.12 -0.38,-0.18c-0.18,-0.08 -0.35,-0.16 -0.53,-0.25c-0.07,-0.04 -0.14,-0.08 -0.21,-0.13c-0.22,-0.12 -0.43,-0.25 -0.64,-0.39c-0.01,-0.01 -0.02,-0.02 -0.04,-0.03c-0.51,-0.35 -1,-0.74 -1.45,-1.2l0,0C3.12,17.26 2,14.76 2,12c0,-2.76 1.12,-5.26 2.93,-7.07l0,0c0.45,-0.45 0.93,-0.84 1.44,-1.19C6.39,3.73 6.4,3.72 6.42,3.71c0.2,-0.14 0.41,-0.26 0.62,-0.38c0.08,-0.05 0.15,-0.09 0.23,-0.14c0.17,-0.09 0.33,-0.16 0.5,-0.24c0.13,-0.06 0.27,-0.13 0.4,-0.19C8.3,2.71 8.42,2.67 8.55,2.63c0.19,-0.07 0.38,-0.14 0.58,-0.2c0.07,-0.02 0.14,-0.03 0.21,-0.05C10.18,2.14 11.07,2 12,2c0.65,0 1.29,0.07 1.91,0.19c0,0 0,0 0,0c0.25,0.05 0.5,0.11 0.75,0.18c0.07,0.02 0.14,0.03 0.22,0.06c0.19,0.06 0.38,0.13 0.57,0.2c0.12,0.05 0.25,0.09 0.37,0.14c0.14,0.06 0.27,0.12 0.4,0.18c0.17,0.08 0.34,0.16 0.51,0.25c0.08,0.04 0.15,0.09 0.23,0.14c0.21,0.12 0.42,0.24 0.62,0.38c0.01,0.01 0.03,0.02 0.04,0.03c0.51,0.35 0.99,0.74 1.45,1.19c0.24,0.24 0.47,0.49 0.68,0.75c0.04,0.04 0.06,0.09 0.1,0.13c0.17,0.22 0.34,0.45 0.5,0.68c0.01,0.01 0.02,0.03 0.03,0.04c0.69,1.05 1.17,2.21 1.42,3.44c0,0 0,0.01 0,0.01c0.06,0.29 0.1,0.58 0.13,0.87c0.01,0.04 0.01,0.09 0.02,0.13C21.98,11.32 22,11.66 22,12zM18.5,15c-1.93,0 -3.5,1.57 -3.5,3.5s1.57,3.5 3.5,3.5s3.5,-1.57 3.5,-3.5S20.43,15 18.5,15z"/>
+</vector>
\ No newline at end of file
diff --git a/packages/SystemUI/res/drawable/ic_stop_bubble.xml b/packages/SystemUI/res/drawable/ic_stop_bubble.xml
new file mode 100644
index 0000000..11bc741
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_stop_bubble.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+  <path
+      android:fillColor="#FF000000"
+      android:pathData="M21.98,18.32l-3.3,-3.3C20.47,15.11 21.89,16.53 21.98,18.32zM8.66,4.74C8.75,4.7 8.84,4.65 8.93,4.61c0.11,-0.05 0.23,-0.09 0.35,-0.13c0.14,-0.05 0.27,-0.1 0.41,-0.14C9.77,4.32 9.85,4.3 9.92,4.28c0.18,-0.05 0.36,-0.1 0.54,-0.13c0.03,-0.01 0.07,-0.01 0.1,-0.01c0.95,-0.17 1.93,-0.17 2.88,0c0.03,0.01 0.07,0.01 0.1,0.01c0.18,0.04 0.36,0.08 0.54,0.13c0.08,0.02 0.16,0.04 0.23,0.06c0.14,0.04 0.27,0.09 0.41,0.14c0.12,0.04 0.23,0.08 0.35,0.13c0.09,0.04 0.18,0.09 0.27,0.13c0.15,0.07 0.3,0.14 0.45,0.22c0.05,0.03 0.09,0.06 0.14,0.08c1.26,0.72 2.31,1.77 3.03,3.03c0.03,0.05 0.06,0.09 0.08,0.14c0.08,0.15 0.15,0.3 0.22,0.45c0.04,0.09 0.09,0.18 0.13,0.27c0.05,0.11 0.09,0.23 0.13,0.35c0.05,0.13 0.1,0.27 0.14,0.41c0.02,0.08 0.04,0.16 0.06,0.24c0.05,0.18 0.1,0.36 0.13,0.54c0.01,0.03 0.01,0.07 0.02,0.1c0.16,0.91 0.17,1.84 0.02,2.75l1.97,0.33C21.94,13.1 22,12.56 22,12c0,0 0,0 0,0s0,0 0,0c0,-0.34 -0.02,-0.68 -0.05,-1.01c0,-0.04 -0.01,-0.09 -0.02,-0.13c-0.03,-0.29 -0.07,-0.58 -0.13,-0.87c0,0 0,-0.01 0,-0.01c-0.25,-1.23 -0.73,-2.39 -1.42,-3.44c-0.01,-0.01 -0.02,-0.03 -0.03,-0.04c-0.15,-0.23 -0.32,-0.46 -0.5,-0.68c-0.03,-0.04 -0.06,-0.09 -0.1,-0.13c-0.21,-0.26 -0.44,-0.51 -0.68,-0.75c-0.45,-0.45 -0.94,-0.84 -1.45,-1.19c-0.01,-0.01 -0.03,-0.02 -0.04,-0.03c-0.2,-0.14 -0.41,-0.26 -0.62,-0.38c-0.08,-0.04 -0.15,-0.09 -0.23,-0.14c-0.17,-0.09 -0.34,-0.17 -0.51,-0.25c-0.13,-0.06 -0.26,-0.13 -0.4,-0.18c-0.12,-0.05 -0.25,-0.09 -0.37,-0.14c-0.19,-0.07 -0.38,-0.14 -0.57,-0.2c-0.07,-0.02 -0.14,-0.04 -0.22,-0.06c-0.25,-0.07 -0.5,-0.13 -0.75,-0.18c0,0 0,0 0,0C13.29,2.07 12.65,2 12,2c-0.93,0 -1.82,0.14 -2.67,0.37C9.26,2.39 9.19,2.41 9.12,2.43c-0.2,0.06 -0.39,0.13 -0.58,0.2C8.42,2.67 8.3,2.71 8.18,2.76c-0.14,0.06 -0.27,0.12 -0.4,0.19C7.61,3.03 7.44,3.1 7.27,3.19C7.19,3.24 7.12,3.29 7.04,3.33C7.03,3.34 7.02,3.34 7.01,3.35l1.48,1.48C8.55,4.8 8.6,4.77 8.66,4.74zM2.71,1.29L1.29,2.71l2.97,2.97C2.85,7.4 2,9.6 2,12c0,2.76 1.12,5.26 2.93,7.07l0,0c0.45,0.45 0.94,0.85 1.45,1.2c0.01,0.01 0.02,0.02 0.04,0.03c0.21,0.14 0.42,0.27 0.64,0.39c0.07,0.04 0.14,0.09 0.21,0.13c0.17,0.09 0.35,0.17 0.53,0.25c0.13,0.06 0.25,0.12 0.38,0.18c0.13,0.05 0.26,0.1 0.39,0.14c0.18,0.07 0.36,0.14 0.55,0.19c0.08,0.02 0.16,0.04 0.23,0.06c0.24,0.07 0.48,0.13 0.73,0.18c0.01,0 0.01,0 0.02,0C10.72,21.93 11.35,22 12,22v-0.01c0.54,0 1.08,-0.05 1.62,-0.14l-0.35,-1.98c-1.13,0.18 -2.29,0.13 -3.4,-0.18c-0.06,-0.02 -0.11,-0.03 -0.17,-0.04c-0.16,-0.05 -0.31,-0.11 -0.46,-0.16c-0.1,-0.04 -0.2,-0.07 -0.29,-0.11c-0.11,-0.05 -0.22,-0.1 -0.32,-0.15c-0.13,-0.06 -0.27,-0.12 -0.4,-0.19c-0.06,-0.03 -0.13,-0.08 -0.19,-0.11c-0.17,-0.1 -0.33,-0.19 -0.49,-0.3c-0.01,-0.01 -0.03,-0.02 -0.04,-0.03C5.39,17.16 4,14.74 4,12c0,-1.85 0.64,-3.54 1.7,-4.89l9.73,9.73C15.16,17.33 15,17.9 15,18.5c0,1.93 1.57,3.5 3.5,3.5c0.6,0 1.17,-0.16 1.66,-0.43l1.13,1.13l1.41,-1.41L2.71,1.29z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/screenshot_cancel.xml b/packages/SystemUI/res/drawable/screenshot_cancel.xml
index be3c598..f0dfd21 100644
--- a/packages/SystemUI/res/drawable/screenshot_cancel.xml
+++ b/packages/SystemUI/res/drawable/screenshot_cancel.xml
@@ -20,9 +20,9 @@
         android:viewportWidth="48.0"
         android:viewportHeight="48.0">
     <path
-        android:pathData="M24,24m-16,0a16,16 0,1 1,32 0a16,16 0,1 1,-32 0"
-        android:fillColor="@android:color/white"/>
+        android:fillColor="@color/global_screenshot_dismiss_background"
+        android:pathData="M24,24m-16,0a16,16 0,1 1,32 0a16,16 0,1 1,-32 0"/>
     <path
-        android:fillColor="@color/GM2_grey_500"
+        android:fillColor="@color/global_screenshot_dismiss_foreground"
         android:pathData="M31,18.41L29.59,17 24,22.59 18.41,17 17,18.41 22.59,24 17,29.59 18.41,31 24,25.41 29.59,31 31,29.59 25.41,24z"/>
 </vector>
\ No newline at end of file
diff --git a/packages/SystemUI/res/interpolator/control_state.xml b/packages/SystemUI/res/interpolator/control_state.xml
new file mode 100644
index 0000000..66106d4
--- /dev/null
+++ b/packages/SystemUI/res/interpolator/control_state.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2020 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<pathInterpolator
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:controlX1="0"
+    android:controlY1="0"
+    android:controlX2="1"
+    android:controlY2="1"/>
diff --git a/packages/SystemUI/res/layout/app_ops_info.xml b/packages/SystemUI/res/layout/app_ops_info.xml
index 8342a2a..667c857 100644
--- a/packages/SystemUI/res/layout/app_ops_info.xml
+++ b/packages/SystemUI/res/layout/app_ops_info.xml
@@ -62,30 +62,35 @@
         style="@style/TextAppearance.NotificationInfo.Secondary" />
 
     <!-- Settings and Done buttons -->
-    <LinearLayout
+    <RelativeLayout
+        android:id="@+id/bottom_buttons"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:layout_marginTop="@dimen/notification_guts_button_spacing"
-        android:layout_marginBottom="@dimen/notification_guts_button_spacing"
-        android:gravity="end"
-        android:orientation="horizontal">
-
+        android:gravity="center_vertical"
+        android:paddingStart="4dp"
+        android:paddingEnd="4dp">
         <TextView
             android:id="@+id/settings"
             android:text="@string/notification_appops_settings"
             android:layout_width="wrap_content"
-            android:layout_height="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_toStartOf="@+id/ok"
+            android:gravity="center_vertical"
             android:background="@drawable/ripple_drawable"
+            android:layout_marginEnd="8dp"
+            android:minWidth="@dimen/min_clickable_item_size"
+            android:minHeight="@dimen/min_clickable_item_size"
             style="@style/TextAppearance.NotificationInfo.Button"/>
         <TextView
             android:id="@+id/ok"
             android:text="@string/notification_appops_ok"
             android:layout_width="wrap_content"
-            android:layout_height="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_alignParentEnd="true"
+            android:gravity="end|center_vertical"
             android:background="@drawable/ripple_drawable"
-            android:minWidth="48dp"
-            android:layout_marginStart="8dp"
-            android:layout_marginEnd="-8dp"
+            android:minWidth="@dimen/min_clickable_item_size"
+            android:minHeight="@dimen/min_clickable_item_size"
             style="@style/TextAppearance.NotificationInfo.Button"/>
-    </LinearLayout>
+    </RelativeLayout>
 </com.android.systemui.statusbar.notification.row.AppOpsInfo>
diff --git a/packages/SystemUI/res/layout/bubble_manage_menu.xml b/packages/SystemUI/res/layout/bubble_manage_menu.xml
new file mode 100644
index 0000000..129282d
--- /dev/null
+++ b/packages/SystemUI/res/layout/bubble_manage_menu.xml
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2020 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License
+  -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:background="@drawable/rounded_bg_full"
+    android:elevation="@dimen/bubble_manage_menu_elevation"
+    android:orientation="vertical">
+
+    <LinearLayout
+        android:id="@+id/bubble_manage_menu_dismiss_container"
+        android:background="@drawable/bubble_manage_menu_row"
+        android:layout_width="match_parent"
+        android:layout_height="48dp"
+        android:gravity="center_vertical"
+        android:paddingStart="16dp"
+        android:paddingEnd="16dp"
+        android:orientation="horizontal">
+
+        <ImageView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:src="@drawable/ic_remove_no_shadow"
+            android:tint="@color/global_actions_text"/>
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="16dp"
+            android:textAppearance="@*android:style/TextAppearance.DeviceDefault"
+            android:text="@string/bubble_dismiss_text" />
+
+    </LinearLayout>
+
+    <LinearLayout
+        android:id="@+id/bubble_manage_menu_dont_bubble_container"
+        android:background="@drawable/bubble_manage_menu_row"
+        android:layout_width="match_parent"
+        android:layout_height="48dp"
+        android:gravity="center_vertical"
+        android:paddingStart="16dp"
+        android:paddingEnd="16dp"
+        android:orientation="horizontal">
+
+        <ImageView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:src="@drawable/ic_stop_bubble"
+            android:tint="@color/global_actions_text"/>
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="16dp"
+            android:textAppearance="@*android:style/TextAppearance.DeviceDefault"
+            android:text="@string/bubbles_dont_bubble_conversation" />
+
+    </LinearLayout>
+
+    <LinearLayout
+        android:id="@+id/bubble_manage_menu_settings_container"
+        android:background="@drawable/bubble_manage_menu_row"
+        android:layout_width="match_parent"
+        android:layout_height="48dp"
+        android:gravity="center_vertical"
+        android:paddingStart="16dp"
+        android:paddingEnd="16dp"
+        android:orientation="horizontal">
+
+        <ImageView
+            android:id="@+id/bubble_manage_menu_settings_icon"
+            android:layout_width="24dp"
+            android:layout_height="24dp"
+            android:src="@drawable/ic_remove_no_shadow"/>
+
+        <TextView
+            android:id="@+id/bubble_manage_menu_settings_name"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="16dp"
+            android:textAppearance="@*android:style/TextAppearance.DeviceDefault" />
+
+    </LinearLayout>
+
+</LinearLayout>
\ No newline at end of file
diff --git a/packages/SystemUI/res/layout/controls_base_item.xml b/packages/SystemUI/res/layout/controls_base_item.xml
index 55c9083..fd75d91 100644
--- a/packages/SystemUI/res/layout/controls_base_item.xml
+++ b/packages/SystemUI/res/layout/controls_base_item.xml
@@ -24,6 +24,7 @@
     android:clickable="false"
     android:focusable="true"
     android:screenReaderFocusable="true"
+    android:stateListAnimator="@anim/control_state_list_animator"
     android:layout_marginLeft="@dimen/control_base_item_margin"
     android:layout_marginRight="@dimen/control_base_item_margin"
     android:background="@drawable/control_background">
@@ -100,7 +101,6 @@
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_gravity="bottom|end"
-        android:button="@drawable/controls_btn_star"
         android:background="@android:color/transparent"
         android:clickable="false"
         android:selectable="false"
diff --git a/packages/SystemUI/res/layout/controls_detail_dialog.xml b/packages/SystemUI/res/layout/controls_detail_dialog.xml
index 34b603f..d1ce10e 100644
--- a/packages/SystemUI/res/layout/controls_detail_dialog.xml
+++ b/packages/SystemUI/res/layout/controls_detail_dialog.xml
@@ -50,41 +50,15 @@
         android:padding="12dp" />
   </LinearLayout>
 
-  <LinearLayout
+  <FrameLayout
+      android:id="@+id/controls_activity_view"
       android:layout_width="match_parent"
-      android:layout_height="wrap_content"
+      android:layout_height="0dp"
+      android:layout_weight="1"
       android:paddingTop="@dimen/controls_activity_view_top_padding"
       android:paddingLeft="@dimen/controls_activity_view_side_padding"
       android:paddingRight="@dimen/controls_activity_view_side_padding"
       android:background="@drawable/rounded_bg_top"
-      android:orientation="vertical">
-    <TextView
-        android:id="@+id/title"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:textAppearance="@style/TextAppearance.ControlDialog"
-        android:clickable="false"
-        android:focusable="false"
-        android:maxLines="1"
-        android:ellipsize="end" />
-    <TextView
-        android:id="@+id/subtitle"
-        android:layout_marginTop="6dp"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:textAppearance="@style/TextAppearance.ControlDialog"
-        android:clickable="false"
-        android:focusable="false"
-        android:maxLines="1"
-        android:ellipsize="end" />
-
-    <FrameLayout
-        android:id="@+id/controls_activity_view"
-        android:layout_width="match_parent"
-        android:layout_height="0dp"
-        android:layout_marginTop="10dp"
-        android:layout_weight="1" />
-
-  </LinearLayout>
+      android:orientation="vertical" />
 </LinearLayout>
 
diff --git a/packages/SystemUI/res/layout/controls_horizontal_divider_withEmpty.xml b/packages/SystemUI/res/layout/controls_horizontal_divider_with_empty.xml
similarity index 100%
rename from packages/SystemUI/res/layout/controls_horizontal_divider_withEmpty.xml
rename to packages/SystemUI/res/layout/controls_horizontal_divider_with_empty.xml
diff --git a/packages/SystemUI/res/layout/controls_management.xml b/packages/SystemUI/res/layout/controls_management.xml
index ae57563..835e54e 100644
--- a/packages/SystemUI/res/layout/controls_management.xml
+++ b/packages/SystemUI/res/layout/controls_management.xml
@@ -17,6 +17,7 @@
 <LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:id="@+id/controls_management_root"
     android:orientation="vertical"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
@@ -25,41 +26,15 @@
     android:paddingStart="@dimen/controls_management_side_padding"
     android:paddingEnd="@dimen/controls_management_side_padding" >
 
-    <LinearLayout
-        android:orientation="horizontal"
+
+    <TextView
+        android:id="@+id/title"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:focusable="false"
-        android:clickable="false"
-        android:gravity="center_vertical">
+        android:textAppearance="?android:attr/textAppearanceLarge"
+        android:textSize="@dimen/controls_title_size"
+        android:textAlignment="center" />
 
-        <FrameLayout
-            android:id="@+id/icon_frame"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:gravity="start|center_vertical"
-            android:minWidth="56dp"
-            android:visibility="gone"
-            android:paddingTop="@dimen/controls_app_icon_frame_top_padding"
-            android:paddingBottom="@dimen/controls_app_icon_frame_bottom_padding"
-            android:paddingEnd="@dimen/controls_app_icon_frame_side_padding"
-            android:paddingStart="@dimen/controls_app_icon_frame_side_padding" >
-
-            <ImageView
-                android:id="@android:id/icon"
-                android:layout_width="@dimen/controls_app_icon_size"
-                android:layout_height="@dimen/controls_app_icon_size" />
-        </FrameLayout>
-
-        <TextView
-            android:id="@+id/title"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:textAppearance="?android:attr/textAppearanceLarge"
-            android:textSize="@dimen/controls_title_size"
-            android:textAlignment="center" />
-
-    </LinearLayout>
 
 
     <TextView
diff --git a/packages/SystemUI/res/layout/global_actions_grid_item_v2.xml b/packages/SystemUI/res/layout/global_actions_grid_item_v2.xml
index 72cc2dd..477ec6a 100644
--- a/packages/SystemUI/res/layout/global_actions_grid_item_v2.xml
+++ b/packages/SystemUI/res/layout/global_actions_grid_item_v2.xml
@@ -28,6 +28,7 @@
     android:paddingRight="@dimen/global_actions_grid_item_side_margin"
     android:layout_marginRight="@dimen/control_base_item_margin"
     android:layout_marginLeft="@dimen/control_base_item_margin"
+    android:stateListAnimator="@anim/control_state_list_animator"
     android:background="@drawable/control_background">
     <LinearLayout
         android:layout_width="@dimen/global_actions_grid_item_width"
diff --git a/packages/SystemUI/res/layout/global_actions_grid_v2.xml b/packages/SystemUI/res/layout/global_actions_grid_v2.xml
index 59c4d01..66f57fd 100644
--- a/packages/SystemUI/res/layout/global_actions_grid_v2.xml
+++ b/packages/SystemUI/res/layout/global_actions_grid_v2.xml
@@ -12,34 +12,45 @@
       android:layout_height="wrap_content"
       android:orientation="horizontal"
       android:theme="@style/qs_theme"
-      android:gravity="top"
       android:clipChildren="false"
       android:clipToPadding="false"
-      android:layout_marginTop="@dimen/global_actions_top_margin"
+      android:layout_marginStart="@dimen/global_actions_side_margin"
   >
     <LinearLayout
         android:id="@android:id/list"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:layout_marginLeft="@dimen/global_actions_side_margin"
-        android:layout_marginRight="@dimen/global_actions_side_margin"
         android:paddingLeft="@dimen/global_actions_grid_horizontal_padding"
         android:paddingRight="@dimen/global_actions_grid_horizontal_padding"
         android:paddingTop="@dimen/global_actions_grid_vertical_padding"
         android:paddingBottom="@dimen/global_actions_grid_vertical_padding"
         android:orientation="horizontal"
-        android:gravity="left"
+        android:gravity="left | center_vertical"
         android:translationZ="@dimen/global_actions_translate"
-    />
+    >
+      <RelativeLayout
+          android:id="@+id/global_actions_overflow_button"
+          android:layout_width="48dp"
+          android:layout_height="48dp"
+      >
+        <ImageView
+            android:src="@drawable/ic_more_vert"
+            android:layout_centerInParent="true"
+            android:layout_width="24dp"
+            android:layout_height="24dp"
+            android:tint="@color/control_more_vert"
+        />
+      </RelativeLayout>
+    </LinearLayout>
   </com.android.systemui.globalactions.GlobalActionsFlatLayout>
 
   <com.android.systemui.globalactions.MinHeightScrollView
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:paddingBottom="@dimen/global_actions_grid_container_shadow_offset"
-    android:layout_marginBottom="@dimen/global_actions_grid_container_negative_shadow_offset"
-    android:orientation="vertical"
+      android:layout_width="match_parent"
+      android:layout_height="match_parent"
+      android:paddingBottom="@dimen/global_actions_grid_container_shadow_offset"
+      android:layout_marginBottom="@dimen/global_actions_grid_container_negative_shadow_offset"
+      android:orientation="vertical"
+      android:scrollbars="none"
   >
     <LinearLayout
         android:id="@+id/global_actions_grid_root"
diff --git a/packages/SystemUI/res/layout/global_screenshot.xml b/packages/SystemUI/res/layout/global_screenshot.xml
index d506e7e..db109fe 100644
--- a/packages/SystemUI/res/layout/global_screenshot.xml
+++ b/packages/SystemUI/res/layout/global_screenshot.xml
@@ -68,6 +68,7 @@
         android:visibility="gone"
         android:contentDescription="@string/screenshot_dismiss_ui_description">
         <ImageView
+            android:id="@+id/global_screenshot_dismiss_image"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             android:layout_margin="@dimen/screenshot_dismiss_button_margin"
diff --git a/packages/SystemUI/res/layout/notification_conversation_info.xml b/packages/SystemUI/res/layout/notification_conversation_info.xml
index 9dc502e..f8a96e7 100644
--- a/packages/SystemUI/res/layout/notification_conversation_info.xml
+++ b/packages/SystemUI/res/layout/notification_conversation_info.xml
@@ -108,7 +108,7 @@
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
                     android:layout_weight="1"
-                    style="@style/TextAppearance.NotificationImportanceChannel"/>
+                    style="@style/TextAppearance.NotificationImportanceChannelGroup"/>
             </LinearLayout>
             <TextView
                 android:id="@+id/delegate_name"
diff --git a/packages/SystemUI/res/layout/notification_info.xml b/packages/SystemUI/res/layout/notification_info.xml
index 5b36382..e8e0133 100644
--- a/packages/SystemUI/res/layout/notification_info.xml
+++ b/packages/SystemUI/res/layout/notification_info.xml
@@ -84,7 +84,7 @@
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
                     android:layout_weight="1"
-                    style="@style/TextAppearance.NotificationImportanceChannel"/>
+                    style="@style/TextAppearance.NotificationImportanceChannelGroup"/>
             </LinearLayout>
             <TextView
                 android:id="@+id/delegate_name"
diff --git a/packages/SystemUI/res/layout/photo_preview_overlay.xml b/packages/SystemUI/res/layout/photo_preview_overlay.xml
new file mode 100644
index 0000000..9210996
--- /dev/null
+++ b/packages/SystemUI/res/layout/photo_preview_overlay.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2020 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+
+<!-- empty stub -->
+<merge />
\ No newline at end of file
diff --git a/packages/SystemUI/res/layout/priority_onboarding_half_shell.xml b/packages/SystemUI/res/layout/priority_onboarding_half_shell.xml
new file mode 100644
index 0000000..ccb4f78
--- /dev/null
+++ b/packages/SystemUI/res/layout/priority_onboarding_half_shell.xml
@@ -0,0 +1,194 @@
+<!--
+  ~ Copyright (C) 2020 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License
+  -->
+
+<FrameLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/onboarding_half_shell_container"
+    android:orientation="vertical"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:layout_gravity="center_horizontal|bottom"
+    android:paddingStart="4dp"
+    android:paddingEnd="4dp"
+    >
+
+    <LinearLayout
+        android:id="@+id/half_shell"
+        android:layout_width="@dimen/qs_panel_width"
+        android:layout_height="wrap_content"
+        android:paddingTop="16dp"
+        android:paddingBottom="16dp"
+        android:paddingStart="16dp"
+        android:paddingEnd="16dp"
+        android:orientation="vertical"
+        android:gravity="bottom"
+        android:layout_gravity="center_horizontal|bottom"
+        android:background="@drawable/rounded_bg_full"
+        >
+
+        <!--  We have a known number of rows that can be shown; just design them all here -->
+        <LinearLayout
+            android:id="@+id/show_at_top_tip"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:padding="4dp"
+            android:orientation="horizontal"
+            >
+            <ImageView
+                android:id="@+id/bell_icon"
+                android:layout_width="24dp"
+                android:layout_height="24dp"
+                android:layout_gravity="center_vertical"
+                android:src="@drawable/ic_notifications_alert"
+                android:tint="?android:attr/colorControlNormal" />
+
+            <TextView
+                android:id="@+id/show_at_top_text"
+                android:layout_width="wrap_content"
+                android:layout_height="48dp"
+                android:paddingStart="16dp"
+                android:paddingEnd="16dp"
+                android:gravity="center_vertical|start"
+                android:textSize="15sp"
+                android:ellipsize="end"
+                android:maxLines="1"
+                android:text="@string/priority_onboarding_show_at_top_text"
+                style="@style/TextAppearance.NotificationInfo"
+                />
+
+        </LinearLayout>
+
+        <LinearLayout
+            android:id="@+id/show_avatar_tip"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:padding="4dp"
+            android:orientation="horizontal"
+            >
+            <ImageView
+                android:id="@+id/avatar_icon"
+                android:layout_width="24dp"
+                android:layout_height="24dp"
+                android:layout_gravity="center_vertical"
+                android:src="@drawable/ic_person"
+                android:tint="?android:attr/colorControlNormal" />
+
+            <TextView
+                android:id="@+id/avatar_text"
+                android:layout_width="wrap_content"
+                android:layout_height="48dp"
+                android:paddingStart="16dp"
+                android:paddingEnd="16dp"
+                android:gravity="center_vertical|start"
+                android:textSize="15sp"
+                android:ellipsize="end"
+                android:maxLines="1"
+                android:text="@string/priority_onboarding_show_avatar_text"
+                style="@style/TextAppearance.NotificationInfo"
+                />
+
+        </LinearLayout>
+
+        <!-- These rows show optionally -->
+
+        <LinearLayout
+            android:id="@+id/floating_bubble_tip"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:padding="4dp"
+            android:orientation="horizontal"
+            >
+
+            <ImageView
+                android:id="@+id/bubble_icon"
+                android:layout_width="24dp"
+                android:layout_height="24dp"
+                android:layout_gravity="center_vertical"
+                android:src="@drawable/ic_create_bubble"
+                android:tint="?android:attr/colorControlNormal" />
+
+            <TextView
+                android:id="@+id/bubble_text"
+                android:layout_width="wrap_content"
+                android:layout_height="48dp"
+                android:paddingStart="16dp"
+                android:paddingEnd="16dp"
+                android:gravity="center_vertical|start"
+                android:textSize="15sp"
+                android:ellipsize="end"
+                android:maxLines="1"
+                android:text="@string/priority_onboarding_appear_as_bubble_text"
+                style="@style/TextAppearance.NotificationInfo"
+                />
+
+        </LinearLayout>
+
+        <LinearLayout
+            android:id="@+id/ignore_dnd_tip"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:padding="4dp"
+            android:orientation="horizontal"
+            >
+
+            <ImageView
+                android:id="@+id/dnd_icon"
+                android:layout_width="24dp"
+                android:layout_height="24dp"
+                android:layout_gravity="center_vertical"
+                android:src="@drawable/moon"
+                android:tint="?android:attr/colorControlNormal" />
+
+            <TextView
+                android:id="@+id/dnd_text"
+                android:layout_width="wrap_content"
+                android:layout_height="48dp"
+                android:paddingStart="16dp"
+                android:paddingEnd="16dp"
+                android:gravity="center_vertical|start"
+                android:textSize="15sp"
+                android:ellipsize="end"
+                android:maxLines="1"
+                android:text="@string/priority_onboarding_ignores_dnd_text"
+                style="@style/TextAppearance.NotificationInfo"
+                />
+
+        </LinearLayout>
+
+        <!-- Bottom button container -->
+        <RelativeLayout
+            android:id="@+id/button_container"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:padding="4dp"
+            android:orientation="horizontal"
+            >
+            <TextView
+                android:id="@+id/done_button"
+                android:text="@string/priority_onboarding_done_button_title"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_alignParentEnd="true"
+                android:gravity="end|center_vertical"
+                android:minWidth="@dimen/notification_importance_toggle_size"
+                android:minHeight="@dimen/notification_importance_toggle_size"
+                android:maxWidth="125dp"
+                style="@style/TextAppearance.NotificationInfo.Button"/>
+
+        </RelativeLayout>
+
+    </LinearLayout>
+</FrameLayout>
diff --git a/packages/SystemUI/res/layout/status_bar_expanded.xml b/packages/SystemUI/res/layout/status_bar_expanded.xml
index 115b4a8..1d4b982 100644
--- a/packages/SystemUI/res/layout/status_bar_expanded.xml
+++ b/packages/SystemUI/res/layout/status_bar_expanded.xml
@@ -66,6 +66,8 @@
         <include layout="@layout/ambient_indication"
             android:id="@+id/ambient_indication_container" />
 
+        <include layout="@layout/photo_preview_overlay" />
+
         <ViewStub
             android:id="@+id/keyguard_user_switcher"
             android:layout="@layout/keyguard_user_switcher"
diff --git a/packages/SystemUI/res/raw/image_wallpaper_fragment_shader.glsl b/packages/SystemUI/res/raw/image_wallpaper_fragment_shader.glsl
index 716e127..e4b6e07 100644
--- a/packages/SystemUI/res/raw/image_wallpaper_fragment_shader.glsl
+++ b/packages/SystemUI/res/raw/image_wallpaper_fragment_shader.glsl
@@ -3,74 +3,9 @@
 // The actual wallpaper texture.
 uniform sampler2D uTexture;
 
-// The 85th percenile for the luminance histogram of the image (a value between 0 and 1).
-// This value represents the point in histogram that includes 85% of the pixels of the image.
-uniform float uPer85;
-
-// Reveal is the animation value that goes from 1 (the image is hidden) to 0 (the image is visible).
-uniform float uReveal;
-
-// The opacity of locked screen (constant value).
-uniform float uAod2Opacity;
 varying vec2 vTextureCoordinates;
 
-/*
- * Calculates the relative luminance of the pixel.
- */
-vec3 luminosity(vec3 color) {
-    float lum = 0.2126 * color.r + 0.7152 * color.g + 0.0722 * color.b;
-    return vec3(lum);
-}
-
-vec4 transform(vec3 diffuse) {
-    // Getting the luminance for this pixel
-    vec3 lum = luminosity(diffuse);
-
-    /*
-     * while the reveal > per85, it shows the luminance image (B&W image)
-     * then when moving passed that value, the image gets colored.
-     */
-    float trans = smoothstep(0., uPer85, uReveal);
-    diffuse = mix(diffuse, lum, trans);
-
-    // 'lower' value represents the capped 'reveal' value to the range [0, per85]
-    float selector = step(uPer85, uReveal);
-    float lower = mix(uReveal, uPer85, selector);
-
-    /*
-     * Remaps image:
-     * - from reveal=1 to reveal=per85 => lower=per85, diffuse=luminance
-     *   That means that remaps black and white image pixel
-     *   from a possible values of [0,1] to [per85, 1] (if the pixel is darker than per85,
-     *   it's gonna be black, if it's between per85 and 1, it's gonna be gray
-     *   and if it's 1 it's gonna be white).
-     * - from reveal=per85 to reveal=0 => lower=reveal, 'diffuse' changes from luminance to color
-     *   That means that remaps each image pixel color (rgb)
-     *   from a possible values of [0,1] to [lower, 1] (if the pixel color is darker than 'lower',
-     *   it's gonna be 0, if it's between 'lower' and 1, it's gonna be remap to a value
-     *   between 0 and 1 and if it's 1 it's gonna be 1).
-     * - if reveal=0 => lower=0, diffuse=color image
-     *   The image is shown as it is, colored.
-     */
-    vec3 remaps = smoothstep(lower, 1., diffuse);
-
-    // Interpolate between diffuse and remaps using reveal to avoid over saturation.
-    diffuse = mix(diffuse, remaps, uReveal);
-
-    /*
-     * Fades in the pixel value:
-     * - if reveal=1 => fadeInOpacity=0
-     * - from reveal=1 to reveal=per85 => 0<=fadeInOpacity<=1
-     * - if reveal>per85 => fadeInOpacity=1
-     */
-    float fadeInOpacity = 1. - smoothstep(uPer85, 1., uReveal);
-    diffuse *= uAod2Opacity * fadeInOpacity;
-
-    return vec4(diffuse.r, diffuse.g, diffuse.b, 1.);
-}
-
 void main() {
     // gets the pixel value of the wallpaper for this uv coordinates on screen.
-    vec4 fragColor = texture2D(uTexture, vTextureCoordinates);
-    gl_FragColor = transform(fragColor.rgb);
+    gl_FragColor = texture2D(uTexture, vTextureCoordinates);
 }
\ No newline at end of file
diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml
index efa2879..1008d2b 100644
--- a/packages/SystemUI/res/values-af/strings.xml
+++ b/packages/SystemUI/res/values-af/strings.xml
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"Kan weens beperkte bergingspasie nie skermkiekie stoor nie"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Die program of jou organisasie laat nie toe dat skermkiekies geneem word nie"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Maak skermkiekie toe"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"Maak skermkiekie oop"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"Skermkiekievoorskou"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"Skermopnemer"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Deurlopende kennisgewing vir \'n skermopnamesessie"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"Begin opname?"</string>
@@ -418,7 +418,7 @@
     <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4063448287758262485">"Tot sonsopkoms"</string>
     <string name="quick_settings_night_secondary_label_on_at" msgid="3584738542293528235">"Aan om <xliff:g id="TIME">%s</xliff:g>"</string>
     <string name="quick_settings_secondary_label_until" msgid="1883981263191927372">"Tot <xliff:g id="TIME">%s</xliff:g>"</string>
-    <string name="quick_settings_ui_mode_night_label" msgid="1398928270610780470">"Donker-tema"</string>
+    <string name="quick_settings_ui_mode_night_label" msgid="1398928270610780470">"Donkertema"</string>
     <string name="quick_settings_dark_mode_secondary_label_battery_saver" msgid="4990712734503013251">"Batterybespaarder"</string>
     <string name="quick_settings_dark_mode_secondary_label_on_at_sunset" msgid="6017379738102015710">"Aan met sonsondergang"</string>
     <string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"Tot sonsopkoms"</string>
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"Borrel"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"Help jou om te fokus sonder klank of vibrasie."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"Kry jou aandag met klank of vibrasie."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"Trek jou aandag met klank of vibrasie. Gesprekke van <xliff:g id="APP_NAME">%1$s</xliff:g> af verskyn by verstek in \'n borrel."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Hou jou aandag met \'n swewende kortpad na hierdie inhoud toe."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Verskyn boaan die gespreksafdeling en lyk soos \'n borrel."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"Alle gesprekke van <xliff:g id="APP_NAME_0">%1$s</xliff:g> af sal by verstek borrels word. Bestuur in <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Instellings"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioriteit"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Geen onlangse borrels nie"</string>
@@ -999,9 +999,16 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Beheer borrels enige tyd"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Tik op Bestuur om borrels vanaf hierdie program af te skakel"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Het dit"</string>
+    <!-- no translation found for bubbles_app_settings (5779443644062348657) -->
+    <skip />
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Stelselnavigasie is opgedateer. Gaan na Instellings toe om veranderinge te maak."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Gaan na Instellings toe om stelselnavigasie op te dateer"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Bystandmodus"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Wys boaan gespreksafdeling"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Wys profielprent op slotskerm"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Verskyn as \'n swewende borrel bo-oor programme"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Onderbreek Moenie Steur Nie"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Het dit"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"Vergrotingoorleggervenster"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"Vergrotingvenster"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"Vergrotingvensterkontroles"</string>
@@ -1016,10 +1023,8 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"Kontroles"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Kies kontroles om toegang vanaf die aan/af-kieslys te kry"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Hou en sleep om kontroles te herrangskik"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"Alle kontroles is verwyder"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"Die lys met alle kontroles kon nie gelaai word nie."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Ander"</string>
     <string name="controls_dialog_title" msgid="2343565267424406202">"Voeg by toestelkontroles"</string>
diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml
index 96934b1..7e2ec10 100644
--- a/packages/SystemUI/res/values-am/strings.xml
+++ b/packages/SystemUI/res/values-am/strings.xml
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"ባለው ውሱን የማከማቻ ቦታ ምክንያት ቅጽበታዊ ገጽ ዕይታን ማስቀመጥ አይችልም"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"ቅጽበታዊ ገጽ እይታዎችን ማንሳት በመተግበሪያው ወይም በእርስዎ ድርጅት አይፈቀድም"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"ቅጽበታዊ ገጽ እይታን አሰናብት"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"ቅጽበታዊ ገጽ እይታን ክፈት"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"የቅጽበታዊ ገጽ ዕይታ ቅድመ-ዕይታ"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"የማያ መቅጃ"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"ለአንድ የማያ ገጽ ቀረጻ ክፍለ-ጊዜ በመካሄድ ያለ ማሳወቂያ"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"መቅረጽ ይጀመር?"</string>
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"አረፋ"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"ያለ ድምፅ ወይም ንዝረት እርስዎ ትኩረት እንዲያደርጉ ያግዛል።"</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"ከድምፅ ወይም ንዝረት ጋር የእርስዎን ትኩረት ይስባል።"</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"በድምጽ ወይም ንዝረት የእርስዎን ትኩረት ይስባል። የ<xliff:g id="APP_NAME">%1$s</xliff:g> አረፋ ውይይቶች በነባሪነት።"</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"ለዚህ ይዞታ ከተንሳፋፊ አቋራጭ ጋር የእርስዎን ትኩረት ያቆያል።"</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"በውይይት ክፍል አናት ላይ ይታያል እና እንደ አረፋ ብቅ ይላል"</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"በነባሪነት ከ<xliff:g id="APP_NAME_0">%1$s</xliff:g> አረፋ ሁሉም ውይይቶች። በ<xliff:g id="APP_NAME_1">%2$s</xliff:g> ውስጥ ያቀናብሩ።"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ቅንብሮች"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"ቅድሚያ"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"ምንም የቅርብ ጊዜ አረፋዎች የሉም"</string>
@@ -999,9 +999,16 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"በማንኛውም ጊዜ አረፋዎችን ይቆጣጠሩ"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"የዚህ መተግበሪያ አረፋዎችን ለማጥፋት አቀናብርን መታ ያድርጉ"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"ገባኝ"</string>
+    <!-- no translation found for bubbles_app_settings (5779443644062348657) -->
+    <skip />
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"የስርዓት ዳሰሳ ተዘምኗል። ለውጦችን ለማድረግ ወደ ቅንብሮች ይሂዱ።"</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"የስርዓት ዳሰሳን ለማዘመን ወደ ቅንብሮች ይሂዱ"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"ተጠባባቂ"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"በውይይት ክፍል አናት ላይ አአሳይ"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"የመገለጫ ስዕልን በማያ ገጽ ቁልፍ ላይ አሳይ"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"በመተግበሪያዎች ላይ እንደ ተንሳፋፊ አረፋ ሆኖ ይታያሉ"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"አትረብሽን አቋርጥ"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"ገባኝ"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"የማጉያ ንብርብር መስኮት"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"የማጉያ መስኮት"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"የማጉያ መስኮት መቆጣጠሪያዎች"</string>
@@ -1016,10 +1023,8 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"መቆጣጠሪያዎች"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"ከኃይል ምናሌ ላይ ለመድረስ መቆጣጠሪያዎችን ይምረጡ"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"መቆጣጠሪያዎችን ዳግም ለማስተካከል ይያዙ እና ይጎትቱ"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"ሁሉም መቆጣጠሪያዎች ተወግደዋል"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"የሁሉም መቆጣጠሪያዎች ዝርዝር ሊጫን አልተቻለም።"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"ሌላ"</string>
     <string name="controls_dialog_title" msgid="2343565267424406202">"ወደ የመሣሪያ መቆጣጠሪያዎች ያክሉ"</string>
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index de8a07b..0ada0dc 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"يتعذر حفظ لقطة الشاشة لأن مساحة التخزين المتاحة محدودة."</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"يحظر التطبيق أو تحظر مؤسستك التقاط لقطات شاشة"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"إغلاق لقطة الشاشة"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"فتح لقطة الشاشة"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"معاينة لقطة الشاشة"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"مسجّل الشاشة"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"إشعار مستمر لجلسة تسجيل شاشة"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"هل تريد بدء التسجيل؟"</string>
@@ -296,8 +296,8 @@
     <string name="accessibility_quick_settings_flashlight_on" msgid="3785616827729850766">"تفعيل الفلاش."</string>
     <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"تم إيقاف الفلاش."</string>
     <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"تم تفعيل الفلاش."</string>
-    <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"تم إيقاف انعكاس اللون."</string>
-    <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"تم تفعيل انعكاس اللون."</string>
+    <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"تم إيقاف \"قلب الألوان\"."</string>
+    <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"تم تفعيل \"قلب الألوان\"."</string>
     <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"تم إيقاف نقطة اتصال الجوّال."</string>
     <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"تم تفعيل نقطة اتصال الجوّال."</string>
     <string name="accessibility_casting_turned_off" msgid="1387906158563374962">"توقف إرسال الشاشة."</string>
@@ -432,7 +432,7 @@
     <string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"حتى شروق الشمس"</string>
     <string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"تفعيل الوضع في <xliff:g id="TIME">%s</xliff:g>"</string>
     <string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"حتى <xliff:g id="TIME">%s</xliff:g>"</string>
-    <string name="quick_settings_nfc_label" msgid="1054317416221168085">"‏الاتصالات قصيرة المدى (NFC)"</string>
+    <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
     <string name="quick_settings_nfc_off" msgid="3465000058515424663">"تم إيقاف الاتصال القريب المدى"</string>
     <string name="quick_settings_nfc_on" msgid="1004976611203202230">"تم تفعيل الاتصال القريب المدى"</string>
     <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"تسجيل الشاشة"</string>
@@ -719,9 +719,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"فقاعة"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"يساعدك هذا الإشعار على التركيز بدون صوت أو اهتزاز."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"يلفت هذا الإشعار انتباهك باستخدام الصوت والاهتزاز."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"يلفت هذا الإشعار انتباهك باستخدام الصوت والاهتزاز. تظهر المحادثات من <xliff:g id="APP_NAME">%1$s</xliff:g> كفقاعات تلقائيًا."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"يلفِت هذا الإشعار انتباهك لهذا المحتوى باستخدام اختصار عائم."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"تظهر كفقاعة محادثة في أعلى قسم المحادثات"</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"تظهر كل المحادثات من تطبيق <xliff:g id="APP_NAME_0">%1$s</xliff:g> كفقاعات محادثات تلقائيًا. يمكنك إدارة هذا الإعداد في <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"الإعدادات"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"الأولوية"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"ليس هناك فقاعات محادثات"</string>
@@ -982,7 +982,7 @@
     <string name="running_foreground_services_title" msgid="5137313173431186685">"التطبيقات التي تعمل في الخلفية"</string>
     <string name="running_foreground_services_msg" msgid="3009459259222695385">"انقر للحصول على تفاصيل حول البطارية واستخدام البيانات"</string>
     <string name="mobile_data_disable_title" msgid="5366476131671617790">"هل تريد إيقاف بيانات الجوّال؟"</string>
-    <string name="mobile_data_disable_message" msgid="8604966027899770415">"‏لن تتمكّن من الدخول إلى البيانات أو الإنترنت من خلال <xliff:g id="CARRIER">%s</xliff:g>. ولن يتوفر اتصال الإنترنت إلا عبر Wi-Fi."</string>
+    <string name="mobile_data_disable_message" msgid="8604966027899770415">"‏لن تتمكّن من استخدام البيانات أو الإنترنت من خلال <xliff:g id="CARRIER">%s</xliff:g>. ولن يتوفر اتصال الإنترنت إلا عبر Wi-Fi."</string>
     <string name="mobile_data_disable_message_default_carrier" msgid="6496033312431658238">"مشغّل شبكة الجوّال"</string>
     <string name="touch_filtered_warning" msgid="8119511393338714836">"لا يمكن للإعدادات التحقق من ردك لأن هناك تطبيقًا يحجب طلب الإذن."</string>
     <string name="slice_permission_title" msgid="3262615140094151017">"هل تريد السماح لتطبيق <xliff:g id="APP_0">%1$s</xliff:g> بعرض شرائح <xliff:g id="APP_2">%2$s</xliff:g>؟"</string>
@@ -1019,15 +1019,22 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"التحكّم في فقاعات المحادثات في أي وقت"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"انقر على \"إدارة\" لإيقاف فقاعات المحادثات من هذا التطبيق."</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"حسنًا"</string>
+    <!-- no translation found for bubbles_app_settings (5779443644062348657) -->
+    <skip />
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"تم تحديث التنقل داخل النظام. لإجراء التغييرات، يُرجى الانتقال إلى \"الإعدادات\"."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"الانتقال إلى \"الإعدادات\" لتعديل التنقل داخل النظام"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"وضع الاستعداد"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"تظهر في أعلى قسم المحادثات"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"إظهار صورة الملف الشخصي على شاشة القفل"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"تظهر كفقاعة عائمة فوق التطبيقات"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"مقاطعة ميزة \"عدم الإزعاج\""</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"حسنًا"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"نافذة تراكب التكبير"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"نافذة التكبير"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"عناصر التحكم في نافذة التكبير"</string>
-    <string name="quick_controls_title" msgid="6839108006171302273">"عناصر التحكم في الأجهزة"</string>
+    <string name="quick_controls_title" msgid="6839108006171302273">"أدوات التحكم بالجهاز"</string>
     <string name="quick_controls_subtitle" msgid="1667408093326318053">"إضافة عناصر تحكّم لأجهزتك المتصلة"</string>
-    <string name="quick_controls_setup_title" msgid="8901436655997849822">"إعداد عناصر التحكم في الأجهزة"</string>
+    <string name="quick_controls_setup_title" msgid="8901436655997849822">"إعداد أدوات التحكم بالجهاز"</string>
     <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"اضغط مع الاستمرار على زر التشغيل للوصول إلى عناصر التحكّم"</string>
     <string name="controls_providers_title" msgid="6879775889857085056">"اختيار تطبيق لإضافة عناصر التحكّم"</string>
     <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380">
@@ -1040,13 +1047,11 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"عناصر التحكّم"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"اختيار عناصر التحكّم التي تريد الوصول إليها من قائمة التشغيل"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"اضغط مع الاستمرار واسحب لإعادة ترتيب عناصر التحكّم."</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"تمت إزالة كل عناصر التحكّم."</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"تعذّر تحميل قائمة كل عناصر التحكّم."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"غير ذلك"</string>
-    <string name="controls_dialog_title" msgid="2343565267424406202">"إضافة إلى عناصر التحكم في الأجهزة"</string>
+    <string name="controls_dialog_title" msgid="2343565267424406202">"إضافة إلى أدوات التحكم بالجهاز"</string>
     <string name="controls_dialog_ok" msgid="7011816381344485651">"إضافة إلى الإعدادات المفضّلة"</string>
     <string name="controls_dialog_message" msgid="6292099631702047540">"اقترح تطبيق <xliff:g id="APP">%s</xliff:g> إضافة عنصر التحكّم هذا إلى الإعدادات المفضّلة."</string>
     <string name="controls_dialog_confirmation" msgid="586517302736263447">"تم تعديل عناصر التحكّم."</string>
diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml
index f32757c..99cc25d 100644
--- a/packages/SystemUI/res/values-as/strings.xml
+++ b/packages/SystemUI/res/values-as/strings.xml
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"সঞ্চয়াগাৰত সীমিত খালী ঠাই থকাৰ বাবে স্ক্ৰীণশ্বট ছেভ কৰিব পৰা নগ\'ল"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"এপটোৱে বা আপোনাৰ প্ৰতিষ্ঠানে স্ক্ৰীণশ্বট ল\'বলৈ অনুমতি নিদিয়ে"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"স্ক্ৰীনশ্বট অগ্ৰাহ্য কৰক"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"স্ক্ৰীনশ্বট খোলক"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"স্ক্ৰীনশ্বটৰ পূৰ্বদৰ্শন"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"স্ক্ৰীন ৰেকৰ্ডাৰ"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"স্ক্রীণ ৰেকৰ্ডিং ছেশ্বন চলি থকা সময়ত পোৱা জাননী"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"ৰেকৰ্ড কৰা আৰম্ভ কৰিবনে?"</string>
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"বাবল"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"কোনো ধ্বনি অথবা কম্পন অবিহনে আপোনাক মনোযোগ দিয়াত সহায় কৰে।"</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"ধ্বনি অথবা কম্পনৰ জৰিয়তে আপোনাৰ মনোযোগ আকৰ্ষণ কৰে।"</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"ধ্বনি অথবা কম্পনৰ জৰিয়তে আপোনাৰ মনোযোগ আকৰ্ষণ কৰে। <xliff:g id="APP_NAME">%1$s</xliff:g>ৰ বাৰ্তালাপ ডিফ’ল্ট হিচাপে বাবল হয়।"</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"উপঙি থকা এটা শ্বৰ্টকাটৰ জৰিয়তে এই সমলখিনিৰ প্ৰতি আপোনাক মনোযোগী কৰি ৰাখে।"</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"বাৰ্তালাপ শাখাটোৰ শীৰ্ষত দেখুৱায় আৰু এটা বাবল হিচাপে প্ৰদর্শন হয়।"</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"<xliff:g id="APP_NAME_0">%1$s</xliff:g>ৰ সকলো বাৰ্তালাপ ডিফ’ল্ট হিচাপে বাবল হয়। <xliff:g id="APP_NAME_1">%2$s</xliff:g>ত পৰিচালনা কৰক।"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ছেটিংসমূহ"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"অগ্ৰাধিকাৰ"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"কোনো শেহতীয়া bubbles নাই"</string>
@@ -999,9 +999,21 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"যিকোনো সময়তে bubbles নিয়ন্ত্ৰণ কৰক"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"এই এপ্‌টোৰ পৰা bubbles অফ কৰিবলৈ পৰিচালনা কৰকত টিপক"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"বুজি পালোঁ"</string>
+    <!-- no translation found for bubbles_app_settings (5779443644062348657) -->
+    <skip />
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"ছিষ্টেম নেভিগেশ্বন আপডে’ট কৰা হ’ল। সলনি কৰিবলৈ ছেটিংসমূহ-লৈ যাওক।"</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"ছিষ্টেম নেভিগেশ্বন আপডে’ট কৰিবলৈ ছেটিংসমূহ-লৈ যাওক"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"ষ্টেণ্ডবাই"</string>
+    <!-- no translation found for priority_onboarding_show_at_top_text (1678400241025513541) -->
+    <skip />
+    <!-- no translation found for priority_onboarding_show_avatar_text (5756291381124091508) -->
+    <skip />
+    <!-- no translation found for priority_onboarding_appear_as_bubble_text (4227039772250263122) -->
+    <skip />
+    <!-- no translation found for priority_onboarding_ignores_dnd_text (2918952762719600529) -->
+    <skip />
+    <!-- no translation found for priority_onboarding_done_button_title (4569550984286506007) -->
+    <skip />
     <string name="magnification_overlay_title" msgid="6584179429612427958">"বিবৰ্ধন অ’ভাৰলে’ৰ ৱিণ্ড’"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"বিবৰ্ধন ৱিণ্ড’"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"বিবৰ্ধন ৱিণ্ড’ৰ নিয়ন্ত্ৰণসমূহ"</string>
@@ -1016,10 +1028,8 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"নিয়ন্ত্ৰণসমূহ"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"পাৱাৰ মেনুখনৰ পৰা এক্সেছ পাবলৈ নিয়ন্ত্ৰণসমূহ বাছনি কৰক"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"নিয়ন্ত্ৰণসমূহ পুনৰ সজাবলৈ ধৰি ৰাখক আৰু টানি আনি এৰক"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"সকলো নিয়ন্ত্ৰণ আঁতৰোৱা হৈছে"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"নিয়ন্ত্ৰণসমূহৰ সম্পূর্ণ সূচীখন ল’ড কৰিব পৰা নগ’ল।"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"অন্য"</string>
     <string name="controls_dialog_title" msgid="2343565267424406202">"ডিভাইচৰ নিয়ন্ত্ৰণসমূহত যোগ দিয়ক"</string>
diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml
index b06a8ea..bbb51e1 100644
--- a/packages/SystemUI/res/values-az/strings.xml
+++ b/packages/SystemUI/res/values-az/strings.xml
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"Yaddaş ehtiyatının az olması səbəbindən skrinşotu yadda saxlamaq olmur"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Skrinşot çəkməyə tətbiq və ya təşkilat tərəfindən icazə verilmir"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Ekran şəklini ötürün"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"Ekran şəklini açın"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"Ekran şəklinə önbaxış"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"Ekran Yazıcısı"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Ekranın video çəkimi ərzində silinməyən bildiriş"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"Yazmağa başlanılsın?"</string>
@@ -500,7 +500,7 @@
     <string name="battery_saver_notification_text" msgid="2617841636449016951">"Performansı azaldır və arxa fon datasını məhdudlaşdırır"</string>
     <string name="battery_saver_notification_action_text" msgid="6022091913807026887">"Batareya Qənaətini deaktiv edin"</string>
     <string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> tətbiqinin yazma və ya yayım zamanı ekranda görünən və ya cihazdan oxudulan bütün məlumatlara girişi olacaq. Bura parollar, ödəniş detalları, fotolar, mesajlar və oxudulan audio kimi məlumatlar daxildir."</string>
-    <string name="media_projection_dialog_service_text" msgid="958000992162214611">"Bu funksiyanı təmin edən xidmətin yazma və ya yayım zamanı ekranda görünən və ya cihazdan oxudulan bütün məlumatlara girişi olacaq. Bura parollar, ödəniş detalları, fotolar, mesajlar və oxudulan audio kimi məlumatlar daxildir."</string>
+    <string name="media_projection_dialog_service_text" msgid="958000992162214611">"Bu funksiyanı təmin edən xidmətin yazma və ya yayım zamanı ekranda görünən və ya cihazdan oxudulan bütün bilgilərə girişi olacaq. Buraya parollar, ödəniş detalları, fotolar, mesajlar və oxudulan audio kimi məlumatlar daxildir."</string>
     <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"Yazma və ya yayımlama başladılsın?"</string>
     <string name="media_projection_dialog_title" msgid="3316063622495360646">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ilə yazma və ya yayımlama başladılsın?"</string>
     <string name="media_projection_remember_text" msgid="6896767327140422951">"Daha göstərmə"</string>
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"Qabarcıq"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"Səs və ya vibrasiya olmadan fokuslanmağınıza kömək edir."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"Səs və ya vibrasiya ilə diqqətinizi çəkir."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"Səs və ya vibrasiya ilə diqqətinizi çəkir. <xliff:g id="APP_NAME">%1$s</xliff:g> tətbiqindən söhbətlərdə defolt olaraq qabarcıq çıxır."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Bu məzmuna üzən qısayol ilə diqqətinizi cəlb edir."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Söhbət bölməsinin yuxarısında göstərilir və yumrucuq kimi görünür."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"Defolt olaraq, <xliff:g id="APP_NAME_0">%1$s</xliff:g> tətbiqindən gələn söhbətlər yumrucuq şəklində göstərilir. <xliff:g id="APP_NAME_1">%2$s</xliff:g> tətbiqində idarə edin."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Ayarlar"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioritet"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Yumrucuqlar yoxdur"</string>
@@ -848,7 +848,7 @@
     <string name="left_icon" msgid="5036278531966897006">"Sol ikona"</string>
     <string name="right_icon" msgid="1103955040645237425">"Sağ ikona"</string>
     <string name="drag_to_add_tiles" msgid="8933270127508303672">"Mozaika əlavə etmək üçün basıb saxlayaraq çəkin"</string>
-    <string name="drag_to_rearrange_tiles" msgid="2143204300089638620">"Mozaikaları yenidən təşkil etmək üçün basıb saxlayın və çəkin"</string>
+    <string name="drag_to_rearrange_tiles" msgid="2143204300089638620">"İkonları yenidən düzənləmək üçün saxlayaraq dartın"</string>
     <string name="drag_to_remove_tiles" msgid="4682194717573850385">"Silmək üçün bura sürüşdürün"</string>
     <string name="drag_to_remove_disabled" msgid="933046987838658850">"Minimum <xliff:g id="MIN_NUM_TILES">%1$d</xliff:g> mozaika lazımdır"</string>
     <string name="qs_edit" msgid="5583565172803472437">"Redaktə edin"</string>
@@ -945,7 +945,7 @@
     <string name="instant_apps_title" msgid="8942706782103036910">"<xliff:g id="APP">%1$s</xliff:g> işləyir"</string>
     <string name="instant_apps_message" msgid="6112428971833011754">"Quraşdırılmadan açılan tətbiq."</string>
     <string name="instant_apps_message_with_help" msgid="1816952263531203932">"Quraşdırılmadan açılan tətbiq. Ətraflı məlumat üçün klikləyin."</string>
-    <string name="app_info" msgid="5153758994129963243">"Tətbiq haqqında"</string>
+    <string name="app_info" msgid="5153758994129963243">"Tətbiq infosu"</string>
     <string name="go_to_web" msgid="636673528981366511">"Brauzerə daxil edin"</string>
     <string name="mobile_data" msgid="4564407557775397216">"Mobil data"</string>
     <string name="mobile_data_text_format" msgid="6806501540022589786">"<xliff:g id="ID_1">%1$s</xliff:g> — <xliff:g id="ID_2">%2$s</xliff:g>"</string>
@@ -999,15 +999,22 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Yumrucuqları istənilən vaxt idarə edin"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Bu tətbiqdə yumrucuqları deaktiv etmək üçün \"İdarə edin\" seçiminə toxunun"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Anladım"</string>
+    <!-- no translation found for bubbles_app_settings (5779443644062348657) -->
+    <skip />
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Sistem naviqasiyası yeniləndi. Dəyişiklik etmək üçün Ayarlara daxil olun."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Sistem naviqasiyasını yeniləmək üçün Ayarlara keçin"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Gözləmə rejimi"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Söhbət bölməsinin yuxarısında göstərilir"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Kilid ekranında profil şəkli göstərilir"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Tətbiqlərin üzərində üzən qabarcıq kimi görünəcək"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Narahat Etməyin rejimi bölünsün"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Anladım"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"Böyütmə Üst-üstə Düşən Pəncərəsi"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"Böyütmə Pəncərəsi"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"Böyütmə Pəncərəsi Kontrolları"</string>
-    <string name="quick_controls_title" msgid="6839108006171302273">"Cihaz nizamlayıcıları"</string>
+    <string name="quick_controls_title" msgid="6839108006171302273">"Cihaz idarəetmələri"</string>
     <string name="quick_controls_subtitle" msgid="1667408093326318053">"Qoşulmuş cihazlarınız üçün nizamlayıcılar əlavə edin"</string>
-    <string name="quick_controls_setup_title" msgid="8901436655997849822">"Cihaz nizamlayıcılarını ayarlayın"</string>
+    <string name="quick_controls_setup_title" msgid="8901436655997849822">"Cihaz idarəetmələrini ayarlayın"</string>
     <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"Nizamlayıcılara giriş üçün Yandırıb-söndürmə düyməsini basıb saxlayın"</string>
     <string name="controls_providers_title" msgid="6879775889857085056">"Nizamlayıcıları əlavə etmək üçün tətbiq seçin"</string>
     <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380">
@@ -1016,13 +1023,11 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"Nizamlayıcılar"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Enerji menyusundan daxil olacağınız nizamlayıcıları seçin"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Nizamlayıcıları yenidən tənzimləmək üçün tutub sürüşdürün"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"Bütün nizamlayıcılar silindi"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"Bütün nizamlayıcıların siyahısı yüklənmədi."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Digər"</string>
-    <string name="controls_dialog_title" msgid="2343565267424406202">"Cihaz nizamlayıcılarına əlavə edin"</string>
+    <string name="controls_dialog_title" msgid="2343565267424406202">"Cihaz idarəetmələrinə əlavə edin"</string>
     <string name="controls_dialog_ok" msgid="7011816381344485651">"Sevimlilərə əlavə edin"</string>
     <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> sevimlilərə əlavə etmək üçün bu nizamlayıcını təklif edib."</string>
     <string name="controls_dialog_confirmation" msgid="586517302736263447">"Nizamlayıcılar güncəlləndi"</string>
diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
index 702c8990..cef3cce 100644
--- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml
+++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
@@ -33,7 +33,7 @@
     <string name="invalid_charger_title" msgid="938685362320735167">"Punjenje preko USB-a nije uspelo"</string>
     <string name="invalid_charger_text" msgid="2339310107232691577">"Koristite punjač koji ste dobili uz uređaj"</string>
     <string name="battery_low_why" msgid="2056750982959359863">"Podešavanja"</string>
-    <string name="battery_saver_confirmation_title" msgid="1234998463717398453">"Želite li da uključite Uštedu baterije?"</string>
+    <string name="battery_saver_confirmation_title" msgid="1234998463717398453">"Želite da uključite Uštedu baterije?"</string>
     <string name="battery_saver_confirmation_title_generic" msgid="2299231884234959849">"O Uštedi baterije"</string>
     <string name="battery_saver_confirmation_ok" msgid="5042136476802816494">"Uključi"</string>
     <string name="battery_saver_start_action" msgid="4553256017945469937">"Uključi Uštedu baterije"</string>
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"Čuvanje snimka ekrana nije uspelo zbog ograničenog memorijskog prostora"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Aplikacija ili organizacija ne dozvoljavaju pravljenje snimaka ekrana"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Odbacite snimak ekrana"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"Otvorite snimak ekrana"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"Pregled snimka ekrana"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"Snimač ekrana"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Obaveštenje o sesiji snimanja ekrana je aktivno"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"Želite da započnete snimanje?"</string>
@@ -710,9 +710,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"Oblačić"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"Pomaže vam da se koncentrišete bez zvuka ili vibracije."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"Privlači vam pažnju pomoću zvuka ili vibracije."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"Privlači vam pažnju pomoću zvuka ili vibriranja. Konverzacije iz aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g> se podrazumevano prikazuju u oblačićima."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Privlači vam pažnju pomoću plutajuće prečice do ovog sadržaja."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Prikazuje se u vrhu odeljka konverzacije i kao oblačić."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"Sve konverzacije iz aplikacije <xliff:g id="APP_NAME_0">%1$s</xliff:g> se podrazumevano prikazuju u oblačićima. Upravljajte u aplikaciji <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Podešavanja"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioritet"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Nema nedavnih oblačića"</string>
@@ -966,7 +966,7 @@
     <string name="qs_dnd_replace" msgid="7712119051407052689">"Zameni"</string>
     <string name="running_foreground_services_title" msgid="5137313173431186685">"Aplikacije pokrenute u pozadini"</string>
     <string name="running_foreground_services_msg" msgid="3009459259222695385">"Dodirnite za detalje o bateriji i potrošnji podataka"</string>
-    <string name="mobile_data_disable_title" msgid="5366476131671617790">"Želite li da isključite mobilne podatke?"</string>
+    <string name="mobile_data_disable_title" msgid="5366476131671617790">"Želite da isključite mobilne podatke?"</string>
     <string name="mobile_data_disable_message" msgid="8604966027899770415">"Nećete imati pristup podacima ili internetu preko mobilnog operatera <xliff:g id="CARRIER">%s</xliff:g>. Internet će biti dostupan samo preko Wi-Fi veze."</string>
     <string name="mobile_data_disable_message_default_carrier" msgid="6496033312431658238">"mobilni operater"</string>
     <string name="touch_filtered_warning" msgid="8119511393338714836">"Podešavanja ne mogu da verifikuju vaš odgovor jer aplikacija skriva zahtev za dozvolu."</string>
@@ -1004,9 +1004,16 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Kontrolišite oblačiće u bilo kom trenutku"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Dodirnite Upravljajte da biste isključili oblačiće iz ove aplikacije"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Važi"</string>
+    <!-- no translation found for bubbles_app_settings (5779443644062348657) -->
+    <skip />
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Navigacija sistema je ažurirana. Da biste uneli izmene, idite u Podešavanja."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Idite u Podešavanja da biste ažurirali navigaciju sistema"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Stanje pripravnosti"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Prikazuju se u vrhu odeljka za konverzacije"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Prikazuju sliku profila na zaključanom ekranu"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Prikazuju se plutajući oblačići preko aplikacija"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Ometaju podešavanje Ne uznemiravaj"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Važi"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"Preklopni prozor za uvećanje"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"Prozor za uvećanje"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"Kontrole prozora za uvećanje"</string>
@@ -1022,10 +1029,8 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"Kontrole"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Odaberite kontrole kojima ćete pristupati iz menija napajanja"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Zadržite i prevucite da biste promenili raspored kontrola"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"Sve kontrole su uklonjene"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"Učitavanje liste svih kontrola nije uspelo."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Drugo"</string>
     <string name="controls_dialog_title" msgid="2343565267424406202">"Dodajte u kontrole uređaja"</string>
diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml
index f976b36..a4aea02 100644
--- a/packages/SystemUI/res/values-be/strings.xml
+++ b/packages/SystemUI/res/values-be/strings.xml
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"Немагчыма захаваць здымак экрана, бо мала месца ў сховішчы"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Рабіць здымкі экрана не дазваляе праграма ці ваша арганізацыя"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Адхіліць здымак экрана"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"Адкрыць здымак экрана"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"Перадпрагляд здымка экрана"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"Запіс экрана"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Бягучае апавяшчэнне для сеанса запісу экрана"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"Пачаць запіс?"</string>
@@ -231,7 +231,7 @@
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"Мабільная перадача даных уключана"</string>
     <string name="cell_data_off_content_description" msgid="9165555931499878044">"Мабільная перадача даных выключана"</string>
     <string name="not_default_data_content_description" msgid="6757881730711522517">"Не зададзена для выкарыстання даных"</string>
-    <string name="cell_data_off" msgid="4886198950247099526">"Выключаны"</string>
+    <string name="cell_data_off" msgid="4886198950247099526">"Выключана"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"Сувязь па Bluetooth."</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"Рэжым палёту."</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN уключана."</string>
@@ -305,8 +305,8 @@
     <string name="accessibility_quick_settings_work_mode_on" msgid="2779253456042059110">"Рэжым працы ўкл."</string>
     <string name="accessibility_quick_settings_work_mode_changed_off" msgid="6256690740556798683">"Рэжым працы выключаны."</string>
     <string name="accessibility_quick_settings_work_mode_changed_on" msgid="1105258550138313384">"Рэжым працы ўключаны."</string>
-    <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"Эканомія трафіку адключана."</string>
-    <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"Эканомія трафіку ўключана."</string>
+    <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"Эканомія трафіка адключана."</string>
+    <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"Эканомія трафіка ўключана."</string>
     <string name="accessibility_quick_settings_sensor_privacy_changed_off" msgid="7608378211873807353">"Прыватнасць датчыкаў выключана."</string>
     <string name="accessibility_quick_settings_sensor_privacy_changed_on" msgid="4267393685085328801">"Прыватнасць датчыкаў уключана."</string>
     <string name="accessibility_brightness" msgid="5391187016177823721">"Яркасць дысплэя"</string>
@@ -713,9 +713,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"Усплывальнае апавяшчэнне"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"Не адцягвае ўвагу дзякуючы выключаным гуку і вібрацыі."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"Прыцягвае ўвагу гукам і вібрацыяй."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"Прыцягвае ўвагу гукам і вібрацыяй. Размовы ў праграме \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" аўтаматычна паяўляюцца ў выглядзе ўсплывальных апавяшчэнняў."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Прыцягвае ўвагу да гэтага змесціва ўсплывальнай кнопкай."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Паказваецца ўверсе раздзела размоў у выглядзе ўсплывальнага апавяшчэння."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"Усе размовы з праграмы \"<xliff:g id="APP_NAME_0">%1$s</xliff:g>\" стандартна паказваюцца ў выглядзе ўсплывальных апавяшчэнняў. Кіраваць імі можна ў праграме \"<xliff:g id="APP_NAME_1">%2$s</xliff:g>\"."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Налады"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Прыярытэт"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Няма нядаўніх усплывальных апавяшчэнняў"</string>
@@ -824,9 +824,9 @@
     <string name="accessibility_long_click_tile" msgid="210472753156768705">"Адкрыць налады"</string>
     <string name="accessibility_status_bar_headphones" msgid="1304082414912647414">"Навушнікі падключаны"</string>
     <string name="accessibility_status_bar_headset" msgid="2699275863720926104">"Гарнітура падлучана"</string>
-    <string name="data_saver" msgid="3484013368530820763">"Эканомія трафіку"</string>
-    <string name="accessibility_data_saver_on" msgid="5394743820189757731">"Эканомія трафіку ўключана"</string>
-    <string name="accessibility_data_saver_off" msgid="58339669022107171">"Эканомія трафіку адключана"</string>
+    <string name="data_saver" msgid="3484013368530820763">"Эканомія трафіка"</string>
+    <string name="accessibility_data_saver_on" msgid="5394743820189757731">"Эканомія трафіка ўключана"</string>
+    <string name="accessibility_data_saver_off" msgid="58339669022107171">"Эканомія трафіка адключана"</string>
     <string name="switch_bar_on" msgid="1770868129120096114">"Уключана"</string>
     <string name="switch_bar_off" msgid="5669805115416379556">"Выключана"</string>
     <string name="tile_unavailable" msgid="3095879009136616920">"Недаступна"</string>
@@ -1009,9 +1009,16 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Кіруйце ўсплывальнымі апавяшчэннямі ў любы час"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Каб выключыць усплывальныя апавяшчэнні з гэтай праграмы, націсніце \"Кіраваць\""</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Зразумела"</string>
+    <!-- no translation found for bubbles_app_settings (5779443644062348657) -->
+    <skip />
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Навігацыя ў сістэме абноўлена. Каб унесці змяненні, перайдзіце ў Налады."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Перайдзіце ў Налады, каб абнавіць параметры навігацыі ў сістэме"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Рэжым чакання"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Паказваюцца ўверсе раздзела размоў"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Паказваюць выяву профілю на экране блакіроўкі"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Паказваюцца як рухомыя апавяшчэнні паверх праграм"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Не распаўсюджваюцца на рэжым \"Не турбаваць\""</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Зразумела"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"Акно-накладка з павелічэннем"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"Акно павелічэння"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"Налады акна павелічэння"</string>
@@ -1028,10 +1035,8 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"Сродкі кіравання"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Выберыце элементы кіравання, да якіх вы хочаце мець доступ з меню сілкавання"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Каб змяніць парадак элементаў кіравання, утрымлівайце і перацягвайце іх"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"Усе элементы кіравання выдалены"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"Не ўдалося загрузіць спіс усіх сродкаў кіравання."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Іншае"</string>
     <string name="controls_dialog_title" msgid="2343565267424406202">"Дадаць у элементы кіравання прыладай"</string>
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index d838c2b..9a505cb 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"Екранната снимка не може да се запази поради ограничено място в хранилището"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Правенето на екранни снимки не е разрешено от приложението или организацията ви"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Отхвърляне на екранната снимка"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"Отваряне на екранната снимка"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"Визуализация на екранната снимка"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"Запис на екрана"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Текущо известие за сесия за записване на екрана"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"Да се стартира ли записът?"</string>
@@ -424,7 +424,7 @@
     <string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"До изгрев"</string>
     <string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"Ще се включи в <xliff:g id="TIME">%s</xliff:g>"</string>
     <string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"До <xliff:g id="TIME">%s</xliff:g>"</string>
-    <string name="quick_settings_nfc_label" msgid="1054317416221168085">"КБП"</string>
+    <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
     <string name="quick_settings_nfc_off" msgid="3465000058515424663">"КБП е деактивирана"</string>
     <string name="quick_settings_nfc_on" msgid="1004976611203202230">"КБП е активирана"</string>
     <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Записване на екрана"</string>
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"Балонче"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"Помага ви да се фокусирате без звук или вибриране."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"Привлича вниманието ви със звук или вибриране."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"Привлича вниманието ви със звук или вибриране. Разговорите от <xliff:g id="APP_NAME">%1$s</xliff:g> се показват като балончета по подразбиране."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Задържа вниманието ви посредством плаващ пряк път към това съдържание."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Показва се като балонче в горната част на секцията с разговори."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"Всички разговори от <xliff:g id="APP_NAME_0">%1$s</xliff:g> се показват като балончета по подразбиране. Управлявайте тази настройка от <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Настройки"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Приоритет"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Няма скорошни балончета"</string>
@@ -999,9 +999,16 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Управление на балончетата по всяко време"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Докоснете „Управление“, за да изключите балончетата от това приложение"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Разбрах"</string>
+    <!-- no translation found for bubbles_app_settings (5779443644062348657) -->
+    <skip />
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Режимът за навигиране в системата е актуализиран. За да извършите промени, отворете настройките."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Отворете настройките, за да актуализирате режима за навигиране в системата"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Режим на готовност"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Показване върху секцията с разговори"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Показване на снимката на потр. профил на закл. екран"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Показва се като плаващо балонче върху приложенията"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Прекъсване на режима „Не безпокойте“"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Разбрах"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"Прозорец с наслагване за ниво на мащаба"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"Прозорец за ниво на мащаба"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"Контроли за прозореца за ниво на мащаба"</string>
@@ -1016,10 +1023,8 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"Контроли"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Избиране на контроли, които да са достъпни в менюто за захранване"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Задръжте и плъзнете, за да пренаредите контролите"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"Всички контроли са премахнати"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"Списъкът с всички контроли не бе зареден."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Друго"</string>
     <string name="controls_dialog_title" msgid="2343565267424406202">"Добавяне към контролите за устройството"</string>
diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml
index 095bee6..ca02964 100644
--- a/packages/SystemUI/res/values-bn/strings.xml
+++ b/packages/SystemUI/res/values-bn/strings.xml
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"বেশি জায়গা নেই তাই স্ক্রিনশটটি সেভ করা যাবে না৷"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"এই অ্যাপ বা আপনার প্রতিষ্ঠান স্ক্রিনশট নেওয়ার অনুমতি দেয়নি"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"স্ক্রিনশট বাতিল করুন"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"স্ক্রিনশট খুলুন"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"স্ক্রিনশটের প্রিভিউ"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"স্ক্রিন রেকর্ডার"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"স্ক্রিন রেকর্ডিং সেশন চলার বিজ্ঞপ্তি"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"রেকর্ডিং শুরু করবেন?"</string>
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"বাবল"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"সাউন্ড বা ভাইব্রেশন ছাড়া ফোকাস করতে আপনাকে সাহায্য করে।"</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"সাউন্ড বা ভাইব্রেশনের সাহায্যে দৃষ্টি আকর্ষণ করে।"</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"সাউন্ড বা ভাইব্রেশনের সাহায্যে দৃষ্টি আকর্ষণ করে। ডিফল্টভাবে <xliff:g id="APP_NAME">%1$s</xliff:g> বাবল থেকে কথোপকথন।"</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"ফ্লোটিং শর্টকাট ব্যবহার করে এই কন্টেন্টে আপনার দৃষ্টি আকর্ষণ করে রাখে।"</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"কথোপকথন বিভাগের উপরে বাবল হিসেবে দেখা যায়।"</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"ডিফল্ট হিসেবে <xliff:g id="APP_NAME_0">%1$s</xliff:g>-এর সব কথোপকথন বাবলের মধ্যে দেখুন। <xliff:g id="APP_NAME_1">%2$s</xliff:g>-এ ম্যানেজ করুন।"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"সেটিংস"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"অগ্রাধিকার"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"কোনও সাম্প্রতিক বাবল নেই"</string>
@@ -999,9 +999,21 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"যেকোনও সময় বাবল নিয়ন্ত্রণ করুন"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"এই অ্যাপ থেকে বাবল বন্ধ করতে ম্যানেজ করুন বিকল্প ট্যাপ করুন"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"বুঝেছি"</string>
+    <!-- no translation found for bubbles_app_settings (5779443644062348657) -->
+    <skip />
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"সিস্টেম নেভিগেশন আপডেট হয়েছে। পরিবর্তন করার জন্য সেটিংসে যান।"</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"সিস্টেম নেভিগেশন আপডেট করতে সেটিংসে যান"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"স্ট্যান্ডবাই"</string>
+    <!-- no translation found for priority_onboarding_show_at_top_text (1678400241025513541) -->
+    <skip />
+    <!-- no translation found for priority_onboarding_show_avatar_text (5756291381124091508) -->
+    <skip />
+    <!-- no translation found for priority_onboarding_appear_as_bubble_text (4227039772250263122) -->
+    <skip />
+    <!-- no translation found for priority_onboarding_ignores_dnd_text (2918952762719600529) -->
+    <skip />
+    <!-- no translation found for priority_onboarding_done_button_title (4569550984286506007) -->
+    <skip />
     <string name="magnification_overlay_title" msgid="6584179429612427958">"ওভারলে উইন্ডো বড় করে দেখা"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"উইন্ডো বড় করে দেখা"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"উইন্ডো কন্ট্রোল বড় করে দেখা"</string>
@@ -1016,10 +1028,8 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"নিয়ন্ত্রণ"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"যেসব কন্ট্রোল অ্যাক্সেস করতে চান সেগুলি পাওয়ার মেনু থেকে বেছে নিন"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"কন্ট্রোলগুলিকে আবার সাজানোর জন্য ধরে রেখে টেনে আনুন"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"সমস্ত কন্ট্রোল সরানো হয়েছে"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"সব কন্ট্রোলের তালিকা লোড করা যায়নি।"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"অন্য"</string>
     <string name="controls_dialog_title" msgid="2343565267424406202">"ডিভাইস কন্ট্রোলে যোগ করুন"</string>
diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml
index 6d05242..4692c0b 100644
--- a/packages/SystemUI/res/values-bs/strings.xml
+++ b/packages/SystemUI/res/values-bs/strings.xml
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"Snimak ekrana se ne može sačuvati zbog manjka prostora za pohranu"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Ova aplikacija ili vaša organizacija ne dozvoljavaju snimanje ekrana"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Odbacite snimak ekrana"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"Otvorite snimak ekrana"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"Pregled snimka ekrana"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"Snimač ekrana"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Obavještenje za sesiju snimanja ekrana je u toku"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"Započeti snimanje?"</string>
@@ -712,9 +712,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"Oblačić"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"Pomaže vam da se koncentrirate bez zvuka ili vibracije."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"Privlači vašu pažnju pomoću zvuka ili vibracije."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"Privlači vašu pažnju pomoću zvuka ili vibracije. Razgovori iz oblačića u aplikaciji <xliff:g id="APP_NAME">%1$s</xliff:g> kao zadana opcija."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Privlači vašu pažnju pomoću plutajuće prečice do ovog sadržaja."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Prikazuje se na vrhu odjeljka za razgovor u vidu oblačića."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"Prema zadanim postavkama, svi razgovori iz aplikacije <xliff:g id="APP_NAME_0">%1$s</xliff:g> pojavljuju se u oblačićima. Upravljajte ovim postavkama u aplikaciji <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Postavke"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioritet"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Nema nedavnih oblačića"</string>
@@ -1006,9 +1006,15 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Upravljajte oblačićima u svakom momentu"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Dodirnite Upravljaj da isključite oblačiće iz ove aplikacije"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Razumijem"</string>
+    <string name="bubbles_app_settings" msgid="5779443644062348657">"Postavke za <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Navigiranje sistemom je ažurirano. Da izvršite promjene, idite u Postavke."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Idite u Postavke da ažurirate navigiranje sistemom"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Stanje mirovanja"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Prikazuje se iznad odjeljka za razgovor"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Prikazuje sliku profila na zaključanom ekranu"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Izgleda kao plutajući oblačić iznad aplikacija"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Prekida način rada Ne ometaj"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Razumijem"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"Preklopni prozor za uvećavanje"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"Prozor za uvećavanje"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"Kontrole prozora za uvećavanje"</string>
@@ -1024,10 +1030,8 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"Kontrole"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Izaberite kontrole za pristup iz menija napajanja"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Držite i prevucite da preuredite kontrole"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"Sve kontrole su uklonjene"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"Učitavanje liste svih kontrola nije uspjelo."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Drugo"</string>
     <string name="controls_dialog_title" msgid="2343565267424406202">"Dodajte u kontrole uređaja"</string>
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index 638282d..3697151 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -87,8 +87,8 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"La captura de pantalla no es pot desar perquè no hi ha prou espai d\'emmagatzematge"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"L\'aplicació o la teva organització no permeten fer captures de pantalla"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Ignora la captura de pantalla"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"Obre la captura de pantalla"</string>
-    <string name="screenrecord_name" msgid="2596401223859996572">"Gravadora de pantalla"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"Previsualització de la captura de pantalla"</string>
+    <string name="screenrecord_name" msgid="2596401223859996572">"Gravació de pantalla"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notificació en curs d\'una sessió de gravació de la pantalla"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"Vols iniciar la gravació?"</string>
     <string name="screenrecord_description" msgid="1123231719680353736">"Quan graves contingut, el sistema Android pot capturar qualsevol informació sensible que es mostri a la pantalla o que es reprodueixi al dispositiu. Això inclou les contrasenyes, la informació de pagament, les fotos, els missatges i l\'àudio."</string>
@@ -296,8 +296,8 @@
     <string name="accessibility_quick_settings_flashlight_on" msgid="3785616827729850766">"Llanterna encesa."</string>
     <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"Llanterna apagada."</string>
     <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"Llanterna encesa."</string>
-    <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"La inversió dels colors està desactivada."</string>
-    <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"La inversió dels colors està activada."</string>
+    <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"La inversió de colors està desactivada."</string>
+    <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"La inversió de colors està activada."</string>
     <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"El punt d\'accés mòbil està desactivat."</string>
     <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"El punt d\'accés mòbil està activat."</string>
     <string name="accessibility_casting_turned_off" msgid="1387906158563374962">"S\'ha aturat l\'emissió de la pantalla."</string>
@@ -427,7 +427,7 @@
     <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
     <string name="quick_settings_nfc_off" msgid="3465000058515424663">"L\'NFC està desactivada"</string>
     <string name="quick_settings_nfc_on" msgid="1004976611203202230">"L\'NFC està activada"</string>
-    <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Gravació de la pantalla"</string>
+    <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Gravació de pantalla"</string>
     <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Inicia"</string>
     <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Atura"</string>
     <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Llisca cap amunt per canviar d\'aplicació"</string>
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"Bombolla"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"T\'ajuda a concentrar-te sense so ni vibració."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"Atrau la teva atenció amb so i vibració."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"Atrau la teva atenció amb so i vibració. Les converses de l\'aplicació <xliff:g id="APP_NAME">%1$s</xliff:g> es mostren com a bombolles de manera predeterminada."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Atrau la teva atenció amb una drecera flotant a aquest contingut."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Es mostra com a bombolla a la part superior de la secció de converses."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"Totes les converses de l\'aplicació <xliff:g id="APP_NAME_0">%1$s</xliff:g> es mostren com a bombolles de manera predeterminada. Gestiona-ho a <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Configuració"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioritat"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"No hi ha bombolles recents"</string>
@@ -999,15 +999,22 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Controla les bombolles en qualsevol moment"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Toca Gestiona per desactivar les bombolles d\'aquesta aplicació"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Entesos"</string>
+    <!-- no translation found for bubbles_app_settings (5779443644062348657) -->
+    <skip />
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"S\'ha actualitzat el sistema de navegació. Per fer canvis, ves a Configuració."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Ves a Configuració per actualitzar el sistema de navegació"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"En espera"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Mostra a la part superior de la secció de converses"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Mostra la foto de perfil a la pantalla de bloqueig"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Es mostra com a bombolla flotant en primer pla"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Interromp el mode No molestis"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Entesos"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"Finestra superposada d\'ampliació"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"Finestra d\'ampliació"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"Finestra de controls d\'ampliació"</string>
-    <string name="quick_controls_title" msgid="6839108006171302273">"Controls del dispositiu"</string>
+    <string name="quick_controls_title" msgid="6839108006171302273">"Controls de dispositius"</string>
     <string name="quick_controls_subtitle" msgid="1667408093326318053">"Afegeix controls per als teus dispositius connectats"</string>
-    <string name="quick_controls_setup_title" msgid="8901436655997849822">"Configura els controls del dispositiu"</string>
+    <string name="quick_controls_setup_title" msgid="8901436655997849822">"Configura els controls de dispositius"</string>
     <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"Mantén el botó d\'engegada premut per accedir als teus controls"</string>
     <string name="controls_providers_title" msgid="6879775889857085056">"Selecciona l\'aplicació per afegir controls"</string>
     <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380">
@@ -1016,13 +1023,11 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"Controls"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Selecciona els controls per accedir-hi des del menú d\'engegada"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Mantén premut i arrossega per reorganitzar els controls"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"S\'han suprimit tots els controls"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"No s\'ha pogut carregar la llista completa de controls."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Altres"</string>
-    <string name="controls_dialog_title" msgid="2343565267424406202">"Afegeix als controls del dispositiu"</string>
+    <string name="controls_dialog_title" msgid="2343565267424406202">"Afegeix als controls de dispositius"</string>
     <string name="controls_dialog_ok" msgid="7011816381344485651">"Afegeix als preferits"</string>
     <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> ha suggerit aquest control perquè l\'afegeixis als preferits."</string>
     <string name="controls_dialog_confirmation" msgid="586517302736263447">"S\'han actualitzat els controls"</string>
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index c519282..15fff73 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"Snímek obrazovky kvůli nedostatku místa v úložišti nelze uložit"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Aplikace nebo organizace zakazuje pořizování snímků obrazovky"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Zavřít snímek obrazovky"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"Otevřít snímek obrazovky"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"Náhled snímku obrazovky"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"Rekordér obrazovky"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Trvalé oznámení o relaci nahrávání"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"Spustit nahrávání?"</string>
@@ -713,9 +713,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"Bublina"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"Pomáhá vám soustředit se vypnutím zvuku a vibrací."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"Upozorňuje vás pomocí zvuku a vibrací."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"Upozorňuje vás pomocí zvuku a vibrací. Konverzace z aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> ve výchozím nastavení bublají."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Přitahuje pozornost pomocí plovoucí zkratky k tomuto obsahu."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Zobrazuje se v horní části sekce konverzace a má podobu bubliny."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"Všechny konverzace z aplikace <xliff:g id="APP_NAME_0">%1$s</xliff:g> automaticky zobrazovat jako bubliny. Nastavení lze spravovat v aplikaci <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Nastavení"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Priorita"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Žádné nedávné bubliny"</string>
@@ -1009,15 +1009,21 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Nastavení bublin můžete kdykoli upravit"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Bubliny pro tuto aplikaci můžete vypnout klepnutím na Spravovat"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Rozumím"</string>
+    <string name="bubbles_app_settings" msgid="5779443644062348657">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> – nastavení"</string>
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Systémová navigace byla aktualizována. Chcete-li provést změny, přejděte do Nastavení."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Přejděte do Nastavení a aktualizujte systémovou navigaci"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Pohotovostní režim"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Zobrazovat v horní části sekce konverzace"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Zobrazovat profilovou fotku na zámku obrazovky"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Zobrazuje se jako plovoucí bublina nad aplikacemi"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Přerušit režim Nerušit"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Rozumím"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"Překryvné zvětšovací okno"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"Zvětšovací okno"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"Ovládací prvky zvětšovacího okna"</string>
-    <string name="quick_controls_title" msgid="6839108006171302273">"Ovládací prvky zařízení"</string>
+    <string name="quick_controls_title" msgid="6839108006171302273">"Ovládání zařízení"</string>
     <string name="quick_controls_subtitle" msgid="1667408093326318053">"Přidejte ovládací prvky pro připojená zařízení"</string>
-    <string name="quick_controls_setup_title" msgid="8901436655997849822">"Nastavení ovládacích prvků zařízení"</string>
+    <string name="quick_controls_setup_title" msgid="8901436655997849822">"Nastavení ovládání zařízení"</string>
     <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"Podržením vypínače zobrazíte ovládací prvky"</string>
     <string name="controls_providers_title" msgid="6879775889857085056">"Vyberte aplikaci, pro kterou chcete přidat ovládací prvky"</string>
     <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380">
@@ -1028,13 +1034,11 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"Ovládací prvky"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Vyberte ovládací prvky, které budou zobrazeny v nabídce vypínače"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Ovládací prvky můžete uspořádat podržením a přetažením"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"Všechny ovládací prvky byly odstraněny"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"Načtení seznamu všech ovládacích prvků se nezdařilo."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Jiné"</string>
-    <string name="controls_dialog_title" msgid="2343565267424406202">"Přidání ovládacích prvků zařízení"</string>
+    <string name="controls_dialog_title" msgid="2343565267424406202">"Přidání ovládání zařízení"</string>
     <string name="controls_dialog_ok" msgid="7011816381344485651">"Přidat k oblíbeným"</string>
     <string name="controls_dialog_message" msgid="6292099631702047540">"Aplikace <xliff:g id="APP">%s</xliff:g> navrhuje přidat tento ovládací prvek do oblíbených."</string>
     <string name="controls_dialog_confirmation" msgid="586517302736263447">"Ovládací prvky aktualizovány"</string>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index c6dac99..f996cb9 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -33,7 +33,7 @@
     <string name="invalid_charger_title" msgid="938685362320735167">"Enheden kan ikke oplades via USB"</string>
     <string name="invalid_charger_text" msgid="2339310107232691577">"Brug den oplader, der fulgte med din enhed"</string>
     <string name="battery_low_why" msgid="2056750982959359863">"Indstillinger"</string>
-    <string name="battery_saver_confirmation_title" msgid="1234998463717398453">"Vil du aktivere Batterisparefunktion?"</string>
+    <string name="battery_saver_confirmation_title" msgid="1234998463717398453">"Vil du slå Batterisparefunktion til?"</string>
     <string name="battery_saver_confirmation_title_generic" msgid="2299231884234959849">"Om Batterisparefunktion"</string>
     <string name="battery_saver_confirmation_ok" msgid="5042136476802816494">"Aktivér"</string>
     <string name="battery_saver_start_action" msgid="4553256017945469937">"Aktivér batterisparefunktion"</string>
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"Screenshottet kan ikke gemmes, fordi der er begrænset lagerplads"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Appen eller din organisation tillader ikke, at du tager screenshots"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Luk screenshot"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"Åbn screenshot"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"Forhåndsvisning af screenshot"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"Skærmoptagelse"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Konstant notifikation om skærmoptagelse"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"Vil du starte optagelse?"</string>
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"Boble"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"Ingen lyde eller vibrationer, der forstyrrer dig."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"Fanger din opmærksomhed med lyd eller vibration."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"Fanger din opmærksomhed med lyd eller vibration. Samtaler fra <xliff:g id="APP_NAME">%1$s</xliff:g> vises som standard i bobler."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Fastholder din opmærksomhed med en svævende genvej til indholdet."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Vises som en boble øverst i samtalesektionen."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"Alle samtaler fra <xliff:g id="APP_NAME_0">%1$s</xliff:g> vises som standard i bobler. Administrer i <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Indstillinger"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioritet"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Ingen seneste bobler"</string>
@@ -961,8 +961,8 @@
     <string name="qs_dnd_replace" msgid="7712119051407052689">"Erstat"</string>
     <string name="running_foreground_services_title" msgid="5137313173431186685">"Apps, der kører i baggrunden"</string>
     <string name="running_foreground_services_msg" msgid="3009459259222695385">"Tryk for at se info om batteri- og dataforbrug"</string>
-    <string name="mobile_data_disable_title" msgid="5366476131671617790">"Vil du deaktivere mobildata?"</string>
-    <string name="mobile_data_disable_message" msgid="8604966027899770415">"Du vil ikke have data- eller internetadgang via <xliff:g id="CARRIER">%s</xliff:g>. Der vil kunne være adgang til internettet via Wi-Fi."</string>
+    <string name="mobile_data_disable_title" msgid="5366476131671617790">"Vil du slå mobildata fra?"</string>
+    <string name="mobile_data_disable_message" msgid="8604966027899770415">"Du vil ikke have data- eller internetadgang via <xliff:g id="CARRIER">%s</xliff:g>. Der vil kun være adgang til internettet via Wi-Fi."</string>
     <string name="mobile_data_disable_message_default_carrier" msgid="6496033312431658238">"dit mobilselskab"</string>
     <string name="touch_filtered_warning" msgid="8119511393338714836">"Indstillinger kan ikke bekræfte dit svar, da en app dækker for en anmodning om tilladelse."</string>
     <string name="slice_permission_title" msgid="3262615140094151017">"Vil du give <xliff:g id="APP_0">%1$s</xliff:g> tilladelse til at vise eksempler fra <xliff:g id="APP_2">%2$s</xliff:g>?"</string>
@@ -999,15 +999,22 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Styr bobler når som helst"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Tryk på Administrer for at deaktivere bobler fra denne app"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"OK"</string>
+    <!-- no translation found for bubbles_app_settings (5779443644062348657) -->
+    <skip />
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Systemnavigationen blev opdateret. Gå til Indstillinger for at foretage ændringer."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Gå til Indstillinger for at opdatere systemnavigationen"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Standby"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Vis i toppen af samtalesektionen"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Vis profilbillede på låseskærm"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Vis som en boble oven på apps"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Afbryd Forstyr ikke"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"OK"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"Vindue med overlejret forstørrelse"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"Vindue med forstørrelse"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"Vindue med forstørrelsesstyring"</string>
-    <string name="quick_controls_title" msgid="6839108006171302273">"Styring af enheder"</string>
+    <string name="quick_controls_title" msgid="6839108006171302273">"Enhedsstyring"</string>
     <string name="quick_controls_subtitle" msgid="1667408093326318053">"Tilføj betjeningselementer på dine tilsluttede enheder"</string>
-    <string name="quick_controls_setup_title" msgid="8901436655997849822">"Konfigurer styring af enheder"</string>
+    <string name="quick_controls_setup_title" msgid="8901436655997849822">"Konfigurer enhedsstyring"</string>
     <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"Hold afbryderknappen nede for at få adgang til dine betjeningselementer"</string>
     <string name="controls_providers_title" msgid="6879775889857085056">"Vælg en app for at tilføje betjeningselementer"</string>
     <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380">
@@ -1016,13 +1023,11 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"Betjeningselementer"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Vælg, hvilke indstillinger der skal være i menuen for afbryderknappen"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Flyt rundt på styringselementer ved at holde dem nede og trække"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"Alle styringselementerne blev fjernet"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"Listen over styringselementer kunne ikke indlæses."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Andre"</string>
-    <string name="controls_dialog_title" msgid="2343565267424406202">"Føj til styring af enheder"</string>
+    <string name="controls_dialog_title" msgid="2343565267424406202">"Føj til enhedsstyring"</string>
     <string name="controls_dialog_ok" msgid="7011816381344485651">"Føj til favoritter"</string>
     <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> har foreslået, at du føjer denne funktion til dine favoritter."</string>
     <string name="controls_dialog_confirmation" msgid="586517302736263447">"Betjeningselementerne er opdateret"</string>
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index 8426895..31837ed 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"Speichern des Screenshots aufgrund von zu wenig Speicher nicht möglich"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Die App oder deine Organisation lässt das Erstellen von Screenshots nicht zu"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Screenshot schließen"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"Screenshot öffnen"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"Screenshotvorschau"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"Bildschirmaufzeichnung"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Fortlaufende Benachrichtigung für eine Bildschirmaufzeichnung"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"Aufzeichnung starten?"</string>
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"Bubble"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"Benachrichtigungen werden ohne Ton oder Vibration angekündigt, um deine Konzentration nicht zu stören."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"Benachrichtigungen werden mit einem Ton oder einer Vibration angekündigt."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"Benachrichtigungen werden mit einem Ton oder einer Vibration angekündigt. Unterhaltungen von <xliff:g id="APP_NAME">%1$s</xliff:g> werden standardmäßig als Bubble angezeigt."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Du wirst mit einer unverankerten Verknüpfung darauf aufmerksam gemacht."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Wird oben im Bereich für Unterhaltungen als Bubble angezeigt."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"Alle Unterhaltungen von <xliff:g id="APP_NAME_0">%1$s</xliff:g> standardmäßig als Bubble anzeigen. In der App \"<xliff:g id="APP_NAME_1">%2$s</xliff:g>\" verwalten."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Einstellungen"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Priorität"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Keine kürzlich geschlossenen Bubbles"</string>
@@ -848,7 +848,7 @@
     <string name="left_icon" msgid="5036278531966897006">"Linkes Symbol"</string>
     <string name="right_icon" msgid="1103955040645237425">"Rechtes Symbol"</string>
     <string name="drag_to_add_tiles" msgid="8933270127508303672">"Zum Hinzufügen von Kacheln Kachel halten und ziehen"</string>
-    <string name="drag_to_rearrange_tiles" msgid="2143204300089638620">"Zum Verschieben der Kacheln Kachel halten und ziehen"</string>
+    <string name="drag_to_rearrange_tiles" msgid="2143204300089638620">"Zum Verschieben Kachel halten und ziehen"</string>
     <string name="drag_to_remove_tiles" msgid="4682194717573850385">"Zum Entfernen hierher ziehen"</string>
     <string name="drag_to_remove_disabled" msgid="933046987838658850">"Du brauchst mindestens <xliff:g id="MIN_NUM_TILES">%1$d</xliff:g> Kacheln"</string>
     <string name="qs_edit" msgid="5583565172803472437">"Bearbeiten"</string>
@@ -999,9 +999,16 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Bubble-Einstellungen festlegen"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Tippe auf \"Verwalten\", um Bubbles für diese App zu deaktivieren"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"OK"</string>
+    <!-- no translation found for bubbles_app_settings (5779443644062348657) -->
+    <skip />
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Systemsteuerungseinstellungen wurden angepasst. Änderungen kannst du in den Einstellungen vornehmen."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Gehe zu den Einstellungen, um die Systemsteuerung anzupassen"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Standby"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Oben im Bereich für Unterhaltungen anzeigen"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Profilbild auf Sperrbildschirm anzeigen"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Unverankertes Infofeld über anderen Apps"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"\"Bitte nicht stören\" unterbrechen"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"OK"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"Overlay-Vergrößerungsfenster"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"Vergrößerungsfenster"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"Einstellungen für Vergrößerungsfenster"</string>
@@ -1016,10 +1023,8 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"Steuerelemente"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Karten auswählen, auf die man über das Ein-/Aus-Menü zugreifen kann"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Zum Verschieben von Steuerelementen halten und ziehen"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"Alle Steuerelemente entfernt"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"Fehler beim Laden der Liste mit Steuerelementen."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Andere"</string>
     <string name="controls_dialog_title" msgid="2343565267424406202">"Zur Gerätesteuerung hinzufügen"</string>
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index dc026e4..b3142e9 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -45,7 +45,7 @@
     <string name="status_bar_settings_notifications" msgid="5285316949980621438">"Ειδοποιήσεις"</string>
     <string name="bluetooth_tethered" msgid="4171071193052799041">"Έγινε σύνδεση μέσω Bluetooth"</string>
     <string name="status_bar_input_method_settings_configure_input_methods" msgid="2972273031043777851">"Ρύθμιση μεθόδων εισαγωγής"</string>
-    <string name="status_bar_use_physical_keyboard" msgid="4849251850931213371">"Φυσικό πληκτρολόγιο"</string>
+    <string name="status_bar_use_physical_keyboard" msgid="4849251850931213371">"Κανονικό πληκτρολόγιο"</string>
     <string name="usb_device_permission_prompt" msgid="4414719028369181772">"Να επιτρέπεται η πρόσβαση της εφαρμογής <xliff:g id="APPLICATION">%1$s</xliff:g> στη συσκευή <xliff:g id="USB_DEVICE">%2$s</xliff:g>;"</string>
     <string name="usb_device_permission_prompt_warn" msgid="2309129784984063656">"Να επιτρέπεται στην εφαρμογή <xliff:g id="APPLICATION">%1$s</xliff:g> να έχει πρόσβαση στη συσκευή <xliff:g id="USB_DEVICE">%2$s</xliff:g>;\nΔεν έχει εκχωρηθεί άδεια εγγραφής σε αυτήν την εφαρμογή, αλλά μέσω αυτής της συσκευής USB θα μπορεί να εγγράφει ήχο."</string>
     <string name="usb_accessory_permission_prompt" msgid="717963550388312123">"Να επιτρέπεται η πρόσβαση της εφαρμογής <xliff:g id="APPLICATION">%1$s</xliff:g> στο αξεσουάρ <xliff:g id="USB_ACCESSORY">%2$s</xliff:g>;"</string>
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"Αδύνατη η αποθήκευση του στιγμιότυπου οθόνης λόγω περιορισμένου αποθηκευτικού χώρου"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Η λήψη στιγμιότυπων οθόνης δεν επιτρέπεται από την εφαρμογή ή τον οργανισμό σας"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Παράβλεψη στιγμιότυπου οθόνης"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"Άνοιγμα στιγμιότυπου οθόνης"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"Προεπισκόπηση στιγμιότυπου οθόνης"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"Εγγραφή οθόνης"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Ειδοποίηση σε εξέλιξη για μια περίοδο λειτουργίας εγγραφής οθόνης"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"Έναρξη εγγραφής;"</string>
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"Φούσκα"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"Σας βοηθά να συγκεντρωθείτε χωρίς ήχο και δόνηση."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"Τραβά την προσοχή σας με ήχο ή δόνηση."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"Τραβά την προσοχή σας με ήχο ή δόνηση. Οι συζητήσεις από την εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> εμφανίζονται σε συννεφάκι από προεπιλογή."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Κρατάει την προσοχή σας με μια κινούμενη συντόμευση προς αυτό το περιεχόμενο."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Εμφανίζεται στο επάνω μέρος της ενότητας συζήτησης ως συννεφάκι."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"Όλες οι συζητήσεις από την εφαρμογή <xliff:g id="APP_NAME_0">%1$s</xliff:g> εμφανίζονται από προεπιλογή ως συννεφάκια. Διαχείριση στην εφαρμογή <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Ρυθμίσεις"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Προτεραιότητα"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Δεν υπάρχουν πρόσφατα συννεφάκια"</string>
@@ -999,9 +999,16 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Ελέγξτε τα συννεφάκια ανά πάσα στιγμή."</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Πατήστε Διαχείριση για να απενεργοποιήσετε τα συννεφάκια από αυτήν την εφαρμογή."</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Το κατάλαβα."</string>
+    <!-- no translation found for bubbles_app_settings (5779443644062348657) -->
+    <skip />
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Η πλοήγηση συστήματος ενημερώθηκε. Για να κάνετε αλλαγές, μεταβείτε στις Ρυθμίσεις."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Μεταβείτε στις Ρυθμίσεις για να ενημερώσετε την πλοήγηση συστήματος"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Κατάσταση αναμονής"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Εμφάνιση στο επάνω μέρος της ενότητας συνομιλιών"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Εμφάνιση εικόνας προφίλ στην οθόνη κλειδώματος"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Κινούμενο συννεφάκι στο επάνω μέρος των εφαρμογών"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Διακοπή λειτουργίας Μην ενοχλείτε"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Το κατάλαβα"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"Παράθυρο επικάλυψης μεγέθυνσης"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"Παράθυρο μεγέθυνσης"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"Στοιχεία ελέγχου παραθύρου μεγέθυνσης"</string>
@@ -1016,10 +1023,8 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"Στοιχεία ελέγχου"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Επιλέξτε τα στοιχεία ελέγχου στα οποία θα έχετε πρόσβαση από το μενού λειτουργίας."</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Κρατήστε και σύρετε για αναδιάταξη των στοιχείων ελέγχου"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"Όλα τα στοιχεία ελέγχου καταργήθηκαν"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"Ανεπιτυχής φόρτωση λίστας όλων των στοιχ. ελέγχου."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Άλλο"</string>
     <string name="controls_dialog_title" msgid="2343565267424406202">"Προσθήκη στα στοιχεία ελέγχου συσκευής"</string>
diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml
index bbaa283..b4c380b 100644
--- a/packages/SystemUI/res/values-en-rAU/strings.xml
+++ b/packages/SystemUI/res/values-en-rAU/strings.xml
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"Can\'t save screenshot due to limited storage space"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Taking screenshots isn\'t allowed by the app or your organisation"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Dismiss screenshot"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"Open screenshot"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"Screenshot preview"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"Screen Recorder"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Ongoing notification for a screen record session"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"Start recording?"</string>
@@ -500,7 +500,7 @@
     <string name="battery_saver_notification_text" msgid="2617841636449016951">"Reduces performance and background data"</string>
     <string name="battery_saver_notification_action_text" msgid="6022091913807026887">"Turn off Battery Saver"</string>
     <string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> will have access to all of the information that is visible on your screen or played from your device while recording or casting. This includes information, such as passwords, payment details, photos, messages and audio that you play."</string>
-    <string name="media_projection_dialog_service_text" msgid="958000992162214611">"The service providing this function will have access to all of the information that is visible on your screen or played from your device while recording or casting. This includes information, such as passwords, payment details, photos, messages and audio that you play."</string>
+    <string name="media_projection_dialog_service_text" msgid="958000992162214611">"The service providing this function will have access to all of the information that is visible on your screen or played from your device while recording or casting. This includes information such as passwords, payment details, photos, messages and audio that you play."</string>
     <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"Start recording or casting?"</string>
     <string name="media_projection_dialog_title" msgid="3316063622495360646">"Start recording or casting with <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string>
     <string name="media_projection_remember_text" msgid="6896767327140422951">"Don\'t show again"</string>
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"Bubble"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"Helps you focus without sound or vibration."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"Gets your attention with sound or vibration."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"Gets your attention with sound or vibration. Conversations from <xliff:g id="APP_NAME">%1$s</xliff:g> bubble by default."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Keeps your attention with a floating shortcut to this content."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Shows at top of conversation section and appears as a bubble."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"All conversations from <xliff:g id="APP_NAME_0">%1$s</xliff:g> bubble by default. Manage in <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Settings"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Priority"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"No recent bubbles"</string>
@@ -999,9 +999,15 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Control bubbles at any time"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Tap Manage to turn off bubbles from this app"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"OK"</string>
+    <string name="bubbles_app_settings" msgid="5779443644062348657">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> settings"</string>
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"System navigation updated. To make changes, go to Settings."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Go to Settings to update system navigation"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Standby"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Show at top of conversation section"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Show profile picture on lock screen"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Appear as a floating bubble on top of apps"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Interrupt Do Not Disturb"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"OK"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"Magnification overlay window"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"Magnification window"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"Magnification window controls"</string>
diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml
index 55bc582..c719ea0 100644
--- a/packages/SystemUI/res/values-en-rCA/strings.xml
+++ b/packages/SystemUI/res/values-en-rCA/strings.xml
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"Can\'t save screenshot due to limited storage space"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Taking screenshots isn\'t allowed by the app or your organisation"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Dismiss screenshot"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"Open screenshot"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"Screenshot preview"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"Screen Recorder"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Ongoing notification for a screen record session"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"Start recording?"</string>
@@ -500,7 +500,7 @@
     <string name="battery_saver_notification_text" msgid="2617841636449016951">"Reduces performance and background data"</string>
     <string name="battery_saver_notification_action_text" msgid="6022091913807026887">"Turn off Battery Saver"</string>
     <string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> will have access to all of the information that is visible on your screen or played from your device while recording or casting. This includes information, such as passwords, payment details, photos, messages and audio that you play."</string>
-    <string name="media_projection_dialog_service_text" msgid="958000992162214611">"The service providing this function will have access to all of the information that is visible on your screen or played from your device while recording or casting. This includes information, such as passwords, payment details, photos, messages and audio that you play."</string>
+    <string name="media_projection_dialog_service_text" msgid="958000992162214611">"The service providing this function will have access to all of the information that is visible on your screen or played from your device while recording or casting. This includes information such as passwords, payment details, photos, messages and audio that you play."</string>
     <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"Start recording or casting?"</string>
     <string name="media_projection_dialog_title" msgid="3316063622495360646">"Start recording or casting with <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string>
     <string name="media_projection_remember_text" msgid="6896767327140422951">"Don\'t show again"</string>
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"Bubble"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"Helps you focus without sound or vibration."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"Gets your attention with sound or vibration."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"Gets your attention with sound or vibration. Conversations from <xliff:g id="APP_NAME">%1$s</xliff:g> bubble by default."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Keeps your attention with a floating shortcut to this content."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Shows at top of conversation section and appears as a bubble."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"All conversations from <xliff:g id="APP_NAME_0">%1$s</xliff:g> bubble by default. Manage in <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Settings"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Priority"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"No recent bubbles"</string>
@@ -999,9 +999,15 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Control bubbles at any time"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Tap Manage to turn off bubbles from this app"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"OK"</string>
+    <string name="bubbles_app_settings" msgid="5779443644062348657">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> settings"</string>
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"System navigation updated. To make changes, go to Settings."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Go to Settings to update system navigation"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Standby"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Show at top of conversation section"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Show profile picture on lock screen"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Appear as a floating bubble on top of apps"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Interrupt Do Not Disturb"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"OK"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"Magnification overlay window"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"Magnification window"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"Magnification window controls"</string>
diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml
index bbaa283..b4c380b 100644
--- a/packages/SystemUI/res/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings.xml
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"Can\'t save screenshot due to limited storage space"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Taking screenshots isn\'t allowed by the app or your organisation"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Dismiss screenshot"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"Open screenshot"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"Screenshot preview"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"Screen Recorder"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Ongoing notification for a screen record session"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"Start recording?"</string>
@@ -500,7 +500,7 @@
     <string name="battery_saver_notification_text" msgid="2617841636449016951">"Reduces performance and background data"</string>
     <string name="battery_saver_notification_action_text" msgid="6022091913807026887">"Turn off Battery Saver"</string>
     <string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> will have access to all of the information that is visible on your screen or played from your device while recording or casting. This includes information, such as passwords, payment details, photos, messages and audio that you play."</string>
-    <string name="media_projection_dialog_service_text" msgid="958000992162214611">"The service providing this function will have access to all of the information that is visible on your screen or played from your device while recording or casting. This includes information, such as passwords, payment details, photos, messages and audio that you play."</string>
+    <string name="media_projection_dialog_service_text" msgid="958000992162214611">"The service providing this function will have access to all of the information that is visible on your screen or played from your device while recording or casting. This includes information such as passwords, payment details, photos, messages and audio that you play."</string>
     <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"Start recording or casting?"</string>
     <string name="media_projection_dialog_title" msgid="3316063622495360646">"Start recording or casting with <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string>
     <string name="media_projection_remember_text" msgid="6896767327140422951">"Don\'t show again"</string>
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"Bubble"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"Helps you focus without sound or vibration."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"Gets your attention with sound or vibration."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"Gets your attention with sound or vibration. Conversations from <xliff:g id="APP_NAME">%1$s</xliff:g> bubble by default."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Keeps your attention with a floating shortcut to this content."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Shows at top of conversation section and appears as a bubble."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"All conversations from <xliff:g id="APP_NAME_0">%1$s</xliff:g> bubble by default. Manage in <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Settings"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Priority"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"No recent bubbles"</string>
@@ -999,9 +999,15 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Control bubbles at any time"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Tap Manage to turn off bubbles from this app"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"OK"</string>
+    <string name="bubbles_app_settings" msgid="5779443644062348657">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> settings"</string>
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"System navigation updated. To make changes, go to Settings."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Go to Settings to update system navigation"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Standby"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Show at top of conversation section"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Show profile picture on lock screen"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Appear as a floating bubble on top of apps"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Interrupt Do Not Disturb"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"OK"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"Magnification overlay window"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"Magnification window"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"Magnification window controls"</string>
diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml
index bbaa283..b4c380b 100644
--- a/packages/SystemUI/res/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res/values-en-rIN/strings.xml
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"Can\'t save screenshot due to limited storage space"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Taking screenshots isn\'t allowed by the app or your organisation"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Dismiss screenshot"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"Open screenshot"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"Screenshot preview"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"Screen Recorder"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Ongoing notification for a screen record session"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"Start recording?"</string>
@@ -500,7 +500,7 @@
     <string name="battery_saver_notification_text" msgid="2617841636449016951">"Reduces performance and background data"</string>
     <string name="battery_saver_notification_action_text" msgid="6022091913807026887">"Turn off Battery Saver"</string>
     <string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> will have access to all of the information that is visible on your screen or played from your device while recording or casting. This includes information, such as passwords, payment details, photos, messages and audio that you play."</string>
-    <string name="media_projection_dialog_service_text" msgid="958000992162214611">"The service providing this function will have access to all of the information that is visible on your screen or played from your device while recording or casting. This includes information, such as passwords, payment details, photos, messages and audio that you play."</string>
+    <string name="media_projection_dialog_service_text" msgid="958000992162214611">"The service providing this function will have access to all of the information that is visible on your screen or played from your device while recording or casting. This includes information such as passwords, payment details, photos, messages and audio that you play."</string>
     <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"Start recording or casting?"</string>
     <string name="media_projection_dialog_title" msgid="3316063622495360646">"Start recording or casting with <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string>
     <string name="media_projection_remember_text" msgid="6896767327140422951">"Don\'t show again"</string>
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"Bubble"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"Helps you focus without sound or vibration."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"Gets your attention with sound or vibration."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"Gets your attention with sound or vibration. Conversations from <xliff:g id="APP_NAME">%1$s</xliff:g> bubble by default."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Keeps your attention with a floating shortcut to this content."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Shows at top of conversation section and appears as a bubble."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"All conversations from <xliff:g id="APP_NAME_0">%1$s</xliff:g> bubble by default. Manage in <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Settings"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Priority"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"No recent bubbles"</string>
@@ -999,9 +999,15 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Control bubbles at any time"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Tap Manage to turn off bubbles from this app"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"OK"</string>
+    <string name="bubbles_app_settings" msgid="5779443644062348657">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> settings"</string>
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"System navigation updated. To make changes, go to Settings."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Go to Settings to update system navigation"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Standby"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Show at top of conversation section"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Show profile picture on lock screen"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Appear as a floating bubble on top of apps"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Interrupt Do Not Disturb"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"OK"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"Magnification overlay window"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"Magnification window"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"Magnification window controls"</string>
diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml
index 046f5cd..2e5f1e7 100644
--- a/packages/SystemUI/res/values-en-rXC/strings.xml
+++ b/packages/SystemUI/res/values-en-rXC/strings.xml
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‎‎‏‏‎‎‎‏‏‏‎‏‎‏‏‎‎‎‏‏‎‎‏‏‎‏‎‏‎‏‎‎‏‏‏‎‏‏‏‏‎‏‏‎‏‏‎‏‏‎‏‏‎‏‎Can\'t save screenshot due to limited storage space‎‏‎‎‏‎"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‎‎‏‎‎‎‎‎‎‎‎‎‏‎‎‏‎‎‎‎‎‎‎‎‏‎‎‏‏‎‏‎‎‎‎‏‎‏‏‎‎‏‎‏‏‏‎‎‎‎‎‎‎‏‏‎‏‏‎Taking screenshots isn\'t allowed by the app or your organization‎‏‎‎‏‎"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‎‎‏‏‏‏‏‎‎‎‏‏‎‏‏‎‏‎‎‎‏‏‎‏‏‏‏‎‏‎‏‏‎‏‎‎‎‎‎‎‏‏‏‏‏‎‎‏‎‏‎‎‎‎‎‎‎‎‎Dismiss screenshot‎‏‎‎‏‎"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‏‎‏‎‎‏‎‎‏‎‏‏‎‎‏‎‏‎‏‏‎‏‏‎‎‏‏‎‎‎‎‎‏‎‏‏‎‏‎‎‎‏‏‏‎‎‏‏‏‏‏‏‎‎‎‎‏‎Open screenshot‎‏‎‎‏‎"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‎‏‏‎‎‎‏‏‏‏‏‏‎‎‎‎‎‎‏‎‏‎‏‏‎‎‎‎‎‎‎‏‎‏‏‎‏‎‏‎‏‏‎‏‎‏‏‎‎‎‏‏‎‏‏‎‏‎‎Screenshot preview‎‏‎‎‏‎"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‎‎‎‎‎‏‎‎‎‎‏‎‎‎‏‎‏‎‎‏‎‏‎‎‎‎‎‏‎‎‎‏‎‏‎‎‏‎‎‎‎‏‎‎‎‎‏‏‏‏‎‎‏‏‏‎‎‎Screen Recorder‎‏‎‎‏‎"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‏‏‎‎‎‏‏‎‏‎‏‏‎‎‎‎‎‏‎‏‎‏‏‎‏‎‎‎‏‏‎‏‏‏‎‎‏‎‎‎‎‎‎‏‏‎‎‎‏‏‏‏‎‏‏‏‏‎Ongoing notification for a screen record session‎‏‎‎‏‎"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‎‎‏‎‎‏‎‏‎‎‏‏‏‏‏‏‎‎‏‎‎‏‏‏‎‎‎‎‎‏‏‎‏‏‎‏‎‎‎‏‏‎‏‎‏‏‎‏‏‏‎‎‎‎‎‎‏‎Start Recording?‎‏‎‎‏‎"</string>
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‎‎‏‏‎‏‏‏‏‎‏‎‎‎‎‎‏‎‏‏‏‎‏‎‏‎‏‏‏‏‎‏‎‏‏‏‏‎‏‏‏‏‎‎‎‏‏‏‎‏‏‏‏‎‎‎Bubble‎‏‎‎‏‎"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‏‎‏‎‏‎‎‎‎‎‏‏‎‎‏‏‎‏‎‎‏‎‎‎‎‎‎‎‎‎‏‏‏‏‏‎‎‏‏‏‏‎‏‎‏‎‏‏‏‏‏‎‎‎‎‎‎‎Helps you focus without sound or vibration.‎‏‎‎‏‎"</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‏‎‎‏‎‎‎‎‎‎‏‏‎‏‏‎‏‎‏‎‎‏‎‎‎‎‎‏‎‏‏‏‏‎‎‎‏‎‎‎‎‏‎‏‎‎‎‏‎‎‏‎‏‎‏‎‏‎Gets your attention with sound or vibration.‎‏‎‎‏‎"</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‏‎‏‏‎‎‏‏‏‎‎‎‏‎‏‎‏‏‎‎‏‎‏‏‏‏‎‎‎‏‏‎‏‎‎‎‏‏‎‏‎‎‎‏‏‏‏‏‎‏‏‎‎‏‎‏‎‎Gets your attention with sound or vibration. Conversations from ‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ bubble by default.‎‏‎‎‏‎"</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‎‎‏‏‎‏‎‏‏‎‎‏‏‎‏‎‎‏‎‏‏‏‏‎‎‏‏‎‎‎‎‎‎‎‎‎‎‎‏‎‎‏‎‏‎‏‎‎‎‎‏‏‏‏‎‎‏‎Keeps your attention with a floating shortcut to this content.‎‏‎‎‏‎"</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‎‏‏‏‎‏‎‏‎‎‎‎‏‏‎‏‏‏‎‎‏‎‎‎‎‏‎‏‎‏‎‎‏‏‎‎‏‎‏‎‎‎‏‏‏‏‏‎‏‏‏‏‎‏‏‏‎‎Shows at top of conversation section and appears as a bubble.‎‏‎‎‏‎"</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‎‏‏‎‎‏‎‏‎‏‎‎‏‏‎‏‏‎‏‏‎‏‏‎‏‎‎‏‎‎‎‎‎‏‎‎‎‎‏‏‎‎‏‎‏‎‏‏‎‏‏‏‎‎‎‎‏‎All conversations from ‎‏‎‎‏‏‎<xliff:g id="APP_NAME_0">%1$s</xliff:g>‎‏‎‎‏‏‏‎ bubble by default. Manage in ‎‏‎‎‏‏‎<xliff:g id="APP_NAME_1">%2$s</xliff:g>‎‏‎‎‏‏‏‎.‎‏‎‎‏‎"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‏‎‏‏‏‎‎‎‏‏‏‏‏‎‏‎‏‏‏‏‏‎‎‎‎‎‏‏‎‎‎‏‏‏‎‎‎‎‏‎‏‏‏‏‏‏‎‎‏‏‏‏‏‎‎‏‏‎Settings‎‏‎‎‏‎"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‎‏‏‎‏‏‏‎‎‏‎‎‏‏‏‎‎‎‎‏‏‎‎‎‏‏‏‏‏‎‏‏‎‎‎‎‎‏‎‏‎‎‏‏‏‎‎‏‏‎‏‎‎‎‏‎‏‎Priority‎‏‎‎‏‎"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‏‎‏‎‎‏‏‎‎‏‎‎‏‎‎‏‎‎‎‏‏‏‎‏‎‏‎‎‎‏‎‏‎‏‎‎‏‎‎‏‎‎‏‎‎‎‎‏‏‎‎‏‏‏‎‏‎‎No recent bubbles‎‏‎‎‏‎"</string>
@@ -999,9 +999,15 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‏‏‎‎‎‎‏‏‏‏‏‏‏‎‎‏‎‎‏‏‏‎‎‎‏‎‏‏‎‎‏‎‎‎‎‏‎‎‎‏‎‏‎‎‏‎‏‎‏‎‎‏‏‎‎‎‎‎Control bubbles anytime‎‏‎‎‏‎"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‏‏‎‏‎‏‎‎‎‎‎‎‎‏‏‎‎‎‎‏‏‏‏‎‎‎‎‎‏‏‏‎‏‎‎‎‎‏‎‏‎‎‎‏‎‏‎‏‎‏‎‎‎‎‎‏‏‏‎Tap Manage to turn off bubbles from this app‎‏‎‎‏‎"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‎‏‏‏‏‎‎‏‎‎‏‏‏‎‏‏‎‎‎‎‎‎‏‎‏‏‏‎‎‏‎‏‏‏‏‎‎‎‎‎‏‏‏‏‎‏‎‏‏‏‎‏‏‎‏‏‏‎Got it‎‏‎‎‏‎"</string>
+    <string name="bubbles_app_settings" msgid="5779443644062348657">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‎‎‎‏‏‎‏‎‎‏‎‏‏‎‏‎‏‎‏‎‏‏‏‏‏‏‎‎‏‏‎‏‏‏‎‏‏‏‎‎‏‏‎‏‏‎‏‎‏‎‏‏‏‎‎‎‏‎‎‏‎‎‏‏‎<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>‎‏‎‎‏‏‏‎ settings‎‏‎‎‏‎"</string>
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‏‎‎‏‏‏‏‎‎‎‎‏‎‏‏‏‏‏‎‎‎‏‏‎‎‏‏‏‏‎‏‏‏‎‏‏‎‎‎‎‎‏‎‎‎‎‏‏‎‏‎‎‎‎‎‎‎‎‎System navigation updated. To make changes, go to Settings.‎‏‎‎‏‎"</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‏‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‎‎‏‎‏‏‏‎‎‏‎‏‎‎‎‏‏‏‏‏‎‎‎‏‎‏‏‎‎‎‎‎Go to Settings to update system navigation‎‏‎‎‏‎"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‎‎‎‎‎‎‎‎‎‏‏‏‎‏‏‎‏‏‏‎‏‏‎‎‎‎‏‏‎‎‏‎‏‎‎‏‎‏‎‎‎‏‎‏‎‎‏‏‎‏‏‏‎‎‏‎‏‎Standby‎‏‎‎‏‎"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‏‏‎‏‎‎‏‎‏‎‏‏‏‎‎‎‎‎‎‎‏‎‎‎‎‎‎‏‏‎‏‏‎‏‎‏‎‎‎‎‎‏‎‏‏‏‏‎‎‎‎‏‎‎‎‏‎‏‎Show at top of conversation section‎‏‎‎‏‎"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‏‏‏‏‎‎‎‏‎‎‏‏‏‎‏‎‎‏‎‎‎‎‎‏‏‎‏‎‏‎‎‏‏‏‎‎‎‏‎‏‏‎‏‎‎‏‏‏‎‎‏‏‏‎‏‎‎‎Show profile picture on lock screen‎‏‎‎‏‎"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‏‎‏‎‏‎‏‎‎‏‎‏‏‏‎‏‏‎‎‏‎‎‎‏‏‎‏‏‏‎‏‏‎‎‎‏‏‎‏‏‎‎‏‏‎‎‏‏‏‎‎‏‎‏‎‎‏‎‎Appear as a floating bubble on top of apps‎‏‎‎‏‎"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‎‎‏‎‎‎‎‎‏‎‎‎‏‏‎‏‎‎‎‎‎‏‎‎‏‎‏‎‎‎‏‎‏‎‎‎‎‎‏‎‏‏‏‏‏‏‏‏‏‏‏‎‎‏‎‎‎‏‎Interrupt Do Not Disturb‎‏‎‎‏‎"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‏‎‏‏‎‏‎‏‎‎‏‎‎‏‏‏‎‎‏‏‎‏‎‎‎‏‏‏‎‎‎‎‏‎‏‏‎‏‏‏‏‎‎‎‎‏‏‎‎‎‎‎‏‎‏‏‏‎Got it‎‏‎‎‏‎"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‎‏‎‏‏‏‏‏‏‎‏‏‎‏‎‎‎‏‎‎‏‏‏‎‏‎‎‎‎‏‏‏‎‏‏‏‏‎‏‏‏‎‎‏‏‎‏‎‏‎‏‏‎‏‏‎‎Magnification Overlay Window‎‏‎‎‏‎"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‏‏‎‎‎‎‎‎‎‎‎‎‏‏‎‎‎‎‏‎‏‎‏‏‏‎‏‎‏‎‎‎‎‎‎‏‏‏‎‎‎‏‏‎‏‎‎‏‎‏‏‎‏‏‏‎‏‎Magnification Window‎‏‎‎‏‎"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‎‏‏‎‏‏‏‎‏‏‏‎‎‎‏‏‏‏‏‎‏‎‏‏‏‏‎‎‎‎‏‎‎‏‎‎‏‎‏‎‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‏‏‎Magnification Window Controls‎‏‎‎‏‎"</string>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index 4cc643b..879fc35 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -33,7 +33,7 @@
     <string name="invalid_charger_title" msgid="938685362320735167">"No se puede cargar mediante USB"</string>
     <string name="invalid_charger_text" msgid="2339310107232691577">"Usa el cargador que se incluyó con el dispositivo"</string>
     <string name="battery_low_why" msgid="2056750982959359863">"Configuración"</string>
-    <string name="battery_saver_confirmation_title" msgid="1234998463717398453">"¿Activar el Ahorro de batería?"</string>
+    <string name="battery_saver_confirmation_title" msgid="1234998463717398453">"¿Deseas activar Ahorro de batería?"</string>
     <string name="battery_saver_confirmation_title_generic" msgid="2299231884234959849">"Acerca del Ahorro de batería"</string>
     <string name="battery_saver_confirmation_ok" msgid="5042136476802816494">"Activar"</string>
     <string name="battery_saver_start_action" msgid="4553256017945469937">"Activar el Ahorro de batería"</string>
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"No se puede guardar la captura de pantalla debido a que no hay suficiente espacio de almacenamiento"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"La app o tu organización no permiten las capturas de pantalla"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Descartar captura de pantalla"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"Abrir captura de pantalla"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"Vista previa de la captura de pantalla"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"Grabadora de pantalla"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notificación constante para una sesión de grabación de pantalla"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"¿Comenzar grabación?"</string>
@@ -384,7 +384,7 @@
     <string name="quick_settings_cast_device_default_name" msgid="6988469571141331700">"Dispositivo sin nombre"</string>
     <string name="quick_settings_cast_device_default_description" msgid="2580520859212250265">"Listo para transmitir"</string>
     <string name="quick_settings_cast_detail_empty_text" msgid="2846282280014617785">"No hay dispositivos disponibles"</string>
-    <string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"La red Wi-Fi no está conectada"</string>
+    <string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Red Wi-Fi no conectada"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Brillo"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="2325362583903258677">"AUTOMÁTICO"</string>
     <string name="quick_settings_inversion_label" msgid="5078769633069667698">"Invertir colores"</string>
@@ -397,7 +397,7 @@
     <string name="quick_settings_tethering_label" msgid="5257299852322475780">"Compartir conexión"</string>
     <string name="quick_settings_hotspot_label" msgid="1199196300038363424">"Hotspot"</string>
     <string name="quick_settings_hotspot_secondary_label_transient" msgid="7585604088079160564">"Activando…"</string>
-    <string name="quick_settings_hotspot_secondary_label_data_saver_enabled" msgid="1280433136266439372">"Ahorro de datos sí"</string>
+    <string name="quick_settings_hotspot_secondary_label_data_saver_enabled" msgid="1280433136266439372">"Ahorro de datos act."</string>
     <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="3142308865165871976">
       <item quantity="other">%d dispositivos</item>
       <item quantity="one">%d dispositivo</item>
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"Cuadro"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"Te ayuda a concentrarte sin sonar ni vibrar."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"Capta tu atención con sonido o vibración."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"Capta tu atención con sonido o vibración. Conversaciones de la burbuja de <xliff:g id="APP_NAME">%1$s</xliff:g> de forma predeterminada."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Retiene tu atención con un acceso directo flotante a este contenido."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Aparece como una burbuja en la parte superior de la sección de la conversación."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"Todas las conversaciones de <xliff:g id="APP_NAME_0">%1$s</xliff:g> se muestran como burbujas de forma predeterminada. Administra esta opción en <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Configuración"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioridad"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"No hay burbujas recientes"</string>
@@ -962,7 +962,7 @@
     <string name="running_foreground_services_title" msgid="5137313173431186685">"Apps que se ejecutan en segundo plano"</string>
     <string name="running_foreground_services_msg" msgid="3009459259222695385">"Presiona para obtener información sobre el uso de datos y de la batería"</string>
     <string name="mobile_data_disable_title" msgid="5366476131671617790">"¿Deseas desactivar los datos móviles?"</string>
-    <string name="mobile_data_disable_message" msgid="8604966027899770415">"No tendrás acceso a datos ni Internet de <xliff:g id="CARRIER">%s</xliff:g>. Internet solo estará disponible mediante Wi-Fi."</string>
+    <string name="mobile_data_disable_message" msgid="8604966027899770415">"No tendrás acceso a datos móviles ni a Internet a través de <xliff:g id="CARRIER">%s</xliff:g>. Solo podrás conectarte a Internet mediante Wi‑Fi."</string>
     <string name="mobile_data_disable_message_default_carrier" msgid="6496033312431658238">"tu proveedor"</string>
     <string name="touch_filtered_warning" msgid="8119511393338714836">"Como una app está bloqueando una solicitud de permiso, Configuración no puede verificar tu respuesta."</string>
     <string name="slice_permission_title" msgid="3262615140094151017">"¿Permitir que <xliff:g id="APP_0">%1$s</xliff:g> muestre fragmentos de <xliff:g id="APP_2">%2$s</xliff:g>?"</string>
@@ -999,15 +999,22 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Controla las burbujas en todo momento"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Presiona Administrar para desactivar las burbujas de esta app"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Entendido"</string>
+    <!-- no translation found for bubbles_app_settings (5779443644062348657) -->
+    <skip />
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Se actualizó el sistema de navegación. Para hacer cambios, ve a Configuración."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Ve a Configuración para actualizar la navegación del sistema"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"En espera"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Se muestran en la parte superior de conversaciones"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Muestran una foto de perfil en pantalla de bloqueo"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Aparecen como burbujas flotantes encima de apps"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Suspender No interrumpir"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Entendido"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"Ventana superpuesta de ampliación"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"Ventana de ampliación"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"Controles de ampliación de la ventana"</string>
-    <string name="quick_controls_title" msgid="6839108006171302273">"Controles del dispositivo"</string>
+    <string name="quick_controls_title" msgid="6839108006171302273">"Controles de dispositivos"</string>
     <string name="quick_controls_subtitle" msgid="1667408093326318053">"Agrega controles para los dispositivos conectados"</string>
-    <string name="quick_controls_setup_title" msgid="8901436655997849822">"Configurar controles del dispositivo"</string>
+    <string name="quick_controls_setup_title" msgid="8901436655997849822">"Configurar controles de dispositivos"</string>
     <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"Mantén presionado el botón de encendido para acceder a los controles"</string>
     <string name="controls_providers_title" msgid="6879775889857085056">"Elige la app para agregar los controles"</string>
     <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380">
@@ -1016,13 +1023,11 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"Controles"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Elige los controles a los que quieres acceder desde el menú de encendido"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Mantén presionado y arrastra para reorganizar los controles"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"Se quitaron todos los controles"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"No se cargó la lista completa de controles."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Otros"</string>
-    <string name="controls_dialog_title" msgid="2343565267424406202">"Agregar a controles del dispositivo"</string>
+    <string name="controls_dialog_title" msgid="2343565267424406202">"Agregar a controles de dispositivos"</string>
     <string name="controls_dialog_ok" msgid="7011816381344485651">"Agregar a favoritos"</string>
     <string name="controls_dialog_message" msgid="6292099631702047540">"La app <xliff:g id="APP">%s</xliff:g> sugirió que agregaras este control a favoritos."</string>
     <string name="controls_dialog_confirmation" msgid="586517302736263447">"Controles actualizados"</string>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index 80dca34..7e3fdc7 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -87,11 +87,11 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"No se puede guardar la captura de pantalla porque no hay espacio de almacenamiento suficiente"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"La aplicación o tu organización no permiten realizar capturas de pantalla"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Cerrar captura de pantalla"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"Abrir captura de pantalla"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"Vista previa de captura de pantalla"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"Grabación de pantalla"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notificación continua de una sesión de grabación de la pantalla"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"¿Empezar a grabar?"</string>
-    <string name="screenrecord_description" msgid="1123231719680353736">"Mientras grabas, el sistema Android puede capturar información sensible que se muestre o se reproduzca en tu dispositivo, como contraseñas, datos de pago, fotos, mensajes y audios."</string>
+    <string name="screenrecord_description" msgid="1123231719680353736">"Mientras grabas, el sistema Android puede capturar información sensible que se muestre o se reproduzca en tu dispositivo, como contraseñas, datos de pago, fotos, mensajes y audio."</string>
     <string name="screenrecord_audio_label" msgid="6183558856175159629">"Grabar audio"</string>
     <string name="screenrecord_device_audio_label" msgid="9016927171280567791">"Audio del dispositivo"</string>
     <string name="screenrecord_device_audio_description" msgid="4922694220572186193">"Sonido de tu dispositivo, como música, llamadas y tonos de llamada"</string>
@@ -101,7 +101,7 @@
     <string name="screenrecord_ongoing_screen_only" msgid="4459670242451527727">"Grabando pantalla"</string>
     <string name="screenrecord_ongoing_screen_and_audio" msgid="5351133763125180920">"Grabando pantalla y audio"</string>
     <string name="screenrecord_taps_label" msgid="1595690528298857649">"Mostrar toques en la pantalla"</string>
-    <string name="screenrecord_stop_text" msgid="6549288689506057686">"Toca para detener"</string>
+    <string name="screenrecord_stop_text" msgid="6549288689506057686">"Toca aquí para detener"</string>
     <string name="screenrecord_stop_label" msgid="72699670052087989">"Detener"</string>
     <string name="screenrecord_pause_label" msgid="6004054907104549857">"Pausar"</string>
     <string name="screenrecord_resume_label" msgid="4972223043729555575">"Seguir"</string>
@@ -384,7 +384,7 @@
     <string name="quick_settings_cast_device_default_name" msgid="6988469571141331700">"Dispositivo sin nombre"</string>
     <string name="quick_settings_cast_device_default_description" msgid="2580520859212250265">"Listo para enviar"</string>
     <string name="quick_settings_cast_detail_empty_text" msgid="2846282280014617785">"No hay dispositivos disponibles"</string>
-    <string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Wi‑Fi sin conexión"</string>
+    <string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Wi‑Fi no conectado"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Brillo"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="2325362583903258677">"AUTO"</string>
     <string name="quick_settings_inversion_label" msgid="5078769633069667698">"Invertir colores"</string>
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"Burbuja"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"Te ayuda a concentrarte sin sonido ni vibración."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"Llama tu atención con sonido o vibración."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"Llama tu atención con sonido o vibración. Las conversaciones de <xliff:g id="APP_NAME">%1$s</xliff:g> aparecen como burbujas de forma predeterminada."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Llama tu atención con un acceso directo flotante a este contenido."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Aparece en la parte superior de la sección de una conversación en forma de burbuja."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"Todas las conversaciones de <xliff:g id="APP_NAME_0">%1$s</xliff:g> se organizan en burbujas de forma predeterminada. Gestionar en <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Ajustes"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioridad"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"No hay burbujas recientes"</string>
@@ -961,8 +961,8 @@
     <string name="qs_dnd_replace" msgid="7712119051407052689">"Reemplazar"</string>
     <string name="running_foreground_services_title" msgid="5137313173431186685">"Aplicaciones que se están ejecutando en segundo plano"</string>
     <string name="running_foreground_services_msg" msgid="3009459259222695385">"Toca para ver información detallada sobre el uso de datos y de la batería"</string>
-    <string name="mobile_data_disable_title" msgid="5366476131671617790">"¿Quieres desactivar los datos móviles?"</string>
-    <string name="mobile_data_disable_message" msgid="8604966027899770415">"No tendrás conexión a Internet ni de datos móviles a través de <xliff:g id="CARRIER">%s</xliff:g>. Solo podrás conectarte a Internet mediante una red Wi‑Fi."</string>
+    <string name="mobile_data_disable_title" msgid="5366476131671617790">"¿Desactivar datos móviles?"</string>
+    <string name="mobile_data_disable_message" msgid="8604966027899770415">"No tendrás acceso a datos móviles ni a Internet a través de <xliff:g id="CARRIER">%s</xliff:g>. Solo podrás conectarte a Internet mediante Wi‑Fi."</string>
     <string name="mobile_data_disable_message_default_carrier" msgid="6496033312431658238">"tu operador"</string>
     <string name="touch_filtered_warning" msgid="8119511393338714836">"Una aplicación impide ver una solicitud de permiso, por lo que Ajustes no puede verificar tu respuesta."</string>
     <string name="slice_permission_title" msgid="3262615140094151017">"¿Permitir que <xliff:g id="APP_0">%1$s</xliff:g> muestre fragmentos de <xliff:g id="APP_2">%2$s</xliff:g>?"</string>
@@ -999,15 +999,22 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Controla las burbujas en cualquier momento"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Toca Gestionar para desactivar las burbujas de esta aplicación"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Entendido"</string>
+    <!-- no translation found for bubbles_app_settings (5779443644062348657) -->
+    <skip />
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Se ha actualizado la navegación del sistema. Para hacer cambios, ve a Ajustes."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Ve a Ajustes para actualizar la navegación del sistema"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"En espera"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Aparecen arriba de la sección de conversaciones"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Muestran imagen de perfil en pantalla de bloqueo"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Aparecen como burbuja sobre las aplicaciones"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Interrumpen No molestar"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Entendido"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"Ventana de superposición de ampliación"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"Ventana de ampliación"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"Ventana de controles de ampliación"</string>
-    <string name="quick_controls_title" msgid="6839108006171302273">"Controles del dispositivo"</string>
+    <string name="quick_controls_title" msgid="6839108006171302273">"Control de dispositivos"</string>
     <string name="quick_controls_subtitle" msgid="1667408093326318053">"Añade controles a tus dispositivos conectados"</string>
-    <string name="quick_controls_setup_title" msgid="8901436655997849822">"Configurar controles del dispositivo"</string>
+    <string name="quick_controls_setup_title" msgid="8901436655997849822">"Configurar control de dispositivos"</string>
     <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"Mantén pulsado el botón de encendido para acceder a tus controles"</string>
     <string name="controls_providers_title" msgid="6879775889857085056">"Elige una aplicación para añadir controles"</string>
     <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380">
@@ -1016,13 +1023,11 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"Controles"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Elige los controles a los que acceder desde el menú de encendido"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Mantén pulsado y arrastra un control para reubicarlo"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"Todos los controles quitados"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"No se ha podido cargar la lista de los controles."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Otros"</string>
-    <string name="controls_dialog_title" msgid="2343565267424406202">"Añadir a controles del dispositivo"</string>
+    <string name="controls_dialog_title" msgid="2343565267424406202">"Añadir a control de dispositivos"</string>
     <string name="controls_dialog_ok" msgid="7011816381344485651">"Añadir a favoritos"</string>
     <string name="controls_dialog_message" msgid="6292099631702047540">"La aplicación <xliff:g id="APP">%s</xliff:g> ha sugerido este control para que lo añadas a tus favoritos."</string>
     <string name="controls_dialog_confirmation" msgid="586517302736263447">"Controles actualizados"</string>
diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml
index aab4693..fa6447b 100644
--- a/packages/SystemUI/res/values-et/strings.xml
+++ b/packages/SystemUI/res/values-et/strings.xml
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"Piiratud salvestusruumi tõttu ei saa ekraanipilti salvestada"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Rakendus või teie organisatsioon ei luba ekraanipilte jäädvustada"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Sule ekraanipilt"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"Ava ekraanipilt"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"Ekraanipildi eelvaade"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"Ekraanisalvesti"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Pooleli märguanne ekraanikuva salvestamise seansi puhul"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"Kas alustada salvestamist?"</string>
@@ -100,7 +100,7 @@
     <string name="screenrecord_start" msgid="330991441575775004">"Alusta"</string>
     <string name="screenrecord_ongoing_screen_only" msgid="4459670242451527727">"Ekraanikuva salvestamine"</string>
     <string name="screenrecord_ongoing_screen_and_audio" msgid="5351133763125180920">"Ekraanikuva ja heli salvestamine"</string>
-    <string name="screenrecord_taps_label" msgid="1595690528298857649">"Kuva ekraanikuva puudutused"</string>
+    <string name="screenrecord_taps_label" msgid="1595690528298857649">"Kuva ekraanipuudutused"</string>
     <string name="screenrecord_stop_text" msgid="6549288689506057686">"Puudutage peatamiseks"</string>
     <string name="screenrecord_stop_label" msgid="72699670052087989">"Peata"</string>
     <string name="screenrecord_pause_label" msgid="6004054907104549857">"Peata"</string>
@@ -427,7 +427,7 @@
     <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
     <string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC on keelatud"</string>
     <string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC on lubatud"</string>
-    <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Ekraanikirje"</string>
+    <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Ekraanisalvestus"</string>
     <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Alustage"</string>
     <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Peatage"</string>
     <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Rakenduste vahetamiseks pühkige üles"</string>
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"Mull"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"Aitab teil keskenduda (heli või vibreerimine puudub)."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"Haarab heli või vibreerimisega teie tähelepanu."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"Haarab heli või vibreerimisega teie tähelepanu. Rakenduse <xliff:g id="APP_NAME">%1$s</xliff:g> vestlused kuvatakse vaikimisi mullis."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Hoiab teie tähelepanu hõljuva otseteega selle sisu juurde."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Kuvatakse vestluste jaotise ülaosas mullina."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"Kõik rakenduse <xliff:g id="APP_NAME_0">%1$s</xliff:g> vestlused kuvatakse vaikimisi mullina. Halda rakenduses <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Seaded"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioriteet"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Hiljutisi mulle pole"</string>
@@ -945,7 +945,7 @@
     <string name="instant_apps_title" msgid="8942706782103036910">"Rakendus <xliff:g id="APP">%1$s</xliff:g> töötab"</string>
     <string name="instant_apps_message" msgid="6112428971833011754">"Rakendus avati installimata."</string>
     <string name="instant_apps_message_with_help" msgid="1816952263531203932">"Rakendus avati installimata. Lisateabe saamiseks puudutage."</string>
-    <string name="app_info" msgid="5153758994129963243">"Rakenduse teave"</string>
+    <string name="app_info" msgid="5153758994129963243">"Rakenduste teave"</string>
     <string name="go_to_web" msgid="636673528981366511">"Ava brauser"</string>
     <string name="mobile_data" msgid="4564407557775397216">"Mobiilne andmeside"</string>
     <string name="mobile_data_text_format" msgid="6806501540022589786">"<xliff:g id="ID_1">%1$s</xliff:g> – <xliff:g id="ID_2">%2$s</xliff:g>"</string>
@@ -999,15 +999,22 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Juhtige mulle igal ajal"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Selle rakenduse puhul mullide väljalülitamiseks puudutage valikut Haldamine"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Selge"</string>
+    <!-- no translation found for bubbles_app_settings (5779443644062348657) -->
+    <skip />
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Süsteemis navigeerimine on värskendatud. Muutmiseks avage jaotis Seaded."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Süsteemi navigeerimise värskendamiseks avage jaotis Seaded"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Ooterežiim"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Kuvatakse vestluste jaotise kohal"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Lukustuskuval kuvatakse profiilipilt"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Kuvatakse rakenduste kohal hõljuva mullina"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Funktsiooni Mitte segada katkestamine"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Selge"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"Suurendamisakna ülekate"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"Suurendamisaken"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"Suurendamisakna juhtelemendid"</string>
-    <string name="quick_controls_title" msgid="6839108006171302273">"Seadme juhtelemendid"</string>
+    <string name="quick_controls_title" msgid="6839108006171302273">"Seadmete juhtimisvidinad"</string>
     <string name="quick_controls_subtitle" msgid="1667408093326318053">"Lisage juhtelemendid ühendatud seadmete jaoks"</string>
-    <string name="quick_controls_setup_title" msgid="8901436655997849822">"Seadme juhtelementide seadistamine"</string>
+    <string name="quick_controls_setup_title" msgid="8901436655997849822">"Seadmete juhtimisvidinate seadistamine"</string>
     <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"Juhtelementidele juurdepääsemiseks hoidke all toitenuppu"</string>
     <string name="controls_providers_title" msgid="6879775889857085056">"Valige juhtelementide lisamiseks rakendus"</string>
     <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380">
@@ -1016,13 +1023,11 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"Juhtnupud"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Valige toitemenüüs saadaolevad juhtelemendid"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Juhtnuppude ümberpaigutamiseks hoidke neid all ja lohistage"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"Kõik juhtnupud eemaldati"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"Kõikide juhtelementide loendit ei saanud laadida."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Muu"</string>
-    <string name="controls_dialog_title" msgid="2343565267424406202">"Seadme juhtelementide hulka lisamine"</string>
+    <string name="controls_dialog_title" msgid="2343565267424406202">"Seadmete juhtimisvidinate hulka lisamine"</string>
     <string name="controls_dialog_ok" msgid="7011816381344485651">"Lisa lemmikutesse"</string>
     <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> soovitas selle juhtnupu teie lemmikutesse lisada."</string>
     <string name="controls_dialog_confirmation" msgid="586517302736263447">"Juhtelemente värskendati"</string>
diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml
index 56c2f7c..1d90e92 100644
--- a/packages/SystemUI/res/values-eu/strings.xml
+++ b/packages/SystemUI/res/values-eu/strings.xml
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"Ezin da gorde pantaila-argazkia ez delako gelditzen tokirik"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Aplikazioak edo erakundeak ez du onartzen pantaila-argazkiak ateratzea"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Baztertu pantaila-argazkia"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"Ireki pantaila-argazkia"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"Pantaila-argazkiaren aurrebista"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"Pantaila-grabagailua"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Pantailaren grabaketa-saioaren jakinarazpen jarraitua"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"Grabatzen hasi nahi duzu?"</string>
@@ -298,8 +298,8 @@
     <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"Flasha aktibatu egin da."</string>
     <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"Koloreen alderantzikatzea desaktibatu egin da."</string>
     <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"Koloreen alderantzikatzea aktibatu egin da."</string>
-    <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"Konexioa partekatzeko aukera desaktibatu egin da."</string>
-    <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"Konexioa partekatzeko aukera aktibatu egin da."</string>
+    <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"Wifi-gune mugikorra desaktibatu egin da."</string>
+    <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"Wifi-gune mugikorra aktibatu egin da."</string>
     <string name="accessibility_casting_turned_off" msgid="1387906158563374962">"Pantaila igortzeari utzi zaio."</string>
     <string name="accessibility_quick_settings_work_mode_off" msgid="562749867895549696">"Desaktibatuta dago lan modua."</string>
     <string name="accessibility_quick_settings_work_mode_on" msgid="2779253456042059110">"Aktibatuta dago lan modua."</string>
@@ -395,7 +395,7 @@
     <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Konektatuta. Bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
     <string name="quick_settings_connecting" msgid="2381969772953268809">"Konektatzen…"</string>
     <string name="quick_settings_tethering_label" msgid="5257299852322475780">"Konexioa partekatzea"</string>
-    <string name="quick_settings_hotspot_label" msgid="1199196300038363424">"Sare publikoa"</string>
+    <string name="quick_settings_hotspot_label" msgid="1199196300038363424">"Wifi-gunea"</string>
     <string name="quick_settings_hotspot_secondary_label_transient" msgid="7585604088079160564">"Aktibatzen…"</string>
     <string name="quick_settings_hotspot_secondary_label_data_saver_enabled" msgid="1280433136266439372">"Datu-aurrezlea aktibatuta"</string>
     <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="3142308865165871976">
@@ -656,7 +656,7 @@
     <string name="alarm_template" msgid="2234991538018805736">"ordua: <xliff:g id="WHEN">%1$s</xliff:g>"</string>
     <string name="alarm_template_far" msgid="3561752195856839456">"data: <xliff:g id="WHEN">%1$s</xliff:g>"</string>
     <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Ezarpen bizkorrak: <xliff:g id="TITLE">%s</xliff:g>."</string>
-    <string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Sare publikoa"</string>
+    <string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Wifi-gunea"</string>
     <string name="accessibility_managed_profile" msgid="4703836746209377356">"Work profila"</string>
     <string name="tuner_warning_title" msgid="7721976098452135267">"Dibertsioa batzuentzat, baina ez guztientzat"</string>
     <string name="tuner_warning" msgid="1861736288458481650">"Sistemako erabiltzaile-interfazearen konfiguratzaileak Android erabiltzaile-interfazea moldatzeko eta pertsonalizatzeko modu gehiago eskaintzen dizkizu. Baliteke eginbide esperimental horiek hurrengo kaleratzeetan aldatuta, etenda edo desagertuta egotea. Kontuz erabili."</string>
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"Burbuila"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"Ez du egiten soinu edo dardararik, arretarik gal ez dezazun."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"Arreta erakartzen du soinua eta dardara eginda."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"Arreta erakartzen du soinua eta dardara eginda. Modu lehenetsian, <xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioko elkarrizketak burbuila gisa agertzen dira."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Eduki honetarako lasterbide gainerakor bat eskaintzen dizu, arretarik gal ez dezazun."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Elkarrizketa-atalaren goialdean agertzen da, burbuila gisa."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"Erakutsi burbuila gisa <xliff:g id="APP_NAME_0">%1$s</xliff:g> aplikazioko elkarrizketa guztiak modu lehenetsian. Kudeatu <xliff:g id="APP_NAME_1">%2$s</xliff:g> aplikazioan."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Ezarpenak"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Lehentasuna"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Ez dago azkenaldiko burbuilarik"</string>
@@ -971,7 +971,7 @@
     <string name="slice_permission_checkbox" msgid="4242888137592298523">"Eman aplikazio guztien zatiak erakusteko baimena <xliff:g id="APP">%1$s</xliff:g> aplikazioari"</string>
     <string name="slice_permission_allow" msgid="6340449521277951123">"Baimendu"</string>
     <string name="slice_permission_deny" msgid="6870256451658176895">"Ukatu"</string>
-    <string name="auto_saver_title" msgid="6873691178754086596">"Sakatu bateria-aurrezlea noiz aktibatu antolatzeko"</string>
+    <string name="auto_saver_title" msgid="6873691178754086596">"Sakatu bateria-aurrezlea noiz aktibatu programatzeko"</string>
     <string name="auto_saver_text" msgid="3214960308353838764">"Aktibatu aurrezlea bateria agortzeko arriskua dagoenean"</string>
     <string name="no_auto_saver_action" msgid="7467924389609773835">"Ez"</string>
     <string name="auto_saver_enabled_title" msgid="4294726198280286333">"Bateria-aurrezlea aktibatu da"</string>
@@ -999,15 +999,21 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Kontrolatu burbuilak edonoiz"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Aplikazioaren burbuilak desaktibatzeko, sakatu Kudeatu"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Ados"</string>
+    <string name="bubbles_app_settings" msgid="5779443644062348657">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> aplikazioaren ezarpenak"</string>
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Eguneratu da sistemaren nabigazioa. Aldaketak egiteko, joan Ezarpenak atalera."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Sistemaren nabigazioa eguneratzeko, joan Ezarpenak atalera"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Egonean"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Erakutsi elkarrizketen atalaren goialdean"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Erakutsi profileko argazkia pantaila blokeatuan"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Burbuila gainerakor gisa agertuko da aplikazioen gainean"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Eten ez molestatzeko modua"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Ados"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"Lupa-leiho gainjarria"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"Lupa-leihoa"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"Lupa-leihoaren aukerak"</string>
-    <string name="quick_controls_title" msgid="6839108006171302273">"Gailua kontrolatzeko aukerak"</string>
+    <string name="quick_controls_title" msgid="6839108006171302273">"Gailuak kontrolatzeko widgetak"</string>
     <string name="quick_controls_subtitle" msgid="1667408093326318053">"Gehitu kontrolatzeko aukerak konektatutako gailuetan"</string>
-    <string name="quick_controls_setup_title" msgid="8901436655997849822">"Konfiguratu gailua kontrolatzeko aukerak"</string>
+    <string name="quick_controls_setup_title" msgid="8901436655997849822">"Konfiguratu gailuak kontrolatzeko widgetak"</string>
     <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"Kontrol-aukerak atzitzeko, eduki sakatuta etengailua"</string>
     <string name="controls_providers_title" msgid="6879775889857085056">"Aukeratu aplikazio bat kontrolatzeko aukerak gehitzeko"</string>
     <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380">
@@ -1016,13 +1022,11 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"Kontrolatzeko aukerak"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Aukeratu itzaltzeko menutik atzitu nahi dituzun kontrolatzeko aukerak"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Kontrolatzeko aukerak antolatzeko, eduki itzazu sakatuta, eta arrastatu"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"Kontrolatzeko aukera guztiak kendu dira"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"Ezin izan da kargatu kontrol guztien zerrenda."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Beste bat"</string>
-    <string name="controls_dialog_title" msgid="2343565267424406202">"Gehitu gailua kontrolatzeko aukeretan"</string>
+    <string name="controls_dialog_title" msgid="2343565267424406202">"Gehitu gailuak kontrolatzeko widgetetan"</string>
     <string name="controls_dialog_ok" msgid="7011816381344485651">"Gehitu gogokoetan"</string>
     <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> aplikazioak aukera hau gogokoetan gehitzea iradoki du."</string>
     <string name="controls_dialog_confirmation" msgid="586517302736263447">"Eguneratu dira kontrolatzeko aukerak"</string>
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
index a343bdf..5860af6 100644
--- a/packages/SystemUI/res/values-fa/strings.xml
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -76,18 +76,18 @@
     <string name="learn_more" msgid="4690632085667273811">"بیشتر بدانید"</string>
     <string name="compat_mode_on" msgid="4963711187149440884">"بزرگ‌نمایی برای پر کردن صفحه"</string>
     <string name="compat_mode_off" msgid="7682459748279487945">"گسترده کردن برای پر کردن صفحه"</string>
-    <string name="global_action_screenshot" msgid="2760267567509131654">"عکس صفحه‌نمایش"</string>
+    <string name="global_action_screenshot" msgid="2760267567509131654">"نماگرفت"</string>
     <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"تصویری ارسال کرد"</string>
-    <string name="screenshot_saving_ticker" msgid="6519186952674544916">"در حال ذخیره عکس صفحه‌نمایش..."</string>
-    <string name="screenshot_saving_title" msgid="2298349784913287333">"درحال ذخیره عکس صفحه‌نمایش…"</string>
-    <string name="screenshot_saved_title" msgid="8893267638659083153">"عکس صفحه‌نمایش ذخیره شد"</string>
+    <string name="screenshot_saving_ticker" msgid="6519186952674544916">"در حال ذخیره نماگرفت..."</string>
+    <string name="screenshot_saving_title" msgid="2298349784913287333">"درحال ذخیره نماگرفت…"</string>
+    <string name="screenshot_saved_title" msgid="8893267638659083153">"نماگرفت ذخیره شد"</string>
     <string name="screenshot_saved_text" msgid="7778833104901642442">"برای مشاهده عکس صفحه‌نمایشتان ضربه بزنید"</string>
-    <string name="screenshot_failed_title" msgid="3259148215671936891">"عکس صفحه‌نمایش ذخیره نشد"</string>
-    <string name="screenshot_failed_to_save_unknown_text" msgid="1506621600548684129">"دوباره عکس صفحه‌نمایش بگیرید"</string>
-    <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"به دلیل محدود بودن فضای ذخیره‌سازی نمی‌توان عکس صفحه‌نمایش را ذخیره کرد"</string>
-    <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"برنامه یا سازمان شما اجازه نمی‌دهند عکس صفحه‌نمایش بگیرید."</string>
+    <string name="screenshot_failed_title" msgid="3259148215671936891">"نماگرفت ذخیره نشد"</string>
+    <string name="screenshot_failed_to_save_unknown_text" msgid="1506621600548684129">"دوباره نماگرفت بگیرید"</string>
+    <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"به دلیل محدود بودن فضای ذخیره‌سازی نمی‌توان نماگرفت را ذخیره کرد"</string>
+    <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"برنامه یا سازمان شما اجازه نمی‌دهند نماگرفت بگیرید."</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"رد کردن نماگرفت"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"باز کردن نماگرفت"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"پیش‌نمایش نماگرفت"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"ضبط‌کننده صفحه‌نمایش"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"اعلان درحال انجام برای جلسه ضبط صفحه‌نمایش"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"ضبط شروع شود؟"</string>
@@ -379,10 +379,10 @@
     <string name="quick_settings_wifi_on_label" msgid="2489928193654318511">"‏Wi-Fi روشن"</string>
     <string name="quick_settings_wifi_detail_empty_text" msgid="483130889414601732">"‏هیچ شبکه Wi-Fi موجود نیست"</string>
     <string name="quick_settings_wifi_secondary_label_transient" msgid="7501659015509357887">"روشن کردن…"</string>
-    <string name="quick_settings_cast_title" msgid="2279220930629235211">"فرستادن صفحه نمایش"</string>
+    <string name="quick_settings_cast_title" msgid="2279220930629235211">"فرستادن محتوای صفحه"</string>
     <string name="quick_settings_casting" msgid="1435880708719268055">"در حال فرستادن"</string>
     <string name="quick_settings_cast_device_default_name" msgid="6988469571141331700">"دستگاه بدون نام"</string>
-    <string name="quick_settings_cast_device_default_description" msgid="2580520859212250265">"آماده برای فرستادن"</string>
+    <string name="quick_settings_cast_device_default_description" msgid="2580520859212250265">"آماده برای ارسال محتوا"</string>
     <string name="quick_settings_cast_detail_empty_text" msgid="2846282280014617785">"دستگاهی موجود نیست"</string>
     <string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"‏Wi-Fi وصل نیست"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"روشنایی"</string>
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"حباب"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"به شما کمک می‌کند بدون صدا یا لرزش تمرکز کنید."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"با صدا یا لرزش توجه شما را جلب می‌کند."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"با صدا یا لرزش توجه شما را جلب می‌کند. مکالمه‌های <xliff:g id="APP_NAME">%1$s</xliff:g> به‌طور پیش‌فرض در حباب نشان داده می‌شوند."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"با میان‌بری شناور به این محتوا، توجه‌تان را جلب می‌کند."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"در بالای بخش مکالمه نمایش داده می‌شود و به‌صورت ابزارک اعلان نمایان می‌شود."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"همه مکالمه‌های <xliff:g id="APP_NAME_0">%1$s</xliff:g>، به‌طور پیش‌فرض در حباب نمایش داده می‌شوند. در <xliff:g id="APP_NAME_1">%2$s</xliff:g> مدیریت کنید."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"تنظیمات"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"اولویت"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"هیچ ابزارک اعلان جدیدی وجود ندارد"</string>
@@ -962,7 +962,7 @@
     <string name="running_foreground_services_title" msgid="5137313173431186685">"برنامه‌هایی که در پس‌زمینه اجرا می‌شوند"</string>
     <string name="running_foreground_services_msg" msgid="3009459259222695385">"برای جزئیات مربوط به مصرف باتری و داده، ضربه بزنید"</string>
     <string name="mobile_data_disable_title" msgid="5366476131671617790">"داده تلفن همراه خاموش شود؟"</string>
-    <string name="mobile_data_disable_message" msgid="8604966027899770415">"‏نمی‌توانید ازطریق <xliff:g id="CARRIER">%s</xliff:g> به داده یا اینترنت دسترسی داشته باشید. اینترنت فقط ازطریق Wi-Fi دردسترس خواهد بود."</string>
+    <string name="mobile_data_disable_message" msgid="8604966027899770415">"‏نمی‌توانید ازطریق <xliff:g id="CARRIER">%s</xliff:g> به داده یا اینترنت دسترسی داشته باشید. اینترنت فقط ازطریق Wi-Fi در دسترس خواهد بود."</string>
     <string name="mobile_data_disable_message_default_carrier" msgid="6496033312431658238">"شرکت مخابراتی شما"</string>
     <string name="touch_filtered_warning" msgid="8119511393338714836">"چون برنامه‌ای درحال ایجاد تداخل در درخواست مجوز است، «تنظیمات» نمی‌تواند پاسخ شما را تأیید کند."</string>
     <string name="slice_permission_title" msgid="3262615140094151017">"به <xliff:g id="APP_0">%1$s</xliff:g> اجازه داده شود تکه‌های <xliff:g id="APP_2">%2$s</xliff:g> را نشان دهد؟"</string>
@@ -999,9 +999,16 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"کنترل ابزارک اعلان در هرزمانی"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"برای خاموش کردن «ابزارک اعلان» از این برنامه، روی «مدیریت» ضربه بزنید"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"متوجه‌ام"</string>
+    <!-- no translation found for bubbles_app_settings (5779443644062348657) -->
+    <skip />
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"پیمایش سیستم به‌روزرسانی شد. برای انجام تغییرات به «تنظیمات» بروید."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"برای به‌روزرسانی پیمایش سیستم، به «تنظیمات» بروید"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"آماده‌به‌کار"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"نمایش در بالای بخش مکالمه"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"نمایش تصویر نمایه در صفحه قفل"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"به‌شکل ابزارک اعلان شناور روی برنامه‌ها ظاهر می‌شود"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"وقفه در «مزاحم نشوید»"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"متوجه‌ام"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"پنجره همپوشانی بزرگ‌نمایی"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"پنجره بزرگ‌نمایی"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"کنترل‌های پنجره بزرگ‌نمایی"</string>
@@ -1016,10 +1023,8 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"کنترل‌ها"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"برای دسترسی از منوی روشن/خاموش، کنترل‌ها را انتخاب کنید"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"برای تغییر دادن ترتیب کنترل‌ها، آن‌ها را نگه دارید و بکشید"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"همه کنترل‌ها برداشته شده‌اند"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"فهرست همه کنترل‌ها را نمی‌توان بارگیری کرد."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"موارد دیگر"</string>
     <string name="controls_dialog_title" msgid="2343565267424406202">"افزودن به کنترل‌های دستگاه"</string>
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index c082c75..0420453 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"Kuvakaappauksen tallennus epäonnistui, sillä tallennustilaa ei ole riittävästi"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Sovellus tai organisaatio ei salli kuvakaappauksien tallentamista."</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Hylkää kuvakaappaus"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"Avaa kuvakaappaus"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"Kuvakaappauksen esikatselu"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"Näytön tallentaja"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Pysyvä ilmoitus näytön tallentamisesta"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"Aloitetaanko tallennus?"</string>
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"Kupla"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"Keskittyminen on helpompaa ilman ääntä tai värinää."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"Kiinnittää huomion äänellä tai värinällä"</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"Kiinnittää huomion äänellä tai värinällä. Näistä keskusteluista (<xliff:g id="APP_NAME">%1$s</xliff:g>) syntyy oletuksena kuplia."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Kelluva sisällön pikakuvake säilyttää huomiosi"</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Näkyy keskusteluosion yläosassa kuplana"</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"Kaikki sovelluksen <xliff:g id="APP_NAME_0">%1$s</xliff:g> keskustelut näytetään oletuksena kuplina. Muuta asetuksia sovelluksessa <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Asetukset"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Tärkeä"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Ei viimeaikaisia kuplia"</string>
@@ -999,15 +999,22 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Muuta kuplien asetuksia milloin tahansa"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Valitse Hallinnoi, jos haluat poistaa kuplat käytöstä tästä sovelluksesta"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Selvä"</string>
+    <!-- no translation found for bubbles_app_settings (5779443644062348657) -->
+    <skip />
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Järjestelmän navigointitapa vaihdettu. Voit muuttaa sitä asetuksista."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Vaihda järjestelmän navigointitapaa asetuksista"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Virransäästötila"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Näkyy keskusteluosion yläosassa"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Profiilikuva näkyy lukitusnäytöllä"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Näkyy kelluvana kuplana sovellusten päällä"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Keskeyttää Älä häiritse ‑tilan"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Selvä"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"Suurennuksen peittoikkuna"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"Suurennusikkuna"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"Suurennusikkunan ohjaimet"</string>
-    <string name="quick_controls_title" msgid="6839108006171302273">"Laitteen säätimet"</string>
+    <string name="quick_controls_title" msgid="6839108006171302273">"Laitteiden hallinta"</string>
     <string name="quick_controls_subtitle" msgid="1667408093326318053">"Lisää säätimiä yhdistettyihin laitteisiisi"</string>
-    <string name="quick_controls_setup_title" msgid="8901436655997849822">"Laitteen säätimien käyttöönotto"</string>
+    <string name="quick_controls_setup_title" msgid="8901436655997849822">"Laitteiden hallinnan käyttöönotto"</string>
     <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"Voit käyttää säätimiä painamalla virtapainiketta"</string>
     <string name="controls_providers_title" msgid="6879775889857085056">"Valitse sovellus lisätäksesi säätimiä"</string>
     <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380">
@@ -1016,13 +1023,11 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"Säätimet"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Valitse säätimet, joita käytetään virtavalikosta"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Järjestele säätimiä koskettamalla pitkään ja vetämällä"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"Kaikki säätimet poistettu"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"Kaikkien säätimien luetteloa ei voitu ladata."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Muu"</string>
-    <string name="controls_dialog_title" msgid="2343565267424406202">"Lisää laitteen säätimiin"</string>
+    <string name="controls_dialog_title" msgid="2343565267424406202">"Lisää laitteiden hallintaan"</string>
     <string name="controls_dialog_ok" msgid="7011816381344485651">"Lisää suosikkeihin"</string>
     <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> ehdotti tämän säätimen lisäämistä suosikkeihisi."</string>
     <string name="controls_dialog_confirmation" msgid="586517302736263447">"Säätimet päivitetty"</string>
diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml
index 82879f1..da44d88 100644
--- a/packages/SystemUI/res/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/strings.xml
@@ -28,15 +28,15 @@
     <string name="battery_low_percent_format" msgid="4276661262843170964">"<xliff:g id="PERCENTAGE">%s</xliff:g> restants"</string>
     <string name="battery_low_percent_format_hybrid" msgid="3985614339605686167">"Il reste <xliff:g id="PERCENTAGE">%1$s</xliff:g>, environ <xliff:g id="TIME">%2$s</xliff:g> en fonction de votre usage"</string>
     <string name="battery_low_percent_format_hybrid_short" msgid="5917433188456218857">"Il reste <xliff:g id="PERCENTAGE">%1$s</xliff:g>, environ <xliff:g id="TIME">%2$s</xliff:g>"</string>
-    <string name="battery_low_percent_format_saver_started" msgid="4968468824040940688">"<xliff:g id="PERCENTAGE">%s</xliff:g> restants. La fonction Économie d\'énergie est activée."</string>
+    <string name="battery_low_percent_format_saver_started" msgid="4968468824040940688">"<xliff:g id="PERCENTAGE">%s</xliff:g> restants. La fonction Économiseur de pile est activée."</string>
     <string name="invalid_charger" msgid="4370074072117767416">"Impossible de charger l\'appareil par USB. Servez-vous du chargeur fourni avec celui-ci."</string>
     <string name="invalid_charger_title" msgid="938685362320735167">"Impossible de charger l\'appareil par USB"</string>
     <string name="invalid_charger_text" msgid="2339310107232691577">"Servez-vous du chargeur fourni avec votre appareil"</string>
     <string name="battery_low_why" msgid="2056750982959359863">"Paramètres"</string>
-    <string name="battery_saver_confirmation_title" msgid="1234998463717398453">"Activer la fonction Économie d\'énergie?"</string>
+    <string name="battery_saver_confirmation_title" msgid="1234998463717398453">"Activer l\'économiseur de pile?"</string>
     <string name="battery_saver_confirmation_title_generic" msgid="2299231884234959849">"À propos du mode Économiseur de pile"</string>
     <string name="battery_saver_confirmation_ok" msgid="5042136476802816494">"Activer"</string>
-    <string name="battery_saver_start_action" msgid="4553256017945469937">"Activer la fonction Économie d\'énergie"</string>
+    <string name="battery_saver_start_action" msgid="4553256017945469937">"Activer la fonction Économiseur de pile"</string>
     <string name="status_bar_settings_settings_button" msgid="534331565185171556">"Paramètres"</string>
     <string name="status_bar_settings_wifi_button" msgid="7243072479837270946">"Wi-Fi"</string>
     <string name="status_bar_settings_auto_rotation" msgid="8329080442278431708">"Rotation auto de l\'écran"</string>
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"Impossible d\'enregistrer la capture d\'écran, car l\'espace de stockage est limité"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"L\'application ou votre organisation n\'autorise pas les saisies d\'écran"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Fermer la capture d\'écran"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"Ouvrir la capture d\'écran"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"Aperçu de la capture d\'écran"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"Enregistreur d\'écran"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notification en cours pour une session d\'enregistrement d\'écran"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"Commencer l\'enregistrement?"</string>
@@ -496,9 +496,9 @@
     <string name="user_remove_user_title" msgid="9124124694835811874">"Supprimer l\'utilisateur?"</string>
     <string name="user_remove_user_message" msgid="6702834122128031833">"Toutes les applications et les données de cet utilisateur seront supprimées."</string>
     <string name="user_remove_user_remove" msgid="8387386066949061256">"Supprimer"</string>
-    <string name="battery_saver_notification_title" msgid="8419266546034372562">"La fonction Économie d\'énergie est activée"</string>
+    <string name="battery_saver_notification_title" msgid="8419266546034372562">"Économiseur de pile activé"</string>
     <string name="battery_saver_notification_text" msgid="2617841636449016951">"Réduire les performances et de fond"</string>
-    <string name="battery_saver_notification_action_text" msgid="6022091913807026887">"Désactiver la fonction Économie d\'énergie"</string>
+    <string name="battery_saver_notification_action_text" msgid="6022091913807026887">"Désactiver la fonction Économiseur de pile"</string>
     <string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> aura accès à toute l\'information visible sur votre écran ou qui joue sur votre appareil durant l\'enregistrement ou la diffusion. Cela comprend des renseignements comme les mots de passe, les détails du paiement, les photos, les messages et l\'audio que vous faites jouer."</string>
     <string name="media_projection_dialog_service_text" msgid="958000992162214611">"Le service offrant cette fonction aura accès à toute l\'information qui est visible sur votre écran ou sur ce qui joue sur votre appareil durant l\'enregistrement ou la diffusion. Cela comprend des renseignements comme les mots de passe, les détails du paiement, les photos, les messages et le contenu audio que vous faites jouer."</string>
     <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"Commencer à enregistrer ou à diffuser?"</string>
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"Bulle"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"Vous aider à vous concentrer, sans son ni vibration."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"Attire votre attention à l\'aide de sons et de vibrations."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"Attire votre attention à l\'aide de sons et de vibrations. Conversations des bulles de <xliff:g id="APP_NAME">%1$s</xliff:g> par défaut."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Garde votre attention à l\'aide d\'un raccourci flottant vers ce contenu."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"S\'affiche en haut de la section des conversations sous forme de bulle."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"Par défaut, toutes les conversations <xliff:g id="APP_NAME_0">%1$s</xliff:g> s\'affichent sous forme de bulles. Vous pouvez gérer cela dans <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Paramètres"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Priorité"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Aucune bulle récente"</string>
@@ -759,8 +759,8 @@
       <item quantity="other">%d minutes</item>
     </plurals>
     <string name="battery_panel_title" msgid="5931157246673665963">"Utilisation de la pile"</string>
-    <string name="battery_detail_charging_summary" msgid="8821202155297559706">"Le mode Économie d\'énergie n\'est pas accessible pendant la charge"</string>
-    <string name="battery_detail_switch_title" msgid="6940976502957380405">"Économie d\'énergie"</string>
+    <string name="battery_detail_charging_summary" msgid="8821202155297559706">"Le mode Économiseur de pile n\'est pas accessible pendant la charge"</string>
+    <string name="battery_detail_switch_title" msgid="6940976502957380405">"Économiseur de pile"</string>
     <string name="battery_detail_switch_summary" msgid="3668748557848025990">"Réduit les performances et les données en arrière-plan"</string>
     <string name="keyboard_key_button_template" msgid="8005673627272051429">"Bouton <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="keyboard_key_home" msgid="3734400625170020657">"Accueil"</string>
@@ -971,11 +971,11 @@
     <string name="slice_permission_checkbox" msgid="4242888137592298523">"Autoriser <xliff:g id="APP">%1$s</xliff:g> à afficher des tranches de n\'importe quelle application"</string>
     <string name="slice_permission_allow" msgid="6340449521277951123">"Autoriser"</string>
     <string name="slice_permission_deny" msgid="6870256451658176895">"Refuser"</string>
-    <string name="auto_saver_title" msgid="6873691178754086596">"Toucher pour activer la fonction Économie d\'énergie"</string>
+    <string name="auto_saver_title" msgid="6873691178754086596">"Toucher pour activer la fonction Économiseur de pile"</string>
     <string name="auto_saver_text" msgid="3214960308353838764">"Activer si la pile est susceptible de s\'épuiser totalement"</string>
     <string name="no_auto_saver_action" msgid="7467924389609773835">"Non merci"</string>
-    <string name="auto_saver_enabled_title" msgid="4294726198280286333">"La fonction Économie d\'énergie est activée"</string>
-    <string name="auto_saver_enabled_text" msgid="7889491183116752719">"La fonction Économie d\'énergie s\'activera automatiquement une fois que la pile sera en dessous de <xliff:g id="PERCENTAGE">%d</xliff:g> %%."</string>
+    <string name="auto_saver_enabled_title" msgid="4294726198280286333">"La fonction Économiseur de pile est activée"</string>
+    <string name="auto_saver_enabled_text" msgid="7889491183116752719">"La fonction Économiseur de pile s\'activera automatiquement une fois que la pile sera en dessous de <xliff:g id="PERCENTAGE">%d</xliff:g> %%."</string>
     <string name="open_saver_setting_action" msgid="2111461909782935190">"Paramètres"</string>
     <string name="auto_saver_okay_action" msgid="7815925750741935386">"OK"</string>
     <string name="heap_dump_tile_name" msgid="2464189856478823046">"Copier mémoire SysUI"</string>
@@ -999,15 +999,21 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Gérer les paramètres des bulles"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Toucher Gérer pour désactiver les bulles de cette application"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"OK"</string>
+    <string name="bubbles_app_settings" msgid="5779443644062348657">"Paramètres <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"La navigation système a été mise à jour. Pour apporter des modifications, accédez au menu Paramètres."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Accédez au menu Paramètres pour mettre à jour la navigation système"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Veille"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Aff. dans le haut de la section des conversations"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Afficher la photo de profil sur l\'écran verrouillé"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Sous forme de bulle flottante, par-dessus les applis"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Interrompre le mode Ne pas déranger"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"OK"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"Fenêtre d\'agrandissement superposée"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"Fenêtre d\'agrandissement"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"Commandes pour la fenêtre d\'agrandissement"</string>
-    <string name="quick_controls_title" msgid="6839108006171302273">"Commandes de l\'appareil"</string>
+    <string name="quick_controls_title" msgid="6839108006171302273">"Commandes de contrôle des appareils"</string>
     <string name="quick_controls_subtitle" msgid="1667408093326318053">"Ajoutez des commandes pour vos appareils connectés"</string>
-    <string name="quick_controls_setup_title" msgid="8901436655997849822">"Configurer les commandes de l\'appareil"</string>
+    <string name="quick_controls_setup_title" msgid="8901436655997849822">"Configurer les commandes de contrôle des appareils"</string>
     <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"Maintenez l\'interrupteur enfoncé pour accéder à vos commandes"</string>
     <string name="controls_providers_title" msgid="6879775889857085056">"Sélectionnez l\'application pour laquelle ajouter des commandes"</string>
     <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380">
@@ -1020,7 +1026,7 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"Toutes les commandes ont été supprimées"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"Impossible de charger la liste des commandes."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Autre"</string>
-    <string name="controls_dialog_title" msgid="2343565267424406202">"Ajouter aux commandes de l\'appareil"</string>
+    <string name="controls_dialog_title" msgid="2343565267424406202">"Ajouter aux commandes de contrôle des appareils"</string>
     <string name="controls_dialog_ok" msgid="7011816381344485651">"Ajouter aux favoris"</string>
     <string name="controls_dialog_message" msgid="6292099631702047540">"L\'application <xliff:g id="APP">%s</xliff:g> a suggéré d\'ajouter cette commande à vos favoris."</string>
     <string name="controls_dialog_confirmation" msgid="586517302736263447">"Commandes mises à jour"</string>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index 4193499..0899e09 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -87,11 +87,11 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"Impossible d\'enregistrer la capture d\'écran, car l\'espace de stockage est limité"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Les captures d\'écran ne sont pas autorisées par l\'application ni par votre organisation"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Fermer la capture d\'écran"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"Ouvrir la capture d\'écran"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"Aperçu de la capture d\'écran"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"Enregistreur d\'écran"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notification en cours pour une session d\'enregistrement de l\'écran"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"Démarrer l\'enregistrement ?"</string>
-    <string name="screenrecord_description" msgid="1123231719680353736">"Pendant l\'enregistrement, le système Android peut capturer des informations sensibles affichées à l\'écran ou lues depuis votre appareil. Ceci inclut les mots de passe, les informations de paiement, les photos, les messages et les contenus audio."</string>
+    <string name="screenrecord_description" msgid="1123231719680353736">"Pendant l\'enregistrement, le système Android peut capturer toute information sensible affichée à l\'écran ou lue sur votre appareil. Ceci inclut les mots de passe, les informations de paiement, les photos, les messages et les contenus audio."</string>
     <string name="screenrecord_audio_label" msgid="6183558856175159629">"Enregistrer les contenus audio"</string>
     <string name="screenrecord_device_audio_label" msgid="9016927171280567791">"Appareil"</string>
     <string name="screenrecord_device_audio_description" msgid="4922694220572186193">"Sons provenant de l\'appareil, tels que la musique, les appels et les sonneries"</string>
@@ -100,7 +100,7 @@
     <string name="screenrecord_start" msgid="330991441575775004">"Démarrer"</string>
     <string name="screenrecord_ongoing_screen_only" msgid="4459670242451527727">"Enregistrement de l\'écran"</string>
     <string name="screenrecord_ongoing_screen_and_audio" msgid="5351133763125180920">"Enregistrement de l\'écran et des contenus audio"</string>
-    <string name="screenrecord_taps_label" msgid="1595690528298857649">"Afficher les éléments touchés à l\'écran"</string>
+    <string name="screenrecord_taps_label" msgid="1595690528298857649">"Afficher les points de l\'écran touchés"</string>
     <string name="screenrecord_stop_text" msgid="6549288689506057686">"Appuyez ici pour arrêter"</string>
     <string name="screenrecord_stop_label" msgid="72699670052087989">"Arrêter"</string>
     <string name="screenrecord_pause_label" msgid="6004054907104549857">"Pause"</string>
@@ -508,7 +508,7 @@
     <string name="manage_notifications_text" msgid="6885645344647733116">"Gérer"</string>
     <string name="manage_notifications_history_text" msgid="57055985396576230">"Historique"</string>
     <string name="notification_section_header_gentle" msgid="3044910806569985386">"Notifications silencieuses"</string>
-    <string name="notification_section_header_alerting" msgid="3168140660646863240">"Notifications sonores"</string>
+    <string name="notification_section_header_alerting" msgid="3168140660646863240">"Notifications d\'alerte"</string>
     <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversations"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Effacer toutes les notifications silencieuses"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notifications suspendues par le mode Ne pas déranger"</string>
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"Bulle"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"Sans sons ni vibrations, vous aide à vous concentrer."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"Attire votre attention à l\'aide de sons ou de vibrations."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"Attire votre attention à l\'aide de sons ou de vibrations. Les conversations provenant de <xliff:g id="APP_NAME">%1$s</xliff:g> s\'affichent sous forme de bulles par défaut."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Attire votre attention à l\'aide d\'un raccourci flottant vers ce contenu."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"S\'affiche en haut de la section des conversations et apparaît sous forme de bulle."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"Par défaut, toutes les conversations <xliff:g id="APP_NAME_0">%1$s</xliff:g> s\'affichent sous forme de bulles. Vous pouvez gérer cela dans <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Paramètres"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioritaire"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Aucune bulle récente"</string>
@@ -978,7 +978,7 @@
     <string name="auto_saver_enabled_text" msgid="7889491183116752719">"L\'économiseur de batterie s\'active automatiquement lorsque l\'autonomie de la batterie est inférieure à <xliff:g id="PERCENTAGE">%d</xliff:g> %%."</string>
     <string name="open_saver_setting_action" msgid="2111461909782935190">"Paramètres"</string>
     <string name="auto_saver_okay_action" msgid="7815925750741935386">"OK"</string>
-    <string name="heap_dump_tile_name" msgid="2464189856478823046">"Copier le tas SysUI"</string>
+    <string name="heap_dump_tile_name" msgid="2464189856478823046">"Copier mémoire SysUI"</string>
     <string name="sensor_privacy_mode" msgid="4462866919026513692">"Capteurs désactivés"</string>
     <string name="device_services" msgid="1549944177856658705">"Services pour l\'appareil"</string>
     <string name="music_controls_no_title" msgid="4166497066552290938">"Sans titre"</string>
@@ -999,15 +999,22 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Contrôler les paramètres des bulles"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Appuyez sur \"Gérer\" pour désactiver les bulles de cette application"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"OK"</string>
+    <!-- no translation found for bubbles_app_settings (5779443644062348657) -->
+    <skip />
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Navigation système mise à jour. Pour apporter des modifications, accédez aux paramètres."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Accédez aux paramètres pour mettre à jour la navigation système"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Mode Veille imminent"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"En haut de la liste des conversations"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Photo de profil sur l\'écran de verrouillage"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Sous forme d\'info-bulle au-dessus des applications"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Interrompre Ne pas déranger"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"OK"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"Fenêtre de superposition de l\'agrandissement"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"Fenêtre d\'agrandissement"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"Fenêtre des commandes d\'agrandissement"</string>
-    <string name="quick_controls_title" msgid="6839108006171302273">"Commandes de l\'appareil"</string>
+    <string name="quick_controls_title" msgid="6839108006171302273">"Commandes de contrôle des appareils"</string>
     <string name="quick_controls_subtitle" msgid="1667408093326318053">"Ajouter des commandes pour vos appareils connectés"</string>
-    <string name="quick_controls_setup_title" msgid="8901436655997849822">"Configurer les commandes de l\'appareil"</string>
+    <string name="quick_controls_setup_title" msgid="8901436655997849822">"Configurer les commandes de contrôle des appareils"</string>
     <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"Appuyez de manière prolongée sur le bouton Marche/Arrêt pour accéder aux commandes"</string>
     <string name="controls_providers_title" msgid="6879775889857085056">"Sélectionnez l\'appli pour laquelle ajouter des commandes"</string>
     <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380">
@@ -1016,13 +1023,11 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"Commandes"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Sélectionnez les commandes auxquelles vous souhaitez accéder depuis le menu de démarrage"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Appuyer et faire glisser pour réorganiser les commandes"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"Toutes les commandes ont été supprimées"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"Impossible de charger toutes les commandes."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Autre"</string>
-    <string name="controls_dialog_title" msgid="2343565267424406202">"Ajouter aux commandes de l\'appareil"</string>
+    <string name="controls_dialog_title" msgid="2343565267424406202">"Ajouter aux commandes de contrôle des appareils"</string>
     <string name="controls_dialog_ok" msgid="7011816381344485651">"Ajouter aux favoris"</string>
     <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> a suggéré d\'ajouter cette commande aux favoris."</string>
     <string name="controls_dialog_confirmation" msgid="586517302736263447">"Commandes mises à jour"</string>
diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml
index dec9c71..2e910c7 100644
--- a/packages/SystemUI/res/values-gl/strings.xml
+++ b/packages/SystemUI/res/values-gl/strings.xml
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"Non se puido gardar a captura de pantalla porque o espazo de almacenamento é limitado"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"A aplicación ou a túa organización non permite realizar capturas de pantalla"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Ignora a captura de pantalla"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"Abre a captura de pantalla"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"Vista previa da captura de pantalla"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"Gravadora da pantalla"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notificación en curso sobre unha sesión de gravación de pantalla"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"Queres iniciar a gravación?"</string>
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"Burbulla"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"Axúdache a centrarte sen son nin vibración."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"Chama a túa atención con son ou vibración."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"Chama a túa atención con son ou vibración. Conversas desde a burbulla da aplicación <xliff:g id="APP_NAME">%1$s</xliff:g> de forma predeterminada."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Mantén a túa atención cun atallo flotante a este contido."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Móstrase na parte superior da sección da conversa en forma de burbulla."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"Móstranse burbullas con todas as conversas de <xliff:g id="APP_NAME_0">%1$s</xliff:g> de forma predeterminada. Xestiona a configuración en <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Configuración"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioridade"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Non hai burbullas recentes"</string>
@@ -999,15 +999,22 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Controlar as burbullas en calquera momento"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Para desactivar as burbullas nesta aplicación, toca Xestionar"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Entendido"</string>
+    <!-- no translation found for bubbles_app_settings (5779443644062348657) -->
+    <skip />
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Actualizouse a navegación do sistema. Para facer cambios, vai a Configuración."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Para actualizar a navegación do sistema, vai a Configuración"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Modo de espera"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Mostrar na parte superior da sección de conversas"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Mostrar imaxe do perfil na pantalla de bloqueo"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Mostrar como burbulla flotante sobre outras apps"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Interromper modo Non molestar"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Listo"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"Ampliación da ventá de superposición"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"Ventá de superposición"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"Controis de ampliación da ventá"</string>
     <string name="quick_controls_title" msgid="6839108006171302273">"Control de dispositivos"</string>
     <string name="quick_controls_subtitle" msgid="1667408093326318053">"Engade controis para os dispositivos conectados"</string>
-    <string name="quick_controls_setup_title" msgid="8901436655997849822">"Configurar control de dispositivos"</string>
+    <string name="quick_controls_setup_title" msgid="8901436655997849822">"Configurar o control de dispositivos"</string>
     <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"Mantén premido o botón de acendido para acceder aos controis"</string>
     <string name="controls_providers_title" msgid="6879775889857085056">"Escolle unha aplicación para engadir controis"</string>
     <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380">
@@ -1016,10 +1023,8 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"Controis"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Escolle os controis para acceder desde o menú de acendido"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Para reorganizar os controis, mantenos premidos e arrástraos"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"Quitáronse todos os controis"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"Non se puido cargar a lista de todos os controis."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Outra"</string>
     <string name="controls_dialog_title" msgid="2343565267424406202">"Engadir ao control de dispositivos"</string>
diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml
index b0ebf7a..715c40b 100644
--- a/packages/SystemUI/res/values-gu/strings.xml
+++ b/packages/SystemUI/res/values-gu/strings.xml
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"મર્યાદિત સ્ટોરેજ સ્પેસને કારણે સ્ક્રીનશૉટ સાચવી શકાતો નથી"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"ઍપ્લિકેશન કે તમારી સંસ્થા દ્વારા સ્ક્રીનશૉટ લેવાની મંજૂરી નથી"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"સ્ક્રીનશૉટ છોડી દો"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"સ્ક્રીનશૉટ ખોલો"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"સ્ક્રીનશૉટનો પ્રીવ્યૂ"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"સ્ક્રીન રેકૉર્ડર"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"સ્ક્રીન રેકોર્ડિંગ સત્ર માટે ચાલુ નોટિફિકેશન"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"રેકૉર્ડિંગ શરૂ કરીએ?"</string>
@@ -349,7 +349,7 @@
     <string name="quick_settings_bluetooth_off_label" msgid="6375098046500790870">"બ્લૂટૂથ બંધ"</string>
     <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"કોઈ જોડી કરેલ ઉપકરણો ઉપલબ્ધ નથી"</string>
     <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> બૅટરી"</string>
-    <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"ઑડિઓ"</string>
+    <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"ઑડિયો"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"હૅડસેટ"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="3887552721233148132">"ઇનપુટ"</string>
     <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="3003338571871392293">"શ્રવણ યંત્રો"</string>
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"બબલ"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"તમને સાઉન્ડ અથવા વાઇબ્રેશન વિના ફોકસ કરવામાં સહાય કરે છે."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"સાઉન્ડ અથવા વાઇબ્રેશન વિના તમારું ધ્યાન દોરે છે."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"સાઉન્ડ અથવા વાઇબ્રેશન વિના તમારું ધ્યાન દોરે છે. ડિફૉલ્ટ તરીકે <xliff:g id="APP_NAME">%1$s</xliff:g> બબલની વાતચીત."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"ફ્લોટિંગ શૉર્ટકટથી આ કન્ટેન્ટ પર તમારું ધ્યાન દોરી રાખે છે."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"વાતચીત વિભાગની ટોચ પર બતાવે છે અને બબલ તરીકે દેખાય છે."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"<xliff:g id="APP_NAME_0">%1$s</xliff:g>ની બધી વાતચીતને ડિફૉલ્ટ તરીકે બબલ કરવામાં આવે છે. <xliff:g id="APP_NAME_1">%2$s</xliff:g>માં મેનેજ કરો."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"સેટિંગ"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"પ્રાધાન્યતા"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"તાજેતરના કોઈ બબલ નથી"</string>
@@ -999,9 +999,16 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"બબલને કોઈપણ સમયે નિયંત્રિત કરો"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"આ ઍપમાંથી બબલને બંધ કરવા માટે મેનેજ કરો પર ટૅપ કરો"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"સમજાઈ ગયું"</string>
+    <!-- no translation found for bubbles_app_settings (5779443644062348657) -->
+    <skip />
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"સિસ્ટમ નૅવિગેશન અપડેટ કર્યું. ફેરફારો કરવા માટે, સેટિંગ પર જાઓ."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"સિસ્ટમ નૅવિગેશનને અપડેટ કરવા માટે સેટિંગ પર જાઓ"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"સ્ટૅન્ડબાય"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"વાતચીત વિભાગની ટોચ પર બતાવો"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"લૉક સ્ક્રીન પર પ્રોફાઇલ ફોટો બતાવો"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"ઍપની ટોચ પર તરતા બબલ તરીકે દેખાય છે"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"ખલેલ પાડશો નહીં સેટિંગમાં હસ્તક્ષેપ કરી શકે છે"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"સમજાઈ ગયું"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"વિસ્તૃતીકરણ ઓવરલે વિંડો"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"વિસ્તૃતીકરણ વિંડો"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"વિસ્તૃતીકરણ વિંડોના નિયંત્રણો"</string>
@@ -1016,10 +1023,8 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"નિયંત્રણો"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"પાવર મેનૂમાંથી ઍક્સેસ કરવા માટેના નિયંત્રણોને પસંદ કરો"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"નિયંત્રણોને ફરીથી ગોઠવવા માટે તેમને હોલ્ડ કરીને ખેંચો"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"બધા નિયંત્રણો કાઢી નાખ્યા"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"બધા નિયંત્રણોની સૂચિ લોડ કરી શકાઈ નથી."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"અન્ય"</string>
     <string name="controls_dialog_title" msgid="2343565267424406202">"ડિવાઇસનાં નિયંત્રણોમાં ઉમેરો"</string>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index cdfa4f7..af45c68 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"मेमोरी कम होने की वजह से स्क्रीनशॉट सेव नहीं किया जा सका"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"ऐप्लिकेशन या आपका संगठन स्क्रीनशॉट लेने की अनुमति नहीं देता"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"स्क्रीनशॉट खारिज करें"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"स्क्रीनशॉट खोलें"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"स्क्रीनशॉट की झलक"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"स्क्रीन रिकॉर्डर"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"स्क्रीन रिकॉर्ड सेशन के लिए जारी सूचना"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"रिकॉर्डिंग शुरू करना चाहते हैं?"</string>
@@ -514,7 +514,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"बातचीत"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"बिना आवाज़ की सभी सूचनाएं हटाएं"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"\'परेशान न करें\' सुविधा के ज़रिए कुछ समय के लिए सूचनाएं दिखाना रोक दिया गया है"</string>
-    <string name="media_projection_action_text" msgid="3634906766918186440">"अब शुरू करें"</string>
+    <string name="media_projection_action_text" msgid="3634906766918186440">"अभी शुरू करें"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"कोई सूचना नहीं मिली"</string>
     <string name="profile_owned_footer" msgid="2756770645766113964">"प्रोफ़ाइल को मॉनीटर किया जा सकता है"</string>
     <string name="vpn_footer" msgid="3457155078010607471">"नेटवर्क को मॉनीटर किया जा सकता है"</string>
@@ -584,7 +584,7 @@
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"साउंड सेटिंग"</string>
     <string name="accessibility_volume_expand" msgid="7653070939304433603">"विस्तार करें"</string>
     <string name="accessibility_volume_collapse" msgid="2746845391013829996">"छोटा करें"</string>
-    <string name="volume_odi_captions_tip" msgid="8825655463280990941">"मीडिया में अपने आप कैप्शन जोड़ें"</string>
+    <string name="volume_odi_captions_tip" msgid="8825655463280990941">"ऑडियो-वीडियो पहचानकर अपने-आप कैप्शन बनना"</string>
     <string name="accessibility_volume_close_odi_captions_tip" msgid="8924753283621160480">"कैप्शन सलाह बंद करें"</string>
     <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"कैप्शन ऊपर लगाएं"</string>
     <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"चालू करें"</string>
@@ -709,9 +709,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"बबल"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"आवाज़ या वाइब्रेशन न होने की वजह से आप काम में ध्यान लगा पाते हैं."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"आवाज़ या वाइब्रेशन होने की वजह से आपका ध्यान सूचनाओं पर जाता है."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"आवाज़ या वाइब्रेशन होने की वजह से आपका ध्यान सूचनाओं पर जाता है. <xliff:g id="APP_NAME">%1$s</xliff:g> में होने वाली बातचीत डिफ़ॉल्ट रूप से बबल के तौर पर दिखती है."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"फ़्लोट करने वाले शॉर्टकट की मदद से इस सामग्री पर आपका ध्यान बना रहता है."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"यह बातचीत सेक्शन में सबसे ऊपर और एक बबल के तौर पर दिखती है."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> में हुई सभी बातचीत डिफ़ॉल्ट रूप से बबल की जाती हैं. <xliff:g id="APP_NAME_1">%2$s</xliff:g> में प्रबंधित करें."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"सेटिंग"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"प्राथमिकता"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"हाल ही के बबल्स मौजूद नहीं हैं"</string>
@@ -964,7 +964,7 @@
     <string name="running_foreground_services_title" msgid="5137313173431186685">"बैकग्राउंड में चल रहे ऐप्लिकेशन"</string>
     <string name="running_foreground_services_msg" msgid="3009459259222695385">"बैटरी और डेटा खर्च की जानकारी के लिए छूएं"</string>
     <string name="mobile_data_disable_title" msgid="5366476131671617790">"मोबाइल डेटा बंद करना चाहते हैं?"</string>
-    <string name="mobile_data_disable_message" msgid="8604966027899770415">"आप <xliff:g id="CARRIER">%s</xliff:g> के ज़रिए डेटा या इंटरनेट इस्तेमाल नहीं कर पाएंगे. इंटरनेट सिर्फ़ वाई-फ़ाई का इस्तेमाल करके चलेगा."</string>
+    <string name="mobile_data_disable_message" msgid="8604966027899770415">"आप <xliff:g id="CARRIER">%s</xliff:g> से डेटा या इंटरनेट का इस्तेमाल नहीं कर पाएंगे. इंटरनेट सिर्फ़ वाई-फ़ाई से चलेगा."</string>
     <string name="mobile_data_disable_message_default_carrier" msgid="6496033312431658238">"आपको मोबाइल और इंटरनेट सेवा देने वाली कंपनी"</string>
     <string name="touch_filtered_warning" msgid="8119511393338714836">"ऐप की वजह से मंज़ूरी के अनुरोध को समझने में दिक्कत हो रही है, इसलिए सेटिंग से आपके जवाब की पुष्टि नहीं हो पा रही है."</string>
     <string name="slice_permission_title" msgid="3262615140094151017">"<xliff:g id="APP_0">%1$s</xliff:g> को <xliff:g id="APP_2">%2$s</xliff:g> के हिस्से (स्लाइस) दिखाने की मंज़ूरी दें?"</string>
@@ -1001,15 +1001,22 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"जब चाहें, बबल्स को कंट्रोल करें"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"इस ऐप्लिकेशन पर बबल्स को बंद करने के लिए \'प्रबंधित करें\' पर टैप करें"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"ठीक है"</string>
+    <!-- no translation found for bubbles_app_settings (5779443644062348657) -->
+    <skip />
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"सिस्टम नेविगेशन अपडेट हो गया. बदलाव करने के लिए \'सेटिंग\' पर जाएं."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"सिस्टम नेविगेशन अपडेट करने के लिए \'सेटिंग\' में जाएं"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"स्टैंडबाई"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"बातचीत सेक्शन में सबसे ऊपर दिखाएं"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"लॉक स्क्रीन पर प्रोफ़ाइल फ़ोटो दिखाएं"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"खास बातचीत फ़्लोटिंग बबल की तरह ऐप्लिकेशन के ऊपर दिखेंगी"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"\'परेशान न करें\' मोड में रुकावट"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"ठीक है"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"Magnification Overlay Window"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"स्क्रीन को बड़ा करके दिखाने वाली विंडो"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"स्क्रीन को बड़ा करके दिखाने वाली विंडो के नियंत्रण"</string>
-    <string name="quick_controls_title" msgid="6839108006171302273">"डिवाइस के कंट्रोल"</string>
+    <string name="quick_controls_title" msgid="6839108006171302273">"डिवाइस कंट्रोल"</string>
     <string name="quick_controls_subtitle" msgid="1667408093326318053">"कनेक्ट किए गए डिवाइस के लिए कंट्रोल जोड़ें"</string>
-    <string name="quick_controls_setup_title" msgid="8901436655997849822">"डिवाइस के कंट्रोल सेट अप करें"</string>
+    <string name="quick_controls_setup_title" msgid="8901436655997849822">"डिवाइस कंट्रोल सेट अप करें"</string>
     <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"कंट्रोल ऐक्सेस करने के लिए पावर बटन को दबाकर रखें"</string>
     <string name="controls_providers_title" msgid="6879775889857085056">"कंट्रोल जोड़ने के लिए ऐप्लिकेशन चुनें"</string>
     <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380">
@@ -1018,13 +1025,11 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"कंट्राेल"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"पावर मेन्यू से ऐक्सेस करने के लिए कंट्रोल चुनें"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"कंट्रोल का क्रम फिर से बदलने के लिए उन्हें दबाकर रखें और खींचें"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"सभी कंट्रोल हटा दिए गए"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"सभी कंट्रोल की सूची लोड नहीं हो सकी."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"अन्य"</string>
-    <string name="controls_dialog_title" msgid="2343565267424406202">"डिवाइस के कंट्रोल में जोड़ें"</string>
+    <string name="controls_dialog_title" msgid="2343565267424406202">"डिवाइस कंट्रोल में जोड़ें"</string>
     <string name="controls_dialog_ok" msgid="7011816381344485651">"पसंदीदा में जोड़ें"</string>
     <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> आपको इस कंट्रोल को अपनी पसंदीदा में जोड़ने का सुझाव देता है."</string>
     <string name="controls_dialog_confirmation" msgid="586517302736263447">"कंट्रोल अपडेट किए गए"</string>
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index fd4aa6c..7bcb22e 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -33,7 +33,7 @@
     <string name="invalid_charger_title" msgid="938685362320735167">"Punjenje putem USB-a nije moguće"</string>
     <string name="invalid_charger_text" msgid="2339310107232691577">"Koristite punjač koji ste dobili s uređajem"</string>
     <string name="battery_low_why" msgid="2056750982959359863">"Postavke"</string>
-    <string name="battery_saver_confirmation_title" msgid="1234998463717398453">"Želite li uključiti Štednju baterije?"</string>
+    <string name="battery_saver_confirmation_title" msgid="1234998463717398453">"Uključiti Štednju baterije?"</string>
     <string name="battery_saver_confirmation_title_generic" msgid="2299231884234959849">"O Štednji baterije"</string>
     <string name="battery_saver_confirmation_ok" msgid="5042136476802816494">"Uključi"</string>
     <string name="battery_saver_start_action" msgid="4553256017945469937">"Uključite Štednju baterije"</string>
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"Zaslon nije snimljen zbog ograničenog prostora za pohranu"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Aplikacija ili vaša organizacija ne dopuštaju snimanje zaslona"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Odbacivanje snimke zaslona"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"Otvaranje snimke zaslona"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"Pregled snimke zaslona"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"Snimač zaslona"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Tekuća obavijest za sesiju snimanja zaslona"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"Želite li započeti snimanje?"</string>
@@ -398,7 +398,7 @@
     <string name="quick_settings_tethering_label" msgid="5257299852322475780">"Dijeljenje veze"</string>
     <string name="quick_settings_hotspot_label" msgid="1199196300038363424">"Žarišna točka"</string>
     <string name="quick_settings_hotspot_secondary_label_transient" msgid="7585604088079160564">"Uključivanje…"</string>
-    <string name="quick_settings_hotspot_secondary_label_data_saver_enabled" msgid="1280433136266439372">"Ušteda podat. uklj."</string>
+    <string name="quick_settings_hotspot_secondary_label_data_saver_enabled" msgid="1280433136266439372">"Štednja pod. prom. uklj."</string>
     <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="3142308865165871976">
       <item quantity="one">%d uređaj</item>
       <item quantity="few">%d uređaja</item>
@@ -515,7 +515,7 @@
     <string name="notification_section_header_conversations" msgid="821834744538345661">"Razgovori"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Izbriši sve bešumne obavijesti"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Značajka Ne uznemiravaj pauzirala je Obavijesti"</string>
-    <string name="media_projection_action_text" msgid="3634906766918186440">"Započni sad"</string>
+    <string name="media_projection_action_text" msgid="3634906766918186440">"Započni"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"Nema obavijesti"</string>
     <string name="profile_owned_footer" msgid="2756770645766113964">"Profil se možda nadzire"</string>
     <string name="vpn_footer" msgid="3457155078010607471">"Mreža se možda nadzire"</string>
@@ -710,9 +710,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"Oblačić"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"Pomaže vam da se usredotočite bez zvučnih signala i vibracija."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"Privlači vašu pažnju zvučnim signalima ili vibracijama."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"Privlači vašu pažnju zvučnim signalima ili vibracijama. Razgovori iz aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g> prikazuju se u oblačiću prema zadanim postavkama."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Održava vam pozornost pomoću plutajućeg prečaca ovom sadržaju."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Prikazuje se pri vrhu odjeljka razgovora kao oblačić."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"Svi razgovori iz aplikacije <xliff:g id="APP_NAME_0">%1$s</xliff:g> prema zadanim se postavkama pojavljuju u oblačiću. Upravljajte u aplikaciji <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Postavke"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioritet"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Nema nedavnih oblačića"</string>
@@ -966,7 +966,7 @@
     <string name="qs_dnd_replace" msgid="7712119051407052689">"Zamijeni"</string>
     <string name="running_foreground_services_title" msgid="5137313173431186685">"Izvođenje aplikacija u pozadini"</string>
     <string name="running_foreground_services_msg" msgid="3009459259222695385">"Dodirnite da biste vidjeli pojedinosti o potrošnji baterije i podatkovnom prometu"</string>
-    <string name="mobile_data_disable_title" msgid="5366476131671617790">"Želite li isključiti mobilne podatke?"</string>
+    <string name="mobile_data_disable_title" msgid="5366476131671617790">"Isključiti mobilne podatke?"</string>
     <string name="mobile_data_disable_message" msgid="8604966027899770415">"Nećete imati pristup mobilnim podacima ili internetu putem operatera <xliff:g id="CARRIER">%s</xliff:g>. Internet će biti dostupan samo putem Wi-Fija."</string>
     <string name="mobile_data_disable_message_default_carrier" msgid="6496033312431658238">"vaš mobilni operater"</string>
     <string name="touch_filtered_warning" msgid="8119511393338714836">"Budući da aplikacija prekriva zahtjev za dopuštenje, Postavke ne mogu potvrditi vaš odgovor."</string>
@@ -1004,13 +1004,19 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Upravljanje oblačićima u svakom trenutku"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Dodirnite Upravljanje da biste isključili oblačiće iz ove aplikacije"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Shvaćam"</string>
+    <string name="bubbles_app_settings" msgid="5779443644062348657">"Postavke za <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Ažurirana je navigacija sustavom. Možete je promijeniti u Postavkama."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Navigaciju sustavom možete ažurirati u Postavkama"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Stanje mirovanja"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Prikazuje se pri vrhu odjeljka razgovora"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Prikazuje profilnu sliku na zaključanom zaslonu"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Prikazuje se kao lebdeći oblačić iznad aplikacija"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Prekida Ne uznemiravaj"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Shvaćam"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"Prozor preklapanja povećavanja"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"Prozor za povećavanje"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"Kontrole prozora za povećavanje"</string>
-    <string name="quick_controls_title" msgid="6839108006171302273">"Upravljanje uređajem"</string>
+    <string name="quick_controls_title" msgid="6839108006171302273">"Kontrole uređaja"</string>
     <string name="quick_controls_subtitle" msgid="1667408093326318053">"Dodavanje kontrola za povezane uređaje"</string>
     <string name="quick_controls_setup_title" msgid="8901436655997849822">"Postavljanje kontrola uređaja"</string>
     <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"Dulje pritisnite tipku za uključivanje/isključivanje da biste pristupili kontrolama"</string>
@@ -1022,10 +1028,8 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"Kontrole"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Odaberite kontrole kojima želite pristupati iz izbornika napajanja"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Zadržite i povucite da biste promijenili raspored kontrola"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"Sve su kontrole uklonjene"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"Popis svih kontrola nije se učitao."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Drugo"</string>
     <string name="controls_dialog_title" msgid="2343565267424406202">"Dodavanje kontrolama uređaja"</string>
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
index 76c3445..b5e6474 100644
--- a/packages/SystemUI/res/values-hu/strings.xml
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"Nem menthet képernyőképet, mert kevés a tárhely"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Az alkalmazás vagy az Ön szervezete nem engedélyezi képernyőkép készítését"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Képernyőkép elvetése"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"Képernyőkép megnyitása"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"Képernyőkép előnézete"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"Képernyőrögzítő"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Folyamatban lévő értesítés képernyőrögzítési munkamenethez"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"Elindítja a felvételt?"</string>
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"Buborék"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"Hangjelzés és rezgés nélkül segít a koncentrálásban."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"Figyelemfelkeltő a hangjelzésnek és rezgésnek köszönhetően."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"Figyelemfelkeltő a hangjelzésnek és rezgésnek köszönhetően. A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> alkalmazásban lévő beszélgetések alapértelmezés szerint buborékban jelennek meg."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"A tartalomra mutató lebegő parancsikon segítségével tartja fenn az Ön figyelmét."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"A beszélgetések szakaszának tetején, buborékként jelenik meg."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"A(z) <xliff:g id="APP_NAME_0">%1$s</xliff:g> összes beszélgetése buborékként jelenik meg alapértelmezés szerint. Ezt a következőben kezelheti: <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Beállítások"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioritás"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Nincsenek buborékok a közelmúltból"</string>
@@ -962,7 +962,7 @@
     <string name="running_foreground_services_title" msgid="5137313173431186685">"A háttérben még futnak alkalmazások"</string>
     <string name="running_foreground_services_msg" msgid="3009459259222695385">"Koppintson az akkumulátor- és adathasználat részleteinek megtekintéséhez"</string>
     <string name="mobile_data_disable_title" msgid="5366476131671617790">"Kikapcsolja a mobiladatokat?"</string>
-    <string name="mobile_data_disable_message" msgid="8604966027899770415">"Nem lesz adat-, illetve internet-hozzáférése <xliff:g id="CARRIER">%s</xliff:g> szolgáltatón keresztül. Az internethez csak Wi-Fi-n keresztül csatlakozhat."</string>
+    <string name="mobile_data_disable_message" msgid="8604966027899770415">"Nem lesz adat-, illetve internet-hozzáférése a(z) <xliff:g id="CARRIER">%s</xliff:g> szolgáltatón keresztül. Az internethez csak Wi-Fi-n keresztül csatlakozhat."</string>
     <string name="mobile_data_disable_message_default_carrier" msgid="6496033312431658238">"saját mobilszolgáltató"</string>
     <string name="touch_filtered_warning" msgid="8119511393338714836">"Mivel az egyik alkalmazás eltakarja az engedélykérést, a Beállítások alkalmazás nem tudja ellenőrizni az Ön válaszát."</string>
     <string name="slice_permission_title" msgid="3262615140094151017">"Engedélyezi a(z) <xliff:g id="APP_0">%1$s</xliff:g> alkalmazásnak, hogy részleteket mutasson a(z) <xliff:g id="APP_2">%2$s</xliff:g> alkalmazásból?"</string>
@@ -999,9 +999,16 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Buborékok vezérlése bármikor"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"A Kezelés gombra koppintva kapcsolhatja ki az alkalmazásból származó buborékokat"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Értem"</string>
+    <!-- no translation found for bubbles_app_settings (5779443644062348657) -->
+    <skip />
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"A rendszer-navigáció módja megváltozott. Módosításához nyissa meg a Beállításokat."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"A rendszer-navigációs lehetőségeket a Beállításokban módosíthatja"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Készenléti mód"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"A beszélgetések szakaszának tetején jelennek meg"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Megjelenítik a profilképet a lezárási képernyőn"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Buborékként jelennek meg az alkalmazások felett"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Megszakítják a Ne zavarjanak módot"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Értem"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"Nagyítási fedvény ablaka"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"Nagyítás ablaka"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"Nagyítási vezérlők ablaka"</string>
@@ -1016,10 +1023,8 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"Vezérlők"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"A bekapcsológomb menüjéből hozzáférhető vezérlők kiválasztása"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Tartsa lenyomva, és húzza a vezérlők átrendezéséhez"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"Minden vezérlő eltávolítva"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"Nem sikerült betölteni az összes vezérlő listáját."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Más"</string>
     <string name="controls_dialog_title" msgid="2343565267424406202">"Hozzáadás az eszközvezérlőkhöz"</string>
diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml
index d625bb3..f2ec4b9 100644
--- a/packages/SystemUI/res/values-hy/strings.xml
+++ b/packages/SystemUI/res/values-hy/strings.xml
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"Չհաջողվեց պահել սքրինշոթը անբավարար հիշողության պատճառով"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Հավելվածը կամ ձեր կազմակերպությունը չի թույլատրում սքրինշոթի ստացումը"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Փակել սքրինշոթը"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"Բացել սքրինշոթը"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"Սքրինշոթի նախադիտում"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"Էկրանի տեսագրիչ"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Էկրանի տեսագրման աշխատաշրջանի ընթացիկ ծանուցում"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"Սկսե՞լ տեսագրումը"</string>
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"Պղպջակ"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"Ծանուցումները գալիս են առանց ձայնի և թրթռոցի։"</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"Ծանուցումները գալիս են ձայնով կամ թրթռոցով։"</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"Ծանուցումները գալիս են ձայնով կամ թրթռոցով։ <xliff:g id="APP_NAME">%1$s</xliff:g>-ի զրույցներն ըստ կանխադրման հայտնվում են ամպիկների տեսքով։"</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Լողացող դյուրանցման միջոցով ձեր ուշադրությունն է գրավում բովանդակության նկատմամբ"</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Ցուցադրվում է «Խոսակցություններ» բաժնում և հայտնվում է ամպիկի տեսքով։"</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> հավելվածի բոլոր խոսակցություններն ըստ կանխադրման ցուցադրվում են ամպիկի տեսքով։ Փոփոխելու համար անցեք <xliff:g id="APP_NAME_1">%2$s</xliff:g>։"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Կարգավորումներ"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Կարևոր"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Վերջին ամպիկներ չկան"</string>
@@ -999,15 +999,22 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Ամպիկների կարգավորումներ"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Հպեք «Կառավարել» կոճակին՝ այս հավելվածի ամպիկներն անջատելու համար։"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Եղավ"</string>
+    <!-- no translation found for bubbles_app_settings (5779443644062348657) -->
+    <skip />
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Համակարգի նավիգացիան թարմացվեց: Փոփոխություններ անելու համար անցեք կարգավորումներ:"</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Թարմացրեք համակարգի նավիգացիան կարգավորումներում"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Սպասման ռեժիմ"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Ցուցադրվում են «Խոսակցություններ» բաժնի վերևում"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Ցուցադրում են պրոֆիլի նկարը կողպէկրանին"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Հայտնվում են որպես լողացող ամպիկ հավելվածների վրայից"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Ընդհատում են «Չանհանգստացնել» ռեժիմը"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Եղավ"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"Խոշորացման պատուհանի վրադրում"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"Խոշորացման պատուհան"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"Խոշորացման պատուհանի կառավարման տարրեր"</string>
-    <string name="quick_controls_title" msgid="6839108006171302273">"Սարքի կառավարման տարրեր"</string>
+    <string name="quick_controls_title" msgid="6839108006171302273">"Սարքերի կառավարման տարրեր"</string>
     <string name="quick_controls_subtitle" msgid="1667408093326318053">"Ավելացրեք կառավարման տարրեր ձեր միացված սարքերի համար"</string>
-    <string name="quick_controls_setup_title" msgid="8901436655997849822">"Սարքի կառավարման տարրերի կարգավորում"</string>
+    <string name="quick_controls_setup_title" msgid="8901436655997849822">"Սարքերի կառավարման տարրերի կարգավորում"</string>
     <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"Սեղմած պահեք սնուցման կոճակը՝ կառավարման տարրերը բացելու համար"</string>
     <string name="controls_providers_title" msgid="6879775889857085056">"Ընտրեք հավելված` կառավարման տարրեր ավելացնելու համար"</string>
     <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380">
@@ -1020,7 +1027,7 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"Կառավարման բոլոր տարրերը հեռացվեցին"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"Չհաջողվեց բեռնել բոլոր կառավարների ցանկը։"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Այլ"</string>
-    <string name="controls_dialog_title" msgid="2343565267424406202">"Ավելացրեք սարքի կառավարման տարրերում"</string>
+    <string name="controls_dialog_title" msgid="2343565267424406202">"Ավելացրեք սարքերի կառավարման տարրերում"</string>
     <string name="controls_dialog_ok" msgid="7011816381344485651">"Ավելացնել ընտրանիում"</string>
     <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> հավելվածն առաջարկում է ավելացնել այս կառավարը ձեր ընտրանիում։"</string>
     <string name="controls_dialog_confirmation" msgid="586517302736263447">"Կառավարման տարրերը թարմացվեցին"</string>
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index 3f6cbb4..f9126db 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"Tidak dapat menyimpan screenshot karena ruang penyimpanan terbatas"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Mengambil screenshot tidak diizinkan oleh aplikasi atau organisasi"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Menutup screenshot"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"Membuka screenshot"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"Pratinjau screenshot"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"Perekam Layar"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notifikasi yang sedang berjalan untuk sesi rekaman layar"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"Mulai Merekam?"</string>
@@ -305,8 +305,8 @@
     <string name="accessibility_quick_settings_work_mode_on" msgid="2779253456042059110">"Mode kerja aktif."</string>
     <string name="accessibility_quick_settings_work_mode_changed_off" msgid="6256690740556798683">"Mode kerja dinonaktifkan."</string>
     <string name="accessibility_quick_settings_work_mode_changed_on" msgid="1105258550138313384">"Mode kerja diaktifkan."</string>
-    <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"Penghemat Kuota nonaktif."</string>
-    <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"Penghemat Kuota diaktifkan."</string>
+    <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"Penghemat Data nonaktif."</string>
+    <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"Penghemat Data diaktifkan."</string>
     <string name="accessibility_quick_settings_sensor_privacy_changed_off" msgid="7608378211873807353">"Privasi Sensor dinonaktifkan."</string>
     <string name="accessibility_quick_settings_sensor_privacy_changed_on" msgid="4267393685085328801">"Privasi Sensor diaktifkan."</string>
     <string name="accessibility_brightness" msgid="5391187016177823721">"Kecerahan tampilan"</string>
@@ -397,7 +397,7 @@
     <string name="quick_settings_tethering_label" msgid="5257299852322475780">"Menambatkan"</string>
     <string name="quick_settings_hotspot_label" msgid="1199196300038363424">"Hotspot"</string>
     <string name="quick_settings_hotspot_secondary_label_transient" msgid="7585604088079160564">"Mengaktifkan…"</string>
-    <string name="quick_settings_hotspot_secondary_label_data_saver_enabled" msgid="1280433136266439372">"Penghemat Kuota aktif"</string>
+    <string name="quick_settings_hotspot_secondary_label_data_saver_enabled" msgid="1280433136266439372">"Penghemat Data aktif"</string>
     <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="3142308865165871976">
       <item quantity="other">%d perangkat</item>
       <item quantity="one">%d perangkat</item>
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"Balon"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"Membantu Anda tetap fokus tanpa suara atau getaran."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"Menarik perhatian Anda dengan suara atau getaran."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"Menarik perhatian Anda dengan suara atau getaran. Percakapan dari balon <xliff:g id="APP_NAME">%1$s</xliff:g> secara default."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Menjaga perhatian dengan pintasan floating ke konten ini."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Muncul di atas bagian percakapan dan ditampilkan sebagai balon."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"Semua percakapan <xliff:g id="APP_NAME_0">%1$s</xliff:g> menggunakan balon secara default. Kelola di <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Setelan"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioritas"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Tidak ada balon baru-baru ini"</string>
@@ -814,9 +814,9 @@
     <string name="accessibility_long_click_tile" msgid="210472753156768705">"Buka setelan"</string>
     <string name="accessibility_status_bar_headphones" msgid="1304082414912647414">"Headphone terhubung"</string>
     <string name="accessibility_status_bar_headset" msgid="2699275863720926104">"Headset terhubung"</string>
-    <string name="data_saver" msgid="3484013368530820763">"Penghemat Kuota"</string>
-    <string name="accessibility_data_saver_on" msgid="5394743820189757731">"Penghemat Kuota aktif"</string>
-    <string name="accessibility_data_saver_off" msgid="58339669022107171">"Penghemat Kuota nonaktif"</string>
+    <string name="data_saver" msgid="3484013368530820763">"Penghemat Data"</string>
+    <string name="accessibility_data_saver_on" msgid="5394743820189757731">"Penghemat Data aktif"</string>
+    <string name="accessibility_data_saver_off" msgid="58339669022107171">"Penghemat Data nonaktif"</string>
     <string name="switch_bar_on" msgid="1770868129120096114">"Aktif"</string>
     <string name="switch_bar_off" msgid="5669805115416379556">"Nonaktif"</string>
     <string name="tile_unavailable" msgid="3095879009136616920">"Tidak tersedia"</string>
@@ -961,7 +961,7 @@
     <string name="qs_dnd_replace" msgid="7712119051407052689">"Ganti"</string>
     <string name="running_foreground_services_title" msgid="5137313173431186685">"Aplikasi yang sedang berjalan di latar belakang"</string>
     <string name="running_foreground_services_msg" msgid="3009459259222695385">"Ketuk untuk melihat detail penggunaan baterai dan data"</string>
-    <string name="mobile_data_disable_title" msgid="5366476131671617790">"Nonaktifkan kuota?"</string>
+    <string name="mobile_data_disable_title" msgid="5366476131671617790">"Nonaktifkan data seluler?"</string>
     <string name="mobile_data_disable_message" msgid="8604966027899770415">"Anda tidak akan dapat mengakses data atau internet melalui <xliff:g id="CARRIER">%s</xliff:g>. Internet hanya akan tersedia melalui Wi-Fi."</string>
     <string name="mobile_data_disable_message_default_carrier" msgid="6496033312431658238">"Operator Seluler Anda"</string>
     <string name="touch_filtered_warning" msgid="8119511393338714836">"Karena sebuah aplikasi menghalangi permintaan izin, Setelan tidak dapat memverifikasi respons Anda."</string>
@@ -999,9 +999,15 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Kontrol balon kapan saja"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Ketuk Kelola untuk menonaktifkan balon dari aplikasi ini"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Oke"</string>
+    <string name="bubbles_app_settings" msgid="5779443644062348657">"Setelan <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Navigasi sistem diupdate. Untuk melakukan perubahan, buka Setelan."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Buka Setelan untuk mengupdate navigasi sistem"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Siaga"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Muncul di atas bagian percakapan"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Menampilkan gambar profil di layar kunci"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Muncul sebagai balon mengambang di atas aplikasi"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Mengganggu fitur Jangan Ganggu"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Oke"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"Jendela Overlay Pembesaran"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"Jendela Pembesaran"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"Kontrol Jendela Pembesaran"</string>
@@ -1016,10 +1022,8 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"Kontrol"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Pilih kontrol yang akan diakses dari menu daya"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Tahan &amp; tarik untuk mengatur ulang kontrol"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"Semua kontrol dihapus"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"Daftar semua kontrol tidak dapat dimuat."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Lainnya"</string>
     <string name="controls_dialog_title" msgid="2343565267424406202">"Tambahkan ke kontrol perangkat"</string>
diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml
index 2dad050..e8e5b7a 100644
--- a/packages/SystemUI/res/values-is/strings.xml
+++ b/packages/SystemUI/res/values-is/strings.xml
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"Ekki tókst að vista skjámynd vegna takmarkaðs geymslupláss"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Forritið eða fyrirtækið þitt leyfir ekki skjámyndatöku"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Loka skjámynd"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"Opna skjámynd"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"Forskoðun skjámyndar"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"Skjáupptaka"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Áframhaldandi tilkynning fyrir skjáupptökulotu"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"Hefja upptöku?"</string>
@@ -500,7 +500,7 @@
     <string name="battery_saver_notification_text" msgid="2617841636449016951">"Dregur úr afköstum og bakgrunnsgögnum"</string>
     <string name="battery_saver_notification_action_text" msgid="6022091913807026887">"Slökkva á rafhlöðusparnaði"</string>
     <string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> mun hafa aðgang að öllum upplýsingum sem sjást á skjánum eða eru spilaðar í tækinu á meðan upptaka eða útsending er í gangi. Þar á meðal eru upplýsingar á borð við aðgangsorð, greiðsluupplýsingar, myndir, skilaboð og hljóð sem þú spilar."</string>
-    <string name="media_projection_dialog_service_text" msgid="958000992162214611">"Þjónustan sem býður upp á þennan eiginleika mun hafa aðgang að öllum upplýsingum sem sjást á skjánum eða eru spilaðar í tækinu á meðan upptaka eða útsending er í gangi. Þar á meðal eru upplýsingar á borð við aðgangsorð, greiðsluupplýsingar, myndir, skilaboð og hljóð sem þú spilar."</string>
+    <string name="media_projection_dialog_service_text" msgid="958000992162214611">"Þjónustan sem býður upp á þennan eiginleika fær aðgang að öllum upplýsingum sem sjást á skjánum eða eru spilaðar í tækinu á meðan upptaka eða útsending er í gangi, þar á meðal aðgangsorði, greiðsluupplýsingum, myndum, skilaboðum og hljóðefni sem þú spilar."</string>
     <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"Viltu hefja upptöku eða útsendingu?"</string>
     <string name="media_projection_dialog_title" msgid="3316063622495360646">"Viltu hefja upptöku eða útsendingu með <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string>
     <string name="media_projection_remember_text" msgid="6896767327140422951">"Ekki sýna þetta aftur"</string>
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"Blaðra"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"Auðveldar þér að einbeita þér án hljóðs eða titrings."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"Fangar athygli þína með hljóði eða titringi."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"Fangar athygli þína með hljóði eða titringi. Samtöl á <xliff:g id="APP_NAME">%1$s</xliff:g> birtast sjálfkrafa í blöðru."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Fangar athygli þína með fljótandi flýtileið á þetta efni."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Sýnt sem blaðra efst í samtali."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"Öll samtöl frá <xliff:g id="APP_NAME_0">%1$s</xliff:g> birtast sjálfkrafa í blöðru. Stjórna í <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Áfram"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Forgangur"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Engar nýlegar blöðrur"</string>
@@ -999,15 +999,22 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Hægt er að stjórna blöðrum hvenær sem er"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Ýttu á „Stjórna“ til að slökkva á blöðrum frá þessu forriti"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Ég skil"</string>
+    <!-- no translation found for bubbles_app_settings (5779443644062348657) -->
+    <skip />
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Kerfisstjórnun uppfærð. Þú getur breytt þessu í stillingunum."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Farðu í stillingar til að uppfæra kerfisstjórnun"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Biðstaða"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Sýna yfir samtalshluta"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Sýna prófílmynd á lásskjá"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Birta sem fljótandi blöðru yfir forritum"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Stöðva „Ónáðið ekki“"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Ég skil"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"Stækkun yfirglugga"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"Stækkunargluggi"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"Stækkunarstillingar glugga"</string>
-    <string name="quick_controls_title" msgid="6839108006171302273">"Tækjastýringar"</string>
+    <string name="quick_controls_title" msgid="6839108006171302273">"Tækjastjórnun"</string>
     <string name="quick_controls_subtitle" msgid="1667408093326318053">"Bæta við stýringum fyrir tengd tæki"</string>
-    <string name="quick_controls_setup_title" msgid="8901436655997849822">"Setja upp tækjastýringar"</string>
+    <string name="quick_controls_setup_title" msgid="8901436655997849822">"Setja upp tækjastjórnun"</string>
     <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"Haltu inni aflrofanum til að sjá stýringarnar þínar"</string>
     <string name="controls_providers_title" msgid="6879775889857085056">"Veldu forrit til að bæta við stýringum"</string>
     <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380">
@@ -1016,13 +1023,11 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"Stýringar"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Veldu hvaða stýringar birtast í aflrofavalmyndinni"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Haltu og dragðu til að endurraða stýringum"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"Allar stýringar fjarlægðar"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"Ekki tókst að hlaða lista yfir allar stýringar."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Annað"</string>
-    <string name="controls_dialog_title" msgid="2343565267424406202">"Bæta við tækjastýringar"</string>
+    <string name="controls_dialog_title" msgid="2343565267424406202">"Bæta við tækjastjórnun"</string>
     <string name="controls_dialog_ok" msgid="7011816381344485651">"Bæta við uppáhald"</string>
     <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> stakk upp á að bæta þessari stýringu við uppáhald."</string>
     <string name="controls_dialog_confirmation" msgid="586517302736263447">"Stýringar uppfærðar"</string>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index 587e94b..c4b167b 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"Impossibile salvare lo screenshot a causa dello spazio di archiviazione limitato"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"L\'acquisizione di screenshot non è consentita dall\'app o dall\'organizzazione"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Ignora screenshot"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"Apri screenshot"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"Anteprima screenshot"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"Registrazione dello schermo"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notifica costante per una sessione di registrazione dello schermo"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"Avviare la registrazione?"</string>
@@ -210,7 +210,7 @@
     <string name="accessibility_three_bars" msgid="819417766606501295">"Tre barre."</string>
     <string name="accessibility_signal_full" msgid="5920148525598637311">"Massimo segnale."</string>
     <string name="accessibility_desc_on" msgid="2899626845061427845">"ON"</string>
-    <string name="accessibility_desc_off" msgid="8055389500285421408">"OFF"</string>
+    <string name="accessibility_desc_off" msgid="8055389500285421408">"Off"</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"Connesso."</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"Connessione in corso."</string>
     <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
@@ -231,7 +231,7 @@
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"Dati mobili attivati"</string>
     <string name="cell_data_off_content_description" msgid="9165555931499878044">"Dati mobili disattivati"</string>
     <string name="not_default_data_content_description" msgid="6757881730711522517">"Non impostato per l\'utilizzo dei dati"</string>
-    <string name="cell_data_off" msgid="4886198950247099526">"OFF"</string>
+    <string name="cell_data_off" msgid="4886198950247099526">"Off"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"Tethering Bluetooth."</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"Modalità aereo."</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN attiva."</string>
@@ -427,7 +427,7 @@
     <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
     <string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC non attiva"</string>
     <string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC attiva"</string>
-    <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Registrazione dello schermo"</string>
+    <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Registrazione schermo"</string>
     <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Inizia"</string>
     <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Interrompi"</string>
     <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Scorri verso l\'alto per passare ad altre app"</string>
@@ -680,7 +680,7 @@
     <string name="do_not_silence_block" msgid="4361847809775811849">"Non silenziare e non bloccare"</string>
     <string name="tuner_full_importance_settings" msgid="1388025816553459059">"Controlli di gestione delle notifiche"</string>
     <string name="tuner_full_importance_settings_on" msgid="917981436602311547">"On"</string>
-    <string name="tuner_full_importance_settings_off" msgid="5580102038749680829">"OFF"</string>
+    <string name="tuner_full_importance_settings_off" msgid="5580102038749680829">"Off"</string>
     <string name="power_notification_controls_description" msgid="1334963837572708952">"I controlli di gestione delle notifiche ti consentono di impostare un livello di importanza compreso tra 0 e 5 per le notifiche di un\'app. \n\n"<b>"Livello 5"</b>" \n- Mostra in cima all\'elenco di notifiche \n- Consenti l\'interruzione a schermo intero \n- Visualizza sempre \n\n"<b>"Livello 4"</b>" \n- Impedisci l\'interruzione a schermo intero \n- Visualizza sempre \n\n"<b>"Livello 3"</b>" \n- Impedisci l\'interruzione a schermo intero \n- Non visualizzare mai \n\n"<b>"Livello 2"</b>" \n- Impedisci l\'interruzione a schermo intero \n- Non visualizzare mai \n- Non emettere mai suoni e vibrazioni \n\n"<b>"Livello 1"</b>" \n- Impedisci l\'interruzione a schermo intero \n- Non visualizzare mai \n- Non emettere mai suoni e vibrazioni \n- Nascondi da schermata di blocco e barra di stato \n- Mostra in fondo all\'elenco di notifiche \n\n"<b>"Livello 0"</b>" \n- Blocca tutte le notifiche dell\'app"</string>
     <string name="notification_header_default_channel" msgid="225454696914642444">"Notifiche"</string>
     <string name="notification_channel_disabled" msgid="928065923928416337">"Non vedrai più queste notifiche"</string>
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"Fumetto"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"Favorisce la tua concentrazione grazie all\'assenza di suono o vibrazione."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"Richiama la tua attenzione con suono o vibrazione."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"Richiama la tua attenzione con suono o vibrazione. Conversazioni dalla bolla <xliff:g id="APP_NAME">%1$s</xliff:g> 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_priority" msgid="7415770044553264622">"Appare in cima alla sezione delle conversazioni sotto forma di bolla."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"Per impostazione predefinita, tutte le conversazioni di <xliff:g id="APP_NAME_0">%1$s</xliff:g> vengono mostrate come bolle. Gestisci in <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Impostazioni"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Priorità"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Nessuna bolla recente"</string>
@@ -818,7 +818,7 @@
     <string name="accessibility_data_saver_on" msgid="5394743820189757731">"Risparmio dati attivo"</string>
     <string name="accessibility_data_saver_off" msgid="58339669022107171">"Risparmio dati disattivato"</string>
     <string name="switch_bar_on" msgid="1770868129120096114">"On"</string>
-    <string name="switch_bar_off" msgid="5669805115416379556">"OFF"</string>
+    <string name="switch_bar_off" msgid="5669805115416379556">"Off"</string>
     <string name="tile_unavailable" msgid="3095879009136616920">"Non disponibile"</string>
     <string name="nav_bar" msgid="4642708685386136807">"Barra di navigazione"</string>
     <string name="nav_bar_layout" msgid="4716392484772899544">"Layout"</string>
@@ -847,8 +847,8 @@
     <string name="right_keycode" msgid="2480715509844798438">"Keycode destra"</string>
     <string name="left_icon" msgid="5036278531966897006">"Icona sinistra"</string>
     <string name="right_icon" msgid="1103955040645237425">"Icona destra"</string>
-    <string name="drag_to_add_tiles" msgid="8933270127508303672">"Tieni premuto e trascina per aggiungere riquadri"</string>
-    <string name="drag_to_rearrange_tiles" msgid="2143204300089638620">"Tieni premuto e trascina per riordinare i riquadri"</string>
+    <string name="drag_to_add_tiles" msgid="8933270127508303672">"Tieni premuto e trascina per aggiungere icone"</string>
+    <string name="drag_to_rearrange_tiles" msgid="2143204300089638620">"Tieni premuto e trascina per riordinare le icone"</string>
     <string name="drag_to_remove_tiles" msgid="4682194717573850385">"Trascina qui per rimuovere"</string>
     <string name="drag_to_remove_disabled" msgid="933046987838658850">"Occorrono almeno <xliff:g id="MIN_NUM_TILES">%1$d</xliff:g> schede"</string>
     <string name="qs_edit" msgid="5583565172803472437">"Modifica"</string>
@@ -999,15 +999,21 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Controlla le bolle in qualsiasi momento"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Tocca Gestisci per disattivare le bolle dall\'app"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"OK"</string>
+    <string name="bubbles_app_settings" msgid="5779443644062348657">"Impostazioni <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Navigazione del sistema aggiornata. Per apportare modifiche, usa le Impostazioni."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Usa le Impostazioni per aggiornare la navigazione del sistema"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Standby"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Appaiono in cima alla sezione delle conversazioni"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Mostrano immagine profilo in schermata di blocco"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Vengono mostrate come bolle mobili sopra le app"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Interrompono la modalità Non disturbare"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"OK"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"Finestra overlay ingrandimento"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"Finestra ingrandimento"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"Finestra controlli di ingrandimento"</string>
-    <string name="quick_controls_title" msgid="6839108006171302273">"Controlli del dispositivo"</string>
+    <string name="quick_controls_title" msgid="6839108006171302273">"Controllo dei dispositivi"</string>
     <string name="quick_controls_subtitle" msgid="1667408093326318053">"Aggiungi controlli per i dispositivi connessi"</string>
-    <string name="quick_controls_setup_title" msgid="8901436655997849822">"Configura i controlli del dispositivo"</string>
+    <string name="quick_controls_setup_title" msgid="8901436655997849822">"Configura il controllo dei dispositivi"</string>
     <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"Tieni premuto il tasto di accensione per accedere ai controlli"</string>
     <string name="controls_providers_title" msgid="6879775889857085056">"Scegli un\'app per aggiungere controlli"</string>
     <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380">
@@ -1016,13 +1022,11 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"Controlli"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Seleziona i controlli a cui accedere dal menu di accensione"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Tieni premuto e trascina per riordinare i controlli"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"Tutti i controlli sono stati rimossi"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"Impossibile caricare l\'elenco di tutti i controlli."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Altro"</string>
-    <string name="controls_dialog_title" msgid="2343565267424406202">"Aggiungi ai controlli del dispositivo"</string>
+    <string name="controls_dialog_title" msgid="2343565267424406202">"Aggiungi al controllo dei dispositivi"</string>
     <string name="controls_dialog_ok" msgid="7011816381344485651">"Aggiungi ai preferiti"</string>
     <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> ha suggerito di aggiungere questo controllo ai preferiti."</string>
     <string name="controls_dialog_confirmation" msgid="586517302736263447">"Controlli aggiornati"</string>
diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml
index b6f445d..894bb03 100644
--- a/packages/SystemUI/res/values-iw/strings.xml
+++ b/packages/SystemUI/res/values-iw/strings.xml
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"לא היה מספיק מקום לשמור את צילום המסך"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"האפליקציה או הארגון שלך אינם מתירים ליצור צילומי מסך"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"סגירת צילום מסך"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"פתיחת צילום מסך"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"תצוגה מקדימה של צילום מסך"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"מקליט המסך"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"התראה מתמשכת לסשן הקלטת מסך"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"להתחיל את ההקלטה?"</string>
@@ -713,9 +713,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"בועה"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"עוזרת להתרכז ללא צלילים או רטט."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"מעוררת תשומת לב באמצעות צלילים או רטט."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"מעוררת תשומת לב באמצעות צלילים או רטט. שיחות מהאפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> מופיעות בבועות כברירת מחדל."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"מעוררת תשומת לב באמצעות קיצור דרך צף לתוכן הזה."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"מוצגת בחלק העליון של קטע השיחה ומופיעה כבועה."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"כל השיחות מהאפליקציה <xliff:g id="APP_NAME_0">%1$s</xliff:g> מופיעות בבועות כברירת מחדל. ניתן לנהל באפליקציה <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"הגדרות"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"עדיפות"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"אין בועות מהזמן האחרון"</string>
@@ -1009,15 +1009,22 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"שליטה בבועות, בכל זמן"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"יש להקיש על \'ניהול\' כדי להשבית את הבועות מהאפליקציה הזו"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"הבנתי"</string>
+    <!-- no translation found for bubbles_app_settings (5779443644062348657) -->
+    <skip />
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"הניווט במערכת עודכן. אפשר לערוך שינויים דרך ההגדרות."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"יש לעבור להגדרות כדי לעדכן את הניווט במערכת"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"המתנה"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"מופיעות בחלק העליון של קטע השיחות"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"מציגות תמונת פרופיל במסך הנעילה"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"מופיעות כבועה צפה מעל האפליקציות שלך"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"גוברות על ההגדרה \'נא לא להפריע\'"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"הבנתי"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"חלון ליצירת שכבת-על להגדלה"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"חלון הגדלה"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"בקרות של חלון ההגדלה"</string>
-    <string name="quick_controls_title" msgid="6839108006171302273">"פקדי המכשיר"</string>
+    <string name="quick_controls_title" msgid="6839108006171302273">"פקדי מכשירים"</string>
     <string name="quick_controls_subtitle" msgid="1667408093326318053">"יש להוסיף פקדים למכשירים המחוברים"</string>
-    <string name="quick_controls_setup_title" msgid="8901436655997849822">"הגדרה של פקדי המכשיר"</string>
+    <string name="quick_controls_setup_title" msgid="8901436655997849822">"הגדרה של פקדי מכשירים"</string>
     <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"יש ללחוץ לחיצה ארוכה על לחצן ההפעלה כדי לגשת לבקרים"</string>
     <string name="controls_providers_title" msgid="6879775889857085056">"יש לבחור אפליקציה כדי להוסיף פקדים"</string>
     <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380">
@@ -1028,13 +1035,11 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"פקדים"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"יש לבחור פקדים לגישה מתפריט ההפעלה"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"יש ללחוץ לחיצה ארוכה ולגרור כדי לארגן מחדש את הפקדים"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"כל הפקדים הוסרו"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"לא ניתן היה לטעון את הרשימה של כל הפקדים."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"אחר"</string>
-    <string name="controls_dialog_title" msgid="2343565267424406202">"הוספה לפקדי המכשיר"</string>
+    <string name="controls_dialog_title" msgid="2343565267424406202">"הוספה לפקדי המכשירים"</string>
     <string name="controls_dialog_ok" msgid="7011816381344485651">"הוספה למועדפים"</string>
     <string name="controls_dialog_message" msgid="6292099631702047540">"בקרה זו הוצעה על ידי <xliff:g id="APP">%s</xliff:g> להוספה למועדפים."</string>
     <string name="controls_dialog_confirmation" msgid="586517302736263447">"הפקדים עודכנו"</string>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index 8a2b923..74e996b 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -57,11 +57,11 @@
     <string name="label_view" msgid="6815442985276363364">"表示"</string>
     <string name="always_use_device" msgid="210535878779644679">"<xliff:g id="USB_DEVICE">%2$s</xliff:g> を接続したら常に <xliff:g id="APPLICATION">%1$s</xliff:g> を起動する"</string>
     <string name="always_use_accessory" msgid="1977225429341838444">"<xliff:g id="USB_ACCESSORY">%2$s</xliff:g> を接続したら常に <xliff:g id="APPLICATION">%1$s</xliff:g> を起動する"</string>
-    <string name="usb_debugging_title" msgid="8274884945238642726">"USBデバッグを許可しますか?"</string>
+    <string name="usb_debugging_title" msgid="8274884945238642726">"USB デバッグを許可しますか?"</string>
     <string name="usb_debugging_message" msgid="5794616114463921773">"このパソコンのRSAキーのフィンガープリント:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
-    <string name="usb_debugging_always" msgid="4003121804294739548">"このパソコンからのUSBデバッグを常に許可する"</string>
+    <string name="usb_debugging_always" msgid="4003121804294739548">"このパソコンからの USB デバッグを常に許可する"</string>
     <string name="usb_debugging_allow" msgid="1722643858015321328">"許可"</string>
-    <string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USBデバッグは許可されていません"</string>
+    <string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB デバッグは許可されていません"</string>
     <string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"このデバイスに現在ログインしているユーザーでは、USB デバッグを ON にすることはできません。この機能を使用するには、メインユーザーに切り替えてください。"</string>
     <string name="wifi_debugging_title" msgid="7300007687492186076">"このネットワークでワイヤレス デバッグを許可しますか?"</string>
     <string name="wifi_debugging_message" msgid="5461204211731802995">"ネットワーク名(SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWi‑Fi アドレス(BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"空き容量が足りないため、スクリーンショットを保存できません"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"スクリーンショットの作成はアプリまたは組織で許可されていません"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"スクリーンショットを閉じます"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"スクリーンショットを開きます"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"スクリーンショットのプレビュー"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"スクリーン レコーダー"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"画面の録画セッション中の通知"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"録画を開始しますか?"</string>
@@ -384,7 +384,7 @@
     <string name="quick_settings_cast_device_default_name" msgid="6988469571141331700">"名前のないデバイス"</string>
     <string name="quick_settings_cast_device_default_description" msgid="2580520859212250265">"キャスト準備完了"</string>
     <string name="quick_settings_cast_detail_empty_text" msgid="2846282280014617785">"利用可能なデバイスがありません"</string>
-    <string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Wi-Fi に接続されていません"</string>
+    <string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Wi-Fi 未接続"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"画面の明るさ"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="2325362583903258677">"自動"</string>
     <string name="quick_settings_inversion_label" msgid="5078769633069667698">"色を反転"</string>
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"バブル"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"音やバイブレーションが作動しないため、通知に煩わされずに済みます。"</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"音やバイブレーションで通知をお知らせします。"</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"音やバイブレーションで通知をお知らせします。デフォルトでは <xliff:g id="APP_NAME">%1$s</xliff:g> からの会話がふきだしで表示されます。"</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"このコンテンツのフローティング ショートカットで通知をお知らせします。"</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"会話セクションの一番上にバブルとして表示されます。"</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"デフォルトでは <xliff:g id="APP_NAME_0">%1$s</xliff:g> からのすべての会話がバブルで表示されます。[<xliff:g id="APP_NAME_1">%2$s</xliff:g>] で管理します。"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"設定"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"優先度"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"最近閉じたバブルはありません"</string>
@@ -999,9 +999,15 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"いつでもバブルを管理"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"このアプリからのバブルをオフにするには、[管理] をタップしてください"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"OK"</string>
+    <string name="bubbles_app_settings" msgid="5779443644062348657">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> の設定"</string>
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"システム ナビゲーションを更新しました。変更するには [設定] に移動してください。"</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"システム ナビゲーションを更新するには [設定] に移動してください"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"スタンバイ"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"会話セクションの一番上にバブル表示"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"ロック画面にプロフィール写真を表示"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"他のアプリに重ねてフローティング バブルとして表示"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"サイレント モードに割り込み"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"OK"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"拡大オーバーレイ ウィンドウ"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"拡大ウィンドウ"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"拡大ウィンドウ コントロール"</string>
diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml
index 99b10c1..d1b3334 100644
--- a/packages/SystemUI/res/values-ka/strings.xml
+++ b/packages/SystemUI/res/values-ka/strings.xml
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"ეკრანის ანაბეჭდის შენახვა ვერ მოხერხდა შეზღუდული მეხსიერების გამო"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"ეკრანის ანაბეჭდების შექმნა არ არის ნებადართული აპის ან თქვენი ორგანიზაციის მიერ"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"ეკრანის ანაბეჭდის დახურვა"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"ეკრანის ანაბეჭდის გახსნა"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"ეკრანის ანაბეჭდის გადახედვა"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"ეკრანის ჩამწერი"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"უწყვეტი შეტყობინება ეკრანის ჩაწერის სესიისთვის"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"დაიწყოს ჩაწერა?"</string>
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"ბუშტი"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"გეხმარებათ ფოკუსირებაში ხმის ან ვიბრაციის უქონლობის გამო."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"იპყრობს თქვენს ყურადღებას ხმით ან ვიბრაციით."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"იპყრობს თქვენს ყურადღებას ხმით ან ვიბრაციით. მიმოწერები <xliff:g id="APP_NAME">%1$s</xliff:g>-ის ბუშტიდან, ნაგულისხმევად."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"იპყრობს თქვენს ყურადღებას ამ კონტენტის მოლივლივე მალსახმობით."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"გამოჩნდება საუბრის სექციის ზედა ნაწილში ბუშტის სახით."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"ყველა საუბარი <xliff:g id="APP_NAME_0">%1$s</xliff:g>-დან ნაგულისხმევად გამოჩნდება ბუშტის სახით. <xliff:g id="APP_NAME_1">%2$s</xliff:g>-ში მართვა."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"პარამეტრები"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"პრიორიტეტი"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"ბოლო დროს გამოყენებული ბუშტები არ არის"</string>
@@ -999,9 +999,15 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"ბუშტების ნებისმიერ დროს გაკონტროლება"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"ამ აპის ბუშტების გამოსართავად შეეხეთ „მართვას“"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"გასაგებია"</string>
+    <string name="bubbles_app_settings" msgid="5779443644062348657">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>-ის პარამეტრები"</string>
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"სისტემური ნავიგაცია განახლდა. ცვლილებების შესატანად გადადით პარამეტრებზე."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"სისტემური ნავიგაციის გასაახლებლად გადადით პარამეტრებზე"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"მოლოდინის რეჟიმი"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"მიმოწერის სექციის ზემოთ ჩვენება"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"ჩაკეტილ ეკრანზე პროფილის სურათის ჩვენება"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"გამოჩნდება მოლივლივე ბუშტის სახით აპების ზემოდან"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"„არ შემაწუხოთ“ რეჟიმის შეწყვეტა"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"გასაგებია"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"გადიდების გადაფარვის ფანჯარა"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"გადიდების ფანჯარა"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"გადიდების კონტროლის ფანჯარა"</string>
@@ -1016,10 +1022,8 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"მართვის საშუალებები"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"აირჩიეთ მართვის საშუალებები ელკვების მენიუდან"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"მართვის საშუალებების გადაწყობა შეგიძლიათ მათი ჩავლებით გადატანით"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"მართვის ყველა საშუალება ამოიშალა"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"მართვის ყველა საშუალების სია ვერ ჩაიტვირთა."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"სხვა"</string>
     <string name="controls_dialog_title" msgid="2343565267424406202">"მოწყობილ. მართვის საშუალებებში დამატება"</string>
diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml
index dd8ecc4..82f7753 100644
--- a/packages/SystemUI/res/values-kk/strings.xml
+++ b/packages/SystemUI/res/values-kk/strings.xml
@@ -33,7 +33,7 @@
     <string name="invalid_charger_title" msgid="938685362320735167">"USB арқылы зарядтау мүмкін емес"</string>
     <string name="invalid_charger_text" msgid="2339310107232691577">"Құрылғымен бірге берілген зарядтау құралын пайдаланыңыз"</string>
     <string name="battery_low_why" msgid="2056750982959359863">"Параметрлер"</string>
-    <string name="battery_saver_confirmation_title" msgid="1234998463717398453">"Battery Saver функциясы қосылсын ба?"</string>
+    <string name="battery_saver_confirmation_title" msgid="1234998463717398453">"Battery Saver функциясын қосу керек пе?"</string>
     <string name="battery_saver_confirmation_title_generic" msgid="2299231884234959849">"Battery Saver туралы ақпарат"</string>
     <string name="battery_saver_confirmation_ok" msgid="5042136476802816494">"Қосу"</string>
     <string name="battery_saver_start_action" msgid="4553256017945469937">"Battery saver функциясын қосу"</string>
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"Жадтағы шектеулі бос орынға байланысты скриншот сақталмайды"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Қолданба немесе ұйым скриншоттар түсіруге рұқсат етпейді"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Скриншотты жабу"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"Скриншотты ашу"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"Скриншотты алдын ала қарау"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"Экран жазғыш"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Экранды бейнеге жазудың ағымдағы хабарландыруы"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"Жазу басталсын ба?"</string>
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"Көпіршік"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"Хабарландырулар келгенде, дыбыс шықпайды не дірілдемейді"</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"Хабарландырулар келгенде, дыбыс шығады не дірілдейді"</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"Хабарландырулар келгенде, дыбыс шығады не дірілдейді <xliff:g id="APP_NAME">%1$s</xliff:g> чаттары әдепкісінше қалқымалы етіп көрсетіледі."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Осы мазмұнға бекітілген қалқымалы таңбашамен назарыңызды өзіне тартады."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Сөйлесу бөлімінің жоғарғы жағында және қалқыма хабар түрінде көрсетіледі."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"Барлық <xliff:g id="APP_NAME_0">%1$s</xliff:g> әңгімесінің қалқыма хабарлары әдепкісінше көрсетіледі. <xliff:g id="APP_NAME_1">%2$s</xliff:g> арқылы басқарыңыз."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Параметрлер"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Маңыздылығы"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Жақындағы қалқыма хабарлар жоқ"</string>
@@ -903,7 +903,7 @@
     <string name="pip_phone_expand" msgid="1424988917240616212">"Жаю"</string>
     <string name="pip_phone_minimize" msgid="9057117033655996059">"Кішірейту"</string>
     <string name="pip_phone_close" msgid="8801864042095341824">"Жабу"</string>
-    <string name="pip_phone_settings" msgid="5687538631925004341">"Реттеулер"</string>
+    <string name="pip_phone_settings" msgid="5687538631925004341">"Параметрлер"</string>
     <string name="pip_phone_dismiss_hint" msgid="5825740708095316710">"Жабу үшін төмен қарай сүйреңіз"</string>
     <string name="pip_menu_title" msgid="6365909306215631910">"Mәзір"</string>
     <string name="pip_notification_title" msgid="8661573026059630525">"<xliff:g id="NAME">%s</xliff:g> \"суреттегі сурет\" режимінде"</string>
@@ -999,15 +999,22 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Қалқыма хабарларды реттеу"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Бұл қолданбадан қалқыма хабарларды өшіру үшін \"Басқару\" түймесін түртіңіз."</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Түсінікті"</string>
+    <!-- no translation found for bubbles_app_settings (5779443644062348657) -->
+    <skip />
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Жүйе навигациясы жаңартылды. Өзгерту енгізу үшін \"Параметрлер\" бөліміне өтіңіз."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Жүйе навигациясын жаңарту үшін \"Параметрлер\" бөліміне өтіңіз."</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Күту режимі"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Сөйлесу бөлімінің жоғарғы жағында көрсетіледі."</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Профиль суреті құлыптаулы экранда көрсетіледі."</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Қолданбалар терезесінің бергі жағынан қалқыма хабарлар түрінде көрсетіледі."</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"\"Мазаламау\" режимінде көрсетіледі."</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Түсінікті"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"Ұлғайту терезесін қабаттастыру"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"Ұлғайту терезесі"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"Ұлғайту терезесінің басқару элементтері"</string>
-    <string name="quick_controls_title" msgid="6839108006171302273">"Құрылғыны басқару элементтері"</string>
+    <string name="quick_controls_title" msgid="6839108006171302273">"Құрылғы басқару виджеттері"</string>
     <string name="quick_controls_subtitle" msgid="1667408093326318053">"Жалғанған құрылғыларға басқару элементтерін енгізу"</string>
-    <string name="quick_controls_setup_title" msgid="8901436655997849822">"Құрылғыны басқару элементтерін реттеу"</string>
+    <string name="quick_controls_setup_title" msgid="8901436655997849822">"Құрылғы басқару виджеттерін реттеу"</string>
     <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"Басқару элементтерін шығару үшін қуат түймесін басып тұрыңыз."</string>
     <string name="controls_providers_title" msgid="6879775889857085056">"Басқару элементтері енгізілетін қолданбаны таңдаңыз"</string>
     <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380">
@@ -1016,13 +1023,11 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"Басқару элементтері"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"\"Қуат\" мәзірінен пайдалануға болатын басқару элементтерін таңдаңыз."</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Басқару элементтерінің ретін өзгерту үшін оларды басып тұрып сүйреңіз."</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"Барлық басқару элементтері өшірілді."</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"Барлық басқару элементі тізімі жүктелмеді."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Басқа"</string>
-    <string name="controls_dialog_title" msgid="2343565267424406202">"Құрылғыны басқару элементтеріне қосу"</string>
+    <string name="controls_dialog_title" msgid="2343565267424406202">"Құрылғы басқару виджеттеріне қосу"</string>
     <string name="controls_dialog_ok" msgid="7011816381344485651">"Таңдаулыларға қосу"</string>
     <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> қолданбасы бұл басқару элементін таңдаулыларға қосып қоюды ұсынды."</string>
     <string name="controls_dialog_confirmation" msgid="586517302736263447">"Басқару элементтері жаңартылды"</string>
diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml
index 53e9c0e..aa1d776 100644
--- a/packages/SystemUI/res/values-km/strings.xml
+++ b/packages/SystemUI/res/values-km/strings.xml
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"មិនអាច​រក្សាទុក​រូបថតអេក្រង់​បានទេ ​ដោយសារ​ទំហំផ្ទុក​មានកម្រិតទាប"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"ការថត​រូបអេក្រង់​មិនត្រូវ​បាន​អនុញ្ញាត​ដោយ​កម្មវិធី​នេះ ឬ​ស្ថាប័ន​របស់អ្នក"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"ច្រានចោល​រូបថត​អេក្រង់"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"បើក​រូបថត​អេក្រង់"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"ការមើល​រូបថត​អេក្រង់​សាកល្បង"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"មុខងារថត​អេក្រង់"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"ការជូនដំណឹង​ដែល​កំពុង​ដំណើរការ​សម្រាប់​រយៈពេលប្រើ​ការថត​សកម្មភាព​អេក្រង់"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"ចាប់ផ្តើម​ថត​ឬ?"</string>
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"ពពុះ"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"ជួយឱ្យ​អ្នក​ផ្តោតអារម្មណ៍ ដោយមិនឮសំឡេង ឬ​ការញ័រ។"</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"ធ្វើឱ្យ​អ្នក​ចាប់អារម្មណ៍​តាមរយៈ​សំឡេង ឬ​ការញ័រ។"</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"ធ្វើឱ្យ​អ្នក​ចាប់អារម្មណ៍​តាមរយៈ​សំឡេង ឬ​ការញ័រ។ ការសន្ទនា​ពី​ពពុះ <xliff:g id="APP_NAME">%1$s</xliff:g> តាម​លំនាំដើម​។"</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"ធ្វើឱ្យអ្នក​ចាប់អារម្មណ៍​ដោយប្រើ​ផ្លូវកាត់​អណ្ដែត​សម្រាប់ខ្លឹមសារនេះ។"</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"បង្ហាញ​នៅខាងលើផ្នែកសន្ទនា និង​បង្ហាញជាពពុះ។"</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"ការសន្ទនា​ទាំងអស់​ពី <xliff:g id="APP_NAME_0">%1$s</xliff:g> បង្ហាញជា​ពពុះតាមលំនាំដើម។ គ្រប់គ្រង​នៅក្នុង <xliff:g id="APP_NAME_1">%2$s</xliff:g>។"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ការកំណត់"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"អាទិភាព"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"មិនមាន​ពពុះ​ថ្មីៗ​ទេ"</string>
@@ -999,15 +999,22 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"គ្រប់គ្រង​​ពពុះ​បានគ្រប់ពេល"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"ចុច \"គ្រប់គ្រង\" ដើម្បីបិទ​ពពុះពីកម្មវិធីនេះ"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"យល់ហើយ"</string>
+    <!-- no translation found for bubbles_app_settings (5779443644062348657) -->
+    <skip />
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"បានធ្វើ​បច្ចុប្បន្នភាព​ការរុករកក្នុង​ប្រព័ន្ធ។ ដើម្បីធ្វើការផ្លាស់ប្ដូរ សូមចូលទៅ​កាន់ការកំណត់។"</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"ចូល​ទៅកាន់​ការកំណត់ ដើម្បី​ធ្វើបច្ចុប្បន្នភាព​ការរុករក​ក្នុង​ប្រព័ន្ធ"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"ផ្អាក​ដំណើរការ"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"បង្ហាញនៅ​ខាងលើ​ផ្នែកសន្ទនា"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"បង្ហាញរូបភាព​កម្រងព័ត៌មាន​នៅលើអេក្រង់​ចាក់សោ"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"បង្ហាញជា​ពពុះអណ្ដែត​នៅផ្នែក​ខាងលើនៃ​កម្មវិធី"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"ផ្អាក​មុខងារកុំរំខាន"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"យល់ហើយ"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"វិនដូ​ត្រួតគ្នា​លើ​ការពង្រីក"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"វិនដូ​ការពង្រីក"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"វិនដូគ្រប់គ្រង​​ការពង្រីក"</string>
-    <string name="quick_controls_title" msgid="6839108006171302273">"ការ​គ្រប់គ្រង​ឧបករណ៍"</string>
+    <string name="quick_controls_title" msgid="6839108006171302273">"ផ្ទាំងគ្រប់គ្រងឧបករណ៍"</string>
     <string name="quick_controls_subtitle" msgid="1667408093326318053">"បញ្ចូល​ការគ្រប់គ្រង​សម្រាប់​ឧបករណ៍​ដែលបានភ្ជាប់​របស់អ្នក"</string>
-    <string name="quick_controls_setup_title" msgid="8901436655997849822">"រៀបចំ​ការ​គ្រប់គ្រង​ឧបករណ៍"</string>
+    <string name="quick_controls_setup_title" msgid="8901436655997849822">"រៀបចំ​ផ្ទាំងគ្រប់គ្រងឧបករណ៍"</string>
     <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"សង្កត់ប៊ូតុង​ថាមពលឱ្យជាប់ ដើម្បី​ចូលប្រើ​ការគ្រប់គ្រងរបស់អ្នក"</string>
     <string name="controls_providers_title" msgid="6879775889857085056">"ជ្រើសរើស​កម្មវិធី ដើម្បី​បញ្ចូល​ការគ្រប់គ្រង"</string>
     <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380">
@@ -1016,13 +1023,11 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"ការគ្រប់គ្រង"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"ជ្រើសរើស​ការគ្រប់គ្រង ដើម្បី​ចូលប្រើ​ពីម៉ឺនុយ​ថាមពល"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"ចុច​ឱ្យ​ជាប់ រួចអូស​ដើម្បី​រៀបចំ​ការគ្រប់គ្រង​ឡើងវិញ"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"បាន​លុបការគ្រប់គ្រងទាំងអស់ហើយ"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"មិនអាច​ផ្ទុក​បញ្ជី​នៃការគ្រប់គ្រង​ទាំងអស់​បានទេ។"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"ផ្សេងៗ"</string>
-    <string name="controls_dialog_title" msgid="2343565267424406202">"បញ្ចូល​ទៅក្នុងការ​គ្រប់គ្រង​ឧបករណ៍"</string>
+    <string name="controls_dialog_title" msgid="2343565267424406202">"បញ្ចូល​ទៅក្នុងផ្ទាំងគ្រប់គ្រងឧបករណ៍"</string>
     <string name="controls_dialog_ok" msgid="7011816381344485651">"បញ្ចូល​​ទៅ​ក្នុងសំណព្វ"</string>
     <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> បានណែនាំឱ្យបញ្ចូល​ការគ្រប់គ្រងនេះទៅក្នុងសំណព្វរបស់អ្នក។"</string>
     <string name="controls_dialog_confirmation" msgid="586517302736263447">"បានធ្វើបច្ចុប្បន្នភាពការគ្រប់គ្រង"</string>
diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml
index 3b8d86e..6fb7a1f 100644
--- a/packages/SystemUI/res/values-kn/strings.xml
+++ b/packages/SystemUI/res/values-kn/strings.xml
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"ಪರಿಮಿತ ಸಂಗ್ರಹಣೆ ಸ್ಥಳದ ಕಾರಣದಿಂದಾಗಿ ಸ್ಕ್ರೀನ್‌ಶಾಟ್ ಉಳಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"ಅಪ್ಲಿಕೇಶನ್ ಅಥವಾ ಸಂಸ್ಥೆಯು ಸ್ಕ್ರೀನ್‌ಶಾಟ್‌ಗಳನ್ನು ತೆಗೆಯುವುದನ್ನು ಅನುಮತಿಸುವುದಿಲ್ಲ"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"ಸ್ಕ್ರೀನ್‌ಶಾಟ್ ಅನ್ನು ವಜಾಗೊಳಿಸಿ"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"ಸ್ಕ್ರೀನ್‌ಶಾಟ್ ಅನ್ನು ತೆರೆಯಿರಿ"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"ಸ್ಕ್ರೀನ್‍ಶಾಟ್‍ನ ಪೂರ್ವವೀಕ್ಷಣೆ"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"ಸ್ಕ್ರೀನ್ ರೆಕಾರ್ಡರ್"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"ಸ್ಕ್ರೀನ್ ರೆಕಾರ್ಡಿಂಗ್ ಸೆಶನ್‌ಗಾಗಿ ಚಾಲ್ತಿಯಲ್ಲಿರುವ ಅಧಿಸೂಚನೆ"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"ರೆಕಾರ್ಡಿಂಗ್ ಪ್ರಾರಂಭಿಸಬೇಕೆ?"</string>
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"ಬಬಲ್"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"ಶಬ್ದ ಅಥವಾ ವೈಬ್ರೇಷನ್ ಇರದಂತೆ ನಿಮಗೆ ಗಮನಹರಿಸಲು ಸಹಾಯ ಮಾಡುತ್ತದೆ."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"ಧ್ವನಿ ಅಥವಾ ವೈಬ್ರೇಷನ್ ಮೂಲಕ ನಿಮ್ಮ ಗಮನವನ್ನು ಸೆಳೆಯುತ್ತದೆ."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"ಧ್ವನಿ ಅಥವಾ ವೈಬ್ರೇಷನ್ ಮೂಲಕ ನಿಮ್ಮ ಗಮನವನ್ನು ಸೆಳೆಯುತ್ತದೆ. ಡಿಫಾಲ್ಟ್ ಆಗಿ, <xliff:g id="APP_NAME">%1$s</xliff:g> ನ ಬಬಲ್ ಸಂಭಾಷಣೆಗಳು."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"ಈ ವಿಷಯಕ್ಕೆ ಲಿಂಕ್ ಮಾಡಿ ಕೊಂಡೊಯ್ಯುವ ಶಾರ್ಟ್‌ಕಟ್‌ ಕಡೆಗೆ ಗಮನ ಇರಿಸಿ."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"ಸಂಭಾಷಣೆ ವಿಭಾಗದ ಮೇಲ್ಬಾಗದಲ್ಲಿ ಕಾಣಿಸುತ್ತದೆ ಮತ್ತು ಬಬಲ್‌ನಂತೆ ಗೋಚರಿಸುತ್ತದೆ."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"ಡೀಫಾಲ್ಟ್ ಆಗಿ <xliff:g id="APP_NAME_0">%1$s</xliff:g> ನ ಎಲ್ಲಾ ಸಂಭಾಷಣೆಗಳನ್ನು ಬಬಲ್‌ ಆಗಿ ತೋರಿಸಿ. <xliff:g id="APP_NAME_1">%2$s</xliff:g> ನಲ್ಲಿ ನಿರ್ವಹಿಸಿ."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ಸೆಟ್ಟಿಂಗ್‌ಗಳು"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"ಆದ್ಯತೆ"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"ಯಾವುದೇ ಇತ್ತೀಚಿನ ಬಬಲ್ಸ್ ಇಲ್ಲ"</string>
@@ -962,7 +962,7 @@
     <string name="running_foreground_services_title" msgid="5137313173431186685">"ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಹಿನ್ನೆಲೆಯಲ್ಲಿ ರನ್ ಆಗುತ್ತಿವೆ"</string>
     <string name="running_foreground_services_msg" msgid="3009459259222695385">"ಬ್ಯಾಟರಿ,ಡೇಟಾ ಬಳಕೆಯ ವಿವರಗಳಿಗಾಗಿ ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
     <string name="mobile_data_disable_title" msgid="5366476131671617790">"ಮೊಬೈಲ್ ಡೇಟಾ ಆಫ್ ಮಾಡಬೇಕೆ?"</string>
-    <string name="mobile_data_disable_message" msgid="8604966027899770415">"ನೀವು <xliff:g id="CARRIER">%s</xliff:g> ಮೂಲಕ ಡೇಟಾ ಅಥವಾ ಇಂಟರ್ನೆಟ್‌ಗೆ ಪ್ರವೇಶವನ್ನು ಹೊಂದಿಲ್ಲ. ಇಂಟರ್ನೆಟ್ ವೈ-ಫೈ ಮೂಲಕ ಮಾತ್ರ ಲಭ್ಯವಿರುತ್ತದೆ."</string>
+    <string name="mobile_data_disable_message" msgid="8604966027899770415">"ನೀವು <xliff:g id="CARRIER">%s</xliff:g> ಮೂಲಕ ಡೇಟಾ ಅಥವಾ ಇಂಟರ್ನೆಟ್‌ಗೆ ಪ್ರವೇಶವನ್ನು ಹೊಂದಿರುವುದಿಲ್ಲ. ಇಂಟರ್ನೆಟ್, ವೈ-ಫೈ ಮೂಲಕ ಮಾತ್ರ ಲಭ್ಯವಿರುತ್ತದೆ."</string>
     <string name="mobile_data_disable_message_default_carrier" msgid="6496033312431658238">"ನಿಮ್ಮ ವಾಹಕ"</string>
     <string name="touch_filtered_warning" msgid="8119511393338714836">"ಅನುಮತಿ ವಿನಂತಿಯನ್ನು ಅಪ್ಲಿಕೇಶನ್ ಮರೆಮಾಚುತ್ತಿರುವ ಕಾರಣ, ಸೆಟ್ಟಿಂಗ್‌ಗಳಿಗೆ ನಿಮ್ಮ ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ಪರಿಶೀಲಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ."</string>
     <string name="slice_permission_title" msgid="3262615140094151017">"<xliff:g id="APP_2">%2$s</xliff:g> ಸ್ಲೈಸ್‌ಗಳನ್ನು ತೋರಿಸಲು <xliff:g id="APP_0">%1$s</xliff:g> ಅನ್ನು ಅನುಮತಿಸುವುದೇ?"</string>
@@ -999,9 +999,16 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"ಯಾವುದೇ ಸಮಯದಲ್ಲಿ ಬಬಲ್ಸ್ ಅನ್ನು ನಿಯಂತ್ರಿಸಿ"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"ಈ ಆ್ಯಪ್‌ನಿಂದ ಬಬಲ್ಸ್ ಅನ್ನು ಆಫ್ ಮಾಡಲು ನಿರ್ವಹಿಸಿ ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"ಅರ್ಥವಾಯಿತು"</string>
+    <!-- no translation found for bubbles_app_settings (5779443644062348657) -->
+    <skip />
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"ಸಿಸ್ಟಂ ನ್ಯಾವಿಗೇಷನ ಅಪ್‌ಡೇಟ್ ಮಾಡಲಾಗಿದೆ ಬದಲಾವಣೆಗಳನ್ನು ಮಾಡಲು, ಸೆಟ್ಟಿಂಗ್‌ಗಳಿಗೆ ಹೋಗಿ."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"ಸಿಸ್ಟಂ ನ್ಯಾವಿಗೇಷನ್ ಅಪ್‌ಡೇಟ್ ಮಾಡಲು ಸೆಟ್ಟಿಂಗ್‌ಗಳಿಗೆ ಹೋಗಿ"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"ಸ್ಟ್ಯಾಂಡ್‌ಬೈ"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"ಸಂಭಾಷಣೆ ವಿಭಾಗದ ಮೇಲ್ಭಾಗದಲ್ಲಿ ತೋರಿಸಿ"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"ಲಾಕ್ ಸ್ಕ್ರೀನ್‌ ಮೇಲೆ ಪ್ರೊಫೈಲ್ ಚಿತ್ರವನ್ನು ತೋರಿಸಿ"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"ಆ್ಯಪ್‌ಗಳ ಮೇಲ್ಭಾಗದಲ್ಲಿ ತೇಲುವ ಬಬಲ್‌ನಂತೆ ಗೋಚರಿಸಲಿ"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"ಅಡಚಣೆ ಮಾಡಬೇಡ ಅನ್ನು ಅಡ್ಡಿಪಡಿಸಿ"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"ಅರ್ಥವಾಯಿತು"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"ವರ್ಧನೆಯ ಓವರ್‌ಲೇ ವಿಂಡೋ"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"ವರ್ಧನೆಯ ವಿಂಡೋ"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"ವರ್ಧನೆಯ ವಿಂಡೋ ನಿಯಂತ್ರಣಗಳು"</string>
@@ -1016,10 +1023,8 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"ನಿಯಂತ್ರಣಗಳು"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"ಪವರ್ ಮೆನುವಿನಿಂದ ಪ್ರವೇಶಿಸಲು ನಿಯಂತ್ರಣಗಳನ್ನು ಆರಿಸಿ"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"ನಿಯಂತ್ರಣಗಳನ್ನು ಮರುಹೊಂದಿಸಲು ಹೋಲ್ಡ್ ಮಾಡಿ ಮತ್ತು ಡ್ರ್ಯಾಗ್‌ ಮಾಡಿ"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"ಎಲ್ಲಾ ನಿಯಂತ್ರಣಗಳನ್ನು ತೆಗೆದುಹಾಕಲಾಗಿದೆ"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"ಎಲ್ಲಾ ನಿಯಂತ್ರಣಗಳ ಪಟ್ಟಿಯನ್ನು ಲೋಡ್ ಮಾಡಲು ಆಗಲಿಲ್ಲ."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"ಇತರ"</string>
     <string name="controls_dialog_title" msgid="2343565267424406202">"ಸಾಧನ ನಿಯಂತ್ರಣಗಳಿಗೆ ಸೇರಿಸಿ"</string>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index daa8278..f8e6b1f 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"저장용량이 부족하여 스크린샷을 저장할 수 없습니다"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"앱이나 조직에서 스크린샷 촬영을 허용하지 않습니다."</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"스크린샷 닫기"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"스크린샷 열기"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"스크린샷 미리보기"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"화면 녹화"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"화면 녹화 세션에 관한 지속적인 알림"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"녹화를 시작하시겠습니까?"</string>
@@ -384,7 +384,7 @@
     <string name="quick_settings_cast_device_default_name" msgid="6988469571141331700">"이름이 없는 기기"</string>
     <string name="quick_settings_cast_device_default_description" msgid="2580520859212250265">"전송 준비 완료"</string>
     <string name="quick_settings_cast_detail_empty_text" msgid="2846282280014617785">"사용 가능한 기기가 없습니다."</string>
-    <string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Wi-Fi가 연결되어 있지 않음"</string>
+    <string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Wi-Fi가 연결되지 않음"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"밝기"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="2325362583903258677">"자동"</string>
     <string name="quick_settings_inversion_label" msgid="5078769633069667698">"색상 반전"</string>
@@ -417,12 +417,12 @@
     <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="3358706312129866626">"일몰에"</string>
     <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4063448287758262485">"일출까지"</string>
     <string name="quick_settings_night_secondary_label_on_at" msgid="3584738542293528235">"<xliff:g id="TIME">%s</xliff:g>에"</string>
-    <string name="quick_settings_secondary_label_until" msgid="1883981263191927372">"<xliff:g id="TIME">%s</xliff:g>까지"</string>
+    <string name="quick_settings_secondary_label_until" msgid="1883981263191927372">"<xliff:g id="TIME">%s</xliff:g>에 꺼짐"</string>
     <string name="quick_settings_ui_mode_night_label" msgid="1398928270610780470">"어두운 테마"</string>
     <string name="quick_settings_dark_mode_secondary_label_battery_saver" msgid="4990712734503013251">"절전 모드"</string>
     <string name="quick_settings_dark_mode_secondary_label_on_at_sunset" msgid="6017379738102015710">"일몰에"</string>
     <string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"일출까지"</string>
-    <string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"<xliff:g id="TIME">%s</xliff:g>에"</string>
+    <string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"<xliff:g id="TIME">%s</xliff:g>에 켜짐"</string>
     <string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"<xliff:g id="TIME">%s</xliff:g>까지"</string>
     <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
     <string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC 사용 중지됨"</string>
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"버블"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"소리나 진동 없이 집중할 수 있도록 도와줍니다"</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"소리나 진동으로 알립니다."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"소리나 진동으로 알립니다. 기본적으로 <xliff:g id="APP_NAME">%1$s</xliff:g>의 대화는 대화창으로 표시됩니다."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"이 콘텐츠로 연결되는 플로팅 바로가기로 사용자의 주의를 끕니다."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"대화 섹션 상단에 대화창으로 표시"</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"기본적으로 <xliff:g id="APP_NAME_0">%1$s</xliff:g>의 모든 대화가 대화창으로 표시됩니다. <xliff:g id="APP_NAME_1">%2$s</xliff:g>에서 관리하세요."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"설정"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"우선순위"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"최근에 닫은 대화창 없음"</string>
@@ -999,15 +999,22 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"언제든지 대화창을 제어하세요"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"이 앱에서 대화창을 사용 중지하려면 관리를 탭하세요."</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"확인"</string>
+    <!-- no translation found for bubbles_app_settings (5779443644062348657) -->
+    <skip />
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"시스템 탐색이 업데이트되었습니다. 변경하려면 설정으로 이동하세요."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"설정으로 이동하여 시스템 탐색을 업데이트하세요."</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"대기"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"대화 섹션의 상단에 표시"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"잠금 화면에서 프로필 사진 표시"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"앱 상단에서 플로팅 대화창으로 표시"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"방해 금지 모드 제외"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"확인"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"확대 오버레이 창"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"확대 창"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"확대 창 컨트롤"</string>
-    <string name="quick_controls_title" msgid="6839108006171302273">"기기 컨트롤"</string>
+    <string name="quick_controls_title" msgid="6839108006171302273">"기기 제어"</string>
     <string name="quick_controls_subtitle" msgid="1667408093326318053">"연결된 기기의 컨트롤을 추가합니다."</string>
-    <string name="quick_controls_setup_title" msgid="8901436655997849822">"기기 컨트롤 설정"</string>
+    <string name="quick_controls_setup_title" msgid="8901436655997849822">"기기 제어 설정"</string>
     <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"전원 버튼을 길게 눌러 컨트롤에 액세스하세요."</string>
     <string name="controls_providers_title" msgid="6879775889857085056">"컨트롤을 추가할 앱을 선택하세요"</string>
     <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380">
@@ -1016,13 +1023,11 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"제어"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"전원 메뉴에서 액세스할 컨트롤을 선택합니다."</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"길게 누르고 드래그하여 컨트롤 재정렬"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"모든 컨트롤 삭제됨"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"전체 컨트롤 목록을 로드할 수 없습니다."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"기타"</string>
-    <string name="controls_dialog_title" msgid="2343565267424406202">"기기 컨트롤에 추가"</string>
+    <string name="controls_dialog_title" msgid="2343565267424406202">"기기 제어에 추가"</string>
     <string name="controls_dialog_ok" msgid="7011816381344485651">"즐겨찾기에 추가"</string>
     <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g>에서 이 제어 기능을 즐겨찾기에 추가할 것을 제안합니다."</string>
     <string name="controls_dialog_confirmation" msgid="586517302736263447">"컨트롤 업데이트됨"</string>
diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml
index ff614e5..ae6c50a 100644
--- a/packages/SystemUI/res/values-ky/strings.xml
+++ b/packages/SystemUI/res/values-ky/strings.xml
@@ -33,13 +33,13 @@
     <string name="invalid_charger_title" msgid="938685362320735167">"USB аркылуу кубатталбай жатат"</string>
     <string name="invalid_charger_text" msgid="2339310107232691577">"Түзмөгүңүз менен келген кубаттагычты колдонуңуз"</string>
     <string name="battery_low_why" msgid="2056750982959359863">"Жөндөөлөр"</string>
-    <string name="battery_saver_confirmation_title" msgid="1234998463717398453">"Батареяны үнөмдөгүч режими күйгүзүлсүнбү?"</string>
+    <string name="battery_saver_confirmation_title" msgid="1234998463717398453">"Батареяны үнөмдөө режимин күйгүзөсүзбү?"</string>
     <string name="battery_saver_confirmation_title_generic" msgid="2299231884234959849">"Батареяны үнөмдөгүч режими жөнүндө маалымат"</string>
     <string name="battery_saver_confirmation_ok" msgid="5042136476802816494">"Күйгүзүү"</string>
     <string name="battery_saver_start_action" msgid="4553256017945469937">"Батареяны үнөмдөгүч режимин күйгүзүү"</string>
     <string name="status_bar_settings_settings_button" msgid="534331565185171556">"Жөндөөлөр"</string>
     <string name="status_bar_settings_wifi_button" msgid="7243072479837270946">"Wi‑Fi"</string>
-    <string name="status_bar_settings_auto_rotation" msgid="8329080442278431708">"Экрандын авто-айлануусу"</string>
+    <string name="status_bar_settings_auto_rotation" msgid="8329080442278431708">"Экранды авто буруу"</string>
     <string name="status_bar_settings_mute_label" msgid="914392730086057522">"ҮНСҮЗ"</string>
     <string name="status_bar_settings_auto_brightness_label" msgid="2151934479226017725">"АВТО"</string>
     <string name="status_bar_settings_notifications" msgid="5285316949980621438">"Билдирмелер"</string>
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"Сактагычта бош орун аз болгондуктан, скриншот сакталбай жатат"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Скриншот тартууга колдонмо же ишканаңыз тыюу салган."</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Скриншотту четке кагуу"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"Скриншотту ачуу"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"Скриншотту алдын ала көрүү"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"экрандан видео жаздырып алуу"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Экранды жаздыруу сеансы боюнча учурдагы билдирме"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"Жаздырып башталсынбы?"</string>
@@ -355,8 +355,8 @@
     <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="3003338571871392293">"Угуу аппараттары"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="3882884317600669650">"Күйгүзүлүүдө…"</string>
     <string name="quick_settings_brightness_label" msgid="680259653088849563">"Жарыктыгы"</string>
-    <string name="quick_settings_rotation_unlocked_label" msgid="2359922767950346112">"Авто айлануу"</string>
-    <string name="accessibility_quick_settings_rotation" msgid="4800050198392260738">"Экрандын авто-айлануусу"</string>
+    <string name="quick_settings_rotation_unlocked_label" msgid="2359922767950346112">"Авто буруу"</string>
+    <string name="accessibility_quick_settings_rotation" msgid="4800050198392260738">"Экранды авто буруу"</string>
     <string name="accessibility_quick_settings_rotation_value" msgid="2916484894750819251">"<xliff:g id="ID_1">%s</xliff:g> режими"</string>
     <string name="quick_settings_rotation_locked_label" msgid="4420863550666310319">"Буруу аракети кулпуланган"</string>
     <string name="quick_settings_rotation_locked_portrait_label" msgid="1194988975270484482">"Тигинен"</string>
@@ -430,8 +430,8 @@
     <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Экранды жаздыруу"</string>
     <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Баштадык"</string>
     <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Токтотуу"</string>
-    <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Колдонмолорду которуштуруу үчүн өйдө сүрүңүз"</string>
-    <string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Колдонмолорду тез которуштуруу үчүн оңго сүйрөңүз"</string>
+    <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Башка колдонмого которулуу үчүн,, өйдө сүрүңүз"</string>
+    <string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Колдонмолорду тез которуштуруу үчүн, оңго сүйрөңүз"</string>
     <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Сереп салууну өчүрүү/күйгүзүү"</string>
     <string name="expanded_header_battery_charged" msgid="5307907517976548448">"Кубатталды"</string>
     <string name="expanded_header_battery_charging" msgid="1717522253171025549">"Кубатталууда"</string>
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"Көбүк"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"Үн же дирилдөөсүз ой топтоого жардам берет."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"Билдирүүдөн үн чыгат же дирилдейт."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"Билдирүүдөн үн чыгат же дирилдейт. <xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосундагы жазышуулар демейки жөндөө боюнча калкып чыкма билдирмелер болуп көрүнөт."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Калкыма ыкчам баскыч менен көңүлүңүздү бул мазмунга буруп турат."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Жазышуу бөлүмүнүн жогорку жагында көрсөтүлүп, калкып чыкма билдирме катары пайда болот."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"Демейки жөндөө боюнча <xliff:g id="APP_NAME_0">%1$s</xliff:g> колдонмосунун бардык жазышуулары калкып чыкма билдирме болуп көрүнөт. <xliff:g id="APP_NAME_1">%2$s</xliff:g> колдонмосунда башкаруу."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Жөндөөлөр"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Маанилүүлүгү"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Акыркы калкып чыкма билдирмелер жок"</string>
@@ -962,7 +962,7 @@
     <string name="running_foreground_services_title" msgid="5137313173431186685">"Фондо иштеп жаткан колдонмолор"</string>
     <string name="running_foreground_services_msg" msgid="3009459259222695385">"Батареянын кубаты жана трафиктин көлөмү жөнүндө билүү үчүн таптап коюңуз"</string>
     <string name="mobile_data_disable_title" msgid="5366476131671617790">"Мобилдик Интернетти өчүрөсүзбү?"</string>
-    <string name="mobile_data_disable_message" msgid="8604966027899770415">"<xliff:g id="CARRIER">%s</xliff:g> байланыш оператору аркылуу дайындарга же Интернетке кирүү мүмкүнчүлүгүңүз болбойт. Интернетке Wi-Fi аркылуу гана кире аласыз."</string>
+    <string name="mobile_data_disable_message" msgid="8604966027899770415">"<xliff:g id="CARRIER">%s</xliff:g> байланыш оператору аркылуу Интернетке кире албай каласыз. Интернетке Wi-Fi аркылуу гана кирүүгө болот."</string>
     <string name="mobile_data_disable_message_default_carrier" msgid="6496033312431658238">"байланыш операторуңуз"</string>
     <string name="touch_filtered_warning" msgid="8119511393338714836">"Уруксат берүү сурамыңыз көрүнбөй калгандыктан, Жөндөөлөр жообуңузду ырастай албай жатат."</string>
     <string name="slice_permission_title" msgid="3262615140094151017">"<xliff:g id="APP_0">%1$s</xliff:g> колдонмосуна <xliff:g id="APP_2">%2$s</xliff:g> үлгүлөрүн көрсөтүүгө уруксат берилсинби?"</string>
@@ -982,7 +982,7 @@
     <string name="sensor_privacy_mode" msgid="4462866919026513692">"Сенсорлорду өчүрүү"</string>
     <string name="device_services" msgid="1549944177856658705">"Түзмөк кызматтары"</string>
     <string name="music_controls_no_title" msgid="4166497066552290938">"Аталышы жок"</string>
-    <string name="restart_button_description" msgid="6916116576177456480">"Бул колдонмону өчүрүп күйгүзүп, толук экранга өтүү үчүн таптап коюңуз."</string>
+    <string name="restart_button_description" msgid="6916116576177456480">"Бул колдонмону өчүрүп күйгүзүп, толук экранга өтүү үчүн, таптап коюңуз."</string>
     <string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> калкып чыкма билдирмелер жөндөөлөрү"</string>
     <string name="manage_bubbles_text" msgid="6856830436329494850">"Башкаруу"</string>
     <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g> колдонмосунан <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
@@ -999,16 +999,23 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Калкып чыкма билдирмелерди каалаган убакта көзөмөлдөңүз"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Бул колдонмодогу калкып чыкма билдирмелерди өчүрүү үчүн \"Башкарууну\" басыңыз"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Түшүндүм"</string>
+    <!-- no translation found for bubbles_app_settings (5779443644062348657) -->
+    <skip />
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Тутум чабыттоосу жаңырды. Өзгөртүү үчүн, Жөндөөлөргө өтүңүз."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Тутум чабыттоосун жаңыртуу үчүн Жөндөөлөргө өтүңүз"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Көшүү режими"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Жазышуу бөлүмүнүн үстүндө көрсөтүү"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Профилдин сүрөтүн кулпуланган экранда көрсөтүү"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Калкым чыкма билдирме катары көрсөтүү"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"\"Тынчымды алба\" режими үзгүлтүккө учурайт"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Түшүндүм"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"Чоңойтуу терезесин үстүнө коюу"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"Чоңойтуу терезеси"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"Чоңойтуу терезесин башкаруу каражаттары"</string>
-    <string name="quick_controls_title" msgid="6839108006171302273">"Түзмөктү көзөмөлдөө элементтери"</string>
+    <string name="quick_controls_title" msgid="6839108006171302273">"Түзмөктү башкаруу элементтери"</string>
     <string name="quick_controls_subtitle" msgid="1667408093326318053">"Байланыштырылган түзмөктөрүңүз үчүн көзөмөлдөрдү кошуңуз"</string>
-    <string name="quick_controls_setup_title" msgid="8901436655997849822">"Түзмөктү көзөмөлдөө элементтерин жөндөө"</string>
-    <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"Көзөмөлдөргө өтүү үчүн күйгүзүү/өчүрүү баскычын басып туруңуз"</string>
+    <string name="quick_controls_setup_title" msgid="8901436655997849822">"Түзмөктү башкаруу элементтерин жөндөө"</string>
+    <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"Көзөмөлдөргө өтүү үчүн, күйгүзүү/өчүрүү баскычын басып туруңуз"</string>
     <string name="controls_providers_title" msgid="6879775889857085056">"Көзөмөлдөрдү кошуу үчүн колдонмо тандаңыз"</string>
     <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380">
       <item quantity="other"><xliff:g id="NUMBER_1">%s</xliff:g> көзөмөл кошулду.</item>
@@ -1016,13 +1023,11 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"Башкаруу элементтери"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Күйгүзүү/өчүрүү баскычынын менюсу үчүн көзөмөлдөрдү тандаңыз"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Башкаруу элементтеринин иретин өзгөртүү үчүн кармап туруп, сүйрөңүз"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"Бардык башкаруу элементтери өчүрүлдү"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"Бардык көзөмөлдөрдүн тизмеси жүктөлгөн жок."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Башка"</string>
-    <string name="controls_dialog_title" msgid="2343565267424406202">"Түзмөктү көзөмөлдөө элементтерине кошуу"</string>
+    <string name="controls_dialog_title" msgid="2343565267424406202">"Түзмөктү башкаруу элементтерине кошуу"</string>
     <string name="controls_dialog_ok" msgid="7011816381344485651">"Сүйүктүүлөргө кошуу"</string>
     <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> бул көзөмөлдү сүйүктүүлөргө кошууну сунуштады."</string>
     <string name="controls_dialog_confirmation" msgid="586517302736263447">"Башкаруу элементтери жаңырды"</string>
diff --git a/packages/SystemUI/res/values-land/config.xml b/packages/SystemUI/res/values-land/config.xml
index da5819c..2f7fbaf 100644
--- a/packages/SystemUI/res/values-land/config.xml
+++ b/packages/SystemUI/res/values-land/config.xml
@@ -34,4 +34,7 @@
 
     <!-- Max number of columns for quick controls area -->
     <integer name="controls_max_columns">4</integer>
+
+    <!-- Max number of columns for power menu -->
+    <integer name="power_menu_max_columns">4</integer>
 </resources>
diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml
index 2250077..880ecea 100644
--- a/packages/SystemUI/res/values-lo/strings.xml
+++ b/packages/SystemUI/res/values-lo/strings.xml
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"ບໍ່ສາມາດຖ່າຍຮູບໜ້າຈໍໄດ້ເນື່ອງຈາກພື້ນທີ່ຈັດເກັບຂໍ້ມູນມີຈຳກັດ"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"ແອັບ ຫຼື ອົງກອນຂອງທ່ານບໍ່ອະນຸຍາດໃຫ້ຖ່າຍຮູບໜ້າຈໍ"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"ປິດຮູບໜ້າຈໍ"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"ເປີດຮູບໜ້າຈໍ"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"ຕົວຢ່າງຮູບໜ້າຈໍ"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"ໂປຣແກຣມບັນທຶກໜ້າຈໍ"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"ການແຈ້ງເຕືອນສຳລັບເຊດຊັນການບັນທຶກໜ້າຈໍໃດໜຶ່ງ"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"ເລີ່ມການບັນທຶກບໍ?"</string>
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"ຟອງ"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"ຊ່ວຍທ່ານມີສະມາທິໂດຍບໍ່ໃຊ້ສຽງ ຫຼື ການສັ່ນເຕືອນ."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"ດຶງຄວາມສົນໃຈຂອງທ່ານດ້ວຍສຽງ ຫຼື ການສັ່ນເຕືອນ."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"ດຶງຄວາມສົນໃຈຂອງທ່ານດ້ວຍສຽງ ຫຼື ການສັ່ນເຕືອນ. ການສົນທະນາຈາກ <xliff:g id="APP_NAME">%1$s</xliff:g> ຈະເປັນ bubble ຕາມຄ່າເລີ່ມຕົ້ນ."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"ເອົາໃຈໃສ່ທາງລັດແບບລອຍໄປຫາເນື້ອຫານີ້."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"ສະແດງຢູ່ເທິງສຸດຂອງພາກສ່ວນການສົນທະນາ ແລະ ສະແດງເປັນຟອງ."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"ການສົນທະນາທັງໝົດຈາກ <xliff:g id="APP_NAME_0">%1$s</xliff:g> ທີ່ສະແດງເປັນຟອງຕາມຄ່າເລີ່ມຕົ້ນ. ຈັດການໃນ <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ຕັ້ງຄ່າ"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"ຄວາມສຳຄັນ"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"ບໍ່ມີຟອງຫຼ້າສຸດ"</string>
@@ -999,9 +999,15 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"ຄວບຄຸມຟອງຕອນໃດກໍໄດ້"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"ແຕະຈັດການ ເພື່ອປິດຟອງຈາກແອັບນີ້"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"ເຂົ້າໃຈແລ້ວ"</string>
+    <string name="bubbles_app_settings" msgid="5779443644062348657">"ການຕັ້ງຄ່າ <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"ອັບເດດການນຳທາງລະບົບແລ້ວ. ເພື່ອປ່ຽນແປງ, ກະລຸນາໄປທີ່ການຕັ້ງຄ່າ."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"ໄປທີ່ການຕັ້ງຄ່າເພື່ອອັບເດດການນຳທາງລະບົບ"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"ສະແຕນບາຍ"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"ສະແດງຢູ່ເທິງສຸດຂອງພາກສ່ວນການສົນທະນາ"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"ສະແດງຮູບໂປຣໄຟລ໌ຢູ່ໜ້າຈໍລັອກ"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"ປາກົດເປັນ bubble ລອຍຢູ່ເໜືອແອັບ"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"ລົບກວນໂໝດຫ້າມລົບກວນ"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"ເຂົ້າໃຈແລ້ວ"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"ໜ້າຈໍວາງທັບການຂະຫຍາຍ"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"ໜ້າຈໍການຂະຫຍາຍ"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"ການຄວບຄຸມໜ້າຈໍການຂະຫຍາຍ"</string>
@@ -1016,10 +1022,8 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"ການຄວບຄຸມ"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"ເລືອກການຄວບຄຸມເພື່ອເຂົ້າເຖິງຈາກເມນູເປີດປິດ"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"ກົດຄ້າງໄວ້ເພື່ອຈັດຮຽງການຄວບຄຸມຄືນໃໝ່"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"ລຶບການຄວບຄຸມທັງໝົດອອກແລ້ວ"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"ບໍ່ສາມາດໂຫຼດລາຍຊື່ການຄວບຄຸມທັງໝົດໄດ້."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"ອື່ນໆ"</string>
     <string name="controls_dialog_title" msgid="2343565267424406202">"ເພີ່ມໃສ່ການຄວບຄຸມອຸປະກອນ"</string>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index ffe8619..7374acd 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"Negalima išsaugoti ekrano kopijos dėl ribotos saugyklos vietos"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Jūsų organizacijoje arba naudojant šią programą neleidžiama daryti ekrano kopijų"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Praleisti ekrano kopiją"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"Atidaryti ekrano kopiją"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"Ekrano kopijos peržiūra"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"Ekrano vaizdo įrašytuvas"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Šiuo metu rodomas ekrano įrašymo sesijos pranešimas"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"Pradėti įrašymą?"</string>
@@ -713,9 +713,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"Debesėlis"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"Padeda atkreipti dėmesį be garso arba vibravimo."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"Atkreipia dėmesį garsu arba vibravimu."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"Atkreipia dėmesį garsu arba vibravimu. Pokalbiai iš „<xliff:g id="APP_NAME">%1$s</xliff:g>“ debesėlio pagal numatytuosius nustatymus."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Naudojant slankųjį spartųjį klavišą lengviau sutelkti dėmesį į šį turinį."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Rodoma pokalbio skilties viršuje kaip burbulas."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"Visi pokalbiai iš „<xliff:g id="APP_NAME_0">%1$s</xliff:g>“ burbulo pagal numatytuosius nustatymus. Tvarkyti naudojant „<xliff:g id="APP_NAME_1">%2$s</xliff:g>“."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Nustatymai"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioritetas"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Nėra naujausių burbulų"</string>
@@ -1009,9 +1009,16 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Bet kada valdyti burbulus"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Palieskite „Tvarkyti“, kad išjungtumėte burbulus šioje programoje"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Supratau"</string>
+    <!-- no translation found for bubbles_app_settings (5779443644062348657) -->
+    <skip />
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Sistemos naršymo funkcijos atnaujintos. Jei norite pakeisti, eikite į skiltį „Nustatymai“."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Eikite į skiltį „Nustatymai“, kad atnaujintumėte sistemos naršymo funkcijas"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Budėjimo laikas"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Rodyti pokalbių skilties viršuje"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Rodyti profilio nuotrauką užrakinimo ekrane"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Rodyti kaip slankųjį debesėlį programų viršuje"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Pertraukti netrukdymo režimą"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Supratau"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"Didinimo perdangos langas"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"Didinimo langas"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"Didinimo lango valdikliai"</string>
@@ -1028,10 +1035,8 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"Valdikliai"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Pasirinkite valdiklius, kuriuos norite pasiekti įjungimo meniu"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Norėdami pertvarkyti valdiklius, vilkite laikydami nuspaudę"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"Visi valdikliai pašalinti"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"Nepavyko įkelti visų valdiklių sąrašo."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Kita"</string>
     <string name="controls_dialog_title" msgid="2343565267424406202">"Pridėjimas prie įrenginio valdiklių"</string>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index adc7c1f..2ace267 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"Nevar saglabāt ekrānuzņēmumu, jo krātuvē nepietiek vietas."</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Lietotne vai jūsu organizācija neatļauj veikt ekrānuzņēmumus."</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Nerādīt ekrānuzņēmumu"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"Atvērt ekrānuzņēmumu"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"Ekrānuzņēmuma priekšskatījums"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"Ekrāna ierakstītājs"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Aktīvs paziņojums par ekrāna ierakstīšanas sesiju"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"Vai sākt ierakstīšanu?"</string>
@@ -710,9 +710,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"Burbulis"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"Palīdz jums koncentrēties, nenovēršot uzmanību ar skaņu vai vibrāciju."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"Jūsu uzmanība tiek piesaistīta ar skaņas vai vibrācijas signālu."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"Jūsu uzmanība tiek piesaistīta ar skaņas vai vibrācijas signālu. Sarunas no lietotnes <xliff:g id="APP_NAME">%1$s</xliff:g> pēc noklusējuma tiek parādītas burbulī."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Piesaista jūsu uzmanību, rādot peldošu saīsni uz šo saturu."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Tiek rādīta sarunas sadaļas augšdaļā kā burbulis."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"Pēc noklusējuma visas sarunas no lietotnes <xliff:g id="APP_NAME_0">%1$s</xliff:g> rādīt burbuļos. Pārvaldīt lietotnē <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Iestatījumi"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioritārs"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Nav nesen aizvērtu burbuļu"</string>
@@ -1004,15 +1004,22 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Pārvaldīt burbuļus jebkurā laikā"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Pieskarieties pogai “Pārvaldīt”, lai izslēgtu burbuļus no šīs lietotnes."</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Labi"</string>
+    <!-- no translation found for bubbles_app_settings (5779443644062348657) -->
+    <skip />
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Sistēmas navigācija ir atjaunināta. Lai veiktu izmaiņas, atveriet iestatījumus."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Atveriet iestatījumus, lai atjauninātu sistēmas navigāciju"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Gaidstāve"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Tiek rādītas sarunu sadaļas augšdaļā"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Tiek rādīts profila attēls bloķēšanas ekrānā"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Tiek rādītas kā peldošs burbulis virs lietotnēm"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Var tikt rādītas režīmā “Netraucēt”"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Labi"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"Palielināšanas pārklājuma logs"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"Palielināšanas logs"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"Palielināšanas loga vadīklas"</string>
-    <string name="quick_controls_title" msgid="6839108006171302273">"Ierīces vadīklas"</string>
+    <string name="quick_controls_title" msgid="6839108006171302273">"Ierīču vadīklas"</string>
     <string name="quick_controls_subtitle" msgid="1667408093326318053">"Pievienojiet vadīklas pievienotajām ierīcēm"</string>
-    <string name="quick_controls_setup_title" msgid="8901436655997849822">"Ierīces vadīklu iestatīšana"</string>
+    <string name="quick_controls_setup_title" msgid="8901436655997849822">"Ierīču vadīklu iestatīšana"</string>
     <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"Turiet nospiestu barošanas pogu, lai piekļūtu vadīklām."</string>
     <string name="controls_providers_title" msgid="6879775889857085056">"Izvēlieties lietotni, lai pievienotu vadīklas"</string>
     <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380">
@@ -1022,13 +1029,11 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"Vadīklas"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Izvēlieties vadīklas, kurām piekļūt no barošanas izvēlnes"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Lai pārkārtotu vadīklas, turiet un velciet tās"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"Visas vadīklas ir noņemtas"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"Nevarēja ielādēt sarakstu ar visām vadīklām."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Cita"</string>
-    <string name="controls_dialog_title" msgid="2343565267424406202">"Pievienošana ierīces vadīklām"</string>
+    <string name="controls_dialog_title" msgid="2343565267424406202">"Pievienošana ierīču vadīklām"</string>
     <string name="controls_dialog_ok" msgid="7011816381344485651">"Pievienot izlasei"</string>
     <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> ieteica pievienot šo vadīklu izlasei."</string>
     <string name="controls_dialog_confirmation" msgid="586517302736263447">"Vadīklas atjauninātas"</string>
diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml
index c41cc5a..67392bb 100644
--- a/packages/SystemUI/res/values-mk/strings.xml
+++ b/packages/SystemUI/res/values-mk/strings.xml
@@ -33,7 +33,7 @@
     <string name="invalid_charger_title" msgid="938685362320735167">"Не може да се полни преку USB"</string>
     <string name="invalid_charger_text" msgid="2339310107232691577">"Користете го полначот што дојде со вашиот уред"</string>
     <string name="battery_low_why" msgid="2056750982959359863">"Поставки"</string>
-    <string name="battery_saver_confirmation_title" msgid="1234998463717398453">"Да се вклучи штедачот на батерија?"</string>
+    <string name="battery_saver_confirmation_title" msgid="1234998463717398453">"Да се вклучи „Штедачот на батерија“?"</string>
     <string name="battery_saver_confirmation_title_generic" msgid="2299231884234959849">"За „Штедачот на батерија“"</string>
     <string name="battery_saver_confirmation_ok" msgid="5042136476802816494">"Вклучи"</string>
     <string name="battery_saver_start_action" msgid="4553256017945469937">"Да се вклучи штедачот на батерија?"</string>
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"Сликата од екранот не може да се зачува поради ограничена меморија"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Апликацијата или вашата организација не дозволува снимање слики од екранот"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Отфрлете ја сликата од екранот"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"Отворете ја сликата од екранот"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"Преглед на слика од екранот"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"Снимач на екран"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Тековно известување за сесија за снимање на екранот"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"Да се започне со снимање?"</string>
@@ -210,7 +210,7 @@
     <string name="accessibility_three_bars" msgid="819417766606501295">"Три цртички."</string>
     <string name="accessibility_signal_full" msgid="5920148525598637311">"Полн сигнал."</string>
     <string name="accessibility_desc_on" msgid="2899626845061427845">"Вклучена."</string>
-    <string name="accessibility_desc_off" msgid="8055389500285421408">"Исклучена."</string>
+    <string name="accessibility_desc_off" msgid="8055389500285421408">"Исклучено."</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"Поврзана."</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"Се поврзува."</string>
     <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
@@ -231,7 +231,7 @@
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"Мобилниот интернет е вклучен"</string>
     <string name="cell_data_off_content_description" msgid="9165555931499878044">"Мобилниот интернет е исклучен"</string>
     <string name="not_default_data_content_description" msgid="6757881730711522517">"Не е поставен да користи интернет"</string>
-    <string name="cell_data_off" msgid="4886198950247099526">"Исклучи"</string>
+    <string name="cell_data_off" msgid="4886198950247099526">"Исклучено"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"Се поврзува со Bluetooth."</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"Авионски режим."</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN е вклучена."</string>
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"Балонче"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"Ви помага да се концентрирате без звук или вибрации."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"Ви го привлекува вниманието со звук или вибрации."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"Ви го привлекува вниманието со звук или вибрации. Стандардно, разговорите од <xliff:g id="APP_NAME">%1$s</xliff:g> се во балончиња."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Ви го задржува вниманието со лебдечка кратенка на содржинава."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Се појавува на горниот дел од разговорот и изгледа како балонче."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"Сите разговори од <xliff:g id="APP_NAME_0">%1$s</xliff:g> стандардно се во балончиња. Управувајте во <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Поставки"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Приоритет"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Нема неодамнешни балончиња"</string>
@@ -758,7 +758,7 @@
       <item quantity="one">%d минута</item>
       <item quantity="other">%d минути</item>
     </plurals>
-    <string name="battery_panel_title" msgid="5931157246673665963">"Користење батерија"</string>
+    <string name="battery_panel_title" msgid="5931157246673665963">"Искор. на батерија"</string>
     <string name="battery_detail_charging_summary" msgid="8821202155297559706">"Штедачот на батерија не е достапен при полнење"</string>
     <string name="battery_detail_switch_title" msgid="6940976502957380405">"Штедач на батерија"</string>
     <string name="battery_detail_switch_summary" msgid="3668748557848025990">"Ја намалува изведбата и податоците во заднина"</string>
@@ -961,7 +961,7 @@
     <string name="qs_dnd_replace" msgid="7712119051407052689">"Замени"</string>
     <string name="running_foreground_services_title" msgid="5137313173431186685">"Апликациите се извршуваат во заднина"</string>
     <string name="running_foreground_services_msg" msgid="3009459259222695385">"Допрете за детали за батеријата и потрошениот сообраќај"</string>
-    <string name="mobile_data_disable_title" msgid="5366476131671617790">"Да се исклучи ли мобилниот интернет?"</string>
+    <string name="mobile_data_disable_title" msgid="5366476131671617790">"Да се исклучи мобилниот интернет?"</string>
     <string name="mobile_data_disable_message" msgid="8604966027899770415">"Нема да имате пристап до податоците или интернетот преку <xliff:g id="CARRIER">%s</xliff:g>. Интернетот ќе биде достапен само преку Wi-Fi."</string>
     <string name="mobile_data_disable_message_default_carrier" msgid="6496033312431658238">"вашиот оператор"</string>
     <string name="touch_filtered_warning" msgid="8119511393338714836">"Бидејќи апликацијата го прикрива барањето за дозвола, „Поставките“ не може да го потврдат вашиот одговор."</string>
@@ -999,9 +999,16 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Контролирајте ги балончињата во секое време"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Допрете „Управувајте“ за да ги исклучите балончињата од апликацијава"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Сфатив"</string>
+    <!-- no translation found for bubbles_app_settings (5779443644062348657) -->
+    <skip />
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Навигацијата на системот е ажурирана. За да извршите промени, одете во „Поставки“."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Одете во „Поставки“ за да ја ажурирате навигацијата на системот"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Подготвеност"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Се прикажува најгоре во делот со разговори"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Се прикажува профилна слика на заклучен екран"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Се појавува како лебдечко балонче врз апликациите"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Прекинува „Не вознемирувај“"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Сфатив"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"Прозорец за преклопување на зголемувањето"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"Прозорец за зголемување"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"Контроли на прозорец за зголемување"</string>
@@ -1016,10 +1023,8 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"Контроли"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Изберете ги контролите до кои ќе пристапувате од менито за вклучување"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Задржете и влечете за да ги преуредите контролите"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"Сите контроли се отстранети"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"Не можеше да се вчита списокот со сите контроли."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Друга"</string>
     <string name="controls_dialog_title" msgid="2343565267424406202">"Додајте во контроли за уредите"</string>
diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml
index 2d53c8d..44a2aa1 100644
--- a/packages/SystemUI/res/values-ml/strings.xml
+++ b/packages/SystemUI/res/values-ml/strings.xml
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"സ്‌റ്റോറേജ് ഇടം പരിമിതമായതിനാൽ സ്‌ക്രീൻഷോട്ട് സംരക്ഷിക്കാനാകുന്നില്ല"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"സ്ക്രീൻഷോട്ടുകൾ എടുക്കുന്നത് ആപ്പോ നിങ്ങളുടെ സ്ഥാപനമോ അനുവദിക്കുന്നില്ല"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"സ്ക്രീൻഷോട്ട് ഡിസ്‌മിസ് ചെയ്യുക"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"സ്ക്രീൻഷോട്ട് തുറക്കുക"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"സ്‌ക്രീൻഷോട്ട് പ്രിവ്യു"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"സ്ക്രീൻ റെക്കോർഡർ"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"ഒരു സ്ക്രീൻ റെക്കോർഡിംഗ് സെഷനായി നിലവിലുള്ള അറിയിപ്പ്"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"റെക്കോർഡിംഗ് ആരംഭിക്കണോ?"</string>
@@ -500,7 +500,7 @@
     <string name="battery_saver_notification_text" msgid="2617841636449016951">"പ്രവർത്തനവും പശ്ചാത്തല ഡാറ്റയും കുറയ്‌ക്കുന്നു"</string>
     <string name="battery_saver_notification_action_text" msgid="6022091913807026887">"ബാറ്ററി ലാഭിക്കൽ ഓഫാക്കുക"</string>
     <string name="media_projection_dialog_text" msgid="1755705274910034772">"റെക്കോർഡ് ചെയ്യുമ്പോഴോ കാസ്‌റ്റ് ചെയ്യുമ്പോഴോ നിങ്ങളുടെ ഉപകരണത്തിൽ നിന്ന് പ്ലേ ചെയ്യുന്നതോ നിങ്ങളുടെ സ്‌ക്രീനിൽ ദൃശ്യമാകുന്നതോ ആയ എല്ലാ വിവരങ്ങളിലേക്കും <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> എന്നതിന് ആക്‌സസ് ഉണ്ടായിരിക്കും. നിങ്ങൾ പ്ലേ ചെയ്യുന്ന ഒഡിയോ, സന്ദേശങ്ങൾ, ഫോട്ടോകൾ, പേയ്‌മെന്റ് വിശദാംശങ്ങൾ, പാസ്‌വേഡുകൾ എന്നിവ പോലുള്ള വിവരങ്ങൾ ഇതിൽ ഉൾപ്പെടുന്നു."</string>
-    <string name="media_projection_dialog_service_text" msgid="958000992162214611">"റെക്കോർഡ് ചെയ്യുമ്പോഴോ കാസ്‌റ്റ് ചെയ്യുമ്പോഴോ നിങ്ങളുടെ ഉപകരണത്തിൽ നിന്ന് പ്ലേ ചെയ്യുന്നതോ നിങ്ങളുടെ സ്‌ക്രീനിൽ ദൃശ്യമാകുന്നതോ ആയ എല്ലാ വിവരങ്ങളിലേക്കും ഈ ഫംഗ്‌ഷൻ ലഭ്യമാക്കുന്ന സേവനത്തിന് ആക്‌സസ് ഉണ്ടായിരിക്കും. നിങ്ങൾ പ്ലേ ചെയ്യുന്ന ഒഡിയോ, സന്ദേശങ്ങൾ, ഫോട്ടോകൾ, പേയ്‌മെന്റ് വിശദാംശങ്ങൾ, പാസ്‌വേഡുകൾ എന്നിവ പോലുള്ള വിവരങ്ങൾ ഇതിൽ ഉൾപ്പെടുന്നു."</string>
+    <string name="media_projection_dialog_service_text" msgid="958000992162214611">"റെക്കോർഡ് ചെയ്യുമ്പോഴോ കാസ്‌റ്റ് ചെയ്യുമ്പോഴോ നിങ്ങളുടെ ഉപകരണത്തിൽ നിന്ന് പ്ലേ ചെയ്യുന്നതോ നിങ്ങളുടെ സ്‌ക്രീനിൽ ദൃശ്യമാകുന്നതോ ആയ എല്ലാ വിവരങ്ങളിലേക്കും ഈ ഫംഗ്‌ഷൻ ലഭ്യമാക്കുന്ന സേവനത്തിന് ആക്‌സസ് ഉണ്ടായിരിക്കും. നിങ്ങൾ പ്ലേ ചെയ്യുന്ന ഓഡിയോ, സന്ദേശങ്ങൾ, ഫോട്ടോകൾ, പേയ്‌മെന്റ് വിശദാംശങ്ങൾ, പാസ്‌വേഡുകൾ എന്നിവ പോലുള്ള വിവരങ്ങൾ ഇതിൽ ഉൾപ്പെടുന്നു."</string>
     <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"റെക്കോർഡ് ചെയ്യൽ അല്ലെങ്കിൽ കാസ്റ്റ് ചെയ്യൽ ആരംഭിക്കണോ?"</string>
     <string name="media_projection_dialog_title" msgid="3316063622495360646">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ഉപയോഗിച്ച് റെക്കോർഡ് ചെയ്യൽ അല്ലെങ്കിൽ കാസ്‌റ്റ് ചെയ്യൽ ആരംഭിക്കണോ?"</string>
     <string name="media_projection_remember_text" msgid="6896767327140422951">"വീണ്ടും കാണിക്കരുത്"</string>
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"ബബ്ൾ"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"ശബ്‌ദമോ വൈബ്രേഷനോ ഇല്ലാതെ ശ്രദ്ധ കേന്ദ്രീകരിക്കാൻ നിങ്ങളെ സഹായിക്കുന്നു."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"ശബ്‌ദമോ വെെബ്രേഷനോ ഉപയോഗിച്ച് നിങ്ങളുടെ ശ്രദ്ധ ക്ഷണിക്കുന്നു."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"ശബ്‌ദമോ വൈബ്രേഷനോ ഉപയോഗിച്ച് നിങ്ങളുടെ ശ്രദ്ധ ക്ഷണിക്കുന്നു. <xliff:g id="APP_NAME">%1$s</xliff:g>-ൽ നിന്നുള്ള എല്ലാ സംഭാഷണങ്ങളും ഡിഫോൾട്ടായി ബബ്ൾ ആവുന്നു."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"ഈ ഉള്ളടക്കത്തിലേക്ക് ഒരു ഫ്ലോട്ടിംഗ് കുറുക്കുവഴി ഉപയോഗിച്ച് നിങ്ങളുടെ ശ്രദ്ധ നിലനിർത്തുന്നു."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"സംഭാഷണ വിഭാഗത്തിന് മുകളിൽ ബബിളായി ദൃശ്യമാവുന്നു."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> എന്നതിൽ നിന്നുള്ള എല്ലാ സംഭാഷണങ്ങളും ഡിഫോൾട്ടായി ബബിളാവുന്നു. <xliff:g id="APP_NAME_1">%2$s</xliff:g> എന്നതിൽ മാനേജ് ചെയ്യുക."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ക്രമീകരണം"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"മുൻഗണന"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"അടുത്തിടെയുള്ള ബബിളുകൾ ഒന്നുമില്ല"</string>
@@ -847,7 +847,7 @@
     <string name="right_keycode" msgid="2480715509844798438">"വലതുവശത്തെ കീകോഡ്"</string>
     <string name="left_icon" msgid="5036278531966897006">"ഇടതുവശത്തെ ചിഹ്നം"</string>
     <string name="right_icon" msgid="1103955040645237425">"വലതുവശത്തെ ചിഹ്നം"</string>
-    <string name="drag_to_add_tiles" msgid="8933270127508303672">"ടൈലുകൾ ചേർക്കാൻ ക്ലിക്ക് ചെയ്ത് ഇഴയ്‌ക്കുക"</string>
+    <string name="drag_to_add_tiles" msgid="8933270127508303672">"ടൈലുകൾ ചേർക്കാൻ അമർത്തിപ്പിടിച്ച് വലിച്ചിടുക"</string>
     <string name="drag_to_rearrange_tiles" msgid="2143204300089638620">"ടൈലുകൾ പുനഃക്രമീകരിക്കാൻ അമർത്തിപ്പിടിച്ച് വലിച്ചിടുക"</string>
     <string name="drag_to_remove_tiles" msgid="4682194717573850385">"നീക്കംചെയ്യുന്നതിന് ഇവിടെ വലിച്ചിടുക"</string>
     <string name="drag_to_remove_disabled" msgid="933046987838658850">"നിങ്ങൾക്ക് ചുരുങ്ങിയത് <xliff:g id="MIN_NUM_TILES">%1$d</xliff:g> ടൈലുകളെങ്കിലും വേണം"</string>
@@ -999,9 +999,21 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"ബബിളുകൾ ഏതുസമയത്തും നിയന്ത്രിക്കുക"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"ഈ ആപ്പിൽ നിന്നുള്ള ബബിളുകൾ ഓഫാക്കാൻ മാനേജ് ചെയ്യുക ടാപ്പ് ചെയ്യുക"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"ലഭിച്ചു"</string>
+    <!-- no translation found for bubbles_app_settings (5779443644062348657) -->
+    <skip />
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"സിസ്‌റ്റം നാവിഗേഷൻ അപ്‌ഡേറ്റ് ചെയ്‌തു. മാറ്റങ്ങൾ വരുത്താൻ ക്രമീകരണത്തിലേക്ക് പോവുക."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"സിസ്‌റ്റം നാവിഗേഷൻ അപ്‌ഡേറ്റ് ചെയ്യാൻ ക്രമീകരണത്തിലേക്ക് പോവുക"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"സ്‌റ്റാൻഡ്‌ബൈ"</string>
+    <!-- no translation found for priority_onboarding_show_at_top_text (1678400241025513541) -->
+    <skip />
+    <!-- no translation found for priority_onboarding_show_avatar_text (5756291381124091508) -->
+    <skip />
+    <!-- no translation found for priority_onboarding_appear_as_bubble_text (4227039772250263122) -->
+    <skip />
+    <!-- no translation found for priority_onboarding_ignores_dnd_text (2918952762719600529) -->
+    <skip />
+    <!-- no translation found for priority_onboarding_done_button_title (4569550984286506007) -->
+    <skip />
     <string name="magnification_overlay_title" msgid="6584179429612427958">"മാഗ്നിഫിക്കേഷൻ ഓവർലേ വിൻഡോ"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"മാഗ്നിഫിക്കേഷൻ വിൻഡോ"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"മാഗ്നിഫിക്കേഷൻ വിൻഡോ നിയന്ത്രണങ്ങൾ"</string>
@@ -1016,10 +1028,8 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"നിയന്ത്രണങ്ങൾ"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"പവർ മെനുവിൽ നിന്ന് ആക്സസ് ചെയ്യേണ്ട നിയന്ത്രണങ്ങൾ തിരഞ്ഞെടുക്കുക"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"നിയന്ത്രണങ്ങൾ പുനഃക്രമീകരിക്കാൻ പിടിച്ച് വലിച്ചിടുക"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"എല്ലാ നിയന്ത്രണങ്ങളും നീക്കം ചെയ്തു"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"എല്ലാ നിയന്ത്രണങ്ങളുടെയും ലിസ്റ്റ് ലോഡ് ചെയ്യാനായില്ല."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"മറ്റുള്ളവ"</string>
     <string name="controls_dialog_title" msgid="2343565267424406202">"ഉപകരണ നിയന്ത്രണങ്ങളിലേക്ക് ചേർക്കുക"</string>
diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml
index b4bac5f..0f17270 100644
--- a/packages/SystemUI/res/values-mn/strings.xml
+++ b/packages/SystemUI/res/values-mn/strings.xml
@@ -33,7 +33,7 @@
     <string name="invalid_charger_title" msgid="938685362320735167">"USB-р цэнэглэх боломжгүй байна"</string>
     <string name="invalid_charger_text" msgid="2339310107232691577">"Төхөөрөмждөө дагалдаж ирсэн цэнэглэгчийг ашиглах"</string>
     <string name="battery_low_why" msgid="2056750982959359863">"Тохиргоо"</string>
-    <string name="battery_saver_confirmation_title" msgid="1234998463717398453">"Тэжээл хэмнэгчийг асаах уу?"</string>
+    <string name="battery_saver_confirmation_title" msgid="1234998463717398453">"Батарей хэмнэгчийг асаах уу?"</string>
     <string name="battery_saver_confirmation_title_generic" msgid="2299231884234959849">"Батарей хэмнэгчийн тухай"</string>
     <string name="battery_saver_confirmation_ok" msgid="5042136476802816494">"Асаах"</string>
     <string name="battery_saver_start_action" msgid="4553256017945469937">"Тэжээл хэмнэгчийг асаах"</string>
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"Сангийн багтаамж бага байгаа тул дэлгэцээс дарсан зургийг хадгалах боломжгүй байна"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Таны апп, байгууллагад дэлгэцийн зураг авахыг зөвшөөрдөггүй"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Дэлгэцийн агшныг хаах"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"Дэлгэцийн агшныг нээх"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"Дэлгэцийн агшныг урьдчилан үзэх"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"Дэлгэцийн үйлдэл бичигч"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Дэлгэц бичих горимын үргэлжилж буй мэдэгдэл"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"Бичлэгийг эхлүүлэх үү?"</string>
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"Бөмбөлөг"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"Дуу эсвэл чичиргээгүйгээр танд төвлөрөхөд тусална."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"Дуу эсвэл чичиргээгүйгээр таны анхаарлыг татна."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"Дуу эсвэл чичиргээгээр таны анхаарлыг татна. <xliff:g id="APP_NAME">%1$s</xliff:g>-н харилцан яриаг өгөгдмөл тохиргоогоор бөмбөлөг болгоно."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Энэ контентын хөвөн гарч ирэх товчлолтойгоор таны анхаарлыг татдаг."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Харилцан ярианы хэсгийн дээд талд, бөмбөлөг хэлбэрээр харагдана."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"<xliff:g id="APP_NAME_0">%1$s</xliff:g>-н бүх харилцан яриаг өгөгдмөл тохиргоогоор бөмбөлөг болгоно. <xliff:g id="APP_NAME_1">%2$s</xliff:g>-д удирдана уу."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Тохиргоо"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Ач холбогдол"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Саяхны бөмбөлөг алга байна"</string>
@@ -847,7 +847,7 @@
     <string name="right_keycode" msgid="2480715509844798438">"Баруун түлхүүрийн код"</string>
     <string name="left_icon" msgid="5036278531966897006">"Зүүн дүрс тэмдэг"</string>
     <string name="right_icon" msgid="1103955040645237425">"Баруун дүрс тэмдэг"</string>
-    <string name="drag_to_add_tiles" msgid="8933270127508303672">"Хавтанд нэмэхийн тулд дараад чирэх"</string>
+    <string name="drag_to_add_tiles" msgid="8933270127508303672">"Хавтан нэмэхийн тулд дараад чирэх"</string>
     <string name="drag_to_rearrange_tiles" msgid="2143204300089638620">"Хавтангуудыг дахин засварлахын тулд дараад чирнэ үү"</string>
     <string name="drag_to_remove_tiles" msgid="4682194717573850385">"Устгахын тулд энд зөөнө үү"</string>
     <string name="drag_to_remove_disabled" msgid="933046987838658850">"Танд хамгийн багадаа <xliff:g id="MIN_NUM_TILES">%1$d</xliff:g> хавтан шаардлагатай"</string>
@@ -999,9 +999,16 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Дурын үед бөмбөлгийг хянаарай"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Энэ аппын бөмбөлгүүдийг унтраахын тулд Удирдах дээр товшино уу"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Ойлголоо"</string>
+    <!-- no translation found for bubbles_app_settings (5779443644062348657) -->
+    <skip />
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Системийн навигацыг шинэчиллээ. Өөрчлөхийн тулд Тохиргоо руу очно уу."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Системийн навигацыг шинэчлэхийн тулд Тохиргоо руу очно уу"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Зогсолтын горим"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Харилцан ярианы хэсгийн дээд талд харуулна"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Түгжигдсэн дэлгэц дээр профайлын зургийг харуулна"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Аппуудын дээр хөвөгч бөмбөлөг хэлбэрээр харагдана"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Бүү саад бол онцлогийг үл хэрэгсэн тасалдуулна"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Ойлголоо"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"Томруулалтыг давхарласан цонх"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"Томруулалтын цонх"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"Томруулалтын цонхны хяналт"</string>
@@ -1016,10 +1023,8 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"Хяналт"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Тэжээлийн цэсээс хандах хяналтуудыг сонгоно уу"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Хяналтуудыг дахин засварлахын тулд дараад чирнэ үү"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"Бүх хяналтыг хассан"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"Бүх хяналтын жагсаалтыг ачаалж чадсангүй."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Бусад"</string>
     <string name="controls_dialog_title" msgid="2343565267424406202">"Төхөөрөмжийн хяналт руу нэмэх"</string>
diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml
index de4f39f..926b636 100644
--- a/packages/SystemUI/res/values-mr/strings.xml
+++ b/packages/SystemUI/res/values-mr/strings.xml
@@ -28,7 +28,7 @@
     <string name="battery_low_percent_format" msgid="4276661262843170964">"<xliff:g id="PERCENTAGE">%s</xliff:g> शिल्लक"</string>
     <string name="battery_low_percent_format_hybrid" msgid="3985614339605686167">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> बाकी, तुमच्या वापरावर आधारित सुमारे <xliff:g id="TIME">%2$s</xliff:g> शिल्लक"</string>
     <string name="battery_low_percent_format_hybrid_short" msgid="5917433188456218857">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> बाकी, सुमारे <xliff:g id="TIME">%2$s</xliff:g> शिल्लक"</string>
-    <string name="battery_low_percent_format_saver_started" msgid="4968468824040940688">"<xliff:g id="PERCENTAGE">%s</xliff:g> शिल्लक. बॅटरी सेव्‍हर चालू आहे."</string>
+    <string name="battery_low_percent_format_saver_started" msgid="4968468824040940688">"<xliff:g id="PERCENTAGE">%s</xliff:g> शिल्लक. बॅटरी सेव्‍हर सुरू आहे."</string>
     <string name="invalid_charger" msgid="4370074072117767416">"USB द्वारे चार्ज करू शकत नाही. तुमच्या डिव्हाइससह आलेल्‍या चार्जरचा वापर करा."</string>
     <string name="invalid_charger_title" msgid="938685362320735167">"USB द्वारे चार्ज होऊ शकत नाही"</string>
     <string name="invalid_charger_text" msgid="2339310107232691577">"तुमच्या डिव्हाइससह आलेल्या चार्जरचा वापर करा"</string>
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"मर्यादित स्टोरेज जागेमुळे स्क्रीनशॉट सेव्ह करू शकत नाही"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"अ‍ॅप किंवा आपल्या संस्थेद्वारे स्क्रीनशॉट घेण्याची अनुमती नाही"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"स्क्रीनशॉट डिसमिस करा"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"स्क्रीनशॉट उघडा"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"स्क्रीनशॉटचे पूर्वावलोकन"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"स्क्रीन रेकॉर्डर"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"स्क्रीन रेकॉर्ड सत्रासाठी सुरू असलेली सूचना"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"रेकॉर्डिंग सुरू करायचे आहे का?"</string>
@@ -228,7 +228,7 @@
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"वाय-फाय"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"सिम नाही."</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"मोबाइल डेटा"</string>
-    <string name="accessibility_cell_data_on" msgid="691666434519443162">"मोबाइल डेटा चालू आहे"</string>
+    <string name="accessibility_cell_data_on" msgid="691666434519443162">"मोबाइल डेटा सुरू आहे"</string>
     <string name="cell_data_off_content_description" msgid="9165555931499878044">"मोबाइल डेटा बंद आहे"</string>
     <string name="not_default_data_content_description" msgid="6757881730711522517">"डेटा वापरण्यासाठी सेट केलेले नाही"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"बंद"</string>
@@ -352,7 +352,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"ऑडिओ"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"हेडसेट"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="3887552721233148132">"इनपुट"</string>
-    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="3003338571871392293">"श्रवण यंत्रे"</string>
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="3003338571871392293">"श्रवणयंत्रे"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="3882884317600669650">"सुरू करत आहे…"</string>
     <string name="quick_settings_brightness_label" msgid="680259653088849563">"चमक"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="2359922767950346112">"ऑटो-रोटेट"</string>
@@ -384,10 +384,10 @@
     <string name="quick_settings_cast_device_default_name" msgid="6988469571141331700">"निनावी डिव्हाइस"</string>
     <string name="quick_settings_cast_device_default_description" msgid="2580520859212250265">"कास्ट करण्यास तयार"</string>
     <string name="quick_settings_cast_detail_empty_text" msgid="2846282280014617785">"कोणतेही डिव्हाइसेस उपलब्ध नाहीत"</string>
-    <string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"वाय-फाय कनेक्ट केलेले नाही"</string>
+    <string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"वाय-फाय नाही"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"चमक"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="2325362583903258677">"स्वयंचलित"</string>
-    <string name="quick_settings_inversion_label" msgid="5078769633069667698">"रंग उलटे लावा"</string>
+    <string name="quick_settings_inversion_label" msgid="5078769633069667698">"रंग उलटे करा"</string>
     <string name="quick_settings_color_space_label" msgid="537528291083575559">"रंग सुधारणा मोड"</string>
     <string name="quick_settings_more_settings" msgid="2878235926753776694">"अधिक सेटिंग्ज"</string>
     <string name="quick_settings_done" msgid="2163641301648855793">"पूर्ण झाले"</string>
@@ -496,7 +496,7 @@
     <string name="user_remove_user_title" msgid="9124124694835811874">"वापरकर्त्यास काढायचे?"</string>
     <string name="user_remove_user_message" msgid="6702834122128031833">"या वापरकर्त्याचे सर्व अ‍ॅप्स आणि डेटा काढून टाकला जाईल."</string>
     <string name="user_remove_user_remove" msgid="8387386066949061256">"काढा"</string>
-    <string name="battery_saver_notification_title" msgid="8419266546034372562">"बॅटरी सेव्‍हर चालू आहे"</string>
+    <string name="battery_saver_notification_title" msgid="8419266546034372562">"बॅटरी सेव्‍हर सुरू आहे"</string>
     <string name="battery_saver_notification_text" msgid="2617841636449016951">"कामगिरी आणि पार्श्वभूमीवरील डेटा कमी करते"</string>
     <string name="battery_saver_notification_action_text" msgid="6022091913807026887">"बॅटरी सेव्हर बंद करा"</string>
     <string name="media_projection_dialog_text" msgid="1755705274910034772">"तुमच्या स्क्रीनवर दृश्यमान असलेल्या किंवा रेकॉर्ड किंवा कास्ट करताना तुमच्या डिव्हाइसमधून प्ले केलेल्या सर्व माहितीचा अ‍ॅक्सेस <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ला असेल. यामध्ये पासवर्ड, पेमेंट तपशील, फोटो, मेसेज आणि तुम्ही प्ले केलेला ऑडिओ यासारख्या माहितीचा समावेश असतो."</string>
@@ -633,9 +633,9 @@
     <string name="output_calls_title" msgid="7085583034267889109">"फोन कॉल आउटपुट"</string>
     <string name="output_none_found" msgid="5488087293120982770">"कोणतीही डिव्हाइस सापडली नाहीत"</string>
     <string name="output_none_found_service_off" msgid="935667567681386368">"कोणतीही डिव्हाइस सापडली नाहीत. <xliff:g id="SERVICE">%1$s</xliff:g> चालू करून पाहा"</string>
-    <string name="output_service_bt" msgid="4315362133973911687">"ब्लुटूथ"</string>
+    <string name="output_service_bt" msgid="4315362133973911687">"ब्लूटूथ"</string>
     <string name="output_service_wifi" msgid="9003667810868222134">"वाय-फाय"</string>
-    <string name="output_service_bt_wifi" msgid="7186882540475524124">"ब्लुटूथ आणि वाय-फाय"</string>
+    <string name="output_service_bt_wifi" msgid="7186882540475524124">"ब्लूटूथ आणि वाय-फाय"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"सिस्टम UI ट्युनर"</string>
     <string name="show_battery_percentage" msgid="6235377891802910455">"एम्बेडेड बॅटरी टक्केवारी दर्शवा"</string>
     <string name="show_battery_percentage_summary" msgid="9053024758304102915">"चार्ज होत नसताना स्टेटस बार चिन्हामध्‍ये बॅटरी पातळी टक्केवारी दर्शवा"</string>
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"बबल"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"आवाज किंवा व्हायब्रेशनशिवाय तुम्हाला लक्ष केंद्रित करण्यास मदत करते."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"आवाज किंवा व्हायब्रेशनने तुमचे लक्ष वेधून घेते."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"आवाज किंवा व्हायब्रेशनने तुमचे लक्ष वेधून घेते. <xliff:g id="APP_NAME">%1$s</xliff:g> मधील संभाषणे बाय डीफॉल्ट बबल होतात."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"या आशयाच्या फ्लोटिंग शॉर्टकटसह तुमचे लक्ष केंद्रित करते."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"संभाषण विभागाच्या सर्वात वरती दिसते आणि बबलसारखे दिसते."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> वरील सर्व संभाषणे बाय डीफॉल्ट बबल केली जातात. <xliff:g id="APP_NAME_1">%2$s</xliff:g> मध्ये व्यवस्थापित करा."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"सेटिंग्ज"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"प्राधान्य"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"अलीकडील कोणतेही बबल नाहीत"</string>
@@ -759,8 +759,8 @@
       <item quantity="one">%d मिनिट</item>
     </plurals>
     <string name="battery_panel_title" msgid="5931157246673665963">"बॅटरी वापर"</string>
-    <string name="battery_detail_charging_summary" msgid="8821202155297559706">"चार्ज करताना बॅटरी बचतकर्ता उपलब्ध नाही"</string>
-    <string name="battery_detail_switch_title" msgid="6940976502957380405">"बॅटरी बचतकर्ता"</string>
+    <string name="battery_detail_charging_summary" msgid="8821202155297559706">"चार्ज करताना बॅटरी सेव्हर उपलब्ध नाही"</string>
+    <string name="battery_detail_switch_title" msgid="6940976502957380405">"बॅटरी सेव्हर"</string>
     <string name="battery_detail_switch_summary" msgid="3668748557848025990">"कामगिरी आणि पार्श्वभूमीवरील डेटा कमी करते"</string>
     <string name="keyboard_key_button_template" msgid="8005673627272051429">"बटण <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
@@ -815,7 +815,7 @@
     <string name="accessibility_status_bar_headphones" msgid="1304082414912647414">"हेडफोन कनेक्ट केले"</string>
     <string name="accessibility_status_bar_headset" msgid="2699275863720926104">"हेडसेट कनेक्ट केला"</string>
     <string name="data_saver" msgid="3484013368530820763">"डेटा सेव्हर"</string>
-    <string name="accessibility_data_saver_on" msgid="5394743820189757731">"डेटा सेव्हर चालू आहे"</string>
+    <string name="accessibility_data_saver_on" msgid="5394743820189757731">"डेटा सेव्हर सुरू आहे"</string>
     <string name="accessibility_data_saver_off" msgid="58339669022107171">"डेटा सेव्हर बंद आहे"</string>
     <string name="switch_bar_on" msgid="1770868129120096114">"सुरू"</string>
     <string name="switch_bar_off" msgid="5669805115416379556">"बंद"</string>
@@ -913,8 +913,8 @@
     <string name="pip_skip_to_next" msgid="3864212650579956062">"डावलून पुढे जा"</string>
     <string name="pip_skip_to_prev" msgid="3742589641443049237">"डावलून मागे जा"</string>
     <string name="thermal_shutdown_title" msgid="2702966892682930264">"तापल्‍यामुळे फोन बंद झाला"</string>
-    <string name="thermal_shutdown_message" msgid="7432744214105003895">"तुमचा फोन आता व्‍यवस्थित चालू आहे"</string>
-    <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"तुमचा फोन खूप तापलाय, म्हणून तो थंड होण्यासाठी बंद झाला आहे. तुमचा फोन आता व्‍यवस्थित चालू आहे.\n\nतुम्ही असे केल्यास तुमचा फोन खूप तापेल:\n	•संसाधन केंद्रित अ‍ॅप वापरणे (गेमिंग, व्हिडिओ किंवा नेव्हिगेशन अ‍ॅप यासारखे)\n	•मोठ्या फायली डाउनलोड किंवा अपलोड करणे\n	•उच्च तापमानामध्ये तुमचा फोन वापरणे"</string>
+    <string name="thermal_shutdown_message" msgid="7432744214105003895">"तुमचा फोन आता व्‍यवस्थित सुरू आहे"</string>
+    <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"तुमचा फोन खूप तापलाय, म्हणून तो थंड होण्यासाठी बंद झाला आहे. तुमचा फोन आता व्‍यवस्थित सुरू आहे.\n\nतुम्ही असे केल्यास तुमचा फोन खूप तापेल:\n	•संसाधन केंद्रित अ‍ॅप वापरणे (गेमिंग, व्हिडिओ किंवा नेव्हिगेशन अ‍ॅप यासारखे)\n	•मोठ्या फायली डाउनलोड किंवा अपलोड करणे\n	•उच्च तापमानामध्ये तुमचा फोन वापरणे"</string>
     <string name="high_temp_title" msgid="2218333576838496100">"फोन ऊष्ण होत आहे"</string>
     <string name="high_temp_notif_message" msgid="163928048626045592">"फोन थंड होत असताना काही वैशिष्‍ट्ये मर्यादित असतात"</string>
     <string name="high_temp_dialog_message" msgid="3793606072661253968">"तुमचा फोन स्वयंचलितपणे थंड होईल. तुम्ही अद्यापही तुमचा फोन वापरू शकता परंतु तो कदाचित धीमेपणे कार्य करेल.\n\nतुमचा फोन एकदा थंड झाला की, तो सामान्यपणे कार्य करेल."</string>
@@ -959,7 +959,7 @@
     <string name="qs_dnd_until" msgid="7844269319043747955">"<xliff:g id="ID_1">%s</xliff:g> पर्यंत"</string>
     <string name="qs_dnd_keep" msgid="3829697305432866434">"ठेवा"</string>
     <string name="qs_dnd_replace" msgid="7712119051407052689">"पुनर्स्थित करा"</string>
-    <string name="running_foreground_services_title" msgid="5137313173431186685">"ॲप्‍स बॅकग्राउंडमध्‍ये चालू आहेत"</string>
+    <string name="running_foreground_services_title" msgid="5137313173431186685">"अ‍ॅप्स बॅकग्राउंडमध्‍ये सुरू आहेत"</string>
     <string name="running_foreground_services_msg" msgid="3009459259222695385">"बॅटरी आणि डेटा वापराच्‍या तपशीलांसाठी टॅप करा"</string>
     <string name="mobile_data_disable_title" msgid="5366476131671617790">"मोबाइल डेटा बंद करायचा?"</string>
     <string name="mobile_data_disable_message" msgid="8604966027899770415">"तुम्हाला <xliff:g id="CARRIER">%s</xliff:g> मधून डेटा किंवा इंटरनेटचा अ‍ॅक्सेस नसेल. इंटरनेट फक्त वाय-फाय मार्फत उपलब्ध असेल."</string>
@@ -971,10 +971,10 @@
     <string name="slice_permission_checkbox" msgid="4242888137592298523">"<xliff:g id="APP">%1$s</xliff:g> ला कुठल्याही अ‍ॅपमधील तुकडे दाखवण्याची अनुमती द्या"</string>
     <string name="slice_permission_allow" msgid="6340449521277951123">"अनुमती द्या"</string>
     <string name="slice_permission_deny" msgid="6870256451658176895">"नकार द्या"</string>
-    <string name="auto_saver_title" msgid="6873691178754086596">"बॅटरी बचतकर्ता शेड्यूल करण्यासाठी टॅप करा"</string>
+    <string name="auto_saver_title" msgid="6873691178754086596">"बॅटरी सेव्हर शेड्यूल करण्यासाठी टॅप करा"</string>
     <string name="auto_saver_text" msgid="3214960308353838764">"बॅटरी संपण्याची शक्यता असल्यास सुरू करा"</string>
     <string name="no_auto_saver_action" msgid="7467924389609773835">"नाही नको"</string>
-    <string name="auto_saver_enabled_title" msgid="4294726198280286333">"बॅटरी बचतकर्ता शेड्यूल सुरू केले आहे"</string>
+    <string name="auto_saver_enabled_title" msgid="4294726198280286333">"बॅटरी सेव्हर शेड्यूल सुरू केले आहे"</string>
     <string name="auto_saver_enabled_text" msgid="7889491183116752719">"बॅटरी <xliff:g id="PERCENTAGE">%d</xliff:g>%% पेक्षा खाली गेल्यास बॅटरी सेव्हर आपोआप सुरू होईल."</string>
     <string name="open_saver_setting_action" msgid="2111461909782935190">"सेटिंग्ज"</string>
     <string name="auto_saver_okay_action" msgid="7815925750741935386">"समजले"</string>
@@ -999,9 +999,21 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"बबल कधीही नियंत्रित करा"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"या अ‍ॅपमधून बबल बंद करण्यासाठी व्यवस्थापित करा वर टॅप करा"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"समजले"</string>
+    <!-- no translation found for bubbles_app_settings (5779443644062348657) -->
+    <skip />
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"सिस्टम नेव्हिगेशन अपडेट केले. बदल करण्यासाठी, सेटिंग्जवर जा."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"सिस्टम नेव्हिगेशन अपडेट करण्यासाठी सेटिंग्जवर जा"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"स्टँडबाय"</string>
+    <!-- no translation found for priority_onboarding_show_at_top_text (1678400241025513541) -->
+    <skip />
+    <!-- no translation found for priority_onboarding_show_avatar_text (5756291381124091508) -->
+    <skip />
+    <!-- no translation found for priority_onboarding_appear_as_bubble_text (4227039772250263122) -->
+    <skip />
+    <!-- no translation found for priority_onboarding_ignores_dnd_text (2918952762719600529) -->
+    <skip />
+    <!-- no translation found for priority_onboarding_done_button_title (4569550984286506007) -->
+    <skip />
     <string name="magnification_overlay_title" msgid="6584179429612427958">"मॅग्निफिकेशन ओव्हरले विंडो"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"मॅग्निफिकेशन विंडो"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"मॅग्निफिकेशन विंडो नियंत्रणे"</string>
@@ -1016,10 +1028,8 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"नियंत्रणे"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"पॉवर मेनूमधून अ‍ॅक्सेस करण्यासाठी नियंत्रणे निवडा"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"नियंत्रणांची पुनर्रचना करण्यासाठी धरून ठेवा आणि ड्रॅग करा"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"सर्व नियंत्रणे काढून टाकली आहेत"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"सर्व नियंत्रणांची सूची लोड करता आली नाही."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"इतर"</string>
     <string name="controls_dialog_title" msgid="2343565267424406202">"डिव्हाइस नियंत्रणांमध्ये जोडा"</string>
diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml
index 94334a6..efd2c85 100644
--- a/packages/SystemUI/res/values-ms/strings.xml
+++ b/packages/SystemUI/res/values-ms/strings.xml
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"Tidak dapat menyimpan tangkapan skrin kerana ruang storan terhad"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Pengambilan tangkapan skrin tidak dibenarkan oleh apl atau organisasi anda"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Ketepikan tangkapan skrin"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"Buka tangkapan skrin"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"Pratonton tangkapan skrin"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"Perakam Skrin"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Pemberitahuan breterusan untuk sesi rakaman skrin"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"Mula Merakam?"</string>
@@ -427,7 +427,7 @@
     <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
     <string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC dilumpuhkan"</string>
     <string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC didayakan"</string>
-    <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Saring Rekod"</string>
+    <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Rakam Skrin"</string>
     <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Mula"</string>
     <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Berhenti"</string>
     <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Leret ke atas untuk menukar apl"</string>
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"Gelembung"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"Membantu anda fokus tanpa bunyi atau getaran."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"Menarik perhatian anda dengan bunyi atau getaran."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"Menarik perhatian anda dengan bunyi atau getaran. Perbualan daripada gelembung <xliff:g id="APP_NAME">%1$s</xliff:g> secara lalai."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Memastikan anda memberikan perhatian dengan pintasan terapung ke kandungan ini."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Ditunjukkan di sebelah atas bahagian perbualan dan muncul sebagai gelembung."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"Semua perbualan daripada gelembung <xliff:g id="APP_NAME_0">%1$s</xliff:g> secara lalainya. Urus dalam <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Tetapan"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Keutamaan"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Tiada gelembung terbaharu"</string>
@@ -999,9 +999,16 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Kawal gelembung pada bila-bila masa"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Ketik Urus untuk mematikan gelembung daripada apl ini"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"OK"</string>
+    <!-- no translation found for bubbles_app_settings (5779443644062348657) -->
+    <skip />
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Navigasi sistem dikemas kini. Untuk membuat perubahan, pergi ke Tetapan."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Pergi ke Tetapan untuk mengemas kini navigasi sistem"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Tunggu sedia"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Tunjukkan di atas bahagian perbualan"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Tunjukkan gambar profil pada skrin kunci"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Dipaparkan sebagai gelembung terapung di atas apl"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Ganggu Ciri Jangan Ganggu"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"OK"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"Tetingkap Tindanan Pembesaran"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"Tetingkap Pembesaran"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"Kawalan Tetingkap Pembesaran"</string>
@@ -1016,10 +1023,8 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"Kawalan"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Pilih kawalan untuk diakses daripada menu kuasa"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Tahan &amp; seret untuk mengatur semula kawalan"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"Semua kawalan dialih keluar"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"Senarai semua kawalan tidak dapat dimuatkan."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Lain-lain"</string>
     <string name="controls_dialog_title" msgid="2343565267424406202">"Tambahkan pada kawalan peranti"</string>
diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml
index 3dd9c8b..e4a07fb 100644
--- a/packages/SystemUI/res/values-my/strings.xml
+++ b/packages/SystemUI/res/values-my/strings.xml
@@ -33,7 +33,7 @@
     <string name="invalid_charger_title" msgid="938685362320735167">"USB ဖြင့် အားသွင်း၍မရပါ"</string>
     <string name="invalid_charger_text" msgid="2339310107232691577">"သင့်စက်ပစ္စည်းနှင့် အတူပါလာသည့် အားသွင်းကိရိယာကို အသုံးပြုပါ"</string>
     <string name="battery_low_why" msgid="2056750982959359863">"ဆက်တင်များ"</string>
-    <string name="battery_saver_confirmation_title" msgid="1234998463717398453">"ဘက်ထရီ အားထိန်းကို ဖွင့်ခြင်း"</string>
+    <string name="battery_saver_confirmation_title" msgid="1234998463717398453">"ဘက်ထရီအားထိန်းကို ဖွင့်မလား။"</string>
     <string name="battery_saver_confirmation_title_generic" msgid="2299231884234959849">"\'ဘက်ထရီအားထိန်း\' အကြောင်း"</string>
     <string name="battery_saver_confirmation_ok" msgid="5042136476802816494">"ဖွင့်ရန်"</string>
     <string name="battery_saver_start_action" msgid="4553256017945469937">"ဘက်ထရီ အားထိန်းကို ဖွင့်ရန်"</string>
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"သိုလှောင်ခန်းနေရာ အကန့်အသတ်ရှိသောကြောင့် ဖန်သားပြင်ဓာတ်ပုံကို သိမ်းဆည်း၍မရပါ"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"ဖန်သားပြင်ဓာတ်ပုံရိုက်ကူးခြင်းကို ဤအက်ပ် သို့မဟုတ် သင်၏အဖွဲ့အစည်းက ခွင့်မပြုပါ"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"ဖန်သားပြင်ဓာတ်ပုံ ပယ်ရန်"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"ဖန်သားပြင်ဓာတ်ပုံ ဖွင့်ရန်"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"ဖန်သားပြင်ဓာတ်ပုံ အစမ်းကြည့်ရှုခြင်း"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"ဖန်သားပြင် ရိုက်ကူးမှု"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"ဖန်သားပြင် ရိုက်ကူးသည့် စက်ရှင်အတွက် ဆက်တိုက်လာနေသော အကြောင်းကြားချက်"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"စတင် ရိုက်ကူးမလား။"</string>
@@ -233,7 +233,7 @@
     <string name="not_default_data_content_description" msgid="6757881730711522517">"ဒေတာအသုံးပြုရန် သတ်မှတ်မထားပါ"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"ပိတ်ရန်"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"ဘလူးတုသ်သုံး၍ ချိတ်ဆက်ခြင်း"</string>
-    <string name="accessibility_airplane_mode" msgid="1899529214045998505">"လေယာဥ်ပျံပေါ်အသုံးပြုသောစနစ်။"</string>
+    <string name="accessibility_airplane_mode" msgid="1899529214045998505">"လေယာဉ်ပျံမုဒ်"</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN ကို ဖွင့်ထားသည်။"</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"SIM ကတ် မရှိပါ"</string>
     <string name="carrier_network_change_mode" msgid="5174141476991149918">"ဝန်ဆောင်မှုပေးသူ ကွန်ရက် ပြောင်းလဲနေသည်။"</string>
@@ -648,7 +648,7 @@
     <string name="status_bar_ethernet" msgid="5690979758988647484">"အီသာနက်"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"နှိုးစက်"</string>
     <string name="status_bar_work" msgid="5238641949837091056">"အလုပ် ပရိုဖိုင်"</string>
-    <string name="status_bar_airplane" msgid="4848702508684541009">"လေယာဉ်ပေါ်သုံးစနစ်"</string>
+    <string name="status_bar_airplane" msgid="4848702508684541009">"လေယာဉ်ပျံမုဒ်"</string>
     <string name="add_tile" msgid="6239678623873086686">"လေးထောင့်ကွက် ထည့်ရန်"</string>
     <string name="broadcast_tile" msgid="5224010633596487481">"လေးထောင့်ကွက် ထုတ်လွှင့်ရန်"</string>
     <string name="zen_alarm_warning_indef" msgid="5252866591716504287">"သင့်ရဲ့ နောက်ထပ်နှိုးစက် <xliff:g id="WHEN">%1$s</xliff:g> ကိုသင်ကြားမည်မဟုတ်ပါ အကယ်၍ သင်၎င်းအချိန်မတိုင်"</string>
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"ပူဖောင်းဖောက်သံ"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"အသံ သို့မဟုတ် တုန်ခါမှု မပါဘဲ အာရုံစိုက်နိုင်စေရန် ကူညီပေးသည်။"</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"အသံ သို့မဟုတ် တုန်ခါမှုဖြင့် အာရုံစိုက်လာအောင် ပြုလုပ်သည်။"</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"အသံ သို့မဟုတ် တုန်ခါမှုဖြင့် သတိထားမိစေသည်။ မူရင်းသတ်မှတ်ချက်အဖြစ် <xliff:g id="APP_NAME">%1$s</xliff:g> မှ စကားဝိုင်းများကို ပူဖောင်းကွက်ဖြင့် ပြသည်။"</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"အကြောင်းအရာကို floating shortcut ကိုသုံး၍ အာရုံစိုက်လာအောင်လုပ်ပါ။"</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"စကားဝိုင်းကဏ္ဍ၏ ထိပ်ပိုင်းတွင် ပြပြီး ပူဖောင်းကွက်အဖြစ် မြင်ရသည်။"</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"မူရင်းသတ်မှတ်ချက်အဖြစ် <xliff:g id="APP_NAME_0">%1$s</xliff:g> စကားဝိုင်းအားလုံးကို ပူဖောင်းကွက်ပြုလုပ်သည်။ <xliff:g id="APP_NAME_1">%2$s</xliff:g> တွင် စီမံခန့်ခွဲပါ။"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ဆက်တင်များ"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"ဦးစားပေး"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"လတ်တလော ပူဖောင်းကွက်များ မရှိပါ"</string>
@@ -939,7 +939,7 @@
     <string name="notification_channel_battery" msgid="9219995638046695106">"ဘက်ထရီ"</string>
     <string name="notification_channel_screenshot" msgid="7665814998932211997">"မျက်နှာပြင်ဓာတ်ပုံများ"</string>
     <string name="notification_channel_general" msgid="4384774889645929705">"အထွေထွေ မက်ဆေ့ဂျ်များ"</string>
-    <string name="notification_channel_storage" msgid="2720725707628094977">"သိုလှောင်မှုများ"</string>
+    <string name="notification_channel_storage" msgid="2720725707628094977">"သိုလှောင်ခန်း"</string>
     <string name="notification_channel_hints" msgid="7703783206000346876">"အရိပ်အမြွက်များ"</string>
     <string name="instant_apps" msgid="8337185853050247304">"Instant Apps"</string>
     <string name="instant_apps_title" msgid="8942706782103036910">"<xliff:g id="APP">%1$s</xliff:g> လုပ်ဆောင်နေသည်"</string>
@@ -961,8 +961,8 @@
     <string name="qs_dnd_replace" msgid="7712119051407052689">"အစားထိုးရန်"</string>
     <string name="running_foreground_services_title" msgid="5137313173431186685">"နောက်ခံတွင် ပွင့်နေသော အက်ပ်များ"</string>
     <string name="running_foreground_services_msg" msgid="3009459259222695385">"ဘက်ထရီနှင့် ဒေတာအသုံးပြုမှု အသေးစိတ်ကို ကြည့်ရန် တို့ပါ"</string>
-    <string name="mobile_data_disable_title" msgid="5366476131671617790">"မိုဘိုင်းဒေတာ ပိတ်လိုပါသလား။"</string>
-    <string name="mobile_data_disable_message" msgid="8604966027899770415">"<xliff:g id="CARRIER">%s</xliff:g> မှတစ်ဆင့် ဒေတာ သို့မဟုတ် အင်တာနက်ကို သုံးစွဲ၍ မရနိုင်ပါ။ Wi-Fi အသုံးပြု၍သာ အင်တာနက် သုံးစွဲနိုင်ပါသည်။"</string>
+    <string name="mobile_data_disable_title" msgid="5366476131671617790">"မိုဘိုင်းဒေတာ ပိတ်မလား။"</string>
+    <string name="mobile_data_disable_message" msgid="8604966027899770415">"<xliff:g id="CARRIER">%s</xliff:g> မှတစ်ဆင့် ဒေတာ သို့မဟုတ် အင်တာနက်ကို မသုံးနိုင်ပါ။ Wi-Fi ဖြင့်သာ အင်တာနက် သုံးနိုင်သည်။"</string>
     <string name="mobile_data_disable_message_default_carrier" msgid="6496033312431658238">"သင်၏ ဝန်ဆောင်မှုပေးသူ"</string>
     <string name="touch_filtered_warning" msgid="8119511393338714836">"အပလီကေးရှင်းတစ်ခုက ခွင့်ပြုချက်တောင်းခံမှုကို ပိတ်ထားသောကြောင့် ဆက်တင်များသည် သင်၏ လုပ်ဆောင်ကို တုံ့ပြန်နိုင်ခြင်းမရှိပါ။"</string>
     <string name="slice_permission_title" msgid="3262615140094151017">"<xliff:g id="APP_0">%1$s</xliff:g> အား <xliff:g id="APP_2">%2$s</xliff:g> ၏အချပ်များ ပြသခွင့်ပြုပါသလား။"</string>
@@ -999,15 +999,21 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"ပူဖောင်းကွက်ကို အချိန်မရွေး ထိန်းချုပ်ရန်"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"ဤအက်ပ်မှနေ၍ ပူဖောင်းများကို ပိတ်ရန်အတွက် \'စီမံရန်\' ကို တို့ပါ"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"ရပါပြီ"</string>
+    <string name="bubbles_app_settings" msgid="5779443644062348657">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ဆက်တင်များ"</string>
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"စနစ်လမ်းညွှန်ခြင်း အပ်ဒိတ်လုပ်ပြီးပါပြီ။ အပြောင်းအလဲများ ပြုလုပ်ရန် \'ဆက်တင်များ\' သို့သွားပါ။"</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"စနစ်လမ်းညွှန်ခြင်း အပ်ဒိတ်လုပ်ရန် \'ဆက်တင်များ\' သို့သွားပါ"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"အသင့်အနေအထား"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"စကားဝိုင်းအပိုင်း၏ ထိပ်တွင်ပြရန်"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"လော့ခ်မျက်နှာပြင်တွင် ပရိုဖိုင်ပုံကို ပြရန်"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"အက်ပ်အပေါ်တွင် မျောနေသောပူ‌ဖောင်းကွက်အဖြစ် ပေါ်မည်"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"\'မနှောင့်ယှက်ရ\' ကို ကြားဖြတ်ခြင်း"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Ok"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"ဝင်းဒိုး ထပ်ပိုးလွှာ ချဲ့ခြင်း"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"ဝင်းဒိုး ချဲ့ခြင်း"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"ဝင်းဒိုး ထိန်းချုပ်မှုများ ချဲ့ခြင်း"</string>
-    <string name="quick_controls_title" msgid="6839108006171302273">"စက်ပစ္စည်း ထိန်းချုပ်မှုများ"</string>
+    <string name="quick_controls_title" msgid="6839108006171302273">"စက်ထိန်းစနစ်"</string>
     <string name="quick_controls_subtitle" msgid="1667408093326318053">"သင့်ချိတ်ဆက်ထားသော စက်များအတွက် ထိန်းချုပ်မှုများ ထည့်ပါ"</string>
-    <string name="quick_controls_setup_title" msgid="8901436655997849822">"စက်ပစ္စည်းထိန်းချုပ်မှုများကို စနစ်ထည့်သွင်းခြင်း"</string>
+    <string name="quick_controls_setup_title" msgid="8901436655997849822">"စက်ထိန်းစနစ် ထည့်သွင်းခြင်း"</string>
     <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"သင့်ထိန်းချုပ်မှုများကို အသုံးပြုရန် \'ပါဝါ\' ခလုတ်ကို ဖိထားပါ"</string>
     <string name="controls_providers_title" msgid="6879775889857085056">"ထိန်းချုပ်မှုများထည့်ရန် အက်ပ်ရွေးခြင်း"</string>
     <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380">
@@ -1020,7 +1026,7 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"ထိန်းချုပ်မှုအားလုံး ဖယ်ရှားလိုက်သည်"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"ထိန်းချုပ်မှုအားလုံး၏ စာရင်းကို ဖွင့်၍မရပါ။"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"အခြား"</string>
-    <string name="controls_dialog_title" msgid="2343565267424406202">"စက်ပစ္စည်းထိန်းချုပ်မှုများသို့ ထည့်ရန်"</string>
+    <string name="controls_dialog_title" msgid="2343565267424406202">"စက်ထိန်းစနစ်သို့ ထည့်ရန်"</string>
     <string name="controls_dialog_ok" msgid="7011816381344485651">"အကြိုက်ဆုံးများသို့ ထည့်ရန်"</string>
     <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> သည် ဤခလုတ်ကို သင့်အကြိုက်ဆုံးများသို့ ထည့်ရန် အကြံပြုထားသည်။"</string>
     <string name="controls_dialog_confirmation" msgid="586517302736263447">"ထိန်းချုပ်မှု အပ်ဒိတ်လုပ်ပြီးပြီ"</string>
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index da86548..5ee07ae 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"Kan ikke lagre skjermdumpen på grunn av begrenset lagringsplass"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Appen eller organisasjonen din tillater ikke at du tar skjermdumper"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Avvis skjermdumpen"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"Åpne skjermdumpen"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"Forhåndsvisning av skjermdump"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"Skjermopptaker"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Vedvarende varsel for et skjermopptak"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"Vil du starte opptaket?"</string>
@@ -582,7 +582,7 @@
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"Lydinnstillinger"</string>
     <string name="accessibility_volume_expand" msgid="7653070939304433603">"Utvid"</string>
     <string name="accessibility_volume_collapse" msgid="2746845391013829996">"Skjul"</string>
-    <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Automatisk teksting av media"</string>
+    <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Automatisk medieteksting"</string>
     <string name="accessibility_volume_close_odi_captions_tip" msgid="8924753283621160480">"Verktøytips for teksting"</string>
     <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Overlegg med teksting"</string>
     <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"slå på"</string>
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"Boble"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"Hjelper deg med å fokusere uten lyd eller vibrering."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"Får oppmerksomheten din med lyd eller vibrering."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"Får oppmerksomheten din med lyd eller vibrering. Samtaler fra <xliff:g id="APP_NAME">%1$s</xliff:g> lager bobler som standard."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Holder deg oppmerksom med en svevende snarvei til dette innholdet."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Vises øverst i en samtaledel og vises som en boble."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"Alle samtaler fra <xliff:g id="APP_NAME_0">%1$s</xliff:g> vises i bobler som standard. Administrer i <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Innstillinger"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioritet"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Ingen nylige bobler"</string>
@@ -962,7 +962,7 @@
     <string name="running_foreground_services_title" msgid="5137313173431186685">"Apper kjører i bakgrunnen"</string>
     <string name="running_foreground_services_msg" msgid="3009459259222695385">"Trykk for detaljer om batteri- og databruk"</string>
     <string name="mobile_data_disable_title" msgid="5366476131671617790">"Vil du slå av mobildata?"</string>
-    <string name="mobile_data_disable_message" msgid="8604966027899770415">"Du får ikke tilgang til data eller Internett via <xliff:g id="CARRIER">%s</xliff:g>. Internett blir bare tilgjengelig via Wi-Fi."</string>
+    <string name="mobile_data_disable_message" msgid="8604966027899770415">"Du får ikke tilgang til data eller internett via <xliff:g id="CARRIER">%s</xliff:g>. Internett er bare tilgjengelig via Wi-Fi."</string>
     <string name="mobile_data_disable_message_default_carrier" msgid="6496033312431658238">"operatøren din"</string>
     <string name="touch_filtered_warning" msgid="8119511393338714836">"Fordi en app skjuler tillatelsesforespørselen, kan ikke Innstillinger bekrefte svaret ditt."</string>
     <string name="slice_permission_title" msgid="3262615140094151017">"Vil du tillate at <xliff:g id="APP_0">%1$s</xliff:g> viser <xliff:g id="APP_2">%2$s</xliff:g>-utsnitt?"</string>
@@ -999,15 +999,22 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Kontrollér bobler når som helst"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Trykk på Administrer for å slå av bobler for denne appen"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Greit"</string>
+    <!-- no translation found for bubbles_app_settings (5779443644062348657) -->
+    <skip />
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Systemnavigeringen er oppdatert. For å gjøre endringer, gå til Innstillinger."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Gå til Innstillinger for å oppdatere systemnavigeringen"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Ventemodus"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Vis øverst i samtaledelen"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Vis profilbildet på låseskjermen"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Vises som en svevende boble over apper"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Overstyr «Ikke forstyrr»"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Greit"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"Overleggsvindu for forstørring"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"Forstørringsvindu"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"Kontroller for forstørringsvindu"</string>
-    <string name="quick_controls_title" msgid="6839108006171302273">"Enhetskontroller"</string>
+    <string name="quick_controls_title" msgid="6839108006171302273">"Enhetsstyring"</string>
     <string name="quick_controls_subtitle" msgid="1667408093326318053">"Legg til kontroller for de tilkoblede enhetene dine"</string>
-    <string name="quick_controls_setup_title" msgid="8901436655997849822">"Konfigurer enhetskontroller"</string>
+    <string name="quick_controls_setup_title" msgid="8901436655997849822">"Konfigurer enhetsstyring"</string>
     <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"Hold inne av/på-knappen for å få tilgang til kontrollene"</string>
     <string name="controls_providers_title" msgid="6879775889857085056">"Velg en app for å legge til kontroller"</string>
     <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380">
@@ -1016,13 +1023,11 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"Kontroller"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Velg kontroller som er tilgjengelige fra av/på-menyen"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Hold og dra for å flytte kontroller"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"Alle kontroller er fjernet"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"Listen over alle kontroller kunne ikke lastes inn."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Annet"</string>
-    <string name="controls_dialog_title" msgid="2343565267424406202">"Legg til i enhetskontroller"</string>
+    <string name="controls_dialog_title" msgid="2343565267424406202">"Legg til i enhetsstyring"</string>
     <string name="controls_dialog_ok" msgid="7011816381344485651">"Legg til som favoritt"</string>
     <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> har foreslått at du legger denne kontrollen til i favorittene dine."</string>
     <string name="controls_dialog_confirmation" msgid="586517302736263447">"Kontrollene er oppdatert"</string>
diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml
index 0fca63c..ec7efdb 100644
--- a/packages/SystemUI/res/values-ne/strings.xml
+++ b/packages/SystemUI/res/values-ne/strings.xml
@@ -87,7 +87,8 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"भण्डारण ठाउँ सीमित भएका कारण स्क्रिनसट सुरक्षित गर्न सकिएन"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"उक्त अनुप्रयोग वा तपाईंको संगठनले स्क्रिनसटहरू लिन दिँदैन"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"स्क्रिनसट हटाउनुहोस्"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"स्क्रिनसट खोल्नुहोस्"</string>
+    <!-- no translation found for screenshot_preview_description (7606510140714080474) -->
+    <skip />
     <string name="screenrecord_name" msgid="2596401223859996572">"स्क्रिन रेकर्डर"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"कुनै स्क्रिन रेकर्ड गर्ने सत्रका लागि चलिरहेको सूचना"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"रेकर्ड गर्न थाल्ने हो?"</string>
@@ -296,8 +297,8 @@
     <string name="accessibility_quick_settings_flashlight_on" msgid="3785616827729850766">"टर्च खुला छ।"</string>
     <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"टर्च बन्द गरियो।"</string>
     <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"टर्च खुला गरियो।"</string>
-    <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"रङ उल्टाउने बन्द गरियो।"</string>
-    <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"रङ उल्टाउने खुला गरियो।"</string>
+    <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"रङ्ग उल्टाउने बन्द गरियो।"</string>
+    <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"रङ्ग उल्टाउने खुला गरियो।"</string>
     <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"मोबाइल हटस्पट बन्द गरियो।"</string>
     <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"मोबाइल हटस्पट खुला गरियो।"</string>
     <string name="accessibility_casting_turned_off" msgid="1387906158563374962">"स्क्रिन कास्टिङ रोकियो।"</string>
@@ -418,7 +419,7 @@
     <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4063448287758262485">"सूर्योदयसम्म"</string>
     <string name="quick_settings_night_secondary_label_on_at" msgid="3584738542293528235">"<xliff:g id="TIME">%s</xliff:g> मा सक्रिय"</string>
     <string name="quick_settings_secondary_label_until" msgid="1883981263191927372">"<xliff:g id="TIME">%s</xliff:g> सम्म"</string>
-    <string name="quick_settings_ui_mode_night_label" msgid="1398928270610780470">"अँध्यारो विषयवस्तु"</string>
+    <string name="quick_settings_ui_mode_night_label" msgid="1398928270610780470">"अँध्यारो थिम"</string>
     <string name="quick_settings_dark_mode_secondary_label_battery_saver" msgid="4990712734503013251">"ब्याट्री सेभर"</string>
     <string name="quick_settings_dark_mode_secondary_label_on_at_sunset" msgid="6017379738102015710">"सूर्यास्तमा सक्रिय"</string>
     <string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"सूर्योदयसम्म"</string>
@@ -582,7 +583,7 @@
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"ध्वनिसम्बन्धी सेटिङहरू"</string>
     <string name="accessibility_volume_expand" msgid="7653070939304433603">"विस्तार गर्नुहोस्"</string>
     <string name="accessibility_volume_collapse" msgid="2746845391013829996">"संक्षिप्त पार्नुहोस्"</string>
-    <string name="volume_odi_captions_tip" msgid="8825655463280990941">"स्वचालित क्याप्सनहरूसम्बन्धी मिडिया"</string>
+    <string name="volume_odi_captions_tip" msgid="8825655463280990941">"मिडियाको स्वत: क्याप्सन बनाउनुहोस्"</string>
     <string name="accessibility_volume_close_odi_captions_tip" msgid="8924753283621160480">"उपशीर्षकहरूसम्बन्धी सुझाव"</string>
     <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"क्याप्सनको ओभरले"</string>
     <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"सक्षम पार्नुहोस्"</string>
@@ -707,9 +708,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"बबल"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"तपाईंलाई आवाज वा कम्पनविना ध्यान केन्द्रित गर्न मद्दत गर्छ।"</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"ध्वनि वा कम्पनमार्फत तपाईंको ध्यान आकर्षित गर्छ।"</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"ध्वनि वा कम्पनमार्फत तपाईंको ध्यान आकर्षित गर्छ। <xliff:g id="APP_NAME">%1$s</xliff:g> का वार्तालापहरू पूर्वनिर्धारित रूपमा बबलमा देखाइन्छन्।"</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"फ्लोटिङ सर्टकटमार्फत यो सामग्रीतर्फ तपाईंको ध्यान आकर्षित गर्दछ।"</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"वार्तालाप खण्डको सिरानमा बबलका रूपमा देखा पर्छ।"</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> मार्फत भएका सबै वार्तालापहरू पूर्वनिर्धारित रूपमा बबलमा देखिन्छन्। <xliff:g id="APP_NAME_1">%2$s</xliff:g> मा गई व्यवस्थापन गर्नुहोस्।"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"सेटिङ"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"प्राथमिकता"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"हालैका बबलहरू छैनन्"</string>
@@ -962,7 +963,7 @@
     <string name="running_foreground_services_title" msgid="5137313173431186685">"पृष्ठभूमिमा चल्ने अनुप्रयोगहरू"</string>
     <string name="running_foreground_services_msg" msgid="3009459259222695385">"ब्याट्री र डेटाका प्रयोग सम्बन्धी विवरणहरूका लागि ट्याप गर्नुहोस्"</string>
     <string name="mobile_data_disable_title" msgid="5366476131671617790">"मोबाइल डेटा निष्क्रिय पार्ने हो?"</string>
-    <string name="mobile_data_disable_message" msgid="8604966027899770415">"तपाईंको <xliff:g id="CARRIER">%s</xliff:g> मार्फत डेटा वा इन्टरनेटमाथि पहुँच हुने छैन। Wi-Fi मार्फत मात्र इन्टरनेट उपलब्ध हुने छ।"</string>
+    <string name="mobile_data_disable_message" msgid="8604966027899770415">"तपाईं <xliff:g id="CARRIER">%s</xliff:g> मार्फत डेटा वा इन्टरनेट प्रयोग गर्न सक्नुहुने छैन। Wi-Fi मार्फत मात्र इन्टरनेट उपलब्ध हुने छ।"</string>
     <string name="mobile_data_disable_message_default_carrier" msgid="6496033312431658238">"तपाईंको सेवा प्रदायक"</string>
     <string name="touch_filtered_warning" msgid="8119511393338714836">"कुनै अनुप्रयोगको कारणले अनुमतिसम्बन्धी अनुरोध बुझ्न गाह्रो भइरहेकोले सेटिङहरूले तपाईंको प्रतिक्रिया प्रमाणित गर्न सक्दैनन्।"</string>
     <string name="slice_permission_title" msgid="3262615140094151017">"<xliff:g id="APP_0">%1$s</xliff:g> लाई <xliff:g id="APP_2">%2$s</xliff:g> का स्लाइसहरू देखाउन अनुमति दिने हो?"</string>
@@ -999,15 +1000,27 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"जुनसुकै बेला बबलहरू नियन्त्रण गर्नुहोस्"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"यो अनुप्रयोगबाट आएका बबलहरू निष्क्रिय पार्न व्यवस्थापन गर्नुहोस् नामक बटनमा ट्याप गर्नुहोस्"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"बुझेँ"</string>
+    <!-- no translation found for bubbles_app_settings (5779443644062348657) -->
+    <skip />
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"प्रणालीको नेभिगेसन अद्यावधिक गरियो। परिवर्तन गर्न सेटिङमा जानुहोस्।"</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"प्रणालीको नेभिगेसन अद्यावधिक गर्न सेटिङमा जानुहोस्"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"स्ट्यान्डबाई"</string>
+    <!-- no translation found for priority_onboarding_show_at_top_text (1678400241025513541) -->
+    <skip />
+    <!-- no translation found for priority_onboarding_show_avatar_text (5756291381124091508) -->
+    <skip />
+    <!-- no translation found for priority_onboarding_appear_as_bubble_text (4227039772250263122) -->
+    <skip />
+    <!-- no translation found for priority_onboarding_ignores_dnd_text (2918952762719600529) -->
+    <skip />
+    <!-- no translation found for priority_onboarding_done_button_title (4569550984286506007) -->
+    <skip />
     <string name="magnification_overlay_title" msgid="6584179429612427958">"म्याग्निफिकेसन ओभरले विन्डो"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"म्याग्निफिकेसन विन्डो"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"म्याग्निफिकेसन विन्डोका नियन्त्रणहरू"</string>
-    <string name="quick_controls_title" msgid="6839108006171302273">"यन्त्रले नियन्त्रण गर्न सक्ने कुराहरू"</string>
+    <string name="quick_controls_title" msgid="6839108006171302273">"यन्त्र नियन्त्रण गर्ने विजेटहरू"</string>
     <string name="quick_controls_subtitle" msgid="1667408093326318053">"आफ्ना जोडिएका यन्त्रहरूका लागि नियन्त्रण सुविधाहरू थप्नुहोस्"</string>
-    <string name="quick_controls_setup_title" msgid="8901436655997849822">"यन्त्रले नियन्त्रण गर्न सक्ने कुराहरू सेटअप गर्नुहोस्"</string>
+    <string name="quick_controls_setup_title" msgid="8901436655997849822">"यन्त्र नियन्त्रण गर्ने विजेटहरू सेटअप गर्नुहोस्"</string>
     <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"आफ्ना नियन्त्रणहरूमाथि पहुँच राख्न पावर बटन थिचिराख्नुहोस्"</string>
     <string name="controls_providers_title" msgid="6879775889857085056">"नियन्त्रणहरू थप्न अनुप्रयोग छनौट गर्नुहोस्"</string>
     <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380">
@@ -1016,13 +1029,11 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"नियन्त्रणहरू"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"पावर मेनुबाट प्रयोग गर्न चाहेका नियन्त्रण सुविधाहरू छान्नुहोस्"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"नियन्त्रणहरूको क्रम मिलाउन तिनलाई थिचेर ड्र्याग गर्नुहोस्"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"सबै नियन्त्रणहरू हटाइए"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"सबै नियन्त्रणहरूको सूची लोड गर्न सकिएन।"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"अन्य"</string>
-    <string name="controls_dialog_title" msgid="2343565267424406202">"यन्त्रले नियन्त्रण गर्न सक्ने कुराहरूको सूचीमा थप्नुहोस्"</string>
+    <string name="controls_dialog_title" msgid="2343565267424406202">"यन्त्र नियन्त्रण गर्ने विजेटहरूको सूचीमा थप्नुहोस्"</string>
     <string name="controls_dialog_ok" msgid="7011816381344485651">"मन पर्ने कुराहरूमा थप्नुहोस्"</string>
     <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> ले यो नियन्त्रण तपाईंका मन पर्ने कुराहरूमा थप्न सुझाव सिफारिस गरेको छ।"</string>
     <string name="controls_dialog_confirmation" msgid="586517302736263447">"नियन्त्रण सुविधाहरू अद्यावधिक गरिए"</string>
diff --git a/packages/SystemUI/res/values-night/colors.xml b/packages/SystemUI/res/values-night/colors.xml
index 93aa270..2d51011 100644
--- a/packages/SystemUI/res/values-night/colors.xml
+++ b/packages/SystemUI/res/values-night/colors.xml
@@ -72,9 +72,14 @@
     <color name="global_actions_alert_text">@color/GM2_red_300</color>
 
     <!-- Global screenshot actions -->
-    <color name="global_screenshot_button_background">@color/GM2_grey_900</color>
+    <color name="global_screenshot_button_background">@color/GM2_grey_800</color>
     <color name="global_screenshot_button_ripple">#42FFFFFF</color>
-    <color name="global_screenshot_button_text">@color/GM2_blue_300</color>
+    <color name="global_screenshot_button_text">#FFFFFF</color>
+    <color name="global_screenshot_button_border">@color/GM2_grey_600</color>
+    <color name="global_screenshot_button_icon">@color/GM2_blue_300</color>
+    <color name="global_screenshot_dismiss_background">@color/GM2_grey_800</color>
+    <color name="global_screenshot_dismiss_foreground">#FFFFFF</color>
+
 
     <!-- Biometric dialog colors -->
     <color name="biometric_dialog_gray">#ff888888</color>
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index 5b02196..dd730d4 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -33,7 +33,7 @@
     <string name="invalid_charger_title" msgid="938685362320735167">"Kan niet opladen via USB"</string>
     <string name="invalid_charger_text" msgid="2339310107232691577">"Gebruik de oplader die bij je apparaat is geleverd"</string>
     <string name="battery_low_why" msgid="2056750982959359863">"Instellingen"</string>
-    <string name="battery_saver_confirmation_title" msgid="1234998463717398453">"Batterijbesparing inschakelen?"</string>
+    <string name="battery_saver_confirmation_title" msgid="1234998463717398453">"Batterijbesparing aanzetten?"</string>
     <string name="battery_saver_confirmation_title_generic" msgid="2299231884234959849">"Over Batterijbesparing"</string>
     <string name="battery_saver_confirmation_ok" msgid="5042136476802816494">"Inschakelen"</string>
     <string name="battery_saver_start_action" msgid="4553256017945469937">"Batterijbesparing inschakelen"</string>
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"Kan screenshot niet opslaan vanwege beperkte opslagruimte"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Het maken van screenshots wordt niet toegestaan door de app of je organisatie"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Screenshot sluiten"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"Screenshot openen"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"Voorbeeld van screenshot"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"Schermopname"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Doorlopende melding voor een schermopname-sessie"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"Opname starten?"</string>
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"Bubbel"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"Helpt je focussen zonder geluid of trilling."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"Trekt je aandacht met geluid of trillingen."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"Trekt je aandacht met geluid of trillingen. Gesprekken uit <xliff:g id="APP_NAME">%1$s</xliff:g> worden standaard als bubbels weergegeven."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Trekt de aandacht met een zwevende snelkoppeling naar deze content."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Wordt bovenaan het gedeelte met gesprekken weergegeven en als een bubbel."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"Alle gesprekken uit <xliff:g id="APP_NAME_0">%1$s</xliff:g> worden standaard als bubbels weergegeven. Beheer dit in <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Instellingen"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioriteit"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Geen recente bubbels"</string>
@@ -961,8 +961,8 @@
     <string name="qs_dnd_replace" msgid="7712119051407052689">"Vervangen"</string>
     <string name="running_foreground_services_title" msgid="5137313173431186685">"Apps uitgevoerd op achtergrond"</string>
     <string name="running_foreground_services_msg" msgid="3009459259222695385">"Tik voor batterij- en datagebruik"</string>
-    <string name="mobile_data_disable_title" msgid="5366476131671617790">"Mobiele data uitschakelen?"</string>
-    <string name="mobile_data_disable_message" msgid="8604966027899770415">"Je hebt geen toegang tot data of internet via <xliff:g id="CARRIER">%s</xliff:g>. Internet is alleen beschikbaar via wifi."</string>
+    <string name="mobile_data_disable_title" msgid="5366476131671617790">"Mobiele data uitzetten?"</string>
+    <string name="mobile_data_disable_message" msgid="8604966027899770415">"Je hebt dan geen toegang meer tot data of internet via <xliff:g id="CARRIER">%s</xliff:g>. Internet is alleen nog beschikbaar via wifi."</string>
     <string name="mobile_data_disable_message_default_carrier" msgid="6496033312431658238">"je provider"</string>
     <string name="touch_filtered_warning" msgid="8119511393338714836">"Aangezien een app een toestemmingsverzoek afdekt, kan Instellingen je reactie niet verifiëren."</string>
     <string name="slice_permission_title" msgid="3262615140094151017">"<xliff:g id="APP_0">%1$s</xliff:g> toestaan om segmenten van <xliff:g id="APP_2">%2$s</xliff:g> weer te geven?"</string>
@@ -999,15 +999,21 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Beheer bubbels wanneer je wilt"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Tik op Beheren om bubbels van deze app uit te schakelen"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"OK"</string>
+    <string name="bubbles_app_settings" msgid="5779443644062348657">"Instellingen voor <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Systeemnavigatie geüpdatet. Als je wijzigingen wilt aanbrengen, ga je naar Instellingen."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Ga naar Instellingen om de systeemnavigatie te updaten"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Stand-by"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Worden bovenaan het gespreksgedeelte weergegeven"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Tonen profielafbeelding op vergrendelingsscherm"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Worden als zwevende ballon weergegeven vóór apps"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Onderbreken \'Niet storen\'"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"OK"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"Overlay voor vergrotingsvenster"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"Vergrotingsvenster"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"Bediening van vergrotingsvenster"</string>
-    <string name="quick_controls_title" msgid="6839108006171302273">"Apparaatopties"</string>
+    <string name="quick_controls_title" msgid="6839108006171302273">"Apparaatbediening"</string>
     <string name="quick_controls_subtitle" msgid="1667408093326318053">"Bedieningselementen voor je gekoppelde apparaten toevoegen"</string>
-    <string name="quick_controls_setup_title" msgid="8901436655997849822">"Apparaatopties instellen"</string>
+    <string name="quick_controls_setup_title" msgid="8901436655997849822">"Apparaatbediening instellen"</string>
     <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"Houd de aan/uit-knop ingedrukt voor toegang tot de bedieningselementen"</string>
     <string name="controls_providers_title" msgid="6879775889857085056">"Kies de app waaraan je bedieningselementen wilt toevoegen"</string>
     <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380">
@@ -1015,14 +1021,12 @@
       <item quantity="one"><xliff:g id="NUMBER_0">%s</xliff:g> bedieningselement toegevoegd.</item>
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"Bedieningselementen"</string>
-    <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Kies bedieningselementen die je vanaf het menu Voeding wilt kunnen gebruiken"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Kies bedieningselementen die je vanaf het aan/uit-menu wilt kunnen gebruiken"</string>
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Houd vast en sleep om de bedieningselementen opnieuw in te delen"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"Alle bedieningselementen verwijderd"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"Kan lijst met alle bedieningselementen niet laden."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Overig"</string>
-    <string name="controls_dialog_title" msgid="2343565267424406202">"Toevoegen aan apparaatopties"</string>
+    <string name="controls_dialog_title" msgid="2343565267424406202">"Toevoegen aan apparaatbediening"</string>
     <string name="controls_dialog_ok" msgid="7011816381344485651">"Toevoegen aan favorieten"</string>
     <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> heeft voorgesteld dit bedieningselement toe te voegen aan je favorieten."</string>
     <string name="controls_dialog_confirmation" msgid="586517302736263447">"Bedieningselementen geüpdated"</string>
diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml
index cf15c83..cde084f 100644
--- a/packages/SystemUI/res/values-or/strings.xml
+++ b/packages/SystemUI/res/values-or/strings.xml
@@ -33,13 +33,13 @@
     <string name="invalid_charger_title" msgid="938685362320735167">"USB ଦ୍ଵାରା ଚାର୍ଜ କରିହେବନାହିଁ"</string>
     <string name="invalid_charger_text" msgid="2339310107232691577">"ଆପଣଙ୍କ ଡିଭାଇସ୍ ପାଇଁ ଥିବା ଚାର୍ଜର୍‌କୁ ବ୍ୟବହାର କରନ୍ତୁ"</string>
     <string name="battery_low_why" msgid="2056750982959359863">"ସେଟିଙ୍ଗ"</string>
-    <string name="battery_saver_confirmation_title" msgid="1234998463717398453">"ବ୍ୟାଟେରୀ ସେଭର୍‌ ଅନ୍ କରିବେ?"</string>
+    <string name="battery_saver_confirmation_title" msgid="1234998463717398453">"ବ୍ୟାଟେରୀ ସେଭର୍‌ ଚାଲୁ କରିବେ?"</string>
     <string name="battery_saver_confirmation_title_generic" msgid="2299231884234959849">"ବ୍ୟାଟେରୀ ସେଭର୍ ବିଷୟରେ"</string>
     <string name="battery_saver_confirmation_ok" msgid="5042136476802816494">"ଅନ୍‌ କରନ୍ତୁ"</string>
     <string name="battery_saver_start_action" msgid="4553256017945469937">"ବ୍ୟାଟେରୀ ସେଭର୍‌ ଅନ୍ କରନ୍ତୁ"</string>
     <string name="status_bar_settings_settings_button" msgid="534331565185171556">"ସେଟିଙ୍ଗ"</string>
     <string name="status_bar_settings_wifi_button" msgid="7243072479837270946">"ୱାଇ-ଫାଇ"</string>
-    <string name="status_bar_settings_auto_rotation" msgid="8329080442278431708">"ଅଟୋ-ରୋଟେଟ୍‌ ସ୍କ୍ରୀନ୍‍"</string>
+    <string name="status_bar_settings_auto_rotation" msgid="8329080442278431708">"ଅଟୋ-ରୋଟେଟ୍‌ ସ୍କ୍ରିନ୍"</string>
     <string name="status_bar_settings_mute_label" msgid="914392730086057522">"ମ୍ୟୁଟ୍"</string>
     <string name="status_bar_settings_auto_brightness_label" msgid="2151934479226017725">"ସ୍ୱତଃ"</string>
     <string name="status_bar_settings_notifications" msgid="5285316949980621438">"ବିଜ୍ଞପ୍ତି"</string>
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"ସୀମିତ ଷ୍ଟୋରେଜ୍‍ ସ୍ପେସ୍‍ ହେତୁ ସ୍କ୍ରୀନଶଟ୍‍ ସେଭ୍‍ ହୋଇପାରିବ ନାହିଁ"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"ଆପ୍‍ କିମ୍ବା ସଂସ୍ଥା ଦ୍ୱାରା ସ୍କ୍ରୀନଶଟ୍‍ ନେବାକୁ ଅନୁମତି ଦିଆଯାଇ ନାହିଁ"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"ସ୍କ୍ରିନସଟ୍ ଖାରଜ କରନ୍ତୁ"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"ସ୍କ୍ରିନସଟ୍ ଖୋଲନ୍ତୁ"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"ସ୍କ୍ରିନସଟର ପ୍ରିଭ୍ୟୁ"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"ସ୍କ୍ରିନ୍ ରେକର୍ଡର୍"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"ଏକ ସ୍କ୍ରି‍ନ୍‍ ରେକର୍ଡ୍‍ ସେସନ୍‍ ପାଇଁ ଚାଲୁଥିବା ବିଜ୍ଞପ୍ତି"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"ରେକର୍ଡିଂ ଆରମ୍ଭ କରିବେ?"</string>
@@ -337,7 +337,7 @@
     <string name="accessibility_rotation_lock_on_landscape_changed" msgid="5785739044300729592">"ବର୍ତ୍ତମାନ ସ୍କ୍ରୀନ୍‌ଟି ଲ୍ୟାଣ୍ଡସ୍କେପ୍ ଦିଗରେ ଲକ୍ ଅଛି।"</string>
     <string name="accessibility_rotation_lock_on_portrait_changed" msgid="5580170829728987989">"ବର୍ତ୍ତମାନ ସ୍କ୍ରୀନ୍‌ଟି ପୋର୍ଟେଟ୍ ଦିଗରେ ଲକ୍‌ ଅଛି।"</string>
     <string name="dessert_case" msgid="9104973640704357717">"ଡେଜର୍ଟ କେସ୍‌"</string>
-    <string name="start_dreams" msgid="9131802557946276718">"ସ୍କ୍ରୀନ୍‌ ସେଭର୍‌"</string>
+    <string name="start_dreams" msgid="9131802557946276718">"ସ୍କ୍ରିନ୍‌ ସେଭର୍‌"</string>
     <string name="ethernet_label" msgid="2203544727007463351">"ଇଥରନେଟ୍‌"</string>
     <string name="quick_settings_header_onboarding_text" msgid="1918085351115504765">"ଅଧିକ ବିକଳ୍ପ ପାଇଁ ଆଇକନ୍‌କୁ ସ୍ପର୍ଶ କରି ଧରିରଖନ୍ତୁ"</string>
     <string name="quick_settings_dnd_label" msgid="7728690179108024338">"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ"</string>
@@ -356,7 +356,7 @@
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="3882884317600669650">"ଅନ୍ ହେଉଛି…"</string>
     <string name="quick_settings_brightness_label" msgid="680259653088849563">"ଉଜ୍ଜ୍ୱଳତା"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="2359922767950346112">"ସ୍ୱତଃ-ଘୂର୍ଣ୍ଣନ"</string>
-    <string name="accessibility_quick_settings_rotation" msgid="4800050198392260738">"ସ୍କ୍ରୀନ୍‍କୁ ଅଟୋ-ରୋଟେଟ୍‌ କରନ୍ତୁ"</string>
+    <string name="accessibility_quick_settings_rotation" msgid="4800050198392260738">"ଅଟୋ-ରୋଟେଟ୍ ସ୍କ୍ରିନ୍"</string>
     <string name="accessibility_quick_settings_rotation_value" msgid="2916484894750819251">"<xliff:g id="ID_1">%s</xliff:g> ମୋଡ୍‍"</string>
     <string name="quick_settings_rotation_locked_label" msgid="4420863550666310319">"ଘୂର୍ଣ୍ଣନ ଲକ୍‍ ହୋଇଛି"</string>
     <string name="quick_settings_rotation_locked_portrait_label" msgid="1194988975270484482">"ପୋର୍ଟ୍ରେଟ୍"</string>
@@ -500,7 +500,7 @@
     <string name="battery_saver_notification_text" msgid="2617841636449016951">"କାର୍ଯ୍ୟ ସମ୍ପାଦନ ଓ ବ୍ୟାକ୍‌ଗ୍ରାଉଣ୍ଡ ଡାଟା କମ୍ କରନ୍ତୁ"</string>
     <string name="battery_saver_notification_action_text" msgid="6022091913807026887">"ବ୍ୟାଟେରୀ ସେଭର୍‌ ଅଫ୍‍ କରନ୍ତୁ"</string>
     <string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>ରେ ସମସ୍ତ ସୂଚନାକୁ ଆକ୍ସେସ୍ ରହିବ ଯାହା ଆପଣଙ୍କର ସ୍କ୍ରିନ୍‌ରେ ଦେଖାଯିବ ବା ରେକର୍ଡିଂ ବା କାଷ୍ଟିଂ ବେଳେ ଆପଣଙ୍କର ଡିଭାଇସ୍ ଠାରୁ ଚାଲିବ। ପାସ୍‌ୱାର୍ଡ, ପେମେଣ୍ଟ ବିବରଣୀ, ଫଟୋ, ମେସେଜ୍ ଏବଂ ଆପଣ ଚଲାଉଥିବା ଅଡିଓ ପରି ସୂଚନା ଅନ୍ତର୍ଭୁକ୍ତ ଅଛି।"</string>
-    <string name="media_projection_dialog_service_text" msgid="958000992162214611">"ଏହି ପ୍ରକାର୍ଯ୍ୟ ପ୍ରଦାନ କରୁଥିବା ସେବା ସମସ୍ତ ସୂଚନାକୁ ଆକ୍ସେସ୍ ରହିବ ଯାହା ସ୍କ୍ରିନ୍‌ରେ ଦେଖାଯିବ ବା ରେକର୍ଡିଂ ବା କାଷ୍ଟିଂ ବେଳେ ଆପଣଙ୍କର ଡିଭାଇସ୍ ଠାରୁ ଚାଲିବ। ପାସ୍‌ୱାର୍ଡ, ପେମେଣ୍ଟ ବିବରଣୀ, ଫଟୋ, ମେସେଜ୍ ଏବଂ ଆପଣ ଚଲାଉଥିବା ଅଡିଓ ପରି ସୂଚନା ଅନ୍ତର୍ଭୁକ୍ତ ଅଛି।"</string>
+    <string name="media_projection_dialog_service_text" msgid="958000992162214611">"ରେକର୍ଡିଂ ବା କାଷ୍ଟିଂ ବେଳେ ଆପଣଙ୍କର ଡିଭାଇସରେ ଦେଖାଯାଉଥିବା ବା ଆପଣଙ୍କ ଡିଭାଇସରୁ ପ୍ଲେ କରାଯାଉଥିବା ସବୁ ସୂଚନାକୁ ଏହି ପ୍ରକାର୍ଯ୍ୟ ପ୍ରଦାନ କରୁଥିବା ସେବାର ଆକସେସ୍ ରହିବ। ପାସ୍‌ୱାର୍ଡ, ପେମେଣ୍ଟ ବିବରଣୀ, ଫଟୋ, ମେସେଜ୍ ଏବଂ ଆପଣ ଚଲାଉଥିବା ଅଡିଓ ପରି ସୂଚନା ଏଥିରେ ଅନ୍ତର୍ଭୁକ୍ତ ଅଛି।"</string>
     <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"ରେକର୍ଡିଂ ବା କାଷ୍ଟିଂ ଆରମ୍ଭ କରିବେ?"</string>
     <string name="media_projection_dialog_title" msgid="3316063622495360646">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ସହ ରେକର୍ଡିଂ ବା କାଷ୍ଟିଂ ଆରମ୍ଭ କରିବେ?"</string>
     <string name="media_projection_remember_text" msgid="6896767327140422951">"ପୁଣି ଦେଖାନ୍ତୁ ନାହିଁ"</string>
@@ -624,7 +624,7 @@
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s। ମ୍ୟୁଟ୍‍ କରିବାକୁ ଟାପ୍‍ କରନ୍ତୁ। ଆକ୍ସେସିବିଲିଟୀ ସର୍ଭିସ୍‌ ମ୍ୟୁଟ୍‍ କରାଯାଇପାରେ।"</string>
     <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s। ଭାଇବ୍ରେଟରେ ସେଟ୍‍ କରିବାକୁ ଟାପ୍‍ କରନ୍ତୁ।"</string>
     <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s। ମ୍ୟୁଟ୍‍ କରିବାକୁ ଟାପ୍‍ କରନ୍ତୁ।"</string>
-    <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"ମ୍ୟୁଟ୍ କରନ୍ତୁ"</string>
+    <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"ମ୍ୟୁଟ୍"</string>
     <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"ଅନ୍‍-ମ୍ୟୁଟ୍ କରନ୍ତୁ"</string>
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"ଭାଇବ୍ରେଟ୍"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"%s ଭଲ୍ୟୁମ୍ ନିୟନ୍ତ୍ରଣ"</string>
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"ବବଲ୍"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"ବିନା ସାଉଣ୍ଡ କିମ୍ବା ଭାଇବ୍ରେସନ୍‌ରେ ଆପଣଙ୍କୁ ଫୋକସ୍ କରିବାରେ ସାହାଯ୍ୟ କରେ।"</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"ସାଉଣ୍ଡ କିମ୍ବା ଭାଇବ୍ରେସନ୍ ମାଧ୍ୟମରେ ଆପଣଙ୍କର ଧ୍ୟାନ ଆକର୍ଷିତ କରିଥାଏ।"</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"ସାଉଣ୍ଡ କିମ୍ବା ଭାଇବ୍ରେସନ୍ ମାଧ୍ୟମରେ ଆପଣଙ୍କ ଧ୍ୟାନ ଆକର୍ଷିତ କରିଥାଏ। <xliff:g id="APP_NAME">%1$s</xliff:g>ରୁ ବାର୍ତ୍ତାଳାପଗୁଡ଼ିକ ଡିଫଲ୍ଟ ଭାବରେ ବବଲ୍ ହୁଏ।"</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"ଏହି ବିଷୟବସ୍ତୁ ପାଇଁ ଏକ ଭାସମାନ ସର୍ଟକଟ୍ ସହ ଆପଣଙ୍କର ଧ୍ୟାନ ଦିଅନ୍ତୁ।"</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"ଏହା ବାର୍ତ୍ତାଳାପ ବିଭାଗର ଶୀର୍ଷରେ ବବଲ୍ ଭାବେ ଦେଖାଯାଏ।"</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"<xliff:g id="APP_NAME_0">%1$s</xliff:g>ରୁ ସମସ୍ତ ବାର୍ତ୍ତାଳାପ ଡିଫଲ୍ଟ ରୂପେ ବବଲରେ ଦେଖାଯାଏ। <xliff:g id="APP_NAME_1">%2$s</xliff:g>ରେ ପରିଚାଳନା କରନ୍ତୁ।"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ସେଟିଂସ୍"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"ପ୍ରାଥମିକତା"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"ବର୍ତ୍ତମାନ କୌଣସି ବବଲ୍ ନାହିଁ"</string>
@@ -927,7 +927,7 @@
     <string name="lockscreen_unlock_right" msgid="4658008735541075346">"ଡାହାଣ ଶର୍ଟକଟ୍‍ ମଧ୍ୟ ଅନଲକ୍‍ କରେ"</string>
     <string name="lockscreen_none" msgid="4710862479308909198">"କିଛିନୁହେଁ"</string>
     <string name="tuner_launch_app" msgid="3906265365971743305">"<xliff:g id="APP">%1$s</xliff:g> ଲଞ୍ଚ କରନ୍ତୁ"</string>
-    <string name="tuner_other_apps" msgid="7767462881742291204">"ଅନ୍ୟାନ୍ୟ ଆପ୍‍"</string>
+    <string name="tuner_other_apps" msgid="7767462881742291204">"ଅନ୍ୟ ଆପ୍ସ‍"</string>
     <string name="tuner_circle" msgid="5270591778160525693">"ବୃତ୍ତ"</string>
     <string name="tuner_plus" msgid="4130366441154416484">"ଯୁକ୍ତ"</string>
     <string name="tuner_minus" msgid="5258518368944598545">"ବିଯୁକ୍ତ"</string>
@@ -962,7 +962,7 @@
     <string name="running_foreground_services_title" msgid="5137313173431186685">"ବ୍ୟାକଗ୍ରାଉଣ୍ଡରେ ଆପ୍‍ ଚାଲୁଛି"</string>
     <string name="running_foreground_services_msg" msgid="3009459259222695385">"ବ୍ୟାଟେରୀ ଏବଂ ଡାଟା ବ୍ୟବହାର ଉପରେ ବିବରଣୀ ପାଇଁ ଟାପ୍‍ କରନ୍ତୁ"</string>
     <string name="mobile_data_disable_title" msgid="5366476131671617790">"ମୋବାଇଲ୍‌ ଡାଟା ବନ୍ଦ କରିବେ?"</string>
-    <string name="mobile_data_disable_message" msgid="8604966027899770415">"<xliff:g id="CARRIER">%s</xliff:g> ଦ୍ଵାରା ଆପଣଙ୍କର ଡାଟା କିମ୍ବା ଇଣ୍ଟରନେଟ୍‌କୁ ଆକ୍ସେସ୍ ନାହିଁ। ଇଣ୍ଟରନେଟ୍‌ କେବଳ ୱାଇ-ଫାଇ ମାଧ୍ୟମରେ ଉପଲବ୍ଧ ହେବ।"</string>
+    <string name="mobile_data_disable_message" msgid="8604966027899770415">"ଡାଟା କିମ୍ବା ଇଣ୍ଟରନେଟ୍‌କୁ <xliff:g id="CARRIER">%s</xliff:g> ଦ୍ଵାରା ଆପଣଙ୍କର  ଆକ୍ସେସ୍ ରହିବ ନାହିଁ। ଇଣ୍ଟରନେଟ୍‌ କେବଳ ୱାଇ-ଫାଇ ମାଧ୍ୟମରେ ଉପଲବ୍ଧ ହେବ।"</string>
     <string name="mobile_data_disable_message_default_carrier" msgid="6496033312431658238">"ଆପଣଙ୍କ କେରିଅର୍"</string>
     <string name="touch_filtered_warning" msgid="8119511393338714836">"ଗୋଟିଏ ଆପ୍‍ ଏକ ଅନୁମତି ଅନୁରୋଧକୁ ଦେଖିବାରେ ବାଧା ଦେଉଥିବାରୁ, ସେଟିଙ୍ଗ ଆପଣଙ୍କ ଉତ୍ତରକୁ ଯାଞ୍ଚ କରିପାରିବ ନାହିଁ।"</string>
     <string name="slice_permission_title" msgid="3262615140094151017">"<xliff:g id="APP_2">%2$s</xliff:g> ସ୍ଲାଇସ୍‌କୁ ଦେଖାଇବା ପାଇଁ <xliff:g id="APP_0">%1$s</xliff:g>କୁ ଅନୁମତି ଦେବେ?"</string>
@@ -999,9 +999,21 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"ଯେ କୌଣସି ସମୟରେ ବବଲଗୁଡ଼ିକ ନିୟନ୍ତ୍ରଣ କରନ୍ତୁ"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"ଏହି ଆପର ବବଲଗୁଡ଼ିକ ବନ୍ଦ କରିବା ପାଇଁ \'ପରିଚାଳନା କରନ୍ତୁ\' ବଟନରେ ଟାପ୍ କରନ୍ତୁ"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"ବୁଝିଗଲି"</string>
+    <!-- no translation found for bubbles_app_settings (5779443644062348657) -->
+    <skip />
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"ସିଷ୍ଟମ୍ ନାଭିଗେସନ୍ ଅପ୍‌ଡେଟ୍ ହୋଇଛି। ପରିବର୍ତ୍ତନ କରିବା ପାଇଁ, ସେଟିଂସ୍‌କୁ ଯାଆନ୍ତୁ।"</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"ସିଷ୍ଟମ୍ ନାଭିଗେସନ୍ ଅପ୍‌ଡେଟ୍ କରିବା ପାଇଁ ସେଟିଂସ୍‍କୁ ଯାଆନ୍ତୁ"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"ଷ୍ଟାଣ୍ଡବାଏ"</string>
+    <!-- no translation found for priority_onboarding_show_at_top_text (1678400241025513541) -->
+    <skip />
+    <!-- no translation found for priority_onboarding_show_avatar_text (5756291381124091508) -->
+    <skip />
+    <!-- no translation found for priority_onboarding_appear_as_bubble_text (4227039772250263122) -->
+    <skip />
+    <!-- no translation found for priority_onboarding_ignores_dnd_text (2918952762719600529) -->
+    <skip />
+    <!-- no translation found for priority_onboarding_done_button_title (4569550984286506007) -->
+    <skip />
     <string name="magnification_overlay_title" msgid="6584179429612427958">"ମ୍ୟାଗ୍ନିଫିକେସନ୍ ଓଭର୍‌ଲେ ୱିଣ୍ଡୋ"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"ମ୍ୟାଗ୍ନିଫିକେସନ୍ ୱିଣ୍ଡୋ"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"ମ୍ୟାଗ୍ନିଫିକେସନ୍ ୱିଣ୍ଡୋ ନିୟନ୍ତ୍ରଣଗୁଡ଼ିକ"</string>
@@ -1016,10 +1028,8 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"ନିୟନ୍ତ୍ରଣଗୁଡ଼ିକ"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"ପାୱାର ମେନୁରୁ ଆକ୍ସେସ୍ କରିବାକୁ ନିୟନ୍ତ୍ରଣଗୁଡ଼ିକୁ ବାଛନ୍ତୁ"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"ନିୟନ୍ତ୍ରଣଗୁଡ଼ିକ ପୁଣି ସଜାଇବାକୁ ସେଗୁଡ଼ିକୁ ଧରି ଟାଣନ୍ତୁ"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"ସମସ୍ତ ନିୟନ୍ତ୍ରଣ କାଢ଼ି ଦିଆଯାଇଛି"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"ସବୁ ନିୟନ୍ତ୍ରଣର ତାଲିକା ଲୋଡ୍ କରିପାରିଲା ନାହିଁ।"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"ଅନ୍ୟ"</string>
     <string name="controls_dialog_title" msgid="2343565267424406202">"ଡିଭାଇସ୍ ନିୟନ୍ତ୍ରଣଗୁଡ଼ିକରେ ଯୋଗ କରନ୍ତୁ"</string>
diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml
index 1b78d13..4e6247a 100644
--- a/packages/SystemUI/res/values-pa/strings.xml
+++ b/packages/SystemUI/res/values-pa/strings.xml
@@ -39,7 +39,7 @@
     <string name="battery_saver_start_action" msgid="4553256017945469937">"ਬੈਟਰੀ ਸੇਵਰ ਚਾਲੂ ਕਰੋ"</string>
     <string name="status_bar_settings_settings_button" msgid="534331565185171556">"ਸੈਟਿੰਗਾਂ"</string>
     <string name="status_bar_settings_wifi_button" msgid="7243072479837270946">"ਵਾਈ-ਫਾਈ"</string>
-    <string name="status_bar_settings_auto_rotation" msgid="8329080442278431708">"ਸਕ੍ਰੀਨ ਆਪਣੇ-ਆਪ ਘੁੰਮਾਓ"</string>
+    <string name="status_bar_settings_auto_rotation" msgid="8329080442278431708">"ਸਕ੍ਰੀਨ ਸਵੈ-ਘੁਮਾਓ"</string>
     <string name="status_bar_settings_mute_label" msgid="914392730086057522">"ਮਿਊਟ ਕਰੋ"</string>
     <string name="status_bar_settings_auto_brightness_label" msgid="2151934479226017725">"ਆਟੋ"</string>
     <string name="status_bar_settings_notifications" msgid="5285316949980621438">"ਸੂਚਨਾਵਾਂ"</string>
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"ਸੀਮਿਤ ਸਟੋਰੇਜ ਹੋਣ ਕਾਰਨ ਸਕ੍ਰੀਨਸ਼ਾਟ ਰੱਖਿਅਤ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"ਐਪ ਜਾਂ ਤੁਹਾਡੀ ਸੰਸਥਾ ਵੱਲੋਂ ਸਕ੍ਰੀਨਸ਼ਾਟ ਲੈਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਦਿੱਤੀ ਗਈ ਹੈ"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"ਸਕ੍ਰੀਨਸ਼ਾਟ ਖਾਰਜ ਕਰੋ"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"ਸਕ੍ਰੀਨਸ਼ਾਟ ਖੋਲ੍ਹੋ"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"ਸਕ੍ਰੀਨਸ਼ਾਟ ਪੂਰਵ-ਝਲਕ"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"ਸਕ੍ਰੀਨ ਰਿਕਾਰਡਰ"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"ਕਿਸੇ ਸਕ੍ਰੀਨ ਰਿਕਾਰਡ ਸੈਸ਼ਨ ਲਈ ਚੱਲ ਰਹੀ ਸੂਚਨਾ"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"ਕੀ ਰਿਕਾਰਡਿੰਗ ਸ਼ੁਰੂ ਕਰਨੀ ਹੈ?"</string>
@@ -387,7 +387,7 @@
     <string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"ਵਾਈ-ਫਾਈ ਕਨੈਕਟ ਨਹੀਂ ਕੀਤਾ ਗਿਆ"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"ਚਮਕ"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="2325362583903258677">"ਆਟੋ"</string>
-    <string name="quick_settings_inversion_label" msgid="5078769633069667698">"ਰੰਗ ਉਲਟੋ"</string>
+    <string name="quick_settings_inversion_label" msgid="5078769633069667698">"ਰੰਗ ਪਲਟਾਓ"</string>
     <string name="quick_settings_color_space_label" msgid="537528291083575559">"ਰੰਗ ਸੰਸ਼ੋਧਨ ਮੋਡ"</string>
     <string name="quick_settings_more_settings" msgid="2878235926753776694">"ਹੋਰ ਸੈਟਿੰਗਾਂ"</string>
     <string name="quick_settings_done" msgid="2163641301648855793">"ਹੋ ਗਿਆ"</string>
@@ -648,7 +648,7 @@
     <string name="status_bar_ethernet" msgid="5690979758988647484">"ਈਥਰਨੈਟ"</string>
     <string name="status_bar_alarm" msgid="87160847643623352">"ਅਲਾਰਮ"</string>
     <string name="status_bar_work" msgid="5238641949837091056">"ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ"</string>
-    <string name="status_bar_airplane" msgid="4848702508684541009">"ਜਹਾਜ਼ ਮੋਡ"</string>
+    <string name="status_bar_airplane" msgid="4848702508684541009">"ਹਵਾਈ-ਜਹਾਜ਼ ਮੋਡ"</string>
     <string name="add_tile" msgid="6239678623873086686">"ਟਾਇਲ ਸ਼ਾਮਲ ਕਰੋ"</string>
     <string name="broadcast_tile" msgid="5224010633596487481">"ਪ੍ਰਸਾਰਨ ਟਾਇਲ"</string>
     <string name="zen_alarm_warning_indef" msgid="5252866591716504287">"ਤੁਸੀਂ <xliff:g id="WHEN">%1$s</xliff:g> ਵਜੇ ਆਪਣਾ ਅਗਲਾ ਅਲਾਰਮ ਨਹੀਂ ਸੁਣੋਗੇ ਜਦੋਂ ਤੱਕ ਉਸਤੋਂ ਪਹਿਲਾਂ ਤੁਸੀਂ ਇਸਨੂੰ ਬੰਦ ਨਹੀਂ ਕਰਦੇ"</string>
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"ਬੁਲਬੁਲਾ"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"ਤੁਹਾਨੂੰ ਬਿਨਾਂ ਧੁਨੀ ਅਤੇ ਥਰਥਰਾਹਟ ਦੇ ਫੋਕਸ ਕਰਨ ਵਿੱਚ ਮਦਦ ਕਰਦਾ ਹੈ।"</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"ਧੁਨੀ ਅਤੇ ਥਰਥਰਾਹਟ ਨਾਲ ਤੁਹਾਡਾ ਧਿਆਨ ਖਿੱਚਦੀ ਹੈ।"</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"ਧੁਨੀ ਅਤੇ ਥਰਥਰਾਹਟ ਨਾਲ ਤੁਹਾਡਾ ਧਿਆਨ ਖਿੱਚਦੀ ਹੈ। ਪੂਰਵ-ਨਿਰਧਾਰਤ ਤੌਰ \'ਤੇ <xliff:g id="APP_NAME">%1$s</xliff:g> ਬਬਲ ਤੋਂ ਗੱਲਾਂਬਾਤਾਂ।"</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"ਇਸ ਸਮੱਗਰੀ ਦੇ ਅਸਥਿਰ ਸ਼ਾਰਟਕੱਟ ਨਾਲ ਆਪਣਾ ਧਿਆਨ ਕੇਂਦਰਿਤ ਰੱਖੋ।"</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"ਗੱਲਬਾਤ ਸੈਕਸ਼ਨ ਦੇ ਉੱਪਰ ਅਤੇ ਬਬਲ ਦੇ ਤੌਰ \'ਤੇ ਦਿਖਾਉਂਦਾ ਹੈ।"</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> ਵੱਲੋਂ ਸਾਰੀਆਂ ਗੱਲਾਂਬਾਤਾਂ \'ਤੇ ਪੂਰਵ-ਨਿਰਧਾਰਤ ਤੌਰ \'ਤੇ ਬਬਲ ਲਾਏ ਜਾਂਦੇ ਹਨ। <xliff:g id="APP_NAME_1">%2$s</xliff:g> ਵਿੱਚ ਪ੍ਰਬੰਧਨ ਕਰੋ।"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ਸੈਟਿੰਗਾਂ"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"ਤਰਜੀਹ"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"ਕੋਈ ਹਾਲੀਆ ਬਬਲ ਨਹੀਂ"</string>
@@ -999,9 +999,21 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"ਬਬਲ ਨੂੰ ਕਿਸੇ ਵੇਲੇ ਵੀ ਕੰਟਰੋਲ ਕਰੋ"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"ਇਸ ਐਪ \'ਤੇ ਬਬਲ ਬੰਦ ਕਰਨ ਲਈ \'ਪ੍ਰਬੰਧਨ ਕਰੋ\' \'ਤੇ ਟੈਪ ਕਰੋ"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"ਸਮਝ ਲਿਆ"</string>
+    <!-- no translation found for bubbles_app_settings (5779443644062348657) -->
+    <skip />
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"ਸਿਸਟਮ ਨੈਵੀਗੇਸ਼ਨ ਅੱਪਡੇਟ ਹੋ ਗਿਆ। ਤਬਦੀਲੀਆਂ ਕਰਨ ਲਈ, ਸੈਟਿੰਗਾਂ \'ਤੇ ਜਾਓ।"</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"ਸਿਸਟਮ ਨੈਵੀਗੇਸ਼ਨ ਨੂੰ ਅੱਪਡੇਟ ਕਰਨ ਲਈ ਸੈਟਿੰਗਾਂ \'ਤੇ ਜਾਓ"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"ਸਟੈਂਡਬਾਈ"</string>
+    <!-- no translation found for priority_onboarding_show_at_top_text (1678400241025513541) -->
+    <skip />
+    <!-- no translation found for priority_onboarding_show_avatar_text (5756291381124091508) -->
+    <skip />
+    <!-- no translation found for priority_onboarding_appear_as_bubble_text (4227039772250263122) -->
+    <skip />
+    <!-- no translation found for priority_onboarding_ignores_dnd_text (2918952762719600529) -->
+    <skip />
+    <!-- no translation found for priority_onboarding_done_button_title (4569550984286506007) -->
+    <skip />
     <string name="magnification_overlay_title" msgid="6584179429612427958">"ਵੱਡਦਰਸ਼ੀਕਰਨ ਓਵਰਲੇ Window"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"ਵੱਡਦਰਸ਼ੀਕਰਨ Window"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"ਵੱਡਦਰਸ਼ੀਕਰਨ Window ਦੇ ਕੰਟਰੋਲ"</string>
@@ -1016,10 +1028,8 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"ਕੰਟਰੋਲ"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"ਪਹੁੰਚ ਕਰਨ ਲਈ ਪਾਵਰ ਮੀਨੂ ਤੋਂ ਕੰਟਰੋਲ ਚੁਣੋ"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"ਕੰਟਰੋਲਾਂ ਨੂੰ ਮੁੜ-ਵਿਵਸਥਿਤ ਕਰਨ ਲਈ ਫੜ੍ਹ ਕੇ ਘਸੀਟੋ"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"ਸਾਰੇ ਕੰਟਰੋਲ ਹਟਾਏ ਗਏ"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"ਸਾਰੇ ਕੰਟਰੋਲਾਂ ਦੀ ਸੂਚੀ ਨੂੰ ਲੋਡ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ।"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"ਹੋਰ"</string>
     <string name="controls_dialog_title" msgid="2343565267424406202">"ਡੀਵਾਈਸ ਕੰਟਰੋਲਾਂ ਵਿੱਚ ਸ਼ਾਮਲ ਕਰੋ"</string>
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index 3d243b2..e577fd2 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"Nie można zapisać zrzutu ekranu, bo brakuje miejsca w pamięci"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Nie możesz wykonać zrzutu ekranu, bo nie zezwala na to aplikacja lub Twoja organizacja."</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Zamknij zrzut ekranu"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"Otwórz zrzut ekranu"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"Podgląd zrzutu ekranu"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"Nagrywanie ekranu"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Stałe powiadomienie o sesji rejestrowania zawartości ekranu"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"Rozpocząć rejestrowanie?"</string>
@@ -713,9 +713,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"Dymek"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"Pomaga Ci się skupić, nie sygnalizując niczego dźwiękiem ani wibracjami."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"Przyciąga uwagę dźwiękiem lub wibracjami."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"Przyciąga uwagę dźwiękiem lub wibracjami. Rozmowy z aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g> są domyślnie wyświetlane jako dymki."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Przyciąga uwagę dzięki pływającym skrótom do treści."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Wyświetla się u góry sekcji rozmów i ma postać dymku."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"Wszystkie rozmowy z aplikacji <xliff:g id="APP_NAME_0">%1$s</xliff:g> są domyślnie wyświetlane jako dymki. Zarządzaj w aplikacji <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Ustawienia"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Priorytet"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Brak ostatnich dymków"</string>
@@ -972,7 +972,7 @@
     <string name="running_foreground_services_title" msgid="5137313173431186685">"Aplikacje działające w tle"</string>
     <string name="running_foreground_services_msg" msgid="3009459259222695385">"Kliknij, by wyświetlić szczegóły wykorzystania baterii i użycia danych"</string>
     <string name="mobile_data_disable_title" msgid="5366476131671617790">"Wyłączyć mobilną transmisję danych?"</string>
-    <string name="mobile_data_disable_message" msgid="8604966027899770415">"Nie będziesz mieć dostępu do transmisji danych ani internetu przez operatora <xliff:g id="CARRIER">%s</xliff:g>. Internet będzie dostępny tylko przez Wi-Fi."</string>
+    <string name="mobile_data_disable_message" msgid="8604966027899770415">"Nie będziesz mieć dostępu do transmisji danych ani internetu w <xliff:g id="CARRIER">%s</xliff:g>. Internet będzie dostępny tylko przez Wi‑Fi."</string>
     <string name="mobile_data_disable_message_default_carrier" msgid="6496033312431658238">"Twój operator"</string>
     <string name="touch_filtered_warning" msgid="8119511393338714836">"Aplikacja Ustawienia nie może zweryfikować Twojej odpowiedzi, ponieważ inna aplikacja zasłania prośbę o udzielenie uprawnień."</string>
     <string name="slice_permission_title" msgid="3262615140094151017">"Zezwolić aplikacji <xliff:g id="APP_0">%1$s</xliff:g> na pokazywanie wycinków z aplikacji <xliff:g id="APP_2">%2$s</xliff:g>?"</string>
@@ -1009,15 +1009,22 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Zarządzaj dymkami w dowolnym momencie"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Kliknij Zarządzaj, aby wyłączyć dymki z tej aplikacji"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"OK"</string>
+    <!-- no translation found for bubbles_app_settings (5779443644062348657) -->
+    <skip />
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Nawigacja w systemie została zaktualizowana. Aby wprowadzić zmiany, otwórz Ustawienia."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Otwórz Ustawienia, by zaktualizować nawigację w systemie"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Tryb gotowości"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Wyświetlają się u góry sekcji rozmów"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Pokazują zdjęcie profilowe na ekranie blokady"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Wyświetlane jako pływający dymek nad aplikacjami"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Ignorują tryb Nie przeszkadzać"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"OK"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"Okno nakładki powiększenia"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"Okno powiększenia"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"Elementy sterujące okna powiększenia"</string>
-    <string name="quick_controls_title" msgid="6839108006171302273">"Sterowanie urządzeniem"</string>
+    <string name="quick_controls_title" msgid="6839108006171302273">"Sterowanie urządzeniami"</string>
     <string name="quick_controls_subtitle" msgid="1667408093326318053">"Dodaj elementy sterujące do połączonych urządzeń"</string>
-    <string name="quick_controls_setup_title" msgid="8901436655997849822">"Konfigurowanie sterowania urządzeniem"</string>
+    <string name="quick_controls_setup_title" msgid="8901436655997849822">"Konfigurowanie sterowania urządzeniami"</string>
     <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"Przytrzymaj przycisk zasilania, aby uzyskać dostęp do elementów sterujących"</string>
     <string name="controls_providers_title" msgid="6879775889857085056">"Wybierz aplikację, do której chcesz dodać elementy sterujące"</string>
     <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380">
@@ -1028,13 +1035,11 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"Elementy sterujące"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Wybierz elementy sterujące dostępne w menu zasilania"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Przytrzymaj i przeciągnij, aby przestawić elementy sterujące"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"Usunięto wszystkie elementy sterujące"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"Nie udało się wczytać listy elementów sterujących."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Inne"</string>
-    <string name="controls_dialog_title" msgid="2343565267424406202">"Dodaj do sterowania urządzeniem"</string>
+    <string name="controls_dialog_title" msgid="2343565267424406202">"Dodaj do sterowania urządzeniami"</string>
     <string name="controls_dialog_ok" msgid="7011816381344485651">"Dodaj do ulubionych"</string>
     <string name="controls_dialog_message" msgid="6292099631702047540">"Aplikacja <xliff:g id="APP">%s</xliff:g> zaproponowała dodanie tego elementu sterującego do ulubionych."</string>
     <string name="controls_dialog_confirmation" msgid="586517302736263447">"Zaktualizowano elementy sterujące"</string>
diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml
index 6e1266b..0544c50 100644
--- a/packages/SystemUI/res/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/res/values-pt-rBR/strings.xml
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"Não é possível salvar a captura de tela, porque não há espaço suficiente"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"O app ou a organização não permitem capturas de tela"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Dispensar captura de tela"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"Abrir captura de tela"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"Visualização de captura de tela"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"Gravador de tela"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notificação contínua para uma sessão de gravação de tela"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"Iniciar gravação?"</string>
@@ -707,10 +707,10 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"Bolha"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"Ajuda você a manter o foco sem som ou vibração."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"Chama sua atenção com som ou vibração."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"Chama sua atenção com som ou vibração. As conversas do app <xliff:g id="APP_NAME">%1$s</xliff:g> aparecem em balões por padrão."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Mantém sua atenção com um atalho flutuante para esse conteúdo."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Aparece na parte superior de uma seção de conversa e em forma de balão."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"Todas as conversas em <xliff:g id="APP_NAME_0">%1$s</xliff:g> aparecem em forma de balão por padrão. Gerencie isso no app <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string>
-    <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Config."</string>
+    <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Configurações"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioridade"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Nenhum balão recente"</string>
     <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Os balões recentes e dispensados aparecerão aqui"</string>
@@ -962,7 +962,7 @@
     <string name="running_foreground_services_title" msgid="5137313173431186685">"Apps sendo executados em segundo plano"</string>
     <string name="running_foreground_services_msg" msgid="3009459259222695385">"Tocar para ver detalhes sobre a bateria e o uso de dados"</string>
     <string name="mobile_data_disable_title" msgid="5366476131671617790">"Desativar os dados móveis?"</string>
-    <string name="mobile_data_disable_message" msgid="8604966027899770415">"Você não terá acesso a dados ou à Internet por meio da operadora <xliff:g id="CARRIER">%s</xliff:g>. A Internet só estará disponível via Wi-Fi."</string>
+    <string name="mobile_data_disable_message" msgid="8604966027899770415">"Você não terá acesso a dados ou à Internet pela operadora <xliff:g id="CARRIER">%s</xliff:g>. A Internet só estará disponível via Wi-Fi."</string>
     <string name="mobile_data_disable_message_default_carrier" msgid="6496033312431658238">"sua operadora"</string>
     <string name="touch_filtered_warning" msgid="8119511393338714836">"Como um app está ocultando uma solicitação de permissão, as configurações não podem verificar sua resposta."</string>
     <string name="slice_permission_title" msgid="3262615140094151017">"Permitir que <xliff:g id="APP_0">%1$s</xliff:g> mostre partes do app <xliff:g id="APP_2">%2$s</xliff:g>?"</string>
@@ -999,9 +999,15 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Controle os balões a qualquer momento"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Toque em \"Gerenciar\" para desativar os balões desse app"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Ok"</string>
+    <string name="bubbles_app_settings" msgid="5779443644062348657">"Configurações de <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Navegação no sistema atualizada. Se quiser alterá-la, acesse as configurações."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Acesse as configurações para atualizar a navegação no sistema"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Em espera"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Aparecer na parte superior da seção de conversa"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Mostrar foto do perfil na tela de bloqueio"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Aparecer como balões flutuantes sobre outros apps"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Interromper o \"Não perturbe\""</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Ok"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"Janela de sobreposição de ampliação"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"Janela de ampliação"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"Controles da janela de ampliação"</string>
@@ -1016,10 +1022,8 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"Controles"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Escolha os controles para acessar pelo menu do botão liga/desliga"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Mantenha a tela pressionada e arraste para reorganizar os controles"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"Todos os controles foram removidos"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"Não foi possível carregar a lista de controles."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Outro"</string>
     <string name="controls_dialog_title" msgid="2343565267424406202">"Adicionar aos controles do dispositivo"</string>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index 1137a77..9a7f817 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"Não é possível guardar a captura de ecrã devido a espaço de armazenamento limitado."</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"A aplicação ou a sua entidade não permitem tirar capturas de ecrã"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Ignorar captura de ecrã"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"Abrir captura de ecrã"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"Pré-visualização da captura de ecrã"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"Gravador de ecrã"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notificação persistente de uma sessão de gravação de ecrã"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"Pretende iniciar a gravação?"</string>
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"Balão"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"Ajuda-o a focar-se sem som ou vibração."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"Chama a sua atenção com som ou vibração."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"Chama a sua atenção com som ou vibração. As conversas da app <xliff:g id="APP_NAME">%1$s</xliff:g> aparecem como um balão por predefinição."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Mantém a sua atenção com um atalho flutuante para este conteúdo."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Aparece na parte superior da secção de conversas e surge como um balão."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"Todas as conversas da app <xliff:g id="APP_NAME_0">%1$s</xliff:g> aparecem como um balão por predefinição. Faça a gestão na app <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Definições"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioridade"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Nenhum balão recente"</string>
@@ -999,9 +999,16 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Controle os balões em qualquer altura"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Toque em Gerir para desativar os balões desta app."</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"OK"</string>
+    <!-- no translation found for bubbles_app_settings (5779443644062348657) -->
+    <skip />
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"A navegação no sistema foi atualizada. Para efetuar alterações, aceda às Definições."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Aceda às Definições para atualizar a navegação no sistema."</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Modo de espera"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Aparecem na parte superior da secção de conversas."</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Mostram a imagem do perfil no ecrã de bloqueio."</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Aparecem como balões flutuantes por cima de apps."</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Interrompem o modo Não incomodar."</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"OK"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"Janela de sobreposição da ampliação"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"Janela de ampliação"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"Controlos da janela de ampliação"</string>
@@ -1016,10 +1023,8 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"Controlos"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Escolha os controlos a que pretende aceder a partir do menu ligar/desligar."</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Toque sem soltar e arraste para reorganizar os controlos."</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"Todos os controlos foram removidos."</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"Não foi possível carregar a lista dos controlos."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Outro"</string>
     <string name="controls_dialog_title" msgid="2343565267424406202">"Adicione aos controlos de dispositivos"</string>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index 6e1266b..0544c50 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"Não é possível salvar a captura de tela, porque não há espaço suficiente"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"O app ou a organização não permitem capturas de tela"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Dispensar captura de tela"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"Abrir captura de tela"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"Visualização de captura de tela"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"Gravador de tela"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notificação contínua para uma sessão de gravação de tela"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"Iniciar gravação?"</string>
@@ -707,10 +707,10 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"Bolha"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"Ajuda você a manter o foco sem som ou vibração."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"Chama sua atenção com som ou vibração."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"Chama sua atenção com som ou vibração. As conversas do app <xliff:g id="APP_NAME">%1$s</xliff:g> aparecem em balões por padrão."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Mantém sua atenção com um atalho flutuante para esse conteúdo."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Aparece na parte superior de uma seção de conversa e em forma de balão."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"Todas as conversas em <xliff:g id="APP_NAME_0">%1$s</xliff:g> aparecem em forma de balão por padrão. Gerencie isso no app <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string>
-    <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Config."</string>
+    <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Configurações"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioridade"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Nenhum balão recente"</string>
     <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Os balões recentes e dispensados aparecerão aqui"</string>
@@ -962,7 +962,7 @@
     <string name="running_foreground_services_title" msgid="5137313173431186685">"Apps sendo executados em segundo plano"</string>
     <string name="running_foreground_services_msg" msgid="3009459259222695385">"Tocar para ver detalhes sobre a bateria e o uso de dados"</string>
     <string name="mobile_data_disable_title" msgid="5366476131671617790">"Desativar os dados móveis?"</string>
-    <string name="mobile_data_disable_message" msgid="8604966027899770415">"Você não terá acesso a dados ou à Internet por meio da operadora <xliff:g id="CARRIER">%s</xliff:g>. A Internet só estará disponível via Wi-Fi."</string>
+    <string name="mobile_data_disable_message" msgid="8604966027899770415">"Você não terá acesso a dados ou à Internet pela operadora <xliff:g id="CARRIER">%s</xliff:g>. A Internet só estará disponível via Wi-Fi."</string>
     <string name="mobile_data_disable_message_default_carrier" msgid="6496033312431658238">"sua operadora"</string>
     <string name="touch_filtered_warning" msgid="8119511393338714836">"Como um app está ocultando uma solicitação de permissão, as configurações não podem verificar sua resposta."</string>
     <string name="slice_permission_title" msgid="3262615140094151017">"Permitir que <xliff:g id="APP_0">%1$s</xliff:g> mostre partes do app <xliff:g id="APP_2">%2$s</xliff:g>?"</string>
@@ -999,9 +999,15 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Controle os balões a qualquer momento"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Toque em \"Gerenciar\" para desativar os balões desse app"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Ok"</string>
+    <string name="bubbles_app_settings" msgid="5779443644062348657">"Configurações de <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Navegação no sistema atualizada. Se quiser alterá-la, acesse as configurações."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Acesse as configurações para atualizar a navegação no sistema"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Em espera"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Aparecer na parte superior da seção de conversa"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Mostrar foto do perfil na tela de bloqueio"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Aparecer como balões flutuantes sobre outros apps"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Interromper o \"Não perturbe\""</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Ok"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"Janela de sobreposição de ampliação"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"Janela de ampliação"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"Controles da janela de ampliação"</string>
@@ -1016,10 +1022,8 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"Controles"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Escolha os controles para acessar pelo menu do botão liga/desliga"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Mantenha a tela pressionada e arraste para reorganizar os controles"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"Todos os controles foram removidos"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"Não foi possível carregar a lista de controles."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Outro"</string>
     <string name="controls_dialog_title" msgid="2343565267424406202">"Adicionar aos controles do dispositivo"</string>
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index f7b1f07..dc5c682 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"Captura de ecran nu poate fi salvată din cauza spațiului de stocare limitat"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Crearea capturilor de ecran nu este permisă de aplicație sau de organizația dvs."</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Închideți captura de ecran"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"Deschideți captura de ecran"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"Previzualizare a capturii de ecran"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"Recorder pentru ecran"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notificare în curs pentru o sesiune de înregistrare a ecranului"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"Începeți înregistrarea?"</string>
@@ -710,9 +710,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"Balon"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"Vă ajută să vă concentrați fără sunet sau vibrare."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"Vă atrage atenția fără sunet sau vibrare."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"Vă atrage atenția cu sunet sau vibrație. Conversațiile din balonul <xliff:g id="APP_NAME">%1$s</xliff:g> în mod prestabilit."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Vă atrage atenția printr-o comandă rapidă flotantă la acest conținut."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Se afișează în partea de sus a secțiunii de conversație și apare ca un balon."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"Toate conversațiile din <xliff:g id="APP_NAME_0">%1$s</xliff:g> apar în mod prestabilit în balon. Gestionați în <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Setări"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioritate"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Nu există baloane recente"</string>
@@ -1004,15 +1004,22 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Controlați oricând baloanele"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Atingeți Gestionați pentru a dezactiva baloanele din această aplicație"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"OK"</string>
+    <!-- no translation found for bubbles_app_settings (5779443644062348657) -->
+    <skip />
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Navigarea în sistem a fost actualizată. Pentru a face modificări, accesați Setările."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Accesați Setările pentru a actualiza navigarea în sistem"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Standby"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Apar în partea de sus a secțiunii de conversație"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Afișează fotografia de profil pe ecranul de blocare"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Apar ca un balon flotant deasupra aplicațiilor"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Întrerup modul Nu deranja"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"OK"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"Fereastra de suprapunere pentru mărire"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"Fereastra de mărire"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"Comenzi pentru fereastra de mărire"</string>
-    <string name="quick_controls_title" msgid="6839108006171302273">"Comenzile dispozitivului"</string>
+    <string name="quick_controls_title" msgid="6839108006171302273">"Comenzile dispozitivelor"</string>
     <string name="quick_controls_subtitle" msgid="1667408093326318053">"Adăugați comenzi pentru dispozitivele conectate"</string>
-    <string name="quick_controls_setup_title" msgid="8901436655997849822">"Configurați comenzile dispozitivului"</string>
+    <string name="quick_controls_setup_title" msgid="8901436655997849822">"Configurați comenzile dispozitivelor"</string>
     <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"Apăsați butonul de pornire pentru a accesa comenzile"</string>
     <string name="controls_providers_title" msgid="6879775889857085056">"Alegeți aplicația pentru a adăuga comenzi"</string>
     <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380">
@@ -1022,13 +1029,11 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"Comenzi"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Alegeți comenzile de accesat din meniul de alimentare"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Țineți apăsat și trageți pentru a rearanja comenzile"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"Au fost șterse toate comenzile"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"Lista cu toate comenzile nu a putut fi încărcată."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Altul"</string>
-    <string name="controls_dialog_title" msgid="2343565267424406202">"Adăugați la comenzile dispozitivului"</string>
+    <string name="controls_dialog_title" msgid="2343565267424406202">"Adăugați la comenzile dispozitivelor"</string>
     <string name="controls_dialog_ok" msgid="7011816381344485651">"Adăugați la preferate"</string>
     <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> a sugerat adăugarea acestei comenzi la preferate."</string>
     <string name="controls_dialog_confirmation" msgid="586517302736263447">"S-au actualizat comenzile"</string>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index db37b03..00e8e60 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"Не удалось сохранить скриншот: недостаточно места."</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Не удалось сделать скриншот: нет разрешения от приложения или организации."</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Закрыть скриншот"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"Открыть скриншот"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"Предварительный просмотр скриншота"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"Создание скриншотов"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Текущее уведомление для записи видео с экрана"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"Начать запись?"</string>
@@ -588,7 +588,7 @@
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"Настройки звука"</string>
     <string name="accessibility_volume_expand" msgid="7653070939304433603">"Развернуть"</string>
     <string name="accessibility_volume_collapse" msgid="2746845391013829996">"Свернуть"</string>
-    <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Автоматические субтитры"</string>
+    <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Автоматически добавлять субтитры"</string>
     <string name="accessibility_volume_close_odi_captions_tip" msgid="8924753283621160480">"Подсказка \"Закрыть субтитры\""</string>
     <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Наложение субтитров"</string>
     <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"включить"</string>
@@ -713,9 +713,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"Всплывающая подсказка"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"Уведомления приходят без звука и вибрации"</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"Уведомления приходят со звуком или вибрацией"</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"Уведомления приходят со звуком или вибрацией. Разговоры из приложения \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" по умолчанию появляются в виде всплывающего чата."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Привлекает ваше внимание к контенту с помощью плавающего ярлыка"</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Появляется в верхней части списка разговоров и в виде всплывающего чата."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"Все разговоры из сервиса \"<xliff:g id="APP_NAME_0">%1$s</xliff:g>\" по умолчанию появляются в виде всплывающих чатов. Изменить настройки можно в приложении \"<xliff:g id="APP_NAME_1">%2$s</xliff:g>\"."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Настройки"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Приоритет"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Нет недавних всплывающих чатов"</string>
@@ -972,7 +972,7 @@
     <string name="running_foreground_services_title" msgid="5137313173431186685">"Приложения, работающие в фоновом режиме"</string>
     <string name="running_foreground_services_msg" msgid="3009459259222695385">"Нажмите, чтобы проверить энергопотребление и трафик"</string>
     <string name="mobile_data_disable_title" msgid="5366476131671617790">"Отключить мобильный Интернет?"</string>
-    <string name="mobile_data_disable_message" msgid="8604966027899770415">"У вас не будет доступа к данным и Интернету через оператора \"<xliff:g id="CARRIER">%s</xliff:g>\". Вы сможете установить интернет-соединение только по сети Wi-Fi."</string>
+    <string name="mobile_data_disable_message" msgid="8604966027899770415">"Вы не сможете передавать данные или выходить в Интернет через оператора \"<xliff:g id="CARRIER">%s</xliff:g>\". Интернет будет доступен только по сети Wi-Fi."</string>
     <string name="mobile_data_disable_message_default_carrier" msgid="6496033312431658238">"ваш оператор"</string>
     <string name="touch_filtered_warning" msgid="8119511393338714836">"Невозможно принять ваше согласие, поскольку запрос скрыт другим приложением."</string>
     <string name="slice_permission_title" msgid="3262615140094151017">"Разрешить приложению \"<xliff:g id="APP_0">%1$s</xliff:g>\" показывать фрагменты приложения \"<xliff:g id="APP_2">%2$s</xliff:g>\"?"</string>
@@ -1009,15 +1009,21 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Настройки всплывающих чатов"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Чтобы отключить всплывающие чаты от приложения, нажмите \"Настроить\"."</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"ОК"</string>
+    <string name="bubbles_app_settings" msgid="5779443644062348657">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>: настройки"</string>
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Параметры навигации в системе обновлены. Чтобы изменить их, перейдите в настройки."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Чтобы обновить параметры навигации в системе, перейдите в настройки."</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Переход в режим ожидания"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Показывать в верхней части списка разговоров"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Показывать фото профиля на заблокированном экране"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Показывать как всплывающий чат над приложениями"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Показывать в режиме \"Не беспокоить\""</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"ОК"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"Наложение окна увеличения"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"Окно увеличения"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"Настройки окна увеличения"</string>
-    <string name="quick_controls_title" msgid="6839108006171302273">"Элементы управления"</string>
+    <string name="quick_controls_title" msgid="6839108006171302273">"Виджеты управления устройствами"</string>
     <string name="quick_controls_subtitle" msgid="1667408093326318053">"Добавьте элементы управления для подключенных устройств"</string>
-    <string name="quick_controls_setup_title" msgid="8901436655997849822">"Настройте элементы управления"</string>
+    <string name="quick_controls_setup_title" msgid="8901436655997849822">"Настройте виджеты управления устройствами"</string>
     <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"Чтобы перейти к элементам управления, удерживайте кнопку питания."</string>
     <string name="controls_providers_title" msgid="6879775889857085056">"Чтобы добавить элементы управления, выберите приложение"</string>
     <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380">
@@ -1028,13 +1034,11 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"Элементы управления"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Выберите элементы управления, которые будут доступны в меню кнопки питания."</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Чтобы изменить порядок элементов управления, перетащите их"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"Все элементы управления удалены"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"Не удалось загрузить список элементов управления."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Другое"</string>
-    <string name="controls_dialog_title" msgid="2343565267424406202">"Добавьте элементы управления"</string>
+    <string name="controls_dialog_title" msgid="2343565267424406202">"Добавьте виджеты управления устройствами"</string>
     <string name="controls_dialog_ok" msgid="7011816381344485651">"Добавить в избранное"</string>
     <string name="controls_dialog_message" msgid="6292099631702047540">"Приложение \"<xliff:g id="APP">%s</xliff:g>\" предлагает добавить этот элемент управления в избранное."</string>
     <string name="controls_dialog_confirmation" msgid="586517302736263447">"Элементы управления обновлены."</string>
diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml
index 6baa7e1..1fde1e2 100644
--- a/packages/SystemUI/res/values-si/strings.xml
+++ b/packages/SystemUI/res/values-si/strings.xml
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"සීමිත ගබඩා ඉඩ නිසා තිර රුව සුරැකිය නොහැකිය"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"තිර රූ ගැනීමට යෙදුම හෝ ඔබගේ සංවිධානය ඉඩ නොදේ"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"තිර රුව ඉවත ලන්න"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"තිර රුව විවෘත කරන්න"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"තිර රූ පෙර දසුන"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"තිර රෙකෝඩරය"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"තිර පටිගත කිරීමේ සැසියක් සඳහා කෙරෙන දැනුම් දීම"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"පටිගත කිරීම ආරම්භ කරන්නද?"</string>
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"බුබුළු"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"ඔබට ශබ්දය හෝ කම්පනය නොමැතිව අවධානය යොමු කිරීමට උදවු කරයි."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"ශබ්දය හෝ කම්පනය සමඟ ඔබේ අවධානය ලබා ගනී."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"ශබ්දය හෝ කම්පනය සමඟ ඔබේ අවධානය ලබා ගනී. <xliff:g id="APP_NAME">%1$s</xliff:g> වෙතින් සංවාද පෙරනිමියෙන් බුබුළු දමයි"</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"පාවෙන කෙටිමගක් සමග ඔබේ අවධානය මෙම අන්තර්ගතය වෙත තබා ගන්න."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"සංවාද කොටසේ ඉහළම පෙන්වන අතර බුබුළක් ලෙස දිස් වේ."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> බුබුලෙන් වන සියලු සංවාද පෙරනිමියෙනි. <xliff:g id="APP_NAME_1">%2$s</xliff:g> හි කළමනාකරණය කරන්න."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"සැකසීම්"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"ප්‍රමුඛතාව"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"මෑත බුබුලු නැත"</string>
@@ -999,9 +999,16 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"ඕනෑම වේලාවක බුබුලු පාලනය කරන්න"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"මෙම යෙදුමෙන් බුබුලු ක්‍රියාවිරහිත කිරීමට කළමනාකරණය කරන්න තට්ටු කරන්න"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"තේරුණා"</string>
+    <!-- no translation found for bubbles_app_settings (5779443644062348657) -->
+    <skip />
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"පද්ධති සංචලනය යාවත්කාලීන කළා. වෙනස්කම් සිදු කිරීමට, සැකසීම් වෙත යන්න."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"පද්ධති සංචලනය යාවත්කාලීන කිරීමට සැකසීම් වෙත යන්න"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"පොරොත්තු"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"සංවාද කොටසේ ඉහළ දී පෙන්වන්න"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"පැතිකඩ පින්තූරය අගුලු තිරය මත පෙන්වන්න"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"යෙදුම්වල ඉහළම පාවෙන බුබුලක් ලෙස දිස් වේ"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"බාධා නොකරන්න හට බාධා කරන්න"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"තේරුණා"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"විශාලන උඩැතිරි කවුළුව"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"විශාලන කවුළුව"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"විශාලනය කිරීමේ කවුළු පාලන"</string>
@@ -1016,10 +1023,8 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"පාලන"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"බල මෙනුවෙන් ප්‍රවේශ වීමට පාලන තෝරා ගන්න"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"පාලන නැවත පිළියෙළ කිරීමට අල්ලාගෙන සිට අදින්න"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"සියලු පාලන ඉවත් කර ඇත"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"සියලු පාලනවල ලැයිස්තුව පූරණය කළ නොහැකි විය."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"වෙනත්"</string>
     <string name="controls_dialog_title" msgid="2343565267424406202">"උපාංග පාලන වෙත එක් කරන්න"</string>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index e7c15d4..7504f15 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"Snímka obrazovky sa nedá uložiť z dôvodu nedostatku miesta v úložisku"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Vytváranie snímok obrazovky je zakázané aplikáciou alebo vašou organizáciou"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Zavrieť snímku obrazovky"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"Otvoriť snímku obrazovky"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"Ukážka snímky obrazovky"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"Rekordér obrazovky"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Zobrazuje sa upozornenie týkajúce sa relácie záznamu obrazovky"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"Chcete spustiť nahrávanie?"</string>
@@ -713,9 +713,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"Bublina"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"Pomáha vám sústrediť sa bez zvukov či vibrácií."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"Upúta vás zvukom alebo vibráciami."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"Upúta vás zvukom alebo vibráciami. Predvolene sa zobrazia konverzácie z bubliny <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Upúta vás plávajúcim odkazom na tento obsah."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Zobrazuje sa v hornej časti konverzácie ako bublina."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"Predvolene zobrazovať všetky konverzácie z aplikácie <xliff:g id="APP_NAME_0">%1$s</xliff:g> ako bubliny. Spravujte v aplikácii <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Nastavenia"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Priorita"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Žiadne nedávne bubliny"</string>
@@ -1009,15 +1009,22 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Ovládajte bubliny kedykoľvek"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Klepnutím na Spravovať vypnite bubliny z tejto aplikácie"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Dobre"</string>
+    <!-- no translation found for bubbles_app_settings (5779443644062348657) -->
+    <skip />
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Navigácia v systéme bola aktualizovaná. Ak chcete vykonať zmeny, prejdite do Nastavení."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Prejdite do Nastavení a aktualizujte navigáciu v systéme"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Pohotovostný režim"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Zobrazovať v hornej sekcii konverzácie"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Zobrazovať profilovú fotku na uzamknutej obrazovke"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Zobrazovať ako plávajúce bubliny nad aplikáciami"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Prerušovať režim bez vyrušení"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Dobre"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"Okno prekrytia priblíženia"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"Okno priblíženia"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"Ovládacie prvky okna priblíženia"</string>
-    <string name="quick_controls_title" msgid="6839108006171302273">"Ovládacie prvky zariadenia"</string>
+    <string name="quick_controls_title" msgid="6839108006171302273">"Ovládanie zariadenia"</string>
     <string name="quick_controls_subtitle" msgid="1667408093326318053">"Pridajte ovládacie prvky pre svoje pripojené zariadenia"</string>
-    <string name="quick_controls_setup_title" msgid="8901436655997849822">"Nastavenie ovládacích prvkov zariadenia"</string>
+    <string name="quick_controls_setup_title" msgid="8901436655997849822">"Nastavenie ovládania zariadenia"</string>
     <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"Pridržaním vypínača získate prístup k ovládacím prvkom"</string>
     <string name="controls_providers_title" msgid="6879775889857085056">"Výberom aplikácie pridajte ovládacie prvky"</string>
     <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380">
@@ -1028,13 +1035,11 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"Ovládacie prvky"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Vyberte si ovládacie prvky, ku ktorým chcete mať prístup v ponuke vypínača"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Ovládacie prvky môžete usporiadať pridržaním a presunutím"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"Všetky ovládacie prvky boli odstránené"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"Zoznam všetkých ovl. prvkov sa nepodarilo načítať."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Iné"</string>
-    <string name="controls_dialog_title" msgid="2343565267424406202">"Pridanie do ovládacích prvkov zariadenia"</string>
+    <string name="controls_dialog_title" msgid="2343565267424406202">"Pridanie do ovládania zariadenia"</string>
     <string name="controls_dialog_ok" msgid="7011816381344485651">"Pridať do obľúbených"</string>
     <string name="controls_dialog_message" msgid="6292099631702047540">"Aplikácia <xliff:g id="APP">%s</xliff:g> vám odporučila pridať tento ovládací prvok do obľúbených."</string>
     <string name="controls_dialog_confirmation" msgid="586517302736263447">"Ovládanie bolo aktualizované"</string>
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index 1ab62e7..b427601 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"Shranjevanje posnetka zaslona ni mogoče zaradi omejenega prostora za shranjevanje"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Aplikacija ali vaša organizacija ne dovoljuje posnetkov zaslona"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Opusti posnetek zaslona"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"Odpri posnetek zaslona"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"Predogled posnetka zaslona"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"Snemalnik zaslona"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Nenehno obveščanje o seji snemanja zaslona"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"Želite začeti snemati?"</string>
@@ -713,9 +713,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"Mehurček"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"Nemoteč prikaz brez zvoka ali vibriranja"</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"Pritegne vašo pozornost z zvokom ali vibriranjem"</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"Pritegne vašo pozornost z zvokom ali vibriranjem. Pogovori v aplikaciji <xliff:g id="APP_NAME">%1$s</xliff:g> so privzeto prikazani v oblačkih."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Zadrži vašo pozornost z lebdečo bližnjico do te vsebine."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Prikazano je na vrhu razdelka s pogovorom in v oblačku."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"Vsi pogovori v aplikaciji <xliff:g id="APP_NAME_0">%1$s</xliff:g> so privzeto prikazani v oblačkih. Upravljajte v aplikaciji <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Nastavitve"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prednost"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Ni nedavnih oblačkov"</string>
@@ -1009,9 +1009,16 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Upravljanje oblačkov kadar koli"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Dotaknite se »Upravljanje«, da izklopite oblačke iz te aplikacije"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Razumem"</string>
+    <!-- no translation found for bubbles_app_settings (5779443644062348657) -->
+    <skip />
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Krmarjenje po sistemu je posodobljeno. Če želite opraviti spremembe, odprite nastavitve."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Če želite posodobiti krmarjenje po sistemu, odprite nastavitve"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Stanje pripravljenosti"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Prikazano na vrhu razdelka s pogovorom"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Prikaz profilne slike na zaklenjenem zaslonu"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Prikazano kot lebdeč oblaček čez druge aplikacije"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Preglasi način »ne moti«"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"V redu"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"Prekrivno povečevalno okno"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"Povečevalno okno"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"Kontrolniki povečevalnega okna"</string>
@@ -1028,10 +1035,8 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"Kontrolniki"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Izberite kontrolnike, do katerih želite imeti dostop prek menija za vklop/izklop"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Držite in povlecite, da prerazporedite kontrolnike"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"Vsi kontrolniki so bili odstranjeni"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"Seznama vseh kontrolnikov ni bilo mogoče naložiti."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Drugo"</string>
     <string name="controls_dialog_title" msgid="2343565267424406202">"Dodajanje med kontrolnike naprave"</string>
diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml
index c95232c..ae60891 100644
--- a/packages/SystemUI/res/values-sq/strings.xml
+++ b/packages/SystemUI/res/values-sq/strings.xml
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"Pamja e ekranit nuk mund të ruhet për shkak të hapësirës ruajtëse të kufizuar"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Nxjerrja e pamjeve të ekranit nuk lejohet nga aplikacioni ose organizata jote."</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Hiq pamjen e ekranit"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"Hap pamjen e ekranit"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"Pamja paraprake e imazhit"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"Regjistruesi i ekranit"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Njoftim i vazhdueshëm për një seancë regjistrimi të ekranit"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"Të niset regjistrimi?"</string>
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"Flluskë"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"Të ndihmon të fokusohesh pa tinguj ose dridhje."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"Të tërheq vëmendjen me tinguj ose dridhje."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"Të tërheq vëmendjen me tinguj ose dridhje. Bisedat nga flluska e <xliff:g id="APP_NAME">%1$s</xliff:g> si parazgjedhje."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Mban vëmendjen tënde me një shkurtore pluskuese te kjo përmbajtje."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Shfaqet në krye të seksionit të bisedës dhe shfaqet si flluskë."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"Të gjitha bisedat nga flluska e <xliff:g id="APP_NAME_0">%1$s</xliff:g> si parazgjedhje. Menaxho në <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Cilësimet"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Përparësia"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Nuk ka flluska të fundit"</string>
@@ -999,9 +999,16 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Kontrollo flluskat në çdo moment"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Trokit \"Menaxho\" për të çaktivizuar flluskat nga ky aplikacion"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"E kuptova"</string>
+    <!-- no translation found for bubbles_app_settings (5779443644062348657) -->
+    <skip />
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Navigimi i sistemit u përditësua. Për të bërë ndryshime, shko te \"Cilësimet\"."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Shko te \"Cilësimet\" për të përditësuar navigimin e sistemit"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Në gatishmëri"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Shfaq në krye të seksionit të bisedës"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Shfaq figurën e profilit në ekranin e kyçjes"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Shfaq si flluskë pluskuese mbi aplikacione"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Ndërprit \"Mos shqetëso\""</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"E kuptova"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"Dritarja e mbivendosjes së zmadhimit"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"Dritarja e zmadhimit"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"Kontrollet e dritares së zmadhimit"</string>
@@ -1016,10 +1023,8 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"Kontrollet"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Zgjidh kontrollet për të pasur qasje nga menyja e energjisë"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Mbaje të shtypur dhe zvarrit për të risistemuar kontrollet"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"Të gjitha kontrollet u hoqën"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"Lista e të gjitha kontrolleve nuk mund të ngarkohej."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Tjetër"</string>
     <string name="controls_dialog_title" msgid="2343565267424406202">"Shto te kontrollet e pajisjes"</string>
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index 3e2482d..c32626c 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -33,7 +33,7 @@
     <string name="invalid_charger_title" msgid="938685362320735167">"Пуњење преко USB-а није успело"</string>
     <string name="invalid_charger_text" msgid="2339310107232691577">"Користите пуњач који сте добили уз уређај"</string>
     <string name="battery_low_why" msgid="2056750982959359863">"Подешавања"</string>
-    <string name="battery_saver_confirmation_title" msgid="1234998463717398453">"Желите ли да укључите Уштеду батерије?"</string>
+    <string name="battery_saver_confirmation_title" msgid="1234998463717398453">"Желите да укључите Уштеду батерије?"</string>
     <string name="battery_saver_confirmation_title_generic" msgid="2299231884234959849">"О Уштеди батерије"</string>
     <string name="battery_saver_confirmation_ok" msgid="5042136476802816494">"Укључи"</string>
     <string name="battery_saver_start_action" msgid="4553256017945469937">"Укључи Уштеду батерије"</string>
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"Чување снимка екрана није успело због ограниченог меморијског простора"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Апликација или организација не дозвољавају прављење снимака екрана"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Одбаците снимак екрана"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"Отворите снимак екрана"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"Преглед снимка екрана"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"Снимач екрана"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Обавештење о сесији снимања екрана је активно"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"Желите да започнете снимање?"</string>
@@ -710,9 +710,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"Облачић"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"Помаже вам да се концентришете без звука или вибрације."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"Привлачи вам пажњу помоћу звука или вибрације."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"Привлачи вам пажњу помоћу звука или вибрирања. Конверзације из апликације <xliff:g id="APP_NAME">%1$s</xliff:g> се подразумевано приказују у облачићима."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Привлачи вам пажњу помоћу плутајуће пречице до овог садржаја."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Приказује се у врху одељка конверзације и као облачић."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"Све конверзације из апликације <xliff:g id="APP_NAME_0">%1$s</xliff:g> се подразумевано приказују у облачићима. Управљајте у апликацији <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Подешавања"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Приоритет"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Нема недавних облачића"</string>
@@ -966,7 +966,7 @@
     <string name="qs_dnd_replace" msgid="7712119051407052689">"Замени"</string>
     <string name="running_foreground_services_title" msgid="5137313173431186685">"Апликације покренуте у позадини"</string>
     <string name="running_foreground_services_msg" msgid="3009459259222695385">"Додирните за детаље о батерији и потрошњи података"</string>
-    <string name="mobile_data_disable_title" msgid="5366476131671617790">"Желите ли да искључите мобилне податке?"</string>
+    <string name="mobile_data_disable_title" msgid="5366476131671617790">"Желите да искључите мобилне податке?"</string>
     <string name="mobile_data_disable_message" msgid="8604966027899770415">"Нећете имати приступ подацима или интернету преко мобилног оператера <xliff:g id="CARRIER">%s</xliff:g>. Интернет ће бити доступан само преко Wi-Fi везе."</string>
     <string name="mobile_data_disable_message_default_carrier" msgid="6496033312431658238">"мобилни оператер"</string>
     <string name="touch_filtered_warning" msgid="8119511393338714836">"Подешавања не могу да верификују ваш одговор јер апликација скрива захтев за дозволу."</string>
@@ -1004,9 +1004,16 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Контролишите облачиће у било ком тренутку"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Додирните Управљајте да бисте искључили облачиће из ове апликације"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Важи"</string>
+    <!-- no translation found for bubbles_app_settings (5779443644062348657) -->
+    <skip />
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Навигација система је ажурирана. Да бисте унели измене, идите у Подешавања."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Идите у Подешавања да бисте ажурирали навигацију система"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Стање приправности"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Приказују се у врху одељка за конверзације"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Приказују слику профила на закључаном екрану"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Приказују се плутајући облачићи преко апликација"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Ометају подешавање Не узнемиравај"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Важи"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"Преклопни прозор за увећање"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"Прозор за увећање"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"Контроле прозора за увећање"</string>
@@ -1022,10 +1029,8 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"Контроле"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Одаберите контроле којима ћете приступати из менија напајања"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Задржите и превуците да бисте променили распоред контрола"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"Све контроле су уклоњене"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"Учитавање листе свих контрола није успело."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Друго"</string>
     <string name="controls_dialog_title" msgid="2343565267424406202">"Додајте у контроле уређаја"</string>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index 509b97c..6ef1dfd 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"Det går inte att spara skärmdumpen eftersom lagringsutrymmet inte räcker"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Appen eller organisationen tillåter inte att du tar skärmdumpar"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Stäng skärmdump"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"Öppna skärmdump"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"Förhandsgranskning av skärmdump"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"Skärminspelare"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Avisering om att skärminspelning pågår"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"Vill du starta inspelningen?"</string>
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"Bubbla"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"Inga ljud eller vibrationer som stör koncentrationen."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"Påkallar uppmärksamhet med ljud eller vibrationer."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"Påkallar uppmärksamhet med ljud eller vibrationer. Konversationer från <xliff:g id="APP_NAME">%1$s</xliff:g> visas i bubblor som standard."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Behåller din uppmärksamhet med en flytande genväg till innehållet."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Visas högst upp bland konversationerna som en bubbla"</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"Alla konversationer från <xliff:g id="APP_NAME_0">%1$s</xliff:g> visas i bubblor som standard. Hantera detta i <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Inställningar"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioritet"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Inga nya bubblor"</string>
@@ -978,7 +978,7 @@
     <string name="auto_saver_enabled_text" msgid="7889491183116752719">"Batterisparläget aktiveras automatiskt när batterinivån är under <xliff:g id="PERCENTAGE">%d</xliff:g> %%."</string>
     <string name="open_saver_setting_action" msgid="2111461909782935190">"Inställningar"</string>
     <string name="auto_saver_okay_action" msgid="7815925750741935386">"OK"</string>
-    <string name="heap_dump_tile_name" msgid="2464189856478823046">"Dumpa SysUI-heap"</string>
+    <string name="heap_dump_tile_name" msgid="2464189856478823046">"Dump SysUI-heap"</string>
     <string name="sensor_privacy_mode" msgid="4462866919026513692">"Sensorer har inaktiverats"</string>
     <string name="device_services" msgid="1549944177856658705">"Enhetstjänster"</string>
     <string name="music_controls_no_title" msgid="4166497066552290938">"Ingen titel"</string>
@@ -999,15 +999,22 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Styr bubblor när som helst"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Tryck på Hantera för att stänga av bubblor från den här appen"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"OK"</string>
+    <!-- no translation found for bubbles_app_settings (5779443644062348657) -->
+    <skip />
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Systemnavigeringen har uppdaterats. Öppna inställningarna om du vill ändra något."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Öppna inställningarna och uppdatera systemnavigeringen"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Viloläge"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Visa högst upp bland konversationerna"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Visa profilbild på låsskärmen"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Visa som en flytande bubbla ovanpå appar"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Avbryt Stör ej"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"OK"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"Överlagrat förstoringsfönster"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"Förstoringsfönster"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"Inställningar för förstoringsfönster"</string>
-    <string name="quick_controls_title" msgid="6839108006171302273">"Enhetsinställningar"</string>
+    <string name="quick_controls_title" msgid="6839108006171302273">"Enhetsstyrning"</string>
     <string name="quick_controls_subtitle" msgid="1667408093326318053">"Lägg till snabbkontroller för anslutna enheter"</string>
-    <string name="quick_controls_setup_title" msgid="8901436655997849822">"Konfigurera enhetsinställningar"</string>
+    <string name="quick_controls_setup_title" msgid="8901436655997849822">"Konfigurera enhetsstyrning"</string>
     <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"Håll strömbrytaren nedtryckt för att få åtkomst till snabbkontrollerna"</string>
     <string name="controls_providers_title" msgid="6879775889857085056">"Välj en app om du vill lägga till snabbkontroller"</string>
     <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380">
@@ -1016,13 +1023,11 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"Kontroller"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Välj snabbkontroller som ska visas i strömbrytarmenyn"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Ändra ordning på kontrollerna genom att trycka och dra"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"Alla kontroller har tagits bort"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"Listan med alla kontroller kunde inte läsas in."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Övrigt"</string>
-    <string name="controls_dialog_title" msgid="2343565267424406202">"Lägg till i enhetsinställningar"</string>
+    <string name="controls_dialog_title" msgid="2343565267424406202">"Lägg till i enhetsstyrning"</string>
     <string name="controls_dialog_ok" msgid="7011816381344485651">"Lägg till i Favoriter"</string>
     <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> föreslår att du lägger till kontrollen i dina favoriter."</string>
     <string name="controls_dialog_confirmation" msgid="586517302736263447">"Snabbkontroller uppdaterade"</string>
diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml
index a23e390..01cd04a 100644
--- a/packages/SystemUI/res/values-sw/strings.xml
+++ b/packages/SystemUI/res/values-sw/strings.xml
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"Imeshindwa kuhifadhi picha ya skrini kwa sababu nafasi haitoshi"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Programu au shirika lako halikuruhusu kupiga picha za skrini"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Ondoa picha ya skrini"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"Fungua picha ya skrini"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"Onyesho la kukagua picha ya skrini"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"Kinasa Skrini"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Arifa inayoendelea ya kipindi cha kurekodi skrini"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"Ungependa kuanza kurekodi?"</string>
@@ -615,7 +615,7 @@
     <string name="stream_accessibility" msgid="3873610336741987152">"Zana za walio na matatizo ya kuona au kusikia"</string>
     <string name="ring_toggle_title" msgid="5973120187287633224">"Simu"</string>
     <string name="volume_ringer_status_normal" msgid="1339039682222461143">"Piga"</string>
-    <string name="volume_ringer_status_vibrate" msgid="6970078708957857825">"Tetema"</string>
+    <string name="volume_ringer_status_vibrate" msgid="6970078708957857825">"Kutetema"</string>
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Zima sauti"</string>
     <string name="qs_status_phone_vibrate" msgid="7055409506885541979">"Umeweka mipangilio ya simu kutetema"</string>
     <string name="qs_status_phone_muted" msgid="3763664791309544103">"Umezima sauti ya simu"</string>
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"Kiputo"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"Hukusaidia kuwa makini bila sauti au mtetemo."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"Hupata umakinifu wako kwa sauti na mtetemo."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"Hupata umakinifu wako kwa sauti au mtetemo. Mazungumzo kutoka kiputo cha <xliff:g id="APP_NAME">%1$s</xliff:g> kwa chaguomsingi."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Huweka umakinifu wako kwenye maudhui haya kwa kutumia njia ya mkato ya kuelea."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Huonyeshwa sehemu ya juu ya mazungumzo na huonekana kama kiputo."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"Mazungumzo yote kwenye <xliff:g id="APP_NAME_0">%1$s</xliff:g> huwa na kiputo kwa chaguo msingi. Dhibiti katika <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Mipangilio"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Kipaumbele"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Hakuna viputo vya hivi majuzi"</string>
@@ -999,15 +999,21 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Dhibiti viputo wakati wowote"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Gusa Dhibiti ili uzime viputo kwenye programu hii"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Nimeelewa"</string>
+    <string name="bubbles_app_settings" msgid="5779443644062348657">"Mipangilio ya <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Umesasisha usogezaji kwenye mfumo. Ili ubadilishe, nenda kwenye Mipangilio."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Nenda kwenye mipangilio ili usasishe usogezaji kwenye mfumo"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Hali tuli"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Onyesha kwenye sehemu ya juu ya mazungumzo"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Onyesha picha ya wasifu kwenye skrini iliyofungwa"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Yataonekana kama kiputo kinachoelea juu ya programu"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Katiza kipengele cha Usinisumbue"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Nimeelewa"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"Dirisha la Kuwekelea Linalokuza"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"Dirisha la Ukuzaji"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"Vidhibiti vya Dirisha la Ukuzaji"</string>
-    <string name="quick_controls_title" msgid="6839108006171302273">"Vidhibiti vya kifaa"</string>
+    <string name="quick_controls_title" msgid="6839108006171302273">"Vidhibiti vya vifaa"</string>
     <string name="quick_controls_subtitle" msgid="1667408093326318053">"Weka vidhibiti vya vifaa vyako vilivyounganishwa"</string>
-    <string name="quick_controls_setup_title" msgid="8901436655997849822">"Weka mipangilio ya vidhibiti vya kifaa"</string>
+    <string name="quick_controls_setup_title" msgid="8901436655997849822">"Weka mipangilio ya vidhibiti vya vifaa"</string>
     <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"Shikilia Kitufe cha kuwasha/kuzima ili ufikie vidhibiti vyako"</string>
     <string name="controls_providers_title" msgid="6879775889857085056">"Chagua programu ili uweke vidhibiti"</string>
     <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380">
@@ -1020,7 +1026,7 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"Umeondoa vidhibiti vyote"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"Imeshindwa kupakia orodha ya vidhibiti vyote."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Nyingine"</string>
-    <string name="controls_dialog_title" msgid="2343565267424406202">"Weka kwenye vidhibiti vya kifaa"</string>
+    <string name="controls_dialog_title" msgid="2343565267424406202">"Weka kwenye vidhibiti vya vifaa"</string>
     <string name="controls_dialog_ok" msgid="7011816381344485651">"Ongeza kwenye vipendwa"</string>
     <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> imependekeza kidhibiti hiki ili ukiongeze kwenye vipendwa vyako."</string>
     <string name="controls_dialog_confirmation" msgid="586517302736263447">"Umesasisha vidhibiti"</string>
diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml
index 4207066..a0e31d2 100644
--- a/packages/SystemUI/res/values-ta/strings.xml
+++ b/packages/SystemUI/res/values-ta/strings.xml
@@ -87,7 +87,8 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"போதுமான சேமிப்பிடம் இல்லாததால் ஸ்கிரீன்ஷாட்டைச் சேமிக்க முடியவில்லை"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"ஸ்கிரீன் ஷாட்டுகளை எடுப்பதை, ஆப்ஸ் அல்லது உங்கள் நிறுவனம் அனுமதிக்கவில்லை"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"ஸ்கிரீன்ஷாட்டை நிராகரி"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"ஸ்கிரீன்ஷாட்டைத் திற"</string>
+    <!-- no translation found for screenshot_preview_description (7606510140714080474) -->
+    <skip />
     <string name="screenrecord_name" msgid="2596401223859996572">"ஸ்கிரீன் ரெக்கார்டர்"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"திரை ரெக்கார்டிங் அமர்விற்கான தொடர் அறிவிப்பு"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"ரெக்கார்டிங்கைத் தொடங்கவா?"</string>
@@ -296,8 +297,8 @@
     <string name="accessibility_quick_settings_flashlight_on" msgid="3785616827729850766">"டார்ச் லைட் எரிகிறது"</string>
     <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"ஃபிளாஷ்லைட் முடக்கப்பட்டது."</string>
     <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"டார்ச் லைட் எரிகிறது"</string>
-    <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"வண்ண நேர்மாறு முறை முடக்கப்பட்டது."</string>
-    <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"வண்ண நேர்மாறு முறை இயக்கப்பட்டது."</string>
+    <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"கலர் இன்வெர்ஷன் முடக்கப்பட்டது."</string>
+    <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"கலர் இன்வெர்ஷன் இயக்கப்பட்டது."</string>
     <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"மொபைல் ஹாட்ஸ்பாட் முடக்கப்பட்டது."</string>
     <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"மொபைல் ஹாட்ஸ்பாட் இயக்கப்பட்டது."</string>
     <string name="accessibility_casting_turned_off" msgid="1387906158563374962">"திரையை அனுப்புதல் நிறுத்தப்பட்டது."</string>
@@ -707,9 +708,10 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"பபிள்"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"ஒலியோ அதிர்வோ இல்லாமல் முழு கவனம் செலுத்த உதவும்."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"ஒலியோ அதிர்வோ ஏற்படுத்தி உங்கள் கவனத்தை ஈர்க்கும்."</string>
+    <!-- no translation found for notification_channel_summary_default_with_bubbles (6298026344552480458) -->
+    <skip />
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"இந்த உள்ளடக்கத்திற்கான மிதக்கும் ஷார்ட்கட் மூலம் உங்கள் கவனத்தைப் பெற்றிருக்கும்."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"உரையாடல் பிரிவின் மேற்பகுதியில் ஒரு குமிழாகக் காட்டப்படும்."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> ஆப்ஸில் இருக்கும் அனைத்து உரையாடல்களும் இயல்பாகக் குமிழாகவே இருக்கும். <xliff:g id="APP_NAME_1">%2$s</xliff:g> ஆப்ஸில் நிர்வகிக்கலாம்."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"அமைப்புகள்"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"முன்னுரிமை"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"சமீபத்திய குமிழ்கள் இல்லை"</string>
@@ -999,9 +1001,16 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"குமிழ்களை எப்போது வேண்டுமானாலும் கட்டுப்படுத்தலாம்"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"இந்த ஆப்ஸிலிருந்து வரும் குமிழ்களை முடக்க, நிர்வகி என்பதைத் தட்டவும்"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"சரி"</string>
+    <!-- no translation found for bubbles_app_settings (5779443644062348657) -->
+    <skip />
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"சிஸ்டம் நேவிகேஷன் மாற்றப்பட்டது. மாற்றங்களைச் செய்ய ‘அமைப்புகளுக்குச்’ செல்லவும்."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"சிஸ்டம் நேவிகேஷனை மாற்ற ’அமைப்புகளுக்குச்’ செல்லவும்"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"இயக்க நேரம்"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"உரையாடல் பிரிவின் மேல் காட்டும்"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"பூட்டுத் திரையின் மேல் சுயவிவரப் படத்தைக் காட்டும்"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"ஆப்ஸின் மேல் மிதக்கும் குமிழாகத் தோன்றும்"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"\'தொந்தரவு செய்ய வேண்டாம்\' அம்சத்தைக் குறுக்கிடும்"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"சரி"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"Magnification Overlay Window"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"பெரிதாக்கல் சாளரம்"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"பெரிதாக்கல் சாளரக் கட்டுப்பாடுகள்"</string>
@@ -1016,10 +1025,8 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"கட்டுப்பாடுகள்"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"பவர் மெனுவில் இருந்து அணுகுவதற்கான கட்டுப்பாடுகளைத் தேர்ந்தெடுக்கலாம்"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"கட்டுப்பாடுகளை மறுவரிசைப்படுத்த அவற்றைப் பிடித்து இழுக்கவும்"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"கட்டுப்பாடுகள் அனைத்தும் அகற்றப்பட்டன"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"எல்லா கட்டுப்பாடுகளின் பட்டியலை ஏற்ற முடியவில்லை."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"பிற"</string>
     <string name="controls_dialog_title" msgid="2343565267424406202">"சாதனக் கட்டுப்பாடுகளில் சேர்த்தல்"</string>
diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml
index 2fd229d55..e747009 100644
--- a/packages/SystemUI/res/values-te/strings.xml
+++ b/packages/SystemUI/res/values-te/strings.xml
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"నిల్వ స్థలం పరిమితంగా ఉన్న కారణంగా స్క్రీన్‌షాట్‌ను సేవ్ చేయడం సాధ్యపడదు"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"స్క్రీన్‌షాట్‌లు తీయడానికి యాప్ లేదా మీ సంస్థ అనుమతించలేదు"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"స్క్రీన్‌షాట్‌ను మూసివేస్తుంది"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"స్క్రీన్‌షాట్‌ను తెరుస్తుంది"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"స్క్రీన్‌షాట్ ప్రివ్యూ"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"స్క్రీన్ రికార్డర్"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"స్క్రీన్ రికార్డ్ సెషన్ కోసం ఆన్‌గోయింగ్ నోటిఫికేషన్"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"రికార్డింగ్‌ను ప్రారంభించాలా?"</string>
@@ -362,7 +362,7 @@
     <string name="quick_settings_rotation_locked_portrait_label" msgid="1194988975270484482">"పోర్ట్రెయిట్"</string>
     <string name="quick_settings_rotation_locked_landscape_label" msgid="2000295772687238645">"ల్యాండ్‌స్కేప్"</string>
     <string name="quick_settings_ime_label" msgid="3351174938144332051">"ఇన్‌పుట్ పద్ధతి"</string>
-    <string name="quick_settings_location_label" msgid="2621868789013389163">"స్థానం"</string>
+    <string name="quick_settings_location_label" msgid="2621868789013389163">"లొకేషన్"</string>
     <string name="quick_settings_location_off_label" msgid="7923929131443915919">"స్థానం ఆఫ్‌లో ఉంది"</string>
     <string name="quick_settings_media_device_label" msgid="8034019242363789941">"ప్రసార మాధ్యమ పరికరం"</string>
     <string name="quick_settings_rssi_label" msgid="3397615415140356701">"RSSI"</string>
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"బబుల్"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"శబ్దం లేదా వైబ్రేషన్ లేకుండా దృష్టి కేంద్రీకరించడానికి మీకు సహాయపడుతుంది."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"శబ్దం లేదా వైబ్రేషన్‌తో మీరు దృష్టి సారించేలా చేస్తుంది."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"శబ్దం లేదా వైబ్రేషన్‌తో మీరు దృష్టి సారించేలా చేస్తుంది. <xliff:g id="APP_NAME">%1$s</xliff:g> నుండి సంభాషణలు డిఫాల్ట్‌గా బబుల్‌గా కనిపిస్తాయి."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"ఫ్లోటింగ్ షార్ట్‌కట్‌తో మీ దృష్టిని ఈ కంటెంట్‌పై నిలిపి ఉంచుతుంది."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"సంభాషణ విభాగానికి ఎగువున ఉంటుంది, బబుల్‌లాగా కనిపిస్తుంది."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> నుండి అన్ని సంభాషణలు డిఫాల్ట్‌గా బబుల్‌గా ఉంటాయి. <xliff:g id="APP_NAME_1">%2$s</xliff:g>లో మేనేజ్ చేయండి"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"సెట్టింగ్‌లు"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"ప్రాధాన్యత"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"ఇటీవలి బబుల్స్ ఏవీ లేవు"</string>
@@ -961,7 +961,7 @@
     <string name="qs_dnd_replace" msgid="7712119051407052689">"భర్తీ చేయి"</string>
     <string name="running_foreground_services_title" msgid="5137313173431186685">"నేపథ్యంలో అమలు అవుతున్న ఆప్‌లు"</string>
     <string name="running_foreground_services_msg" msgid="3009459259222695385">"బ్యాటరీ మరియు డేటా వినియోగ వివరాల కోసం నొక్కండి"</string>
-    <string name="mobile_data_disable_title" msgid="5366476131671617790">"మొబైల్ డేటాని ఆఫ్ చేయాలా?"</string>
+    <string name="mobile_data_disable_title" msgid="5366476131671617790">"మొబైల్ డేటాను ఆఫ్ చేయాలా?"</string>
     <string name="mobile_data_disable_message" msgid="8604966027899770415">"మీకు <xliff:g id="CARRIER">%s</xliff:g> ద్వారా డేటా లేదా ఇంటర్నెట్‌కు యాక్సెస్ ఉండదు. Wi-Fi ద్వారా మాత్రమే ఇంటర్నెట్ అందుబాటులో ఉంటుంది."</string>
     <string name="mobile_data_disable_message_default_carrier" msgid="6496033312431658238">"మీ క్యారియర్"</string>
     <string name="touch_filtered_warning" msgid="8119511393338714836">"అనుమతి అభ్యర్థనకు ఒక యాప్ అడ్డు తగులుతున్నందున సెట్టింగ్‌లు మీ ప్రతిస్పందనను ధృవీకరించలేకపోయాయి."</string>
@@ -999,15 +999,27 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"బబుల్స్‌ను ఎప్పుడైనా నియంత్రించండి"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"ఈ యాప్ నుండి వచ్చే బబుల్స్‌ను ఆఫ్ చేయడానికి మేనేజ్ బటన్‌ను ట్యాప్ చేయండి"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"అర్థమైంది"</string>
+    <!-- no translation found for bubbles_app_settings (5779443644062348657) -->
+    <skip />
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"సిస్టమ్ నావిగేషన్ అప్‌డేట్ చేయబడింది. మార్పులు చేయడానికి, సెట్టింగ్‌లకు వెళ్లండి."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"సిస్టమ్ నావిగేషన్‌ను అప్‌డేట్ చేయడానికి సెట్టింగ్‌లకు వెళ్లండి"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"స్టాండ్‌బై"</string>
+    <!-- no translation found for priority_onboarding_show_at_top_text (1678400241025513541) -->
+    <skip />
+    <!-- no translation found for priority_onboarding_show_avatar_text (5756291381124091508) -->
+    <skip />
+    <!-- no translation found for priority_onboarding_appear_as_bubble_text (4227039772250263122) -->
+    <skip />
+    <!-- no translation found for priority_onboarding_ignores_dnd_text (2918952762719600529) -->
+    <skip />
+    <!-- no translation found for priority_onboarding_done_button_title (4569550984286506007) -->
+    <skip />
     <string name="magnification_overlay_title" msgid="6584179429612427958">"మాగ్నిఫికేషన్ ఓవర్‌లే విండో"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"మాగ్నిఫికేషన్ విండో"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"మాగ్నిఫికేషన్ నియంత్రణల విండో"</string>
-    <string name="quick_controls_title" msgid="6839108006171302273">"పరికర నియంత్రణలు"</string>
+    <string name="quick_controls_title" msgid="6839108006171302273">"పరికరం నియంత్రణలు"</string>
     <string name="quick_controls_subtitle" msgid="1667408093326318053">"మీ కనెక్ట్ అయిన పరికరాలకు నియంత్రణలను జోడించండి"</string>
-    <string name="quick_controls_setup_title" msgid="8901436655997849822">"పరికర నియంత్రణలను సెటప్ చేయడం"</string>
+    <string name="quick_controls_setup_title" msgid="8901436655997849822">"పరికరం నియంత్రణలను సెటప్ చేయడం"</string>
     <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"మీ నియంత్రణలను యాక్సెస్ చేయడానికి పవర్ బటన్‌ను నొక్కి పట్టుకోండి"</string>
     <string name="controls_providers_title" msgid="6879775889857085056">"నియంత్రణలను యాడ్ చేయడానికి యాప్‌ను ఎంచుకోండి"</string>
     <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380">
@@ -1016,13 +1028,11 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"నియంత్రణలు"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"పవర్ మెనూ నుండి యాక్సెస్ చేయడానికి నియంత్రణలను ఎంచుకోండి"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"నియంత్రణల క్రమం మార్చడానికి పట్టుకుని&amp;amp, లాగండి"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"అన్ని నియంత్రణలు తీసివేయబడ్డాయి"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"అన్ని నియంత్రణలు గల జాబితాను లోడ్ చేయలేకపోయాము."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"ఇతరం"</string>
-    <string name="controls_dialog_title" msgid="2343565267424406202">"పరికర నియంత్రణలకు జోడించడం"</string>
+    <string name="controls_dialog_title" msgid="2343565267424406202">"పరికరం నియంత్రణలకు జోడించడం"</string>
     <string name="controls_dialog_ok" msgid="7011816381344485651">"ఇష్టమైనవాటికి జోడించు"</string>
     <string name="controls_dialog_message" msgid="6292099631702047540">"మీ ఇష్టమైనవాటికి జోడించడానికి <xliff:g id="APP">%s</xliff:g> ఈ కంట్రోల్‌ను సూచించింది."</string>
     <string name="controls_dialog_confirmation" msgid="586517302736263447">"నియంత్రణలు అప్‌డేట్ అయ్యాయి"</string>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index 1604d15..bde22a5 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"บันทึกภาพหน้าจอไม่ได้เนื่องจากพื้นที่เก็บข้อมูลมีจำกัด"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"แอปหรือองค์กรของคุณไม่อนุญาตให้จับภาพหน้าจอ"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"ปิดภาพหน้าจอ"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"เปิดภาพหน้าจอ"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"ตัวอย่างภาพหน้าจอ"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"โปรแกรมอัดหน้าจอ"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"การแจ้งเตือนต่อเนื่องสำหรับเซสชันการบันทึกหน้าจอ"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"เริ่มบันทึกเลยไหม"</string>
@@ -352,7 +352,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"เสียง"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"ชุดหูฟัง"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="3887552721233148132">"อินพุต"</string>
-    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="3003338571871392293">"เครื่องช่วยการได้ยิน"</string>
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="3003338571871392293">"เครื่องช่วยฟัง"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="3882884317600669650">"กำลังเปิด..."</string>
     <string name="quick_settings_brightness_label" msgid="680259653088849563">"ความสว่าง"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="2359922767950346112">"หมุนอัตโนมัติ"</string>
@@ -397,7 +397,7 @@
     <string name="quick_settings_tethering_label" msgid="5257299852322475780">"การปล่อยสัญญาณ"</string>
     <string name="quick_settings_hotspot_label" msgid="1199196300038363424">"ฮอตสปอต"</string>
     <string name="quick_settings_hotspot_secondary_label_transient" msgid="7585604088079160564">"กำลังเปิด..."</string>
-    <string name="quick_settings_hotspot_secondary_label_data_saver_enabled" msgid="1280433136266439372">"เปิดประหยัดเน็ตอยู่"</string>
+    <string name="quick_settings_hotspot_secondary_label_data_saver_enabled" msgid="1280433136266439372">"เปิดการประหยัดเน็ตอยู่"</string>
     <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="3142308865165871976">
       <item quantity="other">อุปกรณ์ %d เครื่อง</item>
       <item quantity="one">อุปกรณ์ %d เครื่อง</item>
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"บับเบิล"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"ช่วยรักษาสมาธิของคุณด้วยการไม่ส่งเสียงหรือสั่น"</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"ดึงความสนใจของคุณด้วยเสียงและการสั่น"</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"ดึงความสนใจของคุณด้วยเสียงและการสั่น การสนทนาจาก <xliff:g id="APP_NAME">%1$s</xliff:g> จะแสดงเป็นบับเบิลโดยค่าเริ่มต้น"</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"ดึงดูดความสนใจของคุณไว้เสมอด้วยทางลัดแบบลอยที่มายังเนื้อหานี้"</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"แสดงที่ด้านบนของส่วนการสนทนาและปรากฏเป็นบับเบิล"</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"การสนทนาทั้งหมดจากบับเบิล <xliff:g id="APP_NAME_0">%1$s</xliff:g> โดยค่าเริ่มต้น จัดการใน<xliff:g id="APP_NAME_1">%2$s</xliff:g>"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"การตั้งค่า"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"ลำดับความสำคัญ"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"ไม่มีบับเบิลเมื่อเร็วๆ นี้"</string>
@@ -847,8 +847,8 @@
     <string name="right_keycode" msgid="2480715509844798438">"Keycode ทางขวา"</string>
     <string name="left_icon" msgid="5036278531966897006">"ไอคอนทางซ้าย"</string>
     <string name="right_icon" msgid="1103955040645237425">"ไอคอนทางขวา"</string>
-    <string name="drag_to_add_tiles" msgid="8933270127508303672">"กดค้างแล้วลากเพื่อเพิ่มชิ้นส่วน"</string>
-    <string name="drag_to_rearrange_tiles" msgid="2143204300089638620">"กดไทล์ค้างไว้แล้วลากเพื่อจัดเรียงใหม่"</string>
+    <string name="drag_to_add_tiles" msgid="8933270127508303672">"กดค้างแล้วลากเพื่อเพิ่มการ์ด"</string>
+    <string name="drag_to_rearrange_tiles" msgid="2143204300089638620">"กดการ์ดค้างไว้แล้วลากเพื่อจัดเรียงใหม่"</string>
     <string name="drag_to_remove_tiles" msgid="4682194717573850385">"ลากมาที่นี่เพื่อนำออก"</string>
     <string name="drag_to_remove_disabled" msgid="933046987838658850">"คุณต้องมีการ์ดอย่างน้อย <xliff:g id="MIN_NUM_TILES">%1$d</xliff:g> รายการ"</string>
     <string name="qs_edit" msgid="5583565172803472437">"แก้ไข"</string>
@@ -999,15 +999,22 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"ควบคุมบับเบิลได้ทุกเมื่อ"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"แตะ \"จัดการ\" เพื่อปิดบับเบิลจากแอปนี้"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"รับทราบ"</string>
+    <!-- no translation found for bubbles_app_settings (5779443644062348657) -->
+    <skip />
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"อัปเดตการไปยังส่วนต่างๆ ของระบบแล้ว หากต้องการเปลี่ยนแปลง ให้ไปที่การตั้งค่า"</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"ไปที่การตั้งค่าเพื่ออัปเดตการไปยังส่วนต่างๆ ของระบบ"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"สแตนด์บาย"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"แสดงที่ด้านบนของส่วนการสนทนา"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"แสดงรูปโปรไฟล์บนหน้าจอล็อก"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"แสดงเป็นบับเบิลที่ลอยอยู่เหนือแอป"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"แสดงในโหมดห้ามรบกวน"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"รับทราบ"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"หน้าต่างการขยายที่วางซ้อน"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"หน้าต่างการขยาย"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"การควบคุมหน้าต่างการขยาย"</string>
-    <string name="quick_controls_title" msgid="6839108006171302273">"การควบคุมอุปกรณ์"</string>
+    <string name="quick_controls_title" msgid="6839108006171302273">"ระบบควบคุมอุปกรณ์"</string>
     <string name="quick_controls_subtitle" msgid="1667408093326318053">"เพิ่มตัวควบคุมของอุปกรณ์ที่เชื่อมต่อ"</string>
-    <string name="quick_controls_setup_title" msgid="8901436655997849822">"ตั้งค่าการควบคุมอุปกรณ์"</string>
+    <string name="quick_controls_setup_title" msgid="8901436655997849822">"ตั้งค่าระบบควบคุมอุปกรณ์"</string>
     <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"กดปุ่มเปิด/ปิดค้างไว้เพื่อเข้าถึงการควบคุม"</string>
     <string name="controls_providers_title" msgid="6879775889857085056">"เลือกแอปเพื่อเพิ่มตัวควบคุม"</string>
     <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380">
@@ -1016,13 +1023,11 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"การควบคุม"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"เลือกตัวควบคุมที่ต้องการให้เข้าถึงได้จากเมนูเปิด/ปิด"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"กดตัวควบคุมค้างไว้แล้วลากเพื่อจัดเรียงใหม่"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"นำตัวควบคุมทั้งหมดออกแล้ว"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"โหลดรายการตัวควบคุมทั้งหมดไม่ได้"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"อื่นๆ"</string>
-    <string name="controls_dialog_title" msgid="2343565267424406202">"เพิ่มไปยังการควบคุมอุปกรณ์"</string>
+    <string name="controls_dialog_title" msgid="2343565267424406202">"เพิ่มไปยังระบบควบคุมอุปกรณ์"</string>
     <string name="controls_dialog_ok" msgid="7011816381344485651">"เพิ่มในรายการโปรด"</string>
     <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> แนะนำให้เพิ่มการควบคุมนี้ในรายการโปรด"</string>
     <string name="controls_dialog_confirmation" msgid="586517302736263447">"อัปเดตตัวควบคุมแล้ว"</string>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index d5c2099..cafaaac 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"Hindi ma-save ang screenshot dahil sa limitadong espasyo ng storage"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Hindi pinahihintulutan ng app o ng iyong organisasyon ang pagkuha ng mga screenshot"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"I-dismiss ang screenshot"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"Buksan ang screenshot"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"Preview ng screenshot"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"Recorder ng Screen"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Kasalukuyang notification para sa session ng pag-record ng screen"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"Simulang Mag-record?"</string>
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"Bubble"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"Nakakatulong sa iyong tumuon nang walang tunog o pag-vibrate."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"Kinukuha ang iyong atensyon sa pamamagitan ng tunog o pag-vibrate."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"Kinukuha ang iyong atensyon sa pamamagitan ng tunog o pag-vibrate. Mga pag-uusap mula sa <xliff:g id="APP_NAME">%1$s</xliff:g> bubble bilang default."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Pinapanatili ang iyong atensyon sa pamamagitan ng lumulutang na shortcut sa content na ito."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Lumalabas sa itaas ng seksyon ng pag-uusap at nagpapakita bilang bubble."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"Lumalabas bilang bubble ang mga pag-uusap sa <xliff:g id="APP_NAME_0">%1$s</xliff:g> bilang default. Pamahalaan sa <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Mga Setting"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Priyoridad"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Walang kamakailang bubble"</string>
@@ -999,9 +999,16 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Kontrolin ang mga bubble anumang oras"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"I-tap ang Pamahalaan para i-off ang mga bubble mula sa app na ito"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"OK"</string>
+    <!-- no translation found for bubbles_app_settings (5779443644062348657) -->
+    <skip />
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Na-update na ang pag-navigate ng system. Para gumawa ng mga pagbabago, pumunta sa Mga Setting."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Pumunta sa Mga Setting para i-update ang pag-navigate sa system"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Naka-standby"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Ipakita sa itaas ng seksyon ng pag-uusap"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Ipakita ang larawan sa profile sa lock screen"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Ipakitang floating bubble sa ibabaw ng mga app"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Ihinto ang Huwag Istorbohin"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"OK"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"Window ng Overlay sa Pag-magnify"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"Window ng Pag-magnify"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"Mga Kontrol sa Pag-magnify ng Window"</string>
@@ -1016,10 +1023,8 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"Mga Kontrol"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Pumili ng mga kontrol na maa-access mula sa power menu"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"I-hold at i-drag para baguhin ang pagkakaayos ng mga kontrol"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"Inalis ang lahat ng kontrol"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"Hindi ma-load ang listahan ng lahat ng control."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Iba pa"</string>
     <string name="controls_dialog_title" msgid="2343565267424406202">"Idagdag sa mga kontrol ng device"</string>
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index 5f5968ec6..c9d5335 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"Depolama alanı sınırlı olduğundan ekran görüntüsü kaydedilemiyor"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Uygulama veya kuruluşunuz, ekran görüntüsü alınmasına izin vermiyor."</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Ekran görüntüsünü kapat"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"Ekran görüntüsünü aç"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"Ekran görüntüsü önizlemesi"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"Ekran Kaydedicisi"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Ekran kaydı oturumu için devam eden bildirim"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"Kayıt Başlatılsın mı?"</string>
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"Baloncuk"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"Ses veya titreşim olmadan odaklanmanıza yardımcı olur."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"Ses veya titreşimle dikkatinizi çeker."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"Ses veya titreşimle dikkatinizi çeker. <xliff:g id="APP_NAME">%1$s</xliff:g> adlı uygulamadan görüşmeler varsayılan olarak baloncukla gösterilir."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Kayan kısayolla dikkatinizi bu içerik üzerinde tutar."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Görüşme bölümünün üstünde baloncuk olarak gösterilir."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> adlı uygulamadan tüm görüşmeler varsayılan olarak baloncukla gösterilir. <xliff:g id="APP_NAME_1">%2$s</xliff:g> uygulamasında yönet."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Ayarlar"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Öncelik"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Son kapatılan baloncuk yok"</string>
@@ -999,15 +999,22 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Baloncukları istediğiniz zaman kontrol edin"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Bu uygulamanın baloncuklarını kapatmak için Yönet\'e dokunun"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Anladım"</string>
+    <!-- no translation found for bubbles_app_settings (5779443644062348657) -->
+    <skip />
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Sistemde gezinme yöntemi güncellendi. Değişiklik yapmak için Ayarlar\'a gidin."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Sistemde gezinme yöntemini güncellemek için Ayarlar\'a gidin"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Beklemeye alınıyor"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Görüşme bölümünün üstünde gösterilir"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Kilit ekranında profil resmi gösterilir"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Uygulamaların üzerinde kayan balon olarak görünür"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Rahatsız Etmeyin\'i keser"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Anladım"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"Yer Paylaşımlı Büyütme Penceresi"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"Büyütme Penceresi"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"Büyütme Penceresi Kontrolleri"</string>
-    <string name="quick_controls_title" msgid="6839108006171302273">"Cihaz kontrolleri"</string>
+    <string name="quick_controls_title" msgid="6839108006171302273">"Cihaz denetimleri"</string>
     <string name="quick_controls_subtitle" msgid="1667408093326318053">"Bağlı cihazlarınız için denetimler ekleyin"</string>
-    <string name="quick_controls_setup_title" msgid="8901436655997849822">"Cihaz kontrollerini kur"</string>
+    <string name="quick_controls_setup_title" msgid="8901436655997849822">"Cihaz denetimlerini kur"</string>
     <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"Denetimlerinize erişmek için Güç düğmesini basılı tutun"</string>
     <string name="controls_providers_title" msgid="6879775889857085056">"Denetim eklemek için uygulama seçin"</string>
     <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380">
@@ -1020,7 +1027,7 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"Tüm kontroller kaldırıldı"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"Tüm kontrollerin listesi yüklenemedi."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Diğer"</string>
-    <string name="controls_dialog_title" msgid="2343565267424406202">"Cihaz kontrollerine ekle"</string>
+    <string name="controls_dialog_title" msgid="2343565267424406202">"Cihaz denetimlerine ekle"</string>
     <string name="controls_dialog_ok" msgid="7011816381344485651">"Favorilere ekle"</string>
     <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g>, bu kontrolü favorilerinize eklemenizi önerdi."</string>
     <string name="controls_dialog_confirmation" msgid="586517302736263447">"Denetimler güncellendi"</string>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index 15658f3..00e9d58 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"Не вдалося зберегти знімок екрана через обмежений обсяг пам’яті"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Додаток або адміністратор вашої організації не дозволяють робити знімки екрана"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Закрити знімок екрана"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"Відкрити знімок екрана"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"Перегляд знімка екрана"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"Створення знімків екрана"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Сповіщення про сеанс запису екрана"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"Почати запис?"</string>
@@ -713,9 +713,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"Спливаюче сповіщення"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"Не відволікає увагу звуковим сигналом або вібрацією."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"Привертає увагу звуковим сигналом або вібрацією."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"Привертає увагу звуковим сигналом або вібрацією. Показує спливаючі чати з додатка <xliff:g id="APP_NAME">%1$s</xliff:g> за умовчанням."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Привертає увагу до контенту плаваючим ярликом."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"З\'являється вгорі розділу з розмовами у вигляді спливаючого чату."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"Усі чати з додатка <xliff:g id="APP_NAME_0">%1$s</xliff:g> за умовчанням з\'являються у вигляді спливаючих сповіщень. Налаштувати їх можна в додатку <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Налаштування"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Пріоритет"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Немає нещодавніх спливаючих чатів"</string>
@@ -971,7 +971,7 @@
     <string name="qs_dnd_replace" msgid="7712119051407052689">"Замінити"</string>
     <string name="running_foreground_services_title" msgid="5137313173431186685">"Додатки, які працюють у фоновому режимі"</string>
     <string name="running_foreground_services_msg" msgid="3009459259222695385">"Торкніться, щоб перевірити використання акумулятора й трафік"</string>
-    <string name="mobile_data_disable_title" msgid="5366476131671617790">"Вимкнути мобільне передавання даних?"</string>
+    <string name="mobile_data_disable_title" msgid="5366476131671617790">"Вимкнути мобільний Інтернет?"</string>
     <string name="mobile_data_disable_message" msgid="8604966027899770415">"Ви не матимете доступу до даних чи Інтернету через оператора <xliff:g id="CARRIER">%s</xliff:g>. Інтернет буде доступний лише через Wi-Fi."</string>
     <string name="mobile_data_disable_message_default_carrier" msgid="6496033312431658238">"ваш оператор"</string>
     <string name="touch_filtered_warning" msgid="8119511393338714836">"Не вдається підтвердити вашу відповідь у налаштуваннях, оскільки інший додаток заступає запит на дозвіл."</string>
@@ -1009,15 +1009,22 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Налаштовуйте спливаючі чати будь-коли"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Натисніть \"Налаштувати\", щоб вимкнути спливаючі чати від цього додатка"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Зрозуміло"</string>
+    <!-- no translation found for bubbles_app_settings (5779443644062348657) -->
+    <skip />
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Навігацію в системі оновлено. Щоб внести зміни, перейдіть у налаштування."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Перейдіть у налаштування, щоб оновити навігацію в системі"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Режим очікування"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"З\'являються вгорі розділу розмов"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Показують фото профілю на заблокованому екрані"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"З\'являються як спливаючі чати поверх додатків"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Переривають режим \"Не турбувати\""</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"OK"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"Вікно збільшення з накладанням"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"Вікно збільшення"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"Елементи керування вікна збільшення"</string>
-    <string name="quick_controls_title" msgid="6839108006171302273">"Елементи керування пристроєм"</string>
+    <string name="quick_controls_title" msgid="6839108006171302273">"Елементи керування пристроями"</string>
     <string name="quick_controls_subtitle" msgid="1667408093326318053">"Додайте елементи керування для підключених пристроїв"</string>
-    <string name="quick_controls_setup_title" msgid="8901436655997849822">"Налаштувати елементи керування пристроєм"</string>
+    <string name="quick_controls_setup_title" msgid="8901436655997849822">"Налаштувати елементи керування пристроями"</string>
     <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"Щоб відкрити елементи керування, утримуйте кнопку живлення"</string>
     <string name="controls_providers_title" msgid="6879775889857085056">"Виберіть, для якого додатка налаштувати елементи керування"</string>
     <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380">
@@ -1028,13 +1035,11 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"Елементи керування"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Виберіть, які елементи керування будуть у меню \"Живлення\""</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Щоб змінити порядок елементів керування, перетягуйте їх"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"Усі елементи керування вилучено"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"Не вдалося завантажити список усіх елементів керування."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Інше"</string>
-    <string name="controls_dialog_title" msgid="2343565267424406202">"Додати до елементів керування пристроєм"</string>
+    <string name="controls_dialog_title" msgid="2343565267424406202">"Додати до елементів керування пристроями"</string>
     <string name="controls_dialog_ok" msgid="7011816381344485651">"Додати у вибране"</string>
     <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> пропонує додати цей елемент керування у вибране."</string>
     <string name="controls_dialog_confirmation" msgid="586517302736263447">"Елементи керування оновлено"</string>
diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml
index 08a400f..6cc8dd3 100644
--- a/packages/SystemUI/res/values-ur/strings.xml
+++ b/packages/SystemUI/res/values-ur/strings.xml
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"اسٹوریج کی محدود جگہ کی وجہ سے اسکرین شاٹ کو محفوظ نہیں کیا جا سکتا"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"ایپ یا آپ کی تنظیم کی جانب سے اسکرین شاٹس لینے کی اجازت نہیں ہے"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"اسکرین شاٹ برخاست کریں"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"اسکرین شاٹ کھولیں"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"اسکرین شاٹ کا پیش منظر"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"سکرین ریکارڈر"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"اسکرین ریکارڈ سیشن کیلئے جاری اطلاع"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"ریکارڈنگ شروع کریں؟"</string>
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"بلبلہ"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"بغیر آواز یا وائبریشن کے آپ کو فوکس کرنے میں مدد کرتا ہے۔"</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"آواز اور وائبریشن کے ذریعے آپ کی توجہ حاصل کرتا ہے۔"</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"آواز اور وائبریشن کے ذریعے آپ کی توجہ حاصل کرتا ہے۔ بذریعہ ڈیفالٹ <xliff:g id="APP_NAME">%1$s</xliff:g> بلبلہ سے گفتگوئیں."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"اس مواد کے فلوٹنگ شارٹ کٹ کے ساتھ آپ کی توجہ دیتی ہے۔"</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"گفتگو کے سیکشن میں سب سے اوپر دکھاتا ہے اور بلبلہ کے طور پر ظاہر ہوتا ہے۔"</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"سبھی گفتگوئیں <xliff:g id="APP_NAME_0">%1$s</xliff:g> بلبلہ سے بذریعہ ڈیفالٹ۔ <xliff:g id="APP_NAME_1">%2$s</xliff:g> میں نظم کریں۔"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ترتیبات"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"ترجیح"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"کوئی حالیہ بلبلہ نہیں"</string>
@@ -999,9 +999,21 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"کسی بھی وقت بلبلے کو کنٹرول کریں"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"اس ایپ سے بلبلوں کو آف کرنے کے لیے نظم کریں پر تھپتھپائیں"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"سمجھ آ گئی"</string>
+    <!-- no translation found for bubbles_app_settings (5779443644062348657) -->
+    <skip />
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"سسٹم نیویگیشن اپ ڈیٹ کیا گیا۔ تبدیلیاں کرنے کے لیے، ترتیبات پر جائیں۔"</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"سسٹم نیویگیشن اپ ڈیٹ کرنے کے لیے ترتیبات پر جائیں"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"اسٹینڈ بائی"</string>
+    <!-- no translation found for priority_onboarding_show_at_top_text (1678400241025513541) -->
+    <skip />
+    <!-- no translation found for priority_onboarding_show_avatar_text (5756291381124091508) -->
+    <skip />
+    <!-- no translation found for priority_onboarding_appear_as_bubble_text (4227039772250263122) -->
+    <skip />
+    <!-- no translation found for priority_onboarding_ignores_dnd_text (2918952762719600529) -->
+    <skip />
+    <!-- no translation found for priority_onboarding_done_button_title (4569550984286506007) -->
+    <skip />
     <string name="magnification_overlay_title" msgid="6584179429612427958">"میگنیفیکیشن اوورلے ونڈو"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"میگنیفکیشن ونڈو"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"میگنیفکیشن ونڈو کنٹرولز"</string>
@@ -1016,10 +1028,8 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"کنٹرولز"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"پاور مینو سے رسائی حاصل کرنے کے لیے کنٹرولز کو منتخب کریں"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"کنٹرولز کو دوبارہ ترتیب دینے کے ليے پکڑیں اور گھسیٹیں"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"سبھی کنٹرولز ہٹا دیے گئے"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"تمام کنٹرولز کی فہرست لوڈ نہیں کی جا سکی۔"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"دیگر"</string>
     <string name="controls_dialog_title" msgid="2343565267424406202">"آلہ کے کنٹرولز میں شامل کریں"</string>
diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml
index de26560..43099f4 100644
--- a/packages/SystemUI/res/values-uz/strings.xml
+++ b/packages/SystemUI/res/values-uz/strings.xml
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"Xotirada joy kamligi uchun skrinshot saqlanmadi"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Ilova yoki tashkilotingiz skrinshot olishni taqiqlagan"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Skrinshotni yopish"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"Skrinshotni ochish"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"Skrinshotga razm solish"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"Ekrandan yozib olish"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Ekrandan yozib olish seansi uchun joriy bildirishnoma"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"Yozib olish boshlansinmi?"</string>
@@ -582,7 +582,7 @@
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"Tovush sozlamalari"</string>
     <string name="accessibility_volume_expand" msgid="7653070939304433603">"Yoyish"</string>
     <string name="accessibility_volume_collapse" msgid="2746845391013829996">"Yig‘ish"</string>
-    <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Avtomatik taglavha mediasi"</string>
+    <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Avtomatik taglavha yaratish"</string>
     <string name="accessibility_volume_close_odi_captions_tip" msgid="8924753283621160480">"Taglavhalar maslahatini yopish"</string>
     <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Taglavhalarni chiqarish"</string>
     <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"faollashtirish"</string>
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"Pufaklar"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"Bildirishnomalar tovush va tebranishsiz keladi."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"Bildirishnomalar tovush va tebranish bilan keladi."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"Bildirishnomalar tovush va tebranish bilan keladi. <xliff:g id="APP_NAME">%1$s</xliff:g> suhbatlari standart holatda bulutcha shaklida chiqadi."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Bu kontentni ochuvchi erkin yorliq diqqatingizda boʻladi."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Suhbatlar boʻlimining yuqori qismida bulutcha shaklida chiqadi."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"Barcha <xliff:g id="APP_NAME_0">%1$s</xliff:g> xabarlari bulutcha shaklida chiqadi. Sozlamalarni <xliff:g id="APP_NAME_1">%2$s</xliff:g> orqali oʻzgartirish mumkin."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Sozlamalar"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Muhimligi"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Avvalgi bulutchalar topilmadi"</string>
@@ -999,9 +999,15 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Bulutcha shaklidagi bildirishnomalarni sozlash"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Bu ilova bulutchalarini faolsizlantirish uchun Boshqarish tugmasini bosing"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"OK"</string>
+    <string name="bubbles_app_settings" msgid="5779443644062348657">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> sozlamalari"</string>
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Tizim navigatsiyasi yangilandi. Buni Sozlamalar orqali oʻzgartirishingiz mumkin."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Tizim navigatsiyasini yangilash uchun Sozlamalarni oching"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Kutib turing"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Suhbatlar qismining tepasida koʻrsatish"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Ekran qulfida profil rasmini koʻrsatish"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Ilovalar ustida bulutchali xabar sifatida chiqadi"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"“Bezovta qilinmasin” rejimida koʻrsatish"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"OK"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"Kattalashtirish oynasining ustidan ochilishi"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"Kattalashtirish oynasi"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"Kattalashtirish oynasi sozlamalari"</string>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index b12ea2f..c0996af8 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"Không thể lưu ảnh chụp màn hình do giới hạn dung lượng bộ nhớ"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Ứng dụng hoặc tổ chức của bạn không cho phép chụp ảnh màn hình"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Đóng ảnh chụp màn hình"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"Mở ảnh chụp màn hình"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"Xem trước ảnh chụp màn hình"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"Trình ghi màn hình"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Thông báo đang diễn ra về phiên ghi màn hình"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"Bắt đầu ghi?"</string>
@@ -388,7 +388,7 @@
     <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Độ sáng"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="2325362583903258677">"TỰ ĐỘNG"</string>
     <string name="quick_settings_inversion_label" msgid="5078769633069667698">"Đảo ngược màu"</string>
-    <string name="quick_settings_color_space_label" msgid="537528291083575559">"Chế độ hiệu chỉnh màu sắc"</string>
+    <string name="quick_settings_color_space_label" msgid="537528291083575559">"Chế độ chỉnh màu"</string>
     <string name="quick_settings_more_settings" msgid="2878235926753776694">"Cài đặt khác"</string>
     <string name="quick_settings_done" msgid="2163641301648855793">"Xong"</string>
     <string name="quick_settings_connected" msgid="3873605509184830379">"Đã kết nối"</string>
@@ -508,7 +508,7 @@
     <string name="manage_notifications_text" msgid="6885645344647733116">"Quản lý"</string>
     <string name="manage_notifications_history_text" msgid="57055985396576230">"Lịch sử"</string>
     <string name="notification_section_header_gentle" msgid="3044910806569985386">"Thông báo im lặng"</string>
-    <string name="notification_section_header_alerting" msgid="3168140660646863240">"Thông báo bằng chế độ rung hoặc âm thanh"</string>
+    <string name="notification_section_header_alerting" msgid="3168140660646863240">"Thông báo cảnh báo"</string>
     <string name="notification_section_header_conversations" msgid="821834744538345661">"Cuộc trò chuyện"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Xóa tất cả thông báo im lặng"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Chế độ Không làm phiền đã tạm dừng thông báo"</string>
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"Bong bóng"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"Giúp bạn tập trung bằng cách tắt tiếng hoặc không rung."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"Thu hút sự chú ý của bạn bằng cách bật tiếng hoặc rung."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"Thu hút sự chú ý của bạn bằng cách bật tiếng hoặc rung. Theo mặc định, các cuộc trò chuyện từ <xliff:g id="APP_NAME">%1$s</xliff:g> được phép hiển thị dưới dạng bong bóng."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Luôn chú ý vào nội dung này bằng phím tắt nổi."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Hiển thị dưới dạng bong bóng ở đầu cuộc trò chuyện."</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"Theo mặc định, tất cả các cuộc trò chuyện từ ứng dụng <xliff:g id="APP_NAME_0">%1$s</xliff:g> được phép hiển thị dưới dạng bong bóng. Quản lý trong phần <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Cài đặt"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Mức độ ưu tiên"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Không có bong bóng trò chuyện nào gần đây"</string>
@@ -999,9 +999,16 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Kiểm soát tùy chọn cài đặt bong bóng trò chuyện bất mọi lúc"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Nhấn vào nút Quản lý để tắt bong bóng trò chuyện từ ứng dụng này"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"OK"</string>
+    <!-- no translation found for bubbles_app_settings (5779443644062348657) -->
+    <skip />
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Đã cập nhật chế độ di chuyển trên hệ thống. Để thay đổi, hãy chuyển đến phần Cài đặt."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Chuyển đến phần Cài đặt để cập nhật chế độ di chuyển trên hệ thống"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Chế độ chờ"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Hiển thị ở đầu phần cuộc trò chuyện"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Hiển thị ảnh hồ sơ trên màn hình khóa"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Hiện ở dạng bong bóng nổi ở trên cùng của ứng dụng"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Làm gián đoạn chế độ Không làm phiền"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"OK"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"Cửa sổ lớp phủ phóng to"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"Cửa sổ phóng to"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"Các tùy chọn điều khiển cửa sổ phóng to"</string>
@@ -1016,10 +1023,8 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"Các tùy chọn điều khiển"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Chọn các tùy chọn điều khiển để truy cập từ trình đơn nguồn"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Giữ và kéo để sắp xếp lại các tùy chọn điều khiển"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"Đã xóa tất cả tùy chọn điều khiển"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"Không thể tải danh sách tất cả tùy chọn điều khiển."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Khác"</string>
     <string name="controls_dialog_title" msgid="2343565267424406202">"Thêm vào mục điều khiển thiết bị"</string>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index b3c513d..fba35b2 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"由于存储空间有限,无法保存屏幕截图"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"此应用或您所在的单位不允许进行屏幕截图"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"关闭屏幕截图"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"打开屏幕截图"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"屏幕截图预览"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"屏幕录制器"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"持续显示屏幕录制会话通知"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"要开始录制吗?"</string>
@@ -100,7 +100,7 @@
     <string name="screenrecord_start" msgid="330991441575775004">"开始"</string>
     <string name="screenrecord_ongoing_screen_only" msgid="4459670242451527727">"正在录制屏幕"</string>
     <string name="screenrecord_ongoing_screen_and_audio" msgid="5351133763125180920">"正在录制屏幕和音频"</string>
-    <string name="screenrecord_taps_label" msgid="1595690528298857649">"在屏幕上显示轻触位置"</string>
+    <string name="screenrecord_taps_label" msgid="1595690528298857649">"显示触屏位置"</string>
     <string name="screenrecord_stop_text" msgid="6549288689506057686">"点按即可停止"</string>
     <string name="screenrecord_stop_label" msgid="72699670052087989">"停止"</string>
     <string name="screenrecord_pause_label" msgid="6004054907104549857">"暂停"</string>
@@ -348,7 +348,7 @@
     <string name="quick_settings_bluetooth_multiple_devices_label" msgid="6595808498429809855">"蓝牙(<xliff:g id="NUMBER">%d</xliff:g> 台设备)"</string>
     <string name="quick_settings_bluetooth_off_label" msgid="6375098046500790870">"蓝牙:关闭"</string>
     <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"没有可用的配对设备"</string>
-    <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"电池电量:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string>
+    <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> 的电量"</string>
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"音频"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"耳机"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="3887552721233148132">"输入"</string>
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"气泡"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"不会发出提示音或振动,可帮助您保持专注。"</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"通过提示音或振动吸引您的注意。"</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"通过提示音或振动吸引您的注意。默认情况下,来自<xliff:g id="APP_NAME">%1$s</xliff:g>的对话会以对话泡的形式显示。"</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"通过可链接到这项内容的浮动快捷方式吸引您的注意。"</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"以对话泡形式显示在对话部分顶部。"</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"默认情况下,<xliff:g id="APP_NAME_0">%1$s</xliff:g>中的所有对话都会以对话泡形式显示。在“<xliff:g id="APP_NAME_1">%2$s</xliff:g>”中管理。"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"设置"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"优先级"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"最近没有对话泡"</string>
@@ -999,15 +999,22 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"随时控制对话泡"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"点按“管理”按钮,可关闭来自此应用的对话泡"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"知道了"</string>
+    <!-- no translation found for bubbles_app_settings (5779443644062348657) -->
+    <skip />
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"系统导航已更新。要进行更改,请转到“设置”。"</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"转到“设置”即可更新系统导航"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"待机"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"显示在对话部分顶部"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"在锁定屏幕上显示个人资料照片"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"以悬浮对话泡的形式显示在应用之上"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"中断“勿扰”模式"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"知道了"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"放大叠加窗口"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"放大窗口"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"放大窗口控件"</string>
-    <string name="quick_controls_title" msgid="6839108006171302273">"设备控件"</string>
+    <string name="quick_controls_title" msgid="6839108006171302273">"设备控制器"</string>
     <string name="quick_controls_subtitle" msgid="1667408093326318053">"为您所连接的设备添加控件"</string>
-    <string name="quick_controls_setup_title" msgid="8901436655997849822">"设置设备控件"</string>
+    <string name="quick_controls_setup_title" msgid="8901436655997849822">"设置设备控制器"</string>
     <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"按住电源按钮即可访问您的控件"</string>
     <string name="controls_providers_title" msgid="6879775889857085056">"选择应用以添加控件"</string>
     <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380">
@@ -1016,13 +1023,11 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"控件"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"选择要从电源菜单访问的控件"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"按住并拖动即可重新排列控件"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"已移除所有控件"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"无法加载所有控件的列表。"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"其他"</string>
-    <string name="controls_dialog_title" msgid="2343565267424406202">"添加到设备控件"</string>
+    <string name="controls_dialog_title" msgid="2343565267424406202">"添加到设备控制器"</string>
     <string name="controls_dialog_ok" msgid="7011816381344485651">"添加到收藏夹"</string>
     <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g>建议将此控件添加到您的收藏夹。"</string>
     <string name="controls_dialog_confirmation" msgid="586517302736263447">"控件已更新"</string>
diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml
index 69a8da6d..3c06542 100644
--- a/packages/SystemUI/res/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res/values-zh-rHK/strings.xml
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"由於儲存空間有限,因此無法儲存螢幕擷取畫面"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"應用程式或您的機構不允許擷取螢幕畫面"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"關閉螢幕截圖"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"開啟螢幕截圖"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"螢幕截圖預覽"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"螢幕畫面錄影工具"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"持續顯示錄影畫面工作階段通知"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"要開始錄影嗎?"</string>
@@ -471,7 +471,7 @@
     <string name="accessibility_multi_user_switch_switcher_with_current" msgid="5759855008166759399">"切換使用者,目前使用者是<xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string>
     <string name="accessibility_multi_user_switch_inactive" msgid="383168614528618402">"目前的使用者是 <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string>
     <string name="accessibility_multi_user_switch_quick_contact" msgid="4504508915324898576">"顯示個人檔案"</string>
-    <string name="user_add_user" msgid="4336657383006913022">"新增使用者"</string>
+    <string name="user_add_user" msgid="4336657383006913022">"加入使用者"</string>
     <string name="user_new_user_name" msgid="2019166282704195789">"新使用者"</string>
     <string name="guest_exit_guest_dialog_title" msgid="5015697561580641422">"移除訪客?"</string>
     <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"這個工作階段中的所有應用程式和資料都會被刪除。"</string>
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"氣泡"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"助您保持專注,不會發出聲音或震動。"</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"發出聲音或震動來吸引您的注意。"</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"發出聲音或震動來吸引您的注意。「<xliff:g id="APP_NAME">%1$s</xliff:g>」的對話會預設以小視窗顯示。"</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"為此內容建立浮動捷徑以保持注意力。"</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"在對話部分的頂部以小視窗顯示。"</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"根據預設,透過小視窗顯示所有「<xliff:g id="APP_NAME_0">%1$s</xliff:g>」的對話。在「<xliff:g id="APP_NAME_1">%2$s</xliff:g>」中管理。"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"設定"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"重要"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"沒有最近曾使用的小視窗"</string>
@@ -742,7 +742,7 @@
     <string name="notification_conversation_unmute" msgid="2692255619510896710">"發出提醒"</string>
     <string name="notification_conversation_bubble" msgid="2242180995373949022">"以小視窗顯示"</string>
     <string name="notification_conversation_unbubble" msgid="6908427185031099868">"移除小視窗"</string>
-    <string name="notification_conversation_home_screen" msgid="8347136037958438935">"加入主畫面"</string>
+    <string name="notification_conversation_home_screen" msgid="8347136037958438935">"加到主畫面"</string>
     <string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
     <string name="notification_menu_gear_description" msgid="6429668976593634862">"通知控制項"</string>
     <string name="notification_menu_snooze_description" msgid="4740133348901973244">"通知延後選項"</string>
@@ -962,7 +962,7 @@
     <string name="running_foreground_services_title" msgid="5137313173431186685">"正在背景中執行的應用程式"</string>
     <string name="running_foreground_services_msg" msgid="3009459259222695385">"輕按即可查看電池和數據用量詳情"</string>
     <string name="mobile_data_disable_title" msgid="5366476131671617790">"要關閉流動數據嗎?"</string>
-    <string name="mobile_data_disable_message" msgid="8604966027899770415">"您將無法透過「<xliff:g id="CARRIER">%s</xliff:g>」存取流動數據或互聯網。必須連接 Wi-Fi 才能使用互聯網。"</string>
+    <string name="mobile_data_disable_message" msgid="8604966027899770415">"您將無法透過「<xliff:g id="CARRIER">%s</xliff:g>」使用流動數據或互聯網,只可透過 Wi-Fi 才能連接互聯網。"</string>
     <string name="mobile_data_disable_message_default_carrier" msgid="6496033312431658238">"您的流動網絡供應商"</string>
     <string name="touch_filtered_warning" msgid="8119511393338714836">"由於某個應用程式已阻擋權限要求畫面,因此「設定」應用程式無法驗證您的回應。"</string>
     <string name="slice_permission_title" msgid="3262615140094151017">"要允許「<xliff:g id="APP_0">%1$s</xliff:g>」顯示「<xliff:g id="APP_2">%2$s</xliff:g>」的快訊嗎?"</string>
@@ -999,15 +999,22 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"隨時控制小視窗設定"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"輕按「管理」即可關閉此應用程式的小視窗"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"知道了"</string>
+    <!-- no translation found for bubbles_app_settings (5779443644062348657) -->
+    <skip />
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"系統導覽已更新。如需變更,請前往「設定」。"</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"前往「設定」更新系統導覽"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"待機"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"在對話部分的頂部顯示"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"在上鎖畫面顯示個人檔案相片"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"在應用程式上以浮動小視窗顯示"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"中斷「請勿騷擾」"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"知道了"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"放大重疊視窗"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"放大視窗"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"放大視窗控制項"</string>
-    <string name="quick_controls_title" msgid="6839108006171302273">"裝置控制項"</string>
+    <string name="quick_controls_title" msgid="6839108006171302273">"裝置控制"</string>
     <string name="quick_controls_subtitle" msgid="1667408093326318053">"為已連接的裝置新增控制項"</string>
-    <string name="quick_controls_setup_title" msgid="8901436655997849822">"設定裝置控制項"</string>
+    <string name="quick_controls_setup_title" msgid="8901436655997849822">"設定裝置控制"</string>
     <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"按住「開關」按鈕便可存取控制項"</string>
     <string name="controls_providers_title" msgid="6879775889857085056">"選擇應用程式以新增控制項"</string>
     <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380">
@@ -1016,13 +1023,11 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"控制項"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"從電源選單選擇要存取的控制項"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"按住並拖曳便可重新排列控制項"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"已移除所有控制項"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"無法載入完整控制項清單。"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"其他"</string>
-    <string name="controls_dialog_title" msgid="2343565267424406202">"加到裝置控制項"</string>
+    <string name="controls_dialog_title" msgid="2343565267424406202">"加到裝置控制"</string>
     <string name="controls_dialog_ok" msgid="7011816381344485651">"加入至常用項目"</string>
     <string name="controls_dialog_message" msgid="6292099631702047540">"「<xliff:g id="APP">%s</xliff:g>」建議將此控制項加入至常用項目。"</string>
     <string name="controls_dialog_confirmation" msgid="586517302736263447">"已更新控制項"</string>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index 4ea11d7..de15aff 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"由於儲存空間有限,因此無法儲存螢幕截圖"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"這個應用程式或貴機構不允許擷取螢幕畫面"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"關閉螢幕截圖"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"開啟螢幕截圖"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"螢幕截圖預覽"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"螢幕錄影器"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"持續顯示螢幕畫面錄製工作階段通知"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"要開始錄製嗎?"</string>
@@ -486,7 +486,7 @@
     <string name="user_logout_notification_title" msgid="3644848998053832589">"登出使用者"</string>
     <string name="user_logout_notification_text" msgid="7441286737342997991">"登出目前使用者"</string>
     <string name="user_logout_notification_action" msgid="7974458760719361881">"登出使用者"</string>
-    <string name="user_add_user_title" msgid="4172327541504825032">"新增使用者?"</string>
+    <string name="user_add_user_title" msgid="4172327541504825032">"要新增使用者嗎?"</string>
     <string name="user_add_user_message_short" msgid="2599370307878014791">"新增的使用者需要自行設定個人空間。\n\n任何使用者皆可為其他所有使用者更新應用程式。"</string>
     <string name="user_limit_reached_title" msgid="2429229448830346057">"已達使用者數量上限"</string>
     <plurals name="user_limit_reached_message" formatted="false" msgid="2573535787802908398">
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"泡泡"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"協助你不受音效或震動干擾。"</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"發出音效或震動吸引你的注意力。"</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"發出音效或震動吸引你的注意力。根據預設,來自「<xliff:g id="APP_NAME">%1$s</xliff:g>」的對話會以泡泡形式顯示。"</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"利用浮動式捷徑快速存取這項內容。"</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"以對話框形式顯示在對話部分的頂端。"</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"「<xliff:g id="APP_NAME_0">%1$s</xliff:g>」的所有對話預設會以對話框形式顯示。你可以在「<xliff:g id="APP_NAME_1">%2$s</xliff:g>」中調整相關設定。"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"設定"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"優先"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"最近沒有任何對話框"</string>
@@ -999,15 +999,22 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"你隨時可以控管對話框的各項設定"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"輕觸 [管理] 即可關閉來自這個應用程式的對話框"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"我知道了"</string>
+    <!-- no translation found for bubbles_app_settings (5779443644062348657) -->
+    <skip />
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"系統操作機制已更新。如要進行變更,請前往「設定」。"</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"請前往「設定」更新系統操作機制"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"待機"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"顯示在對話部分的頂端"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"在螢幕鎖定畫面上顯示個人資料相片"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"以浮動對話框形式顯示在應用程式最上層"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"中斷零打擾模式"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"我知道了"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"放大重疊視窗"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"放大視窗"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"放大視窗控制項"</string>
-    <string name="quick_controls_title" msgid="6839108006171302273">"裝置控制項"</string>
+    <string name="quick_controls_title" msgid="6839108006171302273">"裝置控制"</string>
     <string name="quick_controls_subtitle" msgid="1667408093326318053">"新增已連結裝置的控制項"</string>
-    <string name="quick_controls_setup_title" msgid="8901436655997849822">"設定裝置控制項"</string>
+    <string name="quick_controls_setup_title" msgid="8901436655997849822">"設定裝置控制"</string>
     <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"按住電源按鈕即可存取控制項"</string>
     <string name="controls_providers_title" msgid="6879775889857085056">"選擇應用程式以新增控制項"</string>
     <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380">
@@ -1016,13 +1023,11 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"控制項"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"選擇要從電源選單存取的控制項"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"按住並拖曳即可重新排列控制項"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"所有控制項都已移除"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"無法載入完整的控制項清單。"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"其他"</string>
-    <string name="controls_dialog_title" msgid="2343565267424406202">"新增至裝置控制項"</string>
+    <string name="controls_dialog_title" msgid="2343565267424406202">"新增至裝置控制"</string>
     <string name="controls_dialog_ok" msgid="7011816381344485651">"新增至常用控制項"</string>
     <string name="controls_dialog_message" msgid="6292099631702047540">"「<xliff:g id="APP">%s</xliff:g>」建議你將這個控制項新增至常用控制項。"</string>
     <string name="controls_dialog_confirmation" msgid="586517302736263447">"已更新控制項"</string>
diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml
index 6d455df..e979342 100644
--- a/packages/SystemUI/res/values-zu/strings.xml
+++ b/packages/SystemUI/res/values-zu/strings.xml
@@ -87,7 +87,7 @@
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"Ayikwazi ukulondoloza isithombe-skrini ngenxa yesikhala sesitoreji esikhawulelwe"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Ukuthatha izithombe-skrini akuvunyelwe uhlelo lokusebenza noma inhlangano yakho"</string>
     <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Cashisa isithombe-skrini"</string>
-    <string name="screenshot_preview_description" msgid="669177537416980449">"Vula isithombe-skrini"</string>
+    <string name="screenshot_preview_description" msgid="7606510140714080474">"Ukubuka kuqala isithombe-skrini"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"Irekhoda yesikrini"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Isaziso esiqhubekayo seseshini yokurekhoda isikrini"</string>
     <string name="screenrecord_start_label" msgid="1750350278888217473">"Qala ukurekhoda?"</string>
@@ -707,9 +707,9 @@
     <string name="notification_bubble_title" msgid="8330481035191903164">"Ibhamuza"</string>
     <string name="notification_channel_summary_low" msgid="7300447764759926720">"Ikusiza ukuthi ugxile ngaphandle komsindo noma ukudlidliza."</string>
     <string name="notification_channel_summary_default" msgid="3539949463907902037">"Ithola ukunaka kwakho ngomsindo noma ukudlidliza."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"Ithola ukunaka kwakho ngomsindo noma ukudlidliza. Izingxoxo ezivela ku-<xliff:g id="APP_NAME">%1$s</xliff:g> ziba yibhamuza ngokuzenzakalela."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Igcina ukunaka kwakho ngesinqamuleli esintantayo kulokhu okuqukethwe."</string>
     <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Kubonakala esigabeni esiphezulu sengxoxo futhi kuvela njengebhamuza"</string>
-    <string name="notification_conversation_channel_all_bubble" msgid="5389290797101635297">"Zonke izingxoxo ezivela ku-<xliff:g id="APP_NAME_0">%1$s</xliff:g> ziba yibhamuza ngokuzenzakalelayo. Phatha ku-<xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Izilungiselelo"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Okubalulekile"</string>
     <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Awekho amabhamuza akamuva"</string>
@@ -999,15 +999,22 @@
     <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Lawula amabhamuza noma nini"</string>
     <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Thepha okuthi Phatha ukuvala amabhamuza kusuka kulolu hlelo lokusebenza"</string>
     <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Ngiyezwa"</string>
+    <!-- no translation found for bubbles_app_settings (5779443644062348657) -->
+    <skip />
     <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Ukuzulazula kwesistimu kubuyekeziwe. Ukuze wenze ushintsho, hamba kokuthi Izilungiselelo."</string>
     <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Hamba kuzilungiselelo ukuze ubuyekeze ukuzulazula kwesistimu"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Ilindile"</string>
+    <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Kubonakala esigabeni esiphezulu sengxoxo"</string>
+    <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Kubonakala esithombeni sephrofayela esikrinini esikhiyiwe"</string>
+    <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Kubonakala njengebhamuza elintantayo phezu kwezinhlelo zokusebenza"</string>
+    <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Thikameza Ukungaphazamisi"</string>
+    <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Ngiyezwa"</string>
     <string name="magnification_overlay_title" msgid="6584179429612427958">"Iwindi Lembondela Lesikhulisi"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"Iwindi Lesikhulisi"</string>
     <string name="magnification_controls_title" msgid="8421106606708891519">"Izilawuli Zewindi Lesikhulisi"</string>
-    <string name="quick_controls_title" msgid="6839108006171302273">"Izilawuli zedivayisi"</string>
+    <string name="quick_controls_title" msgid="6839108006171302273">"Izilawuli zezinsiza"</string>
     <string name="quick_controls_subtitle" msgid="1667408093326318053">"Engeza izilawuli zedivayisi yakho exhunyiwe"</string>
-    <string name="quick_controls_setup_title" msgid="8901436655997849822">"Setha izilawuli zedivayisi"</string>
+    <string name="quick_controls_setup_title" msgid="8901436655997849822">"Setha izilawuli zezinsiza"</string>
     <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"Bamba inkinobho yamandla ukufinyelela kwizilawuli"</string>
     <string name="controls_providers_title" msgid="6879775889857085056">"Khetha uhlelo lokusebenza ukwengeza izilawuli"</string>
     <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380">
@@ -1016,13 +1023,11 @@
     </plurals>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"Izilawuli"</string>
     <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Khetha izilawuli ukuze ufinyelele kusuka kumenyu yamandla"</string>
-    <!-- no translation found for controls_favorite_rearrange (5616952398043063519) -->
-    <skip />
-    <!-- no translation found for controls_favorite_removed (5276978408529217272) -->
-    <skip />
+    <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Bamba futhi uhudule ukuze uphinde ulungise izilawuli"</string>
+    <string name="controls_favorite_removed" msgid="5276978408529217272">"Zonke izilawuli zisusiwe"</string>
     <string name="controls_favorite_load_error" msgid="2533215155804455348">"Uhlu lwazo zonke izilawuli alilayishekanga."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Okunye"</string>
-    <string name="controls_dialog_title" msgid="2343565267424406202">"Engeza kuzilawuli zedivayisi"</string>
+    <string name="controls_dialog_title" msgid="2343565267424406202">"Engeza kuzilawuli zezinsiza"</string>
     <string name="controls_dialog_ok" msgid="7011816381344485651">"Engeza kuzintandokazi"</string>
     <string name="controls_dialog_message" msgid="6292099631702047540">"I-<xliff:g id="APP">%s</xliff:g> iphakamise lokhu kulawula ukwengeza kuzintandokazi zakho."</string>
     <string name="controls_dialog_confirmation" msgid="586517302736263447">"Izilawuli zibuyekeziwe"</string>
diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml
index 4482cda..2e217a5 100644
--- a/packages/SystemUI/res/values/colors.xml
+++ b/packages/SystemUI/res/values/colors.xml
@@ -198,6 +198,8 @@
     <color name="global_screenshot_button_border">@color/GM2_grey_300</color>
     <color name="global_screenshot_button_ripple">#1f000000</color>
     <color name="global_screenshot_button_icon">@color/GM2_blue_500</color>
+    <color name="global_screenshot_dismiss_background">#FFFFFF</color>
+    <color name="global_screenshot_dismiss_foreground">@color/GM2_grey_500</color>
 
     <!-- GM2 colors -->
     <color name="GM2_grey_50">#F8F9FA</color>
@@ -248,4 +250,7 @@
     <color name="control_enabled_thermo_heat_background">@color/GM2_red_200</color>
     <color name="control_enabled_thermo_cool_background">@color/GM2_blue_200</color>
     <color name="control_enabled_default_background">@color/GM2_blue_200</color>
+
+    <!-- Docked misalignment message -->
+    <color name="misalignment_text_color">#F28B82</color>
 </resources>
diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml
index f549a32..62335ab 100644
--- a/packages/SystemUI/res/values/config.xml
+++ b/packages/SystemUI/res/values/config.xml
@@ -536,6 +536,10 @@
 
     <!-- Max number of columns for quick controls area -->
     <integer name="controls_max_columns">2</integer>
+
+    <!-- Max number of columns for power menu -->
+    <integer name="power_menu_max_columns">3</integer>
+
     <!-- If the dp width of the available space is <= this value, potentially adjust the number
          of columns-->
     <integer name="controls_max_columns_adjust_below_width_dp">320</integer>
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index e7ef8cc..bad18cf 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -993,8 +993,6 @@
     <dimen name="cell_overlay_padding">18dp</dimen>
 
     <!-- Global actions power menu -->
-    <dimen name="global_actions_top_margin">12dp</dimen>
-
     <dimen name="global_actions_panel_width">120dp</dimen>
     <dimen name="global_actions_padding">12dp</dimen>
     <dimen name="global_actions_translate">9dp</dimen>
@@ -1014,6 +1012,9 @@
     <!-- Margins at the left and right of the power menu and home controls widgets. -->
     <dimen name="global_actions_side_margin">16dp</dimen>
 
+    <!-- Amount to shift the layout when exiting/entering for controls activities -->
+    <dimen name="global_actions_controls_y_translation">20dp</dimen>
+
     <!-- The maximum offset in either direction that elements are moved horizontally to prevent
          burn-in on AOD. -->
     <dimen name="burn_in_prevention_offset_x">8dp</dimen>
@@ -1197,6 +1198,7 @@
          snap to the dismiss target. -->
     <dimen name="bubble_dismiss_target_padding_x">40dp</dimen>
     <dimen name="bubble_dismiss_target_padding_y">20dp</dimen>
+    <dimen name="bubble_manage_menu_elevation">4dp</dimen>
 
     <dimen name="dismiss_circle_size">52dp</dimen>
     <dimen name="dismiss_target_x_size">24dp</dimen>
@@ -1252,11 +1254,13 @@
     <dimen name="control_status_expanded">18sp</dimen>
     <dimen name="control_base_item_margin">2dp</dimen>
     <dimen name="control_status_padding">3dp</dimen>
+    <fraction name="controls_toggle_bg_intensity">5%</fraction>
+    <fraction name="controls_dimmed_alpha">40%</fraction>
 
     <!-- Home Controls activity view detail panel-->
     <dimen name="controls_activity_view_top_padding">25dp</dimen>
     <dimen name="controls_activity_view_side_padding">12dp</dimen>
-    <dimen name="controls_activity_view_top_offset">200dp</dimen>
+    <dimen name="controls_activity_view_top_offset">100dp</dimen>
     <dimen name="controls_activity_view_text_size">17sp</dimen>
 
     <!-- Home Controls management screens -->
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index 7c0b605..d639ed0 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -235,8 +235,8 @@
         your organization</string>
     <!-- Content description indicating that tapping a button will dismiss the screenshots UI [CHAR LIMIT=NONE] -->
     <string name="screenshot_dismiss_ui_description">Dismiss screenshot</string>
-    <!-- Content description indicating that tapping will open an app to view/edit the screenshot. [CHAR LIMIT=NONE] -->
-    <string name="screenshot_preview_description">Open screenshot</string>
+    <!-- Content description indicating that the view is a preview of the screenshot that was just taken [CHAR LIMIT=NONE] -->
+    <string name="screenshot_preview_description">Screenshot preview</string>
 
     <!-- Notification title displayed for screen recording [CHAR LIMIT=50]-->
     <string name="screenrecord_name">Screen Recorder</string>
@@ -1829,15 +1829,15 @@
     <!-- [CHAR LIMIT=150] Notification Importance title: normal importance level summary -->
     <string name="notification_channel_summary_default">Gets your attention with sound or vibration.</string>
 
+    <!-- [CHAR LIMIT=150] Conversation Notification Importance title: normal conversation level, with bubbling summary -->
+    <string name="notification_channel_summary_default_with_bubbles">Gets your attention with sound or vibration. Conversations from <xliff:g id="app_name" example="YouTube">%1$s</xliff:g> bubble by default.</string>
+
     <!-- [CHAR LIMIT=150] Notification Importance title: bubble level summary -->
     <string name="notification_channel_summary_bubble">Keeps your attention with a floating shortcut to this content.</string>
 
     <!-- [CHAR LIMIT=150] Notification Importance title: important conversation level summary -->
     <string name="notification_channel_summary_priority">Shows at top of conversation section and appears as a bubble.</string>
 
-    <!--[CHAR LIMIT=150] Conversation inline controls footer shown when all conversations from the app are allowed to show as bubbles -->
-    <string name="notification_conversation_channel_all_bubble">All conversations from <xliff:g id="app_name" example="YouTube">%1$s</xliff:g> bubble by default. Manage in <xliff:g id="app_name" example="Settings">%2$s</xliff:g>.</string>
-
     <!--[CHAR LIMIT=30] Linkable text to Settings app -->
     <string name="notification_conversation_channel_settings">Settings</string>
 
@@ -2629,6 +2629,8 @@
     <string name="bubbles_user_education_manage">Tap Manage to turn off bubbles from this app</string>
     <!-- Button text for dismissing the bubble "manage" button tool tip  [CHAR LIMIT=20]-->
     <string name="bubbles_user_education_got_it">Got it</string>
+    <!-- Label for the button that takes the user to the notification settings for the given app. -->
+    <string name="bubbles_app_settings"><xliff:g id="notification_title" example="Android Messages">%1$s</xliff:g> settings</string>
 
     <!-- Notification content text when the system navigation mode changes as a result of changing the default launcher [CHAR LIMIT=NONE] -->
     <string name="notification_content_system_nav_changed">System navigation updated. To make changes, go to Settings.</string>
@@ -2639,6 +2641,18 @@
     <!-- Title of the overlay warning the user to interact with the device or it will go to sleep. [CHAR LIMIT=25] -->
     <string name="inattentive_sleep_warning_title">Standby</string>
 
+    <!-- Priority conversation onboarding screen -->
+    <!--  Text explaining that priority conversations show at the top of the conversation section [CHAR LIMIT=50]  -->
+    <string name="priority_onboarding_show_at_top_text">Show at top of conversation section</string>
+    <!--  Text explaining that priority conversations show an avatar on the lock screen [CHAR LIMIT=50]  -->
+    <string name="priority_onboarding_show_avatar_text">Show profile picture on lock screen</string>
+    <!--  Text explaining that priority conversations will appear as a bubble [CHAR LIMIT=50]  -->
+    <string name="priority_onboarding_appear_as_bubble_text">Appear as a floating bubble on top of apps</string>
+    <!--  Text explaining that priority conversations can interrupt DnD settings [CHAR LIMIT=50]  -->
+    <string name="priority_onboarding_ignores_dnd_text">Interrupt Do Not Disturb</string>
+    <!--  Title for the affirmative button [CHAR LIMIT=50]  -->
+    <string name="priority_onboarding_done_button_title">Got it</string>
+
     <!-- Window Magnification strings -->
     <!-- Title for Magnification Overlay Window [CHAR LIMIT=NONE] -->
     <string name="magnification_overlay_title">Magnification Overlay Window</string>
diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml
index 118aa5b..26ae790 100644
--- a/packages/SystemUI/res/values/styles.xml
+++ b/packages/SystemUI/res/values/styles.xml
@@ -564,7 +564,7 @@
     <style name="TextAppearance.NotificationImportanceButton">
         <item name="android:textSize">@dimen/notification_importance_button_text</item>
         <item name="android:fontFamily">@*android:string/config_headlineFontFamilyMedium</item>
-        <item name="android:textColor">?android:attr/colorAccent</item>
+        <item name="android:textColor">@color/notification_guts_priority_contents</item>
         <item name="android:gravity">center</item>
     </style>
 
@@ -663,8 +663,13 @@
 
     <!-- Controls styles -->
     <style name="Theme.ControlsManagement" parent="@android:style/Theme.DeviceDefault.NoActionBar">
+        <item name="android:windowActivityTransitions">true</item>
+        <item name="android:windowContentTransitions">false</item>
         <item name="android:windowIsTranslucent">false</item>
-        <item name="wallpaperTextColor">@*android:color/primary_text_material_dark</item>
+        <item name="android:windowBackground">@android:color/black</item>
+        <item name="android:colorBackground">@android:color/black</item>
+        <item name="android:windowAnimationStyle">@null</item>
+        <item name="android:statusBarColor">@*android:color/transparent</item>
     </style>
 
     <style name="TextAppearance.Control">
@@ -726,11 +731,6 @@
         <item name="android:textSize">@dimen/control_text_size</item>
         <item name="android:textColor">@color/control_secondary_text</item>
     </style>
-    <style name="TextAppearance.ControlDialog">
-        <item name="android:fontFamily">@*android:string/config_headlineFontFamilyMedium</item>
-        <item name="android:textSize">@dimen/controls_activity_view_text_size</item>
-        <item name="android:textColor">@color/control_primary_text</item>
-    </style>
     <style name="Control.ListPopupWindow" parent="@*android:style/Widget.DeviceDefault.ListPopupWindow">
         <item name="android:overlapAnchor">true</item>
 
diff --git a/packages/SystemUI/scripts/update_statsd_lib.sh b/packages/SystemUI/scripts/update_statsd_lib.sh
new file mode 100755
index 0000000..79b9497
--- /dev/null
+++ b/packages/SystemUI/scripts/update_statsd_lib.sh
@@ -0,0 +1,35 @@
+#!/bin/sh
+
+NUM_ARGS=$#
+JAR_DESTINATION="$1/prebuilts/framework_intermediates/libs/systemui_statsd.jar"
+
+has_croot() {
+  declare -F croot > /dev/null
+  return $?
+}
+
+check_environment() {
+  if ! has_croot; then
+    echo "Run script in a shell that has had envsetup run. Run '. update_statsd_lib.sh' from scripts directory"
+    return 1
+  fi
+
+  if [ $NUM_ARGS -ne 1 ]; then
+    echo "Usage: . update_statsd_lib.sh PATH_TO_UNBUNDLED_LAUNCER     e.g. . update_statsd_lib ~/src/ub-launcher3-master"
+    return 1
+  fi
+  return 0
+}
+
+main() {
+  if check_environment ; then
+    pushd .
+    croot
+    mma -j16 SystemUI-statsd
+    cp out/target/product/$TARGET_PRODUCT/obj/JAVA_LIBRARIES/SystemUI-statsd_intermediates/javalib.jar $JAR_DESTINATION
+    popd
+  fi
+}
+
+main
+
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityOptionsCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityOptionsCompat.java
index 7b39ba3..345a649 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityOptionsCompat.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityOptionsCompat.java
@@ -76,7 +76,7 @@
                             callbackHandler.post(callback);
                         }
                     }
-                });
+                }, null /* finishedListener */);
     }
 
     /**
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardHostView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardHostView.java
index aa2fe3c..57b3761 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardHostView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardHostView.java
@@ -16,7 +16,6 @@
 
 package com.android.keyguard;
 
-import android.app.Activity;
 import android.app.ActivityManager;
 import android.content.Context;
 import android.content.res.ColorStateList;
@@ -31,6 +30,8 @@
 import android.view.KeyEvent;
 import android.widget.FrameLayout;
 
+import androidx.annotation.VisibleForTesting;
+
 import com.android.internal.widget.LockPatternUtils;
 import com.android.keyguard.KeyguardSecurityContainer.SecurityCallback;
 import com.android.keyguard.KeyguardSecurityModel.SecurityMode;
@@ -101,7 +102,8 @@
     public static final boolean DEBUG = KeyguardConstants.DEBUG;
     private static final String TAG = "KeyguardViewBase";
 
-    private KeyguardSecurityContainer mSecurityContainer;
+    @VisibleForTesting
+    protected KeyguardSecurityContainer mSecurityContainer;
 
     public KeyguardHostView(Context context) {
         this(context, null);
@@ -446,4 +448,11 @@
     public SecurityMode getCurrentSecurityMode() {
         return mSecurityContainer.getCurrentSecurityMode();
     }
+
+    /**
+     * When bouncer was visible and is starting to become hidden.
+     */
+    public void onStartingToHide() {
+        mSecurityContainer.onStartingToHide();
+    }
 }
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordView.java
index 718bcf1..65bf7e6 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordView.java
@@ -152,6 +152,11 @@
         mImm.hideSoftInputFromWindow(getWindowToken(), 0);
     }
 
+    @Override
+    public void onStartingToHide() {
+        mImm.hideSoftInputFromWindow(getWindowToken(), 0);
+    }
+
     private void updateSwitchImeButton() {
         // If there's more than one IME, enable the IME switcher button
         final boolean wasVisible = mSwitchImeButton.getVisibility() == View.VISIBLE;
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java
index 5c3d17c..9cfcc52 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java
@@ -19,6 +19,7 @@
 import static android.view.ViewRootImpl.sNewInsetsMode;
 import static android.view.WindowInsets.Type.ime;
 import static android.view.WindowInsets.Type.systemBars;
+import static android.view.WindowInsetsAnimation.Callback.DISPATCH_MODE_STOP;
 
 import static com.android.systemui.DejankUtils.whitelistIpcs;
 
@@ -30,12 +31,14 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.res.ColorStateList;
+import android.graphics.Rect;
 import android.metrics.LogMaker;
 import android.os.Handler;
 import android.os.Looper;
 import android.os.UserHandle;
 import android.util.AttributeSet;
 import android.util.Log;
+import android.util.MathUtils;
 import android.util.Slog;
 import android.util.TypedValue;
 import android.view.LayoutInflater;
@@ -44,6 +47,7 @@
 import android.view.View;
 import android.view.ViewConfiguration;
 import android.view.WindowInsets;
+import android.view.WindowInsetsAnimation;
 import android.view.WindowManager;
 import android.widget.FrameLayout;
 
@@ -63,6 +67,8 @@
 import com.android.systemui.statusbar.policy.KeyguardStateController;
 import com.android.systemui.util.InjectionInflationController;
 
+import java.util.List;
+
 public class KeyguardSecurityContainer extends FrameLayout implements KeyguardSecurityView {
     private static final boolean DEBUG = KeyguardConstants.DEBUG;
     private static final String TAG = "KeyguardSecurityView";
@@ -114,6 +120,47 @@
     private boolean mIsDragging;
     private float mStartTouchY = -1;
 
+    private final WindowInsetsAnimation.Callback mWindowInsetsAnimationCallback =
+            new WindowInsetsAnimation.Callback(DISPATCH_MODE_STOP) {
+
+                private final Rect mInitialBounds = new Rect();
+                private final Rect mFinalBounds = new Rect();
+
+                @Override
+                public void onPrepare(WindowInsetsAnimation animation) {
+                    mSecurityViewFlipper.getBoundsOnScreen(mInitialBounds);
+                }
+
+                @Override
+                public WindowInsetsAnimation.Bounds onStart(WindowInsetsAnimation animation,
+                        WindowInsetsAnimation.Bounds bounds) {
+                    mSecurityViewFlipper.getBoundsOnScreen(mFinalBounds);
+                    return bounds;
+                }
+
+                @Override
+                public WindowInsets onProgress(WindowInsets windowInsets,
+                        List<WindowInsetsAnimation> list) {
+                    int translationY = 0;
+                    for (WindowInsetsAnimation animation : list) {
+                        if ((animation.getTypeMask() & WindowInsets.Type.ime()) == 0) {
+                            continue;
+                        }
+                        final int paddingBottom = (int) MathUtils.lerp(
+                                mInitialBounds.bottom - mFinalBounds.bottom, 0,
+                                animation.getInterpolatedFraction());
+                        translationY += paddingBottom;
+                    }
+                    mSecurityViewFlipper.setTranslationY(translationY);
+                    return windowInsets;
+                }
+
+                @Override
+                public void onEnd(WindowInsetsAnimation animation) {
+                    mSecurityViewFlipper.setTranslationY(0);
+                }
+            };
+
     // Used to notify the container when something interesting happens.
     public interface SecurityCallback {
         public boolean dismiss(boolean authenticated, int targetUserId,
@@ -162,6 +209,7 @@
         if (mCurrentSecuritySelection != SecurityMode.None) {
             getSecurityView(mCurrentSecuritySelection).onResume(reason);
         }
+        mSecurityViewFlipper.setWindowInsetsAnimationCallback(mWindowInsetsAnimationCallback);
         updateBiometricRetry();
     }
 
@@ -175,6 +223,14 @@
         if (mCurrentSecuritySelection != SecurityMode.None) {
             getSecurityView(mCurrentSecuritySelection).onPause();
         }
+        mSecurityViewFlipper.setWindowInsetsAnimationCallback(null);
+    }
+
+    @Override
+    public void onStartingToHide() {
+        if (mCurrentSecuritySelection != SecurityMode.None) {
+            getSecurityView(mCurrentSecuritySelection).onStartingToHide();
+        }
     }
 
     @Override
@@ -333,7 +389,9 @@
         }
     }
 
-    protected void onFinishInflate() {
+    @Override
+    public void onFinishInflate() {
+        super.onFinishInflate();
         mSecurityViewFlipper = findViewById(R.id.view_flipper);
         mSecurityViewFlipper.setLockPatternUtils(mLockPatternUtils);
     }
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityView.java
index 20b1e0d..43cef3a 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityView.java
@@ -159,4 +159,9 @@
     default boolean disallowInterceptTouch(MotionEvent event) {
         return false;
     }
+
+    /**
+     * When bouncer was visible but is being dragged down or dismissed.
+     */
+    default void onStartingToHide() {};
 }
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
index 367058f..a96ef91 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
@@ -1301,6 +1301,7 @@
     private FingerprintManager mFpm;
     private FaceManager mFaceManager;
     private boolean mFingerprintLockedOut;
+    private TelephonyManager mTelephonyManager;
 
     /**
      * When we receive a
@@ -1728,10 +1729,22 @@
         }
         updateAirplaneModeState();
 
-        TelephonyManager telephony =
+        mTelephonyManager =
                 (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
-        if (telephony != null) {
-            telephony.listen(mPhoneStateListener, LISTEN_ACTIVE_DATA_SUBSCRIPTION_ID_CHANGE);
+        if (mTelephonyManager != null) {
+            mTelephonyManager.listen(mPhoneStateListener,
+                    LISTEN_ACTIVE_DATA_SUBSCRIPTION_ID_CHANGE);
+            // Set initial sim states values.
+            for (int slot = 0; slot < mTelephonyManager.getActiveModemCount(); slot++) {
+                int state = mTelephonyManager.getSimState(slot);
+                int[] subIds = mSubscriptionManager.getSubscriptionIds(slot);
+                if (subIds != null) {
+                    for (int subId : subIds) {
+                        mHandler.obtainMessage(MSG_SIM_STATE_CHANGE, subId, slot, state)
+                                .sendToTarget();
+                    }
+                }
+            }
         }
     }
 
diff --git a/packages/SystemUI/src/com/android/keyguard/PasswordTextView.java b/packages/SystemUI/src/com/android/keyguard/PasswordTextView.java
index 409ae3f..c92174a 100644
--- a/packages/SystemUI/src/com/android/keyguard/PasswordTextView.java
+++ b/packages/SystemUI/src/com/android/keyguard/PasswordTextView.java
@@ -164,7 +164,9 @@
                 currentDrawPosition = getPaddingLeft();
             }
         } else {
-            currentDrawPosition = getWidth() / 2 - totalDrawingWidth / 2;
+            float maxRight = getWidth() - getPaddingRight() - totalDrawingWidth;
+            float center = getWidth() / 2f - totalDrawingWidth / 2f;
+            currentDrawPosition = center > 0 ? center : maxRight;
         }
         int length = mTextChars.size();
         Rect bounds = getCharBounds();
diff --git a/packages/SystemUI/src/com/android/systemui/Dependency.java b/packages/SystemUI/src/com/android/systemui/Dependency.java
index b6152da..0af026e 100644
--- a/packages/SystemUI/src/com/android/systemui/Dependency.java
+++ b/packages/SystemUI/src/com/android/systemui/Dependency.java
@@ -75,7 +75,6 @@
 import com.android.systemui.statusbar.notification.NotificationEntryManager.KeyguardEnvironment;
 import com.android.systemui.statusbar.notification.NotificationFilter;
 import com.android.systemui.statusbar.notification.VisualStabilityManager;
-import com.android.systemui.statusbar.notification.interruption.NotificationAlertingManager;
 import com.android.systemui.statusbar.notification.logging.NotificationLogger;
 import com.android.systemui.statusbar.notification.row.ChannelEditorDialogController;
 import com.android.systemui.statusbar.notification.row.NotificationBlockingHelperManager;
@@ -293,8 +292,6 @@
     @Inject Lazy<RemoteInputQuickSettingsDisabler> mRemoteInputQuickSettingsDisabler;
     @Inject Lazy<BubbleController> mBubbleController;
     @Inject Lazy<NotificationEntryManager> mNotificationEntryManager;
-    @Inject
-    Lazy<NotificationAlertingManager> mNotificationAlertingManager;
     @Inject Lazy<SensorPrivacyManager> mSensorPrivacyManager;
     @Inject Lazy<AutoHideController> mAutoHideController;
     @Inject Lazy<ForegroundServiceNotificationListener> mForegroundServiceNotificationListener;
@@ -493,7 +490,6 @@
                 mRemoteInputQuickSettingsDisabler::get);
         mProviders.put(BubbleController.class, mBubbleController::get);
         mProviders.put(NotificationEntryManager.class, mNotificationEntryManager::get);
-        mProviders.put(NotificationAlertingManager.class, mNotificationAlertingManager::get);
         mProviders.put(ForegroundServiceNotificationListener.class,
                 mForegroundServiceNotificationListener::get);
         mProviders.put(ClockManager.class, mClockManager::get);
diff --git a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java b/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java
index 5442299..71ec33e 100644
--- a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java
+++ b/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java
@@ -16,9 +16,6 @@
 
 package com.android.systemui;
 
-import android.app.ActivityManager;
-import android.content.Context;
-import android.content.res.Configuration;
 import android.graphics.Rect;
 import android.os.Handler;
 import android.os.HandlerThread;
@@ -27,17 +24,12 @@
 import android.service.wallpaper.WallpaperService;
 import android.util.Log;
 import android.util.Size;
-import android.view.DisplayInfo;
 import android.view.SurfaceHolder;
 
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.systemui.glwallpaper.EglHelper;
 import com.android.systemui.glwallpaper.GLWallpaperRenderer;
 import com.android.systemui.glwallpaper.ImageWallpaperRenderer;
-import com.android.systemui.plugins.statusbar.StatusBarStateController;
-import com.android.systemui.plugins.statusbar.StatusBarStateController.StateListener;
-import com.android.systemui.statusbar.StatusBarState;
-import com.android.systemui.statusbar.phone.DozeParameters;
 
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
@@ -53,16 +45,12 @@
     // We delayed destroy render context that subsequent render requests have chance to cancel it.
     // This is to avoid destroying then recreating render context in a very short time.
     private static final int DELAY_FINISH_RENDERING = 1000;
-    private static final int INTERVAL_WAIT_FOR_RENDERING = 100;
-    private static final int PATIENCE_WAIT_FOR_RENDERING = 10;
-    private static final boolean DEBUG = true;
-    private final DozeParameters mDozeParameters;
+    private static final boolean DEBUG = false;
     private HandlerThread mWorker;
 
     @Inject
-    public ImageWallpaper(DozeParameters dozeParameters) {
+    public ImageWallpaper() {
         super();
-        mDozeParameters = dozeParameters;
     }
 
     @Override
@@ -74,7 +62,7 @@
 
     @Override
     public Engine onCreateEngine() {
-        return new GLEngine(this, mDozeParameters);
+        return new GLEngine();
     }
 
     @Override
@@ -84,7 +72,7 @@
         mWorker = null;
     }
 
-    class GLEngine extends Engine implements GLWallpaperRenderer.SurfaceProxy, StateListener {
+    class GLEngine extends Engine {
         // Surface is rejected if size below a threshold on some devices (ie. 8px on elfin)
         // set min to 64 px (CTS covers this), please refer to ag/4867989 for detail.
         @VisibleForTesting
@@ -94,40 +82,15 @@
 
         private GLWallpaperRenderer mRenderer;
         private EglHelper mEglHelper;
-        private StatusBarStateController mController;
         private final Runnable mFinishRenderingTask = this::finishRendering;
-        private boolean mShouldStopTransition;
-        private final DisplayInfo mDisplayInfo = new DisplayInfo();
-        private final Object mMonitor = new Object();
-        @VisibleForTesting
-        boolean mIsHighEndGfx;
-        private boolean mDisplayNeedsBlanking;
-        private boolean mNeedTransition;
         private boolean mNeedRedraw;
-        // This variable can only be accessed in synchronized block.
-        private boolean mWaitingForRendering;
 
-        GLEngine(Context context, DozeParameters dozeParameters) {
-            init(dozeParameters);
+        GLEngine() {
         }
 
         @VisibleForTesting
-        GLEngine(DozeParameters dozeParameters, Handler handler) {
+        GLEngine(Handler handler) {
             super(SystemClock::elapsedRealtime, handler);
-            init(dozeParameters);
-        }
-
-        private void init(DozeParameters dozeParameters) {
-            mIsHighEndGfx = ActivityManager.isHighEndGfx();
-            mDisplayNeedsBlanking = dozeParameters.getDisplayNeedsBlanking();
-            mNeedTransition = false;
-
-            // We will preserve EGL context when we are in lock screen or aod
-            // to avoid janking in following transition, we need to release when back to home.
-            mController = Dependency.get(StatusBarStateController.class);
-            if (mController != null) {
-                mController.addCallback(this /* StateListener */);
-            }
         }
 
         @Override
@@ -135,9 +98,8 @@
             mEglHelper = getEglHelperInstance();
             // Deferred init renderer because we need to get wallpaper by display context.
             mRenderer = getRendererInstance();
-            getDisplayContext().getDisplay().getDisplayInfo(mDisplayInfo);
             setFixedSizeAllowed(true);
-            setOffsetNotificationsEnabled(mNeedTransition);
+            setOffsetNotificationsEnabled(false);
             updateSurfaceSize();
         }
 
@@ -146,7 +108,7 @@
         }
 
         ImageWallpaperRenderer getRendererInstance() {
-            return new ImageWallpaperRenderer(getDisplayContext(), this /* SurfaceProxy */);
+            return new ImageWallpaperRenderer(getDisplayContext());
         }
 
         private void updateSurfaceSize() {
@@ -157,79 +119,13 @@
             holder.setFixedSize(width, height);
         }
 
-        /**
-         * Check if necessary to stop transition with current wallpaper on this device. <br/>
-         * This should only be invoked after {@link #onSurfaceCreated(SurfaceHolder)}}
-         * is invoked since it needs display context and surface frame size.
-         * @return true if need to stop transition.
-         */
-        @VisibleForTesting
-        boolean checkIfShouldStopTransition() {
-            int orientation = getDisplayContext().getResources().getConfiguration().orientation;
-            Rect frame = getSurfaceHolder().getSurfaceFrame();
-            Rect display = new Rect();
-            if (orientation == Configuration.ORIENTATION_PORTRAIT) {
-                display.set(0, 0, mDisplayInfo.logicalWidth, mDisplayInfo.logicalHeight);
-            } else {
-                display.set(0, 0, mDisplayInfo.logicalHeight, mDisplayInfo.logicalWidth);
-            }
-            return mNeedTransition
-                    && (frame.width() < display.width() || frame.height() < display.height());
-        }
-
-        @Override
-        public void onOffsetsChanged(float xOffset, float yOffset, float xOffsetStep,
-                float yOffsetStep, int xPixelOffset, int yPixelOffset) {
-            if (mWorker == null) return;
-            mWorker.getThreadHandler().post(() -> mRenderer.updateOffsets(xOffset, yOffset));
-        }
-
-        @Override
-        public void onAmbientModeChanged(boolean inAmbientMode, long animationDuration) {
-            if (mWorker == null || !mNeedTransition) return;
-            final long duration = mShouldStopTransition ? 0 : animationDuration;
-            if (DEBUG) {
-                Log.d(TAG, "onAmbientModeChanged: inAmbient=" + inAmbientMode
-                        + ", duration=" + duration
-                        + ", mShouldStopTransition=" + mShouldStopTransition);
-            }
-            mWorker.getThreadHandler().post(
-                    () -> mRenderer.updateAmbientMode(inAmbientMode, duration));
-            if (inAmbientMode && animationDuration == 0) {
-                // This means that we are transiting from home to aod, to avoid
-                // race condition between window visibility and transition,
-                // we don't return until the transition is finished. See b/136643341.
-                waitForBackgroundRendering();
-            }
-        }
-
         @Override
         public boolean shouldZoomOutWallpaper() {
             return true;
         }
 
-        private void waitForBackgroundRendering() {
-            synchronized (mMonitor) {
-                try {
-                    mWaitingForRendering = true;
-                    for (int patience = 1; mWaitingForRendering; patience++) {
-                        mMonitor.wait(INTERVAL_WAIT_FOR_RENDERING);
-                        mWaitingForRendering &= patience < PATIENCE_WAIT_FOR_RENDERING;
-                    }
-                } catch (InterruptedException ex) {
-                } finally {
-                    mWaitingForRendering = false;
-                }
-            }
-        }
-
         @Override
         public void onDestroy() {
-            if (mController != null) {
-                mController.removeCallback(this /* StateListener */);
-            }
-            mController = null;
-
             mWorker.getThreadHandler().post(() -> {
                 mRenderer.finish();
                 mRenderer = null;
@@ -240,7 +136,6 @@
 
         @Override
         public void onSurfaceCreated(SurfaceHolder holder) {
-            mShouldStopTransition = checkIfShouldStopTransition();
             if (mWorker == null) return;
             mWorker.getThreadHandler().post(() -> {
                 mEglHelper.init(holder, needSupportWideColorGamut());
@@ -251,32 +146,13 @@
         @Override
         public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) {
             if (mWorker == null) return;
-            mWorker.getThreadHandler().post(() -> {
-                mRenderer.onSurfaceChanged(width, height);
-                mNeedRedraw = true;
-            });
+            mWorker.getThreadHandler().post(() -> mRenderer.onSurfaceChanged(width, height));
         }
 
         @Override
         public void onSurfaceRedrawNeeded(SurfaceHolder holder) {
             if (mWorker == null) return;
-            if (DEBUG) {
-                Log.d(TAG, "onSurfaceRedrawNeeded: mNeedRedraw=" + mNeedRedraw);
-            }
-
-            mWorker.getThreadHandler().post(() -> {
-                if (mNeedRedraw) {
-                    drawFrame();
-                    mNeedRedraw = false;
-                }
-            });
-        }
-
-        @Override
-        public void onVisibilityChanged(boolean visible) {
-            if (DEBUG) {
-                Log.d(TAG, "wallpaper visibility changes: " + visible);
-            }
+            mWorker.getThreadHandler().post(this::drawFrame);
         }
 
         private void drawFrame() {
@@ -285,15 +161,6 @@
             postRender();
         }
 
-        @Override
-        public void onStatePostChange() {
-            // When back to home, we try to release EGL, which is preserved in lock screen or aod.
-            if (mWorker != null && mController.getState() == StatusBarState.SHADE) {
-                mWorker.getThreadHandler().post(this::scheduleFinishRendering);
-            }
-        }
-
-        @Override
         public void preRender() {
             // This method should only be invoked from worker thread.
             Trace.beginSection("ImageWallpaper#preRender");
@@ -330,7 +197,6 @@
             }
         }
 
-        @Override
         public void requestRender() {
             // This method should only be invoked from worker thread.
             Trace.beginSection("ImageWallpaper#requestRender");
@@ -355,27 +221,13 @@
             }
         }
 
-        @Override
         public void postRender() {
             // This method should only be invoked from worker thread.
             Trace.beginSection("ImageWallpaper#postRender");
-            notifyWaitingThread();
             scheduleFinishRendering();
             Trace.endSection();
         }
 
-        private void notifyWaitingThread() {
-            synchronized (mMonitor) {
-                if (mWaitingForRendering) {
-                    try {
-                        mWaitingForRendering = false;
-                        mMonitor.notify();
-                    } catch (IllegalMonitorStateException ex) {
-                    }
-                }
-            }
-        }
-
         private void cancelFinishRenderingTask() {
             if (mWorker == null) return;
             mWorker.getThreadHandler().removeCallbacks(mFinishRenderingTask);
@@ -391,18 +243,11 @@
             Trace.beginSection("ImageWallpaper#finishRendering");
             if (mEglHelper != null) {
                 mEglHelper.destroyEglSurface();
-                if (!needPreserveEglContext()) {
-                    mEglHelper.destroyEglContext();
-                }
+                mEglHelper.destroyEglContext();
             }
             Trace.endSection();
         }
 
-        private boolean needPreserveEglContext() {
-            return mNeedTransition && mController != null
-                    && mController.getState() == StatusBarState.KEYGUARD;
-        }
-
         private boolean needSupportWideColorGamut() {
             return mRenderer.isWcgContent();
         }
@@ -411,16 +256,6 @@
         protected void dump(String prefix, FileDescriptor fd, PrintWriter out, String[] args) {
             super.dump(prefix, fd, out, args);
             out.print(prefix); out.print("Engine="); out.println(this);
-            out.print(prefix); out.print("isHighEndGfx="); out.println(mIsHighEndGfx);
-            out.print(prefix); out.print("displayNeedsBlanking=");
-            out.println(mDisplayNeedsBlanking);
-            out.print(prefix); out.print("displayInfo="); out.print(mDisplayInfo);
-            out.print(prefix); out.print("mNeedTransition="); out.println(mNeedTransition);
-            out.print(prefix); out.print("mShouldStopTransition=");
-            out.println(mShouldStopTransition);
-            out.print(prefix); out.print("StatusBarState=");
-            out.println(mController != null ? mController.getState() : "null");
-
             out.print(prefix); out.print("valid surface=");
             out.println(getSurfaceHolder() != null && getSurfaceHolder().getSurface() != null
                     ? getSurfaceHolder().getSurface().isValid()
diff --git a/packages/SystemUI/src/com/android/systemui/Interpolators.java b/packages/SystemUI/src/com/android/systemui/Interpolators.java
index 6923079..2eba952 100644
--- a/packages/SystemUI/src/com/android/systemui/Interpolators.java
+++ b/packages/SystemUI/src/com/android/systemui/Interpolators.java
@@ -54,6 +54,11 @@
     public static final Interpolator PANEL_CLOSE_ACCELERATED
             = new PathInterpolator(0.3f, 0, 0.5f, 1);
     public static final Interpolator BOUNCE = new BounceInterpolator();
+    /**
+     * For state transitions on the control panel that lives in GlobalActions.
+     */
+    public static final Interpolator CONTROL_STATE = new PathInterpolator(0.4f, 0f, 0.2f,
+            1.0f);
 
     /**
      * Interpolator to be used when animating a move based on a click. Pair with enough duration.
diff --git a/packages/SystemUI/src/com/android/systemui/Prefs.java b/packages/SystemUI/src/com/android/systemui/Prefs.java
index 6aa2326..87990cd 100644
--- a/packages/SystemUI/src/com/android/systemui/Prefs.java
+++ b/packages/SystemUI/src/com/android/systemui/Prefs.java
@@ -21,11 +21,25 @@
 import android.content.SharedPreferences;
 import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
 
+import com.android.systemui.settings.CurrentUserContextTracker;
+
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.util.Map;
 import java.util.Set;
 
+/**
+ * A helper class to store simple preferences for SystemUI. Its main use case is things such as
+ * feature education, e.g. "has the user seen this tooltip".
+ *
+ * As of this writing, feature education settings are *intentionally exempted* from backup and
+ * restore because there is not a great way to know which subset of features the user _should_ see
+ * again if, for instance, they are coming from multiple OSes back or switching OEMs.
+ *
+ * NOTE: Clients of this class should take care to pass in the correct user context when querying
+ * settings, otherwise you will always read/write for user 0 which is almost never what you want.
+ * See {@link CurrentUserContextTracker} for a simple way to get the current context
+ */
 public final class Prefs {
     private Prefs() {} // no instantation
 
@@ -109,6 +123,8 @@
         String HAS_SEEN_BUBBLES_EDUCATION = "HasSeenBubblesOnboarding";
         String HAS_SEEN_BUBBLES_MANAGE_EDUCATION = "HasSeenBubblesManageOnboarding";
         String CONTROLS_STRUCTURE_SWIPE_TOOLTIP_COUNT = "ControlsStructureSwipeTooltipCount";
+        /** Tracks whether the user has seen the onboarding screen for priority conversations */
+        String HAS_SEEN_PRIORITY_ONBOARDING = "HasSeenPriorityOnboarding";
     }
 
     public static boolean getBoolean(Context context, @Key String key, boolean defaultValue) {
diff --git a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java
index 8df3dd2..7861211 100644
--- a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java
+++ b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java
@@ -54,8 +54,10 @@
 import android.graphics.drawable.VectorDrawable;
 import android.hardware.display.DisplayManager;
 import android.os.Handler;
+import android.os.HandlerExecutor;
 import android.os.HandlerThread;
 import android.os.SystemProperties;
+import android.os.UserHandle;
 import android.provider.Settings.Secure;
 import android.util.DisplayMetrics;
 import android.util.Log;
@@ -298,13 +300,15 @@
                         updateColorInversion(value);
                     }
                 };
+
+                mColorInversionSetting.setListening(true);
+                mColorInversionSetting.onChange(false);
             }
-            mColorInversionSetting.setListening(true);
-            mColorInversionSetting.onChange(false);
 
             IntentFilter filter = new IntentFilter();
             filter.addAction(Intent.ACTION_USER_SWITCHED);
-            mBroadcastDispatcher.registerReceiverWithHandler(mIntentReceiver, filter, mHandler);
+            mBroadcastDispatcher.registerReceiver(mUserSwitchIntentReceiver, filter,
+                    new HandlerExecutor(mHandler), UserHandle.ALL);
             mIsRegistered = true;
         } else {
             mMainHandler.post(() -> mTunerService.removeTunable(this));
@@ -313,7 +317,7 @@
                 mColorInversionSetting.setListening(false);
             }
 
-            mBroadcastDispatcher.unregisterReceiver(mIntentReceiver);
+            mBroadcastDispatcher.unregisterReceiver(mUserSwitchIntentReceiver);
             mIsRegistered = false;
         }
     }
@@ -503,17 +507,16 @@
         }
     }
 
-    private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
+    private final BroadcastReceiver mUserSwitchIntentReceiver = new BroadcastReceiver() {
         @Override
         public void onReceive(Context context, Intent intent) {
-            String action = intent.getAction();
-            if (action.equals(Intent.ACTION_USER_SWITCHED)) {
-                int newUserId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE,
-                        ActivityManager.getCurrentUser());
-                // update color inversion setting to the new user
-                mColorInversionSetting.setUserId(newUserId);
-                updateColorInversion(mColorInversionSetting.getValue());
+            int newUserId = ActivityManager.getCurrentUser();
+            if (DEBUG) {
+                Log.d(TAG, "UserSwitched newUserId=" + newUserId);
             }
+            // update color inversion setting to the new user
+            mColorInversionSetting.setUserId(newUserId);
+            updateColorInversion(mColorInversionSetting.getValue());
         }
     };
 
@@ -945,7 +948,12 @@
             int dw = flipped ? lh : lw;
             int dh = flipped ? lw : lh;
 
-            mBoundingPath.set(DisplayCutout.pathFromResources(getResources(), dw, dh));
+            Path path = DisplayCutout.pathFromResources(getResources(), dw, dh);
+            if (path != null) {
+                mBoundingPath.set(path);
+            } else {
+                mBoundingPath.reset();
+            }
             Matrix m = new Matrix();
             transformPhysicalToLogicalCoordinates(mInfo.rotation, dw, dh, m);
             mBoundingPath.transform(m);
diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/SystemActions.java b/packages/SystemUI/src/com/android/systemui/accessibility/SystemActions.java
index 7262f8c..1f27ae2 100644
--- a/packages/SystemUI/src/com/android/systemui/accessibility/SystemActions.java
+++ b/packages/SystemUI/src/com/android/systemui/accessibility/SystemActions.java
@@ -16,6 +16,8 @@
 
 package com.android.systemui.accessibility;
 
+import static android.view.WindowManager.ScreenshotSource.SCREENSHOT_GLOBAL_ACTIONS;
+
 import android.accessibilityservice.AccessibilityService;
 import android.app.PendingIntent;
 import android.app.RemoteAction;
@@ -282,8 +284,8 @@
 
     private void handleTakeScreenshot() {
         ScreenshotHelper screenshotHelper = new ScreenshotHelper(mContext);
-        screenshotHelper.takeScreenshot(WindowManager.TAKE_SCREENSHOT_FULLSCREEN,
-                true, true, new Handler(Looper.getMainLooper()), null);
+        screenshotHelper.takeScreenshot(WindowManager.TAKE_SCREENSHOT_FULLSCREEN, true, true,
+                SCREENSHOT_GLOBAL_ACTIONS, new Handler(Looper.getMainLooper()), null);
     }
 
     private void handleAccessibilityMenu() {
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthCredentialPasswordView.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthCredentialPasswordView.java
index d8a11d3..e6a62c2 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthCredentialPasswordView.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthCredentialPasswordView.java
@@ -17,6 +17,7 @@
 package com.android.systemui.biometrics;
 
 import android.content.Context;
+import android.os.UserHandle;
 import android.text.InputType;
 import android.util.AttributeSet;
 import android.view.KeyEvent;
@@ -68,6 +69,7 @@
     protected void onAttachedToWindow() {
         super.onAttachedToWindow();
 
+        mPasswordField.setTextOperationUser(UserHandle.of(mUserId));
         if (mCredentialType == Utils.CREDENTIAL_PIN) {
             mPasswordField.setInputType(
                     InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_PASSWORD);
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthCredentialView.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthCredentialView.java
index 8bf2591..496e60d 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthCredentialView.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthCredentialView.java
@@ -286,6 +286,7 @@
 
         if (matched) {
             mClearErrorRunnable.run();
+            mLockPatternUtils.userPresent(mEffectiveUserId);
             mCallback.onCredentialMatched(attestation);
         } else {
             if (timeoutMs > 0) {
diff --git a/packages/SystemUI/src/com/android/systemui/broadcast/BroadcastDispatcher.kt b/packages/SystemUI/src/com/android/systemui/broadcast/BroadcastDispatcher.kt
index 74b94e7..319a6e0 100644
--- a/packages/SystemUI/src/com/android/systemui/broadcast/BroadcastDispatcher.kt
+++ b/packages/SystemUI/src/com/android/systemui/broadcast/BroadcastDispatcher.kt
@@ -25,7 +25,6 @@
 import android.os.Message
 import android.os.UserHandle
 import android.text.TextUtils
-import android.util.Log
 import android.util.SparseArray
 import com.android.internal.annotations.VisibleForTesting
 import com.android.systemui.Dumpable
@@ -34,6 +33,7 @@
 import com.android.systemui.dump.DumpManager
 import java.io.FileDescriptor
 import java.io.PrintWriter
+import java.lang.IllegalStateException
 import java.util.concurrent.Executor
 import javax.inject.Inject
 import javax.inject.Singleton
@@ -189,8 +189,8 @@
                         data.user.identifier
                     }
                     if (userId < UserHandle.USER_ALL) {
-                        if (DEBUG) Log.w(TAG, "Register receiver for invalid user: $userId")
-                        return
+                        throw IllegalStateException(
+                                "Attempting to register receiver for invalid user {$userId}")
                     }
                     val uBR = receiversByUser.get(userId, createUBRForUser(userId))
                     receiversByUser.put(userId, uBR)
diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/Bubble.java b/packages/SystemUI/src/com/android/systemui/bubbles/Bubble.java
index 71f2bc0..38bfffb 100644
--- a/packages/SystemUI/src/com/android/systemui/bubbles/Bubble.java
+++ b/packages/SystemUI/src/com/android/systemui/bubbles/Bubble.java
@@ -90,6 +90,7 @@
     }
 
     private FlyoutMessage mFlyoutMessage;
+    private Drawable mBadgedAppIcon;
     private Bitmap mBadgedImage;
     private int mDotColor;
     private Path mDotPath;
@@ -133,6 +134,10 @@
         return mBadgedImage;
     }
 
+    public Drawable getBadgedAppIcon() {
+        return mBadgedAppIcon;
+    }
+
     @Override
     public int getDotColor() {
         return mDotColor;
@@ -239,6 +244,7 @@
         mAppName = info.appName;
         mFlyoutMessage = info.flyoutMessage;
 
+        mBadgedAppIcon = info.badgedAppIcon;
         mBadgedImage = info.badgedBubbleImage;
         mDotColor = info.dotColor;
         mDotPath = info.dotPath;
diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java
index 669a86b..4d7eb75 100644
--- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java
+++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java
@@ -17,6 +17,8 @@
 package com.android.systemui.bubbles;
 
 import static android.app.Notification.FLAG_BUBBLE;
+import static android.app.NotificationManager.BUBBLE_PREFERENCE_NONE;
+import static android.app.NotificationManager.BUBBLE_PREFERENCE_SELECTED;
 import static android.service.notification.NotificationListenerService.REASON_APP_CANCEL;
 import static android.service.notification.NotificationListenerService.REASON_APP_CANCEL_ALL;
 import static android.service.notification.NotificationListenerService.REASON_CANCEL;
@@ -30,7 +32,6 @@
 import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
 
 import static com.android.systemui.bubbles.BubbleDebugConfig.DEBUG_BUBBLE_CONTROLLER;
-import static com.android.systemui.bubbles.BubbleDebugConfig.DEBUG_EXPERIMENTS;
 import static com.android.systemui.bubbles.BubbleDebugConfig.TAG_BUBBLES;
 import static com.android.systemui.bubbles.BubbleDebugConfig.TAG_WITH_CLASS_NAME;
 import static com.android.systemui.statusbar.StatusBarState.SHADE;
@@ -43,6 +44,9 @@
 
 import android.annotation.UserIdInt;
 import android.app.ActivityManager.RunningTaskInfo;
+import android.app.INotificationManager;
+import android.app.Notification;
+import android.app.NotificationChannel;
 import android.app.NotificationManager;
 import android.app.PendingIntent;
 import android.content.Context;
@@ -50,6 +54,7 @@
 import android.content.pm.PackageManager;
 import android.content.res.Configuration;
 import android.graphics.Rect;
+import android.os.Handler;
 import android.os.RemoteException;
 import android.os.ServiceManager;
 import android.service.notification.NotificationListenerService;
@@ -83,6 +88,7 @@
 import com.android.systemui.statusbar.FeatureFlags;
 import com.android.systemui.statusbar.NotificationLockscreenUserManager;
 import com.android.systemui.statusbar.NotificationRemoveInterceptor;
+import com.android.systemui.statusbar.notification.NotificationChannelHelper;
 import com.android.systemui.statusbar.notification.NotificationEntryListener;
 import com.android.systemui.statusbar.notification.NotificationEntryManager;
 import com.android.systemui.statusbar.notification.collection.NotifCollection;
@@ -103,7 +109,6 @@
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
 import java.util.ArrayList;
-import java.util.HashSet;
 import java.util.List;
 
 /**
@@ -119,7 +124,8 @@
     @Retention(SOURCE)
     @IntDef({DISMISS_USER_GESTURE, DISMISS_AGED, DISMISS_TASK_FINISHED, DISMISS_BLOCKED,
             DISMISS_NOTIF_CANCEL, DISMISS_ACCESSIBILITY_ACTION, DISMISS_NO_LONGER_BUBBLE,
-            DISMISS_USER_CHANGED, DISMISS_GROUP_CANCELLED, DISMISS_INVALID_INTENT})
+            DISMISS_USER_CHANGED, DISMISS_GROUP_CANCELLED, DISMISS_INVALID_INTENT,
+            DISMISS_OVERFLOW_MAX_REACHED})
     @Target({FIELD, LOCAL_VARIABLE, PARAMETER})
     @interface DismissReason {}
 
@@ -133,6 +139,7 @@
     static final int DISMISS_USER_CHANGED = 8;
     static final int DISMISS_GROUP_CANCELLED = 9;
     static final int DISMISS_INVALID_INTENT = 10;
+    static final int DISMISS_OVERFLOW_MAX_REACHED = 11;
 
     private final Context mContext;
     private final NotificationEntryManager mNotificationEntryManager;
@@ -157,18 +164,11 @@
     // Used when ranking updates occur and we check if things should bubble / unbubble
     private NotificationListenerService.Ranking mTmpRanking;
 
-    // Saves notification keys of user created "fake" bubbles so that we can allow notifications
-    // like these to bubble by default. Doesn't persist across reboots, not a long-term solution.
-    private final HashSet<String> mUserCreatedBubbles;
-    // If we're auto-bubbling bubbles via a whitelist, we need to track which notifs from that app
-    // have been "demoted" back to a notification so that we don't auto-bubbles those again.
-    // Doesn't persist across reboots, not a long-term solution.
-    private final HashSet<String> mUserBlockedBubbles;
-
     // Bubbles get added to the status bar view
     private final NotificationShadeWindowController mNotificationShadeWindowController;
     private final ZenModeController mZenModeController;
     private StatusBarStateListener mStatusBarStateListener;
+    private INotificationManager mINotificationManager;
 
     // Callback that updates BubbleOverflowActivity on data change.
     @Nullable private Runnable mOverflowCallback = null;
@@ -177,6 +177,9 @@
     private IStatusBarService mBarService;
     private SysUiState mSysUiState;
 
+    // Used to post to main UI thread
+    private Handler mHandler = new Handler();
+
     // Used for determining view rect for touch interaction
     private Rect mTempRect = new Rect();
 
@@ -293,11 +296,13 @@
             FeatureFlags featureFlags,
             DumpManager dumpManager,
             FloatingContentCoordinator floatingContentCoordinator,
-            SysUiState sysUiState) {
+            SysUiState sysUiState,
+            INotificationManager notificationManager) {
         this(context, notificationShadeWindowController, statusBarStateController, shadeController,
                 data, null /* synchronizer */, configurationController, interruptionStateProvider,
                 zenModeController, notifUserManager, groupManager, entryManager,
-                notifPipeline, featureFlags, dumpManager, floatingContentCoordinator, sysUiState);
+                notifPipeline, featureFlags, dumpManager, floatingContentCoordinator, sysUiState,
+                notificationManager);
     }
 
     /**
@@ -319,7 +324,8 @@
             FeatureFlags featureFlags,
             DumpManager dumpManager,
             FloatingContentCoordinator floatingContentCoordinator,
-            SysUiState sysUiState) {
+            SysUiState sysUiState,
+            INotificationManager notificationManager) {
         dumpManager.registerDumpable(TAG, this);
         mContext = context;
         mShadeController = shadeController;
@@ -327,6 +333,7 @@
         mNotifUserManager = notifUserManager;
         mZenModeController = zenModeController;
         mFloatingContentCoordinator = floatingContentCoordinator;
+        mINotificationManager = notificationManager;
         mZenModeController.addCallback(new ZenModeController.Callback() {
             @Override
             public void onZenChanged(int zen) {
@@ -402,9 +409,6 @@
                     }
                 });
 
-        mUserCreatedBubbles = new HashSet<>();
-        mUserBlockedBubbles = new HashSet<>();
-
         mBubbleIconFactory = new BubbleIconFactory(context);
     }
 
@@ -464,11 +468,9 @@
                                 (entry != null && entry.isRowDismissed() && !isAppCancel)
                                 || isClearAll || isUserDimiss || isSummaryCancel;
 
-                        if (userRemovedNotif || isUserCreatedBubble(key)
-                                || isSummaryOfUserCreatedBubble(entry)) {
+                        if (userRemovedNotif) {
                             return handleDismissalInterception(entry);
                         }
-
                         return false;
                     }
                 });
@@ -608,6 +610,9 @@
             if (mExpandListener != null) {
                 mStackView.setExpandListener(mExpandListener);
             }
+
+            mStackView.setUnbubbleConversationCallback(notificationEntry ->
+                    onUserChangedBubble(notificationEntry, false /* shouldBubble */));
         }
     }
 
@@ -736,18 +741,18 @@
      */
     public boolean isBubbleNotificationSuppressedFromShade(NotificationEntry entry) {
         String key = entry.getKey();
-        boolean isBubbleAndSuppressed = mBubbleData.hasBubbleWithKey(key)
-                && !mBubbleData.getBubbleWithKey(key).showInShade();
+        boolean isSuppressedBubble = (mBubbleData.hasAnyBubbleWithKey(key)
+                && !mBubbleData.getAnyBubbleWithkey(key).showInShade());
 
         String groupKey = entry.getSbn().getGroupKey();
         boolean isSuppressedSummary = mBubbleData.isSummarySuppressed(groupKey);
         boolean isSummary = key.equals(mBubbleData.getSummaryKey(groupKey));
-
-        return (isSummary && isSuppressedSummary) || isBubbleAndSuppressed;
+        return (isSummary && isSuppressedSummary) || isSuppressedBubble;
     }
 
     void promoteBubbleFromOverflow(Bubble bubble) {
         bubble.setInflateSynchronously(mInflateSynchronously);
+        setIsBubble(bubble, /* isBubble */ true);
         mBubbleData.promoteBubbleFromOverflow(bubble, mStackView, mBubbleIconFactory);
     }
 
@@ -757,11 +762,16 @@
      * @param notificationKey the notification key for the bubble to be selected
      */
     public void expandStackAndSelectBubble(String notificationKey) {
-        Bubble bubble = mBubbleData.getBubbleWithKey(notificationKey);
-        if (bubble != null) {
+        Bubble bubble = mBubbleData.getBubbleInStackWithKey(notificationKey);
+        if (bubble == null) {
+            bubble = mBubbleData.getOverflowBubbleWithKey(notificationKey);
+            if (bubble != null) {
+                mBubbleData.promoteBubbleFromOverflow(bubble, mStackView, mBubbleIconFactory);
+            }
+        } else if (bubble.getEntry().isBubble()){
             mBubbleData.setSelectedBubble(bubble);
-            mBubbleData.setExpanded(true);
         }
+        mBubbleData.setExpanded(true);
     }
 
     /**
@@ -799,7 +809,17 @@
         Bubble bubble = mBubbleData.getOrCreateBubble(notif);
         bubble.setInflateSynchronously(mInflateSynchronously);
         bubble.inflate(
-                b -> mBubbleData.notificationEntryUpdated(b, suppressFlyout, showInShade),
+                b -> {
+                    mBubbleData.notificationEntryUpdated(b, suppressFlyout, showInShade);
+                    if (bubble.getBubbleIntent() == null) {
+                        return;
+                    }
+                    bubble.getBubbleIntent().registerCancelListener(pendingIntent -> {
+                        mHandler.post(
+                                () -> removeBubble(bubble.getEntry(),
+                                        BubbleController.DISMISS_INVALID_INTENT));
+                    });
+                },
                 mContext, mStackView, mBubbleIconFactory);
     }
 
@@ -809,59 +829,44 @@
      * This method will collapse the shade, create the bubble without a flyout or dot, and suppress
      * the notification from appearing in the shade.
      *
-     * @param entry the notification to show as a bubble.
+     * @param entry the notification to change bubble state for.
+     * @param shouldBubble whether the notification should show as a bubble or not.
      */
-    public void onUserCreatedBubbleFromNotification(NotificationEntry entry) {
-        if (DEBUG_EXPERIMENTS || DEBUG_BUBBLE_CONTROLLER) {
-            Log.d(TAG, "onUserCreatedBubble: " + entry.getKey());
+    public void onUserChangedBubble(NotificationEntry entry, boolean shouldBubble) {
+        NotificationChannel channel = entry.getChannel();
+        final String appPkg = entry.getSbn().getPackageName();
+        final int appUid = entry.getSbn().getUid();
+        if (channel == null || appPkg == null) {
+            return;
         }
-        mShadeController.collapsePanel(true);
-        entry.setFlagBubble(true);
-        updateBubble(entry, true /* suppressFlyout */, false /* showInShade */);
-        mUserCreatedBubbles.add(entry.getKey());
-        mUserBlockedBubbles.remove(entry.getKey());
-    }
 
-    /**
-     * Called when a user has indicated that an active notification appearing as a bubble should
-     * no longer be shown as a bubble.
-     *
-     * @param entry the notification to no longer show as a bubble.
-     */
-    public void onUserDemotedBubbleFromNotification(NotificationEntry entry) {
-        if (DEBUG_EXPERIMENTS || DEBUG_BUBBLE_CONTROLLER) {
-            Log.d(TAG, "onUserDemotedBubble: " + entry.getKey());
+        // Update the state in NotificationManagerService
+        try {
+            int flags = Notification.BubbleMetadata.FLAG_SUPPRESS_NOTIFICATION;
+            mBarService.onNotificationBubbleChanged(entry.getKey(), shouldBubble, flags);
+        } catch (RemoteException e) {
         }
-        entry.setFlagBubble(false);
-        removeBubble(entry, DISMISS_BLOCKED);
-        mUserCreatedBubbles.remove(entry.getKey());
-        if (BubbleExperimentConfig.isPackageWhitelistedToAutoBubble(
-                mContext, entry.getSbn().getPackageName())) {
-            // This package is whitelist but user demoted the bubble, let's save it so we don't
-            // auto-bubble for the whitelist again.
-            mUserBlockedBubbles.add(entry.getKey());
+
+        // Change the settings
+        channel = NotificationChannelHelper.createConversationChannelIfNeeded(mContext,
+                mINotificationManager, entry, channel);
+        channel.setAllowBubbles(shouldBubble);
+        try {
+            int currentPref = mINotificationManager.getBubblePreferenceForPackage(appPkg, appUid);
+            if (shouldBubble && currentPref == BUBBLE_PREFERENCE_NONE) {
+                mINotificationManager.setBubblesAllowed(appPkg, appUid, BUBBLE_PREFERENCE_SELECTED);
+            }
+            mINotificationManager.updateNotificationChannelForPackage(appPkg, appUid, channel);
+        } catch (RemoteException e) {
+            Log.e(TAG, e.getMessage());
         }
-    }
 
-    /**
-     * Whether this bubble was explicitly created by the user via a SysUI affordance.
-     */
-    boolean isUserCreatedBubble(String key) {
-        return mUserCreatedBubbles.contains(key);
-    }
-
-    boolean isSummaryOfUserCreatedBubble(NotificationEntry entry) {
-        if (isSummaryOfBubbles(entry)) {
-            List<Bubble> bubbleChildren =
-                    mBubbleData.getBubblesInGroup(entry.getSbn().getGroupKey());
-            for (int i = 0; i < bubbleChildren.size(); i++) {
-                // Check if any are user-created (i.e. experimental bubbles)
-                if (isUserCreatedBubble(bubbleChildren.get(i).getKey())) {
-                    return true;
-                }
+        if (shouldBubble) {
+            mShadeController.collapsePanel(true);
+            if (entry.getRow() != null) {
+                entry.getRow().updateBubbleButton();
             }
         }
-        return false;
     }
 
     /**
@@ -871,43 +876,25 @@
      */
     @MainThread
     void removeBubble(NotificationEntry entry, int reason) {
-        if (mBubbleData.hasBubbleWithKey(entry.getKey())) {
+        if (mBubbleData.hasAnyBubbleWithKey(entry.getKey())) {
             mBubbleData.notificationEntryRemoved(entry, reason);
         }
     }
 
     private void onEntryAdded(NotificationEntry entry) {
-        boolean previouslyUserCreated = mUserCreatedBubbles.contains(entry.getKey());
-        boolean userBlocked = mUserBlockedBubbles.contains(entry.getKey());
-        boolean wasAdjusted = BubbleExperimentConfig.adjustForExperiments(
-                mContext, entry, previouslyUserCreated, userBlocked);
-
         if (mNotificationInterruptStateProvider.shouldBubbleUp(entry)
-                && (canLaunchInActivityView(mContext, entry) || wasAdjusted)) {
-            if (wasAdjusted && !previouslyUserCreated) {
-                // Gotta treat the auto-bubbled / whitelisted packaged bubbles as usercreated
-                mUserCreatedBubbles.add(entry.getKey());
-            }
+                && canLaunchInActivityView(mContext, entry)) {
             updateBubble(entry);
         }
     }
 
     private void onEntryUpdated(NotificationEntry entry) {
-        boolean previouslyUserCreated = mUserCreatedBubbles.contains(entry.getKey());
-        boolean userBlocked = mUserBlockedBubbles.contains(entry.getKey());
-        boolean wasAdjusted = BubbleExperimentConfig.adjustForExperiments(
-                mContext, entry, previouslyUserCreated, userBlocked);
-
         boolean shouldBubble = mNotificationInterruptStateProvider.shouldBubbleUp(entry)
-                && (canLaunchInActivityView(mContext, entry) || wasAdjusted);
-        if (!shouldBubble && mBubbleData.hasBubbleWithKey(entry.getKey())) {
+                && canLaunchInActivityView(mContext, entry);
+        if (!shouldBubble && mBubbleData.hasAnyBubbleWithKey(entry.getKey())) {
             // It was previously a bubble but no longer a bubble -- lets remove it
             removeBubble(entry, DISMISS_NO_LONGER_BUBBLE);
         } else if (shouldBubble) {
-            if (wasAdjusted && !previouslyUserCreated) {
-                // Gotta treat the auto-bubbled / whitelisted packaged bubbles as usercreated
-                mUserCreatedBubbles.add(entry.getKey());
-            }
             updateBubble(entry);
         }
     }
@@ -943,7 +930,7 @@
             String key = orderedKeys[i];
             NotificationEntry entry = mNotificationEntryManager.getPendingOrActiveNotif(key);
             rankingMap.getRanking(key, mTmpRanking);
-            boolean isActiveBubble = mBubbleData.hasBubbleWithKey(key);
+            boolean isActiveBubble = mBubbleData.hasAnyBubbleWithKey(key);
             if (isActiveBubble && !mTmpRanking.canBubble()) {
                 mBubbleData.notificationEntryRemoved(entry, BubbleController.DISMISS_BLOCKED);
             } else if (entry != null && mTmpRanking.isBubble() && !isActiveBubble) {
@@ -953,6 +940,19 @@
         }
     }
 
+    private void setIsBubble(Bubble b, boolean isBubble) {
+        if (isBubble) {
+            b.getEntry().getSbn().getNotification().flags |= FLAG_BUBBLE;
+        } else {
+            b.getEntry().getSbn().getNotification().flags &= ~FLAG_BUBBLE;
+        }
+        try {
+            mBarService.onNotificationBubbleChanged(b.getKey(), isBubble, 0);
+        } catch (RemoteException e) {
+            // Bad things have happened
+        }
+    }
+
     @SuppressWarnings("FieldCanBeLocal")
     private final BubbleData.Listener mBubbleDataListener = new BubbleData.Listener() {
 
@@ -975,35 +975,36 @@
                 final Bubble bubble = removed.first;
                 @DismissReason final int reason = removed.second;
                 mStackView.removeBubble(bubble);
+
                 // If the bubble is removed for user switching, leave the notification in place.
-                if (reason != DISMISS_USER_CHANGED) {
-                    if (!mBubbleData.hasBubbleWithKey(bubble.getKey())
-                            && !bubble.showInShade()) {
+                if (reason == DISMISS_USER_CHANGED) {
+                    continue;
+                }
+                if (!mBubbleData.hasBubbleInStackWithKey(bubble.getKey())) {
+                    if (!mBubbleData.hasOverflowBubbleWithKey(bubble.getKey())
+                        && (!bubble.showInShade()
+                            || reason == DISMISS_NOTIF_CANCEL
+                            || reason == DISMISS_GROUP_CANCELLED)) {
                         // The bubble is now gone & the notification is hidden from the shade, so
                         // time to actually remove it
                         for (NotifCallback cb : mCallbacks) {
                             cb.removeNotification(bubble.getEntry(), REASON_CANCEL);
                         }
                     } else {
-                        // Update the flag for SysUI
-                        bubble.getEntry().getSbn().getNotification().flags &= ~FLAG_BUBBLE;
-
-                        // Make sure NoMan knows it's not a bubble anymore so anyone querying it
-                        // will get right result back
-                        try {
-                            mBarService.onNotificationBubbleChanged(bubble.getKey(),
-                                    false /* isBubble */);
-                        } catch (RemoteException e) {
-                            // Bad things have happened
+                        if (bubble.getEntry().isBubble() && bubble.showInShade()) {
+                            setIsBubble(bubble, /* isBubble */ false);
+                        }
+                        if (bubble.getEntry().getRow() != null) {
+                            bubble.getEntry().getRow().updateBubbleButton();
                         }
                     }
 
-                    final String groupKey = bubble.getEntry().getSbn().getGroupKey();
-                    if (mBubbleData.getBubblesInGroup(groupKey).isEmpty()) {
-                        // Time to potentially remove the summary
-                        for (NotifCallback cb : mCallbacks) {
-                            cb.maybeCancelSummary(bubble.getEntry());
-                        }
+                }
+                final String groupKey = bubble.getEntry().getSbn().getGroupKey();
+                if (mBubbleData.getBubblesInGroup(groupKey).isEmpty()) {
+                    // Time to potentially remove the summary
+                    for (NotifCallback cb : mCallbacks) {
+                        cb.maybeCancelSummary(bubble.getEntry());
                     }
                 }
             }
@@ -1052,7 +1053,7 @@
                 }
                 Log.d(TAG, "\n[BubbleData] overflow:");
                 Log.d(TAG, BubbleDebugConfig.formatBubblesString(mBubbleData.getOverflowBubbles(),
-                        null));
+                        null) + "\n");
             }
         }
     };
@@ -1071,21 +1072,19 @@
         if (entry == null) {
             return false;
         }
-
-        final boolean interceptBubbleDismissal = mBubbleData.hasBubbleWithKey(entry.getKey())
-                && entry.isBubble();
-        final boolean interceptSummaryDismissal = isSummaryOfBubbles(entry);
-
-        if (interceptSummaryDismissal) {
+        if (isSummaryOfBubbles(entry)) {
             handleSummaryDismissalInterception(entry);
-        } else if (interceptBubbleDismissal) {
-            Bubble bubble = mBubbleData.getBubbleWithKey(entry.getKey());
+        } else {
+            Bubble bubble = mBubbleData.getBubbleInStackWithKey(entry.getKey());
+            if (bubble == null || !entry.isBubble()) {
+                bubble = mBubbleData.getOverflowBubbleWithKey(entry.getKey());
+            }
+            if (bubble == null) {
+                return false;
+            }
             bubble.setSuppressNotification(true);
             bubble.setShowDot(false /* show */);
-        } else {
-            return false;
         }
-
         // Update the shade
         for (NotifCallback cb : mCallbacks) {
             cb.invalidateNotifications("BubbleController.handleDismissalInterception");
@@ -1110,15 +1109,15 @@
 
     private void handleSummaryDismissalInterception(NotificationEntry summary) {
         // current children in the row:
-        final List<NotificationEntry> children = summary.getChildren();
+        final List<NotificationEntry> children = summary.getAttachedNotifChildren();
         if (children != null) {
             for (int i = 0; i < children.size(); i++) {
                 NotificationEntry child = children.get(i);
-                if (mBubbleData.hasBubbleWithKey(child.getKey())) {
+                if (mBubbleData.hasAnyBubbleWithKey(child.getKey())) {
                     // Suppress the bubbled child
                     // As far as group manager is concerned, once a child is no longer shown
                     // in the shade, it is essentially removed.
-                    Bubble bubbleChild = mBubbleData.getBubbleWithKey(child.getKey());
+                    Bubble bubbleChild = mBubbleData.getAnyBubbleWithkey(child.getKey());
                     mNotificationGroupManager.onEntryRemoved(bubbleChild.getEntry());
                     bubbleChild.setSuppressNotification(true);
                     bubbleChild.setShowDot(false /* show */);
diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleData.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleData.java
index 4c149dd..35a4811 100644
--- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleData.java
+++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleData.java
@@ -120,9 +120,10 @@
     /** Bubbles that are being loaded but haven't been added to the stack just yet. */
     private final List<Bubble> mPendingBubbles;
     private Bubble mSelectedBubble;
+    private boolean mShowingOverflow;
     private boolean mExpanded;
     private final int mMaxBubbles;
-    private final int mMaxOverflowBubbles;
+    private int mMaxOverflowBubbles;
 
     // State tracked during an operation -- keeps track of what listener events to dispatch.
     private Update mStateChange;
@@ -174,8 +175,16 @@
         return mExpanded;
     }
 
-    public boolean hasBubbleWithKey(String key) {
-        return getBubbleWithKey(key) != null;
+    public boolean hasAnyBubbleWithKey(String key) {
+        return hasBubbleInStackWithKey(key) || hasOverflowBubbleWithKey(key);
+    }
+
+    public boolean hasBubbleInStackWithKey(String key) {
+        return getBubbleInStackWithKey(key) != null;
+    }
+
+    public boolean hasOverflowBubbleWithKey(String key) {
+        return getOverflowBubbleWithKey(key) != null;
     }
 
     @Nullable
@@ -205,6 +214,8 @@
             Log.d(TAG, "promoteBubbleFromOverflow: " + bubble);
         }
         moveOverflowBubbleToPending(bubble);
+        // Preserve new order for next repack, which sorts by last updated time.
+        bubble.markUpdatedAt(mTimeSource.currentTimeMillis());
         bubble.inflate(
                 b -> {
                     notificationEntryUpdated(bubble, /* suppressFlyout */
@@ -215,9 +226,11 @@
         dispatchPendingChanges();
     }
 
+    void setShowingOverflow(boolean showingOverflow) {
+        mShowingOverflow = showingOverflow;
+    }
+
     private void moveOverflowBubbleToPending(Bubble b) {
-        // Preserve new order for next repack, which sorts by last updated time.
-        b.markUpdatedAt(mTimeSource.currentTimeMillis());
         mOverflowBubbles.remove(b);
         mPendingBubbles.add(b);
     }
@@ -228,15 +241,16 @@
      * for that.
      */
     Bubble getOrCreateBubble(NotificationEntry entry) {
-        Bubble bubble = getBubbleWithKey(entry.getKey());
-        if (bubble == null) {
-            for (int i = 0; i < mOverflowBubbles.size(); i++) {
-                Bubble b = mOverflowBubbles.get(i);
-                if (b.getKey().equals(entry.getKey())) {
-                    moveOverflowBubbleToPending(b);
-                    b.setEntry(entry);
-                    return b;
-                }
+        String key = entry.getKey();
+        Bubble bubble = getBubbleInStackWithKey(entry.getKey());
+        if (bubble != null) {
+            bubble.setEntry(entry);
+        } else {
+            bubble = getOverflowBubbleWithKey(key);
+            if (bubble != null) {
+                moveOverflowBubbleToPending(bubble);
+                bubble.setEntry(entry);
+                return bubble;
             }
             // Check for it in pending
             for (int i = 0; i < mPendingBubbles.size(); i++) {
@@ -248,8 +262,6 @@
             }
             bubble = new Bubble(entry, mSuppressionListener);
             mPendingBubbles.add(bubble);
-        } else {
-            bubble.setEntry(entry);
         }
         return bubble;
     }
@@ -264,7 +276,7 @@
             Log.d(TAG, "notificationEntryUpdated: " + bubble);
         }
         mPendingBubbles.remove(bubble); // No longer pending once we're here
-        Bubble prevBubble = getBubbleWithKey(bubble.getKey());
+        Bubble prevBubble = getBubbleInStackWithKey(bubble.getKey());
         suppressFlyout |= !bubble.getEntry().getRanking().visuallyInterruptive();
 
         if (prevBubble == null) {
@@ -417,6 +429,19 @@
         }
         int indexToRemove = indexForKey(key);
         if (indexToRemove == -1) {
+            if (hasOverflowBubbleWithKey(key)
+                && (reason == BubbleController.DISMISS_NOTIF_CANCEL
+                || reason == BubbleController.DISMISS_GROUP_CANCELLED
+                || reason == BubbleController.DISMISS_NO_LONGER_BUBBLE
+                || reason == BubbleController.DISMISS_BLOCKED)) {
+
+                Bubble b = getOverflowBubbleWithKey(key);
+                if (DEBUG_BUBBLE_DATA) {
+                    Log.d(TAG, "Cancel overflow bubble: " + b);
+                }
+                mStateChange.bubbleRemoved(b, reason);
+                mOverflowBubbles.remove(b);
+            }
             return;
         }
         Bubble bubbleToRemove = mBubbles.get(indexToRemove);
@@ -448,21 +473,23 @@
     }
 
     void overflowBubble(@DismissReason int reason, Bubble bubble) {
-        if (reason == BubbleController.DISMISS_AGED
-                || reason == BubbleController.DISMISS_USER_GESTURE) {
+        if (!(reason == BubbleController.DISMISS_AGED
+                || reason == BubbleController.DISMISS_USER_GESTURE)) {
+            return;
+        }
+        if (DEBUG_BUBBLE_DATA) {
+            Log.d(TAG, "Overflowing: " + bubble);
+        }
+        mOverflowBubbles.add(0, bubble);
+        bubble.stopInflation();
+        if (mOverflowBubbles.size() == mMaxOverflowBubbles + 1) {
+            // Remove oldest bubble.
+            Bubble oldest = mOverflowBubbles.get(mOverflowBubbles.size() - 1);
             if (DEBUG_BUBBLE_DATA) {
-                Log.d(TAG, "Overflowing: " + bubble);
+                Log.d(TAG, "Overflow full. Remove: " + oldest);
             }
-            mOverflowBubbles.add(0, bubble);
-            bubble.stopInflation();
-            if (mOverflowBubbles.size() == mMaxOverflowBubbles + 1) {
-                // Remove oldest bubble.
-                if (DEBUG_BUBBLE_DATA) {
-                    Log.d(TAG, "Overflow full. Remove: " + mOverflowBubbles.get(
-                            mOverflowBubbles.size() - 1));
-                }
-                mOverflowBubbles.remove(mOverflowBubbles.size() - 1);
-            }
+            mStateChange.bubbleRemoved(oldest, BubbleController.DISMISS_OVERFLOW_MAX_REACHED);
+            mOverflowBubbles.remove(oldest);
         }
     }
 
@@ -513,9 +540,11 @@
         if (DEBUG_BUBBLE_DATA) {
             Log.d(TAG, "setSelectedBubbleInternal: " + bubble);
         }
-        if (Objects.equals(bubble, mSelectedBubble)) {
+        if (!mShowingOverflow && Objects.equals(bubble, mSelectedBubble)) {
             return;
         }
+        // Otherwise, if we are showing the overflow menu, return to the previously selected bubble.
+
         if (bubble != null && !mBubbles.contains(bubble) && !mOverflowBubbles.contains(bubble)) {
             Log.e(TAG, "Cannot select bubble which doesn't exist!"
                     + " (" + bubble + ") bubbles=" + mBubbles);
@@ -559,6 +588,10 @@
             mStateChange.orderChanged |= repackAll();
             // Save the state which should be returned to when expanded (with no other changes)
 
+            if (mShowingOverflow) {
+                // Show previously selected bubble instead of overflow menu on next expansion.
+                setSelectedBubbleInternal(mSelectedBubble);
+            }
             if (mBubbles.indexOf(mSelectedBubble) > 0) {
                 // Move the selected bubble to the top while collapsed.
                 if (!mSelectedBubble.isOngoing() && mBubbles.get(0).isOngoing()) {
@@ -753,7 +786,17 @@
 
     @VisibleForTesting(visibility = PRIVATE)
     @Nullable
-    Bubble getBubbleWithKey(String key) {
+    Bubble getAnyBubbleWithkey(String key) {
+        Bubble b = getBubbleInStackWithKey(key);
+        if (b == null) {
+            b = getOverflowBubbleWithKey(key);
+        }
+        return b;
+    }
+
+    @VisibleForTesting(visibility = PRIVATE)
+    @Nullable
+    Bubble getBubbleInStackWithKey(String key) {
         for (int i = 0; i < mBubbles.size(); i++) {
             Bubble bubble = mBubbles.get(i);
             if (bubble.getKey().equals(key)) {
@@ -795,6 +838,15 @@
     }
 
     /**
+     * Set maximum number of bubbles allowed in overflow.
+     * This method should only be used in tests, not in production.
+     */
+    @VisibleForTesting
+    void setMaxOverflowBubbles(int maxOverflowBubbles) {
+        mMaxOverflowBubbles = maxOverflowBubbles;
+    }
+
+    /**
      * Description of current bubble data state.
      */
     public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java
index 93fb697..bb236555 100644
--- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java
+++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java
@@ -43,7 +43,6 @@
 import android.graphics.Rect;
 import android.graphics.drawable.ShapeDrawable;
 import android.os.RemoteException;
-import android.service.notification.StatusBarNotification;
 import android.util.AttributeSet;
 import android.util.Log;
 import android.view.View;
@@ -55,14 +54,13 @@
 import com.android.systemui.Dependency;
 import com.android.systemui.R;
 import com.android.systemui.recents.TriangleShape;
-import com.android.systemui.shared.system.SysUiStatsLog;
 import com.android.systemui.statusbar.AlphaOptimizedButton;
 import com.android.systemui.statusbar.notification.collection.NotificationEntry;
 
 /**
  * Container for the expanded bubble view, handles rendering the caret and settings icon.
  */
-public class BubbleExpandedView extends LinearLayout implements View.OnClickListener {
+public class BubbleExpandedView extends LinearLayout {
     private static final String TAG = TAG_WITH_CLASS_NAME ? "BubbleExpandedView" : TAG_BUBBLES;
 
     private enum ActivityViewStatus {
@@ -100,9 +98,6 @@
     private int mPointerWidth;
     private int mPointerHeight;
     private ShapeDrawable mPointerDrawable;
-    private Rect mTempRect = new Rect();
-    private int[] mTempLoc = new int[2];
-    private int mExpandedViewTouchSlop;
 
     @Nullable private Bubble mBubble;
 
@@ -193,7 +188,7 @@
                         + " mActivityViewStatus=" + mActivityViewStatus
                         + " bubble=" + getBubbleKey());
             }
-            if (mBubble != null && !mBubbleController.isUserCreatedBubble(mBubble.getKey())) {
+            if (mBubble != null) {
                 // Must post because this is called from a binder thread.
                 post(() -> mBubbleController.removeBubble(mBubble.getEntry(),
                         BubbleController.DISMISS_TASK_FINISHED));
@@ -224,7 +219,6 @@
         mMinHeight = res.getDimensionPixelSize(R.dimen.bubble_expanded_default_height);
         mOverflowHeight = res.getDimensionPixelSize(R.dimen.bubble_overflow_height);
         mPointerMargin = res.getDimensionPixelSize(R.dimen.bubble_pointer_margin);
-        mExpandedViewTouchSlop = res.getDimensionPixelSize(R.dimen.bubble_expanded_view_slop);
     }
 
     @Override
@@ -239,7 +233,6 @@
         mPointerWidth = res.getDimensionPixelSize(R.dimen.bubble_pointer_width);
         mPointerHeight = res.getDimensionPixelSize(R.dimen.bubble_pointer_height);
 
-
         mPointerDrawable = new ShapeDrawable(TriangleShape.create(
                 mPointerWidth, mPointerHeight, true /* pointUp */));
         mPointerView.setBackground(mPointerDrawable);
@@ -248,7 +241,6 @@
         mSettingsIconHeight = getContext().getResources().getDimensionPixelSize(
                 R.dimen.bubble_manage_button_height);
         mSettingsIcon = findViewById(R.id.settings_button);
-        mSettingsIcon.setOnClickListener(this);
 
         mActivityView = new ActivityView(mContext, null /* attrs */, 0 /* defStyle */,
                 true /* singleTaskInstance */);
@@ -289,6 +281,19 @@
         return mBubble != null ? mBubble.getEntry() : null;
     }
 
+    void setManageClickListener(OnClickListener manageClickListener) {
+        findViewById(R.id.settings_button).setOnClickListener(manageClickListener);
+    }
+
+    /**
+     * Updates the ActivityView's obscured touchable region. This calls onLocationChanged, which
+     * results in a call to {@link BubbleStackView#subtractObscuredTouchableRegion}. This is useful
+     * if a view has been added or removed from on top of the ActivityView, such as the manage menu.
+     */
+    void updateObscuredTouchableRegion() {
+        mActivityView.onLocationChanged();
+    }
+
     void applyThemeAttrs() {
         final TypedArray ta = mContext.obtainStyledAttributes(
                 new int[] {
@@ -473,51 +478,6 @@
     }
 
     /**
-     * Whether the provided x, y values (in raw coordinates) are in a touchable area of the
-     * expanded view.
-     *
-     * The touchable areas are the ActivityView (plus some slop around it) and the manage button.
-     */
-    boolean intersectingTouchableContent(int rawX, int rawY) {
-        mTempRect.setEmpty();
-        if (mActivityView != null) {
-            mTempLoc = mActivityView.getLocationOnScreen();
-            mTempRect.set(mTempLoc[0] - mExpandedViewTouchSlop,
-                    mTempLoc[1] - mExpandedViewTouchSlop,
-                    mTempLoc[0] + mActivityView.getWidth() + mExpandedViewTouchSlop,
-                    mTempLoc[1] + mActivityView.getHeight() + mExpandedViewTouchSlop);
-        }
-        if (mTempRect.contains(rawX, rawY)) {
-            return true;
-        }
-        mTempLoc = mSettingsIcon.getLocationOnScreen();
-        mTempRect.set(mTempLoc[0],
-                mTempLoc[1],
-                mTempLoc[0] + mSettingsIcon.getWidth(),
-                mTempLoc[1] + mSettingsIcon.getHeight());
-        if (mTempRect.contains(rawX, rawY)) {
-            return true;
-        }
-        return false;
-    }
-
-    @Override
-    public void onClick(View view) {
-        if (mBubble == null) {
-            return;
-        }
-        int id = view.getId();
-        if (id == R.id.settings_button) {
-            Intent intent = mBubble.getSettingsIntent();
-            mStackView.collapseStack(() -> {
-                mContext.startActivityAsUser(intent, mBubble.getEntry().getSbn().getUser());
-                logBubbleClickEvent(mBubble,
-                        SysUiStatsLog.BUBBLE_UICHANGED__ACTION__HEADER_GO_TO_SETTINGS);
-            });
-        }
-    }
-
-    /**
      * Update appearance of the expanded view being displayed.
      */
     public void updateView() {
@@ -547,10 +507,8 @@
      * Position of the manage button displayed in the expanded view. Used for placing user
      * education about the manage button.
      */
-    public Rect getManageButtonLocationOnScreen() {
-        mTempLoc = mSettingsIcon.getLocationOnScreen();
-        return new Rect(mTempLoc[0], mTempLoc[1], mTempLoc[0] + mSettingsIcon.getWidth(),
-                mTempLoc[1] + mSettingsIcon.getHeight());
+    public void getManageButtonBoundsOnScreen(Rect rect) {
+        mSettingsIcon.getBoundsOnScreen(rect);
     }
 
     /**
@@ -611,26 +569,4 @@
         }
         return INVALID_DISPLAY;
     }
-
-    /**
-     * Logs bubble UI click event.
-     *
-     * @param bubble the bubble notification entry that user is interacting with.
-     * @param action the user interaction enum.
-     */
-    private void logBubbleClickEvent(Bubble bubble, int action) {
-        StatusBarNotification notification = bubble.getEntry().getSbn();
-        SysUiStatsLog.write(SysUiStatsLog.BUBBLE_UI_CHANGED,
-                notification.getPackageName(),
-                notification.getNotification().getChannelId(),
-                notification.getId(),
-                mStackView.getBubbleIndex(mStackView.getExpandedBubble()),
-                mStackView.getBubbleCount(),
-                action,
-                mStackView.getNormalizedXPosition(),
-                mStackView.getNormalizedYPosition(),
-                bubble.showInShade(),
-                bubble.isOngoing(),
-                false /* isAppForeground (unused) */);
-    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExperimentConfig.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExperimentConfig.java
index 41dbb48..a888bd5 100644
--- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExperimentConfig.java
+++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExperimentConfig.java
@@ -57,16 +57,13 @@
 public class BubbleExperimentConfig {
     private static final String TAG = TAG_WITH_CLASS_NAME ? "BubbleController" : TAG_BUBBLES;
 
-    private static final String SHORTCUT_DUMMY_INTENT = "bubble_experiment_shortcut_intent";
-    private static PendingIntent sDummyShortcutIntent;
-
     private static final int BUBBLE_HEIGHT = 10000;
 
     private static final String ALLOW_ANY_NOTIF_TO_BUBBLE = "allow_any_notif_to_bubble";
     private static final boolean ALLOW_ANY_NOTIF_TO_BUBBLE_DEFAULT = false;
 
     private static final String ALLOW_MESSAGE_NOTIFS_TO_BUBBLE = "allow_message_notifs_to_bubble";
-    private static final boolean ALLOW_MESSAGE_NOTIFS_TO_BUBBLE_DEFAULT = true;
+    private static final boolean ALLOW_MESSAGE_NOTIFS_TO_BUBBLE_DEFAULT = false;
 
     private static final String ALLOW_SHORTCUTS_TO_BUBBLE = "allow_shortcuts_to_bubble";
     private static final boolean ALLOW_SHORTCUT_TO_BUBBLE_DEFAULT = false;
@@ -74,7 +71,7 @@
     private static final String WHITELISTED_AUTO_BUBBLE_APPS = "whitelisted_auto_bubble_apps";
 
     private static final String ALLOW_BUBBLE_OVERFLOW = "allow_bubble_overflow";
-    private static final boolean ALLOW_BUBBLE_OVERFLOW_DEFAULT = false;
+    private static final boolean ALLOW_BUBBLE_OVERFLOW_DEFAULT = true;
 
     /**
      * When true, if a notification has the information necessary to bubble (i.e. valid
diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java
index 71dbbbc..d870c11 100644
--- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java
+++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java
@@ -33,12 +33,14 @@
 import android.annotation.SuppressLint;
 import android.app.Notification;
 import android.content.Context;
+import android.content.Intent;
 import android.content.res.Configuration;
 import android.content.res.Resources;
 import android.content.res.TypedArray;
 import android.graphics.Color;
 import android.graphics.ColorMatrix;
 import android.graphics.ColorMatrixColorFilter;
+import android.graphics.Outline;
 import android.graphics.Paint;
 import android.graphics.Point;
 import android.graphics.PointF;
@@ -47,6 +49,7 @@
 import android.graphics.Region;
 import android.os.Bundle;
 import android.os.Vibrator;
+import android.service.notification.StatusBarNotification;
 import android.util.Log;
 import android.view.Choreographer;
 import android.view.DisplayCutout;
@@ -55,6 +58,7 @@
 import android.view.MotionEvent;
 import android.view.View;
 import android.view.ViewGroup;
+import android.view.ViewOutlineProvider;
 import android.view.ViewTreeObserver;
 import android.view.WindowInsets;
 import android.view.WindowManager;
@@ -62,6 +66,7 @@
 import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction;
 import android.view.animation.AccelerateDecelerateInterpolator;
 import android.widget.FrameLayout;
+import android.widget.ImageView;
 import android.widget.TextView;
 
 import androidx.annotation.MainThread;
@@ -83,6 +88,7 @@
 import com.android.systemui.model.SysUiState;
 import com.android.systemui.shared.system.QuickStepContract;
 import com.android.systemui.shared.system.SysUiStatsLog;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
 import com.android.systemui.statusbar.phone.NotificationShadeWindowController;
 import com.android.systemui.util.DismissCircleView;
 import com.android.systemui.util.FloatingContentCoordinator;
@@ -97,6 +103,7 @@
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.function.Consumer;
 
 /**
  * Renders bubbles in a stack and handles animating expanded and collapsed states.
@@ -224,7 +231,7 @@
     private int mPointerHeight;
     private int mStatusBarHeight;
     private int mImeOffset;
-    private BubbleViewProvider mExpandedBubble;
+    @Nullable private BubbleViewProvider mExpandedBubble;
     private boolean mIsExpanded;
 
     /** Whether the stack is currently on the left side of the screen, or animating there. */
@@ -244,6 +251,10 @@
     }
 
     private BubbleController.BubbleExpandListener mExpandListener;
+
+    /** Callback to run when we want to unbubble the given notification's conversation. */
+    private Consumer<NotificationEntry> mUnbubbleConversationCallback;
+
     private SysUiState mSysUiState;
 
     private boolean mViewUpdatedRequested = false;
@@ -255,9 +266,7 @@
 
     private LayoutInflater mInflater;
 
-    // Used for determining view / touch intersection
-    int[] mTempLoc = new int[2];
-    RectF mTempRect = new RectF();
+    private Rect mTempRect = new Rect();
 
     private final List<Rect> mSystemGestureExclusionRects = Collections.singletonList(new Rect());
 
@@ -374,8 +383,9 @@
                 @Override
                 public void onReleasedInTarget(@NonNull MagnetizedObject.MagneticTarget target) {
                     mExpandedAnimationController.dismissDraggedOutBubble(
-                            mExpandedAnimationController.getDraggedOutBubble(),
-                            BubbleStackView.this::dismissMagnetizedObject);
+                            mExpandedAnimationController.getDraggedOutBubble() /* bubble */,
+                            mDismissTargetContainer.getHeight() /* translationYBy */,
+                            BubbleStackView.this::dismissMagnetizedObject /* after */);
                     hideDismissTarget();
                 }
             };
@@ -405,7 +415,8 @@
 
                 @Override
                 public void onReleasedInTarget(@NonNull MagnetizedObject.MagneticTarget target) {
-                    mStackAnimationController.implodeStack(
+                    mStackAnimationController.animateStackDismissal(
+                            mDismissTargetContainer.getHeight() /* translationYBy */,
                             () -> {
                                 resetDesaturationAndDarken();
                                 dismissMagnetizedObject();
@@ -442,8 +453,8 @@
                     // that means overflow was previously expanded. Set the selected bubble
                     // internally without going through BubbleData (which would ignore it since it's
                     // already selected).
+                    mBubbleData.setShowingOverflow(true);
                     setSelectedBubble(clickedBubble);
-
                 }
             } else {
                 // Otherwise, we either tapped the stack (which means we're collapsed
@@ -469,6 +480,11 @@
                 return true;
             }
 
+            // If the manage menu is visible, just hide it.
+            if (mShowingManage) {
+                showManageMenu(false /* show */);
+            }
+
             if (mBubbleData.isExpanded()) {
                 maybeShowManageEducation(false /* show */);
 
@@ -625,6 +641,13 @@
     private BubbleManageEducationView mManageEducationView;
     private boolean mAnimatingManageEducationAway;
 
+    private ViewGroup mManageMenu;
+    private ImageView mManageSettingsIcon;
+    private TextView mManageSettingsText;
+    private boolean mShowingManage = false;
+    private PhysicsAnimator.SpringConfig mManageSpringConfig = new PhysicsAnimator.SpringConfig(
+            SpringForce.STIFFNESS_MEDIUM, SpringForce.DAMPING_RATIO_LOW_BOUNCY);
+
     @SuppressLint("ClickableViewAccessibility")
     public BubbleStackView(Context context, BubbleData data,
             @Nullable SurfaceSynchronizer synchronizer,
@@ -687,6 +710,8 @@
         mExpandedViewContainer.setClipChildren(false);
         addView(mExpandedViewContainer);
 
+        setUpManageMenu();
+
         setUpFlyout();
         mFlyoutTransitionSpring.setSpring(new SpringForce()
                 .setStiffness(SpringForce.STIFFNESS_LOW)
@@ -836,7 +861,9 @@
         // ActivityViews, etc.) were touched. Collapse the stack if it's expanded.
         setOnTouchListener((view, ev) -> {
             if (ev.getAction() == MotionEvent.ACTION_DOWN) {
-                if (mBubbleData.isExpanded()) {
+                if (mShowingManage) {
+                    showManageMenu(false /* show */);
+                } else if (mBubbleData.isExpanded()) {
                     mBubbleData.setExpanded(false);
                 }
             }
@@ -845,6 +872,66 @@
         });
     }
 
+    private void setUpManageMenu() {
+        if (mManageMenu != null) {
+            removeView(mManageMenu);
+        }
+
+        mManageMenu = (ViewGroup) LayoutInflater.from(getContext()).inflate(
+                R.layout.bubble_manage_menu, this, false);
+        mManageMenu.setVisibility(View.INVISIBLE);
+
+        PhysicsAnimator.getInstance(mManageMenu).setDefaultSpringConfig(mManageSpringConfig);
+
+        final TypedArray ta = mContext.obtainStyledAttributes(
+                new int[] {android.R.attr.dialogCornerRadius});
+        final int menuCornerRadius = ta.getDimensionPixelSize(0, 0);
+        ta.recycle();
+
+        mManageMenu.setOutlineProvider(new ViewOutlineProvider() {
+            @Override
+            public void getOutline(View view, Outline outline) {
+                outline.setRoundRect(0, 0, view.getWidth(), view.getHeight(), menuCornerRadius);
+            }
+        });
+        mManageMenu.setClipToOutline(true);
+
+        mManageMenu.findViewById(R.id.bubble_manage_menu_dismiss_container).setOnClickListener(
+                view -> {
+                    showManageMenu(false /* show */);
+                    dismissBubbleIfExists(mBubbleData.getSelectedBubble());
+                });
+
+        mManageMenu.findViewById(R.id.bubble_manage_menu_dont_bubble_container).setOnClickListener(
+                view -> {
+                    showManageMenu(false /* show */);
+                    final Bubble bubble = mBubbleData.getSelectedBubble();
+                    if (bubble != null && mBubbleData.hasBubbleInStackWithKey(bubble.getKey())) {
+                        mUnbubbleConversationCallback.accept(bubble.getEntry());
+                    }
+                });
+
+        mManageMenu.findViewById(R.id.bubble_manage_menu_settings_container).setOnClickListener(
+                view -> {
+                    showManageMenu(false /* show */);
+                    final Bubble bubble = mBubbleData.getSelectedBubble();
+                    if (bubble != null && mBubbleData.hasBubbleInStackWithKey(bubble.getKey())) {
+                        final Intent intent = bubble.getSettingsIntent();
+                        collapseStack(() -> {
+                            mContext.startActivityAsUser(
+                                    intent, bubble.getEntry().getSbn().getUser());
+                            logBubbleClickEvent(
+                                    bubble,
+                                    SysUiStatsLog.BUBBLE_UICHANGED__ACTION__HEADER_GO_TO_SETTINGS);
+                        });
+                    }
+                });
+
+        mManageSettingsIcon = mManageMenu.findViewById(R.id.bubble_manage_menu_settings_icon);
+        mManageSettingsText = mManageMenu.findViewById(R.id.bubble_manage_menu_settings_name);
+        addView(mManageMenu);
+    }
+
     private void setUpUserEducation() {
         if (mUserEducationView != null) {
             removeView(mUserEducationView);
@@ -932,6 +1019,7 @@
         setUpFlyout();
         setUpOverflow();
         setUpUserEducation();
+        setUpManageMenu();
     }
 
     /** Respond to the phone being rotated by repositioning the stack and hiding any flyouts. */
@@ -954,8 +1042,13 @@
         mVerticalPosPercentBeforeRotation =
                 (mStackAnimationController.getStackPosition().y - allowablePos.top)
                         / (allowablePos.bottom - allowablePos.top);
+        mVerticalPosPercentBeforeRotation =
+                Math.max(0f, Math.min(1f, mVerticalPosPercentBeforeRotation));
         addOnLayoutChangeListener(mOrientationChangedListener);
         hideFlyoutImmediate();
+
+        mManageMenu.setVisibility(View.INVISIBLE);
+        mShowingManage = false;
     }
 
     @Override
@@ -1096,6 +1189,12 @@
         mExpandListener = listener;
     }
 
+    /** Sets the function to call to un-bubble the given conversation. */
+    public void setUnbubbleConversationCallback(
+            Consumer<NotificationEntry> unbubbleConversationCallback) {
+        mUnbubbleConversationCallback = unbubbleConversationCallback;
+    }
+
     /**
      * Whether the stack of bubbles is expanded or not.
      */
@@ -1232,8 +1331,12 @@
         if (mExpandedBubble != null && mExpandedBubble.equals(bubbleToSelect)) {
             return;
         }
+        if (bubbleToSelect == null || bubbleToSelect.getKey() != BubbleOverflow.KEY) {
+            mBubbleData.setShowingOverflow(false);
+        }
         final BubbleViewProvider previouslySelected = mExpandedBubble;
         mExpandedBubble = bubbleToSelect;
+        updatePointerPosition();
 
         if (mIsExpanded) {
             // Make the container of the expanded view transparent before removing the expanded view
@@ -1243,7 +1346,6 @@
             mSurfaceSynchronizer.syncSurfaceAndRun(() -> {
                 previouslySelected.setContentVisibility(false);
                 updateExpandedBubble();
-                updatePointerPosition();
                 requestUpdate();
 
                 logBubbleEvent(previouslySelected,
@@ -1354,15 +1456,14 @@
             mManageEducationView.setAlpha(0);
             mManageEducationView.setVisibility(VISIBLE);
             mManageEducationView.post(() -> {
-                final Rect position =
-                        mExpandedBubble.getExpandedView().getManageButtonLocationOnScreen();
+                mExpandedBubble.getExpandedView().getManageButtonBoundsOnScreen(mTempRect);
                 final int viewHeight = mManageEducationView.getManageViewHeight();
                 final int inset = getResources().getDimensionPixelSize(
                         R.dimen.bubbles_manage_education_top_inset);
                 mManageEducationView.bringToFront();
-                mManageEducationView.setManageViewPosition(position.left,
-                        position.top - viewHeight + inset);
-                mManageEducationView.setPointerPosition(position.centerX() - position.left);
+                mManageEducationView.setManageViewPosition(mTempRect.left,
+                        mTempRect.top - viewHeight + inset);
+                mManageEducationView.setPointerPosition(mTempRect.centerX() - mTempRect.left);
                 mManageEducationView.animate()
                         .setDuration(ANIMATE_STACK_USER_EDUCATION_DURATION)
                         .setInterpolator(FAST_OUT_SLOW_IN).alpha(1);
@@ -1436,6 +1537,9 @@
     }
 
     private void animateCollapse() {
+        // Hide the menu if it's visible.
+        showManageMenu(false);
+
         mIsExpanded = false;
         final BubbleViewProvider previouslySelected = mExpandedBubble;
         beforeExpandedViewAnimation();
@@ -1563,9 +1667,9 @@
      */
     @Override
     public void subtractObscuredTouchableRegion(Region touchableRegion, View view) {
-        // If the notification shade is expanded, we shouldn't let the ActivityView steal any touch
-        // events from any location.
-        if (mNotificationShadeWindowController.getPanelExpanded()) {
+        // If the notification shade is expanded, or the manage menu is open, we shouldn't let the
+        // ActivityView steal any touch events from any location.
+        if (mNotificationShadeWindowController.getPanelExpanded() || mShowingManage) {
             touchableRegion.setEmpty();
         }
     }
@@ -1651,17 +1755,19 @@
     private void dismissMagnetizedObject() {
         if (mIsExpanded) {
             final View draggedOutBubbleView = (View) mMagnetizedObject.getUnderlyingObject();
-            final Bubble draggedOutBubble = mBubbleData.getBubbleWithView(draggedOutBubbleView);
-
-            if (mBubbleData.hasBubbleWithKey(draggedOutBubble.getKey())) {
-                mBubbleData.notificationEntryRemoved(
-                        draggedOutBubble.getEntry(), BubbleController.DISMISS_USER_GESTURE);
-            }
+            dismissBubbleIfExists(mBubbleData.getBubbleWithView(draggedOutBubbleView));
         } else {
             mBubbleData.dismissAll(BubbleController.DISMISS_USER_GESTURE);
         }
     }
 
+    private void dismissBubbleIfExists(@Nullable Bubble bubble) {
+        if (bubble != null && mBubbleData.hasBubbleInStackWithKey(bubble.getKey())) {
+            mBubbleData.notificationEntryRemoved(
+                    bubble.getEntry(), BubbleController.DISMISS_USER_GESTURE);
+        }
+    }
+
     /** Prepares and starts the desaturate/darken animation on the bubble stack. */
     private void animateDesaturateAndDarken(View targetView, boolean desaturateAndDarken) {
         mDesaturateAndDarkenTargetView = targetView;
@@ -1905,6 +2011,63 @@
         invalidate();
     }
 
+    private void showManageMenu(boolean show) {
+        mShowingManage = show;
+
+        // This should not happen, since the manage menu is only visible when there's an expanded
+        // bubble. If we end up in this state, just hide the menu immediately.
+        if (mExpandedBubble == null || mExpandedBubble.getExpandedView() == null) {
+            mManageMenu.setVisibility(View.INVISIBLE);
+            return;
+        }
+
+        // If available, update the manage menu's settings option with the expanded bubble's app
+        // name and icon.
+        if (show && mBubbleData.hasBubbleInStackWithKey(mExpandedBubble.getKey())) {
+            final Bubble bubble = mBubbleData.getBubbleInStackWithKey(mExpandedBubble.getKey());
+            mManageSettingsIcon.setImageDrawable(bubble.getBadgedAppIcon());
+            mManageSettingsText.setText(getResources().getString(
+                    R.string.bubbles_app_settings, bubble.getAppName()));
+        }
+
+        mExpandedBubble.getExpandedView().getManageButtonBoundsOnScreen(mTempRect);
+
+        // When the menu is open, it should be at these coordinates. This will make the menu's
+        // bottom left corner match up with the button's bottom left corner.
+        final float targetX = mTempRect.left;
+        final float targetY = mTempRect.bottom - mManageMenu.getHeight();
+
+        if (show) {
+            mManageMenu.setScaleX(0.5f);
+            mManageMenu.setScaleY(0.5f);
+            mManageMenu.setTranslationX(targetX - mManageMenu.getWidth() / 4);
+            mManageMenu.setTranslationY(targetY + mManageMenu.getHeight() / 4);
+            mManageMenu.setAlpha(0f);
+
+            PhysicsAnimator.getInstance(mManageMenu)
+                    .spring(DynamicAnimation.ALPHA, 1f)
+                    .spring(DynamicAnimation.SCALE_X, 1f)
+                    .spring(DynamicAnimation.SCALE_Y, 1f)
+                    .spring(DynamicAnimation.TRANSLATION_X, targetX)
+                    .spring(DynamicAnimation.TRANSLATION_Y, targetY)
+                    .start();
+
+            mManageMenu.setVisibility(View.VISIBLE);
+        } else {
+            PhysicsAnimator.getInstance(mManageMenu)
+                    .spring(DynamicAnimation.ALPHA, 0f)
+                    .spring(DynamicAnimation.SCALE_X, 0.5f)
+                    .spring(DynamicAnimation.SCALE_Y, 0.5f)
+                    .spring(DynamicAnimation.TRANSLATION_X, targetX - mManageMenu.getWidth() / 4)
+                    .spring(DynamicAnimation.TRANSLATION_Y, targetY + mManageMenu.getHeight() / 4)
+                    .withEndActions(() -> mManageMenu.setVisibility(View.INVISIBLE))
+                    .start();
+        }
+
+        // Update the AV's obscured touchable region for the new menu visibility state.
+        mExpandedBubble.getExpandedView().updateObscuredTouchableRegion();
+    }
+
     private void updateExpandedBubble() {
         if (DEBUG_BUBBLE_STACK_VIEW) {
             Log.d(TAG, "updateExpandedBubble()");
@@ -1914,6 +2077,7 @@
                 && mExpandedBubble.getExpandedView() != null) {
             BubbleExpandedView bev = mExpandedBubble.getExpandedView();
             mExpandedViewContainer.addView(bev);
+            bev.setManageClickListener((view) -> showManageMenu(!mShowingManage));
             bev.populateExpandedView();
             mExpandedViewContainer.setVisibility(VISIBLE);
             mExpandedViewContainer.setAlpha(1.0f);
@@ -2076,10 +2240,32 @@
             View child = mBubbleContainer.getChildAt(i);
             if (child instanceof BadgedImageView) {
                 String key = ((BadgedImageView) child).getKey();
-                Bubble bubble = mBubbleData.getBubbleWithKey(key);
+                Bubble bubble = mBubbleData.getBubbleInStackWithKey(key);
                 bubbles.add(bubble);
             }
         }
         return bubbles;
     }
+
+    /**
+     * Logs bubble UI click event.
+     *
+     * @param bubble the bubble notification entry that user is interacting with.
+     * @param action the user interaction enum.
+     */
+    private void logBubbleClickEvent(Bubble bubble, int action) {
+        StatusBarNotification notification = bubble.getEntry().getSbn();
+        SysUiStatsLog.write(SysUiStatsLog.BUBBLE_UI_CHANGED,
+                notification.getPackageName(),
+                notification.getNotification().getChannelId(),
+                notification.getId(),
+                getBubbleIndex(getExpandedBubble()),
+                getBubbleCount(),
+                action,
+                getNormalizedXPosition(),
+                getNormalizedYPosition(),
+                bubble.showInShade(),
+                bubble.isOngoing(),
+                false /* isAppForeground (unused) */);
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleViewInfoTask.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleViewInfoTask.java
index 501e502..8a57a73 100644
--- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleViewInfoTask.java
+++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleViewInfoTask.java
@@ -116,6 +116,7 @@
         ShortcutInfo shortcutInfo;
         String appName;
         Bitmap badgedBubbleImage;
+        Drawable badgedAppIcon;
         int dotColor;
         Path dotPath;
         Bubble.FlyoutMessage flyoutMessage;
@@ -139,22 +140,11 @@
             StatusBarNotification sbn = b.getEntry().getSbn();
             String packageName = sbn.getPackageName();
 
-            // Real shortcut info for this bubble
             String bubbleShortcutId =  b.getEntry().getBubbleMetadata().getShortcutId();
             if (bubbleShortcutId != null) {
-                info.shortcutInfo = BubbleExperimentConfig.getShortcutInfo(c, packageName,
-                        sbn.getUser(), bubbleShortcutId);
-            } else {
-                // Check for experimental shortcut
-                String shortcutId = sbn.getNotification().getShortcutId();
-                if (BubbleExperimentConfig.useShortcutInfoToBubble(c) && shortcutId != null) {
-                    info.shortcutInfo = BubbleExperimentConfig.getShortcutInfo(c,
-                            packageName,
-                            sbn.getUser(), shortcutId);
-                }
+                info.shortcutInfo = b.getEntry().getRanking().getShortcutInfo();
             }
 
-
             // App name & app icon
             PackageManager pm = c.getPackageManager();
             ApplicationInfo appInfo;
@@ -187,6 +177,7 @@
             }
 
             BitmapInfo badgeBitmapInfo = iconFactory.getBadgeBitmap(badgedIcon);
+            info.badgedAppIcon = badgedIcon;
             info.badgedBubbleImage = iconFactory.getBubbleBitmap(bubbleDrawable,
                     badgeBitmapInfo).icon;
 
diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleViewProvider.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleViewProvider.java
index ef84c73..ca3e2e2 100644
--- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleViewProvider.java
+++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleViewProvider.java
@@ -20,15 +20,17 @@
 import android.graphics.Path;
 import android.view.View;
 
+import androidx.annotation.Nullable;
+
 /**
  * Interface to represent actual Bubbles and UI elements that act like bubbles, like BubbleOverflow.
  */
 interface BubbleViewProvider {
-    BubbleExpandedView getExpandedView();
+    @Nullable BubbleExpandedView getExpandedView();
 
     void setContentVisibility(boolean visible);
 
-    View getIconView();
+    @Nullable View getIconView();
 
     void logUIEvent(int bubbleCount, int action, float normalX, float normalY, int index);
 
diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/animation/ExpandedAnimationController.java b/packages/SystemUI/src/com/android/systemui/bubbles/animation/ExpandedAnimationController.java
index d974adc..35406c7 100644
--- a/packages/SystemUI/src/com/android/systemui/bubbles/animation/ExpandedAnimationController.java
+++ b/packages/SystemUI/src/com/android/systemui/bubbles/animation/ExpandedAnimationController.java
@@ -128,15 +128,29 @@
      */
     private boolean mBubbleDraggedOutEnough = false;
 
+    /** End action to run when the lead bubble's expansion animation completes. */
+    @Nullable private Runnable mLeadBubbleEndAction;
+
+    /**
+     * Animates expanding the bubbles into a row along the top of the screen, optionally running an
+     * end action when the entire animation completes, and an end action when the lead bubble's
+     * animation ends.
+     */
+    public void expandFromStack(
+            @Nullable Runnable after, @Nullable Runnable leadBubbleEndAction) {
+        mAnimatingCollapse = false;
+        mAnimatingExpand = true;
+        mAfterExpand = after;
+        mLeadBubbleEndAction = leadBubbleEndAction;
+
+        startOrUpdatePathAnimation(true /* expanding */);
+    }
+
     /**
      * Animates expanding the bubbles into a row along the top of the screen.
      */
     public void expandFromStack(@Nullable Runnable after) {
-        mAnimatingCollapse = false;
-        mAnimatingExpand = true;
-        mAfterExpand = after;
-
-        startOrUpdatePathAnimation(true /* expanding */);
+        expandFromStack(after, null /* leadBubbleEndAction */);
     }
 
     /** Animate collapsing the bubbles back to their stacked position. */
@@ -237,11 +251,17 @@
                     ? (index * 10)
                     : ((mLayout.getChildCount() - index) * 10);
 
+            final boolean isLeadBubble =
+                    (firstBubbleLeads && index == 0)
+                            || (!firstBubbleLeads && index == mLayout.getChildCount() - 1);
+
             animation
                     .followAnimatedTargetAlongPath(
                             path,
                             EXPAND_COLLAPSE_TARGET_ANIM_DURATION /* targetAnimDuration */,
-                            Interpolators.LINEAR /* targetAnimInterpolator */)
+                            Interpolators.LINEAR /* targetAnimInterpolator */,
+                            isLeadBubble ? mLeadBubbleEndAction : null /* endAction */,
+                            () -> mLeadBubbleEndAction = null /* endAction */)
                     .withStartDelay(startDelay)
                     .withStiffness(EXPAND_COLLAPSE_ANIM_STIFFNESS);
         }).startAll(after);
@@ -329,7 +349,7 @@
     }
 
     /** Plays a dismiss animation on the dragged out bubble. */
-    public void dismissDraggedOutBubble(View bubble, Runnable after) {
+    public void dismissDraggedOutBubble(View bubble, float translationYBy, Runnable after) {
         if (bubble == null) {
             return;
         }
@@ -337,6 +357,7 @@
                 .withStiffness(SpringForce.STIFFNESS_HIGH)
                 .scaleX(1.1f)
                 .scaleY(1.1f)
+                .translationY(bubble.getTranslationY() + translationYBy)
                 .alpha(0f, after)
                 .start();
 
diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/animation/PhysicsAnimationLayout.java b/packages/SystemUI/src/com/android/systemui/bubbles/animation/PhysicsAnimationLayout.java
index b1bbafc..a7d1be1 100644
--- a/packages/SystemUI/src/com/android/systemui/bubbles/animation/PhysicsAnimationLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/bubbles/animation/PhysicsAnimationLayout.java
@@ -758,21 +758,34 @@
          * or {@link #position}, ultimately animating the view's position to the final point on the
          * given path.
          *
-         * Any provided end listeners will be called when the physics-based animations kicked off by
-         * the moving target have completed - not when the target animation completes.
+         * @param pathAnimEndActions End actions to run after the animator that moves the target
+         *                           along the path ends. The views following the target may still
+         *                           be moving.
          */
         public PhysicsPropertyAnimator followAnimatedTargetAlongPath(
                 Path path,
                 int targetAnimDuration,
                 TimeInterpolator targetAnimInterpolator,
-                Runnable... endActions) {
+                Runnable... pathAnimEndActions) {
             mPathAnimator = ObjectAnimator.ofFloat(
                     this, mCurrentPointOnPathXProperty, mCurrentPointOnPathYProperty, path);
+
+            if (pathAnimEndActions != null) {
+                mPathAnimator.addListener(new AnimatorListenerAdapter() {
+                    @Override
+                    public void onAnimationEnd(Animator animation) {
+                        for (Runnable action : pathAnimEndActions) {
+                            if (action != null) {
+                                action.run();
+                            }
+                        }
+                    }
+                });
+            }
+
             mPathAnimator.setDuration(targetAnimDuration);
             mPathAnimator.setInterpolator(targetAnimInterpolator);
 
-            mPositionEndActions = endActions;
-
             // Remove translation related values since we're going to ignore them and follow the
             // path instead.
             clearTranslationValues();
diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/animation/StackAnimationController.java b/packages/SystemUI/src/com/android/systemui/bubbles/animation/StackAnimationController.java
index 00de8b4..5f3a2bd 100644
--- a/packages/SystemUI/src/com/android/systemui/bubbles/animation/StackAnimationController.java
+++ b/packages/SystemUI/src/com/android/systemui/bubbles/animation/StackAnimationController.java
@@ -647,17 +647,18 @@
     }
 
     /**
-     * 'Implode' the stack by shrinking the bubbles via chained animations and fading them out.
+     * 'Implode' the stack by shrinking the bubbles, fading them out, and translating them down.
      */
-    public void implodeStack(Runnable after) {
-        // Pop and fade the bubbles sequentially.
-        animationForChildAtIndex(0)
-                .scaleX(0.5f)
-                .scaleY(0.5f)
-                .alpha(0f)
-                .withDampingRatio(SpringForce.DAMPING_RATIO_NO_BOUNCY)
-                .withStiffness(SpringForce.STIFFNESS_HIGH)
-                .start(after);
+    public void animateStackDismissal(float translationYBy, Runnable after) {
+        animationsForChildrenFromIndex(0, (index, animation) ->
+                animation
+                        .scaleX(0.5f)
+                        .scaleY(0.5f)
+                        .alpha(0f)
+                        .translationY(
+                                mLayout.getChildAt(index).getTranslationY() + translationYBy)
+                        .withStiffness(SpringForce.STIFFNESS_HIGH))
+                .startAll(after);
     }
 
     /**
@@ -710,8 +711,6 @@
         if (property.equals(DynamicAnimation.TRANSLATION_X)
                 || property.equals(DynamicAnimation.TRANSLATION_Y)) {
             return index + 1;
-        } else if (isStackStuckToTarget()) {
-            return index + 1; // Chain all animations in dismiss (scale, alpha, etc. are used).
         } else {
             return NONE;
         }
diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/dagger/BubbleModule.java b/packages/SystemUI/src/com/android/systemui/bubbles/dagger/BubbleModule.java
index e84e932..72d646e 100644
--- a/packages/SystemUI/src/com/android/systemui/bubbles/dagger/BubbleModule.java
+++ b/packages/SystemUI/src/com/android/systemui/bubbles/dagger/BubbleModule.java
@@ -16,6 +16,7 @@
 
 package com.android.systemui.bubbles.dagger;
 
+import android.app.INotificationManager;
 import android.content.Context;
 
 import com.android.systemui.bubbles.BubbleController;
@@ -64,14 +65,15 @@
             FeatureFlags featureFlags,
             DumpManager dumpManager,
             FloatingContentCoordinator floatingContentCoordinator,
-            SysUiState sysUiState) {
+            SysUiState sysUiState,
+            INotificationManager notifManager) {
         return new BubbleController(
                 context,
                 notificationShadeWindowController,
                 statusBarStateController,
                 shadeController,
                 data,
-                /* synchronizer */null,
+                null /* synchronizer */,
                 configurationController,
                 interruptionStateProvider,
                 zenModeController,
@@ -82,6 +84,7 @@
                 featureFlags,
                 dumpManager,
                 floatingContentCoordinator,
-                sysUiState);
+                sysUiState,
+                notifManager);
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsBindingControllerImpl.kt b/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsBindingControllerImpl.kt
index 7e8fec7..e84f439 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsBindingControllerImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsBindingControllerImpl.kt
@@ -31,6 +31,7 @@
 import com.android.systemui.dagger.qualifiers.Background
 import com.android.systemui.util.concurrency.DelayableExecutor
 import dagger.Lazy
+import java.util.concurrent.atomic.AtomicBoolean
 import javax.inject.Inject
 import javax.inject.Singleton
 
@@ -284,13 +285,19 @@
         val requestLimit: Long
     ) : IControlsSubscriber.Stub() {
         val loadedControls = ArrayList<Control>()
-        private var isTerminated = false
+        private var isTerminated = AtomicBoolean(false)
         private var _loadCancelInternal: (() -> Unit)? = null
         private lateinit var subscription: IControlsSubscription
 
+        /**
+         * Potentially cancel a subscriber. The subscriber may also have terminated, in which case
+         * the request is ignored.
+         */
         fun loadCancel() = Runnable {
-            Log.d(TAG, "Cancel load requested")
-            _loadCancelInternal?.invoke()
+            _loadCancelInternal?.let {
+                Log.d(TAG, "Canceling loadSubscribtion")
+                it.invoke()
+            }
         }
 
         override fun onSubscribe(token: IBinder, subs: IControlsSubscription) {
@@ -301,7 +308,7 @@
 
         override fun onNext(token: IBinder, c: Control) {
             backgroundExecutor.execute {
-                if (isTerminated) return@execute
+                if (isTerminated.get()) return@execute
 
                 loadedControls.add(c)
 
@@ -325,13 +332,15 @@
         }
 
         private fun maybeTerminateAndRun(postTerminateFn: Runnable) {
-            if (isTerminated) return
+            if (isTerminated.get()) return
 
-            isTerminated = true
             _loadCancelInternal = {}
             currentProvider?.cancelLoadTimeout()
 
-            backgroundExecutor.execute(postTerminateFn)
+            backgroundExecutor.execute {
+                isTerminated.compareAndSet(false, true)
+                postTerminateFn.run()
+            }
         }
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsController.kt b/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsController.kt
index 7cab847..bc97c10 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsController.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsController.kt
@@ -23,6 +23,7 @@
 import com.android.systemui.controls.ControlStatus
 import com.android.systemui.controls.UserAwareController
 import com.android.systemui.controls.management.ControlsFavoritingActivity
+import com.android.systemui.controls.ui.ControlWithState
 import com.android.systemui.controls.ui.ControlsUiController
 import java.util.function.Consumer
 
@@ -51,19 +52,17 @@
      * Load all available [Control] for a given service.
      *
      * @param componentName the [ComponentName] of the [ControlsProviderService] to load from
-     * @param dataCallback a callback in which to retrieve the result.
+     * @param dataCallback a callback in which to retrieve the result
+     * @param cancelWrapper a callback to receive a [Runnable] that can be run to cancel the
+     *                      request
      */
     fun loadForComponent(
         componentName: ComponentName,
-        dataCallback: Consumer<LoadData>
+        dataCallback: Consumer<LoadData>,
+        cancelWrapper: Consumer<Runnable>
     )
 
     /**
-     * Cancels a pending load call
-     */
-    fun cancelLoad()
-
-    /**
      * Request to subscribe for favorited controls per structure
      *
      * @param structureInfo structure to limit the subscription to
@@ -111,6 +110,13 @@
         @ControlAction.ResponseResult response: Int
     )
 
+    /**
+     * When a control should be highlighted, dimming down what's around it.
+     *
+     * @param cws focused control, or {@code null} if nothing should be highlighted.
+     */
+    fun onFocusChanged(cws: ControlWithState?)
+
     // FAVORITE MANAGEMENT
 
     /**
diff --git a/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsControllerImpl.kt b/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsControllerImpl.kt
index 6d34009..8e88756b 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsControllerImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsControllerImpl.kt
@@ -41,6 +41,7 @@
 import com.android.systemui.controls.ControlStatus
 import com.android.systemui.controls.ControlsServiceInfo
 import com.android.systemui.controls.management.ControlsListingController
+import com.android.systemui.controls.ui.ControlWithState
 import com.android.systemui.controls.ui.ControlsUiController
 import com.android.systemui.dagger.qualifiers.Background
 import com.android.systemui.dump.DumpManager
@@ -76,8 +77,6 @@
 
     private var userChanging: Boolean = true
 
-    private var loadCanceller: Runnable? = null
-
     private var seedingInProgress = false
     private val seedingCallbacks = mutableListOf<Consumer<Boolean>>()
 
@@ -275,28 +274,29 @@
 
     override fun loadForComponent(
         componentName: ComponentName,
-        dataCallback: Consumer<ControlsController.LoadData>
+        dataCallback: Consumer<ControlsController.LoadData>,
+        cancelWrapper: Consumer<Runnable>
     ) {
         if (!confirmAvailability()) {
             if (userChanging) {
                 // Try again later, userChanging should not last forever. If so, we have bigger
                 // problems. This will return a runnable that allows to cancel the delayed version,
                 // it will not be able to cancel the load if
-                loadCanceller = executor.executeDelayed(
-                        { loadForComponent(componentName, dataCallback) },
-                        USER_CHANGE_RETRY_DELAY,
-                        TimeUnit.MILLISECONDS
+                executor.executeDelayed(
+                    { loadForComponent(componentName, dataCallback, cancelWrapper) },
+                    USER_CHANGE_RETRY_DELAY,
+                    TimeUnit.MILLISECONDS
                 )
-            } else {
-                dataCallback.accept(createLoadDataObject(emptyList(), emptyList(), true))
             }
-            return
+
+            dataCallback.accept(createLoadDataObject(emptyList(), emptyList(), true))
         }
-        loadCanceller = bindingController.bindAndLoad(
+
+        cancelWrapper.accept(
+            bindingController.bindAndLoad(
                 componentName,
                 object : ControlsBindingController.LoadCallback {
                     override fun accept(controls: List<Control>) {
-                        loadCanceller = null
                         executor.execute {
                             val favoritesForComponentKeys = Favorites
                                 .getControlsForComponent(componentName).map { it.controlId }
@@ -332,7 +332,6 @@
                     }
 
                     override fun error(message: String) {
-                        loadCanceller = null
                         executor.execute {
                             val controls = Favorites.getStructuresForComponent(componentName)
                                     .flatMap { st ->
@@ -347,6 +346,7 @@
                         }
                     }
                 }
+            )
         )
     }
 
@@ -431,12 +431,6 @@
         seedingCallbacks.clear()
     }
 
-    override fun cancelLoad() {
-        loadCanceller?.let {
-            executor.execute(it)
-        }
-    }
-
     private fun createRemovedStatus(
         componentName: ComponentName,
         controlInfo: ControlInfo,
@@ -504,6 +498,10 @@
         }
     }
 
+    override fun onFocusChanged(cws: ControlWithState?) {
+        uiController.onFocusChanged(cws)
+    }
+
     override fun refreshStatus(componentName: ComponentName, control: Control) {
         if (!confirmAvailability()) {
             Log.d(TAG, "Controls not available")
diff --git a/packages/SystemUI/src/com/android/systemui/controls/management/ControlAdapter.kt b/packages/SystemUI/src/com/android/systemui/controls/management/ControlAdapter.kt
index 607934c..03ca393 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/management/ControlAdapter.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/management/ControlAdapter.kt
@@ -81,7 +81,7 @@
             }
             TYPE_DIVIDER -> {
                 DividerHolder(layoutInflater.inflate(
-                        R.layout.controls_horizontal_divider_withEmpty, parent, false))
+                        R.layout.controls_horizontal_divider_with_empty, parent, false))
             }
             else -> throw IllegalStateException("Wrong viewType: $viewType")
         }
diff --git a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsAnimations.kt b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsAnimations.kt
new file mode 100644
index 0000000..4ca47d1
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsAnimations.kt
@@ -0,0 +1,180 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.controls.management
+
+import android.animation.Animator
+import android.animation.AnimatorListenerAdapter
+import android.animation.AnimatorSet
+import android.animation.ObjectAnimator
+import android.annotation.IdRes
+import android.content.Intent
+
+import android.transition.Transition
+import android.transition.TransitionValues
+import android.util.Log
+import android.view.View
+import android.view.ViewGroup
+import android.view.Window
+
+import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.LifecycleObserver
+import androidx.lifecycle.OnLifecycleEvent
+
+import com.android.systemui.Interpolators
+import com.android.systemui.R
+
+import com.android.systemui.controls.ui.ControlsUiController
+
+object ControlsAnimations {
+
+    private const val ALPHA_EXIT_DURATION = 167L
+    private const val ALPHA_ENTER_DELAY = ALPHA_EXIT_DURATION
+    private const val ALPHA_ENTER_DURATION = 350L - ALPHA_ENTER_DELAY
+
+    private const val Y_TRANSLATION_EXIT_DURATION = 183L
+    private const val Y_TRANSLATION_ENTER_DELAY = Y_TRANSLATION_EXIT_DURATION - ALPHA_ENTER_DELAY
+    private const val Y_TRANSLATION_ENTER_DURATION = 400L - Y_TRANSLATION_EXIT_DURATION
+    private var translationY: Float = -1f
+
+    /**
+     * Setup an activity to handle enter/exit animations. [view] should be the root of the content.
+     * Fade and translate together.
+     */
+    fun observerForAnimations(view: ViewGroup, window: Window, intent: Intent): LifecycleObserver {
+        return object : LifecycleObserver {
+            var showAnimation = intent.getBooleanExtra(ControlsUiController.EXTRA_ANIMATE, false)
+
+            init {
+                // Must flag the parent group to move it all together, and set the initial
+                // transitionAlpha to 0.0f. This property is reserved for fade animations.
+                view.setTransitionGroup(true)
+                view.transitionAlpha = 0.0f
+
+                if (translationY == -1f) {
+                    translationY = view.context.resources.getDimensionPixelSize(
+                        R.dimen.global_actions_controls_y_translation).toFloat()
+                }
+            }
+
+            @OnLifecycleEvent(Lifecycle.Event.ON_START)
+            fun setup() {
+                with(window) {
+                    allowEnterTransitionOverlap = true
+                    enterTransition = enterWindowTransition(view.getId())
+                    exitTransition = exitWindowTransition(view.getId())
+                }
+            }
+
+            @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
+            fun enterAnimation() {
+                if (showAnimation) {
+                    ControlsAnimations.enterAnimation(view).start()
+                    showAnimation = false
+                }
+            }
+        }
+    }
+
+    fun enterAnimation(view: View): Animator {
+        Log.d(ControlsUiController.TAG, "Enter animation for $view")
+
+        view.transitionAlpha = 0.0f
+        view.alpha = 1.0f
+
+        view.translationY = translationY
+
+        val alphaAnimator = ObjectAnimator.ofFloat(view, "transitionAlpha", 0.0f, 1.0f).apply {
+            interpolator = Interpolators.DECELERATE_QUINT
+            startDelay = ALPHA_ENTER_DELAY
+            duration = ALPHA_ENTER_DURATION
+        }
+
+        val yAnimator = ObjectAnimator.ofFloat(view, "translationY", 0.0f).apply {
+            interpolator = Interpolators.DECELERATE_QUINT
+            startDelay = Y_TRANSLATION_ENTER_DURATION
+            duration = Y_TRANSLATION_ENTER_DURATION
+        }
+
+        return AnimatorSet().apply {
+            playTogether(alphaAnimator, yAnimator)
+        }
+    }
+
+    /**
+     * Properly handle animations originating from dialogs. Activity transitions require
+     * transitioning between two activities, so expose this method for dialogs to animate
+     * on exit.
+     */
+    @JvmStatic
+    fun exitAnimation(view: View, onEnd: Runnable? = null): Animator {
+        Log.d(ControlsUiController.TAG, "Exit animation for $view")
+
+        val alphaAnimator = ObjectAnimator.ofFloat(view, "transitionAlpha", 0.0f).apply {
+            interpolator = Interpolators.ACCELERATE
+            duration = ALPHA_EXIT_DURATION
+        }
+
+        view.translationY = 0.0f
+        val yAnimator = ObjectAnimator.ofFloat(view, "translationY", -translationY).apply {
+            interpolator = Interpolators.ACCELERATE
+            duration = Y_TRANSLATION_EXIT_DURATION
+        }
+
+        return AnimatorSet().apply {
+            playTogether(alphaAnimator, yAnimator)
+            onEnd?.let {
+                addListener(object : AnimatorListenerAdapter() {
+                    override fun onAnimationEnd(animation: Animator) {
+                        it.run()
+                    }
+                })
+            }
+        }
+    }
+
+    fun enterWindowTransition(@IdRes id: Int) =
+        WindowTransition({ view: View -> enterAnimation(view) }).apply {
+            addTarget(id)
+        }
+
+    fun exitWindowTransition(@IdRes id: Int) =
+        WindowTransition({ view: View -> exitAnimation(view) }).apply {
+            addTarget(id)
+        }
+}
+
+/**
+ * In order to animate, at least one property must be marked on each view that should move.
+ * Setting "item" is just a flag to indicate that it should move by the animator.
+ */
+class WindowTransition(
+    val animator: (view: View) -> Animator
+) : Transition() {
+    override fun captureStartValues(tv: TransitionValues) {
+        tv.values["item"] = 0.0f
+    }
+
+    override fun captureEndValues(tv: TransitionValues) {
+        tv.values["item"] = 1.0f
+    }
+
+    override fun createAnimator(
+        sceneRoot: ViewGroup,
+        startValues: TransitionValues?,
+        endValues: TransitionValues?
+    ): Animator? = animator(startValues!!.view)
+}
diff --git a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsEditingActivity.kt b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsEditingActivity.kt
index ee1ce7a..640c90d 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsEditingActivity.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsEditingActivity.kt
@@ -16,11 +16,12 @@
 
 package com.android.systemui.controls.management
 
-import android.app.Activity
+import android.app.ActivityOptions
 import android.content.ComponentName
 import android.content.Intent
 import android.os.Bundle
 import android.view.View
+import android.view.ViewGroup
 import android.view.ViewStub
 import android.widget.Button
 import android.widget.TextView
@@ -31,7 +32,9 @@
 import com.android.systemui.broadcast.BroadcastDispatcher
 import com.android.systemui.controls.controller.ControlsControllerImpl
 import com.android.systemui.controls.controller.StructureInfo
+import com.android.systemui.globalactions.GlobalActionsComponent
 import com.android.systemui.settings.CurrentUserTracker
+import com.android.systemui.util.LifecycleActivity
 import javax.inject.Inject
 
 /**
@@ -39,8 +42,9 @@
  */
 class ControlsEditingActivity @Inject constructor(
     private val controller: ControlsControllerImpl,
-    broadcastDispatcher: BroadcastDispatcher
-) : Activity() {
+    broadcastDispatcher: BroadcastDispatcher,
+    private val globalActionsComponent: GlobalActionsComponent
+) : LifecycleActivity() {
 
     companion object {
         private const val TAG = "ControlsEditingActivity"
@@ -84,14 +88,31 @@
         bindViews()
 
         bindButtons()
+    }
 
+    override fun onStart() {
+        super.onStart()
         setUpList()
 
         currentUserTracker.startTracking()
     }
 
+    override fun onStop() {
+        super.onStop()
+        currentUserTracker.stopTracking()
+    }
+
     private fun bindViews() {
         setContentView(R.layout.controls_management)
+
+        getLifecycle().addObserver(
+            ControlsAnimations.observerForAnimations(
+                requireViewById<ViewGroup>(R.id.controls_management_root),
+                window,
+                intent
+            )
+        )
+
         requireViewById<ViewStub>(R.id.stub).apply {
             layoutResource = R.layout.controls_management_editing
             inflate()
@@ -113,17 +134,26 @@
                     putExtras([email protected])
                     putExtra(ControlsFavoritingActivity.EXTRA_SINGLE_STRUCTURE, true)
                 }
-                startActivity(intent)
-                finish()
+                startActivity(intent, ActivityOptions
+                    .makeSceneTransitionAnimation(this@ControlsEditingActivity).toBundle())
             }
         }
 
+        val rootView = requireViewById<ViewGroup>(R.id.controls_management_root)
         saveButton = requireViewById<Button>(R.id.done).apply {
             isEnabled = false
             setText(R.string.save)
             setOnClickListener {
                 saveFavorites()
-                finishAffinity()
+                ControlsAnimations.exitAnimation(
+                    rootView,
+                    object : Runnable {
+                        override fun run() {
+                            finish()
+                        }
+                    }
+                ).start()
+                globalActionsComponent.handleShowGlobalActionsMenu()
             }
         }
     }
@@ -151,26 +181,38 @@
         val controls = controller.getFavoritesForStructure(component, structure)
         model = FavoritesModel(component, controls, favoritesModelCallback)
         val elevation = resources.getFloat(R.dimen.control_card_elevation)
-        val adapter = ControlAdapter(elevation)
-        val recycler = requireViewById<RecyclerView>(R.id.list)
+        val recyclerView = requireViewById<RecyclerView>(R.id.list)
+        recyclerView.alpha = 0.0f
+        val adapter = ControlAdapter(elevation).apply {
+            registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() {
+                var hasAnimated = false
+                override fun onChanged() {
+                    if (!hasAnimated) {
+                        hasAnimated = true
+                        ControlsAnimations.enterAnimation(recyclerView).start()
+                    }
+                }
+            })
+        }
+
         val margin = resources
                 .getDimensionPixelSize(R.dimen.controls_card_margin)
         val itemDecorator = MarginItemDecorator(margin, margin)
 
-        recycler.apply {
+        recyclerView.apply {
             this.adapter = adapter
-            layoutManager = GridLayoutManager(recycler.context, 2).apply {
+            layoutManager = GridLayoutManager(recyclerView.context, 2).apply {
                 spanSizeLookup = adapter.spanSizeLookup
             }
             addItemDecoration(itemDecorator)
         }
         adapter.changeModel(model)
         model.attachAdapter(adapter)
-        ItemTouchHelper(model.itemTouchHelperCallback).attachToRecyclerView(recycler)
+        ItemTouchHelper(model.itemTouchHelperCallback).attachToRecyclerView(recyclerView)
     }
 
     override fun onDestroy() {
         currentUserTracker.stopTracking()
         super.onDestroy()
     }
-}
\ No newline at end of file
+}
diff --git a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsFavoritingActivity.kt b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsFavoritingActivity.kt
index 6f34dee..9a2ccb5 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsFavoritingActivity.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsFavoritingActivity.kt
@@ -16,11 +16,10 @@
 
 package com.android.systemui.controls.management
 
-import android.app.Activity
+import android.app.ActivityOptions
 import android.content.ComponentName
 import android.content.Intent
 import android.content.res.Configuration
-import android.graphics.drawable.Drawable
 import android.os.Bundle
 import android.text.TextUtils
 import android.view.Gravity
@@ -29,7 +28,6 @@
 import android.view.ViewStub
 import android.widget.Button
 import android.widget.FrameLayout
-import android.widget.ImageView
 import android.widget.TextView
 import androidx.viewpager2.widget.ViewPager2
 import com.android.systemui.Prefs
@@ -40,7 +38,9 @@
 import com.android.systemui.controls.controller.ControlsControllerImpl
 import com.android.systemui.controls.controller.StructureInfo
 import com.android.systemui.dagger.qualifiers.Main
+import com.android.systemui.globalactions.GlobalActionsComponent
 import com.android.systemui.settings.CurrentUserTracker
+import com.android.systemui.util.LifecycleActivity
 import java.text.Collator
 import java.util.concurrent.Executor
 import java.util.function.Consumer
@@ -50,8 +50,9 @@
     @Main private val executor: Executor,
     private val controller: ControlsControllerImpl,
     private val listingController: ControlsListingController,
-    broadcastDispatcher: BroadcastDispatcher
-) : Activity() {
+    broadcastDispatcher: BroadcastDispatcher,
+    private val globalActionsComponent: GlobalActionsComponent
+) : LifecycleActivity() {
 
     companion object {
         private const val TAG = "ControlsFavoritingActivity"
@@ -73,14 +74,15 @@
     private lateinit var structurePager: ViewPager2
     private lateinit var statusText: TextView
     private lateinit var titleView: TextView
-    private lateinit var iconView: ImageView
-    private lateinit var iconFrame: View
     private lateinit var pageIndicator: ManagementPageIndicator
     private var mTooltipManager: TooltipManager? = null
     private lateinit var doneButton: View
+    private lateinit var otherAppsButton: View
     private var listOfStructures = emptyList<StructureContainer>()
 
     private lateinit var comparator: Comparator<StructureContainer>
+    private var cancelLoadRunnable: Runnable? = null
+    private var isPagerLoaded = false
 
     private val currentUserTracker = object : CurrentUserTracker(broadcastDispatcher) {
         private val startingUser = controller.currentUserId
@@ -94,17 +96,10 @@
     }
 
     private val listingCallback = object : ControlsListingController.ControlsListingCallback {
-        private var icon: Drawable? = null
 
         override fun onServicesUpdated(serviceInfos: List<ControlsServiceInfo>) {
-            val newIcon = serviceInfos.firstOrNull { it.componentName == component }?.loadIcon()
-            if (icon == newIcon) return
-            icon = newIcon
-            executor.execute {
-                if (icon != null) {
-                    iconView.setImageDrawable(icon)
-                }
-                iconFrame.visibility = if (icon != null) View.VISIBLE else View.GONE
+            if (serviceInfos.size > 1) {
+                otherAppsButton.visibility = View.VISIBLE
             }
         }
     }
@@ -115,6 +110,7 @@
 
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
+
         val collator = Collator.getInstance(resources.configuration.locales[0])
         comparator = compareBy(collator) { it.structureName }
         appName = intent.getCharSequenceExtra(EXTRA_APP)
@@ -122,14 +118,6 @@
         component = intent.getParcelableExtra<ComponentName>(Intent.EXTRA_COMPONENT_NAME)
 
         bindViews()
-
-        setUpPager()
-
-        loadControls()
-
-        listingController.addCallback(listingCallback)
-
-        currentUserTracker.startTracking()
     }
 
     private val controlsModelCallback = object : ControlsModel.ControlsModelCallback {
@@ -174,12 +162,17 @@
                     pageIndicator.setLocation(0f)
                     pageIndicator.visibility =
                         if (listOfStructures.size > 1) View.VISIBLE else View.GONE
+
+                    ControlsAnimations.enterAnimation(pageIndicator).start()
+                    ControlsAnimations.enterAnimation(structurePager).start()
                 }
-            })
+            }, Consumer { runnable -> cancelLoadRunnable = runnable })
         }
     }
 
     private fun setUpPager() {
+        structurePager.alpha = 0.0f
+        pageIndicator.alpha = 0.0f
         structurePager.apply {
             adapter = StructureAdapter(emptyList())
             registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
@@ -203,6 +196,15 @@
 
     private fun bindViews() {
         setContentView(R.layout.controls_management)
+
+        getLifecycle().addObserver(
+            ControlsAnimations.observerForAnimations(
+                requireViewById<ViewGroup>(R.id.controls_management_root),
+                window,
+                intent
+            )
+        )
+
         requireViewById<ViewStub>(R.id.stub).apply {
             layoutResource = R.layout.controls_management_favorites
             inflate()
@@ -259,8 +261,6 @@
         }
         requireViewById<TextView>(R.id.subtitle).text =
                 resources.getText(R.string.controls_favorite_subtitle)
-        iconView = requireViewById(com.android.internal.R.id.icon)
-        iconFrame = requireViewById(R.id.icon_frame)
         structurePager = requireViewById<ViewPager2>(R.id.structure_pager)
         structurePager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
             override fun onPageSelected(position: Int) {
@@ -272,16 +272,17 @@
     }
 
     private fun bindButtons() {
-        requireViewById<Button>(R.id.other_apps).apply {
-            visibility = View.VISIBLE
+        otherAppsButton = requireViewById<Button>(R.id.other_apps).apply {
             setOnClickListener {
                 val i = Intent()
                 i.setComponent(
                     ComponentName(context, ControlsProviderSelectorActivity::class.java))
-                context.startActivity(i)
+                startActivity(i, ActivityOptions
+                    .makeSceneTransitionAnimation(this@ControlsFavoritingActivity).toBundle())
             }
         }
 
+        val rootView = requireViewById<ViewGroup>(R.id.controls_management_root)
         doneButton = requireViewById<Button>(R.id.done).apply {
             isEnabled = false
             setOnClickListener {
@@ -292,7 +293,16 @@
                         StructureInfo(component!!, it.structureName, favoritesForStorage)
                     )
                 }
-                finishAffinity()
+
+                ControlsAnimations.exitAnimation(
+                    rootView,
+                    object : Runnable {
+                        override fun run() {
+                            finish()
+                        }
+                    }
+                ).start()
+                globalActionsComponent.handleShowGlobalActionsMenu()
             }
         }
     }
@@ -302,15 +312,39 @@
         mTooltipManager?.hide(false)
     }
 
+    override fun onStart() {
+        super.onStart()
+
+        listingController.addCallback(listingCallback)
+        currentUserTracker.startTracking()
+    }
+
+    override fun onResume() {
+        super.onResume()
+
+        // only do once, to make sure that any user changes do not get replaces if resume is called
+        // more than once
+        if (!isPagerLoaded) {
+            setUpPager()
+            loadControls()
+            isPagerLoaded = true
+        }
+    }
+
+    override fun onStop() {
+        super.onStop()
+
+        listingController.removeCallback(listingCallback)
+        currentUserTracker.stopTracking()
+    }
+
     override fun onConfigurationChanged(newConfig: Configuration) {
         super.onConfigurationChanged(newConfig)
         mTooltipManager?.hide(false)
     }
 
     override fun onDestroy() {
-        currentUserTracker.stopTracking()
-        listingController.removeCallback(listingCallback)
-        controller.cancelLoad()
+        cancelLoadRunnable?.run()
         super.onDestroy()
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsProviderSelectorActivity.kt b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsProviderSelectorActivity.kt
index 3be5900..0044854 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsProviderSelectorActivity.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsProviderSelectorActivity.kt
@@ -16,15 +16,19 @@
 
 package com.android.systemui.controls.management
 
+import android.app.ActivityOptions
 import android.content.ComponentName
 import android.content.Intent
 import android.os.Bundle
 import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
 import android.view.ViewStub
 import android.widget.Button
 import android.widget.TextView
 import androidx.recyclerview.widget.LinearLayoutManager
 import androidx.recyclerview.widget.RecyclerView
+import androidx.recyclerview.widget.RecyclerView.AdapterDataObserver
 import com.android.systemui.R
 import com.android.systemui.broadcast.BroadcastDispatcher
 import com.android.systemui.controls.controller.ControlsController
@@ -66,12 +70,42 @@
         super.onCreate(savedInstanceState)
 
         setContentView(R.layout.controls_management)
+
+        getLifecycle().addObserver(
+            ControlsAnimations.observerForAnimations(
+                requireViewById<ViewGroup>(R.id.controls_management_root),
+                window,
+                intent
+            )
+        )
+
         requireViewById<ViewStub>(R.id.stub).apply {
             layoutResource = R.layout.controls_management_apps
             inflate()
         }
 
         recyclerView = requireViewById(R.id.list)
+        recyclerView.layoutManager = LinearLayoutManager(applicationContext)
+
+        requireViewById<TextView>(R.id.title).apply {
+            text = resources.getText(R.string.controls_providers_title)
+        }
+
+        requireViewById<Button>(R.id.other_apps).apply {
+            visibility = View.VISIBLE
+            setText(com.android.internal.R.string.cancel)
+            setOnClickListener {
+                [email protected]()
+            }
+        }
+        requireViewById<View>(R.id.done).visibility = View.GONE
+    }
+
+    override fun onStart() {
+        super.onStart()
+        currentUserTracker.startTracking()
+
+        recyclerView.alpha = 0.0f
         recyclerView.adapter = AppAdapter(
                 backExecutor,
                 executor,
@@ -80,17 +114,22 @@
                 LayoutInflater.from(this),
                 ::launchFavoritingActivity,
                 FavoritesRenderer(resources, controlsController::countFavoritesForComponent),
-                resources)
-        recyclerView.layoutManager = LinearLayoutManager(applicationContext)
-
-        requireViewById<TextView>(R.id.title).text =
-                resources.getText(R.string.controls_providers_title)
-
-        requireViewById<Button>(R.id.done).setOnClickListener {
-            [email protected]()
+                resources).apply {
+            registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() {
+                var hasAnimated = false
+                override fun onChanged() {
+                    if (!hasAnimated) {
+                        hasAnimated = true
+                        ControlsAnimations.enterAnimation(recyclerView).start()
+                    }
+                }
+            })
         }
+    }
 
-        currentUserTracker.startTracking()
+    override fun onStop() {
+        super.onStop()
+        currentUserTracker.stopTracking()
     }
 
     /**
@@ -98,7 +137,7 @@
      * @param component a component name for a [ControlsProviderService]
      */
     fun launchFavoritingActivity(component: ComponentName?) {
-        backExecutor.execute {
+        executor.execute {
             component?.let {
                 val intent = Intent(applicationContext, ControlsFavoritingActivity::class.java)
                         .apply {
@@ -107,7 +146,7 @@
                     putExtra(Intent.EXTRA_COMPONENT_NAME, it)
                     flags = Intent.FLAG_ACTIVITY_SINGLE_TOP
                 }
-                startActivity(intent)
+                startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(this).toBundle())
             }
         }
     }
diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlActionCoordinator.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlActionCoordinator.kt
index ad86eeb..0af29be 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlActionCoordinator.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlActionCoordinator.kt
@@ -17,19 +17,16 @@
 package com.android.systemui.controls.ui
 
 import android.app.Dialog
-import android.app.PendingIntent
 import android.content.Intent
 import android.service.controls.Control
 import android.service.controls.actions.BooleanAction
 import android.service.controls.actions.CommandAction
-import android.util.Log
 import android.view.HapticFeedbackConstants
-
-import com.android.systemui.R
+import com.android.systemui.controls.controller.ControlsController
 
 object ControlActionCoordinator {
-    public const val MIN_LEVEL = 0
-    public const val MAX_LEVEL = 10000
+    const val MIN_LEVEL = 0
+    const val MAX_LEVEL = 10000
 
     private var dialog: Dialog? = null
 
@@ -40,9 +37,6 @@
 
     fun toggle(cvh: ControlViewHolder, templateId: String, isChecked: Boolean) {
         cvh.action(BooleanAction(templateId, !isChecked))
-
-        val nextLevel = if (isChecked) MIN_LEVEL else MAX_LEVEL
-        cvh.clipLayer.setLevel(nextLevel)
     }
 
     fun touch(cvh: ControlViewHolder, templateId: String, control: Control) {
@@ -54,23 +48,14 @@
     }
 
     /**
-     * Allow apps to specify whether they would like to appear in a detail panel or within
-     * the full activity by setting the {@link Control#EXTRA_USE_PANEL} flag. In order for
-     * activities to determine how they are being launched, they should inspect the
-     * {@link Control#EXTRA_USE_PANEL} flag for a value of true.
+     * All long presses will be shown in a 3/4 height bottomsheet panel, in order for the user to
+     * retain context with their favorited controls in the power menu.
      */
     fun longPress(cvh: ControlViewHolder) {
         // Long press snould only be called when there is valid control state, otherwise ignore
         cvh.cws.control?.let {
-            try {
-                it.getAppIntent().send()
-                cvh.layout.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS)
-                cvh.context.sendBroadcast(Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS))
-            } catch (e: PendingIntent.CanceledException) {
-                Log.e(ControlsUiController.TAG, "Error sending pending intent", e)
-                cvh.setTransientStatus(
-                    cvh.context.resources.getString(R.string.controls_error_failed))
-            }
+            cvh.layout.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS)
+            showDialog(cvh, it.getAppIntent().getIntent())
         }
     }
 
@@ -80,4 +65,8 @@
             it.show()
         }
     }
+
+    fun setFocusedElement(cvh: ControlViewHolder?, controlsController: ControlsController) {
+        controlsController.onFocusChanged(cvh?.cws)
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlViewHolder.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlViewHolder.kt
index 0eb6cb1..5be2f22 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlViewHolder.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlViewHolder.kt
@@ -16,6 +16,9 @@
 
 package com.android.systemui.controls.ui
 
+import android.animation.Animator
+import android.animation.AnimatorListenerAdapter
+import android.animation.ValueAnimator
 import android.content.Context
 import android.graphics.drawable.ClipDrawable
 import android.graphics.drawable.GradientDrawable
@@ -28,15 +31,16 @@
 import android.service.controls.templates.TemperatureControlTemplate
 import android.service.controls.templates.ToggleRangeTemplate
 import android.service.controls.templates.ToggleTemplate
+import android.util.MathUtils
 import android.view.View
 import android.view.ViewGroup
 import android.widget.ImageView
 import android.widget.TextView
-
+import com.android.internal.graphics.ColorUtils
+import com.android.systemui.Interpolators
+import com.android.systemui.R
 import com.android.systemui.controls.controller.ControlsController
 import com.android.systemui.util.concurrency.DelayableExecutor
-import com.android.systemui.R
-
 import kotlin.reflect.KClass
 
 /**
@@ -48,20 +52,26 @@
     val layout: ViewGroup,
     val controlsController: ControlsController,
     val uiExecutor: DelayableExecutor,
-    val bgExecutor: DelayableExecutor,
-    val usePanels: Boolean
+    val bgExecutor: DelayableExecutor
 ) {
 
     companion object {
+        const val STATE_ANIMATION_DURATION = 700L
         private const val UPDATE_DELAY_IN_MILLIS = 3000L
         private const val ALPHA_ENABLED = (255.0 * 0.2).toInt()
-        private const val ALPHA_DISABLED = 255
+        private const val ALPHA_DISABLED = 0
         private val FORCE_PANEL_DEVICES = setOf(
             DeviceTypes.TYPE_THERMOSTAT,
             DeviceTypes.TYPE_CAMERA
         )
     }
 
+    private val toggleBackgroundIntensity: Float = layout.context.resources
+            .getFraction(R.fraction.controls_toggle_bg_intensity, 1, 1)
+    private val dimmedAlpha: Float = layout.context.resources
+            .getFraction(R.fraction.controls_dimmed_alpha, 1, 1)
+    private var stateAnimator: ValueAnimator? = null
+    private val baseLayer: GradientDrawable
     val icon: ImageView = layout.requireViewById(R.id.icon)
     val status: TextView = layout.requireViewById(R.id.status)
     val title: TextView = layout.requireViewById(R.id.title)
@@ -74,11 +84,18 @@
     var lastAction: ControlAction? = null
     val deviceType: Int
         get() = cws.control?.let { it.getDeviceType() } ?: cws.ci.deviceType
+    var dimmed: Boolean = false
+        set(value) {
+            field = value
+            bindData(cws)
+        }
 
     init {
         val ld = layout.getBackground() as LayerDrawable
         ld.mutate()
         clipLayer = ld.findDrawableByLayerId(R.id.clip_layer) as ClipDrawable
+        clipLayer.alpha = ALPHA_DISABLED
+        baseLayer = ld.findDrawableByLayerId(R.id.background) as GradientDrawable
         // needed for marquee to start
         status.setSelected(true)
     }
@@ -141,8 +158,7 @@
         controlsController.action(cws.componentName, cws.ci, action)
     }
 
-    fun usePanel(): Boolean =
-        usePanels && deviceType in ControlViewHolder.FORCE_PANEL_DEVICES
+    fun usePanel(): Boolean = deviceType in ControlViewHolder.FORCE_PANEL_DEVICES
 
     private fun findBehavior(
         status: Int,
@@ -160,30 +176,77 @@
         }
     }
 
-    internal fun applyRenderInfo(enabled: Boolean, offset: Int = 0) {
+    internal fun applyRenderInfo(enabled: Boolean, offset: Int = 0, animated: Boolean = true) {
         setEnabled(enabled)
 
         val ri = RenderInfo.lookup(context, cws.componentName, deviceType, enabled, offset)
 
-        val fg = context.getResources().getColorStateList(ri.foreground, context.getTheme())
-        val (bg, alpha) = if (enabled) {
-            Pair(ri.enabledBackground, ALPHA_ENABLED)
+        val fg = context.resources.getColorStateList(ri.foreground, context.theme)
+        val bg = context.resources.getColor(R.color.control_default_background, context.theme)
+        val dimAlpha = if (dimmed) dimmedAlpha else 1f
+        var (newClipColor, newAlpha) = if (enabled) {
+            // allow color overrides for the enabled state only
+            val color = cws.control?.getCustomColor()?.let {
+                val state = intArrayOf(android.R.attr.state_enabled)
+                it.getColorForState(state, it.getDefaultColor())
+            } ?: context.resources.getColor(ri.enabledBackground, context.theme)
+            listOf(color, ALPHA_ENABLED)
         } else {
-            Pair(R.color.control_default_background, ALPHA_DISABLED)
+            listOf(
+                context.resources.getColor(R.color.control_default_background, context.theme),
+                ALPHA_DISABLED
+            )
         }
 
         status.setTextColor(fg)
 
-        icon.setImageDrawable(ri.icon)
+        cws.control?.getCustomIcon()?.let {
+            // do not tint custom icons, assume the intended icon color is correct
+            icon.imageTintList = null
+            icon.setImageIcon(it)
+        } ?: run {
+            icon.setImageDrawable(ri.icon)
 
-        // do not color app icons
-        if (deviceType != DeviceTypes.TYPE_ROUTINE) {
-            icon.setImageTintList(fg)
+            // do not color app icons
+            if (deviceType != DeviceTypes.TYPE_ROUTINE) {
+                icon.imageTintList = fg
+            }
         }
 
         (clipLayer.getDrawable() as GradientDrawable).apply {
-            setColor(context.getResources().getColor(bg, context.getTheme()))
-            setAlpha(alpha)
+            val newBaseColor = if (behavior is ToggleRangeBehavior) {
+                ColorUtils.blendARGB(bg, newClipColor, toggleBackgroundIntensity)
+            } else {
+                bg
+            }
+            stateAnimator?.cancel()
+            if (animated) {
+                val oldColor = color?.defaultColor ?: newClipColor
+                val oldBaseColor = baseLayer.color?.defaultColor ?: newBaseColor
+                val oldAlpha = layout.alpha
+                stateAnimator = ValueAnimator.ofInt(clipLayer.alpha, newAlpha).apply {
+                    addUpdateListener {
+                        alpha = it.animatedValue as Int
+                        setColor(ColorUtils.blendARGB(oldColor, newClipColor, it.animatedFraction))
+                        baseLayer.setColor(ColorUtils.blendARGB(oldBaseColor,
+                                newBaseColor, it.animatedFraction))
+                        layout.alpha = MathUtils.lerp(oldAlpha, dimAlpha, it.animatedFraction)
+                    }
+                    addListener(object : AnimatorListenerAdapter() {
+                        override fun onAnimationEnd(animation: Animator?) {
+                            stateAnimator = null
+                        }
+                    })
+                    duration = STATE_ANIMATION_DURATION
+                    interpolator = Interpolators.CONTROL_STATE
+                    start()
+                }
+            } else {
+                alpha = newAlpha
+                setColor(newClipColor)
+                baseLayer.setColor(newBaseColor)
+                layout.alpha = dimAlpha
+            }
         }
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiController.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiController.kt
index 0f10537..aed7cd3 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiController.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiController.kt
@@ -26,9 +26,10 @@
 
     companion object {
         public const val TAG = "ControlsUiController"
+        public const val EXTRA_ANIMATE = "extra_animate"
     }
 
-    fun show(parent: ViewGroup)
+    fun show(parent: ViewGroup, dismissGlobalActions: Runnable)
     fun hide()
     fun onRefreshState(componentName: ComponentName, controls: List<Control>)
     fun onActionResponse(
@@ -36,4 +37,5 @@
         controlId: String,
         @ControlAction.ResponseResult response: Int
     )
+    fun onFocusChanged(controlWithState: ControlWithState?)
 }
diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt
index fab6fc7..bf0f1c8 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt
@@ -30,7 +30,6 @@
 import android.graphics.drawable.Drawable
 import android.graphics.drawable.LayerDrawable
 import android.os.Process
-import android.provider.Settings
 import android.service.controls.Control
 import android.service.controls.actions.ControlAction
 import android.util.Log
@@ -84,8 +83,7 @@
         private const val PREF_COMPONENT = "controls_component"
         private const val PREF_STRUCTURE = "controls_structure"
 
-        private const val USE_PANELS = "systemui.controls_use_panel"
-        private const val FADE_IN_MILLIS = 225L
+        private const val FADE_IN_MILLIS = 200L
 
         private val EMPTY_COMPONENT = ComponentName("", "")
         private val EMPTY_STRUCTURE = StructureInfo(
@@ -104,6 +102,7 @@
     private var popup: ListPopupWindow? = null
     private var activeDialog: Dialog? = null
     private var hidden = true
+    private lateinit var dismissGlobalActions: Runnable
 
     override val available: Boolean
         get() = controlsController.get().available
@@ -134,9 +133,10 @@
         }
     }
 
-    override fun show(parent: ViewGroup) {
+    override fun show(parent: ViewGroup, dismissGlobalActions: Runnable) {
         Log.d(ControlsUiController.TAG, "show()")
         this.parent = parent
+        this.dismissGlobalActions = dismissGlobalActions
         hidden = false
 
         allStructures = controlsController.get().getFavorites()
@@ -169,7 +169,7 @@
         fadeAnim.setDuration(FADE_IN_MILLIS)
         fadeAnim.addListener(object : AnimatorListenerAdapter() {
             override fun onAnimationEnd(animation: Animator) {
-                show(parent)
+                show(parent, dismissGlobalActions)
                 val showAnim = ObjectAnimator.ofFloat(parent, "alpha", 0.0f, 1.0f)
                 showAnim.setInterpolator(DecelerateInterpolator(1.0f))
                 showAnim.setDuration(FADE_IN_MILLIS)
@@ -209,6 +209,20 @@
         }
     }
 
+    override fun onFocusChanged(focusedControl: ControlWithState?) {
+        controlViewsById.forEach { key: ControlKey, viewHolder: ControlViewHolder ->
+            val state = controlsById.get(key) ?: return@forEach
+            val shouldBeDimmed = focusedControl != null && state != focusedControl
+            if (viewHolder.dimmed == shouldBeDimmed) {
+                return@forEach
+            }
+
+            uiExecutor.execute {
+                viewHolder.dimmed = shouldBeDimmed
+            }
+        }
+    }
+
     private fun startFavoritingActivity(context: Context, si: StructureInfo) {
         startTargetedActivity(context, si, ControlsFavoritingActivity::class.java)
     }
@@ -242,9 +256,10 @@
     }
 
     private fun startActivity(context: Context, intent: Intent) {
-        val closeDialog = Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)
-        context.sendBroadcast(closeDialog)
+        // Force animations when transitioning from a dialog to an activity
+        intent.putExtra(ControlsUiController.EXTRA_ANIMATE, true)
         context.startActivity(intent)
+        dismissGlobalActions.run()
     }
 
     private fun showControlsView(items: List<SelectionItem>) {
@@ -424,9 +439,6 @@
 
         val maxColumns = findMaxColumns()
 
-        // use flag only temporarily for testing
-        val usePanels = Settings.Secure.getInt(context.contentResolver, USE_PANELS, 0) == 1
-
         val listView = parent.requireViewById(R.id.global_actions_controls_list) as ViewGroup
         var lastRow: ViewGroup = createRow(inflater, listView)
         selectedStructure.controls.forEach {
@@ -440,8 +452,7 @@
                 baseLayout,
                 controlsController.get(),
                 uiExecutor,
-                bgExecutor,
-                usePanels
+                bgExecutor
             )
             val key = ControlKey(selectedStructure.componentName, it.controlId)
             cvh.bindData(controlsById.getValue(key))
diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/DetailDialog.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/DetailDialog.kt
index 15c41a2..65ed967 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/ui/DetailDialog.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/ui/DetailDialog.kt
@@ -24,9 +24,9 @@
 import android.view.View
 import android.view.ViewGroup
 import android.view.WindowInsets
+import android.view.WindowInsets.Type
 import android.view.WindowManager
 import android.widget.ImageView
-import android.widget.TextView
 
 import com.android.systemui.R
 
@@ -45,7 +45,7 @@
         private const val PANEL_TOP_OFFSET = "systemui.controls_panel_top_offset"
     }
 
-    lateinit var activityView: ActivityView
+    var activityView = ActivityView(context, null, 0, false)
 
     val stateCallback: ActivityView.StateCallback = object : ActivityView.StateCallback() {
         override fun onActivityViewReady(view: ActivityView) {
@@ -67,10 +67,8 @@
 
     init {
         window.setType(WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY)
-
         setContentView(R.layout.controls_detail_dialog)
 
-        activityView = ActivityView(context, null, 0, false)
         requireViewById<ViewGroup>(R.id.controls_activity_view).apply {
             addView(activityView)
         }
@@ -79,14 +77,6 @@
             setOnClickListener { _: View -> dismiss() }
         }
 
-        requireViewById<TextView>(R.id.title).apply {
-            setText(cvh.title.text)
-        }
-
-        requireViewById<TextView>(R.id.subtitle).apply {
-            setText(cvh.subtitle.text)
-        }
-
         requireViewById<ImageView>(R.id.control_detail_open_in_app).apply {
             setOnClickListener { v: View ->
                 dismiss()
@@ -97,15 +87,15 @@
 
         // consume all insets to achieve slide under effect
         window.getDecorView().setOnApplyWindowInsetsListener {
-            v: View, insets: WindowInsets ->
+            _: View, insets: WindowInsets ->
                 activityView.apply {
                     val l = getPaddingLeft()
                     val t = getPaddingTop()
                     val r = getPaddingRight()
-                    setPadding(l, t, r, insets.getSystemWindowInsets().bottom)
+                    setPadding(l, t, r, insets.getInsets(Type.systemBars()).bottom)
                 }
 
-                insets.consumeSystemWindowInsets()
+                WindowInsets.CONSUMED
         }
 
         requireViewById<ViewGroup>(R.id.control_detail_root).apply {
@@ -118,6 +108,9 @@
             val lp = getLayoutParams() as ViewGroup.MarginLayoutParams
             lp.topMargin = offsetInPx
             setLayoutParams(lp)
+
+            setOnClickListener { dismiss() }
+            (getParent() as View).setOnClickListener { dismiss() }
         }
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ToggleBehavior.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ToggleBehavior.kt
index a3368ef..368d139 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/ui/ToggleBehavior.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ToggleBehavior.kt
@@ -18,12 +18,10 @@
 
 import android.graphics.drawable.Drawable
 import android.graphics.drawable.LayerDrawable
-import android.view.View
 import android.service.controls.Control
 import android.service.controls.templates.ToggleTemplate
-
+import android.view.View
 import com.android.systemui.R
-import com.android.systemui.controls.ui.ControlActionCoordinator.MIN_LEVEL
 import com.android.systemui.controls.ui.ControlActionCoordinator.MAX_LEVEL
 
 class ToggleBehavior : Behavior {
@@ -34,7 +32,7 @@
 
     override fun initialize(cvh: ControlViewHolder) {
         this.cvh = cvh
-        cvh.applyRenderInfo(false)
+        cvh.applyRenderInfo(false /* enabled */, 0 /* offset */, false /* animated */)
 
         cvh.layout.setOnClickListener(View.OnClickListener() {
             ControlActionCoordinator.toggle(cvh, template.getTemplateId(), template.isChecked())
@@ -49,9 +47,9 @@
 
         val ld = cvh.layout.getBackground() as LayerDrawable
         clipLayer = ld.findDrawableByLayerId(R.id.clip_layer)
+        clipLayer.level = MAX_LEVEL
 
         val checked = template.isChecked()
-        clipLayer.setLevel(if (checked) MAX_LEVEL else MIN_LEVEL)
         cvh.applyRenderInfo(checked)
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ToggleRangeBehavior.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ToggleRangeBehavior.kt
index 5a95665..dafd8b2 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/ui/ToggleRangeBehavior.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ToggleRangeBehavior.kt
@@ -16,11 +16,20 @@
 
 package com.android.systemui.controls.ui
 
-import android.os.Bundle
+import android.animation.Animator
+import android.animation.AnimatorListenerAdapter
+import android.animation.ValueAnimator
 import android.content.Context
 import android.graphics.drawable.Drawable
 import android.graphics.drawable.LayerDrawable
+import android.os.Bundle
+import android.service.controls.Control
+import android.service.controls.actions.FloatAction
+import android.service.controls.templates.RangeTemplate
+import android.service.controls.templates.ToggleRangeTemplate
 import android.util.Log
+import android.util.MathUtils
+import android.util.TypedValue
 import android.view.GestureDetector
 import android.view.GestureDetector.SimpleOnGestureListener
 import android.view.MotionEvent
@@ -29,19 +38,14 @@
 import android.view.accessibility.AccessibilityEvent
 import android.view.accessibility.AccessibilityNodeInfo
 import android.widget.TextView
-import android.service.controls.Control
-import android.service.controls.actions.FloatAction
-import android.service.controls.templates.RangeTemplate
-import android.service.controls.templates.ToggleRangeTemplate
-import android.util.TypedValue
-
+import com.android.systemui.Interpolators
 import com.android.systemui.R
-import com.android.systemui.controls.ui.ControlActionCoordinator.MIN_LEVEL
 import com.android.systemui.controls.ui.ControlActionCoordinator.MAX_LEVEL
-
+import com.android.systemui.controls.ui.ControlActionCoordinator.MIN_LEVEL
 import java.util.IllegalFormatException
 
 class ToggleRangeBehavior : Behavior {
+    private var rangeAnimator: ValueAnimator? = null
     lateinit var clipLayer: Drawable
     lateinit var template: ToggleRangeTemplate
     lateinit var control: Control
@@ -61,20 +65,21 @@
         status = cvh.status
         context = status.getContext()
 
-        cvh.applyRenderInfo(false)
+        cvh.applyRenderInfo(false /* enabled */, 0 /* offset */, false /* animated */)
 
         val gestureListener = ToggleRangeGestureListener(cvh.layout)
         val gestureDetector = GestureDetector(context, gestureListener)
         cvh.layout.setOnTouchListener { v: View, e: MotionEvent ->
             if (gestureDetector.onTouchEvent(e)) {
-                return@setOnTouchListener true
+                // Don't return true to let the state list change to "pressed"
+                return@setOnTouchListener false
             }
 
             if (e.getAction() == MotionEvent.ACTION_UP && gestureListener.isDragging) {
                 v.getParent().requestDisallowInterceptTouchEvent(false)
                 gestureListener.isDragging = false
                 endUpdateRange()
-                return@setOnTouchListener true
+                return@setOnTouchListener false
             }
 
             return@setOnTouchListener false
@@ -87,17 +92,18 @@
         currentStatusText = control.getStatusText()
         status.setText(currentStatusText)
 
+        // ControlViewHolder sets a long click listener, but we want to handle touch in
+        // here instead, otherwise we'll have state conflicts.
+        cvh.layout.setOnLongClickListener(null)
+
         val ld = cvh.layout.getBackground() as LayerDrawable
         clipLayer = ld.findDrawableByLayerId(R.id.clip_layer)
-        clipLayer.setLevel(MIN_LEVEL)
 
         template = control.getControlTemplate() as ToggleRangeTemplate
         rangeTemplate = template.getRange()
 
         val checked = template.isChecked()
-        val currentRatio = rangeTemplate.getCurrentValue() /
-                (rangeTemplate.getMaxValue() - rangeTemplate.getMinValue())
-        updateRange(currentRatio, checked, /* isDragging */ false)
+        updateRange(rangeToLevelValue(rangeTemplate.currentValue), checked, /* isDragging */ false)
 
         cvh.applyRenderInfo(checked)
 
@@ -146,9 +152,8 @@
                         } else {
                             val value = arguments.getFloat(
                                 AccessibilityNodeInfo.ACTION_ARGUMENT_PROGRESS_VALUE)
-                            val ratioDiff = (value - rangeTemplate.getCurrentValue()) /
-                                (rangeTemplate.getMaxValue() - rangeTemplate.getMinValue())
-                            updateRange(ratioDiff, template.isChecked(), /* isDragging */ false)
+                            val level = rangeToLevelValue(value - rangeTemplate.getCurrentValue())
+                            updateRange(level, template.isChecked(), /* isDragging */ false)
                             endUpdateRange()
                             true
                         }
@@ -170,15 +175,33 @@
     fun beginUpdateRange() {
         status.setTextSize(TypedValue.COMPLEX_UNIT_PX, context.getResources()
                 .getDimensionPixelSize(R.dimen.control_status_expanded).toFloat())
+        ControlActionCoordinator.setFocusedElement(cvh, cvh.controlsController)
     }
 
-    fun updateRange(ratioDiff: Float, checked: Boolean, isDragging: Boolean) {
-        val changeAmount = if (checked) (MAX_LEVEL * ratioDiff).toInt() else MIN_LEVEL
-        val newLevel = Math.max(MIN_LEVEL, Math.min(MAX_LEVEL, clipLayer.getLevel() + changeAmount))
-        clipLayer.setLevel(newLevel)
+    fun updateRange(level: Int, checked: Boolean, isDragging: Boolean) {
+        val newLevel = if (checked) Math.max(MIN_LEVEL, Math.min(MAX_LEVEL, level)) else MIN_LEVEL
+
+        rangeAnimator?.cancel()
+        if (isDragging) {
+            clipLayer.level = newLevel
+        } else {
+            rangeAnimator = ValueAnimator.ofInt(cvh.clipLayer.level, newLevel).apply {
+                addUpdateListener {
+                    cvh.clipLayer.level = it.animatedValue as Int
+                }
+                addListener(object : AnimatorListenerAdapter() {
+                    override fun onAnimationEnd(animation: Animator?) {
+                        rangeAnimator = null
+                    }
+                })
+                duration = ControlViewHolder.STATE_ANIMATION_DURATION
+                interpolator = Interpolators.CONTROL_STATE
+                start()
+            }
+        }
 
         if (checked) {
-            val newValue = levelToRangeValue(clipLayer.getLevel())
+            val newValue = levelToRangeValue(newLevel)
             currentRangeValue = format(rangeTemplate.getFormatString().toString(),
                     DEFAULT_FORMAT, newValue)
             val text = if (isDragging) {
@@ -206,9 +229,13 @@
     }
 
     private fun levelToRangeValue(i: Int): Float {
-        val ratio = i.toFloat() / MAX_LEVEL
-        return rangeTemplate.getMinValue() +
-            (ratio * (rangeTemplate.getMaxValue() - rangeTemplate.getMinValue()))
+        return MathUtils.constrainedMap(rangeTemplate.minValue, rangeTemplate.maxValue,
+                MIN_LEVEL.toFloat(), MAX_LEVEL.toFloat(), i.toFloat())
+    }
+
+    private fun rangeToLevelValue(i: Float): Int {
+        return MathUtils.constrainedMap(MIN_LEVEL.toFloat(), MAX_LEVEL.toFloat(),
+                rangeTemplate.minValue, rangeTemplate.maxValue, i).toInt()
     }
 
     fun endUpdateRange() {
@@ -217,6 +244,7 @@
         status.setText("$currentStatusText $currentRangeValue")
         cvh.action(FloatAction(rangeTemplate.getTemplateId(),
             findNearestStep(levelToRangeValue(clipLayer.getLevel()))))
+        ControlActionCoordinator.setFocusedElement(null, cvh.controlsController)
     }
 
     fun findNearestStep(value: Float): Float {
@@ -247,6 +275,9 @@
         }
 
         override fun onLongPress(e: MotionEvent) {
+            if (isDragging) {
+                return
+            }
             ControlActionCoordinator.longPress([email protected])
         }
 
@@ -256,14 +287,19 @@
             xDiff: Float,
             yDiff: Float
         ): Boolean {
+            if (!template.isChecked) {
+                return false
+            }
             if (!isDragging) {
                 v.getParent().requestDisallowInterceptTouchEvent(true)
                 [email protected]()
                 isDragging = true
             }
 
-            [email protected](-xDiff / v.getWidth(),
-                /* checked */ true, /* isDragging */ true)
+            val ratioDiff = -xDiff / v.width
+            val changeAmount = ((MAX_LEVEL - MIN_LEVEL) * ratioDiff).toInt()
+            [email protected](clipLayer.level + changeAmount,
+                    checked = true, isDragging = true)
             return true
         }
 
diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/TouchBehavior.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/TouchBehavior.kt
index b02c9c8..fd96cea 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/ui/TouchBehavior.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/ui/TouchBehavior.kt
@@ -37,7 +37,7 @@
 
     override fun initialize(cvh: ControlViewHolder) {
         this.cvh = cvh
-        cvh.applyRenderInfo(false)
+        cvh.applyRenderInfo(false /* enabled */, 0 /* offset */, false /* animated */)
 
         cvh.layout.setOnClickListener(View.OnClickListener() {
             ControlActionCoordinator.touch(cvh, template.getTemplateId(), control)
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SystemServicesModule.java b/packages/SystemUI/src/com/android/systemui/dagger/SystemServicesModule.java
index a7c4043..8f3dc22 100644
--- a/packages/SystemUI/src/com/android/systemui/dagger/SystemServicesModule.java
+++ b/packages/SystemUI/src/com/android/systemui/dagger/SystemServicesModule.java
@@ -19,8 +19,10 @@
 import android.annotation.Nullable;
 import android.annotation.SuppressLint;
 import android.app.ActivityManager;
+import android.app.ActivityTaskManager;
 import android.app.AlarmManager;
 import android.app.IActivityManager;
+import android.app.IActivityTaskManager;
 import android.app.IWallpaperManager;
 import android.app.KeyguardManager;
 import android.app.NotificationManager;
@@ -128,6 +130,12 @@
         return ActivityManager.getService();
     }
 
+    @Singleton
+    @Provides
+    static IActivityTaskManager provideIActivityTaskManager() {
+        return ActivityTaskManager.getService();
+    }
+
     @Provides
     @Singleton
     static IBatteryStats provideIBatteryStats() {
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java
index 2e9ce12..90cd13f 100644
--- a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java
+++ b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java
@@ -29,6 +29,7 @@
 import com.android.systemui.model.SysUiState;
 import com.android.systemui.plugins.statusbar.StatusBarStateController;
 import com.android.systemui.recents.Recents;
+import com.android.systemui.settings.dagger.SettingsModule;
 import com.android.systemui.stackdivider.Divider;
 import com.android.systemui.statusbar.CommandQueue;
 import com.android.systemui.statusbar.notification.collection.inflation.NotificationRowBinder;
@@ -61,6 +62,7 @@
             ConcurrencyModule.class,
             LogModule.class,
             PeopleHubModule.class,
+            SettingsModule.class
         },
         subcomponents = {StatusBarComponent.class,
                 NotificationRowComponent.class,
diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java
index 4db5374..eb80a2b 100644
--- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java
+++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java
@@ -16,6 +16,8 @@
 
 import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
 import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
+import static android.view.WindowManager.ScreenshotSource.SCREENSHOT_GLOBAL_ACTIONS;
+import static android.view.WindowManager.TAKE_SCREENSHOT_FULLSCREEN;
 
 import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.SOME_AUTH_REQUIRED_AFTER_USER_REQUEST;
 import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_NOT_REQUIRED;
@@ -43,7 +45,6 @@
 import android.content.res.Resources;
 import android.database.ContentObserver;
 import android.graphics.Color;
-import android.graphics.Insets;
 import android.graphics.drawable.Drawable;
 import android.media.AudioManager;
 import android.net.ConnectivityManager;
@@ -75,9 +76,13 @@
 import android.view.WindowInsets;
 import android.view.WindowManager;
 import android.view.accessibility.AccessibilityEvent;
+import android.widget.BaseAdapter;
 import android.widget.FrameLayout;
 import android.widget.ImageView;
 import android.widget.ImageView.ScaleType;
+import android.widget.LinearLayout;
+import android.widget.ListPopupWindow;
+import android.widget.ListView;
 import android.widget.TextView;
 
 import androidx.annotation.NonNull;
@@ -107,6 +112,7 @@
 import com.android.systemui.colorextraction.SysuiColorExtractor;
 import com.android.systemui.controls.ControlsServiceInfo;
 import com.android.systemui.controls.controller.ControlsController;
+import com.android.systemui.controls.management.ControlsAnimations;
 import com.android.systemui.controls.management.ControlsListingController;
 import com.android.systemui.controls.ui.ControlsUiController;
 import com.android.systemui.dagger.qualifiers.Background;
@@ -123,7 +129,6 @@
 import com.android.systemui.util.EmergencyDialerConstants;
 import com.android.systemui.util.RingerModeTracker;
 import com.android.systemui.util.leak.RotationUtils;
-import com.android.systemui.volume.SystemUIInterpolators.LogAccelerateInterpolator;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -151,19 +156,20 @@
 
     /* Valid settings for global actions keys.
      * see config.xml config_globalActionList */
-    private static final String GLOBAL_ACTION_KEY_POWER = "power";
-    private static final String GLOBAL_ACTION_KEY_AIRPLANE = "airplane";
-    private static final String GLOBAL_ACTION_KEY_BUGREPORT = "bugreport";
-    private static final String GLOBAL_ACTION_KEY_SILENT = "silent";
-    private static final String GLOBAL_ACTION_KEY_USERS = "users";
-    private static final String GLOBAL_ACTION_KEY_SETTINGS = "settings";
-    private static final String GLOBAL_ACTION_KEY_LOCKDOWN = "lockdown";
-    private static final String GLOBAL_ACTION_KEY_VOICEASSIST = "voiceassist";
-    private static final String GLOBAL_ACTION_KEY_ASSIST = "assist";
-    private static final String GLOBAL_ACTION_KEY_RESTART = "restart";
-    private static final String GLOBAL_ACTION_KEY_LOGOUT = "logout";
-    private static final String GLOBAL_ACTION_KEY_EMERGENCY = "emergency";
-    private static final String GLOBAL_ACTION_KEY_SCREENSHOT = "screenshot";
+    @VisibleForTesting
+    protected static final String GLOBAL_ACTION_KEY_POWER = "power";
+    protected static final String GLOBAL_ACTION_KEY_AIRPLANE = "airplane";
+    protected static final String GLOBAL_ACTION_KEY_BUGREPORT = "bugreport";
+    protected static final String GLOBAL_ACTION_KEY_SILENT = "silent";
+    protected static final String GLOBAL_ACTION_KEY_USERS = "users";
+    protected static final String GLOBAL_ACTION_KEY_SETTINGS = "settings";
+    protected static final String GLOBAL_ACTION_KEY_LOCKDOWN = "lockdown";
+    protected static final String GLOBAL_ACTION_KEY_VOICEASSIST = "voiceassist";
+    protected static final String GLOBAL_ACTION_KEY_ASSIST = "assist";
+    protected static final String GLOBAL_ACTION_KEY_RESTART = "restart";
+    protected static final String GLOBAL_ACTION_KEY_LOGOUT = "logout";
+    protected static final String GLOBAL_ACTION_KEY_EMERGENCY = "emergency";
+    protected static final String GLOBAL_ACTION_KEY_SCREENSHOT = "screenshot";
 
     private static final String PREFS_CONTROLS_SEEDING_COMPLETED = "ControlsSeedingCompleted";
     private static final String PREFS_CONTROLS_FILE = "controls_prefs";
@@ -191,13 +197,18 @@
     // Used for RingerModeTracker
     private final LifecycleRegistry mLifecycle = new LifecycleRegistry(this);
 
-    private ArrayList<Action> mItems;
+    @VisibleForTesting
+    protected final ArrayList<Action> mItems = new ArrayList<>();
+    @VisibleForTesting
+    protected final ArrayList<Action> mOverflowItems = new ArrayList<>();
+
     private ActionsDialog mDialog;
 
     private Action mSilentModeAction;
     private ToggleAction mAirplaneModeOn;
 
     private MyAdapter mAdapter;
+    private MyOverflowAdapter mOverflowAdapter;
 
     private boolean mKeyguardShowing = false;
     private boolean mDeviceProvisioned = false;
@@ -387,6 +398,7 @@
         if (preferredComponent == null) {
             Log.i(TAG, "Controls seeding: No preferred component has been set, will not seed");
             mControlsPreferences.edit().putBoolean(PREFS_CONTROLS_SEEDING_COMPLETED, true).apply();
+            return;
         }
 
         mControlsController.seedFavoritesForComponent(
@@ -444,27 +456,60 @@
         prepareDialog();
         seedFavorites();
 
-        // If we only have 1 item and it's a simple press action, just do this action.
-        if (mAdapter.getCount() == 1
-                && mAdapter.getItem(0) instanceof SinglePressAction
-                && !(mAdapter.getItem(0) instanceof LongPressAction)) {
-            ((SinglePressAction) mAdapter.getItem(0)).onPress();
+        WindowManager.LayoutParams attrs = mDialog.getWindow().getAttributes();
+        attrs.setTitle("ActionsDialog");
+        attrs.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
+        mDialog.getWindow().setAttributes(attrs);
+        mDialog.show();
+        mWindowManagerFuncs.onGlobalActionsShown();
+    }
+
+    @VisibleForTesting
+    protected boolean shouldShowAction(Action action) {
+        if (mKeyguardShowing && !action.showDuringKeyguard()) {
+            return false;
+        }
+        if (!mDeviceProvisioned && !action.showBeforeProvisioning()) {
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * Returns the maximum number of power menu items to show based on which GlobalActions
+     * layout is being used.
+     */
+    @VisibleForTesting
+    protected int getMaxShownPowerItems() {
+        // TODO: Overflow disabled on keyguard while we solve for touch blocking issues.
+        if (shouldUseControlsLayout() && !mKeyguardShowing) {
+            return mResources.getInteger(com.android.systemui.R.integer.power_menu_max_columns);
         } else {
-            WindowManager.LayoutParams attrs = mDialog.getWindow().getAttributes();
-            attrs.setTitle("ActionsDialog");
-            attrs.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
-            mDialog.getWindow().setAttributes(attrs);
-            mDialog.show();
-            mWindowManagerFuncs.onGlobalActionsShown();
+            return Integer.MAX_VALUE;
         }
     }
 
     /**
-     * Create the global actions dialog.
-     *
-     * @return A new dialog.
+     * Add a power menu action item for to either the main or overflow items lists, depending on
+     * whether controls are enabled and whether the max number of shown items has been reached.
      */
-    private ActionsDialog createDialog() {
+    private void addActionItem(Action action) {
+        if (shouldShowAction(action)) {
+            if (mItems.size() < getMaxShownPowerItems()) {
+                mItems.add(action);
+            } else {
+                mOverflowItems.add(action);
+            }
+        }
+    }
+
+    @VisibleForTesting
+    protected String[] getDefaultActions() {
+        return mResources.getStringArray(R.array.config_globalActionsList);
+    }
+
+    @VisibleForTesting
+    protected void createActionItems() {
         // Simple toggle style if there's no vibrator, otherwise use a tri-state
         if (!mHasVibrator) {
             mSilentModeAction = new SilentModeToggleAction();
@@ -474,8 +519,14 @@
         mAirplaneModeOn = new AirplaneModeAction();
         onAirplaneModeChanged();
 
-        mItems = new ArrayList<Action>();
-        String[] defaultActions = mResources.getStringArray(R.array.config_globalActionsList);
+        mItems.clear();
+        mOverflowItems.clear();
+        String[] defaultActions = getDefaultActions();
+
+        // make sure emergency affordance action is first, if needed
+        if (mEmergencyAffordanceManager.needsEmergencyAffordance()) {
+            addActionItem(new EmergencyAffordanceAction());
+        }
 
         ArraySet<String> addedKeys = new ArraySet<String>();
         for (int i = 0; i < defaultActions.length; i++) {
@@ -485,46 +536,46 @@
                 continue;
             }
             if (GLOBAL_ACTION_KEY_POWER.equals(actionKey)) {
-                mItems.add(new PowerAction());
+                addActionItem(new PowerAction());
             } else if (GLOBAL_ACTION_KEY_AIRPLANE.equals(actionKey)) {
-                mItems.add(mAirplaneModeOn);
+                addActionItem(mAirplaneModeOn);
             } else if (GLOBAL_ACTION_KEY_BUGREPORT.equals(actionKey)) {
                 if (Settings.Global.getInt(mContentResolver,
                         Settings.Global.BUGREPORT_IN_POWER_MENU, 0) != 0 && isCurrentUserOwner()) {
-                    mItems.add(new BugReportAction());
+                    addActionItem(new BugReportAction());
                 }
             } else if (GLOBAL_ACTION_KEY_SILENT.equals(actionKey)) {
                 if (mShowSilentToggle) {
-                    mItems.add(mSilentModeAction);
+                    addActionItem(mSilentModeAction);
                 }
             } else if (GLOBAL_ACTION_KEY_USERS.equals(actionKey)) {
                 if (SystemProperties.getBoolean("fw.power_user_switcher", false)) {
-                    addUsersToMenu(mItems);
+                    addUsersToMenu();
                 }
             } else if (GLOBAL_ACTION_KEY_SETTINGS.equals(actionKey)) {
-                mItems.add(getSettingsAction());
+                addActionItem(getSettingsAction());
             } else if (GLOBAL_ACTION_KEY_LOCKDOWN.equals(actionKey)) {
                 if (Settings.Secure.getIntForUser(mContentResolver,
                         Settings.Secure.LOCKDOWN_IN_POWER_MENU, 0, getCurrentUser().id) != 0
                         && shouldDisplayLockdown()) {
-                    mItems.add(getLockdownAction());
+                    addActionItem(getLockdownAction());
                 }
             } else if (GLOBAL_ACTION_KEY_VOICEASSIST.equals(actionKey)) {
-                mItems.add(getVoiceAssistAction());
+                addActionItem(getVoiceAssistAction());
             } else if (GLOBAL_ACTION_KEY_ASSIST.equals(actionKey)) {
-                mItems.add(getAssistAction());
+                addActionItem(getAssistAction());
             } else if (GLOBAL_ACTION_KEY_RESTART.equals(actionKey)) {
-                mItems.add(new RestartAction());
+                addActionItem(new RestartAction());
             } else if (GLOBAL_ACTION_KEY_SCREENSHOT.equals(actionKey)) {
-                mItems.add(new ScreenshotAction());
+                addActionItem(new ScreenshotAction());
             } else if (GLOBAL_ACTION_KEY_LOGOUT.equals(actionKey)) {
                 if (mDevicePolicyManager.isLogoutEnabled()
                         && getCurrentUser().id != UserHandle.USER_SYSTEM) {
-                    mItems.add(new LogoutAction());
+                    addActionItem(new LogoutAction());
                 }
             } else if (GLOBAL_ACTION_KEY_EMERGENCY.equals(actionKey)) {
                 if (!mEmergencyAffordanceManager.needsEmergencyAffordance()) {
-                    mItems.add(new EmergencyDialerAction());
+                    addActionItem(new EmergencyDialerAction());
                 }
             } else {
                 Log.e(TAG, "Invalid global action key " + actionKey);
@@ -532,18 +583,30 @@
             // Add here so we don't add more than one.
             addedKeys.add(actionKey);
         }
+    }
 
-        if (mEmergencyAffordanceManager.needsEmergencyAffordance()) {
-            mItems.add(new EmergencyAffordanceAction());
-        }
+    private void onRotate() {
+        // re-allocate actions between main and overflow lists
+        this.createActionItems();
+    }
+
+    /**
+     * Create the global actions dialog.
+     *
+     * @return A new dialog.
+     */
+    private ActionsDialog createDialog() {
+        createActionItems();
 
         mAdapter = new MyAdapter();
+        mOverflowAdapter = new MyOverflowAdapter();
 
-        mDepthController.setShowingHomeControls(shouldShowControls());
-        ActionsDialog dialog = new ActionsDialog(mContext, mAdapter, getWalletPanelViewController(),
-                mDepthController, mSysuiColorExtractor, mStatusBarService,
-                mNotificationShadeWindowController,
-                shouldShowControls() ? mControlsUiController : null, mBlurUtils);
+        mDepthController.setShowingHomeControls(shouldUseControlsLayout());
+        ActionsDialog dialog = new ActionsDialog(mContext, mAdapter, mOverflowAdapter,
+                getWalletPanelViewController(), mDepthController, mSysuiColorExtractor,
+                mStatusBarService, mNotificationShadeWindowController,
+                shouldShowControls() ? mControlsUiController : null, mBlurUtils,
+                shouldUseControlsLayout(), this::onRotate);
         dialog.setCanceledOnTouchOutside(false); // Handled by the custom class.
         dialog.setKeyguardShowing(mKeyguardShowing);
 
@@ -644,7 +707,7 @@
 
         @Override
         public boolean shouldBeSeparated() {
-            return !shouldShowControls();
+            return !shouldUseControlsLayout();
         }
 
         @Override
@@ -652,7 +715,7 @@
                 Context context, View convertView, ViewGroup parent, LayoutInflater inflater) {
             View v = super.create(context, convertView, parent, inflater);
             int textColor;
-            if (shouldShowControls()) {
+            if (shouldUseControlsLayout()) {
                 v.setBackgroundTintList(ColorStateList.valueOf(v.getResources().getColor(
                         com.android.systemui.R.color.global_actions_emergency_background)));
                 textColor = v.getResources().getColor(
@@ -769,7 +832,8 @@
             mHandler.postDelayed(new Runnable() {
                 @Override
                 public void run() {
-                    mScreenshotHelper.takeScreenshot(1, true, true, mHandler, null);
+                    mScreenshotHelper.takeScreenshot(TAKE_SCREENSHOT_FULLSCREEN, true, true,
+                            SCREENSHOT_GLOBAL_ACTIONS, mHandler, null);
                     mMetricsLogger.action(MetricsEvent.ACTION_SCREENSHOT_POWER_MENU);
                     mUiEventLogger.log(GlobalActionsEvent.GA_SCREENSHOT_PRESS);
                 }
@@ -1020,7 +1084,7 @@
         return currentUser == null || currentUser.isPrimary();
     }
 
-    private void addUsersToMenu(ArrayList<Action> items) {
+    private void addUsersToMenu() {
         if (mUserManager.isUserSwitcherEnabled()) {
             List<UserInfo> users = mUserManager.getUsers();
             UserInfo currentUser = getCurrentUser();
@@ -1050,7 +1114,7 @@
                             return false;
                         }
                     };
-                    items.add(switchToUser);
+                    addActionItem(switchToUser);
                 }
             }
         }
@@ -1092,18 +1156,14 @@
     }
 
     private int getActionLayoutId() {
-        if (shouldShowControls()) {
+        if (shouldUseControlsLayout()) {
             return com.android.systemui.R.layout.global_actions_grid_item_v2;
         }
         return com.android.systemui.R.layout.global_actions_grid_item;
     }
 
     /**
-     * The adapter used for the list within the global actions dialog, taking into account whether
-     * the keyguard is showing via
-     * {@link com.android.systemui.globalactions.GlobalActionsDialog#mKeyguardShowing}
-     * and whether the device is provisioned via
-     * {@link com.android.systemui.globalactions.GlobalActionsDialog#mDeviceProvisioned}.
+     * The adapter used for power menu items shown in the global actions dialog.
      */
     public class MyAdapter extends MultiListAdapter {
         private int countItems(boolean separated) {
@@ -1111,23 +1171,13 @@
             for (int i = 0; i < mItems.size(); i++) {
                 final Action action = mItems.get(i);
 
-                if (shouldBeShown(action) && action.shouldBeSeparated() == separated) {
+                if (action.shouldBeSeparated() == separated) {
                     count++;
                 }
             }
             return count;
         }
 
-        private boolean shouldBeShown(Action action) {
-            if (mKeyguardShowing && !action.showDuringKeyguard()) {
-                return false;
-            }
-            if (!mDeviceProvisioned && !action.showBeforeProvisioning()) {
-                return false;
-            }
-            return true;
-        }
-
         @Override
         public int countSeparatedItems() {
             return countItems(true);
@@ -1158,7 +1208,7 @@
             int filteredPos = 0;
             for (int i = 0; i < mItems.size(); i++) {
                 final Action action = mItems.get(i);
-                if (!shouldBeShown(action)) {
+                if (!shouldShowAction(action)) {
                     continue;
                 }
                 if (filteredPos == position) {
@@ -1223,6 +1273,79 @@
         }
     }
 
+    /**
+     * The adapter used for items in the overflow menu.
+     */
+    public class MyOverflowAdapter extends BaseAdapter {
+        @Override
+        public int getCount() {
+            return mOverflowItems.size();
+        }
+
+        @Override
+        public Action getItem(int position) {
+            return mOverflowItems.get(position);
+        }
+
+        @Override
+        public long getItemId(int position) {
+            return position;
+        }
+
+        @Override
+        public View getView(int position, View convertView, ViewGroup parent) {
+            Action action = getItem(position);
+            if (action == null) {
+                Log.w(TAG, "No overflow action found at position: " + position);
+                return null;
+            }
+            int viewLayoutResource = com.android.systemui.R.layout.controls_more_item;
+            View view = convertView != null ? convertView
+                    : LayoutInflater.from(mContext).inflate(viewLayoutResource, parent, false);
+            TextView textView = (TextView) view;
+            textView.setOnClickListener(v -> onClickItem(position));
+            if (action.getMessageResId() != 0) {
+                textView.setText(action.getMessageResId());
+            } else {
+                textView.setText(action.getMessage());
+            }
+
+            if (action instanceof LongPressAction) {
+                textView.setOnLongClickListener(v -> onLongClickItem(position));
+            } else {
+                textView.setOnLongClickListener(null);
+            }
+            return textView;
+        }
+
+        private boolean onLongClickItem(int position) {
+            final Action action = getItem(position);
+            if (action instanceof LongPressAction) {
+                if (mDialog != null) {
+                    mDialog.hidePowerOverflowMenu();
+                    mDialog.dismiss();
+                } else {
+                    Log.w(TAG, "Action long-clicked while mDialog is null.");
+                }
+                return ((LongPressAction) action).onLongPress();
+            }
+            return false;
+        }
+
+        private void onClickItem(int position) {
+            Action item = getItem(position);
+            if (!(item instanceof SilentModeTriStateAction)) {
+                if (mDialog != null) {
+                    mDialog.hidePowerOverflowMenu();
+                    mDialog.dismiss();
+                } else {
+                    Log.w(TAG, "Action clicked while mDialog is null.");
+                }
+                item.onPress();
+            }
+        }
+    }
+
     // note: the scheme below made more sense when we were planning on having
     // 8 different things in the global actions dialog.  seems overkill with
     // only 3 items now, but may as well keep this flexible approach so it will
@@ -1248,8 +1371,8 @@
         boolean showDuringKeyguard();
 
         /**
-         * @return whether this action should appear in the dialog before the device is
-         * provisioned.onlongpress
+         * @return whether this action should appear in the dialog before the
+         * device is provisioned.f
          */
         boolean showBeforeProvisioning();
 
@@ -1258,6 +1381,18 @@
         default boolean shouldBeSeparated() {
             return false;
         }
+
+        /**
+         * Return the id of the message associated with this action, or 0 if it doesn't have one.
+         * @return
+         */
+        int getMessageResId();
+
+        /**
+         * Return the message associated with this action, or null if it doesn't have one.
+         * @return
+         */
+        CharSequence getMessage();
     }
 
     /**
@@ -1309,6 +1444,15 @@
             }
         }
 
+
+        public int getMessageResId() {
+            return mMessageResId;
+        }
+
+        public CharSequence getMessage() {
+            return mMessage;
+        }
+
         public View create(
                 Context context, View convertView, ViewGroup parent, LayoutInflater inflater) {
             View v = inflater.inflate(getActionLayoutId(), parent, false /* attach */);
@@ -1396,6 +1540,23 @@
             return context.getString(mMessageResId);
         }
 
+        private boolean isOn() {
+            return mState == ToggleState.On || mState == ToggleState.TurningOn;
+        }
+
+        @Override
+        public CharSequence getMessage() {
+            return null;
+        }
+        @Override
+        public int getMessageResId() {
+            return isOn() ? mEnabledStatusMessageResId : mDisabledStatusMessageResId;
+        }
+
+        private int getIconResId() {
+            return isOn() ? mEnabledIconResId : mDisabledIconResid;
+        }
+
         public View create(Context context, View convertView, ViewGroup parent,
                 LayoutInflater inflater) {
             willCreate();
@@ -1405,17 +1566,15 @@
             ImageView icon = (ImageView) v.findViewById(R.id.icon);
             TextView messageView = (TextView) v.findViewById(R.id.message);
             final boolean enabled = isEnabled();
-            boolean on = ((mState == ToggleState.On) || (mState == ToggleState.TurningOn));
 
             if (messageView != null) {
-                messageView.setText(on ? mEnabledStatusMessageResId : mDisabledStatusMessageResId);
+                messageView.setText(getMessageResId());
                 messageView.setEnabled(enabled);
                 messageView.setSelected(true); // necessary for marquee to work
             }
 
             if (icon != null) {
-                icon.setImageDrawable(context.getDrawable(
-                        (on ? mEnabledIconResId : mDisabledIconResid)));
+                icon.setImageDrawable(context.getDrawable(getIconResId()));
                 icon.setEnabled(enabled);
             }
 
@@ -1553,6 +1712,16 @@
             return null;
         }
 
+        @Override
+        public int getMessageResId() {
+            return 0;
+        }
+
+        @Override
+        public CharSequence getMessage() {
+            return null;
+        }
+
         public View create(Context context, View convertView, ViewGroup parent,
                 LayoutInflater inflater) {
             View v = inflater.inflate(R.layout.global_actions_silent_mode, parent, false);
@@ -1650,7 +1819,7 @@
                 case MESSAGE_DISMISS:
                     if (mDialog != null) {
                         if (SYSTEM_DIALOG_REASON_DREAM.equals(msg.obj)) {
-                            mDialog.dismissImmediately();
+                            mDialog.completeDismiss();
                         } else {
                             mDialog.dismiss();
                         }
@@ -1708,6 +1877,7 @@
 
         private final Context mContext;
         private final MyAdapter mAdapter;
+        private final MyOverflowAdapter mOverflowAdapter;
         private final IStatusBarService mStatusBarService;
         private final IBinder mToken = new Binder();
         private MultiListLayout mGlobalActionsLayout;
@@ -1722,25 +1892,33 @@
         private final NotificationShadeWindowController mNotificationShadeWindowController;
         private final NotificationShadeDepthController mDepthController;
         private final BlurUtils mBlurUtils;
+        private final boolean mUseControlsLayout;
+        private ListPopupWindow mOverflowPopup;
+        private final Runnable mOnRotateCallback;
 
         private ControlsUiController mControlsUiController;
         private ViewGroup mControlsView;
+        private ViewGroup mContainer;
 
-        ActionsDialog(Context context, MyAdapter adapter,
+        ActionsDialog(Context context, MyAdapter adapter, MyOverflowAdapter overflowAdapter,
                 GlobalActionsPanelPlugin.PanelViewController plugin,
                 NotificationShadeDepthController depthController,
                 SysuiColorExtractor sysuiColorExtractor, IStatusBarService statusBarService,
                 NotificationShadeWindowController notificationShadeWindowController,
-                ControlsUiController controlsUiController, BlurUtils blurUtils) {
+                ControlsUiController controlsUiController, BlurUtils blurUtils,
+                boolean useControlsLayout, Runnable onRotateCallback) {
             super(context, com.android.systemui.R.style.Theme_SystemUI_Dialog_GlobalActions);
             mContext = context;
             mAdapter = adapter;
+            mOverflowAdapter = overflowAdapter;
             mDepthController = depthController;
             mColorExtractor = sysuiColorExtractor;
             mStatusBarService = statusBarService;
             mNotificationShadeWindowController = notificationShadeWindowController;
             mControlsUiController = controlsUiController;
             mBlurUtils = blurUtils;
+            mUseControlsLayout = useControlsLayout;
+            mOnRotateCallback = onRotateCallback;
 
             // Window initialization
             Window window = getWindow();
@@ -1817,12 +1995,50 @@
             }
         }
 
+        private ListPopupWindow createPowerOverflowPopup() {
+            ListPopupWindow popup = new ListPopupWindow(new ContextThemeWrapper(
+                    mContext, com.android.systemui.R.style.Control_ListPopupWindow));
+            popup.setWindowLayoutType(WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY);
+            View overflowButton =
+                    findViewById(com.android.systemui.R.id.global_actions_overflow_button);
+            popup.setAnchorView(overflowButton);
+            int parentWidth = mGlobalActionsLayout.getWidth();
+            // arbitrarily set the menu width to half of parent
+            // TODO: Logic for menu sizing based on contents.
+            int halfParentWidth = Math.round(parentWidth * 0.5f);
+            popup.setContentWidth(halfParentWidth);
+            popup.setAdapter(mOverflowAdapter);
+            popup.setModal(true);
+            return popup;
+        }
+
+        private void showPowerOverflowMenu() {
+            mOverflowPopup.show();
+
+            // Width is fixed to slightly more than half of the GlobalActionsLayout container.
+            // TODO: Resize the width of this dialog based on the sizes of the items in it.
+            int width = Math.round(mGlobalActionsLayout.getWidth() * 0.6f);
+
+            ListView listView = mOverflowPopup.getListView();
+            listView.setDividerHeight(mContext.getResources()
+                    .getDimensionPixelSize(com.android.systemui.R.dimen.control_list_divider));
+            listView.setDivider(mContext.getResources().getDrawable(
+                    com.android.systemui.R.drawable.controls_list_divider));
+            mOverflowPopup.setWidth(width);
+            mOverflowPopup.setHorizontalOffset(-width + mOverflowPopup.getAnchorView().getWidth());
+            mOverflowPopup.setVerticalOffset(mOverflowPopup.getAnchorView().getHeight());
+            mOverflowPopup.show();
+        }
+
+        private void hidePowerOverflowMenu() {
+            mOverflowPopup.dismiss();
+        }
+
         private void initializeLayout() {
             setContentView(getGlobalActionsLayoutId(mContext));
             fixNavBarClipping();
             mControlsView = findViewById(com.android.systemui.R.id.global_actions_controls);
             mGlobalActionsLayout = findViewById(com.android.systemui.R.id.global_actions_view);
-            mGlobalActionsLayout.setOutsideTouchListener(view -> dismiss());
             mGlobalActionsLayout.setListViewAccessibilityDelegate(new View.AccessibilityDelegate() {
                 @Override
                 public boolean dispatchPopulateAccessibilityEvent(
@@ -1834,14 +2050,31 @@
             });
             mGlobalActionsLayout.setRotationListener(this::onRotate);
             mGlobalActionsLayout.setAdapter(mAdapter);
+            mContainer = findViewById(com.android.systemui.R.id.global_actions_container);
+            // Some legacy dialog layouts don't have the outer container
+            if (mContainer == null) {
+                mContainer = mGlobalActionsLayout;
+            }
 
-            View globalActionsParent = (View) mGlobalActionsLayout.getParent();
-            globalActionsParent.setOnClickListener(v -> dismiss());
+            mOverflowPopup = createPowerOverflowPopup();
 
-            // add fall-through dismiss handling to root view
-            View rootView = findViewById(com.android.systemui.R.id.global_actions_grid_root);
-            if (rootView != null) {
-                rootView.setOnClickListener(v -> dismiss());
+            View overflowButton = findViewById(
+                    com.android.systemui.R.id.global_actions_overflow_button);
+            if (overflowButton != null) {
+                if (mOverflowAdapter.getCount() > 0) {
+                    overflowButton.setOnClickListener((view) -> showPowerOverflowMenu());
+                    LinearLayout.LayoutParams params =
+                            (LinearLayout.LayoutParams) mGlobalActionsLayout.getLayoutParams();
+                    params.setMarginEnd(0);
+                    mGlobalActionsLayout.setLayoutParams(params);
+                } else {
+                    overflowButton.setVisibility(View.GONE);
+                    LinearLayout.LayoutParams params =
+                            (LinearLayout.LayoutParams) mGlobalActionsLayout.getLayoutParams();
+                    params.setMarginEnd(mContext.getResources().getDimensionPixelSize(
+                            com.android.systemui.R.dimen.global_actions_side_margin));
+                    mGlobalActionsLayout.setLayoutParams(params);
+                }
             }
 
             if (shouldUsePanel()) {
@@ -1849,7 +2082,7 @@
             }
             if (mBackgroundDrawable == null) {
                 mBackgroundDrawable = new ScrimDrawable();
-                if (mControlsUiController != null) {
+                if (mUseControlsLayout) {
                     mScrimAlpha = 1.0f;
                 } else {
                     mScrimAlpha = mBlurUtils.supportsBlursOnWindows()
@@ -1869,7 +2102,7 @@
         }
 
         private int getGlobalActionsLayoutId(Context context) {
-            if (mControlsUiController != null) {
+            if (mUseControlsLayout) {
                 return com.android.systemui.R.layout.global_actions_grid_v2;
             }
 
@@ -1914,9 +2147,9 @@
             if (!(mBackgroundDrawable instanceof ScrimDrawable)) {
                 return;
             }
-            boolean hasControls = mControlsUiController != null;
             ((ScrimDrawable) mBackgroundDrawable).setColor(
-                    !hasControls && colors.supportsDarkText() ? Color.WHITE : Color.BLACK, animate);
+                    !mUseControlsLayout && colors.supportsDarkText()
+                            ? Color.WHITE : Color.BLACK, animate);
             View decorView = getWindow().getDecorView();
             if (colors.supportsDarkText()) {
                 decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR |
@@ -1939,10 +2172,10 @@
             mHadTopUi = mNotificationShadeWindowController.getForceHasTopUi();
             mNotificationShadeWindowController.setForceHasTopUi(true);
             mBackgroundDrawable.setAlpha(0);
-            mGlobalActionsLayout.setTranslationX(mGlobalActionsLayout.getAnimationOffsetX());
-            mGlobalActionsLayout.setTranslationY(mGlobalActionsLayout.getAnimationOffsetY());
-            mGlobalActionsLayout.setAlpha(0);
-            mGlobalActionsLayout.animate()
+            mContainer.setTranslationX(mGlobalActionsLayout.getAnimationOffsetX());
+            mContainer.setTranslationY(mGlobalActionsLayout.getAnimationOffsetY());
+            mContainer.setAlpha(0);
+            mContainer.animate()
                     .alpha(1)
                     .translationX(0)
                     .translationY(0)
@@ -1958,55 +2191,64 @@
                     .start();
             ViewGroup root = (ViewGroup) mGlobalActionsLayout.getRootView();
             root.setOnApplyWindowInsetsListener((v, windowInsets) -> {
-                if (mControlsUiController != null) {
-                    Insets insets = windowInsets.getInsets(WindowInsets.Type.all());
-                    root.setPadding(insets.left, insets.top, insets.right, insets.bottom);
+                if (mUseControlsLayout) {
+                    root.setPadding(windowInsets.getStableInsetLeft(),
+                            windowInsets.getStableInsetTop(),
+                            windowInsets.getStableInsetRight(),
+                            windowInsets.getStableInsetBottom());
                 }
                 return WindowInsets.CONSUMED;
             });
             if (mControlsUiController != null) {
-                mControlsUiController.show(mControlsView);
+                mControlsUiController.show(mControlsView, this::dismissForControlsActivity);
             }
         }
 
         @Override
         public void dismiss() {
+            dismissWithAnimation(() -> {
+                mContainer.setTranslationX(0);
+                mContainer.setTranslationY(0);
+                mContainer.setAlpha(1);
+                mContainer.animate()
+                        .alpha(0)
+                        .translationX(mGlobalActionsLayout.getAnimationOffsetX())
+                        .translationY(mGlobalActionsLayout.getAnimationOffsetY())
+                        .setDuration(450)
+                        .withEndAction(this::completeDismiss)
+                        .setInterpolator(Interpolators.FAST_OUT_SLOW_IN)
+                        .setUpdateListener(animation -> {
+                            float animatedValue = 1f - animation.getAnimatedFraction();
+                            int alpha = (int) (animatedValue * mScrimAlpha * 255);
+                            mBackgroundDrawable.setAlpha(alpha);
+                            mDepthController.updateGlobalDialogVisibility(animatedValue,
+                                    mGlobalActionsLayout);
+                        })
+                        .start();
+            });
+        }
+
+        private void dismissForControlsActivity() {
+            dismissWithAnimation(() -> {
+                ViewGroup root = (ViewGroup) mGlobalActionsLayout.getParent();
+                ControlsAnimations.exitAnimation(root, this::completeDismiss).start();
+            });
+        }
+
+        void dismissWithAnimation(Runnable animation) {
             if (!mShowing) {
                 return;
             }
             mShowing = false;
-            if (mControlsUiController != null) mControlsUiController.hide();
-            mGlobalActionsLayout.setTranslationX(0);
-            mGlobalActionsLayout.setTranslationY(0);
-            mGlobalActionsLayout.setAlpha(1);
-            mGlobalActionsLayout.animate()
-                    .alpha(0)
-                    .translationX(mGlobalActionsLayout.getAnimationOffsetX())
-                    .translationY(mGlobalActionsLayout.getAnimationOffsetY())
-                    .setDuration(550)
-                    .withEndAction(this::completeDismiss)
-                    .setInterpolator(new LogAccelerateInterpolator())
-                    .setUpdateListener(animation -> {
-                        float animatedValue = 1f - animation.getAnimatedFraction();
-                        int alpha = (int) (animatedValue * mScrimAlpha * 255);
-                        mBackgroundDrawable.setAlpha(alpha);
-                        mDepthController.updateGlobalDialogVisibility(animatedValue,
-                                mGlobalActionsLayout);
-                    })
-                    .start();
-            dismissPanel();
-            resetOrientation();
-        }
-
-        void dismissImmediately() {
-            mShowing = false;
-            if (mControlsUiController != null) mControlsUiController.hide();
-            dismissPanel();
-            resetOrientation();
-            completeDismiss();
+            animation.run();
         }
 
         private void completeDismiss() {
+            mShowing = false;
+            resetOrientation();
+            dismissPanel();
+            dismissOverflow();
+            if (mControlsUiController != null) mControlsUiController.hide();
             mNotificationShadeWindowController.setForceHasTopUi(mHadTopUi);
             mDepthController.updateGlobalDialogVisibility(0, null /* view */);
             super.dismiss();
@@ -2018,6 +2260,12 @@
             }
         }
 
+        private void dismissOverflow() {
+            if (mOverflowPopup != null) {
+                mOverflowPopup.dismiss();
+            }
+        }
+
         private void setRotationSuggestionsEnabled(boolean enabled) {
             try {
                 final int userId = Binder.getCallingUserHandle().getIdentifier();
@@ -2060,10 +2308,14 @@
         public void refreshDialog() {
             initializeLayout();
             mGlobalActionsLayout.updateList();
+            if (mControlsUiController != null) {
+                mControlsUiController.show(mControlsView, this::dismissForControlsActivity);
+            }
         }
 
         public void onRotate(int from, int to) {
             if (mShowing) {
+                mOnRotateCallback.run();
                 refreshDialog();
             }
         }
@@ -2090,9 +2342,15 @@
         return isPanelDebugModeEnabled(context);
     }
 
-    private boolean shouldShowControls() {
+    @VisibleForTesting
+    protected boolean shouldShowControls() {
         return mKeyguardStateController.isUnlocked()
                 && mControlsUiController.getAvailable()
                 && !mControlsServiceInfos.isEmpty();
     }
+    // TODO: Remove legacy layout XML and classes.
+    protected boolean shouldUseControlsLayout() {
+        // always use new controls layout
+        return true;
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsFlatLayout.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsFlatLayout.java
index f102561..2f32d97 100644
--- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsFlatLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsFlatLayout.java
@@ -32,7 +32,6 @@
  * Flat, single-row implementation of the button layout created by the global actions dialog.
  */
 public class GlobalActionsFlatLayout extends GlobalActionsLayout {
-    private static final int MAX_ITEMS = 4;
     public GlobalActionsFlatLayout(Context context, AttributeSet attrs) {
         super(context, attrs);
     }
@@ -54,11 +53,28 @@
         return null;
     }
 
+    private View getOverflowButton() {
+        return findViewById(com.android.systemui.R.id.global_actions_overflow_button);
+    }
+
     @Override
     protected void addToListView(View v, boolean reverse) {
-        // only add items to the list view if we haven't hit our max yet
-        if (getListView().getChildCount() < MAX_ITEMS) {
-            super.addToListView(v, reverse);
+        super.addToListView(v, reverse);
+        View overflowButton = getOverflowButton();
+        // if there's an overflow button, make sure it stays at the end
+        if (overflowButton != null) {
+            getListView().removeView(overflowButton);
+            super.addToListView(overflowButton, reverse);
+        }
+    }
+
+    @Override
+    protected void removeAllListViews() {
+        View overflowButton = getOverflowButton();
+        super.removeAllListViews();
+        // if there's an overflow button, add it back after clearing the list views
+        if (overflowButton != null) {
+            super.addToListView(overflowButton, false);
         }
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/glwallpaper/GLWallpaperRenderer.java b/packages/SystemUI/src/com/android/systemui/glwallpaper/GLWallpaperRenderer.java
index 88ab9ef4..6152490 100644
--- a/packages/SystemUI/src/com/android/systemui/glwallpaper/GLWallpaperRenderer.java
+++ b/packages/SystemUI/src/com/android/systemui/glwallpaper/GLWallpaperRenderer.java
@@ -49,20 +49,6 @@
     void onDrawFrame();
 
     /**
-     * Notify ambient mode is changed.
-     * @param inAmbientMode true if in ambient mode.
-     * @param duration duration of transition.
-     */
-    void updateAmbientMode(boolean inAmbientMode, long duration);
-
-    /**
-     * Notify the wallpaper offsets changed.
-     * @param xOffset offset along x axis.
-     * @param yOffset offset along y axis.
-     */
-    void updateOffsets(float xOffset, float yOffset);
-
-    /**
      * Ask renderer to report the surface size it needs.
      */
     Size reportSurfaceSize();
@@ -81,24 +67,4 @@
      */
     void dump(String prefix, FileDescriptor fd, PrintWriter out, String[] args);
 
-    /**
-     * A proxy which owns surface holder.
-     */
-    interface SurfaceProxy {
-
-        /**
-         * Ask proxy to start rendering frame to surface.
-         */
-        void requestRender();
-
-        /**
-         * Ask proxy to prepare render context.
-         */
-        void preRender();
-
-        /**
-         * Ask proxy to destroy render context.
-         */
-        void postRender();
-    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageGLWallpaper.java b/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageGLWallpaper.java
index 626d0cf..fa45ea1 100644
--- a/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageGLWallpaper.java
+++ b/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageGLWallpaper.java
@@ -33,7 +33,6 @@
 import static android.opengl.GLES20.glVertexAttribPointer;
 
 import android.graphics.Bitmap;
-import android.graphics.Rect;
 import android.opengl.GLUtils;
 import android.util.Log;
 
@@ -50,14 +49,9 @@
 class ImageGLWallpaper {
     private static final String TAG = ImageGLWallpaper.class.getSimpleName();
 
-    static final String A_POSITION = "aPosition";
-    static final String A_TEXTURE_COORDINATES = "aTextureCoordinates";
-    static final String U_PER85 = "uPer85";
-    static final String U_REVEAL = "uReveal";
-    static final String U_AOD2OPACITY = "uAod2Opacity";
-    static final String U_TEXTURE = "uTexture";
-
-    private static final int HANDLE_UNDEFINED = -1;
+    private static final String A_POSITION = "aPosition";
+    private static final String A_TEXTURE_COORDINATES = "aTextureCoordinates";
+    private static final String U_TEXTURE = "uTexture";
     private static final int POSITION_COMPONENT_COUNT = 2;
     private static final int TEXTURE_COMPONENT_COUNT = 2;
     private static final int BYTES_PER_FLOAT = 4;
@@ -88,14 +82,9 @@
 
     private int mAttrPosition;
     private int mAttrTextureCoordinates;
-    private int mUniAod2Opacity;
-    private int mUniPer85;
-    private int mUniReveal;
     private int mUniTexture;
     private int mTextureId;
 
-    private float[] mCurrentTexCoordinate;
-
     ImageGLWallpaper(ImageGLProgram program) {
         mProgram = program;
 
@@ -135,31 +124,9 @@
     }
 
     private void setupUniforms() {
-        mUniAod2Opacity = mProgram.getUniformHandle(U_AOD2OPACITY);
-        mUniPer85 = mProgram.getUniformHandle(U_PER85);
-        mUniReveal = mProgram.getUniformHandle(U_REVEAL);
         mUniTexture = mProgram.getUniformHandle(U_TEXTURE);
     }
 
-    int getHandle(String name) {
-        switch (name) {
-            case A_POSITION:
-                return mAttrPosition;
-            case A_TEXTURE_COORDINATES:
-                return mAttrTextureCoordinates;
-            case U_AOD2OPACITY:
-                return mUniAod2Opacity;
-            case U_PER85:
-                return mUniPer85;
-            case U_REVEAL:
-                return mUniReveal;
-            case U_TEXTURE:
-                return mUniTexture;
-            default:
-                return HANDLE_UNDEFINED;
-        }
-    }
-
     void draw() {
         glDrawArrays(GL_TRIANGLES, 0, VERTICES.length / 2);
     }
@@ -201,87 +168,6 @@
     }
 
     /**
-     * This method adjust s(x-axis), t(y-axis) texture coordinates to get current display area
-     * of texture and will be used during transition.
-     * The adjustment happens if either the width or height of the surface is larger than
-     * corresponding size of the display area.
-     * If both width and height are larger than corresponding size of the display area,
-     * the adjustment will happen at both s, t side.
-     *
-     * @param surface The size of the surface.
-     * @param scissor The display area.
-     * @param xOffset The offset amount along s axis.
-     * @param yOffset The offset amount along t axis.
-     */
-    void adjustTextureCoordinates(Rect surface, Rect scissor, float xOffset, float yOffset) {
-        mCurrentTexCoordinate = TEXTURES.clone();
-
-        if (surface == null || scissor == null) {
-            mTextureBuffer.put(mCurrentTexCoordinate);
-            mTextureBuffer.position(0);
-            return;
-        }
-
-        int surfaceWidth = surface.width();
-        int surfaceHeight = surface.height();
-        int scissorWidth = scissor.width();
-        int scissorHeight = scissor.height();
-
-        if (surfaceWidth > scissorWidth) {
-            // Calculate the new s pos in pixels.
-            float pixelS = (float) Math.round((surfaceWidth - scissorWidth) * xOffset);
-            // Calculate the s pos in texture coordinate.
-            float coordinateS = pixelS / surfaceWidth;
-            // Calculate the percentage occupied by the scissor width in surface width.
-            float surfacePercentageW = (float) scissorWidth / surfaceWidth;
-            // Need also consider the case if surface height is smaller than scissor height.
-            if (surfaceHeight < scissorHeight) {
-                // We will narrow the surface percentage to keep aspect ratio.
-                surfacePercentageW *= (float) surfaceHeight / scissorHeight;
-            }
-            // Determine the final s pos, also limit the legal s pos to prevent from out of range.
-            float s = coordinateS + surfacePercentageW > 1f ? 1f - surfacePercentageW : coordinateS;
-            // Traverse the s pos in texture coordinates array and adjust the s pos accordingly.
-            for (int i = 0; i < mCurrentTexCoordinate.length; i += 2) {
-                // indices 2, 4 and 6 are the end of s coordinates.
-                if (i == 2 || i == 4 || i == 6) {
-                    mCurrentTexCoordinate[i] = Math.min(1f, s + surfacePercentageW);
-                } else {
-                    mCurrentTexCoordinate[i] = s;
-                }
-            }
-        }
-
-        if (surfaceHeight > scissorHeight) {
-            // Calculate the new t pos in pixels.
-            float pixelT = (float) Math.round((surfaceHeight - scissorHeight) * yOffset);
-            // Calculate the t pos in texture coordinate.
-            float coordinateT = pixelT / surfaceHeight;
-            // Calculate the percentage occupied by the scissor height in surface height.
-            float surfacePercentageH = (float) scissorHeight / surfaceHeight;
-            // Need also consider the case if surface width is smaller than scissor width.
-            if (surfaceWidth < scissorWidth) {
-                // We will narrow the surface percentage to keep aspect ratio.
-                surfacePercentageH *= (float) surfaceWidth / scissorWidth;
-            }
-            // Determine the final t pos, also limit the legal t pos to prevent from out of range.
-            float t = coordinateT + surfacePercentageH > 1f ? 1f - surfacePercentageH : coordinateT;
-            // Traverse the t pos in texture coordinates array and adjust the t pos accordingly.
-            for (int i = 1; i < mCurrentTexCoordinate.length; i += 2) {
-                // indices 1, 3 and 11 are the end of t coordinates.
-                if (i == 1 || i == 3 || i == 11) {
-                    mCurrentTexCoordinate[i] = Math.min(1f, t + surfacePercentageH);
-                } else {
-                    mCurrentTexCoordinate[i] = t;
-                }
-            }
-        }
-
-        mTextureBuffer.put(mCurrentTexCoordinate);
-        mTextureBuffer.position(0);
-    }
-
-    /**
      * Called to dump current state.
      * @param prefix prefix.
      * @param fd fd.
@@ -289,17 +175,5 @@
      * @param args args.
      */
     public void dump(String prefix, FileDescriptor fd, PrintWriter out, String[] args) {
-        StringBuilder sb = new StringBuilder();
-        sb.append('{');
-        if (mCurrentTexCoordinate != null) {
-            for (int i = 0; i < mCurrentTexCoordinate.length; i++) {
-                sb.append(mCurrentTexCoordinate[i]).append(',');
-                if (i == mCurrentTexCoordinate.length - 1) {
-                    sb.deleteCharAt(sb.length() - 1);
-                }
-            }
-        }
-        sb.append('}');
-        out.print(prefix); out.print("mTexCoordinates="); out.println(sb.toString());
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageProcessHelper.java b/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageProcessHelper.java
deleted file mode 100644
index 703d591..0000000
--- a/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageProcessHelper.java
+++ /dev/null
@@ -1,246 +0,0 @@
-/*
- * Copyright (C) 2019 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.glwallpaper;
-
-import static com.android.systemui.glwallpaper.ImageWallpaperRenderer.WallpaperTexture;
-
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.ColorMatrix;
-import android.graphics.ColorMatrixColorFilter;
-import android.graphics.Matrix;
-import android.graphics.Paint;
-import android.os.AsyncTask;
-import android.os.Handler;
-import android.os.Handler.Callback;
-import android.os.Message;
-import android.util.Log;
-
-/**
- * A helper class that computes threshold from a bitmap.
- * Threshold will be computed each time the user picks a new image wallpaper.
- */
-class ImageProcessHelper {
-    private static final String TAG = ImageProcessHelper.class.getSimpleName();
-    private static final float DEFAULT_THRESHOLD = 0.8f;
-    private static final float DEFAULT_OTSU_THRESHOLD = 0f;
-    private static final float MAX_THRESHOLD = 0.89f;
-    private static final int MSG_UPDATE_THRESHOLD = 1;
-
-    /**
-     * This color matrix will be applied to each pixel to get luminance from rgb by below formula:
-     * Luminance = .2126f * r + .7152f * g + .0722f * b.
-     */
-    private static final float[] LUMINOSITY_MATRIX = new float[] {
-            .2126f,     .0000f,     .0000f,     .0000f,     .0000f,
-            .0000f,     .7152f,     .0000f,     .0000f,     .0000f,
-            .0000f,     .0000f,     .0722f,     .0000f,     .0000f,
-            .0000f,     .0000f,     .0000f,     1.000f,     .0000f
-    };
-
-    private final Handler mHandler = new Handler(new Callback() {
-        @Override
-        public boolean handleMessage(Message msg) {
-            switch (msg.what) {
-                case MSG_UPDATE_THRESHOLD:
-                    mThreshold = (float) msg.obj;
-                    return true;
-                default:
-                    return false;
-            }
-        }
-    });
-
-    private float mThreshold = DEFAULT_THRESHOLD;
-
-    void start(WallpaperTexture texture) {
-        new ThresholdComputeTask(mHandler).execute(texture);
-    }
-
-    float getThreshold() {
-        return Math.min(mThreshold, MAX_THRESHOLD);
-    }
-
-    private static class ThresholdComputeTask extends AsyncTask<WallpaperTexture, Void, Float> {
-        private Handler mUpdateHandler;
-
-        ThresholdComputeTask(Handler handler) {
-            super(handler);
-            mUpdateHandler = handler;
-        }
-
-        @Override
-        protected Float doInBackground(WallpaperTexture... textures) {
-            WallpaperTexture texture = textures[0];
-            final float[] threshold = new float[] {DEFAULT_THRESHOLD};
-            if (texture == null) {
-                Log.e(TAG, "ThresholdComputeTask: WallpaperTexture not initialized");
-                return threshold[0];
-            }
-
-            texture.use(bitmap -> {
-                if (bitmap != null) {
-                    threshold[0] = new Threshold().compute(bitmap);
-                } else {
-                    Log.e(TAG, "ThresholdComputeTask: Can't get bitmap");
-                }
-            });
-            return threshold[0];
-        }
-
-        @Override
-        protected void onPostExecute(Float result) {
-            Message msg = mUpdateHandler.obtainMessage(MSG_UPDATE_THRESHOLD, result);
-            mUpdateHandler.sendMessage(msg);
-        }
-    }
-
-    private static class Threshold {
-        public float compute(Bitmap bitmap) {
-            Bitmap grayscale = toGrayscale(bitmap);
-            int[] histogram = getHistogram(grayscale);
-            boolean isSolidColor = isSolidColor(grayscale, histogram);
-
-            // We will see gray wallpaper during the transition if solid color wallpaper is set,
-            // please refer to b/130360362#comment16.
-            // As a result, we use Percentile85 rather than Otsus if a solid color wallpaper is set.
-            ThresholdAlgorithm algorithm = isSolidColor ? new Percentile85() : new Otsus();
-            return algorithm.compute(grayscale, histogram);
-        }
-
-        private Bitmap toGrayscale(Bitmap bitmap) {
-            int width = bitmap.getWidth();
-            int height = bitmap.getHeight();
-
-            Bitmap grayscale = Bitmap.createBitmap(width, height, bitmap.getConfig(),
-                    false /* hasAlpha */, bitmap.getColorSpace());
-            Canvas canvas = new Canvas(grayscale);
-            ColorMatrix cm = new ColorMatrix(LUMINOSITY_MATRIX);
-            Paint paint = new Paint();
-            paint.setColorFilter(new ColorMatrixColorFilter(cm));
-            canvas.drawBitmap(bitmap, new Matrix(), paint);
-
-            return grayscale;
-        }
-
-        private int[] getHistogram(Bitmap grayscale) {
-            int width = grayscale.getWidth();
-            int height = grayscale.getHeight();
-
-            // TODO: Fine tune the performance here, tracking on b/123615079.
-            int[] histogram = new int[256];
-            for (int row = 0; row < height; row++) {
-                for (int col = 0; col < width; col++) {
-                    int pixel = grayscale.getPixel(col, row);
-                    int y = Color.red(pixel) + Color.green(pixel) + Color.blue(pixel);
-                    histogram[y]++;
-                }
-            }
-
-            return histogram;
-        }
-
-        private boolean isSolidColor(Bitmap bitmap, int[] histogram) {
-            boolean solidColor = false;
-            int pixels = bitmap.getWidth() * bitmap.getHeight();
-
-            // In solid color case, only one element of histogram has value,
-            // which is pixel counts and the value of other elements should be 0.
-            for (int value : histogram) {
-                if (value != 0 && value != pixels) {
-                    break;
-                }
-                if (value == pixels) {
-                    solidColor = true;
-                    break;
-                }
-            }
-            return solidColor;
-        }
-    }
-
-    private static class Percentile85 implements ThresholdAlgorithm {
-        @Override
-        public float compute(Bitmap bitmap, int[] histogram) {
-            float per85 = DEFAULT_THRESHOLD;
-            int pixelCount = bitmap.getWidth() * bitmap.getHeight();
-            float[] acc = new float[256];
-            for (int i = 0; i < acc.length; i++) {
-                acc[i] = (float) histogram[i] / pixelCount;
-                float prev = i == 0 ? 0f : acc[i - 1];
-                float next = acc[i];
-                float idx = (float) (i + 1) / 255;
-                float sum = prev + next;
-                if (prev < 0.85f && sum >= 0.85f) {
-                    per85 = idx;
-                }
-                if (i > 0) {
-                    acc[i] += acc[i - 1];
-                }
-            }
-            return per85;
-        }
-    }
-
-    private static class Otsus implements ThresholdAlgorithm {
-        @Override
-        public float compute(Bitmap bitmap, int[] histogram) {
-            float threshold = DEFAULT_OTSU_THRESHOLD;
-            float maxVariance = 0;
-            float pixelCount = bitmap.getWidth() * bitmap.getHeight();
-            float[] w = new float[2];
-            float[] m = new float[2];
-            float[] u = new float[2];
-
-            for (int i = 0; i < histogram.length; i++) {
-                m[1] += i * histogram[i];
-            }
-
-            w[1] = pixelCount;
-            for (int tonalValue = 0; tonalValue < histogram.length; tonalValue++) {
-                float dU;
-                float variance;
-                float numPixels = histogram[tonalValue];
-                float tmp = numPixels * tonalValue;
-                w[0] += numPixels;
-                w[1] -= numPixels;
-
-                if (w[0] == 0 || w[1] == 0) {
-                    continue;
-                }
-
-                m[0] += tmp;
-                m[1] -= tmp;
-                u[0] = m[0] / w[0];
-                u[1] = m[1] / w[1];
-                dU = u[0] - u[1];
-                variance = w[0] * w[1] * dU * dU;
-
-                if (variance > maxVariance) {
-                    threshold = (tonalValue + 1f) / histogram.length;
-                    maxVariance = variance;
-                }
-            }
-            return threshold;
-        }
-    }
-
-    private interface ThresholdAlgorithm {
-        float compute(Bitmap bitmap, int[] histogram);
-    }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageRevealHelper.java b/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageRevealHelper.java
deleted file mode 100644
index f815b5d..0000000
--- a/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageRevealHelper.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Copyright (C) 2019 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.glwallpaper;
-
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.animation.ValueAnimator;
-import android.util.Log;
-
-import com.android.systemui.Interpolators;
-
-/**
- * Use ValueAnimator and appropriate interpolator to control the progress of reveal transition.
- * The transition will happen while getting awake and quit events.
- */
-class ImageRevealHelper {
-    private static final String TAG = ImageRevealHelper.class.getSimpleName();
-    private static final float MAX_REVEAL = 0f;
-    private static final float MIN_REVEAL = 1f;
-    private static final boolean DEBUG = true;
-
-    private final ValueAnimator mAnimator;
-    private final RevealStateListener mRevealListener;
-    private float mReveal = MAX_REVEAL;
-    private boolean mAwake = false;
-
-    ImageRevealHelper(RevealStateListener listener) {
-        mRevealListener = listener;
-        mAnimator = ValueAnimator.ofFloat();
-        mAnimator.setInterpolator(Interpolators.FAST_OUT_SLOW_IN);
-        mAnimator.addUpdateListener(animator -> {
-            mReveal = (float) animator.getAnimatedValue();
-            if (mRevealListener != null) {
-                mRevealListener.onRevealStateChanged();
-            }
-        });
-        mAnimator.addListener(new AnimatorListenerAdapter() {
-            private boolean mIsCanceled;
-
-            @Override
-            public void onAnimationCancel(Animator animation) {
-                mIsCanceled = true;
-            }
-
-            @Override
-            public void onAnimationEnd(Animator animation) {
-                if (!mIsCanceled && mRevealListener != null) {
-                    if (DEBUG) {
-                        Log.d(TAG, "transition end");
-                    }
-                    mRevealListener.onRevealEnd();
-                }
-                mIsCanceled = false;
-            }
-
-            @Override
-            public void onAnimationStart(Animator animation) {
-                if (mRevealListener != null) {
-                    if (DEBUG) {
-                        Log.d(TAG, "transition start");
-                    }
-                    mRevealListener.onRevealStart(true /* animate */);
-                }
-            }
-        });
-    }
-
-    public float getReveal() {
-        return mReveal;
-    }
-
-    void updateAwake(boolean awake, long duration) {
-        if (DEBUG) {
-            Log.d(TAG, "updateAwake: awake=" + awake + ", duration=" + duration);
-        }
-        mAnimator.cancel();
-        mAwake = awake;
-        if (duration == 0) {
-            // We are transiting from home to aod or aod to home directly,
-            // we don't need to do transition in these cases.
-            mReveal = mAwake ? MAX_REVEAL : MIN_REVEAL;
-            mRevealListener.onRevealStart(false /* animate */);
-            mRevealListener.onRevealStateChanged();
-            mRevealListener.onRevealEnd();
-        } else {
-            mAnimator.setDuration(duration);
-            mAnimator.setFloatValues(mReveal, mAwake ? MAX_REVEAL : MIN_REVEAL);
-            mAnimator.start();
-        }
-    }
-
-    /**
-     * A listener to trace value changes of reveal.
-     */
-    public interface RevealStateListener {
-
-        /**
-         * Called back while reveal status changes.
-         */
-        void onRevealStateChanged();
-
-        /**
-         * Called back while reveal starts.
-         */
-        void onRevealStart(boolean animate);
-
-        /**
-         * Called back while reveal ends.
-         */
-        void onRevealEnd();
-    }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageWallpaperRenderer.java b/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageWallpaperRenderer.java
index e9ddb38..1a0356c 100644
--- a/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageWallpaperRenderer.java
+++ b/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageWallpaperRenderer.java
@@ -19,18 +19,14 @@
 import static android.opengl.GLES20.GL_COLOR_BUFFER_BIT;
 import static android.opengl.GLES20.glClear;
 import static android.opengl.GLES20.glClearColor;
-import static android.opengl.GLES20.glUniform1f;
 import static android.opengl.GLES20.glViewport;
 
 import android.app.WallpaperManager;
 import android.content.Context;
-import android.content.res.Configuration;
 import android.graphics.Bitmap;
 import android.graphics.Rect;
 import android.util.Log;
-import android.util.MathUtils;
 import android.util.Size;
-import android.view.DisplayInfo;
 
 import com.android.systemui.R;
 
@@ -42,57 +38,24 @@
 /**
  * A GL renderer for image wallpaper.
  */
-public class ImageWallpaperRenderer implements GLWallpaperRenderer,
-        ImageRevealHelper.RevealStateListener {
+public class ImageWallpaperRenderer implements GLWallpaperRenderer {
     private static final String TAG = ImageWallpaperRenderer.class.getSimpleName();
-    private static final float SCALE_VIEWPORT_MIN = 1f;
-    private static final float SCALE_VIEWPORT_MAX = 1.1f;
-    private static final boolean DEBUG = true;
+    private static final boolean DEBUG = false;
 
     private final ImageGLProgram mProgram;
     private final ImageGLWallpaper mWallpaper;
-    private final ImageProcessHelper mImageProcessHelper;
-    private final ImageRevealHelper mImageRevealHelper;
-
-    private SurfaceProxy mProxy;
-    private final Rect mScissor;
     private final Rect mSurfaceSize = new Rect();
-    private final Rect mViewport = new Rect();
-    private boolean mScissorMode;
-    private float mXOffset;
-    private float mYOffset;
     private final WallpaperTexture mTexture;
 
-    public ImageWallpaperRenderer(Context context, SurfaceProxy proxy) {
+    public ImageWallpaperRenderer(Context context) {
         final WallpaperManager wpm = context.getSystemService(WallpaperManager.class);
         if (wpm == null) {
             Log.w(TAG, "WallpaperManager not available");
         }
 
         mTexture = new WallpaperTexture(wpm);
-        DisplayInfo displayInfo = new DisplayInfo();
-        context.getDisplay().getDisplayInfo(displayInfo);
-
-        // We only do transition in portrait currently, b/137962047.
-        int orientation = context.getResources().getConfiguration().orientation;
-        if (orientation == Configuration.ORIENTATION_PORTRAIT) {
-            mScissor = new Rect(0, 0, displayInfo.logicalWidth, displayInfo.logicalHeight);
-        } else {
-            mScissor = new Rect(0, 0, displayInfo.logicalHeight, displayInfo.logicalWidth);
-        }
-
-        mProxy = proxy;
         mProgram = new ImageGLProgram(context);
         mWallpaper = new ImageGLWallpaper(mProgram);
-        mImageProcessHelper = new ImageProcessHelper();
-        mImageRevealHelper = new ImageRevealHelper(this);
-
-        startProcessingImage();
-    }
-
-    protected void startProcessingImage() {
-        // Compute threshold of the image, this is an async work.
-        mImageProcessHelper.start(mTexture);
     }
 
     @Override
@@ -121,103 +84,26 @@
 
     @Override
     public void onDrawFrame() {
-        float threshold = mImageProcessHelper.getThreshold();
-        float reveal = mImageRevealHelper.getReveal();
-
-        glUniform1f(mWallpaper.getHandle(ImageGLWallpaper.U_AOD2OPACITY), 1);
-        glUniform1f(mWallpaper.getHandle(ImageGLWallpaper.U_PER85), threshold);
-        glUniform1f(mWallpaper.getHandle(ImageGLWallpaper.U_REVEAL), reveal);
-
         glClear(GL_COLOR_BUFFER_BIT);
-        // We only need to scale viewport while doing transition.
-        if (mScissorMode) {
-            scaleViewport(reveal);
-        } else {
-            glViewport(0, 0, mSurfaceSize.width(), mSurfaceSize.height());
-        }
+        glViewport(0, 0, mSurfaceSize.width(), mSurfaceSize.height());
         mWallpaper.useTexture();
         mWallpaper.draw();
     }
 
     @Override
-    public void updateAmbientMode(boolean inAmbientMode, long duration) {
-        mImageRevealHelper.updateAwake(!inAmbientMode, duration);
-    }
-
-    @Override
-    public void updateOffsets(float xOffset, float yOffset) {
-        mXOffset = xOffset;
-        mYOffset = yOffset;
-        int left = (int) ((mSurfaceSize.width() - mScissor.width()) * xOffset);
-        int right = left + mScissor.width();
-        mScissor.set(left, mScissor.top, right, mScissor.bottom);
-    }
-
-    @Override
     public Size reportSurfaceSize() {
-        mTexture.use(null);
+        mTexture.use(null /* consumer */);
         mSurfaceSize.set(mTexture.getTextureDimensions());
         return new Size(mSurfaceSize.width(), mSurfaceSize.height());
     }
 
     @Override
     public void finish() {
-        mProxy = null;
-    }
-
-    private void scaleViewport(float reveal) {
-        int left = mScissor.left;
-        int top = mScissor.top;
-        int width = mScissor.width();
-        int height = mScissor.height();
-        // Interpolation between SCALE_VIEWPORT_MAX and SCALE_VIEWPORT_MIN by reveal.
-        float vpScaled = MathUtils.lerp(SCALE_VIEWPORT_MIN, SCALE_VIEWPORT_MAX, reveal);
-        // Calculate the offset amount from the lower left corner.
-        float offset = (SCALE_VIEWPORT_MIN - vpScaled) / 2;
-        // Change the viewport.
-        mViewport.set((int) (left + width * offset), (int) (top + height * offset),
-                (int) (width * vpScaled), (int) (height * vpScaled));
-        glViewport(mViewport.left, mViewport.top, mViewport.right, mViewport.bottom);
-    }
-
-    @Override
-    public void onRevealStateChanged() {
-        mProxy.requestRender();
-    }
-
-    @Override
-    public void onRevealStart(boolean animate) {
-        if (animate) {
-            mScissorMode = true;
-            // Use current display area of texture.
-            mWallpaper.adjustTextureCoordinates(mSurfaceSize, mScissor, mXOffset, mYOffset);
-        }
-        mProxy.preRender();
-    }
-
-    @Override
-    public void onRevealEnd() {
-        if (mScissorMode) {
-            mScissorMode = false;
-            // reset texture coordinates to use full texture.
-            mWallpaper.adjustTextureCoordinates(null, null, 0, 0);
-            // We need draw full texture back before finishing render.
-            mProxy.requestRender();
-        }
-        mProxy.postRender();
     }
 
     @Override
     public void dump(String prefix, FileDescriptor fd, PrintWriter out, String[] args) {
-        out.print(prefix); out.print("mProxy="); out.print(mProxy);
         out.print(prefix); out.print("mSurfaceSize="); out.print(mSurfaceSize);
-        out.print(prefix); out.print("mScissor="); out.print(mScissor);
-        out.print(prefix); out.print("mViewport="); out.print(mViewport);
-        out.print(prefix); out.print("mScissorMode="); out.print(mScissorMode);
-        out.print(prefix); out.print("mXOffset="); out.print(mXOffset);
-        out.print(prefix); out.print("mYOffset="); out.print(mYOffset);
-        out.print(prefix); out.print("threshold="); out.print(mImageProcessHelper.getThreshold());
-        out.print(prefix); out.print("mReveal="); out.print(mImageRevealHelper.getReveal());
         out.print(prefix); out.print("mWcgContent="); out.print(isWcgContent());
         mWallpaper.dump(prefix, fd, out, args);
     }
diff --git a/packages/SystemUI/src/com/android/systemui/log/dagger/LogModule.java b/packages/SystemUI/src/com/android/systemui/log/dagger/LogModule.java
index 14e3e93..123cf78 100644
--- a/packages/SystemUI/src/com/android/systemui/log/dagger/LogModule.java
+++ b/packages/SystemUI/src/com/android/systemui/log/dagger/LogModule.java
@@ -61,6 +61,18 @@
         return buffer;
     }
 
+    /** Provides a logging buffer for all logs related to the data layer of notifications. */
+    @Provides
+    @Singleton
+    @NotifInteractionLog
+    public static LogBuffer provideNotifInteractionLogBuffer(
+            LogcatEchoTracker echoTracker,
+            DumpManager dumpManager) {
+        LogBuffer buffer = new LogBuffer("NotifInteractionLog", 50, 10, echoTracker);
+        buffer.attach(dumpManager);
+        return buffer;
+    }
+
     /** Provides a logging buffer for all logs related to Quick Settings. */
     @Provides
     @Singleton
diff --git a/packages/SystemUI/src/com/android/systemui/log/dagger/NotifInteractionLog.java b/packages/SystemUI/src/com/android/systemui/log/dagger/NotifInteractionLog.java
new file mode 100644
index 0000000..20fc6ff
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/log/dagger/NotifInteractionLog.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.log.dagger;
+
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import com.android.systemui.log.LogBuffer;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.Retention;
+
+import javax.inject.Qualifier;
+
+/**
+ * A {@link LogBuffer} for messages related to the user interacting with notifications (e.g.
+ * clicking on them).
+ */
+@Qualifier
+@Documented
+@Retention(RUNTIME)
+public @interface NotifInteractionLog {
+}
diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java b/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java
index 62efd8c..683c793 100644
--- a/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java
@@ -21,20 +21,25 @@
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
+import android.content.SharedPreferences;
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 import android.content.res.ColorStateList;
 import android.graphics.Bitmap;
+import android.graphics.ImageDecoder;
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.GradientDrawable;
 import android.graphics.drawable.Icon;
 import android.graphics.drawable.RippleDrawable;
+import android.media.MediaDescription;
 import android.media.MediaMetadata;
+import android.media.ThumbnailUtils;
 import android.media.session.MediaController;
 import android.media.session.MediaSession;
 import android.media.session.PlaybackState;
+import android.net.Uri;
+import android.service.media.MediaBrowserService;
 import android.util.Log;
-import android.view.KeyEvent;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.View.OnAttachStateChangeListener;
@@ -52,13 +57,12 @@
 import com.android.settingslib.media.MediaDevice;
 import com.android.settingslib.media.MediaOutputSliceConstants;
 import com.android.settingslib.widget.AdaptiveIcon;
-import com.android.systemui.Dependency;
 import com.android.systemui.R;
 import com.android.systemui.plugins.ActivityStarter;
-import com.android.systemui.statusbar.NotificationMediaManager;
-import com.android.systemui.statusbar.NotificationMediaManager.MediaListener;
+import com.android.systemui.qs.QSMediaBrowser;
 import com.android.systemui.util.Assert;
 
+import java.io.IOException;
 import java.util.List;
 import java.util.concurrent.Executor;
 
@@ -67,10 +71,10 @@
  */
 public class MediaControlPanel {
     private static final String TAG = "MediaControlPanel";
-    private final NotificationMediaManager mMediaManager;
     @Nullable private final LocalMediaManager mLocalMediaManager;
     private final Executor mForegroundExecutor;
-    private final Executor mBackgroundExecutor;
+    protected final Executor mBackgroundExecutor;
+    private final ActivityStarter mActivityStarter;
 
     private Context mContext;
     protected LinearLayout mMediaNotifView;
@@ -79,12 +83,18 @@
     private MediaController mController;
     private int mForegroundColor;
     private int mBackgroundColor;
-    protected ComponentName mRecvComponent;
     private MediaDevice mDevice;
+    protected ComponentName mServiceComponent;
     private boolean mIsRegistered = false;
+    private String mKey;
 
     private final int[] mActionIds;
 
+    public static final String MEDIA_PREFERENCES = "media_control_prefs";
+    public static final String MEDIA_PREFERENCE_KEY = "browser_components";
+    private SharedPreferences mSharedPrefs;
+    private boolean mCheckedForResumption = false;
+
     // Button IDs used in notifications
     protected static final int[] NOTIF_ACTION_IDS = {
             com.android.internal.R.id.action0,
@@ -94,6 +104,13 @@
             com.android.internal.R.id.action4
     };
 
+    // URI fields to try loading album art from
+    private static final String[] ART_URIS = {
+            MediaMetadata.METADATA_KEY_ALBUM_ART_URI,
+            MediaMetadata.METADATA_KEY_ART_URI,
+            MediaMetadata.METADATA_KEY_DISPLAY_ICON_URI
+    };
+
     private final MediaController.Callback mSessionCallback = new MediaController.Callback() {
         @Override
         public void onSessionDestroyed() {
@@ -102,12 +119,15 @@
             clearControls();
             makeInactive();
         }
-    };
-
-    private final MediaListener mMediaListener = new MediaListener() {
         @Override
-        public void onMetadataOrStateChanged(MediaMetadata metadata, int state) {
-            if (state == PlaybackState.STATE_NONE) {
+        public void onPlaybackStateChanged(PlaybackState state) {
+            final int s = state != null ? state.getState() : PlaybackState.STATE_NONE;
+            // When the playback state is NONE or CONNECTING, transition the player to the
+            // resumption state. State CONNECTING needs to be considered for Cast sessions. Ending
+            // a cast session in YT results in the CONNECTING state, which makes sense if you
+            // thinking of the session as waiting to connect to another cast device.
+            if (s == PlaybackState.STATE_NONE || s == PlaybackState.STATE_CONNECTING) {
+                Log.d(TAG, "playback state change will trigger resumption, state=" + state);
                 clearControls();
                 makeInactive();
             }
@@ -153,16 +173,17 @@
      * Initialize a new control panel
      * @param context
      * @param parent
-     * @param manager
      * @param routeManager Manager used to listen for device change events.
      * @param layoutId layout resource to use for this control panel
      * @param actionIds resource IDs for action buttons in the layout
      * @param foregroundExecutor foreground executor
      * @param backgroundExecutor background executor, used for processing artwork
+     * @param activityStarter activity starter
      */
-    public MediaControlPanel(Context context, ViewGroup parent, NotificationMediaManager manager,
+    public MediaControlPanel(Context context, ViewGroup parent,
             @Nullable LocalMediaManager routeManager, @LayoutRes int layoutId, int[] actionIds,
-            Executor foregroundExecutor, Executor backgroundExecutor) {
+            Executor foregroundExecutor, Executor backgroundExecutor,
+            ActivityStarter activityStarter) {
         mContext = context;
         LayoutInflater inflater = LayoutInflater.from(mContext);
         mMediaNotifView = (LinearLayout) inflater.inflate(layoutId, parent, false);
@@ -172,11 +193,11 @@
         // attach/detach of views instead of inflating them in the constructor, which would allow
         // mStateListener to be unregistered in detach.
         mMediaNotifView.addOnAttachStateChangeListener(mStateListener);
-        mMediaManager = manager;
         mLocalMediaManager = routeManager;
         mActionIds = actionIds;
         mForegroundExecutor = foregroundExecutor;
         mBackgroundExecutor = backgroundExecutor;
+        mActivityStarter = activityStarter;
     }
 
     /**
@@ -198,95 +219,71 @@
     /**
      * Update the media panel view for the given media session
      * @param token
-     * @param icon
+     * @param iconDrawable
+     * @param largeIcon
      * @param iconColor
      * @param bgColor
      * @param contentIntent
      * @param appNameString
-     * @param device
+     * @param key
      */
-    public void setMediaSession(MediaSession.Token token, Icon icon, int iconColor,
-            int bgColor, PendingIntent contentIntent, String appNameString) {
-        mToken = token;
+    public void setMediaSession(MediaSession.Token token, Drawable iconDrawable, Icon largeIcon,
+            int iconColor, int bgColor, PendingIntent contentIntent, String appNameString,
+            String key) {
+        // Ensure that component names are updated if token has changed
+        if (mToken == null || !mToken.equals(token)) {
+            mToken = token;
+            mServiceComponent = null;
+            mCheckedForResumption = false;
+        }
+
         mForegroundColor = iconColor;
         mBackgroundColor = bgColor;
         mController = new MediaController(mContext, mToken);
+        mKey = key;
 
-        MediaMetadata mediaMetadata = mController.getMetadata();
-
-        // Try to find a receiver for the media button that matches this app
-        PackageManager pm = mContext.getPackageManager();
-        Intent it = new Intent(Intent.ACTION_MEDIA_BUTTON);
-        List<ResolveInfo> info = pm.queryBroadcastReceiversAsUser(it, 0, mContext.getUser());
-        if (info != null) {
-            for (ResolveInfo inf : info) {
-                if (inf.activityInfo.packageName.equals(mController.getPackageName())) {
-                    mRecvComponent = inf.getComponentInfo().getComponentName();
+        // Try to find a browser service component for this app
+        // TODO also check for a media button receiver intended for restarting (b/154127084)
+        // Only check if we haven't tried yet or the session token changed
+        String pkgName = mController.getPackageName();
+        if (mServiceComponent == null && !mCheckedForResumption) {
+            Log.d(TAG, "Checking for service component");
+            PackageManager pm = mContext.getPackageManager();
+            Intent resumeIntent = new Intent(MediaBrowserService.SERVICE_INTERFACE);
+            List<ResolveInfo> resumeInfo = pm.queryIntentServices(resumeIntent, 0);
+            if (resumeInfo != null) {
+                for (ResolveInfo inf : resumeInfo) {
+                    if (inf.serviceInfo.packageName.equals(mController.getPackageName())) {
+                        mBackgroundExecutor.execute(() ->
+                                tryUpdateResumptionList(inf.getComponentInfo().getComponentName()));
+                        break;
+                    }
                 }
             }
+            mCheckedForResumption = true;
         }
 
         mController.registerCallback(mSessionCallback);
 
-        if (mediaMetadata == null) {
-            Log.e(TAG, "Media metadata was null");
-            return;
-        }
-
-        ImageView albumView = mMediaNotifView.findViewById(R.id.album_art);
-        if (albumView != null) {
-            // Resize art in a background thread
-            mBackgroundExecutor.execute(() -> processAlbumArt(mediaMetadata, albumView));
-        }
         mMediaNotifView.setBackgroundTintList(ColorStateList.valueOf(mBackgroundColor));
 
         // Click action
         if (contentIntent != null) {
             mMediaNotifView.setOnClickListener(v -> {
-                try {
-                    contentIntent.send();
-                    // Also close shade
-                    mContext.sendBroadcast(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS));
-                } catch (PendingIntent.CanceledException e) {
-                    Log.e(TAG, "Pending intent was canceled", e);
-                }
+                mActivityStarter.postStartActivityDismissingKeyguard(contentIntent);
             });
         }
 
         // App icon
         ImageView appIcon = mMediaNotifView.findViewById(R.id.icon);
-        Drawable iconDrawable = icon.loadDrawable(mContext);
         iconDrawable.setTint(mForegroundColor);
         appIcon.setImageDrawable(iconDrawable);
 
-        // Song name
-        TextView titleText = mMediaNotifView.findViewById(R.id.header_title);
-        String songName = mediaMetadata.getString(MediaMetadata.METADATA_KEY_TITLE);
-        titleText.setText(songName);
-        titleText.setTextColor(mForegroundColor);
-
-        // Not in mini player:
-        // App title
-        TextView appName = mMediaNotifView.findViewById(R.id.app_name);
-        if (appName != null) {
-            appName.setText(appNameString);
-            appName.setTextColor(mForegroundColor);
-        }
-
-        // Artist name
-        TextView artistText = mMediaNotifView.findViewById(R.id.header_artist);
-        if (artistText != null) {
-            String artistName = mediaMetadata.getString(MediaMetadata.METADATA_KEY_ARTIST);
-            artistText.setText(artistName);
-            artistText.setTextColor(mForegroundColor);
-        }
-
         // Transfer chip
         mSeamless = mMediaNotifView.findViewById(R.id.media_seamless);
         if (mSeamless != null && mLocalMediaManager != null) {
             mSeamless.setVisibility(View.VISIBLE);
             updateDevice(mLocalMediaManager.getCurrentConnectedDevice());
-            ActivityStarter mActivityStarter = Dependency.get(ActivityStarter.class);
             mSeamless.setOnClickListener(v -> {
                 final Intent intent = new Intent()
                         .setAction(MediaOutputSliceConstants.ACTION_MEDIA_OUTPUT)
@@ -299,6 +296,39 @@
         }
 
         makeActive();
+
+        // App title (not in mini player)
+        TextView appName = mMediaNotifView.findViewById(R.id.app_name);
+        if (appName != null) {
+            appName.setText(appNameString);
+            appName.setTextColor(mForegroundColor);
+        }
+
+        MediaMetadata mediaMetadata = mController.getMetadata();
+        if (mediaMetadata == null) {
+            Log.e(TAG, "Media metadata was null");
+            return;
+        }
+
+        ImageView albumView = mMediaNotifView.findViewById(R.id.album_art);
+        if (albumView != null) {
+            // Resize art in a background thread
+            mBackgroundExecutor.execute(() -> processAlbumArt(mediaMetadata, largeIcon, albumView));
+        }
+
+        // Song name
+        TextView titleText = mMediaNotifView.findViewById(R.id.header_title);
+        String songName = mediaMetadata.getString(MediaMetadata.METADATA_KEY_TITLE);
+        titleText.setText(songName);
+        titleText.setTextColor(mForegroundColor);
+
+        // Artist name (not in mini player)
+        TextView artistText = mMediaNotifView.findViewById(R.id.header_artist);
+        if (artistText != null) {
+            String artistName = mediaMetadata.getString(MediaMetadata.METADATA_KEY_ARTIST);
+            artistText.setText(artistName);
+            artistText.setTextColor(mForegroundColor);
+        }
     }
 
     /**
@@ -319,13 +349,24 @@
 
     /**
      * Get the name of the package associated with the current media controller
-     * @return the package name
+     * @return the package name, or null if no controller
      */
     public String getMediaPlayerPackage() {
+        if (mController == null) {
+            return null;
+        }
         return mController.getPackageName();
     }
 
     /**
+     * Return the original notification's key
+     * @return The notification key
+     */
+    public String getKey()  {
+        return mKey;
+    }
+
+    /**
      * Check whether this player has an attached media session.
      * @return whether there is a controller with a current media session.
      */
@@ -361,18 +402,86 @@
 
     /**
      * Process album art for layout
-     * @param metadata media metadata
+     * @param description media description
      * @param albumView view to hold the album art
      */
-    private void processAlbumArt(MediaMetadata metadata, ImageView albumView) {
-        Bitmap albumArt = metadata.getBitmap(MediaMetadata.METADATA_KEY_ALBUM_ART);
-        float radius = mContext.getResources().getDimension(R.dimen.qs_media_corner_radius);
+    protected void processAlbumArt(MediaDescription description, ImageView albumView) {
+        Bitmap albumArt = null;
+
+        // First try loading from URI
+        albumArt = loadBitmapFromUri(description.getIconUri());
+
+        // Then check bitmap
+        if (albumArt == null) {
+            albumArt = description.getIconBitmap();
+        }
+
+        processAlbumArtInternal(albumArt, albumView);
+    }
+
+    /**
+     * Process album art for layout
+     * @param metadata media metadata
+     * @param largeIcon from notification, checked as a fallback if metadata does not have art
+     * @param albumView view to hold the album art
+     */
+    private void processAlbumArt(MediaMetadata metadata, Icon largeIcon, ImageView albumView) {
+        Bitmap albumArt = null;
+
+        // First look in URI fields
+        for (String field : ART_URIS) {
+            String uriString = metadata.getString(field);
+            if (uriString != null) {
+                albumArt = loadBitmapFromUri(Uri.parse(uriString));
+                if (albumArt != null) {
+                    Log.d(TAG, "loaded art from " + field);
+                    break;
+                }
+            }
+        }
+
+        // Then check bitmap field
+        if (albumArt == null) {
+            albumArt = metadata.getBitmap(MediaMetadata.METADATA_KEY_ALBUM_ART);
+        }
+
+        // Finally try the notification's largeIcon
+        if (albumArt == null && largeIcon != null) {
+            albumArt = largeIcon.getBitmap();
+        }
+
+        processAlbumArtInternal(albumArt, albumView);
+    }
+
+    /**
+     * Load a bitmap from a URI
+     * @param uri
+     * @return bitmap, or null if couldn't be loaded
+     */
+    private Bitmap loadBitmapFromUri(Uri uri) {
+        ImageDecoder.Source source = ImageDecoder.createSource(mContext.getContentResolver(), uri);
+        try {
+            return ImageDecoder.decodeBitmap(source);
+        } catch (IOException e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    /**
+     * Resize and crop the image if provided and update the control view
+     * @param albumArt Bitmap of art to display, or null to hide view
+     * @param albumView View that will hold the art
+     */
+    private void processAlbumArtInternal(@Nullable Bitmap albumArt, ImageView albumView) {
+        // Resize
         RoundedBitmapDrawable roundedDrawable = null;
         if (albumArt != null) {
+            float radius = mContext.getResources().getDimension(R.dimen.qs_media_corner_radius);
             Bitmap original = albumArt.copy(Bitmap.Config.ARGB_8888, true);
             int albumSize = (int) mContext.getResources().getDimension(
                     R.dimen.qs_media_album_size);
-            Bitmap scaled = Bitmap.createScaledBitmap(original, albumSize, albumSize, false);
+            Bitmap scaled = ThumbnailUtils.extractThumbnail(original, albumSize, albumSize);
             roundedDrawable = RoundedBitmapDrawableFactory.create(mContext.getResources(), scaled);
             roundedDrawable.setCornerRadius(radius);
         } else {
@@ -440,9 +549,24 @@
     }
 
     /**
-     * Put controls into a resumption state
+     * Puts controls into a resumption state if possible, or calls removePlayer if no component was
+     * found that could resume playback
      */
     public void clearControls() {
+        Log.d(TAG, "clearControls to resumption state package=" + getMediaPlayerPackage());
+        if (mServiceComponent == null) {
+            // If we don't have a way to resume, just remove the player altogether
+            Log.d(TAG, "Removing unresumable controls");
+            removePlayer();
+            return;
+        }
+        resetButtons();
+    }
+
+    /**
+     * Hide the media buttons and show only a restart button
+     */
+    protected void resetButtons() {
         // Hide all the old buttons
         for (int i = 0; i < mActionIds.length; i++) {
             ImageButton thisBtn = mMediaNotifView.findViewById(mActionIds[i]);
@@ -455,27 +579,8 @@
         ImageButton btn = mMediaNotifView.findViewById(mActionIds[0]);
         btn.setOnClickListener(v -> {
             Log.d(TAG, "Attempting to restart session");
-            // Send a media button event to previously found receiver
-            if (mRecvComponent != null) {
-                Intent intent = new Intent(Intent.ACTION_MEDIA_BUTTON);
-                intent.setComponent(mRecvComponent);
-                int keyCode = KeyEvent.KEYCODE_MEDIA_PLAY;
-                intent.putExtra(
-                        Intent.EXTRA_KEY_EVENT,
-                        new KeyEvent(KeyEvent.ACTION_DOWN, keyCode));
-                mContext.sendBroadcast(intent);
-            } else {
-                // If we don't have a receiver, try relaunching the activity instead
-                if (mController.getSessionActivity() != null) {
-                    try {
-                        mController.getSessionActivity().send();
-                    } catch (PendingIntent.CanceledException e) {
-                        Log.e(TAG, "Pending intent was canceled", e);
-                    }
-                } else {
-                    Log.e(TAG, "No receiver or activity to restart");
-                }
-            }
+            QSMediaBrowser browser = new QSMediaBrowser(mContext, null, mServiceComponent);
+            browser.restart();
         });
         btn.setImageDrawable(mContext.getResources().getDrawable(R.drawable.lb_ic_play));
         btn.setImageTintList(ColorStateList.valueOf(mForegroundColor));
@@ -485,7 +590,6 @@
     private void makeActive() {
         Assert.isMainThread();
         if (!mIsRegistered) {
-            mMediaManager.addCallback(mMediaListener);
             if (mLocalMediaManager != null) {
                 mLocalMediaManager.registerCallback(mDeviceCallback);
                 mLocalMediaManager.startScan();
@@ -501,9 +605,71 @@
                 mLocalMediaManager.stopScan();
                 mLocalMediaManager.unregisterCallback(mDeviceCallback);
             }
-            mMediaManager.removeCallback(mMediaListener);
             mIsRegistered = false;
         }
     }
 
+    /**
+     * Verify that we can connect to the given component with a MediaBrowser, and if so, add that
+     * component to the list of resumption components
+     */
+    private void tryUpdateResumptionList(ComponentName componentName) {
+        Log.d(TAG, "Testing if we can connect to " + componentName);
+        QSMediaBrowser.testConnection(mContext,
+                new QSMediaBrowser.Callback() {
+                    @Override
+                    public void onConnected() {
+                        Log.d(TAG, "yes we can resume with " + componentName);
+                        mServiceComponent = componentName;
+                        updateResumptionList(componentName);
+                    }
+
+                    @Override
+                    public void onError() {
+                        Log.d(TAG, "Cannot resume with " + componentName);
+                        mServiceComponent = null;
+                        if (!hasMediaSession()) {
+                            // If it's not active and we can't resume, remove
+                            removePlayer();
+                        }
+                    }
+                },
+                componentName);
+    }
+
+    /**
+     * Add the component to the saved list of media browser services, checking for duplicates and
+     * removing older components that exceed the maximum limit
+     * @param componentName
+     */
+    private synchronized void updateResumptionList(ComponentName componentName) {
+        // Add to front of saved list
+        if (mSharedPrefs == null) {
+            mSharedPrefs = mContext.getSharedPreferences(MEDIA_PREFERENCES, 0);
+        }
+        String componentString = componentName.flattenToString();
+        String listString = mSharedPrefs.getString(MEDIA_PREFERENCE_KEY, null);
+        if (listString == null) {
+            listString = componentString;
+        } else {
+            String[] components = listString.split(QSMediaBrowser.DELIMITER);
+            StringBuilder updated = new StringBuilder(componentString);
+            int nBrowsers = 1;
+            for (int i = 0; i < components.length
+                    && nBrowsers < QSMediaBrowser.MAX_RESUMPTION_CONTROLS; i++) {
+                if (componentString.equals(components[i])) {
+                    continue;
+                }
+                updated.append(QSMediaBrowser.DELIMITER).append(components[i]);
+                nBrowsers++;
+            }
+            listString = updated.toString();
+        }
+        mSharedPrefs.edit().putString(MEDIA_PREFERENCE_KEY, listString).apply();
+    }
+
+    /**
+     * Called when a player can't be resumed to give it an opportunity to hide or remove itself
+     */
+    protected void removePlayer() { }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/media/SeekBarObserver.kt b/packages/SystemUI/src/com/android/systemui/media/SeekBarObserver.kt
index b7658a9..51c157a 100644
--- a/packages/SystemUI/src/com/android/systemui/media/SeekBarObserver.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/SeekBarObserver.kt
@@ -61,6 +61,7 @@
         if (!data.enabled) {
             seekBarView.setEnabled(false)
             seekBarView.getThumb().setAlpha(0)
+            seekBarView.setProgress(0)
             elapsedTimeView.setText("")
             totalTimeView.setText("")
             return
diff --git a/packages/SystemUI/src/com/android/systemui/media/SeekBarViewModel.kt b/packages/SystemUI/src/com/android/systemui/media/SeekBarViewModel.kt
index dd83e42..1425100 100644
--- a/packages/SystemUI/src/com/android/systemui/media/SeekBarViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/SeekBarViewModel.kt
@@ -77,13 +77,25 @@
         val seekAvailable = ((playbackState?.actions ?: 0L) and PlaybackState.ACTION_SEEK_TO) != 0L
         val position = playbackState?.position?.toInt()
         val duration = mediaMetadata?.getLong(MediaMetadata.METADATA_KEY_DURATION)?.toInt()
-        val enabled = if (duration != null && duration <= 0) false else true
+        val enabled = if (playbackState == null ||
+                playbackState?.getState() == PlaybackState.STATE_NONE ||
+                (duration != null && duration <= 0)) false else true
         _data = Progress(enabled, seekAvailable, position, duration, color)
         if (shouldPollPlaybackPosition()) {
             checkPlaybackPosition()
         }
     }
 
+    /**
+     * Puts the seek bar into a resumption state.
+     *
+     * This should be called when the media session behind the controller has been destroyed.
+     */
+    @AnyThread
+    fun clearController() = bgExecutor.execute {
+        _data = _data.copy(enabled = false)
+    }
+
     @AnyThread
     private fun checkPlaybackPosition(): Runnable = bgExecutor.executeDelayed({
         val currentPosition = controller?.playbackState?.position?.toInt()
diff --git a/packages/SystemUI/src/com/android/systemui/pip/PipAnimationController.java b/packages/SystemUI/src/com/android/systemui/pip/PipAnimationController.java
index dba4343..f322489 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/PipAnimationController.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/PipAnimationController.java
@@ -53,16 +53,23 @@
     public static final int TRANSITION_DIRECTION_SAME = 1;
     public static final int TRANSITION_DIRECTION_TO_PIP = 2;
     public static final int TRANSITION_DIRECTION_TO_FULLSCREEN = 3;
+    public static final int TRANSITION_DIRECTION_TO_SPLIT_SCREEN = 4;
 
     @IntDef(prefix = { "TRANSITION_DIRECTION_" }, value = {
             TRANSITION_DIRECTION_NONE,
             TRANSITION_DIRECTION_SAME,
             TRANSITION_DIRECTION_TO_PIP,
-            TRANSITION_DIRECTION_TO_FULLSCREEN
+            TRANSITION_DIRECTION_TO_FULLSCREEN,
+            TRANSITION_DIRECTION_TO_SPLIT_SCREEN
     })
     @Retention(RetentionPolicy.SOURCE)
     public @interface TransitionDirection {}
 
+    public static boolean isOutPipDirection(@TransitionDirection int direction) {
+        return direction == TRANSITION_DIRECTION_TO_FULLSCREEN
+                || direction == TRANSITION_DIRECTION_TO_SPLIT_SCREEN;
+    }
+
     private final Interpolator mFastOutSlowInInterpolator;
     private final PipSurfaceTransactionHelper mSurfaceTransactionHelper;
 
@@ -253,14 +260,13 @@
         }
 
         boolean shouldApplyCornerRadius() {
-            return mTransitionDirection != TRANSITION_DIRECTION_TO_FULLSCREEN;
+            return !isOutPipDirection(mTransitionDirection);
         }
 
         boolean inScaleTransition() {
             if (mAnimationType != ANIM_TYPE_BOUNDS) return false;
             final int direction = getTransitionDirection();
-            return direction != TRANSITION_DIRECTION_TO_FULLSCREEN
-                    && direction != TRANSITION_DIRECTION_TO_PIP;
+            return !isOutPipDirection(direction) && direction != TRANSITION_DIRECTION_TO_PIP;
         }
 
         /**
diff --git a/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java b/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java
index a95d6b7..9eae3ca 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java
@@ -16,7 +16,6 @@
 
 package com.android.systemui.pip;
 
-import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
 import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
 
 import static com.android.systemui.pip.PipAnimationController.ANIM_TYPE_ALPHA;
@@ -25,6 +24,8 @@
 import static com.android.systemui.pip.PipAnimationController.TRANSITION_DIRECTION_SAME;
 import static com.android.systemui.pip.PipAnimationController.TRANSITION_DIRECTION_TO_FULLSCREEN;
 import static com.android.systemui.pip.PipAnimationController.TRANSITION_DIRECTION_TO_PIP;
+import static com.android.systemui.pip.PipAnimationController.TRANSITION_DIRECTION_TO_SPLIT_SCREEN;
+import static com.android.systemui.pip.PipAnimationController.isOutPipDirection;
 
 import android.annotation.NonNull;
 import android.annotation.Nullable;
@@ -48,6 +49,7 @@
 import com.android.internal.os.SomeArgs;
 import com.android.systemui.R;
 import com.android.systemui.pip.phone.PipUpdateThread;
+import com.android.systemui.stackdivider.Divider;
 
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -85,6 +87,7 @@
     private final int mEnterExitAnimationDuration;
     private final PipSurfaceTransactionHelper mSurfaceTransactionHelper;
     private final Map<IBinder, Rect> mBoundsToRestore = new HashMap<>();
+    private final Divider mSplitDivider;
 
     // These callbacks are called on the update thread
     private final PipAnimationController.PipAnimationCallback mPipAnimationCallback =
@@ -126,7 +129,7 @@
     };
 
     @SuppressWarnings("unchecked")
-    private Handler.Callback mUpdateCallbacks = (msg) -> {
+    private final Handler.Callback mUpdateCallbacks = (msg) -> {
         SomeArgs args = (SomeArgs) msg.obj;
         Consumer<Rect> updateBoundsCallback = (Consumer<Rect>) args.arg1;
         switch (msg.what) {
@@ -189,7 +192,8 @@
             mSurfaceControlTransactionFactory;
 
     public PipTaskOrganizer(Context context, @NonNull PipBoundsHandler boundsHandler,
-            @NonNull PipSurfaceTransactionHelper surfaceTransactionHelper) {
+            @NonNull PipSurfaceTransactionHelper surfaceTransactionHelper,
+            @Nullable Divider divider) {
         mMainHandler = new Handler(Looper.getMainLooper());
         mUpdateHandler = new Handler(PipUpdateThread.get().getLooper(), mUpdateCallbacks);
         mPipBoundsHandler = boundsHandler;
@@ -198,6 +202,7 @@
         mSurfaceTransactionHelper = surfaceTransactionHelper;
         mPipAnimationController = new PipAnimationController(context, surfaceTransactionHelper);
         mSurfaceControlTransactionFactory = SurfaceControl.Transaction::new;
+        mSplitDivider = divider;
     }
 
     public Handler getUpdateHandler() {
@@ -226,20 +231,21 @@
 
     /**
      * Dismiss PiP, this is done in two phases using {@link WindowContainerTransaction}
-     * - setActivityWindowingMode to fullscreen at beginning of the transaction. without changing
-     *   the windowing mode of the Task itself. This makes sure the activity render it's fullscreen
+     * - setActivityWindowingMode to undefined at beginning of the transaction. without changing
+     *   the windowing mode of the Task itself. This makes sure the activity render it's final
      *   configuration while the Task is still in PiP.
-     * - setWindowingMode to fullscreen at the end of transition
+     * - setWindowingMode to undefined at the end of transition
      * @param animationDurationMs duration in millisecond for the exiting PiP transition
      */
     public void dismissPip(int animationDurationMs) {
         final WindowContainerTransaction wct = new WindowContainerTransaction();
-        wct.setActivityWindowingMode(mToken, WINDOWING_MODE_FULLSCREEN);
+        wct.setActivityWindowingMode(mToken, WINDOWING_MODE_UNDEFINED);
         WindowOrganizer.applyTransaction(wct);
         final Rect destinationBounds = mBoundsToRestore.remove(mToken.asBinder());
+        final int direction = syncWithSplitScreenBounds(destinationBounds)
+                ? TRANSITION_DIRECTION_TO_SPLIT_SCREEN : TRANSITION_DIRECTION_TO_FULLSCREEN;
         scheduleAnimateResizePip(mLastReportedBounds, destinationBounds,
-                TRANSITION_DIRECTION_TO_FULLSCREEN, animationDurationMs,
-                null /* updateBoundsCallback */);
+                direction, animationDurationMs, null /* updateBoundsCallback */);
         mInPip = false;
     }
 
@@ -282,7 +288,10 @@
      */
     @Override
     public void onTaskVanished(ActivityManager.RunningTaskInfo info) {
-        WindowContainerToken token = info.token;
+        if (!mInPip) {
+            return;
+        }
+        final WindowContainerToken token = info.token;
         Objects.requireNonNull(token, "Requires valid WindowContainerToken");
         if (token.asBinder() != mToken.asBinder()) {
             Log.wtf(TAG, "Unrecognized token: " + token);
@@ -297,6 +306,7 @@
 
     @Override
     public void onTaskInfoChanged(ActivityManager.RunningTaskInfo info) {
+        Objects.requireNonNull(mToken, "onTaskInfoChanged requires valid existing mToken");
         final PictureInPictureParams newParams = info.pictureInPictureParams;
         if (!shouldUpdateDestinationBounds(newParams)) {
             Log.d(TAG, "Ignored onTaskInfoChanged with PiP param: " + newParams);
@@ -321,13 +331,19 @@
      * @param destinationBoundsOut the current destination bounds will be populated to this param
      */
     @SuppressWarnings("unchecked")
-    public void onMovementBoundsChanged(Rect destinationBoundsOut,
+    public void onMovementBoundsChanged(Rect destinationBoundsOut, boolean fromRotation,
             boolean fromImeAdjustment, boolean fromShelfAdjustment) {
         final PipAnimationController.PipTransitionAnimator animator =
                 mPipAnimationController.getCurrentAnimator();
-        destinationBoundsOut.set(mLastReportedBounds);
         if (animator == null || !animator.isRunning()
                 || animator.getTransitionDirection() != TRANSITION_DIRECTION_TO_PIP) {
+            if (mInPip && fromRotation) {
+                // this could happen if rotation finishes before the animation
+                mLastReportedBounds.set(destinationBoundsOut);
+                scheduleFinishResizePip(mLastReportedBounds);
+            } else if (!mLastReportedBounds.isEmpty()) {
+                destinationBoundsOut.set(mLastReportedBounds);
+            }
             return;
         }
 
@@ -375,7 +391,7 @@
             @PipAnimationController.TransitionDirection int direction, int durationMs,
             Consumer<Rect> updateBoundsCallback) {
         if (!mInPip) {
-            // Ignore animation when we are no longer in PIP
+            // can be initiated in other component, ignore if we are no longer in PIP
             return;
         }
         SomeArgs args = SomeArgs.obtain();
@@ -427,6 +443,10 @@
     private void scheduleFinishResizePip(SurfaceControl.Transaction tx,
             Rect destinationBounds, @PipAnimationController.TransitionDirection int direction,
             Consumer<Rect> updateBoundsCallback) {
+        if (!mInPip) {
+            // can be initiated in other component, ignore if we are no longer in PIP
+            return;
+        }
         SomeArgs args = SomeArgs.obtain();
         args.arg1 = updateBoundsCallback;
         args.arg2 = tx;
@@ -441,7 +461,7 @@
     public void scheduleOffsetPip(Rect originalBounds, int offset, int duration,
             Consumer<Rect> updateBoundsCallback) {
         if (!mInPip) {
-            // Ignore offsets when we are no longer in PIP
+            // can be initiated in other component, ignore if we are no longer in PIP
             return;
         }
         SomeArgs args = SomeArgs.obtain();
@@ -508,14 +528,13 @@
         mLastReportedBounds.set(destinationBounds);
         final WindowContainerTransaction wct = new WindowContainerTransaction();
         final Rect taskBounds;
-        if (direction == TRANSITION_DIRECTION_TO_FULLSCREEN) {
+        if (isOutPipDirection(direction)) {
             // If we are animating to fullscreen, then we need to reset the override bounds
-            // on the task to ensure that the task "matches" the parent's bounds, this applies
-            // also to the final windowing mode, which should be reset to undefined rather than
-            // fullscreen.
-            taskBounds = null;
-            wct.setWindowingMode(mToken, WINDOWING_MODE_UNDEFINED)
-                    .setActivityWindowingMode(mToken, WINDOWING_MODE_UNDEFINED);
+            // on the task to ensure that the task "matches" the parent's bounds.
+            taskBounds = (direction == TRANSITION_DIRECTION_TO_FULLSCREEN)
+                    ? null : destinationBounds;
+            // As for the final windowing mode, simply reset it to undefined.
+            wct.setWindowingMode(mToken, WINDOWING_MODE_UNDEFINED);
         } else {
             taskBounds = destinationBounds;
         }
@@ -567,6 +586,24 @@
     }
 
     /**
+     * Sync with {@link #mSplitDivider} on destination bounds if PiP is going to split screen.
+     *
+     * @param destinationBoundsOut contain the updated destination bounds if applicable
+     * @return {@code true} if destinationBounds is altered for split screen
+     */
+    private boolean syncWithSplitScreenBounds(Rect destinationBoundsOut) {
+        if (mSplitDivider == null || !mSplitDivider.inSplitMode()) {
+            // bail early if system is not in split screen mode
+            return false;
+        }
+        // PiP window will go to split-secondary mode instead of fullscreen, populates the
+        // split screen bounds here.
+        destinationBoundsOut.set(
+                mSplitDivider.getView().getNonMinimizedSplitScreenSecondaryBounds());
+        return true;
+    }
+
+    /**
      * Callback interface for PiP transitions (both from and to PiP mode)
      */
     public interface PipTransitionCallback {
diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java
index a2667d9..7897573 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java
@@ -19,7 +19,7 @@
 import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED;
 import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
 
-import static com.android.systemui.pip.PipAnimationController.TRANSITION_DIRECTION_TO_FULLSCREEN;
+import static com.android.systemui.pip.PipAnimationController.isOutPipDirection;
 
 import android.annotation.Nullable;
 import android.app.ActivityManager;
@@ -53,6 +53,7 @@
 import com.android.systemui.shared.system.PinnedStackListenerForwarder.PinnedStackListener;
 import com.android.systemui.shared.system.TaskStackChangeListener;
 import com.android.systemui.shared.system.WindowManagerWrapper;
+import com.android.systemui.stackdivider.Divider;
 import com.android.systemui.util.DeviceConfigProxy;
 import com.android.systemui.util.FloatingContentCoordinator;
 import com.android.systemui.wm.DisplayChangeController;
@@ -97,8 +98,8 @@
         final boolean changed = mPipBoundsHandler.onDisplayRotationChanged(mTmpNormalBounds,
                 displayId, fromRotation, toRotation, t);
         if (changed) {
-            updateMovementBounds(mTmpNormalBounds, false /* fromImeAdjustment */,
-                    false /* fromShelfAdjustment */);
+            updateMovementBounds(mTmpNormalBounds, true /* fromRotation */,
+                    false /* fromImeAdjustment */, false /* fromShelfAdjustment */);
         }
     };
 
@@ -163,7 +164,7 @@
         @Override
         public void onMovementBoundsChanged(boolean fromImeAdjustment) {
             mHandler.post(() -> updateMovementBounds(null /* toBounds */,
-                    fromImeAdjustment, false /* fromShelfAdjustment */));
+                    false /* fromRotation */, fromImeAdjustment, false /* fromShelfAdjustment */));
         }
 
         @Override
@@ -199,7 +200,8 @@
             DeviceConfigProxy deviceConfig,
             PipBoundsHandler pipBoundsHandler,
             PipSnapAlgorithm pipSnapAlgorithm,
-            PipSurfaceTransactionHelper surfaceTransactionHelper) {
+            PipSurfaceTransactionHelper surfaceTransactionHelper,
+            Divider divider) {
         mContext = context;
         mActivityManager = ActivityManager.getService();
 
@@ -214,7 +216,7 @@
         final IActivityTaskManager activityTaskManager = ActivityTaskManager.getService();
         mPipBoundsHandler = pipBoundsHandler;
         mPipTaskOrganizer = new PipTaskOrganizer(context, pipBoundsHandler,
-                surfaceTransactionHelper);
+                surfaceTransactionHelper, divider);
         mPipTaskOrganizer.registerPipTransitionCallback(this);
         mInputConsumerController = InputConsumerController.getPipInputConsumer();
         mMediaController = new PipMediaController(context, mActivityManager, broadcastDispatcher);
@@ -294,7 +296,8 @@
             if (changed) {
                 mTouchHandler.onShelfVisibilityChanged(visible, height);
                 updateMovementBounds(mPipBoundsHandler.getLastDestinationBounds(),
-                        false /* fromImeAdjustment */, true /* fromShelfAdjustment */);
+                        false /* fromRotation */, false /* fromImeAdjustment */,
+                        true /* fromShelfAdjustment */);
             }
         });
     }
@@ -311,7 +314,7 @@
 
     @Override
     public void onPipTransitionStarted(ComponentName activity, int direction) {
-        if (direction == TRANSITION_DIRECTION_TO_FULLSCREEN) {
+        if (isOutPipDirection(direction)) {
             // On phones, the expansion animation that happens on pip tap before restoring
             // to fullscreen makes it so that the bounds received here are the expanded
             // bounds. We want to restore to the unexpanded bounds when re-entering pip,
@@ -338,22 +341,22 @@
 
     @Override
     public void onPipTransitionFinished(ComponentName activity, int direction) {
-        onPipTransitionFinishedOrCanceled();
+        onPipTransitionFinishedOrCanceled(direction);
     }
 
     @Override
     public void onPipTransitionCanceled(ComponentName activity, int direction) {
-        onPipTransitionFinishedOrCanceled();
+        onPipTransitionFinishedOrCanceled(direction);
     }
 
-    private void onPipTransitionFinishedOrCanceled() {
+    private void onPipTransitionFinishedOrCanceled(int direction) {
         // Re-enable touches after the animation completes
         mTouchHandler.setTouchEnabled(true);
-        mTouchHandler.onPinnedStackAnimationEnded();
+        mTouchHandler.onPinnedStackAnimationEnded(direction);
         mMenuController.onPinnedStackAnimationEnded();
     }
 
-    private void updateMovementBounds(@Nullable Rect toBounds,
+    private void updateMovementBounds(@Nullable Rect toBounds, boolean fromRotation,
             boolean fromImeAdjustment, boolean fromShelfAdjustment) {
         // Populate inset / normal bounds and DisplayInfo from mPipBoundsHandler before
         // passing to mTouchHandler/mPipTaskOrganizer
@@ -361,7 +364,7 @@
         mPipBoundsHandler.onMovementBoundsChanged(mTmpInsetBounds, mTmpNormalBounds,
                 outBounds, mTmpDisplayInfo);
         // mTouchHandler would rely on the bounds populated from mPipTaskOrganizer
-        mPipTaskOrganizer.onMovementBoundsChanged(outBounds,
+        mPipTaskOrganizer.onMovementBoundsChanged(outBounds, fromRotation,
                 fromImeAdjustment, fromShelfAdjustment);
         mTouchHandler.onMovementBoundsChanged(mTmpInsetBounds, mTmpNormalBounds,
                 outBounds, fromImeAdjustment, fromShelfAdjustment,
diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivity.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivity.java
index 2b9b171..ec15dd1 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivity.java
@@ -54,6 +54,7 @@
 import android.net.Uri;
 import android.os.Bundle;
 import android.os.Handler;
+import android.os.Looper;
 import android.os.Message;
 import android.os.Messenger;
 import android.os.RemoteException;
@@ -129,9 +130,7 @@
                 }
             };
 
-    private Handler mHandler = new Handler();
-    private Messenger mToControllerMessenger;
-    private Messenger mMessenger = new Messenger(new Handler() {
+    private Handler mHandler = new Handler(Looper.getMainLooper()) {
         @Override
         public void handleMessage(Message msg) {
             switch (msg.what) {
@@ -174,7 +173,9 @@
                 }
             }
         }
-    });
+    };
+    private Messenger mToControllerMessenger;
+    private Messenger mMessenger = new Messenger(mHandler);
 
     private final Runnable mFinishRunnable = new Runnable() {
         @Override
diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivityController.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivityController.java
index d660b67..61ed40d 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivityController.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivityController.java
@@ -30,6 +30,7 @@
 import android.os.Bundle;
 import android.os.Debug;
 import android.os.Handler;
+import android.os.Looper;
 import android.os.Message;
 import android.os.Messenger;
 import android.os.RemoteException;
@@ -122,7 +123,7 @@
     private boolean mStartActivityRequested;
     private long mStartActivityRequestedTime;
     private Messenger mToActivityMessenger;
-    private Handler mHandler = new Handler() {
+    private Handler mHandler = new Handler(Looper.getMainLooper()) {
         @Override
         public void handleMessage(Message msg) {
             switch (msg.what) {
@@ -133,15 +134,15 @@
                     break;
                 }
                 case MESSAGE_EXPAND_PIP: {
-                    mListeners.forEach(l -> l.onPipExpand());
+                    mListeners.forEach(Listener::onPipExpand);
                     break;
                 }
                 case MESSAGE_DISMISS_PIP: {
-                    mListeners.forEach(l -> l.onPipDismiss());
+                    mListeners.forEach(Listener::onPipDismiss);
                     break;
                 }
                 case MESSAGE_SHOW_MENU: {
-                    mListeners.forEach(l -> l.onPipShowMenu());
+                    mListeners.forEach(Listener::onPipShowMenu);
                     break;
                 }
                 case MESSAGE_UPDATE_ACTIVITY_CALLBACK: {
@@ -259,6 +260,8 @@
         if (DEBUG) {
             Log.d(TAG, "showMenu() state=" + menuState
                     + " hasActivity=" + (mToActivityMessenger != null)
+                    + " allowMenuTimeout=" + allowMenuTimeout
+                    + " willResizeMenu=" + willResizeMenu
                     + " callers=\n" + Debug.getCallers(5, "    "));
         }
 
diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMotionHelper.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMotionHelper.java
index a8a5d89..00f693d 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMotionHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMotionHelper.java
@@ -168,6 +168,7 @@
     void synchronizePinnedStackBounds() {
         cancelAnimations();
         mBounds.set(mPipTaskOrganizer.getLastReportedBounds());
+        mFloatingContentCoordinator.onContentMoved(this);
     }
 
     /**
diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipResizeGestureHandler.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipResizeGestureHandler.java
index 0b07655..d80f18a 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipResizeGestureHandler.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipResizeGestureHandler.java
@@ -56,7 +56,6 @@
 
     private final DisplayMetrics mDisplayMetrics = new DisplayMetrics();
     private final PipBoundsHandler mPipBoundsHandler;
-    private final PipTouchHandler mPipTouchHandler;
     private final PipMotionHelper mMotionHelper;
     private final int mDisplayId;
     private final Executor mMainExecutor;
@@ -70,10 +69,10 @@
     private final Rect mTmpBounds = new Rect();
     private final int mDelta;
 
-    private boolean mAllowGesture = false;
+    private boolean mAllowGesture;
     private boolean mIsAttached;
     private boolean mIsEnabled;
-    private boolean mEnablePipResize;
+    private boolean mEnableUserResize;
 
     private InputMonitor mInputMonitor;
     private InputEventReceiver mInputEventReceiver;
@@ -82,21 +81,20 @@
     private int mCtrlType;
 
     public PipResizeGestureHandler(Context context, PipBoundsHandler pipBoundsHandler,
-            PipTouchHandler pipTouchHandler, PipMotionHelper motionHelper,
-            DeviceConfigProxy deviceConfig, PipTaskOrganizer pipTaskOrganizer) {
+            PipMotionHelper motionHelper, DeviceConfigProxy deviceConfig,
+            PipTaskOrganizer pipTaskOrganizer) {
         final Resources res = context.getResources();
         context.getDisplay().getMetrics(mDisplayMetrics);
         mDisplayId = context.getDisplayId();
         mMainExecutor = context.getMainExecutor();
         mPipBoundsHandler = pipBoundsHandler;
-        mPipTouchHandler = pipTouchHandler;
         mMotionHelper = motionHelper;
         mPipTaskOrganizer = pipTaskOrganizer;
 
         context.getDisplay().getRealSize(mMaxSize);
         mDelta = res.getDimensionPixelSize(R.dimen.pip_resize_edge_size);
 
-        mEnablePipResize = DeviceConfig.getBoolean(
+        mEnableUserResize = DeviceConfig.getBoolean(
                 DeviceConfig.NAMESPACE_SYSTEMUI,
                 PIP_USER_RESIZE,
                 /* defaultValue = */ true);
@@ -105,7 +103,7 @@
                     @Override
                     public void onPropertiesChanged(DeviceConfig.Properties properties) {
                         if (properties.getKeyset().contains(PIP_USER_RESIZE)) {
-                            mEnablePipResize = properties.getBoolean(
+                            mEnableUserResize = properties.getBoolean(
                                     PIP_USER_RESIZE, /* defaultValue = */ true);
                         }
                     }
@@ -134,7 +132,7 @@
     }
 
     private void updateIsEnabled() {
-        boolean isEnabled = mIsAttached && mEnablePipResize;
+        boolean isEnabled = mIsAttached && mEnableUserResize;
         if (isEnabled == mIsEnabled) {
             return;
         }
diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java
index ddba9ea..f5c83c1 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java
@@ -16,6 +16,7 @@
 
 package com.android.systemui.pip.phone;
 
+import static com.android.systemui.pip.PipAnimationController.TRANSITION_DIRECTION_TO_PIP;
 import static com.android.systemui.pip.phone.PipMenuActivityController.MENU_STATE_CLOSE;
 import static com.android.systemui.pip.phone.PipMenuActivityController.MENU_STATE_FULL;
 import static com.android.systemui.pip.phone.PipMenuActivityController.MENU_STATE_NONE;
@@ -56,6 +57,7 @@
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.os.logging.MetricsLoggerWrapper;
 import com.android.systemui.R;
+import com.android.systemui.pip.PipAnimationController;
 import com.android.systemui.pip.PipBoundsHandler;
 import com.android.systemui.pip.PipSnapAlgorithm;
 import com.android.systemui.pip.PipTaskOrganizer;
@@ -229,7 +231,7 @@
         mMotionHelper = new PipMotionHelper(mContext, activityTaskManager, pipTaskOrganizer,
                 mMenuController, mSnapAlgorithm, mFlingAnimationUtils, floatingContentCoordinator);
         mPipResizeGestureHandler =
-                new PipResizeGestureHandler(context, pipBoundsHandler, this, mMotionHelper,
+                new PipResizeGestureHandler(context, pipBoundsHandler, mMotionHelper,
                         deviceConfig, pipTaskOrganizer);
         mTouchState = new PipTouchState(ViewConfiguration.get(context), mHandler,
                 () -> mMenuController.showMenu(MENU_STATE_FULL, mMotionHelper.getBounds(),
@@ -266,6 +268,10 @@
 
         mMagnetizedPip = mMotionHelper.getMagnetizedPip();
         mMagneticTarget = mMagnetizedPip.addTarget(mTargetView, 0);
+
+        // Set the magnetic field radius equal to twice the size of the target.
+        mMagneticTarget.setMagneticFieldRadiusPx(targetSize * 2);
+
         mMagnetizedPip.setPhysicsAnimatorUpdateListener(mMotionHelper.mResizePipUpdateListener);
         mMagnetizedPip.setMagnetListener(new MagnetizedObject.MagnetListener() {
             @Override
@@ -321,7 +327,7 @@
     }
 
     public void onActivityPinned() {
-        createDismissTargetMaybe();
+        createOrUpdateDismissTarget();
 
         mShowPipMenuOnAnimationEnd = true;
         mPipResizeGestureHandler.onActivityPinned();
@@ -339,11 +345,16 @@
         mPipResizeGestureHandler.onActivityUnpinned();
     }
 
-    public void onPinnedStackAnimationEnded() {
+    public void onPinnedStackAnimationEnded(
+            @PipAnimationController.TransitionDirection int direction) {
         // Always synchronize the motion helper bounds once PiP animations finish
         mMotionHelper.synchronizePinnedStackBounds();
         updateMovementBounds();
-        mResizedBounds.set(mMotionHelper.getBounds());
+        if (direction == TRANSITION_DIRECTION_TO_PIP) {
+            // updates mResizedBounds only if it's an entering PiP animation
+            // mResized should be otherwise updated in setMenuState.
+            mResizedBounds.set(mMotionHelper.getBounds());
+        }
 
         if (mShowPipMenuOnAnimationEnd) {
             mMenuController.showMenu(MENU_STATE_CLOSE, mMotionHelper.getBounds(),
@@ -357,8 +368,7 @@
         mMotionHelper.synchronizePinnedStackBounds();
 
         // Recreate the dismiss target for the new orientation.
-        cleanUpDismissTarget();
-        createDismissTargetMaybe();
+        createOrUpdateDismissTarget();
     }
 
     public void onImeVisibilityChanged(boolean imeVisible, int imeHeight) {
@@ -454,43 +464,57 @@
     }
 
     /** Adds the magnetic target view to the WindowManager so it's ready to be animated in. */
-    private void createDismissTargetMaybe() {
+    private void createOrUpdateDismissTarget() {
         if (!mTargetViewContainer.isAttachedToWindow()) {
             mHandler.removeCallbacks(mShowTargetAction);
             mMagneticTargetAnimator.cancel();
 
-            final Point windowSize = new Point();
-            mWindowManager.getDefaultDisplay().getRealSize(windowSize);
-            WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
-                    WindowManager.LayoutParams.MATCH_PARENT,
-                    mDismissAreaHeight,
-                    0, windowSize.y - mDismissAreaHeight,
-                    WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL,
-                    WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
-                            | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
-                            | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
-                    PixelFormat.TRANSLUCENT);
-            lp.setTitle("pip-dismiss-overlay");
-            lp.privateFlags |= WindowManager.LayoutParams.SYSTEM_FLAG_SHOW_FOR_ALL_USERS;
-            lp.setFitInsetsTypes(0 /* types */);
-
             mTargetViewContainer.setVisibility(View.INVISIBLE);
-            mWindowManager.addView(mTargetViewContainer, lp);
+
+            try {
+                mWindowManager.addView(mTargetViewContainer, getDismissTargetLayoutParams());
+            } catch (IllegalStateException e) {
+                // This shouldn't happen, but if the target is already added, just update its layout
+                // params.
+                mWindowManager.updateViewLayout(
+                        mTargetViewContainer, getDismissTargetLayoutParams());
+            }
+        } else {
+            mWindowManager.updateViewLayout(mTargetViewContainer, getDismissTargetLayoutParams());
         }
     }
 
+    /** Returns layout params for the dismiss target, using the latest display metrics. */
+    private WindowManager.LayoutParams getDismissTargetLayoutParams() {
+        final Point windowSize = new Point();
+        mWindowManager.getDefaultDisplay().getRealSize(windowSize);
+
+        final WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
+                WindowManager.LayoutParams.MATCH_PARENT,
+                mDismissAreaHeight,
+                0, windowSize.y - mDismissAreaHeight,
+                WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL,
+                WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
+                        | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
+                        | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
+                PixelFormat.TRANSLUCENT);
+
+        lp.setTitle("pip-dismiss-overlay");
+        lp.privateFlags |= WindowManager.LayoutParams.SYSTEM_FLAG_SHOW_FOR_ALL_USERS;
+        lp.setFitInsetsTypes(0 /* types */);
+
+        return lp;
+    }
+
     /** Makes the dismiss target visible and animates it in, if it isn't already visible. */
     private void showDismissTargetMaybe() {
-        createDismissTargetMaybe();
+        createOrUpdateDismissTarget();
 
         if (mTargetViewContainer.getVisibility() != View.VISIBLE) {
 
             mTargetView.setTranslationY(mTargetViewContainer.getHeight());
             mTargetViewContainer.setVisibility(View.VISIBLE);
 
-            // Set the magnetic field radius to half of PIP's width.
-            mMagneticTarget.setMagneticFieldRadiusPx(mMotionHelper.getBounds().width());
-
             // Cancel in case we were in the middle of animating it out.
             mMagneticTargetAnimator.cancel();
             mMagneticTargetAnimator
diff --git a/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java b/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java
index 3a2d786..6c5312d 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java
@@ -57,6 +57,7 @@
 import com.android.systemui.shared.system.PinnedStackListenerForwarder.PinnedStackListener;
 import com.android.systemui.shared.system.TaskStackChangeListener;
 import com.android.systemui.shared.system.WindowManagerWrapper;
+import com.android.systemui.stackdivider.Divider;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -232,7 +233,8 @@
     @Inject
     public PipManager(Context context, BroadcastDispatcher broadcastDispatcher,
             PipBoundsHandler pipBoundsHandler,
-            PipSurfaceTransactionHelper surfaceTransactionHelper) {
+            PipSurfaceTransactionHelper surfaceTransactionHelper,
+            Divider divider) {
         if (mInitialized) {
             return;
         }
@@ -249,7 +251,7 @@
         mResizeAnimationDuration = context.getResources()
                 .getInteger(R.integer.config_pipResizeAnimationDuration);
         mPipTaskOrganizer = new PipTaskOrganizer(mContext, mPipBoundsHandler,
-                surfaceTransactionHelper);
+                surfaceTransactionHelper, divider);
         mPipTaskOrganizer.registerPipTransitionCallback(this);
         mActivityTaskManager = ActivityTaskManager.getService();
         ActivityManagerWrapper.getInstance().registerTaskStackListener(mTaskStackListener);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSMediaBrowser.java b/packages/SystemUI/src/com/android/systemui/qs/QSMediaBrowser.java
new file mode 100644
index 0000000..302b8420
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSMediaBrowser.java
@@ -0,0 +1,259 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.qs;
+
+import android.app.PendingIntent;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.media.MediaDescription;
+import android.media.browse.MediaBrowser;
+import android.media.session.MediaController;
+import android.media.session.MediaSession;
+import android.os.Bundle;
+import android.service.media.MediaBrowserService;
+import android.util.Log;
+
+import java.util.List;
+
+/**
+ * Media browser for managing resumption in QS media controls
+ */
+public class QSMediaBrowser {
+
+    /** Maximum number of controls to show on boot */
+    public static final int MAX_RESUMPTION_CONTROLS = 5;
+
+    /** Delimiter for saved component names */
+    public static final String DELIMITER = ":";
+
+    private static final String TAG = "QSMediaBrowser";
+    private final Context mContext;
+    private final Callback mCallback;
+    private MediaBrowser mMediaBrowser;
+    private ComponentName mComponentName;
+
+    /**
+     * Initialize a new media browser
+     * @param context the context
+     * @param callback used to report media items found
+     * @param componentName Component name of the MediaBrowserService this browser will connect to
+     */
+    public QSMediaBrowser(Context context, Callback callback, ComponentName componentName) {
+        mContext = context;
+        mCallback = callback;
+        mComponentName = componentName;
+
+        Bundle rootHints = new Bundle();
+        rootHints.putBoolean(MediaBrowserService.BrowserRoot.EXTRA_RECENT, true);
+        mMediaBrowser = new MediaBrowser(mContext,
+                mComponentName,
+                mConnectionCallback,
+                rootHints);
+    }
+
+    /**
+     * Connects to the MediaBrowserService and looks for valid media. If a media item is returned
+     * by the service, QSMediaBrowser.Callback#addTrack will be called with its MediaDescription
+     */
+    public void findRecentMedia() {
+        Log.d(TAG, "Connecting to " + mComponentName);
+        mMediaBrowser.connect();
+    }
+
+    private final MediaBrowser.SubscriptionCallback mSubscriptionCallback =
+            new MediaBrowser.SubscriptionCallback() {
+        @Override
+        public void onChildrenLoaded(String parentId,
+                List<MediaBrowser.MediaItem> children) {
+            if (children.size() == 0) {
+                Log.e(TAG, "No children found");
+                return;
+            }
+            // We ask apps to return a playable item as the first child when sending
+            // a request with EXTRA_RECENT; if they don't, no resume controls
+            MediaBrowser.MediaItem child = children.get(0);
+            MediaDescription desc = child.getDescription();
+            if (child.isPlayable()) {
+                mCallback.addTrack(desc, mMediaBrowser.getServiceComponent(), QSMediaBrowser.this);
+            } else {
+                Log.e(TAG, "Child found but not playable for " + mComponentName);
+            }
+            mMediaBrowser.disconnect();
+        }
+
+        @Override
+        public void onError(String parentId) {
+            Log.e(TAG, "Subscribe error for " + mComponentName + ": " + parentId);
+            mMediaBrowser.disconnect();
+        }
+
+        @Override
+        public void onError(String parentId, Bundle options) {
+            Log.e(TAG, "Subscribe error for " + mComponentName + ": " + parentId
+                    + ", options: " + options);
+            mMediaBrowser.disconnect();
+        }
+    };
+
+    private final MediaBrowser.ConnectionCallback mConnectionCallback =
+            new MediaBrowser.ConnectionCallback() {
+        /**
+         * Invoked after {@link MediaBrowser#connect()} when the request has successfully completed.
+         * For resumption controls, apps are expected to return a playable media item as the first
+         * child. If there are no children or it isn't playable it will be ignored.
+         */
+        @Override
+        public void onConnected() {
+            if (mMediaBrowser.isConnected()) {
+                mCallback.onConnected();
+                Log.d(TAG, "Service connected for " + mComponentName);
+                String root = mMediaBrowser.getRoot();
+                mMediaBrowser.subscribe(root, mSubscriptionCallback);
+            }
+        }
+
+        /**
+         * Invoked when the client is disconnected from the media browser.
+         */
+        @Override
+        public void onConnectionSuspended() {
+            Log.d(TAG, "Connection suspended for " + mComponentName);
+        }
+
+        /**
+         * Invoked when the connection to the media browser failed.
+         */
+        @Override
+        public void onConnectionFailed() {
+            Log.e(TAG, "Connection failed for " + mComponentName);
+            mCallback.onError();
+        }
+    };
+
+    /**
+     * Connects to the MediaBrowserService and starts playback
+     */
+    public void restart() {
+        if (mMediaBrowser.isConnected()) {
+            mMediaBrowser.disconnect();
+        }
+        Bundle rootHints = new Bundle();
+        rootHints.putBoolean(MediaBrowserService.BrowserRoot.EXTRA_RECENT, true);
+        mMediaBrowser = new MediaBrowser(mContext, mComponentName,
+                new MediaBrowser.ConnectionCallback() {
+                    @Override
+                    public void onConnected() {
+                        Log.d(TAG, "Connected for restart " + mMediaBrowser.isConnected());
+                        MediaSession.Token token = mMediaBrowser.getSessionToken();
+                        MediaController controller = new MediaController(mContext, token);
+                        controller.getTransportControls();
+                        controller.getTransportControls().prepare();
+                        controller.getTransportControls().play();
+                    }
+                }, rootHints);
+        mMediaBrowser.connect();
+    }
+
+    /**
+     * Get the media session token
+     * @return the token, or null if the MediaBrowser is null or disconnected
+     */
+    public MediaSession.Token getToken() {
+        if (mMediaBrowser == null || !mMediaBrowser.isConnected()) {
+            return null;
+        }
+        return mMediaBrowser.getSessionToken();
+    }
+
+    /**
+     * Get an intent to launch the app associated with this browser service
+     * @return
+     */
+    public PendingIntent getAppIntent() {
+        PackageManager pm = mContext.getPackageManager();
+        Intent launchIntent = pm.getLaunchIntentForPackage(mComponentName.getPackageName());
+        return PendingIntent.getActivity(mContext, 0, launchIntent, 0);
+    }
+
+    /**
+     * Used to test if SystemUI is allowed to connect to the given component as a MediaBrowser
+     * @param mContext the context
+     * @param callback methods onConnected or onError will be called to indicate whether the
+     *                 connection was successful or not
+     * @param mComponentName Component name of the MediaBrowserService this browser will connect to
+     */
+    public static MediaBrowser testConnection(Context mContext, Callback callback,
+            ComponentName mComponentName) {
+        final MediaBrowser.ConnectionCallback mConnectionCallback =
+                new MediaBrowser.ConnectionCallback() {
+                    @Override
+                    public void onConnected() {
+                        Log.d(TAG, "connected");
+                        callback.onConnected();
+                    }
+
+                    @Override
+                    public void onConnectionSuspended() {
+                        Log.d(TAG, "suspended");
+                        callback.onError();
+                    }
+
+                    @Override
+                    public void onConnectionFailed() {
+                        Log.d(TAG, "failed");
+                        callback.onError();
+                    }
+                };
+        Bundle rootHints = new Bundle();
+        rootHints.putBoolean(MediaBrowserService.BrowserRoot.EXTRA_RECENT, true);
+        MediaBrowser browser = new MediaBrowser(mContext,
+                mComponentName,
+                mConnectionCallback,
+                rootHints);
+        browser.connect();
+        return browser;
+    }
+
+    /**
+     * Interface to handle results from QSMediaBrowser
+     */
+    public static class Callback {
+        /**
+         * Called when the browser has successfully connected to the service
+         */
+        public void onConnected() {
+        }
+
+        /**
+         * Called when the browser encountered an error connecting to the service
+         */
+        public void onError() {
+        }
+
+        /**
+         * Called when the browser finds a suitable track to add to the media carousel
+         * @param track media info for the item
+         * @param component component of the MediaBrowserService which returned this
+         * @param browser reference to the browser
+         */
+        public void addTrack(MediaDescription track, ComponentName component,
+                QSMediaBrowser browser) {
+        }
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSMediaPlayer.java b/packages/SystemUI/src/com/android/systemui/qs/QSMediaPlayer.java
index e636707..e76cd51 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSMediaPlayer.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSMediaPlayer.java
@@ -18,11 +18,13 @@
 
 import static com.android.systemui.util.SysuiLifecycle.viewAttachLifecycle;
 
-import android.app.Notification;
+import android.app.PendingIntent;
 import android.content.Context;
+import android.content.pm.PackageManager;
 import android.content.res.ColorStateList;
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.Icon;
+import android.media.MediaDescription;
 import android.media.session.MediaController;
 import android.media.session.MediaSession;
 import android.util.Log;
@@ -39,7 +41,7 @@
 import com.android.systemui.media.MediaControlPanel;
 import com.android.systemui.media.SeekBarObserver;
 import com.android.systemui.media.SeekBarViewModel;
-import com.android.systemui.statusbar.NotificationMediaManager;
+import com.android.systemui.plugins.ActivityStarter;
 import com.android.systemui.util.concurrency.DelayableExecutor;
 
 import java.util.concurrent.Executor;
@@ -61,24 +63,28 @@
     };
 
     private final QSPanel mParent;
+    private final Executor mForegroundExecutor;
     private final DelayableExecutor mBackgroundExecutor;
     private final SeekBarViewModel mSeekBarViewModel;
     private final SeekBarObserver mSeekBarObserver;
+    private String mPackageName;
 
     /**
      * Initialize quick shade version of player
      * @param context
      * @param parent
-     * @param manager
+     * @param routeManager Provides information about device
      * @param foregroundExecutor
      * @param backgroundExecutor
+     * @param activityStarter
      */
-    public QSMediaPlayer(Context context, ViewGroup parent, NotificationMediaManager manager,
-            LocalMediaManager routeManager, Executor foregroundExecutor,
-            DelayableExecutor backgroundExecutor) {
-        super(context, parent, manager, routeManager, R.layout.qs_media_panel, QS_ACTION_IDS,
-                foregroundExecutor, backgroundExecutor);
+    public QSMediaPlayer(Context context, ViewGroup parent, LocalMediaManager routeManager,
+            Executor foregroundExecutor, DelayableExecutor backgroundExecutor,
+            ActivityStarter activityStarter) {
+        super(context, parent, routeManager, R.layout.qs_media_panel, QS_ACTION_IDS,
+                foregroundExecutor, backgroundExecutor, activityStarter);
         mParent = (QSPanel) parent;
+        mForegroundExecutor = foregroundExecutor;
         mBackgroundExecutor = backgroundExecutor;
         mSeekBarViewModel = new SeekBarViewModel(backgroundExecutor);
         mSeekBarObserver = new SeekBarObserver(getView());
@@ -92,48 +98,103 @@
     }
 
     /**
+     * Add a media panel view based on a media description. Used for resumption
+     * @param description
+     * @param iconColor
+     * @param bgColor
+     * @param contentIntent
+     * @param pkgName
+     */
+    public void setMediaSession(MediaSession.Token token, MediaDescription description,
+            int iconColor, int bgColor, PendingIntent contentIntent, String pkgName) {
+        mPackageName = pkgName;
+        PackageManager pm = getContext().getPackageManager();
+        Drawable icon = null;
+        CharSequence appName = pkgName.substring(pkgName.lastIndexOf("."));
+        try {
+            icon = pm.getApplicationIcon(pkgName);
+            appName = pm.getApplicationLabel(pm.getApplicationInfo(pkgName, 0));
+        } catch (PackageManager.NameNotFoundException e) {
+            Log.e(TAG, "Error getting package information", e);
+        }
+
+        // Set what we can normally
+        super.setMediaSession(token, icon, null, iconColor, bgColor, contentIntent,
+                appName.toString(), null);
+
+        // Then add info from MediaDescription
+        ImageView albumView = mMediaNotifView.findViewById(R.id.album_art);
+        if (albumView != null) {
+            // Resize art in a background thread
+            mBackgroundExecutor.execute(() -> processAlbumArt(description, albumView));
+        }
+
+        // Song name
+        TextView titleText = mMediaNotifView.findViewById(R.id.header_title);
+        CharSequence songName = description.getTitle();
+        titleText.setText(songName);
+        titleText.setTextColor(iconColor);
+
+        // Artist name (not in mini player)
+        TextView artistText = mMediaNotifView.findViewById(R.id.header_artist);
+        if (artistText != null) {
+            CharSequence artistName = description.getSubtitle();
+            artistText.setText(artistName);
+            artistText.setTextColor(iconColor);
+        }
+
+        initLongPressMenu(iconColor);
+
+        // Set buttons to resume state
+        resetButtons();
+    }
+
+    /**
      * Update media panel view for the given media session
      * @param token token for this media session
      * @param icon app notification icon
+     * @param largeIcon notification's largeIcon, used as a fallback for album art
      * @param iconColor foreground color (for text, icons)
      * @param bgColor background color
      * @param actionsContainer a LinearLayout containing the media action buttons
-     * @param notif reference to original notification
-     * @param device current playback device
+     * @param contentIntent Intent to send when user taps on player
+     * @param appName Application title
+     * @param key original notification's key
      */
-    public void setMediaSession(MediaSession.Token token, Icon icon, int iconColor,
-            int bgColor, View actionsContainer, Notification notif) {
+    public void setMediaSession(MediaSession.Token token, Drawable icon, Icon largeIcon,
+            int iconColor, int bgColor, View actionsContainer, PendingIntent contentIntent,
+            String appName, String key) {
 
-        String appName = Notification.Builder.recoverBuilder(getContext(), notif)
-                .loadHeaderAppName();
-        super.setMediaSession(token, icon, iconColor, bgColor, notif.contentIntent,
-                appName);
+        super.setMediaSession(token, icon, largeIcon, iconColor, bgColor, contentIntent, appName,
+                key);
 
         // Media controls
-        LinearLayout parentActionsLayout = (LinearLayout) actionsContainer;
-        int i = 0;
-        for (; i < parentActionsLayout.getChildCount() && i < QS_ACTION_IDS.length; i++) {
-            ImageButton thisBtn = mMediaNotifView.findViewById(QS_ACTION_IDS[i]);
-            ImageButton thatBtn = parentActionsLayout.findViewById(NOTIF_ACTION_IDS[i]);
-            if (thatBtn == null || thatBtn.getDrawable() == null
-                    || thatBtn.getVisibility() != View.VISIBLE) {
-                thisBtn.setVisibility(View.GONE);
-                continue;
+        if (actionsContainer != null) {
+            LinearLayout parentActionsLayout = (LinearLayout) actionsContainer;
+            int i = 0;
+            for (; i < parentActionsLayout.getChildCount() && i < QS_ACTION_IDS.length; i++) {
+                ImageButton thisBtn = mMediaNotifView.findViewById(QS_ACTION_IDS[i]);
+                ImageButton thatBtn = parentActionsLayout.findViewById(NOTIF_ACTION_IDS[i]);
+                if (thatBtn == null || thatBtn.getDrawable() == null
+                        || thatBtn.getVisibility() != View.VISIBLE) {
+                    thisBtn.setVisibility(View.GONE);
+                    continue;
+                }
+
+                Drawable thatIcon = thatBtn.getDrawable();
+                thisBtn.setImageDrawable(thatIcon.mutate());
+                thisBtn.setVisibility(View.VISIBLE);
+                thisBtn.setOnClickListener(v -> {
+                    Log.d(TAG, "clicking on other button");
+                    thatBtn.performClick();
+                });
             }
 
-            Drawable thatIcon = thatBtn.getDrawable();
-            thisBtn.setImageDrawable(thatIcon.mutate());
-            thisBtn.setVisibility(View.VISIBLE);
-            thisBtn.setOnClickListener(v -> {
-                Log.d(TAG, "clicking on other button");
-                thatBtn.performClick();
-            });
-        }
-
-        // Hide any unused buttons
-        for (; i < QS_ACTION_IDS.length; i++) {
-            ImageButton thisBtn = mMediaNotifView.findViewById(QS_ACTION_IDS[i]);
-            thisBtn.setVisibility(View.GONE);
+            // Hide any unused buttons
+            for (; i < QS_ACTION_IDS.length; i++) {
+                ImageButton thisBtn = mMediaNotifView.findViewById(QS_ACTION_IDS[i]);
+                thisBtn.setVisibility(View.GONE);
+            }
         }
 
         // Seek Bar
@@ -141,6 +202,10 @@
         mBackgroundExecutor.execute(
                 () -> mSeekBarViewModel.updateController(controller, iconColor));
 
+        initLongPressMenu(iconColor);
+    }
+
+    private void initLongPressMenu(int iconColor) {
         // Set up long press menu
         View guts = mMediaNotifView.findViewById(R.id.media_guts);
         View options = mMediaNotifView.findViewById(R.id.qs_media_controls_options);
@@ -148,7 +213,7 @@
 
         View clearView = options.findViewById(R.id.remove);
         clearView.setOnClickListener(b -> {
-            mParent.removeMediaPlayer(QSMediaPlayer.this);
+            removePlayer();
         });
         ImageView removeIcon = options.findViewById(R.id.remove_icon);
         removeIcon.setImageTintList(ColorStateList.valueOf(iconColor));
@@ -168,9 +233,9 @@
     }
 
     @Override
-    public void clearControls() {
-        super.clearControls();
-
+    protected void resetButtons() {
+        super.resetButtons();
+        mSeekBarViewModel.clearController();
         View guts = mMediaNotifView.findViewById(R.id.media_guts);
         View options = mMediaNotifView.findViewById(R.id.qs_media_controls_options);
 
@@ -193,4 +258,19 @@
     public void setListening(boolean listening) {
         mSeekBarViewModel.setListening(listening);
     }
+
+    @Override
+    public void removePlayer() {
+        Log.d(TAG, "removing player from parent: " + mParent);
+        // Ensure this happens on the main thread (could happen in QSMediaBrowser callback)
+        mForegroundExecutor.execute(() -> mParent.removeMediaPlayer(QSMediaPlayer.this));
+    }
+
+    @Override
+    public String getMediaPlayerPackage() {
+        if (getController() == null) {
+            return mPackageName;
+        }
+        return super.getMediaPlayerPackage();
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
index 0566b2e..c7ce1af 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
@@ -21,16 +21,26 @@
 import static com.android.systemui.util.Utils.useQsMediaPlayer;
 
 import android.annotation.Nullable;
+import android.app.Notification;
+import android.content.BroadcastReceiver;
 import android.content.ComponentName;
 import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.SharedPreferences;
 import android.content.res.Configuration;
 import android.content.res.Resources;
+import android.graphics.Color;
+import android.graphics.drawable.Drawable;
 import android.graphics.drawable.Icon;
+import android.media.MediaDescription;
 import android.media.session.MediaSession;
 import android.metrics.LogMaker;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.Message;
+import android.os.UserHandle;
+import android.os.UserManager;
 import android.service.notification.StatusBarNotification;
 import android.service.quicksettings.Tile;
 import android.util.AttributeSet;
@@ -54,6 +64,8 @@
 import com.android.systemui.dagger.qualifiers.Background;
 import com.android.systemui.dagger.qualifiers.Main;
 import com.android.systemui.dump.DumpManager;
+import com.android.systemui.media.MediaControlPanel;
+import com.android.systemui.plugins.ActivityStarter;
 import com.android.systemui.plugins.qs.DetailAdapter;
 import com.android.systemui.plugins.qs.QSTile;
 import com.android.systemui.plugins.qs.QSTileView;
@@ -63,7 +75,6 @@
 import com.android.systemui.qs.logging.QSLogger;
 import com.android.systemui.settings.BrightnessController;
 import com.android.systemui.settings.ToggleSliderView;
-import com.android.systemui.statusbar.NotificationMediaManager;
 import com.android.systemui.statusbar.policy.BrightnessMirrorController;
 import com.android.systemui.statusbar.policy.BrightnessMirrorController.BrightnessMirrorListener;
 import com.android.systemui.tuner.TunerService;
@@ -91,6 +102,7 @@
 
     protected final Context mContext;
     protected final ArrayList<TileRecord> mRecords = new ArrayList<>();
+    private final BroadcastDispatcher mBroadcastDispatcher;
     private String mCachedSpecs = "";
     protected final View mBrightnessView;
     private final H mHandler = new H();
@@ -99,11 +111,11 @@
 
     private final LinearLayout mMediaCarousel;
     private final ArrayList<QSMediaPlayer> mMediaPlayers = new ArrayList<>();
-    private final NotificationMediaManager mNotificationMediaManager;
     private final LocalBluetoothManager mLocalBluetoothManager;
     private final Executor mForegroundExecutor;
     private final DelayableExecutor mBackgroundExecutor;
     private boolean mUpdateCarousel = false;
+    private ActivityStarter mActivityStarter;
 
     protected boolean mExpanded;
     protected boolean mListening;
@@ -125,6 +137,19 @@
 
     private BrightnessMirrorController mBrightnessMirrorController;
     private View mDivider;
+    private boolean mHasLoadedMediaControls;
+
+    private final BroadcastReceiver mUserChangeReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            final String action = intent.getAction();
+            if (Intent.ACTION_USER_UNLOCKED.equals(action)) {
+                if (!mHasLoadedMediaControls) {
+                    loadMediaResumptionControls();
+                }
+            }
+        }
+    };
 
     @Inject
     public QSPanel(
@@ -133,19 +158,20 @@
             DumpManager dumpManager,
             BroadcastDispatcher broadcastDispatcher,
             QSLogger qsLogger,
-            NotificationMediaManager notificationMediaManager,
             @Main Executor foregroundExecutor,
             @Background DelayableExecutor backgroundExecutor,
-            @Nullable LocalBluetoothManager localBluetoothManager
+            @Nullable LocalBluetoothManager localBluetoothManager,
+            ActivityStarter activityStarter
     ) {
         super(context, attrs);
         mContext = context;
         mQSLogger = qsLogger;
         mDumpManager = dumpManager;
-        mNotificationMediaManager = notificationMediaManager;
         mForegroundExecutor = foregroundExecutor;
         mBackgroundExecutor = backgroundExecutor;
         mLocalBluetoothManager = localBluetoothManager;
+        mBroadcastDispatcher = broadcastDispatcher;
+        mActivityStarter = activityStarter;
 
         setOrientation(VERTICAL);
 
@@ -180,7 +206,7 @@
         updateResources();
 
         mBrightnessController = new BrightnessController(getContext(),
-                findViewById(R.id.brightness_slider), broadcastDispatcher);
+                findViewById(R.id.brightness_slider), mBroadcastDispatcher);
     }
 
     @Override
@@ -204,13 +230,16 @@
      * Add or update a player for the associated media session
      * @param token
      * @param icon
+     * @param largeIcon
      * @param iconColor
      * @param bgColor
      * @param actionsContainer
      * @param notif
+     * @param key
      */
-    public void addMediaSession(MediaSession.Token token, Icon icon, int iconColor, int bgColor,
-            View actionsContainer, StatusBarNotification notif) {
+    public void addMediaSession(MediaSession.Token token, Drawable icon, Icon largeIcon,
+            int iconColor, int bgColor, View actionsContainer, StatusBarNotification notif,
+            String key) {
         if (!useQsMediaPlayer(mContext)) {
             // Shouldn't happen, but just in case
             Log.e(TAG, "Tried to add media session without player!");
@@ -224,14 +253,20 @@
         QSMediaPlayer player = null;
         String packageName = notif.getPackageName();
         for (QSMediaPlayer p : mMediaPlayers) {
-            if (p.getMediaSessionToken().equals(token)) {
-                Log.d(TAG, "a player for this session already exists");
+            if (p.getKey() == null) {
+                // No notification key = loaded via mediabrowser, so just match on package
+                if (packageName.equals(p.getMediaPlayerPackage())) {
+                    Log.d(TAG, "Found matching resume player by package: " + packageName);
+                    player = p;
+                    break;
+                }
+            } else if (p.getMediaSessionToken().equals(token)) {
+                Log.d(TAG, "Found matching player by token " + packageName);
                 player = p;
                 break;
-            }
-
-            if (packageName.equals(p.getMediaPlayerPackage())) {
-                Log.d(TAG, "found an old session for this app");
+            } else if (packageName.equals(p.getMediaPlayerPackage()) && key.equals(p.getKey())) {
+                // Also match if it's the same package and notification key
+                Log.d(TAG, "Found matching player by package " + packageName + ", " + key);
                 player = p;
                 break;
             }
@@ -252,8 +287,8 @@
             LocalMediaManager routeManager = new LocalMediaManager(mContext, mLocalBluetoothManager,
                     imm, notif.getPackageName());
 
-            player = new QSMediaPlayer(mContext, this, mNotificationMediaManager, routeManager,
-                    mForegroundExecutor, mBackgroundExecutor);
+            player = new QSMediaPlayer(mContext, this, routeManager, mForegroundExecutor,
+                    mBackgroundExecutor, mActivityStarter);
             player.setListening(mListening);
             if (player.isPlaying()) {
                 mMediaCarousel.addView(player.getView(), 0, lp); // add in front
@@ -266,8 +301,10 @@
         }
 
         Log.d(TAG, "setting player session");
-        player.setMediaSession(token, icon, iconColor, bgColor, actionsContainer,
-                notif.getNotification());
+        String appName = Notification.Builder.recoverBuilder(getContext(), notif.getNotification())
+                .loadHeaderAppName();
+        player.setMediaSession(token, icon, largeIcon, iconColor, bgColor, actionsContainer,
+                notif.getNotification().contentIntent, appName, key);
 
         if (mMediaPlayers.size() > 0) {
             ((View) mMediaCarousel.getParent()).setVisibility(View.VISIBLE);
@@ -297,6 +334,74 @@
         return true;
     }
 
+    private final QSMediaBrowser.Callback mMediaBrowserCallback = new QSMediaBrowser.Callback() {
+        @Override
+        public void addTrack(MediaDescription desc, ComponentName component,
+                QSMediaBrowser browser) {
+            if (component == null) {
+                Log.e(TAG, "Component cannot be null");
+                return;
+            }
+
+            Log.d(TAG, "adding track from browser: " + desc + ", " + component);
+            QSMediaPlayer player = new QSMediaPlayer(mContext, QSPanel.this,
+                    null, mForegroundExecutor, mBackgroundExecutor, mActivityStarter);
+
+            String pkgName = component.getPackageName();
+
+            // Add controls to carousel
+            int playerWidth = (int) getResources().getDimension(R.dimen.qs_media_width);
+            int padding = (int) getResources().getDimension(R.dimen.qs_media_padding);
+            LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(playerWidth,
+                    LayoutParams.MATCH_PARENT);
+            lp.setMarginStart(padding);
+            lp.setMarginEnd(padding);
+            mMediaCarousel.addView(player.getView(), lp);
+            ((View) mMediaCarousel.getParent()).setVisibility(View.VISIBLE);
+            mMediaPlayers.add(player);
+
+            int iconColor = Color.DKGRAY;
+            int bgColor = Color.LTGRAY;
+
+            MediaSession.Token token = browser.getToken();
+            player.setMediaSession(token, desc, iconColor, bgColor, browser.getAppIntent(),
+                    pkgName);
+        }
+    };
+
+    /**
+     * Load controls for resuming media, if available
+     */
+    private void loadMediaResumptionControls() {
+        if (!useQsMediaPlayer(mContext)) {
+            return;
+        }
+        Log.d(TAG, "Loading resumption controls");
+
+        //  Look up saved components to resume
+        Context userContext = mContext.createContextAsUser(mContext.getUser(), 0);
+        SharedPreferences prefs = userContext.getSharedPreferences(
+                MediaControlPanel.MEDIA_PREFERENCES, Context.MODE_PRIVATE);
+        String listString = prefs.getString(MediaControlPanel.MEDIA_PREFERENCE_KEY, null);
+        if (listString == null) {
+            Log.d(TAG, "No saved media components");
+            return;
+        }
+
+        String[] components = listString.split(QSMediaBrowser.DELIMITER);
+        Log.d(TAG, "components are: " + listString + " count " + components.length);
+        for (int i = 0; i < components.length && i < QSMediaBrowser.MAX_RESUMPTION_CONTROLS; i++) {
+            String[] info = components[i].split("/");
+            String packageName = info[0];
+            String className = info[1];
+            ComponentName component = new ComponentName(packageName, className);
+            QSMediaBrowser browser = new QSMediaBrowser(mContext, mMediaBrowserCallback,
+                    component);
+            browser.findRecentMedia();
+        }
+        mHasLoadedMediaControls = true;
+    }
+
     protected void addDivider() {
         mDivider = LayoutInflater.from(mContext).inflate(R.layout.qs_divider, this, false);
         mDivider.setBackgroundColor(Utils.applyAlpha(mDivider.getAlpha(),
@@ -347,6 +452,22 @@
             mBrightnessMirrorController.addCallback(this);
         }
         mDumpManager.registerDumpable(getDumpableTag(), this);
+
+        if (getClass() == QSPanel.class) {
+            //TODO(ethibodeau) remove class check after media refactor in ag/11059751
+            // Only run this in QSPanel proper, not QQS
+            IntentFilter filter = new IntentFilter();
+            filter.addAction(Intent.ACTION_USER_UNLOCKED);
+            mBroadcastDispatcher.registerReceiver(mUserChangeReceiver, filter, null,
+                    UserHandle.ALL);
+            mHasLoadedMediaControls = false;
+
+            UserManager userManager = mContext.getSystemService(UserManager.class);
+            if (userManager.isUserUnlocked(mContext.getUserId())) {
+                // If it's already unlocked (like if dark theme was toggled), we can load now
+                loadMediaResumptionControls();
+            }
+        }
     }
 
     @Override
@@ -362,6 +483,7 @@
             mBrightnessMirrorController.removeCallback(this);
         }
         mDumpManager.unregisterDumpable(getDumpableTag());
+        mBroadcastDispatcher.unregisterReceiver(mUserChangeReceiver);
         super.onDetachedFromWindow();
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickQSMediaPlayer.java b/packages/SystemUI/src/com/android/systemui/qs/QuickQSMediaPlayer.java
index 0ba4cb1..f77ff8c 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QuickQSMediaPlayer.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QuickQSMediaPlayer.java
@@ -29,7 +29,7 @@
 
 import com.android.systemui.R;
 import com.android.systemui.media.MediaControlPanel;
-import com.android.systemui.statusbar.NotificationMediaManager;
+import com.android.systemui.plugins.ActivityStarter;
 
 import java.util.concurrent.Executor;
 
@@ -47,29 +47,32 @@
      * Initialize mini media player for QQS
      * @param context
      * @param parent
-     * @param manager
      * @param foregroundExecutor
      * @param backgroundExecutor
+     * @param activityStarter
      */
-    public QuickQSMediaPlayer(Context context, ViewGroup parent, NotificationMediaManager manager,
-            Executor foregroundExecutor, Executor backgroundExecutor) {
-        super(context, parent, manager, null, R.layout.qqs_media_panel, QQS_ACTION_IDS,
-                foregroundExecutor, backgroundExecutor);
+    public QuickQSMediaPlayer(Context context, ViewGroup parent, Executor foregroundExecutor,
+            Executor backgroundExecutor, ActivityStarter activityStarter) {
+        super(context, parent, null, R.layout.qqs_media_panel, QQS_ACTION_IDS,
+                foregroundExecutor, backgroundExecutor, activityStarter);
     }
 
     /**
      * Update media panel view for the given media session
      * @param token token for this media session
      * @param icon app notification icon
+     * @param largeIcon notification's largeIcon, used as a fallback for album art
      * @param iconColor foreground color (for text, icons)
      * @param bgColor background color
      * @param actionsContainer a LinearLayout containing the media action buttons
      * @param actionsToShow indices of which actions to display in the mini player
      *                      (max 3: Notification.MediaStyle.MAX_MEDIA_BUTTONS_IN_COMPACT)
      * @param contentIntent Intent to send when user taps on the view
+     * @param key original notification's key
      */
-    public void setMediaSession(MediaSession.Token token, Icon icon, int iconColor, int bgColor,
-            View actionsContainer, int[] actionsToShow, PendingIntent contentIntent) {
+    public void setMediaSession(MediaSession.Token token, Drawable icon, Icon largeIcon,
+            int iconColor, int bgColor, View actionsContainer, int[] actionsToShow,
+            PendingIntent contentIntent, String key) {
         // Only update if this is a different session and currently playing
         String oldPackage = "";
         if (getController() != null) {
@@ -84,7 +87,7 @@
             return;
         }
 
-        super.setMediaSession(token, icon, iconColor, bgColor, contentIntent, null);
+        super.setMediaSession(token, icon, largeIcon, iconColor, bgColor, contentIntent, null, key);
 
         LinearLayout parentActionsLayout = (LinearLayout) actionsContainer;
         int i = 0;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java
index e6876bd..becf9da 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java
@@ -34,12 +34,12 @@
 import com.android.systemui.dagger.qualifiers.Background;
 import com.android.systemui.dagger.qualifiers.Main;
 import com.android.systemui.dump.DumpManager;
+import com.android.systemui.plugins.ActivityStarter;
 import com.android.systemui.plugins.qs.QSTile;
 import com.android.systemui.plugins.qs.QSTile.SignalState;
 import com.android.systemui.plugins.qs.QSTile.State;
 import com.android.systemui.qs.customize.QSCustomizer;
 import com.android.systemui.qs.logging.QSLogger;
-import com.android.systemui.statusbar.NotificationMediaManager;
 import com.android.systemui.tuner.TunerService;
 import com.android.systemui.tuner.TunerService.Tunable;
 import com.android.systemui.util.Utils;
@@ -83,13 +83,13 @@
             DumpManager dumpManager,
             BroadcastDispatcher broadcastDispatcher,
             QSLogger qsLogger,
-            NotificationMediaManager notificationMediaManager,
             @Main Executor foregroundExecutor,
             @Background DelayableExecutor backgroundExecutor,
-            @Nullable LocalBluetoothManager localBluetoothManager
+            @Nullable LocalBluetoothManager localBluetoothManager,
+            ActivityStarter activityStarter
     ) {
-        super(context, attrs, dumpManager, broadcastDispatcher, qsLogger, notificationMediaManager,
-                foregroundExecutor, backgroundExecutor, localBluetoothManager);
+        super(context, attrs, dumpManager, broadcastDispatcher, qsLogger,
+                foregroundExecutor, backgroundExecutor, localBluetoothManager, activityStarter);
         if (mFooter != null) {
             removeView(mFooter.getView());
         }
@@ -109,7 +109,7 @@
 
             int marginSize = (int) mContext.getResources().getDimension(R.dimen.qqs_media_spacing);
             mMediaPlayer = new QuickQSMediaPlayer(mContext, mHorizontalLinearLayout,
-                    notificationMediaManager, foregroundExecutor, backgroundExecutor);
+                    foregroundExecutor, backgroundExecutor, activityStarter);
             LayoutParams lp2 = new LayoutParams(0, LayoutParams.MATCH_PARENT, 1);
             lp2.setMarginEnd(marginSize);
             lp2.setMarginStart(0);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/ScreenRecordTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/ScreenRecordTile.java
index 6663237..da78903 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/ScreenRecordTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/ScreenRecordTile.java
@@ -18,9 +18,12 @@
 
 import android.content.Intent;
 import android.service.quicksettings.Tile;
+import android.text.TextUtils;
 import android.util.Log;
+import android.widget.Switch;
 
 import com.android.systemui.R;
+import com.android.systemui.plugins.ActivityStarter;
 import com.android.systemui.plugins.qs.QSTile;
 import com.android.systemui.qs.QSHost;
 import com.android.systemui.qs.tileimpl.QSTileImpl;
@@ -35,14 +38,17 @@
         implements RecordingController.RecordingStateChangeCallback {
     private static final String TAG = "ScreenRecordTile";
     private RecordingController mController;
+    private ActivityStarter mActivityStarter;
     private long mMillisUntilFinished = 0;
     private Callback mCallback = new Callback();
 
     @Inject
-    public ScreenRecordTile(QSHost host, RecordingController controller) {
+    public ScreenRecordTile(QSHost host, RecordingController controller,
+            ActivityStarter activityStarter) {
         super(host);
         mController = controller;
         mController.observe(this, mCallback);
+        mActivityStarter = activityStarter;
     }
 
     @Override
@@ -72,6 +78,7 @@
 
         state.value = isRecording || isStarting;
         state.state = (isRecording || isStarting) ? Tile.STATE_ACTIVE : Tile.STATE_INACTIVE;
+        state.label = mContext.getString(R.string.quick_settings_screen_record_label);
 
         if (isRecording) {
             state.icon = ResourceIcon.get(R.drawable.ic_qs_screenrecord);
@@ -87,6 +94,10 @@
             state.icon = ResourceIcon.get(R.drawable.ic_qs_screenrecord);
             state.secondaryLabel = mContext.getString(R.string.quick_settings_screen_record_start);
         }
+        state.contentDescription = TextUtils.isEmpty(state.secondaryLabel)
+                ? state.label
+                : TextUtils.concat(state.label, ", ", state.secondaryLabel);
+        state.expandedAccessibilityClassName = Switch.class.getName();
     }
 
     @Override
@@ -108,7 +119,8 @@
         Log.d(TAG, "Starting countdown");
         // Close QS, otherwise the permission dialog appears beneath it
         getHost().collapsePanels();
-        mController.launchRecordPrompt();
+        Intent intent = mController.getPromptIntent();
+        mActivityStarter.postStartActivityDismissingKeyguard(intent, 0);
     }
 
     private void cancelCountdown() {
diff --git a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyRecentsImpl.java b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyRecentsImpl.java
index 5bf44c6..8051998 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyRecentsImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyRecentsImpl.java
@@ -71,12 +71,13 @@
         public void onActivityRestartAttempt(ActivityManager.RunningTaskInfo task,
                 boolean homeTaskVisible, boolean clearedTask) {
             if (task.configuration.windowConfiguration.getWindowingMode()
-                    != WINDOWING_MODE_SPLIT_SCREEN_PRIMARY) {
+                    != WINDOWING_MODE_SPLIT_SCREEN_PRIMARY || !mDividerOptional.isPresent()) {
                 return;
             }
 
-            if (homeTaskVisible) {
-                showRecentApps(false /* triggeredFromAltTab */);
+            final Divider divider = mDividerOptional.get();
+            if (divider.isMinimized()) {
+                divider.onUndockingTask();
             }
         }
     };
diff --git a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
index 66bc177..fecb7b6 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
@@ -20,6 +20,7 @@
 import static android.view.MotionEvent.ACTION_CANCEL;
 import static android.view.MotionEvent.ACTION_DOWN;
 import static android.view.MotionEvent.ACTION_UP;
+import static android.view.WindowManager.ScreenshotSource.SCREENSHOT_OVERVIEW;
 import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON;
 
 import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_INPUT_MONITOR;
@@ -380,7 +381,7 @@
         public void handleImageAsScreenshot(Bitmap screenImage, Rect locationInScreen,
                 Insets visibleInsets, int taskId) {
             mScreenshotHelper.provideScreenshot(screenImage, locationInScreen, visibleInsets,
-                    taskId, mHandler, null);
+                    taskId, SCREENSHOT_OVERVIEW, mHandler, null);
         }
 
         @Override
diff --git a/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingController.java b/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingController.java
index 8dad08e..ae0a1c4 100644
--- a/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingController.java
+++ b/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingController.java
@@ -59,15 +59,15 @@
     }
 
     /**
-     * Show dialog of screen recording options to user.
+     * Get an intent to show screen recording options to the user.
      */
-    public void launchRecordPrompt() {
+    public Intent getPromptIntent() {
         final ComponentName launcherComponent = new ComponentName(SYSUI_PACKAGE,
                 SYSUI_SCREENRECORD_LAUNCHER);
         final Intent intent = new Intent();
         intent.setComponent(launcherComponent);
         intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-        mContext.startActivity(intent);
+        return intent;
     }
 
     /**
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java
index 1780fb1..70454d4 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java
@@ -36,6 +36,7 @@
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
+import android.content.res.Configuration;
 import android.content.res.Resources;
 import android.graphics.Bitmap;
 import android.graphics.Insets;
@@ -76,6 +77,7 @@
 import android.widget.LinearLayout;
 import android.widget.Toast;
 
+import com.android.internal.logging.UiEventLogger;
 import com.android.systemui.R;
 import com.android.systemui.dagger.qualifiers.Main;
 import com.android.systemui.shared.system.ActivityManagerWrapper;
@@ -104,7 +106,6 @@
      */
     static class SaveImageInBackgroundData {
         public Bitmap image;
-        public Uri imageUri;
         public Consumer<Uri> finisher;
         public GlobalScreenshot.ActionsReadyListener mActionsReadyListener;
         public int errorMsgResId;
@@ -112,13 +113,33 @@
 
         void clearImage() {
             image = null;
-            imageUri = null;
+        }
+    }
+
+    /**
+     * Structure returned by the SaveImageInBackgroundTask
+     */
+    static class SavedImageData {
+        public Uri uri;
+        public Notification.Action shareAction;
+        public Notification.Action editAction;
+        public Notification.Action deleteAction;
+        public List<Notification.Action> smartActions;
+
+        /**
+         * Used to reset the return data on error
+         */
+        public void reset() {
+            uri = null;
+            shareAction = null;
+            editAction = null;
+            deleteAction = null;
+            smartActions = null;
         }
     }
 
     abstract static class ActionsReadyListener {
-        abstract void onActionsReady(Uri imageUri, List<Notification.Action> smartActions,
-                List<Notification.Action> actions);
+        abstract void onActionsReady(SavedImageData imageData);
     }
 
     // These strings are used for communicating the action invoked to
@@ -147,6 +168,7 @@
     private static final int MESSAGE_CORNER_TIMEOUT = 2;
 
     private final ScreenshotNotificationsController mNotificationsController;
+    private final UiEventLogger mUiEventLogger;
 
     private final Context mContext;
     private final WindowManager mWindowManager;
@@ -163,9 +185,11 @@
     private final LinearLayout mActionsView;
     private final ImageView mBackgroundProtection;
     private final FrameLayout mDismissButton;
+    private final ImageView mDismissImage;
 
     private Bitmap mScreenBitmap;
     private Animator mScreenshotAnimation;
+    private boolean mInDarkMode = false;
 
     private float mScreenshotOffsetXPx;
     private float mScreenshotOffsetYPx;
@@ -185,6 +209,7 @@
         public void handleMessage(Message msg) {
             switch (msg.what) {
                 case MESSAGE_CORNER_TIMEOUT:
+                    mUiEventLogger.log(ScreenshotEvent.SCREENSHOT_INTERACTION_TIMEOUT);
                     GlobalScreenshot.this.clearScreenshot("timeout");
                     break;
                 default:
@@ -199,9 +224,11 @@
     @Inject
     public GlobalScreenshot(
             Context context, @Main Resources resources, LayoutInflater layoutInflater,
-            ScreenshotNotificationsController screenshotNotificationsController) {
+            ScreenshotNotificationsController screenshotNotificationsController,
+            UiEventLogger uiEventLogger) {
         mContext = context;
         mNotificationsController = screenshotNotificationsController;
+        mUiEventLogger = uiEventLogger;
 
         // Inflate the screenshot layout
         mScreenshotLayout = layoutInflater.inflate(R.layout.global_screenshot, null);
@@ -222,7 +249,11 @@
         mBackgroundProtection = mScreenshotLayout.findViewById(
                 R.id.global_screenshot_actions_background);
         mDismissButton = mScreenshotLayout.findViewById(R.id.global_screenshot_dismiss_button);
-        mDismissButton.setOnClickListener(view -> clearScreenshot("dismiss_button"));
+        mDismissButton.setOnClickListener(view -> {
+            mUiEventLogger.log(ScreenshotEvent.SCREENSHOT_EXPLICIT_DISMISSAL);
+            clearScreenshot("dismiss_button");
+        });
+        mDismissImage = mDismissButton.findViewById(R.id.global_screenshot_dismiss_image);
 
         mScreenshotFlash = mScreenshotLayout.findViewById(R.id.global_screenshot_flash);
         mScreenshotSelectorView = mScreenshotLayout.findViewById(R.id.global_screenshot_selector);
@@ -329,6 +360,8 @@
         mScreenBitmap.setHasAlpha(false);
         mScreenBitmap.prepareToDraw();
 
+        updateDarkTheme();
+
         mWindowManager.addView(mScreenshotLayout, mWindowLayoutParams);
         mScreenshotLayout.getViewTreeObserver().addOnComputeInternalInsetsListener(this);
 
@@ -407,7 +440,7 @@
      * Clears current screenshot
      */
     private void clearScreenshot(String reason) {
-        Log.e(TAG, "clearing screenshot: " + reason);
+        Log.v(TAG, "clearing screenshot: " + reason);
         if (mScreenshotLayout.isAttachedToWindow()) {
             mWindowManager.removeView(mScreenshotLayout);
         }
@@ -422,6 +455,43 @@
         mDismissButton.setVisibility(View.GONE);
         mScreenshotView.setVisibility(View.GONE);
         mScreenshotView.setLayerType(View.LAYER_TYPE_NONE, null);
+        mScreenshotView.setContentDescription(
+                mContext.getResources().getString(R.string.screenshot_preview_description));
+    }
+
+    /**
+     * Update assets (called when the dark theme status changes). We only need to update the dismiss
+     * button and the actions container background, since the buttons are re-inflated on demand.
+     */
+    private void reloadAssets() {
+        mDismissImage.setImageDrawable(mContext.getDrawable(R.drawable.screenshot_cancel));
+        mActionsContainer.setBackground(
+                mContext.getDrawable(R.drawable.action_chip_container_background));
+
+    }
+
+    /**
+     * Checks the current dark theme status and updates if it has changed.
+     */
+    private void updateDarkTheme() {
+        int currentNightMode = mContext.getResources().getConfiguration().uiMode
+                & Configuration.UI_MODE_NIGHT_MASK;
+        switch (currentNightMode) {
+            case Configuration.UI_MODE_NIGHT_NO:
+                // Night mode is not active, we're using the light theme
+                if (mInDarkMode) {
+                    mInDarkMode = false;
+                    reloadAssets();
+                }
+                break;
+            case Configuration.UI_MODE_NIGHT_YES:
+                // Night mode is active, we're using dark theme
+                if (!mInDarkMode) {
+                    mInDarkMode = true;
+                    reloadAssets();
+                }
+                break;
+        }
     }
 
     /**
@@ -443,12 +513,14 @@
 
         saveScreenshotInWorkerThread(finisher, new ActionsReadyListener() {
             @Override
-            void onActionsReady(Uri uri, List<Notification.Action> smartActions,
-                    List<Notification.Action> actions) {
-                if (uri == null) {
+            void onActionsReady(SavedImageData imageData) {
+                finisher.accept(imageData.uri);
+                if (imageData.uri == null) {
+                    mUiEventLogger.log(ScreenshotEvent.SCREENSHOT_NOT_SAVED);
                     mNotificationsController.notifyScreenshotError(
                             R.string.screenshot_failed_to_capture_text);
                 } else {
+                    mUiEventLogger.log(ScreenshotEvent.SCREENSHOT_SAVED);
                     mScreenshotHandler.post(() -> {
                         if (mScreenshotAnimation != null && mScreenshotAnimation.isRunning()) {
                             mScreenshotAnimation.addListener(
@@ -456,13 +528,12 @@
                                         @Override
                                         public void onAnimationEnd(Animator animation) {
                                             super.onAnimationEnd(animation);
-                                            createScreenshotActionsShadeAnimation(
-                                                    smartActions, actions).start();
+                                            createScreenshotActionsShadeAnimation(imageData)
+                                                    .start();
                                         }
                                     });
                         } else {
-                            createScreenshotActionsShadeAnimation(smartActions,
-                                    actions).start();
+                            createScreenshotActionsShadeAnimation(imageData).start();
                         }
                     });
                 }
@@ -565,8 +636,7 @@
         return dropInAnimation;
     }
 
-    private ValueAnimator createScreenshotActionsShadeAnimation(
-            List<Notification.Action> smartActions, List<Notification.Action> actions) {
+    private ValueAnimator createScreenshotActionsShadeAnimation(SavedImageData imageData) {
         LayoutInflater inflater = LayoutInflater.from(mContext);
         mActionsView.removeAllViews();
         mActionsContainer.setScrollX(0);
@@ -581,44 +651,63 @@
         } catch (RemoteException e) {
         }
 
-        for (Notification.Action smartAction : smartActions) {
+        for (Notification.Action smartAction : imageData.smartActions) {
             ScreenshotActionChip actionChip = (ScreenshotActionChip) inflater.inflate(
                     R.layout.global_screenshot_action_chip, mActionsView, false);
             actionChip.setText(smartAction.title);
             actionChip.setIcon(smartAction.getIcon(), false);
             actionChip.setPendingIntent(smartAction.actionIntent,
-                    () -> clearScreenshot("chip tapped"));
+                    () -> {
+                        mUiEventLogger.log(ScreenshotEvent.SCREENSHOT_SMART_ACTION_TAPPED);
+                        clearScreenshot("chip tapped");
+                    });
             mActionsView.addView(actionChip);
         }
 
-        for (Notification.Action action : actions) {
-            ScreenshotActionChip actionChip = (ScreenshotActionChip) inflater.inflate(
-                    R.layout.global_screenshot_action_chip, mActionsView, false);
-            actionChip.setText(action.title);
-            actionChip.setIcon(action.getIcon(), true);
-            actionChip.setPendingIntent(action.actionIntent, () -> clearScreenshot("chip tapped"));
-            if (action.actionIntent.getIntent().getAction().equals(Intent.ACTION_EDIT)) {
-                mScreenshotView.setOnClickListener(v -> {
-                    try {
-                        action.actionIntent.send();
-                        clearScreenshot("screenshot preview tapped");
-                    } catch (PendingIntent.CanceledException e) {
-                        Log.e(TAG, "Intent cancelled", e);
-                    }
-                });
+        ScreenshotActionChip shareChip = (ScreenshotActionChip) inflater.inflate(
+                R.layout.global_screenshot_action_chip, mActionsView, false);
+        shareChip.setText(imageData.shareAction.title);
+        shareChip.setIcon(imageData.shareAction.getIcon(), true);
+        shareChip.setPendingIntent(imageData.shareAction.actionIntent, () -> {
+            mUiEventLogger.log(ScreenshotEvent.SCREENSHOT_SHARE_TAPPED);
+            clearScreenshot("chip tapped");
+        });
+        mActionsView.addView(shareChip);
+
+        ScreenshotActionChip editChip = (ScreenshotActionChip) inflater.inflate(
+                R.layout.global_screenshot_action_chip, mActionsView, false);
+        editChip.setText(imageData.editAction.title);
+        editChip.setIcon(imageData.editAction.getIcon(), true);
+        editChip.setPendingIntent(imageData.editAction.actionIntent, () -> {
+            mUiEventLogger.log(ScreenshotEvent.SCREENSHOT_EDIT_TAPPED);
+            clearScreenshot("chip tapped");
+        });
+        mActionsView.addView(editChip);
+
+        mScreenshotView.setOnClickListener(v -> {
+            try {
+                imageData.editAction.actionIntent.send();
+                mUiEventLogger.log(ScreenshotEvent.SCREENSHOT_PREVIEW_TAPPED);
+                clearScreenshot("screenshot preview tapped");
+            } catch (PendingIntent.CanceledException e) {
+                Log.e(TAG, "Intent cancelled", e);
             }
-            mActionsView.addView(actionChip);
-        }
+        });
+        mScreenshotView.setContentDescription(imageData.editAction.title);
+
 
         if (DeviceConfig.getBoolean(NAMESPACE_SYSTEMUI, SCREENSHOT_SCROLLING_ENABLED, false)) {
             ScreenshotActionChip scrollChip = (ScreenshotActionChip) inflater.inflate(
                     R.layout.global_screenshot_action_chip, mActionsView, false);
             Toast scrollNotImplemented = Toast.makeText(
                     mContext, "Not implemented", Toast.LENGTH_SHORT);
-            scrollChip.setText("Extend"); // TODO (mkephart): add resource and translate
+            scrollChip.setText("Extend"); // TODO: add resource and translate
             scrollChip.setIcon(
                     Icon.createWithResource(mContext, R.drawable.ic_arrow_downward), true);
-            scrollChip.setOnClickListener(v -> scrollNotImplemented.show());
+            scrollChip.setOnClickListener(v -> {
+                mUiEventLogger.log(ScreenshotEvent.SCREENSHOT_SCROLL_TAPPED);
+                scrollNotImplemented.show();
+            });
             mActionsView.addView(scrollChip);
         }
 
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshotLegacy.java b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshotLegacy.java
index f3614ff..095c32f 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshotLegacy.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshotLegacy.java
@@ -24,7 +24,6 @@
 import android.animation.ValueAnimator;
 import android.animation.ValueAnimator.AnimatorUpdateListener;
 import android.annotation.Nullable;
-import android.app.Notification;
 import android.content.Context;
 import android.content.res.Configuration;
 import android.content.res.Resources;
@@ -53,7 +52,6 @@
 import com.android.systemui.R;
 import com.android.systemui.dagger.qualifiers.Main;
 
-import java.util.List;
 import java.util.function.Consumer;
 
 import javax.inject.Inject;
@@ -347,14 +345,13 @@
                 // Save the screenshot once we have a bit of time now
                 saveScreenshotInWorkerThread(finisher, new GlobalScreenshot.ActionsReadyListener() {
                     @Override
-                    void onActionsReady(Uri uri, List<Notification.Action> smartActions,
-                            List<Notification.Action> actions) {
-                        if (uri == null) {
+                    void onActionsReady(GlobalScreenshot.SavedImageData actionData) {
+                        if (actionData.uri == null) {
                             mNotificationsController.notifyScreenshotError(
                                     R.string.screenshot_failed_to_capture_text);
                         } else {
                             mNotificationsController
-                                    .showScreenshotActionsNotification(uri, smartActions, actions);
+                                    .showScreenshotActionsNotification(actionData);
                         }
                     }
                 });
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/SaveImageInBackgroundTask.java b/packages/SystemUI/src/com/android/systemui/screenshot/SaveImageInBackgroundTask.java
index c828c4c..170174d 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/SaveImageInBackgroundTask.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/SaveImageInBackgroundTask.java
@@ -83,6 +83,7 @@
 
     private final Context mContext;
     private final GlobalScreenshot.SaveImageInBackgroundData mParams;
+    private final GlobalScreenshot.SavedImageData mImageData;
     private final String mImageFileName;
     private final long mImageTime;
     private final ScreenshotNotificationSmartActionsProvider mSmartActionsProvider;
@@ -93,6 +94,7 @@
 
     SaveImageInBackgroundTask(Context context, GlobalScreenshot.SaveImageInBackgroundData data) {
         mContext = context;
+        mImageData = new GlobalScreenshot.SavedImageData();
 
         // Prepare all the output metadata
         mParams = data;
@@ -145,6 +147,7 @@
             values.put(MediaColumns.IS_PENDING, 1);
 
             final Uri uri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
+
             try {
                 // First, write the actual data for our screenshot
                 try (OutputStream out = resolver.openOutputStream(uri)) {
@@ -192,8 +195,6 @@
                 throw e;
             }
 
-            List<Notification.Action> actions =
-                    populateNotificationActions(mContext, r, uri);
             List<Notification.Action> smartActions = new ArrayList<>();
             if (mSmartActionsEnabled) {
                 int timeoutMs = DeviceConfig.getInt(
@@ -206,8 +207,14 @@
                                 mSmartActionsProvider),
                         mContext));
             }
-            mParams.mActionsReadyListener.onActionsReady(uri, smartActions, actions);
-            mParams.imageUri = uri;
+
+            mImageData.uri = uri;
+            mImageData.smartActions = smartActions;
+            mImageData.shareAction = createShareAction(mContext, mContext.getResources(), uri);
+            mImageData.editAction = createEditAction(mContext, mContext.getResources(), uri);
+            mImageData.deleteAction = createDeleteAction(mContext, mContext.getResources(), uri);
+
+            mParams.mActionsReadyListener.onActionsReady(mImageData);
             mParams.image = null;
             mParams.errorMsgResId = 0;
         } catch (Exception e) {
@@ -216,29 +223,26 @@
             Slog.e(TAG, "unable to save screenshot", e);
             mParams.clearImage();
             mParams.errorMsgResId = R.string.screenshot_failed_to_save_text;
-            mParams.mActionsReadyListener.onActionsReady(null, null, null);
+            mImageData.reset();
+            mParams.mActionsReadyListener.onActionsReady(mImageData);
         }
 
         return null;
     }
 
     @Override
-    protected void onPostExecute(Void params) {
-        mParams.finisher.accept(mParams.imageUri);
-    }
-
-    @Override
     protected void onCancelled(Void params) {
         // If we are cancelled while the task is running in the background, we may get null
         // params. The finisher is expected to always be called back, so just use the baked-in
         // params from the ctor in any case.
-        mParams.mActionsReadyListener.onActionsReady(null, null, null);
+        mImageData.reset();
+        mParams.mActionsReadyListener.onActionsReady(mImageData);
         mParams.finisher.accept(null);
         mParams.clearImage();
     }
 
     @VisibleForTesting
-    List<Notification.Action> populateNotificationActions(Context context, Resources r, Uri uri) {
+    Notification.Action createShareAction(Context context, Resources r, Uri uri) {
         // Note: Both the share and edit actions are proxied through ActionProxyReceiver in
         // order to do some common work like dismissing the keyguard and sending
         // closeSystemWindows
@@ -263,8 +267,6 @@
         // by setting the (otherwise unused) request code to the current user id.
         int requestCode = context.getUserId();
 
-        ArrayList<Notification.Action> actions = new ArrayList<>();
-
         PendingIntent chooserAction = PendingIntent.getBroadcast(context, requestCode,
                 new Intent(context, GlobalScreenshot.TargetChosenReceiver.class),
                 PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_ONE_SHOT);
@@ -288,7 +290,15 @@
         Notification.Action.Builder shareActionBuilder = new Notification.Action.Builder(
                 Icon.createWithResource(r, R.drawable.ic_screenshot_share),
                 r.getString(com.android.internal.R.string.share), shareAction);
-        actions.add(shareActionBuilder.build());
+
+        return shareActionBuilder.build();
+    }
+
+    @VisibleForTesting
+    Notification.Action createEditAction(Context context, Resources r, Uri uri) {
+        // Note: Both the share and edit actions are proxied through ActionProxyReceiver in
+        // order to do some common work like dismissing the keyguard and sending
+        // closeSystemWindows
 
         // Create an edit intent, if a specific package is provided as the editor, then
         // launch that directly
@@ -302,6 +312,10 @@
         editIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
         editIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
 
+        // Make sure pending intents for the system user are still unique across users
+        // by setting the (otherwise unused) request code to the current user id.
+        int requestCode = mContext.getUserId();
+
         // Create a edit action
         PendingIntent editAction = PendingIntent.getBroadcastAsUser(context, requestCode,
                 new Intent(context, GlobalScreenshot.ActionProxyReceiver.class)
@@ -317,24 +331,30 @@
         Notification.Action.Builder editActionBuilder = new Notification.Action.Builder(
                 Icon.createWithResource(r, R.drawable.ic_screenshot_edit),
                 r.getString(com.android.internal.R.string.screenshot_edit), editAction);
-        actions.add(editActionBuilder.build());
 
-        if (mCreateDeleteAction) {
-            // Create a delete action for the notification
-            PendingIntent deleteAction = PendingIntent.getBroadcast(context, requestCode,
-                    new Intent(context, GlobalScreenshot.DeleteScreenshotReceiver.class)
-                            .putExtra(GlobalScreenshot.SCREENSHOT_URI_ID, uri.toString())
-                            .putExtra(GlobalScreenshot.EXTRA_ID, mScreenshotId)
-                            .putExtra(GlobalScreenshot.EXTRA_SMART_ACTIONS_ENABLED,
-                                    mSmartActionsEnabled)
-                            .addFlags(Intent.FLAG_RECEIVER_FOREGROUND),
-                    PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_ONE_SHOT);
-            Notification.Action.Builder deleteActionBuilder = new Notification.Action.Builder(
-                    Icon.createWithResource(r, R.drawable.ic_screenshot_delete),
-                    r.getString(com.android.internal.R.string.delete), deleteAction);
-            actions.add(deleteActionBuilder.build());
-        }
-        return actions;
+        return editActionBuilder.build();
+    }
+
+    @VisibleForTesting
+    Notification.Action createDeleteAction(Context context, Resources r, Uri uri) {
+        // Make sure pending intents for the system user are still unique across users
+        // by setting the (otherwise unused) request code to the current user id.
+        int requestCode = mContext.getUserId();
+
+        // Create a delete action for the notification
+        PendingIntent deleteAction = PendingIntent.getBroadcast(context, requestCode,
+                new Intent(context, GlobalScreenshot.DeleteScreenshotReceiver.class)
+                        .putExtra(GlobalScreenshot.SCREENSHOT_URI_ID, uri.toString())
+                        .putExtra(GlobalScreenshot.EXTRA_ID, mScreenshotId)
+                        .putExtra(GlobalScreenshot.EXTRA_SMART_ACTIONS_ENABLED,
+                                mSmartActionsEnabled)
+                        .addFlags(Intent.FLAG_RECEIVER_FOREGROUND),
+                PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_ONE_SHOT);
+        Notification.Action.Builder deleteActionBuilder = new Notification.Action.Builder(
+                Icon.createWithResource(r, R.drawable.ic_screenshot_delete),
+                r.getString(com.android.internal.R.string.delete), deleteAction);
+
+        return deleteActionBuilder.build();
     }
 
     private int getUserHandleOfForegroundApplication(Context context) {
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotEvent.java b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotEvent.java
new file mode 100644
index 0000000..20fa991
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotEvent.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.screenshot;
+
+import static android.view.WindowManager.ScreenshotSource.SCREENSHOT_ACCESSIBILITY_ACTIONS;
+import static android.view.WindowManager.ScreenshotSource.SCREENSHOT_GLOBAL_ACTIONS;
+import static android.view.WindowManager.ScreenshotSource.SCREENSHOT_KEY_CHORD;
+import static android.view.WindowManager.ScreenshotSource.SCREENSHOT_KEY_OTHER;
+import static android.view.WindowManager.ScreenshotSource.SCREENSHOT_OTHER;
+import static android.view.WindowManager.ScreenshotSource.SCREENSHOT_OVERVIEW;
+
+import com.android.internal.logging.UiEvent;
+import com.android.internal.logging.UiEventLogger;
+
+public enum ScreenshotEvent implements UiEventLogger.UiEventEnum {
+    @UiEvent(doc = "screenshot requested from global actions")
+    SCREENSHOT_REQUESTED_GLOBAL_ACTIONS(302),
+    @UiEvent(doc = "screenshot requested from key chord")
+    SCREENSHOT_REQUESTED_KEY_CHORD(303),
+    @UiEvent(doc = "screenshot requested from other key press (e.g. ctrl-s)")
+    SCREENSHOT_REQUESTED_KEY_OTHER(384),
+    @UiEvent(doc = "screenshot requested from overview")
+    SCREENSHOT_REQUESTED_OVERVIEW(304),
+    @UiEvent(doc = "screenshot requested from accessibility actions")
+    SCREENSHOT_REQUESTED_ACCESSIBILITY_ACTIONS(382),
+    @UiEvent(doc = "screenshot requested (other)")
+    SCREENSHOT_REQUESTED_OTHER(305),
+    @UiEvent(doc = "screenshot was saved")
+    SCREENSHOT_SAVED(306),
+    @UiEvent(doc = "screenshot failed to save")
+    SCREENSHOT_NOT_SAVED(336),
+    @UiEvent(doc = "screenshot preview tapped")
+    SCREENSHOT_PREVIEW_TAPPED(307),
+    @UiEvent(doc = "screenshot edit button tapped")
+    SCREENSHOT_EDIT_TAPPED(308),
+    @UiEvent(doc = "screenshot share button tapped")
+    SCREENSHOT_SHARE_TAPPED(309),
+    @UiEvent(doc = "screenshot smart action chip tapped")
+    SCREENSHOT_SMART_ACTION_TAPPED(374),
+    @UiEvent(doc = "screenshot scroll tapped")
+    SCREENSHOT_SCROLL_TAPPED(373),
+    @UiEvent(doc = "screenshot interaction timed out")
+    SCREENSHOT_INTERACTION_TIMEOUT(310),
+    @UiEvent(doc = "screenshot explicitly dismissed")
+    SCREENSHOT_EXPLICIT_DISMISSAL(311);
+
+    private final int mId;
+
+    ScreenshotEvent(int id) {
+        mId = id;
+    }
+
+    @Override
+    public int getId() {
+        return mId;
+    }
+
+    static ScreenshotEvent getScreenshotSource(int source) {
+        switch (source) {
+            case SCREENSHOT_GLOBAL_ACTIONS:
+                return ScreenshotEvent.SCREENSHOT_REQUESTED_GLOBAL_ACTIONS;
+            case SCREENSHOT_KEY_CHORD:
+                return ScreenshotEvent.SCREENSHOT_REQUESTED_KEY_CHORD;
+            case SCREENSHOT_KEY_OTHER:
+                return ScreenshotEvent.SCREENSHOT_REQUESTED_KEY_OTHER;
+            case SCREENSHOT_OVERVIEW:
+                return ScreenshotEvent.SCREENSHOT_REQUESTED_OVERVIEW;
+            case SCREENSHOT_ACCESSIBILITY_ACTIONS:
+                return ScreenshotEvent.SCREENSHOT_REQUESTED_ACCESSIBILITY_ACTIONS;
+            case SCREENSHOT_OTHER:
+            default:
+                return ScreenshotEvent.SCREENSHOT_REQUESTED_OTHER;
+        }
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotNotificationsController.java b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotNotificationsController.java
index 811a8d9..fbcd6ba 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotNotificationsController.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotNotificationsController.java
@@ -32,7 +32,6 @@
 import android.graphics.Matrix;
 import android.graphics.Paint;
 import android.graphics.Picture;
-import android.net.Uri;
 import android.os.UserHandle;
 import android.util.DisplayMetrics;
 import android.view.WindowManager;
@@ -42,8 +41,6 @@
 import com.android.systemui.SystemUI;
 import com.android.systemui.util.NotificationChannels;
 
-import java.util.List;
-
 import javax.inject.Inject;
 
 /**
@@ -185,23 +182,20 @@
     /**
      * Shows a notification with the saved screenshot and actions that can be taken with it.
      *
-     * @param imageUri URI for the saved image
-     * @param actions  a list of notification actions which can be taken
+     * @param actionData SavedImageData struct with image URI and actions
      */
     public void showScreenshotActionsNotification(
-            Uri imageUri,
-            List<Notification.Action> smartActions,
-            List<Notification.Action> actions) {
-        for (Notification.Action action : actions) {
-            mNotificationBuilder.addAction(action);
-        }
-        for (Notification.Action smartAction : smartActions) {
+            GlobalScreenshot.SavedImageData actionData) {
+        mNotificationBuilder.addAction(actionData.shareAction);
+        mNotificationBuilder.addAction(actionData.editAction);
+        mNotificationBuilder.addAction(actionData.deleteAction);
+        for (Notification.Action smartAction : actionData.smartActions) {
             mNotificationBuilder.addAction(smartAction);
         }
 
         // Create the intent to show the screenshot in gallery
         Intent launchIntent = new Intent(Intent.ACTION_VIEW);
-        launchIntent.setDataAndType(imageUri, "image/png");
+        launchIntent.setDataAndType(actionData.uri, "image/png");
         launchIntent.setFlags(
                 Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_GRANT_READ_URI_PERMISSION);
 
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScrollCaptureController.java b/packages/SystemUI/src/com/android/systemui/screenshot/ScrollCaptureController.java
new file mode 100644
index 0000000..5ced40c
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScrollCaptureController.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.screenshot;
+
+import android.os.IBinder;
+import android.view.IWindowManager;
+
+import javax.inject.Inject;
+
+/**
+ * Stub
+ */
+public class ScrollCaptureController {
+
+    public static final int STATUS_A = 0;
+    public static final int STATUS_B = 1;
+
+    private final IWindowManager mWindowManagerService;
+    private StatusListener mListener;
+
+    /**
+     *
+     * @param windowManagerService
+     */
+    @Inject
+    public ScrollCaptureController(IWindowManager windowManagerService) {
+        mWindowManagerService = windowManagerService;
+    }
+
+    interface StatusListener {
+        void onScrollCaptureStatus(boolean available);
+    }
+
+    /**
+     *
+     * @param window
+     * @param listener
+     */
+    public void getStatus(IBinder window, StatusListener listener) {
+        mListener = listener;
+//        try {
+//           mWindowManagerService.requestScrollCapture(window, new ClientCallbacks());
+//        } catch (RemoteException e) {
+//        }
+    }
+
+}
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotService.java b/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotService.java
index 8b8b6f8..f68cb74 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotService.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotService.java
@@ -32,6 +32,9 @@
 import android.util.Log;
 import android.view.WindowManager;
 
+import com.android.internal.logging.UiEventLogger;
+import com.android.internal.util.ScreenshotHelper;
+
 import java.util.function.Consumer;
 
 import javax.inject.Inject;
@@ -42,6 +45,7 @@
     private final GlobalScreenshot mScreenshot;
     private final GlobalScreenshotLegacy mScreenshotLegacy;
     private final UserManager mUserManager;
+    private final UiEventLogger mUiEventLogger;
 
     private Handler mHandler = new Handler(Looper.myLooper()) {
         @Override
@@ -64,14 +68,22 @@
                 return;
             }
 
-            // TODO (mkephart): clean up once notifications flow is fully deprecated
+            // TODO: clean up once notifications flow is fully deprecated
             boolean useCornerFlow = true;
+
+            ScreenshotHelper.ScreenshotRequest screenshotRequest =
+                    (ScreenshotHelper.ScreenshotRequest) msg.obj;
+
+            mUiEventLogger.log(ScreenshotEvent.getScreenshotSource(screenshotRequest.getSource()));
+
             switch (msg.what) {
                 case WindowManager.TAKE_SCREENSHOT_FULLSCREEN:
                     if (useCornerFlow) {
                         mScreenshot.takeScreenshot(finisher);
                     } else {
-                        mScreenshotLegacy.takeScreenshot(finisher, msg.arg1 > 0, msg.arg2 > 0);
+                        mScreenshotLegacy.takeScreenshot(
+                                finisher, screenshotRequest.getHasStatusBar(),
+                                screenshotRequest.getHasNavBar());
                     }
                     break;
                 case WindowManager.TAKE_SCREENSHOT_SELECTED_REGION:
@@ -79,17 +91,15 @@
                         mScreenshot.takeScreenshotPartial(finisher);
                     } else {
                         mScreenshotLegacy.takeScreenshotPartial(
-                                finisher, msg.arg1 > 0, msg.arg2 > 0);
+                                finisher, screenshotRequest.getHasStatusBar(),
+                                screenshotRequest.getHasNavBar());
                     }
                     break;
                 case WindowManager.TAKE_SCREENSHOT_PROVIDED_IMAGE:
-                    Bitmap screenshot = msg.getData().getParcelable(
-                            WindowManager.PARCEL_KEY_SCREENSHOT_BITMAP);
-                    Rect screenBounds = msg.getData().getParcelable(
-                            WindowManager.PARCEL_KEY_SCREENSHOT_BOUNDS);
-                    Insets insets = msg.getData().getParcelable(
-                            WindowManager.PARCEL_KEY_SCREENSHOT_INSETS);
-                    int taskId = msg.getData().getInt(WindowManager.PARCEL_KEY_SCREENSHOT_TASK_ID);
+                    Bitmap screenshot = screenshotRequest.getBitmap();
+                    Rect screenBounds = screenshotRequest.getBoundsInScreen();
+                    Insets insets = screenshotRequest.getInsets();
+                    int taskId = screenshotRequest.getTaskId();
                     if (useCornerFlow) {
                         mScreenshot.handleImageAsScreenshot(
                                 screenshot, screenBounds, insets, taskId, finisher);
@@ -106,10 +116,12 @@
 
     @Inject
     public TakeScreenshotService(GlobalScreenshot globalScreenshot,
-            GlobalScreenshotLegacy globalScreenshotLegacy, UserManager userManager) {
+            GlobalScreenshotLegacy globalScreenshotLegacy, UserManager userManager,
+            UiEventLogger uiEventLogger) {
         mScreenshot = globalScreenshot;
         mScreenshotLegacy = globalScreenshotLegacy;
         mUserManager = userManager;
+        mUiEventLogger = uiEventLogger;
     }
 
     @Override
@@ -120,7 +132,7 @@
     @Override
     public boolean onUnbind(Intent intent) {
         if (mScreenshot != null) mScreenshot.stopScreenshot();
-        // TODO (mkephart) remove once notifications flow is fully deprecated
+        // TODO remove once notifications flow is fully deprecated
         if (mScreenshotLegacy != null) mScreenshotLegacy.stopScreenshot();
         return true;
     }
diff --git a/packages/SystemUI/src/com/android/systemui/settings/CurrentUserContextTracker.kt b/packages/SystemUI/src/com/android/systemui/settings/CurrentUserContextTracker.kt
new file mode 100644
index 0000000..825a7f3
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/settings/CurrentUserContextTracker.kt
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.settings
+
+import android.content.Context
+import android.os.UserHandle
+import androidx.annotation.VisibleForTesting
+import com.android.systemui.broadcast.BroadcastDispatcher
+import com.android.systemui.util.Assert
+import java.lang.IllegalStateException
+
+/**
+ * Tracks a reference to the context for the current user
+ *
+ * Constructor is injected at SettingsModule
+ */
+class CurrentUserContextTracker internal constructor(
+    private val sysuiContext: Context,
+    broadcastDispatcher: BroadcastDispatcher
+) {
+    private val userTracker: CurrentUserTracker
+    private var initialized = false
+
+    private var _curUserContext: Context? = null
+    val currentUserContext: Context
+        get() {
+            if (!initialized) {
+                throw IllegalStateException("Must initialize before getting context")
+            }
+            return _curUserContext!!
+        }
+
+    init {
+        userTracker = object : CurrentUserTracker(broadcastDispatcher) {
+            override fun onUserSwitched(newUserId: Int) {
+                handleUserSwitched(newUserId)
+            }
+        }
+    }
+
+    fun initialize() {
+        initialized = true
+        _curUserContext = makeUserContext(userTracker.currentUserId)
+        userTracker.startTracking()
+    }
+
+    @VisibleForTesting
+    fun handleUserSwitched(newUserId: Int) {
+        _curUserContext = makeUserContext(newUserId)
+    }
+
+    private fun makeUserContext(uid: Int): Context {
+        Assert.isMainThread()
+        return sysuiContext.createContextAsUser(UserHandle.of(uid), 0)
+    }
+}
\ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/settings/dagger/SettingsModule.java b/packages/SystemUI/src/com/android/systemui/settings/dagger/SettingsModule.java
new file mode 100644
index 0000000..2c5c3ce
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/settings/dagger/SettingsModule.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.settings.dagger;
+
+import android.content.Context;
+
+import com.android.systemui.broadcast.BroadcastDispatcher;
+import com.android.systemui.settings.CurrentUserContextTracker;
+
+import javax.inject.Singleton;
+
+import dagger.Module;
+import dagger.Provides;
+
+/**
+ * Dagger Module for classes found within the com.android.systemui.settings package.
+ */
+@Module
+public interface SettingsModule {
+
+    /**
+     * Provides and initializes a CurrentUserContextTracker
+     */
+    @Singleton
+    @Provides
+    static CurrentUserContextTracker provideCurrentUserContextTracker(
+            Context context,
+            BroadcastDispatcher broadcastDispatcher) {
+        CurrentUserContextTracker tracker =
+                new CurrentUserContextTracker(context, broadcastDispatcher);
+        tracker.initialize();
+        return tracker;
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/SplitScreenTaskOrganizer.java b/packages/SystemUI/src/com/android/systemui/stackdivider/SplitScreenTaskOrganizer.java
index a4b1310..f5d6cb6 100644
--- a/packages/SystemUI/src/com/android/systemui/stackdivider/SplitScreenTaskOrganizer.java
+++ b/packages/SystemUI/src/com/android/systemui/stackdivider/SplitScreenTaskOrganizer.java
@@ -33,10 +33,8 @@
 import android.view.SurfaceSession;
 import android.window.TaskOrganizer;
 
-import java.util.ArrayList;
-
 class SplitScreenTaskOrganizer extends TaskOrganizer {
-    private static final String TAG = "SplitScreenTaskOrganizer";
+    private static final String TAG = "SplitScreenTaskOrg";
     private static final boolean DEBUG = Divider.DEBUG;
 
     RunningTaskInfo mPrimary;
@@ -45,7 +43,6 @@
     SurfaceControl mSecondarySurface;
     SurfaceControl mPrimaryDim;
     SurfaceControl mSecondaryDim;
-    ArrayList<SurfaceControl> mHomeAndRecentsSurfaces = new ArrayList<>();
     Rect mHomeBounds = new Rect();
     final Divider mDivider;
     private boolean mSplitScreenSupported = false;
@@ -110,6 +107,15 @@
      * presentations based on the contents of the split regions.
      */
     private void handleTaskInfoChanged(RunningTaskInfo info) {
+        if (!mSplitScreenSupported) {
+            // This shouldn't happen; but apparently there is a chance that SysUI crashes without
+            // system server receiving binder-death (or maybe it receives binder-death too late?).
+            // In this situation, when sys-ui restarts, the split root-tasks will still exist so
+            // there is a small window of time during init() where WM might send messages here
+            // before init() fails. So, avoid a cycle of crashes by returning early.
+            Log.e(TAG, "Got handleTaskInfoChanged when not initialized: " + info);
+            return;
+        }
         final boolean secondaryWasHomeOrRecents = mSecondary.topActivityType == ACTIVITY_TYPE_HOME
                 || mSecondary.topActivityType == ACTIVITY_TYPE_RECENTS;
         final boolean primaryWasEmpty = mPrimary.topActivityType == ACTIVITY_TYPE_UNDEFINED;
diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/WindowManagerProxy.java b/packages/SystemUI/src/com/android/systemui/stackdivider/WindowManagerProxy.java
index 85dcbb6..3027bd2 100644
--- a/packages/SystemUI/src/com/android/systemui/stackdivider/WindowManagerProxy.java
+++ b/packages/SystemUI/src/com/android/systemui/stackdivider/WindowManagerProxy.java
@@ -174,18 +174,19 @@
         if (rootTasks.isEmpty()) {
             return false;
         }
-        tiles.mHomeAndRecentsSurfaces.clear();
         for (int i = rootTasks.size() - 1; i >= 0; --i) {
             final ActivityManager.RunningTaskInfo rootTask = rootTasks.get(i);
-            if (isHomeOrRecentTask(rootTask)) {
-                tiles.mHomeAndRecentsSurfaces.add(rootTask.token.getLeash());
-            }
+            // Only move resizeable task to split secondary. WM will just ignore this anyways...
+            if (!rootTask.isResizable()) continue;
+            // Only move fullscreen tasks to split secondary.
             if (rootTask.configuration.windowConfiguration.getWindowingMode()
                     != WINDOWING_MODE_FULLSCREEN) {
                 continue;
             }
             wct.reparent(rootTask.token, tiles.mSecondary.token, true /* onTop */);
         }
+        // Move the secondary split-forward.
+        wct.reorder(tiles.mSecondary.token, true /* onTop */);
         boolean isHomeResizable = applyHomeTasksMinimized(layout, null /* parent */, wct);
         WindowOrganizer.applyTransaction(wct);
         return isHomeResizable;
@@ -206,7 +207,6 @@
         // Set launch root first so that any task created after getChildContainers and
         // before reparent (pretty unlikely) are put into fullscreen.
         TaskOrganizer.setLaunchRoot(Display.DEFAULT_DISPLAY, null);
-        tiles.mHomeAndRecentsSurfaces.clear();
         // TODO(task-org): Once task-org is more complete, consider using Appeared/Vanished
         //                 plus specific APIs to clean this up.
         List<ActivityManager.RunningTaskInfo> primaryChildren =
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
index 5475812..43b4723 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
@@ -311,6 +311,7 @@
                     mTextView.switchIndication(mTransientIndication);
                 } else if (!TextUtils.isEmpty(mAlignmentIndication)) {
                     mTextView.switchIndication(mAlignmentIndication);
+                    mTextView.setTextColor(mContext.getColor(R.color.misalignment_text_color));
                 } else if (mPowerPluggedIn) {
                     String indication = computePowerIndication();
                     if (animate) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NavigationBarController.java b/packages/SystemUI/src/com/android/systemui/statusbar/NavigationBarController.java
index 1b752452..8c24c54 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NavigationBarController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NavigationBarController.java
@@ -44,6 +44,7 @@
 import com.android.systemui.statusbar.phone.LightBarController;
 import com.android.systemui.statusbar.phone.NavigationBarFragment;
 import com.android.systemui.statusbar.phone.NavigationBarView;
+import com.android.systemui.statusbar.phone.NavigationModeController;
 import com.android.systemui.statusbar.policy.BatteryController;
 
 import javax.inject.Inject;
@@ -139,7 +140,8 @@
                     ? Dependency.get(LightBarController.class)
                     : new LightBarController(context,
                             Dependency.get(DarkIconDispatcher.class),
-                            Dependency.get(BatteryController.class));
+                            Dependency.get(BatteryController.class),
+                            Dependency.get(NavigationModeController.class));
             navBar.setLightBarController(lightBarController);
 
             // TODO(b/118592525): to support multi-display, we start to add something which is
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationHeaderUtil.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationHeaderUtil.java
index ba3db09..670a65f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationHeaderUtil.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationHeaderUtil.java
@@ -148,7 +148,7 @@
     }
 
     public void updateChildrenHeaderAppearance() {
-        List<ExpandableNotificationRow> notificationChildren = mRow.getNotificationChildren();
+        List<ExpandableNotificationRow> notificationChildren = mRow.getAttachedChildren();
         if (notificationChildren == null) {
             return;
         }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt
index 0d77159..25f1a97 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt
@@ -250,7 +250,8 @@
     private fun updateShadeBlur() {
         var newBlur = 0
         val state = statusBarStateController.state
-        if (state == StatusBarState.SHADE || state == StatusBarState.SHADE_LOCKED) {
+        if ((state == StatusBarState.SHADE || state == StatusBarState.SHADE_LOCKED) &&
+                !keyguardStateController.isKeyguardFadingAway) {
             newBlur = blurUtils.blurRadiusOfRatio(shadeExpansion)
         }
         shadeSpring.animateTo(newBlur)
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java
index 1297f99..02c41e5 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java
@@ -35,6 +35,7 @@
 import com.android.systemui.statusbar.notification.NotificationEntryManager;
 import com.android.systemui.statusbar.notification.VisualStabilityManager;
 import com.android.systemui.statusbar.notification.collection.NotificationEntry;
+import com.android.systemui.statusbar.notification.collection.inflation.LowPriorityInflationHelper;
 import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
 import com.android.systemui.statusbar.notification.stack.ForegroundServiceSectionController;
 import com.android.systemui.statusbar.notification.stack.NotificationListContainer;
@@ -71,6 +72,7 @@
     protected final VisualStabilityManager mVisualStabilityManager;
     private final SysuiStatusBarStateController mStatusBarStateController;
     private final NotificationEntryManager mEntryManager;
+    private final LowPriorityInflationHelper mLowPriorityInflationHelper;
 
     /**
      * {@code true} if notifications not part of a group should by default be rendered in their
@@ -108,7 +110,8 @@
             BubbleController bubbleController,
             DynamicPrivacyController privacyController,
             ForegroundServiceSectionController fgsSectionController,
-            DynamicChildBindController dynamicChildBindController) {
+            DynamicChildBindController dynamicChildBindController,
+            LowPriorityInflationHelper lowPriorityInflationHelper) {
         mContext = context;
         mHandler = mainHandler;
         mLockscreenUserManager = notificationLockscreenUserManager;
@@ -123,14 +126,15 @@
                 res.getBoolean(R.bool.config_alwaysExpandNonGroupedNotifications);
         mBubbleController = bubbleController;
         mDynamicPrivacyController = privacyController;
-        privacyController.addListener(this);
         mDynamicChildBindController = dynamicChildBindController;
+        mLowPriorityInflationHelper = lowPriorityInflationHelper;
     }
 
     public void setUpWithPresenter(NotificationPresenter presenter,
             NotificationListContainer listContainer) {
         mPresenter = presenter;
         mListContainer = listContainer;
+        mDynamicPrivacyController.addListener(this);
     }
 
     /**
@@ -177,6 +181,7 @@
                     currentUserId);
             ent.setSensitive(sensitive, deviceSensitive);
             ent.getRow().setNeedsRedaction(needsRedaction);
+            mLowPriorityInflationHelper.recheckLowPriorityViewAndInflate(ent, ent.getRow());
             boolean isChildInGroup = mGroupManager.isChildInGroupWithSummary(ent.getSbn());
 
             boolean groupChangesAllowed = mVisualStabilityManager.areGroupChangesAllowed()
@@ -307,17 +312,20 @@
             }
 
             ExpandableNotificationRow parent = (ExpandableNotificationRow) view;
-            List<ExpandableNotificationRow> children = parent.getNotificationChildren();
+            List<ExpandableNotificationRow> children = parent.getAttachedChildren();
             List<NotificationEntry> orderedChildren = mTmpChildOrderMap.get(parent.getEntry());
-
-            for (int childIndex = 0; orderedChildren != null && childIndex < orderedChildren.size();
-                    childIndex++) {
+            if (orderedChildren == null) {
+                // Not a group
+                continue;
+            }
+            parent.setUntruncatedChildCount(orderedChildren.size());
+            for (int childIndex = 0; childIndex < orderedChildren.size(); childIndex++) {
                 ExpandableNotificationRow childView = orderedChildren.get(childIndex).getRow();
                 if (children == null || !children.contains(childView)) {
                     if (childView.getParent() != null) {
-                        Log.wtf(TAG, "trying to add a notification child that already has " +
-                                "a parent. class:" + childView.getParent().getClass() +
-                                "\n child: " + childView);
+                        Log.wtf(TAG, "trying to add a notification child that already has "
+                                + "a parent. class:" + childView.getParent().getClass()
+                                + "\n child: " + childView);
                         // This shouldn't happen. We can recover by removing it though.
                         ((ViewGroup) childView.getParent()).removeView(childView);
                     }
@@ -349,7 +357,7 @@
             }
 
             ExpandableNotificationRow parent = (ExpandableNotificationRow) view;
-            List<ExpandableNotificationRow> children = parent.getNotificationChildren();
+            List<ExpandableNotificationRow> children = parent.getAttachedChildren();
             List<NotificationEntry> orderedChildren = mTmpChildOrderMap.get(parent.getEntry());
 
             if (children != null) {
@@ -454,7 +462,7 @@
             }
             if (row.isSummaryWithChildren()) {
                 List<ExpandableNotificationRow> notificationChildren =
-                        row.getNotificationChildren();
+                        row.getAttachedChildren();
                 int size = notificationChildren.size();
                 for (int i = size - 1; i >= 0; i--) {
                     stack.push(notificationChildren.get(i));
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/dagger/StatusBarDependenciesModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/dagger/StatusBarDependenciesModule.java
index e64b423..de7e36d9 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/dagger/StatusBarDependenciesModule.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/dagger/StatusBarDependenciesModule.java
@@ -37,6 +37,7 @@
 import com.android.systemui.statusbar.notification.DynamicPrivacyController;
 import com.android.systemui.statusbar.notification.NotificationEntryManager;
 import com.android.systemui.statusbar.notification.VisualStabilityManager;
+import com.android.systemui.statusbar.notification.collection.inflation.LowPriorityInflationHelper;
 import com.android.systemui.statusbar.notification.stack.ForegroundServiceSectionController;
 import com.android.systemui.statusbar.phone.KeyguardBypassController;
 import com.android.systemui.statusbar.phone.NotificationGroupManager;
@@ -143,7 +144,8 @@
             BubbleController bubbleController,
             DynamicPrivacyController privacyController,
             ForegroundServiceSectionController fgsSectionController,
-            DynamicChildBindController dynamicChildBindController) {
+            DynamicChildBindController dynamicChildBindController,
+            LowPriorityInflationHelper lowPriorityInflationHelper) {
         return new NotificationViewHierarchyManager(
                 context,
                 mainHandler,
@@ -156,7 +158,8 @@
                 bubbleController,
                 privacyController,
                 fgsSectionController,
-                dynamicChildBindController);
+                dynamicChildBindController,
+                lowPriorityInflationHelper);
     }
 
     /**
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationChannelHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationChannelHelper.java
new file mode 100644
index 0000000..ff945d1
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationChannelHelper.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.statusbar.notification;
+
+import android.app.INotificationManager;
+import android.app.Notification;
+import android.app.NotificationChannel;
+import android.content.Context;
+import android.os.Bundle;
+import android.os.RemoteException;
+import android.os.UserHandle;
+import android.text.TextUtils;
+import android.util.Slog;
+
+import com.android.systemui.R;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
+
+/**
+ * Helps SystemUI create notification channels.
+ */
+public class NotificationChannelHelper {
+    private static final String TAG = "NotificationChannelHelper";
+
+    /** Creates a conversation channel based on the shortcut info or notification title. */
+    public static NotificationChannel createConversationChannelIfNeeded(
+            Context context,
+            INotificationManager notificationManager,
+            NotificationEntry entry,
+            NotificationChannel channel) {
+        if (!TextUtils.isEmpty(channel.getConversationId())) {
+            return channel;
+        }
+        final String conversationId = entry.getSbn().getShortcutId(context);
+        final String pkg = entry.getSbn().getPackageName();
+        final int appUid = entry.getSbn().getUid();
+        if (TextUtils.isEmpty(conversationId) || TextUtils.isEmpty(pkg)) {
+            return channel;
+        }
+
+        String name;
+        if (entry.getRanking().getShortcutInfo() != null) {
+            name = entry.getRanking().getShortcutInfo().getShortLabel().toString();
+        } else {
+            Bundle extras = entry.getSbn().getNotification().extras;
+            String nameString = extras.getString(Notification.EXTRA_CONVERSATION_TITLE);
+            if (TextUtils.isEmpty(nameString)) {
+                nameString = extras.getString(Notification.EXTRA_TITLE);
+            }
+            name = nameString;
+        }
+
+        // If this channel is not already a customized conversation channel, create
+        // a custom channel
+        try {
+            // TODO: When shortcuts are enforced remove this and use the shortcut label for naming
+            channel.setName(context.getString(
+                    R.string.notification_summary_message_format,
+                    name, channel.getName()));
+            notificationManager.createConversationNotificationChannelForPackage(
+                    pkg, appUid, entry.getSbn().getKey(), channel,
+                    conversationId);
+            channel = notificationManager.getConversationNotificationChannel(
+                    context.getOpPackageName(), UserHandle.getUserId(appUid), pkg,
+                    channel.getId(), false, conversationId);
+        } catch (RemoteException e) {
+            Slog.e(TAG, "Could not create conversation channel", e);
+        }
+        return channel;
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationClicker.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationClicker.java
index 4e6df0a..d364689 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationClicker.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationClicker.java
@@ -23,11 +23,14 @@
 
 import com.android.systemui.DejankUtils;
 import com.android.systemui.bubbles.BubbleController;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
 import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
 import com.android.systemui.statusbar.phone.StatusBar;
 
 import java.util.Optional;
 
+import javax.inject.Inject;
+
 /**
  * Click handler for generic clicks on notifications. Clicks on specific areas (expansion caret,
  * app ops icon, etc) are handled elsewhere.
@@ -35,15 +38,19 @@
 public final class NotificationClicker implements View.OnClickListener {
     private static final String TAG = "NotificationClicker";
 
-    private final Optional<StatusBar> mStatusBar;
     private final BubbleController mBubbleController;
+    private final NotificationClickerLogger mLogger;
+    private final Optional<StatusBar> mStatusBar;
     private final NotificationActivityStarter mNotificationActivityStarter;
 
-    public NotificationClicker(Optional<StatusBar> statusBar,
+    private NotificationClicker(
             BubbleController bubbleController,
+            NotificationClickerLogger logger,
+            Optional<StatusBar> statusBar,
             NotificationActivityStarter notificationActivityStarter) {
-        mStatusBar = statusBar;
         mBubbleController = bubbleController;
+        mLogger = logger;
+        mStatusBar = statusBar;
         mNotificationActivityStarter = notificationActivityStarter;
     }
 
@@ -58,25 +65,26 @@
                 SystemClock.uptimeMillis(), v, "NOTIFICATION_CLICK"));
 
         final ExpandableNotificationRow row = (ExpandableNotificationRow) v;
-        final StatusBarNotification sbn = row.getEntry().getSbn();
-        if (sbn == null) {
-            Log.e(TAG, "NotificationClicker called on an unclickable notification,");
-            return;
-        }
+        final NotificationEntry entry = row.getEntry();
+        mLogger.logOnClick(entry);
 
         // Check if the notification is displaying the menu, if so slide notification back
         if (isMenuVisible(row)) {
+            mLogger.logMenuVisible(entry);
             row.animateTranslateNotification(0);
             return;
         } else if (row.isChildInGroup() && isMenuVisible(row.getNotificationParent())) {
+            mLogger.logParentMenuVisible(entry);
             row.getNotificationParent().animateTranslateNotification(0);
             return;
         } else if (row.isSummaryWithChildren() && row.areChildrenExpanded()) {
             // We never want to open the app directly if the user clicks in between
             // the notifications.
+            mLogger.logChildrenExpanded(entry);
             return;
         } else if (row.areGutsExposed()) {
             // ignore click if guts are exposed
+            mLogger.logGutsExposed(entry);
             return;
         }
 
@@ -88,7 +96,7 @@
             mBubbleController.collapseStack();
         }
 
-        mNotificationActivityStarter.onNotificationClicked(sbn, row);
+        mNotificationActivityStarter.onNotificationClicked(entry.getSbn(), row);
     }
 
     private boolean isMenuVisible(ExpandableNotificationRow row) {
@@ -107,4 +115,30 @@
             row.setOnClickListener(null);
         }
     }
+
+    /** Daggerized builder for NotificationClicker. */
+    public static class Builder {
+        private final BubbleController mBubbleController;
+        private final NotificationClickerLogger mLogger;
+
+        @Inject
+        public Builder(
+                BubbleController bubbleController,
+                NotificationClickerLogger logger) {
+            mBubbleController = bubbleController;
+            mLogger = logger;
+        }
+
+        /** Builds an instance. */
+        public NotificationClicker build(
+                Optional<StatusBar> statusBar,
+                NotificationActivityStarter notificationActivityStarter
+        ) {
+            return new NotificationClicker(
+                    mBubbleController,
+                    mLogger,
+                    statusBar,
+                    notificationActivityStarter);
+        }
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationClickerLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationClickerLogger.kt
new file mode 100644
index 0000000..fbf033b
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationClickerLogger.kt
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.statusbar.notification
+
+import com.android.systemui.log.LogBuffer
+import com.android.systemui.log.LogLevel
+import com.android.systemui.log.dagger.NotifInteractionLog
+import com.android.systemui.statusbar.notification.collection.NotificationEntry
+import javax.inject.Inject
+
+class NotificationClickerLogger @Inject constructor(
+    @NotifInteractionLog private val buffer: LogBuffer
+) {
+    fun logOnClick(entry: NotificationEntry) {
+        buffer.log(TAG, LogLevel.DEBUG, {
+            str1 = entry.key
+            str2 = entry.ranking.channel.id
+        }, {
+            "CLICK $str1 (channel=$str2)"
+        })
+    }
+
+    fun logMenuVisible(entry: NotificationEntry) {
+        buffer.log(TAG, LogLevel.DEBUG, {
+            str1 = entry.key
+        }, {
+            "Ignoring click on $str1; menu is visible"
+        })
+    }
+
+    fun logParentMenuVisible(entry: NotificationEntry) {
+        buffer.log(TAG, LogLevel.DEBUG, {
+            str1 = entry.key
+        }, {
+            "Ignoring click on $str1; parent menu is visible"
+        })
+    }
+
+    fun logChildrenExpanded(entry: NotificationEntry) {
+        buffer.log(TAG, LogLevel.DEBUG, {
+            str1 = entry.key
+        }, {
+            "Ignoring click on $str1; children are expanded"
+        })
+    }
+
+    fun logGutsExposed(entry: NotificationEntry) {
+        buffer.log(TAG, LogLevel.DEBUG, {
+            str1 = entry.key
+        }, {
+            "Ignoring click on $str1; guts are exposed"
+        })
+    }
+}
+
+private const val TAG = "NotificationClicker"
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java
index d37e16b..f1cb783 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java
@@ -515,7 +515,7 @@
                 // always cancelled. We only remove them if they were dismissed by the user.
                 return;
             }
-            List<NotificationEntry> childEntries = entry.getChildren();
+            List<NotificationEntry> childEntries = entry.getAttachedNotifChildren();
             if (childEntries == null) {
                 return;
             }
@@ -619,7 +619,8 @@
         entry.setSbn(notification);
         for (NotifCollectionListener listener : mNotifCollectionListeners) {
             listener.onEntryBind(entry, notification);
-        }        mGroupManager.onEntryUpdated(entry, oldSbn);
+        }
+        mGroupManager.onEntryUpdated(entry, oldSbn);
 
         mLogger.logNotifUpdated(entry.getKey());
         for (NotificationEntryListener listener : mNotificationEntryListeners) {
@@ -699,7 +700,8 @@
                             entry,
                             oldImportances.get(entry.getKey()),
                             oldAdjustments.get(entry.getKey()),
-                            NotificationUiAdjustment.extractFromNotificationEntry(entry));
+                            NotificationUiAdjustment.extractFromNotificationEntry(entry),
+                            mInflationCallback);
         }
 
         updateNotifications("updateNotificationRanking");
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/GroupEntry.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/GroupEntry.java
index 2c747bd..81494ed 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/GroupEntry.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/GroupEntry.java
@@ -20,6 +20,7 @@
 import android.annotation.Nullable;
 
 import com.android.internal.annotations.VisibleForTesting;
+import com.android.systemui.statusbar.notification.collection.coordinator.PreparationCoordinator;
 
 import java.util.ArrayList;
 import java.util.Collections;
@@ -36,6 +37,7 @@
 
     private final List<NotificationEntry> mUnmodifiableChildren =
             Collections.unmodifiableList(mChildren);
+    private int mUntruncatedChildCount;
 
     @VisibleForTesting
     public GroupEntry(String key) {
@@ -62,6 +64,24 @@
         mSummary = summary;
     }
 
+    /**
+     * @see #getUntruncatedChildCount()
+     */
+    public void setUntruncatedChildCount(int childCount) {
+        mUntruncatedChildCount = childCount;
+    }
+
+    /**
+     * Get the untruncated number of children from the data model, including those that will not
+     * have views bound. This includes children that {@link PreparationCoordinator} will filter out
+     * entirely when they are beyond the last visible child.
+     *
+     * TODO: This should move to some shared class between the model and view hierarchy
+     */
+    public int getUntruncatedChildCount() {
+        return mUntruncatedChildCount;
+    }
+
     void clearChildren() {
         mChildren.clear();
     }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifViewManager.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifViewManager.kt
index cf670bd..339809e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifViewManager.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifViewManager.kt
@@ -113,7 +113,7 @@
                     } else if (entries[idx] is GroupEntry) {
                         // A top-level entry exists. If it's a group, diff the children
                         val groupChildren = (entries[idx] as GroupEntry).children
-                        listItem.notificationChildren?.forEach { listChild ->
+                        listItem.attachedChildren?.forEach { listChild ->
                             if (!groupChildren.contains(listChild.entry)) {
                                 listItem.removeChildNotification(listChild)
 
@@ -155,8 +155,8 @@
                 for ((idx, childEntry) in entry.children.withIndex()) {
                     val childListItem = rowRegistry.requireView(childEntry)
                     // Child hasn't been added yet. add it!
-                    if (listItem.notificationChildren == null ||
-                            !listItem.notificationChildren.contains(childListItem)) {
+                    if (listItem.attachedChildren == null ||
+                            !listItem.attachedChildren.contains(childListItem)) {
                         // TODO: old code here just Log.wtf()'d here. This might wreak havoc
                         if (childListItem.view.parent != null) {
                             throw IllegalStateException("trying to add a notification child that " +
@@ -179,6 +179,7 @@
                                 stabilityManager,
                                 null /*TODO: stability callback */
                         )
+                listItem.setUntruncatedChildCount(entry.untruncatedChildCount)
             }
         }
 
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 749c3e4..cb0c283 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
@@ -378,6 +378,7 @@
     /**
      * Returns the data needed for a bubble for this notification, if it exists.
      */
+    @Nullable
     public Notification.BubbleMetadata getBubbleMetadata() {
         return mBubbleMetadata;
     }
@@ -385,7 +386,7 @@
     /**
      * Sets bubble metadata for this notification.
      */
-    public void setBubbleMetadata(Notification.BubbleMetadata metadata) {
+    public void setBubbleMetadata(@Nullable Notification.BubbleMetadata metadata) {
         mBubbleMetadata = metadata;
     }
 
@@ -434,13 +435,18 @@
         mRowController = controller;
     }
 
-    @Nullable
-    public List<NotificationEntry> getChildren() {
+    /**
+     * Get the children that are actually attached to this notification's row.
+     *
+     * TODO: Seems like most callers here should probably be using
+     * {@link com.android.systemui.statusbar.phone.NotificationGroupManager#getChildren}
+     */
+    public @Nullable List<NotificationEntry> getAttachedNotifChildren() {
         if (row == null) {
             return null;
         }
 
-        List<ExpandableNotificationRow> rowChildren = row.getNotificationChildren();
+        List<ExpandableNotificationRow> rowChildren = row.getAttachedChildren();
         if (rowChildren == null) {
             return null;
         }
@@ -748,7 +754,7 @@
             return false;
         }
 
-        List<NotificationEntry> children = getChildren();
+        List<NotificationEntry> children = getAttachedNotifChildren();
         if (children != null && children.size() > 0) {
             for (int i = 0; i < children.size(); i++) {
                 NotificationEntry child =  children.get(i);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinator.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinator.java
index 2a3b2b7..3fde2ed 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinator.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinator.java
@@ -17,7 +17,7 @@
 package com.android.systemui.statusbar.notification.collection.coordinator;
 
 import static com.android.systemui.statusbar.NotificationRemoteInputManager.FORCE_REMOTE_INPUT_HISTORY;
-import static com.android.systemui.statusbar.notification.interruption.NotificationAlertingManager.alertAgain;
+import static com.android.systemui.statusbar.notification.interruption.HeadsUpController.alertAgain;
 
 import android.annotation.Nullable;
 
@@ -29,7 +29,7 @@
 import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifSection;
 import com.android.systemui.statusbar.notification.collection.notifcollection.NotifCollectionListener;
 import com.android.systemui.statusbar.notification.collection.notifcollection.NotifLifetimeExtender;
-import com.android.systemui.statusbar.notification.headsup.HeadsUpViewBinder;
+import com.android.systemui.statusbar.notification.interruption.HeadsUpViewBinder;
 import com.android.systemui.statusbar.notification.interruption.NotificationInterruptStateProvider;
 import com.android.systemui.statusbar.policy.HeadsUpManager;
 import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinator.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinator.java
index 0e8dd5e..4159d43 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinator.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinator.java
@@ -16,11 +16,15 @@
 
 package com.android.systemui.statusbar.notification.collection.coordinator;
 
+import static com.android.systemui.statusbar.notification.stack.NotificationChildrenContainer.NUMBER_OF_CHILDREN_WHEN_CHILDREN_EXPANDED;
+
 import android.annotation.IntDef;
 import android.os.RemoteException;
 import android.service.notification.StatusBarNotification;
 import android.util.ArrayMap;
+import android.util.ArraySet;
 
+import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.statusbar.IStatusBarService;
 import com.android.systemui.statusbar.notification.collection.GroupEntry;
 import com.android.systemui.statusbar.notification.collection.ListEntry;
@@ -40,6 +44,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Set;
 
 import javax.inject.Inject;
 import javax.inject.Singleton;
@@ -60,22 +65,47 @@
     private final NotifInflationErrorManager mNotifErrorManager;
     private final NotifViewBarn mViewBarn;
     private final Map<NotificationEntry, Integer> mInflationStates = new ArrayMap<>();
+
+    /**
+     * The set of notifications that are currently inflating something. Note that this is
+     * separate from inflation state as a view could either be uninflated or inflated and still be
+     * inflating something.
+     */
+    private final Set<NotificationEntry> mInflatingNotifs = new ArraySet<>();
+
     private final IStatusBarService mStatusBarService;
 
+    /**
+     * The number of children in a group we actually keep inflated since we don't actually show
+     * all the children and don't need every child inflated at all times.
+     */
+    private final int mChildBindCutoff;
+
     @Inject
     public PreparationCoordinator(
             PreparationCoordinatorLogger logger,
             NotifInflaterImpl notifInflater,
             NotifInflationErrorManager errorManager,
             NotifViewBarn viewBarn,
-            IStatusBarService service
-    ) {
+            IStatusBarService service) {
+        this(logger, notifInflater, errorManager, viewBarn, service, CHILD_BIND_CUTOFF);
+    }
+
+    @VisibleForTesting
+    PreparationCoordinator(
+            PreparationCoordinatorLogger logger,
+            NotifInflaterImpl notifInflater,
+            NotifInflationErrorManager errorManager,
+            NotifViewBarn viewBarn,
+            IStatusBarService service,
+            int childBindCutoff) {
         mLogger = logger;
         mNotifInflater = notifInflater;
         mNotifErrorManager = errorManager;
         mNotifErrorManager.addInflationErrorListener(mInflationErrorListener);
         mViewBarn = viewBarn;
         mStatusBarService = service;
+        mChildBindCutoff = childBindCutoff;
     }
 
     @Override
@@ -96,6 +126,8 @@
 
         @Override
         public void onEntryUpdated(NotificationEntry entry) {
+            abortInflation(entry, "entryUpdated");
+            mInflatingNotifs.remove(entry);
             @InflationState int state = getInflationState(entry);
             if (state == STATE_INFLATED) {
                 mInflationStates.put(entry, STATE_INFLATED_INVALID);
@@ -113,6 +145,7 @@
         @Override
         public void onEntryCleanUp(NotificationEntry entry) {
             mInflationStates.remove(entry);
+            mInflatingNotifs.remove(entry);
             mViewBarn.removeViewForEntry(entry);
         }
     };
@@ -133,23 +166,11 @@
 
     private final NotifFilter mNotifInflatingFilter = new NotifFilter(TAG + "Inflating") {
         /**
-         * Filters out notifications that haven't been inflated yet
+         * Filters out notifications that aren't inflated
          */
         @Override
         public boolean shouldFilterOut(NotificationEntry entry, long now) {
-            @InflationState int state = getInflationState(entry);
-            return (state != STATE_INFLATED) && (state != STATE_INFLATED_INVALID);
-        }
-    };
-
-    private final NotifInflater.InflationCallback mInflationCallback =
-            new NotifInflater.InflationCallback() {
-        @Override
-        public void onInflationFinished(NotificationEntry entry) {
-            mLogger.logNotifInflated(entry.getKey());
-            mViewBarn.registerViewForEntry(entry, entry.getRow());
-            mInflationStates.put(entry, STATE_INFLATED);
-            mNotifInflatingFilter.invalidateList();
+            return !isInflated(entry);
         }
     };
 
@@ -187,19 +208,42 @@
             ListEntry entry = entries.get(i);
             if (entry instanceof GroupEntry) {
                 GroupEntry groupEntry = (GroupEntry) entry;
-                inflateNotifRequiredViews(groupEntry.getSummary());
-                List<NotificationEntry> children = groupEntry.getChildren();
-                for (int j = 0, groupSize = children.size(); j < groupSize; j++) {
-                    inflateNotifRequiredViews(children.get(j));
-                }
+                groupEntry.setUntruncatedChildCount(groupEntry.getChildren().size());
+                inflateRequiredGroupViews(groupEntry);
             } else {
                 NotificationEntry notifEntry = (NotificationEntry) entry;
-                inflateNotifRequiredViews(notifEntry);
+                inflateRequiredNotifViews(notifEntry);
             }
         }
     }
 
-    private void inflateNotifRequiredViews(NotificationEntry entry) {
+    private void inflateRequiredGroupViews(GroupEntry groupEntry) {
+        NotificationEntry summary = groupEntry.getSummary();
+        List<NotificationEntry> children = groupEntry.getChildren();
+        inflateRequiredNotifViews(summary);
+        for (int j = 0; j < children.size(); j++) {
+            NotificationEntry child = children.get(j);
+            boolean childShouldBeBound = j < mChildBindCutoff;
+            if (childShouldBeBound) {
+                inflateRequiredNotifViews(child);
+            } else {
+                if (mInflatingNotifs.contains(child)) {
+                    abortInflation(child, "Past last visible group child");
+                }
+                if (isInflated(child)) {
+                    // TODO: May want to put an animation hint here so view manager knows to treat
+                    //  this differently from a regular removal animation
+                    freeNotifViews(child);
+                }
+            }
+        }
+    }
+
+    private void inflateRequiredNotifViews(NotificationEntry entry) {
+        if (mInflatingNotifs.contains(entry)) {
+            // Already inflating this entry
+            return;
+        }
         @InflationState int state = mInflationStates.get(entry);
         switch (state) {
             case STATE_UNINFLATED:
@@ -217,16 +261,38 @@
 
     private void inflateEntry(NotificationEntry entry, String reason) {
         abortInflation(entry, reason);
-        mNotifInflater.inflateViews(entry, mInflationCallback);
+        mInflatingNotifs.add(entry);
+        mNotifInflater.inflateViews(entry, this::onInflationFinished);
     }
 
     private void rebind(NotificationEntry entry, String reason) {
-        mNotifInflater.rebindViews(entry, mInflationCallback);
+        mInflatingNotifs.add(entry);
+        mNotifInflater.rebindViews(entry, this::onInflationFinished);
     }
 
     private void abortInflation(NotificationEntry entry, String reason) {
         mLogger.logInflationAborted(entry.getKey(), reason);
         entry.abortTask();
+        mInflatingNotifs.remove(entry);
+    }
+
+    private void onInflationFinished(NotificationEntry entry) {
+        mLogger.logNotifInflated(entry.getKey());
+        mInflatingNotifs.remove(entry);
+        mViewBarn.registerViewForEntry(entry, entry.getRow());
+        mInflationStates.put(entry, STATE_INFLATED);
+        mNotifInflatingFilter.invalidateList();
+    }
+
+    private void freeNotifViews(NotificationEntry entry) {
+        mViewBarn.removeViewForEntry(entry);
+        entry.setRow(null);
+        mInflationStates.put(entry, STATE_UNINFLATED);
+    }
+
+    private boolean isInflated(NotificationEntry entry) {
+        @InflationState int state = getInflationState(entry);
+        return (state == STATE_INFLATED) || (state == STATE_INFLATED_INVALID);
     }
 
     private @InflationState int getInflationState(NotificationEntry entry) {
@@ -241,7 +307,7 @@
             value = {STATE_UNINFLATED, STATE_INFLATED_INVALID, STATE_INFLATED, STATE_ERROR})
     @interface InflationState {}
 
-    /** The notification has never been inflated before. */
+    /** The notification has no views attached. */
     private static final int STATE_UNINFLATED = 0;
 
     /** The notification is inflated. */
@@ -255,4 +321,13 @@
 
     /** The notification errored out while inflating */
     private static final int STATE_ERROR = -1;
+
+    /**
+     * How big the buffer of extra views we keep around to be ready to show when we do need to
+     * dynamically inflate a row.
+     */
+    private static final int EXTRA_VIEW_BUFFER_COUNT = 1;
+
+    private static final int CHILD_BIND_CUTOFF =
+            NUMBER_OF_CHILDREN_WHEN_CHILDREN_EXPANDED + EXTRA_VIEW_BUFFER_COUNT;
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/LowPriorityInflationHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/LowPriorityInflationHelper.java
new file mode 100644
index 0000000..73c0fdc
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/LowPriorityInflationHelper.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.statusbar.notification.collection.inflation;
+
+import com.android.systemui.statusbar.FeatureFlags;
+import com.android.systemui.statusbar.notification.collection.GroupEntry;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
+import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
+import com.android.systemui.statusbar.notification.row.RowContentBindParams;
+import com.android.systemui.statusbar.notification.row.RowContentBindStage;
+import com.android.systemui.statusbar.phone.NotificationGroupManager;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+/**
+ * Helper class that provide methods to help check when we need to inflate a low priority version
+ * ot notification content.
+ */
+@Singleton
+public class LowPriorityInflationHelper {
+    private final FeatureFlags mFeatureFlags;
+    private final NotificationGroupManager mGroupManager;
+    private final RowContentBindStage mRowContentBindStage;
+
+    @Inject
+    LowPriorityInflationHelper(
+            FeatureFlags featureFlags,
+            NotificationGroupManager groupManager,
+            RowContentBindStage rowContentBindStage) {
+        mFeatureFlags = featureFlags;
+        mGroupManager = groupManager;
+        mRowContentBindStage = rowContentBindStage;
+    }
+
+    /**
+     * Check if we inflated the wrong version of the view and if we need to reinflate the
+     * content views to be their low priority version or not.
+     *
+     * Whether we inflate the low priority view or not depends on the notification being visually
+     * part of a group. Since group membership is determined AFTER inflation, we're forced to check
+     * again at a later point in the pipeline to see if we inflated the wrong view and reinflate
+     * the correct one here.
+     *
+     * TODO: The group manager should run before inflation so that we don't deal with this
+     */
+    public void recheckLowPriorityViewAndInflate(
+            NotificationEntry entry,
+            ExpandableNotificationRow row) {
+        RowContentBindParams params = mRowContentBindStage.getStageParams(entry);
+        final boolean shouldBeLowPriority = shouldUseLowPriorityView(entry);
+        if (!row.isRemoved() && row.isLowPriority() != shouldBeLowPriority) {
+            params.setUseLowPriority(shouldBeLowPriority);
+            mRowContentBindStage.requestRebind(entry,
+                    en -> row.setIsLowPriority(shouldBeLowPriority));
+        }
+    }
+
+    /**
+     * Whether the notification should inflate a low priority version of its content views.
+     */
+    public boolean shouldUseLowPriorityView(NotificationEntry entry) {
+        boolean isGroupChild;
+        if (mFeatureFlags.isNewNotifPipelineRenderingEnabled()) {
+            isGroupChild = (entry.getParent() != GroupEntry.ROOT_ENTRY);
+        } else {
+            isGroupChild = mGroupManager.isChildInGroupWithSummary(entry.getSbn());
+        }
+        return entry.isAmbient() && !isGroupChild;
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/NotificationRowBinder.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/NotificationRowBinder.java
index f4c4924..710b137 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/NotificationRowBinder.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/NotificationRowBinder.java
@@ -51,5 +51,6 @@
             NotificationEntry entry,
             @Nullable Integer oldImportance,
             NotificationUiAdjustment oldAdjustment,
-            NotificationUiAdjustment newAdjustment);
+            NotificationUiAdjustment newAdjustment,
+            NotificationRowContentBinder.InflationCallback callback);
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/NotificationRowBinderImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/NotificationRowBinderImpl.java
index 73f12f8..673aa39 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/NotificationRowBinderImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/NotificationRowBinderImpl.java
@@ -64,6 +64,7 @@
     private final ExpandableNotificationRowComponent.Builder
             mExpandableNotificationRowComponentBuilder;
     private final IconManager mIconManager;
+    private final LowPriorityInflationHelper mLowPriorityInflationHelper;
 
     private NotificationPresenter mPresenter;
     private NotificationListContainer mListContainer;
@@ -81,7 +82,8 @@
             NotificationInterruptStateProvider notificationInterruptionStateProvider,
             Provider<RowInflaterTask> rowInflaterTaskProvider,
             ExpandableNotificationRowComponent.Builder expandableNotificationRowComponentBuilder,
-            IconManager iconManager) {
+            IconManager iconManager,
+            LowPriorityInflationHelper lowPriorityInflationHelper) {
         mContext = context;
         mNotifBindPipeline = notifBindPipeline;
         mRowContentBindStage = rowContentBindStage;
@@ -92,6 +94,7 @@
         mRowInflaterTaskProvider = rowInflaterTaskProvider;
         mExpandableNotificationRowComponentBuilder = expandableNotificationRowComponentBuilder;
         mIconManager = iconManager;
+        mLowPriorityInflationHelper = lowPriorityInflationHelper;
     }
 
     /**
@@ -180,13 +183,14 @@
             NotificationEntry entry,
             @Nullable Integer oldImportance,
             NotificationUiAdjustment oldAdjustment,
-            NotificationUiAdjustment newAdjustment) {
+            NotificationUiAdjustment newAdjustment,
+            NotificationRowContentBinder.InflationCallback callback) {
         if (NotificationUiAdjustment.needReinflate(oldAdjustment, newAdjustment)) {
             if (entry.rowExists()) {
                 ExpandableNotificationRow row = entry.getRow();
                 row.reset();
                 updateRow(entry, row);
-                inflateContentViews(entry, row, null /* callback */);
+                inflateContentViews(entry, row, callback);
             } else {
                 // Once the RowInflaterTask is done, it will pick up the updated entry, so
                 // no-op here.
@@ -221,14 +225,18 @@
     private void inflateContentViews(
             NotificationEntry entry,
             ExpandableNotificationRow row,
-            NotificationRowContentBinder.InflationCallback inflationCallback) {
+            @Nullable NotificationRowContentBinder.InflationCallback inflationCallback) {
         final boolean useIncreasedCollapsedHeight =
                 mMessagingUtil.isImportantMessaging(entry.getSbn(), entry.getImportance());
-        final boolean isLowPriority = entry.isAmbient();
+        // If this is our first time inflating, we don't actually know the groupings for real
+        // yet, so we might actually inflate a low priority content view incorrectly here and have
+        // to correct it later in the pipeline. On subsequent inflations (i.e. updates), this
+        // should inflate the correct view.
+        final boolean isLowPriority = mLowPriorityInflationHelper.shouldUseLowPriorityView(entry);
 
         RowContentBindParams params = mRowContentBindStage.getStageParams(entry);
         params.setUseIncreasedCollapsedHeight(useIncreasedCollapsedHeight);
-        params.setUseLowPriority(entry.isAmbient());
+        params.setUseLowPriority(isLowPriority);
 
         // TODO: Replace this API with RowContentBindParams directly. Also move to a separate
         // redaction controller.
@@ -238,7 +246,9 @@
         mRowContentBindStage.requestRebind(entry, en -> {
             row.setUsesIncreasedCollapsedHeight(useIncreasedCollapsedHeight);
             row.setIsLowPriority(isLowPriority);
-            inflationCallback.onAsyncInflationFinished(en);
+            if (inflationCallback != null) {
+                inflationCallback.onAsyncInflationFinished(en);
+            }
         });
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java
index 565a082..78ee5f2 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java
@@ -30,6 +30,7 @@
 import com.android.systemui.dagger.qualifiers.Main;
 import com.android.systemui.dagger.qualifiers.UiBackground;
 import com.android.systemui.plugins.statusbar.StatusBarStateController;
+import com.android.systemui.settings.CurrentUserContextTracker;
 import com.android.systemui.statusbar.FeatureFlags;
 import com.android.systemui.statusbar.NotificationListener;
 import com.android.systemui.statusbar.NotificationRemoteInputManager;
@@ -45,7 +46,6 @@
 import com.android.systemui.statusbar.notification.init.NotificationsController;
 import com.android.systemui.statusbar.notification.init.NotificationsControllerImpl;
 import com.android.systemui.statusbar.notification.init.NotificationsControllerStub;
-import com.android.systemui.statusbar.notification.interruption.NotificationAlertingManager;
 import com.android.systemui.statusbar.notification.interruption.NotificationInterruptStateProvider;
 import com.android.systemui.statusbar.notification.interruption.NotificationInterruptStateProviderImpl;
 import com.android.systemui.statusbar.notification.logging.NotificationLogger;
@@ -53,13 +53,14 @@
 import com.android.systemui.statusbar.notification.logging.NotificationPanelLoggerImpl;
 import com.android.systemui.statusbar.notification.row.NotificationBlockingHelperManager;
 import com.android.systemui.statusbar.notification.row.NotificationGutsManager;
+import com.android.systemui.statusbar.notification.row.PriorityOnboardingDialogController;
 import com.android.systemui.statusbar.phone.NotificationGroupManager;
 import com.android.systemui.statusbar.phone.StatusBar;
-import com.android.systemui.statusbar.policy.HeadsUpManager;
 import com.android.systemui.util.leak.LeakDetector;
 
 import java.util.concurrent.Executor;
 
+import javax.inject.Provider;
 import javax.inject.Singleton;
 
 import dagger.Binds;
@@ -109,7 +110,9 @@
             HighPriorityProvider highPriorityProvider,
             INotificationManager notificationManager,
             LauncherApps launcherApps,
-            ShortcutManager shortcutManager) {
+            ShortcutManager shortcutManager,
+            CurrentUserContextTracker contextTracker,
+            Provider<PriorityOnboardingDialogController.Builder> builderProvider) {
         return new NotificationGutsManager(
                 context,
                 visualStabilityManager,
@@ -119,7 +122,9 @@
                 highPriorityProvider,
                 notificationManager,
                 launcherApps,
-                shortcutManager);
+                shortcutManager,
+                contextTracker,
+                builderProvider);
     }
 
     /** Provides an instance of {@link VisualStabilityManager} */
@@ -130,27 +135,6 @@
         return new VisualStabilityManager(notificationEntryManager, handler);
     }
 
-    /** Provides an instance of {@link NotificationAlertingManager} */
-    @Singleton
-    @Provides
-    static NotificationAlertingManager provideNotificationAlertingManager(
-            NotificationEntryManager notificationEntryManager,
-            NotificationRemoteInputManager remoteInputManager,
-            VisualStabilityManager visualStabilityManager,
-            StatusBarStateController statusBarStateController,
-            NotificationInterruptStateProvider notificationInterruptStateProvider,
-            NotificationListener notificationListener,
-            HeadsUpManager headsUpManager) {
-        return new NotificationAlertingManager(
-                notificationEntryManager,
-                remoteInputManager,
-                visualStabilityManager,
-                statusBarStateController,
-                notificationInterruptStateProvider,
-                notificationListener,
-                headsUpManager);
-    }
-
     /** Provides an instance of {@link NotificationLogger} */
     @Singleton
     @Provides
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/headsup/HeadsUpBindController.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/headsup/HeadsUpBindController.java
deleted file mode 100644
index a7b1f37..0000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/headsup/HeadsUpBindController.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.statusbar.notification.headsup;
-
-import androidx.annotation.NonNull;
-
-import com.android.systemui.statusbar.notification.NotificationEntryManager;
-import com.android.systemui.statusbar.notification.collection.NotificationEntry;
-import com.android.systemui.statusbar.notification.collection.coordinator.HeadsUpCoordinator;
-import com.android.systemui.statusbar.notification.collection.notifcollection.NotifCollectionListener;
-import com.android.systemui.statusbar.notification.interruption.NotificationAlertingManager;
-import com.android.systemui.statusbar.notification.interruption.NotificationInterruptStateProvider;
-import com.android.systemui.statusbar.policy.HeadsUpManager;
-import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener;
-
-import javax.inject.Inject;
-import javax.inject.Singleton;
-
-/**
- * Controller class for old pipeline heads up view binding. It listens to
- * {@link NotificationEntryManager} entry events and appropriately binds or unbinds the heads up
- * view.
- *
- * This has a subtle contract with {@link NotificationAlertingManager} where this controller handles
- * the heads up binding, but {@link NotificationAlertingManager} listens for general inflation
- * events to actually mark it heads up/update. In the new pipeline, we combine the classes.
- * See {@link HeadsUpCoordinator}.
- */
-@Singleton
-public class HeadsUpBindController {
-    private final HeadsUpViewBinder mHeadsUpViewBinder;
-    private final NotificationInterruptStateProvider mInterruptStateProvider;
-
-    @Inject
-    HeadsUpBindController(
-            HeadsUpViewBinder headsUpViewBinder,
-            NotificationInterruptStateProvider notificationInterruptStateProvider) {
-        mInterruptStateProvider = notificationInterruptStateProvider;
-        mHeadsUpViewBinder = headsUpViewBinder;
-    }
-
-    /**
-     * Attach this controller and add its listeners.
-     */
-    public void attach(
-            NotificationEntryManager entryManager,
-            HeadsUpManager headsUpManager) {
-        entryManager.addCollectionListener(mCollectionListener);
-        headsUpManager.addListener(mOnHeadsUpChangedListener);
-    }
-
-    private NotifCollectionListener mCollectionListener = new NotifCollectionListener() {
-        @Override
-        public void onEntryAdded(NotificationEntry entry) {
-            if (mInterruptStateProvider.shouldHeadsUp(entry)) {
-                mHeadsUpViewBinder.bindHeadsUpView(entry, null);
-            }
-        }
-
-        @Override
-        public void onEntryUpdated(NotificationEntry entry) {
-            if (mInterruptStateProvider.shouldHeadsUp(entry)) {
-                mHeadsUpViewBinder.bindHeadsUpView(entry, null);
-            }
-        }
-
-        @Override
-        public void onEntryCleanUp(NotificationEntry entry) {
-            mHeadsUpViewBinder.abortBindCallback(entry);
-        }
-    };
-
-    private OnHeadsUpChangedListener mOnHeadsUpChangedListener  = new OnHeadsUpChangedListener() {
-        @Override
-        public void onHeadsUpStateChanged(@NonNull NotificationEntry entry, boolean isHeadsUp) {
-            if (!isHeadsUp) {
-                mHeadsUpViewBinder.unbindHeadsUpView(entry);
-            }
-        }
-    };
-}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/headsup/HeadsUpViewBinder.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/headsup/HeadsUpViewBinder.java
deleted file mode 100644
index 37acfa8..0000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/headsup/HeadsUpViewBinder.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.statusbar.notification.headsup;
-
-import static com.android.systemui.statusbar.notification.row.NotificationRowContentBinder.FLAG_CONTENT_VIEW_HEADS_UP;
-
-import android.util.ArrayMap;
-
-import androidx.annotation.Nullable;
-import androidx.core.os.CancellationSignal;
-
-import com.android.internal.util.NotificationMessagingUtil;
-import com.android.systemui.statusbar.NotificationPresenter;
-import com.android.systemui.statusbar.notification.collection.NotificationEntry;
-import com.android.systemui.statusbar.notification.collection.coordinator.HeadsUpCoordinator;
-import com.android.systemui.statusbar.notification.row.NotifBindPipeline.BindCallback;
-import com.android.systemui.statusbar.notification.row.RowContentBindParams;
-import com.android.systemui.statusbar.notification.row.RowContentBindStage;
-
-import java.util.Map;
-
-import javax.inject.Inject;
-import javax.inject.Singleton;
-
-/**
- * Wrapper around heads up view binding logic. {@link HeadsUpViewBinder} is responsible for
- * figuring out the right heads up inflation parameters and inflating/freeing the heads up
- * content view.
- *
- * TODO: This should be moved into {@link HeadsUpCoordinator} when the old pipeline is deprecated
- * (i.e. when {@link HeadsUpBindController} is removed).
- */
-@Singleton
-public class HeadsUpViewBinder {
-    private final RowContentBindStage mStage;
-    private final NotificationMessagingUtil mNotificationMessagingUtil;
-    private final Map<NotificationEntry, CancellationSignal> mOngoingBindCallbacks =
-            new ArrayMap<>();
-
-    private NotificationPresenter mNotificationPresenter;
-
-    @Inject
-    HeadsUpViewBinder(
-            NotificationMessagingUtil notificationMessagingUtil,
-            RowContentBindStage bindStage) {
-        mNotificationMessagingUtil = notificationMessagingUtil;
-        mStage = bindStage;
-    }
-
-    /**
-     * Set notification presenter to determine parameters for heads up view inflation.
-     */
-    public void setPresenter(NotificationPresenter presenter) {
-        mNotificationPresenter = presenter;
-    }
-
-    /**
-     * Bind heads up view to the notification row.
-     * @param callback callback after heads up view is bound
-     */
-    public void bindHeadsUpView(NotificationEntry entry, @Nullable BindCallback callback) {
-        RowContentBindParams params = mStage.getStageParams(entry);
-        final boolean isImportantMessage = mNotificationMessagingUtil.isImportantMessaging(
-                entry.getSbn(), entry.getImportance());
-        final boolean useIncreasedHeadsUp = isImportantMessage
-                && !mNotificationPresenter.isPresenterFullyCollapsed();
-        params.setUseIncreasedHeadsUpHeight(useIncreasedHeadsUp);
-        params.requireContentViews(FLAG_CONTENT_VIEW_HEADS_UP);
-        CancellationSignal signal = mStage.requestRebind(entry, en -> {
-            en.getRow().setUsesIncreasedHeadsUpHeight(params.useIncreasedHeadsUpHeight());
-            if (callback != null) {
-                callback.onBindFinished(en);
-            }
-        });
-        abortBindCallback(entry);
-        mOngoingBindCallbacks.put(entry, signal);
-    }
-
-    /**
-     * Abort any callbacks waiting for heads up view binding to finish for a given notification.
-     * @param entry notification with bind in progress
-     */
-    public void abortBindCallback(NotificationEntry entry) {
-        CancellationSignal ongoingBindCallback = mOngoingBindCallbacks.remove(entry);
-        if (ongoingBindCallback != null) {
-            ongoingBindCallback.cancel();
-        }
-    }
-
-    /**
-     * Unbind the heads up view from the notification row.
-     */
-    public void unbindHeadsUpView(NotificationEntry entry) {
-        abortBindCallback(entry);
-        mStage.getStageParams(entry).markContentViewsFreeable(FLAG_CONTENT_VIEW_HEADS_UP);
-        mStage.requestRebind(entry, null);
-    }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/init/NotificationsControllerImpl.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/init/NotificationsControllerImpl.kt
index 5fac5b1..c975404 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/init/NotificationsControllerImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/init/NotificationsControllerImpl.kt
@@ -17,7 +17,6 @@
 package com.android.systemui.statusbar.notification.init
 
 import android.service.notification.StatusBarNotification
-import com.android.systemui.bubbles.BubbleController
 import com.android.systemui.plugins.statusbar.NotificationSwipeActionHelper.SnoozeOption
 import com.android.systemui.statusbar.FeatureFlags
 import com.android.systemui.statusbar.NotificationListener
@@ -28,7 +27,7 @@
 import com.android.systemui.statusbar.notification.NotificationListController
 import com.android.systemui.statusbar.notification.collection.inflation.NotificationRowBinderImpl
 import com.android.systemui.statusbar.notification.collection.init.NotifPipelineInitializer
-import com.android.systemui.statusbar.notification.headsup.HeadsUpBindController
+import com.android.systemui.statusbar.notification.interruption.HeadsUpController
 import com.android.systemui.statusbar.notification.row.NotifBindPipelineInitializer
 import com.android.systemui.statusbar.notification.stack.NotificationListContainer
 import com.android.systemui.statusbar.phone.NotificationGroupAlertTransferHelper
@@ -36,7 +35,7 @@
 import com.android.systemui.statusbar.phone.StatusBar
 import com.android.systemui.statusbar.policy.DeviceProvisionedController
 import com.android.systemui.statusbar.policy.HeadsUpManager
-import com.android.systemui.statusbar.notification.headsup.HeadsUpViewBinder
+import com.android.systemui.statusbar.notification.interruption.HeadsUpViewBinder
 import com.android.systemui.statusbar.policy.RemoteInputUriController
 import dagger.Lazy
 import java.io.FileDescriptor
@@ -62,12 +61,12 @@
     private val deviceProvisionedController: DeviceProvisionedController,
     private val notificationRowBinder: NotificationRowBinderImpl,
     private val remoteInputUriController: RemoteInputUriController,
-    private val bubbleController: BubbleController,
     private val groupManager: NotificationGroupManager,
     private val groupAlertTransferHelper: NotificationGroupAlertTransferHelper,
     private val headsUpManager: HeadsUpManager,
-    private val headsUpBindController: HeadsUpBindController,
-    private val headsUpViewBinder: HeadsUpViewBinder
+    private val headsUpController: HeadsUpController,
+    private val headsUpViewBinder: HeadsUpViewBinder,
+    private val clickerBuilder: NotificationClicker.Builder
 ) : NotificationsController {
 
     override fun initialize(
@@ -87,10 +86,7 @@
         listController.bind()
 
         notificationRowBinder.setNotificationClicker(
-                NotificationClicker(
-                        Optional.of(statusBar),
-                        bubbleController,
-                        notificationActivityStarter))
+                clickerBuilder.build(Optional.of(statusBar), notificationActivityStarter))
         notificationRowBinder.setUpWithPresenter(
                 presenter,
                 listContainer,
@@ -112,7 +108,7 @@
             groupAlertTransferHelper.bind(entryManager, groupManager)
             headsUpManager.addListener(groupManager)
             headsUpManager.addListener(groupAlertTransferHelper)
-            headsUpBindController.attach(entryManager, headsUpManager)
+            headsUpController.attach(entryManager, headsUpManager)
             groupManager.setHeadsUpManager(headsUpManager)
             groupAlertTransferHelper.setHeadsUpManager(headsUpManager)
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/HeadsUpController.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/HeadsUpController.java
new file mode 100644
index 0000000..9b6ae9a
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/HeadsUpController.java
@@ -0,0 +1,185 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.statusbar.notification.interruption;
+
+import static com.android.systemui.statusbar.NotificationRemoteInputManager.FORCE_REMOTE_INPUT_HISTORY;
+
+import android.app.Notification;
+import android.service.notification.StatusBarNotification;
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+
+import com.android.systemui.plugins.statusbar.StatusBarStateController;
+import com.android.systemui.statusbar.NotificationListener;
+import com.android.systemui.statusbar.NotificationRemoteInputManager;
+import com.android.systemui.statusbar.notification.NotificationEntryManager;
+import com.android.systemui.statusbar.notification.VisualStabilityManager;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
+import com.android.systemui.statusbar.notification.collection.notifcollection.NotifCollectionListener;
+import com.android.systemui.statusbar.policy.HeadsUpManager;
+import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+/**
+ * Controller class for old pipeline heads up logic. It listens to {@link NotificationEntryManager}
+ * entry events and appropriately binds or unbinds the heads up view and promotes it to the top
+ * of the screen.
+ */
+@Singleton
+public class HeadsUpController {
+    private final HeadsUpViewBinder mHeadsUpViewBinder;
+    private final NotificationInterruptStateProvider mInterruptStateProvider;
+    private final NotificationRemoteInputManager mRemoteInputManager;
+    private final VisualStabilityManager mVisualStabilityManager;
+    private final StatusBarStateController mStatusBarStateController;
+    private final NotificationListener mNotificationListener;
+    private final HeadsUpManager mHeadsUpManager;
+
+    @Inject
+    HeadsUpController(
+            HeadsUpViewBinder headsUpViewBinder,
+            NotificationInterruptStateProvider notificationInterruptStateProvider,
+            HeadsUpManager headsUpManager,
+            NotificationRemoteInputManager remoteInputManager,
+            StatusBarStateController statusBarStateController,
+            VisualStabilityManager visualStabilityManager,
+            NotificationListener notificationListener) {
+        mHeadsUpViewBinder = headsUpViewBinder;
+        mHeadsUpManager = headsUpManager;
+        mInterruptStateProvider = notificationInterruptStateProvider;
+        mRemoteInputManager = remoteInputManager;
+        mStatusBarStateController = statusBarStateController;
+        mVisualStabilityManager = visualStabilityManager;
+        mNotificationListener = notificationListener;
+    }
+
+    /**
+     * Attach this controller and add its listeners.
+     */
+    public void attach(
+            NotificationEntryManager entryManager,
+            HeadsUpManager headsUpManager) {
+        entryManager.addCollectionListener(mCollectionListener);
+        headsUpManager.addListener(mOnHeadsUpChangedListener);
+    }
+
+    private NotifCollectionListener mCollectionListener = new NotifCollectionListener() {
+        @Override
+        public void onEntryAdded(NotificationEntry entry) {
+            if (mInterruptStateProvider.shouldHeadsUp(entry)) {
+                mHeadsUpViewBinder.bindHeadsUpView(
+                        entry, HeadsUpController.this::showAlertingView);
+            }
+        }
+
+        @Override
+        public void onEntryUpdated(NotificationEntry entry) {
+            updateHunState(entry);
+        }
+
+        @Override
+        public void onEntryRemoved(NotificationEntry entry, int reason) {
+            stopAlerting(entry);
+        }
+
+        @Override
+        public void onEntryCleanUp(NotificationEntry entry) {
+            mHeadsUpViewBinder.abortBindCallback(entry);
+        }
+    };
+
+    /**
+     * Adds the entry to the HUN manager and show it for the first time.
+     */
+    private void showAlertingView(NotificationEntry entry) {
+        mHeadsUpManager.showNotification(entry);
+        if (!mStatusBarStateController.isDozing()) {
+            // Mark as seen immediately
+            setNotificationShown(entry.getSbn());
+        }
+    }
+
+    private void updateHunState(NotificationEntry entry) {
+        boolean hunAgain = alertAgain(entry, entry.getSbn().getNotification());
+        // includes check for whether this notification should be filtered:
+        boolean shouldHeadsUp = mInterruptStateProvider.shouldHeadsUp(entry);
+        final boolean wasHeadsUp = mHeadsUpManager.isAlerting(entry.getKey());
+        if (wasHeadsUp) {
+            if (shouldHeadsUp) {
+                mHeadsUpManager.updateNotification(entry.getKey(), hunAgain);
+            } else if (!mHeadsUpManager.isEntryAutoHeadsUpped(entry.getKey())) {
+                // We don't want this to be interrupting anymore, let's remove it
+                mHeadsUpManager.removeNotification(entry.getKey(), false /* removeImmediately */);
+            }
+        } else if (shouldHeadsUp && hunAgain) {
+            mHeadsUpViewBinder.bindHeadsUpView(entry, mHeadsUpManager::showNotification);
+        }
+    }
+
+    private void setNotificationShown(StatusBarNotification n) {
+        try {
+            mNotificationListener.setNotificationsShown(new String[]{n.getKey()});
+        } catch (RuntimeException e) {
+            Log.d(TAG, "failed setNotificationsShown: ", e);
+        }
+    }
+
+    private void stopAlerting(NotificationEntry entry) {
+        // Attempt to remove notifications from their HUN manager.
+        // Though the remove itself may fail, it lets the manager know to remove as soon as
+        // possible.
+        String key = entry.getKey();
+        if (mHeadsUpManager.isAlerting(key)) {
+            // A cancel() in response to a remote input shouldn't be delayed, as it makes the
+            // sending look longer than it takes.
+            // Also we should not defer the removal if reordering isn't allowed since otherwise
+            // some notifications can't disappear before the panel is closed.
+            boolean ignoreEarliestRemovalTime =
+                    mRemoteInputManager.getController().isSpinning(key)
+                            && !FORCE_REMOTE_INPUT_HISTORY
+                            || !mVisualStabilityManager.isReorderingAllowed();
+            mHeadsUpManager.removeNotification(key, ignoreEarliestRemovalTime);
+        }
+    }
+
+    /**
+     * Checks whether an update for a notification warrants an alert for the user.
+     *
+     * @param oldEntry the entry for this notification.
+     * @param newNotification the new notification for this entry.
+     * @return whether this notification should alert the user.
+     */
+    public static boolean alertAgain(
+            NotificationEntry oldEntry, Notification newNotification) {
+        return oldEntry == null || !oldEntry.hasInterrupted()
+                || (newNotification.flags & Notification.FLAG_ONLY_ALERT_ONCE) == 0;
+    }
+
+    private OnHeadsUpChangedListener mOnHeadsUpChangedListener  = new OnHeadsUpChangedListener() {
+        @Override
+        public void onHeadsUpStateChanged(@NonNull NotificationEntry entry, boolean isHeadsUp) {
+            if (!isHeadsUp && !entry.getRow().isRemoved()) {
+                mHeadsUpViewBinder.unbindHeadsUpView(entry);
+            }
+        }
+    };
+
+    private static final String TAG = "HeadsUpBindController";
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/HeadsUpViewBinder.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/HeadsUpViewBinder.java
new file mode 100644
index 0000000..ff13995
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/HeadsUpViewBinder.java
@@ -0,0 +1,112 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.statusbar.notification.interruption;
+
+import static com.android.systemui.statusbar.notification.row.NotificationRowContentBinder.FLAG_CONTENT_VIEW_HEADS_UP;
+
+import android.util.ArrayMap;
+
+import androidx.annotation.Nullable;
+import androidx.core.os.CancellationSignal;
+
+import com.android.internal.util.NotificationMessagingUtil;
+import com.android.systemui.statusbar.NotificationPresenter;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
+import com.android.systemui.statusbar.notification.collection.coordinator.HeadsUpCoordinator;
+import com.android.systemui.statusbar.notification.row.NotifBindPipeline.BindCallback;
+import com.android.systemui.statusbar.notification.row.RowContentBindParams;
+import com.android.systemui.statusbar.notification.row.RowContentBindStage;
+
+import java.util.Map;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+/**
+ * Wrapper around heads up view binding logic. {@link HeadsUpViewBinder} is responsible for
+ * figuring out the right heads up inflation parameters and inflating/freeing the heads up
+ * content view.
+ *
+ * TODO: This should be moved into {@link HeadsUpCoordinator} when the old pipeline is deprecated
+ * (i.e. when {@link HeadsUpController} is removed).
+ */
+@Singleton
+public class HeadsUpViewBinder {
+    private final RowContentBindStage mStage;
+    private final NotificationMessagingUtil mNotificationMessagingUtil;
+    private final Map<NotificationEntry, CancellationSignal> mOngoingBindCallbacks =
+            new ArrayMap<>();
+
+    private NotificationPresenter mNotificationPresenter;
+
+    @Inject
+    HeadsUpViewBinder(
+            NotificationMessagingUtil notificationMessagingUtil,
+            RowContentBindStage bindStage) {
+        mNotificationMessagingUtil = notificationMessagingUtil;
+        mStage = bindStage;
+    }
+
+    /**
+     * Set notification presenter to determine parameters for heads up view inflation.
+     */
+    public void setPresenter(NotificationPresenter presenter) {
+        mNotificationPresenter = presenter;
+    }
+
+    /**
+     * Bind heads up view to the notification row.
+     * @param callback callback after heads up view is bound
+     */
+    public void bindHeadsUpView(NotificationEntry entry, @Nullable BindCallback callback) {
+        RowContentBindParams params = mStage.getStageParams(entry);
+        final boolean isImportantMessage = mNotificationMessagingUtil.isImportantMessaging(
+                entry.getSbn(), entry.getImportance());
+        final boolean useIncreasedHeadsUp = isImportantMessage
+                && !mNotificationPresenter.isPresenterFullyCollapsed();
+        params.setUseIncreasedHeadsUpHeight(useIncreasedHeadsUp);
+        params.requireContentViews(FLAG_CONTENT_VIEW_HEADS_UP);
+        CancellationSignal signal = mStage.requestRebind(entry, en -> {
+            en.getRow().setUsesIncreasedHeadsUpHeight(params.useIncreasedHeadsUpHeight());
+            if (callback != null) {
+                callback.onBindFinished(en);
+            }
+        });
+        abortBindCallback(entry);
+        mOngoingBindCallbacks.put(entry, signal);
+    }
+
+    /**
+     * Abort any callbacks waiting for heads up view binding to finish for a given notification.
+     * @param entry notification with bind in progress
+     */
+    public void abortBindCallback(NotificationEntry entry) {
+        CancellationSignal ongoingBindCallback = mOngoingBindCallbacks.remove(entry);
+        if (ongoingBindCallback != null) {
+            ongoingBindCallback.cancel();
+        }
+    }
+
+    /**
+     * Unbind the heads up view from the notification row.
+     */
+    public void unbindHeadsUpView(NotificationEntry entry) {
+        abortBindCallback(entry);
+        mStage.getStageParams(entry).markContentViewsFreeable(FLAG_CONTENT_VIEW_HEADS_UP);
+        mStage.requestRebind(entry, null);
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/NotificationAlertingManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/NotificationAlertingManager.java
deleted file mode 100644
index 5d07098..0000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/NotificationAlertingManager.java
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- * Copyright (C) 2018 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.statusbar.notification.interruption;
-
-import static com.android.systemui.statusbar.NotificationRemoteInputManager.FORCE_REMOTE_INPUT_HISTORY;
-
-import android.app.Notification;
-import android.service.notification.StatusBarNotification;
-import android.util.Log;
-
-import com.android.internal.statusbar.NotificationVisibility;
-import com.android.systemui.plugins.statusbar.StatusBarStateController;
-import com.android.systemui.statusbar.NotificationListener;
-import com.android.systemui.statusbar.NotificationRemoteInputManager;
-import com.android.systemui.statusbar.notification.NotificationEntryListener;
-import com.android.systemui.statusbar.notification.NotificationEntryManager;
-import com.android.systemui.statusbar.notification.VisualStabilityManager;
-import com.android.systemui.statusbar.notification.collection.NotificationEntry;
-import com.android.systemui.statusbar.notification.dagger.NotificationsModule;
-import com.android.systemui.statusbar.policy.HeadsUpManager;
-
-/** Handles heads-up and pulsing behavior driven by notification changes. */
-public class NotificationAlertingManager {
-
-    private static final String TAG = "NotifAlertManager";
-
-    private final NotificationRemoteInputManager mRemoteInputManager;
-    private final VisualStabilityManager mVisualStabilityManager;
-    private final StatusBarStateController mStatusBarStateController;
-    private final NotificationInterruptStateProvider mNotificationInterruptStateProvider;
-    private final NotificationListener mNotificationListener;
-
-    private HeadsUpManager mHeadsUpManager;
-
-    /**
-     * Injected constructor. See {@link NotificationsModule}.
-     */
-    public NotificationAlertingManager(
-            NotificationEntryManager notificationEntryManager,
-            NotificationRemoteInputManager remoteInputManager,
-            VisualStabilityManager visualStabilityManager,
-            StatusBarStateController statusBarStateController,
-            NotificationInterruptStateProvider notificationInterruptionStateProvider,
-            NotificationListener notificationListener,
-            HeadsUpManager headsUpManager) {
-        mRemoteInputManager = remoteInputManager;
-        mVisualStabilityManager = visualStabilityManager;
-        mStatusBarStateController = statusBarStateController;
-        mNotificationInterruptStateProvider = notificationInterruptionStateProvider;
-        mNotificationListener = notificationListener;
-        mHeadsUpManager = headsUpManager;
-
-        notificationEntryManager.addNotificationEntryListener(new NotificationEntryListener() {
-            @Override
-            public void onEntryInflated(NotificationEntry entry) {
-                showAlertingView(entry);
-            }
-
-            @Override
-            public void onPreEntryUpdated(NotificationEntry entry) {
-                updateAlertState(entry);
-            }
-
-            @Override
-            public void onEntryRemoved(
-                    NotificationEntry entry,
-                    NotificationVisibility visibility,
-                    boolean removedByUser,
-                    int reason) {
-                stopAlerting(entry.getKey());
-            }
-        });
-    }
-
-    /**
-     * Adds the entry to the respective alerting manager if the content view was inflated and
-     * the entry should still alert.
-     */
-    private void showAlertingView(NotificationEntry entry) {
-        // TODO: Instead of this back and forth, we should listen to changes in heads up and
-        // cancel on-going heads up view inflation using the bind pipeline.
-        if (entry.getRow().getPrivateLayout().getHeadsUpChild() != null) {
-            mHeadsUpManager.showNotification(entry);
-            if (!mStatusBarStateController.isDozing()) {
-                // Mark as seen immediately
-                setNotificationShown(entry.getSbn());
-            }
-        }
-    }
-
-    private void updateAlertState(NotificationEntry entry) {
-        boolean alertAgain = alertAgain(entry, entry.getSbn().getNotification());
-        // includes check for whether this notification should be filtered:
-        boolean shouldAlert = mNotificationInterruptStateProvider.shouldHeadsUp(entry);
-        final boolean wasAlerting = mHeadsUpManager.isAlerting(entry.getKey());
-        if (wasAlerting) {
-            if (shouldAlert) {
-                mHeadsUpManager.updateNotification(entry.getKey(), alertAgain);
-            } else if (!mHeadsUpManager.isEntryAutoHeadsUpped(entry.getKey())) {
-                // We don't want this to be interrupting anymore, let's remove it
-                mHeadsUpManager.removeNotification(entry.getKey(), false /* removeImmediately */);
-            }
-        } else if (shouldAlert && alertAgain) {
-            // This notification was updated to be alerting, show it!
-            mHeadsUpManager.showNotification(entry);
-        }
-    }
-
-    /**
-     * Checks whether an update for a notification warrants an alert for the user.
-     *
-     * @param oldEntry the entry for this notification.
-     * @param newNotification the new notification for this entry.
-     * @return whether this notification should alert the user.
-     */
-    public static boolean alertAgain(
-            NotificationEntry oldEntry, Notification newNotification) {
-        return oldEntry == null || !oldEntry.hasInterrupted()
-                || (newNotification.flags & Notification.FLAG_ONLY_ALERT_ONCE) == 0;
-    }
-
-    private void setNotificationShown(StatusBarNotification n) {
-        try {
-            mNotificationListener.setNotificationsShown(new String[]{n.getKey()});
-        } catch (RuntimeException e) {
-            Log.d(TAG, "failed setNotificationsShown: ", e);
-        }
-    }
-
-    private void stopAlerting(final String key) {
-        // Attempt to remove notifications from their alert manager.
-        // Though the remove itself may fail, it lets the manager know to remove as soon as
-        // possible.
-        if (mHeadsUpManager.isAlerting(key)) {
-            // A cancel() in response to a remote input shouldn't be delayed, as it makes the
-            // sending look longer than it takes.
-            // Also we should not defer the removal if reordering isn't allowed since otherwise
-            // some notifications can't disappear before the panel is closed.
-            boolean ignoreEarliestRemovalTime =
-                    mRemoteInputManager.getController().isSpinning(key)
-                            && !FORCE_REMOTE_INPUT_HISTORY
-                            || !mVisualStabilityManager.isReorderingAllowed();
-            mHeadsUpManager.removeNotification(key, ignoreEarliestRemovalTime);
-        }
-    }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java
index b9dd974..92b597b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java
@@ -331,19 +331,6 @@
                 .setDuration(ACTIVATE_ANIMATION_LENGTH);
     }
 
-    @Override
-    public boolean performClick() {
-        if (!mNeedsDimming || (mAccessibilityManager != null
-                && mAccessibilityManager.isTouchExplorationEnabled())) {
-            return super.performClick();
-        }
-        return false;
-    }
-
-    boolean superPerformClick() {
-        return super.performClick();
-    }
-
     /**
      * Cancels the hotspot and makes the notification inactive.
      */
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationViewController.java
index 2f0e433..dd30c89 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationViewController.java
@@ -72,7 +72,7 @@
             } else {
                 mView.makeInactive(true /* animate */);
             }
-        }, mView::superPerformClick, mView::handleSlideBack,
+        }, mView::performClick, mView::handleSlideBack,
                 mFalsingManager::onNotificationDoubleTap);
         mView.setOnTouchListener(mTouchHandler);
         mView.setTouchHandler(mTouchHandler);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java
index 998230f..ba72e28 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java
@@ -70,6 +70,7 @@
 import com.android.systemui.Dependency;
 import com.android.systemui.Interpolators;
 import com.android.systemui.R;
+import com.android.systemui.bubbles.BubbleController;
 import com.android.systemui.plugins.FalsingManager;
 import com.android.systemui.plugins.PluginListener;
 import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin;
@@ -239,7 +240,6 @@
     private ExpandableNotificationRow mNotificationParent;
     private OnExpandClickListener mOnExpandClickListener;
     private View.OnClickListener mOnAppOpsClickListener;
-    private boolean mIsChildInGroup;
 
     // Listener will be called when receiving a long click event.
     // Use #setLongPressPosition to optionally assign positional data with the long press.
@@ -410,7 +410,7 @@
             setIconAnimationRunningForChild(running, mChildrenContainer.getHeaderView());
             setIconAnimationRunningForChild(running, mChildrenContainer.getLowPriorityHeaderView());
             List<ExpandableNotificationRow> notificationChildren =
-                    mChildrenContainer.getNotificationChildren();
+                    mChildrenContainer.getAttachedChildren();
             for (int i = 0; i < notificationChildren.size(); i++) {
                 ExpandableNotificationRow child = notificationChildren.get(i);
                 child.setIconAnimationRunning(running);
@@ -559,7 +559,7 @@
         if (mNotificationParent != null) {
             mNotificationParent.updateChildrenHeaderAppearance();
         }
-        onChildrenCountChanged();
+        onAttachedChildrenCountChanged();
         // The public layouts expand button is always visible
         mPublicLayout.updateExpandButtons(true);
         updateLimits();
@@ -579,6 +579,13 @@
         }
     }
 
+    /** Call when bubble state has changed and the button on the notification should be updated. */
+    public void updateBubbleButton() {
+        for (NotificationContentView l : mLayouts) {
+            l.updateBubbleButton(mEntry);
+        }
+    }
+
     @VisibleForTesting
     void updateShelfIconColor() {
         StatusBarIconView expandedIcon = mEntry.getIcons().getShelfIcon();
@@ -763,6 +770,16 @@
     }
 
     /**
+     * @see NotificationChildrenContainer#setUntruncatedChildCount(int)
+     */
+    public void setUntruncatedChildCount(int childCount) {
+        if (mChildrenContainer == null) {
+            mChildrenContainerStub.inflate();
+        }
+        mChildrenContainer.setUntruncatedChildCount(childCount);
+    }
+
+    /**
      * Add a child notification to this view.
      *
      * @param row the row to add
@@ -773,7 +790,7 @@
             mChildrenContainerStub.inflate();
         }
         mChildrenContainer.addNotification(row, childIndex);
-        onChildrenCountChanged();
+        onAttachedChildrenCountChanged();
         row.setIsChildInGroup(true, this);
     }
 
@@ -792,7 +809,7 @@
         if (mChildrenContainer != null) {
             mChildrenContainer.removeNotification(row);
         }
-        onChildrenCountChanged();
+        onAttachedChildrenCountChanged();
         row.setIsChildInGroup(false, null);
         row.setBottomRoundness(0.0f, false /* animate */);
     }
@@ -830,15 +847,7 @@
         }
         mNotificationParent = isChildInGroup ? parent : null;
         mPrivateLayout.setIsChildInGroup(isChildInGroup);
-        // TODO: Move inflation logic out of this call
-        if (mIsChildInGroup != isChildInGroup) {
-            mIsChildInGroup = isChildInGroup;
-            if (!isRemoved() && mIsLowPriority) {
-                RowContentBindParams params = mRowContentBindStage.getStageParams(mEntry);
-                params.setUseLowPriority(mIsLowPriority);
-                mRowContentBindStage.requestRebind(mEntry, null /* callback */);
-            }
-        }
+
         resetBackgroundAlpha();
         updateBackgroundForGroupState();
         updateClickAndFocus();
@@ -886,15 +895,8 @@
         return mChildrenExpanded;
     }
 
-    public List<ExpandableNotificationRow> getNotificationChildren() {
-        return mChildrenContainer == null ? null : mChildrenContainer.getNotificationChildren();
-    }
-
-    public int getNumberOfNotificationChildren() {
-        if (mChildrenContainer == null) {
-            return 0;
-        }
-        return mChildrenContainer.getNotificationChildren().size();
+    public List<ExpandableNotificationRow> getAttachedChildren() {
+        return mChildrenContainer == null ? null : mChildrenContainer.getAttachedChildren();
     }
 
     /**
@@ -1028,7 +1030,7 @@
         setChronometerRunning(running, mPublicLayout);
         if (mChildrenContainer != null) {
             List<ExpandableNotificationRow> notificationChildren =
-                    mChildrenContainer.getNotificationChildren();
+                    mChildrenContainer.getAttachedChildren();
             for (int i = 0; i < notificationChildren.size(); i++) {
                 ExpandableNotificationRow child = notificationChildren.get(i);
                 child.setChronometerRunning(running);
@@ -1086,6 +1088,18 @@
         updateClickAndFocus();
     }
 
+    /** The click listener for the bubble button. */
+    public View.OnClickListener getBubbleClickListener() {
+        return new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                Dependency.get(BubbleController.class)
+                        .onUserChangedBubble(mEntry, !mEntry.isBubble() /* createBubble */);
+                mHeadsUpManager.removeNotification(mEntry.getKey(), true /* releaseImmediately */);
+            }
+        };
+    }
+
     private void updateClickAndFocus() {
         boolean normalChild = !isChildInGroup() || isGroupExpanded();
         boolean clickable = mOnClickListener != null && normalChild;
@@ -1228,7 +1242,7 @@
         mUpdateBackgroundOnUpdate = true;
         reInflateViews();
         if (mChildrenContainer != null) {
-            for (ExpandableNotificationRow child : mChildrenContainer.getNotificationChildren()) {
+            for (ExpandableNotificationRow child : mChildrenContainer.getAttachedChildren()) {
                 child.onUiModeChanged();
             }
         }
@@ -1267,7 +1281,7 @@
         return mNotificationColor;
     }
 
-    private void updateNotificationColor() {
+    public void updateNotificationColor() {
         Configuration currentConfig = getResources().getConfiguration();
         boolean nightMode = (currentConfig.uiMode & Configuration.UI_MODE_NIGHT_MASK)
                 == Configuration.UI_MODE_NIGHT_YES;
@@ -1286,8 +1300,8 @@
     }
 
     public void removeAllChildren() {
-        List<ExpandableNotificationRow> notificationChildren
-                = mChildrenContainer.getNotificationChildren();
+        List<ExpandableNotificationRow> notificationChildren =
+                mChildrenContainer.getAttachedChildren();
         ArrayList<ExpandableNotificationRow> clonedList = new ArrayList<>(notificationChildren);
         for (int i = 0; i < clonedList.size(); i++) {
             ExpandableNotificationRow row = clonedList.get(i);
@@ -1297,7 +1311,7 @@
             mChildrenContainer.removeNotification(row);
             row.setIsChildInGroup(false, null);
         }
-        onChildrenCountChanged();
+        onAttachedChildrenCountChanged();
     }
 
     @Override
@@ -1308,7 +1322,7 @@
     public void setForceUnlocked(boolean forceUnlocked) {
         mForceUnlocked = forceUnlocked;
         if (mIsSummaryWithChildren) {
-            List<ExpandableNotificationRow> notificationChildren = getNotificationChildren();
+            List<ExpandableNotificationRow> notificationChildren = getAttachedChildren();
             for (ExpandableNotificationRow child : notificationChildren) {
                 child.setForceUnlocked(forceUnlocked);
             }
@@ -1324,7 +1338,7 @@
         mEntry.getIcons().getStatusBarIcon().setDismissed();
         if (isChildInGroup()) {
             List<ExpandableNotificationRow> notificationChildren =
-                    mNotificationParent.getNotificationChildren();
+                    mNotificationParent.getAttachedChildren();
             int i = notificationChildren.indexOf(this);
             if (i != -1 && i < notificationChildren.size() - 1) {
                 mChildAfterViewWhenDismissed = notificationChildren.get(i + 1);
@@ -1613,6 +1627,9 @@
         mFalsingManager = falsingManager;
         mStatusbarStateController = statusBarStateController;
         mPeopleNotificationIdentifier = peopleNotificationIdentifier;
+        for (NotificationContentView l : mLayouts) {
+            l.setPeopleNotificationIdentifier(mPeopleNotificationIdentifier);
+        }
     }
 
     private void initDimens() {
@@ -2328,7 +2345,7 @@
         return mGroupManager.isGroupExpanded(mEntry.getSbn());
     }
 
-    private void onChildrenCountChanged() {
+    private void onAttachedChildrenCountChanged() {
         mIsSummaryWithChildren = mChildrenContainer != null
                 && mChildrenContainer.getNotificationChildCount() > 0;
         if (mIsSummaryWithChildren && mChildrenContainer.getHeaderView() == null) {
@@ -2361,7 +2378,7 @@
         // If this is a summary, then add in the children notification channels for the
         // same user and pkg.
         if (mIsSummaryWithChildren) {
-            final List<ExpandableNotificationRow> childrenRows = getNotificationChildren();
+            final List<ExpandableNotificationRow> childrenRows = getAttachedChildren();
             final int numChildren = childrenRows.size();
             for (int i = 0; i < numChildren; i++) {
                 final ExpandableNotificationRow childRow = childrenRows.get(i);
@@ -2468,7 +2485,7 @@
         mHideSensitiveForIntrinsicHeight = hideSensitive;
         if (mIsSummaryWithChildren) {
             List<ExpandableNotificationRow> notificationChildren =
-                    mChildrenContainer.getNotificationChildren();
+                    mChildrenContainer.getAttachedChildren();
             for (int i = 0; i < notificationChildren.size(); i++) {
                 ExpandableNotificationRow child = notificationChildren.get(i);
                 child.setHideSensitiveForIntrinsicHeight(hideSensitive);
@@ -2806,7 +2823,7 @@
         updateBackgroundForGroupState();
         if (mIsSummaryWithChildren) {
             List<ExpandableNotificationRow> notificationChildren =
-                    mChildrenContainer.getNotificationChildren();
+                    mChildrenContainer.getAttachedChildren();
             for (int i = 0; i < notificationChildren.size(); i++) {
                 ExpandableNotificationRow child = notificationChildren.get(i);
                 child.updateBackgroundForGroupState();
@@ -2831,7 +2848,7 @@
             mShowNoBackground = !mShowGroupBackgroundWhenExpanded && isGroupExpanded()
                     && !isGroupExpansionChanging() && !isUserLocked();
             mChildrenContainer.updateHeaderForExpansion(mShowNoBackground);
-            List<ExpandableNotificationRow> children = mChildrenContainer.getNotificationChildren();
+            List<ExpandableNotificationRow> children = mChildrenContainer.getAttachedChildren();
             for (int i = 0; i < children.size(); i++) {
                 children.get(i).updateBackgroundForGroupState();
             }
@@ -3241,7 +3258,7 @@
             pw.print(", alpha: " + mChildrenContainer.getAlpha());
             pw.print(", translationY: " + mChildrenContainer.getTranslationY());
             pw.println();
-            List<ExpandableNotificationRow> notificationChildren = getNotificationChildren();
+            List<ExpandableNotificationRow> notificationChildren = getAttachedChildren();
             pw.println("  Children: " + notificationChildren.size());
             pw.println("  {");
             for(ExpandableNotificationRow child : notificationChildren) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableView.java
index ee3b753..5797944 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableView.java
@@ -590,7 +590,7 @@
         // handling reset for child notifications
         if (this instanceof ExpandableNotificationRow) {
             ExpandableNotificationRow row = (ExpandableNotificationRow) this;
-            List<ExpandableNotificationRow> children = row.getNotificationChildren();
+            List<ExpandableNotificationRow> children = row.getAttachedChildren();
             if (row.isSummaryWithChildren() && children != null) {
                 for (ExpandableNotificationRow childRow : children) {
                     childRow.resetViewState();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/FooterView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/FooterView.java
index 41b248f..3ec8c23 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/FooterView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/FooterView.java
@@ -29,6 +29,7 @@
     private final int mClearAllTopPadding;
     private FooterViewButton mDismissButton;
     private FooterViewButton mManageButton;
+    private boolean mShowHistory;
 
     public FooterView(Context context, AttributeSet attrs) {
         super(context, attrs);
@@ -72,15 +73,30 @@
                 || touchY > mContent.getY() + mContent.getHeight();
     }
 
+    public void showHistory(boolean showHistory) {
+        mShowHistory = showHistory;
+        if (mShowHistory) {
+            mManageButton.setText(R.string.manage_notifications_history_text);
+            mManageButton.setContentDescription(
+                    mContext.getString(R.string.manage_notifications_history_text));
+        } else {
+            mManageButton.setText(R.string.manage_notifications_text);
+            mManageButton.setContentDescription(
+                    mContext.getString(R.string.manage_notifications_text));
+        }
+    }
+
+    public boolean isHistoryShown() {
+        return mShowHistory;
+    }
+
     @Override
     protected void onConfigurationChanged(Configuration newConfig) {
         super.onConfigurationChanged(newConfig);
         mDismissButton.setText(R.string.clear_all_notifications_text);
         mDismissButton.setContentDescription(
                 mContext.getString(R.string.accessibility_clear_all));
-        mManageButton.setText(R.string.manage_notifications_history_text);
-        mManageButton.setContentDescription(
-                mContext.getString(R.string.manage_notifications_history_text));
+        showHistory(mShowHistory);
     }
 
     public boolean isButtonVisible() {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java
index 9d54437..582e3e5 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java
@@ -132,7 +132,6 @@
                 mConversationProcessor,
                 row,
                 bindParams.isLowPriority,
-                bindParams.isChildInGroup,
                 bindParams.usesIncreasedHeight,
                 bindParams.usesIncreasedHeadsUpHeight,
                 callback,
@@ -156,7 +155,6 @@
         InflationProgress result = createRemoteViews(reInflateFlags,
                 builder,
                 bindParams.isLowPriority,
-                bindParams.isChildInGroup,
                 bindParams.usesIncreasedHeight,
                 bindParams.usesIncreasedHeadsUpHeight,
                 packageContext);
@@ -285,11 +283,9 @@
     }
 
     private static InflationProgress createRemoteViews(@InflationFlag int reInflateFlags,
-            Notification.Builder builder, boolean isLowPriority, boolean isChildInGroup,
-            boolean usesIncreasedHeight, boolean usesIncreasedHeadsUpHeight,
-            Context packageContext) {
+            Notification.Builder builder, boolean isLowPriority, boolean usesIncreasedHeight,
+            boolean usesIncreasedHeadsUpHeight, Context packageContext) {
         InflationProgress result = new InflationProgress();
-        isLowPriority = isLowPriority && !isChildInGroup;
 
         if ((reInflateFlags & FLAG_CONTENT_VIEW_CONTRACTED) != 0) {
             result.newContentView = createContentView(builder, isLowPriority, usesIncreasedHeight);
@@ -702,7 +698,6 @@
         private final Context mContext;
         private final boolean mInflateSynchronously;
         private final boolean mIsLowPriority;
-        private final boolean mIsChildInGroup;
         private final boolean mUsesIncreasedHeight;
         private final InflationCallback mCallback;
         private final boolean mUsesIncreasedHeadsUpHeight;
@@ -728,7 +723,6 @@
                 ConversationNotificationProcessor conversationProcessor,
                 ExpandableNotificationRow row,
                 boolean isLowPriority,
-                boolean isChildInGroup,
                 boolean usesIncreasedHeight,
                 boolean usesIncreasedHeadsUpHeight,
                 InflationCallback callback,
@@ -743,7 +737,6 @@
             mRemoteViewCache = cache;
             mContext = mRow.getContext();
             mIsLowPriority = isLowPriority;
-            mIsChildInGroup = isChildInGroup;
             mUsesIncreasedHeight = usesIncreasedHeight;
             mUsesIncreasedHeadsUpHeight = usesIncreasedHeadsUpHeight;
             mRemoteViewClickHandler = remoteViewClickHandler;
@@ -781,7 +774,7 @@
                     mConversationProcessor.processNotification(mEntry, recoveredBuilder);
                 }
                 InflationProgress inflationProgress = createRemoteViews(mReInflateFlags,
-                        recoveredBuilder, mIsLowPriority, mIsChildInGroup, mUsesIncreasedHeight,
+                        recoveredBuilder, mIsLowPriority, mUsesIncreasedHeight,
                         mUsesIncreasedHeadsUpHeight, packageContext);
                 return inflateSmartReplyViews(inflationProgress, mReInflateFlags, mEntry,
                         mRow.getContext(), packageContext, mRow.getHeadsUpManager(),
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java
index 3c3f1b2..bd1745e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java
@@ -16,13 +16,18 @@
 
 package com.android.systemui.statusbar.notification.row;
 
+
+import static android.provider.Settings.Global.NOTIFICATION_BUBBLES;
+
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.app.Notification;
 import android.app.PendingIntent;
 import android.content.Context;
 import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
 import android.os.Build;
+import android.provider.Settings;
 import android.service.notification.StatusBarNotification;
 import android.util.ArrayMap;
 import android.util.ArraySet;
@@ -47,6 +52,7 @@
 import com.android.systemui.statusbar.TransformableView;
 import com.android.systemui.statusbar.notification.NotificationUtils;
 import com.android.systemui.statusbar.notification.collection.NotificationEntry;
+import com.android.systemui.statusbar.notification.people.PeopleNotificationIdentifier;
 import com.android.systemui.statusbar.notification.row.wrapper.NotificationCustomViewWrapper;
 import com.android.systemui.statusbar.notification.row.wrapper.NotificationViewWrapper;
 import com.android.systemui.statusbar.phone.NotificationGroupManager;
@@ -118,6 +124,7 @@
     private NotificationGroupManager mGroupManager;
     private RemoteInputController mRemoteInputController;
     private Runnable mExpandedVisibleListener;
+    private PeopleNotificationIdentifier mPeopleIdentifier;
     /**
      * List of listeners for when content views become inactive (i.e. not the showing view).
      */
@@ -454,6 +461,9 @@
         mExpandedChild = child;
         mExpandedWrapper = NotificationViewWrapper.wrap(getContext(), child,
                 mContainingNotification);
+        if (mContainingNotification != null) {
+            applyBubbleAction(mExpandedChild, mContainingNotification.getEntry());
+        }
     }
 
     /**
@@ -493,6 +503,9 @@
         mHeadsUpChild = child;
         mHeadsUpWrapper = NotificationViewWrapper.wrap(getContext(), child,
                 mContainingNotification);
+        if (mContainingNotification != null) {
+            applyBubbleAction(mHeadsUpChild, mContainingNotification.getEntry());
+        }
     }
 
     @Override
@@ -1138,6 +1151,8 @@
         mForceSelectNextLayout = true;
         mPreviousExpandedRemoteInputIntent = null;
         mPreviousHeadsUpRemoteInputIntent = null;
+        applyBubbleAction(mExpandedChild, entry);
+        applyBubbleAction(mHeadsUpChild, entry);
     }
 
     private void updateAllSingleLineViews() {
@@ -1308,6 +1323,58 @@
         return null;
     }
 
+    /**
+     * Call to update state of the bubble button (i.e. does it show bubble or unbubble or no
+     * icon at all).
+     *
+     * @param entry the new entry to use.
+     */
+    public void updateBubbleButton(NotificationEntry entry) {
+        applyBubbleAction(mExpandedChild, entry);
+    }
+
+    private boolean isBubblesEnabled() {
+        return Settings.Global.getInt(mContext.getContentResolver(),
+                NOTIFICATION_BUBBLES, 0) == 1;
+    }
+
+    private void applyBubbleAction(View layout, NotificationEntry entry) {
+        if (layout == null || mContainingNotification == null || mPeopleIdentifier == null) {
+            return;
+        }
+        ImageView bubbleButton = layout.findViewById(com.android.internal.R.id.bubble_button);
+        View actionContainer = layout.findViewById(com.android.internal.R.id.actions_container);
+        if (bubbleButton == null || actionContainer == null) {
+            return;
+        }
+        boolean isPerson =
+                mPeopleIdentifier.getPeopleNotificationType(entry.getSbn(), entry.getRanking())
+                        != PeopleNotificationIdentifier.TYPE_NON_PERSON;
+        boolean showButton = isBubblesEnabled()
+                && isPerson
+                && entry.getBubbleMetadata() != null;
+        if (showButton) {
+            Drawable d = mContext.getResources().getDrawable(entry.isBubble()
+                    ? R.drawable.ic_stop_bubble
+                    : R.drawable.ic_create_bubble);
+            mContainingNotification.updateNotificationColor();
+            final int tint = mContainingNotification.getNotificationColor();
+            d.setTint(tint);
+
+            String contentDescription = mContext.getResources().getString(entry.isBubble()
+                    ? R.string.notification_conversation_unbubble
+                    : R.string.notification_conversation_bubble);
+
+            bubbleButton.setContentDescription(contentDescription);
+            bubbleButton.setImageDrawable(d);
+            bubbleButton.setOnClickListener(mContainingNotification.getBubbleClickListener());
+            bubbleButton.setVisibility(VISIBLE);
+            actionContainer.setVisibility(VISIBLE);
+        } else  {
+            bubbleButton.setVisibility(GONE);
+        }
+    }
+
     private void applySmartReplyView(
             SmartRepliesAndActions smartRepliesAndActions,
             NotificationEntry entry) {
@@ -1512,6 +1579,10 @@
         mContainingNotification = containingNotification;
     }
 
+    public void setPeopleNotificationIdentifier(PeopleNotificationIdentifier peopleIdentifier) {
+        mPeopleIdentifier = peopleIdentifier;
+    }
+
     public void requestSelectLayout(boolean needsAnimation) {
         selectLayout(needsAnimation, false);
     }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java
index 6fc1264..bcc81a8 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java
@@ -17,9 +17,13 @@
 package com.android.systemui.statusbar.notification.row;
 
 import static android.app.Notification.EXTRA_IS_GROUP_CONVERSATION;
+import static android.app.NotificationManager.BUBBLE_PREFERENCE_ALL;
+import static android.app.NotificationManager.BUBBLE_PREFERENCE_NONE;
+import static android.app.NotificationManager.BUBBLE_PREFERENCE_SELECTED;
 import static android.app.NotificationManager.IMPORTANCE_DEFAULT;
 import static android.app.NotificationManager.IMPORTANCE_LOW;
 import static android.app.NotificationManager.IMPORTANCE_UNSPECIFIED;
+import static android.provider.Settings.Global.NOTIFICATION_BUBBLES;
 
 import static com.android.systemui.Interpolators.FAST_OUT_SLOW_IN;
 
@@ -27,10 +31,12 @@
 
 import android.annotation.IntDef;
 import android.annotation.NonNull;
+import android.annotation.Nullable;
 import android.app.INotificationManager;
 import android.app.Notification;
 import android.app.NotificationChannel;
 import android.app.NotificationChannelGroup;
+import android.app.NotificationManager;
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.ApplicationInfo;
@@ -38,11 +44,10 @@
 import android.content.pm.ShortcutInfo;
 import android.content.pm.ShortcutManager;
 import android.graphics.drawable.Icon;
-import android.os.Bundle;
 import android.os.Handler;
 import android.os.Parcelable;
 import android.os.RemoteException;
-import android.os.UserHandle;
+import android.provider.Settings;
 import android.service.notification.StatusBarNotification;
 import android.text.TextUtils;
 import android.transition.ChangeBounds;
@@ -51,7 +56,7 @@
 import android.transition.TransitionSet;
 import android.util.AttributeSet;
 import android.util.Log;
-import android.util.Slog;
+import android.view.LayoutInflater;
 import android.view.View;
 import android.view.accessibility.AccessibilityEvent;
 import android.widget.ImageView;
@@ -61,13 +66,17 @@
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.settingslib.notification.ConversationIconFactory;
 import com.android.systemui.Dependency;
+import com.android.systemui.Prefs;
 import com.android.systemui.R;
+import com.android.systemui.statusbar.notification.NotificationChannelHelper;
 import com.android.systemui.statusbar.notification.VisualStabilityManager;
 import com.android.systemui.statusbar.notification.collection.NotificationEntry;
 
 import java.lang.annotation.Retention;
 import java.util.List;
 
+import javax.inject.Provider;
+
 /**
  * The guts of a conversation notification revealed when performing a long press.
  */
@@ -90,7 +99,11 @@
     private ShortcutInfo mShortcutInfo;
     private String mConversationId;
     private StatusBarNotification mSbn;
+    @Nullable private Notification.BubbleMetadata mBubbleMetadata;
+    private Context mUserContext;
+    private Provider<PriorityOnboardingDialogController.Builder> mBuilderProvider;
     private boolean mIsDeviceProvisioned;
+    private int mAppBubble;
 
     private TextView mPriorityDescriptionView;
     private TextView mDefaultDescriptionView;
@@ -132,17 +145,17 @@
     */
 
     private OnClickListener mOnFavoriteClick = v -> {
-        mSelectedAction = ACTION_FAVORITE;
+        setSelectedAction(ACTION_FAVORITE);
         updateToggleActions(mSelectedAction, true);
     };
 
     private OnClickListener mOnDefaultClick = v -> {
-        mSelectedAction = ACTION_DEFAULT;
+        setSelectedAction(ACTION_DEFAULT);
         updateToggleActions(mSelectedAction, true);
     };
 
     private OnClickListener mOnMuteClick = v -> {
-        mSelectedAction = ACTION_MUTE;
+        setSelectedAction(ACTION_MUTE);
         updateToggleActions(mSelectedAction, true);
     };
 
@@ -166,6 +179,23 @@
         void onClick(View v, int hoursToSnooze);
     }
 
+    @VisibleForTesting
+    void setSelectedAction(int selectedAction) {
+        if (mSelectedAction == selectedAction) {
+            return;
+        }
+
+        mSelectedAction = selectedAction;
+        onSelectedActionChanged();
+    }
+
+    private void onSelectedActionChanged() {
+        // If the user selected Priority, maybe show the priority onboarding
+        if (mSelectedAction == ACTION_FAVORITE && shouldShowPriorityOnboarding()) {
+            showPriorityOnboarding();
+        }
+    }
+
     public void bindNotification(
             ShortcutManager shortcutManager,
             PackageManager pm,
@@ -174,9 +204,12 @@
             String pkg,
             NotificationChannel notificationChannel,
             NotificationEntry entry,
+            Notification.BubbleMetadata bubbleMetadata,
             OnSettingsClickListener onSettingsClick,
             OnSnoozeClickListener onSnoozeClickListener,
             ConversationIconFactory conversationIconFactory,
+            Context userContext,
+            Provider<PriorityOnboardingDialogController.Builder> builderProvider,
             boolean isDeviceProvisioned) {
         mSelectedAction = -1;
         mINotificationManager = iNotificationManager;
@@ -192,6 +225,9 @@
         mIsDeviceProvisioned = isDeviceProvisioned;
         mOnSnoozeClickListener = onSnoozeClickListener;
         mIconFactory = conversationIconFactory;
+        mUserContext = userContext;
+        mBubbleMetadata = bubbleMetadata;
+        mBuilderProvider = builderProvider;
 
         mShortcutManager = shortcutManager;
         mConversationId = mNotificationChannel.getConversationId();
@@ -203,7 +239,15 @@
         }
         mShortcutInfo = entry.getRanking().getShortcutInfo();
 
-        createConversationChannelIfNeeded();
+        mNotificationChannel = NotificationChannelHelper.createConversationChannelIfNeeded(
+                getContext(), mINotificationManager, entry, mNotificationChannel);
+
+        try {
+            mAppBubble = mINotificationManager.getBubblePreferenceForPackage(mPackageName, mAppUid);
+        } catch (RemoteException e) {
+            Log.e(TAG, "can't reach OS", e);
+            mAppBubble = BUBBLE_PREFERENCE_SELECTED;
+        }
 
         bindHeader();
         bindActions();
@@ -212,27 +256,6 @@
         done.setOnClickListener(mOnDone);
     }
 
-    void createConversationChannelIfNeeded() {
-        // If this channel is not already a customized conversation channel, create
-        // a custom channel
-        if (TextUtils.isEmpty(mNotificationChannel.getConversationId())) {
-            try {
-                // TODO: remove
-                mNotificationChannel.setName(mContext.getString(
-                        R.string.notification_summary_message_format,
-                        getName(), mNotificationChannel.getName()));
-                mINotificationManager.createConversationNotificationChannelForPackage(
-                        mPackageName, mAppUid, mSbn.getKey(), mNotificationChannel,
-                        mConversationId);
-                mNotificationChannel = mINotificationManager.getConversationNotificationChannel(
-                        mContext.getOpPackageName(), UserHandle.getUserId(mAppUid), mPackageName,
-                        mNotificationChannel.getId(), false, mConversationId);
-            } catch (RemoteException e) {
-                Slog.e(TAG, "Could not create conversation channel", e);
-            }
-        }
-    }
-
     private void bindActions() {
 
         // TODO: b/152050825
@@ -247,6 +270,11 @@
         snooze.setOnClickListener(mOnSnoozeClick);
         */
 
+        if (mAppBubble == BUBBLE_PREFERENCE_ALL) {
+            ((TextView) findViewById(R.id.default_summary)).setText(getResources().getString(
+                    R.string.notification_channel_summary_default_with_bubbles, mAppName));
+        }
+
         findViewById(R.id.priority).setOnClickListener(mOnFavoriteClick);
         findViewById(R.id.default_behavior).setOnClickListener(mOnDefaultClick);
         findViewById(R.id.silence).setOnClickListener(mOnMuteClick);
@@ -284,7 +312,6 @@
         // bindName();
         bindPackage();
         bindIcon(mNotificationChannel.isImportantConversation());
-
     }
 
     private void bindIcon(boolean important) {
@@ -316,24 +343,6 @@
         }
     }
 
-    private void bindName() {
-        TextView name = findViewById(R.id.name);
-        name.setText(getName());
-    }
-
-    private String getName() {
-        if (mShortcutInfo != null) {
-            return mShortcutInfo.getShortLabel().toString();
-        } else {
-            Bundle extras = mSbn.getNotification().extras;
-            String nameString = extras.getString(Notification.EXTRA_CONVERSATION_TITLE);
-            if (TextUtils.isEmpty(nameString)) {
-                nameString = extras.getString(Notification.EXTRA_TITLE);
-            }
-            return nameString;
-        }
-    }
-
     private void bindPackage() {
         ApplicationInfo info;
         try {
@@ -514,6 +523,39 @@
                         mAppUid, mSelectedAction, mNotificationChannel));
     }
 
+    private boolean shouldShowPriorityOnboarding() {
+        return !Prefs.getBoolean(mUserContext, Prefs.Key.HAS_SEEN_PRIORITY_ONBOARDING, false);
+    }
+
+    private void showPriorityOnboarding() {
+        View onboardingView = LayoutInflater.from(mContext)
+                .inflate(R.layout.priority_onboarding_half_shell, null);
+
+        boolean ignoreDnd = false;
+        try {
+            ignoreDnd = (mINotificationManager
+                    .getConsolidatedNotificationPolicy().priorityConversationSenders
+                    & NotificationManager.Policy.CONVERSATION_SENDERS_IMPORTANT) != 0;
+        } catch (RemoteException e) {
+            Log.e(TAG, "Could not check conversation senders", e);
+        }
+
+        boolean showAsBubble = mBubbleMetadata != null
+                && mBubbleMetadata.getAutoExpandBubble()
+                && Settings.Global.getInt(mContext.getContentResolver(),
+                        NOTIFICATION_BUBBLES, 0) == 1;
+
+        PriorityOnboardingDialogController controller = mBuilderProvider.get()
+                .setContext(mUserContext)
+                .setView(onboardingView)
+                .setIgnoresDnd(ignoreDnd)
+                .setShowsAsBubble(showAsBubble)
+                .build();
+
+        controller.init();
+        controller.show();
+    }
+
     /**
      * Closes the controls and commits the updated importance values (indirectly).
      *
@@ -598,6 +640,10 @@
                                 !mChannelToUpdate.isImportantConversation());
                         if (mChannelToUpdate.isImportantConversation()) {
                             mChannelToUpdate.setAllowBubbles(true);
+                            if (mAppBubble == BUBBLE_PREFERENCE_NONE) {
+                                mINotificationManager.setBubblesAllowed(mAppPkg, mAppUid,
+                                        BUBBLE_PREFERENCE_SELECTED);
+                            }
                         }
                         mChannelToUpdate.setImportance(Math.max(
                                 mChannelToUpdate.getOriginalImportance(), IMPORTANCE_DEFAULT));
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java
index 2487d1a..1c808cf9 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java
@@ -49,6 +49,7 @@
 import com.android.systemui.dagger.qualifiers.Main;
 import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin;
 import com.android.systemui.plugins.statusbar.StatusBarStateController;
+import com.android.systemui.settings.CurrentUserContextTracker;
 import com.android.systemui.statusbar.NotificationLifetimeExtender;
 import com.android.systemui.statusbar.NotificationLockscreenUserManager;
 import com.android.systemui.statusbar.NotificationPresenter;
@@ -67,6 +68,8 @@
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
 
+import javax.inject.Provider;
+
 import dagger.Lazy;
 
 /**
@@ -111,6 +114,8 @@
     private final INotificationManager mNotificationManager;
     private final LauncherApps mLauncherApps;
     private final ShortcutManager mShortcutManager;
+    private final CurrentUserContextTracker mContextTracker;
+    private final Provider<PriorityOnboardingDialogController.Builder> mBuilderProvider;
 
     /**
      * Injected constructor. See {@link NotificationsModule}.
@@ -121,7 +126,9 @@
             HighPriorityProvider highPriorityProvider,
             INotificationManager notificationManager,
             LauncherApps launcherApps,
-            ShortcutManager shortcutManager) {
+            ShortcutManager shortcutManager,
+            CurrentUserContextTracker contextTracker,
+            Provider<PriorityOnboardingDialogController.Builder> builderProvider) {
         mContext = context;
         mVisualStabilityManager = visualStabilityManager;
         mStatusBarLazy = statusBarLazy;
@@ -131,6 +138,8 @@
         mNotificationManager = notificationManager;
         mLauncherApps = launcherApps;
         mShortcutManager = shortcutManager;
+        mContextTracker = contextTracker;
+        mBuilderProvider = builderProvider;
     }
 
     public void setUpWithPresenter(NotificationPresenter presenter,
@@ -357,7 +366,8 @@
             final ExpandableNotificationRow row,
             NotificationConversationInfo notificationInfoView) throws Exception {
         NotificationGuts guts = row.getGuts();
-        StatusBarNotification sbn = row.getEntry().getSbn();
+        NotificationEntry entry = row.getEntry();
+        StatusBarNotification sbn = entry.getSbn();
         String packageName = sbn.getPackageName();
         // Settings link is only valid for notifications that specify a non-system user
         NotificationConversationInfo.OnSettingsClickListener onSettingsClick = null;
@@ -398,11 +408,14 @@
                 mNotificationManager,
                 mVisualStabilityManager,
                 packageName,
-                row.getEntry().getChannel(),
-                row.getEntry(),
+                entry.getChannel(),
+                entry,
+                entry.getBubbleMetadata(),
                 onSettingsClick,
                 onSnoozeClickListener,
                 iconFactoryLoader,
+                mContextTracker.getCurrentUserContext(),
+                mBuilderProvider,
                 mDeviceProvisionedController.isDeviceProvisioned());
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationRowContentBinder.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationRowContentBinder.java
index 9bd8d47..a9f83c8 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationRowContentBinder.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationRowContentBinder.java
@@ -114,11 +114,6 @@
         public boolean isLowPriority;
 
         /**
-         * Bind child version of content views.
-         */
-        public boolean isChildInGroup;
-
-        /**
          * Use increased height when binding contracted view.
          */
         public boolean usesIncreasedHeight;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/PriorityOnboardingDialogController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/PriorityOnboardingDialogController.kt
new file mode 100644
index 0000000..d1b4052
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/PriorityOnboardingDialogController.kt
@@ -0,0 +1,146 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.statusbar.notification.row
+
+import android.app.Dialog
+import android.content.Context
+import android.graphics.Color
+import android.graphics.PixelFormat
+import android.graphics.drawable.ColorDrawable
+import android.view.Gravity
+import android.view.View
+import android.view.View.GONE
+import android.view.ViewGroup.LayoutParams.MATCH_PARENT
+import android.view.ViewGroup.LayoutParams.WRAP_CONTENT
+import android.view.Window
+import android.view.WindowInsets.Type.statusBars
+import android.view.WindowManager
+import android.widget.LinearLayout
+import android.widget.TextView
+import com.android.systemui.Prefs
+import com.android.systemui.R
+import java.lang.IllegalStateException
+import javax.inject.Inject
+
+/**
+ * Controller to handle presenting the priority conversations onboarding dialog
+ */
+class PriorityOnboardingDialogController @Inject constructor(
+    val view: View,
+    val context: Context,
+    val ignoresDnd: Boolean,
+    val showsAsBubble: Boolean
+) {
+
+    private lateinit var dialog: Dialog
+
+    fun init() {
+        initDialog()
+    }
+
+    fun show() {
+        dialog.show()
+    }
+
+    private fun done() {
+        // Log that the user has seen the onboarding
+        Prefs.putBoolean(context, Prefs.Key.HAS_SEEN_PRIORITY_ONBOARDING, true)
+        dialog.dismiss()
+    }
+
+    class Builder @Inject constructor() {
+        private lateinit var view: View
+        private lateinit var context: Context
+        private var ignoresDnd = false
+        private var showAsBubble = false
+
+        fun setView(v: View): Builder {
+            view = v
+            return this
+        }
+
+        fun setContext(c: Context): Builder {
+            context = c
+            return this
+        }
+
+        fun setIgnoresDnd(ignore: Boolean): Builder {
+            ignoresDnd = ignore
+            return this
+        }
+
+        fun setShowsAsBubble(bubble: Boolean): Builder {
+            showAsBubble = bubble
+            return this
+        }
+
+        fun build(): PriorityOnboardingDialogController {
+            val controller = PriorityOnboardingDialogController(
+                    view, context, ignoresDnd, showAsBubble)
+            return controller
+        }
+    }
+
+    private fun initDialog() {
+        dialog = Dialog(context)
+
+        if (dialog.window == null) {
+            throw IllegalStateException("Need a window for the onboarding dialog to show")
+        }
+
+        dialog.window?.requestFeature(Window.FEATURE_NO_TITLE)
+        // Prevent a11y readers from reading the first element in the dialog twice
+        dialog.setTitle("\u00A0")
+        dialog.apply {
+            setContentView(view)
+            setCanceledOnTouchOutside(true)
+
+            findViewById<TextView>(R.id.done_button)?.setOnClickListener {
+                done()
+            }
+
+            if (!ignoresDnd) {
+                findViewById<LinearLayout>(R.id.ignore_dnd_tip).visibility = GONE
+            }
+
+            if (!showsAsBubble) {
+                findViewById<LinearLayout>(R.id.floating_bubble_tip).visibility = GONE
+            }
+
+            window?.apply {
+                setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
+                addFlags(wmFlags)
+                setType(WindowManager.LayoutParams.TYPE_STATUS_BAR_SUB_PANEL)
+                setWindowAnimations(com.android.internal.R.style.Animation_InputMethod)
+
+                attributes = attributes.apply {
+                    format = PixelFormat.TRANSLUCENT
+                    title = ChannelEditorDialogController::class.java.simpleName
+                    gravity = Gravity.BOTTOM or Gravity.CENTER_HORIZONTAL
+                    fitInsetsTypes = attributes.fitInsetsTypes and statusBars().inv()
+                    width = MATCH_PARENT
+                    height = WRAP_CONTENT
+                }
+            }
+        }
+    }
+
+    private val wmFlags = (WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS
+            or WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
+            or WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
+            or WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED)
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/RowContentBindParams.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/RowContentBindParams.java
index d3fec69..f26ecc3 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/RowContentBindParams.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/RowContentBindParams.java
@@ -27,7 +27,6 @@
  */
 public final class RowContentBindParams {
     private boolean mUseLowPriority;
-    private boolean mUseChildInGroup;
     private boolean mUseIncreasedHeight;
     private boolean mUseIncreasedHeadsUpHeight;
     private boolean mViewsNeedReinflation;
@@ -56,20 +55,6 @@
     }
 
     /**
-     * Set whether content should use group child version of its content views.
-     */
-    public void setUseChildInGroup(boolean useChildInGroup) {
-        if (mUseChildInGroup != useChildInGroup) {
-            mDirtyContentViews |= (FLAG_CONTENT_VIEW_CONTRACTED | FLAG_CONTENT_VIEW_EXPANDED);
-        }
-        mUseChildInGroup = useChildInGroup;
-    }
-
-    public boolean useChildInGroup() {
-        return mUseChildInGroup;
-    }
-
-    /**
      * Set whether content should use an increased height version of its contracted view.
      */
     public void setUseIncreasedCollapsedHeight(boolean useIncreasedHeight) {
@@ -163,10 +148,10 @@
     @Override
     public String toString() {
         return String.format("RowContentBindParams[mContentViews=%x mDirtyContentViews=%x "
-                + "mUseLowPriority=%b mUseChildInGroup=%b mUseIncreasedHeight=%b "
+                + "mUseLowPriority=%b mUseIncreasedHeight=%b "
                 + "mUseIncreasedHeadsUpHeight=%b mViewsNeedReinflation=%b]",
-                mContentViews, mDirtyContentViews, mUseLowPriority, mUseChildInGroup,
-                mUseIncreasedHeight, mUseIncreasedHeadsUpHeight, mViewsNeedReinflation);
+                mContentViews, mDirtyContentViews, mUseLowPriority, mUseIncreasedHeight,
+                mUseIncreasedHeadsUpHeight, mViewsNeedReinflation);
     }
 
     /**
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/RowContentBindStage.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/RowContentBindStage.java
index c632f3e..c6f0a13 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/RowContentBindStage.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/RowContentBindStage.java
@@ -71,7 +71,6 @@
 
         BindParams bindParams = new BindParams();
         bindParams.isLowPriority = params.useLowPriority();
-        bindParams.isChildInGroup = params.useChildInGroup();
         bindParams.usesIncreasedHeight = params.useIncreasedHeight();
         bindParams.usesIncreasedHeadsUpHeight = params.useIncreasedHeadsUpHeight();
         boolean forceInflate = params.needsReinflation();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationHeaderViewWrapper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationHeaderViewWrapper.java
index 7ac0662..e20be2b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationHeaderViewWrapper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationHeaderViewWrapper.java
@@ -18,7 +18,6 @@
 
 import static com.android.systemui.statusbar.notification.TransformState.TRANSFORM_Y;
 
-import android.annotation.NonNull;
 import android.app.AppOpsManager;
 import android.app.Notification;
 import android.content.Context;
@@ -133,15 +132,6 @@
         if (mAppOps != null) {
             mAppOps.setOnClickListener(listener);
         }
-        if (mCameraIcon != null) {
-            mCameraIcon.setOnClickListener(listener);
-        }
-        if (mMicIcon != null) {
-            mMicIcon.setOnClickListener(listener);
-        }
-        if (mOverlayIcon != null) {
-            mOverlayIcon.setOnClickListener(listener);
-        }
     }
 
     /**
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationMediaTemplateViewWrapper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationMediaTemplateViewWrapper.java
index 874d81d..b96cff8 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationMediaTemplateViewWrapper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationMediaTemplateViewWrapper.java
@@ -22,6 +22,7 @@
 import android.app.Notification;
 import android.content.Context;
 import android.content.res.ColorStateList;
+import android.graphics.drawable.Drawable;
 import android.media.MediaMetadata;
 import android.media.session.MediaController;
 import android.media.session.MediaSession;
@@ -187,21 +188,26 @@
                     com.android.systemui.R.id.quick_qs_panel);
             StatusBarNotification sbn = mRow.getEntry().getSbn();
             Notification notif = sbn.getNotification();
+            Drawable iconDrawable = notif.getSmallIcon().loadDrawable(mContext);
             panel.getMediaPlayer().setMediaSession(token,
-                    notif.getSmallIcon(),
+                    iconDrawable,
+                    notif.getLargeIcon(),
                     tintColor,
                     mBackgroundColor,
                     mActions,
                     compactActions,
-                    notif.contentIntent);
+                    notif.contentIntent,
+                    sbn.getKey());
             QSPanel bigPanel = ctrl.getNotificationShadeView().findViewById(
                     com.android.systemui.R.id.quick_settings_panel);
             bigPanel.addMediaSession(token,
-                    notif.getSmallIcon(),
+                    iconDrawable,
+                    notif.getLargeIcon(),
                     tintColor,
                     mBackgroundColor,
                     mActions,
-                    sbn);
+                    sbn,
+                    sbn.getKey());
         }
 
         boolean showCompactSeekbar = mMediaManager.getShowCompactMediaSeekbar();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java
index 400e794..351a3ef 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java
@@ -65,7 +65,7 @@
     }.setDuration(200);
 
     private final List<View> mDividers = new ArrayList<>();
-    private final List<ExpandableNotificationRow> mChildren = new ArrayList<>();
+    private final List<ExpandableNotificationRow> mAttachedChildren = new ArrayList<>();
     private final HybridGroupManager mHybridGroupManager;
     private int mChildPadding;
     private int mDividerHeight;
@@ -105,6 +105,7 @@
     private int mTranslationForHeader;
     private int mCurrentHeaderTranslation = 0;
     private float mHeaderVisibleAmount = 1.0f;
+    private int mUntruncatedChildCount;
 
     public NotificationChildrenContainer(Context context) {
         this(context, null);
@@ -153,9 +154,10 @@
 
     @Override
     protected void onLayout(boolean changed, int l, int t, int r, int b) {
-        int childCount = Math.min(mChildren.size(), NUMBER_OF_CHILDREN_WHEN_CHILDREN_EXPANDED);
+        int childCount =
+                Math.min(mAttachedChildren.size(), NUMBER_OF_CHILDREN_WHEN_CHILDREN_EXPANDED);
         for (int i = 0; i < childCount; i++) {
-            View child = mChildren.get(i);
+            View child = mAttachedChildren.get(i);
             // We need to layout all children even the GONE ones, such that the heights are
             // calculated correctly as they are used to calculate how many we can fit on the screen
             child.layout(0, 0, child.getMeasuredWidth(), child.getMeasuredHeight());
@@ -195,11 +197,12 @@
         }
         int dividerHeightSpec = MeasureSpec.makeMeasureSpec(mDividerHeight, MeasureSpec.EXACTLY);
         int height = mNotificationHeaderMargin + mNotificatonTopPadding;
-        int childCount = Math.min(mChildren.size(), NUMBER_OF_CHILDREN_WHEN_CHILDREN_EXPANDED);
+        int childCount =
+                Math.min(mAttachedChildren.size(), NUMBER_OF_CHILDREN_WHEN_CHILDREN_EXPANDED);
         int collapsedChildren = getMaxAllowedVisibleChildren(true /* likeCollapsed */);
         int overflowIndex = childCount > collapsedChildren ? collapsedChildren - 1 : -1;
         for (int i = 0; i < childCount; i++) {
-            ExpandableNotificationRow child = mChildren.get(i);
+            ExpandableNotificationRow child = mAttachedChildren.get(i);
             // We need to measure all children even the GONE ones, such that the heights are
             // calculated correctly as they are used to calculate how many we can fit on the screen.
             boolean isOverflow = i == overflowIndex;
@@ -242,14 +245,24 @@
     }
 
     /**
+     * Set the untruncated number of children in the group so that the view can update the UI
+     * appropriately. Note that this may differ from the number of views attached as truncated
+     * children will not have views.
+     */
+    public void setUntruncatedChildCount(int childCount) {
+        mUntruncatedChildCount = childCount;
+        updateGroupOverflow();
+    }
+
+    /**
      * Add a child notification to this view.
      *
      * @param row the row to add
      * @param childIndex the index to add it at, if -1 it will be added at the end
      */
     public void addNotification(ExpandableNotificationRow row, int childIndex) {
-        int newIndex = childIndex < 0 ? mChildren.size() : childIndex;
-        mChildren.add(newIndex, row);
+        int newIndex = childIndex < 0 ? mAttachedChildren.size() : childIndex;
+        mAttachedChildren.add(newIndex, row);
         addView(row);
         row.setUserLocked(mUserLocked);
 
@@ -257,7 +270,6 @@
         addView(divider);
         mDividers.add(newIndex, divider);
 
-        updateGroupOverflow();
         row.setContentTransformationAmount(0, false /* isLastChild */);
         // It doesn't make sense to keep old animations around, lets cancel them!
         ExpandableViewState viewState = row.getViewState();
@@ -268,8 +280,8 @@
     }
 
     public void removeNotification(ExpandableNotificationRow row) {
-        int childIndex = mChildren.indexOf(row);
-        mChildren.remove(row);
+        int childIndex = mAttachedChildren.indexOf(row);
+        mAttachedChildren.remove(row);
         removeView(row);
 
         final View divider = mDividers.remove(childIndex);
@@ -284,7 +296,6 @@
 
         row.setSystemChildExpanded(false);
         row.setUserLocked(false);
-        updateGroupOverflow();
         if (!row.isRemoved()) {
             mHeaderUtil.restoreNotificationHeader(row);
         }
@@ -294,7 +305,7 @@
      * @return The number of notification children in the container.
      */
     public int getNotificationChildCount() {
-        return mChildren.size();
+        return mAttachedChildren.size();
     }
 
     public void recreateNotificationHeader(OnClickListener listener) {
@@ -364,10 +375,9 @@
     }
 
     public void updateGroupOverflow() {
-        int childCount = mChildren.size();
         int maxAllowedVisibleChildren = getMaxAllowedVisibleChildren(true /* likeCollapsed */);
-        if (childCount > maxAllowedVisibleChildren) {
-            int number = childCount - maxAllowedVisibleChildren;
+        if (mUntruncatedChildCount > maxAllowedVisibleChildren) {
+            int number = mUntruncatedChildCount - maxAllowedVisibleChildren;
             mOverflowNumber = mHybridGroupManager.bindOverflowNumber(mOverflowNumber, number);
             if (mGroupOverFlowState == null) {
                 mGroupOverFlowState = new ViewState();
@@ -401,8 +411,11 @@
                 R.layout.notification_children_divider, this, false);
     }
 
-    public List<ExpandableNotificationRow> getNotificationChildren() {
-        return mChildren;
+    /**
+     * Get notification children that are attached currently.
+     */
+    public List<ExpandableNotificationRow> getAttachedChildren() {
+        return mAttachedChildren;
     }
 
     /**
@@ -420,13 +433,13 @@
             return false;
         }
         boolean result = false;
-        for (int i = 0; i < mChildren.size() && i < childOrder.size(); i++) {
-            ExpandableNotificationRow child = mChildren.get(i);
+        for (int i = 0; i < mAttachedChildren.size() && i < childOrder.size(); i++) {
+            ExpandableNotificationRow child = mAttachedChildren.get(i);
             ExpandableNotificationRow desiredChild = (ExpandableNotificationRow) childOrder.get(i);
             if (child != desiredChild) {
                 if (visualStabilityManager.canReorderNotification(desiredChild)) {
-                    mChildren.remove(desiredChild);
-                    mChildren.add(i, desiredChild);
+                    mAttachedChildren.remove(desiredChild);
+                    mAttachedChildren.add(i, desiredChild);
                     result = true;
                 } else {
                     visualStabilityManager.addReorderingAllowedCallback(callback);
@@ -442,9 +455,9 @@
             // we don't modify it the group is expanded or if we are expanding it
             return;
         }
-        int size = mChildren.size();
+        int size = mAttachedChildren.size();
         for (int i = 0; i < size; i++) {
-            ExpandableNotificationRow child = mChildren.get(i);
+            ExpandableNotificationRow child = mAttachedChildren.get(i);
             child.setSystemChildExpanded(i == 0 && size == 1);
         }
     }
@@ -468,7 +481,7 @@
         }
         int intrinsicHeight = mNotificationHeaderMargin + mCurrentHeaderTranslation;
         int visibleChildren = 0;
-        int childCount = mChildren.size();
+        int childCount = mAttachedChildren.size();
         boolean firstChild = true;
         float expandFactor = 0;
         if (mUserLocked) {
@@ -499,7 +512,7 @@
                 }
                 firstChild = false;
             }
-            ExpandableNotificationRow child = mChildren.get(i);
+            ExpandableNotificationRow child = mAttachedChildren.get(i);
             intrinsicHeight += child.getIntrinsicHeight();
             visibleChildren++;
         }
@@ -518,7 +531,7 @@
      * @param ambientState the ambient state containing ambient information
      */
     public void updateState(ExpandableViewState parentState, AmbientState ambientState) {
-        int childCount = mChildren.size();
+        int childCount = mAttachedChildren.size();
         int yPosition = mNotificationHeaderMargin + mCurrentHeaderTranslation;
         boolean firstChild = true;
         int maxAllowedVisibleChildren = getMaxAllowedVisibleChildren();
@@ -535,7 +548,7 @@
                 && !mContainingNotification.isGroupExpansionChanging();
         int launchTransitionCompensation = 0;
         for (int i = 0; i < childCount; i++) {
-            ExpandableNotificationRow child = mChildren.get(i);
+            ExpandableNotificationRow child = mAttachedChildren.get(i);
             if (!firstChild) {
                 if (expandingToExpandedGroup) {
                     yPosition += NotificationUtils.interpolate(mChildPadding, mDividerHeight,
@@ -586,7 +599,7 @@
 
         }
         if (mOverflowNumber != null) {
-            ExpandableNotificationRow overflowView = mChildren.get(Math.min(
+            ExpandableNotificationRow overflowView = mAttachedChildren.get(Math.min(
                     getMaxAllowedVisibleChildren(true /* likeCollapsed */), childCount) - 1);
             mGroupOverFlowState.copyFrom(overflowView.getViewState());
 
@@ -672,7 +685,7 @@
 
     /** Applies state to children. */
     public void applyState() {
-        int childCount = mChildren.size();
+        int childCount = mAttachedChildren.size();
         ViewState tmpState = new ViewState();
         float expandFraction = 0.0f;
         if (mUserLocked) {
@@ -683,7 +696,7 @@
                 || (mContainingNotification.isGroupExpansionChanging()
                 && !mHideDividersDuringExpand);
         for (int i = 0; i < childCount; i++) {
-            ExpandableNotificationRow child = mChildren.get(i);
+            ExpandableNotificationRow child = mAttachedChildren.get(i);
             ExpandableViewState viewState = child.getViewState();
             viewState.applyToView(child);
 
@@ -716,10 +729,10 @@
         if (mContainingNotification.hasExpandingChild()) {
             return;
         }
-        int childCount = mChildren.size();
+        int childCount = mAttachedChildren.size();
         int layoutEnd = mContainingNotification.getActualHeight() - mClipBottomAmount;
         for (int i = 0; i < childCount; i++) {
-            ExpandableNotificationRow child = mChildren.get(i);
+            ExpandableNotificationRow child = mAttachedChildren.get(i);
             if (child.getVisibility() == GONE) {
                 continue;
             }
@@ -754,7 +767,7 @@
 
     /** Animate to a given state. */
     public void startAnimationToState(AnimationProperties properties) {
-        int childCount = mChildren.size();
+        int childCount = mAttachedChildren.size();
         ViewState tmpState = new ViewState();
         float expandFraction = getGroupExpandFraction();
         final boolean dividersVisible = mUserLocked && !showingAsLowPriority()
@@ -762,7 +775,7 @@
                 || (mContainingNotification.isGroupExpansionChanging()
                 && !mHideDividersDuringExpand);
         for (int i = childCount - 1; i >= 0; i--) {
-            ExpandableNotificationRow child = mChildren.get(i);
+            ExpandableNotificationRow child = mAttachedChildren.get(i);
             ExpandableViewState viewState = child.getViewState();
             viewState.animateTo(child, properties);
 
@@ -799,9 +812,9 @@
 
     public ExpandableNotificationRow getViewAtPosition(float y) {
         // find the view under the pointer, accounting for GONE views
-        final int count = mChildren.size();
+        final int count = mAttachedChildren.size();
         for (int childIdx = 0; childIdx < count; childIdx++) {
-            ExpandableNotificationRow slidingChild = mChildren.get(childIdx);
+            ExpandableNotificationRow slidingChild = mAttachedChildren.get(childIdx);
             float childTop = slidingChild.getTranslationY();
             float top = childTop + slidingChild.getClipTopAmount();
             float bottom = childTop + slidingChild.getActualHeight();
@@ -818,9 +831,9 @@
         if (mNotificationHeader != null) {
             mNotificationHeader.setExpanded(childrenExpanded);
         }
-        final int count = mChildren.size();
+        final int count = mAttachedChildren.size();
         for (int childIdx = 0; childIdx < count; childIdx++) {
-            ExpandableNotificationRow child = mChildren.get(childIdx);
+            ExpandableNotificationRow child = mAttachedChildren.get(childIdx);
             child.setChildrenExpanded(childrenExpanded, false);
         }
         updateHeaderTouchability();
@@ -919,12 +932,12 @@
     private void startChildAlphaAnimations(boolean toVisible) {
         float target = toVisible ? 1.0f : 0.0f;
         float start = 1.0f - target;
-        int childCount = mChildren.size();
+        int childCount = mAttachedChildren.size();
         for (int i = 0; i < childCount; i++) {
             if (i >= NUMBER_OF_CHILDREN_WHEN_SYSTEM_EXPANDED) {
                 break;
             }
-            ExpandableNotificationRow child = mChildren.get(i);
+            ExpandableNotificationRow child = mAttachedChildren.get(i);
             child.setAlpha(start);
             ViewState viewState = new ViewState();
             viewState.initFrom(child);
@@ -979,12 +992,12 @@
         int maxContentHeight = mNotificationHeaderMargin + mCurrentHeaderTranslation
                 + mNotificatonTopPadding;
         int visibleChildren = 0;
-        int childCount = mChildren.size();
+        int childCount = mAttachedChildren.size();
         for (int i = 0; i < childCount; i++) {
             if (visibleChildren >= NUMBER_OF_CHILDREN_WHEN_CHILDREN_EXPANDED) {
                 break;
             }
-            ExpandableNotificationRow child = mChildren.get(i);
+            ExpandableNotificationRow child = mAttachedChildren.get(i);
             float childHeight = child.isExpanded(true /* allowOnKeyguard */)
                     ? child.getMaxExpandHeight()
                     : child.getShowingLayout().getMinHeight(true /* likeGroupExpanded */);
@@ -1006,9 +1019,9 @@
         boolean showingLowPriority = showingAsLowPriority();
         updateHeaderTransformation();
         int maxAllowedVisibleChildren = getMaxAllowedVisibleChildren(true /* forceCollapsed */);
-        int childCount = mChildren.size();
+        int childCount = mAttachedChildren.size();
         for (int i = 0; i < childCount; i++) {
-            ExpandableNotificationRow child = mChildren.get(i);
+            ExpandableNotificationRow child = mAttachedChildren.get(i);
             float childHeight;
             if (showingLowPriority) {
                 childHeight = child.getShowingLayout().getMinHeight(false /* likeGroupExpanded */);
@@ -1042,13 +1055,13 @@
         int intrinsicHeight = mNotificationHeaderMargin + mCurrentHeaderTranslation
                 + mNotificatonTopPadding + mDividerHeight;
         int visibleChildren = 0;
-        int childCount = mChildren.size();
+        int childCount = mAttachedChildren.size();
         int maxAllowedVisibleChildren = getMaxAllowedVisibleChildren(true /* forceCollapsed */);
         for (int i = 0; i < childCount; i++) {
             if (visibleChildren >= maxAllowedVisibleChildren) {
                 break;
             }
-            ExpandableNotificationRow child = mChildren.get(i);
+            ExpandableNotificationRow child = mAttachedChildren.get(i);
             float childHeight = child.isExpanded(true /* allowOnKeyguard */)
                     ? child.getMaxExpandHeight()
                     : child.getShowingLayout().getMinHeight(true /* likeGroupExpanded */);
@@ -1097,7 +1110,7 @@
         int minExpandHeight = mNotificationHeaderMargin + headerTranslation;
         int visibleChildren = 0;
         boolean firstChild = true;
-        int childCount = mChildren.size();
+        int childCount = mAttachedChildren.size();
         for (int i = 0; i < childCount; i++) {
             if (visibleChildren >= maxAllowedVisibleChildren) {
                 break;
@@ -1107,7 +1120,7 @@
             } else {
                 firstChild = false;
             }
-            ExpandableNotificationRow child = mChildren.get(i);
+            ExpandableNotificationRow child = mAttachedChildren.get(i);
             minExpandHeight += child.getSingleLineView().getHeight();
             visibleChildren++;
         }
@@ -1149,9 +1162,9 @@
         if (!mUserLocked) {
             updateHeaderVisibility(false /* animate */);
         }
-        int childCount = mChildren.size();
+        int childCount = mAttachedChildren.size();
         for (int i = 0; i < childCount; i++) {
-            ExpandableNotificationRow child = mChildren.get(i);
+            ExpandableNotificationRow child = mAttachedChildren.get(i);
             child.setUserLocked(userLocked && !showingAsLowPriority());
         }
         updateHeaderTouchability();
@@ -1172,8 +1185,8 @@
         int position = mNotificationHeaderMargin + mCurrentHeaderTranslation
                 + mNotificatonTopPadding;
 
-        for (int i = 0; i < mChildren.size(); i++) {
-            ExpandableNotificationRow child = mChildren.get(i);
+        for (int i = 0; i < mAttachedChildren.size(); i++) {
+            ExpandableNotificationRow child = mAttachedChildren.get(i);
             boolean notGone = child.getVisibility() != View.GONE;
             if (notGone) {
                 position += mDividerHeight;
@@ -1251,8 +1264,8 @@
 
     public void setCurrentBottomRoundness(float currentBottomRoundness) {
         boolean last = true;
-        for (int i = mChildren.size() - 1; i >= 0; i--) {
-            ExpandableNotificationRow child = mChildren.get(i);
+        for (int i = mAttachedChildren.size() - 1; i >= 0; i--) {
+            ExpandableNotificationRow child = mAttachedChildren.get(i);
             if (child.getVisibility() == View.GONE) {
                 continue;
             }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationListItem.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationListItem.java
index 8991abe..c2dd229 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationListItem.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationListItem.java
@@ -43,7 +43,7 @@
 
     // This generic is kind of ugly - we should change this once the old VHM is gone
     /** @return list of the children of this item */
-    List<? extends NotificationListItem> getNotificationChildren();
+    List<? extends NotificationListItem> getAttachedChildren();
 
     /** remove all children from this list item */
     void removeAllChildren();
@@ -54,6 +54,9 @@
     /** add an item as a child */
     void addChildNotification(NotificationListItem child, int childIndex);
 
+    /** set the child count view should display */
+    void setUntruncatedChildCount(int count);
+
     /** Update the order of the children with the new list */
     boolean applyChildOrder(
             List<? extends NotificationListItem> childOrderList,
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 6054b50..9e19c70 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
@@ -628,8 +628,11 @@
                 mHighPriorityBeforeSpeedBump = "1".equals(newValue);
             } else if (key.equals(Settings.Secure.NOTIFICATION_DISMISS_RTL)) {
                 updateDismissRtlSetting("1".equals(newValue));
+            } else if (key.equals(Settings.Secure.NOTIFICATION_HISTORY_ENABLED)) {
+                updateFooter();
             }
-        }, HIGH_PRIORITY, Settings.Secure.NOTIFICATION_DISMISS_RTL);
+        }, HIGH_PRIORITY, Settings.Secure.NOTIFICATION_DISMISS_RTL,
+                Settings.Secure.NOTIFICATION_HISTORY_ENABLED);
 
         mFeatureFlags = featureFlags;
         mNotifPipeline = notifPipeline;
@@ -742,12 +745,17 @@
     @VisibleForTesting
     @ShadeViewRefactor(RefactorComponent.SHADE_VIEW)
     public void updateFooter() {
+        if (mFooterView == null) {
+            return;
+        }
         boolean showDismissView = mClearAllEnabled && hasActiveClearableNotifications(ROWS_ALL);
         boolean showFooterView = (showDismissView || hasActiveNotifications())
                 && mStatusBarState != StatusBarState.KEYGUARD
                 && !mRemoteInputManager.getController().isRemoteInputActive();
+        boolean showHistory = Settings.Secure.getInt(mContext.getContentResolver(),
+                Settings.Secure.NOTIFICATION_HISTORY_ENABLED, 0) == 1;
 
-        updateFooterView(showFooterView, showDismissView);
+        updateFooterView(showFooterView, showDismissView, showHistory);
     }
 
     /**
@@ -2377,7 +2385,7 @@
                 ExpandableNotificationRow row = (ExpandableNotificationRow) child;
                 if (row.isSummaryWithChildren() && row.areChildrenExpanded()) {
                     List<ExpandableNotificationRow> notificationChildren =
-                            row.getNotificationChildren();
+                            row.getAttachedChildren();
                     for (int childIndex = 0; childIndex < notificationChildren.size();
                             childIndex++) {
                         ExpandableNotificationRow rowChild = notificationChildren.get(childIndex);
@@ -4638,7 +4646,7 @@
                 ExpandableNotificationRow row = (ExpandableNotificationRow) view;
                 row.setHeadsUpAnimatingAway(false);
                 if (row.isSummaryWithChildren()) {
-                    for (ExpandableNotificationRow child : row.getNotificationChildren()) {
+                    for (ExpandableNotificationRow child : row.getAttachedChildren()) {
                         child.setHeadsUpAnimatingAway(false);
                     }
                 }
@@ -4979,13 +4987,14 @@
     }
 
     @ShadeViewRefactor(RefactorComponent.SHADE_VIEW)
-    public void updateFooterView(boolean visible, boolean showDismissView) {
+    public void updateFooterView(boolean visible, boolean showDismissView, boolean showHistory) {
         if (mFooterView == null) {
             return;
         }
         boolean animate = mIsExpanded && mAnimationsEnabled;
         mFooterView.setVisible(visible, animate);
         mFooterView.setSecondaryVisible(showDismissView, animate);
+        mFooterView.showHistory(showHistory);
     }
 
     @ShadeViewRefactor(RefactorComponent.SHADE_VIEW)
@@ -5566,12 +5575,6 @@
     }
 
     @ShadeViewRefactor(RefactorComponent.SHADE_VIEW)
-    public void manageNotifications(View v) {
-        Intent intent = new Intent(Settings.ACTION_NOTIFICATION_HISTORY);
-        mStatusBar.startActivity(intent, true, true, Intent.FLAG_ACTIVITY_SINGLE_TOP);
-    }
-
-    @ShadeViewRefactor(RefactorComponent.SHADE_VIEW)
     @VisibleForTesting
     void clearNotifications(
             @SelectedRows int selection,
@@ -5598,7 +5601,7 @@
                         && (!hasClipBounds || mTmpRect.height() > 0)) {
                     parentVisible = true;
                 }
-                List<ExpandableNotificationRow> children = row.getNotificationChildren();
+                List<ExpandableNotificationRow> children = row.getAttachedChildren();
                 if (children != null) {
                     for (ExpandableNotificationRow childRow : children) {
                         if (includeChildInDismissAll(row, selection)) {
@@ -5705,7 +5708,12 @@
             mMetricsLogger.action(MetricsEvent.ACTION_DISMISS_ALL_NOTES);
             clearNotifications(ROWS_ALL, true /* closeShade */);
         });
-        footerView.setManageButtonClickListener(this::manageNotifications);
+        footerView.setManageButtonClickListener(v -> {
+            Intent intent = footerView.isHistoryShown() ? new Intent(
+                    Settings.ACTION_NOTIFICATION_HISTORY) : new Intent(
+                    Settings.ACTION_NOTIFICATION_SETTINGS);
+            mStatusBar.startActivity(intent, true, true, Intent.FLAG_ACTIVITY_SINGLE_TOP);
+        });
         setFooterView(footerView);
     }
 
@@ -5714,6 +5722,14 @@
         EmptyShadeView view = (EmptyShadeView) LayoutInflater.from(mContext).inflate(
                 R.layout.status_bar_no_notifications, this, false);
         view.setText(R.string.empty_shade_text);
+        view.setOnClickListener(v -> {
+            final boolean showHistory = Settings.Secure.getInt(mContext.getContentResolver(),
+                    Settings.Secure.NOTIFICATION_HISTORY_ENABLED, 0) == 1;
+            Intent intent = showHistory ? new Intent(
+                    Settings.ACTION_NOTIFICATION_HISTORY) : new Intent(
+                    Settings.ACTION_NOTIFICATION_SETTINGS);
+            mStatusBar.startActivity(intent, true, true, Intent.FLAG_ACTIVITY_SINGLE_TOP);
+        });
         setEmptyShadeView(view);
     }
 
@@ -6388,7 +6404,7 @@
                 if (parent != null && parent.areChildrenExpanded()
                         && (parent.areGutsExposed()
                         || mSwipeHelper.getExposedMenuView() == parent
-                        || (parent.getNotificationChildren().size() == 1
+                        || (parent.getAttachedChildren().size() == 1
                         && parent.getEntry().isClearable()))) {
                     // In this case the group is expanded and showing the menu for the
                     // group, further interaction should apply to the group, not any
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 9646c01..1a15377 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
@@ -297,7 +297,7 @@
                     ExpandableNotificationRow row = (ExpandableNotificationRow) v;
 
                     // handle the notgoneIndex for the children as well
-                    List<ExpandableNotificationRow> children = row.getNotificationChildren();
+                    List<ExpandableNotificationRow> children = row.getAttachedChildren();
                     if (row.isSummaryWithChildren() && children != null) {
                         for (ExpandableNotificationRow childRow : children) {
                             if (childRow.getVisibility() != View.GONE) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java
index f103bd0..f9119c7 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java
@@ -53,11 +53,13 @@
 import com.android.internal.policy.GestureNavigationSettingsObserver;
 import com.android.systemui.Dependency;
 import com.android.systemui.R;
+import com.android.systemui.broadcast.BroadcastDispatcher;
 import com.android.systemui.bubbles.BubbleController;
 import com.android.systemui.model.SysUiState;
 import com.android.systemui.plugins.NavigationEdgeBackPlugin;
 import com.android.systemui.plugins.PluginListener;
 import com.android.systemui.recents.OverviewProxyService;
+import com.android.systemui.settings.CurrentUserTracker;
 import com.android.systemui.shared.plugins.PluginManager;
 import com.android.systemui.shared.system.ActivityManagerWrapper;
 import com.android.systemui.shared.system.QuickStepContract;
@@ -74,7 +76,7 @@
 /**
  * Utility class to handle edge swipes for back gesture
  */
-public class EdgeBackGestureHandler implements DisplayListener,
+public class EdgeBackGestureHandler extends CurrentUserTracker implements DisplayListener,
         PluginListener<NavigationEdgeBackPlugin>, ProtoTraceable<SystemUiTraceProto> {
 
     private static final String TAG = "EdgeBackGestureHandler";
@@ -165,6 +167,7 @@
     private boolean mIsGesturalModeEnabled;
     private boolean mIsEnabled;
     private boolean mIsNavBarShownTransiently;
+    private boolean mIsBackGestureAllowed;
 
     private InputMonitor mInputMonitor;
     private InputEventReceiver mInputEventReceiver;
@@ -200,7 +203,7 @@
 
     public EdgeBackGestureHandler(Context context, OverviewProxyService overviewProxyService,
             SysUiState sysUiFlagContainer, PluginManager pluginManager) {
-        final Resources res = context.getResources();
+        super(Dependency.get(BroadcastDispatcher.class));
         mContext = context;
         mDisplayId = context.getDisplayId();
         mMainExecutor = context.getMainExecutor();
@@ -216,20 +219,30 @@
                 ViewConfiguration.getLongPressTimeout());
 
         mGestureNavigationSettingsObserver = new GestureNavigationSettingsObserver(
-                mContext.getMainThreadHandler(), mContext, () -> updateCurrentUserResources(res));
+                mContext.getMainThreadHandler(), mContext, this::updateCurrentUserResources);
 
-        updateCurrentUserResources(res);
+        updateCurrentUserResources();
         sysUiFlagContainer.addCallback(sysUiFlags -> mSysUiFlags = sysUiFlags);
     }
 
-    public void updateCurrentUserResources(Resources res) {
+    public void updateCurrentUserResources() {
+        Resources res = Dependency.get(NavigationModeController.class).getCurrentUserContext()
+                .getResources();
         mEdgeWidthLeft = mGestureNavigationSettingsObserver.getLeftSensitivity(res);
         mEdgeWidthRight = mGestureNavigationSettingsObserver.getRightSensitivity(res);
+        mIsBackGestureAllowed =
+                !mGestureNavigationSettingsObserver.areNavigationButtonForcedVisible();
 
         mBottomGestureHeight = res.getDimensionPixelSize(
                 com.android.internal.R.dimen.navigation_bar_gesture_height);
     }
 
+    @Override
+    public void onUserSwitched(int newUserId) {
+        updateIsEnabled();
+        updateCurrentUserResources();
+    }
+
     /**
      * @see NavigationBarView#onAttachedToWindow()
      */
@@ -243,6 +256,7 @@
                 Settings.Global.getUriFor(FIXED_ROTATION_TRANSFORM_SETTING_NAME),
                 false /* notifyForDescendants */, mFixedRotationObserver, UserHandle.USER_ALL);
         updateIsEnabled();
+        startTracking();
     }
 
     /**
@@ -255,6 +269,7 @@
         }
         mContext.getContentResolver().unregisterContentObserver(mFixedRotationObserver);
         updateIsEnabled();
+        stopTracking();
     }
 
     private void setRotationCallbacks(boolean enable) {
@@ -269,10 +284,13 @@
         }
     }
 
-    public void onNavigationModeChanged(int mode, Context currentUserContext) {
+    /**
+     * @see NavigationModeController.ModeChangedListener#onNavigationModeChanged
+     */
+    public void onNavigationModeChanged(int mode) {
         mIsGesturalModeEnabled = QuickStepContract.isGesturalMode(mode);
         updateIsEnabled();
-        updateCurrentUserResources(currentUserContext.getResources());
+        updateCurrentUserResources();
     }
 
     public void onNavBarTransientStateChanged(boolean isTransient) {
@@ -312,7 +330,7 @@
                 WindowManagerGlobal.getWindowManagerService()
                         .unregisterSystemGestureExclusionListener(
                                 mGestureExclusionListener, mDisplayId);
-            } catch (RemoteException e) {
+            } catch (RemoteException | IllegalArgumentException e) {
                 Log.e(TAG, "Failed to unregister window manager callbacks", e);
             }
 
@@ -326,7 +344,7 @@
                 WindowManagerGlobal.getWindowManagerService()
                         .registerSystemGestureExclusionListener(
                                 mGestureExclusionListener, mDisplayId);
-            } catch (RemoteException e) {
+            } catch (RemoteException | IllegalArgumentException e) {
                 Log.e(TAG, "Failed to register window manager callbacks", e);
             }
 
@@ -363,6 +381,10 @@
         updateDisplaySize();
     }
 
+    public boolean isHandlingGestures() {
+        return mIsEnabled && mIsBackGestureAllowed;
+    }
+
     private WindowManager.LayoutParams createLayoutParams() {
         Resources resources = mContext.getResources();
         WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(
@@ -469,9 +491,9 @@
             mIsOnLeftEdge = ev.getX() <= mEdgeWidthLeft + mLeftInset;
             mLogGesture = false;
             mInRejectedExclusion = false;
-            mAllowGesture = !QuickStepContract.isBackGestureDisabled(mSysUiFlags)
-                    && isWithinTouchRegion((int) ev.getX(), (int) ev.getY())
-                    && !mDisabledForQuickstep;
+            mAllowGesture = !mDisabledForQuickstep && mIsBackGestureAllowed
+                    && !QuickStepContract.isBackGestureDisabled(mSysUiFlags)
+                    && isWithinTouchRegion((int) ev.getX(), (int) ev.getY());
             if (mAllowGesture) {
                 mEdgeBackPlugin.setIsLeftPanel(mIsOnLeftEdge);
                 mEdgeBackPlugin.onMotionEvent(ev);
@@ -599,6 +621,7 @@
     public void dump(PrintWriter pw) {
         pw.println("EdgeBackGestureHandler:");
         pw.println("  mIsEnabled=" + mIsEnabled);
+        pw.println("  mIsBackGestureAllowed=" + mIsBackGestureAllowed);
         pw.println("  mAllowGesture=" + mAllowGesture);
         pw.println("  mDisabledForQuickstep=" + mDisabledForQuickstep);
         pw.println("  mInRejectedExclusion" + mInRejectedExclusion);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
index 90bc075b..ae7867d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
@@ -85,6 +85,8 @@
 import com.android.systemui.tuner.LockscreenFragment.LockButtonFactory;
 import com.android.systemui.tuner.TunerService;
 
+import java.util.concurrent.Executor;
+
 /**
  * Implementation for the bottom area of the Keyguard, including camera/phone affordance and status
  * text.
@@ -553,7 +555,7 @@
             }
         };
         if (!mKeyguardStateController.canDismissLockScreen()) {
-            AsyncTask.execute(runnable);
+            Dependency.get(Executor.class).execute(runnable);
         } else {
             boolean dismissShade = !TextUtils.isEmpty(mRightButtonStr)
                     && Dependency.get(TunerService.class).getValue(LOCKSCREEN_RIGHT_UNLOCK, 1) != 0;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java
index 82e02b4..39949c8 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java
@@ -400,6 +400,9 @@
             mExpansionCallback.onFullyHidden();
         } else if (fraction != EXPANSION_VISIBLE && oldExpansion == EXPANSION_VISIBLE) {
             mExpansionCallback.onStartingToHide();
+            if (mKeyguardView != null) {
+                mKeyguardView.onStartingToHide();
+            }
         }
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java
index d35e1e1..3e5eb5f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java
@@ -33,6 +33,7 @@
 import com.android.systemui.Dumpable;
 import com.android.systemui.R;
 import com.android.systemui.plugins.DarkIconDispatcher;
+import com.android.systemui.shared.system.QuickStepContract;
 import com.android.systemui.statusbar.policy.BatteryController;
 
 import java.io.FileDescriptor;
@@ -58,6 +59,7 @@
     private AppearanceRegion[] mAppearanceRegions = new AppearanceRegion[0];
     private int mStatusBarMode;
     private int mNavigationBarMode;
+    private int mNavigationMode;
     private final Color mDarkModeColor;
 
     /**
@@ -84,11 +86,14 @@
 
     @Inject
     public LightBarController(Context ctx, DarkIconDispatcher darkIconDispatcher,
-            BatteryController batteryController) {
+            BatteryController batteryController, NavigationModeController navModeController) {
         mDarkModeColor = Color.valueOf(ctx.getColor(R.color.dark_mode_icon_color_single_tone));
         mStatusBarIconController = (SysuiDarkIconDispatcher) darkIconDispatcher;
         mBatteryController = batteryController;
         mBatteryController.addCallback(this);
+        mNavigationMode = navModeController.addListener((mode) -> {
+            mNavigationMode = mode;
+        });
     }
 
     public void setNavigationBar(LightBarTransitionsController navigationBar) {
@@ -234,7 +239,8 @@
     }
 
     private void updateNavigation() {
-        if (mNavigationBarController != null) {
+        if (mNavigationBarController != null
+                && !QuickStepContract.isGesturalMode(mNavigationMode)) {
             mNavigationBarController.setIconsDark(mNavigationLight, animateChange());
         }
     }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
index 84aecd4..2978772 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
@@ -123,7 +123,7 @@
     private KeyButtonDrawable mRecentIcon;
     private KeyButtonDrawable mDockedIcon;
 
-    private final EdgeBackGestureHandler mEdgeBackGestureHandler;
+    private EdgeBackGestureHandler mEdgeBackGestureHandler;
     private final DeadZone mDeadZone;
     private boolean mDeadZoneConsuming = false;
     private final NavigationBarTransitions mBarTransitions;
@@ -244,7 +244,7 @@
     private final OnComputeInternalInsetsListener mOnComputeInternalInsetsListener = info -> {
         // When the nav bar is in 2-button or 3-button mode, or when IME is visible in fully
         // gestural mode, the entire nav bar should be touchable.
-        if (!isGesturalMode(mNavBarMode) || mImeVisible) {
+        if (!mEdgeBackGestureHandler.isHandlingGestures() || mImeVisible) {
             info.setTouchableInsets(InternalInsetsInfo.TOUCHABLE_INSETS_FRAME);
             return;
         }
@@ -296,8 +296,6 @@
                 R.style.RotateButtonCCWStart90,
                 isGesturalMode ? mFloatingRotationButton : rotateSuggestionButton);
 
-        final ContextualButton backButton = new ContextualButton(R.id.back, 0);
-
         mConfiguration = new Configuration();
         mTmpLastConfiguration = new Configuration();
         mConfiguration.updateFrom(context.getResources().getConfiguration());
@@ -305,7 +303,7 @@
         mScreenPinningNotify = new ScreenPinningNotify(mContext);
         mBarTransitions = new NavigationBarTransitions(this, Dependency.get(CommandQueue.class));
 
-        mButtonDispatchers.put(R.id.back, backButton);
+        mButtonDispatchers.put(R.id.back, new ButtonDispatcher(R.id.back));
         mButtonDispatchers.put(R.id.home, new ButtonDispatcher(R.id.home));
         mButtonDispatchers.put(R.id.home_handle, new ButtonDispatcher(R.id.home_handle));
         mButtonDispatchers.put(R.id.recent_apps, new ButtonDispatcher(R.id.recent_apps));
@@ -659,7 +657,7 @@
         boolean disableHomeHandle = disableRecent
                 && ((mDisabledFlags & View.STATUS_BAR_DISABLE_HOME) != 0);
 
-        boolean disableBack = !useAltBack && (isGesturalMode(mNavBarMode)
+        boolean disableBack = !useAltBack && (mEdgeBackGestureHandler.isHandlingGestures()
                 || ((mDisabledFlags & View.STATUS_BAR_DISABLE_BACK) != 0));
 
         // When screen pinning, don't hide back and home when connected service or back and
@@ -686,9 +684,9 @@
             }
         }
 
-        getBackButton().setVisibility(disableBack      ? View.INVISIBLE : View.VISIBLE);
-        getHomeButton().setVisibility(disableHome      ? View.INVISIBLE : View.VISIBLE);
-        getRecentsButton().setVisibility(disableRecent ? View.INVISIBLE : View.VISIBLE);
+        getBackButton().setVisibility(disableBack       ? View.INVISIBLE : View.VISIBLE);
+        getHomeButton().setVisibility(disableHome       ? View.INVISIBLE : View.VISIBLE);
+        getRecentsButton().setVisibility(disableRecent  ? View.INVISIBLE : View.VISIBLE);
         getHomeHandle().setVisibility(disableHomeHandle ? View.INVISIBLE : View.VISIBLE);
     }
 
@@ -838,10 +836,9 @@
 
     @Override
     public void onNavigationModeChanged(int mode) {
-        Context curUserCtx = Dependency.get(NavigationModeController.class).getCurrentUserContext();
         mNavBarMode = mode;
         mBarTransitions.onNavigationModeChanged(mNavBarMode);
-        mEdgeBackGestureHandler.onNavigationModeChanged(mNavBarMode, curUserCtx);
+        mEdgeBackGestureHandler.onNavigationModeChanged(mNavBarMode);
         mRecentsOnboarding.onNavigationModeChanged(mNavBarMode);
         getRotateSuggestionButton().onNavigationModeChanged(mNavBarMode);
 
@@ -864,6 +861,7 @@
 
     @Override
     public void onFinishInflate() {
+        super.onFinishInflate();
         mNavigationInflaterView = findViewById(R.id.navigation_inflater);
         mNavigationInflaterView.setButtonDispatchers(mButtonDispatchers);
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationModeController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationModeController.java
index d24ccf3..6061b1e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationModeController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationModeController.java
@@ -17,9 +17,6 @@
 package com.android.systemui.statusbar.phone;
 
 import static android.content.Intent.ACTION_OVERLAY_CHANGED;
-import static android.content.Intent.ACTION_PREFERRED_ACTIVITY_CHANGED;
-import static android.os.UserHandle.USER_CURRENT;
-import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON_OVERLAY;
 import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL;
 import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL_OVERLAY;
 
@@ -38,17 +35,14 @@
 import android.provider.Settings;
 import android.provider.Settings.Secure;
 import android.util.Log;
-import android.util.SparseBooleanArray;
 
 import com.android.systemui.Dumpable;
 import com.android.systemui.dagger.qualifiers.UiBackground;
 import com.android.systemui.shared.system.ActivityManagerWrapper;
-import com.android.systemui.statusbar.policy.DeviceProvisionedController;
 
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.concurrent.Executor;
 
 import javax.inject.Inject;
@@ -70,104 +64,34 @@
     private final Context mContext;
     private Context mCurrentUserContext;
     private final IOverlayManager mOverlayManager;
-    private final DeviceProvisionedController mDeviceProvisionedController;
     private final Executor mUiBgExecutor;
 
-    private SparseBooleanArray mRestoreGesturalNavBarMode = new SparseBooleanArray();
-
     private ArrayList<ModeChangedListener> mListeners = new ArrayList<>();
 
     private BroadcastReceiver mReceiver = new BroadcastReceiver() {
         @Override
         public void onReceive(Context context, Intent intent) {
-            switch (intent.getAction()) {
-                case ACTION_OVERLAY_CHANGED:
                     if (DEBUG) {
                         Log.d(TAG, "ACTION_OVERLAY_CHANGED");
                     }
                     updateCurrentInteractionMode(true /* notify */);
-                    break;
-            }
         }
     };
 
-    private final DeviceProvisionedController.DeviceProvisionedListener mDeviceProvisionedCallback =
-            new DeviceProvisionedController.DeviceProvisionedListener() {
-                @Override
-                public void onDeviceProvisionedChanged() {
-                    if (DEBUG) {
-                        Log.d(TAG, "onDeviceProvisionedChanged: "
-                                + mDeviceProvisionedController.isDeviceProvisioned());
-                    }
-                    // Once the device has been provisioned, check if we can restore gestural nav
-                    restoreGesturalNavOverlayIfNecessary();
-                }
-
-                @Override
-                public void onUserSetupChanged() {
-                    if (DEBUG) {
-                        Log.d(TAG, "onUserSetupChanged: "
-                                + mDeviceProvisionedController.isCurrentUserSetup());
-                    }
-                    // Once the user has been setup, check if we can restore gestural nav
-                    restoreGesturalNavOverlayIfNecessary();
-                }
-
-                @Override
-                public void onUserSwitched() {
-                    if (DEBUG) {
-                        Log.d(TAG, "onUserSwitched: "
-                                + ActivityManagerWrapper.getInstance().getCurrentUserId());
-                    }
-
-                    // Update the nav mode for the current user
-                    updateCurrentInteractionMode(true /* notify */);
-
-                    // When switching users, defer enabling the gestural nav overlay until the user
-                    // is all set up
-                    deferGesturalNavOverlayIfNecessary();
-                }
-            };
-
     @Inject
-    public NavigationModeController(Context context,
-            DeviceProvisionedController deviceProvisionedController,
-            @UiBackground Executor uiBgExecutor) {
+    public NavigationModeController(Context context, @UiBackground Executor uiBgExecutor) {
         mContext = context;
         mCurrentUserContext = context;
         mOverlayManager = IOverlayManager.Stub.asInterface(
                 ServiceManager.getService(Context.OVERLAY_SERVICE));
         mUiBgExecutor = uiBgExecutor;
-        mDeviceProvisionedController = deviceProvisionedController;
-        mDeviceProvisionedController.addCallback(mDeviceProvisionedCallback);
 
         IntentFilter overlayFilter = new IntentFilter(ACTION_OVERLAY_CHANGED);
         overlayFilter.addDataScheme("package");
         overlayFilter.addDataSchemeSpecificPart("android", PatternMatcher.PATTERN_LITERAL);
         mContext.registerReceiverAsUser(mReceiver, UserHandle.ALL, overlayFilter, null, null);
 
-        IntentFilter preferredActivityFilter = new IntentFilter(ACTION_PREFERRED_ACTIVITY_CHANGED);
-        mContext.registerReceiverAsUser(mReceiver, UserHandle.ALL, preferredActivityFilter, null,
-                null);
-
         updateCurrentInteractionMode(false /* notify */);
-
-        // Check if we need to defer enabling gestural nav
-        deferGesturalNavOverlayIfNecessary();
-    }
-
-    private boolean setGestureModeOverlayForMainLauncher() {
-        if (getCurrentInteractionMode(mCurrentUserContext) == NAV_BAR_MODE_GESTURAL) {
-            // Already in gesture mode
-            return true;
-        }
-
-        Log.d(TAG, "Switching system navigation to full-gesture mode:"
-                + " contextUser="
-                + mCurrentUserContext.getUserId());
-
-        setModeOverlay(NAV_BAR_MODE_GESTURAL_OVERLAY, USER_CURRENT);
-        return true;
     }
 
     public void updateCurrentInteractionMode(boolean notify) {
@@ -176,10 +100,9 @@
         if (mode == NAV_BAR_MODE_GESTURAL) {
             switchToDefaultGestureNavOverlayIfNecessary();
         }
-        mUiBgExecutor.execute(() -> {
+        mUiBgExecutor.execute(() ->
             Settings.Secure.putString(mCurrentUserContext.getContentResolver(),
-                    Secure.NAVIGATION_MODE, String.valueOf(mode));
-        });
+                    Secure.NAVIGATION_MODE, String.valueOf(mode)));
         if (DEBUG) {
             Log.e(TAG, "updateCurrentInteractionMode: mode=" + mode);
             dumpAssetPaths(mCurrentUserContext);
@@ -230,61 +153,11 @@
         }
     }
 
-    private void deferGesturalNavOverlayIfNecessary() {
-        final int userId = mDeviceProvisionedController.getCurrentUser();
-        mRestoreGesturalNavBarMode.put(userId, false);
-        if (mDeviceProvisionedController.isDeviceProvisioned()
-                && mDeviceProvisionedController.isCurrentUserSetup()) {
-            // User is already setup and device is provisioned, nothing to do
-            if (DEBUG) {
-                Log.d(TAG, "deferGesturalNavOverlayIfNecessary: device is provisioned and user is "
-                        + "setup");
-            }
-            return;
-        }
-
-        ArrayList<String> defaultOverlays = new ArrayList<>();
-        try {
-            defaultOverlays.addAll(Arrays.asList(mOverlayManager.getDefaultOverlayPackages()));
-        } catch (RemoteException e) {
-            Log.e(TAG, "deferGesturalNavOverlayIfNecessary: failed to fetch default overlays");
-        }
-        if (!defaultOverlays.contains(NAV_BAR_MODE_GESTURAL_OVERLAY)) {
-            // No default gesture nav overlay
-            if (DEBUG) {
-                Log.d(TAG, "deferGesturalNavOverlayIfNecessary: no default gestural overlay, "
-                        + "default=" + defaultOverlays);
-            }
-            return;
-        }
-
-        // If the default is gestural, force-enable three button mode until the device is
-        // provisioned
-        setModeOverlay(NAV_BAR_MODE_3BUTTON_OVERLAY, USER_CURRENT);
-        mRestoreGesturalNavBarMode.put(userId, true);
-
-        if (DEBUG) {
-            Log.d(TAG, "deferGesturalNavOverlayIfNecessary: setting to 3 button mode");
-        }
-    }
-
-    private void restoreGesturalNavOverlayIfNecessary() {
-        if (DEBUG) {
-            Log.d(TAG, "restoreGesturalNavOverlayIfNecessary: needs restore="
-                    + mRestoreGesturalNavBarMode);
-        }
-        final int userId = mDeviceProvisionedController.getCurrentUser();
-        if (mRestoreGesturalNavBarMode.get(userId)) {
-            // Restore the gestural state if necessary
-            setGestureModeOverlayForMainLauncher();
-            mRestoreGesturalNavBarMode.put(userId, false);
-        }
-    }
-
     private void switchToDefaultGestureNavOverlayIfNecessary() {
         final int userId = mCurrentUserContext.getUserId();
         try {
-            final IOverlayManager om = mOverlayManager;
+            final IOverlayManager om = IOverlayManager.Stub.asInterface(
+                    ServiceManager.getService(Context.OVERLAY_SERVICE));
             final OverlayInfo info = om.getOverlayInfo(NAV_BAR_MODE_GESTURAL_OVERLAY, userId);
             if (info != null && !info.isEnabled()) {
                 // Enable the default gesture nav overlay, and move the back gesture inset scale to
@@ -309,20 +182,6 @@
         }
     }
 
-    public void setModeOverlay(String overlayPkg, int userId) {
-        mUiBgExecutor.execute(() -> {
-            try {
-                mOverlayManager.setEnabledExclusiveInCategory(overlayPkg, userId);
-                if (DEBUG) {
-                    Log.d(TAG, "setModeOverlay: overlayPackage=" + overlayPkg
-                            + " userId=" + userId);
-                }
-            } catch (SecurityException | IllegalStateException | RemoteException e) {
-                Log.e(TAG, "Failed to enable overlay " + overlayPkg + " for user " + userId);
-            }
-        });
-    }
-
     @Override
     public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
         pw.println("NavigationModeController:");
@@ -334,11 +193,6 @@
             defaultOverlays = "failed_to_fetch";
         }
         pw.println("  defaultOverlays=" + defaultOverlays);
-        pw.println("  restoreGesturalNavMode:");
-        for (int i = 0; i < mRestoreGesturalNavBarMode.size(); i++) {
-            pw.println("    userId=" + mRestoreGesturalNavBarMode.keyAt(i)
-                    + " shouldRestore=" + mRestoreGesturalNavBarMode.valueAt(i));
-        }
         dumpAssetPaths(mCurrentUserContext);
     }
 
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 31797d1..c9716d3 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java
@@ -1780,7 +1780,13 @@
         });
         animator.addListener(new AnimatorListenerAdapter() {
             @Override
+            public void onAnimationStart(Animator animation) {
+                notifyExpandingStarted();
+            }
+
+            @Override
             public void onAnimationEnd(Animator animation) {
+                notifyExpandingFinished();
                 mNotificationStackScroller.resetCheckSnoozeLeavebehind();
                 mQsExpansionAnimator = null;
                 if (onFinishRunnable != null) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java
index f7d403f..81dc9e1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java
@@ -157,7 +157,7 @@
     protected void onExpandingStarted() {
     }
 
-    private void notifyExpandingStarted() {
+    protected void notifyExpandingStarted() {
         if (!mExpanding) {
             mExpanding = true;
             onExpandingStarted();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/RegionSamplingHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/RegionSamplingHelper.java
index 1a6b415..bf52a7a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/RegionSamplingHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/RegionSamplingHelper.java
@@ -148,11 +148,6 @@
         updateSamplingRect();
     }
 
-    private void postUpdateSamplingListener() {
-        mHandler.removeCallbacks(mUpdateSamplingListener);
-        mHandler.post(mUpdateSamplingListener);
-    }
-
     private void updateSamplingListener() {
         boolean isSamplingEnabled = mSamplingEnabled
                 && !mSamplingRequestBounds.isEmpty()
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 900b3ea..ca65665 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -193,7 +193,6 @@
 import com.android.systemui.statusbar.notification.collection.NotificationEntry;
 import com.android.systemui.statusbar.notification.init.NotificationsController;
 import com.android.systemui.statusbar.notification.interruption.BypassHeadsUpNotifier;
-import com.android.systemui.statusbar.notification.interruption.NotificationAlertingManager;
 import com.android.systemui.statusbar.notification.interruption.NotificationInterruptStateProvider;
 import com.android.systemui.statusbar.notification.logging.NotificationLogger;
 import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
@@ -623,7 +622,6 @@
             NotificationInterruptStateProvider notificationInterruptStateProvider,
             NotificationViewHierarchyManager notificationViewHierarchyManager,
             KeyguardViewMediator keyguardViewMediator,
-            NotificationAlertingManager notificationAlertingManager, // need to inject for now
             DisplayMetrics displayMetrics,
             MetricsLogger metricsLogger,
             @UiBackground Executor uiBgExecutor,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java
index 53fa263..fbe3e9b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java
@@ -40,7 +40,6 @@
 import android.service.notification.StatusBarNotification;
 import android.text.TextUtils;
 import android.util.EventLog;
-import android.util.Log;
 import android.view.RemoteAnimationAdapter;
 import android.view.View;
 
@@ -91,92 +90,119 @@
  */
 public class StatusBarNotificationActivityStarter implements NotificationActivityStarter {
 
-    private static final String TAG = "NotifActivityStarter";
-    protected static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
+    private final Context mContext;
 
-    private final Lazy<AssistManager> mAssistManagerLazy;
-    private final NotificationGroupManager mGroupManager;
-    private final StatusBarRemoteInputCallback mStatusBarRemoteInputCallback;
-    private final NotificationRemoteInputManager mRemoteInputManager;
-    private final NotificationLockscreenUserManager mLockscreenUserManager;
-    private final ShadeController mShadeController;
-    private final StatusBar mStatusBar;
-    private final KeyguardStateController mKeyguardStateController;
-    private final ActivityStarter mActivityStarter;
+    private final CommandQueue mCommandQueue;
+    private final Handler mMainThreadHandler;
+    private final Handler mBackgroundHandler;
+    private final Executor mUiBgExecutor;
+
     private final NotificationEntryManager mEntryManager;
     private final NotifPipeline mNotifPipeline;
     private final NotifCollection mNotifCollection;
-    private final FeatureFlags mFeatureFlags;
-    private final StatusBarStateController mStatusBarStateController;
-    private final NotificationInterruptStateProvider mNotificationInterruptStateProvider;
-    private final MetricsLogger mMetricsLogger;
-    private final Context mContext;
-    private final NotificationPanelViewController mNotificationPanel;
-    private final NotificationPresenter mPresenter;
-    private final LockPatternUtils mLockPatternUtils;
     private final HeadsUpManagerPhone mHeadsUpManager;
+    private final ActivityStarter mActivityStarter;
+    private final IStatusBarService mBarService;
+    private final StatusBarStateController mStatusBarStateController;
     private final StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
     private final KeyguardManager mKeyguardManager;
-    private final ActivityLaunchAnimator mActivityLaunchAnimator;
-    private final IStatusBarService mBarService;
-    private final CommandQueue mCommandQueue;
     private final IDreamManager mDreamManager;
-    private final Handler mMainThreadHandler;
-    private final Handler mBackgroundHandler;
-    private final ActivityIntentHelper mActivityIntentHelper;
     private final BubbleController mBubbleController;
-    private final Executor mUiBgExecutor;
+    private final Lazy<AssistManager> mAssistManagerLazy;
+    private final NotificationRemoteInputManager mRemoteInputManager;
+    private final NotificationGroupManager mGroupManager;
+    private final NotificationLockscreenUserManager mLockscreenUserManager;
+    private final ShadeController mShadeController;
+    private final KeyguardStateController mKeyguardStateController;
+    private final NotificationInterruptStateProvider mNotificationInterruptStateProvider;
+    private final LockPatternUtils mLockPatternUtils;
+    private final StatusBarRemoteInputCallback mStatusBarRemoteInputCallback;
+    private final ActivityIntentHelper mActivityIntentHelper;
+
+    private final FeatureFlags mFeatureFlags;
+    private final MetricsLogger mMetricsLogger;
+    private final StatusBarNotificationActivityStarterLogger mLogger;
+
+    private final StatusBar mStatusBar;
+    private final NotificationPresenter mPresenter;
+    private final NotificationPanelViewController mNotificationPanel;
+    private final ActivityLaunchAnimator mActivityLaunchAnimator;
 
     private boolean mIsCollapsingToShowActivityOverLockscreen;
 
-    private StatusBarNotificationActivityStarter(Context context, CommandQueue commandQueue,
-            Lazy<AssistManager> assistManagerLazy, NotificationPanelViewController panel,
-            NotificationPresenter presenter, NotificationEntryManager entryManager,
-            HeadsUpManagerPhone headsUpManager, ActivityStarter activityStarter,
-            ActivityLaunchAnimator activityLaunchAnimator, IStatusBarService statusBarService,
+    private StatusBarNotificationActivityStarter(
+            Context context,
+            CommandQueue commandQueue,
+            Handler mainThreadHandler,
+            Handler backgroundHandler,
+            Executor uiBgExecutor,
+            NotificationEntryManager entryManager,
+            NotifPipeline notifPipeline,
+            NotifCollection notifCollection,
+            HeadsUpManagerPhone headsUpManager,
+            ActivityStarter activityStarter,
+            IStatusBarService statusBarService,
             StatusBarStateController statusBarStateController,
             StatusBarKeyguardViewManager statusBarKeyguardViewManager,
             KeyguardManager keyguardManager,
-            IDreamManager dreamManager, NotificationRemoteInputManager remoteInputManager,
-            StatusBarRemoteInputCallback remoteInputCallback, NotificationGroupManager groupManager,
+            IDreamManager dreamManager,
+            BubbleController bubbleController,
+            Lazy<AssistManager> assistManagerLazy,
+            NotificationRemoteInputManager remoteInputManager,
+            NotificationGroupManager groupManager,
             NotificationLockscreenUserManager lockscreenUserManager,
-            ShadeController shadeController, StatusBar statusBar,
+            ShadeController shadeController,
             KeyguardStateController keyguardStateController,
             NotificationInterruptStateProvider notificationInterruptStateProvider,
-            MetricsLogger metricsLogger, LockPatternUtils lockPatternUtils,
-            Handler mainThreadHandler, Handler backgroundHandler, Executor uiBgExecutor,
-            ActivityIntentHelper activityIntentHelper, BubbleController bubbleController,
-            FeatureFlags featureFlags, NotifPipeline notifPipeline,
-            NotifCollection notifCollection) {
+            LockPatternUtils lockPatternUtils,
+            StatusBarRemoteInputCallback remoteInputCallback,
+            ActivityIntentHelper activityIntentHelper,
+
+            FeatureFlags featureFlags,
+            MetricsLogger metricsLogger,
+            StatusBarNotificationActivityStarterLogger logger,
+
+            StatusBar statusBar,
+            NotificationPresenter presenter,
+            NotificationPanelViewController panel,
+            ActivityLaunchAnimator activityLaunchAnimator) {
         mContext = context;
-        mNotificationPanel = panel;
-        mPresenter = presenter;
-        mHeadsUpManager = headsUpManager;
-        mActivityLaunchAnimator = activityLaunchAnimator;
-        mBarService = statusBarService;
         mCommandQueue = commandQueue;
+        mMainThreadHandler = mainThreadHandler;
+        mBackgroundHandler = backgroundHandler;
+        mUiBgExecutor = uiBgExecutor;
+        mEntryManager = entryManager;
+        mNotifPipeline = notifPipeline;
+        mNotifCollection = notifCollection;
+        mHeadsUpManager = headsUpManager;
+        mActivityStarter = activityStarter;
+        mBarService = statusBarService;
+        mStatusBarStateController = statusBarStateController;
         mStatusBarKeyguardViewManager = statusBarKeyguardViewManager;
         mKeyguardManager = keyguardManager;
         mDreamManager = dreamManager;
+        mBubbleController = bubbleController;
+        mAssistManagerLazy = assistManagerLazy;
         mRemoteInputManager = remoteInputManager;
+        mGroupManager = groupManager;
         mLockscreenUserManager = lockscreenUserManager;
         mShadeController = shadeController;
+        mKeyguardStateController = keyguardStateController;
+        mNotificationInterruptStateProvider = notificationInterruptStateProvider;
+        mLockPatternUtils = lockPatternUtils;
+        mStatusBarRemoteInputCallback = remoteInputCallback;
+        mActivityIntentHelper = activityIntentHelper;
+
+        mFeatureFlags = featureFlags;
+        mMetricsLogger = metricsLogger;
+        mLogger = logger;
+
         // TODO: use KeyguardStateController#isOccluded to remove this dependency
         mStatusBar = statusBar;
-        mKeyguardStateController = keyguardStateController;
-        mActivityStarter = activityStarter;
-        mEntryManager = entryManager;
-        mStatusBarStateController = statusBarStateController;
-        mNotificationInterruptStateProvider = notificationInterruptStateProvider;
-        mMetricsLogger = metricsLogger;
-        mAssistManagerLazy = assistManagerLazy;
-        mGroupManager = groupManager;
-        mLockPatternUtils = lockPatternUtils;
-        mBackgroundHandler = backgroundHandler;
-        mUiBgExecutor = uiBgExecutor;
-        mFeatureFlags = featureFlags;
-        mNotifPipeline = notifPipeline;
-        mNotifCollection = notifCollection;
+        mPresenter = presenter;
+        mNotificationPanel = panel;
+        mActivityLaunchAnimator = activityLaunchAnimator;
+
         if (!mFeatureFlags.isNewNotifPipelineRenderingEnabled()) {
             mEntryManager.addNotificationEntryListener(new NotificationEntryListener() {
                 @Override
@@ -192,11 +218,6 @@
                 }
             });
         }
-
-        mStatusBarRemoteInputCallback = remoteInputCallback;
-        mMainThreadHandler = mainThreadHandler;
-        mActivityIntentHelper = activityIntentHelper;
-        mBubbleController = bubbleController;
     }
 
     /**
@@ -207,6 +228,8 @@
      */
     @Override
     public void onNotificationClicked(StatusBarNotification sbn, ExpandableNotificationRow row) {
+        mLogger.logStartingActivityFromClick(sbn.getKey());
+
         RemoteInputController controller = mRemoteInputManager.getController();
         if (controller.isRemoteInputActive(row.getEntry())
                 && !TextUtils.isEmpty(row.getActiveRemoteInputText())) {
@@ -225,7 +248,7 @@
         // The only valid case is Bubble notifications. Guard against other cases
         // entering here.
         if (intent == null && !isBubble) {
-            Log.e(TAG, "onNotificationClicked called for non-clickable notification!");
+            mLogger.logNonClickableNotification(sbn.getKey());
             return;
         }
 
@@ -258,6 +281,8 @@
             boolean isActivityIntent,
             boolean wasOccluded,
             boolean showOverLockscreen) {
+        mLogger.logHandleClickAfterKeyguardDismissed(sbn.getKey());
+
         // TODO: Some of this code may be able to move to NotificationEntryManager.
         if (mHeadsUpManager != null && mHeadsUpManager.isAlerting(sbn.getKey())) {
             // Release the HUN notification to the shade.
@@ -304,6 +329,8 @@
             boolean isActivityIntent,
             boolean wasOccluded,
             NotificationEntry parentToCancelFinal) {
+        mLogger.logHandleClickAfterPanelCollapsed(sbn.getKey());
+
         String notificationKey = sbn.getKey();
         try {
             // The intent we are sending is for the application, which
@@ -343,9 +370,11 @@
                     remoteInputText.toString());
         }
         if (isBubble) {
+            mLogger.logExpandingBubble(notificationKey);
             expandBubbleStackOnMainThread(notificationKey);
         } else {
-            startNotificationIntent(intent, fillInIntent, row, wasOccluded, isActivityIntent);
+            startNotificationIntent(
+                    intent, fillInIntent, entry, row, wasOccluded, isActivityIntent);
         }
         if (isActivityIntent || isBubble) {
             mAssistManagerLazy.get().hideAssist();
@@ -392,10 +421,16 @@
         }
     }
 
-    private void startNotificationIntent(PendingIntent intent, Intent fillInIntent,
-            View row, boolean wasOccluded, boolean isActivityIntent) {
+    private void startNotificationIntent(
+            PendingIntent intent,
+            Intent fillInIntent,
+            NotificationEntry entry,
+            View row,
+            boolean wasOccluded,
+            boolean isActivityIntent) {
         RemoteAnimationAdapter adapter = mActivityLaunchAnimator.getLaunchAnimation(row,
                 wasOccluded);
+        mLogger.logStartNotificationIntent(entry.getKey(), intent);
         try {
             if (adapter != null) {
                 ActivityTaskManager.getService()
@@ -408,7 +443,7 @@
         } catch (RemoteException | PendingIntent.CanceledException e) {
             // the stack trace isn't very helpful here.
             // Just log the exception message.
-            Log.w(TAG, "Sending contentIntent failed: " + e);
+            mLogger.logSendingIntentFailed(e);
             // TODO: Dismiss Keyguard.
         }
     }
@@ -438,13 +473,9 @@
     private void handleFullScreenIntent(NotificationEntry entry) {
         if (mNotificationInterruptStateProvider.shouldLaunchFullScreenIntentWhenAdded(entry)) {
             if (shouldSuppressFullScreenIntent(entry)) {
-                if (DEBUG) {
-                    Log.d(TAG, "No Fullscreen intent: suppressed by DND: " + entry.getKey());
-                }
+                mLogger.logFullScreenIntentSuppressedByDnD(entry.getKey());
             } else if (entry.getImportance() < NotificationManager.IMPORTANCE_HIGH) {
-                if (DEBUG) {
-                    Log.d(TAG, "No Fullscreen intent: not important enough: " + entry.getKey());
-                }
+                mLogger.logFullScreenIntentNotImportantEnough(entry.getKey());
             } else {
                 // Stop screensaver if the notification has a fullscreen intent.
                 // (like an incoming phone call)
@@ -457,13 +488,13 @@
                 });
 
                 // not immersive & a fullscreen alert should be shown
-                if (DEBUG) {
-                    Log.d(TAG, "Notification has fullScreenIntent; sending fullScreenIntent");
-                }
+                final PendingIntent fullscreenIntent =
+                        entry.getSbn().getNotification().fullScreenIntent;
+                mLogger.logSendingFullScreenIntent(entry.getKey(), fullscreenIntent);
                 try {
                     EventLog.writeEvent(EventLogTags.SYSUI_FULLSCREEN_NOTIFICATION,
                             entry.getKey());
-                    entry.getSbn().getNotification().fullScreenIntent.send();
+                    fullscreenIntent.send();
                     entry.notifyFullScreenIntentLaunched();
                     mMetricsLogger.count("note_fullscreen", 1);
                 } catch (PendingIntent.CanceledException e) {
@@ -578,9 +609,10 @@
     public static class Builder {
         private final Context mContext;
         private final CommandQueue mCommandQueue;
-        private final Lazy<AssistManager> mAssistManagerLazy;
+        private final Handler mMainThreadHandler;
+        private final Handler mBackgroundHandler;
+        private final Executor mUiBgExecutor;
         private final NotificationEntryManager mEntryManager;
-        private final FeatureFlags mFeatureFlags;
         private final NotifPipeline mNotifPipeline;
         private final NotifCollection mNotifCollection;
         private final HeadsUpManagerPhone mHeadsUpManager;
@@ -590,30 +622,37 @@
         private final StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
         private final KeyguardManager mKeyguardManager;
         private final IDreamManager mDreamManager;
+        private final BubbleController mBubbleController;
+        private final Lazy<AssistManager> mAssistManagerLazy;
         private final NotificationRemoteInputManager mRemoteInputManager;
-        private final StatusBarRemoteInputCallback mRemoteInputCallback;
         private final NotificationGroupManager mGroupManager;
         private final NotificationLockscreenUserManager mLockscreenUserManager;
-        private final KeyguardStateController mKeyguardStateController;
-        private final MetricsLogger mMetricsLogger;
-        private final LockPatternUtils mLockPatternUtils;
-        private final Handler mMainThreadHandler;
-        private final Handler mBackgroundHandler;
-        private final Executor mUiBgExecutor;
-        private final ActivityIntentHelper mActivityIntentHelper;
-        private final BubbleController mBubbleController;
-        private NotificationPanelViewController mNotificationPanelViewController;
-        private NotificationInterruptStateProvider mNotificationInterruptStateProvider;
         private final ShadeController mShadeController;
-        private NotificationPresenter mNotificationPresenter;
-        private ActivityLaunchAnimator mActivityLaunchAnimator;
+        private final KeyguardStateController mKeyguardStateController;
+        private final NotificationInterruptStateProvider mNotificationInterruptStateProvider;
+        private final LockPatternUtils mLockPatternUtils;
+        private final StatusBarRemoteInputCallback mRemoteInputCallback;
+        private final ActivityIntentHelper mActivityIntentHelper;
+
+        private final FeatureFlags mFeatureFlags;
+        private final MetricsLogger mMetricsLogger;
+        private final StatusBarNotificationActivityStarterLogger mLogger;
+
         private StatusBar mStatusBar;
+        private NotificationPresenter mNotificationPresenter;
+        private NotificationPanelViewController mNotificationPanelViewController;
+        private ActivityLaunchAnimator mActivityLaunchAnimator;
 
         @Inject
-        public Builder(Context context,
+        public Builder(
+                Context context,
                 CommandQueue commandQueue,
-                Lazy<AssistManager> assistManagerLazy,
+                @Main Handler mainThreadHandler,
+                @Background Handler backgroundHandler,
+                @UiBackground Executor uiBgExecutor,
                 NotificationEntryManager entryManager,
+                NotifPipeline notifPipeline,
+                NotifCollection notifCollection,
                 HeadsUpManagerPhone headsUpManager,
                 ActivityStarter activityStarter,
                 IStatusBarService statusBarService,
@@ -621,27 +660,30 @@
                 StatusBarKeyguardViewManager statusBarKeyguardViewManager,
                 KeyguardManager keyguardManager,
                 IDreamManager dreamManager,
+                BubbleController bubbleController,
+                Lazy<AssistManager> assistManagerLazy,
                 NotificationRemoteInputManager remoteInputManager,
-                StatusBarRemoteInputCallback remoteInputCallback,
                 NotificationGroupManager groupManager,
                 NotificationLockscreenUserManager lockscreenUserManager,
+                ShadeController shadeController,
                 KeyguardStateController keyguardStateController,
                 NotificationInterruptStateProvider notificationInterruptStateProvider,
-                MetricsLogger metricsLogger,
                 LockPatternUtils lockPatternUtils,
-                @Main Handler mainThreadHandler,
-                @Background Handler backgroundHandler,
-                @UiBackground Executor uiBgExecutor,
+                StatusBarRemoteInputCallback remoteInputCallback,
                 ActivityIntentHelper activityIntentHelper,
-                BubbleController bubbleController,
-                ShadeController shadeController,
+
                 FeatureFlags featureFlags,
-                NotifPipeline notifPipeline,
-                NotifCollection notifCollection) {
+                MetricsLogger metricsLogger,
+                StatusBarNotificationActivityStarterLogger logger) {
+
             mContext = context;
             mCommandQueue = commandQueue;
-            mAssistManagerLazy = assistManagerLazy;
+            mMainThreadHandler = mainThreadHandler;
+            mBackgroundHandler = backgroundHandler;
+            mUiBgExecutor = uiBgExecutor;
             mEntryManager = entryManager;
+            mNotifPipeline = notifPipeline;
+            mNotifCollection = notifCollection;
             mHeadsUpManager = headsUpManager;
             mActivityStarter = activityStarter;
             mStatusBarService = statusBarService;
@@ -649,23 +691,21 @@
             mStatusBarKeyguardViewManager = statusBarKeyguardViewManager;
             mKeyguardManager = keyguardManager;
             mDreamManager = dreamManager;
+            mBubbleController = bubbleController;
+            mAssistManagerLazy = assistManagerLazy;
             mRemoteInputManager = remoteInputManager;
-            mRemoteInputCallback = remoteInputCallback;
             mGroupManager = groupManager;
             mLockscreenUserManager = lockscreenUserManager;
+            mShadeController = shadeController;
             mKeyguardStateController = keyguardStateController;
             mNotificationInterruptStateProvider = notificationInterruptStateProvider;
-            mMetricsLogger = metricsLogger;
             mLockPatternUtils = lockPatternUtils;
-            mMainThreadHandler = mainThreadHandler;
-            mBackgroundHandler = backgroundHandler;
-            mUiBgExecutor = uiBgExecutor;
+            mRemoteInputCallback = remoteInputCallback;
             mActivityIntentHelper = activityIntentHelper;
-            mBubbleController = bubbleController;
-            mShadeController = shadeController;
+
             mFeatureFlags = featureFlags;
-            mNotifPipeline = notifPipeline;
-            mNotifCollection = notifCollection;
+            mMetricsLogger = metricsLogger;
+            mLogger = logger;
         }
 
         /** Sets the status bar to use as {@link StatusBar}. */
@@ -692,37 +732,42 @@
         }
 
         public StatusBarNotificationActivityStarter build() {
-            return new StatusBarNotificationActivityStarter(mContext,
-                    mCommandQueue, mAssistManagerLazy,
-                    mNotificationPanelViewController,
-                    mNotificationPresenter,
+            return new StatusBarNotificationActivityStarter(
+                    mContext,
+                    mCommandQueue,
+                    mMainThreadHandler,
+                    mBackgroundHandler,
+                    mUiBgExecutor,
                     mEntryManager,
+                    mNotifPipeline,
+                    mNotifCollection,
                     mHeadsUpManager,
                     mActivityStarter,
-                    mActivityLaunchAnimator,
                     mStatusBarService,
                     mStatusBarStateController,
                     mStatusBarKeyguardViewManager,
                     mKeyguardManager,
                     mDreamManager,
+                    mBubbleController,
+                    mAssistManagerLazy,
                     mRemoteInputManager,
-                    mRemoteInputCallback,
                     mGroupManager,
                     mLockscreenUserManager,
                     mShadeController,
-                    mStatusBar,
                     mKeyguardStateController,
                     mNotificationInterruptStateProvider,
-                    mMetricsLogger,
                     mLockPatternUtils,
-                    mMainThreadHandler,
-                    mBackgroundHandler,
-                    mUiBgExecutor,
+                    mRemoteInputCallback,
                     mActivityIntentHelper,
-                    mBubbleController,
+
                     mFeatureFlags,
-                    mNotifPipeline,
-                    mNotifCollection);
+                    mMetricsLogger,
+                    mLogger,
+
+                    mStatusBar,
+                    mNotificationPresenter,
+                    mNotificationPanelViewController,
+                    mActivityLaunchAnimator);
         }
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterLogger.kt
new file mode 100644
index 0000000..d118747
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterLogger.kt
@@ -0,0 +1,114 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.statusbar.phone
+
+import android.app.PendingIntent
+import com.android.systemui.log.LogBuffer
+import com.android.systemui.log.LogLevel.DEBUG
+import com.android.systemui.log.LogLevel.ERROR
+import com.android.systemui.log.LogLevel.INFO
+import com.android.systemui.log.LogLevel.WARNING
+import com.android.systemui.log.dagger.NotifInteractionLog
+import javax.inject.Inject
+
+class StatusBarNotificationActivityStarterLogger @Inject constructor(
+    @NotifInteractionLog private val buffer: LogBuffer
+) {
+    fun logStartingActivityFromClick(key: String) {
+        buffer.log(TAG, DEBUG, {
+            str1 = key
+        }, {
+            "(1/4) onNotificationClicked: $str1"
+        })
+    }
+
+    fun logHandleClickAfterKeyguardDismissed(key: String) {
+        buffer.log(TAG, DEBUG, {
+            str1 = key
+        }, {
+            "(2/4) handleNotificationClickAfterKeyguardDismissed: $str1"
+        })
+    }
+
+    fun logHandleClickAfterPanelCollapsed(key: String) {
+        buffer.log(TAG, DEBUG, {
+            str1 = key
+        }, {
+            "(3/4) handleNotificationClickAfterPanelCollapsed: $str1"
+        })
+    }
+
+    fun logStartNotificationIntent(key: String, pendingIntent: PendingIntent) {
+        buffer.log(TAG, INFO, {
+            str1 = key
+            str2 = pendingIntent.intent.toString()
+        }, {
+            "(4/4) Starting $str2 for notification $str1"
+        })
+    }
+
+    fun logExpandingBubble(key: String) {
+        buffer.log(TAG, DEBUG, {
+            str1 = key
+        }, {
+            "Expanding bubble for $str1 (rather than firing intent)"
+        })
+    }
+
+    fun logSendingIntentFailed(e: Exception) {
+        buffer.log(TAG, WARNING, {
+            str1 = e.toString()
+        }, {
+            "Sending contentIntentFailed: $str1"
+        })
+    }
+
+    fun logNonClickableNotification(key: String) {
+        buffer.log(TAG, ERROR, {
+            str1 = key
+        }, {
+            "onNotificationClicked called for non-clickable notification! $str1"
+        })
+    }
+
+    fun logFullScreenIntentSuppressedByDnD(key: String) {
+        buffer.log(TAG, DEBUG, {
+            str1 = key
+        }, {
+            "No Fullscreen intent: suppressed by DND: $str1"
+        })
+    }
+
+    fun logFullScreenIntentNotImportantEnough(key: String) {
+        buffer.log(TAG, DEBUG, {
+            str1 = key
+        }, {
+            "No Fullscreen intent: not important enough: $str1"
+        })
+    }
+
+    fun logSendingFullScreenIntent(key: String, pendingIntent: PendingIntent) {
+        buffer.log(TAG, INFO, {
+            str1 = key
+            str2 = pendingIntent.intent.toString()
+        }, {
+            "Notification $str1 has fullScreenIntent; sending fullScreenIntent $str2"
+        })
+    }
+}
+
+private const val TAG = "NotifActivityStarter"
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java
index b81a519..02e0312 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java
@@ -62,7 +62,6 @@
 import com.android.systemui.statusbar.notification.VisualStabilityManager;
 import com.android.systemui.statusbar.notification.init.NotificationsController;
 import com.android.systemui.statusbar.notification.interruption.BypassHeadsUpNotifier;
-import com.android.systemui.statusbar.notification.interruption.NotificationAlertingManager;
 import com.android.systemui.statusbar.notification.interruption.NotificationInterruptStateProvider;
 import com.android.systemui.statusbar.notification.logging.NotificationLogger;
 import com.android.systemui.statusbar.notification.row.NotificationGutsManager;
@@ -143,7 +142,6 @@
             NotificationInterruptStateProvider notificationInterruptStateProvider,
             NotificationViewHierarchyManager notificationViewHierarchyManager,
             KeyguardViewMediator keyguardViewMediator,
-            NotificationAlertingManager notificationAlertingManager,
             DisplayMetrics displayMetrics,
             MetricsLogger metricsLogger,
             @UiBackground Executor uiBgExecutor,
@@ -223,7 +221,6 @@
                 notificationInterruptStateProvider,
                 notificationViewHierarchyManager,
                 keyguardViewMediator,
-                notificationAlertingManager,
                 displayMetrics,
                 metricsLogger,
                 uiBgExecutor,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java
index 17cd98f..e65b6fe 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java
@@ -197,8 +197,13 @@
                 TelephonyIcons.THREE_G);
         mNetworkToIconLookup.put(toIconKey(TelephonyManager.NETWORK_TYPE_EHRPD),
                 TelephonyIcons.THREE_G);
-        mNetworkToIconLookup.put(toIconKey(TelephonyManager.NETWORK_TYPE_UMTS),
+        if (mConfig.show4gFor3g) {
+            mNetworkToIconLookup.put(toIconKey(TelephonyManager.NETWORK_TYPE_UMTS),
+                TelephonyIcons.FOUR_G);
+        } else {
+            mNetworkToIconLookup.put(toIconKey(TelephonyManager.NETWORK_TYPE_UMTS),
                 TelephonyIcons.THREE_G);
+        }
         mNetworkToIconLookup.put(toIconKey(TelephonyManager.NETWORK_TYPE_TD_SCDMA),
                 TelephonyIcons.THREE_G);
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
index 6e5f8a0..a284335 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
@@ -357,7 +357,18 @@
         mBroadcastDispatcher.registerReceiverWithHandler(this, filter, mReceiverHandler);
         mListening = true;
 
+        // Initial setup of connectivity. Handled as if we had received a sticky broadcast of
+        // ConnectivityManager.CONNECTIVITY_ACTION or ConnectivityManager.INET_CONDITION_ACTION.
+        mReceiverHandler.post(this::updateConnectivity);
+
+        // Initial setup of WifiSignalController. Handled as if we had received a sticky broadcast
+        // of WifiManager.WIFI_STATE_CHANGED_ACTION or WifiManager.NETWORK_STATE_CHANGED_ACTION
+        mReceiverHandler.post(mWifiSignalController::fetchInitialState);
         updateMobileControllers();
+
+        // Initial setup of emergency information. Handled as if we had received a sticky broadcast
+        // of TelephonyManager.ACTION_DEFAULT_VOICE_SUBSCRIPTION_CHANGED.
+        mReceiverHandler.post(this::recalculateEmergency);
     }
 
     private void unregisterListeners() {
@@ -367,7 +378,7 @@
             mobileSignalController.unregisterListener();
         }
         mSubscriptionManager.removeOnSubscriptionsChangedListener(mSubscriptionListener);
-        mContext.unregisterReceiver(this);
+        mBroadcastDispatcher.unregisterReceiver(this);
     }
 
     public int getConnectedWifiLevel() {
@@ -859,6 +870,7 @@
         pw.println("  - telephony ------");
         pw.print("  hasVoiceCallingFeature()=");
         pw.println(hasVoiceCallingFeature());
+        pw.println("  mListening=" + mListening);
 
         pw.println("  - connectivity ------");
         pw.print("  mConnectedTransports=");
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java
index b258fd4..5257ce4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java
@@ -102,6 +102,20 @@
     }
 
     /**
+     * Fetches wifi initial state replacing the initial sticky broadcast.
+     */
+    public void fetchInitialState() {
+        mWifiTracker.fetchInitialState();
+        mCurrentState.enabled = mWifiTracker.enabled;
+        mCurrentState.connected = mWifiTracker.connected;
+        mCurrentState.ssid = mWifiTracker.ssid;
+        mCurrentState.rssi = mWifiTracker.rssi;
+        mCurrentState.level = mWifiTracker.level;
+        mCurrentState.statusLabel = mWifiTracker.statusLabel;
+        notifyListenersIfNecessary();
+    }
+
+    /**
      * Extract wifi state directly from broadcasts about changes in wifi state.
      */
     public void handleBroadcast(Intent intent) {
diff --git a/packages/SystemUI/src/com/android/systemui/util/FloatingContentCoordinator.kt b/packages/SystemUI/src/com/android/systemui/util/FloatingContentCoordinator.kt
index ca4b67d..242f7cd 100644
--- a/packages/SystemUI/src/com/android/systemui/util/FloatingContentCoordinator.kt
+++ b/packages/SystemUI/src/com/android/systemui/util/FloatingContentCoordinator.kt
@@ -187,16 +187,23 @@
                 // Tell that content to get out of the way, and save the bounds it says it's moving
                 // (or animating) to.
                 .forEach { (content, bounds) ->
-                    content.moveToBounds(
-                            content.calculateNewBoundsOnOverlap(
-                                    conflictingNewBounds,
-                                    // Pass all of the content bounds except the bounds of the
-                                    // content we're asking to move, and the conflicting new bounds
-                                    // (since those are passed separately).
-                                    otherContentBounds = allContentBounds.values
-                                            .minus(bounds)
-                                            .minus(conflictingNewBounds)))
-                    allContentBounds[content] = content.getFloatingBoundsOnScreen()
+                    val newBounds = content.calculateNewBoundsOnOverlap(
+                            conflictingNewBounds,
+                            // Pass all of the content bounds except the bounds of the
+                            // content we're asking to move, and the conflicting new bounds
+                            // (since those are passed separately).
+                            otherContentBounds = allContentBounds.values
+                                    .minus(bounds)
+                                    .minus(conflictingNewBounds))
+
+                    // If the new bounds are empty, it means there's no non-overlapping position
+                    // that is in bounds. Just leave the content where it is. This should normally
+                    // not happen, but sometimes content like PIP reports incorrect bounds
+                    // temporarily.
+                    if (!newBounds.isEmpty) {
+                        content.moveToBounds(newBounds)
+                        allContentBounds[content] = content.getFloatingBoundsOnScreen()
+                    }
                 }
 
         currentlyResolvingConflicts = false
@@ -229,8 +236,8 @@
          * @param allowedBounds The area within which we're allowed to find new bounds for the
          * content.
          * @return New bounds for the content that don't intersect the exclusion rects or the
-         * newly overlapping rect, and that is within bounds unless no possible in-bounds position
-         * exists.
+         * newly overlapping rect, and that is within bounds - or an empty Rect if no in-bounds
+         * position exists.
          */
         @JvmStatic
         fun findAreaForContentVertically(
@@ -274,7 +281,13 @@
                             !overlappingContentPushingDown && !positionAboveInBounds
 
             // Return the content rect, but offset to reflect the new position.
-            return if (usePositionBelow) newContentBoundsBelow else newContentBoundsAbove
+            val newBounds = if (usePositionBelow) newContentBoundsBelow else newContentBoundsAbove
+
+            // If the new bounds are within the allowed bounds, return them. If not, it means that
+            // there are no legal new bounds. This can happen if the new content's bounds are too
+            // large (for example, full-screen PIP). Since there is no reasonable action to take
+            // here, return an empty Rect and we will just not move the content.
+            return if (allowedBounds.contains(newBounds)) newBounds else Rect()
         }
 
         /**
diff --git a/packages/SystemUI/src/com/android/systemui/util/RelativeTouchListener.kt b/packages/SystemUI/src/com/android/systemui/util/RelativeTouchListener.kt
index d65b285..8880df9 100644
--- a/packages/SystemUI/src/com/android/systemui/util/RelativeTouchListener.kt
+++ b/packages/SystemUI/src/com/android/systemui/util/RelativeTouchListener.kt
@@ -115,7 +115,9 @@
 
                 performedLongClick = false
                 handler.postDelayed({
-                    performedLongClick = v.performLongClick()
+                    if (v.isLongClickable) {
+                        performedLongClick = v.performLongClick()
+                    }
                 }, ViewConfiguration.getLongPressTimeout().toLong())
             }
 
diff --git a/packages/SystemUI/src/com/android/systemui/util/animation/PhysicsAnimator.kt b/packages/SystemUI/src/com/android/systemui/util/animation/PhysicsAnimator.kt
index 8625d63..db08d64 100644
--- a/packages/SystemUI/src/com/android/systemui/util/animation/PhysicsAnimator.kt
+++ b/packages/SystemUI/src/com/android/systemui/util/animation/PhysicsAnimator.kt
@@ -61,14 +61,17 @@
 
 /**
  * Default spring configuration to use for animations where stiffness and/or damping ratio
- * were not provided.
+ * were not provided, and a default spring was not set via [PhysicsAnimator.setDefaultSpringConfig].
  */
-private val defaultSpring = PhysicsAnimator.SpringConfig(
+private val globalDefaultSpring = PhysicsAnimator.SpringConfig(
         SpringForce.STIFFNESS_MEDIUM,
         SpringForce.DAMPING_RATIO_MEDIUM_BOUNCY)
 
-/** Default fling configuration to use for animations where friction was not provided. */
-private val defaultFling = PhysicsAnimator.FlingConfig(
+/**
+ * Default fling configuration to use for animations where friction was not provided, and a default
+ * fling config was not set via [PhysicsAnimator.setDefaultFlingConfig].
+ */
+private val globalDefaultFling = PhysicsAnimator.FlingConfig(
         friction = 1f, min = -Float.MAX_VALUE, max = Float.MAX_VALUE)
 
 /** Whether to log helpful debug information about animations. */
@@ -111,6 +114,12 @@
     /** End actions to run when all animations have completed.  */
     private val endActions = ArrayList<EndAction>()
 
+    /** SpringConfig to use by default for properties whose springs were not provided. */
+    private var defaultSpring: SpringConfig = globalDefaultSpring
+
+    /** FlingConfig to use by default for properties whose fling configs were not provided. */
+    private var defaultFling: FlingConfig = globalDefaultFling
+
     /**
      * Internal listeners that respond to DynamicAnimations updating and ending, and dispatch to
      * the listeners provided via [addUpdateListener] and [addEndListener]. This allows us to add
@@ -204,6 +213,19 @@
     }
 
     /**
+     * Springs a property to a given value using the provided configuration options, and a start
+     * velocity of 0f.
+     *
+     * @see spring
+     */
+    fun spring(
+        property: FloatPropertyCompat<in T>,
+        toPosition: Float
+    ): PhysicsAnimator<T> {
+        return spring(property, toPosition, 0f)
+    }
+
+    /**
      * Flings a property using the given start velocity, using a [FlingAnimation] configured using
      * the provided configuration settings.
      *
@@ -392,6 +414,14 @@
         return this
     }
 
+    fun setDefaultSpringConfig(defaultSpring: SpringConfig) {
+        this.defaultSpring = defaultSpring
+    }
+
+    fun setDefaultFlingConfig(defaultFling: FlingConfig) {
+        this.defaultFling = defaultFling
+    }
+
     /** Starts the animations! */
     fun start() {
         startAction()
@@ -752,7 +782,7 @@
     ) {
 
         constructor() :
-                this(defaultSpring.stiffness, defaultSpring.dampingRatio)
+                this(globalDefaultSpring.stiffness, globalDefaultSpring.dampingRatio)
 
         constructor(stiffness: Float, dampingRatio: Float) :
                 this(stiffness = stiffness, dampingRatio = dampingRatio, startVelocity = 0f)
@@ -782,10 +812,10 @@
         internal var startVelocity: Float
     ) {
 
-        constructor() : this(defaultFling.friction)
+        constructor() : this(globalDefaultFling.friction)
 
         constructor(friction: Float) :
-                this(friction, defaultFling.min, defaultFling.max)
+                this(friction, globalDefaultFling.min, globalDefaultFling.max)
 
         constructor(friction: Float, min: Float, max: Float) :
                 this(friction, min, max, startVelocity = 0f)
diff --git a/packages/SystemUI/src/com/android/systemui/util/concurrency/ConcurrencyModule.java b/packages/SystemUI/src/com/android/systemui/util/concurrency/ConcurrencyModule.java
index cc6d607..8acfbf2 100644
--- a/packages/SystemUI/src/com/android/systemui/util/concurrency/ConcurrencyModule.java
+++ b/packages/SystemUI/src/com/android/systemui/util/concurrency/ConcurrencyModule.java
@@ -137,6 +137,36 @@
     }
 
     /**
+     * Provide a Background-Thread Executor by default.
+     */
+    @Provides
+    @Singleton
+    public static RepeatableExecutor provideRepeatableExecutor(@Background DelayableExecutor exec) {
+        return new RepeatableExecutorImpl(exec);
+    }
+
+    /**
+     * Provide a Background-Thread Executor.
+     */
+    @Provides
+    @Singleton
+    @Background
+    public static RepeatableExecutor provideBackgroundRepeatableExecutor(
+            @Background DelayableExecutor exec) {
+        return new RepeatableExecutorImpl(exec);
+    }
+
+    /**
+     * Provide a Main-Thread Executor.
+     */
+    @Provides
+    @Singleton
+    @Main
+    public static RepeatableExecutor provideMainRepeatableExecutor(@Main DelayableExecutor exec) {
+        return new RepeatableExecutorImpl(exec);
+    }
+
+    /**
      * Provide an Executor specifically for running UI operations on a separate thread.
      *
      * Keep submitted runnables short and to the point, just as with any other UI code.
diff --git a/packages/SystemUI/src/com/android/systemui/util/concurrency/RepeatableExecutor.java b/packages/SystemUI/src/com/android/systemui/util/concurrency/RepeatableExecutor.java
new file mode 100644
index 0000000..aefdc99
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/util/concurrency/RepeatableExecutor.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2019 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.util.concurrency;
+
+import java.util.concurrent.Executor;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * A sub-class of {@link Executor} that allows scheduling commands to execute periodically.
+ */
+public interface RepeatableExecutor extends Executor {
+
+    /**
+     * Execute supplied Runnable on the Executors thread after initial delay, and subsequently with
+     * the given delay between the termination of one execution and the commencement of the next.
+     *
+     * Each invocation of the supplied Runnable will be scheduled after the previous invocation
+     * completes. For example, if you schedule the Runnable with a 60 second delay, and the Runnable
+     * itself takes 1 second, the effective delay will be 61 seconds between each invocation.
+     *
+     * See {@link java.util.concurrent.ScheduledExecutorService#scheduleRepeatedly(Runnable,
+     * long, long)}
+     *
+     * @return A Runnable that, when run, removes the supplied argument from the Executor queue.
+     */
+    default Runnable executeRepeatedly(Runnable r, long initialDelayMillis, long delayMillis) {
+        return executeRepeatedly(r, initialDelayMillis, delayMillis, TimeUnit.MILLISECONDS);
+    }
+
+    /**
+     * Execute supplied Runnable on the Executors thread after initial delay, and subsequently with
+     * the given delay between the termination of one execution and the commencement of the next..
+     *
+     * See {@link java.util.concurrent.ScheduledExecutorService#scheduleRepeatedly(Runnable,
+     * long, long)}
+     *
+     * @return A Runnable that, when run, removes the supplied argument from the Executor queue.
+     */
+    Runnable executeRepeatedly(Runnable r, long initialDelay, long delay, TimeUnit unit);
+}
diff --git a/packages/SystemUI/src/com/android/systemui/util/concurrency/RepeatableExecutorImpl.java b/packages/SystemUI/src/com/android/systemui/util/concurrency/RepeatableExecutorImpl.java
new file mode 100644
index 0000000..c03e10e
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/util/concurrency/RepeatableExecutorImpl.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2019 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.util.concurrency;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Implementation of {@link RepeatableExecutor} for SystemUI.
+ */
+class RepeatableExecutorImpl implements RepeatableExecutor {
+
+    private final DelayableExecutor mExecutor;
+
+    RepeatableExecutorImpl(DelayableExecutor executor) {
+        mExecutor = executor;
+    }
+
+    @Override
+    public void execute(Runnable command) {
+        mExecutor.execute(command);
+    }
+
+    @Override
+    public Runnable executeRepeatedly(Runnable r, long initDelay, long delay, TimeUnit unit) {
+        ExecutionToken token = new ExecutionToken(r, delay, unit);
+        token.start(initDelay, unit);
+        return token::cancel;
+    }
+
+    private class ExecutionToken implements Runnable {
+        private final Runnable mCommand;
+        private final long mDelay;
+        private final TimeUnit mUnit;
+        private final Object mLock = new Object();
+        private Runnable mCancel;
+
+        ExecutionToken(Runnable r, long delay, TimeUnit unit) {
+            mCommand = r;
+            mDelay = delay;
+            mUnit = unit;
+        }
+
+        @Override
+        public void run() {
+            mCommand.run();
+            synchronized (mLock) {
+                if (mCancel != null) {
+                    mCancel = mExecutor.executeDelayed(this, mDelay, mUnit);
+                }
+            }
+        }
+
+        /** Starts execution that will repeat the command until {@link cancel}. */
+        public void start(long startDelay, TimeUnit unit) {
+            synchronized (mLock) {
+                mCancel = mExecutor.executeDelayed(this, startDelay, unit);
+            }
+        }
+
+        /** Cancel repeated execution of command. */
+        public void cancel() {
+            synchronized (mLock) {
+                if (mCancel != null) {
+                    mCancel.run();
+                    mCancel = null;
+                }
+            }
+        }
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/util/magnetictarget/MagnetizedObject.kt b/packages/SystemUI/src/com/android/systemui/util/magnetictarget/MagnetizedObject.kt
index f27bdbf..e905e67 100644
--- a/packages/SystemUI/src/com/android/systemui/util/magnetictarget/MagnetizedObject.kt
+++ b/packages/SystemUI/src/com/android/systemui/util/magnetictarget/MagnetizedObject.kt
@@ -27,6 +27,7 @@
 import android.view.MotionEvent
 import android.view.VelocityTracker
 import android.view.View
+import android.view.ViewConfiguration
 import androidx.dynamicanimation.animation.DynamicAnimation
 import androidx.dynamicanimation.animation.FloatPropertyCompat
 import androidx.dynamicanimation.animation.SpringForce
@@ -146,6 +147,10 @@
     private val velocityTracker: VelocityTracker = VelocityTracker.obtain()
     private val vibrator: Vibrator = context.getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
 
+    private var touchDown = PointF()
+    private var touchSlop = 0
+    private var movedBeyondSlop = false
+
     /** Whether touch events are presently occurring within the magnetic field area of a target. */
     val objectStuckToTarget: Boolean
         get() = targetObjectIsStuckTo != null
@@ -324,15 +329,32 @@
         // When a gesture begins, recalculate target views' positions on the screen in case they
         // have changed. Also, clear state.
         if (ev.action == MotionEvent.ACTION_DOWN) {
-            updateTargetViewLocations()
+            updateTargetViews()
 
-            // Clear the velocity tracker and assume we're not stuck to a target yet.
+            // Clear the velocity tracker and stuck target.
             velocityTracker.clear()
             targetObjectIsStuckTo = null
+
+            // Set the touch down coordinates and reset movedBeyondSlop.
+            touchDown.set(ev.rawX, ev.rawY)
+            movedBeyondSlop = false
         }
 
+        // Always pass events to the VelocityTracker.
         addMovement(ev)
 
+        // If we haven't yet moved beyond the slop distance, check if we have.
+        if (!movedBeyondSlop) {
+            val dragDistance = hypot(ev.rawX - touchDown.x, ev.rawY - touchDown.y)
+            if (dragDistance > touchSlop) {
+                // If we're beyond the slop distance, save that and continue.
+                movedBeyondSlop = true
+            } else {
+                // Otherwise, don't do anything yet.
+                return false
+            }
+        }
+
         val targetObjectIsInMagneticFieldOf = associatedTargets.firstOrNull { target ->
             val distanceFromTargetCenter = hypot(
                     ev.rawX - target.centerOnScreen.x,
@@ -559,8 +581,14 @@
     }
 
     /** Updates the locations on screen of all of the [associatedTargets]. */
-    internal fun updateTargetViewLocations() {
+    internal fun updateTargetViews() {
         associatedTargets.forEach { it.updateLocationOnScreen() }
+
+        // Update the touch slop, since the configuration may have changed.
+        if (associatedTargets.size > 0) {
+            touchSlop =
+                    ViewConfiguration.get(associatedTargets[0].targetView.context).scaledTouchSlop
+        }
     }
 
     /**
diff --git a/packages/SystemUI/src/com/android/systemui/wm/SystemWindows.java b/packages/SystemUI/src/com/android/systemui/wm/SystemWindows.java
index e5da603..899aabb 100644
--- a/packages/SystemUI/src/com/android/systemui/wm/SystemWindows.java
+++ b/packages/SystemUI/src/com/android/systemui/wm/SystemWindows.java
@@ -32,6 +32,7 @@
 import android.view.Display;
 import android.view.DisplayCutout;
 import android.view.DragEvent;
+import android.view.IScrollCaptureController;
 import android.view.IWindow;
 import android.view.IWindowManager;
 import android.view.IWindowSession;
@@ -352,5 +353,14 @@
 
         @Override
         public void dispatchPointerCaptureChanged(boolean hasCapture) {}
+
+        @Override
+        public void requestScrollCapture(IScrollCaptureController controller) {
+            try {
+                controller.onClientUnavailable();
+            } catch (RemoteException ex) {
+                // ignore
+            }
+        }
     }
 }
diff --git a/packages/SystemUI/tests/src/com/android/AAAPlusPlusVerifySysuiRequiredTestPropertiesTest.java b/packages/SystemUI/tests/src/com/android/AAAPlusPlusVerifySysuiRequiredTestPropertiesTest.java
index b97f55c..594f0b1 100644
--- a/packages/SystemUI/tests/src/com/android/AAAPlusPlusVerifySysuiRequiredTestPropertiesTest.java
+++ b/packages/SystemUI/tests/src/com/android/AAAPlusPlusVerifySysuiRequiredTestPropertiesTest.java
@@ -18,7 +18,6 @@
 import static org.hamcrest.Matchers.is;
 import static org.junit.Assert.assertThat;
 
-import android.content.pm.PackageManager;
 import android.testing.AndroidTestingRunner;
 import android.text.TextUtils;
 import android.util.Log;
@@ -117,12 +116,6 @@
         filter.add(s -> s.startsWith("com.android.systemui")
                 || s.startsWith("com.android.keyguard"));
 
-
-        if (!mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)) {
-            // If it's not automotive target, exclude automotive classes from the test.
-            excludeAutomotiveClasses(filter);
-        }
-
         try {
             return scanner.getClassPathEntries(filter);
         } catch (IOException e) {
@@ -131,13 +124,6 @@
         return Collections.emptyList();
     }
 
-    private void excludeAutomotiveClasses(ChainedClassNameFilter filter) {
-        // Modifies the passed in filter.
-        filter.add(s -> !s.startsWith("com.android.systemui.statusbar.car."));
-        filter.add(s -> !s.startsWith("com.android.systemui.qs.car."));
-        filter.add(s -> !s.startsWith("com.android.systemui.car."));
-    }
-
     private String getClsStr() {
         return TextUtils.join(",", Arrays.asList(BASE_CLS_WHITELIST)
                 .stream().map(cls -> cls.getSimpleName()).toArray());
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardHostViewTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardHostViewTest.java
index 25f279b..dd5c833 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardHostViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardHostViewTest.java
@@ -17,30 +17,50 @@
 package com.android.keyguard;
 
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
 
 import android.test.suitebuilder.annotation.SmallTest;
 import android.testing.AndroidTestingRunner;
 import android.testing.TestableLooper;
 
+import com.android.internal.widget.LockPatternUtils;
 import com.android.systemui.SysuiTestCase;
 import com.android.systemui.plugins.ActivityStarter.OnDismissAction;
 
 import org.junit.Assert;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
 
 @SmallTest
 @RunWith(AndroidTestingRunner.class)
 @TestableLooper.RunWithLooper
 public class KeyguardHostViewTest extends SysuiTestCase {
 
+    @Mock
+    private KeyguardSecurityContainer mSecurityContainer;
+    @Mock
+    private LockPatternUtils mLockPatternUtils;
+    @Rule
+    public MockitoRule mMockitoRule = MockitoJUnit.rule();
+
     private KeyguardHostView mKeyguardHostView;
 
     @Before
     public void setup() {
         mDependency.injectMockDependency(KeyguardUpdateMonitor.class);
-        mKeyguardHostView = new KeyguardHostView(getContext());
+        mKeyguardHostView = new KeyguardHostView(getContext()) {
+            @Override
+            protected void onFinishInflate() {
+                mSecurityContainer = KeyguardHostViewTest.this.mSecurityContainer;
+                mLockPatternUtils = KeyguardHostViewTest.this.mLockPatternUtils;
+            }
+        };
+        mKeyguardHostView.onFinishInflate();
     }
 
     @Test
@@ -50,4 +70,10 @@
                 null /* cancelAction */);
         Assert.assertTrue("Action should exist", mKeyguardHostView.hasDismissActions());
     }
+
+    @Test
+    public void testOnStartingToHide() {
+        mKeyguardHostView.onStartingToHide();
+        verify(mSecurityContainer).onStartingToHide();
+    }
 }
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java
index 7403a11..6c00eca 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java
@@ -61,6 +61,7 @@
 import android.telephony.ServiceState;
 import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
 import android.test.suitebuilder.annotation.SmallTest;
 import android.testing.AndroidTestingRunner;
 import android.testing.TestableContext;
@@ -133,20 +134,23 @@
     @Mock
     private BroadcastDispatcher mBroadcastDispatcher;
     @Mock
-    private Executor mBackgroundExecutor;
-    @Mock
     private RingerModeTracker mRingerModeTracker;
     @Mock
     private LiveData<Integer> mRingerModeLiveData;
+    @Mock
+    private TelephonyManager mTelephonyManager;
+    // Direct executor
+    private Executor mBackgroundExecutor = Runnable::run;
     private TestableLooper mTestableLooper;
     private TestableKeyguardUpdateMonitor mKeyguardUpdateMonitor;
+    private TestableContext mSpiedContext;
 
     @Before
     public void setup() {
         MockitoAnnotations.initMocks(this);
-        TestableContext context = spy(mContext);
+        mSpiedContext = spy(mContext);
         when(mPackageManager.hasSystemFeature(anyString())).thenReturn(true);
-        when(context.getPackageManager()).thenReturn(mPackageManager);
+        when(mSpiedContext.getPackageManager()).thenReturn(mPackageManager);
         doAnswer(invocation -> {
             IBiometricEnabledOnKeyguardCallback callback = invocation.getArgument(0);
             callback.onChanged(BiometricSourceType.FACE, true /* enabled */,
@@ -161,19 +165,20 @@
         when(mStrongAuthTracker
                 .isUnlockingWithBiometricAllowed(anyBoolean() /* isStrongBiometric */))
                 .thenReturn(true);
-        context.addMockSystemService(TrustManager.class, mTrustManager);
-        context.addMockSystemService(FingerprintManager.class, mFingerprintManager);
-        context.addMockSystemService(BiometricManager.class, mBiometricManager);
-        context.addMockSystemService(FaceManager.class, mFaceManager);
-        context.addMockSystemService(UserManager.class, mUserManager);
-        context.addMockSystemService(DevicePolicyManager.class, mDevicePolicyManager);
-        context.addMockSystemService(SubscriptionManager.class, mSubscriptionManager);
+        mSpiedContext.addMockSystemService(TrustManager.class, mTrustManager);
+        mSpiedContext.addMockSystemService(FingerprintManager.class, mFingerprintManager);
+        mSpiedContext.addMockSystemService(BiometricManager.class, mBiometricManager);
+        mSpiedContext.addMockSystemService(FaceManager.class, mFaceManager);
+        mSpiedContext.addMockSystemService(UserManager.class, mUserManager);
+        mSpiedContext.addMockSystemService(DevicePolicyManager.class, mDevicePolicyManager);
+        mSpiedContext.addMockSystemService(SubscriptionManager.class, mSubscriptionManager);
+        mSpiedContext.addMockSystemService(TelephonyManager.class, mTelephonyManager);
 
         when(mRingerModeTracker.getRingerMode()).thenReturn(mRingerModeLiveData);
 
         mTestableLooper = TestableLooper.get(this);
         allowTestableLooperAsMainThread();
-        mKeyguardUpdateMonitor = new TestableKeyguardUpdateMonitor(context);
+        mKeyguardUpdateMonitor = new TestableKeyguardUpdateMonitor(mSpiedContext);
     }
 
     @After
@@ -192,6 +197,22 @@
     }
 
     @Test
+    public void testSimStateInitialized() {
+        final int subId = 3;
+        final int state = TelephonyManager.SIM_STATE_ABSENT;
+
+        when(mTelephonyManager.getActiveModemCount()).thenReturn(1);
+        when(mTelephonyManager.getSimState(anyInt())).thenReturn(state);
+        when(mSubscriptionManager.getSubscriptionIds(anyInt())).thenReturn(new int[] { subId });
+
+        KeyguardUpdateMonitor testKUM = new TestableKeyguardUpdateMonitor(mSpiedContext);
+
+        mTestableLooper.processAllMessages();
+
+        assertThat(testKUM.getSimState(subId)).isEqualTo(state);
+    }
+
+    @Test
     public void testIgnoresSimStateCallback_rebroadcast() {
         Intent intent = new Intent(TelephonyIntents.ACTION_SIM_STATE_CHANGED);
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/ImageWallpaperTest.java b/packages/SystemUI/tests/src/com/android/systemui/ImageWallpaperTest.java
index 5227aaf..0c69ffd 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/ImageWallpaperTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/ImageWallpaperTest.java
@@ -16,7 +16,6 @@
 
 package com.android.systemui;
 
-import static com.google.common.truth.Truth.assertThat;
 import static com.google.common.truth.Truth.assertWithMessage;
 
 import static org.mockito.Mockito.doReturn;
@@ -32,19 +31,16 @@
 import android.content.res.Resources;
 import android.graphics.Bitmap;
 import android.graphics.ColorSpace;
-import android.graphics.Rect;
 import android.hardware.display.DisplayManagerGlobal;
 import android.os.Handler;
 import android.test.suitebuilder.annotation.SmallTest;
 import android.testing.AndroidTestingRunner;
 import android.testing.TestableLooper;
-import android.util.Size;
 import android.view.Display;
 import android.view.DisplayInfo;
 import android.view.SurfaceHolder;
 
 import com.android.systemui.glwallpaper.ImageWallpaperRenderer;
-import com.android.systemui.statusbar.phone.DozeParameters;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -72,8 +68,6 @@
     @Mock
     private Bitmap mWallpaperBitmap;
     @Mock
-    private DozeParameters mDozeParam;
-    @Mock
     private Handler mHandler;
 
     private CountDownLatch mEventCountdown;
@@ -100,14 +94,13 @@
         when(wallpaperManager.getBitmap(false)).thenReturn(mWallpaperBitmap);
         when(mWallpaperBitmap.getColorSpace()).thenReturn(ColorSpace.get(ColorSpace.Named.SRGB));
         when(mWallpaperBitmap.getConfig()).thenReturn(Bitmap.Config.ARGB_8888);
-        when(mDozeParam.getDisplayNeedsBlanking()).thenReturn(false);
     }
 
     private ImageWallpaper createImageWallpaper() {
-        return new ImageWallpaper(mDozeParam) {
+        return new ImageWallpaper() {
             @Override
             public Engine onCreateEngine() {
-                return new GLEngine(mDozeParam, mHandler) {
+                return new GLEngine(mHandler) {
                     @Override
                     public Context getDisplayContext() {
                         return mMockContext;
@@ -130,75 +123,52 @@
         };
     }
 
-    private ImageWallpaperRenderer createImageWallpaperRenderer(ImageWallpaper.GLEngine engine) {
-        return new ImageWallpaperRenderer(mMockContext, engine) {
-            @Override
-            public void startProcessingImage() {
-                // No - Op
-            }
-        };
-    }
-
     @Test
     public void testBitmapWallpaper_normal() {
         // Will use a image wallpaper with dimensions DISPLAY_WIDTH x DISPLAY_WIDTH.
         // Then we expect the surface size will be also DISPLAY_WIDTH x DISPLAY_WIDTH.
-        // Finally, we assert the transition will not be stopped.
-        verifySurfaceSizeAndAssertTransition(DISPLAY_WIDTH /* bmpWidth */,
+        verifySurfaceSize(DISPLAY_WIDTH /* bmpWidth */,
                 DISPLAY_WIDTH /* bmpHeight */,
                 DISPLAY_WIDTH /* surfaceWidth */,
-                DISPLAY_WIDTH /* surfaceHeight */,
-                false /* assertion */);
+                DISPLAY_WIDTH /* surfaceHeight */);
     }
 
     @Test
     public void testBitmapWallpaper_low_resolution() {
         // Will use a image wallpaper with dimensions BMP_WIDTH x BMP_HEIGHT.
         // Then we expect the surface size will be also BMP_WIDTH x BMP_HEIGHT.
-        // Finally, we assert the transition will be stopped.
-        verifySurfaceSizeAndAssertTransition(LOW_BMP_WIDTH /* bmpWidth */,
+        verifySurfaceSize(LOW_BMP_WIDTH /* bmpWidth */,
                 LOW_BMP_HEIGHT /* bmpHeight */,
                 LOW_BMP_WIDTH /* surfaceWidth */,
-                LOW_BMP_HEIGHT /* surfaceHeight */,
-                false /* assertion */);
+                LOW_BMP_HEIGHT /* surfaceHeight */);
     }
 
     @Test
     public void testBitmapWallpaper_too_small() {
         // Will use a image wallpaper with dimensions INVALID_BMP_WIDTH x INVALID_BMP_HEIGHT.
         // Then we expect the surface size will be also MIN_SURFACE_WIDTH x MIN_SURFACE_HEIGHT.
-        // Finally, we assert the transition will be stopped.
-        verifySurfaceSizeAndAssertTransition(INVALID_BMP_WIDTH /* bmpWidth */,
+        verifySurfaceSize(INVALID_BMP_WIDTH /* bmpWidth */,
                 INVALID_BMP_HEIGHT /* bmpHeight */,
                 ImageWallpaper.GLEngine.MIN_SURFACE_WIDTH /* surfaceWidth */,
-                ImageWallpaper.GLEngine.MIN_SURFACE_HEIGHT /* surfaceHeight */,
-                false /* assertion */);
+                ImageWallpaper.GLEngine.MIN_SURFACE_HEIGHT /* surfaceHeight */);
     }
 
-    private void verifySurfaceSizeAndAssertTransition(int bmpWidth, int bmpHeight,
-            int surfaceWidth, int surfaceHeight, boolean assertion) {
+    private void verifySurfaceSize(int bmpWidth, int bmpHeight,
+            int surfaceWidth, int surfaceHeight) {
         ImageWallpaper.GLEngine wallpaperEngine =
                 (ImageWallpaper.GLEngine) createImageWallpaper().onCreateEngine();
 
         ImageWallpaper.GLEngine engineSpy = spy(wallpaperEngine);
-        when(engineSpy.mIsHighEndGfx).thenReturn(true);
 
         when(mWallpaperBitmap.getWidth()).thenReturn(bmpWidth);
         when(mWallpaperBitmap.getHeight()).thenReturn(bmpHeight);
 
-        ImageWallpaperRenderer renderer = createImageWallpaperRenderer(engineSpy);
+        ImageWallpaperRenderer renderer = new ImageWallpaperRenderer(mMockContext);
         doReturn(renderer).when(engineSpy).getRendererInstance();
         engineSpy.onCreate(engineSpy.getSurfaceHolder());
 
         verify(mSurfaceHolder, times(1)).setFixedSize(surfaceWidth, surfaceHeight);
         assertWithMessage("setFixedSizeAllowed should have been called.").that(
                 mEventCountdown.getCount()).isEqualTo(0);
-
-        Size frameSize = renderer.reportSurfaceSize();
-        Rect frame = new Rect(0, 0, frameSize.getWidth(), frameSize.getHeight());
-        when(mSurfaceHolder.getSurfaceFrame()).thenReturn(frame);
-
-        assertThat(engineSpy.checkIfShouldStopTransition()).isEqualTo(assertion);
-        // destroy
     }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleControllerTest.java
index e472de3..c2b3506 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleControllerTest.java
@@ -42,6 +42,7 @@
 import static org.mockito.Mockito.when;
 
 import android.app.IActivityManager;
+import android.app.INotificationManager;
 import android.app.Notification;
 import android.app.PendingIntent;
 import android.content.res.Resources;
@@ -84,6 +85,7 @@
 import com.android.systemui.statusbar.phone.LockscreenLockIconController;
 import com.android.systemui.statusbar.phone.NotificationGroupManager;
 import com.android.systemui.statusbar.phone.NotificationShadeWindowController;
+import com.android.systemui.statusbar.phone.NotificationShadeWindowView;
 import com.android.systemui.statusbar.phone.ShadeController;
 import com.android.systemui.statusbar.policy.BatteryController;
 import com.android.systemui.statusbar.policy.ConfigurationController;
@@ -156,6 +158,7 @@
     private NotificationTestHelper mNotificationTestHelper;
     private ExpandableNotificationRow mRow;
     private ExpandableNotificationRow mRow2;
+    private ExpandableNotificationRow mRow3;
     private ExpandableNotificationRow mNonBubbleNotifRow;
 
     @Mock
@@ -182,6 +185,8 @@
     private DumpManager mDumpManager;
     @Mock
     private LockscreenLockIconController mLockIconController;
+    @Mock
+    private NotificationShadeWindowView mNotificationShadeWindowView;
 
     private SuperStatusBarViewFactory mSuperStatusBarViewFactory;
     private BubbleData mBubbleData;
@@ -218,8 +223,7 @@
                 mWindowManager, mActivityManager, mDozeParameters, mStatusBarStateController,
                 mConfigurationController, mKeyguardBypassController, mColorExtractor,
                 mDumpManager);
-        mNotificationShadeWindowController.setNotificationShadeView(
-                mSuperStatusBarViewFactory.getNotificationShadeWindowView());
+        mNotificationShadeWindowController.setNotificationShadeView(mNotificationShadeWindowView);
         mNotificationShadeWindowController.attach();
 
         // Need notifications for bubbles
@@ -229,6 +233,7 @@
                 TestableLooper.get(this));
         mRow = mNotificationTestHelper.createBubble(mDeleteIntent);
         mRow2 = mNotificationTestHelper.createBubble(mDeleteIntent);
+        mRow3 = mNotificationTestHelper.createBubble(mDeleteIntent);
         mNonBubbleNotifRow = mNotificationTestHelper.createRow();
 
         // Return non-null notification data from the NEM
@@ -273,7 +278,8 @@
                 mFeatureFlagsOldPipeline,
                 mDumpManager,
                 mFloatingContentCoordinator,
-                mSysUiState);
+                mSysUiState,
+                mock(INotificationManager.class));
         mBubbleController.setBubbleStateChangeListener(mBubbleStateChangeListener);
         mBubbleController.setExpandListener(mBubbleExpandListener);
 
@@ -307,7 +313,7 @@
     @Test
     public void testRemoveBubble() {
         mBubbleController.updateBubble(mRow.getEntry());
-        assertNotNull(mBubbleData.getBubbleWithKey(mRow.getEntry().getKey()));
+        assertNotNull(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()));
         assertTrue(mBubbleController.hasBubbles());
         verify(mNotificationEntryManager).updateNotifications(any());
         verify(mBubbleStateChangeListener).onHasBubblesChanged(true);
@@ -315,7 +321,7 @@
         mBubbleController.removeBubble(
                 mRow.getEntry(), BubbleController.DISMISS_USER_GESTURE);
         assertFalse(mNotificationShadeWindowController.getBubblesShowing());
-        assertNull(mBubbleData.getBubbleWithKey(mRow.getEntry().getKey()));
+        assertNull(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()));
         verify(mNotificationEntryManager, times(2)).updateNotifications(anyString());
         verify(mBubbleStateChangeListener).onHasBubblesChanged(false);
 
@@ -331,8 +337,11 @@
 
         Bubble b = mBubbleData.getOverflowBubbleWithKey(mRow.getEntry().getKey());
         assertThat(mBubbleData.getOverflowBubbles()).isEqualTo(ImmutableList.of(b));
+        verify(mNotificationEntryManager, never()).performRemoveNotification(
+                eq(mRow.getEntry().getSbn()), anyInt());
+        assertFalse(mRow.getEntry().isBubble());
 
-        Bubble b2 = mBubbleData.getBubbleWithKey(mRow2.getEntry().getKey());
+        Bubble b2 = mBubbleData.getBubbleInStackWithKey(mRow2.getEntry().getKey());
         assertThat(mBubbleData.getSelectedBubble()).isEqualTo(b2);
 
         mBubbleController.promoteBubbleFromOverflow(b);
@@ -340,45 +349,49 @@
     }
 
     @Test
-    public void testRemoveBubble_withDismissedNotif() {
-        mEntryListener.onPendingEntryAdded(mRow.getEntry());
-        mBubbleController.updateBubble(mRow.getEntry());
-
-        assertTrue(mBubbleController.hasBubbles());
-        assertFalse(mBubbleController.isBubbleNotificationSuppressedFromShade(
-                mRow.getEntry()));
-
-        // Make it look like dismissed notif
-        mBubbleData.getBubbleWithKey(mRow.getEntry().getKey()).setSuppressNotification(true);
-
-        // Now remove the bubble
+    public void testCancelOverflowBubble() {
+        mBubbleController.updateBubble(mRow2.getEntry());
+        mBubbleController.updateBubble(mRow.getEntry(), /* suppressFlyout */
+                false, /* showInShade */ true);
         mBubbleController.removeBubble(
                 mRow.getEntry(), BubbleController.DISMISS_USER_GESTURE);
 
-        // Since the notif is dismissed, once the bubble is removed, performRemoveNotification gets
-        // called to really remove the notif
+        mBubbleController.removeBubble(mRow.getEntry(), BubbleController.DISMISS_NOTIF_CANCEL);
         verify(mNotificationEntryManager, times(1)).performRemoveNotification(
                 eq(mRow.getEntry().getSbn()), anyInt());
-        assertFalse(mBubbleController.hasBubbles());
+        assertThat(mBubbleData.getOverflowBubbles()).isEmpty();
+        assertFalse(mRow.getEntry().isBubble());
+    }
 
+    @Test
+    public void testUserChange_doesNotRemoveNotif() {
+        mBubbleController.updateBubble(mRow.getEntry());
+        assertTrue(mBubbleController.hasBubbles());
+
+        mBubbleController.removeBubble(
+                mRow.getEntry(), BubbleController.DISMISS_USER_CHANGED);
+        verify(mNotificationEntryManager, never()).performRemoveNotification(
+                eq(mRow.getEntry().getSbn()), anyInt());
+        assertFalse(mBubbleController.hasBubbles());
         assertFalse(mSysUiStateBubblesExpanded);
+        assertTrue(mRow.getEntry().isBubble());
     }
 
     @Test
     public void testDismissStack() {
         mBubbleController.updateBubble(mRow.getEntry());
         verify(mNotificationEntryManager, times(1)).updateNotifications(any());
-        assertNotNull(mBubbleData.getBubbleWithKey(mRow.getEntry().getKey()));
+        assertNotNull(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()));
         mBubbleController.updateBubble(mRow2.getEntry());
         verify(mNotificationEntryManager, times(2)).updateNotifications(any());
-        assertNotNull(mBubbleData.getBubbleWithKey(mRow2.getEntry().getKey()));
+        assertNotNull(mBubbleData.getBubbleInStackWithKey(mRow2.getEntry().getKey()));
         assertTrue(mBubbleController.hasBubbles());
 
         mBubbleData.dismissAll(BubbleController.DISMISS_USER_GESTURE);
         assertFalse(mNotificationShadeWindowController.getBubblesShowing());
         verify(mNotificationEntryManager, times(3)).updateNotifications(any());
-        assertNull(mBubbleData.getBubbleWithKey(mRow.getEntry().getKey()));
-        assertNull(mBubbleData.getBubbleWithKey(mRow2.getEntry().getKey()));
+        assertNull(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()));
+        assertNull(mBubbleData.getBubbleInStackWithKey(mRow2.getEntry().getKey()));
 
         assertFalse(mSysUiStateBubblesExpanded);
     }
@@ -448,10 +461,10 @@
                 mRow2.getEntry()));
 
         // Switch which bubble is expanded
-        mBubbleData.setSelectedBubble(mBubbleData.getBubbleWithKey(mRow.getEntry().getKey()));
+        mBubbleData.setSelectedBubble(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()));
         mBubbleData.setExpanded(true);
         assertEquals(mRow.getEntry(),
-                mBubbleData.getBubbleWithKey(stackView.getExpandedBubble().getKey()).getEntry());
+                mBubbleData.getBubbleInStackWithKey(stackView.getExpandedBubble().getKey()).getEntry());
         assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
                 mRow.getEntry()));
 
@@ -479,7 +492,7 @@
                 mRow.getEntry()));
 
         mTestableLooper.processAllMessages();
-        assertTrue(mBubbleData.getBubbleWithKey(mRow.getEntry().getKey()).showDot());
+        assertTrue(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()).showDot());
 
         // Expand
         mBubbleData.setExpanded(true);
@@ -492,7 +505,7 @@
         assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
                 mRow.getEntry()));
         // Notif shouldn't show dot after expansion
-        assertFalse(mBubbleData.getBubbleWithKey(mRow.getEntry().getKey()).showDot());
+        assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()).showDot());
     }
 
     @Test
@@ -507,7 +520,7 @@
                 mRow.getEntry()));
 
         mTestableLooper.processAllMessages();
-        assertTrue(mBubbleData.getBubbleWithKey(mRow.getEntry().getKey()).showDot());
+        assertTrue(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()).showDot());
 
         // Expand
         mBubbleData.setExpanded(true);
@@ -520,7 +533,7 @@
         assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
                 mRow.getEntry()));
         // Notif shouldn't show dot after expansion
-        assertFalse(mBubbleData.getBubbleWithKey(mRow.getEntry().getKey()).showDot());
+        assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()).showDot());
 
         // Send update
         mEntryListener.onPreEntryUpdated(mRow.getEntry());
@@ -530,7 +543,7 @@
         assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
                 mRow.getEntry()));
         // Notif shouldn't show dot after expansion
-        assertFalse(mBubbleData.getBubbleWithKey(mRow.getEntry().getKey()).showDot());
+        assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()).showDot());
     }
 
     @Test
@@ -553,24 +566,24 @@
 
         // Last added is the one that is expanded
         assertEquals(mRow2.getEntry(),
-                mBubbleData.getBubbleWithKey(stackView.getExpandedBubble().getKey()).getEntry());
+                mBubbleData.getBubbleInStackWithKey(stackView.getExpandedBubble().getKey()).getEntry());
         assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
                 mRow2.getEntry()));
 
         // Dismiss currently expanded
         mBubbleController.removeBubble(
-                mBubbleData.getBubbleWithKey(stackView.getExpandedBubble().getKey()).getEntry(),
+                mBubbleData.getBubbleInStackWithKey(stackView.getExpandedBubble().getKey()).getEntry(),
                 BubbleController.DISMISS_USER_GESTURE);
         verify(mBubbleExpandListener).onBubbleExpandChanged(false, mRow2.getEntry().getKey());
 
         // Make sure first bubble is selected
         assertEquals(mRow.getEntry(),
-                mBubbleData.getBubbleWithKey(stackView.getExpandedBubble().getKey()).getEntry());
+                mBubbleData.getBubbleInStackWithKey(stackView.getExpandedBubble().getKey()).getEntry());
         verify(mBubbleExpandListener).onBubbleExpandChanged(true, mRow.getEntry().getKey());
 
         // Dismiss that one
         mBubbleController.removeBubble(
-                mBubbleData.getBubbleWithKey(stackView.getExpandedBubble().getKey()).getEntry(),
+                mBubbleData.getBubbleInStackWithKey(stackView.getExpandedBubble().getKey()).getEntry(),
                 BubbleController.DISMISS_USER_GESTURE);
 
         // Make sure state changes and collapse happens
@@ -635,8 +648,8 @@
         assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
                 mRow.getEntry()));
         // Dot + flyout is hidden because notif is suppressed
-        assertFalse(mBubbleData.getBubbleWithKey(mRow.getEntry().getKey()).showDot());
-        assertFalse(mBubbleData.getBubbleWithKey(mRow.getEntry().getKey()).showFlyout());
+        assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()).showDot());
+        assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()).showFlyout());
 
         // # of bubbles should change
         verify(mBubbleStateChangeListener).onHasBubblesChanged(true /* hasBubbles */);
@@ -652,7 +665,7 @@
         assertFalse(mBubbleController.isBubbleNotificationSuppressedFromShade(
                 mRow.getEntry()));
         // Should show dot
-        assertTrue(mBubbleData.getBubbleWithKey(mRow.getEntry().getKey()).showDot());
+        assertTrue(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()).showDot());
 
         // Update to suppress notif
         setMetadataFlags(mRow.getEntry(),
@@ -663,8 +676,8 @@
         assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
                 mRow.getEntry()));
         // Dot + flyout is hidden because notif is suppressed
-        assertFalse(mBubbleData.getBubbleWithKey(mRow.getEntry().getKey()).showDot());
-        assertFalse(mBubbleData.getBubbleWithKey(mRow.getEntry().getKey()).showFlyout());
+        assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()).showDot());
+        assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()).showFlyout());
 
         // # of bubbles should change
         verify(mBubbleStateChangeListener).onHasBubblesChanged(true /* hasBubbles */);
@@ -695,7 +708,7 @@
                 mRow.getEntry()));
 
         mTestableLooper.processAllMessages();
-        assertTrue(mBubbleData.getBubbleWithKey(mRow.getEntry().getKey()).showDot());
+        assertTrue(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()).showDot());
     }
 
     @Test
@@ -808,7 +821,29 @@
     }
 
     @Test
-    public void removeBubble_succeeds_userDismissBubble_userDimissNotif() {
+    public void removeNotif_inOverflow_intercepted() {
+        // Get bubble with notif in shade.
+        mEntryListener.onPendingEntryAdded(mRow.getEntry());
+        mBubbleController.updateBubble(mRow.getEntry());
+        assertTrue(mBubbleController.hasBubbles());
+        assertFalse(mBubbleController.isBubbleNotificationSuppressedFromShade(
+                mRow.getEntry()));
+
+        // Dismiss the bubble into overflow.
+        mBubbleController.removeBubble(
+                mRow.getEntry(), BubbleController.DISMISS_USER_GESTURE);
+        assertFalse(mBubbleController.hasBubbles());
+
+        boolean intercepted = mRemoveInterceptor.onNotificationRemoveRequested(
+                mRow.getEntry().getKey(), mRow.getEntry(), REASON_CANCEL);
+
+        // Notif is no longer a bubble, but still in overflow, so we intercept removal.
+        assertTrue(intercepted);
+    }
+
+    @Test
+    public void removeNotif_notInOverflow_notIntercepted() {
+        // Get bubble with notif in shade.
         mEntryListener.onPendingEntryAdded(mRow.getEntry());
         mBubbleController.updateBubble(mRow.getEntry());
 
@@ -816,20 +851,43 @@
         assertFalse(mBubbleController.isBubbleNotificationSuppressedFromShade(
                 mRow.getEntry()));
 
-        // Dismiss the bubble
         mBubbleController.removeBubble(
-                mRow.getEntry(), BubbleController.DISMISS_USER_GESTURE);
+                mRow.getEntry(), BubbleController.DISMISS_NO_LONGER_BUBBLE);
         assertFalse(mBubbleController.hasBubbles());
 
-        // Dismiss the notification
         boolean intercepted = mRemoveInterceptor.onNotificationRemoveRequested(
                 mRow.getEntry().getKey(), mRow.getEntry(), REASON_CANCEL);
 
-        // It's no longer a bubble so we shouldn't intercept
+        // Notif is no longer a bubble, so we should not intercept removal.
         assertFalse(intercepted);
     }
 
     @Test
+    public void testOverflowBubble_maxReached_notInShade_bubbleRemoved() {
+        mBubbleController.updateBubble(
+                mRow.getEntry(), /* suppressFlyout */ false, /* showInShade */ false);
+        mBubbleController.updateBubble(
+                mRow2.getEntry(), /* suppressFlyout */ false, /* showInShade */ false);
+        mBubbleController.updateBubble(
+                mRow3.getEntry(), /* suppressFlyout */ false, /* showInShade */ false);
+        assertEquals(mBubbleData.getBubbles().size(), 3);
+
+        mBubbleData.setMaxOverflowBubbles(1);
+        mBubbleController.removeBubble(
+                mRow.getEntry(), BubbleController.DISMISS_USER_GESTURE);
+        assertEquals(mBubbleData.getBubbles().size(), 2);
+        assertEquals(mBubbleData.getOverflowBubbles().size(), 1);
+
+        mBubbleController.removeBubble(
+                mRow2.getEntry(), BubbleController.DISMISS_USER_GESTURE);
+        // Overflow max of 1 is reached; mRow is oldest, so it gets removed
+        verify(mNotificationEntryManager, times(1)).performRemoveNotification(
+                mRow.getEntry().getSbn(), REASON_CANCEL);
+        assertEquals(mBubbleData.getBubbles().size(), 1);
+        assertEquals(mBubbleData.getOverflowBubbles().size(), 1);
+    }
+
+    @Test
     public void testNotifyShadeSuppressionChange_notificationDismiss() {
         BubbleController.NotificationSuppressionChangedListener listener =
                 mock(BubbleController.NotificationSuppressionChangedListener.class);
@@ -850,7 +908,7 @@
 
         // Should notify delegate that shade state changed
         verify(listener).onBubbleNotificationSuppressionChange(
-                mBubbleData.getBubbleWithKey(mRow.getEntry().getKey()));
+                mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()));
     }
 
     @Test
@@ -873,7 +931,7 @@
 
         // Should notify delegate that shade state changed
         verify(listener).onBubbleNotificationSuppressionChange(
-                mBubbleData.getBubbleWithKey(mRow.getEntry().getKey()));
+                mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()));
     }
 
     @Test
@@ -883,7 +941,7 @@
         ExpandableNotificationRow groupedBubble = mNotificationTestHelper.createBubbleInGroup();
         mEntryListener.onPendingEntryAdded(groupedBubble.getEntry());
         groupSummary.addChildNotification(groupedBubble);
-        assertTrue(mBubbleData.hasBubbleWithKey(groupedBubble.getEntry().getKey()));
+        assertTrue(mBubbleData.hasBubbleInStackWithKey(groupedBubble.getEntry().getKey()));
 
         // WHEN the summary is dismissed
         mBubbleController.handleDismissalInterception(groupSummary.getEntry());
@@ -901,7 +959,7 @@
         ExpandableNotificationRow groupedBubble = mNotificationTestHelper.createBubbleInGroup();
         mEntryListener.onPendingEntryAdded(groupedBubble.getEntry());
         groupSummary.addChildNotification(groupedBubble);
-        assertTrue(mBubbleData.hasBubbleWithKey(groupedBubble.getEntry().getKey()));
+        assertTrue(mBubbleData.hasBubbleInStackWithKey(groupedBubble.getEntry().getKey()));
 
         // GIVEN the summary is dismissed
         mBubbleController.handleDismissalInterception(groupSummary.getEntry());
@@ -910,7 +968,7 @@
         mEntryListener.onEntryRemoved(groupSummary.getEntry(), null, false, REASON_APP_CANCEL);
 
         // THEN the summary and its children are removed from bubble data
-        assertFalse(mBubbleData.hasBubbleWithKey(groupedBubble.getEntry().getKey()));
+        assertFalse(mBubbleData.hasBubbleInStackWithKey(groupedBubble.getEntry().getKey()));
         assertFalse(mBubbleData.isSummarySuppressed(
                 groupSummary.getEntry().getSbn().getGroupKey()));
     }
@@ -928,7 +986,7 @@
         mBubbleController.handleDismissalInterception(groupSummary.getEntry());
 
         // THEN only the NON-bubble children are dismissed
-        List<ExpandableNotificationRow> childrenRows = groupSummary.getNotificationChildren();
+        List<ExpandableNotificationRow> childrenRows = groupSummary.getAttachedChildren();
         verify(mNotificationEntryManager, times(1)).performRemoveNotification(
                 childrenRows.get(0).getEntry().getSbn(), REASON_GROUP_SUMMARY_CANCELED);
         verify(mNotificationEntryManager, times(1)).performRemoveNotification(
diff --git a/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleDataTest.java b/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleDataTest.java
index d2f9127..66f119a 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleDataTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleDataTest.java
@@ -20,8 +20,11 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.verifyZeroInteractions;
 import static org.mockito.Mockito.when;
@@ -285,6 +288,25 @@
         assertOverflowChangedTo(ImmutableList.of(mBubbleA2));
     }
 
+    @Test
+    public void testOverflowBubble_maxReached_bubbleRemoved() {
+        // Setup
+        sendUpdatedEntryAtTime(mEntryA1, 1000);
+        sendUpdatedEntryAtTime(mEntryA2, 2000);
+        sendUpdatedEntryAtTime(mEntryA3, 3000);
+        mBubbleData.setListener(mListener);
+
+        mBubbleData.setMaxOverflowBubbles(1);
+        mBubbleData.notificationEntryRemoved(mEntryA1, BubbleController.DISMISS_USER_GESTURE);
+        verifyUpdateReceived();
+        assertOverflowChangedTo(ImmutableList.of(mBubbleA1));
+
+        // Overflow max of 1 is reached; A1 is oldest, so it gets removed
+        mBubbleData.notificationEntryRemoved(mEntryA2, BubbleController.DISMISS_USER_GESTURE);
+        verifyUpdateReceived();
+        assertOverflowChangedTo(ImmutableList.of(mBubbleA2));
+    }
+
     /**
      * Verifies that new bubbles insert to the left when collapsed, carrying along grouped bubbles.
      * <p>
@@ -473,6 +495,32 @@
     }
 
     /**
+     * Verifies that overflow bubbles are canceled on notif entry removal.
+     */
+    @Test
+    public void test_removeOverflowBubble_forCanceledNotif() {
+        // Setup
+        sendUpdatedEntryAtTime(mEntryA1, 1000);
+        sendUpdatedEntryAtTime(mEntryA2, 2000);
+        sendUpdatedEntryAtTime(mEntryA3, 3000);
+        sendUpdatedEntryAtTime(mEntryB1, 4000);
+        sendUpdatedEntryAtTime(mEntryB2, 5000);
+        sendUpdatedEntryAtTime(mEntryB3, 6000); // [A2, A3, B1, B2, B3], overflow: [A1]
+        sendUpdatedEntryAtTime(mEntryC1, 7000); // [A3, B1, B2, B3, C1], overflow: [A2, A1]
+        mBubbleData.setListener(mListener);
+
+        // Test
+        mBubbleData.notificationEntryRemoved(mEntryA1, BubbleController.DISMISS_NOTIF_CANCEL);
+        verifyUpdateReceived();
+        assertOverflowChangedTo(ImmutableList.of(mBubbleA2));
+
+        // Test
+        mBubbleData.notificationEntryRemoved(mEntryA2, BubbleController.DISMISS_GROUP_CANCELLED);
+        verifyUpdateReceived();
+        assertOverflowChangedTo(ImmutableList.of());
+    }
+
+    /**
      * Verifies that when the selected bubble is removed with the stack in the collapsed state,
      * the selection moves to the next most-recently updated bubble.
      */
diff --git a/packages/SystemUI/tests/src/com/android/systemui/bubbles/NewNotifPipelineBubbleControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/bubbles/NewNotifPipelineBubbleControllerTest.java
index 5f4f2ef..23dfb7c 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/bubbles/NewNotifPipelineBubbleControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/bubbles/NewNotifPipelineBubbleControllerTest.java
@@ -38,6 +38,7 @@
 import static org.mockito.Mockito.when;
 
 import android.app.IActivityManager;
+import android.app.INotificationManager;
 import android.app.Notification;
 import android.app.PendingIntent;
 import android.content.res.Resources;
@@ -78,6 +79,7 @@
 import com.android.systemui.statusbar.phone.LockscreenLockIconController;
 import com.android.systemui.statusbar.phone.NotificationGroupManager;
 import com.android.systemui.statusbar.phone.NotificationShadeWindowController;
+import com.android.systemui.statusbar.phone.NotificationShadeWindowView;
 import com.android.systemui.statusbar.phone.ShadeController;
 import com.android.systemui.statusbar.policy.BatteryController;
 import com.android.systemui.statusbar.policy.ConfigurationController;
@@ -133,6 +135,8 @@
     private KeyguardBypassController mKeyguardBypassController;
     @Mock
     private FloatingContentCoordinator mFloatingContentCoordinator;
+    @Mock
+    private NotificationShadeWindowView mNotificationShadeWindowView;
 
     private SysUiState mSysUiState = new SysUiState();
 
@@ -205,8 +209,7 @@
                 mWindowManager, mActivityManager, mDozeParameters, mStatusBarStateController,
                 mConfigurationController, mKeyguardBypassController, mColorExtractor,
                 mDumpManager);
-        mNotificationShadeWindowController.setNotificationShadeView(
-                mSuperStatusBarViewFactory.getNotificationShadeWindowView());
+        mNotificationShadeWindowController.setNotificationShadeView(mNotificationShadeWindowView);
         mNotificationShadeWindowController.attach();
 
         // Need notifications for bubbles
@@ -250,7 +253,8 @@
                 mFeatureFlagsNewPipeline,
                 mDumpManager,
                 mFloatingContentCoordinator,
-                mSysUiState);
+                mSysUiState,
+                mock(INotificationManager.class));
         mBubbleController.addNotifCallback(mNotifCallback);
         mBubbleController.setBubbleStateChangeListener(mBubbleStateChangeListener);
         mBubbleController.setExpandListener(mBubbleExpandListener);
@@ -279,20 +283,20 @@
     @Test
     public void testRemoveBubble() {
         mBubbleController.updateBubble(mRow.getEntry());
-        assertNotNull(mBubbleData.getBubbleWithKey(mRow.getEntry().getKey()));
+        assertNotNull(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()));
         assertTrue(mBubbleController.hasBubbles());
         verify(mNotifCallback, times(1)).invalidateNotifications(anyString());
         verify(mBubbleStateChangeListener).onHasBubblesChanged(true);
 
         mBubbleController.removeBubble(mRow.getEntry(), BubbleController.DISMISS_USER_GESTURE);
         assertFalse(mNotificationShadeWindowController.getBubblesShowing());
-        assertNull(mBubbleData.getBubbleWithKey(mRow.getEntry().getKey()));
+        assertNull(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()));
         verify(mNotifCallback, times(2)).invalidateNotifications(anyString());
         verify(mBubbleStateChangeListener).onHasBubblesChanged(false);
     }
 
     @Test
-    public void testRemoveBubble_withDismissedNotif() {
+    public void testRemoveBubble_withDismissedNotif_inOverflow() {
         mEntryListener.onEntryAdded(mRow.getEntry());
         mBubbleController.updateBubble(mRow.getEntry());
 
@@ -300,13 +304,34 @@
         assertFalse(mBubbleController.isBubbleNotificationSuppressedFromShade(mRow.getEntry()));
 
         // Make it look like dismissed notif
-        mBubbleData.getBubbleWithKey(mRow.getEntry().getKey()).setSuppressNotification(true);
+        mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()).setSuppressNotification(true);
 
         // Now remove the bubble
         mBubbleController.removeBubble(mRow.getEntry(), BubbleController.DISMISS_USER_GESTURE);
+        assertTrue(mBubbleData.hasOverflowBubbleWithKey(mRow.getEntry().getKey()));
 
-        // Since the notif is dismissed, once the bubble is removed, removeNotification gets
-        // called to really remove the notif
+        // We don't remove the notification since the bubble is still in overflow.
+        verify(mNotifCallback, never()).removeNotification(eq(mRow.getEntry()), anyInt());
+        assertFalse(mBubbleController.hasBubbles());
+    }
+
+    @Test
+    public void testRemoveBubble_withDismissedNotif_notInOverflow() {
+        mEntryListener.onEntryAdded(mRow.getEntry());
+        mBubbleController.updateBubble(mRow.getEntry());
+
+        assertTrue(mBubbleController.hasBubbles());
+        assertFalse(mBubbleController.isBubbleNotificationSuppressedFromShade(mRow.getEntry()));
+
+        // Make it look like dismissed notif
+        mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()).setSuppressNotification(true);
+
+        // Now remove the bubble
+        mBubbleController.removeBubble(mRow.getEntry(), BubbleController.DISMISS_NOTIF_CANCEL);
+        assertFalse(mBubbleData.hasOverflowBubbleWithKey(mRow.getEntry().getKey()));
+
+        // Since the notif is dismissed and not in overflow, once the bubble is removed,
+        // removeNotification gets called to really remove the notif
         verify(mNotifCallback, times(1)).removeNotification(eq(mRow.getEntry()), anyInt());
         assertFalse(mBubbleController.hasBubbles());
     }
@@ -315,17 +340,17 @@
     public void testDismissStack() {
         mBubbleController.updateBubble(mRow.getEntry());
         verify(mNotifCallback, times(1)).invalidateNotifications(anyString());
-        assertNotNull(mBubbleData.getBubbleWithKey(mRow.getEntry().getKey()));
+        assertNotNull(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()));
         mBubbleController.updateBubble(mRow2.getEntry());
         verify(mNotifCallback, times(2)).invalidateNotifications(anyString());
-        assertNotNull(mBubbleData.getBubbleWithKey(mRow2.getEntry().getKey()));
+        assertNotNull(mBubbleData.getBubbleInStackWithKey(mRow2.getEntry().getKey()));
         assertTrue(mBubbleController.hasBubbles());
 
         mBubbleData.dismissAll(BubbleController.DISMISS_USER_GESTURE);
         assertFalse(mNotificationShadeWindowController.getBubblesShowing());
         verify(mNotifCallback, times(3)).invalidateNotifications(anyString());
-        assertNull(mBubbleData.getBubbleWithKey(mRow.getEntry().getKey()));
-        assertNull(mBubbleData.getBubbleWithKey(mRow2.getEntry().getKey()));
+        assertNull(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()));
+        assertNull(mBubbleData.getBubbleInStackWithKey(mRow2.getEntry().getKey()));
     }
 
     @Test
@@ -385,10 +410,10 @@
         assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(mRow2.getEntry()));
 
         // Switch which bubble is expanded
-        mBubbleData.setSelectedBubble(mBubbleData.getBubbleWithKey(mRow.getEntry().getKey()));
+        mBubbleData.setSelectedBubble(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()));
         mBubbleData.setExpanded(true);
         assertEquals(mRow.getEntry(),
-                mBubbleData.getBubbleWithKey(stackView.getExpandedBubble().getKey()).getEntry());
+                mBubbleData.getBubbleInStackWithKey(stackView.getExpandedBubble().getKey()).getEntry());
         assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
                 mRow.getEntry()));
 
@@ -413,7 +438,7 @@
         assertFalse(mBubbleController.isBubbleNotificationSuppressedFromShade(mRow.getEntry()));
 
         mTestableLooper.processAllMessages();
-        assertTrue(mBubbleData.getBubbleWithKey(mRow.getEntry().getKey()).showDot());
+        assertTrue(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()).showDot());
 
         // Expand
         mBubbleData.setExpanded(true);
@@ -424,7 +449,7 @@
         assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
                 mRow.getEntry()));
         // Notif shouldn't show dot after expansion
-        assertFalse(mBubbleData.getBubbleWithKey(mRow.getEntry().getKey()).showDot());
+        assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()).showDot());
     }
 
     @Test
@@ -439,7 +464,7 @@
                 mRow.getEntry()));
 
         mTestableLooper.processAllMessages();
-        assertTrue(mBubbleData.getBubbleWithKey(mRow.getEntry().getKey()).showDot());
+        assertTrue(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()).showDot());
 
         // Expand
         mBubbleData.setExpanded(true);
@@ -450,7 +475,7 @@
         assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
                 mRow.getEntry()));
         // Notif shouldn't show dot after expansion
-        assertFalse(mBubbleData.getBubbleWithKey(mRow.getEntry().getKey()).showDot());
+        assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()).showDot());
 
         // Send update
         mEntryListener.onEntryUpdated(mRow.getEntry());
@@ -460,7 +485,7 @@
         assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
                 mRow.getEntry()));
         // Notif shouldn't show dot after expansion
-        assertFalse(mBubbleData.getBubbleWithKey(mRow.getEntry().getKey()).showDot());
+        assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()).showDot());
     }
 
     @Test
@@ -481,24 +506,24 @@
 
         // Last added is the one that is expanded
         assertEquals(mRow2.getEntry(),
-                mBubbleData.getBubbleWithKey(stackView.getExpandedBubble().getKey()).getEntry());
+                mBubbleData.getBubbleInStackWithKey(stackView.getExpandedBubble().getKey()).getEntry());
         assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
                 mRow2.getEntry()));
 
         // Dismiss currently expanded
         mBubbleController.removeBubble(
-                mBubbleData.getBubbleWithKey(stackView.getExpandedBubble().getKey()).getEntry(),
+                mBubbleData.getBubbleInStackWithKey(stackView.getExpandedBubble().getKey()).getEntry(),
                 BubbleController.DISMISS_USER_GESTURE);
         verify(mBubbleExpandListener).onBubbleExpandChanged(false, mRow2.getEntry().getKey());
 
         // Make sure first bubble is selected
         assertEquals(mRow.getEntry(),
-                mBubbleData.getBubbleWithKey(stackView.getExpandedBubble().getKey()).getEntry());
+                mBubbleData.getBubbleInStackWithKey(stackView.getExpandedBubble().getKey()).getEntry());
         verify(mBubbleExpandListener).onBubbleExpandChanged(true, mRow.getEntry().getKey());
 
         // Dismiss that one
         mBubbleController.removeBubble(
-                mBubbleData.getBubbleWithKey(stackView.getExpandedBubble().getKey()).getEntry(),
+                mBubbleData.getBubbleInStackWithKey(stackView.getExpandedBubble().getKey()).getEntry(),
                 BubbleController.DISMISS_USER_GESTURE);
 
         // Make sure state changes and collapse happens
@@ -557,8 +582,8 @@
         assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
                 mRow.getEntry()));
         // Dot + flyout is hidden because notif is suppressed
-        assertFalse(mBubbleData.getBubbleWithKey(mRow.getEntry().getKey()).showDot());
-        assertFalse(mBubbleData.getBubbleWithKey(mRow.getEntry().getKey()).showFlyout());
+        assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()).showDot());
+        assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()).showFlyout());
 
         // # of bubbles should change
         verify(mBubbleStateChangeListener).onHasBubblesChanged(true /* hasBubbles */);
@@ -572,7 +597,7 @@
         assertFalse(mBubbleController.isBubbleNotificationSuppressedFromShade(
                 mRow.getEntry()));
         // Should show dot
-        assertTrue(mBubbleData.getBubbleWithKey(mRow.getEntry().getKey()).showDot());
+        assertTrue(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()).showDot());
 
         // Update to suppress notif
         setMetadataFlags(mRow.getEntry(),
@@ -583,8 +608,8 @@
         assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
                 mRow.getEntry()));
         // Dot + flyout is hidden because notif is suppressed
-        assertFalse(mBubbleData.getBubbleWithKey(mRow.getEntry().getKey()).showDot());
-        assertFalse(mBubbleData.getBubbleWithKey(mRow.getEntry().getKey()).showFlyout());
+        assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()).showDot());
+        assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()).showFlyout());
 
         // # of bubbles should change
         verify(mBubbleStateChangeListener).onHasBubblesChanged(true /* hasBubbles */);
@@ -597,7 +622,7 @@
                 mRow.getEntry()));
 
         mTestableLooper.processAllMessages();
-        assertTrue(mBubbleData.getBubbleWithKey(mRow.getEntry().getKey()).showDot());
+        assertTrue(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()).showDot());
     }
 
     @Test
@@ -675,7 +700,7 @@
     }
 
     @Test
-    public void removeBubble_succeeds_userDismissBubble_userDimissNotif() {
+    public void removeBubble_dismissIntoOverflow_intercepted() {
         mEntryListener.onEntryAdded(mRow.getEntry());
         mBubbleController.updateBubble(mRow.getEntry());
 
@@ -691,7 +716,28 @@
         // Dismiss the notification
         boolean intercepted = mBubbleController.handleDismissalInterception(mRow.getEntry());
 
-        // It's no longer a bubble so we shouldn't intercept
+        // Intercept dismissal since bubble is going into overflow
+        assertTrue(intercepted);
+    }
+
+    @Test
+    public void removeBubble_notIntercepted() {
+        mEntryListener.onEntryAdded(mRow.getEntry());
+        mBubbleController.updateBubble(mRow.getEntry());
+
+        assertTrue(mBubbleController.hasBubbles());
+        assertFalse(mBubbleController.isBubbleNotificationSuppressedFromShade(
+                mRow.getEntry()));
+
+        // Dismiss the bubble
+        mBubbleController.removeBubble(
+                mRow.getEntry(), BubbleController.DISMISS_NOTIF_CANCEL);
+        assertFalse(mBubbleController.hasBubbles());
+
+        // Dismiss the notification
+        boolean intercepted = mBubbleController.handleDismissalInterception(mRow.getEntry());
+
+        // Not a bubble anymore so we don't intercept dismissal.
         assertFalse(intercepted);
     }
 
@@ -715,7 +761,7 @@
 
         // Should notify delegate that shade state changed
         verify(listener).onBubbleNotificationSuppressionChange(
-                mBubbleData.getBubbleWithKey(mRow.getEntry().getKey()));
+                mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()));
     }
 
     @Test
@@ -738,7 +784,7 @@
 
         // Should notify delegate that shade state changed
         verify(listener).onBubbleNotificationSuppressionChange(
-                mBubbleData.getBubbleWithKey(mRow.getEntry().getKey()));
+                mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()));
     }
 
     @Test
@@ -748,7 +794,7 @@
         ExpandableNotificationRow groupedBubble = mNotificationTestHelper.createBubbleInGroup();
         mEntryListener.onEntryAdded(groupedBubble.getEntry());
         groupSummary.addChildNotification(groupedBubble);
-        assertTrue(mBubbleData.hasBubbleWithKey(groupedBubble.getEntry().getKey()));
+        assertTrue(mBubbleData.hasBubbleInStackWithKey(groupedBubble.getEntry().getKey()));
 
         // WHEN the summary is dismissed
         mBubbleController.handleDismissalInterception(groupSummary.getEntry());
@@ -766,7 +812,7 @@
         ExpandableNotificationRow groupedBubble = mNotificationTestHelper.createBubbleInGroup();
         mEntryListener.onEntryAdded(groupedBubble.getEntry());
         groupSummary.addChildNotification(groupedBubble);
-        assertTrue(mBubbleData.hasBubbleWithKey(groupedBubble.getEntry().getKey()));
+        assertTrue(mBubbleData.hasBubbleInStackWithKey(groupedBubble.getEntry().getKey()));
 
         // GIVEN the summary is dismissed
         mBubbleController.handleDismissalInterception(groupSummary.getEntry());
@@ -775,7 +821,7 @@
         mEntryListener.onEntryRemoved(groupSummary.getEntry(), 0);
 
         // THEN the summary and its children are removed from bubble data
-        assertFalse(mBubbleData.hasBubbleWithKey(groupedBubble.getEntry().getKey()));
+        assertFalse(mBubbleData.hasBubbleInStackWithKey(groupedBubble.getEntry().getKey()));
         assertFalse(mBubbleData.isSummarySuppressed(
                 groupSummary.getEntry().getSbn().getGroupKey()));
     }
@@ -793,7 +839,7 @@
         mBubbleController.handleDismissalInterception(groupSummary.getEntry());
 
         // THEN only the NON-bubble children are dismissed
-        List<ExpandableNotificationRow> childrenRows = groupSummary.getNotificationChildren();
+        List<ExpandableNotificationRow> childrenRows = groupSummary.getAttachedChildren();
         verify(mNotifCallback, times(1)).removeNotification(
                 childrenRows.get(0).getEntry(), REASON_GROUP_SUMMARY_CANCELED);
         verify(mNotifCallback, times(1)).removeNotification(
@@ -801,7 +847,7 @@
         verify(mNotifCallback, never()).removeNotification(eq(groupedBubble.getEntry()), anyInt());
 
         // THEN the bubble child still exists as a bubble and is suppressed from the shade
-        assertTrue(mBubbleData.hasBubbleWithKey(groupedBubble.getEntry().getKey()));
+        assertTrue(mBubbleData.hasBubbleInStackWithKey(groupedBubble.getEntry().getKey()));
         assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
                 groupedBubble.getEntry()));
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/bubbles/TestableBubbleController.java b/packages/SystemUI/tests/src/com/android/systemui/bubbles/TestableBubbleController.java
index f486102..7815ae7 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/bubbles/TestableBubbleController.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/bubbles/TestableBubbleController.java
@@ -16,6 +16,7 @@
 
 package com.android.systemui.bubbles;
 
+import android.app.INotificationManager;
 import android.content.Context;
 
 import com.android.systemui.dump.DumpManager;
@@ -54,12 +55,14 @@
             FeatureFlags featureFlags,
             DumpManager dumpManager,
             FloatingContentCoordinator floatingContentCoordinator,
-            SysUiState sysUiState) {
+            SysUiState sysUiState,
+            INotificationManager notificationManager) {
         super(context,
                 notificationShadeWindowController, statusBarStateController, shadeController,
                 data, Runnable::run, configurationController, interruptionStateProvider,
                 zenModeController, lockscreenUserManager, groupManager, entryManager,
-                notifPipeline, featureFlags, dumpManager, floatingContentCoordinator, sysUiState);
+                notifPipeline, featureFlags, dumpManager, floatingContentCoordinator, sysUiState,
+                notificationManager);
         setInflateSynchronously(true);
     }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/controls/controller/ControlsControllerImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/controls/controller/ControlsControllerImplTest.kt
index f6ee46b..e3f25c6 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/controls/controller/ControlsControllerImplTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/controls/controller/ControlsControllerImplTest.kt
@@ -89,6 +89,7 @@
     @Captor
     private lateinit var controlLoadCallbackCaptor:
             ArgumentCaptor<ControlsBindingController.LoadCallback>
+
     @Captor
     private lateinit var broadcastReceiverCaptor: ArgumentCaptor<BroadcastReceiver>
     @Captor
@@ -97,6 +98,7 @@
 
     private lateinit var delayableExecutor: FakeExecutor
     private lateinit var controller: ControlsControllerImpl
+    private lateinit var canceller: DidRunRunnable
 
     companion object {
         fun <T> capture(argumentCaptor: ArgumentCaptor<T>): T = argumentCaptor.capture()
@@ -146,6 +148,9 @@
             }
         }
 
+        canceller = DidRunRunnable()
+        `when`(bindingController.bindAndLoad(any(), any())).thenReturn(canceller)
+
         controller = ControlsControllerImpl(
                 wrapper,
                 delayableExecutor,
@@ -266,7 +271,7 @@
 
             assertTrue(favorites.isEmpty())
             assertFalse(data.errorOnLoad)
-        })
+        }, Consumer {})
 
         verify(bindingController).bindAndLoad(eq(TEST_COMPONENT),
                 capture(controlLoadCallbackCaptor))
@@ -301,7 +306,7 @@
             assertEquals(1, favorites.size)
             assertEquals(TEST_CONTROL_ID, favorites[0])
             assertFalse(data.errorOnLoad)
-        })
+        }, Consumer {})
 
         verify(bindingController).bindAndLoad(eq(TEST_COMPONENT),
                 capture(controlLoadCallbackCaptor))
@@ -332,7 +337,7 @@
             assertEquals(1, favorites.size)
             assertEquals(TEST_CONTROL_ID, favorites[0])
             assertFalse(data.errorOnLoad)
-        })
+        }, Consumer {})
 
         verify(bindingController).bindAndLoad(eq(TEST_COMPONENT),
                 capture(controlLoadCallbackCaptor))
@@ -363,7 +368,7 @@
             assertEquals(1, favorites.size)
             assertEquals(TEST_CONTROL_ID, favorites[0])
             assertTrue(data.errorOnLoad)
-        })
+        }, Consumer {})
 
         verify(bindingController).bindAndLoad(eq(TEST_COMPONENT),
                 capture(controlLoadCallbackCaptor))
@@ -377,22 +382,15 @@
 
     @Test
     fun testCancelLoad() {
-        val canceller = object : Runnable {
-            var ran = false
-            override fun run() {
-                ran = true
-            }
-        }
-        `when`(bindingController.bindAndLoad(any(), any())).thenReturn(canceller)
-
         var loaded = false
+        var cancelRunnable: Runnable? = null
         controller.replaceFavoritesForStructure(TEST_STRUCTURE_INFO)
         delayableExecutor.runAllReady()
         controller.loadForComponent(TEST_COMPONENT, Consumer {
             loaded = true
-        })
+        }, Consumer { runnable -> cancelRunnable = runnable })
 
-        controller.cancelLoad()
+        cancelRunnable?.run()
         delayableExecutor.runAllReady()
 
         assertFalse(loaded)
@@ -400,61 +398,47 @@
     }
 
     @Test
-    fun testCancelLoad_noCancelAfterSuccessfulLoad() {
-        val canceller = object : Runnable {
-            var ran = false
-            override fun run() {
-                ran = true
-            }
-        }
-        `when`(bindingController.bindAndLoad(any(), any())).thenReturn(canceller)
-
+    fun testCancelLoad_afterSuccessfulLoad() {
         var loaded = false
+        var cancelRunnable: Runnable? = null
         controller.replaceFavoritesForStructure(TEST_STRUCTURE_INFO)
         delayableExecutor.runAllReady()
         controller.loadForComponent(TEST_COMPONENT, Consumer {
             loaded = true
-        })
+        }, Consumer { runnable -> cancelRunnable = runnable })
 
         verify(bindingController).bindAndLoad(eq(TEST_COMPONENT),
             capture(controlLoadCallbackCaptor))
 
         controlLoadCallbackCaptor.value.accept(emptyList())
 
-        controller.cancelLoad()
+        cancelRunnable?.run()
         delayableExecutor.runAllReady()
 
         assertTrue(loaded)
-        assertFalse(canceller.ran)
+        assertTrue(canceller.ran)
     }
 
     @Test
-    fun testCancelLoad_noCancelAfterErrorLoad() {
-        val canceller = object : Runnable {
-            var ran = false
-            override fun run() {
-                ran = true
-            }
-        }
-        `when`(bindingController.bindAndLoad(any(), any())).thenReturn(canceller)
-
+    fun testCancelLoad_afterErrorLoad() {
         var loaded = false
+        var cancelRunnable: Runnable? = null
         controller.replaceFavoritesForStructure(TEST_STRUCTURE_INFO)
         delayableExecutor.runAllReady()
         controller.loadForComponent(TEST_COMPONENT, Consumer {
             loaded = true
-        })
+        }, Consumer { runnable -> cancelRunnable = runnable })
 
         verify(bindingController).bindAndLoad(eq(TEST_COMPONENT),
             capture(controlLoadCallbackCaptor))
 
         controlLoadCallbackCaptor.value.error("")
 
-        controller.cancelLoad()
+        cancelRunnable?.run()
         delayableExecutor.runAllReady()
 
         assertTrue(loaded)
-        assertFalse(canceller.ran)
+        assertTrue(canceller.ran)
     }
 
     @Test
@@ -465,7 +449,7 @@
         val newControlInfo = TEST_CONTROL_INFO.copy(controlTitle = TEST_CONTROL_TITLE_2)
         val control = statelessBuilderFromInfo(newControlInfo).build()
 
-        controller.loadForComponent(TEST_COMPONENT, Consumer {})
+        controller.loadForComponent(TEST_COMPONENT, Consumer {}, Consumer {})
 
         verify(bindingController).bindAndLoad(eq(TEST_COMPONENT),
                 capture(controlLoadCallbackCaptor))
@@ -963,3 +947,10 @@
         assertTrue(controller.getFavoritesForStructure(TEST_COMPONENT_2, TEST_STRUCTURE).isEmpty())
     }
 }
+
+private class DidRunRunnable() : Runnable {
+    var ran = false
+    override fun run() {
+        ran = true
+    }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/globalactions/GlobalActionsDialogTest.java b/packages/SystemUI/tests/src/com/android/systemui/globalactions/GlobalActionsDialogTest.java
index 3af164d..b44b23a 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/globalactions/GlobalActionsDialogTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/globalactions/GlobalActionsDialogTest.java
@@ -16,6 +16,11 @@
 
 package com.android.systemui.globalactions;
 
+import static junit.framework.Assert.assertEquals;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
@@ -200,4 +205,63 @@
         verify(mUiEventLogger, times(1))
                 .log(event);
     }
+
+    @Test
+    public void testCreateActionItems_maxThree() {
+        mGlobalActionsDialog = spy(mGlobalActionsDialog);
+        // allow 3 items to be shown
+        doReturn(3).when(mGlobalActionsDialog).getMaxShownPowerItems();
+        // ensure items are not blocked by keyguard or device provisioning
+        doReturn(true).when(mGlobalActionsDialog).shouldShowAction(any());
+        String[] actions = {
+                GlobalActionsDialog.GLOBAL_ACTION_KEY_EMERGENCY,
+                GlobalActionsDialog.GLOBAL_ACTION_KEY_POWER,
+                GlobalActionsDialog.GLOBAL_ACTION_KEY_RESTART,
+                GlobalActionsDialog.GLOBAL_ACTION_KEY_SCREENSHOT,
+        };
+        doReturn(actions).when(mGlobalActionsDialog).getDefaultActions();
+        mGlobalActionsDialog.createActionItems();
+
+        assertEquals(3, mGlobalActionsDialog.mItems.size());
+        assertEquals(1, mGlobalActionsDialog.mOverflowItems.size());
+    }
+
+    @Test
+    public void testCreateActionItems_maxAny() {
+        mGlobalActionsDialog = spy(mGlobalActionsDialog);
+        // allow any number of power menu items to be shown
+        doReturn(Integer.MAX_VALUE).when(mGlobalActionsDialog).getMaxShownPowerItems();
+        // ensure items are not blocked by keyguard or device provisioning
+        doReturn(true).when(mGlobalActionsDialog).shouldShowAction(any());
+        String[] actions = {
+                GlobalActionsDialog.GLOBAL_ACTION_KEY_EMERGENCY,
+                GlobalActionsDialog.GLOBAL_ACTION_KEY_POWER,
+                GlobalActionsDialog.GLOBAL_ACTION_KEY_RESTART,
+                GlobalActionsDialog.GLOBAL_ACTION_KEY_SCREENSHOT,
+        };
+        doReturn(actions).when(mGlobalActionsDialog).getDefaultActions();
+        mGlobalActionsDialog.createActionItems();
+
+        assertEquals(4, mGlobalActionsDialog.mItems.size());
+        assertEquals(0, mGlobalActionsDialog.mOverflowItems.size());
+    }
+
+    @Test
+    public void testCreateActionItems_maxThree_itemNotShown() {
+        mGlobalActionsDialog = spy(mGlobalActionsDialog);
+        // allow only 3 items to be shown
+        doReturn(3).when(mGlobalActionsDialog).getMaxShownPowerItems();
+        String[] actions = {
+                GlobalActionsDialog.GLOBAL_ACTION_KEY_EMERGENCY,
+                // screenshot blocked because device not provisioned
+                GlobalActionsDialog.GLOBAL_ACTION_KEY_SCREENSHOT,
+                GlobalActionsDialog.GLOBAL_ACTION_KEY_POWER,
+                GlobalActionsDialog.GLOBAL_ACTION_KEY_RESTART,
+        };
+        doReturn(actions).when(mGlobalActionsDialog).getDefaultActions();
+        mGlobalActionsDialog.createActionItems();
+
+        assertEquals(3, mGlobalActionsDialog.mItems.size());
+        assertEquals(0, mGlobalActionsDialog.mOverflowItems.size());
+    }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/glwallpaper/EglHelperTest.java b/packages/SystemUI/tests/src/com/android/systemui/glwallpaper/EglHelperTest.java
index 4b47093..e23507b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/glwallpaper/EglHelperTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/glwallpaper/EglHelperTest.java
@@ -40,6 +40,7 @@
 
 import org.junit.After;
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.ArgumentCaptor;
@@ -84,22 +85,17 @@
     }
 
     @Test
-    public void testInit_finish() {
+    public void testInit_normal() {
         mEglHelper.init(mSurfaceHolder, false /* wideColorGamut */);
         assertThat(mEglHelper.hasEglDisplay()).isTrue();
         assertThat(mEglHelper.hasEglContext()).isTrue();
         assertThat(mEglHelper.hasEglSurface()).isTrue();
         verify(mEglHelper).askCreatingEglWindowSurface(
                 any(SurfaceHolder.class), eq(null), anyInt());
-
-        mEglHelper.finish();
-        assertThat(mEglHelper.hasEglSurface()).isFalse();
-        assertThat(mEglHelper.hasEglContext()).isFalse();
-        assertThat(mEglHelper.hasEglDisplay()).isFalse();
     }
 
     @Test
-    public void testInit_finish_wide_gamut() {
+    public void testInit_wide_gamut() {
         // In EglHelper, EGL_GL_COLORSPACE_DISPLAY_P3_PASSTHROUGH_EXT = 0x3490;
         doReturn(0x3490).when(mEglHelper).getWcgCapability();
         // In EglHelper, KHR_GL_COLOR_SPACE = "EGL_KHR_gl_colorspace";
@@ -113,10 +109,10 @@
                 .askCreatingEglWindowSurface(any(SurfaceHolder.class), ac.capture(), anyInt());
         assertThat(ac.getValue()).isNotNull();
         assertThat(ac.getValue()).isEqualTo(expectedArgument);
-        mEglHelper.finish();
     }
 
     @Test
+    @Ignore
     public void testFinish_shouldNotCrash() {
         mEglHelper.terminateEglDisplay();
         assertThat(mEglHelper.hasEglDisplay()).isFalse();
diff --git a/packages/SystemUI/tests/src/com/android/systemui/glwallpaper/ImageRevealHelperTest.java b/packages/SystemUI/tests/src/com/android/systemui/glwallpaper/ImageRevealHelperTest.java
deleted file mode 100644
index c827ac7..0000000
--- a/packages/SystemUI/tests/src/com/android/systemui/glwallpaper/ImageRevealHelperTest.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (C) 2019 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.glwallpaper;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.testing.AndroidTestingRunner;
-import android.testing.TestableLooper;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.systemui.SysuiTestCase;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@SmallTest
-@RunWith(AndroidTestingRunner.class)
[email protected]
-public class ImageRevealHelperTest extends SysuiTestCase {
-
-    static final int ANIMATION_DURATION = 500;
-    ImageRevealHelper mImageRevealHelper;
-    ImageRevealHelper.RevealStateListener mRevealStateListener;
-
-    @Before
-    public void setUp() throws Exception {
-        mRevealStateListener = new ImageRevealHelper.RevealStateListener() {
-            @Override
-            public void onRevealStateChanged() {
-                // no-op
-            }
-
-            @Override
-            public void onRevealStart(boolean animate) {
-                // no-op
-            }
-
-            @Override
-            public void onRevealEnd() {
-                // no-op
-            }
-        };
-        mImageRevealHelper = new ImageRevealHelper(mRevealStateListener);
-    }
-
-    @Test
-    public void testBiometricAuthUnlockAnimateImageRevealState_shouldNotBlackoutScreen() {
-        assertThat(mImageRevealHelper.getReveal()).isEqualTo(0f);
-
-        mImageRevealHelper.updateAwake(true /* awake */, ANIMATION_DURATION);
-        assertThat(mImageRevealHelper.getReveal()).isEqualTo(0f);
-
-        // When device unlock through Biometric, should not show reveal transition
-        mImageRevealHelper.updateAwake(false /* awake */, 0);
-        assertThat(mImageRevealHelper.getReveal()).isEqualTo(1f);
-    }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/glwallpaper/ImageWallpaperRendererTest.java b/packages/SystemUI/tests/src/com/android/systemui/glwallpaper/ImageWallpaperRendererTest.java
index d61be37..24f3eb2 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/glwallpaper/ImageWallpaperRendererTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/glwallpaper/ImageWallpaperRendererTest.java
@@ -16,8 +16,6 @@
 
 package com.android.systemui.glwallpaper;
 
-import static com.android.systemui.glwallpaper.GLWallpaperRenderer.SurfaceProxy;
-
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.Mockito.doReturn;
@@ -48,30 +46,12 @@
 public class ImageWallpaperRendererTest extends SysuiTestCase {
 
     private WallpaperManager mWpmSpy;
-    private SurfaceProxy mSurfaceProxy;
 
     @Before
     public void setUp() throws Exception {
         final WallpaperManager wpm = mContext.getSystemService(WallpaperManager.class);
         mWpmSpy = spy(wpm);
         mContext.addMockSystemService(WallpaperManager.class, mWpmSpy);
-
-        mSurfaceProxy = new SurfaceProxy() {
-            @Override
-            public void requestRender() {
-                // NO-op
-            }
-
-            @Override
-            public void preRender() {
-                // No-op
-            }
-
-            @Override
-            public void postRender() {
-                // No-op
-            }
-        };
     }
 
     @Test
@@ -91,12 +71,12 @@
             doReturn(supportedWideGamuts).when(cmProxySpy).getSupportedColorSpaces();
 
             mWpmSpy.setBitmap(p3Bitmap);
-            ImageWallpaperRenderer rendererP3 = new ImageWallpaperRenderer(mContext, mSurfaceProxy);
+            ImageWallpaperRenderer rendererP3 = new ImageWallpaperRenderer(mContext);
             rendererP3.reportSurfaceSize();
             assertThat(rendererP3.isWcgContent()).isTrue();
 
             mWpmSpy.setBitmap(srgbBitmap);
-            ImageWallpaperRenderer renderer = new ImageWallpaperRenderer(mContext, mSurfaceProxy);
+            ImageWallpaperRenderer renderer = new ImageWallpaperRenderer(mContext);
             assertThat(renderer.isWcgContent()).isFalse();
         } finally {
             srgbBitmap.recycle();
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/SeekBarViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/SeekBarViewModelTest.kt
index f316d04..28a3d6a 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/SeekBarViewModelTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/SeekBarViewModelTest.kt
@@ -86,7 +86,29 @@
     }
 
     @Test
-    fun updateDuration() {
+    fun updateDurationWithPlayback() {
+        // GIVEN that the duration is contained within the metadata
+        val duration = 12000L
+        val metadata = MediaMetadata.Builder().run {
+            putLong(MediaMetadata.METADATA_KEY_DURATION, duration)
+            build()
+        }
+        whenever(mockController.getMetadata()).thenReturn(metadata)
+        // AND a valid playback state (ie. media session is not destroyed)
+        val state = PlaybackState.Builder().run {
+            setState(PlaybackState.STATE_PLAYING, 200L, 1f)
+            build()
+        }
+        whenever(mockController.getPlaybackState()).thenReturn(state)
+        // WHEN the controller is updated
+        viewModel.updateController(mockController, Color.RED)
+        // THEN the duration is extracted
+        assertThat(viewModel.progress.value!!.duration).isEqualTo(duration)
+        assertThat(viewModel.progress.value!!.enabled).isTrue()
+    }
+
+    @Test
+    fun updateDurationWithoutPlayback() {
         // GIVEN that the duration is contained within the metadata
         val duration = 12000L
         val metadata = MediaMetadata.Builder().run {
@@ -98,7 +120,7 @@
         viewModel.updateController(mockController, Color.RED)
         // THEN the duration is extracted
         assertThat(viewModel.progress.value!!.duration).isEqualTo(duration)
-        assertThat(viewModel.progress.value!!.enabled).isTrue()
+        assertThat(viewModel.progress.value!!.enabled).isFalse()
     }
 
     @Test
@@ -110,6 +132,12 @@
             build()
         }
         whenever(mockController.getMetadata()).thenReturn(metadata)
+        // AND a valid playback state (ie. media session is not destroyed)
+        val state = PlaybackState.Builder().run {
+            setState(PlaybackState.STATE_PLAYING, 200L, 1f)
+            build()
+        }
+        whenever(mockController.getPlaybackState()).thenReturn(state)
         // WHEN the controller is updated
         viewModel.updateController(mockController, Color.RED)
         // THEN the seek bar is disabled
@@ -125,6 +153,12 @@
             build()
         }
         whenever(mockController.getMetadata()).thenReturn(metadata)
+        // AND a valid playback state (ie. media session is not destroyed)
+        val state = PlaybackState.Builder().run {
+            setState(PlaybackState.STATE_PLAYING, 200L, 1f)
+            build()
+        }
+        whenever(mockController.getPlaybackState()).thenReturn(state)
         // WHEN the controller is updated
         viewModel.updateController(mockController, Color.RED)
         // THEN the seek bar is disabled
@@ -372,4 +406,30 @@
         // THEN an update task is queued
         assertThat(fakeExecutor.numPending()).isEqualTo(1)
     }
+
+    @Test
+    fun clearSeekBar() {
+        // GIVEN that the duration is contained within the metadata
+        val metadata = MediaMetadata.Builder().run {
+            putLong(MediaMetadata.METADATA_KEY_DURATION, 12000L)
+            build()
+        }
+        whenever(mockController.getMetadata()).thenReturn(metadata)
+        // AND a valid playback state (ie. media session is not destroyed)
+        val state = PlaybackState.Builder().run {
+            setState(PlaybackState.STATE_PLAYING, 200L, 1f)
+            build()
+        }
+        whenever(mockController.getPlaybackState()).thenReturn(state)
+        // AND the controller has been updated
+        viewModel.updateController(mockController, Color.RED)
+        // WHEN the controller is cleared on the event when the session is destroyed
+        viewModel.clearController()
+        with(fakeExecutor) {
+            advanceClockToNext()
+            runAllReady()
+        }
+        // THEN the seek bar is disabled
+        assertThat(viewModel.progress.value!!.enabled).isFalse()
+    }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelTest.java
index 862ebe13..9a32b1d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelTest.java
@@ -39,11 +39,11 @@
 import com.android.systemui.SysuiTestCase;
 import com.android.systemui.broadcast.BroadcastDispatcher;
 import com.android.systemui.dump.DumpManager;
+import com.android.systemui.plugins.ActivityStarter;
 import com.android.systemui.plugins.qs.QSTileView;
 import com.android.systemui.qs.customize.QSCustomizer;
 import com.android.systemui.qs.logging.QSLogger;
 import com.android.systemui.qs.tileimpl.QSTileImpl;
-import com.android.systemui.statusbar.NotificationMediaManager;
 import com.android.systemui.util.concurrency.DelayableExecutor;
 
 import org.junit.Before;
@@ -84,13 +84,13 @@
     @Mock
     private QSTileView mQSTileView;
     @Mock
-    private NotificationMediaManager mNotificationMediaManager;
-    @Mock
     private Executor mForegroundExecutor;
     @Mock
     private DelayableExecutor mBackgroundExecutor;
     @Mock
     private LocalBluetoothManager mLocalBluetoothManager;
+    @Mock
+    private ActivityStarter mActivityStarter;
 
     @Before
     public void setup() throws Exception {
@@ -100,8 +100,8 @@
         mTestableLooper.runWithLooper(() -> {
             mMetricsLogger = mDependency.injectMockDependency(MetricsLogger.class);
             mQsPanel = new QSPanel(mContext, null, mDumpManager, mBroadcastDispatcher,
-                    mQSLogger, mNotificationMediaManager, mForegroundExecutor, mBackgroundExecutor,
-                    mLocalBluetoothManager);
+                    mQSLogger, mForegroundExecutor, mBackgroundExecutor,
+                    mLocalBluetoothManager, mActivityStarter);
             // Provides a parent with non-zero size for QSPanel
             mParentView = new FrameLayout(mContext);
             mParentView.addView(mQsPanel);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/ScreenRecordTileTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/ScreenRecordTileTest.java
index e8e98b4..8a8d227 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/ScreenRecordTileTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/ScreenRecordTileTest.java
@@ -32,6 +32,7 @@
 import com.android.systemui.Dependency;
 import com.android.systemui.R;
 import com.android.systemui.SysuiTestCase;
+import com.android.systemui.plugins.ActivityStarter;
 import com.android.systemui.qs.QSTileHost;
 import com.android.systemui.screenrecord.RecordingController;
 
@@ -49,6 +50,8 @@
     @Mock
     private RecordingController mController;
     @Mock
+    private ActivityStarter mActivityStarter;
+    @Mock
     private QSTileHost mHost;
 
     private TestableLooper mTestableLooper;
@@ -61,10 +64,11 @@
         mTestableLooper = TestableLooper.get(this);
         mDependency.injectTestDependency(Dependency.BG_LOOPER, mTestableLooper.getLooper());
         mController = mDependency.injectMockDependency(RecordingController.class);
+        mActivityStarter = mDependency.injectMockDependency(ActivityStarter.class);
 
         when(mHost.getContext()).thenReturn(mContext);
 
-        mTile = new ScreenRecordTile(mHost, mController);
+        mTile = new ScreenRecordTile(mHost, mController, mActivityStarter);
     }
 
     // Test that the tile is inactive and labeled correctly when the controller is neither starting
@@ -82,7 +86,7 @@
                 mContext.getString(R.string.quick_settings_screen_record_start)));
 
         mTile.handleClick();
-        verify(mController, times(1)).launchRecordPrompt();
+        verify(mController, times(1)).getPromptIntent();
     }
 
     // Test that the tile is active and labeled correctly when the controller is starting
@@ -133,4 +137,12 @@
 
         verify(mController, times(1)).stopRecording();
     }
+
+    @Test
+    public void testContentDescriptionHasTileName() {
+        mTile.refreshState();
+        mTestableLooper.processAllMessages();
+
+        assertTrue(mTile.getState().contentDescription.toString().contains(mTile.getState().label));
+    }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/screenshot/ScreenshotNotificationSmartActionsTest.java b/packages/SystemUI/tests/src/com/android/systemui/screenshot/ScreenshotNotificationSmartActionsTest.java
index 11649ca..ffe3cd5 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/screenshot/ScreenshotNotificationSmartActionsTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/screenshot/ScreenshotNotificationSmartActionsTest.java
@@ -16,6 +16,10 @@
 
 package com.android.systemui.screenshot;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyLong;
 import static org.mockito.ArgumentMatchers.eq;
@@ -40,7 +44,6 @@
 import com.android.systemui.SystemUIFactory;
 import com.android.systemui.SysuiTestCase;
 
-import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -82,9 +85,9 @@
         CompletableFuture<List<Notification.Action>> smartActionsFuture =
                 ScreenshotSmartActions.getSmartActionsFuture("", "", bitmap,
                         smartActionsProvider, true, false);
-        Assert.assertNotNull(smartActionsFuture);
+        assertNotNull(smartActionsFuture);
         List<Notification.Action> smartActions = smartActionsFuture.get(5, TimeUnit.MILLISECONDS);
-        Assert.assertEquals(Collections.emptyList(), smartActions);
+        assertEquals(Collections.emptyList(), smartActions);
     }
 
     // Tests any exception thrown in waiting for smart actions future to complete does
@@ -99,7 +102,7 @@
                 RuntimeException.class);
         List<Notification.Action> actions = ScreenshotSmartActions.getSmartActions(
                 "", "", smartActionsFuture, timeoutMs, mSmartActionsProvider);
-        Assert.assertEquals(Collections.emptyList(), actions);
+        assertEquals(Collections.emptyList(), actions);
     }
 
     // Tests any exception thrown in notifying feedback does not affect regular screenshot flow.
@@ -123,9 +126,9 @@
                         mSmartActionsProvider, true, true);
         verify(mSmartActionsProvider, never()).getActions(any(), any(), any(), any(),
                 eq(false));
-        Assert.assertNotNull(smartActionsFuture);
+        assertNotNull(smartActionsFuture);
         List<Notification.Action> smartActions = smartActionsFuture.get(5, TimeUnit.MILLISECONDS);
-        Assert.assertEquals(Collections.emptyList(), smartActions);
+        assertEquals(Collections.emptyList(), smartActions);
     }
 
     // Tests for a hardware bitmap, ScreenshotNotificationSmartActionsProvider is invoked once.
@@ -152,14 +155,14 @@
                 ScreenshotSmartActions.getSmartActionsFuture("", "", bitmap,
                         actionsProvider,
                         true, true);
-        Assert.assertNotNull(smartActionsFuture);
+        assertNotNull(smartActionsFuture);
         List<Notification.Action> smartActions = smartActionsFuture.get(5, TimeUnit.MILLISECONDS);
-        Assert.assertEquals(smartActions.size(), 0);
+        assertEquals(smartActions.size(), 0);
     }
 
-    // Tests for notification action extras.
+    // Tests for share action extras
     @Test
-    public void testNotificationActionExtras() {
+    public void testShareActionExtras() {
         if (Looper.myLooper() == null) {
             Looper.prepare();
         }
@@ -169,35 +172,70 @@
         data.image = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);
         data.finisher = null;
         data.mActionsReadyListener = null;
-        data.createDeleteAction = true;
         SaveImageInBackgroundTask task = new SaveImageInBackgroundTask(mContext, data);
-        List<Notification.Action> actions = task.populateNotificationActions(
-                mContext, mContext.getResources(),
+
+        Notification.Action shareAction = task.createShareAction(mContext, mContext.getResources(),
                 Uri.parse("Screenshot_123.png"));
 
-        Assert.assertEquals(actions.size(), 3);
-        boolean isShareFound = false;
-        boolean isEditFound = false;
-        boolean isDeleteFound = false;
-        for (Notification.Action action : actions) {
-            Intent intent = action.actionIntent.getIntent();
-            Assert.assertNotNull(intent);
-            Bundle bundle = intent.getExtras();
-            Assert.assertTrue(bundle.containsKey(GlobalScreenshot.EXTRA_ID));
-            Assert.assertTrue(
-                    bundle.containsKey(GlobalScreenshot.EXTRA_SMART_ACTIONS_ENABLED));
+        Intent intent = shareAction.actionIntent.getIntent();
+        assertNotNull(intent);
+        Bundle bundle = intent.getExtras();
+        assertTrue(bundle.containsKey(GlobalScreenshot.EXTRA_ID));
+        assertTrue(bundle.containsKey(GlobalScreenshot.EXTRA_SMART_ACTIONS_ENABLED));
+        assertEquals(GlobalScreenshot.ACTION_TYPE_SHARE, shareAction.title);
+        assertEquals(Intent.ACTION_SEND, intent.getAction());
+    }
 
-            if (action.title.equals(GlobalScreenshot.ACTION_TYPE_DELETE)) {
-                isDeleteFound = intent.getAction() == null;
-            } else if (action.title.equals(GlobalScreenshot.ACTION_TYPE_EDIT)) {
-                isEditFound = Intent.ACTION_EDIT.equals(intent.getAction());
-            } else if (action.title.equals(GlobalScreenshot.ACTION_TYPE_SHARE)) {
-                isShareFound = Intent.ACTION_SEND.equals(intent.getAction());
-            }
+    // Tests for edit action extras
+    @Test
+    public void testEditActionExtras() {
+        if (Looper.myLooper() == null) {
+            Looper.prepare();
         }
 
-        Assert.assertTrue(isEditFound);
-        Assert.assertTrue(isDeleteFound);
-        Assert.assertTrue(isShareFound);
+        GlobalScreenshot.SaveImageInBackgroundData
+                data = new GlobalScreenshot.SaveImageInBackgroundData();
+        data.image = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);
+        data.finisher = null;
+        data.mActionsReadyListener = null;
+        SaveImageInBackgroundTask task = new SaveImageInBackgroundTask(mContext, data);
+
+        Notification.Action editAction = task.createEditAction(mContext, mContext.getResources(),
+                Uri.parse("Screenshot_123.png"));
+
+        Intent intent = editAction.actionIntent.getIntent();
+        assertNotNull(intent);
+        Bundle bundle = intent.getExtras();
+        assertTrue(bundle.containsKey(GlobalScreenshot.EXTRA_ID));
+        assertTrue(bundle.containsKey(GlobalScreenshot.EXTRA_SMART_ACTIONS_ENABLED));
+        assertEquals(GlobalScreenshot.ACTION_TYPE_EDIT, editAction.title);
+        assertEquals(Intent.ACTION_EDIT, intent.getAction());
+    }
+
+    // Tests for share action extras
+    @Test
+    public void testDeleteActionExtras() {
+        if (Looper.myLooper() == null) {
+            Looper.prepare();
+        }
+
+        GlobalScreenshot.SaveImageInBackgroundData
+                data = new GlobalScreenshot.SaveImageInBackgroundData();
+        data.image = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);
+        data.finisher = null;
+        data.mActionsReadyListener = null;
+        SaveImageInBackgroundTask task = new SaveImageInBackgroundTask(mContext, data);
+
+        Notification.Action deleteAction = task.createDeleteAction(mContext,
+                mContext.getResources(),
+                Uri.parse("Screenshot_123.png"));
+
+        Intent intent = deleteAction.actionIntent.getIntent();
+        assertNotNull(intent);
+        Bundle bundle = intent.getExtras();
+        assertTrue(bundle.containsKey(GlobalScreenshot.EXTRA_ID));
+        assertTrue(bundle.containsKey(GlobalScreenshot.EXTRA_SMART_ACTIONS_ENABLED));
+        assertEquals(deleteAction.title, GlobalScreenshot.ACTION_TYPE_DELETE);
+        assertNull(intent.getAction());
     }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/settings/CurrentUserContextTrackerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/settings/CurrentUserContextTrackerTest.kt
new file mode 100644
index 0000000..628c06a
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/settings/CurrentUserContextTrackerTest.kt
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.systemui.settings
+
+import android.content.Context
+import android.content.ContextWrapper
+import android.os.UserHandle
+import android.testing.AndroidTestingRunner
+import android.testing.TestableLooper
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.broadcast.BroadcastDispatcher
+import junit.framework.Assert.assertTrue
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.Mock
+import org.mockito.Mockito.`when`
+import org.mockito.Mockito.mock
+import org.mockito.MockitoAnnotations
+
+@SmallTest
+@RunWith(AndroidTestingRunner::class)
[email protected]
+class CurrentUserContextTrackerTest : SysuiTestCase() {
+
+    private lateinit var tracker: CurrentUserContextTracker
+    @Mock private lateinit var broadcastDispatcher: BroadcastDispatcher
+
+    @Before
+    fun setUp() {
+        MockitoAnnotations.initMocks(this)
+        allowTestableLooperAsMainThread()
+
+        // wrap Context so that tests don't throw for missing package errors
+        val wrapped = object : ContextWrapper(context) {
+            override fun createContextAsUser(user: UserHandle, flags: Int): Context {
+                val mockContext = mock(Context::class.java)
+                `when`(mockContext.user).thenReturn(user)
+                `when`(mockContext.userId).thenReturn(user.identifier)
+                return mockContext
+            }
+        }
+
+        tracker = CurrentUserContextTracker(wrapped, broadcastDispatcher)
+        tracker.initialize()
+    }
+
+    @Test
+    fun testContextExistsAfterInit_noCrash() {
+        tracker.currentUserContext
+    }
+
+    @Test
+    fun testUserContextIsCorrectAfterUserSwitch() {
+        // We always start out with system ui test
+        assertTrue("Starting userId should be 0", tracker.currentUserContext.userId == 0)
+
+        // WHEN user changes
+        tracker.handleUserSwitched(1)
+
+        // THEN user context should have the correct userId
+        assertTrue("User has changed to userId 1, the context should reflect that",
+                tracker.currentUserContext.userId == 1)
+    }
+
+    @Suppress("UNUSED_PARAMETER")
+    @Test(expected = IllegalStateException::class)
+    fun testContextTrackerThrowsExceptionWhenNotInitialized() {
+        // GIVEN an uninitialized CurrentUserContextTracker
+        val userTracker = CurrentUserContextTracker(context, broadcastDispatcher)
+
+        // WHEN client asks for a context
+        val userContext = userTracker.currentUserContext
+
+        // THEN an exception is thrown
+    }
+}
\ No newline at end of file
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java
index be5b190..23099d7 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java
@@ -192,7 +192,8 @@
 
         assertThat(mTextView.getText()).isEqualTo(
                 mContext.getResources().getString(R.string.dock_alignment_slow_charging));
-        assertThat(mTextView.getCurrentTextColor()).isEqualTo(Color.WHITE);
+        assertThat(mTextView.getCurrentTextColor()).isEqualTo(
+                mContext.getColor(R.color.misalignment_text_color));
     }
 
     @Test
@@ -209,7 +210,8 @@
 
         assertThat(mTextView.getText()).isEqualTo(
                 mContext.getResources().getString(R.string.dock_alignment_not_charging));
-        assertThat(mTextView.getCurrentTextColor()).isEqualTo(Color.WHITE);
+        assertThat(mTextView.getCurrentTextColor()).isEqualTo(
+                mContext.getColor(R.color.misalignment_text_color));
     }
 
     @Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationViewHierarchyManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationViewHierarchyManagerTest.java
index e55ea41..d41b6cf 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationViewHierarchyManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationViewHierarchyManagerTest.java
@@ -46,6 +46,7 @@
 import com.android.systemui.statusbar.notification.NotificationEntryManager;
 import com.android.systemui.statusbar.notification.VisualStabilityManager;
 import com.android.systemui.statusbar.notification.collection.NotificationEntry;
+import com.android.systemui.statusbar.notification.collection.inflation.LowPriorityInflationHelper;
 import com.android.systemui.statusbar.notification.logging.NotificationLogger;
 import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
 import com.android.systemui.statusbar.notification.row.ExpandableView;
@@ -110,7 +111,8 @@
                 mock(BubbleController.class),
                 mock(DynamicPrivacyController.class),
                 mock(ForegroundServiceSectionController.class),
-                mock(DynamicChildBindController.class));
+                mock(DynamicChildBindController.class),
+                mock(LowPriorityInflationHelper.class));
         mViewHierarchyManager.setUpWithPresenter(mPresenter, mListContainer);
     }
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/GroupEntryHelper.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/GroupEntryHelper.java
new file mode 100644
index 0000000..038dd17
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/GroupEntryHelper.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.statusbar.notification.collection;
+
+import java.util.List;
+
+/**
+ * Helper class to provide methods for test classes that need {@link GroupEntry}'s for their tests.
+ */
+public class GroupEntryHelper {
+    /**
+     * Create a group entry for testing purposes.
+     * @param groupKey group key for the group and all its entries
+     * @param summary summary notification for group
+     * @param children group's children notifications
+     */
+    public static final GroupEntry createGroup(
+            String groupKey,
+            NotificationEntry summary,
+            List<NotificationEntry> children) {
+        GroupEntry groupEntry = new GroupEntry(groupKey);
+        groupEntry.setSummary(summary);
+        for (NotificationEntry child : children) {
+            groupEntry.addChild(child);
+        }
+        return groupEntry;
+    }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinatorTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinatorTest.java
index f3038ce..730481a 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinatorTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinatorTest.java
@@ -39,7 +39,7 @@
 import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifSection;
 import com.android.systemui.statusbar.notification.collection.notifcollection.NotifCollectionListener;
 import com.android.systemui.statusbar.notification.collection.notifcollection.NotifLifetimeExtender;
-import com.android.systemui.statusbar.notification.headsup.HeadsUpViewBinder;
+import com.android.systemui.statusbar.notification.interruption.HeadsUpViewBinder;
 import com.android.systemui.statusbar.notification.interruption.NotificationInterruptStateProvider;
 import com.android.systemui.statusbar.notification.row.NotifBindPipeline.BindCallback;
 import com.android.systemui.statusbar.policy.HeadsUpManager;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinatorTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinatorTest.java
index 35b31c0..faf9da3 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinatorTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinatorTest.java
@@ -21,6 +21,7 @@
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 
@@ -32,6 +33,8 @@
 
 import com.android.internal.statusbar.IStatusBarService;
 import com.android.systemui.SysuiTestCase;
+import com.android.systemui.statusbar.notification.collection.GroupEntry;
+import com.android.systemui.statusbar.notification.collection.GroupEntryHelper;
 import com.android.systemui.statusbar.notification.collection.NotifInflaterImpl;
 import com.android.systemui.statusbar.notification.collection.NotifPipeline;
 import com.android.systemui.statusbar.notification.collection.NotifViewBarn;
@@ -50,6 +53,7 @@
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 
+import java.util.ArrayList;
 import java.util.List;
 
 @SmallTest
@@ -57,6 +61,8 @@
 @TestableLooper.RunWithLooper
 public class PreparationCoordinatorTest extends SysuiTestCase {
     private static final String TEST_MESSAGE = "TEST_MESSAGE";
+    private static final String TEST_GROUP_KEY = "TEST_GROUP_KEY";
+    private static final int TEST_CHILD_BIND_CUTOFF = 9;
 
     private PreparationCoordinator mCoordinator;
     private NotifCollectionListener mCollectionListener;
@@ -88,7 +94,8 @@
                 mNotifInflater,
                 mErrorManager,
                 mock(NotifViewBarn.class),
-                mService);
+                mService,
+                TEST_CHILD_BIND_CUTOFF);
 
         ArgumentCaptor<NotifFilter> filterCaptor = ArgumentCaptor.forClass(NotifFilter.class);
         mCoordinator.attach(mNotifPipeline);
@@ -175,4 +182,44 @@
         // THEN it isn't filtered from shade list
         assertFalse(mUninflatedFilter.shouldFilterOut(mEntry, 0));
     }
+
+    @Test
+    public void testCutoffGroupChildrenNotInflated() {
+        // WHEN there is a new notification group is posted
+        int id = 0;
+        NotificationEntry summary = new NotificationEntryBuilder()
+                .setOverrideGroupKey(TEST_GROUP_KEY)
+                .setId(id++)
+                .build();
+        List<NotificationEntry> children = new ArrayList<>();
+        for (int i = 0; i < TEST_CHILD_BIND_CUTOFF + 1; i++) {
+            NotificationEntry child = new NotificationEntryBuilder()
+                    .setOverrideGroupKey(TEST_GROUP_KEY)
+                    .setId(id++)
+                    .build();
+            children.add(child);
+        }
+        GroupEntry groupEntry = GroupEntryHelper.createGroup(TEST_GROUP_KEY, summary, children);
+
+        mCollectionListener.onEntryInit(summary);
+        for (NotificationEntry entry : children) {
+            mCollectionListener.onEntryInit(entry);
+        }
+
+        mCollectionListener.onEntryAdded(summary);
+        for (NotificationEntry entry : children) {
+            mCollectionListener.onEntryAdded(entry);
+        }
+
+        mBeforeFilterListener.onBeforeFinalizeFilter(List.of(groupEntry));
+
+        // THEN we inflate up to the cut-off only
+        for (int i = 0; i < children.size(); i++) {
+            if (i < TEST_CHILD_BIND_CUTOFF) {
+                verify(mNotifInflater).inflateViews(eq(children.get(i)), any());
+            } else {
+                verify(mNotifInflater, never()).inflateViews(eq(children.get(i)), any());
+            }
+        }
+    }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowTest.java
index 43dcbe3..2684cc2 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowTest.java
@@ -41,7 +41,6 @@
 import android.testing.TestableLooper;
 import android.testing.TestableLooper.RunWithLooper;
 import android.util.ArraySet;
-import android.view.NotificationHeaderView;
 import android.view.View;
 
 import androidx.test.filters.SmallTest;
@@ -302,7 +301,7 @@
     @Test
     public void testGetNumUniqueChildren_multiChannel() {
         List<ExpandableNotificationRow> childRows =
-                mGroupRow.getChildrenContainer().getNotificationChildren();
+                mGroupRow.getChildrenContainer().getAttachedChildren();
         // Give each child a unique channel id/name.
         int i = 0;
         for (ExpandableNotificationRow childRow : childRows) {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/FooterViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/FooterViewTest.java
index 2336958..9039e1b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/FooterViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/FooterViewTest.java
@@ -24,6 +24,7 @@
 
 import android.view.LayoutInflater;
 import android.view.View;
+import android.widget.TextView;
 
 import androidx.test.filters.SmallTest;
 import androidx.test.runner.AndroidJUnit4;
@@ -67,6 +68,22 @@
     }
 
     @Test
+    public void setHistoryShown() {
+        mView.showHistory(true);
+        assertTrue(mView.isHistoryShown());
+        assertTrue(((TextView) mView.findViewById(R.id.manage_text))
+                .getText().toString().contains("History"));
+    }
+
+    @Test
+    public void setHistoryNotShown() {
+        mView.showHistory(false);
+        assertFalse(mView.isHistoryShown());
+        assertTrue(((TextView) mView.findViewById(R.id.manage_text))
+                .getText().toString().contains("Manage"));
+    }
+
+    @Test
     public void testPerformVisibilityAnimation() {
         mView.setVisible(false /* visible */, false /* animate */);
         assertFalse(mView.isVisible());
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationBlockingHelperManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationBlockingHelperManagerTest.java
index 7c8328d..5aeb43fb 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationBlockingHelperManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationBlockingHelperManagerTest.java
@@ -143,7 +143,7 @@
     public void testPerhapsShowBlockingHelper_notShownForMultiChannelGroup() throws Exception {
         ExpandableNotificationRow groupRow = createBlockableGroupRowSpy(10);
         int i = 0;
-        for (ExpandableNotificationRow childRow : groupRow.getNotificationChildren()) {
+        for (ExpandableNotificationRow childRow : groupRow.getAttachedChildren()) {
             modifyRanking(childRow.getEntry())
                     .setChannel(
                             new NotificationChannel(
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfoTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfoTest.java
index b6bd5e2..6db8685 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfoTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfoTest.java
@@ -16,13 +16,12 @@
 
 package com.android.systemui.statusbar.notification.row;
 
-import static android.app.Notification.FLAG_BUBBLE;
+import static android.app.NotificationManager.BUBBLE_PREFERENCE_ALL;
+import static android.app.NotificationManager.BUBBLE_PREFERENCE_SELECTED;
 import static android.app.NotificationManager.IMPORTANCE_DEFAULT;
 import static android.app.NotificationManager.IMPORTANCE_HIGH;
 import static android.app.NotificationManager.IMPORTANCE_LOW;
 import static android.print.PrintManager.PRINT_SPOOLER_PACKAGE_NAME;
-import static android.provider.Settings.Global.NOTIFICATION_BUBBLES;
-import static android.provider.Settings.Secure.BUBBLE_IMPORTANT_CONVERSATIONS;
 import static android.view.View.GONE;
 import static android.view.View.VISIBLE;
 
@@ -36,8 +35,10 @@
 import static org.mockito.Mockito.any;
 import static org.mockito.Mockito.anyInt;
 import static org.mockito.Mockito.anyString;
+import static org.mockito.Mockito.atLeastOnce;
 import static org.mockito.Mockito.doAnswer;
 import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
@@ -47,6 +48,7 @@
 import android.app.Notification;
 import android.app.NotificationChannel;
 import android.app.NotificationChannelGroup;
+import android.app.NotificationManager;
 import android.app.PendingIntent;
 import android.app.Person;
 import android.content.Intent;
@@ -59,20 +61,19 @@
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.Icon;
 import android.os.UserHandle;
-import android.provider.Settings;
 import android.service.notification.StatusBarNotification;
 import android.test.suitebuilder.annotation.SmallTest;
 import android.testing.AndroidTestingRunner;
 import android.testing.TestableLooper;
 import android.view.LayoutInflater;
 import android.view.View;
-import android.widget.ImageButton;
 import android.widget.ImageView;
 import android.widget.TextView;
 
 import com.android.internal.logging.MetricsLogger;
 import com.android.settingslib.notification.ConversationIconFactory;
 import com.android.systemui.Dependency;
+import com.android.systemui.Prefs;
 import com.android.systemui.R;
 import com.android.systemui.SysuiTestCase;
 import com.android.systemui.bubbles.BubbleController;
@@ -87,8 +88,10 @@
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.Answers;
 import org.mockito.ArgumentCaptor;
 import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
 import org.mockito.junit.MockitoJUnit;
 import org.mockito.junit.MockitoRule;
 import org.mockito.stubbing.Answer;
@@ -97,6 +100,8 @@
 import java.util.List;
 import java.util.concurrent.CountDownLatch;
 
+import javax.inject.Provider;
+
 @SmallTest
 @RunWith(AndroidTestingRunner.class)
 @TestableLooper.RunWithLooper
@@ -143,9 +148,15 @@
     private ShadeController mShadeController;
     @Mock
     private ConversationIconFactory mIconFactory;
+    @Mock(answer = Answers.RETURNS_SELF)
+    private PriorityOnboardingDialogController.Builder mBuilder;
+    private Provider<PriorityOnboardingDialogController.Builder> mBuilderProvider = () -> mBuilder;
+    @Mock
+    private Notification.BubbleMetadata mBubbleMetadata;
 
     @Before
     public void setUp() throws Exception {
+        MockitoAnnotations.initMocks(this);
         mTestableLooper = TestableLooper.get(this);
 
         mDependency.injectTestDependency(Dependency.BG_LOOPER, mTestableLooper.getLooper());
@@ -219,6 +230,11 @@
         when(mMockINotificationManager.getConversationNotificationChannel(anyString(), anyInt(),
                 anyString(), eq(TEST_CHANNEL), eq(false), eq(CONVERSATION_ID)))
                 .thenReturn(mConversationChannel);
+
+        when(mMockINotificationManager.getConsolidatedNotificationPolicy())
+                .thenReturn(mock(NotificationManager.Policy.class));
+
+        when(mBuilder.build()).thenReturn(mock(PriorityOnboardingDialogController.class));
     }
 
     @Test
@@ -231,9 +247,12 @@
                 TEST_PACKAGE_NAME,
                 mNotificationChannel,
                 mEntry,
+                mBubbleMetadata,
                 null,
                 null,
                 mIconFactory,
+                mContext,
+                mBuilderProvider,
                 true);
         final ImageView view = mNotificationInfo.findViewById(R.id.conversation_icon);
         assertEquals(mIconDrawable, view.getDrawable());
@@ -250,9 +269,12 @@
                 TEST_PACKAGE_NAME,
                 mNotificationChannel,
                 mEntry,
+                mBubbleMetadata,
                 null,
                 null,
                 mIconFactory,
+                mContext,
+                mBuilderProvider,
                 true);
         final TextView textView = mNotificationInfo.findViewById(R.id.pkg_name);
         assertTrue(textView.getText().toString().contains("App Name"));
@@ -270,7 +292,8 @@
                 TEST_PACKAGE_NAME,
                 mNotificationChannel,
                 mEntry,
-                null,
+    mBubbleMetadata,
+    null,
                 null,
                 null,
                 true);
@@ -295,9 +318,12 @@
                 TEST_PACKAGE_NAME,
                 mNotificationChannel,
                 mEntry,
+                mBubbleMetadata,
                 null,
                 null,
                 mIconFactory,
+                mContext,
+                mBuilderProvider,
                 true);
         final TextView textView = mNotificationInfo.findViewById(R.id.group_name);
         assertTrue(textView.getText().toString().contains(group.getName()));
@@ -316,9 +342,12 @@
                 TEST_PACKAGE_NAME,
                 mNotificationChannel,
                 mEntry,
+                mBubbleMetadata,
                 null,
                 null,
                 mIconFactory,
+                mContext,
+                mBuilderProvider,
                 true);
         final TextView textView = mNotificationInfo.findViewById(R.id.group_name);
         assertEquals(VISIBLE, mNotificationInfo.findViewById(R.id.header).getVisibility());
@@ -336,9 +365,12 @@
                 TEST_PACKAGE_NAME,
                 mNotificationChannel,
                 mEntry,
+                mBubbleMetadata,
                 null,
                 null,
                 mIconFactory,
+                mContext,
+                mBuilderProvider,
                 true);
         final TextView nameView = mNotificationInfo.findViewById(R.id.delegate_name);
         assertEquals(GONE, nameView.getVisibility());
@@ -363,9 +395,12 @@
                 TEST_PACKAGE_NAME,
                 mNotificationChannel,
                 entry,
+                mBubbleMetadata,
                 null,
                 null,
                 mIconFactory,
+                mContext,
+                mBuilderProvider,
                 true);
         final TextView nameView = mNotificationInfo.findViewById(R.id.delegate_name);
         assertEquals(VISIBLE, nameView.getVisibility());
@@ -383,12 +418,15 @@
                 TEST_PACKAGE_NAME,
                 mNotificationChannel,
                 mEntry,
+                mBubbleMetadata,
                 (View v, NotificationChannel c, int appUid) -> {
                     assertEquals(mConversationChannel, c);
                     latch.countDown();
                 },
                 null,
                 mIconFactory,
+                mContext,
+                mBuilderProvider,
                 true);
 
         final View settingsButton = mNotificationInfo.findViewById(R.id.info);
@@ -407,9 +445,12 @@
                 TEST_PACKAGE_NAME,
                 mNotificationChannel,
                 mEntry,
+                mBubbleMetadata,
                 null,
                 null,
                 mIconFactory,
+                mContext,
+                mBuilderProvider,
                 true);
         final View settingsButton = mNotificationInfo.findViewById(R.id.info);
         assertTrue(settingsButton.getVisibility() != View.VISIBLE);
@@ -426,12 +467,15 @@
                 TEST_PACKAGE_NAME,
                 mNotificationChannel,
                 mEntry,
+                mBubbleMetadata,
                 (View v, NotificationChannel c, int appUid) -> {
                     assertEquals(mNotificationChannel, c);
                     latch.countDown();
                 },
                 null,
                 mIconFactory,
+                mContext,
+                mBuilderProvider,
                 false);
         final View settingsButton = mNotificationInfo.findViewById(R.id.info);
         assertTrue(settingsButton.getVisibility() != View.VISIBLE);
@@ -449,16 +493,21 @@
                 TEST_PACKAGE_NAME,
                 mNotificationChannel,
                 mEntry,
+                mBubbleMetadata,
                 null,
                 null,
                 mIconFactory,
+                mContext,
+                mBuilderProvider,
                 true);
         View view = mNotificationInfo.findViewById(R.id.silence);
         assertThat(view.isSelected()).isTrue();
     }
 
     @Test
-    public void testBindNotification_defaultSelected_notFave_notSilent() {
+    public void testBindNotification_defaultSelected_notFave_notSilent() throws Exception {
+        when(mMockINotificationManager.getBubblePreferenceForPackage(anyString(), anyInt()))
+                .thenReturn(BUBBLE_PREFERENCE_SELECTED);
         mConversationChannel.setImportance(IMPORTANCE_HIGH);
         mConversationChannel.setImportantConversation(false);
         mConversationChannel.setAllowBubbles(true);
@@ -470,12 +519,47 @@
                 TEST_PACKAGE_NAME,
                 mNotificationChannel,
                 mEntry,
+                mBubbleMetadata,
                 null,
                 null,
                 mIconFactory,
+                mContext,
+                mBuilderProvider,
                 true);
         View view = mNotificationInfo.findViewById(R.id.default_behavior);
         assertThat(view.isSelected()).isTrue();
+        assertThat(((TextView) view.findViewById(R.id.default_summary)).getText()).isEqualTo(
+                mContext.getString(R.string.notification_channel_summary_default));
+    }
+
+    @Test
+    public void testBindNotification_default_allCanBubble() throws Exception {
+        when(mMockINotificationManager.getBubblePreferenceForPackage(anyString(), anyInt()))
+                .thenReturn(BUBBLE_PREFERENCE_ALL);
+        when(mMockPackageManager.getApplicationLabel(any())).thenReturn("App Name");
+        mConversationChannel.setImportance(IMPORTANCE_HIGH);
+        mConversationChannel.setImportantConversation(false);
+        mConversationChannel.setAllowBubbles(true);
+        mNotificationInfo.bindNotification(
+                mShortcutManager,
+                mMockPackageManager,
+                mMockINotificationManager,
+                mVisualStabilityManager,
+                TEST_PACKAGE_NAME,
+                mNotificationChannel,
+                mEntry,
+                mBubbleMetadata,
+                null,
+                null,
+                mIconFactory,
+                mContext,
+                mBuilderProvider,
+                true);
+        View view = mNotificationInfo.findViewById(R.id.default_behavior);
+        assertThat(view.isSelected()).isTrue();
+        assertThat(((TextView) view.findViewById(R.id.default_summary)).getText()).isEqualTo(
+                mContext.getString(R.string.notification_channel_summary_default_with_bubbles,
+                        "App Name"));
     }
 
     @Test
@@ -492,9 +576,12 @@
                 TEST_PACKAGE_NAME,
                 mNotificationChannel,
                 mEntry,
+                mBubbleMetadata,
                 null,
                 null,
                 mIconFactory,
+                mContext,
+                mBuilderProvider,
                 true);
 
         View fave = mNotificationInfo.findViewById(R.id.priority);
@@ -530,9 +617,12 @@
                 TEST_PACKAGE_NAME,
                 mNotificationChannel,
                 mEntry,
+                mBubbleMetadata,
                 null,
                 null,
                 mIconFactory,
+                mContext,
+                mBuilderProvider,
                 true);
 
         mNotificationInfo.findViewById(R.id.default_behavior).performClick();
@@ -567,9 +657,12 @@
                 TEST_PACKAGE_NAME,
                 mNotificationChannel,
                 mEntry,
+                mBubbleMetadata,
                 null,
                 null,
                 mIconFactory,
+                mContext,
+                mBuilderProvider,
                 true);
 
         View silence = mNotificationInfo.findViewById(R.id.silence);
@@ -605,9 +698,12 @@
                 TEST_PACKAGE_NAME,
                 mNotificationChannel,
                 mEntry,
+                mBubbleMetadata,
                 null,
                 null,
                 mIconFactory,
+                mContext,
+                mBuilderProvider,
                 true);
 
         View fave = mNotificationInfo.findViewById(R.id.priority);
@@ -637,9 +733,12 @@
                 TEST_PACKAGE_NAME,
                 mNotificationChannel,
                 mEntry,
+                mBubbleMetadata,
                 null,
                 null,
                 mIconFactory,
+                mContext,
+                mBuilderProvider,
                 true);
 
         View fave = mNotificationInfo.findViewById(R.id.priority);
@@ -667,9 +766,12 @@
                 TEST_PACKAGE_NAME,
                 mNotificationChannel,
                 mEntry,
+                mBubbleMetadata,
                 null,
                 null,
                 mIconFactory,
+                mContext,
+                mBuilderProvider,
                 true);
 
         mNotificationInfo.findViewById(R.id.default_behavior).performClick();
@@ -698,9 +800,12 @@
                 TEST_PACKAGE_NAME,
                 mNotificationChannel,
                 mEntry,
+                mBubbleMetadata,
                 null,
                 null,
                 mIconFactory,
+                mContext,
+                mBuilderProvider,
                 true);
 
         mNotificationInfo.findViewById(R.id.default_behavior).performClick();
@@ -729,9 +834,12 @@
                 TEST_PACKAGE_NAME,
                 mNotificationChannel,
                 mEntry,
+                mBubbleMetadata,
                 null,
                 null,
                 mIconFactory,
+                mContext,
+                mBuilderProvider,
                 true);
 
         mNotificationInfo.findViewById(R.id.default_behavior).performClick();
@@ -759,9 +867,12 @@
                 TEST_PACKAGE_NAME,
                 mNotificationChannel,
                 mEntry,
+                mBubbleMetadata,
                 null,
                 null,
                 mIconFactory,
+                mContext,
+                mBuilderProvider,
                 true);
 
         View silence = mNotificationInfo.findViewById(R.id.silence);
@@ -788,9 +899,12 @@
                 TEST_PACKAGE_NAME,
                 mNotificationChannel,
                 mEntry,
+                mBubbleMetadata,
                 null,
                 null,
                 mIconFactory,
+                mContext,
+                mBuilderProvider,
                 true);
 
         verify(mMockINotificationManager, times(1)).createConversationNotificationChannelForPackage(
@@ -808,12 +922,85 @@
                 TEST_PACKAGE_NAME,
                 mNotificationChannel,
                 mEntry,
+                mBubbleMetadata,
                 null,
                 null,
                 mIconFactory,
+                mContext,
+                mBuilderProvider,
                 true);
 
         verify(mMockINotificationManager, never()).createConversationNotificationChannelForPackage(
                 anyString(), anyInt(), anyString(), any(), eq(CONVERSATION_ID));
     }
+
+    @Test
+    public void testSelectPriorityPresentsOnboarding_firstTime() {
+        // GIVEN pref is false
+        Prefs.putBoolean(mContext, Prefs.Key.HAS_SEEN_PRIORITY_ONBOARDING, false);
+
+        // GIVEN the priority onboarding screen is present
+        PriorityOnboardingDialogController.Builder b =
+                mock(PriorityOnboardingDialogController.Builder.class, Answers.RETURNS_SELF);
+        PriorityOnboardingDialogController controller =
+                mock(PriorityOnboardingDialogController.class);
+        when(b.build()).thenReturn(controller);
+
+        // GIVEN the user is changing conversation settings
+        mNotificationInfo.bindNotification(
+                mShortcutManager,
+                mMockPackageManager,
+                mMockINotificationManager,
+                mVisualStabilityManager,
+                TEST_PACKAGE_NAME,
+                mNotificationChannel,
+                mEntry,
+                mBubbleMetadata,
+                null,
+                null,
+                mIconFactory,
+                mContext,
+                () -> b,
+                true);
+
+        // WHEN user clicks "priority"
+        mNotificationInfo.setSelectedAction(NotificationConversationInfo.ACTION_FAVORITE);
+
+        // THEN the user is presented with the priority onboarding screen
+        verify(controller, atLeastOnce()).show();
+    }
+
+    @Test
+    public void testSelectPriorityDoesNotShowOnboarding_secondTime() {
+        //WHEN pref is true
+        Prefs.putBoolean(mContext, Prefs.Key.HAS_SEEN_PRIORITY_ONBOARDING, true);
+
+        PriorityOnboardingDialogController.Builder b =
+                mock(PriorityOnboardingDialogController.Builder.class, Answers.RETURNS_SELF);
+        PriorityOnboardingDialogController controller =
+                mock(PriorityOnboardingDialogController.class);
+        when(b.build()).thenReturn(controller);
+
+        mNotificationInfo.bindNotification(
+                mShortcutManager,
+                mMockPackageManager,
+                mMockINotificationManager,
+                mVisualStabilityManager,
+                TEST_PACKAGE_NAME,
+                mNotificationChannel,
+                mEntry,
+                mBubbleMetadata,
+                null,
+                null,
+                mIconFactory,
+                mContext,
+                () -> b,
+                true);
+
+        // WHEN user clicks "priority"
+        mNotificationInfo.setSelectedAction(NotificationConversationInfo.ACTION_FAVORITE);
+
+        // THEN the user is presented with the priority onboarding screen
+        verify(controller, never()).show();
+    }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationEntryManagerInflationTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationEntryManagerInflationTest.java
index 855f524..2894abb8 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationEntryManagerInflationTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationEntryManagerInflationTest.java
@@ -63,6 +63,7 @@
 import com.android.systemui.statusbar.notification.NotificationSectionsFeatureManager;
 import com.android.systemui.statusbar.notification.collection.NotificationEntry;
 import com.android.systemui.statusbar.notification.collection.NotificationRankingManager;
+import com.android.systemui.statusbar.notification.collection.inflation.LowPriorityInflationHelper;
 import com.android.systemui.statusbar.notification.collection.inflation.NotificationRowBinderImpl;
 import com.android.systemui.statusbar.notification.collection.provider.HighPriorityProvider;
 import com.android.systemui.statusbar.notification.icon.IconBuilder;
@@ -264,7 +265,8 @@
                 new IconManager(
                         mEntryManager,
                         mock(LauncherApps.class),
-                        new IconBuilder(mContext)));
+                        new IconBuilder(mContext)),
+                mock(LowPriorityInflationHelper.class));
 
         mEntryManager.setUpWithPresenter(mPresenter);
         mEntryManager.addNotificationEntryListener(mEntryListener);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java
index ed46423..5813740 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java
@@ -66,6 +66,7 @@
 import com.android.internal.logging.MetricsLogger;
 import com.android.systemui.SysuiTestCase;
 import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin;
+import com.android.systemui.settings.CurrentUserContextTracker;
 import com.android.systemui.statusbar.NotificationLockscreenUserManager;
 import com.android.systemui.statusbar.NotificationPresenter;
 import com.android.systemui.statusbar.notification.NotificationActivityStarter;
@@ -83,11 +84,14 @@
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.Answers;
 import org.mockito.ArgumentCaptor;
 import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnit;
 import org.mockito.junit.MockitoRule;
 
+import javax.inject.Provider;
+
 /**
  * Tests for {@link NotificationGutsManager}.
  */
@@ -120,6 +124,10 @@
     @Mock private LauncherApps mLauncherApps;
     @Mock private ShortcutManager mShortcutManager;
     @Mock private PeopleNotificationIdentifier mPeopleNotificationIdentifier;
+    @Mock private CurrentUserContextTracker mContextTracker;
+    @Mock(answer = Answers.RETURNS_SELF)
+    private PriorityOnboardingDialogController.Builder mBuilder;
+    private Provider<PriorityOnboardingDialogController.Builder> mProvider = () -> mBuilder;
 
     @Before
     public void setUp() {
@@ -136,7 +144,7 @@
 
         mGutsManager = new NotificationGutsManager(mContext, mVisualStabilityManager,
                 () -> mStatusBar, mHandler, mAccessibilityManager, mHighPriorityProvider,
-                mINotificationManager, mLauncherApps, mShortcutManager);
+                mINotificationManager, mLauncherApps, mShortcutManager, mContextTracker, mProvider);
         mGutsManager.setUpWithPresenter(mPresenter, mStackScroller,
                 mCheckSaveListener, mOnSettingsClickListener);
         mGutsManager.setNotificationActivityStarter(mNotificationActivityStarter);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/RowContentBindStageTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/RowContentBindStageTest.java
index 96a58e2..ad3bd71 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/RowContentBindStageTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/RowContentBindStageTest.java
@@ -147,30 +147,6 @@
     }
 
     @Test
-    public void testSetUseGroupInChild() {
-        // GIVEN a view with all content bound.
-        RowContentBindParams params = mRowContentBindStage.getStageParams(mEntry);
-        params.requireContentViews(FLAG_CONTENT_VIEW_ALL);
-        params.clearDirtyContentViews();
-
-        // WHEN use group is set and stage executed.
-        params.setUseChildInGroup(true);
-        mRowContentBindStage.executeStage(mEntry, mRow, (en) -> { });
-
-        // THEN binder is called with use group view and contracted/expanded are called to bind.
-        ArgumentCaptor<BindParams> bindParamsCaptor = ArgumentCaptor.forClass(BindParams.class);
-        verify(mBinder).bindContent(
-                eq(mEntry),
-                any(),
-                eq(FLAG_CONTENT_VIEW_CONTRACTED | FLAG_CONTENT_VIEW_EXPANDED),
-                bindParamsCaptor.capture(),
-                anyBoolean(),
-                any());
-        BindParams usedParams = bindParamsCaptor.getValue();
-        assertTrue(usedParams.isChildInGroup);
-    }
-
-    @Test
     public void testSetUseIncreasedHeight() {
         // GIVEN a view with all content bound.
         RowContentBindParams params = mRowContentBindStage.getStageParams(mEntry);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java
index 657bc8d..1cb4d89 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java
@@ -13,6 +13,7 @@
 
 package com.android.systemui.statusbar.notification.stack;
 
+import static android.provider.Settings.Secure.NOTIFICATION_HISTORY_ENABLED;
 import static android.provider.Settings.Secure.NOTIFICATION_NEW_INTERRUPTION_MODEL;
 
 import static junit.framework.Assert.assertEquals;
@@ -151,6 +152,7 @@
                 NOTIFICATION_NEW_INTERRUPTION_MODEL, 0);
         Settings.Secure.putInt(mContext.getContentResolver(),
                 NOTIFICATION_NEW_INTERRUPTION_MODEL, 1);
+        Settings.Secure.putInt(mContext.getContentResolver(), NOTIFICATION_HISTORY_ENABLED, 1);
 
         // Inject dependencies before initializing the layout
         mDependency.injectMockDependency(VisualStabilityManager.class);
@@ -311,7 +313,7 @@
         mStackScroller.setFooterView(view);
         when(view.willBeGone()).thenReturn(true);
 
-        mStackScroller.updateFooterView(true, false);
+        mStackScroller.updateFooterView(true, false, true);
 
         verify(view).setVisible(eq(true), anyBoolean());
         verify(view).setSecondaryVisible(eq(false), anyBoolean());
@@ -323,7 +325,7 @@
         mStackScroller.setFooterView(view);
         when(view.willBeGone()).thenReturn(true);
 
-        mStackScroller.updateFooterView(true, true);
+        mStackScroller.updateFooterView(true, true, true);
 
         verify(view).setVisible(eq(true), anyBoolean());
         verify(view).setSecondaryVisible(eq(true), anyBoolean());
@@ -344,8 +346,10 @@
         setBarStateForTest(StatusBarState.SHADE);
         assertEquals(0, mEntryManager.getActiveNotificationsCount());
 
+        FooterView view = mock(FooterView.class);
+        mStackScroller.setFooterView(view);
         mStackScroller.updateFooter();
-        verify(mStackScroller, atLeastOnce()).updateFooterView(false, false);
+        verify(mStackScroller, atLeastOnce()).updateFooterView(false, false, true);
     }
 
     @Test
@@ -361,8 +365,10 @@
         when(mStackScroller.getChildAt(anyInt())).thenReturn(row);
         when(mRemoteInputController.isRemoteInputActive()).thenReturn(true);
 
+        FooterView view = mock(FooterView.class);
+        mStackScroller.setFooterView(view);
         mStackScroller.updateFooter();
-        verify(mStackScroller).updateFooterView(false, true);
+        verify(mStackScroller).updateFooterView(false, true, true);
     }
 
     @Test
@@ -378,8 +384,10 @@
         when(mStackScroller.getChildCount()).thenReturn(1);
         when(mStackScroller.getChildAt(anyInt())).thenReturn(row);
 
+        FooterView view = mock(FooterView.class);
+        mStackScroller.setFooterView(view);
         mStackScroller.updateFooter();
-        verify(mStackScroller).updateFooterView(true, true);
+        verify(mStackScroller).updateFooterView(true, true, true);
     }
 
     @Test
@@ -390,8 +398,10 @@
         entries.add(new NotificationEntryBuilder().build());
         addEntriesToEntryManager(entries);
 
+        FooterView view = mock(FooterView.class);
+        mStackScroller.setFooterView(view);
         mStackScroller.updateFooter();
-        verify(mStackScroller).updateFooterView(true, false);
+        verify(mStackScroller).updateFooterView(true, false, true);
     }
 
     @Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaTest.kt
index 2b091f2..210744e 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaTest.kt
@@ -6,11 +6,18 @@
 import androidx.test.filters.SmallTest
 import com.android.systemui.R
 import com.android.systemui.SysuiTestCase
+import com.android.systemui.assist.AssistManager
+import com.android.systemui.plugins.ActivityStarter
+import com.android.systemui.statusbar.policy.AccessibilityController
+import com.android.systemui.statusbar.policy.FlashlightController
+import com.android.systemui.statusbar.policy.KeyguardStateController
+import com.android.systemui.tuner.TunerService
 import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.mockito.Mock
 import org.mockito.MockitoAnnotations
+import java.util.concurrent.Executor
 
 @SmallTest
 @RunWith(AndroidTestingRunner::class)
@@ -24,6 +31,15 @@
     @Before
     fun setup() {
         MockitoAnnotations.initMocks(this)
+        // Mocked dependencies
+        mDependency.injectMockDependency(AccessibilityController::class.java)
+        mDependency.injectMockDependency(ActivityStarter::class.java)
+        mDependency.injectMockDependency(AssistManager::class.java)
+        mDependency.injectTestDependency(Executor::class.java, Executor { it.run() })
+        mDependency.injectMockDependency(FlashlightController::class.java)
+        mDependency.injectMockDependency(KeyguardStateController::class.java)
+        mDependency.injectMockDependency(TunerService::class.java)
+
         mKeyguardBottomArea = LayoutInflater.from(mContext).inflate(
                 R.layout.keyguard_bottom_area, null, false) as KeyguardBottomAreaView
         mKeyguardBottomArea.setStatusBar(mStatusBar)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java
index e052ae2..0a041e4 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java
@@ -26,7 +26,6 @@
 import static org.mockito.Mockito.doAnswer;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.reset;
-import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.verifyNoMoreInteractions;
 import static org.mockito.Mockito.verifyZeroInteractions;
@@ -37,6 +36,7 @@
 import android.os.Handler;
 import android.testing.AndroidTestingRunner;
 import android.testing.TestableLooper;
+import android.view.View;
 import android.view.ViewGroup;
 import android.view.ViewTreeObserver;
 import android.widget.FrameLayout;
@@ -64,6 +64,7 @@
 import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnit;
 import org.mockito.junit.MockitoRule;
+import org.mockito.stubbing.Answer;
 
 @SmallTest
 @RunWith(AndroidTestingRunner.class)
@@ -94,9 +95,11 @@
     private Handler mHandler;
     @Mock
     private KeyguardSecurityModel mKeyguardSecurityModel;
+    @Mock
+    private ViewGroup mRootView;
     @Rule
     public MockitoRule mRule = MockitoJUnit.rule();
-    private ViewGroup mRootView;
+    private Integer mRootVisibility = View.INVISIBLE;
     private KeyguardBouncer mBouncer;
 
     @Before
@@ -105,6 +108,11 @@
         mDependency.injectTestDependency(KeyguardUpdateMonitor.class, mKeyguardUpdateMonitor);
         mDependency.injectTestDependency(KeyguardSecurityModel.class, mKeyguardSecurityModel);
         mDependency.injectMockDependency(KeyguardStateController.class);
+        when(mRootView.getVisibility()).thenAnswer((Answer<Integer>) invocation -> mRootVisibility);
+        doAnswer(invocation -> {
+            mRootVisibility = invocation.getArgument(0);
+            return null;
+        }).when(mRootView).setVisibility(anyInt());
         when(mKeyguardSecurityModel.getSecurityMode(anyInt()))
                 .thenReturn(KeyguardSecurityModel.SecurityMode.None);
         DejankUtils.setImmediate(true);
@@ -117,10 +125,8 @@
                 mKeyguardBypassController, mHandler) {
             @Override
             protected void inflateView() {
-                super.inflateView();
                 mKeyguardView = mKeyguardHostView;
-                mRoot = spy(mRoot);
-                mRootView = mRoot;
+                mRoot = mRootView;
             }
         };
     }
@@ -212,8 +218,10 @@
         verify(mExpansionCallback).onFullyShown();
 
         verify(mExpansionCallback, never()).onStartingToHide();
+        verify(mKeyguardHostView, never()).onStartingToHide();
         mBouncer.setExpansion(0.9f);
         verify(mExpansionCallback).onStartingToHide();
+        verify(mKeyguardHostView).onStartingToHide();
     }
 
     @Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightBarControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightBarControllerTest.java
index 8ab660c..3e46907 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightBarControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightBarControllerTest.java
@@ -56,7 +56,7 @@
         when(mStatusBarIconController.getTransitionsController()).thenReturn(
                 mLightBarTransitionsController);
         mLightBarController = new LightBarController(mContext, mStatusBarIconController,
-                mock(BatteryController.class));
+                mock(BatteryController.class), mock(NavigationModeController.class));
     }
 
     @Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarTransitionsTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarTransitionsTest.java
index 27a5002..14c6e9f9 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarTransitionsTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarTransitionsTest.java
@@ -17,6 +17,7 @@
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.when;
@@ -50,9 +51,11 @@
         mDependency.injectMockDependency(IWindowManager.class);
         mDependency.injectMockDependency(AssistManager.class);
         mDependency.injectMockDependency(OverviewProxyService.class);
-        mDependency.injectMockDependency(NavigationModeController.class);
         mDependency.injectMockDependency(StatusBarStateController.class);
         mDependency.injectMockDependency(KeyguardStateController.class);
+        doReturn(mContext)
+                .when(mDependency.injectMockDependency(NavigationModeController.class))
+                .getCurrentUserContext();
 
         NavigationBarView navBar = spy(new NavigationBarView(mContext, null));
         when(navBar.getCurrentView()).thenReturn(navBar);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterTest.java
index dd28687..1afe132 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterTest.java
@@ -176,25 +176,43 @@
         when(mStatusBarStateController.getState()).thenReturn(StatusBarState.SHADE);
         when(mFeatureFlags.isNewNotifPipelineRenderingEnabled()).thenReturn(false);
 
-        mNotificationActivityStarter = (new StatusBarNotificationActivityStarter.Builder(
-                getContext(), mock(CommandQueue.class), () -> mAssistManager,
-                mEntryManager, mock(HeadsUpManagerPhone.class),
-                mActivityStarter, mStatusBarService,
-                mock(StatusBarStateController.class), mStatusBarKeyguardViewManager,
-                mock(KeyguardManager.class),
-                mock(IDreamManager.class), mRemoteInputManager,
-                mock(StatusBarRemoteInputCallback.class), mock(NotificationGroupManager.class),
-                mock(NotificationLockscreenUserManager.class),
-                mKeyguardStateController,
-                mock(NotificationInterruptStateProvider.class), mock(MetricsLogger.class),
-                mock(LockPatternUtils.class), mHandler, mHandler, mUiBgExecutor,
-                mActivityIntentHelper, mBubbleController, mShadeController, mFeatureFlags,
-                mNotifPipeline, mNotifCollection)
+        mNotificationActivityStarter =
+                new StatusBarNotificationActivityStarter.Builder(
+                        getContext(),
+                        mock(CommandQueue.class),
+                        mHandler,
+                        mHandler,
+                        mUiBgExecutor,
+                        mEntryManager,
+                        mNotifPipeline,
+                        mNotifCollection,
+                        mock(HeadsUpManagerPhone.class),
+                        mActivityStarter,
+                        mStatusBarService,
+                        mock(StatusBarStateController.class),
+                        mStatusBarKeyguardViewManager,
+                        mock(KeyguardManager.class),
+                        mock(IDreamManager.class),
+                        mBubbleController,
+                        () -> mAssistManager,
+                        mRemoteInputManager,
+                        mock(NotificationGroupManager.class),
+                        mock(NotificationLockscreenUserManager.class),
+                        mShadeController,
+                        mKeyguardStateController,
+                        mock(NotificationInterruptStateProvider.class),
+                        mock(LockPatternUtils.class),
+                        mock(StatusBarRemoteInputCallback.class),
+                        mActivityIntentHelper,
+
+                        mFeatureFlags,
+                        mock(MetricsLogger.class),
+                        mock(StatusBarNotificationActivityStarterLogger.class))
                 .setStatusBar(mStatusBar)
-                .setNotificationPanelViewController(mock(NotificationPanelViewController.class))
                 .setNotificationPresenter(mock(NotificationPresenter.class))
-                .setActivityLaunchAnimator(mock(ActivityLaunchAnimator.class)))
-        .build();
+                .setNotificationPanelViewController(mock(NotificationPanelViewController.class))
+                .setActivityLaunchAnimator(mock(ActivityLaunchAnimator.class))
+                .build();
 
         // set up dismissKeyguardThenExecute to synchronously invoke the OnDismissAction arg
         doAnswer(mCallOnDismiss).when(mActivityStarter).dismissKeyguardThenExecute(
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
index b905bdd..5a08c9c 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
@@ -120,7 +120,6 @@
 import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder;
 import com.android.systemui.statusbar.notification.init.NotificationsController;
 import com.android.systemui.statusbar.notification.interruption.BypassHeadsUpNotifier;
-import com.android.systemui.statusbar.notification.interruption.NotificationAlertingManager;
 import com.android.systemui.statusbar.notification.interruption.NotificationInterruptStateProviderImpl;
 import com.android.systemui.statusbar.notification.logging.NotificationLogger;
 import com.android.systemui.statusbar.notification.logging.NotificationPanelLoggerFake;
@@ -193,7 +192,6 @@
     @Mock private StatusBarNotificationPresenter mNotificationPresenter;
     @Mock private NotificationEntryListener mEntryListener;
     @Mock private NotificationFilter mNotificationFilter;
-    @Mock private NotificationAlertingManager mNotificationAlertingManager;
     @Mock private AmbientDisplayConfiguration mAmbientDisplayConfiguration;
     @Mock private NotificationLogger.ExpansionStateLogger mExpansionStateLogger;
     @Mock private KeyguardUpdateMonitor mKeyguardUpdateMonitor;
@@ -352,7 +350,6 @@
                 mNotificationInterruptStateProvider,
                 mNotificationViewHierarchyManager,
                 mKeyguardViewMediator,
-                mNotificationAlertingManager,
                 new DisplayMetrics(),
                 mMetricsLogger,
                 mUiBgExecutor,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java
index 962d773..aef454f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java
@@ -32,6 +32,7 @@
 import static org.mockito.Mockito.doAnswer;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import android.app.Instrumentation;
@@ -222,7 +223,7 @@
 
         ArgumentCaptor<ConnectivityManager.NetworkCallback> callbackArg =
             ArgumentCaptor.forClass(ConnectivityManager.NetworkCallback.class);
-        Mockito.verify(mMockCm, atLeastOnce())
+        verify(mMockCm, atLeastOnce())
             .registerDefaultNetworkCallback(callbackArg.capture(), isA(Handler.class));
         mNetworkCallback = callbackArg.getValue();
         assertNotNull(mNetworkCallback);
@@ -384,7 +385,7 @@
     }
 
     protected void verifyHasNoSims(boolean hasNoSimsVisible) {
-        Mockito.verify(mCallbackHandler, Mockito.atLeastOnce()).setNoSims(
+        verify(mCallbackHandler, Mockito.atLeastOnce()).setNoSims(
                 eq(hasNoSimsVisible), eq(false));
     }
 
@@ -395,7 +396,7 @@
         ArgumentCaptor<Boolean> dataInArg = ArgumentCaptor.forClass(Boolean.class);
         ArgumentCaptor<Boolean> dataOutArg = ArgumentCaptor.forClass(Boolean.class);
 
-        Mockito.verify(mCallbackHandler, Mockito.atLeastOnce()).setMobileDataIndicators(
+        verify(mCallbackHandler, Mockito.atLeastOnce()).setMobileDataIndicators(
                     any(),
                     iconArg.capture(),
                     anyInt(),
@@ -429,7 +430,7 @@
         ArgumentCaptor<Integer> typeIconArg = ArgumentCaptor.forClass(Integer.class);
 
         // TODO: Verify all fields.
-        Mockito.verify(mCallbackHandler, Mockito.atLeastOnce()).setMobileDataIndicators(
+        verify(mCallbackHandler, Mockito.atLeastOnce()).setMobileDataIndicators(
                 iconArg.capture(),
                 any(),
                 typeIconArg.capture(),
@@ -475,7 +476,7 @@
         ArgumentCaptor<CharSequence> typeContentDescriptionHtmlArg =
                 ArgumentCaptor.forClass(CharSequence.class);
 
-        Mockito.verify(mCallbackHandler, Mockito.atLeastOnce()).setMobileDataIndicators(
+        verify(mCallbackHandler, Mockito.atLeastOnce()).setMobileDataIndicators(
                 iconArg.capture(),
                 qsIconArg.capture(),
                 typeIconArg.capture(),
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerWifiTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerWifiTest.java
index 9c250c5..988e022 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerWifiTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerWifiTest.java
@@ -2,12 +2,14 @@
 
 import static junit.framework.Assert.assertEquals;
 
+import static org.junit.Assert.assertTrue;
 import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.anyBoolean;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
 import android.content.Intent;
+import android.net.ConnectivityManager;
 import android.net.NetworkCapabilities;
 import android.net.NetworkInfo;
 import android.net.wifi.WifiInfo;
@@ -171,6 +173,32 @@
         verifyLastWifiIcon(true, WifiIcons.WIFI_SIGNAL_STRENGTH[1][testLevel]);
     }
 
+    @Test
+    public void testFetchInitialData() {
+        mNetworkController.mWifiSignalController.fetchInitialState();
+        Mockito.verify(mMockWm).getWifiState();
+        Mockito.verify(mMockCm).getNetworkInfo(ConnectivityManager.TYPE_WIFI);
+    }
+
+    @Test
+    public void testFetchInitialData_correctValues() {
+        String testSsid = "TEST";
+
+        when(mMockWm.getWifiState()).thenReturn(WifiManager.WIFI_STATE_ENABLED);
+        NetworkInfo networkInfo = mock(NetworkInfo.class);
+        when(networkInfo.isConnected()).thenReturn(true);
+        when(mMockCm.getNetworkInfo(ConnectivityManager.TYPE_WIFI)).thenReturn(networkInfo);
+        WifiInfo wifiInfo = mock(WifiInfo.class);
+        when(wifiInfo.getSSID()).thenReturn(testSsid);
+        when(mMockWm.getConnectionInfo()).thenReturn(wifiInfo);
+
+        mNetworkController.mWifiSignalController.fetchInitialState();
+
+        assertTrue(mNetworkController.mWifiSignalController.mCurrentState.enabled);
+        assertTrue(mNetworkController.mWifiSignalController.mCurrentState.connected);
+        assertEquals(testSsid, mNetworkController.mWifiSignalController.mCurrentState.ssid);
+    }
+
     protected void setWifiActivity(int activity) {
         // TODO: Not this, because this variable probably isn't sticking around.
         mNetworkController.mWifiSignalController.setActivity(activity);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/animation/PhysicsAnimatorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/util/animation/PhysicsAnimatorTest.kt
index 950f70f..eb435f9 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/util/animation/PhysicsAnimatorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/util/animation/PhysicsAnimatorTest.kt
@@ -134,6 +134,7 @@
 
     @Test
     @Throws(InterruptedException::class)
+    @Ignore("Increasingly flaky")
     fun testEndListenersAndActions() {
         PhysicsAnimatorTestUtils.setAllAnimationsBlock(false)
         animator
diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/concurrency/RepeatableExecutorTest.java b/packages/SystemUI/tests/src/com/android/systemui/util/concurrency/RepeatableExecutorTest.java
new file mode 100644
index 0000000..00f37ae
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/util/concurrency/RepeatableExecutorTest.java
@@ -0,0 +1,162 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.util.concurrency;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.testing.AndroidTestingRunner;
+
+import androidx.test.filters.SmallTest;
+
+import com.android.systemui.SysuiTestCase;
+import com.android.systemui.util.time.FakeSystemClock;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@SmallTest
+@RunWith(AndroidTestingRunner.class)
+public class RepeatableExecutorTest extends SysuiTestCase {
+
+    private static final int DELAY = 100;
+
+    private FakeSystemClock mFakeClock;
+    private FakeExecutor mFakeExecutor;
+    private RepeatableExecutor mExecutor;
+    private CountingTask mCountingTask;
+
+    @Before
+    public void setUp() throws Exception {
+        mFakeClock = new FakeSystemClock();
+        mFakeExecutor = new FakeExecutor(mFakeClock);
+        mCountingTask = new CountingTask();
+        mExecutor = new RepeatableExecutorImpl(mFakeExecutor);
+    }
+
+    /**
+     * Test FakeExecutor that receives non-delayed items to execute.
+     */
+    @Test
+    public void testExecute() {
+        mExecutor.execute(mCountingTask);
+        mFakeExecutor.runAllReady();
+        assertThat(mCountingTask.getCount()).isEqualTo(1);
+    }
+
+    @Test
+    public void testRepeats() {
+        // GIVEN that a command is queued to repeat
+        mExecutor.executeRepeatedly(mCountingTask, DELAY, DELAY);
+        // WHEN The clock advances and the task is run
+        mFakeExecutor.advanceClockToNext();
+        mFakeExecutor.runAllReady();
+        // THEN another task is queued
+        assertThat(mCountingTask.getCount()).isEqualTo(1);
+        assertThat(mFakeExecutor.numPending()).isEqualTo(1);
+    }
+
+    @Test
+    public void testNoExecutionBeforeStartDelay() {
+        // WHEN a command is queued with a start delay
+        mExecutor.executeRepeatedly(mCountingTask, 2 * DELAY, DELAY);
+        mFakeExecutor.runAllReady();
+        // THEN then it doesn't run immediately
+        assertThat(mCountingTask.getCount()).isEqualTo(0);
+        assertThat(mFakeExecutor.numPending()).isEqualTo(1);
+    }
+
+    @Test
+    public void testExecuteAfterStartDelay() {
+        // GIVEN that a command is queued to repeat with a longer start delay
+        mExecutor.executeRepeatedly(mCountingTask, 2 * DELAY, DELAY);
+        // WHEN the clock advances the start delay
+        mFakeClock.advanceTime(2 * DELAY);
+        mFakeExecutor.runAllReady();
+        // THEN the command has run and another task is queued
+        assertThat(mCountingTask.getCount()).isEqualTo(1);
+        assertThat(mFakeExecutor.numPending()).isEqualTo(1);
+    }
+
+    @Test
+    public void testExecuteWithZeroStartDelay() {
+        // WHEN a command is queued with no start delay
+        mExecutor.executeRepeatedly(mCountingTask, 0L, DELAY);
+        mFakeExecutor.runAllReady();
+        // THEN the command has run and another task is queued
+        assertThat(mCountingTask.getCount()).isEqualTo(1);
+        assertThat(mFakeExecutor.numPending()).isEqualTo(1);
+    }
+
+    @Test
+    public void testAdvanceTimeTwice() {
+        // GIVEN that a command is queued to repeat
+        mExecutor.executeRepeatedly(mCountingTask, DELAY, DELAY);
+        // WHEN the clock advances the time DELAY twice
+        mFakeClock.advanceTime(DELAY);
+        mFakeExecutor.runAllReady();
+        mFakeClock.advanceTime(DELAY);
+        mFakeExecutor.runAllReady();
+        // THEN the command has run twice and another task is queued
+        assertThat(mCountingTask.getCount()).isEqualTo(2);
+        assertThat(mFakeExecutor.numPending()).isEqualTo(1);
+    }
+
+    @Test
+    public void testCancel() {
+        // GIVEN that a scheduled command has been cancelled
+        Runnable cancel = mExecutor.executeRepeatedly(mCountingTask, DELAY, DELAY);
+        cancel.run();
+        // WHEN the clock advances the time DELAY
+        mFakeClock.advanceTime(DELAY);
+        mFakeExecutor.runAllReady();
+        // THEN the comamnd has not run and no further tasks are queued
+        assertThat(mCountingTask.getCount()).isEqualTo(0);
+        assertThat(mFakeExecutor.numPending()).isEqualTo(0);
+    }
+
+    @Test
+    public void testCancelAfterStart() {
+        // GIVEN that a command has reapeated a few times
+        Runnable cancel = mExecutor.executeRepeatedly(mCountingTask, DELAY, DELAY);
+        mFakeClock.advanceTime(DELAY);
+        mFakeExecutor.runAllReady();
+        // WHEN cancelled and time advances
+        cancel.run();
+        // THEN the command has only run the first time
+        assertThat(mCountingTask.getCount()).isEqualTo(1);
+        assertThat(mFakeExecutor.numPending()).isEqualTo(0);
+    }
+
+    /**
+     * Runnable used for testing that counts the number of times run() is invoked.
+     */
+    private static class CountingTask implements Runnable {
+
+        private int mRunCount;
+
+        @Override
+        public void run() {
+            mRunCount++;
+        }
+
+        /** Gets the run count. */
+        public int getCount() {
+            return mRunCount;
+        }
+    }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/magnetictarget/MagnetizedObjectTest.kt b/packages/SystemUI/tests/src/com/android/systemui/util/magnetictarget/MagnetizedObjectTest.kt
index f6b7b74..251ca9c 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/util/magnetictarget/MagnetizedObjectTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/util/magnetictarget/MagnetizedObjectTest.kt
@@ -186,8 +186,8 @@
 
     @Test
     fun testMotionEventConsumption_downInMagneticField() {
-        // We should consume DOWN events if they occur in the field.
-        assertTrue(magnetizedObject.maybeConsumeMotionEvent(getMotionEvent(
+        // We should not consume DOWN events even if they occur in the field.
+        assertFalse(magnetizedObject.maybeConsumeMotionEvent(getMotionEvent(
                 x = targetCenterX, y = targetCenterY, action = MotionEvent.ACTION_DOWN)))
     }
 
@@ -342,10 +342,14 @@
         // Trigger the magnet animation, and block the test until it ends.
         PhysicsAnimatorTestUtils.setAllAnimationsBlock(true)
         magnetizedObject.maybeConsumeMotionEvent(getMotionEvent(
-                x = targetCenterX,
-                y = targetCenterY,
+                x = targetCenterX - 250,
+                y = targetCenterY - 250,
                 action = MotionEvent.ACTION_DOWN))
 
+        magnetizedObject.maybeConsumeMotionEvent(getMotionEvent(
+                x = targetCenterX,
+                y = targetCenterY))
+
         // The object's (top-left) position should now position it centered over the target.
         assertEquals(targetCenterX - objectSize / 2, objectX)
         assertEquals(targetCenterY - objectSize / 2, objectY)
diff --git a/packages/Tethering/Android.bp b/packages/Tethering/Android.bp
index 5b052df..bfb6524 100644
--- a/packages/Tethering/Android.bp
+++ b/packages/Tethering/Android.bp
@@ -34,7 +34,6 @@
     ],
     libs: [
         "framework-tethering",
-        "framework-telephony-stubs",
         "framework-wifi-stubs-systemapi",
         "unsupportedappusage",
     ],
diff --git a/packages/Tethering/AndroidManifest.xml b/packages/Tethering/AndroidManifest.xml
index 9328611..2b2fe45 100644
--- a/packages/Tethering/AndroidManifest.xml
+++ b/packages/Tethering/AndroidManifest.xml
@@ -34,17 +34,21 @@
     <uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
     <uses-permission android:name="android.permission.READ_DEVICE_CONFIG" />
     <uses-permission android:name="android.permission.READ_NETWORK_USAGE_HISTORY" />
+    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
     <uses-permission android:name="android.permission.TETHER_PRIVILEGED" />
     <uses-permission android:name="android.permission.UPDATE_APP_OPS_STATS" />
     <uses-permission android:name="android.permission.UPDATE_DEVICE_STATS" />
     <uses-permission android:name="android.permission.WRITE_SETTINGS" />
 
+    <protected-broadcast android:name="com.android.server.connectivity.tethering.DISABLE_TETHERING" />
+
     <application
         android:process="com.android.networkstack.process"
         android:extractNativeLibs="false"
         android:persistent="true">
-        <service android:name="com.android.server.connectivity.tethering.TetheringService"
-                 android:permission="android.permission.MAINLINE_NETWORK_STACK">
+        <service android:name="com.android.networkstack.tethering.TetheringService"
+                 android:permission="android.permission.MAINLINE_NETWORK_STACK"
+                 android:exported="true">
             <intent-filter>
                 <action android:name="android.net.ITetheringConnector"/>
             </intent-filter>
diff --git a/packages/Tethering/AndroidManifest_InProcess.xml b/packages/Tethering/AndroidManifest_InProcess.xml
index 02ea551..b1f1240 100644
--- a/packages/Tethering/AndroidManifest_InProcess.xml
+++ b/packages/Tethering/AndroidManifest_InProcess.xml
@@ -22,9 +22,10 @@
           android:process="system">
     <uses-sdk android:minSdkVersion="29" android:targetSdkVersion="29" />
     <application>
-        <service android:name="com.android.server.connectivity.tethering.TetheringService"
+        <service android:name="com.android.networkstack.tethering.TetheringService"
                  android:process="system"
-                 android:permission="android.permission.MAINLINE_NETWORK_STACK">
+                 android:permission="android.permission.MAINLINE_NETWORK_STACK"
+                 android:exported="true">
             <intent-filter>
                 <action android:name="android.net.ITetheringConnector.InProcess"/>
             </intent-filter>
diff --git a/packages/Tethering/common/TetheringLib/Android.bp b/packages/Tethering/common/TetheringLib/Android.bp
index 31c40d2..ee6b9f1 100644
--- a/packages/Tethering/common/TetheringLib/Android.bp
+++ b/packages/Tethering/common/TetheringLib/Android.bp
@@ -16,6 +16,7 @@
 // AIDL interfaces between the core system and the tethering mainline module.
 aidl_interface {
     name: "tethering-aidl-interfaces",
+    unstable: true,
     local_include_dir: "src",
     include_dirs: ["frameworks/base/core/java"], // For framework parcelables.
     srcs: [
diff --git a/packages/Tethering/proguard.flags b/packages/Tethering/proguard.flags
index 1f83a66..051fbd1 100644
--- a/packages/Tethering/proguard.flags
+++ b/packages/Tethering/proguard.flags
@@ -1,5 +1,5 @@
 # Keep class's integer static field for MessageUtils to parsing their name.
--keep class com.android.server.connectivity.tethering.Tethering$TetherMasterSM {
+-keep class com.android.networkstack.tethering.Tethering$TetherMasterSM {
     static final int CMD_*;
     static final int EVENT_*;
 }
diff --git a/packages/Tethering/res/values-af/strings.xml b/packages/Tethering/res/values-af/strings.xml
index 1258805..056168b 100644
--- a/packages/Tethering/res/values-af/strings.xml
+++ b/packages/Tethering/res/values-af/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"Verbinding of Wi-Fi-warmkol aktief"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"Tik om op te stel."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"Verbinding is gedeaktiveer"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"Kontak jou administrateur vir besonderhede"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"Verbinding of warmkol is aktief"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"Tik om op te stel."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"Verbinding is gedeaktiveer"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"Kontak jou administrateur vir besonderhede"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Warmkol- en verbindingstatus"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-am/strings.xml b/packages/Tethering/res/values-am/strings.xml
index 9c36192..ac468dd 100644
--- a/packages/Tethering/res/values-am/strings.xml
+++ b/packages/Tethering/res/values-am/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"መሰካት ወይም ገባሪ ድረስ ነጥብ"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"ለማዋቀር መታ ያድርጉ።"</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"እንደ ሞደም መሰካት ተሰናክሏል"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"ለዝርዝሮች የእርስዎን አስተዳዳሪ ያነጋግሩ"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"እንደ ሞደም መሰካት ወይም መገናኛ ነጥብ ገባሪ"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"ለማዋቀር መታ ያድርጉ።"</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"እንደ ሞደም መሰካት ተሰናክሏል"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"ለዝርዝሮች የእርስዎን አስተዳዳሪ ያነጋግሩ"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"መገናኛ ነጥብ እና እንደ ሞደም የመሰካት ሁኔታ"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-ar/strings.xml b/packages/Tethering/res/values-ar/strings.xml
index 9f84ce4..7d5bad3 100644
--- a/packages/Tethering/res/values-ar/strings.xml
+++ b/packages/Tethering/res/values-ar/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"النطاق أو نقطة الاتصال نشطة"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"انقر للإعداد."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"تم إيقاف التوصيل"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"اتصل بالمشرف للحصول على التفاصيل"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"النطاق نشط أو نقطة الاتصال نشطة"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"انقر للإعداد."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"التوصيل متوقف."</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"تواصَل مع المشرف للحصول على التفاصيل."</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"حالة نقطة الاتصال والتوصيل"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-as/strings.xml b/packages/Tethering/res/values-as/strings.xml
index 8855822..0913504 100644
--- a/packages/Tethering/res/values-as/strings.xml
+++ b/packages/Tethering/res/values-as/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"টেডাৰিং বা হটস্প\'ট সক্ৰিয় অৱস্থাত আছে"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"ছেট আপ কৰিবলৈ টিপক।"</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"টেডাৰিং অক্ষম কৰি থোৱা হৈছে"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"সবিশেষ জানিবলৈ আপোনাৰ প্ৰশাসকৰ সৈতে যোগাযোগ কৰক"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"টে\'ডাৰিং অথবা হ\'টস্প\'ট সক্ৰিয় অৱস্থাত আছে"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"ছেট আপ কৰিবলৈ টিপক।"</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"টে\'ডাৰিঙৰ সুবিধাটো অক্ষম কৰি থোৱা হৈছে"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"সবিশেষ জানিবলৈ আপোনাৰ প্ৰশাসকৰ সৈতে যোগাযোগ কৰক"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"হ’টস্প\'ট আৰু টে\'ডাৰিঙৰ স্থিতি"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-az/strings.xml b/packages/Tethering/res/values-az/strings.xml
index eba50eb..dce70da 100644
--- a/packages/Tethering/res/values-az/strings.xml
+++ b/packages/Tethering/res/values-az/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"Tezerinq və ya hotspot aktivdir"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"Quraşdırmaq üçün tıklayın."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"Birləşmə deaktivdir"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"Məlumat üçün adminlə əlaqə saxlayın"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"Birləşmə və ya hotspot aktivdir"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"Ayarlamaq üçün toxunun."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"Birləşmə deaktivdir"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"Detallar üçün adminlə əlaqə saxlayın"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Hotspot &amp; birləşmə statusu"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-b+sr+Latn/strings.xml b/packages/Tethering/res/values-b+sr+Latn/strings.xml
index 5b0e488..b0774ec 100644
--- a/packages/Tethering/res/values-b+sr+Latn/strings.xml
+++ b/packages/Tethering/res/values-b+sr+Latn/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"Aktivno povezivanje sa internetom preko mobilnog uređaja ili hotspot"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"Dodirnite da biste podesili."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"Privezivanje je onemogućeno"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"Potražite detalje od administratora"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"Privezivanje ili hotspot je aktivan"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"Dodirnite da biste podesili."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"Privezivanje je onemogućeno"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"Potražite detalje od administratora"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Status hotspota i privezivanja"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-be/strings.xml b/packages/Tethering/res/values-be/strings.xml
index 5966c71..a8acebe 100644
--- a/packages/Tethering/res/values-be/strings.xml
+++ b/packages/Tethering/res/values-be/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"USB-мадэм або хот-спот Wi-Fi актыўныя"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"Дакраніцеся, каб наладзіць."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"Рэжым мадэма адключаны"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"Звярніцеся да адміністратара па падрабязную інфармацыю"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"Мадэм або хот-спот актыўныя"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"Дакраніцеся, каб наладзіць."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"Рэжым мадэма выключаны"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"Звярніцеся да адміністратара па падрабязную інфармацыю"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Стан \"Хот-спот і мадэм\""</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-bg/strings.xml b/packages/Tethering/res/values-bg/strings.xml
index ed58d73..94fb2d8 100644
--- a/packages/Tethering/res/values-bg/strings.xml
+++ b/packages/Tethering/res/values-bg/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"Има активна споделена връзка или безжична точка за достъп"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"Докоснете, за да настроите."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"Функцията за тетъринг е деактивирана"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"Свържете се с администратора си за подробности"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"Има активна споделена връзка или точка за достъп"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"Докоснете, за да настроите."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"Функцията за тетъринг е деактивирана"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"Свържете се с администратора си за подробности"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Състояние на функцията за точка за достъп и тетъринг"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-bn/strings.xml b/packages/Tethering/res/values-bn/strings.xml
index 8d9880a..aea02b9 100644
--- a/packages/Tethering/res/values-bn/strings.xml
+++ b/packages/Tethering/res/values-bn/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"টিথারিং বা হটস্পট সক্রিয় আছে"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"সেট-আপ করার জন্য আলতো চাপুন৷"</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"টিথারিং অক্ষম করা আছে"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"বিশদ বিবরণের জন্য প্রশাসকের সাথে যোগাযোগ করুন"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"টিথারিং বা হটস্পট চালু আছে"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"সেট-আপ করতে ট্যাপ করুন।"</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"টিথারিং বন্ধ করা আছে"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"বিশদে জানতে অ্যাডমিনের সাথে যোগাযোগ করুন"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"হটস্পট ও টিথারিং স্ট্যাটাস"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-bs/strings.xml b/packages/Tethering/res/values-bs/strings.xml
index 2361b9d..de23272 100644
--- a/packages/Tethering/res/values-bs/strings.xml
+++ b/packages/Tethering/res/values-bs/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"Uređaj dijeli vezu ili djeluje kao pristupna tačka"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"Dodirnite za postavke"</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"Povezivanje putem mobitela je onemogućeno"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"Kontaktirajte svog administratora za dodatne detalje"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"Aktivno je povezivanje putem mobitela ili pristupna tačka"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"Dodirnite da postavite."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"Povezivanje putem mobitela je onemogućeno"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"Kontaktirajte svog administratora za detalje"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Status pristupne tačke i povezivanja putem mobitela"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-ca/strings.xml b/packages/Tethering/res/values-ca/strings.xml
index 6752b51..88b795c 100644
--- a/packages/Tethering/res/values-ca/strings.xml
+++ b/packages/Tethering/res/values-ca/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"Compartició de xarxa o punt d\'accés Wi-Fi activat"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"Toca per configurar."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"La compartició de xarxa està desactivada"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"Contacta amb el teu administrador per obtenir més informació"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"Compartició de xarxa o punt d\'accés Wi‑Fi actius"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"Toca per configurar."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"La compartició de xarxa està desactivada"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"Contacta amb el teu administrador per obtenir més informació"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Estat del punt d\'accés Wi‑Fi i de la compartició de xarxa"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-cs/strings.xml b/packages/Tethering/res/values-cs/strings.xml
index 5fdd53a..8c1b83b 100644
--- a/packages/Tethering/res/values-cs/strings.xml
+++ b/packages/Tethering/res/values-cs/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"Sdílené připojení nebo hotspot je aktivní."</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"Klepnutím zahájíte nastavení."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"Tethering je zakázán"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"O podrobnosti požádejte administrátora"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"Tethering nebo hotspot je aktivní"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"Klepnutím zahájíte nastavení."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"Tethering je zakázán"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"O podrobnosti požádejte administrátora"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Stav hotspotu a tetheringu"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-da/strings.xml b/packages/Tethering/res/values-da/strings.xml
index 2775dfa..f413e70 100644
--- a/packages/Tethering/res/values-da/strings.xml
+++ b/packages/Tethering/res/values-da/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"Netdeling eller hotspot er aktivt"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"Tryk for at konfigurere"</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"Netdeling er deaktiveret"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"Kontakt din administrator for at få oplysninger"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"Netdeling eller hotspot er aktivt"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"Tryk for at konfigurere."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"Netdeling er deaktiveret"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"Kontakt din administrator for at få oplysninger"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Status for hotspot og netdeling"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-de/strings.xml b/packages/Tethering/res/values-de/strings.xml
index 9046cd5..f057d78 100644
--- a/packages/Tethering/res/values-de/strings.xml
+++ b/packages/Tethering/res/values-de/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"Tethering oder Hotspot aktiv"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"Zum Einrichten tippen."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"Tethering ist deaktiviert"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"Bitte wende dich für weitere Informationen an den Administrator"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"Tethering oder Hotspot aktiv"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"Zum Einrichten tippen."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"Tethering ist deaktiviert"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"Bitte wende dich für weitere Informationen an den Administrator"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Hotspot- und Tethering-Status"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-el/strings.xml b/packages/Tethering/res/values-el/strings.xml
index 3b9f537..b3c986b 100644
--- a/packages/Tethering/res/values-el/strings.xml
+++ b/packages/Tethering/res/values-el/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"Πρόσδεση ή σύνδεση σημείου πρόσβασης ενεργή"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"Πατήστε για ρύθμιση."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"Η σύνδεση είναι απενεργοποιημένη"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"Επικοινωνήστε με τον διαχειριστή σας για λεπτομέρειες"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"Πρόσδεση ή σύνδεση σημείου πρόσβασης ενεργή"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"Πατήστε για ρύθμιση."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"Η σύνδεση είναι απενεργοποιημένη"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"Επικοινωνήστε με τον διαχειριστή σας για λεπτομέρειες"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Κατάσταση σημείου πρόσβασης Wi-Fi και σύνδεσης"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-en-rAU/strings.xml b/packages/Tethering/res/values-en-rAU/strings.xml
index 56b88a5..769e0120 100644
--- a/packages/Tethering/res/values-en-rAU/strings.xml
+++ b/packages/Tethering/res/values-en-rAU/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"Tethering or hotspot active"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"Tap to set up."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"Tethering is disabled"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"Contact your admin for details"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"Tethering or hotspot active"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"Tap to set up."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"Tethering is disabled"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"Contact your admin for details"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Hotspot and tethering status"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-en-rCA/strings.xml b/packages/Tethering/res/values-en-rCA/strings.xml
index 56b88a5..769e0120 100644
--- a/packages/Tethering/res/values-en-rCA/strings.xml
+++ b/packages/Tethering/res/values-en-rCA/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"Tethering or hotspot active"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"Tap to set up."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"Tethering is disabled"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"Contact your admin for details"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"Tethering or hotspot active"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"Tap to set up."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"Tethering is disabled"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"Contact your admin for details"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Hotspot and tethering status"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-en-rGB/strings.xml b/packages/Tethering/res/values-en-rGB/strings.xml
index 56b88a5..769e0120 100644
--- a/packages/Tethering/res/values-en-rGB/strings.xml
+++ b/packages/Tethering/res/values-en-rGB/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"Tethering or hotspot active"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"Tap to set up."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"Tethering is disabled"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"Contact your admin for details"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"Tethering or hotspot active"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"Tap to set up."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"Tethering is disabled"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"Contact your admin for details"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Hotspot and tethering status"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-en-rIN/strings.xml b/packages/Tethering/res/values-en-rIN/strings.xml
index 56b88a5..769e0120 100644
--- a/packages/Tethering/res/values-en-rIN/strings.xml
+++ b/packages/Tethering/res/values-en-rIN/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"Tethering or hotspot active"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"Tap to set up."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"Tethering is disabled"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"Contact your admin for details"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"Tethering or hotspot active"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"Tap to set up."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"Tethering is disabled"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"Contact your admin for details"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Hotspot and tethering status"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-en-rXC/strings.xml b/packages/Tethering/res/values-en-rXC/strings.xml
index 7f47fc8..f1674be 100644
--- a/packages/Tethering/res/values-en-rXC/strings.xml
+++ b/packages/Tethering/res/values-en-rXC/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‏‏‎‏‎‏‎‏‏‎‏‎‎‏‏‎‏‏‎‏‏‏‎‏‏‏‏‏‏‏‎‏‎‎‎‎‏‎‎‏‏‎‎‎‏‏‎‏‎‏‏‏‎‏‎‎‏‎Tethering or hotspot active‎‏‎‎‏‎"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‏‎‏‎‏‎‏‎‏‎‎‎‏‏‏‎‏‏‏‏‏‎‎‎‎‏‏‏‏‎‎‎‎‏‏‏‏‎‎‎‏‏‏‎‏‏‏‏‎‎‏‎‏‎‎‎‏‎Tap to set up.‎‏‎‎‏‎"</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‎‎‎‏‏‏‎‏‎‏‎‎‏‏‎‎‏‎‏‎‎‎‏‏‏‏‎‏‏‏‏‏‏‎‏‏‏‏‎‏‎‎‎‏‏‏‎‎‎‏‎‎‏‎‏‎‏‏‎Tethering is disabled‎‏‎‎‏‎"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‎‎‎‏‏‎‏‏‏‎‎‏‎‏‏‎‏‏‎‏‎‏‎‏‎‎‏‏‎‎‎‎‎‎‎‏‎‎‏‎‏‏‏‎‏‎‎‎‏‏‎‎‎‎‏‏‏‏‎Contact your admin for details‎‏‎‎‏‎"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‏‎‎‏‎‏‏‏‏‏‎‏‏‏‏‎‏‏‎‎‎‏‎‎‎‎‎‏‏‎‏‏‏‏‎‎‎‎‏‏‏‎‎‏‎‎‏‎‏‏‎‏‏‎‎‎‎‎Tethering or hotspot active‎‏‎‎‏‎"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‎‎‏‏‏‎‎‏‏‎‎‎‏‏‏‎‎‎‎‎‎‎‏‏‏‎‎‏‏‏‏‎‏‏‏‏‏‎‏‏‏‏‎‎‏‎‏‏‎‏‎‎‎‏‏‎‎‎‎Tap to set up.‎‏‎‎‏‎"</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‎‏‏‎‏‏‎‎‏‎‎‎‏‎‏‎‎‏‎‎‏‎‎‎‏‎‎‎‎‏‏‏‎‏‎‎‎‏‏‏‎‎‎‏‎‏‎‎‎‏‏‎‎‏‏‏‏‏‎Tethering is disabled‎‏‎‎‏‎"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‎‏‎‎‏‏‏‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‏‎‏‏‏‏‏‎‎‏‏‎‎‏‎‎‏‎‏‎‎‏‏‏‎‏‎‏‎‏‎‎‏‎‎‎Contact your admin for details‎‏‎‎‏‎"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‎‏‏‏‏‎‏‏‎‏‎‎‎‎‏‏‎‎‏‎‎‏‏‎‎‎‎‏‏‎‏‏‎‏‏‎‎‎‏‏‏‏‏‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎Hotspot &amp; tethering status‎‏‎‎‏‎"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-es-rUS/strings.xml b/packages/Tethering/res/values-es-rUS/strings.xml
index e4618b8..63689f4 100644
--- a/packages/Tethering/res/values-es-rUS/strings.xml
+++ b/packages/Tethering/res/values-es-rUS/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"Anclaje a red o zona activa conectados"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"Presiona para configurar."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"Se inhabilitó la conexión mediante dispositivo portátil"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"Para obtener más información, comunícate con el administrador"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"Conexión a red o hotspot conectados"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"Presiona para configurar esta opción."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"Se inhabilitó la conexión mediante dispositivo portátil"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"Para obtener más información, comunícate con el administrador"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Estado del hotspot y la conexión mediante dispositivo portátil"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-es/strings.xml b/packages/Tethering/res/values-es/strings.xml
index 8dc1575..9a34ed5 100644
--- a/packages/Tethering/res/values-es/strings.xml
+++ b/packages/Tethering/res/values-es/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"Compartir conexión/Zona Wi-Fi activada"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"Toca para configurar."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"La conexión compartida está inhabilitada"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"Ponte en contacto con el administrador para obtener más información"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"Conexión compartida o punto de acceso activos"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"Toca para configurar."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"La conexión compartida está inhabilitada"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"Solicita más información a tu administrador"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Estado del punto de acceso y de la conexión compartida"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-et/strings.xml b/packages/Tethering/res/values-et/strings.xml
index 872c8a7..0970341 100644
--- a/packages/Tethering/res/values-et/strings.xml
+++ b/packages/Tethering/res/values-et/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"Jagamine või kuumkoht on aktiivne"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"Puudutage seadistamiseks."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"Jagamine on keelatud"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"Lisateabe saamiseks võtke ühendust oma administraatoriga"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"Jagamine või kuumkoht on aktiivne"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"Puudutage seadistamiseks."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"Jagamine on keelatud"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"Lisateabe saamiseks võtke ühendust oma administraatoriga"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Kuumkoha ja jagamise olek"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-eu/strings.xml b/packages/Tethering/res/values-eu/strings.xml
index 6c4605e..632019e 100644
--- a/packages/Tethering/res/values-eu/strings.xml
+++ b/packages/Tethering/res/values-eu/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"Konexioa partekatzea edo sare publikoa aktibo"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"Sakatu konfiguratzeko."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"Desgaituta dago konexioa partekatzeko aukera"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"Xehetasunak lortzeko, jarri administratzailearekin harremanetan"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"Konexioa partekatzea edo wifi-gunea aktibo dago"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"Sakatu konfiguratzeko."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"Desgaituta dago konexioa partekatzeko aukera"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"Xehetasunak lortzeko, jarri administratzailearekin harremanetan"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Wifi-gunearen eta konexioa partekatzeko eginbidearen egoera"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-fa/strings.xml b/packages/Tethering/res/values-fa/strings.xml
index bc2ee23..2e21c85 100644
--- a/packages/Tethering/res/values-fa/strings.xml
+++ b/packages/Tethering/res/values-fa/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"اشتراک‌گذاری اینترنت یا نقطه اتصال فعال"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"برای راه‌اندازی ضربه بزنید."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"اشتراک‌گذاری اینترنت غیرفعال است"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"برای جزئیات، با سرپرستتان تماس بگیرید"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"اشتراک‌گذاری اینترنت یا نقطه اتصال فعال"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"برای راه‌اندازی ضربه بزنید."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"اشتراک‌گذاری اینترنت غیرفعال است"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"برای جزئیات، با سرپرستتان تماس بگیرید"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"وضعیت نقطه اتصال و اشتراک‌گذاری اینترنت"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-fi/strings.xml b/packages/Tethering/res/values-fi/strings.xml
index ff0fca6..413db3f 100644
--- a/packages/Tethering/res/values-fi/strings.xml
+++ b/packages/Tethering/res/values-fi/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"Internetin jakaminen tai yhteyspiste käytössä"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"Määritä napauttamalla."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"Yhteyden jakaminen poistettu käytöstä"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"Kysy lisätietoja järjestelmänvalvojalta."</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"Yhteyden jakaminen tai hotspot käytössä"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"Ota käyttöön napauttamalla."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"Yhteyden jakaminen on poistettu käytöstä"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"Pyydä lisätietoja järjestelmänvalvojalta"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Hotspotin ja yhteyden jakamisen tila"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-fr-rCA/strings.xml b/packages/Tethering/res/values-fr-rCA/strings.xml
index 1f5df0ee..eb2e4ba 100644
--- a/packages/Tethering/res/values-fr-rCA/strings.xml
+++ b/packages/Tethering/res/values-fr-rCA/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"Partage de connexion ou point d\'accès sans fil activé"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"Touchez pour configurer."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"Le partage de connexion est désactivé"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"Communiquez avec votre administrateur pour obtenir plus de détails"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"Partage de connexion ou point d\'accès sans fil activé"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"Touchez pour configurer."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"Le partage de connexion est désactivé"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"Communiquez avec votre administrateur pour obtenir plus de détails"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Point d\'accès et partage de connexion"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-fr/strings.xml b/packages/Tethering/res/values-fr/strings.xml
index daf7c9d..22259c5 100644
--- a/packages/Tethering/res/values-fr/strings.xml
+++ b/packages/Tethering/res/values-fr/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"Partage de connexion ou point d\'accès sans fil activé"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"Appuyez ici pour configurer."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"Le partage de connexion est désactivé"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"Pour en savoir plus, contactez votre administrateur"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"Partage de connexion ou point d\'accès activé"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"Appuyez pour effectuer la configuration."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"Le partage de connexion est désactivé"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"Pour en savoir plus, contactez votre administrateur"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"État du point d\'accès et du partage de connexion"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-gl/strings.xml b/packages/Tethering/res/values-gl/strings.xml
index 0d16a1d..ded82fc 100644
--- a/packages/Tethering/res/values-gl/strings.xml
+++ b/packages/Tethering/res/values-gl/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"Conexión compartida ou zona wifi activada"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"Tocar para configurar."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"A conexión compartida está desactivada"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"Contacta co administrador para obter información"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"Conexión compartida ou zona wifi activada"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"Toca para configurar."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"A conexión compartida está desactivada"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"Contacta co administrador para obter información"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Estado da zona wifi e da conexión compartida"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-gu/strings.xml b/packages/Tethering/res/values-gu/strings.xml
index 9d6b02f..7cbbc2d 100644
--- a/packages/Tethering/res/values-gu/strings.xml
+++ b/packages/Tethering/res/values-gu/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"ટિથરિંગ અથવા હૉટસ્પૉટ સક્રિય"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"સેટ કરવા માટે ટૅપ કરો."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"ટિથરિંગ અક્ષમ કરેલ છે"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"વિગતો માટે તમારા વ્યવસ્થાપકનો સંપર્ક કરો"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"ઇન્ટરનેટ શેર કરવાની સુવિધા અથવા હૉટસ્પૉટ સક્રિય છે"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"સેટઅપ કરવા માટે ટૅપ કરો."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"ઇન્ટરનેટ શેર કરવાની સુવિધા બંધ કરી છે"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"વિગતો માટે તમારા વ્યવસ્થાપકનો સંપર્ક કરો"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"હૉટસ્પૉટ અને ઇન્ટરનેટ શેર કરવાની સુવિધાનું સ્ટેટસ"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-hi/strings.xml b/packages/Tethering/res/values-hi/strings.xml
index 9c29d9a..08af81b 100644
--- a/packages/Tethering/res/values-hi/strings.xml
+++ b/packages/Tethering/res/values-hi/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"टेदरिंग या हॉटस्‍पॉट सक्रिय"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"सेट करने के लिए टैप करें."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"टेदरिंग अक्षम है"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"जानकारी के लिए अपने एडमिन से संपर्क करें"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"टेदरिंग या हॉटस्पॉट चालू है"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"सेट अप करने के लिए टैप करें."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"टेदरिंग बंद है"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"जानकारी के लिए अपने एडमिन से संपर्क करें"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"हॉटस्पॉट और टेदरिंग की स्थिति"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-hr/strings.xml b/packages/Tethering/res/values-hr/strings.xml
index d0d25bb..827c135 100644
--- a/packages/Tethering/res/values-hr/strings.xml
+++ b/packages/Tethering/res/values-hr/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"Ograničenje ili aktivan hotspot"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"Dodirnite da biste postavili."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"Modemsko je povezivanje onemogućeno"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"Obratite se administratoru da biste saznali pojedinosti"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"Modemsko povezivanje ili žarišna točka aktivni"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"Dodirnite da biste postavili."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"Modemsko je povezivanje onemogućeno"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"Obratite se administratoru da biste saznali pojedinosti"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Status žarišne točke i modemskog povezivanja"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-hu/strings.xml b/packages/Tethering/res/values-hu/strings.xml
index 3129659..eb68d6b 100644
--- a/packages/Tethering/res/values-hu/strings.xml
+++ b/packages/Tethering/res/values-hu/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"Megosztás vagy aktív hotspot"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"Koppintson a beállításhoz."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"Az internetmegosztás le van tiltva"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"A részletekért forduljon rendszergazdájához"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"Megosztás vagy aktív hotspot"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"Koppintson a beállításhoz."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"Az internetmegosztás le van tiltva"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"A részletekért forduljon rendszergazdájához"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Hotspot és internetmegosztás állapota"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-hy/strings.xml b/packages/Tethering/res/values-hy/strings.xml
index 8ba6435..912941e 100644
--- a/packages/Tethering/res/values-hy/strings.xml
+++ b/packages/Tethering/res/values-hy/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"Մոդեմի ռեժիմը միացված է"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"Հպեք՝ կարգավորելու համար:"</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"Մոդեմի ռեժիմն անջատված է"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"Մանրամասների համար դիմեք ձեր ադմինիստրատորին"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"Մոդեմի ռեժիմը միացված է"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"Հպեք՝ կարգավորելու համար։"</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"Մոդեմի ռեժիմն անջատված է"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"Մանրամասների համար դիմեք ձեր ադմինիստրատորին"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Թեժ կետի և մոդեմի ռեժիմի կարգավիճակը"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-in/strings.xml b/packages/Tethering/res/values-in/strings.xml
index 1e093ab..a4e175a 100644
--- a/packages/Tethering/res/values-in/strings.xml
+++ b/packages/Tethering/res/values-in/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"Tethering (Penambatan) atau hotspot aktif"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"Ketuk untuk menyiapkan."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"Tethering dinonaktifkan"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"Hubungi admin untuk mengetahui detailnya"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"Tethering atau hotspot aktif"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"Ketuk untuk menyiapkan."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"Tethering dinonaktifkan"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"Hubungi admin untuk mengetahui detailnya"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Status hotspot &amp; tethering"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-is/strings.xml b/packages/Tethering/res/values-is/strings.xml
index f5769d5..e9f6670 100644
--- a/packages/Tethering/res/values-is/strings.xml
+++ b/packages/Tethering/res/values-is/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"Kveikt á tjóðrun eða aðgangsstað"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"Ýttu til að setja upp."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"Slökkt er á tjóðrun"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"Hafðu samband við kerfisstjórann til að fá upplýsingar"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"Kveikt á tjóðrun eða aðgangsstað"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"Ýttu til að setja upp."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"Slökkt er á tjóðrun"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"Hafðu samband við kerfisstjórann til að fá upplýsingar"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Staða heits reits og tjóðrunar"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-it/strings.xml b/packages/Tethering/res/values-it/strings.xml
index e0b37243..ffb9196 100644
--- a/packages/Tethering/res/values-it/strings.xml
+++ b/packages/Tethering/res/values-it/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"Tethering oppure hotspot attivo"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"Tocca per impostare."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"Tethering disattivato"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"Contatta il tuo amministratore per avere informazioni dettagliate"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"Hotspot o tethering attivo"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"Tocca per impostare."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"Tethering disattivato"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"Contatta il tuo amministratore per avere informazioni dettagliate"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Stato hotspot e tethering"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-iw/strings.xml b/packages/Tethering/res/values-iw/strings.xml
index c002c44..7adcb47 100644
--- a/packages/Tethering/res/values-iw/strings.xml
+++ b/packages/Tethering/res/values-iw/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"שיתוף אינטרנט פעיל"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"הקש כדי להגדיר."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"שיתוף האינטרנט בין ניידים מושבת"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"לפרטים, יש לפנות למנהל המערכת"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"נקודה לשיתוף אינטרנט או שיתוף אינטרנט בין מכשירים: בסטטוס פעיל"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"יש להקיש כדי להגדיר."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"שיתוף האינטרנט בין מכשירים מושבת"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"לפרטים, יש לפנות למנהל המערכת"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"סטטוס של נקודה לשיתוף אינטרנט ושיתוף אינטרנט בין מכשירים"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-ja/strings.xml b/packages/Tethering/res/values-ja/strings.xml
index 314bde0..f68a730 100644
--- a/packages/Tethering/res/values-ja/strings.xml
+++ b/packages/Tethering/res/values-ja/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"テザリングまたはアクセスポイントが有効です"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"タップしてセットアップします。"</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"テザリングは無効に設定されています"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"詳しくは、管理者にお問い合わせください"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"テザリングまたはアクセス ポイントが有効です"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"タップしてセットアップします。"</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"テザリングは無効に設定されています"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"詳しくは、管理者にお問い合わせください"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"アクセス ポイントとテザリングのステータス"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-ka/strings.xml b/packages/Tethering/res/values-ka/strings.xml
index 7bbd81d..7c22e82 100644
--- a/packages/Tethering/res/values-ka/strings.xml
+++ b/packages/Tethering/res/values-ka/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"ტეტერინგი ან უსადენო ქსელი აქტიურია"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"შეეხეთ დასაყენებლად."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"ტეტერინგი გათიშულია"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"დამატებითი ინფორმაციისთვის დაუკავშირდით თქვენს ადმინისტრატორს"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"ტეტერინგი ან უსადენო ქსელი აქტიურია"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"შეეხეთ დასაყენებლად."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"ტეტერინგი გათიშულია"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"დამატებითი ინფორმაციისთვის დაუკავშირდით თქვენს ადმინისტრატორს"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"უსადენო ქსელის და ტეტერინგის სტატუსი"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-kk/strings.xml b/packages/Tethering/res/values-kk/strings.xml
index 7fd87a1..0857d06 100644
--- a/packages/Tethering/res/values-kk/strings.xml
+++ b/packages/Tethering/res/values-kk/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"Тетеринг немесе хотспот қосулы"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"Реттеу үшін түртіңіз."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"Тетеринг өшірілді"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"Мәліметтерді әкімшіден алыңыз"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"Тетеринг немесе хотспот қосулы"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"Реттеу үшін түртіңіз."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"Тетеринг өшірілді."</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"Мәліметтерді әкімшіден алыңыз."</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Хотспот және тетеринг күйі"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-km/strings.xml b/packages/Tethering/res/values-km/strings.xml
index 2f85224..536e3d1 100644
--- a/packages/Tethering/res/values-km/strings.xml
+++ b/packages/Tethering/res/values-km/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"ភ្ជាប់ ឬ​ហតស្ពត​សកម្ម"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"ប៉ះដើម្បីកំណត់"</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"ការភ្ជាប់​ត្រូវបានបិទ"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"ទាក់ទងអ្នកគ្រប់គ្រង​របស់អ្នកសម្រាប់​ព័ត៌មានលម្អិត"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"ការភ្ជាប់ ឬហតស្ប៉ត​កំពុងដំណើរការ"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"ចុច​ដើម្បី​រៀបចំ។"</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"ការភ្ជាប់​ត្រូវបានបិទ"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"ទាក់ទងអ្នកគ្រប់គ្រង​របស់អ្នក ដើម្បីទទួលបានព័ត៌មានលម្អិត"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"ស្ថានភាពនៃការភ្ជាប់ និងហតស្ប៉ត"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-kn/strings.xml b/packages/Tethering/res/values-kn/strings.xml
index f11a83ea..32f5492 100644
--- a/packages/Tethering/res/values-kn/strings.xml
+++ b/packages/Tethering/res/values-kn/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"ಟೆಥರಿಂಗ್ ಅಥವಾ ಹಾಟ್‌ಸ್ಪಾಟ್ ಸಕ್ರಿಯವಾಗಿದೆ"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"ಹೊಂದಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"ಟೆಥರಿಂಗ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"ವಿವರಗಳಿಗಾಗಿ ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"ಟೆಥರಿಂಗ್ ಅಥವಾ ಹಾಟ್‌ಸ್ಪಾಟ್ ಸಕ್ರಿಯವಾಗಿದೆ"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"ಸೆಟಪ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"ಟೆಥರಿಂಗ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"ವಿವರಗಳಿಗಾಗಿ ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"ಹಾಟ್‌ಸ್ಪಾಟ್ ಮತ್ತು ಟೆಥರಿಂಗ್‌ ಸ್ಥಿತಿ"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-ko/strings.xml b/packages/Tethering/res/values-ko/strings.xml
index 57f24f5..156b247 100644
--- a/packages/Tethering/res/values-ko/strings.xml
+++ b/packages/Tethering/res/values-ko/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"테더링 또는 핫스팟 사용"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"설정하려면 탭하세요."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"테더링이 사용 중지됨"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"자세한 정보는 관리자에게 문의하세요."</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"테더링 또는 핫스팟 사용"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"설정하려면 탭하세요."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"테더링이 사용 중지됨"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"자세한 정보는 관리자에게 문의하세요."</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"핫스팟 및 테더링 상태"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-ky/strings.xml b/packages/Tethering/res/values-ky/strings.xml
index 7985485..18ee5fd 100644
--- a/packages/Tethering/res/values-ky/strings.xml
+++ b/packages/Tethering/res/values-ky/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"Жалгаштыруу же хотспот жандырылган"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"Жөндөө үчүн таптап коюңуз."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"Жалгаштыруу функциясы өчүрүлгөн"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"Кеңири маалымат үчүн администраторуңузга кайрылыңыз"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"Модем режими күйүп турат"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"Жөндөө үчүн таптап коюңуз."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"Телефонду модем катары колдонууга болбойт"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"Кеңири маалымат үчүн администраторуңузга кайрылыңыз"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Байланыш түйүнүнүн жана модем режиминин статусу"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-lo/strings.xml b/packages/Tethering/res/values-lo/strings.xml
index 78f1585..b127670 100644
--- a/packages/Tethering/res/values-lo/strings.xml
+++ b/packages/Tethering/res/values-lo/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"ເປີດ​ການ​ປ່ອຍ​ສັນຍານ ຫຼື​ຮັອດສະປອດ​ແລ້ວ"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"ແຕະເພື່ອຕັ້ງຄ່າ."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"ການປ່ອຍສັນຍານຖືກປິດໄວ້"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"ຕິດຕໍ່ຜູ້ເບິ່ງແຍງລະບົບສຳລັບລາຍລະອຽດ"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"ເປີດການປ່ອຍສັນຍານ ຫຼື ຮັອດສະປອດແລ້ວ"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"ແຕະເພື່ອຕັ້ງຄ່າ."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"ການປ່ອຍສັນຍານຖືກປິດໄວ້"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"ຕິດຕໍ່ຜູ້ເບິ່ງແຍງລະບົບສຳລັບລາຍລະອຽດ"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"ສະຖານະຮັອດສະປອດ ແລະ ການປ່ອຍສັນຍານ"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-lt/strings.xml b/packages/Tethering/res/values-lt/strings.xml
index ebff8ac..8427baf 100644
--- a/packages/Tethering/res/values-lt/strings.xml
+++ b/packages/Tethering/res/values-lt/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"Susietas ar aktyvus"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"Palieskite, kad nustatytumėte."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"Įrenginio kaip modemo naudojimas išjungtas"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"Jei reikia išsamios informacijos, susisiekite su administratoriumi"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"Įrenginys naudojamas kaip modemas arba įjungtas viešosios interneto prieigos taškas"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"Palieskite, kad nustatytumėte."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"Įrenginio kaip modemo naudojimas išjungtas"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"Jei reikia išsamios informacijos, susisiekite su administratoriumi"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Viešosios interneto prieigos taško ir įrenginio kaip modemo naudojimo būsena"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-lv/strings.xml b/packages/Tethering/res/values-lv/strings.xml
index 54d0048..aa2d699 100644
--- a/packages/Tethering/res/values-lv/strings.xml
+++ b/packages/Tethering/res/values-lv/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"Piesaiste vai tīklājs ir aktīvs."</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"Pieskarieties, lai iestatītu."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"Piesaiste ir atspējota"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"Lai iegūtu detalizētu informāciju, sazinieties ar savu administratoru."</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"Piesaiste vai tīklājs ir aktīvs."</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"Pieskarieties, lai to iestatītu."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"Piesaiste ir atspējota"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"Lai iegūtu detalizētu informāciju, sazinieties ar savu administratoru."</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Tīklāja un piesaistes statuss"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-mcc204-mnc04/strings.xml b/packages/Tethering/res/values-mcc204-mnc04/strings.xml
deleted file mode 100644
index a996b42..0000000
--- a/packages/Tethering/res/values-mcc204-mnc04/strings.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2020 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<resources>
-    <!-- String for no upstream notification title [CHAR LIMIT=200] -->
-    <string name="no_upstream_notification_title">Hotspot has no internet</string>
-    <!-- String for no upstream notification title [CHAR LIMIT=200] -->
-    <string name="no_upstream_notification_message">Devices can\u2019t connect to internet</string>
-    <!-- String for cellular roaming notification disable button [CHAR LIMIT=200]  -->
-    <string name="no_upstream_notification_disable_button">Turn off hotspot</string>
-
-    <!-- String for cellular roaming notification title [CHAR LIMIT=200]  -->
-    <string name="upstream_roaming_notification_title">Hotspot is on</string>
-    <!-- String for cellular roaming notification message [CHAR LIMIT=500]  -->
-    <string name="upstream_roaming_notification_message">Additional charges may apply while roaming</string>
-    <!-- String for cellular roaming notification continue button [CHAR LIMIT=200]  -->
-    <string name="upstream_roaming_notification_continue_button">Continue</string>
-</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-af/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-af/strings.xml
new file mode 100644
index 0000000..19d659c
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-af/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"Verbinding het nie internet nie"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"Toestelle kan nie koppel nie"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Skakel verbinding af"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Warmkol of verbinding is aan"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Bykomende heffings kan geld terwyl jy swerf"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-am/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-am/strings.xml
new file mode 100644
index 0000000..8995430
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-am/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"ማስተሳሰር ምንም በይነመረብ የለውም"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"መሣሪያዎችን ማገናኘት አይቻልም"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"ማስተሳሰርን አጥፋ"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"መገናኛ ነጥብ ወይም ማስተሳሰር በርቷል"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"በሚያንዣብብበት ጊዜ ተጨማሪ ክፍያዎች ተፈጻሚ ሊሆኑ ይችላሉ"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-ar/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-ar/strings.xml
new file mode 100644
index 0000000..54f3b53
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-ar/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"ما مِن اتصال بالإنترنت خلال التوصيل"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"تعذّر اتصال الأجهزة"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"إيقاف التوصيل"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"نقطة الاتصال أو التوصيل مفعّلان"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"قد يتم تطبيق رسوم إضافية أثناء التجوال."</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-as/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-as/strings.xml
new file mode 100644
index 0000000..e215141c
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-as/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"টে\'ডাৰিঙৰ ইণ্টাৰনেট নাই"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"ডিভাইচসমূহ সংযোগ কৰিব নোৱাৰি"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"টে\'ডাৰিং অফ কৰক"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"হটস্পট অথবা টে\'ডাৰিং অন আছে"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"ৰ\'মিঙত থাকিলে অতিৰিক্ত মাচুল প্ৰযোজ্য হ’ব পাৰে"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-az/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-az/strings.xml
new file mode 100644
index 0000000..1fd8e4c
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-az/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"Modemin internetə girişi yoxdur"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"Cihazları qoşmaq mümkün deyil"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Modemi deaktiv edin"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Hotspot və ya modem aktivdir"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Rouminq zamanı əlavə ödənişlər tətbiq edilə bilər"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-b+sr+Latn/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-b+sr+Latn/strings.xml
new file mode 100644
index 0000000..1abe4f3
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-b+sr+Latn/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"Privezivanje nema pristup internetu"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"Povezivanje uređaja nije uspelo"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Isključi privezivanje"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Uključen je hotspot ili privezivanje"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Možda važe dodatni troškovi u romingu"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-be/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-be/strings.xml
new file mode 100644
index 0000000..38dbd1e
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-be/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"Рэжым мадэма выкарыстоўваецца без доступу да інтэрнэту"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"Не ўдалося падключыць прылады"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Выключыць рэжым мадэма"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Хот-спот або рэжым мадэма ўключаны"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Пры выкарыстанні роўмінгу можа спаганяцца дадатковая плата"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-bg/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-bg/strings.xml
new file mode 100644
index 0000000..04b44db
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-bg/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"Тетърингът няма връзка с интернет"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"Устройствата не могат да установят връзка"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Изключване на тетъринга"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Точката за достъп или тетърингът са включени"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Възможно е да ви бъдат начислени допълнителни такси при роуминг"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-bn/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-bn/strings.xml
new file mode 100644
index 0000000..579d1be
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-bn/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"টিথারিং করার জন্য কোনও ইন্টারনেট কানেকশন নেই"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"ডিভাইস কানেক্ট করতে পারছে না"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"টিথারিং বন্ধ করুন"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"হটস্পট বা টিথারিং চালু আছে"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"রোমিংয়ের সময় অতিরিক্ত চার্জ করা হতে পারে"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-bs/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-bs/strings.xml
new file mode 100644
index 0000000..9ce3efe
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-bs/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"Povezivanje putem mobitela nema internet"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"Uređaji se ne mogu povezati"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Isključi povezivanje putem mobitela"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Pristupna tačka ili povezivanje putem mobitela je uključeno"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Mogu nastati dodatni troškovi u romingu"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-ca/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-ca/strings.xml
new file mode 100644
index 0000000..46d4c35
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-ca/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"La compartició de xarxa no té accés a Internet"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"No es poden connectar els dispositius"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Desactiva la compartició de xarxa"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"S\'ha activat el punt d\'accés Wi‑Fi o la compartició de xarxa"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"És possible que s\'apliquin costos addicionals en itinerància"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-cs/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-cs/strings.xml
new file mode 100644
index 0000000..cc13860
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-cs/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"Tethering nemá připojení k internetu"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"Zařízení se nemůžou připojit"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Vypnout tethering"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Je zapnutý hotspot nebo tethering"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Při roamingu mohou být účtovány dodatečné poplatky"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-da/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-da/strings.xml
new file mode 100644
index 0000000..92c3ae1
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-da/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"Netdeling har ingen internetforbindelse"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"Enheder kan ikke oprette forbindelse"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Deaktiver netdeling"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Hotspot eller netdeling er aktiveret"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Der opkræves muligvis yderligere gebyrer ved roaming"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-de/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-de/strings.xml
new file mode 100644
index 0000000..967eb4d
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-de/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"Tethering hat keinen Internetzugriff"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"Geräte können sich nicht verbinden"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Tethering deaktivieren"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Hotspot oder Tethering ist aktiviert"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Für das Roaming können zusätzliche Gebühren anfallen"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-el/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-el/strings.xml
new file mode 100644
index 0000000..5fb4974
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-el/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"Η σύνδεση δεν έχει πρόσβαση στο διαδίκτυο"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"Δεν είναι δυνατή η σύνδεση των συσκευών"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Απενεργοποιήστε τη σύνδεση"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Ενεργό σημείο πρόσβασης Wi-Fi ή ενεργή σύνδεση"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Ενδέχεται να ισχύουν επιπλέον χρεώσεις κατά την περιαγωγή."</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-en-rAU/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-en-rAU/strings.xml
new file mode 100644
index 0000000..45647f9
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-en-rAU/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"Tethering has no Internet"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"Devices can’t connect"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Turn off tethering"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Hotspot or tethering is on"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Additional charges may apply while roaming"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-en-rCA/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-en-rCA/strings.xml
new file mode 100644
index 0000000..45647f9
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-en-rCA/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"Tethering has no Internet"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"Devices can’t connect"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Turn off tethering"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Hotspot or tethering is on"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Additional charges may apply while roaming"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-en-rGB/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-en-rGB/strings.xml
new file mode 100644
index 0000000..45647f9
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-en-rGB/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"Tethering has no Internet"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"Devices can’t connect"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Turn off tethering"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Hotspot or tethering is on"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Additional charges may apply while roaming"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-en-rIN/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-en-rIN/strings.xml
new file mode 100644
index 0000000..45647f9
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-en-rIN/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"Tethering has no Internet"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"Devices can’t connect"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Turn off tethering"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Hotspot or tethering is on"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Additional charges may apply while roaming"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-en-rXC/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-en-rXC/strings.xml
new file mode 100644
index 0000000..7877074
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-en-rXC/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‏‏‏‎‎‏‏‏‎‎‏‎‎‏‏‎‏‎‎‎‏‎‏‎‏‏‏‏‏‎‎‏‏‎‎‎‎‏‎‏‏‏‏‎‏‎‏‎‎‎‏‏‏‎‏‎‎‎Tethering has no internet‎‏‎‎‏‎"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‏‎‏‎‏‎‏‏‏‎‏‎‎‎‎‎‏‏‏‏‏‏‏‎‏‎‎‎‏‏‎‎‎‎‎‏‏‏‎‎‏‏‎‏‏‎‎‏‎‏‎‎‎‎‏‏‏‎Devices can’t connect‎‏‎‎‏‎"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‎‏‎‎‏‏‏‎‏‏‏‎‏‎‎‏‎‏‎‏‎‎‏‏‏‎‎‎‏‏‎‎‏‏‎‏‎‏‏‏‏‎‎‎‏‎‏‏‎‎‎‏‎‏‎‎‎‎Turn off tethering‎‏‎‎‏‎"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‎‏‏‏‎‏‏‎‏‎‏‎‏‎‏‏‎‎‎‎‏‎‎‎‏‏‎‎‎‎‎‎‎‎‏‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‏‎‎‏‏‏‎Hotspot or tethering is on‎‏‎‎‏‎"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‎‏‎‏‎‏‎‎‎‏‏‏‏‏‏‏‎‏‏‎‏‏‏‏‎‎‏‏‏‏‏‎‏‏‎‎‎‎‏‏‎‎‎‏‏‏‏‏‎‏‎‏‎‏‏‏‏‎‎Additional charges may apply while roaming‎‏‎‎‏‎"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-es-rUS/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-es-rUS/strings.xml
new file mode 100644
index 0000000..08edd81
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-es-rUS/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"La conexión mediante dispositivo móvil no tiene Internet"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"No se pueden conectar los dispositivos"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Desactivar conexión mediante dispositivo móvil"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Se activó el hotspot o la conexión mediante dispositivo móvil"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Es posible que se apliquen cargos adicionales por roaming"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-es/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-es/strings.xml
new file mode 100644
index 0000000..79f51d0
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-es/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"La conexión no se puede compartir, porque no hay acceso a Internet"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"Los dispositivos no se pueden conectar"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Desactivar conexión compartida"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Punto de acceso o conexión compartida activados"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Puede que se apliquen cargos adicionales en itinerancia"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-et/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-et/strings.xml
new file mode 100644
index 0000000..2da5f8a
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-et/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"Jagamisel puudub internetiühendus"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"Seadmed ei saa ühendust luua"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Lülita jagamine välja"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Kuumkoht või jagamine on sisse lülitatud"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Rändluse kasutamisega võivad kaasneda lisatasud"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-eu/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-eu/strings.xml
new file mode 100644
index 0000000..2073f28
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-eu/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"Konexioa partekatzeko aukerak ez du Interneteko konexiorik"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"Ezin dira konektatu gailuak"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Desaktibatu konexioa partekatzeko aukera"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Wifi-gunea edo konexioa partekatzeko aukera aktibatuta dago"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Baliteke kostu gehigarriak ordaindu behar izatea ibiltaritzan"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-fa/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-fa/strings.xml
new file mode 100644
index 0000000..e21b2a0
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-fa/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"«اشتراک‌گذاری اینترنت» به اینترنت دسترسی ندارد"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"دستگاه‌ها متصل نمی‌شوند"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"خاموش کردن «اشتراک‌گذاری اینترنت»"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"«نقطه اتصال» یا «اشتراک‌گذاری اینترنت» روشن است"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"ممکن است درحین فراگردی تغییرات دیگر اعمال شود"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-fi/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-fi/strings.xml
new file mode 100644
index 0000000..88b0b13
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-fi/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"Ei jaettavaa internetyhteyttä"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"Laitteet eivät voi muodostaa yhteyttä"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Laita yhteyden jakaminen pois päältä"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Hotspot tai yhteyden jakaminen on päällä"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Roaming voi aiheuttaa lisämaksuja"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-fr-rCA/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-fr-rCA/strings.xml
new file mode 100644
index 0000000..3b781bc
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-fr-rCA/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"Le partage de connexion n\'est pas connecté à Internet"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"Impossible de connecter les appareils"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Désactiver le partage de connexion"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Le point d\'accès ou le partage de connexion est activé"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"En itinérance, des frais supplémentaires peuvent s\'appliquer"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-fr/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-fr/strings.xml
new file mode 100644
index 0000000..51d7203
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-fr/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"Aucune connexion à Internet n\'est disponible pour le partage de connexion"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"Impossible de connecter les appareils"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Désactiver le partage de connexion"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Le point d\'accès ou le partage de connexion est activé"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"En itinérance, des frais supplémentaires peuvent s\'appliquer"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-gl/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-gl/strings.xml
new file mode 100644
index 0000000..008ccb4
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-gl/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"A conexión compartida non ten Internet"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"Non se puideron conectar os dispositivos"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Desactivar conexión compartida"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Está activada a zona wifi ou a conexión compartida"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Pódense aplicar cargos adicionais en itinerancia"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-gu/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-gu/strings.xml
new file mode 100644
index 0000000..f2e3b4d
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-gu/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"ઇન્ટરનેટ શેર કરવાની સુવિધામાં ઇન્ટરનેટ નથી"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"ડિવાઇસ કનેક્ટ કરી શકાતા નથી"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"ઇન્ટરનેટ શેર કરવાની સુવિધા બંધ કરો"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"હૉટસ્પૉટ અથવા ઇન્ટરનેટ શેર કરવાની સુવિધા ચાલુ છે"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"રોમિંગમાં વધારાના શુલ્ક લાગી શકે છે"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-hi/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-hi/strings.xml
new file mode 100644
index 0000000..b11839d
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-hi/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"टेदरिंग से इंटरनेट नहीं चल रहा"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"डिवाइस कनेक्ट नहीं हो पा रहे"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"टेदरिंग बंद करें"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"हॉटस्पॉट या टेदरिंग चालू है"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"रोमिंग के दौरान अतिरिक्त शुल्क लग सकता है"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-hr/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-hr/strings.xml
new file mode 100644
index 0000000..0a5aca2
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-hr/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"Modemsko povezivanje nema internet"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"Uređaji se ne mogu povezati"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Isključivanje modemskog povezivanja"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Uključena je žarišna točka ili modemsko povezivanje"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"U roamingu su mogući dodatni troškovi"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-hu/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-hu/strings.xml
new file mode 100644
index 0000000..21c689a4
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-hu/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"Nincs internetkapcsolat az internet megosztásához"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"Az eszközök nem tudnak csatlakozni"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Internetmegosztás kikapcsolása"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"A hotspot vagy az internetmegosztás be van kapcsolva"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Roaming során további díjak léphetnek fel"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-hy/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-hy/strings.xml
new file mode 100644
index 0000000..689d9287
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-hy/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"Մոդեմի ռեժիմի կապը բացակայում է"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"Չհաջողվեց միացնել սարքը"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Անջատել մոդեմի ռեժիմը"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Թեժ կետը կամ մոդեմի ռեժիմը միացված է"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Ռոումինգում կարող են լրացուցիչ վճարներ գանձվել"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-in/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-in/strings.xml
new file mode 100644
index 0000000..a5f4d19
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-in/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"Tidak ada koneksi internet di tethering"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"Perangkat tidak dapat terhubung"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Nonaktifkan tethering"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Hotspot atau tethering aktif"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Biaya tambahan mungkin berlaku saat roaming"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-is/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-is/strings.xml
new file mode 100644
index 0000000..fc7e8aa
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-is/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"Tjóðrun er ekki með internettengingu"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"Tæki geta ekki tengst"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Slökkva á tjóðrun"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Kveikt er á heitum reit eða tjóðrun"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Viðbótargjöld kunna að eiga við í reiki"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-it/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-it/strings.xml
new file mode 100644
index 0000000..6456dd1
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-it/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"Nessuna connessione a Internet per il tethering"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"Impossibile connettere i dispositivi"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Disattiva il tethering"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Hotspot o tethering attivi"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Potrebbero essere applicati costi aggiuntivi durante il roaming"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-iw/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-iw/strings.xml
new file mode 100644
index 0000000..46b24bd
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-iw/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"אי אפשר להפעיל את תכונת שיתוף האינטרנט בין מכשירים כי אין חיבור לאינטרנט"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"למכשירים אין אפשרות להתחבר"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"השבתה של שיתוף האינטרנט בין מכשירים"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"תכונת הנקודה לשיתוף אינטרנט או תכונת שיתוף האינטרנט בין מכשירים פועלת"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"ייתכנו חיובים נוספים בעת נדידה"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-ja/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-ja/strings.xml
new file mode 100644
index 0000000..e6eb277
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-ja/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"テザリングがインターネットに接続されていません"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"デバイスを接続できません"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"テザリングを OFF にする"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"アクセス ポイントまたはテザリングが ON です"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"ローミング時に追加料金が発生することがあります"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-ka/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-ka/strings.xml
new file mode 100644
index 0000000..aeddd71
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-ka/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"ტეტერინგს არ აქვს ინტერნეტზე წვდომა"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"მოწყობილობები ვერ ახერხებენ დაკავშირებას"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"ტეტერინგის გამორთვა"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"ჩართულია უსადენო ქსელი ან ტეტერინგი"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"როუმინგის გამოყენებისას შეიძლება ჩამოგეჭრათ დამატებითი საფასური"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-kk/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-kk/strings.xml
new file mode 100644
index 0000000..255f0a2
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-kk/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"Тетеринг режимі интернет байланысынсыз пайдаланылуда"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"Құрылғыларды байланыстыру мүмкін емес"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Тетерингіні өшіру"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Хотспот немесе тетеринг қосулы"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Роуминг кезінде қосымша ақы алынуы мүмкін."</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-km/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-km/strings.xml
new file mode 100644
index 0000000..2bceb1c
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-km/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"ការភ្ជាប់​មិនមានអ៊ីនធឺណិត​ទេ"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"មិនអាច​ភ្ជាប់ឧបករណ៍​បានទេ"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"បិទការភ្ជាប់"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"ហតស្ប៉ត ឬការភ្ជាប់​ត្រូវបានបើក"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"អាចមាន​ការគិតថ្លៃ​បន្ថែម នៅពេល​រ៉ូមីង"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-kn/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-kn/strings.xml
new file mode 100644
index 0000000..ed76930
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-kn/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"ಟೆಥರಿಂಗ್‌ ಯಾವುದೇ ಇಂಟರ್ನೆಟ್ ಕನೆಕ್ಷನ್ ಹೊಂದಿಲ್ಲ"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"ಸಾಧನಗಳನ್ನು ಕನೆಕ್ಟ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"ಟೆಥರಿಂಗ್‌ ಆಫ್ ಮಾಡಿ"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"ಹಾಟ್‌ಸ್ಪಾಟ್ ಅಥವಾ ಟೆಥರಿಂಗ್‌ ಆನ್ ಆಗಿದೆ"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"ರೋಮಿಂಗ್‌ನಲ್ಲಿರುವಾಗ ಹೆಚ್ಚುವರಿ ಶುಲ್ಕಗಳು ಅನ್ವಯವಾಗಬಹುದು"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-ko/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-ko/strings.xml
new file mode 100644
index 0000000..6e50494
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-ko/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"테더링으로 인터넷을 사용할 수 없음"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"기기에서 연결할 수 없음"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"테더링 사용 중지"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"핫스팟 또는 테더링 켜짐"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"로밍 중에는 추가 요금이 발생할 수 있습니다."</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-ky/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-ky/strings.xml
new file mode 100644
index 0000000..d68128b
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-ky/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"Модем режими Интернети жок колдонулууда"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"Түзмөктөр туташпай жатат"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Модем режимин өчүрүү"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Байланыш түйүнү же модем режими күйүк"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Роумингде кошумча акы алынышы мүмкүн"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-lo/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-lo/strings.xml
new file mode 100644
index 0000000..03e134a
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-lo/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"ການປ່ອຍສັນຍານບໍ່ມີອິນເຕີເນັດ"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"ອຸປະກອນບໍ່ສາມາດເຊື່ອມຕໍ່ໄດ້"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"ປິດການປ່ອຍສັນຍານ"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"ເປີດໃຊ້ຮັອດສະປອດ ຫຼື ການປ່ອຍສັນຍານຢູ່"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"ອາດມີຄ່າໃຊ້ຈ່າຍເພີ່ມເຕີມໃນລະຫວ່າງການໂຣມມິງ"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-lt/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-lt/strings.xml
new file mode 100644
index 0000000..652cedc
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-lt/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"Nėra įrenginio kaip modemo naudojimo interneto ryšio"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"Nepavyko susieti įrenginių"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Išjungti įrenginio kaip modemo naudojimą"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Įjungtas viešosios interneto prieigos taškas arba įrenginio kaip modemo naudojimas"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Veikiant tarptinkliniam ryšiui gali būti taikomi papildomi mokesčiai"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-lv/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-lv/strings.xml
new file mode 100644
index 0000000..2219722
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-lv/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"Piesaistei nav interneta savienojuma"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"Nevar savienot ierīces"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Izslēgt piesaisti"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Ir ieslēgts tīklājs vai piesaiste"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Viesabonēšanas laikā var tikt piemērota papildu samaksa"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-mk/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-mk/strings.xml
new file mode 100644
index 0000000..227f9e3
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-mk/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"Нема интернет преку мобилен"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"Уредите не може да се поврзат"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Исклучи интернет преку мобилен"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Точката на пристап или интернетот преку мобилен е вклучен"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"При роаминг може да се наплатат дополнителни трошоци"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-ml/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-ml/strings.xml
new file mode 100644
index 0000000..ec43885
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-ml/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"ടെതറിംഗിന് ഇന്റർനെറ്റ് ഇല്ല"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"ഉപകരണങ്ങൾ കണക്റ്റ് ചെയ്യാനാവില്ല"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"ടെതറിംഗ് ഓഫാക്കുക"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"ഹോട്ട്‌സ്‌പോട്ട് അല്ലെങ്കിൽ ടെതറിംഗ് ഓണാണ്"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"റോമിംഗ് ചെയ്യുമ്പോൾ അധിക നിരക്കുകൾ ബാധകമായേക്കാം"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-mn/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-mn/strings.xml
new file mode 100644
index 0000000..e263573
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-mn/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"Модемд интернэт алга байна"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"Төхөөрөмжүүд холбогдох боломжгүй байна"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Модем болгохыг унтраах"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Сүлжээний цэг эсвэл модем болгох асаалттай байна"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Роумингийн үеэр нэмэлт төлбөр нэхэмжилж болзошгүй"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-mr/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-mr/strings.xml
new file mode 100644
index 0000000..adf845d
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-mr/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"टेदरिंगला इंटरनेट नाही"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"डिव्हाइस कनेक्ट होऊ शकत नाहीत"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"टेदरिंग बंद करा"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"हॉटस्पॉट किंवा टेदरिंग सुरू आहे"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"रोमिंगदरम्यान अतिरिक्त शुल्क लागू होऊ शकतात"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-ms/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-ms/strings.xml
new file mode 100644
index 0000000..f65c451
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-ms/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"Penambatan tiada Internet"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"Peranti tidak dapat disambungkan"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Matikan penambatan"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Tempat liputan atau penambatan dihidupkan"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Caj tambahan mungkin digunakan semasa perayauan"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-my/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-my/strings.xml
new file mode 100644
index 0000000..4118e77
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-my/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"မိုဘိုင်းဖုန်းသုံး ချိတ်ဆက်မျှဝေခြင်းတွင် အင်တာနက် မရှိပါ"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"စက်များ ချိတ်ဆက်၍ မရပါ"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"မိုဘိုင်းဖုန်းသုံး ချိတ်ဆက်မျှဝေခြင်း ပိတ်ရန်"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"ဟော့စပေါ့ (သို့) မိုဘိုင်းဖုန်းသုံး ချိတ်ဆက်မျှဝေခြင်း ဖွင့်ထားသည်"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"ပြင်ပကွန်ရက်နှင့် ချိတ်ဆက်သည့်အခါ နောက်ထပ်ကျသင့်မှုများ ရှိနိုင်သည်"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-nb/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-nb/strings.xml
new file mode 100644
index 0000000..3685358
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-nb/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"Internettdeling har ikke internettilgang"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"Enhetene kan ikke koble til"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Slå av internettdeling"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Wi-Fi-sone eller internettdeling er på"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Ytterligere kostnader kan påløpe under roaming"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-ne/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-ne/strings.xml
new file mode 100644
index 0000000..2a73300
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-ne/strings.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- no translation found for no_upstream_notification_title (5030042590486713460) -->
+    <skip />
+    <!-- no translation found for no_upstream_notification_message (3843613362272973447) -->
+    <skip />
+    <!-- no translation found for no_upstream_notification_disable_button (6385491461813507624) -->
+    <skip />
+    <!-- no translation found for upstream_roaming_notification_title (3015912166812283303) -->
+    <skip />
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"रोमिङ सेवा प्रयोग गर्दा अतिरिक्त शुल्क लाग्न सक्छ"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-nl/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-nl/strings.xml
new file mode 100644
index 0000000..1d88894
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-nl/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"Tethering heeft geen internet"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"Apparaten kunnen niet worden verbonden"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Tethering uitschakelen"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Hotspot of tethering is ingeschakeld"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Er kunnen extra kosten voor roaming in rekening worden gebracht."</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-or/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-or/strings.xml
new file mode 100644
index 0000000..8038815
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-or/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"ଟିଥରିଂ ପାଇଁ କୌଣସି ଇଣ୍ଟର୍ନେଟ୍ ସଂଯୋଗ ନାହିଁ"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"ଡିଭାଇସଗୁଡ଼ିକ ସଂଯୋଗ କରାଯାଇପାରିବ ନାହିଁ"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"ଟିଥରିଂ ବନ୍ଦ କରନ୍ତୁ"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"ହଟସ୍ପଟ୍ କିମ୍ବା ଟିଥରିଂ ଚାଲୁ ଅଛି"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"ରୋମିଂରେ ଥିବା ସମୟରେ ଅତିରିକ୍ତ ଶୁଳ୍କ ଲାଗୁ ହୋଇପାରେ"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-pa/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-pa/strings.xml
new file mode 100644
index 0000000..819833e
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-pa/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"ਟੈਦਰਿੰਗ ਕੋਲ ਇੰਟਰਨੈੱਟ ਪਹੁੰਚ ਨਹੀਂ ਹੈ"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"ਡੀਵਾਈਸ ਕਨੈਕਟ ਨਹੀਂ ਕੀਤੇ ਜਾ ਸਕਦੇ"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"ਟੈਦਰਿੰਗ ਬੰਦ ਕਰੋ"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"ਹੌਟਸਪੌਟ ਜਾਂ ਟੈਦਰਿੰਗ ਚਾਲੂ ਹੈ"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"ਰੋਮਿੰਗ ਦੌਰਾਨ ਵਧੀਕ ਖਰਚੇ ਲਾਗੂ ਹੋ ਸਕਦੇ ਹਨ"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-pl/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-pl/strings.xml
new file mode 100644
index 0000000..65e4380
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-pl/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"Tethering nie ma internetu"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"Urządzenia nie mogą się połączyć"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Wyłącz tethering"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Hotspot lub tethering jest włączony"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Podczas korzystania z roamingu mogą zostać naliczone dodatkowe opłaty"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-pt-rBR/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-pt-rBR/strings.xml
new file mode 100644
index 0000000..d886617
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-pt-rBR/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"O tethering não tem Internet"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"Não é possível conectar os dispositivos"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Desativar o tethering"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Ponto de acesso ou tethering ativado"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Pode haver cobranças extras durante o roaming"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-pt-rPT/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-pt-rPT/strings.xml
new file mode 100644
index 0000000..bfd45ca
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-pt-rPT/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"A ligação (à Internet) via telemóvel não tem Internet"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"Não é possível ligar os dispositivos"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Desativar ligação (à Internet) via telemóvel"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"A zona Wi-Fi ou a ligação (à Internet) via telemóvel está ativada"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Podem aplicar-se custos adicionais em roaming."</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-pt/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-pt/strings.xml
new file mode 100644
index 0000000..d886617
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-pt/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"O tethering não tem Internet"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"Não é possível conectar os dispositivos"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Desativar o tethering"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Ponto de acesso ou tethering ativado"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Pode haver cobranças extras durante o roaming"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-ro/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-ro/strings.xml
new file mode 100644
index 0000000..8d87a9e5
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-ro/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"Procesul de tethering nu are internet"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"Dispozitivele nu se pot conecta"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Dezactivați procesul de tethering"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"S-a activat hotspotul sau tethering"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Se pot aplica taxe suplimentare pentru roaming"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-ru/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-ru/strings.xml
new file mode 100644
index 0000000..dbdb9eb
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-ru/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"Режим модема используется без доступа к Интернету"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"Невозможно подключить устройства."</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Отключить режим модема"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Включены точка доступа или режим модема"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"За использование услуг связи в роуминге может взиматься дополнительная плата."</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-si/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-si/strings.xml
new file mode 100644
index 0000000..d8301e4
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-si/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"ටෙදරින් හට අන්තර්ජාලය නැත"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"උපාංගවලට සම්බන්ධ විය නොහැකිය"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"ටෙදරින් ක්‍රියාවිරහිත කරන්න"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"හොට්ස්පොට් හෝ ටෙදරින් ක්‍රියාත්මකයි"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"රෝමිං අතරතුර අමතර ගාස්තු අදාළ විය හැකිය"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-sk/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-sk/strings.xml
new file mode 100644
index 0000000..bef7136
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-sk/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"Tethering nemá internetové pripojenie"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"Zariadenia sa nemôžu pripojiť"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Vypnúť tethering"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Je zapnutý hotspot alebo tethering"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Počas roamingu vám môžu byť účtované ďalšie poplatky"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-sl/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-sl/strings.xml
new file mode 100644
index 0000000..3202c62
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-sl/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"Internetna povezava prek mobilnega telefona ni vzpostavljena"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"Napravi se ne moreta povezati"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Izklopi internetno povezavo prek mobilnega telefona"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Dostopna točka ali internetna povezava prek mobilnega telefona je vklopljena"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Med gostovanjem lahko nastanejo dodatni stroški"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-sq/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-sq/strings.xml
new file mode 100644
index 0000000..37f6ad2
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-sq/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"Ndarja e internetit nuk ka internet"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"Pajisjet nuk mund të lidhen"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Çaktivizo ndarjen e internetit"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Zona e qasjes për internet ose ndarja e internetit është aktive"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Mund të zbatohen tarifime shtesë kur je në roaming"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-sr/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-sr/strings.xml
new file mode 100644
index 0000000..5566d03
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-sr/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"Привезивање нема приступ интернету"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"Повезивање уређаја није успело"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Искључи привезивање"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Укључен је хотспот или привезивање"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Можда важе додатни трошкови у ромингу"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-sv/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-sv/strings.xml
new file mode 100644
index 0000000..9765acd
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-sv/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"Det finns ingen internetanslutning för internetdelningen"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"Enheterna kan inte anslutas"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Inaktivera internetdelning"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Surfzon eller internetdelning har aktiverats"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Ytterligare avgifter kan tillkomma vid roaming"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-sw/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-sw/strings.xml
new file mode 100644
index 0000000..cf850c9
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-sw/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"Kipengele cha kusambaza mtandao hakina intaneti"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"Imeshindwa kuunganisha vifaa"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Zima kipengele cha kusambaza mtandao"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Umewasha kipengele cha kusambaza mtandao au mtandao pepe"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Huenda ukatozwa gharama za ziada ukitumia mitandao ya ng\'ambo"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-ta/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-ta/strings.xml
new file mode 100644
index 0000000..ea04821
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-ta/strings.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- no translation found for no_upstream_notification_title (5030042590486713460) -->
+    <skip />
+    <!-- no translation found for no_upstream_notification_message (3843613362272973447) -->
+    <skip />
+    <!-- no translation found for no_upstream_notification_disable_button (6385491461813507624) -->
+    <skip />
+    <!-- no translation found for upstream_roaming_notification_title (3015912166812283303) -->
+    <skip />
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"ரோமிங்கின்போது கூடுதல் கட்டணங்கள் விதிக்கப்படக்கூடும்"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-te/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-te/strings.xml
new file mode 100644
index 0000000..937d34d
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-te/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"టెథరింగ్ చేయడానికి ఇంటర్నెట్ కనెక్షన్ లేదు"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"పరికరాలు కనెక్ట్ అవ్వడం లేదు"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"టెథరింగ్‌ను ఆఫ్ చేయండి"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"హాట్‌స్పాట్ లేదా టెథరింగ్ ఆన్‌లో ఉంది"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"రోమింగ్‌లో ఉన్నప్పుడు అదనపు ఛార్జీలు వర్తించవచ్చు"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-th/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-th/strings.xml
new file mode 100644
index 0000000..f781fae
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-th/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"การเชื่อมต่ออินเทอร์เน็ตผ่านมือถือไม่มีอินเทอร์เน็ต"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"อุปกรณ์เชื่อมต่อไม่ได้"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"ปิดการเชื่อมต่ออินเทอร์เน็ตผ่านมือถือ"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"ฮอตสปอตหรือการเชื่อมต่ออินเทอร์เน็ตผ่านมือถือเปิดอยู่"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"อาจมีค่าใช้จ่ายเพิ่มเติมขณะโรมมิ่ง"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-tl/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-tl/strings.xml
new file mode 100644
index 0000000..8d5d4653
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-tl/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"Walang internet ang pag-tether"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"Hindi makakonekta ang mga device"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"I-off ang pag-tether"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Naka-on ang Hotspot o pag-tether"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Posibleng magkaroon ng mga karagdagang singil habang nagro-roam"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-tr/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-tr/strings.xml
new file mode 100644
index 0000000..80cab33
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-tr/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"Tethering\'in internet bağlantısı yok"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"Cihazlar bağlanamıyor"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Tethering\'i kapat"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Hotspot veya tethering açık"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Dolaşım sırasında ek ücretler uygulanabilir"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-uk/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-uk/strings.xml
new file mode 100644
index 0000000..c05932a
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-uk/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"Телефон, який використовується як модем, не підключений до Інтернету"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"Не вдається підключити пристрої"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Вимкнути використання телефона як модема"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Увімкнено точку доступу або використання телефона як модема"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"У роумінгу може стягуватися додаткова плата"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-ur/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-ur/strings.xml
new file mode 100644
index 0000000..d820eee
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-ur/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"ٹیدرنگ میں انٹرنیٹ نہیں ہے"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"آلات منسلک نہیں ہو سکتے"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"ٹیدرنگ آف کریں"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"ہاٹ اسپاٹ یا ٹیدرنگ آن ہے"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"رومنگ کے دوران اضافی چارجز لاگو ہو سکتے ہیں"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-uz/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-uz/strings.xml
new file mode 100644
index 0000000..726148a
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-uz/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"Modem internetga ulanmagan"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"Qurilmalar ulanmadi"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Modem rejimini faolsizlantirish"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Hotspot yoki modem rejimi yoniq"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Rouming vaqtida qoʻshimcha haq olinishi mumkin"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-vi/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-vi/strings.xml
new file mode 100644
index 0000000..b7cb045
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-vi/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"Không có Internet để chia sẻ kết Internet"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"Các thiết bị không thể kết nối"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Tắt tính năng chia sẻ Internet"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Điểm phát sóng hoặc tính năng chia sẻ Internet đang bật"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Bạn có thể mất thêm phí dữ liệu khi chuyển vùng"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-zh-rCN/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-zh-rCN/strings.xml
new file mode 100644
index 0000000..af91aff
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-zh-rCN/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"共享网络未连接到互联网"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"设备无法连接"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"关闭网络共享"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"热点或网络共享已开启"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"漫游时可能会产生额外的费用"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-zh-rHK/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-zh-rHK/strings.xml
new file mode 100644
index 0000000..28e6b80
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-zh-rHK/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"無法透過網絡共享連線至互聯網"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"裝置無法連接"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"關閉網絡共享"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"熱點或網絡共享已開啟"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"漫遊時可能需要支付額外費用"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-zh-rTW/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-zh-rTW/strings.xml
new file mode 100644
index 0000000..05b90692
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-zh-rTW/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"無法透過數據連線連上網際網路"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"裝置無法連線"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"關閉數據連線"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"無線基地台或數據連線已開啟"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"使用漫遊服務可能須支付額外費用"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004-zu/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-zu/strings.xml
new file mode 100644
index 0000000..11eb666
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004-zu/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="5030042590486713460">"Ukusebenzisa ifoni njengemodemu akunayo i-inthanethi"</string>
+    <string name="no_upstream_notification_message" msgid="3843613362272973447">"Amadivayisi awakwazi ukuxhumeka"</string>
+    <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Vala ukusebenzisa ifoni njengemodemu"</string>
+    <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"I-hotspot noma ukusebenzisa ifoni njengemodemu kuvuliwe"</string>
+    <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Kungaba nezinkokhelo ezengeziwe uma uzula"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc004/config.xml b/packages/Tethering/res/values-mcc310-mnc004/config.xml
new file mode 100644
index 0000000..5c5be04
--- /dev/null
+++ b/packages/Tethering/res/values-mcc310-mnc004/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources>
+    <!-- Delay(millisecond) to show no upstream notification after there's no Backhaul. Set delay to
+         "0" for disable this feature. -->
+    <integer name="delay_to_show_no_upstream_after_no_backhaul">5000</integer>
+
+    <!-- Config for showing upstream roaming notification. -->
+    <bool name="config_upstream_roaming_notification">true</bool>
+</resources>
\ No newline at end of file
diff --git a/packages/Tethering/res/values-mcc310-mnc004/strings.xml b/packages/Tethering/res/values-mcc310-mnc004/strings.xml
index a996b42..ce9ff60 100644
--- a/packages/Tethering/res/values-mcc310-mnc004/strings.xml
+++ b/packages/Tethering/res/values-mcc310-mnc004/strings.xml
@@ -15,16 +15,14 @@
 -->
 <resources>
     <!-- String for no upstream notification title [CHAR LIMIT=200] -->
-    <string name="no_upstream_notification_title">Hotspot has no internet</string>
+    <string name="no_upstream_notification_title">Tethering has no internet</string>
     <!-- String for no upstream notification title [CHAR LIMIT=200] -->
-    <string name="no_upstream_notification_message">Devices can\u2019t connect to internet</string>
-    <!-- String for cellular roaming notification disable button [CHAR LIMIT=200]  -->
-    <string name="no_upstream_notification_disable_button">Turn off hotspot</string>
+    <string name="no_upstream_notification_message">Devices can\u2019t connect</string>
+    <!-- String for no upstream notification disable button [CHAR LIMIT=200] -->
+    <string name="no_upstream_notification_disable_button">Turn off tethering</string>
 
-    <!-- String for cellular roaming notification title [CHAR LIMIT=200]  -->
-    <string name="upstream_roaming_notification_title">Hotspot is on</string>
-    <!-- String for cellular roaming notification message [CHAR LIMIT=500]  -->
+    <!-- String for cellular roaming notification title [CHAR LIMIT=200] -->
+    <string name="upstream_roaming_notification_title">Hotspot or tethering is on</string>
+    <!-- String for cellular roaming notification message [CHAR LIMIT=500] -->
     <string name="upstream_roaming_notification_message">Additional charges may apply while roaming</string>
-    <!-- String for cellular roaming notification continue button [CHAR LIMIT=200]  -->
-    <string name="upstream_roaming_notification_continue_button">Continue</string>
 </resources>
diff --git a/packages/Tethering/res/values-mcc310-mnc120/strings.xml b/packages/Tethering/res/values-mcc310-mnc120/strings.xml
deleted file mode 100644
index 618df90..0000000
--- a/packages/Tethering/res/values-mcc310-mnc120/strings.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2020 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- String for tethered notification title with client number info. -->
-    <plurals name="tethered_notification_title_with_client_number">
-        <item quantity="one"><xliff:g>%1$d</xliff:g> device connected.</item>
-        <item quantity="other"><xliff:g>%1$d</xliff:g> devices connected.</item>
-    </plurals>
-</resources>
\ No newline at end of file
diff --git a/packages/Tethering/res/values-mcc311-mnc480-af/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-af/strings.xml
new file mode 100644
index 0000000..9bfa531
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-af/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"Verbinding het nie internet nie"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"Toestelle kan nie koppel nie"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Skakel verbinding af"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Warmkol of verbinding is aan"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Bykomende heffings kan geld terwyl jy swerf"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-am/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-am/strings.xml
new file mode 100644
index 0000000..5949dfa
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-am/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"ማስተሳሰር ምንም በይነመረብ የለውም"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"መሣሪያዎችን ማገናኘት አይቻልም"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"ማስተሳሰርን አጥፋ"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"መገናኛ ነጥብ ወይም ማስተሳሰር በርቷል"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"በሚያንዣብብበት ጊዜ ተጨማሪ ክፍያዎች ተፈጻሚ ሊሆኑ ይችላሉ"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-ar/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-ar/strings.xml
new file mode 100644
index 0000000..8467f9b
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-ar/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"ما مِن اتصال بالإنترنت خلال التوصيل"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"تعذّر اتصال الأجهزة"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"إيقاف التوصيل"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"نقطة الاتصال أو التوصيل مفعّلان"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"قد يتم تطبيق رسوم إضافية أثناء التجوال."</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-as/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-as/strings.xml
new file mode 100644
index 0000000..9776bd8
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-as/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"টে\'ডাৰিঙৰ ইণ্টাৰনেট নাই"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"ডিভাইচসমূহ সংযোগ কৰিব নোৱাৰি"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"টে\'ডাৰিং অফ কৰক"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"হটস্পট অথবা টে\'ডাৰিং অন আছে"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"ৰ\'মিঙত থাকিলে অতিৰিক্ত মাচুল প্ৰযোজ্য হ’ব পাৰে"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-az/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-az/strings.xml
new file mode 100644
index 0000000..e6d3eaf
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-az/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"Modemin internetə girişi yoxdur"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"Cihazları qoşmaq mümkün deyil"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Modemi deaktiv edin"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Hotspot və ya modem aktivdir"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Rouminq zamanı əlavə ödənişlər tətbiq edilə bilər"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-b+sr+Latn/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-b+sr+Latn/strings.xml
new file mode 100644
index 0000000..4c8a1df
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-b+sr+Latn/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"Privezivanje nema pristup internetu"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"Povezivanje uređaja nije uspelo"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Isključi privezivanje"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Uključen je hotspot ili privezivanje"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Možda važe dodatni troškovi u romingu"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-be/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-be/strings.xml
new file mode 100644
index 0000000..edfa41e
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-be/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"Рэжым мадэма выкарыстоўваецца без доступу да інтэрнэту"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"Не ўдалося падключыць прылады"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Выключыць рэжым мадэма"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Хот-спот або рэжым мадэма ўключаны"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Пры выкарыстанні роўмінгу можа спаганяцца дадатковая плата"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-bg/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-bg/strings.xml
new file mode 100644
index 0000000..f563981
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-bg/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"Тетърингът няма връзка с интернет"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"Устройствата не могат да установят връзка"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Изключване на тетъринга"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Точката за достъп или тетърингът са включени"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Възможно е да ви бъдат начислени допълнителни такси при роуминг"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-bn/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-bn/strings.xml
new file mode 100644
index 0000000..d8ecd2e
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-bn/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"টিথারিং করার জন্য কোনও ইন্টারনেট কানেকশন নেই"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"ডিভাইস কানেক্ট করতে পারছে না"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"টিথারিং বন্ধ করুন"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"হটস্পট বা টিথারিং চালু আছে"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"রোমিংয়ের সময় অতিরিক্ত চার্জ করা হতে পারে"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-bs/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-bs/strings.xml
new file mode 100644
index 0000000..b85fd5e
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-bs/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"Povezivanje putem mobitela nema internet"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"Uređaji se ne mogu povezati"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Isključi povezivanje putem mobitela"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Pristupna tačka ili povezivanje putem mobitela je uključeno"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Mogu nastati dodatni troškovi u romingu"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-ca/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-ca/strings.xml
new file mode 100644
index 0000000..a357215
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-ca/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"La compartició de xarxa no té accés a Internet"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"No es poden connectar els dispositius"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Desactiva la compartició de xarxa"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"S\'ha activat el punt d\'accés Wi‑Fi o la compartició de xarxa"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"És possible que s\'apliquin costos addicionals en itinerància"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-cs/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-cs/strings.xml
new file mode 100644
index 0000000..91196be
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-cs/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"Tethering nemá připojení k internetu"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"Zařízení se nemůžou připojit"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Vypnout tethering"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Je zapnutý hotspot nebo tethering"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Při roamingu mohou být účtovány dodatečné poplatky"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-da/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-da/strings.xml
new file mode 100644
index 0000000..1968900
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-da/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"Netdeling har ingen internetforbindelse"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"Enheder kan ikke oprette forbindelse"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Deaktiver netdeling"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Hotspot eller netdeling er aktiveret"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Der opkræves muligvis yderligere gebyrer ved roaming"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-de/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-de/strings.xml
new file mode 100644
index 0000000..eb3f8c5
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-de/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"Tethering hat keinen Internetzugriff"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"Geräte können sich nicht verbinden"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Tethering deaktivieren"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Hotspot oder Tethering ist aktiviert"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Für das Roaming können zusätzliche Gebühren anfallen"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-el/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-el/strings.xml
new file mode 100644
index 0000000..56c3d81
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-el/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"Η σύνδεση δεν έχει πρόσβαση στο διαδίκτυο"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"Δεν είναι δυνατή η σύνδεση των συσκευών"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Απενεργοποιήστε τη σύνδεση"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Ενεργό σημείο πρόσβασης Wi-Fi ή ενεργή σύνδεση"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Ενδέχεται να ισχύουν επιπλέον χρεώσεις κατά την περιαγωγή."</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-en-rAU/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-en-rAU/strings.xml
new file mode 100644
index 0000000..dd1a197
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-en-rAU/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"Tethering has no Internet"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"Devices can’t connect"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Turn off tethering"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Hotspot or tethering is on"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Additional charges may apply while roaming"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-en-rCA/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-en-rCA/strings.xml
new file mode 100644
index 0000000..dd1a197
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-en-rCA/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"Tethering has no Internet"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"Devices can’t connect"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Turn off tethering"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Hotspot or tethering is on"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Additional charges may apply while roaming"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-en-rGB/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-en-rGB/strings.xml
new file mode 100644
index 0000000..dd1a197
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-en-rGB/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"Tethering has no Internet"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"Devices can’t connect"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Turn off tethering"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Hotspot or tethering is on"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Additional charges may apply while roaming"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-en-rIN/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-en-rIN/strings.xml
new file mode 100644
index 0000000..dd1a197
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-en-rIN/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"Tethering has no Internet"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"Devices can’t connect"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Turn off tethering"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Hotspot or tethering is on"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Additional charges may apply while roaming"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-en-rXC/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-en-rXC/strings.xml
new file mode 100644
index 0000000..d3347aa
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-en-rXC/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‎‎‎‎‎‏‎‎‏‏‏‏‎‏‎‎‎‎‎‎‏‎‎‎‏‏‎‏‎‏‎‏‏‎‏‏‏‎‎‏‎‏‎‎‎‏‎‎‎Tethering has no internet‎‏‎‎‏‎"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‎‎‏‎‏‎‎‏‎‎‏‏‏‎‏‏‎‏‎‏‎‏‎‎‎‏‎‎‎‎‎‏‏‏‏‎‏‎‎‎‎‏‎‏‏‎‏‏‎‏‎‎‏‏‏‏‏‎Devices can’t connect‎‏‎‎‏‎"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‎‏‏‎‎‏‏‎‎‏‏‏‎‏‎‏‎‎‎‏‏‏‎‎‏‏‏‏‎‎‏‏‏‏‏‏‎‎‎‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‎‎‎Turn off tethering‎‏‎‎‏‎"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‏‏‎‏‏‏‎‎‏‎‎‏‎‏‎‏‏‏‎‏‎‎‏‏‏‏‏‏‎‏‏‏‏‏‏‏‏‎‏‎‎‏‏‏‏‎‏‎‎‎‏‎‎‎‎‏‏‎Hotspot or tethering is on‎‏‎‎‏‎"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‎‏‎‏‏‏‎‏‎‏‎‏‎‎‎‏‎‏‎‏‏‎‏‎‎‎‏‏‏‏‎‎‏‏‏‏‎‎‎‏‎‎‎‎‏‏‎‏‎‏‎‎‏‏‎‎‏‏‎Additional charges may apply while roaming‎‏‎‎‏‎"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-es-rUS/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-es-rUS/strings.xml
new file mode 100644
index 0000000..2f0504f
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-es-rUS/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"La conexión mediante dispositivo móvil no tiene Internet"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"No se pueden conectar los dispositivos"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Desactivar conexión mediante dispositivo móvil"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Se activó el hotspot o la conexión mediante dispositivo móvil"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Es posible que se apliquen cargos adicionales por roaming"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-es/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-es/strings.xml
new file mode 100644
index 0000000..2d8f882
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-es/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"La conexión no se puede compartir, porque no hay acceso a Internet"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"Los dispositivos no se pueden conectar"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Desactivar conexión compartida"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Punto de acceso o conexión compartida activados"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Puede que se apliquen cargos adicionales en itinerancia"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-et/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-et/strings.xml
new file mode 100644
index 0000000..8493c470
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-et/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"Jagamisel puudub internetiühendus"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"Seadmed ei saa ühendust luua"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Lülita jagamine välja"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Kuumkoht või jagamine on sisse lülitatud"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Rändluse kasutamisega võivad kaasneda lisatasud"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-eu/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-eu/strings.xml
new file mode 100644
index 0000000..33bccab
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-eu/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"Konexioa partekatzeko aukerak ez du Interneteko konexiorik"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"Ezin dira konektatu gailuak"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Desaktibatu konexioa partekatzeko aukera"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Wifi-gunea edo konexioa partekatzeko aukera aktibatuta dago"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Baliteke kostu gehigarriak ordaindu behar izatea ibiltaritzan"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-fa/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-fa/strings.xml
new file mode 100644
index 0000000..cf8a0cc
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-fa/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"«اشتراک‌گذاری اینترنت» به اینترنت دسترسی ندارد"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"دستگاه‌ها متصل نمی‌شوند"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"خاموش کردن «اشتراک‌گذاری اینترنت»"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"«نقطه اتصال» یا «اشتراک‌گذاری اینترنت» روشن است"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"ممکن است درحین فراگردی تغییرات دیگر اعمال شود"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-fi/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-fi/strings.xml
new file mode 100644
index 0000000..6a3ab80
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-fi/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"Ei jaettavaa internetyhteyttä"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"Laitteet eivät voi muodostaa yhteyttä"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Laita yhteyden jakaminen pois päältä"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Hotspot tai yhteyden jakaminen on päällä"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Roaming voi aiheuttaa lisämaksuja"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-fr-rCA/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-fr-rCA/strings.xml
new file mode 100644
index 0000000..ffb9bf6
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-fr-rCA/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"Le partage de connexion n\'est pas connecté à Internet"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"Impossible de connecter les appareils"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Désactiver le partage de connexion"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Le point d\'accès ou le partage de connexion est activé"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"En itinérance, des frais supplémentaires peuvent s\'appliquer"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-fr/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-fr/strings.xml
new file mode 100644
index 0000000..768bce3
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-fr/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"Aucune connexion à Internet n\'est disponible pour le partage de connexion"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"Impossible de connecter les appareils"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Désactiver le partage de connexion"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Le point d\'accès ou le partage de connexion est activé"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"En itinérance, des frais supplémentaires peuvent s\'appliquer"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-gl/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-gl/strings.xml
new file mode 100644
index 0000000..0c4195a
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-gl/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"A conexión compartida non ten Internet"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"Non se puideron conectar os dispositivos"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Desactivar conexión compartida"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Está activada a zona wifi ou a conexión compartida"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Pódense aplicar cargos adicionais en itinerancia"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-gu/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-gu/strings.xml
new file mode 100644
index 0000000..e9d33a7
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-gu/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"ઇન્ટરનેટ શેર કરવાની સુવિધામાં ઇન્ટરનેટ નથી"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"ડિવાઇસ કનેક્ટ કરી શકાતા નથી"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"ઇન્ટરનેટ શેર કરવાની સુવિધા બંધ કરો"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"હૉટસ્પૉટ અથવા ઇન્ટરનેટ શેર કરવાની સુવિધા ચાલુ છે"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"રોમિંગમાં વધારાના શુલ્ક લાગી શકે છે"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-hi/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-hi/strings.xml
new file mode 100644
index 0000000..aa418ac
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-hi/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"टेदरिंग से इंटरनेट नहीं चल रहा"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"डिवाइस कनेक्ट नहीं हो पा रहे"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"टेदरिंग बंद करें"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"हॉटस्पॉट या टेदरिंग चालू है"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"रोमिंग के दौरान अतिरिक्त शुल्क लग सकता है"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-hr/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-hr/strings.xml
new file mode 100644
index 0000000..51c524a
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-hr/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"Modemsko povezivanje nema internet"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"Uređaji se ne mogu povezati"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Isključivanje modemskog povezivanja"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Uključena je žarišna točka ili modemsko povezivanje"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"U roamingu su mogući dodatni troškovi"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-hu/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-hu/strings.xml
new file mode 100644
index 0000000..164e45e
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-hu/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"Nincs internetkapcsolat az internet megosztásához"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"Az eszközök nem tudnak csatlakozni"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Internetmegosztás kikapcsolása"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"A hotspot vagy az internetmegosztás be van kapcsolva"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Roaming során további díjak léphetnek fel"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-hy/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-hy/strings.xml
new file mode 100644
index 0000000..e76c0a4
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-hy/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"Մոդեմի ռեժիմի կապը բացակայում է"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"Չհաջողվեց միացնել սարքը"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Անջատել մոդեմի ռեժիմը"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Թեժ կետը կամ մոդեմի ռեժիմը միացված է"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Ռոումինգում կարող են լրացուցիչ վճարներ գանձվել"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-in/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-in/strings.xml
new file mode 100644
index 0000000..2b817f8
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-in/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"Tidak ada koneksi internet di tethering"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"Perangkat tidak dapat terhubung"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Nonaktifkan tethering"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Hotspot atau tethering aktif"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Biaya tambahan mungkin berlaku saat roaming"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-is/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-is/strings.xml
new file mode 100644
index 0000000..a338d9c
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-is/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"Tjóðrun er ekki með internettengingu"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"Tæki geta ekki tengst"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Slökkva á tjóðrun"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Kveikt er á heitum reit eða tjóðrun"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Viðbótargjöld kunna að eiga við í reiki"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-it/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-it/strings.xml
new file mode 100644
index 0000000..77769c2
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-it/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"Nessuna connessione a Internet per il tethering"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"Impossibile connettere i dispositivi"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Disattiva il tethering"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Hotspot o tethering attivi"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Potrebbero essere applicati costi aggiuntivi durante il roaming"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-iw/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-iw/strings.xml
new file mode 100644
index 0000000..5267b51
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-iw/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"אי אפשר להפעיל את תכונת שיתוף האינטרנט בין מכשירים כי אין חיבור לאינטרנט"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"למכשירים אין אפשרות להתחבר"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"השבתה של שיתוף האינטרנט בין מכשירים"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"תכונת הנקודה לשיתוף אינטרנט או תכונת שיתוף האינטרנט בין מכשירים פועלת"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"ייתכנו חיובים נוספים בעת נדידה"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-ja/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-ja/strings.xml
new file mode 100644
index 0000000..66a9a6d
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-ja/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"テザリングがインターネットに接続されていません"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"デバイスを接続できません"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"テザリングを OFF にする"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"アクセス ポイントまたはテザリングが ON です"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"ローミング時に追加料金が発生することがあります"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-ka/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-ka/strings.xml
new file mode 100644
index 0000000..d8ad880
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-ka/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"ტეტერინგს არ აქვს ინტერნეტზე წვდომა"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"მოწყობილობები ვერ ახერხებენ დაკავშირებას"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"ტეტერინგის გამორთვა"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"ჩართულია უსადენო ქსელი ან ტეტერინგი"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"როუმინგის გამოყენებისას შეიძლება ჩამოგეჭრათ დამატებითი საფასური"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-kk/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-kk/strings.xml
new file mode 100644
index 0000000..1ddd6b4
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-kk/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"Тетеринг режимі интернет байланысынсыз пайдаланылуда"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"Құрылғыларды байланыстыру мүмкін емес"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Тетерингіні өшіру"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Хотспот немесе тетеринг қосулы"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Роуминг кезінде қосымша ақы алынуы мүмкін."</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-km/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-km/strings.xml
new file mode 100644
index 0000000..cf5a137
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-km/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"ការភ្ជាប់​មិនមានអ៊ីនធឺណិត​ទេ"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"មិនអាច​ភ្ជាប់ឧបករណ៍​បានទេ"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"បិទការភ្ជាប់"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"ហតស្ប៉ត ឬការភ្ជាប់​ត្រូវបានបើក"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"អាចមាន​ការគិតថ្លៃ​បន្ថែម នៅពេល​រ៉ូមីង"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-kn/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-kn/strings.xml
new file mode 100644
index 0000000..68ae68b
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-kn/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"ಟೆಥರಿಂಗ್‌ ಯಾವುದೇ ಇಂಟರ್ನೆಟ್ ಕನೆಕ್ಷನ್ ಹೊಂದಿಲ್ಲ"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"ಸಾಧನಗಳನ್ನು ಕನೆಕ್ಟ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"ಟೆಥರಿಂಗ್‌ ಆಫ್ ಮಾಡಿ"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"ಹಾಟ್‌ಸ್ಪಾಟ್ ಅಥವಾ ಟೆಥರಿಂಗ್‌ ಆನ್ ಆಗಿದೆ"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"ರೋಮಿಂಗ್‌ನಲ್ಲಿರುವಾಗ ಹೆಚ್ಚುವರಿ ಶುಲ್ಕಗಳು ಅನ್ವಯವಾಗಬಹುದು"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-ko/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-ko/strings.xml
new file mode 100644
index 0000000..17185ba
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-ko/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"테더링으로 인터넷을 사용할 수 없음"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"기기에서 연결할 수 없음"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"테더링 사용 중지"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"핫스팟 또는 테더링 켜짐"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"로밍 중에는 추가 요금이 발생할 수 있습니다."</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-ky/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-ky/strings.xml
new file mode 100644
index 0000000..6a9fb98
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-ky/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"Модем режими Интернети жок колдонулууда"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"Түзмөктөр туташпай жатат"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Модем режимин өчүрүү"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Байланыш түйүнү же модем режими күйүк"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Роумингде кошумча акы алынышы мүмкүн"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-lo/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-lo/strings.xml
new file mode 100644
index 0000000..bcc4b57
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-lo/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"ການປ່ອຍສັນຍານບໍ່ມີອິນເຕີເນັດ"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"ອຸປະກອນບໍ່ສາມາດເຊື່ອມຕໍ່ໄດ້"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"ປິດການປ່ອຍສັນຍານ"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"ເປີດໃຊ້ຮັອດສະປອດ ຫຼື ການປ່ອຍສັນຍານຢູ່"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"ອາດມີຄ່າໃຊ້ຈ່າຍເພີ່ມເຕີມໃນລະຫວ່າງການໂຣມມິງ"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-lt/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-lt/strings.xml
new file mode 100644
index 0000000..011c2c1
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-lt/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"Nėra įrenginio kaip modemo naudojimo interneto ryšio"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"Nepavyko susieti įrenginių"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Išjungti įrenginio kaip modemo naudojimą"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Įjungtas viešosios interneto prieigos taškas arba įrenginio kaip modemo naudojimas"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Veikiant tarptinkliniam ryšiui gali būti taikomi papildomi mokesčiai"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-lv/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-lv/strings.xml
new file mode 100644
index 0000000..5cb2f3b
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-lv/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"Piesaistei nav interneta savienojuma"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"Nevar savienot ierīces"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Izslēgt piesaisti"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Ir ieslēgts tīklājs vai piesaiste"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Viesabonēšanas laikā var tikt piemērota papildu samaksa"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-mk/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-mk/strings.xml
new file mode 100644
index 0000000..4cbfd88
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-mk/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"Нема интернет преку мобилен"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"Уредите не може да се поврзат"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Исклучи интернет преку мобилен"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Точката на пристап или интернетот преку мобилен е вклучен"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"При роаминг може да се наплатат дополнителни трошоци"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-ml/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-ml/strings.xml
new file mode 100644
index 0000000..9cf4eaf
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-ml/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"ടെതറിംഗിന് ഇന്റർനെറ്റ് ഇല്ല"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"ഉപകരണങ്ങൾ കണക്റ്റ് ചെയ്യാനാവില്ല"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"ടെതറിംഗ് ഓഫാക്കുക"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"ഹോട്ട്‌സ്‌പോട്ട് അല്ലെങ്കിൽ ടെതറിംഗ് ഓണാണ്"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"റോമിംഗ് ചെയ്യുമ്പോൾ അധിക നിരക്കുകൾ ബാധകമായേക്കാം"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-mn/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-mn/strings.xml
new file mode 100644
index 0000000..47c82c1
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-mn/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"Модемд интернэт алга байна"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"Төхөөрөмжүүд холбогдох боломжгүй байна"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Модем болгохыг унтраах"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Сүлжээний цэг эсвэл модем болгох асаалттай байна"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Роумингийн үеэр нэмэлт төлбөр нэхэмжилж болзошгүй"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-mr/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-mr/strings.xml
new file mode 100644
index 0000000..ad9e809
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-mr/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"टेदरिंगला इंटरनेट नाही"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"डिव्हाइस कनेक्ट होऊ शकत नाहीत"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"टेदरिंग बंद करा"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"हॉटस्पॉट किंवा टेदरिंग सुरू आहे"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"रोमिंगदरम्यान अतिरिक्त शुल्क लागू होऊ शकतात"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-ms/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-ms/strings.xml
new file mode 100644
index 0000000..e708cb8
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-ms/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"Penambatan tiada Internet"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"Peranti tidak dapat disambungkan"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Matikan penambatan"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Tempat liputan atau penambatan dihidupkan"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Caj tambahan mungkin digunakan semasa perayauan"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-my/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-my/strings.xml
new file mode 100644
index 0000000..ba54622
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-my/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"မိုဘိုင်းဖုန်းသုံး ချိတ်ဆက်မျှဝေခြင်းတွင် အင်တာနက် မရှိပါ"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"စက်များ ချိတ်ဆက်၍ မရပါ"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"မိုဘိုင်းဖုန်းသုံး ချိတ်ဆက်မျှဝေခြင်း ပိတ်ရန်"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"ဟော့စပေါ့ (သို့) မိုဘိုင်းဖုန်းသုံး ချိတ်ဆက်မျှဝေခြင်း ဖွင့်ထားသည်"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"ပြင်ပကွန်ရက်နှင့် ချိတ်ဆက်သည့်အခါ နောက်ထပ်ကျသင့်မှုများ ရှိနိုင်သည်"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-nb/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-nb/strings.xml
new file mode 100644
index 0000000..57db484a2
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-nb/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"Internettdeling har ikke internettilgang"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"Enhetene kan ikke koble til"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Slå av internettdeling"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Wi-Fi-sone eller internettdeling er på"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Ytterligere kostnader kan påløpe under roaming"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-ne/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-ne/strings.xml
new file mode 100644
index 0000000..617c50d
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-ne/strings.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- no translation found for no_upstream_notification_title (611650570559011140) -->
+    <skip />
+    <!-- no translation found for no_upstream_notification_message (6508394877641864863) -->
+    <skip />
+    <!-- no translation found for no_upstream_notification_disable_button (7609346639290990508) -->
+    <skip />
+    <!-- no translation found for upstream_roaming_notification_title (6032901176124830787) -->
+    <skip />
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"रोमिङ सेवा प्रयोग गर्दा अतिरिक्त शुल्क लाग्न सक्छ"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-nl/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-nl/strings.xml
new file mode 100644
index 0000000..b08133f
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-nl/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"Tethering heeft geen internet"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"Apparaten kunnen niet worden verbonden"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Tethering uitschakelen"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Hotspot of tethering is ingeschakeld"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Er kunnen extra kosten voor roaming in rekening worden gebracht."</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-or/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-or/strings.xml
new file mode 100644
index 0000000..1ad4ca3
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-or/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"ଟିଥରିଂ ପାଇଁ କୌଣସି ଇଣ୍ଟର୍ନେଟ୍ ସଂଯୋଗ ନାହିଁ"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"ଡିଭାଇସଗୁଡ଼ିକ ସଂଯୋଗ କରାଯାଇପାରିବ ନାହିଁ"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"ଟିଥରିଂ ବନ୍ଦ କରନ୍ତୁ"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"ହଟସ୍ପଟ୍ କିମ୍ବା ଟିଥରିଂ ଚାଲୁ ଅଛି"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"ରୋମିଂରେ ଥିବା ସମୟରେ ଅତିରିକ୍ତ ଶୁଳ୍କ ଲାଗୁ ହୋଇପାରେ"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-pa/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-pa/strings.xml
new file mode 100644
index 0000000..88def56
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-pa/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"ਟੈਦਰਿੰਗ ਕੋਲ ਇੰਟਰਨੈੱਟ ਪਹੁੰਚ ਨਹੀਂ ਹੈ"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"ਡੀਵਾਈਸ ਕਨੈਕਟ ਨਹੀਂ ਕੀਤੇ ਜਾ ਸਕਦੇ"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"ਟੈਦਰਿੰਗ ਬੰਦ ਕਰੋ"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"ਹੌਟਸਪੌਟ ਜਾਂ ਟੈਦਰਿੰਗ ਚਾਲੂ ਹੈ"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"ਰੋਮਿੰਗ ਦੌਰਾਨ ਵਧੀਕ ਖਰਚੇ ਲਾਗੂ ਹੋ ਸਕਦੇ ਹਨ"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-pl/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-pl/strings.xml
new file mode 100644
index 0000000..f9890ab
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-pl/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"Tethering nie ma internetu"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"Urządzenia nie mogą się połączyć"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Wyłącz tethering"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Hotspot lub tethering jest włączony"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Podczas korzystania z roamingu mogą zostać naliczone dodatkowe opłaty"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-pt-rBR/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-pt-rBR/strings.xml
new file mode 100644
index 0000000..ce3b884
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-pt-rBR/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"O tethering não tem Internet"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"Não é possível conectar os dispositivos"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Desativar o tethering"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Ponto de acesso ou tethering ativado"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Pode haver cobranças extras durante o roaming"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-pt-rPT/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-pt-rPT/strings.xml
new file mode 100644
index 0000000..7e883ea
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-pt-rPT/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"A ligação (à Internet) via telemóvel não tem Internet"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"Não é possível ligar os dispositivos"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Desativar ligação (à Internet) via telemóvel"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"A zona Wi-Fi ou a ligação (à Internet) via telemóvel está ativada"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Podem aplicar-se custos adicionais em roaming."</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-pt/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-pt/strings.xml
new file mode 100644
index 0000000..ce3b884
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-pt/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"O tethering não tem Internet"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"Não é possível conectar os dispositivos"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Desativar o tethering"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Ponto de acesso ou tethering ativado"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Pode haver cobranças extras durante o roaming"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-ro/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-ro/strings.xml
new file mode 100644
index 0000000..1009417
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-ro/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"Procesul de tethering nu are internet"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"Dispozitivele nu se pot conecta"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Dezactivați procesul de tethering"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"S-a activat hotspotul sau tethering"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Se pot aplica taxe suplimentare pentru roaming"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-ru/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-ru/strings.xml
new file mode 100644
index 0000000..88683be
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-ru/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"Режим модема используется без доступа к Интернету"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"Невозможно подключить устройства."</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Отключить режим модема"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Включены точка доступа или режим модема"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"За использование услуг связи в роуминге может взиматься дополнительная плата."</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-si/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-si/strings.xml
new file mode 100644
index 0000000..176bcdb
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-si/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"ටෙදරින් හට අන්තර්ජාලය නැත"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"උපාංගවලට සම්බන්ධ විය නොහැකිය"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"ටෙදරින් ක්‍රියාවිරහිත කරන්න"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"හොට්ස්පොට් හෝ ටෙදරින් ක්‍රියාත්මකයි"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"රෝමිං අතරතුර අමතර ගාස්තු අදාළ විය හැකිය"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-sk/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-sk/strings.xml
new file mode 100644
index 0000000..b9e2127
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-sk/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"Tethering nemá internetové pripojenie"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"Zariadenia sa nemôžu pripojiť"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Vypnúť tethering"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Je zapnutý hotspot alebo tethering"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Počas roamingu vám môžu byť účtované ďalšie poplatky"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-sl/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-sl/strings.xml
new file mode 100644
index 0000000..e8140e6
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-sl/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"Internetna povezava prek mobilnega telefona ni vzpostavljena"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"Napravi se ne moreta povezati"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Izklopi internetno povezavo prek mobilnega telefona"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Dostopna točka ali internetna povezava prek mobilnega telefona je vklopljena"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Med gostovanjem lahko nastanejo dodatni stroški"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-sq/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-sq/strings.xml
new file mode 100644
index 0000000..61e698d
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-sq/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"Ndarja e internetit nuk ka internet"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"Pajisjet nuk mund të lidhen"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Çaktivizo ndarjen e internetit"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Zona e qasjes për internet ose ndarja e internetit është aktive"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Mund të zbatohen tarifime shtesë kur je në roaming"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-sr/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-sr/strings.xml
new file mode 100644
index 0000000..b4c411c
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-sr/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"Привезивање нема приступ интернету"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"Повезивање уређаја није успело"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Искључи привезивање"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Укључен је хотспот или привезивање"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Можда важе додатни трошкови у ромингу"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-sv/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-sv/strings.xml
new file mode 100644
index 0000000..4f543e4
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-sv/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"Det finns ingen internetanslutning för internetdelningen"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"Enheterna kan inte anslutas"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Inaktivera internetdelning"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Surfzon eller internetdelning har aktiverats"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Ytterligare avgifter kan tillkomma vid roaming"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-sw/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-sw/strings.xml
new file mode 100644
index 0000000..ac347ab
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-sw/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"Kipengele cha kusambaza mtandao hakina intaneti"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"Imeshindwa kuunganisha vifaa"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Zima kipengele cha kusambaza mtandao"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Umewasha kipengele cha kusambaza mtandao au mtandao pepe"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Huenda ukatozwa gharama za ziada ukitumia mitandao ya ng\'ambo"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-ta/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-ta/strings.xml
new file mode 100644
index 0000000..0e43759
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-ta/strings.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- no translation found for no_upstream_notification_title (611650570559011140) -->
+    <skip />
+    <!-- no translation found for no_upstream_notification_message (6508394877641864863) -->
+    <skip />
+    <!-- no translation found for no_upstream_notification_disable_button (7609346639290990508) -->
+    <skip />
+    <!-- no translation found for upstream_roaming_notification_title (6032901176124830787) -->
+    <skip />
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"ரோமிங்கின்போது கூடுதல் கட்டணங்கள் விதிக்கப்படக்கூடும்"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-te/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-te/strings.xml
new file mode 100644
index 0000000..9360297
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-te/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"టెథరింగ్ చేయడానికి ఇంటర్నెట్ కనెక్షన్ లేదు"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"పరికరాలు కనెక్ట్ అవ్వడం లేదు"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"టెథరింగ్‌ను ఆఫ్ చేయండి"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"హాట్‌స్పాట్ లేదా టెథరింగ్ ఆన్‌లో ఉంది"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"రోమింగ్‌లో ఉన్నప్పుడు అదనపు ఛార్జీలు వర్తించవచ్చు"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-th/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-th/strings.xml
new file mode 100644
index 0000000..9c4d7e0
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-th/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"การเชื่อมต่ออินเทอร์เน็ตผ่านมือถือไม่มีอินเทอร์เน็ต"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"อุปกรณ์เชื่อมต่อไม่ได้"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"ปิดการเชื่อมต่ออินเทอร์เน็ตผ่านมือถือ"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"ฮอตสปอตหรือการเชื่อมต่ออินเทอร์เน็ตผ่านมือถือเปิดอยู่"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"อาจมีค่าใช้จ่ายเพิ่มเติมขณะโรมมิ่ง"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-tl/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-tl/strings.xml
new file mode 100644
index 0000000..a7c78a5
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-tl/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"Walang internet ang pag-tether"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"Hindi makakonekta ang mga device"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"I-off ang pag-tether"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Naka-on ang Hotspot o pag-tether"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Posibleng magkaroon ng mga karagdagang singil habang nagro-roam"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-tr/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-tr/strings.xml
new file mode 100644
index 0000000..93da2c3
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-tr/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"Tethering\'in internet bağlantısı yok"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"Cihazlar bağlanamıyor"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Tethering\'i kapat"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Hotspot veya tethering açık"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Dolaşım sırasında ek ücretler uygulanabilir"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-uk/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-uk/strings.xml
new file mode 100644
index 0000000..ee0dcd2
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-uk/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"Телефон, який використовується як модем, не підключений до Інтернету"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"Не вдається підключити пристрої"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Вимкнути використання телефона як модема"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Увімкнено точку доступу або використання телефона як модема"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"У роумінгу може стягуватися додаткова плата"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-ur/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-ur/strings.xml
new file mode 100644
index 0000000..41cd28e
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-ur/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"ٹیدرنگ میں انٹرنیٹ نہیں ہے"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"آلات منسلک نہیں ہو سکتے"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"ٹیدرنگ آف کریں"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"ہاٹ اسپاٹ یا ٹیدرنگ آن ہے"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"رومنگ کے دوران اضافی چارجز لاگو ہو سکتے ہیں"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-uz/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-uz/strings.xml
new file mode 100644
index 0000000..c847bc9
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-uz/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"Modem internetga ulanmagan"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"Qurilmalar ulanmadi"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Modem rejimini faolsizlantirish"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Hotspot yoki modem rejimi yoniq"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Rouming vaqtida qoʻshimcha haq olinishi mumkin"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-vi/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-vi/strings.xml
new file mode 100644
index 0000000..a74326f
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-vi/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"Không có Internet để chia sẻ kết Internet"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"Các thiết bị không thể kết nối"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Tắt tính năng chia sẻ Internet"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Điểm phát sóng hoặc tính năng chia sẻ Internet đang bật"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Bạn có thể mất thêm phí dữ liệu khi chuyển vùng"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-zh-rCN/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-zh-rCN/strings.xml
new file mode 100644
index 0000000..d737003
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-zh-rCN/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"共享网络未连接到互联网"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"设备无法连接"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"关闭网络共享"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"热点或网络共享已开启"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"漫游时可能会产生额外的费用"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-zh-rHK/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-zh-rHK/strings.xml
new file mode 100644
index 0000000..f378a9d
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-zh-rHK/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"無法透過網絡共享連線至互聯網"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"裝置無法連接"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"關閉網絡共享"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"熱點或網絡共享已開啟"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"漫遊時可能需要支付額外費用"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-zh-rTW/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-zh-rTW/strings.xml
new file mode 100644
index 0000000..ea01b94
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-zh-rTW/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"無法透過數據連線連上網際網路"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"裝置無法連線"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"關閉數據連線"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"無線基地台或數據連線已開啟"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"使用漫遊服務可能須支付額外費用"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480-zu/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-zu/strings.xml
new file mode 100644
index 0000000..32f6df5
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480-zu/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="no_upstream_notification_title" msgid="611650570559011140">"Ukusebenzisa ifoni njengemodemu akunayo i-inthanethi"</string>
+    <string name="no_upstream_notification_message" msgid="6508394877641864863">"Amadivayisi awakwazi ukuxhumeka"</string>
+    <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Vala ukusebenzisa ifoni njengemodemu"</string>
+    <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"I-hotspot noma ukusebenzisa ifoni njengemodemu kuvuliwe"</string>
+    <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Kungaba nezinkokhelo ezengeziwe uma uzula"</string>
+</resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc480/config.xml b/packages/Tethering/res/values-mcc311-mnc480/config.xml
new file mode 100644
index 0000000..5c5be04
--- /dev/null
+++ b/packages/Tethering/res/values-mcc311-mnc480/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources>
+    <!-- Delay(millisecond) to show no upstream notification after there's no Backhaul. Set delay to
+         "0" for disable this feature. -->
+    <integer name="delay_to_show_no_upstream_after_no_backhaul">5000</integer>
+
+    <!-- Config for showing upstream roaming notification. -->
+    <bool name="config_upstream_roaming_notification">true</bool>
+</resources>
\ No newline at end of file
diff --git a/packages/Tethering/res/values-mcc311-mnc480/strings.xml b/packages/Tethering/res/values-mcc311-mnc480/strings.xml
index a996b42..ce9ff60 100644
--- a/packages/Tethering/res/values-mcc311-mnc480/strings.xml
+++ b/packages/Tethering/res/values-mcc311-mnc480/strings.xml
@@ -15,16 +15,14 @@
 -->
 <resources>
     <!-- String for no upstream notification title [CHAR LIMIT=200] -->
-    <string name="no_upstream_notification_title">Hotspot has no internet</string>
+    <string name="no_upstream_notification_title">Tethering has no internet</string>
     <!-- String for no upstream notification title [CHAR LIMIT=200] -->
-    <string name="no_upstream_notification_message">Devices can\u2019t connect to internet</string>
-    <!-- String for cellular roaming notification disable button [CHAR LIMIT=200]  -->
-    <string name="no_upstream_notification_disable_button">Turn off hotspot</string>
+    <string name="no_upstream_notification_message">Devices can\u2019t connect</string>
+    <!-- String for no upstream notification disable button [CHAR LIMIT=200] -->
+    <string name="no_upstream_notification_disable_button">Turn off tethering</string>
 
-    <!-- String for cellular roaming notification title [CHAR LIMIT=200]  -->
-    <string name="upstream_roaming_notification_title">Hotspot is on</string>
-    <!-- String for cellular roaming notification message [CHAR LIMIT=500]  -->
+    <!-- String for cellular roaming notification title [CHAR LIMIT=200] -->
+    <string name="upstream_roaming_notification_title">Hotspot or tethering is on</string>
+    <!-- String for cellular roaming notification message [CHAR LIMIT=500] -->
     <string name="upstream_roaming_notification_message">Additional charges may apply while roaming</string>
-    <!-- String for cellular roaming notification continue button [CHAR LIMIT=200]  -->
-    <string name="upstream_roaming_notification_continue_button">Continue</string>
 </resources>
diff --git a/packages/Tethering/res/values-mcc311-mnc490/strings.xml b/packages/Tethering/res/values-mcc311-mnc490/strings.xml
deleted file mode 100644
index 618df90..0000000
--- a/packages/Tethering/res/values-mcc311-mnc490/strings.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2020 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- String for tethered notification title with client number info. -->
-    <plurals name="tethered_notification_title_with_client_number">
-        <item quantity="one"><xliff:g>%1$d</xliff:g> device connected.</item>
-        <item quantity="other"><xliff:g>%1$d</xliff:g> devices connected.</item>
-    </plurals>
-</resources>
\ No newline at end of file
diff --git a/packages/Tethering/res/values-mcc312-mnc530/strings.xml b/packages/Tethering/res/values-mcc312-mnc530/strings.xml
deleted file mode 100644
index 618df90..0000000
--- a/packages/Tethering/res/values-mcc312-mnc530/strings.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2020 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- String for tethered notification title with client number info. -->
-    <plurals name="tethered_notification_title_with_client_number">
-        <item quantity="one"><xliff:g>%1$d</xliff:g> device connected.</item>
-        <item quantity="other"><xliff:g>%1$d</xliff:g> devices connected.</item>
-    </plurals>
-</resources>
\ No newline at end of file
diff --git a/packages/Tethering/res/values-mk/strings.xml b/packages/Tethering/res/values-mk/strings.xml
index 0fab8aa..9ad9b9a 100644
--- a/packages/Tethering/res/values-mk/strings.xml
+++ b/packages/Tethering/res/values-mk/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"Поврзувањето или точката на пристап се активни"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"Допрете за поставување."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"Врзувањето е оневозможено"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"Контактирајте со администраторот за детали"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"Активно е врзување или точка на пристап"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"Допрете за поставување."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"Врзувањето е оневозможено"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"Контактирајте со администраторот за детали"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Статус на точката на пристап и врзувањето"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-ml/strings.xml b/packages/Tethering/res/values-ml/strings.xml
index fd7e556..9db79ce 100644
--- a/packages/Tethering/res/values-ml/strings.xml
+++ b/packages/Tethering/res/values-ml/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"ടെതറിംഗ് അല്ലെങ്കിൽ ഹോട്ട്സ്‌പോട്ട് സജീവമാണ്"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"സജ്ജമാക്കാൻ ടാപ്പുചെയ്യുക."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"ടെതറിംഗ് പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"വിശദവിവരങ്ങൾക്ക് നിങ്ങളുടെ അഡ്മിനെ ബന്ധപ്പെടുക"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"ടെതറിംഗ് അല്ലെങ്കിൽ ഹോട്ട്സ്‌പോട്ട് സജീവമാണ്"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"സജ്ജീകരിക്കാൻ ടാപ്പ് ചെയ്യുക."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"ടെതറിംഗ് പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"വിശദാംശങ്ങൾക്ക് നിങ്ങളുടെ അഡ്മിനെ ബന്ധപ്പെടുക"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"ഹോട്ട്‌സ്പോട്ടിന്റെയും ടെതറിംഗിന്റെയും നില"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-mn/strings.xml b/packages/Tethering/res/values-mn/strings.xml
index 4596577..42d1edb 100644
--- a/packages/Tethering/res/values-mn/strings.xml
+++ b/packages/Tethering/res/values-mn/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"Модем болгох эсвэл идэвхтэй цэг болгох"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"Тохируулахын тулд товшино уу."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"Модем болгох боломжгүй байна"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"Дэлгэрэнгүй мэдээлэл авахын тулд админтайгаа холбогдоно уу"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"Модем болгох эсвэл сүлжээний цэг идэвхтэй байна"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"Тохируулахын тулд товшино уу."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"Модем болгохыг идэвхгүй болгосон"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"Дэлгэрэнгүй мэдээлэл авахын тулд админтайгаа холбогдоно уу"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Сүлжээний цэг болон модем болгох төлөв"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-mr/strings.xml b/packages/Tethering/res/values-mr/strings.xml
index 85c9ade..13995b6 100644
--- a/packages/Tethering/res/values-mr/strings.xml
+++ b/packages/Tethering/res/values-mr/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"टेदरिंग किंवा हॉटस्पॉट सक्रिय"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"सेट करण्यासाठी टॅप करा."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"टेदरिंग बंद आहे"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"तपशीलांसाठी तुमच्या प्रशासकाशी संपर्क साधा"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"टेदरिंग किंवा हॉटस्पॉट अ‍ॅक्टिव्ह आहे"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"सेट करण्यासाठी टॅप करा."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"टेदरिंग बंद केले आहे"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"तपशीलांसाठी तुमच्या ॲडमिनशी संपर्क साधा"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"हॉटस्पॉट आणि टेदरिंगची स्थिती"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-ms/strings.xml b/packages/Tethering/res/values-ms/strings.xml
index ec6bdbd..d6a67f3 100644
--- a/packages/Tethering/res/values-ms/strings.xml
+++ b/packages/Tethering/res/values-ms/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"Penambatan atau titik panas aktif"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"Ketik untuk membuat persediaan."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"Penambatan dilumpuhkan"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"Hubungi pentadbir anda untuk maklumat lanjut"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"Penambatan atau tempat liputan aktif"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"Ketik untuk membuat persediaan."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"Penambatan dilumpuhkan"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"Hubungi pentadbir anda untuk mendapatkan maklumat lanjut"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Status tempat liputan &amp; penambatan"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-my/strings.xml b/packages/Tethering/res/values-my/strings.xml
index 83978b6..49f6b88 100644
--- a/packages/Tethering/res/values-my/strings.xml
+++ b/packages/Tethering/res/values-my/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"တဆင့်ပြန်လည်လွှင့်ခြင်း သို့မဟုတ် ဟော့စပေါ့ ဖွင့်ထားသည်"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"စနစ်ထည့်သွင်းရန် တို့ပါ။"</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"မိုဘိုင်းဖုန်းကို မိုဒမ်အဖြစ်သုံးခြင်းအား ပိတ်ထားသည်"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"အသေးစိတ်အချက်အလက်များအတွက် သင့်စီမံခန့်ခွဲသူကို ဆက်သွယ်ပါ"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"မိုဘိုင်းဖုန်းသုံး ချိတ်ဆက်မျှဝေခြင်း သို့မဟုတ် ဟော့စပေါ့ ဖွင့်ထားသည်"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"စနစ်ထည့်သွင်းရန် တို့ပါ။"</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"မိုဘိုင်းဖုန်းသုံး ချိတ်ဆက်မျှဝေခြင်းကို ပိတ်ထားသည်"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"အသေးစိတ်အတွက် သင့်စီမံခန့်ခွဲသူကို ဆက်သွယ်ပါ"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"ဟော့စပေါ့နှင့် မိုဘိုင်းဖုန်းသုံး ချိတ်ဆက်မျှဝေခြင်း အခြေအနေ"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-nb/strings.xml b/packages/Tethering/res/values-nb/strings.xml
index 9abf32d..9594e0a 100644
--- a/packages/Tethering/res/values-nb/strings.xml
+++ b/packages/Tethering/res/values-nb/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"Internettdeling eller trådløs sone er aktiv"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"Trykk for å konfigurere."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"Internettdeling er slått av"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"Ta kontakt med administratoren din for å få mer informasjon"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"Internettdeling eller Wi-Fi-sone er aktiv"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"Trykk for å konfigurere."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"Internettdeling er slått av"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"Ta kontakt med administratoren din for å få mer informasjon"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Status for Wi-Fi-sone og internettdeling"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-ne/strings.xml b/packages/Tethering/res/values-ne/strings.xml
index c886929..72ae3a8 100644
--- a/packages/Tethering/res/values-ne/strings.xml
+++ b/packages/Tethering/res/values-ne/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"टेथर गर्ने वा हटस्पट सक्रिय"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"सेटअप गर्न ट्याप गर्नुहोस्।"</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"टेदरिङलाई असक्षम पारिएको छ"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"विवरणहरूका लागि आफ्ना प्रशासकलाई सम्पर्क गर्नुहोस्"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"टेदरिङ वा हटस्पट सक्रिय छ"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"सेटअप गर्न ट्याप गर्नुहोस्।"</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"टेदरिङ सुविधा असक्षम पारिएको छ"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"विवरणहरूका लागि आफ्ना प्रशासकलाई सम्पर्क गर्नुहोस्"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"हटस्पट तथा टेदरिङको स्थिति"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-nl/strings.xml b/packages/Tethering/res/values-nl/strings.xml
index 0ec4bff6..18b2bbf 100644
--- a/packages/Tethering/res/values-nl/strings.xml
+++ b/packages/Tethering/res/values-nl/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"Tethering of hotspot actief"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"Tik om in te stellen."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"Tethering is uitgeschakeld"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"Neem contact op met je beheerder voor meer informatie"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"Tethering of hotspot actief"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"Tik om in te stellen."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"Tethering is uitgeschakeld"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"Neem contact op met je beheerder voor meer informatie"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Status van hotspot en tethering"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-or/strings.xml b/packages/Tethering/res/values-or/strings.xml
index 4576857..a15a6db 100644
--- a/packages/Tethering/res/values-or/strings.xml
+++ b/packages/Tethering/res/values-or/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"ଟିଥରିଙ୍ଗ କିମ୍ୱା ହଟସ୍ପଟ୍‌ ସକ୍ରିୟ ଅଛି"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"ସେଟଅପ୍‍ କରିବାକୁ ଟାପ୍‍ କରନ୍ତୁ।"</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"ଟିଥରିଙ୍ଗ ଅକ୍ଷମ କରାଯାଇଛି"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"ବିବରଣୀ ପାଇଁ ନିଜ ଆଡମିନ୍‌ଙ୍କ ସହ ଯୋଗାଯୋଗ କରନ୍ତୁ"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"ଟିଥେରିଂ କିମ୍ୱା ହଟସ୍ପଟ୍ ସକ୍ରିୟ ଅଛି"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"ସେଟ୍ ଅପ୍ କରିବାକୁ ଟାପ୍ କରନ୍ତୁ।"</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"ଟିଥେରିଂ ଅକ୍ଷମ କରାଯାଇଛି"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"ବିବରଣୀଗୁଡ଼ିକ ପାଇଁ ଆପଣଙ୍କ ଆଡମିନଙ୍କ ସହ ଯୋଗାଯୋଗ କରନ୍ତୁ"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"ହଟସ୍ପଟ୍ ଓ ଟିଥେରିଂ ସ୍ଥିତି"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-pa/strings.xml b/packages/Tethering/res/values-pa/strings.xml
index deddf2e..a8235e4 100644
--- a/packages/Tethering/res/values-pa/strings.xml
+++ b/packages/Tethering/res/values-pa/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"ਟੈਦਰਿੰਗ ਜਾਂ ਹੌਟਸਪੌਟ ਕਿਰਿਆਸ਼ੀਲ"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"ਸਥਾਪਤ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।"</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"ਟੈਦਰਿੰਗ ਨੂੰ ਅਯੋਗ ਬਣਾਇਆ ਗਿਆ ਹੈ"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"ਵੇਰਵਿਆਂ ਲਈ ਆਪਣੇ ਪ੍ਰਸ਼ਾਸਕ ਨੂੰ ਸੰਪਰਕ ਕਰੋ"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"ਟੈਦਰਿੰਗ ਜਾਂ ਹੌਟਸਪੌਟ ਕਿਰਿਆਸ਼ੀਲ"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"ਸੈੱਟਅੱਪ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।"</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"ਟੈਦਰਿੰਗ ਨੂੰ ਬੰਦ ਕੀਤਾ ਗਿਆ ਹੈ"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"ਵੇਰਵਿਆਂ ਲਈ ਆਪਣੇ ਪ੍ਰਸ਼ਾਸਕ ਨਾਲ ਸੰਪਰਕ ਕਰੋ"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"ਹੌਟਸਪੌਟ ਅਤੇ ਟੈਦਰਿੰਗ ਦੀ ਸਥਿਤੀ"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-pl/strings.xml b/packages/Tethering/res/values-pl/strings.xml
index 48d8468..ccb017d 100644
--- a/packages/Tethering/res/values-pl/strings.xml
+++ b/packages/Tethering/res/values-pl/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"Aktywny tethering lub punkt dostępu"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"Kliknij, by skonfigurować."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"Tethering został wyłączony"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"Aby uzyskać szczegółowe informacje, skontaktuj się z administratorem"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"Aktywny tethering lub punkt dostępu"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"Kliknij, by skonfigurować"</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"Tethering został wyłączony"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"Aby uzyskać szczegółowe informacje, skontaktuj się z administratorem"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Hotspot i tethering – stan"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-pt-rBR/strings.xml b/packages/Tethering/res/values-pt-rBR/strings.xml
index 32c22b8..a0a4745 100644
--- a/packages/Tethering/res/values-pt-rBR/strings.xml
+++ b/packages/Tethering/res/values-pt-rBR/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"Ponto de acesso ou tethering ativo"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"Toque para configurar."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"Tethering desativado"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"Fale com seu administrador para saber detalhes"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"Ponto de acesso ou tethering ativo"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"Toque para configurar."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"Tethering desativado"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"Fale com seu administrador para saber detalhes"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Status de ponto de acesso e tethering"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-pt-rPT/strings.xml b/packages/Tethering/res/values-pt-rPT/strings.xml
index 641e22f..e3f03fc 100644
--- a/packages/Tethering/res/values-pt-rPT/strings.xml
+++ b/packages/Tethering/res/values-pt-rPT/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"Ligação ponto a ponto ou hotspot activos"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"Toque para configurar."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"A ligação (à Internet) via telemóvel está desativada."</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"Contacte o gestor para obter detalhes."</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"Ligação (à Internet) via telemóvel ou zona Wi-Fi ativas"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"Toque para configurar."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"A ligação (à Internet) via telemóvel está desativada."</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"Contacte o administrador para obter detalhes."</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Estado da zona Wi-Fi e da ligação (à Internet) via telemóvel"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-pt/strings.xml b/packages/Tethering/res/values-pt/strings.xml
index 32c22b8..a0a4745 100644
--- a/packages/Tethering/res/values-pt/strings.xml
+++ b/packages/Tethering/res/values-pt/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"Ponto de acesso ou tethering ativo"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"Toque para configurar."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"Tethering desativado"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"Fale com seu administrador para saber detalhes"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"Ponto de acesso ou tethering ativo"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"Toque para configurar."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"Tethering desativado"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"Fale com seu administrador para saber detalhes"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Status de ponto de acesso e tethering"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-ro/strings.xml b/packages/Tethering/res/values-ro/strings.xml
index f861f73..5706a4a 100644
--- a/packages/Tethering/res/values-ro/strings.xml
+++ b/packages/Tethering/res/values-ro/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"Tethering sau hotspot activ"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"Atingeți ca să configurați."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"Tetheringul este dezactivat"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"Contactați administratorul pentru detalii"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"Tethering sau hotspot activ"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"Atingeți ca să configurați."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"Tetheringul este dezactivat"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"Contactați administratorul pentru detalii"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Starea hotspotului și a tetheringului"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-ru/strings.xml b/packages/Tethering/res/values-ru/strings.xml
index 027cb41..7cb6f7d 100644
--- a/packages/Tethering/res/values-ru/strings.xml
+++ b/packages/Tethering/res/values-ru/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"Включен режим модема"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"Нажмите, чтобы настроить."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"Включить режим модема нельзя"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"Обратитесь к администратору, чтобы узнать подробности."</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"Включен режим модема или точка доступа"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"Нажмите, чтобы настроить."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"Использование телефона в качестве модема запрещено"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"Чтобы узнать подробности, обратитесь к администратору."</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Статус хот-спота и режима модема"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-si/strings.xml b/packages/Tethering/res/values-si/strings.xml
index 7d8599f..ec34c22 100644
--- a/packages/Tethering/res/values-si/strings.xml
+++ b/packages/Tethering/res/values-si/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"ටෙදරින් හෝ හොට්ස්පොට් සක්‍රීයයි"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"පිහිටුවීමට තට්ටු කරන්න."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"ටෙදරින් අබල කර ඇත"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"විස්තර සඳහා ඔබගේ පරිපාලක අමතන්න"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"ටෙදරින් හෝ හොට්ස්පොට් සක්‍රීයයි"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"පිහිටුවීමට තට්ටු කරන්න."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"ටෙදරින් අබල කර ඇත"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"විස්තර සඳහා ඔබගේ පරිපාලක අමතන්න"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"හොට්ස්පොට් &amp; ටෙදරින් තත්ත්වය"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-sk/strings.xml b/packages/Tethering/res/values-sk/strings.xml
index a8fe297..43e787c 100644
--- a/packages/Tethering/res/values-sk/strings.xml
+++ b/packages/Tethering/res/values-sk/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"Tethering alebo prístupový bod je aktívny"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"Klepnutím prejdete na nastavenie."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"Tethering je deaktivovaný"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"O podrobnosti požiadajte svojho správcu"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"Tethering alebo prístupový bod je aktívny"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"Klepnutím prejdete na nastavenie."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"Tethering je deaktivovaný"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"O podrobnosti požiadajte svojho správcu"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Stav hotspotu a tetheringu"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-sl/strings.xml b/packages/Tethering/res/values-sl/strings.xml
index b5e5e38..5943362 100644
--- a/packages/Tethering/res/values-sl/strings.xml
+++ b/packages/Tethering/res/values-sl/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"Aktivna povezava z internetom ali dostopna točka sta aktivni"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"Dotaknite se, če želite nastaviti."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"Povezava z internetom prek mobilnega telefona je onemogočena"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"Za podrobnosti se obrnite na skrbnika"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"Povezava z internetom prek mobilnega telefona ali dostopna točka je aktivna"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"Dotaknite se, če želite nastaviti."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"Povezava z internetom prek mobilnega telefona je onemogočena"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"Za podrobnosti se obrnite na skrbnika"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Stanje dostopne točke in povezave z internetom prek mobilnega telefona"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-sq/strings.xml b/packages/Tethering/res/values-sq/strings.xml
index fdd4906..21e1155 100644
--- a/packages/Tethering/res/values-sq/strings.xml
+++ b/packages/Tethering/res/values-sq/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"Lidhja e çiftimit ose ajo e qasjes në zona publike interneti është aktive"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"Trokit për ta konfiguruar."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"Lidhja e çiftimit është çaktivizuar"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"Kontakto me administratorin për detaje"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"Ndarja e internetit ose zona e qasjes së internetit është aktive"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"Trokit për ta konfiguruar."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"Ndarja e internetit është çaktivizuar"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"Kontakto me administratorin për detaje"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Statusi i zonës së qasjes dhe ndarjes së internetit"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-sr/strings.xml b/packages/Tethering/res/values-sr/strings.xml
index 9fab34589..e2e4dc6 100644
--- a/packages/Tethering/res/values-sr/strings.xml
+++ b/packages/Tethering/res/values-sr/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"Активно повезивање са интернетом преко мобилног уређаја или хотспот"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"Додирните да бисте подесили."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"Привезивање је онемогућено"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"Потражите детаље од администратора"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"Привезивање или хотспот је активан"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"Додирните да бисте подесили."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"Привезивање је онемогућено"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"Потражите детаље од администратора"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Статус хотспота и привезивања"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-sv/strings.xml b/packages/Tethering/res/values-sv/strings.xml
index 10eeb0f..72702c2 100644
--- a/packages/Tethering/res/values-sv/strings.xml
+++ b/packages/Tethering/res/values-sv/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"Internetdelning eller surfzon aktiverad"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"Tryck om du vill konfigurera."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"Internetdelning har inaktiverats"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"Kontakta administratören om du vill veta mer"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"Internetdelning eller surfzon har aktiverats"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"Tryck om du vill konfigurera."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"Internetdelning har inaktiverats"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"Kontakta administratören om du vill veta mer"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Trådlös surfzon och internetdelning har inaktiverats"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-sw/strings.xml b/packages/Tethering/res/values-sw/strings.xml
index 3353963..65e4aa8ce 100644
--- a/packages/Tethering/res/values-sw/strings.xml
+++ b/packages/Tethering/res/values-sw/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"Kushiriki au kusambaza intaneti kumewashwa"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"Gusa ili uweke mipangilio."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"Umezima kipengele cha kusambaza mtandao"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"Wasiliana na msimamizi wako ili upate maelezo zaidi"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"Kusambaza mtandao au mtandaopepe umewashwa"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"Gusa ili uweke mipangilio."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"Umezima kipengele cha kusambaza mtandao"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"Wasiliana na msimamizi wako ili upate maelezo zaidi"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Mtandaopepe na hali ya kusambaza mtandao"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-ta/strings.xml b/packages/Tethering/res/values-ta/strings.xml
index b1e5cc2..4aba62d 100644
--- a/packages/Tethering/res/values-ta/strings.xml
+++ b/packages/Tethering/res/values-ta/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"டெதெரிங்/ஹாட்ஸ்பாட் இயங்குகிறது"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"அமைக்க, தட்டவும்."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"இணைப்பு முறை முடக்கப்பட்டுள்ளது"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"விவரங்களுக்கு, உங்கள் நிர்வாகியைத் தொடர்புகொள்ளவும்"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"டெதெரிங் அல்லது ஹாட்ஸ்பாட் இயங்குகிறது"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"அமைக்க, தட்டவும்."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"டெதெரிங் முடக்கப்பட்டுள்ளது"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"விவரங்களுக்கு உங்கள் நிர்வாகியைத் தொடர்புகொள்ளவும்"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"ஹாட்ஸ்பாட் &amp; டெதெரிங் நிலை"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-te/strings.xml b/packages/Tethering/res/values-te/strings.xml
index aae40de..1f91791 100644
--- a/packages/Tethering/res/values-te/strings.xml
+++ b/packages/Tethering/res/values-te/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"టీథర్ చేయబడినది లేదా హాట్‌స్పాట్ సక్రియంగా ఉండేది"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"సెటప్ చేయడానికి నొక్కండి."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"టెథెరింగ్ నిలిపివేయబడింది"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"వివరాల కోసం మీ నిర్వాహకులను సంప్రదించండి"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"టెథరింగ్ లేదా హాట్‌స్పాట్ యాక్టివ్‌గా ఉంది"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"సెటప్ చేయడానికి ట్యాప్ చేయండి."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"టెథరింగ్ డిజేబుల్ చేయబడింది"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"వివరాల కోసం మీ అడ్మిన్‌ని సంప్రదించండి"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"హాట్‌స్పాట్ &amp; టెథరింగ్ స్థితి"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-th/strings.xml b/packages/Tethering/res/values-th/strings.xml
index 1b80056..44171c0 100644
--- a/packages/Tethering/res/values-th/strings.xml
+++ b/packages/Tethering/res/values-th/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"การปล่อยสัญญาณหรือฮอตสปอตทำงานอยู่"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"แตะเพื่อตั้งค่า"</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"ปิดใช้การเชื่อมต่ออินเทอร์เน็ตผ่านมือถือแล้ว"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"ติดต่อผู้ดูแลระบบเพื่อขอรายละเอียด"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"การเชื่อมต่ออินเทอร์เน็ตผ่านมือถือหรือฮอตสปอตทำงานอยู่"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"แตะเพื่อตั้งค่า"</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"ปิดใช้การเชื่อมต่ออินเทอร์เน็ตผ่านมือถือแล้ว"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"ติดต่อผู้ดูแลระบบเพื่อขอรายละเอียด"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"สถานะฮอตสปอตและการเชื่อมต่ออินเทอร์เน็ตผ่านมือถือ"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-tl/strings.xml b/packages/Tethering/res/values-tl/strings.xml
index 12863f9..7347dd3 100644
--- a/packages/Tethering/res/values-tl/strings.xml
+++ b/packages/Tethering/res/values-tl/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"Pagsasama o aktibong hotspot"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"I-tap upang i-set up."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"Naka-disable ang pag-tether"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"Makipag-ugnayan sa iyong admin para sa mga detalye"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"Aktibo ang pag-tether o hotspot"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"I-tap para i-set up."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"Naka-disable ang pag-tether"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"Makipag-ugnayan sa iyong admin para sa mga detalye"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Status ng hotspot at pag-tether"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-tr/strings.xml b/packages/Tethering/res/values-tr/strings.xml
index bfcf1ac..32030f1 100644
--- a/packages/Tethering/res/values-tr/strings.xml
+++ b/packages/Tethering/res/values-tr/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"Tethering veya hotspot etkin"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"Ayarlamak için dokunun."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"Tethering devre dışı bırakıldı"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"Ayrıntılı bilgi için yöneticinize başvurun"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"Tethering veya hotspot etkin"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"Ayarlamak için dokunun."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"Tethering devre dışı bırakıldı"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"Ayrıntılı bilgi için yöneticinize başvurun"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Hotspot ve tethering durumu"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-uk/strings.xml b/packages/Tethering/res/values-uk/strings.xml
index 8e159c07..1ca89b3 100644
--- a/packages/Tethering/res/values-uk/strings.xml
+++ b/packages/Tethering/res/values-uk/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"Прив\'язка чи точка дост. активна"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"Торкніться, щоб налаштувати."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"Використання телефона в режимі модема вимкнено"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"Щоб дізнатися більше, зв’яжіться з адміністратором"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"Модем чи точка доступу активні"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"Натисніть, щоб налаштувати."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"Використання телефона як модема вимкнено"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"Щоб дізнатися більше, зв\'яжіться з адміністратором"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Статус точки доступу та модема"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-ur/strings.xml b/packages/Tethering/res/values-ur/strings.xml
index 89195d4..d72c7d4 100644
--- a/packages/Tethering/res/values-ur/strings.xml
+++ b/packages/Tethering/res/values-ur/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"ٹیدرنگ یا ہاٹ اسپاٹ فعال"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"سیٹ اپ کرنے کیلئے تھپتھپائیں۔"</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"ٹیدرنگ غیر فعال ہے"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"تفصیلات کے لئے اپنے منتظم سے رابطہ کریں"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"ٹیدرنگ یا ہاٹ اسپاٹ فعال"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"سیٹ اپ کرنے کیلئے تھپتھپائیں۔"</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"ٹیدرنگ غیر فعال ہے"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"تفصیلات کے لئے اپنے منتظم سے رابطہ کریں"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"ہاٹ اسپاٹ اور ٹیتھرنگ کا اسٹیٹس"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-uz/strings.xml b/packages/Tethering/res/values-uz/strings.xml
index 0ac4d4a..af3b2eb 100644
--- a/packages/Tethering/res/values-uz/strings.xml
+++ b/packages/Tethering/res/values-uz/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"Modem rejimi yoniq"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"Sozlash uchun bosing."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"Modem rejimi faolsizlantirildi"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"Tafsilotlari uchun administratoringizga murojaat qiling"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"Modem rejimi yoki hotspot yoniq"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"Sozlash uchun bosing."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"Modem rejimi faolsizlantirildi"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"Tafsilotlari uchun administratoringizga murojaat qiling"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Hotspot va modem rejimi holati"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-vi/strings.xml b/packages/Tethering/res/values-vi/strings.xml
index 85a4db8..21a0735 100644
--- a/packages/Tethering/res/values-vi/strings.xml
+++ b/packages/Tethering/res/values-vi/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"Chức năng điểm truy cập Internet hoặc điểm phát sóng đang hoạt động"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"Nhấn để thiết lập."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"Đã tắt tính năng chia sẻ kết nối"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"Hãy liên hệ với quản trị viên của bạn để biết chi tiết"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"Tính năng chia sẻ Internet hoặc điểm phát sóng đang hoạt động"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"Hãy nhấn để thiết lập."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"Đã tắt tính năng chia sẻ Internet"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"Hãy liên hệ với quản trị viên của bạn để biết chi tiết"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Trạng thái điểm phát sóng và chia sẻ Internet"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-zh-rCN/strings.xml b/packages/Tethering/res/values-zh-rCN/strings.xml
index ff1fe03..98e3b4b 100644
--- a/packages/Tethering/res/values-zh-rCN/strings.xml
+++ b/packages/Tethering/res/values-zh-rCN/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"网络共享或热点已启用"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"点按即可进行设置。"</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"网络共享已停用"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"请与您的管理员联系以了解详情"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"网络共享或热点已启用"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"点按即可设置。"</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"网络共享已停用"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"如需了解详情,请与您的管理员联系"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"热点和网络共享状态"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-zh-rHK/strings.xml b/packages/Tethering/res/values-zh-rHK/strings.xml
index 0de39fa..9cafd42 100644
--- a/packages/Tethering/res/values-zh-rHK/strings.xml
+++ b/packages/Tethering/res/values-zh-rHK/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"已啟用網絡共享或熱點"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"輕按即可設定。"</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"網絡共享已停用"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"請聯絡您的管理員以瞭解詳情"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"網絡共享或熱點已啟用"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"輕按即可設定。"</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"網絡共享已停用"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"請聯絡您的管理員以瞭解詳情"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"熱點和網絡共享狀態"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-zh-rTW/strings.xml b/packages/Tethering/res/values-zh-rTW/strings.xml
index 9a117bb..9d738a7 100644
--- a/packages/Tethering/res/values-zh-rTW/strings.xml
+++ b/packages/Tethering/res/values-zh-rTW/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"網路共用或無線基地台已啟用"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"輕觸即可進行設定。"</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"數據連線已停用"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"詳情請洽你的管理員"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"數據連線或無線基地台已啟用"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"輕觸即可進行設定。"</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"數據連線已停用"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"詳情請洽你的管理員"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"無線基地台與數據連線狀態"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values-zu/strings.xml b/packages/Tethering/res/values-zu/strings.xml
index 8fe10d8..f210f87 100644
--- a/packages/Tethering/res/values-zu/strings.xml
+++ b/packages/Tethering/res/values-zu/strings.xml
@@ -1,8 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="tethered_notification_title" msgid="3146694234398202601">"Ukusebenzisa njengemodemu noma i-hotspot ephathekayo kuvuliwe"</string>
-    <string name="tethered_notification_message" msgid="2113628520792055377">"Thepha ukuze usethe."</string>
-    <string name="disable_tether_notification_title" msgid="7526977944111313195">"Ukusebenzisa ifoni njengemodemu kukhutshaziwe"</string>
-    <string name="disable_tether_notification_message" msgid="2913366428516852495">"Xhumana nomphathi wakho ukuze uthole imininingwane"</string>
+    <string name="tethered_notification_title" msgid="6426563586025792944">"Ukusebenzisa njengemodemu noma i-hotspot ephathekayo kuvuliwe"</string>
+    <string name="tethered_notification_message" msgid="64800879503420696">"Thepha ukuze usethe."</string>
+    <string name="disable_tether_notification_title" msgid="3004509127903564191">"Ukusebenzisa ifoni njengemodemu kukhutshaziwe"</string>
+    <string name="disable_tether_notification_message" msgid="6717523799293901476">"Xhumana nomphathi wakho ukuze uthole imininingwane"</string>
+    <string name="notification_channel_tethering_status" msgid="2663463891530932727">"I-Hotspot nesimo sokusebenzisa ifoni njengemodemu"</string>
+    <string name="no_upstream_notification_title" msgid="1204601824631788482"></string>
+    <string name="no_upstream_notification_message" msgid="8586582938243032621"></string>
+    <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string>
+    <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string>
+    <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string>
 </resources>
diff --git a/packages/Tethering/res/values/config.xml b/packages/Tethering/res/values/config.xml
index 04d6215..83c99d2 100644
--- a/packages/Tethering/res/values/config.xml
+++ b/packages/Tethering/res/values/config.xml
@@ -89,7 +89,7 @@
                         TYPE_MOBILE_HIPRI is appended.
 
          For other changes applied to this list, now and in the future, see
-         com.android.server.connectivity.tethering.TetheringConfiguration.
+         com.android.networkstack.tethering.TetheringConfiguration.
 
          Note also: the order of this is important. The first upstream type
          for which a satisfying network exists is used.
@@ -158,48 +158,14 @@
     <!-- ComponentName of the service used to run no ui tether provisioning. -->
     <string translatable="false" name="config_wifi_tether_enable">com.android.settings/.wifi.tether.TetherService</string>
 
-    <!-- Enable tethering notification -->
-    <!-- Icons for showing tether enable notification.
-         Each item should have two elements and be separated with ";".
+    <!-- No upstream notification is shown when there is a downstream but no upstream that is able
+         to do the tethering. -->
+    <!-- Delay(millisecond) to show no upstream notification after there's no Backhaul. Set delay to
+         "-1" for disable this feature. -->
+    <integer name="delay_to_show_no_upstream_after_no_backhaul">-1</integer>
 
-         The first element is downstream types which is one of tethering. This element has to be
-         made by WIFI, USB, BT, and OR'd with the others. Use "|" to combine multiple downstream
-         types and use "," to separate each combinations. Such as
-
-             USB|BT,WIFI|USB|BT
-
-         The second element is icon for the item. This element has to be composed by
-         <package name>:drawable/<resource name>. Such as
-
-             1. com.android.networkstack.tethering:drawable/stat_sys_tether_general
-             2. android:drawable/xxx
-
-         So the entire string of each item would be
-
-             USB|BT,WIFI|USB|BT;com.android.networkstack.tethering:drawable/stat_sys_tether_general
-
-         NOTE: One config can be separated into two or more for readability. Such as
-
-               WIFI|USB,WIFI|BT,USB|BT,WIFI|USB|BT;android:drawable/xxx
-
-               can be separated into
-
-               WIFI|USB;android:drawable/xxx
-               WIFI|BT;android:drawable/xxx
-               USB|BT;android:drawable/xxx
-               WIFI|USB|BT;android:drawable/xxx
-
-         Notification will not show if the downstream type isn't listed in array.
-         Empty array means disable notifications. -->
-    <!-- In AOSP, hotspot is configured to no notification by default. Because status bar has showed
-         an icon on the right side already -->
-    <string-array translatable="false" name="tethering_notification_icons">
-        <item>USB;com.android.networkstack.tethering:drawable/stat_sys_tether_usb</item>
-        <item>BT;com.android.networkstack.tethering:drawable/stat_sys_tether_bluetooth</item>
-        <item>WIFI|USB,WIFI|BT,USB|BT,WIFI|USB|BT;com.android.networkstack.tethering:drawable/stat_sys_tether_general</item>
-    </string-array>
-    <!-- String for tether enable notification title. -->
-    <string name="tethering_notification_title">@string/tethered_notification_title</string>
-    <!-- String for tether enable notification message. -->
-    <string name="tethering_notification_message">@string/tethered_notification_message</string>
+    <!-- Cellular roaming notification is shown when upstream is cellular network and in roaming
+         state. -->
+    <!-- Config for showing upstream roaming notification. -->
+    <bool name="config_upstream_roaming_notification">false</bool>
 </resources>
diff --git a/packages/Tethering/res/values/overlayable.xml b/packages/Tethering/res/values/overlayable.xml
index bbba3f3..16ae8ad 100644
--- a/packages/Tethering/res/values/overlayable.xml
+++ b/packages/Tethering/res/values/overlayable.xml
@@ -32,44 +32,6 @@
             <item type="string" name="config_mobile_hotspot_provision_response"/>
             <item type="integer" name="config_mobile_hotspot_provision_check_period"/>
             <item type="string" name="config_wifi_tether_enable"/>
-            <!-- Configuration values for TetheringNotificationUpdater -->
-            <!-- Icons for showing tether enable notification.
-            Each item should have two elements and be separated with ";".
-
-            The first element is downstream types which is one of tethering. This element has to be
-            made by WIFI, USB, BT, and OR'd with the others. Use "|" to combine multiple downstream
-            types and use "," to separate each combinations. Such as
-
-            USB|BT,WIFI|USB|BT
-
-            The second element is icon for the item. This element has to be composed by
-            <package name>:drawable/<resource name>. Such as
-
-            1. com.android.networkstack.tethering:drawable/stat_sys_tether_general
-            2. android:drawable/xxx
-
-            So the entire string of each item would be
-
-            USB|BT,WIFI|USB|BT;com.android.networkstack.tethering:drawable/stat_sys_tether_general
-
-            NOTE: One config can be separated into two or more for readability. Such as
-
-                  WIFI|USB,WIFI|BT,USB|BT,WIFI|USB|BT;android:drawable/xxx
-
-                  can be separated into
-
-                  WIFI|USB;android:drawable/xxx
-                  WIFI|BT;android:drawable/xxx
-                  USB|BT;android:drawable/xxx
-                  WIFI|USB|BT;android:drawable/xxx
-
-            Notification will not show if the downstream type isn't listed in array.
-            Empty array means disable notifications. -->
-            <item type="array" name="tethering_notification_icons"/>
-            <!-- String for tether enable notification title. -->
-            <item type="string" name="tethering_notification_title"/>
-            <!-- String for tether enable notification message. -->
-            <item type="string" name="tethering_notification_message"/>
             <!-- Params from config.xml that can be overlaid -->
         </policy>
     </overlayable>
diff --git a/packages/Tethering/res/values/strings.xml b/packages/Tethering/res/values/strings.xml
index 52a1654..d63c7c5 100644
--- a/packages/Tethering/res/values/strings.xml
+++ b/packages/Tethering/res/values/strings.xml
@@ -19,9 +19,6 @@
     <string name="tethered_notification_title">Tethering or hotspot active</string>
     <!-- String for tethered notification message [CHAR LIMIT=200] -->
     <string name="tethered_notification_message">Tap to set up.</string>
-    <!-- String for tethered notification title with client number info. -->
-    <plurals name="tethered_notification_title_with_client_number">
-    </plurals>
 
     <!-- This notification is shown when tethering has been disabled on a user's device.
     The device is managed by the user's employer. Tethering can't be turned on unless the
@@ -40,13 +37,11 @@
     <string name="no_upstream_notification_title"></string>
     <!-- String for no upstream notification message [CHAR LIMIT=200] -->
     <string name="no_upstream_notification_message"></string>
-    <!-- String for cellular roaming notification disable button [CHAR LIMIT=200]  -->
+    <!-- String for no upstream notification disable button [CHAR LIMIT=200] -->
     <string name="no_upstream_notification_disable_button"></string>
 
-    <!-- String for cellular roaming notification title [CHAR LIMIT=200]  -->
+    <!-- String for cellular roaming notification title [CHAR LIMIT=200] -->
     <string name="upstream_roaming_notification_title"></string>
-    <!-- String for cellular roaming notification message [CHAR LIMIT=500]  -->
+    <!-- String for cellular roaming notification message [CHAR LIMIT=500] -->
     <string name="upstream_roaming_notification_message"></string>
-    <!-- String for cellular roaming notification continue button [CHAR LIMIT=200]  -->
-    <string name="upstream_roaming_notification_continue_button"></string>
 </resources>
diff --git a/packages/Tethering/src/android/net/ip/IpServer.java b/packages/Tethering/src/android/net/ip/IpServer.java
index 1dac5b7..83727bc 100644
--- a/packages/Tethering/src/android/net/ip/IpServer.java
+++ b/packages/Tethering/src/android/net/ip/IpServer.java
@@ -122,6 +122,8 @@
     // TODO: have this configurable
     private static final int DHCP_LEASE_TIME_SECS = 3600;
 
+    private static final MacAddress NULL_MAC_ADDRESS = MacAddress.fromString("00:00:00:00:00:00");
+
     private static final String TAG = "IpServer";
     private static final boolean DBG = false;
     private static final boolean VDBG = false;
@@ -902,9 +904,12 @@
             return;
         }
 
+        // When deleting rules, we still need to pass a non-null MAC, even though it's ignored.
+        // Do this here instead of in the Ipv6ForwardingRule constructor to ensure that we never
+        // add rules with a null MAC, only delete them.
+        MacAddress dstMac = e.isValid() ? e.macAddr : NULL_MAC_ADDRESS;
         Ipv6ForwardingRule rule = new Ipv6ForwardingRule(upstreamIfindex,
-                mInterfaceParams.index, (Inet6Address) e.ip, mInterfaceParams.macAddr,
-                e.macAddr);
+                mInterfaceParams.index, (Inet6Address) e.ip, mInterfaceParams.macAddr, dstMac);
         if (e.isValid()) {
             addIpv6ForwardingRule(rule);
         } else {
diff --git a/packages/Tethering/src/com/android/networkstack/tethering/ConnectedClientsTracker.java b/packages/Tethering/src/com/android/networkstack/tethering/ConnectedClientsTracker.java
new file mode 100644
index 0000000..8a96988
--- /dev/null
+++ b/packages/Tethering/src/com/android/networkstack/tethering/ConnectedClientsTracker.java
@@ -0,0 +1,183 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.networkstack.tethering;
+
+import static android.net.TetheringManager.TETHERING_WIFI;
+
+import android.net.MacAddress;
+import android.net.TetheredClient;
+import android.net.TetheredClient.AddressInfo;
+import android.net.ip.IpServer;
+import android.net.wifi.WifiClient;
+import android.os.SystemClock;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Tracker for clients connected to downstreams.
+ *
+ * <p>This class is not thread safe, it is intended to be used only from the tethering handler
+ * thread.
+ */
+public class ConnectedClientsTracker {
+    private final Clock mClock;
+
+    @NonNull
+    private List<WifiClient> mLastWifiClients = Collections.emptyList();
+    @NonNull
+    private List<TetheredClient> mLastTetheredClients = Collections.emptyList();
+
+    @VisibleForTesting
+    static class Clock {
+        public long elapsedRealtime() {
+            return SystemClock.elapsedRealtime();
+        }
+    }
+
+    public ConnectedClientsTracker() {
+        this(new Clock());
+    }
+
+    @VisibleForTesting
+    ConnectedClientsTracker(Clock clock) {
+        mClock = clock;
+    }
+
+    /**
+     * Update the tracker with new connected clients.
+     *
+     * <p>The new list can be obtained through {@link #getLastTetheredClients()}.
+     * @param ipServers The IpServers used to assign addresses to clients.
+     * @param wifiClients The list of L2-connected WiFi clients. Null for no change since last
+     *                    update.
+     * @return True if the list of clients changed since the last calculation.
+     */
+    public boolean updateConnectedClients(
+            Iterable<IpServer> ipServers, @Nullable List<WifiClient> wifiClients) {
+        final long now = mClock.elapsedRealtime();
+
+        if (wifiClients != null) {
+            mLastWifiClients = wifiClients;
+        }
+        final Set<MacAddress> wifiClientMacs = getClientMacs(mLastWifiClients);
+
+        // Build the list of non-expired leases from all IpServers, grouped by mac address
+        final Map<MacAddress, TetheredClient> clientsMap = new HashMap<>();
+        for (IpServer server : ipServers) {
+            for (TetheredClient client : server.getAllLeases()) {
+                if (client.getTetheringType() == TETHERING_WIFI
+                        && !wifiClientMacs.contains(client.getMacAddress())) {
+                    // Skip leases of WiFi clients that are not (or no longer) L2-connected
+                    continue;
+                }
+                final TetheredClient prunedClient = pruneExpired(client, now);
+                if (prunedClient == null) continue; // All addresses expired
+
+                addLease(clientsMap, prunedClient);
+            }
+        }
+
+        // TODO: add IPv6 addresses from netlink
+
+        // Add connected WiFi clients that do not have any known address
+        for (MacAddress client : wifiClientMacs) {
+            if (clientsMap.containsKey(client)) continue;
+            clientsMap.put(client, new TetheredClient(
+                    client, Collections.emptyList() /* addresses */, TETHERING_WIFI));
+        }
+
+        final HashSet<TetheredClient> clients = new HashSet<>(clientsMap.values());
+        final boolean clientsChanged = clients.size() != mLastTetheredClients.size()
+                || !clients.containsAll(mLastTetheredClients);
+        mLastTetheredClients = Collections.unmodifiableList(new ArrayList<>(clients));
+        return clientsChanged;
+    }
+
+    private static void addLease(Map<MacAddress, TetheredClient> clientsMap, TetheredClient lease) {
+        final TetheredClient aggregateClient = clientsMap.getOrDefault(
+                lease.getMacAddress(), lease);
+        if (aggregateClient == lease) {
+            // This is the first lease with this mac address
+            clientsMap.put(lease.getMacAddress(), lease);
+            return;
+        }
+
+        // Only add the address info; this assumes that the tethering type is the same when the mac
+        // address is the same. If a client is connected through different tethering types with the
+        // same mac address, connected clients callbacks will report all of its addresses under only
+        // one of these tethering types. This keeps the API simple considering that such a scenario
+        // would really be a rare edge case.
+        clientsMap.put(lease.getMacAddress(), aggregateClient.addAddresses(lease));
+    }
+
+    /**
+     * Get the last list of tethered clients, as calculated in {@link #updateConnectedClients}.
+     *
+     * <p>The returned list is immutable.
+     */
+    @NonNull
+    public List<TetheredClient> getLastTetheredClients() {
+        return mLastTetheredClients;
+    }
+
+    private static boolean hasExpiredAddress(List<AddressInfo> addresses, long now) {
+        for (AddressInfo info : addresses) {
+            if (info.getExpirationTime() <= now) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    @Nullable
+    private static TetheredClient pruneExpired(TetheredClient client, long now) {
+        final List<AddressInfo> addresses = client.getAddresses();
+        if (addresses.size() == 0) return null;
+        if (!hasExpiredAddress(addresses, now)) return client;
+
+        final ArrayList<AddressInfo> newAddrs = new ArrayList<>(addresses.size() - 1);
+        for (AddressInfo info : addresses) {
+            if (info.getExpirationTime() > now) {
+                newAddrs.add(info);
+            }
+        }
+
+        if (newAddrs.size() == 0) {
+            return null;
+        }
+        return new TetheredClient(client.getMacAddress(), newAddrs, client.getTetheringType());
+    }
+
+    @NonNull
+    private static Set<MacAddress> getClientMacs(@NonNull List<WifiClient> clients) {
+        final Set<MacAddress> macs = new HashSet<>(clients.size());
+        for (WifiClient c : clients) {
+            macs.add(c.getMacAddress());
+        }
+        return macs;
+    }
+}
diff --git a/packages/Tethering/src/com/android/networkstack/tethering/EntitlementManager.java b/packages/Tethering/src/com/android/networkstack/tethering/EntitlementManager.java
new file mode 100644
index 0000000..049a9f6
--- /dev/null
+++ b/packages/Tethering/src/com/android/networkstack/tethering/EntitlementManager.java
@@ -0,0 +1,604 @@
+/*
+ * Copyright (C) 2018 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.networkstack.tethering;
+
+import static android.net.TetheringConstants.EXTRA_ADD_TETHER_TYPE;
+import static android.net.TetheringConstants.EXTRA_PROVISION_CALLBACK;
+import static android.net.TetheringConstants.EXTRA_RUN_PROVISION;
+import static android.net.TetheringManager.TETHERING_BLUETOOTH;
+import static android.net.TetheringManager.TETHERING_ETHERNET;
+import static android.net.TetheringManager.TETHERING_INVALID;
+import static android.net.TetheringManager.TETHERING_USB;
+import static android.net.TetheringManager.TETHERING_WIFI;
+import static android.net.TetheringManager.TETHER_ERROR_ENTITLEMENT_UNKNOWN;
+import static android.net.TetheringManager.TETHER_ERROR_NO_ERROR;
+import static android.net.TetheringManager.TETHER_ERROR_PROVISIONING_FAILED;
+
+import android.app.AlarmManager;
+import android.app.PendingIntent;
+import android.content.BroadcastReceiver;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.net.util.SharedLog;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Parcel;
+import android.os.PersistableBundle;
+import android.os.ResultReceiver;
+import android.os.SystemClock;
+import android.os.SystemProperties;
+import android.provider.Settings;
+import android.telephony.CarrierConfigManager;
+import android.util.ArraySet;
+import android.util.SparseIntArray;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.util.StateMachine;
+
+import java.io.PrintWriter;
+
+/**
+ * Re-check tethering provisioning for enabled downstream tether types.
+ * Reference TetheringManager.TETHERING_{@code *} for each tether type.
+ *
+ * All methods of this class must be accessed from the thread of tethering
+ * state machine.
+ * @hide
+ */
+public class EntitlementManager {
+    private static final String TAG = EntitlementManager.class.getSimpleName();
+    private static final boolean DBG = false;
+
+    @VisibleForTesting
+    protected static final String DISABLE_PROVISIONING_SYSPROP_KEY = "net.tethering.noprovisioning";
+    private static final String ACTION_PROVISIONING_ALARM =
+            "com.android.networkstack.tethering.PROVISIONING_RECHECK_ALARM";
+    private static final String EXTRA_SUBID = "subId";
+
+    private final ComponentName mSilentProvisioningService;
+    private static final int MS_PER_HOUR = 60 * 60 * 1000;
+
+    // The ArraySet contains enabled downstream types, ex:
+    // {@link TetheringManager.TETHERING_WIFI}
+    // {@link TetheringManager.TETHERING_USB}
+    // {@link TetheringManager.TETHERING_BLUETOOTH}
+    private final ArraySet<Integer> mCurrentTethers;
+    private final Context mContext;
+    private final int mPermissionChangeMessageCode;
+    private final SharedLog mLog;
+    private final SparseIntArray mEntitlementCacheValue;
+    private final Handler mHandler;
+    private final StateMachine mTetherMasterSM;
+    // Key: TetheringManager.TETHERING_*(downstream).
+    // Value: TetheringManager.TETHER_ERROR_{NO_ERROR or PROVISION_FAILED}(provisioning result).
+    private final SparseIntArray mCellularPermitted;
+    private PendingIntent mProvisioningRecheckAlarm;
+    private boolean mCellularUpstreamPermitted = true;
+    private boolean mUsingCellularAsUpstream = false;
+    private boolean mNeedReRunProvisioningUi = false;
+    private OnUiEntitlementFailedListener mListener;
+    private TetheringConfigurationFetcher mFetcher;
+
+    public EntitlementManager(Context ctx, StateMachine tetherMasterSM, SharedLog log,
+            int permissionChangeMessageCode) {
+
+        mContext = ctx;
+        mLog = log.forSubComponent(TAG);
+        mCurrentTethers = new ArraySet<Integer>();
+        mCellularPermitted = new SparseIntArray();
+        mEntitlementCacheValue = new SparseIntArray();
+        mTetherMasterSM = tetherMasterSM;
+        mPermissionChangeMessageCode = permissionChangeMessageCode;
+        mHandler = tetherMasterSM.getHandler();
+        mContext.registerReceiver(mReceiver, new IntentFilter(ACTION_PROVISIONING_ALARM),
+                null, mHandler);
+        mSilentProvisioningService = ComponentName.unflattenFromString(
+                mContext.getResources().getString(R.string.config_wifi_tether_enable));
+    }
+
+    public void setOnUiEntitlementFailedListener(final OnUiEntitlementFailedListener listener) {
+        mListener = listener;
+    }
+
+    /** Callback fired when UI entitlement failed. */
+    public interface OnUiEntitlementFailedListener {
+        /**
+         * Ui entitlement check fails in |downstream|.
+         *
+         * @param downstream tethering type from TetheringManager.TETHERING_{@code *}.
+         */
+        void onUiEntitlementFailed(int downstream);
+    }
+
+    public void setTetheringConfigurationFetcher(final TetheringConfigurationFetcher fetcher) {
+        mFetcher = fetcher;
+    }
+
+    /** Interface to fetch TetheringConfiguration. */
+    public interface TetheringConfigurationFetcher {
+        /**
+         * Fetch current tethering configuration. This will be called to ensure whether entitlement
+         * check is needed.
+         * @return TetheringConfiguration instance.
+         */
+        TetheringConfiguration fetchTetheringConfiguration();
+    }
+
+    /**
+     * Check if cellular upstream is permitted.
+     */
+    public boolean isCellularUpstreamPermitted() {
+        // If provisioning is required and EntitlementManager don't know any downstream,
+        // cellular upstream should not be allowed.
+        final TetheringConfiguration config = mFetcher.fetchTetheringConfiguration();
+        if (mCurrentTethers.size() == 0 && isTetherProvisioningRequired(config)) {
+            return false;
+        }
+        return mCellularUpstreamPermitted;
+    }
+
+    /**
+     * This is called when tethering starts.
+     * Launch provisioning app if upstream is cellular.
+     *
+     * @param downstreamType tethering type from TetheringManager.TETHERING_{@code *}
+     * @param showProvisioningUi a boolean indicating whether to show the
+     *        provisioning app UI if there is one.
+     */
+    public void startProvisioningIfNeeded(int downstreamType, boolean showProvisioningUi) {
+        if (!isValidDownstreamType(downstreamType)) return;
+
+        if (!mCurrentTethers.contains(downstreamType)) mCurrentTethers.add(downstreamType);
+
+        final TetheringConfiguration config = mFetcher.fetchTetheringConfiguration();
+        if (isTetherProvisioningRequired(config)) {
+            // If provisioning is required and the result is not available yet,
+            // cellular upstream should not be allowed.
+            if (mCellularPermitted.size() == 0) {
+                mCellularUpstreamPermitted = false;
+            }
+            // If upstream is not cellular, provisioning app would not be launched
+            // till upstream change to cellular.
+            if (mUsingCellularAsUpstream) {
+                if (showProvisioningUi) {
+                    runUiTetherProvisioning(downstreamType, config.activeDataSubId);
+                } else {
+                    runSilentTetherProvisioning(downstreamType, config.activeDataSubId);
+                }
+                mNeedReRunProvisioningUi = false;
+            } else {
+                mNeedReRunProvisioningUi |= showProvisioningUi;
+            }
+        } else {
+            mCellularUpstreamPermitted = true;
+        }
+    }
+
+    /**
+     * Tell EntitlementManager that a given type of tethering has been disabled
+     *
+     * @param type tethering type from TetheringManager.TETHERING_{@code *}
+     */
+    public void stopProvisioningIfNeeded(int type) {
+        if (!isValidDownstreamType(type)) return;
+
+        mCurrentTethers.remove(type);
+        // There are lurking bugs where the notion of "provisioning required" or
+        // "tethering supported" may change without without tethering being notified properly.
+        // Remove the mapping all the time no matter provisioning is required or not.
+        removeDownstreamMapping(type);
+    }
+
+    /**
+     * Notify EntitlementManager if upstream is cellular or not.
+     *
+     * @param isCellular whether tethering upstream is cellular.
+     */
+    public void notifyUpstream(boolean isCellular) {
+        if (DBG) {
+            mLog.i("notifyUpstream: " + isCellular
+                    + ", mCellularUpstreamPermitted: " + mCellularUpstreamPermitted
+                    + ", mNeedReRunProvisioningUi: " + mNeedReRunProvisioningUi);
+        }
+        mUsingCellularAsUpstream = isCellular;
+
+        if (mUsingCellularAsUpstream) {
+            final TetheringConfiguration config = mFetcher.fetchTetheringConfiguration();
+            maybeRunProvisioning(config);
+        }
+    }
+
+    /** Run provisioning if needed */
+    public void maybeRunProvisioning() {
+        final TetheringConfiguration config = mFetcher.fetchTetheringConfiguration();
+        maybeRunProvisioning(config);
+    }
+
+    private void maybeRunProvisioning(final TetheringConfiguration config) {
+        if (mCurrentTethers.size() == 0 || !isTetherProvisioningRequired(config)) {
+            return;
+        }
+
+        // Whenever any entitlement value changes, all downstreams will re-evaluate whether they
+        // are allowed. Therefore even if the silent check here ends in a failure and the UI later
+        // yields success, then the downstream that got a failure will re-evaluate as a result of
+        // the change and get the new correct value.
+        for (Integer downstream : mCurrentTethers) {
+            if (mCellularPermitted.indexOfKey(downstream) < 0) {
+                if (mNeedReRunProvisioningUi) {
+                    mNeedReRunProvisioningUi = false;
+                    runUiTetherProvisioning(downstream, config.activeDataSubId);
+                } else {
+                    runSilentTetherProvisioning(downstream, config.activeDataSubId);
+                }
+            }
+        }
+    }
+
+    /**
+     * Check if the device requires a provisioning check in order to enable tethering.
+     *
+     * @param config an object that encapsulates the various tethering configuration elements.
+     * @return a boolean - {@code true} indicating tether provisioning is required by the carrier.
+     */
+    @VisibleForTesting
+    protected boolean isTetherProvisioningRequired(final TetheringConfiguration config) {
+        if (SystemProperties.getBoolean(DISABLE_PROVISIONING_SYSPROP_KEY, false)
+                || config.provisioningApp.length == 0) {
+            return false;
+        }
+        if (carrierConfigAffirmsEntitlementCheckNotRequired(config)) {
+            return false;
+        }
+        return (config.provisioningApp.length == 2);
+    }
+
+    /**
+     * Re-check tethering provisioning for all enabled tether types.
+     * Reference TetheringManager.TETHERING_{@code *} for each tether type.
+     *
+     * @param config an object that encapsulates the various tethering configuration elements.
+     * Note: this method is only called from TetherMaster on the handler thread.
+     * If there are new callers from different threads, the logic should move to
+     * masterHandler to avoid race conditions.
+     */
+    public void reevaluateSimCardProvisioning(final TetheringConfiguration config) {
+        if (DBG) mLog.i("reevaluateSimCardProvisioning");
+
+        if (!mHandler.getLooper().isCurrentThread()) {
+            // Except for test, this log should not appear in normal flow.
+            mLog.log("reevaluateSimCardProvisioning() don't run in TetherMaster thread");
+        }
+        mEntitlementCacheValue.clear();
+        mCellularPermitted.clear();
+
+        // TODO: refine provisioning check to isTetherProvisioningRequired() ??
+        if (!config.hasMobileHotspotProvisionApp()
+                || carrierConfigAffirmsEntitlementCheckNotRequired(config)) {
+            evaluateCellularPermission(config);
+            return;
+        }
+
+        if (mUsingCellularAsUpstream) {
+            maybeRunProvisioning(config);
+        }
+    }
+
+    /**
+     * Get carrier configuration bundle.
+     * @param config an object that encapsulates the various tethering configuration elements.
+     * */
+    public PersistableBundle getCarrierConfig(final TetheringConfiguration config) {
+        final CarrierConfigManager configManager = (CarrierConfigManager) mContext
+                .getSystemService(Context.CARRIER_CONFIG_SERVICE);
+        if (configManager == null) return null;
+
+        final PersistableBundle carrierConfig = configManager.getConfigForSubId(
+                config.activeDataSubId);
+
+        if (CarrierConfigManager.isConfigForIdentifiedCarrier(carrierConfig)) {
+            return carrierConfig;
+        }
+
+        return null;
+    }
+
+    // The logic here is aimed solely at confirming that a CarrierConfig exists
+    // and affirms that entitlement checks are not required.
+    //
+    // TODO: find a better way to express this, or alter the checking process
+    // entirely so that this is more intuitive.
+    private boolean carrierConfigAffirmsEntitlementCheckNotRequired(
+            final TetheringConfiguration config) {
+        // Check carrier config for entitlement checks
+        final PersistableBundle carrierConfig = getCarrierConfig(config);
+        if (carrierConfig == null) return false;
+
+        // A CarrierConfigManager was found and it has a config.
+        final boolean isEntitlementCheckRequired = carrierConfig.getBoolean(
+                CarrierConfigManager.KEY_REQUIRE_ENTITLEMENT_CHECKS_BOOL);
+        return !isEntitlementCheckRequired;
+    }
+
+    /**
+     * Run no UI tethering provisioning check.
+     * @param type tethering type from TetheringManager.TETHERING_{@code *}
+     * @param subId default data subscription ID.
+     */
+    @VisibleForTesting
+    protected void runSilentTetherProvisioning(int type, int subId) {
+        if (DBG) mLog.i("runSilentTetherProvisioning: " + type);
+        // For silent provisioning, settings would stop tethering when entitlement fail.
+        ResultReceiver receiver = buildProxyReceiver(type, false/* notifyFail */, null);
+
+        Intent intent = new Intent();
+        intent.putExtra(EXTRA_ADD_TETHER_TYPE, type);
+        intent.putExtra(EXTRA_RUN_PROVISION, true);
+        intent.putExtra(EXTRA_PROVISION_CALLBACK, receiver);
+        intent.putExtra(EXTRA_SUBID, subId);
+        intent.setComponent(mSilentProvisioningService);
+        // Only admin user can change tethering and SilentTetherProvisioning don't need to
+        // show UI, it is fine to always start setting's background service as system user.
+        mContext.startService(intent);
+    }
+
+    private void runUiTetherProvisioning(int type, int subId) {
+        ResultReceiver receiver = buildProxyReceiver(type, true/* notifyFail */, null);
+        runUiTetherProvisioning(type, subId, receiver);
+    }
+
+    /**
+     * Run the UI-enabled tethering provisioning check.
+     * @param type tethering type from TetheringManager.TETHERING_{@code *}
+     * @param subId default data subscription ID.
+     * @param receiver to receive entitlement check result.
+     */
+    @VisibleForTesting
+    protected void runUiTetherProvisioning(int type, int subId, ResultReceiver receiver) {
+        if (DBG) mLog.i("runUiTetherProvisioning: " + type);
+
+        Intent intent = new Intent(Settings.ACTION_TETHER_PROVISIONING_UI);
+        intent.putExtra(EXTRA_ADD_TETHER_TYPE, type);
+        intent.putExtra(EXTRA_PROVISION_CALLBACK, receiver);
+        intent.putExtra(EXTRA_SUBID, subId);
+        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        // Only launch entitlement UI for system user. Entitlement UI should not appear for other
+        // user because only admin user is allowed to change tethering.
+        mContext.startActivity(intent);
+    }
+
+    // Not needed to check if this don't run on the handler thread because it's private.
+    private void scheduleProvisioningRechecks(final TetheringConfiguration config) {
+        if (mProvisioningRecheckAlarm == null) {
+            final int period = config.provisioningCheckPeriod;
+            if (period <= 0) return;
+
+            Intent intent = new Intent(ACTION_PROVISIONING_ALARM);
+            mProvisioningRecheckAlarm = PendingIntent.getBroadcast(mContext, 0, intent, 0);
+            AlarmManager alarmManager = (AlarmManager) mContext.getSystemService(
+                    Context.ALARM_SERVICE);
+            long periodMs = period * MS_PER_HOUR;
+            long firstAlarmTime = SystemClock.elapsedRealtime() + periodMs;
+            alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME, firstAlarmTime, periodMs,
+                    mProvisioningRecheckAlarm);
+        }
+    }
+
+    private void cancelTetherProvisioningRechecks() {
+        if (mProvisioningRecheckAlarm != null) {
+            AlarmManager alarmManager = (AlarmManager) mContext.getSystemService(
+                    Context.ALARM_SERVICE);
+            alarmManager.cancel(mProvisioningRecheckAlarm);
+            mProvisioningRecheckAlarm = null;
+        }
+    }
+
+    private void evaluateCellularPermission(final TetheringConfiguration config) {
+        final boolean oldPermitted = mCellularUpstreamPermitted;
+        mCellularUpstreamPermitted = (!isTetherProvisioningRequired(config)
+                || mCellularPermitted.indexOfValue(TETHER_ERROR_NO_ERROR) > -1);
+
+        if (DBG) {
+            mLog.i("Cellular permission change from " + oldPermitted
+                    + " to " + mCellularUpstreamPermitted);
+        }
+
+        if (mCellularUpstreamPermitted != oldPermitted) {
+            mLog.log("Cellular permission change: " + mCellularUpstreamPermitted);
+            mTetherMasterSM.sendMessage(mPermissionChangeMessageCode);
+        }
+        // Only schedule periodic re-check when tether is provisioned
+        // and the result is ok.
+        if (mCellularUpstreamPermitted && mCellularPermitted.size() > 0) {
+            scheduleProvisioningRechecks(config);
+        } else {
+            cancelTetherProvisioningRechecks();
+        }
+    }
+
+    /**
+     * Add the mapping between provisioning result and tethering type.
+     * Notify UpstreamNetworkMonitor if Cellular permission changes.
+     *
+     * @param type tethering type from TetheringManager.TETHERING_{@code *}
+     * @param resultCode Provisioning result
+     */
+    protected void addDownstreamMapping(int type, int resultCode) {
+        mLog.i("addDownstreamMapping: " + type + ", result: " + resultCode
+                + " ,TetherTypeRequested: " + mCurrentTethers.contains(type));
+        if (!mCurrentTethers.contains(type)) return;
+
+        mCellularPermitted.put(type, resultCode);
+        final TetheringConfiguration config = mFetcher.fetchTetheringConfiguration();
+        evaluateCellularPermission(config);
+    }
+
+    /**
+     * Remove the mapping for input tethering type.
+     * @param type tethering type from TetheringManager.TETHERING_{@code *}
+     */
+    protected void removeDownstreamMapping(int type) {
+        mLog.i("removeDownstreamMapping: " + type);
+        mCellularPermitted.delete(type);
+        final TetheringConfiguration config = mFetcher.fetchTetheringConfiguration();
+        evaluateCellularPermission(config);
+    }
+
+    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            if (ACTION_PROVISIONING_ALARM.equals(intent.getAction())) {
+                mLog.log("Received provisioning alarm");
+                final TetheringConfiguration config = mFetcher.fetchTetheringConfiguration();
+                reevaluateSimCardProvisioning(config);
+            }
+        }
+    };
+
+    private static boolean isValidDownstreamType(int type) {
+        switch (type) {
+            case TETHERING_BLUETOOTH:
+            case TETHERING_ETHERNET:
+            case TETHERING_USB:
+            case TETHERING_WIFI:
+                return true;
+            default:
+                return false;
+        }
+    }
+
+    /**
+     * Dump the infromation of EntitlementManager.
+     * @param pw {@link PrintWriter} is used to print formatted
+     */
+    public void dump(PrintWriter pw) {
+        pw.print("mCellularUpstreamPermitted: ");
+        pw.println(mCellularUpstreamPermitted);
+        for (Integer type : mCurrentTethers) {
+            pw.print("Type: ");
+            pw.print(typeString(type));
+            if (mCellularPermitted.indexOfKey(type) > -1) {
+                pw.print(", Value: ");
+                pw.println(errorString(mCellularPermitted.get(type)));
+            } else {
+                pw.println(", Value: empty");
+            }
+        }
+    }
+
+    private static String typeString(int type) {
+        switch (type) {
+            case TETHERING_BLUETOOTH: return "TETHERING_BLUETOOTH";
+            case TETHERING_INVALID: return "TETHERING_INVALID";
+            case TETHERING_USB: return "TETHERING_USB";
+            case TETHERING_WIFI: return "TETHERING_WIFI";
+            default:
+                return String.format("TETHERING UNKNOWN TYPE (%d)", type);
+        }
+    }
+
+    private static String errorString(int value) {
+        switch (value) {
+            case TETHER_ERROR_ENTITLEMENT_UNKNOWN: return "TETHER_ERROR_ENTITLEMENT_UNKONWN";
+            case TETHER_ERROR_NO_ERROR: return "TETHER_ERROR_NO_ERROR";
+            case TETHER_ERROR_PROVISIONING_FAILED: return "TETHER_ERROR_PROVISIONING_FAILED";
+            default:
+                return String.format("UNKNOWN ERROR (%d)", value);
+        }
+    }
+
+    private ResultReceiver buildProxyReceiver(int type, boolean notifyFail,
+            final ResultReceiver receiver) {
+        ResultReceiver rr = new ResultReceiver(mHandler) {
+            @Override
+            protected void onReceiveResult(int resultCode, Bundle resultData) {
+                int updatedCacheValue = updateEntitlementCacheValue(type, resultCode);
+                addDownstreamMapping(type, updatedCacheValue);
+                if (updatedCacheValue == TETHER_ERROR_PROVISIONING_FAILED && notifyFail) {
+                    mListener.onUiEntitlementFailed(type);
+                }
+                if (receiver != null) receiver.send(updatedCacheValue, null);
+            }
+        };
+
+        return writeToParcel(rr);
+    }
+
+    // Instances of ResultReceiver need to be public classes for remote processes to be able
+    // to load them (otherwise, ClassNotFoundException). For private classes, this method
+    // performs a trick : round-trip parceling any instance of ResultReceiver will return a
+    // vanilla instance of ResultReceiver sharing the binder token with the original receiver.
+    // The binder token has a reference to the original instance of the private class and will
+    // still call its methods, and can be sent over. However it cannot be used for anything
+    // else than sending over a Binder call.
+    // While round-trip parceling is not great, there is currently no other way of generating
+    // a vanilla instance of ResultReceiver because all its fields are private.
+    private ResultReceiver writeToParcel(final ResultReceiver receiver) {
+        Parcel parcel = Parcel.obtain();
+        receiver.writeToParcel(parcel, 0);
+        parcel.setDataPosition(0);
+        ResultReceiver receiverForSending = ResultReceiver.CREATOR.createFromParcel(parcel);
+        parcel.recycle();
+        return receiverForSending;
+    }
+
+    /**
+     * Update the last entitlement value to internal cache
+     *
+     * @param type tethering type from TetheringManager.TETHERING_{@code *}
+     * @param resultCode last entitlement value
+     * @return the last updated entitlement value
+     */
+    private int updateEntitlementCacheValue(int type, int resultCode) {
+        if (DBG) {
+            mLog.i("updateEntitlementCacheValue: " + type + ", result: " + resultCode);
+        }
+        if (resultCode == TETHER_ERROR_NO_ERROR) {
+            mEntitlementCacheValue.put(type, resultCode);
+            return resultCode;
+        } else {
+            mEntitlementCacheValue.put(type, TETHER_ERROR_PROVISIONING_FAILED);
+            return TETHER_ERROR_PROVISIONING_FAILED;
+        }
+    }
+
+    /** Get the last value of the tethering entitlement check. */
+    public void requestLatestTetheringEntitlementResult(int downstream, ResultReceiver receiver,
+            boolean showEntitlementUi) {
+        if (!isValidDownstreamType(downstream)) {
+            receiver.send(TETHER_ERROR_ENTITLEMENT_UNKNOWN, null);
+            return;
+        }
+
+        final TetheringConfiguration config = mFetcher.fetchTetheringConfiguration();
+        if (!isTetherProvisioningRequired(config)) {
+            receiver.send(TETHER_ERROR_NO_ERROR, null);
+            return;
+        }
+
+        final int cacheValue = mEntitlementCacheValue.get(
+                downstream, TETHER_ERROR_ENTITLEMENT_UNKNOWN);
+        if (cacheValue == TETHER_ERROR_NO_ERROR || !showEntitlementUi) {
+            receiver.send(cacheValue, null);
+        } else {
+            ResultReceiver proxy = buildProxyReceiver(downstream, false/* notifyFail */, receiver);
+            runUiTetherProvisioning(downstream, config.activeDataSubId, proxy);
+        }
+    }
+}
diff --git a/packages/Tethering/src/com/android/networkstack/tethering/IPv6TetheringCoordinator.java b/packages/Tethering/src/com/android/networkstack/tethering/IPv6TetheringCoordinator.java
new file mode 100644
index 0000000..d450c46
--- /dev/null
+++ b/packages/Tethering/src/com/android/networkstack/tethering/IPv6TetheringCoordinator.java
@@ -0,0 +1,311 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.networkstack.tethering;
+
+import android.net.IpPrefix;
+import android.net.LinkAddress;
+import android.net.LinkProperties;
+import android.net.Network;
+import android.net.NetworkCapabilities;
+import android.net.RouteInfo;
+import android.net.ip.IpServer;
+import android.net.util.NetworkConstants;
+import android.net.util.SharedLog;
+import android.util.Log;
+
+import java.net.Inet6Address;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.LinkedList;
+import java.util.Random;
+
+
+/**
+ * IPv6 tethering is rather different from IPv4 owing to the absence of NAT.
+ * This coordinator is responsible for evaluating the dedicated prefixes
+ * assigned to the device and deciding how to divvy them up among downstream
+ * interfaces.
+ *
+ * @hide
+ */
+public class IPv6TetheringCoordinator {
+    private static final String TAG = IPv6TetheringCoordinator.class.getSimpleName();
+    private static final boolean DBG = false;
+    private static final boolean VDBG = false;
+
+    private static class Downstream {
+        public final IpServer ipServer;
+        public final int mode;  // IpServer.STATE_*
+        // Used to append to a ULA /48, constructing a ULA /64 for local use.
+        public final short subnetId;
+
+        Downstream(IpServer ipServer, int mode, short subnetId) {
+            this.ipServer = ipServer;
+            this.mode = mode;
+            this.subnetId = subnetId;
+        }
+    }
+
+    private final ArrayList<IpServer> mNotifyList;
+    private final SharedLog mLog;
+    // NOTE: mActiveDownstreams is a list and not a hash data structure because
+    // we keep active downstreams in arrival order.  This is done so /64s can
+    // be parceled out on a "first come, first served" basis and a /64 used by
+    // a downstream that is no longer active can be redistributed to any next
+    // waiting active downstream (again, in arrival order).
+    private final LinkedList<Downstream> mActiveDownstreams;
+    private final byte[] mUniqueLocalPrefix;
+    private short mNextSubnetId;
+    private UpstreamNetworkState mUpstreamNetworkState;
+
+    public IPv6TetheringCoordinator(ArrayList<IpServer> notifyList, SharedLog log) {
+        mNotifyList = notifyList;
+        mLog = log.forSubComponent(TAG);
+        mActiveDownstreams = new LinkedList<>();
+        mUniqueLocalPrefix = generateUniqueLocalPrefix();
+        mNextSubnetId = 0;
+    }
+
+    /** Add active downstream to ipv6 tethering candidate list. */
+    public void addActiveDownstream(IpServer downstream, int mode) {
+        if (findDownstream(downstream) == null) {
+            // Adding a new downstream appends it to the list. Adding a
+            // downstream a second time without first removing it has no effect.
+            // We never change the mode of a downstream except by first removing
+            // it and then re-adding it (with its new mode specified);
+            if (mActiveDownstreams.offer(new Downstream(downstream, mode, mNextSubnetId))) {
+                // Make sure subnet IDs are always positive. They are appended
+                // to a ULA /48 to make a ULA /64 for local use.
+                mNextSubnetId = (short) Math.max(0, mNextSubnetId + 1);
+            }
+            updateIPv6TetheringInterfaces();
+        }
+    }
+
+    /** Remove downstream from ipv6 tethering candidate list. */
+    public void removeActiveDownstream(IpServer downstream) {
+        stopIPv6TetheringOn(downstream);
+        if (mActiveDownstreams.remove(findDownstream(downstream))) {
+            updateIPv6TetheringInterfaces();
+        }
+
+        // When tethering is stopping we can reset the subnet counter.
+        if (mNotifyList.isEmpty()) {
+            if (!mActiveDownstreams.isEmpty()) {
+                Log.wtf(TAG, "Tethering notify list empty, IPv6 downstreams non-empty.");
+            }
+            mNextSubnetId = 0;
+        }
+    }
+
+    /**
+     * Call when UpstreamNetworkState may be changed.
+     * If upstream has ipv6 for tethering, update this new UpstreamNetworkState
+     * to IpServer. Otherwise stop ipv6 tethering on downstream interfaces.
+     */
+    public void updateUpstreamNetworkState(UpstreamNetworkState ns) {
+        if (VDBG) {
+            Log.d(TAG, "updateUpstreamNetworkState: " + toDebugString(ns));
+        }
+        if (TetheringInterfaceUtils.getIPv6Interface(ns) == null) {
+            stopIPv6TetheringOnAllInterfaces();
+            setUpstreamNetworkState(null);
+            return;
+        }
+
+        if (mUpstreamNetworkState != null
+                && !ns.network.equals(mUpstreamNetworkState.network)) {
+            stopIPv6TetheringOnAllInterfaces();
+        }
+
+        setUpstreamNetworkState(ns);
+        updateIPv6TetheringInterfaces();
+    }
+
+    private void stopIPv6TetheringOnAllInterfaces() {
+        for (IpServer ipServer : mNotifyList) {
+            stopIPv6TetheringOn(ipServer);
+        }
+    }
+
+    private void setUpstreamNetworkState(UpstreamNetworkState ns) {
+        if (ns == null) {
+            mUpstreamNetworkState = null;
+        } else {
+            // Make a deep copy of the parts we need.
+            mUpstreamNetworkState = new UpstreamNetworkState(
+                    new LinkProperties(ns.linkProperties),
+                    new NetworkCapabilities(ns.networkCapabilities),
+                    new Network(ns.network));
+        }
+
+        mLog.log("setUpstreamNetworkState: " + toDebugString(mUpstreamNetworkState));
+    }
+
+    private void updateIPv6TetheringInterfaces() {
+        for (IpServer ipServer : mNotifyList) {
+            final LinkProperties lp = getInterfaceIPv6LinkProperties(ipServer);
+            ipServer.sendMessage(IpServer.CMD_IPV6_TETHER_UPDATE, 0, 0, lp);
+            break;
+        }
+    }
+
+    private LinkProperties getInterfaceIPv6LinkProperties(IpServer ipServer) {
+        final Downstream ds = findDownstream(ipServer);
+        if (ds == null) return null;
+
+        if (ds.mode == IpServer.STATE_LOCAL_ONLY) {
+            // Build a Unique Locally-assigned Prefix configuration.
+            return getUniqueLocalConfig(mUniqueLocalPrefix, ds.subnetId);
+        }
+
+        // This downstream is in IpServer.STATE_TETHERED mode.
+        if (mUpstreamNetworkState == null || mUpstreamNetworkState.linkProperties == null) {
+            return null;
+        }
+
+        // NOTE: Here, in future, we would have policies to decide how to divvy
+        // up the available dedicated prefixes among downstream interfaces.
+        // At this time we have no such mechanism--we only support tethering
+        // IPv6 toward the oldest (first requested) active downstream.
+
+        final Downstream currentActive = mActiveDownstreams.peek();
+        if (currentActive != null && currentActive.ipServer == ipServer) {
+            final LinkProperties lp = getIPv6OnlyLinkProperties(
+                    mUpstreamNetworkState.linkProperties);
+            if (lp.hasIpv6DefaultRoute() && lp.hasGlobalIpv6Address()) {
+                return lp;
+            }
+        }
+
+        return null;
+    }
+
+    Downstream findDownstream(IpServer ipServer) {
+        for (Downstream ds : mActiveDownstreams) {
+            if (ds.ipServer == ipServer) return ds;
+        }
+        return null;
+    }
+
+    private static LinkProperties getIPv6OnlyLinkProperties(LinkProperties lp) {
+        final LinkProperties v6only = new LinkProperties();
+        if (lp == null) {
+            return v6only;
+        }
+
+        // NOTE: At this time we don't copy over any information about any
+        // stacked links. No current stacked link configuration has IPv6.
+
+        v6only.setInterfaceName(lp.getInterfaceName());
+
+        v6only.setMtu(lp.getMtu());
+
+        for (LinkAddress linkAddr : lp.getLinkAddresses()) {
+            if (linkAddr.isGlobalPreferred() && linkAddr.getPrefixLength() == 64) {
+                v6only.addLinkAddress(linkAddr);
+            }
+        }
+
+        for (RouteInfo routeInfo : lp.getRoutes()) {
+            final IpPrefix destination = routeInfo.getDestination();
+            if ((destination.getAddress() instanceof Inet6Address)
+                    && (destination.getPrefixLength() <= 64)) {
+                v6only.addRoute(routeInfo);
+            }
+        }
+
+        for (InetAddress dnsServer : lp.getDnsServers()) {
+            if (isIPv6GlobalAddress(dnsServer)) {
+                // For now we include ULAs.
+                v6only.addDnsServer(dnsServer);
+            }
+        }
+
+        v6only.setDomains(lp.getDomains());
+
+        return v6only;
+    }
+
+    // TODO: Delete this and switch to LinkAddress#isGlobalPreferred once we
+    // announce our own IPv6 address as DNS server.
+    private static boolean isIPv6GlobalAddress(InetAddress ip) {
+        return (ip instanceof Inet6Address)
+               && !ip.isAnyLocalAddress()
+               && !ip.isLoopbackAddress()
+               && !ip.isLinkLocalAddress()
+               && !ip.isSiteLocalAddress()
+               && !ip.isMulticastAddress();
+    }
+
+    private static LinkProperties getUniqueLocalConfig(byte[] ulp, short subnetId) {
+        final LinkProperties lp = new LinkProperties();
+
+        final IpPrefix local48 = makeUniqueLocalPrefix(ulp, (short) 0, 48);
+        lp.addRoute(new RouteInfo(local48, null, null, RouteInfo.RTN_UNICAST));
+
+        final IpPrefix local64 = makeUniqueLocalPrefix(ulp, subnetId, 64);
+        // Because this is a locally-generated ULA, we don't have an upstream
+        // address. But because the downstream IP address management code gets
+        // its prefix from the upstream's IP address, we create a fake one here.
+        lp.addLinkAddress(new LinkAddress(local64.getAddress(), 64));
+
+        lp.setMtu(NetworkConstants.ETHER_MTU);
+        return lp;
+    }
+
+    private static IpPrefix makeUniqueLocalPrefix(byte[] in6addr, short subnetId, int prefixlen) {
+        final byte[] bytes = Arrays.copyOf(in6addr, in6addr.length);
+        bytes[7] = (byte) (subnetId >> 8);
+        bytes[8] = (byte) subnetId;
+        final InetAddress addr;
+        try {
+            addr = InetAddress.getByAddress(bytes);
+        } catch (UnknownHostException e) {
+            throw new IllegalStateException("Invalid address length: " + bytes.length, e);
+        }
+        return new IpPrefix(addr, prefixlen);
+    }
+
+    // Generates a Unique Locally-assigned Prefix:
+    //
+    //     https://tools.ietf.org/html/rfc4193#section-3.1
+    //
+    // The result is a /48 that can be used for local-only communications.
+    private static byte[] generateUniqueLocalPrefix() {
+        final byte[] ulp = new byte[6];  // 6 = 48bits / 8bits/byte
+        (new Random()).nextBytes(ulp);
+
+        final byte[] in6addr = Arrays.copyOf(ulp, NetworkConstants.IPV6_ADDR_LEN);
+        in6addr[0] = (byte) 0xfd;  // fc00::/7 and L=1
+
+        return in6addr;
+    }
+
+    private static String toDebugString(UpstreamNetworkState ns) {
+        if (ns == null) {
+            return "UpstreamNetworkState{null}";
+        }
+        return ns.toString();
+    }
+
+    private static void stopIPv6TetheringOn(IpServer ipServer) {
+        ipServer.sendMessage(IpServer.CMD_IPV6_TETHER_UPDATE, 0, 0, null);
+    }
+}
diff --git a/packages/Tethering/src/com/android/networkstack/tethering/OffloadController.java b/packages/Tethering/src/com/android/networkstack/tethering/OffloadController.java
new file mode 100644
index 0000000..c007c17
--- /dev/null
+++ b/packages/Tethering/src/com/android/networkstack/tethering/OffloadController.java
@@ -0,0 +1,721 @@
+/*
+ * Copyright (C) 2017 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.networkstack.tethering;
+
+import static android.net.NetworkStats.DEFAULT_NETWORK_NO;
+import static android.net.NetworkStats.METERED_NO;
+import static android.net.NetworkStats.ROAMING_NO;
+import static android.net.NetworkStats.SET_DEFAULT;
+import static android.net.NetworkStats.TAG_NONE;
+import static android.net.NetworkStats.UID_ALL;
+import static android.net.NetworkStats.UID_TETHERING;
+import static android.provider.Settings.Global.TETHER_OFFLOAD_DISABLED;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.app.usage.NetworkStatsManager;
+import android.content.ContentResolver;
+import android.net.InetAddresses;
+import android.net.IpPrefix;
+import android.net.LinkAddress;
+import android.net.LinkProperties;
+import android.net.NetworkStats;
+import android.net.NetworkStats.Entry;
+import android.net.RouteInfo;
+import android.net.netlink.ConntrackMessage;
+import android.net.netlink.NetlinkConstants;
+import android.net.netlink.NetlinkSocket;
+import android.net.netstats.provider.NetworkStatsProvider;
+import android.net.util.SharedLog;
+import android.os.Handler;
+import android.provider.Settings;
+import android.system.ErrnoException;
+import android.system.OsConstants;
+import android.text.TextUtils;
+import android.util.Log;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.util.IndentingPrintWriter;
+import com.android.networkstack.tethering.OffloadHardwareInterface.ForwardedStats;
+
+import java.net.Inet4Address;
+import java.net.Inet6Address;
+import java.net.InetAddress;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * A class to encapsulate the business logic of programming the tethering
+ * hardware offload interface.
+ *
+ * @hide
+ */
+public class OffloadController {
+    private static final String TAG = OffloadController.class.getSimpleName();
+    private static final boolean DBG = false;
+    private static final String ANYIP = "0.0.0.0";
+    private static final ForwardedStats EMPTY_STATS = new ForwardedStats();
+
+    @VisibleForTesting
+    enum StatsType {
+        STATS_PER_IFACE,
+        STATS_PER_UID,
+    }
+
+    private enum UpdateType { IF_NEEDED, FORCE };
+
+    private final Handler mHandler;
+    private final OffloadHardwareInterface mHwInterface;
+    private final ContentResolver mContentResolver;
+    @Nullable
+    private final OffloadTetheringStatsProvider mStatsProvider;
+    private final SharedLog mLog;
+    private final HashMap<String, LinkProperties> mDownstreams;
+    private boolean mConfigInitialized;
+    private boolean mControlInitialized;
+    private LinkProperties mUpstreamLinkProperties;
+    // The complete set of offload-exempt prefixes passed in via Tethering from
+    // all upstream and downstream sources.
+    private Set<IpPrefix> mExemptPrefixes;
+    // A strictly "smaller" set of prefixes, wherein offload-approved prefixes
+    // (e.g. downstream on-link prefixes) have been removed and replaced with
+    // prefixes representing only the locally-assigned IP addresses.
+    private Set<String> mLastLocalPrefixStrs;
+
+    // Maps upstream interface names to offloaded traffic statistics.
+    // Always contains the latest value received from the hardware for each interface, regardless of
+    // whether offload is currently running on that interface.
+    private ConcurrentHashMap<String, ForwardedStats> mForwardedStats =
+            new ConcurrentHashMap<>(16, 0.75F, 1);
+
+    // Maps upstream interface names to interface quotas.
+    // Always contains the latest value received from the framework for each interface, regardless
+    // of whether offload is currently running (or is even supported) on that interface. Only
+    // includes upstream interfaces that have a quota set.
+    private HashMap<String, Long> mInterfaceQuotas = new HashMap<>();
+
+    private int mNatUpdateCallbacksReceived;
+    private int mNatUpdateNetlinkErrors;
+
+    public OffloadController(Handler h, OffloadHardwareInterface hwi,
+            ContentResolver contentResolver, NetworkStatsManager nsm, SharedLog log) {
+        mHandler = h;
+        mHwInterface = hwi;
+        mContentResolver = contentResolver;
+        mLog = log.forSubComponent(TAG);
+        mDownstreams = new HashMap<>();
+        mExemptPrefixes = new HashSet<>();
+        mLastLocalPrefixStrs = new HashSet<>();
+        OffloadTetheringStatsProvider provider = new OffloadTetheringStatsProvider();
+        try {
+            nsm.registerNetworkStatsProvider(getClass().getSimpleName(), provider);
+        } catch (RuntimeException e) {
+            Log.wtf(TAG, "Cannot register offload stats provider: " + e);
+            provider = null;
+        }
+        mStatsProvider = provider;
+    }
+
+    /** Start hardware offload. */
+    public boolean start() {
+        if (started()) return true;
+
+        if (isOffloadDisabled()) {
+            mLog.i("tethering offload disabled");
+            return false;
+        }
+
+        if (!mConfigInitialized) {
+            mConfigInitialized = mHwInterface.initOffloadConfig();
+            if (!mConfigInitialized) {
+                mLog.i("tethering offload config not supported");
+                stop();
+                return false;
+            }
+        }
+
+        mControlInitialized = mHwInterface.initOffloadControl(
+                // OffloadHardwareInterface guarantees that these callback
+                // methods are called on the handler passed to it, which is the
+                // same as mHandler, as coordinated by the setup in Tethering.
+                new OffloadHardwareInterface.ControlCallback() {
+                    @Override
+                    public void onStarted() {
+                        if (!started()) return;
+                        mLog.log("onStarted");
+                    }
+
+                    @Override
+                    public void onStoppedError() {
+                        if (!started()) return;
+                        mLog.log("onStoppedError");
+                    }
+
+                    @Override
+                    public void onStoppedUnsupported() {
+                        if (!started()) return;
+                        mLog.log("onStoppedUnsupported");
+                        // Poll for statistics and trigger a sweep of tethering
+                        // stats by observers. This might not succeed, but it's
+                        // worth trying anyway. We need to do this because from
+                        // this point on we continue with software forwarding,
+                        // and we need to synchronize stats and limits between
+                        // software and hardware forwarding.
+                        updateStatsForAllUpstreams();
+                        if (mStatsProvider != null) mStatsProvider.pushTetherStats();
+                    }
+
+                    @Override
+                    public void onSupportAvailable() {
+                        if (!started()) return;
+                        mLog.log("onSupportAvailable");
+
+                        // [1] Poll for statistics and trigger a sweep of stats
+                        // by observers. We need to do this to ensure that any
+                        // limits set take into account any software tethering
+                        // traffic that has been happening in the meantime.
+                        updateStatsForAllUpstreams();
+                        if (mStatsProvider != null) mStatsProvider.pushTetherStats();
+                        // [2] (Re)Push all state.
+                        computeAndPushLocalPrefixes(UpdateType.FORCE);
+                        pushAllDownstreamState();
+                        pushUpstreamParameters(null);
+                    }
+
+                    @Override
+                    public void onStoppedLimitReached() {
+                        if (!started()) return;
+                        mLog.log("onStoppedLimitReached");
+
+                        // We cannot reliably determine on which interface the limit was reached,
+                        // because the HAL interface does not specify it. We cannot just use the
+                        // current upstream, because that might have changed since the time that
+                        // the HAL queued the callback.
+                        // TODO: rev the HAL so that it provides an interface name.
+
+                        updateStatsForCurrentUpstream();
+                        if (mStatsProvider != null) {
+                            mStatsProvider.pushTetherStats();
+                            // Push stats to service does not cause the service react to it
+                            // immediately. Inform the service about limit reached.
+                            mStatsProvider.notifyLimitReached();
+                        }
+                    }
+
+                    @Override
+                    public void onNatTimeoutUpdate(int proto,
+                                                   String srcAddr, int srcPort,
+                                                   String dstAddr, int dstPort) {
+                        if (!started()) return;
+                        updateNatTimeout(proto, srcAddr, srcPort, dstAddr, dstPort);
+                    }
+                });
+
+        final boolean isStarted = started();
+        if (!isStarted) {
+            mLog.i("tethering offload control not supported");
+            stop();
+        } else {
+            mLog.log("tethering offload started");
+            mNatUpdateCallbacksReceived = 0;
+            mNatUpdateNetlinkErrors = 0;
+        }
+        return isStarted;
+    }
+
+    /** Stop hardware offload. */
+    public void stop() {
+        // Completely stops tethering offload. After this method is called, it is no longer safe to
+        // call any HAL method, no callbacks from the hardware will be delivered, and any in-flight
+        // callbacks must be ignored. Offload may be started again by calling start().
+        final boolean wasStarted = started();
+        updateStatsForCurrentUpstream();
+        mUpstreamLinkProperties = null;
+        mHwInterface.stopOffloadControl();
+        mControlInitialized = false;
+        mConfigInitialized = false;
+        if (wasStarted) mLog.log("tethering offload stopped");
+    }
+
+    private boolean started() {
+        return mConfigInitialized && mControlInitialized;
+    }
+
+    @VisibleForTesting
+    class OffloadTetheringStatsProvider extends NetworkStatsProvider {
+        // These stats must only ever be touched on the handler thread.
+        @NonNull
+        private NetworkStats mIfaceStats = new NetworkStats(0L, 0);
+        @NonNull
+        private NetworkStats mUidStats = new NetworkStats(0L, 0);
+
+        /**
+         * A helper function that collect tether stats from local hashmap. Note that this does not
+         * invoke binder call.
+         */
+        @VisibleForTesting
+        @NonNull
+        NetworkStats getTetherStats(@NonNull StatsType how) {
+            NetworkStats stats = new NetworkStats(0L, 0);
+            final int uid = (how == StatsType.STATS_PER_UID) ? UID_TETHERING : UID_ALL;
+
+            for (final Map.Entry<String, ForwardedStats> kv : mForwardedStats.entrySet()) {
+                final ForwardedStats value = kv.getValue();
+                final Entry entry = new Entry(kv.getKey(), uid, SET_DEFAULT, TAG_NONE, METERED_NO,
+                        ROAMING_NO, DEFAULT_NETWORK_NO, value.rxBytes, 0L, value.txBytes, 0L, 0L);
+                stats = stats.addEntry(entry);
+            }
+
+            return stats;
+        }
+
+        @Override
+        public void onSetLimit(String iface, long quotaBytes) {
+            // Listen for all iface is necessary since upstream might be changed after limit
+            // is set.
+            mHandler.post(() -> {
+                final Long curIfaceQuota = mInterfaceQuotas.get(iface);
+
+                // If the quota is set to unlimited, the value set to HAL is Long.MAX_VALUE,
+                // which is ~8.4 x 10^6 TiB, no one can actually reach it. Thus, it is not
+                // useful to set it multiple times.
+                // Otherwise, the quota needs to be updated to tell HAL to re-count from now even
+                // if the quota is the same as the existing one.
+                if (null == curIfaceQuota && QUOTA_UNLIMITED == quotaBytes) return;
+
+                if (quotaBytes == QUOTA_UNLIMITED) {
+                    mInterfaceQuotas.remove(iface);
+                } else {
+                    mInterfaceQuotas.put(iface, quotaBytes);
+                }
+                maybeUpdateDataLimit(iface);
+            });
+        }
+
+        /**
+         * Push stats to service, but does not cause a force polling. Note that this can only be
+         * called on the handler thread.
+         */
+        public void pushTetherStats() {
+            // TODO: remove the accumulated stats and report the diff from HAL directly.
+            final NetworkStats ifaceDiff =
+                    getTetherStats(StatsType.STATS_PER_IFACE).subtract(mIfaceStats);
+            final NetworkStats uidDiff =
+                    getTetherStats(StatsType.STATS_PER_UID).subtract(mUidStats);
+            try {
+                notifyStatsUpdated(0 /* token */, ifaceDiff, uidDiff);
+                mIfaceStats = mIfaceStats.add(ifaceDiff);
+                mUidStats = mUidStats.add(uidDiff);
+            } catch (RuntimeException e) {
+                mLog.e("Cannot report network stats: ", e);
+            }
+        }
+
+        @Override
+        public void onRequestStatsUpdate(int token) {
+            // Do not attempt to update stats by querying the offload HAL
+            // synchronously from a different thread than the Handler thread. http://b/64771555.
+            mHandler.post(() -> {
+                updateStatsForCurrentUpstream();
+                pushTetherStats();
+            });
+        }
+
+        @Override
+        public void onSetAlert(long quotaBytes) {
+            // TODO: Ask offload HAL to notify alert without stopping traffic.
+        }
+    }
+
+    private String currentUpstreamInterface() {
+        return (mUpstreamLinkProperties != null)
+                ? mUpstreamLinkProperties.getInterfaceName() : null;
+    }
+
+    private void maybeUpdateStats(String iface) {
+        if (TextUtils.isEmpty(iface)) {
+            return;
+        }
+
+        // Always called on the handler thread.
+        //
+        // Use get()/put() instead of updating ForwardedStats in place because we can be called
+        // concurrently with getTetherStats. In combination with the guarantees provided by
+        // ConcurrentHashMap, this ensures that getTetherStats always gets the most recent copy of
+        // the stats for each interface, and does not observe partial writes where rxBytes is
+        // updated and txBytes is not.
+        ForwardedStats diff = mHwInterface.getForwardedStats(iface);
+        ForwardedStats base = mForwardedStats.get(iface);
+        if (base != null) {
+            diff.add(base);
+        }
+        mForwardedStats.put(iface, diff);
+        // diff is a new object, just created by getForwardedStats(). Therefore, anyone reading from
+        // mForwardedStats (i.e., any caller of getTetherStats) will see the new stats immediately.
+    }
+
+    private boolean maybeUpdateDataLimit(String iface) {
+        // setDataLimit may only be called while offload is occurring on this upstream.
+        if (!started() || !TextUtils.equals(iface, currentUpstreamInterface())) {
+            return true;
+        }
+
+        Long limit = mInterfaceQuotas.get(iface);
+        if (limit == null) {
+            limit = Long.MAX_VALUE;
+        }
+
+        return mHwInterface.setDataLimit(iface, limit);
+    }
+
+    private void updateStatsForCurrentUpstream() {
+        maybeUpdateStats(currentUpstreamInterface());
+    }
+
+    private void updateStatsForAllUpstreams() {
+        // In practice, there should only ever be a single digit number of
+        // upstream interfaces over the lifetime of an active tethering session.
+        // Roughly speaking, imagine a very ambitious one or two of each of the
+        // following interface types: [ "rmnet_data", "wlan", "eth", "rndis" ].
+        for (Map.Entry<String, ForwardedStats> kv : mForwardedStats.entrySet()) {
+            maybeUpdateStats(kv.getKey());
+        }
+    }
+
+    /** Set current tethering upstream LinkProperties. */
+    public void setUpstreamLinkProperties(LinkProperties lp) {
+        if (!started() || Objects.equals(mUpstreamLinkProperties, lp)) return;
+
+        final String prevUpstream = currentUpstreamInterface();
+
+        mUpstreamLinkProperties = (lp != null) ? new LinkProperties(lp) : null;
+        // Make sure we record this interface in the ForwardedStats map.
+        final String iface = currentUpstreamInterface();
+        if (!TextUtils.isEmpty(iface)) mForwardedStats.putIfAbsent(iface, EMPTY_STATS);
+
+        // TODO: examine return code and decide what to do if programming
+        // upstream parameters fails (probably just wait for a subsequent
+        // onOffloadEvent() callback to tell us offload is available again and
+        // then reapply all state).
+        computeAndPushLocalPrefixes(UpdateType.IF_NEEDED);
+        pushUpstreamParameters(prevUpstream);
+    }
+
+    /** Set local prefixes. */
+    public void setLocalPrefixes(Set<IpPrefix> localPrefixes) {
+        mExemptPrefixes = localPrefixes;
+
+        if (!started()) return;
+        computeAndPushLocalPrefixes(UpdateType.IF_NEEDED);
+    }
+
+    /** Update current downstream LinkProperties. */
+    public void notifyDownstreamLinkProperties(LinkProperties lp) {
+        final String ifname = lp.getInterfaceName();
+        final LinkProperties oldLp = mDownstreams.put(ifname, new LinkProperties(lp));
+        if (Objects.equals(oldLp, lp)) return;
+
+        if (!started()) return;
+        pushDownstreamState(oldLp, lp);
+    }
+
+    private void pushDownstreamState(LinkProperties oldLp, LinkProperties newLp) {
+        final String ifname = newLp.getInterfaceName();
+        final List<RouteInfo> oldRoutes =
+                (oldLp != null) ? oldLp.getRoutes() : Collections.EMPTY_LIST;
+        final List<RouteInfo> newRoutes = newLp.getRoutes();
+
+        // For each old route, if not in new routes: remove.
+        for (RouteInfo ri : oldRoutes) {
+            if (shouldIgnoreDownstreamRoute(ri)) continue;
+            if (!newRoutes.contains(ri)) {
+                mHwInterface.removeDownstreamPrefix(ifname, ri.getDestination().toString());
+            }
+        }
+
+        // For each new route, if not in old routes: add.
+        for (RouteInfo ri : newRoutes) {
+            if (shouldIgnoreDownstreamRoute(ri)) continue;
+            if (!oldRoutes.contains(ri)) {
+                mHwInterface.addDownstreamPrefix(ifname, ri.getDestination().toString());
+            }
+        }
+    }
+
+    private void pushAllDownstreamState() {
+        for (LinkProperties lp : mDownstreams.values()) {
+            pushDownstreamState(null, lp);
+        }
+    }
+
+    /** Remove downstream interface from offload hardware. */
+    public void removeDownstreamInterface(String ifname) {
+        final LinkProperties lp = mDownstreams.remove(ifname);
+        if (lp == null) return;
+
+        if (!started()) return;
+
+        for (RouteInfo route : lp.getRoutes()) {
+            if (shouldIgnoreDownstreamRoute(route)) continue;
+            mHwInterface.removeDownstreamPrefix(ifname, route.getDestination().toString());
+        }
+    }
+
+    private boolean isOffloadDisabled() {
+        final int defaultDisposition = mHwInterface.getDefaultTetherOffloadDisabled();
+        return (Settings.Global.getInt(
+                mContentResolver, TETHER_OFFLOAD_DISABLED, defaultDisposition) != 0);
+    }
+
+    private boolean pushUpstreamParameters(String prevUpstream) {
+        final String iface = currentUpstreamInterface();
+
+        if (TextUtils.isEmpty(iface)) {
+            final boolean rval = mHwInterface.setUpstreamParameters("", ANYIP, ANYIP, null);
+            // Update stats after we've told the hardware to stop forwarding so
+            // we don't miss packets.
+            maybeUpdateStats(prevUpstream);
+            return rval;
+        }
+
+        // A stacked interface cannot be an upstream for hardware offload.
+        // Consequently, we examine only the primary interface name, look at
+        // getAddresses() rather than getAllAddresses(), and check getRoutes()
+        // rather than getAllRoutes().
+        final ArrayList<String> v6gateways = new ArrayList<>();
+        String v4addr = null;
+        String v4gateway = null;
+
+        for (InetAddress ip : mUpstreamLinkProperties.getAddresses()) {
+            if (ip instanceof Inet4Address) {
+                v4addr = ip.getHostAddress();
+                break;
+            }
+        }
+
+        // Find the gateway addresses of all default routes of either address family.
+        for (RouteInfo ri : mUpstreamLinkProperties.getRoutes()) {
+            if (!ri.hasGateway()) continue;
+
+            final String gateway = ri.getGateway().getHostAddress();
+            final InetAddress address = ri.getDestination().getAddress();
+            if (ri.isDefaultRoute() && address instanceof Inet4Address) {
+                v4gateway = gateway;
+            } else if (ri.isDefaultRoute() && address instanceof Inet6Address) {
+                v6gateways.add(gateway);
+            }
+        }
+
+        boolean success = mHwInterface.setUpstreamParameters(
+                iface, v4addr, v4gateway, (v6gateways.isEmpty() ? null : v6gateways));
+
+        if (!success) {
+            return success;
+        }
+
+        // Update stats after we've told the hardware to change routing so we don't miss packets.
+        maybeUpdateStats(prevUpstream);
+
+        // Data limits can only be set once offload is running on the upstream.
+        success = maybeUpdateDataLimit(iface);
+        if (!success) {
+            // If we failed to set a data limit, don't use this upstream, because we don't want to
+            // blow through the data limit that we were told to apply.
+            mLog.log("Setting data limit for " + iface + " failed, disabling offload.");
+            stop();
+        }
+
+        return success;
+    }
+
+    private boolean computeAndPushLocalPrefixes(UpdateType how) {
+        final boolean force = (how == UpdateType.FORCE);
+        final Set<String> localPrefixStrs = computeLocalPrefixStrings(
+                mExemptPrefixes, mUpstreamLinkProperties);
+        if (!force && mLastLocalPrefixStrs.equals(localPrefixStrs)) return true;
+
+        mLastLocalPrefixStrs = localPrefixStrs;
+        return mHwInterface.setLocalPrefixes(new ArrayList<>(localPrefixStrs));
+    }
+
+    // TODO: Factor in downstream LinkProperties once that information is available.
+    private static Set<String> computeLocalPrefixStrings(
+            Set<IpPrefix> localPrefixes, LinkProperties upstreamLinkProperties) {
+        // Create an editable copy.
+        final Set<IpPrefix> prefixSet = new HashSet<>(localPrefixes);
+
+        // TODO: If a downstream interface (not currently passed in) is reusing
+        // the /64 of the upstream (64share) then:
+        //
+        //     [a] remove that /64 from the local prefixes
+        //     [b] add in /128s for IP addresses on the downstream interface
+        //     [c] add in /128s for IP addresses on the upstream interface
+        //
+        // Until downstream information is available here, simply add /128s from
+        // the upstream network; they'll just be redundant with their /64.
+        if (upstreamLinkProperties != null) {
+            for (LinkAddress linkAddr : upstreamLinkProperties.getLinkAddresses()) {
+                if (!linkAddr.isGlobalPreferred()) continue;
+                final InetAddress ip = linkAddr.getAddress();
+                if (!(ip instanceof Inet6Address)) continue;
+                prefixSet.add(new IpPrefix(ip, 128));
+            }
+        }
+
+        final HashSet<String> localPrefixStrs = new HashSet<>();
+        for (IpPrefix pfx : prefixSet) localPrefixStrs.add(pfx.toString());
+        return localPrefixStrs;
+    }
+
+    private static boolean shouldIgnoreDownstreamRoute(RouteInfo route) {
+        // Ignore any link-local routes.
+        final IpPrefix destination = route.getDestination();
+        final LinkAddress linkAddr = new LinkAddress(destination.getAddress(),
+                destination.getPrefixLength());
+        if (!linkAddr.isGlobalPreferred()) return true;
+
+        return false;
+    }
+
+    /** Dump information. */
+    public void dump(IndentingPrintWriter pw) {
+        if (isOffloadDisabled()) {
+            pw.println("Offload disabled");
+            return;
+        }
+        final boolean isStarted = started();
+        pw.println("Offload HALs " + (isStarted ? "started" : "not started"));
+        LinkProperties lp = mUpstreamLinkProperties;
+        String upstream = (lp != null) ? lp.getInterfaceName() : null;
+        pw.println("Current upstream: " + upstream);
+        pw.println("Exempt prefixes: " + mLastLocalPrefixStrs);
+        pw.println("NAT timeout update callbacks received during the "
+                + (isStarted ? "current" : "last")
+                + " offload session: "
+                + mNatUpdateCallbacksReceived);
+        pw.println("NAT timeout update netlink errors during the "
+                + (isStarted ? "current" : "last")
+                + " offload session: "
+                + mNatUpdateNetlinkErrors);
+    }
+
+    private void updateNatTimeout(
+            int proto, String srcAddr, int srcPort, String dstAddr, int dstPort) {
+        final String protoName = protoNameFor(proto);
+        if (protoName == null) {
+            mLog.e("Unknown NAT update callback protocol: " + proto);
+            return;
+        }
+
+        final Inet4Address src = parseIPv4Address(srcAddr);
+        if (src == null) {
+            mLog.e("Failed to parse IPv4 address: " + srcAddr);
+            return;
+        }
+
+        if (!isValidUdpOrTcpPort(srcPort)) {
+            mLog.e("Invalid src port: " + srcPort);
+            return;
+        }
+
+        final Inet4Address dst = parseIPv4Address(dstAddr);
+        if (dst == null) {
+            mLog.e("Failed to parse IPv4 address: " + dstAddr);
+            return;
+        }
+
+        if (!isValidUdpOrTcpPort(dstPort)) {
+            mLog.e("Invalid dst port: " + dstPort);
+            return;
+        }
+
+        mNatUpdateCallbacksReceived++;
+        final String natDescription = String.format("%s (%s, %s) -> (%s, %s)",
+                protoName, srcAddr, srcPort, dstAddr, dstPort);
+        if (DBG) {
+            mLog.log("NAT timeout update: " + natDescription);
+        }
+
+        final int timeoutSec = connectionTimeoutUpdateSecondsFor(proto);
+        final byte[] msg = ConntrackMessage.newIPv4TimeoutUpdateRequest(
+                proto, src, srcPort, dst, dstPort, timeoutSec);
+
+        try {
+            NetlinkSocket.sendOneShotKernelMessage(OsConstants.NETLINK_NETFILTER, msg);
+        } catch (ErrnoException e) {
+            mNatUpdateNetlinkErrors++;
+            mLog.e("Error updating NAT conntrack entry >" + natDescription + "<: " + e
+                    + ", msg: " + NetlinkConstants.hexify(msg));
+            mLog.log("NAT timeout update callbacks received: " + mNatUpdateCallbacksReceived);
+            mLog.log("NAT timeout update netlink errors: " + mNatUpdateNetlinkErrors);
+        }
+    }
+
+    private static Inet4Address parseIPv4Address(String addrString) {
+        try {
+            final InetAddress ip = InetAddresses.parseNumericAddress(addrString);
+            // TODO: Consider other sanitization steps here, including perhaps:
+            //           not eql to 0.0.0.0
+            //           not within 169.254.0.0/16
+            //           not within ::ffff:0.0.0.0/96
+            //           not within ::/96
+            // et cetera.
+            if (ip instanceof Inet4Address) {
+                return (Inet4Address) ip;
+            }
+        } catch (IllegalArgumentException iae) { }
+        return null;
+    }
+
+    private static String protoNameFor(int proto) {
+        // OsConstants values are not constant expressions; no switch statement.
+        if (proto == OsConstants.IPPROTO_UDP) {
+            return "UDP";
+        } else if (proto == OsConstants.IPPROTO_TCP) {
+            return "TCP";
+        }
+        return null;
+    }
+
+    private static int connectionTimeoutUpdateSecondsFor(int proto) {
+        // TODO: Replace this with more thoughtful work, perhaps reading from
+        // and maybe writing to any required
+        //
+        //     /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_*
+        //     /proc/sys/net/netfilter/nf_conntrack_udp_timeout{,_stream}
+        //
+        // entries.  TBD.
+        if (proto == OsConstants.IPPROTO_TCP) {
+            // Cf. /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_established
+            return 432000;
+        } else {
+            // Cf. /proc/sys/net/netfilter/nf_conntrack_udp_timeout_stream
+            return 180;
+        }
+    }
+
+    private static boolean isValidUdpOrTcpPort(int port) {
+        return port > 0 && port < 65536;
+    }
+}
diff --git a/packages/Tethering/src/com/android/networkstack/tethering/OffloadHardwareInterface.java b/packages/Tethering/src/com/android/networkstack/tethering/OffloadHardwareInterface.java
new file mode 100644
index 0000000..55344fc
--- /dev/null
+++ b/packages/Tethering/src/com/android/networkstack/tethering/OffloadHardwareInterface.java
@@ -0,0 +1,509 @@
+/*
+ * Copyright (C) 2017 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.networkstack.tethering;
+
+import static android.net.util.TetheringUtils.uint16;
+
+import android.hardware.tetheroffload.config.V1_0.IOffloadConfig;
+import android.hardware.tetheroffload.control.V1_0.IOffloadControl;
+import android.hardware.tetheroffload.control.V1_0.ITetheringOffloadCallback;
+import android.hardware.tetheroffload.control.V1_0.NatTimeoutUpdate;
+import android.hardware.tetheroffload.control.V1_0.NetworkProtocol;
+import android.hardware.tetheroffload.control.V1_0.OffloadCallbackEvent;
+import android.net.netlink.NetlinkSocket;
+import android.net.util.SharedLog;
+import android.net.util.SocketUtils;
+import android.os.Handler;
+import android.os.NativeHandle;
+import android.os.RemoteException;
+import android.system.ErrnoException;
+import android.system.Os;
+import android.system.OsConstants;
+
+import com.android.internal.annotations.VisibleForTesting;
+
+import java.io.FileDescriptor;
+import java.io.IOException;
+import java.net.SocketAddress;
+import java.net.SocketException;
+import java.util.ArrayList;
+
+
+/**
+ * Capture tethering dependencies, for injection.
+ *
+ * @hide
+ */
+public class OffloadHardwareInterface {
+    private static final String TAG = OffloadHardwareInterface.class.getSimpleName();
+    private static final String YIELDS = " -> ";
+    // Change this value to control whether tether offload is enabled or
+    // disabled by default in the absence of an explicit Settings value.
+    // See accompanying unittest to distinguish 0 from non-0 values.
+    private static final int DEFAULT_TETHER_OFFLOAD_DISABLED = 0;
+    private static final String NO_INTERFACE_NAME = "";
+    private static final String NO_IPV4_ADDRESS = "";
+    private static final String NO_IPV4_GATEWAY = "";
+    // Reference kernel/uapi/linux/netfilter/nfnetlink_compat.h
+    private static final int NF_NETLINK_CONNTRACK_NEW = 1;
+    private static final int NF_NETLINK_CONNTRACK_UPDATE = 2;
+    private static final int NF_NETLINK_CONNTRACK_DESTROY = 4;
+
+    private final Handler mHandler;
+    private final SharedLog mLog;
+    private IOffloadControl mOffloadControl;
+    private TetheringOffloadCallback mTetheringOffloadCallback;
+    private ControlCallback mControlCallback;
+
+    /** The callback to notify status of offload management process. */
+    public static class ControlCallback {
+        /** Offload started. */
+        public void onStarted() {}
+        /**
+         * Offload stopped because an error has occurred in lower layer.
+         */
+        public void onStoppedError() {}
+        /**
+         * Offload stopped because the device has moved to a bearer on which hardware offload is
+         * not supported. Subsequent calls to setUpstreamParameters and add/removeDownstream will
+         * likely fail and cannot be presumed to be saved inside of the hardware management process.
+         * Upon receiving #onSupportAvailable(), the caller should reprogram the hardware to begin
+         * offload again.
+         */
+        public void onStoppedUnsupported() {}
+        /** Indicate that offload is able to proivde support for this time. */
+        public void onSupportAvailable() {}
+        /** Offload stopped because of usage limit reached. */
+        public void onStoppedLimitReached() {}
+
+        /** Indicate to update NAT timeout. */
+        public void onNatTimeoutUpdate(int proto,
+                                       String srcAddr, int srcPort,
+                                       String dstAddr, int dstPort) {}
+    }
+
+    /** The object which records Tx/Rx forwarded bytes. */
+    public static class ForwardedStats {
+        public long rxBytes;
+        public long txBytes;
+
+        public ForwardedStats() {
+            rxBytes = 0;
+            txBytes = 0;
+        }
+
+        @VisibleForTesting
+        public ForwardedStats(long rxBytes, long txBytes) {
+            this.rxBytes = rxBytes;
+            this.txBytes = txBytes;
+        }
+
+        /** Add Tx/Rx bytes. */
+        public void add(ForwardedStats other) {
+            rxBytes += other.rxBytes;
+            txBytes += other.txBytes;
+        }
+
+        /** Returns the string representation of this object. */
+        public String toString() {
+            return String.format("rx:%s tx:%s", rxBytes, txBytes);
+        }
+    }
+
+    public OffloadHardwareInterface(Handler h, SharedLog log) {
+        mHandler = h;
+        mLog = log.forSubComponent(TAG);
+    }
+
+    /** Get default value indicating whether offload is supported. */
+    public int getDefaultTetherOffloadDisabled() {
+        return DEFAULT_TETHER_OFFLOAD_DISABLED;
+    }
+
+    /**
+     * Offload management process need to know conntrack rules to support NAT, but it may not have
+     * permission to create netlink netfilter sockets. Create two netlink netfilter sockets and
+     * share them with offload management process.
+     */
+    public boolean initOffloadConfig() {
+        IOffloadConfig offloadConfig;
+        try {
+            offloadConfig = IOffloadConfig.getService(true /*retry*/);
+        } catch (RemoteException e) {
+            mLog.e("getIOffloadConfig error " + e);
+            return false;
+        }
+        if (offloadConfig == null) {
+            mLog.e("Could not find IOffloadConfig service");
+            return false;
+        }
+        // Per the IConfigOffload definition:
+        //
+        // h1    provides a file descriptor bound to the following netlink groups
+        //       (NF_NETLINK_CONNTRACK_NEW | NF_NETLINK_CONNTRACK_DESTROY).
+        //
+        // h2    provides a file descriptor bound to the following netlink groups
+        //       (NF_NETLINK_CONNTRACK_UPDATE | NF_NETLINK_CONNTRACK_DESTROY).
+        final NativeHandle h1 = createConntrackSocket(
+                NF_NETLINK_CONNTRACK_NEW | NF_NETLINK_CONNTRACK_DESTROY);
+        if (h1 == null) return false;
+
+        final NativeHandle h2 = createConntrackSocket(
+                NF_NETLINK_CONNTRACK_UPDATE | NF_NETLINK_CONNTRACK_DESTROY);
+        if (h2 == null) {
+            closeFdInNativeHandle(h1);
+            return false;
+        }
+
+        final CbResults results = new CbResults();
+        try {
+            offloadConfig.setHandles(h1, h2,
+                    (boolean success, String errMsg) -> {
+                        results.mSuccess = success;
+                        results.mErrMsg = errMsg;
+                    });
+        } catch (RemoteException e) {
+            record("initOffloadConfig, setHandles fail", e);
+            return false;
+        }
+        // Explicitly close FDs.
+        closeFdInNativeHandle(h1);
+        closeFdInNativeHandle(h2);
+
+        record("initOffloadConfig, setHandles results:", results);
+        return results.mSuccess;
+    }
+
+    private void closeFdInNativeHandle(final NativeHandle h) {
+        try {
+            h.close();
+        } catch (IOException | IllegalStateException e) {
+            // IllegalStateException means fd is already closed, do nothing here.
+            // Also nothing we can do if IOException.
+        }
+    }
+
+    private NativeHandle createConntrackSocket(final int groups) {
+        FileDescriptor fd;
+        try {
+            fd = NetlinkSocket.forProto(OsConstants.NETLINK_NETFILTER);
+        } catch (ErrnoException e) {
+            mLog.e("Unable to create conntrack socket " + e);
+            return null;
+        }
+
+        final SocketAddress sockAddr = SocketUtils.makeNetlinkSocketAddress(0, groups);
+        try {
+            Os.bind(fd, sockAddr);
+        } catch (ErrnoException | SocketException e) {
+            mLog.e("Unable to bind conntrack socket for groups " + groups + " error: " + e);
+            try {
+                SocketUtils.closeSocket(fd);
+            } catch (IOException ie) {
+                // Nothing we can do here
+            }
+            return null;
+        }
+        try {
+            Os.connect(fd, sockAddr);
+        } catch (ErrnoException | SocketException e) {
+            mLog.e("connect to kernel fail for groups " + groups + " error: " + e);
+            try {
+                SocketUtils.closeSocket(fd);
+            } catch (IOException ie) {
+                // Nothing we can do here
+            }
+            return null;
+        }
+
+        return new NativeHandle(fd, true);
+    }
+
+    /** Initialize the tethering offload HAL. */
+    public boolean initOffloadControl(ControlCallback controlCb) {
+        mControlCallback = controlCb;
+
+        if (mOffloadControl == null) {
+            try {
+                mOffloadControl = IOffloadControl.getService();
+            } catch (RemoteException e) {
+                mLog.e("tethering offload control not supported: " + e);
+                return false;
+            }
+            if (mOffloadControl == null) {
+                mLog.e("tethering IOffloadControl.getService() returned null");
+                return false;
+            }
+        }
+
+        final String logmsg = String.format("initOffloadControl(%s)",
+                (controlCb == null) ? "null"
+                        : "0x" + Integer.toHexString(System.identityHashCode(controlCb)));
+
+        mTetheringOffloadCallback = new TetheringOffloadCallback(mHandler, mControlCallback, mLog);
+        final CbResults results = new CbResults();
+        try {
+            mOffloadControl.initOffload(
+                    mTetheringOffloadCallback,
+                    (boolean success, String errMsg) -> {
+                        results.mSuccess = success;
+                        results.mErrMsg = errMsg;
+                    });
+        } catch (RemoteException e) {
+            record(logmsg, e);
+            return false;
+        }
+
+        record(logmsg, results);
+        return results.mSuccess;
+    }
+
+    /** Stop IOffloadControl. */
+    public void stopOffloadControl() {
+        if (mOffloadControl != null) {
+            try {
+                mOffloadControl.stopOffload(
+                        (boolean success, String errMsg) -> {
+                            if (!success) mLog.e("stopOffload failed: " + errMsg);
+                        });
+            } catch (RemoteException e) {
+                mLog.e("failed to stopOffload: " + e);
+            }
+        }
+        mOffloadControl = null;
+        mTetheringOffloadCallback = null;
+        mControlCallback = null;
+        mLog.log("stopOffloadControl()");
+    }
+
+    /** Get Tx/Rx usage from last query. */
+    public ForwardedStats getForwardedStats(String upstream) {
+        final String logmsg = String.format("getForwardedStats(%s)",  upstream);
+
+        final ForwardedStats stats = new ForwardedStats();
+        try {
+            mOffloadControl.getForwardedStats(
+                    upstream,
+                    (long rxBytes, long txBytes) -> {
+                        stats.rxBytes = (rxBytes > 0) ? rxBytes : 0;
+                        stats.txBytes = (txBytes > 0) ? txBytes : 0;
+                    });
+        } catch (RemoteException e) {
+            record(logmsg, e);
+            return stats;
+        }
+
+        mLog.log(logmsg + YIELDS + stats);
+        return stats;
+    }
+
+    /** Set local prefixes to offload management process. */
+    public boolean setLocalPrefixes(ArrayList<String> localPrefixes) {
+        final String logmsg = String.format("setLocalPrefixes([%s])",
+                String.join(",", localPrefixes));
+
+        final CbResults results = new CbResults();
+        try {
+            mOffloadControl.setLocalPrefixes(localPrefixes,
+                    (boolean success, String errMsg) -> {
+                        results.mSuccess = success;
+                        results.mErrMsg = errMsg;
+                    });
+        } catch (RemoteException e) {
+            record(logmsg, e);
+            return false;
+        }
+
+        record(logmsg, results);
+        return results.mSuccess;
+    }
+
+    /** Set data limit value to offload management process. */
+    public boolean setDataLimit(String iface, long limit) {
+
+        final String logmsg = String.format("setDataLimit(%s, %d)", iface, limit);
+
+        final CbResults results = new CbResults();
+        try {
+            mOffloadControl.setDataLimit(
+                    iface, limit,
+                    (boolean success, String errMsg) -> {
+                        results.mSuccess = success;
+                        results.mErrMsg = errMsg;
+                    });
+        } catch (RemoteException e) {
+            record(logmsg, e);
+            return false;
+        }
+
+        record(logmsg, results);
+        return results.mSuccess;
+    }
+
+    /** Set upstream parameters to offload management process. */
+    public boolean setUpstreamParameters(
+            String iface, String v4addr, String v4gateway, ArrayList<String> v6gws) {
+        iface = (iface != null) ? iface : NO_INTERFACE_NAME;
+        v4addr = (v4addr != null) ? v4addr : NO_IPV4_ADDRESS;
+        v4gateway = (v4gateway != null) ? v4gateway : NO_IPV4_GATEWAY;
+        v6gws = (v6gws != null) ? v6gws : new ArrayList<>();
+
+        final String logmsg = String.format("setUpstreamParameters(%s, %s, %s, [%s])",
+                iface, v4addr, v4gateway, String.join(",", v6gws));
+
+        final CbResults results = new CbResults();
+        try {
+            mOffloadControl.setUpstreamParameters(
+                    iface, v4addr, v4gateway, v6gws,
+                    (boolean success, String errMsg) -> {
+                        results.mSuccess = success;
+                        results.mErrMsg = errMsg;
+                    });
+        } catch (RemoteException e) {
+            record(logmsg, e);
+            return false;
+        }
+
+        record(logmsg, results);
+        return results.mSuccess;
+    }
+
+    /** Add downstream prefix to offload management process. */
+    public boolean addDownstreamPrefix(String ifname, String prefix) {
+        final String logmsg = String.format("addDownstreamPrefix(%s, %s)", ifname, prefix);
+
+        final CbResults results = new CbResults();
+        try {
+            mOffloadControl.addDownstream(ifname, prefix,
+                    (boolean success, String errMsg) -> {
+                        results.mSuccess = success;
+                        results.mErrMsg = errMsg;
+                    });
+        } catch (RemoteException e) {
+            record(logmsg, e);
+            return false;
+        }
+
+        record(logmsg, results);
+        return results.mSuccess;
+    }
+
+    /** Remove downstream prefix from offload management process. */
+    public boolean removeDownstreamPrefix(String ifname, String prefix) {
+        final String logmsg = String.format("removeDownstreamPrefix(%s, %s)", ifname, prefix);
+
+        final CbResults results = new CbResults();
+        try {
+            mOffloadControl.removeDownstream(ifname, prefix,
+                    (boolean success, String errMsg) -> {
+                        results.mSuccess = success;
+                        results.mErrMsg = errMsg;
+                    });
+        } catch (RemoteException e) {
+            record(logmsg, e);
+            return false;
+        }
+
+        record(logmsg, results);
+        return results.mSuccess;
+    }
+
+    private void record(String msg, Throwable t) {
+        mLog.e(msg + YIELDS + "exception: " + t);
+    }
+
+    private void record(String msg, CbResults results) {
+        final String logmsg = msg + YIELDS + results;
+        if (!results.mSuccess) {
+            mLog.e(logmsg);
+        } else {
+            mLog.log(logmsg);
+        }
+    }
+
+    private static class TetheringOffloadCallback extends ITetheringOffloadCallback.Stub {
+        public final Handler handler;
+        public final ControlCallback controlCb;
+        public final SharedLog log;
+
+        TetheringOffloadCallback(Handler h, ControlCallback cb, SharedLog sharedLog) {
+            handler = h;
+            controlCb = cb;
+            log = sharedLog;
+        }
+
+        @Override
+        public void onEvent(int event) {
+            handler.post(() -> {
+                switch (event) {
+                    case OffloadCallbackEvent.OFFLOAD_STARTED:
+                        controlCb.onStarted();
+                        break;
+                    case OffloadCallbackEvent.OFFLOAD_STOPPED_ERROR:
+                        controlCb.onStoppedError();
+                        break;
+                    case OffloadCallbackEvent.OFFLOAD_STOPPED_UNSUPPORTED:
+                        controlCb.onStoppedUnsupported();
+                        break;
+                    case OffloadCallbackEvent.OFFLOAD_SUPPORT_AVAILABLE:
+                        controlCb.onSupportAvailable();
+                        break;
+                    case OffloadCallbackEvent.OFFLOAD_STOPPED_LIMIT_REACHED:
+                        controlCb.onStoppedLimitReached();
+                        break;
+                    default:
+                        log.e("Unsupported OffloadCallbackEvent: " + event);
+                }
+            });
+        }
+
+        @Override
+        public void updateTimeout(NatTimeoutUpdate params) {
+            handler.post(() -> {
+                controlCb.onNatTimeoutUpdate(
+                        networkProtocolToOsConstant(params.proto),
+                        params.src.addr, uint16(params.src.port),
+                        params.dst.addr, uint16(params.dst.port));
+            });
+        }
+    }
+
+    private static int networkProtocolToOsConstant(int proto) {
+        switch (proto) {
+            case NetworkProtocol.TCP: return OsConstants.IPPROTO_TCP;
+            case NetworkProtocol.UDP: return OsConstants.IPPROTO_UDP;
+            default:
+                // The caller checks this value and will log an error. Just make
+                // sure it won't collide with valid OsContants.IPPROTO_* values.
+                return -Math.abs(proto);
+        }
+    }
+
+    private static class CbResults {
+        boolean mSuccess;
+        String mErrMsg;
+
+        @Override
+        public String toString() {
+            if (mSuccess) {
+                return "ok";
+            } else {
+                return "fail: " + mErrMsg;
+            }
+        }
+    }
+}
diff --git a/packages/Tethering/src/com/android/networkstack/tethering/Tethering.java b/packages/Tethering/src/com/android/networkstack/tethering/Tethering.java
new file mode 100644
index 0000000..4e16c49
--- /dev/null
+++ b/packages/Tethering/src/com/android/networkstack/tethering/Tethering.java
@@ -0,0 +1,2311 @@
+/*
+ * Copyright (C) 2010 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.networkstack.tethering;
+
+import static android.Manifest.permission.NETWORK_SETTINGS;
+import static android.Manifest.permission.NETWORK_STACK;
+import static android.content.pm.PackageManager.PERMISSION_GRANTED;
+import static android.hardware.usb.UsbManager.USB_CONFIGURED;
+import static android.hardware.usb.UsbManager.USB_CONNECTED;
+import static android.hardware.usb.UsbManager.USB_FUNCTION_NCM;
+import static android.hardware.usb.UsbManager.USB_FUNCTION_RNDIS;
+import static android.net.ConnectivityManager.ACTION_RESTRICT_BACKGROUND_CHANGED;
+import static android.net.ConnectivityManager.CONNECTIVITY_ACTION;
+import static android.net.ConnectivityManager.EXTRA_NETWORK_INFO;
+import static android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK;
+import static android.net.TetheringManager.ACTION_TETHER_STATE_CHANGED;
+import static android.net.TetheringManager.EXTRA_ACTIVE_LOCAL_ONLY;
+import static android.net.TetheringManager.EXTRA_ACTIVE_TETHER;
+import static android.net.TetheringManager.EXTRA_AVAILABLE_TETHER;
+import static android.net.TetheringManager.EXTRA_ERRORED_TETHER;
+import static android.net.TetheringManager.TETHERING_BLUETOOTH;
+import static android.net.TetheringManager.TETHERING_ETHERNET;
+import static android.net.TetheringManager.TETHERING_INVALID;
+import static android.net.TetheringManager.TETHERING_NCM;
+import static android.net.TetheringManager.TETHERING_USB;
+import static android.net.TetheringManager.TETHERING_WIFI;
+import static android.net.TetheringManager.TETHERING_WIFI_P2P;
+import static android.net.TetheringManager.TETHER_ERROR_INTERNAL_ERROR;
+import static android.net.TetheringManager.TETHER_ERROR_NO_ERROR;
+import static android.net.TetheringManager.TETHER_ERROR_SERVICE_UNAVAIL;
+import static android.net.TetheringManager.TETHER_ERROR_UNAVAIL_IFACE;
+import static android.net.TetheringManager.TETHER_ERROR_UNKNOWN_IFACE;
+import static android.net.TetheringManager.TETHER_ERROR_UNKNOWN_TYPE;
+import static android.net.TetheringManager.TETHER_HARDWARE_OFFLOAD_FAILED;
+import static android.net.TetheringManager.TETHER_HARDWARE_OFFLOAD_STARTED;
+import static android.net.TetheringManager.TETHER_HARDWARE_OFFLOAD_STOPPED;
+import static android.net.util.TetheringMessageBase.BASE_MASTER;
+import static android.net.wifi.WifiManager.EXTRA_WIFI_AP_INTERFACE_NAME;
+import static android.net.wifi.WifiManager.EXTRA_WIFI_AP_MODE;
+import static android.net.wifi.WifiManager.EXTRA_WIFI_AP_STATE;
+import static android.net.wifi.WifiManager.IFACE_IP_MODE_CONFIGURATION_ERROR;
+import static android.net.wifi.WifiManager.IFACE_IP_MODE_LOCAL_ONLY;
+import static android.net.wifi.WifiManager.IFACE_IP_MODE_TETHERED;
+import static android.net.wifi.WifiManager.IFACE_IP_MODE_UNSPECIFIED;
+import static android.net.wifi.WifiManager.WIFI_AP_STATE_DISABLED;
+import static android.telephony.CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED;
+import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
+
+import static com.android.networkstack.tethering.TetheringNotificationUpdater.DOWNSTREAM_NONE;
+
+import android.app.usage.NetworkStatsManager;
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothPan;
+import android.bluetooth.BluetoothProfile;
+import android.bluetooth.BluetoothProfile.ServiceListener;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.hardware.usb.UsbManager;
+import android.net.ConnectivityManager;
+import android.net.EthernetManager;
+import android.net.IIntResultListener;
+import android.net.INetd;
+import android.net.ITetheringEventCallback;
+import android.net.IpPrefix;
+import android.net.LinkAddress;
+import android.net.LinkProperties;
+import android.net.Network;
+import android.net.NetworkCapabilities;
+import android.net.NetworkInfo;
+import android.net.TetherStatesParcel;
+import android.net.TetheredClient;
+import android.net.TetheringCallbackStartedParcel;
+import android.net.TetheringConfigurationParcel;
+import android.net.TetheringRequestParcel;
+import android.net.ip.IpServer;
+import android.net.shared.NetdUtils;
+import android.net.util.BaseNetdUnsolicitedEventListener;
+import android.net.util.InterfaceSet;
+import android.net.util.PrefixUtils;
+import android.net.util.SharedLog;
+import android.net.util.TetheringUtils;
+import android.net.util.VersionedBroadcastListener;
+import android.net.wifi.WifiClient;
+import android.net.wifi.WifiManager;
+import android.net.wifi.p2p.WifiP2pGroup;
+import android.net.wifi.p2p.WifiP2pInfo;
+import android.net.wifi.p2p.WifiP2pManager;
+import android.os.Binder;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+import android.os.RemoteCallbackList;
+import android.os.RemoteException;
+import android.os.ResultReceiver;
+import android.os.ServiceSpecificException;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.telephony.PhoneStateListener;
+import android.telephony.TelephonyManager;
+import android.text.TextUtils;
+import android.util.ArrayMap;
+import android.util.Log;
+import android.util.SparseArray;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import com.android.internal.annotations.GuardedBy;
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.util.IndentingPrintWriter;
+import com.android.internal.util.MessageUtils;
+import com.android.internal.util.State;
+import com.android.internal.util.StateMachine;
+
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
+import java.net.InetAddress;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.Executor;
+import java.util.concurrent.RejectedExecutionException;
+
+/**
+ *
+ * This class holds much of the business logic to allow Android devices
+ * to act as IP gateways via USB, BT, and WiFi interfaces.
+ */
+public class Tethering {
+
+    private static final String TAG = Tethering.class.getSimpleName();
+    private static final boolean DBG = false;
+    private static final boolean VDBG = false;
+
+    private static final Class[] sMessageClasses = {
+            Tethering.class, TetherMasterSM.class, IpServer.class
+    };
+    private static final SparseArray<String> sMagicDecoderRing =
+            MessageUtils.findMessageNames(sMessageClasses);
+    // Keep in sync with NETID_UNSET in system/netd/include/netid_client.h
+    private static final int NETID_UNSET = 0;
+
+    private static class TetherState {
+        public final IpServer ipServer;
+        public int lastState;
+        public int lastError;
+
+        TetherState(IpServer ipServer) {
+            this.ipServer = ipServer;
+            // Assume all state machines start out available and with no errors.
+            lastState = IpServer.STATE_AVAILABLE;
+            lastError = TETHER_ERROR_NO_ERROR;
+        }
+
+        public boolean isCurrentlyServing() {
+            switch (lastState) {
+                case IpServer.STATE_TETHERED:
+                case IpServer.STATE_LOCAL_ONLY:
+                    return true;
+                default:
+                    return false;
+            }
+        }
+    }
+
+    /**
+     * Cookie added when registering {@link android.net.TetheringManager.TetheringEventCallback}.
+     */
+    private static class CallbackCookie {
+        public final boolean hasListClientsPermission;
+
+        private CallbackCookie(boolean hasListClientsPermission) {
+            this.hasListClientsPermission = hasListClientsPermission;
+        }
+    }
+
+    private final SharedLog mLog = new SharedLog(TAG);
+    private final RemoteCallbackList<ITetheringEventCallback> mTetheringEventCallbacks =
+            new RemoteCallbackList<>();
+    // Currently active tethering requests per tethering type. Only one of each type can be
+    // requested at a time. After a tethering type is requested, the map keeps tethering parameters
+    // to be used after the interface comes up asynchronously.
+    private final SparseArray<TetheringRequestParcel> mActiveTetheringRequests =
+            new SparseArray<>();
+
+    // used to synchronize public access to members
+    private final Object mPublicSync;
+    private final Context mContext;
+    private final ArrayMap<String, TetherState> mTetherStates;
+    private final BroadcastReceiver mStateReceiver;
+    private final Looper mLooper;
+    private final StateMachine mTetherMasterSM;
+    private final OffloadController mOffloadController;
+    private final UpstreamNetworkMonitor mUpstreamNetworkMonitor;
+    // TODO: Figure out how to merge this and other downstream-tracking objects
+    // into a single coherent structure.
+    // Use LinkedHashSet for predictable ordering order for ConnectedClientsTracker.
+    private final LinkedHashSet<IpServer> mForwardedDownstreams;
+    private final VersionedBroadcastListener mCarrierConfigChange;
+    private final TetheringDependencies mDeps;
+    private final EntitlementManager mEntitlementMgr;
+    private final Handler mHandler;
+    private final INetd mNetd;
+    private final NetdCallback mNetdCallback;
+    private final UserRestrictionActionListener mTetheringRestriction;
+    private final ActiveDataSubIdListener mActiveDataSubIdListener;
+    private final ConnectedClientsTracker mConnectedClientsTracker;
+    private final TetheringThreadExecutor mExecutor;
+    private final TetheringNotificationUpdater mNotificationUpdater;
+    private int mActiveDataSubId = INVALID_SUBSCRIPTION_ID;
+    // All the usage of mTetheringEventCallback should run in the same thread.
+    private ITetheringEventCallback mTetheringEventCallback = null;
+
+    private volatile TetheringConfiguration mConfig;
+    private InterfaceSet mCurrentUpstreamIfaceSet;
+
+    private boolean mRndisEnabled;       // track the RNDIS function enabled state
+    // True iff. WiFi tethering should be started when soft AP is ready.
+    private boolean mWifiTetherRequested;
+    private Network mTetherUpstream;
+    private TetherStatesParcel mTetherStatesParcel;
+    private boolean mDataSaverEnabled = false;
+    private String mWifiP2pTetherInterface = null;
+    private int mOffloadStatus = TETHER_HARDWARE_OFFLOAD_STOPPED;
+
+    @GuardedBy("mPublicSync")
+    private EthernetManager.TetheredInterfaceRequest mEthernetIfaceRequest;
+    @GuardedBy("mPublicSync")
+    private String mConfiguredEthernetIface;
+    @GuardedBy("mPublicSync")
+    private EthernetCallback mEthernetCallback;
+
+    public Tethering(TetheringDependencies deps) {
+        mLog.mark("Tethering.constructed");
+        mDeps = deps;
+        mContext = mDeps.getContext();
+        mNetd = mDeps.getINetd(mContext);
+        mLooper = mDeps.getTetheringLooper();
+        mNotificationUpdater = mDeps.getNotificationUpdater(mContext, mLooper);
+
+        mPublicSync = new Object();
+
+        mTetherStates = new ArrayMap<>();
+        mConnectedClientsTracker = new ConnectedClientsTracker();
+
+        mTetherMasterSM = new TetherMasterSM("TetherMaster", mLooper, deps);
+        mTetherMasterSM.start();
+
+        final NetworkStatsManager statsManager =
+                (NetworkStatsManager) mContext.getSystemService(Context.NETWORK_STATS_SERVICE);
+        mHandler = mTetherMasterSM.getHandler();
+        mOffloadController = new OffloadController(mHandler,
+                mDeps.getOffloadHardwareInterface(mHandler, mLog), mContext.getContentResolver(),
+                statsManager, mLog);
+        mUpstreamNetworkMonitor = mDeps.getUpstreamNetworkMonitor(mContext, mTetherMasterSM, mLog,
+                TetherMasterSM.EVENT_UPSTREAM_CALLBACK);
+        mForwardedDownstreams = new LinkedHashSet<>();
+
+        IntentFilter filter = new IntentFilter();
+        filter.addAction(ACTION_CARRIER_CONFIG_CHANGED);
+        // EntitlementManager will send EVENT_UPSTREAM_PERMISSION_CHANGED when cellular upstream
+        // permission is changed according to entitlement check result.
+        mEntitlementMgr = mDeps.getEntitlementManager(mContext, mTetherMasterSM, mLog,
+                TetherMasterSM.EVENT_UPSTREAM_PERMISSION_CHANGED);
+        mEntitlementMgr.setOnUiEntitlementFailedListener((int downstream) -> {
+            mLog.log("OBSERVED UiEnitlementFailed");
+            stopTethering(downstream);
+        });
+        mEntitlementMgr.setTetheringConfigurationFetcher(() -> {
+            return mConfig;
+        });
+
+        mCarrierConfigChange = new VersionedBroadcastListener(
+                "CarrierConfigChangeListener", mContext, mHandler, filter,
+                (Intent ignored) -> {
+                    mLog.log("OBSERVED carrier config change");
+                    updateConfiguration();
+                    mEntitlementMgr.reevaluateSimCardProvisioning(mConfig);
+                });
+
+        mStateReceiver = new StateReceiver();
+
+        final UserManager userManager = (UserManager) mContext.getSystemService(
+                Context.USER_SERVICE);
+        mTetheringRestriction = new UserRestrictionActionListener(
+                userManager, this, mNotificationUpdater);
+        mExecutor = new TetheringThreadExecutor(mHandler);
+        mActiveDataSubIdListener = new ActiveDataSubIdListener(mExecutor);
+        mNetdCallback = new NetdCallback();
+
+        // Load tethering configuration.
+        updateConfiguration();
+    }
+
+    /**
+     * Start to register callbacks.
+     * Call this function when tethering is ready to handle callback events.
+     */
+    public void startStateMachineUpdaters() {
+        try {
+            mNetd.registerUnsolicitedEventListener(mNetdCallback);
+        } catch (RemoteException e) {
+            mLog.e("Unable to register netd UnsolicitedEventListener");
+        }
+        mCarrierConfigChange.startListening();
+        mContext.getSystemService(TelephonyManager.class).listen(mActiveDataSubIdListener,
+                PhoneStateListener.LISTEN_ACTIVE_DATA_SUBSCRIPTION_ID_CHANGE);
+
+        IntentFilter filter = new IntentFilter();
+        filter.addAction(UsbManager.ACTION_USB_STATE);
+        filter.addAction(CONNECTIVITY_ACTION);
+        filter.addAction(WifiManager.WIFI_AP_STATE_CHANGED_ACTION);
+        filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED);
+        filter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);
+        filter.addAction(UserManager.ACTION_USER_RESTRICTIONS_CHANGED);
+        filter.addAction(ACTION_RESTRICT_BACKGROUND_CHANGED);
+        mContext.registerReceiver(mStateReceiver, filter, null, mHandler);
+
+        final IntentFilter noUpstreamFilter = new IntentFilter();
+        noUpstreamFilter.addAction(TetheringNotificationUpdater.ACTION_DISABLE_TETHERING);
+        mContext.registerReceiver(
+                mStateReceiver, noUpstreamFilter, PERMISSION_MAINLINE_NETWORK_STACK, mHandler);
+
+        final WifiManager wifiManager = getWifiManager();
+        if (wifiManager != null) {
+            wifiManager.registerSoftApCallback(mExecutor, new TetheringSoftApCallback());
+        }
+
+        startTrackDefaultNetwork();
+    }
+
+    private class TetheringThreadExecutor implements Executor {
+        private final Handler mTetherHandler;
+        TetheringThreadExecutor(Handler handler) {
+            mTetherHandler = handler;
+        }
+        @Override
+        public void execute(Runnable command) {
+            if (!mTetherHandler.post(command)) {
+                throw new RejectedExecutionException(mTetherHandler + " is shutting down");
+            }
+        }
+    }
+
+    private class ActiveDataSubIdListener extends PhoneStateListener {
+        ActiveDataSubIdListener(Executor executor) {
+            super(executor);
+        }
+
+        @Override
+        public void onActiveDataSubscriptionIdChanged(int subId) {
+            mLog.log("OBSERVED active data subscription change, from " + mActiveDataSubId
+                    + " to " + subId);
+            if (subId == mActiveDataSubId) return;
+
+            mActiveDataSubId = subId;
+            updateConfiguration();
+            mNotificationUpdater.onActiveDataSubscriptionIdChanged(subId);
+            // To avoid launching unexpected provisioning checks, ignore re-provisioning
+            // when no CarrierConfig loaded yet. Assume reevaluateSimCardProvisioning()
+            // will be triggered again when CarrierConfig is loaded.
+            if (mEntitlementMgr.getCarrierConfig(mConfig) != null) {
+                mEntitlementMgr.reevaluateSimCardProvisioning(mConfig);
+            } else {
+                mLog.log("IGNORED reevaluate provisioning, no carrier config loaded");
+            }
+        }
+    }
+
+    private WifiManager getWifiManager() {
+        return (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
+    }
+
+    // NOTE: This is always invoked on the mLooper thread.
+    private void updateConfiguration() {
+        mConfig = mDeps.generateTetheringConfiguration(mContext, mLog, mActiveDataSubId);
+        mUpstreamNetworkMonitor.updateMobileRequiresDun(mConfig.isDunRequired);
+        reportConfigurationChanged(mConfig.toStableParcelable());
+    }
+
+    private void maybeDunSettingChanged() {
+        final boolean isDunRequired = TetheringConfiguration.checkDunRequired(mContext);
+        if (isDunRequired == mConfig.isDunRequired) return;
+        updateConfiguration();
+    }
+
+    private class NetdCallback extends BaseNetdUnsolicitedEventListener {
+        @Override
+        public void onInterfaceChanged(String ifName, boolean up) {
+            mHandler.post(() -> interfaceStatusChanged(ifName, up));
+        }
+
+        @Override
+        public void onInterfaceLinkStateChanged(String ifName, boolean up) {
+            mHandler.post(() -> interfaceLinkStateChanged(ifName, up));
+        }
+
+        @Override
+        public void onInterfaceAdded(String ifName) {
+            mHandler.post(() -> interfaceAdded(ifName));
+        }
+
+        @Override
+        public void onInterfaceRemoved(String ifName) {
+            mHandler.post(() -> interfaceRemoved(ifName));
+        }
+    }
+
+    private class TetheringSoftApCallback implements WifiManager.SoftApCallback {
+        // TODO: Remove onStateChanged override when this method has default on
+        // WifiManager#SoftApCallback interface.
+        // Wifi listener for state change of the soft AP
+        @Override
+        public void onStateChanged(final int state, final int failureReason) {
+            // Nothing
+        }
+
+        // Called by wifi when the number of soft AP clients changed.
+        @Override
+        public void onConnectedClientsChanged(final List<WifiClient> clients) {
+            updateConnectedClients(clients);
+        }
+    }
+
+    void interfaceStatusChanged(String iface, boolean up) {
+        // Never called directly: only called from interfaceLinkStateChanged.
+        // See NetlinkHandler.cpp: notifyInterfaceChanged.
+        if (VDBG) Log.d(TAG, "interfaceStatusChanged " + iface + ", " + up);
+        synchronized (mPublicSync) {
+            if (up) {
+                maybeTrackNewInterfaceLocked(iface);
+            } else {
+                if (ifaceNameToType(iface) == TETHERING_BLUETOOTH) {
+                    stopTrackingInterfaceLocked(iface);
+                } else {
+                    // Ignore usb0 down after enabling RNDIS.
+                    // We will handle disconnect in interfaceRemoved.
+                    // Similarly, ignore interface down for WiFi.  We monitor WiFi AP status
+                    // through the WifiManager.WIFI_AP_STATE_CHANGED_ACTION intent.
+                    if (VDBG) Log.d(TAG, "ignore interface down for " + iface);
+                }
+            }
+        }
+    }
+
+    void interfaceLinkStateChanged(String iface, boolean up) {
+        interfaceStatusChanged(iface, up);
+    }
+
+    private int ifaceNameToType(String iface) {
+        final TetheringConfiguration cfg = mConfig;
+
+        if (cfg.isWifi(iface)) {
+            return TETHERING_WIFI;
+        } else if (cfg.isWifiP2p(iface)) {
+            return TETHERING_WIFI_P2P;
+        } else if (cfg.isUsb(iface)) {
+            return TETHERING_USB;
+        } else if (cfg.isBluetooth(iface)) {
+            return TETHERING_BLUETOOTH;
+        } else if (cfg.isNcm(iface)) {
+            return TETHERING_NCM;
+        }
+        return TETHERING_INVALID;
+    }
+
+    void interfaceAdded(String iface) {
+        if (VDBG) Log.d(TAG, "interfaceAdded " + iface);
+        synchronized (mPublicSync) {
+            maybeTrackNewInterfaceLocked(iface);
+        }
+    }
+
+    void interfaceRemoved(String iface) {
+        if (VDBG) Log.d(TAG, "interfaceRemoved " + iface);
+        synchronized (mPublicSync) {
+            stopTrackingInterfaceLocked(iface);
+        }
+    }
+
+    void startTethering(final TetheringRequestParcel request, final IIntResultListener listener) {
+        mHandler.post(() -> {
+            final TetheringRequestParcel unfinishedRequest = mActiveTetheringRequests.get(
+                    request.tetheringType);
+            // If tethering is already enabled with a different request,
+            // disable before re-enabling.
+            if (unfinishedRequest != null
+                    && !TetheringUtils.isTetheringRequestEquals(unfinishedRequest, request)) {
+                enableTetheringInternal(request.tetheringType, false /* disabled */, null);
+                mEntitlementMgr.stopProvisioningIfNeeded(request.tetheringType);
+            }
+            mActiveTetheringRequests.put(request.tetheringType, request);
+
+            mEntitlementMgr.startProvisioningIfNeeded(request.tetheringType,
+                    request.showProvisioningUi);
+            enableTetheringInternal(request.tetheringType, true /* enabled */, listener);
+        });
+    }
+
+    void stopTethering(int type) {
+        mHandler.post(() -> {
+            mActiveTetheringRequests.remove(type);
+
+            enableTetheringInternal(type, false /* disabled */, null);
+            mEntitlementMgr.stopProvisioningIfNeeded(type);
+        });
+    }
+
+    /**
+     * Enables or disables tethering for the given type. If provisioning is required, it will
+     * schedule provisioning rechecks for the specified interface.
+     */
+    private void enableTetheringInternal(int type, boolean enable,
+            final IIntResultListener listener) {
+        int result = TETHER_ERROR_NO_ERROR;
+        switch (type) {
+            case TETHERING_WIFI:
+                result = setWifiTethering(enable);
+                break;
+            case TETHERING_USB:
+                result = setUsbTethering(enable);
+                break;
+            case TETHERING_BLUETOOTH:
+                setBluetoothTethering(enable, listener);
+                break;
+            case TETHERING_NCM:
+                result = setNcmTethering(enable);
+                break;
+            case TETHERING_ETHERNET:
+                result = setEthernetTethering(enable);
+                break;
+            default:
+                Log.w(TAG, "Invalid tether type.");
+                result = TETHER_ERROR_UNKNOWN_TYPE;
+        }
+
+        // The result of Bluetooth tethering will be sent by #setBluetoothTethering.
+        if (type != TETHERING_BLUETOOTH) {
+            sendTetherResult(listener, result, type);
+        }
+    }
+
+    private void sendTetherResult(final IIntResultListener listener, final int result,
+            final int type) {
+        if (listener != null) {
+            try {
+                listener.onResult(result);
+            } catch (RemoteException e) { }
+        }
+
+        // If changing tethering fail, remove corresponding request
+        // no matter who trigger the start/stop.
+        if (result != TETHER_ERROR_NO_ERROR) mActiveTetheringRequests.remove(type);
+    }
+
+    private int setWifiTethering(final boolean enable) {
+        final long ident = Binder.clearCallingIdentity();
+        try {
+            synchronized (mPublicSync) {
+                final WifiManager mgr = getWifiManager();
+                if (mgr == null) {
+                    mLog.e("setWifiTethering: failed to get WifiManager!");
+                    return TETHER_ERROR_SERVICE_UNAVAIL;
+                }
+                if ((enable && mgr.startTetheredHotspot(null /* use existing softap config */))
+                        || (!enable && mgr.stopSoftAp())) {
+                    mWifiTetherRequested = enable;
+                    return TETHER_ERROR_NO_ERROR;
+                }
+            }
+        } finally {
+            Binder.restoreCallingIdentity(ident);
+        }
+
+        return TETHER_ERROR_INTERNAL_ERROR;
+    }
+
+    private void setBluetoothTethering(final boolean enable, final IIntResultListener listener) {
+        final BluetoothAdapter adapter = mDeps.getBluetoothAdapter();
+        if (adapter == null || !adapter.isEnabled()) {
+            Log.w(TAG, "Tried to enable bluetooth tethering with null or disabled adapter. null: "
+                    + (adapter == null));
+            sendTetherResult(listener, TETHER_ERROR_SERVICE_UNAVAIL, TETHERING_BLUETOOTH);
+            return;
+        }
+
+        adapter.getProfileProxy(mContext, new ServiceListener() {
+            @Override
+            public void onServiceDisconnected(int profile) { }
+
+            @Override
+            public void onServiceConnected(int profile, BluetoothProfile proxy) {
+                // Clear identify is fine because caller already pass tethering permission at
+                // ConnectivityService#startTethering()(or stopTethering) before the control comes
+                // here. Bluetooth will check tethering permission again that there is
+                // Context#getOpPackageName() under BluetoothPan#setBluetoothTethering() to get
+                // caller's package name for permission check.
+                // Calling BluetoothPan#setBluetoothTethering() here means the package name always
+                // be system server. If calling identity is not cleared, that package's uid might
+                // not match calling uid and end up in permission denied.
+                final long identityToken = Binder.clearCallingIdentity();
+                try {
+                    ((BluetoothPan) proxy).setBluetoothTethering(enable);
+                } finally {
+                    Binder.restoreCallingIdentity(identityToken);
+                }
+                // TODO: Enabling bluetooth tethering can fail asynchronously here.
+                // We should figure out a way to bubble up that failure instead of sending success.
+                final int result = (((BluetoothPan) proxy).isTetheringOn() == enable)
+                        ? TETHER_ERROR_NO_ERROR
+                        : TETHER_ERROR_INTERNAL_ERROR;
+                sendTetherResult(listener, result, TETHERING_BLUETOOTH);
+                adapter.closeProfileProxy(BluetoothProfile.PAN, proxy);
+            }
+        }, BluetoothProfile.PAN);
+    }
+
+    private int setEthernetTethering(final boolean enable) {
+        final EthernetManager em = (EthernetManager) mContext.getSystemService(
+                Context.ETHERNET_SERVICE);
+        synchronized (mPublicSync) {
+            if (enable) {
+                if (mEthernetCallback != null) {
+                    Log.d(TAG, "Ethernet tethering already started");
+                    return TETHER_ERROR_NO_ERROR;
+                }
+
+                mEthernetCallback = new EthernetCallback();
+                mEthernetIfaceRequest = em.requestTetheredInterface(mExecutor, mEthernetCallback);
+            } else {
+                stopEthernetTetheringLocked();
+            }
+        }
+        return TETHER_ERROR_NO_ERROR;
+    }
+
+    private void stopEthernetTetheringLocked() {
+        if (mConfiguredEthernetIface != null) {
+            stopTrackingInterfaceLocked(mConfiguredEthernetIface);
+            mConfiguredEthernetIface = null;
+        }
+        if (mEthernetCallback != null) {
+            mEthernetIfaceRequest.release();
+            mEthernetCallback = null;
+            mEthernetIfaceRequest = null;
+        }
+    }
+
+    private class EthernetCallback implements EthernetManager.TetheredInterfaceCallback {
+        @Override
+        public void onAvailable(String iface) {
+            synchronized (mPublicSync) {
+                if (this != mEthernetCallback) {
+                    // Ethernet callback arrived after Ethernet tethering stopped. Ignore.
+                    return;
+                }
+                maybeTrackNewInterfaceLocked(iface, TETHERING_ETHERNET);
+                changeInterfaceState(iface, IpServer.STATE_TETHERED);
+                mConfiguredEthernetIface = iface;
+            }
+        }
+
+        @Override
+        public void onUnavailable() {
+            synchronized (mPublicSync) {
+                if (this != mEthernetCallback) {
+                    // onAvailable called after stopping Ethernet tethering.
+                    return;
+                }
+                stopEthernetTetheringLocked();
+            }
+        }
+    }
+
+    int tether(String iface) {
+        return tether(iface, IpServer.STATE_TETHERED);
+    }
+
+    private int tether(String iface, int requestedState) {
+        if (DBG) Log.d(TAG, "Tethering " + iface);
+        synchronized (mPublicSync) {
+            TetherState tetherState = mTetherStates.get(iface);
+            if (tetherState == null) {
+                Log.e(TAG, "Tried to Tether an unknown iface: " + iface + ", ignoring");
+                return TETHER_ERROR_UNKNOWN_IFACE;
+            }
+            // Ignore the error status of the interface.  If the interface is available,
+            // the errors are referring to past tethering attempts anyway.
+            if (tetherState.lastState != IpServer.STATE_AVAILABLE) {
+                Log.e(TAG, "Tried to Tether an unavailable iface: " + iface + ", ignoring");
+                return TETHER_ERROR_UNAVAIL_IFACE;
+            }
+            // NOTE: If a CMD_TETHER_REQUESTED message is already in the TISM's queue but not yet
+            // processed, this will be a no-op and it will not return an error.
+            //
+            // This code cannot race with untether() because they both synchronize on mPublicSync.
+            // TODO: reexamine the threading and messaging model to totally remove mPublicSync.
+            final int type = tetherState.ipServer.interfaceType();
+            final TetheringRequestParcel request = mActiveTetheringRequests.get(type, null);
+            if (request != null) {
+                mActiveTetheringRequests.delete(type);
+            }
+            tetherState.ipServer.sendMessage(IpServer.CMD_TETHER_REQUESTED, requestedState, 0,
+                    request);
+            return TETHER_ERROR_NO_ERROR;
+        }
+    }
+
+    int untether(String iface) {
+        if (DBG) Log.d(TAG, "Untethering " + iface);
+        synchronized (mPublicSync) {
+            TetherState tetherState = mTetherStates.get(iface);
+            if (tetherState == null) {
+                Log.e(TAG, "Tried to Untether an unknown iface :" + iface + ", ignoring");
+                return TETHER_ERROR_UNKNOWN_IFACE;
+            }
+            if (!tetherState.isCurrentlyServing()) {
+                Log.e(TAG, "Tried to untether an inactive iface :" + iface + ", ignoring");
+                return TETHER_ERROR_UNAVAIL_IFACE;
+            }
+            tetherState.ipServer.sendMessage(IpServer.CMD_TETHER_UNREQUESTED);
+            return TETHER_ERROR_NO_ERROR;
+        }
+    }
+
+    void untetherAll() {
+        stopTethering(TETHERING_WIFI);
+        stopTethering(TETHERING_WIFI_P2P);
+        stopTethering(TETHERING_USB);
+        stopTethering(TETHERING_BLUETOOTH);
+        stopTethering(TETHERING_ETHERNET);
+    }
+
+    int getLastTetherError(String iface) {
+        synchronized (mPublicSync) {
+            TetherState tetherState = mTetherStates.get(iface);
+            if (tetherState == null) {
+                Log.e(TAG, "Tried to getLastTetherError on an unknown iface :" + iface
+                        + ", ignoring");
+                return TETHER_ERROR_UNKNOWN_IFACE;
+            }
+            return tetherState.lastError;
+        }
+    }
+
+    boolean isTetherProvisioningRequired() {
+        final TetheringConfiguration cfg = mConfig;
+        return mEntitlementMgr.isTetherProvisioningRequired(cfg);
+    }
+
+    // TODO: Figure out how to update for local hotspot mode interfaces.
+    private void sendTetherStateChangedBroadcast() {
+        if (!mDeps.isTetheringSupported()) return;
+
+        final ArrayList<String> availableList = new ArrayList<>();
+        final ArrayList<String> tetherList = new ArrayList<>();
+        final ArrayList<String> localOnlyList = new ArrayList<>();
+        final ArrayList<String> erroredList = new ArrayList<>();
+        final ArrayList<Integer> lastErrorList = new ArrayList<>();
+
+        final TetheringConfiguration cfg = mConfig;
+        mTetherStatesParcel = new TetherStatesParcel();
+
+        int downstreamTypesMask = DOWNSTREAM_NONE;
+        synchronized (mPublicSync) {
+            for (int i = 0; i < mTetherStates.size(); i++) {
+                TetherState tetherState = mTetherStates.valueAt(i);
+                String iface = mTetherStates.keyAt(i);
+                if (tetherState.lastError != TETHER_ERROR_NO_ERROR) {
+                    erroredList.add(iface);
+                    lastErrorList.add(tetherState.lastError);
+                } else if (tetherState.lastState == IpServer.STATE_AVAILABLE) {
+                    availableList.add(iface);
+                } else if (tetherState.lastState == IpServer.STATE_LOCAL_ONLY) {
+                    localOnlyList.add(iface);
+                } else if (tetherState.lastState == IpServer.STATE_TETHERED) {
+                    if (cfg.isUsb(iface)) {
+                        downstreamTypesMask |= (1 << TETHERING_USB);
+                    } else if (cfg.isWifi(iface)) {
+                        downstreamTypesMask |= (1 << TETHERING_WIFI);
+                    } else if (cfg.isBluetooth(iface)) {
+                        downstreamTypesMask |= (1 << TETHERING_BLUETOOTH);
+                    }
+                    tetherList.add(iface);
+                }
+            }
+        }
+
+        mTetherStatesParcel.availableList = availableList.toArray(new String[0]);
+        mTetherStatesParcel.tetheredList = tetherList.toArray(new String[0]);
+        mTetherStatesParcel.localOnlyList = localOnlyList.toArray(new String[0]);
+        mTetherStatesParcel.erroredIfaceList = erroredList.toArray(new String[0]);
+        mTetherStatesParcel.lastErrorList = new int[lastErrorList.size()];
+        Iterator<Integer> iterator = lastErrorList.iterator();
+        for (int i = 0; i < lastErrorList.size(); i++) {
+            mTetherStatesParcel.lastErrorList[i] = iterator.next().intValue();
+        }
+        reportTetherStateChanged(mTetherStatesParcel);
+
+        final Intent bcast = new Intent(ACTION_TETHER_STATE_CHANGED);
+        bcast.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING);
+        bcast.putStringArrayListExtra(EXTRA_AVAILABLE_TETHER, availableList);
+        bcast.putStringArrayListExtra(EXTRA_ACTIVE_LOCAL_ONLY, localOnlyList);
+        bcast.putStringArrayListExtra(EXTRA_ACTIVE_TETHER, tetherList);
+        bcast.putStringArrayListExtra(EXTRA_ERRORED_TETHER, erroredList);
+        mContext.sendStickyBroadcastAsUser(bcast, UserHandle.ALL);
+        if (DBG) {
+            Log.d(TAG, String.format(
+                    "sendTetherStateChangedBroadcast %s=[%s] %s=[%s] %s=[%s] %s=[%s]",
+                    "avail", TextUtils.join(",", availableList),
+                    "local_only", TextUtils.join(",", localOnlyList),
+                    "tether", TextUtils.join(",", tetherList),
+                    "error", TextUtils.join(",", erroredList)));
+        }
+
+        mNotificationUpdater.onDownstreamChanged(downstreamTypesMask);
+    }
+
+    private class StateReceiver extends BroadcastReceiver {
+        @Override
+        public void onReceive(Context content, Intent intent) {
+            final String action = intent.getAction();
+            if (action == null) return;
+
+            if (action.equals(UsbManager.ACTION_USB_STATE)) {
+                handleUsbAction(intent);
+            } else if (action.equals(CONNECTIVITY_ACTION)) {
+                handleConnectivityAction(intent);
+            } else if (action.equals(WifiManager.WIFI_AP_STATE_CHANGED_ACTION)) {
+                handleWifiApAction(intent);
+            } else if (action.equals(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION)) {
+                handleWifiP2pAction(intent);
+            } else if (action.equals(Intent.ACTION_CONFIGURATION_CHANGED)) {
+                mLog.log("OBSERVED configuration changed");
+                updateConfiguration();
+            } else if (action.equals(UserManager.ACTION_USER_RESTRICTIONS_CHANGED)) {
+                mLog.log("OBSERVED user restrictions changed");
+                handleUserRestrictionAction();
+            } else if (action.equals(ACTION_RESTRICT_BACKGROUND_CHANGED)) {
+                mLog.log("OBSERVED data saver changed");
+                handleDataSaverChanged();
+            } else if (action.equals(TetheringNotificationUpdater.ACTION_DISABLE_TETHERING)) {
+                untetherAll();
+            }
+        }
+
+        private void handleConnectivityAction(Intent intent) {
+            final NetworkInfo networkInfo =
+                    (NetworkInfo) intent.getParcelableExtra(EXTRA_NETWORK_INFO);
+            if (networkInfo == null
+                    || networkInfo.getDetailedState() == NetworkInfo.DetailedState.FAILED) {
+                return;
+            }
+
+            if (VDBG) Log.d(TAG, "Tethering got CONNECTIVITY_ACTION: " + networkInfo.toString());
+            mTetherMasterSM.sendMessage(TetherMasterSM.CMD_UPSTREAM_CHANGED);
+        }
+
+        private void handleUsbAction(Intent intent) {
+            final boolean usbConnected = intent.getBooleanExtra(USB_CONNECTED, false);
+            final boolean usbConfigured = intent.getBooleanExtra(USB_CONFIGURED, false);
+            final boolean rndisEnabled = intent.getBooleanExtra(USB_FUNCTION_RNDIS, false);
+            final boolean ncmEnabled = intent.getBooleanExtra(USB_FUNCTION_NCM, false);
+
+            mLog.log(String.format("USB bcast connected:%s configured:%s rndis:%s",
+                    usbConnected, usbConfigured, rndisEnabled));
+
+            // There are three types of ACTION_USB_STATE:
+            //
+            //     - DISCONNECTED (USB_CONNECTED and USB_CONFIGURED are 0)
+            //       Meaning: USB connection has ended either because of
+            //       software reset or hard unplug.
+            //
+            //     - CONNECTED (USB_CONNECTED is 1, USB_CONFIGURED is 0)
+            //       Meaning: the first stage of USB protocol handshake has
+            //       occurred but it is not complete.
+            //
+            //     - CONFIGURED (USB_CONNECTED and USB_CONFIGURED are 1)
+            //       Meaning: the USB handshake is completely done and all the
+            //       functions are ready to use.
+            //
+            // For more explanation, see b/62552150 .
+            synchronized (Tethering.this.mPublicSync) {
+                if (!usbConnected && mRndisEnabled) {
+                    // Turn off tethering if it was enabled and there is a disconnect.
+                    tetherMatchingInterfaces(IpServer.STATE_AVAILABLE, TETHERING_USB);
+                    mEntitlementMgr.stopProvisioningIfNeeded(TETHERING_USB);
+                } else if (usbConfigured && rndisEnabled) {
+                    // Tether if rndis is enabled and usb is configured.
+                    tetherMatchingInterfaces(IpServer.STATE_TETHERED, TETHERING_USB);
+                } else if (usbConnected && ncmEnabled) {
+                    tetherMatchingInterfaces(IpServer.STATE_LOCAL_ONLY, TETHERING_NCM);
+                }
+                mRndisEnabled = usbConfigured && rndisEnabled;
+            }
+        }
+
+        private void handleWifiApAction(Intent intent) {
+            final int curState = intent.getIntExtra(EXTRA_WIFI_AP_STATE, WIFI_AP_STATE_DISABLED);
+            final String ifname = intent.getStringExtra(EXTRA_WIFI_AP_INTERFACE_NAME);
+            final int ipmode = intent.getIntExtra(EXTRA_WIFI_AP_MODE, IFACE_IP_MODE_UNSPECIFIED);
+
+            synchronized (Tethering.this.mPublicSync) {
+                switch (curState) {
+                    case WifiManager.WIFI_AP_STATE_ENABLING:
+                        // We can see this state on the way to both enabled and failure states.
+                        break;
+                    case WifiManager.WIFI_AP_STATE_ENABLED:
+                        enableWifiIpServingLocked(ifname, ipmode);
+                        break;
+                    case WifiManager.WIFI_AP_STATE_DISABLING:
+                        // We can see this state on the way to disabled.
+                        break;
+                    case WifiManager.WIFI_AP_STATE_DISABLED:
+                    case WifiManager.WIFI_AP_STATE_FAILED:
+                    default:
+                        disableWifiIpServingLocked(ifname, curState);
+                        break;
+                }
+            }
+        }
+
+        private boolean isGroupOwner(WifiP2pGroup group) {
+            return group != null && group.isGroupOwner()
+                    && !TextUtils.isEmpty(group.getInterface());
+        }
+
+        private void handleWifiP2pAction(Intent intent) {
+            if (mConfig.isWifiP2pLegacyTetheringMode()) return;
+
+            final WifiP2pInfo p2pInfo =
+                    (WifiP2pInfo) intent.getParcelableExtra(WifiP2pManager.EXTRA_WIFI_P2P_INFO);
+            final WifiP2pGroup group =
+                    (WifiP2pGroup) intent.getParcelableExtra(WifiP2pManager.EXTRA_WIFI_P2P_GROUP);
+
+            if (VDBG) {
+                Log.d(TAG, "WifiP2pAction: P2pInfo: " + p2pInfo + " Group: " + group);
+            }
+
+            synchronized (Tethering.this.mPublicSync) {
+                // if no group is formed, bring it down if needed.
+                if (p2pInfo == null || !p2pInfo.groupFormed) {
+                    disableWifiP2pIpServingLockedIfNeeded(mWifiP2pTetherInterface);
+                    mWifiP2pTetherInterface = null;
+                    return;
+                }
+
+                // If there is a group but the device is not the owner, bail out.
+                if (!isGroupOwner(group)) return;
+
+                // If already serving from the correct interface, nothing to do.
+                if (group.getInterface().equals(mWifiP2pTetherInterface)) return;
+
+                // If already serving from another interface, turn it down first.
+                if (!TextUtils.isEmpty(mWifiP2pTetherInterface)) {
+                    mLog.w("P2P tethered interface " + mWifiP2pTetherInterface
+                            + "is different from current interface "
+                            + group.getInterface() + ", re-tether it");
+                    disableWifiP2pIpServingLockedIfNeeded(mWifiP2pTetherInterface);
+                }
+
+                // Finally bring up serving on the new interface
+                mWifiP2pTetherInterface = group.getInterface();
+                enableWifiIpServingLocked(mWifiP2pTetherInterface, IFACE_IP_MODE_LOCAL_ONLY);
+            }
+        }
+
+        private void handleUserRestrictionAction() {
+            mTetheringRestriction.onUserRestrictionsChanged();
+        }
+
+        private void handleDataSaverChanged() {
+            final ConnectivityManager connMgr = (ConnectivityManager) mContext.getSystemService(
+                    Context.CONNECTIVITY_SERVICE);
+            final boolean isDataSaverEnabled = connMgr.getRestrictBackgroundStatus()
+                    != ConnectivityManager.RESTRICT_BACKGROUND_STATUS_DISABLED;
+
+            if (mDataSaverEnabled == isDataSaverEnabled) return;
+
+            mDataSaverEnabled = isDataSaverEnabled;
+            if (mDataSaverEnabled) {
+                untetherAll();
+            }
+        }
+    }
+
+    @VisibleForTesting
+    boolean isTetheringActive() {
+        return mActiveTetheringRequests.size() > 0;
+    }
+
+    @VisibleForTesting
+    protected static class UserRestrictionActionListener {
+        private final UserManager mUserManager;
+        private final Tethering mWrapper;
+        private final TetheringNotificationUpdater mNotificationUpdater;
+        public boolean mDisallowTethering;
+
+        public UserRestrictionActionListener(@NonNull UserManager um, @NonNull Tethering wrapper,
+                @NonNull TetheringNotificationUpdater updater) {
+            mUserManager = um;
+            mWrapper = wrapper;
+            mNotificationUpdater = updater;
+            mDisallowTethering = false;
+        }
+
+        public void onUserRestrictionsChanged() {
+            // getUserRestrictions gets restriction for this process' user, which is the primary
+            // user. This is fine because DISALLOW_CONFIG_TETHERING can only be set on the primary
+            // user. See UserManager.DISALLOW_CONFIG_TETHERING.
+            final Bundle restrictions = mUserManager.getUserRestrictions();
+            final boolean newlyDisallowed =
+                    restrictions.getBoolean(UserManager.DISALLOW_CONFIG_TETHERING);
+            final boolean prevDisallowed = mDisallowTethering;
+            mDisallowTethering = newlyDisallowed;
+
+            final boolean tetheringDisallowedChanged = (newlyDisallowed != prevDisallowed);
+            if (!tetheringDisallowedChanged) {
+                return;
+            }
+
+            if (!newlyDisallowed) {
+                // Clear the restricted notification when user is allowed to have tethering
+                // function.
+                mNotificationUpdater.tetheringRestrictionLifted();
+                return;
+            }
+
+            if (mWrapper.isTetheringActive()) {
+                // Restricted notification is shown when tethering function is disallowed on
+                // user's device.
+                mNotificationUpdater.notifyTetheringDisabledByRestriction();
+
+                // Untether from all downstreams since tethering is disallowed.
+                mWrapper.untetherAll();
+            }
+            // TODO(b/148139325): send tetheringSupported on restriction change
+        }
+    }
+
+    private void disableWifiIpServingLockedCommon(int tetheringType, String ifname, int apState) {
+        mLog.log("Canceling WiFi tethering request -"
+                + " type=" + tetheringType
+                + " interface=" + ifname
+                + " state=" + apState);
+
+        if (!TextUtils.isEmpty(ifname)) {
+            final TetherState ts = mTetherStates.get(ifname);
+            if (ts != null) {
+                ts.ipServer.unwanted();
+                return;
+            }
+        }
+
+        for (int i = 0; i < mTetherStates.size(); i++) {
+            final IpServer ipServer = mTetherStates.valueAt(i).ipServer;
+            if (ipServer.interfaceType() == tetheringType) {
+                ipServer.unwanted();
+                return;
+            }
+        }
+
+        mLog.log("Error disabling Wi-Fi IP serving; "
+                + (TextUtils.isEmpty(ifname) ? "no interface name specified"
+                                           : "specified interface: " + ifname));
+    }
+
+    private void disableWifiIpServingLocked(String ifname, int apState) {
+        // Regardless of whether we requested this transition, the AP has gone
+        // down.  Don't try to tether again unless we're requested to do so.
+        // TODO: Remove this altogether, once Wi-Fi reliably gives us an
+        // interface name with every broadcast.
+        mWifiTetherRequested = false;
+
+        disableWifiIpServingLockedCommon(TETHERING_WIFI, ifname, apState);
+    }
+
+    private void disableWifiP2pIpServingLockedIfNeeded(String ifname) {
+        if (TextUtils.isEmpty(ifname)) return;
+
+        disableWifiIpServingLockedCommon(TETHERING_WIFI_P2P, ifname, /* dummy */ 0);
+    }
+
+    private void enableWifiIpServingLocked(String ifname, int wifiIpMode) {
+        // Map wifiIpMode values to IpServer.Callback serving states, inferring
+        // from mWifiTetherRequested as a final "best guess".
+        final int ipServingMode;
+        switch (wifiIpMode) {
+            case IFACE_IP_MODE_TETHERED:
+                ipServingMode = IpServer.STATE_TETHERED;
+                break;
+            case IFACE_IP_MODE_LOCAL_ONLY:
+                ipServingMode = IpServer.STATE_LOCAL_ONLY;
+                break;
+            default:
+                mLog.e("Cannot enable IP serving in unknown WiFi mode: " + wifiIpMode);
+                return;
+        }
+
+        if (!TextUtils.isEmpty(ifname)) {
+            maybeTrackNewInterfaceLocked(ifname);
+            changeInterfaceState(ifname, ipServingMode);
+        } else {
+            mLog.e(String.format(
+                    "Cannot enable IP serving in mode %s on missing interface name",
+                    ipServingMode));
+        }
+    }
+
+    // TODO: Consider renaming to something more accurate in its description.
+    // This method:
+    //     - allows requesting either tethering or local hotspot serving states
+    //     - handles both enabling and disabling serving states
+    //     - only tethers the first matching interface in listInterfaces()
+    //       order of a given type
+    private void tetherMatchingInterfaces(int requestedState, int interfaceType) {
+        if (VDBG) {
+            Log.d(TAG, "tetherMatchingInterfaces(" + requestedState + ", " + interfaceType + ")");
+        }
+
+        String[] ifaces = null;
+        try {
+            ifaces = mNetd.interfaceGetList();
+        } catch (RemoteException | ServiceSpecificException e) {
+            Log.e(TAG, "Error listing Interfaces", e);
+            return;
+        }
+        String chosenIface = null;
+        if (ifaces != null) {
+            for (String iface : ifaces) {
+                if (ifaceNameToType(iface) == interfaceType) {
+                    chosenIface = iface;
+                    break;
+                }
+            }
+        }
+        if (chosenIface == null) {
+            Log.e(TAG, "could not find iface of type " + interfaceType);
+            return;
+        }
+
+        changeInterfaceState(chosenIface, requestedState);
+    }
+
+    private void changeInterfaceState(String ifname, int requestedState) {
+        final int result;
+        switch (requestedState) {
+            case IpServer.STATE_UNAVAILABLE:
+            case IpServer.STATE_AVAILABLE:
+                result = untether(ifname);
+                break;
+            case IpServer.STATE_TETHERED:
+            case IpServer.STATE_LOCAL_ONLY:
+                result = tether(ifname, requestedState);
+                break;
+            default:
+                Log.wtf(TAG, "Unknown interface state: " + requestedState);
+                return;
+        }
+        if (result != TETHER_ERROR_NO_ERROR) {
+            Log.e(TAG, "unable start or stop tethering on iface " + ifname);
+            return;
+        }
+    }
+
+    TetheringConfiguration getTetheringConfiguration() {
+        return mConfig;
+    }
+
+    boolean hasTetherableConfiguration() {
+        final TetheringConfiguration cfg = mConfig;
+        final boolean hasDownstreamConfiguration =
+                (cfg.tetherableUsbRegexs.length != 0)
+                || (cfg.tetherableWifiRegexs.length != 0)
+                || (cfg.tetherableBluetoothRegexs.length != 0);
+        final boolean hasUpstreamConfiguration = !cfg.preferredUpstreamIfaceTypes.isEmpty()
+                || cfg.chooseUpstreamAutomatically;
+
+        return hasDownstreamConfiguration && hasUpstreamConfiguration;
+    }
+
+    // TODO - update callers to use getTetheringConfiguration(),
+    // which has only final members.
+    String[] getTetherableUsbRegexs() {
+        return copy(mConfig.tetherableUsbRegexs);
+    }
+
+    String[] getTetherableWifiRegexs() {
+        return copy(mConfig.tetherableWifiRegexs);
+    }
+
+    String[] getTetherableBluetoothRegexs() {
+        return copy(mConfig.tetherableBluetoothRegexs);
+    }
+
+    int setUsbTethering(boolean enable) {
+        if (VDBG) Log.d(TAG, "setUsbTethering(" + enable + ")");
+        UsbManager usbManager = (UsbManager) mContext.getSystemService(Context.USB_SERVICE);
+        if (usbManager == null) {
+            mLog.e("setUsbTethering: failed to get UsbManager!");
+            return TETHER_ERROR_SERVICE_UNAVAIL;
+        }
+
+        synchronized (mPublicSync) {
+            usbManager.setCurrentFunctions(enable ? UsbManager.FUNCTION_RNDIS
+                    : UsbManager.FUNCTION_NONE);
+        }
+        return TETHER_ERROR_NO_ERROR;
+    }
+
+    private int setNcmTethering(boolean enable) {
+        if (VDBG) Log.d(TAG, "setNcmTethering(" + enable + ")");
+        UsbManager usbManager = (UsbManager) mContext.getSystemService(Context.USB_SERVICE);
+        synchronized (mPublicSync) {
+            usbManager.setCurrentFunctions(enable ? UsbManager.FUNCTION_NCM
+                    : UsbManager.FUNCTION_NONE);
+        }
+        return TETHER_ERROR_NO_ERROR;
+    }
+
+    // TODO review API - figure out how to delete these entirely.
+    String[] getTetheredIfaces() {
+        ArrayList<String> list = new ArrayList<String>();
+        synchronized (mPublicSync) {
+            for (int i = 0; i < mTetherStates.size(); i++) {
+                TetherState tetherState = mTetherStates.valueAt(i);
+                if (tetherState.lastState == IpServer.STATE_TETHERED) {
+                    list.add(mTetherStates.keyAt(i));
+                }
+            }
+        }
+        return list.toArray(new String[list.size()]);
+    }
+
+    String[] getTetherableIfaces() {
+        ArrayList<String> list = new ArrayList<String>();
+        synchronized (mPublicSync) {
+            for (int i = 0; i < mTetherStates.size(); i++) {
+                TetherState tetherState = mTetherStates.valueAt(i);
+                if (tetherState.lastState == IpServer.STATE_AVAILABLE) {
+                    list.add(mTetherStates.keyAt(i));
+                }
+            }
+        }
+        return list.toArray(new String[list.size()]);
+    }
+
+    String[] getTetheredDhcpRanges() {
+        // TODO: this is only valid for the old DHCP server. Latest search suggests it is only used
+        // by WifiP2pServiceImpl to start dnsmasq: remove/deprecate after migrating callers.
+        return mConfig.legacyDhcpRanges;
+    }
+
+    String[] getErroredIfaces() {
+        ArrayList<String> list = new ArrayList<String>();
+        synchronized (mPublicSync) {
+            for (int i = 0; i < mTetherStates.size(); i++) {
+                TetherState tetherState = mTetherStates.valueAt(i);
+                if (tetherState.lastError != TETHER_ERROR_NO_ERROR) {
+                    list.add(mTetherStates.keyAt(i));
+                }
+            }
+        }
+        return list.toArray(new String[list.size()]);
+    }
+
+    private void logMessage(State state, int what) {
+        mLog.log(state.getName() + " got " + sMagicDecoderRing.get(what, Integer.toString(what)));
+    }
+
+    private boolean upstreamWanted() {
+        if (!mForwardedDownstreams.isEmpty()) return true;
+
+        synchronized (mPublicSync) {
+            return mWifiTetherRequested;
+        }
+    }
+
+    // Needed because the canonical source of upstream truth is just the
+    // upstream interface set, |mCurrentUpstreamIfaceSet|.
+    private boolean pertainsToCurrentUpstream(UpstreamNetworkState ns) {
+        if (ns != null && ns.linkProperties != null && mCurrentUpstreamIfaceSet != null) {
+            for (String ifname : ns.linkProperties.getAllInterfaceNames()) {
+                if (mCurrentUpstreamIfaceSet.ifnames.contains(ifname)) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    class TetherMasterSM extends StateMachine {
+        // an interface SM has requested Tethering/Local Hotspot
+        static final int EVENT_IFACE_SERVING_STATE_ACTIVE       = BASE_MASTER + 1;
+        // an interface SM has unrequested Tethering/Local Hotspot
+        static final int EVENT_IFACE_SERVING_STATE_INACTIVE     = BASE_MASTER + 2;
+        // upstream connection change - do the right thing
+        static final int CMD_UPSTREAM_CHANGED                   = BASE_MASTER + 3;
+        // we don't have a valid upstream conn, check again after a delay
+        static final int CMD_RETRY_UPSTREAM                     = BASE_MASTER + 4;
+        // Events from NetworkCallbacks that we process on the master state
+        // machine thread on behalf of the UpstreamNetworkMonitor.
+        static final int EVENT_UPSTREAM_CALLBACK                = BASE_MASTER + 5;
+        // we treated the error and want now to clear it
+        static final int CMD_CLEAR_ERROR                        = BASE_MASTER + 6;
+        static final int EVENT_IFACE_UPDATE_LINKPROPERTIES      = BASE_MASTER + 7;
+        // Events from EntitlementManager to choose upstream again.
+        static final int EVENT_UPSTREAM_PERMISSION_CHANGED      = BASE_MASTER + 8;
+        private final State mInitialState;
+        private final State mTetherModeAliveState;
+
+        private final State mSetIpForwardingEnabledErrorState;
+        private final State mSetIpForwardingDisabledErrorState;
+        private final State mStartTetheringErrorState;
+        private final State mStopTetheringErrorState;
+        private final State mSetDnsForwardersErrorState;
+
+        // This list is a little subtle.  It contains all the interfaces that currently are
+        // requesting tethering, regardless of whether these interfaces are still members of
+        // mTetherStates.  This allows us to maintain the following predicates:
+        //
+        // 1) mTetherStates contains the set of all currently existing, tetherable, link state up
+        //    interfaces.
+        // 2) mNotifyList contains all state machines that may have outstanding tethering state
+        //    that needs to be torn down.
+        //
+        // Because we excise interfaces immediately from mTetherStates, we must maintain mNotifyList
+        // so that the garbage collector does not clean up the state machine before it has a chance
+        // to tear itself down.
+        private final ArrayList<IpServer> mNotifyList;
+        private final IPv6TetheringCoordinator mIPv6TetheringCoordinator;
+        private final OffloadWrapper mOffload;
+
+        private static final int UPSTREAM_SETTLE_TIME_MS     = 10000;
+
+        TetherMasterSM(String name, Looper looper, TetheringDependencies deps) {
+            super(name, looper);
+
+            mInitialState = new InitialState();
+            mTetherModeAliveState = new TetherModeAliveState();
+            mSetIpForwardingEnabledErrorState = new SetIpForwardingEnabledErrorState();
+            mSetIpForwardingDisabledErrorState = new SetIpForwardingDisabledErrorState();
+            mStartTetheringErrorState = new StartTetheringErrorState();
+            mStopTetheringErrorState = new StopTetheringErrorState();
+            mSetDnsForwardersErrorState = new SetDnsForwardersErrorState();
+
+            addState(mInitialState);
+            addState(mTetherModeAliveState);
+            addState(mSetIpForwardingEnabledErrorState);
+            addState(mSetIpForwardingDisabledErrorState);
+            addState(mStartTetheringErrorState);
+            addState(mStopTetheringErrorState);
+            addState(mSetDnsForwardersErrorState);
+
+            mNotifyList = new ArrayList<>();
+            mIPv6TetheringCoordinator = deps.getIPv6TetheringCoordinator(mNotifyList, mLog);
+            mOffload = new OffloadWrapper();
+
+            setInitialState(mInitialState);
+        }
+
+        class InitialState extends State {
+            @Override
+            public boolean processMessage(Message message) {
+                logMessage(this, message.what);
+                switch (message.what) {
+                    case EVENT_IFACE_SERVING_STATE_ACTIVE: {
+                        final IpServer who = (IpServer) message.obj;
+                        if (VDBG) Log.d(TAG, "Tether Mode requested by " + who);
+                        handleInterfaceServingStateActive(message.arg1, who);
+                        transitionTo(mTetherModeAliveState);
+                        break;
+                    }
+                    case EVENT_IFACE_SERVING_STATE_INACTIVE: {
+                        final IpServer who = (IpServer) message.obj;
+                        if (VDBG) Log.d(TAG, "Tether Mode unrequested by " + who);
+                        handleInterfaceServingStateInactive(who);
+                        break;
+                    }
+                    case EVENT_IFACE_UPDATE_LINKPROPERTIES:
+                        // Silently ignore these for now.
+                        break;
+                    default:
+                        return NOT_HANDLED;
+                }
+                return HANDLED;
+            }
+        }
+
+        protected boolean turnOnMasterTetherSettings() {
+            final TetheringConfiguration cfg = mConfig;
+            try {
+                mNetd.ipfwdEnableForwarding(TAG);
+            } catch (RemoteException | ServiceSpecificException e) {
+                mLog.e(e);
+                transitionTo(mSetIpForwardingEnabledErrorState);
+                return false;
+            }
+
+            // TODO: Randomize DHCPv4 ranges, especially in hotspot mode.
+            // Legacy DHCP server is disabled if passed an empty ranges array
+            final String[] dhcpRanges = cfg.enableLegacyDhcpServer
+                    ? cfg.legacyDhcpRanges : new String[0];
+            try {
+                NetdUtils.tetherStart(mNetd, true /** usingLegacyDnsProxy */, dhcpRanges);
+            } catch (RemoteException | ServiceSpecificException e) {
+                try {
+                    // Stop and retry.
+                    mNetd.tetherStop();
+                    NetdUtils.tetherStart(mNetd, true /** usingLegacyDnsProxy */, dhcpRanges);
+                } catch (RemoteException | ServiceSpecificException ee) {
+                    mLog.e(ee);
+                    transitionTo(mStartTetheringErrorState);
+                    return false;
+                }
+            }
+            mLog.log("SET master tether settings: ON");
+            return true;
+        }
+
+        protected boolean turnOffMasterTetherSettings() {
+            try {
+                mNetd.tetherStop();
+            } catch (RemoteException | ServiceSpecificException e) {
+                mLog.e(e);
+                transitionTo(mStopTetheringErrorState);
+                return false;
+            }
+            try {
+                mNetd.ipfwdDisableForwarding(TAG);
+            } catch (RemoteException | ServiceSpecificException e) {
+                mLog.e(e);
+                transitionTo(mSetIpForwardingDisabledErrorState);
+                return false;
+            }
+            transitionTo(mInitialState);
+            mLog.log("SET master tether settings: OFF");
+            return true;
+        }
+
+        protected void chooseUpstreamType(boolean tryCell) {
+            // We rebuild configuration on ACTION_CONFIGURATION_CHANGED, but we
+            // do not currently know how to watch for changes in DUN settings.
+            maybeDunSettingChanged();
+
+            final TetheringConfiguration config = mConfig;
+            final UpstreamNetworkState ns = (config.chooseUpstreamAutomatically)
+                    ? mUpstreamNetworkMonitor.getCurrentPreferredUpstream()
+                    : mUpstreamNetworkMonitor.selectPreferredUpstreamType(
+                            config.preferredUpstreamIfaceTypes);
+            if (ns == null) {
+                if (tryCell) {
+                    mUpstreamNetworkMonitor.registerMobileNetworkRequest();
+                    // We think mobile should be coming up; don't set a retry.
+                } else {
+                    sendMessageDelayed(CMD_RETRY_UPSTREAM, UPSTREAM_SETTLE_TIME_MS);
+                }
+            }
+            setUpstreamNetwork(ns);
+            final Network newUpstream = (ns != null) ? ns.network : null;
+            if (mTetherUpstream != newUpstream) {
+                mTetherUpstream = newUpstream;
+                mUpstreamNetworkMonitor.setCurrentUpstream(mTetherUpstream);
+                reportUpstreamChanged(ns);
+            }
+        }
+
+        protected void setUpstreamNetwork(UpstreamNetworkState ns) {
+            InterfaceSet ifaces = null;
+            if (ns != null) {
+                // Find the interface with the default IPv4 route. It may be the
+                // interface described by linkProperties, or one of the interfaces
+                // stacked on top of it.
+                mLog.i("Looking for default routes on: " + ns.linkProperties);
+                ifaces = TetheringInterfaceUtils.getTetheringInterfaces(ns);
+                mLog.i("Found upstream interface(s): " + ifaces);
+            }
+
+            if (ifaces != null) {
+                setDnsForwarders(ns.network, ns.linkProperties);
+            }
+            notifyDownstreamsOfNewUpstreamIface(ifaces);
+            if (ns != null && pertainsToCurrentUpstream(ns)) {
+                // If we already have UpstreamNetworkState for this network update it immediately.
+                handleNewUpstreamNetworkState(ns);
+            } else if (mCurrentUpstreamIfaceSet == null) {
+                // There are no available upstream networks.
+                handleNewUpstreamNetworkState(null);
+            }
+        }
+
+        protected void setDnsForwarders(final Network network, final LinkProperties lp) {
+            // TODO: Set v4 and/or v6 DNS per available connectivity.
+            final Collection<InetAddress> dnses = lp.getDnsServers();
+            // TODO: Properly support the absence of DNS servers.
+            final String[] dnsServers;
+            if (dnses != null && !dnses.isEmpty()) {
+                dnsServers = new String[dnses.size()];
+                int i = 0;
+                for (InetAddress dns : dnses) {
+                    dnsServers[i++] = dns.getHostAddress();
+                }
+            } else {
+                dnsServers = mConfig.defaultIPv4DNS;
+            }
+            final int netId = (network != null) ? network.getNetId() : NETID_UNSET;
+            try {
+                mNetd.tetherDnsSet(netId, dnsServers);
+                mLog.log(String.format(
+                        "SET DNS forwarders: network=%s dnsServers=%s",
+                        network, Arrays.toString(dnsServers)));
+            } catch (RemoteException | ServiceSpecificException e) {
+                // TODO: Investigate how this can fail and what exactly
+                // happens if/when such failures occur.
+                mLog.e("setting DNS forwarders failed, " + e);
+                transitionTo(mSetDnsForwardersErrorState);
+            }
+        }
+
+        protected void notifyDownstreamsOfNewUpstreamIface(InterfaceSet ifaces) {
+            mCurrentUpstreamIfaceSet = ifaces;
+            for (IpServer ipServer : mNotifyList) {
+                ipServer.sendMessage(IpServer.CMD_TETHER_CONNECTION_CHANGED, ifaces);
+            }
+        }
+
+        protected void handleNewUpstreamNetworkState(UpstreamNetworkState ns) {
+            mIPv6TetheringCoordinator.updateUpstreamNetworkState(ns);
+            mOffload.updateUpstreamNetworkState(ns);
+        }
+
+        private void handleInterfaceServingStateActive(int mode, IpServer who) {
+            if (mNotifyList.indexOf(who) < 0) {
+                mNotifyList.add(who);
+                mIPv6TetheringCoordinator.addActiveDownstream(who, mode);
+            }
+
+            if (mode == IpServer.STATE_TETHERED) {
+                // No need to notify OffloadController just yet as there are no
+                // "offload-able" prefixes to pass along. This will handled
+                // when the TISM informs Tethering of its LinkProperties.
+                mForwardedDownstreams.add(who);
+            } else {
+                mOffload.excludeDownstreamInterface(who.interfaceName());
+                mForwardedDownstreams.remove(who);
+            }
+
+            // If this is a Wi-Fi interface, notify WifiManager of the active serving state.
+            if (who.interfaceType() == TETHERING_WIFI) {
+                final WifiManager mgr = getWifiManager();
+                final String iface = who.interfaceName();
+                switch (mode) {
+                    case IpServer.STATE_TETHERED:
+                        mgr.updateInterfaceIpState(iface, IFACE_IP_MODE_TETHERED);
+                        break;
+                    case IpServer.STATE_LOCAL_ONLY:
+                        mgr.updateInterfaceIpState(iface, IFACE_IP_MODE_LOCAL_ONLY);
+                        break;
+                    default:
+                        Log.wtf(TAG, "Unknown active serving mode: " + mode);
+                        break;
+                }
+            }
+        }
+
+        private void handleInterfaceServingStateInactive(IpServer who) {
+            mNotifyList.remove(who);
+            mIPv6TetheringCoordinator.removeActiveDownstream(who);
+            mOffload.excludeDownstreamInterface(who.interfaceName());
+            mForwardedDownstreams.remove(who);
+            updateConnectedClients(null /* wifiClients */);
+
+            // If this is a Wi-Fi interface, tell WifiManager of any errors
+            // or the inactive serving state.
+            if (who.interfaceType() == TETHERING_WIFI) {
+                if (who.lastError() != TETHER_ERROR_NO_ERROR) {
+                    getWifiManager().updateInterfaceIpState(
+                            who.interfaceName(), IFACE_IP_MODE_CONFIGURATION_ERROR);
+                } else {
+                    getWifiManager().updateInterfaceIpState(
+                            who.interfaceName(), IFACE_IP_MODE_UNSPECIFIED);
+                }
+            }
+        }
+
+        @VisibleForTesting
+        void handleUpstreamNetworkMonitorCallback(int arg1, Object o) {
+            if (arg1 == UpstreamNetworkMonitor.NOTIFY_LOCAL_PREFIXES) {
+                mOffload.sendOffloadExemptPrefixes((Set<IpPrefix>) o);
+                return;
+            }
+
+            final UpstreamNetworkState ns = (UpstreamNetworkState) o;
+
+            if (ns == null || !pertainsToCurrentUpstream(ns)) {
+                // TODO: In future, this is where upstream evaluation and selection
+                // could be handled for notifications which include sufficient data.
+                // For example, after CONNECTIVITY_ACTION listening is removed, here
+                // is where we could observe a Wi-Fi network becoming available and
+                // passing validation.
+                if (mCurrentUpstreamIfaceSet == null) {
+                    // If we have no upstream interface, try to run through upstream
+                    // selection again.  If, for example, IPv4 connectivity has shown up
+                    // after IPv6 (e.g., 464xlat became available) we want the chance to
+                    // notice and act accordingly.
+                    chooseUpstreamType(false);
+                }
+                return;
+            }
+
+            switch (arg1) {
+                case UpstreamNetworkMonitor.EVENT_ON_CAPABILITIES:
+                    if (ns.network.equals(mTetherUpstream)) {
+                        mNotificationUpdater.onUpstreamCapabilitiesChanged(ns.networkCapabilities);
+                    }
+                    handleNewUpstreamNetworkState(ns);
+                    break;
+                case UpstreamNetworkMonitor.EVENT_ON_LINKPROPERTIES:
+                    chooseUpstreamType(false);
+                    break;
+                case UpstreamNetworkMonitor.EVENT_ON_LOST:
+                    // TODO: Re-evaluate possible upstreams. Currently upstream
+                    // reevaluation is triggered via received CONNECTIVITY_ACTION
+                    // broadcasts that result in being passed a
+                    // TetherMasterSM.CMD_UPSTREAM_CHANGED.
+                    handleNewUpstreamNetworkState(null);
+                    break;
+                default:
+                    mLog.e("Unknown arg1 value: " + arg1);
+                    break;
+            }
+        }
+
+        class TetherModeAliveState extends State {
+            boolean mUpstreamWanted = false;
+            boolean mTryCell = true;
+
+            @Override
+            public void enter() {
+                // If turning on master tether settings fails, we have already
+                // transitioned to an error state; exit early.
+                if (!turnOnMasterTetherSettings()) {
+                    return;
+                }
+
+                mUpstreamNetworkMonitor.startObserveAllNetworks();
+
+                // TODO: De-duplicate with updateUpstreamWanted() below.
+                if (upstreamWanted()) {
+                    mUpstreamWanted = true;
+                    mOffload.start();
+                    chooseUpstreamType(true);
+                    mTryCell = false;
+                }
+            }
+
+            @Override
+            public void exit() {
+                mOffload.stop();
+                mUpstreamNetworkMonitor.stop();
+                notifyDownstreamsOfNewUpstreamIface(null);
+                handleNewUpstreamNetworkState(null);
+                if (mTetherUpstream != null) {
+                    mTetherUpstream = null;
+                    reportUpstreamChanged(null);
+                }
+            }
+
+            private boolean updateUpstreamWanted() {
+                final boolean previousUpstreamWanted = mUpstreamWanted;
+                mUpstreamWanted = upstreamWanted();
+                if (mUpstreamWanted != previousUpstreamWanted) {
+                    if (mUpstreamWanted) {
+                        mOffload.start();
+                    } else {
+                        mOffload.stop();
+                    }
+                }
+                return previousUpstreamWanted;
+            }
+
+            @Override
+            public boolean processMessage(Message message) {
+                logMessage(this, message.what);
+                boolean retValue = true;
+                switch (message.what) {
+                    case EVENT_IFACE_SERVING_STATE_ACTIVE: {
+                        IpServer who = (IpServer) message.obj;
+                        if (VDBG) Log.d(TAG, "Tether Mode requested by " + who);
+                        handleInterfaceServingStateActive(message.arg1, who);
+                        who.sendMessage(IpServer.CMD_TETHER_CONNECTION_CHANGED,
+                                mCurrentUpstreamIfaceSet);
+                        // If there has been a change and an upstream is now
+                        // desired, kick off the selection process.
+                        final boolean previousUpstreamWanted = updateUpstreamWanted();
+                        if (!previousUpstreamWanted && mUpstreamWanted) {
+                            chooseUpstreamType(true);
+                        }
+                        break;
+                    }
+                    case EVENT_IFACE_SERVING_STATE_INACTIVE: {
+                        IpServer who = (IpServer) message.obj;
+                        if (VDBG) Log.d(TAG, "Tether Mode unrequested by " + who);
+                        handleInterfaceServingStateInactive(who);
+
+                        if (mNotifyList.isEmpty()) {
+                            // This transitions us out of TetherModeAliveState,
+                            // either to InitialState or an error state.
+                            turnOffMasterTetherSettings();
+                            break;
+                        }
+
+                        if (DBG) {
+                            Log.d(TAG, "TetherModeAlive still has " + mNotifyList.size()
+                                    + " live requests:");
+                            for (IpServer o : mNotifyList) {
+                                Log.d(TAG, "  " + o);
+                            }
+                        }
+                        // If there has been a change and an upstream is no
+                        // longer desired, release any mobile requests.
+                        final boolean previousUpstreamWanted = updateUpstreamWanted();
+                        if (previousUpstreamWanted && !mUpstreamWanted) {
+                            mUpstreamNetworkMonitor.releaseMobileNetworkRequest();
+                        }
+                        break;
+                    }
+                    case EVENT_IFACE_UPDATE_LINKPROPERTIES: {
+                        final LinkProperties newLp = (LinkProperties) message.obj;
+                        if (message.arg1 == IpServer.STATE_TETHERED) {
+                            mOffload.updateDownstreamLinkProperties(newLp);
+                        } else {
+                            mOffload.excludeDownstreamInterface(newLp.getInterfaceName());
+                        }
+                        break;
+                    }
+                    case EVENT_UPSTREAM_PERMISSION_CHANGED:
+                    case CMD_UPSTREAM_CHANGED:
+                        updateUpstreamWanted();
+                        if (!mUpstreamWanted) break;
+
+                        // Need to try DUN immediately if Wi-Fi goes down.
+                        chooseUpstreamType(true);
+                        mTryCell = false;
+                        break;
+                    case CMD_RETRY_UPSTREAM:
+                        updateUpstreamWanted();
+                        if (!mUpstreamWanted) break;
+
+                        chooseUpstreamType(mTryCell);
+                        mTryCell = !mTryCell;
+                        break;
+                    case EVENT_UPSTREAM_CALLBACK: {
+                        updateUpstreamWanted();
+                        if (mUpstreamWanted) {
+                            handleUpstreamNetworkMonitorCallback(message.arg1, message.obj);
+                        }
+                        break;
+                    }
+                    default:
+                        retValue = false;
+                        break;
+                }
+                return retValue;
+            }
+        }
+
+        class ErrorState extends State {
+            private int mErrorNotification;
+
+            @Override
+            public boolean processMessage(Message message) {
+                boolean retValue = true;
+                switch (message.what) {
+                    case EVENT_IFACE_SERVING_STATE_ACTIVE:
+                        IpServer who = (IpServer) message.obj;
+                        who.sendMessage(mErrorNotification);
+                        break;
+                    case CMD_CLEAR_ERROR:
+                        mErrorNotification = TETHER_ERROR_NO_ERROR;
+                        transitionTo(mInitialState);
+                        break;
+                    default:
+                        retValue = false;
+                }
+                return retValue;
+            }
+
+            void notify(int msgType) {
+                mErrorNotification = msgType;
+                for (IpServer ipServer : mNotifyList) {
+                    ipServer.sendMessage(msgType);
+                }
+            }
+
+        }
+
+        class SetIpForwardingEnabledErrorState extends ErrorState {
+            @Override
+            public void enter() {
+                Log.e(TAG, "Error in setIpForwardingEnabled");
+                notify(IpServer.CMD_IP_FORWARDING_ENABLE_ERROR);
+            }
+        }
+
+        class SetIpForwardingDisabledErrorState extends ErrorState {
+            @Override
+            public void enter() {
+                Log.e(TAG, "Error in setIpForwardingDisabled");
+                notify(IpServer.CMD_IP_FORWARDING_DISABLE_ERROR);
+            }
+        }
+
+        class StartTetheringErrorState extends ErrorState {
+            @Override
+            public void enter() {
+                Log.e(TAG, "Error in startTethering");
+                notify(IpServer.CMD_START_TETHERING_ERROR);
+                try {
+                    mNetd.ipfwdDisableForwarding(TAG);
+                } catch (RemoteException | ServiceSpecificException e) { }
+            }
+        }
+
+        class StopTetheringErrorState extends ErrorState {
+            @Override
+            public void enter() {
+                Log.e(TAG, "Error in stopTethering");
+                notify(IpServer.CMD_STOP_TETHERING_ERROR);
+                try {
+                    mNetd.ipfwdDisableForwarding(TAG);
+                } catch (RemoteException | ServiceSpecificException e) { }
+            }
+        }
+
+        class SetDnsForwardersErrorState extends ErrorState {
+            @Override
+            public void enter() {
+                Log.e(TAG, "Error in setDnsForwarders");
+                notify(IpServer.CMD_SET_DNS_FORWARDERS_ERROR);
+                try {
+                    mNetd.tetherStop();
+                } catch (RemoteException | ServiceSpecificException e) { }
+                try {
+                    mNetd.ipfwdDisableForwarding(TAG);
+                } catch (RemoteException | ServiceSpecificException e) { }
+            }
+        }
+
+        // A wrapper class to handle multiple situations where several calls to
+        // the OffloadController need to happen together.
+        //
+        // TODO: This suggests that the interface between OffloadController and
+        // Tethering is in need of improvement. Refactor these calls into the
+        // OffloadController implementation.
+        class OffloadWrapper {
+            public void start() {
+                final int status = mOffloadController.start() ? TETHER_HARDWARE_OFFLOAD_STARTED
+                        : TETHER_HARDWARE_OFFLOAD_FAILED;
+                updateOffloadStatus(status);
+                sendOffloadExemptPrefixes();
+            }
+
+            public void stop() {
+                mOffloadController.stop();
+                updateOffloadStatus(TETHER_HARDWARE_OFFLOAD_STOPPED);
+            }
+
+            public void updateUpstreamNetworkState(UpstreamNetworkState ns) {
+                mOffloadController.setUpstreamLinkProperties(
+                        (ns != null) ? ns.linkProperties : null);
+            }
+
+            public void updateDownstreamLinkProperties(LinkProperties newLp) {
+                // Update the list of offload-exempt prefixes before adding
+                // new prefixes on downstream interfaces to the offload HAL.
+                sendOffloadExemptPrefixes();
+                mOffloadController.notifyDownstreamLinkProperties(newLp);
+            }
+
+            public void excludeDownstreamInterface(String ifname) {
+                // This and other interfaces may be in local-only hotspot mode;
+                // resend all local prefixes to the OffloadController.
+                sendOffloadExemptPrefixes();
+                mOffloadController.removeDownstreamInterface(ifname);
+            }
+
+            public void sendOffloadExemptPrefixes() {
+                sendOffloadExemptPrefixes(mUpstreamNetworkMonitor.getLocalPrefixes());
+            }
+
+            public void sendOffloadExemptPrefixes(final Set<IpPrefix> localPrefixes) {
+                // Add in well-known minimum set.
+                PrefixUtils.addNonForwardablePrefixes(localPrefixes);
+                // Add tragically hardcoded prefixes.
+                localPrefixes.add(PrefixUtils.DEFAULT_WIFI_P2P_PREFIX);
+
+                // Maybe add prefixes or addresses for downstreams, depending on
+                // the IP serving mode of each.
+                for (IpServer ipServer : mNotifyList) {
+                    final LinkProperties lp = ipServer.linkProperties();
+
+                    switch (ipServer.servingMode()) {
+                        case IpServer.STATE_UNAVAILABLE:
+                        case IpServer.STATE_AVAILABLE:
+                            // No usable LinkProperties in these states.
+                            continue;
+                        case IpServer.STATE_TETHERED:
+                            // Only add IPv4 /32 and IPv6 /128 prefixes. The
+                            // directly-connected prefixes will be sent as
+                            // downstream "offload-able" prefixes.
+                            for (LinkAddress addr : lp.getAllLinkAddresses()) {
+                                final InetAddress ip = addr.getAddress();
+                                if (ip.isLinkLocalAddress()) continue;
+                                localPrefixes.add(PrefixUtils.ipAddressAsPrefix(ip));
+                            }
+                            break;
+                        case IpServer.STATE_LOCAL_ONLY:
+                            // Add prefixes covering all local IPs.
+                            localPrefixes.addAll(PrefixUtils.localPrefixesFrom(lp));
+                            break;
+                    }
+                }
+
+                mOffloadController.setLocalPrefixes(localPrefixes);
+            }
+
+            private void updateOffloadStatus(final int newStatus) {
+                if (newStatus == mOffloadStatus) return;
+
+                mOffloadStatus = newStatus;
+                reportOffloadStatusChanged(mOffloadStatus);
+            }
+        }
+    }
+
+    private void startTrackDefaultNetwork() {
+        mUpstreamNetworkMonitor.startTrackDefaultNetwork(mDeps.getDefaultNetworkRequest(),
+                mEntitlementMgr);
+    }
+
+    /** Get the latest value of the tethering entitlement check. */
+    void requestLatestTetheringEntitlementResult(int type, ResultReceiver receiver,
+            boolean showEntitlementUi) {
+        if (receiver == null) return;
+
+        mHandler.post(() -> {
+            mEntitlementMgr.requestLatestTetheringEntitlementResult(type, receiver,
+                    showEntitlementUi);
+        });
+    }
+
+    /** Register tethering event callback */
+    void registerTetheringEventCallback(ITetheringEventCallback callback) {
+        final boolean hasListPermission =
+                hasCallingPermission(NETWORK_SETTINGS)
+                        || hasCallingPermission(PERMISSION_MAINLINE_NETWORK_STACK)
+                        || hasCallingPermission(NETWORK_STACK);
+        mHandler.post(() -> {
+            mTetheringEventCallbacks.register(callback, new CallbackCookie(hasListPermission));
+            final TetheringCallbackStartedParcel parcel = new TetheringCallbackStartedParcel();
+            parcel.tetheringSupported = mDeps.isTetheringSupported();
+            parcel.upstreamNetwork = mTetherUpstream;
+            parcel.config = mConfig.toStableParcelable();
+            parcel.states =
+                    mTetherStatesParcel != null ? mTetherStatesParcel : emptyTetherStatesParcel();
+            parcel.tetheredClients = hasListPermission
+                    ? mConnectedClientsTracker.getLastTetheredClients()
+                    : Collections.emptyList();
+            parcel.offloadStatus = mOffloadStatus;
+            try {
+                callback.onCallbackStarted(parcel);
+            } catch (RemoteException e) {
+                // Not really very much to do here.
+            }
+        });
+    }
+
+    private TetherStatesParcel emptyTetherStatesParcel() {
+        final TetherStatesParcel parcel = new TetherStatesParcel();
+        parcel.availableList = new String[0];
+        parcel.tetheredList = new String[0];
+        parcel.localOnlyList = new String[0];
+        parcel.erroredIfaceList = new String[0];
+        parcel.lastErrorList = new int[0];
+
+        return parcel;
+    }
+
+    private boolean hasCallingPermission(@NonNull String permission) {
+        return mContext.checkCallingPermission(permission) == PERMISSION_GRANTED;
+    }
+
+    /** Unregister tethering event callback */
+    void unregisterTetheringEventCallback(ITetheringEventCallback callback) {
+        mHandler.post(() -> {
+            mTetheringEventCallbacks.unregister(callback);
+        });
+    }
+
+    private void reportUpstreamChanged(UpstreamNetworkState ns) {
+        final int length = mTetheringEventCallbacks.beginBroadcast();
+        final Network network = (ns != null) ? ns.network : null;
+        final NetworkCapabilities capabilities = (ns != null) ? ns.networkCapabilities : null;
+        try {
+            for (int i = 0; i < length; i++) {
+                try {
+                    mTetheringEventCallbacks.getBroadcastItem(i).onUpstreamChanged(network);
+                } catch (RemoteException e) {
+                    // Not really very much to do here.
+                }
+            }
+        } finally {
+            mTetheringEventCallbacks.finishBroadcast();
+        }
+        // Need to notify capabilities change after upstream network changed because new network's
+        // capabilities should be checked every time.
+        mNotificationUpdater.onUpstreamCapabilitiesChanged(capabilities);
+    }
+
+    private void reportConfigurationChanged(TetheringConfigurationParcel config) {
+        final int length = mTetheringEventCallbacks.beginBroadcast();
+        try {
+            for (int i = 0; i < length; i++) {
+                try {
+                    mTetheringEventCallbacks.getBroadcastItem(i).onConfigurationChanged(config);
+                    // TODO(b/148139325): send tetheringSupported on configuration change
+                } catch (RemoteException e) {
+                    // Not really very much to do here.
+                }
+            }
+        } finally {
+            mTetheringEventCallbacks.finishBroadcast();
+        }
+    }
+
+    private void reportTetherStateChanged(TetherStatesParcel states) {
+        final int length = mTetheringEventCallbacks.beginBroadcast();
+        try {
+            for (int i = 0; i < length; i++) {
+                try {
+                    mTetheringEventCallbacks.getBroadcastItem(i).onTetherStatesChanged(states);
+                } catch (RemoteException e) {
+                    // Not really very much to do here.
+                }
+            }
+        } finally {
+            mTetheringEventCallbacks.finishBroadcast();
+        }
+    }
+
+    private void reportTetherClientsChanged(List<TetheredClient> clients) {
+        final int length = mTetheringEventCallbacks.beginBroadcast();
+        try {
+            for (int i = 0; i < length; i++) {
+                try {
+                    final CallbackCookie cookie =
+                            (CallbackCookie) mTetheringEventCallbacks.getBroadcastCookie(i);
+                    if (!cookie.hasListClientsPermission) continue;
+                    mTetheringEventCallbacks.getBroadcastItem(i).onTetherClientsChanged(clients);
+                } catch (RemoteException e) {
+                    // Not really very much to do here.
+                }
+            }
+        } finally {
+            mTetheringEventCallbacks.finishBroadcast();
+        }
+    }
+
+    private void reportOffloadStatusChanged(final int status) {
+        final int length = mTetheringEventCallbacks.beginBroadcast();
+        try {
+            for (int i = 0; i < length; i++) {
+                try {
+                    mTetheringEventCallbacks.getBroadcastItem(i).onOffloadStatusChanged(status);
+                } catch (RemoteException e) {
+                    // Not really very much to do here.
+                }
+            }
+        } finally {
+            mTetheringEventCallbacks.finishBroadcast();
+        }
+    }
+
+    void dump(@NonNull FileDescriptor fd, @NonNull PrintWriter writer, @Nullable String[] args) {
+        // Binder.java closes the resource for us.
+        @SuppressWarnings("resource")
+        final IndentingPrintWriter pw = new IndentingPrintWriter(writer, "  ");
+        if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP)
+                != PERMISSION_GRANTED) {
+            pw.println("Permission Denial: can't dump.");
+            return;
+        }
+
+        pw.println("Tethering:");
+        pw.increaseIndent();
+
+        pw.println("Configuration:");
+        pw.increaseIndent();
+        final TetheringConfiguration cfg = mConfig;
+        cfg.dump(pw);
+        pw.decreaseIndent();
+
+        pw.println("Entitlement:");
+        pw.increaseIndent();
+        mEntitlementMgr.dump(pw);
+        pw.decreaseIndent();
+
+        synchronized (mPublicSync) {
+            pw.println("Tether state:");
+            pw.increaseIndent();
+            for (int i = 0; i < mTetherStates.size(); i++) {
+                final String iface = mTetherStates.keyAt(i);
+                final TetherState tetherState = mTetherStates.valueAt(i);
+                pw.print(iface + " - ");
+
+                switch (tetherState.lastState) {
+                    case IpServer.STATE_UNAVAILABLE:
+                        pw.print("UnavailableState");
+                        break;
+                    case IpServer.STATE_AVAILABLE:
+                        pw.print("AvailableState");
+                        break;
+                    case IpServer.STATE_TETHERED:
+                        pw.print("TetheredState");
+                        break;
+                    case IpServer.STATE_LOCAL_ONLY:
+                        pw.print("LocalHotspotState");
+                        break;
+                    default:
+                        pw.print("UnknownState");
+                        break;
+                }
+                pw.println(" - lastError = " + tetherState.lastError);
+            }
+            pw.println("Upstream wanted: " + upstreamWanted());
+            pw.println("Current upstream interface(s): " + mCurrentUpstreamIfaceSet);
+            pw.decreaseIndent();
+        }
+
+        pw.println("Hardware offload:");
+        pw.increaseIndent();
+        mOffloadController.dump(pw);
+        pw.decreaseIndent();
+
+        pw.println("Log:");
+        pw.increaseIndent();
+        if (argsContain(args, "--short")) {
+            pw.println("<log removed for brevity>");
+        } else {
+            mLog.dump(fd, pw, args);
+        }
+        pw.decreaseIndent();
+
+        pw.decreaseIndent();
+    }
+
+    private static boolean argsContain(String[] args, String target) {
+        for (String arg : args) {
+            if (target.equals(arg)) return true;
+        }
+        return false;
+    }
+
+    private void updateConnectedClients(final List<WifiClient> wifiClients) {
+        if (mConnectedClientsTracker.updateConnectedClients(mForwardedDownstreams, wifiClients)) {
+            reportTetherClientsChanged(mConnectedClientsTracker.getLastTetheredClients());
+        }
+    }
+
+    private IpServer.Callback makeControlCallback() {
+        return new IpServer.Callback() {
+            @Override
+            public void updateInterfaceState(IpServer who, int state, int lastError) {
+                notifyInterfaceStateChange(who, state, lastError);
+            }
+
+            @Override
+            public void updateLinkProperties(IpServer who, LinkProperties newLp) {
+                notifyLinkPropertiesChanged(who, newLp);
+            }
+
+            @Override
+            public void dhcpLeasesChanged() {
+                updateConnectedClients(null /* wifiClients */);
+            }
+        };
+    }
+
+    // TODO: Move into TetherMasterSM.
+    private void notifyInterfaceStateChange(IpServer who, int state, int error) {
+        final String iface = who.interfaceName();
+        synchronized (mPublicSync) {
+            final TetherState tetherState = mTetherStates.get(iface);
+            if (tetherState != null && tetherState.ipServer.equals(who)) {
+                tetherState.lastState = state;
+                tetherState.lastError = error;
+            } else {
+                if (DBG) Log.d(TAG, "got notification from stale iface " + iface);
+            }
+        }
+
+        mLog.log(String.format("OBSERVED iface=%s state=%s error=%s", iface, state, error));
+
+        // If TetherMasterSM is in ErrorState, TetherMasterSM stays there.
+        // Thus we give a chance for TetherMasterSM to recover to InitialState
+        // by sending CMD_CLEAR_ERROR
+        if (error == TETHER_ERROR_INTERNAL_ERROR) {
+            mTetherMasterSM.sendMessage(TetherMasterSM.CMD_CLEAR_ERROR, who);
+        }
+        int which;
+        switch (state) {
+            case IpServer.STATE_UNAVAILABLE:
+            case IpServer.STATE_AVAILABLE:
+                which = TetherMasterSM.EVENT_IFACE_SERVING_STATE_INACTIVE;
+                break;
+            case IpServer.STATE_TETHERED:
+            case IpServer.STATE_LOCAL_ONLY:
+                which = TetherMasterSM.EVENT_IFACE_SERVING_STATE_ACTIVE;
+                break;
+            default:
+                Log.wtf(TAG, "Unknown interface state: " + state);
+                return;
+        }
+        mTetherMasterSM.sendMessage(which, state, 0, who);
+        sendTetherStateChangedBroadcast();
+    }
+
+    private void notifyLinkPropertiesChanged(IpServer who, LinkProperties newLp) {
+        final String iface = who.interfaceName();
+        final int state;
+        synchronized (mPublicSync) {
+            final TetherState tetherState = mTetherStates.get(iface);
+            if (tetherState != null && tetherState.ipServer.equals(who)) {
+                state = tetherState.lastState;
+            } else {
+                mLog.log("got notification from stale iface " + iface);
+                return;
+            }
+        }
+
+        mLog.log(String.format(
+                "OBSERVED LinkProperties update iface=%s state=%s lp=%s",
+                iface, IpServer.getStateString(state), newLp));
+        final int which = TetherMasterSM.EVENT_IFACE_UPDATE_LINKPROPERTIES;
+        mTetherMasterSM.sendMessage(which, state, 0, newLp);
+    }
+
+    private void maybeTrackNewInterfaceLocked(final String iface) {
+        // If we don't care about this type of interface, ignore.
+        final int interfaceType = ifaceNameToType(iface);
+        if (interfaceType == TETHERING_INVALID) {
+            mLog.log(iface + " is not a tetherable iface, ignoring");
+            return;
+        }
+        maybeTrackNewInterfaceLocked(iface, interfaceType);
+    }
+
+    private void maybeTrackNewInterfaceLocked(final String iface, int interfaceType) {
+        // If we have already started a TISM for this interface, skip.
+        if (mTetherStates.containsKey(iface)) {
+            mLog.log("active iface (" + iface + ") reported as added, ignoring");
+            return;
+        }
+
+        mLog.log("adding TetheringInterfaceStateMachine for: " + iface);
+        final TetherState tetherState = new TetherState(
+                new IpServer(iface, mLooper, interfaceType, mLog, mNetd,
+                             makeControlCallback(), mConfig.enableLegacyDhcpServer,
+                             mDeps.getIpServerDependencies()));
+        mTetherStates.put(iface, tetherState);
+        tetherState.ipServer.start();
+    }
+
+    private void stopTrackingInterfaceLocked(final String iface) {
+        final TetherState tetherState = mTetherStates.get(iface);
+        if (tetherState == null) {
+            mLog.log("attempting to remove unknown iface (" + iface + "), ignoring");
+            return;
+        }
+        tetherState.ipServer.stop();
+        mLog.log("removing TetheringInterfaceStateMachine for: " + iface);
+        mTetherStates.remove(iface);
+    }
+
+    private static String[] copy(String[] strarray) {
+        return Arrays.copyOf(strarray, strarray.length);
+    }
+}
diff --git a/packages/Tethering/src/com/android/networkstack/tethering/TetheringConfiguration.java b/packages/Tethering/src/com/android/networkstack/tethering/TetheringConfiguration.java
new file mode 100644
index 0000000..aeac437
--- /dev/null
+++ b/packages/Tethering/src/com/android/networkstack/tethering/TetheringConfiguration.java
@@ -0,0 +1,415 @@
+/*
+ * Copyright (C) 2017 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.networkstack.tethering;
+
+import static android.content.Context.TELEPHONY_SERVICE;
+import static android.net.ConnectivityManager.TYPE_ETHERNET;
+import static android.net.ConnectivityManager.TYPE_MOBILE;
+import static android.net.ConnectivityManager.TYPE_MOBILE_DUN;
+import static android.net.ConnectivityManager.TYPE_MOBILE_HIPRI;
+import static android.provider.DeviceConfig.NAMESPACE_CONNECTIVITY;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.net.TetheringConfigurationParcel;
+import android.net.util.SharedLog;
+import android.provider.DeviceConfig;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+import android.text.TextUtils;
+
+import com.android.internal.annotations.VisibleForTesting;
+
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.StringJoiner;
+
+
+/**
+ * A utility class to encapsulate the various tethering configuration elements.
+ *
+ * This configuration data includes elements describing upstream properties
+ * (preferred and required types of upstream connectivity as well as default
+ * DNS servers to use if none are available) and downstream properties (such
+ * as regular expressions use to match suitable downstream interfaces and the
+ * DHCPv4 ranges to use).
+ *
+ * @hide
+ */
+public class TetheringConfiguration {
+    private static final String TAG = TetheringConfiguration.class.getSimpleName();
+
+    private static final String[] EMPTY_STRING_ARRAY = new String[0];
+
+    // Default ranges used for the legacy DHCP server.
+    // USB is  192.168.42.1 and 255.255.255.0
+    // Wifi is 192.168.43.1 and 255.255.255.0
+    // BT is limited to max default of 5 connections. 192.168.44.1 to 192.168.48.1
+    // with 255.255.255.0
+    // P2P is 192.168.49.1 and 255.255.255.0
+    private static final String[] LEGACY_DHCP_DEFAULT_RANGE = {
+        "192.168.42.2", "192.168.42.254", "192.168.43.2", "192.168.43.254",
+        "192.168.44.2", "192.168.44.254", "192.168.45.2", "192.168.45.254",
+        "192.168.46.2", "192.168.46.254", "192.168.47.2", "192.168.47.254",
+        "192.168.48.2", "192.168.48.254", "192.168.49.2", "192.168.49.254",
+    };
+
+    private static final String[] DEFAULT_IPV4_DNS = {"8.8.4.4", "8.8.8.8"};
+
+    /**
+     * Use the old dnsmasq DHCP server for tethering instead of the framework implementation.
+     */
+    public static final String TETHER_ENABLE_LEGACY_DHCP_SERVER =
+            "tether_enable_legacy_dhcp_server";
+
+    public final String[] tetherableUsbRegexs;
+    public final String[] tetherableWifiRegexs;
+    public final String[] tetherableWifiP2pRegexs;
+    public final String[] tetherableBluetoothRegexs;
+    public final String[] tetherableNcmRegexs;
+    public final boolean isDunRequired;
+    public final boolean chooseUpstreamAutomatically;
+    public final Collection<Integer> preferredUpstreamIfaceTypes;
+    public final String[] legacyDhcpRanges;
+    public final String[] defaultIPv4DNS;
+    public final boolean enableLegacyDhcpServer;
+
+    public final String[] provisioningApp;
+    public final String provisioningAppNoUi;
+    public final int provisioningCheckPeriod;
+
+    public final int activeDataSubId;
+
+    public TetheringConfiguration(Context ctx, SharedLog log, int id) {
+        final SharedLog configLog = log.forSubComponent("config");
+
+        activeDataSubId = id;
+        Resources res = getResources(ctx, activeDataSubId);
+
+        tetherableUsbRegexs = getResourceStringArray(res, R.array.config_tether_usb_regexs);
+        tetherableNcmRegexs = getResourceStringArray(res, R.array.config_tether_ncm_regexs);
+        // TODO: Evaluate deleting this altogether now that Wi-Fi always passes
+        // us an interface name. Careful consideration needs to be given to
+        // implications for Settings and for provisioning checks.
+        tetherableWifiRegexs = getResourceStringArray(res, R.array.config_tether_wifi_regexs);
+        tetherableWifiP2pRegexs = getResourceStringArray(
+                res, R.array.config_tether_wifi_p2p_regexs);
+        tetherableBluetoothRegexs = getResourceStringArray(
+                res, R.array.config_tether_bluetooth_regexs);
+
+        isDunRequired = checkDunRequired(ctx);
+
+        chooseUpstreamAutomatically = getResourceBoolean(
+                res, R.bool.config_tether_upstream_automatic);
+        preferredUpstreamIfaceTypes = getUpstreamIfaceTypes(res, isDunRequired);
+
+        legacyDhcpRanges = getLegacyDhcpRanges(res);
+        defaultIPv4DNS = copy(DEFAULT_IPV4_DNS);
+        enableLegacyDhcpServer = getEnableLegacyDhcpServer(res);
+
+        provisioningApp = getResourceStringArray(res, R.array.config_mobile_hotspot_provision_app);
+        provisioningAppNoUi = getProvisioningAppNoUi(res);
+        provisioningCheckPeriod = getResourceInteger(res,
+                R.integer.config_mobile_hotspot_provision_check_period,
+                0 /* No periodic re-check */);
+
+        configLog.log(toString());
+    }
+
+    /** Check whether input interface belong to usb.*/
+    public boolean isUsb(String iface) {
+        return matchesDownstreamRegexs(iface, tetherableUsbRegexs);
+    }
+
+    /** Check whether input interface belong to wifi.*/
+    public boolean isWifi(String iface) {
+        return matchesDownstreamRegexs(iface, tetherableWifiRegexs);
+    }
+
+    /** Check whether this interface is Wifi P2P interface. */
+    public boolean isWifiP2p(String iface) {
+        return matchesDownstreamRegexs(iface, tetherableWifiP2pRegexs);
+    }
+
+    /** Check whether using legacy mode for wifi P2P. */
+    public boolean isWifiP2pLegacyTetheringMode() {
+        return (tetherableWifiP2pRegexs == null || tetherableWifiP2pRegexs.length == 0);
+    }
+
+    /** Check whether input interface belong to bluetooth.*/
+    public boolean isBluetooth(String iface) {
+        return matchesDownstreamRegexs(iface, tetherableBluetoothRegexs);
+    }
+
+    /** Check if interface is ncm */
+    public boolean isNcm(String iface) {
+        return matchesDownstreamRegexs(iface, tetherableNcmRegexs);
+    }
+
+    /** Check whether no ui entitlement application is available.*/
+    public boolean hasMobileHotspotProvisionApp() {
+        return !TextUtils.isEmpty(provisioningAppNoUi);
+    }
+
+    /** Does the dumping.*/
+    public void dump(PrintWriter pw) {
+        pw.print("activeDataSubId: ");
+        pw.println(activeDataSubId);
+
+        dumpStringArray(pw, "tetherableUsbRegexs", tetherableUsbRegexs);
+        dumpStringArray(pw, "tetherableWifiRegexs", tetherableWifiRegexs);
+        dumpStringArray(pw, "tetherableWifiP2pRegexs", tetherableWifiP2pRegexs);
+        dumpStringArray(pw, "tetherableBluetoothRegexs", tetherableBluetoothRegexs);
+        dumpStringArray(pw, "tetherableNcmRegexs", tetherableNcmRegexs);
+
+        pw.print("isDunRequired: ");
+        pw.println(isDunRequired);
+
+        pw.print("chooseUpstreamAutomatically: ");
+        pw.println(chooseUpstreamAutomatically);
+        pw.print("legacyPreredUpstreamIfaceTypes: ");
+        pw.println(Arrays.toString(toIntArray(preferredUpstreamIfaceTypes)));
+
+        dumpStringArray(pw, "legacyDhcpRanges", legacyDhcpRanges);
+        dumpStringArray(pw, "defaultIPv4DNS", defaultIPv4DNS);
+
+        dumpStringArray(pw, "provisioningApp", provisioningApp);
+        pw.print("provisioningAppNoUi: ");
+        pw.println(provisioningAppNoUi);
+
+        pw.print("enableLegacyDhcpServer: ");
+        pw.println(enableLegacyDhcpServer);
+    }
+
+    /** Returns the string representation of this object.*/
+    public String toString() {
+        final StringJoiner sj = new StringJoiner(" ");
+        sj.add(String.format("activeDataSubId:%d", activeDataSubId));
+        sj.add(String.format("tetherableUsbRegexs:%s", makeString(tetherableUsbRegexs)));
+        sj.add(String.format("tetherableWifiRegexs:%s", makeString(tetherableWifiRegexs)));
+        sj.add(String.format("tetherableWifiP2pRegexs:%s", makeString(tetherableWifiP2pRegexs)));
+        sj.add(String.format("tetherableBluetoothRegexs:%s",
+                makeString(tetherableBluetoothRegexs)));
+        sj.add(String.format("isDunRequired:%s", isDunRequired));
+        sj.add(String.format("chooseUpstreamAutomatically:%s", chooseUpstreamAutomatically));
+        sj.add(String.format("preferredUpstreamIfaceTypes:%s",
+                toIntArray(preferredUpstreamIfaceTypes)));
+        sj.add(String.format("provisioningApp:%s", makeString(provisioningApp)));
+        sj.add(String.format("provisioningAppNoUi:%s", provisioningAppNoUi));
+        sj.add(String.format("enableLegacyDhcpServer:%s", enableLegacyDhcpServer));
+        return String.format("TetheringConfiguration{%s}", sj.toString());
+    }
+
+    private static void dumpStringArray(PrintWriter pw, String label, String[] values) {
+        pw.print(label);
+        pw.print(": ");
+
+        if (values != null) {
+            final StringJoiner sj = new StringJoiner(", ", "[", "]");
+            for (String value : values) sj.add(value);
+            pw.print(sj.toString());
+        } else {
+            pw.print("null");
+        }
+
+        pw.println();
+    }
+
+    private static String makeString(String[] strings) {
+        if (strings == null) return "null";
+        final StringJoiner sj = new StringJoiner(",", "[", "]");
+        for (String s : strings) sj.add(s);
+        return sj.toString();
+    }
+
+    /** Check whether dun is required. */
+    public static boolean checkDunRequired(Context ctx) {
+        final TelephonyManager tm = (TelephonyManager) ctx.getSystemService(TELEPHONY_SERVICE);
+        // TelephonyManager would uses the active data subscription, which should be the one used
+        // by tethering.
+        return (tm != null) ? tm.isTetheringApnRequired() : false;
+    }
+
+    private static Collection<Integer> getUpstreamIfaceTypes(Resources res, boolean dunRequired) {
+        final int[] ifaceTypes = res.getIntArray(R.array.config_tether_upstream_types);
+        final ArrayList<Integer> upstreamIfaceTypes = new ArrayList<>(ifaceTypes.length);
+        for (int i : ifaceTypes) {
+            switch (i) {
+                case TYPE_MOBILE:
+                case TYPE_MOBILE_HIPRI:
+                    if (dunRequired) continue;
+                    break;
+                case TYPE_MOBILE_DUN:
+                    if (!dunRequired) continue;
+                    break;
+            }
+            upstreamIfaceTypes.add(i);
+        }
+
+        // Fix up upstream interface types for DUN or mobile. NOTE: independent
+        // of the value of |dunRequired|, cell data of one form or another is
+        // *always* an upstream, regardless of the upstream interface types
+        // specified by configuration resources.
+        if (dunRequired) {
+            appendIfNotPresent(upstreamIfaceTypes, TYPE_MOBILE_DUN);
+        } else {
+            // Do not modify if a cellular interface type is already present in the
+            // upstream interface types. Add TYPE_MOBILE and TYPE_MOBILE_HIPRI if no
+            // cellular interface types are found in the upstream interface types.
+            // This preserves backwards compatibility and prevents the DUN and default
+            // mobile types incorrectly appearing together, which could happen on
+            // previous releases in the common case where checkDunRequired returned
+            // DUN_UNSPECIFIED.
+            if (!containsOneOf(upstreamIfaceTypes, TYPE_MOBILE, TYPE_MOBILE_HIPRI)) {
+                upstreamIfaceTypes.add(TYPE_MOBILE);
+                upstreamIfaceTypes.add(TYPE_MOBILE_HIPRI);
+            }
+        }
+
+        // Always make sure our good friend Ethernet is present.
+        // TODO: consider unilaterally forcing this at the front.
+        prependIfNotPresent(upstreamIfaceTypes, TYPE_ETHERNET);
+
+        return upstreamIfaceTypes;
+    }
+
+    private static boolean matchesDownstreamRegexs(String iface, String[] regexs) {
+        for (String regex : regexs) {
+            if (iface.matches(regex)) return true;
+        }
+        return false;
+    }
+
+    private static String[] getLegacyDhcpRanges(Resources res) {
+        final String[] fromResource = getResourceStringArray(res, R.array.config_tether_dhcp_range);
+        if ((fromResource.length > 0) && (fromResource.length % 2 == 0)) {
+            return fromResource;
+        }
+        return copy(LEGACY_DHCP_DEFAULT_RANGE);
+    }
+
+    private static String getProvisioningAppNoUi(Resources res) {
+        try {
+            return res.getString(R.string.config_mobile_hotspot_provision_app_no_ui);
+        } catch (Resources.NotFoundException e) {
+            return "";
+        }
+    }
+
+    private static boolean getResourceBoolean(Resources res, int resId) {
+        try {
+            return res.getBoolean(resId);
+        } catch (Resources.NotFoundException e404) {
+            return false;
+        }
+    }
+
+    private static String[] getResourceStringArray(Resources res, int resId) {
+        try {
+            final String[] strArray = res.getStringArray(resId);
+            return (strArray != null) ? strArray : EMPTY_STRING_ARRAY;
+        } catch (Resources.NotFoundException e404) {
+            return EMPTY_STRING_ARRAY;
+        }
+    }
+
+    private static int getResourceInteger(Resources res, int resId, int defaultValue) {
+        try {
+            return res.getInteger(resId);
+        } catch (Resources.NotFoundException e404) {
+            return defaultValue;
+        }
+    }
+
+    private boolean getEnableLegacyDhcpServer(final Resources res) {
+        return getResourceBoolean(res, R.bool.config_tether_enable_legacy_dhcp_server)
+                || getDeviceConfigBoolean(TETHER_ENABLE_LEGACY_DHCP_SERVER);
+    }
+
+    @VisibleForTesting
+    protected boolean getDeviceConfigBoolean(final String name) {
+        return DeviceConfig.getBoolean(NAMESPACE_CONNECTIVITY, name, false /** defaultValue */);
+    }
+
+    private Resources getResources(Context ctx, int subId) {
+        if (subId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
+            return getResourcesForSubIdWrapper(ctx, subId);
+        } else {
+            return ctx.getResources();
+        }
+    }
+
+    @VisibleForTesting
+    protected Resources getResourcesForSubIdWrapper(Context ctx, int subId) {
+        return SubscriptionManager.getResourcesForSubId(ctx, subId);
+    }
+
+    private static String[] copy(String[] strarray) {
+        return Arrays.copyOf(strarray, strarray.length);
+    }
+
+    private static void prependIfNotPresent(ArrayList<Integer> list, int value) {
+        if (list.contains(value)) return;
+        list.add(0, value);
+    }
+
+    private static void appendIfNotPresent(ArrayList<Integer> list, int value) {
+        if (list.contains(value)) return;
+        list.add(value);
+    }
+
+    private static boolean containsOneOf(ArrayList<Integer> list, Integer... values) {
+        for (Integer value : values) {
+            if (list.contains(value)) return true;
+        }
+        return false;
+    }
+
+    private static int[] toIntArray(Collection<Integer> values) {
+        final int[] result = new int[values.size()];
+        int index = 0;
+        for (Integer value : values) {
+            result[index++] = value;
+        }
+        return result;
+    }
+
+    /**
+     * Convert this TetheringConfiguration to a TetheringConfigurationParcel.
+     */
+    public TetheringConfigurationParcel toStableParcelable() {
+        final TetheringConfigurationParcel parcel = new TetheringConfigurationParcel();
+        parcel.subId = activeDataSubId;
+        parcel.tetherableUsbRegexs = tetherableUsbRegexs;
+        parcel.tetherableWifiRegexs = tetherableWifiRegexs;
+        parcel.tetherableBluetoothRegexs = tetherableBluetoothRegexs;
+        parcel.isDunRequired = isDunRequired;
+        parcel.chooseUpstreamAutomatically = chooseUpstreamAutomatically;
+
+        parcel.preferredUpstreamIfaceTypes = toIntArray(preferredUpstreamIfaceTypes);
+
+        parcel.legacyDhcpRanges = legacyDhcpRanges;
+        parcel.defaultIPv4DNS = defaultIPv4DNS;
+        parcel.enableLegacyDhcpServer = enableLegacyDhcpServer;
+        parcel.provisioningApp = provisioningApp;
+        parcel.provisioningAppNoUi = provisioningAppNoUi;
+        parcel.provisioningCheckPeriod = provisioningCheckPeriod;
+        return parcel;
+    }
+}
diff --git a/packages/Tethering/src/com/android/networkstack/tethering/TetheringDependencies.java b/packages/Tethering/src/com/android/networkstack/tethering/TetheringDependencies.java
new file mode 100644
index 0000000..9b54b5f
--- /dev/null
+++ b/packages/Tethering/src/com/android/networkstack/tethering/TetheringDependencies.java
@@ -0,0 +1,128 @@
+/*
+ * Copyright (C) 2017 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.networkstack.tethering;
+
+import android.bluetooth.BluetoothAdapter;
+import android.content.Context;
+import android.net.INetd;
+import android.net.NetworkRequest;
+import android.net.ip.IpServer;
+import android.net.util.SharedLog;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.Looper;
+
+import androidx.annotation.NonNull;
+
+import com.android.internal.util.StateMachine;
+
+import java.util.ArrayList;
+
+
+/**
+ * Capture tethering dependencies, for injection.
+ *
+ * @hide
+ */
+public abstract class TetheringDependencies {
+    /**
+     * Get a reference to the offload hardware interface to be used by tethering.
+     */
+    public OffloadHardwareInterface getOffloadHardwareInterface(Handler h, SharedLog log) {
+        return new OffloadHardwareInterface(h, log);
+    }
+
+    /**
+     * Get a reference to the UpstreamNetworkMonitor to be used by tethering.
+     */
+    public UpstreamNetworkMonitor getUpstreamNetworkMonitor(Context ctx, StateMachine target,
+            SharedLog log, int what) {
+        return new UpstreamNetworkMonitor(ctx, target, log, what);
+    }
+
+    /**
+     * Get a reference to the IPv6TetheringCoordinator to be used by tethering.
+     */
+    public IPv6TetheringCoordinator getIPv6TetheringCoordinator(
+            ArrayList<IpServer> notifyList, SharedLog log) {
+        return new IPv6TetheringCoordinator(notifyList, log);
+    }
+
+    /**
+     * Get dependencies to be used by IpServer.
+     */
+    public abstract IpServer.Dependencies getIpServerDependencies();
+
+    /**
+     * Indicates whether tethering is supported on the device.
+     */
+    public boolean isTetheringSupported() {
+        return true;
+    }
+
+    /**
+     * Get the NetworkRequest that should be fulfilled by the default network.
+     */
+    public abstract NetworkRequest getDefaultNetworkRequest();
+
+    /**
+     * Get a reference to the EntitlementManager to be used by tethering.
+     */
+    public EntitlementManager getEntitlementManager(Context ctx, StateMachine target,
+            SharedLog log, int what) {
+        return new EntitlementManager(ctx, target, log, what);
+    }
+
+    /**
+     * Generate a new TetheringConfiguration according to input sub Id.
+     */
+    public TetheringConfiguration generateTetheringConfiguration(Context ctx, SharedLog log,
+            int subId) {
+        return new TetheringConfiguration(ctx, log, subId);
+    }
+
+    /**
+     * Get a reference to INetd to be used by tethering.
+     */
+    public INetd getINetd(Context context) {
+        return INetd.Stub.asInterface(
+                (IBinder) context.getSystemService(Context.NETD_SERVICE));
+    }
+
+    /**
+     * Get a reference to the TetheringNotificationUpdater to be used by tethering.
+     */
+    public TetheringNotificationUpdater getNotificationUpdater(@NonNull final Context ctx,
+            @NonNull final Looper looper) {
+        return new TetheringNotificationUpdater(ctx, looper);
+    }
+
+    /**
+     * Get tethering thread looper.
+     */
+    public abstract Looper getTetheringLooper();
+
+    /**
+     *  Get Context of TetheringSerice.
+     */
+    public abstract Context getContext();
+
+    /**
+     * Get a reference to BluetoothAdapter to be used by tethering.
+     */
+    public abstract BluetoothAdapter getBluetoothAdapter();
+}
diff --git a/packages/Tethering/src/com/android/networkstack/tethering/TetheringInterfaceUtils.java b/packages/Tethering/src/com/android/networkstack/tethering/TetheringInterfaceUtils.java
new file mode 100644
index 0000000..ff38f71
--- /dev/null
+++ b/packages/Tethering/src/com/android/networkstack/tethering/TetheringInterfaceUtils.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright (C) 2018 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.networkstack.tethering;
+
+import android.annotation.Nullable;
+import android.net.LinkProperties;
+import android.net.NetworkCapabilities;
+import android.net.RouteInfo;
+import android.net.util.InterfaceSet;
+
+import com.android.net.module.util.NetUtils;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+
+/**
+ * @hide
+ */
+public final class TetheringInterfaceUtils {
+    private static final InetAddress IN6ADDR_ANY = getByAddress(
+            new byte[] {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0});
+    private static final InetAddress INADDR_ANY = getByAddress(new byte[] {0, 0, 0, 0});
+
+    /**
+     * Get upstream interfaces for tethering based on default routes for IPv4/IPv6.
+     * @return null if there is no usable interface, or a set of at least one interface otherwise.
+     */
+    public static @Nullable InterfaceSet getTetheringInterfaces(UpstreamNetworkState ns) {
+        if (ns == null) {
+            return null;
+        }
+
+        final LinkProperties lp = ns.linkProperties;
+        final String if4 = getInterfaceForDestination(lp, INADDR_ANY);
+        final String if6 = getIPv6Interface(ns);
+
+        return (if4 == null && if6 == null) ? null : new InterfaceSet(if4, if6);
+    }
+
+    /**
+     * Get the upstream interface for IPv6 tethering.
+     * @return null if there is no usable interface, or the interface name otherwise.
+     */
+    public static @Nullable String getIPv6Interface(UpstreamNetworkState ns) {
+        // Broadly speaking:
+        //
+        //     [1] does the upstream have an IPv6 default route?
+        //
+        // and
+        //
+        //     [2] does the upstream have one or more global IPv6 /64s
+        //         dedicated to this device?
+        //
+        // In lieu of Prefix Delegation and other evaluation of whether a
+        // prefix may or may not be dedicated to this device, for now just
+        // check whether the upstream is TRANSPORT_CELLULAR. This works
+        // because "[t]he 3GPP network allocates each default bearer a unique
+        // /64 prefix", per RFC 6459, Section 5.2.
+        final boolean canTether =
+                (ns != null) && (ns.network != null)
+                && (ns.linkProperties != null) && (ns.networkCapabilities != null)
+                // At least one upstream DNS server:
+                && ns.linkProperties.hasIpv6DnsServer()
+                // Minimal amount of IPv6 provisioning:
+                && ns.linkProperties.hasGlobalIpv6Address()
+                // Temporary approximation of "dedicated prefix":
+                && ns.networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR);
+
+        return canTether
+                ? getInterfaceForDestination(ns.linkProperties, IN6ADDR_ANY)
+                : null;
+    }
+
+    private static String getInterfaceForDestination(LinkProperties lp, InetAddress dst) {
+        final RouteInfo ri = (lp != null)
+                ? NetUtils.selectBestRoute(lp.getAllRoutes(), dst)
+                : null;
+        return (ri != null) ? ri.getInterface() : null;
+    }
+
+    private static InetAddress getByAddress(final byte[] addr) {
+        try {
+            return InetAddress.getByAddress(null, addr);
+        } catch (UnknownHostException e) {
+            throw new AssertionError("illegal address length" + addr.length);
+        }
+    }
+}
diff --git a/packages/Tethering/src/com/android/networkstack/tethering/TetheringNotificationUpdater.java b/packages/Tethering/src/com/android/networkstack/tethering/TetheringNotificationUpdater.java
new file mode 100644
index 0000000..d03deda
--- /dev/null
+++ b/packages/Tethering/src/com/android/networkstack/tethering/TetheringNotificationUpdater.java
@@ -0,0 +1,348 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.networkstack.tethering;
+
+import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING;
+import static android.text.TextUtils.isEmpty;
+
+import android.app.Notification;
+import android.app.Notification.Action;
+import android.app.NotificationChannel;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
+import android.content.Context;
+import android.content.Intent;
+import android.content.res.Configuration;
+import android.content.res.Resources;
+import android.net.NetworkCapabilities;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+import android.os.UserHandle;
+import android.provider.Settings;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+import android.util.SparseArray;
+
+import androidx.annotation.DrawableRes;
+import androidx.annotation.IntDef;
+import androidx.annotation.IntRange;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import com.android.internal.annotations.VisibleForTesting;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * A class to display tethering-related notifications.
+ *
+ * <p>This class is not thread safe, it is intended to be used only from the tethering handler
+ * thread. However the constructor is an exception, as it is called on another thread ;
+ * therefore for thread safety all members of this class MUST either be final or initialized
+ * to their default value (0, false or null).
+ *
+ * @hide
+ */
+public class TetheringNotificationUpdater {
+    private static final String TAG = TetheringNotificationUpdater.class.getSimpleName();
+    private static final String CHANNEL_ID = "TETHERING_STATUS";
+    private static final String WIFI_DOWNSTREAM = "WIFI";
+    private static final String USB_DOWNSTREAM = "USB";
+    private static final String BLUETOOTH_DOWNSTREAM = "BT";
+    @VisibleForTesting
+    static final String ACTION_DISABLE_TETHERING =
+            "com.android.server.connectivity.tethering.DISABLE_TETHERING";
+    private static final boolean NOTIFY_DONE = true;
+    private static final boolean NO_NOTIFY = false;
+    @VisibleForTesting
+    static final int EVENT_SHOW_NO_UPSTREAM = 1;
+    // Id to update and cancel restricted notification. Must be unique within the tethering app.
+    @VisibleForTesting
+    static final int RESTRICTED_NOTIFICATION_ID = 1001;
+    // Id to update and cancel no upstream notification. Must be unique within the tethering app.
+    @VisibleForTesting
+    static final int NO_UPSTREAM_NOTIFICATION_ID = 1002;
+    // Id to update and cancel roaming notification. Must be unique within the tethering app.
+    @VisibleForTesting
+    static final int ROAMING_NOTIFICATION_ID = 1003;
+    @VisibleForTesting
+    static final int NO_ICON_ID = 0;
+    @VisibleForTesting
+    static final int DOWNSTREAM_NONE = 0;
+    // Refer to TelephonyManager#getSimCarrierId for more details about carrier id.
+    @VisibleForTesting
+    static final int VERIZON_CARRIER_ID = 1839;
+    private final Context mContext;
+    private final NotificationManager mNotificationManager;
+    private final NotificationChannel mChannel;
+    private final Handler mHandler;
+
+    // WARNING : the constructor is called on a different thread. Thread safety therefore
+    // relies on these values being initialized to 0, false or null, and not any other value. If you
+    // need to change this, you will need to change the thread where the constructor is invoked, or
+    // to introduce synchronization.
+    // Downstream type is one of ConnectivityManager.TETHERING_* constants, 0 1 or 2.
+    // This value has to be made 1 2 and 4, and OR'd with the others.
+    private int mDownstreamTypesMask = DOWNSTREAM_NONE;
+    private boolean mNoUpstream = false;
+    private boolean mRoaming = false;
+
+    // WARNING : this value is not able to being initialized to 0 and must have volatile because
+    // telephony service is not guaranteed that is up before tethering service starts. If telephony
+    // is up later than tethering, TetheringNotificationUpdater will use incorrect and valid
+    // subscription id(0) to query resources. Therefore, initialized subscription id must be
+    // INVALID_SUBSCRIPTION_ID.
+    private volatile int mActiveDataSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
+
+    @Retention(RetentionPolicy.SOURCE)
+    @IntDef(value = {
+            RESTRICTED_NOTIFICATION_ID,
+            NO_UPSTREAM_NOTIFICATION_ID,
+            ROAMING_NOTIFICATION_ID
+    })
+    @interface NotificationId {}
+
+    private static final class MccMncOverrideInfo {
+        public final String visitedMccMnc;
+        public final int homeMcc;
+        public final int homeMnc;
+        MccMncOverrideInfo(String visitedMccMnc, int mcc, int mnc) {
+            this.visitedMccMnc = visitedMccMnc;
+            this.homeMcc = mcc;
+            this.homeMnc = mnc;
+        }
+    }
+
+    private static final SparseArray<MccMncOverrideInfo> sCarrierIdToMccMnc = new SparseArray<>();
+
+    static {
+        sCarrierIdToMccMnc.put(VERIZON_CARRIER_ID, new MccMncOverrideInfo("20404", 311, 480));
+    }
+
+    public TetheringNotificationUpdater(@NonNull final Context context,
+            @NonNull final Looper looper) {
+        mContext = context;
+        mNotificationManager = (NotificationManager) context.createContextAsUser(UserHandle.ALL, 0)
+                .getSystemService(Context.NOTIFICATION_SERVICE);
+        mChannel = new NotificationChannel(
+                CHANNEL_ID,
+                context.getResources().getString(R.string.notification_channel_tethering_status),
+                NotificationManager.IMPORTANCE_LOW);
+        mNotificationManager.createNotificationChannel(mChannel);
+        mHandler = new NotificationHandler(looper);
+    }
+
+    private class NotificationHandler extends Handler {
+        NotificationHandler(Looper looper) {
+            super(looper);
+        }
+
+        @Override
+        public void handleMessage(Message msg) {
+            switch(msg.what) {
+                case EVENT_SHOW_NO_UPSTREAM:
+                    notifyTetheringNoUpstream();
+                    break;
+            }
+        }
+    }
+
+    /** Called when downstream has changed */
+    public void onDownstreamChanged(@IntRange(from = 0, to = 7) final int downstreamTypesMask) {
+        updateActiveNotifications(
+                mActiveDataSubId, downstreamTypesMask, mNoUpstream, mRoaming);
+    }
+
+    /** Called when active data subscription id changed */
+    public void onActiveDataSubscriptionIdChanged(final int subId) {
+        updateActiveNotifications(subId, mDownstreamTypesMask, mNoUpstream, mRoaming);
+    }
+
+    /** Called when upstream network capabilities changed */
+    public void onUpstreamCapabilitiesChanged(@Nullable final NetworkCapabilities capabilities) {
+        final boolean isNoUpstream = (capabilities == null);
+        final boolean isRoaming = capabilities != null
+                && !capabilities.hasCapability(NET_CAPABILITY_NOT_ROAMING);
+        updateActiveNotifications(
+                mActiveDataSubId, mDownstreamTypesMask, isNoUpstream, isRoaming);
+    }
+
+    @NonNull
+    @VisibleForTesting
+    final Handler getHandler() {
+        return mHandler;
+    }
+
+    @NonNull
+    @VisibleForTesting
+    Resources getResourcesForSubId(@NonNull final Context context, final int subId) {
+        final Resources res = SubscriptionManager.getResourcesForSubId(context, subId);
+        final TelephonyManager tm =
+                ((TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE))
+                        .createForSubscriptionId(mActiveDataSubId);
+        final int carrierId = tm.getSimCarrierId();
+        final String mccmnc = tm.getSimOperator();
+        final MccMncOverrideInfo overrideInfo = sCarrierIdToMccMnc.get(carrierId);
+        if (overrideInfo != null && overrideInfo.visitedMccMnc.equals(mccmnc)) {
+            // Re-configure MCC/MNC value to specific carrier to get right resources.
+            final Configuration config = res.getConfiguration();
+            config.mcc = overrideInfo.homeMcc;
+            config.mnc = overrideInfo.homeMnc;
+            return context.createConfigurationContext(config).getResources();
+        }
+        return res;
+    }
+
+    private void updateActiveNotifications(final int subId, final int downstreamTypes,
+            final boolean noUpstream, final boolean isRoaming) {
+        final boolean tetheringActiveChanged =
+                (downstreamTypes == DOWNSTREAM_NONE) != (mDownstreamTypesMask == DOWNSTREAM_NONE);
+        final boolean subIdChanged = subId != mActiveDataSubId;
+        final boolean upstreamChanged = noUpstream != mNoUpstream;
+        final boolean roamingChanged = isRoaming != mRoaming;
+        final boolean updateAll = tetheringActiveChanged || subIdChanged;
+        mActiveDataSubId = subId;
+        mDownstreamTypesMask = downstreamTypes;
+        mNoUpstream = noUpstream;
+        mRoaming = isRoaming;
+
+        if (updateAll || upstreamChanged) updateNoUpstreamNotification();
+        if (updateAll || roamingChanged) updateRoamingNotification();
+    }
+
+    private void updateNoUpstreamNotification() {
+        final boolean tetheringInactive = mDownstreamTypesMask == DOWNSTREAM_NONE;
+
+        if (tetheringInactive || !mNoUpstream || setupNoUpstreamNotification() == NO_NOTIFY) {
+            clearNotification(NO_UPSTREAM_NOTIFICATION_ID);
+            mHandler.removeMessages(EVENT_SHOW_NO_UPSTREAM);
+        }
+    }
+
+    private void updateRoamingNotification() {
+        final boolean tetheringInactive = mDownstreamTypesMask == DOWNSTREAM_NONE;
+
+        if (tetheringInactive || !mRoaming || setupRoamingNotification() == NO_NOTIFY) {
+            clearNotification(ROAMING_NOTIFICATION_ID);
+        }
+    }
+
+    @VisibleForTesting
+    void tetheringRestrictionLifted() {
+        clearNotification(RESTRICTED_NOTIFICATION_ID);
+    }
+
+    private void clearNotification(@NotificationId final int id) {
+        mNotificationManager.cancel(null /* tag */, id);
+    }
+
+    @VisibleForTesting
+    void notifyTetheringDisabledByRestriction() {
+        final Resources res = getResourcesForSubId(mContext, mActiveDataSubId);
+        final String title = res.getString(R.string.disable_tether_notification_title);
+        final String message = res.getString(R.string.disable_tether_notification_message);
+        if (isEmpty(title) || isEmpty(message)) return;
+
+        final PendingIntent pi = PendingIntent.getActivity(
+                mContext.createContextAsUser(UserHandle.CURRENT, 0 /* flags */),
+                0 /* requestCode */,
+                new Intent(Settings.ACTION_TETHER_SETTINGS),
+                Intent.FLAG_ACTIVITY_NEW_TASK,
+                null /* options */);
+
+        showNotification(R.drawable.stat_sys_tether_general, title, message,
+                RESTRICTED_NOTIFICATION_ID, false /* ongoing */, pi, new Action[0]);
+    }
+
+    private void notifyTetheringNoUpstream() {
+        final Resources res = getResourcesForSubId(mContext, mActiveDataSubId);
+        final String title = res.getString(R.string.no_upstream_notification_title);
+        final String message = res.getString(R.string.no_upstream_notification_message);
+        final String disableButton =
+                res.getString(R.string.no_upstream_notification_disable_button);
+        if (isEmpty(title) || isEmpty(message) || isEmpty(disableButton)) return;
+
+        final Intent intent = new Intent(ACTION_DISABLE_TETHERING);
+        intent.setPackage(mContext.getPackageName());
+        final PendingIntent pi = PendingIntent.getBroadcast(
+                mContext.createContextAsUser(UserHandle.CURRENT, 0 /* flags */),
+                0 /* requestCode */,
+                intent,
+                0 /* flags */);
+        final Action action = new Action.Builder(NO_ICON_ID, disableButton, pi).build();
+
+        showNotification(R.drawable.stat_sys_tether_general, title, message,
+                NO_UPSTREAM_NOTIFICATION_ID, true /* ongoing */, null /* pendingIntent */, action);
+    }
+
+    private boolean setupRoamingNotification() {
+        final Resources res = getResourcesForSubId(mContext, mActiveDataSubId);
+        final boolean upstreamRoamingNotification =
+                res.getBoolean(R.bool.config_upstream_roaming_notification);
+
+        if (!upstreamRoamingNotification) return NO_NOTIFY;
+
+        final String title = res.getString(R.string.upstream_roaming_notification_title);
+        final String message = res.getString(R.string.upstream_roaming_notification_message);
+        if (isEmpty(title) || isEmpty(message)) return NO_NOTIFY;
+
+        final PendingIntent pi = PendingIntent.getActivity(
+                mContext.createContextAsUser(UserHandle.CURRENT, 0 /* flags */),
+                0 /* requestCode */,
+                new Intent(Settings.ACTION_TETHER_SETTINGS),
+                Intent.FLAG_ACTIVITY_NEW_TASK,
+                null /* options */);
+
+        showNotification(R.drawable.stat_sys_tether_general, title, message,
+                ROAMING_NOTIFICATION_ID, true /* ongoing */, pi, new Action[0]);
+        return NOTIFY_DONE;
+    }
+
+    private boolean setupNoUpstreamNotification() {
+        final Resources res = getResourcesForSubId(mContext, mActiveDataSubId);
+        final int delayToShowUpstreamNotification =
+                res.getInteger(R.integer.delay_to_show_no_upstream_after_no_backhaul);
+
+        if (delayToShowUpstreamNotification < 0) return NO_NOTIFY;
+
+        mHandler.sendMessageDelayed(mHandler.obtainMessage(EVENT_SHOW_NO_UPSTREAM),
+                delayToShowUpstreamNotification);
+        return NOTIFY_DONE;
+    }
+
+    private void showNotification(@DrawableRes final int iconId, @NonNull final String title,
+            @NonNull final String message, @NotificationId final int id, final boolean ongoing,
+            @Nullable PendingIntent pi, @NonNull final Action... actions) {
+        final Notification notification =
+                new Notification.Builder(mContext, mChannel.getId())
+                        .setSmallIcon(iconId)
+                        .setContentTitle(title)
+                        .setContentText(message)
+                        .setOngoing(ongoing)
+                        .setColor(mContext.getColor(
+                                android.R.color.system_notification_accent_color))
+                        .setVisibility(Notification.VISIBILITY_PUBLIC)
+                        .setCategory(Notification.CATEGORY_STATUS)
+                        .setContentIntent(pi)
+                        .setActions(actions)
+                        .build();
+
+        mNotificationManager.notify(null /* tag */, id, notification);
+    }
+}
diff --git a/packages/Tethering/src/com/android/networkstack/tethering/TetheringService.java b/packages/Tethering/src/com/android/networkstack/tethering/TetheringService.java
new file mode 100644
index 0000000..3ed2115
--- /dev/null
+++ b/packages/Tethering/src/com/android/networkstack/tethering/TetheringService.java
@@ -0,0 +1,391 @@
+/*
+ * Copyright (C) 2019 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.networkstack.tethering;
+
+import static android.content.pm.PackageManager.PERMISSION_GRANTED;
+import static android.net.TetheringManager.TETHER_ERROR_NO_ACCESS_TETHERING_PERMISSION;
+import static android.net.TetheringManager.TETHER_ERROR_NO_CHANGE_TETHERING_PERMISSION;
+import static android.net.TetheringManager.TETHER_ERROR_NO_ERROR;
+import static android.net.TetheringManager.TETHER_ERROR_UNSUPPORTED;
+import static android.net.dhcp.IDhcpServer.STATUS_UNKNOWN_ERROR;
+
+import android.app.Service;
+import android.bluetooth.BluetoothAdapter;
+import android.content.Context;
+import android.content.Intent;
+import android.net.IIntResultListener;
+import android.net.INetworkStackConnector;
+import android.net.ITetheringConnector;
+import android.net.ITetheringEventCallback;
+import android.net.NetworkCapabilities;
+import android.net.NetworkRequest;
+import android.net.NetworkStack;
+import android.net.TetheringRequestParcel;
+import android.net.dhcp.DhcpServerCallbacks;
+import android.net.dhcp.DhcpServingParamsParcel;
+import android.net.ip.IpServer;
+import android.net.util.SharedLog;
+import android.os.Binder;
+import android.os.HandlerThread;
+import android.os.IBinder;
+import android.os.Looper;
+import android.os.RemoteException;
+import android.os.ResultReceiver;
+import android.os.SystemProperties;
+import android.os.UserManager;
+import android.provider.Settings;
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import com.android.internal.annotations.VisibleForTesting;
+
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
+
+/**
+ * Android service used to manage tethering.
+ *
+ * <p>The service returns a binder for the system server to communicate with the tethering.
+ */
+public class TetheringService extends Service {
+    private static final String TAG = TetheringService.class.getSimpleName();
+
+    private final SharedLog mLog = new SharedLog(TAG);
+    private TetheringConnector mConnector;
+    private Context mContext;
+    private TetheringDependencies mDeps;
+    private Tethering mTethering;
+    private UserManager mUserManager;
+
+    @Override
+    public void onCreate() {
+        mLog.mark("onCreate");
+        mDeps = getTetheringDependencies();
+        mContext = mDeps.getContext();
+        mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
+        mTethering = makeTethering(mDeps);
+        mTethering.startStateMachineUpdaters();
+    }
+
+    /**
+     * Make a reference to Tethering object.
+     */
+    @VisibleForTesting
+    public Tethering makeTethering(TetheringDependencies deps) {
+        System.loadLibrary("tetherutilsjni");
+        return new Tethering(deps);
+    }
+
+    /**
+     * Create a binder connector for the system server to communicate with the tethering.
+     */
+    private synchronized IBinder makeConnector() {
+        if (mConnector == null) {
+            mConnector = new TetheringConnector(mTethering, TetheringService.this);
+        }
+        return mConnector;
+    }
+
+    @NonNull
+    @Override
+    public IBinder onBind(Intent intent) {
+        mLog.mark("onBind");
+        return makeConnector();
+    }
+
+    private static class TetheringConnector extends ITetheringConnector.Stub {
+        private final TetheringService mService;
+        private final Tethering mTethering;
+
+        TetheringConnector(Tethering tether, TetheringService service) {
+            mTethering = tether;
+            mService = service;
+        }
+
+        @Override
+        public void tether(String iface, String callerPkg, IIntResultListener listener) {
+            if (checkAndNotifyCommonError(callerPkg, listener)) return;
+
+            try {
+                listener.onResult(mTethering.tether(iface));
+            } catch (RemoteException e) { }
+        }
+
+        @Override
+        public void untether(String iface, String callerPkg, IIntResultListener listener) {
+            if (checkAndNotifyCommonError(callerPkg, listener)) return;
+
+            try {
+                listener.onResult(mTethering.untether(iface));
+            } catch (RemoteException e) { }
+        }
+
+        @Override
+        public void setUsbTethering(boolean enable, String callerPkg, IIntResultListener listener) {
+            if (checkAndNotifyCommonError(callerPkg, listener)) return;
+
+            try {
+                listener.onResult(mTethering.setUsbTethering(enable));
+            } catch (RemoteException e) { }
+        }
+
+        @Override
+        public void startTethering(TetheringRequestParcel request, String callerPkg,
+                IIntResultListener listener) {
+            if (checkAndNotifyCommonError(callerPkg, listener)) return;
+
+            mTethering.startTethering(request, listener);
+        }
+
+        @Override
+        public void stopTethering(int type, String callerPkg, IIntResultListener listener) {
+            if (checkAndNotifyCommonError(callerPkg, listener)) return;
+
+            try {
+                mTethering.stopTethering(type);
+                listener.onResult(TETHER_ERROR_NO_ERROR);
+            } catch (RemoteException e) { }
+        }
+
+        @Override
+        public void requestLatestTetheringEntitlementResult(int type, ResultReceiver receiver,
+                boolean showEntitlementUi, String callerPkg) {
+            if (checkAndNotifyCommonError(callerPkg, receiver)) return;
+
+            mTethering.requestLatestTetheringEntitlementResult(type, receiver, showEntitlementUi);
+        }
+
+        @Override
+        public void registerTetheringEventCallback(ITetheringEventCallback callback,
+                String callerPkg) {
+            try {
+                if (!mService.hasTetherAccessPermission()) {
+                    callback.onCallbackStopped(TETHER_ERROR_NO_ACCESS_TETHERING_PERMISSION);
+                    return;
+                }
+                mTethering.registerTetheringEventCallback(callback);
+            } catch (RemoteException e) { }
+        }
+
+        @Override
+        public void unregisterTetheringEventCallback(ITetheringEventCallback callback,
+                String callerPkg) {
+            try {
+                if (!mService.hasTetherAccessPermission()) {
+                    callback.onCallbackStopped(TETHER_ERROR_NO_ACCESS_TETHERING_PERMISSION);
+                    return;
+                }
+                mTethering.unregisterTetheringEventCallback(callback);
+            } catch (RemoteException e) { }
+        }
+
+        @Override
+        public void stopAllTethering(String callerPkg, IIntResultListener listener) {
+            if (checkAndNotifyCommonError(callerPkg, listener)) return;
+
+            try {
+                mTethering.untetherAll();
+                listener.onResult(TETHER_ERROR_NO_ERROR);
+            } catch (RemoteException e) { }
+        }
+
+        @Override
+        public void isTetheringSupported(String callerPkg, IIntResultListener listener) {
+            if (checkAndNotifyCommonError(callerPkg, listener)) return;
+
+            try {
+                listener.onResult(TETHER_ERROR_NO_ERROR);
+            } catch (RemoteException e) { }
+        }
+
+        @Override
+        protected void dump(@NonNull FileDescriptor fd, @NonNull PrintWriter writer,
+                    @Nullable String[] args) {
+            mTethering.dump(fd, writer, args);
+        }
+
+        private boolean checkAndNotifyCommonError(String callerPkg, IIntResultListener listener) {
+            try {
+                if (!mService.hasTetherChangePermission(callerPkg)) {
+                    listener.onResult(TETHER_ERROR_NO_CHANGE_TETHERING_PERMISSION);
+                    return true;
+                }
+                if (!mService.isTetheringSupported()) {
+                    listener.onResult(TETHER_ERROR_UNSUPPORTED);
+                    return true;
+                }
+            } catch (RemoteException e) {
+                return true;
+            }
+
+            return false;
+        }
+
+        private boolean checkAndNotifyCommonError(String callerPkg, ResultReceiver receiver) {
+            if (!mService.hasTetherChangePermission(callerPkg)) {
+                receiver.send(TETHER_ERROR_NO_CHANGE_TETHERING_PERMISSION, null);
+                return true;
+            }
+            if (!mService.isTetheringSupported()) {
+                receiver.send(TETHER_ERROR_UNSUPPORTED, null);
+                return true;
+            }
+
+            return false;
+        }
+
+    }
+
+    // if ro.tether.denied = true we default to no tethering
+    // gservices could set the secure setting to 1 though to enable it on a build where it
+    // had previously been turned off.
+    private boolean isTetheringSupported() {
+        final int defaultVal =
+                SystemProperties.get("ro.tether.denied").equals("true") ? 0 : 1;
+        final boolean tetherSupported = Settings.Global.getInt(mContext.getContentResolver(),
+                Settings.Global.TETHER_SUPPORTED, defaultVal) != 0;
+        final boolean tetherEnabledInSettings = tetherSupported
+                && !mUserManager.hasUserRestriction(UserManager.DISALLOW_CONFIG_TETHERING);
+
+        return tetherEnabledInSettings && mTethering.hasTetherableConfiguration();
+    }
+
+    private boolean hasTetherChangePermission(String callerPkg) {
+        if (checkCallingOrSelfPermission(
+                android.Manifest.permission.TETHER_PRIVILEGED) == PERMISSION_GRANTED) {
+            return true;
+        }
+
+        if (mTethering.isTetherProvisioningRequired()) return false;
+
+
+        int uid = Binder.getCallingUid();
+        // If callerPkg's uid is not same as Binder.getCallingUid(),
+        // checkAndNoteWriteSettingsOperation will return false and the operation will be denied.
+        if (Settings.checkAndNoteWriteSettingsOperation(mContext, uid, callerPkg,
+                false /* throwException */)) {
+            return true;
+        }
+
+        return false;
+    }
+
+    private boolean hasTetherAccessPermission() {
+        if (checkCallingOrSelfPermission(
+                android.Manifest.permission.TETHER_PRIVILEGED) == PERMISSION_GRANTED) {
+            return true;
+        }
+
+        if (checkCallingOrSelfPermission(
+                android.Manifest.permission.ACCESS_NETWORK_STATE) == PERMISSION_GRANTED) {
+            return true;
+        }
+
+        return false;
+    }
+
+
+    /**
+     * An injection method for testing.
+     */
+    @VisibleForTesting
+    public TetheringDependencies getTetheringDependencies() {
+        if (mDeps == null) {
+            mDeps = new TetheringDependencies() {
+                @Override
+                public NetworkRequest getDefaultNetworkRequest() {
+                    // TODO: b/147280869, add a proper system API to replace this.
+                    final NetworkRequest trackDefaultRequest = new NetworkRequest.Builder()
+                            .clearCapabilities()
+                            .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)
+                            .addCapability(NetworkCapabilities.NET_CAPABILITY_TRUSTED)
+                            .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN)
+                            .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
+                            .build();
+                    return trackDefaultRequest;
+                }
+
+                @Override
+                public Looper getTetheringLooper() {
+                    final HandlerThread tetherThread = new HandlerThread("android.tethering");
+                    tetherThread.start();
+                    return tetherThread.getLooper();
+                }
+
+                @Override
+                public boolean isTetheringSupported() {
+                    return TetheringService.this.isTetheringSupported();
+                }
+
+                @Override
+                public Context getContext() {
+                    return TetheringService.this;
+                }
+
+                @Override
+                public IpServer.Dependencies getIpServerDependencies() {
+                    return new IpServer.Dependencies() {
+                        @Override
+                        public void makeDhcpServer(String ifName, DhcpServingParamsParcel params,
+                                DhcpServerCallbacks cb) {
+                            try {
+                                final INetworkStackConnector service = getNetworkStackConnector();
+                                if (service == null) return;
+
+                                service.makeDhcpServer(ifName, params, cb);
+                            } catch (RemoteException e) {
+                                Log.e(TAG, "Fail to make dhcp server");
+                                try {
+                                    cb.onDhcpServerCreated(STATUS_UNKNOWN_ERROR, null);
+                                } catch (RemoteException re) { }
+                            }
+                        }
+                    };
+                }
+
+                // TODO: replace this by NetworkStackClient#getRemoteConnector after refactoring
+                // networkStackClient.
+                static final int NETWORKSTACK_TIMEOUT_MS = 60_000;
+                private INetworkStackConnector getNetworkStackConnector() {
+                    IBinder connector;
+                    try {
+                        final long before = System.currentTimeMillis();
+                        while ((connector = NetworkStack.getService()) == null) {
+                            if (System.currentTimeMillis() - before > NETWORKSTACK_TIMEOUT_MS) {
+                                Log.wtf(TAG, "Timeout, fail to get INetworkStackConnector");
+                                return null;
+                            }
+                            Thread.sleep(200);
+                        }
+                    } catch (InterruptedException e) {
+                        Log.wtf(TAG, "Interrupted, fail to get INetworkStackConnector");
+                        return null;
+                    }
+                    return INetworkStackConnector.Stub.asInterface(connector);
+                }
+
+                @Override
+                public BluetoothAdapter getBluetoothAdapter() {
+                    return BluetoothAdapter.getDefaultAdapter();
+                }
+            };
+        }
+        return mDeps;
+    }
+}
diff --git a/packages/Tethering/src/com/android/networkstack/tethering/UpstreamNetworkMonitor.java b/packages/Tethering/src/com/android/networkstack/tethering/UpstreamNetworkMonitor.java
new file mode 100644
index 0000000..25ddce4
--- /dev/null
+++ b/packages/Tethering/src/com/android/networkstack/tethering/UpstreamNetworkMonitor.java
@@ -0,0 +1,606 @@
+/*
+ * Copyright (C) 2017 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.networkstack.tethering;
+
+import static android.net.ConnectivityManager.TYPE_BLUETOOTH;
+import static android.net.ConnectivityManager.TYPE_ETHERNET;
+import static android.net.ConnectivityManager.TYPE_MOBILE;
+import static android.net.ConnectivityManager.TYPE_MOBILE_DUN;
+import static android.net.ConnectivityManager.TYPE_MOBILE_HIPRI;
+import static android.net.ConnectivityManager.TYPE_WIFI;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_DUN;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_VPN;
+import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
+
+import android.content.Context;
+import android.net.ConnectivityManager;
+import android.net.ConnectivityManager.NetworkCallback;
+import android.net.IpPrefix;
+import android.net.LinkProperties;
+import android.net.Network;
+import android.net.NetworkCapabilities;
+import android.net.NetworkRequest;
+import android.net.util.PrefixUtils;
+import android.net.util.SharedLog;
+import android.os.Handler;
+import android.util.Log;
+import android.util.SparseIntArray;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.util.Preconditions;
+import com.android.internal.util.StateMachine;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Set;
+
+
+/**
+ * A class to centralize all the network and link properties information
+ * pertaining to the current and any potential upstream network.
+ *
+ * The owner of UNM gets it to register network callbacks by calling the
+ * following methods :
+ * Calling #startTrackDefaultNetwork() to track the system default network.
+ * Calling #startObserveAllNetworks() to observe all networks. Listening all
+ * networks is necessary while the expression of preferred upstreams remains
+ * a list of legacy connectivity types.  In future, this can be revisited.
+ * Calling #registerMobileNetworkRequest() to bring up mobile DUN/HIPRI network.
+ *
+ * The methods and data members of this class are only to be accessed and
+ * modified from the tethering master state machine thread. Any other
+ * access semantics would necessitate the addition of locking.
+ *
+ * TODO: Move upstream selection logic here.
+ *
+ * All callback methods are run on the same thread as the specified target
+ * state machine.  This class does not require locking when accessed from this
+ * thread.  Access from other threads is not advised.
+ *
+ * @hide
+ */
+public class UpstreamNetworkMonitor {
+    private static final String TAG = UpstreamNetworkMonitor.class.getSimpleName();
+    private static final boolean DBG = false;
+    private static final boolean VDBG = false;
+
+    public static final int EVENT_ON_CAPABILITIES   = 1;
+    public static final int EVENT_ON_LINKPROPERTIES = 2;
+    public static final int EVENT_ON_LOST           = 3;
+    public static final int NOTIFY_LOCAL_PREFIXES   = 10;
+    // This value is used by deprecated preferredUpstreamIfaceTypes selection which is default
+    // disabled.
+    @VisibleForTesting
+    public static final int TYPE_NONE = -1;
+
+    private static final int CALLBACK_LISTEN_ALL = 1;
+    private static final int CALLBACK_DEFAULT_INTERNET = 2;
+    private static final int CALLBACK_MOBILE_REQUEST = 3;
+
+    private static final SparseIntArray sLegacyTypeToTransport = new SparseIntArray();
+    static {
+        sLegacyTypeToTransport.put(TYPE_MOBILE,       NetworkCapabilities.TRANSPORT_CELLULAR);
+        sLegacyTypeToTransport.put(TYPE_MOBILE_DUN,   NetworkCapabilities.TRANSPORT_CELLULAR);
+        sLegacyTypeToTransport.put(TYPE_MOBILE_HIPRI, NetworkCapabilities.TRANSPORT_CELLULAR);
+        sLegacyTypeToTransport.put(TYPE_WIFI,         NetworkCapabilities.TRANSPORT_WIFI);
+        sLegacyTypeToTransport.put(TYPE_BLUETOOTH,    NetworkCapabilities.TRANSPORT_BLUETOOTH);
+        sLegacyTypeToTransport.put(TYPE_ETHERNET,     NetworkCapabilities.TRANSPORT_ETHERNET);
+    }
+
+    private final Context mContext;
+    private final SharedLog mLog;
+    private final StateMachine mTarget;
+    private final Handler mHandler;
+    private final int mWhat;
+    private final HashMap<Network, UpstreamNetworkState> mNetworkMap = new HashMap<>();
+    private HashSet<IpPrefix> mLocalPrefixes;
+    private ConnectivityManager mCM;
+    private EntitlementManager mEntitlementMgr;
+    private NetworkCallback mListenAllCallback;
+    private NetworkCallback mDefaultNetworkCallback;
+    private NetworkCallback mMobileNetworkCallback;
+    private boolean mDunRequired;
+    // Whether the current default upstream is mobile or not.
+    private boolean mIsDefaultCellularUpstream;
+    // The current system default network (not really used yet).
+    private Network mDefaultInternetNetwork;
+    // The current upstream network used for tethering.
+    private Network mTetheringUpstreamNetwork;
+
+    public UpstreamNetworkMonitor(Context ctx, StateMachine tgt, SharedLog log, int what) {
+        mContext = ctx;
+        mTarget = tgt;
+        mHandler = mTarget.getHandler();
+        mLog = log.forSubComponent(TAG);
+        mWhat = what;
+        mLocalPrefixes = new HashSet<>();
+        mIsDefaultCellularUpstream = false;
+    }
+
+    @VisibleForTesting
+    public UpstreamNetworkMonitor(
+            ConnectivityManager cm, StateMachine tgt, SharedLog log, int what) {
+        this((Context) null, tgt, log, what);
+        mCM = cm;
+    }
+
+    /**
+     * Tracking the system default network. This method should be called when system is ready.
+     *
+     * @param defaultNetworkRequest should be the same as ConnectivityService default request
+     * @param entitle a EntitlementManager object to communicate between EntitlementManager and
+     * UpstreamNetworkMonitor
+     */
+    public void startTrackDefaultNetwork(NetworkRequest defaultNetworkRequest,
+            EntitlementManager entitle) {
+
+        // defaultNetworkRequest is not really a "request", just a way of tracking the system
+        // default network. It's guaranteed not to actually bring up any networks because it's
+        // the should be the same request as the ConnectivityService default request, and thus
+        // shares fate with it. We can't use registerDefaultNetworkCallback because it will not
+        // track the system default network if there is a VPN that applies to our UID.
+        if (mDefaultNetworkCallback == null) {
+            mDefaultNetworkCallback = new UpstreamNetworkCallback(CALLBACK_DEFAULT_INTERNET);
+            cm().requestNetwork(defaultNetworkRequest, mDefaultNetworkCallback, mHandler);
+        }
+        if (mEntitlementMgr == null) {
+            mEntitlementMgr = entitle;
+        }
+    }
+
+    /** Listen all networks. */
+    public void startObserveAllNetworks() {
+        stop();
+
+        final NetworkRequest listenAllRequest = new NetworkRequest.Builder()
+                .clearCapabilities().build();
+        mListenAllCallback = new UpstreamNetworkCallback(CALLBACK_LISTEN_ALL);
+        cm().registerNetworkCallback(listenAllRequest, mListenAllCallback, mHandler);
+    }
+
+    /**
+     * Stop tracking candidate tethering upstreams and release mobile network request.
+     * Note: this function is used when tethering is stopped because tethering do not need to
+     * choose upstream anymore. But it would not stop default network tracking because
+     * EntitlementManager may need to know default network to decide whether to request entitlement
+     * check even tethering is not active yet.
+     */
+    public void stop() {
+        releaseMobileNetworkRequest();
+
+        releaseCallback(mListenAllCallback);
+        mListenAllCallback = null;
+
+        mTetheringUpstreamNetwork = null;
+        mNetworkMap.clear();
+    }
+
+    /** Setup or teardown DUN connection according to |dunRequired|. */
+    public void updateMobileRequiresDun(boolean dunRequired) {
+        final boolean valueChanged = (mDunRequired != dunRequired);
+        mDunRequired = dunRequired;
+        if (valueChanged && mobileNetworkRequested()) {
+            releaseMobileNetworkRequest();
+            registerMobileNetworkRequest();
+        }
+    }
+
+    /** Whether mobile network is requested. */
+    public boolean mobileNetworkRequested() {
+        return (mMobileNetworkCallback != null);
+    }
+
+    /** Request mobile network if mobile upstream is permitted. */
+    public void registerMobileNetworkRequest() {
+        if (!isCellularUpstreamPermitted()) {
+            mLog.i("registerMobileNetworkRequest() is not permitted");
+            releaseMobileNetworkRequest();
+            return;
+        }
+        if (mMobileNetworkCallback != null) {
+            mLog.e("registerMobileNetworkRequest() already registered");
+            return;
+        }
+
+        final NetworkRequest mobileUpstreamRequest;
+        if (mDunRequired) {
+            mobileUpstreamRequest = new NetworkRequest.Builder()
+                    .addCapability(NET_CAPABILITY_DUN)
+                    .removeCapability(NET_CAPABILITY_NOT_RESTRICTED)
+                    .addTransportType(TRANSPORT_CELLULAR).build();
+        } else {
+            mobileUpstreamRequest = new NetworkRequest.Builder()
+                    .addCapability(NET_CAPABILITY_INTERNET)
+                    .addTransportType(TRANSPORT_CELLULAR).build();
+        }
+
+        // The existing default network and DUN callbacks will be notified.
+        // Therefore, to avoid duplicate notifications, we only register a no-op.
+        mMobileNetworkCallback = new UpstreamNetworkCallback(CALLBACK_MOBILE_REQUEST);
+
+        // The following use of the legacy type system cannot be removed until
+        // upstream selection no longer finds networks by legacy type.
+        // See also http://b/34364553 .
+        final int legacyType = mDunRequired ? TYPE_MOBILE_DUN : TYPE_MOBILE_HIPRI;
+
+        // TODO: Change the timeout from 0 (no onUnavailable callback) to some
+        // moderate callback timeout. This might be useful for updating some UI.
+        // Additionally, we log a message to aid in any subsequent debugging.
+        mLog.i("requesting mobile upstream network: " + mobileUpstreamRequest);
+
+        cm().requestNetwork(mobileUpstreamRequest, 0, legacyType, mHandler,
+                mMobileNetworkCallback);
+    }
+
+    /** Release mobile network request. */
+    public void releaseMobileNetworkRequest() {
+        if (mMobileNetworkCallback == null) return;
+
+        cm().unregisterNetworkCallback(mMobileNetworkCallback);
+        mMobileNetworkCallback = null;
+    }
+
+    // So many TODOs here, but chief among them is: make this functionality an
+    // integral part of this class such that whenever a higher priority network
+    // becomes available and useful we (a) file a request to keep it up as
+    // necessary and (b) change all upstream tracking state accordingly (by
+    // passing LinkProperties up to Tethering).
+    /**
+     * Select the first available network from |perferredTypes|.
+     */
+    public UpstreamNetworkState selectPreferredUpstreamType(Iterable<Integer> preferredTypes) {
+        final TypeStatePair typeStatePair = findFirstAvailableUpstreamByType(
+                mNetworkMap.values(), preferredTypes, isCellularUpstreamPermitted());
+
+        mLog.log("preferred upstream type: " + typeStatePair.type);
+
+        switch (typeStatePair.type) {
+            case TYPE_MOBILE_DUN:
+            case TYPE_MOBILE_HIPRI:
+                // Tethering just selected mobile upstream in spite of the default network being
+                // not mobile. This can happen because of the priority list.
+                // Notify EntitlementManager to check permission for using mobile upstream.
+                if (!mIsDefaultCellularUpstream) {
+                    mEntitlementMgr.maybeRunProvisioning();
+                }
+                // If we're on DUN, put our own grab on it.
+                registerMobileNetworkRequest();
+                break;
+            case TYPE_NONE:
+                // If we found NONE and mobile upstream is permitted we don't want to do this
+                // as we want any previous requests to keep trying to bring up something we can use.
+                if (!isCellularUpstreamPermitted()) releaseMobileNetworkRequest();
+                break;
+            default:
+                // If we've found an active upstream connection that's not DUN/HIPRI
+                // we should stop any outstanding DUN/HIPRI requests.
+                releaseMobileNetworkRequest();
+                break;
+        }
+
+        return typeStatePair.ns;
+    }
+
+    /**
+     * Get current preferred upstream network. If default network is cellular and DUN is required,
+     * preferred upstream would be DUN otherwise preferred upstream is the same as default network.
+     * Returns null if no current upstream is available.
+     */
+    public UpstreamNetworkState getCurrentPreferredUpstream() {
+        final UpstreamNetworkState dfltState = (mDefaultInternetNetwork != null)
+                ? mNetworkMap.get(mDefaultInternetNetwork)
+                : null;
+        if (isNetworkUsableAndNotCellular(dfltState)) return dfltState;
+
+        if (!isCellularUpstreamPermitted()) return null;
+
+        if (!mDunRequired) return dfltState;
+
+        // Find a DUN network. Note that code in Tethering causes a DUN request
+        // to be filed, but this might be moved into this class in future.
+        return findFirstDunNetwork(mNetworkMap.values());
+    }
+
+    /** Tell UpstreamNetworkMonitor which network is the current upstream of tethering. */
+    public void setCurrentUpstream(Network upstream) {
+        mTetheringUpstreamNetwork = upstream;
+    }
+
+    /** Return local prefixes. */
+    public Set<IpPrefix> getLocalPrefixes() {
+        return (Set<IpPrefix>) mLocalPrefixes.clone();
+    }
+
+    private boolean isCellularUpstreamPermitted() {
+        if (mEntitlementMgr != null) {
+            return mEntitlementMgr.isCellularUpstreamPermitted();
+        } else {
+            // This flow should only happens in testing.
+            return true;
+        }
+    }
+
+    private void handleAvailable(Network network) {
+        if (mNetworkMap.containsKey(network)) return;
+
+        if (VDBG) Log.d(TAG, "onAvailable for " + network);
+        mNetworkMap.put(network, new UpstreamNetworkState(null, null, network));
+    }
+
+    private void handleNetCap(Network network, NetworkCapabilities newNc) {
+        final UpstreamNetworkState prev = mNetworkMap.get(network);
+        if (prev == null || newNc.equals(prev.networkCapabilities)) {
+            // Ignore notifications about networks for which we have not yet
+            // received onAvailable() (should never happen) and any duplicate
+            // notifications (e.g. matching more than one of our callbacks).
+            return;
+        }
+
+        if (VDBG) {
+            Log.d(TAG, String.format("EVENT_ON_CAPABILITIES for %s: %s",
+                    network, newNc));
+        }
+
+        mNetworkMap.put(network, new UpstreamNetworkState(
+                prev.linkProperties, newNc, network));
+        // TODO: If sufficient information is available to select a more
+        // preferable upstream, do so now and notify the target.
+        notifyTarget(EVENT_ON_CAPABILITIES, network);
+    }
+
+    private void handleLinkProp(Network network, LinkProperties newLp) {
+        final UpstreamNetworkState prev = mNetworkMap.get(network);
+        if (prev == null || newLp.equals(prev.linkProperties)) {
+            // Ignore notifications about networks for which we have not yet
+            // received onAvailable() (should never happen) and any duplicate
+            // notifications (e.g. matching more than one of our callbacks).
+            return;
+        }
+
+        if (VDBG) {
+            Log.d(TAG, String.format("EVENT_ON_LINKPROPERTIES for %s: %s",
+                    network, newLp));
+        }
+
+        mNetworkMap.put(network, new UpstreamNetworkState(
+                newLp, prev.networkCapabilities, network));
+        // TODO: If sufficient information is available to select a more
+        // preferable upstream, do so now and notify the target.
+        notifyTarget(EVENT_ON_LINKPROPERTIES, network);
+    }
+
+    private void handleLost(Network network) {
+        // There are few TODOs within ConnectivityService's rematching code
+        // pertaining to spurious onLost() notifications.
+        //
+        // TODO: simplify this, probably if favor of code that:
+        //     - selects a new upstream if mTetheringUpstreamNetwork has
+        //       been lost (by any callback)
+        //     - deletes the entry from the map only when the LISTEN_ALL
+        //       callback gets notified.
+
+        if (!mNetworkMap.containsKey(network)) {
+            // Ignore loss of networks about which we had not previously
+            // learned any information or for which we have already processed
+            // an onLost() notification.
+            return;
+        }
+
+        if (VDBG) Log.d(TAG, "EVENT_ON_LOST for " + network);
+
+        // TODO: If sufficient information is available to select a more
+        // preferable upstream, do so now and notify the target.  Likewise,
+        // if the current upstream network is gone, notify the target of the
+        // fact that we now have no upstream at all.
+        notifyTarget(EVENT_ON_LOST, mNetworkMap.remove(network));
+    }
+
+    private void recomputeLocalPrefixes() {
+        final HashSet<IpPrefix> localPrefixes = allLocalPrefixes(mNetworkMap.values());
+        if (!mLocalPrefixes.equals(localPrefixes)) {
+            mLocalPrefixes = localPrefixes;
+            notifyTarget(NOTIFY_LOCAL_PREFIXES, localPrefixes.clone());
+        }
+    }
+
+    // Fetch (and cache) a ConnectivityManager only if and when we need one.
+    private ConnectivityManager cm() {
+        if (mCM == null) {
+            // MUST call the String variant to be able to write unittests.
+            mCM = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
+        }
+        return mCM;
+    }
+
+    /**
+     * A NetworkCallback class that handles information of interest directly
+     * in the thread on which it is invoked. To avoid locking, this MUST be
+     * run on the same thread as the target state machine's handler.
+     */
+    private class UpstreamNetworkCallback extends NetworkCallback {
+        private final int mCallbackType;
+
+        UpstreamNetworkCallback(int callbackType) {
+            mCallbackType = callbackType;
+        }
+
+        @Override
+        public void onAvailable(Network network) {
+            handleAvailable(network);
+        }
+
+        @Override
+        public void onCapabilitiesChanged(Network network, NetworkCapabilities newNc) {
+            if (mCallbackType == CALLBACK_DEFAULT_INTERNET) {
+                mDefaultInternetNetwork = network;
+                final boolean newIsCellular = isCellular(newNc);
+                if (mIsDefaultCellularUpstream != newIsCellular) {
+                    mIsDefaultCellularUpstream = newIsCellular;
+                    mEntitlementMgr.notifyUpstream(newIsCellular);
+                }
+                return;
+            }
+
+            handleNetCap(network, newNc);
+        }
+
+        @Override
+        public void onLinkPropertiesChanged(Network network, LinkProperties newLp) {
+            if (mCallbackType == CALLBACK_DEFAULT_INTERNET) return;
+
+            handleLinkProp(network, newLp);
+            // Any non-LISTEN_ALL callback will necessarily concern a network that will
+            // also match the LISTEN_ALL callback by construction of the LISTEN_ALL callback.
+            // So it's not useful to do this work for non-LISTEN_ALL callbacks.
+            if (mCallbackType == CALLBACK_LISTEN_ALL) {
+                recomputeLocalPrefixes();
+            }
+        }
+
+        @Override
+        public void onLost(Network network) {
+            if (mCallbackType == CALLBACK_DEFAULT_INTERNET) {
+                mDefaultInternetNetwork = null;
+                mIsDefaultCellularUpstream = false;
+                mEntitlementMgr.notifyUpstream(false);
+                return;
+            }
+
+            handleLost(network);
+            // Any non-LISTEN_ALL callback will necessarily concern a network that will
+            // also match the LISTEN_ALL callback by construction of the LISTEN_ALL callback.
+            // So it's not useful to do this work for non-LISTEN_ALL callbacks.
+            if (mCallbackType == CALLBACK_LISTEN_ALL) {
+                recomputeLocalPrefixes();
+            }
+        }
+    }
+
+    private void releaseCallback(NetworkCallback cb) {
+        if (cb != null) cm().unregisterNetworkCallback(cb);
+    }
+
+    private void notifyTarget(int which, Network network) {
+        notifyTarget(which, mNetworkMap.get(network));
+    }
+
+    private void notifyTarget(int which, Object obj) {
+        mTarget.sendMessage(mWhat, which, 0, obj);
+    }
+
+    private static class TypeStatePair {
+        public int type = TYPE_NONE;
+        public UpstreamNetworkState ns = null;
+    }
+
+    private static TypeStatePair findFirstAvailableUpstreamByType(
+            Iterable<UpstreamNetworkState> netStates, Iterable<Integer> preferredTypes,
+            boolean isCellularUpstreamPermitted) {
+        final TypeStatePair result = new TypeStatePair();
+
+        for (int type : preferredTypes) {
+            NetworkCapabilities nc;
+            try {
+                nc = networkCapabilitiesForType(type);
+            } catch (IllegalArgumentException iae) {
+                Log.e(TAG, "No NetworkCapabilities mapping for legacy type: " + type);
+                continue;
+            }
+            if (!isCellularUpstreamPermitted && isCellular(nc)) {
+                continue;
+            }
+
+            for (UpstreamNetworkState value : netStates) {
+                if (!nc.satisfiedByNetworkCapabilities(value.networkCapabilities)) {
+                    continue;
+                }
+
+                result.type = type;
+                result.ns = value;
+                return result;
+            }
+        }
+
+        return result;
+    }
+
+    private static HashSet<IpPrefix> allLocalPrefixes(Iterable<UpstreamNetworkState> netStates) {
+        final HashSet<IpPrefix> prefixSet = new HashSet<>();
+
+        for (UpstreamNetworkState ns : netStates) {
+            final LinkProperties lp = ns.linkProperties;
+            if (lp == null) continue;
+            prefixSet.addAll(PrefixUtils.localPrefixesFrom(lp));
+        }
+
+        return prefixSet;
+    }
+
+    private static boolean isCellular(UpstreamNetworkState ns) {
+        return (ns != null) && isCellular(ns.networkCapabilities);
+    }
+
+    private static boolean isCellular(NetworkCapabilities nc) {
+        return (nc != null) && nc.hasTransport(TRANSPORT_CELLULAR)
+               && nc.hasCapability(NET_CAPABILITY_NOT_VPN);
+    }
+
+    private static boolean hasCapability(UpstreamNetworkState ns, int netCap) {
+        return (ns != null) && (ns.networkCapabilities != null)
+               && ns.networkCapabilities.hasCapability(netCap);
+    }
+
+    private static boolean isNetworkUsableAndNotCellular(UpstreamNetworkState ns) {
+        return (ns != null) && (ns.networkCapabilities != null) && (ns.linkProperties != null)
+               && !isCellular(ns.networkCapabilities);
+    }
+
+    private static UpstreamNetworkState findFirstDunNetwork(
+            Iterable<UpstreamNetworkState> netStates) {
+        for (UpstreamNetworkState ns : netStates) {
+            if (isCellular(ns) && hasCapability(ns, NET_CAPABILITY_DUN)) return ns;
+        }
+
+        return null;
+    }
+
+    /**
+     * Given a legacy type (TYPE_WIFI, ...) returns the corresponding NetworkCapabilities instance.
+     * This function is used for deprecated legacy type and be disabled by default.
+     */
+    @VisibleForTesting
+    public static NetworkCapabilities networkCapabilitiesForType(int type) {
+        final NetworkCapabilities.Builder builder = new NetworkCapabilities.Builder();
+
+        // Map from type to transports.
+        final int notFound = -1;
+        final int transport = sLegacyTypeToTransport.get(type, notFound);
+        Preconditions.checkArgument(transport != notFound, "unknown legacy type: " + type);
+        builder.addTransportType(transport);
+
+        if (type == TYPE_MOBILE_DUN) {
+            builder.addCapability(NetworkCapabilities.NET_CAPABILITY_DUN);
+            // DUN is restricted network, see NetworkCapabilities#FORCE_RESTRICTED_CAPABILITIES.
+            builder.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED);
+        } else {
+            builder.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
+        }
+        return builder.build();
+    }
+}
diff --git a/packages/Tethering/src/com/android/networkstack/tethering/UpstreamNetworkState.java b/packages/Tethering/src/com/android/networkstack/tethering/UpstreamNetworkState.java
new file mode 100644
index 0000000..bab9f84
--- /dev/null
+++ b/packages/Tethering/src/com/android/networkstack/tethering/UpstreamNetworkState.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2019 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.networkstack.tethering;
+
+import android.net.LinkProperties;
+import android.net.Network;
+import android.net.NetworkCapabilities;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Snapshot of tethering upstream network state.
+ */
+public class UpstreamNetworkState {
+    /** {@link LinkProperties}. */
+    public final LinkProperties linkProperties;
+    /** {@link NetworkCapabilities}. */
+    public final NetworkCapabilities networkCapabilities;
+    /** {@link Network}. */
+    public final Network network;
+
+    /** Constructs a new UpstreamNetworkState. */
+    public UpstreamNetworkState(LinkProperties linkProperties,
+            NetworkCapabilities networkCapabilities, Network network) {
+        this.linkProperties = linkProperties;
+        this.networkCapabilities = networkCapabilities;
+        this.network = network;
+    }
+
+    @NonNull
+    @Override
+    public String toString() {
+        return String.format("UpstreamNetworkState{%s, %s, %s}",
+                network == null ? "null" : network,
+                networkCapabilities == null ? "null" : networkCapabilities,
+                linkProperties == null ? "null" : linkProperties);
+    }
+}
diff --git a/packages/Tethering/src/com/android/server/connectivity/tethering/ConnectedClientsTracker.java b/packages/Tethering/src/com/android/server/connectivity/tethering/ConnectedClientsTracker.java
deleted file mode 100644
index cdd1a5d..0000000
--- a/packages/Tethering/src/com/android/server/connectivity/tethering/ConnectedClientsTracker.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.connectivity.tethering;
-
-import static android.net.TetheringManager.TETHERING_WIFI;
-
-import android.net.MacAddress;
-import android.net.TetheredClient;
-import android.net.TetheredClient.AddressInfo;
-import android.net.ip.IpServer;
-import android.net.wifi.WifiClient;
-import android.os.SystemClock;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.annotation.VisibleForTesting;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Tracker for clients connected to downstreams.
- *
- * <p>This class is not thread safe, it is intended to be used only from the tethering handler
- * thread.
- */
-public class ConnectedClientsTracker {
-    private final Clock mClock;
-
-    @NonNull
-    private List<WifiClient> mLastWifiClients = Collections.emptyList();
-    @NonNull
-    private List<TetheredClient> mLastTetheredClients = Collections.emptyList();
-
-    @VisibleForTesting
-    static class Clock {
-        public long elapsedRealtime() {
-            return SystemClock.elapsedRealtime();
-        }
-    }
-
-    public ConnectedClientsTracker() {
-        this(new Clock());
-    }
-
-    @VisibleForTesting
-    ConnectedClientsTracker(Clock clock) {
-        mClock = clock;
-    }
-
-    /**
-     * Update the tracker with new connected clients.
-     *
-     * <p>The new list can be obtained through {@link #getLastTetheredClients()}.
-     * @param ipServers The IpServers used to assign addresses to clients.
-     * @param wifiClients The list of L2-connected WiFi clients. Null for no change since last
-     *                    update.
-     * @return True if the list of clients changed since the last calculation.
-     */
-    public boolean updateConnectedClients(
-            Iterable<IpServer> ipServers, @Nullable List<WifiClient> wifiClients) {
-        final long now = mClock.elapsedRealtime();
-
-        if (wifiClients != null) {
-            mLastWifiClients = wifiClients;
-        }
-        final Set<MacAddress> wifiClientMacs = getClientMacs(mLastWifiClients);
-
-        // Build the list of non-expired leases from all IpServers, grouped by mac address
-        final Map<MacAddress, TetheredClient> clientsMap = new HashMap<>();
-        for (IpServer server : ipServers) {
-            for (TetheredClient client : server.getAllLeases()) {
-                if (client.getTetheringType() == TETHERING_WIFI
-                        && !wifiClientMacs.contains(client.getMacAddress())) {
-                    // Skip leases of WiFi clients that are not (or no longer) L2-connected
-                    continue;
-                }
-                final TetheredClient prunedClient = pruneExpired(client, now);
-                if (prunedClient == null) continue; // All addresses expired
-
-                addLease(clientsMap, prunedClient);
-            }
-        }
-
-        // TODO: add IPv6 addresses from netlink
-
-        // Add connected WiFi clients that do not have any known address
-        for (MacAddress client : wifiClientMacs) {
-            if (clientsMap.containsKey(client)) continue;
-            clientsMap.put(client, new TetheredClient(
-                    client, Collections.emptyList() /* addresses */, TETHERING_WIFI));
-        }
-
-        final HashSet<TetheredClient> clients = new HashSet<>(clientsMap.values());
-        final boolean clientsChanged = clients.size() != mLastTetheredClients.size()
-                || !clients.containsAll(mLastTetheredClients);
-        mLastTetheredClients = Collections.unmodifiableList(new ArrayList<>(clients));
-        return clientsChanged;
-    }
-
-    private static void addLease(Map<MacAddress, TetheredClient> clientsMap, TetheredClient lease) {
-        final TetheredClient aggregateClient = clientsMap.getOrDefault(
-                lease.getMacAddress(), lease);
-        if (aggregateClient == lease) {
-            // This is the first lease with this mac address
-            clientsMap.put(lease.getMacAddress(), lease);
-            return;
-        }
-
-        // Only add the address info; this assumes that the tethering type is the same when the mac
-        // address is the same. If a client is connected through different tethering types with the
-        // same mac address, connected clients callbacks will report all of its addresses under only
-        // one of these tethering types. This keeps the API simple considering that such a scenario
-        // would really be a rare edge case.
-        clientsMap.put(lease.getMacAddress(), aggregateClient.addAddresses(lease));
-    }
-
-    /**
-     * Get the last list of tethered clients, as calculated in {@link #updateConnectedClients}.
-     *
-     * <p>The returned list is immutable.
-     */
-    @NonNull
-    public List<TetheredClient> getLastTetheredClients() {
-        return mLastTetheredClients;
-    }
-
-    private static boolean hasExpiredAddress(List<AddressInfo> addresses, long now) {
-        for (AddressInfo info : addresses) {
-            if (info.getExpirationTime() <= now) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    @Nullable
-    private static TetheredClient pruneExpired(TetheredClient client, long now) {
-        final List<AddressInfo> addresses = client.getAddresses();
-        if (addresses.size() == 0) return null;
-        if (!hasExpiredAddress(addresses, now)) return client;
-
-        final ArrayList<AddressInfo> newAddrs = new ArrayList<>(addresses.size() - 1);
-        for (AddressInfo info : addresses) {
-            if (info.getExpirationTime() > now) {
-                newAddrs.add(info);
-            }
-        }
-
-        if (newAddrs.size() == 0) {
-            return null;
-        }
-        return new TetheredClient(client.getMacAddress(), newAddrs, client.getTetheringType());
-    }
-
-    @NonNull
-    private static Set<MacAddress> getClientMacs(@NonNull List<WifiClient> clients) {
-        final Set<MacAddress> macs = new HashSet<>(clients.size());
-        for (WifiClient c : clients) {
-            macs.add(c.getMacAddress());
-        }
-        return macs;
-    }
-}
diff --git a/packages/Tethering/src/com/android/server/connectivity/tethering/EntitlementManager.java b/packages/Tethering/src/com/android/server/connectivity/tethering/EntitlementManager.java
deleted file mode 100644
index 639cf65..0000000
--- a/packages/Tethering/src/com/android/server/connectivity/tethering/EntitlementManager.java
+++ /dev/null
@@ -1,675 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.connectivity.tethering;
-
-import static android.net.TetheringConstants.EXTRA_ADD_TETHER_TYPE;
-import static android.net.TetheringConstants.EXTRA_PROVISION_CALLBACK;
-import static android.net.TetheringConstants.EXTRA_RUN_PROVISION;
-import static android.net.TetheringManager.TETHERING_BLUETOOTH;
-import static android.net.TetheringManager.TETHERING_ETHERNET;
-import static android.net.TetheringManager.TETHERING_INVALID;
-import static android.net.TetheringManager.TETHERING_USB;
-import static android.net.TetheringManager.TETHERING_WIFI;
-import static android.net.TetheringManager.TETHER_ERROR_ENTITLEMENT_UNKNOWN;
-import static android.net.TetheringManager.TETHER_ERROR_NO_ERROR;
-import static android.net.TetheringManager.TETHER_ERROR_PROVISIONING_FAILED;
-
-import android.app.AlarmManager;
-import android.app.PendingIntent;
-import android.content.BroadcastReceiver;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.net.util.SharedLog;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.Message;
-import android.os.Parcel;
-import android.os.PersistableBundle;
-import android.os.ResultReceiver;
-import android.os.SystemClock;
-import android.os.SystemProperties;
-import android.provider.Settings;
-import android.telephony.CarrierConfigManager;
-import android.util.ArraySet;
-import android.util.SparseIntArray;
-
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.util.StateMachine;
-import com.android.networkstack.tethering.R;
-
-import java.io.PrintWriter;
-
-/**
- * Re-check tethering provisioning for enabled downstream tether types.
- * Reference TetheringManager.TETHERING_{@code *} for each tether type.
- *
- * All methods of this class must be accessed from the thread of tethering
- * state machine.
- * @hide
- */
-public class EntitlementManager {
-    private static final String TAG = EntitlementManager.class.getSimpleName();
-    private static final boolean DBG = false;
-
-    @VisibleForTesting
-    protected static final String DISABLE_PROVISIONING_SYSPROP_KEY = "net.tethering.noprovisioning";
-    private static final String ACTION_PROVISIONING_ALARM =
-            "com.android.server.connectivity.tethering.PROVISIONING_RECHECK_ALARM";
-    private static final String EXTRA_SUBID = "subId";
-
-    private final ComponentName mSilentProvisioningService;
-    private static final int MS_PER_HOUR = 60 * 60 * 1000;
-    private static final int EVENT_START_PROVISIONING = 0;
-    private static final int EVENT_STOP_PROVISIONING = 1;
-    private static final int EVENT_UPSTREAM_CHANGED = 2;
-    private static final int EVENT_MAYBE_RUN_PROVISIONING = 3;
-    private static final int EVENT_GET_ENTITLEMENT_VALUE = 4;
-
-    // The ArraySet contains enabled downstream types, ex:
-    // {@link TetheringManager.TETHERING_WIFI}
-    // {@link TetheringManager.TETHERING_USB}
-    // {@link TetheringManager.TETHERING_BLUETOOTH}
-    private final ArraySet<Integer> mCurrentTethers;
-    private final Context mContext;
-    private final int mPermissionChangeMessageCode;
-    private final SharedLog mLog;
-    private final SparseIntArray mEntitlementCacheValue;
-    private final EntitlementHandler mHandler;
-    private final StateMachine mTetherMasterSM;
-    // Key: TetheringManager.TETHERING_*(downstream).
-    // Value: TetheringManager.TETHER_ERROR_{NO_ERROR or PROVISION_FAILED}(provisioning result).
-    private final SparseIntArray mCellularPermitted;
-    private PendingIntent mProvisioningRecheckAlarm;
-    private boolean mCellularUpstreamPermitted = true;
-    private boolean mUsingCellularAsUpstream = false;
-    private boolean mNeedReRunProvisioningUi = false;
-    private OnUiEntitlementFailedListener mListener;
-    private TetheringConfigurationFetcher mFetcher;
-
-    public EntitlementManager(Context ctx, StateMachine tetherMasterSM, SharedLog log,
-            int permissionChangeMessageCode) {
-
-        mContext = ctx;
-        mLog = log.forSubComponent(TAG);
-        mCurrentTethers = new ArraySet<Integer>();
-        mCellularPermitted = new SparseIntArray();
-        mEntitlementCacheValue = new SparseIntArray();
-        mTetherMasterSM = tetherMasterSM;
-        mPermissionChangeMessageCode = permissionChangeMessageCode;
-        final Handler masterHandler = tetherMasterSM.getHandler();
-        // Create entitlement's own handler which is associated with TetherMaster thread
-        // let all entitlement processes run in the same thread.
-        mHandler = new EntitlementHandler(masterHandler.getLooper());
-        mContext.registerReceiver(mReceiver, new IntentFilter(ACTION_PROVISIONING_ALARM),
-                null, mHandler);
-        mSilentProvisioningService = ComponentName.unflattenFromString(
-                mContext.getResources().getString(R.string.config_wifi_tether_enable));
-    }
-
-    public void setOnUiEntitlementFailedListener(final OnUiEntitlementFailedListener listener) {
-        mListener = listener;
-    }
-
-    /** Callback fired when UI entitlement failed. */
-    public interface OnUiEntitlementFailedListener {
-        /**
-         * Ui entitlement check fails in |downstream|.
-         *
-         * @param downstream tethering type from TetheringManager.TETHERING_{@code *}.
-         */
-        void onUiEntitlementFailed(int downstream);
-    }
-
-    public void setTetheringConfigurationFetcher(final TetheringConfigurationFetcher fetcher) {
-        mFetcher = fetcher;
-    }
-
-    /** Interface to fetch TetheringConfiguration. */
-    public interface TetheringConfigurationFetcher {
-        /**
-         * Fetch current tethering configuration. This will be called to ensure whether entitlement
-         * check is needed.
-         * @return TetheringConfiguration instance.
-         */
-        TetheringConfiguration fetchTetheringConfiguration();
-    }
-
-    /**
-     * Check if cellular upstream is permitted.
-     */
-    public boolean isCellularUpstreamPermitted() {
-        // If provisioning is required and EntitlementManager don't know any downstream,
-        // cellular upstream should not be allowed.
-        final TetheringConfiguration config = mFetcher.fetchTetheringConfiguration();
-        if (mCurrentTethers.size() == 0 && isTetherProvisioningRequired(config)) {
-            return false;
-        }
-        return mCellularUpstreamPermitted;
-    }
-
-    /**
-     * This is called when tethering starts.
-     * Launch provisioning app if upstream is cellular.
-     *
-     * @param downstreamType tethering type from TetheringManager.TETHERING_{@code *}
-     * @param showProvisioningUi a boolean indicating whether to show the
-     *        provisioning app UI if there is one.
-     */
-    public void startProvisioningIfNeeded(int downstreamType, boolean showProvisioningUi) {
-        mHandler.sendMessage(mHandler.obtainMessage(EVENT_START_PROVISIONING,
-                downstreamType, encodeBool(showProvisioningUi)));
-    }
-
-    private void handleStartProvisioningIfNeeded(int type, boolean showProvisioningUi) {
-        if (!isValidDownstreamType(type)) return;
-
-        if (!mCurrentTethers.contains(type)) mCurrentTethers.add(type);
-
-        final TetheringConfiguration config = mFetcher.fetchTetheringConfiguration();
-        if (isTetherProvisioningRequired(config)) {
-            // If provisioning is required and the result is not available yet,
-            // cellular upstream should not be allowed.
-            if (mCellularPermitted.size() == 0) {
-                mCellularUpstreamPermitted = false;
-            }
-            // If upstream is not cellular, provisioning app would not be launched
-            // till upstream change to cellular.
-            if (mUsingCellularAsUpstream) {
-                if (showProvisioningUi) {
-                    runUiTetherProvisioning(type, config.activeDataSubId);
-                } else {
-                    runSilentTetherProvisioning(type, config.activeDataSubId);
-                }
-                mNeedReRunProvisioningUi = false;
-            } else {
-                mNeedReRunProvisioningUi |= showProvisioningUi;
-            }
-        } else {
-            mCellularUpstreamPermitted = true;
-        }
-    }
-
-    /**
-     * Tell EntitlementManager that a given type of tethering has been disabled
-     *
-     * @param type tethering type from TetheringManager.TETHERING_{@code *}
-     */
-    public void stopProvisioningIfNeeded(int type) {
-        mHandler.sendMessage(mHandler.obtainMessage(EVENT_STOP_PROVISIONING, type, 0));
-    }
-
-    private void handleStopProvisioningIfNeeded(int type) {
-        if (!isValidDownstreamType(type)) return;
-
-        mCurrentTethers.remove(type);
-        // There are lurking bugs where the notion of "provisioning required" or
-        // "tethering supported" may change without without tethering being notified properly.
-        // Remove the mapping all the time no matter provisioning is required or not.
-        removeDownstreamMapping(type);
-    }
-
-    /**
-     * Notify EntitlementManager if upstream is cellular or not.
-     *
-     * @param isCellular whether tethering upstream is cellular.
-     */
-    public void notifyUpstream(boolean isCellular) {
-        mHandler.sendMessage(mHandler.obtainMessage(
-                EVENT_UPSTREAM_CHANGED, encodeBool(isCellular), 0));
-    }
-
-    private void handleNotifyUpstream(boolean isCellular) {
-        if (DBG) {
-            mLog.i("notifyUpstream: " + isCellular
-                    + ", mCellularUpstreamPermitted: " + mCellularUpstreamPermitted
-                    + ", mNeedReRunProvisioningUi: " + mNeedReRunProvisioningUi);
-        }
-        mUsingCellularAsUpstream = isCellular;
-
-        if (mUsingCellularAsUpstream) {
-            final TetheringConfiguration config = mFetcher.fetchTetheringConfiguration();
-            handleMaybeRunProvisioning(config);
-        }
-    }
-
-    /** Run provisioning if needed */
-    public void maybeRunProvisioning() {
-        mHandler.sendMessage(mHandler.obtainMessage(EVENT_MAYBE_RUN_PROVISIONING));
-    }
-
-    private void handleMaybeRunProvisioning(final TetheringConfiguration config) {
-        if (mCurrentTethers.size() == 0 || !isTetherProvisioningRequired(config)) {
-            return;
-        }
-
-        // Whenever any entitlement value changes, all downstreams will re-evaluate whether they
-        // are allowed. Therefore even if the silent check here ends in a failure and the UI later
-        // yields success, then the downstream that got a failure will re-evaluate as a result of
-        // the change and get the new correct value.
-        for (Integer downstream : mCurrentTethers) {
-            if (mCellularPermitted.indexOfKey(downstream) < 0) {
-                if (mNeedReRunProvisioningUi) {
-                    mNeedReRunProvisioningUi = false;
-                    runUiTetherProvisioning(downstream, config.activeDataSubId);
-                } else {
-                    runSilentTetherProvisioning(downstream, config.activeDataSubId);
-                }
-            }
-        }
-    }
-
-    /**
-     * Check if the device requires a provisioning check in order to enable tethering.
-     *
-     * @param config an object that encapsulates the various tethering configuration elements.
-     * @return a boolean - {@code true} indicating tether provisioning is required by the carrier.
-     */
-    @VisibleForTesting
-    protected boolean isTetherProvisioningRequired(final TetheringConfiguration config) {
-        if (SystemProperties.getBoolean(DISABLE_PROVISIONING_SYSPROP_KEY, false)
-                || config.provisioningApp.length == 0) {
-            return false;
-        }
-        if (carrierConfigAffirmsEntitlementCheckNotRequired(config)) {
-            return false;
-        }
-        return (config.provisioningApp.length == 2);
-    }
-
-    /**
-     * Re-check tethering provisioning for all enabled tether types.
-     * Reference TetheringManager.TETHERING_{@code *} for each tether type.
-     *
-     * @param config an object that encapsulates the various tethering configuration elements.
-     * Note: this method is only called from TetherMaster on the handler thread.
-     * If there are new callers from different threads, the logic should move to
-     * masterHandler to avoid race conditions.
-     */
-    public void reevaluateSimCardProvisioning(final TetheringConfiguration config) {
-        if (DBG) mLog.i("reevaluateSimCardProvisioning");
-
-        if (!mHandler.getLooper().isCurrentThread()) {
-            // Except for test, this log should not appear in normal flow.
-            mLog.log("reevaluateSimCardProvisioning() don't run in TetherMaster thread");
-        }
-        mEntitlementCacheValue.clear();
-        mCellularPermitted.clear();
-
-        // TODO: refine provisioning check to isTetherProvisioningRequired() ??
-        if (!config.hasMobileHotspotProvisionApp()
-                || carrierConfigAffirmsEntitlementCheckNotRequired(config)) {
-            evaluateCellularPermission(config);
-            return;
-        }
-
-        if (mUsingCellularAsUpstream) {
-            handleMaybeRunProvisioning(config);
-        }
-    }
-
-    /**
-     * Get carrier configuration bundle.
-     * @param config an object that encapsulates the various tethering configuration elements.
-     * */
-    public PersistableBundle getCarrierConfig(final TetheringConfiguration config) {
-        final CarrierConfigManager configManager = (CarrierConfigManager) mContext
-                .getSystemService(Context.CARRIER_CONFIG_SERVICE);
-        if (configManager == null) return null;
-
-        final PersistableBundle carrierConfig = configManager.getConfigForSubId(
-                config.activeDataSubId);
-
-        if (CarrierConfigManager.isConfigForIdentifiedCarrier(carrierConfig)) {
-            return carrierConfig;
-        }
-
-        return null;
-    }
-
-    // The logic here is aimed solely at confirming that a CarrierConfig exists
-    // and affirms that entitlement checks are not required.
-    //
-    // TODO: find a better way to express this, or alter the checking process
-    // entirely so that this is more intuitive.
-    private boolean carrierConfigAffirmsEntitlementCheckNotRequired(
-            final TetheringConfiguration config) {
-        // Check carrier config for entitlement checks
-        final PersistableBundle carrierConfig = getCarrierConfig(config);
-        if (carrierConfig == null) return false;
-
-        // A CarrierConfigManager was found and it has a config.
-        final boolean isEntitlementCheckRequired = carrierConfig.getBoolean(
-                CarrierConfigManager.KEY_REQUIRE_ENTITLEMENT_CHECKS_BOOL);
-        return !isEntitlementCheckRequired;
-    }
-
-    /**
-     * Run no UI tethering provisioning check.
-     * @param type tethering type from TetheringManager.TETHERING_{@code *}
-     * @param subId default data subscription ID.
-     */
-    @VisibleForTesting
-    protected void runSilentTetherProvisioning(int type, int subId) {
-        if (DBG) mLog.i("runSilentTetherProvisioning: " + type);
-        // For silent provisioning, settings would stop tethering when entitlement fail.
-        ResultReceiver receiver = buildProxyReceiver(type, false/* notifyFail */, null);
-
-        Intent intent = new Intent();
-        intent.putExtra(EXTRA_ADD_TETHER_TYPE, type);
-        intent.putExtra(EXTRA_RUN_PROVISION, true);
-        intent.putExtra(EXTRA_PROVISION_CALLBACK, receiver);
-        intent.putExtra(EXTRA_SUBID, subId);
-        intent.setComponent(mSilentProvisioningService);
-        // Only admin user can change tethering and SilentTetherProvisioning don't need to
-        // show UI, it is fine to always start setting's background service as system user.
-        mContext.startService(intent);
-    }
-
-    private void runUiTetherProvisioning(int type, int subId) {
-        ResultReceiver receiver = buildProxyReceiver(type, true/* notifyFail */, null);
-        runUiTetherProvisioning(type, subId, receiver);
-    }
-
-    /**
-     * Run the UI-enabled tethering provisioning check.
-     * @param type tethering type from TetheringManager.TETHERING_{@code *}
-     * @param subId default data subscription ID.
-     * @param receiver to receive entitlement check result.
-     */
-    @VisibleForTesting
-    protected void runUiTetherProvisioning(int type, int subId, ResultReceiver receiver) {
-        if (DBG) mLog.i("runUiTetherProvisioning: " + type);
-
-        Intent intent = new Intent(Settings.ACTION_TETHER_PROVISIONING_UI);
-        intent.putExtra(EXTRA_ADD_TETHER_TYPE, type);
-        intent.putExtra(EXTRA_PROVISION_CALLBACK, receiver);
-        intent.putExtra(EXTRA_SUBID, subId);
-        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-        // Only launch entitlement UI for system user. Entitlement UI should not appear for other
-        // user because only admin user is allowed to change tethering.
-        mContext.startActivity(intent);
-    }
-
-    // Not needed to check if this don't run on the handler thread because it's private.
-    private void scheduleProvisioningRechecks(final TetheringConfiguration config) {
-        if (mProvisioningRecheckAlarm == null) {
-            final int period = config.provisioningCheckPeriod;
-            if (period <= 0) return;
-
-            Intent intent = new Intent(ACTION_PROVISIONING_ALARM);
-            mProvisioningRecheckAlarm = PendingIntent.getBroadcast(mContext, 0, intent, 0);
-            AlarmManager alarmManager = (AlarmManager) mContext.getSystemService(
-                    Context.ALARM_SERVICE);
-            long periodMs = period * MS_PER_HOUR;
-            long firstAlarmTime = SystemClock.elapsedRealtime() + periodMs;
-            alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME, firstAlarmTime, periodMs,
-                    mProvisioningRecheckAlarm);
-        }
-    }
-
-    private void cancelTetherProvisioningRechecks() {
-        if (mProvisioningRecheckAlarm != null) {
-            AlarmManager alarmManager = (AlarmManager) mContext.getSystemService(
-                    Context.ALARM_SERVICE);
-            alarmManager.cancel(mProvisioningRecheckAlarm);
-            mProvisioningRecheckAlarm = null;
-        }
-    }
-
-    private void evaluateCellularPermission(final TetheringConfiguration config) {
-        final boolean oldPermitted = mCellularUpstreamPermitted;
-        mCellularUpstreamPermitted = (!isTetherProvisioningRequired(config)
-                || mCellularPermitted.indexOfValue(TETHER_ERROR_NO_ERROR) > -1);
-
-        if (DBG) {
-            mLog.i("Cellular permission change from " + oldPermitted
-                    + " to " + mCellularUpstreamPermitted);
-        }
-
-        if (mCellularUpstreamPermitted != oldPermitted) {
-            mLog.log("Cellular permission change: " + mCellularUpstreamPermitted);
-            mTetherMasterSM.sendMessage(mPermissionChangeMessageCode);
-        }
-        // Only schedule periodic re-check when tether is provisioned
-        // and the result is ok.
-        if (mCellularUpstreamPermitted && mCellularPermitted.size() > 0) {
-            scheduleProvisioningRechecks(config);
-        } else {
-            cancelTetherProvisioningRechecks();
-        }
-    }
-
-    /**
-     * Add the mapping between provisioning result and tethering type.
-     * Notify UpstreamNetworkMonitor if Cellular permission changes.
-     *
-     * @param type tethering type from TetheringManager.TETHERING_{@code *}
-     * @param resultCode Provisioning result
-     */
-    protected void addDownstreamMapping(int type, int resultCode) {
-        mLog.i("addDownstreamMapping: " + type + ", result: " + resultCode
-                + " ,TetherTypeRequested: " + mCurrentTethers.contains(type));
-        if (!mCurrentTethers.contains(type)) return;
-
-        mCellularPermitted.put(type, resultCode);
-        final TetheringConfiguration config = mFetcher.fetchTetheringConfiguration();
-        evaluateCellularPermission(config);
-    }
-
-    /**
-     * Remove the mapping for input tethering type.
-     * @param type tethering type from TetheringManager.TETHERING_{@code *}
-     */
-    protected void removeDownstreamMapping(int type) {
-        mLog.i("removeDownstreamMapping: " + type);
-        mCellularPermitted.delete(type);
-        final TetheringConfiguration config = mFetcher.fetchTetheringConfiguration();
-        evaluateCellularPermission(config);
-    }
-
-    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            if (ACTION_PROVISIONING_ALARM.equals(intent.getAction())) {
-                mLog.log("Received provisioning alarm");
-                final TetheringConfiguration config = mFetcher.fetchTetheringConfiguration();
-                reevaluateSimCardProvisioning(config);
-            }
-        }
-    };
-
-    private class EntitlementHandler extends Handler {
-        EntitlementHandler(Looper looper) {
-            super(looper);
-        }
-
-        @Override
-        public void handleMessage(Message msg) {
-            switch (msg.what) {
-                case EVENT_START_PROVISIONING:
-                    handleStartProvisioningIfNeeded(msg.arg1, toBool(msg.arg2));
-                    break;
-                case EVENT_STOP_PROVISIONING:
-                    handleStopProvisioningIfNeeded(msg.arg1);
-                    break;
-                case EVENT_UPSTREAM_CHANGED:
-                    handleNotifyUpstream(toBool(msg.arg1));
-                    break;
-                case EVENT_MAYBE_RUN_PROVISIONING:
-                    final TetheringConfiguration config = mFetcher.fetchTetheringConfiguration();
-                    handleMaybeRunProvisioning(config);
-                    break;
-                case EVENT_GET_ENTITLEMENT_VALUE:
-                    handleRequestLatestTetheringEntitlementValue(msg.arg1,
-                            (ResultReceiver) msg.obj, toBool(msg.arg2));
-                    break;
-                default:
-                    mLog.log("Unknown event: " + msg.what);
-                    break;
-            }
-        }
-    }
-
-    private static boolean toBool(int encodedBoolean) {
-        return encodedBoolean != 0;
-    }
-
-    private static int encodeBool(boolean b) {
-        return b ? 1 : 0;
-    }
-
-    private static boolean isValidDownstreamType(int type) {
-        switch (type) {
-            case TETHERING_BLUETOOTH:
-            case TETHERING_ETHERNET:
-            case TETHERING_USB:
-            case TETHERING_WIFI:
-                return true;
-            default:
-                return false;
-        }
-    }
-
-    /**
-     * Dump the infromation of EntitlementManager.
-     * @param pw {@link PrintWriter} is used to print formatted
-     */
-    public void dump(PrintWriter pw) {
-        pw.print("mCellularUpstreamPermitted: ");
-        pw.println(mCellularUpstreamPermitted);
-        for (Integer type : mCurrentTethers) {
-            pw.print("Type: ");
-            pw.print(typeString(type));
-            if (mCellularPermitted.indexOfKey(type) > -1) {
-                pw.print(", Value: ");
-                pw.println(errorString(mCellularPermitted.get(type)));
-            } else {
-                pw.println(", Value: empty");
-            }
-        }
-    }
-
-    private static String typeString(int type) {
-        switch (type) {
-            case TETHERING_BLUETOOTH: return "TETHERING_BLUETOOTH";
-            case TETHERING_INVALID: return "TETHERING_INVALID";
-            case TETHERING_USB: return "TETHERING_USB";
-            case TETHERING_WIFI: return "TETHERING_WIFI";
-            default:
-                return String.format("TETHERING UNKNOWN TYPE (%d)", type);
-        }
-    }
-
-    private static String errorString(int value) {
-        switch (value) {
-            case TETHER_ERROR_ENTITLEMENT_UNKNOWN: return "TETHER_ERROR_ENTITLEMENT_UNKONWN";
-            case TETHER_ERROR_NO_ERROR: return "TETHER_ERROR_NO_ERROR";
-            case TETHER_ERROR_PROVISIONING_FAILED: return "TETHER_ERROR_PROVISIONING_FAILED";
-            default:
-                return String.format("UNKNOWN ERROR (%d)", value);
-        }
-    }
-
-    private ResultReceiver buildProxyReceiver(int type, boolean notifyFail,
-            final ResultReceiver receiver) {
-        ResultReceiver rr = new ResultReceiver(mHandler) {
-            @Override
-            protected void onReceiveResult(int resultCode, Bundle resultData) {
-                int updatedCacheValue = updateEntitlementCacheValue(type, resultCode);
-                addDownstreamMapping(type, updatedCacheValue);
-                if (updatedCacheValue == TETHER_ERROR_PROVISIONING_FAILED && notifyFail) {
-                    mListener.onUiEntitlementFailed(type);
-                }
-                if (receiver != null) receiver.send(updatedCacheValue, null);
-            }
-        };
-
-        return writeToParcel(rr);
-    }
-
-    // Instances of ResultReceiver need to be public classes for remote processes to be able
-    // to load them (otherwise, ClassNotFoundException). For private classes, this method
-    // performs a trick : round-trip parceling any instance of ResultReceiver will return a
-    // vanilla instance of ResultReceiver sharing the binder token with the original receiver.
-    // The binder token has a reference to the original instance of the private class and will
-    // still call its methods, and can be sent over. However it cannot be used for anything
-    // else than sending over a Binder call.
-    // While round-trip parceling is not great, there is currently no other way of generating
-    // a vanilla instance of ResultReceiver because all its fields are private.
-    private ResultReceiver writeToParcel(final ResultReceiver receiver) {
-        Parcel parcel = Parcel.obtain();
-        receiver.writeToParcel(parcel, 0);
-        parcel.setDataPosition(0);
-        ResultReceiver receiverForSending = ResultReceiver.CREATOR.createFromParcel(parcel);
-        parcel.recycle();
-        return receiverForSending;
-    }
-
-    /**
-     * Update the last entitlement value to internal cache
-     *
-     * @param type tethering type from TetheringManager.TETHERING_{@code *}
-     * @param resultCode last entitlement value
-     * @return the last updated entitlement value
-     */
-    private int updateEntitlementCacheValue(int type, int resultCode) {
-        if (DBG) {
-            mLog.i("updateEntitlementCacheValue: " + type + ", result: " + resultCode);
-        }
-        if (resultCode == TETHER_ERROR_NO_ERROR) {
-            mEntitlementCacheValue.put(type, resultCode);
-            return resultCode;
-        } else {
-            mEntitlementCacheValue.put(type, TETHER_ERROR_PROVISIONING_FAILED);
-            return TETHER_ERROR_PROVISIONING_FAILED;
-        }
-    }
-
-    /** Get the last value of the tethering entitlement check. */
-    public void requestLatestTetheringEntitlementResult(int downstream, ResultReceiver receiver,
-            boolean showEntitlementUi) {
-        mHandler.sendMessage(mHandler.obtainMessage(EVENT_GET_ENTITLEMENT_VALUE,
-                downstream, encodeBool(showEntitlementUi), receiver));
-
-    }
-
-    private void handleRequestLatestTetheringEntitlementValue(int downstream,
-            ResultReceiver receiver, boolean showEntitlementUi) {
-        if (!isValidDownstreamType(downstream)) {
-            receiver.send(TETHER_ERROR_ENTITLEMENT_UNKNOWN, null);
-            return;
-        }
-
-        final TetheringConfiguration config = mFetcher.fetchTetheringConfiguration();
-        if (!isTetherProvisioningRequired(config)) {
-            receiver.send(TETHER_ERROR_NO_ERROR, null);
-            return;
-        }
-
-        final int cacheValue = mEntitlementCacheValue.get(
-                downstream, TETHER_ERROR_ENTITLEMENT_UNKNOWN);
-        if (cacheValue == TETHER_ERROR_NO_ERROR || !showEntitlementUi) {
-            receiver.send(cacheValue, null);
-        } else {
-            ResultReceiver proxy = buildProxyReceiver(downstream, false/* notifyFail */, receiver);
-            runUiTetherProvisioning(downstream, config.activeDataSubId, proxy);
-        }
-    }
-}
diff --git a/packages/Tethering/src/com/android/server/connectivity/tethering/IPv6TetheringCoordinator.java b/packages/Tethering/src/com/android/server/connectivity/tethering/IPv6TetheringCoordinator.java
deleted file mode 100644
index 66b9ade8..0000000
--- a/packages/Tethering/src/com/android/server/connectivity/tethering/IPv6TetheringCoordinator.java
+++ /dev/null
@@ -1,311 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.connectivity.tethering;
-
-import android.net.IpPrefix;
-import android.net.LinkAddress;
-import android.net.LinkProperties;
-import android.net.Network;
-import android.net.NetworkCapabilities;
-import android.net.RouteInfo;
-import android.net.ip.IpServer;
-import android.net.util.NetworkConstants;
-import android.net.util.SharedLog;
-import android.util.Log;
-
-import java.net.Inet6Address;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.LinkedList;
-import java.util.Random;
-
-
-/**
- * IPv6 tethering is rather different from IPv4 owing to the absence of NAT.
- * This coordinator is responsible for evaluating the dedicated prefixes
- * assigned to the device and deciding how to divvy them up among downstream
- * interfaces.
- *
- * @hide
- */
-public class IPv6TetheringCoordinator {
-    private static final String TAG = IPv6TetheringCoordinator.class.getSimpleName();
-    private static final boolean DBG = false;
-    private static final boolean VDBG = false;
-
-    private static class Downstream {
-        public final IpServer ipServer;
-        public final int mode;  // IpServer.STATE_*
-        // Used to append to a ULA /48, constructing a ULA /64 for local use.
-        public final short subnetId;
-
-        Downstream(IpServer ipServer, int mode, short subnetId) {
-            this.ipServer = ipServer;
-            this.mode = mode;
-            this.subnetId = subnetId;
-        }
-    }
-
-    private final ArrayList<IpServer> mNotifyList;
-    private final SharedLog mLog;
-    // NOTE: mActiveDownstreams is a list and not a hash data structure because
-    // we keep active downstreams in arrival order.  This is done so /64s can
-    // be parceled out on a "first come, first served" basis and a /64 used by
-    // a downstream that is no longer active can be redistributed to any next
-    // waiting active downstream (again, in arrival order).
-    private final LinkedList<Downstream> mActiveDownstreams;
-    private final byte[] mUniqueLocalPrefix;
-    private short mNextSubnetId;
-    private UpstreamNetworkState mUpstreamNetworkState;
-
-    public IPv6TetheringCoordinator(ArrayList<IpServer> notifyList, SharedLog log) {
-        mNotifyList = notifyList;
-        mLog = log.forSubComponent(TAG);
-        mActiveDownstreams = new LinkedList<>();
-        mUniqueLocalPrefix = generateUniqueLocalPrefix();
-        mNextSubnetId = 0;
-    }
-
-    /** Add active downstream to ipv6 tethering candidate list. */
-    public void addActiveDownstream(IpServer downstream, int mode) {
-        if (findDownstream(downstream) == null) {
-            // Adding a new downstream appends it to the list. Adding a
-            // downstream a second time without first removing it has no effect.
-            // We never change the mode of a downstream except by first removing
-            // it and then re-adding it (with its new mode specified);
-            if (mActiveDownstreams.offer(new Downstream(downstream, mode, mNextSubnetId))) {
-                // Make sure subnet IDs are always positive. They are appended
-                // to a ULA /48 to make a ULA /64 for local use.
-                mNextSubnetId = (short) Math.max(0, mNextSubnetId + 1);
-            }
-            updateIPv6TetheringInterfaces();
-        }
-    }
-
-    /** Remove downstream from ipv6 tethering candidate list. */
-    public void removeActiveDownstream(IpServer downstream) {
-        stopIPv6TetheringOn(downstream);
-        if (mActiveDownstreams.remove(findDownstream(downstream))) {
-            updateIPv6TetheringInterfaces();
-        }
-
-        // When tethering is stopping we can reset the subnet counter.
-        if (mNotifyList.isEmpty()) {
-            if (!mActiveDownstreams.isEmpty()) {
-                Log.wtf(TAG, "Tethering notify list empty, IPv6 downstreams non-empty.");
-            }
-            mNextSubnetId = 0;
-        }
-    }
-
-    /**
-     * Call when UpstreamNetworkState may be changed.
-     * If upstream has ipv6 for tethering, update this new UpstreamNetworkState
-     * to IpServer. Otherwise stop ipv6 tethering on downstream interfaces.
-     */
-    public void updateUpstreamNetworkState(UpstreamNetworkState ns) {
-        if (VDBG) {
-            Log.d(TAG, "updateUpstreamNetworkState: " + toDebugString(ns));
-        }
-        if (TetheringInterfaceUtils.getIPv6Interface(ns) == null) {
-            stopIPv6TetheringOnAllInterfaces();
-            setUpstreamNetworkState(null);
-            return;
-        }
-
-        if (mUpstreamNetworkState != null
-                && !ns.network.equals(mUpstreamNetworkState.network)) {
-            stopIPv6TetheringOnAllInterfaces();
-        }
-
-        setUpstreamNetworkState(ns);
-        updateIPv6TetheringInterfaces();
-    }
-
-    private void stopIPv6TetheringOnAllInterfaces() {
-        for (IpServer ipServer : mNotifyList) {
-            stopIPv6TetheringOn(ipServer);
-        }
-    }
-
-    private void setUpstreamNetworkState(UpstreamNetworkState ns) {
-        if (ns == null) {
-            mUpstreamNetworkState = null;
-        } else {
-            // Make a deep copy of the parts we need.
-            mUpstreamNetworkState = new UpstreamNetworkState(
-                    new LinkProperties(ns.linkProperties),
-                    new NetworkCapabilities(ns.networkCapabilities),
-                    new Network(ns.network));
-        }
-
-        mLog.log("setUpstreamNetworkState: " + toDebugString(mUpstreamNetworkState));
-    }
-
-    private void updateIPv6TetheringInterfaces() {
-        for (IpServer ipServer : mNotifyList) {
-            final LinkProperties lp = getInterfaceIPv6LinkProperties(ipServer);
-            ipServer.sendMessage(IpServer.CMD_IPV6_TETHER_UPDATE, 0, 0, lp);
-            break;
-        }
-    }
-
-    private LinkProperties getInterfaceIPv6LinkProperties(IpServer ipServer) {
-        final Downstream ds = findDownstream(ipServer);
-        if (ds == null) return null;
-
-        if (ds.mode == IpServer.STATE_LOCAL_ONLY) {
-            // Build a Unique Locally-assigned Prefix configuration.
-            return getUniqueLocalConfig(mUniqueLocalPrefix, ds.subnetId);
-        }
-
-        // This downstream is in IpServer.STATE_TETHERED mode.
-        if (mUpstreamNetworkState == null || mUpstreamNetworkState.linkProperties == null) {
-            return null;
-        }
-
-        // NOTE: Here, in future, we would have policies to decide how to divvy
-        // up the available dedicated prefixes among downstream interfaces.
-        // At this time we have no such mechanism--we only support tethering
-        // IPv6 toward the oldest (first requested) active downstream.
-
-        final Downstream currentActive = mActiveDownstreams.peek();
-        if (currentActive != null && currentActive.ipServer == ipServer) {
-            final LinkProperties lp = getIPv6OnlyLinkProperties(
-                    mUpstreamNetworkState.linkProperties);
-            if (lp.hasIpv6DefaultRoute() && lp.hasGlobalIpv6Address()) {
-                return lp;
-            }
-        }
-
-        return null;
-    }
-
-    Downstream findDownstream(IpServer ipServer) {
-        for (Downstream ds : mActiveDownstreams) {
-            if (ds.ipServer == ipServer) return ds;
-        }
-        return null;
-    }
-
-    private static LinkProperties getIPv6OnlyLinkProperties(LinkProperties lp) {
-        final LinkProperties v6only = new LinkProperties();
-        if (lp == null) {
-            return v6only;
-        }
-
-        // NOTE: At this time we don't copy over any information about any
-        // stacked links. No current stacked link configuration has IPv6.
-
-        v6only.setInterfaceName(lp.getInterfaceName());
-
-        v6only.setMtu(lp.getMtu());
-
-        for (LinkAddress linkAddr : lp.getLinkAddresses()) {
-            if (linkAddr.isGlobalPreferred() && linkAddr.getPrefixLength() == 64) {
-                v6only.addLinkAddress(linkAddr);
-            }
-        }
-
-        for (RouteInfo routeInfo : lp.getRoutes()) {
-            final IpPrefix destination = routeInfo.getDestination();
-            if ((destination.getAddress() instanceof Inet6Address)
-                    && (destination.getPrefixLength() <= 64)) {
-                v6only.addRoute(routeInfo);
-            }
-        }
-
-        for (InetAddress dnsServer : lp.getDnsServers()) {
-            if (isIPv6GlobalAddress(dnsServer)) {
-                // For now we include ULAs.
-                v6only.addDnsServer(dnsServer);
-            }
-        }
-
-        v6only.setDomains(lp.getDomains());
-
-        return v6only;
-    }
-
-    // TODO: Delete this and switch to LinkAddress#isGlobalPreferred once we
-    // announce our own IPv6 address as DNS server.
-    private static boolean isIPv6GlobalAddress(InetAddress ip) {
-        return (ip instanceof Inet6Address)
-               && !ip.isAnyLocalAddress()
-               && !ip.isLoopbackAddress()
-               && !ip.isLinkLocalAddress()
-               && !ip.isSiteLocalAddress()
-               && !ip.isMulticastAddress();
-    }
-
-    private static LinkProperties getUniqueLocalConfig(byte[] ulp, short subnetId) {
-        final LinkProperties lp = new LinkProperties();
-
-        final IpPrefix local48 = makeUniqueLocalPrefix(ulp, (short) 0, 48);
-        lp.addRoute(new RouteInfo(local48, null, null, RouteInfo.RTN_UNICAST));
-
-        final IpPrefix local64 = makeUniqueLocalPrefix(ulp, subnetId, 64);
-        // Because this is a locally-generated ULA, we don't have an upstream
-        // address. But because the downstream IP address management code gets
-        // its prefix from the upstream's IP address, we create a fake one here.
-        lp.addLinkAddress(new LinkAddress(local64.getAddress(), 64));
-
-        lp.setMtu(NetworkConstants.ETHER_MTU);
-        return lp;
-    }
-
-    private static IpPrefix makeUniqueLocalPrefix(byte[] in6addr, short subnetId, int prefixlen) {
-        final byte[] bytes = Arrays.copyOf(in6addr, in6addr.length);
-        bytes[7] = (byte) (subnetId >> 8);
-        bytes[8] = (byte) subnetId;
-        final InetAddress addr;
-        try {
-            addr = InetAddress.getByAddress(bytes);
-        } catch (UnknownHostException e) {
-            throw new IllegalStateException("Invalid address length: " + bytes.length, e);
-        }
-        return new IpPrefix(addr, prefixlen);
-    }
-
-    // Generates a Unique Locally-assigned Prefix:
-    //
-    //     https://tools.ietf.org/html/rfc4193#section-3.1
-    //
-    // The result is a /48 that can be used for local-only communications.
-    private static byte[] generateUniqueLocalPrefix() {
-        final byte[] ulp = new byte[6];  // 6 = 48bits / 8bits/byte
-        (new Random()).nextBytes(ulp);
-
-        final byte[] in6addr = Arrays.copyOf(ulp, NetworkConstants.IPV6_ADDR_LEN);
-        in6addr[0] = (byte) 0xfd;  // fc00::/7 and L=1
-
-        return in6addr;
-    }
-
-    private static String toDebugString(UpstreamNetworkState ns) {
-        if (ns == null) {
-            return "UpstreamNetworkState{null}";
-        }
-        return ns.toString();
-    }
-
-    private static void stopIPv6TetheringOn(IpServer ipServer) {
-        ipServer.sendMessage(IpServer.CMD_IPV6_TETHER_UPDATE, 0, 0, null);
-    }
-}
diff --git a/packages/Tethering/src/com/android/server/connectivity/tethering/OffloadController.java b/packages/Tethering/src/com/android/server/connectivity/tethering/OffloadController.java
deleted file mode 100644
index 15cdb6a..0000000
--- a/packages/Tethering/src/com/android/server/connectivity/tethering/OffloadController.java
+++ /dev/null
@@ -1,721 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.connectivity.tethering;
-
-import static android.net.NetworkStats.DEFAULT_NETWORK_NO;
-import static android.net.NetworkStats.METERED_NO;
-import static android.net.NetworkStats.ROAMING_NO;
-import static android.net.NetworkStats.SET_DEFAULT;
-import static android.net.NetworkStats.TAG_NONE;
-import static android.net.NetworkStats.UID_ALL;
-import static android.net.NetworkStats.UID_TETHERING;
-import static android.provider.Settings.Global.TETHER_OFFLOAD_DISABLED;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.app.usage.NetworkStatsManager;
-import android.content.ContentResolver;
-import android.net.InetAddresses;
-import android.net.IpPrefix;
-import android.net.LinkAddress;
-import android.net.LinkProperties;
-import android.net.NetworkStats;
-import android.net.NetworkStats.Entry;
-import android.net.RouteInfo;
-import android.net.netlink.ConntrackMessage;
-import android.net.netlink.NetlinkConstants;
-import android.net.netlink.NetlinkSocket;
-import android.net.netstats.provider.NetworkStatsProvider;
-import android.net.util.SharedLog;
-import android.os.Handler;
-import android.provider.Settings;
-import android.system.ErrnoException;
-import android.system.OsConstants;
-import android.text.TextUtils;
-import android.util.Log;
-
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.util.IndentingPrintWriter;
-import com.android.server.connectivity.tethering.OffloadHardwareInterface.ForwardedStats;
-
-import java.net.Inet4Address;
-import java.net.Inet6Address;
-import java.net.InetAddress;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-
-/**
- * A class to encapsulate the business logic of programming the tethering
- * hardware offload interface.
- *
- * @hide
- */
-public class OffloadController {
-    private static final String TAG = OffloadController.class.getSimpleName();
-    private static final boolean DBG = false;
-    private static final String ANYIP = "0.0.0.0";
-    private static final ForwardedStats EMPTY_STATS = new ForwardedStats();
-
-    @VisibleForTesting
-    enum StatsType {
-        STATS_PER_IFACE,
-        STATS_PER_UID,
-    }
-
-    private enum UpdateType { IF_NEEDED, FORCE };
-
-    private final Handler mHandler;
-    private final OffloadHardwareInterface mHwInterface;
-    private final ContentResolver mContentResolver;
-    @Nullable
-    private final OffloadTetheringStatsProvider mStatsProvider;
-    private final SharedLog mLog;
-    private final HashMap<String, LinkProperties> mDownstreams;
-    private boolean mConfigInitialized;
-    private boolean mControlInitialized;
-    private LinkProperties mUpstreamLinkProperties;
-    // The complete set of offload-exempt prefixes passed in via Tethering from
-    // all upstream and downstream sources.
-    private Set<IpPrefix> mExemptPrefixes;
-    // A strictly "smaller" set of prefixes, wherein offload-approved prefixes
-    // (e.g. downstream on-link prefixes) have been removed and replaced with
-    // prefixes representing only the locally-assigned IP addresses.
-    private Set<String> mLastLocalPrefixStrs;
-
-    // Maps upstream interface names to offloaded traffic statistics.
-    // Always contains the latest value received from the hardware for each interface, regardless of
-    // whether offload is currently running on that interface.
-    private ConcurrentHashMap<String, ForwardedStats> mForwardedStats =
-            new ConcurrentHashMap<>(16, 0.75F, 1);
-
-    // Maps upstream interface names to interface quotas.
-    // Always contains the latest value received from the framework for each interface, regardless
-    // of whether offload is currently running (or is even supported) on that interface. Only
-    // includes upstream interfaces that have a quota set.
-    private HashMap<String, Long> mInterfaceQuotas = new HashMap<>();
-
-    private int mNatUpdateCallbacksReceived;
-    private int mNatUpdateNetlinkErrors;
-
-    public OffloadController(Handler h, OffloadHardwareInterface hwi,
-            ContentResolver contentResolver, NetworkStatsManager nsm, SharedLog log) {
-        mHandler = h;
-        mHwInterface = hwi;
-        mContentResolver = contentResolver;
-        mLog = log.forSubComponent(TAG);
-        mDownstreams = new HashMap<>();
-        mExemptPrefixes = new HashSet<>();
-        mLastLocalPrefixStrs = new HashSet<>();
-        OffloadTetheringStatsProvider provider = new OffloadTetheringStatsProvider();
-        try {
-            nsm.registerNetworkStatsProvider(getClass().getSimpleName(), provider);
-        } catch (RuntimeException e) {
-            Log.wtf(TAG, "Cannot register offload stats provider: " + e);
-            provider = null;
-        }
-        mStatsProvider = provider;
-    }
-
-    /** Start hardware offload. */
-    public boolean start() {
-        if (started()) return true;
-
-        if (isOffloadDisabled()) {
-            mLog.i("tethering offload disabled");
-            return false;
-        }
-
-        if (!mConfigInitialized) {
-            mConfigInitialized = mHwInterface.initOffloadConfig();
-            if (!mConfigInitialized) {
-                mLog.i("tethering offload config not supported");
-                stop();
-                return false;
-            }
-        }
-
-        mControlInitialized = mHwInterface.initOffloadControl(
-                // OffloadHardwareInterface guarantees that these callback
-                // methods are called on the handler passed to it, which is the
-                // same as mHandler, as coordinated by the setup in Tethering.
-                new OffloadHardwareInterface.ControlCallback() {
-                    @Override
-                    public void onStarted() {
-                        if (!started()) return;
-                        mLog.log("onStarted");
-                    }
-
-                    @Override
-                    public void onStoppedError() {
-                        if (!started()) return;
-                        mLog.log("onStoppedError");
-                    }
-
-                    @Override
-                    public void onStoppedUnsupported() {
-                        if (!started()) return;
-                        mLog.log("onStoppedUnsupported");
-                        // Poll for statistics and trigger a sweep of tethering
-                        // stats by observers. This might not succeed, but it's
-                        // worth trying anyway. We need to do this because from
-                        // this point on we continue with software forwarding,
-                        // and we need to synchronize stats and limits between
-                        // software and hardware forwarding.
-                        updateStatsForAllUpstreams();
-                        if (mStatsProvider != null) mStatsProvider.pushTetherStats();
-                    }
-
-                    @Override
-                    public void onSupportAvailable() {
-                        if (!started()) return;
-                        mLog.log("onSupportAvailable");
-
-                        // [1] Poll for statistics and trigger a sweep of stats
-                        // by observers. We need to do this to ensure that any
-                        // limits set take into account any software tethering
-                        // traffic that has been happening in the meantime.
-                        updateStatsForAllUpstreams();
-                        if (mStatsProvider != null) mStatsProvider.pushTetherStats();
-                        // [2] (Re)Push all state.
-                        computeAndPushLocalPrefixes(UpdateType.FORCE);
-                        pushAllDownstreamState();
-                        pushUpstreamParameters(null);
-                    }
-
-                    @Override
-                    public void onStoppedLimitReached() {
-                        if (!started()) return;
-                        mLog.log("onStoppedLimitReached");
-
-                        // We cannot reliably determine on which interface the limit was reached,
-                        // because the HAL interface does not specify it. We cannot just use the
-                        // current upstream, because that might have changed since the time that
-                        // the HAL queued the callback.
-                        // TODO: rev the HAL so that it provides an interface name.
-
-                        updateStatsForCurrentUpstream();
-                        if (mStatsProvider != null) {
-                            mStatsProvider.pushTetherStats();
-                            // Push stats to service does not cause the service react to it
-                            // immediately. Inform the service about limit reached.
-                            mStatsProvider.notifyLimitReached();
-                        }
-                    }
-
-                    @Override
-                    public void onNatTimeoutUpdate(int proto,
-                                                   String srcAddr, int srcPort,
-                                                   String dstAddr, int dstPort) {
-                        if (!started()) return;
-                        updateNatTimeout(proto, srcAddr, srcPort, dstAddr, dstPort);
-                    }
-                });
-
-        final boolean isStarted = started();
-        if (!isStarted) {
-            mLog.i("tethering offload control not supported");
-            stop();
-        } else {
-            mLog.log("tethering offload started");
-            mNatUpdateCallbacksReceived = 0;
-            mNatUpdateNetlinkErrors = 0;
-        }
-        return isStarted;
-    }
-
-    /** Stop hardware offload. */
-    public void stop() {
-        // Completely stops tethering offload. After this method is called, it is no longer safe to
-        // call any HAL method, no callbacks from the hardware will be delivered, and any in-flight
-        // callbacks must be ignored. Offload may be started again by calling start().
-        final boolean wasStarted = started();
-        updateStatsForCurrentUpstream();
-        mUpstreamLinkProperties = null;
-        mHwInterface.stopOffloadControl();
-        mControlInitialized = false;
-        mConfigInitialized = false;
-        if (wasStarted) mLog.log("tethering offload stopped");
-    }
-
-    private boolean started() {
-        return mConfigInitialized && mControlInitialized;
-    }
-
-    @VisibleForTesting
-    class OffloadTetheringStatsProvider extends NetworkStatsProvider {
-        // These stats must only ever be touched on the handler thread.
-        @NonNull
-        private NetworkStats mIfaceStats = new NetworkStats(0L, 0);
-        @NonNull
-        private NetworkStats mUidStats = new NetworkStats(0L, 0);
-
-        /**
-         * A helper function that collect tether stats from local hashmap. Note that this does not
-         * invoke binder call.
-         */
-        @VisibleForTesting
-        @NonNull
-        NetworkStats getTetherStats(@NonNull StatsType how) {
-            NetworkStats stats = new NetworkStats(0L, 0);
-            final int uid = (how == StatsType.STATS_PER_UID) ? UID_TETHERING : UID_ALL;
-
-            for (final Map.Entry<String, ForwardedStats> kv : mForwardedStats.entrySet()) {
-                final ForwardedStats value = kv.getValue();
-                final Entry entry = new Entry(kv.getKey(), uid, SET_DEFAULT, TAG_NONE, METERED_NO,
-                        ROAMING_NO, DEFAULT_NETWORK_NO, value.rxBytes, 0L, value.txBytes, 0L, 0L);
-                stats = stats.addEntry(entry);
-            }
-
-            return stats;
-        }
-
-        @Override
-        public void onSetLimit(String iface, long quotaBytes) {
-            // Listen for all iface is necessary since upstream might be changed after limit
-            // is set.
-            mHandler.post(() -> {
-                final Long curIfaceQuota = mInterfaceQuotas.get(iface);
-
-                // If the quota is set to unlimited, the value set to HAL is Long.MAX_VALUE,
-                // which is ~8.4 x 10^6 TiB, no one can actually reach it. Thus, it is not
-                // useful to set it multiple times.
-                // Otherwise, the quota needs to be updated to tell HAL to re-count from now even
-                // if the quota is the same as the existing one.
-                if (null == curIfaceQuota && QUOTA_UNLIMITED == quotaBytes) return;
-
-                if (quotaBytes == QUOTA_UNLIMITED) {
-                    mInterfaceQuotas.remove(iface);
-                } else {
-                    mInterfaceQuotas.put(iface, quotaBytes);
-                }
-                maybeUpdateDataLimit(iface);
-            });
-        }
-
-        /**
-         * Push stats to service, but does not cause a force polling. Note that this can only be
-         * called on the handler thread.
-         */
-        public void pushTetherStats() {
-            // TODO: remove the accumulated stats and report the diff from HAL directly.
-            final NetworkStats ifaceDiff =
-                    getTetherStats(StatsType.STATS_PER_IFACE).subtract(mIfaceStats);
-            final NetworkStats uidDiff =
-                    getTetherStats(StatsType.STATS_PER_UID).subtract(mUidStats);
-            try {
-                notifyStatsUpdated(0 /* token */, ifaceDiff, uidDiff);
-                mIfaceStats = mIfaceStats.add(ifaceDiff);
-                mUidStats = mUidStats.add(uidDiff);
-            } catch (RuntimeException e) {
-                mLog.e("Cannot report network stats: ", e);
-            }
-        }
-
-        @Override
-        public void onRequestStatsUpdate(int token) {
-            // Do not attempt to update stats by querying the offload HAL
-            // synchronously from a different thread than the Handler thread. http://b/64771555.
-            mHandler.post(() -> {
-                updateStatsForCurrentUpstream();
-                pushTetherStats();
-            });
-        }
-
-        @Override
-        public void onSetAlert(long quotaBytes) {
-            // TODO: Ask offload HAL to notify alert without stopping traffic.
-        }
-    }
-
-    private String currentUpstreamInterface() {
-        return (mUpstreamLinkProperties != null)
-                ? mUpstreamLinkProperties.getInterfaceName() : null;
-    }
-
-    private void maybeUpdateStats(String iface) {
-        if (TextUtils.isEmpty(iface)) {
-            return;
-        }
-
-        // Always called on the handler thread.
-        //
-        // Use get()/put() instead of updating ForwardedStats in place because we can be called
-        // concurrently with getTetherStats. In combination with the guarantees provided by
-        // ConcurrentHashMap, this ensures that getTetherStats always gets the most recent copy of
-        // the stats for each interface, and does not observe partial writes where rxBytes is
-        // updated and txBytes is not.
-        ForwardedStats diff = mHwInterface.getForwardedStats(iface);
-        ForwardedStats base = mForwardedStats.get(iface);
-        if (base != null) {
-            diff.add(base);
-        }
-        mForwardedStats.put(iface, diff);
-        // diff is a new object, just created by getForwardedStats(). Therefore, anyone reading from
-        // mForwardedStats (i.e., any caller of getTetherStats) will see the new stats immediately.
-    }
-
-    private boolean maybeUpdateDataLimit(String iface) {
-        // setDataLimit may only be called while offload is occurring on this upstream.
-        if (!started() || !TextUtils.equals(iface, currentUpstreamInterface())) {
-            return true;
-        }
-
-        Long limit = mInterfaceQuotas.get(iface);
-        if (limit == null) {
-            limit = Long.MAX_VALUE;
-        }
-
-        return mHwInterface.setDataLimit(iface, limit);
-    }
-
-    private void updateStatsForCurrentUpstream() {
-        maybeUpdateStats(currentUpstreamInterface());
-    }
-
-    private void updateStatsForAllUpstreams() {
-        // In practice, there should only ever be a single digit number of
-        // upstream interfaces over the lifetime of an active tethering session.
-        // Roughly speaking, imagine a very ambitious one or two of each of the
-        // following interface types: [ "rmnet_data", "wlan", "eth", "rndis" ].
-        for (Map.Entry<String, ForwardedStats> kv : mForwardedStats.entrySet()) {
-            maybeUpdateStats(kv.getKey());
-        }
-    }
-
-    /** Set current tethering upstream LinkProperties. */
-    public void setUpstreamLinkProperties(LinkProperties lp) {
-        if (!started() || Objects.equals(mUpstreamLinkProperties, lp)) return;
-
-        final String prevUpstream = currentUpstreamInterface();
-
-        mUpstreamLinkProperties = (lp != null) ? new LinkProperties(lp) : null;
-        // Make sure we record this interface in the ForwardedStats map.
-        final String iface = currentUpstreamInterface();
-        if (!TextUtils.isEmpty(iface)) mForwardedStats.putIfAbsent(iface, EMPTY_STATS);
-
-        // TODO: examine return code and decide what to do if programming
-        // upstream parameters fails (probably just wait for a subsequent
-        // onOffloadEvent() callback to tell us offload is available again and
-        // then reapply all state).
-        computeAndPushLocalPrefixes(UpdateType.IF_NEEDED);
-        pushUpstreamParameters(prevUpstream);
-    }
-
-    /** Set local prefixes. */
-    public void setLocalPrefixes(Set<IpPrefix> localPrefixes) {
-        mExemptPrefixes = localPrefixes;
-
-        if (!started()) return;
-        computeAndPushLocalPrefixes(UpdateType.IF_NEEDED);
-    }
-
-    /** Update current downstream LinkProperties. */
-    public void notifyDownstreamLinkProperties(LinkProperties lp) {
-        final String ifname = lp.getInterfaceName();
-        final LinkProperties oldLp = mDownstreams.put(ifname, new LinkProperties(lp));
-        if (Objects.equals(oldLp, lp)) return;
-
-        if (!started()) return;
-        pushDownstreamState(oldLp, lp);
-    }
-
-    private void pushDownstreamState(LinkProperties oldLp, LinkProperties newLp) {
-        final String ifname = newLp.getInterfaceName();
-        final List<RouteInfo> oldRoutes =
-                (oldLp != null) ? oldLp.getRoutes() : Collections.EMPTY_LIST;
-        final List<RouteInfo> newRoutes = newLp.getRoutes();
-
-        // For each old route, if not in new routes: remove.
-        for (RouteInfo ri : oldRoutes) {
-            if (shouldIgnoreDownstreamRoute(ri)) continue;
-            if (!newRoutes.contains(ri)) {
-                mHwInterface.removeDownstreamPrefix(ifname, ri.getDestination().toString());
-            }
-        }
-
-        // For each new route, if not in old routes: add.
-        for (RouteInfo ri : newRoutes) {
-            if (shouldIgnoreDownstreamRoute(ri)) continue;
-            if (!oldRoutes.contains(ri)) {
-                mHwInterface.addDownstreamPrefix(ifname, ri.getDestination().toString());
-            }
-        }
-    }
-
-    private void pushAllDownstreamState() {
-        for (LinkProperties lp : mDownstreams.values()) {
-            pushDownstreamState(null, lp);
-        }
-    }
-
-    /** Remove downstream interface from offload hardware. */
-    public void removeDownstreamInterface(String ifname) {
-        final LinkProperties lp = mDownstreams.remove(ifname);
-        if (lp == null) return;
-
-        if (!started()) return;
-
-        for (RouteInfo route : lp.getRoutes()) {
-            if (shouldIgnoreDownstreamRoute(route)) continue;
-            mHwInterface.removeDownstreamPrefix(ifname, route.getDestination().toString());
-        }
-    }
-
-    private boolean isOffloadDisabled() {
-        final int defaultDisposition = mHwInterface.getDefaultTetherOffloadDisabled();
-        return (Settings.Global.getInt(
-                mContentResolver, TETHER_OFFLOAD_DISABLED, defaultDisposition) != 0);
-    }
-
-    private boolean pushUpstreamParameters(String prevUpstream) {
-        final String iface = currentUpstreamInterface();
-
-        if (TextUtils.isEmpty(iface)) {
-            final boolean rval = mHwInterface.setUpstreamParameters("", ANYIP, ANYIP, null);
-            // Update stats after we've told the hardware to stop forwarding so
-            // we don't miss packets.
-            maybeUpdateStats(prevUpstream);
-            return rval;
-        }
-
-        // A stacked interface cannot be an upstream for hardware offload.
-        // Consequently, we examine only the primary interface name, look at
-        // getAddresses() rather than getAllAddresses(), and check getRoutes()
-        // rather than getAllRoutes().
-        final ArrayList<String> v6gateways = new ArrayList<>();
-        String v4addr = null;
-        String v4gateway = null;
-
-        for (InetAddress ip : mUpstreamLinkProperties.getAddresses()) {
-            if (ip instanceof Inet4Address) {
-                v4addr = ip.getHostAddress();
-                break;
-            }
-        }
-
-        // Find the gateway addresses of all default routes of either address family.
-        for (RouteInfo ri : mUpstreamLinkProperties.getRoutes()) {
-            if (!ri.hasGateway()) continue;
-
-            final String gateway = ri.getGateway().getHostAddress();
-            final InetAddress address = ri.getDestination().getAddress();
-            if (ri.isDefaultRoute() && address instanceof Inet4Address) {
-                v4gateway = gateway;
-            } else if (ri.isDefaultRoute() && address instanceof Inet6Address) {
-                v6gateways.add(gateway);
-            }
-        }
-
-        boolean success = mHwInterface.setUpstreamParameters(
-                iface, v4addr, v4gateway, (v6gateways.isEmpty() ? null : v6gateways));
-
-        if (!success) {
-            return success;
-        }
-
-        // Update stats after we've told the hardware to change routing so we don't miss packets.
-        maybeUpdateStats(prevUpstream);
-
-        // Data limits can only be set once offload is running on the upstream.
-        success = maybeUpdateDataLimit(iface);
-        if (!success) {
-            // If we failed to set a data limit, don't use this upstream, because we don't want to
-            // blow through the data limit that we were told to apply.
-            mLog.log("Setting data limit for " + iface + " failed, disabling offload.");
-            stop();
-        }
-
-        return success;
-    }
-
-    private boolean computeAndPushLocalPrefixes(UpdateType how) {
-        final boolean force = (how == UpdateType.FORCE);
-        final Set<String> localPrefixStrs = computeLocalPrefixStrings(
-                mExemptPrefixes, mUpstreamLinkProperties);
-        if (!force && mLastLocalPrefixStrs.equals(localPrefixStrs)) return true;
-
-        mLastLocalPrefixStrs = localPrefixStrs;
-        return mHwInterface.setLocalPrefixes(new ArrayList<>(localPrefixStrs));
-    }
-
-    // TODO: Factor in downstream LinkProperties once that information is available.
-    private static Set<String> computeLocalPrefixStrings(
-            Set<IpPrefix> localPrefixes, LinkProperties upstreamLinkProperties) {
-        // Create an editable copy.
-        final Set<IpPrefix> prefixSet = new HashSet<>(localPrefixes);
-
-        // TODO: If a downstream interface (not currently passed in) is reusing
-        // the /64 of the upstream (64share) then:
-        //
-        //     [a] remove that /64 from the local prefixes
-        //     [b] add in /128s for IP addresses on the downstream interface
-        //     [c] add in /128s for IP addresses on the upstream interface
-        //
-        // Until downstream information is available here, simply add /128s from
-        // the upstream network; they'll just be redundant with their /64.
-        if (upstreamLinkProperties != null) {
-            for (LinkAddress linkAddr : upstreamLinkProperties.getLinkAddresses()) {
-                if (!linkAddr.isGlobalPreferred()) continue;
-                final InetAddress ip = linkAddr.getAddress();
-                if (!(ip instanceof Inet6Address)) continue;
-                prefixSet.add(new IpPrefix(ip, 128));
-            }
-        }
-
-        final HashSet<String> localPrefixStrs = new HashSet<>();
-        for (IpPrefix pfx : prefixSet) localPrefixStrs.add(pfx.toString());
-        return localPrefixStrs;
-    }
-
-    private static boolean shouldIgnoreDownstreamRoute(RouteInfo route) {
-        // Ignore any link-local routes.
-        final IpPrefix destination = route.getDestination();
-        final LinkAddress linkAddr = new LinkAddress(destination.getAddress(),
-                destination.getPrefixLength());
-        if (!linkAddr.isGlobalPreferred()) return true;
-
-        return false;
-    }
-
-    /** Dump information. */
-    public void dump(IndentingPrintWriter pw) {
-        if (isOffloadDisabled()) {
-            pw.println("Offload disabled");
-            return;
-        }
-        final boolean isStarted = started();
-        pw.println("Offload HALs " + (isStarted ? "started" : "not started"));
-        LinkProperties lp = mUpstreamLinkProperties;
-        String upstream = (lp != null) ? lp.getInterfaceName() : null;
-        pw.println("Current upstream: " + upstream);
-        pw.println("Exempt prefixes: " + mLastLocalPrefixStrs);
-        pw.println("NAT timeout update callbacks received during the "
-                + (isStarted ? "current" : "last")
-                + " offload session: "
-                + mNatUpdateCallbacksReceived);
-        pw.println("NAT timeout update netlink errors during the "
-                + (isStarted ? "current" : "last")
-                + " offload session: "
-                + mNatUpdateNetlinkErrors);
-    }
-
-    private void updateNatTimeout(
-            int proto, String srcAddr, int srcPort, String dstAddr, int dstPort) {
-        final String protoName = protoNameFor(proto);
-        if (protoName == null) {
-            mLog.e("Unknown NAT update callback protocol: " + proto);
-            return;
-        }
-
-        final Inet4Address src = parseIPv4Address(srcAddr);
-        if (src == null) {
-            mLog.e("Failed to parse IPv4 address: " + srcAddr);
-            return;
-        }
-
-        if (!isValidUdpOrTcpPort(srcPort)) {
-            mLog.e("Invalid src port: " + srcPort);
-            return;
-        }
-
-        final Inet4Address dst = parseIPv4Address(dstAddr);
-        if (dst == null) {
-            mLog.e("Failed to parse IPv4 address: " + dstAddr);
-            return;
-        }
-
-        if (!isValidUdpOrTcpPort(dstPort)) {
-            mLog.e("Invalid dst port: " + dstPort);
-            return;
-        }
-
-        mNatUpdateCallbacksReceived++;
-        final String natDescription = String.format("%s (%s, %s) -> (%s, %s)",
-                protoName, srcAddr, srcPort, dstAddr, dstPort);
-        if (DBG) {
-            mLog.log("NAT timeout update: " + natDescription);
-        }
-
-        final int timeoutSec = connectionTimeoutUpdateSecondsFor(proto);
-        final byte[] msg = ConntrackMessage.newIPv4TimeoutUpdateRequest(
-                proto, src, srcPort, dst, dstPort, timeoutSec);
-
-        try {
-            NetlinkSocket.sendOneShotKernelMessage(OsConstants.NETLINK_NETFILTER, msg);
-        } catch (ErrnoException e) {
-            mNatUpdateNetlinkErrors++;
-            mLog.e("Error updating NAT conntrack entry >" + natDescription + "<: " + e
-                    + ", msg: " + NetlinkConstants.hexify(msg));
-            mLog.log("NAT timeout update callbacks received: " + mNatUpdateCallbacksReceived);
-            mLog.log("NAT timeout update netlink errors: " + mNatUpdateNetlinkErrors);
-        }
-    }
-
-    private static Inet4Address parseIPv4Address(String addrString) {
-        try {
-            final InetAddress ip = InetAddresses.parseNumericAddress(addrString);
-            // TODO: Consider other sanitization steps here, including perhaps:
-            //           not eql to 0.0.0.0
-            //           not within 169.254.0.0/16
-            //           not within ::ffff:0.0.0.0/96
-            //           not within ::/96
-            // et cetera.
-            if (ip instanceof Inet4Address) {
-                return (Inet4Address) ip;
-            }
-        } catch (IllegalArgumentException iae) { }
-        return null;
-    }
-
-    private static String protoNameFor(int proto) {
-        // OsConstants values are not constant expressions; no switch statement.
-        if (proto == OsConstants.IPPROTO_UDP) {
-            return "UDP";
-        } else if (proto == OsConstants.IPPROTO_TCP) {
-            return "TCP";
-        }
-        return null;
-    }
-
-    private static int connectionTimeoutUpdateSecondsFor(int proto) {
-        // TODO: Replace this with more thoughtful work, perhaps reading from
-        // and maybe writing to any required
-        //
-        //     /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_*
-        //     /proc/sys/net/netfilter/nf_conntrack_udp_timeout{,_stream}
-        //
-        // entries.  TBD.
-        if (proto == OsConstants.IPPROTO_TCP) {
-            // Cf. /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_established
-            return 432000;
-        } else {
-            // Cf. /proc/sys/net/netfilter/nf_conntrack_udp_timeout_stream
-            return 180;
-        }
-    }
-
-    private static boolean isValidUdpOrTcpPort(int port) {
-        return port > 0 && port < 65536;
-    }
-}
diff --git a/packages/Tethering/src/com/android/server/connectivity/tethering/OffloadHardwareInterface.java b/packages/Tethering/src/com/android/server/connectivity/tethering/OffloadHardwareInterface.java
deleted file mode 100644
index b545717..0000000
--- a/packages/Tethering/src/com/android/server/connectivity/tethering/OffloadHardwareInterface.java
+++ /dev/null
@@ -1,509 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.connectivity.tethering;
-
-import static android.net.util.TetheringUtils.uint16;
-
-import android.hardware.tetheroffload.config.V1_0.IOffloadConfig;
-import android.hardware.tetheroffload.control.V1_0.IOffloadControl;
-import android.hardware.tetheroffload.control.V1_0.ITetheringOffloadCallback;
-import android.hardware.tetheroffload.control.V1_0.NatTimeoutUpdate;
-import android.hardware.tetheroffload.control.V1_0.NetworkProtocol;
-import android.hardware.tetheroffload.control.V1_0.OffloadCallbackEvent;
-import android.net.netlink.NetlinkSocket;
-import android.net.util.SharedLog;
-import android.net.util.SocketUtils;
-import android.os.Handler;
-import android.os.NativeHandle;
-import android.os.RemoteException;
-import android.system.ErrnoException;
-import android.system.Os;
-import android.system.OsConstants;
-
-import com.android.internal.annotations.VisibleForTesting;
-
-import java.io.FileDescriptor;
-import java.io.IOException;
-import java.net.SocketAddress;
-import java.net.SocketException;
-import java.util.ArrayList;
-
-
-/**
- * Capture tethering dependencies, for injection.
- *
- * @hide
- */
-public class OffloadHardwareInterface {
-    private static final String TAG = OffloadHardwareInterface.class.getSimpleName();
-    private static final String YIELDS = " -> ";
-    // Change this value to control whether tether offload is enabled or
-    // disabled by default in the absence of an explicit Settings value.
-    // See accompanying unittest to distinguish 0 from non-0 values.
-    private static final int DEFAULT_TETHER_OFFLOAD_DISABLED = 0;
-    private static final String NO_INTERFACE_NAME = "";
-    private static final String NO_IPV4_ADDRESS = "";
-    private static final String NO_IPV4_GATEWAY = "";
-    // Reference kernel/uapi/linux/netfilter/nfnetlink_compat.h
-    private static final int NF_NETLINK_CONNTRACK_NEW = 1;
-    private static final int NF_NETLINK_CONNTRACK_UPDATE = 2;
-    private static final int NF_NETLINK_CONNTRACK_DESTROY = 4;
-
-    private final Handler mHandler;
-    private final SharedLog mLog;
-    private IOffloadControl mOffloadControl;
-    private TetheringOffloadCallback mTetheringOffloadCallback;
-    private ControlCallback mControlCallback;
-
-    /** The callback to notify status of offload management process. */
-    public static class ControlCallback {
-        /** Offload started. */
-        public void onStarted() {}
-        /**
-         * Offload stopped because an error has occurred in lower layer.
-         */
-        public void onStoppedError() {}
-        /**
-         * Offload stopped because the device has moved to a bearer on which hardware offload is
-         * not supported. Subsequent calls to setUpstreamParameters and add/removeDownstream will
-         * likely fail and cannot be presumed to be saved inside of the hardware management process.
-         * Upon receiving #onSupportAvailable(), the caller should reprogram the hardware to begin
-         * offload again.
-         */
-        public void onStoppedUnsupported() {}
-        /** Indicate that offload is able to proivde support for this time. */
-        public void onSupportAvailable() {}
-        /** Offload stopped because of usage limit reached. */
-        public void onStoppedLimitReached() {}
-
-        /** Indicate to update NAT timeout. */
-        public void onNatTimeoutUpdate(int proto,
-                                       String srcAddr, int srcPort,
-                                       String dstAddr, int dstPort) {}
-    }
-
-    /** The object which records Tx/Rx forwarded bytes. */
-    public static class ForwardedStats {
-        public long rxBytes;
-        public long txBytes;
-
-        public ForwardedStats() {
-            rxBytes = 0;
-            txBytes = 0;
-        }
-
-        @VisibleForTesting
-        public ForwardedStats(long rxBytes, long txBytes) {
-            this.rxBytes = rxBytes;
-            this.txBytes = txBytes;
-        }
-
-        /** Add Tx/Rx bytes. */
-        public void add(ForwardedStats other) {
-            rxBytes += other.rxBytes;
-            txBytes += other.txBytes;
-        }
-
-        /** Returns the string representation of this object. */
-        public String toString() {
-            return String.format("rx:%s tx:%s", rxBytes, txBytes);
-        }
-    }
-
-    public OffloadHardwareInterface(Handler h, SharedLog log) {
-        mHandler = h;
-        mLog = log.forSubComponent(TAG);
-    }
-
-    /** Get default value indicating whether offload is supported. */
-    public int getDefaultTetherOffloadDisabled() {
-        return DEFAULT_TETHER_OFFLOAD_DISABLED;
-    }
-
-    /**
-     * Offload management process need to know conntrack rules to support NAT, but it may not have
-     * permission to create netlink netfilter sockets. Create two netlink netfilter sockets and
-     * share them with offload management process.
-     */
-    public boolean initOffloadConfig() {
-        IOffloadConfig offloadConfig;
-        try {
-            offloadConfig = IOffloadConfig.getService();
-        } catch (RemoteException e) {
-            mLog.e("getIOffloadConfig error " + e);
-            return false;
-        }
-        if (offloadConfig == null) {
-            mLog.e("Could not find IOffloadConfig service");
-            return false;
-        }
-        // Per the IConfigOffload definition:
-        //
-        // h1    provides a file descriptor bound to the following netlink groups
-        //       (NF_NETLINK_CONNTRACK_NEW | NF_NETLINK_CONNTRACK_DESTROY).
-        //
-        // h2    provides a file descriptor bound to the following netlink groups
-        //       (NF_NETLINK_CONNTRACK_UPDATE | NF_NETLINK_CONNTRACK_DESTROY).
-        final NativeHandle h1 = createConntrackSocket(
-                NF_NETLINK_CONNTRACK_NEW | NF_NETLINK_CONNTRACK_DESTROY);
-        if (h1 == null) return false;
-
-        final NativeHandle h2 = createConntrackSocket(
-                NF_NETLINK_CONNTRACK_UPDATE | NF_NETLINK_CONNTRACK_DESTROY);
-        if (h2 == null) {
-            closeFdInNativeHandle(h1);
-            return false;
-        }
-
-        final CbResults results = new CbResults();
-        try {
-            offloadConfig.setHandles(h1, h2,
-                    (boolean success, String errMsg) -> {
-                        results.mSuccess = success;
-                        results.mErrMsg = errMsg;
-                    });
-        } catch (RemoteException e) {
-            record("initOffloadConfig, setHandles fail", e);
-            return false;
-        }
-        // Explicitly close FDs.
-        closeFdInNativeHandle(h1);
-        closeFdInNativeHandle(h2);
-
-        record("initOffloadConfig, setHandles results:", results);
-        return results.mSuccess;
-    }
-
-    private void closeFdInNativeHandle(final NativeHandle h) {
-        try {
-            h.close();
-        } catch (IOException | IllegalStateException e) {
-            // IllegalStateException means fd is already closed, do nothing here.
-            // Also nothing we can do if IOException.
-        }
-    }
-
-    private NativeHandle createConntrackSocket(final int groups) {
-        FileDescriptor fd;
-        try {
-            fd = NetlinkSocket.forProto(OsConstants.NETLINK_NETFILTER);
-        } catch (ErrnoException e) {
-            mLog.e("Unable to create conntrack socket " + e);
-            return null;
-        }
-
-        final SocketAddress sockAddr = SocketUtils.makeNetlinkSocketAddress(0, groups);
-        try {
-            Os.bind(fd, sockAddr);
-        } catch (ErrnoException | SocketException e) {
-            mLog.e("Unable to bind conntrack socket for groups " + groups + " error: " + e);
-            try {
-                SocketUtils.closeSocket(fd);
-            } catch (IOException ie) {
-                // Nothing we can do here
-            }
-            return null;
-        }
-        try {
-            Os.connect(fd, sockAddr);
-        } catch (ErrnoException | SocketException e) {
-            mLog.e("connect to kernel fail for groups " + groups + " error: " + e);
-            try {
-                SocketUtils.closeSocket(fd);
-            } catch (IOException ie) {
-                // Nothing we can do here
-            }
-            return null;
-        }
-
-        return new NativeHandle(fd, true);
-    }
-
-    /** Initialize the tethering offload HAL. */
-    public boolean initOffloadControl(ControlCallback controlCb) {
-        mControlCallback = controlCb;
-
-        if (mOffloadControl == null) {
-            try {
-                mOffloadControl = IOffloadControl.getService();
-            } catch (RemoteException e) {
-                mLog.e("tethering offload control not supported: " + e);
-                return false;
-            }
-            if (mOffloadControl == null) {
-                mLog.e("tethering IOffloadControl.getService() returned null");
-                return false;
-            }
-        }
-
-        final String logmsg = String.format("initOffloadControl(%s)",
-                (controlCb == null) ? "null"
-                        : "0x" + Integer.toHexString(System.identityHashCode(controlCb)));
-
-        mTetheringOffloadCallback = new TetheringOffloadCallback(mHandler, mControlCallback, mLog);
-        final CbResults results = new CbResults();
-        try {
-            mOffloadControl.initOffload(
-                    mTetheringOffloadCallback,
-                    (boolean success, String errMsg) -> {
-                        results.mSuccess = success;
-                        results.mErrMsg = errMsg;
-                    });
-        } catch (RemoteException e) {
-            record(logmsg, e);
-            return false;
-        }
-
-        record(logmsg, results);
-        return results.mSuccess;
-    }
-
-    /** Stop IOffloadControl. */
-    public void stopOffloadControl() {
-        if (mOffloadControl != null) {
-            try {
-                mOffloadControl.stopOffload(
-                        (boolean success, String errMsg) -> {
-                            if (!success) mLog.e("stopOffload failed: " + errMsg);
-                        });
-            } catch (RemoteException e) {
-                mLog.e("failed to stopOffload: " + e);
-            }
-        }
-        mOffloadControl = null;
-        mTetheringOffloadCallback = null;
-        mControlCallback = null;
-        mLog.log("stopOffloadControl()");
-    }
-
-    /** Get Tx/Rx usage from last query. */
-    public ForwardedStats getForwardedStats(String upstream) {
-        final String logmsg = String.format("getForwardedStats(%s)",  upstream);
-
-        final ForwardedStats stats = new ForwardedStats();
-        try {
-            mOffloadControl.getForwardedStats(
-                    upstream,
-                    (long rxBytes, long txBytes) -> {
-                        stats.rxBytes = (rxBytes > 0) ? rxBytes : 0;
-                        stats.txBytes = (txBytes > 0) ? txBytes : 0;
-                    });
-        } catch (RemoteException e) {
-            record(logmsg, e);
-            return stats;
-        }
-
-        mLog.log(logmsg + YIELDS + stats);
-        return stats;
-    }
-
-    /** Set local prefixes to offload management process. */
-    public boolean setLocalPrefixes(ArrayList<String> localPrefixes) {
-        final String logmsg = String.format("setLocalPrefixes([%s])",
-                String.join(",", localPrefixes));
-
-        final CbResults results = new CbResults();
-        try {
-            mOffloadControl.setLocalPrefixes(localPrefixes,
-                    (boolean success, String errMsg) -> {
-                        results.mSuccess = success;
-                        results.mErrMsg = errMsg;
-                    });
-        } catch (RemoteException e) {
-            record(logmsg, e);
-            return false;
-        }
-
-        record(logmsg, results);
-        return results.mSuccess;
-    }
-
-    /** Set data limit value to offload management process. */
-    public boolean setDataLimit(String iface, long limit) {
-
-        final String logmsg = String.format("setDataLimit(%s, %d)", iface, limit);
-
-        final CbResults results = new CbResults();
-        try {
-            mOffloadControl.setDataLimit(
-                    iface, limit,
-                    (boolean success, String errMsg) -> {
-                        results.mSuccess = success;
-                        results.mErrMsg = errMsg;
-                    });
-        } catch (RemoteException e) {
-            record(logmsg, e);
-            return false;
-        }
-
-        record(logmsg, results);
-        return results.mSuccess;
-    }
-
-    /** Set upstream parameters to offload management process. */
-    public boolean setUpstreamParameters(
-            String iface, String v4addr, String v4gateway, ArrayList<String> v6gws) {
-        iface = (iface != null) ? iface : NO_INTERFACE_NAME;
-        v4addr = (v4addr != null) ? v4addr : NO_IPV4_ADDRESS;
-        v4gateway = (v4gateway != null) ? v4gateway : NO_IPV4_GATEWAY;
-        v6gws = (v6gws != null) ? v6gws : new ArrayList<>();
-
-        final String logmsg = String.format("setUpstreamParameters(%s, %s, %s, [%s])",
-                iface, v4addr, v4gateway, String.join(",", v6gws));
-
-        final CbResults results = new CbResults();
-        try {
-            mOffloadControl.setUpstreamParameters(
-                    iface, v4addr, v4gateway, v6gws,
-                    (boolean success, String errMsg) -> {
-                        results.mSuccess = success;
-                        results.mErrMsg = errMsg;
-                    });
-        } catch (RemoteException e) {
-            record(logmsg, e);
-            return false;
-        }
-
-        record(logmsg, results);
-        return results.mSuccess;
-    }
-
-    /** Add downstream prefix to offload management process. */
-    public boolean addDownstreamPrefix(String ifname, String prefix) {
-        final String logmsg = String.format("addDownstreamPrefix(%s, %s)", ifname, prefix);
-
-        final CbResults results = new CbResults();
-        try {
-            mOffloadControl.addDownstream(ifname, prefix,
-                    (boolean success, String errMsg) -> {
-                        results.mSuccess = success;
-                        results.mErrMsg = errMsg;
-                    });
-        } catch (RemoteException e) {
-            record(logmsg, e);
-            return false;
-        }
-
-        record(logmsg, results);
-        return results.mSuccess;
-    }
-
-    /** Remove downstream prefix from offload management process. */
-    public boolean removeDownstreamPrefix(String ifname, String prefix) {
-        final String logmsg = String.format("removeDownstreamPrefix(%s, %s)", ifname, prefix);
-
-        final CbResults results = new CbResults();
-        try {
-            mOffloadControl.removeDownstream(ifname, prefix,
-                    (boolean success, String errMsg) -> {
-                        results.mSuccess = success;
-                        results.mErrMsg = errMsg;
-                    });
-        } catch (RemoteException e) {
-            record(logmsg, e);
-            return false;
-        }
-
-        record(logmsg, results);
-        return results.mSuccess;
-    }
-
-    private void record(String msg, Throwable t) {
-        mLog.e(msg + YIELDS + "exception: " + t);
-    }
-
-    private void record(String msg, CbResults results) {
-        final String logmsg = msg + YIELDS + results;
-        if (!results.mSuccess) {
-            mLog.e(logmsg);
-        } else {
-            mLog.log(logmsg);
-        }
-    }
-
-    private static class TetheringOffloadCallback extends ITetheringOffloadCallback.Stub {
-        public final Handler handler;
-        public final ControlCallback controlCb;
-        public final SharedLog log;
-
-        TetheringOffloadCallback(Handler h, ControlCallback cb, SharedLog sharedLog) {
-            handler = h;
-            controlCb = cb;
-            log = sharedLog;
-        }
-
-        @Override
-        public void onEvent(int event) {
-            handler.post(() -> {
-                switch (event) {
-                    case OffloadCallbackEvent.OFFLOAD_STARTED:
-                        controlCb.onStarted();
-                        break;
-                    case OffloadCallbackEvent.OFFLOAD_STOPPED_ERROR:
-                        controlCb.onStoppedError();
-                        break;
-                    case OffloadCallbackEvent.OFFLOAD_STOPPED_UNSUPPORTED:
-                        controlCb.onStoppedUnsupported();
-                        break;
-                    case OffloadCallbackEvent.OFFLOAD_SUPPORT_AVAILABLE:
-                        controlCb.onSupportAvailable();
-                        break;
-                    case OffloadCallbackEvent.OFFLOAD_STOPPED_LIMIT_REACHED:
-                        controlCb.onStoppedLimitReached();
-                        break;
-                    default:
-                        log.e("Unsupported OffloadCallbackEvent: " + event);
-                }
-            });
-        }
-
-        @Override
-        public void updateTimeout(NatTimeoutUpdate params) {
-            handler.post(() -> {
-                controlCb.onNatTimeoutUpdate(
-                        networkProtocolToOsConstant(params.proto),
-                        params.src.addr, uint16(params.src.port),
-                        params.dst.addr, uint16(params.dst.port));
-            });
-        }
-    }
-
-    private static int networkProtocolToOsConstant(int proto) {
-        switch (proto) {
-            case NetworkProtocol.TCP: return OsConstants.IPPROTO_TCP;
-            case NetworkProtocol.UDP: return OsConstants.IPPROTO_UDP;
-            default:
-                // The caller checks this value and will log an error. Just make
-                // sure it won't collide with valid OsContants.IPPROTO_* values.
-                return -Math.abs(proto);
-        }
-    }
-
-    private static class CbResults {
-        boolean mSuccess;
-        String mErrMsg;
-
-        @Override
-        public String toString() {
-            if (mSuccess) {
-                return "ok";
-            } else {
-                return "fail: " + mErrMsg;
-            }
-        }
-    }
-}
diff --git a/packages/Tethering/src/com/android/server/connectivity/tethering/Tethering.java b/packages/Tethering/src/com/android/server/connectivity/tethering/Tethering.java
deleted file mode 100644
index 4b2c921..0000000
--- a/packages/Tethering/src/com/android/server/connectivity/tethering/Tethering.java
+++ /dev/null
@@ -1,2284 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.connectivity.tethering;
-
-import static android.Manifest.permission.NETWORK_SETTINGS;
-import static android.Manifest.permission.NETWORK_STACK;
-import static android.content.pm.PackageManager.PERMISSION_GRANTED;
-import static android.hardware.usb.UsbManager.USB_CONFIGURED;
-import static android.hardware.usb.UsbManager.USB_CONNECTED;
-import static android.hardware.usb.UsbManager.USB_FUNCTION_NCM;
-import static android.hardware.usb.UsbManager.USB_FUNCTION_RNDIS;
-import static android.net.ConnectivityManager.ACTION_RESTRICT_BACKGROUND_CHANGED;
-import static android.net.ConnectivityManager.CONNECTIVITY_ACTION;
-import static android.net.ConnectivityManager.EXTRA_NETWORK_INFO;
-import static android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK;
-import static android.net.TetheringManager.ACTION_TETHER_STATE_CHANGED;
-import static android.net.TetheringManager.EXTRA_ACTIVE_LOCAL_ONLY;
-import static android.net.TetheringManager.EXTRA_ACTIVE_TETHER;
-import static android.net.TetheringManager.EXTRA_AVAILABLE_TETHER;
-import static android.net.TetheringManager.EXTRA_ERRORED_TETHER;
-import static android.net.TetheringManager.TETHERING_BLUETOOTH;
-import static android.net.TetheringManager.TETHERING_ETHERNET;
-import static android.net.TetheringManager.TETHERING_INVALID;
-import static android.net.TetheringManager.TETHERING_NCM;
-import static android.net.TetheringManager.TETHERING_USB;
-import static android.net.TetheringManager.TETHERING_WIFI;
-import static android.net.TetheringManager.TETHERING_WIFI_P2P;
-import static android.net.TetheringManager.TETHER_ERROR_INTERNAL_ERROR;
-import static android.net.TetheringManager.TETHER_ERROR_NO_ERROR;
-import static android.net.TetheringManager.TETHER_ERROR_SERVICE_UNAVAIL;
-import static android.net.TetheringManager.TETHER_ERROR_UNAVAIL_IFACE;
-import static android.net.TetheringManager.TETHER_ERROR_UNKNOWN_IFACE;
-import static android.net.TetheringManager.TETHER_ERROR_UNKNOWN_TYPE;
-import static android.net.TetheringManager.TETHER_HARDWARE_OFFLOAD_FAILED;
-import static android.net.TetheringManager.TETHER_HARDWARE_OFFLOAD_STARTED;
-import static android.net.TetheringManager.TETHER_HARDWARE_OFFLOAD_STOPPED;
-import static android.net.util.TetheringMessageBase.BASE_MASTER;
-import static android.net.wifi.WifiManager.EXTRA_WIFI_AP_INTERFACE_NAME;
-import static android.net.wifi.WifiManager.EXTRA_WIFI_AP_MODE;
-import static android.net.wifi.WifiManager.EXTRA_WIFI_AP_STATE;
-import static android.net.wifi.WifiManager.IFACE_IP_MODE_CONFIGURATION_ERROR;
-import static android.net.wifi.WifiManager.IFACE_IP_MODE_LOCAL_ONLY;
-import static android.net.wifi.WifiManager.IFACE_IP_MODE_TETHERED;
-import static android.net.wifi.WifiManager.IFACE_IP_MODE_UNSPECIFIED;
-import static android.net.wifi.WifiManager.WIFI_AP_STATE_DISABLED;
-import static android.telephony.CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED;
-import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
-
-import static com.android.server.connectivity.tethering.TetheringNotificationUpdater.DOWNSTREAM_NONE;
-
-import android.app.usage.NetworkStatsManager;
-import android.bluetooth.BluetoothAdapter;
-import android.bluetooth.BluetoothPan;
-import android.bluetooth.BluetoothProfile;
-import android.bluetooth.BluetoothProfile.ServiceListener;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.hardware.usb.UsbManager;
-import android.net.ConnectivityManager;
-import android.net.EthernetManager;
-import android.net.IIntResultListener;
-import android.net.INetd;
-import android.net.ITetheringEventCallback;
-import android.net.IpPrefix;
-import android.net.LinkAddress;
-import android.net.LinkProperties;
-import android.net.Network;
-import android.net.NetworkInfo;
-import android.net.TetherStatesParcel;
-import android.net.TetheredClient;
-import android.net.TetheringCallbackStartedParcel;
-import android.net.TetheringConfigurationParcel;
-import android.net.TetheringRequestParcel;
-import android.net.ip.IpServer;
-import android.net.shared.NetdUtils;
-import android.net.util.BaseNetdUnsolicitedEventListener;
-import android.net.util.InterfaceSet;
-import android.net.util.PrefixUtils;
-import android.net.util.SharedLog;
-import android.net.util.TetheringUtils;
-import android.net.util.VersionedBroadcastListener;
-import android.net.wifi.WifiClient;
-import android.net.wifi.WifiManager;
-import android.net.wifi.p2p.WifiP2pGroup;
-import android.net.wifi.p2p.WifiP2pInfo;
-import android.net.wifi.p2p.WifiP2pManager;
-import android.os.Binder;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.Message;
-import android.os.RemoteCallbackList;
-import android.os.RemoteException;
-import android.os.ResultReceiver;
-import android.os.ServiceSpecificException;
-import android.os.UserHandle;
-import android.os.UserManager;
-import android.telephony.PhoneStateListener;
-import android.telephony.TelephonyManager;
-import android.text.TextUtils;
-import android.util.ArrayMap;
-import android.util.Log;
-import android.util.SparseArray;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-import com.android.internal.annotations.GuardedBy;
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.util.IndentingPrintWriter;
-import com.android.internal.util.MessageUtils;
-import com.android.internal.util.State;
-import com.android.internal.util.StateMachine;
-
-import java.io.FileDescriptor;
-import java.io.PrintWriter;
-import java.net.InetAddress;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.concurrent.Executor;
-import java.util.concurrent.RejectedExecutionException;
-
-/**
- *
- * This class holds much of the business logic to allow Android devices
- * to act as IP gateways via USB, BT, and WiFi interfaces.
- */
-public class Tethering {
-
-    private static final String TAG = Tethering.class.getSimpleName();
-    private static final boolean DBG = false;
-    private static final boolean VDBG = false;
-
-    private static final Class[] sMessageClasses = {
-            Tethering.class, TetherMasterSM.class, IpServer.class
-    };
-    private static final SparseArray<String> sMagicDecoderRing =
-            MessageUtils.findMessageNames(sMessageClasses);
-    // Keep in sync with NETID_UNSET in system/netd/include/netid_client.h
-    private static final int NETID_UNSET = 0;
-
-    private static class TetherState {
-        public final IpServer ipServer;
-        public int lastState;
-        public int lastError;
-
-        TetherState(IpServer ipServer) {
-            this.ipServer = ipServer;
-            // Assume all state machines start out available and with no errors.
-            lastState = IpServer.STATE_AVAILABLE;
-            lastError = TETHER_ERROR_NO_ERROR;
-        }
-
-        public boolean isCurrentlyServing() {
-            switch (lastState) {
-                case IpServer.STATE_TETHERED:
-                case IpServer.STATE_LOCAL_ONLY:
-                    return true;
-                default:
-                    return false;
-            }
-        }
-    }
-
-    /**
-     * Cookie added when registering {@link android.net.TetheringManager.TetheringEventCallback}.
-     */
-    private static class CallbackCookie {
-        public final boolean hasListClientsPermission;
-
-        private CallbackCookie(boolean hasListClientsPermission) {
-            this.hasListClientsPermission = hasListClientsPermission;
-        }
-    }
-
-    private final SharedLog mLog = new SharedLog(TAG);
-    private final RemoteCallbackList<ITetheringEventCallback> mTetheringEventCallbacks =
-            new RemoteCallbackList<>();
-    // Currently active tethering requests per tethering type. Only one of each type can be
-    // requested at a time. After a tethering type is requested, the map keeps tethering parameters
-    // to be used after the interface comes up asynchronously.
-    private final SparseArray<TetheringRequestParcel> mActiveTetheringRequests =
-            new SparseArray<>();
-
-    // used to synchronize public access to members
-    private final Object mPublicSync;
-    private final Context mContext;
-    private final ArrayMap<String, TetherState> mTetherStates;
-    private final BroadcastReceiver mStateReceiver;
-    private final Looper mLooper;
-    private final StateMachine mTetherMasterSM;
-    private final OffloadController mOffloadController;
-    private final UpstreamNetworkMonitor mUpstreamNetworkMonitor;
-    // TODO: Figure out how to merge this and other downstream-tracking objects
-    // into a single coherent structure.
-    // Use LinkedHashSet for predictable ordering order for ConnectedClientsTracker.
-    private final LinkedHashSet<IpServer> mForwardedDownstreams;
-    private final VersionedBroadcastListener mCarrierConfigChange;
-    private final TetheringDependencies mDeps;
-    private final EntitlementManager mEntitlementMgr;
-    private final Handler mHandler;
-    private final INetd mNetd;
-    private final NetdCallback mNetdCallback;
-    private final UserRestrictionActionListener mTetheringRestriction;
-    private final ActiveDataSubIdListener mActiveDataSubIdListener;
-    private final ConnectedClientsTracker mConnectedClientsTracker;
-    private final TetheringThreadExecutor mExecutor;
-    private final TetheringNotificationUpdater mNotificationUpdater;
-    private int mActiveDataSubId = INVALID_SUBSCRIPTION_ID;
-    // All the usage of mTetheringEventCallback should run in the same thread.
-    private ITetheringEventCallback mTetheringEventCallback = null;
-
-    private volatile TetheringConfiguration mConfig;
-    private InterfaceSet mCurrentUpstreamIfaceSet;
-
-    private boolean mRndisEnabled;       // track the RNDIS function enabled state
-    // True iff. WiFi tethering should be started when soft AP is ready.
-    private boolean mWifiTetherRequested;
-    private Network mTetherUpstream;
-    private TetherStatesParcel mTetherStatesParcel;
-    private boolean mDataSaverEnabled = false;
-    private String mWifiP2pTetherInterface = null;
-    private int mOffloadStatus = TETHER_HARDWARE_OFFLOAD_STOPPED;
-
-    @GuardedBy("mPublicSync")
-    private EthernetManager.TetheredInterfaceRequest mEthernetIfaceRequest;
-    @GuardedBy("mPublicSync")
-    private String mConfiguredEthernetIface;
-    @GuardedBy("mPublicSync")
-    private EthernetCallback mEthernetCallback;
-
-    public Tethering(TetheringDependencies deps) {
-        mLog.mark("Tethering.constructed");
-        mDeps = deps;
-        mContext = mDeps.getContext();
-        mNetd = mDeps.getINetd(mContext);
-        mLooper = mDeps.getTetheringLooper();
-        mNotificationUpdater = mDeps.getNotificationUpdater(mContext);
-
-        mPublicSync = new Object();
-
-        mTetherStates = new ArrayMap<>();
-        mConnectedClientsTracker = new ConnectedClientsTracker();
-
-        mTetherMasterSM = new TetherMasterSM("TetherMaster", mLooper, deps);
-        mTetherMasterSM.start();
-
-        final NetworkStatsManager statsManager =
-                (NetworkStatsManager) mContext.getSystemService(Context.NETWORK_STATS_SERVICE);
-        mHandler = mTetherMasterSM.getHandler();
-        mOffloadController = new OffloadController(mHandler,
-                mDeps.getOffloadHardwareInterface(mHandler, mLog), mContext.getContentResolver(),
-                statsManager, mLog);
-        mUpstreamNetworkMonitor = mDeps.getUpstreamNetworkMonitor(mContext, mTetherMasterSM, mLog,
-                TetherMasterSM.EVENT_UPSTREAM_CALLBACK);
-        mForwardedDownstreams = new LinkedHashSet<>();
-
-        IntentFilter filter = new IntentFilter();
-        filter.addAction(ACTION_CARRIER_CONFIG_CHANGED);
-        // EntitlementManager will send EVENT_UPSTREAM_PERMISSION_CHANGED when cellular upstream
-        // permission is changed according to entitlement check result.
-        mEntitlementMgr = mDeps.getEntitlementManager(mContext, mTetherMasterSM, mLog,
-                TetherMasterSM.EVENT_UPSTREAM_PERMISSION_CHANGED);
-        mEntitlementMgr.setOnUiEntitlementFailedListener((int downstream) -> {
-            mLog.log("OBSERVED UiEnitlementFailed");
-            stopTethering(downstream);
-        });
-        mEntitlementMgr.setTetheringConfigurationFetcher(() -> {
-            return mConfig;
-        });
-
-        mCarrierConfigChange = new VersionedBroadcastListener(
-                "CarrierConfigChangeListener", mContext, mHandler, filter,
-                (Intent ignored) -> {
-                    mLog.log("OBSERVED carrier config change");
-                    updateConfiguration();
-                    mEntitlementMgr.reevaluateSimCardProvisioning(mConfig);
-                });
-
-        mStateReceiver = new StateReceiver();
-
-        final UserManager userManager = (UserManager) mContext.getSystemService(
-                Context.USER_SERVICE);
-        mTetheringRestriction = new UserRestrictionActionListener(
-                userManager, this, mNotificationUpdater);
-        mExecutor = new TetheringThreadExecutor(mHandler);
-        mActiveDataSubIdListener = new ActiveDataSubIdListener(mExecutor);
-        mNetdCallback = new NetdCallback();
-
-        // Load tethering configuration.
-        updateConfiguration();
-    }
-
-    /**
-     * Start to register callbacks.
-     * Call this function when tethering is ready to handle callback events.
-     */
-    public void startStateMachineUpdaters() {
-        try {
-            mNetd.registerUnsolicitedEventListener(mNetdCallback);
-        } catch (RemoteException e) {
-            mLog.e("Unable to register netd UnsolicitedEventListener");
-        }
-        mCarrierConfigChange.startListening();
-        mContext.getSystemService(TelephonyManager.class).listen(mActiveDataSubIdListener,
-                PhoneStateListener.LISTEN_ACTIVE_DATA_SUBSCRIPTION_ID_CHANGE);
-
-        IntentFilter filter = new IntentFilter();
-        filter.addAction(UsbManager.ACTION_USB_STATE);
-        filter.addAction(CONNECTIVITY_ACTION);
-        filter.addAction(WifiManager.WIFI_AP_STATE_CHANGED_ACTION);
-        filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED);
-        filter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);
-        filter.addAction(UserManager.ACTION_USER_RESTRICTIONS_CHANGED);
-        filter.addAction(ACTION_RESTRICT_BACKGROUND_CHANGED);
-        mContext.registerReceiver(mStateReceiver, filter, null, mHandler);
-
-        final WifiManager wifiManager = getWifiManager();
-        if (wifiManager != null) {
-            wifiManager.registerSoftApCallback(mExecutor, new TetheringSoftApCallback());
-        }
-
-        startTrackDefaultNetwork();
-    }
-
-    private class TetheringThreadExecutor implements Executor {
-        private final Handler mTetherHandler;
-        TetheringThreadExecutor(Handler handler) {
-            mTetherHandler = handler;
-        }
-        @Override
-        public void execute(Runnable command) {
-            if (!mTetherHandler.post(command)) {
-                throw new RejectedExecutionException(mTetherHandler + " is shutting down");
-            }
-        }
-    }
-
-    private class ActiveDataSubIdListener extends PhoneStateListener {
-        ActiveDataSubIdListener(Executor executor) {
-            super(executor);
-        }
-
-        @Override
-        public void onActiveDataSubscriptionIdChanged(int subId) {
-            mLog.log("OBSERVED active data subscription change, from " + mActiveDataSubId
-                    + " to " + subId);
-            if (subId == mActiveDataSubId) return;
-
-            mActiveDataSubId = subId;
-            updateConfiguration();
-            mNotificationUpdater.onActiveDataSubscriptionIdChanged(subId);
-            // To avoid launching unexpected provisioning checks, ignore re-provisioning
-            // when no CarrierConfig loaded yet. Assume reevaluateSimCardProvisioning()
-            // will be triggered again when CarrierConfig is loaded.
-            if (mEntitlementMgr.getCarrierConfig(mConfig) != null) {
-                mEntitlementMgr.reevaluateSimCardProvisioning(mConfig);
-            } else {
-                mLog.log("IGNORED reevaluate provisioning, no carrier config loaded");
-            }
-        }
-    }
-
-    private WifiManager getWifiManager() {
-        return (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
-    }
-
-    // NOTE: This is always invoked on the mLooper thread.
-    private void updateConfiguration() {
-        mConfig = mDeps.generateTetheringConfiguration(mContext, mLog, mActiveDataSubId);
-        mUpstreamNetworkMonitor.updateMobileRequiresDun(mConfig.isDunRequired);
-        reportConfigurationChanged(mConfig.toStableParcelable());
-    }
-
-    private void maybeDunSettingChanged() {
-        final boolean isDunRequired = TetheringConfiguration.checkDunRequired(mContext);
-        if (isDunRequired == mConfig.isDunRequired) return;
-        updateConfiguration();
-    }
-
-    private class NetdCallback extends BaseNetdUnsolicitedEventListener {
-        @Override
-        public void onInterfaceChanged(String ifName, boolean up) {
-            mHandler.post(() -> interfaceStatusChanged(ifName, up));
-        }
-
-        @Override
-        public void onInterfaceLinkStateChanged(String ifName, boolean up) {
-            mHandler.post(() -> interfaceLinkStateChanged(ifName, up));
-        }
-
-        @Override
-        public void onInterfaceAdded(String ifName) {
-            mHandler.post(() -> interfaceAdded(ifName));
-        }
-
-        @Override
-        public void onInterfaceRemoved(String ifName) {
-            mHandler.post(() -> interfaceRemoved(ifName));
-        }
-    }
-
-    private class TetheringSoftApCallback implements WifiManager.SoftApCallback {
-        // TODO: Remove onStateChanged override when this method has default on
-        // WifiManager#SoftApCallback interface.
-        // Wifi listener for state change of the soft AP
-        @Override
-        public void onStateChanged(final int state, final int failureReason) {
-            // Nothing
-        }
-
-        // Called by wifi when the number of soft AP clients changed.
-        @Override
-        public void onConnectedClientsChanged(final List<WifiClient> clients) {
-            updateConnectedClients(clients);
-        }
-    }
-
-    void interfaceStatusChanged(String iface, boolean up) {
-        // Never called directly: only called from interfaceLinkStateChanged.
-        // See NetlinkHandler.cpp: notifyInterfaceChanged.
-        if (VDBG) Log.d(TAG, "interfaceStatusChanged " + iface + ", " + up);
-        synchronized (mPublicSync) {
-            if (up) {
-                maybeTrackNewInterfaceLocked(iface);
-            } else {
-                if (ifaceNameToType(iface) == TETHERING_BLUETOOTH) {
-                    stopTrackingInterfaceLocked(iface);
-                } else {
-                    // Ignore usb0 down after enabling RNDIS.
-                    // We will handle disconnect in interfaceRemoved.
-                    // Similarly, ignore interface down for WiFi.  We monitor WiFi AP status
-                    // through the WifiManager.WIFI_AP_STATE_CHANGED_ACTION intent.
-                    if (VDBG) Log.d(TAG, "ignore interface down for " + iface);
-                }
-            }
-        }
-    }
-
-    void interfaceLinkStateChanged(String iface, boolean up) {
-        interfaceStatusChanged(iface, up);
-    }
-
-    private int ifaceNameToType(String iface) {
-        final TetheringConfiguration cfg = mConfig;
-
-        if (cfg.isWifi(iface)) {
-            return TETHERING_WIFI;
-        } else if (cfg.isWifiP2p(iface)) {
-            return TETHERING_WIFI_P2P;
-        } else if (cfg.isUsb(iface)) {
-            return TETHERING_USB;
-        } else if (cfg.isBluetooth(iface)) {
-            return TETHERING_BLUETOOTH;
-        } else if (cfg.isNcm(iface)) {
-            return TETHERING_NCM;
-        }
-        return TETHERING_INVALID;
-    }
-
-    void interfaceAdded(String iface) {
-        if (VDBG) Log.d(TAG, "interfaceAdded " + iface);
-        synchronized (mPublicSync) {
-            maybeTrackNewInterfaceLocked(iface);
-        }
-    }
-
-    void interfaceRemoved(String iface) {
-        if (VDBG) Log.d(TAG, "interfaceRemoved " + iface);
-        synchronized (mPublicSync) {
-            stopTrackingInterfaceLocked(iface);
-        }
-    }
-
-    void startTethering(final TetheringRequestParcel request, final IIntResultListener listener) {
-        mHandler.post(() -> {
-            final TetheringRequestParcel unfinishedRequest = mActiveTetheringRequests.get(
-                    request.tetheringType);
-            // If tethering is already enabled with a different request,
-            // disable before re-enabling.
-            if (unfinishedRequest != null
-                    && !TetheringUtils.isTetheringRequestEquals(unfinishedRequest, request)) {
-                enableTetheringInternal(request.tetheringType, false /* disabled */, null);
-                mEntitlementMgr.stopProvisioningIfNeeded(request.tetheringType);
-            }
-            mActiveTetheringRequests.put(request.tetheringType, request);
-
-            mEntitlementMgr.startProvisioningIfNeeded(request.tetheringType,
-                    request.showProvisioningUi);
-            enableTetheringInternal(request.tetheringType, true /* enabled */, listener);
-        });
-    }
-
-    void stopTethering(int type) {
-        mHandler.post(() -> {
-            mActiveTetheringRequests.remove(type);
-
-            enableTetheringInternal(type, false /* disabled */, null);
-            mEntitlementMgr.stopProvisioningIfNeeded(type);
-        });
-    }
-
-    /**
-     * Enables or disables tethering for the given type. If provisioning is required, it will
-     * schedule provisioning rechecks for the specified interface.
-     */
-    private void enableTetheringInternal(int type, boolean enable,
-            final IIntResultListener listener) {
-        int result = TETHER_ERROR_NO_ERROR;
-        switch (type) {
-            case TETHERING_WIFI:
-                result = setWifiTethering(enable);
-                break;
-            case TETHERING_USB:
-                result = setUsbTethering(enable);
-                break;
-            case TETHERING_BLUETOOTH:
-                setBluetoothTethering(enable, listener);
-                break;
-            case TETHERING_NCM:
-                result = setNcmTethering(enable);
-                break;
-            case TETHERING_ETHERNET:
-                result = setEthernetTethering(enable);
-                break;
-            default:
-                Log.w(TAG, "Invalid tether type.");
-                result = TETHER_ERROR_UNKNOWN_TYPE;
-        }
-
-        // The result of Bluetooth tethering will be sent by #setBluetoothTethering.
-        if (type != TETHERING_BLUETOOTH) {
-            sendTetherResult(listener, result, type);
-        }
-    }
-
-    private void sendTetherResult(final IIntResultListener listener, final int result,
-            final int type) {
-        if (listener != null) {
-            try {
-                listener.onResult(result);
-            } catch (RemoteException e) { }
-        }
-
-        // If changing tethering fail, remove corresponding request
-        // no matter who trigger the start/stop.
-        if (result != TETHER_ERROR_NO_ERROR) mActiveTetheringRequests.remove(type);
-    }
-
-    private int setWifiTethering(final boolean enable) {
-        final long ident = Binder.clearCallingIdentity();
-        try {
-            synchronized (mPublicSync) {
-                final WifiManager mgr = getWifiManager();
-                if (mgr == null) {
-                    mLog.e("setWifiTethering: failed to get WifiManager!");
-                    return TETHER_ERROR_SERVICE_UNAVAIL;
-                }
-                if ((enable && mgr.startTetheredHotspot(null /* use existing softap config */))
-                        || (!enable && mgr.stopSoftAp())) {
-                    mWifiTetherRequested = enable;
-                    return TETHER_ERROR_NO_ERROR;
-                }
-            }
-        } finally {
-            Binder.restoreCallingIdentity(ident);
-        }
-
-        return TETHER_ERROR_INTERNAL_ERROR;
-    }
-
-    private void setBluetoothTethering(final boolean enable, final IIntResultListener listener) {
-        final BluetoothAdapter adapter = mDeps.getBluetoothAdapter();
-        if (adapter == null || !adapter.isEnabled()) {
-            Log.w(TAG, "Tried to enable bluetooth tethering with null or disabled adapter. null: "
-                    + (adapter == null));
-            sendTetherResult(listener, TETHER_ERROR_SERVICE_UNAVAIL, TETHERING_BLUETOOTH);
-            return;
-        }
-
-        adapter.getProfileProxy(mContext, new ServiceListener() {
-            @Override
-            public void onServiceDisconnected(int profile) { }
-
-            @Override
-            public void onServiceConnected(int profile, BluetoothProfile proxy) {
-                // Clear identify is fine because caller already pass tethering permission at
-                // ConnectivityService#startTethering()(or stopTethering) before the control comes
-                // here. Bluetooth will check tethering permission again that there is
-                // Context#getOpPackageName() under BluetoothPan#setBluetoothTethering() to get
-                // caller's package name for permission check.
-                // Calling BluetoothPan#setBluetoothTethering() here means the package name always
-                // be system server. If calling identity is not cleared, that package's uid might
-                // not match calling uid and end up in permission denied.
-                final long identityToken = Binder.clearCallingIdentity();
-                try {
-                    ((BluetoothPan) proxy).setBluetoothTethering(enable);
-                } finally {
-                    Binder.restoreCallingIdentity(identityToken);
-                }
-                // TODO: Enabling bluetooth tethering can fail asynchronously here.
-                // We should figure out a way to bubble up that failure instead of sending success.
-                final int result = (((BluetoothPan) proxy).isTetheringOn() == enable)
-                        ? TETHER_ERROR_NO_ERROR
-                        : TETHER_ERROR_INTERNAL_ERROR;
-                sendTetherResult(listener, result, TETHERING_BLUETOOTH);
-                adapter.closeProfileProxy(BluetoothProfile.PAN, proxy);
-            }
-        }, BluetoothProfile.PAN);
-    }
-
-    private int setEthernetTethering(final boolean enable) {
-        final EthernetManager em = (EthernetManager) mContext.getSystemService(
-                Context.ETHERNET_SERVICE);
-        synchronized (mPublicSync) {
-            if (enable) {
-                if (mEthernetCallback != null) {
-                    Log.d(TAG, "Ethernet tethering already started");
-                    return TETHER_ERROR_NO_ERROR;
-                }
-
-                mEthernetCallback = new EthernetCallback();
-                mEthernetIfaceRequest = em.requestTetheredInterface(mExecutor, mEthernetCallback);
-            } else {
-                stopEthernetTetheringLocked();
-            }
-        }
-        return TETHER_ERROR_NO_ERROR;
-    }
-
-    private void stopEthernetTetheringLocked() {
-        if (mConfiguredEthernetIface != null) {
-            stopTrackingInterfaceLocked(mConfiguredEthernetIface);
-            mConfiguredEthernetIface = null;
-        }
-        if (mEthernetCallback != null) {
-            mEthernetIfaceRequest.release();
-            mEthernetCallback = null;
-            mEthernetIfaceRequest = null;
-        }
-    }
-
-    private class EthernetCallback implements EthernetManager.TetheredInterfaceCallback {
-        @Override
-        public void onAvailable(String iface) {
-            synchronized (mPublicSync) {
-                if (this != mEthernetCallback) {
-                    // Ethernet callback arrived after Ethernet tethering stopped. Ignore.
-                    return;
-                }
-                maybeTrackNewInterfaceLocked(iface, TETHERING_ETHERNET);
-                changeInterfaceState(iface, IpServer.STATE_TETHERED);
-                mConfiguredEthernetIface = iface;
-            }
-        }
-
-        @Override
-        public void onUnavailable() {
-            synchronized (mPublicSync) {
-                if (this != mEthernetCallback) {
-                    // onAvailable called after stopping Ethernet tethering.
-                    return;
-                }
-                stopEthernetTetheringLocked();
-            }
-        }
-    }
-
-    int tether(String iface) {
-        return tether(iface, IpServer.STATE_TETHERED);
-    }
-
-    private int tether(String iface, int requestedState) {
-        if (DBG) Log.d(TAG, "Tethering " + iface);
-        synchronized (mPublicSync) {
-            TetherState tetherState = mTetherStates.get(iface);
-            if (tetherState == null) {
-                Log.e(TAG, "Tried to Tether an unknown iface: " + iface + ", ignoring");
-                return TETHER_ERROR_UNKNOWN_IFACE;
-            }
-            // Ignore the error status of the interface.  If the interface is available,
-            // the errors are referring to past tethering attempts anyway.
-            if (tetherState.lastState != IpServer.STATE_AVAILABLE) {
-                Log.e(TAG, "Tried to Tether an unavailable iface: " + iface + ", ignoring");
-                return TETHER_ERROR_UNAVAIL_IFACE;
-            }
-            // NOTE: If a CMD_TETHER_REQUESTED message is already in the TISM's queue but not yet
-            // processed, this will be a no-op and it will not return an error.
-            //
-            // This code cannot race with untether() because they both synchronize on mPublicSync.
-            // TODO: reexamine the threading and messaging model to totally remove mPublicSync.
-            final int type = tetherState.ipServer.interfaceType();
-            final TetheringRequestParcel request = mActiveTetheringRequests.get(type, null);
-            if (request != null) {
-                mActiveTetheringRequests.delete(type);
-            }
-            tetherState.ipServer.sendMessage(IpServer.CMD_TETHER_REQUESTED, requestedState, 0,
-                    request);
-            return TETHER_ERROR_NO_ERROR;
-        }
-    }
-
-    int untether(String iface) {
-        if (DBG) Log.d(TAG, "Untethering " + iface);
-        synchronized (mPublicSync) {
-            TetherState tetherState = mTetherStates.get(iface);
-            if (tetherState == null) {
-                Log.e(TAG, "Tried to Untether an unknown iface :" + iface + ", ignoring");
-                return TETHER_ERROR_UNKNOWN_IFACE;
-            }
-            if (!tetherState.isCurrentlyServing()) {
-                Log.e(TAG, "Tried to untether an inactive iface :" + iface + ", ignoring");
-                return TETHER_ERROR_UNAVAIL_IFACE;
-            }
-            tetherState.ipServer.sendMessage(IpServer.CMD_TETHER_UNREQUESTED);
-            return TETHER_ERROR_NO_ERROR;
-        }
-    }
-
-    void untetherAll() {
-        stopTethering(TETHERING_WIFI);
-        stopTethering(TETHERING_WIFI_P2P);
-        stopTethering(TETHERING_USB);
-        stopTethering(TETHERING_BLUETOOTH);
-        stopTethering(TETHERING_ETHERNET);
-    }
-
-    int getLastTetherError(String iface) {
-        synchronized (mPublicSync) {
-            TetherState tetherState = mTetherStates.get(iface);
-            if (tetherState == null) {
-                Log.e(TAG, "Tried to getLastTetherError on an unknown iface :" + iface
-                        + ", ignoring");
-                return TETHER_ERROR_UNKNOWN_IFACE;
-            }
-            return tetherState.lastError;
-        }
-    }
-
-    boolean isTetherProvisioningRequired() {
-        final TetheringConfiguration cfg = mConfig;
-        return mEntitlementMgr.isTetherProvisioningRequired(cfg);
-    }
-
-    // TODO: Figure out how to update for local hotspot mode interfaces.
-    private void sendTetherStateChangedBroadcast() {
-        if (!mDeps.isTetheringSupported()) return;
-
-        final ArrayList<String> availableList = new ArrayList<>();
-        final ArrayList<String> tetherList = new ArrayList<>();
-        final ArrayList<String> localOnlyList = new ArrayList<>();
-        final ArrayList<String> erroredList = new ArrayList<>();
-        final ArrayList<Integer> lastErrorList = new ArrayList<>();
-
-        final TetheringConfiguration cfg = mConfig;
-        mTetherStatesParcel = new TetherStatesParcel();
-
-        int downstreamTypesMask = DOWNSTREAM_NONE;
-        synchronized (mPublicSync) {
-            for (int i = 0; i < mTetherStates.size(); i++) {
-                TetherState tetherState = mTetherStates.valueAt(i);
-                String iface = mTetherStates.keyAt(i);
-                if (tetherState.lastError != TETHER_ERROR_NO_ERROR) {
-                    erroredList.add(iface);
-                    lastErrorList.add(tetherState.lastError);
-                } else if (tetherState.lastState == IpServer.STATE_AVAILABLE) {
-                    availableList.add(iface);
-                } else if (tetherState.lastState == IpServer.STATE_LOCAL_ONLY) {
-                    localOnlyList.add(iface);
-                } else if (tetherState.lastState == IpServer.STATE_TETHERED) {
-                    if (cfg.isUsb(iface)) {
-                        downstreamTypesMask |= (1 << TETHERING_USB);
-                    } else if (cfg.isWifi(iface)) {
-                        downstreamTypesMask |= (1 << TETHERING_WIFI);
-                    } else if (cfg.isBluetooth(iface)) {
-                        downstreamTypesMask |= (1 << TETHERING_BLUETOOTH);
-                    }
-                    tetherList.add(iface);
-                }
-            }
-        }
-
-        mTetherStatesParcel.availableList = availableList.toArray(new String[0]);
-        mTetherStatesParcel.tetheredList = tetherList.toArray(new String[0]);
-        mTetherStatesParcel.localOnlyList = localOnlyList.toArray(new String[0]);
-        mTetherStatesParcel.erroredIfaceList = erroredList.toArray(new String[0]);
-        mTetherStatesParcel.lastErrorList = new int[lastErrorList.size()];
-        Iterator<Integer> iterator = lastErrorList.iterator();
-        for (int i = 0; i < lastErrorList.size(); i++) {
-            mTetherStatesParcel.lastErrorList[i] = iterator.next().intValue();
-        }
-        reportTetherStateChanged(mTetherStatesParcel);
-
-        final Intent bcast = new Intent(ACTION_TETHER_STATE_CHANGED);
-        bcast.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING);
-        bcast.putStringArrayListExtra(EXTRA_AVAILABLE_TETHER, availableList);
-        bcast.putStringArrayListExtra(EXTRA_ACTIVE_LOCAL_ONLY, localOnlyList);
-        bcast.putStringArrayListExtra(EXTRA_ACTIVE_TETHER, tetherList);
-        bcast.putStringArrayListExtra(EXTRA_ERRORED_TETHER, erroredList);
-        mContext.sendStickyBroadcastAsUser(bcast, UserHandle.ALL);
-        if (DBG) {
-            Log.d(TAG, String.format(
-                    "sendTetherStateChangedBroadcast %s=[%s] %s=[%s] %s=[%s] %s=[%s]",
-                    "avail", TextUtils.join(",", availableList),
-                    "local_only", TextUtils.join(",", localOnlyList),
-                    "tether", TextUtils.join(",", tetherList),
-                    "error", TextUtils.join(",", erroredList)));
-        }
-
-        mNotificationUpdater.onDownstreamChanged(downstreamTypesMask);
-    }
-
-    private class StateReceiver extends BroadcastReceiver {
-        @Override
-        public void onReceive(Context content, Intent intent) {
-            final String action = intent.getAction();
-            if (action == null) return;
-
-            if (action.equals(UsbManager.ACTION_USB_STATE)) {
-                handleUsbAction(intent);
-            } else if (action.equals(CONNECTIVITY_ACTION)) {
-                handleConnectivityAction(intent);
-            } else if (action.equals(WifiManager.WIFI_AP_STATE_CHANGED_ACTION)) {
-                handleWifiApAction(intent);
-            } else if (action.equals(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION)) {
-                handleWifiP2pAction(intent);
-            } else if (action.equals(Intent.ACTION_CONFIGURATION_CHANGED)) {
-                mLog.log("OBSERVED configuration changed");
-                updateConfiguration();
-            } else if (action.equals(UserManager.ACTION_USER_RESTRICTIONS_CHANGED)) {
-                mLog.log("OBSERVED user restrictions changed");
-                handleUserRestrictionAction();
-            } else if (action.equals(ACTION_RESTRICT_BACKGROUND_CHANGED)) {
-                mLog.log("OBSERVED data saver changed");
-                handleDataSaverChanged();
-            }
-        }
-
-        private void handleConnectivityAction(Intent intent) {
-            final NetworkInfo networkInfo =
-                    (NetworkInfo) intent.getParcelableExtra(EXTRA_NETWORK_INFO);
-            if (networkInfo == null
-                    || networkInfo.getDetailedState() == NetworkInfo.DetailedState.FAILED) {
-                return;
-            }
-
-            if (VDBG) Log.d(TAG, "Tethering got CONNECTIVITY_ACTION: " + networkInfo.toString());
-            mTetherMasterSM.sendMessage(TetherMasterSM.CMD_UPSTREAM_CHANGED);
-        }
-
-        private void handleUsbAction(Intent intent) {
-            final boolean usbConnected = intent.getBooleanExtra(USB_CONNECTED, false);
-            final boolean usbConfigured = intent.getBooleanExtra(USB_CONFIGURED, false);
-            final boolean rndisEnabled = intent.getBooleanExtra(USB_FUNCTION_RNDIS, false);
-            final boolean ncmEnabled = intent.getBooleanExtra(USB_FUNCTION_NCM, false);
-
-            mLog.log(String.format("USB bcast connected:%s configured:%s rndis:%s",
-                    usbConnected, usbConfigured, rndisEnabled));
-
-            // There are three types of ACTION_USB_STATE:
-            //
-            //     - DISCONNECTED (USB_CONNECTED and USB_CONFIGURED are 0)
-            //       Meaning: USB connection has ended either because of
-            //       software reset or hard unplug.
-            //
-            //     - CONNECTED (USB_CONNECTED is 1, USB_CONFIGURED is 0)
-            //       Meaning: the first stage of USB protocol handshake has
-            //       occurred but it is not complete.
-            //
-            //     - CONFIGURED (USB_CONNECTED and USB_CONFIGURED are 1)
-            //       Meaning: the USB handshake is completely done and all the
-            //       functions are ready to use.
-            //
-            // For more explanation, see b/62552150 .
-            synchronized (Tethering.this.mPublicSync) {
-                if (!usbConnected && mRndisEnabled) {
-                    // Turn off tethering if it was enabled and there is a disconnect.
-                    tetherMatchingInterfaces(IpServer.STATE_AVAILABLE, TETHERING_USB);
-                    mEntitlementMgr.stopProvisioningIfNeeded(TETHERING_USB);
-                } else if (usbConfigured && rndisEnabled) {
-                    // Tether if rndis is enabled and usb is configured.
-                    tetherMatchingInterfaces(IpServer.STATE_TETHERED, TETHERING_USB);
-                } else if (usbConnected && ncmEnabled) {
-                    tetherMatchingInterfaces(IpServer.STATE_LOCAL_ONLY, TETHERING_NCM);
-                }
-                mRndisEnabled = usbConfigured && rndisEnabled;
-            }
-        }
-
-        private void handleWifiApAction(Intent intent) {
-            final int curState = intent.getIntExtra(EXTRA_WIFI_AP_STATE, WIFI_AP_STATE_DISABLED);
-            final String ifname = intent.getStringExtra(EXTRA_WIFI_AP_INTERFACE_NAME);
-            final int ipmode = intent.getIntExtra(EXTRA_WIFI_AP_MODE, IFACE_IP_MODE_UNSPECIFIED);
-
-            synchronized (Tethering.this.mPublicSync) {
-                switch (curState) {
-                    case WifiManager.WIFI_AP_STATE_ENABLING:
-                        // We can see this state on the way to both enabled and failure states.
-                        break;
-                    case WifiManager.WIFI_AP_STATE_ENABLED:
-                        enableWifiIpServingLocked(ifname, ipmode);
-                        break;
-                    case WifiManager.WIFI_AP_STATE_DISABLED:
-                    case WifiManager.WIFI_AP_STATE_DISABLING:
-                    case WifiManager.WIFI_AP_STATE_FAILED:
-                    default:
-                        disableWifiIpServingLocked(ifname, curState);
-                        break;
-                }
-            }
-        }
-
-        private boolean isGroupOwner(WifiP2pGroup group) {
-            return group != null && group.isGroupOwner()
-                    && !TextUtils.isEmpty(group.getInterface());
-        }
-
-        private void handleWifiP2pAction(Intent intent) {
-            if (mConfig.isWifiP2pLegacyTetheringMode()) return;
-
-            final WifiP2pInfo p2pInfo =
-                    (WifiP2pInfo) intent.getParcelableExtra(WifiP2pManager.EXTRA_WIFI_P2P_INFO);
-            final WifiP2pGroup group =
-                    (WifiP2pGroup) intent.getParcelableExtra(WifiP2pManager.EXTRA_WIFI_P2P_GROUP);
-
-            if (VDBG) {
-                Log.d(TAG, "WifiP2pAction: P2pInfo: " + p2pInfo + " Group: " + group);
-            }
-
-            synchronized (Tethering.this.mPublicSync) {
-                // if no group is formed, bring it down if needed.
-                if (p2pInfo == null || !p2pInfo.groupFormed) {
-                    disableWifiP2pIpServingLockedIfNeeded(mWifiP2pTetherInterface);
-                    mWifiP2pTetherInterface = null;
-                    return;
-                }
-
-                // If there is a group but the device is not the owner, bail out.
-                if (!isGroupOwner(group)) return;
-
-                // If already serving from the correct interface, nothing to do.
-                if (group.getInterface().equals(mWifiP2pTetherInterface)) return;
-
-                // If already serving from another interface, turn it down first.
-                if (!TextUtils.isEmpty(mWifiP2pTetherInterface)) {
-                    mLog.w("P2P tethered interface " + mWifiP2pTetherInterface
-                            + "is different from current interface "
-                            + group.getInterface() + ", re-tether it");
-                    disableWifiP2pIpServingLockedIfNeeded(mWifiP2pTetherInterface);
-                }
-
-                // Finally bring up serving on the new interface
-                mWifiP2pTetherInterface = group.getInterface();
-                enableWifiIpServingLocked(mWifiP2pTetherInterface, IFACE_IP_MODE_LOCAL_ONLY);
-            }
-        }
-
-        private void handleUserRestrictionAction() {
-            mTetheringRestriction.onUserRestrictionsChanged();
-        }
-
-        private void handleDataSaverChanged() {
-            final ConnectivityManager connMgr = (ConnectivityManager) mContext.getSystemService(
-                    Context.CONNECTIVITY_SERVICE);
-            final boolean isDataSaverEnabled = connMgr.getRestrictBackgroundStatus()
-                    != ConnectivityManager.RESTRICT_BACKGROUND_STATUS_DISABLED;
-
-            if (mDataSaverEnabled == isDataSaverEnabled) return;
-
-            mDataSaverEnabled = isDataSaverEnabled;
-            if (mDataSaverEnabled) {
-                untetherAll();
-            }
-        }
-    }
-
-    @VisibleForTesting
-    protected static class UserRestrictionActionListener {
-        private final UserManager mUserManager;
-        private final Tethering mWrapper;
-        private final TetheringNotificationUpdater mNotificationUpdater;
-        public boolean mDisallowTethering;
-
-        public UserRestrictionActionListener(@NonNull UserManager um, @NonNull Tethering wrapper,
-                @NonNull TetheringNotificationUpdater updater) {
-            mUserManager = um;
-            mWrapper = wrapper;
-            mNotificationUpdater = updater;
-            mDisallowTethering = false;
-        }
-
-        public void onUserRestrictionsChanged() {
-            // getUserRestrictions gets restriction for this process' user, which is the primary
-            // user. This is fine because DISALLOW_CONFIG_TETHERING can only be set on the primary
-            // user. See UserManager.DISALLOW_CONFIG_TETHERING.
-            final Bundle restrictions = mUserManager.getUserRestrictions();
-            final boolean newlyDisallowed =
-                    restrictions.getBoolean(UserManager.DISALLOW_CONFIG_TETHERING);
-            final boolean prevDisallowed = mDisallowTethering;
-            mDisallowTethering = newlyDisallowed;
-
-            final boolean tetheringDisallowedChanged = (newlyDisallowed != prevDisallowed);
-            if (!tetheringDisallowedChanged) {
-                return;
-            }
-
-            if (!newlyDisallowed) {
-                // Clear the restricted notification when user is allowed to have tethering
-                // function.
-                mNotificationUpdater.tetheringRestrictionLifted();
-                return;
-            }
-
-            // Restricted notification is shown when tethering function is disallowed on
-            // user's device.
-            mNotificationUpdater.notifyTetheringDisabledByRestriction();
-
-            // Untether from all downstreams since tethering is disallowed.
-            mWrapper.untetherAll();
-
-            // TODO(b/148139325): send tetheringSupported on restriction change
-        }
-    }
-
-    private void disableWifiIpServingLockedCommon(int tetheringType, String ifname, int apState) {
-        mLog.log("Canceling WiFi tethering request -"
-                + " type=" + tetheringType
-                + " interface=" + ifname
-                + " state=" + apState);
-
-        if (!TextUtils.isEmpty(ifname)) {
-            final TetherState ts = mTetherStates.get(ifname);
-            if (ts != null) {
-                ts.ipServer.unwanted();
-                return;
-            }
-        }
-
-        for (int i = 0; i < mTetherStates.size(); i++) {
-            final IpServer ipServer = mTetherStates.valueAt(i).ipServer;
-            if (ipServer.interfaceType() == tetheringType) {
-                ipServer.unwanted();
-                return;
-            }
-        }
-
-        mLog.log("Error disabling Wi-Fi IP serving; "
-                + (TextUtils.isEmpty(ifname) ? "no interface name specified"
-                                           : "specified interface: " + ifname));
-    }
-
-    private void disableWifiIpServingLocked(String ifname, int apState) {
-        // Regardless of whether we requested this transition, the AP has gone
-        // down.  Don't try to tether again unless we're requested to do so.
-        // TODO: Remove this altogether, once Wi-Fi reliably gives us an
-        // interface name with every broadcast.
-        mWifiTetherRequested = false;
-
-        disableWifiIpServingLockedCommon(TETHERING_WIFI, ifname, apState);
-    }
-
-    private void disableWifiP2pIpServingLockedIfNeeded(String ifname) {
-        if (TextUtils.isEmpty(ifname)) return;
-
-        disableWifiIpServingLockedCommon(TETHERING_WIFI_P2P, ifname, /* dummy */ 0);
-    }
-
-    private void enableWifiIpServingLocked(String ifname, int wifiIpMode) {
-        // Map wifiIpMode values to IpServer.Callback serving states, inferring
-        // from mWifiTetherRequested as a final "best guess".
-        final int ipServingMode;
-        switch (wifiIpMode) {
-            case IFACE_IP_MODE_TETHERED:
-                ipServingMode = IpServer.STATE_TETHERED;
-                break;
-            case IFACE_IP_MODE_LOCAL_ONLY:
-                ipServingMode = IpServer.STATE_LOCAL_ONLY;
-                break;
-            default:
-                mLog.e("Cannot enable IP serving in unknown WiFi mode: " + wifiIpMode);
-                return;
-        }
-
-        if (!TextUtils.isEmpty(ifname)) {
-            maybeTrackNewInterfaceLocked(ifname);
-            changeInterfaceState(ifname, ipServingMode);
-        } else {
-            mLog.e(String.format(
-                    "Cannot enable IP serving in mode %s on missing interface name",
-                    ipServingMode));
-        }
-    }
-
-    // TODO: Consider renaming to something more accurate in its description.
-    // This method:
-    //     - allows requesting either tethering or local hotspot serving states
-    //     - handles both enabling and disabling serving states
-    //     - only tethers the first matching interface in listInterfaces()
-    //       order of a given type
-    private void tetherMatchingInterfaces(int requestedState, int interfaceType) {
-        if (VDBG) {
-            Log.d(TAG, "tetherMatchingInterfaces(" + requestedState + ", " + interfaceType + ")");
-        }
-
-        String[] ifaces = null;
-        try {
-            ifaces = mNetd.interfaceGetList();
-        } catch (RemoteException | ServiceSpecificException e) {
-            Log.e(TAG, "Error listing Interfaces", e);
-            return;
-        }
-        String chosenIface = null;
-        if (ifaces != null) {
-            for (String iface : ifaces) {
-                if (ifaceNameToType(iface) == interfaceType) {
-                    chosenIface = iface;
-                    break;
-                }
-            }
-        }
-        if (chosenIface == null) {
-            Log.e(TAG, "could not find iface of type " + interfaceType);
-            return;
-        }
-
-        changeInterfaceState(chosenIface, requestedState);
-    }
-
-    private void changeInterfaceState(String ifname, int requestedState) {
-        final int result;
-        switch (requestedState) {
-            case IpServer.STATE_UNAVAILABLE:
-            case IpServer.STATE_AVAILABLE:
-                result = untether(ifname);
-                break;
-            case IpServer.STATE_TETHERED:
-            case IpServer.STATE_LOCAL_ONLY:
-                result = tether(ifname, requestedState);
-                break;
-            default:
-                Log.wtf(TAG, "Unknown interface state: " + requestedState);
-                return;
-        }
-        if (result != TETHER_ERROR_NO_ERROR) {
-            Log.e(TAG, "unable start or stop tethering on iface " + ifname);
-            return;
-        }
-    }
-
-    TetheringConfiguration getTetheringConfiguration() {
-        return mConfig;
-    }
-
-    boolean hasTetherableConfiguration() {
-        final TetheringConfiguration cfg = mConfig;
-        final boolean hasDownstreamConfiguration =
-                (cfg.tetherableUsbRegexs.length != 0)
-                || (cfg.tetherableWifiRegexs.length != 0)
-                || (cfg.tetherableBluetoothRegexs.length != 0);
-        final boolean hasUpstreamConfiguration = !cfg.preferredUpstreamIfaceTypes.isEmpty()
-                || cfg.chooseUpstreamAutomatically;
-
-        return hasDownstreamConfiguration && hasUpstreamConfiguration;
-    }
-
-    // TODO - update callers to use getTetheringConfiguration(),
-    // which has only final members.
-    String[] getTetherableUsbRegexs() {
-        return copy(mConfig.tetherableUsbRegexs);
-    }
-
-    String[] getTetherableWifiRegexs() {
-        return copy(mConfig.tetherableWifiRegexs);
-    }
-
-    String[] getTetherableBluetoothRegexs() {
-        return copy(mConfig.tetherableBluetoothRegexs);
-    }
-
-    int setUsbTethering(boolean enable) {
-        if (VDBG) Log.d(TAG, "setUsbTethering(" + enable + ")");
-        UsbManager usbManager = (UsbManager) mContext.getSystemService(Context.USB_SERVICE);
-        if (usbManager == null) {
-            mLog.e("setUsbTethering: failed to get UsbManager!");
-            return TETHER_ERROR_SERVICE_UNAVAIL;
-        }
-
-        synchronized (mPublicSync) {
-            usbManager.setCurrentFunctions(enable ? UsbManager.FUNCTION_RNDIS
-                    : UsbManager.FUNCTION_NONE);
-        }
-        return TETHER_ERROR_NO_ERROR;
-    }
-
-    private int setNcmTethering(boolean enable) {
-        if (VDBG) Log.d(TAG, "setNcmTethering(" + enable + ")");
-        UsbManager usbManager = (UsbManager) mContext.getSystemService(Context.USB_SERVICE);
-        synchronized (mPublicSync) {
-            usbManager.setCurrentFunctions(enable ? UsbManager.FUNCTION_NCM
-                    : UsbManager.FUNCTION_NONE);
-        }
-        return TETHER_ERROR_NO_ERROR;
-    }
-
-    // TODO review API - figure out how to delete these entirely.
-    String[] getTetheredIfaces() {
-        ArrayList<String> list = new ArrayList<String>();
-        synchronized (mPublicSync) {
-            for (int i = 0; i < mTetherStates.size(); i++) {
-                TetherState tetherState = mTetherStates.valueAt(i);
-                if (tetherState.lastState == IpServer.STATE_TETHERED) {
-                    list.add(mTetherStates.keyAt(i));
-                }
-            }
-        }
-        return list.toArray(new String[list.size()]);
-    }
-
-    String[] getTetherableIfaces() {
-        ArrayList<String> list = new ArrayList<String>();
-        synchronized (mPublicSync) {
-            for (int i = 0; i < mTetherStates.size(); i++) {
-                TetherState tetherState = mTetherStates.valueAt(i);
-                if (tetherState.lastState == IpServer.STATE_AVAILABLE) {
-                    list.add(mTetherStates.keyAt(i));
-                }
-            }
-        }
-        return list.toArray(new String[list.size()]);
-    }
-
-    String[] getTetheredDhcpRanges() {
-        // TODO: this is only valid for the old DHCP server. Latest search suggests it is only used
-        // by WifiP2pServiceImpl to start dnsmasq: remove/deprecate after migrating callers.
-        return mConfig.legacyDhcpRanges;
-    }
-
-    String[] getErroredIfaces() {
-        ArrayList<String> list = new ArrayList<String>();
-        synchronized (mPublicSync) {
-            for (int i = 0; i < mTetherStates.size(); i++) {
-                TetherState tetherState = mTetherStates.valueAt(i);
-                if (tetherState.lastError != TETHER_ERROR_NO_ERROR) {
-                    list.add(mTetherStates.keyAt(i));
-                }
-            }
-        }
-        return list.toArray(new String[list.size()]);
-    }
-
-    private void logMessage(State state, int what) {
-        mLog.log(state.getName() + " got " + sMagicDecoderRing.get(what, Integer.toString(what)));
-    }
-
-    private boolean upstreamWanted() {
-        if (!mForwardedDownstreams.isEmpty()) return true;
-
-        synchronized (mPublicSync) {
-            return mWifiTetherRequested;
-        }
-    }
-
-    // Needed because the canonical source of upstream truth is just the
-    // upstream interface set, |mCurrentUpstreamIfaceSet|.
-    private boolean pertainsToCurrentUpstream(UpstreamNetworkState ns) {
-        if (ns != null && ns.linkProperties != null && mCurrentUpstreamIfaceSet != null) {
-            for (String ifname : ns.linkProperties.getAllInterfaceNames()) {
-                if (mCurrentUpstreamIfaceSet.ifnames.contains(ifname)) {
-                    return true;
-                }
-            }
-        }
-        return false;
-    }
-
-    class TetherMasterSM extends StateMachine {
-        // an interface SM has requested Tethering/Local Hotspot
-        static final int EVENT_IFACE_SERVING_STATE_ACTIVE       = BASE_MASTER + 1;
-        // an interface SM has unrequested Tethering/Local Hotspot
-        static final int EVENT_IFACE_SERVING_STATE_INACTIVE     = BASE_MASTER + 2;
-        // upstream connection change - do the right thing
-        static final int CMD_UPSTREAM_CHANGED                   = BASE_MASTER + 3;
-        // we don't have a valid upstream conn, check again after a delay
-        static final int CMD_RETRY_UPSTREAM                     = BASE_MASTER + 4;
-        // Events from NetworkCallbacks that we process on the master state
-        // machine thread on behalf of the UpstreamNetworkMonitor.
-        static final int EVENT_UPSTREAM_CALLBACK                = BASE_MASTER + 5;
-        // we treated the error and want now to clear it
-        static final int CMD_CLEAR_ERROR                        = BASE_MASTER + 6;
-        static final int EVENT_IFACE_UPDATE_LINKPROPERTIES      = BASE_MASTER + 7;
-        // Events from EntitlementManager to choose upstream again.
-        static final int EVENT_UPSTREAM_PERMISSION_CHANGED      = BASE_MASTER + 8;
-        private final State mInitialState;
-        private final State mTetherModeAliveState;
-
-        private final State mSetIpForwardingEnabledErrorState;
-        private final State mSetIpForwardingDisabledErrorState;
-        private final State mStartTetheringErrorState;
-        private final State mStopTetheringErrorState;
-        private final State mSetDnsForwardersErrorState;
-
-        // This list is a little subtle.  It contains all the interfaces that currently are
-        // requesting tethering, regardless of whether these interfaces are still members of
-        // mTetherStates.  This allows us to maintain the following predicates:
-        //
-        // 1) mTetherStates contains the set of all currently existing, tetherable, link state up
-        //    interfaces.
-        // 2) mNotifyList contains all state machines that may have outstanding tethering state
-        //    that needs to be torn down.
-        //
-        // Because we excise interfaces immediately from mTetherStates, we must maintain mNotifyList
-        // so that the garbage collector does not clean up the state machine before it has a chance
-        // to tear itself down.
-        private final ArrayList<IpServer> mNotifyList;
-        private final IPv6TetheringCoordinator mIPv6TetheringCoordinator;
-        private final OffloadWrapper mOffload;
-
-        private static final int UPSTREAM_SETTLE_TIME_MS     = 10000;
-
-        TetherMasterSM(String name, Looper looper, TetheringDependencies deps) {
-            super(name, looper);
-
-            mInitialState = new InitialState();
-            mTetherModeAliveState = new TetherModeAliveState();
-            mSetIpForwardingEnabledErrorState = new SetIpForwardingEnabledErrorState();
-            mSetIpForwardingDisabledErrorState = new SetIpForwardingDisabledErrorState();
-            mStartTetheringErrorState = new StartTetheringErrorState();
-            mStopTetheringErrorState = new StopTetheringErrorState();
-            mSetDnsForwardersErrorState = new SetDnsForwardersErrorState();
-
-            addState(mInitialState);
-            addState(mTetherModeAliveState);
-            addState(mSetIpForwardingEnabledErrorState);
-            addState(mSetIpForwardingDisabledErrorState);
-            addState(mStartTetheringErrorState);
-            addState(mStopTetheringErrorState);
-            addState(mSetDnsForwardersErrorState);
-
-            mNotifyList = new ArrayList<>();
-            mIPv6TetheringCoordinator = deps.getIPv6TetheringCoordinator(mNotifyList, mLog);
-            mOffload = new OffloadWrapper();
-
-            setInitialState(mInitialState);
-        }
-
-        class InitialState extends State {
-            @Override
-            public boolean processMessage(Message message) {
-                logMessage(this, message.what);
-                switch (message.what) {
-                    case EVENT_IFACE_SERVING_STATE_ACTIVE: {
-                        final IpServer who = (IpServer) message.obj;
-                        if (VDBG) Log.d(TAG, "Tether Mode requested by " + who);
-                        handleInterfaceServingStateActive(message.arg1, who);
-                        transitionTo(mTetherModeAliveState);
-                        break;
-                    }
-                    case EVENT_IFACE_SERVING_STATE_INACTIVE: {
-                        final IpServer who = (IpServer) message.obj;
-                        if (VDBG) Log.d(TAG, "Tether Mode unrequested by " + who);
-                        handleInterfaceServingStateInactive(who);
-                        break;
-                    }
-                    case EVENT_IFACE_UPDATE_LINKPROPERTIES:
-                        // Silently ignore these for now.
-                        break;
-                    default:
-                        return NOT_HANDLED;
-                }
-                return HANDLED;
-            }
-        }
-
-        protected boolean turnOnMasterTetherSettings() {
-            final TetheringConfiguration cfg = mConfig;
-            try {
-                mNetd.ipfwdEnableForwarding(TAG);
-            } catch (RemoteException | ServiceSpecificException e) {
-                mLog.e(e);
-                transitionTo(mSetIpForwardingEnabledErrorState);
-                return false;
-            }
-
-            // TODO: Randomize DHCPv4 ranges, especially in hotspot mode.
-            // Legacy DHCP server is disabled if passed an empty ranges array
-            final String[] dhcpRanges = cfg.enableLegacyDhcpServer
-                    ? cfg.legacyDhcpRanges : new String[0];
-            try {
-                NetdUtils.tetherStart(mNetd, true /** usingLegacyDnsProxy */, dhcpRanges);
-            } catch (RemoteException | ServiceSpecificException e) {
-                try {
-                    // Stop and retry.
-                    mNetd.tetherStop();
-                    NetdUtils.tetherStart(mNetd, true /** usingLegacyDnsProxy */, dhcpRanges);
-                } catch (RemoteException | ServiceSpecificException ee) {
-                    mLog.e(ee);
-                    transitionTo(mStartTetheringErrorState);
-                    return false;
-                }
-            }
-            mLog.log("SET master tether settings: ON");
-            return true;
-        }
-
-        protected boolean turnOffMasterTetherSettings() {
-            try {
-                mNetd.tetherStop();
-            } catch (RemoteException | ServiceSpecificException e) {
-                mLog.e(e);
-                transitionTo(mStopTetheringErrorState);
-                return false;
-            }
-            try {
-                mNetd.ipfwdDisableForwarding(TAG);
-            } catch (RemoteException | ServiceSpecificException e) {
-                mLog.e(e);
-                transitionTo(mSetIpForwardingDisabledErrorState);
-                return false;
-            }
-            transitionTo(mInitialState);
-            mLog.log("SET master tether settings: OFF");
-            return true;
-        }
-
-        protected void chooseUpstreamType(boolean tryCell) {
-            // We rebuild configuration on ACTION_CONFIGURATION_CHANGED, but we
-            // do not currently know how to watch for changes in DUN settings.
-            maybeDunSettingChanged();
-
-            final TetheringConfiguration config = mConfig;
-            final UpstreamNetworkState ns = (config.chooseUpstreamAutomatically)
-                    ? mUpstreamNetworkMonitor.getCurrentPreferredUpstream()
-                    : mUpstreamNetworkMonitor.selectPreferredUpstreamType(
-                            config.preferredUpstreamIfaceTypes);
-            if (ns == null) {
-                if (tryCell) {
-                    mUpstreamNetworkMonitor.registerMobileNetworkRequest();
-                    // We think mobile should be coming up; don't set a retry.
-                } else {
-                    sendMessageDelayed(CMD_RETRY_UPSTREAM, UPSTREAM_SETTLE_TIME_MS);
-                }
-            }
-            setUpstreamNetwork(ns);
-            final Network newUpstream = (ns != null) ? ns.network : null;
-            if (mTetherUpstream != newUpstream) {
-                mTetherUpstream = newUpstream;
-                mUpstreamNetworkMonitor.setCurrentUpstream(mTetherUpstream);
-                reportUpstreamChanged(mTetherUpstream);
-            }
-        }
-
-        protected void setUpstreamNetwork(UpstreamNetworkState ns) {
-            InterfaceSet ifaces = null;
-            if (ns != null) {
-                // Find the interface with the default IPv4 route. It may be the
-                // interface described by linkProperties, or one of the interfaces
-                // stacked on top of it.
-                mLog.i("Looking for default routes on: " + ns.linkProperties);
-                ifaces = TetheringInterfaceUtils.getTetheringInterfaces(ns);
-                mLog.i("Found upstream interface(s): " + ifaces);
-            }
-
-            if (ifaces != null) {
-                setDnsForwarders(ns.network, ns.linkProperties);
-            }
-            notifyDownstreamsOfNewUpstreamIface(ifaces);
-            if (ns != null && pertainsToCurrentUpstream(ns)) {
-                // If we already have UpstreamNetworkState for this network update it immediately.
-                handleNewUpstreamNetworkState(ns);
-            } else if (mCurrentUpstreamIfaceSet == null) {
-                // There are no available upstream networks.
-                handleNewUpstreamNetworkState(null);
-            }
-        }
-
-        protected void setDnsForwarders(final Network network, final LinkProperties lp) {
-            // TODO: Set v4 and/or v6 DNS per available connectivity.
-            final Collection<InetAddress> dnses = lp.getDnsServers();
-            // TODO: Properly support the absence of DNS servers.
-            final String[] dnsServers;
-            if (dnses != null && !dnses.isEmpty()) {
-                dnsServers = new String[dnses.size()];
-                int i = 0;
-                for (InetAddress dns : dnses) {
-                    dnsServers[i++] = dns.getHostAddress();
-                }
-            } else {
-                dnsServers = mConfig.defaultIPv4DNS;
-            }
-            final int netId = (network != null) ? network.getNetId() : NETID_UNSET;
-            try {
-                mNetd.tetherDnsSet(netId, dnsServers);
-                mLog.log(String.format(
-                        "SET DNS forwarders: network=%s dnsServers=%s",
-                        network, Arrays.toString(dnsServers)));
-            } catch (RemoteException | ServiceSpecificException e) {
-                // TODO: Investigate how this can fail and what exactly
-                // happens if/when such failures occur.
-                mLog.e("setting DNS forwarders failed, " + e);
-                transitionTo(mSetDnsForwardersErrorState);
-            }
-        }
-
-        protected void notifyDownstreamsOfNewUpstreamIface(InterfaceSet ifaces) {
-            mCurrentUpstreamIfaceSet = ifaces;
-            for (IpServer ipServer : mNotifyList) {
-                ipServer.sendMessage(IpServer.CMD_TETHER_CONNECTION_CHANGED, ifaces);
-            }
-        }
-
-        protected void handleNewUpstreamNetworkState(UpstreamNetworkState ns) {
-            mIPv6TetheringCoordinator.updateUpstreamNetworkState(ns);
-            mOffload.updateUpstreamNetworkState(ns);
-        }
-
-        private void handleInterfaceServingStateActive(int mode, IpServer who) {
-            if (mNotifyList.indexOf(who) < 0) {
-                mNotifyList.add(who);
-                mIPv6TetheringCoordinator.addActiveDownstream(who, mode);
-            }
-
-            if (mode == IpServer.STATE_TETHERED) {
-                // No need to notify OffloadController just yet as there are no
-                // "offload-able" prefixes to pass along. This will handled
-                // when the TISM informs Tethering of its LinkProperties.
-                mForwardedDownstreams.add(who);
-            } else {
-                mOffload.excludeDownstreamInterface(who.interfaceName());
-                mForwardedDownstreams.remove(who);
-            }
-
-            // If this is a Wi-Fi interface, notify WifiManager of the active serving state.
-            if (who.interfaceType() == TETHERING_WIFI) {
-                final WifiManager mgr = getWifiManager();
-                final String iface = who.interfaceName();
-                switch (mode) {
-                    case IpServer.STATE_TETHERED:
-                        mgr.updateInterfaceIpState(iface, IFACE_IP_MODE_TETHERED);
-                        break;
-                    case IpServer.STATE_LOCAL_ONLY:
-                        mgr.updateInterfaceIpState(iface, IFACE_IP_MODE_LOCAL_ONLY);
-                        break;
-                    default:
-                        Log.wtf(TAG, "Unknown active serving mode: " + mode);
-                        break;
-                }
-            }
-        }
-
-        private void handleInterfaceServingStateInactive(IpServer who) {
-            mNotifyList.remove(who);
-            mIPv6TetheringCoordinator.removeActiveDownstream(who);
-            mOffload.excludeDownstreamInterface(who.interfaceName());
-            mForwardedDownstreams.remove(who);
-            updateConnectedClients(null /* wifiClients */);
-
-            // If this is a Wi-Fi interface, tell WifiManager of any errors
-            // or the inactive serving state.
-            if (who.interfaceType() == TETHERING_WIFI) {
-                if (who.lastError() != TETHER_ERROR_NO_ERROR) {
-                    getWifiManager().updateInterfaceIpState(
-                            who.interfaceName(), IFACE_IP_MODE_CONFIGURATION_ERROR);
-                } else {
-                    getWifiManager().updateInterfaceIpState(
-                            who.interfaceName(), IFACE_IP_MODE_UNSPECIFIED);
-                }
-            }
-        }
-
-        private void handleUpstreamNetworkMonitorCallback(int arg1, Object o) {
-            if (arg1 == UpstreamNetworkMonitor.NOTIFY_LOCAL_PREFIXES) {
-                mOffload.sendOffloadExemptPrefixes((Set<IpPrefix>) o);
-                return;
-            }
-
-            final UpstreamNetworkState ns = (UpstreamNetworkState) o;
-
-            if (ns == null || !pertainsToCurrentUpstream(ns)) {
-                // TODO: In future, this is where upstream evaluation and selection
-                // could be handled for notifications which include sufficient data.
-                // For example, after CONNECTIVITY_ACTION listening is removed, here
-                // is where we could observe a Wi-Fi network becoming available and
-                // passing validation.
-                if (mCurrentUpstreamIfaceSet == null) {
-                    // If we have no upstream interface, try to run through upstream
-                    // selection again.  If, for example, IPv4 connectivity has shown up
-                    // after IPv6 (e.g., 464xlat became available) we want the chance to
-                    // notice and act accordingly.
-                    chooseUpstreamType(false);
-                }
-                return;
-            }
-
-            switch (arg1) {
-                case UpstreamNetworkMonitor.EVENT_ON_CAPABILITIES:
-                    handleNewUpstreamNetworkState(ns);
-                    break;
-                case UpstreamNetworkMonitor.EVENT_ON_LINKPROPERTIES:
-                    chooseUpstreamType(false);
-                    break;
-                case UpstreamNetworkMonitor.EVENT_ON_LOST:
-                    // TODO: Re-evaluate possible upstreams. Currently upstream
-                    // reevaluation is triggered via received CONNECTIVITY_ACTION
-                    // broadcasts that result in being passed a
-                    // TetherMasterSM.CMD_UPSTREAM_CHANGED.
-                    handleNewUpstreamNetworkState(null);
-                    break;
-                default:
-                    mLog.e("Unknown arg1 value: " + arg1);
-                    break;
-            }
-        }
-
-        class TetherModeAliveState extends State {
-            boolean mUpstreamWanted = false;
-            boolean mTryCell = true;
-
-            @Override
-            public void enter() {
-                // If turning on master tether settings fails, we have already
-                // transitioned to an error state; exit early.
-                if (!turnOnMasterTetherSettings()) {
-                    return;
-                }
-
-                mUpstreamNetworkMonitor.startObserveAllNetworks();
-
-                // TODO: De-duplicate with updateUpstreamWanted() below.
-                if (upstreamWanted()) {
-                    mUpstreamWanted = true;
-                    mOffload.start();
-                    chooseUpstreamType(true);
-                    mTryCell = false;
-                }
-            }
-
-            @Override
-            public void exit() {
-                mOffload.stop();
-                mUpstreamNetworkMonitor.stop();
-                notifyDownstreamsOfNewUpstreamIface(null);
-                handleNewUpstreamNetworkState(null);
-                if (mTetherUpstream != null) {
-                    mTetherUpstream = null;
-                    reportUpstreamChanged(null);
-                }
-            }
-
-            private boolean updateUpstreamWanted() {
-                final boolean previousUpstreamWanted = mUpstreamWanted;
-                mUpstreamWanted = upstreamWanted();
-                if (mUpstreamWanted != previousUpstreamWanted) {
-                    if (mUpstreamWanted) {
-                        mOffload.start();
-                    } else {
-                        mOffload.stop();
-                    }
-                }
-                return previousUpstreamWanted;
-            }
-
-            @Override
-            public boolean processMessage(Message message) {
-                logMessage(this, message.what);
-                boolean retValue = true;
-                switch (message.what) {
-                    case EVENT_IFACE_SERVING_STATE_ACTIVE: {
-                        IpServer who = (IpServer) message.obj;
-                        if (VDBG) Log.d(TAG, "Tether Mode requested by " + who);
-                        handleInterfaceServingStateActive(message.arg1, who);
-                        who.sendMessage(IpServer.CMD_TETHER_CONNECTION_CHANGED,
-                                mCurrentUpstreamIfaceSet);
-                        // If there has been a change and an upstream is now
-                        // desired, kick off the selection process.
-                        final boolean previousUpstreamWanted = updateUpstreamWanted();
-                        if (!previousUpstreamWanted && mUpstreamWanted) {
-                            chooseUpstreamType(true);
-                        }
-                        break;
-                    }
-                    case EVENT_IFACE_SERVING_STATE_INACTIVE: {
-                        IpServer who = (IpServer) message.obj;
-                        if (VDBG) Log.d(TAG, "Tether Mode unrequested by " + who);
-                        handleInterfaceServingStateInactive(who);
-
-                        if (mNotifyList.isEmpty()) {
-                            // This transitions us out of TetherModeAliveState,
-                            // either to InitialState or an error state.
-                            turnOffMasterTetherSettings();
-                            break;
-                        }
-
-                        if (DBG) {
-                            Log.d(TAG, "TetherModeAlive still has " + mNotifyList.size()
-                                    + " live requests:");
-                            for (IpServer o : mNotifyList) {
-                                Log.d(TAG, "  " + o);
-                            }
-                        }
-                        // If there has been a change and an upstream is no
-                        // longer desired, release any mobile requests.
-                        final boolean previousUpstreamWanted = updateUpstreamWanted();
-                        if (previousUpstreamWanted && !mUpstreamWanted) {
-                            mUpstreamNetworkMonitor.releaseMobileNetworkRequest();
-                        }
-                        break;
-                    }
-                    case EVENT_IFACE_UPDATE_LINKPROPERTIES: {
-                        final LinkProperties newLp = (LinkProperties) message.obj;
-                        if (message.arg1 == IpServer.STATE_TETHERED) {
-                            mOffload.updateDownstreamLinkProperties(newLp);
-                        } else {
-                            mOffload.excludeDownstreamInterface(newLp.getInterfaceName());
-                        }
-                        break;
-                    }
-                    case EVENT_UPSTREAM_PERMISSION_CHANGED:
-                    case CMD_UPSTREAM_CHANGED:
-                        updateUpstreamWanted();
-                        if (!mUpstreamWanted) break;
-
-                        // Need to try DUN immediately if Wi-Fi goes down.
-                        chooseUpstreamType(true);
-                        mTryCell = false;
-                        break;
-                    case CMD_RETRY_UPSTREAM:
-                        updateUpstreamWanted();
-                        if (!mUpstreamWanted) break;
-
-                        chooseUpstreamType(mTryCell);
-                        mTryCell = !mTryCell;
-                        break;
-                    case EVENT_UPSTREAM_CALLBACK: {
-                        updateUpstreamWanted();
-                        if (mUpstreamWanted) {
-                            handleUpstreamNetworkMonitorCallback(message.arg1, message.obj);
-                        }
-                        break;
-                    }
-                    default:
-                        retValue = false;
-                        break;
-                }
-                return retValue;
-            }
-        }
-
-        class ErrorState extends State {
-            private int mErrorNotification;
-
-            @Override
-            public boolean processMessage(Message message) {
-                boolean retValue = true;
-                switch (message.what) {
-                    case EVENT_IFACE_SERVING_STATE_ACTIVE:
-                        IpServer who = (IpServer) message.obj;
-                        who.sendMessage(mErrorNotification);
-                        break;
-                    case CMD_CLEAR_ERROR:
-                        mErrorNotification = TETHER_ERROR_NO_ERROR;
-                        transitionTo(mInitialState);
-                        break;
-                    default:
-                        retValue = false;
-                }
-                return retValue;
-            }
-
-            void notify(int msgType) {
-                mErrorNotification = msgType;
-                for (IpServer ipServer : mNotifyList) {
-                    ipServer.sendMessage(msgType);
-                }
-            }
-
-        }
-
-        class SetIpForwardingEnabledErrorState extends ErrorState {
-            @Override
-            public void enter() {
-                Log.e(TAG, "Error in setIpForwardingEnabled");
-                notify(IpServer.CMD_IP_FORWARDING_ENABLE_ERROR);
-            }
-        }
-
-        class SetIpForwardingDisabledErrorState extends ErrorState {
-            @Override
-            public void enter() {
-                Log.e(TAG, "Error in setIpForwardingDisabled");
-                notify(IpServer.CMD_IP_FORWARDING_DISABLE_ERROR);
-            }
-        }
-
-        class StartTetheringErrorState extends ErrorState {
-            @Override
-            public void enter() {
-                Log.e(TAG, "Error in startTethering");
-                notify(IpServer.CMD_START_TETHERING_ERROR);
-                try {
-                    mNetd.ipfwdDisableForwarding(TAG);
-                } catch (RemoteException | ServiceSpecificException e) { }
-            }
-        }
-
-        class StopTetheringErrorState extends ErrorState {
-            @Override
-            public void enter() {
-                Log.e(TAG, "Error in stopTethering");
-                notify(IpServer.CMD_STOP_TETHERING_ERROR);
-                try {
-                    mNetd.ipfwdDisableForwarding(TAG);
-                } catch (RemoteException | ServiceSpecificException e) { }
-            }
-        }
-
-        class SetDnsForwardersErrorState extends ErrorState {
-            @Override
-            public void enter() {
-                Log.e(TAG, "Error in setDnsForwarders");
-                notify(IpServer.CMD_SET_DNS_FORWARDERS_ERROR);
-                try {
-                    mNetd.tetherStop();
-                } catch (RemoteException | ServiceSpecificException e) { }
-                try {
-                    mNetd.ipfwdDisableForwarding(TAG);
-                } catch (RemoteException | ServiceSpecificException e) { }
-            }
-        }
-
-        // A wrapper class to handle multiple situations where several calls to
-        // the OffloadController need to happen together.
-        //
-        // TODO: This suggests that the interface between OffloadController and
-        // Tethering is in need of improvement. Refactor these calls into the
-        // OffloadController implementation.
-        class OffloadWrapper {
-            public void start() {
-                final int status = mOffloadController.start() ? TETHER_HARDWARE_OFFLOAD_STARTED
-                        : TETHER_HARDWARE_OFFLOAD_FAILED;
-                updateOffloadStatus(status);
-                sendOffloadExemptPrefixes();
-            }
-
-            public void stop() {
-                mOffloadController.stop();
-                updateOffloadStatus(TETHER_HARDWARE_OFFLOAD_STOPPED);
-            }
-
-            public void updateUpstreamNetworkState(UpstreamNetworkState ns) {
-                mOffloadController.setUpstreamLinkProperties(
-                        (ns != null) ? ns.linkProperties : null);
-            }
-
-            public void updateDownstreamLinkProperties(LinkProperties newLp) {
-                // Update the list of offload-exempt prefixes before adding
-                // new prefixes on downstream interfaces to the offload HAL.
-                sendOffloadExemptPrefixes();
-                mOffloadController.notifyDownstreamLinkProperties(newLp);
-            }
-
-            public void excludeDownstreamInterface(String ifname) {
-                // This and other interfaces may be in local-only hotspot mode;
-                // resend all local prefixes to the OffloadController.
-                sendOffloadExemptPrefixes();
-                mOffloadController.removeDownstreamInterface(ifname);
-            }
-
-            public void sendOffloadExemptPrefixes() {
-                sendOffloadExemptPrefixes(mUpstreamNetworkMonitor.getLocalPrefixes());
-            }
-
-            public void sendOffloadExemptPrefixes(final Set<IpPrefix> localPrefixes) {
-                // Add in well-known minimum set.
-                PrefixUtils.addNonForwardablePrefixes(localPrefixes);
-                // Add tragically hardcoded prefixes.
-                localPrefixes.add(PrefixUtils.DEFAULT_WIFI_P2P_PREFIX);
-
-                // Maybe add prefixes or addresses for downstreams, depending on
-                // the IP serving mode of each.
-                for (IpServer ipServer : mNotifyList) {
-                    final LinkProperties lp = ipServer.linkProperties();
-
-                    switch (ipServer.servingMode()) {
-                        case IpServer.STATE_UNAVAILABLE:
-                        case IpServer.STATE_AVAILABLE:
-                            // No usable LinkProperties in these states.
-                            continue;
-                        case IpServer.STATE_TETHERED:
-                            // Only add IPv4 /32 and IPv6 /128 prefixes. The
-                            // directly-connected prefixes will be sent as
-                            // downstream "offload-able" prefixes.
-                            for (LinkAddress addr : lp.getAllLinkAddresses()) {
-                                final InetAddress ip = addr.getAddress();
-                                if (ip.isLinkLocalAddress()) continue;
-                                localPrefixes.add(PrefixUtils.ipAddressAsPrefix(ip));
-                            }
-                            break;
-                        case IpServer.STATE_LOCAL_ONLY:
-                            // Add prefixes covering all local IPs.
-                            localPrefixes.addAll(PrefixUtils.localPrefixesFrom(lp));
-                            break;
-                    }
-                }
-
-                mOffloadController.setLocalPrefixes(localPrefixes);
-            }
-
-            private void updateOffloadStatus(final int newStatus) {
-                if (newStatus == mOffloadStatus) return;
-
-                mOffloadStatus = newStatus;
-                reportOffloadStatusChanged(mOffloadStatus);
-            }
-        }
-    }
-
-    private void startTrackDefaultNetwork() {
-        mUpstreamNetworkMonitor.startTrackDefaultNetwork(mDeps.getDefaultNetworkRequest(),
-                mEntitlementMgr);
-    }
-
-    /** Get the latest value of the tethering entitlement check. */
-    void requestLatestTetheringEntitlementResult(int type, ResultReceiver receiver,
-            boolean showEntitlementUi) {
-        if (receiver != null) {
-            mEntitlementMgr.requestLatestTetheringEntitlementResult(type, receiver,
-                    showEntitlementUi);
-        }
-    }
-
-    /** Register tethering event callback */
-    void registerTetheringEventCallback(ITetheringEventCallback callback) {
-        final boolean hasListPermission =
-                hasCallingPermission(NETWORK_SETTINGS)
-                        || hasCallingPermission(PERMISSION_MAINLINE_NETWORK_STACK)
-                        || hasCallingPermission(NETWORK_STACK);
-        mHandler.post(() -> {
-            mTetheringEventCallbacks.register(callback, new CallbackCookie(hasListPermission));
-            final TetheringCallbackStartedParcel parcel = new TetheringCallbackStartedParcel();
-            parcel.tetheringSupported = mDeps.isTetheringSupported();
-            parcel.upstreamNetwork = mTetherUpstream;
-            parcel.config = mConfig.toStableParcelable();
-            parcel.states =
-                    mTetherStatesParcel != null ? mTetherStatesParcel : emptyTetherStatesParcel();
-            parcel.tetheredClients = hasListPermission
-                    ? mConnectedClientsTracker.getLastTetheredClients()
-                    : Collections.emptyList();
-            parcel.offloadStatus = mOffloadStatus;
-            try {
-                callback.onCallbackStarted(parcel);
-            } catch (RemoteException e) {
-                // Not really very much to do here.
-            }
-        });
-    }
-
-    private TetherStatesParcel emptyTetherStatesParcel() {
-        final TetherStatesParcel parcel = new TetherStatesParcel();
-        parcel.availableList = new String[0];
-        parcel.tetheredList = new String[0];
-        parcel.localOnlyList = new String[0];
-        parcel.erroredIfaceList = new String[0];
-        parcel.lastErrorList = new int[0];
-
-        return parcel;
-    }
-
-    private boolean hasCallingPermission(@NonNull String permission) {
-        return mContext.checkCallingPermission(permission) == PERMISSION_GRANTED;
-    }
-
-    /** Unregister tethering event callback */
-    void unregisterTetheringEventCallback(ITetheringEventCallback callback) {
-        mHandler.post(() -> {
-            mTetheringEventCallbacks.unregister(callback);
-        });
-    }
-
-    private void reportUpstreamChanged(Network network) {
-        final int length = mTetheringEventCallbacks.beginBroadcast();
-        try {
-            for (int i = 0; i < length; i++) {
-                try {
-                    mTetheringEventCallbacks.getBroadcastItem(i).onUpstreamChanged(network);
-                } catch (RemoteException e) {
-                    // Not really very much to do here.
-                }
-            }
-        } finally {
-            mTetheringEventCallbacks.finishBroadcast();
-        }
-    }
-
-    private void reportConfigurationChanged(TetheringConfigurationParcel config) {
-        final int length = mTetheringEventCallbacks.beginBroadcast();
-        try {
-            for (int i = 0; i < length; i++) {
-                try {
-                    mTetheringEventCallbacks.getBroadcastItem(i).onConfigurationChanged(config);
-                    // TODO(b/148139325): send tetheringSupported on configuration change
-                } catch (RemoteException e) {
-                    // Not really very much to do here.
-                }
-            }
-        } finally {
-            mTetheringEventCallbacks.finishBroadcast();
-        }
-    }
-
-    private void reportTetherStateChanged(TetherStatesParcel states) {
-        final int length = mTetheringEventCallbacks.beginBroadcast();
-        try {
-            for (int i = 0; i < length; i++) {
-                try {
-                    mTetheringEventCallbacks.getBroadcastItem(i).onTetherStatesChanged(states);
-                } catch (RemoteException e) {
-                    // Not really very much to do here.
-                }
-            }
-        } finally {
-            mTetheringEventCallbacks.finishBroadcast();
-        }
-    }
-
-    private void reportTetherClientsChanged(List<TetheredClient> clients) {
-        final int length = mTetheringEventCallbacks.beginBroadcast();
-        try {
-            for (int i = 0; i < length; i++) {
-                try {
-                    final CallbackCookie cookie =
-                            (CallbackCookie) mTetheringEventCallbacks.getBroadcastCookie(i);
-                    if (!cookie.hasListClientsPermission) continue;
-                    mTetheringEventCallbacks.getBroadcastItem(i).onTetherClientsChanged(clients);
-                } catch (RemoteException e) {
-                    // Not really very much to do here.
-                }
-            }
-        } finally {
-            mTetheringEventCallbacks.finishBroadcast();
-        }
-    }
-
-    private void reportOffloadStatusChanged(final int status) {
-        final int length = mTetheringEventCallbacks.beginBroadcast();
-        try {
-            for (int i = 0; i < length; i++) {
-                try {
-                    mTetheringEventCallbacks.getBroadcastItem(i).onOffloadStatusChanged(status);
-                } catch (RemoteException e) {
-                    // Not really very much to do here.
-                }
-            }
-        } finally {
-            mTetheringEventCallbacks.finishBroadcast();
-        }
-    }
-
-    void dump(@NonNull FileDescriptor fd, @NonNull PrintWriter writer, @Nullable String[] args) {
-        // Binder.java closes the resource for us.
-        @SuppressWarnings("resource")
-        final IndentingPrintWriter pw = new IndentingPrintWriter(writer, "  ");
-        if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP)
-                != PERMISSION_GRANTED) {
-            pw.println("Permission Denial: can't dump.");
-            return;
-        }
-
-        pw.println("Tethering:");
-        pw.increaseIndent();
-
-        pw.println("Configuration:");
-        pw.increaseIndent();
-        final TetheringConfiguration cfg = mConfig;
-        cfg.dump(pw);
-        pw.decreaseIndent();
-
-        pw.println("Entitlement:");
-        pw.increaseIndent();
-        mEntitlementMgr.dump(pw);
-        pw.decreaseIndent();
-
-        synchronized (mPublicSync) {
-            pw.println("Tether state:");
-            pw.increaseIndent();
-            for (int i = 0; i < mTetherStates.size(); i++) {
-                final String iface = mTetherStates.keyAt(i);
-                final TetherState tetherState = mTetherStates.valueAt(i);
-                pw.print(iface + " - ");
-
-                switch (tetherState.lastState) {
-                    case IpServer.STATE_UNAVAILABLE:
-                        pw.print("UnavailableState");
-                        break;
-                    case IpServer.STATE_AVAILABLE:
-                        pw.print("AvailableState");
-                        break;
-                    case IpServer.STATE_TETHERED:
-                        pw.print("TetheredState");
-                        break;
-                    case IpServer.STATE_LOCAL_ONLY:
-                        pw.print("LocalHotspotState");
-                        break;
-                    default:
-                        pw.print("UnknownState");
-                        break;
-                }
-                pw.println(" - lastError = " + tetherState.lastError);
-            }
-            pw.println("Upstream wanted: " + upstreamWanted());
-            pw.println("Current upstream interface(s): " + mCurrentUpstreamIfaceSet);
-            pw.decreaseIndent();
-        }
-
-        pw.println("Hardware offload:");
-        pw.increaseIndent();
-        mOffloadController.dump(pw);
-        pw.decreaseIndent();
-
-        pw.println("Log:");
-        pw.increaseIndent();
-        if (argsContain(args, "--short")) {
-            pw.println("<log removed for brevity>");
-        } else {
-            mLog.dump(fd, pw, args);
-        }
-        pw.decreaseIndent();
-
-        pw.decreaseIndent();
-    }
-
-    private static boolean argsContain(String[] args, String target) {
-        for (String arg : args) {
-            if (target.equals(arg)) return true;
-        }
-        return false;
-    }
-
-    private void updateConnectedClients(final List<WifiClient> wifiClients) {
-        if (mConnectedClientsTracker.updateConnectedClients(mForwardedDownstreams, wifiClients)) {
-            reportTetherClientsChanged(mConnectedClientsTracker.getLastTetheredClients());
-        }
-    }
-
-    private IpServer.Callback makeControlCallback() {
-        return new IpServer.Callback() {
-            @Override
-            public void updateInterfaceState(IpServer who, int state, int lastError) {
-                notifyInterfaceStateChange(who, state, lastError);
-            }
-
-            @Override
-            public void updateLinkProperties(IpServer who, LinkProperties newLp) {
-                notifyLinkPropertiesChanged(who, newLp);
-            }
-
-            @Override
-            public void dhcpLeasesChanged() {
-                updateConnectedClients(null /* wifiClients */);
-            }
-        };
-    }
-
-    // TODO: Move into TetherMasterSM.
-    private void notifyInterfaceStateChange(IpServer who, int state, int error) {
-        final String iface = who.interfaceName();
-        synchronized (mPublicSync) {
-            final TetherState tetherState = mTetherStates.get(iface);
-            if (tetherState != null && tetherState.ipServer.equals(who)) {
-                tetherState.lastState = state;
-                tetherState.lastError = error;
-            } else {
-                if (DBG) Log.d(TAG, "got notification from stale iface " + iface);
-            }
-        }
-
-        mLog.log(String.format("OBSERVED iface=%s state=%s error=%s", iface, state, error));
-
-        // If TetherMasterSM is in ErrorState, TetherMasterSM stays there.
-        // Thus we give a chance for TetherMasterSM to recover to InitialState
-        // by sending CMD_CLEAR_ERROR
-        if (error == TETHER_ERROR_INTERNAL_ERROR) {
-            mTetherMasterSM.sendMessage(TetherMasterSM.CMD_CLEAR_ERROR, who);
-        }
-        int which;
-        switch (state) {
-            case IpServer.STATE_UNAVAILABLE:
-            case IpServer.STATE_AVAILABLE:
-                which = TetherMasterSM.EVENT_IFACE_SERVING_STATE_INACTIVE;
-                break;
-            case IpServer.STATE_TETHERED:
-            case IpServer.STATE_LOCAL_ONLY:
-                which = TetherMasterSM.EVENT_IFACE_SERVING_STATE_ACTIVE;
-                break;
-            default:
-                Log.wtf(TAG, "Unknown interface state: " + state);
-                return;
-        }
-        mTetherMasterSM.sendMessage(which, state, 0, who);
-        sendTetherStateChangedBroadcast();
-    }
-
-    private void notifyLinkPropertiesChanged(IpServer who, LinkProperties newLp) {
-        final String iface = who.interfaceName();
-        final int state;
-        synchronized (mPublicSync) {
-            final TetherState tetherState = mTetherStates.get(iface);
-            if (tetherState != null && tetherState.ipServer.equals(who)) {
-                state = tetherState.lastState;
-            } else {
-                mLog.log("got notification from stale iface " + iface);
-                return;
-            }
-        }
-
-        mLog.log(String.format(
-                "OBSERVED LinkProperties update iface=%s state=%s lp=%s",
-                iface, IpServer.getStateString(state), newLp));
-        final int which = TetherMasterSM.EVENT_IFACE_UPDATE_LINKPROPERTIES;
-        mTetherMasterSM.sendMessage(which, state, 0, newLp);
-    }
-
-    private void maybeTrackNewInterfaceLocked(final String iface) {
-        // If we don't care about this type of interface, ignore.
-        final int interfaceType = ifaceNameToType(iface);
-        if (interfaceType == TETHERING_INVALID) {
-            mLog.log(iface + " is not a tetherable iface, ignoring");
-            return;
-        }
-        maybeTrackNewInterfaceLocked(iface, interfaceType);
-    }
-
-    private void maybeTrackNewInterfaceLocked(final String iface, int interfaceType) {
-        // If we have already started a TISM for this interface, skip.
-        if (mTetherStates.containsKey(iface)) {
-            mLog.log("active iface (" + iface + ") reported as added, ignoring");
-            return;
-        }
-
-        mLog.log("adding TetheringInterfaceStateMachine for: " + iface);
-        final TetherState tetherState = new TetherState(
-                new IpServer(iface, mLooper, interfaceType, mLog, mNetd,
-                             makeControlCallback(), mConfig.enableLegacyDhcpServer,
-                             mDeps.getIpServerDependencies()));
-        mTetherStates.put(iface, tetherState);
-        tetherState.ipServer.start();
-    }
-
-    private void stopTrackingInterfaceLocked(final String iface) {
-        final TetherState tetherState = mTetherStates.get(iface);
-        if (tetherState == null) {
-            mLog.log("attempting to remove unknown iface (" + iface + "), ignoring");
-            return;
-        }
-        tetherState.ipServer.stop();
-        mLog.log("removing TetheringInterfaceStateMachine for: " + iface);
-        mTetherStates.remove(iface);
-    }
-
-    private static String[] copy(String[] strarray) {
-        return Arrays.copyOf(strarray, strarray.length);
-    }
-}
diff --git a/packages/Tethering/src/com/android/server/connectivity/tethering/TetheringConfiguration.java b/packages/Tethering/src/com/android/server/connectivity/tethering/TetheringConfiguration.java
deleted file mode 100644
index 7e9e26f..0000000
--- a/packages/Tethering/src/com/android/server/connectivity/tethering/TetheringConfiguration.java
+++ /dev/null
@@ -1,416 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.connectivity.tethering;
-
-import static android.content.Context.TELEPHONY_SERVICE;
-import static android.net.ConnectivityManager.TYPE_ETHERNET;
-import static android.net.ConnectivityManager.TYPE_MOBILE;
-import static android.net.ConnectivityManager.TYPE_MOBILE_DUN;
-import static android.net.ConnectivityManager.TYPE_MOBILE_HIPRI;
-import static android.provider.DeviceConfig.NAMESPACE_CONNECTIVITY;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.net.TetheringConfigurationParcel;
-import android.net.util.SharedLog;
-import android.provider.DeviceConfig;
-import android.telephony.SubscriptionManager;
-import android.telephony.TelephonyManager;
-import android.text.TextUtils;
-
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.networkstack.tethering.R;
-
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.StringJoiner;
-
-
-/**
- * A utility class to encapsulate the various tethering configuration elements.
- *
- * This configuration data includes elements describing upstream properties
- * (preferred and required types of upstream connectivity as well as default
- * DNS servers to use if none are available) and downstream properties (such
- * as regular expressions use to match suitable downstream interfaces and the
- * DHCPv4 ranges to use).
- *
- * @hide
- */
-public class TetheringConfiguration {
-    private static final String TAG = TetheringConfiguration.class.getSimpleName();
-
-    private static final String[] EMPTY_STRING_ARRAY = new String[0];
-
-    // Default ranges used for the legacy DHCP server.
-    // USB is  192.168.42.1 and 255.255.255.0
-    // Wifi is 192.168.43.1 and 255.255.255.0
-    // BT is limited to max default of 5 connections. 192.168.44.1 to 192.168.48.1
-    // with 255.255.255.0
-    // P2P is 192.168.49.1 and 255.255.255.0
-    private static final String[] LEGACY_DHCP_DEFAULT_RANGE = {
-        "192.168.42.2", "192.168.42.254", "192.168.43.2", "192.168.43.254",
-        "192.168.44.2", "192.168.44.254", "192.168.45.2", "192.168.45.254",
-        "192.168.46.2", "192.168.46.254", "192.168.47.2", "192.168.47.254",
-        "192.168.48.2", "192.168.48.254", "192.168.49.2", "192.168.49.254",
-    };
-
-    private static final String[] DEFAULT_IPV4_DNS = {"8.8.4.4", "8.8.8.8"};
-
-    /**
-     * Use the old dnsmasq DHCP server for tethering instead of the framework implementation.
-     */
-    public static final String TETHER_ENABLE_LEGACY_DHCP_SERVER =
-            "tether_enable_legacy_dhcp_server";
-
-    public final String[] tetherableUsbRegexs;
-    public final String[] tetherableWifiRegexs;
-    public final String[] tetherableWifiP2pRegexs;
-    public final String[] tetherableBluetoothRegexs;
-    public final String[] tetherableNcmRegexs;
-    public final boolean isDunRequired;
-    public final boolean chooseUpstreamAutomatically;
-    public final Collection<Integer> preferredUpstreamIfaceTypes;
-    public final String[] legacyDhcpRanges;
-    public final String[] defaultIPv4DNS;
-    public final boolean enableLegacyDhcpServer;
-
-    public final String[] provisioningApp;
-    public final String provisioningAppNoUi;
-    public final int provisioningCheckPeriod;
-
-    public final int activeDataSubId;
-
-    public TetheringConfiguration(Context ctx, SharedLog log, int id) {
-        final SharedLog configLog = log.forSubComponent("config");
-
-        activeDataSubId = id;
-        Resources res = getResources(ctx, activeDataSubId);
-
-        tetherableUsbRegexs = getResourceStringArray(res, R.array.config_tether_usb_regexs);
-        tetherableNcmRegexs = getResourceStringArray(res, R.array.config_tether_ncm_regexs);
-        // TODO: Evaluate deleting this altogether now that Wi-Fi always passes
-        // us an interface name. Careful consideration needs to be given to
-        // implications for Settings and for provisioning checks.
-        tetherableWifiRegexs = getResourceStringArray(res, R.array.config_tether_wifi_regexs);
-        tetherableWifiP2pRegexs = getResourceStringArray(
-                res, R.array.config_tether_wifi_p2p_regexs);
-        tetherableBluetoothRegexs = getResourceStringArray(
-                res, R.array.config_tether_bluetooth_regexs);
-
-        isDunRequired = checkDunRequired(ctx);
-
-        chooseUpstreamAutomatically = getResourceBoolean(
-                res, R.bool.config_tether_upstream_automatic);
-        preferredUpstreamIfaceTypes = getUpstreamIfaceTypes(res, isDunRequired);
-
-        legacyDhcpRanges = getLegacyDhcpRanges(res);
-        defaultIPv4DNS = copy(DEFAULT_IPV4_DNS);
-        enableLegacyDhcpServer = getEnableLegacyDhcpServer(res);
-
-        provisioningApp = getResourceStringArray(res, R.array.config_mobile_hotspot_provision_app);
-        provisioningAppNoUi = getProvisioningAppNoUi(res);
-        provisioningCheckPeriod = getResourceInteger(res,
-                R.integer.config_mobile_hotspot_provision_check_period,
-                0 /* No periodic re-check */);
-
-        configLog.log(toString());
-    }
-
-    /** Check whether input interface belong to usb.*/
-    public boolean isUsb(String iface) {
-        return matchesDownstreamRegexs(iface, tetherableUsbRegexs);
-    }
-
-    /** Check whether input interface belong to wifi.*/
-    public boolean isWifi(String iface) {
-        return matchesDownstreamRegexs(iface, tetherableWifiRegexs);
-    }
-
-    /** Check whether this interface is Wifi P2P interface. */
-    public boolean isWifiP2p(String iface) {
-        return matchesDownstreamRegexs(iface, tetherableWifiP2pRegexs);
-    }
-
-    /** Check whether using legacy mode for wifi P2P. */
-    public boolean isWifiP2pLegacyTetheringMode() {
-        return (tetherableWifiP2pRegexs == null || tetherableWifiP2pRegexs.length == 0);
-    }
-
-    /** Check whether input interface belong to bluetooth.*/
-    public boolean isBluetooth(String iface) {
-        return matchesDownstreamRegexs(iface, tetherableBluetoothRegexs);
-    }
-
-    /** Check if interface is ncm */
-    public boolean isNcm(String iface) {
-        return matchesDownstreamRegexs(iface, tetherableNcmRegexs);
-    }
-
-    /** Check whether no ui entitlement application is available.*/
-    public boolean hasMobileHotspotProvisionApp() {
-        return !TextUtils.isEmpty(provisioningAppNoUi);
-    }
-
-    /** Does the dumping.*/
-    public void dump(PrintWriter pw) {
-        pw.print("activeDataSubId: ");
-        pw.println(activeDataSubId);
-
-        dumpStringArray(pw, "tetherableUsbRegexs", tetherableUsbRegexs);
-        dumpStringArray(pw, "tetherableWifiRegexs", tetherableWifiRegexs);
-        dumpStringArray(pw, "tetherableWifiP2pRegexs", tetherableWifiP2pRegexs);
-        dumpStringArray(pw, "tetherableBluetoothRegexs", tetherableBluetoothRegexs);
-        dumpStringArray(pw, "tetherableNcmRegexs", tetherableNcmRegexs);
-
-        pw.print("isDunRequired: ");
-        pw.println(isDunRequired);
-
-        pw.print("chooseUpstreamAutomatically: ");
-        pw.println(chooseUpstreamAutomatically);
-        pw.print("legacyPreredUpstreamIfaceTypes: ");
-        pw.println(Arrays.toString(toIntArray(preferredUpstreamIfaceTypes)));
-
-        dumpStringArray(pw, "legacyDhcpRanges", legacyDhcpRanges);
-        dumpStringArray(pw, "defaultIPv4DNS", defaultIPv4DNS);
-
-        dumpStringArray(pw, "provisioningApp", provisioningApp);
-        pw.print("provisioningAppNoUi: ");
-        pw.println(provisioningAppNoUi);
-
-        pw.print("enableLegacyDhcpServer: ");
-        pw.println(enableLegacyDhcpServer);
-    }
-
-    /** Returns the string representation of this object.*/
-    public String toString() {
-        final StringJoiner sj = new StringJoiner(" ");
-        sj.add(String.format("activeDataSubId:%d", activeDataSubId));
-        sj.add(String.format("tetherableUsbRegexs:%s", makeString(tetherableUsbRegexs)));
-        sj.add(String.format("tetherableWifiRegexs:%s", makeString(tetherableWifiRegexs)));
-        sj.add(String.format("tetherableWifiP2pRegexs:%s", makeString(tetherableWifiP2pRegexs)));
-        sj.add(String.format("tetherableBluetoothRegexs:%s",
-                makeString(tetherableBluetoothRegexs)));
-        sj.add(String.format("isDunRequired:%s", isDunRequired));
-        sj.add(String.format("chooseUpstreamAutomatically:%s", chooseUpstreamAutomatically));
-        sj.add(String.format("preferredUpstreamIfaceTypes:%s",
-                toIntArray(preferredUpstreamIfaceTypes)));
-        sj.add(String.format("provisioningApp:%s", makeString(provisioningApp)));
-        sj.add(String.format("provisioningAppNoUi:%s", provisioningAppNoUi));
-        sj.add(String.format("enableLegacyDhcpServer:%s", enableLegacyDhcpServer));
-        return String.format("TetheringConfiguration{%s}", sj.toString());
-    }
-
-    private static void dumpStringArray(PrintWriter pw, String label, String[] values) {
-        pw.print(label);
-        pw.print(": ");
-
-        if (values != null) {
-            final StringJoiner sj = new StringJoiner(", ", "[", "]");
-            for (String value : values) sj.add(value);
-            pw.print(sj.toString());
-        } else {
-            pw.print("null");
-        }
-
-        pw.println();
-    }
-
-    private static String makeString(String[] strings) {
-        if (strings == null) return "null";
-        final StringJoiner sj = new StringJoiner(",", "[", "]");
-        for (String s : strings) sj.add(s);
-        return sj.toString();
-    }
-
-    /** Check whether dun is required. */
-    public static boolean checkDunRequired(Context ctx) {
-        final TelephonyManager tm = (TelephonyManager) ctx.getSystemService(TELEPHONY_SERVICE);
-        // TelephonyManager would uses the active data subscription, which should be the one used
-        // by tethering.
-        return (tm != null) ? tm.isTetheringApnRequired() : false;
-    }
-
-    private static Collection<Integer> getUpstreamIfaceTypes(Resources res, boolean dunRequired) {
-        final int[] ifaceTypes = res.getIntArray(R.array.config_tether_upstream_types);
-        final ArrayList<Integer> upstreamIfaceTypes = new ArrayList<>(ifaceTypes.length);
-        for (int i : ifaceTypes) {
-            switch (i) {
-                case TYPE_MOBILE:
-                case TYPE_MOBILE_HIPRI:
-                    if (dunRequired) continue;
-                    break;
-                case TYPE_MOBILE_DUN:
-                    if (!dunRequired) continue;
-                    break;
-            }
-            upstreamIfaceTypes.add(i);
-        }
-
-        // Fix up upstream interface types for DUN or mobile. NOTE: independent
-        // of the value of |dunRequired|, cell data of one form or another is
-        // *always* an upstream, regardless of the upstream interface types
-        // specified by configuration resources.
-        if (dunRequired) {
-            appendIfNotPresent(upstreamIfaceTypes, TYPE_MOBILE_DUN);
-        } else {
-            // Do not modify if a cellular interface type is already present in the
-            // upstream interface types. Add TYPE_MOBILE and TYPE_MOBILE_HIPRI if no
-            // cellular interface types are found in the upstream interface types.
-            // This preserves backwards compatibility and prevents the DUN and default
-            // mobile types incorrectly appearing together, which could happen on
-            // previous releases in the common case where checkDunRequired returned
-            // DUN_UNSPECIFIED.
-            if (!containsOneOf(upstreamIfaceTypes, TYPE_MOBILE, TYPE_MOBILE_HIPRI)) {
-                upstreamIfaceTypes.add(TYPE_MOBILE);
-                upstreamIfaceTypes.add(TYPE_MOBILE_HIPRI);
-            }
-        }
-
-        // Always make sure our good friend Ethernet is present.
-        // TODO: consider unilaterally forcing this at the front.
-        prependIfNotPresent(upstreamIfaceTypes, TYPE_ETHERNET);
-
-        return upstreamIfaceTypes;
-    }
-
-    private static boolean matchesDownstreamRegexs(String iface, String[] regexs) {
-        for (String regex : regexs) {
-            if (iface.matches(regex)) return true;
-        }
-        return false;
-    }
-
-    private static String[] getLegacyDhcpRanges(Resources res) {
-        final String[] fromResource = getResourceStringArray(res, R.array.config_tether_dhcp_range);
-        if ((fromResource.length > 0) && (fromResource.length % 2 == 0)) {
-            return fromResource;
-        }
-        return copy(LEGACY_DHCP_DEFAULT_RANGE);
-    }
-
-    private static String getProvisioningAppNoUi(Resources res) {
-        try {
-            return res.getString(R.string.config_mobile_hotspot_provision_app_no_ui);
-        } catch (Resources.NotFoundException e) {
-            return "";
-        }
-    }
-
-    private static boolean getResourceBoolean(Resources res, int resId) {
-        try {
-            return res.getBoolean(resId);
-        } catch (Resources.NotFoundException e404) {
-            return false;
-        }
-    }
-
-    private static String[] getResourceStringArray(Resources res, int resId) {
-        try {
-            final String[] strArray = res.getStringArray(resId);
-            return (strArray != null) ? strArray : EMPTY_STRING_ARRAY;
-        } catch (Resources.NotFoundException e404) {
-            return EMPTY_STRING_ARRAY;
-        }
-    }
-
-    private static int getResourceInteger(Resources res, int resId, int defaultValue) {
-        try {
-            return res.getInteger(resId);
-        } catch (Resources.NotFoundException e404) {
-            return defaultValue;
-        }
-    }
-
-    private boolean getEnableLegacyDhcpServer(final Resources res) {
-        return getResourceBoolean(res, R.bool.config_tether_enable_legacy_dhcp_server)
-                || getDeviceConfigBoolean(TETHER_ENABLE_LEGACY_DHCP_SERVER);
-    }
-
-    @VisibleForTesting
-    protected boolean getDeviceConfigBoolean(final String name) {
-        return DeviceConfig.getBoolean(NAMESPACE_CONNECTIVITY, name, false /** defaultValue */);
-    }
-
-    private Resources getResources(Context ctx, int subId) {
-        if (subId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
-            return getResourcesForSubIdWrapper(ctx, subId);
-        } else {
-            return ctx.getResources();
-        }
-    }
-
-    @VisibleForTesting
-    protected Resources getResourcesForSubIdWrapper(Context ctx, int subId) {
-        return SubscriptionManager.getResourcesForSubId(ctx, subId);
-    }
-
-    private static String[] copy(String[] strarray) {
-        return Arrays.copyOf(strarray, strarray.length);
-    }
-
-    private static void prependIfNotPresent(ArrayList<Integer> list, int value) {
-        if (list.contains(value)) return;
-        list.add(0, value);
-    }
-
-    private static void appendIfNotPresent(ArrayList<Integer> list, int value) {
-        if (list.contains(value)) return;
-        list.add(value);
-    }
-
-    private static boolean containsOneOf(ArrayList<Integer> list, Integer... values) {
-        for (Integer value : values) {
-            if (list.contains(value)) return true;
-        }
-        return false;
-    }
-
-    private static int[] toIntArray(Collection<Integer> values) {
-        final int[] result = new int[values.size()];
-        int index = 0;
-        for (Integer value : values) {
-            result[index++] = value;
-        }
-        return result;
-    }
-
-    /**
-     * Convert this TetheringConfiguration to a TetheringConfigurationParcel.
-     */
-    public TetheringConfigurationParcel toStableParcelable() {
-        final TetheringConfigurationParcel parcel = new TetheringConfigurationParcel();
-        parcel.subId = activeDataSubId;
-        parcel.tetherableUsbRegexs = tetherableUsbRegexs;
-        parcel.tetherableWifiRegexs = tetherableWifiRegexs;
-        parcel.tetherableBluetoothRegexs = tetherableBluetoothRegexs;
-        parcel.isDunRequired = isDunRequired;
-        parcel.chooseUpstreamAutomatically = chooseUpstreamAutomatically;
-
-        parcel.preferredUpstreamIfaceTypes = toIntArray(preferredUpstreamIfaceTypes);
-
-        parcel.legacyDhcpRanges = legacyDhcpRanges;
-        parcel.defaultIPv4DNS = defaultIPv4DNS;
-        parcel.enableLegacyDhcpServer = enableLegacyDhcpServer;
-        parcel.provisioningApp = provisioningApp;
-        parcel.provisioningAppNoUi = provisioningAppNoUi;
-        parcel.provisioningCheckPeriod = provisioningCheckPeriod;
-        return parcel;
-    }
-}
diff --git a/packages/Tethering/src/com/android/server/connectivity/tethering/TetheringDependencies.java b/packages/Tethering/src/com/android/server/connectivity/tethering/TetheringDependencies.java
deleted file mode 100644
index 0330dad..0000000
--- a/packages/Tethering/src/com/android/server/connectivity/tethering/TetheringDependencies.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.connectivity.tethering;
-
-import android.bluetooth.BluetoothAdapter;
-import android.content.Context;
-import android.net.INetd;
-import android.net.NetworkRequest;
-import android.net.ip.IpServer;
-import android.net.util.SharedLog;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.Looper;
-
-import androidx.annotation.NonNull;
-
-import com.android.internal.util.StateMachine;
-
-import java.util.ArrayList;
-
-
-/**
- * Capture tethering dependencies, for injection.
- *
- * @hide
- */
-public abstract class TetheringDependencies {
-    /**
-     * Get a reference to the offload hardware interface to be used by tethering.
-     */
-    public OffloadHardwareInterface getOffloadHardwareInterface(Handler h, SharedLog log) {
-        return new OffloadHardwareInterface(h, log);
-    }
-
-    /**
-     * Get a reference to the UpstreamNetworkMonitor to be used by tethering.
-     */
-    public UpstreamNetworkMonitor getUpstreamNetworkMonitor(Context ctx, StateMachine target,
-            SharedLog log, int what) {
-        return new UpstreamNetworkMonitor(ctx, target, log, what);
-    }
-
-    /**
-     * Get a reference to the IPv6TetheringCoordinator to be used by tethering.
-     */
-    public IPv6TetheringCoordinator getIPv6TetheringCoordinator(
-            ArrayList<IpServer> notifyList, SharedLog log) {
-        return new IPv6TetheringCoordinator(notifyList, log);
-    }
-
-    /**
-     * Get dependencies to be used by IpServer.
-     */
-    public abstract IpServer.Dependencies getIpServerDependencies();
-
-    /**
-     * Indicates whether tethering is supported on the device.
-     */
-    public boolean isTetheringSupported() {
-        return true;
-    }
-
-    /**
-     * Get the NetworkRequest that should be fulfilled by the default network.
-     */
-    public abstract NetworkRequest getDefaultNetworkRequest();
-
-    /**
-     * Get a reference to the EntitlementManager to be used by tethering.
-     */
-    public EntitlementManager getEntitlementManager(Context ctx, StateMachine target,
-            SharedLog log, int what) {
-        return new EntitlementManager(ctx, target, log, what);
-    }
-
-    /**
-     * Generate a new TetheringConfiguration according to input sub Id.
-     */
-    public TetheringConfiguration generateTetheringConfiguration(Context ctx, SharedLog log,
-            int subId) {
-        return new TetheringConfiguration(ctx, log, subId);
-    }
-
-    /**
-     * Get a reference to INetd to be used by tethering.
-     */
-    public INetd getINetd(Context context) {
-        return INetd.Stub.asInterface(
-                (IBinder) context.getSystemService(Context.NETD_SERVICE));
-    }
-
-    /**
-     * Get a reference to the TetheringNotificationUpdater to be used by tethering.
-     */
-    public TetheringNotificationUpdater getNotificationUpdater(@NonNull final Context ctx) {
-        return new TetheringNotificationUpdater(ctx);
-    }
-
-    /**
-     * Get tethering thread looper.
-     */
-    public abstract Looper getTetheringLooper();
-
-    /**
-     *  Get Context of TetheringSerice.
-     */
-    public abstract Context getContext();
-
-    /**
-     * Get a reference to BluetoothAdapter to be used by tethering.
-     */
-    public abstract BluetoothAdapter getBluetoothAdapter();
-}
diff --git a/packages/Tethering/src/com/android/server/connectivity/tethering/TetheringInterfaceUtils.java b/packages/Tethering/src/com/android/server/connectivity/tethering/TetheringInterfaceUtils.java
deleted file mode 100644
index 4dd6830..0000000
--- a/packages/Tethering/src/com/android/server/connectivity/tethering/TetheringInterfaceUtils.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.connectivity.tethering;
-
-import android.annotation.Nullable;
-import android.net.LinkProperties;
-import android.net.NetworkCapabilities;
-import android.net.RouteInfo;
-import android.net.util.InterfaceSet;
-
-import com.android.net.module.util.NetUtils;
-
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-
-/**
- * @hide
- */
-public final class TetheringInterfaceUtils {
-    private static final InetAddress IN6ADDR_ANY = getByAddress(
-            new byte[] {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0});
-    private static final InetAddress INADDR_ANY = getByAddress(new byte[] {0, 0, 0, 0});
-
-    /**
-     * Get upstream interfaces for tethering based on default routes for IPv4/IPv6.
-     * @return null if there is no usable interface, or a set of at least one interface otherwise.
-     */
-    public static @Nullable InterfaceSet getTetheringInterfaces(UpstreamNetworkState ns) {
-        if (ns == null) {
-            return null;
-        }
-
-        final LinkProperties lp = ns.linkProperties;
-        final String if4 = getInterfaceForDestination(lp, INADDR_ANY);
-        final String if6 = getIPv6Interface(ns);
-
-        return (if4 == null && if6 == null) ? null : new InterfaceSet(if4, if6);
-    }
-
-    /**
-     * Get the upstream interface for IPv6 tethering.
-     * @return null if there is no usable interface, or the interface name otherwise.
-     */
-    public static @Nullable String getIPv6Interface(UpstreamNetworkState ns) {
-        // Broadly speaking:
-        //
-        //     [1] does the upstream have an IPv6 default route?
-        //
-        // and
-        //
-        //     [2] does the upstream have one or more global IPv6 /64s
-        //         dedicated to this device?
-        //
-        // In lieu of Prefix Delegation and other evaluation of whether a
-        // prefix may or may not be dedicated to this device, for now just
-        // check whether the upstream is TRANSPORT_CELLULAR. This works
-        // because "[t]he 3GPP network allocates each default bearer a unique
-        // /64 prefix", per RFC 6459, Section 5.2.
-        final boolean canTether =
-                (ns != null) && (ns.network != null)
-                && (ns.linkProperties != null) && (ns.networkCapabilities != null)
-                // At least one upstream DNS server:
-                && ns.linkProperties.hasIpv6DnsServer()
-                // Minimal amount of IPv6 provisioning:
-                && ns.linkProperties.hasGlobalIpv6Address()
-                // Temporary approximation of "dedicated prefix":
-                && ns.networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR);
-
-        return canTether
-                ? getInterfaceForDestination(ns.linkProperties, IN6ADDR_ANY)
-                : null;
-    }
-
-    private static String getInterfaceForDestination(LinkProperties lp, InetAddress dst) {
-        final RouteInfo ri = (lp != null)
-                ? NetUtils.selectBestRoute(lp.getAllRoutes(), dst)
-                : null;
-        return (ri != null) ? ri.getInterface() : null;
-    }
-
-    private static InetAddress getByAddress(final byte[] addr) {
-        try {
-            return InetAddress.getByAddress(null, addr);
-        } catch (UnknownHostException e) {
-            throw new AssertionError("illegal address length" + addr.length);
-        }
-    }
-}
diff --git a/packages/Tethering/src/com/android/server/connectivity/tethering/TetheringNotificationUpdater.java b/packages/Tethering/src/com/android/server/connectivity/tethering/TetheringNotificationUpdater.java
deleted file mode 100644
index 992cdd8..0000000
--- a/packages/Tethering/src/com/android/server/connectivity/tethering/TetheringNotificationUpdater.java
+++ /dev/null
@@ -1,244 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.connectivity.tethering;
-
-import static android.net.TetheringManager.TETHERING_BLUETOOTH;
-import static android.net.TetheringManager.TETHERING_USB;
-import static android.net.TetheringManager.TETHERING_WIFI;
-
-import android.app.Notification;
-import android.app.NotificationChannel;
-import android.app.NotificationManager;
-import android.app.PendingIntent;
-import android.content.Context;
-import android.content.Intent;
-import android.content.res.Resources;
-import android.os.UserHandle;
-import android.provider.Settings;
-import android.telephony.SubscriptionManager;
-import android.text.TextUtils;
-import android.util.Log;
-import android.util.SparseArray;
-
-import androidx.annotation.ArrayRes;
-import androidx.annotation.DrawableRes;
-import androidx.annotation.IntDef;
-import androidx.annotation.IntRange;
-import androidx.annotation.NonNull;
-
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.networkstack.tethering.R;
-
-/**
- * A class to display tethering-related notifications.
- *
- * <p>This class is not thread safe, it is intended to be used only from the tethering handler
- * thread. However the constructor is an exception, as it is called on another thread ;
- * therefore for thread safety all members of this class MUST either be final or initialized
- * to their default value (0, false or null).
- *
- * @hide
- */
-public class TetheringNotificationUpdater {
-    private static final String TAG = TetheringNotificationUpdater.class.getSimpleName();
-    private static final String CHANNEL_ID = "TETHERING_STATUS";
-    private static final String WIFI_DOWNSTREAM = "WIFI";
-    private static final String USB_DOWNSTREAM = "USB";
-    private static final String BLUETOOTH_DOWNSTREAM = "BT";
-    private static final boolean NOTIFY_DONE = true;
-    private static final boolean NO_NOTIFY = false;
-    // Id to update and cancel tethering notification. Must be unique within the tethering app.
-    private static final int ENABLE_NOTIFICATION_ID = 1000;
-    // Id to update and cancel restricted notification. Must be unique within the tethering app.
-    private static final int RESTRICTED_NOTIFICATION_ID = 1001;
-    @VisibleForTesting
-    static final int NO_ICON_ID = 0;
-    @VisibleForTesting
-    static final int DOWNSTREAM_NONE = 0;
-    private final Context mContext;
-    private final NotificationManager mNotificationManager;
-    private final NotificationChannel mChannel;
-
-    // WARNING : the constructor is called on a different thread. Thread safety therefore
-    // relies on this value being initialized to 0, and not any other value. If you need
-    // to change this, you will need to change the thread where the constructor is invoked,
-    // or to introduce synchronization.
-    // Downstream type is one of ConnectivityManager.TETHERING_* constants, 0 1 or 2.
-    // This value has to be made 1 2 and 4, and OR'd with the others.
-    private int mDownstreamTypesMask = DOWNSTREAM_NONE;
-
-    // WARNING : this value is not able to being initialized to 0 and must have volatile because
-    // telephony service is not guaranteed that is up before tethering service starts. If telephony
-    // is up later than tethering, TetheringNotificationUpdater will use incorrect and valid
-    // subscription id(0) to query resources. Therefore, initialized subscription id must be
-    // INVALID_SUBSCRIPTION_ID.
-    private volatile int mActiveDataSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
-
-    @IntDef({ENABLE_NOTIFICATION_ID, RESTRICTED_NOTIFICATION_ID})
-    @interface NotificationId {}
-
-    public TetheringNotificationUpdater(@NonNull final Context context) {
-        mContext = context;
-        mNotificationManager = (NotificationManager) context.createContextAsUser(UserHandle.ALL, 0)
-                .getSystemService(Context.NOTIFICATION_SERVICE);
-        mChannel = new NotificationChannel(
-                CHANNEL_ID,
-                context.getResources().getString(R.string.notification_channel_tethering_status),
-                NotificationManager.IMPORTANCE_LOW);
-        mNotificationManager.createNotificationChannel(mChannel);
-    }
-
-    /** Called when downstream has changed */
-    public void onDownstreamChanged(@IntRange(from = 0, to = 7) final int downstreamTypesMask) {
-        if (mDownstreamTypesMask == downstreamTypesMask) return;
-        mDownstreamTypesMask = downstreamTypesMask;
-        updateEnableNotification();
-    }
-
-    /** Called when active data subscription id changed */
-    public void onActiveDataSubscriptionIdChanged(final int subId) {
-        if (mActiveDataSubId == subId) return;
-        mActiveDataSubId = subId;
-        updateEnableNotification();
-    }
-
-    @VisibleForTesting
-    Resources getResourcesForSubId(@NonNull final Context c, final int subId) {
-        return SubscriptionManager.getResourcesForSubId(c, subId);
-    }
-
-    private void updateEnableNotification() {
-        final boolean tetheringInactive = mDownstreamTypesMask <= DOWNSTREAM_NONE;
-
-        if (tetheringInactive || setupNotification() == NO_NOTIFY) {
-            clearNotification(ENABLE_NOTIFICATION_ID);
-        }
-    }
-
-    @VisibleForTesting
-    void tetheringRestrictionLifted() {
-        clearNotification(RESTRICTED_NOTIFICATION_ID);
-    }
-
-    private void clearNotification(@NotificationId final int id) {
-        mNotificationManager.cancel(null /* tag */, id);
-    }
-
-    @VisibleForTesting
-    void notifyTetheringDisabledByRestriction() {
-        final Resources res = getResourcesForSubId(mContext, mActiveDataSubId);
-        final String title = res.getString(R.string.disable_tether_notification_title);
-        final String message = res.getString(R.string.disable_tether_notification_message);
-
-        showNotification(R.drawable.stat_sys_tether_general, title, message,
-                RESTRICTED_NOTIFICATION_ID);
-    }
-
-    /**
-     * Returns the downstream types mask which convert from given string.
-     *
-     * @param types This string has to be made by "WIFI", "USB", "BT", and OR'd with the others.
-     *
-     * @return downstream types mask value.
-     */
-    @VisibleForTesting
-    @IntRange(from = 0, to = 7)
-    int getDownstreamTypesMask(@NonNull final String types) {
-        int downstreamTypesMask = DOWNSTREAM_NONE;
-        final String[] downstreams = types.split("\\|");
-        for (String downstream : downstreams) {
-            if (USB_DOWNSTREAM.equals(downstream.trim())) {
-                downstreamTypesMask |= (1 << TETHERING_USB);
-            } else if (WIFI_DOWNSTREAM.equals(downstream.trim())) {
-                downstreamTypesMask |= (1 << TETHERING_WIFI);
-            } else if (BLUETOOTH_DOWNSTREAM.equals(downstream.trim())) {
-                downstreamTypesMask |= (1 << TETHERING_BLUETOOTH);
-            }
-        }
-        return downstreamTypesMask;
-    }
-
-    /**
-     * Returns the icons {@link android.util.SparseArray} which get from given string-array resource
-     * id.
-     *
-     * @param id String-array resource id
-     *
-     * @return {@link android.util.SparseArray} with downstream types and icon id info.
-     */
-    @VisibleForTesting
-    SparseArray<Integer> getIcons(@ArrayRes int id, @NonNull Resources res) {
-        final String[] array = res.getStringArray(id);
-        final SparseArray<Integer> icons = new SparseArray<>();
-        for (String config : array) {
-            if (TextUtils.isEmpty(config)) continue;
-
-            final String[] elements = config.split(";");
-            if (elements.length != 2) {
-                Log.wtf(TAG,
-                        "Unexpected format in Tethering notification configuration : " + config);
-                continue;
-            }
-
-            final String[] types = elements[0].split(",");
-            for (String type : types) {
-                int mask = getDownstreamTypesMask(type);
-                if (mask == DOWNSTREAM_NONE) continue;
-                icons.put(mask, res.getIdentifier(
-                        elements[1].trim(), null /* defType */, null /* defPackage */));
-            }
-        }
-        return icons;
-    }
-
-    private boolean setupNotification() {
-        final Resources res = getResourcesForSubId(mContext, mActiveDataSubId);
-        final SparseArray<Integer> downstreamIcons =
-                getIcons(R.array.tethering_notification_icons, res);
-
-        final int iconId = downstreamIcons.get(mDownstreamTypesMask, NO_ICON_ID);
-        if (iconId == NO_ICON_ID) return NO_NOTIFY;
-
-        final String title = res.getString(R.string.tethering_notification_title);
-        final String message = res.getString(R.string.tethering_notification_message);
-
-        showNotification(iconId, title, message, ENABLE_NOTIFICATION_ID);
-        return NOTIFY_DONE;
-    }
-
-    private void showNotification(@DrawableRes final int iconId, @NonNull final String title,
-            @NonNull final String message, @NotificationId final int id) {
-        final Intent intent = new Intent(Settings.ACTION_TETHER_SETTINGS);
-        final PendingIntent pi = PendingIntent.getActivity(
-                mContext.createContextAsUser(UserHandle.CURRENT, 0),
-                0 /* requestCode */, intent, 0 /* flags */, null /* options */);
-        final Notification notification =
-                new Notification.Builder(mContext, mChannel.getId())
-                        .setSmallIcon(iconId)
-                        .setContentTitle(title)
-                        .setContentText(message)
-                        .setOngoing(true)
-                        .setColor(mContext.getColor(
-                                android.R.color.system_notification_accent_color))
-                        .setVisibility(Notification.VISIBILITY_PUBLIC)
-                        .setCategory(Notification.CATEGORY_STATUS)
-                        .setContentIntent(pi)
-                        .build();
-
-        mNotificationManager.notify(null /* tag */, id, notification);
-    }
-}
diff --git a/packages/Tethering/src/com/android/server/connectivity/tethering/TetheringService.java b/packages/Tethering/src/com/android/server/connectivity/tethering/TetheringService.java
deleted file mode 100644
index c30be25..0000000
--- a/packages/Tethering/src/com/android/server/connectivity/tethering/TetheringService.java
+++ /dev/null
@@ -1,391 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.connectivity.tethering;
-
-import static android.content.pm.PackageManager.PERMISSION_GRANTED;
-import static android.net.TetheringManager.TETHER_ERROR_NO_ACCESS_TETHERING_PERMISSION;
-import static android.net.TetheringManager.TETHER_ERROR_NO_CHANGE_TETHERING_PERMISSION;
-import static android.net.TetheringManager.TETHER_ERROR_NO_ERROR;
-import static android.net.TetheringManager.TETHER_ERROR_UNSUPPORTED;
-import static android.net.dhcp.IDhcpServer.STATUS_UNKNOWN_ERROR;
-
-import android.app.Service;
-import android.bluetooth.BluetoothAdapter;
-import android.content.Context;
-import android.content.Intent;
-import android.net.IIntResultListener;
-import android.net.INetworkStackConnector;
-import android.net.ITetheringConnector;
-import android.net.ITetheringEventCallback;
-import android.net.NetworkCapabilities;
-import android.net.NetworkRequest;
-import android.net.NetworkStack;
-import android.net.TetheringRequestParcel;
-import android.net.dhcp.DhcpServerCallbacks;
-import android.net.dhcp.DhcpServingParamsParcel;
-import android.net.ip.IpServer;
-import android.net.util.SharedLog;
-import android.os.Binder;
-import android.os.HandlerThread;
-import android.os.IBinder;
-import android.os.Looper;
-import android.os.RemoteException;
-import android.os.ResultReceiver;
-import android.os.SystemProperties;
-import android.os.UserManager;
-import android.provider.Settings;
-import android.util.Log;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-import com.android.internal.annotations.VisibleForTesting;
-
-import java.io.FileDescriptor;
-import java.io.PrintWriter;
-
-/**
- * Android service used to manage tethering.
- *
- * <p>The service returns a binder for the system server to communicate with the tethering.
- */
-public class TetheringService extends Service {
-    private static final String TAG = TetheringService.class.getSimpleName();
-
-    private final SharedLog mLog = new SharedLog(TAG);
-    private TetheringConnector mConnector;
-    private Context mContext;
-    private TetheringDependencies mDeps;
-    private Tethering mTethering;
-    private UserManager mUserManager;
-
-    @Override
-    public void onCreate() {
-        mLog.mark("onCreate");
-        mDeps = getTetheringDependencies();
-        mContext = mDeps.getContext();
-        mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
-        mTethering = makeTethering(mDeps);
-        mTethering.startStateMachineUpdaters();
-    }
-
-    /**
-     * Make a reference to Tethering object.
-     */
-    @VisibleForTesting
-    public Tethering makeTethering(TetheringDependencies deps) {
-        System.loadLibrary("tetherutilsjni");
-        return new Tethering(deps);
-    }
-
-    /**
-     * Create a binder connector for the system server to communicate with the tethering.
-     */
-    private synchronized IBinder makeConnector() {
-        if (mConnector == null) {
-            mConnector = new TetheringConnector(mTethering, TetheringService.this);
-        }
-        return mConnector;
-    }
-
-    @NonNull
-    @Override
-    public IBinder onBind(Intent intent) {
-        mLog.mark("onBind");
-        return makeConnector();
-    }
-
-    private static class TetheringConnector extends ITetheringConnector.Stub {
-        private final TetheringService mService;
-        private final Tethering mTethering;
-
-        TetheringConnector(Tethering tether, TetheringService service) {
-            mTethering = tether;
-            mService = service;
-        }
-
-        @Override
-        public void tether(String iface, String callerPkg, IIntResultListener listener) {
-            if (checkAndNotifyCommonError(callerPkg, listener)) return;
-
-            try {
-                listener.onResult(mTethering.tether(iface));
-            } catch (RemoteException e) { }
-        }
-
-        @Override
-        public void untether(String iface, String callerPkg, IIntResultListener listener) {
-            if (checkAndNotifyCommonError(callerPkg, listener)) return;
-
-            try {
-                listener.onResult(mTethering.untether(iface));
-            } catch (RemoteException e) { }
-        }
-
-        @Override
-        public void setUsbTethering(boolean enable, String callerPkg, IIntResultListener listener) {
-            if (checkAndNotifyCommonError(callerPkg, listener)) return;
-
-            try {
-                listener.onResult(mTethering.setUsbTethering(enable));
-            } catch (RemoteException e) { }
-        }
-
-        @Override
-        public void startTethering(TetheringRequestParcel request, String callerPkg,
-                IIntResultListener listener) {
-            if (checkAndNotifyCommonError(callerPkg, listener)) return;
-
-            mTethering.startTethering(request, listener);
-        }
-
-        @Override
-        public void stopTethering(int type, String callerPkg, IIntResultListener listener) {
-            if (checkAndNotifyCommonError(callerPkg, listener)) return;
-
-            try {
-                mTethering.stopTethering(type);
-                listener.onResult(TETHER_ERROR_NO_ERROR);
-            } catch (RemoteException e) { }
-        }
-
-        @Override
-        public void requestLatestTetheringEntitlementResult(int type, ResultReceiver receiver,
-                boolean showEntitlementUi, String callerPkg) {
-            if (checkAndNotifyCommonError(callerPkg, receiver)) return;
-
-            mTethering.requestLatestTetheringEntitlementResult(type, receiver, showEntitlementUi);
-        }
-
-        @Override
-        public void registerTetheringEventCallback(ITetheringEventCallback callback,
-                String callerPkg) {
-            try {
-                if (!mService.hasTetherAccessPermission()) {
-                    callback.onCallbackStopped(TETHER_ERROR_NO_ACCESS_TETHERING_PERMISSION);
-                    return;
-                }
-                mTethering.registerTetheringEventCallback(callback);
-            } catch (RemoteException e) { }
-        }
-
-        @Override
-        public void unregisterTetheringEventCallback(ITetheringEventCallback callback,
-                String callerPkg) {
-            try {
-                if (!mService.hasTetherAccessPermission()) {
-                    callback.onCallbackStopped(TETHER_ERROR_NO_ACCESS_TETHERING_PERMISSION);
-                    return;
-                }
-                mTethering.unregisterTetheringEventCallback(callback);
-            } catch (RemoteException e) { }
-        }
-
-        @Override
-        public void stopAllTethering(String callerPkg, IIntResultListener listener) {
-            if (checkAndNotifyCommonError(callerPkg, listener)) return;
-
-            try {
-                mTethering.untetherAll();
-                listener.onResult(TETHER_ERROR_NO_ERROR);
-            } catch (RemoteException e) { }
-        }
-
-        @Override
-        public void isTetheringSupported(String callerPkg, IIntResultListener listener) {
-            if (checkAndNotifyCommonError(callerPkg, listener)) return;
-
-            try {
-                listener.onResult(TETHER_ERROR_NO_ERROR);
-            } catch (RemoteException e) { }
-        }
-
-        @Override
-        protected void dump(@NonNull FileDescriptor fd, @NonNull PrintWriter writer,
-                    @Nullable String[] args) {
-            mTethering.dump(fd, writer, args);
-        }
-
-        private boolean checkAndNotifyCommonError(String callerPkg, IIntResultListener listener) {
-            try {
-                if (!mService.hasTetherChangePermission(callerPkg)) {
-                    listener.onResult(TETHER_ERROR_NO_CHANGE_TETHERING_PERMISSION);
-                    return true;
-                }
-                if (!mService.isTetheringSupported()) {
-                    listener.onResult(TETHER_ERROR_UNSUPPORTED);
-                    return true;
-                }
-            } catch (RemoteException e) {
-                return true;
-            }
-
-            return false;
-        }
-
-        private boolean checkAndNotifyCommonError(String callerPkg, ResultReceiver receiver) {
-            if (!mService.hasTetherChangePermission(callerPkg)) {
-                receiver.send(TETHER_ERROR_NO_CHANGE_TETHERING_PERMISSION, null);
-                return true;
-            }
-            if (!mService.isTetheringSupported()) {
-                receiver.send(TETHER_ERROR_UNSUPPORTED, null);
-                return true;
-            }
-
-            return false;
-        }
-
-    }
-
-    // if ro.tether.denied = true we default to no tethering
-    // gservices could set the secure setting to 1 though to enable it on a build where it
-    // had previously been turned off.
-    private boolean isTetheringSupported() {
-        final int defaultVal =
-                SystemProperties.get("ro.tether.denied").equals("true") ? 0 : 1;
-        final boolean tetherSupported = Settings.Global.getInt(mContext.getContentResolver(),
-                Settings.Global.TETHER_SUPPORTED, defaultVal) != 0;
-        final boolean tetherEnabledInSettings = tetherSupported
-                && !mUserManager.hasUserRestriction(UserManager.DISALLOW_CONFIG_TETHERING);
-
-        return tetherEnabledInSettings && mTethering.hasTetherableConfiguration();
-    }
-
-    private boolean hasTetherChangePermission(String callerPkg) {
-        if (checkCallingOrSelfPermission(
-                android.Manifest.permission.TETHER_PRIVILEGED) == PERMISSION_GRANTED) {
-            return true;
-        }
-
-        if (mTethering.isTetherProvisioningRequired()) return false;
-
-
-        int uid = Binder.getCallingUid();
-        // If callerPkg's uid is not same as Binder.getCallingUid(),
-        // checkAndNoteWriteSettingsOperation will return false and the operation will be denied.
-        if (Settings.checkAndNoteWriteSettingsOperation(mContext, uid, callerPkg,
-                false /* throwException */)) {
-            return true;
-        }
-
-        return false;
-    }
-
-    private boolean hasTetherAccessPermission() {
-        if (checkCallingOrSelfPermission(
-                android.Manifest.permission.TETHER_PRIVILEGED) == PERMISSION_GRANTED) {
-            return true;
-        }
-
-        if (checkCallingOrSelfPermission(
-                android.Manifest.permission.ACCESS_NETWORK_STATE) == PERMISSION_GRANTED) {
-            return true;
-        }
-
-        return false;
-    }
-
-
-    /**
-     * An injection method for testing.
-     */
-    @VisibleForTesting
-    public TetheringDependencies getTetheringDependencies() {
-        if (mDeps == null) {
-            mDeps = new TetheringDependencies() {
-                @Override
-                public NetworkRequest getDefaultNetworkRequest() {
-                    // TODO: b/147280869, add a proper system API to replace this.
-                    final NetworkRequest trackDefaultRequest = new NetworkRequest.Builder()
-                            .clearCapabilities()
-                            .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)
-                            .addCapability(NetworkCapabilities.NET_CAPABILITY_TRUSTED)
-                            .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN)
-                            .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
-                            .build();
-                    return trackDefaultRequest;
-                }
-
-                @Override
-                public Looper getTetheringLooper() {
-                    final HandlerThread tetherThread = new HandlerThread("android.tethering");
-                    tetherThread.start();
-                    return tetherThread.getLooper();
-                }
-
-                @Override
-                public boolean isTetheringSupported() {
-                    return TetheringService.this.isTetheringSupported();
-                }
-
-                @Override
-                public Context getContext() {
-                    return TetheringService.this;
-                }
-
-                @Override
-                public IpServer.Dependencies getIpServerDependencies() {
-                    return new IpServer.Dependencies() {
-                        @Override
-                        public void makeDhcpServer(String ifName, DhcpServingParamsParcel params,
-                                DhcpServerCallbacks cb) {
-                            try {
-                                final INetworkStackConnector service = getNetworkStackConnector();
-                                if (service == null) return;
-
-                                service.makeDhcpServer(ifName, params, cb);
-                            } catch (RemoteException e) {
-                                Log.e(TAG, "Fail to make dhcp server");
-                                try {
-                                    cb.onDhcpServerCreated(STATUS_UNKNOWN_ERROR, null);
-                                } catch (RemoteException re) { }
-                            }
-                        }
-                    };
-                }
-
-                // TODO: replace this by NetworkStackClient#getRemoteConnector after refactoring
-                // networkStackClient.
-                static final int NETWORKSTACK_TIMEOUT_MS = 60_000;
-                private INetworkStackConnector getNetworkStackConnector() {
-                    IBinder connector;
-                    try {
-                        final long before = System.currentTimeMillis();
-                        while ((connector = NetworkStack.getService()) == null) {
-                            if (System.currentTimeMillis() - before > NETWORKSTACK_TIMEOUT_MS) {
-                                Log.wtf(TAG, "Timeout, fail to get INetworkStackConnector");
-                                return null;
-                            }
-                            Thread.sleep(200);
-                        }
-                    } catch (InterruptedException e) {
-                        Log.wtf(TAG, "Interrupted, fail to get INetworkStackConnector");
-                        return null;
-                    }
-                    return INetworkStackConnector.Stub.asInterface(connector);
-                }
-
-                @Override
-                public BluetoothAdapter getBluetoothAdapter() {
-                    return BluetoothAdapter.getDefaultAdapter();
-                }
-            };
-        }
-        return mDeps;
-    }
-}
diff --git a/packages/Tethering/src/com/android/server/connectivity/tethering/UpstreamNetworkMonitor.java b/packages/Tethering/src/com/android/server/connectivity/tethering/UpstreamNetworkMonitor.java
deleted file mode 100644
index 45bb4ab..0000000
--- a/packages/Tethering/src/com/android/server/connectivity/tethering/UpstreamNetworkMonitor.java
+++ /dev/null
@@ -1,606 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.connectivity.tethering;
-
-import static android.net.ConnectivityManager.TYPE_BLUETOOTH;
-import static android.net.ConnectivityManager.TYPE_ETHERNET;
-import static android.net.ConnectivityManager.TYPE_MOBILE;
-import static android.net.ConnectivityManager.TYPE_MOBILE_DUN;
-import static android.net.ConnectivityManager.TYPE_MOBILE_HIPRI;
-import static android.net.ConnectivityManager.TYPE_WIFI;
-import static android.net.NetworkCapabilities.NET_CAPABILITY_DUN;
-import static android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET;
-import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED;
-import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_VPN;
-import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
-
-import android.content.Context;
-import android.net.ConnectivityManager;
-import android.net.ConnectivityManager.NetworkCallback;
-import android.net.IpPrefix;
-import android.net.LinkProperties;
-import android.net.Network;
-import android.net.NetworkCapabilities;
-import android.net.NetworkRequest;
-import android.net.util.PrefixUtils;
-import android.net.util.SharedLog;
-import android.os.Handler;
-import android.util.Log;
-import android.util.SparseIntArray;
-
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.util.Preconditions;
-import com.android.internal.util.StateMachine;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Set;
-
-
-/**
- * A class to centralize all the network and link properties information
- * pertaining to the current and any potential upstream network.
- *
- * The owner of UNM gets it to register network callbacks by calling the
- * following methods :
- * Calling #startTrackDefaultNetwork() to track the system default network.
- * Calling #startObserveAllNetworks() to observe all networks. Listening all
- * networks is necessary while the expression of preferred upstreams remains
- * a list of legacy connectivity types.  In future, this can be revisited.
- * Calling #registerMobileNetworkRequest() to bring up mobile DUN/HIPRI network.
- *
- * The methods and data members of this class are only to be accessed and
- * modified from the tethering master state machine thread. Any other
- * access semantics would necessitate the addition of locking.
- *
- * TODO: Move upstream selection logic here.
- *
- * All callback methods are run on the same thread as the specified target
- * state machine.  This class does not require locking when accessed from this
- * thread.  Access from other threads is not advised.
- *
- * @hide
- */
-public class UpstreamNetworkMonitor {
-    private static final String TAG = UpstreamNetworkMonitor.class.getSimpleName();
-    private static final boolean DBG = false;
-    private static final boolean VDBG = false;
-
-    public static final int EVENT_ON_CAPABILITIES   = 1;
-    public static final int EVENT_ON_LINKPROPERTIES = 2;
-    public static final int EVENT_ON_LOST           = 3;
-    public static final int NOTIFY_LOCAL_PREFIXES   = 10;
-    // This value is used by deprecated preferredUpstreamIfaceTypes selection which is default
-    // disabled.
-    @VisibleForTesting
-    public static final int TYPE_NONE = -1;
-
-    private static final int CALLBACK_LISTEN_ALL = 1;
-    private static final int CALLBACK_DEFAULT_INTERNET = 2;
-    private static final int CALLBACK_MOBILE_REQUEST = 3;
-
-    private static final SparseIntArray sLegacyTypeToTransport = new SparseIntArray();
-    static {
-        sLegacyTypeToTransport.put(TYPE_MOBILE,       NetworkCapabilities.TRANSPORT_CELLULAR);
-        sLegacyTypeToTransport.put(TYPE_MOBILE_DUN,   NetworkCapabilities.TRANSPORT_CELLULAR);
-        sLegacyTypeToTransport.put(TYPE_MOBILE_HIPRI, NetworkCapabilities.TRANSPORT_CELLULAR);
-        sLegacyTypeToTransport.put(TYPE_WIFI,         NetworkCapabilities.TRANSPORT_WIFI);
-        sLegacyTypeToTransport.put(TYPE_BLUETOOTH,    NetworkCapabilities.TRANSPORT_BLUETOOTH);
-        sLegacyTypeToTransport.put(TYPE_ETHERNET,     NetworkCapabilities.TRANSPORT_ETHERNET);
-    }
-
-    private final Context mContext;
-    private final SharedLog mLog;
-    private final StateMachine mTarget;
-    private final Handler mHandler;
-    private final int mWhat;
-    private final HashMap<Network, UpstreamNetworkState> mNetworkMap = new HashMap<>();
-    private HashSet<IpPrefix> mLocalPrefixes;
-    private ConnectivityManager mCM;
-    private EntitlementManager mEntitlementMgr;
-    private NetworkCallback mListenAllCallback;
-    private NetworkCallback mDefaultNetworkCallback;
-    private NetworkCallback mMobileNetworkCallback;
-    private boolean mDunRequired;
-    // Whether the current default upstream is mobile or not.
-    private boolean mIsDefaultCellularUpstream;
-    // The current system default network (not really used yet).
-    private Network mDefaultInternetNetwork;
-    // The current upstream network used for tethering.
-    private Network mTetheringUpstreamNetwork;
-
-    public UpstreamNetworkMonitor(Context ctx, StateMachine tgt, SharedLog log, int what) {
-        mContext = ctx;
-        mTarget = tgt;
-        mHandler = mTarget.getHandler();
-        mLog = log.forSubComponent(TAG);
-        mWhat = what;
-        mLocalPrefixes = new HashSet<>();
-        mIsDefaultCellularUpstream = false;
-    }
-
-    @VisibleForTesting
-    public UpstreamNetworkMonitor(
-            ConnectivityManager cm, StateMachine tgt, SharedLog log, int what) {
-        this((Context) null, tgt, log, what);
-        mCM = cm;
-    }
-
-    /**
-     * Tracking the system default network. This method should be called when system is ready.
-     *
-     * @param defaultNetworkRequest should be the same as ConnectivityService default request
-     * @param entitle a EntitlementManager object to communicate between EntitlementManager and
-     * UpstreamNetworkMonitor
-     */
-    public void startTrackDefaultNetwork(NetworkRequest defaultNetworkRequest,
-            EntitlementManager entitle) {
-
-        // defaultNetworkRequest is not really a "request", just a way of tracking the system
-        // default network. It's guaranteed not to actually bring up any networks because it's
-        // the should be the same request as the ConnectivityService default request, and thus
-        // shares fate with it. We can't use registerDefaultNetworkCallback because it will not
-        // track the system default network if there is a VPN that applies to our UID.
-        if (mDefaultNetworkCallback == null) {
-            mDefaultNetworkCallback = new UpstreamNetworkCallback(CALLBACK_DEFAULT_INTERNET);
-            cm().requestNetwork(defaultNetworkRequest, mDefaultNetworkCallback, mHandler);
-        }
-        if (mEntitlementMgr == null) {
-            mEntitlementMgr = entitle;
-        }
-    }
-
-    /** Listen all networks. */
-    public void startObserveAllNetworks() {
-        stop();
-
-        final NetworkRequest listenAllRequest = new NetworkRequest.Builder()
-                .clearCapabilities().build();
-        mListenAllCallback = new UpstreamNetworkCallback(CALLBACK_LISTEN_ALL);
-        cm().registerNetworkCallback(listenAllRequest, mListenAllCallback, mHandler);
-    }
-
-    /**
-     * Stop tracking candidate tethering upstreams and release mobile network request.
-     * Note: this function is used when tethering is stopped because tethering do not need to
-     * choose upstream anymore. But it would not stop default network tracking because
-     * EntitlementManager may need to know default network to decide whether to request entitlement
-     * check even tethering is not active yet.
-     */
-    public void stop() {
-        releaseMobileNetworkRequest();
-
-        releaseCallback(mListenAllCallback);
-        mListenAllCallback = null;
-
-        mTetheringUpstreamNetwork = null;
-        mNetworkMap.clear();
-    }
-
-    /** Setup or teardown DUN connection according to |dunRequired|. */
-    public void updateMobileRequiresDun(boolean dunRequired) {
-        final boolean valueChanged = (mDunRequired != dunRequired);
-        mDunRequired = dunRequired;
-        if (valueChanged && mobileNetworkRequested()) {
-            releaseMobileNetworkRequest();
-            registerMobileNetworkRequest();
-        }
-    }
-
-    /** Whether mobile network is requested. */
-    public boolean mobileNetworkRequested() {
-        return (mMobileNetworkCallback != null);
-    }
-
-    /** Request mobile network if mobile upstream is permitted. */
-    public void registerMobileNetworkRequest() {
-        if (!isCellularUpstreamPermitted()) {
-            mLog.i("registerMobileNetworkRequest() is not permitted");
-            releaseMobileNetworkRequest();
-            return;
-        }
-        if (mMobileNetworkCallback != null) {
-            mLog.e("registerMobileNetworkRequest() already registered");
-            return;
-        }
-
-        final NetworkRequest mobileUpstreamRequest;
-        if (mDunRequired) {
-            mobileUpstreamRequest = new NetworkRequest.Builder()
-                    .addCapability(NET_CAPABILITY_DUN)
-                    .removeCapability(NET_CAPABILITY_NOT_RESTRICTED)
-                    .addTransportType(TRANSPORT_CELLULAR).build();
-        } else {
-            mobileUpstreamRequest = new NetworkRequest.Builder()
-                    .addCapability(NET_CAPABILITY_INTERNET)
-                    .addTransportType(TRANSPORT_CELLULAR).build();
-        }
-
-        // The existing default network and DUN callbacks will be notified.
-        // Therefore, to avoid duplicate notifications, we only register a no-op.
-        mMobileNetworkCallback = new UpstreamNetworkCallback(CALLBACK_MOBILE_REQUEST);
-
-        // The following use of the legacy type system cannot be removed until
-        // upstream selection no longer finds networks by legacy type.
-        // See also http://b/34364553 .
-        final int legacyType = mDunRequired ? TYPE_MOBILE_DUN : TYPE_MOBILE_HIPRI;
-
-        // TODO: Change the timeout from 0 (no onUnavailable callback) to some
-        // moderate callback timeout. This might be useful for updating some UI.
-        // Additionally, we log a message to aid in any subsequent debugging.
-        mLog.i("requesting mobile upstream network: " + mobileUpstreamRequest);
-
-        cm().requestNetwork(mobileUpstreamRequest, 0, legacyType, mHandler,
-                mMobileNetworkCallback);
-    }
-
-    /** Release mobile network request. */
-    public void releaseMobileNetworkRequest() {
-        if (mMobileNetworkCallback == null) return;
-
-        cm().unregisterNetworkCallback(mMobileNetworkCallback);
-        mMobileNetworkCallback = null;
-    }
-
-    // So many TODOs here, but chief among them is: make this functionality an
-    // integral part of this class such that whenever a higher priority network
-    // becomes available and useful we (a) file a request to keep it up as
-    // necessary and (b) change all upstream tracking state accordingly (by
-    // passing LinkProperties up to Tethering).
-    /**
-     * Select the first available network from |perferredTypes|.
-     */
-    public UpstreamNetworkState selectPreferredUpstreamType(Iterable<Integer> preferredTypes) {
-        final TypeStatePair typeStatePair = findFirstAvailableUpstreamByType(
-                mNetworkMap.values(), preferredTypes, isCellularUpstreamPermitted());
-
-        mLog.log("preferred upstream type: " + typeStatePair.type);
-
-        switch (typeStatePair.type) {
-            case TYPE_MOBILE_DUN:
-            case TYPE_MOBILE_HIPRI:
-                // Tethering just selected mobile upstream in spite of the default network being
-                // not mobile. This can happen because of the priority list.
-                // Notify EntitlementManager to check permission for using mobile upstream.
-                if (!mIsDefaultCellularUpstream) {
-                    mEntitlementMgr.maybeRunProvisioning();
-                }
-                // If we're on DUN, put our own grab on it.
-                registerMobileNetworkRequest();
-                break;
-            case TYPE_NONE:
-                // If we found NONE and mobile upstream is permitted we don't want to do this
-                // as we want any previous requests to keep trying to bring up something we can use.
-                if (!isCellularUpstreamPermitted()) releaseMobileNetworkRequest();
-                break;
-            default:
-                // If we've found an active upstream connection that's not DUN/HIPRI
-                // we should stop any outstanding DUN/HIPRI requests.
-                releaseMobileNetworkRequest();
-                break;
-        }
-
-        return typeStatePair.ns;
-    }
-
-    /**
-     * Get current preferred upstream network. If default network is cellular and DUN is required,
-     * preferred upstream would be DUN otherwise preferred upstream is the same as default network.
-     * Returns null if no current upstream is available.
-     */
-    public UpstreamNetworkState getCurrentPreferredUpstream() {
-        final UpstreamNetworkState dfltState = (mDefaultInternetNetwork != null)
-                ? mNetworkMap.get(mDefaultInternetNetwork)
-                : null;
-        if (isNetworkUsableAndNotCellular(dfltState)) return dfltState;
-
-        if (!isCellularUpstreamPermitted()) return null;
-
-        if (!mDunRequired) return dfltState;
-
-        // Find a DUN network. Note that code in Tethering causes a DUN request
-        // to be filed, but this might be moved into this class in future.
-        return findFirstDunNetwork(mNetworkMap.values());
-    }
-
-    /** Tell UpstreamNetworkMonitor which network is the current upstream of tethering. */
-    public void setCurrentUpstream(Network upstream) {
-        mTetheringUpstreamNetwork = upstream;
-    }
-
-    /** Return local prefixes. */
-    public Set<IpPrefix> getLocalPrefixes() {
-        return (Set<IpPrefix>) mLocalPrefixes.clone();
-    }
-
-    private boolean isCellularUpstreamPermitted() {
-        if (mEntitlementMgr != null) {
-            return mEntitlementMgr.isCellularUpstreamPermitted();
-        } else {
-            // This flow should only happens in testing.
-            return true;
-        }
-    }
-
-    private void handleAvailable(Network network) {
-        if (mNetworkMap.containsKey(network)) return;
-
-        if (VDBG) Log.d(TAG, "onAvailable for " + network);
-        mNetworkMap.put(network, new UpstreamNetworkState(null, null, network));
-    }
-
-    private void handleNetCap(Network network, NetworkCapabilities newNc) {
-        final UpstreamNetworkState prev = mNetworkMap.get(network);
-        if (prev == null || newNc.equals(prev.networkCapabilities)) {
-            // Ignore notifications about networks for which we have not yet
-            // received onAvailable() (should never happen) and any duplicate
-            // notifications (e.g. matching more than one of our callbacks).
-            return;
-        }
-
-        if (VDBG) {
-            Log.d(TAG, String.format("EVENT_ON_CAPABILITIES for %s: %s",
-                    network, newNc));
-        }
-
-        mNetworkMap.put(network, new UpstreamNetworkState(
-                prev.linkProperties, newNc, network));
-        // TODO: If sufficient information is available to select a more
-        // preferable upstream, do so now and notify the target.
-        notifyTarget(EVENT_ON_CAPABILITIES, network);
-    }
-
-    private void handleLinkProp(Network network, LinkProperties newLp) {
-        final UpstreamNetworkState prev = mNetworkMap.get(network);
-        if (prev == null || newLp.equals(prev.linkProperties)) {
-            // Ignore notifications about networks for which we have not yet
-            // received onAvailable() (should never happen) and any duplicate
-            // notifications (e.g. matching more than one of our callbacks).
-            return;
-        }
-
-        if (VDBG) {
-            Log.d(TAG, String.format("EVENT_ON_LINKPROPERTIES for %s: %s",
-                    network, newLp));
-        }
-
-        mNetworkMap.put(network, new UpstreamNetworkState(
-                newLp, prev.networkCapabilities, network));
-        // TODO: If sufficient information is available to select a more
-        // preferable upstream, do so now and notify the target.
-        notifyTarget(EVENT_ON_LINKPROPERTIES, network);
-    }
-
-    private void handleLost(Network network) {
-        // There are few TODOs within ConnectivityService's rematching code
-        // pertaining to spurious onLost() notifications.
-        //
-        // TODO: simplify this, probably if favor of code that:
-        //     - selects a new upstream if mTetheringUpstreamNetwork has
-        //       been lost (by any callback)
-        //     - deletes the entry from the map only when the LISTEN_ALL
-        //       callback gets notified.
-
-        if (!mNetworkMap.containsKey(network)) {
-            // Ignore loss of networks about which we had not previously
-            // learned any information or for which we have already processed
-            // an onLost() notification.
-            return;
-        }
-
-        if (VDBG) Log.d(TAG, "EVENT_ON_LOST for " + network);
-
-        // TODO: If sufficient information is available to select a more
-        // preferable upstream, do so now and notify the target.  Likewise,
-        // if the current upstream network is gone, notify the target of the
-        // fact that we now have no upstream at all.
-        notifyTarget(EVENT_ON_LOST, mNetworkMap.remove(network));
-    }
-
-    private void recomputeLocalPrefixes() {
-        final HashSet<IpPrefix> localPrefixes = allLocalPrefixes(mNetworkMap.values());
-        if (!mLocalPrefixes.equals(localPrefixes)) {
-            mLocalPrefixes = localPrefixes;
-            notifyTarget(NOTIFY_LOCAL_PREFIXES, localPrefixes.clone());
-        }
-    }
-
-    // Fetch (and cache) a ConnectivityManager only if and when we need one.
-    private ConnectivityManager cm() {
-        if (mCM == null) {
-            // MUST call the String variant to be able to write unittests.
-            mCM = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
-        }
-        return mCM;
-    }
-
-    /**
-     * A NetworkCallback class that handles information of interest directly
-     * in the thread on which it is invoked. To avoid locking, this MUST be
-     * run on the same thread as the target state machine's handler.
-     */
-    private class UpstreamNetworkCallback extends NetworkCallback {
-        private final int mCallbackType;
-
-        UpstreamNetworkCallback(int callbackType) {
-            mCallbackType = callbackType;
-        }
-
-        @Override
-        public void onAvailable(Network network) {
-            handleAvailable(network);
-        }
-
-        @Override
-        public void onCapabilitiesChanged(Network network, NetworkCapabilities newNc) {
-            if (mCallbackType == CALLBACK_DEFAULT_INTERNET) {
-                mDefaultInternetNetwork = network;
-                final boolean newIsCellular = isCellular(newNc);
-                if (mIsDefaultCellularUpstream != newIsCellular) {
-                    mIsDefaultCellularUpstream = newIsCellular;
-                    mEntitlementMgr.notifyUpstream(newIsCellular);
-                }
-                return;
-            }
-
-            handleNetCap(network, newNc);
-        }
-
-        @Override
-        public void onLinkPropertiesChanged(Network network, LinkProperties newLp) {
-            if (mCallbackType == CALLBACK_DEFAULT_INTERNET) return;
-
-            handleLinkProp(network, newLp);
-            // Any non-LISTEN_ALL callback will necessarily concern a network that will
-            // also match the LISTEN_ALL callback by construction of the LISTEN_ALL callback.
-            // So it's not useful to do this work for non-LISTEN_ALL callbacks.
-            if (mCallbackType == CALLBACK_LISTEN_ALL) {
-                recomputeLocalPrefixes();
-            }
-        }
-
-        @Override
-        public void onLost(Network network) {
-            if (mCallbackType == CALLBACK_DEFAULT_INTERNET) {
-                mDefaultInternetNetwork = null;
-                mIsDefaultCellularUpstream = false;
-                mEntitlementMgr.notifyUpstream(false);
-                return;
-            }
-
-            handleLost(network);
-            // Any non-LISTEN_ALL callback will necessarily concern a network that will
-            // also match the LISTEN_ALL callback by construction of the LISTEN_ALL callback.
-            // So it's not useful to do this work for non-LISTEN_ALL callbacks.
-            if (mCallbackType == CALLBACK_LISTEN_ALL) {
-                recomputeLocalPrefixes();
-            }
-        }
-    }
-
-    private void releaseCallback(NetworkCallback cb) {
-        if (cb != null) cm().unregisterNetworkCallback(cb);
-    }
-
-    private void notifyTarget(int which, Network network) {
-        notifyTarget(which, mNetworkMap.get(network));
-    }
-
-    private void notifyTarget(int which, Object obj) {
-        mTarget.sendMessage(mWhat, which, 0, obj);
-    }
-
-    private static class TypeStatePair {
-        public int type = TYPE_NONE;
-        public UpstreamNetworkState ns = null;
-    }
-
-    private static TypeStatePair findFirstAvailableUpstreamByType(
-            Iterable<UpstreamNetworkState> netStates, Iterable<Integer> preferredTypes,
-            boolean isCellularUpstreamPermitted) {
-        final TypeStatePair result = new TypeStatePair();
-
-        for (int type : preferredTypes) {
-            NetworkCapabilities nc;
-            try {
-                nc = networkCapabilitiesForType(type);
-            } catch (IllegalArgumentException iae) {
-                Log.e(TAG, "No NetworkCapabilities mapping for legacy type: " + type);
-                continue;
-            }
-            if (!isCellularUpstreamPermitted && isCellular(nc)) {
-                continue;
-            }
-
-            for (UpstreamNetworkState value : netStates) {
-                if (!nc.satisfiedByNetworkCapabilities(value.networkCapabilities)) {
-                    continue;
-                }
-
-                result.type = type;
-                result.ns = value;
-                return result;
-            }
-        }
-
-        return result;
-    }
-
-    private static HashSet<IpPrefix> allLocalPrefixes(Iterable<UpstreamNetworkState> netStates) {
-        final HashSet<IpPrefix> prefixSet = new HashSet<>();
-
-        for (UpstreamNetworkState ns : netStates) {
-            final LinkProperties lp = ns.linkProperties;
-            if (lp == null) continue;
-            prefixSet.addAll(PrefixUtils.localPrefixesFrom(lp));
-        }
-
-        return prefixSet;
-    }
-
-    private static boolean isCellular(UpstreamNetworkState ns) {
-        return (ns != null) && isCellular(ns.networkCapabilities);
-    }
-
-    private static boolean isCellular(NetworkCapabilities nc) {
-        return (nc != null) && nc.hasTransport(TRANSPORT_CELLULAR)
-               && nc.hasCapability(NET_CAPABILITY_NOT_VPN);
-    }
-
-    private static boolean hasCapability(UpstreamNetworkState ns, int netCap) {
-        return (ns != null) && (ns.networkCapabilities != null)
-               && ns.networkCapabilities.hasCapability(netCap);
-    }
-
-    private static boolean isNetworkUsableAndNotCellular(UpstreamNetworkState ns) {
-        return (ns != null) && (ns.networkCapabilities != null) && (ns.linkProperties != null)
-               && !isCellular(ns.networkCapabilities);
-    }
-
-    private static UpstreamNetworkState findFirstDunNetwork(
-            Iterable<UpstreamNetworkState> netStates) {
-        for (UpstreamNetworkState ns : netStates) {
-            if (isCellular(ns) && hasCapability(ns, NET_CAPABILITY_DUN)) return ns;
-        }
-
-        return null;
-    }
-
-    /**
-     * Given a legacy type (TYPE_WIFI, ...) returns the corresponding NetworkCapabilities instance.
-     * This function is used for deprecated legacy type and be disabled by default.
-     */
-    @VisibleForTesting
-    public static NetworkCapabilities networkCapabilitiesForType(int type) {
-        final NetworkCapabilities.Builder builder = new NetworkCapabilities.Builder();
-
-        // Map from type to transports.
-        final int notFound = -1;
-        final int transport = sLegacyTypeToTransport.get(type, notFound);
-        Preconditions.checkArgument(transport != notFound, "unknown legacy type: " + type);
-        builder.addTransportType(transport);
-
-        if (type == TYPE_MOBILE_DUN) {
-            builder.addCapability(NetworkCapabilities.NET_CAPABILITY_DUN);
-            // DUN is restricted network, see NetworkCapabilities#FORCE_RESTRICTED_CAPABILITIES.
-            builder.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED);
-        } else {
-            builder.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
-        }
-        return builder.build();
-    }
-}
diff --git a/packages/Tethering/src/com/android/server/connectivity/tethering/UpstreamNetworkState.java b/packages/Tethering/src/com/android/server/connectivity/tethering/UpstreamNetworkState.java
deleted file mode 100644
index 68bb837..0000000
--- a/packages/Tethering/src/com/android/server/connectivity/tethering/UpstreamNetworkState.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.server.connectivity.tethering;
-
-import android.net.LinkProperties;
-import android.net.Network;
-import android.net.NetworkCapabilities;
-
-import androidx.annotation.NonNull;
-
-/**
- * Snapshot of tethering upstream network state.
- */
-public class UpstreamNetworkState {
-    /** {@link LinkProperties}. */
-    public final LinkProperties linkProperties;
-    /** {@link NetworkCapabilities}. */
-    public final NetworkCapabilities networkCapabilities;
-    /** {@link Network}. */
-    public final Network network;
-
-    /** Constructs a new UpstreamNetworkState. */
-    public UpstreamNetworkState(LinkProperties linkProperties,
-            NetworkCapabilities networkCapabilities, Network network) {
-        this.linkProperties = linkProperties;
-        this.networkCapabilities = networkCapabilities;
-        this.network = network;
-    }
-
-    @NonNull
-    @Override
-    public String toString() {
-        return String.format("UpstreamNetworkState{%s, %s, %s}",
-                network == null ? "null" : network,
-                networkCapabilities == null ? "null" : networkCapabilities,
-                linkProperties == null ? "null" : linkProperties);
-    }
-}
diff --git a/packages/Tethering/tests/integration/Android.bp b/packages/Tethering/tests/integration/Android.bp
index 620261b..3305ed0 100644
--- a/packages/Tethering/tests/integration/Android.bp
+++ b/packages/Tethering/tests/integration/Android.bp
@@ -13,19 +13,12 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 //
-
-android_test {
-    name: "TetheringIntegrationTests",
-    certificate: "platform",
-    platform_apis: true,
+java_defaults {
+    name: "TetheringIntegrationTestsDefaults",
     srcs: [
         "src/**/*.java",
         "src/**/*.kt",
     ],
-    test_suites: [
-        "device-tests",
-        "mts",
-    ],
     static_libs: [
         "NetworkStackApiStableLib",
         "androidx.test.rules",
@@ -44,4 +37,50 @@
         "libdexmakerjvmtiagent",
         "libstaticjvmtiagent",
     ],
+    jarjar_rules: ":NetworkStackJarJarRules",
 }
+
+android_library {
+    name: "TetheringIntegrationTestsLib",
+    platform_apis: true,
+    defaults: ["TetheringIntegrationTestsDefaults"],
+    visibility: ["//cts/tests/tests/tethering"]
+}
+
+android_test {
+    name: "TetheringIntegrationTests",
+    platform_apis: true,
+    defaults: ["TetheringIntegrationTestsDefaults"],
+    test_suites: [
+        "device-tests",
+        "mts",
+    ],
+    compile_multilib: "both",
+}
+
+// Special version of the tethering tests that includes all tests necessary for code coverage
+// purposes. This is currently the union of TetheringTests, TetheringIntegrationTests and
+// NetworkStackTests.
+android_test {
+    name: "TetheringCoverageTests",
+    certificate: "platform",
+    platform_apis: true,
+    test_suites: ["device-tests", "mts"],
+    test_config: "AndroidTest_Coverage.xml",
+    defaults: ["libnetworkstackutilsjni_deps"],
+    static_libs: [
+        "NetworkStaticLibTestsLib",
+        "NetworkStackTestsLib",
+        "TetheringTestsLib",
+        "TetheringIntegrationTestsLib",
+    ],
+    jni_libs: [
+        // For mockito extended
+        "libdexmakerjvmtiagent",
+        "libstaticjvmtiagent",
+        // For NetworkStackUtils included in NetworkStackBase
+        "libnetworkstackutilsjni",
+    ],
+    compile_multilib: "both",
+    manifest: "AndroidManifest_coverage.xml",
+}
\ No newline at end of file
diff --git a/packages/Tethering/tests/integration/AndroidManifest.xml b/packages/Tethering/tests/integration/AndroidManifest.xml
index 233ba40..fddfaad 100644
--- a/packages/Tethering/tests/integration/AndroidManifest.xml
+++ b/packages/Tethering/tests/integration/AndroidManifest.xml
@@ -17,7 +17,6 @@
           package="com.android.networkstack.tethering.tests.integration">
 
     <uses-permission android:name="android.permission.INTERNET"/>
-    <uses-permission android:name="android.permission.TETHER_PRIVILEGED"/>
 
     <application android:debuggable="true">
         <uses-library android:name="android.test.runner" />
diff --git a/packages/Tethering/tests/integration/AndroidManifest_coverage.xml b/packages/Tethering/tests/integration/AndroidManifest_coverage.xml
new file mode 100644
index 0000000..06de00d
--- /dev/null
+++ b/packages/Tethering/tests/integration/AndroidManifest_coverage.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          xmlns:tools="http://schemas.android.com/tools"
+          package="com.android.networkstack.tethering.tests.coverage">
+
+    <application tools:replace="android:label"
+                 android:debuggable="true"
+                 android:label="Tethering coverage tests">
+        <uses-library android:name="android.test.runner" />
+    </application>
+    <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
+                     android:targetPackage="com.android.networkstack.tethering.tests.coverage"
+                     android:label="Tethering coverage tests">
+    </instrumentation>
+</manifest>
diff --git a/packages/Tethering/tests/integration/AndroidTest_Coverage.xml b/packages/Tethering/tests/integration/AndroidTest_Coverage.xml
new file mode 100644
index 0000000..3def209
--- /dev/null
+++ b/packages/Tethering/tests/integration/AndroidTest_Coverage.xml
@@ -0,0 +1,12 @@
+<configuration description="Runs coverage tests for Tethering">
+    <target_preparer class="com.android.tradefed.targetprep.TestAppInstallSetup">
+        <option name="test-file-name" value="TetheringCoverageTests.apk" />
+    </target_preparer>
+
+    <option name="test-tag" value="TetheringCoverageTests" />
+    <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
+        <option name="package" value="com.android.networkstack.tethering.tests.coverage" />
+        <option name="runner" value="androidx.test.runner.AndroidJUnitRunner" />
+        <option name="hidden-api-checks" value="false"/>
+    </test>
+</configuration>
\ No newline at end of file
diff --git a/packages/Tethering/tests/integration/src/android/net/EthernetTetheringTest.java b/packages/Tethering/tests/integration/src/android/net/EthernetTetheringTest.java
index b02bb23..4bac9da 100644
--- a/packages/Tethering/tests/integration/src/android/net/EthernetTetheringTest.java
+++ b/packages/Tethering/tests/integration/src/android/net/EthernetTetheringTest.java
@@ -18,6 +18,7 @@
 
 import static android.Manifest.permission.MANAGE_TEST_NETWORKS;
 import static android.Manifest.permission.NETWORK_SETTINGS;
+import static android.Manifest.permission.TETHER_PRIVILEGED;
 import static android.net.TetheringManager.TETHERING_ETHERNET;
 
 import static org.junit.Assert.assertEquals;
@@ -109,7 +110,8 @@
         mTetheredInterfaceRequester = new TetheredInterfaceRequester(mHandler, mEm);
         // Needed to create a TestNetworkInterface, to call requestTetheredInterface, and to receive
         // tethered client callbacks.
-        mUiAutomation.adoptShellPermissionIdentity(MANAGE_TEST_NETWORKS, NETWORK_SETTINGS);
+        mUiAutomation.adoptShellPermissionIdentity(
+                MANAGE_TEST_NETWORKS, NETWORK_SETTINGS, TETHER_PRIVILEGED);
     }
 
     private void cleanUp() throws Exception {
diff --git a/packages/Tethering/tests/unit/Android.bp b/packages/Tethering/tests/unit/Android.bp
index 59681e9..08cfb30 100644
--- a/packages/Tethering/tests/unit/Android.bp
+++ b/packages/Tethering/tests/unit/Android.bp
@@ -14,39 +14,53 @@
 // limitations under the License.
 //
 
-android_test {
-    name: "TetheringTests",
-    certificate: "platform",
+// Tests in this folder are included both in unit tests and CTS.
+java_library {
+    name: "TetheringCommonTests",
+    srcs: [
+        "common/**/*.java",
+        "common/**/*.kt"
+    ],
+    static_libs: [
+        "androidx.test.rules",
+        "net-tests-utils",
+    ],
+    // TODO(b/147200698) change sdk_version to module-current and remove framework-minus-apex
+    sdk_version: "core_platform",
+    libs: [
+        "framework-minus-apex",
+        "framework-tethering",
+    ],
+    visibility: ["//cts/tests/tests/tethering"],
+}
+
+java_defaults {
+    name: "TetheringTestsDefaults",
     srcs: [
         "src/**/*.java",
         "src/**/*.kt",
     ],
-    test_suites: [
-        "device-tests",
-        "mts",
-    ],
-    compile_multilib: "both",
     static_libs: [
+        "TetheringApiCurrentLib",
+        "TetheringCommonTests",
         "androidx.test.rules",
         "frameworks-base-testutils",
-        "net-tests-utils",
         "mockito-target-extended-minus-junit4",
-        "TetheringApiCurrentLib",
+        "net-tests-utils",
         "testables",
     ],
     // TODO(b/147200698) change sdk_version to module-current and
     // remove framework-minus-apex, ext, and framework-res
     sdk_version: "core_platform",
     libs: [
-        "framework-minus-apex",
-        "ext",
-        "framework-res",
-        "framework-wifi-stubs-module_libs_api",
-        "framework-telephony-stubs",
         "android.test.runner",
         "android.test.base",
         "android.test.mock",
+        "ext",
+        "framework-minus-apex",
+        "framework-res",
         "framework-tethering",
+        "framework-wifi-stubs-module_libs_api",
     ],
     jni_libs: [
         // For mockito extended
@@ -55,3 +69,25 @@
     ],
     jarjar_rules: "jarjar-rules.txt",
 }
+
+// Library containing the unit tests. This is used by the coverage test target to pull in the
+// unit test code. It is not currently used by the tests themselves because all the build
+// configuration needed by the tests is in the TetheringTestsDefaults rule.
+android_library {
+    name: "TetheringTestsLib",
+    defaults: ["TetheringTestsDefaults"],
+    visibility: [
+        "//frameworks/base/packages/Tethering/tests/integration",
+    ]
+}
+
+android_test {
+    name: "TetheringTests",
+    certificate: "platform",
+    test_suites: [
+        "device-tests",
+        "mts",
+    ],
+    defaults: ["TetheringTestsDefaults"],
+    compile_multilib: "both",
+}
diff --git a/packages/Tethering/tests/unit/AndroidManifest.xml b/packages/Tethering/tests/unit/AndroidManifest.xml
index 4ff1d37..31eaabf 100644
--- a/packages/Tethering/tests/unit/AndroidManifest.xml
+++ b/packages/Tethering/tests/unit/AndroidManifest.xml
@@ -16,16 +16,17 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="com.android.networkstack.tethering.tests.unit">
 
+    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
     <uses-permission android:name="android.permission.TETHER_PRIVILEGED"/>
 
     <application android:debuggable="true">
         <uses-library android:name="android.test.runner" />
         <service
-            android:name="com.android.server.connectivity.tethering.MockTetheringService"
+            android:name="com.android.networkstack.tethering.MockTetheringService"
             android:permission="android.permission.TETHER_PRIVILEGED"
             android:exported="true">
             <intent-filter>
-                <action android:name="com.android.server.connectivity.tethering.TetheringService"/>
+                <action android:name="com.android.networkstack.tethering.TetheringService"/>
             </intent-filter>
         </service>
     </application>
diff --git a/packages/Tethering/tests/unit/common/android/net/TetheredClientTest.kt b/packages/Tethering/tests/unit/common/android/net/TetheredClientTest.kt
new file mode 100644
index 0000000..55c59dd
--- /dev/null
+++ b/packages/Tethering/tests/unit/common/android/net/TetheredClientTest.kt
@@ -0,0 +1,122 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net
+
+import android.net.InetAddresses.parseNumericAddress
+import android.net.TetheredClient.AddressInfo
+import android.net.TetheringManager.TETHERING_BLUETOOTH
+import android.net.TetheringManager.TETHERING_USB
+import android.system.OsConstants.RT_SCOPE_UNIVERSE
+import androidx.test.filters.SmallTest
+import androidx.test.runner.AndroidJUnit4
+import com.android.testutils.assertParcelSane
+import org.junit.Test
+import org.junit.runner.RunWith
+import kotlin.test.assertEquals
+import kotlin.test.assertNotEquals
+
+private val TEST_MACADDR = MacAddress.fromBytes(byteArrayOf(12, 23, 34, 45, 56, 67))
+private val TEST_OTHER_MACADDR = MacAddress.fromBytes(byteArrayOf(23, 34, 45, 56, 67, 78))
+private val TEST_ADDR1 = makeLinkAddress("192.168.113.3", prefixLength = 24, expTime = 123L)
+private val TEST_ADDR2 = makeLinkAddress("fe80::1:2:3", prefixLength = 64, expTime = 456L)
+private val TEST_HOSTNAME = "test_hostname"
+private val TEST_OTHER_HOSTNAME = "test_other_hostname"
+private val TEST_ADDRINFO1 = AddressInfo(TEST_ADDR1, TEST_HOSTNAME)
+private val TEST_ADDRINFO2 = AddressInfo(TEST_ADDR2, null)
+
+private fun makeLinkAddress(addr: String, prefixLength: Int, expTime: Long) = LinkAddress(
+        parseNumericAddress(addr),
+        prefixLength,
+        0 /* flags */,
+        RT_SCOPE_UNIVERSE,
+        expTime /* deprecationTime */,
+        expTime /* expirationTime */)
+
+@RunWith(AndroidJUnit4::class)
+@SmallTest
+class TetheredClientTest {
+    @Test
+    fun testParceling() {
+        assertParcelSane(TEST_ADDRINFO1, fieldCount = 2)
+        assertParcelSane(makeTestClient(), fieldCount = 3)
+    }
+
+    @Test
+    fun testEquals() {
+        assertEquals(makeTestClient(), makeTestClient())
+
+        // Different mac address
+        assertNotEquals(makeTestClient(), TetheredClient(
+                TEST_OTHER_MACADDR,
+                listOf(TEST_ADDRINFO1, TEST_ADDRINFO2),
+                TETHERING_BLUETOOTH))
+
+        // Different hostname
+        assertNotEquals(makeTestClient(), TetheredClient(
+                TEST_MACADDR,
+                listOf(AddressInfo(TEST_ADDR1, TEST_OTHER_HOSTNAME), TEST_ADDRINFO2),
+                TETHERING_BLUETOOTH))
+
+        // Null hostname
+        assertNotEquals(makeTestClient(), TetheredClient(
+                TEST_MACADDR,
+                listOf(AddressInfo(TEST_ADDR1, null), TEST_ADDRINFO2),
+                TETHERING_BLUETOOTH))
+
+        // Missing address
+        assertNotEquals(makeTestClient(), TetheredClient(
+                TEST_MACADDR,
+                listOf(TEST_ADDRINFO2),
+                TETHERING_BLUETOOTH))
+
+        // Different type
+        assertNotEquals(makeTestClient(), TetheredClient(
+                TEST_MACADDR,
+                listOf(TEST_ADDRINFO1, TEST_ADDRINFO2),
+                TETHERING_USB))
+    }
+
+    @Test
+    fun testAddAddresses() {
+        val client1 = TetheredClient(TEST_MACADDR, listOf(TEST_ADDRINFO1), TETHERING_USB)
+        val client2 = TetheredClient(TEST_OTHER_MACADDR, listOf(TEST_ADDRINFO2), TETHERING_USB)
+        assertEquals(TetheredClient(
+                TEST_MACADDR,
+                listOf(TEST_ADDRINFO1, TEST_ADDRINFO2),
+                TETHERING_USB), client1.addAddresses(client2))
+    }
+
+    @Test
+    fun testGetters() {
+        assertEquals(TEST_MACADDR, makeTestClient().macAddress)
+        assertEquals(listOf(TEST_ADDRINFO1, TEST_ADDRINFO2), makeTestClient().addresses)
+        assertEquals(TETHERING_BLUETOOTH, makeTestClient().tetheringType)
+    }
+
+    @Test
+    fun testAddressInfo_Getters() {
+        assertEquals(TEST_ADDR1, TEST_ADDRINFO1.address)
+        assertEquals(TEST_ADDR2, TEST_ADDRINFO2.address)
+        assertEquals(TEST_HOSTNAME, TEST_ADDRINFO1.hostname)
+        assertEquals(null, TEST_ADDRINFO2.hostname)
+    }
+
+    private fun makeTestClient() = TetheredClient(
+            TEST_MACADDR,
+            listOf(TEST_ADDRINFO1, TEST_ADDRINFO2),
+            TETHERING_BLUETOOTH)
+}
\ No newline at end of file
diff --git a/packages/Tethering/tests/unit/src/android/net/TetheredClientTest.kt b/packages/Tethering/tests/unit/src/android/net/TetheredClientTest.kt
deleted file mode 100644
index a20a0df..0000000
--- a/packages/Tethering/tests/unit/src/android/net/TetheredClientTest.kt
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net
-
-import android.net.InetAddresses.parseNumericAddress
-import android.net.TetheredClient.AddressInfo
-import android.net.TetheringManager.TETHERING_BLUETOOTH
-import android.net.TetheringManager.TETHERING_USB
-import android.system.OsConstants.RT_SCOPE_UNIVERSE
-import androidx.test.filters.SmallTest
-import androidx.test.runner.AndroidJUnit4
-import com.android.testutils.assertParcelSane
-import org.junit.Test
-import org.junit.runner.RunWith
-import kotlin.test.assertEquals
-import kotlin.test.assertNotEquals
-
-private val TEST_MACADDR = MacAddress.fromBytes(byteArrayOf(12, 23, 34, 45, 56, 67))
-private val TEST_OTHER_MACADDR = MacAddress.fromBytes(byteArrayOf(23, 34, 45, 56, 67, 78))
-private val TEST_ADDR1 = makeLinkAddress("192.168.113.3", prefixLength = 24, expTime = 123L)
-private val TEST_ADDR2 = makeLinkAddress("fe80::1:2:3", prefixLength = 64, expTime = 456L)
-private val TEST_ADDRINFO1 = AddressInfo(TEST_ADDR1, "test_hostname")
-private val TEST_ADDRINFO2 = AddressInfo(TEST_ADDR2, null)
-
-private fun makeLinkAddress(addr: String, prefixLength: Int, expTime: Long) = LinkAddress(
-        parseNumericAddress(addr),
-        prefixLength,
-        0 /* flags */,
-        RT_SCOPE_UNIVERSE,
-        expTime /* deprecationTime */,
-        expTime /* expirationTime */)
-
-@RunWith(AndroidJUnit4::class)
-@SmallTest
-class TetheredClientTest {
-    @Test
-    fun testParceling() {
-        assertParcelSane(makeTestClient(), fieldCount = 3)
-    }
-
-    @Test
-    fun testEquals() {
-        assertEquals(makeTestClient(), makeTestClient())
-
-        // Different mac address
-        assertNotEquals(makeTestClient(), TetheredClient(
-                TEST_OTHER_MACADDR,
-                listOf(TEST_ADDRINFO1, TEST_ADDRINFO2),
-                TETHERING_BLUETOOTH))
-
-        // Different hostname
-        assertNotEquals(makeTestClient(), TetheredClient(
-                TEST_MACADDR,
-                listOf(AddressInfo(TEST_ADDR1, "test_other_hostname"), TEST_ADDRINFO2),
-                TETHERING_BLUETOOTH))
-
-        // Null hostname
-        assertNotEquals(makeTestClient(), TetheredClient(
-                TEST_MACADDR,
-                listOf(AddressInfo(TEST_ADDR1, null), TEST_ADDRINFO2),
-                TETHERING_BLUETOOTH))
-
-        // Missing address
-        assertNotEquals(makeTestClient(), TetheredClient(
-                TEST_MACADDR,
-                listOf(TEST_ADDRINFO2),
-                TETHERING_BLUETOOTH))
-
-        // Different type
-        assertNotEquals(makeTestClient(), TetheredClient(
-                TEST_MACADDR,
-                listOf(TEST_ADDRINFO1, TEST_ADDRINFO2),
-                TETHERING_USB))
-    }
-
-    @Test
-    fun testAddAddresses() {
-        val client1 = TetheredClient(TEST_MACADDR, listOf(TEST_ADDRINFO1), TETHERING_USB)
-        val client2 = TetheredClient(TEST_OTHER_MACADDR, listOf(TEST_ADDRINFO2), TETHERING_USB)
-        assertEquals(TetheredClient(
-                TEST_MACADDR,
-                listOf(TEST_ADDRINFO1, TEST_ADDRINFO2),
-                TETHERING_USB), client1.addAddresses(client2))
-    }
-
-    private fun makeTestClient() = TetheredClient(
-            TEST_MACADDR,
-            listOf(TEST_ADDRINFO1, TEST_ADDRINFO2),
-            TETHERING_BLUETOOTH)
-}
\ No newline at end of file
diff --git a/packages/Tethering/tests/unit/src/android/net/ip/IpServerTest.java b/packages/Tethering/tests/unit/src/android/net/ip/IpServerTest.java
index fdfdae8..f9be7b9 100644
--- a/packages/Tethering/tests/unit/src/android/net/ip/IpServerTest.java
+++ b/packages/Tethering/tests/unit/src/android/net/ip/IpServerTest.java
@@ -587,6 +587,7 @@
         final InetAddress neighB = InetAddresses.parseNumericAddress("2001:db8::2");
         final InetAddress neighLL = InetAddresses.parseNumericAddress("fe80::1");
         final InetAddress neighMC = InetAddresses.parseNumericAddress("ff02::1234");
+        final MacAddress macNull = MacAddress.fromString("00:00:00:00:00:00");
         final MacAddress macA = MacAddress.fromString("00:00:00:00:00:0a");
         final MacAddress macB = MacAddress.fromString("11:22:33:00:00:0b");
 
@@ -612,13 +613,14 @@
         verifyNoMoreInteractions(mNetd);
 
         // A neighbor that is no longer valid causes the rule to be removed.
-        recvNewNeigh(myIfindex, neighA, NUD_FAILED, macA);
-        verify(mNetd).tetherOffloadRuleRemove(matches(UPSTREAM_IFINDEX, neighA, macA));
+        // NUD_FAILED events do not have a MAC address.
+        recvNewNeigh(myIfindex, neighA, NUD_FAILED, null);
+        verify(mNetd).tetherOffloadRuleRemove(matches(UPSTREAM_IFINDEX, neighA, macNull));
         reset(mNetd);
 
         // A neighbor that is deleted causes the rule to be removed.
         recvDelNeigh(myIfindex, neighB, NUD_STALE, macB);
-        verify(mNetd).tetherOffloadRuleRemove(matches(UPSTREAM_IFINDEX, neighB, macB));
+        verify(mNetd).tetherOffloadRuleRemove(matches(UPSTREAM_IFINDEX, neighB, macNull));
         reset(mNetd);
 
         // Upstream changes result in deleting and re-adding the rules.
diff --git a/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/ConnectedClientsTrackerTest.kt b/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/ConnectedClientsTrackerTest.kt
new file mode 100644
index 0000000..d915354
--- /dev/null
+++ b/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/ConnectedClientsTrackerTest.kt
@@ -0,0 +1,162 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.networkstack.tethering
+
+import android.net.LinkAddress
+import android.net.MacAddress
+import android.net.TetheredClient
+import android.net.TetheredClient.AddressInfo
+import android.net.TetheringManager.TETHERING_USB
+import android.net.TetheringManager.TETHERING_WIFI
+import android.net.ip.IpServer
+import android.net.wifi.WifiClient
+import androidx.test.filters.SmallTest
+import androidx.test.runner.AndroidJUnit4
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.Mockito.doReturn
+import org.mockito.Mockito.mock
+import kotlin.test.assertEquals
+import kotlin.test.assertFalse
+import kotlin.test.assertTrue
+
+@RunWith(AndroidJUnit4::class)
+@SmallTest
+class ConnectedClientsTrackerTest {
+
+    private val server1 = mock(IpServer::class.java)
+    private val server2 = mock(IpServer::class.java)
+    private val servers = listOf(server1, server2)
+
+    private val clock = TestClock(1324L)
+
+    private val client1Addr = MacAddress.fromString("01:23:45:67:89:0A")
+    private val client1 = TetheredClient(client1Addr, listOf(
+            makeAddrInfo("192.168.43.44/32", null /* hostname */, clock.time + 20)),
+            TETHERING_WIFI)
+    private val wifiClient1 = makeWifiClient(client1Addr)
+    private val client2Addr = MacAddress.fromString("02:34:56:78:90:AB")
+    private val client2Exp30AddrInfo = makeAddrInfo(
+            "192.168.43.45/32", "my_hostname", clock.time + 30)
+    private val client2 = TetheredClient(client2Addr, listOf(
+            client2Exp30AddrInfo,
+            makeAddrInfo("2001:db8:12::34/72", "other_hostname", clock.time + 10)),
+            TETHERING_WIFI)
+    private val wifiClient2 = makeWifiClient(client2Addr)
+    private val client3Addr = MacAddress.fromString("03:45:67:89:0A:BC")
+    private val client3 = TetheredClient(client3Addr,
+            listOf(makeAddrInfo("2001:db8:34::34/72", "other_other_hostname", clock.time + 10)),
+            TETHERING_USB)
+
+    private fun makeAddrInfo(addr: String, hostname: String?, expTime: Long) =
+            LinkAddress(addr).let {
+                AddressInfo(LinkAddress(it.address, it.prefixLength, it.flags, it.scope,
+                        expTime /* deprecationTime */, expTime /* expirationTime */), hostname)
+            }
+
+    @Test
+    fun testUpdateConnectedClients() {
+        doReturn(emptyList<TetheredClient>()).`when`(server1).allLeases
+        doReturn(emptyList<TetheredClient>()).`when`(server2).allLeases
+
+        val tracker = ConnectedClientsTracker(clock)
+        assertFalse(tracker.updateConnectedClients(servers, null))
+
+        // Obtain a lease for client 1
+        doReturn(listOf(client1)).`when`(server1).allLeases
+        assertSameClients(listOf(client1), assertNewClients(tracker, servers, listOf(wifiClient1)))
+
+        // Client 2 L2-connected, no lease yet
+        val client2WithoutAddr = TetheredClient(client2Addr, emptyList(), TETHERING_WIFI)
+        assertSameClients(listOf(client1, client2WithoutAddr),
+                assertNewClients(tracker, servers, listOf(wifiClient1, wifiClient2)))
+
+        // Client 2 lease obtained
+        doReturn(listOf(client1, client2)).`when`(server1).allLeases
+        assertSameClients(listOf(client1, client2), assertNewClients(tracker, servers, null))
+
+        // Client 3 lease obtained
+        doReturn(listOf(client3)).`when`(server2).allLeases
+        assertSameClients(listOf(client1, client2, client3),
+                assertNewClients(tracker, servers, null))
+
+        // Client 2 L2-disconnected
+        assertSameClients(listOf(client1, client3),
+                assertNewClients(tracker, servers, listOf(wifiClient1)))
+
+        // Client 1 L2-disconnected
+        assertSameClients(listOf(client3), assertNewClients(tracker, servers, emptyList()))
+
+        // Client 1 comes back
+        assertSameClients(listOf(client1, client3),
+                assertNewClients(tracker, servers, listOf(wifiClient1)))
+
+        // Leases lost, client 1 still L2-connected
+        doReturn(emptyList<TetheredClient>()).`when`(server1).allLeases
+        doReturn(emptyList<TetheredClient>()).`when`(server2).allLeases
+        assertSameClients(listOf(TetheredClient(client1Addr, emptyList(), TETHERING_WIFI)),
+                assertNewClients(tracker, servers, null))
+    }
+
+    @Test
+    fun testUpdateConnectedClients_LeaseExpiration() {
+        val tracker = ConnectedClientsTracker(clock)
+        doReturn(listOf(client1, client2)).`when`(server1).allLeases
+        doReturn(listOf(client3)).`when`(server2).allLeases
+        assertSameClients(listOf(client1, client2, client3), assertNewClients(
+                tracker, servers, listOf(wifiClient1, wifiClient2)))
+
+        clock.time += 20
+        // Client 3 has no remaining lease: removed
+        val expectedClients = listOf(
+                // Client 1 has no remaining lease but is L2-connected
+                TetheredClient(client1Addr, emptyList(), TETHERING_WIFI),
+                // Client 2 has some expired leases
+                TetheredClient(
+                        client2Addr,
+                        // Only the "t + 30" address is left, the "t + 10" address expired
+                        listOf(client2Exp30AddrInfo),
+                        TETHERING_WIFI))
+        assertSameClients(expectedClients, assertNewClients(tracker, servers, null))
+    }
+
+    private fun assertNewClients(
+        tracker: ConnectedClientsTracker,
+        ipServers: Iterable<IpServer>,
+        wifiClients: List<WifiClient>?
+    ): List<TetheredClient> {
+        assertTrue(tracker.updateConnectedClients(ipServers, wifiClients))
+        return tracker.lastTetheredClients
+    }
+
+    private fun assertSameClients(expected: List<TetheredClient>, actual: List<TetheredClient>) {
+        val expectedSet = HashSet(expected)
+        assertEquals(expected.size, expectedSet.size)
+        assertEquals(expectedSet, HashSet(actual))
+    }
+
+    private fun makeWifiClient(macAddr: MacAddress): WifiClient {
+        // Use a mock WifiClient as the constructor is not part of the WiFi module exported API.
+        return mock(WifiClient::class.java).apply { doReturn(macAddr).`when`(this).macAddress }
+    }
+
+    private class TestClock(var time: Long) : ConnectedClientsTracker.Clock() {
+        override fun elapsedRealtime(): Long {
+            return time
+        }
+    }
+}
diff --git a/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/EntitlementManagerTest.java b/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/EntitlementManagerTest.java
new file mode 100644
index 0000000..8bd0edc
--- /dev/null
+++ b/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/EntitlementManagerTest.java
@@ -0,0 +1,522 @@
+/*
+ * Copyright (C) 2018 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.networkstack.tethering;
+
+import static android.net.TetheringManager.TETHERING_BLUETOOTH;
+import static android.net.TetheringManager.TETHERING_ETHERNET;
+import static android.net.TetheringManager.TETHERING_USB;
+import static android.net.TetheringManager.TETHERING_WIFI;
+import static android.net.TetheringManager.TETHERING_WIFI_P2P;
+import static android.net.TetheringManager.TETHER_ERROR_ENTITLEMENT_UNKNOWN;
+import static android.net.TetheringManager.TETHER_ERROR_NO_ERROR;
+import static android.net.TetheringManager.TETHER_ERROR_PROVISIONING_FAILED;
+import static android.provider.DeviceConfig.NAMESPACE_CONNECTIVITY;
+import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
+
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Matchers.anyBoolean;
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.net.util.SharedLog;
+import android.os.Bundle;
+import android.os.Message;
+import android.os.PersistableBundle;
+import android.os.ResultReceiver;
+import android.os.SystemProperties;
+import android.os.test.TestLooper;
+import android.provider.DeviceConfig;
+import android.telephony.CarrierConfigManager;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import com.android.internal.util.State;
+import com.android.internal.util.StateMachine;
+import com.android.internal.util.test.BroadcastInterceptingContext;
+
+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 org.mockito.MockitoSession;
+import org.mockito.quality.Strictness;
+
+import java.util.ArrayList;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public final class EntitlementManagerTest {
+
+    private static final int EVENT_EM_UPDATE = 1;
+    private static final String[] PROVISIONING_APP_NAME = {"some", "app"};
+    private static final String PROVISIONING_NO_UI_APP_NAME = "no_ui_app";
+
+    @Mock private CarrierConfigManager mCarrierConfigManager;
+    @Mock private Context mContext;
+    @Mock private Resources mResources;
+    @Mock private SharedLog mLog;
+    @Mock private EntitlementManager.OnUiEntitlementFailedListener mEntitlementFailedListener;
+
+    // Like so many Android system APIs, these cannot be mocked because it is marked final.
+    // We have to use the real versions.
+    private final PersistableBundle mCarrierConfig = new PersistableBundle();
+    private final TestLooper mLooper = new TestLooper();
+    private Context mMockContext;
+
+    private TestStateMachine mSM;
+    private WrappedEntitlementManager mEnMgr;
+    private TetheringConfiguration mConfig;
+    private MockitoSession mMockingSession;
+
+    private class MockContext extends BroadcastInterceptingContext {
+        MockContext(Context base) {
+            super(base);
+        }
+
+        @Override
+        public Resources getResources() {
+            return mResources;
+        }
+    }
+
+    public class WrappedEntitlementManager extends EntitlementManager {
+        public int fakeEntitlementResult = TETHER_ERROR_ENTITLEMENT_UNKNOWN;
+        public int uiProvisionCount = 0;
+        public int silentProvisionCount = 0;
+
+        public WrappedEntitlementManager(Context ctx, StateMachine target,
+                SharedLog log, int what) {
+            super(ctx, target, log, what);
+        }
+
+        public void reset() {
+            fakeEntitlementResult = TETHER_ERROR_ENTITLEMENT_UNKNOWN;
+            uiProvisionCount = 0;
+            silentProvisionCount = 0;
+        }
+
+        @Override
+        protected void runUiTetherProvisioning(int type, int subId, ResultReceiver receiver) {
+            uiProvisionCount++;
+            receiver.send(fakeEntitlementResult, null);
+        }
+
+        @Override
+        protected void runSilentTetherProvisioning(int type, int subId) {
+            silentProvisionCount++;
+            addDownstreamMapping(type, fakeEntitlementResult);
+        }
+    }
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mMockingSession = mockitoSession()
+                .initMocks(this)
+                .mockStatic(SystemProperties.class)
+                .mockStatic(DeviceConfig.class)
+                .strictness(Strictness.WARN)
+                .startMocking();
+        // Don't disable tethering provisioning unless requested.
+        doReturn(false).when(
+                () -> SystemProperties.getBoolean(
+                eq(EntitlementManager.DISABLE_PROVISIONING_SYSPROP_KEY), anyBoolean()));
+        doReturn(false).when(
+                () -> DeviceConfig.getBoolean(eq(NAMESPACE_CONNECTIVITY),
+                eq(TetheringConfiguration.TETHER_ENABLE_LEGACY_DHCP_SERVER), anyBoolean()));
+
+        when(mResources.getStringArray(R.array.config_tether_dhcp_range))
+                .thenReturn(new String[0]);
+        when(mResources.getStringArray(R.array.config_tether_usb_regexs))
+                .thenReturn(new String[0]);
+        when(mResources.getStringArray(R.array.config_tether_wifi_regexs))
+                .thenReturn(new String[0]);
+        when(mResources.getStringArray(R.array.config_tether_bluetooth_regexs))
+                .thenReturn(new String[0]);
+        when(mResources.getIntArray(R.array.config_tether_upstream_types))
+                .thenReturn(new int[0]);
+        when(mResources.getBoolean(R.bool.config_tether_enable_legacy_dhcp_server)).thenReturn(
+                false);
+        when(mResources.getString(R.string.config_wifi_tether_enable)).thenReturn("");
+        when(mLog.forSubComponent(anyString())).thenReturn(mLog);
+
+        mMockContext = new MockContext(mContext);
+        mSM = new TestStateMachine();
+        mEnMgr = new WrappedEntitlementManager(mMockContext, mSM, mLog, EVENT_EM_UPDATE);
+        mEnMgr.setOnUiEntitlementFailedListener(mEntitlementFailedListener);
+        mConfig = new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID);
+        mEnMgr.setTetheringConfigurationFetcher(() -> {
+            return mConfig;
+        });
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        if (mSM != null) {
+            mSM.quit();
+            mSM = null;
+        }
+        mMockingSession.finishMocking();
+    }
+
+    private void setupForRequiredProvisioning() {
+        // Produce some acceptable looking provision app setting if requested.
+        when(mResources.getStringArray(R.array.config_mobile_hotspot_provision_app))
+                .thenReturn(PROVISIONING_APP_NAME);
+        when(mResources.getString(R.string.config_mobile_hotspot_provision_app_no_ui))
+                .thenReturn(PROVISIONING_NO_UI_APP_NAME);
+        // Act like the CarrierConfigManager is present and ready unless told otherwise.
+        when(mContext.getSystemService(Context.CARRIER_CONFIG_SERVICE))
+                .thenReturn(mCarrierConfigManager);
+        when(mCarrierConfigManager.getConfigForSubId(anyInt())).thenReturn(mCarrierConfig);
+        mCarrierConfig.putBoolean(CarrierConfigManager.KEY_REQUIRE_ENTITLEMENT_CHECKS_BOOL, true);
+        mCarrierConfig.putBoolean(CarrierConfigManager.KEY_CARRIER_CONFIG_APPLIED_BOOL, true);
+        mConfig = new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID);
+    }
+
+    @Test
+    public void canRequireProvisioning() {
+        setupForRequiredProvisioning();
+        assertTrue(mEnMgr.isTetherProvisioningRequired(mConfig));
+    }
+
+    @Test
+    public void toleratesCarrierConfigManagerMissing() {
+        setupForRequiredProvisioning();
+        when(mContext.getSystemService(Context.CARRIER_CONFIG_SERVICE))
+            .thenReturn(null);
+        mConfig = new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID);
+        // Couldn't get the CarrierConfigManager, but still had a declared provisioning app.
+        // Therefore provisioning still be required.
+        assertTrue(mEnMgr.isTetherProvisioningRequired(mConfig));
+    }
+
+    @Test
+    public void toleratesCarrierConfigMissing() {
+        setupForRequiredProvisioning();
+        when(mCarrierConfigManager.getConfig()).thenReturn(null);
+        mConfig = new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID);
+        // We still have a provisioning app configured, so still require provisioning.
+        assertTrue(mEnMgr.isTetherProvisioningRequired(mConfig));
+    }
+
+    @Test
+    public void toleratesCarrierConfigNotLoaded() {
+        setupForRequiredProvisioning();
+        mCarrierConfig.putBoolean(CarrierConfigManager.KEY_CARRIER_CONFIG_APPLIED_BOOL, false);
+        // We still have a provisioning app configured, so still require provisioning.
+        assertTrue(mEnMgr.isTetherProvisioningRequired(mConfig));
+    }
+
+    @Test
+    public void provisioningNotRequiredWhenAppNotFound() {
+        setupForRequiredProvisioning();
+        when(mResources.getStringArray(R.array.config_mobile_hotspot_provision_app))
+            .thenReturn(null);
+        mConfig = new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID);
+        assertFalse(mEnMgr.isTetherProvisioningRequired(mConfig));
+        when(mResources.getStringArray(R.array.config_mobile_hotspot_provision_app))
+            .thenReturn(new String[] {"malformedApp"});
+        mConfig = new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID);
+        assertFalse(mEnMgr.isTetherProvisioningRequired(mConfig));
+    }
+
+    @Test
+    public void testRequestLastEntitlementCacheValue() throws Exception {
+        // 1. Entitlement check is not required.
+        mEnMgr.fakeEntitlementResult = TETHER_ERROR_NO_ERROR;
+        ResultReceiver receiver = new ResultReceiver(null) {
+            @Override
+            protected void onReceiveResult(int resultCode, Bundle resultData) {
+                assertEquals(TETHER_ERROR_NO_ERROR, resultCode);
+            }
+        };
+        mEnMgr.requestLatestTetheringEntitlementResult(TETHERING_WIFI, receiver, true);
+        mLooper.dispatchAll();
+        assertEquals(0, mEnMgr.uiProvisionCount);
+        mEnMgr.reset();
+
+        setupForRequiredProvisioning();
+        // 2. No cache value and don't need to run entitlement check.
+        receiver = new ResultReceiver(null) {
+            @Override
+            protected void onReceiveResult(int resultCode, Bundle resultData) {
+                assertEquals(TETHER_ERROR_ENTITLEMENT_UNKNOWN, resultCode);
+            }
+        };
+        mEnMgr.requestLatestTetheringEntitlementResult(TETHERING_WIFI, receiver, false);
+        mLooper.dispatchAll();
+        assertEquals(0, mEnMgr.uiProvisionCount);
+        mEnMgr.reset();
+        // 3. No cache value and ui entitlement check is needed.
+        mEnMgr.fakeEntitlementResult = TETHER_ERROR_PROVISIONING_FAILED;
+        receiver = new ResultReceiver(null) {
+            @Override
+            protected void onReceiveResult(int resultCode, Bundle resultData) {
+                assertEquals(TETHER_ERROR_PROVISIONING_FAILED, resultCode);
+            }
+        };
+        mEnMgr.requestLatestTetheringEntitlementResult(TETHERING_WIFI, receiver, true);
+        mLooper.dispatchAll();
+        assertEquals(1, mEnMgr.uiProvisionCount);
+        mEnMgr.reset();
+        // 4. Cache value is TETHER_ERROR_PROVISIONING_FAILED and don't need to run entitlement
+        // check.
+        mEnMgr.fakeEntitlementResult = TETHER_ERROR_NO_ERROR;
+        receiver = new ResultReceiver(null) {
+            @Override
+            protected void onReceiveResult(int resultCode, Bundle resultData) {
+                assertEquals(TETHER_ERROR_PROVISIONING_FAILED, resultCode);
+            }
+        };
+        mEnMgr.requestLatestTetheringEntitlementResult(TETHERING_WIFI, receiver, false);
+        mLooper.dispatchAll();
+        assertEquals(0, mEnMgr.uiProvisionCount);
+        mEnMgr.reset();
+        // 5. Cache value is TETHER_ERROR_PROVISIONING_FAILED and ui entitlement check is needed.
+        mEnMgr.fakeEntitlementResult = TETHER_ERROR_NO_ERROR;
+        receiver = new ResultReceiver(null) {
+            @Override
+            protected void onReceiveResult(int resultCode, Bundle resultData) {
+                assertEquals(TETHER_ERROR_NO_ERROR, resultCode);
+            }
+        };
+        mEnMgr.requestLatestTetheringEntitlementResult(TETHERING_WIFI, receiver, true);
+        mLooper.dispatchAll();
+        assertEquals(1, mEnMgr.uiProvisionCount);
+        mEnMgr.reset();
+        // 6. Cache value is TETHER_ERROR_NO_ERROR.
+        mEnMgr.fakeEntitlementResult = TETHER_ERROR_NO_ERROR;
+        receiver = new ResultReceiver(null) {
+            @Override
+            protected void onReceiveResult(int resultCode, Bundle resultData) {
+                assertEquals(TETHER_ERROR_NO_ERROR, resultCode);
+            }
+        };
+        mEnMgr.requestLatestTetheringEntitlementResult(TETHERING_WIFI, receiver, true);
+        mLooper.dispatchAll();
+        assertEquals(0, mEnMgr.uiProvisionCount);
+        mEnMgr.reset();
+        // 7. Test get value for other downstream type.
+        receiver = new ResultReceiver(null) {
+            @Override
+            protected void onReceiveResult(int resultCode, Bundle resultData) {
+                assertEquals(TETHER_ERROR_ENTITLEMENT_UNKNOWN, resultCode);
+            }
+        };
+        mEnMgr.requestLatestTetheringEntitlementResult(TETHERING_USB, receiver, false);
+        mLooper.dispatchAll();
+        assertEquals(0, mEnMgr.uiProvisionCount);
+        mEnMgr.reset();
+        // 8. Test get value for invalid downstream type.
+        mEnMgr.fakeEntitlementResult = TETHER_ERROR_NO_ERROR;
+        receiver = new ResultReceiver(null) {
+            @Override
+            protected void onReceiveResult(int resultCode, Bundle resultData) {
+                assertEquals(TETHER_ERROR_ENTITLEMENT_UNKNOWN, resultCode);
+            }
+        };
+        mEnMgr.requestLatestTetheringEntitlementResult(TETHERING_WIFI_P2P, receiver, true);
+        mLooper.dispatchAll();
+        assertEquals(0, mEnMgr.uiProvisionCount);
+        mEnMgr.reset();
+    }
+
+    @Test
+    public void verifyPermissionResult() {
+        setupForRequiredProvisioning();
+        mEnMgr.notifyUpstream(true);
+        mEnMgr.fakeEntitlementResult = TETHER_ERROR_PROVISIONING_FAILED;
+        mEnMgr.startProvisioningIfNeeded(TETHERING_WIFI, true);
+        mLooper.dispatchAll();
+        assertFalse(mEnMgr.isCellularUpstreamPermitted());
+        mEnMgr.stopProvisioningIfNeeded(TETHERING_WIFI);
+        mLooper.dispatchAll();
+        mEnMgr.fakeEntitlementResult = TETHER_ERROR_NO_ERROR;
+        mEnMgr.startProvisioningIfNeeded(TETHERING_WIFI, true);
+        mLooper.dispatchAll();
+        assertTrue(mEnMgr.isCellularUpstreamPermitted());
+    }
+
+    @Test
+    public void verifyPermissionIfAllNotApproved() {
+        setupForRequiredProvisioning();
+        mEnMgr.notifyUpstream(true);
+        mEnMgr.fakeEntitlementResult = TETHER_ERROR_PROVISIONING_FAILED;
+        mEnMgr.startProvisioningIfNeeded(TETHERING_WIFI, true);
+        mLooper.dispatchAll();
+        assertFalse(mEnMgr.isCellularUpstreamPermitted());
+        mEnMgr.fakeEntitlementResult = TETHER_ERROR_PROVISIONING_FAILED;
+        mEnMgr.startProvisioningIfNeeded(TETHERING_USB, true);
+        mLooper.dispatchAll();
+        assertFalse(mEnMgr.isCellularUpstreamPermitted());
+        mEnMgr.fakeEntitlementResult = TETHER_ERROR_PROVISIONING_FAILED;
+        mEnMgr.startProvisioningIfNeeded(TETHERING_BLUETOOTH, true);
+        mLooper.dispatchAll();
+        assertFalse(mEnMgr.isCellularUpstreamPermitted());
+    }
+
+    @Test
+    public void verifyPermissionIfAnyApproved() {
+        setupForRequiredProvisioning();
+        mEnMgr.notifyUpstream(true);
+        mEnMgr.fakeEntitlementResult = TETHER_ERROR_NO_ERROR;
+        mEnMgr.startProvisioningIfNeeded(TETHERING_WIFI, true);
+        mLooper.dispatchAll();
+        assertTrue(mEnMgr.isCellularUpstreamPermitted());
+        mLooper.dispatchAll();
+        mEnMgr.fakeEntitlementResult = TETHER_ERROR_PROVISIONING_FAILED;
+        mEnMgr.startProvisioningIfNeeded(TETHERING_USB, true);
+        mLooper.dispatchAll();
+        assertTrue(mEnMgr.isCellularUpstreamPermitted());
+        mEnMgr.stopProvisioningIfNeeded(TETHERING_WIFI);
+        mLooper.dispatchAll();
+        assertFalse(mEnMgr.isCellularUpstreamPermitted());
+
+    }
+
+    @Test
+    public void verifyPermissionWhenProvisioningNotStarted() {
+        assertTrue(mEnMgr.isCellularUpstreamPermitted());
+        setupForRequiredProvisioning();
+        assertFalse(mEnMgr.isCellularUpstreamPermitted());
+    }
+
+    @Test
+    public void testRunTetherProvisioning() {
+        setupForRequiredProvisioning();
+        // 1. start ui provisioning, upstream is mobile
+        mEnMgr.fakeEntitlementResult = TETHER_ERROR_NO_ERROR;
+        mEnMgr.notifyUpstream(true);
+        mLooper.dispatchAll();
+        mEnMgr.startProvisioningIfNeeded(TETHERING_USB, true);
+        mLooper.dispatchAll();
+        assertEquals(1, mEnMgr.uiProvisionCount);
+        assertEquals(0, mEnMgr.silentProvisionCount);
+        assertTrue(mEnMgr.isCellularUpstreamPermitted());
+        mEnMgr.reset();
+        // 2. start no-ui provisioning
+        mEnMgr.fakeEntitlementResult = TETHER_ERROR_NO_ERROR;
+        mEnMgr.startProvisioningIfNeeded(TETHERING_WIFI, false);
+        mLooper.dispatchAll();
+        assertEquals(0, mEnMgr.uiProvisionCount);
+        assertEquals(1, mEnMgr.silentProvisionCount);
+        assertTrue(mEnMgr.isCellularUpstreamPermitted());
+        mEnMgr.reset();
+        // 3. tear down mobile, then start ui provisioning
+        mEnMgr.notifyUpstream(false);
+        mLooper.dispatchAll();
+        mEnMgr.startProvisioningIfNeeded(TETHERING_BLUETOOTH, true);
+        mLooper.dispatchAll();
+        assertEquals(0, mEnMgr.uiProvisionCount);
+        assertEquals(0, mEnMgr.silentProvisionCount);
+        mEnMgr.reset();
+        // 4. switch upstream back to mobile
+        mEnMgr.fakeEntitlementResult = TETHER_ERROR_NO_ERROR;
+        mEnMgr.notifyUpstream(true);
+        mLooper.dispatchAll();
+        assertEquals(1, mEnMgr.uiProvisionCount);
+        assertEquals(0, mEnMgr.silentProvisionCount);
+        assertTrue(mEnMgr.isCellularUpstreamPermitted());
+        mEnMgr.reset();
+        // 5. tear down mobile, then switch SIM
+        mEnMgr.notifyUpstream(false);
+        mLooper.dispatchAll();
+        mEnMgr.reevaluateSimCardProvisioning(mConfig);
+        assertEquals(0, mEnMgr.uiProvisionCount);
+        assertEquals(0, mEnMgr.silentProvisionCount);
+        mEnMgr.reset();
+        // 6. switch upstream back to mobile again
+        mEnMgr.fakeEntitlementResult = TETHER_ERROR_PROVISIONING_FAILED;
+        mEnMgr.notifyUpstream(true);
+        mLooper.dispatchAll();
+        assertEquals(0, mEnMgr.uiProvisionCount);
+        assertEquals(3, mEnMgr.silentProvisionCount);
+        assertFalse(mEnMgr.isCellularUpstreamPermitted());
+        mEnMgr.reset();
+        // 7. start ui provisioning, upstream is mobile, downstream is ethernet
+        mEnMgr.fakeEntitlementResult = TETHER_ERROR_NO_ERROR;
+        mEnMgr.startProvisioningIfNeeded(TETHERING_ETHERNET, true);
+        mLooper.dispatchAll();
+        assertEquals(1, mEnMgr.uiProvisionCount);
+        assertEquals(0, mEnMgr.silentProvisionCount);
+        assertTrue(mEnMgr.isCellularUpstreamPermitted());
+        mEnMgr.reset();
+        // 8. downstream is invalid
+        mEnMgr.fakeEntitlementResult = TETHER_ERROR_NO_ERROR;
+        mEnMgr.startProvisioningIfNeeded(TETHERING_WIFI_P2P, true);
+        mLooper.dispatchAll();
+        assertEquals(0, mEnMgr.uiProvisionCount);
+        assertEquals(0, mEnMgr.silentProvisionCount);
+        mEnMgr.reset();
+    }
+
+    @Test
+    public void testCallStopTetheringWhenUiProvisioningFail() {
+        setupForRequiredProvisioning();
+        verify(mEntitlementFailedListener, times(0)).onUiEntitlementFailed(TETHERING_WIFI);
+        mEnMgr.fakeEntitlementResult = TETHER_ERROR_PROVISIONING_FAILED;
+        mEnMgr.notifyUpstream(true);
+        mLooper.dispatchAll();
+        mEnMgr.startProvisioningIfNeeded(TETHERING_WIFI, true);
+        mLooper.dispatchAll();
+        assertEquals(1, mEnMgr.uiProvisionCount);
+        verify(mEntitlementFailedListener, times(1)).onUiEntitlementFailed(TETHERING_WIFI);
+    }
+
+    public class TestStateMachine extends StateMachine {
+        public final ArrayList<Message> messages = new ArrayList<>();
+        private final State
+                mLoggingState = new EntitlementManagerTest.TestStateMachine.LoggingState();
+
+        class LoggingState extends State {
+            @Override public void enter() {
+                messages.clear();
+            }
+
+            @Override public void exit() {
+                messages.clear();
+            }
+
+            @Override public boolean processMessage(Message msg) {
+                messages.add(msg);
+                return false;
+            }
+        }
+
+        public TestStateMachine() {
+            super("EntitlementManagerTest.TestStateMachine", mLooper.getLooper());
+            addState(mLoggingState);
+            setInitialState(mLoggingState);
+            super.start();
+        }
+    }
+}
diff --git a/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/IPv6TetheringCoordinatorTest.java b/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/IPv6TetheringCoordinatorTest.java
new file mode 100644
index 0000000..820f255
--- /dev/null
+++ b/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/IPv6TetheringCoordinatorTest.java
@@ -0,0 +1,156 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.networkstack.tethering;
+
+import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
+import static android.net.RouteInfo.RTN_UNICAST;
+import static android.net.ip.IpServer.STATE_LOCAL_ONLY;
+import static android.net.ip.IpServer.STATE_TETHERED;
+
+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.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
+import android.net.InetAddresses;
+import android.net.IpPrefix;
+import android.net.LinkAddress;
+import android.net.LinkProperties;
+import android.net.Network;
+import android.net.NetworkCapabilities;
+import android.net.RouteInfo;
+import android.net.ip.IpServer;
+import android.net.util.SharedLog;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.net.InetAddress;
+import java.util.ArrayList;
+import java.util.List;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class IPv6TetheringCoordinatorTest {
+    private static final String TEST_DNS_SERVER = "2001:4860:4860::8888";
+    private static final String TEST_INTERFACE = "test_rmnet0";
+    private static final String TEST_IPV6_ADDRESS = "2001:db8::1/64";
+    private static final String TEST_IPV4_ADDRESS = "192.168.100.1/24";
+
+    private IPv6TetheringCoordinator mIPv6TetheringCoordinator;
+    private ArrayList<IpServer> mNotifyList;
+
+    @Mock private SharedLog mSharedLog;
+
+    @Before
+    public void setUp() throws Exception {
+        MockitoAnnotations.initMocks(this);
+        when(mSharedLog.forSubComponent(anyString())).thenReturn(mSharedLog);
+        mNotifyList = new ArrayList<IpServer>();
+        mIPv6TetheringCoordinator = new IPv6TetheringCoordinator(mNotifyList, mSharedLog);
+    }
+
+    private UpstreamNetworkState createDualStackUpstream(final int transportType) {
+        final Network network = mock(Network.class);
+        final NetworkCapabilities netCap =
+                new NetworkCapabilities.Builder().addTransportType(transportType).build();
+        final InetAddress dns = InetAddresses.parseNumericAddress(TEST_DNS_SERVER);
+        final LinkProperties linkProp = new LinkProperties();
+        linkProp.setInterfaceName(TEST_INTERFACE);
+        linkProp.addLinkAddress(new LinkAddress(TEST_IPV6_ADDRESS));
+        linkProp.addLinkAddress(new LinkAddress(TEST_IPV4_ADDRESS));
+        linkProp.addRoute(new RouteInfo(new IpPrefix("::/0"), null, TEST_INTERFACE, RTN_UNICAST));
+        linkProp.addRoute(new RouteInfo(new IpPrefix("0.0.0.0/0"), null, TEST_INTERFACE,
+                    RTN_UNICAST));
+        linkProp.addDnsServer(dns);
+        return new UpstreamNetworkState(linkProp, netCap, network);
+    }
+
+    private void assertOnlyOneV6AddressAndNoV4(LinkProperties lp) {
+        assertEquals(lp.getInterfaceName(), TEST_INTERFACE);
+        assertFalse(lp.hasIpv4Address());
+        final List<LinkAddress> addresses = lp.getLinkAddresses();
+        assertEquals(addresses.size(), 1);
+        final LinkAddress v6Address = addresses.get(0);
+        assertEquals(v6Address, new LinkAddress(TEST_IPV6_ADDRESS));
+    }
+
+    @Test
+    public void testUpdateIpv6Upstream() throws Exception {
+        // 1. Add first IpServer.
+        final IpServer firstServer = mock(IpServer.class);
+        mNotifyList.add(firstServer);
+        mIPv6TetheringCoordinator.addActiveDownstream(firstServer, STATE_TETHERED);
+        verify(firstServer).sendMessage(IpServer.CMD_IPV6_TETHER_UPDATE, 0, 0, null);
+        verifyNoMoreInteractions(firstServer);
+
+        // 2. Add second IpServer and it would not have ipv6 tethering.
+        final IpServer secondServer = mock(IpServer.class);
+        mNotifyList.add(secondServer);
+        mIPv6TetheringCoordinator.addActiveDownstream(secondServer, STATE_LOCAL_ONLY);
+        verifyNoMoreInteractions(secondServer);
+        reset(firstServer, secondServer);
+
+        // 3. No upstream.
+        mIPv6TetheringCoordinator.updateUpstreamNetworkState(null);
+        verify(secondServer).sendMessage(IpServer.CMD_IPV6_TETHER_UPDATE, 0, 0, null);
+        reset(firstServer, secondServer);
+
+        // 4. Update ipv6 mobile upstream.
+        final UpstreamNetworkState mobileUpstream = createDualStackUpstream(TRANSPORT_CELLULAR);
+        final ArgumentCaptor<LinkProperties> lp = ArgumentCaptor.forClass(LinkProperties.class);
+        mIPv6TetheringCoordinator.updateUpstreamNetworkState(mobileUpstream);
+        verify(firstServer).sendMessage(eq(IpServer.CMD_IPV6_TETHER_UPDATE), eq(0), eq(0),
+                lp.capture());
+        final LinkProperties v6OnlyLink = lp.getValue();
+        assertOnlyOneV6AddressAndNoV4(v6OnlyLink);
+        verifyNoMoreInteractions(firstServer);
+        verifyNoMoreInteractions(secondServer);
+        reset(firstServer, secondServer);
+
+        // 5. Remove first IpServer.
+        mNotifyList.remove(firstServer);
+        mIPv6TetheringCoordinator.removeActiveDownstream(firstServer);
+        verify(firstServer).sendMessage(IpServer.CMD_IPV6_TETHER_UPDATE, 0, 0, null);
+        verify(secondServer).sendMessage(eq(IpServer.CMD_IPV6_TETHER_UPDATE), eq(0), eq(0),
+                lp.capture());
+        final LinkProperties localOnlyLink = lp.getValue();
+        assertNotNull(localOnlyLink);
+        assertNotEquals(localOnlyLink, v6OnlyLink);
+        reset(firstServer, secondServer);
+
+        // 6. Remove second IpServer.
+        mNotifyList.remove(secondServer);
+        mIPv6TetheringCoordinator.removeActiveDownstream(secondServer);
+        verifyNoMoreInteractions(firstServer);
+        verify(secondServer).sendMessage(IpServer.CMD_IPV6_TETHER_UPDATE, 0, 0, null);
+    }
+}
diff --git a/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/MockTetheringService.java b/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/MockTetheringService.java
new file mode 100644
index 0000000..1c81c12
--- /dev/null
+++ b/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/MockTetheringService.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.networkstack.tethering;
+
+import static org.mockito.Mockito.mock;
+
+import android.content.Intent;
+import android.net.ITetheringConnector;
+import android.os.Binder;
+import android.os.IBinder;
+
+public class MockTetheringService extends TetheringService {
+    private final Tethering mTethering = mock(Tethering.class);
+
+    @Override
+    public IBinder onBind(Intent intent) {
+        return new MockTetheringConnector(super.onBind(intent));
+    }
+
+    @Override
+    public Tethering makeTethering(TetheringDependencies deps) {
+        return mTethering;
+    }
+
+    public Tethering getTethering() {
+        return mTethering;
+    }
+
+    public class MockTetheringConnector extends Binder {
+        final IBinder mBase;
+        MockTetheringConnector(IBinder base) {
+            mBase = base;
+        }
+
+        public ITetheringConnector getTetheringConnector() {
+            return ITetheringConnector.Stub.asInterface(mBase);
+        }
+
+        public MockTetheringService getService() {
+            return MockTetheringService.this;
+        }
+    }
+}
diff --git a/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/OffloadControllerTest.java b/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/OffloadControllerTest.java
new file mode 100644
index 0000000..6579720
--- /dev/null
+++ b/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/OffloadControllerTest.java
@@ -0,0 +1,777 @@
+/*
+ * Copyright (C) 2017 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.networkstack.tethering;
+
+import static android.net.NetworkStats.DEFAULT_NETWORK_NO;
+import static android.net.NetworkStats.METERED_NO;
+import static android.net.NetworkStats.ROAMING_NO;
+import static android.net.NetworkStats.SET_DEFAULT;
+import static android.net.NetworkStats.TAG_NONE;
+import static android.net.NetworkStats.UID_ALL;
+import static android.net.NetworkStats.UID_TETHERING;
+import static android.net.RouteInfo.RTN_UNICAST;
+import static android.provider.Settings.Global.TETHER_OFFLOAD_DISABLED;
+
+import static com.android.networkstack.tethering.OffloadController.StatsType.STATS_PER_IFACE;
+import static com.android.networkstack.tethering.OffloadController.StatsType.STATS_PER_UID;
+import static com.android.networkstack.tethering.OffloadHardwareInterface.ForwardedStats;
+import static com.android.testutils.MiscAssertsKt.assertContainsAll;
+import static com.android.testutils.MiscAssertsKt.assertThrows;
+import static com.android.testutils.NetworkStatsUtilsKt.orderInsensitiveEquals;
+
+import static junit.framework.Assert.assertNotNull;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyLong;
+import static org.mockito.Matchers.anyObject;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.clearInvocations;
+import static org.mockito.Mockito.inOrder;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
+import android.annotation.NonNull;
+import android.app.usage.NetworkStatsManager;
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.net.ITetheringStatsProvider;
+import android.net.IpPrefix;
+import android.net.LinkAddress;
+import android.net.LinkProperties;
+import android.net.NetworkStats;
+import android.net.NetworkStats.Entry;
+import android.net.RouteInfo;
+import android.net.netstats.provider.INetworkStatsProviderCallback;
+import android.net.util.SharedLog;
+import android.os.Handler;
+import android.os.Looper;
+import android.provider.Settings;
+import android.provider.Settings.SettingNotFoundException;
+import android.test.mock.MockContentResolver;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import com.android.internal.util.test.FakeSettingsProvider;
+import com.android.testutils.HandlerUtilsKt;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.InOrder;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.net.InetAddress;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Set;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class OffloadControllerTest {
+    private static final String RNDIS0 = "test_rndis0";
+    private static final String RMNET0 = "test_rmnet_data0";
+    private static final String WLAN0 = "test_wlan0";
+
+    private static final String IPV6_LINKLOCAL = "fe80::/64";
+    private static final String IPV6_DOC_PREFIX = "2001:db8::/64";
+    private static final String IPV6_DISCARD_PREFIX = "100::/64";
+    private static final String USB_PREFIX = "192.168.42.0/24";
+    private static final String WIFI_PREFIX = "192.168.43.0/24";
+    private static final long WAIT_FOR_IDLE_TIMEOUT = 2 * 1000;
+
+    @Mock private OffloadHardwareInterface mHardware;
+    @Mock private ApplicationInfo mApplicationInfo;
+    @Mock private Context mContext;
+    @Mock private NetworkStatsManager mStatsManager;
+    @Mock private INetworkStatsProviderCallback mTetherStatsProviderCb;
+    private OffloadController.OffloadTetheringStatsProvider mTetherStatsProvider;
+    private final ArgumentCaptor<ArrayList> mStringArrayCaptor =
+            ArgumentCaptor.forClass(ArrayList.class);
+    private final ArgumentCaptor<OffloadHardwareInterface.ControlCallback> mControlCallbackCaptor =
+            ArgumentCaptor.forClass(OffloadHardwareInterface.ControlCallback.class);
+    private MockContentResolver mContentResolver;
+
+    @Before public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        when(mContext.getApplicationInfo()).thenReturn(mApplicationInfo);
+        when(mContext.getPackageName()).thenReturn("OffloadControllerTest");
+        mContentResolver = new MockContentResolver(mContext);
+        mContentResolver.addProvider(Settings.AUTHORITY, new FakeSettingsProvider());
+        when(mContext.getContentResolver()).thenReturn(mContentResolver);
+        FakeSettingsProvider.clearSettingsProvider();
+    }
+
+    @After public void tearDown() throws Exception {
+        FakeSettingsProvider.clearSettingsProvider();
+    }
+
+    private void setupFunctioningHardwareInterface() {
+        when(mHardware.initOffloadConfig()).thenReturn(true);
+        when(mHardware.initOffloadControl(mControlCallbackCaptor.capture()))
+                .thenReturn(true);
+        when(mHardware.setUpstreamParameters(anyString(), any(), any(), any())).thenReturn(true);
+        when(mHardware.getForwardedStats(any())).thenReturn(new ForwardedStats());
+        when(mHardware.setDataLimit(anyString(), anyLong())).thenReturn(true);
+    }
+
+    private void enableOffload() {
+        Settings.Global.putInt(mContentResolver, TETHER_OFFLOAD_DISABLED, 0);
+    }
+
+    private void waitForIdle() {
+        HandlerUtilsKt.waitForIdle(new Handler(Looper.getMainLooper()), WAIT_FOR_IDLE_TIMEOUT);
+    }
+
+    private OffloadController makeOffloadController() throws Exception {
+        OffloadController offload = new OffloadController(new Handler(Looper.getMainLooper()),
+                mHardware, mContentResolver, mStatsManager, new SharedLog("test"));
+        final ArgumentCaptor<OffloadController.OffloadTetheringStatsProvider>
+                tetherStatsProviderCaptor =
+                ArgumentCaptor.forClass(OffloadController.OffloadTetheringStatsProvider.class);
+        verify(mStatsManager).registerNetworkStatsProvider(anyString(),
+                tetherStatsProviderCaptor.capture());
+        mTetherStatsProvider = tetherStatsProviderCaptor.getValue();
+        assertNotNull(mTetherStatsProvider);
+        mTetherStatsProvider.setProviderCallbackBinder(mTetherStatsProviderCb);
+        return offload;
+    }
+
+    @Test
+    public void testNoSettingsValueDefaultDisabledDoesNotStart() throws Exception {
+        setupFunctioningHardwareInterface();
+        when(mHardware.getDefaultTetherOffloadDisabled()).thenReturn(1);
+        assertThrows(SettingNotFoundException.class, () ->
+                Settings.Global.getInt(mContentResolver, TETHER_OFFLOAD_DISABLED));
+
+        final OffloadController offload = makeOffloadController();
+        offload.start();
+
+        final InOrder inOrder = inOrder(mHardware);
+        inOrder.verify(mHardware, times(1)).getDefaultTetherOffloadDisabled();
+        inOrder.verify(mHardware, never()).initOffloadConfig();
+        inOrder.verify(mHardware, never()).initOffloadControl(
+                any(OffloadHardwareInterface.ControlCallback.class));
+        inOrder.verifyNoMoreInteractions();
+    }
+
+    @Test
+    public void testNoSettingsValueDefaultEnabledDoesStart() throws Exception {
+        setupFunctioningHardwareInterface();
+        when(mHardware.getDefaultTetherOffloadDisabled()).thenReturn(0);
+        assertThrows(SettingNotFoundException.class, () ->
+                Settings.Global.getInt(mContentResolver, TETHER_OFFLOAD_DISABLED));
+
+        final OffloadController offload = makeOffloadController();
+        offload.start();
+
+        final InOrder inOrder = inOrder(mHardware);
+        inOrder.verify(mHardware, times(1)).getDefaultTetherOffloadDisabled();
+        inOrder.verify(mHardware, times(1)).initOffloadConfig();
+        inOrder.verify(mHardware, times(1)).initOffloadControl(
+                any(OffloadHardwareInterface.ControlCallback.class));
+        inOrder.verifyNoMoreInteractions();
+    }
+
+    @Test
+    public void testSettingsAllowsStart() throws Exception {
+        setupFunctioningHardwareInterface();
+        Settings.Global.putInt(mContentResolver, TETHER_OFFLOAD_DISABLED, 0);
+
+        final OffloadController offload = makeOffloadController();
+        offload.start();
+
+        final InOrder inOrder = inOrder(mHardware);
+        inOrder.verify(mHardware, times(1)).getDefaultTetherOffloadDisabled();
+        inOrder.verify(mHardware, times(1)).initOffloadConfig();
+        inOrder.verify(mHardware, times(1)).initOffloadControl(
+                any(OffloadHardwareInterface.ControlCallback.class));
+        inOrder.verifyNoMoreInteractions();
+    }
+
+    @Test
+    public void testSettingsDisablesStart() throws Exception {
+        setupFunctioningHardwareInterface();
+        Settings.Global.putInt(mContentResolver, TETHER_OFFLOAD_DISABLED, 1);
+
+        final OffloadController offload = makeOffloadController();
+        offload.start();
+
+        final InOrder inOrder = inOrder(mHardware);
+        inOrder.verify(mHardware, times(1)).getDefaultTetherOffloadDisabled();
+        inOrder.verify(mHardware, never()).initOffloadConfig();
+        inOrder.verify(mHardware, never()).initOffloadControl(anyObject());
+        inOrder.verifyNoMoreInteractions();
+    }
+
+    @Test
+    public void testSetUpstreamLinkPropertiesWorking() throws Exception {
+        setupFunctioningHardwareInterface();
+        enableOffload();
+
+        final OffloadController offload = makeOffloadController();
+        offload.start();
+
+        final InOrder inOrder = inOrder(mHardware);
+        inOrder.verify(mHardware, times(1)).getDefaultTetherOffloadDisabled();
+        inOrder.verify(mHardware, times(1)).initOffloadConfig();
+        inOrder.verify(mHardware, times(1)).initOffloadControl(
+                any(OffloadHardwareInterface.ControlCallback.class));
+        inOrder.verifyNoMoreInteractions();
+
+        // In reality, the UpstreamNetworkMonitor would have passed down to us
+        // a covering set of local prefixes representing a minimum essential
+        // set plus all the prefixes on networks with network agents.
+        //
+        // We simulate that there, and then add upstream elements one by one
+        // and watch what happens.
+        final Set<IpPrefix> minimumLocalPrefixes = new HashSet<>();
+        for (String s : new String[]{
+                "127.0.0.0/8", "192.0.2.0/24", "fe80::/64", "2001:db8::/64"}) {
+            minimumLocalPrefixes.add(new IpPrefix(s));
+        }
+        offload.setLocalPrefixes(minimumLocalPrefixes);
+        inOrder.verify(mHardware, times(1)).setLocalPrefixes(mStringArrayCaptor.capture());
+        ArrayList<String> localPrefixes = mStringArrayCaptor.getValue();
+        assertEquals(4, localPrefixes.size());
+        assertContainsAll(localPrefixes,
+                "127.0.0.0/8", "192.0.2.0/24", "fe80::/64", "2001:db8::/64");
+        inOrder.verifyNoMoreInteractions();
+
+        offload.setUpstreamLinkProperties(null);
+        // No change in local addresses means no call to setLocalPrefixes().
+        inOrder.verify(mHardware, never()).setLocalPrefixes(mStringArrayCaptor.capture());
+        // This LinkProperties value does not differ from the default upstream.
+        // There should be no extraneous call to setUpstreamParameters().
+        inOrder.verify(mHardware, never()).setUpstreamParameters(
+                anyObject(), anyObject(), anyObject(), anyObject());
+        inOrder.verifyNoMoreInteractions();
+
+        final LinkProperties lp = new LinkProperties();
+
+        final String testIfName = "rmnet_data17";
+        lp.setInterfaceName(testIfName);
+        offload.setUpstreamLinkProperties(lp);
+        // No change in local addresses means no call to setLocalPrefixes().
+        inOrder.verify(mHardware, never()).setLocalPrefixes(mStringArrayCaptor.capture());
+        inOrder.verify(mHardware, times(1)).setUpstreamParameters(
+                eq(testIfName), eq(null), eq(null), eq(null));
+        inOrder.verify(mHardware, times(1)).setDataLimit(eq(testIfName), eq(Long.MAX_VALUE));
+        inOrder.verifyNoMoreInteractions();
+
+        final String ipv4Addr = "192.0.2.5";
+        final String linkAddr = ipv4Addr + "/24";
+        lp.addLinkAddress(new LinkAddress(linkAddr));
+        lp.addRoute(new RouteInfo(new IpPrefix("192.0.2.0/24"), null, null, RTN_UNICAST));
+        offload.setUpstreamLinkProperties(lp);
+        // IPv4 prefixes and addresses on the upstream are simply left as whole
+        // prefixes (already passed in from UpstreamNetworkMonitor code). If a
+        // tethering client sends traffic to the IPv4 default router or other
+        // clients on the upstream this will not be hardware-forwarded, and that
+        // should be fine for now. Ergo: no change in local addresses, no call
+        // to setLocalPrefixes().
+        inOrder.verify(mHardware, never()).setLocalPrefixes(mStringArrayCaptor.capture());
+        inOrder.verify(mHardware, times(1)).setUpstreamParameters(
+                eq(testIfName), eq(ipv4Addr), eq(null), eq(null));
+        inOrder.verify(mHardware, times(1)).getForwardedStats(eq(testIfName));
+        inOrder.verify(mHardware, times(1)).setDataLimit(eq(testIfName), eq(Long.MAX_VALUE));
+        inOrder.verifyNoMoreInteractions();
+
+        final String ipv4Gateway = "192.0.2.1";
+        lp.addRoute(new RouteInfo(null, InetAddress.getByName(ipv4Gateway), null, RTN_UNICAST));
+        offload.setUpstreamLinkProperties(lp);
+        // No change in local addresses means no call to setLocalPrefixes().
+        inOrder.verify(mHardware, never()).setLocalPrefixes(mStringArrayCaptor.capture());
+        inOrder.verify(mHardware, times(1)).setUpstreamParameters(
+                eq(testIfName), eq(ipv4Addr), eq(ipv4Gateway), eq(null));
+        inOrder.verify(mHardware, times(1)).getForwardedStats(eq(testIfName));
+        inOrder.verify(mHardware, times(1)).setDataLimit(eq(testIfName), eq(Long.MAX_VALUE));
+        inOrder.verifyNoMoreInteractions();
+
+        final String ipv6Gw1 = "fe80::cafe";
+        lp.addRoute(new RouteInfo(null, InetAddress.getByName(ipv6Gw1), null, RTN_UNICAST));
+        offload.setUpstreamLinkProperties(lp);
+        // No change in local addresses means no call to setLocalPrefixes().
+        inOrder.verify(mHardware, never()).setLocalPrefixes(mStringArrayCaptor.capture());
+        inOrder.verify(mHardware, times(1)).setUpstreamParameters(
+                eq(testIfName), eq(ipv4Addr), eq(ipv4Gateway), mStringArrayCaptor.capture());
+        inOrder.verify(mHardware, times(1)).getForwardedStats(eq(testIfName));
+        ArrayList<String> v6gws = mStringArrayCaptor.getValue();
+        assertEquals(1, v6gws.size());
+        assertTrue(v6gws.contains(ipv6Gw1));
+        inOrder.verify(mHardware, times(1)).setDataLimit(eq(testIfName), eq(Long.MAX_VALUE));
+        inOrder.verifyNoMoreInteractions();
+
+        final String ipv6Gw2 = "fe80::d00d";
+        lp.addRoute(new RouteInfo(null, InetAddress.getByName(ipv6Gw2), null, RTN_UNICAST));
+        offload.setUpstreamLinkProperties(lp);
+        // No change in local addresses means no call to setLocalPrefixes().
+        inOrder.verify(mHardware, never()).setLocalPrefixes(mStringArrayCaptor.capture());
+        inOrder.verify(mHardware, times(1)).setUpstreamParameters(
+                eq(testIfName), eq(ipv4Addr), eq(ipv4Gateway), mStringArrayCaptor.capture());
+        inOrder.verify(mHardware, times(1)).getForwardedStats(eq(testIfName));
+        v6gws = mStringArrayCaptor.getValue();
+        assertEquals(2, v6gws.size());
+        assertTrue(v6gws.contains(ipv6Gw1));
+        assertTrue(v6gws.contains(ipv6Gw2));
+        inOrder.verify(mHardware, times(1)).setDataLimit(eq(testIfName), eq(Long.MAX_VALUE));
+        inOrder.verifyNoMoreInteractions();
+
+        final LinkProperties stacked = new LinkProperties();
+        stacked.setInterfaceName("stacked");
+        stacked.addLinkAddress(new LinkAddress("192.0.2.129/25"));
+        stacked.addRoute(new RouteInfo(null, InetAddress.getByName("192.0.2.254"), null,
+                  RTN_UNICAST));
+        stacked.addRoute(new RouteInfo(null, InetAddress.getByName("fe80::bad:f00"), null,
+                  RTN_UNICAST));
+        assertTrue(lp.addStackedLink(stacked));
+        offload.setUpstreamLinkProperties(lp);
+        // No change in local addresses means no call to setLocalPrefixes().
+        inOrder.verify(mHardware, never()).setLocalPrefixes(mStringArrayCaptor.capture());
+        inOrder.verify(mHardware, times(1)).setUpstreamParameters(
+                eq(testIfName), eq(ipv4Addr), eq(ipv4Gateway), mStringArrayCaptor.capture());
+        inOrder.verify(mHardware, times(1)).getForwardedStats(eq(testIfName));
+        v6gws = mStringArrayCaptor.getValue();
+        assertEquals(2, v6gws.size());
+        assertTrue(v6gws.contains(ipv6Gw1));
+        assertTrue(v6gws.contains(ipv6Gw2));
+        inOrder.verify(mHardware, times(1)).setDataLimit(eq(testIfName), eq(Long.MAX_VALUE));
+        inOrder.verifyNoMoreInteractions();
+
+        // Add in some IPv6 upstream info. When there is a tethered downstream
+        // making use of the IPv6 prefix we would expect to see the /64 route
+        // removed from "local prefixes" and /128s added for the upstream IPv6
+        // addresses.  This is not yet implemented, and for now we simply
+        // expect to see these /128s.
+        lp.addRoute(new RouteInfo(new IpPrefix("2001:db8::/64"), null, null, RTN_UNICAST));
+        // "2001:db8::/64" plus "assigned" ASCII in hex
+        lp.addLinkAddress(new LinkAddress("2001:db8::6173:7369:676e:6564/64"));
+        // "2001:db8::/64" plus "random" ASCII in hex
+        lp.addLinkAddress(new LinkAddress("2001:db8::7261:6e64:6f6d/64"));
+        offload.setUpstreamLinkProperties(lp);
+        inOrder.verify(mHardware, times(1)).setLocalPrefixes(mStringArrayCaptor.capture());
+        localPrefixes = mStringArrayCaptor.getValue();
+        assertEquals(6, localPrefixes.size());
+        assertContainsAll(localPrefixes,
+                "127.0.0.0/8", "192.0.2.0/24", "fe80::/64", "2001:db8::/64",
+                "2001:db8::6173:7369:676e:6564/128", "2001:db8::7261:6e64:6f6d/128");
+        // The relevant parts of the LinkProperties have not changed, but at the
+        // moment we do not de-dup upstream LinkProperties this carefully.
+        inOrder.verify(mHardware, times(1)).setUpstreamParameters(
+                eq(testIfName), eq(ipv4Addr), eq(ipv4Gateway), mStringArrayCaptor.capture());
+        v6gws = mStringArrayCaptor.getValue();
+        assertEquals(2, v6gws.size());
+        assertTrue(v6gws.contains(ipv6Gw1));
+        assertTrue(v6gws.contains(ipv6Gw2));
+        inOrder.verify(mHardware, times(1)).getForwardedStats(eq(testIfName));
+        inOrder.verify(mHardware, times(1)).setDataLimit(eq(testIfName), eq(Long.MAX_VALUE));
+        inOrder.verifyNoMoreInteractions();
+
+        // Completely identical LinkProperties updates are de-duped.
+        offload.setUpstreamLinkProperties(lp);
+        // This LinkProperties value does not differ from the default upstream.
+        // There should be no extraneous call to setUpstreamParameters().
+        inOrder.verify(mHardware, never()).setUpstreamParameters(
+                anyObject(), anyObject(), anyObject(), anyObject());
+        inOrder.verifyNoMoreInteractions();
+    }
+
+    private static @NonNull Entry buildTestEntry(@NonNull OffloadController.StatsType how,
+            @NonNull String iface, long rxBytes, long txBytes) {
+        return new Entry(iface, how == STATS_PER_IFACE ? UID_ALL : UID_TETHERING, SET_DEFAULT,
+                TAG_NONE, METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO, rxBytes, 0L,
+                txBytes, 0L, 0L);
+    }
+
+    @Test
+    public void testGetForwardedStats() throws Exception {
+        setupFunctioningHardwareInterface();
+        enableOffload();
+
+        final OffloadController offload = makeOffloadController();
+        offload.start();
+
+        final String ethernetIface = "eth1";
+        final String mobileIface = "rmnet_data0";
+
+        when(mHardware.getForwardedStats(eq(ethernetIface))).thenReturn(
+                new ForwardedStats(12345, 54321));
+        when(mHardware.getForwardedStats(eq(mobileIface))).thenReturn(
+                new ForwardedStats(999, 99999));
+
+        InOrder inOrder = inOrder(mHardware);
+
+        final LinkProperties lp = new LinkProperties();
+        lp.setInterfaceName(ethernetIface);
+        offload.setUpstreamLinkProperties(lp);
+        // Previous upstream was null, so no stats are fetched.
+        inOrder.verify(mHardware, never()).getForwardedStats(any());
+
+        lp.setInterfaceName(mobileIface);
+        offload.setUpstreamLinkProperties(lp);
+        // Expect that we fetch stats from the previous upstream.
+        inOrder.verify(mHardware, times(1)).getForwardedStats(eq(ethernetIface));
+
+        lp.setInterfaceName(ethernetIface);
+        offload.setUpstreamLinkProperties(lp);
+        // Expect that we fetch stats from the previous upstream.
+        inOrder.verify(mHardware, times(1)).getForwardedStats(eq(mobileIface));
+
+        // Verify that the fetched stats are stored.
+        final NetworkStats ifaceStats = mTetherStatsProvider.getTetherStats(STATS_PER_IFACE);
+        final NetworkStats uidStats = mTetherStatsProvider.getTetherStats(STATS_PER_UID);
+        final NetworkStats expectedIfaceStats = new NetworkStats(0L, 2)
+                .addEntry(buildTestEntry(STATS_PER_IFACE, mobileIface, 999, 99999))
+                .addEntry(buildTestEntry(STATS_PER_IFACE, ethernetIface, 12345, 54321));
+
+        final NetworkStats expectedUidStats = new NetworkStats(0L, 2)
+                .addEntry(buildTestEntry(STATS_PER_UID, mobileIface, 999, 99999))
+                .addEntry(buildTestEntry(STATS_PER_UID, ethernetIface, 12345, 54321));
+
+        assertTrue(orderInsensitiveEquals(expectedIfaceStats, ifaceStats));
+        assertTrue(orderInsensitiveEquals(expectedUidStats, uidStats));
+
+        final ArgumentCaptor<NetworkStats> ifaceStatsCaptor = ArgumentCaptor.forClass(
+                NetworkStats.class);
+        final ArgumentCaptor<NetworkStats> uidStatsCaptor = ArgumentCaptor.forClass(
+                NetworkStats.class);
+
+        // Force pushing stats update to verify the stats reported.
+        mTetherStatsProvider.pushTetherStats();
+        verify(mTetherStatsProviderCb, times(1))
+                .notifyStatsUpdated(anyInt(), ifaceStatsCaptor.capture(), uidStatsCaptor.capture());
+        assertTrue(orderInsensitiveEquals(expectedIfaceStats, ifaceStatsCaptor.getValue()));
+        assertTrue(orderInsensitiveEquals(expectedUidStats, uidStatsCaptor.getValue()));
+
+        when(mHardware.getForwardedStats(eq(ethernetIface))).thenReturn(
+                new ForwardedStats(100000, 100000));
+        offload.setUpstreamLinkProperties(null);
+        // Expect that we first clear the HAL's upstream parameters.
+        inOrder.verify(mHardware, times(1)).setUpstreamParameters(
+                eq(""), eq("0.0.0.0"), eq("0.0.0.0"), eq(null));
+        // Expect that we fetch stats from the previous upstream.
+        inOrder.verify(mHardware, times(1)).getForwardedStats(eq(ethernetIface));
+
+        // There is no current upstream, so no stats are fetched.
+        inOrder.verify(mHardware, never()).getForwardedStats(any());
+        inOrder.verifyNoMoreInteractions();
+
+        // Verify that the stored stats is accumulated.
+        final NetworkStats ifaceStatsAccu = mTetherStatsProvider.getTetherStats(STATS_PER_IFACE);
+        final NetworkStats uidStatsAccu = mTetherStatsProvider.getTetherStats(STATS_PER_UID);
+        final NetworkStats expectedIfaceStatsAccu = new NetworkStats(0L, 2)
+                .addEntry(buildTestEntry(STATS_PER_IFACE, mobileIface, 999, 99999))
+                .addEntry(buildTestEntry(STATS_PER_IFACE, ethernetIface, 112345, 154321));
+
+        final NetworkStats expectedUidStatsAccu = new NetworkStats(0L, 2)
+                .addEntry(buildTestEntry(STATS_PER_UID, mobileIface, 999, 99999))
+                .addEntry(buildTestEntry(STATS_PER_UID, ethernetIface, 112345, 154321));
+
+        assertTrue(orderInsensitiveEquals(expectedIfaceStatsAccu, ifaceStatsAccu));
+        assertTrue(orderInsensitiveEquals(expectedUidStatsAccu, uidStatsAccu));
+
+        // Verify that only diff of stats is reported.
+        reset(mTetherStatsProviderCb);
+        mTetherStatsProvider.pushTetherStats();
+        final NetworkStats expectedIfaceStatsDiff = new NetworkStats(0L, 2)
+                .addEntry(buildTestEntry(STATS_PER_IFACE, mobileIface, 0, 0))
+                .addEntry(buildTestEntry(STATS_PER_IFACE, ethernetIface, 100000, 100000));
+
+        final NetworkStats expectedUidStatsDiff = new NetworkStats(0L, 2)
+                .addEntry(buildTestEntry(STATS_PER_UID, mobileIface, 0, 0))
+                .addEntry(buildTestEntry(STATS_PER_UID, ethernetIface, 100000, 100000));
+        verify(mTetherStatsProviderCb, times(1))
+                .notifyStatsUpdated(anyInt(), ifaceStatsCaptor.capture(), uidStatsCaptor.capture());
+        assertTrue(orderInsensitiveEquals(expectedIfaceStatsDiff, ifaceStatsCaptor.getValue()));
+        assertTrue(orderInsensitiveEquals(expectedUidStatsDiff, uidStatsCaptor.getValue()));
+    }
+
+    @Test
+    public void testSetInterfaceQuota() throws Exception {
+        setupFunctioningHardwareInterface();
+        enableOffload();
+
+        final OffloadController offload = makeOffloadController();
+        offload.start();
+
+        final String ethernetIface = "eth1";
+        final String mobileIface = "rmnet_data0";
+        final long ethernetLimit = 12345;
+        final long mobileLimit = 12345678;
+
+        final LinkProperties lp = new LinkProperties();
+        lp.setInterfaceName(ethernetIface);
+        offload.setUpstreamLinkProperties(lp);
+
+        final InOrder inOrder = inOrder(mHardware);
+        when(mHardware.setUpstreamParameters(any(), any(), any(), any())).thenReturn(true);
+        when(mHardware.setDataLimit(anyString(), anyLong())).thenReturn(true);
+
+        // Applying an interface quota to the current upstream immediately sends it to the hardware.
+        mTetherStatsProvider.onSetLimit(ethernetIface, ethernetLimit);
+        waitForIdle();
+        inOrder.verify(mHardware).setDataLimit(ethernetIface, ethernetLimit);
+        inOrder.verifyNoMoreInteractions();
+
+        // Applying an interface quota to another upstream does not take any immediate action.
+        mTetherStatsProvider.onSetLimit(mobileIface, mobileLimit);
+        waitForIdle();
+        inOrder.verify(mHardware, never()).setDataLimit(anyString(), anyLong());
+
+        // Switching to that upstream causes the quota to be applied if the parameters were applied
+        // correctly.
+        lp.setInterfaceName(mobileIface);
+        offload.setUpstreamLinkProperties(lp);
+        waitForIdle();
+        inOrder.verify(mHardware).setDataLimit(mobileIface, mobileLimit);
+
+        // Setting a limit of ITetheringStatsProvider.QUOTA_UNLIMITED causes the limit to be set
+        // to Long.MAX_VALUE.
+        mTetherStatsProvider.onSetLimit(mobileIface, ITetheringStatsProvider.QUOTA_UNLIMITED);
+        waitForIdle();
+        inOrder.verify(mHardware).setDataLimit(mobileIface, Long.MAX_VALUE);
+
+        // If setting upstream parameters fails, then the data limit is not set.
+        when(mHardware.setUpstreamParameters(any(), any(), any(), any())).thenReturn(false);
+        lp.setInterfaceName(ethernetIface);
+        offload.setUpstreamLinkProperties(lp);
+        mTetherStatsProvider.onSetLimit(mobileIface, mobileLimit);
+        waitForIdle();
+        inOrder.verify(mHardware, never()).setDataLimit(anyString(), anyLong());
+
+        // If setting the data limit fails while changing upstreams, offload is stopped.
+        when(mHardware.setUpstreamParameters(any(), any(), any(), any())).thenReturn(true);
+        when(mHardware.setDataLimit(anyString(), anyLong())).thenReturn(false);
+        lp.setInterfaceName(mobileIface);
+        offload.setUpstreamLinkProperties(lp);
+        mTetherStatsProvider.onSetLimit(mobileIface, mobileLimit);
+        waitForIdle();
+        inOrder.verify(mHardware).getForwardedStats(ethernetIface);
+        inOrder.verify(mHardware).stopOffloadControl();
+    }
+
+    @Test
+    public void testDataLimitCallback() throws Exception {
+        setupFunctioningHardwareInterface();
+        enableOffload();
+
+        final OffloadController offload = makeOffloadController();
+        offload.start();
+
+        OffloadHardwareInterface.ControlCallback callback = mControlCallbackCaptor.getValue();
+        callback.onStoppedLimitReached();
+        verify(mTetherStatsProviderCb, times(1)).notifyStatsUpdated(anyInt(), any(), any());
+    }
+
+    @Test
+    public void testAddRemoveDownstreams() throws Exception {
+        setupFunctioningHardwareInterface();
+        enableOffload();
+
+        final OffloadController offload = makeOffloadController();
+        offload.start();
+
+        final InOrder inOrder = inOrder(mHardware);
+        inOrder.verify(mHardware, times(1)).initOffloadConfig();
+        inOrder.verify(mHardware, times(1)).initOffloadControl(
+                any(OffloadHardwareInterface.ControlCallback.class));
+        inOrder.verifyNoMoreInteractions();
+
+        // Tethering makes several calls to setLocalPrefixes() before add/remove
+        // downstream calls are made. This is not tested here; only the behavior
+        // of notifyDownstreamLinkProperties() and removeDownstreamInterface()
+        // are tested.
+
+        // [1] USB tethering is started.
+        final LinkProperties usbLinkProperties = new LinkProperties();
+        usbLinkProperties.setInterfaceName(RNDIS0);
+        usbLinkProperties.addLinkAddress(new LinkAddress("192.168.42.1/24"));
+        usbLinkProperties.addRoute(
+                new RouteInfo(new IpPrefix(USB_PREFIX), null, null, RTN_UNICAST));
+        offload.notifyDownstreamLinkProperties(usbLinkProperties);
+        inOrder.verify(mHardware, times(1)).addDownstreamPrefix(RNDIS0, USB_PREFIX);
+        inOrder.verifyNoMoreInteractions();
+
+        // [2] Routes for IPv6 link-local prefixes should never be added.
+        usbLinkProperties.addRoute(
+                new RouteInfo(new IpPrefix(IPV6_LINKLOCAL), null, null, RTN_UNICAST));
+        offload.notifyDownstreamLinkProperties(usbLinkProperties);
+        inOrder.verify(mHardware, never()).addDownstreamPrefix(eq(RNDIS0), anyString());
+        inOrder.verifyNoMoreInteractions();
+
+        // [3] Add an IPv6 prefix for good measure. Only new offload-able
+        // prefixes should be passed to the HAL.
+        usbLinkProperties.addLinkAddress(new LinkAddress("2001:db8::1/64"));
+        usbLinkProperties.addRoute(
+                new RouteInfo(new IpPrefix(IPV6_DOC_PREFIX), null, null, RTN_UNICAST));
+        offload.notifyDownstreamLinkProperties(usbLinkProperties);
+        inOrder.verify(mHardware, times(1)).addDownstreamPrefix(RNDIS0, IPV6_DOC_PREFIX);
+        inOrder.verifyNoMoreInteractions();
+
+        // [4] Adding addresses doesn't affect notifyDownstreamLinkProperties().
+        // The address is passed in by a separate setLocalPrefixes() invocation.
+        usbLinkProperties.addLinkAddress(new LinkAddress("2001:db8::2/64"));
+        offload.notifyDownstreamLinkProperties(usbLinkProperties);
+        inOrder.verify(mHardware, never()).addDownstreamPrefix(eq(RNDIS0), anyString());
+
+        // [5] Differences in local routes are converted into addDownstream()
+        // and removeDownstream() invocations accordingly.
+        usbLinkProperties.removeRoute(
+                new RouteInfo(new IpPrefix(IPV6_DOC_PREFIX), null, RNDIS0, RTN_UNICAST));
+        usbLinkProperties.addRoute(
+                new RouteInfo(new IpPrefix(IPV6_DISCARD_PREFIX), null, null, RTN_UNICAST));
+        offload.notifyDownstreamLinkProperties(usbLinkProperties);
+        inOrder.verify(mHardware, times(1)).removeDownstreamPrefix(RNDIS0, IPV6_DOC_PREFIX);
+        inOrder.verify(mHardware, times(1)).addDownstreamPrefix(RNDIS0, IPV6_DISCARD_PREFIX);
+        inOrder.verifyNoMoreInteractions();
+
+        // [6] Removing a downstream interface which was never added causes no
+        // interactions with the HAL.
+        offload.removeDownstreamInterface(WLAN0);
+        inOrder.verifyNoMoreInteractions();
+
+        // [7] Removing an active downstream removes all remaining prefixes.
+        offload.removeDownstreamInterface(RNDIS0);
+        inOrder.verify(mHardware, times(1)).removeDownstreamPrefix(RNDIS0, USB_PREFIX);
+        inOrder.verify(mHardware, times(1)).removeDownstreamPrefix(RNDIS0, IPV6_DISCARD_PREFIX);
+        inOrder.verifyNoMoreInteractions();
+    }
+
+    @Test
+    public void testControlCallbackOnStoppedUnsupportedFetchesAllStats() throws Exception {
+        setupFunctioningHardwareInterface();
+        enableOffload();
+
+        final OffloadController offload = makeOffloadController();
+        offload.start();
+
+        // Pretend to set a few different upstreams (only the interface name
+        // matters for this test; we're ignoring IP and route information).
+        final LinkProperties upstreamLp = new LinkProperties();
+        for (String ifname : new String[]{RMNET0, WLAN0, RMNET0}) {
+            upstreamLp.setInterfaceName(ifname);
+            offload.setUpstreamLinkProperties(upstreamLp);
+        }
+
+        // Clear invocation history, especially the getForwardedStats() calls
+        // that happen with setUpstreamParameters().
+        clearInvocations(mHardware);
+
+        OffloadHardwareInterface.ControlCallback callback = mControlCallbackCaptor.getValue();
+        callback.onStoppedUnsupported();
+
+        // Verify forwarded stats behaviour.
+        verify(mHardware, times(1)).getForwardedStats(eq(RMNET0));
+        verify(mHardware, times(1)).getForwardedStats(eq(WLAN0));
+        // TODO: verify the exact stats reported.
+        verify(mTetherStatsProviderCb, times(1)).notifyStatsUpdated(anyInt(), any(), any());
+        verifyNoMoreInteractions(mTetherStatsProviderCb);
+        verifyNoMoreInteractions(mHardware);
+    }
+
+    @Test
+    public void testControlCallbackOnSupportAvailableFetchesAllStatsAndPushesAllParameters()
+            throws Exception {
+        setupFunctioningHardwareInterface();
+        enableOffload();
+
+        final OffloadController offload = makeOffloadController();
+        offload.start();
+
+        // Pretend to set a few different upstreams (only the interface name
+        // matters for this test; we're ignoring IP and route information).
+        final LinkProperties upstreamLp = new LinkProperties();
+        for (String ifname : new String[]{RMNET0, WLAN0, RMNET0}) {
+            upstreamLp.setInterfaceName(ifname);
+            offload.setUpstreamLinkProperties(upstreamLp);
+        }
+
+        // Pretend that some local prefixes and downstreams have been added
+        // (and removed, for good measure).
+        final Set<IpPrefix> minimumLocalPrefixes = new HashSet<>();
+        for (String s : new String[]{
+                "127.0.0.0/8", "192.0.2.0/24", "fe80::/64", "2001:db8::/64"}) {
+            minimumLocalPrefixes.add(new IpPrefix(s));
+        }
+        offload.setLocalPrefixes(minimumLocalPrefixes);
+
+        final LinkProperties usbLinkProperties = new LinkProperties();
+        usbLinkProperties.setInterfaceName(RNDIS0);
+        usbLinkProperties.addLinkAddress(new LinkAddress("192.168.42.1/24"));
+        usbLinkProperties.addRoute(
+                new RouteInfo(new IpPrefix(USB_PREFIX), null, null, RTN_UNICAST));
+        offload.notifyDownstreamLinkProperties(usbLinkProperties);
+
+        final LinkProperties wifiLinkProperties = new LinkProperties();
+        wifiLinkProperties.setInterfaceName(WLAN0);
+        wifiLinkProperties.addLinkAddress(new LinkAddress("192.168.43.1/24"));
+        wifiLinkProperties.addRoute(
+                new RouteInfo(new IpPrefix(WIFI_PREFIX), null, null, RTN_UNICAST));
+        wifiLinkProperties.addRoute(
+                new RouteInfo(new IpPrefix(IPV6_LINKLOCAL), null, null, RTN_UNICAST));
+        // Use a benchmark prefix (RFC 5180 + erratum), since the documentation
+        // prefix is included in the excluded prefix list.
+        wifiLinkProperties.addLinkAddress(new LinkAddress("2001:2::1/64"));
+        wifiLinkProperties.addLinkAddress(new LinkAddress("2001:2::2/64"));
+        wifiLinkProperties.addRoute(
+                new RouteInfo(new IpPrefix("2001:2::/64"), null, null, RTN_UNICAST));
+        offload.notifyDownstreamLinkProperties(wifiLinkProperties);
+
+        offload.removeDownstreamInterface(RNDIS0);
+
+        // Clear invocation history, especially the getForwardedStats() calls
+        // that happen with setUpstreamParameters().
+        clearInvocations(mHardware);
+
+        OffloadHardwareInterface.ControlCallback callback = mControlCallbackCaptor.getValue();
+        callback.onSupportAvailable();
+
+        // Verify forwarded stats behaviour.
+        verify(mHardware, times(1)).getForwardedStats(eq(RMNET0));
+        verify(mHardware, times(1)).getForwardedStats(eq(WLAN0));
+        verify(mTetherStatsProviderCb, times(1)).notifyStatsUpdated(anyInt(), any(), any());
+        verifyNoMoreInteractions(mTetherStatsProviderCb);
+
+        // TODO: verify local prefixes and downstreams are also pushed to the HAL.
+        verify(mHardware, times(1)).setLocalPrefixes(mStringArrayCaptor.capture());
+        ArrayList<String> localPrefixes = mStringArrayCaptor.getValue();
+        assertEquals(4, localPrefixes.size());
+        assertContainsAll(localPrefixes,
+                // TODO: The logic to find and exclude downstream IP prefixes
+                // is currently in Tethering's OffloadWrapper but must be moved
+                // into OffloadController proper. After this, also check for:
+                //     "192.168.43.1/32", "2001:2::1/128", "2001:2::2/128"
+                "127.0.0.0/8", "192.0.2.0/24", "fe80::/64", "2001:db8::/64");
+        verify(mHardware, times(1)).addDownstreamPrefix(WLAN0, "192.168.43.0/24");
+        verify(mHardware, times(1)).addDownstreamPrefix(WLAN0, "2001:2::/64");
+        verify(mHardware, times(1)).setUpstreamParameters(eq(RMNET0), any(), any(), any());
+        verify(mHardware, times(1)).setDataLimit(eq(RMNET0), anyLong());
+        verifyNoMoreInteractions(mHardware);
+    }
+
+}
diff --git a/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/TetheringConfigurationTest.java b/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/TetheringConfigurationTest.java
new file mode 100644
index 0000000..07ddea4
--- /dev/null
+++ b/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/TetheringConfigurationTest.java
@@ -0,0 +1,344 @@
+/*
+ * Copyright (C) 2017 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.networkstack.tethering;
+
+import static android.net.ConnectivityManager.TYPE_ETHERNET;
+import static android.net.ConnectivityManager.TYPE_MOBILE;
+import static android.net.ConnectivityManager.TYPE_MOBILE_DUN;
+import static android.net.ConnectivityManager.TYPE_MOBILE_HIPRI;
+import static android.net.ConnectivityManager.TYPE_WIFI;
+import static android.provider.DeviceConfig.NAMESPACE_CONNECTIVITY;
+import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
+
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Matchers.anyBoolean;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.net.util.SharedLog;
+import android.provider.DeviceConfig;
+import android.telephony.TelephonyManager;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import com.android.internal.util.test.BroadcastInterceptingContext;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoSession;
+import org.mockito.quality.Strictness;
+
+import java.util.Arrays;
+import java.util.Iterator;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class TetheringConfigurationTest {
+    private final SharedLog mLog = new SharedLog("TetheringConfigurationTest");
+
+    private static final String[] PROVISIONING_APP_NAME = {"some", "app"};
+    @Mock private Context mContext;
+    @Mock private TelephonyManager mTelephonyManager;
+    @Mock private Resources mResources;
+    @Mock private Resources mResourcesForSubId;
+    private Context mMockContext;
+    private boolean mHasTelephonyManager;
+    private boolean mEnableLegacyDhcpServer;
+    private MockitoSession mMockingSession;
+
+    private class MockTetheringConfiguration extends TetheringConfiguration {
+        MockTetheringConfiguration(Context ctx, SharedLog log, int id) {
+            super(ctx, log, id);
+        }
+
+        @Override
+        protected Resources getResourcesForSubIdWrapper(Context ctx, int subId) {
+            return mResourcesForSubId;
+        }
+    }
+
+    private class MockContext extends BroadcastInterceptingContext {
+        MockContext(Context base) {
+            super(base);
+        }
+
+        @Override
+        public Resources getResources() {
+            return mResources;
+        }
+
+        @Override
+        public Object getSystemService(String name) {
+            if (Context.TELEPHONY_SERVICE.equals(name)) {
+                return mHasTelephonyManager ? mTelephonyManager : null;
+            }
+            return super.getSystemService(name);
+        }
+    }
+
+    @Before
+    public void setUp() throws Exception {
+        // TODO: use a dependencies class instead of mock statics.
+        mMockingSession = mockitoSession()
+                .initMocks(this)
+                .mockStatic(DeviceConfig.class)
+                .strictness(Strictness.WARN)
+                .startMocking();
+        doReturn(false).when(
+                () -> DeviceConfig.getBoolean(eq(NAMESPACE_CONNECTIVITY),
+                eq(TetheringConfiguration.TETHER_ENABLE_LEGACY_DHCP_SERVER), anyBoolean()));
+
+        when(mResources.getStringArray(R.array.config_tether_dhcp_range)).thenReturn(
+                new String[0]);
+        when(mResources.getStringArray(R.array.config_tether_usb_regexs)).thenReturn(new String[0]);
+        when(mResources.getStringArray(R.array.config_tether_wifi_regexs))
+                .thenReturn(new String[]{ "test_wlan\\d" });
+        when(mResources.getStringArray(R.array.config_tether_bluetooth_regexs)).thenReturn(
+                new String[0]);
+        when(mResources.getIntArray(R.array.config_tether_upstream_types)).thenReturn(new int[0]);
+        when(mResources.getStringArray(R.array.config_mobile_hotspot_provision_app))
+                .thenReturn(new String[0]);
+        when(mResources.getBoolean(R.bool.config_tether_enable_legacy_dhcp_server)).thenReturn(
+                false);
+        mHasTelephonyManager = true;
+        mMockContext = new MockContext(mContext);
+        mEnableLegacyDhcpServer = false;
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        mMockingSession.finishMocking();
+    }
+
+    private TetheringConfiguration getTetheringConfiguration(int... legacyTetherUpstreamTypes) {
+        when(mResources.getIntArray(R.array.config_tether_upstream_types)).thenReturn(
+                legacyTetherUpstreamTypes);
+        return new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID);
+    }
+
+    @Test
+    public void testNoTelephonyManagerMeansNoDun() {
+        mHasTelephonyManager = false;
+        final TetheringConfiguration cfg = getTetheringConfiguration(
+                new int[]{TYPE_MOBILE_DUN, TYPE_WIFI});
+        assertFalse(cfg.isDunRequired);
+        assertFalse(cfg.preferredUpstreamIfaceTypes.contains(TYPE_MOBILE_DUN));
+        // Just to prove we haven't clobbered Wi-Fi:
+        assertTrue(cfg.preferredUpstreamIfaceTypes.contains(TYPE_WIFI));
+    }
+
+    @Test
+    public void testDunFromTelephonyManagerMeansDun() {
+        when(mTelephonyManager.isTetheringApnRequired()).thenReturn(true);
+
+        final TetheringConfiguration cfgWifi = getTetheringConfiguration(TYPE_WIFI);
+        final TetheringConfiguration cfgMobileWifiHipri = getTetheringConfiguration(
+                TYPE_MOBILE, TYPE_WIFI, TYPE_MOBILE_HIPRI);
+        final TetheringConfiguration cfgWifiDun = getTetheringConfiguration(
+                TYPE_WIFI, TYPE_MOBILE_DUN);
+        final TetheringConfiguration cfgMobileWifiHipriDun = getTetheringConfiguration(
+                TYPE_MOBILE, TYPE_WIFI, TYPE_MOBILE_HIPRI, TYPE_MOBILE_DUN);
+
+        for (TetheringConfiguration cfg : Arrays.asList(cfgWifi, cfgMobileWifiHipri,
+                cfgWifiDun, cfgMobileWifiHipriDun)) {
+            String msg = "config=" + cfg.toString();
+            assertTrue(msg, cfg.isDunRequired);
+            assertTrue(msg, cfg.preferredUpstreamIfaceTypes.contains(TYPE_MOBILE_DUN));
+            assertFalse(msg, cfg.preferredUpstreamIfaceTypes.contains(TYPE_MOBILE));
+            assertFalse(msg, cfg.preferredUpstreamIfaceTypes.contains(TYPE_MOBILE_HIPRI));
+            // Just to prove we haven't clobbered Wi-Fi:
+            assertTrue(msg, cfg.preferredUpstreamIfaceTypes.contains(TYPE_WIFI));
+        }
+    }
+
+    @Test
+    public void testDunNotRequiredFromTelephonyManagerMeansNoDun() {
+        when(mTelephonyManager.isTetheringApnRequired()).thenReturn(false);
+
+        final TetheringConfiguration cfgWifi = getTetheringConfiguration(TYPE_WIFI);
+        final TetheringConfiguration cfgMobileWifiHipri = getTetheringConfiguration(
+                TYPE_MOBILE, TYPE_WIFI, TYPE_MOBILE_HIPRI);
+        final TetheringConfiguration cfgWifiDun = getTetheringConfiguration(
+                TYPE_WIFI, TYPE_MOBILE_DUN);
+        final TetheringConfiguration cfgWifiMobile = getTetheringConfiguration(
+                TYPE_WIFI, TYPE_MOBILE);
+        final TetheringConfiguration cfgWifiHipri = getTetheringConfiguration(
+                TYPE_WIFI, TYPE_MOBILE_HIPRI);
+        final TetheringConfiguration cfgMobileWifiHipriDun = getTetheringConfiguration(
+                TYPE_MOBILE, TYPE_WIFI, TYPE_MOBILE_HIPRI, TYPE_MOBILE_DUN);
+
+        String msg;
+        // TYPE_MOBILE_DUN should be present in none of the combinations.
+        // TYPE_WIFI should not be affected.
+        for (TetheringConfiguration cfg : Arrays.asList(cfgWifi, cfgMobileWifiHipri, cfgWifiDun,
+                cfgWifiMobile, cfgWifiHipri, cfgMobileWifiHipriDun)) {
+            msg = "config=" + cfg.toString();
+            assertFalse(msg, cfg.isDunRequired);
+            assertFalse(msg, cfg.preferredUpstreamIfaceTypes.contains(TYPE_MOBILE_DUN));
+            assertTrue(msg, cfg.preferredUpstreamIfaceTypes.contains(TYPE_WIFI));
+        }
+
+        for (TetheringConfiguration cfg : Arrays.asList(cfgWifi, cfgMobileWifiHipri, cfgWifiDun,
+                cfgMobileWifiHipriDun)) {
+            msg = "config=" + cfg.toString();
+            assertTrue(msg, cfg.preferredUpstreamIfaceTypes.contains(TYPE_MOBILE));
+            assertTrue(msg, cfg.preferredUpstreamIfaceTypes.contains(TYPE_MOBILE_HIPRI));
+        }
+        msg = "config=" + cfgWifiMobile.toString();
+        assertTrue(msg, cfgWifiMobile.preferredUpstreamIfaceTypes.contains(TYPE_MOBILE));
+        assertFalse(msg, cfgWifiMobile.preferredUpstreamIfaceTypes.contains(TYPE_MOBILE_HIPRI));
+        msg = "config=" + cfgWifiHipri.toString();
+        assertFalse(msg, cfgWifiHipri.preferredUpstreamIfaceTypes.contains(TYPE_MOBILE));
+        assertTrue(msg, cfgWifiHipri.preferredUpstreamIfaceTypes.contains(TYPE_MOBILE_HIPRI));
+
+    }
+
+    @Test
+    public void testNoDefinedUpstreamTypesAddsEthernet() {
+        when(mResources.getIntArray(R.array.config_tether_upstream_types)).thenReturn(new int[]{});
+        when(mTelephonyManager.isTetheringApnRequired()).thenReturn(false);
+
+        final TetheringConfiguration cfg = new TetheringConfiguration(
+                mMockContext, mLog, INVALID_SUBSCRIPTION_ID);
+        final Iterator<Integer> upstreamIterator = cfg.preferredUpstreamIfaceTypes.iterator();
+        assertTrue(upstreamIterator.hasNext());
+        assertEquals(TYPE_ETHERNET, upstreamIterator.next().intValue());
+        // The following is because the code always adds some kind of mobile
+        // upstream, be it DUN or, in this case where DUN is NOT required,
+        // make sure there is at least one of MOBILE or HIPRI. With the empty
+        // list of the configuration in this test, it will always add both
+        // MOBILE and HIPRI, in that order.
+        assertTrue(upstreamIterator.hasNext());
+        assertEquals(TYPE_MOBILE, upstreamIterator.next().intValue());
+        assertTrue(upstreamIterator.hasNext());
+        assertEquals(TYPE_MOBILE_HIPRI, upstreamIterator.next().intValue());
+        assertFalse(upstreamIterator.hasNext());
+    }
+
+    @Test
+    public void testDefinedUpstreamTypesSansEthernetAddsEthernet() {
+        when(mResources.getIntArray(R.array.config_tether_upstream_types)).thenReturn(
+                new int[]{TYPE_WIFI, TYPE_MOBILE_HIPRI});
+        when(mTelephonyManager.isTetheringApnRequired()).thenReturn(false);
+
+        final TetheringConfiguration cfg = new TetheringConfiguration(
+                mMockContext, mLog, INVALID_SUBSCRIPTION_ID);
+        final Iterator<Integer> upstreamIterator = cfg.preferredUpstreamIfaceTypes.iterator();
+        assertTrue(upstreamIterator.hasNext());
+        assertEquals(TYPE_ETHERNET, upstreamIterator.next().intValue());
+        assertTrue(upstreamIterator.hasNext());
+        assertEquals(TYPE_WIFI, upstreamIterator.next().intValue());
+        assertTrue(upstreamIterator.hasNext());
+        assertEquals(TYPE_MOBILE_HIPRI, upstreamIterator.next().intValue());
+        assertFalse(upstreamIterator.hasNext());
+    }
+
+    @Test
+    public void testDefinedUpstreamTypesWithEthernetDoesNotAddEthernet() {
+        when(mResources.getIntArray(R.array.config_tether_upstream_types))
+                .thenReturn(new int[]{TYPE_WIFI, TYPE_ETHERNET, TYPE_MOBILE_HIPRI});
+        when(mTelephonyManager.isTetheringApnRequired()).thenReturn(false);
+
+        final TetheringConfiguration cfg = new TetheringConfiguration(
+                mMockContext, mLog, INVALID_SUBSCRIPTION_ID);
+        final Iterator<Integer> upstreamIterator = cfg.preferredUpstreamIfaceTypes.iterator();
+        assertTrue(upstreamIterator.hasNext());
+        assertEquals(TYPE_WIFI, upstreamIterator.next().intValue());
+        assertTrue(upstreamIterator.hasNext());
+        assertEquals(TYPE_ETHERNET, upstreamIterator.next().intValue());
+        assertTrue(upstreamIterator.hasNext());
+        assertEquals(TYPE_MOBILE_HIPRI, upstreamIterator.next().intValue());
+        assertFalse(upstreamIterator.hasNext());
+    }
+
+    @Test
+    public void testNewDhcpServerDisabled() {
+        when(mResources.getBoolean(R.bool.config_tether_enable_legacy_dhcp_server)).thenReturn(
+                true);
+        doReturn(false).when(
+                () -> DeviceConfig.getBoolean(eq(NAMESPACE_CONNECTIVITY),
+                eq(TetheringConfiguration.TETHER_ENABLE_LEGACY_DHCP_SERVER), anyBoolean()));
+
+        final TetheringConfiguration enableByRes =
+                new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID);
+        assertTrue(enableByRes.enableLegacyDhcpServer);
+
+        when(mResources.getBoolean(R.bool.config_tether_enable_legacy_dhcp_server)).thenReturn(
+                false);
+        doReturn(true).when(
+                () -> DeviceConfig.getBoolean(eq(NAMESPACE_CONNECTIVITY),
+                eq(TetheringConfiguration.TETHER_ENABLE_LEGACY_DHCP_SERVER), anyBoolean()));
+
+        final TetheringConfiguration enableByDevConfig =
+                new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID);
+        assertTrue(enableByDevConfig.enableLegacyDhcpServer);
+    }
+
+    @Test
+    public void testNewDhcpServerEnabled() {
+        when(mResources.getBoolean(R.bool.config_tether_enable_legacy_dhcp_server)).thenReturn(
+                false);
+        doReturn(false).when(
+                () -> DeviceConfig.getBoolean(eq(NAMESPACE_CONNECTIVITY),
+                eq(TetheringConfiguration.TETHER_ENABLE_LEGACY_DHCP_SERVER), anyBoolean()));
+
+        final TetheringConfiguration cfg =
+                new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID);
+
+        assertFalse(cfg.enableLegacyDhcpServer);
+    }
+
+    @Test
+    public void testGetResourcesBySubId() {
+        setUpResourceForSubId();
+        final TetheringConfiguration cfg = new TetheringConfiguration(
+                mMockContext, mLog, INVALID_SUBSCRIPTION_ID);
+        assertTrue(cfg.provisioningApp.length == 0);
+        final int anyValidSubId = 1;
+        final MockTetheringConfiguration mockCfg =
+                new MockTetheringConfiguration(mMockContext, mLog, anyValidSubId);
+        assertEquals(mockCfg.provisioningApp[0], PROVISIONING_APP_NAME[0]);
+        assertEquals(mockCfg.provisioningApp[1], PROVISIONING_APP_NAME[1]);
+    }
+
+    private void setUpResourceForSubId() {
+        when(mResourcesForSubId.getStringArray(
+                R.array.config_tether_dhcp_range)).thenReturn(new String[0]);
+        when(mResourcesForSubId.getStringArray(
+                R.array.config_tether_usb_regexs)).thenReturn(new String[0]);
+        when(mResourcesForSubId.getStringArray(
+                R.array.config_tether_wifi_regexs)).thenReturn(new String[]{ "test_wlan\\d" });
+        when(mResourcesForSubId.getStringArray(
+                R.array.config_tether_bluetooth_regexs)).thenReturn(new String[0]);
+        when(mResourcesForSubId.getIntArray(R.array.config_tether_upstream_types)).thenReturn(
+                new int[0]);
+        when(mResourcesForSubId.getStringArray(
+                R.array.config_mobile_hotspot_provision_app)).thenReturn(PROVISIONING_APP_NAME);
+    }
+
+}
diff --git a/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/TetheringNotificationUpdaterTest.kt b/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/TetheringNotificationUpdaterTest.kt
new file mode 100644
index 0000000..745468f
--- /dev/null
+++ b/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/TetheringNotificationUpdaterTest.kt
@@ -0,0 +1,354 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.networkstack.tethering
+
+import android.app.Notification
+import android.app.NotificationManager
+import android.content.Context
+import android.content.res.Resources
+import android.net.ConnectivityManager.TETHERING_WIFI
+import android.os.Handler
+import android.os.HandlerThread
+import android.os.Looper
+import android.net.NetworkCapabilities
+import android.net.NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING
+import android.os.UserHandle
+import android.telephony.TelephonyManager
+import androidx.test.filters.SmallTest
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.runner.AndroidJUnit4
+import com.android.internal.util.test.BroadcastInterceptingContext
+import com.android.networkstack.tethering.TetheringNotificationUpdater.DOWNSTREAM_NONE
+import com.android.networkstack.tethering.TetheringNotificationUpdater.EVENT_SHOW_NO_UPSTREAM
+import com.android.networkstack.tethering.TetheringNotificationUpdater.NO_UPSTREAM_NOTIFICATION_ID
+import com.android.networkstack.tethering.TetheringNotificationUpdater.RESTRICTED_NOTIFICATION_ID
+import com.android.networkstack.tethering.TetheringNotificationUpdater.ROAMING_NOTIFICATION_ID
+import com.android.networkstack.tethering.TetheringNotificationUpdater.VERIZON_CARRIER_ID
+import com.android.testutils.waitForIdle
+import org.junit.After
+import org.junit.Assert.assertEquals
+import org.junit.Assert.fail
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.ArgumentCaptor
+import org.mockito.ArgumentMatchers.any
+import org.mockito.ArgumentMatchers.anyInt
+import org.mockito.ArgumentMatchers.eq
+import org.mockito.Mock
+import org.mockito.Mockito.doReturn
+import org.mockito.Mockito.never
+import org.mockito.Mockito.reset
+import org.mockito.Mockito.times
+import org.mockito.Mockito.verify
+import org.mockito.Mockito.verifyZeroInteractions
+import org.mockito.MockitoAnnotations
+
+const val TEST_SUBID = 1
+const val WIFI_MASK = 1 shl TETHERING_WIFI
+const val TEST_DISALLOW_TITLE = "Tether function is disallowed"
+const val TEST_DISALLOW_MESSAGE = "Please contact your admin"
+const val TEST_NO_UPSTREAM_TITLE = "Hotspot has no internet access"
+const val TEST_NO_UPSTREAM_MESSAGE = "Device cannot connect to internet."
+const val TEST_NO_UPSTREAM_BUTTON = "Turn off hotspot"
+const val TEST_ROAMING_TITLE = "Hotspot is on"
+const val TEST_ROAMING_MESSAGE = "Additional charges may apply while roaming."
+
+@RunWith(AndroidJUnit4::class)
+@SmallTest
+class TetheringNotificationUpdaterTest {
+    // lateinit used here for mocks as they need to be reinitialized between each test and the test
+    // should crash if they are used before being initialized.
+    @Mock private lateinit var mockContext: Context
+    @Mock private lateinit var notificationManager: NotificationManager
+    @Mock private lateinit var telephonyManager: TelephonyManager
+    @Mock private lateinit var testResources: Resources
+
+    // lateinit for these classes under test, as they should be reset to a different instance for
+    // every test but should always be initialized before use (or the test should crash).
+    private lateinit var context: TestContext
+    private lateinit var notificationUpdater: TetheringNotificationUpdater
+    private lateinit var fakeTetheringThread: HandlerThread
+
+    private val ROAMING_CAPABILITIES = NetworkCapabilities()
+    private val HOME_CAPABILITIES = NetworkCapabilities().addCapability(NET_CAPABILITY_NOT_ROAMING)
+    private val NOTIFICATION_ICON_ID = R.drawable.stat_sys_tether_general
+    private val TIMEOUT_MS = 500L
+
+    private inner class TestContext(c: Context) : BroadcastInterceptingContext(c) {
+        override fun createContextAsUser(user: UserHandle, flags: Int) =
+                if (user == UserHandle.ALL) mockContext else this
+        override fun getSystemService(name: String) =
+                if (name == Context.TELEPHONY_SERVICE) telephonyManager
+                else super.getSystemService(name)
+    }
+
+    private inner class WrappedNotificationUpdater(c: Context, looper: Looper)
+        : TetheringNotificationUpdater(c, looper) {
+        override fun getResourcesForSubId(c: Context, subId: Int) =
+                if (subId == TEST_SUBID) testResources else super.getResourcesForSubId(c, subId)
+    }
+
+    private fun setupResources() {
+        doReturn(5).`when`(testResources)
+                .getInteger(R.integer.delay_to_show_no_upstream_after_no_backhaul)
+        doReturn(true).`when`(testResources)
+                .getBoolean(R.bool.config_upstream_roaming_notification)
+        doReturn(TEST_DISALLOW_TITLE).`when`(testResources)
+                .getString(R.string.disable_tether_notification_title)
+        doReturn(TEST_DISALLOW_MESSAGE).`when`(testResources)
+                .getString(R.string.disable_tether_notification_message)
+        doReturn(TEST_NO_UPSTREAM_TITLE).`when`(testResources)
+                .getString(R.string.no_upstream_notification_title)
+        doReturn(TEST_NO_UPSTREAM_MESSAGE).`when`(testResources)
+                .getString(R.string.no_upstream_notification_message)
+        doReturn(TEST_NO_UPSTREAM_BUTTON).`when`(testResources)
+                .getString(R.string.no_upstream_notification_disable_button)
+        doReturn(TEST_ROAMING_TITLE).`when`(testResources)
+                .getString(R.string.upstream_roaming_notification_title)
+        doReturn(TEST_ROAMING_MESSAGE).`when`(testResources)
+                .getString(R.string.upstream_roaming_notification_message)
+    }
+
+    @Before
+    fun setUp() {
+        MockitoAnnotations.initMocks(this)
+        context = TestContext(InstrumentationRegistry.getInstrumentation().context)
+        doReturn(notificationManager).`when`(mockContext)
+                .getSystemService(Context.NOTIFICATION_SERVICE)
+        fakeTetheringThread = HandlerThread(this::class.simpleName)
+        fakeTetheringThread.start()
+        notificationUpdater = WrappedNotificationUpdater(context, fakeTetheringThread.looper)
+        setupResources()
+    }
+
+    @After
+    fun tearDown() {
+        fakeTetheringThread.quitSafely()
+    }
+
+    private fun Notification.title() = this.extras.getString(Notification.EXTRA_TITLE)
+    private fun Notification.text() = this.extras.getString(Notification.EXTRA_TEXT)
+
+    private fun verifyNotification(iconId: Int, title: String, text: String, id: Int) {
+        verify(notificationManager, never()).cancel(any(), eq(id))
+
+        val notificationCaptor = ArgumentCaptor.forClass(Notification::class.java)
+        verify(notificationManager, times(1))
+                .notify(any(), eq(id), notificationCaptor.capture())
+
+        val notification = notificationCaptor.getValue()
+        assertEquals(iconId, notification.smallIcon.resId)
+        assertEquals(title, notification.title())
+        assertEquals(text, notification.text())
+
+        reset(notificationManager)
+    }
+
+    private fun verifyNotificationCancelled(
+        notificationIds: List<Int>,
+        resetAfterVerified: Boolean = true
+    ) {
+        notificationIds.forEach {
+            verify(notificationManager, times(1)).cancel(any(), eq(it))
+        }
+        if (resetAfterVerified) reset(notificationManager)
+    }
+
+    @Test
+    fun testRestrictedNotification() {
+        // Set test sub id.
+        notificationUpdater.onActiveDataSubscriptionIdChanged(TEST_SUBID)
+        verifyNotificationCancelled(listOf(NO_UPSTREAM_NOTIFICATION_ID, ROAMING_NOTIFICATION_ID))
+
+        // User restrictions on. Show restricted notification.
+        notificationUpdater.notifyTetheringDisabledByRestriction()
+        verifyNotification(NOTIFICATION_ICON_ID, TEST_DISALLOW_TITLE, TEST_DISALLOW_MESSAGE,
+                RESTRICTED_NOTIFICATION_ID)
+
+        // User restrictions off. Clear notification.
+        notificationUpdater.tetheringRestrictionLifted()
+        verifyNotificationCancelled(listOf(RESTRICTED_NOTIFICATION_ID))
+
+        // No downstream.
+        notificationUpdater.onDownstreamChanged(DOWNSTREAM_NONE)
+        verifyZeroInteractions(notificationManager)
+
+        // User restrictions on again. Show restricted notification.
+        notificationUpdater.notifyTetheringDisabledByRestriction()
+        verifyNotification(NOTIFICATION_ICON_ID, TEST_DISALLOW_TITLE, TEST_DISALLOW_MESSAGE,
+                RESTRICTED_NOTIFICATION_ID)
+    }
+
+    val MAX_BACKOFF_MS = 200L
+    /**
+     * Waits for all messages, including delayed ones, to be processed.
+     *
+     * This will wait until the handler has no more messages to be processed including
+     * delayed ones, or the timeout has expired. It uses an exponential backoff strategy
+     * to wait longer and longer to consume less CPU, with the max granularity being
+     * MAX_BACKOFF_MS.
+     *
+     * @return true if all messages have been processed including delayed ones, false if timeout
+     *
+     * TODO: Move this method to com.android.testutils.HandlerUtils.kt.
+     */
+    private fun Handler.waitForDelayedMessage(what: Int?, timeoutMs: Long) {
+        fun hasMatchingMessages() =
+                if (what == null) hasMessagesOrCallbacks() else hasMessages(what)
+        val expiry = System.currentTimeMillis() + timeoutMs
+        var delay = 5L
+        while (System.currentTimeMillis() < expiry && hasMatchingMessages()) {
+            // None of Handler, Looper, Message and MessageQueue expose any way to retrieve
+            // the time when the next (let alone the last) message will be processed, so
+            // short of examining the internals with reflection sleep() is the only solution.
+            Thread.sleep(delay)
+            delay = (delay * 2)
+                    .coerceAtMost(expiry - System.currentTimeMillis())
+                    .coerceAtMost(MAX_BACKOFF_MS)
+        }
+
+        val timeout = expiry - System.currentTimeMillis()
+        if (timeout <= 0) fail("Delayed message did not process yet after ${timeoutMs}ms")
+        waitForIdle(timeout)
+    }
+
+    @Test
+    fun testNoUpstreamNotification() {
+        // Set test sub id.
+        notificationUpdater.onActiveDataSubscriptionIdChanged(TEST_SUBID)
+        verifyNotificationCancelled(listOf(NO_UPSTREAM_NOTIFICATION_ID, ROAMING_NOTIFICATION_ID))
+
+        // Wifi downstream.
+        notificationUpdater.onDownstreamChanged(WIFI_MASK)
+        verifyNotificationCancelled(listOf(NO_UPSTREAM_NOTIFICATION_ID, ROAMING_NOTIFICATION_ID))
+
+        // There is no upstream. Show no upstream notification.
+        notificationUpdater.onUpstreamCapabilitiesChanged(null)
+        notificationUpdater.handler.waitForDelayedMessage(EVENT_SHOW_NO_UPSTREAM, TIMEOUT_MS)
+        verifyNotification(NOTIFICATION_ICON_ID, TEST_NO_UPSTREAM_TITLE, TEST_NO_UPSTREAM_MESSAGE,
+                NO_UPSTREAM_NOTIFICATION_ID)
+
+        // Same capabilities changed. Nothing happened.
+        notificationUpdater.onUpstreamCapabilitiesChanged(null)
+        verifyZeroInteractions(notificationManager)
+
+        // Upstream come back. Clear no upstream notification.
+        notificationUpdater.onUpstreamCapabilitiesChanged(HOME_CAPABILITIES)
+        verifyNotificationCancelled(listOf(NO_UPSTREAM_NOTIFICATION_ID))
+
+        // No upstream again. Show no upstream notification.
+        notificationUpdater.onUpstreamCapabilitiesChanged(null)
+        notificationUpdater.handler.waitForDelayedMessage(EVENT_SHOW_NO_UPSTREAM, TIMEOUT_MS)
+        verifyNotification(NOTIFICATION_ICON_ID, TEST_NO_UPSTREAM_TITLE, TEST_NO_UPSTREAM_MESSAGE,
+                NO_UPSTREAM_NOTIFICATION_ID)
+
+        // No downstream.
+        notificationUpdater.onDownstreamChanged(DOWNSTREAM_NONE)
+        verifyNotificationCancelled(listOf(NO_UPSTREAM_NOTIFICATION_ID, ROAMING_NOTIFICATION_ID))
+
+        // Wifi downstream and home capabilities.
+        notificationUpdater.onDownstreamChanged(WIFI_MASK)
+        notificationUpdater.onUpstreamCapabilitiesChanged(HOME_CAPABILITIES)
+        verifyNotificationCancelled(listOf(NO_UPSTREAM_NOTIFICATION_ID, ROAMING_NOTIFICATION_ID))
+
+        // Set R.integer.delay_to_show_no_upstream_after_no_backhaul to -1 and change to no upstream
+        // again. Don't put up no upstream notification.
+        doReturn(-1).`when`(testResources)
+                .getInteger(R.integer.delay_to_show_no_upstream_after_no_backhaul)
+        notificationUpdater.onUpstreamCapabilitiesChanged(null)
+        notificationUpdater.handler.waitForDelayedMessage(EVENT_SHOW_NO_UPSTREAM, TIMEOUT_MS)
+        verifyNotificationCancelled(listOf(NO_UPSTREAM_NOTIFICATION_ID))
+    }
+
+    @Test
+    fun testGetResourcesForSubId() {
+        doReturn(telephonyManager).`when`(telephonyManager).createForSubscriptionId(anyInt())
+        doReturn(1234).`when`(telephonyManager).getSimCarrierId()
+        doReturn("000000").`when`(telephonyManager).getSimOperator()
+
+        val subId = -2 // Use invalid subId to avoid getting resource from cache or real subId.
+        val config = context.resources.configuration
+        var res = notificationUpdater.getResourcesForSubId(context, subId)
+        assertEquals(config.mcc, res.configuration.mcc)
+        assertEquals(config.mnc, res.configuration.mnc)
+
+        doReturn(VERIZON_CARRIER_ID).`when`(telephonyManager).getSimCarrierId()
+        res = notificationUpdater.getResourcesForSubId(context, subId)
+        assertEquals(config.mcc, res.configuration.mcc)
+        assertEquals(config.mnc, res.configuration.mnc)
+
+        doReturn("20404").`when`(telephonyManager).getSimOperator()
+        res = notificationUpdater.getResourcesForSubId(context, subId)
+        assertEquals(311, res.configuration.mcc)
+        assertEquals(480, res.configuration.mnc)
+    }
+
+    @Test
+    fun testRoamingNotification() {
+        // Set test sub id.
+        notificationUpdater.onActiveDataSubscriptionIdChanged(TEST_SUBID)
+        verifyNotificationCancelled(listOf(NO_UPSTREAM_NOTIFICATION_ID, ROAMING_NOTIFICATION_ID))
+
+        // Wifi downstream.
+        notificationUpdater.onDownstreamChanged(WIFI_MASK)
+        verifyNotificationCancelled(listOf(NO_UPSTREAM_NOTIFICATION_ID, ROAMING_NOTIFICATION_ID))
+
+        // Upstream capabilities changed to roaming state. Show roaming notification.
+        notificationUpdater.onUpstreamCapabilitiesChanged(ROAMING_CAPABILITIES)
+        verifyNotification(NOTIFICATION_ICON_ID, TEST_ROAMING_TITLE, TEST_ROAMING_MESSAGE,
+                ROAMING_NOTIFICATION_ID)
+
+        // Same capabilities change. Nothing happened.
+        notificationUpdater.onUpstreamCapabilitiesChanged(ROAMING_CAPABILITIES)
+        verifyZeroInteractions(notificationManager)
+
+        // Upstream capabilities changed to home state. Clear roaming notification.
+        notificationUpdater.onUpstreamCapabilitiesChanged(HOME_CAPABILITIES)
+        verifyNotificationCancelled(listOf(ROAMING_NOTIFICATION_ID))
+
+        // Upstream capabilities changed to roaming state again. Show roaming notification.
+        notificationUpdater.onUpstreamCapabilitiesChanged(ROAMING_CAPABILITIES)
+        verifyNotification(NOTIFICATION_ICON_ID, TEST_ROAMING_TITLE, TEST_ROAMING_MESSAGE,
+                ROAMING_NOTIFICATION_ID)
+
+        // No upstream. Clear roaming notification and show no upstream notification.
+        notificationUpdater.onUpstreamCapabilitiesChanged(null)
+        notificationUpdater.handler.waitForDelayedMessage(EVENT_SHOW_NO_UPSTREAM, TIMEOUT_MS)
+        verifyNotificationCancelled(listOf(ROAMING_NOTIFICATION_ID), false)
+        verifyNotification(NOTIFICATION_ICON_ID, TEST_NO_UPSTREAM_TITLE, TEST_NO_UPSTREAM_MESSAGE,
+                NO_UPSTREAM_NOTIFICATION_ID)
+
+        // No downstream.
+        notificationUpdater.onDownstreamChanged(DOWNSTREAM_NONE)
+        verifyNotificationCancelled(listOf(NO_UPSTREAM_NOTIFICATION_ID, ROAMING_NOTIFICATION_ID))
+
+        // Wifi downstream again.
+        notificationUpdater.onDownstreamChanged(WIFI_MASK)
+        notificationUpdater.handler.waitForDelayedMessage(EVENT_SHOW_NO_UPSTREAM, TIMEOUT_MS)
+        verifyNotificationCancelled(listOf(ROAMING_NOTIFICATION_ID), false)
+        verifyNotification(NOTIFICATION_ICON_ID, TEST_NO_UPSTREAM_TITLE, TEST_NO_UPSTREAM_MESSAGE,
+                NO_UPSTREAM_NOTIFICATION_ID)
+
+        // Set R.bool.config_upstream_roaming_notification to false and change upstream
+        // network to roaming state again. No roaming notification.
+        doReturn(false).`when`(testResources)
+                .getBoolean(R.bool.config_upstream_roaming_notification)
+        notificationUpdater.onUpstreamCapabilitiesChanged(ROAMING_CAPABILITIES)
+        verifyNotificationCancelled(listOf(NO_UPSTREAM_NOTIFICATION_ID, ROAMING_NOTIFICATION_ID))
+    }
+}
diff --git a/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/TetheringServiceTest.java b/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/TetheringServiceTest.java
new file mode 100644
index 0000000..51bad9a
--- /dev/null
+++ b/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/TetheringServiceTest.java
@@ -0,0 +1,194 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.networkstack.tethering;
+
+import static android.net.TetheringManager.TETHERING_WIFI;
+import static android.net.TetheringManager.TETHER_ERROR_NO_ERROR;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
+import android.content.Intent;
+import android.net.IIntResultListener;
+import android.net.ITetheringConnector;
+import android.net.ITetheringEventCallback;
+import android.net.TetheringRequestParcel;
+import android.os.ResultReceiver;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.rule.ServiceTestRule;
+import androidx.test.runner.AndroidJUnit4;
+
+import com.android.networkstack.tethering.MockTetheringService.MockTetheringConnector;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public final class TetheringServiceTest {
+    private static final String TEST_IFACE_NAME = "test_wlan0";
+    private static final String TEST_CALLER_PKG = "test_pkg";
+    @Mock private ITetheringEventCallback mITetheringEventCallback;
+    @Rule public ServiceTestRule mServiceTestRule;
+    private Tethering mTethering;
+    private Intent mMockServiceIntent;
+    private ITetheringConnector mTetheringConnector;
+
+    private class TestTetheringResult extends IIntResultListener.Stub {
+        private int mResult = -1; // Default value that does not match any result code.
+        @Override
+        public void onResult(final int resultCode) {
+            mResult = resultCode;
+        }
+
+        public void assertResult(final int expected) {
+            assertEquals(expected, mResult);
+        }
+    }
+
+    @Before
+    public void setUp() throws Exception {
+        MockitoAnnotations.initMocks(this);
+        mServiceTestRule = new ServiceTestRule();
+        mMockServiceIntent = new Intent(
+                InstrumentationRegistry.getTargetContext(),
+                MockTetheringService.class);
+        final MockTetheringConnector mockConnector =
+                (MockTetheringConnector) mServiceTestRule.bindService(mMockServiceIntent);
+        mTetheringConnector = mockConnector.getTetheringConnector();
+        final MockTetheringService service = mockConnector.getService();
+        mTethering = service.getTethering();
+        verify(mTethering).startStateMachineUpdaters();
+        when(mTethering.hasTetherableConfiguration()).thenReturn(true);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        mServiceTestRule.unbindService();
+    }
+
+    @Test
+    public void testTether() throws Exception {
+        when(mTethering.tether(TEST_IFACE_NAME)).thenReturn(TETHER_ERROR_NO_ERROR);
+        final TestTetheringResult result = new TestTetheringResult();
+        mTetheringConnector.tether(TEST_IFACE_NAME, TEST_CALLER_PKG, result);
+        verify(mTethering).hasTetherableConfiguration();
+        verify(mTethering).tether(TEST_IFACE_NAME);
+        verifyNoMoreInteractions(mTethering);
+        result.assertResult(TETHER_ERROR_NO_ERROR);
+    }
+
+    @Test
+    public void testUntether() throws Exception {
+        when(mTethering.untether(TEST_IFACE_NAME)).thenReturn(TETHER_ERROR_NO_ERROR);
+        final TestTetheringResult result = new TestTetheringResult();
+        mTetheringConnector.untether(TEST_IFACE_NAME, TEST_CALLER_PKG, result);
+        verify(mTethering).hasTetherableConfiguration();
+        verify(mTethering).untether(TEST_IFACE_NAME);
+        verifyNoMoreInteractions(mTethering);
+        result.assertResult(TETHER_ERROR_NO_ERROR);
+    }
+
+    @Test
+    public void testSetUsbTethering() throws Exception {
+        when(mTethering.setUsbTethering(true /* enable */)).thenReturn(TETHER_ERROR_NO_ERROR);
+        final TestTetheringResult result = new TestTetheringResult();
+        mTetheringConnector.setUsbTethering(true /* enable */, TEST_CALLER_PKG, result);
+        verify(mTethering).hasTetherableConfiguration();
+        verify(mTethering).setUsbTethering(true /* enable */);
+        verifyNoMoreInteractions(mTethering);
+        result.assertResult(TETHER_ERROR_NO_ERROR);
+    }
+
+    @Test
+    public void testStartTethering() throws Exception {
+        final TestTetheringResult result = new TestTetheringResult();
+        final TetheringRequestParcel request = new TetheringRequestParcel();
+        request.tetheringType = TETHERING_WIFI;
+        mTetheringConnector.startTethering(request, TEST_CALLER_PKG, result);
+        verify(mTethering).hasTetherableConfiguration();
+        verify(mTethering).startTethering(eq(request), eq(result));
+        verifyNoMoreInteractions(mTethering);
+    }
+
+    @Test
+    public void testStopTethering() throws Exception {
+        final TestTetheringResult result = new TestTetheringResult();
+        mTetheringConnector.stopTethering(TETHERING_WIFI, TEST_CALLER_PKG, result);
+        verify(mTethering).hasTetherableConfiguration();
+        verify(mTethering).stopTethering(TETHERING_WIFI);
+        verifyNoMoreInteractions(mTethering);
+        result.assertResult(TETHER_ERROR_NO_ERROR);
+    }
+
+    @Test
+    public void testRequestLatestTetheringEntitlementResult() throws Exception {
+        final ResultReceiver result = new ResultReceiver(null);
+        mTetheringConnector.requestLatestTetheringEntitlementResult(TETHERING_WIFI, result,
+                true /* showEntitlementUi */, TEST_CALLER_PKG);
+        verify(mTethering).hasTetherableConfiguration();
+        verify(mTethering).requestLatestTetheringEntitlementResult(eq(TETHERING_WIFI),
+                eq(result), eq(true) /* showEntitlementUi */);
+        verifyNoMoreInteractions(mTethering);
+    }
+
+    @Test
+    public void testRegisterTetheringEventCallback() throws Exception {
+        mTetheringConnector.registerTetheringEventCallback(mITetheringEventCallback,
+                TEST_CALLER_PKG);
+        verify(mTethering).registerTetheringEventCallback(eq(mITetheringEventCallback));
+        verifyNoMoreInteractions(mTethering);
+    }
+
+    @Test
+    public void testUnregisterTetheringEventCallback() throws Exception {
+        mTetheringConnector.unregisterTetheringEventCallback(mITetheringEventCallback,
+                TEST_CALLER_PKG);
+        verify(mTethering).unregisterTetheringEventCallback(
+                eq(mITetheringEventCallback));
+        verifyNoMoreInteractions(mTethering);
+    }
+
+    @Test
+    public void testStopAllTethering() throws Exception {
+        final TestTetheringResult result = new TestTetheringResult();
+        mTetheringConnector.stopAllTethering(TEST_CALLER_PKG, result);
+        verify(mTethering).hasTetherableConfiguration();
+        verify(mTethering).untetherAll();
+        verifyNoMoreInteractions(mTethering);
+        result.assertResult(TETHER_ERROR_NO_ERROR);
+    }
+
+    @Test
+    public void testIsTetheringSupported() throws Exception {
+        final TestTetheringResult result = new TestTetheringResult();
+        mTetheringConnector.isTetheringSupported(TEST_CALLER_PKG, result);
+        verify(mTethering).hasTetherableConfiguration();
+        verifyNoMoreInteractions(mTethering);
+        result.assertResult(TETHER_ERROR_NO_ERROR);
+    }
+}
diff --git a/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/TetheringTest.java b/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/TetheringTest.java
new file mode 100644
index 0000000..0c86eeb
--- /dev/null
+++ b/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/TetheringTest.java
@@ -0,0 +1,1731 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.networkstack.tethering;
+
+import static android.hardware.usb.UsbManager.USB_CONFIGURED;
+import static android.hardware.usb.UsbManager.USB_CONNECTED;
+import static android.hardware.usb.UsbManager.USB_FUNCTION_NCM;
+import static android.hardware.usb.UsbManager.USB_FUNCTION_RNDIS;
+import static android.net.ConnectivityManager.ACTION_RESTRICT_BACKGROUND_CHANGED;
+import static android.net.ConnectivityManager.RESTRICT_BACKGROUND_STATUS_DISABLED;
+import static android.net.ConnectivityManager.RESTRICT_BACKGROUND_STATUS_ENABLED;
+import static android.net.RouteInfo.RTN_UNICAST;
+import static android.net.TetheringManager.ACTION_TETHER_STATE_CHANGED;
+import static android.net.TetheringManager.EXTRA_ACTIVE_LOCAL_ONLY;
+import static android.net.TetheringManager.EXTRA_ACTIVE_TETHER;
+import static android.net.TetheringManager.EXTRA_AVAILABLE_TETHER;
+import static android.net.TetheringManager.TETHERING_ETHERNET;
+import static android.net.TetheringManager.TETHERING_NCM;
+import static android.net.TetheringManager.TETHERING_USB;
+import static android.net.TetheringManager.TETHERING_WIFI;
+import static android.net.TetheringManager.TETHER_ERROR_NO_ERROR;
+import static android.net.TetheringManager.TETHER_ERROR_UNKNOWN_IFACE;
+import static android.net.TetheringManager.TETHER_HARDWARE_OFFLOAD_FAILED;
+import static android.net.TetheringManager.TETHER_HARDWARE_OFFLOAD_STARTED;
+import static android.net.TetheringManager.TETHER_HARDWARE_OFFLOAD_STOPPED;
+import static android.net.dhcp.IDhcpServer.STATUS_SUCCESS;
+import static android.net.shared.Inet4AddressUtils.intToInet4AddressHTH;
+import static android.net.wifi.WifiManager.EXTRA_WIFI_AP_INTERFACE_NAME;
+import static android.net.wifi.WifiManager.EXTRA_WIFI_AP_MODE;
+import static android.net.wifi.WifiManager.EXTRA_WIFI_AP_STATE;
+import static android.net.wifi.WifiManager.IFACE_IP_MODE_LOCAL_ONLY;
+import static android.net.wifi.WifiManager.IFACE_IP_MODE_TETHERED;
+import static android.net.wifi.WifiManager.WIFI_AP_STATE_ENABLED;
+import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
+
+import static com.android.networkstack.tethering.TetheringNotificationUpdater.DOWNSTREAM_NONE;
+import static com.android.networkstack.tethering.UpstreamNetworkMonitor.EVENT_ON_CAPABILITIES;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import static org.mockito.ArgumentMatchers.argThat;
+import static org.mockito.ArgumentMatchers.notNull;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.timeout;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
+import android.app.usage.NetworkStatsManager;
+import android.bluetooth.BluetoothAdapter;
+import android.content.BroadcastReceiver;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.ApplicationInfo;
+import android.content.res.Resources;
+import android.hardware.usb.UsbManager;
+import android.net.ConnectivityManager;
+import android.net.EthernetManager;
+import android.net.EthernetManager.TetheredInterfaceRequest;
+import android.net.IIntResultListener;
+import android.net.INetd;
+import android.net.ITetheringEventCallback;
+import android.net.InetAddresses;
+import android.net.InterfaceConfigurationParcel;
+import android.net.IpPrefix;
+import android.net.LinkAddress;
+import android.net.LinkProperties;
+import android.net.MacAddress;
+import android.net.Network;
+import android.net.NetworkCapabilities;
+import android.net.NetworkRequest;
+import android.net.RouteInfo;
+import android.net.TetherStatesParcel;
+import android.net.TetheredClient;
+import android.net.TetheringCallbackStartedParcel;
+import android.net.TetheringConfigurationParcel;
+import android.net.TetheringRequestParcel;
+import android.net.dhcp.DhcpServerCallbacks;
+import android.net.dhcp.DhcpServingParamsParcel;
+import android.net.dhcp.IDhcpServer;
+import android.net.ip.IpNeighborMonitor;
+import android.net.ip.IpServer;
+import android.net.ip.RouterAdvertisementDaemon;
+import android.net.util.InterfaceParams;
+import android.net.util.NetworkConstants;
+import android.net.util.SharedLog;
+import android.net.wifi.SoftApConfiguration;
+import android.net.wifi.WifiManager;
+import android.net.wifi.p2p.WifiP2pGroup;
+import android.net.wifi.p2p.WifiP2pInfo;
+import android.net.wifi.p2p.WifiP2pManager;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.PersistableBundle;
+import android.os.RemoteException;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.os.test.TestLooper;
+import android.provider.Settings;
+import android.telephony.CarrierConfigManager;
+import android.telephony.PhoneStateListener;
+import android.telephony.TelephonyManager;
+import android.test.mock.MockContentResolver;
+
+import androidx.annotation.NonNull;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import com.android.internal.util.ArrayUtils;
+import com.android.internal.util.StateMachine;
+import com.android.internal.util.test.BroadcastInterceptingContext;
+import com.android.internal.util.test.FakeSettingsProvider;
+import com.android.testutils.MiscAssertsKt;
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.net.Inet4Address;
+import java.net.Inet6Address;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import java.util.Vector;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class TetheringTest {
+    private static final int IFINDEX_OFFSET = 100;
+
+    private static final String TEST_MOBILE_IFNAME = "test_rmnet_data0";
+    private static final String TEST_XLAT_MOBILE_IFNAME = "v4-test_rmnet_data0";
+    private static final String TEST_USB_IFNAME = "test_rndis0";
+    private static final String TEST_WLAN_IFNAME = "test_wlan0";
+    private static final String TEST_P2P_IFNAME = "test_p2p-p2p0-0";
+    private static final String TEST_NCM_IFNAME = "test_ncm0";
+    private static final String TETHERING_NAME = "Tethering";
+
+    private static final int DHCPSERVER_START_TIMEOUT_MS = 1000;
+
+    @Mock private ApplicationInfo mApplicationInfo;
+    @Mock private Context mContext;
+    @Mock private NetworkStatsManager mStatsManager;
+    @Mock private OffloadHardwareInterface mOffloadHardwareInterface;
+    @Mock private OffloadHardwareInterface.ForwardedStats mForwardedStats;
+    @Mock private Resources mResources;
+    @Mock private TelephonyManager mTelephonyManager;
+    @Mock private UsbManager mUsbManager;
+    @Mock private WifiManager mWifiManager;
+    @Mock private CarrierConfigManager mCarrierConfigManager;
+    @Mock private UpstreamNetworkMonitor mUpstreamNetworkMonitor;
+    @Mock private IPv6TetheringCoordinator mIPv6TetheringCoordinator;
+    @Mock private RouterAdvertisementDaemon mRouterAdvertisementDaemon;
+    @Mock private IpNeighborMonitor mIpNeighborMonitor;
+    @Mock private IDhcpServer mDhcpServer;
+    @Mock private INetd mNetd;
+    @Mock private UserManager mUserManager;
+    @Mock private NetworkRequest mNetworkRequest;
+    @Mock private ConnectivityManager mCm;
+    @Mock private EthernetManager mEm;
+    @Mock private TetheringNotificationUpdater mNotificationUpdater;
+
+    private final MockIpServerDependencies mIpServerDependencies =
+            spy(new MockIpServerDependencies());
+    private final MockTetheringDependencies mTetheringDependencies =
+            new MockTetheringDependencies();
+
+    // Like so many Android system APIs, these cannot be mocked because it is marked final.
+    // We have to use the real versions.
+    private final PersistableBundle mCarrierConfig = new PersistableBundle();
+    private final TestLooper mLooper = new TestLooper();
+
+    private Vector<Intent> mIntents;
+    private BroadcastInterceptingContext mServiceContext;
+    private MockContentResolver mContentResolver;
+    private BroadcastReceiver mBroadcastReceiver;
+    private Tethering mTethering;
+    private PhoneStateListener mPhoneStateListener;
+    private InterfaceConfigurationParcel mInterfaceConfiguration;
+
+    private class TestContext extends BroadcastInterceptingContext {
+        TestContext(Context base) {
+            super(base);
+        }
+
+        @Override
+        public ApplicationInfo getApplicationInfo() {
+            return mApplicationInfo;
+        }
+
+        @Override
+        public ContentResolver getContentResolver() {
+            return mContentResolver;
+        }
+
+        @Override
+        public String getPackageName() {
+            return "TetheringTest";
+        }
+
+        @Override
+        public Resources getResources() {
+            return mResources;
+        }
+
+        @Override
+        public Object getSystemService(String name) {
+            if (Context.WIFI_SERVICE.equals(name)) return mWifiManager;
+            if (Context.USB_SERVICE.equals(name)) return mUsbManager;
+            if (Context.TELEPHONY_SERVICE.equals(name)) return mTelephonyManager;
+            if (Context.USER_SERVICE.equals(name)) return mUserManager;
+            if (Context.NETWORK_STATS_SERVICE.equals(name)) return mStatsManager;
+            if (Context.CONNECTIVITY_SERVICE.equals(name)) return mCm;
+            if (Context.ETHERNET_SERVICE.equals(name)) return mEm;
+            return super.getSystemService(name);
+        }
+
+        @Override
+        public String getSystemServiceName(Class<?> serviceClass) {
+            if (TelephonyManager.class.equals(serviceClass)) return Context.TELEPHONY_SERVICE;
+            return super.getSystemServiceName(serviceClass);
+        }
+    }
+
+    public class MockIpServerDependencies extends IpServer.Dependencies {
+        @Override
+        public RouterAdvertisementDaemon getRouterAdvertisementDaemon(
+                InterfaceParams ifParams) {
+            return mRouterAdvertisementDaemon;
+        }
+
+        @Override
+        public InterfaceParams getInterfaceParams(String ifName) {
+            assertTrue("Non-mocked interface " + ifName,
+                    ifName.equals(TEST_USB_IFNAME)
+                            || ifName.equals(TEST_WLAN_IFNAME)
+                            || ifName.equals(TEST_MOBILE_IFNAME)
+                            || ifName.equals(TEST_P2P_IFNAME)
+                            || ifName.equals(TEST_NCM_IFNAME));
+            final String[] ifaces = new String[] {
+                    TEST_USB_IFNAME, TEST_WLAN_IFNAME, TEST_MOBILE_IFNAME, TEST_P2P_IFNAME,
+                    TEST_NCM_IFNAME};
+            return new InterfaceParams(ifName, ArrayUtils.indexOf(ifaces, ifName) + IFINDEX_OFFSET,
+                    MacAddress.ALL_ZEROS_ADDRESS);
+        }
+
+        @Override
+        public void makeDhcpServer(String ifName, DhcpServingParamsParcel params,
+                DhcpServerCallbacks cb) {
+            new Thread(() -> {
+                try {
+                    cb.onDhcpServerCreated(STATUS_SUCCESS, mDhcpServer);
+                } catch (RemoteException e) {
+                    fail(e.getMessage());
+                }
+            }).run();
+        }
+
+        public IpNeighborMonitor getIpNeighborMonitor(Handler h, SharedLog l,
+                IpNeighborMonitor.NeighborEventConsumer c) {
+            return mIpNeighborMonitor;
+        }
+    }
+
+    private class MockTetheringConfiguration extends TetheringConfiguration {
+        MockTetheringConfiguration(Context ctx, SharedLog log, int id) {
+            super(ctx, log, id);
+        }
+
+        @Override
+        protected boolean getDeviceConfigBoolean(final String name) {
+            return false;
+        }
+
+        @Override
+        protected Resources getResourcesForSubIdWrapper(Context ctx, int subId) {
+            return mResources;
+        }
+    }
+
+    public class MockTetheringDependencies extends TetheringDependencies {
+        StateMachine mUpstreamNetworkMonitorMasterSM;
+        ArrayList<IpServer> mIpv6CoordinatorNotifyList;
+
+        public void reset() {
+            mUpstreamNetworkMonitorMasterSM = null;
+            mIpv6CoordinatorNotifyList = null;
+        }
+
+        @Override
+        public OffloadHardwareInterface getOffloadHardwareInterface(Handler h, SharedLog log) {
+            return mOffloadHardwareInterface;
+        }
+
+        @Override
+        public UpstreamNetworkMonitor getUpstreamNetworkMonitor(Context ctx,
+                StateMachine target, SharedLog log, int what) {
+            mUpstreamNetworkMonitorMasterSM = target;
+            return mUpstreamNetworkMonitor;
+        }
+
+        @Override
+        public IPv6TetheringCoordinator getIPv6TetheringCoordinator(
+                ArrayList<IpServer> notifyList, SharedLog log) {
+            mIpv6CoordinatorNotifyList = notifyList;
+            return mIPv6TetheringCoordinator;
+        }
+
+        @Override
+        public IpServer.Dependencies getIpServerDependencies() {
+            return mIpServerDependencies;
+        }
+
+        @Override
+        public NetworkRequest getDefaultNetworkRequest() {
+            return mNetworkRequest;
+        }
+
+        @Override
+        public boolean isTetheringSupported() {
+            return true;
+        }
+
+        @Override
+        public TetheringConfiguration generateTetheringConfiguration(Context ctx, SharedLog log,
+                int subId) {
+            return new MockTetheringConfiguration(ctx, log, subId);
+        }
+
+        @Override
+        public INetd getINetd(Context context) {
+            return mNetd;
+        }
+
+        @Override
+        public Looper getTetheringLooper() {
+            return mLooper.getLooper();
+        }
+
+        @Override
+        public Context getContext() {
+            return mServiceContext;
+        }
+
+        @Override
+        public BluetoothAdapter getBluetoothAdapter() {
+            // TODO: add test for bluetooth tethering.
+            return null;
+        }
+
+        @Override
+        public TetheringNotificationUpdater getNotificationUpdater(Context ctx, Looper looper) {
+            return mNotificationUpdater;
+        }
+    }
+
+    private static UpstreamNetworkState buildMobileUpstreamState(boolean withIPv4,
+            boolean withIPv6, boolean with464xlat) {
+        final LinkProperties prop = new LinkProperties();
+        prop.setInterfaceName(TEST_MOBILE_IFNAME);
+
+        if (withIPv4) {
+            prop.addRoute(new RouteInfo(new IpPrefix(Inet4Address.ANY, 0),
+                    InetAddresses.parseNumericAddress("10.0.0.1"),
+                    TEST_MOBILE_IFNAME, RTN_UNICAST));
+        }
+
+        if (withIPv6) {
+            prop.addDnsServer(InetAddresses.parseNumericAddress("2001:db8::2"));
+            prop.addLinkAddress(
+                    new LinkAddress(InetAddresses.parseNumericAddress("2001:db8::"),
+                            NetworkConstants.RFC7421_PREFIX_LENGTH));
+            prop.addRoute(new RouteInfo(new IpPrefix(Inet6Address.ANY, 0),
+                    InetAddresses.parseNumericAddress("2001:db8::1"),
+                    TEST_MOBILE_IFNAME, RTN_UNICAST));
+        }
+
+        if (with464xlat) {
+            final LinkProperties stackedLink = new LinkProperties();
+            stackedLink.setInterfaceName(TEST_XLAT_MOBILE_IFNAME);
+            stackedLink.addRoute(new RouteInfo(new IpPrefix(Inet4Address.ANY, 0),
+                    InetAddresses.parseNumericAddress("192.0.0.1"),
+                    TEST_XLAT_MOBILE_IFNAME, RTN_UNICAST));
+
+            prop.addStackedLink(stackedLink);
+        }
+
+
+        final NetworkCapabilities capabilities = new NetworkCapabilities()
+                .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR);
+        return new UpstreamNetworkState(prop, capabilities, new Network(100));
+    }
+
+    private static UpstreamNetworkState buildMobileIPv4UpstreamState() {
+        return buildMobileUpstreamState(true, false, false);
+    }
+
+    private static UpstreamNetworkState buildMobileIPv6UpstreamState() {
+        return buildMobileUpstreamState(false, true, false);
+    }
+
+    private static UpstreamNetworkState buildMobileDualStackUpstreamState() {
+        return buildMobileUpstreamState(true, true, false);
+    }
+
+    private static UpstreamNetworkState buildMobile464xlatUpstreamState() {
+        return buildMobileUpstreamState(false, true, true);
+    }
+
+    // See FakeSettingsProvider#clearSettingsProvider() that this needs to be called before and
+    // after use.
+    @BeforeClass
+    public static void setupOnce() {
+        FakeSettingsProvider.clearSettingsProvider();
+    }
+
+    @AfterClass
+    public static void tearDownOnce() {
+        FakeSettingsProvider.clearSettingsProvider();
+    }
+
+    @Before
+    public void setUp() throws Exception {
+        MockitoAnnotations.initMocks(this);
+        when(mResources.getStringArray(R.array.config_tether_dhcp_range))
+                .thenReturn(new String[0]);
+        when(mResources.getStringArray(R.array.config_tether_usb_regexs))
+                .thenReturn(new String[] { "test_rndis\\d" });
+        when(mResources.getStringArray(R.array.config_tether_wifi_regexs))
+                .thenReturn(new String[]{ "test_wlan\\d" });
+        when(mResources.getStringArray(R.array.config_tether_wifi_p2p_regexs))
+                .thenReturn(new String[]{ "test_p2p-p2p\\d-.*" });
+        when(mResources.getStringArray(R.array.config_tether_bluetooth_regexs))
+                .thenReturn(new String[0]);
+        when(mResources.getStringArray(R.array.config_tether_ncm_regexs))
+                .thenReturn(new String[] { "test_ncm\\d" });
+        when(mResources.getIntArray(R.array.config_tether_upstream_types)).thenReturn(new int[0]);
+        when(mResources.getBoolean(R.bool.config_tether_upstream_automatic)).thenReturn(false);
+        when(mResources.getBoolean(R.bool.config_tether_enable_legacy_dhcp_server)).thenReturn(
+                false);
+        when(mNetd.interfaceGetList())
+                .thenReturn(new String[] {
+                        TEST_MOBILE_IFNAME, TEST_WLAN_IFNAME, TEST_USB_IFNAME, TEST_P2P_IFNAME,
+                        TEST_NCM_IFNAME});
+        when(mResources.getString(R.string.config_wifi_tether_enable)).thenReturn("");
+        mInterfaceConfiguration = new InterfaceConfigurationParcel();
+        mInterfaceConfiguration.flags = new String[0];
+        when(mRouterAdvertisementDaemon.start())
+                .thenReturn(true);
+        initOffloadConfiguration(true /* offloadConfig */, true /* offloadControl */,
+                0 /* defaultDisabled */);
+        when(mOffloadHardwareInterface.getForwardedStats(any())).thenReturn(mForwardedStats);
+
+        mServiceContext = new TestContext(mContext);
+        mContentResolver = new MockContentResolver(mServiceContext);
+        mContentResolver.addProvider(Settings.AUTHORITY, new FakeSettingsProvider());
+        mIntents = new Vector<>();
+        mBroadcastReceiver = new BroadcastReceiver() {
+            @Override
+            public void onReceive(Context context, Intent intent) {
+                mIntents.addElement(intent);
+            }
+        };
+        mServiceContext.registerReceiver(mBroadcastReceiver,
+                new IntentFilter(ACTION_TETHER_STATE_CHANGED));
+        mTethering = makeTethering();
+        mTethering.startStateMachineUpdaters();
+        verify(mStatsManager, times(1)).registerNetworkStatsProvider(anyString(), any());
+        verify(mNetd).registerUnsolicitedEventListener(any());
+        final ArgumentCaptor<PhoneStateListener> phoneListenerCaptor =
+                ArgumentCaptor.forClass(PhoneStateListener.class);
+        verify(mTelephonyManager).listen(phoneListenerCaptor.capture(),
+                eq(PhoneStateListener.LISTEN_ACTIVE_DATA_SUBSCRIPTION_ID_CHANGE));
+        verify(mWifiManager).registerSoftApCallback(any(), any());
+        mPhoneStateListener = phoneListenerCaptor.getValue();
+    }
+
+    private Tethering makeTethering() {
+        mTetheringDependencies.reset();
+        return new Tethering(mTetheringDependencies);
+    }
+
+    private TetheringRequestParcel createTetheringRequestParcel(final int type) {
+        return createTetheringRequestParcel(type, null, null);
+    }
+
+    private TetheringRequestParcel createTetheringRequestParcel(final int type,
+            final LinkAddress serverAddr, final LinkAddress clientAddr) {
+        final TetheringRequestParcel request = new TetheringRequestParcel();
+        request.tetheringType = type;
+        request.localIPv4Address = serverAddr;
+        request.staticClientAddress = clientAddr;
+        request.exemptFromEntitlementCheck = false;
+        request.showProvisioningUi = false;
+
+        return request;
+    }
+
+    @After
+    public void tearDown() {
+        mServiceContext.unregisterReceiver(mBroadcastReceiver);
+    }
+
+    private void sendWifiApStateChanged(int state) {
+        final Intent intent = new Intent(WifiManager.WIFI_AP_STATE_CHANGED_ACTION);
+        intent.putExtra(EXTRA_WIFI_AP_STATE, state);
+        mServiceContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL);
+    }
+
+    private void sendWifiApStateChanged(int state, String ifname, int ipmode) {
+        final Intent intent = new Intent(WifiManager.WIFI_AP_STATE_CHANGED_ACTION);
+        intent.putExtra(EXTRA_WIFI_AP_STATE, state);
+        intent.putExtra(EXTRA_WIFI_AP_INTERFACE_NAME, ifname);
+        intent.putExtra(EXTRA_WIFI_AP_MODE, ipmode);
+        mServiceContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL);
+    }
+
+    private static final String[] P2P_RECEIVER_PERMISSIONS_FOR_BROADCAST = {
+            android.Manifest.permission.ACCESS_FINE_LOCATION,
+            android.Manifest.permission.ACCESS_WIFI_STATE
+    };
+
+    private void sendWifiP2pConnectionChanged(
+            boolean isGroupFormed, boolean isGroupOwner, String ifname) {
+        WifiP2pGroup group = null;
+        WifiP2pInfo p2pInfo = new WifiP2pInfo();
+        p2pInfo.groupFormed = isGroupFormed;
+        if (isGroupFormed) {
+            p2pInfo.isGroupOwner = isGroupOwner;
+            group = mock(WifiP2pGroup.class);
+            when(group.isGroupOwner()).thenReturn(isGroupOwner);
+            when(group.getInterface()).thenReturn(ifname);
+        }
+
+        final Intent intent = mock(Intent.class);
+        when(intent.getAction()).thenReturn(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);
+        when(intent.getParcelableExtra(WifiP2pManager.EXTRA_WIFI_P2P_INFO)).thenReturn(p2pInfo);
+        when(intent.getParcelableExtra(WifiP2pManager.EXTRA_WIFI_P2P_GROUP)).thenReturn(group);
+
+        mServiceContext.sendBroadcastAsUserMultiplePermissions(intent, UserHandle.ALL,
+                P2P_RECEIVER_PERMISSIONS_FOR_BROADCAST);
+    }
+
+    private void sendUsbBroadcast(boolean connected, boolean configured, boolean function,
+            int type) {
+        final Intent intent = new Intent(UsbManager.ACTION_USB_STATE);
+        intent.putExtra(USB_CONNECTED, connected);
+        intent.putExtra(USB_CONFIGURED, configured);
+        if (type == TETHERING_USB) {
+            intent.putExtra(USB_FUNCTION_RNDIS, function);
+        } else {
+            intent.putExtra(USB_FUNCTION_NCM, function);
+        }
+        mServiceContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL);
+    }
+
+    private void sendConfigurationChanged() {
+        final Intent intent = new Intent(Intent.ACTION_CONFIGURATION_CHANGED);
+        mServiceContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL);
+    }
+
+    private void verifyInterfaceServingModeStarted(String ifname) throws Exception {
+        verify(mNetd, times(1)).interfaceSetCfg(any(InterfaceConfigurationParcel.class));
+        verify(mNetd, times(1)).tetherInterfaceAdd(ifname);
+        verify(mNetd, times(1)).networkAddInterface(INetd.LOCAL_NET_ID, ifname);
+        verify(mNetd, times(2)).networkAddRoute(eq(INetd.LOCAL_NET_ID), eq(ifname),
+                anyString(), anyString());
+    }
+
+    private void verifyTetheringBroadcast(String ifname, String whichExtra) {
+        // Verify that ifname is in the whichExtra array of the tether state changed broadcast.
+        final Intent bcast = mIntents.get(0);
+        assertEquals(ACTION_TETHER_STATE_CHANGED, bcast.getAction());
+        final ArrayList<String> ifnames = bcast.getStringArrayListExtra(whichExtra);
+        assertTrue(ifnames.contains(ifname));
+        mIntents.remove(bcast);
+    }
+
+    public void failingLocalOnlyHotspotLegacyApBroadcast(
+            boolean emulateInterfaceStatusChanged) throws Exception {
+        // Emulate externally-visible WifiManager effects, causing the
+        // per-interface state machine to start up, and telling us that
+        // hotspot mode is to be started.
+        if (emulateInterfaceStatusChanged) {
+            mTethering.interfaceStatusChanged(TEST_WLAN_IFNAME, true);
+        }
+        sendWifiApStateChanged(WIFI_AP_STATE_ENABLED);
+        mLooper.dispatchAll();
+
+        // If, and only if, Tethering received an interface status changed then
+        // it creates a IpServer and sends out a broadcast indicating that the
+        // interface is "available".
+        if (emulateInterfaceStatusChanged) {
+            // There is 1 IpServer state change event: STATE_AVAILABLE
+            verify(mNotificationUpdater, times(1)).onDownstreamChanged(DOWNSTREAM_NONE);
+            verifyTetheringBroadcast(TEST_WLAN_IFNAME, EXTRA_AVAILABLE_TETHER);
+            verify(mWifiManager).updateInterfaceIpState(
+                    TEST_WLAN_IFNAME, WifiManager.IFACE_IP_MODE_UNSPECIFIED);
+        }
+        verifyNoMoreInteractions(mNetd);
+        verifyNoMoreInteractions(mWifiManager);
+    }
+
+    private void prepareNcmTethering() {
+        // Emulate startTethering(TETHERING_NCM) called
+        mTethering.startTethering(createTetheringRequestParcel(TETHERING_NCM), null);
+        mLooper.dispatchAll();
+        verify(mUsbManager, times(1)).setCurrentFunctions(UsbManager.FUNCTION_NCM);
+
+        mTethering.interfaceStatusChanged(TEST_NCM_IFNAME, true);
+    }
+
+    private void prepareUsbTethering(UpstreamNetworkState upstreamState) {
+        when(mUpstreamNetworkMonitor.getCurrentPreferredUpstream()).thenReturn(upstreamState);
+        when(mUpstreamNetworkMonitor.selectPreferredUpstreamType(any()))
+                .thenReturn(upstreamState);
+
+        // Emulate pressing the USB tethering button in Settings UI.
+        mTethering.startTethering(createTetheringRequestParcel(TETHERING_USB), null);
+        mLooper.dispatchAll();
+        verify(mUsbManager, times(1)).setCurrentFunctions(UsbManager.FUNCTION_RNDIS);
+
+        mTethering.interfaceStatusChanged(TEST_USB_IFNAME, true);
+    }
+
+    @Test
+    public void testUsbConfiguredBroadcastStartsTethering() throws Exception {
+        UpstreamNetworkState upstreamState = buildMobileIPv4UpstreamState();
+        prepareUsbTethering(upstreamState);
+
+        // This should produce no activity of any kind.
+        verifyNoMoreInteractions(mNetd);
+
+        // Pretend we then receive USB configured broadcast.
+        sendUsbBroadcast(true, true, true, TETHERING_USB);
+        mLooper.dispatchAll();
+        // Now we should see the start of tethering mechanics (in this case:
+        // tetherMatchingInterfaces() which starts by fetching all interfaces).
+        verify(mNetd, times(1)).interfaceGetList();
+
+        // UpstreamNetworkMonitor should receive selected upstream
+        verify(mUpstreamNetworkMonitor, times(1)).selectPreferredUpstreamType(any());
+        verify(mUpstreamNetworkMonitor, times(1)).setCurrentUpstream(upstreamState.network);
+    }
+
+    @Test
+    public void failingLocalOnlyHotspotLegacyApBroadcastWithIfaceStatusChanged() throws Exception {
+        failingLocalOnlyHotspotLegacyApBroadcast(true);
+    }
+
+    @Test
+    public void failingLocalOnlyHotspotLegacyApBroadcastSansIfaceStatusChanged() throws Exception {
+        failingLocalOnlyHotspotLegacyApBroadcast(false);
+    }
+
+    public void workingLocalOnlyHotspotEnrichedApBroadcast(
+            boolean emulateInterfaceStatusChanged) throws Exception {
+        // Emulate externally-visible WifiManager effects, causing the
+        // per-interface state machine to start up, and telling us that
+        // hotspot mode is to be started.
+        if (emulateInterfaceStatusChanged) {
+            mTethering.interfaceStatusChanged(TEST_WLAN_IFNAME, true);
+        }
+        sendWifiApStateChanged(WIFI_AP_STATE_ENABLED, TEST_WLAN_IFNAME, IFACE_IP_MODE_LOCAL_ONLY);
+        mLooper.dispatchAll();
+
+        verifyInterfaceServingModeStarted(TEST_WLAN_IFNAME);
+        verifyTetheringBroadcast(TEST_WLAN_IFNAME, EXTRA_AVAILABLE_TETHER);
+        verify(mNetd, times(1)).ipfwdEnableForwarding(TETHERING_NAME);
+        verify(mNetd, times(1)).tetherStartWithConfiguration(any());
+        verifyNoMoreInteractions(mNetd);
+        verify(mWifiManager).updateInterfaceIpState(
+                TEST_WLAN_IFNAME, WifiManager.IFACE_IP_MODE_UNSPECIFIED);
+        verify(mWifiManager).updateInterfaceIpState(
+                TEST_WLAN_IFNAME, WifiManager.IFACE_IP_MODE_LOCAL_ONLY);
+        verifyNoMoreInteractions(mWifiManager);
+        verifyTetheringBroadcast(TEST_WLAN_IFNAME, EXTRA_ACTIVE_LOCAL_ONLY);
+        verify(mUpstreamNetworkMonitor, times(1)).startObserveAllNetworks();
+        // There are 2 IpServer state change events: STATE_AVAILABLE -> STATE_LOCAL_ONLY
+        verify(mNotificationUpdater, times(2)).onDownstreamChanged(DOWNSTREAM_NONE);
+
+        // Emulate externally-visible WifiManager effects, when hotspot mode
+        // is being torn down.
+        sendWifiApStateChanged(WifiManager.WIFI_AP_STATE_DISABLED);
+        mTethering.interfaceRemoved(TEST_WLAN_IFNAME);
+        mLooper.dispatchAll();
+
+        verify(mNetd, times(1)).tetherApplyDnsInterfaces();
+        verify(mNetd, times(1)).tetherInterfaceRemove(TEST_WLAN_IFNAME);
+        verify(mNetd, times(1)).networkRemoveInterface(INetd.LOCAL_NET_ID, TEST_WLAN_IFNAME);
+        // interfaceSetCfg() called once for enabling and twice disabling IPv4.
+        verify(mNetd, times(3)).interfaceSetCfg(any(InterfaceConfigurationParcel.class));
+        verify(mNetd, times(1)).tetherStop();
+        verify(mNetd, times(1)).ipfwdDisableForwarding(TETHERING_NAME);
+        verify(mWifiManager, times(3)).updateInterfaceIpState(
+                TEST_WLAN_IFNAME, WifiManager.IFACE_IP_MODE_UNSPECIFIED);
+        verifyNoMoreInteractions(mNetd);
+        verifyNoMoreInteractions(mWifiManager);
+        // Asking for the last error after the per-interface state machine
+        // has been reaped yields an unknown interface error.
+        assertEquals(TETHER_ERROR_UNKNOWN_IFACE, mTethering.getLastTetherError(TEST_WLAN_IFNAME));
+    }
+
+    /**
+     * Send CMD_IPV6_TETHER_UPDATE to IpServers as would be done by IPv6TetheringCoordinator.
+     */
+    private void sendIPv6TetherUpdates(UpstreamNetworkState upstreamState) {
+        // IPv6TetheringCoordinator must have been notified of downstream
+        verify(mIPv6TetheringCoordinator, times(1)).addActiveDownstream(
+                argThat(sm -> sm.linkProperties().getInterfaceName().equals(TEST_USB_IFNAME)),
+                eq(IpServer.STATE_TETHERED));
+
+        for (IpServer ipSrv : mTetheringDependencies.mIpv6CoordinatorNotifyList) {
+            UpstreamNetworkState ipv6OnlyState = buildMobileUpstreamState(false, true, false);
+            ipSrv.sendMessage(IpServer.CMD_IPV6_TETHER_UPDATE, 0, 0,
+                    upstreamState.linkProperties.isIpv6Provisioned()
+                            ? ipv6OnlyState.linkProperties
+                            : null);
+        }
+        mLooper.dispatchAll();
+    }
+
+    private void runUsbTethering(UpstreamNetworkState upstreamState) {
+        prepareUsbTethering(upstreamState);
+        sendUsbBroadcast(true, true, true, TETHERING_USB);
+        mLooper.dispatchAll();
+    }
+
+    @Test
+    public void workingMobileUsbTethering_IPv4() throws Exception {
+        UpstreamNetworkState upstreamState = buildMobileIPv4UpstreamState();
+        runUsbTethering(upstreamState);
+
+        verify(mNetd, times(1)).tetherAddForward(TEST_USB_IFNAME, TEST_MOBILE_IFNAME);
+        verify(mNetd, times(1)).ipfwdAddInterfaceForward(TEST_USB_IFNAME, TEST_MOBILE_IFNAME);
+
+        sendIPv6TetherUpdates(upstreamState);
+        verify(mRouterAdvertisementDaemon, never()).buildNewRa(any(), notNull());
+        verify(mDhcpServer, timeout(DHCPSERVER_START_TIMEOUT_MS).times(1)).startWithCallbacks(
+                any(), any());
+    }
+
+    @Test
+    public void workingMobileUsbTethering_IPv4LegacyDhcp() {
+        when(mResources.getBoolean(R.bool.config_tether_enable_legacy_dhcp_server)).thenReturn(
+                true);
+        sendConfigurationChanged();
+        final UpstreamNetworkState upstreamState = buildMobileIPv4UpstreamState();
+        runUsbTethering(upstreamState);
+        sendIPv6TetherUpdates(upstreamState);
+
+        verify(mIpServerDependencies, never()).makeDhcpServer(any(), any(), any());
+    }
+
+    @Test
+    public void workingMobileUsbTethering_IPv6() throws Exception {
+        UpstreamNetworkState upstreamState = buildMobileIPv6UpstreamState();
+        runUsbTethering(upstreamState);
+
+        verify(mNetd, times(1)).tetherAddForward(TEST_USB_IFNAME, TEST_MOBILE_IFNAME);
+        verify(mNetd, times(1)).ipfwdAddInterfaceForward(TEST_USB_IFNAME, TEST_MOBILE_IFNAME);
+
+        sendIPv6TetherUpdates(upstreamState);
+        verify(mRouterAdvertisementDaemon, times(1)).buildNewRa(any(), notNull());
+        verify(mNetd, times(1)).tetherApplyDnsInterfaces();
+    }
+
+    @Test
+    public void workingMobileUsbTethering_DualStack() throws Exception {
+        UpstreamNetworkState upstreamState = buildMobileDualStackUpstreamState();
+        runUsbTethering(upstreamState);
+
+        verify(mNetd, times(1)).tetherAddForward(TEST_USB_IFNAME, TEST_MOBILE_IFNAME);
+        verify(mNetd, times(1)).ipfwdAddInterfaceForward(TEST_USB_IFNAME, TEST_MOBILE_IFNAME);
+        verify(mRouterAdvertisementDaemon, times(1)).start();
+        verify(mDhcpServer, timeout(DHCPSERVER_START_TIMEOUT_MS).times(1)).startWithCallbacks(
+                any(), any());
+
+        sendIPv6TetherUpdates(upstreamState);
+        verify(mRouterAdvertisementDaemon, times(1)).buildNewRa(any(), notNull());
+        verify(mNetd, times(1)).tetherApplyDnsInterfaces();
+    }
+
+    @Test
+    public void workingMobileUsbTethering_MultipleUpstreams() throws Exception {
+        UpstreamNetworkState upstreamState = buildMobile464xlatUpstreamState();
+        runUsbTethering(upstreamState);
+
+        verify(mNetd, times(1)).tetherAddForward(TEST_USB_IFNAME, TEST_XLAT_MOBILE_IFNAME);
+        verify(mNetd, times(1)).tetherAddForward(TEST_USB_IFNAME, TEST_MOBILE_IFNAME);
+        verify(mDhcpServer, timeout(DHCPSERVER_START_TIMEOUT_MS).times(1)).startWithCallbacks(
+                any(), any());
+        verify(mNetd, times(1)).ipfwdAddInterfaceForward(TEST_USB_IFNAME, TEST_XLAT_MOBILE_IFNAME);
+        verify(mNetd, times(1)).ipfwdAddInterfaceForward(TEST_USB_IFNAME, TEST_MOBILE_IFNAME);
+
+        sendIPv6TetherUpdates(upstreamState);
+        verify(mRouterAdvertisementDaemon, times(1)).buildNewRa(any(), notNull());
+        verify(mNetd, times(1)).tetherApplyDnsInterfaces();
+    }
+
+    @Test
+    public void workingMobileUsbTethering_v6Then464xlat() throws Exception {
+        // Setup IPv6
+        UpstreamNetworkState upstreamState = buildMobileIPv6UpstreamState();
+        runUsbTethering(upstreamState);
+
+        verify(mNetd, times(1)).tetherAddForward(TEST_USB_IFNAME, TEST_MOBILE_IFNAME);
+        verify(mDhcpServer, timeout(DHCPSERVER_START_TIMEOUT_MS).times(1)).startWithCallbacks(
+                any(), any());
+        verify(mNetd, times(1)).ipfwdAddInterfaceForward(TEST_USB_IFNAME, TEST_MOBILE_IFNAME);
+
+        // Then 464xlat comes up
+        upstreamState = buildMobile464xlatUpstreamState();
+        when(mUpstreamNetworkMonitor.selectPreferredUpstreamType(any()))
+                .thenReturn(upstreamState);
+
+        // Upstream LinkProperties changed: UpstreamNetworkMonitor sends EVENT_ON_LINKPROPERTIES.
+        mTetheringDependencies.mUpstreamNetworkMonitorMasterSM.sendMessage(
+                Tethering.TetherMasterSM.EVENT_UPSTREAM_CALLBACK,
+                UpstreamNetworkMonitor.EVENT_ON_LINKPROPERTIES,
+                0,
+                upstreamState);
+        mLooper.dispatchAll();
+
+        // Forwarding is added for 464xlat
+        verify(mNetd, times(1)).tetherAddForward(TEST_USB_IFNAME, TEST_XLAT_MOBILE_IFNAME);
+        verify(mNetd, times(1)).ipfwdAddInterfaceForward(TEST_USB_IFNAME, TEST_XLAT_MOBILE_IFNAME);
+        // Forwarding was not re-added for v6 (still times(1))
+        verify(mNetd, times(1)).tetherAddForward(TEST_USB_IFNAME, TEST_MOBILE_IFNAME);
+        verify(mNetd, times(1)).ipfwdAddInterfaceForward(TEST_USB_IFNAME, TEST_MOBILE_IFNAME);
+        // DHCP not restarted on downstream (still times(1))
+        verify(mDhcpServer, timeout(DHCPSERVER_START_TIMEOUT_MS).times(1)).startWithCallbacks(
+                any(), any());
+    }
+
+    @Test
+    public void configTetherUpstreamAutomaticIgnoresConfigTetherUpstreamTypes() throws Exception {
+        when(mResources.getBoolean(R.bool.config_tether_upstream_automatic)).thenReturn(true);
+        sendConfigurationChanged();
+
+        // Setup IPv6
+        final UpstreamNetworkState upstreamState = buildMobileIPv6UpstreamState();
+        runUsbTethering(upstreamState);
+
+        // UpstreamNetworkMonitor should choose upstream automatically
+        // (in this specific case: choose the default network).
+        verify(mUpstreamNetworkMonitor, times(1)).getCurrentPreferredUpstream();
+        verify(mUpstreamNetworkMonitor, never()).selectPreferredUpstreamType(any());
+
+        verify(mUpstreamNetworkMonitor, times(1)).setCurrentUpstream(upstreamState.network);
+    }
+
+    private void runNcmTethering() {
+        prepareNcmTethering();
+        sendUsbBroadcast(true, true, true, TETHERING_NCM);
+        mLooper.dispatchAll();
+    }
+
+    @Test
+    public void workingNcmTethering() throws Exception {
+        runNcmTethering();
+
+        verify(mDhcpServer, timeout(DHCPSERVER_START_TIMEOUT_MS).times(1)).startWithCallbacks(
+                any(), any());
+    }
+
+    @Test
+    public void workingNcmTethering_LegacyDhcp() {
+        when(mResources.getBoolean(R.bool.config_tether_enable_legacy_dhcp_server)).thenReturn(
+                true);
+        sendConfigurationChanged();
+        runNcmTethering();
+
+        verify(mIpServerDependencies, never()).makeDhcpServer(any(), any(), any());
+    }
+
+    @Test
+    public void workingLocalOnlyHotspotEnrichedApBroadcastWithIfaceChanged() throws Exception {
+        workingLocalOnlyHotspotEnrichedApBroadcast(true);
+    }
+
+    @Test
+    public void workingLocalOnlyHotspotEnrichedApBroadcastSansIfaceChanged() throws Exception {
+        workingLocalOnlyHotspotEnrichedApBroadcast(false);
+    }
+
+    // TODO: Test with and without interfaceStatusChanged().
+    @Test
+    public void failingWifiTetheringLegacyApBroadcast() throws Exception {
+        when(mWifiManager.startTetheredHotspot(any(SoftApConfiguration.class))).thenReturn(true);
+
+        // Emulate pressing the WiFi tethering button.
+        mTethering.startTethering(createTetheringRequestParcel(TETHERING_WIFI), null);
+        mLooper.dispatchAll();
+        verify(mWifiManager, times(1)).startTetheredHotspot(null);
+        verifyNoMoreInteractions(mWifiManager);
+        verifyNoMoreInteractions(mNetd);
+
+        // Emulate externally-visible WifiManager effects, causing the
+        // per-interface state machine to start up, and telling us that
+        // tethering mode is to be started.
+        mTethering.interfaceStatusChanged(TEST_WLAN_IFNAME, true);
+        sendWifiApStateChanged(WIFI_AP_STATE_ENABLED);
+        mLooper.dispatchAll();
+
+        // There is 1 IpServer state change event: STATE_AVAILABLE
+        verify(mNotificationUpdater, times(1)).onDownstreamChanged(DOWNSTREAM_NONE);
+        verifyTetheringBroadcast(TEST_WLAN_IFNAME, EXTRA_AVAILABLE_TETHER);
+        verify(mWifiManager).updateInterfaceIpState(
+                TEST_WLAN_IFNAME, WifiManager.IFACE_IP_MODE_UNSPECIFIED);
+        verifyNoMoreInteractions(mNetd);
+        verifyNoMoreInteractions(mWifiManager);
+    }
+
+    // TODO: Test with and without interfaceStatusChanged().
+    @Test
+    public void workingWifiTetheringEnrichedApBroadcast() throws Exception {
+        when(mWifiManager.startTetheredHotspot(any(SoftApConfiguration.class))).thenReturn(true);
+
+        // Emulate pressing the WiFi tethering button.
+        mTethering.startTethering(createTetheringRequestParcel(TETHERING_WIFI), null);
+        mLooper.dispatchAll();
+        verify(mWifiManager, times(1)).startTetheredHotspot(null);
+        verifyNoMoreInteractions(mWifiManager);
+        verifyNoMoreInteractions(mNetd);
+
+        // Emulate externally-visible WifiManager effects, causing the
+        // per-interface state machine to start up, and telling us that
+        // tethering mode is to be started.
+        mTethering.interfaceStatusChanged(TEST_WLAN_IFNAME, true);
+        sendWifiApStateChanged(WIFI_AP_STATE_ENABLED, TEST_WLAN_IFNAME, IFACE_IP_MODE_TETHERED);
+        mLooper.dispatchAll();
+
+        verifyInterfaceServingModeStarted(TEST_WLAN_IFNAME);
+        verifyTetheringBroadcast(TEST_WLAN_IFNAME, EXTRA_AVAILABLE_TETHER);
+        verify(mNetd, times(1)).ipfwdEnableForwarding(TETHERING_NAME);
+        verify(mNetd, times(1)).tetherStartWithConfiguration(any());
+        verify(mNetd, times(2)).networkAddRoute(eq(INetd.LOCAL_NET_ID), eq(TEST_WLAN_IFNAME),
+                anyString(), anyString());
+        verifyNoMoreInteractions(mNetd);
+        verify(mWifiManager).updateInterfaceIpState(
+                TEST_WLAN_IFNAME, WifiManager.IFACE_IP_MODE_UNSPECIFIED);
+        verify(mWifiManager).updateInterfaceIpState(
+                TEST_WLAN_IFNAME, WifiManager.IFACE_IP_MODE_TETHERED);
+        verifyNoMoreInteractions(mWifiManager);
+        verifyTetheringBroadcast(TEST_WLAN_IFNAME, EXTRA_ACTIVE_TETHER);
+        verify(mUpstreamNetworkMonitor, times(1)).startObserveAllNetworks();
+        // In tethering mode, in the default configuration, an explicit request
+        // for a mobile network is also made.
+        verify(mUpstreamNetworkMonitor, times(1)).registerMobileNetworkRequest();
+        // There are 2 IpServer state change events: STATE_AVAILABLE -> STATE_TETHERED
+        verify(mNotificationUpdater, times(1)).onDownstreamChanged(DOWNSTREAM_NONE);
+        verify(mNotificationUpdater, times(1)).onDownstreamChanged(eq(1 << TETHERING_WIFI));
+
+        /////
+        // We do not currently emulate any upstream being found.
+        //
+        // This is why there are no calls to verify mNetd.tetherAddForward() or
+        // mNetd.ipfwdAddInterfaceForward().
+        /////
+
+        // Emulate pressing the WiFi tethering button.
+        mTethering.stopTethering(TETHERING_WIFI);
+        mLooper.dispatchAll();
+        verify(mWifiManager, times(1)).stopSoftAp();
+        verifyNoMoreInteractions(mWifiManager);
+        verifyNoMoreInteractions(mNetd);
+
+        // Emulate externally-visible WifiManager effects, when tethering mode
+        // is being torn down.
+        sendWifiApStateChanged(WifiManager.WIFI_AP_STATE_DISABLED);
+        mTethering.interfaceRemoved(TEST_WLAN_IFNAME);
+        mLooper.dispatchAll();
+
+        verify(mNetd, times(1)).tetherApplyDnsInterfaces();
+        verify(mNetd, times(1)).tetherInterfaceRemove(TEST_WLAN_IFNAME);
+        verify(mNetd, times(1)).networkRemoveInterface(INetd.LOCAL_NET_ID, TEST_WLAN_IFNAME);
+        // interfaceSetCfg() called once for enabling and twice for disabling IPv4.
+        verify(mNetd, times(3)).interfaceSetCfg(any(InterfaceConfigurationParcel.class));
+        verify(mNetd, times(1)).tetherStop();
+        verify(mNetd, times(1)).ipfwdDisableForwarding(TETHERING_NAME);
+        verify(mWifiManager, times(3)).updateInterfaceIpState(
+                TEST_WLAN_IFNAME, WifiManager.IFACE_IP_MODE_UNSPECIFIED);
+        verifyNoMoreInteractions(mNetd);
+        verifyNoMoreInteractions(mWifiManager);
+        // Asking for the last error after the per-interface state machine
+        // has been reaped yields an unknown interface error.
+        assertEquals(TETHER_ERROR_UNKNOWN_IFACE, mTethering.getLastTetherError(TEST_WLAN_IFNAME));
+    }
+
+    // TODO: Test with and without interfaceStatusChanged().
+    @Test
+    public void failureEnablingIpForwarding() throws Exception {
+        when(mWifiManager.startTetheredHotspot(any(SoftApConfiguration.class))).thenReturn(true);
+        doThrow(new RemoteException()).when(mNetd).ipfwdEnableForwarding(TETHERING_NAME);
+
+        // Emulate pressing the WiFi tethering button.
+        mTethering.startTethering(createTetheringRequestParcel(TETHERING_WIFI), null);
+        mLooper.dispatchAll();
+        verify(mWifiManager, times(1)).startTetheredHotspot(null);
+        verifyNoMoreInteractions(mWifiManager);
+        verifyNoMoreInteractions(mNetd);
+
+        // Emulate externally-visible WifiManager effects, causing the
+        // per-interface state machine to start up, and telling us that
+        // tethering mode is to be started.
+        mTethering.interfaceStatusChanged(TEST_WLAN_IFNAME, true);
+        sendWifiApStateChanged(WIFI_AP_STATE_ENABLED, TEST_WLAN_IFNAME, IFACE_IP_MODE_TETHERED);
+        mLooper.dispatchAll();
+
+        // We verify get/set called three times here: twice for setup and once during
+        // teardown because all events happen over the course of the single
+        // dispatchAll() above. Note that once the IpServer IPv4 address config
+        // code is refactored the two calls during shutdown will revert to one.
+        verify(mNetd, times(3)).interfaceSetCfg(argThat(p -> TEST_WLAN_IFNAME.equals(p.ifName)));
+        verify(mNetd, times(1)).tetherInterfaceAdd(TEST_WLAN_IFNAME);
+        verify(mNetd, times(1)).networkAddInterface(INetd.LOCAL_NET_ID, TEST_WLAN_IFNAME);
+        verify(mNetd, times(2)).networkAddRoute(eq(INetd.LOCAL_NET_ID), eq(TEST_WLAN_IFNAME),
+                anyString(), anyString());
+        verify(mWifiManager).updateInterfaceIpState(
+                TEST_WLAN_IFNAME, WifiManager.IFACE_IP_MODE_UNSPECIFIED);
+        verify(mWifiManager).updateInterfaceIpState(
+                TEST_WLAN_IFNAME, WifiManager.IFACE_IP_MODE_TETHERED);
+        // There are 3 IpServer state change event:
+        //         STATE_AVAILABLE -> STATE_TETHERED -> STATE_AVAILABLE.
+        verify(mNotificationUpdater, times(2)).onDownstreamChanged(DOWNSTREAM_NONE);
+        verify(mNotificationUpdater, times(1)).onDownstreamChanged(eq(1 << TETHERING_WIFI));
+        verifyTetheringBroadcast(TEST_WLAN_IFNAME, EXTRA_AVAILABLE_TETHER);
+        // This is called, but will throw.
+        verify(mNetd, times(1)).ipfwdEnableForwarding(TETHERING_NAME);
+        // This never gets called because of the exception thrown above.
+        verify(mNetd, times(0)).tetherStartWithConfiguration(any());
+        // When the master state machine transitions to an error state it tells
+        // downstream interfaces, which causes us to tell Wi-Fi about the error
+        // so it can take down AP mode.
+        verify(mNetd, times(1)).tetherApplyDnsInterfaces();
+        verify(mNetd, times(1)).tetherInterfaceRemove(TEST_WLAN_IFNAME);
+        verify(mNetd, times(1)).networkRemoveInterface(INetd.LOCAL_NET_ID, TEST_WLAN_IFNAME);
+        verify(mWifiManager).updateInterfaceIpState(
+                TEST_WLAN_IFNAME, WifiManager.IFACE_IP_MODE_CONFIGURATION_ERROR);
+
+        verifyNoMoreInteractions(mWifiManager);
+        verifyNoMoreInteractions(mNetd);
+    }
+
+    private void runUserRestrictionsChange(
+            boolean currentDisallow, boolean nextDisallow, boolean isTetheringActive,
+            int expectedInteractionsWithShowNotification) throws  Exception {
+        final Bundle newRestrictions = new Bundle();
+        newRestrictions.putBoolean(UserManager.DISALLOW_CONFIG_TETHERING, nextDisallow);
+        final Tethering mockTethering = mock(Tethering.class);
+        when(mockTethering.isTetheringActive()).thenReturn(isTetheringActive);
+        when(mUserManager.getUserRestrictions()).thenReturn(newRestrictions);
+
+        final Tethering.UserRestrictionActionListener ural =
+                new Tethering.UserRestrictionActionListener(
+                        mUserManager, mockTethering, mNotificationUpdater);
+        ural.mDisallowTethering = currentDisallow;
+
+        ural.onUserRestrictionsChanged();
+
+        verify(mNotificationUpdater, times(expectedInteractionsWithShowNotification))
+                .notifyTetheringDisabledByRestriction();
+        verify(mockTethering, times(expectedInteractionsWithShowNotification)).untetherAll();
+    }
+
+    @Test
+    public void testDisallowTetheringWhenTetheringIsNotActive() throws Exception {
+        final boolean isTetheringActive = false;
+        final boolean currDisallow = false;
+        final boolean nextDisallow = true;
+        final int expectedInteractionsWithShowNotification = 0;
+
+        runUserRestrictionsChange(currDisallow, nextDisallow, isTetheringActive,
+                expectedInteractionsWithShowNotification);
+    }
+
+    @Test
+    public void testDisallowTetheringWhenTetheringIsActive() throws Exception {
+        final boolean isTetheringActive = true;
+        final boolean currDisallow = false;
+        final boolean nextDisallow = true;
+        final int expectedInteractionsWithShowNotification = 1;
+
+        runUserRestrictionsChange(currDisallow, nextDisallow, isTetheringActive,
+                expectedInteractionsWithShowNotification);
+    }
+
+    @Test
+    public void testAllowTetheringWhenTetheringIsNotActive() throws Exception {
+        final boolean isTetheringActive = false;
+        final boolean currDisallow = true;
+        final boolean nextDisallow = false;
+        final int expectedInteractionsWithShowNotification = 0;
+
+        runUserRestrictionsChange(currDisallow, nextDisallow, isTetheringActive,
+                expectedInteractionsWithShowNotification);
+    }
+
+    @Test
+    public void testAllowTetheringWhenTetheringIsActive() throws Exception {
+        final boolean isTetheringActive = true;
+        final boolean currDisallow = true;
+        final boolean nextDisallow = false;
+        final int expectedInteractionsWithShowNotification = 0;
+
+        runUserRestrictionsChange(currDisallow, nextDisallow, isTetheringActive,
+                expectedInteractionsWithShowNotification);
+    }
+
+    @Test
+    public void testDisallowTetheringUnchanged() throws Exception {
+        final boolean isTetheringActive = true;
+        final int expectedInteractionsWithShowNotification = 0;
+        boolean currDisallow = true;
+        boolean nextDisallow = true;
+
+        runUserRestrictionsChange(currDisallow, nextDisallow, isTetheringActive,
+                expectedInteractionsWithShowNotification);
+
+        currDisallow = false;
+        nextDisallow = false;
+
+        runUserRestrictionsChange(currDisallow, nextDisallow, isTetheringActive,
+                expectedInteractionsWithShowNotification);
+    }
+
+    private class TestTetheringEventCallback extends ITetheringEventCallback.Stub {
+        private final ArrayList<Network> mActualUpstreams = new ArrayList<>();
+        private final ArrayList<TetheringConfigurationParcel> mTetheringConfigs =
+                new ArrayList<>();
+        private final ArrayList<TetherStatesParcel> mTetherStates = new ArrayList<>();
+        private final ArrayList<Integer> mOffloadStatus = new ArrayList<>();
+
+        // This function will remove the recorded callbacks, so it must be called once for
+        // each callback. If this is called after multiple callback, the order matters.
+        // onCallbackCreated counts as the first call to expectUpstreamChanged with
+        // @see onCallbackCreated.
+        public void expectUpstreamChanged(Network... networks) {
+            if (networks == null) {
+                assertNoUpstreamChangeCallback();
+                return;
+            }
+
+            final ArrayList<Network> expectedUpstreams =
+                    new ArrayList<Network>(Arrays.asList(networks));
+            for (Network upstream : expectedUpstreams) {
+                // throws OOB if no expectations
+                assertEquals(mActualUpstreams.remove(0), upstream);
+            }
+            assertNoUpstreamChangeCallback();
+        }
+
+        // This function will remove the recorded callbacks, so it must be called once
+        // for each callback. If this is called after multiple callback, the order matters.
+        // onCallbackCreated counts as the first call to onConfigurationChanged with
+        // @see onCallbackCreated.
+        public void expectConfigurationChanged(TetheringConfigurationParcel... tetherConfigs) {
+            final ArrayList<TetheringConfigurationParcel> expectedTetherConfig =
+                    new ArrayList<TetheringConfigurationParcel>(Arrays.asList(tetherConfigs));
+            for (TetheringConfigurationParcel config : expectedTetherConfig) {
+                // throws OOB if no expectations
+                final TetheringConfigurationParcel actualConfig = mTetheringConfigs.remove(0);
+                assertTetherConfigParcelEqual(actualConfig, config);
+            }
+            assertNoConfigChangeCallback();
+        }
+
+        public void expectOffloadStatusChanged(final int expectedStatus) {
+            assertOffloadStatusChangedCallback();
+            assertEquals(mOffloadStatus.remove(0), new Integer(expectedStatus));
+        }
+
+        public TetherStatesParcel pollTetherStatesChanged() {
+            assertStateChangeCallback();
+            return mTetherStates.remove(0);
+        }
+
+        @Override
+        public void onUpstreamChanged(Network network) {
+            mActualUpstreams.add(network);
+        }
+
+        @Override
+        public void onConfigurationChanged(TetheringConfigurationParcel config) {
+            mTetheringConfigs.add(config);
+        }
+
+        @Override
+        public void onTetherStatesChanged(TetherStatesParcel states) {
+            mTetherStates.add(states);
+        }
+
+        @Override
+        public void onTetherClientsChanged(List<TetheredClient> clients) {
+            // TODO: check this
+        }
+
+        @Override
+        public void onOffloadStatusChanged(final int status) {
+            mOffloadStatus.add(status);
+        }
+
+        @Override
+        public void onCallbackStarted(TetheringCallbackStartedParcel parcel) {
+            mActualUpstreams.add(parcel.upstreamNetwork);
+            mTetheringConfigs.add(parcel.config);
+            mTetherStates.add(parcel.states);
+            mOffloadStatus.add(parcel.offloadStatus);
+        }
+
+        @Override
+        public void onCallbackStopped(int errorCode) { }
+
+        public void assertNoUpstreamChangeCallback() {
+            assertTrue(mActualUpstreams.isEmpty());
+        }
+
+        public void assertNoConfigChangeCallback() {
+            assertTrue(mTetheringConfigs.isEmpty());
+        }
+
+        public void assertNoStateChangeCallback() {
+            assertTrue(mTetherStates.isEmpty());
+        }
+
+        public void assertStateChangeCallback() {
+            assertFalse(mTetherStates.isEmpty());
+        }
+
+        public void assertOffloadStatusChangedCallback() {
+            assertFalse(mOffloadStatus.isEmpty());
+        }
+
+        public void assertNoCallback() {
+            assertNoUpstreamChangeCallback();
+            assertNoConfigChangeCallback();
+            assertNoStateChangeCallback();
+        }
+
+        private void assertTetherConfigParcelEqual(@NonNull TetheringConfigurationParcel actual,
+                @NonNull TetheringConfigurationParcel expect) {
+            assertEquals(actual.subId, expect.subId);
+            assertArrayEquals(actual.tetherableUsbRegexs, expect.tetherableUsbRegexs);
+            assertArrayEquals(actual.tetherableWifiRegexs, expect.tetherableWifiRegexs);
+            assertArrayEquals(actual.tetherableBluetoothRegexs, expect.tetherableBluetoothRegexs);
+            assertEquals(actual.isDunRequired, expect.isDunRequired);
+            assertEquals(actual.chooseUpstreamAutomatically, expect.chooseUpstreamAutomatically);
+            assertArrayEquals(actual.preferredUpstreamIfaceTypes,
+                    expect.preferredUpstreamIfaceTypes);
+            assertArrayEquals(actual.legacyDhcpRanges, expect.legacyDhcpRanges);
+            assertArrayEquals(actual.defaultIPv4DNS, expect.defaultIPv4DNS);
+            assertEquals(actual.enableLegacyDhcpServer, expect.enableLegacyDhcpServer);
+            assertArrayEquals(actual.provisioningApp, expect.provisioningApp);
+            assertEquals(actual.provisioningAppNoUi, expect.provisioningAppNoUi);
+            assertEquals(actual.provisioningCheckPeriod, expect.provisioningCheckPeriod);
+        }
+    }
+
+    private void assertTetherStatesNotNullButEmpty(final TetherStatesParcel parcel) {
+        assertFalse(parcel == null);
+        assertEquals(0, parcel.availableList.length);
+        assertEquals(0, parcel.tetheredList.length);
+        assertEquals(0, parcel.localOnlyList.length);
+        assertEquals(0, parcel.erroredIfaceList.length);
+        assertEquals(0, parcel.lastErrorList.length);
+        MiscAssertsKt.assertFieldCountEquals(5, TetherStatesParcel.class);
+    }
+
+    @Test
+    public void testRegisterTetheringEventCallback() throws Exception {
+        TestTetheringEventCallback callback = new TestTetheringEventCallback();
+        TestTetheringEventCallback callback2 = new TestTetheringEventCallback();
+
+        // 1. Register one callback before running any tethering.
+        mTethering.registerTetheringEventCallback(callback);
+        mLooper.dispatchAll();
+        callback.expectUpstreamChanged(new Network[] {null});
+        callback.expectConfigurationChanged(
+                mTethering.getTetheringConfiguration().toStableParcelable());
+        TetherStatesParcel tetherState = callback.pollTetherStatesChanged();
+        assertTetherStatesNotNullButEmpty(tetherState);
+        callback.expectOffloadStatusChanged(TETHER_HARDWARE_OFFLOAD_STOPPED);
+        // 2. Enable wifi tethering.
+        UpstreamNetworkState upstreamState = buildMobileDualStackUpstreamState();
+        when(mUpstreamNetworkMonitor.getCurrentPreferredUpstream()).thenReturn(upstreamState);
+        when(mUpstreamNetworkMonitor.selectPreferredUpstreamType(any()))
+                .thenReturn(upstreamState);
+        when(mWifiManager.startTetheredHotspot(any(SoftApConfiguration.class))).thenReturn(true);
+        mTethering.interfaceStatusChanged(TEST_WLAN_IFNAME, true);
+        mLooper.dispatchAll();
+        tetherState = callback.pollTetherStatesChanged();
+        assertArrayEquals(tetherState.availableList, new String[] {TEST_WLAN_IFNAME});
+
+        mTethering.startTethering(createTetheringRequestParcel(TETHERING_WIFI), null);
+        sendWifiApStateChanged(WIFI_AP_STATE_ENABLED, TEST_WLAN_IFNAME, IFACE_IP_MODE_TETHERED);
+        mLooper.dispatchAll();
+        tetherState = callback.pollTetherStatesChanged();
+        assertArrayEquals(tetherState.tetheredList, new String[] {TEST_WLAN_IFNAME});
+        callback.expectUpstreamChanged(upstreamState.network);
+        callback.expectOffloadStatusChanged(TETHER_HARDWARE_OFFLOAD_STARTED);
+
+        // 3. Register second callback.
+        mTethering.registerTetheringEventCallback(callback2);
+        mLooper.dispatchAll();
+        callback2.expectUpstreamChanged(upstreamState.network);
+        callback2.expectConfigurationChanged(
+                mTethering.getTetheringConfiguration().toStableParcelable());
+        tetherState = callback2.pollTetherStatesChanged();
+        assertEquals(tetherState.tetheredList, new String[] {TEST_WLAN_IFNAME});
+        callback2.expectOffloadStatusChanged(TETHER_HARDWARE_OFFLOAD_STARTED);
+
+        // 4. Unregister first callback and disable wifi tethering
+        mTethering.unregisterTetheringEventCallback(callback);
+        mLooper.dispatchAll();
+        mTethering.stopTethering(TETHERING_WIFI);
+        sendWifiApStateChanged(WifiManager.WIFI_AP_STATE_DISABLED);
+        mLooper.dispatchAll();
+        tetherState = callback2.pollTetherStatesChanged();
+        assertArrayEquals(tetherState.availableList, new String[] {TEST_WLAN_IFNAME});
+        mLooper.dispatchAll();
+        callback2.expectUpstreamChanged(new Network[] {null});
+        callback2.expectOffloadStatusChanged(TETHER_HARDWARE_OFFLOAD_STOPPED);
+        callback.assertNoCallback();
+    }
+
+    @Test
+    public void testReportFailCallbackIfOffloadNotSupported() throws Exception {
+        final UpstreamNetworkState upstreamState = buildMobileDualStackUpstreamState();
+        TestTetheringEventCallback callback = new TestTetheringEventCallback();
+        mTethering.registerTetheringEventCallback(callback);
+        mLooper.dispatchAll();
+        callback.expectOffloadStatusChanged(TETHER_HARDWARE_OFFLOAD_STOPPED);
+
+        // 1. Offload fail if no OffloadConfig.
+        initOffloadConfiguration(false /* offloadConfig */, true /* offloadControl */,
+                0 /* defaultDisabled */);
+        runUsbTethering(upstreamState);
+        callback.expectOffloadStatusChanged(TETHER_HARDWARE_OFFLOAD_FAILED);
+        runStopUSBTethering();
+        callback.expectOffloadStatusChanged(TETHER_HARDWARE_OFFLOAD_STOPPED);
+        reset(mUsbManager);
+        // 2. Offload fail if no OffloadControl.
+        initOffloadConfiguration(true /* offloadConfig */, false /* offloadControl */,
+                0 /* defaultDisabled */);
+        runUsbTethering(upstreamState);
+        callback.expectOffloadStatusChanged(TETHER_HARDWARE_OFFLOAD_FAILED);
+        runStopUSBTethering();
+        callback.expectOffloadStatusChanged(TETHER_HARDWARE_OFFLOAD_STOPPED);
+        reset(mUsbManager);
+        // 3. Offload fail if disabled by settings.
+        initOffloadConfiguration(true /* offloadConfig */, true /* offloadControl */,
+                1 /* defaultDisabled */);
+        runUsbTethering(upstreamState);
+        callback.expectOffloadStatusChanged(TETHER_HARDWARE_OFFLOAD_FAILED);
+        runStopUSBTethering();
+        callback.expectOffloadStatusChanged(TETHER_HARDWARE_OFFLOAD_STOPPED);
+    }
+
+    private void runStopUSBTethering() {
+        mTethering.stopTethering(TETHERING_USB);
+        mLooper.dispatchAll();
+        mTethering.interfaceRemoved(TEST_USB_IFNAME);
+        mLooper.dispatchAll();
+    }
+
+    private void initOffloadConfiguration(final boolean offloadConfig,
+            final boolean offloadControl, final int defaultDisabled) {
+        when(mOffloadHardwareInterface.initOffloadConfig()).thenReturn(offloadConfig);
+        when(mOffloadHardwareInterface.initOffloadControl(any())).thenReturn(offloadControl);
+        when(mOffloadHardwareInterface.getDefaultTetherOffloadDisabled()).thenReturn(
+                defaultDisabled);
+    }
+
+    @Test
+    public void testMultiSimAware() throws Exception {
+        final TetheringConfiguration initailConfig = mTethering.getTetheringConfiguration();
+        assertEquals(INVALID_SUBSCRIPTION_ID, initailConfig.activeDataSubId);
+
+        final int fakeSubId = 1234;
+        mPhoneStateListener.onActiveDataSubscriptionIdChanged(fakeSubId);
+        final TetheringConfiguration newConfig = mTethering.getTetheringConfiguration();
+        assertEquals(fakeSubId, newConfig.activeDataSubId);
+        verify(mNotificationUpdater, times(1)).onActiveDataSubscriptionIdChanged(eq(fakeSubId));
+    }
+
+    @Test
+    public void testNoDuplicatedEthernetRequest() throws Exception {
+        final TetheredInterfaceRequest mockRequest = mock(TetheredInterfaceRequest.class);
+        when(mEm.requestTetheredInterface(any(), any())).thenReturn(mockRequest);
+        mTethering.startTethering(createTetheringRequestParcel(TETHERING_ETHERNET), null);
+        mLooper.dispatchAll();
+        verify(mEm, times(1)).requestTetheredInterface(any(), any());
+        mTethering.startTethering(createTetheringRequestParcel(TETHERING_ETHERNET), null);
+        mLooper.dispatchAll();
+        verifyNoMoreInteractions(mEm);
+        mTethering.stopTethering(TETHERING_ETHERNET);
+        mLooper.dispatchAll();
+        verify(mockRequest, times(1)).release();
+        mTethering.stopTethering(TETHERING_ETHERNET);
+        mLooper.dispatchAll();
+        verifyNoMoreInteractions(mEm);
+    }
+
+    private void workingWifiP2pGroupOwner(
+            boolean emulateInterfaceStatusChanged) throws Exception {
+        if (emulateInterfaceStatusChanged) {
+            mTethering.interfaceStatusChanged(TEST_P2P_IFNAME, true);
+        }
+        sendWifiP2pConnectionChanged(true, true, TEST_P2P_IFNAME);
+        mLooper.dispatchAll();
+
+        verifyInterfaceServingModeStarted(TEST_P2P_IFNAME);
+        verifyTetheringBroadcast(TEST_P2P_IFNAME, EXTRA_AVAILABLE_TETHER);
+        verify(mNetd, times(1)).ipfwdEnableForwarding(TETHERING_NAME);
+        verify(mNetd, times(1)).tetherStartWithConfiguration(any());
+        verifyNoMoreInteractions(mNetd);
+        verifyTetheringBroadcast(TEST_P2P_IFNAME, EXTRA_ACTIVE_LOCAL_ONLY);
+        verify(mUpstreamNetworkMonitor, times(1)).startObserveAllNetworks();
+        // There are 2 IpServer state change events: STATE_AVAILABLE -> STATE_LOCAL_ONLY
+        verify(mNotificationUpdater, times(2)).onDownstreamChanged(DOWNSTREAM_NONE);
+
+        assertEquals(TETHER_ERROR_NO_ERROR, mTethering.getLastTetherError(TEST_P2P_IFNAME));
+
+        // Emulate externally-visible WifiP2pManager effects, when wifi p2p group
+        // is being removed.
+        sendWifiP2pConnectionChanged(false, true, TEST_P2P_IFNAME);
+        mTethering.interfaceRemoved(TEST_P2P_IFNAME);
+        mLooper.dispatchAll();
+
+        verify(mNetd, times(1)).tetherApplyDnsInterfaces();
+        verify(mNetd, times(1)).tetherInterfaceRemove(TEST_P2P_IFNAME);
+        verify(mNetd, times(1)).networkRemoveInterface(INetd.LOCAL_NET_ID, TEST_P2P_IFNAME);
+        // interfaceSetCfg() called once for enabling and twice for disabling IPv4.
+        verify(mNetd, times(3)).interfaceSetCfg(any(InterfaceConfigurationParcel.class));
+        verify(mNetd, times(1)).tetherStop();
+        verify(mNetd, times(1)).ipfwdDisableForwarding(TETHERING_NAME);
+        verify(mUpstreamNetworkMonitor, never()).getCurrentPreferredUpstream();
+        verify(mUpstreamNetworkMonitor, never()).selectPreferredUpstreamType(any());
+        verifyNoMoreInteractions(mNetd);
+        // Asking for the last error after the per-interface state machine
+        // has been reaped yields an unknown interface error.
+        assertEquals(TETHER_ERROR_UNKNOWN_IFACE, mTethering.getLastTetherError(TEST_P2P_IFNAME));
+    }
+
+    private void workingWifiP2pGroupClient(
+            boolean emulateInterfaceStatusChanged) throws Exception {
+        if (emulateInterfaceStatusChanged) {
+            mTethering.interfaceStatusChanged(TEST_P2P_IFNAME, true);
+        }
+        sendWifiP2pConnectionChanged(true, false, TEST_P2P_IFNAME);
+        mLooper.dispatchAll();
+
+        verify(mNetd, never()).interfaceSetCfg(any(InterfaceConfigurationParcel.class));
+        verify(mNetd, never()).tetherInterfaceAdd(TEST_P2P_IFNAME);
+        verify(mNetd, never()).networkAddInterface(INetd.LOCAL_NET_ID, TEST_P2P_IFNAME);
+        verify(mNetd, never()).ipfwdEnableForwarding(TETHERING_NAME);
+        verify(mNetd, never()).tetherStartWithConfiguration(any());
+
+        // Emulate externally-visible WifiP2pManager effects, when wifi p2p group
+        // is being removed.
+        sendWifiP2pConnectionChanged(false, false, TEST_P2P_IFNAME);
+        mTethering.interfaceRemoved(TEST_P2P_IFNAME);
+        mLooper.dispatchAll();
+
+        verify(mNetd, never()).tetherApplyDnsInterfaces();
+        verify(mNetd, never()).tetherInterfaceRemove(TEST_P2P_IFNAME);
+        verify(mNetd, never()).networkRemoveInterface(INetd.LOCAL_NET_ID, TEST_P2P_IFNAME);
+        verify(mNetd, never()).interfaceSetCfg(any(InterfaceConfigurationParcel.class));
+        verify(mNetd, never()).tetherStop();
+        verify(mNetd, never()).ipfwdDisableForwarding(TETHERING_NAME);
+        verifyNoMoreInteractions(mNetd);
+        // Asking for the last error after the per-interface state machine
+        // has been reaped yields an unknown interface error.
+        assertEquals(TETHER_ERROR_UNKNOWN_IFACE, mTethering.getLastTetherError(TEST_P2P_IFNAME));
+    }
+
+    @Test
+    public void workingWifiP2pGroupOwnerWithIfaceChanged() throws Exception {
+        workingWifiP2pGroupOwner(true);
+    }
+
+    @Test
+    public void workingWifiP2pGroupOwnerSansIfaceChanged() throws Exception {
+        workingWifiP2pGroupOwner(false);
+    }
+
+    private void workingWifiP2pGroupOwnerLegacyMode(
+            boolean emulateInterfaceStatusChanged) throws Exception {
+        // change to legacy mode and update tethering information by chaning SIM
+        when(mResources.getStringArray(R.array.config_tether_wifi_p2p_regexs))
+                .thenReturn(new String[]{});
+        final int fakeSubId = 1234;
+        mPhoneStateListener.onActiveDataSubscriptionIdChanged(fakeSubId);
+
+        if (emulateInterfaceStatusChanged) {
+            mTethering.interfaceStatusChanged(TEST_P2P_IFNAME, true);
+        }
+        sendWifiP2pConnectionChanged(true, true, TEST_P2P_IFNAME);
+        mLooper.dispatchAll();
+
+        verify(mNetd, never()).interfaceSetCfg(any(InterfaceConfigurationParcel.class));
+        verify(mNetd, never()).tetherInterfaceAdd(TEST_P2P_IFNAME);
+        verify(mNetd, never()).networkAddInterface(INetd.LOCAL_NET_ID, TEST_P2P_IFNAME);
+        verify(mNetd, never()).ipfwdEnableForwarding(TETHERING_NAME);
+        verify(mNetd, never()).tetherStartWithConfiguration(any());
+        assertEquals(TETHER_ERROR_UNKNOWN_IFACE, mTethering.getLastTetherError(TEST_P2P_IFNAME));
+    }
+    @Test
+    public void workingWifiP2pGroupOwnerLegacyModeWithIfaceChanged() throws Exception {
+        workingWifiP2pGroupOwnerLegacyMode(true);
+    }
+
+    @Test
+    public void workingWifiP2pGroupOwnerLegacyModeSansIfaceChanged() throws Exception {
+        workingWifiP2pGroupOwnerLegacyMode(false);
+    }
+
+    @Test
+    public void workingWifiP2pGroupClientWithIfaceChanged() throws Exception {
+        workingWifiP2pGroupClient(true);
+    }
+
+    @Test
+    public void workingWifiP2pGroupClientSansIfaceChanged() throws Exception {
+        workingWifiP2pGroupClient(false);
+    }
+
+    private void setDataSaverEnabled(boolean enabled) {
+        final Intent intent = new Intent(ACTION_RESTRICT_BACKGROUND_CHANGED);
+        mServiceContext.sendBroadcastAsUser(intent, UserHandle.ALL);
+
+        final int status = enabled ? RESTRICT_BACKGROUND_STATUS_ENABLED
+                : RESTRICT_BACKGROUND_STATUS_DISABLED;
+        when(mCm.getRestrictBackgroundStatus()).thenReturn(status);
+        mLooper.dispatchAll();
+    }
+
+    @Test
+    public void testDataSaverChanged() {
+        // Start Tethering.
+        final UpstreamNetworkState upstreamState = buildMobileIPv4UpstreamState();
+        runUsbTethering(upstreamState);
+        assertContains(Arrays.asList(mTethering.getTetheredIfaces()), TEST_USB_IFNAME);
+        // Data saver is ON.
+        setDataSaverEnabled(true);
+        // Verify that tethering should be disabled.
+        verify(mUsbManager, times(1)).setCurrentFunctions(UsbManager.FUNCTION_NONE);
+        mTethering.interfaceRemoved(TEST_USB_IFNAME);
+        mLooper.dispatchAll();
+        assertEquals(mTethering.getTetheredIfaces(), new String[0]);
+        reset(mUsbManager);
+
+        runUsbTethering(upstreamState);
+        // Verify that user can start tethering again without turning OFF data saver.
+        assertContains(Arrays.asList(mTethering.getTetheredIfaces()), TEST_USB_IFNAME);
+
+        // If data saver is keep ON with change event, tethering should not be OFF this time.
+        setDataSaverEnabled(true);
+        verify(mUsbManager, times(0)).setCurrentFunctions(UsbManager.FUNCTION_NONE);
+        assertContains(Arrays.asList(mTethering.getTetheredIfaces()), TEST_USB_IFNAME);
+
+        // If data saver is turned OFF, it should not change tethering.
+        setDataSaverEnabled(false);
+        verify(mUsbManager, times(0)).setCurrentFunctions(UsbManager.FUNCTION_NONE);
+        assertContains(Arrays.asList(mTethering.getTetheredIfaces()), TEST_USB_IFNAME);
+    }
+
+    private static <T> void assertContains(Collection<T> collection, T element) {
+        assertTrue(element + " not found in " + collection, collection.contains(element));
+    }
+
+    private class ResultListener extends IIntResultListener.Stub {
+        private final int mExpectedResult;
+        private boolean mHasResult = false;
+        ResultListener(final int expectedResult) {
+            mExpectedResult = expectedResult;
+        }
+
+        @Override
+        public void onResult(final int resultCode) {
+            mHasResult = true;
+            if (resultCode != mExpectedResult) {
+                fail("expected result: " + mExpectedResult + " but actual result: " + resultCode);
+            }
+        }
+
+        public void assertHasResult() {
+            if (!mHasResult) fail("No callback result");
+        }
+    }
+
+    @Test
+    public void testMultipleStartTethering() throws Exception {
+        final LinkAddress serverLinkAddr = new LinkAddress("192.168.20.1/24");
+        final LinkAddress clientLinkAddr = new LinkAddress("192.168.20.42/24");
+        final String serverAddr = "192.168.20.1";
+        final ResultListener firstResult = new ResultListener(TETHER_ERROR_NO_ERROR);
+        final ResultListener secondResult = new ResultListener(TETHER_ERROR_NO_ERROR);
+        final ResultListener thirdResult = new ResultListener(TETHER_ERROR_NO_ERROR);
+
+        // Enable USB tethering and check that Tethering starts USB.
+        mTethering.startTethering(createTetheringRequestParcel(TETHERING_USB,
+                  null, null), firstResult);
+        mLooper.dispatchAll();
+        firstResult.assertHasResult();
+        verify(mUsbManager, times(1)).setCurrentFunctions(UsbManager.FUNCTION_RNDIS);
+        verifyNoMoreInteractions(mUsbManager);
+
+        // Enable USB tethering again with the same request and expect no change to USB.
+        mTethering.startTethering(createTetheringRequestParcel(TETHERING_USB,
+                  null, null), secondResult);
+        mLooper.dispatchAll();
+        secondResult.assertHasResult();
+        verify(mUsbManager, never()).setCurrentFunctions(UsbManager.FUNCTION_NONE);
+        reset(mUsbManager);
+
+        // Enable USB tethering with a different request and expect that USB is stopped and
+        // started.
+        mTethering.startTethering(createTetheringRequestParcel(TETHERING_USB,
+                  serverLinkAddr, clientLinkAddr), thirdResult);
+        mLooper.dispatchAll();
+        thirdResult.assertHasResult();
+        verify(mUsbManager, times(1)).setCurrentFunctions(UsbManager.FUNCTION_NONE);
+        verify(mUsbManager, times(1)).setCurrentFunctions(UsbManager.FUNCTION_RNDIS);
+
+        // Expect that when USB comes up, the DHCP server is configured with the requested address.
+        mTethering.interfaceStatusChanged(TEST_USB_IFNAME, true);
+        sendUsbBroadcast(true, true, true, TETHERING_USB);
+        mLooper.dispatchAll();
+        verify(mDhcpServer, timeout(DHCPSERVER_START_TIMEOUT_MS).times(1)).startWithCallbacks(
+                any(), any());
+        verify(mNetd).interfaceSetCfg(argThat(cfg -> serverAddr.equals(cfg.ipv4Addr)));
+    }
+
+    @Test
+    public void testRequestStaticIp() throws Exception {
+        final LinkAddress serverLinkAddr = new LinkAddress("192.168.0.123/24");
+        final LinkAddress clientLinkAddr = new LinkAddress("192.168.0.42/24");
+        final String serverAddr = "192.168.0.123";
+        final int clientAddrParceled = 0xc0a8002a;
+        final ArgumentCaptor<DhcpServingParamsParcel> dhcpParamsCaptor =
+                ArgumentCaptor.forClass(DhcpServingParamsParcel.class);
+        mTethering.startTethering(createTetheringRequestParcel(TETHERING_USB,
+                  serverLinkAddr, clientLinkAddr), null);
+        mLooper.dispatchAll();
+        verify(mUsbManager, times(1)).setCurrentFunctions(UsbManager.FUNCTION_RNDIS);
+        mTethering.interfaceStatusChanged(TEST_USB_IFNAME, true);
+        sendUsbBroadcast(true, true, true, TETHERING_USB);
+        mLooper.dispatchAll();
+        verify(mNetd).interfaceSetCfg(argThat(cfg -> serverAddr.equals(cfg.ipv4Addr)));
+        verify(mIpServerDependencies, times(1)).makeDhcpServer(any(), dhcpParamsCaptor.capture(),
+                any());
+        final DhcpServingParamsParcel params = dhcpParamsCaptor.getValue();
+        assertEquals(serverAddr, intToInet4AddressHTH(params.serverAddr).getHostAddress());
+        assertEquals(24, params.serverAddrPrefixLength);
+        assertEquals(clientAddrParceled, params.clientAddr);
+    }
+
+    @Test
+    public void testUpstreamNetworkChanged() {
+        final Tethering.TetherMasterSM stateMachine = (Tethering.TetherMasterSM)
+                mTetheringDependencies.mUpstreamNetworkMonitorMasterSM;
+        final UpstreamNetworkState upstreamState = buildMobileIPv4UpstreamState();
+        when(mUpstreamNetworkMonitor.selectPreferredUpstreamType(any())).thenReturn(upstreamState);
+        stateMachine.chooseUpstreamType(true);
+
+        verify(mUpstreamNetworkMonitor, times(1)).setCurrentUpstream(eq(upstreamState.network));
+        verify(mNotificationUpdater, times(1)).onUpstreamCapabilitiesChanged(any());
+    }
+
+    @Test
+    public void testUpstreamCapabilitiesChanged() {
+        final Tethering.TetherMasterSM stateMachine = (Tethering.TetherMasterSM)
+                mTetheringDependencies.mUpstreamNetworkMonitorMasterSM;
+        final UpstreamNetworkState upstreamState = buildMobileIPv4UpstreamState();
+        when(mUpstreamNetworkMonitor.selectPreferredUpstreamType(any())).thenReturn(upstreamState);
+        stateMachine.chooseUpstreamType(true);
+
+        stateMachine.handleUpstreamNetworkMonitorCallback(EVENT_ON_CAPABILITIES, upstreamState);
+        // Should have two onUpstreamCapabilitiesChanged().
+        // One is called by reportUpstreamChanged(). One is called by EVENT_ON_CAPABILITIES.
+        verify(mNotificationUpdater, times(2)).onUpstreamCapabilitiesChanged(any());
+        reset(mNotificationUpdater);
+
+        // Verify that onUpstreamCapabilitiesChanged won't be called if not current upstream network
+        // capabilities changed.
+        final UpstreamNetworkState upstreamState2 = new UpstreamNetworkState(
+                upstreamState.linkProperties, upstreamState.networkCapabilities, new Network(101));
+        stateMachine.handleUpstreamNetworkMonitorCallback(EVENT_ON_CAPABILITIES, upstreamState2);
+        verify(mNotificationUpdater, never()).onUpstreamCapabilitiesChanged(any());
+    }
+
+    // TODO: Test that a request for hotspot mode doesn't interfere with an
+    // already operating tethering mode interface.
+}
diff --git a/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/UpstreamNetworkMonitorTest.java b/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/UpstreamNetworkMonitorTest.java
new file mode 100644
index 0000000..232588c7
--- /dev/null
+++ b/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/UpstreamNetworkMonitorTest.java
@@ -0,0 +1,800 @@
+/*
+ * Copyright (C) 2017 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.networkstack.tethering;
+
+import static android.net.ConnectivityManager.TYPE_MOBILE_DUN;
+import static android.net.ConnectivityManager.TYPE_MOBILE_HIPRI;
+import static android.net.ConnectivityManager.TYPE_WIFI;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_DUN;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET;
+import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
+import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
+
+import static com.android.networkstack.tethering.UpstreamNetworkMonitor.TYPE_NONE;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.anyInt;
+import static org.mockito.Mockito.anyString;
+import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.net.ConnectivityManager;
+import android.net.ConnectivityManager.NetworkCallback;
+import android.net.IConnectivityManager;
+import android.net.IpPrefix;
+import android.net.LinkAddress;
+import android.net.LinkProperties;
+import android.net.Network;
+import android.net.NetworkCapabilities;
+import android.net.NetworkRequest;
+import android.net.util.SharedLog;
+import android.os.Handler;
+import android.os.Message;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import com.android.internal.util.State;
+import com.android.internal.util.StateMachine;
+
+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.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class UpstreamNetworkMonitorTest {
+    private static final int EVENT_UNM_UPDATE = 1;
+
+    private static final boolean INCLUDES = true;
+    private static final boolean EXCLUDES = false;
+
+    // Actual contents of the request don't matter for this test. The lack of
+    // any specific TRANSPORT_* is sufficient to identify this request.
+    private static final NetworkRequest sDefaultRequest = new NetworkRequest.Builder().build();
+
+    @Mock private Context mContext;
+    @Mock private EntitlementManager mEntitleMgr;
+    @Mock private IConnectivityManager mCS;
+    @Mock private SharedLog mLog;
+
+    private TestStateMachine mSM;
+    private TestConnectivityManager mCM;
+    private UpstreamNetworkMonitor mUNM;
+
+    @Before public void setUp() throws Exception {
+        MockitoAnnotations.initMocks(this);
+        reset(mContext);
+        reset(mCS);
+        reset(mLog);
+        when(mLog.forSubComponent(anyString())).thenReturn(mLog);
+        when(mEntitleMgr.isCellularUpstreamPermitted()).thenReturn(true);
+
+        mCM = spy(new TestConnectivityManager(mContext, mCS));
+        mSM = new TestStateMachine();
+        mUNM = new UpstreamNetworkMonitor(
+                (ConnectivityManager) mCM, mSM, mLog, EVENT_UNM_UPDATE);
+    }
+
+    @After public void tearDown() throws Exception {
+        if (mSM != null) {
+            mSM.quit();
+            mSM = null;
+        }
+    }
+
+    @Test
+    public void testStopWithoutStartIsNonFatal() {
+        mUNM.stop();
+        mUNM.stop();
+        mUNM.stop();
+    }
+
+    @Test
+    public void testDoesNothingBeforeTrackDefaultAndStarted() throws Exception {
+        assertTrue(mCM.hasNoCallbacks());
+        assertFalse(mUNM.mobileNetworkRequested());
+
+        mUNM.updateMobileRequiresDun(true);
+        assertTrue(mCM.hasNoCallbacks());
+        mUNM.updateMobileRequiresDun(false);
+        assertTrue(mCM.hasNoCallbacks());
+    }
+
+    @Test
+    public void testDefaultNetworkIsTracked() throws Exception {
+        assertTrue(mCM.hasNoCallbacks());
+        mUNM.startTrackDefaultNetwork(sDefaultRequest, mEntitleMgr);
+
+        mUNM.startObserveAllNetworks();
+        assertEquals(1, mCM.trackingDefault.size());
+
+        mUNM.stop();
+        assertTrue(mCM.onlyHasDefaultCallbacks());
+    }
+
+    @Test
+    public void testListensForAllNetworks() throws Exception {
+        assertTrue(mCM.listening.isEmpty());
+
+        mUNM.startTrackDefaultNetwork(sDefaultRequest, mEntitleMgr);
+        mUNM.startObserveAllNetworks();
+        assertFalse(mCM.listening.isEmpty());
+        assertTrue(mCM.isListeningForAll());
+
+        mUNM.stop();
+        assertTrue(mCM.onlyHasDefaultCallbacks());
+    }
+
+    @Test
+    public void testCallbacksRegistered() {
+        mUNM.startTrackDefaultNetwork(sDefaultRequest, mEntitleMgr);
+        verify(mCM, times(1)).requestNetwork(
+                eq(sDefaultRequest), any(NetworkCallback.class), any(Handler.class));
+        mUNM.startObserveAllNetworks();
+        verify(mCM, times(1)).registerNetworkCallback(
+                any(NetworkRequest.class), any(NetworkCallback.class), any(Handler.class));
+
+        mUNM.stop();
+        verify(mCM, times(1)).unregisterNetworkCallback(any(NetworkCallback.class));
+    }
+
+    @Test
+    public void testRequestsMobileNetwork() throws Exception {
+        assertFalse(mUNM.mobileNetworkRequested());
+        assertEquals(0, mCM.requested.size());
+
+        mUNM.startObserveAllNetworks();
+        assertFalse(mUNM.mobileNetworkRequested());
+        assertEquals(0, mCM.requested.size());
+
+        mUNM.updateMobileRequiresDun(false);
+        assertFalse(mUNM.mobileNetworkRequested());
+        assertEquals(0, mCM.requested.size());
+
+        mUNM.registerMobileNetworkRequest();
+        assertTrue(mUNM.mobileNetworkRequested());
+        assertUpstreamTypeRequested(TYPE_MOBILE_HIPRI);
+        assertFalse(isDunRequested());
+
+        mUNM.stop();
+        assertFalse(mUNM.mobileNetworkRequested());
+        assertTrue(mCM.hasNoCallbacks());
+    }
+
+    @Test
+    public void testDuplicateMobileRequestsIgnored() throws Exception {
+        assertFalse(mUNM.mobileNetworkRequested());
+        assertEquals(0, mCM.requested.size());
+
+        mUNM.startObserveAllNetworks();
+        verify(mCM, times(1)).registerNetworkCallback(
+                any(NetworkRequest.class), any(NetworkCallback.class), any(Handler.class));
+        assertFalse(mUNM.mobileNetworkRequested());
+        assertEquals(0, mCM.requested.size());
+
+        mUNM.updateMobileRequiresDun(true);
+        mUNM.registerMobileNetworkRequest();
+        verify(mCM, times(1)).requestNetwork(
+                any(NetworkRequest.class), anyInt(), anyInt(), any(Handler.class),
+                any(NetworkCallback.class));
+
+        assertTrue(mUNM.mobileNetworkRequested());
+        assertUpstreamTypeRequested(TYPE_MOBILE_DUN);
+        assertTrue(isDunRequested());
+
+        // Try a few things that must not result in any state change.
+        mUNM.registerMobileNetworkRequest();
+        mUNM.updateMobileRequiresDun(true);
+        mUNM.registerMobileNetworkRequest();
+
+        assertTrue(mUNM.mobileNetworkRequested());
+        assertUpstreamTypeRequested(TYPE_MOBILE_DUN);
+        assertTrue(isDunRequested());
+
+        mUNM.stop();
+        verify(mCM, times(2)).unregisterNetworkCallback(any(NetworkCallback.class));
+
+        verifyNoMoreInteractions(mCM);
+    }
+
+    @Test
+    public void testRequestsDunNetwork() throws Exception {
+        assertFalse(mUNM.mobileNetworkRequested());
+        assertEquals(0, mCM.requested.size());
+
+        mUNM.startObserveAllNetworks();
+        assertFalse(mUNM.mobileNetworkRequested());
+        assertEquals(0, mCM.requested.size());
+
+        mUNM.updateMobileRequiresDun(true);
+        assertFalse(mUNM.mobileNetworkRequested());
+        assertEquals(0, mCM.requested.size());
+
+        mUNM.registerMobileNetworkRequest();
+        assertTrue(mUNM.mobileNetworkRequested());
+        assertUpstreamTypeRequested(TYPE_MOBILE_DUN);
+        assertTrue(isDunRequested());
+
+        mUNM.stop();
+        assertFalse(mUNM.mobileNetworkRequested());
+        assertTrue(mCM.hasNoCallbacks());
+    }
+
+    @Test
+    public void testUpdateMobileRequiresDun() throws Exception {
+        mUNM.startObserveAllNetworks();
+
+        // Test going from no-DUN to DUN correctly re-registers callbacks.
+        mUNM.updateMobileRequiresDun(false);
+        mUNM.registerMobileNetworkRequest();
+        assertTrue(mUNM.mobileNetworkRequested());
+        assertUpstreamTypeRequested(TYPE_MOBILE_HIPRI);
+        assertFalse(isDunRequested());
+        mUNM.updateMobileRequiresDun(true);
+        assertTrue(mUNM.mobileNetworkRequested());
+        assertUpstreamTypeRequested(TYPE_MOBILE_DUN);
+        assertTrue(isDunRequested());
+
+        // Test going from DUN to no-DUN correctly re-registers callbacks.
+        mUNM.updateMobileRequiresDun(false);
+        assertTrue(mUNM.mobileNetworkRequested());
+        assertUpstreamTypeRequested(TYPE_MOBILE_HIPRI);
+        assertFalse(isDunRequested());
+
+        mUNM.stop();
+        assertFalse(mUNM.mobileNetworkRequested());
+    }
+
+    @Test
+    public void testSelectPreferredUpstreamType() throws Exception {
+        final Collection<Integer> preferredTypes = new ArrayList<>();
+        preferredTypes.add(TYPE_WIFI);
+
+        mUNM.startTrackDefaultNetwork(sDefaultRequest, mEntitleMgr);
+        mUNM.startObserveAllNetworks();
+        // There are no networks, so there is nothing to select.
+        assertSatisfiesLegacyType(TYPE_NONE, mUNM.selectPreferredUpstreamType(preferredTypes));
+
+        final TestNetworkAgent wifiAgent = new TestNetworkAgent(mCM, TRANSPORT_WIFI);
+        wifiAgent.fakeConnect();
+        // WiFi is up, we should prefer it.
+        assertSatisfiesLegacyType(TYPE_WIFI, mUNM.selectPreferredUpstreamType(preferredTypes));
+        wifiAgent.fakeDisconnect();
+        // There are no networks, so there is nothing to select.
+        assertSatisfiesLegacyType(TYPE_NONE, mUNM.selectPreferredUpstreamType(preferredTypes));
+
+        final TestNetworkAgent cellAgent = new TestNetworkAgent(mCM, TRANSPORT_CELLULAR);
+        cellAgent.fakeConnect();
+        assertSatisfiesLegacyType(TYPE_NONE, mUNM.selectPreferredUpstreamType(preferredTypes));
+
+        preferredTypes.add(TYPE_MOBILE_DUN);
+        // This is coupled with preferred types in TetheringConfiguration.
+        mUNM.updateMobileRequiresDun(true);
+        // DUN is available, but only use regular cell: no upstream selected.
+        assertSatisfiesLegacyType(TYPE_NONE, mUNM.selectPreferredUpstreamType(preferredTypes));
+        preferredTypes.remove(TYPE_MOBILE_DUN);
+        // No WiFi, but our preferred flavour of cell is up.
+        preferredTypes.add(TYPE_MOBILE_HIPRI);
+        // This is coupled with preferred types in TetheringConfiguration.
+        mUNM.updateMobileRequiresDun(false);
+        assertSatisfiesLegacyType(TYPE_MOBILE_HIPRI,
+                mUNM.selectPreferredUpstreamType(preferredTypes));
+        // Check to see we filed an explicit request.
+        assertEquals(1, mCM.requested.size());
+        NetworkRequest netReq = (NetworkRequest) mCM.requested.values().toArray()[0];
+        assertTrue(netReq.networkCapabilities.hasTransport(TRANSPORT_CELLULAR));
+        assertFalse(netReq.networkCapabilities.hasCapability(NET_CAPABILITY_DUN));
+        // mobile is not permitted, we should not use HIPRI.
+        when(mEntitleMgr.isCellularUpstreamPermitted()).thenReturn(false);
+        assertSatisfiesLegacyType(TYPE_NONE, mUNM.selectPreferredUpstreamType(preferredTypes));
+        assertEquals(0, mCM.requested.size());
+        // mobile change back to permitted, HIRPI should come back
+        when(mEntitleMgr.isCellularUpstreamPermitted()).thenReturn(true);
+        assertSatisfiesLegacyType(TYPE_MOBILE_HIPRI,
+                mUNM.selectPreferredUpstreamType(preferredTypes));
+
+        wifiAgent.fakeConnect();
+        // WiFi is up, and we should prefer it over cell.
+        assertSatisfiesLegacyType(TYPE_WIFI, mUNM.selectPreferredUpstreamType(preferredTypes));
+        assertEquals(0, mCM.requested.size());
+
+        preferredTypes.remove(TYPE_MOBILE_HIPRI);
+        preferredTypes.add(TYPE_MOBILE_DUN);
+        // This is coupled with preferred types in TetheringConfiguration.
+        mUNM.updateMobileRequiresDun(true);
+        assertSatisfiesLegacyType(TYPE_WIFI, mUNM.selectPreferredUpstreamType(preferredTypes));
+
+        final TestNetworkAgent dunAgent = new TestNetworkAgent(mCM, TRANSPORT_CELLULAR);
+        dunAgent.networkCapabilities.addCapability(NET_CAPABILITY_DUN);
+        dunAgent.fakeConnect();
+
+        // WiFi is still preferred.
+        assertSatisfiesLegacyType(TYPE_WIFI, mUNM.selectPreferredUpstreamType(preferredTypes));
+
+        // WiFi goes down, cell and DUN are still up but only DUN is preferred.
+        wifiAgent.fakeDisconnect();
+        assertSatisfiesLegacyType(TYPE_MOBILE_DUN,
+                mUNM.selectPreferredUpstreamType(preferredTypes));
+        // Check to see we filed an explicit request.
+        assertEquals(1, mCM.requested.size());
+        netReq = (NetworkRequest) mCM.requested.values().toArray()[0];
+        assertTrue(netReq.networkCapabilities.hasTransport(TRANSPORT_CELLULAR));
+        assertTrue(netReq.networkCapabilities.hasCapability(NET_CAPABILITY_DUN));
+        // mobile is not permitted, we should not use DUN.
+        when(mEntitleMgr.isCellularUpstreamPermitted()).thenReturn(false);
+        assertSatisfiesLegacyType(TYPE_NONE, mUNM.selectPreferredUpstreamType(preferredTypes));
+        assertEquals(0, mCM.requested.size());
+        // mobile change back to permitted, DUN should come back
+        when(mEntitleMgr.isCellularUpstreamPermitted()).thenReturn(true);
+        assertSatisfiesLegacyType(TYPE_MOBILE_DUN,
+                mUNM.selectPreferredUpstreamType(preferredTypes));
+    }
+
+    @Test
+    public void testGetCurrentPreferredUpstream() throws Exception {
+        mUNM.startTrackDefaultNetwork(sDefaultRequest, mEntitleMgr);
+        mUNM.startObserveAllNetworks();
+        mUNM.updateMobileRequiresDun(false);
+
+        // [0] Mobile connects, DUN not required -> mobile selected.
+        final TestNetworkAgent cellAgent = new TestNetworkAgent(mCM, TRANSPORT_CELLULAR);
+        cellAgent.fakeConnect();
+        mCM.makeDefaultNetwork(cellAgent);
+        assertEquals(cellAgent.networkId, mUNM.getCurrentPreferredUpstream().network);
+
+        // [1] Mobile connects but not permitted -> null selected
+        when(mEntitleMgr.isCellularUpstreamPermitted()).thenReturn(false);
+        assertEquals(null, mUNM.getCurrentPreferredUpstream());
+        when(mEntitleMgr.isCellularUpstreamPermitted()).thenReturn(true);
+
+        // [2] WiFi connects but not validated/promoted to default -> mobile selected.
+        final TestNetworkAgent wifiAgent = new TestNetworkAgent(mCM, TRANSPORT_WIFI);
+        wifiAgent.fakeConnect();
+        assertEquals(cellAgent.networkId, mUNM.getCurrentPreferredUpstream().network);
+
+        // [3] WiFi validates and is promoted to the default network -> WiFi selected.
+        mCM.makeDefaultNetwork(wifiAgent);
+        assertEquals(wifiAgent.networkId, mUNM.getCurrentPreferredUpstream().network);
+
+        // [4] DUN required, no other changes -> WiFi still selected
+        mUNM.updateMobileRequiresDun(true);
+        assertEquals(wifiAgent.networkId, mUNM.getCurrentPreferredUpstream().network);
+
+        // [5] WiFi no longer validated, mobile becomes default, DUN required -> null selected.
+        mCM.makeDefaultNetwork(cellAgent);
+        assertEquals(null, mUNM.getCurrentPreferredUpstream());
+        // TODO: make sure that a DUN request has been filed. This is currently
+        // triggered by code over in Tethering, but once that has been moved
+        // into UNM we should test for this here.
+
+        // [6] DUN network arrives -> DUN selected
+        final TestNetworkAgent dunAgent = new TestNetworkAgent(mCM, TRANSPORT_CELLULAR);
+        dunAgent.networkCapabilities.addCapability(NET_CAPABILITY_DUN);
+        dunAgent.networkCapabilities.removeCapability(NET_CAPABILITY_INTERNET);
+        dunAgent.fakeConnect();
+        assertEquals(dunAgent.networkId, mUNM.getCurrentPreferredUpstream().network);
+
+        // [7] Mobile is not permitted -> null selected
+        when(mEntitleMgr.isCellularUpstreamPermitted()).thenReturn(false);
+        assertEquals(null, mUNM.getCurrentPreferredUpstream());
+    }
+
+    @Test
+    public void testLocalPrefixes() throws Exception {
+        mUNM.startTrackDefaultNetwork(sDefaultRequest, mEntitleMgr);
+        mUNM.startObserveAllNetworks();
+
+        // [0] Test minimum set of local prefixes.
+        Set<IpPrefix> local = mUNM.getLocalPrefixes();
+        assertTrue(local.isEmpty());
+
+        final Set<String> alreadySeen = new HashSet<>();
+
+        // [1] Pretend Wi-Fi connects.
+        final TestNetworkAgent wifiAgent = new TestNetworkAgent(mCM, TRANSPORT_WIFI);
+        final LinkProperties wifiLp = wifiAgent.linkProperties;
+        wifiLp.setInterfaceName("wlan0");
+        final String[] wifi_addrs = {
+                "fe80::827a:bfff:fe6f:374d", "100.112.103.18",
+                "2001:db8:4:fd00:827a:bfff:fe6f:374d",
+                "2001:db8:4:fd00:6dea:325a:fdae:4ef4",
+                "fd6a:a640:60bf:e985::123",  // ULA address for good measure.
+        };
+        for (String addrStr : wifi_addrs) {
+            final String cidr = addrStr.contains(":") ? "/64" : "/20";
+            wifiLp.addLinkAddress(new LinkAddress(addrStr + cidr));
+        }
+        wifiAgent.fakeConnect();
+        wifiAgent.sendLinkProperties();
+
+        local = mUNM.getLocalPrefixes();
+        assertPrefixSet(local, INCLUDES, alreadySeen);
+        final String[] wifiLinkPrefixes = {
+                // Link-local prefixes are excluded and dealt with elsewhere.
+                "100.112.96.0/20", "2001:db8:4:fd00::/64", "fd6a:a640:60bf:e985::/64",
+        };
+        assertPrefixSet(local, INCLUDES, wifiLinkPrefixes);
+        Collections.addAll(alreadySeen, wifiLinkPrefixes);
+        assertEquals(alreadySeen.size(), local.size());
+
+        // [2] Pretend mobile connects.
+        final TestNetworkAgent cellAgent = new TestNetworkAgent(mCM, TRANSPORT_CELLULAR);
+        final LinkProperties cellLp = cellAgent.linkProperties;
+        cellLp.setInterfaceName("rmnet_data0");
+        final String[] cell_addrs = {
+                "10.102.211.48", "2001:db8:0:1:b50e:70d9:10c9:433d",
+        };
+        for (String addrStr : cell_addrs) {
+            final String cidr = addrStr.contains(":") ? "/64" : "/27";
+            cellLp.addLinkAddress(new LinkAddress(addrStr + cidr));
+        }
+        cellAgent.fakeConnect();
+        cellAgent.sendLinkProperties();
+
+        local = mUNM.getLocalPrefixes();
+        assertPrefixSet(local, INCLUDES, alreadySeen);
+        final String[] cellLinkPrefixes = { "10.102.211.32/27", "2001:db8:0:1::/64" };
+        assertPrefixSet(local, INCLUDES, cellLinkPrefixes);
+        Collections.addAll(alreadySeen, cellLinkPrefixes);
+        assertEquals(alreadySeen.size(), local.size());
+
+        // [3] Pretend DUN connects.
+        final TestNetworkAgent dunAgent = new TestNetworkAgent(mCM, TRANSPORT_CELLULAR);
+        dunAgent.networkCapabilities.addCapability(NET_CAPABILITY_DUN);
+        dunAgent.networkCapabilities.removeCapability(NET_CAPABILITY_INTERNET);
+        final LinkProperties dunLp = dunAgent.linkProperties;
+        dunLp.setInterfaceName("rmnet_data1");
+        final String[] dun_addrs = {
+                "192.0.2.48", "2001:db8:1:2:b50e:70d9:10c9:433d",
+        };
+        for (String addrStr : dun_addrs) {
+            final String cidr = addrStr.contains(":") ? "/64" : "/27";
+            dunLp.addLinkAddress(new LinkAddress(addrStr + cidr));
+        }
+        dunAgent.fakeConnect();
+        dunAgent.sendLinkProperties();
+
+        local = mUNM.getLocalPrefixes();
+        assertPrefixSet(local, INCLUDES, alreadySeen);
+        final String[] dunLinkPrefixes = { "192.0.2.32/27", "2001:db8:1:2::/64" };
+        assertPrefixSet(local, INCLUDES, dunLinkPrefixes);
+        Collections.addAll(alreadySeen, dunLinkPrefixes);
+        assertEquals(alreadySeen.size(), local.size());
+
+        // [4] Pretend Wi-Fi disconnected.  It's addresses/prefixes should no
+        // longer be included (should be properly removed).
+        wifiAgent.fakeDisconnect();
+        local = mUNM.getLocalPrefixes();
+        assertPrefixSet(local, EXCLUDES, wifiLinkPrefixes);
+        assertPrefixSet(local, INCLUDES, cellLinkPrefixes);
+        assertPrefixSet(local, INCLUDES, dunLinkPrefixes);
+
+        // [5] Pretend mobile disconnected.
+        cellAgent.fakeDisconnect();
+        local = mUNM.getLocalPrefixes();
+        assertPrefixSet(local, EXCLUDES, wifiLinkPrefixes);
+        assertPrefixSet(local, EXCLUDES, cellLinkPrefixes);
+        assertPrefixSet(local, INCLUDES, dunLinkPrefixes);
+
+        // [6] Pretend DUN disconnected.
+        dunAgent.fakeDisconnect();
+        local = mUNM.getLocalPrefixes();
+        assertTrue(local.isEmpty());
+    }
+
+    @Test
+    public void testSelectMobileWhenMobileIsNotDefault() {
+        final Collection<Integer> preferredTypes = new ArrayList<>();
+        // Mobile has higher pirority than wifi.
+        preferredTypes.add(TYPE_MOBILE_HIPRI);
+        preferredTypes.add(TYPE_WIFI);
+        mUNM.startTrackDefaultNetwork(sDefaultRequest, mEntitleMgr);
+        mUNM.startObserveAllNetworks();
+        // Setup wifi and make wifi as default network.
+        final TestNetworkAgent wifiAgent = new TestNetworkAgent(mCM, TRANSPORT_WIFI);
+        wifiAgent.fakeConnect();
+        mCM.makeDefaultNetwork(wifiAgent);
+        // Setup mobile network.
+        final TestNetworkAgent cellAgent = new TestNetworkAgent(mCM, TRANSPORT_CELLULAR);
+        cellAgent.fakeConnect();
+
+        assertSatisfiesLegacyType(TYPE_MOBILE_HIPRI,
+                mUNM.selectPreferredUpstreamType(preferredTypes));
+        verify(mEntitleMgr, times(1)).maybeRunProvisioning();
+    }
+
+    private void assertSatisfiesLegacyType(int legacyType, UpstreamNetworkState ns) {
+        if (legacyType == TYPE_NONE) {
+            assertTrue(ns == null);
+            return;
+        }
+
+        final NetworkCapabilities nc =
+                UpstreamNetworkMonitor.networkCapabilitiesForType(legacyType);
+        assertTrue(nc.satisfiedByNetworkCapabilities(ns.networkCapabilities));
+    }
+
+    private void assertUpstreamTypeRequested(int upstreamType) throws Exception {
+        assertEquals(1, mCM.requested.size());
+        assertEquals(1, mCM.legacyTypeMap.size());
+        assertEquals(Integer.valueOf(upstreamType),
+                mCM.legacyTypeMap.values().iterator().next());
+    }
+
+    private boolean isDunRequested() {
+        for (NetworkRequest req : mCM.requested.values()) {
+            if (req.networkCapabilities.hasCapability(NET_CAPABILITY_DUN)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public static class TestConnectivityManager extends ConnectivityManager {
+        public Map<NetworkCallback, Handler> allCallbacks = new HashMap<>();
+        public Set<NetworkCallback> trackingDefault = new HashSet<>();
+        public TestNetworkAgent defaultNetwork = null;
+        public Map<NetworkCallback, NetworkRequest> listening = new HashMap<>();
+        public Map<NetworkCallback, NetworkRequest> requested = new HashMap<>();
+        public Map<NetworkCallback, Integer> legacyTypeMap = new HashMap<>();
+
+        private int mNetworkId = 100;
+
+        public TestConnectivityManager(Context ctx, IConnectivityManager svc) {
+            super(ctx, svc);
+        }
+
+        boolean hasNoCallbacks() {
+            return allCallbacks.isEmpty()
+                    && trackingDefault.isEmpty()
+                    && listening.isEmpty()
+                    && requested.isEmpty()
+                    && legacyTypeMap.isEmpty();
+        }
+
+        boolean onlyHasDefaultCallbacks() {
+            return (allCallbacks.size() == 1)
+                    && (trackingDefault.size() == 1)
+                    && listening.isEmpty()
+                    && requested.isEmpty()
+                    && legacyTypeMap.isEmpty();
+        }
+
+        boolean isListeningForAll() {
+            final NetworkCapabilities empty = new NetworkCapabilities();
+            empty.clearAll();
+
+            for (NetworkRequest req : listening.values()) {
+                if (req.networkCapabilities.equalRequestableCapabilities(empty)) {
+                    return true;
+                }
+            }
+            return false;
+        }
+
+        int getNetworkId() {
+            return ++mNetworkId;
+        }
+
+        void makeDefaultNetwork(TestNetworkAgent agent) {
+            if (Objects.equals(defaultNetwork, agent)) return;
+
+            final TestNetworkAgent formerDefault = defaultNetwork;
+            defaultNetwork = agent;
+
+            for (NetworkCallback cb : trackingDefault) {
+                if (defaultNetwork != null) {
+                    cb.onAvailable(defaultNetwork.networkId);
+                    cb.onCapabilitiesChanged(
+                            defaultNetwork.networkId, defaultNetwork.networkCapabilities);
+                    cb.onLinkPropertiesChanged(
+                            defaultNetwork.networkId, defaultNetwork.linkProperties);
+                }
+            }
+        }
+
+        @Override
+        public void requestNetwork(NetworkRequest req, NetworkCallback cb, Handler h) {
+            assertFalse(allCallbacks.containsKey(cb));
+            allCallbacks.put(cb, h);
+            if (sDefaultRequest.equals(req)) {
+                assertFalse(trackingDefault.contains(cb));
+                trackingDefault.add(cb);
+            } else {
+                assertFalse(requested.containsKey(cb));
+                requested.put(cb, req);
+            }
+        }
+
+        @Override
+        public void requestNetwork(NetworkRequest req, NetworkCallback cb) {
+            fail("Should never be called.");
+        }
+
+        @Override
+        public void requestNetwork(NetworkRequest req,
+                int timeoutMs, int legacyType, Handler h, NetworkCallback cb) {
+            assertFalse(allCallbacks.containsKey(cb));
+            allCallbacks.put(cb, h);
+            assertFalse(requested.containsKey(cb));
+            requested.put(cb, req);
+            assertFalse(legacyTypeMap.containsKey(cb));
+            if (legacyType != ConnectivityManager.TYPE_NONE) {
+                legacyTypeMap.put(cb, legacyType);
+            }
+        }
+
+        @Override
+        public void registerNetworkCallback(NetworkRequest req, NetworkCallback cb, Handler h) {
+            assertFalse(allCallbacks.containsKey(cb));
+            allCallbacks.put(cb, h);
+            assertFalse(listening.containsKey(cb));
+            listening.put(cb, req);
+        }
+
+        @Override
+        public void registerNetworkCallback(NetworkRequest req, NetworkCallback cb) {
+            fail("Should never be called.");
+        }
+
+        @Override
+        public void registerDefaultNetworkCallback(NetworkCallback cb, Handler h) {
+            fail("Should never be called.");
+        }
+
+        @Override
+        public void registerDefaultNetworkCallback(NetworkCallback cb) {
+            fail("Should never be called.");
+        }
+
+        @Override
+        public void unregisterNetworkCallback(NetworkCallback cb) {
+            if (trackingDefault.contains(cb)) {
+                trackingDefault.remove(cb);
+            } else if (listening.containsKey(cb)) {
+                listening.remove(cb);
+            } else if (requested.containsKey(cb)) {
+                requested.remove(cb);
+                legacyTypeMap.remove(cb);
+            } else {
+                fail("Unexpected callback removed");
+            }
+            allCallbacks.remove(cb);
+
+            assertFalse(allCallbacks.containsKey(cb));
+            assertFalse(trackingDefault.contains(cb));
+            assertFalse(listening.containsKey(cb));
+            assertFalse(requested.containsKey(cb));
+        }
+    }
+
+    public static class TestNetworkAgent {
+        public final TestConnectivityManager cm;
+        public final Network networkId;
+        public final int transportType;
+        public final NetworkCapabilities networkCapabilities;
+        public final LinkProperties linkProperties;
+
+        public TestNetworkAgent(TestConnectivityManager cm, int transportType) {
+            this.cm = cm;
+            this.networkId = new Network(cm.getNetworkId());
+            this.transportType = transportType;
+            networkCapabilities = new NetworkCapabilities();
+            networkCapabilities.addTransportType(transportType);
+            networkCapabilities.addCapability(NET_CAPABILITY_INTERNET);
+            linkProperties = new LinkProperties();
+        }
+
+        public void fakeConnect() {
+            for (NetworkCallback cb : cm.listening.keySet()) {
+                cb.onAvailable(networkId);
+                cb.onCapabilitiesChanged(networkId, copy(networkCapabilities));
+                cb.onLinkPropertiesChanged(networkId, copy(linkProperties));
+            }
+        }
+
+        public void fakeDisconnect() {
+            for (NetworkCallback cb : cm.listening.keySet()) {
+                cb.onLost(networkId);
+            }
+        }
+
+        public void sendLinkProperties() {
+            for (NetworkCallback cb : cm.listening.keySet()) {
+                cb.onLinkPropertiesChanged(networkId, copy(linkProperties));
+            }
+        }
+
+        @Override
+        public String toString() {
+            return String.format("TestNetworkAgent: %s %s", networkId, networkCapabilities);
+        }
+    }
+
+    public static class TestStateMachine extends StateMachine {
+        public final ArrayList<Message> messages = new ArrayList<>();
+        private final State mLoggingState = new LoggingState();
+
+        class LoggingState extends State {
+            @Override public void enter() {
+                messages.clear();
+            }
+
+            @Override public void exit() {
+                messages.clear();
+            }
+
+            @Override public boolean processMessage(Message msg) {
+                messages.add(msg);
+                return true;
+            }
+        }
+
+        public TestStateMachine() {
+            super("UpstreamNetworkMonitor.TestStateMachine");
+            addState(mLoggingState);
+            setInitialState(mLoggingState);
+            super.start();
+        }
+    }
+
+    static NetworkCapabilities copy(NetworkCapabilities nc) {
+        return new NetworkCapabilities(nc);
+    }
+
+    static LinkProperties copy(LinkProperties lp) {
+        return new LinkProperties(lp);
+    }
+
+    static void assertPrefixSet(Set<IpPrefix> prefixes, boolean expectation, String... expected) {
+        final Set<String> expectedSet = new HashSet<>();
+        Collections.addAll(expectedSet, expected);
+        assertPrefixSet(prefixes, expectation, expectedSet);
+    }
+
+    static void assertPrefixSet(Set<IpPrefix> prefixes, boolean expectation, Set<String> expected) {
+        for (String expectedPrefix : expected) {
+            final String errStr = expectation ? "did not find" : "found";
+            assertEquals(
+                    String.format("Failed expectation: %s prefix: %s", errStr, expectedPrefix),
+                    expectation, prefixes.contains(new IpPrefix(expectedPrefix)));
+        }
+    }
+}
diff --git a/packages/Tethering/tests/unit/src/com/android/server/connectivity/tethering/ConnectedClientsTrackerTest.kt b/packages/Tethering/tests/unit/src/com/android/server/connectivity/tethering/ConnectedClientsTrackerTest.kt
deleted file mode 100644
index 1cdc3bb..0000000
--- a/packages/Tethering/tests/unit/src/com/android/server/connectivity/tethering/ConnectedClientsTrackerTest.kt
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.connectivity.tethering
-
-import android.net.LinkAddress
-import android.net.MacAddress
-import android.net.TetheredClient
-import android.net.TetheredClient.AddressInfo
-import android.net.TetheringManager.TETHERING_USB
-import android.net.TetheringManager.TETHERING_WIFI
-import android.net.ip.IpServer
-import android.net.wifi.WifiClient
-import androidx.test.filters.SmallTest
-import androidx.test.runner.AndroidJUnit4
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.mockito.Mockito.doReturn
-import org.mockito.Mockito.mock
-import kotlin.test.assertEquals
-import kotlin.test.assertFalse
-import kotlin.test.assertTrue
-
-@RunWith(AndroidJUnit4::class)
-@SmallTest
-class ConnectedClientsTrackerTest {
-
-    private val server1 = mock(IpServer::class.java)
-    private val server2 = mock(IpServer::class.java)
-    private val servers = listOf(server1, server2)
-
-    private val clock = TestClock(1324L)
-
-    private val client1Addr = MacAddress.fromString("01:23:45:67:89:0A")
-    private val client1 = TetheredClient(client1Addr, listOf(
-            makeAddrInfo("192.168.43.44/32", null /* hostname */, clock.time + 20)),
-            TETHERING_WIFI)
-    private val wifiClient1 = makeWifiClient(client1Addr)
-    private val client2Addr = MacAddress.fromString("02:34:56:78:90:AB")
-    private val client2Exp30AddrInfo = makeAddrInfo(
-            "192.168.43.45/32", "my_hostname", clock.time + 30)
-    private val client2 = TetheredClient(client2Addr, listOf(
-            client2Exp30AddrInfo,
-            makeAddrInfo("2001:db8:12::34/72", "other_hostname", clock.time + 10)),
-            TETHERING_WIFI)
-    private val wifiClient2 = makeWifiClient(client2Addr)
-    private val client3Addr = MacAddress.fromString("03:45:67:89:0A:BC")
-    private val client3 = TetheredClient(client3Addr,
-            listOf(makeAddrInfo("2001:db8:34::34/72", "other_other_hostname", clock.time + 10)),
-            TETHERING_USB)
-
-    private fun makeAddrInfo(addr: String, hostname: String?, expTime: Long) =
-            LinkAddress(addr).let {
-                AddressInfo(LinkAddress(it.address, it.prefixLength, it.flags, it.scope,
-                        expTime /* deprecationTime */, expTime /* expirationTime */), hostname)
-            }
-
-    @Test
-    fun testUpdateConnectedClients() {
-        doReturn(emptyList<TetheredClient>()).`when`(server1).allLeases
-        doReturn(emptyList<TetheredClient>()).`when`(server2).allLeases
-
-        val tracker = ConnectedClientsTracker(clock)
-        assertFalse(tracker.updateConnectedClients(servers, null))
-
-        // Obtain a lease for client 1
-        doReturn(listOf(client1)).`when`(server1).allLeases
-        assertSameClients(listOf(client1), assertNewClients(tracker, servers, listOf(wifiClient1)))
-
-        // Client 2 L2-connected, no lease yet
-        val client2WithoutAddr = TetheredClient(client2Addr, emptyList(), TETHERING_WIFI)
-        assertSameClients(listOf(client1, client2WithoutAddr),
-                assertNewClients(tracker, servers, listOf(wifiClient1, wifiClient2)))
-
-        // Client 2 lease obtained
-        doReturn(listOf(client1, client2)).`when`(server1).allLeases
-        assertSameClients(listOf(client1, client2), assertNewClients(tracker, servers, null))
-
-        // Client 3 lease obtained
-        doReturn(listOf(client3)).`when`(server2).allLeases
-        assertSameClients(listOf(client1, client2, client3),
-                assertNewClients(tracker, servers, null))
-
-        // Client 2 L2-disconnected
-        assertSameClients(listOf(client1, client3),
-                assertNewClients(tracker, servers, listOf(wifiClient1)))
-
-        // Client 1 L2-disconnected
-        assertSameClients(listOf(client3), assertNewClients(tracker, servers, emptyList()))
-
-        // Client 1 comes back
-        assertSameClients(listOf(client1, client3),
-                assertNewClients(tracker, servers, listOf(wifiClient1)))
-
-        // Leases lost, client 1 still L2-connected
-        doReturn(emptyList<TetheredClient>()).`when`(server1).allLeases
-        doReturn(emptyList<TetheredClient>()).`when`(server2).allLeases
-        assertSameClients(listOf(TetheredClient(client1Addr, emptyList(), TETHERING_WIFI)),
-                assertNewClients(tracker, servers, null))
-    }
-
-    @Test
-    fun testUpdateConnectedClients_LeaseExpiration() {
-        val tracker = ConnectedClientsTracker(clock)
-        doReturn(listOf(client1, client2)).`when`(server1).allLeases
-        doReturn(listOf(client3)).`when`(server2).allLeases
-        assertSameClients(listOf(client1, client2, client3), assertNewClients(
-                tracker, servers, listOf(wifiClient1, wifiClient2)))
-
-        clock.time += 20
-        // Client 3 has no remaining lease: removed
-        val expectedClients = listOf(
-                // Client 1 has no remaining lease but is L2-connected
-                TetheredClient(client1Addr, emptyList(), TETHERING_WIFI),
-                // Client 2 has some expired leases
-                TetheredClient(
-                        client2Addr,
-                        // Only the "t + 30" address is left, the "t + 10" address expired
-                        listOf(client2Exp30AddrInfo),
-                        TETHERING_WIFI))
-        assertSameClients(expectedClients, assertNewClients(tracker, servers, null))
-    }
-
-    private fun assertNewClients(
-        tracker: ConnectedClientsTracker,
-        ipServers: Iterable<IpServer>,
-        wifiClients: List<WifiClient>?
-    ): List<TetheredClient> {
-        assertTrue(tracker.updateConnectedClients(ipServers, wifiClients))
-        return tracker.lastTetheredClients
-    }
-
-    private fun assertSameClients(expected: List<TetheredClient>, actual: List<TetheredClient>) {
-        val expectedSet = HashSet(expected)
-        assertEquals(expected.size, expectedSet.size)
-        assertEquals(expectedSet, HashSet(actual))
-    }
-
-    private fun makeWifiClient(macAddr: MacAddress): WifiClient {
-        // Use a mock WifiClient as the constructor is not part of the WiFi module exported API.
-        return mock(WifiClient::class.java).apply { doReturn(macAddr).`when`(this).macAddress }
-    }
-
-    private class TestClock(var time: Long) : ConnectedClientsTracker.Clock() {
-        override fun elapsedRealtime(): Long {
-            return time
-        }
-    }
-}
\ No newline at end of file
diff --git a/packages/Tethering/tests/unit/src/com/android/server/connectivity/tethering/EntitlementManagerTest.java b/packages/Tethering/tests/unit/src/com/android/server/connectivity/tethering/EntitlementManagerTest.java
deleted file mode 100644
index 6695eed..0000000
--- a/packages/Tethering/tests/unit/src/com/android/server/connectivity/tethering/EntitlementManagerTest.java
+++ /dev/null
@@ -1,523 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.connectivity.tethering;
-
-import static android.net.TetheringManager.TETHERING_BLUETOOTH;
-import static android.net.TetheringManager.TETHERING_ETHERNET;
-import static android.net.TetheringManager.TETHERING_USB;
-import static android.net.TetheringManager.TETHERING_WIFI;
-import static android.net.TetheringManager.TETHERING_WIFI_P2P;
-import static android.net.TetheringManager.TETHER_ERROR_ENTITLEMENT_UNKNOWN;
-import static android.net.TetheringManager.TETHER_ERROR_NO_ERROR;
-import static android.net.TetheringManager.TETHER_ERROR_PROVISIONING_FAILED;
-import static android.provider.DeviceConfig.NAMESPACE_CONNECTIVITY;
-import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
-
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.Matchers.anyBoolean;
-import static org.mockito.Matchers.anyInt;
-import static org.mockito.Matchers.anyString;
-import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.net.util.SharedLog;
-import android.os.Bundle;
-import android.os.Message;
-import android.os.PersistableBundle;
-import android.os.ResultReceiver;
-import android.os.SystemProperties;
-import android.os.test.TestLooper;
-import android.provider.DeviceConfig;
-import android.telephony.CarrierConfigManager;
-
-import androidx.test.filters.SmallTest;
-import androidx.test.runner.AndroidJUnit4;
-
-import com.android.internal.util.State;
-import com.android.internal.util.StateMachine;
-import com.android.internal.util.test.BroadcastInterceptingContext;
-import com.android.networkstack.tethering.R;
-
-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 org.mockito.MockitoSession;
-import org.mockito.quality.Strictness;
-
-import java.util.ArrayList;
-
-@RunWith(AndroidJUnit4.class)
-@SmallTest
-public final class EntitlementManagerTest {
-
-    private static final int EVENT_EM_UPDATE = 1;
-    private static final String[] PROVISIONING_APP_NAME = {"some", "app"};
-    private static final String PROVISIONING_NO_UI_APP_NAME = "no_ui_app";
-
-    @Mock private CarrierConfigManager mCarrierConfigManager;
-    @Mock private Context mContext;
-    @Mock private Resources mResources;
-    @Mock private SharedLog mLog;
-    @Mock private EntitlementManager.OnUiEntitlementFailedListener mEntitlementFailedListener;
-
-    // Like so many Android system APIs, these cannot be mocked because it is marked final.
-    // We have to use the real versions.
-    private final PersistableBundle mCarrierConfig = new PersistableBundle();
-    private final TestLooper mLooper = new TestLooper();
-    private Context mMockContext;
-
-    private TestStateMachine mSM;
-    private WrappedEntitlementManager mEnMgr;
-    private TetheringConfiguration mConfig;
-    private MockitoSession mMockingSession;
-
-    private class MockContext extends BroadcastInterceptingContext {
-        MockContext(Context base) {
-            super(base);
-        }
-
-        @Override
-        public Resources getResources() {
-            return mResources;
-        }
-    }
-
-    public class WrappedEntitlementManager extends EntitlementManager {
-        public int fakeEntitlementResult = TETHER_ERROR_ENTITLEMENT_UNKNOWN;
-        public int uiProvisionCount = 0;
-        public int silentProvisionCount = 0;
-
-        public WrappedEntitlementManager(Context ctx, StateMachine target,
-                SharedLog log, int what) {
-            super(ctx, target, log, what);
-        }
-
-        public void reset() {
-            fakeEntitlementResult = TETHER_ERROR_ENTITLEMENT_UNKNOWN;
-            uiProvisionCount = 0;
-            silentProvisionCount = 0;
-        }
-
-        @Override
-        protected void runUiTetherProvisioning(int type, int subId, ResultReceiver receiver) {
-            uiProvisionCount++;
-            receiver.send(fakeEntitlementResult, null);
-        }
-
-        @Override
-        protected void runSilentTetherProvisioning(int type, int subId) {
-            silentProvisionCount++;
-            addDownstreamMapping(type, fakeEntitlementResult);
-        }
-    }
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-        mMockingSession = mockitoSession()
-                .initMocks(this)
-                .mockStatic(SystemProperties.class)
-                .mockStatic(DeviceConfig.class)
-                .strictness(Strictness.WARN)
-                .startMocking();
-        // Don't disable tethering provisioning unless requested.
-        doReturn(false).when(
-                () -> SystemProperties.getBoolean(
-                eq(EntitlementManager.DISABLE_PROVISIONING_SYSPROP_KEY), anyBoolean()));
-        doReturn(false).when(
-                () -> DeviceConfig.getBoolean(eq(NAMESPACE_CONNECTIVITY),
-                eq(TetheringConfiguration.TETHER_ENABLE_LEGACY_DHCP_SERVER), anyBoolean()));
-
-        when(mResources.getStringArray(R.array.config_tether_dhcp_range))
-                .thenReturn(new String[0]);
-        when(mResources.getStringArray(R.array.config_tether_usb_regexs))
-                .thenReturn(new String[0]);
-        when(mResources.getStringArray(R.array.config_tether_wifi_regexs))
-                .thenReturn(new String[0]);
-        when(mResources.getStringArray(R.array.config_tether_bluetooth_regexs))
-                .thenReturn(new String[0]);
-        when(mResources.getIntArray(R.array.config_tether_upstream_types))
-                .thenReturn(new int[0]);
-        when(mResources.getBoolean(R.bool.config_tether_enable_legacy_dhcp_server)).thenReturn(
-                false);
-        when(mResources.getString(R.string.config_wifi_tether_enable)).thenReturn("");
-        when(mLog.forSubComponent(anyString())).thenReturn(mLog);
-
-        mMockContext = new MockContext(mContext);
-        mSM = new TestStateMachine();
-        mEnMgr = new WrappedEntitlementManager(mMockContext, mSM, mLog, EVENT_EM_UPDATE);
-        mEnMgr.setOnUiEntitlementFailedListener(mEntitlementFailedListener);
-        mConfig = new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID);
-        mEnMgr.setTetheringConfigurationFetcher(() -> {
-            return mConfig;
-        });
-    }
-
-    @After
-    public void tearDown() throws Exception {
-        if (mSM != null) {
-            mSM.quit();
-            mSM = null;
-        }
-        mMockingSession.finishMocking();
-    }
-
-    private void setupForRequiredProvisioning() {
-        // Produce some acceptable looking provision app setting if requested.
-        when(mResources.getStringArray(R.array.config_mobile_hotspot_provision_app))
-                .thenReturn(PROVISIONING_APP_NAME);
-        when(mResources.getString(R.string.config_mobile_hotspot_provision_app_no_ui))
-                .thenReturn(PROVISIONING_NO_UI_APP_NAME);
-        // Act like the CarrierConfigManager is present and ready unless told otherwise.
-        when(mContext.getSystemService(Context.CARRIER_CONFIG_SERVICE))
-                .thenReturn(mCarrierConfigManager);
-        when(mCarrierConfigManager.getConfigForSubId(anyInt())).thenReturn(mCarrierConfig);
-        mCarrierConfig.putBoolean(CarrierConfigManager.KEY_REQUIRE_ENTITLEMENT_CHECKS_BOOL, true);
-        mCarrierConfig.putBoolean(CarrierConfigManager.KEY_CARRIER_CONFIG_APPLIED_BOOL, true);
-        mConfig = new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID);
-    }
-
-    @Test
-    public void canRequireProvisioning() {
-        setupForRequiredProvisioning();
-        assertTrue(mEnMgr.isTetherProvisioningRequired(mConfig));
-    }
-
-    @Test
-    public void toleratesCarrierConfigManagerMissing() {
-        setupForRequiredProvisioning();
-        when(mContext.getSystemService(Context.CARRIER_CONFIG_SERVICE))
-            .thenReturn(null);
-        mConfig = new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID);
-        // Couldn't get the CarrierConfigManager, but still had a declared provisioning app.
-        // Therefore provisioning still be required.
-        assertTrue(mEnMgr.isTetherProvisioningRequired(mConfig));
-    }
-
-    @Test
-    public void toleratesCarrierConfigMissing() {
-        setupForRequiredProvisioning();
-        when(mCarrierConfigManager.getConfig()).thenReturn(null);
-        mConfig = new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID);
-        // We still have a provisioning app configured, so still require provisioning.
-        assertTrue(mEnMgr.isTetherProvisioningRequired(mConfig));
-    }
-
-    @Test
-    public void toleratesCarrierConfigNotLoaded() {
-        setupForRequiredProvisioning();
-        mCarrierConfig.putBoolean(CarrierConfigManager.KEY_CARRIER_CONFIG_APPLIED_BOOL, false);
-        // We still have a provisioning app configured, so still require provisioning.
-        assertTrue(mEnMgr.isTetherProvisioningRequired(mConfig));
-    }
-
-    @Test
-    public void provisioningNotRequiredWhenAppNotFound() {
-        setupForRequiredProvisioning();
-        when(mResources.getStringArray(R.array.config_mobile_hotspot_provision_app))
-            .thenReturn(null);
-        mConfig = new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID);
-        assertFalse(mEnMgr.isTetherProvisioningRequired(mConfig));
-        when(mResources.getStringArray(R.array.config_mobile_hotspot_provision_app))
-            .thenReturn(new String[] {"malformedApp"});
-        mConfig = new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID);
-        assertFalse(mEnMgr.isTetherProvisioningRequired(mConfig));
-    }
-
-    @Test
-    public void testRequestLastEntitlementCacheValue() throws Exception {
-        // 1. Entitlement check is not required.
-        mEnMgr.fakeEntitlementResult = TETHER_ERROR_NO_ERROR;
-        ResultReceiver receiver = new ResultReceiver(null) {
-            @Override
-            protected void onReceiveResult(int resultCode, Bundle resultData) {
-                assertEquals(TETHER_ERROR_NO_ERROR, resultCode);
-            }
-        };
-        mEnMgr.requestLatestTetheringEntitlementResult(TETHERING_WIFI, receiver, true);
-        mLooper.dispatchAll();
-        assertEquals(0, mEnMgr.uiProvisionCount);
-        mEnMgr.reset();
-
-        setupForRequiredProvisioning();
-        // 2. No cache value and don't need to run entitlement check.
-        receiver = new ResultReceiver(null) {
-            @Override
-            protected void onReceiveResult(int resultCode, Bundle resultData) {
-                assertEquals(TETHER_ERROR_ENTITLEMENT_UNKNOWN, resultCode);
-            }
-        };
-        mEnMgr.requestLatestTetheringEntitlementResult(TETHERING_WIFI, receiver, false);
-        mLooper.dispatchAll();
-        assertEquals(0, mEnMgr.uiProvisionCount);
-        mEnMgr.reset();
-        // 3. No cache value and ui entitlement check is needed.
-        mEnMgr.fakeEntitlementResult = TETHER_ERROR_PROVISIONING_FAILED;
-        receiver = new ResultReceiver(null) {
-            @Override
-            protected void onReceiveResult(int resultCode, Bundle resultData) {
-                assertEquals(TETHER_ERROR_PROVISIONING_FAILED, resultCode);
-            }
-        };
-        mEnMgr.requestLatestTetheringEntitlementResult(TETHERING_WIFI, receiver, true);
-        mLooper.dispatchAll();
-        assertEquals(1, mEnMgr.uiProvisionCount);
-        mEnMgr.reset();
-        // 4. Cache value is TETHER_ERROR_PROVISIONING_FAILED and don't need to run entitlement
-        // check.
-        mEnMgr.fakeEntitlementResult = TETHER_ERROR_NO_ERROR;
-        receiver = new ResultReceiver(null) {
-            @Override
-            protected void onReceiveResult(int resultCode, Bundle resultData) {
-                assertEquals(TETHER_ERROR_PROVISIONING_FAILED, resultCode);
-            }
-        };
-        mEnMgr.requestLatestTetheringEntitlementResult(TETHERING_WIFI, receiver, false);
-        mLooper.dispatchAll();
-        assertEquals(0, mEnMgr.uiProvisionCount);
-        mEnMgr.reset();
-        // 5. Cache value is TETHER_ERROR_PROVISIONING_FAILED and ui entitlement check is needed.
-        mEnMgr.fakeEntitlementResult = TETHER_ERROR_NO_ERROR;
-        receiver = new ResultReceiver(null) {
-            @Override
-            protected void onReceiveResult(int resultCode, Bundle resultData) {
-                assertEquals(TETHER_ERROR_NO_ERROR, resultCode);
-            }
-        };
-        mEnMgr.requestLatestTetheringEntitlementResult(TETHERING_WIFI, receiver, true);
-        mLooper.dispatchAll();
-        assertEquals(1, mEnMgr.uiProvisionCount);
-        mEnMgr.reset();
-        // 6. Cache value is TETHER_ERROR_NO_ERROR.
-        mEnMgr.fakeEntitlementResult = TETHER_ERROR_NO_ERROR;
-        receiver = new ResultReceiver(null) {
-            @Override
-            protected void onReceiveResult(int resultCode, Bundle resultData) {
-                assertEquals(TETHER_ERROR_NO_ERROR, resultCode);
-            }
-        };
-        mEnMgr.requestLatestTetheringEntitlementResult(TETHERING_WIFI, receiver, true);
-        mLooper.dispatchAll();
-        assertEquals(0, mEnMgr.uiProvisionCount);
-        mEnMgr.reset();
-        // 7. Test get value for other downstream type.
-        receiver = new ResultReceiver(null) {
-            @Override
-            protected void onReceiveResult(int resultCode, Bundle resultData) {
-                assertEquals(TETHER_ERROR_ENTITLEMENT_UNKNOWN, resultCode);
-            }
-        };
-        mEnMgr.requestLatestTetheringEntitlementResult(TETHERING_USB, receiver, false);
-        mLooper.dispatchAll();
-        assertEquals(0, mEnMgr.uiProvisionCount);
-        mEnMgr.reset();
-        // 8. Test get value for invalid downstream type.
-        mEnMgr.fakeEntitlementResult = TETHER_ERROR_NO_ERROR;
-        receiver = new ResultReceiver(null) {
-            @Override
-            protected void onReceiveResult(int resultCode, Bundle resultData) {
-                assertEquals(TETHER_ERROR_ENTITLEMENT_UNKNOWN, resultCode);
-            }
-        };
-        mEnMgr.requestLatestTetheringEntitlementResult(TETHERING_WIFI_P2P, receiver, true);
-        mLooper.dispatchAll();
-        assertEquals(0, mEnMgr.uiProvisionCount);
-        mEnMgr.reset();
-    }
-
-    @Test
-    public void verifyPermissionResult() {
-        setupForRequiredProvisioning();
-        mEnMgr.notifyUpstream(true);
-        mEnMgr.fakeEntitlementResult = TETHER_ERROR_PROVISIONING_FAILED;
-        mEnMgr.startProvisioningIfNeeded(TETHERING_WIFI, true);
-        mLooper.dispatchAll();
-        assertFalse(mEnMgr.isCellularUpstreamPermitted());
-        mEnMgr.stopProvisioningIfNeeded(TETHERING_WIFI);
-        mLooper.dispatchAll();
-        mEnMgr.fakeEntitlementResult = TETHER_ERROR_NO_ERROR;
-        mEnMgr.startProvisioningIfNeeded(TETHERING_WIFI, true);
-        mLooper.dispatchAll();
-        assertTrue(mEnMgr.isCellularUpstreamPermitted());
-    }
-
-    @Test
-    public void verifyPermissionIfAllNotApproved() {
-        setupForRequiredProvisioning();
-        mEnMgr.notifyUpstream(true);
-        mEnMgr.fakeEntitlementResult = TETHER_ERROR_PROVISIONING_FAILED;
-        mEnMgr.startProvisioningIfNeeded(TETHERING_WIFI, true);
-        mLooper.dispatchAll();
-        assertFalse(mEnMgr.isCellularUpstreamPermitted());
-        mEnMgr.fakeEntitlementResult = TETHER_ERROR_PROVISIONING_FAILED;
-        mEnMgr.startProvisioningIfNeeded(TETHERING_USB, true);
-        mLooper.dispatchAll();
-        assertFalse(mEnMgr.isCellularUpstreamPermitted());
-        mEnMgr.fakeEntitlementResult = TETHER_ERROR_PROVISIONING_FAILED;
-        mEnMgr.startProvisioningIfNeeded(TETHERING_BLUETOOTH, true);
-        mLooper.dispatchAll();
-        assertFalse(mEnMgr.isCellularUpstreamPermitted());
-    }
-
-    @Test
-    public void verifyPermissionIfAnyApproved() {
-        setupForRequiredProvisioning();
-        mEnMgr.notifyUpstream(true);
-        mEnMgr.fakeEntitlementResult = TETHER_ERROR_NO_ERROR;
-        mEnMgr.startProvisioningIfNeeded(TETHERING_WIFI, true);
-        mLooper.dispatchAll();
-        assertTrue(mEnMgr.isCellularUpstreamPermitted());
-        mLooper.dispatchAll();
-        mEnMgr.fakeEntitlementResult = TETHER_ERROR_PROVISIONING_FAILED;
-        mEnMgr.startProvisioningIfNeeded(TETHERING_USB, true);
-        mLooper.dispatchAll();
-        assertTrue(mEnMgr.isCellularUpstreamPermitted());
-        mEnMgr.stopProvisioningIfNeeded(TETHERING_WIFI);
-        mLooper.dispatchAll();
-        assertFalse(mEnMgr.isCellularUpstreamPermitted());
-
-    }
-
-    @Test
-    public void verifyPermissionWhenProvisioningNotStarted() {
-        assertTrue(mEnMgr.isCellularUpstreamPermitted());
-        setupForRequiredProvisioning();
-        assertFalse(mEnMgr.isCellularUpstreamPermitted());
-    }
-
-    @Test
-    public void testRunTetherProvisioning() {
-        setupForRequiredProvisioning();
-        // 1. start ui provisioning, upstream is mobile
-        mEnMgr.fakeEntitlementResult = TETHER_ERROR_NO_ERROR;
-        mEnMgr.notifyUpstream(true);
-        mLooper.dispatchAll();
-        mEnMgr.startProvisioningIfNeeded(TETHERING_USB, true);
-        mLooper.dispatchAll();
-        assertEquals(1, mEnMgr.uiProvisionCount);
-        assertEquals(0, mEnMgr.silentProvisionCount);
-        assertTrue(mEnMgr.isCellularUpstreamPermitted());
-        mEnMgr.reset();
-        // 2. start no-ui provisioning
-        mEnMgr.fakeEntitlementResult = TETHER_ERROR_NO_ERROR;
-        mEnMgr.startProvisioningIfNeeded(TETHERING_WIFI, false);
-        mLooper.dispatchAll();
-        assertEquals(0, mEnMgr.uiProvisionCount);
-        assertEquals(1, mEnMgr.silentProvisionCount);
-        assertTrue(mEnMgr.isCellularUpstreamPermitted());
-        mEnMgr.reset();
-        // 3. tear down mobile, then start ui provisioning
-        mEnMgr.notifyUpstream(false);
-        mLooper.dispatchAll();
-        mEnMgr.startProvisioningIfNeeded(TETHERING_BLUETOOTH, true);
-        mLooper.dispatchAll();
-        assertEquals(0, mEnMgr.uiProvisionCount);
-        assertEquals(0, mEnMgr.silentProvisionCount);
-        mEnMgr.reset();
-        // 4. switch upstream back to mobile
-        mEnMgr.fakeEntitlementResult = TETHER_ERROR_NO_ERROR;
-        mEnMgr.notifyUpstream(true);
-        mLooper.dispatchAll();
-        assertEquals(1, mEnMgr.uiProvisionCount);
-        assertEquals(0, mEnMgr.silentProvisionCount);
-        assertTrue(mEnMgr.isCellularUpstreamPermitted());
-        mEnMgr.reset();
-        // 5. tear down mobile, then switch SIM
-        mEnMgr.notifyUpstream(false);
-        mLooper.dispatchAll();
-        mEnMgr.reevaluateSimCardProvisioning(mConfig);
-        assertEquals(0, mEnMgr.uiProvisionCount);
-        assertEquals(0, mEnMgr.silentProvisionCount);
-        mEnMgr.reset();
-        // 6. switch upstream back to mobile again
-        mEnMgr.fakeEntitlementResult = TETHER_ERROR_PROVISIONING_FAILED;
-        mEnMgr.notifyUpstream(true);
-        mLooper.dispatchAll();
-        assertEquals(0, mEnMgr.uiProvisionCount);
-        assertEquals(3, mEnMgr.silentProvisionCount);
-        assertFalse(mEnMgr.isCellularUpstreamPermitted());
-        mEnMgr.reset();
-        // 7. start ui provisioning, upstream is mobile, downstream is ethernet
-        mEnMgr.fakeEntitlementResult = TETHER_ERROR_NO_ERROR;
-        mEnMgr.startProvisioningIfNeeded(TETHERING_ETHERNET, true);
-        mLooper.dispatchAll();
-        assertEquals(1, mEnMgr.uiProvisionCount);
-        assertEquals(0, mEnMgr.silentProvisionCount);
-        assertTrue(mEnMgr.isCellularUpstreamPermitted());
-        mEnMgr.reset();
-        // 8. downstream is invalid
-        mEnMgr.fakeEntitlementResult = TETHER_ERROR_NO_ERROR;
-        mEnMgr.startProvisioningIfNeeded(TETHERING_WIFI_P2P, true);
-        mLooper.dispatchAll();
-        assertEquals(0, mEnMgr.uiProvisionCount);
-        assertEquals(0, mEnMgr.silentProvisionCount);
-        mEnMgr.reset();
-    }
-
-    @Test
-    public void testCallStopTetheringWhenUiProvisioningFail() {
-        setupForRequiredProvisioning();
-        verify(mEntitlementFailedListener, times(0)).onUiEntitlementFailed(TETHERING_WIFI);
-        mEnMgr.fakeEntitlementResult = TETHER_ERROR_PROVISIONING_FAILED;
-        mEnMgr.notifyUpstream(true);
-        mLooper.dispatchAll();
-        mEnMgr.startProvisioningIfNeeded(TETHERING_WIFI, true);
-        mLooper.dispatchAll();
-        assertEquals(1, mEnMgr.uiProvisionCount);
-        verify(mEntitlementFailedListener, times(1)).onUiEntitlementFailed(TETHERING_WIFI);
-    }
-
-    public class TestStateMachine extends StateMachine {
-        public final ArrayList<Message> messages = new ArrayList<>();
-        private final State
-                mLoggingState = new EntitlementManagerTest.TestStateMachine.LoggingState();
-
-        class LoggingState extends State {
-            @Override public void enter() {
-                messages.clear();
-            }
-
-            @Override public void exit() {
-                messages.clear();
-            }
-
-            @Override public boolean processMessage(Message msg) {
-                messages.add(msg);
-                return false;
-            }
-        }
-
-        public TestStateMachine() {
-            super("EntitlementManagerTest.TestStateMachine", mLooper.getLooper());
-            addState(mLoggingState);
-            setInitialState(mLoggingState);
-            super.start();
-        }
-    }
-}
diff --git a/packages/Tethering/tests/unit/src/com/android/server/connectivity/tethering/IPv6TetheringCoordinatorTest.java b/packages/Tethering/tests/unit/src/com/android/server/connectivity/tethering/IPv6TetheringCoordinatorTest.java
deleted file mode 100644
index 9121243..0000000
--- a/packages/Tethering/tests/unit/src/com/android/server/connectivity/tethering/IPv6TetheringCoordinatorTest.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.connectivity.tethering;
-
-import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
-import static android.net.RouteInfo.RTN_UNICAST;
-import static android.net.ip.IpServer.STATE_LOCAL_ONLY;
-import static android.net.ip.IpServer.STATE_TETHERED;
-
-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.mockito.ArgumentMatchers.anyString;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.reset;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
-import static org.mockito.Mockito.when;
-
-import android.net.InetAddresses;
-import android.net.IpPrefix;
-import android.net.LinkAddress;
-import android.net.LinkProperties;
-import android.net.Network;
-import android.net.NetworkCapabilities;
-import android.net.RouteInfo;
-import android.net.ip.IpServer;
-import android.net.util.SharedLog;
-
-import androidx.test.filters.SmallTest;
-import androidx.test.runner.AndroidJUnit4;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-import java.net.InetAddress;
-import java.util.ArrayList;
-import java.util.List;
-
-@RunWith(AndroidJUnit4.class)
-@SmallTest
-public class IPv6TetheringCoordinatorTest {
-    private static final String TEST_DNS_SERVER = "2001:4860:4860::8888";
-    private static final String TEST_INTERFACE = "test_rmnet0";
-    private static final String TEST_IPV6_ADDRESS = "2001:db8::1/64";
-    private static final String TEST_IPV4_ADDRESS = "192.168.100.1/24";
-
-    private IPv6TetheringCoordinator mIPv6TetheringCoordinator;
-    private ArrayList<IpServer> mNotifyList;
-
-    @Mock private SharedLog mSharedLog;
-
-    @Before
-    public void setUp() throws Exception {
-        MockitoAnnotations.initMocks(this);
-        when(mSharedLog.forSubComponent(anyString())).thenReturn(mSharedLog);
-        mNotifyList = new ArrayList<IpServer>();
-        mIPv6TetheringCoordinator = new IPv6TetheringCoordinator(mNotifyList, mSharedLog);
-    }
-
-    private UpstreamNetworkState createDualStackUpstream(final int transportType) {
-        final Network network = mock(Network.class);
-        final NetworkCapabilities netCap =
-                new NetworkCapabilities.Builder().addTransportType(transportType).build();
-        final InetAddress dns = InetAddresses.parseNumericAddress(TEST_DNS_SERVER);
-        final LinkProperties linkProp = new LinkProperties();
-        linkProp.setInterfaceName(TEST_INTERFACE);
-        linkProp.addLinkAddress(new LinkAddress(TEST_IPV6_ADDRESS));
-        linkProp.addLinkAddress(new LinkAddress(TEST_IPV4_ADDRESS));
-        linkProp.addRoute(new RouteInfo(new IpPrefix("::/0"), null, TEST_INTERFACE, RTN_UNICAST));
-        linkProp.addRoute(new RouteInfo(new IpPrefix("0.0.0.0/0"), null, TEST_INTERFACE,
-                    RTN_UNICAST));
-        linkProp.addDnsServer(dns);
-        return new UpstreamNetworkState(linkProp, netCap, network);
-    }
-
-    private void assertOnlyOneV6AddressAndNoV4(LinkProperties lp) {
-        assertEquals(lp.getInterfaceName(), TEST_INTERFACE);
-        assertFalse(lp.hasIpv4Address());
-        final List<LinkAddress> addresses = lp.getLinkAddresses();
-        assertEquals(addresses.size(), 1);
-        final LinkAddress v6Address = addresses.get(0);
-        assertEquals(v6Address, new LinkAddress(TEST_IPV6_ADDRESS));
-    }
-
-    @Test
-    public void testUpdateIpv6Upstream() throws Exception {
-        // 1. Add first IpServer.
-        final IpServer firstServer = mock(IpServer.class);
-        mNotifyList.add(firstServer);
-        mIPv6TetheringCoordinator.addActiveDownstream(firstServer, STATE_TETHERED);
-        verify(firstServer).sendMessage(IpServer.CMD_IPV6_TETHER_UPDATE, 0, 0, null);
-        verifyNoMoreInteractions(firstServer);
-
-        // 2. Add second IpServer and it would not have ipv6 tethering.
-        final IpServer secondServer = mock(IpServer.class);
-        mNotifyList.add(secondServer);
-        mIPv6TetheringCoordinator.addActiveDownstream(secondServer, STATE_LOCAL_ONLY);
-        verifyNoMoreInteractions(secondServer);
-        reset(firstServer, secondServer);
-
-        // 3. No upstream.
-        mIPv6TetheringCoordinator.updateUpstreamNetworkState(null);
-        verify(secondServer).sendMessage(IpServer.CMD_IPV6_TETHER_UPDATE, 0, 0, null);
-        reset(firstServer, secondServer);
-
-        // 4. Update ipv6 mobile upstream.
-        final UpstreamNetworkState mobileUpstream = createDualStackUpstream(TRANSPORT_CELLULAR);
-        final ArgumentCaptor<LinkProperties> lp = ArgumentCaptor.forClass(LinkProperties.class);
-        mIPv6TetheringCoordinator.updateUpstreamNetworkState(mobileUpstream);
-        verify(firstServer).sendMessage(eq(IpServer.CMD_IPV6_TETHER_UPDATE), eq(0), eq(0),
-                lp.capture());
-        final LinkProperties v6OnlyLink = lp.getValue();
-        assertOnlyOneV6AddressAndNoV4(v6OnlyLink);
-        verifyNoMoreInteractions(firstServer);
-        verifyNoMoreInteractions(secondServer);
-        reset(firstServer, secondServer);
-
-        // 5. Remove first IpServer.
-        mNotifyList.remove(firstServer);
-        mIPv6TetheringCoordinator.removeActiveDownstream(firstServer);
-        verify(firstServer).sendMessage(IpServer.CMD_IPV6_TETHER_UPDATE, 0, 0, null);
-        verify(secondServer).sendMessage(eq(IpServer.CMD_IPV6_TETHER_UPDATE), eq(0), eq(0),
-                lp.capture());
-        final LinkProperties localOnlyLink = lp.getValue();
-        assertNotNull(localOnlyLink);
-        assertNotEquals(localOnlyLink, v6OnlyLink);
-        reset(firstServer, secondServer);
-
-        // 6. Remove second IpServer.
-        mNotifyList.remove(secondServer);
-        mIPv6TetheringCoordinator.removeActiveDownstream(secondServer);
-        verifyNoMoreInteractions(firstServer);
-        verify(secondServer).sendMessage(IpServer.CMD_IPV6_TETHER_UPDATE, 0, 0, null);
-    }
-}
diff --git a/packages/Tethering/tests/unit/src/com/android/server/connectivity/tethering/MockTetheringService.java b/packages/Tethering/tests/unit/src/com/android/server/connectivity/tethering/MockTetheringService.java
deleted file mode 100644
index 355ece9..0000000
--- a/packages/Tethering/tests/unit/src/com/android/server/connectivity/tethering/MockTetheringService.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.server.connectivity.tethering;
-
-import static org.mockito.Mockito.mock;
-
-import android.content.Intent;
-import android.net.ITetheringConnector;
-import android.os.Binder;
-import android.os.IBinder;
-
-public class MockTetheringService extends TetheringService {
-    private final Tethering mTethering = mock(Tethering.class);
-
-    @Override
-    public IBinder onBind(Intent intent) {
-        return new MockTetheringConnector(super.onBind(intent));
-    }
-
-    @Override
-    public Tethering makeTethering(TetheringDependencies deps) {
-        return mTethering;
-    }
-
-    public Tethering getTethering() {
-        return mTethering;
-    }
-
-    public class MockTetheringConnector extends Binder {
-        final IBinder mBase;
-        MockTetheringConnector(IBinder base) {
-            mBase = base;
-        }
-
-        public ITetheringConnector getTetheringConnector() {
-            return ITetheringConnector.Stub.asInterface(mBase);
-        }
-
-        public MockTetheringService getService() {
-            return MockTetheringService.this;
-        }
-    }
-}
diff --git a/packages/Tethering/tests/unit/src/com/android/server/connectivity/tethering/OffloadControllerTest.java b/packages/Tethering/tests/unit/src/com/android/server/connectivity/tethering/OffloadControllerTest.java
deleted file mode 100644
index fe84086..0000000
--- a/packages/Tethering/tests/unit/src/com/android/server/connectivity/tethering/OffloadControllerTest.java
+++ /dev/null
@@ -1,777 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.connectivity.tethering;
-
-import static android.net.NetworkStats.DEFAULT_NETWORK_NO;
-import static android.net.NetworkStats.METERED_NO;
-import static android.net.NetworkStats.ROAMING_NO;
-import static android.net.NetworkStats.SET_DEFAULT;
-import static android.net.NetworkStats.TAG_NONE;
-import static android.net.NetworkStats.UID_ALL;
-import static android.net.NetworkStats.UID_TETHERING;
-import static android.net.RouteInfo.RTN_UNICAST;
-import static android.provider.Settings.Global.TETHER_OFFLOAD_DISABLED;
-
-import static com.android.server.connectivity.tethering.OffloadController.StatsType.STATS_PER_IFACE;
-import static com.android.server.connectivity.tethering.OffloadController.StatsType.STATS_PER_UID;
-import static com.android.server.connectivity.tethering.OffloadHardwareInterface.ForwardedStats;
-import static com.android.testutils.MiscAssertsKt.assertContainsAll;
-import static com.android.testutils.MiscAssertsKt.assertThrows;
-import static com.android.testutils.NetworkStatsUtilsKt.orderInsensitiveEquals;
-
-import static junit.framework.Assert.assertNotNull;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyLong;
-import static org.mockito.Matchers.anyObject;
-import static org.mockito.Matchers.anyString;
-import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.clearInvocations;
-import static org.mockito.Mockito.inOrder;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.reset;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
-import static org.mockito.Mockito.when;
-
-import android.annotation.NonNull;
-import android.app.usage.NetworkStatsManager;
-import android.content.Context;
-import android.content.pm.ApplicationInfo;
-import android.net.ITetheringStatsProvider;
-import android.net.IpPrefix;
-import android.net.LinkAddress;
-import android.net.LinkProperties;
-import android.net.NetworkStats;
-import android.net.NetworkStats.Entry;
-import android.net.RouteInfo;
-import android.net.netstats.provider.INetworkStatsProviderCallback;
-import android.net.util.SharedLog;
-import android.os.Handler;
-import android.os.Looper;
-import android.provider.Settings;
-import android.provider.Settings.SettingNotFoundException;
-import android.test.mock.MockContentResolver;
-
-import androidx.test.filters.SmallTest;
-import androidx.test.runner.AndroidJUnit4;
-
-import com.android.internal.util.test.FakeSettingsProvider;
-import com.android.testutils.HandlerUtilsKt;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.InOrder;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-import java.net.InetAddress;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.Set;
-
-@RunWith(AndroidJUnit4.class)
-@SmallTest
-public class OffloadControllerTest {
-    private static final String RNDIS0 = "test_rndis0";
-    private static final String RMNET0 = "test_rmnet_data0";
-    private static final String WLAN0 = "test_wlan0";
-
-    private static final String IPV6_LINKLOCAL = "fe80::/64";
-    private static final String IPV6_DOC_PREFIX = "2001:db8::/64";
-    private static final String IPV6_DISCARD_PREFIX = "100::/64";
-    private static final String USB_PREFIX = "192.168.42.0/24";
-    private static final String WIFI_PREFIX = "192.168.43.0/24";
-    private static final long WAIT_FOR_IDLE_TIMEOUT = 2 * 1000;
-
-    @Mock private OffloadHardwareInterface mHardware;
-    @Mock private ApplicationInfo mApplicationInfo;
-    @Mock private Context mContext;
-    @Mock private NetworkStatsManager mStatsManager;
-    @Mock private INetworkStatsProviderCallback mTetherStatsProviderCb;
-    private OffloadController.OffloadTetheringStatsProvider mTetherStatsProvider;
-    private final ArgumentCaptor<ArrayList> mStringArrayCaptor =
-            ArgumentCaptor.forClass(ArrayList.class);
-    private final ArgumentCaptor<OffloadHardwareInterface.ControlCallback> mControlCallbackCaptor =
-            ArgumentCaptor.forClass(OffloadHardwareInterface.ControlCallback.class);
-    private MockContentResolver mContentResolver;
-
-    @Before public void setUp() {
-        MockitoAnnotations.initMocks(this);
-        when(mContext.getApplicationInfo()).thenReturn(mApplicationInfo);
-        when(mContext.getPackageName()).thenReturn("OffloadControllerTest");
-        mContentResolver = new MockContentResolver(mContext);
-        mContentResolver.addProvider(Settings.AUTHORITY, new FakeSettingsProvider());
-        when(mContext.getContentResolver()).thenReturn(mContentResolver);
-        FakeSettingsProvider.clearSettingsProvider();
-    }
-
-    @After public void tearDown() throws Exception {
-        FakeSettingsProvider.clearSettingsProvider();
-    }
-
-    private void setupFunctioningHardwareInterface() {
-        when(mHardware.initOffloadConfig()).thenReturn(true);
-        when(mHardware.initOffloadControl(mControlCallbackCaptor.capture()))
-                .thenReturn(true);
-        when(mHardware.setUpstreamParameters(anyString(), any(), any(), any())).thenReturn(true);
-        when(mHardware.getForwardedStats(any())).thenReturn(new ForwardedStats());
-        when(mHardware.setDataLimit(anyString(), anyLong())).thenReturn(true);
-    }
-
-    private void enableOffload() {
-        Settings.Global.putInt(mContentResolver, TETHER_OFFLOAD_DISABLED, 0);
-    }
-
-    private void waitForIdle() {
-        HandlerUtilsKt.waitForIdle(new Handler(Looper.getMainLooper()), WAIT_FOR_IDLE_TIMEOUT);
-    }
-
-    private OffloadController makeOffloadController() throws Exception {
-        OffloadController offload = new OffloadController(new Handler(Looper.getMainLooper()),
-                mHardware, mContentResolver, mStatsManager, new SharedLog("test"));
-        final ArgumentCaptor<OffloadController.OffloadTetheringStatsProvider>
-                tetherStatsProviderCaptor =
-                ArgumentCaptor.forClass(OffloadController.OffloadTetheringStatsProvider.class);
-        verify(mStatsManager).registerNetworkStatsProvider(anyString(),
-                tetherStatsProviderCaptor.capture());
-        mTetherStatsProvider = tetherStatsProviderCaptor.getValue();
-        assertNotNull(mTetherStatsProvider);
-        mTetherStatsProvider.setProviderCallbackBinder(mTetherStatsProviderCb);
-        return offload;
-    }
-
-    @Test
-    public void testNoSettingsValueDefaultDisabledDoesNotStart() throws Exception {
-        setupFunctioningHardwareInterface();
-        when(mHardware.getDefaultTetherOffloadDisabled()).thenReturn(1);
-        assertThrows(SettingNotFoundException.class, () ->
-                Settings.Global.getInt(mContentResolver, TETHER_OFFLOAD_DISABLED));
-
-        final OffloadController offload = makeOffloadController();
-        offload.start();
-
-        final InOrder inOrder = inOrder(mHardware);
-        inOrder.verify(mHardware, times(1)).getDefaultTetherOffloadDisabled();
-        inOrder.verify(mHardware, never()).initOffloadConfig();
-        inOrder.verify(mHardware, never()).initOffloadControl(
-                any(OffloadHardwareInterface.ControlCallback.class));
-        inOrder.verifyNoMoreInteractions();
-    }
-
-    @Test
-    public void testNoSettingsValueDefaultEnabledDoesStart() throws Exception {
-        setupFunctioningHardwareInterface();
-        when(mHardware.getDefaultTetherOffloadDisabled()).thenReturn(0);
-        assertThrows(SettingNotFoundException.class, () ->
-                Settings.Global.getInt(mContentResolver, TETHER_OFFLOAD_DISABLED));
-
-        final OffloadController offload = makeOffloadController();
-        offload.start();
-
-        final InOrder inOrder = inOrder(mHardware);
-        inOrder.verify(mHardware, times(1)).getDefaultTetherOffloadDisabled();
-        inOrder.verify(mHardware, times(1)).initOffloadConfig();
-        inOrder.verify(mHardware, times(1)).initOffloadControl(
-                any(OffloadHardwareInterface.ControlCallback.class));
-        inOrder.verifyNoMoreInteractions();
-    }
-
-    @Test
-    public void testSettingsAllowsStart() throws Exception {
-        setupFunctioningHardwareInterface();
-        Settings.Global.putInt(mContentResolver, TETHER_OFFLOAD_DISABLED, 0);
-
-        final OffloadController offload = makeOffloadController();
-        offload.start();
-
-        final InOrder inOrder = inOrder(mHardware);
-        inOrder.verify(mHardware, times(1)).getDefaultTetherOffloadDisabled();
-        inOrder.verify(mHardware, times(1)).initOffloadConfig();
-        inOrder.verify(mHardware, times(1)).initOffloadControl(
-                any(OffloadHardwareInterface.ControlCallback.class));
-        inOrder.verifyNoMoreInteractions();
-    }
-
-    @Test
-    public void testSettingsDisablesStart() throws Exception {
-        setupFunctioningHardwareInterface();
-        Settings.Global.putInt(mContentResolver, TETHER_OFFLOAD_DISABLED, 1);
-
-        final OffloadController offload = makeOffloadController();
-        offload.start();
-
-        final InOrder inOrder = inOrder(mHardware);
-        inOrder.verify(mHardware, times(1)).getDefaultTetherOffloadDisabled();
-        inOrder.verify(mHardware, never()).initOffloadConfig();
-        inOrder.verify(mHardware, never()).initOffloadControl(anyObject());
-        inOrder.verifyNoMoreInteractions();
-    }
-
-    @Test
-    public void testSetUpstreamLinkPropertiesWorking() throws Exception {
-        setupFunctioningHardwareInterface();
-        enableOffload();
-
-        final OffloadController offload = makeOffloadController();
-        offload.start();
-
-        final InOrder inOrder = inOrder(mHardware);
-        inOrder.verify(mHardware, times(1)).getDefaultTetherOffloadDisabled();
-        inOrder.verify(mHardware, times(1)).initOffloadConfig();
-        inOrder.verify(mHardware, times(1)).initOffloadControl(
-                any(OffloadHardwareInterface.ControlCallback.class));
-        inOrder.verifyNoMoreInteractions();
-
-        // In reality, the UpstreamNetworkMonitor would have passed down to us
-        // a covering set of local prefixes representing a minimum essential
-        // set plus all the prefixes on networks with network agents.
-        //
-        // We simulate that there, and then add upstream elements one by one
-        // and watch what happens.
-        final Set<IpPrefix> minimumLocalPrefixes = new HashSet<>();
-        for (String s : new String[]{
-                "127.0.0.0/8", "192.0.2.0/24", "fe80::/64", "2001:db8::/64"}) {
-            minimumLocalPrefixes.add(new IpPrefix(s));
-        }
-        offload.setLocalPrefixes(minimumLocalPrefixes);
-        inOrder.verify(mHardware, times(1)).setLocalPrefixes(mStringArrayCaptor.capture());
-        ArrayList<String> localPrefixes = mStringArrayCaptor.getValue();
-        assertEquals(4, localPrefixes.size());
-        assertContainsAll(localPrefixes,
-                "127.0.0.0/8", "192.0.2.0/24", "fe80::/64", "2001:db8::/64");
-        inOrder.verifyNoMoreInteractions();
-
-        offload.setUpstreamLinkProperties(null);
-        // No change in local addresses means no call to setLocalPrefixes().
-        inOrder.verify(mHardware, never()).setLocalPrefixes(mStringArrayCaptor.capture());
-        // This LinkProperties value does not differ from the default upstream.
-        // There should be no extraneous call to setUpstreamParameters().
-        inOrder.verify(mHardware, never()).setUpstreamParameters(
-                anyObject(), anyObject(), anyObject(), anyObject());
-        inOrder.verifyNoMoreInteractions();
-
-        final LinkProperties lp = new LinkProperties();
-
-        final String testIfName = "rmnet_data17";
-        lp.setInterfaceName(testIfName);
-        offload.setUpstreamLinkProperties(lp);
-        // No change in local addresses means no call to setLocalPrefixes().
-        inOrder.verify(mHardware, never()).setLocalPrefixes(mStringArrayCaptor.capture());
-        inOrder.verify(mHardware, times(1)).setUpstreamParameters(
-                eq(testIfName), eq(null), eq(null), eq(null));
-        inOrder.verify(mHardware, times(1)).setDataLimit(eq(testIfName), eq(Long.MAX_VALUE));
-        inOrder.verifyNoMoreInteractions();
-
-        final String ipv4Addr = "192.0.2.5";
-        final String linkAddr = ipv4Addr + "/24";
-        lp.addLinkAddress(new LinkAddress(linkAddr));
-        lp.addRoute(new RouteInfo(new IpPrefix("192.0.2.0/24"), null, null, RTN_UNICAST));
-        offload.setUpstreamLinkProperties(lp);
-        // IPv4 prefixes and addresses on the upstream are simply left as whole
-        // prefixes (already passed in from UpstreamNetworkMonitor code). If a
-        // tethering client sends traffic to the IPv4 default router or other
-        // clients on the upstream this will not be hardware-forwarded, and that
-        // should be fine for now. Ergo: no change in local addresses, no call
-        // to setLocalPrefixes().
-        inOrder.verify(mHardware, never()).setLocalPrefixes(mStringArrayCaptor.capture());
-        inOrder.verify(mHardware, times(1)).setUpstreamParameters(
-                eq(testIfName), eq(ipv4Addr), eq(null), eq(null));
-        inOrder.verify(mHardware, times(1)).getForwardedStats(eq(testIfName));
-        inOrder.verify(mHardware, times(1)).setDataLimit(eq(testIfName), eq(Long.MAX_VALUE));
-        inOrder.verifyNoMoreInteractions();
-
-        final String ipv4Gateway = "192.0.2.1";
-        lp.addRoute(new RouteInfo(null, InetAddress.getByName(ipv4Gateway), null, RTN_UNICAST));
-        offload.setUpstreamLinkProperties(lp);
-        // No change in local addresses means no call to setLocalPrefixes().
-        inOrder.verify(mHardware, never()).setLocalPrefixes(mStringArrayCaptor.capture());
-        inOrder.verify(mHardware, times(1)).setUpstreamParameters(
-                eq(testIfName), eq(ipv4Addr), eq(ipv4Gateway), eq(null));
-        inOrder.verify(mHardware, times(1)).getForwardedStats(eq(testIfName));
-        inOrder.verify(mHardware, times(1)).setDataLimit(eq(testIfName), eq(Long.MAX_VALUE));
-        inOrder.verifyNoMoreInteractions();
-
-        final String ipv6Gw1 = "fe80::cafe";
-        lp.addRoute(new RouteInfo(null, InetAddress.getByName(ipv6Gw1), null, RTN_UNICAST));
-        offload.setUpstreamLinkProperties(lp);
-        // No change in local addresses means no call to setLocalPrefixes().
-        inOrder.verify(mHardware, never()).setLocalPrefixes(mStringArrayCaptor.capture());
-        inOrder.verify(mHardware, times(1)).setUpstreamParameters(
-                eq(testIfName), eq(ipv4Addr), eq(ipv4Gateway), mStringArrayCaptor.capture());
-        inOrder.verify(mHardware, times(1)).getForwardedStats(eq(testIfName));
-        ArrayList<String> v6gws = mStringArrayCaptor.getValue();
-        assertEquals(1, v6gws.size());
-        assertTrue(v6gws.contains(ipv6Gw1));
-        inOrder.verify(mHardware, times(1)).setDataLimit(eq(testIfName), eq(Long.MAX_VALUE));
-        inOrder.verifyNoMoreInteractions();
-
-        final String ipv6Gw2 = "fe80::d00d";
-        lp.addRoute(new RouteInfo(null, InetAddress.getByName(ipv6Gw2), null, RTN_UNICAST));
-        offload.setUpstreamLinkProperties(lp);
-        // No change in local addresses means no call to setLocalPrefixes().
-        inOrder.verify(mHardware, never()).setLocalPrefixes(mStringArrayCaptor.capture());
-        inOrder.verify(mHardware, times(1)).setUpstreamParameters(
-                eq(testIfName), eq(ipv4Addr), eq(ipv4Gateway), mStringArrayCaptor.capture());
-        inOrder.verify(mHardware, times(1)).getForwardedStats(eq(testIfName));
-        v6gws = mStringArrayCaptor.getValue();
-        assertEquals(2, v6gws.size());
-        assertTrue(v6gws.contains(ipv6Gw1));
-        assertTrue(v6gws.contains(ipv6Gw2));
-        inOrder.verify(mHardware, times(1)).setDataLimit(eq(testIfName), eq(Long.MAX_VALUE));
-        inOrder.verifyNoMoreInteractions();
-
-        final LinkProperties stacked = new LinkProperties();
-        stacked.setInterfaceName("stacked");
-        stacked.addLinkAddress(new LinkAddress("192.0.2.129/25"));
-        stacked.addRoute(new RouteInfo(null, InetAddress.getByName("192.0.2.254"), null,
-                  RTN_UNICAST));
-        stacked.addRoute(new RouteInfo(null, InetAddress.getByName("fe80::bad:f00"), null,
-                  RTN_UNICAST));
-        assertTrue(lp.addStackedLink(stacked));
-        offload.setUpstreamLinkProperties(lp);
-        // No change in local addresses means no call to setLocalPrefixes().
-        inOrder.verify(mHardware, never()).setLocalPrefixes(mStringArrayCaptor.capture());
-        inOrder.verify(mHardware, times(1)).setUpstreamParameters(
-                eq(testIfName), eq(ipv4Addr), eq(ipv4Gateway), mStringArrayCaptor.capture());
-        inOrder.verify(mHardware, times(1)).getForwardedStats(eq(testIfName));
-        v6gws = mStringArrayCaptor.getValue();
-        assertEquals(2, v6gws.size());
-        assertTrue(v6gws.contains(ipv6Gw1));
-        assertTrue(v6gws.contains(ipv6Gw2));
-        inOrder.verify(mHardware, times(1)).setDataLimit(eq(testIfName), eq(Long.MAX_VALUE));
-        inOrder.verifyNoMoreInteractions();
-
-        // Add in some IPv6 upstream info. When there is a tethered downstream
-        // making use of the IPv6 prefix we would expect to see the /64 route
-        // removed from "local prefixes" and /128s added for the upstream IPv6
-        // addresses.  This is not yet implemented, and for now we simply
-        // expect to see these /128s.
-        lp.addRoute(new RouteInfo(new IpPrefix("2001:db8::/64"), null, null, RTN_UNICAST));
-        // "2001:db8::/64" plus "assigned" ASCII in hex
-        lp.addLinkAddress(new LinkAddress("2001:db8::6173:7369:676e:6564/64"));
-        // "2001:db8::/64" plus "random" ASCII in hex
-        lp.addLinkAddress(new LinkAddress("2001:db8::7261:6e64:6f6d/64"));
-        offload.setUpstreamLinkProperties(lp);
-        inOrder.verify(mHardware, times(1)).setLocalPrefixes(mStringArrayCaptor.capture());
-        localPrefixes = mStringArrayCaptor.getValue();
-        assertEquals(6, localPrefixes.size());
-        assertContainsAll(localPrefixes,
-                "127.0.0.0/8", "192.0.2.0/24", "fe80::/64", "2001:db8::/64",
-                "2001:db8::6173:7369:676e:6564/128", "2001:db8::7261:6e64:6f6d/128");
-        // The relevant parts of the LinkProperties have not changed, but at the
-        // moment we do not de-dup upstream LinkProperties this carefully.
-        inOrder.verify(mHardware, times(1)).setUpstreamParameters(
-                eq(testIfName), eq(ipv4Addr), eq(ipv4Gateway), mStringArrayCaptor.capture());
-        v6gws = mStringArrayCaptor.getValue();
-        assertEquals(2, v6gws.size());
-        assertTrue(v6gws.contains(ipv6Gw1));
-        assertTrue(v6gws.contains(ipv6Gw2));
-        inOrder.verify(mHardware, times(1)).getForwardedStats(eq(testIfName));
-        inOrder.verify(mHardware, times(1)).setDataLimit(eq(testIfName), eq(Long.MAX_VALUE));
-        inOrder.verifyNoMoreInteractions();
-
-        // Completely identical LinkProperties updates are de-duped.
-        offload.setUpstreamLinkProperties(lp);
-        // This LinkProperties value does not differ from the default upstream.
-        // There should be no extraneous call to setUpstreamParameters().
-        inOrder.verify(mHardware, never()).setUpstreamParameters(
-                anyObject(), anyObject(), anyObject(), anyObject());
-        inOrder.verifyNoMoreInteractions();
-    }
-
-    private static @NonNull Entry buildTestEntry(@NonNull OffloadController.StatsType how,
-            @NonNull String iface, long rxBytes, long txBytes) {
-        return new Entry(iface, how == STATS_PER_IFACE ? UID_ALL : UID_TETHERING, SET_DEFAULT,
-                TAG_NONE, METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO, rxBytes, 0L,
-                txBytes, 0L, 0L);
-    }
-
-    @Test
-    public void testGetForwardedStats() throws Exception {
-        setupFunctioningHardwareInterface();
-        enableOffload();
-
-        final OffloadController offload = makeOffloadController();
-        offload.start();
-
-        final String ethernetIface = "eth1";
-        final String mobileIface = "rmnet_data0";
-
-        when(mHardware.getForwardedStats(eq(ethernetIface))).thenReturn(
-                new ForwardedStats(12345, 54321));
-        when(mHardware.getForwardedStats(eq(mobileIface))).thenReturn(
-                new ForwardedStats(999, 99999));
-
-        InOrder inOrder = inOrder(mHardware);
-
-        final LinkProperties lp = new LinkProperties();
-        lp.setInterfaceName(ethernetIface);
-        offload.setUpstreamLinkProperties(lp);
-        // Previous upstream was null, so no stats are fetched.
-        inOrder.verify(mHardware, never()).getForwardedStats(any());
-
-        lp.setInterfaceName(mobileIface);
-        offload.setUpstreamLinkProperties(lp);
-        // Expect that we fetch stats from the previous upstream.
-        inOrder.verify(mHardware, times(1)).getForwardedStats(eq(ethernetIface));
-
-        lp.setInterfaceName(ethernetIface);
-        offload.setUpstreamLinkProperties(lp);
-        // Expect that we fetch stats from the previous upstream.
-        inOrder.verify(mHardware, times(1)).getForwardedStats(eq(mobileIface));
-
-        // Verify that the fetched stats are stored.
-        final NetworkStats ifaceStats = mTetherStatsProvider.getTetherStats(STATS_PER_IFACE);
-        final NetworkStats uidStats = mTetherStatsProvider.getTetherStats(STATS_PER_UID);
-        final NetworkStats expectedIfaceStats = new NetworkStats(0L, 2)
-                .addEntry(buildTestEntry(STATS_PER_IFACE, mobileIface, 999, 99999))
-                .addEntry(buildTestEntry(STATS_PER_IFACE, ethernetIface, 12345, 54321));
-
-        final NetworkStats expectedUidStats = new NetworkStats(0L, 2)
-                .addEntry(buildTestEntry(STATS_PER_UID, mobileIface, 999, 99999))
-                .addEntry(buildTestEntry(STATS_PER_UID, ethernetIface, 12345, 54321));
-
-        assertTrue(orderInsensitiveEquals(expectedIfaceStats, ifaceStats));
-        assertTrue(orderInsensitiveEquals(expectedUidStats, uidStats));
-
-        final ArgumentCaptor<NetworkStats> ifaceStatsCaptor = ArgumentCaptor.forClass(
-                NetworkStats.class);
-        final ArgumentCaptor<NetworkStats> uidStatsCaptor = ArgumentCaptor.forClass(
-                NetworkStats.class);
-
-        // Force pushing stats update to verify the stats reported.
-        mTetherStatsProvider.pushTetherStats();
-        verify(mTetherStatsProviderCb, times(1))
-                .notifyStatsUpdated(anyInt(), ifaceStatsCaptor.capture(), uidStatsCaptor.capture());
-        assertTrue(orderInsensitiveEquals(expectedIfaceStats, ifaceStatsCaptor.getValue()));
-        assertTrue(orderInsensitiveEquals(expectedUidStats, uidStatsCaptor.getValue()));
-
-        when(mHardware.getForwardedStats(eq(ethernetIface))).thenReturn(
-                new ForwardedStats(100000, 100000));
-        offload.setUpstreamLinkProperties(null);
-        // Expect that we first clear the HAL's upstream parameters.
-        inOrder.verify(mHardware, times(1)).setUpstreamParameters(
-                eq(""), eq("0.0.0.0"), eq("0.0.0.0"), eq(null));
-        // Expect that we fetch stats from the previous upstream.
-        inOrder.verify(mHardware, times(1)).getForwardedStats(eq(ethernetIface));
-
-        // There is no current upstream, so no stats are fetched.
-        inOrder.verify(mHardware, never()).getForwardedStats(any());
-        inOrder.verifyNoMoreInteractions();
-
-        // Verify that the stored stats is accumulated.
-        final NetworkStats ifaceStatsAccu = mTetherStatsProvider.getTetherStats(STATS_PER_IFACE);
-        final NetworkStats uidStatsAccu = mTetherStatsProvider.getTetherStats(STATS_PER_UID);
-        final NetworkStats expectedIfaceStatsAccu = new NetworkStats(0L, 2)
-                .addEntry(buildTestEntry(STATS_PER_IFACE, mobileIface, 999, 99999))
-                .addEntry(buildTestEntry(STATS_PER_IFACE, ethernetIface, 112345, 154321));
-
-        final NetworkStats expectedUidStatsAccu = new NetworkStats(0L, 2)
-                .addEntry(buildTestEntry(STATS_PER_UID, mobileIface, 999, 99999))
-                .addEntry(buildTestEntry(STATS_PER_UID, ethernetIface, 112345, 154321));
-
-        assertTrue(orderInsensitiveEquals(expectedIfaceStatsAccu, ifaceStatsAccu));
-        assertTrue(orderInsensitiveEquals(expectedUidStatsAccu, uidStatsAccu));
-
-        // Verify that only diff of stats is reported.
-        reset(mTetherStatsProviderCb);
-        mTetherStatsProvider.pushTetherStats();
-        final NetworkStats expectedIfaceStatsDiff = new NetworkStats(0L, 2)
-                .addEntry(buildTestEntry(STATS_PER_IFACE, mobileIface, 0, 0))
-                .addEntry(buildTestEntry(STATS_PER_IFACE, ethernetIface, 100000, 100000));
-
-        final NetworkStats expectedUidStatsDiff = new NetworkStats(0L, 2)
-                .addEntry(buildTestEntry(STATS_PER_UID, mobileIface, 0, 0))
-                .addEntry(buildTestEntry(STATS_PER_UID, ethernetIface, 100000, 100000));
-        verify(mTetherStatsProviderCb, times(1))
-                .notifyStatsUpdated(anyInt(), ifaceStatsCaptor.capture(), uidStatsCaptor.capture());
-        assertTrue(orderInsensitiveEquals(expectedIfaceStatsDiff, ifaceStatsCaptor.getValue()));
-        assertTrue(orderInsensitiveEquals(expectedUidStatsDiff, uidStatsCaptor.getValue()));
-    }
-
-    @Test
-    public void testSetInterfaceQuota() throws Exception {
-        setupFunctioningHardwareInterface();
-        enableOffload();
-
-        final OffloadController offload = makeOffloadController();
-        offload.start();
-
-        final String ethernetIface = "eth1";
-        final String mobileIface = "rmnet_data0";
-        final long ethernetLimit = 12345;
-        final long mobileLimit = 12345678;
-
-        final LinkProperties lp = new LinkProperties();
-        lp.setInterfaceName(ethernetIface);
-        offload.setUpstreamLinkProperties(lp);
-
-        final InOrder inOrder = inOrder(mHardware);
-        when(mHardware.setUpstreamParameters(any(), any(), any(), any())).thenReturn(true);
-        when(mHardware.setDataLimit(anyString(), anyLong())).thenReturn(true);
-
-        // Applying an interface quota to the current upstream immediately sends it to the hardware.
-        mTetherStatsProvider.onSetLimit(ethernetIface, ethernetLimit);
-        waitForIdle();
-        inOrder.verify(mHardware).setDataLimit(ethernetIface, ethernetLimit);
-        inOrder.verifyNoMoreInteractions();
-
-        // Applying an interface quota to another upstream does not take any immediate action.
-        mTetherStatsProvider.onSetLimit(mobileIface, mobileLimit);
-        waitForIdle();
-        inOrder.verify(mHardware, never()).setDataLimit(anyString(), anyLong());
-
-        // Switching to that upstream causes the quota to be applied if the parameters were applied
-        // correctly.
-        lp.setInterfaceName(mobileIface);
-        offload.setUpstreamLinkProperties(lp);
-        waitForIdle();
-        inOrder.verify(mHardware).setDataLimit(mobileIface, mobileLimit);
-
-        // Setting a limit of ITetheringStatsProvider.QUOTA_UNLIMITED causes the limit to be set
-        // to Long.MAX_VALUE.
-        mTetherStatsProvider.onSetLimit(mobileIface, ITetheringStatsProvider.QUOTA_UNLIMITED);
-        waitForIdle();
-        inOrder.verify(mHardware).setDataLimit(mobileIface, Long.MAX_VALUE);
-
-        // If setting upstream parameters fails, then the data limit is not set.
-        when(mHardware.setUpstreamParameters(any(), any(), any(), any())).thenReturn(false);
-        lp.setInterfaceName(ethernetIface);
-        offload.setUpstreamLinkProperties(lp);
-        mTetherStatsProvider.onSetLimit(mobileIface, mobileLimit);
-        waitForIdle();
-        inOrder.verify(mHardware, never()).setDataLimit(anyString(), anyLong());
-
-        // If setting the data limit fails while changing upstreams, offload is stopped.
-        when(mHardware.setUpstreamParameters(any(), any(), any(), any())).thenReturn(true);
-        when(mHardware.setDataLimit(anyString(), anyLong())).thenReturn(false);
-        lp.setInterfaceName(mobileIface);
-        offload.setUpstreamLinkProperties(lp);
-        mTetherStatsProvider.onSetLimit(mobileIface, mobileLimit);
-        waitForIdle();
-        inOrder.verify(mHardware).getForwardedStats(ethernetIface);
-        inOrder.verify(mHardware).stopOffloadControl();
-    }
-
-    @Test
-    public void testDataLimitCallback() throws Exception {
-        setupFunctioningHardwareInterface();
-        enableOffload();
-
-        final OffloadController offload = makeOffloadController();
-        offload.start();
-
-        OffloadHardwareInterface.ControlCallback callback = mControlCallbackCaptor.getValue();
-        callback.onStoppedLimitReached();
-        verify(mTetherStatsProviderCb, times(1)).notifyStatsUpdated(anyInt(), any(), any());
-    }
-
-    @Test
-    public void testAddRemoveDownstreams() throws Exception {
-        setupFunctioningHardwareInterface();
-        enableOffload();
-
-        final OffloadController offload = makeOffloadController();
-        offload.start();
-
-        final InOrder inOrder = inOrder(mHardware);
-        inOrder.verify(mHardware, times(1)).initOffloadConfig();
-        inOrder.verify(mHardware, times(1)).initOffloadControl(
-                any(OffloadHardwareInterface.ControlCallback.class));
-        inOrder.verifyNoMoreInteractions();
-
-        // Tethering makes several calls to setLocalPrefixes() before add/remove
-        // downstream calls are made. This is not tested here; only the behavior
-        // of notifyDownstreamLinkProperties() and removeDownstreamInterface()
-        // are tested.
-
-        // [1] USB tethering is started.
-        final LinkProperties usbLinkProperties = new LinkProperties();
-        usbLinkProperties.setInterfaceName(RNDIS0);
-        usbLinkProperties.addLinkAddress(new LinkAddress("192.168.42.1/24"));
-        usbLinkProperties.addRoute(
-                new RouteInfo(new IpPrefix(USB_PREFIX), null, null, RTN_UNICAST));
-        offload.notifyDownstreamLinkProperties(usbLinkProperties);
-        inOrder.verify(mHardware, times(1)).addDownstreamPrefix(RNDIS0, USB_PREFIX);
-        inOrder.verifyNoMoreInteractions();
-
-        // [2] Routes for IPv6 link-local prefixes should never be added.
-        usbLinkProperties.addRoute(
-                new RouteInfo(new IpPrefix(IPV6_LINKLOCAL), null, null, RTN_UNICAST));
-        offload.notifyDownstreamLinkProperties(usbLinkProperties);
-        inOrder.verify(mHardware, never()).addDownstreamPrefix(eq(RNDIS0), anyString());
-        inOrder.verifyNoMoreInteractions();
-
-        // [3] Add an IPv6 prefix for good measure. Only new offload-able
-        // prefixes should be passed to the HAL.
-        usbLinkProperties.addLinkAddress(new LinkAddress("2001:db8::1/64"));
-        usbLinkProperties.addRoute(
-                new RouteInfo(new IpPrefix(IPV6_DOC_PREFIX), null, null, RTN_UNICAST));
-        offload.notifyDownstreamLinkProperties(usbLinkProperties);
-        inOrder.verify(mHardware, times(1)).addDownstreamPrefix(RNDIS0, IPV6_DOC_PREFIX);
-        inOrder.verifyNoMoreInteractions();
-
-        // [4] Adding addresses doesn't affect notifyDownstreamLinkProperties().
-        // The address is passed in by a separate setLocalPrefixes() invocation.
-        usbLinkProperties.addLinkAddress(new LinkAddress("2001:db8::2/64"));
-        offload.notifyDownstreamLinkProperties(usbLinkProperties);
-        inOrder.verify(mHardware, never()).addDownstreamPrefix(eq(RNDIS0), anyString());
-
-        // [5] Differences in local routes are converted into addDownstream()
-        // and removeDownstream() invocations accordingly.
-        usbLinkProperties.removeRoute(
-                new RouteInfo(new IpPrefix(IPV6_DOC_PREFIX), null, RNDIS0, RTN_UNICAST));
-        usbLinkProperties.addRoute(
-                new RouteInfo(new IpPrefix(IPV6_DISCARD_PREFIX), null, null, RTN_UNICAST));
-        offload.notifyDownstreamLinkProperties(usbLinkProperties);
-        inOrder.verify(mHardware, times(1)).removeDownstreamPrefix(RNDIS0, IPV6_DOC_PREFIX);
-        inOrder.verify(mHardware, times(1)).addDownstreamPrefix(RNDIS0, IPV6_DISCARD_PREFIX);
-        inOrder.verifyNoMoreInteractions();
-
-        // [6] Removing a downstream interface which was never added causes no
-        // interactions with the HAL.
-        offload.removeDownstreamInterface(WLAN0);
-        inOrder.verifyNoMoreInteractions();
-
-        // [7] Removing an active downstream removes all remaining prefixes.
-        offload.removeDownstreamInterface(RNDIS0);
-        inOrder.verify(mHardware, times(1)).removeDownstreamPrefix(RNDIS0, USB_PREFIX);
-        inOrder.verify(mHardware, times(1)).removeDownstreamPrefix(RNDIS0, IPV6_DISCARD_PREFIX);
-        inOrder.verifyNoMoreInteractions();
-    }
-
-    @Test
-    public void testControlCallbackOnStoppedUnsupportedFetchesAllStats() throws Exception {
-        setupFunctioningHardwareInterface();
-        enableOffload();
-
-        final OffloadController offload = makeOffloadController();
-        offload.start();
-
-        // Pretend to set a few different upstreams (only the interface name
-        // matters for this test; we're ignoring IP and route information).
-        final LinkProperties upstreamLp = new LinkProperties();
-        for (String ifname : new String[]{RMNET0, WLAN0, RMNET0}) {
-            upstreamLp.setInterfaceName(ifname);
-            offload.setUpstreamLinkProperties(upstreamLp);
-        }
-
-        // Clear invocation history, especially the getForwardedStats() calls
-        // that happen with setUpstreamParameters().
-        clearInvocations(mHardware);
-
-        OffloadHardwareInterface.ControlCallback callback = mControlCallbackCaptor.getValue();
-        callback.onStoppedUnsupported();
-
-        // Verify forwarded stats behaviour.
-        verify(mHardware, times(1)).getForwardedStats(eq(RMNET0));
-        verify(mHardware, times(1)).getForwardedStats(eq(WLAN0));
-        // TODO: verify the exact stats reported.
-        verify(mTetherStatsProviderCb, times(1)).notifyStatsUpdated(anyInt(), any(), any());
-        verifyNoMoreInteractions(mTetherStatsProviderCb);
-        verifyNoMoreInteractions(mHardware);
-    }
-
-    @Test
-    public void testControlCallbackOnSupportAvailableFetchesAllStatsAndPushesAllParameters()
-            throws Exception {
-        setupFunctioningHardwareInterface();
-        enableOffload();
-
-        final OffloadController offload = makeOffloadController();
-        offload.start();
-
-        // Pretend to set a few different upstreams (only the interface name
-        // matters for this test; we're ignoring IP and route information).
-        final LinkProperties upstreamLp = new LinkProperties();
-        for (String ifname : new String[]{RMNET0, WLAN0, RMNET0}) {
-            upstreamLp.setInterfaceName(ifname);
-            offload.setUpstreamLinkProperties(upstreamLp);
-        }
-
-        // Pretend that some local prefixes and downstreams have been added
-        // (and removed, for good measure).
-        final Set<IpPrefix> minimumLocalPrefixes = new HashSet<>();
-        for (String s : new String[]{
-                "127.0.0.0/8", "192.0.2.0/24", "fe80::/64", "2001:db8::/64"}) {
-            minimumLocalPrefixes.add(new IpPrefix(s));
-        }
-        offload.setLocalPrefixes(minimumLocalPrefixes);
-
-        final LinkProperties usbLinkProperties = new LinkProperties();
-        usbLinkProperties.setInterfaceName(RNDIS0);
-        usbLinkProperties.addLinkAddress(new LinkAddress("192.168.42.1/24"));
-        usbLinkProperties.addRoute(
-                new RouteInfo(new IpPrefix(USB_PREFIX), null, null, RTN_UNICAST));
-        offload.notifyDownstreamLinkProperties(usbLinkProperties);
-
-        final LinkProperties wifiLinkProperties = new LinkProperties();
-        wifiLinkProperties.setInterfaceName(WLAN0);
-        wifiLinkProperties.addLinkAddress(new LinkAddress("192.168.43.1/24"));
-        wifiLinkProperties.addRoute(
-                new RouteInfo(new IpPrefix(WIFI_PREFIX), null, null, RTN_UNICAST));
-        wifiLinkProperties.addRoute(
-                new RouteInfo(new IpPrefix(IPV6_LINKLOCAL), null, null, RTN_UNICAST));
-        // Use a benchmark prefix (RFC 5180 + erratum), since the documentation
-        // prefix is included in the excluded prefix list.
-        wifiLinkProperties.addLinkAddress(new LinkAddress("2001:2::1/64"));
-        wifiLinkProperties.addLinkAddress(new LinkAddress("2001:2::2/64"));
-        wifiLinkProperties.addRoute(
-                new RouteInfo(new IpPrefix("2001:2::/64"), null, null, RTN_UNICAST));
-        offload.notifyDownstreamLinkProperties(wifiLinkProperties);
-
-        offload.removeDownstreamInterface(RNDIS0);
-
-        // Clear invocation history, especially the getForwardedStats() calls
-        // that happen with setUpstreamParameters().
-        clearInvocations(mHardware);
-
-        OffloadHardwareInterface.ControlCallback callback = mControlCallbackCaptor.getValue();
-        callback.onSupportAvailable();
-
-        // Verify forwarded stats behaviour.
-        verify(mHardware, times(1)).getForwardedStats(eq(RMNET0));
-        verify(mHardware, times(1)).getForwardedStats(eq(WLAN0));
-        verify(mTetherStatsProviderCb, times(1)).notifyStatsUpdated(anyInt(), any(), any());
-        verifyNoMoreInteractions(mTetherStatsProviderCb);
-
-        // TODO: verify local prefixes and downstreams are also pushed to the HAL.
-        verify(mHardware, times(1)).setLocalPrefixes(mStringArrayCaptor.capture());
-        ArrayList<String> localPrefixes = mStringArrayCaptor.getValue();
-        assertEquals(4, localPrefixes.size());
-        assertContainsAll(localPrefixes,
-                // TODO: The logic to find and exclude downstream IP prefixes
-                // is currently in Tethering's OffloadWrapper but must be moved
-                // into OffloadController proper. After this, also check for:
-                //     "192.168.43.1/32", "2001:2::1/128", "2001:2::2/128"
-                "127.0.0.0/8", "192.0.2.0/24", "fe80::/64", "2001:db8::/64");
-        verify(mHardware, times(1)).addDownstreamPrefix(WLAN0, "192.168.43.0/24");
-        verify(mHardware, times(1)).addDownstreamPrefix(WLAN0, "2001:2::/64");
-        verify(mHardware, times(1)).setUpstreamParameters(eq(RMNET0), any(), any(), any());
-        verify(mHardware, times(1)).setDataLimit(eq(RMNET0), anyLong());
-        verifyNoMoreInteractions(mHardware);
-    }
-
-}
diff --git a/packages/Tethering/tests/unit/src/com/android/server/connectivity/tethering/TetheringConfigurationTest.java b/packages/Tethering/tests/unit/src/com/android/server/connectivity/tethering/TetheringConfigurationTest.java
deleted file mode 100644
index 3635964..0000000
--- a/packages/Tethering/tests/unit/src/com/android/server/connectivity/tethering/TetheringConfigurationTest.java
+++ /dev/null
@@ -1,345 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.connectivity.tethering;
-
-import static android.net.ConnectivityManager.TYPE_ETHERNET;
-import static android.net.ConnectivityManager.TYPE_MOBILE;
-import static android.net.ConnectivityManager.TYPE_MOBILE_DUN;
-import static android.net.ConnectivityManager.TYPE_MOBILE_HIPRI;
-import static android.net.ConnectivityManager.TYPE_WIFI;
-import static android.provider.DeviceConfig.NAMESPACE_CONNECTIVITY;
-import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
-
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.Matchers.anyBoolean;
-import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.net.util.SharedLog;
-import android.provider.DeviceConfig;
-import android.telephony.TelephonyManager;
-
-import androidx.test.filters.SmallTest;
-import androidx.test.runner.AndroidJUnit4;
-
-import com.android.internal.util.test.BroadcastInterceptingContext;
-import com.android.networkstack.tethering.R;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoSession;
-import org.mockito.quality.Strictness;
-
-import java.util.Arrays;
-import java.util.Iterator;
-
-@RunWith(AndroidJUnit4.class)
-@SmallTest
-public class TetheringConfigurationTest {
-    private final SharedLog mLog = new SharedLog("TetheringConfigurationTest");
-
-    private static final String[] PROVISIONING_APP_NAME = {"some", "app"};
-    @Mock private Context mContext;
-    @Mock private TelephonyManager mTelephonyManager;
-    @Mock private Resources mResources;
-    @Mock private Resources mResourcesForSubId;
-    private Context mMockContext;
-    private boolean mHasTelephonyManager;
-    private boolean mEnableLegacyDhcpServer;
-    private MockitoSession mMockingSession;
-
-    private class MockTetheringConfiguration extends TetheringConfiguration {
-        MockTetheringConfiguration(Context ctx, SharedLog log, int id) {
-            super(ctx, log, id);
-        }
-
-        @Override
-        protected Resources getResourcesForSubIdWrapper(Context ctx, int subId) {
-            return mResourcesForSubId;
-        }
-    }
-
-    private class MockContext extends BroadcastInterceptingContext {
-        MockContext(Context base) {
-            super(base);
-        }
-
-        @Override
-        public Resources getResources() {
-            return mResources;
-        }
-
-        @Override
-        public Object getSystemService(String name) {
-            if (Context.TELEPHONY_SERVICE.equals(name)) {
-                return mHasTelephonyManager ? mTelephonyManager : null;
-            }
-            return super.getSystemService(name);
-        }
-    }
-
-    @Before
-    public void setUp() throws Exception {
-        // TODO: use a dependencies class instead of mock statics.
-        mMockingSession = mockitoSession()
-                .initMocks(this)
-                .mockStatic(DeviceConfig.class)
-                .strictness(Strictness.WARN)
-                .startMocking();
-        doReturn(false).when(
-                () -> DeviceConfig.getBoolean(eq(NAMESPACE_CONNECTIVITY),
-                eq(TetheringConfiguration.TETHER_ENABLE_LEGACY_DHCP_SERVER), anyBoolean()));
-
-        when(mResources.getStringArray(R.array.config_tether_dhcp_range)).thenReturn(
-                new String[0]);
-        when(mResources.getStringArray(R.array.config_tether_usb_regexs)).thenReturn(new String[0]);
-        when(mResources.getStringArray(R.array.config_tether_wifi_regexs))
-                .thenReturn(new String[]{ "test_wlan\\d" });
-        when(mResources.getStringArray(R.array.config_tether_bluetooth_regexs)).thenReturn(
-                new String[0]);
-        when(mResources.getIntArray(R.array.config_tether_upstream_types)).thenReturn(new int[0]);
-        when(mResources.getStringArray(R.array.config_mobile_hotspot_provision_app))
-                .thenReturn(new String[0]);
-        when(mResources.getBoolean(R.bool.config_tether_enable_legacy_dhcp_server)).thenReturn(
-                false);
-        mHasTelephonyManager = true;
-        mMockContext = new MockContext(mContext);
-        mEnableLegacyDhcpServer = false;
-    }
-
-    @After
-    public void tearDown() throws Exception {
-        mMockingSession.finishMocking();
-    }
-
-    private TetheringConfiguration getTetheringConfiguration(int... legacyTetherUpstreamTypes) {
-        when(mResources.getIntArray(R.array.config_tether_upstream_types)).thenReturn(
-                legacyTetherUpstreamTypes);
-        return new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID);
-    }
-
-    @Test
-    public void testNoTelephonyManagerMeansNoDun() {
-        mHasTelephonyManager = false;
-        final TetheringConfiguration cfg = getTetheringConfiguration(
-                new int[]{TYPE_MOBILE_DUN, TYPE_WIFI});
-        assertFalse(cfg.isDunRequired);
-        assertFalse(cfg.preferredUpstreamIfaceTypes.contains(TYPE_MOBILE_DUN));
-        // Just to prove we haven't clobbered Wi-Fi:
-        assertTrue(cfg.preferredUpstreamIfaceTypes.contains(TYPE_WIFI));
-    }
-
-    @Test
-    public void testDunFromTelephonyManagerMeansDun() {
-        when(mTelephonyManager.isTetheringApnRequired()).thenReturn(true);
-
-        final TetheringConfiguration cfgWifi = getTetheringConfiguration(TYPE_WIFI);
-        final TetheringConfiguration cfgMobileWifiHipri = getTetheringConfiguration(
-                TYPE_MOBILE, TYPE_WIFI, TYPE_MOBILE_HIPRI);
-        final TetheringConfiguration cfgWifiDun = getTetheringConfiguration(
-                TYPE_WIFI, TYPE_MOBILE_DUN);
-        final TetheringConfiguration cfgMobileWifiHipriDun = getTetheringConfiguration(
-                TYPE_MOBILE, TYPE_WIFI, TYPE_MOBILE_HIPRI, TYPE_MOBILE_DUN);
-
-        for (TetheringConfiguration cfg : Arrays.asList(cfgWifi, cfgMobileWifiHipri,
-                cfgWifiDun, cfgMobileWifiHipriDun)) {
-            String msg = "config=" + cfg.toString();
-            assertTrue(msg, cfg.isDunRequired);
-            assertTrue(msg, cfg.preferredUpstreamIfaceTypes.contains(TYPE_MOBILE_DUN));
-            assertFalse(msg, cfg.preferredUpstreamIfaceTypes.contains(TYPE_MOBILE));
-            assertFalse(msg, cfg.preferredUpstreamIfaceTypes.contains(TYPE_MOBILE_HIPRI));
-            // Just to prove we haven't clobbered Wi-Fi:
-            assertTrue(msg, cfg.preferredUpstreamIfaceTypes.contains(TYPE_WIFI));
-        }
-    }
-
-    @Test
-    public void testDunNotRequiredFromTelephonyManagerMeansNoDun() {
-        when(mTelephonyManager.isTetheringApnRequired()).thenReturn(false);
-
-        final TetheringConfiguration cfgWifi = getTetheringConfiguration(TYPE_WIFI);
-        final TetheringConfiguration cfgMobileWifiHipri = getTetheringConfiguration(
-                TYPE_MOBILE, TYPE_WIFI, TYPE_MOBILE_HIPRI);
-        final TetheringConfiguration cfgWifiDun = getTetheringConfiguration(
-                TYPE_WIFI, TYPE_MOBILE_DUN);
-        final TetheringConfiguration cfgWifiMobile = getTetheringConfiguration(
-                TYPE_WIFI, TYPE_MOBILE);
-        final TetheringConfiguration cfgWifiHipri = getTetheringConfiguration(
-                TYPE_WIFI, TYPE_MOBILE_HIPRI);
-        final TetheringConfiguration cfgMobileWifiHipriDun = getTetheringConfiguration(
-                TYPE_MOBILE, TYPE_WIFI, TYPE_MOBILE_HIPRI, TYPE_MOBILE_DUN);
-
-        String msg;
-        // TYPE_MOBILE_DUN should be present in none of the combinations.
-        // TYPE_WIFI should not be affected.
-        for (TetheringConfiguration cfg : Arrays.asList(cfgWifi, cfgMobileWifiHipri, cfgWifiDun,
-                cfgWifiMobile, cfgWifiHipri, cfgMobileWifiHipriDun)) {
-            msg = "config=" + cfg.toString();
-            assertFalse(msg, cfg.isDunRequired);
-            assertFalse(msg, cfg.preferredUpstreamIfaceTypes.contains(TYPE_MOBILE_DUN));
-            assertTrue(msg, cfg.preferredUpstreamIfaceTypes.contains(TYPE_WIFI));
-        }
-
-        for (TetheringConfiguration cfg : Arrays.asList(cfgWifi, cfgMobileWifiHipri, cfgWifiDun,
-                cfgMobileWifiHipriDun)) {
-            msg = "config=" + cfg.toString();
-            assertTrue(msg, cfg.preferredUpstreamIfaceTypes.contains(TYPE_MOBILE));
-            assertTrue(msg, cfg.preferredUpstreamIfaceTypes.contains(TYPE_MOBILE_HIPRI));
-        }
-        msg = "config=" + cfgWifiMobile.toString();
-        assertTrue(msg, cfgWifiMobile.preferredUpstreamIfaceTypes.contains(TYPE_MOBILE));
-        assertFalse(msg, cfgWifiMobile.preferredUpstreamIfaceTypes.contains(TYPE_MOBILE_HIPRI));
-        msg = "config=" + cfgWifiHipri.toString();
-        assertFalse(msg, cfgWifiHipri.preferredUpstreamIfaceTypes.contains(TYPE_MOBILE));
-        assertTrue(msg, cfgWifiHipri.preferredUpstreamIfaceTypes.contains(TYPE_MOBILE_HIPRI));
-
-    }
-
-    @Test
-    public void testNoDefinedUpstreamTypesAddsEthernet() {
-        when(mResources.getIntArray(R.array.config_tether_upstream_types)).thenReturn(new int[]{});
-        when(mTelephonyManager.isTetheringApnRequired()).thenReturn(false);
-
-        final TetheringConfiguration cfg = new TetheringConfiguration(
-                mMockContext, mLog, INVALID_SUBSCRIPTION_ID);
-        final Iterator<Integer> upstreamIterator = cfg.preferredUpstreamIfaceTypes.iterator();
-        assertTrue(upstreamIterator.hasNext());
-        assertEquals(TYPE_ETHERNET, upstreamIterator.next().intValue());
-        // The following is because the code always adds some kind of mobile
-        // upstream, be it DUN or, in this case where DUN is NOT required,
-        // make sure there is at least one of MOBILE or HIPRI. With the empty
-        // list of the configuration in this test, it will always add both
-        // MOBILE and HIPRI, in that order.
-        assertTrue(upstreamIterator.hasNext());
-        assertEquals(TYPE_MOBILE, upstreamIterator.next().intValue());
-        assertTrue(upstreamIterator.hasNext());
-        assertEquals(TYPE_MOBILE_HIPRI, upstreamIterator.next().intValue());
-        assertFalse(upstreamIterator.hasNext());
-    }
-
-    @Test
-    public void testDefinedUpstreamTypesSansEthernetAddsEthernet() {
-        when(mResources.getIntArray(R.array.config_tether_upstream_types)).thenReturn(
-                new int[]{TYPE_WIFI, TYPE_MOBILE_HIPRI});
-        when(mTelephonyManager.isTetheringApnRequired()).thenReturn(false);
-
-        final TetheringConfiguration cfg = new TetheringConfiguration(
-                mMockContext, mLog, INVALID_SUBSCRIPTION_ID);
-        final Iterator<Integer> upstreamIterator = cfg.preferredUpstreamIfaceTypes.iterator();
-        assertTrue(upstreamIterator.hasNext());
-        assertEquals(TYPE_ETHERNET, upstreamIterator.next().intValue());
-        assertTrue(upstreamIterator.hasNext());
-        assertEquals(TYPE_WIFI, upstreamIterator.next().intValue());
-        assertTrue(upstreamIterator.hasNext());
-        assertEquals(TYPE_MOBILE_HIPRI, upstreamIterator.next().intValue());
-        assertFalse(upstreamIterator.hasNext());
-    }
-
-    @Test
-    public void testDefinedUpstreamTypesWithEthernetDoesNotAddEthernet() {
-        when(mResources.getIntArray(R.array.config_tether_upstream_types))
-                .thenReturn(new int[]{TYPE_WIFI, TYPE_ETHERNET, TYPE_MOBILE_HIPRI});
-        when(mTelephonyManager.isTetheringApnRequired()).thenReturn(false);
-
-        final TetheringConfiguration cfg = new TetheringConfiguration(
-                mMockContext, mLog, INVALID_SUBSCRIPTION_ID);
-        final Iterator<Integer> upstreamIterator = cfg.preferredUpstreamIfaceTypes.iterator();
-        assertTrue(upstreamIterator.hasNext());
-        assertEquals(TYPE_WIFI, upstreamIterator.next().intValue());
-        assertTrue(upstreamIterator.hasNext());
-        assertEquals(TYPE_ETHERNET, upstreamIterator.next().intValue());
-        assertTrue(upstreamIterator.hasNext());
-        assertEquals(TYPE_MOBILE_HIPRI, upstreamIterator.next().intValue());
-        assertFalse(upstreamIterator.hasNext());
-    }
-
-    @Test
-    public void testNewDhcpServerDisabled() {
-        when(mResources.getBoolean(R.bool.config_tether_enable_legacy_dhcp_server)).thenReturn(
-                true);
-        doReturn(false).when(
-                () -> DeviceConfig.getBoolean(eq(NAMESPACE_CONNECTIVITY),
-                eq(TetheringConfiguration.TETHER_ENABLE_LEGACY_DHCP_SERVER), anyBoolean()));
-
-        final TetheringConfiguration enableByRes =
-                new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID);
-        assertTrue(enableByRes.enableLegacyDhcpServer);
-
-        when(mResources.getBoolean(R.bool.config_tether_enable_legacy_dhcp_server)).thenReturn(
-                false);
-        doReturn(true).when(
-                () -> DeviceConfig.getBoolean(eq(NAMESPACE_CONNECTIVITY),
-                eq(TetheringConfiguration.TETHER_ENABLE_LEGACY_DHCP_SERVER), anyBoolean()));
-
-        final TetheringConfiguration enableByDevConfig =
-                new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID);
-        assertTrue(enableByDevConfig.enableLegacyDhcpServer);
-    }
-
-    @Test
-    public void testNewDhcpServerEnabled() {
-        when(mResources.getBoolean(R.bool.config_tether_enable_legacy_dhcp_server)).thenReturn(
-                false);
-        doReturn(false).when(
-                () -> DeviceConfig.getBoolean(eq(NAMESPACE_CONNECTIVITY),
-                eq(TetheringConfiguration.TETHER_ENABLE_LEGACY_DHCP_SERVER), anyBoolean()));
-
-        final TetheringConfiguration cfg =
-                new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID);
-
-        assertFalse(cfg.enableLegacyDhcpServer);
-    }
-
-    @Test
-    public void testGetResourcesBySubId() {
-        setUpResourceForSubId();
-        final TetheringConfiguration cfg = new TetheringConfiguration(
-                mMockContext, mLog, INVALID_SUBSCRIPTION_ID);
-        assertTrue(cfg.provisioningApp.length == 0);
-        final int anyValidSubId = 1;
-        final MockTetheringConfiguration mockCfg =
-                new MockTetheringConfiguration(mMockContext, mLog, anyValidSubId);
-        assertEquals(mockCfg.provisioningApp[0], PROVISIONING_APP_NAME[0]);
-        assertEquals(mockCfg.provisioningApp[1], PROVISIONING_APP_NAME[1]);
-    }
-
-    private void setUpResourceForSubId() {
-        when(mResourcesForSubId.getStringArray(
-                R.array.config_tether_dhcp_range)).thenReturn(new String[0]);
-        when(mResourcesForSubId.getStringArray(
-                R.array.config_tether_usb_regexs)).thenReturn(new String[0]);
-        when(mResourcesForSubId.getStringArray(
-                R.array.config_tether_wifi_regexs)).thenReturn(new String[]{ "test_wlan\\d" });
-        when(mResourcesForSubId.getStringArray(
-                R.array.config_tether_bluetooth_regexs)).thenReturn(new String[0]);
-        when(mResourcesForSubId.getIntArray(R.array.config_tether_upstream_types)).thenReturn(
-                new int[0]);
-        when(mResourcesForSubId.getStringArray(
-                R.array.config_mobile_hotspot_provision_app)).thenReturn(PROVISIONING_APP_NAME);
-    }
-
-}
diff --git a/packages/Tethering/tests/unit/src/com/android/server/connectivity/tethering/TetheringNotificationUpdaterTest.kt b/packages/Tethering/tests/unit/src/com/android/server/connectivity/tethering/TetheringNotificationUpdaterTest.kt
deleted file mode 100644
index b869491..0000000
--- a/packages/Tethering/tests/unit/src/com/android/server/connectivity/tethering/TetheringNotificationUpdaterTest.kt
+++ /dev/null
@@ -1,262 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.connectivity.tethering
-
-import android.app.Notification
-import android.app.NotificationManager
-import android.content.Context
-import android.content.res.Resources
-import android.net.ConnectivityManager.TETHERING_BLUETOOTH
-import android.net.ConnectivityManager.TETHERING_USB
-import android.net.ConnectivityManager.TETHERING_WIFI
-import android.os.UserHandle
-import android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID
-import androidx.test.platform.app.InstrumentationRegistry
-import androidx.test.filters.SmallTest
-import androidx.test.runner.AndroidJUnit4
-import com.android.internal.util.test.BroadcastInterceptingContext
-import com.android.networkstack.tethering.R
-import com.android.server.connectivity.tethering.TetheringNotificationUpdater.DOWNSTREAM_NONE
-import org.junit.Assert.assertEquals
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.mockito.ArgumentCaptor
-import org.mockito.ArgumentMatchers.any
-import org.mockito.ArgumentMatchers.anyInt
-import org.mockito.ArgumentMatchers.eq
-import org.mockito.Mock
-import org.mockito.Mockito.doReturn
-import org.mockito.Mockito.never
-import org.mockito.Mockito.reset
-import org.mockito.Mockito.times
-import org.mockito.Mockito.verifyZeroInteractions
-import org.mockito.Mockito.verify
-import org.mockito.MockitoAnnotations
-
-const val TEST_SUBID = 1
-const val WIFI_ICON_ID = 1
-const val USB_ICON_ID = 2
-const val BT_ICON_ID = 3
-const val GENERAL_ICON_ID = 4
-const val WIFI_MASK = 1 shl TETHERING_WIFI
-const val USB_MASK = 1 shl TETHERING_USB
-const val BT_MASK = 1 shl TETHERING_BLUETOOTH
-const val TITTLE = "Tethering active"
-const val MESSAGE = "Tap here to set up."
-const val TEST_TITTLE = "Hotspot active"
-const val TEST_MESSAGE = "Tap to set up hotspot."
-
-@RunWith(AndroidJUnit4::class)
-@SmallTest
-class TetheringNotificationUpdaterTest {
-    // lateinit used here for mocks as they need to be reinitialized between each test and the test
-    // should crash if they are used before being initialized.
-    @Mock private lateinit var mockContext: Context
-    @Mock private lateinit var notificationManager: NotificationManager
-    @Mock private lateinit var defaultResources: Resources
-    @Mock private lateinit var testResources: Resources
-
-    // lateinit for this class under test, as it should be reset to a different instance for every
-    // tests but should always be initialized before use (or the test should crash).
-    private lateinit var notificationUpdater: TetheringNotificationUpdater
-
-    private val ENABLE_ICON_CONFIGS = arrayOf(
-            "USB;android.test:drawable/usb", "BT;android.test:drawable/bluetooth",
-            "WIFI|BT;android.test:drawable/general", "WIFI|USB;android.test:drawable/general",
-            "USB|BT;android.test:drawable/general", "WIFI|USB|BT;android.test:drawable/general")
-
-    private inner class TestContext(c: Context) : BroadcastInterceptingContext(c) {
-        override fun createContextAsUser(user: UserHandle, flags: Int) =
-                if (user == UserHandle.ALL) mockContext else this
-    }
-
-    private inner class WrappedNotificationUpdater(c: Context) : TetheringNotificationUpdater(c) {
-        override fun getResourcesForSubId(context: Context, subId: Int) =
-                if (subId == TEST_SUBID) testResources else defaultResources
-    }
-
-    private fun setupResources() {
-        doReturn(ENABLE_ICON_CONFIGS).`when`(defaultResources)
-                .getStringArray(R.array.tethering_notification_icons)
-        doReturn(arrayOf("WIFI;android.test:drawable/wifi")).`when`(testResources)
-                .getStringArray(R.array.tethering_notification_icons)
-        doReturn(TITTLE).`when`(defaultResources).getString(R.string.tethering_notification_title)
-        doReturn(MESSAGE).`when`(defaultResources)
-                .getString(R.string.tethering_notification_message)
-        doReturn(TEST_TITTLE).`when`(testResources).getString(R.string.tethering_notification_title)
-        doReturn(TEST_MESSAGE).`when`(testResources)
-                .getString(R.string.tethering_notification_message)
-        doReturn(USB_ICON_ID).`when`(defaultResources)
-                .getIdentifier(eq("android.test:drawable/usb"), any(), any())
-        doReturn(BT_ICON_ID).`when`(defaultResources)
-                .getIdentifier(eq("android.test:drawable/bluetooth"), any(), any())
-        doReturn(GENERAL_ICON_ID).`when`(defaultResources)
-                .getIdentifier(eq("android.test:drawable/general"), any(), any())
-        doReturn(WIFI_ICON_ID).`when`(testResources)
-                .getIdentifier(eq("android.test:drawable/wifi"), any(), any())
-    }
-
-    @Before
-    fun setUp() {
-        MockitoAnnotations.initMocks(this)
-        val context = TestContext(InstrumentationRegistry.getInstrumentation().context)
-        doReturn(notificationManager).`when`(mockContext)
-                .getSystemService(Context.NOTIFICATION_SERVICE)
-        notificationUpdater = WrappedNotificationUpdater(context)
-        setupResources()
-    }
-
-    private fun Notification.title() = this.extras.getString(Notification.EXTRA_TITLE)
-    private fun Notification.text() = this.extras.getString(Notification.EXTRA_TEXT)
-
-    private fun verifyNotification(iconId: Int = 0, title: String = "", text: String = "") {
-        verify(notificationManager, never()).cancel(any(), anyInt())
-
-        val notificationCaptor = ArgumentCaptor.forClass(Notification::class.java)
-        verify(notificationManager, times(1))
-                .notify(any(), anyInt(), notificationCaptor.capture())
-
-        val notification = notificationCaptor.getValue()
-        assertEquals(iconId, notification.smallIcon.resId)
-        assertEquals(title, notification.title())
-        assertEquals(text, notification.text())
-
-        reset(notificationManager)
-    }
-
-    private fun verifyNoNotification() {
-        verify(notificationManager, times(1)).cancel(any(), anyInt())
-        verify(notificationManager, never()).notify(any(), anyInt(), any())
-
-        reset(notificationManager)
-    }
-
-    @Test
-    fun testNotificationWithDownstreamChanged() {
-        // Wifi downstream. No notification.
-        notificationUpdater.onDownstreamChanged(WIFI_MASK)
-        verifyNoNotification()
-
-        // Same downstream changed. Nothing happened.
-        notificationUpdater.onDownstreamChanged(WIFI_MASK)
-        verifyZeroInteractions(notificationManager)
-
-        // Wifi and usb downstreams. Show enable notification
-        notificationUpdater.onDownstreamChanged(WIFI_MASK or USB_MASK)
-        verifyNotification(GENERAL_ICON_ID, TITTLE, MESSAGE)
-
-        // Usb downstream. Still show enable notification.
-        notificationUpdater.onDownstreamChanged(USB_MASK)
-        verifyNotification(USB_ICON_ID, TITTLE, MESSAGE)
-
-        // No downstream. No notification.
-        notificationUpdater.onDownstreamChanged(DOWNSTREAM_NONE)
-        verifyNoNotification()
-    }
-
-    @Test
-    fun testNotificationWithActiveDataSubscriptionIdChanged() {
-        // Usb downstream. Showed enable notification with default resource.
-        notificationUpdater.onDownstreamChanged(USB_MASK)
-        verifyNotification(USB_ICON_ID, TITTLE, MESSAGE)
-
-        // Same subId changed. Nothing happened.
-        notificationUpdater.onActiveDataSubscriptionIdChanged(INVALID_SUBSCRIPTION_ID)
-        verifyZeroInteractions(notificationManager)
-
-        // Set test sub id. Clear notification with test resource.
-        notificationUpdater.onActiveDataSubscriptionIdChanged(TEST_SUBID)
-        verifyNoNotification()
-
-        // Wifi downstream. Show enable notification with test resource.
-        notificationUpdater.onDownstreamChanged(WIFI_MASK)
-        verifyNotification(WIFI_ICON_ID, TEST_TITTLE, TEST_MESSAGE)
-
-        // No downstream. No notification.
-        notificationUpdater.onDownstreamChanged(DOWNSTREAM_NONE)
-        verifyNoNotification()
-    }
-
-    private fun assertIconNumbers(number: Int, configs: Array<String?>) {
-        doReturn(configs).`when`(defaultResources)
-                .getStringArray(R.array.tethering_notification_icons)
-        assertEquals(number, notificationUpdater.getIcons(
-                R.array.tethering_notification_icons, defaultResources).size())
-    }
-
-    @Test
-    fun testGetIcons() {
-        assertIconNumbers(0, arrayOfNulls<String>(0))
-        assertIconNumbers(0, arrayOf(null, ""))
-        assertIconNumbers(3, arrayOf(
-                // These configurations are invalid with wrong strings or symbols.
-                ";", ",", "|", "|,;", "WIFI", "1;2", " U SB; ", "bt;", "WIFI;USB;BT", "WIFI|USB|BT",
-                "WIFI,BT,USB", " WIFI| |  | USB, test:drawable/test",
-                // This configuration is valid with two downstream types (USB, BT).
-                "USB|,,,,,|BT;drawable/test ",
-                // This configuration is valid with one downstream types (WIFI).
-                "     WIFI     ; android.test:drawable/xxx "))
-    }
-
-    @Test
-    fun testGetDownstreamTypesMask() {
-        assertEquals(DOWNSTREAM_NONE, notificationUpdater.getDownstreamTypesMask(""))
-        assertEquals(DOWNSTREAM_NONE, notificationUpdater.getDownstreamTypesMask("1"))
-        assertEquals(DOWNSTREAM_NONE, notificationUpdater.getDownstreamTypesMask("WIFI_P2P"))
-        assertEquals(DOWNSTREAM_NONE, notificationUpdater.getDownstreamTypesMask("usb"))
-        assertEquals(WIFI_MASK, notificationUpdater.getDownstreamTypesMask(" WIFI "))
-        assertEquals(USB_MASK, notificationUpdater.getDownstreamTypesMask("USB | B T"))
-        assertEquals(BT_MASK, notificationUpdater.getDownstreamTypesMask(" WIFI: | BT"))
-        assertEquals(WIFI_MASK or USB_MASK,
-                notificationUpdater.getDownstreamTypesMask("1|2|USB|WIFI|BLUETOOTH||"))
-    }
-
-    @Test
-    fun testSetupRestrictedNotification() {
-        val title = InstrumentationRegistry.getInstrumentation().context.resources
-                .getString(R.string.disable_tether_notification_title)
-        val message = InstrumentationRegistry.getInstrumentation().context.resources
-                .getString(R.string.disable_tether_notification_message)
-        val disallowTitle = "Tether function is disallowed"
-        val disallowMessage = "Please contact your admin"
-        doReturn(title).`when`(defaultResources)
-                .getString(R.string.disable_tether_notification_title)
-        doReturn(message).`when`(defaultResources)
-                .getString(R.string.disable_tether_notification_message)
-        doReturn(disallowTitle).`when`(testResources)
-                .getString(R.string.disable_tether_notification_title)
-        doReturn(disallowMessage).`when`(testResources)
-                .getString(R.string.disable_tether_notification_message)
-
-        // User restrictions on. Show restricted notification.
-        notificationUpdater.notifyTetheringDisabledByRestriction()
-        verifyNotification(R.drawable.stat_sys_tether_general, title, message)
-
-        // User restrictions off. Clear notification.
-        notificationUpdater.tetheringRestrictionLifted()
-        verifyNoNotification()
-
-        // Set test sub id. No notification.
-        notificationUpdater.onActiveDataSubscriptionIdChanged(TEST_SUBID)
-        verifyNoNotification()
-
-        // User restrictions on again. Show restricted notification with test resource.
-        notificationUpdater.notifyTetheringDisabledByRestriction()
-        verifyNotification(R.drawable.stat_sys_tether_general, disallowTitle, disallowMessage)
-    }
-}
\ No newline at end of file
diff --git a/packages/Tethering/tests/unit/src/com/android/server/connectivity/tethering/TetheringServiceTest.java b/packages/Tethering/tests/unit/src/com/android/server/connectivity/tethering/TetheringServiceTest.java
deleted file mode 100644
index d9d3e73..0000000
--- a/packages/Tethering/tests/unit/src/com/android/server/connectivity/tethering/TetheringServiceTest.java
+++ /dev/null
@@ -1,194 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.connectivity.tethering;
-
-import static android.net.TetheringManager.TETHERING_WIFI;
-import static android.net.TetheringManager.TETHER_ERROR_NO_ERROR;
-
-import static org.junit.Assert.assertEquals;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
-import static org.mockito.Mockito.when;
-
-import android.content.Intent;
-import android.net.IIntResultListener;
-import android.net.ITetheringConnector;
-import android.net.ITetheringEventCallback;
-import android.net.TetheringRequestParcel;
-import android.os.ResultReceiver;
-
-import androidx.test.InstrumentationRegistry;
-import androidx.test.filters.SmallTest;
-import androidx.test.rule.ServiceTestRule;
-import androidx.test.runner.AndroidJUnit4;
-
-import com.android.server.connectivity.tethering.MockTetheringService.MockTetheringConnector;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-@RunWith(AndroidJUnit4.class)
-@SmallTest
-public final class TetheringServiceTest {
-    private static final String TEST_IFACE_NAME = "test_wlan0";
-    private static final String TEST_CALLER_PKG = "test_pkg";
-    @Mock private ITetheringEventCallback mITetheringEventCallback;
-    @Rule public ServiceTestRule mServiceTestRule;
-    private Tethering mTethering;
-    private Intent mMockServiceIntent;
-    private ITetheringConnector mTetheringConnector;
-
-    private class TestTetheringResult extends IIntResultListener.Stub {
-        private int mResult = -1; // Default value that does not match any result code.
-        @Override
-        public void onResult(final int resultCode) {
-            mResult = resultCode;
-        }
-
-        public void assertResult(final int expected) {
-            assertEquals(expected, mResult);
-        }
-    }
-
-    @Before
-    public void setUp() throws Exception {
-        MockitoAnnotations.initMocks(this);
-        mServiceTestRule = new ServiceTestRule();
-        mMockServiceIntent = new Intent(
-                InstrumentationRegistry.getTargetContext(),
-                MockTetheringService.class);
-        final MockTetheringConnector mockConnector =
-                (MockTetheringConnector) mServiceTestRule.bindService(mMockServiceIntent);
-        mTetheringConnector = mockConnector.getTetheringConnector();
-        final MockTetheringService service = mockConnector.getService();
-        mTethering = service.getTethering();
-        verify(mTethering).startStateMachineUpdaters();
-        when(mTethering.hasTetherableConfiguration()).thenReturn(true);
-    }
-
-    @After
-    public void tearDown() throws Exception {
-        mServiceTestRule.unbindService();
-    }
-
-    @Test
-    public void testTether() throws Exception {
-        when(mTethering.tether(TEST_IFACE_NAME)).thenReturn(TETHER_ERROR_NO_ERROR);
-        final TestTetheringResult result = new TestTetheringResult();
-        mTetheringConnector.tether(TEST_IFACE_NAME, TEST_CALLER_PKG, result);
-        verify(mTethering).hasTetherableConfiguration();
-        verify(mTethering).tether(TEST_IFACE_NAME);
-        verifyNoMoreInteractions(mTethering);
-        result.assertResult(TETHER_ERROR_NO_ERROR);
-    }
-
-    @Test
-    public void testUntether() throws Exception {
-        when(mTethering.untether(TEST_IFACE_NAME)).thenReturn(TETHER_ERROR_NO_ERROR);
-        final TestTetheringResult result = new TestTetheringResult();
-        mTetheringConnector.untether(TEST_IFACE_NAME, TEST_CALLER_PKG, result);
-        verify(mTethering).hasTetherableConfiguration();
-        verify(mTethering).untether(TEST_IFACE_NAME);
-        verifyNoMoreInteractions(mTethering);
-        result.assertResult(TETHER_ERROR_NO_ERROR);
-    }
-
-    @Test
-    public void testSetUsbTethering() throws Exception {
-        when(mTethering.setUsbTethering(true /* enable */)).thenReturn(TETHER_ERROR_NO_ERROR);
-        final TestTetheringResult result = new TestTetheringResult();
-        mTetheringConnector.setUsbTethering(true /* enable */, TEST_CALLER_PKG, result);
-        verify(mTethering).hasTetherableConfiguration();
-        verify(mTethering).setUsbTethering(true /* enable */);
-        verifyNoMoreInteractions(mTethering);
-        result.assertResult(TETHER_ERROR_NO_ERROR);
-    }
-
-    @Test
-    public void testStartTethering() throws Exception {
-        final TestTetheringResult result = new TestTetheringResult();
-        final TetheringRequestParcel request = new TetheringRequestParcel();
-        request.tetheringType = TETHERING_WIFI;
-        mTetheringConnector.startTethering(request, TEST_CALLER_PKG, result);
-        verify(mTethering).hasTetherableConfiguration();
-        verify(mTethering).startTethering(eq(request), eq(result));
-        verifyNoMoreInteractions(mTethering);
-    }
-
-    @Test
-    public void testStopTethering() throws Exception {
-        final TestTetheringResult result = new TestTetheringResult();
-        mTetheringConnector.stopTethering(TETHERING_WIFI, TEST_CALLER_PKG, result);
-        verify(mTethering).hasTetherableConfiguration();
-        verify(mTethering).stopTethering(TETHERING_WIFI);
-        verifyNoMoreInteractions(mTethering);
-        result.assertResult(TETHER_ERROR_NO_ERROR);
-    }
-
-    @Test
-    public void testRequestLatestTetheringEntitlementResult() throws Exception {
-        final ResultReceiver result = new ResultReceiver(null);
-        mTetheringConnector.requestLatestTetheringEntitlementResult(TETHERING_WIFI, result,
-                true /* showEntitlementUi */, TEST_CALLER_PKG);
-        verify(mTethering).hasTetherableConfiguration();
-        verify(mTethering).requestLatestTetheringEntitlementResult(eq(TETHERING_WIFI),
-                eq(result), eq(true) /* showEntitlementUi */);
-        verifyNoMoreInteractions(mTethering);
-    }
-
-    @Test
-    public void testRegisterTetheringEventCallback() throws Exception {
-        mTetheringConnector.registerTetheringEventCallback(mITetheringEventCallback,
-                TEST_CALLER_PKG);
-        verify(mTethering).registerTetheringEventCallback(eq(mITetheringEventCallback));
-        verifyNoMoreInteractions(mTethering);
-    }
-
-    @Test
-    public void testUnregisterTetheringEventCallback() throws Exception {
-        mTetheringConnector.unregisterTetheringEventCallback(mITetheringEventCallback,
-                TEST_CALLER_PKG);
-        verify(mTethering).unregisterTetheringEventCallback(
-                eq(mITetheringEventCallback));
-        verifyNoMoreInteractions(mTethering);
-    }
-
-    @Test
-    public void testStopAllTethering() throws Exception {
-        final TestTetheringResult result = new TestTetheringResult();
-        mTetheringConnector.stopAllTethering(TEST_CALLER_PKG, result);
-        verify(mTethering).hasTetherableConfiguration();
-        verify(mTethering).untetherAll();
-        verifyNoMoreInteractions(mTethering);
-        result.assertResult(TETHER_ERROR_NO_ERROR);
-    }
-
-    @Test
-    public void testIsTetheringSupported() throws Exception {
-        final TestTetheringResult result = new TestTetheringResult();
-        mTetheringConnector.isTetheringSupported(TEST_CALLER_PKG, result);
-        verify(mTethering).hasTetherableConfiguration();
-        verifyNoMoreInteractions(mTethering);
-        result.assertResult(TETHER_ERROR_NO_ERROR);
-    }
-}
diff --git a/packages/Tethering/tests/unit/src/com/android/server/connectivity/tethering/TetheringTest.java b/packages/Tethering/tests/unit/src/com/android/server/connectivity/tethering/TetheringTest.java
deleted file mode 100644
index 2955903c..0000000
--- a/packages/Tethering/tests/unit/src/com/android/server/connectivity/tethering/TetheringTest.java
+++ /dev/null
@@ -1,1697 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.connectivity.tethering;
-
-import static android.hardware.usb.UsbManager.USB_CONFIGURED;
-import static android.hardware.usb.UsbManager.USB_CONNECTED;
-import static android.hardware.usb.UsbManager.USB_FUNCTION_NCM;
-import static android.hardware.usb.UsbManager.USB_FUNCTION_RNDIS;
-import static android.net.ConnectivityManager.ACTION_RESTRICT_BACKGROUND_CHANGED;
-import static android.net.ConnectivityManager.RESTRICT_BACKGROUND_STATUS_DISABLED;
-import static android.net.ConnectivityManager.RESTRICT_BACKGROUND_STATUS_ENABLED;
-import static android.net.RouteInfo.RTN_UNICAST;
-import static android.net.TetheringManager.ACTION_TETHER_STATE_CHANGED;
-import static android.net.TetheringManager.EXTRA_ACTIVE_LOCAL_ONLY;
-import static android.net.TetheringManager.EXTRA_ACTIVE_TETHER;
-import static android.net.TetheringManager.EXTRA_AVAILABLE_TETHER;
-import static android.net.TetheringManager.TETHERING_ETHERNET;
-import static android.net.TetheringManager.TETHERING_NCM;
-import static android.net.TetheringManager.TETHERING_USB;
-import static android.net.TetheringManager.TETHERING_WIFI;
-import static android.net.TetheringManager.TETHER_ERROR_NO_ERROR;
-import static android.net.TetheringManager.TETHER_ERROR_UNKNOWN_IFACE;
-import static android.net.TetheringManager.TETHER_HARDWARE_OFFLOAD_FAILED;
-import static android.net.TetheringManager.TETHER_HARDWARE_OFFLOAD_STARTED;
-import static android.net.TetheringManager.TETHER_HARDWARE_OFFLOAD_STOPPED;
-import static android.net.dhcp.IDhcpServer.STATUS_SUCCESS;
-import static android.net.shared.Inet4AddressUtils.intToInet4AddressHTH;
-import static android.net.wifi.WifiManager.EXTRA_WIFI_AP_INTERFACE_NAME;
-import static android.net.wifi.WifiManager.EXTRA_WIFI_AP_MODE;
-import static android.net.wifi.WifiManager.EXTRA_WIFI_AP_STATE;
-import static android.net.wifi.WifiManager.IFACE_IP_MODE_LOCAL_ONLY;
-import static android.net.wifi.WifiManager.IFACE_IP_MODE_TETHERED;
-import static android.net.wifi.WifiManager.WIFI_AP_STATE_ENABLED;
-import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
-
-import static com.android.server.connectivity.tethering.TetheringNotificationUpdater.DOWNSTREAM_NONE;
-
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-import static org.mockito.ArgumentMatchers.argThat;
-import static org.mockito.ArgumentMatchers.notNull;
-import static org.mockito.Matchers.anyString;
-import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.any;
-import static org.mockito.Mockito.doThrow;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.reset;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.timeout;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
-import static org.mockito.Mockito.when;
-
-import android.app.usage.NetworkStatsManager;
-import android.bluetooth.BluetoothAdapter;
-import android.content.BroadcastReceiver;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.pm.ApplicationInfo;
-import android.content.res.Resources;
-import android.hardware.usb.UsbManager;
-import android.net.ConnectivityManager;
-import android.net.EthernetManager;
-import android.net.EthernetManager.TetheredInterfaceRequest;
-import android.net.IIntResultListener;
-import android.net.INetd;
-import android.net.ITetheringEventCallback;
-import android.net.InetAddresses;
-import android.net.InterfaceConfigurationParcel;
-import android.net.IpPrefix;
-import android.net.LinkAddress;
-import android.net.LinkProperties;
-import android.net.MacAddress;
-import android.net.Network;
-import android.net.NetworkCapabilities;
-import android.net.NetworkRequest;
-import android.net.RouteInfo;
-import android.net.TetherStatesParcel;
-import android.net.TetheredClient;
-import android.net.TetheringCallbackStartedParcel;
-import android.net.TetheringConfigurationParcel;
-import android.net.TetheringRequestParcel;
-import android.net.dhcp.DhcpServerCallbacks;
-import android.net.dhcp.DhcpServingParamsParcel;
-import android.net.dhcp.IDhcpServer;
-import android.net.ip.IpNeighborMonitor;
-import android.net.ip.IpServer;
-import android.net.ip.RouterAdvertisementDaemon;
-import android.net.util.InterfaceParams;
-import android.net.util.NetworkConstants;
-import android.net.util.SharedLog;
-import android.net.wifi.SoftApConfiguration;
-import android.net.wifi.WifiManager;
-import android.net.wifi.p2p.WifiP2pGroup;
-import android.net.wifi.p2p.WifiP2pInfo;
-import android.net.wifi.p2p.WifiP2pManager;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.PersistableBundle;
-import android.os.RemoteException;
-import android.os.UserHandle;
-import android.os.UserManager;
-import android.os.test.TestLooper;
-import android.provider.Settings;
-import android.telephony.CarrierConfigManager;
-import android.telephony.PhoneStateListener;
-import android.telephony.TelephonyManager;
-import android.test.mock.MockContentResolver;
-
-import androidx.annotation.NonNull;
-import androidx.test.filters.SmallTest;
-import androidx.test.runner.AndroidJUnit4;
-
-import com.android.internal.util.ArrayUtils;
-import com.android.internal.util.StateMachine;
-import com.android.internal.util.test.BroadcastInterceptingContext;
-import com.android.internal.util.test.FakeSettingsProvider;
-import com.android.networkstack.tethering.R;
-import com.android.testutils.MiscAssertsKt;
-
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-import java.net.Inet4Address;
-import java.net.Inet6Address;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-import java.util.Vector;
-
-@RunWith(AndroidJUnit4.class)
-@SmallTest
-public class TetheringTest {
-    private static final int IFINDEX_OFFSET = 100;
-
-    private static final String TEST_MOBILE_IFNAME = "test_rmnet_data0";
-    private static final String TEST_XLAT_MOBILE_IFNAME = "v4-test_rmnet_data0";
-    private static final String TEST_USB_IFNAME = "test_rndis0";
-    private static final String TEST_WLAN_IFNAME = "test_wlan0";
-    private static final String TEST_P2P_IFNAME = "test_p2p-p2p0-0";
-    private static final String TEST_NCM_IFNAME = "test_ncm0";
-    private static final String TETHERING_NAME = "Tethering";
-
-    private static final int DHCPSERVER_START_TIMEOUT_MS = 1000;
-
-    @Mock private ApplicationInfo mApplicationInfo;
-    @Mock private Context mContext;
-    @Mock private NetworkStatsManager mStatsManager;
-    @Mock private OffloadHardwareInterface mOffloadHardwareInterface;
-    @Mock private OffloadHardwareInterface.ForwardedStats mForwardedStats;
-    @Mock private Resources mResources;
-    @Mock private TelephonyManager mTelephonyManager;
-    @Mock private UsbManager mUsbManager;
-    @Mock private WifiManager mWifiManager;
-    @Mock private CarrierConfigManager mCarrierConfigManager;
-    @Mock private UpstreamNetworkMonitor mUpstreamNetworkMonitor;
-    @Mock private IPv6TetheringCoordinator mIPv6TetheringCoordinator;
-    @Mock private RouterAdvertisementDaemon mRouterAdvertisementDaemon;
-    @Mock private IpNeighborMonitor mIpNeighborMonitor;
-    @Mock private IDhcpServer mDhcpServer;
-    @Mock private INetd mNetd;
-    @Mock private UserManager mUserManager;
-    @Mock private NetworkRequest mNetworkRequest;
-    @Mock private ConnectivityManager mCm;
-    @Mock private EthernetManager mEm;
-    @Mock private TetheringNotificationUpdater mNotificationUpdater;
-
-    private final MockIpServerDependencies mIpServerDependencies =
-            spy(new MockIpServerDependencies());
-    private final MockTetheringDependencies mTetheringDependencies =
-            new MockTetheringDependencies();
-
-    // Like so many Android system APIs, these cannot be mocked because it is marked final.
-    // We have to use the real versions.
-    private final PersistableBundle mCarrierConfig = new PersistableBundle();
-    private final TestLooper mLooper = new TestLooper();
-
-    private Vector<Intent> mIntents;
-    private BroadcastInterceptingContext mServiceContext;
-    private MockContentResolver mContentResolver;
-    private BroadcastReceiver mBroadcastReceiver;
-    private Tethering mTethering;
-    private PhoneStateListener mPhoneStateListener;
-    private InterfaceConfigurationParcel mInterfaceConfiguration;
-
-    private class TestContext extends BroadcastInterceptingContext {
-        TestContext(Context base) {
-            super(base);
-        }
-
-        @Override
-        public ApplicationInfo getApplicationInfo() {
-            return mApplicationInfo;
-        }
-
-        @Override
-        public ContentResolver getContentResolver() {
-            return mContentResolver;
-        }
-
-        @Override
-        public String getPackageName() {
-            return "TetheringTest";
-        }
-
-        @Override
-        public Resources getResources() {
-            return mResources;
-        }
-
-        @Override
-        public Object getSystemService(String name) {
-            if (Context.WIFI_SERVICE.equals(name)) return mWifiManager;
-            if (Context.USB_SERVICE.equals(name)) return mUsbManager;
-            if (Context.TELEPHONY_SERVICE.equals(name)) return mTelephonyManager;
-            if (Context.USER_SERVICE.equals(name)) return mUserManager;
-            if (Context.NETWORK_STATS_SERVICE.equals(name)) return mStatsManager;
-            if (Context.CONNECTIVITY_SERVICE.equals(name)) return mCm;
-            if (Context.ETHERNET_SERVICE.equals(name)) return mEm;
-            return super.getSystemService(name);
-        }
-
-        @Override
-        public String getSystemServiceName(Class<?> serviceClass) {
-            if (TelephonyManager.class.equals(serviceClass)) return Context.TELEPHONY_SERVICE;
-            return super.getSystemServiceName(serviceClass);
-        }
-    }
-
-    public class MockIpServerDependencies extends IpServer.Dependencies {
-        @Override
-        public RouterAdvertisementDaemon getRouterAdvertisementDaemon(
-                InterfaceParams ifParams) {
-            return mRouterAdvertisementDaemon;
-        }
-
-        @Override
-        public InterfaceParams getInterfaceParams(String ifName) {
-            assertTrue("Non-mocked interface " + ifName,
-                    ifName.equals(TEST_USB_IFNAME)
-                            || ifName.equals(TEST_WLAN_IFNAME)
-                            || ifName.equals(TEST_MOBILE_IFNAME)
-                            || ifName.equals(TEST_P2P_IFNAME)
-                            || ifName.equals(TEST_NCM_IFNAME));
-            final String[] ifaces = new String[] {
-                    TEST_USB_IFNAME, TEST_WLAN_IFNAME, TEST_MOBILE_IFNAME, TEST_P2P_IFNAME,
-                    TEST_NCM_IFNAME};
-            return new InterfaceParams(ifName, ArrayUtils.indexOf(ifaces, ifName) + IFINDEX_OFFSET,
-                    MacAddress.ALL_ZEROS_ADDRESS);
-        }
-
-        @Override
-        public void makeDhcpServer(String ifName, DhcpServingParamsParcel params,
-                DhcpServerCallbacks cb) {
-            new Thread(() -> {
-                try {
-                    cb.onDhcpServerCreated(STATUS_SUCCESS, mDhcpServer);
-                } catch (RemoteException e) {
-                    fail(e.getMessage());
-                }
-            }).run();
-        }
-
-        public IpNeighborMonitor getIpNeighborMonitor(Handler h, SharedLog l,
-                IpNeighborMonitor.NeighborEventConsumer c) {
-            return mIpNeighborMonitor;
-        }
-    }
-
-    private class MockTetheringConfiguration extends TetheringConfiguration {
-        MockTetheringConfiguration(Context ctx, SharedLog log, int id) {
-            super(ctx, log, id);
-        }
-
-        @Override
-        protected boolean getDeviceConfigBoolean(final String name) {
-            return false;
-        }
-
-        @Override
-        protected Resources getResourcesForSubIdWrapper(Context ctx, int subId) {
-            return mResources;
-        }
-    }
-
-    public class MockTetheringDependencies extends TetheringDependencies {
-        StateMachine mUpstreamNetworkMonitorMasterSM;
-        ArrayList<IpServer> mIpv6CoordinatorNotifyList;
-
-        public void reset() {
-            mUpstreamNetworkMonitorMasterSM = null;
-            mIpv6CoordinatorNotifyList = null;
-        }
-
-        @Override
-        public OffloadHardwareInterface getOffloadHardwareInterface(Handler h, SharedLog log) {
-            return mOffloadHardwareInterface;
-        }
-
-        @Override
-        public UpstreamNetworkMonitor getUpstreamNetworkMonitor(Context ctx,
-                StateMachine target, SharedLog log, int what) {
-            mUpstreamNetworkMonitorMasterSM = target;
-            return mUpstreamNetworkMonitor;
-        }
-
-        @Override
-        public IPv6TetheringCoordinator getIPv6TetheringCoordinator(
-                ArrayList<IpServer> notifyList, SharedLog log) {
-            mIpv6CoordinatorNotifyList = notifyList;
-            return mIPv6TetheringCoordinator;
-        }
-
-        @Override
-        public IpServer.Dependencies getIpServerDependencies() {
-            return mIpServerDependencies;
-        }
-
-        @Override
-        public NetworkRequest getDefaultNetworkRequest() {
-            return mNetworkRequest;
-        }
-
-        @Override
-        public boolean isTetheringSupported() {
-            return true;
-        }
-
-        @Override
-        public TetheringConfiguration generateTetheringConfiguration(Context ctx, SharedLog log,
-                int subId) {
-            return new MockTetheringConfiguration(ctx, log, subId);
-        }
-
-        @Override
-        public INetd getINetd(Context context) {
-            return mNetd;
-        }
-
-        @Override
-        public Looper getTetheringLooper() {
-            return mLooper.getLooper();
-        }
-
-        @Override
-        public Context getContext() {
-            return mServiceContext;
-        }
-
-        @Override
-        public BluetoothAdapter getBluetoothAdapter() {
-            // TODO: add test for bluetooth tethering.
-            return null;
-        }
-
-        @Override
-        public TetheringNotificationUpdater getNotificationUpdater(Context ctx) {
-            return mNotificationUpdater;
-        }
-    }
-
-    private static UpstreamNetworkState buildMobileUpstreamState(boolean withIPv4,
-            boolean withIPv6, boolean with464xlat) {
-        final LinkProperties prop = new LinkProperties();
-        prop.setInterfaceName(TEST_MOBILE_IFNAME);
-
-        if (withIPv4) {
-            prop.addRoute(new RouteInfo(new IpPrefix(Inet4Address.ANY, 0),
-                    InetAddresses.parseNumericAddress("10.0.0.1"),
-                    TEST_MOBILE_IFNAME, RTN_UNICAST));
-        }
-
-        if (withIPv6) {
-            prop.addDnsServer(InetAddresses.parseNumericAddress("2001:db8::2"));
-            prop.addLinkAddress(
-                    new LinkAddress(InetAddresses.parseNumericAddress("2001:db8::"),
-                            NetworkConstants.RFC7421_PREFIX_LENGTH));
-            prop.addRoute(new RouteInfo(new IpPrefix(Inet6Address.ANY, 0),
-                    InetAddresses.parseNumericAddress("2001:db8::1"),
-                    TEST_MOBILE_IFNAME, RTN_UNICAST));
-        }
-
-        if (with464xlat) {
-            final LinkProperties stackedLink = new LinkProperties();
-            stackedLink.setInterfaceName(TEST_XLAT_MOBILE_IFNAME);
-            stackedLink.addRoute(new RouteInfo(new IpPrefix(Inet4Address.ANY, 0),
-                    InetAddresses.parseNumericAddress("192.0.0.1"),
-                    TEST_XLAT_MOBILE_IFNAME, RTN_UNICAST));
-
-            prop.addStackedLink(stackedLink);
-        }
-
-
-        final NetworkCapabilities capabilities = new NetworkCapabilities()
-                .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR);
-        return new UpstreamNetworkState(prop, capabilities, new Network(100));
-    }
-
-    private static UpstreamNetworkState buildMobileIPv4UpstreamState() {
-        return buildMobileUpstreamState(true, false, false);
-    }
-
-    private static UpstreamNetworkState buildMobileIPv6UpstreamState() {
-        return buildMobileUpstreamState(false, true, false);
-    }
-
-    private static UpstreamNetworkState buildMobileDualStackUpstreamState() {
-        return buildMobileUpstreamState(true, true, false);
-    }
-
-    private static UpstreamNetworkState buildMobile464xlatUpstreamState() {
-        return buildMobileUpstreamState(false, true, true);
-    }
-
-    // See FakeSettingsProvider#clearSettingsProvider() that this needs to be called before and
-    // after use.
-    @BeforeClass
-    public static void setupOnce() {
-        FakeSettingsProvider.clearSettingsProvider();
-    }
-
-    @AfterClass
-    public static void tearDownOnce() {
-        FakeSettingsProvider.clearSettingsProvider();
-    }
-
-    @Before
-    public void setUp() throws Exception {
-        MockitoAnnotations.initMocks(this);
-        when(mResources.getStringArray(R.array.config_tether_dhcp_range))
-                .thenReturn(new String[0]);
-        when(mResources.getStringArray(R.array.config_tether_usb_regexs))
-                .thenReturn(new String[] { "test_rndis\\d" });
-        when(mResources.getStringArray(R.array.config_tether_wifi_regexs))
-                .thenReturn(new String[]{ "test_wlan\\d" });
-        when(mResources.getStringArray(R.array.config_tether_wifi_p2p_regexs))
-                .thenReturn(new String[]{ "test_p2p-p2p\\d-.*" });
-        when(mResources.getStringArray(R.array.config_tether_bluetooth_regexs))
-                .thenReturn(new String[0]);
-        when(mResources.getStringArray(R.array.config_tether_ncm_regexs))
-                .thenReturn(new String[] { "test_ncm\\d" });
-        when(mResources.getIntArray(R.array.config_tether_upstream_types)).thenReturn(new int[0]);
-        when(mResources.getBoolean(R.bool.config_tether_upstream_automatic)).thenReturn(false);
-        when(mResources.getBoolean(R.bool.config_tether_enable_legacy_dhcp_server)).thenReturn(
-                false);
-        when(mNetd.interfaceGetList())
-                .thenReturn(new String[] {
-                        TEST_MOBILE_IFNAME, TEST_WLAN_IFNAME, TEST_USB_IFNAME, TEST_P2P_IFNAME,
-                        TEST_NCM_IFNAME});
-        when(mResources.getString(R.string.config_wifi_tether_enable)).thenReturn("");
-        mInterfaceConfiguration = new InterfaceConfigurationParcel();
-        mInterfaceConfiguration.flags = new String[0];
-        when(mRouterAdvertisementDaemon.start())
-                .thenReturn(true);
-        initOffloadConfiguration(true /* offloadConfig */, true /* offloadControl */,
-                0 /* defaultDisabled */);
-        when(mOffloadHardwareInterface.getForwardedStats(any())).thenReturn(mForwardedStats);
-
-        mServiceContext = new TestContext(mContext);
-        mContentResolver = new MockContentResolver(mServiceContext);
-        mContentResolver.addProvider(Settings.AUTHORITY, new FakeSettingsProvider());
-        mIntents = new Vector<>();
-        mBroadcastReceiver = new BroadcastReceiver() {
-            @Override
-            public void onReceive(Context context, Intent intent) {
-                mIntents.addElement(intent);
-            }
-        };
-        mServiceContext.registerReceiver(mBroadcastReceiver,
-                new IntentFilter(ACTION_TETHER_STATE_CHANGED));
-        mTethering = makeTethering();
-        mTethering.startStateMachineUpdaters();
-        verify(mStatsManager, times(1)).registerNetworkStatsProvider(anyString(), any());
-        verify(mNetd).registerUnsolicitedEventListener(any());
-        final ArgumentCaptor<PhoneStateListener> phoneListenerCaptor =
-                ArgumentCaptor.forClass(PhoneStateListener.class);
-        verify(mTelephonyManager).listen(phoneListenerCaptor.capture(),
-                eq(PhoneStateListener.LISTEN_ACTIVE_DATA_SUBSCRIPTION_ID_CHANGE));
-        verify(mWifiManager).registerSoftApCallback(any(), any());
-        mPhoneStateListener = phoneListenerCaptor.getValue();
-    }
-
-    private Tethering makeTethering() {
-        mTetheringDependencies.reset();
-        return new Tethering(mTetheringDependencies);
-    }
-
-    private TetheringRequestParcel createTetheringRequestParcel(final int type) {
-        return createTetheringRequestParcel(type, null, null);
-    }
-
-    private TetheringRequestParcel createTetheringRequestParcel(final int type,
-            final LinkAddress serverAddr, final LinkAddress clientAddr) {
-        final TetheringRequestParcel request = new TetheringRequestParcel();
-        request.tetheringType = type;
-        request.localIPv4Address = serverAddr;
-        request.staticClientAddress = clientAddr;
-        request.exemptFromEntitlementCheck = false;
-        request.showProvisioningUi = false;
-
-        return request;
-    }
-
-    @After
-    public void tearDown() {
-        mServiceContext.unregisterReceiver(mBroadcastReceiver);
-    }
-
-    private void sendWifiApStateChanged(int state) {
-        final Intent intent = new Intent(WifiManager.WIFI_AP_STATE_CHANGED_ACTION);
-        intent.putExtra(EXTRA_WIFI_AP_STATE, state);
-        mServiceContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL);
-    }
-
-    private void sendWifiApStateChanged(int state, String ifname, int ipmode) {
-        final Intent intent = new Intent(WifiManager.WIFI_AP_STATE_CHANGED_ACTION);
-        intent.putExtra(EXTRA_WIFI_AP_STATE, state);
-        intent.putExtra(EXTRA_WIFI_AP_INTERFACE_NAME, ifname);
-        intent.putExtra(EXTRA_WIFI_AP_MODE, ipmode);
-        mServiceContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL);
-    }
-
-    private static final String[] P2P_RECEIVER_PERMISSIONS_FOR_BROADCAST = {
-            android.Manifest.permission.ACCESS_FINE_LOCATION,
-            android.Manifest.permission.ACCESS_WIFI_STATE
-    };
-
-    private void sendWifiP2pConnectionChanged(
-            boolean isGroupFormed, boolean isGroupOwner, String ifname) {
-        WifiP2pGroup group = null;
-        WifiP2pInfo p2pInfo = new WifiP2pInfo();
-        p2pInfo.groupFormed = isGroupFormed;
-        if (isGroupFormed) {
-            p2pInfo.isGroupOwner = isGroupOwner;
-            group = mock(WifiP2pGroup.class);
-            when(group.isGroupOwner()).thenReturn(isGroupOwner);
-            when(group.getInterface()).thenReturn(ifname);
-        }
-
-        final Intent intent = mock(Intent.class);
-        when(intent.getAction()).thenReturn(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);
-        when(intent.getParcelableExtra(WifiP2pManager.EXTRA_WIFI_P2P_INFO)).thenReturn(p2pInfo);
-        when(intent.getParcelableExtra(WifiP2pManager.EXTRA_WIFI_P2P_GROUP)).thenReturn(group);
-
-        mServiceContext.sendBroadcastAsUserMultiplePermissions(intent, UserHandle.ALL,
-                P2P_RECEIVER_PERMISSIONS_FOR_BROADCAST);
-    }
-
-    private void sendUsbBroadcast(boolean connected, boolean configured, boolean function,
-            int type) {
-        final Intent intent = new Intent(UsbManager.ACTION_USB_STATE);
-        intent.putExtra(USB_CONNECTED, connected);
-        intent.putExtra(USB_CONFIGURED, configured);
-        if (type == TETHERING_USB) {
-            intent.putExtra(USB_FUNCTION_RNDIS, function);
-        } else {
-            intent.putExtra(USB_FUNCTION_NCM, function);
-        }
-        mServiceContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL);
-    }
-
-    private void sendConfigurationChanged() {
-        final Intent intent = new Intent(Intent.ACTION_CONFIGURATION_CHANGED);
-        mServiceContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL);
-    }
-
-    private void verifyInterfaceServingModeStarted(String ifname) throws Exception {
-        verify(mNetd, times(1)).interfaceSetCfg(any(InterfaceConfigurationParcel.class));
-        verify(mNetd, times(1)).tetherInterfaceAdd(ifname);
-        verify(mNetd, times(1)).networkAddInterface(INetd.LOCAL_NET_ID, ifname);
-        verify(mNetd, times(2)).networkAddRoute(eq(INetd.LOCAL_NET_ID), eq(ifname),
-                anyString(), anyString());
-    }
-
-    private void verifyTetheringBroadcast(String ifname, String whichExtra) {
-        // Verify that ifname is in the whichExtra array of the tether state changed broadcast.
-        final Intent bcast = mIntents.get(0);
-        assertEquals(ACTION_TETHER_STATE_CHANGED, bcast.getAction());
-        final ArrayList<String> ifnames = bcast.getStringArrayListExtra(whichExtra);
-        assertTrue(ifnames.contains(ifname));
-        mIntents.remove(bcast);
-    }
-
-    public void failingLocalOnlyHotspotLegacyApBroadcast(
-            boolean emulateInterfaceStatusChanged) throws Exception {
-        // Emulate externally-visible WifiManager effects, causing the
-        // per-interface state machine to start up, and telling us that
-        // hotspot mode is to be started.
-        if (emulateInterfaceStatusChanged) {
-            mTethering.interfaceStatusChanged(TEST_WLAN_IFNAME, true);
-        }
-        sendWifiApStateChanged(WIFI_AP_STATE_ENABLED);
-        mLooper.dispatchAll();
-
-        // If, and only if, Tethering received an interface status changed then
-        // it creates a IpServer and sends out a broadcast indicating that the
-        // interface is "available".
-        if (emulateInterfaceStatusChanged) {
-            // There is 1 IpServer state change event: STATE_AVAILABLE
-            verify(mNotificationUpdater, times(1)).onDownstreamChanged(DOWNSTREAM_NONE);
-            verifyTetheringBroadcast(TEST_WLAN_IFNAME, EXTRA_AVAILABLE_TETHER);
-            verify(mWifiManager).updateInterfaceIpState(
-                    TEST_WLAN_IFNAME, WifiManager.IFACE_IP_MODE_UNSPECIFIED);
-        }
-        verifyNoMoreInteractions(mNetd);
-        verifyNoMoreInteractions(mWifiManager);
-    }
-
-    private void prepareNcmTethering() {
-        // Emulate startTethering(TETHERING_NCM) called
-        mTethering.startTethering(createTetheringRequestParcel(TETHERING_NCM), null);
-        mLooper.dispatchAll();
-        verify(mUsbManager, times(1)).setCurrentFunctions(UsbManager.FUNCTION_NCM);
-
-        mTethering.interfaceStatusChanged(TEST_NCM_IFNAME, true);
-    }
-
-    private void prepareUsbTethering(UpstreamNetworkState upstreamState) {
-        when(mUpstreamNetworkMonitor.getCurrentPreferredUpstream()).thenReturn(upstreamState);
-        when(mUpstreamNetworkMonitor.selectPreferredUpstreamType(any()))
-                .thenReturn(upstreamState);
-
-        // Emulate pressing the USB tethering button in Settings UI.
-        mTethering.startTethering(createTetheringRequestParcel(TETHERING_USB), null);
-        mLooper.dispatchAll();
-        verify(mUsbManager, times(1)).setCurrentFunctions(UsbManager.FUNCTION_RNDIS);
-
-        mTethering.interfaceStatusChanged(TEST_USB_IFNAME, true);
-    }
-
-    @Test
-    public void testUsbConfiguredBroadcastStartsTethering() throws Exception {
-        UpstreamNetworkState upstreamState = buildMobileIPv4UpstreamState();
-        prepareUsbTethering(upstreamState);
-
-        // This should produce no activity of any kind.
-        verifyNoMoreInteractions(mNetd);
-
-        // Pretend we then receive USB configured broadcast.
-        sendUsbBroadcast(true, true, true, TETHERING_USB);
-        mLooper.dispatchAll();
-        // Now we should see the start of tethering mechanics (in this case:
-        // tetherMatchingInterfaces() which starts by fetching all interfaces).
-        verify(mNetd, times(1)).interfaceGetList();
-
-        // UpstreamNetworkMonitor should receive selected upstream
-        verify(mUpstreamNetworkMonitor, times(1)).selectPreferredUpstreamType(any());
-        verify(mUpstreamNetworkMonitor, times(1)).setCurrentUpstream(upstreamState.network);
-    }
-
-    @Test
-    public void failingLocalOnlyHotspotLegacyApBroadcastWithIfaceStatusChanged() throws Exception {
-        failingLocalOnlyHotspotLegacyApBroadcast(true);
-    }
-
-    @Test
-    public void failingLocalOnlyHotspotLegacyApBroadcastSansIfaceStatusChanged() throws Exception {
-        failingLocalOnlyHotspotLegacyApBroadcast(false);
-    }
-
-    public void workingLocalOnlyHotspotEnrichedApBroadcast(
-            boolean emulateInterfaceStatusChanged) throws Exception {
-        // Emulate externally-visible WifiManager effects, causing the
-        // per-interface state machine to start up, and telling us that
-        // hotspot mode is to be started.
-        if (emulateInterfaceStatusChanged) {
-            mTethering.interfaceStatusChanged(TEST_WLAN_IFNAME, true);
-        }
-        sendWifiApStateChanged(WIFI_AP_STATE_ENABLED, TEST_WLAN_IFNAME, IFACE_IP_MODE_LOCAL_ONLY);
-        mLooper.dispatchAll();
-
-        verifyInterfaceServingModeStarted(TEST_WLAN_IFNAME);
-        verifyTetheringBroadcast(TEST_WLAN_IFNAME, EXTRA_AVAILABLE_TETHER);
-        verify(mNetd, times(1)).ipfwdEnableForwarding(TETHERING_NAME);
-        verify(mNetd, times(1)).tetherStartWithConfiguration(any());
-        verifyNoMoreInteractions(mNetd);
-        verify(mWifiManager).updateInterfaceIpState(
-                TEST_WLAN_IFNAME, WifiManager.IFACE_IP_MODE_UNSPECIFIED);
-        verify(mWifiManager).updateInterfaceIpState(
-                TEST_WLAN_IFNAME, WifiManager.IFACE_IP_MODE_LOCAL_ONLY);
-        verifyNoMoreInteractions(mWifiManager);
-        verifyTetheringBroadcast(TEST_WLAN_IFNAME, EXTRA_ACTIVE_LOCAL_ONLY);
-        verify(mUpstreamNetworkMonitor, times(1)).startObserveAllNetworks();
-        // There are 2 IpServer state change events: STATE_AVAILABLE -> STATE_LOCAL_ONLY
-        verify(mNotificationUpdater, times(2)).onDownstreamChanged(DOWNSTREAM_NONE);
-
-        // Emulate externally-visible WifiManager effects, when hotspot mode
-        // is being torn down.
-        sendWifiApStateChanged(WifiManager.WIFI_AP_STATE_DISABLED);
-        mTethering.interfaceRemoved(TEST_WLAN_IFNAME);
-        mLooper.dispatchAll();
-
-        verify(mNetd, times(1)).tetherApplyDnsInterfaces();
-        verify(mNetd, times(1)).tetherInterfaceRemove(TEST_WLAN_IFNAME);
-        verify(mNetd, times(1)).networkRemoveInterface(INetd.LOCAL_NET_ID, TEST_WLAN_IFNAME);
-        // interfaceSetCfg() called once for enabling and twice disabling IPv4.
-        verify(mNetd, times(3)).interfaceSetCfg(any(InterfaceConfigurationParcel.class));
-        verify(mNetd, times(1)).tetherStop();
-        verify(mNetd, times(1)).ipfwdDisableForwarding(TETHERING_NAME);
-        verify(mWifiManager, times(3)).updateInterfaceIpState(
-                TEST_WLAN_IFNAME, WifiManager.IFACE_IP_MODE_UNSPECIFIED);
-        verifyNoMoreInteractions(mNetd);
-        verifyNoMoreInteractions(mWifiManager);
-        // Asking for the last error after the per-interface state machine
-        // has been reaped yields an unknown interface error.
-        assertEquals(TETHER_ERROR_UNKNOWN_IFACE, mTethering.getLastTetherError(TEST_WLAN_IFNAME));
-    }
-
-    /**
-     * Send CMD_IPV6_TETHER_UPDATE to IpServers as would be done by IPv6TetheringCoordinator.
-     */
-    private void sendIPv6TetherUpdates(UpstreamNetworkState upstreamState) {
-        // IPv6TetheringCoordinator must have been notified of downstream
-        verify(mIPv6TetheringCoordinator, times(1)).addActiveDownstream(
-                argThat(sm -> sm.linkProperties().getInterfaceName().equals(TEST_USB_IFNAME)),
-                eq(IpServer.STATE_TETHERED));
-
-        for (IpServer ipSrv : mTetheringDependencies.mIpv6CoordinatorNotifyList) {
-            UpstreamNetworkState ipv6OnlyState = buildMobileUpstreamState(false, true, false);
-            ipSrv.sendMessage(IpServer.CMD_IPV6_TETHER_UPDATE, 0, 0,
-                    upstreamState.linkProperties.isIpv6Provisioned()
-                            ? ipv6OnlyState.linkProperties
-                            : null);
-        }
-        mLooper.dispatchAll();
-    }
-
-    private void runUsbTethering(UpstreamNetworkState upstreamState) {
-        prepareUsbTethering(upstreamState);
-        sendUsbBroadcast(true, true, true, TETHERING_USB);
-        mLooper.dispatchAll();
-    }
-
-    @Test
-    public void workingMobileUsbTethering_IPv4() throws Exception {
-        UpstreamNetworkState upstreamState = buildMobileIPv4UpstreamState();
-        runUsbTethering(upstreamState);
-
-        verify(mNetd, times(1)).tetherAddForward(TEST_USB_IFNAME, TEST_MOBILE_IFNAME);
-        verify(mNetd, times(1)).ipfwdAddInterfaceForward(TEST_USB_IFNAME, TEST_MOBILE_IFNAME);
-
-        sendIPv6TetherUpdates(upstreamState);
-        verify(mRouterAdvertisementDaemon, never()).buildNewRa(any(), notNull());
-        verify(mDhcpServer, timeout(DHCPSERVER_START_TIMEOUT_MS).times(1)).startWithCallbacks(
-                any(), any());
-    }
-
-    @Test
-    public void workingMobileUsbTethering_IPv4LegacyDhcp() {
-        when(mResources.getBoolean(R.bool.config_tether_enable_legacy_dhcp_server)).thenReturn(
-                true);
-        sendConfigurationChanged();
-        final UpstreamNetworkState upstreamState = buildMobileIPv4UpstreamState();
-        runUsbTethering(upstreamState);
-        sendIPv6TetherUpdates(upstreamState);
-
-        verify(mIpServerDependencies, never()).makeDhcpServer(any(), any(), any());
-    }
-
-    @Test
-    public void workingMobileUsbTethering_IPv6() throws Exception {
-        UpstreamNetworkState upstreamState = buildMobileIPv6UpstreamState();
-        runUsbTethering(upstreamState);
-
-        verify(mNetd, times(1)).tetherAddForward(TEST_USB_IFNAME, TEST_MOBILE_IFNAME);
-        verify(mNetd, times(1)).ipfwdAddInterfaceForward(TEST_USB_IFNAME, TEST_MOBILE_IFNAME);
-
-        sendIPv6TetherUpdates(upstreamState);
-        verify(mRouterAdvertisementDaemon, times(1)).buildNewRa(any(), notNull());
-        verify(mNetd, times(1)).tetherApplyDnsInterfaces();
-    }
-
-    @Test
-    public void workingMobileUsbTethering_DualStack() throws Exception {
-        UpstreamNetworkState upstreamState = buildMobileDualStackUpstreamState();
-        runUsbTethering(upstreamState);
-
-        verify(mNetd, times(1)).tetherAddForward(TEST_USB_IFNAME, TEST_MOBILE_IFNAME);
-        verify(mNetd, times(1)).ipfwdAddInterfaceForward(TEST_USB_IFNAME, TEST_MOBILE_IFNAME);
-        verify(mRouterAdvertisementDaemon, times(1)).start();
-        verify(mDhcpServer, timeout(DHCPSERVER_START_TIMEOUT_MS).times(1)).startWithCallbacks(
-                any(), any());
-
-        sendIPv6TetherUpdates(upstreamState);
-        verify(mRouterAdvertisementDaemon, times(1)).buildNewRa(any(), notNull());
-        verify(mNetd, times(1)).tetherApplyDnsInterfaces();
-    }
-
-    @Test
-    public void workingMobileUsbTethering_MultipleUpstreams() throws Exception {
-        UpstreamNetworkState upstreamState = buildMobile464xlatUpstreamState();
-        runUsbTethering(upstreamState);
-
-        verify(mNetd, times(1)).tetherAddForward(TEST_USB_IFNAME, TEST_XLAT_MOBILE_IFNAME);
-        verify(mNetd, times(1)).tetherAddForward(TEST_USB_IFNAME, TEST_MOBILE_IFNAME);
-        verify(mDhcpServer, timeout(DHCPSERVER_START_TIMEOUT_MS).times(1)).startWithCallbacks(
-                any(), any());
-        verify(mNetd, times(1)).ipfwdAddInterfaceForward(TEST_USB_IFNAME, TEST_XLAT_MOBILE_IFNAME);
-        verify(mNetd, times(1)).ipfwdAddInterfaceForward(TEST_USB_IFNAME, TEST_MOBILE_IFNAME);
-
-        sendIPv6TetherUpdates(upstreamState);
-        verify(mRouterAdvertisementDaemon, times(1)).buildNewRa(any(), notNull());
-        verify(mNetd, times(1)).tetherApplyDnsInterfaces();
-    }
-
-    @Test
-    public void workingMobileUsbTethering_v6Then464xlat() throws Exception {
-        // Setup IPv6
-        UpstreamNetworkState upstreamState = buildMobileIPv6UpstreamState();
-        runUsbTethering(upstreamState);
-
-        verify(mNetd, times(1)).tetherAddForward(TEST_USB_IFNAME, TEST_MOBILE_IFNAME);
-        verify(mDhcpServer, timeout(DHCPSERVER_START_TIMEOUT_MS).times(1)).startWithCallbacks(
-                any(), any());
-        verify(mNetd, times(1)).ipfwdAddInterfaceForward(TEST_USB_IFNAME, TEST_MOBILE_IFNAME);
-
-        // Then 464xlat comes up
-        upstreamState = buildMobile464xlatUpstreamState();
-        when(mUpstreamNetworkMonitor.selectPreferredUpstreamType(any()))
-                .thenReturn(upstreamState);
-
-        // Upstream LinkProperties changed: UpstreamNetworkMonitor sends EVENT_ON_LINKPROPERTIES.
-        mTetheringDependencies.mUpstreamNetworkMonitorMasterSM.sendMessage(
-                Tethering.TetherMasterSM.EVENT_UPSTREAM_CALLBACK,
-                UpstreamNetworkMonitor.EVENT_ON_LINKPROPERTIES,
-                0,
-                upstreamState);
-        mLooper.dispatchAll();
-
-        // Forwarding is added for 464xlat
-        verify(mNetd, times(1)).tetherAddForward(TEST_USB_IFNAME, TEST_XLAT_MOBILE_IFNAME);
-        verify(mNetd, times(1)).ipfwdAddInterfaceForward(TEST_USB_IFNAME, TEST_XLAT_MOBILE_IFNAME);
-        // Forwarding was not re-added for v6 (still times(1))
-        verify(mNetd, times(1)).tetherAddForward(TEST_USB_IFNAME, TEST_MOBILE_IFNAME);
-        verify(mNetd, times(1)).ipfwdAddInterfaceForward(TEST_USB_IFNAME, TEST_MOBILE_IFNAME);
-        // DHCP not restarted on downstream (still times(1))
-        verify(mDhcpServer, timeout(DHCPSERVER_START_TIMEOUT_MS).times(1)).startWithCallbacks(
-                any(), any());
-    }
-
-    @Test
-    public void configTetherUpstreamAutomaticIgnoresConfigTetherUpstreamTypes() throws Exception {
-        when(mResources.getBoolean(R.bool.config_tether_upstream_automatic)).thenReturn(true);
-        sendConfigurationChanged();
-
-        // Setup IPv6
-        final UpstreamNetworkState upstreamState = buildMobileIPv6UpstreamState();
-        runUsbTethering(upstreamState);
-
-        // UpstreamNetworkMonitor should choose upstream automatically
-        // (in this specific case: choose the default network).
-        verify(mUpstreamNetworkMonitor, times(1)).getCurrentPreferredUpstream();
-        verify(mUpstreamNetworkMonitor, never()).selectPreferredUpstreamType(any());
-
-        verify(mUpstreamNetworkMonitor, times(1)).setCurrentUpstream(upstreamState.network);
-    }
-
-    private void runNcmTethering() {
-        prepareNcmTethering();
-        sendUsbBroadcast(true, true, true, TETHERING_NCM);
-        mLooper.dispatchAll();
-    }
-
-    @Test
-    public void workingNcmTethering() throws Exception {
-        runNcmTethering();
-
-        verify(mDhcpServer, timeout(DHCPSERVER_START_TIMEOUT_MS).times(1)).startWithCallbacks(
-                any(), any());
-    }
-
-    @Test
-    public void workingNcmTethering_LegacyDhcp() {
-        when(mResources.getBoolean(R.bool.config_tether_enable_legacy_dhcp_server)).thenReturn(
-                true);
-        sendConfigurationChanged();
-        runNcmTethering();
-
-        verify(mIpServerDependencies, never()).makeDhcpServer(any(), any(), any());
-    }
-
-    @Test
-    public void workingLocalOnlyHotspotEnrichedApBroadcastWithIfaceChanged() throws Exception {
-        workingLocalOnlyHotspotEnrichedApBroadcast(true);
-    }
-
-    @Test
-    public void workingLocalOnlyHotspotEnrichedApBroadcastSansIfaceChanged() throws Exception {
-        workingLocalOnlyHotspotEnrichedApBroadcast(false);
-    }
-
-    // TODO: Test with and without interfaceStatusChanged().
-    @Test
-    public void failingWifiTetheringLegacyApBroadcast() throws Exception {
-        when(mWifiManager.startTetheredHotspot(any(SoftApConfiguration.class))).thenReturn(true);
-
-        // Emulate pressing the WiFi tethering button.
-        mTethering.startTethering(createTetheringRequestParcel(TETHERING_WIFI), null);
-        mLooper.dispatchAll();
-        verify(mWifiManager, times(1)).startTetheredHotspot(null);
-        verifyNoMoreInteractions(mWifiManager);
-        verifyNoMoreInteractions(mNetd);
-
-        // Emulate externally-visible WifiManager effects, causing the
-        // per-interface state machine to start up, and telling us that
-        // tethering mode is to be started.
-        mTethering.interfaceStatusChanged(TEST_WLAN_IFNAME, true);
-        sendWifiApStateChanged(WIFI_AP_STATE_ENABLED);
-        mLooper.dispatchAll();
-
-        // There is 1 IpServer state change event: STATE_AVAILABLE
-        verify(mNotificationUpdater, times(1)).onDownstreamChanged(DOWNSTREAM_NONE);
-        verifyTetheringBroadcast(TEST_WLAN_IFNAME, EXTRA_AVAILABLE_TETHER);
-        verify(mWifiManager).updateInterfaceIpState(
-                TEST_WLAN_IFNAME, WifiManager.IFACE_IP_MODE_UNSPECIFIED);
-        verifyNoMoreInteractions(mNetd);
-        verifyNoMoreInteractions(mWifiManager);
-    }
-
-    // TODO: Test with and without interfaceStatusChanged().
-    @Test
-    public void workingWifiTetheringEnrichedApBroadcast() throws Exception {
-        when(mWifiManager.startTetheredHotspot(any(SoftApConfiguration.class))).thenReturn(true);
-
-        // Emulate pressing the WiFi tethering button.
-        mTethering.startTethering(createTetheringRequestParcel(TETHERING_WIFI), null);
-        mLooper.dispatchAll();
-        verify(mWifiManager, times(1)).startTetheredHotspot(null);
-        verifyNoMoreInteractions(mWifiManager);
-        verifyNoMoreInteractions(mNetd);
-
-        // Emulate externally-visible WifiManager effects, causing the
-        // per-interface state machine to start up, and telling us that
-        // tethering mode is to be started.
-        mTethering.interfaceStatusChanged(TEST_WLAN_IFNAME, true);
-        sendWifiApStateChanged(WIFI_AP_STATE_ENABLED, TEST_WLAN_IFNAME, IFACE_IP_MODE_TETHERED);
-        mLooper.dispatchAll();
-
-        verifyInterfaceServingModeStarted(TEST_WLAN_IFNAME);
-        verifyTetheringBroadcast(TEST_WLAN_IFNAME, EXTRA_AVAILABLE_TETHER);
-        verify(mNetd, times(1)).ipfwdEnableForwarding(TETHERING_NAME);
-        verify(mNetd, times(1)).tetherStartWithConfiguration(any());
-        verify(mNetd, times(2)).networkAddRoute(eq(INetd.LOCAL_NET_ID), eq(TEST_WLAN_IFNAME),
-                anyString(), anyString());
-        verifyNoMoreInteractions(mNetd);
-        verify(mWifiManager).updateInterfaceIpState(
-                TEST_WLAN_IFNAME, WifiManager.IFACE_IP_MODE_UNSPECIFIED);
-        verify(mWifiManager).updateInterfaceIpState(
-                TEST_WLAN_IFNAME, WifiManager.IFACE_IP_MODE_TETHERED);
-        verifyNoMoreInteractions(mWifiManager);
-        verifyTetheringBroadcast(TEST_WLAN_IFNAME, EXTRA_ACTIVE_TETHER);
-        verify(mUpstreamNetworkMonitor, times(1)).startObserveAllNetworks();
-        // In tethering mode, in the default configuration, an explicit request
-        // for a mobile network is also made.
-        verify(mUpstreamNetworkMonitor, times(1)).registerMobileNetworkRequest();
-        // There are 2 IpServer state change events: STATE_AVAILABLE -> STATE_TETHERED
-        verify(mNotificationUpdater, times(1)).onDownstreamChanged(DOWNSTREAM_NONE);
-        verify(mNotificationUpdater, times(1)).onDownstreamChanged(eq(1 << TETHERING_WIFI));
-
-        /////
-        // We do not currently emulate any upstream being found.
-        //
-        // This is why there are no calls to verify mNetd.tetherAddForward() or
-        // mNetd.ipfwdAddInterfaceForward().
-        /////
-
-        // Emulate pressing the WiFi tethering button.
-        mTethering.stopTethering(TETHERING_WIFI);
-        mLooper.dispatchAll();
-        verify(mWifiManager, times(1)).stopSoftAp();
-        verifyNoMoreInteractions(mWifiManager);
-        verifyNoMoreInteractions(mNetd);
-
-        // Emulate externally-visible WifiManager effects, when tethering mode
-        // is being torn down.
-        sendWifiApStateChanged(WifiManager.WIFI_AP_STATE_DISABLED);
-        mTethering.interfaceRemoved(TEST_WLAN_IFNAME);
-        mLooper.dispatchAll();
-
-        verify(mNetd, times(1)).tetherApplyDnsInterfaces();
-        verify(mNetd, times(1)).tetherInterfaceRemove(TEST_WLAN_IFNAME);
-        verify(mNetd, times(1)).networkRemoveInterface(INetd.LOCAL_NET_ID, TEST_WLAN_IFNAME);
-        // interfaceSetCfg() called once for enabling and twice for disabling IPv4.
-        verify(mNetd, times(3)).interfaceSetCfg(any(InterfaceConfigurationParcel.class));
-        verify(mNetd, times(1)).tetherStop();
-        verify(mNetd, times(1)).ipfwdDisableForwarding(TETHERING_NAME);
-        verify(mWifiManager, times(3)).updateInterfaceIpState(
-                TEST_WLAN_IFNAME, WifiManager.IFACE_IP_MODE_UNSPECIFIED);
-        verifyNoMoreInteractions(mNetd);
-        verifyNoMoreInteractions(mWifiManager);
-        // Asking for the last error after the per-interface state machine
-        // has been reaped yields an unknown interface error.
-        assertEquals(TETHER_ERROR_UNKNOWN_IFACE, mTethering.getLastTetherError(TEST_WLAN_IFNAME));
-    }
-
-    // TODO: Test with and without interfaceStatusChanged().
-    @Test
-    public void failureEnablingIpForwarding() throws Exception {
-        when(mWifiManager.startTetheredHotspot(any(SoftApConfiguration.class))).thenReturn(true);
-        doThrow(new RemoteException()).when(mNetd).ipfwdEnableForwarding(TETHERING_NAME);
-
-        // Emulate pressing the WiFi tethering button.
-        mTethering.startTethering(createTetheringRequestParcel(TETHERING_WIFI), null);
-        mLooper.dispatchAll();
-        verify(mWifiManager, times(1)).startTetheredHotspot(null);
-        verifyNoMoreInteractions(mWifiManager);
-        verifyNoMoreInteractions(mNetd);
-
-        // Emulate externally-visible WifiManager effects, causing the
-        // per-interface state machine to start up, and telling us that
-        // tethering mode is to be started.
-        mTethering.interfaceStatusChanged(TEST_WLAN_IFNAME, true);
-        sendWifiApStateChanged(WIFI_AP_STATE_ENABLED, TEST_WLAN_IFNAME, IFACE_IP_MODE_TETHERED);
-        mLooper.dispatchAll();
-
-        // We verify get/set called three times here: twice for setup and once during
-        // teardown because all events happen over the course of the single
-        // dispatchAll() above. Note that once the IpServer IPv4 address config
-        // code is refactored the two calls during shutdown will revert to one.
-        verify(mNetd, times(3)).interfaceSetCfg(argThat(p -> TEST_WLAN_IFNAME.equals(p.ifName)));
-        verify(mNetd, times(1)).tetherInterfaceAdd(TEST_WLAN_IFNAME);
-        verify(mNetd, times(1)).networkAddInterface(INetd.LOCAL_NET_ID, TEST_WLAN_IFNAME);
-        verify(mNetd, times(2)).networkAddRoute(eq(INetd.LOCAL_NET_ID), eq(TEST_WLAN_IFNAME),
-                anyString(), anyString());
-        verify(mWifiManager).updateInterfaceIpState(
-                TEST_WLAN_IFNAME, WifiManager.IFACE_IP_MODE_UNSPECIFIED);
-        verify(mWifiManager).updateInterfaceIpState(
-                TEST_WLAN_IFNAME, WifiManager.IFACE_IP_MODE_TETHERED);
-        // There are 3 IpServer state change event:
-        //         STATE_AVAILABLE -> STATE_TETHERED -> STATE_AVAILABLE.
-        verify(mNotificationUpdater, times(2)).onDownstreamChanged(DOWNSTREAM_NONE);
-        verify(mNotificationUpdater, times(1)).onDownstreamChanged(eq(1 << TETHERING_WIFI));
-        verifyTetheringBroadcast(TEST_WLAN_IFNAME, EXTRA_AVAILABLE_TETHER);
-        // This is called, but will throw.
-        verify(mNetd, times(1)).ipfwdEnableForwarding(TETHERING_NAME);
-        // This never gets called because of the exception thrown above.
-        verify(mNetd, times(0)).tetherStartWithConfiguration(any());
-        // When the master state machine transitions to an error state it tells
-        // downstream interfaces, which causes us to tell Wi-Fi about the error
-        // so it can take down AP mode.
-        verify(mNetd, times(1)).tetherApplyDnsInterfaces();
-        verify(mNetd, times(1)).tetherInterfaceRemove(TEST_WLAN_IFNAME);
-        verify(mNetd, times(1)).networkRemoveInterface(INetd.LOCAL_NET_ID, TEST_WLAN_IFNAME);
-        verify(mWifiManager).updateInterfaceIpState(
-                TEST_WLAN_IFNAME, WifiManager.IFACE_IP_MODE_CONFIGURATION_ERROR);
-
-        verifyNoMoreInteractions(mWifiManager);
-        verifyNoMoreInteractions(mNetd);
-    }
-
-    private void runUserRestrictionsChange(
-            boolean currentDisallow, boolean nextDisallow, String[] activeTetheringIfacesList,
-            int expectedInteractionsWithShowNotification) throws  Exception {
-        final Bundle newRestrictions = new Bundle();
-        newRestrictions.putBoolean(UserManager.DISALLOW_CONFIG_TETHERING, nextDisallow);
-        final Tethering mockTethering = mock(Tethering.class);
-        when(mockTethering.getTetheredIfaces()).thenReturn(activeTetheringIfacesList);
-        when(mUserManager.getUserRestrictions()).thenReturn(newRestrictions);
-
-        final Tethering.UserRestrictionActionListener ural =
-                new Tethering.UserRestrictionActionListener(
-                        mUserManager, mockTethering, mNotificationUpdater);
-        ural.mDisallowTethering = currentDisallow;
-
-        ural.onUserRestrictionsChanged();
-
-        verify(mNotificationUpdater, times(expectedInteractionsWithShowNotification))
-                .notifyTetheringDisabledByRestriction();
-        verify(mockTethering, times(expectedInteractionsWithShowNotification)).untetherAll();
-    }
-
-    @Test
-    public void testDisallowTetheringWhenNoTetheringInterfaceIsActive() throws Exception {
-        final String[] emptyActiveIfacesList = new String[]{};
-        final boolean currDisallow = false;
-        final boolean nextDisallow = true;
-        final int expectedInteractionsWithShowNotification = 1;
-
-        runUserRestrictionsChange(currDisallow, nextDisallow, emptyActiveIfacesList,
-                expectedInteractionsWithShowNotification);
-    }
-
-    @Test
-    public void testDisallowTetheringWhenAtLeastOneTetheringInterfaceIsActive() throws Exception {
-        final String[] nonEmptyActiveIfacesList = new String[]{TEST_WLAN_IFNAME};
-        final boolean currDisallow = false;
-        final boolean nextDisallow = true;
-        final int expectedInteractionsWithShowNotification = 1;
-
-        runUserRestrictionsChange(currDisallow, nextDisallow, nonEmptyActiveIfacesList,
-                expectedInteractionsWithShowNotification);
-    }
-
-    @Test
-    public void testAllowTetheringWhenNoTetheringInterfaceIsActive() throws Exception {
-        final String[] nonEmptyActiveIfacesList = new String[]{};
-        final boolean currDisallow = true;
-        final boolean nextDisallow = false;
-        final int expectedInteractionsWithShowNotification = 0;
-
-        runUserRestrictionsChange(currDisallow, nextDisallow, nonEmptyActiveIfacesList,
-                expectedInteractionsWithShowNotification);
-    }
-
-    @Test
-    public void testAllowTetheringWhenAtLeastOneTetheringInterfaceIsActive() throws Exception {
-        final String[] nonEmptyActiveIfacesList = new String[]{TEST_WLAN_IFNAME};
-        final boolean currDisallow = true;
-        final boolean nextDisallow = false;
-        final int expectedInteractionsWithShowNotification = 0;
-
-        runUserRestrictionsChange(currDisallow, nextDisallow, nonEmptyActiveIfacesList,
-                expectedInteractionsWithShowNotification);
-    }
-
-    @Test
-    public void testDisallowTetheringUnchanged() throws Exception {
-        final String[] nonEmptyActiveIfacesList = new String[]{TEST_WLAN_IFNAME};
-        final int expectedInteractionsWithShowNotification = 0;
-        boolean currDisallow = true;
-        boolean nextDisallow = true;
-
-        runUserRestrictionsChange(currDisallow, nextDisallow, nonEmptyActiveIfacesList,
-                expectedInteractionsWithShowNotification);
-
-        currDisallow = false;
-        nextDisallow = false;
-
-        runUserRestrictionsChange(currDisallow, nextDisallow, nonEmptyActiveIfacesList,
-                expectedInteractionsWithShowNotification);
-    }
-
-    private class TestTetheringEventCallback extends ITetheringEventCallback.Stub {
-        private final ArrayList<Network> mActualUpstreams = new ArrayList<>();
-        private final ArrayList<TetheringConfigurationParcel> mTetheringConfigs =
-                new ArrayList<>();
-        private final ArrayList<TetherStatesParcel> mTetherStates = new ArrayList<>();
-        private final ArrayList<Integer> mOffloadStatus = new ArrayList<>();
-
-        // This function will remove the recorded callbacks, so it must be called once for
-        // each callback. If this is called after multiple callback, the order matters.
-        // onCallbackCreated counts as the first call to expectUpstreamChanged with
-        // @see onCallbackCreated.
-        public void expectUpstreamChanged(Network... networks) {
-            if (networks == null) {
-                assertNoUpstreamChangeCallback();
-                return;
-            }
-
-            final ArrayList<Network> expectedUpstreams =
-                    new ArrayList<Network>(Arrays.asList(networks));
-            for (Network upstream : expectedUpstreams) {
-                // throws OOB if no expectations
-                assertEquals(mActualUpstreams.remove(0), upstream);
-            }
-            assertNoUpstreamChangeCallback();
-        }
-
-        // This function will remove the recorded callbacks, so it must be called once
-        // for each callback. If this is called after multiple callback, the order matters.
-        // onCallbackCreated counts as the first call to onConfigurationChanged with
-        // @see onCallbackCreated.
-        public void expectConfigurationChanged(TetheringConfigurationParcel... tetherConfigs) {
-            final ArrayList<TetheringConfigurationParcel> expectedTetherConfig =
-                    new ArrayList<TetheringConfigurationParcel>(Arrays.asList(tetherConfigs));
-            for (TetheringConfigurationParcel config : expectedTetherConfig) {
-                // throws OOB if no expectations
-                final TetheringConfigurationParcel actualConfig = mTetheringConfigs.remove(0);
-                assertTetherConfigParcelEqual(actualConfig, config);
-            }
-            assertNoConfigChangeCallback();
-        }
-
-        public void expectOffloadStatusChanged(final int expectedStatus) {
-            assertOffloadStatusChangedCallback();
-            assertEquals(mOffloadStatus.remove(0), new Integer(expectedStatus));
-        }
-
-        public TetherStatesParcel pollTetherStatesChanged() {
-            assertStateChangeCallback();
-            return mTetherStates.remove(0);
-        }
-
-        @Override
-        public void onUpstreamChanged(Network network) {
-            mActualUpstreams.add(network);
-        }
-
-        @Override
-        public void onConfigurationChanged(TetheringConfigurationParcel config) {
-            mTetheringConfigs.add(config);
-        }
-
-        @Override
-        public void onTetherStatesChanged(TetherStatesParcel states) {
-            mTetherStates.add(states);
-        }
-
-        @Override
-        public void onTetherClientsChanged(List<TetheredClient> clients) {
-            // TODO: check this
-        }
-
-        @Override
-        public void onOffloadStatusChanged(final int status) {
-            mOffloadStatus.add(status);
-        }
-
-        @Override
-        public void onCallbackStarted(TetheringCallbackStartedParcel parcel) {
-            mActualUpstreams.add(parcel.upstreamNetwork);
-            mTetheringConfigs.add(parcel.config);
-            mTetherStates.add(parcel.states);
-            mOffloadStatus.add(parcel.offloadStatus);
-        }
-
-        @Override
-        public void onCallbackStopped(int errorCode) { }
-
-        public void assertNoUpstreamChangeCallback() {
-            assertTrue(mActualUpstreams.isEmpty());
-        }
-
-        public void assertNoConfigChangeCallback() {
-            assertTrue(mTetheringConfigs.isEmpty());
-        }
-
-        public void assertNoStateChangeCallback() {
-            assertTrue(mTetherStates.isEmpty());
-        }
-
-        public void assertStateChangeCallback() {
-            assertFalse(mTetherStates.isEmpty());
-        }
-
-        public void assertOffloadStatusChangedCallback() {
-            assertFalse(mOffloadStatus.isEmpty());
-        }
-
-        public void assertNoCallback() {
-            assertNoUpstreamChangeCallback();
-            assertNoConfigChangeCallback();
-            assertNoStateChangeCallback();
-        }
-
-        private void assertTetherConfigParcelEqual(@NonNull TetheringConfigurationParcel actual,
-                @NonNull TetheringConfigurationParcel expect) {
-            assertEquals(actual.subId, expect.subId);
-            assertArrayEquals(actual.tetherableUsbRegexs, expect.tetherableUsbRegexs);
-            assertArrayEquals(actual.tetherableWifiRegexs, expect.tetherableWifiRegexs);
-            assertArrayEquals(actual.tetherableBluetoothRegexs, expect.tetherableBluetoothRegexs);
-            assertEquals(actual.isDunRequired, expect.isDunRequired);
-            assertEquals(actual.chooseUpstreamAutomatically, expect.chooseUpstreamAutomatically);
-            assertArrayEquals(actual.preferredUpstreamIfaceTypes,
-                    expect.preferredUpstreamIfaceTypes);
-            assertArrayEquals(actual.legacyDhcpRanges, expect.legacyDhcpRanges);
-            assertArrayEquals(actual.defaultIPv4DNS, expect.defaultIPv4DNS);
-            assertEquals(actual.enableLegacyDhcpServer, expect.enableLegacyDhcpServer);
-            assertArrayEquals(actual.provisioningApp, expect.provisioningApp);
-            assertEquals(actual.provisioningAppNoUi, expect.provisioningAppNoUi);
-            assertEquals(actual.provisioningCheckPeriod, expect.provisioningCheckPeriod);
-        }
-    }
-
-    private void assertTetherStatesNotNullButEmpty(final TetherStatesParcel parcel) {
-        assertFalse(parcel == null);
-        assertEquals(0, parcel.availableList.length);
-        assertEquals(0, parcel.tetheredList.length);
-        assertEquals(0, parcel.localOnlyList.length);
-        assertEquals(0, parcel.erroredIfaceList.length);
-        assertEquals(0, parcel.lastErrorList.length);
-        MiscAssertsKt.assertFieldCountEquals(5, TetherStatesParcel.class);
-    }
-
-    @Test
-    public void testRegisterTetheringEventCallback() throws Exception {
-        TestTetheringEventCallback callback = new TestTetheringEventCallback();
-        TestTetheringEventCallback callback2 = new TestTetheringEventCallback();
-
-        // 1. Register one callback before running any tethering.
-        mTethering.registerTetheringEventCallback(callback);
-        mLooper.dispatchAll();
-        callback.expectUpstreamChanged(new Network[] {null});
-        callback.expectConfigurationChanged(
-                mTethering.getTetheringConfiguration().toStableParcelable());
-        TetherStatesParcel tetherState = callback.pollTetherStatesChanged();
-        assertTetherStatesNotNullButEmpty(tetherState);
-        callback.expectOffloadStatusChanged(TETHER_HARDWARE_OFFLOAD_STOPPED);
-        // 2. Enable wifi tethering.
-        UpstreamNetworkState upstreamState = buildMobileDualStackUpstreamState();
-        when(mUpstreamNetworkMonitor.getCurrentPreferredUpstream()).thenReturn(upstreamState);
-        when(mUpstreamNetworkMonitor.selectPreferredUpstreamType(any()))
-                .thenReturn(upstreamState);
-        when(mWifiManager.startTetheredHotspot(any(SoftApConfiguration.class))).thenReturn(true);
-        mTethering.interfaceStatusChanged(TEST_WLAN_IFNAME, true);
-        mLooper.dispatchAll();
-        tetherState = callback.pollTetherStatesChanged();
-        assertArrayEquals(tetherState.availableList, new String[] {TEST_WLAN_IFNAME});
-
-        mTethering.startTethering(createTetheringRequestParcel(TETHERING_WIFI), null);
-        sendWifiApStateChanged(WIFI_AP_STATE_ENABLED, TEST_WLAN_IFNAME, IFACE_IP_MODE_TETHERED);
-        mLooper.dispatchAll();
-        tetherState = callback.pollTetherStatesChanged();
-        assertArrayEquals(tetherState.tetheredList, new String[] {TEST_WLAN_IFNAME});
-        callback.expectUpstreamChanged(upstreamState.network);
-        callback.expectOffloadStatusChanged(TETHER_HARDWARE_OFFLOAD_STARTED);
-
-        // 3. Register second callback.
-        mTethering.registerTetheringEventCallback(callback2);
-        mLooper.dispatchAll();
-        callback2.expectUpstreamChanged(upstreamState.network);
-        callback2.expectConfigurationChanged(
-                mTethering.getTetheringConfiguration().toStableParcelable());
-        tetherState = callback2.pollTetherStatesChanged();
-        assertEquals(tetherState.tetheredList, new String[] {TEST_WLAN_IFNAME});
-        callback2.expectOffloadStatusChanged(TETHER_HARDWARE_OFFLOAD_STARTED);
-
-        // 4. Unregister first callback and disable wifi tethering
-        mTethering.unregisterTetheringEventCallback(callback);
-        mLooper.dispatchAll();
-        mTethering.stopTethering(TETHERING_WIFI);
-        sendWifiApStateChanged(WifiManager.WIFI_AP_STATE_DISABLED);
-        mLooper.dispatchAll();
-        tetherState = callback2.pollTetherStatesChanged();
-        assertArrayEquals(tetherState.availableList, new String[] {TEST_WLAN_IFNAME});
-        mLooper.dispatchAll();
-        callback2.expectUpstreamChanged(new Network[] {null});
-        callback2.expectOffloadStatusChanged(TETHER_HARDWARE_OFFLOAD_STOPPED);
-        callback.assertNoCallback();
-    }
-
-    @Test
-    public void testReportFailCallbackIfOffloadNotSupported() throws Exception {
-        final UpstreamNetworkState upstreamState = buildMobileDualStackUpstreamState();
-        TestTetheringEventCallback callback = new TestTetheringEventCallback();
-        mTethering.registerTetheringEventCallback(callback);
-        mLooper.dispatchAll();
-        callback.expectOffloadStatusChanged(TETHER_HARDWARE_OFFLOAD_STOPPED);
-
-        // 1. Offload fail if no OffloadConfig.
-        initOffloadConfiguration(false /* offloadConfig */, true /* offloadControl */,
-                0 /* defaultDisabled */);
-        runUsbTethering(upstreamState);
-        callback.expectOffloadStatusChanged(TETHER_HARDWARE_OFFLOAD_FAILED);
-        runStopUSBTethering();
-        callback.expectOffloadStatusChanged(TETHER_HARDWARE_OFFLOAD_STOPPED);
-        reset(mUsbManager);
-        // 2. Offload fail if no OffloadControl.
-        initOffloadConfiguration(true /* offloadConfig */, false /* offloadControl */,
-                0 /* defaultDisabled */);
-        runUsbTethering(upstreamState);
-        callback.expectOffloadStatusChanged(TETHER_HARDWARE_OFFLOAD_FAILED);
-        runStopUSBTethering();
-        callback.expectOffloadStatusChanged(TETHER_HARDWARE_OFFLOAD_STOPPED);
-        reset(mUsbManager);
-        // 3. Offload fail if disabled by settings.
-        initOffloadConfiguration(true /* offloadConfig */, true /* offloadControl */,
-                1 /* defaultDisabled */);
-        runUsbTethering(upstreamState);
-        callback.expectOffloadStatusChanged(TETHER_HARDWARE_OFFLOAD_FAILED);
-        runStopUSBTethering();
-        callback.expectOffloadStatusChanged(TETHER_HARDWARE_OFFLOAD_STOPPED);
-    }
-
-    private void runStopUSBTethering() {
-        mTethering.stopTethering(TETHERING_USB);
-        mLooper.dispatchAll();
-        mTethering.interfaceRemoved(TEST_USB_IFNAME);
-        mLooper.dispatchAll();
-    }
-
-    private void initOffloadConfiguration(final boolean offloadConfig,
-            final boolean offloadControl, final int defaultDisabled) {
-        when(mOffloadHardwareInterface.initOffloadConfig()).thenReturn(offloadConfig);
-        when(mOffloadHardwareInterface.initOffloadControl(any())).thenReturn(offloadControl);
-        when(mOffloadHardwareInterface.getDefaultTetherOffloadDisabled()).thenReturn(
-                defaultDisabled);
-    }
-
-    @Test
-    public void testMultiSimAware() throws Exception {
-        final TetheringConfiguration initailConfig = mTethering.getTetheringConfiguration();
-        assertEquals(INVALID_SUBSCRIPTION_ID, initailConfig.activeDataSubId);
-
-        final int fakeSubId = 1234;
-        mPhoneStateListener.onActiveDataSubscriptionIdChanged(fakeSubId);
-        final TetheringConfiguration newConfig = mTethering.getTetheringConfiguration();
-        assertEquals(fakeSubId, newConfig.activeDataSubId);
-        verify(mNotificationUpdater, times(1)).onActiveDataSubscriptionIdChanged(eq(fakeSubId));
-    }
-
-    @Test
-    public void testNoDuplicatedEthernetRequest() throws Exception {
-        final TetheredInterfaceRequest mockRequest = mock(TetheredInterfaceRequest.class);
-        when(mEm.requestTetheredInterface(any(), any())).thenReturn(mockRequest);
-        mTethering.startTethering(createTetheringRequestParcel(TETHERING_ETHERNET), null);
-        mLooper.dispatchAll();
-        verify(mEm, times(1)).requestTetheredInterface(any(), any());
-        mTethering.startTethering(createTetheringRequestParcel(TETHERING_ETHERNET), null);
-        mLooper.dispatchAll();
-        verifyNoMoreInteractions(mEm);
-        mTethering.stopTethering(TETHERING_ETHERNET);
-        mLooper.dispatchAll();
-        verify(mockRequest, times(1)).release();
-        mTethering.stopTethering(TETHERING_ETHERNET);
-        mLooper.dispatchAll();
-        verifyNoMoreInteractions(mEm);
-    }
-
-    private void workingWifiP2pGroupOwner(
-            boolean emulateInterfaceStatusChanged) throws Exception {
-        if (emulateInterfaceStatusChanged) {
-            mTethering.interfaceStatusChanged(TEST_P2P_IFNAME, true);
-        }
-        sendWifiP2pConnectionChanged(true, true, TEST_P2P_IFNAME);
-        mLooper.dispatchAll();
-
-        verifyInterfaceServingModeStarted(TEST_P2P_IFNAME);
-        verifyTetheringBroadcast(TEST_P2P_IFNAME, EXTRA_AVAILABLE_TETHER);
-        verify(mNetd, times(1)).ipfwdEnableForwarding(TETHERING_NAME);
-        verify(mNetd, times(1)).tetherStartWithConfiguration(any());
-        verifyNoMoreInteractions(mNetd);
-        verifyTetheringBroadcast(TEST_P2P_IFNAME, EXTRA_ACTIVE_LOCAL_ONLY);
-        verify(mUpstreamNetworkMonitor, times(1)).startObserveAllNetworks();
-        // There are 2 IpServer state change events: STATE_AVAILABLE -> STATE_LOCAL_ONLY
-        verify(mNotificationUpdater, times(2)).onDownstreamChanged(DOWNSTREAM_NONE);
-
-        assertEquals(TETHER_ERROR_NO_ERROR, mTethering.getLastTetherError(TEST_P2P_IFNAME));
-
-        // Emulate externally-visible WifiP2pManager effects, when wifi p2p group
-        // is being removed.
-        sendWifiP2pConnectionChanged(false, true, TEST_P2P_IFNAME);
-        mTethering.interfaceRemoved(TEST_P2P_IFNAME);
-        mLooper.dispatchAll();
-
-        verify(mNetd, times(1)).tetherApplyDnsInterfaces();
-        verify(mNetd, times(1)).tetherInterfaceRemove(TEST_P2P_IFNAME);
-        verify(mNetd, times(1)).networkRemoveInterface(INetd.LOCAL_NET_ID, TEST_P2P_IFNAME);
-        // interfaceSetCfg() called once for enabling and twice for disabling IPv4.
-        verify(mNetd, times(3)).interfaceSetCfg(any(InterfaceConfigurationParcel.class));
-        verify(mNetd, times(1)).tetherStop();
-        verify(mNetd, times(1)).ipfwdDisableForwarding(TETHERING_NAME);
-        verify(mUpstreamNetworkMonitor, never()).getCurrentPreferredUpstream();
-        verify(mUpstreamNetworkMonitor, never()).selectPreferredUpstreamType(any());
-        verifyNoMoreInteractions(mNetd);
-        // Asking for the last error after the per-interface state machine
-        // has been reaped yields an unknown interface error.
-        assertEquals(TETHER_ERROR_UNKNOWN_IFACE, mTethering.getLastTetherError(TEST_P2P_IFNAME));
-    }
-
-    private void workingWifiP2pGroupClient(
-            boolean emulateInterfaceStatusChanged) throws Exception {
-        if (emulateInterfaceStatusChanged) {
-            mTethering.interfaceStatusChanged(TEST_P2P_IFNAME, true);
-        }
-        sendWifiP2pConnectionChanged(true, false, TEST_P2P_IFNAME);
-        mLooper.dispatchAll();
-
-        verify(mNetd, never()).interfaceSetCfg(any(InterfaceConfigurationParcel.class));
-        verify(mNetd, never()).tetherInterfaceAdd(TEST_P2P_IFNAME);
-        verify(mNetd, never()).networkAddInterface(INetd.LOCAL_NET_ID, TEST_P2P_IFNAME);
-        verify(mNetd, never()).ipfwdEnableForwarding(TETHERING_NAME);
-        verify(mNetd, never()).tetherStartWithConfiguration(any());
-
-        // Emulate externally-visible WifiP2pManager effects, when wifi p2p group
-        // is being removed.
-        sendWifiP2pConnectionChanged(false, false, TEST_P2P_IFNAME);
-        mTethering.interfaceRemoved(TEST_P2P_IFNAME);
-        mLooper.dispatchAll();
-
-        verify(mNetd, never()).tetherApplyDnsInterfaces();
-        verify(mNetd, never()).tetherInterfaceRemove(TEST_P2P_IFNAME);
-        verify(mNetd, never()).networkRemoveInterface(INetd.LOCAL_NET_ID, TEST_P2P_IFNAME);
-        verify(mNetd, never()).interfaceSetCfg(any(InterfaceConfigurationParcel.class));
-        verify(mNetd, never()).tetherStop();
-        verify(mNetd, never()).ipfwdDisableForwarding(TETHERING_NAME);
-        verifyNoMoreInteractions(mNetd);
-        // Asking for the last error after the per-interface state machine
-        // has been reaped yields an unknown interface error.
-        assertEquals(TETHER_ERROR_UNKNOWN_IFACE, mTethering.getLastTetherError(TEST_P2P_IFNAME));
-    }
-
-    @Test
-    public void workingWifiP2pGroupOwnerWithIfaceChanged() throws Exception {
-        workingWifiP2pGroupOwner(true);
-    }
-
-    @Test
-    public void workingWifiP2pGroupOwnerSansIfaceChanged() throws Exception {
-        workingWifiP2pGroupOwner(false);
-    }
-
-    private void workingWifiP2pGroupOwnerLegacyMode(
-            boolean emulateInterfaceStatusChanged) throws Exception {
-        // change to legacy mode and update tethering information by chaning SIM
-        when(mResources.getStringArray(R.array.config_tether_wifi_p2p_regexs))
-                .thenReturn(new String[]{});
-        final int fakeSubId = 1234;
-        mPhoneStateListener.onActiveDataSubscriptionIdChanged(fakeSubId);
-
-        if (emulateInterfaceStatusChanged) {
-            mTethering.interfaceStatusChanged(TEST_P2P_IFNAME, true);
-        }
-        sendWifiP2pConnectionChanged(true, true, TEST_P2P_IFNAME);
-        mLooper.dispatchAll();
-
-        verify(mNetd, never()).interfaceSetCfg(any(InterfaceConfigurationParcel.class));
-        verify(mNetd, never()).tetherInterfaceAdd(TEST_P2P_IFNAME);
-        verify(mNetd, never()).networkAddInterface(INetd.LOCAL_NET_ID, TEST_P2P_IFNAME);
-        verify(mNetd, never()).ipfwdEnableForwarding(TETHERING_NAME);
-        verify(mNetd, never()).tetherStartWithConfiguration(any());
-        assertEquals(TETHER_ERROR_UNKNOWN_IFACE, mTethering.getLastTetherError(TEST_P2P_IFNAME));
-    }
-    @Test
-    public void workingWifiP2pGroupOwnerLegacyModeWithIfaceChanged() throws Exception {
-        workingWifiP2pGroupOwnerLegacyMode(true);
-    }
-
-    @Test
-    public void workingWifiP2pGroupOwnerLegacyModeSansIfaceChanged() throws Exception {
-        workingWifiP2pGroupOwnerLegacyMode(false);
-    }
-
-    @Test
-    public void workingWifiP2pGroupClientWithIfaceChanged() throws Exception {
-        workingWifiP2pGroupClient(true);
-    }
-
-    @Test
-    public void workingWifiP2pGroupClientSansIfaceChanged() throws Exception {
-        workingWifiP2pGroupClient(false);
-    }
-
-    private void setDataSaverEnabled(boolean enabled) {
-        final Intent intent = new Intent(ACTION_RESTRICT_BACKGROUND_CHANGED);
-        mServiceContext.sendBroadcastAsUser(intent, UserHandle.ALL);
-
-        final int status = enabled ? RESTRICT_BACKGROUND_STATUS_ENABLED
-                : RESTRICT_BACKGROUND_STATUS_DISABLED;
-        when(mCm.getRestrictBackgroundStatus()).thenReturn(status);
-        mLooper.dispatchAll();
-    }
-
-    @Test
-    public void testDataSaverChanged() {
-        // Start Tethering.
-        final UpstreamNetworkState upstreamState = buildMobileIPv4UpstreamState();
-        runUsbTethering(upstreamState);
-        assertContains(Arrays.asList(mTethering.getTetheredIfaces()), TEST_USB_IFNAME);
-        // Data saver is ON.
-        setDataSaverEnabled(true);
-        // Verify that tethering should be disabled.
-        verify(mUsbManager, times(1)).setCurrentFunctions(UsbManager.FUNCTION_NONE);
-        mTethering.interfaceRemoved(TEST_USB_IFNAME);
-        mLooper.dispatchAll();
-        assertEquals(mTethering.getTetheredIfaces(), new String[0]);
-        reset(mUsbManager);
-
-        runUsbTethering(upstreamState);
-        // Verify that user can start tethering again without turning OFF data saver.
-        assertContains(Arrays.asList(mTethering.getTetheredIfaces()), TEST_USB_IFNAME);
-
-        // If data saver is keep ON with change event, tethering should not be OFF this time.
-        setDataSaverEnabled(true);
-        verify(mUsbManager, times(0)).setCurrentFunctions(UsbManager.FUNCTION_NONE);
-        assertContains(Arrays.asList(mTethering.getTetheredIfaces()), TEST_USB_IFNAME);
-
-        // If data saver is turned OFF, it should not change tethering.
-        setDataSaverEnabled(false);
-        verify(mUsbManager, times(0)).setCurrentFunctions(UsbManager.FUNCTION_NONE);
-        assertContains(Arrays.asList(mTethering.getTetheredIfaces()), TEST_USB_IFNAME);
-    }
-
-    private static <T> void assertContains(Collection<T> collection, T element) {
-        assertTrue(element + " not found in " + collection, collection.contains(element));
-    }
-
-    private class ResultListener extends IIntResultListener.Stub {
-        private final int mExpectedResult;
-        private boolean mHasResult = false;
-        ResultListener(final int expectedResult) {
-            mExpectedResult = expectedResult;
-        }
-
-        @Override
-        public void onResult(final int resultCode) {
-            mHasResult = true;
-            if (resultCode != mExpectedResult) {
-                fail("expected result: " + mExpectedResult + " but actual result: " + resultCode);
-            }
-        }
-
-        public void assertHasResult() {
-            if (!mHasResult) fail("No callback result");
-        }
-    }
-
-    @Test
-    public void testMultipleStartTethering() throws Exception {
-        final LinkAddress serverLinkAddr = new LinkAddress("192.168.20.1/24");
-        final LinkAddress clientLinkAddr = new LinkAddress("192.168.20.42/24");
-        final String serverAddr = "192.168.20.1";
-        final ResultListener firstResult = new ResultListener(TETHER_ERROR_NO_ERROR);
-        final ResultListener secondResult = new ResultListener(TETHER_ERROR_NO_ERROR);
-        final ResultListener thirdResult = new ResultListener(TETHER_ERROR_NO_ERROR);
-
-        // Enable USB tethering and check that Tethering starts USB.
-        mTethering.startTethering(createTetheringRequestParcel(TETHERING_USB,
-                  null, null), firstResult);
-        mLooper.dispatchAll();
-        firstResult.assertHasResult();
-        verify(mUsbManager, times(1)).setCurrentFunctions(UsbManager.FUNCTION_RNDIS);
-        verifyNoMoreInteractions(mUsbManager);
-
-        // Enable USB tethering again with the same request and expect no change to USB.
-        mTethering.startTethering(createTetheringRequestParcel(TETHERING_USB,
-                  null, null), secondResult);
-        mLooper.dispatchAll();
-        secondResult.assertHasResult();
-        verify(mUsbManager, never()).setCurrentFunctions(UsbManager.FUNCTION_NONE);
-        reset(mUsbManager);
-
-        // Enable USB tethering with a different request and expect that USB is stopped and
-        // started.
-        mTethering.startTethering(createTetheringRequestParcel(TETHERING_USB,
-                  serverLinkAddr, clientLinkAddr), thirdResult);
-        mLooper.dispatchAll();
-        thirdResult.assertHasResult();
-        verify(mUsbManager, times(1)).setCurrentFunctions(UsbManager.FUNCTION_NONE);
-        verify(mUsbManager, times(1)).setCurrentFunctions(UsbManager.FUNCTION_RNDIS);
-
-        // Expect that when USB comes up, the DHCP server is configured with the requested address.
-        mTethering.interfaceStatusChanged(TEST_USB_IFNAME, true);
-        sendUsbBroadcast(true, true, true, TETHERING_USB);
-        mLooper.dispatchAll();
-        verify(mDhcpServer, timeout(DHCPSERVER_START_TIMEOUT_MS).times(1)).startWithCallbacks(
-                any(), any());
-        verify(mNetd).interfaceSetCfg(argThat(cfg -> serverAddr.equals(cfg.ipv4Addr)));
-    }
-
-    @Test
-    public void testRequestStaticIp() throws Exception {
-        final LinkAddress serverLinkAddr = new LinkAddress("192.168.0.123/24");
-        final LinkAddress clientLinkAddr = new LinkAddress("192.168.0.42/24");
-        final String serverAddr = "192.168.0.123";
-        final int clientAddrParceled = 0xc0a8002a;
-        final ArgumentCaptor<DhcpServingParamsParcel> dhcpParamsCaptor =
-                ArgumentCaptor.forClass(DhcpServingParamsParcel.class);
-        mTethering.startTethering(createTetheringRequestParcel(TETHERING_USB,
-                  serverLinkAddr, clientLinkAddr), null);
-        mLooper.dispatchAll();
-        verify(mUsbManager, times(1)).setCurrentFunctions(UsbManager.FUNCTION_RNDIS);
-        mTethering.interfaceStatusChanged(TEST_USB_IFNAME, true);
-        sendUsbBroadcast(true, true, true, TETHERING_USB);
-        mLooper.dispatchAll();
-        verify(mNetd).interfaceSetCfg(argThat(cfg -> serverAddr.equals(cfg.ipv4Addr)));
-        verify(mIpServerDependencies, times(1)).makeDhcpServer(any(), dhcpParamsCaptor.capture(),
-                any());
-        final DhcpServingParamsParcel params = dhcpParamsCaptor.getValue();
-        assertEquals(serverAddr, intToInet4AddressHTH(params.serverAddr).getHostAddress());
-        assertEquals(24, params.serverAddrPrefixLength);
-        assertEquals(clientAddrParceled, params.clientAddr);
-    }
-
-    // TODO: Test that a request for hotspot mode doesn't interfere with an
-    // already operating tethering mode interface.
-}
diff --git a/packages/Tethering/tests/unit/src/com/android/server/connectivity/tethering/UpstreamNetworkMonitorTest.java b/packages/Tethering/tests/unit/src/com/android/server/connectivity/tethering/UpstreamNetworkMonitorTest.java
deleted file mode 100644
index 7c98f62..0000000
--- a/packages/Tethering/tests/unit/src/com/android/server/connectivity/tethering/UpstreamNetworkMonitorTest.java
+++ /dev/null
@@ -1,800 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.connectivity.tethering;
-
-import static android.net.ConnectivityManager.TYPE_MOBILE_DUN;
-import static android.net.ConnectivityManager.TYPE_MOBILE_HIPRI;
-import static android.net.ConnectivityManager.TYPE_WIFI;
-import static android.net.NetworkCapabilities.NET_CAPABILITY_DUN;
-import static android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET;
-import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
-import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
-
-import static com.android.server.connectivity.tethering.UpstreamNetworkMonitor.TYPE_NONE;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-import static org.mockito.Mockito.any;
-import static org.mockito.Mockito.anyInt;
-import static org.mockito.Mockito.anyString;
-import static org.mockito.Mockito.eq;
-import static org.mockito.Mockito.reset;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.net.ConnectivityManager;
-import android.net.ConnectivityManager.NetworkCallback;
-import android.net.IConnectivityManager;
-import android.net.IpPrefix;
-import android.net.LinkAddress;
-import android.net.LinkProperties;
-import android.net.Network;
-import android.net.NetworkCapabilities;
-import android.net.NetworkRequest;
-import android.net.util.SharedLog;
-import android.os.Handler;
-import android.os.Message;
-
-import androidx.test.filters.SmallTest;
-import androidx.test.runner.AndroidJUnit4;
-
-import com.android.internal.util.State;
-import com.android.internal.util.StateMachine;
-
-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.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
-
-@RunWith(AndroidJUnit4.class)
-@SmallTest
-public class UpstreamNetworkMonitorTest {
-    private static final int EVENT_UNM_UPDATE = 1;
-
-    private static final boolean INCLUDES = true;
-    private static final boolean EXCLUDES = false;
-
-    // Actual contents of the request don't matter for this test. The lack of
-    // any specific TRANSPORT_* is sufficient to identify this request.
-    private static final NetworkRequest sDefaultRequest = new NetworkRequest.Builder().build();
-
-    @Mock private Context mContext;
-    @Mock private EntitlementManager mEntitleMgr;
-    @Mock private IConnectivityManager mCS;
-    @Mock private SharedLog mLog;
-
-    private TestStateMachine mSM;
-    private TestConnectivityManager mCM;
-    private UpstreamNetworkMonitor mUNM;
-
-    @Before public void setUp() throws Exception {
-        MockitoAnnotations.initMocks(this);
-        reset(mContext);
-        reset(mCS);
-        reset(mLog);
-        when(mLog.forSubComponent(anyString())).thenReturn(mLog);
-        when(mEntitleMgr.isCellularUpstreamPermitted()).thenReturn(true);
-
-        mCM = spy(new TestConnectivityManager(mContext, mCS));
-        mSM = new TestStateMachine();
-        mUNM = new UpstreamNetworkMonitor(
-                (ConnectivityManager) mCM, mSM, mLog, EVENT_UNM_UPDATE);
-    }
-
-    @After public void tearDown() throws Exception {
-        if (mSM != null) {
-            mSM.quit();
-            mSM = null;
-        }
-    }
-
-    @Test
-    public void testStopWithoutStartIsNonFatal() {
-        mUNM.stop();
-        mUNM.stop();
-        mUNM.stop();
-    }
-
-    @Test
-    public void testDoesNothingBeforeTrackDefaultAndStarted() throws Exception {
-        assertTrue(mCM.hasNoCallbacks());
-        assertFalse(mUNM.mobileNetworkRequested());
-
-        mUNM.updateMobileRequiresDun(true);
-        assertTrue(mCM.hasNoCallbacks());
-        mUNM.updateMobileRequiresDun(false);
-        assertTrue(mCM.hasNoCallbacks());
-    }
-
-    @Test
-    public void testDefaultNetworkIsTracked() throws Exception {
-        assertTrue(mCM.hasNoCallbacks());
-        mUNM.startTrackDefaultNetwork(sDefaultRequest, mEntitleMgr);
-
-        mUNM.startObserveAllNetworks();
-        assertEquals(1, mCM.trackingDefault.size());
-
-        mUNM.stop();
-        assertTrue(mCM.onlyHasDefaultCallbacks());
-    }
-
-    @Test
-    public void testListensForAllNetworks() throws Exception {
-        assertTrue(mCM.listening.isEmpty());
-
-        mUNM.startTrackDefaultNetwork(sDefaultRequest, mEntitleMgr);
-        mUNM.startObserveAllNetworks();
-        assertFalse(mCM.listening.isEmpty());
-        assertTrue(mCM.isListeningForAll());
-
-        mUNM.stop();
-        assertTrue(mCM.onlyHasDefaultCallbacks());
-    }
-
-    @Test
-    public void testCallbacksRegistered() {
-        mUNM.startTrackDefaultNetwork(sDefaultRequest, mEntitleMgr);
-        verify(mCM, times(1)).requestNetwork(
-                eq(sDefaultRequest), any(NetworkCallback.class), any(Handler.class));
-        mUNM.startObserveAllNetworks();
-        verify(mCM, times(1)).registerNetworkCallback(
-                any(NetworkRequest.class), any(NetworkCallback.class), any(Handler.class));
-
-        mUNM.stop();
-        verify(mCM, times(1)).unregisterNetworkCallback(any(NetworkCallback.class));
-    }
-
-    @Test
-    public void testRequestsMobileNetwork() throws Exception {
-        assertFalse(mUNM.mobileNetworkRequested());
-        assertEquals(0, mCM.requested.size());
-
-        mUNM.startObserveAllNetworks();
-        assertFalse(mUNM.mobileNetworkRequested());
-        assertEquals(0, mCM.requested.size());
-
-        mUNM.updateMobileRequiresDun(false);
-        assertFalse(mUNM.mobileNetworkRequested());
-        assertEquals(0, mCM.requested.size());
-
-        mUNM.registerMobileNetworkRequest();
-        assertTrue(mUNM.mobileNetworkRequested());
-        assertUpstreamTypeRequested(TYPE_MOBILE_HIPRI);
-        assertFalse(isDunRequested());
-
-        mUNM.stop();
-        assertFalse(mUNM.mobileNetworkRequested());
-        assertTrue(mCM.hasNoCallbacks());
-    }
-
-    @Test
-    public void testDuplicateMobileRequestsIgnored() throws Exception {
-        assertFalse(mUNM.mobileNetworkRequested());
-        assertEquals(0, mCM.requested.size());
-
-        mUNM.startObserveAllNetworks();
-        verify(mCM, times(1)).registerNetworkCallback(
-                any(NetworkRequest.class), any(NetworkCallback.class), any(Handler.class));
-        assertFalse(mUNM.mobileNetworkRequested());
-        assertEquals(0, mCM.requested.size());
-
-        mUNM.updateMobileRequiresDun(true);
-        mUNM.registerMobileNetworkRequest();
-        verify(mCM, times(1)).requestNetwork(
-                any(NetworkRequest.class), anyInt(), anyInt(), any(Handler.class),
-                any(NetworkCallback.class));
-
-        assertTrue(mUNM.mobileNetworkRequested());
-        assertUpstreamTypeRequested(TYPE_MOBILE_DUN);
-        assertTrue(isDunRequested());
-
-        // Try a few things that must not result in any state change.
-        mUNM.registerMobileNetworkRequest();
-        mUNM.updateMobileRequiresDun(true);
-        mUNM.registerMobileNetworkRequest();
-
-        assertTrue(mUNM.mobileNetworkRequested());
-        assertUpstreamTypeRequested(TYPE_MOBILE_DUN);
-        assertTrue(isDunRequested());
-
-        mUNM.stop();
-        verify(mCM, times(2)).unregisterNetworkCallback(any(NetworkCallback.class));
-
-        verifyNoMoreInteractions(mCM);
-    }
-
-    @Test
-    public void testRequestsDunNetwork() throws Exception {
-        assertFalse(mUNM.mobileNetworkRequested());
-        assertEquals(0, mCM.requested.size());
-
-        mUNM.startObserveAllNetworks();
-        assertFalse(mUNM.mobileNetworkRequested());
-        assertEquals(0, mCM.requested.size());
-
-        mUNM.updateMobileRequiresDun(true);
-        assertFalse(mUNM.mobileNetworkRequested());
-        assertEquals(0, mCM.requested.size());
-
-        mUNM.registerMobileNetworkRequest();
-        assertTrue(mUNM.mobileNetworkRequested());
-        assertUpstreamTypeRequested(TYPE_MOBILE_DUN);
-        assertTrue(isDunRequested());
-
-        mUNM.stop();
-        assertFalse(mUNM.mobileNetworkRequested());
-        assertTrue(mCM.hasNoCallbacks());
-    }
-
-    @Test
-    public void testUpdateMobileRequiresDun() throws Exception {
-        mUNM.startObserveAllNetworks();
-
-        // Test going from no-DUN to DUN correctly re-registers callbacks.
-        mUNM.updateMobileRequiresDun(false);
-        mUNM.registerMobileNetworkRequest();
-        assertTrue(mUNM.mobileNetworkRequested());
-        assertUpstreamTypeRequested(TYPE_MOBILE_HIPRI);
-        assertFalse(isDunRequested());
-        mUNM.updateMobileRequiresDun(true);
-        assertTrue(mUNM.mobileNetworkRequested());
-        assertUpstreamTypeRequested(TYPE_MOBILE_DUN);
-        assertTrue(isDunRequested());
-
-        // Test going from DUN to no-DUN correctly re-registers callbacks.
-        mUNM.updateMobileRequiresDun(false);
-        assertTrue(mUNM.mobileNetworkRequested());
-        assertUpstreamTypeRequested(TYPE_MOBILE_HIPRI);
-        assertFalse(isDunRequested());
-
-        mUNM.stop();
-        assertFalse(mUNM.mobileNetworkRequested());
-    }
-
-    @Test
-    public void testSelectPreferredUpstreamType() throws Exception {
-        final Collection<Integer> preferredTypes = new ArrayList<>();
-        preferredTypes.add(TYPE_WIFI);
-
-        mUNM.startTrackDefaultNetwork(sDefaultRequest, mEntitleMgr);
-        mUNM.startObserveAllNetworks();
-        // There are no networks, so there is nothing to select.
-        assertSatisfiesLegacyType(TYPE_NONE, mUNM.selectPreferredUpstreamType(preferredTypes));
-
-        final TestNetworkAgent wifiAgent = new TestNetworkAgent(mCM, TRANSPORT_WIFI);
-        wifiAgent.fakeConnect();
-        // WiFi is up, we should prefer it.
-        assertSatisfiesLegacyType(TYPE_WIFI, mUNM.selectPreferredUpstreamType(preferredTypes));
-        wifiAgent.fakeDisconnect();
-        // There are no networks, so there is nothing to select.
-        assertSatisfiesLegacyType(TYPE_NONE, mUNM.selectPreferredUpstreamType(preferredTypes));
-
-        final TestNetworkAgent cellAgent = new TestNetworkAgent(mCM, TRANSPORT_CELLULAR);
-        cellAgent.fakeConnect();
-        assertSatisfiesLegacyType(TYPE_NONE, mUNM.selectPreferredUpstreamType(preferredTypes));
-
-        preferredTypes.add(TYPE_MOBILE_DUN);
-        // This is coupled with preferred types in TetheringConfiguration.
-        mUNM.updateMobileRequiresDun(true);
-        // DUN is available, but only use regular cell: no upstream selected.
-        assertSatisfiesLegacyType(TYPE_NONE, mUNM.selectPreferredUpstreamType(preferredTypes));
-        preferredTypes.remove(TYPE_MOBILE_DUN);
-        // No WiFi, but our preferred flavour of cell is up.
-        preferredTypes.add(TYPE_MOBILE_HIPRI);
-        // This is coupled with preferred types in TetheringConfiguration.
-        mUNM.updateMobileRequiresDun(false);
-        assertSatisfiesLegacyType(TYPE_MOBILE_HIPRI,
-                mUNM.selectPreferredUpstreamType(preferredTypes));
-        // Check to see we filed an explicit request.
-        assertEquals(1, mCM.requested.size());
-        NetworkRequest netReq = (NetworkRequest) mCM.requested.values().toArray()[0];
-        assertTrue(netReq.networkCapabilities.hasTransport(TRANSPORT_CELLULAR));
-        assertFalse(netReq.networkCapabilities.hasCapability(NET_CAPABILITY_DUN));
-        // mobile is not permitted, we should not use HIPRI.
-        when(mEntitleMgr.isCellularUpstreamPermitted()).thenReturn(false);
-        assertSatisfiesLegacyType(TYPE_NONE, mUNM.selectPreferredUpstreamType(preferredTypes));
-        assertEquals(0, mCM.requested.size());
-        // mobile change back to permitted, HIRPI should come back
-        when(mEntitleMgr.isCellularUpstreamPermitted()).thenReturn(true);
-        assertSatisfiesLegacyType(TYPE_MOBILE_HIPRI,
-                mUNM.selectPreferredUpstreamType(preferredTypes));
-
-        wifiAgent.fakeConnect();
-        // WiFi is up, and we should prefer it over cell.
-        assertSatisfiesLegacyType(TYPE_WIFI, mUNM.selectPreferredUpstreamType(preferredTypes));
-        assertEquals(0, mCM.requested.size());
-
-        preferredTypes.remove(TYPE_MOBILE_HIPRI);
-        preferredTypes.add(TYPE_MOBILE_DUN);
-        // This is coupled with preferred types in TetheringConfiguration.
-        mUNM.updateMobileRequiresDun(true);
-        assertSatisfiesLegacyType(TYPE_WIFI, mUNM.selectPreferredUpstreamType(preferredTypes));
-
-        final TestNetworkAgent dunAgent = new TestNetworkAgent(mCM, TRANSPORT_CELLULAR);
-        dunAgent.networkCapabilities.addCapability(NET_CAPABILITY_DUN);
-        dunAgent.fakeConnect();
-
-        // WiFi is still preferred.
-        assertSatisfiesLegacyType(TYPE_WIFI, mUNM.selectPreferredUpstreamType(preferredTypes));
-
-        // WiFi goes down, cell and DUN are still up but only DUN is preferred.
-        wifiAgent.fakeDisconnect();
-        assertSatisfiesLegacyType(TYPE_MOBILE_DUN,
-                mUNM.selectPreferredUpstreamType(preferredTypes));
-        // Check to see we filed an explicit request.
-        assertEquals(1, mCM.requested.size());
-        netReq = (NetworkRequest) mCM.requested.values().toArray()[0];
-        assertTrue(netReq.networkCapabilities.hasTransport(TRANSPORT_CELLULAR));
-        assertTrue(netReq.networkCapabilities.hasCapability(NET_CAPABILITY_DUN));
-        // mobile is not permitted, we should not use DUN.
-        when(mEntitleMgr.isCellularUpstreamPermitted()).thenReturn(false);
-        assertSatisfiesLegacyType(TYPE_NONE, mUNM.selectPreferredUpstreamType(preferredTypes));
-        assertEquals(0, mCM.requested.size());
-        // mobile change back to permitted, DUN should come back
-        when(mEntitleMgr.isCellularUpstreamPermitted()).thenReturn(true);
-        assertSatisfiesLegacyType(TYPE_MOBILE_DUN,
-                mUNM.selectPreferredUpstreamType(preferredTypes));
-    }
-
-    @Test
-    public void testGetCurrentPreferredUpstream() throws Exception {
-        mUNM.startTrackDefaultNetwork(sDefaultRequest, mEntitleMgr);
-        mUNM.startObserveAllNetworks();
-        mUNM.updateMobileRequiresDun(false);
-
-        // [0] Mobile connects, DUN not required -> mobile selected.
-        final TestNetworkAgent cellAgent = new TestNetworkAgent(mCM, TRANSPORT_CELLULAR);
-        cellAgent.fakeConnect();
-        mCM.makeDefaultNetwork(cellAgent);
-        assertEquals(cellAgent.networkId, mUNM.getCurrentPreferredUpstream().network);
-
-        // [1] Mobile connects but not permitted -> null selected
-        when(mEntitleMgr.isCellularUpstreamPermitted()).thenReturn(false);
-        assertEquals(null, mUNM.getCurrentPreferredUpstream());
-        when(mEntitleMgr.isCellularUpstreamPermitted()).thenReturn(true);
-
-        // [2] WiFi connects but not validated/promoted to default -> mobile selected.
-        final TestNetworkAgent wifiAgent = new TestNetworkAgent(mCM, TRANSPORT_WIFI);
-        wifiAgent.fakeConnect();
-        assertEquals(cellAgent.networkId, mUNM.getCurrentPreferredUpstream().network);
-
-        // [3] WiFi validates and is promoted to the default network -> WiFi selected.
-        mCM.makeDefaultNetwork(wifiAgent);
-        assertEquals(wifiAgent.networkId, mUNM.getCurrentPreferredUpstream().network);
-
-        // [4] DUN required, no other changes -> WiFi still selected
-        mUNM.updateMobileRequiresDun(true);
-        assertEquals(wifiAgent.networkId, mUNM.getCurrentPreferredUpstream().network);
-
-        // [5] WiFi no longer validated, mobile becomes default, DUN required -> null selected.
-        mCM.makeDefaultNetwork(cellAgent);
-        assertEquals(null, mUNM.getCurrentPreferredUpstream());
-        // TODO: make sure that a DUN request has been filed. This is currently
-        // triggered by code over in Tethering, but once that has been moved
-        // into UNM we should test for this here.
-
-        // [6] DUN network arrives -> DUN selected
-        final TestNetworkAgent dunAgent = new TestNetworkAgent(mCM, TRANSPORT_CELLULAR);
-        dunAgent.networkCapabilities.addCapability(NET_CAPABILITY_DUN);
-        dunAgent.networkCapabilities.removeCapability(NET_CAPABILITY_INTERNET);
-        dunAgent.fakeConnect();
-        assertEquals(dunAgent.networkId, mUNM.getCurrentPreferredUpstream().network);
-
-        // [7] Mobile is not permitted -> null selected
-        when(mEntitleMgr.isCellularUpstreamPermitted()).thenReturn(false);
-        assertEquals(null, mUNM.getCurrentPreferredUpstream());
-    }
-
-    @Test
-    public void testLocalPrefixes() throws Exception {
-        mUNM.startTrackDefaultNetwork(sDefaultRequest, mEntitleMgr);
-        mUNM.startObserveAllNetworks();
-
-        // [0] Test minimum set of local prefixes.
-        Set<IpPrefix> local = mUNM.getLocalPrefixes();
-        assertTrue(local.isEmpty());
-
-        final Set<String> alreadySeen = new HashSet<>();
-
-        // [1] Pretend Wi-Fi connects.
-        final TestNetworkAgent wifiAgent = new TestNetworkAgent(mCM, TRANSPORT_WIFI);
-        final LinkProperties wifiLp = wifiAgent.linkProperties;
-        wifiLp.setInterfaceName("wlan0");
-        final String[] wifi_addrs = {
-                "fe80::827a:bfff:fe6f:374d", "100.112.103.18",
-                "2001:db8:4:fd00:827a:bfff:fe6f:374d",
-                "2001:db8:4:fd00:6dea:325a:fdae:4ef4",
-                "fd6a:a640:60bf:e985::123",  // ULA address for good measure.
-        };
-        for (String addrStr : wifi_addrs) {
-            final String cidr = addrStr.contains(":") ? "/64" : "/20";
-            wifiLp.addLinkAddress(new LinkAddress(addrStr + cidr));
-        }
-        wifiAgent.fakeConnect();
-        wifiAgent.sendLinkProperties();
-
-        local = mUNM.getLocalPrefixes();
-        assertPrefixSet(local, INCLUDES, alreadySeen);
-        final String[] wifiLinkPrefixes = {
-                // Link-local prefixes are excluded and dealt with elsewhere.
-                "100.112.96.0/20", "2001:db8:4:fd00::/64", "fd6a:a640:60bf:e985::/64",
-        };
-        assertPrefixSet(local, INCLUDES, wifiLinkPrefixes);
-        Collections.addAll(alreadySeen, wifiLinkPrefixes);
-        assertEquals(alreadySeen.size(), local.size());
-
-        // [2] Pretend mobile connects.
-        final TestNetworkAgent cellAgent = new TestNetworkAgent(mCM, TRANSPORT_CELLULAR);
-        final LinkProperties cellLp = cellAgent.linkProperties;
-        cellLp.setInterfaceName("rmnet_data0");
-        final String[] cell_addrs = {
-                "10.102.211.48", "2001:db8:0:1:b50e:70d9:10c9:433d",
-        };
-        for (String addrStr : cell_addrs) {
-            final String cidr = addrStr.contains(":") ? "/64" : "/27";
-            cellLp.addLinkAddress(new LinkAddress(addrStr + cidr));
-        }
-        cellAgent.fakeConnect();
-        cellAgent.sendLinkProperties();
-
-        local = mUNM.getLocalPrefixes();
-        assertPrefixSet(local, INCLUDES, alreadySeen);
-        final String[] cellLinkPrefixes = { "10.102.211.32/27", "2001:db8:0:1::/64" };
-        assertPrefixSet(local, INCLUDES, cellLinkPrefixes);
-        Collections.addAll(alreadySeen, cellLinkPrefixes);
-        assertEquals(alreadySeen.size(), local.size());
-
-        // [3] Pretend DUN connects.
-        final TestNetworkAgent dunAgent = new TestNetworkAgent(mCM, TRANSPORT_CELLULAR);
-        dunAgent.networkCapabilities.addCapability(NET_CAPABILITY_DUN);
-        dunAgent.networkCapabilities.removeCapability(NET_CAPABILITY_INTERNET);
-        final LinkProperties dunLp = dunAgent.linkProperties;
-        dunLp.setInterfaceName("rmnet_data1");
-        final String[] dun_addrs = {
-                "192.0.2.48", "2001:db8:1:2:b50e:70d9:10c9:433d",
-        };
-        for (String addrStr : dun_addrs) {
-            final String cidr = addrStr.contains(":") ? "/64" : "/27";
-            dunLp.addLinkAddress(new LinkAddress(addrStr + cidr));
-        }
-        dunAgent.fakeConnect();
-        dunAgent.sendLinkProperties();
-
-        local = mUNM.getLocalPrefixes();
-        assertPrefixSet(local, INCLUDES, alreadySeen);
-        final String[] dunLinkPrefixes = { "192.0.2.32/27", "2001:db8:1:2::/64" };
-        assertPrefixSet(local, INCLUDES, dunLinkPrefixes);
-        Collections.addAll(alreadySeen, dunLinkPrefixes);
-        assertEquals(alreadySeen.size(), local.size());
-
-        // [4] Pretend Wi-Fi disconnected.  It's addresses/prefixes should no
-        // longer be included (should be properly removed).
-        wifiAgent.fakeDisconnect();
-        local = mUNM.getLocalPrefixes();
-        assertPrefixSet(local, EXCLUDES, wifiLinkPrefixes);
-        assertPrefixSet(local, INCLUDES, cellLinkPrefixes);
-        assertPrefixSet(local, INCLUDES, dunLinkPrefixes);
-
-        // [5] Pretend mobile disconnected.
-        cellAgent.fakeDisconnect();
-        local = mUNM.getLocalPrefixes();
-        assertPrefixSet(local, EXCLUDES, wifiLinkPrefixes);
-        assertPrefixSet(local, EXCLUDES, cellLinkPrefixes);
-        assertPrefixSet(local, INCLUDES, dunLinkPrefixes);
-
-        // [6] Pretend DUN disconnected.
-        dunAgent.fakeDisconnect();
-        local = mUNM.getLocalPrefixes();
-        assertTrue(local.isEmpty());
-    }
-
-    @Test
-    public void testSelectMobileWhenMobileIsNotDefault() {
-        final Collection<Integer> preferredTypes = new ArrayList<>();
-        // Mobile has higher pirority than wifi.
-        preferredTypes.add(TYPE_MOBILE_HIPRI);
-        preferredTypes.add(TYPE_WIFI);
-        mUNM.startTrackDefaultNetwork(sDefaultRequest, mEntitleMgr);
-        mUNM.startObserveAllNetworks();
-        // Setup wifi and make wifi as default network.
-        final TestNetworkAgent wifiAgent = new TestNetworkAgent(mCM, TRANSPORT_WIFI);
-        wifiAgent.fakeConnect();
-        mCM.makeDefaultNetwork(wifiAgent);
-        // Setup mobile network.
-        final TestNetworkAgent cellAgent = new TestNetworkAgent(mCM, TRANSPORT_CELLULAR);
-        cellAgent.fakeConnect();
-
-        assertSatisfiesLegacyType(TYPE_MOBILE_HIPRI,
-                mUNM.selectPreferredUpstreamType(preferredTypes));
-        verify(mEntitleMgr, times(1)).maybeRunProvisioning();
-    }
-
-    private void assertSatisfiesLegacyType(int legacyType, UpstreamNetworkState ns) {
-        if (legacyType == TYPE_NONE) {
-            assertTrue(ns == null);
-            return;
-        }
-
-        final NetworkCapabilities nc =
-                UpstreamNetworkMonitor.networkCapabilitiesForType(legacyType);
-        assertTrue(nc.satisfiedByNetworkCapabilities(ns.networkCapabilities));
-    }
-
-    private void assertUpstreamTypeRequested(int upstreamType) throws Exception {
-        assertEquals(1, mCM.requested.size());
-        assertEquals(1, mCM.legacyTypeMap.size());
-        assertEquals(Integer.valueOf(upstreamType),
-                mCM.legacyTypeMap.values().iterator().next());
-    }
-
-    private boolean isDunRequested() {
-        for (NetworkRequest req : mCM.requested.values()) {
-            if (req.networkCapabilities.hasCapability(NET_CAPABILITY_DUN)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    public static class TestConnectivityManager extends ConnectivityManager {
-        public Map<NetworkCallback, Handler> allCallbacks = new HashMap<>();
-        public Set<NetworkCallback> trackingDefault = new HashSet<>();
-        public TestNetworkAgent defaultNetwork = null;
-        public Map<NetworkCallback, NetworkRequest> listening = new HashMap<>();
-        public Map<NetworkCallback, NetworkRequest> requested = new HashMap<>();
-        public Map<NetworkCallback, Integer> legacyTypeMap = new HashMap<>();
-
-        private int mNetworkId = 100;
-
-        public TestConnectivityManager(Context ctx, IConnectivityManager svc) {
-            super(ctx, svc);
-        }
-
-        boolean hasNoCallbacks() {
-            return allCallbacks.isEmpty()
-                    && trackingDefault.isEmpty()
-                    && listening.isEmpty()
-                    && requested.isEmpty()
-                    && legacyTypeMap.isEmpty();
-        }
-
-        boolean onlyHasDefaultCallbacks() {
-            return (allCallbacks.size() == 1)
-                    && (trackingDefault.size() == 1)
-                    && listening.isEmpty()
-                    && requested.isEmpty()
-                    && legacyTypeMap.isEmpty();
-        }
-
-        boolean isListeningForAll() {
-            final NetworkCapabilities empty = new NetworkCapabilities();
-            empty.clearAll();
-
-            for (NetworkRequest req : listening.values()) {
-                if (req.networkCapabilities.equalRequestableCapabilities(empty)) {
-                    return true;
-                }
-            }
-            return false;
-        }
-
-        int getNetworkId() {
-            return ++mNetworkId;
-        }
-
-        void makeDefaultNetwork(TestNetworkAgent agent) {
-            if (Objects.equals(defaultNetwork, agent)) return;
-
-            final TestNetworkAgent formerDefault = defaultNetwork;
-            defaultNetwork = agent;
-
-            for (NetworkCallback cb : trackingDefault) {
-                if (defaultNetwork != null) {
-                    cb.onAvailable(defaultNetwork.networkId);
-                    cb.onCapabilitiesChanged(
-                            defaultNetwork.networkId, defaultNetwork.networkCapabilities);
-                    cb.onLinkPropertiesChanged(
-                            defaultNetwork.networkId, defaultNetwork.linkProperties);
-                }
-            }
-        }
-
-        @Override
-        public void requestNetwork(NetworkRequest req, NetworkCallback cb, Handler h) {
-            assertFalse(allCallbacks.containsKey(cb));
-            allCallbacks.put(cb, h);
-            if (sDefaultRequest.equals(req)) {
-                assertFalse(trackingDefault.contains(cb));
-                trackingDefault.add(cb);
-            } else {
-                assertFalse(requested.containsKey(cb));
-                requested.put(cb, req);
-            }
-        }
-
-        @Override
-        public void requestNetwork(NetworkRequest req, NetworkCallback cb) {
-            fail("Should never be called.");
-        }
-
-        @Override
-        public void requestNetwork(NetworkRequest req,
-                int timeoutMs, int legacyType, Handler h, NetworkCallback cb) {
-            assertFalse(allCallbacks.containsKey(cb));
-            allCallbacks.put(cb, h);
-            assertFalse(requested.containsKey(cb));
-            requested.put(cb, req);
-            assertFalse(legacyTypeMap.containsKey(cb));
-            if (legacyType != ConnectivityManager.TYPE_NONE) {
-                legacyTypeMap.put(cb, legacyType);
-            }
-        }
-
-        @Override
-        public void registerNetworkCallback(NetworkRequest req, NetworkCallback cb, Handler h) {
-            assertFalse(allCallbacks.containsKey(cb));
-            allCallbacks.put(cb, h);
-            assertFalse(listening.containsKey(cb));
-            listening.put(cb, req);
-        }
-
-        @Override
-        public void registerNetworkCallback(NetworkRequest req, NetworkCallback cb) {
-            fail("Should never be called.");
-        }
-
-        @Override
-        public void registerDefaultNetworkCallback(NetworkCallback cb, Handler h) {
-            fail("Should never be called.");
-        }
-
-        @Override
-        public void registerDefaultNetworkCallback(NetworkCallback cb) {
-            fail("Should never be called.");
-        }
-
-        @Override
-        public void unregisterNetworkCallback(NetworkCallback cb) {
-            if (trackingDefault.contains(cb)) {
-                trackingDefault.remove(cb);
-            } else if (listening.containsKey(cb)) {
-                listening.remove(cb);
-            } else if (requested.containsKey(cb)) {
-                requested.remove(cb);
-                legacyTypeMap.remove(cb);
-            } else {
-                fail("Unexpected callback removed");
-            }
-            allCallbacks.remove(cb);
-
-            assertFalse(allCallbacks.containsKey(cb));
-            assertFalse(trackingDefault.contains(cb));
-            assertFalse(listening.containsKey(cb));
-            assertFalse(requested.containsKey(cb));
-        }
-    }
-
-    public static class TestNetworkAgent {
-        public final TestConnectivityManager cm;
-        public final Network networkId;
-        public final int transportType;
-        public final NetworkCapabilities networkCapabilities;
-        public final LinkProperties linkProperties;
-
-        public TestNetworkAgent(TestConnectivityManager cm, int transportType) {
-            this.cm = cm;
-            this.networkId = new Network(cm.getNetworkId());
-            this.transportType = transportType;
-            networkCapabilities = new NetworkCapabilities();
-            networkCapabilities.addTransportType(transportType);
-            networkCapabilities.addCapability(NET_CAPABILITY_INTERNET);
-            linkProperties = new LinkProperties();
-        }
-
-        public void fakeConnect() {
-            for (NetworkCallback cb : cm.listening.keySet()) {
-                cb.onAvailable(networkId);
-                cb.onCapabilitiesChanged(networkId, copy(networkCapabilities));
-                cb.onLinkPropertiesChanged(networkId, copy(linkProperties));
-            }
-        }
-
-        public void fakeDisconnect() {
-            for (NetworkCallback cb : cm.listening.keySet()) {
-                cb.onLost(networkId);
-            }
-        }
-
-        public void sendLinkProperties() {
-            for (NetworkCallback cb : cm.listening.keySet()) {
-                cb.onLinkPropertiesChanged(networkId, copy(linkProperties));
-            }
-        }
-
-        @Override
-        public String toString() {
-            return String.format("TestNetworkAgent: %s %s", networkId, networkCapabilities);
-        }
-    }
-
-    public static class TestStateMachine extends StateMachine {
-        public final ArrayList<Message> messages = new ArrayList<>();
-        private final State mLoggingState = new LoggingState();
-
-        class LoggingState extends State {
-            @Override public void enter() {
-                messages.clear();
-            }
-
-            @Override public void exit() {
-                messages.clear();
-            }
-
-            @Override public boolean processMessage(Message msg) {
-                messages.add(msg);
-                return true;
-            }
-        }
-
-        public TestStateMachine() {
-            super("UpstreamNetworkMonitor.TestStateMachine");
-            addState(mLoggingState);
-            setInitialState(mLoggingState);
-            super.start();
-        }
-    }
-
-    static NetworkCapabilities copy(NetworkCapabilities nc) {
-        return new NetworkCapabilities(nc);
-    }
-
-    static LinkProperties copy(LinkProperties lp) {
-        return new LinkProperties(lp);
-    }
-
-    static void assertPrefixSet(Set<IpPrefix> prefixes, boolean expectation, String... expected) {
-        final Set<String> expectedSet = new HashSet<>();
-        Collections.addAll(expectedSet, expected);
-        assertPrefixSet(prefixes, expectation, expectedSet);
-    }
-
-    static void assertPrefixSet(Set<IpPrefix> prefixes, boolean expectation, Set<String> expected) {
-        for (String expectedPrefix : expected) {
-            final String errStr = expectation ? "did not find" : "found";
-            assertEquals(
-                    String.format("Failed expectation: %s prefix: %s", errStr, expectedPrefix),
-                    expectation, prefixes.contains(new IpPrefix(expectedPrefix)));
-        }
-    }
-}
diff --git a/packages/overlays/Android.mk b/packages/overlays/Android.mk
index ef0e044..dcdb80b 100644
--- a/packages/overlays/Android.mk
+++ b/packages/overlays/Android.mk
@@ -45,8 +45,6 @@
 	IconPackRoundedSettingsOverlay \
 	IconPackRoundedSystemUIOverlay \
 	IconPackRoundedThemePickerOverlay \
-        IconShapeFlowerOverlay \
-        IconShapeHexagonOverlay \
 	IconShapeRoundedRectOverlay \
 	IconShapeSquircleOverlay \
 	IconShapeTeardropOverlay \
diff --git a/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_corp.xml b/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_corp.xml
index b000146..a05a389 100644
--- a/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_corp.xml
+++ b/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_corp.xml
@@ -1,29 +1,26 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-   Copyright (C) 2019 The Android Open Source Project
+<!-- Copyright (C) 2020 The Android Open Source Project
 
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
+     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
+          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.
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
 -->
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
     android:height="24dp"
-    android:tint="?android:attr/textColorHint"
-    android:viewportHeight="24"
     android:viewportWidth="24"
-    android:width="24dp" >
-    <path
-        android:fillColor="@android:color/white"
-        android:pathData="M16,4c0-1.1-0.9-2-2-2h-4C8.9,2,8,2.9,8,4v2H2v12c0,1.7,1.3,3,3,3h14c1.7,0,3-1.3,3-3V6h-6V4z M9.5,4 c0-0.3,0.2-0.5,0.5-0.5h4c0.3,0,0.5,0.2,0.5,0.5v2h-5V4z M20.5,7.5V18c0,0.8-0.7,1.5-1.5,1.5H5c-0.8,0-1.5-0.7-1.5-1.5V7.5H20.5z" />
-    <path
-        android:fillColor="@android:color/white"
-        android:pathData="M 12 12.3 C 12.6627416998 12.3 13.2 12.8372583002 13.2 13.5 C 13.2 14.1627416998 12.6627416998 14.7 12 14.7 C 11.3372583002 14.7 10.8 14.1627416998 10.8 13.5 C 10.8 12.8372583002 11.3372583002 12.3 12 12.3 Z" />
+    android:viewportHeight="24">
+  <path
+      android:fillColor="#FF000000"
+      android:pathData="M19.75,6H16c0,0 0,0 0,0c0,-2.05 -0.95,-4 -4,-4C8.96,2 8,3.97 8,6c0,0 0,0 0,0H4.25C3.01,6 2,7.01 2,8.25v10.5C2,19.99 3.01,21 4.25,21h15.5c1.24,0 2.25,-1.01 2.25,-2.25V8.25C22,7.01 20.99,6 19.75,6zM12,3.5c0.54,-0.01 2.5,-0.11 2.5,2.5c0,0 0,0 0,0h-5c0,0 0,0 0,0C9.5,3.39 11.45,3.48 12,3.5zM20.5,18.75c0,0.41 -0.34,0.75 -0.75,0.75H4.25c-0.41,0 -0.75,-0.34 -0.75,-0.75V8.25c0,-0.41 0.34,-0.75 0.75,-0.75h15.5c0.41,0 0.75,0.34 0.75,0.75V18.75z"/>
+  <path
+      android:fillColor="#FF000000"
+      android:pathData="M12,12c-0.05,0 -1.5,-0.09 -1.5,1.5c0,1.59 1.43,1.5 1.5,1.5c0.05,0 1.5,0.09 1.5,-1.5C13.5,11.91 12.07,12 12,12z"/>
 </vector>
\ No newline at end of file
diff --git a/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_corp_off.xml b/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_corp_off.xml
new file mode 100644
index 0000000..a810251
--- /dev/null
+++ b/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_corp_off.xml
@@ -0,0 +1,26 @@
+<!-- Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+  <path
+      android:fillColor="#FF000000"
+      android:pathData="M19.5,19.5l-6,-6L12,12L7.5,7.5L6,6L2.81,2.81L1.75,3.87l2.17,2.17C2.83,6.2 2,7.12 2,8.25v10.5C2,19.99 3.01,21 4.25,21h14.63l1.25,1.25l1.06,-1.06l-0.44,-0.44L19.5,19.5zM4.25,19.5c-0.41,0 -0.75,-0.34 -0.75,-0.75V8.25c0,-0.41 0.34,-0.75 0.75,-0.75h1.13l5.27,5.27c-0.09,0.19 -0.15,0.42 -0.15,0.73c0,1.59 1.43,1.5 1.5,1.5c0.02,0 0.38,0.02 0.74,-0.14l4.64,4.64H4.25z"/>
+  <path
+      android:fillColor="#FF000000"
+      android:pathData="M9.62,7.5h10.13c0.41,0 0.75,0.34 0.75,0.75v10.13l1.28,1.28c0.13,-0.28 0.22,-0.58 0.22,-0.91V8.25C22,7.01 20.99,6 19.75,6H16c0,0 0,0 0,0c0,-2.05 -0.95,-4 -4,-4C9.01,2 8.04,3.9 8.01,5.89L9.62,7.5zM12,3.5c0.54,-0.01 2.5,-0.11 2.5,2.5c0,0 0,0 0,0h-5c0,0 0,0 0,0C9.5,3.39 11.45,3.48 12,3.5z"/>
+</vector>
diff --git a/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_screenshot.xml b/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_screenshot.xml
new file mode 100644
index 0000000..e8608a5
--- /dev/null
+++ b/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_screenshot.xml
@@ -0,0 +1,29 @@
+<!-- Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+  <path
+      android:fillColor="#FF000000"
+      android:pathData="M16.75,1h-9.5C6.01,1 5,2.01 5,3.25v17.5C5,21.99 6.01,23 7.25,23h9.5c1.24,0 2.25,-1.01 2.25,-2.25V3.25C19,2.01 17.99,1 16.75,1zM7.25,2.5h9.5c0.41,0 0.75,0.34 0.75,0.75v1h-11v-1C6.5,2.84 6.84,2.5 7.25,2.5zM17.5,5.75v12.5h-11V5.75H17.5zM16.75,21.5h-9.5c-0.41,0 -0.75,-0.34 -0.75,-0.75v-1h11v1C17.5,21.16 17.16,21.5 16.75,21.5z"/>
+  <path
+      android:fillColor="#FF000000"
+      android:pathData="M9.5,11V8.5H12V7H8.75C8.34,7 8,7.34 8,7.75V11H9.5z"/>
+  <path
+      android:fillColor="#FF000000"
+      android:pathData="M12,17h3.25c0.41,0 0.75,-0.34 0.75,-0.75V13h-1.5v2.5H12V17z"/>
+</vector>
diff --git a/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_select.xml b/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_select.xml
new file mode 100644
index 0000000..4e265fd
--- /dev/null
+++ b/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_select.xml
@@ -0,0 +1,32 @@
+<!-- Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+  <path
+      android:fillColor="#FF000000"
+      android:pathData="M11.25,1h1.5v3h-1.5z"/>
+  <path
+      android:fillColor="#FF000000"
+      android:pathData="M15.5983,5.3402l2.1213,-2.1213l1.0606,1.0606l-2.1213,2.1213z"/>
+  <path
+      android:fillColor="#FF000000"
+      android:pathData="M5.2187,4.2803l1.0606,-1.0606l2.1213,2.1213l-1.0606,1.0606z"/>
+  <path
+      android:fillColor="#FF000000"
+      android:pathData="M15.5,12.5l-1.25,0V8.12C14.25,6.95 13.3,6 12.12,6S10,6.95 10,8.12v7.9L8.03,15.5c-0.39,-0.1 -1.23,-0.36 -2.56,0.97c-0.29,0.29 -0.29,0.75 -0.01,1.05l3.79,3.98c0,0 0,0 0,0.01c1.37,1.41 3.28,1.51 4.04,1.49l2.2,0c2.12,0.06 5.25,-1.01 5.25,-5.25C20.75,13.19 17.23,12.46 15.5,12.5zM15.5,21.5l-2.25,0c-0.44,0.01 -1.93,-0.02 -2.92,-1.03l-3.27,-3.43c0.17,-0.1 0.38,-0.13 0.58,-0.08l2.91,0.78c0.47,0.12 0.94,-0.23 0.94,-0.72V8.12c0,-0.34 0.28,-0.62 0.62,-0.62s0.62,0.28 0.62,0.62v5.12c0,0.41 0.33,0.75 0.75,0.75l2.05,0c1.26,-0.03 3.7,0.37 3.7,3.75C19.25,21.14 16.78,21.53 15.5,21.5z"/>
+</vector>
diff --git a/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_share.xml b/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_share.xml
new file mode 100644
index 0000000..726d1aa
--- /dev/null
+++ b/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_share.xml
@@ -0,0 +1,39 @@
+<!-- Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+  <path
+      android:fillColor="#FF000000"
+      android:pathData="M17.88,3.5l0.06,0l0.04,0H18l0.04,0l0.02,0l0.06,0c1.38,0 1.38,1.01 1.38,1.5s0,1.5 -1.38,1.5l-0.06,0l-0.04,0H18l-0.04,0l-0.02,0l-0.06,0C16.5,6.5 16.5,5.49 16.5,5S16.5,3.5 17.88,3.5M17.88,2C17.33,2 15,2.15 15,5c0,2.85 2.31,3 2.88,3c0.06,0 0.11,0 0.12,0c0.01,0 0.05,0 0.12,0C18.67,8 21,7.85 21,5c0,-2.85 -2.31,-3 -2.88,-3C18.06,2 18.01,2 18,2C17.99,2 17.95,2 17.88,2L17.88,2z"/>
+  <path
+      android:fillColor="#FF000000"
+      android:pathData="M17.88,17.5l0.06,0l0.04,0H18l0.04,0l0.02,0l0.06,0c1.38,0 1.38,1.01 1.38,1.5s0,1.5 -1.38,1.5l-0.06,0l-0.04,0H18l-0.04,0l-0.02,0l-0.06,0c-1.38,0 -1.38,-1.01 -1.38,-1.5S16.5,17.5 17.88,17.5M17.88,16C17.33,16 15,16.15 15,19c0,2.85 2.31,3 2.88,3c0.06,0 0.11,0 0.12,0c0.01,0 0.05,0 0.12,0c0.56,0 2.88,-0.15 2.88,-3c0,-2.85 -2.31,-3 -2.88,-3c-0.06,0 -0.11,0 -0.12,0C17.99,16 17.95,16 17.88,16L17.88,16z"/>
+  <path
+      android:fillColor="#FF000000"
+      android:pathData="M5.88,10.5l0.06,0l0.04,0H6l0.04,0l0.02,0l0.06,0c1.38,0 1.38,1.01 1.38,1.5s0,1.5 -1.38,1.5l-0.06,0l-0.04,0H6l-0.04,0l-0.02,0l-0.06,0C4.5,13.5 4.5,12.49 4.5,12S4.5,10.5 5.88,10.5M5.88,9C5.33,9 3,9.15 3,12c0,2.85 2.31,3 2.88,3c0.06,0 0.11,0 0.12,0c0.01,0 0.05,0 0.12,0C6.67,15 9,14.85 9,12c0,-2.85 -2.31,-3 -2.88,-3C6.06,9 6.01,9 6,9C5.99,9 5.95,9 5.88,9L5.88,9z"/>
+  <path
+      android:pathData="M16.01,6.16L8,10.83"
+      android:strokeWidth="1.5"
+      android:fillColor="#00000000"
+      android:strokeColor="#000000"/>
+  <path
+      android:pathData="M16.06,17.87L8.19,13.28"
+      android:strokeWidth="1.5"
+      android:fillColor="#00000000"
+      android:strokeColor="#000000"/>
+</vector>
diff --git a/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_corp.xml b/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_corp.xml
index 7139313..0dfaf81 100644
--- a/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_corp.xml
+++ b/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_corp.xml
@@ -1,27 +1,23 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-   Copyright (C) 2019 The Android Open Source Project
+<!-- Copyright (C) 2020 The Android Open Source Project
 
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
+     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
+          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.
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
 -->
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
     android:height="24dp"
-    android:tint="?android:attr/textColorHint"
-    android:viewportHeight="24"
     android:viewportWidth="24"
-    android:width="24dp" >
-    <path android:pathData="M 10 4 H 14 V 6 H 10 V 4 Z" />
-    <path
-        android:fillColor="@android:color/white"
-        android:pathData="M20,6h-4V4c0-1.1-0.9-2-2-2h-4C8.9,2,8,2.9,8,4v2H4C2.9,6,2,6.9,2,8l0,11c0,1.1,0.9,2,2,2h16c1.1,0,2-0.9,2-2V8 C22,6.9,21.1,6,20,6z M12,15c-0.8,0-1.5-0.7-1.5-1.5S11.2,12,12,12s1.5,0.7,1.5,1.5S12.8,15,12,15z M14,6h-4V4h4V6z" />
-</vector>
\ No newline at end of file
+    android:viewportHeight="24">
+  <path
+      android:fillColor="#FF000000"
+      android:pathData="M19,6h-3c0,-2.21 -1.79,-4 -4,-4S8,3.79 8,6H5C3.34,6 2,7.34 2,9v9c0,1.66 1.34,3 3,3h14c1.66,0 3,-1.34 3,-3V9C22,7.34 20.66,6 19,6zM12,15c-0.83,0 -1.5,-0.67 -1.5,-1.5S11.17,12 12,12s1.5,0.67 1.5,1.5S12.83,15 12,15zM10,6c0,-1.1 0.9,-2 2,-2s2,0.9 2,2H10z"/>
+</vector>
diff --git a/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_corp_off.xml b/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_corp_off.xml
new file mode 100644
index 0000000..b3f353a
--- /dev/null
+++ b/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_corp_off.xml
@@ -0,0 +1,26 @@
+<!-- Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+  <path
+      android:fillColor="#FF000000"
+      android:pathData="M21.81,18.98C21.92,18.67 22,18.35 22,18V9c0,-1.66 -1.34,-3 -3,-3h-3c0,-2.21 -1.79,-4 -4,-4c-1.95,0 -3.57,1.4 -3.92,3.24L21.81,18.98zM12,4c1.1,0 2,0.9 2,2h-4C10,4.9 10.9,4 12,4z"/>
+  <path
+      android:fillColor="#FF000000"
+      android:pathData="M20.56,20.55l-17,-17c0,0 0,0 0,0L3.45,3.44c-0.39,-0.39 -1.02,-0.39 -1.41,0s-0.39,1.02 0,1.41l1.53,1.53C2.64,6.89 2,7.87 2,9v9c0,1.66 1.34,3 3,3h13.18l0.96,0.96c0.2,0.2 0.45,0.29 0.71,0.29s0.51,-0.1 0.71,-0.29C20.94,21.57 20.94,20.94 20.56,20.55C20.56,20.55 20.56,20.55 20.56,20.55zM12,15c-0.83,0 -1.5,-0.67 -1.5,-1.5c0,-0.06 0.01,-0.11 0.02,-0.16l1.65,1.65C12.11,14.99 12.06,15 12,15z"/>
+</vector>
diff --git a/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_screenshot.xml b/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_screenshot.xml
new file mode 100644
index 0000000..1d291c9
--- /dev/null
+++ b/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_screenshot.xml
@@ -0,0 +1,29 @@
+<!-- Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+  <path
+      android:fillColor="#FF000000"
+      android:pathData="M8.75,11c0.41,0 0.75,-0.34 0.75,-0.75V8.5h1.75C11.66,8.5 12,8.16 12,7.75C12,7.34 11.66,7 11.25,7H9C8.45,7 8,7.45 8,8v2.25C8,10.66 8.34,11 8.75,11z"/>
+  <path
+      android:fillColor="#FF000000"
+      android:pathData="M12.75,17H15c0.55,0 1,-0.45 1,-1v-2.25c0,-0.41 -0.34,-0.75 -0.75,-0.75s-0.75,0.34 -0.75,0.75v1.75h-1.75c-0.41,0 -0.75,0.34 -0.75,0.75C12,16.66 12.34,17 12.75,17z"/>
+  <path
+      android:fillColor="#FF000000"
+      android:pathData="M16,1H8C6.34,1 5,2.34 5,4v16c0,1.65 1.35,3 3,3h8c1.65,0 3,-1.35 3,-3V4C19,2.34 17.66,1 16,1zM17,18H7V6h10V18z"/>
+</vector>
diff --git a/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_select.xml b/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_select.xml
new file mode 100644
index 0000000..df4525d
--- /dev/null
+++ b/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_select.xml
@@ -0,0 +1,32 @@
+<!-- Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+  <path
+      android:fillColor="#FF000000"
+      android:pathData="M17.59,5.83l0.71,-0.71c0.39,-0.39 0.39,-1.02 0,-1.41l0,0c-0.39,-0.39 -1.02,-0.39 -1.41,0l-0.71,0.71c-0.39,0.39 -0.39,1.02 0,1.41C16.56,6.21 17.2,6.21 17.59,5.83z"/>
+  <path
+      android:fillColor="#FF000000"
+      android:pathData="M12,4c0.55,0 1,-0.45 1,-1V2c0,-0.55 -0.45,-1 -1,-1s-1,0.45 -1,1v1C11,3.55 11.45,4 12,4z"/>
+  <path
+      android:fillColor="#FF000000"
+      android:pathData="M6.42,5.83c0.39,0.39 1.02,0.39 1.41,0c0.39,-0.39 0.39,-1.02 0,-1.41L7.12,3.71c-0.39,-0.39 -1.02,-0.39 -1.41,0l0,0c-0.39,0.39 -0.39,1.02 0,1.41L6.42,5.83z"/>
+  <path
+      android:fillColor="#FF000000"
+      android:pathData="M17.95,14.43l-3.23,-1.61c-0.42,-0.21 -0.88,-0.32 -1.34,-0.32H13v-5C13,6.67 12.33,6 11.5,6C10.67,6 10,6.67 10,7.5v9.12c0,0.32 -0.29,0.55 -0.6,0.49l-2.84,-0.6c-0.37,-0.08 -0.76,0.04 -1.03,0.31c-0.43,0.44 -0.43,1.14 0.01,1.58l3.71,3.71C9.81,22.68 10.58,23 11.37,23h4.82c1.49,0 2.76,-1.1 2.97,-2.58l0.41,-2.89C19.76,16.26 19.1,15.01 17.95,14.43z"/>
+</vector>
diff --git a/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_share.xml b/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_share.xml
new file mode 100644
index 0000000..89ee527
--- /dev/null
+++ b/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_share.xml
@@ -0,0 +1,39 @@
+<!-- Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+  <path
+      android:pathData="M18,5L6,12"
+      android:strokeWidth="2"
+      android:fillColor="#00000000"
+      android:strokeColor="#000000"/>
+  <path
+      android:pathData="M18,19L6,12"
+      android:strokeWidth="2"
+      android:fillColor="#00000000"
+      android:strokeColor="#000000"/>
+  <path
+      android:fillColor="#FF000000"
+      android:pathData="M18,5m-3,0a3,3 0,1 1,6 0a3,3 0,1 1,-6 0"/>
+  <path
+      android:fillColor="#FF000000"
+      android:pathData="M18,19m-3,0a3,3 0,1 1,6 0a3,3 0,1 1,-6 0"/>
+  <path
+      android:fillColor="#FF000000"
+      android:pathData="M6,12m-3,0a3,3 0,1 1,6 0a3,3 0,1 1,-6 0"/>
+</vector>
diff --git a/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_corp.xml b/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_corp.xml
index 38f515f..be31fb9 100644
--- a/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_corp.xml
+++ b/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_corp.xml
@@ -1,29 +1,26 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-   Copyright (C) 2019 The Android Open Source Project
+<!-- Copyright (C) 2020 The Android Open Source Project
 
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
+     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
+          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.
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
 -->
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
     android:height="24dp"
-    android:tint="?android:attr/textColorHint"
-    android:viewportHeight="24"
     android:viewportWidth="24"
-    android:width="24dp" >
-    <path
-        android:fillColor="@android:color/white"
-        android:pathData="M20,6h-4V4c0-1.1-0.9-2-2-2h-4C8.9,2,8,2.9,8,4v2H4C2.9,6,2,6.9,2,8v11c0,1.1,0.9,2,2,2h16c1.1,0,2-0.9,2-2V8 C22,6.9,21.1,6,20,6z M9.5,4c0-0.3,0.2-0.5,0.5-0.5h4c0.3,0,0.5,0.2,0.5,0.5v2h-5V4z M20.5,19c0,0.3-0.2,0.5-0.5,0.5H4 c-0.3,0-0.5-0.2-0.5-0.5V8c0-0.3,0.2-0.5,0.5-0.5h16c0.3,0,0.5,0.2,0.5,0.5V19z" />
-    <path
-        android:fillColor="@android:color/white"
-        android:pathData="M 12 12.3 C 12.6627416998 12.3 13.2 12.8372583002 13.2 13.5 C 13.2 14.1627416998 12.6627416998 14.7 12 14.7 C 11.3372583002 14.7 10.8 14.1627416998 10.8 13.5 C 10.8 12.8372583002 11.3372583002 12.3 12 12.3 Z" />
-</vector>
\ No newline at end of file
+    android:viewportHeight="24">
+  <path
+      android:fillColor="#FF000000"
+      android:pathData="M20.59,6H16V3.41L14.59,2H9.41L8,3.41V6H3.41L2,7.41v12.17L3.41,21h17.17L22,19.59V7.41L20.59,6zM9.5,3.5h5V6h-5V3.5zM20.5,19.5h-17v-12h17V19.5z"/>
+  <path
+      android:fillColor="#FF000000"
+      android:pathData="M12,13.5m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0"/>
+</vector>
diff --git a/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_corp_off.xml b/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_corp_off.xml
new file mode 100644
index 0000000..8d298f7
--- /dev/null
+++ b/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_corp_off.xml
@@ -0,0 +1,26 @@
+<!-- Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+  <path
+      android:fillColor="#FF000000"
+      android:pathData="M19.5,19.5l-6,-6L12,12L7.5,7.5L6,6L2.81,2.81L1.75,3.87L3.88,6H3.41L2,7.41v12.17L3.41,21h15.46l1.25,1.25l1.06,-1.06l-0.4,-0.4L19.5,19.5zM3.5,19.5v-12h1.88l5.3,5.3c-0.11,0.21 -0.18,0.44 -0.18,0.7c0,0.83 0.67,1.5 1.5,1.5c0.25,0 0.49,-0.07 0.7,-0.18l4.68,4.68H3.5z"/>
+  <path
+      android:fillColor="#FF000000"
+      android:pathData="M9.62,7.5H20.5v10.88l1.35,1.35L22,19.59V7.41L20.59,6H16V3.41L14.59,2H9.41L8,3.41v2.46L9.62,7.5zM9.5,3.5h5V6h-5V3.5z"/>
+</vector>
diff --git a/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_screenshot.xml b/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_screenshot.xml
new file mode 100644
index 0000000..ed90b85
--- /dev/null
+++ b/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_screenshot.xml
@@ -0,0 +1,29 @@
+<!-- Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+  <path
+      android:fillColor="#FF000000"
+      android:pathData="M17.59,1H6.41L5,2.41v19.17L6.41,23h11.17L19,21.59V2.41L17.59,1zM17.5,2.5v1.75h-11V2.5H17.5zM17.5,5.75v12.5h-11V5.75H17.5zM6.5,21.5v-1.75h11v1.75H6.5z"/>
+  <path
+      android:fillColor="#FF000000"
+      android:pathData="M9.5,11l0,-2.5l2.5,0l0,-1.5l-4,0l0,4z"/>
+  <path
+      android:fillColor="#FF000000"
+      android:pathData="M12,17l4,0l0,-4l-1.5,0l0,2.5l-2.5,0z"/>
+</vector>
diff --git a/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_select.xml b/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_select.xml
new file mode 100644
index 0000000..b699a44
--- /dev/null
+++ b/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_select.xml
@@ -0,0 +1,32 @@
+<!-- Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+  <path
+      android:fillColor="#FF000000"
+      android:pathData="M16.19,12.5h-1.94V8.12C14.25,6.95 13.3,6 12.12,6S10,6.95 10,8.12v7.9l-3.22,-0.86l-1.82,1.82L10.68,23h8.6l1.57,-7.96L16.19,12.5zM18.04,21.5h-6.72l-4.27,-4.49l0.18,-0.18l4.28,1.14V8.12c0,-0.34 0.28,-0.62 0.62,-0.62s0.62,0.28 0.62,0.62V14h3.06l3.35,1.83L18.04,21.5z"/>
+  <path
+      android:fillColor="#FF000000"
+      android:pathData="M11.25,1h1.5v3h-1.5z"/>
+  <path
+      android:fillColor="#FF000000"
+      android:pathData="M15.5983,5.3402l2.1213,-2.1213l1.0606,1.0606l-2.1213,2.1213z"/>
+  <path
+      android:fillColor="#FF000000"
+      android:pathData="M5.2187,4.2803l1.0606,-1.0606l2.1213,2.1213l-1.0606,1.0606z"/>
+</vector>
diff --git a/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_share.xml b/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_share.xml
new file mode 100644
index 0000000..36dd3ba
--- /dev/null
+++ b/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_share.xml
@@ -0,0 +1,39 @@
+<!-- Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+  <path
+      android:fillColor="#FF000000"
+      android:pathData="M18,3.5c0.83,0 1.5,0.67 1.5,1.5S18.83,6.5 18,6.5S16.5,5.83 16.5,5S17.17,3.5 18,3.5M18,2c-1.66,0 -3,1.34 -3,3s1.34,3 3,3s3,-1.34 3,-3S19.66,2 18,2L18,2z"/>
+  <path
+      android:fillColor="#FF000000"
+      android:pathData="M18,17.5c0.83,0 1.5,0.67 1.5,1.5s-0.67,1.5 -1.5,1.5s-1.5,-0.67 -1.5,-1.5S17.17,17.5 18,17.5M18,16c-1.66,0 -3,1.34 -3,3s1.34,3 3,3s3,-1.34 3,-3S19.66,16 18,16L18,16z"/>
+  <path
+      android:fillColor="#FF000000"
+      android:pathData="M6,10.5c0.83,0 1.5,0.67 1.5,1.5S6.83,13.5 6,13.5S4.5,12.83 4.5,12S5.17,10.5 6,10.5M6,9c-1.66,0 -3,1.34 -3,3s1.34,3 3,3s3,-1.34 3,-3S7.66,9 6,9L6,9z"/>
+  <path
+      android:pathData="M16.01,6.16L8,10.83"
+      android:strokeWidth="1.5"
+      android:fillColor="#00000000"
+      android:strokeColor="#000000"/>
+  <path
+      android:pathData="M16.06,17.87L8.19,13.28"
+      android:strokeWidth="1.5"
+      android:fillColor="#00000000"
+      android:strokeColor="#000000"/>
+</vector>
diff --git a/packages/overlays/IconShapeFlowerOverlay/AndroidManifest.xml b/packages/overlays/IconShapeFlowerOverlay/AndroidManifest.xml
index 22411a2..9d20c6b 100644
--- a/packages/overlays/IconShapeFlowerOverlay/AndroidManifest.xml
+++ b/packages/overlays/IconShapeFlowerOverlay/AndroidManifest.xml
@@ -19,7 +19,6 @@
           android:versionName="1.0">
     <overlay
         android:targetPackage="android"
-        android:targetName="IconShapeCustomization"
         android:category="android.theme.customization.adaptive_icon_shape"
         android:priority="1"/>
 
diff --git a/packages/overlays/IconShapeHeartOverlay/AndroidManifest.xml b/packages/overlays/IconShapeHeartOverlay/AndroidManifest.xml
index 8fb19df..82bff7d 100644
--- a/packages/overlays/IconShapeHeartOverlay/AndroidManifest.xml
+++ b/packages/overlays/IconShapeHeartOverlay/AndroidManifest.xml
@@ -21,7 +21,6 @@
     android:versionName="1.0">
 <overlay
         android:targetPackage="android"
-        android:targetName="IconShapeCustomization"
         android:category="android.theme.customization.adaptive_icon_shape"
         android:priority="1"/>
 
diff --git a/packages/overlays/IconShapeHexagonOverlay/AndroidManifest.xml b/packages/overlays/IconShapeHexagonOverlay/AndroidManifest.xml
index 384d5b3..bf408fd 100644
--- a/packages/overlays/IconShapeHexagonOverlay/AndroidManifest.xml
+++ b/packages/overlays/IconShapeHexagonOverlay/AndroidManifest.xml
@@ -20,7 +20,6 @@
           android:versionName="1.0">
     <overlay
         android:targetPackage="android"
-        android:targetName="IconShapeCustomization"
         android:category="android.theme.customization.adaptive_icon_shape"
         android:priority="1"/>
 
diff --git a/packages/overlays/IconShapePebbleOverlay/AndroidManifest.xml b/packages/overlays/IconShapePebbleOverlay/AndroidManifest.xml
index 6842dde..d719a97 100644
--- a/packages/overlays/IconShapePebbleOverlay/AndroidManifest.xml
+++ b/packages/overlays/IconShapePebbleOverlay/AndroidManifest.xml
@@ -21,7 +21,6 @@
     android:versionName="1.0">
 <overlay
         android:targetPackage="android"
-        android:targetName="IconShapeCustomization"
         android:category="android.theme.customization.adaptive_icon_shape"
         android:priority="1"/>
 
diff --git a/proto/src/system_messages.proto b/proto/src/system_messages.proto
index 34d2b73..7750e32 100644
--- a/proto/src/system_messages.proto
+++ b/proto/src/system_messages.proto
@@ -256,6 +256,10 @@
     // Package: android
     NOTE_ADB_WIFI_ACTIVE = 62;
 
+    // Notify user there was a non-framework gnss location access during an emergency
+    // Package: android
+    NOTE_GNSS_NFW_LOCATION_ACCESS = 63;
+
     // ADD_NEW_IDS_ABOVE_THIS_LINE
     // Legacy IDs with arbitrary values appear below
     // Legacy IDs existed as stable non-conflicting constants prior to the O release
diff --git a/services/Android.bp b/services/Android.bp
index 730b9a5..6d637be 100644
--- a/services/Android.bp
+++ b/services/Android.bp
@@ -112,7 +112,6 @@
     name: "services-stubs.sources",
     srcs: [":services-all-sources"],
     installable: false,
-    api_tag_name: "SYSTEM_SERVER",
     args: " --show-annotation android.annotation.SystemApi\\(client=android.annotation.SystemApi.Client.SYSTEM_SERVER\\)" +
         " --hide-annotation android.annotation.Hide" +
         " --hide InternalClasses" + // com.android.* classes are okay in this interface
diff --git a/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java b/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java
index 132b692..da9bdf3 100644
--- a/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java
+++ b/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java
@@ -1023,8 +1023,7 @@
         try {
             mMainHandler.post(PooledLambda.obtainRunnable((nonArg) -> {
                 final ScreenshotGraphicBuffer screenshotBuffer = LocalServices
-                        .getService(DisplayManagerInternal.class)
-                        .screenshotWithoutSecureLayer(displayId);
+                        .getService(DisplayManagerInternal.class).userScreenshot(displayId);
                 if (screenshotBuffer != null) {
                     sendScreenshotSuccess(screenshotBuffer, callback);
                 } else {
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
index 7230b00..1a72cf0 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -197,8 +197,7 @@
 
     private final MainHandler mMainHandler;
 
-    // Lazily initialized - access through getSystemActionPerfomer()
-    private SystemActionPerformer mSystemActionPerformer;
+    private final SystemActionPerformer mSystemActionPerformer;
 
     private MagnificationController mMagnificationController;
 
@@ -296,6 +295,8 @@
         mActivityTaskManagerService = LocalServices.getService(ActivityTaskManagerInternal.class);
         mPackageManager = mContext.getPackageManager();
         mSecurityPolicy = new AccessibilitySecurityPolicy(mContext, this);
+        mSystemActionPerformer =
+                new SystemActionPerformer(mContext, mWindowManagerService, null, this);
         mA11yWindowManager = new AccessibilityWindowManager(mLock, mMainHandler,
                 mWindowManagerService, this, mSecurityPolicy, this);
         mA11yDisplayListener = new AccessibilityDisplayListener(mContext, mMainHandler);
@@ -671,7 +672,7 @@
         mSecurityPolicy.enforceCallerIsRecentsOrHasPermission(
                 Manifest.permission.MANAGE_ACCESSIBILITY,
                 FUNCTION_REGISTER_SYSTEM_ACTION);
-        getSystemActionPerformer().registerSystemAction(actionId, action);
+        mSystemActionPerformer.registerSystemAction(actionId, action);
     }
 
     /**
@@ -684,15 +685,7 @@
         mSecurityPolicy.enforceCallerIsRecentsOrHasPermission(
                 Manifest.permission.MANAGE_ACCESSIBILITY,
                 FUNCTION_UNREGISTER_SYSTEM_ACTION);
-        getSystemActionPerformer().unregisterSystemAction(actionId);
-    }
-
-    private SystemActionPerformer getSystemActionPerformer() {
-        if (mSystemActionPerformer == null) {
-            mSystemActionPerformer =
-                    new SystemActionPerformer(mContext, mWindowManagerService, null, this);
-        }
-        return mSystemActionPerformer;
+        mSystemActionPerformer.unregisterSystemAction(actionId);
     }
 
     @Override
@@ -804,7 +797,7 @@
         synchronized (mLock) {
             mUiAutomationManager.registerUiTestAutomationServiceLocked(owner, serviceClient,
                     mContext, accessibilityServiceInfo, sIdCounter++, mMainHandler,
-                    mSecurityPolicy, this, mWindowManagerService, getSystemActionPerformer(),
+                    mSecurityPolicy, this, mWindowManagerService, mSystemActionPerformer,
                     mA11yWindowManager, flags);
             onUserStateChangedLocked(getCurrentUserStateLocked());
         }
@@ -1515,7 +1508,7 @@
                 if (service == null) {
                     service = new AccessibilityServiceConnection(userState, mContext, componentName,
                             installedService, sIdCounter++, mMainHandler, mLock, mSecurityPolicy,
-                            this, mWindowManagerService, getSystemActionPerformer(),
+                            this, mWindowManagerService, mSystemActionPerformer,
                             mA11yWindowManager, mActivityTaskManagerService);
                 } else if (userState.mBoundServices.contains(service)) {
                     continue;
@@ -2441,7 +2434,11 @@
      *    accessibility button.
      * 2) For {@link AccessibilityManager#ACCESSIBILITY_SHORTCUT_KEY} type and service targeting sdk
      *    version <= Q: turns on / off the accessibility service.
-     * 3) For services targeting sdk version > Q:
+     * 3) For {@link AccessibilityManager#ACCESSIBILITY_SHORTCUT_KEY} type and service targeting sdk
+     *    version > Q and request accessibility button: turn on the accessibility service if it's
+     *    not in the enabled state.
+     *    (It'll happen when a service is disabled and assigned to shortcut then upgraded.)
+     * 4) For services targeting sdk version > Q:
      *    a) Turns on / off the accessibility service, if service does not request accessibility
      *       button.
      *    b) Callbacks to accessibility service if service is bounded and requests accessibility
@@ -2475,6 +2472,13 @@
                 }
                 return true;
             }
+            if (shortcutType == ACCESSIBILITY_SHORTCUT_KEY && targetSdk > Build.VERSION_CODES.Q
+                    && requestA11yButton) {
+                if (!userState.getEnabledServicesLocked().contains(assignedTarget)) {
+                    enableAccessibilityServiceLocked(assignedTarget, mCurrentUserId);
+                    return true;
+                }
+            }
             // Callbacks to a11y service if it's bounded and requests a11y button.
             if (serviceConnection == null
                     || !userState.mBoundServices.contains(serviceConnection)
@@ -2728,7 +2732,7 @@
     public void onShellCommand(FileDescriptor in, FileDescriptor out,
             FileDescriptor err, String[] args, ShellCallback callback,
             ResultReceiver resultReceiver) {
-        new AccessibilityShellCommand(this).exec(this, in, out, err, args,
+        new AccessibilityShellCommand(this, mSystemActionPerformer).exec(this, in, out, err, args,
                 callback, resultReceiver);
     }
 
@@ -2753,7 +2757,7 @@
                     userState, mContext,
                     COMPONENT_NAME, info, sIdCounter++, mMainHandler, mLock, mSecurityPolicy,
                     AccessibilityManagerService.this, mWindowManagerService,
-                    getSystemActionPerformer(), mA11yWindowManager, mActivityTaskManagerService) {
+                    mSystemActionPerformer, mA11yWindowManager, mActivityTaskManagerService) {
                 @Override
                 public boolean supportsFlagForNotImportantViews(AccessibilityServiceInfo info) {
                     return true;
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityShellCommand.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityShellCommand.java
index 20a11bd..b36626f 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityShellCommand.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityShellCommand.java
@@ -18,6 +18,8 @@
 
 import android.annotation.NonNull;
 import android.app.ActivityManager;
+import android.os.Binder;
+import android.os.Process;
 import android.os.ShellCommand;
 import android.os.UserHandle;
 
@@ -28,9 +30,12 @@
  */
 final class AccessibilityShellCommand extends ShellCommand {
     final @NonNull AccessibilityManagerService mService;
+    final @NonNull SystemActionPerformer mSystemActionPerformer;
 
-    AccessibilityShellCommand(@NonNull AccessibilityManagerService service) {
+    AccessibilityShellCommand(@NonNull AccessibilityManagerService service,
+            @NonNull SystemActionPerformer systemActionPerformer) {
         mService = service;
+        mSystemActionPerformer = systemActionPerformer;
     }
 
     @Override
@@ -45,6 +50,9 @@
             case "set-bind-instant-service-allowed": {
                 return runSetBindInstantServiceAllowed();
             }
+            case "call-system-action": {
+                return runCallSystemAction();
+            }
         }
         return -1;
     }
@@ -74,6 +82,22 @@
         return 0;
     }
 
+    private int runCallSystemAction() {
+        final int callingUid = Binder.getCallingUid();
+        if (callingUid != Process.ROOT_UID
+                && callingUid != Process.SYSTEM_UID
+                && callingUid != Process.SHELL_UID) {
+            return -1;
+        }
+        final String option = getNextArg();
+        if (option != null) {
+            int actionId = Integer.parseInt(option);
+            mSystemActionPerformer.performSystemAction(actionId);
+            return 0;
+        }
+        return -1;
+    }
+
     private Integer parseUserId() {
         final String option = getNextOption();
         if (option != null) {
@@ -97,5 +121,7 @@
         pw.println("    Set whether binding to services provided by instant apps is allowed.");
         pw.println("  get-bind-instant-service-allowed [--user <USER_ID>]");
         pw.println("    Get whether binding to services provided by instant apps is allowed.");
+        pw.println("  call-system-action <ACTION_ID>");
+        pw.println("    Calls the system action with the given action id.");
     }
 }
\ No newline at end of file
diff --git a/services/accessibility/java/com/android/server/accessibility/SystemActionPerformer.java b/services/accessibility/java/com/android/server/accessibility/SystemActionPerformer.java
index ef8d524..a1fc3fa 100644
--- a/services/accessibility/java/com/android/server/accessibility/SystemActionPerformer.java
+++ b/services/accessibility/java/com/android/server/accessibility/SystemActionPerformer.java
@@ -16,6 +16,8 @@
 
 package com.android.server.accessibility;
 
+import static android.view.WindowManager.ScreenshotSource.SCREENSHOT_ACCESSIBILITY_ACTIONS;
+
 import android.accessibilityservice.AccessibilityService;
 import android.app.PendingIntent;
 import android.app.RemoteAction;
@@ -301,7 +303,11 @@
                     return lockScreen();
                 case AccessibilityService.GLOBAL_ACTION_TAKE_SCREENSHOT:
                     return takeScreenshot();
+                case AccessibilityService.GLOBAL_ACTION_KEYCODE_HEADSETHOOK :
+                    sendDownAndUpKeyEvents(KeyEvent.KEYCODE_HEADSETHOOK);
+                    return true;
                 default:
+                    Slog.e(TAG, "Invalid action id: " + actionId);
                     return false;
             }
         } finally {
@@ -395,7 +401,8 @@
         ScreenshotHelper screenshotHelper = (mScreenshotHelperSupplier != null)
                 ? mScreenshotHelperSupplier.get() : new ScreenshotHelper(mContext);
         screenshotHelper.takeScreenshot(android.view.WindowManager.TAKE_SCREENSHOT_FULLSCREEN,
-                true, true, new Handler(Looper.getMainLooper()), null);
+                true, true, SCREENSHOT_ACCESSIBILITY_ACTIONS,
+                new Handler(Looper.getMainLooper()), null);
         return true;
     }
 }
diff --git a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java
index ca1b27b..74e4e4a 100644
--- a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java
+++ b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java
@@ -3652,11 +3652,12 @@
      * Note an app widget is tapped on. If a app widget is tapped, the underlying app is treated as
      * foreground so the app can get while-in-use permission.
      *
-     * @param uid UID of the underlying app.
-     * @param packageName Package name of the app.
+     * @param callingPackage calling app's packageName.
+     * @param appWidgetId App widget id.
      */
     @Override
-    public void noteAppWidgetTapped(int uid, String packageName) {
+    public void noteAppWidgetTapped(String callingPackage, int appWidgetId) {
+        mSecurityPolicy.enforceCallFromPackage(callingPackage);
         final int callingUid = Binder.getCallingUid();
         final long ident = Binder.clearCallingIdentity();
         try {
@@ -3665,32 +3666,22 @@
             if (procState > ActivityManager.PROCESS_STATE_TOP) {
                 return;
             }
-
-            // Default launcher from package manager.
-            final ComponentName defaultLauncher = mPackageManagerInternal
-                    .getDefaultHomeActivity(UserHandle.getUserId(callingUid));
-            if (defaultLauncher == null) {
-                return;
+            synchronized (mLock) {
+                final Widget widget = lookupWidgetLocked(appWidgetId, callingUid, callingPackage);
+                if (widget == null) {
+                    return;
+                }
+                final ProviderId providerId = widget.provider.id;
+                final String packageName = providerId.componentName.getPackageName();
+                if (packageName == null) {
+                    return;
+                }
+                final SparseArray<String> uid2PackageName = new SparseArray<String>();
+                uid2PackageName.put(providerId.uid, packageName);
+                mAppOpsManagerInternal.updateAppWidgetVisibility(uid2PackageName, true);
+                mUsageStatsManagerInternal.reportEvent(packageName,
+                        UserHandle.getUserId(providerId.uid), UsageEvents.Event.USER_INTERACTION);
             }
-            int defaultLauncherUid  = 0;
-            try {
-                defaultLauncherUid = mPackageManager.getApplicationInfo(
-                        defaultLauncher.getPackageName(), 0 ,
-                        UserHandle.getUserId(callingUid)).uid;
-            } catch (RemoteException e) {
-                Slog.e(TAG, "Failed to getApplicationInfo for package:"
-                        + defaultLauncher.getPackageName(), e);
-                return;
-            }
-            // The callingUid must be default launcher uid.
-            if (defaultLauncherUid != callingUid) {
-                return;
-            }
-            final SparseArray<String> uid2PackageName = new SparseArray<String>();
-            uid2PackageName.put(uid, packageName);
-            mAppOpsManagerInternal.updateAppWidgetVisibility(uid2PackageName, true);
-            mUsageStatsManagerInternal.reportEvent(packageName, UserHandle.getUserId(uid),
-                    UsageEvents.Event.USER_INTERACTION);
         } finally {
             Binder.restoreCallingIdentity(ident);
         }
diff --git a/services/art-profile b/services/art-profile
index 8ebb21f..e2974a1 100644
--- a/services/art-profile
+++ b/services/art-profile
@@ -24,6 +24,8 @@
 HSPLandroid/hardware/authsecret/V1_0/IAuthSecret;->asInterface(Landroid/os/IHwBinder;)Landroid/hardware/authsecret/V1_0/IAuthSecret;
 HSPLandroid/hardware/authsecret/V1_0/IAuthSecret;->getService()Landroid/hardware/authsecret/V1_0/IAuthSecret;
 HSPLandroid/hardware/authsecret/V1_0/IAuthSecret;->getService(Ljava/lang/String;)Landroid/hardware/authsecret/V1_0/IAuthSecret;
+PLandroid/hardware/authsecret/V1_0/IAuthSecret;->getService(Ljava/lang/String;Z)Landroid/hardware/authsecret/V1_0/IAuthSecret;
+PLandroid/hardware/authsecret/V1_0/IAuthSecret;->getService(Z)Landroid/hardware/authsecret/V1_0/IAuthSecret;
 HSPLandroid/hardware/biometrics/face/V1_0/IBiometricsFace$Proxy;-><init>(Landroid/os/IHwBinder;)V
 HSPLandroid/hardware/biometrics/face/V1_0/IBiometricsFace$Proxy;->asBinder()Landroid/os/IHwBinder;
 HPLandroid/hardware/biometrics/face/V1_0/IBiometricsFace$Proxy;->authenticate(J)I
@@ -101,6 +103,7 @@
 HSPLandroid/hardware/health/V2_0/IHealth$Proxy;->equals(Ljava/lang/Object;)Z
 HPLandroid/hardware/health/V2_0/IHealth$Proxy;->getCapacity(Landroid/hardware/health/V2_0/IHealth$getCapacityCallback;)V
 HPLandroid/hardware/health/V2_0/IHealth$Proxy;->getChargeCounter(Landroid/hardware/health/V2_0/IHealth$getChargeCounterCallback;)V
+HPLandroid/hardware/health/V2_0/IHealth$Proxy;->getChargeStatus(Landroid/hardware/health/V2_0/IHealth$getChargeStatusCallback;)V
 HPLandroid/hardware/health/V2_0/IHealth$Proxy;->getCurrentAverage(Landroid/hardware/health/V2_0/IHealth$getCurrentAverageCallback;)V
 HPLandroid/hardware/health/V2_0/IHealth$Proxy;->getCurrentNow(Landroid/hardware/health/V2_0/IHealth$getCurrentNowCallback;)V
 HPLandroid/hardware/health/V2_0/IHealth$Proxy;->getEnergyCounter(Landroid/hardware/health/V2_0/IHealth$getEnergyCounterCallback;)V
@@ -138,6 +141,8 @@
 HSPLandroid/hardware/oemlock/V1_0/IOemLock;->asInterface(Landroid/os/IHwBinder;)Landroid/hardware/oemlock/V1_0/IOemLock;
 HSPLandroid/hardware/oemlock/V1_0/IOemLock;->getService()Landroid/hardware/oemlock/V1_0/IOemLock;
 HSPLandroid/hardware/oemlock/V1_0/IOemLock;->getService(Ljava/lang/String;)Landroid/hardware/oemlock/V1_0/IOemLock;
+PLandroid/hardware/oemlock/V1_0/IOemLock;->getService(Ljava/lang/String;Z)Landroid/hardware/oemlock/V1_0/IOemLock;
+PLandroid/hardware/oemlock/V1_0/IOemLock;->getService(Z)Landroid/hardware/oemlock/V1_0/IOemLock;
 PLandroid/hardware/rebootescrow/IRebootEscrow$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 PLandroid/hardware/rebootescrow/IRebootEscrow$Stub$Proxy;->retrieveKey()[B
 PLandroid/hardware/rebootescrow/IRebootEscrow$Stub$Proxy;->storeKey([B)V
@@ -200,6 +205,7 @@
 HPLandroid/hardware/soundtrigger/V2_2/ISoundTriggerHw$Proxy;->unloadSoundModel(I)I
 HSPLandroid/hardware/soundtrigger/V2_2/ISoundTriggerHw;->asInterface(Landroid/os/IHwBinder;)Landroid/hardware/soundtrigger/V2_2/ISoundTriggerHw;
 HSPLandroid/hardware/soundtrigger/V2_3/ISoundTriggerHw$Proxy;-><init>(Landroid/os/IHwBinder;)V
+HPLandroid/hardware/soundtrigger/V2_3/ISoundTriggerHw$Proxy;->getModelState(I)I
 PLandroid/hardware/soundtrigger/V2_3/ISoundTriggerHw$Proxy;->getProperties_2_3(Landroid/hardware/soundtrigger/V2_3/ISoundTriggerHw$getProperties_2_3Callback;)V
 HSPLandroid/hardware/soundtrigger/V2_3/ISoundTriggerHw$Proxy;->interfaceChain()Ljava/util/ArrayList;
 PLandroid/hardware/soundtrigger/V2_3/ISoundTriggerHw$Proxy;->loadPhraseSoundModel_2_1(Landroid/hardware/soundtrigger/V2_1/ISoundTriggerHw$PhraseSoundModel;Landroid/hardware/soundtrigger/V2_1/ISoundTriggerHwCallback;ILandroid/hardware/soundtrigger/V2_1/ISoundTriggerHw$loadPhraseSoundModel_2_1Callback;)V
@@ -254,6 +260,8 @@
 HSPLandroid/hardware/weaver/V1_0/IWeaver;->asInterface(Landroid/os/IHwBinder;)Landroid/hardware/weaver/V1_0/IWeaver;
 HSPLandroid/hardware/weaver/V1_0/IWeaver;->getService()Landroid/hardware/weaver/V1_0/IWeaver;
 HSPLandroid/hardware/weaver/V1_0/IWeaver;->getService(Ljava/lang/String;)Landroid/hardware/weaver/V1_0/IWeaver;
+PLandroid/hardware/weaver/V1_0/IWeaver;->getService(Ljava/lang/String;Z)Landroid/hardware/weaver/V1_0/IWeaver;
+PLandroid/hardware/weaver/V1_0/IWeaver;->getService(Z)Landroid/hardware/weaver/V1_0/IWeaver;
 HSPLandroid/hardware/weaver/V1_0/WeaverConfig;-><init>()V
 HSPLandroid/hardware/weaver/V1_0/WeaverConfig;->readEmbeddedFromParcel(Landroid/os/HwParcel;Landroid/os/HwBlob;J)V
 HSPLandroid/hardware/weaver/V1_0/WeaverConfig;->readFromParcel(Landroid/os/HwParcel;)V
@@ -365,11 +373,13 @@
 HSPLandroid/net/INetd$Stub$Proxy;->interfaceGetCfg(Ljava/lang/String;)Landroid/net/InterfaceConfigurationParcel;
 HSPLandroid/net/INetd$Stub$Proxy;->interfaceGetList()[Ljava/lang/String;
 PLandroid/net/INetd$Stub$Proxy;->interfaceSetCfg(Landroid/net/InterfaceConfigurationParcel;)V
+PLandroid/net/INetd$Stub$Proxy;->interfaceSetEnableIPv6(Ljava/lang/String;Z)V
 HPLandroid/net/INetd$Stub$Proxy;->interfaceSetMtu(Ljava/lang/String;I)V
 HSPLandroid/net/INetd$Stub$Proxy;->isAlive()Z
 HPLandroid/net/INetd$Stub$Proxy;->networkAddInterface(ILjava/lang/String;)V
 HPLandroid/net/INetd$Stub$Proxy;->networkAddLegacyRoute(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;I)V
 HPLandroid/net/INetd$Stub$Proxy;->networkAddRoute(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
+HPLandroid/net/INetd$Stub$Proxy;->networkAddRouteParcel(ILandroid/net/RouteInfoParcel;)V
 HPLandroid/net/INetd$Stub$Proxy;->networkAddUidRanges(I[Landroid/net/UidRangeParcel;)V
 PLandroid/net/INetd$Stub$Proxy;->networkClearDefault()V
 HPLandroid/net/INetd$Stub$Proxy;->networkClearPermissionForUser([I)V
@@ -379,12 +389,14 @@
 PLandroid/net/INetd$Stub$Proxy;->networkRejectNonSecureVpn(Z[Landroid/net/UidRangeParcel;)V
 HPLandroid/net/INetd$Stub$Proxy;->networkRemoveInterface(ILjava/lang/String;)V
 HPLandroid/net/INetd$Stub$Proxy;->networkRemoveRoute(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
+HPLandroid/net/INetd$Stub$Proxy;->networkRemoveRouteParcel(ILandroid/net/RouteInfoParcel;)V
 HPLandroid/net/INetd$Stub$Proxy;->networkRemoveUidRanges(I[Landroid/net/UidRangeParcel;)V
 HPLandroid/net/INetd$Stub$Proxy;->networkSetDefault(I)V
 HPLandroid/net/INetd$Stub$Proxy;->networkSetPermissionForNetwork(II)V
 HSPLandroid/net/INetd$Stub$Proxy;->networkSetPermissionForUser(I[I)V
 PLandroid/net/INetd$Stub$Proxy;->networkSetProtectAllow(I)V
 PLandroid/net/INetd$Stub$Proxy;->networkSetProtectDeny(I)V
+PLandroid/net/INetd$Stub$Proxy;->networkUpdateRouteParcel(ILandroid/net/RouteInfoParcel;)V
 HSPLandroid/net/INetd$Stub$Proxy;->registerUnsolicitedEventListener(Landroid/net/INetdUnsolicitedEventListener;)V
 HPLandroid/net/INetd$Stub$Proxy;->setTcpRWmemorySize(Ljava/lang/String;Ljava/lang/String;)V
 HSPLandroid/net/INetd$Stub$Proxy;->socketDestroy([Landroid/net/UidRangeParcel;[I)V
@@ -412,7 +424,7 @@
 HPLandroid/net/INetworkMonitor$Stub$Proxy;->start()V
 PLandroid/net/INetworkMonitor$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/INetworkMonitor;
 HPLandroid/net/INetworkMonitorCallbacks$Stub;-><init>()V
-PLandroid/net/INetworkMonitorCallbacks$Stub;->asBinder()Landroid/os/IBinder;
+HPLandroid/net/INetworkMonitorCallbacks$Stub;->asBinder()Landroid/os/IBinder;
 HPLandroid/net/INetworkMonitorCallbacks$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLandroid/net/INetworkStackConnector$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 PLandroid/net/INetworkStackConnector$Stub$Proxy;->fetchIpMemoryStore(Landroid/net/IIpMemoryStoreCallbacks;)V
@@ -457,11 +469,35 @@
 HPLandroid/net/IpMemoryStoreClient;->lambda$storeBlob$4$IpMemoryStoreClient(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/net/ipmemorystore/Blob;Landroid/net/ipmemorystore/OnStatusListener;Landroid/net/IIpMemoryStore;)V
 PLandroid/net/IpMemoryStoreClient;->retrieveBlob(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/net/ipmemorystore/OnBlobRetrievedListener;)V
 HPLandroid/net/IpMemoryStoreClient;->storeBlob(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/net/ipmemorystore/Blob;Landroid/net/ipmemorystore/OnStatusListener;)V
+PLandroid/net/Layer2InformationParcelable$1;-><init>()V
+PLandroid/net/Layer2InformationParcelable;-><clinit>()V
+PLandroid/net/Layer2InformationParcelable;-><init>()V
+PLandroid/net/Layer2InformationParcelable;->writeToParcel(Landroid/os/Parcel;I)V
 PLandroid/net/NattKeepalivePacketDataParcelable$1;-><init>()V
 PLandroid/net/NattKeepalivePacketDataParcelable;-><clinit>()V
 PLandroid/net/NattKeepalivePacketDataParcelable;-><init>()V
 HPLandroid/net/NattKeepalivePacketDataParcelable;->writeToParcel(Landroid/os/Parcel;I)V
+HSPLandroid/net/NetworkFactory$1;-><init>(Landroid/net/NetworkFactory;Landroid/content/Context;Landroid/os/Looper;Ljava/lang/String;)V
+HPLandroid/net/NetworkFactory$1;->onNetworkRequestWithdrawn(Landroid/net/NetworkRequest;)V
+HSPLandroid/net/NetworkFactory$1;->onNetworkRequested(Landroid/net/NetworkRequest;II)V
+HSPLandroid/net/NetworkFactory$1;->onRequestWithdrawn(Landroid/net/NetworkRequest;)V
+HSPLandroid/net/NetworkFactory$NetworkRequestInfo;-><init>(Landroid/net/NetworkFactory;Landroid/net/NetworkRequest;II)V
+HPLandroid/net/NetworkFactory$NetworkRequestInfo;->toString()Ljava/lang/String;
+HSPLandroid/net/NetworkFactory;-><init>(Landroid/os/Looper;Landroid/content/Context;Ljava/lang/String;Landroid/net/NetworkCapabilities;)V
+HPLandroid/net/NetworkFactory;->dump(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V
+HSPLandroid/net/NetworkFactory;->evalRequest(Landroid/net/NetworkFactory$NetworkRequestInfo;)V
+HSPLandroid/net/NetworkFactory;->evalRequests()V
 PLandroid/net/NetworkFactory;->getProvider()Landroid/net/NetworkProvider;
+HSPLandroid/net/NetworkFactory;->handleAddRequest(Landroid/net/NetworkRequest;II)V
+HSPLandroid/net/NetworkFactory;->handleMessage(Landroid/os/Message;)V
+HSPLandroid/net/NetworkFactory;->handleRemoveRequest(Landroid/net/NetworkRequest;)V
+HSPLandroid/net/NetworkFactory;->handleSetScore(I)V
+HSPLandroid/net/NetworkFactory;->log(Ljava/lang/String;)V
+HSPLandroid/net/NetworkFactory;->register()V
+HSPLandroid/net/NetworkFactory;->setScoreFilter(I)V
+HSPLandroid/net/NetworkFactory;->shouldNeedNetworkFor(Landroid/net/NetworkFactory$NetworkRequestInfo;)Z
+HSPLandroid/net/NetworkFactory;->shouldReleaseNetworkFor(Landroid/net/NetworkFactory$NetworkRequestInfo;)Z
+PLandroid/net/NetworkFactory;->toString()Ljava/lang/String;
 HPLandroid/net/NetworkMonitorManager;-><init>(Landroid/net/INetworkMonitor;)V
 HPLandroid/net/NetworkMonitorManager;-><init>(Landroid/net/INetworkMonitor;Ljava/lang/String;)V
 HPLandroid/net/NetworkMonitorManager;->forceReevaluation(I)Z
@@ -516,6 +552,10 @@
 PLandroid/net/ResolverParamsParcel;-><clinit>()V
 HPLandroid/net/ResolverParamsParcel;-><init>()V
 HPLandroid/net/ResolverParamsParcel;->writeToParcel(Landroid/os/Parcel;I)V
+PLandroid/net/RouteInfoParcel$1;-><init>()V
+PLandroid/net/RouteInfoParcel;-><clinit>()V
+HPLandroid/net/RouteInfoParcel;-><init>()V
+HPLandroid/net/RouteInfoParcel;->writeToParcel(Landroid/os/Parcel;I)V
 PLandroid/net/ScanResultInfoParcelable$1;-><init>()V
 PLandroid/net/ScanResultInfoParcelable;-><clinit>()V
 PLandroid/net/ScanResultInfoParcelable;-><init>()V
@@ -582,6 +622,7 @@
 PLandroid/net/ip/IIpClient$Stub$Proxy;->shutdown()V
 HPLandroid/net/ip/IIpClient$Stub$Proxy;->startProvisioning(Landroid/net/ProvisioningConfigurationParcelable;)V
 HPLandroid/net/ip/IIpClient$Stub$Proxy;->stop()V
+PLandroid/net/ip/IIpClient$Stub$Proxy;->updateLayer2Information(Landroid/net/Layer2InformationParcelable;)V
 HSPLandroid/net/ip/IIpClient$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/ip/IIpClient;
 HSPLandroid/net/ip/IIpClientCallbacks$Stub;-><init>()V
 HSPLandroid/net/ip/IIpClientCallbacks$Stub;->asBinder()Landroid/os/IBinder;
@@ -651,6 +692,27 @@
 HPLandroid/net/ipmemorystore/StatusParcelable;->readFromParcel(Landroid/os/Parcel;)V
 HSPLandroid/net/metrics/INetdEventListener$Stub;-><init>()V
 HPLandroid/net/metrics/INetdEventListener$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
+PLandroid/net/networkstack/-$$Lambda$NetworkStackClientBase$OwDc2jxNNxij2DwZJOxHrSIkT4w;-><init>(Ljava/lang/String;Landroid/net/ip/IIpClientCallbacks;)V
+PLandroid/net/networkstack/-$$Lambda$NetworkStackClientBase$OwDc2jxNNxij2DwZJOxHrSIkT4w;->accept(Ljava/lang/Object;)V
+PLandroid/net/networkstack/-$$Lambda$NetworkStackClientBase$okdj3YJsErzDSIpQV-9KsxdCYmM;-><init>(Landroid/net/IIpMemoryStoreCallbacks;)V
+PLandroid/net/networkstack/-$$Lambda$NetworkStackClientBase$okdj3YJsErzDSIpQV-9KsxdCYmM;->accept(Ljava/lang/Object;)V
+PLandroid/net/networkstack/ModuleNetworkStackClient$PollingRunner;-><init>(Landroid/net/networkstack/ModuleNetworkStackClient;)V
+PLandroid/net/networkstack/ModuleNetworkStackClient$PollingRunner;-><init>(Landroid/net/networkstack/ModuleNetworkStackClient;Landroid/content/Context;)V
+PLandroid/net/networkstack/ModuleNetworkStackClient$PollingRunner;-><init>(Landroid/net/networkstack/ModuleNetworkStackClient;Landroid/content/Context;Landroid/net/networkstack/ModuleNetworkStackClient$1;)V
+PLandroid/net/networkstack/ModuleNetworkStackClient$PollingRunner;-><init>(Landroid/net/networkstack/ModuleNetworkStackClient;Landroid/net/networkstack/ModuleNetworkStackClient$1;)V
+HPLandroid/net/networkstack/ModuleNetworkStackClient$PollingRunner;->run()V
+PLandroid/net/networkstack/ModuleNetworkStackClient;-><clinit>()V
+PLandroid/net/networkstack/ModuleNetworkStackClient;-><init>()V
+PLandroid/net/networkstack/ModuleNetworkStackClient;->getInstance(Landroid/content/Context;)Landroid/net/networkstack/ModuleNetworkStackClient;
+PLandroid/net/networkstack/ModuleNetworkStackClient;->startPolling()V
+PLandroid/net/networkstack/ModuleNetworkStackClient;->startPolling(Landroid/content/Context;)V
+PLandroid/net/networkstack/NetworkStackClientBase;-><init>()V
+PLandroid/net/networkstack/NetworkStackClientBase;->fetchIpMemoryStore(Landroid/net/IIpMemoryStoreCallbacks;)V
+PLandroid/net/networkstack/NetworkStackClientBase;->lambda$fetchIpMemoryStore$3(Landroid/net/IIpMemoryStoreCallbacks;Landroid/net/INetworkStackConnector;)V
+PLandroid/net/networkstack/NetworkStackClientBase;->lambda$makeIpClient$1(Ljava/lang/String;Landroid/net/ip/IIpClientCallbacks;Landroid/net/INetworkStackConnector;)V
+PLandroid/net/networkstack/NetworkStackClientBase;->makeIpClient(Ljava/lang/String;Landroid/net/ip/IIpClientCallbacks;)V
+PLandroid/net/networkstack/NetworkStackClientBase;->onNetworkStackConnected(Landroid/net/INetworkStackConnector;)V
+PLandroid/net/networkstack/NetworkStackClientBase;->requestConnector(Ljava/util/function/Consumer;)V
 PLandroid/net/shared/-$$Lambda$OsobWheG5dMvEj_cOJtueqUBqBI;-><clinit>()V
 PLandroid/net/shared/-$$Lambda$OsobWheG5dMvEj_cOJtueqUBqBI;-><init>()V
 PLandroid/net/shared/-$$Lambda$SYWvjOUPlAZ_O2Z6yfFU9np1858;-><clinit>()V
@@ -663,6 +725,8 @@
 PLandroid/net/shared/InitialConfiguration;->copy(Landroid/net/shared/InitialConfiguration;)Landroid/net/shared/InitialConfiguration;
 HPLandroid/net/shared/IpConfigurationParcelableUtil;->fromStableParcelable(Landroid/net/DhcpResultsParcelable;)Landroid/net/DhcpResults;
 HPLandroid/net/shared/IpConfigurationParcelableUtil;->unparcelAddress(Ljava/lang/String;)Ljava/net/InetAddress;
+PLandroid/net/shared/Layer2Information;-><init>(Ljava/lang/String;Ljava/lang/String;Landroid/net/MacAddress;)V
+PLandroid/net/shared/Layer2Information;->toStableParcelable()Landroid/net/Layer2InformationParcelable;
 HPLandroid/net/shared/NetworkMonitorUtils;->isPrivateDnsValidationRequired(Landroid/net/NetworkCapabilities;)Z
 HPLandroid/net/shared/ParcelableUtil;->fromParcelableArray([Ljava/lang/Object;Ljava/util/function/Function;)Ljava/util/ArrayList;
 HPLandroid/net/shared/ParcelableUtil;->toParcelableArray(Ljava/util/Collection;Ljava/util/function/Function;Ljava/lang/Class;)[Ljava/lang/Object;
@@ -689,7 +753,7 @@
 PLandroid/net/shared/ProvisioningConfiguration$ScanResultInfo;-><init>(Ljava/lang/String;Ljava/util/List;)V
 PLandroid/net/shared/ProvisioningConfiguration$ScanResultInfo;->access$000(Ljava/nio/ByteBuffer;)[B
 PLandroid/net/shared/ProvisioningConfiguration$ScanResultInfo;->convertToByteArray(Ljava/nio/ByteBuffer;)[B
-PLandroid/net/shared/ProvisioningConfiguration$ScanResultInfo;->toStableParcelable()Landroid/net/ScanResultInfoParcelable;
+HPLandroid/net/shared/ProvisioningConfiguration$ScanResultInfo;->toStableParcelable()Landroid/net/ScanResultInfoParcelable;
 PLandroid/net/shared/ProvisioningConfiguration;-><init>()V
 PLandroid/net/shared/ProvisioningConfiguration;-><init>(Landroid/net/shared/ProvisioningConfiguration;)V
 PLandroid/net/shared/ProvisioningConfiguration;->toStableParcelable()Landroid/net/ProvisioningConfigurationParcelable;
@@ -723,6 +787,7 @@
 HSPLandroid/os/IIdmap2$Stub$Proxy;->getIdmapPath(Ljava/lang/String;I)Ljava/lang/String;
 PLandroid/os/IIdmap2$Stub$Proxy;->removeIdmap(Ljava/lang/String;I)Z
 HSPLandroid/os/IIdmap2$Stub$Proxy;->verifyIdmap(Ljava/lang/String;IZI)Z
+HPLandroid/os/IIdmap2$Stub$Proxy;->verifyIdmap(Ljava/lang/String;Ljava/lang/String;IZI)Z
 HSPLandroid/os/IIdmap2$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/IIdmap2;
 HSPLandroid/os/UserManagerInternal;-><init>()V
 HSPLcom/android/server/-$$Lambda$1xUIIN0BU8izGcnYWT-VzczLBFU;-><clinit>()V
@@ -760,6 +825,8 @@
 PLcom/android/server/-$$Lambda$BatteryService$BatteryPropertiesRegistrar$JTQ79fl14NyImudsJhx-Mp1dJI8;->onValues(II)V
 HPLcom/android/server/-$$Lambda$BatteryService$BatteryPropertiesRegistrar$KZAu97wwr_7_MI0awCjQTzdIuAI;-><init>(Landroid/util/MutableInt;Landroid/os/BatteryProperty;)V
 HPLcom/android/server/-$$Lambda$BatteryService$BatteryPropertiesRegistrar$KZAu97wwr_7_MI0awCjQTzdIuAI;->onValues(II)V
+HPLcom/android/server/-$$Lambda$BatteryService$BatteryPropertiesRegistrar$hInbvsihGvN2hXqvdcoFYzdeqHw;-><init>(Landroid/util/MutableInt;Landroid/os/BatteryProperty;)V
+PLcom/android/server/-$$Lambda$BatteryService$BatteryPropertiesRegistrar$hInbvsihGvN2hXqvdcoFYzdeqHw;->onValues(II)V
 HSPLcom/android/server/-$$Lambda$BatteryService$BatteryPropertiesRegistrar$muNPoFqxU6pF6un7sF70iW4-Fus;-><init>(Lcom/android/server/BatteryService$BatteryPropertiesRegistrar;)V
 HSPLcom/android/server/-$$Lambda$BatteryService$BatteryPropertiesRegistrar$muNPoFqxU6pF6un7sF70iW4-Fus;->run()V
 HSPLcom/android/server/-$$Lambda$BatteryService$D1kwd7L7yyqN5niz3KWkTepVmUk;-><init>(Lcom/android/server/BatteryService;)V
@@ -768,6 +835,8 @@
 HPLcom/android/server/-$$Lambda$ConnectivityService$3$_itgrpHpWu3QvA9Wb0gtsEYJWZY;->run()V
 HSPLcom/android/server/-$$Lambda$ConnectivityService$4mdI2BrJnxGXPEiesjVbm4BY2so;-><init>(Lcom/android/server/ConnectivityService;Landroid/os/Messenger;)V
 PLcom/android/server/-$$Lambda$ConnectivityService$4mdI2BrJnxGXPEiesjVbm4BY2so;->binderDied()V
+PLcom/android/server/-$$Lambda$ConnectivityService$6bEB7WFnOunsH4qwhZ_F6bf0Lb8;-><init>(Lcom/android/server/ConnectivityService;)V
+PLcom/android/server/-$$Lambda$ConnectivityService$6bEB7WFnOunsH4qwhZ_F6bf0Lb8;->run()V
 PLcom/android/server/-$$Lambda$ConnectivityService$Bd0Iky-FHBTmS5tJGxK9OZvajR4;-><init>(Lcom/android/server/ConnectivityService;)V
 PLcom/android/server/-$$Lambda$ConnectivityService$Bd0Iky-FHBTmS5tJGxK9OZvajR4;->run()V
 PLcom/android/server/-$$Lambda$ConnectivityService$GX97FVWNZr22L2SZWTK3UYHOOe0;-><clinit>()V
@@ -784,6 +853,9 @@
 HPLcom/android/server/-$$Lambda$ConnectivityService$ONlkcNIY7zZyZhG_msTp1qIA_cQ;->runOrThrow()V
 HSPLcom/android/server/-$$Lambda$ConnectivityService$SFqiR4Pfksb1C7csMC3uNxCllR8;-><init>(Lcom/android/server/ConnectivityService;)V
 PLcom/android/server/-$$Lambda$ConnectivityService$SFqiR4Pfksb1C7csMC3uNxCllR8;->run()V
+PLcom/android/server/-$$Lambda$ConnectivityService$XT2zS9HW9HrYR9HM0MhxU58wtIo;-><clinit>()V
+PLcom/android/server/-$$Lambda$ConnectivityService$XT2zS9HW9HrYR9HM0MhxU58wtIo;-><init>()V
+HPLcom/android/server/-$$Lambda$ConnectivityService$XT2zS9HW9HrYR9HM0MhxU58wtIo;->apply(Ljava/lang/Object;)Ljava/lang/Object;
 PLcom/android/server/-$$Lambda$ConnectivityService$_NU7EIcPVS-uF_gWH_NWN_gBL4w;-><clinit>()V
 PLcom/android/server/-$$Lambda$ConnectivityService$_NU7EIcPVS-uF_gWH_NWN_gBL4w;-><init>()V
 PLcom/android/server/-$$Lambda$ConnectivityService$_NU7EIcPVS-uF_gWH_NWN_gBL4w;->applyAsInt(Ljava/lang/Object;)I
@@ -798,6 +870,9 @@
 HPLcom/android/server/-$$Lambda$ConnectivityService$uvmt4yGRo-ufWZED19neBxJaTNk;->run()V
 PLcom/android/server/-$$Lambda$ConnectivityService$vGRhfNpFTw0hellWUlmBolfzRy8;-><init>(Lcom/android/server/ConnectivityService;Landroid/content/Intent;)V
 PLcom/android/server/-$$Lambda$ConnectivityService$vGRhfNpFTw0hellWUlmBolfzRy8;->runOrThrow()V
+PLcom/android/server/-$$Lambda$ConnectivityService$x0Ij0w36gakQlfjj4QRMgSl4VPo;-><clinit>()V
+PLcom/android/server/-$$Lambda$ConnectivityService$x0Ij0w36gakQlfjj4QRMgSl4VPo;-><init>()V
+HPLcom/android/server/-$$Lambda$ConnectivityService$x0Ij0w36gakQlfjj4QRMgSl4VPo;->apply(Ljava/lang/Object;)Ljava/lang/Object;
 HSPLcom/android/server/-$$Lambda$ContextHubSystemService$q-5gSEKm3he-4vIHcay4DLtf85E;-><init>(Lcom/android/server/ContextHubSystemService;Landroid/content/Context;)V
 HSPLcom/android/server/-$$Lambda$ContextHubSystemService$q-5gSEKm3he-4vIHcay4DLtf85E;->run()V
 HSPLcom/android/server/-$$Lambda$CountryDetectorService$ESi5ICoEixGJHWdY67G_J38VrJI;-><init>(Lcom/android/server/CountryDetectorService;)V
@@ -886,6 +961,10 @@
 HSPLcom/android/server/-$$Lambda$LocationManagerService$oIimlThgbbmKRAN80H4tpnruGtk;->onSettingChanged(I)V
 HSPLcom/android/server/-$$Lambda$LocationManagerService$qbZh8GXCTpZ1wNP3qw1VXZxlKQg;-><init>(Lcom/android/server/LocationManagerService;)V
 HSPLcom/android/server/-$$Lambda$LocationManagerService$qbZh8GXCTpZ1wNP3qw1VXZxlKQg;->onSettingChanged(I)V
+PLcom/android/server/-$$Lambda$LocationManagerService$rCyjSaqQ-rLpPfZIkKmdIMxpVhs;-><init>(Lcom/android/server/LocationManagerService;)V
+PLcom/android/server/-$$Lambda$LocationManagerService$rCyjSaqQ-rLpPfZIkKmdIMxpVhs;->onAppOpsChanged(Ljava/lang/String;)V
+PLcom/android/server/-$$Lambda$LocationManagerService$s3R56DsYN07S8NsTGndtSeeOvjM;-><init>(Lcom/android/server/LocationManagerService;Landroid/location/ILocationListener;)V
+PLcom/android/server/-$$Lambda$LocationManagerService$s3R56DsYN07S8NsTGndtSeeOvjM;->onCancel()V
 PLcom/android/server/-$$Lambda$LooperStatsService$Byo6QAxZpVXDCMtjrcYJc6YLAks;-><clinit>()V
 PLcom/android/server/-$$Lambda$LooperStatsService$Byo6QAxZpVXDCMtjrcYJc6YLAks;-><init>()V
 HPLcom/android/server/-$$Lambda$LooperStatsService$Byo6QAxZpVXDCMtjrcYJc6YLAks;->apply(Ljava/lang/Object;)Ljava/lang/Object;
@@ -952,13 +1031,21 @@
 HSPLcom/android/server/-$$Lambda$PackageWatchdog$Q0WI2EJpRFO1jF_7_YDaj1eGHas;->run()V
 PLcom/android/server/-$$Lambda$PackageWatchdog$VAW1s9zLN90OWS2gosDw9xdVjr8;-><init>(Lcom/android/server/PackageWatchdog;)V
 PLcom/android/server/-$$Lambda$PackageWatchdog$VAW1s9zLN90OWS2gosDw9xdVjr8;->run()V
+PLcom/android/server/-$$Lambda$PackageWatchdog$Ya4lYGbdDy3Dda20wvc2AHBqIMM;-><init>(Lcom/android/server/PackageWatchdog;ILjava/util/List;)V
+PLcom/android/server/-$$Lambda$PackageWatchdog$Ya4lYGbdDy3Dda20wvc2AHBqIMM;->run()V
+PLcom/android/server/-$$Lambda$PackageWatchdog$c6DeFAaAsEUAlPf0Sv5YyUydmCk;-><init>(Lcom/android/server/PackageWatchdog;)V
 HPLcom/android/server/-$$Lambda$PackageWatchdog$hFdPWF73rahpzi1hJ-d9hNfUNrY;-><init>(Lcom/android/server/PackageWatchdog;ILjava/util/List;)V
 HPLcom/android/server/-$$Lambda$PackageWatchdog$hFdPWF73rahpzi1hJ-d9hNfUNrY;->run()V
 PLcom/android/server/-$$Lambda$PackageWatchdog$ib8X74W4PjX4xo1uv-QgOpcuf4o;-><init>(Lcom/android/server/PackageWatchdog;)V
 PLcom/android/server/-$$Lambda$PackageWatchdog$ib8X74W4PjX4xo1uv-QgOpcuf4o;->run()V
+PLcom/android/server/-$$Lambda$PackageWatchdog$jINplDIdLxNaZiKt8dCCJn1Cx6c;-><init>(Lcom/android/server/PackageWatchdog;Lcom/android/server/PackageWatchdog$PackageHealthObserver;Ljava/util/List;Ljava/util/List;)V
+PLcom/android/server/-$$Lambda$PackageWatchdog$jINplDIdLxNaZiKt8dCCJn1Cx6c;->run()V
+PLcom/android/server/-$$Lambda$PackageWatchdog$l0t57Hik0VChZk77GfFE4tnfo0g;-><init>(Lcom/android/server/PackageWatchdog;)V
 HSPLcom/android/server/-$$Lambda$PackageWatchdog$nOS9OaZO4hPsSe0I8skPT1UgQoo;-><init>(Lcom/android/server/PackageWatchdog;)V
 PLcom/android/server/-$$Lambda$PackageWatchdog$nOS9OaZO4hPsSe0I8skPT1UgQoo;->accept(Ljava/lang/Object;)V
 HSPLcom/android/server/-$$Lambda$PackageWatchdog$oAoA92I4TtJeqztFu3XBOLEs7gE;-><init>(Lcom/android/server/PackageWatchdog;)V
+PLcom/android/server/-$$Lambda$PackageWatchdog$pCeN8Lr1-8Uwvg-VmBTEDs1Ak0w;-><init>(Lcom/android/server/PackageWatchdog;Lcom/android/server/PackageWatchdog$ObserverInternal;Ljava/util/Set;)V
+PLcom/android/server/-$$Lambda$PackageWatchdog$pCeN8Lr1-8Uwvg-VmBTEDs1Ak0w;->run()V
 HSPLcom/android/server/-$$Lambda$PackageWatchdog$uFI2R7Ip9Bh1wQPJqJ5H5A0soVU;-><init>(Lcom/android/server/PackageWatchdog;)V
 HSPLcom/android/server/-$$Lambda$PackageWatchdog$uFI2R7Ip9Bh1wQPJqJ5H5A0soVU;->accept(Ljava/lang/Object;)V
 HSPLcom/android/server/-$$Lambda$PackageWatchdog$vRKcIrucEj03dz6ypRVINZtns1s;-><init>(Lcom/android/server/PackageWatchdog;)V
@@ -993,7 +1080,7 @@
 HSPLcom/android/server/-$$Lambda$ServiceWatcher$K66HPJls7ga1t3t859fKACfAgZc;-><init>(Lcom/android/server/ServiceWatcher;)V
 HSPLcom/android/server/-$$Lambda$ServiceWatcher$K66HPJls7ga1t3t859fKACfAgZc;->run()V
 HPLcom/android/server/-$$Lambda$ServiceWatcher$b1z9OeL-1VpQ_8p47qz7nMNUpsE;-><init>(Lcom/android/server/ServiceWatcher;Ljava/lang/Object;Lcom/android/server/ServiceWatcher$BlockingBinderRunner;)V
-PLcom/android/server/-$$Lambda$ServiceWatcher$b1z9OeL-1VpQ_8p47qz7nMNUpsE;->call()Ljava/lang/Object;
+HPLcom/android/server/-$$Lambda$ServiceWatcher$b1z9OeL-1VpQ_8p47qz7nMNUpsE;->call()Ljava/lang/Object;
 HSPLcom/android/server/-$$Lambda$ServiceWatcher$gVk2fFkq2-aamIua2kIpukAFtf8;-><init>(Lcom/android/server/ServiceWatcher;Lcom/android/server/ServiceWatcher$BinderRunner;)V
 HSPLcom/android/server/-$$Lambda$ServiceWatcher$gVk2fFkq2-aamIua2kIpukAFtf8;->run()V
 HSPLcom/android/server/-$$Lambda$ServiceWatcher$kpBQqFYVia3SVpOH46tF4fNydw0;-><init>(Lcom/android/server/ServiceWatcher;Lcom/android/server/ServiceWatcher$BinderRunner;)V
@@ -1004,6 +1091,10 @@
 HSPLcom/android/server/-$$Lambda$ServiceWatcher$uru7j1zD-GiN8rndFZ3KWaTrxYo;->run()V
 HPLcom/android/server/-$$Lambda$ServiceWatcher$x-WpgD2R0YjDE53WHPzWKGSSc4I;-><init>(Lcom/android/server/ServiceWatcher;Ljava/lang/Object;Lcom/android/server/ServiceWatcher$BlockingBinderRunner;)V
 HPLcom/android/server/-$$Lambda$ServiceWatcher$x-WpgD2R0YjDE53WHPzWKGSSc4I;->call()Ljava/lang/Object;
+PLcom/android/server/-$$Lambda$StorageManagerService$6g0hhcpj48ZZWYDGsK6G9FBeFyI;-><init>(Lcom/android/server/StorageManagerService;Landroid/os/storage/VolumeInfo;I)V
+PLcom/android/server/-$$Lambda$StorageManagerService$6g0hhcpj48ZZWYDGsK6G9FBeFyI;->run()V
+PLcom/android/server/-$$Lambda$StorageManagerService$B77ZuGSn5EDc_Ly81JaezAetgfQ;-><init>(Lcom/android/server/StorageManagerService;Landroid/os/storage/VolumeInfo;I)V
+PLcom/android/server/-$$Lambda$StorageManagerService$B77ZuGSn5EDc_Ly81JaezAetgfQ;->run()V
 PLcom/android/server/-$$Lambda$StorageManagerService$iQEwQayMYzs9Ew4L6Gk7kRIO9wM;-><init>(Lcom/android/server/StorageManagerService;)V
 PLcom/android/server/-$$Lambda$StorageManagerService$iQEwQayMYzs9Ew4L6Gk7kRIO9wM;->run()V
 HSPLcom/android/server/-$$Lambda$StorageManagerService$js3bHvdd2Mf8gztNxvL27JoT034;-><init>(Lcom/android/server/StorageManagerService;)V
@@ -1039,10 +1130,15 @@
 PLcom/android/server/-$$Lambda$TelephonyRegistry$1bce8MzlZGgWfCoSiX5udUvFDQ0;->test(I)Z
 HPLcom/android/server/-$$Lambda$TelephonyRegistry$ANYH01Imb6dMua6cgKvMEl4kD3I;-><init>(Lcom/android/server/TelephonyRegistry;Landroid/telephony/LocationAccessPolicy$LocationPermissionQuery;)V
 HPLcom/android/server/-$$Lambda$TelephonyRegistry$ANYH01Imb6dMua6cgKvMEl4kD3I;->getOrThrow()Ljava/lang/Object;
+PLcom/android/server/-$$Lambda$TelephonyRegistry$ConfigurationProvider$A5xhR3lZDw53BlzyFNt_k-u3iFQ;-><clinit>()V
+PLcom/android/server/-$$Lambda$TelephonyRegistry$ConfigurationProvider$A5xhR3lZDw53BlzyFNt_k-u3iFQ;-><init>()V
+HPLcom/android/server/-$$Lambda$TelephonyRegistry$ConfigurationProvider$A5xhR3lZDw53BlzyFNt_k-u3iFQ;->getOrThrow()Ljava/lang/Object;
 HPLcom/android/server/-$$Lambda$TelephonyRegistry$KwKYEFoKdijV5jZbDqX1IUV4CzY;-><init>(Lcom/android/server/TelephonyRegistry;Landroid/telephony/LocationAccessPolicy$LocationPermissionQuery;)V
 HPLcom/android/server/-$$Lambda$TelephonyRegistry$KwKYEFoKdijV5jZbDqX1IUV4CzY;->getOrThrow()Ljava/lang/Object;
 PLcom/android/server/-$$Lambda$UiModeManagerService$10$s3H4QPM2YRtAd9qa2Ja54k7yJO0;-><init>(Ljava/lang/String;)V
 PLcom/android/server/-$$Lambda$UiModeManagerService$10$s3H4QPM2YRtAd9qa2Ja54k7yJO0;->test(Ljava/lang/Object;)Z
+PLcom/android/server/-$$Lambda$UiModeManagerService$11$hX6U5hjZADuyktvQMUj2cydVQns;-><init>(Ljava/lang/String;)V
+PLcom/android/server/-$$Lambda$UiModeManagerService$11$hX6U5hjZADuyktvQMUj2cydVQns;->test(Ljava/lang/Object;)Z
 PLcom/android/server/-$$Lambda$UiModeManagerService$9$ytrifY2iawCLCBtYLrmL70q1UhI;-><init>(Ljava/lang/String;)V
 PLcom/android/server/-$$Lambda$UiModeManagerService$9$ytrifY2iawCLCBtYLrmL70q1UhI;->test(Ljava/lang/Object;)Z
 HSPLcom/android/server/-$$Lambda$UiModeManagerService$AwUHdh7CYhroUMaGm35a4uvZcnY;-><init>(Lcom/android/server/UiModeManagerService;)V
@@ -1051,6 +1147,8 @@
 PLcom/android/server/-$$Lambda$UiModeManagerService$BF3rAsw9_KQuADymF0UAmeEA7QQ;->accept(Ljava/lang/Object;)V
 HSPLcom/android/server/-$$Lambda$UiModeManagerService$LsJLdIbeoHmgOz46O-Ez9nmVZ2w;-><init>(Lcom/android/server/UiModeManagerService;Landroid/content/Context;Landroid/content/res/Resources;)V
 HSPLcom/android/server/-$$Lambda$UiModeManagerService$LsJLdIbeoHmgOz46O-Ez9nmVZ2w;->run()V
+PLcom/android/server/-$$Lambda$UiModeManagerService$VLNn_GQ5Eu6ftBtzL1gH0sSXyCk;-><init>(Lcom/android/server/UiModeManagerService;)V
+PLcom/android/server/-$$Lambda$UiModeManagerService$VLNn_GQ5Eu6ftBtzL1gH0sSXyCk;->accept(Ljava/lang/Object;)V
 HSPLcom/android/server/-$$Lambda$UiModeManagerService$bGpxq9ta5GBYtiUBAOy4iNtThus;-><init>(Lcom/android/server/UiModeManagerService;)V
 PLcom/android/server/-$$Lambda$UiModeManagerService$bGpxq9ta5GBYtiUBAOy4iNtThus;->accept(Ljava/lang/Object;)V
 HSPLcom/android/server/-$$Lambda$UiModeManagerService$vYS4_RzjAavNRF50rrGN0tXI5JM;-><init>(Lcom/android/server/UiModeManagerService;)V
@@ -1338,6 +1436,7 @@
 HSPLcom/android/server/AnimationThread;->getHandler()Landroid/os/Handler;
 HSPLcom/android/server/AppStateTracker$AppOpsWatcher;-><init>(Lcom/android/server/AppStateTracker;)V
 HSPLcom/android/server/AppStateTracker$AppOpsWatcher;-><init>(Lcom/android/server/AppStateTracker;Lcom/android/server/AppStateTracker$1;)V
+PLcom/android/server/AppStateTracker$AppOpsWatcher;->opChanged(IILjava/lang/String;)V
 HSPLcom/android/server/AppStateTracker$FeatureFlagsObserver;-><init>(Lcom/android/server/AppStateTracker;)V
 HSPLcom/android/server/AppStateTracker$FeatureFlagsObserver;->isForcedAppStandbyEnabled()Z
 HSPLcom/android/server/AppStateTracker$FeatureFlagsObserver;->isForcedAppStandbyForSmallBatteryEnabled()Z
@@ -1350,14 +1449,17 @@
 PLcom/android/server/AppStateTracker$Listener;->access$1700(Lcom/android/server/AppStateTracker$Listener;Lcom/android/server/AppStateTracker;)V
 HSPLcom/android/server/AppStateTracker$Listener;->onExemptChanged(Lcom/android/server/AppStateTracker;)V
 PLcom/android/server/AppStateTracker$Listener;->onForceAllAppsStandbyChanged(Lcom/android/server/AppStateTracker;)V
+PLcom/android/server/AppStateTracker$Listener;->onRunAnyAppOpsChanged(Lcom/android/server/AppStateTracker;ILjava/lang/String;)V
 PLcom/android/server/AppStateTracker$Listener;->onTempPowerSaveWhitelistChanged(Lcom/android/server/AppStateTracker;)V
 HSPLcom/android/server/AppStateTracker$Listener;->onUidActiveStateChanged(Lcom/android/server/AppStateTracker;I)V
 HSPLcom/android/server/AppStateTracker$Listener;->onUidForeground(IZ)V
 HSPLcom/android/server/AppStateTracker$Listener;->onUidForegroundStateChanged(Lcom/android/server/AppStateTracker;I)V
+PLcom/android/server/AppStateTracker$Listener;->stopForegroundServicesForUidPackage(ILjava/lang/String;)V
 HSPLcom/android/server/AppStateTracker$Listener;->unblockAlarmsForUid(I)V
 HSPLcom/android/server/AppStateTracker$Listener;->unblockAllUnrestrictedAlarms()V
 HSPLcom/android/server/AppStateTracker$Listener;->updateAllJobs()V
 HSPLcom/android/server/AppStateTracker$Listener;->updateJobsForUid(IZ)V
+PLcom/android/server/AppStateTracker$Listener;->updateJobsForUidPackage(ILjava/lang/String;Z)V
 HSPLcom/android/server/AppStateTracker$MyHandler;-><init>(Lcom/android/server/AppStateTracker;Landroid/os/Looper;)V
 HSPLcom/android/server/AppStateTracker$MyHandler;->handleMessage(Landroid/os/Message;)V
 HSPLcom/android/server/AppStateTracker$MyHandler;->handleUidActive(I)V
@@ -1367,6 +1469,7 @@
 HSPLcom/android/server/AppStateTracker$MyHandler;->notifyAllWhitelistChanged()V
 HSPLcom/android/server/AppStateTracker$MyHandler;->notifyExemptChanged()V
 PLcom/android/server/AppStateTracker$MyHandler;->notifyForceAllAppsStandbyChanged()V
+PLcom/android/server/AppStateTracker$MyHandler;->notifyRunAnyAppOpsChanged(ILjava/lang/String;)V
 HPLcom/android/server/AppStateTracker$MyHandler;->notifyTempWhitelistChanged()V
 HSPLcom/android/server/AppStateTracker$MyHandler;->notifyUidActiveStateChanged(I)V
 HSPLcom/android/server/AppStateTracker$MyHandler;->notifyUidForegroundStateChanged(I)V
@@ -1434,6 +1537,7 @@
 HSPLcom/android/server/AppStateTracker;->setPowerSaveWhitelistAppIds([I[I[I)V
 HSPLcom/android/server/AppStateTracker;->toggleForceAllAppsStandbyLocked(Z)V
 HSPLcom/android/server/AppStateTracker;->updateForceAllAppStandbyState()V
+PLcom/android/server/AppStateTracker;->updateForcedAppStandbyUidPackageLocked(ILjava/lang/String;Z)Z
 HSPLcom/android/server/AttributeCache$Entry;-><init>(Landroid/content/Context;Landroid/content/res/TypedArray;)V
 PLcom/android/server/AttributeCache$Entry;->recycle()V
 HSPLcom/android/server/AttributeCache$Package;-><init>(Landroid/content/Context;)V
@@ -1465,6 +1569,7 @@
 PLcom/android/server/BatteryService$BatteryPropertiesRegistrar;->lambda$getProperty$1(Landroid/util/MutableInt;Landroid/os/BatteryProperty;II)V
 HPLcom/android/server/BatteryService$BatteryPropertiesRegistrar;->lambda$getProperty$2(Landroid/util/MutableInt;Landroid/os/BatteryProperty;II)V
 HPLcom/android/server/BatteryService$BatteryPropertiesRegistrar;->lambda$getProperty$3(Landroid/util/MutableInt;Landroid/os/BatteryProperty;II)V
+PLcom/android/server/BatteryService$BatteryPropertiesRegistrar;->lambda$getProperty$4(Landroid/util/MutableInt;Landroid/os/BatteryProperty;II)V
 HPLcom/android/server/BatteryService$BatteryPropertiesRegistrar;->lambda$getProperty$5(Landroid/util/MutableInt;Landroid/os/BatteryProperty;IJ)V
 HSPLcom/android/server/BatteryService$BatteryPropertiesRegistrar;->lambda$scheduleUpdate$6$BatteryService$BatteryPropertiesRegistrar()V
 HSPLcom/android/server/BatteryService$BatteryPropertiesRegistrar;->scheduleUpdate()V
@@ -1621,14 +1726,19 @@
 PLcom/android/server/BluetoothManagerService$ClientDeathRecipient;->getPackageName()Ljava/lang/String;
 HSPLcom/android/server/BluetoothManagerService$ProfileServiceConnections;-><init>(Lcom/android/server/BluetoothManagerService;Landroid/content/Intent;)V
 HSPLcom/android/server/BluetoothManagerService$ProfileServiceConnections;->access$1300(Lcom/android/server/BluetoothManagerService$ProfileServiceConnections;)Z
+PLcom/android/server/BluetoothManagerService$ProfileServiceConnections;->access$1400(Lcom/android/server/BluetoothManagerService$ProfileServiceConnections;)Z
 PLcom/android/server/BluetoothManagerService$ProfileServiceConnections;->access$1400(Lcom/android/server/BluetoothManagerService$ProfileServiceConnections;Landroid/bluetooth/IBluetoothProfileServiceConnection;)V
 PLcom/android/server/BluetoothManagerService$ProfileServiceConnections;->access$1500(Lcom/android/server/BluetoothManagerService$ProfileServiceConnections;)Z
+PLcom/android/server/BluetoothManagerService$ProfileServiceConnections;->access$1500(Lcom/android/server/BluetoothManagerService$ProfileServiceConnections;Landroid/bluetooth/IBluetoothProfileServiceConnection;)V
+PLcom/android/server/BluetoothManagerService$ProfileServiceConnections;->access$1600(Lcom/android/server/BluetoothManagerService$ProfileServiceConnections;)V
+PLcom/android/server/BluetoothManagerService$ProfileServiceConnections;->access$1600(Lcom/android/server/BluetoothManagerService$ProfileServiceConnections;)Z
 HSPLcom/android/server/BluetoothManagerService$ProfileServiceConnections;->access$2000(Lcom/android/server/BluetoothManagerService$ProfileServiceConnections;)Z
 PLcom/android/server/BluetoothManagerService$ProfileServiceConnections;->access$2100(Lcom/android/server/BluetoothManagerService$ProfileServiceConnections;Landroid/bluetooth/IBluetoothProfileServiceConnection;)V
 PLcom/android/server/BluetoothManagerService$ProfileServiceConnections;->access$2200(Lcom/android/server/BluetoothManagerService$ProfileServiceConnections;)Z
 PLcom/android/server/BluetoothManagerService$ProfileServiceConnections;->access$2300(Lcom/android/server/BluetoothManagerService$ProfileServiceConnections;)V
 HPLcom/android/server/BluetoothManagerService$ProfileServiceConnections;->access$3300(Lcom/android/server/BluetoothManagerService$ProfileServiceConnections;Landroid/bluetooth/IBluetoothProfileServiceConnection;)V
 HPLcom/android/server/BluetoothManagerService$ProfileServiceConnections;->access$3500(Lcom/android/server/BluetoothManagerService$ProfileServiceConnections;Landroid/bluetooth/IBluetoothProfileServiceConnection;)V
+PLcom/android/server/BluetoothManagerService$ProfileServiceConnections;->access$3600(Lcom/android/server/BluetoothManagerService$ProfileServiceConnections;Landroid/bluetooth/IBluetoothProfileServiceConnection;)V
 HPLcom/android/server/BluetoothManagerService$ProfileServiceConnections;->addProxy(Landroid/bluetooth/IBluetoothProfileServiceConnection;)V
 HSPLcom/android/server/BluetoothManagerService$ProfileServiceConnections;->bindService()Z
 PLcom/android/server/BluetoothManagerService$ProfileServiceConnections;->binderDied()V
@@ -1644,10 +1754,14 @@
 HSPLcom/android/server/BluetoothManagerService;->access$1000(Lcom/android/server/BluetoothManagerService;)Ljava/util/concurrent/locks/ReentrantReadWriteLock;
 HSPLcom/android/server/BluetoothManagerService;->access$1002(Lcom/android/server/BluetoothManagerService;Landroid/bluetooth/IBluetooth;)Landroid/bluetooth/IBluetooth;
 HSPLcom/android/server/BluetoothManagerService;->access$1100(Lcom/android/server/BluetoothManagerService;)Landroid/bluetooth/IBluetooth;
+PLcom/android/server/BluetoothManagerService;->access$1100(Lcom/android/server/BluetoothManagerService;)Ljava/util/concurrent/locks/ReentrantReadWriteLock;
 PLcom/android/server/BluetoothManagerService;->access$1100(Lcom/android/server/BluetoothManagerService;)V
 HSPLcom/android/server/BluetoothManagerService;->access$1102(Lcom/android/server/BluetoothManagerService;Landroid/bluetooth/IBluetooth;)Landroid/bluetooth/IBluetooth;
+PLcom/android/server/BluetoothManagerService;->access$1200(Lcom/android/server/BluetoothManagerService;)Landroid/bluetooth/IBluetooth;
 PLcom/android/server/BluetoothManagerService;->access$1200(Lcom/android/server/BluetoothManagerService;ILjava/lang/String;Z)V
+PLcom/android/server/BluetoothManagerService;->access$1202(Lcom/android/server/BluetoothManagerService;Landroid/bluetooth/IBluetooth;)Landroid/bluetooth/IBluetooth;
 HSPLcom/android/server/BluetoothManagerService;->access$1300(Lcom/android/server/BluetoothManagerService;)Z
+PLcom/android/server/BluetoothManagerService;->access$1300(Lcom/android/server/BluetoothManagerService;ILjava/lang/String;Z)V
 HSPLcom/android/server/BluetoothManagerService;->access$1302(Lcom/android/server/BluetoothManagerService;Z)Z
 PLcom/android/server/BluetoothManagerService;->access$1400(Lcom/android/server/BluetoothManagerService;)Z
 PLcom/android/server/BluetoothManagerService;->access$1402(Lcom/android/server/BluetoothManagerService;Z)Z
@@ -1657,22 +1771,38 @@
 HSPLcom/android/server/BluetoothManagerService;->access$1700(Lcom/android/server/BluetoothManagerService;Ljava/lang/String;Ljava/lang/String;)V
 HSPLcom/android/server/BluetoothManagerService;->access$1702(Lcom/android/server/BluetoothManagerService;Z)Z
 PLcom/android/server/BluetoothManagerService;->access$1800(Lcom/android/server/BluetoothManagerService;)Ljava/util/Map;
-PLcom/android/server/BluetoothManagerService;->access$1900(Lcom/android/server/BluetoothManagerService;)Z
+PLcom/android/server/BluetoothManagerService;->access$1800(Lcom/android/server/BluetoothManagerService;)Z
+PLcom/android/server/BluetoothManagerService;->access$1802(Lcom/android/server/BluetoothManagerService;Z)Z
+HPLcom/android/server/BluetoothManagerService;->access$1900(Lcom/android/server/BluetoothManagerService;)Z
 HSPLcom/android/server/BluetoothManagerService;->access$1902(Lcom/android/server/BluetoothManagerService;Z)Z
 HSPLcom/android/server/BluetoothManagerService;->access$200(Lcom/android/server/BluetoothManagerService;)Lcom/android/server/BluetoothManagerService$BluetoothHandler;
+PLcom/android/server/BluetoothManagerService;->access$2000(Lcom/android/server/BluetoothManagerService;)Z
+PLcom/android/server/BluetoothManagerService;->access$2002(Lcom/android/server/BluetoothManagerService;Z)Z
 PLcom/android/server/BluetoothManagerService;->access$2100(Lcom/android/server/BluetoothManagerService;I)V
 HSPLcom/android/server/BluetoothManagerService;->access$2200(Lcom/android/server/BluetoothManagerService;)Z
+PLcom/android/server/BluetoothManagerService;->access$2200(Lcom/android/server/BluetoothManagerService;I)V
 HSPLcom/android/server/BluetoothManagerService;->access$2202(Lcom/android/server/BluetoothManagerService;Z)Z
+PLcom/android/server/BluetoothManagerService;->access$2300(Lcom/android/server/BluetoothManagerService;)Z
 HSPLcom/android/server/BluetoothManagerService;->access$2300(Lcom/android/server/BluetoothManagerService;Z)V
+PLcom/android/server/BluetoothManagerService;->access$2302(Lcom/android/server/BluetoothManagerService;Z)Z
 PLcom/android/server/BluetoothManagerService;->access$2400(Lcom/android/server/BluetoothManagerService;Ljava/util/Set;)Z
+PLcom/android/server/BluetoothManagerService;->access$2400(Lcom/android/server/BluetoothManagerService;Z)V
 PLcom/android/server/BluetoothManagerService;->access$2400(Lcom/android/server/BluetoothManagerService;ZZ)Z
 PLcom/android/server/BluetoothManagerService;->access$2500(Lcom/android/server/BluetoothManagerService;)I
 PLcom/android/server/BluetoothManagerService;->access$2500(Lcom/android/server/BluetoothManagerService;)Z
+PLcom/android/server/BluetoothManagerService;->access$2502(Lcom/android/server/BluetoothManagerService;I)I
 HSPLcom/android/server/BluetoothManagerService;->access$2502(Lcom/android/server/BluetoothManagerService;Z)Z
+PLcom/android/server/BluetoothManagerService;->access$2508(Lcom/android/server/BluetoothManagerService;)I
 PLcom/android/server/BluetoothManagerService;->access$2600(Lcom/android/server/BluetoothManagerService;)V
+PLcom/android/server/BluetoothManagerService;->access$2602(Lcom/android/server/BluetoothManagerService;I)I
+PLcom/android/server/BluetoothManagerService;->access$2700(Lcom/android/server/BluetoothManagerService;)V
 HSPLcom/android/server/BluetoothManagerService;->access$2700(Lcom/android/server/BluetoothManagerService;)Z
+PLcom/android/server/BluetoothManagerService;->access$2702(Lcom/android/server/BluetoothManagerService;I)I
 HSPLcom/android/server/BluetoothManagerService;->access$2702(Lcom/android/server/BluetoothManagerService;Z)Z
+PLcom/android/server/BluetoothManagerService;->access$2800(Lcom/android/server/BluetoothManagerService;)I
 HSPLcom/android/server/BluetoothManagerService;->access$2800(Lcom/android/server/BluetoothManagerService;Z)V
+PLcom/android/server/BluetoothManagerService;->access$2802(Lcom/android/server/BluetoothManagerService;I)I
+PLcom/android/server/BluetoothManagerService;->access$2900(Lcom/android/server/BluetoothManagerService;)I
 PLcom/android/server/BluetoothManagerService;->access$2900(Lcom/android/server/BluetoothManagerService;ZZ)Z
 PLcom/android/server/BluetoothManagerService;->access$300(Lcom/android/server/BluetoothManagerService;IZ)V
 PLcom/android/server/BluetoothManagerService;->access$3000(Lcom/android/server/BluetoothManagerService;)I
@@ -1682,36 +1812,50 @@
 HSPLcom/android/server/BluetoothManagerService;->access$3200(Lcom/android/server/BluetoothManagerService;)Landroid/os/RemoteCallbackList;
 HPLcom/android/server/BluetoothManagerService;->access$3200(Lcom/android/server/BluetoothManagerService;)Ljava/util/Map;
 HSPLcom/android/server/BluetoothManagerService;->access$3300(Lcom/android/server/BluetoothManagerService;)Landroid/os/RemoteCallbackList;
+HPLcom/android/server/BluetoothManagerService;->access$3400(Lcom/android/server/BluetoothManagerService;)Landroid/os/RemoteCallbackList;
 PLcom/android/server/BluetoothManagerService;->access$3400(Lcom/android/server/BluetoothManagerService;)Ljava/util/Map;
 PLcom/android/server/BluetoothManagerService;->access$3402(Lcom/android/server/BluetoothManagerService;Landroid/bluetooth/IBluetoothGatt;)Landroid/bluetooth/IBluetoothGatt;
+PLcom/android/server/BluetoothManagerService;->access$3500(Lcom/android/server/BluetoothManagerService;)Ljava/util/Map;
 PLcom/android/server/BluetoothManagerService;->access$3500(Lcom/android/server/BluetoothManagerService;)V
 PLcom/android/server/BluetoothManagerService;->access$3602(Lcom/android/server/BluetoothManagerService;Landroid/bluetooth/IBluetoothGatt;)Landroid/bluetooth/IBluetoothGatt;
 HSPLcom/android/server/BluetoothManagerService;->access$3602(Lcom/android/server/BluetoothManagerService;Landroid/os/IBinder;)Landroid/os/IBinder;
 PLcom/android/server/BluetoothManagerService;->access$3700(Lcom/android/server/BluetoothManagerService;)V
 HSPLcom/android/server/BluetoothManagerService;->access$3700(Lcom/android/server/BluetoothManagerService;)Z
+PLcom/android/server/BluetoothManagerService;->access$3702(Lcom/android/server/BluetoothManagerService;Landroid/bluetooth/IBluetoothGatt;)Landroid/bluetooth/IBluetoothGatt;
 HSPLcom/android/server/BluetoothManagerService;->access$3800(Lcom/android/server/BluetoothManagerService;)Landroid/bluetooth/IBluetoothCallback;
+PLcom/android/server/BluetoothManagerService;->access$3800(Lcom/android/server/BluetoothManagerService;)V
 HSPLcom/android/server/BluetoothManagerService;->access$3802(Lcom/android/server/BluetoothManagerService;Landroid/os/IBinder;)Landroid/os/IBinder;
 HSPLcom/android/server/BluetoothManagerService;->access$3900(Lcom/android/server/BluetoothManagerService;)V
 HSPLcom/android/server/BluetoothManagerService;->access$3900(Lcom/android/server/BluetoothManagerService;)Z
+PLcom/android/server/BluetoothManagerService;->access$3902(Lcom/android/server/BluetoothManagerService;Landroid/os/IBinder;)Landroid/os/IBinder;
 PLcom/android/server/BluetoothManagerService;->access$400(Lcom/android/server/BluetoothManagerService;)Landroid/content/Context;
 PLcom/android/server/BluetoothManagerService;->access$4000(Lcom/android/server/BluetoothManagerService;)I
 HSPLcom/android/server/BluetoothManagerService;->access$4000(Lcom/android/server/BluetoothManagerService;)Landroid/bluetooth/IBluetoothCallback;
+PLcom/android/server/BluetoothManagerService;->access$4000(Lcom/android/server/BluetoothManagerService;)Z
 HSPLcom/android/server/BluetoothManagerService;->access$4002(Lcom/android/server/BluetoothManagerService;I)I
+PLcom/android/server/BluetoothManagerService;->access$4100(Lcom/android/server/BluetoothManagerService;)Landroid/bluetooth/IBluetoothCallback;
 HSPLcom/android/server/BluetoothManagerService;->access$4100(Lcom/android/server/BluetoothManagerService;)V
 HSPLcom/android/server/BluetoothManagerService;->access$4100(Lcom/android/server/BluetoothManagerService;II)V
 PLcom/android/server/BluetoothManagerService;->access$4200(Lcom/android/server/BluetoothManagerService;)I
+PLcom/android/server/BluetoothManagerService;->access$4200(Lcom/android/server/BluetoothManagerService;)V
 HSPLcom/android/server/BluetoothManagerService;->access$4202(Lcom/android/server/BluetoothManagerService;I)I
 PLcom/android/server/BluetoothManagerService;->access$4300(Lcom/android/server/BluetoothManagerService;)I
 HSPLcom/android/server/BluetoothManagerService;->access$4300(Lcom/android/server/BluetoothManagerService;II)V
+PLcom/android/server/BluetoothManagerService;->access$4300(Lcom/android/server/BluetoothManagerService;Ljava/util/Set;)Z
 PLcom/android/server/BluetoothManagerService;->access$4302(Lcom/android/server/BluetoothManagerService;I)I
 PLcom/android/server/BluetoothManagerService;->access$4308(Lcom/android/server/BluetoothManagerService;)I
 PLcom/android/server/BluetoothManagerService;->access$4400(Lcom/android/server/BluetoothManagerService;)V
+PLcom/android/server/BluetoothManagerService;->access$4400(Lcom/android/server/BluetoothManagerService;II)V
 PLcom/android/server/BluetoothManagerService;->access$4500(Lcom/android/server/BluetoothManagerService;)I
 PLcom/android/server/BluetoothManagerService;->access$4500(Lcom/android/server/BluetoothManagerService;)V
 PLcom/android/server/BluetoothManagerService;->access$4502(Lcom/android/server/BluetoothManagerService;I)I
 PLcom/android/server/BluetoothManagerService;->access$4508(Lcom/android/server/BluetoothManagerService;)I
+PLcom/android/server/BluetoothManagerService;->access$4600(Lcom/android/server/BluetoothManagerService;)I
 PLcom/android/server/BluetoothManagerService;->access$4600(Lcom/android/server/BluetoothManagerService;)V
+PLcom/android/server/BluetoothManagerService;->access$4602(Lcom/android/server/BluetoothManagerService;I)I
+PLcom/android/server/BluetoothManagerService;->access$4608(Lcom/android/server/BluetoothManagerService;)I
 PLcom/android/server/BluetoothManagerService;->access$4700(Lcom/android/server/BluetoothManagerService;)V
+PLcom/android/server/BluetoothManagerService;->access$4800(Lcom/android/server/BluetoothManagerService;)V
 PLcom/android/server/BluetoothManagerService;->access$4900(Lcom/android/server/BluetoothManagerService;)V
 PLcom/android/server/BluetoothManagerService;->access$500(Lcom/android/server/BluetoothManagerService;ILjava/lang/String;)V
 PLcom/android/server/BluetoothManagerService;->access$600(Lcom/android/server/BluetoothManagerService;)Z
@@ -1724,23 +1868,26 @@
 PLcom/android/server/BluetoothManagerService;->addCrashLog()V
 HSPLcom/android/server/BluetoothManagerService;->bindBluetoothProfileService(ILandroid/bluetooth/IBluetoothProfileServiceConnection;)Z
 HSPLcom/android/server/BluetoothManagerService;->bluetoothStateChangeHandler(II)V
+PLcom/android/server/BluetoothManagerService;->checkBluetoothPermissions(Ljava/lang/String;Z)Z
 HPLcom/android/server/BluetoothManagerService;->checkIfCallerIsForegroundUser()Z
 HPLcom/android/server/BluetoothManagerService;->checkPackage(ILjava/lang/String;)V
 PLcom/android/server/BluetoothManagerService;->clearBleApps()V
 PLcom/android/server/BluetoothManagerService;->continueFromBleOnState()V
 PLcom/android/server/BluetoothManagerService;->disable(Ljava/lang/String;Z)Z
+HPLcom/android/server/BluetoothManagerService;->disableBle(Ljava/lang/String;Landroid/os/IBinder;)Z
 PLcom/android/server/BluetoothManagerService;->disableBleScanMode()V
 HSPLcom/android/server/BluetoothManagerService;->doBind(Landroid/content/Intent;Landroid/content/ServiceConnection;ILandroid/os/UserHandle;)Z
 HPLcom/android/server/BluetoothManagerService;->dump(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V
 HPLcom/android/server/BluetoothManagerService;->dumpProto(Ljava/io/FileDescriptor;)V
 HPLcom/android/server/BluetoothManagerService;->enable(Ljava/lang/String;)Z
+HPLcom/android/server/BluetoothManagerService;->enableBle(Ljava/lang/String;Landroid/os/IBinder;)Z
 PLcom/android/server/BluetoothManagerService;->enableNoAutoConnect(Ljava/lang/String;)Z
 HPLcom/android/server/BluetoothManagerService;->getAddress()Ljava/lang/String;
 HPLcom/android/server/BluetoothManagerService;->getBluetoothGatt()Landroid/bluetooth/IBluetoothGatt;
 PLcom/android/server/BluetoothManagerService;->getEnableDisableReasonString(I)Ljava/lang/String;
 HPLcom/android/server/BluetoothManagerService;->getName()Ljava/lang/String;
 PLcom/android/server/BluetoothManagerService;->getServiceRestartMs()I
-PLcom/android/server/BluetoothManagerService;->getState()I
+HPLcom/android/server/BluetoothManagerService;->getState()I
 HSPLcom/android/server/BluetoothManagerService;->getSystemConfigEnabledProfilesForPackage(Ljava/lang/String;)Ljava/util/List;
 PLcom/android/server/BluetoothManagerService;->handleDisable()V
 HSPLcom/android/server/BluetoothManagerService;->handleEnable(Z)V
@@ -1754,7 +1901,7 @@
 HSPLcom/android/server/BluetoothManagerService;->isBluetoothPersistedStateOn()Z
 PLcom/android/server/BluetoothManagerService;->isBluetoothPersistedStateOnAirplane()Z
 HSPLcom/android/server/BluetoothManagerService;->isBluetoothPersistedStateOnBluetooth()Z
-PLcom/android/server/BluetoothManagerService;->isEnabled()Z
+HPLcom/android/server/BluetoothManagerService;->isEnabled()Z
 HSPLcom/android/server/BluetoothManagerService;->isHearingAidProfileSupported()Z
 HSPLcom/android/server/BluetoothManagerService;->isNameAndAddressSet()Z
 HSPLcom/android/server/BluetoothManagerService;->loadStoredNameAndAddress()V
@@ -1780,7 +1927,7 @@
 HPLcom/android/server/BluetoothManagerService;->updateBleAppCount(Landroid/os/IBinder;ZLjava/lang/String;)I
 PLcom/android/server/BluetoothManagerService;->updateOppLauncherComponentState(IZ)V
 HPLcom/android/server/BluetoothManagerService;->waitForOnOff(ZZ)Z
-PLcom/android/server/BluetoothManagerService;->waitForState(Ljava/util/Set;)Z
+HPLcom/android/server/BluetoothManagerService;->waitForState(Ljava/util/Set;)Z
 HSPLcom/android/server/BluetoothService;-><init>(Landroid/content/Context;)V
 HSPLcom/android/server/BluetoothService;->initialize()V
 HSPLcom/android/server/BluetoothService;->onBootPhase(I)V
@@ -1842,6 +1989,8 @@
 PLcom/android/server/ConnectivityService$ConnectivityReportEvent;->access$8200(Lcom/android/server/ConnectivityService$ConnectivityReportEvent;)J
 HPLcom/android/server/ConnectivityService$ConnectivityReportEvent;->access$8300(Lcom/android/server/ConnectivityService$ConnectivityReportEvent;)Lcom/android/server/connectivity/NetworkAgentInfo;
 HPLcom/android/server/ConnectivityService$ConnectivityReportEvent;->access$8400(Lcom/android/server/ConnectivityService$ConnectivityReportEvent;)J
+HPLcom/android/server/ConnectivityService$ConnectivityReportEvent;->access$8400(Lcom/android/server/ConnectivityService$ConnectivityReportEvent;)Lcom/android/server/connectivity/NetworkAgentInfo;
+HPLcom/android/server/ConnectivityService$ConnectivityReportEvent;->access$8500(Lcom/android/server/ConnectivityService$ConnectivityReportEvent;)J
 HSPLcom/android/server/ConnectivityService$Dependencies;-><init>()V
 PLcom/android/server/ConnectivityService$Dependencies;->getBatteryStatsService()Lcom/android/internal/app/IBatteryStats;
 HSPLcom/android/server/ConnectivityService$Dependencies;->getIpConnectivityMetrics()Landroid/net/IIpConnectivityMetrics;
@@ -1948,6 +2097,7 @@
 HPLcom/android/server/ConnectivityService;->access$1600(Lcom/android/server/ConnectivityService;Lcom/android/server/connectivity/NetworkAgentInfo;Landroid/net/NetworkInfo;)V
 HPLcom/android/server/ConnectivityService;->access$1600(Lcom/android/server/ConnectivityService;Lcom/android/server/connectivity/NetworkAgentInfo;Landroid/net/NetworkScore;)V
 HPLcom/android/server/ConnectivityService;->access$1700(I)Z
+HPLcom/android/server/ConnectivityService;->access$1700(Lcom/android/server/ConnectivityService;Lcom/android/server/connectivity/NetworkAgentInfo;I)V
 PLcom/android/server/ConnectivityService;->access$1700(Lcom/android/server/ConnectivityService;Lcom/android/server/connectivity/NetworkAgentInfo;Landroid/net/NetworkScore;)V
 HPLcom/android/server/ConnectivityService;->access$1800(I)Z
 PLcom/android/server/ConnectivityService;->access$1800(Lcom/android/server/ConnectivityService;)Lcom/android/server/connectivity/KeepaliveTracker;
@@ -1990,17 +2140,21 @@
 PLcom/android/server/ConnectivityService;->access$3300(Lcom/android/server/ConnectivityService;Lcom/android/server/connectivity/NetworkAgentInfo;)V
 PLcom/android/server/ConnectivityService;->access$3400(Lcom/android/server/ConnectivityService;)Lcom/android/server/ConnectivityService$NetworkStateTrackerHandler;
 PLcom/android/server/ConnectivityService;->access$3400(Lcom/android/server/ConnectivityService;)V
+PLcom/android/server/ConnectivityService;->access$3400(Lcom/android/server/ConnectivityService;Landroid/net/Network;)V
 PLcom/android/server/ConnectivityService;->access$3400(Lcom/android/server/ConnectivityService;Lcom/android/server/connectivity/NetworkAgentInfo;)V
 PLcom/android/server/ConnectivityService;->access$3500(Lcom/android/server/ConnectivityService;)Landroid/content/Context;
 PLcom/android/server/ConnectivityService;->access$3500(Lcom/android/server/ConnectivityService;)V
 PLcom/android/server/ConnectivityService;->access$3500(Lcom/android/server/ConnectivityService;I)V
+PLcom/android/server/ConnectivityService;->access$3600(Lcom/android/server/ConnectivityService;)Landroid/content/Context;
 PLcom/android/server/ConnectivityService;->access$3600(Lcom/android/server/ConnectivityService;I)V
 PLcom/android/server/ConnectivityService;->access$3600(Lcom/android/server/ConnectivityService;Lcom/android/server/connectivity/NetworkAgentInfo;I)Z
 HSPLcom/android/server/ConnectivityService;->access$3700(Lcom/android/server/ConnectivityService;Lcom/android/server/ConnectivityService$NetworkProviderInfo;)V
 PLcom/android/server/ConnectivityService;->access$3700(Lcom/android/server/ConnectivityService;Lcom/android/server/connectivity/NetworkAgentInfo;)V
+PLcom/android/server/ConnectivityService;->access$3700(Lcom/android/server/ConnectivityService;Lcom/android/server/connectivity/NetworkAgentInfo;I)Z
 PLcom/android/server/ConnectivityService;->access$3800(Lcom/android/server/ConnectivityService;Landroid/os/Messenger;)V
 HSPLcom/android/server/ConnectivityService;->access$3800(Lcom/android/server/ConnectivityService;Lcom/android/server/ConnectivityService$NetworkFactoryInfo;)V
 HSPLcom/android/server/ConnectivityService;->access$3800(Lcom/android/server/ConnectivityService;Lcom/android/server/ConnectivityService$NetworkProviderInfo;)V
+PLcom/android/server/ConnectivityService;->access$3800(Lcom/android/server/ConnectivityService;Lcom/android/server/connectivity/NetworkAgentInfo;)V
 PLcom/android/server/ConnectivityService;->access$3900(Lcom/android/server/ConnectivityService;)Lcom/android/server/ConnectivityService$NetworkStateTrackerHandler;
 PLcom/android/server/ConnectivityService;->access$3900(Lcom/android/server/ConnectivityService;Landroid/os/Messenger;)V
 HSPLcom/android/server/ConnectivityService;->access$3900(Lcom/android/server/ConnectivityService;Lcom/android/server/ConnectivityService$NetworkFactoryInfo;)V
@@ -2017,6 +2171,7 @@
 HSPLcom/android/server/ConnectivityService;->access$4200(Lcom/android/server/ConnectivityService;Lcom/android/server/ConnectivityService$NetworkRequestInfo;)V
 PLcom/android/server/ConnectivityService;->access$4300(Lcom/android/server/ConnectivityService;Landroid/app/PendingIntent;I)V
 PLcom/android/server/ConnectivityService;->access$4300(Lcom/android/server/ConnectivityService;Lcom/android/server/ConnectivityService$NetworkRequestInfo;)V
+PLcom/android/server/ConnectivityService;->access$4400(Lcom/android/server/ConnectivityService;I)V
 PLcom/android/server/ConnectivityService;->access$4400(Lcom/android/server/ConnectivityService;Landroid/app/PendingIntent;I)V
 HPLcom/android/server/ConnectivityService;->access$4400(Lcom/android/server/ConnectivityService;Landroid/net/NetworkRequest;IZ)V
 HSPLcom/android/server/ConnectivityService;->access$4400(Lcom/android/server/ConnectivityService;Lcom/android/server/ConnectivityService$NetworkProviderInfo;)V
@@ -2048,6 +2203,7 @@
 HSPLcom/android/server/ConnectivityService;->access$5700(Lcom/android/server/ConnectivityService;)V
 PLcom/android/server/ConnectivityService;->access$5700(Lcom/android/server/ConnectivityService;I)V
 PLcom/android/server/ConnectivityService;->access$5800(Lcom/android/server/ConnectivityService;I)V
+PLcom/android/server/ConnectivityService;->access$5800(Lcom/android/server/ConnectivityService;Landroid/net/Network;IZ)V
 PLcom/android/server/ConnectivityService;->access$5800(Lcom/android/server/ConnectivityService;Lcom/android/server/connectivity/DnsManager$PrivateDnsValidationUpdate;)V
 PLcom/android/server/ConnectivityService;->access$5800(Lcom/android/server/ConnectivityService;Ljava/lang/String;I)V
 HSPLcom/android/server/ConnectivityService;->access$5900(Lcom/android/server/ConnectivityService;)V
@@ -2068,10 +2224,12 @@
 HSPLcom/android/server/ConnectivityService;->access$6300(Lcom/android/server/ConnectivityService;)Landroid/util/SparseIntArray;
 PLcom/android/server/ConnectivityService;->access$6400(Lcom/android/server/ConnectivityService;I)V
 PLcom/android/server/ConnectivityService;->access$6500(Lcom/android/server/ConnectivityService;Ljava/lang/String;I)V
+PLcom/android/server/ConnectivityService;->access$6600(Lcom/android/server/ConnectivityService;I)V
 PLcom/android/server/ConnectivityService;->access$6600(Lcom/android/server/ConnectivityService;Ljava/lang/String;I)V
 PLcom/android/server/ConnectivityService;->access$6700(Lcom/android/server/ConnectivityService;Ljava/lang/String;I)V
 PLcom/android/server/ConnectivityService;->access$6700(Lcom/android/server/ConnectivityService;Ljava/lang/String;IZ)V
 HSPLcom/android/server/ConnectivityService;->access$6800(Lcom/android/server/ConnectivityService;Landroid/net/NetworkRequest;)V
+PLcom/android/server/ConnectivityService;->access$6800(Lcom/android/server/ConnectivityService;Ljava/lang/String;I)V
 HSPLcom/android/server/ConnectivityService;->access$6900(Lcom/android/server/ConnectivityService;)Landroid/util/SparseIntArray;
 PLcom/android/server/ConnectivityService;->access$6900(Lcom/android/server/ConnectivityService;Ljava/lang/String;IZ)V
 HPLcom/android/server/ConnectivityService;->access$700(Lcom/android/server/ConnectivityService;)Landroid/net/NetworkRequest;
@@ -2082,8 +2240,10 @@
 PLcom/android/server/ConnectivityService;->access$7700(Lcom/android/server/ConnectivityService;Lcom/android/server/connectivity/NetworkAgentInfo;JILandroid/os/PersistableBundle;)V
 PLcom/android/server/ConnectivityService;->access$7800(Lcom/android/server/ConnectivityService;Lcom/android/server/ConnectivityService$ConnectivityReportEvent;Landroid/os/PersistableBundle;)V
 HPLcom/android/server/ConnectivityService;->access$7800(Lcom/android/server/ConnectivityService;Lcom/android/server/connectivity/NetworkAgentInfo;Z)V
+PLcom/android/server/ConnectivityService;->access$7900(Lcom/android/server/ConnectivityService;Lcom/android/server/connectivity/NetworkAgentInfo;JILandroid/os/PersistableBundle;)V
 PLcom/android/server/ConnectivityService;->access$800(Lcom/android/server/ConnectivityService;IZLjava/lang/String;I)V
 HPLcom/android/server/ConnectivityService;->access$800(Lcom/android/server/ConnectivityService;Landroid/os/Message;)V
+HPLcom/android/server/ConnectivityService;->access$8000(Lcom/android/server/ConnectivityService;Lcom/android/server/connectivity/NetworkAgentInfo;Z)V
 HPLcom/android/server/ConnectivityService;->access$900(Lcom/android/server/ConnectivityService;)Ljava/util/HashMap;
 HSPLcom/android/server/ConnectivityService;->access$900(Lcom/android/server/ConnectivityService;Landroid/os/Message;)V
 HPLcom/android/server/ConnectivityService;->addLegacyRouteToHost(Landroid/net/LinkProperties;Ljava/net/InetAddress;II)Z
@@ -2098,10 +2258,12 @@
 HPLcom/android/server/ConnectivityService;->checkNetworkStackPermission()Z
 HSPLcom/android/server/ConnectivityService;->checkSettingsPermission()Z
 HPLcom/android/server/ConnectivityService;->checkSettingsPermission(II)Z
+HPLcom/android/server/ConnectivityService;->clearNetworkCapabilitiesUids(Landroid/net/NetworkCapabilities;)V
 HSPLcom/android/server/ConnectivityService;->computeInitialReassignment()Lcom/android/server/ConnectivityService$NetworkReassignment;
 HSPLcom/android/server/ConnectivityService;->computeNetworkReassignment()Lcom/android/server/ConnectivityService$NetworkReassignment;
 HPLcom/android/server/ConnectivityService;->computeRequestReassignmentForNetwork(Lcom/android/server/ConnectivityService$NetworkReassignment;Lcom/android/server/connectivity/NetworkAgentInfo;)Landroid/util/ArrayMap;
 HPLcom/android/server/ConnectivityService;->computeRequestReassignmentForNetwork(Lcom/android/server/connectivity/NetworkAgentInfo;)Landroid/util/ArrayMap;
+HPLcom/android/server/ConnectivityService;->convertRouteInfo(Landroid/net/RouteInfo;)Landroid/net/RouteInfoParcel;
 HSPLcom/android/server/ConnectivityService;->createDefaultInternetRequestForTransport(ILandroid/net/NetworkRequest$Type;)Landroid/net/NetworkRequest;
 HSPLcom/android/server/ConnectivityService;->createDefaultNetworkCapabilitiesForUid(I)Landroid/net/NetworkCapabilities;
 HPLcom/android/server/ConnectivityService;->createNativeNetwork(Lcom/android/server/connectivity/NetworkAgentInfo;)Z
@@ -2176,6 +2338,7 @@
 HSPLcom/android/server/ConnectivityService;->getNetworkCapabilities(Landroid/net/Network;Ljava/lang/String;)Landroid/net/NetworkCapabilities;
 HSPLcom/android/server/ConnectivityService;->getNetworkCapabilitiesInternal(Landroid/net/Network;)Landroid/net/NetworkCapabilities;
 HSPLcom/android/server/ConnectivityService;->getNetworkCapabilitiesInternal(Lcom/android/server/connectivity/NetworkAgentInfo;)Landroid/net/NetworkCapabilities;
+PLcom/android/server/ConnectivityService;->getNetworkCapabilitiesWithoutUids(Landroid/net/NetworkCapabilities;)Landroid/net/NetworkCapabilities;
 HPLcom/android/server/ConnectivityService;->getNetworkInfo(I)Landroid/net/NetworkInfo;
 HSPLcom/android/server/ConnectivityService;->getNetworkInfoForUid(Landroid/net/Network;IZ)Landroid/net/NetworkInfo;
 HPLcom/android/server/ConnectivityService;->getNetworkPermission(Landroid/net/NetworkCapabilities;)I
@@ -2245,10 +2408,13 @@
 PLcom/android/server/ConnectivityService;->lambda$requestsSortedById$3(Lcom/android/server/ConnectivityService$NetworkRequestInfo;)I
 HPLcom/android/server/ConnectivityService;->lambda$setUnderlyingNetworksForVpn$7$ConnectivityService()V
 PLcom/android/server/ConnectivityService;->lambda$setUnderlyingNetworksForVpn$8$ConnectivityService()V
+PLcom/android/server/ConnectivityService;->lambda$setUnderlyingNetworksForVpn$9$ConnectivityService()V
 PLcom/android/server/ConnectivityService;->lambda$startCaptivePortalApp$3$ConnectivityService(Landroid/net/Network;)V
 PLcom/android/server/ConnectivityService;->lambda$startCaptivePortalApp$4$ConnectivityService(Landroid/net/Network;)V
 PLcom/android/server/ConnectivityService;->lambda$startCaptivePortalAppInternal$4$ConnectivityService(Landroid/content/Intent;)V
 PLcom/android/server/ConnectivityService;->lambda$startCaptivePortalAppInternal$5$ConnectivityService(Landroid/content/Intent;)V
+HPLcom/android/server/ConnectivityService;->lambda$updateRoutes$8(Landroid/net/RouteInfo;)Landroid/net/IpPrefix;
+PLcom/android/server/ConnectivityService;->lambda$updateRoutes$8(Landroid/net/RouteInfo;)Landroid/net/RouteInfo$RouteKey;
 HPLcom/android/server/ConnectivityService;->linkPropertiesRestrictedForCallerPermissions(Landroid/net/LinkProperties;II)Landroid/net/LinkProperties;
 HSPLcom/android/server/ConnectivityService;->listenForNetwork(Landroid/net/NetworkCapabilities;Landroid/os/Messenger;Landroid/os/IBinder;)Landroid/net/NetworkRequest;
 HSPLcom/android/server/ConnectivityService;->listenForNetwork(Landroid/net/NetworkCapabilities;Landroid/os/Messenger;Landroid/os/IBinder;Ljava/lang/String;)Landroid/net/NetworkRequest;
@@ -2375,7 +2541,7 @@
 HPLcom/android/server/ConnectivityService;->updateMtu(Landroid/net/LinkProperties;Landroid/net/LinkProperties;)V
 HPLcom/android/server/ConnectivityService;->updateNetworkInfo(Lcom/android/server/connectivity/NetworkAgentInfo;Landroid/net/NetworkInfo;)V
 HPLcom/android/server/ConnectivityService;->updateNetworkPermissions(Lcom/android/server/connectivity/NetworkAgentInfo;Landroid/net/NetworkCapabilities;)V
-PLcom/android/server/ConnectivityService;->updateNetworkScore(Lcom/android/server/connectivity/NetworkAgentInfo;I)V
+HPLcom/android/server/ConnectivityService;->updateNetworkScore(Lcom/android/server/connectivity/NetworkAgentInfo;I)V
 HPLcom/android/server/ConnectivityService;->updateNetworkScore(Lcom/android/server/connectivity/NetworkAgentInfo;Landroid/net/NetworkScore;)V
 PLcom/android/server/ConnectivityService;->updatePrivateDns(Lcom/android/server/connectivity/NetworkAgentInfo;Landroid/net/shared/PrivateDnsConfig;)V
 HPLcom/android/server/ConnectivityService;->updateProxy(Landroid/net/LinkProperties;Landroid/net/LinkProperties;)V
@@ -2558,8 +2724,11 @@
 HPLcom/android/server/EventLogTags;->writeVolumeChanged(IIIILjava/lang/String;)V
 HSPLcom/android/server/ExplicitHealthCheckController$1;-><init>(Lcom/android/server/ExplicitHealthCheckController;)V
 HSPLcom/android/server/ExplicitHealthCheckController$1;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
+PLcom/android/server/ExplicitHealthCheckController$1;->onServiceDisconnected(Landroid/content/ComponentName;)V
 HSPLcom/android/server/ExplicitHealthCheckController;-><init>(Landroid/content/Context;)V
 HSPLcom/android/server/ExplicitHealthCheckController;->access$000(Lcom/android/server/ExplicitHealthCheckController;Landroid/os/IBinder;)V
+PLcom/android/server/ExplicitHealthCheckController;->access$100(Lcom/android/server/ExplicitHealthCheckController;)Ljava/lang/Object;
+PLcom/android/server/ExplicitHealthCheckController;->access$202(Lcom/android/server/ExplicitHealthCheckController;Landroid/service/watchdog/IExplicitHealthCheckService;)Landroid/service/watchdog/IExplicitHealthCheckService;
 HSPLcom/android/server/ExplicitHealthCheckController;->actOnDifference(Ljava/util/Collection;Ljava/util/Collection;Ljava/util/function/Consumer;)V
 HSPLcom/android/server/ExplicitHealthCheckController;->bindService()V
 PLcom/android/server/ExplicitHealthCheckController;->cancel(Ljava/lang/String;)V
@@ -2668,6 +2837,8 @@
 PLcom/android/server/GraphicsStatsService;->onAlarm()V
 HPLcom/android/server/GraphicsStatsService;->pathForApp(Lcom/android/server/GraphicsStatsService$BufferInfo;)Ljava/io/File;
 HPLcom/android/server/GraphicsStatsService;->processDied(Lcom/android/server/GraphicsStatsService$ActiveBuffer;)V
+PLcom/android/server/GraphicsStatsService;->pullGraphicsStats(Z)J
+HPLcom/android/server/GraphicsStatsService;->pullGraphicsStatsImpl(Z)J
 HSPLcom/android/server/GraphicsStatsService;->requestBufferForProcess(Ljava/lang/String;Landroid/view/IGraphicsStatsCallback;)Landroid/os/ParcelFileDescriptor;
 HSPLcom/android/server/GraphicsStatsService;->requestBufferForProcessLocked(Landroid/view/IGraphicsStatsCallback;IILjava/lang/String;J)Landroid/os/ParcelFileDescriptor;
 HPLcom/android/server/GraphicsStatsService;->saveBuffer(Lcom/android/server/GraphicsStatsService$HistoricalBuffer;)V
@@ -2744,10 +2915,14 @@
 PLcom/android/server/IpSecService$UserResourceTracker;->toString()Ljava/lang/String;
 HSPLcom/android/server/IpSecService;-><clinit>()V
 HSPLcom/android/server/IpSecService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/IpSecService;-><init>(Landroid/content/Context;Landroid/os/INetworkManagementService;)V
+PLcom/android/server/IpSecService;-><init>(Landroid/content/Context;Landroid/os/INetworkManagementService;Lcom/android/server/IpSecService$IpSecServiceConfiguration;)V
+PLcom/android/server/IpSecService;-><init>(Landroid/content/Context;Landroid/os/INetworkManagementService;Lcom/android/server/IpSecService$IpSecServiceConfiguration;Lcom/android/server/IpSecService$UidFdTagger;)V
 HSPLcom/android/server/IpSecService;-><init>(Landroid/content/Context;Lcom/android/server/IpSecService$IpSecServiceConfiguration;)V
 HSPLcom/android/server/IpSecService;-><init>(Landroid/content/Context;Lcom/android/server/IpSecService$IpSecServiceConfiguration;Lcom/android/server/IpSecService$UidFdTagger;)V
 HSPLcom/android/server/IpSecService;->connectNativeNetdService()V
 HSPLcom/android/server/IpSecService;->create(Landroid/content/Context;)Lcom/android/server/IpSecService;
+PLcom/android/server/IpSecService;->create(Landroid/content/Context;Landroid/os/INetworkManagementService;)Lcom/android/server/IpSecService;
 PLcom/android/server/IpSecService;->dump(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V
 HSPLcom/android/server/IpSecService;->isNetdAlive()Z
 HSPLcom/android/server/IpSecService;->systemReady()V
@@ -2755,8 +2930,10 @@
 HSPLcom/android/server/LocationManagerService$1;->lambda$onOpChanged$0$LocationManagerService$1()V
 HSPLcom/android/server/LocationManagerService$1;->lambda$onOpChanged$0$LocationManagerService$1(Ljava/lang/String;)V
 HSPLcom/android/server/LocationManagerService$1;->onOpChanged(ILjava/lang/String;)V
+PLcom/android/server/LocationManagerService$1;->onPackageDisappeared(Ljava/lang/String;I)V
 HSPLcom/android/server/LocationManagerService$2;-><init>(Lcom/android/server/LocationManagerService;)V
 HSPLcom/android/server/LocationManagerService$2;->onPackageDisappeared(Ljava/lang/String;I)V
+HPLcom/android/server/LocationManagerService$2;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
 HSPLcom/android/server/LocationManagerService$3;-><init>(Lcom/android/server/LocationManagerService;)V
 HPLcom/android/server/LocationManagerService$3;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
 HSPLcom/android/server/LocationManagerService$Lifecycle;-><init>(Landroid/content/Context;)V
@@ -2773,6 +2950,7 @@
 PLcom/android/server/LocationManagerService$LocationProviderManager;->dumpLocked(Ljava/io/FileDescriptor;Lcom/android/internal/util/IndentingPrintWriter;[Ljava/lang/String;)V
 PLcom/android/server/LocationManagerService$LocationProviderManager;->getLastCoarseLocation(I)Landroid/location/Location;
 HPLcom/android/server/LocationManagerService$LocationProviderManager;->getLastFineLocation(I)Landroid/location/Location;
+HPLcom/android/server/LocationManagerService$LocationProviderManager;->getLastLocation(II)Landroid/location/Location;
 HSPLcom/android/server/LocationManagerService$LocationProviderManager;->getName()Ljava/lang/String;
 HPLcom/android/server/LocationManagerService$LocationProviderManager;->getPackages()Ljava/util/Set;
 PLcom/android/server/LocationManagerService$LocationProviderManager;->getProperties()Lcom/android/internal/location/ProviderProperties;
@@ -2805,6 +2983,10 @@
 HPLcom/android/server/LocationManagerService$PassiveLocationProviderManager;->updateLocation(Landroid/location/Location;)V
 HSPLcom/android/server/LocationManagerService$Receiver;-><init>(Lcom/android/server/LocationManagerService;Landroid/location/ILocationListener;Landroid/app/PendingIntent;IILjava/lang/String;Ljava/lang/String;Landroid/os/WorkSource;ZLjava/lang/String;)V
 HSPLcom/android/server/LocationManagerService$Receiver;-><init>(Lcom/android/server/LocationManagerService;Landroid/location/ILocationListener;Landroid/app/PendingIntent;IILjava/lang/String;Ljava/lang/String;Landroid/os/WorkSource;ZLjava/lang/String;Lcom/android/server/LocationManagerService$1;)V
+HPLcom/android/server/LocationManagerService$Receiver;-><init>(Lcom/android/server/LocationManagerService;Landroid/location/ILocationListener;Landroid/app/PendingIntent;Lcom/android/server/location/CallerIdentity;Landroid/os/WorkSource;Z)V
+PLcom/android/server/LocationManagerService$Receiver;-><init>(Lcom/android/server/LocationManagerService;Landroid/location/ILocationListener;Landroid/app/PendingIntent;Lcom/android/server/location/CallerIdentity;Landroid/os/WorkSource;ZLcom/android/server/LocationManagerService$1;)V
+PLcom/android/server/LocationManagerService$Receiver;->access$2400(Lcom/android/server/LocationManagerService$Receiver;)V
+PLcom/android/server/LocationManagerService$Receiver;->access$2500(Lcom/android/server/LocationManagerService$Receiver;Ljava/lang/String;Z)Z
 HSPLcom/android/server/LocationManagerService$Receiver;->access$2700(Lcom/android/server/LocationManagerService$Receiver;)V
 HSPLcom/android/server/LocationManagerService$Receiver;->access$2800(Lcom/android/server/LocationManagerService$Receiver;)V
 HSPLcom/android/server/LocationManagerService$Receiver;->access$2800(Lcom/android/server/LocationManagerService$Receiver;Ljava/lang/String;Z)Z
@@ -2816,6 +2998,7 @@
 HSPLcom/android/server/LocationManagerService$Receiver;->access$3100(Lcom/android/server/LocationManagerService$Receiver;)I
 PLcom/android/server/LocationManagerService$Receiver;->access$3200(Lcom/android/server/LocationManagerService$Receiver;Ljava/lang/String;Z)Z
 HSPLcom/android/server/LocationManagerService$Receiver;->access$3300(Lcom/android/server/LocationManagerService$Receiver;)I
+PLcom/android/server/LocationManagerService$Receiver;->access$3400(Lcom/android/server/LocationManagerService$Receiver;)Ljava/lang/Object;
 PLcom/android/server/LocationManagerService$Receiver;->access$3800(Lcom/android/server/LocationManagerService$Receiver;)Ljava/lang/Object;
 PLcom/android/server/LocationManagerService$Receiver;->access$3900(Lcom/android/server/LocationManagerService$Receiver;)Ljava/lang/Object;
 PLcom/android/server/LocationManagerService$Receiver;->access$4000(Lcom/android/server/LocationManagerService$Receiver;)Ljava/lang/Object;
@@ -2834,6 +3017,7 @@
 HPLcom/android/server/LocationManagerService$Receiver;->toString()Ljava/lang/String;
 HSPLcom/android/server/LocationManagerService$Receiver;->updateMonitoring(Z)V
 HPLcom/android/server/LocationManagerService$Receiver;->updateMonitoring(ZZI)Z
+HPLcom/android/server/LocationManagerService$Receiver;->updateMonitoring(ZZZ)Z
 HSPLcom/android/server/LocationManagerService$UpdateRecord;-><init>(Lcom/android/server/LocationManagerService;Ljava/lang/String;Landroid/location/LocationRequest;Lcom/android/server/LocationManagerService$Receiver;)V
 HSPLcom/android/server/LocationManagerService$UpdateRecord;-><init>(Lcom/android/server/LocationManagerService;Ljava/lang/String;Landroid/location/LocationRequest;Lcom/android/server/LocationManagerService$Receiver;Lcom/android/server/LocationManagerService$1;)V
 HSPLcom/android/server/LocationManagerService$UpdateRecord;->access$1000(Lcom/android/server/LocationManagerService$UpdateRecord;)Lcom/android/server/LocationManagerService$Receiver;
@@ -2844,10 +3028,15 @@
 PLcom/android/server/LocationManagerService$UpdateRecord;->access$1200(Lcom/android/server/LocationManagerService$UpdateRecord;)Z
 PLcom/android/server/LocationManagerService$UpdateRecord;->access$1200(Lcom/android/server/LocationManagerService$UpdateRecord;Z)V
 PLcom/android/server/LocationManagerService$UpdateRecord;->access$1300(Lcom/android/server/LocationManagerService$UpdateRecord;Z)V
+PLcom/android/server/LocationManagerService$UpdateRecord;->access$2600(Lcom/android/server/LocationManagerService$UpdateRecord;)Landroid/location/LocationRequest;
 HSPLcom/android/server/LocationManagerService$UpdateRecord;->access$3000(Lcom/android/server/LocationManagerService$UpdateRecord;)Landroid/location/LocationRequest;
 HSPLcom/android/server/LocationManagerService$UpdateRecord;->access$3100(Lcom/android/server/LocationManagerService$UpdateRecord;)Landroid/location/LocationRequest;
 HSPLcom/android/server/LocationManagerService$UpdateRecord;->access$3200(Lcom/android/server/LocationManagerService$UpdateRecord;)Landroid/location/LocationRequest;
+PLcom/android/server/LocationManagerService$UpdateRecord;->access$3300(Lcom/android/server/LocationManagerService$UpdateRecord;Z)V
 HSPLcom/android/server/LocationManagerService$UpdateRecord;->access$3400(Lcom/android/server/LocationManagerService$UpdateRecord;)Landroid/location/LocationRequest;
+PLcom/android/server/LocationManagerService$UpdateRecord;->access$3500(Lcom/android/server/LocationManagerService$UpdateRecord;)J
+PLcom/android/server/LocationManagerService$UpdateRecord;->access$3600(Lcom/android/server/LocationManagerService$UpdateRecord;)Landroid/location/Location;
+PLcom/android/server/LocationManagerService$UpdateRecord;->access$3602(Lcom/android/server/LocationManagerService$UpdateRecord;Landroid/location/Location;)Landroid/location/Location;
 PLcom/android/server/LocationManagerService$UpdateRecord;->access$3700(Lcom/android/server/LocationManagerService$UpdateRecord;Z)V
 PLcom/android/server/LocationManagerService$UpdateRecord;->access$3800(Lcom/android/server/LocationManagerService$UpdateRecord;Z)V
 PLcom/android/server/LocationManagerService$UpdateRecord;->access$3900(Lcom/android/server/LocationManagerService$UpdateRecord;)J
@@ -2874,15 +3063,19 @@
 HSPLcom/android/server/LocationManagerService;-><init>(Landroid/content/Context;Lcom/android/server/LocationManagerService$1;)V
 PLcom/android/server/LocationManagerService;->access$100(Lcom/android/server/LocationManagerService;)Landroid/content/Context;
 HSPLcom/android/server/LocationManagerService;->access$100(Lcom/android/server/LocationManagerService;)V
+PLcom/android/server/LocationManagerService;->access$1000(Lcom/android/server/LocationManagerService;)V
 HSPLcom/android/server/LocationManagerService;->access$1300(Lcom/android/server/LocationManagerService;)Landroid/content/Context;
+PLcom/android/server/LocationManagerService;->access$1300(Lcom/android/server/LocationManagerService;)Lcom/android/server/location/SettingsHelper;
 HSPLcom/android/server/LocationManagerService;->access$1400(Lcom/android/server/LocationManagerService;)Landroid/content/Context;
 PLcom/android/server/LocationManagerService;->access$1400(Lcom/android/server/LocationManagerService;)Lcom/android/server/location/LocationFudger;
 HSPLcom/android/server/LocationManagerService;->access$1400(Lcom/android/server/LocationManagerService;)Lcom/android/server/location/SettingsHelper;
+PLcom/android/server/LocationManagerService;->access$1400(Lcom/android/server/LocationManagerService;)Lcom/android/server/location/UserInfoHelper;
 HPLcom/android/server/LocationManagerService;->access$1400(Lcom/android/server/LocationManagerService;Landroid/location/Location;Lcom/android/server/LocationManagerService$LocationProviderManager;)V
 HSPLcom/android/server/LocationManagerService;->access$1500(Lcom/android/server/LocationManagerService;)I
 PLcom/android/server/LocationManagerService;->access$1500(Lcom/android/server/LocationManagerService;)Lcom/android/server/location/SettingsHelper;
 HSPLcom/android/server/LocationManagerService;->access$1500(Lcom/android/server/LocationManagerService;)Lcom/android/server/location/UserInfoHelper;
 HPLcom/android/server/LocationManagerService;->access$1500(Lcom/android/server/LocationManagerService;Landroid/location/Location;Lcom/android/server/LocationManagerService$LocationProviderManager;)V
+PLcom/android/server/LocationManagerService;->access$1500(Lcom/android/server/LocationManagerService;Lcom/android/server/LocationManagerService$LocationProviderManager;Landroid/location/Location;Landroid/location/Location;)V
 PLcom/android/server/LocationManagerService;->access$1600(Lcom/android/server/LocationManagerService;)Lcom/android/server/location/PassiveProvider;
 HSPLcom/android/server/LocationManagerService;->access$1600(Lcom/android/server/LocationManagerService;)Lcom/android/server/location/UserInfoHelper;
 HSPLcom/android/server/LocationManagerService;->access$1600(Lcom/android/server/LocationManagerService;)Lcom/android/server/location/UserInfoStore;
@@ -2892,21 +3085,25 @@
 HSPLcom/android/server/LocationManagerService;->access$1700(Lcom/android/server/LocationManagerService;)Lcom/android/server/location/UserInfoStore;
 HPLcom/android/server/LocationManagerService;->access$1700(Lcom/android/server/LocationManagerService;Landroid/location/Location;Lcom/android/server/LocationManagerService$LocationProviderManager;)V
 PLcom/android/server/LocationManagerService;->access$1700(Lcom/android/server/LocationManagerService;Lcom/android/server/LocationManagerService$LocationProviderManager;Landroid/location/Location;Landroid/location/Location;)V
+PLcom/android/server/LocationManagerService;->access$1700(Lcom/android/server/LocationManagerService;Lcom/android/server/LocationManagerService$LocationProviderManager;Z)V
 HSPLcom/android/server/LocationManagerService;->access$1800(Lcom/android/server/LocationManagerService;)Landroid/content/Context;
+PLcom/android/server/LocationManagerService;->access$1800(Lcom/android/server/LocationManagerService;)Landroid/os/PowerManager;
 HSPLcom/android/server/LocationManagerService;->access$1800(Lcom/android/server/LocationManagerService;)Lcom/android/server/location/LocationSettingsStore;
 HSPLcom/android/server/LocationManagerService;->access$1800(Lcom/android/server/LocationManagerService;)Lcom/android/server/location/SettingsHelper;
 PLcom/android/server/LocationManagerService;->access$1800(Lcom/android/server/LocationManagerService;)Ljava/util/HashMap;
 PLcom/android/server/LocationManagerService;->access$1900(Lcom/android/server/LocationManagerService;)Landroid/content/Context;
 PLcom/android/server/LocationManagerService;->access$1900(Lcom/android/server/LocationManagerService;)Ljava/util/HashMap;
 HSPLcom/android/server/LocationManagerService;->access$1900(Lcom/android/server/LocationManagerService;Lcom/android/server/LocationManagerService$LocationProviderManager;Z)V
-PLcom/android/server/LocationManagerService;->access$1900(Lcom/android/server/LocationManagerService;Ljava/lang/String;)Lcom/android/server/LocationManagerService$LocationProviderManager;
+HPLcom/android/server/LocationManagerService;->access$1900(Lcom/android/server/LocationManagerService;Ljava/lang/String;)Lcom/android/server/LocationManagerService$LocationProviderManager;
 HSPLcom/android/server/LocationManagerService;->access$200(Lcom/android/server/LocationManagerService;)V
 HSPLcom/android/server/LocationManagerService;->access$2000(Lcom/android/server/LocationManagerService;)Ljava/util/ArrayList;
 PLcom/android/server/LocationManagerService;->access$2000(Lcom/android/server/LocationManagerService;)Ljava/util/HashMap;
 HSPLcom/android/server/LocationManagerService;->access$2000(Lcom/android/server/LocationManagerService;II)I
 HSPLcom/android/server/LocationManagerService;->access$2000(Lcom/android/server/LocationManagerService;Lcom/android/server/LocationManagerService$LocationProviderManager;)V
 HSPLcom/android/server/LocationManagerService;->access$2000(Lcom/android/server/LocationManagerService;Lcom/android/server/LocationManagerService$LocationProviderManager;Z)V
+PLcom/android/server/LocationManagerService;->access$2000(Lcom/android/server/LocationManagerService;Lcom/android/server/LocationManagerService$UpdateRecord;)Z
 HSPLcom/android/server/LocationManagerService;->access$2100(Lcom/android/server/LocationManagerService;)Landroid/os/PowerManager;
+PLcom/android/server/LocationManagerService;->access$2100(Lcom/android/server/LocationManagerService;)Lcom/android/server/location/AppOpsHelper;
 HSPLcom/android/server/LocationManagerService;->access$2100(Lcom/android/server/LocationManagerService;I)Z
 HSPLcom/android/server/LocationManagerService;->access$2100(Lcom/android/server/LocationManagerService;II)I
 HSPLcom/android/server/LocationManagerService;->access$2100(Lcom/android/server/LocationManagerService;Lcom/android/server/LocationManagerService$LocationProviderManager;)V
@@ -2916,6 +3113,7 @@
 HSPLcom/android/server/LocationManagerService;->access$2200(Lcom/android/server/LocationManagerService;Ljava/lang/String;)Lcom/android/server/LocationManagerService$LocationProviderManager;
 HSPLcom/android/server/LocationManagerService;->access$2300(Lcom/android/server/LocationManagerService;)Landroid/os/PowerManager;
 PLcom/android/server/LocationManagerService;->access$2300(Lcom/android/server/LocationManagerService;)Ljava/util/HashMap;
+PLcom/android/server/LocationManagerService;->access$2300(Lcom/android/server/LocationManagerService;Lcom/android/server/LocationManagerService$Receiver;)V
 PLcom/android/server/LocationManagerService;->access$2300(Lcom/android/server/LocationManagerService;Lcom/android/server/LocationManagerService$UpdateRecord;)Z
 HSPLcom/android/server/LocationManagerService;->access$2300(Lcom/android/server/LocationManagerService;Ljava/lang/String;)Lcom/android/server/LocationManagerService$LocationProviderManager;
 PLcom/android/server/LocationManagerService;->access$2400(Lcom/android/server/LocationManagerService;)Landroid/app/AppOpsManager;
@@ -2923,18 +3121,23 @@
 HPLcom/android/server/LocationManagerService;->access$2400(Lcom/android/server/LocationManagerService;Lcom/android/server/LocationManagerService$UpdateRecord;)Z
 HPLcom/android/server/LocationManagerService;->access$2400(Lcom/android/server/LocationManagerService;Ljava/lang/String;)Lcom/android/server/LocationManagerService$LocationProviderManager;
 PLcom/android/server/LocationManagerService;->access$2500(Lcom/android/server/LocationManagerService;)Landroid/app/AppOpsManager;
+PLcom/android/server/LocationManagerService;->access$2500(Lcom/android/server/LocationManagerService;I)Ljava/lang/String;
 HSPLcom/android/server/LocationManagerService;->access$2500(Lcom/android/server/LocationManagerService;II)I
 PLcom/android/server/LocationManagerService;->access$2500(Lcom/android/server/LocationManagerService;Lcom/android/server/LocationManagerService$UpdateRecord;)Z
 PLcom/android/server/LocationManagerService;->access$2600(Lcom/android/server/LocationManagerService;)Landroid/app/AppOpsManager;
 HSPLcom/android/server/LocationManagerService;->access$2600(Lcom/android/server/LocationManagerService;)Landroid/os/PowerManager;
 PLcom/android/server/LocationManagerService;->access$2600(Lcom/android/server/LocationManagerService;I)Ljava/lang/String;
 PLcom/android/server/LocationManagerService;->access$2600(Lcom/android/server/LocationManagerService;Lcom/android/server/LocationManagerService$Receiver;)V
+PLcom/android/server/LocationManagerService;->access$2700(Lcom/android/server/LocationManagerService;)Lcom/android/server/location/AppForegroundHelper;
 PLcom/android/server/LocationManagerService;->access$2700(Lcom/android/server/LocationManagerService;I)Ljava/lang/String;
 PLcom/android/server/LocationManagerService;->access$2700(Lcom/android/server/LocationManagerService;Lcom/android/server/LocationManagerService$Receiver;)V
 PLcom/android/server/LocationManagerService;->access$2800(Lcom/android/server/LocationManagerService;)Landroid/app/AppOpsManager;
+PLcom/android/server/LocationManagerService;->access$2800(Lcom/android/server/LocationManagerService;)Ljava/util/HashMap;
 PLcom/android/server/LocationManagerService;->access$2800(Lcom/android/server/LocationManagerService;Lcom/android/server/LocationManagerService$Receiver;)V
+PLcom/android/server/LocationManagerService;->access$2900(Lcom/android/server/LocationManagerService;)Lcom/android/server/location/LocationRequestStatistics;
 HSPLcom/android/server/LocationManagerService;->access$300(Lcom/android/server/LocationManagerService;)Landroid/os/Handler;
 HSPLcom/android/server/LocationManagerService;->access$300(Lcom/android/server/LocationManagerService;)V
+PLcom/android/server/LocationManagerService;->access$3000(Lcom/android/server/LocationManagerService;)Lcom/android/server/location/LocationUsageLogger;
 HSPLcom/android/server/LocationManagerService;->access$3100(Lcom/android/server/LocationManagerService;)Lcom/android/server/location/AppForegroundHelper;
 HSPLcom/android/server/LocationManagerService;->access$3200(Lcom/android/server/LocationManagerService;)Landroid/app/ActivityManager;
 HSPLcom/android/server/LocationManagerService;->access$3200(Lcom/android/server/LocationManagerService;)Lcom/android/server/location/AppForegroundHelper;
@@ -2952,8 +3155,10 @@
 PLcom/android/server/LocationManagerService;->access$3600(Lcom/android/server/LocationManagerService;)Lcom/android/server/location/LocationUsageLogger;
 HSPLcom/android/server/LocationManagerService;->access$3600(Lcom/android/server/LocationManagerService;)Ljava/util/HashMap;
 HSPLcom/android/server/LocationManagerService;->access$3700(Lcom/android/server/LocationManagerService;)Lcom/android/server/location/LocationRequestStatistics;
+PLcom/android/server/LocationManagerService;->access$3700(Lcom/android/server/LocationManagerService;)Ljava/util/concurrent/CopyOnWriteArrayList;
 HSPLcom/android/server/LocationManagerService;->access$400(Lcom/android/server/LocationManagerService;)Landroid/os/Handler;
 HSPLcom/android/server/LocationManagerService;->access$400(Lcom/android/server/LocationManagerService;)Ljava/lang/Object;
+PLcom/android/server/LocationManagerService;->access$4100(Lcom/android/server/LocationManagerService;)Ljava/util/concurrent/CopyOnWriteArrayList;
 PLcom/android/server/LocationManagerService;->access$4200(Lcom/android/server/LocationManagerService;)Ljava/util/concurrent/CopyOnWriteArrayList;
 PLcom/android/server/LocationManagerService;->access$4300(Lcom/android/server/LocationManagerService;)Ljava/util/concurrent/CopyOnWriteArrayList;
 HSPLcom/android/server/LocationManagerService;->access$500(Lcom/android/server/LocationManagerService;)Landroid/os/Handler;
@@ -2972,6 +3177,7 @@
 HSPLcom/android/server/LocationManagerService;->access$800(Lcom/android/server/LocationManagerService;Ljava/lang/String;)V
 PLcom/android/server/LocationManagerService;->access$900(Lcom/android/server/LocationManagerService;)V
 PLcom/android/server/LocationManagerService;->access$900(Lcom/android/server/LocationManagerService;Ljava/lang/String;)V
+PLcom/android/server/LocationManagerService;->addGnssMeasurementsListener(Landroid/location/GnssRequest;Landroid/location/IGnssMeasurementsListener;Ljava/lang/String;Ljava/lang/String;)Z
 PLcom/android/server/LocationManagerService;->addGnssMeasurementsListener(Landroid/location/GnssRequest;Landroid/location/IGnssMeasurementsListener;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z
 PLcom/android/server/LocationManagerService;->addGnssMeasurementsListener(Landroid/location/IGnssMeasurementsListener;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z
 HSPLcom/android/server/LocationManagerService;->addProviderLocked(Lcom/android/server/LocationManagerService$LocationProviderManager;)V
@@ -2983,6 +3189,7 @@
 PLcom/android/server/LocationManagerService;->checkResolutionLevelIsSufficientForGeofenceUse(I)V
 HSPLcom/android/server/LocationManagerService;->checkResolutionLevelIsSufficientForProviderUseLocked(ILjava/lang/String;)V
 HSPLcom/android/server/LocationManagerService;->createSanitizedRequest(Landroid/location/LocationRequest;IZ)Landroid/location/LocationRequest;
+HPLcom/android/server/LocationManagerService;->createSanitizedRequest(Landroid/location/LocationRequest;Lcom/android/server/location/CallerIdentity;Z)Landroid/location/LocationRequest;
 HPLcom/android/server/LocationManagerService;->dump(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V
 HSPLcom/android/server/LocationManagerService;->enforceCallingOrSelfLocationPermission()V
 HSPLcom/android/server/LocationManagerService;->enforceCallingOrSelfPackageName(Ljava/lang/String;)V
@@ -2992,10 +3199,12 @@
 HSPLcom/android/server/LocationManagerService;->getAllowedResolutionLevel(II)I
 HPLcom/android/server/LocationManagerService;->getBestProvider(Landroid/location/Criteria;Z)Ljava/lang/String;
 HSPLcom/android/server/LocationManagerService;->getCallerAllowedResolutionLevel()I
+PLcom/android/server/LocationManagerService;->getCurrentLocation(Landroid/location/LocationRequest;Landroid/os/ICancellationSignal;Landroid/location/ILocationListener;Ljava/lang/String;Ljava/lang/String;)Z
 PLcom/android/server/LocationManagerService;->getCurrentLocation(Landroid/location/LocationRequest;Landroid/os/ICancellationSignal;Landroid/location/ILocationListener;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z
 HPLcom/android/server/LocationManagerService;->getExtraLocationControllerPackage()Ljava/lang/String;
 HPLcom/android/server/LocationManagerService;->getFromLocation(DDILandroid/location/GeocoderParams;Ljava/util/List;)Ljava/lang/String;
 PLcom/android/server/LocationManagerService;->getFromLocationName(Ljava/lang/String;DDDDILandroid/location/GeocoderParams;Ljava/util/List;)Ljava/lang/String;
+PLcom/android/server/LocationManagerService;->getGnssCapabilities()J
 HPLcom/android/server/LocationManagerService;->getGnssCapabilities(Ljava/lang/String;)J
 HPLcom/android/server/LocationManagerService;->getLastLocation(Landroid/location/LocationRequest;Ljava/lang/String;Ljava/lang/String;)Landroid/location/Location;
 HSPLcom/android/server/LocationManagerService;->getLocationProviderLocked(Ljava/lang/String;)Lcom/android/server/LocationManagerService$LocationProviderManager;
@@ -3004,7 +3213,9 @@
 HPLcom/android/server/LocationManagerService;->getProviderProperties(Ljava/lang/String;)Lcom/android/internal/location/ProviderProperties;
 HPLcom/android/server/LocationManagerService;->getProviders(Landroid/location/Criteria;Z)Ljava/util/List;
 HPLcom/android/server/LocationManagerService;->getReceiverLocked(Landroid/app/PendingIntent;IILjava/lang/String;Ljava/lang/String;Landroid/os/WorkSource;ZLjava/lang/String;)Lcom/android/server/LocationManagerService$Receiver;
+PLcom/android/server/LocationManagerService;->getReceiverLocked(Landroid/app/PendingIntent;Lcom/android/server/location/CallerIdentity;Landroid/os/WorkSource;Z)Lcom/android/server/LocationManagerService$Receiver;
 HSPLcom/android/server/LocationManagerService;->getReceiverLocked(Landroid/location/ILocationListener;IILjava/lang/String;Ljava/lang/String;Landroid/os/WorkSource;ZLjava/lang/String;)Lcom/android/server/LocationManagerService$Receiver;
+HPLcom/android/server/LocationManagerService;->getReceiverLocked(Landroid/location/ILocationListener;Lcom/android/server/location/CallerIdentity;Landroid/os/WorkSource;Z)Lcom/android/server/LocationManagerService$Receiver;
 PLcom/android/server/LocationManagerService;->getResolutionPermission(I)Ljava/lang/String;
 HPLcom/android/server/LocationManagerService;->handleLocationChangedLocked(Landroid/location/Location;Lcom/android/server/LocationManagerService$LocationProviderManager;)V
 HPLcom/android/server/LocationManagerService;->handleLocationChangedLocked(Lcom/android/server/LocationManagerService$LocationProviderManager;Landroid/location/Location;Landroid/location/Location;)V
@@ -3024,6 +3235,7 @@
 HSPLcom/android/server/LocationManagerService;->lambda$DgmGqZVwms-Y6rAmZybXkZVgJ-Q(Lcom/android/server/LocationManagerService;II)V
 PLcom/android/server/LocationManagerService;->lambda$KXKNxpIZDrysWhFilQxLdYekB3M(Lcom/android/server/LocationManagerService;)V
 PLcom/android/server/LocationManagerService;->lambda$getCurrentLocation$13$LocationManagerService(Landroid/location/ILocationListener;Ljava/lang/String;)V
+PLcom/android/server/LocationManagerService;->lambda$getCurrentLocation$6$LocationManagerService(Landroid/location/ILocationListener;)V
 PLcom/android/server/LocationManagerService;->lambda$getCurrentLocation$6$LocationManagerService(Landroid/location/ILocationListener;Ljava/lang/String;)V
 HSPLcom/android/server/LocationManagerService;->lambda$new$0$LocationManagerService(I)[Ljava/lang/String;
 HSPLcom/android/server/LocationManagerService;->lambda$new$1$LocationManagerService(I)[Ljava/lang/String;
@@ -3041,6 +3253,7 @@
 PLcom/android/server/LocationManagerService;->lambda$onSystemReady$7$LocationManagerService(Landroid/os/PowerSaveState;)V
 HSPLcom/android/server/LocationManagerService;->lambda$onSystemReady$8$LocationManagerService(I)V
 PLcom/android/server/LocationManagerService;->lambda$onSystemReady$9$LocationManagerService()V
+PLcom/android/server/LocationManagerService;->lambda$rCyjSaqQ-rLpPfZIkKmdIMxpVhs(Lcom/android/server/LocationManagerService;Ljava/lang/String;)V
 HSPLcom/android/server/LocationManagerService;->locationCallbackFinished(Landroid/location/ILocationListener;)V
 HSPLcom/android/server/LocationManagerService;->onAppForegroundChanged(IZ)V
 HSPLcom/android/server/LocationManagerService;->onAppOpChanged(Ljava/lang/String;)V
@@ -3052,8 +3265,10 @@
 PLcom/android/server/LocationManagerService;->onIgnoreSettingsWhitelistChangedLocked()V
 HSPLcom/android/server/LocationManagerService;->onLocationModeChanged(I)V
 HSPLcom/android/server/LocationManagerService;->onLocationModeChangedLocked(I)V
+HPLcom/android/server/LocationManagerService;->onPackageDisappeared(Ljava/lang/String;)V
 HSPLcom/android/server/LocationManagerService;->onPackageDisappearedLocked(Ljava/lang/String;)V
 HPLcom/android/server/LocationManagerService;->onPermissionsChangedLocked()V
+HPLcom/android/server/LocationManagerService;->onScreenStateChanged()V
 HPLcom/android/server/LocationManagerService;->onScreenStateChangedLocked()V
 HSPLcom/android/server/LocationManagerService;->onSystemReady()V
 HSPLcom/android/server/LocationManagerService;->onSystemThirdPartyAppsCanStart()V
@@ -3065,10 +3280,12 @@
 HPLcom/android/server/LocationManagerService;->registerGnssStatusCallback(Landroid/location/IGnssStatusListener;Ljava/lang/String;Ljava/lang/String;)Z
 PLcom/android/server/LocationManagerService;->removeGeofence(Landroid/location/Geofence;Landroid/app/PendingIntent;Ljava/lang/String;)V
 PLcom/android/server/LocationManagerService;->removeGnssMeasurementsListener(Landroid/location/IGnssMeasurementsListener;)V
+HPLcom/android/server/LocationManagerService;->removeUpdates(Landroid/location/ILocationListener;Landroid/app/PendingIntent;)V
 HPLcom/android/server/LocationManagerService;->removeUpdates(Landroid/location/ILocationListener;Landroid/app/PendingIntent;Ljava/lang/String;)V
 HPLcom/android/server/LocationManagerService;->removeUpdatesLocked(Lcom/android/server/LocationManagerService$Receiver;)V
 HPLcom/android/server/LocationManagerService;->reportLocationAccessNoThrow(IILjava/lang/String;Ljava/lang/String;ILjava/lang/String;)Z
 PLcom/android/server/LocationManagerService;->requestGeofence(Landroid/location/LocationRequest;Landroid/location/Geofence;Landroid/app/PendingIntent;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
+HPLcom/android/server/LocationManagerService;->requestLocationUpdates(Landroid/location/LocationRequest;Landroid/location/ILocationListener;Landroid/app/PendingIntent;Ljava/lang/String;Ljava/lang/String;)V
 HSPLcom/android/server/LocationManagerService;->requestLocationUpdates(Landroid/location/LocationRequest;Landroid/location/ILocationListener;Landroid/app/PendingIntent;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
 HSPLcom/android/server/LocationManagerService;->requestLocationUpdatesLocked(Landroid/location/LocationRequest;Lcom/android/server/LocationManagerService$Receiver;)V
 HSPLcom/android/server/LocationManagerService;->requestLocationUpdatesLocked(Landroid/location/LocationRequest;Lcom/android/server/LocationManagerService$Receiver;ILjava/lang/String;)V
@@ -3084,10 +3301,12 @@
 HSPLcom/android/server/LocationManagerService;->updateProviderEnabledLocked(Lcom/android/server/LocationManagerService$LocationProviderManager;)V
 HSPLcom/android/server/LocationManagerService;->updateProviderEnabledLocked(Lcom/android/server/LocationManagerService$LocationProviderManager;Z)V
 HSPLcom/android/server/LocationManagerService;->updateProviderUseableLocked(Lcom/android/server/LocationManagerService$LocationProviderManager;)V
+PLcom/android/server/LocationManagerServiceUtils$LinkedListener;-><init>(Ljava/lang/Object;Ljava/lang/Object;Lcom/android/server/location/CallerIdentity;Ljava/util/function/Consumer;)V
 PLcom/android/server/LocationManagerServiceUtils$LinkedListener;-><init>(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/String;Lcom/android/server/location/CallerIdentity;Ljava/util/function/Consumer;)V
 PLcom/android/server/LocationManagerServiceUtils$LinkedListener;-><init>(Ljava/lang/Object;Ljava/lang/String;Lcom/android/server/location/CallerIdentity;Ljava/util/function/Consumer;)V
 PLcom/android/server/LocationManagerServiceUtils$LinkedListener;->binderDied()V
 HPLcom/android/server/LocationManagerServiceUtils$LinkedListener;->getRequest()Ljava/lang/Object;
+PLcom/android/server/LocationManagerServiceUtils$LinkedListenerBase;-><init>(Lcom/android/server/location/CallerIdentity;)V
 HSPLcom/android/server/LocationManagerServiceUtils$LinkedListenerBase;-><init>(Lcom/android/server/location/CallerIdentity;Ljava/lang/String;)V
 PLcom/android/server/LocationManagerServiceUtils$LinkedListenerBase;->getCallerIdentity()Lcom/android/server/location/CallerIdentity;
 HSPLcom/android/server/LocationManagerServiceUtils$LinkedListenerBase;->linkToListenerDeathNotificationLocked(Landroid/os/IBinder;)Z
@@ -3253,7 +3472,7 @@
 HSPLcom/android/server/NetworkManagementService;->access$800(Lcom/android/server/NetworkManagementService;Ljava/lang/String;Landroid/net/LinkAddress;)V
 HSPLcom/android/server/NetworkManagementService;->access$900(Lcom/android/server/NetworkManagementService;Ljava/lang/String;Landroid/net/LinkAddress;)V
 HPLcom/android/server/NetworkManagementService;->addIdleTimer(Ljava/lang/String;II)V
-PLcom/android/server/NetworkManagementService;->addInterfaceToNetwork(Ljava/lang/String;I)V
+HPLcom/android/server/NetworkManagementService;->addInterfaceToNetwork(Ljava/lang/String;I)V
 HPLcom/android/server/NetworkManagementService;->addLegacyRouteForNetId(ILandroid/net/RouteInfo;I)V
 HPLcom/android/server/NetworkManagementService;->addRoute(ILandroid/net/RouteInfo;)V
 PLcom/android/server/NetworkManagementService;->addVpnUidRanges(I[Landroid/net/UidRange;)V
@@ -3437,6 +3656,7 @@
 HPLcom/android/server/NetworkScorerAppManager$SettingsFacade;->getSecureInt(Landroid/content/Context;Ljava/lang/String;I)I
 HSPLcom/android/server/NetworkScorerAppManager$SettingsFacade;->getString(Landroid/content/Context;Ljava/lang/String;)Ljava/lang/String;
 HSPLcom/android/server/NetworkScorerAppManager$SettingsFacade;->putInt(Landroid/content/Context;Ljava/lang/String;I)Z
+PLcom/android/server/NetworkScorerAppManager$SettingsFacade;->putString(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;)Z
 HSPLcom/android/server/NetworkScorerAppManager;-><clinit>()V
 HSPLcom/android/server/NetworkScorerAppManager;-><init>(Landroid/content/Context;)V
 HSPLcom/android/server/NetworkScorerAppManager;-><init>(Landroid/content/Context;Lcom/android/server/NetworkScorerAppManager$SettingsFacade;)V
@@ -3455,6 +3675,7 @@
 PLcom/android/server/NetworkScorerAppManager;->isLocationModeEnabled()Z
 HSPLcom/android/server/NetworkScorerAppManager;->migrateNetworkScorerAppSettingIfNeeded()V
 HSPLcom/android/server/NetworkScorerAppManager;->setNetworkRecommendationsEnabledSetting(I)V
+PLcom/android/server/NetworkScorerAppManager;->setNetworkRecommendationsPackage(Ljava/lang/String;)V
 HSPLcom/android/server/NetworkScorerAppManager;->updateState()V
 HSPLcom/android/server/NetworkTimeUpdateService$1;-><init>(Lcom/android/server/NetworkTimeUpdateService;)V
 PLcom/android/server/NetworkTimeUpdateService$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
@@ -3604,8 +3825,11 @@
 HPLcom/android/server/PackageWatchdog$MonitoredPackage;-><init>(Lcom/android/server/PackageWatchdog;Landroid/content/pm/VersionedPackage;JJZ)V
 HPLcom/android/server/PackageWatchdog$MonitoredPackage;-><init>(Lcom/android/server/PackageWatchdog;Landroid/content/pm/VersionedPackage;JJZLcom/android/server/PackageWatchdog$1;)V
 HPLcom/android/server/PackageWatchdog$MonitoredPackage;->access$000(Lcom/android/server/PackageWatchdog$MonitoredPackage;)Ljava/lang/String;
+PLcom/android/server/PackageWatchdog$MonitoredPackage;->access$1200(Lcom/android/server/PackageWatchdog$MonitoredPackage;)Landroid/content/pm/VersionedPackage;
+PLcom/android/server/PackageWatchdog$MonitoredPackage;->access$200(Lcom/android/server/PackageWatchdog$MonitoredPackage;)J
 PLcom/android/server/PackageWatchdog$MonitoredPackage;->access$300(Lcom/android/server/PackageWatchdog$MonitoredPackage;)Landroid/util/LongArrayQueue;
 PLcom/android/server/PackageWatchdog$MonitoredPackage;->access$400(Lcom/android/server/PackageWatchdog$MonitoredPackage;)J
+PLcom/android/server/PackageWatchdog$MonitoredPackage;->access$400(Lcom/android/server/PackageWatchdog$MonitoredPackage;)Landroid/util/LongArrayQueue;
 PLcom/android/server/PackageWatchdog$MonitoredPackage;->access$500(Lcom/android/server/PackageWatchdog$MonitoredPackage;)J
 PLcom/android/server/PackageWatchdog$MonitoredPackage;->access$600(Lcom/android/server/PackageWatchdog$MonitoredPackage;)I
 PLcom/android/server/PackageWatchdog$MonitoredPackage;->access$700(Lcom/android/server/PackageWatchdog$MonitoredPackage;I)Ljava/lang/String;
@@ -3613,13 +3837,14 @@
 HPLcom/android/server/PackageWatchdog$MonitoredPackage;->getName()Ljava/lang/String;
 HPLcom/android/server/PackageWatchdog$MonitoredPackage;->getShortestScheduleDurationMsLocked()J
 HPLcom/android/server/PackageWatchdog$MonitoredPackage;->handleElapsedTimeLocked(J)I
-PLcom/android/server/PackageWatchdog$MonitoredPackage;->isExpiredLocked()Z
+HPLcom/android/server/PackageWatchdog$MonitoredPackage;->isExpiredLocked()Z
 HPLcom/android/server/PackageWatchdog$MonitoredPackage;->isPendingHealthChecksLocked()Z
 PLcom/android/server/PackageWatchdog$MonitoredPackage;->onFailureLocked()Z
 HPLcom/android/server/PackageWatchdog$MonitoredPackage;->setHealthCheckActiveLocked(J)I
-PLcom/android/server/PackageWatchdog$MonitoredPackage;->toPositive(J)J
+HPLcom/android/server/PackageWatchdog$MonitoredPackage;->toPositive(J)J
 HPLcom/android/server/PackageWatchdog$MonitoredPackage;->toString(I)Ljava/lang/String;
 HPLcom/android/server/PackageWatchdog$MonitoredPackage;->tryPassHealthCheckLocked()I
+PLcom/android/server/PackageWatchdog$MonitoredPackage;->updateHealthCheckDuration(J)V
 HPLcom/android/server/PackageWatchdog$MonitoredPackage;->updateHealthCheckStateLocked()I
 HPLcom/android/server/PackageWatchdog$MonitoredPackage;->writeLocked(Lorg/xmlpull/v1/XmlSerializer;)V
 HSPLcom/android/server/PackageWatchdog$ObserverInternal;-><init>(Ljava/lang/String;Ljava/util/List;)V
@@ -3647,12 +3872,15 @@
 HSPLcom/android/server/PackageWatchdog;->lambda$CQuOnXthwwBaxcS5WoAlJJAz8Tk(Lcom/android/server/PackageWatchdog;)V
 HSPLcom/android/server/PackageWatchdog;->lambda$Q0WI2EJpRFO1jF_7_YDaj1eGHas(Lcom/android/server/PackageWatchdog;)Z
 PLcom/android/server/PackageWatchdog;->lambda$checkAndMitigateNativeCrashes$4$PackageWatchdog()V
+PLcom/android/server/PackageWatchdog;->lambda$onHealthCheckFailed$6$PackageWatchdog(Lcom/android/server/PackageWatchdog$ObserverInternal;Ljava/util/Set;)V
 HPLcom/android/server/PackageWatchdog;->lambda$onPackageFailure$3$PackageWatchdog(ILjava/util/List;)V
+PLcom/android/server/PackageWatchdog;->lambda$onPackageFailure$4$PackageWatchdog(ILjava/util/List;)V
 PLcom/android/server/PackageWatchdog;->lambda$onPackagesReady$0$PackageWatchdog(Ljava/lang/String;)V
 HSPLcom/android/server/PackageWatchdog;->lambda$onPackagesReady$1$PackageWatchdog(Ljava/util/List;)V
 HSPLcom/android/server/PackageWatchdog;->lambda$onPackagesReady$2$PackageWatchdog()V
 PLcom/android/server/PackageWatchdog;->lambda$scheduleCheckAndMitigateNativeCrashes$5$PackageWatchdog()V
 PLcom/android/server/PackageWatchdog;->lambda$setPropertyChangedListenerLocked$7$PackageWatchdog(Landroid/provider/DeviceConfig$Properties;)V
+HPLcom/android/server/PackageWatchdog;->lambda$startObservingHealth$3$PackageWatchdog(Lcom/android/server/PackageWatchdog$PackageHealthObserver;Ljava/util/List;Ljava/util/List;)V
 PLcom/android/server/PackageWatchdog;->lambda$vRKcIrucEj03dz6ypRVINZtns1s(Lcom/android/server/PackageWatchdog;)V
 HSPLcom/android/server/PackageWatchdog;->loadFromFile()V
 HSPLcom/android/server/PackageWatchdog;->newMonitoredPackage(Ljava/lang/String;JJZ)Lcom/android/server/PackageWatchdog$MonitoredPackage;
@@ -3915,7 +4143,7 @@
 HSPLcom/android/server/ServiceWatcher;->lambda$register$0$ServiceWatcher()V
 HSPLcom/android/server/ServiceWatcher;->lambda$runOnBinder$1$ServiceWatcher(Lcom/android/server/ServiceWatcher$BinderRunner;)V
 HSPLcom/android/server/ServiceWatcher;->lambda$runOnBinder$2$ServiceWatcher(Lcom/android/server/ServiceWatcher$BinderRunner;)V
-PLcom/android/server/ServiceWatcher;->lambda$runOnBinderBlocking$2$ServiceWatcher(Ljava/lang/Object;Lcom/android/server/ServiceWatcher$BlockingBinderRunner;)Ljava/lang/Object;
+HPLcom/android/server/ServiceWatcher;->lambda$runOnBinderBlocking$2$ServiceWatcher(Ljava/lang/Object;Lcom/android/server/ServiceWatcher$BlockingBinderRunner;)Ljava/lang/Object;
 HPLcom/android/server/ServiceWatcher;->lambda$runOnBinderBlocking$3$ServiceWatcher(Ljava/lang/Object;Lcom/android/server/ServiceWatcher$BlockingBinderRunner;)Ljava/lang/Object;
 HSPLcom/android/server/ServiceWatcher;->lambda$start$0$ServiceWatcher()V
 HSPLcom/android/server/ServiceWatcher;->onBestServiceChanged(Z)V
@@ -3938,7 +4166,7 @@
 HSPLcom/android/server/ServiceWatcher;->unbind()V
 HSPLcom/android/server/StorageManagerService$10;-><init>(Lcom/android/server/StorageManagerService;Landroid/os/IVoldTaskListener;)V
 HPLcom/android/server/StorageManagerService$10;-><init>(Lcom/android/server/StorageManagerService;Ljava/lang/Runnable;)V
-HPLcom/android/server/StorageManagerService$10;->onFinished(ILandroid/os/PersistableBundle;)V
+HSPLcom/android/server/StorageManagerService$10;->onFinished(ILandroid/os/PersistableBundle;)V
 HSPLcom/android/server/StorageManagerService$10;->onStatus(ILandroid/os/PersistableBundle;)V
 PLcom/android/server/StorageManagerService$11;-><init>(Lcom/android/server/StorageManagerService;Ljava/lang/Runnable;)V
 PLcom/android/server/StorageManagerService$11;->onFinished(ILandroid/os/PersistableBundle;)V
@@ -3968,7 +4196,7 @@
 PLcom/android/server/StorageManagerService$7;->onPackageRemoved(Ljava/lang/String;I)V
 PLcom/android/server/StorageManagerService$7;->onVolumeChecking(Ljava/io/FileDescriptor;Ljava/lang/String;Ljava/lang/String;)Z
 PLcom/android/server/StorageManagerService$8;-><init>(Lcom/android/server/StorageManagerService;Landroid/os/storage/VolumeInfo;)V
-PLcom/android/server/StorageManagerService$8;->onVolumeChecking(Ljava/io/FileDescriptor;Ljava/lang/String;Ljava/lang/String;)Z
+HPLcom/android/server/StorageManagerService$8;->onVolumeChecking(Ljava/io/FileDescriptor;Ljava/lang/String;Ljava/lang/String;)Z
 HSPLcom/android/server/StorageManagerService$9;-><init>(Lcom/android/server/StorageManagerService;Landroid/os/IVoldTaskListener;)V
 HSPLcom/android/server/StorageManagerService$9;->onFinished(ILandroid/os/PersistableBundle;)V
 HSPLcom/android/server/StorageManagerService$9;->onStatus(ILandroid/os/PersistableBundle;)V
@@ -3979,9 +4207,11 @@
 HSPLcom/android/server/StorageManagerService$Callbacks;-><init>(Landroid/os/Looper;)V
 PLcom/android/server/StorageManagerService$Callbacks;->access$2700(Lcom/android/server/StorageManagerService$Callbacks;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
 PLcom/android/server/StorageManagerService$Callbacks;->access$2800(Lcom/android/server/StorageManagerService$Callbacks;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/StorageManagerService$Callbacks;->access$2900(Lcom/android/server/StorageManagerService$Callbacks;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
 PLcom/android/server/StorageManagerService$Callbacks;->access$3700(Lcom/android/server/StorageManagerService$Callbacks;Landroid/os/storage/VolumeInfo;II)V
 PLcom/android/server/StorageManagerService$Callbacks;->access$3800(Lcom/android/server/StorageManagerService$Callbacks;Landroid/os/storage/VolumeInfo;II)V
 PLcom/android/server/StorageManagerService$Callbacks;->access$3900(Lcom/android/server/StorageManagerService$Callbacks;Landroid/os/storage/VolumeInfo;II)V
+PLcom/android/server/StorageManagerService$Callbacks;->access$4000(Lcom/android/server/StorageManagerService$Callbacks;Landroid/os/storage/VolumeInfo;II)V
 HPLcom/android/server/StorageManagerService$Callbacks;->handleMessage(Landroid/os/Message;)V
 PLcom/android/server/StorageManagerService$Callbacks;->invokeCallback(Landroid/os/storage/IStorageEventListener;ILcom/android/internal/os/SomeArgs;)V
 PLcom/android/server/StorageManagerService$Callbacks;->notifyStorageStateChanged(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
@@ -4003,6 +4233,7 @@
 HSPLcom/android/server/StorageManagerService$StorageManagerInternalImpl;->addExternalStoragePolicy(Landroid/os/storage/StorageManagerInternal$ExternalStorageMountPolicy;)V
 HSPLcom/android/server/StorageManagerService$StorageManagerInternalImpl;->getExternalStorageMountMode(ILjava/lang/String;)I
 HSPLcom/android/server/StorageManagerService$StorageManagerInternalImpl;->hasExternalStorage(ILjava/lang/String;)Z
+PLcom/android/server/StorageManagerService$StorageManagerInternalImpl;->isExternalStorageService(I)Z
 HSPLcom/android/server/StorageManagerService$StorageManagerInternalImpl;->onAppOpsChanged(IILjava/lang/String;I)V
 HSPLcom/android/server/StorageManagerService$StorageManagerInternalImpl;->onExternalStoragePolicyChanged(ILjava/lang/String;)V
 PLcom/android/server/StorageManagerService$StorageManagerInternalImpl;->onReset(Landroid/os/IVold;)V
@@ -4035,6 +4266,7 @@
 PLcom/android/server/StorageManagerService;->access$1502(Lcom/android/server/StorageManagerService;Landroid/os/IVold;)Landroid/os/IVold;
 PLcom/android/server/StorageManagerService;->access$1600(Lcom/android/server/StorageManagerService;)Landroid/os/IVold;
 PLcom/android/server/StorageManagerService;->access$1600(Lcom/android/server/StorageManagerService;Landroid/os/storage/VolumeInfo;)Z
+PLcom/android/server/StorageManagerService;->access$1602(Lcom/android/server/StorageManagerService;Landroid/os/IVold;)Landroid/os/IVold;
 PLcom/android/server/StorageManagerService;->access$1700(Lcom/android/server/StorageManagerService;Landroid/os/storage/VolumeInfo;)V
 PLcom/android/server/StorageManagerService;->access$1700(Lcom/android/server/StorageManagerService;Landroid/os/storage/VolumeInfo;)Z
 PLcom/android/server/StorageManagerService;->access$1800(Lcom/android/server/StorageManagerService;Landroid/os/storage/VolumeInfo;)V
@@ -4042,27 +4274,38 @@
 HSPLcom/android/server/StorageManagerService;->access$200(Lcom/android/server/StorageManagerService;)V
 HSPLcom/android/server/StorageManagerService;->access$2000(Lcom/android/server/StorageManagerService;)Landroid/content/Context;
 PLcom/android/server/StorageManagerService;->access$2100(Lcom/android/server/StorageManagerService;)V
+PLcom/android/server/StorageManagerService;->access$2200(Lcom/android/server/StorageManagerService;)V
 PLcom/android/server/StorageManagerService;->access$2200(Lcom/android/server/StorageManagerService;I)V
 PLcom/android/server/StorageManagerService;->access$2300(Lcom/android/server/StorageManagerService;)Landroid/util/ArrayMap;
 PLcom/android/server/StorageManagerService;->access$2300(Lcom/android/server/StorageManagerService;I)V
 PLcom/android/server/StorageManagerService;->access$2400(Lcom/android/server/StorageManagerService;)Landroid/os/Handler;
 PLcom/android/server/StorageManagerService;->access$2400(Lcom/android/server/StorageManagerService;)Landroid/util/ArrayMap;
+PLcom/android/server/StorageManagerService;->access$2400(Lcom/android/server/StorageManagerService;Landroid/os/storage/VolumeInfo;II)V
 PLcom/android/server/StorageManagerService;->access$2500(Lcom/android/server/StorageManagerService;)Landroid/os/Handler;
+PLcom/android/server/StorageManagerService;->access$2500(Lcom/android/server/StorageManagerService;)Landroid/util/ArrayMap;
 PLcom/android/server/StorageManagerService;->access$2500(Lcom/android/server/StorageManagerService;)V
+PLcom/android/server/StorageManagerService;->access$2600(Lcom/android/server/StorageManagerService;)Landroid/os/Handler;
 PLcom/android/server/StorageManagerService;->access$2600(Lcom/android/server/StorageManagerService;)V
+PLcom/android/server/StorageManagerService;->access$2700(Lcom/android/server/StorageManagerService;)V
 HSPLcom/android/server/StorageManagerService;->access$2800(Lcom/android/server/StorageManagerService;)Ljava/lang/Object;
 PLcom/android/server/StorageManagerService;->access$2900(Lcom/android/server/StorageManagerService;)Landroid/util/ArrayMap;
 HSPLcom/android/server/StorageManagerService;->access$2900(Lcom/android/server/StorageManagerService;)Ljava/lang/Object;
 PLcom/android/server/StorageManagerService;->access$300(Lcom/android/server/StorageManagerService;)V
 PLcom/android/server/StorageManagerService;->access$3000(Lcom/android/server/StorageManagerService;)Landroid/util/ArrayMap;
+PLcom/android/server/StorageManagerService;->access$3000(Lcom/android/server/StorageManagerService;)Ljava/lang/Object;
+PLcom/android/server/StorageManagerService;->access$3100(Lcom/android/server/StorageManagerService;)Landroid/util/ArrayMap;
 PLcom/android/server/StorageManagerService;->access$3300(Lcom/android/server/StorageManagerService;Landroid/os/storage/VolumeInfo;)V
 PLcom/android/server/StorageManagerService;->access$3400(Lcom/android/server/StorageManagerService;Landroid/os/storage/VolumeInfo;)V
 PLcom/android/server/StorageManagerService;->access$3400(Lcom/android/server/StorageManagerService;Landroid/os/storage/VolumeInfo;II)V
+PLcom/android/server/StorageManagerService;->access$3500(Lcom/android/server/StorageManagerService;Landroid/os/storage/VolumeInfo;)V
 PLcom/android/server/StorageManagerService;->access$3500(Lcom/android/server/StorageManagerService;Landroid/os/storage/VolumeInfo;II)V
 PLcom/android/server/StorageManagerService;->access$3600(Lcom/android/server/StorageManagerService;)Lcom/android/server/storage/StorageSessionController;
+PLcom/android/server/StorageManagerService;->access$3600(Lcom/android/server/StorageManagerService;Landroid/os/storage/VolumeInfo;II)V
+PLcom/android/server/StorageManagerService;->access$3700(Lcom/android/server/StorageManagerService;)Lcom/android/server/storage/StorageSessionController;
 PLcom/android/server/StorageManagerService;->access$402(Lcom/android/server/StorageManagerService;I)I
 PLcom/android/server/StorageManagerService;->access$4100(Lcom/android/server/StorageManagerService;)V
 HSPLcom/android/server/StorageManagerService;->access$4100(Lcom/android/server/StorageManagerService;Landroid/os/IVoldTaskListener;ILandroid/os/PersistableBundle;)V
+PLcom/android/server/StorageManagerService;->access$4200(Lcom/android/server/StorageManagerService;)V
 HSPLcom/android/server/StorageManagerService;->access$4200(Lcom/android/server/StorageManagerService;Landroid/os/IVoldTaskListener;ILandroid/os/PersistableBundle;)V
 HSPLcom/android/server/StorageManagerService;->access$4300(Lcom/android/server/StorageManagerService;Landroid/os/IVoldTaskListener;ILandroid/os/PersistableBundle;)V
 HSPLcom/android/server/StorageManagerService;->access$4300(Lcom/android/server/StorageManagerService;Ljava/lang/String;)Ljava/lang/String;
@@ -4070,10 +4313,14 @@
 HSPLcom/android/server/StorageManagerService;->access$4400(Lcom/android/server/StorageManagerService;Landroid/os/IVoldTaskListener;ILandroid/os/PersistableBundle;)V
 HSPLcom/android/server/StorageManagerService;->access$4400(Lcom/android/server/StorageManagerService;Ljava/lang/String;)Landroid/os/storage/VolumeRecord;
 HSPLcom/android/server/StorageManagerService;->access$4400(Lcom/android/server/StorageManagerService;Ljava/lang/String;)Ljava/lang/String;
-PLcom/android/server/StorageManagerService;->access$4500(Lcom/android/server/StorageManagerService;Landroid/os/IVoldTaskListener;ILandroid/os/PersistableBundle;)V
+PLcom/android/server/StorageManagerService;->access$4400(Lcom/android/server/StorageManagerService;Ljava/lang/String;IZ)V
+HSPLcom/android/server/StorageManagerService;->access$4500(Lcom/android/server/StorageManagerService;Landroid/os/IVoldTaskListener;ILandroid/os/PersistableBundle;)V
 HSPLcom/android/server/StorageManagerService;->access$4500(Lcom/android/server/StorageManagerService;Ljava/lang/String;)Landroid/os/storage/VolumeRecord;
+PLcom/android/server/StorageManagerService;->access$4600(Lcom/android/server/StorageManagerService;Landroid/os/IVoldTaskListener;ILandroid/os/PersistableBundle;)V
 HSPLcom/android/server/StorageManagerService;->access$4600(Lcom/android/server/StorageManagerService;Ljava/lang/String;)Ljava/lang/String;
 HSPLcom/android/server/StorageManagerService;->access$4700(Lcom/android/server/StorageManagerService;Ljava/lang/String;)Landroid/os/storage/VolumeRecord;
+PLcom/android/server/StorageManagerService;->access$4700(Lcom/android/server/StorageManagerService;Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/StorageManagerService;->access$4800(Lcom/android/server/StorageManagerService;Ljava/lang/String;)Landroid/os/storage/VolumeRecord;
 HSPLcom/android/server/StorageManagerService;->access$4900()Z
 PLcom/android/server/StorageManagerService;->access$500(Lcom/android/server/StorageManagerService;I)V
 HSPLcom/android/server/StorageManagerService;->access$5000()Z
@@ -4082,11 +4329,18 @@
 HSPLcom/android/server/StorageManagerService;->access$5100(Lcom/android/server/StorageManagerService;ILjava/lang/String;)I
 HSPLcom/android/server/StorageManagerService;->access$5200()Z
 HSPLcom/android/server/StorageManagerService;->access$5200(Lcom/android/server/StorageManagerService;II)V
+PLcom/android/server/StorageManagerService;->access$5300()Z
 HSPLcom/android/server/StorageManagerService;->access$5300(Lcom/android/server/StorageManagerService;ILjava/lang/String;)I
 PLcom/android/server/StorageManagerService;->access$5400(Lcom/android/server/StorageManagerService;II)V
+HPLcom/android/server/StorageManagerService;->access$5400(Lcom/android/server/StorageManagerService;ILjava/lang/String;)I
+PLcom/android/server/StorageManagerService;->access$5500(Lcom/android/server/StorageManagerService;II)V
 PLcom/android/server/StorageManagerService;->access$600(Lcom/android/server/StorageManagerService;I)V
 HPLcom/android/server/StorageManagerService;->access$6000(Lcom/android/server/StorageManagerService;)Z
 PLcom/android/server/StorageManagerService;->access$6400(Lcom/android/server/StorageManagerService;)Z
+PLcom/android/server/StorageManagerService;->access$6500(Lcom/android/server/StorageManagerService;)I
+PLcom/android/server/StorageManagerService;->access$6600(Lcom/android/server/StorageManagerService;)I
+PLcom/android/server/StorageManagerService;->access$6600(Lcom/android/server/StorageManagerService;)Z
+PLcom/android/server/StorageManagerService;->access$6700(Lcom/android/server/StorageManagerService;)Z
 PLcom/android/server/StorageManagerService;->access$700(Lcom/android/server/StorageManagerService;I)V
 HSPLcom/android/server/StorageManagerService;->access$800(Lcom/android/server/StorageManagerService;Landroid/os/UserHandle;)V
 HSPLcom/android/server/StorageManagerService;->addInternalVolumeLocked()V
@@ -4112,6 +4366,7 @@
 HSPLcom/android/server/StorageManagerService;->enforcePermission(Ljava/lang/String;)V
 HSPLcom/android/server/StorageManagerService;->findRecordForPath(Ljava/lang/String;)Landroid/os/storage/VolumeRecord;
 PLcom/android/server/StorageManagerService;->fixateNewestUserKeyAuth(I)V
+HPLcom/android/server/StorageManagerService;->fixupAppDir(Ljava/lang/String;)V
 HSPLcom/android/server/StorageManagerService;->fstrim(ILandroid/os/IVoldTaskListener;)V
 HPLcom/android/server/StorageManagerService;->getAllocatableBytes(Ljava/lang/String;ILjava/lang/String;)J
 PLcom/android/server/StorageManagerService;->getCacheQuotaBytes(Ljava/lang/String;I)J
@@ -4138,6 +4393,8 @@
 PLcom/android/server/StorageManagerService;->killMediaProvider(Ljava/util/List;)V
 PLcom/android/server/StorageManagerService;->lambda$connectVold$2$StorageManagerService()V
 PLcom/android/server/StorageManagerService;->lambda$handleSystemReady$0$StorageManagerService(Landroid/provider/DeviceConfig$Properties;)V
+PLcom/android/server/StorageManagerService;->lambda$mount$3$StorageManagerService(Landroid/os/storage/VolumeInfo;I)V
+PLcom/android/server/StorageManagerService;->lambda$onVolumeStateChangedLocked$1$StorageManagerService(Landroid/os/storage/VolumeInfo;I)V
 HSPLcom/android/server/StorageManagerService;->lastMaintenance()J
 PLcom/android/server/StorageManagerService;->lockUserKey(I)V
 PLcom/android/server/StorageManagerService;->maybeLogMediaMount(Landroid/os/storage/VolumeInfo;I)V
@@ -4153,6 +4410,8 @@
 PLcom/android/server/StorageManagerService;->onStopUser(I)V
 PLcom/android/server/StorageManagerService;->onUnlockUser(I)V
 PLcom/android/server/StorageManagerService;->onVolumeCreatedLocked(Landroid/os/storage/VolumeInfo;)V
+PLcom/android/server/StorageManagerService;->onVolumeStateChangedAsync(Landroid/os/storage/VolumeInfo;II)V
+HPLcom/android/server/StorageManagerService;->onVolumeStateChangedInternal(Landroid/os/storage/VolumeInfo;II)V
 HPLcom/android/server/StorageManagerService;->onVolumeStateChangedLocked(Landroid/os/storage/VolumeInfo;II)V
 HPLcom/android/server/StorageManagerService;->openProxyFileDescriptor(III)Landroid/os/ParcelFileDescriptor;
 PLcom/android/server/StorageManagerService;->prepareUserStorage(Ljava/lang/String;III)V
@@ -4162,6 +4421,7 @@
 HSPLcom/android/server/StorageManagerService;->refreshIsolatedStorageSettings()V
 HSPLcom/android/server/StorageManagerService;->refreshZramSettings()V
 HSPLcom/android/server/StorageManagerService;->registerListener(Landroid/os/storage/IStorageEventListener;)V
+PLcom/android/server/StorageManagerService;->remountAppStorageDirs(Ljava/util/Map;I)V
 HSPLcom/android/server/StorageManagerService;->remountUidExternalStorage(II)V
 HSPLcom/android/server/StorageManagerService;->resetIfBootedAndConnected()V
 HPLcom/android/server/StorageManagerService;->runIdleMaint(Ljava/lang/Runnable;)V
@@ -4181,6 +4441,7 @@
 PLcom/android/server/StorageManagerService;->unregisterListener(Landroid/os/storage/IStorageEventListener;)V
 PLcom/android/server/StorageManagerService;->updateFusePropFromSettings()V
 HSPLcom/android/server/StorageManagerService;->updateLegacyStorageApps(Ljava/lang/String;IZ)V
+PLcom/android/server/StorageManagerService;->updateLegacyStorageOpSticky()V
 HSPLcom/android/server/SystemConfigService$1;-><init>(Lcom/android/server/SystemConfigService;)V
 PLcom/android/server/SystemConfigService$1;->getDisabledUntilUsedPreinstalledCarrierApps()Ljava/util/List;
 PLcom/android/server/SystemConfigService$1;->getDisabledUntilUsedPreinstalledCarrierAssociatedApps()Ljava/util/Map;
@@ -4243,13 +4504,14 @@
 PLcom/android/server/SystemService;->onStopUser(Landroid/content/pm/UserInfo;)V
 HPLcom/android/server/SystemService;->onStopUser(Lcom/android/server/SystemService$TargetUser;)V
 PLcom/android/server/SystemService;->onSwitchUser(I)V
-PLcom/android/server/SystemService;->onSwitchUser(Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;)V
+HPLcom/android/server/SystemService;->onSwitchUser(Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;)V
 PLcom/android/server/SystemService;->onUnlockUser(I)V
 HPLcom/android/server/SystemService;->onUnlockUser(Landroid/content/pm/UserInfo;)V
 HPLcom/android/server/SystemService;->onUnlockUser(Lcom/android/server/SystemService$TargetUser;)V
 HPLcom/android/server/SystemService;->onUserStarting(Lcom/android/server/SystemService$TargetUser;)V
-PLcom/android/server/SystemService;->onUserStopping(Lcom/android/server/SystemService$TargetUser;)V
-PLcom/android/server/SystemService;->onUserUnlocked(Lcom/android/server/SystemService$TargetUser;)V
+HPLcom/android/server/SystemService;->onUserStopping(Lcom/android/server/SystemService$TargetUser;)V
+HPLcom/android/server/SystemService;->onUserSwitching(Lcom/android/server/SystemService$TargetUser;Lcom/android/server/SystemService$TargetUser;)V
+HPLcom/android/server/SystemService;->onUserUnlocked(Lcom/android/server/SystemService$TargetUser;)V
 HPLcom/android/server/SystemService;->onUserUnlocking(Lcom/android/server/SystemService$TargetUser;)V
 HSPLcom/android/server/SystemService;->publishBinderService(Ljava/lang/String;Landroid/os/IBinder;)V
 HSPLcom/android/server/SystemService;->publishBinderService(Ljava/lang/String;Landroid/os/IBinder;Z)V
@@ -4296,6 +4558,9 @@
 HSPLcom/android/server/TelephonyRegistry$2;-><init>(Lcom/android/server/TelephonyRegistry;)V
 HSPLcom/android/server/TelephonyRegistry$2;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
 HSPLcom/android/server/TelephonyRegistry$3;-><clinit>()V
+PLcom/android/server/TelephonyRegistry$ConfigurationProvider;-><init>()V
+PLcom/android/server/TelephonyRegistry$ConfigurationProvider;->getRegistrationLimit()I
+HPLcom/android/server/TelephonyRegistry$ConfigurationProvider;->lambda$getRegistrationLimit$0()Ljava/lang/Integer;
 HSPLcom/android/server/TelephonyRegistry$Record;-><init>()V
 HSPLcom/android/server/TelephonyRegistry$Record;-><init>(Lcom/android/server/TelephonyRegistry$1;)V
 HPLcom/android/server/TelephonyRegistry$Record;->canReadCallLog()Z
@@ -4307,6 +4572,7 @@
 HPLcom/android/server/TelephonyRegistry$TelephonyRegistryDeathRecipient;->binderDied()V
 HSPLcom/android/server/TelephonyRegistry;-><clinit>()V
 HSPLcom/android/server/TelephonyRegistry;-><init>(Landroid/content/Context;)V
+PLcom/android/server/TelephonyRegistry;-><init>(Landroid/content/Context;Lcom/android/server/TelephonyRegistry$ConfigurationProvider;)V
 HSPLcom/android/server/TelephonyRegistry;->access$000(Lcom/android/server/TelephonyRegistry;)Landroid/telephony/TelephonyManager;
 PLcom/android/server/TelephonyRegistry;->access$100(Lcom/android/server/TelephonyRegistry;)Landroid/telephony/TelephonyManager;
 PLcom/android/server/TelephonyRegistry;->access$100(Lcom/android/server/TelephonyRegistry;)[Landroid/os/Bundle;
@@ -4335,7 +4601,9 @@
 PLcom/android/server/TelephonyRegistry;->access$800(Lcom/android/server/TelephonyRegistry;)Landroid/util/LocalLog;
 HPLcom/android/server/TelephonyRegistry;->access$800(Lcom/android/server/TelephonyRegistry;Landroid/os/IBinder;)V
 HSPLcom/android/server/TelephonyRegistry;->access$900(Lcom/android/server/TelephonyRegistry;)Landroid/os/Handler;
+PLcom/android/server/TelephonyRegistry;->access$900(Lcom/android/server/TelephonyRegistry;Landroid/os/IBinder;)V
 HSPLcom/android/server/TelephonyRegistry;->add(Landroid/os/IBinder;)Lcom/android/server/TelephonyRegistry$Record;
+HPLcom/android/server/TelephonyRegistry;->add(Landroid/os/IBinder;IIZ)Lcom/android/server/TelephonyRegistry$Record;
 HPLcom/android/server/TelephonyRegistry;->addOnOpportunisticSubscriptionsChangedListener(Ljava/lang/String;Ljava/lang/String;Lcom/android/internal/telephony/IOnSubscriptionsChangedListener;)V
 HSPLcom/android/server/TelephonyRegistry;->addOnSubscriptionsChangedListener(Ljava/lang/String;Ljava/lang/String;Lcom/android/internal/telephony/IOnSubscriptionsChangedListener;)V
 HPLcom/android/server/TelephonyRegistry;->broadcastCallStateChanged(ILjava/lang/String;II)V
@@ -4384,6 +4652,7 @@
 HPLcom/android/server/TelephonyRegistry;->notifyDataConnectionForSubscriber(IIIZLjava/lang/String;Ljava/lang/String;Landroid/net/LinkProperties;Landroid/net/NetworkCapabilities;IZ)V
 HPLcom/android/server/TelephonyRegistry;->notifyDisconnectCause(IIII)V
 HPLcom/android/server/TelephonyRegistry;->notifyDisplayInfoChanged(IILandroid/telephony/DisplayInfo;)V
+HPLcom/android/server/TelephonyRegistry;->notifyDisplayInfoChanged(IILandroid/telephony/TelephonyDisplayInfo;)V
 HPLcom/android/server/TelephonyRegistry;->notifyEmergencyNumberList(II)V
 HPLcom/android/server/TelephonyRegistry;->notifyImsDisconnectCause(ILandroid/telephony/ims/ImsReasonInfo;)V
 HPLcom/android/server/TelephonyRegistry;->notifyMessageWaitingChangedForPhoneId(IIZ)V
@@ -4432,6 +4701,17 @@
 PLcom/android/server/UiModeManagerService$10;->setCustomNightModeStart(J)V
 PLcom/android/server/UiModeManagerService$10;->setNightMode(I)V
 PLcom/android/server/UiModeManagerService$10;->setNightModeActivated(Z)Z
+PLcom/android/server/UiModeManagerService$11;-><init>(Lcom/android/server/UiModeManagerService;)V
+PLcom/android/server/UiModeManagerService$11;->disableCarModeByCallingPackage(ILjava/lang/String;)V
+PLcom/android/server/UiModeManagerService$11;->dump(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V
+PLcom/android/server/UiModeManagerService$11;->enableCarMode(IILjava/lang/String;)V
+HPLcom/android/server/UiModeManagerService$11;->getCurrentModeType()I
+HPLcom/android/server/UiModeManagerService$11;->getNightMode()I
+PLcom/android/server/UiModeManagerService$11;->isNightModeLocked()Z
+PLcom/android/server/UiModeManagerService$11;->isUiModeLocked()Z
+PLcom/android/server/UiModeManagerService$11;->lambda$disableCarModeByCallingPackage$0(Ljava/lang/String;Ljava/util/Map$Entry;)Z
+PLcom/android/server/UiModeManagerService$11;->setNightMode(I)V
+PLcom/android/server/UiModeManagerService$11;->setNightModeActivated(Z)Z
 HSPLcom/android/server/UiModeManagerService$1;-><init>(Lcom/android/server/UiModeManagerService;)V
 PLcom/android/server/UiModeManagerService$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
 HSPLcom/android/server/UiModeManagerService$2;-><init>(Lcom/android/server/UiModeManagerService;)V
@@ -4467,6 +4747,7 @@
 PLcom/android/server/UiModeManagerService$Shell;->access$2900(I)Ljava/lang/String;
 PLcom/android/server/UiModeManagerService$Shell;->access$3000(I)Ljava/lang/String;
 PLcom/android/server/UiModeManagerService$Shell;->access$3200(I)Ljava/lang/String;
+PLcom/android/server/UiModeManagerService$Shell;->access$3300(I)Ljava/lang/String;
 PLcom/android/server/UiModeManagerService$Shell;->nightModeToStr(I)Ljava/lang/String;
 HSPLcom/android/server/UiModeManagerService$UserSwitchedReceiver;-><init>(Lcom/android/server/UiModeManagerService;)V
 HSPLcom/android/server/UiModeManagerService$UserSwitchedReceiver;-><init>(Lcom/android/server/UiModeManagerService;Lcom/android/server/UiModeManagerService$1;)V
@@ -4475,6 +4756,8 @@
 HSPLcom/android/server/UiModeManagerService;-><init>(Landroid/content/Context;)V
 PLcom/android/server/UiModeManagerService;->access$000(Lcom/android/server/UiModeManagerService;Ljava/lang/String;II)V
 PLcom/android/server/UiModeManagerService;->access$1000(Lcom/android/server/UiModeManagerService;)Z
+PLcom/android/server/UiModeManagerService;->access$1002(Lcom/android/server/UiModeManagerService;Z)Z
+PLcom/android/server/UiModeManagerService;->access$1100(Lcom/android/server/UiModeManagerService;)Landroid/database/ContentObserver;
 HSPLcom/android/server/UiModeManagerService;->access$1100(Lcom/android/server/UiModeManagerService;Landroid/content/Context;Landroid/content/res/Resources;I)Z
 HSPLcom/android/server/UiModeManagerService;->access$1200(Lcom/android/server/UiModeManagerService;Landroid/content/Context;Landroid/content/res/Resources;I)Z
 PLcom/android/server/UiModeManagerService;->access$1300()Ljava/lang/String;
@@ -4483,15 +4766,19 @@
 PLcom/android/server/UiModeManagerService;->access$1400(Lcom/android/server/UiModeManagerService;)Ljava/util/Map;
 PLcom/android/server/UiModeManagerService;->access$1500()Ljava/lang/String;
 PLcom/android/server/UiModeManagerService;->access$1500(Lcom/android/server/UiModeManagerService;)Ljava/util/Map;
+PLcom/android/server/UiModeManagerService;->access$1500(Lcom/android/server/UiModeManagerService;)V
 PLcom/android/server/UiModeManagerService;->access$1502(Lcom/android/server/UiModeManagerService;I)I
+PLcom/android/server/UiModeManagerService;->access$1600()Ljava/lang/String;
 PLcom/android/server/UiModeManagerService;->access$1600(Lcom/android/server/UiModeManagerService;)Ljava/util/Map;
 PLcom/android/server/UiModeManagerService;->access$1600(Lcom/android/server/UiModeManagerService;)V
 PLcom/android/server/UiModeManagerService;->access$1600(Lcom/android/server/UiModeManagerService;)Z
+PLcom/android/server/UiModeManagerService;->access$1700(Lcom/android/server/UiModeManagerService;)Ljava/util/Map;
 PLcom/android/server/UiModeManagerService;->access$1700(Lcom/android/server/UiModeManagerService;)V
 PLcom/android/server/UiModeManagerService;->access$1700(Lcom/android/server/UiModeManagerService;I)V
 PLcom/android/server/UiModeManagerService;->access$1702(Lcom/android/server/UiModeManagerService;I)I
 PLcom/android/server/UiModeManagerService;->access$1800(Lcom/android/server/UiModeManagerService;)Z
 PLcom/android/server/UiModeManagerService;->access$1802(Lcom/android/server/UiModeManagerService;I)I
+PLcom/android/server/UiModeManagerService;->access$1900(Lcom/android/server/UiModeManagerService;)V
 PLcom/android/server/UiModeManagerService;->access$1900(Lcom/android/server/UiModeManagerService;)Z
 PLcom/android/server/UiModeManagerService;->access$1900(Lcom/android/server/UiModeManagerService;I)V
 PLcom/android/server/UiModeManagerService;->access$2000(Lcom/android/server/UiModeManagerService;)Z
@@ -4499,11 +4786,13 @@
 HSPLcom/android/server/UiModeManagerService;->access$202(Lcom/android/server/UiModeManagerService;Z)Z
 PLcom/android/server/UiModeManagerService;->access$2100(Lcom/android/server/UiModeManagerService;)V
 PLcom/android/server/UiModeManagerService;->access$2100(Lcom/android/server/UiModeManagerService;)Z
+PLcom/android/server/UiModeManagerService;->access$2100(Lcom/android/server/UiModeManagerService;I)V
 PLcom/android/server/UiModeManagerService;->access$2200(Lcom/android/server/UiModeManagerService;)V
 PLcom/android/server/UiModeManagerService;->access$2200(Lcom/android/server/UiModeManagerService;)Z
 PLcom/android/server/UiModeManagerService;->access$2300(Lcom/android/server/UiModeManagerService;)Z
 PLcom/android/server/UiModeManagerService;->access$2400(Lcom/android/server/UiModeManagerService;)Landroid/content/res/Configuration;
 PLcom/android/server/UiModeManagerService;->access$2400(Lcom/android/server/UiModeManagerService;)V
+PLcom/android/server/UiModeManagerService;->access$2400(Lcom/android/server/UiModeManagerService;)Z
 PLcom/android/server/UiModeManagerService;->access$2500(Lcom/android/server/UiModeManagerService;)V
 PLcom/android/server/UiModeManagerService;->access$2600(Lcom/android/server/UiModeManagerService;)Ljava/time/LocalTime;
 PLcom/android/server/UiModeManagerService;->access$2600(Lcom/android/server/UiModeManagerService;)V
@@ -4511,12 +4800,15 @@
 PLcom/android/server/UiModeManagerService;->access$2700(Lcom/android/server/UiModeManagerService;)Ljava/time/LocalTime;
 PLcom/android/server/UiModeManagerService;->access$2700(Lcom/android/server/UiModeManagerService;I)V
 PLcom/android/server/UiModeManagerService;->access$2800(Lcom/android/server/UiModeManagerService;)Ljava/time/LocalTime;
+PLcom/android/server/UiModeManagerService;->access$2800(Lcom/android/server/UiModeManagerService;)V
 PLcom/android/server/UiModeManagerService;->access$2802(Lcom/android/server/UiModeManagerService;Ljava/time/LocalTime;)Ljava/time/LocalTime;
 PLcom/android/server/UiModeManagerService;->access$2900(Lcom/android/server/UiModeManagerService;)Ljava/time/LocalTime;
+PLcom/android/server/UiModeManagerService;->access$2900(Lcom/android/server/UiModeManagerService;)V
 PLcom/android/server/UiModeManagerService;->access$300(Lcom/android/server/UiModeManagerService;)I
 PLcom/android/server/UiModeManagerService;->access$3000(Lcom/android/server/UiModeManagerService;)Landroid/content/res/Configuration;
 PLcom/android/server/UiModeManagerService;->access$302(Lcom/android/server/UiModeManagerService;I)I
 PLcom/android/server/UiModeManagerService;->access$3100(Lcom/android/server/UiModeManagerService;)Landroid/content/res/Configuration;
+PLcom/android/server/UiModeManagerService;->access$3400(Lcom/android/server/UiModeManagerService;)Landroid/content/res/Configuration;
 PLcom/android/server/UiModeManagerService;->access$400(Lcom/android/server/UiModeManagerService;)Z
 PLcom/android/server/UiModeManagerService;->access$500(Lcom/android/server/UiModeManagerService;)V
 PLcom/android/server/UiModeManagerService;->access$600(Lcom/android/server/UiModeManagerService;)V
@@ -4535,6 +4827,7 @@
 HSPLcom/android/server/UiModeManagerService;->initPowerSave()V
 PLcom/android/server/UiModeManagerService;->isCarModeEnabled()Z
 HSPLcom/android/server/UiModeManagerService;->isDeskDockState(I)Z
+PLcom/android/server/UiModeManagerService;->lambda$initPowerSave$2$UiModeManagerService(Landroid/os/PowerSaveState;)V
 PLcom/android/server/UiModeManagerService;->lambda$initPowerSave$3$UiModeManagerService(Landroid/os/PowerSaveState;)V
 PLcom/android/server/UiModeManagerService;->lambda$new$0$UiModeManagerService()V
 PLcom/android/server/UiModeManagerService;->lambda$onStart$0$UiModeManagerService(Landroid/os/PowerSaveState;)V
@@ -4552,6 +4845,7 @@
 PLcom/android/server/UiModeManagerService;->registerScreenOffEvent()V
 HPLcom/android/server/UiModeManagerService;->registerTimeChangeEvent()V
 HSPLcom/android/server/UiModeManagerService;->registerVrStateListener()V
+PLcom/android/server/UiModeManagerService;->resetNightModeOverrideLocked()V
 HPLcom/android/server/UiModeManagerService;->scheduleNextCustomTimeListener()V
 HSPLcom/android/server/UiModeManagerService;->sendConfigurationAndStartDreamOrDockAppLocked(Ljava/lang/String;)V
 PLcom/android/server/UiModeManagerService;->setCarModeLocked(ZIILjava/lang/String;)V
@@ -4777,11 +5071,13 @@
 HSPLcom/android/server/WiredAccessoryManager$WiredAccessoryObserver$UEventInfo;->checkSwitchExists()Z
 HSPLcom/android/server/WiredAccessoryManager$WiredAccessoryObserver$UEventInfo;->getSwitchStatePath()Ljava/lang/String;
 HSPLcom/android/server/WiredAccessoryManager$WiredAccessoryObserver;-><init>(Lcom/android/server/WiredAccessoryManager;)V
+PLcom/android/server/WiredAccessoryManager$WiredAccessoryObserver;->init()V
 HSPLcom/android/server/WiredAccessoryManager$WiredAccessoryObserver;->makeObservedUEventList()Ljava/util/List;
 HSPLcom/android/server/WiredAccessoryManager;-><clinit>()V
 HSPLcom/android/server/WiredAccessoryManager;-><init>(Landroid/content/Context;Lcom/android/server/input/InputManagerService;)V
 HSPLcom/android/server/WiredAccessoryManager;->access$200(Lcom/android/server/WiredAccessoryManager;)Landroid/os/PowerManager$WakeLock;
 HSPLcom/android/server/WiredAccessoryManager;->access$300(Lcom/android/server/WiredAccessoryManager;)V
+PLcom/android/server/WiredAccessoryManager;->access$400(Lcom/android/server/WiredAccessoryManager;)Ljava/lang/Object;
 HSPLcom/android/server/WiredAccessoryManager;->access$500()Ljava/lang/String;
 HSPLcom/android/server/WiredAccessoryManager;->access$600(Lcom/android/server/WiredAccessoryManager;)Z
 PLcom/android/server/WiredAccessoryManager;->notifyWiredAccessoryChanged(JII)V
@@ -4807,6 +5103,7 @@
 PLcom/android/server/accessibility/-$$Lambda$AbiCM6mjSOPpIPMT9CFGL4UAcKY;-><init>()V
 PLcom/android/server/accessibility/-$$Lambda$AbiCM6mjSOPpIPMT9CFGL4UAcKY;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
 PLcom/android/server/accessibility/-$$Lambda$AccessibilityManagerService$1$49HMbWlhAK8DBFFzhu5wH_-EQaM;-><init>(Ljava/lang/String;)V
+PLcom/android/server/accessibility/-$$Lambda$AccessibilityManagerService$1$49HMbWlhAK8DBFFzhu5wH_-EQaM;->test(Ljava/lang/Object;)Z
 PLcom/android/server/accessibility/-$$Lambda$AccessibilityManagerService$1$J4pGG-UiTxhxH1VLNWBa7KLTh48;-><init>(Ljava/lang/String;)V
 PLcom/android/server/accessibility/-$$Lambda$AccessibilityManagerService$1$J4pGG-UiTxhxH1VLNWBa7KLTh48;->test(Ljava/lang/Object;)Z
 HSPLcom/android/server/accessibility/-$$Lambda$AccessibilityManagerService$4A2E7YnYuU3-mDj4eBvmxi8PEpA;-><clinit>()V
@@ -4853,6 +5150,7 @@
 HSPLcom/android/server/accessibility/-$$Lambda$AccessibilityManagerService$ifdWn5KwwehtrFVplnBr1oDsgh8;->acceptOrThrow(Ljava/lang/Object;)V
 PLcom/android/server/accessibility/-$$Lambda$AccessibilityManagerService$j2QeVWedl6n56ZCByHdIyOcYsHw;-><clinit>()V
 PLcom/android/server/accessibility/-$$Lambda$AccessibilityManagerService$j2QeVWedl6n56ZCByHdIyOcYsHw;-><init>()V
+PLcom/android/server/accessibility/-$$Lambda$AccessibilityManagerService$j2QeVWedl6n56ZCByHdIyOcYsHw;->apply(Ljava/lang/Object;)Ljava/lang/Object;
 HSPLcom/android/server/accessibility/-$$Lambda$AccessibilityManagerService$luI_C3QiJWsM08i8m3lx484SyyY;-><clinit>()V
 HSPLcom/android/server/accessibility/-$$Lambda$AccessibilityManagerService$luI_C3QiJWsM08i8m3lx484SyyY;-><init>()V
 HSPLcom/android/server/accessibility/-$$Lambda$AccessibilityManagerService$luI_C3QiJWsM08i8m3lx484SyyY;->accept(Ljava/lang/Object;Ljava/lang/Object;)V
@@ -4997,6 +5295,7 @@
 PLcom/android/server/accessibility/AccessibilityInputFilter;->resetStreamState()V
 PLcom/android/server/accessibility/AccessibilityInputFilter;->setUserAndEnabledFeatures(II)V
 HSPLcom/android/server/accessibility/AccessibilityManagerService$1;-><init>(Lcom/android/server/accessibility/AccessibilityManagerService;)V
+PLcom/android/server/accessibility/AccessibilityManagerService$1;->lambda$onPackageUpdateFinished$0(Ljava/lang/String;Landroid/content/ComponentName;)Z
 PLcom/android/server/accessibility/AccessibilityManagerService$1;->lambda$onPackageUpdateFinished$1(Ljava/lang/String;Landroid/content/ComponentName;)Z
 PLcom/android/server/accessibility/AccessibilityManagerService$1;->onHandleForceStop(Landroid/content/Intent;[Ljava/lang/String;IZ)Z
 HSPLcom/android/server/accessibility/AccessibilityManagerService$1;->onPackageRemoved(Ljava/lang/String;I)V
@@ -5071,6 +5370,7 @@
 HPLcom/android/server/accessibility/AccessibilityManagerService;->addAccessibilityInteractionConnection(Landroid/view/IWindow;Landroid/view/accessibility/IAccessibilityInteractionConnection;Ljava/lang/String;I)I
 HSPLcom/android/server/accessibility/AccessibilityManagerService;->addClient(Landroid/view/accessibility/IAccessibilityManagerClient;I)J
 PLcom/android/server/accessibility/AccessibilityManagerService;->announceNewUserIfNeeded()V
+PLcom/android/server/accessibility/AccessibilityManagerService;->associateEmbeddedHierarchy(Landroid/os/IBinder;Landroid/os/IBinder;)V
 HSPLcom/android/server/accessibility/AccessibilityManagerService;->broadcastToClients(Lcom/android/server/accessibility/AccessibilityUserState;Ljava/util/function/Consumer;)V
 PLcom/android/server/accessibility/AccessibilityManagerService;->canRequestAndRequestsTouchExplorationLocked(Lcom/android/server/accessibility/AccessibilityServiceConnection;Lcom/android/server/accessibility/AccessibilityUserState;)Z
 HSPLcom/android/server/accessibility/AccessibilityManagerService;->computeRelevantEventTypesLocked(Lcom/android/server/accessibility/AccessibilityUserState;Lcom/android/server/accessibility/AccessibilityManagerService$Client;)I
@@ -5092,6 +5392,7 @@
 PLcom/android/server/accessibility/AccessibilityManagerService;->getPendingIntentActivity(Landroid/content/Context;ILandroid/content/Intent;I)Landroid/app/PendingIntent;
 HSPLcom/android/server/accessibility/AccessibilityManagerService;->getRecommendedTimeoutMillis()J
 HSPLcom/android/server/accessibility/AccessibilityManagerService;->getRecommendedTimeoutMillisLocked(Lcom/android/server/accessibility/AccessibilityUserState;)J
+PLcom/android/server/accessibility/AccessibilityManagerService;->getSystemActionPerformer()Lcom/android/server/accessibility/SystemActionPerformer;
 HSPLcom/android/server/accessibility/AccessibilityManagerService;->getUserState(I)Lcom/android/server/accessibility/AccessibilityUserState;
 HSPLcom/android/server/accessibility/AccessibilityManagerService;->getUserStateLocked(I)Lcom/android/server/accessibility/AccessibilityUserState;
 HSPLcom/android/server/accessibility/AccessibilityManagerService;->getValidDisplayList()Ljava/util/ArrayList;
@@ -5115,6 +5416,7 @@
 HPLcom/android/server/accessibility/AccessibilityManagerService;->lambda$readComponentNamesFromSettingLocked$2(Ljava/lang/String;)Landroid/content/ComponentName;
 HSPLcom/android/server/accessibility/AccessibilityManagerService;->lambda$sendStateToClients$5(ILandroid/view/accessibility/IAccessibilityManagerClient;)V
 PLcom/android/server/accessibility/AccessibilityManagerService;->lambda$updateAccessibilityButtonTargetsLocked$11(Lcom/android/server/accessibility/AccessibilityUserState;Ljava/lang/String;)Z
+PLcom/android/server/accessibility/AccessibilityManagerService;->lambda$updateAccessibilityShortcutKeyTargetsLocked$10(Ljava/lang/String;)Ljava/lang/String;
 HSPLcom/android/server/accessibility/AccessibilityManagerService;->lambda$updateAccessibilityShortcutKeyTargetsLocked$9(Lcom/android/server/accessibility/AccessibilityUserState;Ljava/lang/String;)Z
 HSPLcom/android/server/accessibility/AccessibilityManagerService;->lambda$updateRelevantEventsLocked$0$AccessibilityManagerService(Lcom/android/server/accessibility/AccessibilityUserState;Lcom/android/server/accessibility/AccessibilityManagerService$Client;)V
 HSPLcom/android/server/accessibility/AccessibilityManagerService;->lambda$updateRelevantEventsLocked$1$AccessibilityManagerService(Lcom/android/server/accessibility/AccessibilityUserState;)V
@@ -5188,7 +5490,7 @@
 PLcom/android/server/accessibility/AccessibilityManagerService;->showAccessibilityTargetsSelection(II)V
 HSPLcom/android/server/accessibility/AccessibilityManagerService;->switchUser(I)V
 PLcom/android/server/accessibility/AccessibilityManagerService;->unlockUser(I)V
-PLcom/android/server/accessibility/AccessibilityManagerService;->unregisterSystemAction(I)V
+HPLcom/android/server/accessibility/AccessibilityManagerService;->unregisterSystemAction(I)V
 PLcom/android/server/accessibility/AccessibilityManagerService;->unregisterUiTestAutomationService(Landroid/accessibilityservice/IAccessibilityServiceClient;)V
 HSPLcom/android/server/accessibility/AccessibilityManagerService;->updateAccessibilityButtonTargetsLocked(Lcom/android/server/accessibility/AccessibilityUserState;)V
 HSPLcom/android/server/accessibility/AccessibilityManagerService;->updateAccessibilityEnabledSettingLocked(Lcom/android/server/accessibility/AccessibilityUserState;)V
@@ -5349,6 +5651,8 @@
 PLcom/android/server/accessibility/AccessibilityWindowManager;->access$900(Lcom/android/server/accessibility/AccessibilityWindowManager;)Z
 HPLcom/android/server/accessibility/AccessibilityWindowManager;->addAccessibilityInteractionConnection(Landroid/view/IWindow;Landroid/os/IBinder;Landroid/view/accessibility/IAccessibilityInteractionConnection;Ljava/lang/String;I)I
 HPLcom/android/server/accessibility/AccessibilityWindowManager;->addAccessibilityInteractionConnection(Landroid/view/IWindow;Landroid/view/accessibility/IAccessibilityInteractionConnection;Ljava/lang/String;I)I
+PLcom/android/server/accessibility/AccessibilityWindowManager;->associateEmbeddedHierarchyLocked(Landroid/os/IBinder;Landroid/os/IBinder;)V
+PLcom/android/server/accessibility/AccessibilityWindowManager;->associateLocked(Landroid/os/IBinder;Landroid/os/IBinder;)V
 PLcom/android/server/accessibility/AccessibilityWindowManager;->clearAccessibilityFocusLocked(I)V
 HPLcom/android/server/accessibility/AccessibilityWindowManager;->clearAccessibilityFocusMainThread(II)V
 HPLcom/android/server/accessibility/AccessibilityWindowManager;->computePartialInteractiveRegionForWindowLocked(ILandroid/graphics/Region;)Z
@@ -5506,9 +5810,9 @@
 HPLcom/android/server/accessibility/MagnificationController$ControllerContext;->getAms()Lcom/android/server/accessibility/AccessibilityManagerService;
 PLcom/android/server/accessibility/MagnificationController$ControllerContext;->getAnimationDuration()J
 PLcom/android/server/accessibility/MagnificationController$ControllerContext;->getContext()Landroid/content/Context;
-PLcom/android/server/accessibility/MagnificationController$ControllerContext;->getHandler()Landroid/os/Handler;
+HPLcom/android/server/accessibility/MagnificationController$ControllerContext;->getHandler()Landroid/os/Handler;
 PLcom/android/server/accessibility/MagnificationController$ControllerContext;->getMagnificationScale(I)F
-PLcom/android/server/accessibility/MagnificationController$ControllerContext;->getWindowManager()Lcom/android/server/wm/WindowManagerInternal;
+HPLcom/android/server/accessibility/MagnificationController$ControllerContext;->getWindowManager()Lcom/android/server/wm/WindowManagerInternal;
 PLcom/android/server/accessibility/MagnificationController$ControllerContext;->newValueAnimator()Landroid/animation/ValueAnimator;
 PLcom/android/server/accessibility/MagnificationController$ControllerContext;->putMagnificationScale(FI)V
 PLcom/android/server/accessibility/MagnificationController$DisplayMagnification;-><init>(Lcom/android/server/accessibility/MagnificationController;I)V
@@ -5527,7 +5831,7 @@
 PLcom/android/server/accessibility/MagnificationController$DisplayMagnification;->getSentOffsetX()F
 PLcom/android/server/accessibility/MagnificationController$DisplayMagnification;->getSentOffsetY()F
 PLcom/android/server/accessibility/MagnificationController$DisplayMagnification;->getSentScale()F
-PLcom/android/server/accessibility/MagnificationController$DisplayMagnification;->isMagnifying()Z
+HPLcom/android/server/accessibility/MagnificationController$DisplayMagnification;->isMagnifying()Z
 PLcom/android/server/accessibility/MagnificationController$DisplayMagnification;->isRegistered()Z
 HPLcom/android/server/accessibility/MagnificationController$DisplayMagnification;->magnificationRegionContains(FF)Z
 HPLcom/android/server/accessibility/MagnificationController$DisplayMagnification;->offsetMagnifiedRegion(FFI)V
@@ -5601,7 +5905,7 @@
 HSPLcom/android/server/accessibility/SystemActionPerformer;-><init>(Landroid/content/Context;Lcom/android/server/wm/WindowManagerInternal;Ljava/util/function/Supplier;Lcom/android/server/accessibility/SystemActionPerformer$SystemActionsChangedListener;)V
 PLcom/android/server/accessibility/SystemActionPerformer;->performSystemAction(I)Z
 HPLcom/android/server/accessibility/SystemActionPerformer;->registerSystemAction(ILandroid/app/RemoteAction;)V
-PLcom/android/server/accessibility/SystemActionPerformer;->unregisterSystemAction(I)V
+HPLcom/android/server/accessibility/SystemActionPerformer;->unregisterSystemAction(I)V
 HSPLcom/android/server/accessibility/UiAutomationManager$1;-><init>(Lcom/android/server/accessibility/UiAutomationManager;)V
 PLcom/android/server/accessibility/UiAutomationManager$UiAutomationService;-><init>(Lcom/android/server/accessibility/UiAutomationManager;Landroid/content/Context;Landroid/accessibilityservice/AccessibilityServiceInfo;ILandroid/os/Handler;Ljava/lang/Object;Lcom/android/server/accessibility/AccessibilitySecurityPolicy;Lcom/android/server/accessibility/AbstractAccessibilityServiceConnection$SystemSupport;Lcom/android/server/wm/WindowManagerInternal;Lcom/android/server/accessibility/SystemActionPerformer;Lcom/android/server/accessibility/AccessibilityWindowManager;)V
 PLcom/android/server/accessibility/UiAutomationManager$UiAutomationService;->connectServiceUnknownThread()V
@@ -5669,6 +5973,7 @@
 PLcom/android/server/accessibility/gestures/GestureUtils;->isTimedOut(Landroid/view/MotionEvent;Landroid/view/MotionEvent;I)Z
 PLcom/android/server/accessibility/gestures/MultiFingerMultiTap;-><init>(Landroid/content/Context;IIILcom/android/server/accessibility/gestures/GestureMatcher$StateChangeListener;)V
 PLcom/android/server/accessibility/gestures/MultiFingerMultiTap;->clear()V
+PLcom/android/server/accessibility/gestures/MultiFingerMultiTapAndHold;-><init>(Landroid/content/Context;IIILcom/android/server/accessibility/gestures/GestureMatcher$StateChangeListener;)V
 PLcom/android/server/accessibility/gestures/MultiFingerSwipe;-><init>(Landroid/content/Context;IIILcom/android/server/accessibility/gestures/GestureMatcher$StateChangeListener;)V
 PLcom/android/server/accessibility/gestures/MultiFingerSwipe;->clear()V
 PLcom/android/server/accessibility/gestures/MultiTap;-><init>(Landroid/content/Context;IILcom/android/server/accessibility/gestures/GestureMatcher$StateChangeListener;)V
@@ -5712,6 +6017,7 @@
 PLcom/android/server/accessibility/gestures/TouchExplorer$SendAccessibilityEventDelayed;->run()V
 PLcom/android/server/accessibility/gestures/TouchExplorer$SendHoverEnterAndMoveDelayed;-><init>(Lcom/android/server/accessibility/gestures/TouchExplorer;)V
 PLcom/android/server/accessibility/gestures/TouchExplorer$SendHoverEnterAndMoveDelayed;->access$100(Lcom/android/server/accessibility/gestures/TouchExplorer$SendHoverEnterAndMoveDelayed;)Z
+HPLcom/android/server/accessibility/gestures/TouchExplorer$SendHoverEnterAndMoveDelayed;->access$200(Lcom/android/server/accessibility/gestures/TouchExplorer$SendHoverEnterAndMoveDelayed;)Z
 HPLcom/android/server/accessibility/gestures/TouchExplorer$SendHoverEnterAndMoveDelayed;->addEvent(Landroid/view/MotionEvent;Landroid/view/MotionEvent;)V
 HPLcom/android/server/accessibility/gestures/TouchExplorer$SendHoverEnterAndMoveDelayed;->cancel()V
 HPLcom/android/server/accessibility/gestures/TouchExplorer$SendHoverEnterAndMoveDelayed;->clear()V
@@ -5719,6 +6025,7 @@
 PLcom/android/server/accessibility/gestures/TouchExplorer$SendHoverEnterAndMoveDelayed;->post(Landroid/view/MotionEvent;Landroid/view/MotionEvent;II)V
 HPLcom/android/server/accessibility/gestures/TouchExplorer$SendHoverEnterAndMoveDelayed;->run()V
 PLcom/android/server/accessibility/gestures/TouchExplorer$SendHoverExitDelayed;-><init>(Lcom/android/server/accessibility/gestures/TouchExplorer;)V
+PLcom/android/server/accessibility/gestures/TouchExplorer$SendHoverExitDelayed;->access$100(Lcom/android/server/accessibility/gestures/TouchExplorer$SendHoverExitDelayed;)Z
 PLcom/android/server/accessibility/gestures/TouchExplorer$SendHoverExitDelayed;->cancel()V
 PLcom/android/server/accessibility/gestures/TouchExplorer$SendHoverExitDelayed;->clear()V
 HPLcom/android/server/accessibility/gestures/TouchExplorer$SendHoverExitDelayed;->isPending()Z
@@ -5727,10 +6034,14 @@
 PLcom/android/server/accessibility/gestures/TouchExplorer;-><init>(Landroid/content/Context;Lcom/android/server/accessibility/AccessibilityManagerService;)V
 PLcom/android/server/accessibility/gestures/TouchExplorer;-><init>(Landroid/content/Context;Lcom/android/server/accessibility/AccessibilityManagerService;Lcom/android/server/accessibility/gestures/GestureManifold;)V
 PLcom/android/server/accessibility/gestures/TouchExplorer;->access$200(Lcom/android/server/accessibility/gestures/TouchExplorer;)Landroid/os/Handler;
+HPLcom/android/server/accessibility/gestures/TouchExplorer;->access$300(Lcom/android/server/accessibility/gestures/TouchExplorer;)Landroid/os/Handler;
 PLcom/android/server/accessibility/gestures/TouchExplorer;->access$300(Lcom/android/server/accessibility/gestures/TouchExplorer;)Lcom/android/server/accessibility/gestures/EventDispatcher;
+PLcom/android/server/accessibility/gestures/TouchExplorer;->access$400(Lcom/android/server/accessibility/gestures/TouchExplorer;)Lcom/android/server/accessibility/gestures/EventDispatcher;
 PLcom/android/server/accessibility/gestures/TouchExplorer;->access$500(Lcom/android/server/accessibility/gestures/TouchExplorer;)I
+PLcom/android/server/accessibility/gestures/TouchExplorer;->access$600(Lcom/android/server/accessibility/gestures/TouchExplorer;)I
 PLcom/android/server/accessibility/gestures/TouchExplorer;->access$600(Lcom/android/server/accessibility/gestures/TouchExplorer;)Lcom/android/server/accessibility/gestures/TouchExplorer$SendAccessibilityEventDelayed;
 PLcom/android/server/accessibility/gestures/TouchExplorer;->access$700(Lcom/android/server/accessibility/gestures/TouchExplorer;)Lcom/android/server/accessibility/gestures/TouchExplorer$SendAccessibilityEventDelayed;
+PLcom/android/server/accessibility/gestures/TouchExplorer;->access$800(Lcom/android/server/accessibility/gestures/TouchExplorer;)Lcom/android/server/accessibility/gestures/TouchExplorer$SendAccessibilityEventDelayed;
 HPLcom/android/server/accessibility/gestures/TouchExplorer;->adjustEventLocationForDrag(Landroid/view/MotionEvent;)V
 PLcom/android/server/accessibility/gestures/TouchExplorer;->clear()V
 PLcom/android/server/accessibility/gestures/TouchExplorer;->clearEvents(I)V
@@ -5756,7 +6067,9 @@
 HPLcom/android/server/accessibility/gestures/TouchExplorer;->onMotionEvent(Landroid/view/MotionEvent;Landroid/view/MotionEvent;I)V
 PLcom/android/server/accessibility/gestures/TouchExplorer;->sendHoverExitAndTouchExplorationGestureEndIfNeeded(I)V
 HPLcom/android/server/accessibility/gestures/TouchExplorer;->sendTouchExplorationGestureStartAndHoverEnterIfNeeded(I)V
+PLcom/android/server/accessibility/gestures/TouchExplorer;->sendsPendingA11yEventsIfNeed()V
 PLcom/android/server/accessibility/gestures/TouchExplorer;->setNext(Lcom/android/server/accessibility/EventStreamTransformation;)V
+HPLcom/android/server/accessibility/gestures/TouchExplorer;->shouldPerformGestureDetection(Landroid/view/MotionEvent;)Z
 HPLcom/android/server/accessibility/gestures/TouchState$PointerDownInfo;-><init>(Lcom/android/server/accessibility/gestures/TouchState;)V
 PLcom/android/server/accessibility/gestures/TouchState$PointerDownInfo;->access$000(Lcom/android/server/accessibility/gestures/TouchState$PointerDownInfo;)F
 PLcom/android/server/accessibility/gestures/TouchState$PointerDownInfo;->access$100(Lcom/android/server/accessibility/gestures/TouchState$PointerDownInfo;)F
@@ -6034,6 +6347,7 @@
 HSPLcom/android/server/accounts/AccountManagerService;->lambda$new$0$AccountManagerService(I)V
 PLcom/android/server/accounts/AccountManagerService;->lambda$onUnlockUser$1$AccountManagerService(I)V
 PLcom/android/server/accounts/AccountManagerService;->lambda$removeAccountInternal$2$AccountManagerService(Landroid/accounts/Account;I)V
+PLcom/android/server/accounts/AccountManagerService;->logRecord(Lcom/android/server/accounts/AccountManagerService$UserAccounts;Ljava/lang/String;Ljava/lang/String;)V
 PLcom/android/server/accounts/AccountManagerService;->logRecord(Ljava/lang/String;Ljava/lang/String;JLcom/android/server/accounts/AccountManagerService$UserAccounts;)V
 PLcom/android/server/accounts/AccountManagerService;->logRecord(Ljava/lang/String;Ljava/lang/String;JLcom/android/server/accounts/AccountManagerService$UserAccounts;I)V
 PLcom/android/server/accounts/AccountManagerService;->logRecordWithUid(Lcom/android/server/accounts/AccountManagerService$UserAccounts;Ljava/lang/String;Ljava/lang/String;I)V
@@ -6194,6 +6508,9 @@
 PLcom/android/server/adb/-$$Lambda$AdbService$AdbManagerInternalImpl$eYI_FNtHA7A5dnyLFnC4mhwBDEo;-><clinit>()V
 PLcom/android/server/adb/-$$Lambda$AdbService$AdbManagerInternalImpl$eYI_FNtHA7A5dnyLFnC4mhwBDEo;-><init>()V
 PLcom/android/server/adb/-$$Lambda$AdbService$AdbManagerInternalImpl$eYI_FNtHA7A5dnyLFnC4mhwBDEo;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/adb/-$$Lambda$AdbService$AdbManagerInternalImpl$jgrEiL2yPVkymVh0sKSMHbmTnmY;-><clinit>()V
+PLcom/android/server/adb/-$$Lambda$AdbService$AdbManagerInternalImpl$jgrEiL2yPVkymVh0sKSMHbmTnmY;-><init>()V
+PLcom/android/server/adb/-$$Lambda$AdbService$AdbManagerInternalImpl$jgrEiL2yPVkymVh0sKSMHbmTnmY;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
 PLcom/android/server/adb/-$$Lambda$AdbService$AdbSettingsObserver$RoyT5Mqx9S17cRYS-VTdgg8I7zc;-><clinit>()V
 PLcom/android/server/adb/-$$Lambda$AdbService$AdbSettingsObserver$RoyT5Mqx9S17cRYS-VTdgg8I7zc;-><init>()V
 PLcom/android/server/adb/-$$Lambda$AdbService$AdbSettingsObserver$RoyT5Mqx9S17cRYS-VTdgg8I7zc;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
@@ -6204,16 +6521,24 @@
 PLcom/android/server/adb/-$$Lambda$snZvZtOkSiN_ZXrW9Ua-AMDz9HU;-><init>()V
 PLcom/android/server/adb/-$$Lambda$snZvZtOkSiN_ZXrW9Ua-AMDz9HU;->accept(Ljava/lang/Object;)V
 PLcom/android/server/adb/AdbDebuggingManager$AdbConnectionInfo;-><init>(Lcom/android/server/adb/AdbDebuggingManager;)V
+PLcom/android/server/adb/AdbDebuggingManager$AdbConnectionInfo;-><init>(Lcom/android/server/adb/AdbDebuggingManager;Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/adb/AdbDebuggingManager$AdbConnectionInfo;->getBSSID()Ljava/lang/String;
+PLcom/android/server/adb/AdbDebuggingManager$AdbConnectionInfo;->getSSID()Ljava/lang/String;
 PLcom/android/server/adb/AdbDebuggingManager$AdbDebuggingHandler$1;-><init>(Lcom/android/server/adb/AdbDebuggingManager$AdbDebuggingHandler;)V
 HSPLcom/android/server/adb/AdbDebuggingManager$AdbDebuggingHandler$1;-><init>(Lcom/android/server/adb/AdbDebuggingManager$AdbDebuggingHandler;Landroid/os/Handler;)V
 PLcom/android/server/adb/AdbDebuggingManager$AdbDebuggingHandler$2;-><init>(Lcom/android/server/adb/AdbDebuggingManager$AdbDebuggingHandler;Landroid/os/Handler;)V
+PLcom/android/server/adb/AdbDebuggingManager$AdbDebuggingHandler$2;->onChange(ZLandroid/net/Uri;)V
 HSPLcom/android/server/adb/AdbDebuggingManager$AdbDebuggingHandler;-><init>(Lcom/android/server/adb/AdbDebuggingManager;Landroid/os/Looper;)V
 PLcom/android/server/adb/AdbDebuggingManager$AdbDebuggingHandler;->cancelJobToUpdateAdbKeyStore()V
+PLcom/android/server/adb/AdbDebuggingManager$AdbDebuggingHandler;->getCurrentWifiApInfo()Lcom/android/server/adb/AdbDebuggingManager$AdbConnectionInfo;
 PLcom/android/server/adb/AdbDebuggingManager$AdbDebuggingHandler;->handleMessage(Landroid/os/Message;)V
-PLcom/android/server/adb/AdbDebuggingManager$AdbDebuggingHandler;->logAdbConnectionChanged(Ljava/lang/String;IZ)V
+HPLcom/android/server/adb/AdbDebuggingManager$AdbDebuggingHandler;->logAdbConnectionChanged(Ljava/lang/String;IZ)V
 PLcom/android/server/adb/AdbDebuggingManager$AdbDebuggingHandler;->registerForAuthTimeChanges()V
 PLcom/android/server/adb/AdbDebuggingManager$AdbDebuggingHandler;->scheduleJobToUpdateAdbKeyStore()J
+PLcom/android/server/adb/AdbDebuggingManager$AdbDebuggingHandler;->sendServerConnectionState(ZI)V
 PLcom/android/server/adb/AdbDebuggingManager$AdbDebuggingHandler;->startAdbDebuggingThread()V
+PLcom/android/server/adb/AdbDebuggingManager$AdbDebuggingHandler;->stopAdbDebuggingThread()V
+PLcom/android/server/adb/AdbDebuggingManager$AdbDebuggingHandler;->verifyWifiNetwork(Ljava/lang/String;Ljava/lang/String;)Z
 PLcom/android/server/adb/AdbDebuggingManager$AdbDebuggingThread;-><init>(Lcom/android/server/adb/AdbDebuggingManager;)V
 PLcom/android/server/adb/AdbDebuggingManager$AdbDebuggingThread;->closeSocketLocked()V
 PLcom/android/server/adb/AdbDebuggingManager$AdbDebuggingThread;->listenToSocket()V
@@ -6235,6 +6560,7 @@
 PLcom/android/server/adb/AdbDebuggingManager$AdbKeyStore;->init()V
 PLcom/android/server/adb/AdbDebuggingManager$AdbKeyStore;->initKeyFile()V
 PLcom/android/server/adb/AdbDebuggingManager$AdbKeyStore;->isEmpty()Z
+PLcom/android/server/adb/AdbDebuggingManager$AdbKeyStore;->isTrustedNetwork(Ljava/lang/String;)Z
 PLcom/android/server/adb/AdbDebuggingManager$AdbKeyStore;->persistKeyStore()V
 PLcom/android/server/adb/AdbDebuggingManager$AdbKeyStore;->setLastConnectionTime(Ljava/lang/String;J)V
 PLcom/android/server/adb/AdbDebuggingManager$AdbKeyStore;->setLastConnectionTime(Ljava/lang/String;JZ)V
@@ -6245,13 +6571,19 @@
 PLcom/android/server/adb/AdbDebuggingManager;->access$000(Lcom/android/server/adb/AdbDebuggingManager;)Landroid/os/Handler;
 PLcom/android/server/adb/AdbDebuggingManager;->access$100(Lcom/android/server/adb/AdbDebuggingManager;)Landroid/os/Handler;
 PLcom/android/server/adb/AdbDebuggingManager;->access$100(Lcom/android/server/adb/AdbDebuggingManager;)Lcom/android/server/adb/AdbDebuggingManager$AdbDebuggingThread;
+PLcom/android/server/adb/AdbDebuggingManager;->access$1000(Lcom/android/server/adb/AdbDebuggingManager;)Ljava/lang/String;
 PLcom/android/server/adb/AdbDebuggingManager;->access$1000(Lcom/android/server/adb/AdbDebuggingManager;)V
+PLcom/android/server/adb/AdbDebuggingManager;->access$1002(Lcom/android/server/adb/AdbDebuggingManager;Ljava/lang/String;)Ljava/lang/String;
 PLcom/android/server/adb/AdbDebuggingManager;->access$102(Lcom/android/server/adb/AdbDebuggingManager;Lcom/android/server/adb/AdbDebuggingManager$AdbDebuggingThread;)Lcom/android/server/adb/AdbDebuggingManager$AdbDebuggingThread;
 PLcom/android/server/adb/AdbDebuggingManager;->access$1100(Lcom/android/server/adb/AdbDebuggingManager;Ljava/lang/String;)V
+PLcom/android/server/adb/AdbDebuggingManager;->access$1100(Lcom/android/server/adb/AdbDebuggingManager;Ljava/lang/String;Ljava/lang/String;)V
 PLcom/android/server/adb/AdbDebuggingManager;->access$1200(Lcom/android/server/adb/AdbDebuggingManager;)Z
+PLcom/android/server/adb/AdbDebuggingManager;->access$1700(Lcom/android/server/adb/AdbDebuggingManager;Ljava/lang/String;Ljava/lang/String;)V
 PLcom/android/server/adb/AdbDebuggingManager;->access$1800(Lcom/android/server/adb/AdbDebuggingManager;Ljava/lang/Iterable;)V
 PLcom/android/server/adb/AdbDebuggingManager;->access$1900(Lcom/android/server/adb/AdbDebuggingManager;)V
+PLcom/android/server/adb/AdbDebuggingManager;->access$200(Lcom/android/server/adb/AdbDebuggingManager;)Landroid/content/ContentResolver;
 PLcom/android/server/adb/AdbDebuggingManager;->access$200(Lcom/android/server/adb/AdbDebuggingManager;)Z
+PLcom/android/server/adb/AdbDebuggingManager;->access$2000(Lcom/android/server/adb/AdbDebuggingManager;Ljava/lang/String;)V
 PLcom/android/server/adb/AdbDebuggingManager;->access$202(Lcom/android/server/adb/AdbDebuggingManager;Z)Z
 PLcom/android/server/adb/AdbDebuggingManager;->access$300(Lcom/android/server/adb/AdbDebuggingManager;)Ljava/util/List;
 PLcom/android/server/adb/AdbDebuggingManager;->access$400(Lcom/android/server/adb/AdbDebuggingManager;)Lcom/android/server/adb/AdbDebuggingManager$AdbDebuggingThread;
@@ -6262,17 +6594,20 @@
 PLcom/android/server/adb/AdbDebuggingManager;->access$600(Lcom/android/server/adb/AdbDebuggingManager;)Ljava/lang/String;
 PLcom/android/server/adb/AdbDebuggingManager;->access$600(Lcom/android/server/adb/AdbDebuggingManager;)V
 PLcom/android/server/adb/AdbDebuggingManager;->access$602(Lcom/android/server/adb/AdbDebuggingManager;Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/adb/AdbDebuggingManager;->access$700(Lcom/android/server/adb/AdbDebuggingManager;)Ljava/util/Set;
 PLcom/android/server/adb/AdbDebuggingManager;->access$700(Lcom/android/server/adb/AdbDebuggingManager;Ljava/lang/String;Ljava/lang/String;)V
 PLcom/android/server/adb/AdbDebuggingManager;->access$800(Lcom/android/server/adb/AdbDebuggingManager;)Landroid/content/Context;
 PLcom/android/server/adb/AdbDebuggingManager;->access$800(Lcom/android/server/adb/AdbDebuggingManager;)Z
 PLcom/android/server/adb/AdbDebuggingManager;->access$802(Lcom/android/server/adb/AdbDebuggingManager;Z)Z
 PLcom/android/server/adb/AdbDebuggingManager;->access$900(Lcom/android/server/adb/AdbDebuggingManager;Ljava/lang/Iterable;)V
+PLcom/android/server/adb/AdbDebuggingManager;->access$900(Lcom/android/server/adb/AdbDebuggingManager;Ljava/lang/String;)Ljava/lang/String;
 PLcom/android/server/adb/AdbDebuggingManager;->allowDebugging(ZLjava/lang/String;)V
 PLcom/android/server/adb/AdbDebuggingManager;->clearDebuggingKeys()V
 PLcom/android/server/adb/AdbDebuggingManager;->createConfirmationIntent(Landroid/content/ComponentName;Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;
 PLcom/android/server/adb/AdbDebuggingManager;->createConfirmationIntent(Landroid/content/ComponentName;Ljava/util/List;)Landroid/content/Intent;
 PLcom/android/server/adb/AdbDebuggingManager;->deleteKeyFile()V
 PLcom/android/server/adb/AdbDebuggingManager;->denyDebugging()V
+PLcom/android/server/adb/AdbDebuggingManager;->denyWirelessDebugging()V
 PLcom/android/server/adb/AdbDebuggingManager;->dump(Lcom/android/internal/util/dump/DualDumpOutputStream;Ljava/lang/String;J)V
 PLcom/android/server/adb/AdbDebuggingManager;->getAdbFile(Ljava/lang/String;)Ljava/io/File;
 PLcom/android/server/adb/AdbDebuggingManager;->getAdbTempKeysFile()Ljava/io/File;
@@ -6285,6 +6620,7 @@
 PLcom/android/server/adb/AdbDebuggingManager;->startConfirmationActivity(Landroid/content/ComponentName;Landroid/os/UserHandle;Ljava/lang/String;Ljava/lang/String;)Z
 PLcom/android/server/adb/AdbDebuggingManager;->startConfirmationActivity(Landroid/content/ComponentName;Landroid/os/UserHandle;Ljava/util/List;)Z
 PLcom/android/server/adb/AdbDebuggingManager;->startConfirmationForKey(Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/adb/AdbDebuggingManager;->startConfirmationForNetwork(Ljava/lang/String;Ljava/lang/String;)V
 PLcom/android/server/adb/AdbDebuggingManager;->writeKey(Ljava/lang/String;)V
 PLcom/android/server/adb/AdbDebuggingManager;->writeKeys(Ljava/lang/Iterable;)V
 PLcom/android/server/adb/AdbService$AdbConnectionPortListener;-><init>(Lcom/android/server/adb/AdbService;)V
@@ -6297,8 +6633,10 @@
 HSPLcom/android/server/adb/AdbService$AdbManagerInternalImpl;->isAdbEnabled()Z
 HSPLcom/android/server/adb/AdbService$AdbManagerInternalImpl;->isAdbEnabled(B)Z
 PLcom/android/server/adb/AdbService$AdbManagerInternalImpl;->lambda$startAdbdForTransport$0(Ljava/lang/Object;ZB)V
+PLcom/android/server/adb/AdbService$AdbManagerInternalImpl;->lambda$stopAdbdForTransport$1(Ljava/lang/Object;ZB)V
 HSPLcom/android/server/adb/AdbService$AdbManagerInternalImpl;->registerTransport(Landroid/debug/IAdbTransport;)V
 PLcom/android/server/adb/AdbService$AdbManagerInternalImpl;->startAdbdForTransport(B)V
+PLcom/android/server/adb/AdbService$AdbManagerInternalImpl;->stopAdbdForTransport(B)V
 HSPLcom/android/server/adb/AdbService$AdbSettingsObserver;-><init>(Lcom/android/server/adb/AdbService;)V
 PLcom/android/server/adb/AdbService$AdbSettingsObserver;->lambda$onChange$0(Ljava/lang/Object;ZB)V
 PLcom/android/server/adb/AdbService$AdbSettingsObserver;->lambda$onChange$1(Ljava/lang/Object;ZB)V
@@ -6326,13 +6664,16 @@
 PLcom/android/server/adb/AdbService;->clearDebuggingKeys()V
 HSPLcom/android/server/adb/AdbService;->containsFunction(Ljava/lang/String;Ljava/lang/String;)Z
 PLcom/android/server/adb/AdbService;->denyDebugging()V
+PLcom/android/server/adb/AdbService;->denyWirelessDebugging()V
 PLcom/android/server/adb/AdbService;->dump(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V
 HSPLcom/android/server/adb/AdbService;->initAdbState()V
-PLcom/android/server/adb/AdbService;->isAdbWifiSupported()Z
+HPLcom/android/server/adb/AdbService;->isAdbWifiQrSupported()Z
+HPLcom/android/server/adb/AdbService;->isAdbWifiSupported()Z
 HSPLcom/android/server/adb/AdbService;->setAdbEnabled(Z)V
 PLcom/android/server/adb/AdbService;->setAdbEnabled(ZB)V
 PLcom/android/server/adb/AdbService;->setAdbdEnabledForTransport(ZB)V
 PLcom/android/server/adb/AdbService;->startAdbd()V
+PLcom/android/server/adb/AdbService;->stopAdbd()V
 HSPLcom/android/server/adb/AdbService;->systemReady()V
 PLcom/android/server/am/-$$Lambda$1WA8m3qLmGLM_p471nun2GeoDvg;-><clinit>()V
 PLcom/android/server/am/-$$Lambda$1WA8m3qLmGLM_p471nun2GeoDvg;-><init>()V
@@ -6345,6 +6686,7 @@
 PLcom/android/server/am/-$$Lambda$ActiveServices$0WENDXD5vmtSS6wlQjMNWJNWoHA;-><init>(Lcom/android/server/am/ActiveServices;Ljava/lang/String;)V
 PLcom/android/server/am/-$$Lambda$ActiveServices$0WENDXD5vmtSS6wlQjMNWJNWoHA;->run()V
 HSPLcom/android/server/am/-$$Lambda$ActivityManagerService$2afaFERxNQEnSdevJxY5plp1fS4;-><init>(Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ProcessRecord;)V
+PLcom/android/server/am/-$$Lambda$ActivityManagerService$2afaFERxNQEnSdevJxY5plp1fS4;->run()V
 PLcom/android/server/am/-$$Lambda$ActivityManagerService$5$BegFiGFfKLYS7VRmiWluczgOC5k;-><clinit>()V
 PLcom/android/server/am/-$$Lambda$ActivityManagerService$5$BegFiGFfKLYS7VRmiWluczgOC5k;-><init>()V
 HPLcom/android/server/am/-$$Lambda$ActivityManagerService$5$BegFiGFfKLYS7VRmiWluczgOC5k;->needed(Lcom/android/internal/os/ProcessCpuTracker$Stats;)Z
@@ -6382,14 +6724,26 @@
 HPLcom/android/server/am/-$$Lambda$AppExitInfoTracker$AppExitInfoContainer$UGYjMlfjNQLNoNs9jB0lra88GDI;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
 PLcom/android/server/am/-$$Lambda$AppExitInfoTracker$AppExitInfoContainer$UJh7jNVpjR6lqMYBGte4jdTlSE0;-><clinit>()V
 PLcom/android/server/am/-$$Lambda$AppExitInfoTracker$AppExitInfoContainer$UJh7jNVpjR6lqMYBGte4jdTlSE0;-><init>()V
+PLcom/android/server/am/-$$Lambda$AppExitInfoTracker$Du2pQ0u67kwpa3kgguj5fWqQfXM;-><init>(Landroid/util/ArraySet;)V
+PLcom/android/server/am/-$$Lambda$AppExitInfoTracker$IvsxxpH-tYhqZSARqXULzKdbmW4;-><clinit>()V
+PLcom/android/server/am/-$$Lambda$AppExitInfoTracker$IvsxxpH-tYhqZSARqXULzKdbmW4;-><init>()V
+PLcom/android/server/am/-$$Lambda$AppExitInfoTracker$IvsxxpH-tYhqZSARqXULzKdbmW4;->accept(Ljava/lang/Object;)V
+PLcom/android/server/am/-$$Lambda$AppExitInfoTracker$JduFGZz0nH2A0BHWR2JObNY-HIA;-><init>(Landroid/util/ArraySet;)V
+PLcom/android/server/am/-$$Lambda$AppExitInfoTracker$JduFGZz0nH2A0BHWR2JObNY-HIA;->accept(Ljava/io/File;)Z
 PLcom/android/server/am/-$$Lambda$AppExitInfoTracker$M7pmR3pU58DetrzQsI3M2-go5XU;-><init>(Landroid/util/proto/ProtoOutputStream;)V
 HPLcom/android/server/am/-$$Lambda$AppExitInfoTracker$M7pmR3pU58DetrzQsI3M2-go5XU;->apply(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+PLcom/android/server/am/-$$Lambda$AppExitInfoTracker$Q3GtkIfPxcC3Upjekif3W0ekKvY;-><init>(Landroid/util/ArraySet;)V
+HPLcom/android/server/am/-$$Lambda$AppExitInfoTracker$Q3GtkIfPxcC3Upjekif3W0ekKvY;->apply(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
 PLcom/android/server/am/-$$Lambda$AppExitInfoTracker$UhdolDh03szrz0tHY4ggJ2c_9IQ;-><init>(I)V
 PLcom/android/server/am/-$$Lambda$AppExitInfoTracker$UhdolDh03szrz0tHY4ggJ2c_9IQ;->apply(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
 HSPLcom/android/server/am/-$$Lambda$AppExitInfoTracker$Yc6vluAEWPBi2TSflPrFu351ztU;-><init>(Lcom/android/server/am/AppExitInfoTracker;)V
 HSPLcom/android/server/am/-$$Lambda$AppExitInfoTracker$Yc6vluAEWPBi2TSflPrFu351ztU;->run()V
 HPLcom/android/server/am/-$$Lambda$AppExitInfoTracker$e3RqpmVvDTV44W327x1Bbxd4Iqc;-><init>(Lcom/android/server/am/AppExitInfoTracker;ILjava/util/ArrayList;ILjava/lang/Integer;Ljava/lang/Integer;)V
 HPLcom/android/server/am/-$$Lambda$AppExitInfoTracker$e3RqpmVvDTV44W327x1Bbxd4Iqc;->apply(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+PLcom/android/server/am/-$$Lambda$AppExitInfoTracker$pGj1RV5EdCXTSGnbNiqDUSduYTk;-><init>(Landroid/util/ArraySet;)V
+PLcom/android/server/am/-$$Lambda$AppExitInfoTracker$pGj1RV5EdCXTSGnbNiqDUSduYTk;->apply(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HPLcom/android/server/am/-$$Lambda$AppExitInfoTracker$xUd65bpeb_3cGXv8w6rHG0fu89U;-><init>(Lcom/android/server/am/AppExitInfoTracker;ILjava/util/ArrayList;ILjava/lang/Integer;Ljava/lang/Integer;)V
+HPLcom/android/server/am/-$$Lambda$AppExitInfoTracker$xUd65bpeb_3cGXv8w6rHG0fu89U;->apply(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
 PLcom/android/server/am/-$$Lambda$AppExitInfoTracker$ykvdMbwZILd9oyb6cyIe3GfomwU;-><init>(Lcom/android/server/am/AppExitInfoTracker;Ljava/io/PrintWriter;Landroid/icu/text/SimpleDateFormat;)V
 PLcom/android/server/am/-$$Lambda$AppExitInfoTracker$ykvdMbwZILd9oyb6cyIe3GfomwU;->apply(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
 HSPLcom/android/server/am/-$$Lambda$BatteryExternalStatsWorker$MJXTdtPzBwRCdTjCDCE77VXPHBk;-><init>(Landroid/os/SynchronousResultReceiver;)V
@@ -6488,6 +6842,11 @@
 PLcom/android/server/am/-$$Lambda$UserController$fU2mcMYCcCOsyUuGHKIUB-nSo1Y;->run()V
 PLcom/android/server/am/-$$Lambda$UserController$stQk1028ON105v_u-VMykVjcxLk;-><init>(Lcom/android/server/am/UserController;ILcom/android/server/am/UserState;)V
 PLcom/android/server/am/-$$Lambda$UserController$stQk1028ON105v_u-VMykVjcxLk;->run()V
+PLcom/android/server/am/-$$Lambda$VSkN0NYXfJkOHZPqzFU-0f4s4R4;-><init>(Lcom/android/server/am/AppExitInfoTracker;)V
+PLcom/android/server/am/-$$Lambda$VSkN0NYXfJkOHZPqzFU-0f4s4R4;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/am/-$$Lambda$WVd6ghNMbVDukmkxia3ZwNeZzEY;-><clinit>()V
+PLcom/android/server/am/-$$Lambda$WVd6ghNMbVDukmkxia3ZwNeZzEY;-><init>()V
+PLcom/android/server/am/-$$Lambda$WVd6ghNMbVDukmkxia3ZwNeZzEY;->get()Ljava/lang/Object;
 PLcom/android/server/am/-$$Lambda$Y_KRxxoOXfy-YceuDG7WHd46Y_I;-><clinit>()V
 PLcom/android/server/am/-$$Lambda$Y_KRxxoOXfy-YceuDG7WHd46Y_I;-><init>()V
 HPLcom/android/server/am/-$$Lambda$Y_KRxxoOXfy-YceuDG7WHd46Y_I;->apply(Ljava/lang/Object;)Ljava/lang/Object;
@@ -6516,16 +6875,17 @@
 PLcom/android/server/am/ActiveServices$AppOpCallback;-><clinit>()V
 HPLcom/android/server/am/ActiveServices$AppOpCallback;-><init>(Lcom/android/server/am/ProcessRecord;Landroid/app/AppOpsManager;)V
 HPLcom/android/server/am/ActiveServices$AppOpCallback;->access$000(Lcom/android/server/am/ActiveServices$AppOpCallback;)Lcom/android/server/am/ProcessRecord;
-PLcom/android/server/am/ActiveServices$AppOpCallback;->access$100(Lcom/android/server/am/ActiveServices$AppOpCallback;)Z
-PLcom/android/server/am/ActiveServices$AppOpCallback;->access$200(Lcom/android/server/am/ActiveServices$AppOpCallback;IZ)V
+HPLcom/android/server/am/ActiveServices$AppOpCallback;->access$100(Lcom/android/server/am/ActiveServices$AppOpCallback;)Z
+HPLcom/android/server/am/ActiveServices$AppOpCallback;->access$200(Lcom/android/server/am/ActiveServices$AppOpCallback;IZ)V
 HPLcom/android/server/am/ActiveServices$AppOpCallback;->incrementOpCount(IZ)V
 HPLcom/android/server/am/ActiveServices$AppOpCallback;->isNotTop()Z
-PLcom/android/server/am/ActiveServices$AppOpCallback;->isObsoleteLocked()Z
+HPLcom/android/server/am/ActiveServices$AppOpCallback;->isObsoleteLocked()Z
 HPLcom/android/server/am/ActiveServices$AppOpCallback;->logFinalValues()V
 PLcom/android/server/am/ActiveServices$AppOpCallback;->modeToEnum(I)I
 HPLcom/android/server/am/ActiveServices$AppOpCallback;->registerLocked()V
 HPLcom/android/server/am/ActiveServices$AppOpCallback;->unregisterLocked()V
 HSPLcom/android/server/am/ActiveServices$ForcedStandbyListener;-><init>(Lcom/android/server/am/ActiveServices;)V
+PLcom/android/server/am/ActiveServices$ForcedStandbyListener;->stopForegroundServicesForUidPackage(ILjava/lang/String;)V
 HSPLcom/android/server/am/ActiveServices$ServiceDumper;-><init>(Lcom/android/server/am/ActiveServices;Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;IZLjava/lang/String;)V
 HSPLcom/android/server/am/ActiveServices$ServiceDumper;->dumpHeaderLocked()V
 HSPLcom/android/server/am/ActiveServices$ServiceDumper;->dumpLocked()V
@@ -6545,6 +6905,7 @@
 HSPLcom/android/server/am/ActiveServices;-><init>(Lcom/android/server/am/ActivityManagerService;)V
 HSPLcom/android/server/am/ActiveServices;->access$200(Lcom/android/server/am/ActiveServices;I)Lcom/android/server/am/ActiveServices$ServiceMap;
 PLcom/android/server/am/ActiveServices;->access$300(I)I
+PLcom/android/server/am/ActiveServices;->access$500(Lcom/android/server/am/ActiveServices;I)Lcom/android/server/am/ActiveServices$ServiceMap;
 PLcom/android/server/am/ActiveServices;->access$600(Lcom/android/server/am/ActiveServices;I)Lcom/android/server/am/ActiveServices$ServiceMap;
 HSPLcom/android/server/am/ActiveServices;->appIsTopLocked(I)Z
 HSPLcom/android/server/am/ActiveServices;->appRestrictedAnyInBackground(ILjava/lang/String;)Z
@@ -6611,7 +6972,7 @@
 HSPLcom/android/server/am/ActiveServices;->shouldAllowWhileInUsePermissionInFgsLocked(Ljava/lang/String;ILandroid/content/Intent;Lcom/android/server/am/ServiceRecord;Z)Z
 HPLcom/android/server/am/ActiveServices;->showWhileInUseDebugNotificationLocked(III)V
 HPLcom/android/server/am/ActiveServices;->showWhileInUseDebugToastLocked(III)V
-PLcom/android/server/am/ActiveServices;->showWhileInUsePermissionInFgsBlockedNotificationLocked(Ljava/lang/String;Ljava/lang/String;)V
+HPLcom/android/server/am/ActiveServices;->showWhileInUsePermissionInFgsBlockedNotificationLocked(Ljava/lang/String;Ljava/lang/String;)V
 PLcom/android/server/am/ActiveServices;->showWhileInUsePermissionInFgsBlockedToastLocked(Ljava/lang/String;)V
 HSPLcom/android/server/am/ActiveServices;->startServiceInnerLocked(Lcom/android/server/am/ActiveServices$ServiceMap;Landroid/content/Intent;Lcom/android/server/am/ServiceRecord;ZZ)Landroid/content/ComponentName;
 HSPLcom/android/server/am/ActiveServices;->startServiceLocked(Landroid/app/IApplicationThread;Landroid/content/Intent;Ljava/lang/String;IIZLjava/lang/String;I)Landroid/content/ComponentName;
@@ -6672,41 +7033,58 @@
 PLcom/android/server/am/ActivityManagerService$11;-><init>(Lcom/android/server/am/ActivityManagerService;)V
 PLcom/android/server/am/ActivityManagerService$11;->performReceive(Landroid/content/Intent;ILjava/lang/String;Landroid/os/Bundle;ZZI)V
 HPLcom/android/server/am/ActivityManagerService$12;-><init>(Lcom/android/server/am/ActivityManagerService;ILandroid/os/IBinder;Ljava/lang/String;)V
+PLcom/android/server/am/ActivityManagerService$13;-><init>(Lcom/android/server/am/ActivityManagerService;Landroid/content/ComponentName;Landroid/os/IBinder;)V
 PLcom/android/server/am/ActivityManagerService$13;-><init>(Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ProcessRecord;)V
 PLcom/android/server/am/ActivityManagerService$13;->run()V
 PLcom/android/server/am/ActivityManagerService$14;-><init>(Lcom/android/server/am/ActivityManagerService;Landroid/content/ComponentName;Landroid/os/IBinder;)V
 HPLcom/android/server/am/ActivityManagerService$15;-><init>(Lcom/android/server/am/ActivityManagerService;Landroid/content/ComponentName;Landroid/os/IBinder;)V
 HPLcom/android/server/am/ActivityManagerService$15;->run()V
+PLcom/android/server/am/ActivityManagerService$16;-><init>(Lcom/android/server/am/ActivityManagerService;)V
+PLcom/android/server/am/ActivityManagerService$16;->performReceive(Landroid/content/Intent;ILjava/lang/String;Landroid/os/Bundle;ZZI)V
 PLcom/android/server/am/ActivityManagerService$17;-><init>(Lcom/android/server/am/ActivityManagerService;)V
+PLcom/android/server/am/ActivityManagerService$17;-><init>(Lcom/android/server/am/ActivityManagerService;Landroid/os/Handler;Landroid/content/Context;)V
+PLcom/android/server/am/ActivityManagerService$17;->onChange(Z)V
 PLcom/android/server/am/ActivityManagerService$17;->performReceive(Landroid/content/Intent;ILjava/lang/String;Landroid/os/Bundle;ZZI)V
 HSPLcom/android/server/am/ActivityManagerService$18;-><init>(Lcom/android/server/am/ActivityManagerService;)V
+HPLcom/android/server/am/ActivityManagerService$18;-><init>(Lcom/android/server/am/ActivityManagerService;IILandroid/os/IBinder;Ljava/lang/String;Landroid/app/ApplicationErrorReport$ParcelableCrashInfo;)V
 HSPLcom/android/server/am/ActivityManagerService$18;->performReceive(Landroid/content/Intent;ILjava/lang/String;Landroid/os/Bundle;ZZI)V
+HPLcom/android/server/am/ActivityManagerService$18;->run()V
 PLcom/android/server/am/ActivityManagerService$19;-><init>(Lcom/android/server/am/ActivityManagerService;IILandroid/os/IBinder;Ljava/lang/String;Landroid/app/ApplicationErrorReport$ParcelableCrashInfo;)V
 PLcom/android/server/am/ActivityManagerService$19;-><init>(Lcom/android/server/am/ActivityManagerService;Landroid/os/Handler;Landroid/content/Context;)V
+HPLcom/android/server/am/ActivityManagerService$19;-><init>(Lcom/android/server/am/ActivityManagerService;Ljava/lang/String;Ljava/lang/String;Ljava/lang/StringBuilder;Ljava/lang/String;Ljava/io/File;Landroid/app/ApplicationErrorReport$CrashInfo;Landroid/os/DropBoxManager;)V
 PLcom/android/server/am/ActivityManagerService$19;->onChange(Z)V
-PLcom/android/server/am/ActivityManagerService$19;->run()V
+HPLcom/android/server/am/ActivityManagerService$19;->run()V
 HSPLcom/android/server/am/ActivityManagerService$1;-><init>(Lcom/android/server/am/ActivityManagerService;)V
 PLcom/android/server/am/ActivityManagerService$1;->dump(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;Z)V
 PLcom/android/server/am/ActivityManagerService$1;->dumpCritical(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;Z)V
 PLcom/android/server/am/ActivityManagerService$1;->dumpNormal(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;Z)V
+PLcom/android/server/am/ActivityManagerService$20;-><init>()V
 HSPLcom/android/server/am/ActivityManagerService$20;-><init>(Lcom/android/server/am/ActivityManagerService;IILandroid/os/IBinder;Ljava/lang/String;Landroid/app/ApplicationErrorReport$ParcelableCrashInfo;)V
 HSPLcom/android/server/am/ActivityManagerService$20;-><init>(Lcom/android/server/am/ActivityManagerService;Ljava/lang/String;Ljava/lang/String;Ljava/lang/StringBuilder;Ljava/lang/String;Ljava/io/File;Landroid/app/ApplicationErrorReport$CrashInfo;Landroid/os/DropBoxManager;)V
+HPLcom/android/server/am/ActivityManagerService$20;->compare(Landroid/util/Pair;Landroid/util/Pair;)I
+HPLcom/android/server/am/ActivityManagerService$20;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
 HSPLcom/android/server/am/ActivityManagerService$20;->run()V
 HSPLcom/android/server/am/ActivityManagerService$21;-><init>()V
 HSPLcom/android/server/am/ActivityManagerService$21;-><init>(Lcom/android/server/am/ActivityManagerService;Ljava/lang/String;Ljava/lang/String;Ljava/lang/StringBuilder;Ljava/lang/String;Ljava/io/File;Landroid/app/ApplicationErrorReport$CrashInfo;Landroid/os/DropBoxManager;)V
+PLcom/android/server/am/ActivityManagerService$21;-><init>(Z)V
 HSPLcom/android/server/am/ActivityManagerService$21;->compare(Landroid/util/Pair;Landroid/util/Pair;)I
+HPLcom/android/server/am/ActivityManagerService$21;->compare(Lcom/android/server/am/ActivityManagerService$MemItem;Lcom/android/server/am/ActivityManagerService$MemItem;)I
 HSPLcom/android/server/am/ActivityManagerService$21;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
 HSPLcom/android/server/am/ActivityManagerService$21;->run()V
 PLcom/android/server/am/ActivityManagerService$22;-><init>()V
+PLcom/android/server/am/ActivityManagerService$22;-><init>(Lcom/android/server/am/ActivityManagerService;)V
 PLcom/android/server/am/ActivityManagerService$22;-><init>(Z)V
 HPLcom/android/server/am/ActivityManagerService$22;->compare(Landroid/util/Pair;Landroid/util/Pair;)I
 PLcom/android/server/am/ActivityManagerService$22;->compare(Lcom/android/server/am/ActivityManagerService$MemItem;Lcom/android/server/am/ActivityManagerService$MemItem;)I
+HPLcom/android/server/am/ActivityManagerService$22;->compare(Lcom/android/server/am/ProcessMemInfo;Lcom/android/server/am/ProcessMemInfo;)I
 HPLcom/android/server/am/ActivityManagerService$22;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
 HSPLcom/android/server/am/ActivityManagerService$23;-><init>(Lcom/android/server/am/ActivityManagerService;)V
+PLcom/android/server/am/ActivityManagerService$23;-><init>(Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ProcessRecord;)V
 HPLcom/android/server/am/ActivityManagerService$23;-><init>(Z)V
 HPLcom/android/server/am/ActivityManagerService$23;->compare(Lcom/android/server/am/ActivityManagerService$MemItem;Lcom/android/server/am/ActivityManagerService$MemItem;)I
 HSPLcom/android/server/am/ActivityManagerService$23;->compare(Lcom/android/server/am/ProcessMemInfo;Lcom/android/server/am/ProcessMemInfo;)I
 HSPLcom/android/server/am/ActivityManagerService$23;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
+PLcom/android/server/am/ActivityManagerService$23;->run()V
 PLcom/android/server/am/ActivityManagerService$24;-><init>(Lcom/android/server/am/ActivityManagerService;)V
 HPLcom/android/server/am/ActivityManagerService$24;->compare(Lcom/android/server/am/ProcessMemInfo;Lcom/android/server/am/ProcessMemInfo;)I
 HPLcom/android/server/am/ActivityManagerService$24;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
@@ -6740,6 +7118,7 @@
 HPLcom/android/server/am/ActivityManagerService$5;->handleMessage(Landroid/os/Message;)V
 HPLcom/android/server/am/ActivityManagerService$5;->lambda$handleMessage$0(Lcom/android/internal/os/ProcessCpuTracker$Stats;)Z
 HSPLcom/android/server/am/ActivityManagerService$6;-><init>(Lcom/android/server/am/ActivityManagerService;)V
+PLcom/android/server/am/ActivityManagerService$6;->opChanged(IILjava/lang/String;)V
 HSPLcom/android/server/am/ActivityManagerService$7;-><init>(Lcom/android/server/am/ActivityManagerService;Ljava/lang/String;)V
 HSPLcom/android/server/am/ActivityManagerService$7;->run()V
 PLcom/android/server/am/ActivityManagerService$8;-><init>(Lcom/android/server/am/ActivityManagerService;Landroid/content/pm/ApplicationInfo;IZIILandroid/content/pm/IPackageDataObserver;)V
@@ -6792,6 +7171,7 @@
 HSPLcom/android/server/am/ActivityManagerService$LocalService;-><init>(Lcom/android/server/am/ActivityManagerService;)V
 HPLcom/android/server/am/ActivityManagerService$LocalService;->broadcastCloseSystemDialogs(Ljava/lang/String;)V
 HSPLcom/android/server/am/ActivityManagerService$LocalService;->broadcastGlobalConfigurationChanged(IZ)V
+HPLcom/android/server/am/ActivityManagerService$LocalService;->broadcastIntent(Landroid/content/Intent;Landroid/content/IIntentReceiver;[Ljava/lang/String;ZI[I)I
 HPLcom/android/server/am/ActivityManagerService$LocalService;->broadcastIntentInPackage(Ljava/lang/String;IIILandroid/content/Intent;Ljava/lang/String;Landroid/content/IIntentReceiver;ILjava/lang/String;Landroid/os/Bundle;Ljava/lang/String;Landroid/os/Bundle;ZZIZ)I
 HPLcom/android/server/am/ActivityManagerService$LocalService;->broadcastIntentInPackage(Ljava/lang/String;Ljava/lang/String;IIILandroid/content/Intent;Ljava/lang/String;Landroid/content/IIntentReceiver;ILjava/lang/String;Landroid/os/Bundle;Ljava/lang/String;Landroid/os/Bundle;ZZIZ)I
 HSPLcom/android/server/am/ActivityManagerService$LocalService;->checkContentProviderAccess(Ljava/lang/String;I)Ljava/lang/String;
@@ -6809,6 +7189,7 @@
 HSPLcom/android/server/am/ActivityManagerService$LocalService;->getCurrentProfileIds()[I
 HSPLcom/android/server/am/ActivityManagerService$LocalService;->getCurrentUserId()I
 HPLcom/android/server/am/ActivityManagerService$LocalService;->getMemoryStateForProcesses()Ljava/util/List;
+PLcom/android/server/am/ActivityManagerService$LocalService;->getProcessesWithPendingBindMounts(I)Ljava/util/Map;
 HPLcom/android/server/am/ActivityManagerService$LocalService;->getTaskIdForActivity(Landroid/os/IBinder;Z)I
 HSPLcom/android/server/am/ActivityManagerService$LocalService;->getUidProcessState(I)I
 HPLcom/android/server/am/ActivityManagerService$LocalService;->handleIncomingUser(IIIZILjava/lang/String;Ljava/lang/String;)I
@@ -6822,6 +7203,7 @@
 HSPLcom/android/server/am/ActivityManagerService$LocalService;->isBooted()Z
 HSPLcom/android/server/am/ActivityManagerService$LocalService;->isBooting()Z
 HPLcom/android/server/am/ActivityManagerService$LocalService;->isCurrentProfile(I)Z
+HPLcom/android/server/am/ActivityManagerService$LocalService;->isDeviceOwner(I)Z
 HSPLcom/android/server/am/ActivityManagerService$LocalService;->isRuntimeRestarted()Z
 HSPLcom/android/server/am/ActivityManagerService$LocalService;->isSplitConfigurationChange(I)Z
 HSPLcom/android/server/am/ActivityManagerService$LocalService;->isSystemReady()Z
@@ -6845,6 +7227,7 @@
 HSPLcom/android/server/am/ActivityManagerService$LocalService;->setBooting(Z)V
 PLcom/android/server/am/ActivityManagerService$LocalService;->setDebugFlagsForStartingActivity(Landroid/content/pm/ActivityInfo;ILandroid/app/ProfilerInfo;Ljava/lang/Object;)V
 HSPLcom/android/server/am/ActivityManagerService$LocalService;->setDeviceIdleWhitelist([I[I)V
+PLcom/android/server/am/ActivityManagerService$LocalService;->setDeviceOwnerUid(I)V
 HPLcom/android/server/am/ActivityManagerService$LocalService;->setHasOverlayUi(IZ)V
 HPLcom/android/server/am/ActivityManagerService$LocalService;->setPendingIntentAllowBgActivityStarts(Landroid/content/IIntentSender;Landroid/os/IBinder;I)V
 HPLcom/android/server/am/ActivityManagerService$LocalService;->setPendingIntentWhitelistDuration(Landroid/content/IIntentSender;Landroid/os/IBinder;J)V
@@ -6913,6 +7296,13 @@
 HSPLcom/android/server/am/ActivityManagerService$ProfileData;->getProfilerInfo()Landroid/app/ProfilerInfo;
 PLcom/android/server/am/ActivityManagerService$RecordPssRunnable;-><init>(Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ProcessRecord;Landroid/net/Uri;Landroid/content/ContentResolver;)V
 PLcom/android/server/am/ActivityManagerService$RecordPssRunnable;->run()V
+PLcom/android/server/am/ActivityManagerService$ShellDelegate;-><init>(Lcom/android/server/am/ActivityManagerService;Ljava/lang/String;I[Ljava/lang/String;)V
+PLcom/android/server/am/ActivityManagerService$ShellDelegate;->checkOperation(IILjava/lang/String;ZLcom/android/internal/util/function/QuadFunction;)I
+PLcom/android/server/am/ActivityManagerService$ShellDelegate;->checkPermission(Ljava/lang/String;Ljava/lang/String;ILcom/android/internal/util/function/TriFunction;)I
+PLcom/android/server/am/ActivityManagerService$ShellDelegate;->checkUidPermission(Ljava/lang/String;ILjava/util/function/BiFunction;)I
+PLcom/android/server/am/ActivityManagerService$ShellDelegate;->isTargetOp(I)Z
+PLcom/android/server/am/ActivityManagerService$ShellDelegate;->isTargetPermission(Ljava/lang/String;)Z
+PLcom/android/server/am/ActivityManagerService$ShellDelegate;->noteOperation(IILjava/lang/String;Ljava/lang/String;ZLjava/lang/String;Lcom/android/internal/util/function/HexFunction;)I
 HSPLcom/android/server/am/ActivityManagerService$UiHandler;-><init>(Lcom/android/server/am/ActivityManagerService;)V
 HSPLcom/android/server/am/ActivityManagerService$UiHandler;->handleMessage(Landroid/os/Message;)V
 HSPLcom/android/server/am/ActivityManagerService$UidObserverRegistration;-><clinit>()V
@@ -6930,6 +7320,8 @@
 HPLcom/android/server/am/ActivityManagerService;->access$1600(Lcom/android/server/am/ActivityManagerService;I)Z
 HSPLcom/android/server/am/ActivityManagerService;->access$1700(Lcom/android/server/am/ActivityManagerService;Landroid/content/pm/ApplicationInfo;)Z
 PLcom/android/server/am/ActivityManagerService;->access$1800(Lcom/android/server/am/ActivityManagerService;I)V
+PLcom/android/server/am/ActivityManagerService;->access$1900(Lcom/android/server/am/ActivityManagerService;)I
+PLcom/android/server/am/ActivityManagerService;->access$1902(Lcom/android/server/am/ActivityManagerService;I)I
 HSPLcom/android/server/am/ActivityManagerService;->access$200(Lcom/android/server/am/ActivityManagerService;)V
 HSPLcom/android/server/am/ActivityManagerService;->access$300(Lcom/android/server/am/ActivityManagerService;II)V
 PLcom/android/server/am/ActivityManagerService;->access$400(Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ProcessRecord;)V
@@ -6981,6 +7373,7 @@
 HSPLcom/android/server/am/ActivityManagerService;->broadcastIntentLocked(Lcom/android/server/am/ProcessRecord;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;Landroid/content/IIntentReceiver;ILjava/lang/String;Landroid/os/Bundle;[Ljava/lang/String;ILandroid/os/Bundle;ZZIIIIIZ)I
 HSPLcom/android/server/am/ActivityManagerService;->broadcastIntentLocked(Lcom/android/server/am/ProcessRecord;Ljava/lang/String;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;Landroid/content/IIntentReceiver;ILjava/lang/String;Landroid/os/Bundle;[Ljava/lang/String;ILandroid/os/Bundle;ZZIIIII)I
 HSPLcom/android/server/am/ActivityManagerService;->broadcastIntentLocked(Lcom/android/server/am/ProcessRecord;Ljava/lang/String;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;Landroid/content/IIntentReceiver;ILjava/lang/String;Landroid/os/Bundle;[Ljava/lang/String;ILandroid/os/Bundle;ZZIIIIIZ)I
+HPLcom/android/server/am/ActivityManagerService;->broadcastIntentLocked(Lcom/android/server/am/ProcessRecord;Ljava/lang/String;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;Landroid/content/IIntentReceiver;ILjava/lang/String;Landroid/os/Bundle;[Ljava/lang/String;ILandroid/os/Bundle;ZZIIIIIZ[I)I
 HSPLcom/android/server/am/ActivityManagerService;->broadcastIntentWithFeature(Landroid/app/IApplicationThread;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;Landroid/content/IIntentReceiver;ILjava/lang/String;Landroid/os/Bundle;[Ljava/lang/String;ILandroid/os/Bundle;ZZI)I
 HSPLcom/android/server/am/ActivityManagerService;->broadcastQueueForIntent(Landroid/content/Intent;)Lcom/android/server/am/BroadcastQueue;
 HPLcom/android/server/am/ActivityManagerService;->canClearIdentity(III)Z
@@ -7007,6 +7400,7 @@
 HPLcom/android/server/am/ActivityManagerService;->closeSystemDialogs(Ljava/lang/String;)V
 HPLcom/android/server/am/ActivityManagerService;->collectProcesses(Ljava/io/PrintWriter;IZ[Ljava/lang/String;)Ljava/util/ArrayList;
 HSPLcom/android/server/am/ActivityManagerService;->collectReceiverComponents(Landroid/content/Intent;Ljava/lang/String;I[I)Ljava/util/List;
+HPLcom/android/server/am/ActivityManagerService;->collectReceiverComponents(Landroid/content/Intent;Ljava/lang/String;I[I[I)Ljava/util/List;
 HSPLcom/android/server/am/ActivityManagerService;->compatibilityInfoForPackage(Landroid/content/pm/ApplicationInfo;)Landroid/content/res/CompatibilityInfo;
 PLcom/android/server/am/ActivityManagerService;->crashApplication(IILjava/lang/String;ILjava/lang/String;Z)V
 HPLcom/android/server/am/ActivityManagerService;->createAnrDumpFile(Ljava/io/File;)Ljava/io/File;
@@ -7050,9 +7444,11 @@
 PLcom/android/server/am/ActivityManagerService;->dumpProvider(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;Ljava/lang/String;[Ljava/lang/String;IZ)Z
 PLcom/android/server/am/ActivityManagerService;->dumpProviderProto(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;Ljava/lang/String;[Ljava/lang/String;)Z
 PLcom/android/server/am/ActivityManagerService;->dumpProvidersLocked(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;IZLjava/lang/String;)V
+HPLcom/android/server/am/ActivityManagerService;->dumpStackTraces(Ljava/lang/String;Ljava/util/ArrayList;Ljava/util/ArrayList;Ljava/util/ArrayList;)Landroid/util/Pair;
 HPLcom/android/server/am/ActivityManagerService;->dumpStackTraces(Ljava/lang/String;Ljava/util/ArrayList;Ljava/util/ArrayList;Ljava/util/ArrayList;)V
 HPLcom/android/server/am/ActivityManagerService;->dumpStackTraces(Ljava/util/ArrayList;Lcom/android/internal/os/ProcessCpuTracker;Landroid/util/SparseArray;Ljava/util/ArrayList;)Ljava/io/File;
 HPLcom/android/server/am/ActivityManagerService;->dumpStackTraces(Ljava/util/ArrayList;Lcom/android/internal/os/ProcessCpuTracker;Landroid/util/SparseArray;Ljava/util/ArrayList;Ljava/io/StringWriter;)Ljava/io/File;
+HPLcom/android/server/am/ActivityManagerService;->dumpStackTraces(Ljava/util/ArrayList;Lcom/android/internal/os/ProcessCpuTracker;Landroid/util/SparseArray;Ljava/util/ArrayList;Ljava/io/StringWriter;[J)Ljava/io/File;
 HSPLcom/android/server/am/ActivityManagerService;->dumpUids(Ljava/io/PrintWriter;Ljava/lang/String;ILcom/android/server/am/ActiveUids;Ljava/lang/String;Z)Z
 PLcom/android/server/am/ActivityManagerService;->dumpUsersLocked(Ljava/io/PrintWriter;)V
 HSPLcom/android/server/am/ActivityManagerService;->enforceCallingPermission(Ljava/lang/String;Ljava/lang/String;)V
@@ -7151,6 +7547,7 @@
 HPLcom/android/server/am/ActivityManagerService;->isBackgroundRestrictedNoCheck(ILjava/lang/String;)Z
 PLcom/android/server/am/ActivityManagerService;->isCallerShell()Z
 HSPLcom/android/server/am/ActivityManagerService;->isDeviceProvisioned(Landroid/content/Context;)Z
+PLcom/android/server/am/ActivityManagerService;->isEphemeralLocked(I)Z
 PLcom/android/server/am/ActivityManagerService;->isInRestrictedBucket(ILjava/lang/String;J)Z
 HSPLcom/android/server/am/ActivityManagerService;->isInstantApp(Lcom/android/server/am/ProcessRecord;Ljava/lang/String;I)Z
 HPLcom/android/server/am/ActivityManagerService;->isIntentSenderABroadcast(Landroid/content/IIntentSender;)Z
@@ -7165,6 +7562,7 @@
 HSPLcom/android/server/am/ActivityManagerService;->isSingleton(Ljava/lang/String;Landroid/content/pm/ApplicationInfo;Ljava/lang/String;I)Z
 HSPLcom/android/server/am/ActivityManagerService;->isUidActive(ILjava/lang/String;)Z
 HSPLcom/android/server/am/ActivityManagerService;->isUidActiveLocked(I)Z
+HPLcom/android/server/am/ActivityManagerService;->isUidActiveOrForeground(ILjava/lang/String;)Z
 HPLcom/android/server/am/ActivityManagerService;->isUserAMonkey()Z
 HSPLcom/android/server/am/ActivityManagerService;->isUserRunning(II)Z
 HSPLcom/android/server/am/ActivityManagerService;->isValidSingletonCall(II)Z
@@ -7177,6 +7575,7 @@
 PLcom/android/server/am/ActivityManagerService;->killPids([ILjava/lang/String;Z)Z
 HPLcom/android/server/am/ActivityManagerService;->killUid(IILjava/lang/String;)V
 HPLcom/android/server/am/ActivityManagerService;->lambda$getProviderMimeTypeAsync$1$ActivityManagerService(Ljava/lang/String;ILandroid/os/RemoteCallback;Landroid/os/Bundle;)V
+PLcom/android/server/am/ActivityManagerService;->lambda$handleAppDiedLocked$0$ActivityManagerService(Lcom/android/server/am/ProcessRecord;)V
 HSPLcom/android/server/am/ActivityManagerService;->lambda$logStrictModeViolationToDropBox$3(Landroid/os/DropBoxManager;Ljava/lang/String;Ljava/lang/String;)V
 HSPLcom/android/server/am/ActivityManagerService;->lambda$logStrictModeViolationToDropBox$4(Landroid/os/DropBoxManager;Ljava/lang/String;Ljava/lang/String;)V
 HSPLcom/android/server/am/ActivityManagerService;->lambda$reportMemUsage$4(Lcom/android/internal/os/ProcessCpuTracker$Stats;)Z
@@ -7250,6 +7649,7 @@
 HSPLcom/android/server/am/ActivityManagerService;->retrieveSettings()V
 HPLcom/android/server/am/ActivityManagerService;->revokeUriPermission(Landroid/app/IApplicationThread;Ljava/lang/String;Landroid/net/Uri;II)V
 HSPLcom/android/server/am/ActivityManagerService;->rotateBroadcastStatsIfNeededLocked()V
+PLcom/android/server/am/ActivityManagerService;->runInBackgroundDisabled(I)V
 HSPLcom/android/server/am/ActivityManagerService;->scheduleAppGcsLocked()V
 HSPLcom/android/server/am/ActivityManagerService;->scheduleApplicationInfoChanged(Ljava/util/List;I)V
 HPLcom/android/server/am/ActivityManagerService;->sendIntentSender(Landroid/content/IIntentSender;Landroid/os/IBinder;ILandroid/content/Intent;Ljava/lang/String;Landroid/content/IIntentReceiver;Ljava/lang/String;Landroid/os/Bundle;)I
@@ -7283,8 +7683,10 @@
 HSPLcom/android/server/am/ActivityManagerService;->sortProcessOomList(Ljava/util/List;Ljava/lang/String;)Ljava/util/ArrayList;
 HSPLcom/android/server/am/ActivityManagerService;->start()V
 PLcom/android/server/am/ActivityManagerService;->startActivityAsUser(Landroid/app/IApplicationThread;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;Landroid/os/IBinder;Ljava/lang/String;IILandroid/app/ProfilerInfo;Landroid/os/Bundle;I)I
+PLcom/android/server/am/ActivityManagerService;->startActivityAsUserWithFeature(Landroid/app/IApplicationThread;Ljava/lang/String;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;Landroid/os/IBinder;Ljava/lang/String;IILandroid/app/ProfilerInfo;Landroid/os/Bundle;I)I
 HSPLcom/android/server/am/ActivityManagerService;->startAssociationLocked(ILjava/lang/String;IIJLandroid/content/ComponentName;Ljava/lang/String;)Lcom/android/server/am/ActivityManagerService$Association;
 HSPLcom/android/server/am/ActivityManagerService;->startBroadcastObservers()V
+PLcom/android/server/am/ActivityManagerService;->startDelegateShellPermissionIdentity(I[Ljava/lang/String;)V
 PLcom/android/server/am/ActivityManagerService;->startHeapDumpLocked(Lcom/android/server/am/ProcessRecord;Z)V
 HPLcom/android/server/am/ActivityManagerService;->startInstrumentation(Landroid/content/ComponentName;Ljava/lang/String;ILandroid/os/Bundle;Landroid/app/IInstrumentationWatcher;Landroid/app/IUiAutomationConnection;ILjava/lang/String;)Z
 HSPLcom/android/server/am/ActivityManagerService;->startIsolatedProcess(Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Runnable;)Z
@@ -7367,9 +7769,24 @@
 PLcom/android/server/am/ActivityManagerShellCommand;->runAttachAgent(Ljava/io/PrintWriter;)I
 PLcom/android/server/am/ActivityManagerShellCommand;->runDumpHeap(Ljava/io/PrintWriter;)I
 PLcom/android/server/am/ActivityManagerShellCommand;->runForceStop(Ljava/io/PrintWriter;)I
-PLcom/android/server/am/ActivityManagerShellCommand;->runGetConfig(Ljava/io/PrintWriter;)I
+HPLcom/android/server/am/ActivityManagerShellCommand;->runGetConfig(Ljava/io/PrintWriter;)I
+PLcom/android/server/am/ActivityManagerShellCommand;->runGetCurrentUser(Ljava/io/PrintWriter;)I
 PLcom/android/server/am/ActivityManagerShellCommand;->runSendBroadcast(Ljava/io/PrintWriter;)I
 PLcom/android/server/am/ActivityManagerShellCommand;->runStartActivity(Ljava/io/PrintWriter;)I
+PLcom/android/server/am/ActivityManagerShellCommand;->runStartService(Ljava/io/PrintWriter;Z)I
+PLcom/android/server/am/AnrHelper$AnrConsumerThread;-><init>(Lcom/android/server/am/AnrHelper;)V
+PLcom/android/server/am/AnrHelper$AnrConsumerThread;->next()Lcom/android/server/am/AnrHelper$AnrRecord;
+HPLcom/android/server/am/AnrHelper$AnrConsumerThread;->run()V
+PLcom/android/server/am/AnrHelper$AnrRecord;-><init>(Lcom/android/server/am/ProcessRecord;Ljava/lang/String;Landroid/content/pm/ApplicationInfo;Ljava/lang/String;Lcom/android/server/wm/WindowProcessController;ZLjava/lang/String;)V
+PLcom/android/server/am/AnrHelper$AnrRecord;->appNotResponding(Z)V
+HSPLcom/android/server/am/AnrHelper;-><clinit>()V
+HSPLcom/android/server/am/AnrHelper;-><init>()V
+PLcom/android/server/am/AnrHelper;->access$000(Lcom/android/server/am/AnrHelper;)Ljava/util/ArrayList;
+PLcom/android/server/am/AnrHelper;->access$100()J
+PLcom/android/server/am/AnrHelper;->access$200(Lcom/android/server/am/AnrHelper;)Ljava/util/concurrent/atomic/AtomicBoolean;
+PLcom/android/server/am/AnrHelper;->appNotResponding(Lcom/android/server/am/ProcessRecord;Ljava/lang/String;)V
+PLcom/android/server/am/AnrHelper;->appNotResponding(Lcom/android/server/am/ProcessRecord;Ljava/lang/String;Landroid/content/pm/ApplicationInfo;Ljava/lang/String;Lcom/android/server/wm/WindowProcessController;ZLjava/lang/String;)V
+PLcom/android/server/am/AnrHelper;->startAnrConsumerIfNeeded()V
 HSPLcom/android/server/am/AppBindRecord;-><init>(Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/IntentBindRecord;Lcom/android/server/am/ProcessRecord;)V
 HPLcom/android/server/am/AppBindRecord;->dumpDebug(Landroid/util/proto/ProtoOutputStream;J)V
 HSPLcom/android/server/am/AppBindRecord;->dumpInIntentBind(Ljava/io/PrintWriter;Ljava/lang/String;)V
@@ -7469,17 +7886,23 @@
 HSPLcom/android/server/am/AppExitInfoTracker$AppExitInfoContainer;-><init>(Lcom/android/server/am/AppExitInfoTracker;I)V
 HSPLcom/android/server/am/AppExitInfoTracker$AppExitInfoContainer;->access$002(Lcom/android/server/am/AppExitInfoTracker$AppExitInfoContainer;I)I
 HSPLcom/android/server/am/AppExitInfoTracker$AppExitInfoContainer;->addExitInfoLocked(Landroid/app/ApplicationExitInfo;)V
+PLcom/android/server/am/AppExitInfoTracker$AppExitInfoContainer;->appendTraceIfNecessaryLocked(ILjava/io/File;)Z
+PLcom/android/server/am/AppExitInfoTracker$AppExitInfoContainer;->destroyLocked()V
 HPLcom/android/server/am/AppExitInfoTracker$AppExitInfoContainer;->dumpLocked(Ljava/io/PrintWriter;Ljava/lang/String;Landroid/icu/text/SimpleDateFormat;)V
+HPLcom/android/server/am/AppExitInfoTracker$AppExitInfoContainer;->forEachRecordLocked(Ljava/util/function/BiFunction;)V
 HSPLcom/android/server/am/AppExitInfoTracker$AppExitInfoContainer;->getExitInfoLocked(IILjava/util/ArrayList;)V
 HPLcom/android/server/am/AppExitInfoTracker$AppExitInfoContainer;->lambda$dumpLocked$2(Landroid/app/ApplicationExitInfo;Landroid/app/ApplicationExitInfo;)I
 HSPLcom/android/server/am/AppExitInfoTracker$AppExitInfoContainer;->readFromProto(Landroid/util/proto/ProtoInputStream;J)I
 HPLcom/android/server/am/AppExitInfoTracker$AppExitInfoContainer;->writeToProto(Landroid/util/proto/ProtoOutputStream;J)V
 HSPLcom/android/server/am/AppExitInfoTracker$AppExitInfoExternalSource;-><init>(Lcom/android/server/am/AppExitInfoTracker;Ljava/lang/String;Ljava/lang/Integer;)V
 HSPLcom/android/server/am/AppExitInfoTracker$AppExitInfoExternalSource;->add(IILjava/lang/Object;)V
+HPLcom/android/server/am/AppExitInfoTracker$AppExitInfoExternalSource;->addLocked(IILjava/lang/Object;)V
 HSPLcom/android/server/am/AppExitInfoTracker$AppExitInfoExternalSource;->onProcDied(IILjava/lang/Integer;)V
 HSPLcom/android/server/am/AppExitInfoTracker$AppExitInfoExternalSource;->remove(II)Landroid/util/Pair;
 HPLcom/android/server/am/AppExitInfoTracker$AppExitInfoExternalSource;->removeByUid(IZ)V
+HPLcom/android/server/am/AppExitInfoTracker$AppExitInfoExternalSource;->removeByUidLocked(IZ)V
 PLcom/android/server/am/AppExitInfoTracker$AppExitInfoExternalSource;->removeByUserId(I)V
+HSPLcom/android/server/am/AppExitInfoTracker$AppTraceRetriever;-><init>(Lcom/android/server/am/AppExitInfoTracker;)V
 HSPLcom/android/server/am/AppExitInfoTracker$IsolatedUidRecords;-><init>(Lcom/android/server/am/AppExitInfoTracker;)V
 HSPLcom/android/server/am/AppExitInfoTracker$IsolatedUidRecords;->addIsolatedUid(II)V
 HPLcom/android/server/am/AppExitInfoTracker$IsolatedUidRecords;->getUidByIsolatedUid(I)Ljava/lang/Integer;
@@ -7487,21 +7910,34 @@
 PLcom/android/server/am/AppExitInfoTracker$IsolatedUidRecords;->removeAppUidLocked(I)V
 PLcom/android/server/am/AppExitInfoTracker$IsolatedUidRecords;->removeByUserId(I)V
 HSPLcom/android/server/am/AppExitInfoTracker$IsolatedUidRecords;->removeIsolatedUid(I)I
+HPLcom/android/server/am/AppExitInfoTracker$IsolatedUidRecords;->removeIsolatedUidLocked(I)I
 HSPLcom/android/server/am/AppExitInfoTracker$KillHandler;-><init>(Lcom/android/server/am/AppExitInfoTracker;Landroid/os/Looper;)V
 HSPLcom/android/server/am/AppExitInfoTracker$KillHandler;->handleMessage(Landroid/os/Message;)V
 HSPLcom/android/server/am/AppExitInfoTracker;-><clinit>()V
 HSPLcom/android/server/am/AppExitInfoTracker;-><init>()V
+PLcom/android/server/am/AppExitInfoTracker;->access$100(Landroid/util/SparseArray;II)Ljava/lang/Object;
 HSPLcom/android/server/am/AppExitInfoTracker;->access$100(Lcom/android/server/am/AppExitInfoTracker;)Ljava/lang/Object;
 HSPLcom/android/server/am/AppExitInfoTracker;->access$200(Lcom/android/server/am/AppExitInfoTracker;)Lcom/android/server/am/ActivityManagerService;
+HPLcom/android/server/am/AppExitInfoTracker;->access$200(Lcom/android/server/am/AppExitInfoTracker;)Ljava/lang/Object;
 HSPLcom/android/server/am/AppExitInfoTracker;->access$300(J)Z
+PLcom/android/server/am/AppExitInfoTracker;->access$300(Lcom/android/server/am/AppExitInfoTracker;)Lcom/android/server/am/ActivityManagerService;
+PLcom/android/server/am/AppExitInfoTracker;->access$400(J)Z
 HSPLcom/android/server/am/AppExitInfoTracker;->access$400(Lcom/android/server/am/AppExitInfoTracker;IILjava/lang/Integer;Ljava/lang/Integer;)Z
+PLcom/android/server/am/AppExitInfoTracker;->access$500(Lcom/android/server/am/AppExitInfoTracker;IILjava/lang/Integer;Ljava/lang/Integer;)Z
 HSPLcom/android/server/am/AppExitInfoTracker;->addExitInfoInner(Ljava/lang/String;ILandroid/app/ApplicationExitInfo;)V
+HPLcom/android/server/am/AppExitInfoTracker;->addExitInfoInnerLocked(Ljava/lang/String;ILandroid/app/ApplicationExitInfo;)V
 HSPLcom/android/server/am/AppExitInfoTracker;->addExitInfoLocked(Landroid/app/ApplicationExitInfo;)Landroid/app/ApplicationExitInfo;
+HPLcom/android/server/am/AppExitInfoTracker;->copyToGzFile(Ljava/io/File;Ljava/io/File;JJ)Z
 PLcom/android/server/am/AppExitInfoTracker;->dumpHistoryProcessExitInfo(Ljava/io/PrintWriter;Ljava/lang/String;)V
 HPLcom/android/server/am/AppExitInfoTracker;->dumpHistoryProcessExitInfoLocked(Ljava/io/PrintWriter;Ljava/lang/String;Ljava/lang/String;Landroid/util/SparseArray;Landroid/icu/text/SimpleDateFormat;)V
+HPLcom/android/server/am/AppExitInfoTracker;->findAndRemoveFromSparse2dArray(Landroid/util/SparseArray;II)Ljava/lang/Object;
 HSPLcom/android/server/am/AppExitInfoTracker;->forEachPackage(Ljava/util/function/BiFunction;)V
+HPLcom/android/server/am/AppExitInfoTracker;->forEachPackageLocked(Ljava/util/function/BiFunction;)V
+PLcom/android/server/am/AppExitInfoTracker;->forEachSparse2dArray(Landroid/util/SparseArray;Ljava/util/function/Consumer;)V
 HSPLcom/android/server/am/AppExitInfoTracker;->getExitInfo(Ljava/lang/String;II)Landroid/app/ApplicationExitInfo;
 HSPLcom/android/server/am/AppExitInfoTracker;->getExitInfo(Ljava/lang/String;IIILjava/util/ArrayList;)V
+HPLcom/android/server/am/AppExitInfoTracker;->getExitInfoLocked(Ljava/lang/String;II)Landroid/app/ApplicationExitInfo;
+HPLcom/android/server/am/AppExitInfoTracker;->handleLogAnrTrace(II[Ljava/lang/String;Ljava/io/File;JJ)V
 HPLcom/android/server/am/AppExitInfoTracker;->handleNoteAppKillLocked(Landroid/app/ApplicationExitInfo;)V
 HSPLcom/android/server/am/AppExitInfoTracker;->handleNoteProcessDiedLocked(Landroid/app/ApplicationExitInfo;)V
 HSPLcom/android/server/am/AppExitInfoTracker;->handleZygoteSigChld(III)V
@@ -7509,12 +7945,17 @@
 HSPLcom/android/server/am/AppExitInfoTracker;->init(Lcom/android/server/am/ActivityManagerService;Landroid/os/Looper;)V
 HSPLcom/android/server/am/AppExitInfoTracker;->isFresh(J)Z
 HPLcom/android/server/am/AppExitInfoTracker;->lambda$dumpHistoryProcessExitInfo$6$AppExitInfoTracker(Ljava/io/PrintWriter;Landroid/icu/text/SimpleDateFormat;Ljava/lang/String;Landroid/util/SparseArray;)Ljava/lang/Integer;
+PLcom/android/server/am/AppExitInfoTracker;->lambda$handleLogAnrTrace$11(Ljava/io/File;)V
 HSPLcom/android/server/am/AppExitInfoTracker;->lambda$onSystemReady$0$AppExitInfoTracker()V
 HPLcom/android/server/am/AppExitInfoTracker;->lambda$persistProcessExitInfo$4(Landroid/util/proto/ProtoOutputStream;Ljava/lang/String;Landroid/util/SparseArray;)Ljava/lang/Integer;
 HPLcom/android/server/am/AppExitInfoTracker;->lambda$persistProcessExitInfo$5(Landroid/util/proto/ProtoOutputStream;Ljava/lang/String;Landroid/util/SparseArray;)Ljava/lang/Integer;
+PLcom/android/server/am/AppExitInfoTracker;->lambda$pruneAnrTracesIfNecessaryLocked$12(Landroid/util/ArraySet;Ljava/io/File;)Z
+HPLcom/android/server/am/AppExitInfoTracker;->lambda$pruneAnrTracesIfNecessaryLocked$13(Landroid/util/ArraySet;Ljava/lang/Integer;Landroid/app/ApplicationExitInfo;)Ljava/lang/Integer;
+HPLcom/android/server/am/AppExitInfoTracker;->lambda$pruneAnrTracesIfNecessaryLocked$14(Landroid/util/ArraySet;Ljava/lang/String;Landroid/util/SparseArray;)Ljava/lang/Integer;
 HPLcom/android/server/am/AppExitInfoTracker;->lambda$removeByUserId$7(ILjava/lang/String;Landroid/util/SparseArray;)Ljava/lang/Integer;
 HPLcom/android/server/am/AppExitInfoTracker;->lambda$updateExitInfoIfNecessary$1$AppExitInfoTracker(ILjava/util/ArrayList;ILjava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;Landroid/util/SparseArray;)Ljava/lang/Integer;
 HSPLcom/android/server/am/AppExitInfoTracker;->lambda$updateExitInfoIfNecessary$2$AppExitInfoTracker(ILjava/util/ArrayList;ILjava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;Landroid/util/SparseArray;)Ljava/lang/Integer;
+HPLcom/android/server/am/AppExitInfoTracker;->lambda$updateExitInfoIfNecessaryLocked$2$AppExitInfoTracker(ILjava/util/ArrayList;ILjava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;Landroid/util/SparseArray;)Ljava/lang/Integer;
 HSPLcom/android/server/am/AppExitInfoTracker;->loadExistingProcessExitInfo()V
 HSPLcom/android/server/am/AppExitInfoTracker;->loadPackagesFromProto(Landroid/util/proto/ProtoInputStream;J)V
 HSPLcom/android/server/am/AppExitInfoTracker;->obtainRawRecordLocked(Lcom/android/server/am/ProcessRecord;)Landroid/app/ApplicationExitInfo;
@@ -7522,12 +7963,16 @@
 HSPLcom/android/server/am/AppExitInfoTracker;->onSystemReady()V
 PLcom/android/server/am/AppExitInfoTracker;->onUserRemoved(I)V
 HPLcom/android/server/am/AppExitInfoTracker;->persistProcessExitInfo()V
+PLcom/android/server/am/AppExitInfoTracker;->pruneAnrTracesIfNecessaryLocked()V
+PLcom/android/server/am/AppExitInfoTracker;->putToSparse2dArray(Landroid/util/SparseArray;IILjava/lang/Object;Ljava/util/function/Supplier;Ljava/util/function/Consumer;)V
 HSPLcom/android/server/am/AppExitInfoTracker;->recycleRawRecordLocked(Landroid/app/ApplicationExitInfo;)V
 HSPLcom/android/server/am/AppExitInfoTracker;->registerForPackageRemoval()V
 HSPLcom/android/server/am/AppExitInfoTracker;->registerForUserRemoval()V
 PLcom/android/server/am/AppExitInfoTracker;->removeByUserId(I)V
 HPLcom/android/server/am/AppExitInfoTracker;->removePackage(Ljava/lang/String;I)V
+PLcom/android/server/am/AppExitInfoTracker;->removePackageLocked(Ljava/lang/String;IZI)V
 HSPLcom/android/server/am/AppExitInfoTracker;->scheduleChildProcDied(III)V
+PLcom/android/server/am/AppExitInfoTracker;->scheduleLogAnrTrace(II[Ljava/lang/String;Ljava/io/File;JJ)V
 HSPLcom/android/server/am/AppExitInfoTracker;->scheduleNoteAppKill(Lcom/android/server/am/ProcessRecord;IILjava/lang/String;)V
 HPLcom/android/server/am/AppExitInfoTracker;->scheduleNoteLmkdProcKilled(II)V
 HPLcom/android/server/am/AppExitInfoTracker;->scheduleNoteProcessDied(Lcom/android/server/am/ProcessRecord;)V
@@ -7535,6 +7980,7 @@
 HSPLcom/android/server/am/AppExitInfoTracker;->schedulePersistProcessExitInfo(Z)V
 HSPLcom/android/server/am/AppExitInfoTracker;->updateExistingExitInfoRecordLocked(Landroid/app/ApplicationExitInfo;Ljava/lang/Integer;Ljava/lang/Integer;)V
 HSPLcom/android/server/am/AppExitInfoTracker;->updateExitInfoIfNecessary(IILjava/lang/Integer;Ljava/lang/Integer;)Z
+HPLcom/android/server/am/AppExitInfoTracker;->updateExitInfoIfNecessaryLocked(IILjava/lang/Integer;Ljava/lang/Integer;)Z
 PLcom/android/server/am/AppNotRespondingDialog$1;-><init>(Lcom/android/server/am/AppNotRespondingDialog;)V
 PLcom/android/server/am/AppNotRespondingDialog$1;->handleMessage(Landroid/os/Message;)V
 PLcom/android/server/am/AppNotRespondingDialog$Data;-><init>(Lcom/android/server/am/ProcessRecord;Landroid/content/pm/ApplicationInfo;Z)V
@@ -7871,6 +8317,9 @@
 HSPLcom/android/server/am/BroadcastStats;->addBroadcast(Ljava/lang/String;Ljava/lang/String;IIJ)V
 HPLcom/android/server/am/BroadcastStats;->dumpCheckinStats(Ljava/io/PrintWriter;Ljava/lang/String;)V
 HPLcom/android/server/am/BroadcastStats;->dumpStats(Ljava/io/PrintWriter;Ljava/lang/String;Ljava/lang/String;)Z
+PLcom/android/server/am/BugReportHandlerUtil$ResultBroadcastReceiver;-><init>()V
+PLcom/android/server/am/BugReportHandlerUtil$ResultBroadcastReceiver;-><init>(Lcom/android/server/am/BugReportHandlerUtil$1;)V
+PLcom/android/server/am/BugReportHandlerUtil$ResultBroadcastReceiver;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
 PLcom/android/server/am/BugReportHandlerUtil;->getBugReportHandlerAppReceivers(Landroid/content/Context;Ljava/lang/String;I)Ljava/util/List;
 PLcom/android/server/am/BugReportHandlerUtil;->getCustomBugReportHandlerApp(Landroid/content/Context;)Ljava/lang/String;
 PLcom/android/server/am/BugReportHandlerUtil;->getCustomBugReportHandlerUser(Landroid/content/Context;)I
@@ -7888,12 +8337,18 @@
 HSPLcom/android/server/am/CachedAppOptimizer$FreezeHandler;-><init>(Lcom/android/server/am/CachedAppOptimizer;Lcom/android/server/am/CachedAppOptimizer$1;)V
 HPLcom/android/server/am/CachedAppOptimizer$FreezeHandler;->freezeProcess(Lcom/android/server/am/ProcessRecord;)V
 HPLcom/android/server/am/CachedAppOptimizer$FreezeHandler;->handleMessage(Landroid/os/Message;)V
+HPLcom/android/server/am/CachedAppOptimizer$FreezeHandler;->reportUnfreeze(IILjava/lang/String;)V
+HPLcom/android/server/am/CachedAppOptimizer$FreezeHandler;->reportUnfreeze(Lcom/android/server/am/CachedAppOptimizer$UnfreezeStats;)V
 HPLcom/android/server/am/CachedAppOptimizer$FreezeHandler;->unfreezeProcess(Lcom/android/server/am/ProcessRecord;)V
 HPLcom/android/server/am/CachedAppOptimizer$LastCompactionStats;-><init>([J)V
 HPLcom/android/server/am/CachedAppOptimizer$LastCompactionStats;->getRssAfterCompaction()[J
 HSPLcom/android/server/am/CachedAppOptimizer$MemCompactionHandler;-><init>(Lcom/android/server/am/CachedAppOptimizer;)V
 HSPLcom/android/server/am/CachedAppOptimizer$MemCompactionHandler;-><init>(Lcom/android/server/am/CachedAppOptimizer;Lcom/android/server/am/CachedAppOptimizer$1;)V
 HPLcom/android/server/am/CachedAppOptimizer$MemCompactionHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/am/CachedAppOptimizer$UnfreezeStats;-><init>(Lcom/android/server/am/CachedAppOptimizer;ILjava/lang/String;J)V
+PLcom/android/server/am/CachedAppOptimizer$UnfreezeStats;->getFrozenDuration()J
+PLcom/android/server/am/CachedAppOptimizer$UnfreezeStats;->getName()Ljava/lang/String;
+PLcom/android/server/am/CachedAppOptimizer$UnfreezeStats;->getPid()I
 HSPLcom/android/server/am/CachedAppOptimizer;-><clinit>()V
 HSPLcom/android/server/am/CachedAppOptimizer;-><init>(Lcom/android/server/am/ActivityManagerService;)V
 PLcom/android/server/am/CachedAppOptimizer;->access$000(Lcom/android/server/am/CachedAppOptimizer;)Ljava/lang/Object;
@@ -7935,6 +8390,7 @@
 HPLcom/android/server/am/CachedAppOptimizer;->shouldCompactBFGS(Lcom/android/server/am/ProcessRecord;J)Z
 HPLcom/android/server/am/CachedAppOptimizer;->shouldCompactPersistent(Lcom/android/server/am/ProcessRecord;J)Z
 PLcom/android/server/am/CachedAppOptimizer;->unfreezeAppAsync(Lcom/android/server/am/ProcessRecord;)V
+HPLcom/android/server/am/CachedAppOptimizer;->unfreezeAppLocked(Lcom/android/server/am/ProcessRecord;)V
 HSPLcom/android/server/am/CachedAppOptimizer;->updateCompactStatsdSampleRate()V
 HSPLcom/android/server/am/CachedAppOptimizer;->updateCompactionActions()V
 HSPLcom/android/server/am/CachedAppOptimizer;->updateCompactionThrottles()V
@@ -8259,6 +8715,7 @@
 HSPLcom/android/server/am/ProcessList;->computeNextPssTime(ILcom/android/server/am/ProcessList$ProcStateMemTracker;ZZJ)J
 HPLcom/android/server/am/ProcessList;->createAppZygoteForProcessIfNeeded(Lcom/android/server/am/ProcessRecord;)Landroid/os/AppZygote;
 HSPLcom/android/server/am/ProcessList;->createSystemServerSocketForZygote()Landroid/net/LocalSocket;
+HPLcom/android/server/am/ProcessList;->decideGwpAsanLevel(Lcom/android/server/am/ProcessRecord;)I
 HPLcom/android/server/am/ProcessList;->doStopUidForIdleUidsLocked()V
 HSPLcom/android/server/am/ProcessList;->dumpLruListHeaderLocked(Ljava/io/PrintWriter;)V
 HPLcom/android/server/am/ProcessList;->fillInProcMemInfoLocked(Lcom/android/server/am/ProcessRecord;Landroid/app/ActivityManager$RunningAppProcessInfo;I)V
@@ -8273,6 +8730,7 @@
 PLcom/android/server/am/ProcessList;->getOrCreateIsolatedUidRangeLocked(Landroid/content/pm/ApplicationInfo;Lcom/android/server/am/HostingRecord;)Lcom/android/server/am/ProcessList$IsolatedUidRange;
 HSPLcom/android/server/am/ProcessList;->getPackageAppDataInfoMap(Landroid/content/pm/PackageManagerInternal;[Ljava/lang/String;I)Ljava/util/Map;
 HSPLcom/android/server/am/ProcessList;->getProcessRecordLocked(Ljava/lang/String;IZ)Lcom/android/server/am/ProcessRecord;
+PLcom/android/server/am/ProcessList;->getProcessesWithPendingBindMounts(I)Ljava/util/Map;
 HPLcom/android/server/am/ProcessList;->getRunningAppProcessesLocked(ZIZII)Ljava/util/List;
 HSPLcom/android/server/am/ProcessList;->getUidProcStateLocked(I)I
 HSPLcom/android/server/am/ProcessList;->getUidRecordLocked(I)Lcom/android/server/am/UidRecord;
@@ -8291,6 +8749,7 @@
 HPLcom/android/server/am/ProcessList;->killAppZygoteIfNeededLocked(Landroid/os/AppZygote;)V
 HPLcom/android/server/am/ProcessList;->killAppZygoteIfNeededLocked(Landroid/os/AppZygote;Z)V
 HSPLcom/android/server/am/ProcessList;->killAppZygotesLocked(Ljava/lang/String;IIZ)V
+PLcom/android/server/am/ProcessList;->killPackageProcessesLocked(Ljava/lang/String;IIIIILjava/lang/String;)Z
 HPLcom/android/server/am/ProcessList;->killPackageProcessesLocked(Ljava/lang/String;IIILjava/lang/String;)Z
 HPLcom/android/server/am/ProcessList;->killPackageProcessesLocked(Ljava/lang/String;IIIZZZZZIILjava/lang/String;)Z
 HSPLcom/android/server/am/ProcessList;->killPackageProcessesLocked(Ljava/lang/String;IIIZZZZZLjava/lang/String;)Z
@@ -8313,7 +8772,8 @@
 HSPLcom/android/server/am/ProcessList;->remove(I)V
 HSPLcom/android/server/am/ProcessList;->removeLruProcessLocked(Lcom/android/server/am/ProcessRecord;)V
 HPLcom/android/server/am/ProcessList;->removeProcessFromAppZygoteLocked(Lcom/android/server/am/ProcessRecord;)V
-PLcom/android/server/am/ProcessList;->removeProcessLocked(Lcom/android/server/am/ProcessRecord;ZZIILjava/lang/String;)Z
+HPLcom/android/server/am/ProcessList;->removeProcessLocked(Lcom/android/server/am/ProcessRecord;ZZIILjava/lang/String;)Z
+PLcom/android/server/am/ProcessList;->removeProcessLocked(Lcom/android/server/am/ProcessRecord;ZZILjava/lang/String;)Z
 HPLcom/android/server/am/ProcessList;->removeProcessLocked(Lcom/android/server/am/ProcessRecord;ZZLjava/lang/String;)Z
 HPLcom/android/server/am/ProcessList;->removeProcessLocked(Lcom/android/server/am/ProcessRecord;ZZLjava/lang/String;I)Z
 HSPLcom/android/server/am/ProcessList;->removeProcessNameLocked(Ljava/lang/String;I)Lcom/android/server/am/ProcessRecord;
@@ -8381,6 +8841,7 @@
 PLcom/android/server/am/ProcessRecord;->appDied()V
 PLcom/android/server/am/ProcessRecord;->appDied(Ljava/lang/String;)V
 HPLcom/android/server/am/ProcessRecord;->appNotResponding(Ljava/lang/String;Landroid/content/pm/ApplicationInfo;Ljava/lang/String;Lcom/android/server/wm/WindowProcessController;ZLjava/lang/String;)V
+HPLcom/android/server/am/ProcessRecord;->appNotResponding(Ljava/lang/String;Landroid/content/pm/ApplicationInfo;Ljava/lang/String;Lcom/android/server/wm/WindowProcessController;ZLjava/lang/String;Z)V
 HSPLcom/android/server/am/ProcessRecord;->clearBoundClientUids()V
 HPLcom/android/server/am/ProcessRecord;->computeOomAdjFromActivitiesIfNecessary(Lcom/android/server/am/OomAdjuster$ComputeOomAdjWindowCallback;IZIIIII)V
 HPLcom/android/server/am/ProcessRecord;->dump(Ljava/io/PrintWriter;Ljava/lang/String;)V
@@ -8475,7 +8936,7 @@
 HSPLcom/android/server/am/ProcessRecord;->setStartParams(ILcom/android/server/am/HostingRecord;Ljava/lang/String;J)V
 HSPLcom/android/server/am/ProcessRecord;->setUsingWrapper(Z)V
 HSPLcom/android/server/am/ProcessRecord;->setWhenUnimportant(J)V
-PLcom/android/server/am/ProcessRecord;->startAppProblemLocked()V
+HPLcom/android/server/am/ProcessRecord;->startAppProblemLocked()V
 HSPLcom/android/server/am/ProcessRecord;->toShortString()Ljava/lang/String;
 HSPLcom/android/server/am/ProcessRecord;->toShortString(Ljava/lang/StringBuilder;)V
 HSPLcom/android/server/am/ProcessRecord;->toString()Ljava/lang/String;
@@ -8595,6 +9056,7 @@
 HSPLcom/android/server/am/SettingsToPropertiesMapper;->isNativeFlagsResetPerformed()Z
 HPLcom/android/server/am/SettingsToPropertiesMapper;->lambda$updatePropertiesFromSettings$0$SettingsToPropertiesMapper(Landroid/provider/DeviceConfig$Properties;)V
 PLcom/android/server/am/SettingsToPropertiesMapper;->log(Ljava/lang/String;)V
+PLcom/android/server/am/SettingsToPropertiesMapper;->log(Ljava/lang/String;Ljava/lang/Exception;)V
 HSPLcom/android/server/am/SettingsToPropertiesMapper;->makePropertyName(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
 HSPLcom/android/server/am/SettingsToPropertiesMapper;->setProperty(Ljava/lang/String;Ljava/lang/String;)V
 HSPLcom/android/server/am/SettingsToPropertiesMapper;->start(Landroid/content/ContentResolver;)Lcom/android/server/am/SettingsToPropertiesMapper;
@@ -8627,7 +9089,7 @@
 PLcom/android/server/am/UserController$6;-><init>(Lcom/android/server/am/UserController;)V
 PLcom/android/server/am/UserController$6;->performReceive(Landroid/content/Intent;ILjava/lang/String;Landroid/os/Bundle;ZZI)V
 PLcom/android/server/am/UserController$7;-><init>(Lcom/android/server/am/UserController;JLjava/lang/String;Landroid/util/ArraySet;Ljava/util/concurrent/atomic/AtomicInteger;Lcom/android/server/am/UserState;II)V
-PLcom/android/server/am/UserController$7;->sendResult(Landroid/os/Bundle;)V
+HPLcom/android/server/am/UserController$7;->sendResult(Landroid/os/Bundle;)V
 PLcom/android/server/am/UserController$Injector$1;-><init>(Lcom/android/server/am/UserController$Injector;Lcom/android/server/am/ActivityManagerService;ILcom/android/internal/util/ProgressReporter;ZLjava/lang/Runnable;)V
 PLcom/android/server/am/UserController$Injector$1;->onFinished()V
 HSPLcom/android/server/am/UserController$Injector;-><init>(Lcom/android/server/am/ActivityManagerService;)V
@@ -8660,6 +9122,7 @@
 PLcom/android/server/am/UserController$Injector;->sendPreBootBroadcast(IZLjava/lang/Runnable;)V
 PLcom/android/server/am/UserController$Injector;->showUserSwitchingDialog(Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;Ljava/lang/String;Ljava/lang/String;)V
 PLcom/android/server/am/UserController$Injector;->stackSupervisorRemoveUser(I)V
+PLcom/android/server/am/UserController$Injector;->stackSupervisorResumeFocusedStackTopActivity()V
 PLcom/android/server/am/UserController$Injector;->stackSupervisorSwitchUser(ILcom/android/server/am/UserState;)Z
 PLcom/android/server/am/UserController$Injector;->startHomeActivity(ILjava/lang/String;)V
 PLcom/android/server/am/UserController$Injector;->startPersistentApps(I)V
@@ -8684,7 +9147,7 @@
 HPLcom/android/server/am/UserController;->dispatchForegroundProfileChanged(I)V
 PLcom/android/server/am/UserController;->dispatchLockedBootComplete(I)V
 PLcom/android/server/am/UserController;->dispatchUserLocking(ILjava/util/List;)V
-PLcom/android/server/am/UserController;->dispatchUserSwitch(Lcom/android/server/am/UserState;II)V
+HPLcom/android/server/am/UserController;->dispatchUserSwitch(Lcom/android/server/am/UserState;II)V
 PLcom/android/server/am/UserController;->dispatchUserSwitchComplete(I)V
 HPLcom/android/server/am/UserController;->dump(Ljava/io/PrintWriter;)V
 PLcom/android/server/am/UserController;->dumpDebug(Landroid/util/proto/ProtoOutputStream;J)V
@@ -8724,9 +9187,11 @@
 PLcom/android/server/am/UserController;->isCallingOnHandlerThread()Z
 HPLcom/android/server/am/UserController;->isCurrentProfile(I)Z
 PLcom/android/server/am/UserController;->isCurrentUserLU(I)Z
+PLcom/android/server/am/UserController;->isDelayUserDataLockingEnabled()Z
 HSPLcom/android/server/am/UserController;->isSameProfileGroup(II)Z
 HSPLcom/android/server/am/UserController;->isUserOrItsParentRunning(I)Z
 HSPLcom/android/server/am/UserController;->isUserRunning(II)Z
+PLcom/android/server/am/UserController;->isUserSwitchUiEnabled()Z
 PLcom/android/server/am/UserController;->lambda$dispatchUserLocking$6$UserController(ILjava/util/List;)V
 PLcom/android/server/am/UserController;->lambda$finishUserStopped$6$UserController(IILjava/util/ArrayList;)V
 PLcom/android/server/am/UserController;->lambda$finishUserSwitch$0$UserController(Lcom/android/server/am/UserState;)V
@@ -8881,6 +9346,9 @@
 PLcom/android/server/appop/-$$Lambda$AppOpsService$AfBLuTvVESlqN91IyRX84hMV5nE;-><clinit>()V
 PLcom/android/server/appop/-$$Lambda$AppOpsService$AfBLuTvVESlqN91IyRX84hMV5nE;-><init>()V
 HPLcom/android/server/appop/-$$Lambda$AppOpsService$AfBLuTvVESlqN91IyRX84hMV5nE;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/appop/-$$Lambda$AppOpsService$AttributedOp$V-rw7b6Fbkw73kXYw1qrXKPwDIQ;-><clinit>()V
+PLcom/android/server/appop/-$$Lambda$AppOpsService$AttributedOp$V-rw7b6Fbkw73kXYw1qrXKPwDIQ;-><init>()V
+HPLcom/android/server/appop/-$$Lambda$AppOpsService$AttributedOp$V-rw7b6Fbkw73kXYw1qrXKPwDIQ;->accept(Ljava/lang/Object;Ljava/lang/Object;)V
 HSPLcom/android/server/appop/-$$Lambda$AppOpsService$CVMS-lLMRyZYA1tmqvyuOloKBu0;-><clinit>()V
 HSPLcom/android/server/appop/-$$Lambda$AppOpsService$CVMS-lLMRyZYA1tmqvyuOloKBu0;-><init>()V
 HPLcom/android/server/appop/-$$Lambda$AppOpsService$CVMS-lLMRyZYA1tmqvyuOloKBu0;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
@@ -8901,8 +9369,12 @@
 PLcom/android/server/appop/-$$Lambda$AppOpsService$ac4Ra3Yhj0OQzvkaL2dLbsuLAmQ;-><clinit>()V
 PLcom/android/server/appop/-$$Lambda$AppOpsService$ac4Ra3Yhj0OQzvkaL2dLbsuLAmQ;-><init>()V
 HPLcom/android/server/appop/-$$Lambda$AppOpsService$ac4Ra3Yhj0OQzvkaL2dLbsuLAmQ;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/appop/-$$Lambda$AppOpsService$gQy7GOuCV6GbjQtdNhNG6xld8I4;-><init>(Lcom/android/server/appop/AppOpsService;)V
+PLcom/android/server/appop/-$$Lambda$AppOpsService$gQy7GOuCV6GbjQtdNhNG6xld8I4;->apply(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
 HPLcom/android/server/appop/-$$Lambda$AppOpsService$mWtZBFm5Ggi69Tx6HVKXLYiPWt4;-><init>(Landroid/app/AsyncNotedAppOp;[ZILjava/lang/String;ILjava/lang/String;)V
 HPLcom/android/server/appop/-$$Lambda$AppOpsService$mWtZBFm5Ggi69Tx6HVKXLYiPWt4;->accept(Ljava/lang/Object;)V
+PLcom/android/server/appop/-$$Lambda$AppOpsService$vmE_L3936m2CQ4j7sCtdACCvHGk;-><init>(Lcom/android/server/appop/AppOpsService;)V
+PLcom/android/server/appop/-$$Lambda$AppOpsService$vmE_L3936m2CQ4j7sCtdACCvHGk;->apply(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
 HSPLcom/android/server/appop/-$$Lambda$AppOpsService$zN6prp9KCBI96qJ_QVmqGh-kpB8;-><init>(Lcom/android/server/appop/AppOpsService;Ljava/lang/String;Ljava/lang/String;I)V
 HSPLcom/android/server/appop/-$$Lambda$AppOpsService$zN6prp9KCBI96qJ_QVmqGh-kpB8;->run()V
 PLcom/android/server/appop/-$$Lambda$HistoricalRegistry$dJrtb4M71TzV6sx9vPEImQG_akU;-><clinit>()V
@@ -8919,13 +9391,14 @@
 HPLcom/android/server/appop/AppOpsService$3;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
 HSPLcom/android/server/appop/AppOpsService$4;-><init>(Lcom/android/server/appop/AppOpsService;)V
 PLcom/android/server/appop/AppOpsService$4;->getPackageTrustedToInstallApps(Ljava/lang/String;I)I
-PLcom/android/server/appop/AppOpsService$4;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+HPLcom/android/server/appop/AppOpsService$4;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/appop/AppOpsService$5;-><init>(Lcom/android/server/appop/AppOpsService;)V
 HSPLcom/android/server/appop/AppOpsService$5;-><init>(Lcom/android/server/appop/AppOpsService;Ljava/util/List;)V
 HSPLcom/android/server/appop/AppOpsService$5;->run()V
 HSPLcom/android/server/appop/AppOpsService$6;-><init>(Lcom/android/server/appop/AppOpsService;)V
 PLcom/android/server/appop/AppOpsService$8;-><init>(Lcom/android/server/appop/AppOpsService;Landroid/util/Pair;)V
-PLcom/android/server/appop/AppOpsService$8;->onCallbackDied(Landroid/os/IInterface;)V
-PLcom/android/server/appop/AppOpsService$8;->onCallbackDied(Lcom/android/internal/app/IAppOpsAsyncNotedCallback;)V
+HPLcom/android/server/appop/AppOpsService$8;->onCallbackDied(Landroid/os/IInterface;)V
+HPLcom/android/server/appop/AppOpsService$8;->onCallbackDied(Lcom/android/internal/app/IAppOpsAsyncNotedCallback;)V
 HSPLcom/android/server/appop/AppOpsService$9;-><init>(Lcom/android/server/appop/AppOpsService;Landroid/util/ArraySet;)V
 HSPLcom/android/server/appop/AppOpsService$9;->accept(Landroid/app/AppOpsManager$HistoricalOps;)V
 HSPLcom/android/server/appop/AppOpsService$9;->accept(Ljava/lang/Object;)V
@@ -8936,11 +9409,30 @@
 HSPLcom/android/server/appop/AppOpsService$AppOpsManagerInternalImpl;-><init>(Lcom/android/server/appop/AppOpsService;)V
 HSPLcom/android/server/appop/AppOpsService$AppOpsManagerInternalImpl;-><init>(Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService$1;)V
 HSPLcom/android/server/appop/AppOpsService$AppOpsManagerInternalImpl;->setDeviceAndProfileOwners(Landroid/util/SparseIntArray;)V
-PLcom/android/server/appop/AppOpsService$AppOpsManagerInternalImpl;->setModeFromPermissionPolicy(IILjava/lang/String;ILcom/android/internal/app/IAppOpsCallback;)V
+HPLcom/android/server/appop/AppOpsService$AppOpsManagerInternalImpl;->setModeFromPermissionPolicy(IILjava/lang/String;ILcom/android/internal/app/IAppOpsCallback;)V
 PLcom/android/server/appop/AppOpsService$AppOpsManagerInternalImpl;->setModeIgnoringCallback(IILjava/lang/String;ILcom/android/internal/app/IAppOpsCallback;)V
-PLcom/android/server/appop/AppOpsService$AppOpsManagerInternalImpl;->setUidModeFromPermissionPolicy(IIILcom/android/internal/app/IAppOpsCallback;)V
+HPLcom/android/server/appop/AppOpsService$AppOpsManagerInternalImpl;->setUidModeFromPermissionPolicy(IIILcom/android/internal/app/IAppOpsCallback;)V
 PLcom/android/server/appop/AppOpsService$AppOpsManagerInternalImpl;->setUidModeIgnoringCallback(IIILcom/android/internal/app/IAppOpsCallback;)V
 HPLcom/android/server/appop/AppOpsService$AppOpsManagerInternalImpl;->updateAppWidgetVisibility(Landroid/util/SparseArray;Z)V
+HSPLcom/android/server/appop/AppOpsService$AttributedOp;-><init>(Lcom/android/server/appop/AppOpsService;Ljava/lang/String;Lcom/android/server/appop/AppOpsService$Op;)V
+PLcom/android/server/appop/AppOpsService$AttributedOp;->access$1600(Lcom/android/server/appop/AppOpsService$AttributedOp;)Landroid/util/ArrayMap;
+PLcom/android/server/appop/AppOpsService$AttributedOp;->access$1800(Lcom/android/server/appop/AppOpsService$AttributedOp;)Landroid/util/ArrayMap;
+HPLcom/android/server/appop/AppOpsService$AttributedOp;->accessed(ILjava/lang/String;Ljava/lang/String;II)V
+HSPLcom/android/server/appop/AppOpsService$AttributedOp;->accessed(JJILjava/lang/String;Ljava/lang/String;II)V
+HPLcom/android/server/appop/AppOpsService$AttributedOp;->add(Landroid/util/LongSparseArray;Landroid/util/LongSparseArray;)Landroid/util/LongSparseArray;
+PLcom/android/server/appop/AppOpsService$AttributedOp;->add(Lcom/android/server/appop/AppOpsService$AttributedOp;)V
+HPLcom/android/server/appop/AppOpsService$AttributedOp;->createAttributedOpEntryLocked()Landroid/app/AppOpsManager$AttributedOpEntry;
+HPLcom/android/server/appop/AppOpsService$AttributedOp;->deepClone(Landroid/util/LongSparseArray;)Landroid/util/LongSparseArray;
+HPLcom/android/server/appop/AppOpsService$AttributedOp;->finished(Landroid/os/IBinder;)V
+HPLcom/android/server/appop/AppOpsService$AttributedOp;->finished(Landroid/os/IBinder;Z)V
+HPLcom/android/server/appop/AppOpsService$AttributedOp;->isRunning()Z
+PLcom/android/server/appop/AppOpsService$AttributedOp;->lambda$started$0(Lcom/android/server/appop/AppOpsService$AttributedOp;Landroid/os/IBinder;)V
+HPLcom/android/server/appop/AppOpsService$AttributedOp;->onClientDeath(Landroid/os/IBinder;)V
+HPLcom/android/server/appop/AppOpsService$AttributedOp;->onUidStateChanged(I)V
+PLcom/android/server/appop/AppOpsService$AttributedOp;->rejected(II)V
+HSPLcom/android/server/appop/AppOpsService$AttributedOp;->rejected(JII)V
+PLcom/android/server/appop/AppOpsService$AttributedOp;->started(Landroid/os/IBinder;I)V
+HPLcom/android/server/appop/AppOpsService$AttributedOp;->started(Landroid/os/IBinder;IZ)V
 PLcom/android/server/appop/AppOpsService$ChangeRec;-><init>(IILjava/lang/String;)V
 HSPLcom/android/server/appop/AppOpsService$ClientRestrictionState;-><init>(Lcom/android/server/appop/AppOpsService;Landroid/os/IBinder;)V
 HSPLcom/android/server/appop/AppOpsService$ClientRestrictionState;->destroy()V
@@ -8990,7 +9482,7 @@
 HSPLcom/android/server/appop/AppOpsService$InProgressStartOpEvent;-><init>(JJLandroid/os/IBinder;Ljava/lang/Runnable;ILcom/android/server/appop/AppOpsService$1;)V
 HSPLcom/android/server/appop/AppOpsService$InProgressStartOpEvent;->access$600(Lcom/android/server/appop/AppOpsService$InProgressStartOpEvent;)I
 HSPLcom/android/server/appop/AppOpsService$InProgressStartOpEvent;->access$700(Lcom/android/server/appop/AppOpsService$InProgressStartOpEvent;)I
-PLcom/android/server/appop/AppOpsService$InProgressStartOpEvent;->binderDied()V
+HPLcom/android/server/appop/AppOpsService$InProgressStartOpEvent;->binderDied()V
 HSPLcom/android/server/appop/AppOpsService$InProgressStartOpEvent;->finish()V
 HSPLcom/android/server/appop/AppOpsService$InProgressStartOpEvent;->getClientId()Landroid/os/IBinder;
 HSPLcom/android/server/appop/AppOpsService$InProgressStartOpEvent;->getStartElapsedTime()J
@@ -9012,6 +9504,7 @@
 HSPLcom/android/server/appop/AppOpsService$Op;-><init>(Lcom/android/server/appop/AppOpsService$UidState;Ljava/lang/String;I)V
 HSPLcom/android/server/appop/AppOpsService$Op;-><init>(Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService$UidState;Ljava/lang/String;II)V
 HSPLcom/android/server/appop/AppOpsService$Op;->access$100(Lcom/android/server/appop/AppOpsService$Op;)I
+HSPLcom/android/server/appop/AppOpsService$Op;->access$1000(Lcom/android/server/appop/AppOpsService$Op;Lcom/android/server/appop/AppOpsService$Op;Ljava/lang/String;)Lcom/android/server/appop/AppOpsService$AttributedOp;
 HSPLcom/android/server/appop/AppOpsService$Op;->access$1000(Lcom/android/server/appop/AppOpsService$Op;Lcom/android/server/appop/AppOpsService$Op;Ljava/lang/String;)Lcom/android/server/appop/AppOpsService$FeatureOp;
 HSPLcom/android/server/appop/AppOpsService$Op;->access$102(Lcom/android/server/appop/AppOpsService$Op;I)I
 HSPLcom/android/server/appop/AppOpsService$Op;->access$200(Lcom/android/server/appop/AppOpsService$Op;)I
@@ -9019,12 +9512,16 @@
 HSPLcom/android/server/appop/AppOpsService$Op;->access$500(Lcom/android/server/appop/AppOpsService$Op;Lcom/android/server/appop/AppOpsService$Op;Ljava/lang/String;)Lcom/android/server/appop/AppOpsService$FeatureOp;
 HSPLcom/android/server/appop/AppOpsService$Op;->access$900(Lcom/android/server/appop/AppOpsService$Op;Lcom/android/server/appop/AppOpsService$Op;Ljava/lang/String;)Lcom/android/server/appop/AppOpsService$FeatureOp;
 HSPLcom/android/server/appop/AppOpsService$Op;->createEntryLocked()Landroid/app/AppOpsManager$OpEntry;
+HPLcom/android/server/appop/AppOpsService$Op;->createSingleAttributionEntryLocked(Ljava/lang/String;)Landroid/app/AppOpsManager$OpEntry;
 HPLcom/android/server/appop/AppOpsService$Op;->createSingleFeatureEntryLocked(Ljava/lang/String;)Landroid/app/AppOpsManager$OpEntry;
 HSPLcom/android/server/appop/AppOpsService$Op;->evalMode()I
+HSPLcom/android/server/appop/AppOpsService$Op;->getOrCreateAttribution(Lcom/android/server/appop/AppOpsService$Op;Ljava/lang/String;)Lcom/android/server/appop/AppOpsService$AttributedOp;
 HSPLcom/android/server/appop/AppOpsService$Op;->getOrCreateFeature(Lcom/android/server/appop/AppOpsService$Op;Ljava/lang/String;)Lcom/android/server/appop/AppOpsService$FeatureOp;
 HSPLcom/android/server/appop/AppOpsService$Op;->isRunning()Z
+PLcom/android/server/appop/AppOpsService$Op;->removeAttributionsWithNoTime()V
 HSPLcom/android/server/appop/AppOpsService$OpEventProxyInfoPool;-><init>(Lcom/android/server/appop/AppOpsService;)V
 HSPLcom/android/server/appop/AppOpsService$OpEventProxyInfoPool;->acquire(ILjava/lang/String;Ljava/lang/String;)Landroid/app/AppOpsManager$OpEventProxyInfo;
+HSPLcom/android/server/appop/AppOpsService$Ops;-><init>(Ljava/lang/String;Lcom/android/server/appop/AppOpsService$UidState;)V
 HSPLcom/android/server/appop/AppOpsService$Ops;-><init>(Ljava/lang/String;Lcom/android/server/appop/AppOpsService$UidState;Z)V
 HSPLcom/android/server/appop/AppOpsService$UidState;-><init>(I)V
 HSPLcom/android/server/appop/AppOpsService$UidState;-><init>(Lcom/android/server/appop/AppOpsService;I)V
@@ -9044,14 +9541,19 @@
 PLcom/android/server/appop/AppOpsService;->access$1300(Lcom/android/server/appop/AppOpsService;Landroid/content/pm/PackageInfo;)Z
 PLcom/android/server/appop/AppOpsService;->access$1400(Lcom/android/server/appop/AppOpsService;)Landroid/util/ArraySet;
 HSPLcom/android/server/appop/AppOpsService;->access$1402(Lcom/android/server/appop/AppOpsService;Landroid/util/ArraySet;)Landroid/util/ArraySet;
+PLcom/android/server/appop/AppOpsService;->access$1500(Lcom/android/server/appop/AppOpsService;)Ljava/util/List;
 HSPLcom/android/server/appop/AppOpsService;->access$1500(Lcom/android/server/appop/AppOpsService;Landroid/util/ArraySet;)V
+PLcom/android/server/appop/AppOpsService;->access$1600(Lcom/android/server/appop/AppOpsService;Ljava/util/List;)V
 PLcom/android/server/appop/AppOpsService;->access$1700(Lcom/android/server/appop/AppOpsService;)Landroid/util/ArrayMap;
+PLcom/android/server/appop/AppOpsService;->access$1700(Lcom/android/server/appop/AppOpsService;Landroid/util/ArraySet;)V
 HPLcom/android/server/appop/AppOpsService;->access$1900(Lcom/android/server/appop/AppOpsService;Landroid/util/SparseArray;Z)V
 PLcom/android/server/appop/AppOpsService;->access$2000(Lcom/android/server/appop/AppOpsService;IIILcom/android/internal/app/IAppOpsCallback;)V
 PLcom/android/server/appop/AppOpsService;->access$2100(Lcom/android/server/appop/AppOpsService;IILjava/lang/String;ILcom/android/internal/app/IAppOpsCallback;)V
 PLcom/android/server/appop/AppOpsService;->access$2200(Lcom/android/server/appop/AppOpsService;Landroid/util/SparseArray;Z)V
-PLcom/android/server/appop/AppOpsService;->access$2300(Lcom/android/server/appop/AppOpsService;IIILcom/android/internal/app/IAppOpsCallback;)V
-PLcom/android/server/appop/AppOpsService;->access$2400(Lcom/android/server/appop/AppOpsService;IILjava/lang/String;ILcom/android/internal/app/IAppOpsCallback;)V
+HPLcom/android/server/appop/AppOpsService;->access$2300(Lcom/android/server/appop/AppOpsService;IIILcom/android/internal/app/IAppOpsCallback;)V
+HPLcom/android/server/appop/AppOpsService;->access$2400(Lcom/android/server/appop/AppOpsService;IILjava/lang/String;ILcom/android/internal/app/IAppOpsCallback;)V
+PLcom/android/server/appop/AppOpsService;->access$2400(Lcom/android/server/appop/AppOpsService;Landroid/util/SparseArray;Z)V
+PLcom/android/server/appop/AppOpsService;->access$2500(Lcom/android/server/appop/AppOpsService;IIILcom/android/internal/app/IAppOpsCallback;)V
 PLcom/android/server/appop/AppOpsService;->access$300()[I
 PLcom/android/server/appop/AppOpsService;->access$300(Lcom/android/server/appop/AppOpsService;)Landroid/app/ActivityManagerInternal;
 HSPLcom/android/server/appop/AppOpsService;->access$300(Lcom/android/server/appop/AppOpsService;)Lcom/android/server/appop/AppOpsService$OpEventProxyInfoPool;
@@ -9062,6 +9564,7 @@
 HSPLcom/android/server/appop/AppOpsService;->access$500(Lcom/android/server/appop/AppOpsService;IILjava/lang/String;Z)V
 HSPLcom/android/server/appop/AppOpsService;->access$600(Lcom/android/server/appop/AppOpsService;)Lcom/android/server/appop/AppOpsService$InProgressStartOpEventPool;
 PLcom/android/server/appop/AppOpsService;->access$700(Lcom/android/server/appop/AppOpsService$FeatureOp;Landroid/os/IBinder;)V
+PLcom/android/server/appop/AppOpsService;->access$800(Lcom/android/server/appop/AppOpsService$AttributedOp;Landroid/os/IBinder;)V
 PLcom/android/server/appop/AppOpsService;->access$800(Lcom/android/server/appop/AppOpsService$FeatureOp;Landroid/os/IBinder;)V
 HSPLcom/android/server/appop/AppOpsService;->access$800(Lcom/android/server/appop/AppOpsService;)V
 HSPLcom/android/server/appop/AppOpsService;->access$900(Lcom/android/server/appop/AppOpsService;)V
@@ -9077,7 +9580,7 @@
 HSPLcom/android/server/appop/AppOpsService;->checkSystemUid(Ljava/lang/String;)V
 HPLcom/android/server/appop/AppOpsService;->collectAsyncNotedOp(ILjava/lang/String;ILjava/lang/String;Ljava/lang/String;)V
 HSPLcom/android/server/appop/AppOpsService;->collectOps(Lcom/android/server/appop/AppOpsService$Ops;[I)Ljava/util/ArrayList;
-PLcom/android/server/appop/AppOpsService;->collectRuntimeAppOpAccessMessage()Landroid/app/RuntimeAppOpAccessMessage;
+HPLcom/android/server/appop/AppOpsService;->collectRuntimeAppOpAccessMessage()Landroid/app/RuntimeAppOpAccessMessage;
 HSPLcom/android/server/appop/AppOpsService;->commitUidPendingStateLocked(Lcom/android/server/appop/AppOpsService$UidState;)V
 HPLcom/android/server/appop/AppOpsService;->dump(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V
 HPLcom/android/server/appop/AppOpsService;->dumpStatesLocked(Ljava/io/PrintWriter;JLcom/android/server/appop/AppOpsService$Op;JLjava/text/SimpleDateFormat;Ljava/util/Date;Ljava/lang/String;)V
@@ -9086,18 +9589,22 @@
 HSPLcom/android/server/appop/AppOpsService;->enforceManageAppOpsModes(III)V
 HSPLcom/android/server/appop/AppOpsService;->ensureHistoricalOpRequestIsValid(ILjava/lang/String;Ljava/lang/String;Ljava/util/List;IJJI)V
 HSPLcom/android/server/appop/AppOpsService;->evalAllForegroundOpsLocked()V
-PLcom/android/server/appop/AppOpsService;->extractAsyncOps(Ljava/lang/String;)Ljava/util/List;
+HPLcom/android/server/appop/AppOpsService;->extractAsyncOps(Ljava/lang/String;)Ljava/util/List;
 HSPLcom/android/server/appop/AppOpsService;->finishOperation(Landroid/os/IBinder;IILjava/lang/String;Ljava/lang/String;)V
 HSPLcom/android/server/appop/AppOpsService;->finishOperationLocked(Lcom/android/server/appop/AppOpsService$Op;Ljava/lang/String;Z)V
+PLcom/android/server/appop/AppOpsService;->getAppOpsServiceDelegate()Landroid/app/AppOpsManagerInternal$CheckOpsDelegate;
 HPLcom/android/server/appop/AppOpsService;->getAsyncNotedOpsKey(Ljava/lang/String;I)Landroid/util/Pair;
+HPLcom/android/server/appop/AppOpsService;->getBypassforPackage(Lcom/android/server/pm/parsing/pkg/AndroidPackage;)Landroid/app/AppOpsManager$RestrictionBypass;
 HSPLcom/android/server/appop/AppOpsService;->getHistoricalOps(ILjava/lang/String;Ljava/lang/String;Ljava/util/List;IJJILandroid/os/RemoteCallback;)V
 PLcom/android/server/appop/AppOpsService;->getHistoricalOps(ILjava/lang/String;Ljava/util/List;JJILandroid/os/RemoteCallback;)V
 HSPLcom/android/server/appop/AppOpsService;->getOpEntryForResult(Lcom/android/server/appop/AppOpsService$Op;J)Landroid/app/AppOpsManager$OpEntry;
+HPLcom/android/server/appop/AppOpsService;->getOpLocked(IILjava/lang/String;Ljava/lang/String;Landroid/app/AppOpsManager$RestrictionBypass;Z)Lcom/android/server/appop/AppOpsService$Op;
 HSPLcom/android/server/appop/AppOpsService;->getOpLocked(IILjava/lang/String;Ljava/lang/String;ZZ)Lcom/android/server/appop/AppOpsService$Op;
 HSPLcom/android/server/appop/AppOpsService;->getOpLocked(IILjava/lang/String;ZZ)Lcom/android/server/appop/AppOpsService$Op;
 HSPLcom/android/server/appop/AppOpsService;->getOpLocked(Lcom/android/server/appop/AppOpsService$Ops;IIZ)Lcom/android/server/appop/AppOpsService$Op;
 HSPLcom/android/server/appop/AppOpsService;->getOpLocked(Lcom/android/server/appop/AppOpsService$Ops;IZ)Lcom/android/server/appop/AppOpsService$Op;
 HPLcom/android/server/appop/AppOpsService;->getOpsForPackage(ILjava/lang/String;[I)Ljava/util/List;
+HPLcom/android/server/appop/AppOpsService;->getOpsLocked(ILjava/lang/String;Ljava/lang/String;Landroid/app/AppOpsManager$RestrictionBypass;Z)Lcom/android/server/appop/AppOpsService$Ops;
 HSPLcom/android/server/appop/AppOpsService;->getOpsRawLocked(ILjava/lang/String;Ljava/lang/String;ZZ)Lcom/android/server/appop/AppOpsService$Ops;
 HSPLcom/android/server/appop/AppOpsService;->getOpsRawLocked(ILjava/lang/String;ZZ)Lcom/android/server/appop/AppOpsService$Ops;
 HSPLcom/android/server/appop/AppOpsService;->getOpsRawNoVerifyLocked(ILjava/lang/String;Ljava/lang/String;ZZ)Lcom/android/server/appop/AppOpsService$Ops;
@@ -9112,6 +9619,7 @@
 HSPLcom/android/server/appop/AppOpsService;->initializeRarelyUsedPackagesList(Landroid/util/ArraySet;)V
 HSPLcom/android/server/appop/AppOpsService;->isIgnoredAppOp(I)Z
 HSPLcom/android/server/appop/AppOpsService;->isOpRestrictedDueToSuspend(ILjava/lang/String;I)Z
+HPLcom/android/server/appop/AppOpsService;->isOpRestrictedLocked(IILjava/lang/String;Landroid/app/AppOpsManager$RestrictionBypass;)Z
 HSPLcom/android/server/appop/AppOpsService;->isOpRestrictedLocked(IILjava/lang/String;Ljava/lang/String;Z)Z
 HSPLcom/android/server/appop/AppOpsService;->isOpRestrictedLocked(IILjava/lang/String;Z)Z
 HPLcom/android/server/appop/AppOpsService;->isOperationActive(IILjava/lang/String;)Z
@@ -9124,8 +9632,10 @@
 PLcom/android/server/appop/AppOpsService;->lambda$NDUi03ZZuuR42-RDEIQ0UELKycc(Lcom/android/server/appop/AppOpsService;Landroid/util/ArraySet;IILjava/lang/String;)V
 HPLcom/android/server/appop/AppOpsService;->lambda$ac4Ra3Yhj0OQzvkaL2dLbsuLAmQ(Lcom/android/server/appop/AppOpsService;Landroid/util/ArraySet;IILjava/lang/String;Z)V
 HPLcom/android/server/appop/AppOpsService;->lambda$collectAsyncNotedOp$2(Landroid/app/AsyncNotedAppOp;[ZILjava/lang/String;ILjava/lang/String;Lcom/android/internal/app/IAppOpsAsyncNotedCallback;)V
+PLcom/android/server/appop/AppOpsService;->lambda$gQy7GOuCV6GbjQtdNhNG6xld8I4(Lcom/android/server/appop/AppOpsService;IILjava/lang/String;Z)I
 HPLcom/android/server/appop/AppOpsService;->lambda$getHistoricalOps$1(Landroid/os/RemoteCallback;)V
 HSPLcom/android/server/appop/AppOpsService;->lambda$systemReady$0$AppOpsService(Ljava/lang/String;Ljava/lang/String;I)V
+PLcom/android/server/appop/AppOpsService;->lambda$vmE_L3936m2CQ4j7sCtdACCvHGk(Lcom/android/server/appop/AppOpsService;IILjava/lang/String;Ljava/lang/String;ZLjava/lang/String;)I
 HPLcom/android/server/appop/AppOpsService;->noteAsyncOp(Ljava/lang/String;ILjava/lang/String;ILjava/lang/String;Ljava/lang/String;)V
 HSPLcom/android/server/appop/AppOpsService;->noteOperation(IILjava/lang/String;Ljava/lang/String;)I
 HSPLcom/android/server/appop/AppOpsService;->noteOperation(IILjava/lang/String;Ljava/lang/String;ZLjava/lang/String;)I
@@ -9142,12 +9652,16 @@
 HSPLcom/android/server/appop/AppOpsService;->notifyOpChangedSync(IILjava/lang/String;I)V
 HPLcom/android/server/appop/AppOpsService;->notifyOpChecked(Landroid/util/ArraySet;IILjava/lang/String;I)V
 HSPLcom/android/server/appop/AppOpsService;->notifyWatchersOfChange(II)V
+PLcom/android/server/appop/AppOpsService;->onClientDeath(Lcom/android/server/appop/AppOpsService$AttributedOp;Landroid/os/IBinder;)V
 PLcom/android/server/appop/AppOpsService;->onClientDeath(Lcom/android/server/appop/AppOpsService$FeatureOp;Landroid/os/IBinder;)V
 HSPLcom/android/server/appop/AppOpsService;->packageRemoved(ILjava/lang/String;)V
 HSPLcom/android/server/appop/AppOpsService;->permissionToOpCode(Ljava/lang/String;)I
+PLcom/android/server/appop/AppOpsService;->pruneOpLocked(Lcom/android/server/appop/AppOpsService$Op;ILjava/lang/String;)V
 HSPLcom/android/server/appop/AppOpsService;->publish()V
 HSPLcom/android/server/appop/AppOpsService;->publish(Landroid/content/Context;)V
+HSPLcom/android/server/appop/AppOpsService;->readAttributionOp(Lorg/xmlpull/v1/XmlPullParser;Lcom/android/server/appop/AppOpsService$Op;Ljava/lang/String;)V
 HSPLcom/android/server/appop/AppOpsService;->readFeatureOp(Lorg/xmlpull/v1/XmlPullParser;Lcom/android/server/appop/AppOpsService$Op;Ljava/lang/String;)V
+HSPLcom/android/server/appop/AppOpsService;->readOp(Lorg/xmlpull/v1/XmlPullParser;Lcom/android/server/appop/AppOpsService$UidState;Ljava/lang/String;)V
 HSPLcom/android/server/appop/AppOpsService;->readOp(Lorg/xmlpull/v1/XmlPullParser;Lcom/android/server/appop/AppOpsService$UidState;Ljava/lang/String;Z)V
 HSPLcom/android/server/appop/AppOpsService;->readPackage(Lorg/xmlpull/v1/XmlPullParser;)V
 HSPLcom/android/server/appop/AppOpsService;->readState()V
@@ -9182,13 +9696,14 @@
 HSPLcom/android/server/appop/AppOpsService;->startOperation(Landroid/os/IBinder;IILjava/lang/String;Ljava/lang/String;Z)I
 HSPLcom/android/server/appop/AppOpsService;->startOperation(Landroid/os/IBinder;IILjava/lang/String;Ljava/lang/String;ZZLjava/lang/String;)I
 HPLcom/android/server/appop/AppOpsService;->startWatchingActive([ILcom/android/internal/app/IAppOpsActiveCallback;)V
-PLcom/android/server/appop/AppOpsService;->startWatchingAsyncNoted(Ljava/lang/String;Lcom/android/internal/app/IAppOpsAsyncNotedCallback;)V
+HPLcom/android/server/appop/AppOpsService;->startWatchingAsyncNoted(Ljava/lang/String;Lcom/android/internal/app/IAppOpsAsyncNotedCallback;)V
 HSPLcom/android/server/appop/AppOpsService;->startWatchingMode(ILjava/lang/String;Lcom/android/internal/app/IAppOpsCallback;)V
 HSPLcom/android/server/appop/AppOpsService;->startWatchingModeWithFlags(ILjava/lang/String;ILcom/android/internal/app/IAppOpsCallback;)V
-PLcom/android/server/appop/AppOpsService;->startWatchingNoted([ILcom/android/internal/app/IAppOpsNotedCallback;)V
+HPLcom/android/server/appop/AppOpsService;->startWatchingNoted([ILcom/android/internal/app/IAppOpsNotedCallback;)V
 HPLcom/android/server/appop/AppOpsService;->stopWatchingActive(Lcom/android/internal/app/IAppOpsActiveCallback;)V
 HPLcom/android/server/appop/AppOpsService;->stopWatchingMode(Lcom/android/internal/app/IAppOpsCallback;)V
 HPLcom/android/server/appop/AppOpsService;->stopWatchingNoted(Lcom/android/internal/app/IAppOpsNotedCallback;)V
+HPLcom/android/server/appop/AppOpsService;->switchPackageIfBootTimeOrRarelyUsedLocked(Ljava/lang/String;)V
 HPLcom/android/server/appop/AppOpsService;->switchPackageIfRarelyUsedLocked(Ljava/lang/String;)V
 HSPLcom/android/server/appop/AppOpsService;->systemReady()V
 HSPLcom/android/server/appop/AppOpsService;->uidRemoved(I)V
@@ -9198,6 +9713,7 @@
 HSPLcom/android/server/appop/AppOpsService;->updatePermissionRevokedCompat(III)V
 HSPLcom/android/server/appop/AppOpsService;->updateUidProcState(III)V
 HSPLcom/android/server/appop/AppOpsService;->upgradeLocked(I)V
+HPLcom/android/server/appop/AppOpsService;->verifyAndGetBypass(ILjava/lang/String;Ljava/lang/String;)Landroid/app/AppOpsManager$RestrictionBypass;
 HSPLcom/android/server/appop/AppOpsService;->verifyAndGetIsPrivileged(ILjava/lang/String;)Z
 HSPLcom/android/server/appop/AppOpsService;->verifyAndGetIsPrivileged(ILjava/lang/String;Ljava/lang/String;)Z
 HSPLcom/android/server/appop/AppOpsService;->verifyIncomingOp(I)V
@@ -9214,6 +9730,7 @@
 HSPLcom/android/server/appop/AudioRestrictionManager;->setCameraAudioRestriction(I)V
 HSPLcom/android/server/appop/AudioRestrictionManager;->setZenModeAudioRestriction(IIII[Ljava/lang/String;)V
 HSPLcom/android/server/appop/HistoricalRegistry$1;-><init>(Lcom/android/server/appop/HistoricalRegistry;Landroid/os/Handler;Landroid/content/ContentResolver;)V
+PLcom/android/server/appop/HistoricalRegistry$1;->onChange(Z)V
 HSPLcom/android/server/appop/HistoricalRegistry$Persistence;-><clinit>()V
 HSPLcom/android/server/appop/HistoricalRegistry$Persistence;-><init>(JJ)V
 HSPLcom/android/server/appop/HistoricalRegistry$Persistence;->access$100(Lcom/android/server/appop/HistoricalRegistry$Persistence;Landroid/app/AppOpsManager$HistoricalOps;ILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;IJJI)V
@@ -9233,6 +9750,7 @@
 HPLcom/android/server/appop/HistoricalRegistry$Persistence;->handlePersistHistoricalOpsRecursiveDLocked(Ljava/io/File;Ljava/io/File;Ljava/util/List;Ljava/util/Set;I)V
 HPLcom/android/server/appop/HistoricalRegistry$Persistence;->normalizeSnapshotForSlotDuration(Ljava/util/List;J)V
 HPLcom/android/server/appop/HistoricalRegistry$Persistence;->persistHistoricalOpsDLocked(Ljava/util/List;)V
+HPLcom/android/server/appop/HistoricalRegistry$Persistence;->readHistoricalAttributionOpsDLocked(Landroid/app/AppOpsManager$HistoricalOps;ILjava/lang/String;Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;[Ljava/lang/String;IID)Landroid/app/AppOpsManager$HistoricalOps;
 HSPLcom/android/server/appop/HistoricalRegistry$Persistence;->readHistoricalFeatureOpsDLocked(Landroid/app/AppOpsManager$HistoricalOps;ILjava/lang/String;Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;[Ljava/lang/String;IID)Landroid/app/AppOpsManager$HistoricalOps;
 HSPLcom/android/server/appop/HistoricalRegistry$Persistence;->readHistoricalOpDLocked(Landroid/app/AppOpsManager$HistoricalOps;ILjava/lang/String;Ljava/lang/String;Lorg/xmlpull/v1/XmlPullParser;[Ljava/lang/String;IID)Landroid/app/AppOpsManager$HistoricalOps;
 HPLcom/android/server/appop/HistoricalRegistry$Persistence;->readHistoricalOpDLocked(Landroid/app/AppOpsManager$HistoricalOps;ILjava/lang/String;Lorg/xmlpull/v1/XmlPullParser;[Ljava/lang/String;ID)Landroid/app/AppOpsManager$HistoricalOps;
@@ -9251,6 +9769,7 @@
 HSPLcom/android/server/appop/HistoricalRegistry$Persistence;->readeHistoricalOpsDLocked(Lorg/xmlpull/v1/XmlPullParser;ILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;IJJI[J)Landroid/app/AppOpsManager$HistoricalOps;
 HPLcom/android/server/appop/HistoricalRegistry$Persistence;->readeHistoricalOpsDLocked(Lorg/xmlpull/v1/XmlPullParser;ILjava/lang/String;[Ljava/lang/String;JJI[J)Landroid/app/AppOpsManager$HistoricalOps;
 PLcom/android/server/appop/HistoricalRegistry$Persistence;->spliceFromEnd(Landroid/app/AppOpsManager$HistoricalOps;D)Landroid/app/AppOpsManager$HistoricalOps;
+HPLcom/android/server/appop/HistoricalRegistry$Persistence;->writeHistoricalAttributionOpsDLocked(Landroid/app/AppOpsManager$AttributedHistoricalOps;Lorg/xmlpull/v1/XmlSerializer;)V
 HPLcom/android/server/appop/HistoricalRegistry$Persistence;->writeHistoricalFeatureOpsDLocked(Landroid/app/AppOpsManager$HistoricalFeatureOps;Lorg/xmlpull/v1/XmlSerializer;)V
 HPLcom/android/server/appop/HistoricalRegistry$Persistence;->writeHistoricalOpDLocked(Landroid/app/AppOpsManager$HistoricalOp;Lorg/xmlpull/v1/XmlSerializer;)V
 HPLcom/android/server/appop/HistoricalRegistry$Persistence;->writeHistoricalOpDLocked(Landroid/app/AppOpsManager$HistoricalOps;Lorg/xmlpull/v1/XmlSerializer;)V
@@ -9260,6 +9779,7 @@
 HPLcom/android/server/appop/HistoricalRegistry$Persistence;->writeStateOnLocked(Landroid/app/AppOpsManager$HistoricalOp;JLorg/xmlpull/v1/XmlSerializer;)V
 HSPLcom/android/server/appop/HistoricalRegistry;-><clinit>()V
 HSPLcom/android/server/appop/HistoricalRegistry;-><init>(Ljava/lang/Object;)V
+PLcom/android/server/appop/HistoricalRegistry;->access$000(Lcom/android/server/appop/HistoricalRegistry;Landroid/content/ContentResolver;)V
 PLcom/android/server/appop/HistoricalRegistry;->clearHistory()V
 HSPLcom/android/server/appop/HistoricalRegistry;->clearHistory(ILjava/lang/String;)V
 PLcom/android/server/appop/HistoricalRegistry;->clearHistoryOnDiskDLocked()V
@@ -9280,6 +9800,7 @@
 HSPLcom/android/server/appop/HistoricalRegistry;->persistPendingHistory(Ljava/util/List;)V
 PLcom/android/server/appop/HistoricalRegistry;->resampleHistoryOnDiskInMemoryDMLocked(J)V
 PLcom/android/server/appop/HistoricalRegistry;->schedulePersistHistoricalOpsMLocked(Landroid/app/AppOpsManager$HistoricalOps;)V
+PLcom/android/server/appop/HistoricalRegistry;->setHistoryParameters(IJJ)V
 HSPLcom/android/server/appop/HistoricalRegistry;->systemReady(Landroid/content/ContentResolver;)V
 HSPLcom/android/server/appop/HistoricalRegistry;->updateParametersFromSetting(Landroid/content/ContentResolver;)V
 PLcom/android/server/appprediction/-$$Lambda$AppPredictionManagerService$PredictionManagerServiceStub$3-HMCieo6-UZfG43p_6ip1hrL0k;-><init>(Landroid/app/prediction/AppPredictionSessionId;Landroid/content/pm/ParceledListSlice;Landroid/app/prediction/IPredictionCallback;)V
@@ -9391,7 +9912,7 @@
 HPLcom/android/server/appprediction/AppPredictionPerUserService;->getComponentName(Landroid/app/prediction/AppPredictionSessionId;)Landroid/content/ComponentName;
 HPLcom/android/server/appprediction/AppPredictionPerUserService;->getRemoteServiceLocked()Lcom/android/server/appprediction/RemoteAppPredictionService;
 HPLcom/android/server/appprediction/AppPredictionPerUserService;->getRemoteServiceLocked(Landroid/content/ComponentName;)Lcom/android/server/appprediction/RemoteAppPredictionService;
-PLcom/android/server/appprediction/AppPredictionPerUserService;->lambda$notifyAppTargetEventLocked$1(Landroid/app/prediction/AppPredictionSessionId;Landroid/app/prediction/AppTargetEvent;Landroid/service/appprediction/IPredictionService;)V
+HPLcom/android/server/appprediction/AppPredictionPerUserService;->lambda$notifyAppTargetEventLocked$1(Landroid/app/prediction/AppPredictionSessionId;Landroid/app/prediction/AppTargetEvent;Landroid/service/appprediction/IPredictionService;)V
 PLcom/android/server/appprediction/AppPredictionPerUserService;->lambda$onCreatePredictionSessionLocked$0(Landroid/app/prediction/AppPredictionContext;Landroid/app/prediction/AppPredictionSessionId;Landroid/service/appprediction/IPredictionService;)V
 PLcom/android/server/appprediction/AppPredictionPerUserService;->lambda$onDestroyPredictionSessionLocked$7(Landroid/app/prediction/AppPredictionSessionId;Landroid/service/appprediction/IPredictionService;)V
 PLcom/android/server/appprediction/AppPredictionPerUserService;->lambda$ot809pjFOVEJ6shAJalMZ9_QhCo(Lcom/android/server/appprediction/AppPredictionPerUserService;Landroid/app/prediction/AppPredictionSessionId;)V
@@ -9623,6 +10144,7 @@
 HPLcom/android/server/appwidget/AppWidgetServiceImpl;->lookupProviderLocked(Lcom/android/server/appwidget/AppWidgetServiceImpl$ProviderId;)Lcom/android/server/appwidget/AppWidgetServiceImpl$Provider;
 HPLcom/android/server/appwidget/AppWidgetServiceImpl;->lookupWidgetLocked(IILjava/lang/String;)Lcom/android/server/appwidget/AppWidgetServiceImpl$Widget;
 HPLcom/android/server/appwidget/AppWidgetServiceImpl;->maskWidgetsViewsLocked(Lcom/android/server/appwidget/AppWidgetServiceImpl$Provider;Lcom/android/server/appwidget/AppWidgetServiceImpl$Widget;)V
+HPLcom/android/server/appwidget/AppWidgetServiceImpl;->noteAppWidgetTapped(ILjava/lang/String;)V
 HPLcom/android/server/appwidget/AppWidgetServiceImpl;->notifyAppWidgetViewDataChanged(Ljava/lang/String;[II)V
 HSPLcom/android/server/appwidget/AppWidgetServiceImpl;->onConfigurationChanged()V
 HPLcom/android/server/appwidget/AppWidgetServiceImpl;->onCrossProfileWidgetProvidersChanged(ILjava/util/List;)V
@@ -9649,6 +10171,7 @@
 HPLcom/android/server/appwidget/AppWidgetServiceImpl;->removeProvidersForPackageLocked(Ljava/lang/String;I)Z
 PLcom/android/server/appwidget/AppWidgetServiceImpl;->removeWidgetLocked(Lcom/android/server/appwidget/AppWidgetServiceImpl$Widget;)V
 HPLcom/android/server/appwidget/AppWidgetServiceImpl;->removeWidgetsForPackageLocked(Ljava/lang/String;II)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->requestPinAppWidget(Ljava/lang/String;Landroid/content/ComponentName;Landroid/os/Bundle;Landroid/content/IntentSender;)Z
 PLcom/android/server/appwidget/AppWidgetServiceImpl;->resolveHostUidLocked(Ljava/lang/String;I)V
 PLcom/android/server/appwidget/AppWidgetServiceImpl;->restoreFinished(I)V
 HPLcom/android/server/appwidget/AppWidgetServiceImpl;->saveGroupStateAsync(I)V
@@ -9691,6 +10214,7 @@
 PLcom/android/server/attention/-$$Lambda$AttentionManagerService$UserState$2cc0P7pJchsigKpbEq7IoxYFsSM;-><init>(Lcom/android/server/attention/AttentionManagerService$UserState;)V
 PLcom/android/server/attention/-$$Lambda$AttentionManagerService$UserState$2cc0P7pJchsigKpbEq7IoxYFsSM;->run()V
 PLcom/android/server/attention/AttentionManagerService$1;-><init>(Lcom/android/server/attention/AttentionManagerService;Lcom/android/server/attention/AttentionManagerService$UserState;Landroid/attention/AttentionManagerInternal$AttentionCallbackInternal;)V
+PLcom/android/server/attention/AttentionManagerService$1;->logStats(I)V
 PLcom/android/server/attention/AttentionManagerService$1;->onFailure(I)V
 HPLcom/android/server/attention/AttentionManagerService$1;->onSuccess(IJ)V
 HPLcom/android/server/attention/AttentionManagerService$AttentionCheck;-><init>(Landroid/attention/AttentionManagerInternal$AttentionCallbackInternal;Landroid/service/attention/IAttentionCallback;)V
@@ -9858,6 +10382,7 @@
 PLcom/android/server/audio/AudioDeviceBroker;->postDisconnectHearingAid()V
 PLcom/android/server/audio/AudioDeviceBroker;->postObserveDevicesForAllStreams()V
 PLcom/android/server/audio/AudioDeviceBroker;->postReportNewRoutes()V
+PLcom/android/server/audio/AudioDeviceBroker;->postScoClientDied(Ljava/lang/Object;)V
 HPLcom/android/server/audio/AudioDeviceBroker;->postSetAvrcpAbsoluteVolumeIndex(I)V
 PLcom/android/server/audio/AudioDeviceBroker;->postSetVolumeIndexOnDevice(IIILjava/lang/String;)V
 PLcom/android/server/audio/AudioDeviceBroker;->postSetWiredDeviceConnectionState(Lcom/android/server/audio/AudioDeviceInventory$WiredDeviceConnectionState;I)V
@@ -9945,6 +10470,7 @@
 PLcom/android/server/audio/AudioService$4;->binderDied()V
 HSPLcom/android/server/audio/AudioService$5;-><init>(Lcom/android/server/audio/AudioService;)V
 PLcom/android/server/audio/AudioService$AsdProxy;-><init>(Lcom/android/server/audio/AudioService;Landroid/media/IAudioServerStateDispatcher;)V
+PLcom/android/server/audio/AudioService$AsdProxy;->binderDied()V
 PLcom/android/server/audio/AudioService$AsdProxy;->callback()Landroid/media/IAudioServerStateDispatcher;
 HSPLcom/android/server/audio/AudioService$AudioHandler;-><init>(Lcom/android/server/audio/AudioService;)V
 HSPLcom/android/server/audio/AudioService$AudioHandler;-><init>(Lcom/android/server/audio/AudioService;Lcom/android/server/audio/AudioService$1;)V
@@ -9983,6 +10509,7 @@
 PLcom/android/server/audio/AudioService$DeviceVolumeUpdate;->getVolumeIndex()I
 PLcom/android/server/audio/AudioService$DeviceVolumeUpdate;->hasVolumeIndex()Z
 HPLcom/android/server/audio/AudioService$ForceControlStreamClient;-><init>(Lcom/android/server/audio/AudioService;Landroid/os/IBinder;)V
+PLcom/android/server/audio/AudioService$ForceControlStreamClient;->binderDied()V
 PLcom/android/server/audio/AudioService$ForceControlStreamClient;->getBinder()Landroid/os/IBinder;
 HPLcom/android/server/audio/AudioService$ForceControlStreamClient;->release()V
 HSPLcom/android/server/audio/AudioService$Lifecycle;-><init>(Landroid/content/Context;)V
@@ -10029,9 +10556,11 @@
 HSPLcom/android/server/audio/AudioService$VolumeGroupState;->applyAllVolumes()V
 HPLcom/android/server/audio/AudioService$VolumeGroupState;->dump(Ljava/io/PrintWriter;)V
 PLcom/android/server/audio/AudioService$VolumeGroupState;->getDeviceForVolume()I
+PLcom/android/server/audio/AudioService$VolumeGroupState;->getIndex(I)I
 HSPLcom/android/server/audio/AudioService$VolumeGroupState;->getSettingNameForDevice(I)Ljava/lang/String;
 HSPLcom/android/server/audio/AudioService$VolumeGroupState;->getValidIndex(I)I
 HSPLcom/android/server/audio/AudioService$VolumeGroupState;->readSettings()V
+PLcom/android/server/audio/AudioService$VolumeGroupState;->setVolumeIndexInt(III)V
 HSPLcom/android/server/audio/AudioService$VolumeStreamState;-><init>(Lcom/android/server/audio/AudioService;Ljava/lang/String;I)V
 HSPLcom/android/server/audio/AudioService$VolumeStreamState;-><init>(Lcom/android/server/audio/AudioService;Ljava/lang/String;ILcom/android/server/audio/AudioService$1;)V
 HSPLcom/android/server/audio/AudioService$VolumeStreamState;->access$1000(Lcom/android/server/audio/AudioService$VolumeStreamState;)Z
@@ -10041,6 +10570,7 @@
 PLcom/android/server/audio/AudioService$VolumeStreamState;->access$1900(Lcom/android/server/audio/AudioService$VolumeStreamState;)Landroid/util/SparseIntArray;
 PLcom/android/server/audio/AudioService$VolumeStreamState;->access$3500(Lcom/android/server/audio/AudioService$VolumeStreamState;)Z
 PLcom/android/server/audio/AudioService$VolumeStreamState;->access$3700(Lcom/android/server/audio/AudioService$VolumeStreamState;)Z
+PLcom/android/server/audio/AudioService$VolumeStreamState;->access$3900(Lcom/android/server/audio/AudioService$VolumeStreamState;)Z
 HSPLcom/android/server/audio/AudioService$VolumeStreamState;->access$800(Lcom/android/server/audio/AudioService$VolumeStreamState;)I
 PLcom/android/server/audio/AudioService$VolumeStreamState;->access$900(Lcom/android/server/audio/AudioService$VolumeStreamState;)I
 HPLcom/android/server/audio/AudioService$VolumeStreamState;->adjustIndex(IILjava/lang/String;)Z
@@ -10070,6 +10600,11 @@
 PLcom/android/server/audio/AudioService;->access$000(Lcom/android/server/audio/AudioService;)Lcom/android/server/audio/RecordingActivityMonitor;
 HSPLcom/android/server/audio/AudioService;->access$100(Lcom/android/server/audio/AudioService;)Lcom/android/server/audio/AudioService$AudioHandler;
 HSPLcom/android/server/audio/AudioService;->access$102(Lcom/android/server/audio/AudioService;Lcom/android/server/audio/AudioService$AudioHandler;)Lcom/android/server/audio/AudioService$AudioHandler;
+PLcom/android/server/audio/AudioService;->access$1500(Lcom/android/server/audio/AudioService;)Ljava/lang/Object;
+PLcom/android/server/audio/AudioService;->access$1600(Lcom/android/server/audio/AudioService;)Lcom/android/server/audio/AudioService$ForceControlStreamClient;
+PLcom/android/server/audio/AudioService;->access$1602(Lcom/android/server/audio/AudioService;Lcom/android/server/audio/AudioService$ForceControlStreamClient;)Lcom/android/server/audio/AudioService$ForceControlStreamClient;
+PLcom/android/server/audio/AudioService;->access$1702(Lcom/android/server/audio/AudioService;I)I
+PLcom/android/server/audio/AudioService;->access$1802(Lcom/android/server/audio/AudioService;Z)Z
 HSPLcom/android/server/audio/AudioService;->access$200(Landroid/os/Handler;IIIILjava/lang/Object;I)V
 HSPLcom/android/server/audio/AudioService;->access$2000(Lcom/android/server/audio/AudioService;)Lcom/android/server/audio/AudioDeviceBroker;
 PLcom/android/server/audio/AudioService;->access$2100(Lcom/android/server/audio/AudioService;ILandroid/os/IBinder;ILjava/lang/String;)I
@@ -10090,8 +10625,12 @@
 HSPLcom/android/server/audio/AudioService;->access$3100(Lcom/android/server/audio/AudioService;III)I
 HSPLcom/android/server/audio/AudioService;->access$3200(Lcom/android/server/audio/AudioService;)[Lcom/android/server/audio/AudioService$VolumeStreamState;
 PLcom/android/server/audio/AudioService;->access$3200(Lcom/android/server/audio/AudioService;I)I
+PLcom/android/server/audio/AudioService;->access$3200(Lcom/android/server/audio/AudioService;I)Z
+HPLcom/android/server/audio/AudioService;->access$3300(Lcom/android/server/audio/AudioService;)[Lcom/android/server/audio/AudioService$VolumeStreamState;
 HSPLcom/android/server/audio/AudioService;->access$3300(Lcom/android/server/audio/AudioService;III)I
 PLcom/android/server/audio/AudioService;->access$3400(Lcom/android/server/audio/AudioService;)Z
+HPLcom/android/server/audio/AudioService;->access$3400(Lcom/android/server/audio/AudioService;III)I
+PLcom/android/server/audio/AudioService;->access$3500(Lcom/android/server/audio/AudioService;I)Z
 PLcom/android/server/audio/AudioService;->access$3600(Lcom/android/server/audio/AudioService;)Z
 PLcom/android/server/audio/AudioService;->access$3600(Lcom/android/server/audio/AudioService;Z)V
 HSPLcom/android/server/audio/AudioService;->access$3700(Lcom/android/server/audio/AudioService;)Lcom/android/server/audio/SoundEffectsHelper;
@@ -10099,11 +10638,15 @@
 HSPLcom/android/server/audio/AudioService;->access$4000(Lcom/android/server/audio/AudioService;)Lcom/android/server/audio/SoundEffectsHelper;
 HSPLcom/android/server/audio/AudioService;->access$4100(Lcom/android/server/audio/AudioService;)Z
 PLcom/android/server/audio/AudioService;->access$4100(Lcom/android/server/audio/AudioService;Ljava/lang/String;)V
+PLcom/android/server/audio/AudioService;->access$4200(Lcom/android/server/audio/AudioService;)Lcom/android/server/audio/SoundEffectsHelper;
 HSPLcom/android/server/audio/AudioService;->access$4200(Lcom/android/server/audio/AudioService;ZLjava/lang/String;)V
+PLcom/android/server/audio/AudioService;->access$4300(Lcom/android/server/audio/AudioService;)Z
 PLcom/android/server/audio/AudioService;->access$4300(Lcom/android/server/audio/AudioService;I)V
 HSPLcom/android/server/audio/AudioService;->access$4500(Lcom/android/server/audio/AudioService;ZLjava/lang/String;)V
 PLcom/android/server/audio/AudioService;->access$4600(Lcom/android/server/audio/AudioService;I)V
 HSPLcom/android/server/audio/AudioService;->access$4700(Lcom/android/server/audio/AudioService;)V
+PLcom/android/server/audio/AudioService;->access$4700(Lcom/android/server/audio/AudioService;ZLjava/lang/String;)V
+PLcom/android/server/audio/AudioService;->access$4800(Lcom/android/server/audio/AudioService;I)V
 PLcom/android/server/audio/AudioService;->access$4800(Lcom/android/server/audio/AudioService;Lcom/android/server/audio/AudioService$DeviceVolumeUpdate;)V
 PLcom/android/server/audio/AudioService;->access$4900(Lcom/android/server/audio/AudioService;)V
 HSPLcom/android/server/audio/AudioService;->access$5000(Lcom/android/server/audio/AudioService;)V
@@ -10111,58 +10654,95 @@
 HSPLcom/android/server/audio/AudioService;->access$5200(Lcom/android/server/audio/AudioService;)I
 PLcom/android/server/audio/AudioService;->access$5200(Lcom/android/server/audio/AudioService;)V
 HSPLcom/android/server/audio/AudioService;->access$5202(Lcom/android/server/audio/AudioService;I)I
+PLcom/android/server/audio/AudioService;->access$5300(Lcom/android/server/audio/AudioService;Lcom/android/server/audio/AudioService$DeviceVolumeUpdate;)V
 HSPLcom/android/server/audio/AudioService;->access$5302(Lcom/android/server/audio/AudioService;Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/audio/AudioService;->access$5400(Lcom/android/server/audio/AudioService;)V
 HSPLcom/android/server/audio/AudioService;->access$5400(Lcom/android/server/audio/AudioService;)Z
 PLcom/android/server/audio/AudioService;->access$5500(Lcom/android/server/audio/AudioService;)I
 HSPLcom/android/server/audio/AudioService;->access$5500(Lcom/android/server/audio/AudioService;IZ)V
 HSPLcom/android/server/audio/AudioService;->access$5502(Lcom/android/server/audio/AudioService;I)I
 HSPLcom/android/server/audio/AudioService;->access$5600(Lcom/android/server/audio/AudioService;Landroid/content/ContentResolver;)V
 HSPLcom/android/server/audio/AudioService;->access$5602(Lcom/android/server/audio/AudioService;Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/audio/AudioService;->access$5700(Lcom/android/server/audio/AudioService;)I
 HSPLcom/android/server/audio/AudioService;->access$5700(Lcom/android/server/audio/AudioService;)Z
 HSPLcom/android/server/audio/AudioService;->access$5700(Lcom/android/server/audio/AudioService;Landroid/content/ContentResolver;)V
+PLcom/android/server/audio/AudioService;->access$5702(Lcom/android/server/audio/AudioService;I)I
 PLcom/android/server/audio/AudioService;->access$5800(Lcom/android/server/audio/AudioService;IZ)V
 HSPLcom/android/server/audio/AudioService;->access$5800(Lcom/android/server/audio/AudioService;Landroid/content/ContentResolver;)V
+PLcom/android/server/audio/AudioService;->access$5802(Lcom/android/server/audio/AudioService;Ljava/lang/String;)Ljava/lang/String;
 HSPLcom/android/server/audio/AudioService;->access$5900(Lcom/android/server/audio/AudioService;)Z
 PLcom/android/server/audio/AudioService;->access$5900(Lcom/android/server/audio/AudioService;Landroid/content/ContentResolver;)V
 HSPLcom/android/server/audio/AudioService;->access$5902(Lcom/android/server/audio/AudioService;Z)Z
 HSPLcom/android/server/audio/AudioService;->access$600(Lcom/android/server/audio/AudioService;)Landroid/content/Context;
+PLcom/android/server/audio/AudioService;->access$6000(Lcom/android/server/audio/AudioService;IZ)V
 PLcom/android/server/audio/AudioService;->access$6000(Lcom/android/server/audio/AudioService;Landroid/content/ContentResolver;)V
 HSPLcom/android/server/audio/AudioService;->access$6000(Lcom/android/server/audio/AudioService;Landroid/content/ContentResolver;Z)V
 HSPLcom/android/server/audio/AudioService;->access$6100(Lcom/android/server/audio/AudioService;Landroid/content/ContentResolver;)V
 PLcom/android/server/audio/AudioService;->access$6200(Lcom/android/server/audio/AudioService;)Z
+PLcom/android/server/audio/AudioService;->access$6200(Lcom/android/server/audio/AudioService;Landroid/content/ContentResolver;)V
 PLcom/android/server/audio/AudioService;->access$6202(Lcom/android/server/audio/AudioService;Z)Z
+PLcom/android/server/audio/AudioService;->access$6300(Lcom/android/server/audio/AudioService;Landroid/content/ContentResolver;)V
 PLcom/android/server/audio/AudioService;->access$6300(Lcom/android/server/audio/AudioService;Landroid/content/ContentResolver;Z)V
 PLcom/android/server/audio/AudioService;->access$6400(Lcom/android/server/audio/AudioService;)Z
 PLcom/android/server/audio/AudioService;->access$6400(Lcom/android/server/audio/AudioService;Landroid/content/ContentResolver;)V
+PLcom/android/server/audio/AudioService;->access$6402(Lcom/android/server/audio/AudioService;Z)Z
+PLcom/android/server/audio/AudioService;->access$6500(Lcom/android/server/audio/AudioService;Landroid/content/ContentResolver;Z)V
 HSPLcom/android/server/audio/AudioService;->access$6500(Lcom/android/server/audio/AudioService;Landroid/content/Context;)V
 HSPLcom/android/server/audio/AudioService;->access$6600(Lcom/android/server/audio/AudioService;)Z
+PLcom/android/server/audio/AudioService;->access$6600(Lcom/android/server/audio/AudioService;Z)V
 HSPLcom/android/server/audio/AudioService;->access$6602(Lcom/android/server/audio/AudioService;Z)Z
 HSPLcom/android/server/audio/AudioService;->access$6700(Lcom/android/server/audio/AudioService;)Lcom/android/server/audio/MediaFocusControl;
 PLcom/android/server/audio/AudioService;->access$6700(Lcom/android/server/audio/AudioService;)Z
 HSPLcom/android/server/audio/AudioService;->access$6800(Lcom/android/server/audio/AudioService;Landroid/content/Context;)V
 HSPLcom/android/server/audio/AudioService;->access$6800(Lcom/android/server/audio/AudioService;Z)V
 PLcom/android/server/audio/AudioService;->access$6900(Lcom/android/server/audio/AudioService;)Z
+PLcom/android/server/audio/AudioService;->access$6900(Lcom/android/server/audio/AudioService;Landroid/content/Context;)V
 PLcom/android/server/audio/AudioService;->access$6900(Lcom/android/server/audio/AudioService;Landroid/content/pm/UserInfo;)V
 PLcom/android/server/audio/AudioService;->access$6902(Lcom/android/server/audio/AudioService;Z)Z
 HSPLcom/android/server/audio/AudioService;->access$700(Lcom/android/server/audio/AudioService;Z)V
 PLcom/android/server/audio/AudioService;->access$7000(Lcom/android/server/audio/AudioService;)Lcom/android/server/audio/MediaFocusControl;
+PLcom/android/server/audio/AudioService;->access$7000(Lcom/android/server/audio/AudioService;)Z
+PLcom/android/server/audio/AudioService;->access$7000(Lcom/android/server/audio/AudioService;Landroid/content/Context;)V
 PLcom/android/server/audio/AudioService;->access$7000(Lcom/android/server/audio/AudioService;Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/audio/AudioService;->access$7002(Lcom/android/server/audio/AudioService;Z)Z
+PLcom/android/server/audio/AudioService;->access$7100(Lcom/android/server/audio/AudioService;)Lcom/android/server/audio/MediaFocusControl;
+PLcom/android/server/audio/AudioService;->access$7100(Lcom/android/server/audio/AudioService;)Z
 PLcom/android/server/audio/AudioService;->access$7100(Lcom/android/server/audio/AudioService;Z)V
+PLcom/android/server/audio/AudioService;->access$7102(Lcom/android/server/audio/AudioService;Z)Z
+PLcom/android/server/audio/AudioService;->access$7200(Lcom/android/server/audio/AudioService;)Lcom/android/server/audio/MediaFocusControl;
+PLcom/android/server/audio/AudioService;->access$7200(Lcom/android/server/audio/AudioService;Z)V
 PLcom/android/server/audio/AudioService;->access$7300(Lcom/android/server/audio/AudioService;Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/audio/AudioService;->access$7300(Lcom/android/server/audio/AudioService;Z)V
+PLcom/android/server/audio/AudioService;->access$7500(Lcom/android/server/audio/AudioService;Landroid/content/Context;Landroid/content/Intent;)V
 PLcom/android/server/audio/AudioService;->access$7800(Lcom/android/server/audio/AudioService;)Lcom/android/server/audio/AudioService$VolumeController;
 HSPLcom/android/server/audio/AudioService;->access$7900(Lcom/android/server/audio/AudioService;)Landroid/media/AudioManagerInternal$RingerModeDelegate;
 HSPLcom/android/server/audio/AudioService;->access$7902(Lcom/android/server/audio/AudioService;Landroid/media/AudioManagerInternal$RingerModeDelegate;)Landroid/media/AudioManagerInternal$RingerModeDelegate;
 HPLcom/android/server/audio/AudioService;->access$8000(Lcom/android/server/audio/AudioService;IIILjava/lang/String;Ljava/lang/String;I)V
+PLcom/android/server/audio/AudioService;->access$8100(Lcom/android/server/audio/AudioService;)Lcom/android/server/audio/AudioService$VolumeController;
 HSPLcom/android/server/audio/AudioService;->access$8200(Lcom/android/server/audio/AudioService;)Landroid/media/AudioManagerInternal$RingerModeDelegate;
 HSPLcom/android/server/audio/AudioService;->access$8200(Lcom/android/server/audio/AudioService;)Ljava/lang/Object;
 HSPLcom/android/server/audio/AudioService;->access$8202(Lcom/android/server/audio/AudioService;Landroid/media/AudioManagerInternal$RingerModeDelegate;)Landroid/media/AudioManagerInternal$RingerModeDelegate;
+PLcom/android/server/audio/AudioService;->access$8300(Lcom/android/server/audio/AudioService;)Landroid/media/AudioManagerInternal$RingerModeDelegate;
+PLcom/android/server/audio/AudioService;->access$8300(Lcom/android/server/audio/AudioService;)Lcom/android/server/audio/AudioService$VolumeController;
 HSPLcom/android/server/audio/AudioService;->access$8300(Lcom/android/server/audio/AudioService;)[I
+PLcom/android/server/audio/AudioService;->access$8300(Lcom/android/server/audio/AudioService;IIILjava/lang/String;Ljava/lang/String;I)V
+PLcom/android/server/audio/AudioService;->access$8302(Lcom/android/server/audio/AudioService;Landroid/media/AudioManagerInternal$RingerModeDelegate;)Landroid/media/AudioManagerInternal$RingerModeDelegate;
 HSPLcom/android/server/audio/AudioService;->access$8302(Lcom/android/server/audio/AudioService;[I)[I
+PLcom/android/server/audio/AudioService;->access$8400(Lcom/android/server/audio/AudioService;)Landroid/media/AudioManagerInternal$RingerModeDelegate;
+PLcom/android/server/audio/AudioService;->access$8402(Lcom/android/server/audio/AudioService;Landroid/media/AudioManagerInternal$RingerModeDelegate;)Landroid/media/AudioManagerInternal$RingerModeDelegate;
 PLcom/android/server/audio/AudioService;->access$8408(Lcom/android/server/audio/AudioService;)I
 PLcom/android/server/audio/AudioService;->access$8500(Lcom/android/server/audio/AudioService;)Ljava/lang/Object;
+PLcom/android/server/audio/AudioService;->access$8500(Lcom/android/server/audio/AudioService;IIILjava/lang/String;Ljava/lang/String;I)V
+PLcom/android/server/audio/AudioService;->access$8600(Lcom/android/server/audio/AudioService;)Ljava/lang/Object;
 PLcom/android/server/audio/AudioService;->access$8600(Lcom/android/server/audio/AudioService;)[I
 PLcom/android/server/audio/AudioService;->access$8602(Lcom/android/server/audio/AudioService;[I)[I
+PLcom/android/server/audio/AudioService;->access$8700(Lcom/android/server/audio/AudioService;)Ljava/lang/Object;
+PLcom/android/server/audio/AudioService;->access$8700(Lcom/android/server/audio/AudioService;)[I
+PLcom/android/server/audio/AudioService;->access$8702(Lcom/android/server/audio/AudioService;[I)[I
+PLcom/android/server/audio/AudioService;->access$8800(Lcom/android/server/audio/AudioService;)[I
+PLcom/android/server/audio/AudioService;->access$8802(Lcom/android/server/audio/AudioService;[I)[I
 PLcom/android/server/audio/AudioService;->access$8900(Lcom/android/server/audio/AudioService;)Ljava/util/HashMap;
+PLcom/android/server/audio/AudioService;->access$9000(Lcom/android/server/audio/AudioService;)Ljava/util/HashMap;
 PLcom/android/server/audio/AudioService;->addMixForPolicy(Landroid/media/audiopolicy/AudioPolicyConfig;Landroid/media/audiopolicy/IAudioPolicyCallback;)I
 HPLcom/android/server/audio/AudioService;->adjustStreamVolume(IIILjava/lang/String;)V
 HPLcom/android/server/audio/AudioService;->adjustStreamVolume(IIILjava/lang/String;Ljava/lang/String;I)V
@@ -10252,6 +10832,8 @@
 HPLcom/android/server/audio/AudioService;->isBluetoothA2dpOn()Z
 HSPLcom/android/server/audio/AudioService;->isBluetoothScoOn()Z
 HPLcom/android/server/audio/AudioService;->isCameraSoundForced()Z
+HPLcom/android/server/audio/AudioService;->isFixedVolumeDevice(I)Z
+HPLcom/android/server/audio/AudioService;->isFullVolumeDevice(I)Z
 HSPLcom/android/server/audio/AudioService;->isInCommunication()Z
 PLcom/android/server/audio/AudioService;->isMedia(I)Z
 HSPLcom/android/server/audio/AudioService;->isMicrophoneMuted()Z
@@ -10269,7 +10851,7 @@
 PLcom/android/server/audio/AudioService;->isValidAudioAttributesUsage(Landroid/media/AudioAttributes;)Z
 HSPLcom/android/server/audio/AudioService;->isValidRingerMode(I)Z
 HPLcom/android/server/audio/AudioService;->isVoiceCommunicationPlaybackCaptureMix(Landroid/media/audiopolicy/AudioMix;)Z
-PLcom/android/server/audio/AudioService;->killBackgroundUserProcessesWithRecordAudioPermission(Landroid/content/pm/UserInfo;)V
+HPLcom/android/server/audio/AudioService;->killBackgroundUserProcessesWithRecordAudioPermission(Landroid/content/pm/UserInfo;)V
 HSPLcom/android/server/audio/AudioService;->lambda$ensureValidAttributes$0(Landroid/media/AudioAttributes;)Z
 HPLcom/android/server/audio/AudioService;->makeAlsaAddressString(II)Ljava/lang/String;
 PLcom/android/server/audio/AudioService;->maybeSendSystemAudioStatusCommand(Z)V
@@ -10304,7 +10886,7 @@
 HSPLcom/android/server/audio/AudioService;->readDockAudioSettings(Landroid/content/ContentResolver;)V
 HSPLcom/android/server/audio/AudioService;->readPersistedSettings()V
 HSPLcom/android/server/audio/AudioService;->readUserRestrictions()V
-PLcom/android/server/audio/AudioService;->readVolumeGroupsSettings()V
+HPLcom/android/server/audio/AudioService;->readVolumeGroupsSettings()V
 HPLcom/android/server/audio/AudioService;->recorderEvent(II)V
 HPLcom/android/server/audio/AudioService;->registerAudioPolicy(Landroid/media/audiopolicy/AudioPolicyConfig;Landroid/media/audiopolicy/IAudioPolicyCallback;ZZZZLandroid/media/projection/IMediaProjection;)Ljava/lang/String;
 PLcom/android/server/audio/AudioService;->registerAudioServerStateDispatcher(Landroid/media/IAudioServerStateDispatcher;)V
@@ -10373,6 +10955,7 @@
 HPLcom/android/server/audio/AudioService;->updateAbsVolumeMultiModeDevices(II)V
 HSPLcom/android/server/audio/AudioService;->updateAssistantUId(Z)V
 HSPLcom/android/server/audio/AudioService;->updateAudioHalPids()V
+HPLcom/android/server/audio/AudioService;->updateCurrentImeUid(Z)V
 HSPLcom/android/server/audio/AudioService;->updateDefaultStreamOverrideDelay(Z)V
 HSPLcom/android/server/audio/AudioService;->updateDefaultVolumes()V
 HPLcom/android/server/audio/AudioService;->updateFlagsForTvPlatform(I)I
@@ -10410,20 +10993,27 @@
 PLcom/android/server/audio/BtHelper$BluetoothA2dpDeviceInfo;->getCodec()I
 PLcom/android/server/audio/BtHelper$BluetoothA2dpDeviceInfo;->getVolume()I
 PLcom/android/server/audio/BtHelper$ScoClient;-><init>(Lcom/android/server/audio/BtHelper;Landroid/os/IBinder;)V
+PLcom/android/server/audio/BtHelper$ScoClient;->access$000(Lcom/android/server/audio/BtHelper$ScoClient;II)Z
+PLcom/android/server/audio/BtHelper$ScoClient;->binderDied()V
 PLcom/android/server/audio/BtHelper$ScoClient;->clearCount(Z)V
 PLcom/android/server/audio/BtHelper$ScoClient;->decCount()V
 PLcom/android/server/audio/BtHelper$ScoClient;->getBinder()Landroid/os/IBinder;
 PLcom/android/server/audio/BtHelper$ScoClient;->getCount()I
 PLcom/android/server/audio/BtHelper$ScoClient;->getPid()I
 PLcom/android/server/audio/BtHelper$ScoClient;->incCount(I)V
+PLcom/android/server/audio/BtHelper$ScoClient;->registerDeathRecipient()V
+PLcom/android/server/audio/BtHelper$ScoClient;->remove(ZZ)V
 PLcom/android/server/audio/BtHelper$ScoClient;->requestScoState(II)Z
 PLcom/android/server/audio/BtHelper$ScoClient;->totalCount()I
+PLcom/android/server/audio/BtHelper$ScoClient;->unregisterDeathRecipient()V
 HSPLcom/android/server/audio/BtHelper;-><init>(Lcom/android/server/audio/AudioDeviceBroker;)V
 PLcom/android/server/audio/BtHelper;->a2dpDeviceEventToString(I)Ljava/lang/String;
 PLcom/android/server/audio/BtHelper;->access$000(Lcom/android/server/audio/BtHelper;)Lcom/android/server/audio/AudioDeviceBroker;
+PLcom/android/server/audio/BtHelper;->access$100(Lcom/android/server/audio/BtHelper;)Lcom/android/server/audio/AudioDeviceBroker;
 PLcom/android/server/audio/BtHelper;->access$100(Lcom/android/server/audio/BtHelper;)Ljava/util/ArrayList;
 PLcom/android/server/audio/BtHelper;->access$1000(Landroid/bluetooth/BluetoothHeadset;Landroid/bluetooth/BluetoothDevice;I)Z
 PLcom/android/server/audio/BtHelper;->access$200(Lcom/android/server/audio/BtHelper;)V
+PLcom/android/server/audio/BtHelper;->access$300(Lcom/android/server/audio/BtHelper;)Ljava/util/ArrayList;
 PLcom/android/server/audio/BtHelper;->access$300(Lcom/android/server/audio/BtHelper;I)V
 PLcom/android/server/audio/BtHelper;->access$400(Lcom/android/server/audio/BtHelper;)I
 PLcom/android/server/audio/BtHelper;->access$402(Lcom/android/server/audio/BtHelper;I)I
@@ -10457,6 +11047,7 @@
 HSPLcom/android/server/audio/BtHelper;->onSystemReady()V
 HPLcom/android/server/audio/BtHelper;->receiveBtEvent(Landroid/content/Intent;)V
 HSPLcom/android/server/audio/BtHelper;->resetBluetoothSco()V
+PLcom/android/server/audio/BtHelper;->scoClientDied(Ljava/lang/Object;)V
 HSPLcom/android/server/audio/BtHelper;->sendStickyBroadcastToAll(Landroid/content/Intent;)V
 HPLcom/android/server/audio/BtHelper;->setAvrcpAbsoluteVolumeIndex(I)V
 HPLcom/android/server/audio/BtHelper;->setAvrcpAbsoluteVolumeSupported(Z)V
@@ -10592,7 +11183,7 @@
 HPLcom/android/server/audio/RecordingActivityMonitor$RecordingEvent;->recordEventToString(I)Ljava/lang/String;
 HPLcom/android/server/audio/RecordingActivityMonitor$RecordingState;-><init>(ILcom/android/server/audio/RecordingActivityMonitor$RecorderDeathHandler;)V
 PLcom/android/server/audio/RecordingActivityMonitor$RecordingState;->dump(Ljava/io/PrintWriter;)V
-PLcom/android/server/audio/RecordingActivityMonitor$RecordingState;->getConfig()Landroid/media/AudioRecordingConfiguration;
+HPLcom/android/server/audio/RecordingActivityMonitor$RecordingState;->getConfig()Landroid/media/AudioRecordingConfiguration;
 HPLcom/android/server/audio/RecordingActivityMonitor$RecordingState;->getRiid()I
 PLcom/android/server/audio/RecordingActivityMonitor$RecordingState;->hasDeathHandler()Z
 HPLcom/android/server/audio/RecordingActivityMonitor$RecordingState;->isActiveConfiguration()Z
@@ -10608,6 +11199,7 @@
 HPLcom/android/server/audio/RecordingActivityMonitor;->findStateByRiid(I)I
 HPLcom/android/server/audio/RecordingActivityMonitor;->getActiveRecordingConfigurations(Z)Ljava/util/List;
 HSPLcom/android/server/audio/RecordingActivityMonitor;->initMonitor()V
+PLcom/android/server/audio/RecordingActivityMonitor;->isLegacyRemoteSubmixActive()Z
 PLcom/android/server/audio/RecordingActivityMonitor;->onAudioServerDied()V
 HPLcom/android/server/audio/RecordingActivityMonitor;->onRecordingConfigurationChanged(IIIIIIZ[I[Landroid/media/audiofx/AudioEffect$Descriptor;[Landroid/media/audiofx/AudioEffect$Descriptor;ILjava/lang/String;)V
 HPLcom/android/server/audio/RecordingActivityMonitor;->recorderEvent(II)V
@@ -10683,11 +11275,13 @@
 PLcom/android/server/autofill/-$$Lambda$Helper$laLKWmsGqkFIaRXW5rR6_s66Vsw;->matches(Landroid/app/assist/AssistStructure$ViewNode;)Z
 PLcom/android/server/autofill/-$$Lambda$Helper$nK3g_oXXf8NGajcUf0W5JsQzf3w;-><init>(Landroid/view/autofill/AutofillId;)V
 PLcom/android/server/autofill/-$$Lambda$Helper$nK3g_oXXf8NGajcUf0W5JsQzf3w;->matches(Landroid/app/assist/AssistStructure$ViewNode;)Z
+HPLcom/android/server/autofill/-$$Lambda$InlineSuggestionSession$InlineSuggestionsRequestCallbackImpl$O_1Pd4cN7Bj5K69DKezKZFr_644;-><init>(Lcom/android/server/autofill/InlineSuggestionSession$InlineSuggestionsRequestCallbackImpl;)V
+HPLcom/android/server/autofill/-$$Lambda$InlineSuggestionSession$InlineSuggestionsRequestCallbackImpl$O_1Pd4cN7Bj5K69DKezKZFr_644;->run()V
 PLcom/android/server/autofill/-$$Lambda$Q-iZrXrDBZAnj-gnbNOhH00i8uU;-><clinit>()V
 PLcom/android/server/autofill/-$$Lambda$Q-iZrXrDBZAnj-gnbNOhH00i8uU;-><init>()V
 HPLcom/android/server/autofill/-$$Lambda$Q-iZrXrDBZAnj-gnbNOhH00i8uU;->apply(Ljava/lang/Object;)Ljava/lang/Object;
 PLcom/android/server/autofill/-$$Lambda$RemoteAugmentedAutofillService$-Icm1WEZLv2n19GTOHkDYaCS_Oc;-><init>(Lcom/android/server/autofill/RemoteAugmentedAutofillService;Landroid/view/autofill/IAutoFillManagerClient;IILandroid/content/ComponentName;Landroid/view/autofill/AutofillId;Landroid/view/autofill/AutofillValue;JLandroid/view/inputmethod/InlineSuggestionsRequest;Ljava/util/function/Function;Ljava/lang/Runnable;Lcom/android/server/autofill/RemoteInlineSuggestionRenderService;Ljava/util/concurrent/atomic/AtomicReference;)V
-PLcom/android/server/autofill/-$$Lambda$RemoteAugmentedAutofillService$-Icm1WEZLv2n19GTOHkDYaCS_Oc;->run(Ljava/lang/Object;)Ljava/lang/Object;
+HPLcom/android/server/autofill/-$$Lambda$RemoteAugmentedAutofillService$-Icm1WEZLv2n19GTOHkDYaCS_Oc;->run(Ljava/lang/Object;)Ljava/lang/Object;
 PLcom/android/server/autofill/-$$Lambda$RemoteAugmentedAutofillService$EIoMQmktiMOrY4CSGrV0wR8Frho;-><init>(Lcom/android/server/autofill/RemoteAugmentedAutofillService;Landroid/view/autofill/IAutoFillManagerClient;IILandroid/content/ComponentName;Landroid/view/autofill/AutofillId;Landroid/view/autofill/AutofillValue;JLandroid/view/inputmethod/InlineSuggestionsRequest;Lcom/android/internal/view/IInlineSuggestionsResponseCallback;Ljava/lang/Runnable;Lcom/android/server/autofill/RemoteInlineSuggestionRenderService;Ljava/util/concurrent/atomic/AtomicReference;)V
 HPLcom/android/server/autofill/-$$Lambda$RemoteAugmentedAutofillService$EIoMQmktiMOrY4CSGrV0wR8Frho;->run(Ljava/lang/Object;)Ljava/lang/Object;
 PLcom/android/server/autofill/-$$Lambda$RemoteAugmentedAutofillService$W6vVk8kBkoWieb1Jw-BucQNBDsM;-><clinit>()V
@@ -10720,13 +11314,20 @@
 PLcom/android/server/autofill/-$$Lambda$RemoteFillService$adrL6UDQX3d0e-QQL11h9TWJcM4;->run()V
 PLcom/android/server/autofill/-$$Lambda$RemoteFillService$lQ9Txb0D49A09bfomYmOPhXTXRE;-><init>(Lcom/android/server/autofill/RemoteFillService;)V
 PLcom/android/server/autofill/-$$Lambda$RemoteFillService$lQ9Txb0D49A09bfomYmOPhXTXRE;->accept(Ljava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/autofill/-$$Lambda$RemoteInlineSuggestionRenderService$a3hMUCdIdu8-3SB6ZLhLjH9Na2A;-><init>(Landroid/service/autofill/IInlineSuggestionUiCallback;Landroid/service/autofill/InlinePresentation;IILandroid/os/IBinder;I)V
+PLcom/android/server/autofill/-$$Lambda$RemoteInlineSuggestionRenderService$a3hMUCdIdu8-3SB6ZLhLjH9Na2A;->run(Landroid/os/IInterface;)V
 HPLcom/android/server/autofill/-$$Lambda$Session$0GS6sttVUDBqEERyy9UZSJ7uee4;-><init>(Lcom/android/server/autofill/Session;)V
+HPLcom/android/server/autofill/-$$Lambda$Session$AssistDataReceiverImpl$mnf5BjDqQm9Cqgh_MOTN84wpLpU;-><init>(Lcom/android/server/autofill/Session$AssistDataReceiverImpl;)V
+PLcom/android/server/autofill/-$$Lambda$Session$AssistDataReceiverImpl$mnf5BjDqQm9Cqgh_MOTN84wpLpU;->accept(Ljava/lang/Object;)V
 PLcom/android/server/autofill/-$$Lambda$Session$Fs9zdJwELk-9rAM3RiY6AyBKswI;-><clinit>()V
 PLcom/android/server/autofill/-$$Lambda$Session$Fs9zdJwELk-9rAM3RiY6AyBKswI;-><init>()V
 PLcom/android/server/autofill/-$$Lambda$Session$Fs9zdJwELk-9rAM3RiY6AyBKswI;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
 PLcom/android/server/autofill/-$$Lambda$Session$LM4xf4dbxH_NTutQzBkaQNxKbV0;-><clinit>()V
 PLcom/android/server/autofill/-$$Lambda$Session$LM4xf4dbxH_NTutQzBkaQNxKbV0;-><init>()V
 PLcom/android/server/autofill/-$$Lambda$Session$LM4xf4dbxH_NTutQzBkaQNxKbV0;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/autofill/-$$Lambda$Session$LYgiVF7QUn4954p-wNYTeWDnGkw;-><clinit>()V
+PLcom/android/server/autofill/-$$Lambda$Session$LYgiVF7QUn4954p-wNYTeWDnGkw;-><init>()V
+PLcom/android/server/autofill/-$$Lambda$Session$LYgiVF7QUn4954p-wNYTeWDnGkw;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
 HPLcom/android/server/autofill/-$$Lambda$Session$Llx808TSLfk504RH3XZNeG5LjG0;-><init>(Lcom/android/server/autofill/RemoteAugmentedAutofillService;)V
 HPLcom/android/server/autofill/-$$Lambda$Session$Llx808TSLfk504RH3XZNeG5LjG0;->run()V
 PLcom/android/server/autofill/-$$Lambda$Session$NtvZwhlT1c4eLjg2qI6EER2oCtY;-><clinit>()V
@@ -10734,12 +11335,18 @@
 PLcom/android/server/autofill/-$$Lambda$Session$NtvZwhlT1c4eLjg2qI6EER2oCtY;->accept(Ljava/lang/Object;)V
 HPLcom/android/server/autofill/-$$Lambda$Session$WB4wgUTKZbTqa0TBuDv7N86bIjU;-><init>(Lcom/android/server/autofill/RemoteAugmentedAutofillService;)V
 PLcom/android/server/autofill/-$$Lambda$Session$WB4wgUTKZbTqa0TBuDv7N86bIjU;->run()V
+PLcom/android/server/autofill/-$$Lambda$Session$aJ4wM-TQ1ZRc9Zza8GGBSG9fM6s;-><init>(Lcom/android/server/autofill/Session;Lcom/android/server/autofill/RemoteAugmentedAutofillService;Landroid/view/autofill/AutofillId;Landroid/view/autofill/AutofillValue;)V
+PLcom/android/server/autofill/-$$Lambda$Session$aJ4wM-TQ1ZRc9Zza8GGBSG9fM6s;->accept(Ljava/lang/Object;)V
 PLcom/android/server/autofill/-$$Lambda$Session$cYu1t6lYVopApYW-vct82-7slZk;-><clinit>()V
 PLcom/android/server/autofill/-$$Lambda$Session$cYu1t6lYVopApYW-vct82-7slZk;-><init>()V
 PLcom/android/server/autofill/-$$Lambda$Session$cYu1t6lYVopApYW-vct82-7slZk;->accept(Ljava/lang/Object;)V
 HPLcom/android/server/autofill/-$$Lambda$Session$c_2SPX0muCe0vkZycSqBzBG3j9I;-><init>(Lcom/android/server/autofill/Session;)V
+PLcom/android/server/autofill/-$$Lambda$Session$c_2SPX0muCe0vkZycSqBzBG3j9I;->apply(Ljava/lang/Object;)Ljava/lang/Object;
+PLcom/android/server/autofill/-$$Lambda$Session$cn_hPmALqG1GX5l63SxDoUl37k0;-><init>(Lcom/android/server/autofill/RemoteAugmentedAutofillService;)V
+PLcom/android/server/autofill/-$$Lambda$Session$cn_hPmALqG1GX5l63SxDoUl37k0;->run()V
 HPLcom/android/server/autofill/-$$Lambda$Session$eVloK5PeyeuPZn1G52SC-fXIsjk;-><init>(Lcom/android/server/autofill/RemoteAugmentedAutofillService;)V
 PLcom/android/server/autofill/-$$Lambda$Session$eVloK5PeyeuPZn1G52SC-fXIsjk;->run()V
+PLcom/android/server/autofill/-$$Lambda$Session$rQ-Jf_4HLjEma8EFwiujLBHcgA0;-><init>(Lcom/android/server/autofill/Session;)V
 HPLcom/android/server/autofill/-$$Lambda$Session$rwjX85PTamn0L4a8CS_Nzf7He0g;-><init>(Lcom/android/server/autofill/Session;)V
 PLcom/android/server/autofill/-$$Lambda$Session$v6ZVyksJuHdWgJ1F8aoa_1LJWPo;-><clinit>()V
 PLcom/android/server/autofill/-$$Lambda$Session$v6ZVyksJuHdWgJ1F8aoa_1LJWPo;-><init>()V
@@ -10779,6 +11386,7 @@
 HPLcom/android/server/autofill/AutofillManagerService$AutoFillManagerServiceStub;->getFillEventHistory(Lcom/android/internal/os/IResultReceiver;)V
 HPLcom/android/server/autofill/AutofillManagerService$AutoFillManagerServiceStub;->isServiceEnabled(ILjava/lang/String;Lcom/android/internal/os/IResultReceiver;)V
 PLcom/android/server/autofill/AutofillManagerService$AutoFillManagerServiceStub;->isServiceSupported(ILcom/android/internal/os/IResultReceiver;)V
+PLcom/android/server/autofill/AutofillManagerService$AutoFillManagerServiceStub;->onShellCommand(Ljava/io/FileDescriptor;Ljava/io/FileDescriptor;Ljava/io/FileDescriptor;[Ljava/lang/String;Landroid/os/ShellCallback;Landroid/os/ResultReceiver;)V
 PLcom/android/server/autofill/AutofillManagerService$AutoFillManagerServiceStub;->removeClient(Landroid/view/autofill/IAutoFillManagerClient;I)V
 HPLcom/android/server/autofill/AutofillManagerService$AutoFillManagerServiceStub;->restoreSession(ILandroid/os/IBinder;Landroid/os/IBinder;Lcom/android/internal/os/IResultReceiver;)V
 PLcom/android/server/autofill/AutofillManagerService$AutoFillManagerServiceStub;->setAugmentedAutofillWhitelist(Ljava/util/List;Ljava/util/List;Lcom/android/internal/os/IResultReceiver;)V
@@ -10795,6 +11403,20 @@
 HSPLcom/android/server/autofill/AutofillManagerService$AutofillCompatState;->isCompatibilityModeRequested(Ljava/lang/String;JI)Z
 PLcom/android/server/autofill/AutofillManagerService$AutofillCompatState;->removeCompatibilityModeRequests(I)V
 HSPLcom/android/server/autofill/AutofillManagerService$AutofillCompatState;->reset(I)V
+PLcom/android/server/autofill/AutofillManagerService$AutofillDisabledInfo;-><init>()V
+PLcom/android/server/autofill/AutofillManagerService$AutofillDisabledInfo;-><init>(Lcom/android/server/autofill/AutofillManagerService$1;)V
+HPLcom/android/server/autofill/AutofillManagerService$AutofillDisabledInfo;->getAppDisabledActivitiesLocked(Ljava/lang/String;)Landroid/util/ArrayMap;
+HPLcom/android/server/autofill/AutofillManagerService$AutofillDisabledInfo;->getAppDisabledExpirationLocked(Ljava/lang/String;)J
+PLcom/android/server/autofill/AutofillManagerService$AutofillDisabledInfo;->isAutofillDisabledLocked(Landroid/content/ComponentName;)Z
+PLcom/android/server/autofill/AutofillManagerService$AutofillDisabledInfo;->putDisableAppsLocked(Ljava/lang/String;J)V
+PLcom/android/server/autofill/AutofillManagerService$DisabledInfoCache;-><init>()V
+PLcom/android/server/autofill/AutofillManagerService$DisabledInfoCache;->addDisabledAppLocked(ILjava/lang/String;J)V
+PLcom/android/server/autofill/AutofillManagerService$DisabledInfoCache;->dump(ILjava/lang/String;Ljava/io/PrintWriter;)V
+HPLcom/android/server/autofill/AutofillManagerService$DisabledInfoCache;->getAppDisabledActivities(ILjava/lang/String;)Landroid/util/ArrayMap;
+HPLcom/android/server/autofill/AutofillManagerService$DisabledInfoCache;->getAppDisabledExpiration(ILjava/lang/String;)J
+PLcom/android/server/autofill/AutofillManagerService$DisabledInfoCache;->getOrCreateAutofillDisabledInfoByUserIdLocked(I)Lcom/android/server/autofill/AutofillManagerService$AutofillDisabledInfo;
+PLcom/android/server/autofill/AutofillManagerService$DisabledInfoCache;->isAutofillDisabledLocked(ILandroid/content/ComponentName;)Z
+PLcom/android/server/autofill/AutofillManagerService$DisabledInfoCache;->remove(I)V
 HSPLcom/android/server/autofill/AutofillManagerService$LocalService;-><init>(Lcom/android/server/autofill/AutofillManagerService;)V
 HSPLcom/android/server/autofill/AutofillManagerService$LocalService;-><init>(Lcom/android/server/autofill/AutofillManagerService;Lcom/android/server/autofill/AutofillManagerService$1;)V
 HSPLcom/android/server/autofill/AutofillManagerService$LocalService;->getAutofillOptions(Ljava/lang/String;JI)Landroid/content/AutofillOptions;
@@ -10808,6 +11430,7 @@
 HSPLcom/android/server/autofill/AutofillManagerService;-><clinit>()V
 HSPLcom/android/server/autofill/AutofillManagerService;-><init>(Landroid/content/Context;)V
 PLcom/android/server/autofill/AutofillManagerService;->access$100(Lcom/android/server/autofill/AutofillManagerService;)Ljava/lang/Object;
+PLcom/android/server/autofill/AutofillManagerService;->access$1000(Lcom/android/server/autofill/AutofillManagerService;)Lcom/android/server/autofill/AutofillManagerService$DisabledInfoCache;
 HSPLcom/android/server/autofill/AutofillManagerService;->access$1000(Lcom/android/server/autofill/AutofillManagerService;)Ljava/lang/Object;
 HSPLcom/android/server/autofill/AutofillManagerService;->access$1100(Lcom/android/server/autofill/AutofillManagerService;I)Lcom/android/server/infra/AbstractPerUserSystemService;
 PLcom/android/server/autofill/AutofillManagerService;->access$1400(Lcom/android/server/autofill/AutofillManagerService;)Ljava/lang/Object;
@@ -10865,6 +11488,7 @@
 PLcom/android/server/autofill/AutofillManagerService;->access$800(Lcom/android/server/autofill/AutofillManagerService;)Ljava/lang/Object;
 HPLcom/android/server/autofill/AutofillManagerService;->access$900(Lcom/android/server/autofill/AutofillManagerService;I)Lcom/android/server/infra/AbstractPerUserSystemService;
 HSPLcom/android/server/autofill/AutofillManagerService;->addCompatibilityModeRequestsLocked(Lcom/android/server/autofill/AutofillManagerServiceImpl;I)V
+PLcom/android/server/autofill/AutofillManagerService;->enforceCallingPermissionForManagement()V
 PLcom/android/server/autofill/AutofillManagerService;->getPartitionMaxCount()I
 HSPLcom/android/server/autofill/AutofillManagerService;->getServiceSettingsProperty()Ljava/lang/String;
 PLcom/android/server/autofill/AutofillManagerService;->getSupportedSmartSuggestionModesLocked()I
@@ -10895,6 +11519,7 @@
 PLcom/android/server/autofill/AutofillManagerService;->send(Lcom/android/internal/os/IResultReceiver;Landroid/os/Parcelable;)V
 HPLcom/android/server/autofill/AutofillManagerService;->send(Lcom/android/internal/os/IResultReceiver;Z)V
 HSPLcom/android/server/autofill/AutofillManagerService;->setDeviceConfigProperties()V
+PLcom/android/server/autofill/AutofillManagerService;->setLogLevel(I)V
 HSPLcom/android/server/autofill/AutofillManagerService;->setLogLevelFromSettings()V
 HSPLcom/android/server/autofill/AutofillManagerService;->setLoggingLevelsLocked(ZZ)V
 HSPLcom/android/server/autofill/AutofillManagerService;->setMaxPartitionsFromSettings()V
@@ -10914,6 +11539,7 @@
 HPLcom/android/server/autofill/AutofillManagerServiceImpl$PruneTask;->doInBackground([Ljava/lang/Void;)Ljava/lang/Void;
 HSPLcom/android/server/autofill/AutofillManagerServiceImpl;-><clinit>()V
 HSPLcom/android/server/autofill/AutofillManagerServiceImpl;-><init>(Lcom/android/server/autofill/AutofillManagerService;Ljava/lang/Object;Landroid/util/LocalLog;Landroid/util/LocalLog;ILcom/android/server/autofill/ui/AutoFillUI;Lcom/android/server/autofill/AutofillManagerService$AutofillCompatState;Z)V
+PLcom/android/server/autofill/AutofillManagerServiceImpl;-><init>(Lcom/android/server/autofill/AutofillManagerService;Ljava/lang/Object;Landroid/util/LocalLog;Landroid/util/LocalLog;ILcom/android/server/autofill/ui/AutoFillUI;Lcom/android/server/autofill/AutofillManagerService$AutofillCompatState;ZLcom/android/server/autofill/AutofillManagerService$DisabledInfoCache;)V
 PLcom/android/server/autofill/AutofillManagerServiceImpl;->access$200(Lcom/android/server/autofill/AutofillManagerServiceImpl;)Ljava/lang/Object;
 PLcom/android/server/autofill/AutofillManagerServiceImpl;->access$300(Lcom/android/server/autofill/AutofillManagerServiceImpl;)Landroid/util/SparseArray;
 PLcom/android/server/autofill/AutofillManagerServiceImpl;->access$302(Lcom/android/server/autofill/AutofillManagerServiceImpl;Lcom/android/server/autofill/RemoteInlineSuggestionRenderService;)Lcom/android/server/autofill/RemoteInlineSuggestionRenderService;
@@ -10951,6 +11577,7 @@
 HPLcom/android/server/autofill/AutofillManagerServiceImpl;->isAutofillDisabledLocked(Landroid/content/ComponentName;)Z
 PLcom/android/server/autofill/AutofillManagerServiceImpl;->isCalledByAugmentedAutofillServiceLocked(Ljava/lang/String;I)Z
 PLcom/android/server/autofill/AutofillManagerServiceImpl;->isCalledByServiceLocked(Ljava/lang/String;I)Z
+PLcom/android/server/autofill/AutofillManagerServiceImpl;->isClientSessionDestroyedLocked(Landroid/view/autofill/IAutoFillManagerClient;)Z
 PLcom/android/server/autofill/AutofillManagerServiceImpl;->isFieldClassificationEnabledLocked()Z
 PLcom/android/server/autofill/AutofillManagerServiceImpl;->isInlineSuggestionsEnabled()Z
 PLcom/android/server/autofill/AutofillManagerServiceImpl;->isValidEventLocked(Ljava/lang/String;I)Z
@@ -10987,6 +11614,10 @@
 HSPLcom/android/server/autofill/AutofillManagerServiceImpl;->updateRemoteInlineSuggestionRenderServiceLocked()V
 HPLcom/android/server/autofill/AutofillManagerServiceImpl;->updateSessionLocked(IILandroid/view/autofill/AutofillId;Landroid/graphics/Rect;Landroid/view/autofill/AutofillValue;II)Z
 PLcom/android/server/autofill/AutofillManagerServiceImpl;->whitelistForAugmentedAutofillPackages(Ljava/util/List;Ljava/util/List;)V
+PLcom/android/server/autofill/AutofillManagerServiceShellCommand;-><init>(Lcom/android/server/autofill/AutofillManagerService;)V
+PLcom/android/server/autofill/AutofillManagerServiceShellCommand;->onCommand(Ljava/lang/String;)I
+PLcom/android/server/autofill/AutofillManagerServiceShellCommand;->requestSet(Ljava/io/PrintWriter;)I
+PLcom/android/server/autofill/AutofillManagerServiceShellCommand;->setLogLevel(Ljava/io/PrintWriter;)I
 PLcom/android/server/autofill/FieldClassificationStrategy$1;-><init>(Lcom/android/server/autofill/FieldClassificationStrategy;)V
 PLcom/android/server/autofill/FieldClassificationStrategy$1;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
 PLcom/android/server/autofill/FieldClassificationStrategy$1;->onServiceDisconnected(Landroid/content/ComponentName;)V
@@ -11023,31 +11654,57 @@
 PLcom/android/server/autofill/Helper;->printlnRedactedText(Ljava/io/PrintWriter;Ljava/lang/CharSequence;)V
 HPLcom/android/server/autofill/Helper;->sanitizeUrlBar(Landroid/app/assist/AssistStructure;[Ljava/lang/String;)Landroid/app/assist/AssistStructure$ViewNode;
 PLcom/android/server/autofill/Helper;->toArray(Landroid/util/ArraySet;)[Landroid/view/autofill/AutofillId;
-PLcom/android/server/autofill/InlineSuggestionSession$1;-><init>(Lcom/android/server/autofill/InlineSuggestionSession;)V
-PLcom/android/server/autofill/InlineSuggestionSession$1;->onInputMethodFinishInputView(Landroid/view/autofill/AutofillId;)V
-PLcom/android/server/autofill/InlineSuggestionSession$1;->onInputMethodStartInputView(Landroid/view/autofill/AutofillId;)V
+HPLcom/android/server/autofill/InlineSuggestionSession$1;-><init>(Lcom/android/server/autofill/InlineSuggestionSession;)V
+HPLcom/android/server/autofill/InlineSuggestionSession$1;->onInputMethodFinishInput()V
+PLcom/android/server/autofill/InlineSuggestionSession$1;->onInputMethodFinishInputView()V
+HPLcom/android/server/autofill/InlineSuggestionSession$1;->onInputMethodFinishInputView(Landroid/view/autofill/AutofillId;)V
+HPLcom/android/server/autofill/InlineSuggestionSession$1;->onInputMethodStartInput(Landroid/view/autofill/AutofillId;)V
+HPLcom/android/server/autofill/InlineSuggestionSession$1;->onInputMethodStartInputView()V
+HPLcom/android/server/autofill/InlineSuggestionSession$1;->onInputMethodStartInputView(Landroid/view/autofill/AutofillId;)V
+PLcom/android/server/autofill/InlineSuggestionSession$AutofillResponse;-><init>(Landroid/view/autofill/AutofillId;Landroid/view/inputmethod/InlineSuggestionsResponse;)V
 HPLcom/android/server/autofill/InlineSuggestionSession$ImeResponse;-><init>(Landroid/view/inputmethod/InlineSuggestionsRequest;Lcom/android/internal/view/IInlineSuggestionsResponseCallback;)V
 HPLcom/android/server/autofill/InlineSuggestionSession$ImeResponse;->getCallback()Lcom/android/internal/view/IInlineSuggestionsResponseCallback;
 HPLcom/android/server/autofill/InlineSuggestionSession$ImeResponse;->getRequest()Landroid/view/inputmethod/InlineSuggestionsRequest;
+PLcom/android/server/autofill/InlineSuggestionSession$InlineSuggestionsRequestCallbackImpl;-><init>(Landroid/view/autofill/AutofillId;Ljava/util/concurrent/CompletableFuture;Lcom/android/server/autofill/InlineSuggestionSession$ImeStatusListener;Ljava/util/function/Consumer;Landroid/os/Handler;Ljava/lang/Object;)V
+PLcom/android/server/autofill/InlineSuggestionSession$InlineSuggestionsRequestCallbackImpl;-><init>(Landroid/view/autofill/AutofillId;Ljava/util/concurrent/CompletableFuture;Lcom/android/server/autofill/InlineSuggestionSession$ImeStatusListener;Ljava/util/function/Consumer;Landroid/os/Handler;Ljava/lang/Object;Lcom/android/server/autofill/InlineSuggestionSession$1;)V
 PLcom/android/server/autofill/InlineSuggestionSession$InlineSuggestionsRequestCallbackImpl;-><init>(Ljava/util/concurrent/CompletableFuture;)V
 PLcom/android/server/autofill/InlineSuggestionSession$InlineSuggestionsRequestCallbackImpl;-><init>(Ljava/util/concurrent/CompletableFuture;Lcom/android/server/autofill/InlineSuggestionSession$1;)V
 PLcom/android/server/autofill/InlineSuggestionSession$InlineSuggestionsRequestCallbackImpl;-><init>(Ljava/util/concurrent/CompletableFuture;Lcom/android/server/autofill/InlineSuggestionSession$ImeStatusListener;)V
 PLcom/android/server/autofill/InlineSuggestionSession$InlineSuggestionsRequestCallbackImpl;-><init>(Ljava/util/concurrent/CompletableFuture;Lcom/android/server/autofill/InlineSuggestionSession$ImeStatusListener;Lcom/android/server/autofill/InlineSuggestionSession$1;)V
+PLcom/android/server/autofill/InlineSuggestionSession$InlineSuggestionsRequestCallbackImpl;-><init>(Ljava/util/concurrent/CompletableFuture;Lcom/android/server/autofill/InlineSuggestionSession$ImeStatusListener;Ljava/util/function/Consumer;Landroid/os/Handler;Ljava/lang/Object;)V
+PLcom/android/server/autofill/InlineSuggestionSession$InlineSuggestionsRequestCallbackImpl;-><init>(Ljava/util/concurrent/CompletableFuture;Lcom/android/server/autofill/InlineSuggestionSession$ImeStatusListener;Ljava/util/function/Consumer;Landroid/os/Handler;Ljava/lang/Object;Lcom/android/server/autofill/InlineSuggestionSession$1;)V
+HPLcom/android/server/autofill/InlineSuggestionSession$InlineSuggestionsRequestCallbackImpl;->completeIfNot(Lcom/android/server/autofill/InlineSuggestionSession$ImeResponse;)V
+PLcom/android/server/autofill/InlineSuggestionSession$InlineSuggestionsRequestCallbackImpl;->completeIfNotLocked(Lcom/android/server/autofill/InlineSuggestionSession$ImeResponse;)V
+HPLcom/android/server/autofill/InlineSuggestionSession$InlineSuggestionsRequestCallbackImpl;->lambda$new$0$InlineSuggestionSession$InlineSuggestionsRequestCallbackImpl()V
 HPLcom/android/server/autofill/InlineSuggestionSession$InlineSuggestionsRequestCallbackImpl;->onInlineSuggestionsRequest(Landroid/view/inputmethod/InlineSuggestionsRequest;Lcom/android/internal/view/IInlineSuggestionsResponseCallback;)V
 PLcom/android/server/autofill/InlineSuggestionSession$InlineSuggestionsRequestCallbackImpl;->onInlineSuggestionsRequest(Landroid/view/inputmethod/InlineSuggestionsRequest;Lcom/android/internal/view/IInlineSuggestionsResponseCallback;Landroid/view/autofill/AutofillId;Z)V
 HPLcom/android/server/autofill/InlineSuggestionSession$InlineSuggestionsRequestCallbackImpl;->onInlineSuggestionsUnsupported()V
+HPLcom/android/server/autofill/InlineSuggestionSession$InlineSuggestionsRequestCallbackImpl;->onInputMethodFinishInput()V
+PLcom/android/server/autofill/InlineSuggestionSession$InlineSuggestionsRequestCallbackImpl;->onInputMethodFinishInputView()V
 HPLcom/android/server/autofill/InlineSuggestionSession$InlineSuggestionsRequestCallbackImpl;->onInputMethodFinishInputView(Landroid/view/autofill/AutofillId;)V
+HPLcom/android/server/autofill/InlineSuggestionSession$InlineSuggestionsRequestCallbackImpl;->onInputMethodShowInputRequested(Z)V
+HPLcom/android/server/autofill/InlineSuggestionSession$InlineSuggestionsRequestCallbackImpl;->onInputMethodStartInput(Landroid/view/autofill/AutofillId;)V
+PLcom/android/server/autofill/InlineSuggestionSession$InlineSuggestionsRequestCallbackImpl;->onInputMethodStartInputView()V
 HPLcom/android/server/autofill/InlineSuggestionSession$InlineSuggestionsRequestCallbackImpl;->onInputMethodStartInputView(Landroid/view/autofill/AutofillId;)V
 HPLcom/android/server/autofill/InlineSuggestionSession;-><init>(Lcom/android/server/inputmethod/InputMethodManagerInternal;ILandroid/content/ComponentName;)V
+PLcom/android/server/autofill/InlineSuggestionSession;-><init>(Lcom/android/server/inputmethod/InputMethodManagerInternal;ILandroid/content/ComponentName;Landroid/os/Handler;)V
+HPLcom/android/server/autofill/InlineSuggestionSession;-><init>(Lcom/android/server/inputmethod/InputMethodManagerInternal;ILandroid/content/ComponentName;Landroid/os/Handler;Ljava/lang/Object;)V
 PLcom/android/server/autofill/InlineSuggestionSession;->access$000(Lcom/android/server/autofill/InlineSuggestionSession;)Ljava/lang/Object;
+PLcom/android/server/autofill/InlineSuggestionSession;->access$100(Lcom/android/server/autofill/InlineSuggestionSession;)Landroid/view/autofill/AutofillId;
 PLcom/android/server/autofill/InlineSuggestionSession;->access$102(Lcom/android/server/autofill/InlineSuggestionSession;Landroid/view/autofill/AutofillId;)Landroid/view/autofill/AutofillId;
 PLcom/android/server/autofill/InlineSuggestionSession;->access$202(Lcom/android/server/autofill/InlineSuggestionSession;Z)Z
 PLcom/android/server/autofill/InlineSuggestionSession;->access$300(Lcom/android/server/autofill/InlineSuggestionSession;)Lcom/android/server/autofill/InlineSuggestionSession$AutofillResponse;
+PLcom/android/server/autofill/InlineSuggestionSession;->access$302(Lcom/android/server/autofill/InlineSuggestionSession;Lcom/android/server/autofill/InlineSuggestionSession$AutofillResponse;)Lcom/android/server/autofill/InlineSuggestionSession$AutofillResponse;
+PLcom/android/server/autofill/InlineSuggestionSession;->access$400(Lcom/android/server/autofill/InlineSuggestionSession;Landroid/view/autofill/AutofillId;Landroid/view/inputmethod/InlineSuggestionsResponse;)Z
 PLcom/android/server/autofill/InlineSuggestionSession;->cancelCurrentRequest()V
 HPLcom/android/server/autofill/InlineSuggestionSession;->createRequest(Landroid/view/autofill/AutofillId;)V
+PLcom/android/server/autofill/InlineSuggestionSession;->getInlineSuggestionsRequest()Ljava/util/Optional;
 HPLcom/android/server/autofill/InlineSuggestionSession;->getPendingImeResponse()Ljava/util/concurrent/CompletableFuture;
 HPLcom/android/server/autofill/InlineSuggestionSession;->hideInlineSuggestionsUi(Landroid/view/autofill/AutofillId;)Z
 HPLcom/android/server/autofill/InlineSuggestionSession;->onCreateInlineSuggestionsRequest(Landroid/view/autofill/AutofillId;)V
+HPLcom/android/server/autofill/InlineSuggestionSession;->onCreateInlineSuggestionsRequest(Landroid/view/autofill/AutofillId;Ljava/util/function/Consumer;)V
+PLcom/android/server/autofill/InlineSuggestionSession;->onInlineSuggestionsResponse(Landroid/view/autofill/AutofillId;Landroid/view/inputmethod/InlineSuggestionsResponse;)Z
+HPLcom/android/server/autofill/InlineSuggestionSession;->onInlineSuggestionsResponseLocked(Landroid/view/autofill/AutofillId;Landroid/view/inputmethod/InlineSuggestionsResponse;)Z
 HPLcom/android/server/autofill/InlineSuggestionSession;->waitAndGetImeResponse()Lcom/android/server/autofill/InlineSuggestionSession$ImeResponse;
 HPLcom/android/server/autofill/InlineSuggestionSession;->waitAndGetInlineSuggestionsRequest()Ljava/util/Optional;
 PLcom/android/server/autofill/RemoteAugmentedAutofillService$1$1;-><init>(Lcom/android/server/autofill/RemoteAugmentedAutofillService$1;)V
@@ -11055,6 +11712,7 @@
 HPLcom/android/server/autofill/RemoteAugmentedAutofillService$1$1;->isCompleted()Z
 HPLcom/android/server/autofill/RemoteAugmentedAutofillService$1$1;->onCancellable(Landroid/os/ICancellationSignal;)V
 PLcom/android/server/autofill/RemoteAugmentedAutofillService$1$1;->onSuccess()V
+HPLcom/android/server/autofill/RemoteAugmentedAutofillService$1$1;->onSuccess(Ljava/util/List;)V
 HPLcom/android/server/autofill/RemoteAugmentedAutofillService$1$1;->onSuccess(Ljava/util/List;Ljava/util/List;)V
 HPLcom/android/server/autofill/RemoteAugmentedAutofillService$1$1;->onSuccess([Landroid/service/autofill/Dataset;)V
 HPLcom/android/server/autofill/RemoteAugmentedAutofillService$1$1;->onSuccess([Landroid/service/autofill/Dataset;Landroid/os/Bundle;)V
@@ -11064,6 +11722,8 @@
 HPLcom/android/server/autofill/RemoteAugmentedAutofillService$1;-><init>(Lcom/android/server/autofill/RemoteAugmentedAutofillService;Landroid/service/autofill/augmented/IAugmentedAutofillService;IILandroid/content/ComponentName;Landroid/view/autofill/AutofillId;Landroid/view/autofill/AutofillValue;JLandroid/view/inputmethod/InlineSuggestionsRequest;Ljava/util/function/Function;Landroid/view/autofill/IAutoFillManagerClient;Ljava/lang/Runnable;Lcom/android/server/autofill/RemoteInlineSuggestionRenderService;Lcom/android/internal/infra/AndroidFuture;Ljava/util/concurrent/atomic/AtomicReference;)V
 PLcom/android/server/autofill/RemoteAugmentedAutofillService$1;-><init>(Lcom/android/server/autofill/RemoteAugmentedAutofillService;Landroid/service/autofill/augmented/IAugmentedAutofillService;IILandroid/content/ComponentName;Landroid/view/autofill/AutofillId;Landroid/view/autofill/AutofillValue;JLcom/android/internal/infra/AndroidFuture;Ljava/util/concurrent/atomic/AtomicReference;)V
 HPLcom/android/server/autofill/RemoteAugmentedAutofillService$1;->send(ILandroid/os/Bundle;)V
+PLcom/android/server/autofill/RemoteAugmentedAutofillService$2;-><init>(Lcom/android/server/autofill/RemoteAugmentedAutofillService;ILandroid/view/autofill/AutofillId;Landroid/view/autofill/IAutoFillManagerClient;)V
+PLcom/android/server/autofill/RemoteAugmentedAutofillService$2;->autofill(Landroid/service/autofill/Dataset;)V
 HSPLcom/android/server/autofill/RemoteAugmentedAutofillService;-><clinit>()V
 PLcom/android/server/autofill/RemoteAugmentedAutofillService;-><init>(Landroid/content/Context;Landroid/content/ComponentName;ILcom/android/server/autofill/RemoteAugmentedAutofillService$RemoteAugmentedAutofillServiceCallbacks;ZZII)V
 PLcom/android/server/autofill/RemoteAugmentedAutofillService;->access$000(Lcom/android/server/autofill/RemoteAugmentedAutofillService;)Lcom/android/server/autofill/RemoteAugmentedAutofillService$RemoteAugmentedAutofillServiceCallbacks;
@@ -11073,6 +11733,7 @@
 PLcom/android/server/autofill/RemoteAugmentedAutofillService;->access$100(Lcom/android/server/autofill/RemoteAugmentedAutofillService;ILandroid/view/inputmethod/InlineSuggestionsRequest;[Landroid/service/autofill/Dataset;Landroid/view/autofill/AutofillId;Lcom/android/internal/view/IInlineSuggestionsResponseCallback;Landroid/view/autofill/IAutoFillManagerClient;Ljava/lang/Runnable;)V
 PLcom/android/server/autofill/RemoteAugmentedAutofillService;->access$100(Lcom/android/server/autofill/RemoteAugmentedAutofillService;I[Landroid/service/autofill/Dataset;Landroid/view/autofill/AutofillId;Lcom/android/internal/view/IInlineSuggestionsResponseCallback;Landroid/view/autofill/IAutoFillManagerClient;Landroid/os/Bundle;)V
 PLcom/android/server/autofill/RemoteAugmentedAutofillService;->access$100(Lcom/android/server/autofill/RemoteAugmentedAutofillService;I[Landroid/service/autofill/Dataset;Landroid/view/autofill/AutofillId;Lcom/android/internal/view/IInlineSuggestionsResponseCallback;Landroid/view/autofill/IAutoFillManagerClient;Ljava/lang/Runnable;)V
+PLcom/android/server/autofill/RemoteAugmentedAutofillService;->access$200(Lcom/android/server/autofill/RemoteAugmentedAutofillService;ILandroid/view/inputmethod/InlineSuggestionsRequest;Ljava/util/List;Landroid/view/autofill/AutofillId;Ljava/util/function/Function;Landroid/view/autofill/IAutoFillManagerClient;Ljava/lang/Runnable;Lcom/android/server/autofill/RemoteInlineSuggestionRenderService;)V
 PLcom/android/server/autofill/RemoteAugmentedAutofillService;->dispatchCancellation(Landroid/os/ICancellationSignal;)V
 HPLcom/android/server/autofill/RemoteAugmentedAutofillService;->getAutoDisconnectTimeoutMs()J
 PLcom/android/server/autofill/RemoteAugmentedAutofillService;->getComponentName()Landroid/content/ComponentName;
@@ -11089,7 +11750,8 @@
 HPLcom/android/server/autofill/RemoteAugmentedAutofillService;->lambda$onRequestAutofillLocked$1$RemoteAugmentedAutofillService(Ljava/util/concurrent/atomic/AtomicReference;Landroid/content/ComponentName;ILjava/lang/Void;Ljava/lang/Throwable;)V
 HPLcom/android/server/autofill/RemoteAugmentedAutofillService;->maybeHandleInlineSuggestions(I[Landroid/service/autofill/Dataset;Landroid/view/autofill/AutofillId;Landroid/view/inputmethod/InlineSuggestionsRequest;Lcom/android/internal/view/IInlineSuggestionsResponseCallback;Landroid/view/autofill/IAutoFillManagerClient;)V
 PLcom/android/server/autofill/RemoteAugmentedAutofillService;->maybeHandleInlineSuggestions(I[Landroid/service/autofill/Dataset;Landroid/view/autofill/AutofillId;Lcom/android/internal/view/IInlineSuggestionsResponseCallback;Landroid/view/autofill/IAutoFillManagerClient;)V
-PLcom/android/server/autofill/RemoteAugmentedAutofillService;->maybeRequestShowInlineSuggestions(ILandroid/view/inputmethod/InlineSuggestionsRequest;Ljava/util/List;Ljava/util/List;Landroid/view/autofill/AutofillId;Ljava/util/function/Function;Landroid/view/autofill/IAutoFillManagerClient;Ljava/lang/Runnable;Lcom/android/server/autofill/RemoteInlineSuggestionRenderService;)V
+HPLcom/android/server/autofill/RemoteAugmentedAutofillService;->maybeRequestShowInlineSuggestions(ILandroid/view/inputmethod/InlineSuggestionsRequest;Ljava/util/List;Landroid/view/autofill/AutofillId;Ljava/util/function/Function;Landroid/view/autofill/IAutoFillManagerClient;Ljava/lang/Runnable;Lcom/android/server/autofill/RemoteInlineSuggestionRenderService;)V
+HPLcom/android/server/autofill/RemoteAugmentedAutofillService;->maybeRequestShowInlineSuggestions(ILandroid/view/inputmethod/InlineSuggestionsRequest;Ljava/util/List;Ljava/util/List;Landroid/view/autofill/AutofillId;Ljava/util/function/Function;Landroid/view/autofill/IAutoFillManagerClient;Ljava/lang/Runnable;Lcom/android/server/autofill/RemoteInlineSuggestionRenderService;)V
 HPLcom/android/server/autofill/RemoteAugmentedAutofillService;->maybeRequestShowInlineSuggestions(ILandroid/view/inputmethod/InlineSuggestionsRequest;[Landroid/service/autofill/Dataset;Landroid/view/autofill/AutofillId;Lcom/android/internal/view/IInlineSuggestionsResponseCallback;Landroid/view/autofill/IAutoFillManagerClient;Ljava/lang/Runnable;)V
 HPLcom/android/server/autofill/RemoteAugmentedAutofillService;->maybeRequestShowInlineSuggestions(ILandroid/view/inputmethod/InlineSuggestionsRequest;[Landroid/service/autofill/Dataset;Landroid/view/autofill/AutofillId;Lcom/android/internal/view/IInlineSuggestionsResponseCallback;Landroid/view/autofill/IAutoFillManagerClient;Ljava/lang/Runnable;Lcom/android/server/autofill/RemoteInlineSuggestionRenderService;)V
 HPLcom/android/server/autofill/RemoteAugmentedAutofillService;->maybeRequestShowInlineSuggestions(I[Landroid/service/autofill/Dataset;Landroid/view/autofill/AutofillId;Lcom/android/internal/view/IInlineSuggestionsResponseCallback;Landroid/view/autofill/IAutoFillManagerClient;Landroid/os/Bundle;)V
@@ -11136,8 +11798,16 @@
 PLcom/android/server/autofill/RemoteInlineSuggestionRenderService;->getServiceInterface(Landroid/os/IBinder;)Landroid/service/autofill/IInlineSuggestionRenderService;
 PLcom/android/server/autofill/RemoteInlineSuggestionRenderService;->getTimeoutIdleBindMillis()J
 PLcom/android/server/autofill/RemoteInlineSuggestionRenderService;->handleOnConnectedStateChanged(Z)V
+PLcom/android/server/autofill/RemoteInlineSuggestionRenderService;->lambda$renderSuggestion$0(Landroid/service/autofill/IInlineSuggestionUiCallback;Landroid/service/autofill/InlinePresentation;IILandroid/os/IBinder;ILandroid/service/autofill/IInlineSuggestionRenderService;)V
+PLcom/android/server/autofill/RemoteInlineSuggestionRenderService;->renderSuggestion(Landroid/service/autofill/IInlineSuggestionUiCallback;Landroid/service/autofill/InlinePresentation;IILandroid/os/IBinder;I)V
 HPLcom/android/server/autofill/Session$1;-><init>(Lcom/android/server/autofill/Session;)V
 HPLcom/android/server/autofill/Session$1;->onHandleAssistData(Landroid/os/Bundle;)V
+PLcom/android/server/autofill/Session$AssistDataReceiverImpl;-><init>(Lcom/android/server/autofill/Session;)V
+HPLcom/android/server/autofill/Session$AssistDataReceiverImpl;-><init>(Lcom/android/server/autofill/Session;Lcom/android/server/autofill/Session$1;)V
+PLcom/android/server/autofill/Session$AssistDataReceiverImpl;->lambda$newAutofillRequestLocked$0$Session$AssistDataReceiverImpl(Landroid/view/inputmethod/InlineSuggestionsRequest;)V
+PLcom/android/server/autofill/Session$AssistDataReceiverImpl;->maybeRequestFillLocked()V
+HPLcom/android/server/autofill/Session$AssistDataReceiverImpl;->newAutofillRequestLocked(Z)Ljava/util/function/Consumer;
+HPLcom/android/server/autofill/Session$AssistDataReceiverImpl;->onHandleAssistData(Landroid/os/Bundle;)V
 PLcom/android/server/autofill/Session$InlineSuggestionsRequestCallbackImpl;-><init>()V
 PLcom/android/server/autofill/Session$InlineSuggestionsRequestCallbackImpl;-><init>(Lcom/android/server/autofill/Session$1;)V
 PLcom/android/server/autofill/Session$InlineSuggestionsRequestCallbackImpl;->access$1500(Lcom/android/server/autofill/Session$InlineSuggestionsRequestCallbackImpl;)Landroid/view/inputmethod/InlineSuggestionsRequest;
@@ -11149,33 +11819,50 @@
 PLcom/android/server/autofill/Session;-><init>(Lcom/android/server/autofill/AutofillManagerServiceImpl;Lcom/android/server/autofill/ui/AutoFillUI;Landroid/content/Context;Landroid/os/Handler;ILjava/lang/Object;IIILandroid/os/IBinder;Landroid/os/IBinder;ZLandroid/util/LocalLog;Landroid/util/LocalLog;Landroid/content/ComponentName;Landroid/content/ComponentName;ZZZI)V
 HPLcom/android/server/autofill/Session;-><init>(Lcom/android/server/autofill/AutofillManagerServiceImpl;Lcom/android/server/autofill/ui/AutoFillUI;Landroid/content/Context;Landroid/os/Handler;ILjava/lang/Object;IIILandroid/os/IBinder;Landroid/os/IBinder;ZLandroid/util/LocalLog;Landroid/util/LocalLog;Landroid/content/ComponentName;Landroid/content/ComponentName;ZZZILcom/android/server/inputmethod/InputMethodManagerInternal;)V
 HPLcom/android/server/autofill/Session;->access$000(Lcom/android/server/autofill/Session;)Lcom/android/server/autofill/RemoteFillService;
+PLcom/android/server/autofill/Session;->access$100(Lcom/android/server/autofill/Session;)Lcom/android/server/autofill/RemoteFillService;
+PLcom/android/server/autofill/Session;->access$1000(Lcom/android/server/autofill/Session;)Landroid/util/ArrayMap;
 HPLcom/android/server/autofill/Session;->access$1000(Lcom/android/server/autofill/Session;)Ljava/util/ArrayList;
 HPLcom/android/server/autofill/Session;->access$1002(Lcom/android/server/autofill/Session;Ljava/util/ArrayList;)Ljava/util/ArrayList;
+PLcom/android/server/autofill/Session;->access$1100(Lcom/android/server/autofill/Session;)Ljava/util/ArrayList;
 HPLcom/android/server/autofill/Session;->access$1100(Lcom/android/server/autofill/Session;)V
+PLcom/android/server/autofill/Session;->access$1102(Lcom/android/server/autofill/Session;Ljava/util/ArrayList;)Ljava/util/ArrayList;
+PLcom/android/server/autofill/Session;->access$1200(Lcom/android/server/autofill/Session;)V
 HPLcom/android/server/autofill/Session;->access$1200(Lcom/android/server/autofill/Session;Landroid/service/autofill/FillContext;I)V
+PLcom/android/server/autofill/Session;->access$1300(Lcom/android/server/autofill/Session;Landroid/service/autofill/FillContext;I)V
 HPLcom/android/server/autofill/Session;->access$1300(Lcom/android/server/autofill/Session;Z)Ljava/util/ArrayList;
 PLcom/android/server/autofill/Session;->access$1400(Lcom/android/server/autofill/Session;)Landroid/os/Bundle;
 PLcom/android/server/autofill/Session;->access$1400(Lcom/android/server/autofill/Session;)Lcom/android/server/autofill/InlineSuggestionSession;
 HPLcom/android/server/autofill/Session;->access$1400(Lcom/android/server/autofill/Session;)Lcom/android/server/autofill/Session$InlineSuggestionsRequestCallbackImpl;
+PLcom/android/server/autofill/Session;->access$1400(Lcom/android/server/autofill/Session;Z)Ljava/util/ArrayList;
 PLcom/android/server/autofill/Session;->access$1500(Lcom/android/server/autofill/Session;)Landroid/os/Bundle;
 HPLcom/android/server/autofill/Session;->access$1600(Lcom/android/server/autofill/Session;)Landroid/os/Bundle;
 HPLcom/android/server/autofill/Session;->access$1600(Lcom/android/server/autofill/Session;)Landroid/os/IBinder;
 HPLcom/android/server/autofill/Session;->access$300(Lcom/android/server/autofill/Session;)Landroid/view/autofill/AutofillId;
+PLcom/android/server/autofill/Session;->access$400(Lcom/android/server/autofill/Session;)Landroid/view/autofill/AutofillId;
 HPLcom/android/server/autofill/Session;->access$400(Lcom/android/server/autofill/Session;)Ljava/lang/Object;
+PLcom/android/server/autofill/Session;->access$500(Lcom/android/server/autofill/Session;)Ljava/lang/Object;
 HPLcom/android/server/autofill/Session;->access$500(Lcom/android/server/autofill/Session;)Z
 PLcom/android/server/autofill/Session;->access$600(Lcom/android/server/autofill/Session;)Landroid/content/ComponentName;
+PLcom/android/server/autofill/Session;->access$600(Lcom/android/server/autofill/Session;)Z
+PLcom/android/server/autofill/Session;->access$700(Lcom/android/server/autofill/Session;)Landroid/content/ComponentName;
 PLcom/android/server/autofill/Session;->access$700(Lcom/android/server/autofill/Session;)Lcom/android/server/autofill/AutofillManagerServiceImpl;
 PLcom/android/server/autofill/Session;->access$800(Lcom/android/server/autofill/Session;)Landroid/app/assist/AssistStructure$ViewNode;
+PLcom/android/server/autofill/Session;->access$800(Lcom/android/server/autofill/Session;)Lcom/android/server/autofill/AutofillManagerServiceImpl;
 PLcom/android/server/autofill/Session;->access$802(Lcom/android/server/autofill/Session;Landroid/app/assist/AssistStructure$ViewNode;)Landroid/app/assist/AssistStructure$ViewNode;
+PLcom/android/server/autofill/Session;->access$900(Lcom/android/server/autofill/Session;)Landroid/app/assist/AssistStructure$ViewNode;
 PLcom/android/server/autofill/Session;->access$900(Lcom/android/server/autofill/Session;)Landroid/util/ArrayMap;
+PLcom/android/server/autofill/Session;->access$902(Lcom/android/server/autofill/Session;Landroid/app/assist/AssistStructure$ViewNode;)Landroid/app/assist/AssistStructure$ViewNode;
+PLcom/android/server/autofill/Session;->actionAsString(I)Ljava/lang/String;
 PLcom/android/server/autofill/Session;->addTaggedDataToRequestLogLocked(IILjava/lang/Object;)V
 PLcom/android/server/autofill/Session;->authenticate(IILandroid/content/IntentSender;Landroid/os/Bundle;)V
+PLcom/android/server/autofill/Session;->authenticate(IILandroid/content/IntentSender;Landroid/os/Bundle;Z)V
 PLcom/android/server/autofill/Session;->autoFill(IILandroid/service/autofill/Dataset;Z)V
 PLcom/android/server/autofill/Session;->autoFillApp(Landroid/service/autofill/Dataset;)V
 PLcom/android/server/autofill/Session;->callSaveLocked()V
 HPLcom/android/server/autofill/Session;->cancelAugmentedAutofillLocked()V
 HPLcom/android/server/autofill/Session;->cancelCurrentRequestLocked()V
 PLcom/android/server/autofill/Session;->cancelSave()V
+HPLcom/android/server/autofill/Session;->containsCharsInOrder(Ljava/lang/String;Ljava/lang/String;)Z
 PLcom/android/server/autofill/Session;->createAuthFillInIntentLocked(ILandroid/os/Bundle;)Landroid/content/Intent;
 PLcom/android/server/autofill/Session;->createOrUpdateViewStateLocked(Landroid/view/autofill/AutofillId;ILandroid/view/autofill/AutofillValue;)Lcom/android/server/autofill/ViewState;
 HPLcom/android/server/autofill/Session;->createSanitizers(Landroid/service/autofill/SaveInfo;)Landroid/util/ArrayMap;
@@ -11206,19 +11893,25 @@
 PLcom/android/server/autofill/Session;->handleLogContextCommitted()V
 HPLcom/android/server/autofill/Session;->hideAugmentedAutofillLocked(Lcom/android/server/autofill/ViewState;)V
 HPLcom/android/server/autofill/Session;->isIgnoredLocked(Landroid/view/autofill/AutofillId;)Z
+PLcom/android/server/autofill/Session;->isInlineSuggestionRenderServiceAvailable()Z
 HPLcom/android/server/autofill/Session;->isInlineSuggestionsEnabled()Z
+PLcom/android/server/autofill/Session;->isInlineSuggestionsEnabledByAutofillProviderLocked()Z
 HPLcom/android/server/autofill/Session;->isInlineSuggestionsEnabledLocked()Z
 HPLcom/android/server/autofill/Session;->isSaveUiPendingLocked()Z
 HPLcom/android/server/autofill/Session;->isSavingLocked()Z
 PLcom/android/server/autofill/Session;->lambda$Fs9zdJwELk-9rAM3RiY6AyBKswI(Lcom/android/server/autofill/Session;Landroid/content/IntentSender;Landroid/content/Intent;)V
 PLcom/android/server/autofill/Session;->lambda$LM4xf4dbxH_NTutQzBkaQNxKbV0(Lcom/android/server/autofill/Session;ILandroid/content/IntentSender;Landroid/content/Intent;)V
+PLcom/android/server/autofill/Session;->lambda$LYgiVF7QUn4954p-wNYTeWDnGkw(Lcom/android/server/autofill/Session;ILandroid/content/IntentSender;Landroid/content/Intent;Z)V
 PLcom/android/server/autofill/Session;->lambda$NtvZwhlT1c4eLjg2qI6EER2oCtY(Lcom/android/server/autofill/Session;)V
 PLcom/android/server/autofill/Session;->lambda$cYu1t6lYVopApYW-vct82-7slZk(Lcom/android/server/autofill/Session;)V
 HPLcom/android/server/autofill/Session;->lambda$logFieldClassificationScore$1$Session(I[Landroid/view/autofill/AutofillId;[Ljava/lang/String;[Ljava/lang/String;Ljava/util/ArrayList;Ljava/util/ArrayList;Landroid/os/Bundle;)V
 HPLcom/android/server/autofill/Session;->lambda$setClientLocked$0$Session()V
 PLcom/android/server/autofill/Session;->lambda$triggerAugmentedAutofillLocked$2(Lcom/android/server/autofill/RemoteAugmentedAutofillService;)V
+PLcom/android/server/autofill/Session;->lambda$triggerAugmentedAutofillLocked$3$Session(Landroid/view/inputmethod/InlineSuggestionsResponse;)Ljava/lang/Boolean;
 HPLcom/android/server/autofill/Session;->lambda$triggerAugmentedAutofillLocked$4(Lcom/android/server/autofill/RemoteAugmentedAutofillService;)V
+HPLcom/android/server/autofill/Session;->lambda$triggerAugmentedAutofillLocked$5$Session(Lcom/android/server/autofill/RemoteAugmentedAutofillService;Landroid/view/autofill/AutofillId;Landroid/view/autofill/AutofillValue;Landroid/view/inputmethod/InlineSuggestionsRequest;)V
 PLcom/android/server/autofill/Session;->lambda$triggerAugmentedAutofillLocked$5(Lcom/android/server/autofill/RemoteAugmentedAutofillService;)V
+PLcom/android/server/autofill/Session;->lambda$triggerAugmentedAutofillLocked$6(Lcom/android/server/autofill/RemoteAugmentedAutofillService;)V
 PLcom/android/server/autofill/Session;->lambda$v6ZVyksJuHdWgJ1F8aoa_1LJWPo(Lcom/android/server/autofill/Session;)V
 PLcom/android/server/autofill/Session;->logAuthenticationStatusLocked(II)V
 PLcom/android/server/autofill/Session;->logContextCommitted()V
@@ -11249,6 +11942,7 @@
 HPLcom/android/server/autofill/Session;->requestNewFillResponseOnViewEnteredIfNecessaryLocked(Landroid/view/autofill/AutofillId;Lcom/android/server/autofill/ViewState;I)V
 HPLcom/android/server/autofill/Session;->requestNewFillResponseOnViewEnteredIfNecessaryLocked(Landroid/view/autofill/AutofillId;Lcom/android/server/autofill/ViewState;I)Z
 PLcom/android/server/autofill/Session;->requestShowFillUi(Landroid/view/autofill/AutofillId;IILandroid/view/autofill/IAutofillWindowPresenter;)V
+PLcom/android/server/autofill/Session;->requestShowInlineSuggestionsLocked(Landroid/service/autofill/FillResponse;Ljava/lang/String;)Z
 PLcom/android/server/autofill/Session;->save()V
 PLcom/android/server/autofill/Session;->setAuthenticationResultLocked(Landroid/os/Bundle;I)V
 HPLcom/android/server/autofill/Session;->setClientLocked(Landroid/os/IBinder;)V
@@ -11262,8 +11956,11 @@
 PLcom/android/server/autofill/Session;->startIntentSender(Landroid/content/IntentSender;Landroid/content/Intent;)V
 PLcom/android/server/autofill/Session;->startIntentSenderAndFinishSession(Landroid/content/IntentSender;)V
 PLcom/android/server/autofill/Session;->switchActivity(Landroid/os/IBinder;Landroid/os/IBinder;)V
+HPLcom/android/server/autofill/Session;->toString()Ljava/lang/String;
 HPLcom/android/server/autofill/Session;->triggerAugmentedAutofillLocked()Ljava/lang/Runnable;
+HPLcom/android/server/autofill/Session;->triggerAugmentedAutofillLocked(I)Ljava/lang/Runnable;
 HPLcom/android/server/autofill/Session;->unlinkClientVultureLocked()V
+HPLcom/android/server/autofill/Session;->updateFilteringStateOnValueChangedLocked(Ljava/lang/String;Lcom/android/server/autofill/ViewState;)V
 HPLcom/android/server/autofill/Session;->updateLocked(Landroid/view/autofill/AutofillId;Landroid/graphics/Rect;Landroid/view/autofill/AutofillValue;II)V
 HPLcom/android/server/autofill/Session;->updateTrackedIdsLocked()V
 PLcom/android/server/autofill/Session;->updateValuesForSaveLocked()V
@@ -11275,6 +11972,7 @@
 HPLcom/android/server/autofill/ViewState;->getAutofilledValue()Landroid/view/autofill/AutofillValue;
 HPLcom/android/server/autofill/ViewState;->getCurrentValue()Landroid/view/autofill/AutofillValue;
 PLcom/android/server/autofill/ViewState;->getDatasetId()Ljava/lang/String;
+PLcom/android/server/autofill/ViewState;->getResponse()Landroid/service/autofill/FillResponse;
 PLcom/android/server/autofill/ViewState;->getSanitizedValue()Landroid/view/autofill/AutofillValue;
 PLcom/android/server/autofill/ViewState;->getState()I
 HPLcom/android/server/autofill/ViewState;->getStateAsString()Ljava/lang/String;
@@ -11336,11 +12034,21 @@
 PLcom/android/server/autofill/ui/-$$Lambda$FillUi$h0jT24YuSGGDnoZ6Tf22n1QRkO8;->onClick(Landroid/view/View;)V
 PLcom/android/server/autofill/ui/-$$Lambda$InlineSuggestionFactory$1$4sWDEOdokeeolTOnOnHGWWOLgn8;-><init>(Lcom/android/server/autofill/ui/InlineSuggestionUi;Landroid/service/autofill/InlinePresentation;IILandroid/view/View$OnClickListener;Lcom/android/internal/view/inline/IInlineContentCallback;)V
 PLcom/android/server/autofill/ui/-$$Lambda$InlineSuggestionFactory$1$4sWDEOdokeeolTOnOnHGWWOLgn8;->run()V
+PLcom/android/server/autofill/ui/-$$Lambda$InlineSuggestionFactory$1$_ciGyKlETcExAF1Gy2FFOktBsQw;-><init>(Lcom/android/internal/view/inline/IInlineContentCallback;Ljava/lang/Runnable;Ljava/lang/Runnable;Ljava/util/function/Consumer;Lcom/android/server/autofill/RemoteInlineSuggestionRenderService;Landroid/service/autofill/InlinePresentation;IILandroid/os/IBinder;I)V
+PLcom/android/server/autofill/ui/-$$Lambda$InlineSuggestionFactory$1$_ciGyKlETcExAF1Gy2FFOktBsQw;->run()V
 PLcom/android/server/autofill/ui/-$$Lambda$InlineSuggestionFactory$20Xpxfm8UCdjf-klcBqO784Dbdg;-><init>(Lcom/android/server/autofill/ui/InlineSuggestionFactory$InlineSuggestionUiCallback;)V
 PLcom/android/server/autofill/ui/-$$Lambda$InlineSuggestionFactory$20Xpxfm8UCdjf-klcBqO784Dbdg;->apply(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+PLcom/android/server/autofill/ui/-$$Lambda$InlineSuggestionFactory$5tX078SIcP_tdv7L43uwbyhDhwo;-><init>(Lcom/android/server/autofill/ui/InlineSuggestionFactory$InlineSuggestionUiCallback;)V
 PLcom/android/server/autofill/ui/-$$Lambda$InlineSuggestionFactory$HUQuYhrTG8enbhukk4IiDs7rF0c;-><init>(Lcom/android/server/autofill/ui/InlineSuggestionFactory$InlineSuggestionUiCallback;Landroid/service/autofill/Dataset;)V
 PLcom/android/server/autofill/ui/-$$Lambda$InlineSuggestionFactory$HUQuYhrTG8enbhukk4IiDs7rF0c;->onClick(Landroid/view/View;)V
+PLcom/android/server/autofill/ui/-$$Lambda$InlineSuggestionFactory$ZJyFXduoAaPRoB2PemuxwX3DoU0;-><init>(Lcom/android/server/autofill/ui/AutoFillUI$AutoFillUiCallback;Landroid/view/autofill/AutofillId;Landroid/service/autofill/FillResponse;)V
+PLcom/android/server/autofill/ui/-$$Lambda$InlineSuggestionFactory$ZJyFXduoAaPRoB2PemuxwX3DoU0;->accept(Ljava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/autofill/ui/-$$Lambda$InlineSuggestionFactory$dOv6_vzCtJXQ5uPY34UlfHkGoCA;-><init>(Lcom/android/server/autofill/ui/InlineSuggestionFactory$InlineSuggestionUiCallback;)V
+PLcom/android/server/autofill/ui/-$$Lambda$InlineSuggestionFactory$dOv6_vzCtJXQ5uPY34UlfHkGoCA;->accept(Ljava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/autofill/ui/-$$Lambda$InlineSuggestionFactory$fSXZaLhCskxYnueWFHMXopmEKG4;-><init>(Ljava/util/function/BiConsumer;Landroid/service/autofill/Dataset;I)V
+PLcom/android/server/autofill/ui/-$$Lambda$InlineSuggestionFactory$fSXZaLhCskxYnueWFHMXopmEKG4;->run()V
 PLcom/android/server/autofill/ui/-$$Lambda$InlineSuggestionFactory$jlH6zmWiBgLd1Lh95Rw6iMdFzEY;-><init>(Lcom/android/server/autofill/ui/InlineSuggestionFactory$InlineSuggestionUiCallback;)V
+PLcom/android/server/autofill/ui/-$$Lambda$InlineSuggestionFactory$xMNRMfTgFUJoQDr062AyCUziPEQ;-><init>(Lcom/android/server/autofill/ui/AutoFillUI$AutoFillUiCallback;)V
 PLcom/android/server/autofill/ui/-$$Lambda$SaveUi$9E3wVcFykoYBpXtez_dJMd6U_Nw;-><init>(Lcom/android/server/autofill/ui/SaveUi;)V
 PLcom/android/server/autofill/ui/-$$Lambda$SaveUi$E9O26NP1L_DDYBfaO7fQ0hhPAx8;-><init>(Lcom/android/server/autofill/ui/SaveUi;Landroid/service/autofill/SaveInfo;)V
 PLcom/android/server/autofill/ui/-$$Lambda$SaveUi$E9O26NP1L_DDYBfaO7fQ0hhPAx8;->onClick(Landroid/view/View;)V
@@ -11454,16 +12162,33 @@
 PLcom/android/server/autofill/ui/FillUi;->updateHeight(Landroid/view/View;Landroid/graphics/Point;)Z
 PLcom/android/server/autofill/ui/FillUi;->updateWidth(Landroid/view/View;Landroid/graphics/Point;)Z
 PLcom/android/server/autofill/ui/InlineSuggestionFactory$1;-><init>(Lcom/android/server/autofill/ui/InlineSuggestionUi;Landroid/service/autofill/InlinePresentation;Landroid/view/View$OnClickListener;)V
+PLcom/android/server/autofill/ui/InlineSuggestionFactory$1;-><init>(Ljava/lang/Runnable;Ljava/lang/Runnable;Ljava/util/function/Consumer;Lcom/android/server/autofill/RemoteInlineSuggestionRenderService;Landroid/service/autofill/InlinePresentation;Landroid/os/IBinder;I)V
+PLcom/android/server/autofill/ui/InlineSuggestionFactory$1;->lambda$provideContent$0(Lcom/android/internal/view/inline/IInlineContentCallback;Ljava/lang/Runnable;Ljava/lang/Runnable;Ljava/util/function/Consumer;Lcom/android/server/autofill/RemoteInlineSuggestionRenderService;Landroid/service/autofill/InlinePresentation;IILandroid/os/IBinder;I)V
 PLcom/android/server/autofill/ui/InlineSuggestionFactory$1;->lambda$provideContent$0(Lcom/android/server/autofill/ui/InlineSuggestionUi;Landroid/service/autofill/InlinePresentation;IILandroid/view/View$OnClickListener;Lcom/android/internal/view/inline/IInlineContentCallback;)V
 PLcom/android/server/autofill/ui/InlineSuggestionFactory$1;->provideContent(IILcom/android/internal/view/inline/IInlineContentCallback;)V
+PLcom/android/server/autofill/ui/InlineSuggestionFactory$2;-><init>(Ljava/lang/Runnable;Lcom/android/internal/view/inline/IInlineContentCallback;Ljava/lang/Runnable;Ljava/util/function/Consumer;)V
+PLcom/android/server/autofill/ui/InlineSuggestionFactory$2;->onClick()V
+PLcom/android/server/autofill/ui/InlineSuggestionFactory$2;->onContent(Landroid/view/SurfaceControlViewHost$SurfacePackage;)V
+PLcom/android/server/autofill/ui/InlineSuggestionFactory$2;->onTransferTouchFocusToImeWindow(Landroid/os/IBinder;I)V
+PLcom/android/server/autofill/ui/InlineSuggestionFactory;->access$000(Lcom/android/internal/view/inline/IInlineContentCallback;Ljava/lang/Runnable;Ljava/lang/Runnable;Ljava/util/function/Consumer;)Landroid/service/autofill/IInlineSuggestionUiCallback$Stub;
+PLcom/android/server/autofill/ui/InlineSuggestionFactory;->createAugmentedInlineSuggestionsResponse(Landroid/view/inputmethod/InlineSuggestionsRequest;Ljava/util/List;Landroid/view/autofill/AutofillId;Lcom/android/server/autofill/ui/InlineSuggestionFactory$InlineSuggestionUiCallback;Ljava/lang/Runnable;Lcom/android/server/autofill/RemoteInlineSuggestionRenderService;)Landroid/view/inputmethod/InlineSuggestionsResponse;
 PLcom/android/server/autofill/ui/InlineSuggestionFactory;->createAugmentedInlineSuggestionsResponse(Landroid/view/inputmethod/InlineSuggestionsRequest;[Landroid/service/autofill/Dataset;Landroid/view/autofill/AutofillId;Landroid/content/Context;Lcom/android/server/autofill/ui/InlineSuggestionFactory$InlineSuggestionUiCallback;Ljava/lang/Runnable;)Landroid/view/inputmethod/InlineSuggestionsResponse;
 PLcom/android/server/autofill/ui/InlineSuggestionFactory;->createAugmentedInlineSuggestionsResponse(Landroid/view/inputmethod/InlineSuggestionsRequest;[Landroid/service/autofill/Dataset;Landroid/view/autofill/AutofillId;Landroid/content/Context;Lcom/android/server/autofill/ui/InlineSuggestionFactory$InlineSuggestionUiCallback;Ljava/lang/Runnable;Lcom/android/server/autofill/RemoteInlineSuggestionRenderService;)Landroid/view/inputmethod/InlineSuggestionsResponse;
 PLcom/android/server/autofill/ui/InlineSuggestionFactory;->createInlineContentProvider(Landroid/service/autofill/InlinePresentation;Lcom/android/server/autofill/ui/InlineSuggestionUi;Landroid/view/View$OnClickListener;)Lcom/android/internal/view/inline/IInlineContentProvider$Stub;
+PLcom/android/server/autofill/ui/InlineSuggestionFactory;->createInlineContentProvider(Landroid/service/autofill/InlinePresentation;Ljava/lang/Runnable;Ljava/lang/Runnable;Ljava/util/function/Consumer;Lcom/android/server/autofill/RemoteInlineSuggestionRenderService;Landroid/os/IBinder;I)Lcom/android/internal/view/inline/IInlineContentProvider$Stub;
 PLcom/android/server/autofill/ui/InlineSuggestionFactory;->createInlineSuggestion(ZLandroid/service/autofill/Dataset;ILandroid/service/autofill/InlinePresentation;Lcom/android/server/autofill/ui/InlineSuggestionUi;Ljava/util/function/BiFunction;)Landroid/view/inputmethod/InlineSuggestion;
+PLcom/android/server/autofill/ui/InlineSuggestionFactory;->createInlineSuggestion(ZLandroid/service/autofill/Dataset;ILandroid/service/autofill/InlinePresentation;Ljava/util/function/BiConsumer;Lcom/android/server/autofill/RemoteInlineSuggestionRenderService;Ljava/lang/Runnable;Ljava/util/function/Consumer;Landroid/os/IBinder;I)Landroid/view/inputmethod/InlineSuggestion;
+PLcom/android/server/autofill/ui/InlineSuggestionFactory;->createInlineSuggestionUiCallback(Lcom/android/internal/view/inline/IInlineContentCallback;Ljava/lang/Runnable;Ljava/lang/Runnable;Ljava/util/function/Consumer;)Landroid/service/autofill/IInlineSuggestionUiCallback$Stub;
+PLcom/android/server/autofill/ui/InlineSuggestionFactory;->createInlineSuggestionsResponse(Landroid/view/inputmethod/InlineSuggestionsRequest;Landroid/service/autofill/FillResponse;Ljava/lang/String;Landroid/view/autofill/AutofillId;Lcom/android/server/autofill/ui/AutoFillUI$AutoFillUiCallback;Ljava/lang/Runnable;Lcom/android/server/autofill/RemoteInlineSuggestionRenderService;)Landroid/view/inputmethod/InlineSuggestionsResponse;
 PLcom/android/server/autofill/ui/InlineSuggestionFactory;->createInlineSuggestionsResponseInternal(ZLandroid/view/inputmethod/InlineSuggestionsRequest;Landroid/service/autofill/FillResponse;[Landroid/service/autofill/Dataset;Ljava/lang/String;Ljava/util/List;Landroid/view/autofill/AutofillId;Landroid/content/Context;Ljava/lang/Runnable;Ljava/util/function/BiConsumer;Lcom/android/server/autofill/RemoteInlineSuggestionRenderService;)Landroid/view/inputmethod/InlineSuggestionsResponse;
+HPLcom/android/server/autofill/ui/InlineSuggestionFactory;->createInlineSuggestionsResponseInternal(ZLandroid/view/inputmethod/InlineSuggestionsRequest;Ljava/util/List;Ljava/lang/String;Landroid/service/autofill/InlinePresentation;Landroid/view/autofill/AutofillId;Ljava/lang/Runnable;Ljava/util/function/BiConsumer;Ljava/util/function/Consumer;Lcom/android/server/autofill/RemoteInlineSuggestionRenderService;)Landroid/view/inputmethod/InlineSuggestionsResponse;
 PLcom/android/server/autofill/ui/InlineSuggestionFactory;->createInlineSuggestionsResponseInternal(ZLandroid/view/inputmethod/InlineSuggestionsRequest;[Landroid/service/autofill/Dataset;Ljava/util/List;Landroid/view/autofill/AutofillId;Landroid/content/Context;Ljava/lang/Runnable;Ljava/util/function/BiFunction;)Landroid/view/inputmethod/InlineSuggestionsResponse;
+HPLcom/android/server/autofill/ui/InlineSuggestionFactory;->includeDataset(Landroid/service/autofill/Dataset;ILjava/lang/String;)Z
 PLcom/android/server/autofill/ui/InlineSuggestionFactory;->lambda$createAugmentedInlineSuggestionsResponse$0(Lcom/android/server/autofill/ui/InlineSuggestionFactory$InlineSuggestionUiCallback;Landroid/service/autofill/Dataset;Landroid/view/View;)V
 PLcom/android/server/autofill/ui/InlineSuggestionFactory;->lambda$createAugmentedInlineSuggestionsResponse$1(Lcom/android/server/autofill/ui/InlineSuggestionFactory$InlineSuggestionUiCallback;Landroid/service/autofill/Dataset;Ljava/lang/Integer;)Landroid/view/View$OnClickListener;
+PLcom/android/server/autofill/ui/InlineSuggestionFactory;->lambda$createAugmentedInlineSuggestionsResponse$3(Lcom/android/server/autofill/ui/InlineSuggestionFactory$InlineSuggestionUiCallback;Landroid/service/autofill/Dataset;Ljava/lang/Integer;)V
+PLcom/android/server/autofill/ui/InlineSuggestionFactory;->lambda$createInlineSuggestion$5(Ljava/util/function/BiConsumer;Landroid/service/autofill/Dataset;I)V
+PLcom/android/server/autofill/ui/InlineSuggestionFactory;->lambda$createInlineSuggestionsResponse$1(Lcom/android/server/autofill/ui/AutoFillUI$AutoFillUiCallback;Landroid/view/autofill/AutofillId;Landroid/service/autofill/FillResponse;Landroid/service/autofill/Dataset;Ljava/lang/Integer;)V
 PLcom/android/server/autofill/ui/InlineSuggestionFactory;->mergedInlinePresentation(Landroid/view/inputmethod/InlineSuggestionsRequest;ILandroid/service/autofill/InlinePresentation;)Landroid/service/autofill/InlinePresentation;
 PLcom/android/server/autofill/ui/InlineSuggestionRoot;-><clinit>()V
 PLcom/android/server/autofill/ui/InlineSuggestionRoot;-><init>(Landroid/content/Context;Ljava/lang/Runnable;)V
@@ -11818,27 +12543,45 @@
 HPLcom/android/server/backup/UserBackupManagerService$4;-><init>(Lcom/android/server/backup/UserBackupManagerService;Ljava/lang/String;Ljava/util/HashSet;)V
 HPLcom/android/server/backup/UserBackupManagerService$4;->run()V
 PLcom/android/server/backup/UserBackupManagerService$BackupWakeLock;-><init>(Landroid/os/PowerManager$WakeLock;)V
+PLcom/android/server/backup/UserBackupManagerService$BackupWakeLock;-><init>(Landroid/os/PowerManager$WakeLock;I)V
 HPLcom/android/server/backup/UserBackupManagerService$BackupWakeLock;->access$000(Lcom/android/server/backup/UserBackupManagerService$BackupWakeLock;)Landroid/os/PowerManager$WakeLock;
+HPLcom/android/server/backup/UserBackupManagerService$BackupWakeLock;->access$100(Lcom/android/server/backup/UserBackupManagerService$BackupWakeLock;)Landroid/os/PowerManager$WakeLock;
 HPLcom/android/server/backup/UserBackupManagerService$BackupWakeLock;->acquire()V
 PLcom/android/server/backup/UserBackupManagerService$BackupWakeLock;->quit()V
 HPLcom/android/server/backup/UserBackupManagerService$BackupWakeLock;->release()V
 PLcom/android/server/backup/UserBackupManagerService;-><init>(ILandroid/content/Context;Lcom/android/server/backup/BackupManagerService;Landroid/os/HandlerThread;Ljava/io/File;Ljava/io/File;Lcom/android/server/backup/TransportManager;)V
+HPLcom/android/server/backup/UserBackupManagerService;->access$000(ILjava/lang/String;)Ljava/lang/String;
 HPLcom/android/server/backup/UserBackupManagerService;->access$100(Lcom/android/server/backup/UserBackupManagerService;)Ljava/lang/Object;
+PLcom/android/server/backup/UserBackupManagerService;->access$1000(Lcom/android/server/backup/UserBackupManagerService;)Landroid/content/pm/PackageManager;
 PLcom/android/server/backup/UserBackupManagerService;->access$1000(Lcom/android/server/backup/UserBackupManagerService;Ljava/lang/String;)V
 PLcom/android/server/backup/UserBackupManagerService;->access$1100(Lcom/android/server/backup/UserBackupManagerService;)V
+PLcom/android/server/backup/UserBackupManagerService;->access$1100(Lcom/android/server/backup/UserBackupManagerService;Ljava/lang/String;)V
 PLcom/android/server/backup/UserBackupManagerService;->access$1200(Lcom/android/server/backup/UserBackupManagerService;)Lcom/android/server/backup/TransportManager;
+PLcom/android/server/backup/UserBackupManagerService;->access$1200(Lcom/android/server/backup/UserBackupManagerService;)V
+HPLcom/android/server/backup/UserBackupManagerService;->access$1300(Lcom/android/server/backup/UserBackupManagerService;)Lcom/android/server/backup/TransportManager;
 PLcom/android/server/backup/UserBackupManagerService;->access$1300(Lcom/android/server/backup/UserBackupManagerService;)Lcom/android/server/backup/fullbackup/PerformFullTransportBackupTask;
+PLcom/android/server/backup/UserBackupManagerService;->access$1400(Lcom/android/server/backup/UserBackupManagerService;)Lcom/android/server/backup/fullbackup/PerformFullTransportBackupTask;
 HPLcom/android/server/backup/UserBackupManagerService;->access$1400(Lcom/android/server/backup/UserBackupManagerService;Ljava/lang/String;Ljava/util/HashSet;)V
+HPLcom/android/server/backup/UserBackupManagerService;->access$1500(Lcom/android/server/backup/UserBackupManagerService;Ljava/lang/String;Ljava/util/HashSet;)V
+HPLcom/android/server/backup/UserBackupManagerService;->access$200(Lcom/android/server/backup/UserBackupManagerService;)Ljava/lang/Object;
 HPLcom/android/server/backup/UserBackupManagerService;->access$200(Lcom/android/server/backup/UserBackupManagerService;)Ljava/util/ArrayList;
 HPLcom/android/server/backup/UserBackupManagerService;->access$300(Lcom/android/server/backup/UserBackupManagerService;)Ljava/io/File;
+HPLcom/android/server/backup/UserBackupManagerService;->access$300(Lcom/android/server/backup/UserBackupManagerService;)Ljava/util/ArrayList;
 PLcom/android/server/backup/UserBackupManagerService;->access$400(Lcom/android/server/backup/UserBackupManagerService;)Lcom/android/server/backup/internal/BackupHandler;
+HPLcom/android/server/backup/UserBackupManagerService;->access$400(Lcom/android/server/backup/UserBackupManagerService;)Ljava/io/File;
+PLcom/android/server/backup/UserBackupManagerService;->access$500(Lcom/android/server/backup/UserBackupManagerService;)I
 PLcom/android/server/backup/UserBackupManagerService;->access$500(Lcom/android/server/backup/UserBackupManagerService;)Landroid/util/SparseArray;
+HPLcom/android/server/backup/UserBackupManagerService;->access$600(Lcom/android/server/backup/UserBackupManagerService;)Lcom/android/server/backup/internal/BackupHandler;
 PLcom/android/server/backup/UserBackupManagerService;->access$600(Lcom/android/server/backup/UserBackupManagerService;[Ljava/lang/String;I)V
+PLcom/android/server/backup/UserBackupManagerService;->access$700(Lcom/android/server/backup/UserBackupManagerService;)Landroid/util/SparseArray;
 PLcom/android/server/backup/UserBackupManagerService;->access$700(Lcom/android/server/backup/UserBackupManagerService;[Ljava/lang/String;)V
 PLcom/android/server/backup/UserBackupManagerService;->access$800(Lcom/android/server/backup/UserBackupManagerService;)I
+PLcom/android/server/backup/UserBackupManagerService;->access$800(Lcom/android/server/backup/UserBackupManagerService;[Ljava/lang/String;I)V
 PLcom/android/server/backup/UserBackupManagerService;->access$900(Lcom/android/server/backup/UserBackupManagerService;)Landroid/content/pm/PackageManager;
+PLcom/android/server/backup/UserBackupManagerService;->access$900(Lcom/android/server/backup/UserBackupManagerService;[Ljava/lang/String;)V
 PLcom/android/server/backup/UserBackupManagerService;->addPackageParticipantsLocked([Ljava/lang/String;)V
 HPLcom/android/server/backup/UserBackupManagerService;->addPackageParticipantsLockedInner(Ljava/lang/String;Ljava/util/List;)V
+HPLcom/android/server/backup/UserBackupManagerService;->addUserIdToLogMessage(ILjava/lang/String;)Ljava/lang/String;
 HPLcom/android/server/backup/UserBackupManagerService;->agentConnected(Ljava/lang/String;Landroid/os/IBinder;)V
 PLcom/android/server/backup/UserBackupManagerService;->agentDisconnected(Ljava/lang/String;)V
 HPLcom/android/server/backup/UserBackupManagerService;->allAgentPackages()Ljava/util/List;
@@ -12276,7 +13019,7 @@
 HPLcom/android/server/backup/utils/AppBackupUtils;->appIsDisabled(Landroid/content/pm/ApplicationInfo;Landroid/content/pm/PackageManagerInternal;I)Z
 HPLcom/android/server/backup/utils/AppBackupUtils;->appIsEligibleForBackup(Landroid/content/pm/ApplicationInfo;I)Z
 HPLcom/android/server/backup/utils/AppBackupUtils;->appIsEligibleForBackup(Landroid/content/pm/ApplicationInfo;Landroid/content/pm/PackageManagerInternal;I)Z
-PLcom/android/server/backup/utils/AppBackupUtils;->appIsKeyValueOnly(Landroid/content/pm/PackageInfo;)Z
+HPLcom/android/server/backup/utils/AppBackupUtils;->appIsKeyValueOnly(Landroid/content/pm/PackageInfo;)Z
 HPLcom/android/server/backup/utils/AppBackupUtils;->appIsRunningAndEligibleForBackupWithTransport(Lcom/android/server/backup/transport/TransportClient;Ljava/lang/String;Landroid/content/pm/PackageManager;I)Z
 HPLcom/android/server/backup/utils/AppBackupUtils;->appIsStopped(Landroid/content/pm/ApplicationInfo;)Z
 PLcom/android/server/backup/utils/AppBackupUtils;->signaturesMatch([Landroid/content/pm/Signature;Landroid/content/pm/PackageInfo;Landroid/content/pm/PackageManagerInternal;)Z
@@ -12363,6 +13106,7 @@
 HPLcom/android/server/biometrics/AuthenticationClient;->isBiometricPrompt()Z
 HPLcom/android/server/biometrics/AuthenticationClient;->isCryptoOperation()Z
 HPLcom/android/server/biometrics/AuthenticationClient;->onAuthenticated(Landroid/hardware/biometrics/BiometricAuthenticator$Identifier;ZLjava/util/ArrayList;)Z
+PLcom/android/server/biometrics/AuthenticationClient;->onEnumerationResult(Landroid/hardware/biometrics/BiometricAuthenticator$Identifier;I)Z
 HPLcom/android/server/biometrics/AuthenticationClient;->onError(JII)Z
 HPLcom/android/server/biometrics/AuthenticationClient;->start()I
 HPLcom/android/server/biometrics/AuthenticationClient;->statsAction()I
@@ -12373,13 +13117,17 @@
 PLcom/android/server/biometrics/BiometricService$2;->onAcquired(ILjava/lang/String;)V
 PLcom/android/server/biometrics/BiometricService$2;->onAuthenticationFailed()V
 PLcom/android/server/biometrics/BiometricService$2;->onAuthenticationSucceeded(Z[B)V
+PLcom/android/server/biometrics/BiometricService$2;->onAuthenticationSucceeded(Z[BZ)V
 PLcom/android/server/biometrics/BiometricService$2;->onDeviceCredentialPressed()V
 PLcom/android/server/biometrics/BiometricService$2;->onDialogDismissed(I)V
+PLcom/android/server/biometrics/BiometricService$2;->onDialogDismissed(I[B)V
 PLcom/android/server/biometrics/BiometricService$2;->onError(IIII)V
+PLcom/android/server/biometrics/BiometricService$2;->onSystemEvent(I)V
 PLcom/android/server/biometrics/BiometricService$2;->onTryAgainPressed()V
 HSPLcom/android/server/biometrics/BiometricService$3;-><init>(Lcom/android/server/biometrics/BiometricService;)V
 PLcom/android/server/biometrics/BiometricService$3;->onUserSwitchComplete(I)V
 PLcom/android/server/biometrics/BiometricService$AuthSession;-><init>(Lcom/android/server/biometrics/BiometricService;Ljava/util/HashMap;Landroid/os/IBinder;JILandroid/hardware/biometrics/IBiometricServiceReceiver;Ljava/lang/String;Landroid/os/Bundle;IIIIZ)V
+PLcom/android/server/biometrics/BiometricService$AuthSession;->access$1702(Lcom/android/server/biometrics/BiometricService$AuthSession;J)J
 PLcom/android/server/biometrics/BiometricService$AuthSession;->access$1800(Lcom/android/server/biometrics/BiometricService$AuthSession;)J
 PLcom/android/server/biometrics/BiometricService$AuthSession;->access$1802(Lcom/android/server/biometrics/BiometricService$AuthSession;J)J
 PLcom/android/server/biometrics/BiometricService$AuthSession;->access$1900(Lcom/android/server/biometrics/BiometricService$AuthSession;)J
@@ -12389,6 +13137,7 @@
 PLcom/android/server/biometrics/BiometricService$AuthSession;->isCrypto()Z
 HSPLcom/android/server/biometrics/BiometricService$AuthenticatorWrapper;-><init>(IIILandroid/hardware/biometrics/IBiometricAuthenticator;)V
 PLcom/android/server/biometrics/BiometricService$AuthenticatorWrapper;->getActualStrength()I
+PLcom/android/server/biometrics/BiometricService$AuthenticatorWrapper;->toString()Ljava/lang/String;
 HSPLcom/android/server/biometrics/BiometricService$BiometricServiceWrapper;-><init>(Lcom/android/server/biometrics/BiometricService;)V
 HSPLcom/android/server/biometrics/BiometricService$BiometricServiceWrapper;-><init>(Lcom/android/server/biometrics/BiometricService;Lcom/android/server/biometrics/BiometricService$1;)V
 PLcom/android/server/biometrics/BiometricService$BiometricServiceWrapper;->authenticate(Landroid/os/IBinder;JILandroid/hardware/biometrics/IBiometricServiceReceiver;Ljava/lang/String;Landroid/os/Bundle;)V
@@ -12431,6 +13180,7 @@
 PLcom/android/server/biometrics/BiometricService;->access$100(Lcom/android/server/biometrics/BiometricService;)V
 PLcom/android/server/biometrics/BiometricService;->access$1000(Lcom/android/server/biometrics/BiometricService;)V
 HSPLcom/android/server/biometrics/BiometricService;->access$1100(Lcom/android/server/biometrics/BiometricService;)Ljava/util/List;
+PLcom/android/server/biometrics/BiometricService;->access$1200(Lcom/android/server/biometrics/BiometricService;)Ljava/util/List;
 HSPLcom/android/server/biometrics/BiometricService;->access$1200(Lcom/android/server/biometrics/BiometricService;)V
 PLcom/android/server/biometrics/BiometricService;->access$1300(Lcom/android/server/biometrics/BiometricService;)V
 PLcom/android/server/biometrics/BiometricService;->access$1300(Lcom/android/server/biometrics/BiometricService;ILandroid/os/Bundle;Ljava/lang/String;Z)Landroid/util/Pair;
@@ -12443,6 +13193,7 @@
 PLcom/android/server/biometrics/BiometricService;->access$200(Lcom/android/server/biometrics/BiometricService;IIII)V
 PLcom/android/server/biometrics/BiometricService;->access$300(Lcom/android/server/biometrics/BiometricService;ILjava/lang/String;)V
 PLcom/android/server/biometrics/BiometricService;->access$400(Lcom/android/server/biometrics/BiometricService;I)V
+PLcom/android/server/biometrics/BiometricService;->access$400(Lcom/android/server/biometrics/BiometricService;I[B)V
 PLcom/android/server/biometrics/BiometricService;->access$500(Lcom/android/server/biometrics/BiometricService;)V
 PLcom/android/server/biometrics/BiometricService;->access$600(Lcom/android/server/biometrics/BiometricService;IZI)V
 PLcom/android/server/biometrics/BiometricService;->access$700(Lcom/android/server/biometrics/BiometricService;Landroid/os/IBinder;JILandroid/hardware/biometrics/IBiometricServiceReceiver;Ljava/lang/String;Landroid/os/Bundle;III)V
@@ -12460,14 +13211,17 @@
 PLcom/android/server/biometrics/BiometricService;->handleAuthenticate(Landroid/os/IBinder;JILandroid/hardware/biometrics/IBiometricServiceReceiver;Ljava/lang/String;Landroid/os/Bundle;III)V
 PLcom/android/server/biometrics/BiometricService;->handleAuthenticationRejected()V
 PLcom/android/server/biometrics/BiometricService;->handleAuthenticationSucceeded(Z[B)V
+PLcom/android/server/biometrics/BiometricService;->handleAuthenticationSucceeded(Z[BZ)V
 PLcom/android/server/biometrics/BiometricService;->handleAuthenticationTimedOut(III)V
 PLcom/android/server/biometrics/BiometricService;->handleCancelAuthentication(Landroid/os/IBinder;Ljava/lang/String;)V
 PLcom/android/server/biometrics/BiometricService;->handleCancelAuthentication(Landroid/os/IBinder;Ljava/lang/String;III)V
 PLcom/android/server/biometrics/BiometricService;->handleOnAcquired(ILjava/lang/String;)V
 PLcom/android/server/biometrics/BiometricService;->handleOnDeviceCredentialPressed()V
 PLcom/android/server/biometrics/BiometricService;->handleOnDismissed(I)V
+PLcom/android/server/biometrics/BiometricService;->handleOnDismissed(I[B)V
 PLcom/android/server/biometrics/BiometricService;->handleOnError(IIII)V
 HPLcom/android/server/biometrics/BiometricService;->handleOnReadyForAuthentication(IZI)V
+PLcom/android/server/biometrics/BiometricService;->handleOnSystemEvent(I)V
 PLcom/android/server/biometrics/BiometricService;->handleOnTryAgainPressed()V
 HPLcom/android/server/biometrics/BiometricService;->isBiometricDisabledByDevicePolicy(II)Z
 HPLcom/android/server/biometrics/BiometricService;->isEnabledForApp(II)Z
@@ -12478,9 +13232,12 @@
 HSPLcom/android/server/biometrics/BiometricService;->onStart()V
 PLcom/android/server/biometrics/BiometricService;->statsModality()I
 HSPLcom/android/server/biometrics/BiometricServiceBase$1;-><init>(Lcom/android/server/biometrics/BiometricServiceBase;)V
+PLcom/android/server/biometrics/BiometricServiceBase$1;-><init>(Lcom/android/server/biometrics/BiometricServiceBase;Landroid/os/Looper;)V
 HPLcom/android/server/biometrics/BiometricServiceBase$1;->run()V
 HSPLcom/android/server/biometrics/BiometricServiceBase$2;-><init>(Lcom/android/server/biometrics/BiometricServiceBase;)V
 PLcom/android/server/biometrics/BiometricServiceBase$2;->onUserSwitching(I)V
+HPLcom/android/server/biometrics/BiometricServiceBase$2;->run()V
+PLcom/android/server/biometrics/BiometricServiceBase$3;-><init>(Lcom/android/server/biometrics/BiometricServiceBase;)V
 HPLcom/android/server/biometrics/BiometricServiceBase$AuthenticationClientImpl;-><init>(Lcom/android/server/biometrics/BiometricServiceBase;Landroid/content/Context;Lcom/android/server/biometrics/BiometricServiceBase$DaemonWrapper;JLandroid/os/IBinder;Lcom/android/server/biometrics/BiometricServiceBase$ServiceListener;IIJZLjava/lang/String;IZ)V
 HPLcom/android/server/biometrics/BiometricServiceBase$AuthenticationClientImpl;-><init>(Lcom/android/server/biometrics/BiometricServiceBase;Landroid/content/Context;Lcom/android/server/biometrics/BiometricServiceBase$DaemonWrapper;JLandroid/os/IBinder;Lcom/android/server/biometrics/BiometricServiceBase$ServiceListener;IIJZLjava/lang/String;IZLandroid/hardware/biometrics/IBiometricNativeHandle;)V
 PLcom/android/server/biometrics/BiometricServiceBase$AuthenticationClientImpl;->handleFailedAttempt()I
@@ -12492,6 +13249,7 @@
 PLcom/android/server/biometrics/BiometricServiceBase$BiometricServiceListener;->getWrapperReceiver()Landroid/hardware/biometrics/IBiometricServiceReceiverInternal;
 PLcom/android/server/biometrics/BiometricServiceBase$BiometricServiceListener;->onAuthenticationFailedInternal()V
 PLcom/android/server/biometrics/BiometricServiceBase$BiometricServiceListener;->onAuthenticationSucceededInternal(Z[B)V
+PLcom/android/server/biometrics/BiometricServiceBase$BiometricServiceListener;->onAuthenticationSucceededInternal(Z[BZ)V
 HSPLcom/android/server/biometrics/BiometricServiceBase$BiometricTaskStackListener;-><init>(Lcom/android/server/biometrics/BiometricServiceBase;)V
 HSPLcom/android/server/biometrics/BiometricServiceBase$BiometricTaskStackListener;-><init>(Lcom/android/server/biometrics/BiometricServiceBase;Lcom/android/server/biometrics/BiometricServiceBase$1;)V
 HPLcom/android/server/biometrics/BiometricServiceBase$BiometricTaskStackListener;->onTaskStackChanged()V
@@ -12504,11 +13262,13 @@
 HSPLcom/android/server/biometrics/BiometricServiceBase$InternalEnumerateClient;->getUnknownHALTemplates()Ljava/util/List;
 HSPLcom/android/server/biometrics/BiometricServiceBase$InternalEnumerateClient;->handleEnumeratedTemplate(Landroid/hardware/biometrics/BiometricAuthenticator$Identifier;)V
 HSPLcom/android/server/biometrics/BiometricServiceBase$InternalEnumerateClient;->onEnumerationResult(Landroid/hardware/biometrics/BiometricAuthenticator$Identifier;I)Z
+PLcom/android/server/biometrics/BiometricServiceBase$InternalEnumerateClient;->statsModality()I
 HSPLcom/android/server/biometrics/BiometricServiceBase$LockoutResetMonitor$1;-><init>(Lcom/android/server/biometrics/BiometricServiceBase$LockoutResetMonitor;)V
 HSPLcom/android/server/biometrics/BiometricServiceBase$LockoutResetMonitor$1;->sendResult(Landroid/os/Bundle;)V
 HSPLcom/android/server/biometrics/BiometricServiceBase$LockoutResetMonitor$2;-><init>(Lcom/android/server/biometrics/BiometricServiceBase$LockoutResetMonitor;)V
 PLcom/android/server/biometrics/BiometricServiceBase$LockoutResetMonitor$2;->run()V
 HSPLcom/android/server/biometrics/BiometricServiceBase$LockoutResetMonitor;-><init>(Lcom/android/server/biometrics/BiometricServiceBase;Landroid/hardware/biometrics/IBiometricServiceLockoutResetCallback;)V
+PLcom/android/server/biometrics/BiometricServiceBase$LockoutResetMonitor;->access$1100(Lcom/android/server/biometrics/BiometricServiceBase$LockoutResetMonitor;)V
 HSPLcom/android/server/biometrics/BiometricServiceBase$LockoutResetMonitor;->access$1200(Lcom/android/server/biometrics/BiometricServiceBase$LockoutResetMonitor;)V
 PLcom/android/server/biometrics/BiometricServiceBase$LockoutResetMonitor;->binderDied()V
 HSPLcom/android/server/biometrics/BiometricServiceBase$LockoutResetMonitor;->releaseWakelock()V
@@ -12518,6 +13278,7 @@
 HSPLcom/android/server/biometrics/BiometricServiceBase$ResetClientStateRunnable;-><init>(Lcom/android/server/biometrics/BiometricServiceBase;Lcom/android/server/biometrics/BiometricServiceBase$1;)V
 PLcom/android/server/biometrics/BiometricServiceBase$ResetClientStateRunnable;->run()V
 HSPLcom/android/server/biometrics/BiometricServiceBase;-><init>(Landroid/content/Context;)V
+PLcom/android/server/biometrics/BiometricServiceBase;->access$1000(Lcom/android/server/biometrics/BiometricServiceBase;)Landroid/os/PowerManager;
 PLcom/android/server/biometrics/BiometricServiceBase;->access$1000(Lcom/android/server/biometrics/BiometricServiceBase;Lcom/android/server/biometrics/ClientMonitor;Z)V
 HSPLcom/android/server/biometrics/BiometricServiceBase;->access$1100(Lcom/android/server/biometrics/BiometricServiceBase;)Landroid/os/PowerManager;
 PLcom/android/server/biometrics/BiometricServiceBase;->access$1300(Lcom/android/server/biometrics/BiometricServiceBase;Lcom/android/server/biometrics/BiometricServiceBase$LockoutResetMonitor;)V
@@ -12635,6 +13396,7 @@
 PLcom/android/server/biometrics/EnrollClient;->statsAction()I
 HSPLcom/android/server/biometrics/EnumerateClient;-><init>(Landroid/content/Context;Lcom/android/server/biometrics/Constants;Lcom/android/server/biometrics/BiometricServiceBase$DaemonWrapper;JLandroid/os/IBinder;Lcom/android/server/biometrics/BiometricServiceBase$ServiceListener;IIZLjava/lang/String;)V
 HSPLcom/android/server/biometrics/EnumerateClient;->start()I
+PLcom/android/server/biometrics/EnumerateClient;->statsAction()I
 HSPLcom/android/server/biometrics/LoggableMonitor;-><init>()V
 PLcom/android/server/biometrics/LoggableMonitor;->isCryptoOperation()Z
 HPLcom/android/server/biometrics/LoggableMonitor;->logOnAcquired(Landroid/content/Context;III)V
@@ -12682,6 +13444,8 @@
 HSPLcom/android/server/biometrics/face/-$$Lambda$FaceService$A0dfsVDvPu3BDJsON7widXUriSs;->run()V
 PLcom/android/server/biometrics/face/-$$Lambda$FaceService$FaceServiceWrapper$1ZJGnsaJl1du-I_XjU-JKzIy49Q;-><init>(Lcom/android/server/biometrics/face/FaceService$FaceServiceWrapper;ILjava/lang/String;I[BZLandroid/hardware/face/IFaceServiceReceiver;)V
 PLcom/android/server/biometrics/face/-$$Lambda$FaceService$FaceServiceWrapper$1ZJGnsaJl1du-I_XjU-JKzIy49Q;->run()V
+PLcom/android/server/biometrics/face/-$$Lambda$FaceService$FaceServiceWrapper$5-DVpuuVhqRzgDHE04euadFgDpM;-><init>(Lcom/android/server/biometrics/face/FaceService$FaceServiceWrapper;[B)V
+PLcom/android/server/biometrics/face/-$$Lambda$FaceService$FaceServiceWrapper$5-DVpuuVhqRzgDHE04euadFgDpM;->run()V
 PLcom/android/server/biometrics/face/-$$Lambda$FaceService$FaceServiceWrapper$6Efp5LtXdV1OgyOr4AaGf19hmLs;-><init>(Lcom/android/server/biometrics/face/FaceService$FaceServiceWrapper;ILjava/lang/String;ILandroid/hardware/face/IFaceServiceReceiver;)V
 PLcom/android/server/biometrics/face/-$$Lambda$FaceService$FaceServiceWrapper$6Efp5LtXdV1OgyOr4AaGf19hmLs;->run()V
 PLcom/android/server/biometrics/face/-$$Lambda$FaceService$FaceServiceWrapper$kw0BBGgTrFveHiSJWRbNG8sygqA;-><init>(Lcom/android/server/biometrics/face/FaceService$FaceServiceWrapper;[B)V
@@ -12692,6 +13456,7 @@
 HSPLcom/android/server/biometrics/face/-$$Lambda$FaceService$rveb67MoYJ0egfY6LL-l05KvUz8;->run()V
 HSPLcom/android/server/biometrics/face/FaceAuthenticator;-><init>(Landroid/hardware/face/IFaceService;)V
 PLcom/android/server/biometrics/face/FaceAuthenticator;->cancelAuthenticationFromService(Landroid/os/IBinder;Ljava/lang/String;IIIZ)V
+PLcom/android/server/biometrics/face/FaceAuthenticator;->getAuthenticatorId()J
 PLcom/android/server/biometrics/face/FaceAuthenticator;->hasEnrolledTemplates(ILjava/lang/String;)Z
 PLcom/android/server/biometrics/face/FaceAuthenticator;->isHardwareDetected(Ljava/lang/String;)Z
 PLcom/android/server/biometrics/face/FaceAuthenticator;->prepareForAuthentication(ZLandroid/os/IBinder;JILandroid/hardware/biometrics/IBiometricServiceReceiverInternal;Ljava/lang/String;IIII)V
@@ -12699,10 +13464,11 @@
 PLcom/android/server/biometrics/face/FaceAuthenticator;->setActiveUser(I)V
 PLcom/android/server/biometrics/face/FaceAuthenticator;->startPreparedClient(I)V
 HSPLcom/android/server/biometrics/face/FaceConstants;-><init>()V
-PLcom/android/server/biometrics/face/FaceConstants;->acquireVendorCode()I
+HPLcom/android/server/biometrics/face/FaceConstants;->acquireVendorCode()I
 PLcom/android/server/biometrics/face/FaceConstants;->actionBiometricAuth()I
 PLcom/android/server/biometrics/face/FaceConstants;->actionBiometricEnroll()I
 HPLcom/android/server/biometrics/face/FaceConstants;->logTag()Ljava/lang/String;
+PLcom/android/server/biometrics/face/FaceConstants;->tagAuthStartError()Ljava/lang/String;
 PLcom/android/server/biometrics/face/FaceConstants;->tagAuthToken()Ljava/lang/String;
 PLcom/android/server/biometrics/face/FaceConstants;->tagHalDied()Ljava/lang/String;
 HSPLcom/android/server/biometrics/face/FaceService$1;-><init>(Lcom/android/server/biometrics/face/FaceService;)V
@@ -12720,7 +13486,7 @@
 HSPLcom/android/server/biometrics/face/FaceService$1;->onLockoutChanged(J)V
 HSPLcom/android/server/biometrics/face/FaceService$2;-><init>(Lcom/android/server/biometrics/face/FaceService;)V
 PLcom/android/server/biometrics/face/FaceService$2;->authenticate(JI)I
-PLcom/android/server/biometrics/face/FaceService$2;->authenticate(JILandroid/os/NativeHandle;)I
+HPLcom/android/server/biometrics/face/FaceService$2;->authenticate(JILandroid/os/NativeHandle;)I
 PLcom/android/server/biometrics/face/FaceService$2;->cancel()I
 PLcom/android/server/biometrics/face/FaceService$2;->enroll([BIILjava/util/ArrayList;)I
 HSPLcom/android/server/biometrics/face/FaceService$2;->enumerate()I
@@ -12738,6 +13504,7 @@
 HPLcom/android/server/biometrics/face/FaceService$FaceAuthClient;-><init>(Lcom/android/server/biometrics/face/FaceService;Landroid/content/Context;Lcom/android/server/biometrics/BiometricServiceBase$DaemonWrapper;JLandroid/os/IBinder;Lcom/android/server/biometrics/BiometricServiceBase$ServiceListener;IIJZLjava/lang/String;IZ)V
 PLcom/android/server/biometrics/face/FaceService$FaceAuthClient;-><init>(Lcom/android/server/biometrics/face/FaceService;Landroid/content/Context;Lcom/android/server/biometrics/BiometricServiceBase$DaemonWrapper;JLandroid/os/IBinder;Lcom/android/server/biometrics/BiometricServiceBase$ServiceListener;IIJZLjava/lang/String;IZLandroid/hardware/biometrics/IBiometricNativeHandle;)V
 HPLcom/android/server/biometrics/face/FaceService$FaceAuthClient;->getAcquireIgnorelist()[I
+PLcom/android/server/biometrics/face/FaceService$FaceAuthClient;->isStrongBiometric()Z
 HPLcom/android/server/biometrics/face/FaceService$FaceAuthClient;->onAcquired(II)Z
 HPLcom/android/server/biometrics/face/FaceService$FaceAuthClient;->onAuthenticated(Landroid/hardware/biometrics/BiometricAuthenticator$Identifier;ZLjava/util/ArrayList;)Z
 HPLcom/android/server/biometrics/face/FaceService$FaceAuthClient;->onError(JII)Z
@@ -12760,6 +13527,7 @@
 PLcom/android/server/biometrics/face/FaceService$FaceServiceWrapper;->dump(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V
 PLcom/android/server/biometrics/face/FaceService$FaceServiceWrapper;->enroll(ILandroid/os/IBinder;[BLandroid/hardware/face/IFaceServiceReceiver;Ljava/lang/String;[I)V
 PLcom/android/server/biometrics/face/FaceService$FaceServiceWrapper;->generateChallenge(Landroid/os/IBinder;)J
+PLcom/android/server/biometrics/face/FaceService$FaceServiceWrapper;->getAuthenticatorId()J
 HPLcom/android/server/biometrics/face/FaceService$FaceServiceWrapper;->getAuthenticatorId(Ljava/lang/String;)J
 HPLcom/android/server/biometrics/face/FaceService$FaceServiceWrapper;->getEnrolledFaces(ILjava/lang/String;)Ljava/util/List;
 PLcom/android/server/biometrics/face/FaceService$FaceServiceWrapper;->getFeature(IILandroid/hardware/face/IFaceServiceReceiver;Ljava/lang/String;)V
@@ -12769,6 +13537,7 @@
 HSPLcom/android/server/biometrics/face/FaceService$FaceServiceWrapper;->isHardwareDetected(Ljava/lang/String;)Z
 PLcom/android/server/biometrics/face/FaceService$FaceServiceWrapper;->lambda$getFeature$3$FaceService$FaceServiceWrapper(ILjava/lang/String;ILandroid/hardware/face/IFaceServiceReceiver;)V
 PLcom/android/server/biometrics/face/FaceService$FaceServiceWrapper;->lambda$resetLockout$1$FaceService$FaceServiceWrapper([B)V
+PLcom/android/server/biometrics/face/FaceService$FaceServiceWrapper;->lambda$resetLockout$2$FaceService$FaceServiceWrapper([B)V
 PLcom/android/server/biometrics/face/FaceService$FaceServiceWrapper;->lambda$revokeChallenge$0$FaceService$FaceServiceWrapper(Landroid/os/IBinder;)V
 PLcom/android/server/biometrics/face/FaceService$FaceServiceWrapper;->lambda$setFeature$2$FaceService$FaceServiceWrapper(ILjava/lang/String;I[BZLandroid/hardware/face/IFaceServiceReceiver;)V
 PLcom/android/server/biometrics/face/FaceService$FaceServiceWrapper;->prepareForAuthentication(ZLandroid/os/IBinder;JILandroid/hardware/biometrics/IBiometricServiceReceiverInternal;Ljava/lang/String;IIII)V
@@ -12790,18 +13559,30 @@
 HPLcom/android/server/biometrics/face/FaceService$UsageStats;->print(Ljava/io/PrintWriter;)V
 HSPLcom/android/server/biometrics/face/FaceService;-><init>(Landroid/content/Context;)V
 PLcom/android/server/biometrics/face/FaceService;->access$1000(Lcom/android/server/biometrics/face/FaceService;Landroid/os/IBinder;)J
+PLcom/android/server/biometrics/face/FaceService;->access$1000(Lcom/android/server/biometrics/face/FaceService;Ljava/lang/String;)V
 HPLcom/android/server/biometrics/face/FaceService;->access$10001(Lcom/android/server/biometrics/face/FaceService;JII)V
 PLcom/android/server/biometrics/face/FaceService;->access$10001(Lcom/android/server/biometrics/face/FaceService;Landroid/hardware/biometrics/BiometricAuthenticator$Identifier;Ljava/util/ArrayList;)V
 PLcom/android/server/biometrics/face/FaceService;->access$10101(Lcom/android/server/biometrics/face/FaceService;JII)V
 PLcom/android/server/biometrics/face/FaceService;->access$10101(Lcom/android/server/biometrics/face/FaceService;Landroid/hardware/biometrics/BiometricAuthenticator$Identifier;I)V
 PLcom/android/server/biometrics/face/FaceService;->access$10200(Lcom/android/server/biometrics/face/FaceService;)Ljava/util/Map;
+PLcom/android/server/biometrics/face/FaceService;->access$10201(Lcom/android/server/biometrics/face/FaceService;JII)V
+PLcom/android/server/biometrics/face/FaceService;->access$10301(Lcom/android/server/biometrics/face/FaceService;Landroid/hardware/biometrics/BiometricAuthenticator$Identifier;Ljava/util/ArrayList;)V
+PLcom/android/server/biometrics/face/FaceService;->access$10401(Lcom/android/server/biometrics/face/FaceService;JII)V
+PLcom/android/server/biometrics/face/FaceService;->access$10401(Lcom/android/server/biometrics/face/FaceService;Landroid/hardware/biometrics/BiometricAuthenticator$Identifier;Ljava/util/ArrayList;)V
+PLcom/android/server/biometrics/face/FaceService;->access$10501(Lcom/android/server/biometrics/face/FaceService;JII)V
+PLcom/android/server/biometrics/face/FaceService;->access$10601(Lcom/android/server/biometrics/face/FaceService;JII)V
+PLcom/android/server/biometrics/face/FaceService;->access$1100(Lcom/android/server/biometrics/face/FaceService;Landroid/os/IBinder;)J
 PLcom/android/server/biometrics/face/FaceService;->access$1100(Lcom/android/server/biometrics/face/FaceService;Ljava/lang/String;)V
 PLcom/android/server/biometrics/face/FaceService;->access$1200(Lcom/android/server/biometrics/face/FaceService;)Lcom/android/server/biometrics/BiometricServiceBase$H;
+PLcom/android/server/biometrics/face/FaceService;->access$1200(Lcom/android/server/biometrics/face/FaceService;Ljava/lang/String;)V
+PLcom/android/server/biometrics/face/FaceService;->access$1300(Lcom/android/server/biometrics/face/FaceService;)Lcom/android/server/biometrics/BiometricServiceBase$H;
 PLcom/android/server/biometrics/face/FaceService;->access$1300(Lcom/android/server/biometrics/face/FaceService;Ljava/lang/String;)V
 PLcom/android/server/biometrics/face/FaceService;->access$1400(Lcom/android/server/biometrics/face/FaceService;)Z
 PLcom/android/server/biometrics/face/FaceService;->access$1500(Lcom/android/server/biometrics/face/FaceService;)Lcom/android/server/biometrics/BiometricServiceBase$DaemonWrapper;
 PLcom/android/server/biometrics/face/FaceService;->access$1600(Lcom/android/server/biometrics/face/FaceService;)J
+PLcom/android/server/biometrics/face/FaceService;->access$1600(Lcom/android/server/biometrics/face/FaceService;)Lcom/android/server/biometrics/BiometricServiceBase$DaemonWrapper;
 PLcom/android/server/biometrics/face/FaceService;->access$1700(Lcom/android/server/biometrics/face/FaceService;)I
+PLcom/android/server/biometrics/face/FaceService;->access$1700(Lcom/android/server/biometrics/face/FaceService;)Lcom/android/server/biometrics/BiometricServiceBase$DaemonWrapper;
 PLcom/android/server/biometrics/face/FaceService;->access$1800(Lcom/android/server/biometrics/face/FaceService;)[I
 PLcom/android/server/biometrics/face/FaceService;->access$1900(Lcom/android/server/biometrics/face/FaceService;)[I
 PLcom/android/server/biometrics/face/FaceService;->access$2000(Lcom/android/server/biometrics/face/FaceService;)I
@@ -12813,14 +13594,20 @@
 HPLcom/android/server/biometrics/face/FaceService;->access$2500(Lcom/android/server/biometrics/face/FaceService;Ljava/lang/String;)V
 PLcom/android/server/biometrics/face/FaceService;->access$2600(Lcom/android/server/biometrics/face/FaceService;)J
 PLcom/android/server/biometrics/face/FaceService;->access$2600(Lcom/android/server/biometrics/face/FaceService;)Z
+PLcom/android/server/biometrics/face/FaceService;->access$2600(Lcom/android/server/biometrics/face/FaceService;Ljava/lang/String;)V
 PLcom/android/server/biometrics/face/FaceService;->access$2700(Lcom/android/server/biometrics/face/FaceService;)I
 PLcom/android/server/biometrics/face/FaceService;->access$2700(Lcom/android/server/biometrics/face/FaceService;)J
+PLcom/android/server/biometrics/face/FaceService;->access$2700(Lcom/android/server/biometrics/face/FaceService;)Z
 PLcom/android/server/biometrics/face/FaceService;->access$2800(Lcom/android/server/biometrics/face/FaceService;)I
+PLcom/android/server/biometrics/face/FaceService;->access$2800(Lcom/android/server/biometrics/face/FaceService;)J
 HPLcom/android/server/biometrics/face/FaceService;->access$2800(Lcom/android/server/biometrics/face/FaceService;Lcom/android/server/biometrics/BiometricServiceBase$AuthenticationClientImpl;JLjava/lang/String;)V
+PLcom/android/server/biometrics/face/FaceService;->access$2900(Lcom/android/server/biometrics/face/FaceService;)I
 PLcom/android/server/biometrics/face/FaceService;->access$2900(Lcom/android/server/biometrics/face/FaceService;Lcom/android/server/biometrics/BiometricServiceBase$AuthenticationClientImpl;JLjava/lang/String;)V
 PLcom/android/server/biometrics/face/FaceService;->access$2900(Lcom/android/server/biometrics/face/FaceService;Ljava/lang/String;)V
 PLcom/android/server/biometrics/face/FaceService;->access$300(Lcom/android/server/biometrics/face/FaceService;)Lcom/android/server/biometrics/face/FaceService$UsageStats;
+PLcom/android/server/biometrics/face/FaceService;->access$300(Lcom/android/server/biometrics/face/FaceService;)Z
 PLcom/android/server/biometrics/face/FaceService;->access$3000(Lcom/android/server/biometrics/face/FaceService;)J
+PLcom/android/server/biometrics/face/FaceService;->access$3000(Lcom/android/server/biometrics/face/FaceService;Lcom/android/server/biometrics/BiometricServiceBase$AuthenticationClientImpl;JLjava/lang/String;)V
 PLcom/android/server/biometrics/face/FaceService;->access$3000(Lcom/android/server/biometrics/face/FaceService;Ljava/lang/String;)V
 PLcom/android/server/biometrics/face/FaceService;->access$3100(Lcom/android/server/biometrics/face/FaceService;)I
 PLcom/android/server/biometrics/face/FaceService;->access$3100(Lcom/android/server/biometrics/face/FaceService;)J
@@ -12836,10 +13623,12 @@
 HPLcom/android/server/biometrics/face/FaceService;->access$3600(Lcom/android/server/biometrics/face/FaceService;Ljava/lang/String;)V
 HPLcom/android/server/biometrics/face/FaceService;->access$3700(Lcom/android/server/biometrics/face/FaceService;Landroid/os/IBinder;Ljava/lang/String;)V
 PLcom/android/server/biometrics/face/FaceService;->access$3700(Lcom/android/server/biometrics/face/FaceService;Ljava/lang/String;)V
+PLcom/android/server/biometrics/face/FaceService;->access$3800(Lcom/android/server/biometrics/face/FaceService;Landroid/os/IBinder;Ljava/lang/String;)V
 PLcom/android/server/biometrics/face/FaceService;->access$3800(Lcom/android/server/biometrics/face/FaceService;Landroid/os/IBinder;Ljava/lang/String;IIIZ)V
 PLcom/android/server/biometrics/face/FaceService;->access$3800(Lcom/android/server/biometrics/face/FaceService;Ljava/lang/String;)V
 PLcom/android/server/biometrics/face/FaceService;->access$3900(Lcom/android/server/biometrics/face/FaceService;Landroid/os/IBinder;Ljava/lang/String;IIIZ)V
 PLcom/android/server/biometrics/face/FaceService;->access$3900(Lcom/android/server/biometrics/face/FaceService;Ljava/lang/String;)V
+PLcom/android/server/biometrics/face/FaceService;->access$400(Lcom/android/server/biometrics/face/FaceService;)Lcom/android/server/biometrics/face/FaceService$UsageStats;
 PLcom/android/server/biometrics/face/FaceService;->access$400(Lcom/android/server/biometrics/face/FaceService;)[I
 PLcom/android/server/biometrics/face/FaceService;->access$4000(Lcom/android/server/biometrics/face/FaceService;I)V
 PLcom/android/server/biometrics/face/FaceService;->access$4000(Lcom/android/server/biometrics/face/FaceService;Ljava/lang/String;)V
@@ -12853,17 +13642,24 @@
 HSPLcom/android/server/biometrics/face/FaceService;->access$5000(Lcom/android/server/biometrics/face/FaceService;Ljava/lang/String;)V
 HSPLcom/android/server/biometrics/face/FaceService;->access$5001(Lcom/android/server/biometrics/face/FaceService;Landroid/hardware/biometrics/IBiometricServiceLockoutResetCallback;)V
 PLcom/android/server/biometrics/face/FaceService;->access$5100(Lcom/android/server/biometrics/face/FaceService;Ljava/io/FileDescriptor;[Ljava/lang/String;)V
+PLcom/android/server/biometrics/face/FaceService;->access$5100(Lcom/android/server/biometrics/face/FaceService;Ljava/lang/String;)V
 HSPLcom/android/server/biometrics/face/FaceService;->access$5101(Lcom/android/server/biometrics/face/FaceService;Landroid/hardware/biometrics/IBiometricServiceLockoutResetCallback;)V
 PLcom/android/server/biometrics/face/FaceService;->access$5200(Lcom/android/server/biometrics/face/FaceService;Ljava/io/PrintWriter;)V
+PLcom/android/server/biometrics/face/FaceService;->access$5201(Lcom/android/server/biometrics/face/FaceService;Landroid/hardware/biometrics/IBiometricServiceLockoutResetCallback;)V
 PLcom/android/server/biometrics/face/FaceService;->access$5300(Lcom/android/server/biometrics/face/FaceService;Ljava/io/PrintWriter;)V
 HSPLcom/android/server/biometrics/face/FaceService;->access$5300(Lcom/android/server/biometrics/face/FaceService;Ljava/lang/String;)V
 HSPLcom/android/server/biometrics/face/FaceService;->access$5400(Lcom/android/server/biometrics/face/FaceService;Ljava/lang/String;)V
 HSPLcom/android/server/biometrics/face/FaceService;->access$5400(Lcom/android/server/biometrics/face/FaceService;Ljava/lang/String;ZIII)Z
 HSPLcom/android/server/biometrics/face/FaceService;->access$5500(Lcom/android/server/biometrics/face/FaceService;)Landroid/hardware/biometrics/face/V1_0/IBiometricsFace;
+PLcom/android/server/biometrics/face/FaceService;->access$5500(Lcom/android/server/biometrics/face/FaceService;Ljava/lang/String;)V
 HSPLcom/android/server/biometrics/face/FaceService;->access$5500(Lcom/android/server/biometrics/face/FaceService;Ljava/lang/String;ZIII)Z
 HSPLcom/android/server/biometrics/face/FaceService;->access$5600(Lcom/android/server/biometrics/face/FaceService;)J
 HSPLcom/android/server/biometrics/face/FaceService;->access$5600(Lcom/android/server/biometrics/face/FaceService;)Landroid/hardware/biometrics/face/V1_0/IBiometricsFace;
+PLcom/android/server/biometrics/face/FaceService;->access$5600(Lcom/android/server/biometrics/face/FaceService;Ljava/lang/String;ZIII)Z
 HSPLcom/android/server/biometrics/face/FaceService;->access$5700(Lcom/android/server/biometrics/face/FaceService;)J
+PLcom/android/server/biometrics/face/FaceService;->access$5700(Lcom/android/server/biometrics/face/FaceService;)Landroid/hardware/biometrics/face/V1_0/IBiometricsFace;
+PLcom/android/server/biometrics/face/FaceService;->access$5800(Lcom/android/server/biometrics/face/FaceService;)J
+PLcom/android/server/biometrics/face/FaceService;->access$600(Lcom/android/server/biometrics/face/FaceService;)[I
 PLcom/android/server/biometrics/face/FaceService;->access$6100(Lcom/android/server/biometrics/face/FaceService;Ljava/lang/String;)V
 PLcom/android/server/biometrics/face/FaceService;->access$6200(Lcom/android/server/biometrics/face/FaceService;Ljava/lang/String;)V
 PLcom/android/server/biometrics/face/FaceService;->access$6200(Lcom/android/server/biometrics/face/FaceService;Ljava/lang/String;ZIII)Z
@@ -12872,11 +13668,16 @@
 HSPLcom/android/server/biometrics/face/FaceService;->access$6400(Lcom/android/server/biometrics/face/FaceService;Ljava/lang/String;)V
 HSPLcom/android/server/biometrics/face/FaceService;->access$6400(Lcom/android/server/biometrics/face/FaceService;Ljava/lang/String;ZIII)Z
 HPLcom/android/server/biometrics/face/FaceService;->access$6500(Lcom/android/server/biometrics/face/FaceService;Ljava/lang/String;)J
+PLcom/android/server/biometrics/face/FaceService;->access$6500(Lcom/android/server/biometrics/face/FaceService;Ljava/lang/String;)V
 HSPLcom/android/server/biometrics/face/FaceService;->access$6500(Lcom/android/server/biometrics/face/FaceService;Ljava/lang/String;ZIII)Z
+PLcom/android/server/biometrics/face/FaceService;->access$6600(Lcom/android/server/biometrics/face/FaceService;)J
 PLcom/android/server/biometrics/face/FaceService;->access$6600(Lcom/android/server/biometrics/face/FaceService;Ljava/lang/String;)J
 PLcom/android/server/biometrics/face/FaceService;->access$6600(Lcom/android/server/biometrics/face/FaceService;Ljava/lang/String;)V
+PLcom/android/server/biometrics/face/FaceService;->access$6600(Lcom/android/server/biometrics/face/FaceService;Ljava/lang/String;ZIII)Z
+PLcom/android/server/biometrics/face/FaceService;->access$6700(Lcom/android/server/biometrics/face/FaceService;)J
 PLcom/android/server/biometrics/face/FaceService;->access$6700(Lcom/android/server/biometrics/face/FaceService;)Lcom/android/server/biometrics/BiometricServiceBase$H;
 PLcom/android/server/biometrics/face/FaceService;->access$6700(Lcom/android/server/biometrics/face/FaceService;Ljava/lang/String;)V
+PLcom/android/server/biometrics/face/FaceService;->access$6800(Lcom/android/server/biometrics/face/FaceService;)J
 PLcom/android/server/biometrics/face/FaceService;->access$6800(Lcom/android/server/biometrics/face/FaceService;)Lcom/android/server/biometrics/BiometricServiceBase$H;
 PLcom/android/server/biometrics/face/FaceService;->access$6800(Lcom/android/server/biometrics/face/FaceService;Ljava/lang/String;)V
 PLcom/android/server/biometrics/face/FaceService;->access$6900(Lcom/android/server/biometrics/face/FaceService;)Lcom/android/server/biometrics/BiometricServiceBase$H;
@@ -12889,24 +13690,38 @@
 PLcom/android/server/biometrics/face/FaceService;->access$7400(Lcom/android/server/biometrics/face/FaceService;)I
 PLcom/android/server/biometrics/face/FaceService;->access$7400(Lcom/android/server/biometrics/face/FaceService;)Landroid/hardware/biometrics/face/V1_0/IBiometricsFace;
 PLcom/android/server/biometrics/face/FaceService;->access$7500(Lcom/android/server/biometrics/face/FaceService;)I
+PLcom/android/server/biometrics/face/FaceService;->access$7500(Lcom/android/server/biometrics/face/FaceService;Ljava/lang/String;)V
 PLcom/android/server/biometrics/face/FaceService;->access$7600(Lcom/android/server/biometrics/face/FaceService;)I
+PLcom/android/server/biometrics/face/FaceService;->access$7600(Lcom/android/server/biometrics/face/FaceService;I)V
 PLcom/android/server/biometrics/face/FaceService;->access$7600(Lcom/android/server/biometrics/face/FaceService;Ljava/lang/String;)V
 PLcom/android/server/biometrics/face/FaceService;->access$7700(Lcom/android/server/biometrics/face/FaceService;)I
 PLcom/android/server/biometrics/face/FaceService;->access$7700(Lcom/android/server/biometrics/face/FaceService;I)V
+PLcom/android/server/biometrics/face/FaceService;->access$7700(Lcom/android/server/biometrics/face/FaceService;Ljava/lang/String;)V
 PLcom/android/server/biometrics/face/FaceService;->access$7800(Lcom/android/server/biometrics/face/FaceService;)I
+PLcom/android/server/biometrics/face/FaceService;->access$7800(Lcom/android/server/biometrics/face/FaceService;I)V
 PLcom/android/server/biometrics/face/FaceService;->access$7900(Lcom/android/server/biometrics/face/FaceService;)I
 PLcom/android/server/biometrics/face/FaceService;->access$800(Lcom/android/server/biometrics/face/FaceService;)Landroid/app/NotificationManager;
 PLcom/android/server/biometrics/face/FaceService;->access$8000(Lcom/android/server/biometrics/face/FaceService;)I
 PLcom/android/server/biometrics/face/FaceService;->access$8000(Lcom/android/server/biometrics/face/FaceService;)Lcom/android/server/biometrics/ClientMonitor;
+PLcom/android/server/biometrics/face/FaceService;->access$8100(Lcom/android/server/biometrics/face/FaceService;)I
 PLcom/android/server/biometrics/face/FaceService;->access$8100(Lcom/android/server/biometrics/face/FaceService;)Lcom/android/server/biometrics/ClientMonitor;
 PLcom/android/server/biometrics/face/FaceService;->access$8100(Lcom/android/server/biometrics/face/FaceService;Landroid/os/IBinder;)I
+PLcom/android/server/biometrics/face/FaceService;->access$8200(Lcom/android/server/biometrics/face/FaceService;)I
 PLcom/android/server/biometrics/face/FaceService;->access$8200(Lcom/android/server/biometrics/face/FaceService;Landroid/os/IBinder;)I
 PLcom/android/server/biometrics/face/FaceService;->access$8202(Lcom/android/server/biometrics/face/FaceService;Z)Z
+PLcom/android/server/biometrics/face/FaceService;->access$8300(Lcom/android/server/biometrics/face/FaceService;)I
+PLcom/android/server/biometrics/face/FaceService;->access$8300(Lcom/android/server/biometrics/face/FaceService;)Lcom/android/server/biometrics/ClientMonitor;
 PLcom/android/server/biometrics/face/FaceService;->access$8302(Lcom/android/server/biometrics/face/FaceService;Z)Z
+PLcom/android/server/biometrics/face/FaceService;->access$8400(Lcom/android/server/biometrics/face/FaceService;)I
 PLcom/android/server/biometrics/face/FaceService;->access$8400(Lcom/android/server/biometrics/face/FaceService;)Lcom/android/server/biometrics/BiometricServiceBase$H;
+PLcom/android/server/biometrics/face/FaceService;->access$8400(Lcom/android/server/biometrics/face/FaceService;)Lcom/android/server/biometrics/ClientMonitor;
 PLcom/android/server/biometrics/face/FaceService;->access$8500(Lcom/android/server/biometrics/face/FaceService;)Lcom/android/server/biometrics/BiometricServiceBase$H;
+PLcom/android/server/biometrics/face/FaceService;->access$8500(Lcom/android/server/biometrics/face/FaceService;Landroid/os/IBinder;)I
+PLcom/android/server/biometrics/face/FaceService;->access$8502(Lcom/android/server/biometrics/face/FaceService;Z)Z
 PLcom/android/server/biometrics/face/FaceService;->access$8600(Lcom/android/server/biometrics/face/FaceService;)Lcom/android/server/biometrics/BiometricServiceBase$H;
+PLcom/android/server/biometrics/face/FaceService;->access$8600(Lcom/android/server/biometrics/face/FaceService;)Z
 PLcom/android/server/biometrics/face/FaceService;->access$8700(Lcom/android/server/biometrics/face/FaceService;)Lcom/android/server/biometrics/BiometricServiceBase$H;
+PLcom/android/server/biometrics/face/FaceService;->access$8700(Lcom/android/server/biometrics/face/FaceService;)Z
 HSPLcom/android/server/biometrics/face/FaceService;->access$8800(Lcom/android/server/biometrics/face/FaceService;)Lcom/android/server/biometrics/BiometricServiceBase$H;
 PLcom/android/server/biometrics/face/FaceService;->access$8900(Lcom/android/server/biometrics/face/FaceService;)Lcom/android/server/biometrics/BiometricServiceBase$H;
 HSPLcom/android/server/biometrics/face/FaceService;->access$8902(Lcom/android/server/biometrics/face/FaceService;I)I
@@ -12915,16 +13730,26 @@
 HSPLcom/android/server/biometrics/face/FaceService;->access$9002(Lcom/android/server/biometrics/face/FaceService;I)I
 HSPLcom/android/server/biometrics/face/FaceService;->access$9100(Lcom/android/server/biometrics/face/FaceService;)Lcom/android/server/biometrics/BiometricServiceBase$H;
 HSPLcom/android/server/biometrics/face/FaceService;->access$9100(Lcom/android/server/biometrics/face/FaceService;)V
+PLcom/android/server/biometrics/face/FaceService;->access$9200(Lcom/android/server/biometrics/face/FaceService;)Lcom/android/server/biometrics/BiometricServiceBase$H;
 PLcom/android/server/biometrics/face/FaceService;->access$9200(Lcom/android/server/biometrics/face/FaceService;)V
 HSPLcom/android/server/biometrics/face/FaceService;->access$9201(Lcom/android/server/biometrics/face/FaceService;Landroid/hardware/biometrics/BiometricAuthenticator$Identifier;I)V
 PLcom/android/server/biometrics/face/FaceService;->access$9300(Lcom/android/server/biometrics/face/FaceService;)Lcom/android/server/biometrics/BiometricServiceBase$H;
 PLcom/android/server/biometrics/face/FaceService;->access$9301(Lcom/android/server/biometrics/face/FaceService;Landroid/hardware/biometrics/BiometricAuthenticator$Identifier;I)V
+PLcom/android/server/biometrics/face/FaceService;->access$9302(Lcom/android/server/biometrics/face/FaceService;I)I
+PLcom/android/server/biometrics/face/FaceService;->access$9400(Lcom/android/server/biometrics/face/FaceService;)Landroid/os/Handler;
+PLcom/android/server/biometrics/face/FaceService;->access$9400(Lcom/android/server/biometrics/face/FaceService;)Lcom/android/server/biometrics/BiometricServiceBase$H;
 PLcom/android/server/biometrics/face/FaceService;->access$9401(Lcom/android/server/biometrics/face/FaceService;Landroid/hardware/biometrics/BiometricAuthenticator$Identifier;I)V
 PLcom/android/server/biometrics/face/FaceService;->access$9402(Lcom/android/server/biometrics/face/FaceService;I)I
 PLcom/android/server/biometrics/face/FaceService;->access$9500(Lcom/android/server/biometrics/face/FaceService;)Lcom/android/server/biometrics/BiometricServiceBase$H;
+PLcom/android/server/biometrics/face/FaceService;->access$9500(Lcom/android/server/biometrics/face/FaceService;)V
+PLcom/android/server/biometrics/face/FaceService;->access$9502(Lcom/android/server/biometrics/face/FaceService;I)I
+PLcom/android/server/biometrics/face/FaceService;->access$9600(Lcom/android/server/biometrics/face/FaceService;)Landroid/os/Handler;
 PLcom/android/server/biometrics/face/FaceService;->access$9600(Lcom/android/server/biometrics/face/FaceService;)V
 HPLcom/android/server/biometrics/face/FaceService;->access$9601(Lcom/android/server/biometrics/face/FaceService;JII)V
+PLcom/android/server/biometrics/face/FaceService;->access$9601(Lcom/android/server/biometrics/face/FaceService;Landroid/hardware/biometrics/BiometricAuthenticator$Identifier;I)V
+PLcom/android/server/biometrics/face/FaceService;->access$9700(Lcom/android/server/biometrics/face/FaceService;)V
 HPLcom/android/server/biometrics/face/FaceService;->access$9701(Lcom/android/server/biometrics/face/FaceService;JII)V
+PLcom/android/server/biometrics/face/FaceService;->access$9701(Lcom/android/server/biometrics/face/FaceService;Landroid/hardware/biometrics/BiometricAuthenticator$Identifier;I)V
 PLcom/android/server/biometrics/face/FaceService;->access$9702(Lcom/android/server/biometrics/face/FaceService;J)J
 PLcom/android/server/biometrics/face/FaceService;->access$9801(Lcom/android/server/biometrics/face/FaceService;Landroid/hardware/biometrics/BiometricAuthenticator$Identifier;I)V
 PLcom/android/server/biometrics/face/FaceService;->access$9802(Lcom/android/server/biometrics/face/FaceService;I)I
@@ -13031,6 +13856,7 @@
 PLcom/android/server/biometrics/fingerprint/FingerprintService$FingerprintAuthClient;-><init>(Lcom/android/server/biometrics/fingerprint/FingerprintService;Landroid/content/Context;Lcom/android/server/biometrics/BiometricServiceBase$DaemonWrapper;JLandroid/os/IBinder;Lcom/android/server/biometrics/BiometricServiceBase$ServiceListener;IIJZLjava/lang/String;IZLandroid/hardware/biometrics/IBiometricNativeHandle;)V
 HPLcom/android/server/biometrics/fingerprint/FingerprintService$FingerprintAuthClient;->handleFailedAttempt()I
 PLcom/android/server/biometrics/fingerprint/FingerprintService$FingerprintAuthClient;->isFingerprint()Z
+PLcom/android/server/biometrics/fingerprint/FingerprintService$FingerprintAuthClient;->isStrongBiometric()Z
 HPLcom/android/server/biometrics/fingerprint/FingerprintService$FingerprintAuthClient;->resetFailedAttempts()V
 HPLcom/android/server/biometrics/fingerprint/FingerprintService$FingerprintAuthClient;->shouldFrameworkHandleLockout()Z
 HPLcom/android/server/biometrics/fingerprint/FingerprintService$FingerprintAuthClient;->statsModality()I
@@ -13081,17 +13907,23 @@
 HSPLcom/android/server/biometrics/fingerprint/FingerprintService;-><init>(Landroid/content/Context;)V
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$000(Lcom/android/server/biometrics/fingerprint/FingerprintService;ZI)V
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$100(Lcom/android/server/biometrics/fingerprint/FingerprintService;)Landroid/util/SparseIntArray;
+PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$100(Lcom/android/server/biometrics/fingerprint/FingerprintService;)Z
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$1000(Lcom/android/server/biometrics/fingerprint/FingerprintService;)Lcom/android/server/biometrics/BiometricServiceBase$DaemonWrapper;
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$1100(Lcom/android/server/biometrics/fingerprint/FingerprintService;)J
+PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$1100(Lcom/android/server/biometrics/fingerprint/FingerprintService;)Lcom/android/server/biometrics/BiometricServiceBase$DaemonWrapper;
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$1200(Lcom/android/server/biometrics/fingerprint/FingerprintService;)I
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$1300(Lcom/android/server/biometrics/fingerprint/FingerprintService;Lcom/android/server/biometrics/BiometricServiceBase$EnrollClientImpl;I)V
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$1400(Lcom/android/server/biometrics/fingerprint/FingerprintService;Ljava/lang/String;)V
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$1500(Lcom/android/server/biometrics/fingerprint/FingerprintService;Landroid/os/IBinder;)V
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$1600(Lcom/android/server/biometrics/fingerprint/FingerprintService;)Z
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$1700(Lcom/android/server/biometrics/fingerprint/FingerprintService;)J
+PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$1700(Lcom/android/server/biometrics/fingerprint/FingerprintService;)Z
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$1800(Lcom/android/server/biometrics/fingerprint/FingerprintService;)I
+PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$1800(Lcom/android/server/biometrics/fingerprint/FingerprintService;)J
+PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$1900(Lcom/android/server/biometrics/fingerprint/FingerprintService;)I
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$1900(Lcom/android/server/biometrics/fingerprint/FingerprintService;Lcom/android/server/biometrics/BiometricServiceBase$AuthenticationClientImpl;JLjava/lang/String;)V
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$200(Lcom/android/server/biometrics/fingerprint/FingerprintService;)Landroid/util/SparseBooleanArray;
+PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$2000(Lcom/android/server/biometrics/fingerprint/FingerprintService;Lcom/android/server/biometrics/BiometricServiceBase$AuthenticationClientImpl;JLjava/lang/String;)V
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$2000(Lcom/android/server/biometrics/fingerprint/FingerprintService;Ljava/lang/String;)V
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$2100(Lcom/android/server/biometrics/fingerprint/FingerprintService;)J
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$2200(Lcom/android/server/biometrics/fingerprint/FingerprintService;)I
@@ -13099,11 +13931,14 @@
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$2400(Lcom/android/server/biometrics/fingerprint/FingerprintService;Ljava/lang/String;)V
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$2500(Lcom/android/server/biometrics/fingerprint/FingerprintService;I)V
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$2600(Lcom/android/server/biometrics/fingerprint/FingerprintService;Landroid/os/IBinder;Ljava/lang/String;)V
+PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$2700(Lcom/android/server/biometrics/fingerprint/FingerprintService;Landroid/os/IBinder;Ljava/lang/String;)V
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$2700(Lcom/android/server/biometrics/fingerprint/FingerprintService;Ljava/lang/String;)V
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$2800(Lcom/android/server/biometrics/fingerprint/FingerprintService;Landroid/os/IBinder;Ljava/lang/String;IIIZ)V
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$2900(Lcom/android/server/biometrics/fingerprint/FingerprintService;Ljava/lang/String;)V
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$300(Lcom/android/server/biometrics/fingerprint/FingerprintService;I)V
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$3000(Lcom/android/server/biometrics/fingerprint/FingerprintService;I)V
+PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$3000(Lcom/android/server/biometrics/fingerprint/FingerprintService;Ljava/lang/String;)V
+PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$3100(Lcom/android/server/biometrics/fingerprint/FingerprintService;I)V
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$3100(Lcom/android/server/biometrics/fingerprint/FingerprintService;Ljava/lang/String;)V
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$3200(Lcom/android/server/biometrics/fingerprint/FingerprintService;)Z
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$3300(Lcom/android/server/biometrics/fingerprint/FingerprintService;)J
@@ -13111,10 +13946,14 @@
 HSPLcom/android/server/biometrics/fingerprint/FingerprintService;->access$3901(Lcom/android/server/biometrics/fingerprint/FingerprintService;Landroid/hardware/biometrics/IBiometricServiceLockoutResetCallback;)V
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$400(Lcom/android/server/biometrics/fingerprint/FingerprintService;Ljava/lang/String;)V
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$4000(Lcom/android/server/biometrics/fingerprint/FingerprintService;Ljava/io/FileDescriptor;)V
+PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$4001(Lcom/android/server/biometrics/fingerprint/FingerprintService;Landroid/hardware/biometrics/IBiometricServiceLockoutResetCallback;)V
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$4100(Lcom/android/server/biometrics/fingerprint/FingerprintService;Ljava/io/PrintWriter;)V
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$4200(Lcom/android/server/biometrics/fingerprint/FingerprintService;Ljava/lang/String;ZIII)Z
 HSPLcom/android/server/biometrics/fingerprint/FingerprintService;->access$4300(Lcom/android/server/biometrics/fingerprint/FingerprintService;)Landroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;
+PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$4300(Lcom/android/server/biometrics/fingerprint/FingerprintService;Ljava/lang/String;ZIII)Z
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$4400(Lcom/android/server/biometrics/fingerprint/FingerprintService;)J
+PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$4400(Lcom/android/server/biometrics/fingerprint/FingerprintService;)Landroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;
+PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$4500(Lcom/android/server/biometrics/fingerprint/FingerprintService;)J
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$4500(Lcom/android/server/biometrics/fingerprint/FingerprintService;Ljava/lang/String;)V
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$4600(Lcom/android/server/biometrics/fingerprint/FingerprintService;I)Z
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$4700(Lcom/android/server/biometrics/fingerprint/FingerprintService;)Lcom/android/server/biometrics/BiometricServiceBase$H;
@@ -13122,6 +13961,7 @@
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$4900(Lcom/android/server/biometrics/fingerprint/FingerprintService;Ljava/lang/String;ZIII)Z
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$500(Lcom/android/server/biometrics/fingerprint/FingerprintService;Landroid/os/IBinder;)J
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$5000(Lcom/android/server/biometrics/fingerprint/FingerprintService;Ljava/lang/String;)V
+PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$5000(Lcom/android/server/biometrics/fingerprint/FingerprintService;Ljava/lang/String;ZIII)Z
 HPLcom/android/server/biometrics/fingerprint/FingerprintService;->access$5001(Lcom/android/server/biometrics/fingerprint/FingerprintService;Ljava/lang/String;)J
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$5100(Lcom/android/server/biometrics/fingerprint/FingerprintService;)J
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$5100(Lcom/android/server/biometrics/fingerprint/FingerprintService;Ljava/lang/String;)V
@@ -13129,7 +13969,10 @@
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$5200(Lcom/android/server/biometrics/fingerprint/FingerprintService;Ljava/lang/String;)V
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$5300(Lcom/android/server/biometrics/fingerprint/FingerprintService;)I
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$5300(Lcom/android/server/biometrics/fingerprint/FingerprintService;)Lcom/android/server/biometrics/BiometricServiceBase$H;
+PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$5300(Lcom/android/server/biometrics/fingerprint/FingerprintService;Ljava/lang/String;)V
+PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$5400(Lcom/android/server/biometrics/fingerprint/FingerprintService;)I
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$5400(Lcom/android/server/biometrics/fingerprint/FingerprintService;)Lcom/android/server/biometrics/BiometricServiceBase$H;
+PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$5500(Lcom/android/server/biometrics/fingerprint/FingerprintService;)Lcom/android/server/biometrics/BiometricServiceBase$H;
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$600(Lcom/android/server/biometrics/fingerprint/FingerprintService;Ljava/lang/String;)V
 HSPLcom/android/server/biometrics/fingerprint/FingerprintService;->access$6000(Lcom/android/server/biometrics/fingerprint/FingerprintService;Ljava/lang/String;)V
 HSPLcom/android/server/biometrics/fingerprint/FingerprintService;->access$6100(Lcom/android/server/biometrics/fingerprint/FingerprintService;I)V
@@ -13137,12 +13980,16 @@
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$6200(Lcom/android/server/biometrics/fingerprint/FingerprintService;)Lcom/android/server/biometrics/BiometricServiceBase$H;
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$6200(Lcom/android/server/biometrics/fingerprint/FingerprintService;)Z
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$6200(Lcom/android/server/biometrics/fingerprint/FingerprintService;I)V
+PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$6200(Lcom/android/server/biometrics/fingerprint/FingerprintService;Ljava/lang/String;)V
 HPLcom/android/server/biometrics/fingerprint/FingerprintService;->access$6300(Lcom/android/server/biometrics/fingerprint/FingerprintService;)Lcom/android/server/biometrics/BiometricServiceBase$H;
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$6300(Lcom/android/server/biometrics/fingerprint/FingerprintService;)Z
+PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$6300(Lcom/android/server/biometrics/fingerprint/FingerprintService;I)V
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$6400(Lcom/android/server/biometrics/fingerprint/FingerprintService;)Lcom/android/server/biometrics/BiometricServiceBase$H;
+PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$6400(Lcom/android/server/biometrics/fingerprint/FingerprintService;)Z
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$6500(Lcom/android/server/biometrics/fingerprint/FingerprintService;)Lcom/android/server/biometrics/BiometricServiceBase$H;
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$6600(Lcom/android/server/biometrics/fingerprint/FingerprintService;)Lcom/android/server/biometrics/BiometricServiceBase$H;
 HSPLcom/android/server/biometrics/fingerprint/FingerprintService;->access$6700(Lcom/android/server/biometrics/fingerprint/FingerprintService;)Lcom/android/server/biometrics/BiometricServiceBase$H;
+PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$6800(Lcom/android/server/biometrics/fingerprint/FingerprintService;)Landroid/os/Handler;
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$6800(Lcom/android/server/biometrics/fingerprint/FingerprintService;)Lcom/android/server/biometrics/BiometricServiceBase$H;
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$6801(Lcom/android/server/biometrics/fingerprint/FingerprintService;Landroid/hardware/biometrics/BiometricAuthenticator$Identifier;I)V
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$6900(Lcom/android/server/biometrics/fingerprint/FingerprintService;)Lcom/android/server/biometrics/BiometricServiceBase$H;
@@ -13153,7 +14000,10 @@
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$7100(Lcom/android/server/biometrics/fingerprint/FingerprintService;)Lcom/android/server/biometrics/BiometricServiceBase$H;
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$7101(Lcom/android/server/biometrics/fingerprint/FingerprintService;JII)V
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$7101(Lcom/android/server/biometrics/fingerprint/FingerprintService;Landroid/hardware/biometrics/BiometricAuthenticator$Identifier;I)V
+PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$7200(Lcom/android/server/biometrics/fingerprint/FingerprintService;)Landroid/os/Handler;
+PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$7200(Lcom/android/server/biometrics/fingerprint/FingerprintService;)Lcom/android/server/biometrics/BiometricServiceBase$H;
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$7201(Lcom/android/server/biometrics/fingerprint/FingerprintService;Landroid/hardware/biometrics/BiometricAuthenticator$Identifier;I)V
+PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$7301(Lcom/android/server/biometrics/fingerprint/FingerprintService;Landroid/hardware/biometrics/BiometricAuthenticator$Identifier;I)V
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$7401(Lcom/android/server/biometrics/fingerprint/FingerprintService;JII)V
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$7501(Lcom/android/server/biometrics/fingerprint/FingerprintService;JII)V
 HPLcom/android/server/biometrics/fingerprint/FingerprintService;->access$7501(Lcom/android/server/biometrics/fingerprint/FingerprintService;Landroid/hardware/biometrics/BiometricAuthenticator$Identifier;Ljava/util/ArrayList;)V
@@ -13164,6 +14014,8 @@
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$7901(Lcom/android/server/biometrics/fingerprint/FingerprintService;Landroid/hardware/biometrics/BiometricAuthenticator$Identifier;Ljava/util/ArrayList;)V
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$800(Lcom/android/server/biometrics/fingerprint/FingerprintService;Ljava/lang/String;)V
 HPLcom/android/server/biometrics/fingerprint/FingerprintService;->access$8001(Lcom/android/server/biometrics/fingerprint/FingerprintService;JII)V
+PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$8001(Lcom/android/server/biometrics/fingerprint/FingerprintService;Landroid/hardware/biometrics/BiometricAuthenticator$Identifier;Ljava/util/ArrayList;)V
+PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$8101(Lcom/android/server/biometrics/fingerprint/FingerprintService;JII)V
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->access$900(Lcom/android/server/biometrics/fingerprint/FingerprintService;)Z
 PLcom/android/server/biometrics/fingerprint/FingerprintService;->cancelLockoutResetForUser(I)V
 HPLcom/android/server/biometrics/fingerprint/FingerprintService;->checkAppOps(ILjava/lang/String;)Z
@@ -13387,7 +14239,7 @@
 PLcom/android/server/companion/CompanionDeviceManagerService;->unlinkToDeath(Landroid/os/IInterface;Landroid/os/IBinder$DeathRecipient;I)Landroid/os/IInterface;
 PLcom/android/server/companion/CompanionDeviceManagerService;->updateAssociations(Ljava/util/function/Function;)V
 HSPLcom/android/server/companion/CompanionDeviceManagerService;->updateAssociations(Ljava/util/function/Function;I)V
-PLcom/android/server/companion/CompanionDeviceManagerService;->updateSpecialAccessPermissionAsSystem(Landroid/content/pm/PackageInfo;)V
+HPLcom/android/server/companion/CompanionDeviceManagerService;->updateSpecialAccessPermissionAsSystem(Landroid/content/pm/PackageInfo;)V
 PLcom/android/server/companion/CompanionDeviceManagerService;->updateSpecialAccessPermissionForAssociatedPackage(Ljava/lang/String;I)V
 HSPLcom/android/server/compat/CompatChange;-><init>(Lcom/android/server/compat/config/Change;)V
 HSPLcom/android/server/compat/CompatChange;->isEnabled(Landroid/content/pm/ApplicationInfo;)Z
@@ -13408,6 +14260,7 @@
 HSPLcom/android/server/compat/CompatConfig;->readConfig(Ljava/io/File;)V
 HSPLcom/android/server/compat/CompatConfig;->registerListener(JLcom/android/server/compat/CompatChange$ChangeListener;)Z
 HSPLcom/android/server/compat/OverrideValidatorImpl;-><init>(Lcom/android/internal/compat/AndroidBuildClassifier;Landroid/content/Context;Lcom/android/server/compat/CompatConfig;)V
+HSPLcom/android/server/compat/PlatformCompat;-><clinit>()V
 HSPLcom/android/server/compat/PlatformCompat;-><init>(Landroid/content/Context;)V
 HSPLcom/android/server/compat/PlatformCompat;->checkCompatChangeLogPermission()V
 HSPLcom/android/server/compat/PlatformCompat;->checkCompatChangeReadAndLogPermission()V
@@ -13436,6 +14289,7 @@
 HSPLcom/android/server/compat/config/Change;->setDisabled(Z)V
 HSPLcom/android/server/compat/config/Change;->setEnableAfterTargetSdk(I)V
 HSPLcom/android/server/compat/config/Change;->setId(J)V
+HSPLcom/android/server/compat/config/Change;->setLoggingOnly(Z)V
 HSPLcom/android/server/compat/config/Change;->setName(Ljava/lang/String;)V
 HSPLcom/android/server/compat/config/Change;->setValue(Ljava/lang/String;)V
 HSPLcom/android/server/compat/config/Config;-><init>()V
@@ -13481,6 +14335,10 @@
 HPLcom/android/server/connectivity/-$$Lambda$NetworkRanker$wdDWUWxRRoYuCeZpawCNW8Z5deE;->test(Ljava/lang/Object;)Z
 PLcom/android/server/connectivity/-$$Lambda$PermissionMonitor$h-GPsXXwaQ-Mfu5-dqCp_VIYNOM;-><init>(Lcom/android/server/connectivity/PermissionMonitor;)V
 HPLcom/android/server/connectivity/-$$Lambda$PermissionMonitor$h-GPsXXwaQ-Mfu5-dqCp_VIYNOM;->test(Ljava/lang/Object;)Z
+HPLcom/android/server/connectivity/-$$Lambda$Vpn$01GHnWeBsEVRYvEsZRkJXx1CEVs;-><init>(Landroid/content/pm/PackageManager;Ljava/lang/String;I)V
+HPLcom/android/server/connectivity/-$$Lambda$Vpn$01GHnWeBsEVRYvEsZRkJXx1CEVs;->getOrThrow()Ljava/lang/Object;
+PLcom/android/server/connectivity/-$$Lambda$Vpn$S2EK4wFrspvxxxzu8J3SwhT7oVM;-><init>(Lcom/android/server/connectivity/Vpn;)V
+PLcom/android/server/connectivity/-$$Lambda$Vpn$S2EK4wFrspvxxxzu8J3SwhT7oVM;->runOrThrow()V
 PLcom/android/server/connectivity/-$$Lambda$Vpn$wy5PNyhOuH5lnkIjO4Gf9lNXkVQ;-><init>(Lcom/android/server/connectivity/Vpn;)V
 PLcom/android/server/connectivity/-$$Lambda$Vpn$wy5PNyhOuH5lnkIjO4Gf9lNXkVQ;->runOrThrow()V
 HPLcom/android/server/connectivity/AutodestructReference;-><init>(Ljava/lang/Object;)V
@@ -13610,7 +14468,7 @@
 PLcom/android/server/connectivity/KeepaliveTracker$KeepaliveInfo;->access$1000(Lcom/android/server/connectivity/KeepaliveTracker$KeepaliveInfo;)Landroid/net/ISocketKeepaliveCallback;
 PLcom/android/server/connectivity/KeepaliveTracker$KeepaliveInfo;->access$700(Lcom/android/server/connectivity/KeepaliveTracker$KeepaliveInfo;)I
 PLcom/android/server/connectivity/KeepaliveTracker$KeepaliveInfo;->access$800(Lcom/android/server/connectivity/KeepaliveTracker$KeepaliveInfo;)I
-PLcom/android/server/connectivity/KeepaliveTracker$KeepaliveInfo;->access$900(Lcom/android/server/connectivity/KeepaliveTracker$KeepaliveInfo;)I
+HPLcom/android/server/connectivity/KeepaliveTracker$KeepaliveInfo;->access$900(Lcom/android/server/connectivity/KeepaliveTracker$KeepaliveInfo;)I
 PLcom/android/server/connectivity/KeepaliveTracker$KeepaliveInfo;->access$902(Lcom/android/server/connectivity/KeepaliveTracker$KeepaliveInfo;I)I
 PLcom/android/server/connectivity/KeepaliveTracker$KeepaliveInfo;->binderDied()V
 PLcom/android/server/connectivity/KeepaliveTracker$KeepaliveInfo;->checkInterval()I
@@ -13708,14 +14566,17 @@
 HSPLcom/android/server/connectivity/MultipathPolicyTracker;->registerTrackMobileCallback()V
 HSPLcom/android/server/connectivity/MultipathPolicyTracker;->start()V
 HSPLcom/android/server/connectivity/MultipathPolicyTracker;->updateAllMultipathBudgets()V
+PLcom/android/server/connectivity/Nat464Xlat$1;-><clinit>()V
 PLcom/android/server/connectivity/Nat464Xlat$State;-><clinit>()V
 PLcom/android/server/connectivity/Nat464Xlat$State;-><init>(Ljava/lang/String;I)V
+PLcom/android/server/connectivity/Nat464Xlat$State;->values()[Lcom/android/server/connectivity/Nat464Xlat$State;
 PLcom/android/server/connectivity/Nat464Xlat;-><clinit>()V
 HPLcom/android/server/connectivity/Nat464Xlat;-><init>(Lcom/android/server/connectivity/NetworkAgentInfo;Landroid/net/INetd;Landroid/net/IDnsResolver;Landroid/os/INetworkManagementService;)V
 PLcom/android/server/connectivity/Nat464Xlat;->enterRunningState()V
 HPLcom/android/server/connectivity/Nat464Xlat;->enterStartingState(Ljava/lang/String;)V
 HPLcom/android/server/connectivity/Nat464Xlat;->fixupLinkProperties(Landroid/net/LinkProperties;Landroid/net/LinkProperties;)V
 PLcom/android/server/connectivity/Nat464Xlat;->getLinkAddress(Ljava/lang/String;)Landroid/net/LinkAddress;
+PLcom/android/server/connectivity/Nat464Xlat;->getNat64Prefix()Landroid/net/IpPrefix;
 PLcom/android/server/connectivity/Nat464Xlat;->getNetId()I
 HPLcom/android/server/connectivity/Nat464Xlat;->handleInterfaceLinkStateChanged(Ljava/lang/String;Z)V
 HPLcom/android/server/connectivity/Nat464Xlat;->handleInterfaceRemoved(Ljava/lang/String;)V
@@ -13731,6 +14592,7 @@
 HPLcom/android/server/connectivity/Nat464Xlat;->makeLinkProperties(Landroid/net/LinkAddress;)Landroid/net/LinkProperties;
 HPLcom/android/server/connectivity/Nat464Xlat;->requiresClat(Lcom/android/server/connectivity/NetworkAgentInfo;)Z
 PLcom/android/server/connectivity/Nat464Xlat;->setNat64Prefix(Landroid/net/IpPrefix;)V
+PLcom/android/server/connectivity/Nat464Xlat;->setNat64PrefixFromDns(Landroid/net/IpPrefix;)V
 HPLcom/android/server/connectivity/Nat464Xlat;->shouldStartClat(Lcom/android/server/connectivity/NetworkAgentInfo;)Z
 HPLcom/android/server/connectivity/Nat464Xlat;->start()V
 HPLcom/android/server/connectivity/Nat464Xlat;->startPrefixDiscovery()V
@@ -13768,7 +14630,7 @@
 HPLcom/android/server/connectivity/NetworkAgentInfo$LingerTimer;->compareTo(Ljava/lang/Object;)I
 PLcom/android/server/connectivity/NetworkAgentInfo$LingerTimer;->toString()Ljava/lang/String;
 HSPLcom/android/server/connectivity/NetworkAgentInfo;-><clinit>()V
-PLcom/android/server/connectivity/NetworkAgentInfo;-><init>(Landroid/os/Messenger;Lcom/android/internal/util/AsyncChannel;Landroid/net/Network;Landroid/net/NetworkInfo;Landroid/net/LinkProperties;Landroid/net/NetworkCapabilities;ILandroid/content/Context;Landroid/os/Handler;Landroid/net/NetworkAgentConfig;Lcom/android/server/ConnectivityService;Landroid/net/INetd;Landroid/net/IDnsResolver;Landroid/os/INetworkManagementService;I)V
+HPLcom/android/server/connectivity/NetworkAgentInfo;-><init>(Landroid/os/Messenger;Lcom/android/internal/util/AsyncChannel;Landroid/net/Network;Landroid/net/NetworkInfo;Landroid/net/LinkProperties;Landroid/net/NetworkCapabilities;ILandroid/content/Context;Landroid/os/Handler;Landroid/net/NetworkAgentConfig;Lcom/android/server/ConnectivityService;Landroid/net/INetd;Landroid/net/IDnsResolver;Landroid/os/INetworkManagementService;I)V
 HPLcom/android/server/connectivity/NetworkAgentInfo;-><init>(Landroid/os/Messenger;Lcom/android/internal/util/AsyncChannel;Landroid/net/Network;Landroid/net/NetworkInfo;Landroid/net/LinkProperties;Landroid/net/NetworkCapabilities;Landroid/net/NetworkScore;Landroid/content/Context;Landroid/os/Handler;Landroid/net/NetworkAgentConfig;Lcom/android/server/ConnectivityService;Landroid/net/INetd;Landroid/net/IDnsResolver;Landroid/os/INetworkManagementService;I)V
 HPLcom/android/server/connectivity/NetworkAgentInfo;-><init>(Landroid/os/Messenger;Lcom/android/internal/util/AsyncChannel;Landroid/net/Network;Landroid/net/NetworkInfo;Landroid/net/LinkProperties;Landroid/net/NetworkCapabilities;Landroid/net/NetworkScore;Landroid/content/Context;Landroid/os/Handler;Landroid/net/NetworkMisc;Lcom/android/server/ConnectivityService;Landroid/net/INetd;Landroid/net/IDnsResolver;Landroid/os/INetworkManagementService;I)V
 HPLcom/android/server/connectivity/NetworkAgentInfo;->addRequest(Landroid/net/NetworkRequest;)Z
@@ -13808,6 +14670,7 @@
 HPLcom/android/server/connectivity/NetworkAgentInfo;->requestAt(I)Landroid/net/NetworkRequest;
 HPLcom/android/server/connectivity/NetworkAgentInfo;->satisfies(Landroid/net/NetworkRequest;)Z
 PLcom/android/server/connectivity/NetworkAgentInfo;->satisfiesImmutableCapabilitiesOf(Landroid/net/NetworkRequest;)Z
+PLcom/android/server/connectivity/NetworkAgentInfo;->setConnectivityReport(Landroid/net/ConnectivityDiagnosticsManager$ConnectivityReport;)V
 PLcom/android/server/connectivity/NetworkAgentInfo;->setNetworkScore(Landroid/net/NetworkScore;)V
 PLcom/android/server/connectivity/NetworkAgentInfo;->setScore(I)V
 HPLcom/android/server/connectivity/NetworkAgentInfo;->toShortString()Ljava/lang/String;
@@ -13868,6 +14731,7 @@
 HPLcom/android/server/connectivity/NetworkNotificationManager;->clearNotification(I)V
 HPLcom/android/server/connectivity/NetworkNotificationManager;->clearNotification(ILcom/android/server/connectivity/NetworkNotificationManager$NotificationType;)V
 PLcom/android/server/connectivity/NetworkNotificationManager;->getFirstTransportType(Lcom/android/server/connectivity/NetworkAgentInfo;)I
+PLcom/android/server/connectivity/NetworkNotificationManager;->getIcon(I)I
 PLcom/android/server/connectivity/NetworkNotificationManager;->getIcon(ILcom/android/server/connectivity/NetworkNotificationManager$NotificationType;)I
 PLcom/android/server/connectivity/NetworkNotificationManager;->getTransportName(I)Ljava/lang/String;
 PLcom/android/server/connectivity/NetworkNotificationManager;->nameOf(I)Ljava/lang/String;
@@ -14037,6 +14901,8 @@
 PLcom/android/server/connectivity/Vpn;->isVpnServicePreConsented(Landroid/content/Context;Ljava/lang/String;)Z
 HPLcom/android/server/connectivity/Vpn;->isVpnUserPreConsented(Ljava/lang/String;)Z
 PLcom/android/server/connectivity/Vpn;->lambda$enforceNotRestrictedUser$0$Vpn()V
+PLcom/android/server/connectivity/Vpn;->lambda$enforceNotRestrictedUser$1$Vpn()V
+HPLcom/android/server/connectivity/Vpn;->lambda$getAppUid$0(Landroid/content/pm/PackageManager;Ljava/lang/String;I)Ljava/lang/Integer;
 HSPLcom/android/server/connectivity/Vpn;->loadAlwaysOnPackage()V
 HSPLcom/android/server/connectivity/Vpn;->loadAlwaysOnPackage(Landroid/security/KeyStore;)V
 HPLcom/android/server/connectivity/Vpn;->makeLinkProperties()Landroid/net/LinkProperties;
@@ -14100,7 +14966,7 @@
 HPLcom/android/server/content/-$$Lambda$SyncManager$bVs0A6OYdmGkOiq_lbp5MiBwelw;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
 PLcom/android/server/content/-$$Lambda$SyncManager$pdoEVnuSkmOrvULQ9M7Ic-lU5vw;-><clinit>()V
 PLcom/android/server/content/-$$Lambda$SyncManager$pdoEVnuSkmOrvULQ9M7Ic-lU5vw;-><init>()V
-PLcom/android/server/content/-$$Lambda$SyncManager$pdoEVnuSkmOrvULQ9M7Ic-lU5vw;->apply(Ljava/lang/Object;)Ljava/lang/Object;
+HPLcom/android/server/content/-$$Lambda$SyncManager$pdoEVnuSkmOrvULQ9M7Ic-lU5vw;->apply(Ljava/lang/Object;)Ljava/lang/Object;
 PLcom/android/server/content/-$$Lambda$SyncManager$rDUHWai3SU0BXk1TE0bLDap9gVc;-><clinit>()V
 PLcom/android/server/content/-$$Lambda$SyncManager$rDUHWai3SU0BXk1TE0bLDap9gVc;-><init>()V
 PLcom/android/server/content/-$$Lambda$SyncManager$rDUHWai3SU0BXk1TE0bLDap9gVc;->test(Ljava/lang/Object;)Z
@@ -14125,7 +14991,7 @@
 PLcom/android/server/content/ContentService$ObserverCollector$Key;-><init>(Landroid/database/IContentObserver;IZII)V
 HPLcom/android/server/content/ContentService$ObserverCollector$Key;->equals(Ljava/lang/Object;)Z
 HPLcom/android/server/content/ContentService$ObserverCollector$Key;->hashCode()I
-PLcom/android/server/content/ContentService$ObserverCollector;-><init>()V
+HPLcom/android/server/content/ContentService$ObserverCollector;-><init>()V
 HPLcom/android/server/content/ContentService$ObserverCollector;->collect(Landroid/database/IContentObserver;IZLandroid/net/Uri;II)V
 HPLcom/android/server/content/ContentService$ObserverCollector;->dispatch()V
 HPLcom/android/server/content/ContentService$ObserverCollector;->lambda$dispatch$0(Lcom/android/server/content/ContentService$ObserverCollector$Key;Ljava/util/List;)V
@@ -14138,6 +15004,7 @@
 HSPLcom/android/server/content/ContentService$ObserverNode;->addObserverLocked(Landroid/net/Uri;Landroid/database/IContentObserver;ZLjava/lang/Object;III)V
 HPLcom/android/server/content/ContentService$ObserverNode;->collectMyObserversLocked(Landroid/net/Uri;ZLandroid/database/IContentObserver;ZIILcom/android/server/content/ContentService$ObserverCollector;)V
 HSPLcom/android/server/content/ContentService$ObserverNode;->collectMyObserversLocked(Landroid/net/Uri;ZLandroid/database/IContentObserver;ZIILjava/util/ArrayList;)V
+HPLcom/android/server/content/ContentService$ObserverNode;->collectObserversLocked(Landroid/net/Uri;IILandroid/database/IContentObserver;ZIILcom/android/server/content/ContentService$ObserverCollector;)V
 HPLcom/android/server/content/ContentService$ObserverNode;->collectObserversLocked(Landroid/net/Uri;ILandroid/database/IContentObserver;ZIILcom/android/server/content/ContentService$ObserverCollector;)V
 HSPLcom/android/server/content/ContentService$ObserverNode;->collectObserversLocked(Landroid/net/Uri;ILandroid/database/IContentObserver;ZIILjava/util/ArrayList;)V
 HSPLcom/android/server/content/ContentService$ObserverNode;->countUriSegments(Landroid/net/Uri;)I
@@ -14431,6 +15298,7 @@
 PLcom/android/server/content/SyncManager;->lambda$sendOnUnsyncableAccount$12(Landroid/content/Context;Lcom/android/server/content/SyncManager$OnUnsyncableAccountCheck;)V
 HPLcom/android/server/content/SyncManager;->lambda$static$6(Lcom/android/server/content/SyncOperation;Lcom/android/server/content/SyncOperation;)I
 HPLcom/android/server/content/SyncManager;->lambda$static$7(Lcom/android/server/content/SyncOperation;Lcom/android/server/content/SyncOperation;)I
+PLcom/android/server/content/SyncManager;->likelyHasPeriodicSyncs()Z
 HPLcom/android/server/content/SyncManager;->maybeRescheduleSync(Landroid/content/SyncResult;Lcom/android/server/content/SyncOperation;)V
 HSPLcom/android/server/content/SyncManager;->onBootPhase(I)V
 HSPLcom/android/server/content/SyncManager;->onStartUser(I)V
@@ -14488,21 +15356,21 @@
 PLcom/android/server/content/SyncOperation;->enableTwoWaySync()V
 HPLcom/android/server/content/SyncOperation;->extrasToString(Landroid/os/Bundle;)Ljava/lang/String;
 HPLcom/android/server/content/SyncOperation;->extrasToStringBuilder(Landroid/os/Bundle;Ljava/lang/StringBuilder;)V
-PLcom/android/server/content/SyncOperation;->findPriority()I
+HPLcom/android/server/content/SyncOperation;->findPriority()I
 HPLcom/android/server/content/SyncOperation;->getClonedExtras()Landroid/os/Bundle;
 HPLcom/android/server/content/SyncOperation;->getExtrasAsString()Ljava/lang/String;
-PLcom/android/server/content/SyncOperation;->hasDoNotRetry()Z
+HPLcom/android/server/content/SyncOperation;->hasDoNotRetry()Z
 HPLcom/android/server/content/SyncOperation;->hasIgnoreBackoff()Z
 HPLcom/android/server/content/SyncOperation;->hasRequireCharging()Z
 PLcom/android/server/content/SyncOperation;->ignoreBackoff()Z
 HPLcom/android/server/content/SyncOperation;->isAppStandbyExempted()Z
 HPLcom/android/server/content/SyncOperation;->isConflict(Lcom/android/server/content/SyncOperation;)Z
-PLcom/android/server/content/SyncOperation;->isDerivedFromFailedPeriodicSync()Z
+HPLcom/android/server/content/SyncOperation;->isDerivedFromFailedPeriodicSync()Z
 HPLcom/android/server/content/SyncOperation;->isExpedited()Z
 HPLcom/android/server/content/SyncOperation;->isIgnoreSettings()Z
 HPLcom/android/server/content/SyncOperation;->isInitialization()Z
-PLcom/android/server/content/SyncOperation;->isNotAllowedOnMetered()Z
-PLcom/android/server/content/SyncOperation;->isUpload()Z
+HPLcom/android/server/content/SyncOperation;->isNotAllowedOnMetered()Z
+HPLcom/android/server/content/SyncOperation;->isUpload()Z
 HPLcom/android/server/content/SyncOperation;->matchesPeriodicOperation(Lcom/android/server/content/SyncOperation;)Z
 HPLcom/android/server/content/SyncOperation;->maybeCreateFromJobExtras(Landroid/os/PersistableBundle;)Lcom/android/server/content/SyncOperation;
 HPLcom/android/server/content/SyncOperation;->reasonToString(Landroid/content/pm/PackageManager;I)Ljava/lang/String;
@@ -14540,6 +15408,7 @@
 HSPLcom/android/server/content/SyncStorageEngine;->createAuthorityLocked(Lcom/android/server/content/SyncStorageEngine$EndPoint;IZ)Lcom/android/server/content/SyncStorageEngine$AuthorityInfo;
 HPLcom/android/server/content/SyncStorageEngine;->createCopyPairOfAuthorityWithSyncStatusLocked(Lcom/android/server/content/SyncStorageEngine$AuthorityInfo;)Landroid/util/Pair;
 HPLcom/android/server/content/SyncStorageEngine;->getAuthority(I)Lcom/android/server/content/SyncStorageEngine$AuthorityInfo;
+PLcom/android/server/content/SyncStorageEngine;->getAuthorityCount()I
 HPLcom/android/server/content/SyncStorageEngine;->getAuthorityLocked(Lcom/android/server/content/SyncStorageEngine$EndPoint;Ljava/lang/String;)Lcom/android/server/content/SyncStorageEngine$AuthorityInfo;
 HPLcom/android/server/content/SyncStorageEngine;->getBackoff(Lcom/android/server/content/SyncStorageEngine$EndPoint;)Landroid/util/Pair;
 HPLcom/android/server/content/SyncStorageEngine;->getCopyOfAuthorityWithSyncStatus(Lcom/android/server/content/SyncStorageEngine$EndPoint;)Landroid/util/Pair;
@@ -14863,6 +15732,10 @@
 HPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$0NGjMa7hJHujISQOD_pH8kTq6JI;->getOrThrow()Ljava/lang/Object;
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$0YdFTQIxrgxkEfzJdhGZzP5z4eM;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Ljava/lang/String;ILjava/lang/String;)V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$0YdFTQIxrgxkEfzJdhGZzP5z4eM;->runOrThrow()V
+HPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$0ehxvWnOMx6g5T1hCFEw18p06Yc;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Ljava/lang/CharSequence;)V
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$0ehxvWnOMx6g5T1hCFEw18p06Yc;->runOrThrow()V
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$0hlLXeS7in_CijIUkNGFRe2IkVE;-><clinit>()V
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$0hlLXeS7in_CijIUkNGFRe2IkVE;-><init>()V
 HPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$0xOTapp1kSvojAdqJGdavUtvjqU;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Landroid/content/ComponentName;I)V
 HPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$0xOTapp1kSvojAdqJGdavUtvjqU;->getOrThrow()Ljava/lang/Object;
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$19j1Aw89Idv-1enlT4bK5AugL5A;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Landroid/content/ComponentName;)V
@@ -14879,6 +15752,8 @@
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$2dnwZdGuTZnM6wwcm6xROcqfwb0;->runOrThrow()V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$2oZRUqH8940wHaVi7eD5XbqxSUs;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService$DevicePolicyData;I[B)V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$2oZRUqH8940wHaVi7eD5XbqxSUs;->getOrThrow()Ljava/lang/Object;
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$34vdcrE1sk8fYjgia11zhA8_E3Q;-><clinit>()V
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$34vdcrE1sk8fYjgia11zhA8_E3Q;-><init>()V
 HSPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$3L30HmY-8WRZNE3mKrX3xDa7_k8;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;I)V
 HSPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$3L30HmY-8WRZNE3mKrX3xDa7_k8;->runOrThrow()V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$3ci-C-bvTQXBAy8k6mmH8aTckko;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Landroid/content/Intent;)V
@@ -14887,10 +15762,14 @@
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$5-nWFGyr7IsWb84Z7EeOMY-GKY4;->runOrThrow()V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$5Xy1SW6FmfM4-7F8ZHPEFhBAJjs;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;ILcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;)V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$5Xy1SW6FmfM4-7F8ZHPEFhBAJjs;->runOrThrow()V
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$5mZ6ds-CQDR-VDBoF6sG93he8gQ;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService$DevicePolicyData;I[B)V
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$5mZ6ds-CQDR-VDBoF6sG93he8gQ;->getOrThrow()Ljava/lang/Object;
 HSPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$6E7MK8TbNUybt8S9CwAdfdcn2x0;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;I)V
 HSPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$6E7MK8TbNUybt8S9CwAdfdcn2x0;->getOrThrow()Ljava/lang/Object;
-PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$6VeZWEdN1dyRdHEAUxfQP-WansI;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;IIZLandroid/content/ComponentName;)V
-PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$6VeZWEdN1dyRdHEAUxfQP-WansI;->runOrThrow()V
+HPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$6VeZWEdN1dyRdHEAUxfQP-WansI;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;IIZLandroid/content/ComponentName;)V
+HPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$6VeZWEdN1dyRdHEAUxfQP-WansI;->runOrThrow()V
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$6paWP8Iq2mGM3L7iYJbBwFidvZw;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;I)V
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$6paWP8Iq2mGM3L7iYJbBwFidvZw;->runOrThrow()V
 HSPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$7Cpvth9RknvcbwQxadY3QRMYuFU;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;I)V
 HSPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$7Cpvth9RknvcbwQxadY3QRMYuFU;->getOrThrow()Ljava/lang/Object;
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$7hl9-Fu55wI3YRCmF3l8IOs19OM;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;I)V
@@ -14919,6 +15798,12 @@
 HPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$9SJKQAytAssuizf9V09cQ9qSuUM;->runOrThrow()V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$9VVtUb5jLgJSmFOsWJ9ANvL9Ep4;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService$DevicePolicyData;I)V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$9VVtUb5jLgJSmFOsWJ9ANvL9Ep4;->getOrThrow()Ljava/lang/Object;
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$9YTcEPPNtERmlntMcA1HnJTOEv0;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;I)V
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$9YTcEPPNtERmlntMcA1HnJTOEv0;->runOrThrow()V
+HPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$ActiveAdmin$Itq6pSsfsSgkuDfqznUMc7YMLwU;-><init>(I)V
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$ActiveAdmin$Itq6pSsfsSgkuDfqznUMc7YMLwU;->test(Ljava/lang/Object;)Z
+HPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$ActiveAdmin$UjhGsndXbfnmx5tCnLRWDR1J0oo;-><init>(I)V
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$ActiveAdmin$UjhGsndXbfnmx5tCnLRWDR1J0oo;->test(Ljava/lang/Object;)Z
 HSPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$BOK8I3WNMlyJrHuv4E5nizuvN9s;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;I)V
 HSPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$BOK8I3WNMlyJrHuv4E5nizuvN9s;->run()V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$BYd2ftVebU2Ktj6tr-DFfrGE5TE;-><clinit>()V
@@ -14941,8 +15826,12 @@
 HSPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$E3l49EGA6UCGqdaOZqz6OFNlTrc;->getOrThrow()Ljava/lang/Object;
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$E9awYavFY3fUvYuziaFPn187V2A;-><init>(ZLandroid/os/RemoteCallback;Landroid/content/ComponentName;Ljava/lang/String;Ljava/lang/String;I)V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$E9awYavFY3fUvYuziaFPn187V2A;->accept(Ljava/lang/Object;)V
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$EkoKuggc6TE3-QevHMGQZJIPdBo;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;ZZ)V
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$EkoKuggc6TE3-QevHMGQZJIPdBo;->runOrThrow()V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$EmW1vJQsSAWrjreihtc0C_PUzE8;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService$DevicePolicyData;I)V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$EmW1vJQsSAWrjreihtc0C_PUzE8;->runOrThrow()V
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$FD5gzkGAzwLbOnYqbEm6nwo8SG4;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Landroid/content/ComponentName;)V
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$FD5gzkGAzwLbOnYqbEm6nwo8SG4;->getOrThrow()Ljava/lang/Object;
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$FH6LDUjPuTrmrHOy8qyq914-6zY;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;ILjava/lang/String;)V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$FH6LDUjPuTrmrHOy8qyq914-6zY;->getOrThrow()Ljava/lang/Object;
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$FJ0XePbVcRlJIcEvTiNAwEn0UoM;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Ljava/lang/CharSequence;)V
@@ -14951,12 +15840,16 @@
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$GdvC4eub6BtkkX5BnHuPR5Ob0ag;-><init>()V
 HPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$GrJ2yAyrcr8_uJK0BCe9i4AcIYc;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Ljava/lang/String;Landroid/os/UserHandle;Ljava/lang/String;Ljava/lang/String;Landroid/content/pm/PackageManager;)V
 HPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$GrJ2yAyrcr8_uJK0BCe9i4AcIYc;->getOrThrow()Ljava/lang/Object;
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$HcMd4ZadwavEkG6fDsHbYm_Wkc8;-><clinit>()V
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$HcMd4ZadwavEkG6fDsHbYm_Wkc8;-><init>()V
 HPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$I2JVUrPjGJeIH9M5tFkFtORoZA0;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Ljava/lang/String;Landroid/os/UserHandle;Ljava/lang/String;Ljava/lang/String;Landroid/content/pm/PackageManager;)V
 HPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$I2JVUrPjGJeIH9M5tFkFtORoZA0;->getOrThrow()Ljava/lang/Object;
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$IFjmfnHIk0cwZ4cu_jTHWTsMxfc;-><init>(ZLandroid/os/RemoteCallback;Landroid/content/ComponentName;Ljava/lang/String;Ljava/lang/String;I)V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$IFjmfnHIk0cwZ4cu_jTHWTsMxfc;->accept(Ljava/lang/Object;)V
 HSPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$IMrqSPgnQFlD9AquL6PEMeRT48A;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;ILcom/android/server/devicepolicy/DevicePolicyManagerService$DevicePolicyData;)V
 HSPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$IMrqSPgnQFlD9AquL6PEMeRT48A;->runOrThrow()V
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$IbKsowM5p__Gy5ZHgDd0XeF9iOo;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Ljava/lang/String;I)V
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$IbKsowM5p__Gy5ZHgDd0XeF9iOo;->getOrThrow()Ljava/lang/Object;
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$IiTDvO4lH6i6MSEHWCEcAk85DDE;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Ljava/lang/String;ILjava/lang/String;)V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$IiTDvO4lH6i6MSEHWCEcAk85DDE;->runOrThrow()V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$IxdwArI8Td_zcuuRujOKZ6JGGTU;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService$DevicePolicyData;I)V
@@ -14965,12 +15858,16 @@
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$J1D7mGzV3_Pe5CkN4SOHvBx0GQM;->getOrThrow()Ljava/lang/Object;
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$JEgkZ2GnVgvzJnS1uvLsrUt2pUs;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Ljava/lang/String;ILjava/lang/String;)V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$JEgkZ2GnVgvzJnS1uvLsrUt2pUs;->runOrThrow()V
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$Ja0SvJXIom5w6SH5rDGlGY5PY4s;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Ljava/lang/String;ZI)V
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$Ja0SvJXIom5w6SH5rDGlGY5PY4s;->getOrThrow()Ljava/lang/Object;
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$Jn1h0KwAOFO-2SLpickAr7b6UEI;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Landroid/content/Intent;)V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$Jn1h0KwAOFO-2SLpickAr7b6UEI;->runOrThrow()V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$KHK1qaoqPOWDaYAcyuftrRCJUsU;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;I)V
 HPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$KHK1qaoqPOWDaYAcyuftrRCJUsU;->getOrThrow()Ljava/lang/Object;
 HPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$KVBXyPBBtnY04KgNMY8kTUc8TDM;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Landroid/content/ComponentName;I)V
 HPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$KVBXyPBBtnY04KgNMY8kTUc8TDM;->getOrThrow()Ljava/lang/Object;
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$KjIYnhbEQukDhcUD9YFvm2m86_I;-><clinit>()V
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$KjIYnhbEQukDhcUD9YFvm2m86_I;-><init>()V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$Kt954vcIuhnBMcd-u6lDaLOaZfM;-><clinit>()V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$Kt954vcIuhnBMcd-u6lDaLOaZfM;-><init>()V
 HPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$Kxt959fEmzAZCuTvdZLLr4ydBwg;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Ljava/lang/String;Landroid/os/Bundle;Landroid/os/UserHandle;Landroid/content/ComponentName;Ljava/lang/String;)V
@@ -14981,7 +15878,7 @@
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$L1BjBKCM4PsL1cN_5wbAOuBRIk8;->getOrThrow()Ljava/lang/Object;
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$L3XzC2X57y8_uXrsW81Qk8KXQTA;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Ljava/lang/CharSequence;)V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$L3XzC2X57y8_uXrsW81Qk8KXQTA;->runOrThrow()V
-PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$L726YSg1ctOhu8vS40p7mI29Hqw;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;I)V
+HPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$L726YSg1ctOhu8vS40p7mI29Hqw;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;I)V
 HPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$L726YSg1ctOhu8vS40p7mI29Hqw;->getOrThrow()Ljava/lang/Object;
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$LocalService$YxQa4ZcUPWKs76meOLw1c_tn1OU;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService$LocalService;I)V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$LocalService$YxQa4ZcUPWKs76meOLw1c_tn1OU;->runOrThrow()V
@@ -15007,6 +15904,8 @@
 HPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$O7VBr2X2LTCZ2rClZ_UwgB-Qoa0;->runOrThrow()V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$O9Moi8sORA4geplcz5N36k_Djo8;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;)V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$O9Moi8sORA4geplcz5N36k_Djo8;->runOrThrow()V
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$OJ8A__Rf2MbVHfdSjP-Rem2wGy8;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;I)V
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$OJ8A__Rf2MbVHfdSjP-Rem2wGy8;->getOrThrow()Ljava/lang/Object;
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$Ohf5PJQmXjsarWisPAuPB8WECX8;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Ljava/lang/String;Ljava/lang/String;)V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$Ohf5PJQmXjsarWisPAuPB8WECX8;->runOrThrow()V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$PQxvRo4LWlTe_I8RQ-J5BqZxYGY;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;I)V
@@ -15015,6 +15914,8 @@
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$PbWvUymvyMNlDpwaJHqqjloqHY0;->getOrThrow()Ljava/lang/Object;
 HPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$QSZZ_1yoXc0KadPc27uY1ijTXpM;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Ljava/lang/String;Landroid/os/UserHandle;)V
 HPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$QSZZ_1yoXc0KadPc27uY1ijTXpM;->getOrThrow()Ljava/lang/Object;
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$QaKYuXaSzuXFDvP2N_Hv0u-6SWM;-><clinit>()V
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$QaKYuXaSzuXFDvP2N_Hv0u-6SWM;-><init>()V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$QeuN0QspI6zzXRv-ZEqptxjR6bc;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;)V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$QeuN0QspI6zzXRv-ZEqptxjR6bc;->getOrThrow()Ljava/lang/Object;
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$Qs_HIEUKv-t71wixXSU0Of8RNKE;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Z)V
@@ -15030,23 +15931,32 @@
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$SJMb3vs5bdgYZlouifkarxp6ak8;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;I)V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$SJMb3vs5bdgYZlouifkarxp6ak8;->runOrThrow()V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$SsK3Zag7hhWHXlzNClBcOqbFDYM;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;ILjava/util/ArrayList;)V
-PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$SsK3Zag7hhWHXlzNClBcOqbFDYM;->runOrThrow()V
+HPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$SsK3Zag7hhWHXlzNClBcOqbFDYM;->runOrThrow()V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$T-DYGQoYs3p1_NgKsVcKRX8fTnA;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService$DevicePolicyData;I)V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$T-DYGQoYs3p1_NgKsVcKRX8fTnA;->getOrThrow()Ljava/lang/Object;
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$T4eSwgayOKOYwmmjCYnPFwO28Pw;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;I)V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$T4eSwgayOKOYwmmjCYnPFwO28Pw;->runOrThrow()V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$ThskFZWEUceNrJT9xsMbJpTtMj4;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;I)V
 HPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$ThskFZWEUceNrJT9xsMbJpTtMj4;->getOrThrow()Ljava/lang/Object;
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$Tue59QgPsjxkqMzjVJAZC46RQg8;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Ljava/lang/String;I)V
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$Tue59QgPsjxkqMzjVJAZC46RQg8;->getOrThrow()Ljava/lang/Object;
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$U9YD7gQ6iZ_5FJUa8YOVVfNkeck;-><clinit>()V
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$U9YD7gQ6iZ_5FJUa8YOVVfNkeck;-><init>()V
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$U9YD7gQ6iZ_5FJUa8YOVVfNkeck;->apply(Ljava/lang/Object;)Ljava/lang/Object;
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$UPnhCNO69TKnF1hSXENMzK_2NSQ;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Ljava/lang/String;ILjava/lang/String;)V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$UPnhCNO69TKnF1hSXENMzK_2NSQ;->runOrThrow()V
-PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$UZjRYMPztw5R7HEv0d62H2OifHg;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Ljava/lang/String;Landroid/os/UserHandle;)V
-PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$UZjRYMPztw5R7HEv0d62H2OifHg;->getOrThrow()Ljava/lang/Object;
+HPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$UZjRYMPztw5R7HEv0d62H2OifHg;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Ljava/lang/String;Landroid/os/UserHandle;)V
+HPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$UZjRYMPztw5R7HEv0d62H2OifHg;->getOrThrow()Ljava/lang/Object;
 HSPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$UZoVWdpJJZwABGNhZWHbxPIvMO4;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;)V
 HSPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$UZoVWdpJJZwABGNhZWHbxPIvMO4;->runOrThrow()V
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$UlBCHsxRAKclaeuTOUj9xolbrSE;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Landroid/content/Intent;Landroid/os/UserHandle;Landroid/os/IBinder;Z)V
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$UlBCHsxRAKclaeuTOUj9xolbrSE;->runOrThrow()V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$VDIwg4X1iKAqFvQldV7uz3FQETk;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;ZILandroid/content/Context;J)V
 HPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$VDIwg4X1iKAqFvQldV7uz3FQETk;->runOrThrow()V
-PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$VnVMpzZ38K9VY5q76LFE7Pg8Ojk;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Ljava/lang/String;Landroid/os/Bundle;Landroid/os/UserHandle;Landroid/content/ComponentName;Ljava/lang/String;)V
-PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$VnVMpzZ38K9VY5q76LFE7Pg8Ojk;->runOrThrow()V
+HPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$Vg0S0XWRLxc15dP0DNjWoFnOlo4;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;)V
+HPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$Vg0S0XWRLxc15dP0DNjWoFnOlo4;->getOrThrow()Ljava/lang/Object;
+HPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$VnVMpzZ38K9VY5q76LFE7Pg8Ojk;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Ljava/lang/String;Landroid/os/Bundle;Landroid/os/UserHandle;Landroid/content/ComponentName;Ljava/lang/String;)V
+HPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$VnVMpzZ38K9VY5q76LFE7Pg8Ojk;->runOrThrow()V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$Vx-CgHEULlhhYTHNaAhW9C49Ln4;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Ljava/lang/CharSequence;)V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$Vx-CgHEULlhhYTHNaAhW9C49Ln4;->runOrThrow()V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$W0PqT_DujOnRfFtIRJT9BUc0AKo;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Landroid/content/ComponentName;I)V
@@ -15057,11 +15967,13 @@
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$X8P9YSbXKt6AGKQrPiFxyDc-HJQ;->runOrThrow()V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$X8ssNAYCaueT78i6KH-xMYuutXA;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Landroid/content/ComponentName;)V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$X8ssNAYCaueT78i6KH-xMYuutXA;->getOrThrow()Ljava/lang/Object;
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$XTbgM9VkDoAYldrIQCtK-Qid1Cs;-><init>(Landroid/content/pm/CrossProfileApps;Ljava/util/List;Ljava/util/List;)V
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$XTbgM9VkDoAYldrIQCtK-Qid1Cs;->runOrThrow()V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$Xc3Cc89KBImtyHAgMzs8CxA-vt4;-><clinit>()V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$Xc3Cc89KBImtyHAgMzs8CxA-vt4;-><init>()V
-PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$Y60DjdFMzpV5YEEtub3axIwYGT4;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Ljava/lang/String;Ljava/lang/String;)V
+HPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$Y60DjdFMzpV5YEEtub3axIwYGT4;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Ljava/lang/String;Ljava/lang/String;)V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$Y60DjdFMzpV5YEEtub3axIwYGT4;->runOrThrow()V
-PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$YUdRHstauCgFOjok0Bqvn4hAUiY;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;I)V
+HPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$YUdRHstauCgFOjok0Bqvn4hAUiY;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;I)V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$YUdRHstauCgFOjok0Bqvn4hAUiY;->getOrThrow()Ljava/lang/Object;
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$Yha2g5948Y6-99_Zk6qnSQ08xaY;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Landroid/content/ComponentName;)V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$Yha2g5948Y6-99_Zk6qnSQ08xaY;->getOrThrow()Ljava/lang/Object;
@@ -15101,8 +16013,8 @@
 HSPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$d08rPNL3sI-Hx7ZpnR_dxsBLZmk;->getOrThrow()Ljava/lang/Object;
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$dhmKG9Egag2TPEwukGPiev6dT70;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Landroid/content/ComponentName;)V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$dhmKG9Egag2TPEwukGPiev6dT70;->getOrThrow()Ljava/lang/Object;
-PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$e1b7933wrj9WzETz2PImYXO7S8k;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Ljava/lang/String;I)V
-PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$e1b7933wrj9WzETz2PImYXO7S8k;->getOrThrow()Ljava/lang/Object;
+HPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$e1b7933wrj9WzETz2PImYXO7S8k;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Ljava/lang/String;I)V
+HPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$e1b7933wrj9WzETz2PImYXO7S8k;->getOrThrow()Ljava/lang/Object;
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$e2DzcGWRwnNdKo6blzNAob0HsSw;-><init>(ZLandroid/os/RemoteCallback;Landroid/content/ComponentName;Ljava/lang/String;Ljava/lang/String;I)V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$e2DzcGWRwnNdKo6blzNAob0HsSw;->accept(Ljava/lang/Object;)V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$e7c2huGjk3obVFka43jMbcJT0E8;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService$DevicePolicyData;I)V
@@ -15137,24 +16049,36 @@
 HPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$iojPtiJXnnFJDsa0P-LGE6gfikU;->getOrThrow()Ljava/lang/Object;
 HSPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$jDU7UhnyXuItN3e_DVSz6WUa7Qc;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Z)V
 HSPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$jDU7UhnyXuItN3e_DVSz6WUa7Qc;->runOrThrow()V
-PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$jZJHZdHi2d2IGPmtF3qkyCAED30;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Ljava/lang/String;I)V
-PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$jZJHZdHi2d2IGPmtF3qkyCAED30;->getOrThrow()Ljava/lang/Object;
+HPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$jZJHZdHi2d2IGPmtF3qkyCAED30;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Ljava/lang/String;I)V
+HPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$jZJHZdHi2d2IGPmtF3qkyCAED30;->getOrThrow()Ljava/lang/Object;
 HPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$ja_JdZk-BJUe5rbQuU_LxLblBfM;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Ljava/lang/String;Landroid/os/UserHandle;Ljava/lang/String;Ljava/lang/String;Landroid/content/pm/PackageManager;)V
 HPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$ja_JdZk-BJUe5rbQuU_LxLblBfM;->getOrThrow()Ljava/lang/Object;
 HPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$jgsUvRSr_6U0Lrv4PXbJtZQe_Mk;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Ljava/lang/String;Landroid/os/UserHandle;)V
 HPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$jgsUvRSr_6U0Lrv4PXbJtZQe_Mk;->getOrThrow()Ljava/lang/Object;
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$k1aeXXPfcL4BEPifLdQ_HeHTYtE;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;)V
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$k1aeXXPfcL4BEPifLdQ_HeHTYtE;->runOrThrow()V
+HPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$k97we0j9gw3Z9EdXinG0TR_NU7k;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Ljava/lang/String;ILjava/lang/String;)V
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$k97we0j9gw3Z9EdXinG0TR_NU7k;->runOrThrow()V
+HPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$kzCB3cpjvS2pCtQyc2yL_59Hjmo;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Landroid/net/ProxyInfo;)V
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$kzCB3cpjvS2pCtQyc2yL_59Hjmo;->runOrThrow()V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$l1-j9XdvuDdp7fQsY_n_Pv6CP3A;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Ljava/lang/String;I)V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$l1-j9XdvuDdp7fQsY_n_Pv6CP3A;->getOrThrow()Ljava/lang/Object;
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$lG9keASbSI5H2nDJOOi-80s_LvI;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;)V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$lG9keASbSI5H2nDJOOi-80s_LvI;->getOrThrow()Ljava/lang/Object;
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$lK5BidM6lcqUIXu-zn-0ok4Byrw;-><clinit>()V
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$lK5BidM6lcqUIXu-zn-0ok4Byrw;-><init>()V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$ll5SYJlZ-SYytCFFeQAWfuFB9CQ;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Landroid/content/Intent;)V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$ll5SYJlZ-SYytCFFeQAWfuFB9CQ;->runOrThrow()V
 HPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$lmsiKzZN5DKHTzgWChWAyGfrxwk;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Ljava/lang/String;Landroid/os/UserHandle;Ljava/lang/String;Ljava/lang/String;Landroid/content/pm/PackageManager;)V
 HPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$lmsiKzZN5DKHTzgWChWAyGfrxwk;->getOrThrow()Ljava/lang/Object;
 HSPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$m2h-vVM6u7Yweb_QNLSUAbWduj8;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;)V
 HSPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$m2h-vVM6u7Yweb_QNLSUAbWduj8;->runOrThrow()V
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$m7cf0Wm-YCT36G5vm9BHBTkN2Dw;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;ILjava/lang/String;Landroid/content/ComponentName;)V
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$m7cf0Wm-YCT36G5vm9BHBTkN2Dw;->runOrThrow()V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$m7rLjOikh2mbiVKjWDn3GBpideo;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;I)V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$m7rLjOikh2mbiVKjWDn3GBpideo;->runOrThrow()V
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$mA1nIQOPNM7xME8EHEAdwVxXCcA;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Landroid/content/Intent;)V
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$mA1nIQOPNM7xME8EHEAdwVxXCcA;->runOrThrow()V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$mBXxcFZAZnjzw9sY7LWPSdbiolE;-><clinit>()V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$mBXxcFZAZnjzw9sY7LWPSdbiolE;-><init>()V
 HSPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$mF6fAm3fr7FHqqfmNeO86iULgao;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Landroid/content/Intent;I)V
@@ -15167,10 +16091,18 @@
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$mwS7r1mDY-UqllmCI-ssTA9SQHo;->getOrThrow()Ljava/lang/Object;
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$mz0ziCw2lQO5CMfb_mYqf3ka0bw;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;ILjava/util/ArrayList;)V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$mz0ziCw2lQO5CMfb_mYqf3ka0bw;->runOrThrow()V
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$n5wbyGJW257bOEev6G_jcQYpupI;-><clinit>()V
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$n5wbyGJW257bOEev6G_jcQYpupI;-><init>()V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$nBM3fQ_95BD262BpQ3v_i1LTo9o;-><clinit>()V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$nBM3fQ_95BD262BpQ3v_i1LTo9o;-><init>()V
-PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$oLfRfy_OZS9YkdF7nu-kG1zUnKQ;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;IZ)V
-PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$oLfRfy_OZS9YkdF7nu-kG1zUnKQ;->getOrThrow()Ljava/lang/Object;
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$nvS6eId_3TI_nUpbtuGBokzSIo8;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;ILjava/lang/String;)V
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$nvS6eId_3TI_nUpbtuGBokzSIo8;->getOrThrow()Ljava/lang/Object;
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$oK0EslQ2AGZoR7-DnuE_MTUAZeI;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService$DevicePolicyData;I)V
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$oK0EslQ2AGZoR7-DnuE_MTUAZeI;->runOrThrow()V
+HPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$oLfRfy_OZS9YkdF7nu-kG1zUnKQ;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;IZ)V
+HPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$oLfRfy_OZS9YkdF7nu-kG1zUnKQ;->getOrThrow()Ljava/lang/Object;
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$oV2jr6PYfDWs8kBqobr7VD9-LLU;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;ILcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;)V
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$oV2jr6PYfDWs8kBqobr7VD9-LLU;->runOrThrow()V
 HPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$p6M2CJuZlA3Rm0CLLTJMm5qd9vU;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;IZ)V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$p6M2CJuZlA3Rm0CLLTJMm5qd9vU;->getOrThrow()Ljava/lang/Object;
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$pB-F_F3AnR9oCMg1VlOwhTrZ6Mk;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;I)V
@@ -15179,6 +16111,8 @@
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$paNWzEukGonqKHGYa2dcIYm1m9I;-><init>()V
 HSPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$peeHTd988oQjHrGFppwrwfdKZU4;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;I)V
 HSPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$peeHTd988oQjHrGFppwrwfdKZU4;->getOrThrow()Ljava/lang/Object;
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$pjK3LWzkYCysXWNeON2CzGHVugk;-><init>(ZLandroid/os/RemoteCallback;Landroid/content/ComponentName;Ljava/lang/String;Ljava/lang/String;I)V
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$pjK3LWzkYCysXWNeON2CzGHVugk;->accept(Ljava/lang/Object;)V
 HPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$pvoZ9UODcnSUe5AiOPUs_KioH8k;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;IZ)V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$pvoZ9UODcnSUe5AiOPUs_KioH8k;->getOrThrow()Ljava/lang/Object;
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$q1YIiSRAwpEOOKy6rKvYkFzQHpo;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;)V
@@ -15195,6 +16129,8 @@
 HPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$t4Io6BbYuqAYt9FXHbilhzTSiHU;->getOrThrow()Ljava/lang/Object;
 HPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$tAgDO0b7hXUD7MGkHfgPTDV4o6g;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Landroid/content/ComponentName;I)V
 HPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$tAgDO0b7hXUD7MGkHfgPTDV4o6g;->getOrThrow()Ljava/lang/Object;
+HPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$tHheKyHzd2-5I5LCD3ROkSZDHC0;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Ljava/lang/String;Ljava/lang/String;)V
+HPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$tHheKyHzd2-5I5LCD3ROkSZDHC0;->runOrThrow()V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$tN28Me5AH2pjgYHvPnMAsCjK_NU;-><clinit>()V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$tN28Me5AH2pjgYHvPnMAsCjK_NU;-><init>()V
 HPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$tP1hXBdmtI9IE10B4g20hA1qEA4;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;IILjava/lang/String;)V
@@ -15217,8 +16153,12 @@
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$uscGE01UNkxETEanV-Gb-ZwPjKI;->run()V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$vR-RWtti8ewEGuhsA0IoU86GAmo;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Landroid/content/ComponentName;I)V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$vR-RWtti8ewEGuhsA0IoU86GAmo;->runOrThrow()V
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$vT_QnqFgjh3LMaMTwq65qCK_WUU;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Landroid/content/ComponentName;IZLandroid/app/admin/DeviceAdminInfo;Lcom/android/server/devicepolicy/DevicePolicyManagerService$DevicePolicyData;Landroid/os/Bundle;)V
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$vT_QnqFgjh3LMaMTwq65qCK_WUU;->runOrThrow()V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$vsNaZOHvF-kWqLDfhyiTAaRLpQU;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Landroid/content/Intent;)V
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$vsNaZOHvF-kWqLDfhyiTAaRLpQU;->runOrThrow()V
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$wUMG9dtVUgNOBUyp4nmb0E8C-FY;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;ILandroid/content/Intent;)V
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$wUMG9dtVUgNOBUyp4nmb0E8C-FY;->runOrThrow()V
 HPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$wdjKJZZQbwUvNkCxj7a-RCOB9p8;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Ljava/lang/String;Landroid/os/UserHandle;)V
 HPLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$wdjKJZZQbwUvNkCxj7a-RCOB9p8;->getOrThrow()Ljava/lang/Object;
 PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$wv3ENyztVnJQ2NQstjeqTDWle-E;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;)V
@@ -15298,16 +16238,24 @@
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService$8;->run()V
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;-><clinit>()V
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;-><init>(Landroid/app/admin/DeviceAdminInfo;Z)V
+HPLcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;->addSyntheticRestrictions(Landroid/os/Bundle;)Landroid/os/Bundle;
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;->dump(Lcom/android/internal/util/IndentingPrintWriter;)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;->ensureUserRestrictions()Landroid/os/Bundle;
+HPLcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;->filterRestrictions(Landroid/os/Bundle;Ljava/util/function/Predicate;)Landroid/os/Bundle;
+HPLcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;->getEffectiveRestrictions()Landroid/os/Bundle;
+HPLcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;->getGlobalUserRestrictions(I)Landroid/os/Bundle;
+HPLcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;->getLocalUserRestrictions(I)Landroid/os/Bundle;
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;->getParentActiveAdmin()Lcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;
 PLcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;->getUid()I
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;->getUserHandle()Landroid/os/UserHandle;
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;->hasParentActiveAdmin()Z
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;->hasUserRestrictions()Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;->lambda$getGlobalUserRestrictions$1(ILjava/lang/String;)Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;->lambda$getLocalUserRestrictions$0(ILjava/lang/String;)Z
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;->readAttributeValues(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;Ljava/util/Collection;)V
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;->readFromXml(Lorg/xmlpull/v1/XmlPullParser;Z)V
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;->readPackageList(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;)Ljava/util/List;
+HPLcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;->removeDeprecatedRestrictions(Landroid/os/Bundle;)Landroid/os/Bundle;
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;->writeAttributeValueToXml(Lorg/xmlpull/v1/XmlSerializer;Ljava/lang/String;I)V
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;->writeAttributeValueToXml(Lorg/xmlpull/v1/XmlSerializer;Ljava/lang/String;J)V
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;->writeAttributeValueToXml(Lorg/xmlpull/v1/XmlSerializer;Ljava/lang/String;Z)V
@@ -15363,6 +16311,7 @@
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->newTransferOwnershipMetadataManager()Lcom/android/server/devicepolicy/TransferOwnershipMetadataManager;
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->pendingIntentGetBroadcast(Landroid/content/Context;ILandroid/content/Intent;I)Landroid/app/PendingIntent;
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->postOnSystemServerInitThreadPool(Ljava/lang/Runnable;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->powerManagerGoToSleep(JII)V
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->registerContentObserver(Landroid/net/Uri;ZLandroid/database/ContentObserver;I)V
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->runCryptoSelfTest()V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->securityLogGetLoggingEnabledProperty()Z
@@ -15394,11 +16343,13 @@
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService$LocalService;->addOnCrossProfileWidgetProvidersChangeListener(Landroid/app/admin/DevicePolicyManagerInternal$OnCrossProfileWidgetProvidersChangeListener;)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService$LocalService;->broadcastIntentToCrossProfileManifestReceiversAsUser(Landroid/content/Intent;Landroid/os/UserHandle;Z)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService$LocalService;->canSilentlyInstallPackage(Ljava/lang/String;I)Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$LocalService;->checkCrossProfilePackagePermissions(Ljava/lang/String;IZ)Z
 PLcom/android/server/devicepolicy/DevicePolicyManagerService$LocalService;->getAllCrossProfilePackages()Ljava/util/List;
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService$LocalService;->getCrossProfileWidgetProviders(I)Ljava/util/List;
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService$LocalService;->getDevicePolicyCache()Landroid/app/admin/DevicePolicyCache;
 PLcom/android/server/devicepolicy/DevicePolicyManagerService$LocalService;->getDeviceStateCache()Landroid/app/admin/DeviceStateCache;
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService$LocalService;->isActiveAdminWithPolicy(II)Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$LocalService;->isPackageEnabled(Ljava/lang/String;I)Z
 PLcom/android/server/devicepolicy/DevicePolicyManagerService$LocalService;->isUserAffiliatedWithDevice(I)Z
 PLcom/android/server/devicepolicy/DevicePolicyManagerService$LocalService;->lambda$reportSeparateProfileChallengeChanged$0$DevicePolicyManagerService$LocalService(I)V
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService$LocalService;->notifyCrossProfileProvidersChanged(ILjava/util/List;)V
@@ -15420,24 +16371,36 @@
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->access$1600(Lcom/android/server/devicepolicy/DevicePolicyManagerService;I)Z
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->access$1700(Lcom/android/server/devicepolicy/DevicePolicyManagerService;IZ)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->access$1700(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Z)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->access$1800(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Ljava/lang/String;I)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->access$1900(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Landroid/content/ComponentName;I)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->access$1900(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Z)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->access$2000(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Ljava/lang/String;I)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->access$2000(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Z)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->access$2200()Ljava/util/Set;
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->access$2300(Lcom/android/server/devicepolicy/DevicePolicyManagerService;I)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->access$2400(Lcom/android/server/devicepolicy/DevicePolicyManagerService;)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->access$2500(Lcom/android/server/devicepolicy/DevicePolicyManagerService;I)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->access$2600(Lcom/android/server/devicepolicy/DevicePolicyManagerService;)V
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->access$2600(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Landroid/content/ComponentName;II)Lcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->access$2700(Lcom/android/server/devicepolicy/DevicePolicyManagerService;I)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->access$2800(Lcom/android/server/devicepolicy/DevicePolicyManagerService;I)Z
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->access$2800(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Landroid/content/ComponentName;II)Lcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->access$2900(Lcom/android/server/devicepolicy/DevicePolicyManagerService;)Lcom/android/server/devicepolicy/DevicePolicyCacheImpl;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->access$2900(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Landroid/content/ComponentName;II)Lcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->access$3000(Lcom/android/server/devicepolicy/DevicePolicyManagerService;)Lcom/android/server/devicepolicy/DeviceStateCacheImpl;
+HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->access$3000(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Landroid/content/ComponentName;II)Lcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->access$3100(Lcom/android/server/devicepolicy/DevicePolicyManagerService;)Lcom/android/server/devicepolicy/DevicePolicyCacheImpl;
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->access$3100(Lcom/android/server/devicepolicy/DevicePolicyManagerService;I)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->access$3200(Lcom/android/server/devicepolicy/DevicePolicyManagerService;)Lcom/android/server/devicepolicy/DevicePolicyCacheImpl;
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->access$3200(Lcom/android/server/devicepolicy/DevicePolicyManagerService;)Lcom/android/server/devicepolicy/DeviceStateCacheImpl;
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->access$3200(Lcom/android/server/devicepolicy/DevicePolicyManagerService;I)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->access$3200(Lcom/android/server/devicepolicy/DevicePolicyManagerService;I)Z
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->access$3300(Lcom/android/server/devicepolicy/DevicePolicyManagerService;)Lcom/android/server/devicepolicy/DevicePolicyCacheImpl;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->access$3300(Lcom/android/server/devicepolicy/DevicePolicyManagerService;)Lcom/android/server/devicepolicy/DeviceStateCacheImpl;
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->access$3400(Lcom/android/server/devicepolicy/DevicePolicyManagerService;)Lcom/android/server/devicepolicy/DeviceStateCacheImpl;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->access$3500(Lcom/android/server/devicepolicy/DevicePolicyManagerService;I)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->access$3500(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Ljava/lang/String;Landroid/os/IBinder;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->access$3600(Lcom/android/server/devicepolicy/DevicePolicyManagerService;I)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->access$3700(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Ljava/lang/String;Landroid/os/IBinder;)V
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->access$600(Lcom/android/server/devicepolicy/DevicePolicyManagerService;)Z
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->access$700(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Z)V
@@ -15447,7 +16410,9 @@
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->addCrossProfileWidgetProvider(Landroid/content/ComponentName;Ljava/lang/String;)Z
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->addOrRemoveDisableCameraRestriction(Landroid/os/Bundle;I)Landroid/os/Bundle;
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->addOrRemoveDisableCameraRestriction(Landroid/os/Bundle;Lcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;)Landroid/os/Bundle;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->addPersistentPreferredActivity(Landroid/content/ComponentName;Landroid/content/IntentFilter;Landroid/content/ComponentName;)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->applyManagedProfileRestrictionIfDeviceOwnerLocked()V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->applyPersonalAppsSuspension(II)V
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->applyPersonalAppsSuspension(IZ)V
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->areAllUsersAffiliatedWithDeviceLocked()Z
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->canProfileOwnerAccessDeviceIds(I)Z
@@ -15466,6 +16431,7 @@
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->choosePrivateKeyAlias(ILandroid/net/Uri;Ljava/lang/String;Landroid/os/IBinder;)V
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->cleanUpOldUsers()V
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->clearCrossProfileIntentFilters(Landroid/content/ComponentName;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->clearPackagePersistentPreferredActivities(Landroid/content/ComponentName;Ljava/lang/String;)V
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->clearPersonalAppsSuspendedNotification()V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->createAdminSupportIntent(Ljava/lang/String;)Landroid/content/Intent;
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->discardDeviceWideLogsLocked()V
@@ -15482,6 +16448,7 @@
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->enforceCanManageProfileAndDeviceOwners()V
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->enforceCanManageScope(Landroid/content/ComponentName;Ljava/lang/String;ILjava/lang/String;)V
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->enforceCanManageScopeOrCheckPermission(Landroid/content/ComponentName;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->enforceCanSetDeviceOwnerLocked(Landroid/content/ComponentName;IZ)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->enforceCanSetProfileOwnerLocked(Landroid/content/ComponentName;IZ)V
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->enforceCrossUsersPermission(I)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->enforceDeviceOwner(Landroid/content/ComponentName;)V
@@ -15542,6 +16509,7 @@
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getCrossProfileCalendarPackagesForUser(I)Ljava/util/List;
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getCrossProfileCallerIdDisabledForUser(I)Z
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getCrossProfileContactsSearchDisabledForUser(I)Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getCrossProfilePackages(Landroid/content/ComponentName;)Ljava/util/List;
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getCrossProfilePackagesForAdmins(Ljava/util/List;)Ljava/util/List;
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getCrossProfileWidgetProviders(Landroid/content/ComponentName;)Ljava/util/List;
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getCurrentFailedPasswordAttempts(IZ)I
@@ -15551,6 +16519,7 @@
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getDeviceOrProfileOwnerAdminLocked(I)Lcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getDeviceOwnerAdminLocked()Lcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getDeviceOwnerComponent(Z)Landroid/content/ComponentName;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getDeviceOwnerOrProfileOwnerOfOrganizationOwnedDeviceLocked(I)Lcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getDeviceOwnerOrganizationName()Ljava/lang/CharSequence;
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getDeviceOwnerRemoteBugreportUri()Ljava/lang/String;
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getDeviceOwnerUserId()I
@@ -15571,7 +16540,7 @@
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getMeteredDisabledPackagesLocked(I)Ljava/util/Set;
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getMinimumStrongAuthTimeoutMs()J
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getOrganizationNameForUser(I)Ljava/lang/CharSequence;
-PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getOrganizationOwnedProfileUserId()I
+HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getOrganizationOwnedProfileUserId()I
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getOwnerComponent(I)Landroid/content/ComponentName;
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getOwnerInstalledCaCerts(Landroid/os/UserHandle;)Landroid/content/pm/StringParceledListSlice;
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getPasswordComplexity(Z)I
@@ -15619,6 +16588,7 @@
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getUserProvisioningState()I
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getUserProvisioningState(I)I
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getWifiMacAddress(Landroid/content/ComponentName;)Ljava/lang/String;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->handleNewPackageInstalled(Ljava/lang/String;I)V
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->handlePackagesChanged(Ljava/lang/String;I)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->handlePasswordExpirationNotification(I)V
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->handleStartUser(I)V
@@ -15636,11 +16606,15 @@
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isActivePasswordSufficientForUserLocked(ZLandroid/app/admin/PasswordMetrics;IZ)Z
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->isAdb()Z
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isAdminActive(Landroid/content/ComponentName;I)Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->isAffiliatedUser()Z
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isApplicationHidden(Landroid/content/ComponentName;Ljava/lang/String;Ljava/lang/String;)Z
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isApplicationHidden(Landroid/content/ComponentName;Ljava/lang/String;Ljava/lang/String;Z)Z
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->isBackupServiceEnabled(Landroid/content/ComponentName;)Z
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isCallerDelegate(Ljava/lang/String;ILjava/lang/String;)Z
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isCallerWithSystemUid()Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->isCallingFromPackage(Ljava/lang/String;I)Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->isCommonCriteriaModeEnabled(Landroid/content/ComponentName;)Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->isCrossProfileQuickContactDisabled(I)Z
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->isCurrentInputMethodSetByOwner()Z
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isCurrentUserDemo()Z
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isDeviceOwner(Landroid/content/ComponentName;I)Z
@@ -15648,6 +16622,8 @@
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->isDeviceOwnerPackage(Ljava/lang/String;I)Z
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->isDeviceProvisioned()Z
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->isEncryptionSupported()Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->isEphemeralUser(Landroid/content/ComponentName;)Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->isInputMethodPermittedByAdmin(Landroid/content/ComponentName;Ljava/lang/String;I)Z
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->isLimitPasswordAllowed(Lcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;I)Z
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isLockTaskPermitted(Ljava/lang/String;)Z
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isLogoutEnabled()Z
@@ -15657,7 +16633,7 @@
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isNetworkLoggingEnabled(Landroid/content/ComponentName;Ljava/lang/String;)Z
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isNetworkLoggingEnabledInternalLocked()Z
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isNotificationListenerServicePermitted(Ljava/lang/String;I)Z
-PLcom/android/server/devicepolicy/DevicePolicyManagerService;->isOrganizationOwnedDeviceWithManagedProfile()Z
+HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isOrganizationOwnedDeviceWithManagedProfile()Z
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->isPackageInstalledForUser(Ljava/lang/String;I)Z
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isPackageSuspended(Landroid/content/ComponentName;Ljava/lang/String;Ljava/lang/String;)Z
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->isPackageTestOnly(Ljava/lang/String;I)Z
@@ -15672,8 +16648,10 @@
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isRemovedPackage(Ljava/lang/String;Ljava/lang/String;I)Z
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->isRemovingAdmin(Landroid/content/ComponentName;I)Z
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isResetPasswordTokenActive(Landroid/content/ComponentName;)Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->isResetPasswordTokenActiveForUserLocked(I)Z
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->isRuntimePermission(Ljava/lang/String;)Z
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isSecondaryLockscreenEnabled(I)Z
+HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isSecondaryLockscreenEnabled(Landroid/os/UserHandle;)Z
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->isSecurityLoggingEnabled(Landroid/content/ComponentName;)Z
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isSeparateProfileChallengeAllowed(I)Z
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isSeparateProfileChallengeEnabled(I)Z
@@ -15689,10 +16667,11 @@
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$areAllUsersAffiliatedWithDeviceLocked$81$DevicePolicyManagerService()Ljava/lang/Boolean;
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$areAllUsersAffiliatedWithDeviceLocked$82$DevicePolicyManagerService()Ljava/lang/Boolean;
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$areAllUsersAffiliatedWithDeviceLocked$83$DevicePolicyManagerService()Ljava/lang/Boolean;
-PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$areAllUsersAffiliatedWithDeviceLocked$84$DevicePolicyManagerService()Ljava/lang/Boolean;
+HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$areAllUsersAffiliatedWithDeviceLocked$84$DevicePolicyManagerService()Ljava/lang/Boolean;
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$choosePrivateKeyAlias$23$DevicePolicyManagerService(Landroid/content/Intent;Landroid/os/UserHandle;Landroid/os/IBinder;Z)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$choosePrivateKeyAlias$24$DevicePolicyManagerService(Landroid/content/Intent;Landroid/os/UserHandle;Landroid/os/IBinder;Z)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$choosePrivateKeyAlias$25$DevicePolicyManagerService(Landroid/content/Intent;Landroid/os/UserHandle;Landroid/os/IBinder;Z)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$choosePrivateKeyAlias$26$DevicePolicyManagerService(Landroid/content/Intent;Landroid/os/UserHandle;Landroid/os/IBinder;Z)V
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$clearPersonalAppsSuspendedNotification$104$DevicePolicyManagerService()V
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$clearPersonalAppsSuspendedNotification$105$DevicePolicyManagerService()V
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$clearPersonalAppsSuspendedNotification$106$DevicePolicyManagerService()V
@@ -15710,12 +16689,13 @@
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$getAlwaysOnVpnPackage$28$DevicePolicyManagerService(I)Ljava/lang/String;
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$getApplicationLabel$47$DevicePolicyManagerService(ILjava/lang/String;)Ljava/lang/String;
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$getApplicationLabel$48$DevicePolicyManagerService(ILjava/lang/String;)Ljava/lang/String;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$getApplicationLabel$50$DevicePolicyManagerService(ILjava/lang/String;)Ljava/lang/String;
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$getApplicationRestrictions$54$DevicePolicyManagerService(Ljava/lang/String;Landroid/os/UserHandle;)Landroid/os/Bundle;
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$getApplicationRestrictions$55$DevicePolicyManagerService(Ljava/lang/String;Landroid/os/UserHandle;)Landroid/os/Bundle;
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$getApplicationRestrictions$56$DevicePolicyManagerService(Ljava/lang/String;Landroid/os/UserHandle;)Landroid/os/Bundle;
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$getApplicationRestrictions$57$DevicePolicyManagerService(Ljava/lang/String;Landroid/os/UserHandle;)Landroid/os/Bundle;
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$getApplicationRestrictions$58$DevicePolicyManagerService(Ljava/lang/String;Landroid/os/UserHandle;)Landroid/os/Bundle;
-PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$getApplicationRestrictions$59$DevicePolicyManagerService(Ljava/lang/String;Landroid/os/UserHandle;)Landroid/os/Bundle;
+HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$getApplicationRestrictions$59$DevicePolicyManagerService(Ljava/lang/String;Landroid/os/UserHandle;)Landroid/os/Bundle;
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$getBindDeviceAdminTargetUsers$73$DevicePolicyManagerService(Landroid/content/ComponentName;I)Ljava/util/ArrayList;
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$getBindDeviceAdminTargetUsers$74$DevicePolicyManagerService(Landroid/content/ComponentName;I)Ljava/util/ArrayList;
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$getBindDeviceAdminTargetUsers$76$DevicePolicyManagerService(Landroid/content/ComponentName;I)Ljava/util/ArrayList;
@@ -15728,8 +16708,9 @@
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$getCredentialOwner$49$DevicePolicyManagerService(IZ)Ljava/lang/Integer;
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$getCredentialOwner$50$DevicePolicyManagerService(IZ)Ljava/lang/Integer;
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$getCredentialOwner$51$DevicePolicyManagerService(IZ)Ljava/lang/Integer;
-PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$getCredentialOwner$52$DevicePolicyManagerService(IZ)Ljava/lang/Integer;
+HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$getCredentialOwner$52$DevicePolicyManagerService(IZ)Ljava/lang/Integer;
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$getPasswordHistoryLength$10(Lcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;)Ljava/lang/Integer;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$getPasswordHistoryLength$13(Lcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;)Ljava/lang/Integer;
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$getPermissionGrantState$66$DevicePolicyManagerService(Ljava/lang/String;Landroid/os/UserHandle;Ljava/lang/String;Ljava/lang/String;Landroid/content/pm/PackageManager;)Ljava/lang/Integer;
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$getPermissionGrantState$67$DevicePolicyManagerService(Ljava/lang/String;Landroid/os/UserHandle;Ljava/lang/String;Ljava/lang/String;Landroid/content/pm/PackageManager;)Ljava/lang/Integer;
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$getPermissionGrantState$69$DevicePolicyManagerService(Ljava/lang/String;Landroid/os/UserHandle;Ljava/lang/String;Ljava/lang/String;Landroid/content/pm/PackageManager;)Ljava/lang/Integer;
@@ -15760,10 +16741,15 @@
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$getWifiMacAddress$77$DevicePolicyManagerService(Landroid/content/ComponentName;)Ljava/lang/String;
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$getWifiMacAddress$78$DevicePolicyManagerService(Landroid/content/ComponentName;)Ljava/lang/String;
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$getWifiMacAddress$79$DevicePolicyManagerService(Landroid/content/ComponentName;)Ljava/lang/String;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$getWifiMacAddress$80$DevicePolicyManagerService(Landroid/content/ComponentName;)Ljava/lang/String;
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$isApplicationHidden$59$DevicePolicyManagerService(Ljava/lang/String;I)Ljava/lang/Boolean;
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$isApplicationHidden$60$DevicePolicyManagerService(Ljava/lang/String;I)Ljava/lang/Boolean;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$isApplicationHidden$63$DevicePolicyManagerService(Ljava/lang/String;I)Ljava/lang/Boolean;
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$isCallingFromPackage$104$DevicePolicyManagerService(Ljava/lang/String;I)Ljava/lang/Boolean;
-PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$isCallingFromPackage$105$DevicePolicyManagerService(Ljava/lang/String;I)Ljava/lang/Boolean;
+HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$isCallingFromPackage$105$DevicePolicyManagerService(Ljava/lang/String;I)Ljava/lang/Boolean;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$isEphemeralUser$58$DevicePolicyManagerService(I)Ljava/lang/Boolean;
+HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$isOrganizationOwnedDeviceWithManagedProfile$46$DevicePolicyManagerService()Ljava/lang/Boolean;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$isPackageInstalledForUser$79$DevicePolicyManagerService(Ljava/lang/String;I)Ljava/lang/Boolean;
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$isResetPasswordTokenActive$80$DevicePolicyManagerService(Lcom/android/server/devicepolicy/DevicePolicyManagerService$DevicePolicyData;I)Ljava/lang/Boolean;
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$isResetPasswordTokenActive$81$DevicePolicyManagerService(Lcom/android/server/devicepolicy/DevicePolicyManagerService$DevicePolicyData;I)Ljava/lang/Boolean;
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$isResetPasswordTokenActive$83$DevicePolicyManagerService(Lcom/android/server/devicepolicy/DevicePolicyManagerService$DevicePolicyData;I)Ljava/lang/Boolean;
@@ -15781,32 +16767,41 @@
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$loadAdminDataAsync$4$DevicePolicyManagerService()V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$loadAdminDataAsync$5$DevicePolicyManagerService()V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$maybeClearLockTaskPolicyLocked$62$DevicePolicyManagerService()V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$maybeClearLockTaskPolicyLocked$65$DevicePolicyManagerService()V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$maybeResumeDeviceWideLoggingLocked$90$DevicePolicyManagerService(ZZ)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$notifyPendingSystemUpdate$64$DevicePolicyManagerService(Landroid/content/Intent;)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$notifyPendingSystemUpdate$65$DevicePolicyManagerService(Landroid/content/Intent;)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$notifyPendingSystemUpdate$67$DevicePolicyManagerService(Landroid/content/Intent;)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$notifyPendingSystemUpdate$73$DevicePolicyManagerService(Landroid/content/Intent;)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$notifyPendingSystemUpdate$74$DevicePolicyManagerService(Landroid/content/Intent;)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$notifyPendingSystemUpdate$75$DevicePolicyManagerService(Landroid/content/Intent;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$notifyPendingSystemUpdate$76$DevicePolicyManagerService(Landroid/content/Intent;)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$removeActiveAdmin$6$DevicePolicyManagerService(Landroid/content/ComponentName;I)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$reportSuccessfulPasswordAttempt$30$DevicePolicyManagerService(Lcom/android/server/devicepolicy/DevicePolicyManagerService$DevicePolicyData;I)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$reportSuccessfulPasswordAttempt$31$DevicePolicyManagerService(Lcom/android/server/devicepolicy/DevicePolicyManagerService$DevicePolicyData;I)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$reportSuccessfulPasswordAttempt$32$DevicePolicyManagerService(Lcom/android/server/devicepolicy/DevicePolicyManagerService$DevicePolicyData;I)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$reportSuccessfulPasswordAttempt$33$DevicePolicyManagerService(Lcom/android/server/devicepolicy/DevicePolicyManagerService$DevicePolicyData;I)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$reportSuccessfulPasswordAttempt$34$DevicePolicyManagerService(Lcom/android/server/devicepolicy/DevicePolicyManagerService$DevicePolicyData;I)V
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$sendChangedNotification$2$DevicePolicyManagerService(Landroid/content/Intent;I)V
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$sendChangedNotification$3$DevicePolicyManagerService(Landroid/content/Intent;I)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setActiveAdmin$3$DevicePolicyManagerService(Landroid/content/ComponentName;IZLandroid/app/admin/DeviceAdminInfo;Lcom/android/server/devicepolicy/DevicePolicyManagerService$DevicePolicyData;Landroid/os/Bundle;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setActiveAdmin$4$DevicePolicyManagerService(Landroid/content/ComponentName;IZLandroid/app/admin/DeviceAdminInfo;Lcom/android/server/devicepolicy/DevicePolicyManagerService$DevicePolicyData;Landroid/os/Bundle;)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setApplicationHidden$58$DevicePolicyManagerService(Ljava/lang/String;ZI)Ljava/lang/Boolean;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setApplicationHidden$61$DevicePolicyManagerService(Ljava/lang/String;ZI)Ljava/lang/Boolean;
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setApplicationRestrictions$50$DevicePolicyManagerService(Ljava/lang/String;Landroid/os/Bundle;Landroid/os/UserHandle;Landroid/content/ComponentName;Ljava/lang/String;)V
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setApplicationRestrictions$51$DevicePolicyManagerService(Ljava/lang/String;Landroid/os/Bundle;Landroid/os/UserHandle;Landroid/content/ComponentName;Ljava/lang/String;)V
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setApplicationRestrictions$52$DevicePolicyManagerService(Ljava/lang/String;Landroid/os/Bundle;Landroid/os/UserHandle;Landroid/content/ComponentName;Ljava/lang/String;)V
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setApplicationRestrictions$53$DevicePolicyManagerService(Ljava/lang/String;Landroid/os/Bundle;Landroid/os/UserHandle;Landroid/content/ComponentName;Ljava/lang/String;)V
-PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setApplicationRestrictions$54$DevicePolicyManagerService(Ljava/lang/String;Landroid/os/Bundle;Landroid/os/UserHandle;Landroid/content/ComponentName;Ljava/lang/String;)V
-PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setApplicationRestrictions$55$DevicePolicyManagerService(Ljava/lang/String;Landroid/os/Bundle;Landroid/os/UserHandle;Landroid/content/ComponentName;Ljava/lang/String;)V
+HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setApplicationRestrictions$54$DevicePolicyManagerService(Ljava/lang/String;Landroid/os/Bundle;Landroid/os/UserHandle;Landroid/content/ComponentName;Ljava/lang/String;)V
+HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setApplicationRestrictions$55$DevicePolicyManagerService(Ljava/lang/String;Landroid/os/Bundle;Landroid/os/UserHandle;Landroid/content/ComponentName;Ljava/lang/String;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setCrossProfilePackages$102(Landroid/content/pm/CrossProfileApps;Ljava/util/List;Ljava/util/List;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setDeviceOwner$42$DevicePolicyManagerService(I)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setDeviceOwnerLockScreenInfo$41$DevicePolicyManagerService(Ljava/lang/CharSequence;)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setDeviceOwnerLockScreenInfo$42$DevicePolicyManagerService(Ljava/lang/CharSequence;)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setDeviceOwnerLockScreenInfo$43$DevicePolicyManagerService(Ljava/lang/CharSequence;)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setDeviceOwnerLockScreenInfo$44$DevicePolicyManagerService(Ljava/lang/CharSequence;)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setDeviceOwnerLockScreenInfo$45$DevicePolicyManagerService(Ljava/lang/CharSequence;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setDeviceOwnerLockScreenInfo$46$DevicePolicyManagerService(Ljava/lang/CharSequence;)V
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setExpirationAlarmCheckLocked$1$DevicePolicyManagerService(ZILandroid/content/Context;J)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setGlobalSetting$57$DevicePolicyManagerService(Ljava/lang/String;Ljava/lang/String;)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setGlobalSetting$58$DevicePolicyManagerService(Ljava/lang/String;Ljava/lang/String;)V
@@ -15814,6 +16809,7 @@
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setGlobalSetting$63$DevicePolicyManagerService(Ljava/lang/String;Ljava/lang/String;)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setGlobalSetting$64$DevicePolicyManagerService(Ljava/lang/String;Ljava/lang/String;)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setGlobalSetting$65$DevicePolicyManagerService(Ljava/lang/String;Ljava/lang/String;)V
+HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setGlobalSetting$66$DevicePolicyManagerService(Ljava/lang/String;Ljava/lang/String;)V
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setNetworkLoggingActiveInternal$75$DevicePolicyManagerService(Z)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setNetworkLoggingActiveInternal$76$DevicePolicyManagerService(Z)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setNetworkLoggingActiveInternal$78$DevicePolicyManagerService(Z)V
@@ -15823,29 +16819,37 @@
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setNetworkLoggingActiveInternal$87$DevicePolicyManagerService(Z)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setNetworkLoggingActiveInternal$88$DevicePolicyManagerService(Z)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setPasswordQuality$7$DevicePolicyManagerService(Lcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;IIZLandroid/content/ComponentName;)V
-PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setPasswordQuality$8$DevicePolicyManagerService(Lcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;IIZLandroid/content/ComponentName;)V
+HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setPasswordQuality$8$DevicePolicyManagerService(Lcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;IIZLandroid/content/ComponentName;)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setPermissionGrantState$65(ZLandroid/os/RemoteCallback;Landroid/content/ComponentName;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Boolean;)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setPermissionGrantState$66(ZLandroid/os/RemoteCallback;Landroid/content/ComponentName;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Boolean;)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setPermissionGrantState$68(ZLandroid/os/RemoteCallback;Landroid/content/ComponentName;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Boolean;)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setPermissionGrantState$74(ZLandroid/os/RemoteCallback;Landroid/content/ComponentName;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Boolean;)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setPermissionGrantState$75(ZLandroid/os/RemoteCallback;Landroid/content/ComponentName;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Boolean;)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setPermissionGrantState$76(ZLandroid/os/RemoteCallback;Landroid/content/ComponentName;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Boolean;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setPermissionGrantState$77(ZLandroid/os/RemoteCallback;Landroid/content/ComponentName;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Boolean;)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setProfileEnabled$42$DevicePolicyManagerService(I)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setProfileEnabled$43$DevicePolicyManagerService(I)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setProfileEnabled$47$DevicePolicyManagerService(I)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setProfileName$48$DevicePolicyManagerService(ILjava/lang/String;Landroid/content/ComponentName;)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setProfileOwner$39$DevicePolicyManagerService(ILcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setProfileOwner$40$DevicePolicyManagerService(ILcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setProfileOwner$44$DevicePolicyManagerService(ILcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setRecommendedGlobalProxy$32$DevicePolicyManagerService(Landroid/net/ProxyInfo;)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setRecommendedGlobalProxy$33$DevicePolicyManagerService(Landroid/net/ProxyInfo;)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setRecommendedGlobalProxy$34$DevicePolicyManagerService(Landroid/net/ProxyInfo;)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setRecommendedGlobalProxy$35$DevicePolicyManagerService(Landroid/net/ProxyInfo;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setRecommendedGlobalProxy$36$DevicePolicyManagerService(Landroid/net/ProxyInfo;)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setResetPasswordToken$87$DevicePolicyManagerService(Lcom/android/server/devicepolicy/DevicePolicyManagerService$DevicePolicyData;I[B)Ljava/lang/Boolean;
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setResetPasswordToken$88$DevicePolicyManagerService(Lcom/android/server/devicepolicy/DevicePolicyManagerService$DevicePolicyData;I[B)Ljava/lang/Boolean;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setResetPasswordToken$91$DevicePolicyManagerService(Lcom/android/server/devicepolicy/DevicePolicyManagerService$DevicePolicyData;I[B)Ljava/lang/Boolean;
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setSecureSetting$62$DevicePolicyManagerService(Ljava/lang/String;ILjava/lang/String;)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setSecureSetting$63$DevicePolicyManagerService(Ljava/lang/String;ILjava/lang/String;)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setSecureSetting$65$DevicePolicyManagerService(Ljava/lang/String;ILjava/lang/String;)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setSecureSetting$70$DevicePolicyManagerService(Ljava/lang/String;ILjava/lang/String;)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setSecureSetting$71$DevicePolicyManagerService(Ljava/lang/String;ILjava/lang/String;)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setSecureSetting$72$DevicePolicyManagerService(Ljava/lang/String;ILjava/lang/String;)V
+HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setSecureSetting$73$DevicePolicyManagerService(Ljava/lang/String;ILjava/lang/String;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$startManagedQuickContact$64$DevicePolicyManagerService(ILandroid/content/Intent;)V
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$updateMaximumTimeToLockLocked$19$DevicePolicyManagerService(I)V
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$updateMaximumTimeToLockLocked$20$DevicePolicyManagerService(I)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$updateMaximumTimeToLockLocked$21$DevicePolicyManagerService(I)V
@@ -15861,8 +16865,11 @@
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->loadConstants()Lcom/android/server/devicepolicy/DevicePolicyConstants;
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->loadOwners()V
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->loadSettingsLocked(Lcom/android/server/devicepolicy/DevicePolicyManagerService$DevicePolicyData;I)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lockNow(IZ)V
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->logIfVerbose(Ljava/lang/String;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->logSetCrossProfilePackages(Landroid/content/ComponentName;Ljava/util/List;)V
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->makeJournaledFile(I)Lcom/android/internal/util/JournaledFile;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->makeSuspensionReasons(ZZ)I
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->maybeClearLockTaskPolicyLocked()V
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->maybeLogPasswordComplexitySet(Landroid/content/ComponentName;IZLandroid/app/admin/PasswordPolicy;)V
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->maybeLogStart()V
@@ -15911,6 +16918,7 @@
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->revertTransferOwnershipIfNecessaryLocked()V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->saveGlobalProxyLocked(Ljava/lang/String;Ljava/lang/String;)V
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->saveSettingsLocked(I)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->saveUserRestrictionsLocked(I)V
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->saveUserRestrictionsLocked(IZ)V
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->sendActiveAdminCommand(Ljava/lang/String;Landroid/os/Bundle;ILandroid/content/ComponentName;)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->sendAdminCommandForLockscreenPoliciesLocked(Ljava/lang/String;II)V
@@ -15940,8 +16948,10 @@
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->setCertInstallerPackage(Landroid/content/ComponentName;Ljava/lang/String;)V
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->setCrossProfileCallerIdDisabled(Landroid/content/ComponentName;Z)V
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->setCrossProfileContactsSearchDisabled(Landroid/content/ComponentName;Z)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->setCrossProfilePackages(Landroid/content/ComponentName;Ljava/util/List;)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->setDelegatedScopePreO(Landroid/content/ComponentName;Ljava/lang/String;Ljava/lang/String;)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->setDelegatedScopes(Landroid/content/ComponentName;Ljava/lang/String;Ljava/util/List;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->setDeviceOwner(Landroid/content/ComponentName;Ljava/lang/String;I)Z
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->setDeviceOwnerLockScreenInfo(Landroid/content/ComponentName;Ljava/lang/CharSequence;)V
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->setDeviceOwnerSystemPropertyLocked()V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->setDeviceOwnershipSystemPropertyLocked()V
@@ -15983,6 +16993,7 @@
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->setPermittedAccessibilityServices(Landroid/content/ComponentName;Ljava/util/List;)Z
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->setPermittedInputMethods(Landroid/content/ComponentName;Ljava/util/List;)Z
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->setProfileEnabled(Landroid/content/ComponentName;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->setProfileName(Landroid/content/ComponentName;Ljava/lang/String;)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->setProfileOwner(Landroid/content/ComponentName;Ljava/lang/String;I)Z
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->setRecommendedGlobalProxy(Landroid/content/ComponentName;Landroid/net/ProxyInfo;)V
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->setRequiredStrongAuthTimeout(Landroid/content/ComponentName;JZ)V
@@ -15994,6 +17005,7 @@
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->setSecurityLoggingEnabled(Landroid/content/ComponentName;Z)V
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->setShortSupportMessage(Landroid/content/ComponentName;Ljava/lang/CharSequence;)V
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->setStatusBarDisabled(Landroid/content/ComponentName;Z)Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->setStatusBarDisabledInternal(ZI)Z
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->setStorageEncryption(Landroid/content/ComponentName;Z)I
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->setUninstallBlocked(Landroid/content/ComponentName;Ljava/lang/String;Ljava/lang/String;Z)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->setUserProvisioningState(II)V
@@ -16001,6 +17013,7 @@
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->setUserRestriction(Landroid/content/ComponentName;Ljava/lang/String;ZZ)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->shouldCheckIfDelegatePackageIsInstalled(Ljava/lang/String;ILjava/util/List;)Z
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->shouldOverwritePoliciesFromXml(Landroid/content/ComponentName;I)Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->startManagedQuickContact(Ljava/lang/String;JZJLandroid/content/Intent;)V
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->startOwnerService(ILjava/lang/String;)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->startUninstallIntent(Ljava/lang/String;I)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->stopOwnerService(ILjava/lang/String;)V
@@ -16021,6 +17034,7 @@
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->updateProtectedPackagesLocked(Ljava/util/List;)V
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->updateScreenCaptureDisabled(IZ)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->updateSystemUpdateFreezePeriodsRecord(Z)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->updateUserControlDisabledPackagesLocked(Ljava/util/List;)V
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->updateUserSetupCompleteAndPaired()V
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->validatePasswordOwnerLocked(Lcom/android/server/devicepolicy/DevicePolicyManagerService$DevicePolicyData;)V
 PLcom/android/server/devicepolicy/DevicePolicyManagerService;->validateQualityConstant(I)V
@@ -16089,6 +17103,8 @@
 PLcom/android/server/devicepolicy/Owners$ProfileOwnerReadWriter;->shouldWrite()Z
 PLcom/android/server/devicepolicy/Owners$ProfileOwnerReadWriter;->writeInner(Lorg/xmlpull/v1/XmlSerializer;)V
 HSPLcom/android/server/devicepolicy/Owners;-><init>(Landroid/os/UserManager;Landroid/os/UserManagerInternal;Landroid/content/pm/PackageManagerInternal;Lcom/android/server/wm/ActivityTaskManagerInternal;)V
+PLcom/android/server/devicepolicy/Owners;-><init>(Landroid/os/UserManager;Landroid/os/UserManagerInternal;Landroid/content/pm/PackageManagerInternal;Lcom/android/server/wm/ActivityTaskManagerInternal;Landroid/app/ActivityManagerInternal;)V
+PLcom/android/server/devicepolicy/Owners;-><init>(Landroid/os/UserManager;Landroid/os/UserManagerInternal;Landroid/content/pm/PackageManagerInternal;Lcom/android/server/wm/ActivityTaskManagerInternal;Landroid/app/ActivityManagerInternal;Lcom/android/server/devicepolicy/Owners$Injector;)V
 HSPLcom/android/server/devicepolicy/Owners;-><init>(Landroid/os/UserManager;Landroid/os/UserManagerInternal;Landroid/content/pm/PackageManagerInternal;Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/devicepolicy/Owners$Injector;)V
 PLcom/android/server/devicepolicy/Owners;->access$000(Lcom/android/server/devicepolicy/Owners;)Lcom/android/server/devicepolicy/Owners$OwnerInfo;
 HSPLcom/android/server/devicepolicy/Owners;->access$002(Lcom/android/server/devicepolicy/Owners;Lcom/android/server/devicepolicy/Owners$OwnerInfo;)Lcom/android/server/devicepolicy/Owners$OwnerInfo;
@@ -16125,8 +17141,11 @@
 HSPLcom/android/server/devicepolicy/Owners;->readLegacyOwnerFileLocked(Ljava/io/File;)Z
 PLcom/android/server/devicepolicy/Owners;->removeProfileOwner(I)V
 PLcom/android/server/devicepolicy/Owners;->saveSystemUpdateInfo(Landroid/app/admin/SystemUpdateInfo;)Z
+PLcom/android/server/devicepolicy/Owners;->setDeviceOwner(Landroid/content/ComponentName;Ljava/lang/String;I)V
+PLcom/android/server/devicepolicy/Owners;->setDeviceOwnerWithRestrictionsMigrated(Landroid/content/ComponentName;Ljava/lang/String;IZ)V
 PLcom/android/server/devicepolicy/Owners;->setProfileOwner(Landroid/content/ComponentName;Ljava/lang/String;I)V
 HSPLcom/android/server/devicepolicy/Owners;->systemReady()V
+PLcom/android/server/devicepolicy/Owners;->writeDeviceOwner()V
 PLcom/android/server/devicepolicy/Owners;->writeProfileOwner(I)V
 HSPLcom/android/server/devicepolicy/SecurityLogMonitor;-><clinit>()V
 HSPLcom/android/server/devicepolicy/SecurityLogMonitor;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;)V
@@ -16139,6 +17158,7 @@
 HPLcom/android/server/devicepolicy/SecurityLogMonitor;->mergeBatchLocked(Ljava/util/ArrayList;)V
 HPLcom/android/server/devicepolicy/SecurityLogMonitor;->notifyDeviceOwnerIfNeeded(Z)V
 PLcom/android/server/devicepolicy/SecurityLogMonitor;->pause()V
+PLcom/android/server/devicepolicy/SecurityLogMonitor;->resume()V
 PLcom/android/server/devicepolicy/SecurityLogMonitor;->retrieveLogs()Ljava/util/List;
 HSPLcom/android/server/devicepolicy/SecurityLogMonitor;->run()V
 HPLcom/android/server/devicepolicy/SecurityLogMonitor;->saveLastEvents(Ljava/util/ArrayList;)V
@@ -16224,9 +17244,11 @@
 HSPLcom/android/server/display/AutomaticBrightnessController$TaskStackListenerImpl;-><init>(Lcom/android/server/display/AutomaticBrightnessController;)V
 HPLcom/android/server/display/AutomaticBrightnessController$TaskStackListenerImpl;->onTaskStackChanged()V
 HSPLcom/android/server/display/AutomaticBrightnessController;-><init>(Lcom/android/server/display/AutomaticBrightnessController$Callbacks;Landroid/os/Looper;Landroid/hardware/SensorManager;Landroid/hardware/Sensor;Lcom/android/server/display/BrightnessMappingStrategy;IFFFIIJJZLcom/android/server/display/HysteresisLevels;Lcom/android/server/display/HysteresisLevels;Landroid/content/Context;)V
+PLcom/android/server/display/AutomaticBrightnessController;-><init>(Lcom/android/server/display/AutomaticBrightnessController$Callbacks;Landroid/os/Looper;Landroid/hardware/SensorManager;Landroid/hardware/Sensor;Lcom/android/server/display/BrightnessMappingStrategy;IFFFIIJJZLcom/android/server/display/HysteresisLevels;Lcom/android/server/display/HysteresisLevels;Landroid/content/Context;Lcom/android/server/display/DisplayDeviceConfig;)V
 HSPLcom/android/server/display/AutomaticBrightnessController;-><init>(Lcom/android/server/display/AutomaticBrightnessController$Callbacks;Landroid/os/Looper;Landroid/hardware/SensorManager;Landroid/hardware/Sensor;Lcom/android/server/display/BrightnessMappingStrategy;IIIFIIJJZLcom/android/server/display/HysteresisLevels;Lcom/android/server/display/HysteresisLevels;JLandroid/content/pm/PackageManager;)V
 HSPLcom/android/server/display/AutomaticBrightnessController;-><init>(Lcom/android/server/display/AutomaticBrightnessController$Callbacks;Landroid/os/Looper;Landroid/hardware/SensorManager;Landroid/hardware/Sensor;Lcom/android/server/display/BrightnessMappingStrategy;IIIFIIJJZLcom/android/server/display/HysteresisLevels;Lcom/android/server/display/HysteresisLevels;Landroid/content/pm/PackageManager;)V
 HSPLcom/android/server/display/AutomaticBrightnessController;-><init>(Lcom/android/server/display/AutomaticBrightnessController$Injector;Lcom/android/server/display/AutomaticBrightnessController$Callbacks;Landroid/os/Looper;Landroid/hardware/SensorManager;Landroid/hardware/Sensor;Lcom/android/server/display/BrightnessMappingStrategy;IFFFIIJJZLcom/android/server/display/HysteresisLevels;Lcom/android/server/display/HysteresisLevels;Landroid/content/Context;)V
+PLcom/android/server/display/AutomaticBrightnessController;-><init>(Lcom/android/server/display/AutomaticBrightnessController$Injector;Lcom/android/server/display/AutomaticBrightnessController$Callbacks;Landroid/os/Looper;Landroid/hardware/SensorManager;Landroid/hardware/Sensor;Lcom/android/server/display/BrightnessMappingStrategy;IFFFIIJJZLcom/android/server/display/HysteresisLevels;Lcom/android/server/display/HysteresisLevels;Landroid/content/Context;Lcom/android/server/display/DisplayDeviceConfig;)V
 HSPLcom/android/server/display/AutomaticBrightnessController;-><init>(Lcom/android/server/display/AutomaticBrightnessController$Injector;Lcom/android/server/display/AutomaticBrightnessController$Callbacks;Landroid/os/Looper;Landroid/hardware/SensorManager;Landroid/hardware/Sensor;Lcom/android/server/display/BrightnessMappingStrategy;IIIFIIJJZLcom/android/server/display/HysteresisLevels;Lcom/android/server/display/HysteresisLevels;JLandroid/content/pm/PackageManager;)V
 HSPLcom/android/server/display/AutomaticBrightnessController;-><init>(Lcom/android/server/display/AutomaticBrightnessController$Injector;Lcom/android/server/display/AutomaticBrightnessController$Callbacks;Landroid/os/Looper;Landroid/hardware/SensorManager;Landroid/hardware/Sensor;Lcom/android/server/display/BrightnessMappingStrategy;IIIFIIJJZLcom/android/server/display/HysteresisLevels;Lcom/android/server/display/HysteresisLevels;Landroid/content/pm/PackageManager;)V
 HPLcom/android/server/display/AutomaticBrightnessController;->access$000(Lcom/android/server/display/AutomaticBrightnessController;)Landroid/app/IActivityTaskManager;
@@ -16299,6 +17321,14 @@
 HPLcom/android/server/display/BrightnessMappingStrategy$PhysicalMappingStrategy;->isDefaultConfig()Z
 PLcom/android/server/display/BrightnessMappingStrategy$PhysicalMappingStrategy;->setAutoBrightnessAdjustment(F)Z
 HSPLcom/android/server/display/BrightnessMappingStrategy$PhysicalMappingStrategy;->setBrightnessConfiguration(Landroid/hardware/display/BrightnessConfiguration;)Z
+PLcom/android/server/display/BrightnessMappingStrategy$SimpleMappingStrategy;-><init>([F[IFJ)V
+PLcom/android/server/display/BrightnessMappingStrategy$SimpleMappingStrategy;-><init>([F[IFJLcom/android/server/display/BrightnessMappingStrategy$1;)V
+PLcom/android/server/display/BrightnessMappingStrategy$SimpleMappingStrategy;->computeSpline()V
+PLcom/android/server/display/BrightnessMappingStrategy$SimpleMappingStrategy;->convertToNits(I)F
+PLcom/android/server/display/BrightnessMappingStrategy$SimpleMappingStrategy;->getDefaultConfig()Landroid/hardware/display/BrightnessConfiguration;
+PLcom/android/server/display/BrightnessMappingStrategy$SimpleMappingStrategy;->getShortTermModelTimeout()J
+PLcom/android/server/display/BrightnessMappingStrategy$SimpleMappingStrategy;->hasUserDataPoints()Z
+PLcom/android/server/display/BrightnessMappingStrategy$SimpleMappingStrategy;->setBrightnessConfiguration(Landroid/hardware/display/BrightnessConfiguration;)Z
 HSPLcom/android/server/display/BrightnessMappingStrategy;-><clinit>()V
 HSPLcom/android/server/display/BrightnessMappingStrategy;-><init>()V
 HSPLcom/android/server/display/BrightnessMappingStrategy;->create(Landroid/content/res/Resources;)Lcom/android/server/display/BrightnessMappingStrategy;
@@ -16447,6 +17477,7 @@
 HSPLcom/android/server/display/DisplayDevice;-><init>(Lcom/android/server/display/DisplayAdapter;Landroid/os/IBinder;Ljava/lang/String;)V
 PLcom/android/server/display/DisplayDevice;->applyPendingDisplayDeviceInfoChangesLocked()V
 HPLcom/android/server/display/DisplayDevice;->dumpLocked(Ljava/io/PrintWriter;)V
+PLcom/android/server/display/DisplayDevice;->getDisplayIdToMirrorLocked()I
 HSPLcom/android/server/display/DisplayDevice;->getDisplayTokenLocked()Landroid/os/IBinder;
 PLcom/android/server/display/DisplayDevice;->getNameLocked()Ljava/lang/String;
 HSPLcom/android/server/display/DisplayDevice;->getUniqueId()Ljava/lang/String;
@@ -16472,6 +17503,9 @@
 HSPLcom/android/server/display/DisplayDeviceInfo;->flagsToString(I)Ljava/lang/String;
 HSPLcom/android/server/display/DisplayDeviceInfo;->toString()Ljava/lang/String;
 HSPLcom/android/server/display/DisplayDeviceInfo;->touchToString(I)Ljava/lang/String;
+HSPLcom/android/server/display/DisplayInfoProxy;-><init>(Landroid/view/DisplayInfo;)V
+HSPLcom/android/server/display/DisplayInfoProxy;->get()Landroid/view/DisplayInfo;
+HSPLcom/android/server/display/DisplayInfoProxy;->set(Landroid/view/DisplayInfo;)V
 HSPLcom/android/server/display/DisplayManagerService$AllowedDisplayModeObserver;-><init>(Lcom/android/server/display/DisplayManagerService;)V
 HSPLcom/android/server/display/DisplayManagerService$AllowedDisplayModeObserver;->onAllowedDisplayModesChanged()V
 HSPLcom/android/server/display/DisplayManagerService$BinderService;-><init>(Lcom/android/server/display/DisplayManagerService;)V
@@ -16600,10 +17634,12 @@
 PLcom/android/server/display/DisplayManagerService;->access$4600(Lcom/android/server/display/DisplayManagerService;I)Landroid/view/SurfaceControl$ScreenshotGraphicBuffer;
 HSPLcom/android/server/display/DisplayManagerService;->access$4600(Lcom/android/server/display/DisplayManagerService;IF)V
 HSPLcom/android/server/display/DisplayManagerService;->access$4600(Lcom/android/server/display/DisplayManagerService;II)V
+PLcom/android/server/display/DisplayManagerService;->access$4700(Lcom/android/server/display/DisplayManagerService;)Ljava/util/ArrayList;
 PLcom/android/server/display/DisplayManagerService;->access$4700(Lcom/android/server/display/DisplayManagerService;Landroid/hardware/display/DisplayManagerInternal$DisplayTransactionListener;)V
 HSPLcom/android/server/display/DisplayManagerService;->access$4702(Lcom/android/server/display/DisplayManagerService;Landroid/hardware/SensorManager;)Landroid/hardware/SensorManager;
 PLcom/android/server/display/DisplayManagerService;->access$4800(Lcom/android/server/display/DisplayManagerService;I)Landroid/view/SurfaceControl$ScreenshotGraphicBuffer;
 PLcom/android/server/display/DisplayManagerService;->access$4800(Lcom/android/server/display/DisplayManagerService;Landroid/hardware/display/DisplayManagerInternal$DisplayTransactionListener;)V
+PLcom/android/server/display/DisplayManagerService;->access$4802(Lcom/android/server/display/DisplayManagerService;Landroid/hardware/SensorManager;)Landroid/hardware/SensorManager;
 HSPLcom/android/server/display/DisplayManagerService;->access$4900(Lcom/android/server/display/DisplayManagerService;ILandroid/view/DisplayInfo;)V
 PLcom/android/server/display/DisplayManagerService;->access$4900(Lcom/android/server/display/DisplayManagerService;Landroid/hardware/display/DisplayManagerInternal$DisplayTransactionListener;)V
 HSPLcom/android/server/display/DisplayManagerService;->access$500(Lcom/android/server/display/DisplayManagerService;)Lcom/android/server/wm/WindowManagerInternal;
@@ -16613,13 +17649,17 @@
 HSPLcom/android/server/display/DisplayManagerService;->access$5100(Lcom/android/server/display/DisplayManagerService;ILandroid/view/DisplayInfo;)V
 HSPLcom/android/server/display/DisplayManagerService;->access$5100(Lcom/android/server/display/DisplayManagerService;IZFIZ)V
 HSPLcom/android/server/display/DisplayManagerService;->access$5100(Lcom/android/server/display/DisplayManagerService;IZFIZZ)V
+PLcom/android/server/display/DisplayManagerService;->access$5100(Lcom/android/server/display/DisplayManagerService;Landroid/hardware/display/DisplayManagerInternal$DisplayTransactionListener;)V
 HSPLcom/android/server/display/DisplayManagerService;->access$5200(Lcom/android/server/display/DisplayManagerService;ILandroid/view/DisplayInfo;)V
+PLcom/android/server/display/DisplayManagerService;->access$5300(Lcom/android/server/display/DisplayManagerService;ILandroid/view/DisplayInfo;)V
 HSPLcom/android/server/display/DisplayManagerService;->access$5300(Lcom/android/server/display/DisplayManagerService;IZFIZZ)V
+PLcom/android/server/display/DisplayManagerService;->access$5400(Lcom/android/server/display/DisplayManagerService;IZFIZZ)V
 HSPLcom/android/server/display/DisplayManagerService;->access$5400(Lcom/android/server/display/DisplayManagerService;Landroid/util/SparseArray;)V
 HSPLcom/android/server/display/DisplayManagerService;->access$5500(Lcom/android/server/display/DisplayManagerService;)Ljava/util/ArrayList;
 HSPLcom/android/server/display/DisplayManagerService;->access$5600(Lcom/android/server/display/DisplayManagerService;)V
 HSPLcom/android/server/display/DisplayManagerService;->access$5600(Lcom/android/server/display/DisplayManagerService;Landroid/util/SparseArray;)V
 HSPLcom/android/server/display/DisplayManagerService;->access$5700(Lcom/android/server/display/DisplayManagerService;)Ljava/util/ArrayList;
+PLcom/android/server/display/DisplayManagerService;->access$5700(Lcom/android/server/display/DisplayManagerService;Landroid/util/SparseArray;)V
 HSPLcom/android/server/display/DisplayManagerService;->access$5800(Lcom/android/server/display/DisplayManagerService;)V
 HSPLcom/android/server/display/DisplayManagerService;->access$600(Lcom/android/server/display/DisplayManagerService;)Lcom/android/server/display/DisplayManagerService$SyncRoot;
 HSPLcom/android/server/display/DisplayManagerService;->access$600(Lcom/android/server/display/DisplayManagerService;)V
@@ -16657,6 +17697,7 @@
 PLcom/android/server/display/DisplayManagerService;->handleDisplayDeviceRemoved(Lcom/android/server/display/DisplayDevice;)V
 HPLcom/android/server/display/DisplayManagerService;->handleDisplayDeviceRemovedLocked(Lcom/android/server/display/DisplayDevice;)V
 HSPLcom/android/server/display/DisplayManagerService;->handleLogicalDisplayChanged(ILcom/android/server/display/LogicalDisplay;)V
+PLcom/android/server/display/DisplayManagerService;->handleSettingsChange()V
 HPLcom/android/server/display/DisplayManagerService;->isBrightnessConfigurationTooDark(Landroid/hardware/display/BrightnessConfiguration;)Z
 HPLcom/android/server/display/DisplayManagerService;->isUidPresentOnDisplayInternal(II)Z
 HSPLcom/android/server/display/DisplayManagerService;->loadBrightnessConfiguration()V
@@ -16686,6 +17727,7 @@
 PLcom/android/server/display/DisplayManagerService;->resizeVirtualDisplayInternal(Landroid/os/IBinder;III)V
 HSPLcom/android/server/display/DisplayManagerService;->scheduleTraversalLocked(Z)V
 HPLcom/android/server/display/DisplayManagerService;->screenshotInternal(I)Landroid/view/SurfaceControl$ScreenshotGraphicBuffer;
+PLcom/android/server/display/DisplayManagerService;->screenshotInternal(IZ)Landroid/view/SurfaceControl$ScreenshotGraphicBuffer;
 HSPLcom/android/server/display/DisplayManagerService;->sendDisplayEventLocked(II)V
 PLcom/android/server/display/DisplayManagerService;->setBrightnessConfigurationForUserInternal(Landroid/hardware/display/BrightnessConfiguration;ILjava/lang/String;)V
 HSPLcom/android/server/display/DisplayManagerService;->setDisplayAccessUIDsInternal(Landroid/util/SparseArray;)V
@@ -16851,6 +17893,7 @@
 HPLcom/android/server/display/DisplayPowerController$SettingsObserver;->onChange(ZLandroid/net/Uri;)V
 HSPLcom/android/server/display/DisplayPowerController;-><clinit>()V
 HSPLcom/android/server/display/DisplayPowerController;-><init>(Landroid/content/Context;Landroid/hardware/display/DisplayManagerInternal$DisplayPowerCallbacks;Landroid/os/Handler;Landroid/hardware/SensorManager;Lcom/android/server/display/DisplayBlanker;)V
+PLcom/android/server/display/DisplayPowerController;-><init>(Landroid/content/Context;Landroid/hardware/display/DisplayManagerInternal$DisplayPowerCallbacks;Landroid/os/Handler;Landroid/hardware/SensorManager;Lcom/android/server/display/DisplayBlanker;Lcom/android/server/display/DisplayDevice;)V
 HSPLcom/android/server/display/DisplayPowerController;->access$100(Lcom/android/server/display/DisplayPowerController;)V
 PLcom/android/server/display/DisplayPowerController;->access$1000(Lcom/android/server/display/DisplayPowerController;)Lcom/android/server/display/DisplayPowerController$ScreenOffUnblocker;
 HSPLcom/android/server/display/DisplayPowerController;->access$1202(Lcom/android/server/display/DisplayPowerController;Landroid/hardware/display/BrightnessConfiguration;)Landroid/hardware/display/BrightnessConfiguration;
@@ -17020,6 +18063,7 @@
 HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->findDisplayModeRecord(Landroid/view/SurfaceControl$DisplayConfig;)Lcom/android/server/display/LocalDisplayAdapter$DisplayModeRecord;
 HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->findDisplayModeRecord(Landroid/view/SurfaceControl$PhysicalDisplayInfo;)Lcom/android/server/display/LocalDisplayAdapter$DisplayModeRecord;
 HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->findMatchingModeIdLocked(I)I
+PLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->getDisplayDeviceConfig()Lcom/android/server/display/DisplayDeviceConfig;
 HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->getDisplayDeviceInfoLocked()Lcom/android/server/display/DisplayDeviceInfo;
 HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->getDisplayModes(Landroid/util/SparseArray;)[Landroid/view/Display$Mode;
 HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->hasStableUniqueId()Z
@@ -17121,11 +18165,14 @@
 PLcom/android/server/display/PersistentDataStore$StableDeviceValues;->saveToXml(Lorg/xmlpull/v1/XmlSerializer;)V
 HSPLcom/android/server/display/PersistentDataStore;-><init>()V
 HSPLcom/android/server/display/PersistentDataStore;-><init>(Lcom/android/server/display/PersistentDataStore$Injector;)V
+PLcom/android/server/display/PersistentDataStore;->applyWifiDisplayAlias(Landroid/hardware/display/WifiDisplay;)Landroid/hardware/display/WifiDisplay;
+PLcom/android/server/display/PersistentDataStore;->applyWifiDisplayAliases([Landroid/hardware/display/WifiDisplay;)[Landroid/hardware/display/WifiDisplay;
 HSPLcom/android/server/display/PersistentDataStore;->clearState()V
 PLcom/android/server/display/PersistentDataStore;->dump(Ljava/io/PrintWriter;)V
 HSPLcom/android/server/display/PersistentDataStore;->getBrightnessConfiguration(I)Landroid/hardware/display/BrightnessConfiguration;
 HSPLcom/android/server/display/PersistentDataStore;->getColorMode(Lcom/android/server/display/DisplayDevice;)I
 HSPLcom/android/server/display/PersistentDataStore;->getDisplayState(Ljava/lang/String;Z)Lcom/android/server/display/PersistentDataStore$DisplayState;
+PLcom/android/server/display/PersistentDataStore;->getRememberedWifiDisplays()[Landroid/hardware/display/WifiDisplay;
 HSPLcom/android/server/display/PersistentDataStore;->getStableDisplaySize()Landroid/graphics/Point;
 HSPLcom/android/server/display/PersistentDataStore;->load()V
 HSPLcom/android/server/display/PersistentDataStore;->loadDisplaysFromXml(Lorg/xmlpull/v1/XmlPullParser;)V
@@ -17203,6 +18250,53 @@
 PLcom/android/server/display/VirtualDisplayAdapter;->resizeVirtualDisplayLocked(Landroid/os/IBinder;III)V
 PLcom/android/server/display/VirtualDisplayAdapter;->setVirtualDisplayStateLocked(Landroid/os/IBinder;Z)V
 PLcom/android/server/display/VirtualDisplayAdapter;->setVirtualDisplaySurfaceLocked(Landroid/os/IBinder;Landroid/view/Surface;)V
+PLcom/android/server/display/WifiDisplayAdapter$1;-><init>(Lcom/android/server/display/WifiDisplayAdapter;)V
+PLcom/android/server/display/WifiDisplayAdapter$1;->run()V
+PLcom/android/server/display/WifiDisplayAdapter$8;-><init>(Lcom/android/server/display/WifiDisplayAdapter;)V
+PLcom/android/server/display/WifiDisplayAdapter$9;-><init>(Lcom/android/server/display/WifiDisplayAdapter;)V
+PLcom/android/server/display/WifiDisplayAdapter$9;->onFeatureStateChanged(I)V
+PLcom/android/server/display/WifiDisplayAdapter$WifiDisplayHandler;-><init>(Lcom/android/server/display/WifiDisplayAdapter;Landroid/os/Looper;)V
+PLcom/android/server/display/WifiDisplayAdapter$WifiDisplayHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/display/WifiDisplayAdapter;-><init>(Lcom/android/server/display/DisplayManagerService$SyncRoot;Landroid/content/Context;Landroid/os/Handler;Lcom/android/server/display/DisplayAdapter$Listener;Lcom/android/server/display/PersistentDataStore;)V
+PLcom/android/server/display/WifiDisplayAdapter;->access$002(Lcom/android/server/display/WifiDisplayAdapter;Lcom/android/server/display/WifiDisplayController;)Lcom/android/server/display/WifiDisplayController;
+PLcom/android/server/display/WifiDisplayAdapter;->access$100(Lcom/android/server/display/WifiDisplayAdapter;)Lcom/android/server/display/WifiDisplayController$Listener;
+PLcom/android/server/display/WifiDisplayAdapter;->access$1700(Lcom/android/server/display/WifiDisplayAdapter;)V
+PLcom/android/server/display/WifiDisplayAdapter;->access$200(Lcom/android/server/display/WifiDisplayAdapter;)Landroid/content/BroadcastReceiver;
+PLcom/android/server/display/WifiDisplayAdapter;->access$300(Lcom/android/server/display/WifiDisplayAdapter;)Lcom/android/server/display/WifiDisplayAdapter$WifiDisplayHandler;
+PLcom/android/server/display/WifiDisplayAdapter;->access$400(Lcom/android/server/display/WifiDisplayAdapter;)I
+PLcom/android/server/display/WifiDisplayAdapter;->access$402(Lcom/android/server/display/WifiDisplayAdapter;I)I
+PLcom/android/server/display/WifiDisplayAdapter;->access$500(Lcom/android/server/display/WifiDisplayAdapter;)V
+PLcom/android/server/display/WifiDisplayAdapter;->getWifiDisplayStatusLocked()Landroid/hardware/display/WifiDisplayStatus;
+PLcom/android/server/display/WifiDisplayAdapter;->handleSendStatusChangeBroadcast()V
+PLcom/android/server/display/WifiDisplayAdapter;->registerLocked()V
+PLcom/android/server/display/WifiDisplayAdapter;->scheduleStatusChangedBroadcastLocked()V
+PLcom/android/server/display/WifiDisplayAdapter;->updateDisplaysLocked()V
+PLcom/android/server/display/WifiDisplayAdapter;->updateRememberedDisplaysLocked()V
+PLcom/android/server/display/WifiDisplayController$16;-><init>(Lcom/android/server/display/WifiDisplayController;)V
+PLcom/android/server/display/WifiDisplayController$17;-><init>(Lcom/android/server/display/WifiDisplayController;)V
+PLcom/android/server/display/WifiDisplayController$18;-><init>(Lcom/android/server/display/WifiDisplayController;)V
+PLcom/android/server/display/WifiDisplayController$1;-><init>(Lcom/android/server/display/WifiDisplayController;Landroid/os/Handler;)V
+PLcom/android/server/display/WifiDisplayController$21;-><init>(Lcom/android/server/display/WifiDisplayController;)V
+PLcom/android/server/display/WifiDisplayController$21;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/display/WifiDisplayController$4;-><init>(Lcom/android/server/display/WifiDisplayController;I)V
+PLcom/android/server/display/WifiDisplayController$4;->run()V
+PLcom/android/server/display/WifiDisplayController;-><init>(Landroid/content/Context;Landroid/os/Handler;Lcom/android/server/display/WifiDisplayController$Listener;)V
+PLcom/android/server/display/WifiDisplayController;->access$3002(Lcom/android/server/display/WifiDisplayController;Landroid/net/wifi/p2p/WifiP2pDevice;)Landroid/net/wifi/p2p/WifiP2pDevice;
+PLcom/android/server/display/WifiDisplayController;->access$3500(Lcom/android/server/display/WifiDisplayController;Z)V
+PLcom/android/server/display/WifiDisplayController;->access$3700(Lcom/android/server/display/WifiDisplayController;Landroid/net/NetworkInfo;)V
+PLcom/android/server/display/WifiDisplayController;->access$500(Lcom/android/server/display/WifiDisplayController;)Lcom/android/server/display/WifiDisplayController$Listener;
+PLcom/android/server/display/WifiDisplayController;->advertiseDisplay(Landroid/hardware/display/WifiDisplay;Landroid/view/Surface;III)V
+PLcom/android/server/display/WifiDisplayController;->computeFeatureState()I
+PLcom/android/server/display/WifiDisplayController;->disconnect()V
+PLcom/android/server/display/WifiDisplayController;->handleConnectionChanged(Landroid/net/NetworkInfo;)V
+PLcom/android/server/display/WifiDisplayController;->handleStateChanged(Z)V
+PLcom/android/server/display/WifiDisplayController;->reportFeatureState()V
+PLcom/android/server/display/WifiDisplayController;->retrieveWifiP2pManagerAndChannel()V
+PLcom/android/server/display/WifiDisplayController;->unadvertiseDisplay()V
+PLcom/android/server/display/WifiDisplayController;->updateConnection()V
+PLcom/android/server/display/WifiDisplayController;->updateScanState()V
+PLcom/android/server/display/WifiDisplayController;->updateSettings()V
+PLcom/android/server/display/WifiDisplayController;->updateWfdEnableState()V
 HPLcom/android/server/display/color/-$$Lambda$ColorDisplayService$3e7BuPerYILI5JPZm17hU11tDtY;-><init>(Lcom/android/server/display/color/DisplayTransformManager;Lcom/android/server/display/color/TintController;)V
 HPLcom/android/server/display/color/-$$Lambda$ColorDisplayService$3e7BuPerYILI5JPZm17hU11tDtY;->onAnimationUpdate(Landroid/animation/ValueAnimator;)V
 HSPLcom/android/server/display/color/AppSaturationController$SaturationController;-><init>()V
@@ -17248,6 +18342,7 @@
 PLcom/android/server/display/color/ColorDisplayService$BinderService;->setNightDisplayActivated(Z)Z
 PLcom/android/server/display/color/ColorDisplayService$BinderService;->setNightDisplayAutoMode(I)Z
 PLcom/android/server/display/color/ColorDisplayService$BinderService;->setNightDisplayColorTemperature(I)Z
+PLcom/android/server/display/color/ColorDisplayService$BinderService;->setNightDisplayCustomStartTime(Landroid/hardware/display/Time;)Z
 HPLcom/android/server/display/color/ColorDisplayService$BinderService;->setSaturationLevel(I)Z
 HSPLcom/android/server/display/color/ColorDisplayService$ColorDisplayServiceInternal;-><init>(Lcom/android/server/display/color/ColorDisplayService;)V
 HSPLcom/android/server/display/color/ColorDisplayService$ColorDisplayServiceInternal;->attachColorTransformController(Ljava/lang/String;ILjava/lang/ref/WeakReference;)Z
@@ -17265,7 +18360,9 @@
 PLcom/android/server/display/color/ColorDisplayService$CustomNightDisplayAutoMode;->access$2100(Lcom/android/server/display/color/ColorDisplayService$CustomNightDisplayAutoMode;)V
 PLcom/android/server/display/color/ColorDisplayService$CustomNightDisplayAutoMode;->onActivated(Z)V
 PLcom/android/server/display/color/ColorDisplayService$CustomNightDisplayAutoMode;->onAlarm()V
+PLcom/android/server/display/color/ColorDisplayService$CustomNightDisplayAutoMode;->onCustomStartTimeChanged(Ljava/time/LocalTime;)V
 PLcom/android/server/display/color/ColorDisplayService$CustomNightDisplayAutoMode;->onStart()V
+PLcom/android/server/display/color/ColorDisplayService$CustomNightDisplayAutoMode;->onStop()V
 PLcom/android/server/display/color/ColorDisplayService$CustomNightDisplayAutoMode;->updateActivated()V
 PLcom/android/server/display/color/ColorDisplayService$CustomNightDisplayAutoMode;->updateNextAlarm(Ljava/lang/Boolean;Ljava/time/LocalDateTime;)V
 PLcom/android/server/display/color/ColorDisplayService$NightDisplayAutoMode;-><init>(Lcom/android/server/display/color/ColorDisplayService;)V
@@ -17322,9 +18419,12 @@
 PLcom/android/server/display/color/ColorDisplayService;->access$3300(Lcom/android/server/display/color/ColorDisplayService;Ljava/lang/String;I)Z
 PLcom/android/server/display/color/ColorDisplayService;->access$3500(Lcom/android/server/display/color/ColorDisplayService;I)Z
 PLcom/android/server/display/color/ColorDisplayService;->access$3600(Lcom/android/server/display/color/ColorDisplayService;)I
+PLcom/android/server/display/color/ColorDisplayService;->access$3700(Lcom/android/server/display/color/ColorDisplayService;Landroid/hardware/display/Time;)Z
 PLcom/android/server/display/color/ColorDisplayService;->access$3900(Lcom/android/server/display/color/ColorDisplayService;Z)Z
 PLcom/android/server/display/color/ColorDisplayService;->access$400(Landroid/content/ContentResolver;I)Z
 PLcom/android/server/display/color/ColorDisplayService;->access$4000(Lcom/android/server/display/color/ColorDisplayService;Ljava/io/PrintWriter;)V
+PLcom/android/server/display/color/ColorDisplayService;->access$502(Lcom/android/server/display/color/ColorDisplayService;Landroid/database/ContentObserver;)Landroid/database/ContentObserver;
+PLcom/android/server/display/color/ColorDisplayService;->access$600(Lcom/android/server/display/color/ColorDisplayService;)Z
 PLcom/android/server/display/color/ColorDisplayService;->access$700(Lcom/android/server/display/color/ColorDisplayService;)V
 PLcom/android/server/display/color/ColorDisplayService;->access$800(Lcom/android/server/display/color/ColorDisplayService;)Lcom/android/server/display/color/ColorDisplayService$NightDisplayTintController;
 PLcom/android/server/display/color/ColorDisplayService;->access$900(Lcom/android/server/display/color/ColorDisplayService;)I
@@ -17362,6 +18462,7 @@
 PLcom/android/server/display/color/ColorDisplayService;->setColorModeInternal(I)V
 PLcom/android/server/display/color/ColorDisplayService;->setDisplayWhiteBalanceSettingEnabled(Z)Z
 PLcom/android/server/display/color/ColorDisplayService;->setNightDisplayAutoModeInternal(I)Z
+PLcom/android/server/display/color/ColorDisplayService;->setNightDisplayCustomStartTimeInternal(Landroid/hardware/display/Time;)Z
 PLcom/android/server/display/color/ColorDisplayService;->setUp()V
 PLcom/android/server/display/color/ColorDisplayService;->setUpDisplayCompositionColorSpaces(Landroid/content/res/Resources;)V
 PLcom/android/server/display/color/ColorDisplayService;->tearDown()V
@@ -17525,6 +18626,7 @@
 PLcom/android/server/dreams/-$$Lambda$DreamController$DreamRecord$dxWbx4rgpHpZ1Hx0p_kP0KmKxQk;-><init>(Lcom/android/server/dreams/DreamController$DreamRecord;)V
 PLcom/android/server/dreams/-$$Lambda$DreamController$DreamRecord$dxWbx4rgpHpZ1Hx0p_kP0KmKxQk;->run()V
 PLcom/android/server/dreams/-$$Lambda$DreamController$MzWLPaVogrekgPcs4ryibDvi1xA;-><init>(Lcom/android/server/dreams/DreamController;)V
+PLcom/android/server/dreams/-$$Lambda$DreamController$MzWLPaVogrekgPcs4ryibDvi1xA;->run()V
 HPLcom/android/server/dreams/-$$Lambda$DreamController$NsbIx0iECm45E_fdqE55LTS32LQ;-><init>(Lcom/android/server/dreams/DreamController;Lcom/android/server/dreams/DreamController$DreamRecord;)V
 HPLcom/android/server/dreams/-$$Lambda$DreamController$NsbIx0iECm45E_fdqE55LTS32LQ;->run()V
 HPLcom/android/server/dreams/-$$Lambda$DreamManagerService$f7cEVKQvPKMm_Ir9dq0e6PSOkX8;-><init>(Lcom/android/server/dreams/DreamManagerService;Landroid/os/Binder;Landroid/content/ComponentName;ZZILandroid/os/PowerManager$WakeLock;)V
@@ -17563,6 +18665,7 @@
 PLcom/android/server/dreams/DreamController;->access$300(Lcom/android/server/dreams/DreamController;Landroid/service/dreams/IDreamService;)V
 HPLcom/android/server/dreams/DreamController;->attach(Landroid/service/dreams/IDreamService;)V
 HPLcom/android/server/dreams/DreamController;->dump(Ljava/io/PrintWriter;)V
+PLcom/android/server/dreams/DreamController;->lambda$new$0$DreamController()V
 HPLcom/android/server/dreams/DreamController;->lambda$stopDream$1$DreamController(Lcom/android/server/dreams/DreamController$DreamRecord;)V
 HPLcom/android/server/dreams/DreamController;->startDream(Landroid/os/Binder;Landroid/content/ComponentName;ZZILandroid/os/PowerManager$WakeLock;)V
 HPLcom/android/server/dreams/DreamController;->stopDream(Z)V
@@ -17586,7 +18689,7 @@
 HPLcom/android/server/dreams/DreamManagerService$BinderService;->finishSelf(Landroid/os/IBinder;Z)V
 HPLcom/android/server/dreams/DreamManagerService$BinderService;->forceAmbientDisplayEnabled(Z)V
 PLcom/android/server/dreams/DreamManagerService$BinderService;->getDefaultDreamComponent()Landroid/content/ComponentName;
-PLcom/android/server/dreams/DreamManagerService$BinderService;->getDefaultDreamComponentForUser(I)Landroid/content/ComponentName;
+HPLcom/android/server/dreams/DreamManagerService$BinderService;->getDefaultDreamComponentForUser(I)Landroid/content/ComponentName;
 HPLcom/android/server/dreams/DreamManagerService$BinderService;->getDreamComponents()[Landroid/content/ComponentName;
 HPLcom/android/server/dreams/DreamManagerService$BinderService;->getDreamComponentsForUser(I)[Landroid/content/ComponentName;
 HPLcom/android/server/dreams/DreamManagerService$BinderService;->isDreaming()Z
@@ -17687,6 +18790,7 @@
 HSPLcom/android/server/firewall/AndFilter$1;-><init>(Ljava/lang/String;)V
 HSPLcom/android/server/firewall/AndFilter;-><clinit>()V
 HSPLcom/android/server/firewall/AndFilter;-><init>()V
+PLcom/android/server/firewall/AndFilter;->matches(Lcom/android/server/firewall/IntentFirewall;Landroid/content/ComponentName;Landroid/content/Intent;IILjava/lang/String;I)Z
 HSPLcom/android/server/firewall/CategoryFilter$1;-><init>(Ljava/lang/String;)V
 HSPLcom/android/server/firewall/CategoryFilter;-><clinit>()V
 HSPLcom/android/server/firewall/FilterFactory;-><init>(Ljava/lang/String;)V
@@ -17701,13 +18805,17 @@
 HSPLcom/android/server/firewall/IntentFirewall$FirewallIntentResolver;-><init>(Lcom/android/server/firewall/IntentFirewall$1;)V
 PLcom/android/server/firewall/IntentFirewall$FirewallIntentResolver;->allowFilterResult(Landroid/content/IntentFilter;Ljava/util/List;)Z
 PLcom/android/server/firewall/IntentFirewall$FirewallIntentResolver;->allowFilterResult(Lcom/android/server/firewall/IntentFirewall$FirewallIntentFilter;Ljava/util/List;)Z
+PLcom/android/server/firewall/IntentFirewall$FirewallIntentResolver;->allowFilterResult(Ljava/lang/Object;Ljava/util/List;)Z
 HSPLcom/android/server/firewall/IntentFirewall$FirewallIntentResolver;->getIntentFilter(Lcom/android/server/firewall/IntentFirewall$FirewallIntentFilter;)Landroid/content/IntentFilter;
 HSPLcom/android/server/firewall/IntentFirewall$FirewallIntentResolver;->getIntentFilter(Ljava/lang/Object;)Landroid/content/IntentFilter;
 PLcom/android/server/firewall/IntentFirewall$FirewallIntentResolver;->isPackageForFilter(Ljava/lang/String;Landroid/content/IntentFilter;)Z
 PLcom/android/server/firewall/IntentFirewall$FirewallIntentResolver;->isPackageForFilter(Ljava/lang/String;Lcom/android/server/firewall/IntentFirewall$FirewallIntentFilter;)Z
+PLcom/android/server/firewall/IntentFirewall$FirewallIntentResolver;->isPackageForFilter(Ljava/lang/String;Ljava/lang/Object;)Z
 HSPLcom/android/server/firewall/IntentFirewall$FirewallIntentResolver;->newArray(I)[Landroid/content/IntentFilter;
 HSPLcom/android/server/firewall/IntentFirewall$FirewallIntentResolver;->newArray(I)[Lcom/android/server/firewall/IntentFirewall$FirewallIntentFilter;
 HSPLcom/android/server/firewall/IntentFirewall$FirewallIntentResolver;->newArray(I)[Ljava/lang/Object;
+PLcom/android/server/firewall/IntentFirewall$FirewallIntentResolver;->newResult(Lcom/android/server/firewall/IntentFirewall$FirewallIntentFilter;II)Lcom/android/server/firewall/IntentFirewall$Rule;
+PLcom/android/server/firewall/IntentFirewall$FirewallIntentResolver;->newResult(Ljava/lang/Object;II)Ljava/lang/Object;
 HSPLcom/android/server/firewall/IntentFirewall$FirewallIntentResolver;->queryByComponent(Landroid/content/ComponentName;Ljava/util/List;)V
 HSPLcom/android/server/firewall/IntentFirewall$FirewallIntentResolver;->sortResults(Ljava/util/List;)V
 HSPLcom/android/server/firewall/IntentFirewall$Rule;-><init>()V
@@ -17748,6 +18856,7 @@
 HSPLcom/android/server/firewall/StringFilter$1;-><init>(Ljava/lang/String;)V
 HSPLcom/android/server/firewall/StringFilter$2;-><init>(Ljava/lang/String;)V
 HSPLcom/android/server/firewall/StringFilter$3;-><init>(Ljava/lang/String;)V
+PLcom/android/server/firewall/StringFilter$3;->getValue(Landroid/content/ComponentName;Landroid/content/Intent;Ljava/lang/String;)Ljava/lang/String;
 HSPLcom/android/server/firewall/StringFilter$4;-><init>(Ljava/lang/String;)V
 HSPLcom/android/server/firewall/StringFilter$5;-><init>(Ljava/lang/String;)V
 HSPLcom/android/server/firewall/StringFilter$6;-><init>(Ljava/lang/String;)V
@@ -17755,12 +18864,14 @@
 HSPLcom/android/server/firewall/StringFilter$8;-><init>(Ljava/lang/String;)V
 HSPLcom/android/server/firewall/StringFilter$9;-><init>(Ljava/lang/String;)V
 HSPLcom/android/server/firewall/StringFilter$EqualsFilter;-><init>(Lcom/android/server/firewall/StringFilter$ValueProvider;Ljava/lang/String;)V
+PLcom/android/server/firewall/StringFilter$EqualsFilter;->matchesValue(Ljava/lang/String;)Z
 HSPLcom/android/server/firewall/StringFilter$ValueProvider;-><init>(Ljava/lang/String;)V
 HSPLcom/android/server/firewall/StringFilter$ValueProvider;->newFilter(Lorg/xmlpull/v1/XmlPullParser;)Lcom/android/server/firewall/Filter;
 HSPLcom/android/server/firewall/StringFilter;-><clinit>()V
 HSPLcom/android/server/firewall/StringFilter;-><init>(Lcom/android/server/firewall/StringFilter$ValueProvider;)V
 HSPLcom/android/server/firewall/StringFilter;-><init>(Lcom/android/server/firewall/StringFilter$ValueProvider;Lcom/android/server/firewall/StringFilter$1;)V
 HSPLcom/android/server/firewall/StringFilter;->getFilter(Lcom/android/server/firewall/StringFilter$ValueProvider;Lorg/xmlpull/v1/XmlPullParser;I)Lcom/android/server/firewall/StringFilter;
+PLcom/android/server/firewall/StringFilter;->matches(Lcom/android/server/firewall/IntentFirewall;Landroid/content/ComponentName;Landroid/content/Intent;IILjava/lang/String;I)Z
 HSPLcom/android/server/firewall/StringFilter;->readFromXml(Lcom/android/server/firewall/StringFilter$ValueProvider;Lorg/xmlpull/v1/XmlPullParser;)Lcom/android/server/firewall/StringFilter;
 PLcom/android/server/gpu/GpuService$DeviceConfigListener;-><init>(Lcom/android/server/gpu/GpuService;)V
 PLcom/android/server/gpu/GpuService$DeviceConfigListener;->onPropertiesChanged(Landroid/provider/DeviceConfig$Properties;)V
@@ -17947,6 +19058,7 @@
 HSPLcom/android/server/input/InputManagerService$10;-><init>(Lcom/android/server/input/InputManagerService;Landroid/os/Handler;)V
 PLcom/android/server/input/InputManagerService$10;->onChange(Z)V
 HSPLcom/android/server/input/InputManagerService$11;-><init>(Lcom/android/server/input/InputManagerService;Landroid/os/Handler;)V
+PLcom/android/server/input/InputManagerService$12;-><init>(Lcom/android/server/input/InputManagerService;Landroid/os/Handler;)V
 HSPLcom/android/server/input/InputManagerService$1;-><init>(Lcom/android/server/input/InputManagerService;)V
 HSPLcom/android/server/input/InputManagerService$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
 HSPLcom/android/server/input/InputManagerService$2;-><init>(Lcom/android/server/input/InputManagerService;)V
@@ -17954,7 +19066,7 @@
 HSPLcom/android/server/input/InputManagerService$3;-><init>(Lcom/android/server/input/InputManagerService;)V
 PLcom/android/server/input/InputManagerService$3;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
 PLcom/android/server/input/InputManagerService$4;-><init>(Lcom/android/server/input/InputManagerService;Landroid/view/InputDevice;Ljava/util/Locale;Ljava/util/List;)V
-PLcom/android/server/input/InputManagerService$4;->visitKeyboardLayout(Landroid/content/res/Resources;ILandroid/hardware/input/KeyboardLayout;)V
+HPLcom/android/server/input/InputManagerService$4;->visitKeyboardLayout(Landroid/content/res/Resources;ILandroid/hardware/input/KeyboardLayout;)V
 HSPLcom/android/server/input/InputManagerService$5;-><init>(Lcom/android/server/input/InputManagerService;Ljava/util/HashSet;)V
 HSPLcom/android/server/input/InputManagerService$5;->visitKeyboardLayout(Landroid/content/res/Resources;ILandroid/hardware/input/KeyboardLayout;)V
 HSPLcom/android/server/input/InputManagerService$9;-><init>(Lcom/android/server/input/InputManagerService;Landroid/os/Handler;)V
@@ -17976,21 +19088,36 @@
 HSPLcom/android/server/input/InputManagerService$LocalService;->setDisplayViewports(Ljava/util/List;)V
 HPLcom/android/server/input/InputManagerService$LocalService;->setInteractive(Z)V
 HSPLcom/android/server/input/InputManagerService$LocalService;->setPulseGestureEnabled(Z)V
+PLcom/android/server/input/InputManagerService$LocalService;->transferTouchFocus(Landroid/os/IBinder;Landroid/os/IBinder;)Z
 HSPLcom/android/server/input/InputManagerService;-><init>(Landroid/content/Context;)V
 HSPLcom/android/server/input/InputManagerService;->access$100(Lcom/android/server/input/InputManagerService;)V
 HPLcom/android/server/input/InputManagerService;->access$1000(JLandroid/view/InputEvent;IIIII)I
 HPLcom/android/server/input/InputManagerService;->access$1100(JLandroid/os/IBinder;)V
 PLcom/android/server/input/InputManagerService;->access$1200(JLandroid/view/InputChannel;)V
+PLcom/android/server/input/InputManagerService;->access$1300(Lcom/android/server/input/InputManagerService;)J
 HPLcom/android/server/input/InputManagerService;->access$1300(Lcom/android/server/input/InputManagerService;I)V
+PLcom/android/server/input/InputManagerService;->access$1400(JLandroid/view/InputEvent;IIIII)I
+PLcom/android/server/input/InputManagerService;->access$1500(JLandroid/os/IBinder;)V
 HSPLcom/android/server/input/InputManagerService;->access$1500(Lcom/android/server/input/InputManagerService;Ljava/util/List;)V
+PLcom/android/server/input/InputManagerService;->access$1600(JLandroid/view/InputChannel;)V
 HPLcom/android/server/input/InputManagerService;->access$1700(JZ)V
+PLcom/android/server/input/InputManagerService;->access$1700(Lcom/android/server/input/InputManagerService;I)V
 HSPLcom/android/server/input/InputManagerService;->access$1900(Lcom/android/server/input/InputManagerService;)Ljava/io/File;
+PLcom/android/server/input/InputManagerService;->access$1900(Lcom/android/server/input/InputManagerService;Ljava/util/List;)V
 HSPLcom/android/server/input/InputManagerService;->access$200(Lcom/android/server/input/InputManagerService;)V
+PLcom/android/server/input/InputManagerService;->access$2100(JZ)V
+PLcom/android/server/input/InputManagerService;->access$2300(Lcom/android/server/input/InputManagerService;)Ljava/io/File;
+PLcom/android/server/input/InputManagerService;->access$300(Lcom/android/server/input/InputManagerService;)V
+PLcom/android/server/input/InputManagerService;->access$400(Lcom/android/server/input/InputManagerService;Ljava/lang/String;)V
+PLcom/android/server/input/InputManagerService;->access$500(Lcom/android/server/input/InputManagerService;)V
 HSPLcom/android/server/input/InputManagerService;->access$500(Lcom/android/server/input/InputManagerService;[Landroid/view/InputDevice;)V
+PLcom/android/server/input/InputManagerService;->access$600(Lcom/android/server/input/InputManagerService;)V
 HPLcom/android/server/input/InputManagerService;->access$900(Lcom/android/server/input/InputManagerService;)J
+PLcom/android/server/input/InputManagerService;->access$900(Lcom/android/server/input/InputManagerService;[Landroid/view/InputDevice;)V
 HSPLcom/android/server/input/InputManagerService;->canDispatchToDisplay(II)Z
 HPLcom/android/server/input/InputManagerService;->checkCallingPermission(Ljava/lang/String;Ljava/lang/String;)Z
 HPLcom/android/server/input/InputManagerService;->checkInjectEventsPermission(II)Z
+PLcom/android/server/input/InputManagerService;->containsInputDeviceWithDescriptor([Landroid/view/InputDevice;Ljava/lang/String;)Z
 HSPLcom/android/server/input/InputManagerService;->deliverInputDevicesChanged([Landroid/view/InputDevice;)V
 PLcom/android/server/input/InputManagerService;->dispatchUnhandledKey(Landroid/os/IBinder;Landroid/view/KeyEvent;I)Landroid/view/KeyEvent;
 PLcom/android/server/input/InputManagerService;->dump(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V
@@ -18048,6 +19175,7 @@
 HSPLcom/android/server/input/InputManagerService;->registerAccessibilityLargePointerSettingObserver()V
 HSPLcom/android/server/input/InputManagerService;->registerInputChannel(Landroid/view/InputChannel;)V
 HPLcom/android/server/input/InputManagerService;->registerInputDevicesChangedListener(Landroid/hardware/input/IInputDevicesChangedListener;)V
+PLcom/android/server/input/InputManagerService;->registerLongPressTimeoutObserver()V
 HSPLcom/android/server/input/InputManagerService;->registerPointerSpeedSettingObserver()V
 HSPLcom/android/server/input/InputManagerService;->registerShowTouchesSettingObserver()V
 HSPLcom/android/server/input/InputManagerService;->reloadDeviceAliases()V
@@ -18066,9 +19194,11 @@
 PLcom/android/server/input/InputManagerService;->showMissingKeyboardLayoutNotification(Landroid/view/InputDevice;)V
 HSPLcom/android/server/input/InputManagerService;->start()V
 HSPLcom/android/server/input/InputManagerService;->systemRunning()V
+PLcom/android/server/input/InputManagerService;->transferTouchFocus(Landroid/os/IBinder;Landroid/os/IBinder;)Z
 PLcom/android/server/input/InputManagerService;->transferTouchFocus(Landroid/view/InputChannel;Landroid/view/InputChannel;)Z
 HPLcom/android/server/input/InputManagerService;->unregisterInputChannel(Landroid/view/InputChannel;)V
 HSPLcom/android/server/input/InputManagerService;->updateAccessibilityLargePointerFromSettings()V
+PLcom/android/server/input/InputManagerService;->updateDeepPressStatusFromSettings(Ljava/lang/String;)V
 HSPLcom/android/server/input/InputManagerService;->updateKeyboardLayouts()V
 HSPLcom/android/server/input/InputManagerService;->updatePointerSpeedFromSettings()V
 HSPLcom/android/server/input/InputManagerService;->updateShowTouchesFromSettings()V
@@ -18113,6 +19243,8 @@
 PLcom/android/server/inputmethod/InputMethodManagerService$ActivityViewInfo;-><init>(Lcom/android/server/inputmethod/InputMethodManagerService$ClientState;Landroid/graphics/Matrix;)V
 PLcom/android/server/inputmethod/InputMethodManagerService$ActivityViewInfo;->access$1300(Lcom/android/server/inputmethod/InputMethodManagerService$ActivityViewInfo;)Lcom/android/server/inputmethod/InputMethodManagerService$ClientState;
 PLcom/android/server/inputmethod/InputMethodManagerService$ActivityViewInfo;->access$1400(Lcom/android/server/inputmethod/InputMethodManagerService$ActivityViewInfo;)Landroid/graphics/Matrix;
+HPLcom/android/server/inputmethod/InputMethodManagerService$ActivityViewInfo;->access$1600(Lcom/android/server/inputmethod/InputMethodManagerService$ActivityViewInfo;)Lcom/android/server/inputmethod/InputMethodManagerService$ClientState;
+HPLcom/android/server/inputmethod/InputMethodManagerService$ActivityViewInfo;->access$1700(Lcom/android/server/inputmethod/InputMethodManagerService$ActivityViewInfo;)Landroid/graphics/Matrix;
 HSPLcom/android/server/inputmethod/InputMethodManagerService$ClientDeathRecipient;-><init>(Lcom/android/server/inputmethod/InputMethodManagerService;Lcom/android/internal/view/IInputMethodClient;)V
 HPLcom/android/server/inputmethod/InputMethodManagerService$ClientDeathRecipient;->binderDied()V
 HSPLcom/android/server/inputmethod/InputMethodManagerService$ClientState;-><init>(Lcom/android/internal/view/IInputMethodClient;Lcom/android/internal/view/IInputContext;IIILcom/android/server/inputmethod/InputMethodManagerService$ClientDeathRecipient;)V
@@ -18135,10 +19267,16 @@
 PLcom/android/server/inputmethod/InputMethodManagerService$ImmsBroadcastReceiverForSystemUser;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
 PLcom/android/server/inputmethod/InputMethodManagerService$InlineSuggestionsRequestCallbackDecorator;-><init>(Lcom/android/internal/view/IInlineSuggestionsRequestCallback;Ljava/lang/String;)V
 PLcom/android/server/inputmethod/InputMethodManagerService$InlineSuggestionsRequestCallbackDecorator;-><init>(Lcom/android/internal/view/IInlineSuggestionsRequestCallback;Ljava/lang/String;I)V
+HPLcom/android/server/inputmethod/InputMethodManagerService$InlineSuggestionsRequestCallbackDecorator;-><init>(Lcom/android/internal/view/IInlineSuggestionsRequestCallback;Ljava/lang/String;ILandroid/os/IBinder;Lcom/android/server/inputmethod/InputMethodManagerService;)V
 HPLcom/android/server/inputmethod/InputMethodManagerService$InlineSuggestionsRequestCallbackDecorator;->onInlineSuggestionsRequest(Landroid/view/inputmethod/InlineSuggestionsRequest;Lcom/android/internal/view/IInlineSuggestionsResponseCallback;)V
 PLcom/android/server/inputmethod/InputMethodManagerService$InlineSuggestionsRequestCallbackDecorator;->onInlineSuggestionsRequest(Landroid/view/inputmethod/InlineSuggestionsRequest;Lcom/android/internal/view/IInlineSuggestionsResponseCallback;Landroid/view/autofill/AutofillId;Z)V
 HPLcom/android/server/inputmethod/InputMethodManagerService$InlineSuggestionsRequestCallbackDecorator;->onInlineSuggestionsUnsupported()V
-PLcom/android/server/inputmethod/InputMethodManagerService$InlineSuggestionsRequestCallbackDecorator;->onInputMethodFinishInputView(Landroid/view/autofill/AutofillId;)V
+PLcom/android/server/inputmethod/InputMethodManagerService$InlineSuggestionsRequestCallbackDecorator;->onInputMethodFinishInput()V
+PLcom/android/server/inputmethod/InputMethodManagerService$InlineSuggestionsRequestCallbackDecorator;->onInputMethodFinishInputView()V
+HPLcom/android/server/inputmethod/InputMethodManagerService$InlineSuggestionsRequestCallbackDecorator;->onInputMethodFinishInputView(Landroid/view/autofill/AutofillId;)V
+PLcom/android/server/inputmethod/InputMethodManagerService$InlineSuggestionsRequestCallbackDecorator;->onInputMethodShowInputRequested(Z)V
+HPLcom/android/server/inputmethod/InputMethodManagerService$InlineSuggestionsRequestCallbackDecorator;->onInputMethodStartInput(Landroid/view/autofill/AutofillId;)V
+PLcom/android/server/inputmethod/InputMethodManagerService$InlineSuggestionsRequestCallbackDecorator;->onInputMethodStartInputView()V
 HPLcom/android/server/inputmethod/InputMethodManagerService$InlineSuggestionsRequestCallbackDecorator;->onInputMethodStartInputView(Landroid/view/autofill/AutofillId;)V
 PLcom/android/server/inputmethod/InputMethodManagerService$InputMethodPrivilegedOperationsImpl;-><init>(Lcom/android/server/inputmethod/InputMethodManagerService;Landroid/os/IBinder;)V
 HPLcom/android/server/inputmethod/InputMethodManagerService$InputMethodPrivilegedOperationsImpl;->applyImeVisibility(Landroid/os/IBinder;Z)V
@@ -18167,6 +19305,7 @@
 PLcom/android/server/inputmethod/InputMethodManagerService$LocalServiceImpl;->onCreateInlineSuggestionsRequest(ILandroid/content/ComponentName;Landroid/view/autofill/AutofillId;Lcom/android/internal/view/IInlineSuggestionsRequestCallback;)V
 PLcom/android/server/inputmethod/InputMethodManagerService$LocalServiceImpl;->onCreateInlineSuggestionsRequest(ILcom/android/internal/view/InlineSuggestionsRequestInfo;Lcom/android/internal/view/IInlineSuggestionsRequestCallback;)V
 HPLcom/android/server/inputmethod/InputMethodManagerService$LocalServiceImpl;->setInteractive(Z)V
+PLcom/android/server/inputmethod/InputMethodManagerService$LocalServiceImpl;->transferTouchFocusToImeWindow(Landroid/os/IBinder;I)Z
 HPLcom/android/server/inputmethod/InputMethodManagerService$MethodCallback;-><init>(Lcom/android/server/inputmethod/InputMethodManagerService;Lcom/android/internal/view/IInputMethod;Landroid/view/InputChannel;)V
 HPLcom/android/server/inputmethod/InputMethodManagerService$MethodCallback;->sessionCreated(Lcom/android/internal/view/IInputMethodSession;)V
 HSPLcom/android/server/inputmethod/InputMethodManagerService$MyPackageMonitor;-><init>(Lcom/android/server/inputmethod/InputMethodManagerService;)V
@@ -18190,6 +19329,7 @@
 PLcom/android/server/inputmethod/InputMethodManagerService$SettingsObserver;->onChange(ZLandroid/net/Uri;)V
 HSPLcom/android/server/inputmethod/InputMethodManagerService$SettingsObserver;->registerContentObserverLocked(I)V
 PLcom/android/server/inputmethod/InputMethodManagerService$SettingsObserver;->toString()Ljava/lang/String;
+HPLcom/android/server/inputmethod/InputMethodManagerService$SoftInputShowHideHistory$Entry;-><init>(Lcom/android/server/inputmethod/InputMethodManagerService$ClientState;Landroid/view/inputmethod/EditorInfo;Ljava/lang/String;IIZLjava/lang/String;)V
 HPLcom/android/server/inputmethod/InputMethodManagerService$SoftInputShowHideHistory$Entry;-><init>(Lcom/android/server/inputmethod/InputMethodManagerService$ClientState;Ljava/lang/String;IIZ)V
 HSPLcom/android/server/inputmethod/InputMethodManagerService$SoftInputShowHideHistory;-><clinit>()V
 HSPLcom/android/server/inputmethod/InputMethodManagerService$SoftInputShowHideHistory;-><init>()V
@@ -18205,23 +19345,25 @@
 HSPLcom/android/server/inputmethod/InputMethodManagerService$StartInputHistory;->getEntrySize()I
 PLcom/android/server/inputmethod/InputMethodManagerService$StartInputInfo;-><clinit>()V
 HPLcom/android/server/inputmethod/InputMethodManagerService$StartInputInfo;-><init>(ILandroid/os/IBinder;ILjava/lang/String;IZIILandroid/os/IBinder;Landroid/view/inputmethod/EditorInfo;II)V
-PLcom/android/server/inputmethod/InputMethodManagerService$UserSwitchHandlerTask;-><init>(Lcom/android/server/inputmethod/InputMethodManagerService;ILcom/android/internal/view/IInputMethodClient;)V
-PLcom/android/server/inputmethod/InputMethodManagerService$UserSwitchHandlerTask;->run()V
+HPLcom/android/server/inputmethod/InputMethodManagerService$UserSwitchHandlerTask;-><init>(Lcom/android/server/inputmethod/InputMethodManagerService;ILcom/android/internal/view/IInputMethodClient;)V
+HPLcom/android/server/inputmethod/InputMethodManagerService$UserSwitchHandlerTask;->run()V
 HSPLcom/android/server/inputmethod/InputMethodManagerService;-><init>(Landroid/content/Context;)V
 PLcom/android/server/inputmethod/InputMethodManagerService;->access$1000(Lcom/android/server/inputmethod/InputMethodManagerService;)Lcom/android/server/inputmethod/InputMethodManagerService$UserSwitchHandlerTask;
 PLcom/android/server/inputmethod/InputMethodManagerService;->access$1002(Lcom/android/server/inputmethod/InputMethodManagerService;Lcom/android/server/inputmethod/InputMethodManagerService$UserSwitchHandlerTask;)Lcom/android/server/inputmethod/InputMethodManagerService$UserSwitchHandlerTask;
 PLcom/android/server/inputmethod/InputMethodManagerService;->access$1100(Lcom/android/server/inputmethod/InputMethodManagerService;)Lcom/android/server/inputmethod/InputMethodManagerService$UserSwitchHandlerTask;
 PLcom/android/server/inputmethod/InputMethodManagerService;->access$1100(Lcom/android/server/inputmethod/InputMethodManagerService;ILcom/android/internal/view/IInputMethodClient;)V
 PLcom/android/server/inputmethod/InputMethodManagerService;->access$1102(Lcom/android/server/inputmethod/InputMethodManagerService;Lcom/android/server/inputmethod/InputMethodManagerService$UserSwitchHandlerTask;)Lcom/android/server/inputmethod/InputMethodManagerService$UserSwitchHandlerTask;
-PLcom/android/server/inputmethod/InputMethodManagerService;->access$1200(Lcom/android/server/inputmethod/InputMethodManagerService;ILcom/android/internal/view/IInputMethodClient;)V
+HPLcom/android/server/inputmethod/InputMethodManagerService;->access$1200(Lcom/android/server/inputmethod/InputMethodManagerService;ILcom/android/internal/view/IInputMethodClient;)V
 PLcom/android/server/inputmethod/InputMethodManagerService;->access$1500(Lcom/android/server/inputmethod/InputMethodManagerService;)[Landroid/view/inputmethod/InputMethodInfo;
 PLcom/android/server/inputmethod/InputMethodManagerService;->access$1600(Lcom/android/server/inputmethod/InputMethodManagerService;)[I
 PLcom/android/server/inputmethod/InputMethodManagerService;->access$1700(Lcom/android/server/inputmethod/InputMethodManagerService;I)Ljava/util/List;
 PLcom/android/server/inputmethod/InputMethodManagerService;->access$1800(Lcom/android/server/inputmethod/InputMethodManagerService;I)Ljava/util/List;
 PLcom/android/server/inputmethod/InputMethodManagerService;->access$1900(Lcom/android/server/inputmethod/InputMethodManagerService;ILandroid/content/ComponentName;Landroid/view/autofill/AutofillId;Lcom/android/internal/view/IInlineSuggestionsRequestCallback;)V
 PLcom/android/server/inputmethod/InputMethodManagerService;->access$2000(Lcom/android/server/inputmethod/InputMethodManagerService;I)Ljava/util/List;
+PLcom/android/server/inputmethod/InputMethodManagerService;->access$2100(Lcom/android/server/inputmethod/InputMethodManagerService;I)Ljava/util/List;
 PLcom/android/server/inputmethod/InputMethodManagerService;->access$2100(Lcom/android/server/inputmethod/InputMethodManagerService;ILcom/android/internal/view/InlineSuggestionsRequestInfo;Lcom/android/internal/view/IInlineSuggestionsRequestCallback;)V
 PLcom/android/server/inputmethod/InputMethodManagerService;->access$2200(Lcom/android/server/inputmethod/InputMethodManagerService;ILcom/android/internal/view/InlineSuggestionsRequestInfo;Lcom/android/internal/view/IInlineSuggestionsRequestCallback;)V
+PLcom/android/server/inputmethod/InputMethodManagerService;->access$2500(Lcom/android/server/inputmethod/InputMethodManagerService;Landroid/os/IBinder;I)Z
 PLcom/android/server/inputmethod/InputMethodManagerService;->access$2500(Lcom/android/server/inputmethod/InputMethodManagerService;Landroid/os/IBinder;II)V
 PLcom/android/server/inputmethod/InputMethodManagerService;->access$2500(Lcom/android/server/inputmethod/InputMethodManagerService;Landroid/os/IBinder;Landroid/os/IBinder;)V
 PLcom/android/server/inputmethod/InputMethodManagerService;->access$2600(Lcom/android/server/inputmethod/InputMethodManagerService;Landroid/os/IBinder;II)V
@@ -18239,9 +19381,11 @@
 PLcom/android/server/inputmethod/InputMethodManagerService;->access$3000(Lcom/android/server/inputmethod/InputMethodManagerService;Landroid/os/IBinder;II)V
 PLcom/android/server/inputmethod/InputMethodManagerService;->access$3000(Lcom/android/server/inputmethod/InputMethodManagerService;Landroid/os/IBinder;Landroid/os/IBinder;)V
 HPLcom/android/server/inputmethod/InputMethodManagerService;->access$3000(Lcom/android/server/inputmethod/InputMethodManagerService;Landroid/os/IBinder;Z)V
+PLcom/android/server/inputmethod/InputMethodManagerService;->access$3100(Lcom/android/server/inputmethod/InputMethodManagerService;Landroid/os/IBinder;II)V
 PLcom/android/server/inputmethod/InputMethodManagerService;->access$3100(Lcom/android/server/inputmethod/InputMethodManagerService;Landroid/os/IBinder;Landroid/os/IBinder;)V
 PLcom/android/server/inputmethod/InputMethodManagerService;->access$3100(Lcom/android/server/inputmethod/InputMethodManagerService;Landroid/os/IBinder;Ljava/lang/String;Landroid/view/inputmethod/InputMethodSubtype;)V
 PLcom/android/server/inputmethod/InputMethodManagerService;->access$3200(Lcom/android/server/inputmethod/InputMethodManagerService;Landroid/os/IBinder;I)V
+PLcom/android/server/inputmethod/InputMethodManagerService;->access$3200(Lcom/android/server/inputmethod/InputMethodManagerService;Landroid/os/IBinder;Landroid/os/IBinder;)V
 PLcom/android/server/inputmethod/InputMethodManagerService;->access$3200(Lcom/android/server/inputmethod/InputMethodManagerService;Landroid/os/IBinder;Ljava/lang/String;Landroid/view/inputmethod/InputMethodSubtype;)V
 PLcom/android/server/inputmethod/InputMethodManagerService;->access$3200(Lcom/android/server/inputmethod/InputMethodManagerService;Landroid/os/IBinder;Z)V
 PLcom/android/server/inputmethod/InputMethodManagerService;->access$3300(Lcom/android/server/inputmethod/InputMethodManagerService;Landroid/os/IBinder;I)V
@@ -18249,21 +19393,28 @@
 PLcom/android/server/inputmethod/InputMethodManagerService;->access$3300(Lcom/android/server/inputmethod/InputMethodManagerService;Landroid/os/IBinder;Z)V
 PLcom/android/server/inputmethod/InputMethodManagerService;->access$3400(Lcom/android/server/inputmethod/InputMethodManagerService;Landroid/os/IBinder;I)V
 HPLcom/android/server/inputmethod/InputMethodManagerService;->access$3400(Lcom/android/server/inputmethod/InputMethodManagerService;Landroid/os/IBinder;Ljava/lang/String;I)V
+PLcom/android/server/inputmethod/InputMethodManagerService;->access$3400(Lcom/android/server/inputmethod/InputMethodManagerService;Landroid/os/IBinder;Z)V
 PLcom/android/server/inputmethod/InputMethodManagerService;->access$3500(Lcom/android/server/inputmethod/InputMethodManagerService;Landroid/os/IBinder;)Z
 HPLcom/android/server/inputmethod/InputMethodManagerService;->access$3500(Lcom/android/server/inputmethod/InputMethodManagerService;Landroid/os/IBinder;Ljava/lang/String;I)V
 PLcom/android/server/inputmethod/InputMethodManagerService;->access$3600(Lcom/android/server/inputmethod/InputMethodManagerService;Landroid/os/IBinder;)Z
 PLcom/android/server/inputmethod/InputMethodManagerService;->access$3600(Lcom/android/server/inputmethod/InputMethodManagerService;Landroid/os/IBinder;Z)Z
 PLcom/android/server/inputmethod/InputMethodManagerService;->access$3700(Lcom/android/server/inputmethod/InputMethodManagerService;Landroid/os/IBinder;)V
 PLcom/android/server/inputmethod/InputMethodManagerService;->access$3700(Lcom/android/server/inputmethod/InputMethodManagerService;Landroid/os/IBinder;)Z
+PLcom/android/server/inputmethod/InputMethodManagerService;->access$3700(Lcom/android/server/inputmethod/InputMethodManagerService;Landroid/os/IBinder;I)V
 PLcom/android/server/inputmethod/InputMethodManagerService;->access$3700(Lcom/android/server/inputmethod/InputMethodManagerService;Landroid/os/IBinder;Ljava/lang/String;I)V
 PLcom/android/server/inputmethod/InputMethodManagerService;->access$3800(Lcom/android/server/inputmethod/InputMethodManagerService;Landroid/os/IBinder;)V
 PLcom/android/server/inputmethod/InputMethodManagerService;->access$3800(Lcom/android/server/inputmethod/InputMethodManagerService;Landroid/os/IBinder;)Z
 PLcom/android/server/inputmethod/InputMethodManagerService;->access$3800(Lcom/android/server/inputmethod/InputMethodManagerService;Landroid/os/IBinder;Ljava/lang/String;I)V
 PLcom/android/server/inputmethod/InputMethodManagerService;->access$3900(Lcom/android/server/inputmethod/InputMethodManagerService;Landroid/os/IBinder;)V
+PLcom/android/server/inputmethod/InputMethodManagerService;->access$3900(Lcom/android/server/inputmethod/InputMethodManagerService;Landroid/os/IBinder;Ljava/lang/String;I)V
 PLcom/android/server/inputmethod/InputMethodManagerService;->access$400(Lcom/android/server/inputmethod/InputMethodManagerService;)Landroid/util/ArrayMap;
 PLcom/android/server/inputmethod/InputMethodManagerService;->access$4200(Lcom/android/server/inputmethod/InputMethodManagerService;Landroid/os/IBinder;)V
+PLcom/android/server/inputmethod/InputMethodManagerService;->access$4200(Lcom/android/server/inputmethod/InputMethodManagerService;Landroid/os/IBinder;)Z
+PLcom/android/server/inputmethod/InputMethodManagerService;->access$4300(Lcom/android/server/inputmethod/InputMethodManagerService;Landroid/os/IBinder;)V
 HPLcom/android/server/inputmethod/InputMethodManagerService;->access$4300(Lcom/android/server/inputmethod/InputMethodManagerService;Landroid/os/IBinder;Landroid/os/IBinder;Z)V
 HPLcom/android/server/inputmethod/InputMethodManagerService;->access$4400(Lcom/android/server/inputmethod/InputMethodManagerService;Landroid/os/IBinder;Landroid/os/IBinder;Z)V
+PLcom/android/server/inputmethod/InputMethodManagerService;->access$4500(Lcom/android/server/inputmethod/InputMethodManagerService;Landroid/os/IBinder;Landroid/os/IBinder;Z)V
+PLcom/android/server/inputmethod/InputMethodManagerService;->access$500(Lcom/android/server/inputmethod/InputMethodManagerService;)Landroid/util/ArrayMap;
 PLcom/android/server/inputmethod/InputMethodManagerService;->access$900(Lcom/android/server/inputmethod/InputMethodManagerService;)Landroid/app/AlertDialog;
 HSPLcom/android/server/inputmethod/InputMethodManagerService;->addClient(Lcom/android/internal/view/IInputMethodClient;Lcom/android/internal/view/IInputContext;I)V
 HPLcom/android/server/inputmethod/InputMethodManagerService;->applyImeVisibility(Landroid/os/IBinder;Landroid/os/IBinder;Z)V
@@ -18331,6 +19482,7 @@
 HSPLcom/android/server/inputmethod/InputMethodManagerService;->resetSelectedInputMethodAndSubtypeLocked(Ljava/lang/String;)V
 HPLcom/android/server/inputmethod/InputMethodManagerService;->scheduleSwitchUserTaskLocked(ILcom/android/internal/view/IInputMethodClient;)V
 PLcom/android/server/inputmethod/InputMethodManagerService;->setAdditionalInputMethodSubtypes(Ljava/lang/String;[Landroid/view/inputmethod/InputMethodSubtype;)V
+PLcom/android/server/inputmethod/InputMethodManagerService;->setCurHostInputToken(Landroid/os/IBinder;Landroid/os/IBinder;)V
 HPLcom/android/server/inputmethod/InputMethodManagerService;->setEnabledSessionInMainThread(Lcom/android/server/inputmethod/InputMethodManagerService$SessionState;)V
 HPLcom/android/server/inputmethod/InputMethodManagerService;->setImeWindowStatus(Landroid/os/IBinder;II)V
 PLcom/android/server/inputmethod/InputMethodManagerService;->setInputMethodAndSubtype(Landroid/os/IBinder;Ljava/lang/String;Landroid/view/inputmethod/InputMethodSubtype;)V
@@ -18357,6 +19509,7 @@
 HPLcom/android/server/inputmethod/InputMethodManagerService;->switchUserLocked(I)V
 HPLcom/android/server/inputmethod/InputMethodManagerService;->switchUserOnHandlerLocked(ILcom/android/internal/view/IInputMethodClient;)V
 HSPLcom/android/server/inputmethod/InputMethodManagerService;->systemRunning(Lcom/android/server/statusbar/StatusBarManagerService;)V
+PLcom/android/server/inputmethod/InputMethodManagerService;->transferTouchFocusToImeWindow(Landroid/os/IBinder;I)Z
 HSPLcom/android/server/inputmethod/InputMethodManagerService;->unbindCurrentClientLocked(I)V
 HPLcom/android/server/inputmethod/InputMethodManagerService;->unbindCurrentMethodLocked()V
 HSPLcom/android/server/inputmethod/InputMethodManagerService;->updateCurrentProfileIds()V
@@ -18416,6 +19569,8 @@
 HSPLcom/android/server/inputmethod/InputMethodUtils$InputMethodSettings;-><init>(Landroid/content/res/Resources;Landroid/content/ContentResolver;Landroid/util/ArrayMap;IZ)V
 HSPLcom/android/server/inputmethod/InputMethodUtils$InputMethodSettings;->addSubtypeToHistory(Ljava/lang/String;Ljava/lang/String;)V
 PLcom/android/server/inputmethod/InputMethodUtils$InputMethodSettings;->appendAndPutEnabledInputMethodLocked(Ljava/lang/String;Z)V
+PLcom/android/server/inputmethod/InputMethodUtils$InputMethodSettings;->buildAndPutEnabledInputMethodsStrRemovingIdLocked(Ljava/lang/StringBuilder;Ljava/util/List;Ljava/lang/String;)Z
+PLcom/android/server/inputmethod/InputMethodUtils$InputMethodSettings;->buildEnabledInputMethodsSettingString(Ljava/lang/StringBuilder;Landroid/util/Pair;)V
 HSPLcom/android/server/inputmethod/InputMethodUtils$InputMethodSettings;->buildInputMethodsAndSubtypeList(Ljava/lang/String;Landroid/text/TextUtils$SimpleStringSplitter;Landroid/text/TextUtils$SimpleStringSplitter;)Ljava/util/List;
 HSPLcom/android/server/inputmethod/InputMethodUtils$InputMethodSettings;->createEnabledInputMethodListLocked(Ljava/util/List;)Ljava/util/ArrayList;
 PLcom/android/server/inputmethod/InputMethodUtils$InputMethodSettings;->dumpLocked(Landroid/util/Printer;Ljava/lang/String;)V
@@ -18485,8 +19640,16 @@
 PLcom/android/server/inputmethod/LocaleUtils$ScoreEntry;->updateIfBetter([BI)V
 HPLcom/android/server/inputmethod/LocaleUtils;->calculateMatchingSubScore(Landroid/icu/util/ULocale;Landroid/icu/util/ULocale;)B
 HPLcom/android/server/inputmethod/LocaleUtils;->filterByLanguage(Ljava/util/List;Lcom/android/server/inputmethod/LocaleUtils$LocaleExtractor;Landroid/os/LocaleList;Ljava/util/ArrayList;)V
+PLcom/android/server/integrity/-$$Lambda$6mVxeiJkzyLjahsCCu7FkV8cQDo;-><clinit>()V
+PLcom/android/server/integrity/-$$Lambda$6mVxeiJkzyLjahsCCu7FkV8cQDo;-><init>()V
+PLcom/android/server/integrity/-$$Lambda$6mVxeiJkzyLjahsCCu7FkV8cQDo;->get()Ljava/lang/Object;
 PLcom/android/server/integrity/-$$Lambda$AppIntegrityManagerServiceImpl$1$AQicMJqZVSufBnAD8HJ81gPtf7Y;-><init>(Lcom/android/server/integrity/AppIntegrityManagerServiceImpl$1;Landroid/content/Intent;)V
 PLcom/android/server/integrity/-$$Lambda$AppIntegrityManagerServiceImpl$1$AQicMJqZVSufBnAD8HJ81gPtf7Y;->run()V
+PLcom/android/server/integrity/-$$Lambda$AppIntegrityManagerServiceImpl$EJKhyxMTfEInZjAjFTeFJAPkt1k;-><init>(Ljava/lang/String;)V
+PLcom/android/server/integrity/-$$Lambda$AppIntegrityManagerServiceImpl$EJKhyxMTfEInZjAjFTeFJAPkt1k;->test(Ljava/lang/Object;)Z
+PLcom/android/server/integrity/-$$Lambda$AppIntegrityManagerServiceImpl$ct2NSvc_tnI1IXBlQD5h7WqKow4;-><clinit>()V
+PLcom/android/server/integrity/-$$Lambda$AppIntegrityManagerServiceImpl$ct2NSvc_tnI1IXBlQD5h7WqKow4;-><init>()V
+PLcom/android/server/integrity/-$$Lambda$AppIntegrityManagerServiceImpl$ct2NSvc_tnI1IXBlQD5h7WqKow4;->apply(Ljava/lang/Object;)Ljava/lang/Object;
 PLcom/android/server/integrity/-$$Lambda$AppIntegrityManagerServiceImpl$uoiTatxA4aGwrlfDx0m8FP_FtCo;-><init>(Ljava/lang/String;)V
 PLcom/android/server/integrity/-$$Lambda$AppIntegrityManagerServiceImpl$uoiTatxA4aGwrlfDx0m8FP_FtCo;->test(Ljava/lang/Object;)Z
 HSPLcom/android/server/integrity/AppIntegrityManagerService;-><init>(Landroid/content/Context;)V
@@ -18499,10 +19662,11 @@
 HSPLcom/android/server/integrity/AppIntegrityManagerServiceImpl;-><init>(Landroid/content/Context;Landroid/content/pm/PackageManagerInternal;Lcom/android/server/integrity/engine/RuleEvaluationEngine;Lcom/android/server/integrity/IntegrityFileManager;Landroid/os/Handler;)V
 HSPLcom/android/server/integrity/AppIntegrityManagerServiceImpl;-><init>(Landroid/content/Context;Landroid/content/pm/PackageManagerInternal;Lcom/android/server/integrity/engine/RuleEvaluationEngine;Lcom/android/server/integrity/IntegrityFileManager;Landroid/os/Handler;Z)V
 HSPLcom/android/server/integrity/AppIntegrityManagerServiceImpl;-><init>(Landroid/content/Context;Landroid/content/pm/PackageManagerInternal;Lcom/android/server/integrity/engine/RuleEvaluationEngine;Lcom/android/server/integrity/IntegrityFileManager;Landroid/security/FileIntegrityManager;Landroid/os/Handler;)V
+PLcom/android/server/integrity/AppIntegrityManagerServiceImpl;-><init>(Landroid/content/Context;Landroid/content/pm/PackageManagerInternal;Ljava/util/function/Supplier;Lcom/android/server/integrity/engine/RuleEvaluationEngine;Lcom/android/server/integrity/IntegrityFileManager;Landroid/os/Handler;)V
 PLcom/android/server/integrity/AppIntegrityManagerServiceImpl;->access$000(Lcom/android/server/integrity/AppIntegrityManagerServiceImpl;)Landroid/os/Handler;
 PLcom/android/server/integrity/AppIntegrityManagerServiceImpl;->access$100(Lcom/android/server/integrity/AppIntegrityManagerServiceImpl;Landroid/content/Intent;)V
 HSPLcom/android/server/integrity/AppIntegrityManagerServiceImpl;->create(Landroid/content/Context;)Lcom/android/server/integrity/AppIntegrityManagerServiceImpl;
-PLcom/android/server/integrity/AppIntegrityManagerServiceImpl;->extractSourceStamp(Landroid/net/Uri;Landroid/content/integrity/AppInstallMetadata$Builder;)V
+HPLcom/android/server/integrity/AppIntegrityManagerServiceImpl;->extractSourceStamp(Landroid/net/Uri;Landroid/content/integrity/AppInstallMetadata$Builder;)V
 PLcom/android/server/integrity/AppIntegrityManagerServiceImpl;->getAllowedInstallers(Landroid/content/pm/PackageInfo;)Ljava/util/Map;
 PLcom/android/server/integrity/AppIntegrityManagerServiceImpl;->getAllowedRuleProviders()Ljava/util/List;
 PLcom/android/server/integrity/AppIntegrityManagerServiceImpl;->getCertificateFingerprint(Landroid/content/pm/PackageInfo;)Ljava/lang/String;
@@ -18519,11 +19683,14 @@
 PLcom/android/server/integrity/AppIntegrityManagerServiceImpl;->getSignature(Landroid/content/pm/PackageInfo;)Landroid/content/pm/Signature;
 PLcom/android/server/integrity/AppIntegrityManagerServiceImpl;->getSignatures(Landroid/content/pm/PackageInfo;)[Landroid/content/pm/Signature;
 HPLcom/android/server/integrity/AppIntegrityManagerServiceImpl;->handleIntegrityVerification(Landroid/content/Intent;)V
+PLcom/android/server/integrity/AppIntegrityManagerServiceImpl;->integrityCheckIncludesRuleProvider()Z
 PLcom/android/server/integrity/AppIntegrityManagerServiceImpl;->isCausedByAppCertRule(Lcom/android/server/integrity/model/IntegrityCheckResult;)Z
 PLcom/android/server/integrity/AppIntegrityManagerServiceImpl;->isCausedByInstallerRule(Lcom/android/server/integrity/model/IntegrityCheckResult;)Z
 PLcom/android/server/integrity/AppIntegrityManagerServiceImpl;->isRuleProvider(Ljava/lang/String;)Z
 PLcom/android/server/integrity/AppIntegrityManagerServiceImpl;->isSystemApp(Ljava/lang/String;)Z
+PLcom/android/server/integrity/AppIntegrityManagerServiceImpl;->lambda$extractSourceStamp$1(Ljava/nio/file/Path;)Ljava/lang/String;
 PLcom/android/server/integrity/AppIntegrityManagerServiceImpl;->lambda$isRuleProvider$1(Ljava/lang/String;Ljava/lang/String;)Z
+PLcom/android/server/integrity/AppIntegrityManagerServiceImpl;->lambda$isRuleProvider$2(Ljava/lang/String;Ljava/lang/String;)Z
 HSPLcom/android/server/integrity/IntegrityFileManager;-><clinit>()V
 HSPLcom/android/server/integrity/IntegrityFileManager;-><init>()V
 HSPLcom/android/server/integrity/IntegrityFileManager;-><init>(Lcom/android/server/integrity/parser/RuleParser;Lcom/android/server/integrity/serializer/RuleSerializer;Ljava/io/File;)V
@@ -18538,6 +19705,7 @@
 PLcom/android/server/integrity/engine/-$$Lambda$RuleEvaluator$unAwA1sQfXbWYCFQp7qIaNkgC10;-><init>(Landroid/content/integrity/AppInstallMetadata;)V
 HSPLcom/android/server/integrity/engine/RuleEvaluationEngine;-><init>(Lcom/android/server/integrity/IntegrityFileManager;)V
 PLcom/android/server/integrity/engine/RuleEvaluationEngine;->allowedInstallersRule(Ljava/util/Map;)Ljava/util/Optional;
+PLcom/android/server/integrity/engine/RuleEvaluationEngine;->evaluate(Landroid/content/integrity/AppInstallMetadata;)Lcom/android/server/integrity/model/IntegrityCheckResult;
 PLcom/android/server/integrity/engine/RuleEvaluationEngine;->evaluate(Landroid/content/integrity/AppInstallMetadata;Ljava/util/Map;)Lcom/android/server/integrity/model/IntegrityCheckResult;
 HSPLcom/android/server/integrity/engine/RuleEvaluationEngine;->getRuleEvaluationEngine()Lcom/android/server/integrity/engine/RuleEvaluationEngine;
 PLcom/android/server/integrity/engine/RuleEvaluationEngine;->loadRules(Landroid/content/integrity/AppInstallMetadata;)Ljava/util/List;
@@ -18590,6 +19758,7 @@
 HSPLcom/android/server/lights/LightsService;->onBootPhase(I)V
 HSPLcom/android/server/lights/LightsService;->onStart()V
 HSPLcom/android/server/lights/LightsService;->populateAvailableLights(Landroid/content/Context;)V
+HSPLcom/android/server/lights/LightsService;->populateAvailableLightsFromHidl(Landroid/content/Context;)V
 HSPLcom/android/server/lights/LogicalLight;-><init>()V
 HSPLcom/android/server/location/-$$Lambda$5U-_NhZgxqnYDZhpyacq4qBxh8k;-><init>(Lcom/android/server/location/GnssSatelliteBlacklistHelper;)V
 HSPLcom/android/server/location/-$$Lambda$5U-_NhZgxqnYDZhpyacq4qBxh8k;->run()V
@@ -18619,6 +19788,9 @@
 HSPLcom/android/server/location/-$$Lambda$AppForegroundHelper$7asxY_maANt1D_AUTchqbCjktH0;->run()V
 HSPLcom/android/server/location/-$$Lambda$AppForegroundHelper$gltDhiWDJwfMNZ8gJdumXZH8_Hg;-><init>(Lcom/android/server/location/AppForegroundHelper;)V
 HSPLcom/android/server/location/-$$Lambda$AppForegroundHelper$gltDhiWDJwfMNZ8gJdumXZH8_Hg;->onUidImportance(II)V
+PLcom/android/server/location/-$$Lambda$AppOpsHelper$1$fPZXj7CVL4Hu3p8NHzaQ4UsXWMw;-><clinit>()V
+PLcom/android/server/location/-$$Lambda$AppOpsHelper$1$fPZXj7CVL4Hu3p8NHzaQ4UsXWMw;-><init>()V
+HPLcom/android/server/location/-$$Lambda$AppOpsHelper$1$fPZXj7CVL4Hu3p8NHzaQ4UsXWMw;->accept(Ljava/lang/Object;Ljava/lang/Object;)V
 HPLcom/android/server/location/-$$Lambda$ContextHubClientBroker$7Uwy0RpQUtRsDYbocrZ-WuXEVJQ;-><init>(Lcom/android/server/location/ContextHubClientBroker;J)V
 HPLcom/android/server/location/-$$Lambda$ContextHubClientBroker$CFacmt7807NhDDkp6CgbkeGnMvQ;-><init>(Landroid/hardware/location/NanoAppMessage;)V
 HPLcom/android/server/location/-$$Lambda$ContextHubClientBroker$CFacmt7807NhDDkp6CgbkeGnMvQ;->accept(Landroid/hardware/location/IContextHubClientCallback;)V
@@ -18836,7 +20008,35 @@
 HSPLcom/android/server/location/AppForegroundHelper;->lambda$onAppForegroundChanged$0$AppForegroundHelper(IZ)V
 HSPLcom/android/server/location/AppForegroundHelper;->onAppForegroundChanged(II)V
 HSPLcom/android/server/location/AppForegroundHelper;->onSystemReady()V
+PLcom/android/server/location/AppOpsHelper$1;-><init>(Lcom/android/server/location/AppOpsHelper;)V
+PLcom/android/server/location/AppOpsHelper$1;->lambda$onOpChanged$0(Ljava/lang/Object;Ljava/lang/String;)V
+HPLcom/android/server/location/AppOpsHelper$1;->onOpChanged(ILjava/lang/String;)V
+PLcom/android/server/location/AppOpsHelper;-><init>(Landroid/content/Context;)V
+HPLcom/android/server/location/AppOpsHelper;->access$000(Lcom/android/server/location/AppOpsHelper;Ljava/lang/String;)V
+PLcom/android/server/location/AppOpsHelper;->addListener(Lcom/android/server/location/AppOpsHelper$LocationAppOpListener;)V
+HPLcom/android/server/location/AppOpsHelper;->checkLocationAccess(Lcom/android/server/location/CallerIdentity;)Z
+HPLcom/android/server/location/AppOpsHelper;->noteLocationAccess(Lcom/android/server/location/CallerIdentity;)Z
+HPLcom/android/server/location/AppOpsHelper;->noteOpNoThrow(ILcom/android/server/location/CallerIdentity;)Z
+HPLcom/android/server/location/AppOpsHelper;->onAppOpChanged(Ljava/lang/String;)V
+PLcom/android/server/location/AppOpsHelper;->onSystemReady()V
+PLcom/android/server/location/AppOpsHelper;->startHighPowerLocationMonitoring(Lcom/android/server/location/CallerIdentity;)Z
+HPLcom/android/server/location/AppOpsHelper;->startLocationMonitoring(ILcom/android/server/location/CallerIdentity;)Z
+PLcom/android/server/location/AppOpsHelper;->startLocationMonitoring(Lcom/android/server/location/CallerIdentity;)Z
+PLcom/android/server/location/AppOpsHelper;->stopHighPowerLocationMonitoring(Lcom/android/server/location/CallerIdentity;)V
+HPLcom/android/server/location/AppOpsHelper;->stopLocationMonitoring(ILcom/android/server/location/CallerIdentity;)V
+PLcom/android/server/location/AppOpsHelper;->stopLocationMonitoring(Lcom/android/server/location/CallerIdentity;)V
+HPLcom/android/server/location/CallerIdentity;-><init>(IIILjava/lang/String;Ljava/lang/String;I)V
 HSPLcom/android/server/location/CallerIdentity;-><init>(IILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
+HPLcom/android/server/location/CallerIdentity;->asAppOp(I)I
+PLcom/android/server/location/CallerIdentity;->asPermission(I)Ljava/lang/String;
+PLcom/android/server/location/CallerIdentity;->checkCallingOrSelfLocationPermission(Landroid/content/Context;)Z
+PLcom/android/server/location/CallerIdentity;->checkLocationPermission(I)Z
+PLcom/android/server/location/CallerIdentity;->enforceLocationPermission()V
+HPLcom/android/server/location/CallerIdentity;->enforceLocationPermission(II)V
+HPLcom/android/server/location/CallerIdentity;->fromBinder(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;)Lcom/android/server/location/CallerIdentity;
+HPLcom/android/server/location/CallerIdentity;->fromBinderUnsafe(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;)Lcom/android/server/location/CallerIdentity;
+PLcom/android/server/location/CallerIdentity;->getBinderPermissionLevel(Landroid/content/Context;)I
+HPLcom/android/server/location/CallerIdentity;->toString()Ljava/lang/String;
 HSPLcom/android/server/location/ComprehensiveCountryDetector$1;-><init>(Lcom/android/server/location/ComprehensiveCountryDetector;)V
 PLcom/android/server/location/ComprehensiveCountryDetector$1;->onCountryDetected(Landroid/location/Country;)V
 HPLcom/android/server/location/ComprehensiveCountryDetector$2;-><init>(Lcom/android/server/location/ComprehensiveCountryDetector;Landroid/location/Country;Landroid/location/Country;ZZ)V
@@ -18982,7 +20182,7 @@
 PLcom/android/server/location/ContextHubService;->getContextHubInfo(I)Landroid/hardware/location/ContextHubInfo;
 HSPLcom/android/server/location/ContextHubService;->getContextHubProxy()Landroid/hardware/contexthub/V1_0/IContexthub;
 HSPLcom/android/server/location/ContextHubService;->getContextHubWrapper()Lcom/android/server/location/IContextHubWrapper;
-PLcom/android/server/location/ContextHubService;->getContextHubs()Ljava/util/List;
+HPLcom/android/server/location/ContextHubService;->getContextHubs()Ljava/util/List;
 HPLcom/android/server/location/ContextHubService;->getNanoAppInstanceInfo(I)Landroid/hardware/location/NanoAppInstanceInfo;
 HPLcom/android/server/location/ContextHubService;->handleClientMessageCallback(ILandroid/hardware/contexthub/V1_0/ContextHubMsg;)V
 HPLcom/android/server/location/ContextHubService;->handleLoadResponseOldApi(IILandroid/hardware/location/NanoAppBinary;)V
@@ -19403,14 +20603,25 @@
 HSPLcom/android/server/location/GnssNetworkConnectivityHandler$1;-><init>(Lcom/android/server/location/GnssNetworkConnectivityHandler;)V
 HPLcom/android/server/location/GnssNetworkConnectivityHandler$1;->onCapabilitiesChanged(Landroid/net/Network;Landroid/net/NetworkCapabilities;)V
 HPLcom/android/server/location/GnssNetworkConnectivityHandler$1;->onLost(Landroid/net/Network;)V
+PLcom/android/server/location/GnssNetworkConnectivityHandler$1;->onSubscriptionsChanged()V
 HSPLcom/android/server/location/GnssNetworkConnectivityHandler$2;-><init>(Lcom/android/server/location/GnssNetworkConnectivityHandler;)V
 HPLcom/android/server/location/GnssNetworkConnectivityHandler$2;->onAvailable(Landroid/net/Network;)V
+PLcom/android/server/location/GnssNetworkConnectivityHandler$2;->onCapabilitiesChanged(Landroid/net/Network;Landroid/net/NetworkCapabilities;)V
 PLcom/android/server/location/GnssNetworkConnectivityHandler$2;->onLost(Landroid/net/Network;)V
 PLcom/android/server/location/GnssNetworkConnectivityHandler$2;->onUnavailable()V
+PLcom/android/server/location/GnssNetworkConnectivityHandler$3;-><init>(Lcom/android/server/location/GnssNetworkConnectivityHandler;)V
 PLcom/android/server/location/GnssNetworkConnectivityHandler$NetworkAttributes;-><init>()V
 PLcom/android/server/location/GnssNetworkConnectivityHandler$NetworkAttributes;-><init>(Lcom/android/server/location/GnssNetworkConnectivityHandler$1;)V
 HPLcom/android/server/location/GnssNetworkConnectivityHandler$NetworkAttributes;->access$000(Landroid/net/NetworkCapabilities;Landroid/net/NetworkCapabilities;)Z
 PLcom/android/server/location/GnssNetworkConnectivityHandler$NetworkAttributes;->access$1000(Landroid/net/NetworkCapabilities;)S
+PLcom/android/server/location/GnssNetworkConnectivityHandler$NetworkAttributes;->access$1000(Lcom/android/server/location/GnssNetworkConnectivityHandler$NetworkAttributes;)Ljava/lang/String;
+PLcom/android/server/location/GnssNetworkConnectivityHandler$NetworkAttributes;->access$1002(Lcom/android/server/location/GnssNetworkConnectivityHandler$NetworkAttributes;Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/location/GnssNetworkConnectivityHandler$NetworkAttributes;->access$1100(Lcom/android/server/location/GnssNetworkConnectivityHandler$NetworkAttributes;)I
+PLcom/android/server/location/GnssNetworkConnectivityHandler$NetworkAttributes;->access$1102(Lcom/android/server/location/GnssNetworkConnectivityHandler$NetworkAttributes;I)I
+PLcom/android/server/location/GnssNetworkConnectivityHandler$NetworkAttributes;->access$1200(Lcom/android/server/location/GnssNetworkConnectivityHandler$NetworkAttributes;)Landroid/net/NetworkCapabilities;
+PLcom/android/server/location/GnssNetworkConnectivityHandler$NetworkAttributes;->access$1202(Lcom/android/server/location/GnssNetworkConnectivityHandler$NetworkAttributes;Landroid/net/NetworkCapabilities;)Landroid/net/NetworkCapabilities;
+PLcom/android/server/location/GnssNetworkConnectivityHandler$NetworkAttributes;->access$1300(Landroid/net/NetworkCapabilities;)S
+PLcom/android/server/location/GnssNetworkConnectivityHandler$NetworkAttributes;->access$400(Landroid/net/NetworkCapabilities;Landroid/net/NetworkCapabilities;)Z
 PLcom/android/server/location/GnssNetworkConnectivityHandler$NetworkAttributes;->access$700(Lcom/android/server/location/GnssNetworkConnectivityHandler$NetworkAttributes;)Ljava/lang/String;
 PLcom/android/server/location/GnssNetworkConnectivityHandler$NetworkAttributes;->access$702(Lcom/android/server/location/GnssNetworkConnectivityHandler$NetworkAttributes;Ljava/lang/String;)Ljava/lang/String;
 PLcom/android/server/location/GnssNetworkConnectivityHandler$NetworkAttributes;->access$800(Lcom/android/server/location/GnssNetworkConnectivityHandler$NetworkAttributes;)I
@@ -19422,12 +20633,21 @@
 HPLcom/android/server/location/GnssNetworkConnectivityHandler$NetworkAttributes;->hasCapabilityChanged(Landroid/net/NetworkCapabilities;Landroid/net/NetworkCapabilities;I)Z
 HSPLcom/android/server/location/GnssNetworkConnectivityHandler;-><clinit>()V
 HSPLcom/android/server/location/GnssNetworkConnectivityHandler;-><init>(Landroid/content/Context;Lcom/android/server/location/GnssNetworkConnectivityHandler$GnssNetworkListener;Landroid/os/Looper;)V
+PLcom/android/server/location/GnssNetworkConnectivityHandler;-><init>(Landroid/content/Context;Lcom/android/server/location/GnssNetworkConnectivityHandler$GnssNetworkListener;Landroid/os/Looper;Lcom/android/internal/location/GpsNetInitiatedHandler;)V
+PLcom/android/server/location/GnssNetworkConnectivityHandler;->access$000(Lcom/android/server/location/GnssNetworkConnectivityHandler;)I
+PLcom/android/server/location/GnssNetworkConnectivityHandler;->access$002(Lcom/android/server/location/GnssNetworkConnectivityHandler;I)I
 HPLcom/android/server/location/GnssNetworkConnectivityHandler;->access$100()Z
 PLcom/android/server/location/GnssNetworkConnectivityHandler;->access$200()Z
+PLcom/android/server/location/GnssNetworkConnectivityHandler;->access$200(Lcom/android/server/location/GnssNetworkConnectivityHandler;)Ljava/util/HashMap;
+PLcom/android/server/location/GnssNetworkConnectivityHandler;->access$202(Lcom/android/server/location/GnssNetworkConnectivityHandler;Ljava/util/HashMap;)Ljava/util/HashMap;
+PLcom/android/server/location/GnssNetworkConnectivityHandler;->access$300(Lcom/android/server/location/GnssNetworkConnectivityHandler;)Landroid/content/Context;
 PLcom/android/server/location/GnssNetworkConnectivityHandler;->access$300(Lcom/android/server/location/GnssNetworkConnectivityHandler;)Lcom/android/server/location/GnssNetworkConnectivityHandler$GnssNetworkListener;
 PLcom/android/server/location/GnssNetworkConnectivityHandler;->access$400(Lcom/android/server/location/GnssNetworkConnectivityHandler;Landroid/net/Network;ZLandroid/net/NetworkCapabilities;)V
+PLcom/android/server/location/GnssNetworkConnectivityHandler;->access$500()Z
 PLcom/android/server/location/GnssNetworkConnectivityHandler;->access$500(Lcom/android/server/location/GnssNetworkConnectivityHandler;Landroid/net/Network;)V
+PLcom/android/server/location/GnssNetworkConnectivityHandler;->access$600(Lcom/android/server/location/GnssNetworkConnectivityHandler;)Lcom/android/server/location/GnssNetworkConnectivityHandler$GnssNetworkListener;
 PLcom/android/server/location/GnssNetworkConnectivityHandler;->access$600(Lcom/android/server/location/GnssNetworkConnectivityHandler;I)V
+PLcom/android/server/location/GnssNetworkConnectivityHandler;->access$700(Lcom/android/server/location/GnssNetworkConnectivityHandler;Landroid/net/Network;ZLandroid/net/NetworkCapabilities;)V
 HPLcom/android/server/location/GnssNetworkConnectivityHandler;->agpsDataConnStateAsString()Ljava/lang/String;
 HSPLcom/android/server/location/GnssNetworkConnectivityHandler;->createNetworkConnectivityCallback()Landroid/net/ConnectivityManager$NetworkCallback;
 HSPLcom/android/server/location/GnssNetworkConnectivityHandler;->createSuplConnectivityCallback()Landroid/net/ConnectivityManager$NetworkCallback;
@@ -19547,6 +20767,7 @@
 HSPLcom/android/server/location/IContextHubWrapper;->maybeConnectTo1_1()Lcom/android/server/location/IContextHubWrapper;
 PLcom/android/server/location/LocationBasedCountryDetector$1;-><init>(Lcom/android/server/location/LocationBasedCountryDetector;)V
 PLcom/android/server/location/LocationBasedCountryDetector$1;->onLocationChanged(Landroid/location/Location;)V
+PLcom/android/server/location/LocationBasedCountryDetector$1;->onProviderDisabled(Ljava/lang/String;)V
 PLcom/android/server/location/LocationBasedCountryDetector$1;->onProviderEnabled(Ljava/lang/String;)V
 PLcom/android/server/location/LocationBasedCountryDetector$2;-><init>(Lcom/android/server/location/LocationBasedCountryDetector;)V
 PLcom/android/server/location/LocationBasedCountryDetector$2;->run()V
@@ -19875,14 +21096,100 @@
 HSPLcom/android/server/location/gnss/-$$Lambda$D_8O7MDYM_zvDJaJvJVfzXhIfZY;-><init>()V
 PLcom/android/server/location/gnss/-$$Lambda$FxAranobP2o6eVcPEOp8tzZYyLY;-><init>(Lcom/android/server/location/gnss/GnssManagerService;)V
 PLcom/android/server/location/gnss/-$$Lambda$FxAranobP2o6eVcPEOp8tzZYyLY;->accept(Ljava/lang/Object;)V
+PLcom/android/server/location/gnss/-$$Lambda$GnssAntennaInfoProvider$6tStkOUFQdyPwrIlenWNx1CLtUg;-><clinit>()V
+PLcom/android/server/location/gnss/-$$Lambda$GnssAntennaInfoProvider$6tStkOUFQdyPwrIlenWNx1CLtUg;-><init>()V
+PLcom/android/server/location/gnss/-$$Lambda$GnssConfiguration$1$-SleO6oWMpd_g4bdtKw-goYffkk;-><clinit>()V
+PLcom/android/server/location/gnss/-$$Lambda$GnssConfiguration$1$-SleO6oWMpd_g4bdtKw-goYffkk;-><init>()V
+PLcom/android/server/location/gnss/-$$Lambda$GnssConfiguration$1$-SleO6oWMpd_g4bdtKw-goYffkk;->set(I)Z
+PLcom/android/server/location/gnss/-$$Lambda$GnssConfiguration$1$Cz52q0m5WBoomfji3esjJI-B-x8;-><clinit>()V
+PLcom/android/server/location/gnss/-$$Lambda$GnssConfiguration$1$Cz52q0m5WBoomfji3esjJI-B-x8;-><init>()V
+PLcom/android/server/location/gnss/-$$Lambda$GnssConfiguration$1$Cz52q0m5WBoomfji3esjJI-B-x8;->set(I)Z
+PLcom/android/server/location/gnss/-$$Lambda$GnssConfiguration$1$IwddZEVhNi3yUzbgOgz_w_HqSjE;-><clinit>()V
+PLcom/android/server/location/gnss/-$$Lambda$GnssConfiguration$1$IwddZEVhNi3yUzbgOgz_w_HqSjE;-><init>()V
+PLcom/android/server/location/gnss/-$$Lambda$GnssConfiguration$1$IwddZEVhNi3yUzbgOgz_w_HqSjE;->set(I)Z
+PLcom/android/server/location/gnss/-$$Lambda$GnssConfiguration$1$LZqgdWjzL89MPY7XrWAf7kOV-qQ;-><clinit>()V
+PLcom/android/server/location/gnss/-$$Lambda$GnssConfiguration$1$LZqgdWjzL89MPY7XrWAf7kOV-qQ;-><init>()V
+PLcom/android/server/location/gnss/-$$Lambda$GnssConfiguration$1$LZqgdWjzL89MPY7XrWAf7kOV-qQ;->set(I)Z
+PLcom/android/server/location/gnss/-$$Lambda$GnssConfiguration$1$R-XdOLUsEDRXhjoDIenWKgf7IIw;-><clinit>()V
+PLcom/android/server/location/gnss/-$$Lambda$GnssConfiguration$1$R-XdOLUsEDRXhjoDIenWKgf7IIw;-><init>()V
+PLcom/android/server/location/gnss/-$$Lambda$GnssConfiguration$1$R-XdOLUsEDRXhjoDIenWKgf7IIw;->set(I)Z
+PLcom/android/server/location/gnss/-$$Lambda$GnssConfiguration$1$fVD4pCIHbDwnv6GFSEn42hYZi6Y;-><clinit>()V
+PLcom/android/server/location/gnss/-$$Lambda$GnssConfiguration$1$fVD4pCIHbDwnv6GFSEn42hYZi6Y;-><init>()V
+PLcom/android/server/location/gnss/-$$Lambda$GnssConfiguration$1$fVD4pCIHbDwnv6GFSEn42hYZi6Y;->set(I)Z
+PLcom/android/server/location/gnss/-$$Lambda$GnssConfiguration$1$hxxAUFBhOQOZhojaDFP5qV8f6uw;-><clinit>()V
+PLcom/android/server/location/gnss/-$$Lambda$GnssConfiguration$1$hxxAUFBhOQOZhojaDFP5qV8f6uw;-><init>()V
+PLcom/android/server/location/gnss/-$$Lambda$GnssConfiguration$1$hxxAUFBhOQOZhojaDFP5qV8f6uw;->set(I)Z
+PLcom/android/server/location/gnss/-$$Lambda$GnssLocationProvider$1hXQgNJS0Q8F8bUdWsxa94PM98g;-><init>(Lcom/android/server/location/gnss/GnssLocationProvider;)V
+PLcom/android/server/location/gnss/-$$Lambda$GnssLocationProvider$1hXQgNJS0Q8F8bUdWsxa94PM98g;->onDeviceStationaryChanged(Z)V
+PLcom/android/server/location/gnss/-$$Lambda$GnssLocationProvider$2DJj3Ea6MJfR7jGWxrOqu-RmUcw;-><init>(Lcom/android/server/location/gnss/GnssLocationProvider;II)V
+PLcom/android/server/location/gnss/-$$Lambda$GnssLocationProvider$2DJj3Ea6MJfR7jGWxrOqu-RmUcw;->run()V
+PLcom/android/server/location/gnss/-$$Lambda$GnssLocationProvider$48m7ukf99eMCKhVUjqljxXFFvWw;-><init>(Lcom/android/server/location/gnss/GnssLocationProvider;)V
+PLcom/android/server/location/gnss/-$$Lambda$GnssLocationProvider$48m7ukf99eMCKhVUjqljxXFFvWw;->onNetworkAvailable()V
+PLcom/android/server/location/gnss/-$$Lambda$GnssLocationProvider$8xqmGrm3vUbuBYyxecHypUKBN8M;-><init>(Lcom/android/server/location/gnss/GnssLocationProvider;[I[I)V
+PLcom/android/server/location/gnss/-$$Lambda$GnssLocationProvider$8xqmGrm3vUbuBYyxecHypUKBN8M;->run()V
+PLcom/android/server/location/gnss/-$$Lambda$GnssLocationProvider$9z2BzqtI1mIF3OUSD_3kdlaP8Ls;-><init>(Lcom/android/server/location/gnss/GnssLocationProvider;ILandroid/location/Location;IJ)V
+PLcom/android/server/location/gnss/-$$Lambda$GnssLocationProvider$9z2BzqtI1mIF3OUSD_3kdlaP8Ls;->run()V
+PLcom/android/server/location/gnss/-$$Lambda$GnssLocationProvider$JndfaKf2MNdn0UzX-g2bR-w7fzA;-><init>(Lcom/android/server/location/gnss/GnssLocationProvider$LocationChangeListener;Ljava/lang/String;Landroid/location/LocationManager;)V
+PLcom/android/server/location/gnss/-$$Lambda$GnssLocationProvider$JndfaKf2MNdn0UzX-g2bR-w7fzA;->run()V
+PLcom/android/server/location/gnss/-$$Lambda$GnssLocationProvider$PnjxzvZoft2260U6u0c4ExEgvdk;-><init>(Lcom/android/server/location/gnss/GnssLocationProvider;ILandroid/location/Location;)V
+PLcom/android/server/location/gnss/-$$Lambda$GnssLocationProvider$PnjxzvZoft2260U6u0c4ExEgvdk;->run()V
+PLcom/android/server/location/gnss/-$$Lambda$GnssLocationProvider$QQ-0fckG9-krtI0AH_nmm1-vmLQ;-><init>(Lcom/android/server/location/gnss/GnssLocationProvider;I)V
+PLcom/android/server/location/gnss/-$$Lambda$GnssLocationProvider$QQ-0fckG9-krtI0AH_nmm1-vmLQ;->run()V
+HPLcom/android/server/location/gnss/-$$Lambda$GnssLocationProvider$YuOqG3Bhqp1DBq9X5jGhJw-oqXY;-><init>(Lcom/android/server/location/gnss/GnssLocationProvider;Landroid/location/GnssMeasurementsEvent;)V
+HPLcom/android/server/location/gnss/-$$Lambda$GnssLocationProvider$YuOqG3Bhqp1DBq9X5jGhJw-oqXY;->run()V
+PLcom/android/server/location/gnss/-$$Lambda$GnssLocationProvider$fZsexTbhhXxbzu9E9XIT682MN4A;-><init>(Lcom/android/server/location/gnss/GnssLocationProvider;I)V
+PLcom/android/server/location/gnss/-$$Lambda$GnssLocationProvider$fZsexTbhhXxbzu9E9XIT682MN4A;->run()V
+PLcom/android/server/location/gnss/-$$Lambda$GnssLocationProvider$rqhQl-FjuYDwRh9wlhB1OdAWgzI;-><init>(Lcom/android/server/location/gnss/GnssLocationProvider;)V
+PLcom/android/server/location/gnss/-$$Lambda$GnssLocationProvider$vUevSagVGcJiG8NrsQ14SLZKO50;-><init>(Lcom/android/server/location/gnss/GnssLocationProvider;II)V
+PLcom/android/server/location/gnss/-$$Lambda$GnssLocationProvider$vUevSagVGcJiG8NrsQ14SLZKO50;->run()V
 HSPLcom/android/server/location/gnss/-$$Lambda$GnssManagerService$UdLm78gS4fBvCkzR5_od9MCx3_M;-><init>(Lcom/android/server/location/gnss/GnssManagerService;)V
 HSPLcom/android/server/location/gnss/-$$Lambda$GnssManagerService$UdLm78gS4fBvCkzR5_od9MCx3_M;->onUidImportance(II)V
 HSPLcom/android/server/location/gnss/-$$Lambda$GnssManagerService$Xb7pwmWy3YdCevK1MZL3c-zTOco;-><init>(Lcom/android/server/location/gnss/GnssManagerService;II)V
 HSPLcom/android/server/location/gnss/-$$Lambda$GnssManagerService$Xb7pwmWy3YdCevK1MZL3c-zTOco;->run()V
 HSPLcom/android/server/location/gnss/-$$Lambda$GnssManagerService$de6v4jWKxQDC9J4FdGGrfKg2phA;-><init>(Lcom/android/server/location/gnss/GnssManagerService;)V
 HSPLcom/android/server/location/gnss/-$$Lambda$GnssManagerService$de6v4jWKxQDC9J4FdGGrfKg2phA;->onAppForegroundChanged(IZ)V
+HPLcom/android/server/location/gnss/-$$Lambda$GnssMeasurementsProvider$MwKCr2bnxyNYMRRxCkNEyvhkEpg;-><init>(Lcom/android/server/location/gnss/GnssMeasurementsProvider;Landroid/location/GnssMeasurementsEvent;)V
+HPLcom/android/server/location/gnss/-$$Lambda$GnssMeasurementsProvider$MwKCr2bnxyNYMRRxCkNEyvhkEpg;->execute(Landroid/os/IInterface;Lcom/android/server/location/CallerIdentity;)V
+PLcom/android/server/location/gnss/-$$Lambda$GnssNetworkConnectivityHandler$M5xHE3b_460ydxe6w6OcvDX9Kx8;-><init>(Lcom/android/server/location/gnss/GnssNetworkConnectivityHandler;)V
+PLcom/android/server/location/gnss/-$$Lambda$GnssNetworkConnectivityHandler$M5xHE3b_460ydxe6w6OcvDX9Kx8;->run()V
+PLcom/android/server/location/gnss/-$$Lambda$GnssNetworkConnectivityHandler$bnc6RM72T8jpSxM08ugCgEMySwo;-><init>(Lcom/android/server/location/gnss/GnssNetworkConnectivityHandler;I[B)V
+PLcom/android/server/location/gnss/-$$Lambda$GnssNetworkConnectivityHandler$bnc6RM72T8jpSxM08ugCgEMySwo;->run()V
+PLcom/android/server/location/gnss/-$$Lambda$GnssNetworkConnectivityHandler$ezDFQHbzZ9WnxJSpYWB6YP4YDQM;-><init>(Lcom/android/server/location/gnss/GnssNetworkConnectivityHandler;Ljava/lang/Runnable;)V
+PLcom/android/server/location/gnss/-$$Lambda$GnssNetworkConnectivityHandler$ezDFQHbzZ9WnxJSpYWB6YP4YDQM;->run()V
+PLcom/android/server/location/gnss/-$$Lambda$GnssStatusListenerHelper$-PDN6l_ua39RgTfOqb8dRfbBiz4;-><init>(I)V
+PLcom/android/server/location/gnss/-$$Lambda$GnssStatusListenerHelper$-PDN6l_ua39RgTfOqb8dRfbBiz4;->execute(Landroid/os/IInterface;Lcom/android/server/location/CallerIdentity;)V
+PLcom/android/server/location/gnss/-$$Lambda$GnssStatusListenerHelper$FqkiYCR82OZjuCDK6OLw9UiViRs;-><init>(Lcom/android/server/location/gnss/GnssStatusListenerHelper;I[I[F[F[F[F[F)V
+HPLcom/android/server/location/gnss/-$$Lambda$GnssStatusListenerHelper$FqkiYCR82OZjuCDK6OLw9UiViRs;->execute(Landroid/os/IInterface;Lcom/android/server/location/CallerIdentity;)V
+PLcom/android/server/location/gnss/-$$Lambda$GnssStatusListenerHelper$KlIJDkEnS0_mNOmcwVuQH2RiKoE;-><clinit>()V
+PLcom/android/server/location/gnss/-$$Lambda$GnssStatusListenerHelper$KlIJDkEnS0_mNOmcwVuQH2RiKoE;-><init>()V
+PLcom/android/server/location/gnss/-$$Lambda$GnssStatusListenerHelper$KlIJDkEnS0_mNOmcwVuQH2RiKoE;->execute(Landroid/os/IInterface;Lcom/android/server/location/CallerIdentity;)V
+HPLcom/android/server/location/gnss/-$$Lambda$GnssStatusListenerHelper$R8Iu1GHQIbdGdQkOj_FPKJgKV4Q;-><init>(Lcom/android/server/location/gnss/GnssStatusListenerHelper;JLjava/lang/String;)V
+HPLcom/android/server/location/gnss/-$$Lambda$GnssStatusListenerHelper$R8Iu1GHQIbdGdQkOj_FPKJgKV4Q;->execute(Landroid/os/IInterface;Lcom/android/server/location/CallerIdentity;)V
+PLcom/android/server/location/gnss/-$$Lambda$GnssStatusListenerHelper$S4Ko8kVujzQkEjUsbBqi2IwetQ8;-><clinit>()V
+PLcom/android/server/location/gnss/-$$Lambda$GnssStatusListenerHelper$S4Ko8kVujzQkEjUsbBqi2IwetQ8;-><init>()V
+PLcom/android/server/location/gnss/-$$Lambda$GnssStatusListenerHelper$S4Ko8kVujzQkEjUsbBqi2IwetQ8;->execute(Landroid/os/IInterface;Lcom/android/server/location/CallerIdentity;)V
+PLcom/android/server/location/gnss/-$$Lambda$GnssVisibilityControl$JE5r4mEk9pQ3wqWvn6pP20Ix0qs;-><init>(Lcom/android/server/location/gnss/GnssVisibilityControl;)V
+PLcom/android/server/location/gnss/-$$Lambda$GnssVisibilityControl$JE5r4mEk9pQ3wqWvn6pP20Ix0qs;->run()V
+PLcom/android/server/location/gnss/-$$Lambda$GnssVisibilityControl$Jpk3mZESuW9g2-OyRjaXIzTQ4ZY;-><init>(Lcom/android/server/location/gnss/GnssVisibilityControl;I)V
+PLcom/android/server/location/gnss/-$$Lambda$GnssVisibilityControl$Jpk3mZESuW9g2-OyRjaXIzTQ4ZY;->run()V
+PLcom/android/server/location/gnss/-$$Lambda$GnssVisibilityControl$Wn1BM9iZDBjdFhINpWblAI5qIlM;-><init>(Lcom/android/server/location/gnss/GnssVisibilityControl;)V
+PLcom/android/server/location/gnss/-$$Lambda$GnssVisibilityControl$Wn1BM9iZDBjdFhINpWblAI5qIlM;->onPermissionsChanged(I)V
+PLcom/android/server/location/gnss/-$$Lambda$GnssVisibilityControl$aXU5oxv5Ht00C9f_pyOZ-ZLUvq8;-><init>(Lcom/android/server/location/gnss/GnssVisibilityControl;Ljava/lang/Runnable;)V
+PLcom/android/server/location/gnss/-$$Lambda$GnssVisibilityControl$aXU5oxv5Ht00C9f_pyOZ-ZLUvq8;->run()V
+PLcom/android/server/location/gnss/-$$Lambda$GnssVisibilityControl$nVJNbS33XkGpLD5aoKjI1VhHmek;-><init>(Lcom/android/server/location/gnss/GnssVisibilityControl;Z)V
+PLcom/android/server/location/gnss/-$$Lambda$GnssVisibilityControl$nVJNbS33XkGpLD5aoKjI1VhHmek;->run()V
+PLcom/android/server/location/gnss/-$$Lambda$GnssVisibilityControl$tmLrWF2MHVnlEaAIt4PYrTB-Eqc;-><init>(Lcom/android/server/location/gnss/GnssVisibilityControl;Ljava/util/List;)V
+PLcom/android/server/location/gnss/-$$Lambda$GnssVisibilityControl$tmLrWF2MHVnlEaAIt4PYrTB-Eqc;->run()V
 HSPLcom/android/server/location/gnss/-$$Lambda$HALkbmbB2IPr_wdFkPjiIWCzJsY;-><clinit>()V
 HSPLcom/android/server/location/gnss/-$$Lambda$HALkbmbB2IPr_wdFkPjiIWCzJsY;-><init>()V
+PLcom/android/server/location/gnss/-$$Lambda$J1FYzW5KOl5qaNdaO2TLZ9hbi9Y;-><init>(Lcom/android/server/location/gnss/GnssSatelliteBlacklistHelper;)V
+PLcom/android/server/location/gnss/-$$Lambda$J1FYzW5KOl5qaNdaO2TLZ9hbi9Y;->run()V
+PLcom/android/server/location/gnss/-$$Lambda$NtpTimeHelper$0f3JRUuSYH-K-brPBZMOA96D-q4;-><init>(Lcom/android/server/location/gnss/NtpTimeHelper;)V
+PLcom/android/server/location/gnss/-$$Lambda$NtpTimeHelper$0f3JRUuSYH-K-brPBZMOA96D-q4;->run()V
+PLcom/android/server/location/gnss/-$$Lambda$NtpTimeHelper$4YVWiahGRCeX2AoEdhSeek4fqhQ;-><init>(Lcom/android/server/location/gnss/NtpTimeHelper;JJJ)V
+PLcom/android/server/location/gnss/-$$Lambda$NtpTimeHelper$4YVWiahGRCeX2AoEdhSeek4fqhQ;->run()V
+PLcom/android/server/location/gnss/-$$Lambda$UoXKjYaYgPPHqNIgiLAobtz5XAU;-><init>(Lcom/android/server/location/gnss/NtpTimeHelper;)V
+PLcom/android/server/location/gnss/-$$Lambda$UoXKjYaYgPPHqNIgiLAobtz5XAU;->run()V
 HPLcom/android/server/location/gnss/-$$Lambda$WsssLeTVg_jaQ16K-SvqbRc0TV8;-><init>(Lcom/android/server/location/gnss/GnssManagerService;)V
 PLcom/android/server/location/gnss/-$$Lambda$WsssLeTVg_jaQ16K-SvqbRc0TV8;->accept(Ljava/lang/Object;)V
 HSPLcom/android/server/location/gnss/-$$Lambda$hu439-4T6QBT8QyZnspMtXqICWs;-><clinit>()V
@@ -19891,19 +21198,267 @@
 HSPLcom/android/server/location/gnss/-$$Lambda$qoNbXUvSu3yuTPVXPUfZW_HDrTQ;-><clinit>()V
 HSPLcom/android/server/location/gnss/-$$Lambda$qoNbXUvSu3yuTPVXPUfZW_HDrTQ;-><init>()V
 PLcom/android/server/location/gnss/-$$Lambda$qoNbXUvSu3yuTPVXPUfZW_HDrTQ;->apply(Ljava/lang/Object;)Ljava/lang/Object;
+PLcom/android/server/location/gnss/ExponentialBackOff;-><init>(JJ)V
+PLcom/android/server/location/gnss/ExponentialBackOff;->nextBackoffMillis()J
+PLcom/android/server/location/gnss/ExponentialBackOff;->reset()V
+PLcom/android/server/location/gnss/GnssAntennaInfoProvider$GnssAntennaInfoProviderNative;-><init>()V
+PLcom/android/server/location/gnss/GnssAntennaInfoProvider$GnssAntennaInfoProviderNative;->isAntennaInfoSupported()Z
+PLcom/android/server/location/gnss/GnssAntennaInfoProvider;-><clinit>()V
+PLcom/android/server/location/gnss/GnssAntennaInfoProvider;-><init>(Landroid/content/Context;Landroid/os/Handler;)V
+PLcom/android/server/location/gnss/GnssAntennaInfoProvider;-><init>(Landroid/content/Context;Landroid/os/Handler;Lcom/android/server/location/gnss/GnssAntennaInfoProvider$GnssAntennaInfoProviderNative;)V
+PLcom/android/server/location/gnss/GnssAntennaInfoProvider;->access$000()Z
+PLcom/android/server/location/gnss/GnssAntennaInfoProvider;->getHandlerOperation(I)Lcom/android/server/location/RemoteListenerHelper$ListenerOperation;
+PLcom/android/server/location/gnss/GnssAntennaInfoProvider;->isAvailableInPlatform()Z
+PLcom/android/server/location/gnss/GnssAntennaInfoProvider;->onCapabilitiesUpdated(Z)V
+PLcom/android/server/location/gnss/GnssAntennaInfoProvider;->onGpsEnabledChanged()V
+PLcom/android/server/location/gnss/GnssAntennaInfoProvider;->resumeIfStarted()V
+PLcom/android/server/location/gnss/GnssBatchingProvider$GnssBatchingProviderNative;-><init>()V
+PLcom/android/server/location/gnss/GnssBatchingProvider$GnssBatchingProviderNative;->cleanupBatching()V
+PLcom/android/server/location/gnss/GnssBatchingProvider$GnssBatchingProviderNative;->initBatching()Z
+PLcom/android/server/location/gnss/GnssBatchingProvider$GnssBatchingProviderNative;->stopBatch()Z
+PLcom/android/server/location/gnss/GnssBatchingProvider;-><clinit>()V
+PLcom/android/server/location/gnss/GnssBatchingProvider;-><init>()V
+PLcom/android/server/location/gnss/GnssBatchingProvider;-><init>(Lcom/android/server/location/gnss/GnssBatchingProvider$GnssBatchingProviderNative;)V
+PLcom/android/server/location/gnss/GnssBatchingProvider;->access$300()Z
+PLcom/android/server/location/gnss/GnssBatchingProvider;->access$400()Z
+PLcom/android/server/location/gnss/GnssBatchingProvider;->access$500()V
+PLcom/android/server/location/gnss/GnssBatchingProvider;->disable()V
+PLcom/android/server/location/gnss/GnssBatchingProvider;->enable()V
+PLcom/android/server/location/gnss/GnssBatchingProvider;->resumeIfStarted()V
+PLcom/android/server/location/gnss/GnssBatchingProvider;->stop()Z
+PLcom/android/server/location/gnss/GnssCapabilitiesProvider;-><clinit>()V
+PLcom/android/server/location/gnss/GnssCapabilitiesProvider;-><init>()V
+PLcom/android/server/location/gnss/GnssCapabilitiesProvider;->getGnssCapabilities()J
+PLcom/android/server/location/gnss/GnssCapabilitiesProvider;->hasCapability(II)Z
+PLcom/android/server/location/gnss/GnssCapabilitiesProvider;->setSubHalMeasurementCorrectionsCapabilities(I)V
+PLcom/android/server/location/gnss/GnssCapabilitiesProvider;->setTopHalCapabilities(I)V
+HPLcom/android/server/location/gnss/GnssConfiguration$1;-><init>(Lcom/android/server/location/gnss/GnssConfiguration;Lcom/android/server/location/gnss/GnssConfiguration$HalInterfaceVersion;)V
+PLcom/android/server/location/gnss/GnssConfiguration$1;->lambda$new$0(I)Z
+PLcom/android/server/location/gnss/GnssConfiguration$1;->lambda$new$1(I)Z
+PLcom/android/server/location/gnss/GnssConfiguration$1;->lambda$new$2(I)Z
+PLcom/android/server/location/gnss/GnssConfiguration$1;->lambda$new$3(I)Z
+PLcom/android/server/location/gnss/GnssConfiguration$1;->lambda$new$4(I)Z
+PLcom/android/server/location/gnss/GnssConfiguration$1;->lambda$new$5(I)Z
+PLcom/android/server/location/gnss/GnssConfiguration$1;->lambda$new$6(I)Z
+HPLcom/android/server/location/gnss/GnssConfiguration$HalInterfaceVersion;-><init>(II)V
+PLcom/android/server/location/gnss/GnssConfiguration;-><clinit>()V
+PLcom/android/server/location/gnss/GnssConfiguration;-><init>(Landroid/content/Context;)V
+PLcom/android/server/location/gnss/GnssConfiguration;->access$000(Lcom/android/server/location/gnss/GnssConfiguration$HalInterfaceVersion;)Z
+PLcom/android/server/location/gnss/GnssConfiguration;->access$100(Lcom/android/server/location/gnss/GnssConfiguration$HalInterfaceVersion;)Z
+PLcom/android/server/location/gnss/GnssConfiguration;->access$200(I)Z
+PLcom/android/server/location/gnss/GnssConfiguration;->access$300(I)Z
+PLcom/android/server/location/gnss/GnssConfiguration;->access$400(I)Z
+PLcom/android/server/location/gnss/GnssConfiguration;->access$500(I)Z
+PLcom/android/server/location/gnss/GnssConfiguration;->access$600(I)Z
+PLcom/android/server/location/gnss/GnssConfiguration;->access$700(I)Z
+PLcom/android/server/location/gnss/GnssConfiguration;->access$800(I)Z
+PLcom/android/server/location/gnss/GnssConfiguration;->getC2KHost()Ljava/lang/String;
+PLcom/android/server/location/gnss/GnssConfiguration;->getC2KPort(I)I
+PLcom/android/server/location/gnss/GnssConfiguration;->getEsExtensionSec()I
+PLcom/android/server/location/gnss/GnssConfiguration;->getHalInterfaceVersion()Lcom/android/server/location/gnss/GnssConfiguration$HalInterfaceVersion;
+HPLcom/android/server/location/gnss/GnssConfiguration;->getIntConfig(Ljava/lang/String;I)I
+PLcom/android/server/location/gnss/GnssConfiguration;->getLppProfile()Ljava/lang/String;
+PLcom/android/server/location/gnss/GnssConfiguration;->getProxyApps()Ljava/util/List;
+HPLcom/android/server/location/gnss/GnssConfiguration;->getRangeCheckedConfigEsExtensionSec()I
+PLcom/android/server/location/gnss/GnssConfiguration;->getSuplEs(I)I
+PLcom/android/server/location/gnss/GnssConfiguration;->getSuplHost()Ljava/lang/String;
+PLcom/android/server/location/gnss/GnssConfiguration;->getSuplMode(I)I
+PLcom/android/server/location/gnss/GnssConfiguration;->getSuplPort(I)I
+PLcom/android/server/location/gnss/GnssConfiguration;->isConfigEsExtensionSecSupported(Lcom/android/server/location/gnss/GnssConfiguration$HalInterfaceVersion;)Z
+PLcom/android/server/location/gnss/GnssConfiguration;->isConfigGpsLockSupported(Lcom/android/server/location/gnss/GnssConfiguration$HalInterfaceVersion;)Z
+PLcom/android/server/location/gnss/GnssConfiguration;->isConfigSuplEsSupported(Lcom/android/server/location/gnss/GnssConfiguration$HalInterfaceVersion;)Z
+HPLcom/android/server/location/gnss/GnssConfiguration;->loadPropertiesFromCarrierConfig()V
+HPLcom/android/server/location/gnss/GnssConfiguration;->loadPropertiesFromGpsDebugConfig(Ljava/util/Properties;)V
+HPLcom/android/server/location/gnss/GnssConfiguration;->logConfigurations()V
+HPLcom/android/server/location/gnss/GnssConfiguration;->reloadGpsProperties()V
+PLcom/android/server/location/gnss/GnssConfiguration;->setSatelliteBlacklist([I[I)V
+PLcom/android/server/location/gnss/GnssGeofenceProvider$GeofenceEntry;-><init>()V
+PLcom/android/server/location/gnss/GnssGeofenceProvider$GeofenceEntry;-><init>(Lcom/android/server/location/gnss/GnssGeofenceProvider$1;)V
+PLcom/android/server/location/gnss/GnssGeofenceProvider$GnssGeofenceProviderNative;-><init>()V
+PLcom/android/server/location/gnss/GnssGeofenceProvider$GnssGeofenceProviderNative;->addGeofence(IDDDIIII)Z
+PLcom/android/server/location/gnss/GnssGeofenceProvider$GnssGeofenceProviderNative;->isGeofenceSupported()Z
+PLcom/android/server/location/gnss/GnssGeofenceProvider$GnssGeofenceProviderNative;->removeGeofence(I)Z
+PLcom/android/server/location/gnss/GnssGeofenceProvider;-><clinit>()V
+PLcom/android/server/location/gnss/GnssGeofenceProvider;-><init>()V
+PLcom/android/server/location/gnss/GnssGeofenceProvider;-><init>(Lcom/android/server/location/gnss/GnssGeofenceProvider$GnssGeofenceProviderNative;)V
+PLcom/android/server/location/gnss/GnssGeofenceProvider;->access$100()Z
+PLcom/android/server/location/gnss/GnssGeofenceProvider;->access$200(IDDDIIII)Z
+PLcom/android/server/location/gnss/GnssGeofenceProvider;->access$300(I)Z
+PLcom/android/server/location/gnss/GnssGeofenceProvider;->addCircularHardwareGeofence(IDDDIIII)Z
+PLcom/android/server/location/gnss/GnssGeofenceProvider;->isHardwareGeofenceSupported()Z
+PLcom/android/server/location/gnss/GnssGeofenceProvider;->removeHardwareGeofence(I)Z
+PLcom/android/server/location/gnss/GnssGeofenceProvider;->resumeIfStarted()V
+PLcom/android/server/location/gnss/GnssLocationProvider$1;-><init>(Lcom/android/server/location/gnss/GnssLocationProvider;)V
+HPLcom/android/server/location/gnss/GnssLocationProvider$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/location/gnss/GnssLocationProvider$2;-><init>(Lcom/android/server/location/gnss/GnssLocationProvider;Landroid/content/Context;Landroid/os/Handler;)V
+PLcom/android/server/location/gnss/GnssLocationProvider$2;->isAvailableInPlatform()Z
+PLcom/android/server/location/gnss/GnssLocationProvider$2;->isGpsEnabled()Z
+PLcom/android/server/location/gnss/GnssLocationProvider$3;-><init>(Lcom/android/server/location/gnss/GnssLocationProvider;Landroid/content/Context;Landroid/os/Handler;)V
+PLcom/android/server/location/gnss/GnssLocationProvider$3;->isGpsEnabled()Z
+PLcom/android/server/location/gnss/GnssLocationProvider$4;-><init>(Lcom/android/server/location/gnss/GnssLocationProvider;Landroid/content/Context;Landroid/os/Handler;)V
+PLcom/android/server/location/gnss/GnssLocationProvider$4;->isGpsEnabled()Z
+PLcom/android/server/location/gnss/GnssLocationProvider$5;-><init>(Lcom/android/server/location/gnss/GnssLocationProvider;Landroid/content/Context;Landroid/os/Handler;)V
+PLcom/android/server/location/gnss/GnssLocationProvider$5;->isGpsEnabled()Z
+PLcom/android/server/location/gnss/GnssLocationProvider$6;-><init>(Lcom/android/server/location/gnss/GnssLocationProvider;)V
+PLcom/android/server/location/gnss/GnssLocationProvider$6;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/location/gnss/GnssLocationProvider$7;-><init>(Lcom/android/server/location/gnss/GnssLocationProvider;Landroid/os/Handler;)V
+PLcom/android/server/location/gnss/GnssLocationProvider$7;->onChange(Z)V
+PLcom/android/server/location/gnss/GnssLocationProvider$8;-><init>(Lcom/android/server/location/gnss/GnssLocationProvider;)V
+PLcom/android/server/location/gnss/GnssLocationProvider$9;-><init>(Lcom/android/server/location/gnss/GnssLocationProvider;)V
+PLcom/android/server/location/gnss/GnssLocationProvider$FusedLocationListener;-><init>(Lcom/android/server/location/gnss/GnssLocationProvider;)V
+PLcom/android/server/location/gnss/GnssLocationProvider$FusedLocationListener;-><init>(Lcom/android/server/location/gnss/GnssLocationProvider;Lcom/android/server/location/gnss/GnssLocationProvider$1;)V
+PLcom/android/server/location/gnss/GnssLocationProvider$GpsRequest;-><init>(Lcom/android/internal/location/ProviderRequest;Landroid/os/WorkSource;)V
+PLcom/android/server/location/gnss/GnssLocationProvider$LocationChangeListener;-><init>(Lcom/android/server/location/gnss/GnssLocationProvider;)V
+PLcom/android/server/location/gnss/GnssLocationProvider$LocationChangeListener;-><init>(Lcom/android/server/location/gnss/GnssLocationProvider;Lcom/android/server/location/gnss/GnssLocationProvider$1;)V
+PLcom/android/server/location/gnss/GnssLocationProvider$LocationChangeListener;->access$1206(Lcom/android/server/location/gnss/GnssLocationProvider$LocationChangeListener;)I
+PLcom/android/server/location/gnss/GnssLocationProvider$LocationChangeListener;->access$1208(Lcom/android/server/location/gnss/GnssLocationProvider$LocationChangeListener;)I
+PLcom/android/server/location/gnss/GnssLocationProvider$LocationChangeListener;->onProviderDisabled(Ljava/lang/String;)V
+PLcom/android/server/location/gnss/GnssLocationProvider$LocationChangeListener;->onProviderEnabled(Ljava/lang/String;)V
+PLcom/android/server/location/gnss/GnssLocationProvider$LocationExtras;-><init>()V
+HPLcom/android/server/location/gnss/GnssLocationProvider$LocationExtras;->getBundle()Landroid/os/Bundle;
+PLcom/android/server/location/gnss/GnssLocationProvider$LocationExtras;->reset()V
+HPLcom/android/server/location/gnss/GnssLocationProvider$LocationExtras;->set(III)V
+HPLcom/android/server/location/gnss/GnssLocationProvider$LocationExtras;->setBundle(Landroid/os/Bundle;)V
+PLcom/android/server/location/gnss/GnssLocationProvider$NetworkLocationListener;-><init>(Lcom/android/server/location/gnss/GnssLocationProvider;)V
+PLcom/android/server/location/gnss/GnssLocationProvider$NetworkLocationListener;-><init>(Lcom/android/server/location/gnss/GnssLocationProvider;Lcom/android/server/location/gnss/GnssLocationProvider$1;)V
+HPLcom/android/server/location/gnss/GnssLocationProvider$NetworkLocationListener;->onLocationChanged(Landroid/location/Location;)V
+PLcom/android/server/location/gnss/GnssLocationProvider$ProviderHandler;-><init>(Lcom/android/server/location/gnss/GnssLocationProvider;Landroid/os/Looper;)V
+PLcom/android/server/location/gnss/GnssLocationProvider$ProviderHandler;->handleInitialize()V
+HPLcom/android/server/location/gnss/GnssLocationProvider$ProviderHandler;->handleMessage(Landroid/os/Message;)V
+HPLcom/android/server/location/gnss/GnssLocationProvider$SvStatusInfo;-><init>()V
+PLcom/android/server/location/gnss/GnssLocationProvider$SvStatusInfo;-><init>(Lcom/android/server/location/gnss/GnssLocationProvider$1;)V
+PLcom/android/server/location/gnss/GnssLocationProvider$SvStatusInfo;->access$1400(Lcom/android/server/location/gnss/GnssLocationProvider$SvStatusInfo;)I
+PLcom/android/server/location/gnss/GnssLocationProvider$SvStatusInfo;->access$1402(Lcom/android/server/location/gnss/GnssLocationProvider$SvStatusInfo;I)I
+PLcom/android/server/location/gnss/GnssLocationProvider$SvStatusInfo;->access$1500(Lcom/android/server/location/gnss/GnssLocationProvider$SvStatusInfo;)[I
+PLcom/android/server/location/gnss/GnssLocationProvider$SvStatusInfo;->access$1502(Lcom/android/server/location/gnss/GnssLocationProvider$SvStatusInfo;[I)[I
+PLcom/android/server/location/gnss/GnssLocationProvider$SvStatusInfo;->access$1600(Lcom/android/server/location/gnss/GnssLocationProvider$SvStatusInfo;)[F
+PLcom/android/server/location/gnss/GnssLocationProvider$SvStatusInfo;->access$1602(Lcom/android/server/location/gnss/GnssLocationProvider$SvStatusInfo;[F)[F
+PLcom/android/server/location/gnss/GnssLocationProvider$SvStatusInfo;->access$1700(Lcom/android/server/location/gnss/GnssLocationProvider$SvStatusInfo;)[F
+PLcom/android/server/location/gnss/GnssLocationProvider$SvStatusInfo;->access$1702(Lcom/android/server/location/gnss/GnssLocationProvider$SvStatusInfo;[F)[F
+PLcom/android/server/location/gnss/GnssLocationProvider$SvStatusInfo;->access$1800(Lcom/android/server/location/gnss/GnssLocationProvider$SvStatusInfo;)[F
+PLcom/android/server/location/gnss/GnssLocationProvider$SvStatusInfo;->access$1802(Lcom/android/server/location/gnss/GnssLocationProvider$SvStatusInfo;[F)[F
+PLcom/android/server/location/gnss/GnssLocationProvider$SvStatusInfo;->access$1900(Lcom/android/server/location/gnss/GnssLocationProvider$SvStatusInfo;)[F
+PLcom/android/server/location/gnss/GnssLocationProvider$SvStatusInfo;->access$1902(Lcom/android/server/location/gnss/GnssLocationProvider$SvStatusInfo;[F)[F
+PLcom/android/server/location/gnss/GnssLocationProvider$SvStatusInfo;->access$2000(Lcom/android/server/location/gnss/GnssLocationProvider$SvStatusInfo;)[F
+PLcom/android/server/location/gnss/GnssLocationProvider$SvStatusInfo;->access$2002(Lcom/android/server/location/gnss/GnssLocationProvider$SvStatusInfo;[F)[F
+PLcom/android/server/location/gnss/GnssLocationProvider;-><clinit>()V
+PLcom/android/server/location/gnss/GnssLocationProvider;-><init>(Landroid/content/Context;)V
+PLcom/android/server/location/gnss/GnssLocationProvider;->access$1100(Lcom/android/server/location/gnss/GnssLocationProvider;)V
+PLcom/android/server/location/gnss/GnssLocationProvider;->access$200()Z
+PLcom/android/server/location/gnss/GnssLocationProvider;->access$2500(Lcom/android/server/location/gnss/GnssLocationProvider;Lcom/android/internal/location/ProviderRequest;Landroid/os/WorkSource;)V
+PLcom/android/server/location/gnss/GnssLocationProvider;->access$2700(Lcom/android/server/location/gnss/GnssLocationProvider;ZZ)V
+PLcom/android/server/location/gnss/GnssLocationProvider;->access$3000(Lcom/android/server/location/gnss/GnssLocationProvider;ZLandroid/location/Location;)V
+PLcom/android/server/location/gnss/GnssLocationProvider;->access$3100(Lcom/android/server/location/gnss/GnssLocationProvider;Lcom/android/server/location/gnss/GnssLocationProvider$SvStatusInfo;)V
+PLcom/android/server/location/gnss/GnssLocationProvider;->access$3200(Lcom/android/server/location/gnss/GnssLocationProvider;)V
+PLcom/android/server/location/gnss/GnssLocationProvider;->access$3300(Lcom/android/server/location/gnss/GnssLocationProvider;)Landroid/os/PowerManager$WakeLock;
+PLcom/android/server/location/gnss/GnssLocationProvider;->access$3500(Lcom/android/server/location/gnss/GnssLocationProvider;Z)V
+PLcom/android/server/location/gnss/GnssLocationProvider;->access$3600()Z
+PLcom/android/server/location/gnss/GnssLocationProvider;->access$3702(Lcom/android/server/location/gnss/GnssLocationProvider;Lcom/android/server/location/gnss/GnssVisibilityControl;)Lcom/android/server/location/gnss/GnssVisibilityControl;
+PLcom/android/server/location/gnss/GnssLocationProvider;->access$3800(Lcom/android/server/location/gnss/GnssLocationProvider;)Landroid/content/Context;
+PLcom/android/server/location/gnss/GnssLocationProvider;->access$3900(Lcom/android/server/location/gnss/GnssLocationProvider;)Landroid/os/Looper;
+PLcom/android/server/location/gnss/GnssLocationProvider;->access$4000(Lcom/android/server/location/gnss/GnssLocationProvider;)Lcom/android/internal/location/GpsNetInitiatedHandler;
+PLcom/android/server/location/gnss/GnssLocationProvider;->access$4100(Lcom/android/server/location/gnss/GnssLocationProvider;)V
+PLcom/android/server/location/gnss/GnssLocationProvider;->access$4200(Lcom/android/server/location/gnss/GnssLocationProvider;)Landroid/content/BroadcastReceiver;
+PLcom/android/server/location/gnss/GnssLocationProvider;->access$4300(Lcom/android/server/location/gnss/GnssLocationProvider;)Lcom/android/server/location/gnss/GnssNetworkConnectivityHandler;
+PLcom/android/server/location/gnss/GnssLocationProvider;->access$4500(Lcom/android/server/location/gnss/GnssLocationProvider;Landroid/location/Location;)V
+PLcom/android/server/location/gnss/GnssLocationProvider;->access$500(Lcom/android/server/location/gnss/GnssLocationProvider;)Landroid/os/PowerManager;
+PLcom/android/server/location/gnss/GnssLocationProvider;->access$600(Lcom/android/server/location/gnss/GnssLocationProvider;)Lcom/android/server/DeviceIdleInternal$StationaryListener;
+PLcom/android/server/location/gnss/GnssLocationProvider;->access$700(Lcom/android/server/location/gnss/GnssLocationProvider;)Landroid/os/Handler;
+PLcom/android/server/location/gnss/GnssLocationProvider;->access$800(Lcom/android/server/location/gnss/GnssLocationProvider;)V
+PLcom/android/server/location/gnss/GnssLocationProvider;->access$900(Lcom/android/server/location/gnss/GnssLocationProvider;)Z
+PLcom/android/server/location/gnss/GnssLocationProvider;->dump(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V
+PLcom/android/server/location/gnss/GnssLocationProvider;->ensureInitialized()V
+PLcom/android/server/location/gnss/GnssLocationProvider;->getGeofenceStatus(I)I
+PLcom/android/server/location/gnss/GnssLocationProvider;->getGnssAntennaInfoProvider()Lcom/android/server/location/gnss/GnssAntennaInfoProvider;
+PLcom/android/server/location/gnss/GnssLocationProvider;->getGnssBatchingProvider()Lcom/android/server/location/gnss/GnssBatchingProvider;
+PLcom/android/server/location/gnss/GnssLocationProvider;->getGnssCapabilitiesProvider()Lcom/android/server/location/gnss/GnssCapabilitiesProvider;
+PLcom/android/server/location/gnss/GnssLocationProvider;->getGnssMeasurementCorrectionsProvider()Lcom/android/server/location/gnss/GnssMeasurementCorrectionsProvider;
+PLcom/android/server/location/gnss/GnssLocationProvider;->getGnssMeasurementsProvider()Lcom/android/server/location/gnss/GnssMeasurementsProvider;
+PLcom/android/server/location/gnss/GnssLocationProvider;->getGnssMetricsProvider()Lcom/android/server/location/gnss/GnssLocationProvider$GnssMetricsProvider;
+PLcom/android/server/location/gnss/GnssLocationProvider;->getGnssNavigationMessageProvider()Lcom/android/server/location/gnss/GnssNavigationMessageProvider;
+PLcom/android/server/location/gnss/GnssLocationProvider;->getGnssStatusProvider()Lcom/android/server/location/gnss/GnssStatusListenerHelper;
+PLcom/android/server/location/gnss/GnssLocationProvider;->getGnssSystemInfoProvider()Lcom/android/server/location/gnss/GnssLocationProvider$GnssSystemInfoProvider;
+PLcom/android/server/location/gnss/GnssLocationProvider;->getGpsGeofenceProxy()Landroid/location/IGpsGeofenceHardware;
+PLcom/android/server/location/gnss/GnssLocationProvider;->getNetInitiatedListener()Landroid/location/INetInitiatedListener;
+PLcom/android/server/location/gnss/GnssLocationProvider;->getSuplMode(Z)I
+PLcom/android/server/location/gnss/GnssLocationProvider;->handleDisable()V
+PLcom/android/server/location/gnss/GnssLocationProvider;->handleEnable()V
+HPLcom/android/server/location/gnss/GnssLocationProvider;->handleReportLocation(ZLandroid/location/Location;)V
+HPLcom/android/server/location/gnss/GnssLocationProvider;->handleReportSvStatus(Lcom/android/server/location/gnss/GnssLocationProvider$SvStatusInfo;)V
+HPLcom/android/server/location/gnss/GnssLocationProvider;->handleRequestLocation(ZZ)V
+PLcom/android/server/location/gnss/GnssLocationProvider;->handleSetRequest(Lcom/android/internal/location/ProviderRequest;Landroid/os/WorkSource;)V
+PLcom/android/server/location/gnss/GnssLocationProvider;->hasCapability(I)Z
+HPLcom/android/server/location/gnss/GnssLocationProvider;->injectLocation(Landroid/location/Location;)V
+PLcom/android/server/location/gnss/GnssLocationProvider;->injectTime(JJI)V
+PLcom/android/server/location/gnss/GnssLocationProvider;->isGpsEnabled()Z
+PLcom/android/server/location/gnss/GnssLocationProvider;->isRequestLocationRateLimited()Z
+PLcom/android/server/location/gnss/GnssLocationProvider;->isSupported()Z
+PLcom/android/server/location/gnss/GnssLocationProvider;->lambda$48m7ukf99eMCKhVUjqljxXFFvWw(Lcom/android/server/location/gnss/GnssLocationProvider;)V
+HPLcom/android/server/location/gnss/GnssLocationProvider;->lambda$handleRequestLocation$2(Lcom/android/server/location/gnss/GnssLocationProvider$LocationChangeListener;Ljava/lang/String;Landroid/location/LocationManager;)V
+PLcom/android/server/location/gnss/GnssLocationProvider;->lambda$new$0$GnssLocationProvider(Z)V
+PLcom/android/server/location/gnss/GnssLocationProvider;->lambda$onUpdateSatelliteBlacklist$1$GnssLocationProvider([I[I)V
+PLcom/android/server/location/gnss/GnssLocationProvider;->lambda$reportGeofenceAddStatus$13$GnssLocationProvider(II)V
+PLcom/android/server/location/gnss/GnssLocationProvider;->lambda$reportGeofenceRemoveStatus$14$GnssLocationProvider(II)V
+PLcom/android/server/location/gnss/GnssLocationProvider;->lambda$reportGeofenceStatus$12$GnssLocationProvider(ILandroid/location/Location;)V
+PLcom/android/server/location/gnss/GnssLocationProvider;->lambda$reportGeofenceTransition$11$GnssLocationProvider(ILandroid/location/Location;IJ)V
+PLcom/android/server/location/gnss/GnssLocationProvider;->lambda$reportMeasurementData$4$GnssLocationProvider(Landroid/location/GnssMeasurementsEvent;)V
+PLcom/android/server/location/gnss/GnssLocationProvider;->lambda$setSubHalMeasurementCorrectionsCapabilities$8$GnssLocationProvider(I)V
+PLcom/android/server/location/gnss/GnssLocationProvider;->lambda$setTopHalCapabilities$7$GnssLocationProvider(I)V
+PLcom/android/server/location/gnss/GnssLocationProvider;->onNetworkAvailable()V
+HPLcom/android/server/location/gnss/GnssLocationProvider;->onSetRequest(Lcom/android/internal/location/ProviderRequest;)V
+PLcom/android/server/location/gnss/GnssLocationProvider;->onUpdateSatelliteBlacklist([I[I)V
+HPLcom/android/server/location/gnss/GnssLocationProvider;->reloadGpsProperties()V
+PLcom/android/server/location/gnss/GnssLocationProvider;->reportAGpsStatus(II[B)V
+PLcom/android/server/location/gnss/GnssLocationProvider;->reportGeofenceAddStatus(II)V
+PLcom/android/server/location/gnss/GnssLocationProvider;->reportGeofenceRemoveStatus(II)V
+PLcom/android/server/location/gnss/GnssLocationProvider;->reportGeofenceStatus(ILandroid/location/Location;)V
+PLcom/android/server/location/gnss/GnssLocationProvider;->reportGeofenceTransition(ILandroid/location/Location;IJ)V
+HPLcom/android/server/location/gnss/GnssLocationProvider;->reportLocation(ZLandroid/location/Location;)V
+HPLcom/android/server/location/gnss/GnssLocationProvider;->reportMeasurementData(Landroid/location/GnssMeasurementsEvent;)V
+HPLcom/android/server/location/gnss/GnssLocationProvider;->reportNmea(J)V
+HPLcom/android/server/location/gnss/GnssLocationProvider;->reportStatus(I)V
+HPLcom/android/server/location/gnss/GnssLocationProvider;->reportSvStatus(I[I[F[F[F[F[F)V
+HPLcom/android/server/location/gnss/GnssLocationProvider;->requestLocation(ZZ)V
+PLcom/android/server/location/gnss/GnssLocationProvider;->requestSetID(I)V
+PLcom/android/server/location/gnss/GnssLocationProvider;->restartLocationRequest()V
+PLcom/android/server/location/gnss/GnssLocationProvider;->restartRequests()V
+HPLcom/android/server/location/gnss/GnssLocationProvider;->sendMessage(IILjava/lang/Object;)V
+PLcom/android/server/location/gnss/GnssLocationProvider;->setGnssHardwareModelName(Ljava/lang/String;)V
+PLcom/android/server/location/gnss/GnssLocationProvider;->setGnssYearOfHardware(I)V
+PLcom/android/server/location/gnss/GnssLocationProvider;->setGpsEnabled(Z)V
+PLcom/android/server/location/gnss/GnssLocationProvider;->setPositionMode(IIIIIZ)Z
+PLcom/android/server/location/gnss/GnssLocationProvider;->setStarted(Z)V
+PLcom/android/server/location/gnss/GnssLocationProvider;->setSubHalMeasurementCorrectionsCapabilities(I)V
+PLcom/android/server/location/gnss/GnssLocationProvider;->setSuplHostPort()V
+PLcom/android/server/location/gnss/GnssLocationProvider;->setTopHalCapabilities(I)V
+PLcom/android/server/location/gnss/GnssLocationProvider;->setupNativeGnssService(Z)V
+HPLcom/android/server/location/gnss/GnssLocationProvider;->startNavigating()V
+PLcom/android/server/location/gnss/GnssLocationProvider;->stopNavigating()V
+HPLcom/android/server/location/gnss/GnssLocationProvider;->subscriptionOrCarrierConfigChanged()V
+HPLcom/android/server/location/gnss/GnssLocationProvider;->updateClientUids(Landroid/os/WorkSource;)V
+HPLcom/android/server/location/gnss/GnssLocationProvider;->updateEnabled()V
+HPLcom/android/server/location/gnss/GnssLocationProvider;->updateLowPowerMode()V
+HPLcom/android/server/location/gnss/GnssLocationProvider;->updateRequirements()V
 HSPLcom/android/server/location/gnss/GnssManagerService;-><clinit>()V
+PLcom/android/server/location/gnss/GnssManagerService;-><init>(Landroid/content/Context;Lcom/android/server/location/AppOpsHelper;Lcom/android/server/location/SettingsHelper;Lcom/android/server/location/AppForegroundHelper;Lcom/android/server/location/LocationUsageLogger;)V
+PLcom/android/server/location/gnss/GnssManagerService;-><init>(Landroid/content/Context;Lcom/android/server/location/AppOpsHelper;Lcom/android/server/location/SettingsHelper;Lcom/android/server/location/AppForegroundHelper;Lcom/android/server/location/LocationUsageLogger;Lcom/android/server/location/gnss/GnssLocationProvider;)V
 HSPLcom/android/server/location/gnss/GnssManagerService;-><init>(Landroid/content/Context;Lcom/android/server/location/SettingsHelper;Lcom/android/server/location/AppForegroundHelper;Lcom/android/server/location/LocationUsageLogger;)V
 HSPLcom/android/server/location/gnss/GnssManagerService;-><init>(Landroid/content/Context;Lcom/android/server/location/SettingsHelper;Lcom/android/server/location/AppForegroundHelper;Lcom/android/server/location/LocationUsageLogger;Lcom/android/server/location/GnssLocationProvider;)V
+PLcom/android/server/location/gnss/GnssManagerService;-><init>(Landroid/content/Context;Lcom/android/server/location/SettingsHelper;Lcom/android/server/location/AppForegroundHelper;Lcom/android/server/location/LocationUsageLogger;Lcom/android/server/location/gnss/GnssLocationProvider;)V
 HSPLcom/android/server/location/gnss/GnssManagerService;-><init>(Lcom/android/server/LocationManagerService;Landroid/content/Context;Lcom/android/server/location/GnssLocationProvider;Lcom/android/server/location/LocationUsageLogger;)V
 HSPLcom/android/server/location/gnss/GnssManagerService;-><init>(Lcom/android/server/LocationManagerService;Landroid/content/Context;Lcom/android/server/location/LocationUsageLogger;)V
 HPLcom/android/server/location/gnss/GnssManagerService;->addGnssDataListenerLocked(Landroid/os/IInterface;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/android/server/location/RemoteListenerHelper;Landroid/util/ArrayMap;Ljava/util/function/Consumer;)Z
+HPLcom/android/server/location/gnss/GnssManagerService;->addGnssDataListenerLocked(Ljava/lang/Object;Landroid/os/IInterface;Ljava/lang/String;Ljava/lang/String;Lcom/android/server/location/RemoteListenerHelper;Landroid/util/ArrayMap;Ljava/util/function/Consumer;)Z
 HPLcom/android/server/location/gnss/GnssManagerService;->addGnssDataListenerLocked(Ljava/lang/Object;Landroid/os/IInterface;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/android/server/location/RemoteListenerHelper;Landroid/util/ArrayMap;Ljava/util/function/Consumer;)Z
+PLcom/android/server/location/gnss/GnssManagerService;->addGnssMeasurementsListener(Landroid/location/GnssRequest;Landroid/location/IGnssMeasurementsListener;Ljava/lang/String;Ljava/lang/String;)Z
 PLcom/android/server/location/gnss/GnssManagerService;->addGnssMeasurementsListener(Landroid/location/GnssRequest;Landroid/location/IGnssMeasurementsListener;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z
 PLcom/android/server/location/gnss/GnssManagerService;->addGnssMeasurementsListener(Landroid/location/IGnssMeasurementsListener;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z
 HPLcom/android/server/location/gnss/GnssManagerService;->checkLocationAppOp(Ljava/lang/String;)Z
 PLcom/android/server/location/gnss/GnssManagerService;->dump(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V
+PLcom/android/server/location/gnss/GnssManagerService;->getGnssCapabilities()J
 HPLcom/android/server/location/gnss/GnssManagerService;->getGnssCapabilities(Ljava/lang/String;)J
 HSPLcom/android/server/location/gnss/GnssManagerService;->getGnssLocationProvider()Lcom/android/server/location/GnssLocationProvider;
+PLcom/android/server/location/gnss/GnssManagerService;->getGnssLocationProvider()Lcom/android/server/location/gnss/GnssLocationProvider;
 HSPLcom/android/server/location/gnss/GnssManagerService;->getGpsGeofenceProxy()Landroid/location/IGpsGeofenceHardware;
 HPLcom/android/server/location/gnss/GnssManagerService;->hasGnssPermissions(Ljava/lang/String;)Z
 PLcom/android/server/location/gnss/GnssManagerService;->injectGnssMeasurementCorrections(Landroid/location/GnssMeasurementCorrections;Ljava/lang/String;)V
@@ -19923,6 +21478,168 @@
 HPLcom/android/server/location/gnss/GnssManagerService;->unregisterGnssStatusCallback(Landroid/location/IGnssStatusListener;)V
 HSPLcom/android/server/location/gnss/GnssManagerService;->updateListenersOnForegroundChangedLocked(Landroid/util/ArrayMap;Lcom/android/server/location/RemoteListenerHelper;Ljava/util/function/Function;IZ)V
 HSPLcom/android/server/location/gnss/GnssManagerService;->updateListenersOnForegroundChangedLocked(Ljava/util/Map;Lcom/android/server/location/RemoteListenerHelper;Ljava/util/function/Function;IZ)V
+PLcom/android/server/location/gnss/GnssMeasurementCorrectionsProvider$GnssMeasurementCorrectionsProviderNative;-><init>()V
+PLcom/android/server/location/gnss/GnssMeasurementCorrectionsProvider;-><init>(Landroid/os/Handler;)V
+PLcom/android/server/location/gnss/GnssMeasurementCorrectionsProvider;-><init>(Landroid/os/Handler;Lcom/android/server/location/gnss/GnssMeasurementCorrectionsProvider$GnssMeasurementCorrectionsProviderNative;)V
+PLcom/android/server/location/gnss/GnssMeasurementCorrectionsProvider;->hasCapability(II)Z
+PLcom/android/server/location/gnss/GnssMeasurementCorrectionsProvider;->onCapabilitiesUpdated(I)Z
+PLcom/android/server/location/gnss/GnssMeasurementsProvider$GnssMeasurementProviderNative;-><init>()V
+PLcom/android/server/location/gnss/GnssMeasurementsProvider$GnssMeasurementProviderNative;->isMeasurementSupported()Z
+PLcom/android/server/location/gnss/GnssMeasurementsProvider$GnssMeasurementProviderNative;->startMeasurementCollection(Z)Z
+PLcom/android/server/location/gnss/GnssMeasurementsProvider$GnssMeasurementProviderNative;->stopMeasurementCollection()Z
+PLcom/android/server/location/gnss/GnssMeasurementsProvider$StatusChangedOperation;-><init>(I)V
+PLcom/android/server/location/gnss/GnssMeasurementsProvider$StatusChangedOperation;->execute(Landroid/location/IGnssMeasurementsListener;Lcom/android/server/location/CallerIdentity;)V
+PLcom/android/server/location/gnss/GnssMeasurementsProvider$StatusChangedOperation;->execute(Landroid/os/IInterface;Lcom/android/server/location/CallerIdentity;)V
+PLcom/android/server/location/gnss/GnssMeasurementsProvider;-><clinit>()V
+PLcom/android/server/location/gnss/GnssMeasurementsProvider;-><init>(Landroid/content/Context;Landroid/os/Handler;)V
+PLcom/android/server/location/gnss/GnssMeasurementsProvider;-><init>(Landroid/content/Context;Landroid/os/Handler;Lcom/android/server/location/gnss/GnssMeasurementsProvider$GnssMeasurementProviderNative;)V
+PLcom/android/server/location/gnss/GnssMeasurementsProvider;->access$000()Z
+PLcom/android/server/location/gnss/GnssMeasurementsProvider;->access$100(Z)Z
+PLcom/android/server/location/gnss/GnssMeasurementsProvider;->access$200()Z
+PLcom/android/server/location/gnss/GnssMeasurementsProvider;->getHandlerOperation(I)Lcom/android/server/location/RemoteListenerHelper$ListenerOperation;
+PLcom/android/server/location/gnss/GnssMeasurementsProvider;->getMergedFullTracking()Z
+PLcom/android/server/location/gnss/GnssMeasurementsProvider;->isAvailableInPlatform()Z
+HPLcom/android/server/location/gnss/GnssMeasurementsProvider;->lambda$onMeasurementsAvailable$0$GnssMeasurementsProvider(Landroid/location/GnssMeasurementsEvent;Landroid/location/IGnssMeasurementsListener;Lcom/android/server/location/CallerIdentity;)V
+PLcom/android/server/location/gnss/GnssMeasurementsProvider;->onCapabilitiesUpdated(Z)V
+PLcom/android/server/location/gnss/GnssMeasurementsProvider;->onGpsEnabledChanged()V
+HPLcom/android/server/location/gnss/GnssMeasurementsProvider;->onMeasurementsAvailable(Landroid/location/GnssMeasurementsEvent;)V
+PLcom/android/server/location/gnss/GnssMeasurementsProvider;->registerWithService()I
+PLcom/android/server/location/gnss/GnssMeasurementsProvider;->resumeIfStarted()V
+PLcom/android/server/location/gnss/GnssMeasurementsProvider;->unregisterFromService()V
+PLcom/android/server/location/gnss/GnssNavigationMessageProvider$GnssNavigationMessageProviderNative;-><init>()V
+PLcom/android/server/location/gnss/GnssNavigationMessageProvider$GnssNavigationMessageProviderNative;->isNavigationMessageSupported()Z
+PLcom/android/server/location/gnss/GnssNavigationMessageProvider$StatusChangedOperation;-><init>(I)V
+PLcom/android/server/location/gnss/GnssNavigationMessageProvider;-><clinit>()V
+PLcom/android/server/location/gnss/GnssNavigationMessageProvider;-><init>(Landroid/content/Context;Landroid/os/Handler;)V
+PLcom/android/server/location/gnss/GnssNavigationMessageProvider;-><init>(Landroid/content/Context;Landroid/os/Handler;Lcom/android/server/location/gnss/GnssNavigationMessageProvider$GnssNavigationMessageProviderNative;)V
+PLcom/android/server/location/gnss/GnssNavigationMessageProvider;->access$000()Z
+PLcom/android/server/location/gnss/GnssNavigationMessageProvider;->getHandlerOperation(I)Lcom/android/server/location/RemoteListenerHelper$ListenerOperation;
+PLcom/android/server/location/gnss/GnssNavigationMessageProvider;->isAvailableInPlatform()Z
+PLcom/android/server/location/gnss/GnssNavigationMessageProvider;->onCapabilitiesUpdated(Z)V
+PLcom/android/server/location/gnss/GnssNavigationMessageProvider;->onGpsEnabledChanged()V
+PLcom/android/server/location/gnss/GnssNavigationMessageProvider;->resumeIfStarted()V
+PLcom/android/server/location/gnss/GnssNetworkConnectivityHandler$1;-><init>(Lcom/android/server/location/gnss/GnssNetworkConnectivityHandler;)V
+HPLcom/android/server/location/gnss/GnssNetworkConnectivityHandler$1;->onSubscriptionsChanged()V
+PLcom/android/server/location/gnss/GnssNetworkConnectivityHandler$2;-><init>(Lcom/android/server/location/gnss/GnssNetworkConnectivityHandler;)V
+HPLcom/android/server/location/gnss/GnssNetworkConnectivityHandler$2;->onCapabilitiesChanged(Landroid/net/Network;Landroid/net/NetworkCapabilities;)V
+HPLcom/android/server/location/gnss/GnssNetworkConnectivityHandler$2;->onLost(Landroid/net/Network;)V
+PLcom/android/server/location/gnss/GnssNetworkConnectivityHandler$3;-><init>(Lcom/android/server/location/gnss/GnssNetworkConnectivityHandler;)V
+PLcom/android/server/location/gnss/GnssNetworkConnectivityHandler$3;->onAvailable(Landroid/net/Network;)V
+PLcom/android/server/location/gnss/GnssNetworkConnectivityHandler$3;->onLost(Landroid/net/Network;)V
+PLcom/android/server/location/gnss/GnssNetworkConnectivityHandler$3;->onUnavailable()V
+PLcom/android/server/location/gnss/GnssNetworkConnectivityHandler$NetworkAttributes;-><init>()V
+PLcom/android/server/location/gnss/GnssNetworkConnectivityHandler$NetworkAttributes;-><init>(Lcom/android/server/location/gnss/GnssNetworkConnectivityHandler$1;)V
+PLcom/android/server/location/gnss/GnssNetworkConnectivityHandler$NetworkAttributes;->access$1000(Lcom/android/server/location/gnss/GnssNetworkConnectivityHandler$NetworkAttributes;)Ljava/lang/String;
+PLcom/android/server/location/gnss/GnssNetworkConnectivityHandler$NetworkAttributes;->access$1002(Lcom/android/server/location/gnss/GnssNetworkConnectivityHandler$NetworkAttributes;Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/location/gnss/GnssNetworkConnectivityHandler$NetworkAttributes;->access$1100(Lcom/android/server/location/gnss/GnssNetworkConnectivityHandler$NetworkAttributes;)I
+PLcom/android/server/location/gnss/GnssNetworkConnectivityHandler$NetworkAttributes;->access$1102(Lcom/android/server/location/gnss/GnssNetworkConnectivityHandler$NetworkAttributes;I)I
+PLcom/android/server/location/gnss/GnssNetworkConnectivityHandler$NetworkAttributes;->access$1200(Lcom/android/server/location/gnss/GnssNetworkConnectivityHandler$NetworkAttributes;)Landroid/net/NetworkCapabilities;
+PLcom/android/server/location/gnss/GnssNetworkConnectivityHandler$NetworkAttributes;->access$1202(Lcom/android/server/location/gnss/GnssNetworkConnectivityHandler$NetworkAttributes;Landroid/net/NetworkCapabilities;)Landroid/net/NetworkCapabilities;
+PLcom/android/server/location/gnss/GnssNetworkConnectivityHandler$NetworkAttributes;->access$1300(Landroid/net/NetworkCapabilities;)S
+PLcom/android/server/location/gnss/GnssNetworkConnectivityHandler$NetworkAttributes;->access$400(Landroid/net/NetworkCapabilities;Landroid/net/NetworkCapabilities;)Z
+PLcom/android/server/location/gnss/GnssNetworkConnectivityHandler$NetworkAttributes;->getCapabilityFlags(Landroid/net/NetworkCapabilities;)S
+HPLcom/android/server/location/gnss/GnssNetworkConnectivityHandler$NetworkAttributes;->hasCapabilitiesChanged(Landroid/net/NetworkCapabilities;Landroid/net/NetworkCapabilities;)Z
+HPLcom/android/server/location/gnss/GnssNetworkConnectivityHandler$NetworkAttributes;->hasCapabilityChanged(Landroid/net/NetworkCapabilities;Landroid/net/NetworkCapabilities;I)Z
+PLcom/android/server/location/gnss/GnssNetworkConnectivityHandler$SubIdPhoneStateListener;-><init>(Lcom/android/server/location/gnss/GnssNetworkConnectivityHandler;Ljava/lang/Integer;)V
+PLcom/android/server/location/gnss/GnssNetworkConnectivityHandler$SubIdPhoneStateListener;->onPreciseCallStateChanged(Landroid/telephony/PreciseCallState;)V
+PLcom/android/server/location/gnss/GnssNetworkConnectivityHandler;-><clinit>()V
+PLcom/android/server/location/gnss/GnssNetworkConnectivityHandler;-><init>(Landroid/content/Context;Lcom/android/server/location/gnss/GnssNetworkConnectivityHandler$GnssNetworkListener;Landroid/os/Looper;Lcom/android/internal/location/GpsNetInitiatedHandler;)V
+PLcom/android/server/location/gnss/GnssNetworkConnectivityHandler;->access$000(Lcom/android/server/location/gnss/GnssNetworkConnectivityHandler;)I
+PLcom/android/server/location/gnss/GnssNetworkConnectivityHandler;->access$002(Lcom/android/server/location/gnss/GnssNetworkConnectivityHandler;I)I
+PLcom/android/server/location/gnss/GnssNetworkConnectivityHandler;->access$100()Z
+PLcom/android/server/location/gnss/GnssNetworkConnectivityHandler;->access$200(Lcom/android/server/location/gnss/GnssNetworkConnectivityHandler;)Ljava/util/HashMap;
+PLcom/android/server/location/gnss/GnssNetworkConnectivityHandler;->access$202(Lcom/android/server/location/gnss/GnssNetworkConnectivityHandler;Ljava/util/HashMap;)Ljava/util/HashMap;
+PLcom/android/server/location/gnss/GnssNetworkConnectivityHandler;->access$300(Lcom/android/server/location/gnss/GnssNetworkConnectivityHandler;)Landroid/content/Context;
+PLcom/android/server/location/gnss/GnssNetworkConnectivityHandler;->access$500()Z
+PLcom/android/server/location/gnss/GnssNetworkConnectivityHandler;->access$600(Lcom/android/server/location/gnss/GnssNetworkConnectivityHandler;)Lcom/android/server/location/gnss/GnssNetworkConnectivityHandler$GnssNetworkListener;
+PLcom/android/server/location/gnss/GnssNetworkConnectivityHandler;->access$700(Lcom/android/server/location/gnss/GnssNetworkConnectivityHandler;Landroid/net/Network;ZLandroid/net/NetworkCapabilities;)V
+PLcom/android/server/location/gnss/GnssNetworkConnectivityHandler;->access$800(Lcom/android/server/location/gnss/GnssNetworkConnectivityHandler;Landroid/net/Network;)V
+PLcom/android/server/location/gnss/GnssNetworkConnectivityHandler;->access$900(Lcom/android/server/location/gnss/GnssNetworkConnectivityHandler;I)V
+PLcom/android/server/location/gnss/GnssNetworkConnectivityHandler;->agpsDataConnStateAsString()Ljava/lang/String;
+PLcom/android/server/location/gnss/GnssNetworkConnectivityHandler;->createNetworkConnectivityCallback()Landroid/net/ConnectivityManager$NetworkCallback;
+PLcom/android/server/location/gnss/GnssNetworkConnectivityHandler;->createSuplConnectivityCallback()Landroid/net/ConnectivityManager$NetworkCallback;
+PLcom/android/server/location/gnss/GnssNetworkConnectivityHandler;->ensureInHandlerThread()V
+HPLcom/android/server/location/gnss/GnssNetworkConnectivityHandler;->getApnIpType(Ljava/lang/String;)I
+PLcom/android/server/location/gnss/GnssNetworkConnectivityHandler;->getNetworkCapability(I)I
+PLcom/android/server/location/gnss/GnssNetworkConnectivityHandler;->handleReleaseSuplConnection(I)V
+PLcom/android/server/location/gnss/GnssNetworkConnectivityHandler;->handleRequestSuplConnection(I[B)V
+PLcom/android/server/location/gnss/GnssNetworkConnectivityHandler;->handleSuplConnectionAvailable(Landroid/net/Network;)V
+HPLcom/android/server/location/gnss/GnssNetworkConnectivityHandler;->handleUpdateNetworkState(Landroid/net/Network;ZLandroid/net/NetworkCapabilities;)V
+PLcom/android/server/location/gnss/GnssNetworkConnectivityHandler;->lambda$onReportAGpsStatus$0$GnssNetworkConnectivityHandler(I[B)V
+PLcom/android/server/location/gnss/GnssNetworkConnectivityHandler;->lambda$onReportAGpsStatus$1$GnssNetworkConnectivityHandler()V
+PLcom/android/server/location/gnss/GnssNetworkConnectivityHandler;->lambda$runEventAndReleaseWakeLock$2$GnssNetworkConnectivityHandler(Ljava/lang/Runnable;)V
+PLcom/android/server/location/gnss/GnssNetworkConnectivityHandler;->onReportAGpsStatus(II[B)V
+PLcom/android/server/location/gnss/GnssNetworkConnectivityHandler;->registerNetworkCallbacks()V
+PLcom/android/server/location/gnss/GnssNetworkConnectivityHandler;->runEventAndReleaseWakeLock(Ljava/lang/Runnable;)Ljava/lang/Runnable;
+PLcom/android/server/location/gnss/GnssNetworkConnectivityHandler;->runOnHandler(Ljava/lang/Runnable;)V
+PLcom/android/server/location/gnss/GnssNetworkConnectivityHandler;->setRouting()V
+PLcom/android/server/location/gnss/GnssNetworkConnectivityHandler;->translateToApnIpType(Ljava/lang/String;Ljava/lang/String;)I
+PLcom/android/server/location/gnss/GnssNetworkConnectivityHandler;->updateTrackedNetworksState(ZLandroid/net/Network;Landroid/net/NetworkCapabilities;)Lcom/android/server/location/gnss/GnssNetworkConnectivityHandler$NetworkAttributes;
+PLcom/android/server/location/gnss/GnssPositionMode;-><init>(IIIIIZ)V
+PLcom/android/server/location/gnss/GnssPositionMode;->equals(Ljava/lang/Object;)Z
+PLcom/android/server/location/gnss/GnssSatelliteBlacklistHelper$1;-><init>(Lcom/android/server/location/gnss/GnssSatelliteBlacklistHelper;Landroid/os/Handler;)V
+PLcom/android/server/location/gnss/GnssSatelliteBlacklistHelper$1;->onChange(Z)V
+PLcom/android/server/location/gnss/GnssSatelliteBlacklistHelper;-><init>(Landroid/content/Context;Landroid/os/Looper;Lcom/android/server/location/gnss/GnssSatelliteBlacklistHelper$GnssSatelliteBlacklistCallback;)V
+PLcom/android/server/location/gnss/GnssSatelliteBlacklistHelper;->parseSatelliteBlacklist(Ljava/lang/String;)Ljava/util/List;
+PLcom/android/server/location/gnss/GnssSatelliteBlacklistHelper;->updateSatelliteBlacklist()V
+PLcom/android/server/location/gnss/GnssStatusListenerHelper;-><clinit>()V
+PLcom/android/server/location/gnss/GnssStatusListenerHelper;-><init>(Landroid/content/Context;Landroid/os/Handler;)V
+PLcom/android/server/location/gnss/GnssStatusListenerHelper;->getHandlerOperation(I)Lcom/android/server/location/RemoteListenerHelper$ListenerOperation;
+PLcom/android/server/location/gnss/GnssStatusListenerHelper;->lambda$onFirstFix$2(ILandroid/location/IGnssStatusListener;Lcom/android/server/location/CallerIdentity;)V
+HPLcom/android/server/location/gnss/GnssStatusListenerHelper;->lambda$onNmeaReceived$4$GnssStatusListenerHelper(JLjava/lang/String;Landroid/location/IGnssStatusListener;Lcom/android/server/location/CallerIdentity;)V
+PLcom/android/server/location/gnss/GnssStatusListenerHelper;->lambda$onStatusChanged$0(Landroid/location/IGnssStatusListener;Lcom/android/server/location/CallerIdentity;)V
+PLcom/android/server/location/gnss/GnssStatusListenerHelper;->lambda$onStatusChanged$1(Landroid/location/IGnssStatusListener;Lcom/android/server/location/CallerIdentity;)V
+HPLcom/android/server/location/gnss/GnssStatusListenerHelper;->lambda$onSvStatusChanged$3$GnssStatusListenerHelper(I[I[F[F[F[F[FLandroid/location/IGnssStatusListener;Lcom/android/server/location/CallerIdentity;)V
+PLcom/android/server/location/gnss/GnssStatusListenerHelper;->onFirstFix(I)V
+HPLcom/android/server/location/gnss/GnssStatusListenerHelper;->onNmeaReceived(JLjava/lang/String;)V
+PLcom/android/server/location/gnss/GnssStatusListenerHelper;->onStatusChanged(Z)V
+PLcom/android/server/location/gnss/GnssStatusListenerHelper;->onSvStatusChanged(I[I[F[F[F[F[F)V
+PLcom/android/server/location/gnss/GnssStatusListenerHelper;->registerWithService()I
+PLcom/android/server/location/gnss/GnssStatusListenerHelper;->unregisterFromService()V
+PLcom/android/server/location/gnss/GnssVisibilityControl$1;-><init>(Lcom/android/server/location/gnss/GnssVisibilityControl;)V
+HPLcom/android/server/location/gnss/GnssVisibilityControl$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/location/gnss/GnssVisibilityControl$ProxyAppState;-><init>(Z)V
+PLcom/android/server/location/gnss/GnssVisibilityControl$ProxyAppState;-><init>(ZLcom/android/server/location/gnss/GnssVisibilityControl$1;)V
+PLcom/android/server/location/gnss/GnssVisibilityControl$ProxyAppState;->access$100(Lcom/android/server/location/gnss/GnssVisibilityControl$ProxyAppState;)Z
+PLcom/android/server/location/gnss/GnssVisibilityControl$ProxyAppState;->access$300(Lcom/android/server/location/gnss/GnssVisibilityControl$ProxyAppState;)Z
+PLcom/android/server/location/gnss/GnssVisibilityControl;-><clinit>()V
+PLcom/android/server/location/gnss/GnssVisibilityControl;-><init>(Landroid/content/Context;Landroid/os/Looper;Lcom/android/internal/location/GpsNetInitiatedHandler;)V
+PLcom/android/server/location/gnss/GnssVisibilityControl;->access$000(Lcom/android/server/location/gnss/GnssVisibilityControl;Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/location/gnss/GnssVisibilityControl;->disableNfwLocationAccess()V
+PLcom/android/server/location/gnss/GnssVisibilityControl;->getLocationPermissionEnabledProxyApps()[Ljava/lang/String;
+PLcom/android/server/location/gnss/GnssVisibilityControl;->getProxyAppInfo(Ljava/lang/String;)Landroid/content/pm/ApplicationInfo;
+PLcom/android/server/location/gnss/GnssVisibilityControl;->handleGpsEnabledChanged(Z)V
+PLcom/android/server/location/gnss/GnssVisibilityControl;->handleInitialize()V
+HPLcom/android/server/location/gnss/GnssVisibilityControl;->handlePermissionsChanged(I)V
+HPLcom/android/server/location/gnss/GnssVisibilityControl;->handleProxyAppPackageUpdate(Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/location/gnss/GnssVisibilityControl;->handleUpdateProxyApps(Ljava/util/List;)V
+PLcom/android/server/location/gnss/GnssVisibilityControl;->hasLocationPermission(Ljava/lang/String;)Z
+PLcom/android/server/location/gnss/GnssVisibilityControl;->isProxyAppInstalled(Ljava/lang/String;)Z
+PLcom/android/server/location/gnss/GnssVisibilityControl;->isProxyAppListUpdated(Ljava/util/List;)Z
+PLcom/android/server/location/gnss/GnssVisibilityControl;->lambda$JE5r4mEk9pQ3wqWvn6pP20Ix0qs(Lcom/android/server/location/gnss/GnssVisibilityControl;)V
+PLcom/android/server/location/gnss/GnssVisibilityControl;->lambda$new$0$GnssVisibilityControl(I)V
+PLcom/android/server/location/gnss/GnssVisibilityControl;->lambda$new$1$GnssVisibilityControl(I)V
+PLcom/android/server/location/gnss/GnssVisibilityControl;->lambda$onConfigurationUpdated$4$GnssVisibilityControl(Ljava/util/List;)V
+PLcom/android/server/location/gnss/GnssVisibilityControl;->lambda$onGpsEnabledChanged$2$GnssVisibilityControl(Z)V
+PLcom/android/server/location/gnss/GnssVisibilityControl;->lambda$runEventAndReleaseWakeLock$6$GnssVisibilityControl(Ljava/lang/Runnable;)V
+PLcom/android/server/location/gnss/GnssVisibilityControl;->listenForProxyAppsPackageUpdates()V
+PLcom/android/server/location/gnss/GnssVisibilityControl;->onConfigurationUpdated(Lcom/android/server/location/gnss/GnssConfiguration;)V
+PLcom/android/server/location/gnss/GnssVisibilityControl;->onGpsEnabledChanged(Z)V
+PLcom/android/server/location/gnss/GnssVisibilityControl;->resetProxyAppsState()V
+PLcom/android/server/location/gnss/GnssVisibilityControl;->runEventAndReleaseWakeLock(Ljava/lang/Runnable;)Ljava/lang/Runnable;
+PLcom/android/server/location/gnss/GnssVisibilityControl;->runOnHandler(Ljava/lang/Runnable;)V
+PLcom/android/server/location/gnss/GnssVisibilityControl;->setNfwLocationAccessProxyAppsInGnssHal([Ljava/lang/String;)V
+PLcom/android/server/location/gnss/GnssVisibilityControl;->shouldEnableLocationPermissionInGnssHal(Ljava/lang/String;)Z
+PLcom/android/server/location/gnss/GnssVisibilityControl;->updateNfwLocationAccessProxyAppsInGnssHal()V
+PLcom/android/server/location/gnss/NtpTimeHelper;-><clinit>()V
+PLcom/android/server/location/gnss/NtpTimeHelper;-><init>(Landroid/content/Context;Landroid/os/Looper;Lcom/android/server/location/gnss/NtpTimeHelper$InjectNtpTimeCallback;)V
+PLcom/android/server/location/gnss/NtpTimeHelper;-><init>(Landroid/content/Context;Landroid/os/Looper;Lcom/android/server/location/gnss/NtpTimeHelper$InjectNtpTimeCallback;Landroid/util/NtpTrustedTime;)V
+PLcom/android/server/location/gnss/NtpTimeHelper;->blockingGetNtpTimeAndInject()V
+PLcom/android/server/location/gnss/NtpTimeHelper;->isNetworkConnected()Z
+PLcom/android/server/location/gnss/NtpTimeHelper;->lambda$0f3JRUuSYH-K-brPBZMOA96D-q4(Lcom/android/server/location/gnss/NtpTimeHelper;)V
+PLcom/android/server/location/gnss/NtpTimeHelper;->lambda$blockingGetNtpTimeAndInject$0$NtpTimeHelper(JJJ)V
+PLcom/android/server/location/gnss/NtpTimeHelper;->onNetworkAvailable()V
+PLcom/android/server/location/gnss/NtpTimeHelper;->retrieveAndInjectNtpTime()V
 PLcom/android/server/locksettings/-$$Lambda$LockSettingsService$25VQEBWGuGqdc4Xjn9m8HXt9ZTI;-><init>(Lcom/android/server/locksettings/LockSettingsService;Ljava/util/ArrayList;I)V
 PLcom/android/server/locksettings/-$$Lambda$LockSettingsService$25VQEBWGuGqdc4Xjn9m8HXt9ZTI;->run()V
 PLcom/android/server/locksettings/-$$Lambda$LockSettingsService$6ZJNEvi0AXsP3F_UD8F01RaIg3M;-><init>(I)V
@@ -19942,9 +21659,11 @@
 PLcom/android/server/locksettings/LockSettingsService$3;->onProgress(IILandroid/os/Bundle;)V
 PLcom/android/server/locksettings/LockSettingsService$3;->onStarted(ILandroid/os/Bundle;)V
 HSPLcom/android/server/locksettings/LockSettingsService$DeviceProvisionedObserver;-><init>(Lcom/android/server/locksettings/LockSettingsService;)V
+PLcom/android/server/locksettings/LockSettingsService$DeviceProvisionedObserver;->clearFrpCredentialIfOwnerNotSecure()V
 HSPLcom/android/server/locksettings/LockSettingsService$DeviceProvisionedObserver;->isProvisioned()Z
 PLcom/android/server/locksettings/LockSettingsService$DeviceProvisionedObserver;->onChange(ZLandroid/net/Uri;I)V
 HSPLcom/android/server/locksettings/LockSettingsService$DeviceProvisionedObserver;->onSystemReady()V
+PLcom/android/server/locksettings/LockSettingsService$DeviceProvisionedObserver;->reportDeviceSetupComplete()V
 HSPLcom/android/server/locksettings/LockSettingsService$DeviceProvisionedObserver;->updateRegistration()V
 HSPLcom/android/server/locksettings/LockSettingsService$GateKeeperDiedRecipient;-><init>(Lcom/android/server/locksettings/LockSettingsService;)V
 HSPLcom/android/server/locksettings/LockSettingsService$GateKeeperDiedRecipient;-><init>(Lcom/android/server/locksettings/LockSettingsService;Lcom/android/server/locksettings/LockSettingsService$1;)V
@@ -19971,6 +21690,7 @@
 HPLcom/android/server/locksettings/LockSettingsService$Injector;->getUserManagerInternal()Landroid/os/UserManagerInternal;
 PLcom/android/server/locksettings/LockSettingsService$Injector;->hasEnrolledBiometrics(I)Z
 HPLcom/android/server/locksettings/LockSettingsService$Injector;->isGsiRunning()Z
+PLcom/android/server/locksettings/LockSettingsService$Injector;->settingsSecureGetInt(Landroid/content/ContentResolver;Ljava/lang/String;II)I
 HSPLcom/android/server/locksettings/LockSettingsService$Lifecycle;-><init>(Landroid/content/Context;)V
 HSPLcom/android/server/locksettings/LockSettingsService$Lifecycle;->onBootPhase(I)V
 PLcom/android/server/locksettings/LockSettingsService$Lifecycle;->onCleanupUser(I)V
@@ -19980,6 +21700,7 @@
 HSPLcom/android/server/locksettings/LockSettingsService$LocalService;-><init>(Lcom/android/server/locksettings/LockSettingsService;)V
 HSPLcom/android/server/locksettings/LockSettingsService$LocalService;-><init>(Lcom/android/server/locksettings/LockSettingsService;Lcom/android/server/locksettings/LockSettingsService$1;)V
 PLcom/android/server/locksettings/LockSettingsService$LocalService;->addEscrowToken([BILcom/android/internal/widget/LockPatternUtils$EscrowTokenStateChangeCallback;)J
+PLcom/android/server/locksettings/LockSettingsService$LocalService;->armRebootEscrow()Z
 HPLcom/android/server/locksettings/LockSettingsService$LocalService;->getUserPasswordMetrics(I)Landroid/app/admin/PasswordMetrics;
 PLcom/android/server/locksettings/LockSettingsService$LocalService;->isEscrowTokenActive(JI)Z
 PLcom/android/server/locksettings/LockSettingsService$LocalService;->prepareRebootEscrow()V
@@ -20005,7 +21726,9 @@
 HSPLcom/android/server/locksettings/LockSettingsService;->access$1800(Lcom/android/server/locksettings/LockSettingsService;)Lcom/android/server/locksettings/RebootEscrowManager;
 PLcom/android/server/locksettings/LockSettingsService;->access$1900(Lcom/android/server/locksettings/LockSettingsService;)Lcom/android/server/locksettings/LockSettingsStrongAuth;
 PLcom/android/server/locksettings/LockSettingsService;->access$200(Lcom/android/server/locksettings/LockSettingsService;I)V
+PLcom/android/server/locksettings/LockSettingsService;->access$2000(Lcom/android/server/locksettings/LockSettingsService;Lcom/android/server/locksettings/SyntheticPasswordManager$AuthenticationToken;I)Landroid/app/admin/PasswordMetrics;
 PLcom/android/server/locksettings/LockSettingsService;->access$2000(Lcom/android/server/locksettings/LockSettingsService;Lcom/android/server/locksettings/SyntheticPasswordManager$AuthenticationToken;IJLjava/util/ArrayList;I)V
+PLcom/android/server/locksettings/LockSettingsService;->access$2100(Lcom/android/server/locksettings/LockSettingsService;Lcom/android/server/locksettings/SyntheticPasswordManager$AuthenticationToken;IJLjava/util/ArrayList;Landroid/app/admin/PasswordMetrics;I)V
 PLcom/android/server/locksettings/LockSettingsService;->access$300(Lcom/android/server/locksettings/LockSettingsService;I)V
 PLcom/android/server/locksettings/LockSettingsService;->access$400(Lcom/android/server/locksettings/LockSettingsService;I)V
 PLcom/android/server/locksettings/LockSettingsService;->access$400(Lcom/android/server/locksettings/LockSettingsService;Landroid/os/UserHandle;)V
@@ -20034,6 +21757,7 @@
 PLcom/android/server/locksettings/LockSettingsService;->doVerifyCredential(Lcom/android/internal/widget/LockscreenCredential;IJILcom/android/internal/widget/ICheckCredentialProgressCallback;)Lcom/android/internal/widget/VerifyCredentialResponse;
 HPLcom/android/server/locksettings/LockSettingsService;->doVerifyCredential(Lcom/android/internal/widget/LockscreenCredential;IJILcom/android/internal/widget/ICheckCredentialProgressCallback;Ljava/util/ArrayList;)Lcom/android/internal/widget/VerifyCredentialResponse;
 PLcom/android/server/locksettings/LockSettingsService;->dump(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V
+PLcom/android/server/locksettings/LockSettingsService;->enforceFrpResolved()V
 PLcom/android/server/locksettings/LockSettingsService;->ensureProfileKeystoreUnlocked(I)V
 PLcom/android/server/locksettings/LockSettingsService;->fixateNewestUserKeyAuth(I)V
 PLcom/android/server/locksettings/LockSettingsService;->gateKeeperClearSecureUserId(I)V
@@ -20078,6 +21802,7 @@
 PLcom/android/server/locksettings/LockSettingsService;->lambda$notifyPasswordChanged$2$LockSettingsService(I)V
 PLcom/android/server/locksettings/LockSettingsService;->lambda$notifySeparateProfileChallengeChanged$0(I)V
 HPLcom/android/server/locksettings/LockSettingsService;->lambda$unlockUser$1$LockSettingsService(Ljava/util/ArrayList;I)V
+PLcom/android/server/locksettings/LockSettingsService;->loadPasswordMetrics(Lcom/android/server/locksettings/SyntheticPasswordManager$AuthenticationToken;I)Landroid/app/admin/PasswordMetrics;
 HSPLcom/android/server/locksettings/LockSettingsService;->maybeShowEncryptionNotificationForUser(I)V
 HSPLcom/android/server/locksettings/LockSettingsService;->migrateOldData()V
 HSPLcom/android/server/locksettings/LockSettingsService;->migrateOldDataAfterSystemReady()V
@@ -20086,6 +21811,7 @@
 HPLcom/android/server/locksettings/LockSettingsService;->onAuthTokenKnownForUser(ILcom/android/server/locksettings/SyntheticPasswordManager$AuthenticationToken;)V
 PLcom/android/server/locksettings/LockSettingsService;->onCleanupUser(I)V
 HPLcom/android/server/locksettings/LockSettingsService;->onCredentialVerified(Lcom/android/server/locksettings/SyntheticPasswordManager$AuthenticationToken;IJLjava/util/ArrayList;I)V
+HPLcom/android/server/locksettings/LockSettingsService;->onCredentialVerified(Lcom/android/server/locksettings/SyntheticPasswordManager$AuthenticationToken;IJLjava/util/ArrayList;Landroid/app/admin/PasswordMetrics;I)V
 HSPLcom/android/server/locksettings/LockSettingsService;->onStartUser(I)V
 PLcom/android/server/locksettings/LockSettingsService;->onUnlockUser(I)V
 HSPLcom/android/server/locksettings/LockSettingsService;->pinOrPasswordQualityToCredentialType(I)I
@@ -20213,6 +21939,8 @@
 PLcom/android/server/locksettings/LockSettingsStorage;->removeUser(I)V
 PLcom/android/server/locksettings/LockSettingsStorage;->setBoolean(Ljava/lang/String;ZI)V
 HSPLcom/android/server/locksettings/LockSettingsStorage;->setDatabaseOnCreateCallback(Lcom/android/server/locksettings/LockSettingsStorage$Callback;)V
+PLcom/android/server/locksettings/LockSettingsStorage;->setInt(Ljava/lang/String;II)V
+PLcom/android/server/locksettings/LockSettingsStorage;->setLong(Ljava/lang/String;JI)V
 PLcom/android/server/locksettings/LockSettingsStorage;->setString(Ljava/lang/String;Ljava/lang/String;I)V
 PLcom/android/server/locksettings/LockSettingsStorage;->writeChildProfileLock(I[B)V
 PLcom/android/server/locksettings/LockSettingsStorage;->writeFile(Ljava/lang/String;[B)V
@@ -20262,6 +21990,7 @@
 HSPLcom/android/server/locksettings/ManagedProfilePasswordCache;-><clinit>()V
 HSPLcom/android/server/locksettings/ManagedProfilePasswordCache;-><init>(Ljava/security/KeyStore;Landroid/os/UserManager;)V
 PLcom/android/server/locksettings/ManagedProfilePasswordCache;->getEncryptionKeyName(I)Ljava/lang/String;
+PLcom/android/server/locksettings/ManagedProfilePasswordCache;->removePassword(I)V
 PLcom/android/server/locksettings/ManagedProfilePasswordCache;->retrievePassword(I)Lcom/android/internal/widget/LockscreenCredential;
 PLcom/android/server/locksettings/ManagedProfilePasswordCache;->storePassword(ILcom/android/internal/widget/LockscreenCredential;)V
 HSPLcom/android/server/locksettings/PasswordSlotManager;-><init>()V
@@ -20292,15 +22021,26 @@
 PLcom/android/server/locksettings/RebootEscrowKey;->fromKeyBytes([B)Lcom/android/server/locksettings/RebootEscrowKey;
 PLcom/android/server/locksettings/RebootEscrowKey;->generate()Lcom/android/server/locksettings/RebootEscrowKey;
 PLcom/android/server/locksettings/RebootEscrowKey;->getKey()Ljavax/crypto/SecretKey;
+PLcom/android/server/locksettings/RebootEscrowKey;->getKeyBytes()[B
 HSPLcom/android/server/locksettings/RebootEscrowManager$Injector;-><init>(Landroid/content/Context;)V
 PLcom/android/server/locksettings/RebootEscrowManager$Injector;->getBootCount()I
+PLcom/android/server/locksettings/RebootEscrowManager$Injector;->getEventLog()Lcom/android/server/locksettings/RebootEscrowManager$RebootEscrowEventLog;
 PLcom/android/server/locksettings/RebootEscrowManager$Injector;->getRebootEscrow()Landroid/hardware/rebootescrow/IRebootEscrow;
 HSPLcom/android/server/locksettings/RebootEscrowManager$Injector;->getUserManager()Landroid/os/UserManager;
 PLcom/android/server/locksettings/RebootEscrowManager$Injector;->reportMetric(Z)V
+PLcom/android/server/locksettings/RebootEscrowManager$RebootEscrowEvent;-><init>(I)V
+PLcom/android/server/locksettings/RebootEscrowManager$RebootEscrowEvent;-><init>(ILjava/lang/Integer;)V
+PLcom/android/server/locksettings/RebootEscrowManager$RebootEscrowEventLog;-><init>()V
+PLcom/android/server/locksettings/RebootEscrowManager$RebootEscrowEventLog;->addEntry(I)V
+PLcom/android/server/locksettings/RebootEscrowManager$RebootEscrowEventLog;->addEntry(II)V
+PLcom/android/server/locksettings/RebootEscrowManager$RebootEscrowEventLog;->addEntryInternal(Lcom/android/server/locksettings/RebootEscrowManager$RebootEscrowEvent;)V
+PLcom/android/server/locksettings/RebootEscrowManager$RebootEscrowEventLog;->dump(Lcom/android/internal/util/IndentingPrintWriter;)V
 HSPLcom/android/server/locksettings/RebootEscrowManager;-><init>(Landroid/content/Context;Lcom/android/server/locksettings/RebootEscrowManager$Callbacks;Lcom/android/server/locksettings/LockSettingsStorage;)V
 HSPLcom/android/server/locksettings/RebootEscrowManager;-><init>(Lcom/android/server/locksettings/RebootEscrowManager$Injector;Lcom/android/server/locksettings/RebootEscrowManager$Callbacks;Lcom/android/server/locksettings/LockSettingsStorage;)V
+PLcom/android/server/locksettings/RebootEscrowManager;->armRebootEscrowIfNeeded()Z
 PLcom/android/server/locksettings/RebootEscrowManager;->callToRebootEscrowIfNeeded(IB[B)V
 PLcom/android/server/locksettings/RebootEscrowManager;->clearRebootEscrowIfNeeded()V
+PLcom/android/server/locksettings/RebootEscrowManager;->dump(Lcom/android/internal/util/IndentingPrintWriter;)V
 PLcom/android/server/locksettings/RebootEscrowManager;->generateEscrowKeyIfNeeded()Lcom/android/server/locksettings/RebootEscrowKey;
 PLcom/android/server/locksettings/RebootEscrowManager;->getAndClearRebootEscrowKey()Lcom/android/server/locksettings/RebootEscrowKey;
 PLcom/android/server/locksettings/RebootEscrowManager;->getAndClearRebootEscrowKey()Ljavax/crypto/spec/SecretKeySpec;
@@ -20328,11 +22068,14 @@
 HPLcom/android/server/locksettings/SyntheticPasswordManager$AuthenticationToken;-><init>(B)V
 PLcom/android/server/locksettings/SyntheticPasswordManager$AuthenticationToken;->access$1000(Lcom/android/server/locksettings/SyntheticPasswordManager$AuthenticationToken;)[B
 PLcom/android/server/locksettings/SyntheticPasswordManager$AuthenticationToken;->access$1100(Lcom/android/server/locksettings/SyntheticPasswordManager$AuthenticationToken;)B
+PLcom/android/server/locksettings/SyntheticPasswordManager$AuthenticationToken;->access$1100(Lcom/android/server/locksettings/SyntheticPasswordManager$AuthenticationToken;)[B
+PLcom/android/server/locksettings/SyntheticPasswordManager$AuthenticationToken;->access$1200(Lcom/android/server/locksettings/SyntheticPasswordManager$AuthenticationToken;)B
 PLcom/android/server/locksettings/SyntheticPasswordManager$AuthenticationToken;->access$900(Lcom/android/server/locksettings/SyntheticPasswordManager$AuthenticationToken;)[B
 PLcom/android/server/locksettings/SyntheticPasswordManager$AuthenticationToken;->create()Lcom/android/server/locksettings/SyntheticPasswordManager$AuthenticationToken;
 PLcom/android/server/locksettings/SyntheticPasswordManager$AuthenticationToken;->deriveDiskEncryptionKey()[B
 PLcom/android/server/locksettings/SyntheticPasswordManager$AuthenticationToken;->deriveGkPassword()[B
 PLcom/android/server/locksettings/SyntheticPasswordManager$AuthenticationToken;->deriveKeyStorePassword()[B
+PLcom/android/server/locksettings/SyntheticPasswordManager$AuthenticationToken;->deriveMetricsKey()[B
 HPLcom/android/server/locksettings/SyntheticPasswordManager$AuthenticationToken;->derivePassword([B)[B
 PLcom/android/server/locksettings/SyntheticPasswordManager$AuthenticationToken;->derivePasswordHashFactor()[B
 PLcom/android/server/locksettings/SyntheticPasswordManager$AuthenticationToken;->deriveVendorAuthSecret()[B
@@ -20358,12 +22101,14 @@
 PLcom/android/server/locksettings/SyntheticPasswordManager;->access$600()[B
 PLcom/android/server/locksettings/SyntheticPasswordManager;->access$700()[B
 PLcom/android/server/locksettings/SyntheticPasswordManager;->access$800()[B
+PLcom/android/server/locksettings/SyntheticPasswordManager;->access$900()[B
 PLcom/android/server/locksettings/SyntheticPasswordManager;->activateTokenBasedSyntheticPassword(JLcom/android/server/locksettings/SyntheticPasswordManager$AuthenticationToken;I)Z
 HPLcom/android/server/locksettings/SyntheticPasswordManager;->bytesToHex([B)[B
 PLcom/android/server/locksettings/SyntheticPasswordManager;->clearSidForUser(I)V
 PLcom/android/server/locksettings/SyntheticPasswordManager;->computePasswordToken(Lcom/android/internal/widget/LockscreenCredential;Lcom/android/server/locksettings/SyntheticPasswordManager$PasswordData;)[B
 PLcom/android/server/locksettings/SyntheticPasswordManager;->createPasswordBasedSyntheticPassword(Landroid/service/gatekeeper/IGateKeeperService;Lcom/android/internal/widget/LockscreenCredential;Lcom/android/server/locksettings/SyntheticPasswordManager$AuthenticationToken;I)J
 PLcom/android/server/locksettings/SyntheticPasswordManager;->createSPBlob(Ljava/lang/String;[B[BJ)[B
+PLcom/android/server/locksettings/SyntheticPasswordManager;->createSecdiscardable(JI)[B
 PLcom/android/server/locksettings/SyntheticPasswordManager;->createSyntheticPasswordBlob(JBLcom/android/server/locksettings/SyntheticPasswordManager$AuthenticationToken;[BJI)V
 PLcom/android/server/locksettings/SyntheticPasswordManager;->createTokenBasedSyntheticPassword([BILcom/android/internal/widget/LockPatternUtils$EscrowTokenStateChangeCallback;)J
 PLcom/android/server/locksettings/SyntheticPasswordManager;->decryptSPBlob(Ljava/lang/String;[B[B)[B
@@ -20380,10 +22125,12 @@
 HSPLcom/android/server/locksettings/SyntheticPasswordManager;->getCredentialType(JI)I
 HPLcom/android/server/locksettings/SyntheticPasswordManager;->getHandleName(J)Ljava/lang/String;
 PLcom/android/server/locksettings/SyntheticPasswordManager;->getNextAvailableWeaverSlot()I
+PLcom/android/server/locksettings/SyntheticPasswordManager;->getPasswordMetrics(Lcom/android/server/locksettings/SyntheticPasswordManager$AuthenticationToken;JI)Landroid/app/admin/PasswordMetrics;
 HPLcom/android/server/locksettings/SyntheticPasswordManager;->getPendingTokensForUser(I)Ljava/util/Set;
 HSPLcom/android/server/locksettings/SyntheticPasswordManager;->getUsedWeaverSlots()Ljava/util/Set;
 HSPLcom/android/server/locksettings/SyntheticPasswordManager;->getWeaverService()Landroid/hardware/weaver/V1_0/IWeaver;
 PLcom/android/server/locksettings/SyntheticPasswordManager;->hasEscrowData(I)Z
+PLcom/android/server/locksettings/SyntheticPasswordManager;->hasPasswordMetrics(JI)Z
 PLcom/android/server/locksettings/SyntheticPasswordManager;->hasSidForUser(I)Z
 PLcom/android/server/locksettings/SyntheticPasswordManager;->hasState(Ljava/lang/String;JI)Z
 HSPLcom/android/server/locksettings/SyntheticPasswordManager;->initWeaverService()V
@@ -20401,6 +22148,7 @@
 HPLcom/android/server/locksettings/SyntheticPasswordManager;->passwordTokenToWeaverKey([B)[B
 PLcom/android/server/locksettings/SyntheticPasswordManager;->removeUser(I)V
 PLcom/android/server/locksettings/SyntheticPasswordManager;->saveEscrowData(Lcom/android/server/locksettings/SyntheticPasswordManager$AuthenticationToken;I)V
+PLcom/android/server/locksettings/SyntheticPasswordManager;->savePasswordMetrics(Lcom/android/internal/widget/LockscreenCredential;Lcom/android/server/locksettings/SyntheticPasswordManager$AuthenticationToken;JI)V
 PLcom/android/server/locksettings/SyntheticPasswordManager;->saveSecdiscardable(J[BI)V
 PLcom/android/server/locksettings/SyntheticPasswordManager;->saveState(Ljava/lang/String;[BJI)V
 PLcom/android/server/locksettings/SyntheticPasswordManager;->saveSyntheticPasswordHandle([BI)V
@@ -20408,6 +22156,7 @@
 PLcom/android/server/locksettings/SyntheticPasswordManager;->scrypt([B[BIIII)[B
 PLcom/android/server/locksettings/SyntheticPasswordManager;->secureRandom(I)[B
 PLcom/android/server/locksettings/SyntheticPasswordManager;->sidFromPasswordHandle([B)J
+PLcom/android/server/locksettings/SyntheticPasswordManager;->synchronizeFrpPassword(Lcom/android/server/locksettings/SyntheticPasswordManager$PasswordData;II)V
 PLcom/android/server/locksettings/SyntheticPasswordManager;->synchronizeWeaverFrpPassword(Lcom/android/server/locksettings/SyntheticPasswordManager$PasswordData;III)V
 HPLcom/android/server/locksettings/SyntheticPasswordManager;->toByteArrayList([B)Ljava/util/ArrayList;
 PLcom/android/server/locksettings/SyntheticPasswordManager;->transformUnderSecdiscardable([B[B)[B
@@ -20417,6 +22166,11 @@
 HPLcom/android/server/locksettings/SyntheticPasswordManager;->verifyChallenge(Landroid/service/gatekeeper/IGateKeeperService;Lcom/android/server/locksettings/SyntheticPasswordManager$AuthenticationToken;JI)Lcom/android/internal/widget/VerifyCredentialResponse;
 PLcom/android/server/locksettings/SyntheticPasswordManager;->weaverEnroll(I[B[B)[B
 HPLcom/android/server/locksettings/SyntheticPasswordManager;->weaverVerify(I[B)Lcom/android/internal/widget/VerifyCredentialResponse;
+PLcom/android/server/locksettings/VersionedPasswordMetrics;-><init>(ILandroid/app/admin/PasswordMetrics;)V
+PLcom/android/server/locksettings/VersionedPasswordMetrics;-><init>(Lcom/android/internal/widget/LockscreenCredential;)V
+PLcom/android/server/locksettings/VersionedPasswordMetrics;->deserialize([B)Lcom/android/server/locksettings/VersionedPasswordMetrics;
+PLcom/android/server/locksettings/VersionedPasswordMetrics;->getMetrics()Landroid/app/admin/PasswordMetrics;
+PLcom/android/server/locksettings/VersionedPasswordMetrics;->serialize()[B
 HSPLcom/android/server/locksettings/recoverablekeystore/KeyStoreProxyImpl;-><init>(Ljava/security/KeyStore;)V
 PLcom/android/server/locksettings/recoverablekeystore/KeyStoreProxyImpl;->containsAlias(Ljava/lang/String;)Z
 PLcom/android/server/locksettings/recoverablekeystore/KeyStoreProxyImpl;->deleteEntry(Ljava/lang/String;)V
@@ -20654,6 +22408,12 @@
 PLcom/android/server/media/-$$Lambda$MediaRouter2ServiceImpl$2c6CORJRuTfbQQXKlkZCv-9MgyE;-><clinit>()V
 PLcom/android/server/media/-$$Lambda$MediaRouter2ServiceImpl$2c6CORJRuTfbQQXKlkZCv-9MgyE;-><init>()V
 PLcom/android/server/media/-$$Lambda$MediaRouter2ServiceImpl$2c6CORJRuTfbQQXKlkZCv-9MgyE;->accept(Ljava/lang/Object;)V
+PLcom/android/server/media/-$$Lambda$MediaRouter2ServiceImpl$6Riyrjlduscvk3ao_6ULVEacHqc;-><clinit>()V
+PLcom/android/server/media/-$$Lambda$MediaRouter2ServiceImpl$6Riyrjlduscvk3ao_6ULVEacHqc;-><init>()V
+PLcom/android/server/media/-$$Lambda$MediaRouter2ServiceImpl$6Riyrjlduscvk3ao_6ULVEacHqc;->accept(Ljava/lang/Object;)V
+PLcom/android/server/media/-$$Lambda$MediaRouter2ServiceImpl$I6PG0tyHOe6cuySMRkSmv3IvGEc;-><clinit>()V
+PLcom/android/server/media/-$$Lambda$MediaRouter2ServiceImpl$I6PG0tyHOe6cuySMRkSmv3IvGEc;-><init>()V
+PLcom/android/server/media/-$$Lambda$MediaRouter2ServiceImpl$I6PG0tyHOe6cuySMRkSmv3IvGEc;->accept(Ljava/lang/Object;Ljava/lang/Object;)V
 PLcom/android/server/media/-$$Lambda$MediaRouter2ServiceImpl$M94FQn7LGXpV3kApGJU9Bnp0RRk;-><clinit>()V
 PLcom/android/server/media/-$$Lambda$MediaRouter2ServiceImpl$M94FQn7LGXpV3kApGJU9Bnp0RRk;-><init>()V
 PLcom/android/server/media/-$$Lambda$MediaRouter2ServiceImpl$M94FQn7LGXpV3kApGJU9Bnp0RRk;->accept(Ljava/lang/Object;)V
@@ -20675,9 +22435,18 @@
 PLcom/android/server/media/-$$Lambda$MediaRouter2ServiceImpl$UyhtmNkwYd0IQ4t6m6ItWaQAFKI;-><clinit>()V
 PLcom/android/server/media/-$$Lambda$MediaRouter2ServiceImpl$UyhtmNkwYd0IQ4t6m6ItWaQAFKI;-><init>()V
 PLcom/android/server/media/-$$Lambda$MediaRouter2ServiceImpl$UyhtmNkwYd0IQ4t6m6ItWaQAFKI;->accept(Ljava/lang/Object;)V
+PLcom/android/server/media/-$$Lambda$MediaRouter2ServiceImpl$jl6Cb2fSdGROvf9jFJQIh03S_cI;-><clinit>()V
+PLcom/android/server/media/-$$Lambda$MediaRouter2ServiceImpl$jl6Cb2fSdGROvf9jFJQIh03S_cI;-><init>()V
+PLcom/android/server/media/-$$Lambda$MediaRouter2ServiceImpl$jl6Cb2fSdGROvf9jFJQIh03S_cI;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
 PLcom/android/server/media/-$$Lambda$MediaRouter2ServiceImpl$ktFKfbGb3mjvGzJIZxyEZjYDR3w;-><clinit>()V
 PLcom/android/server/media/-$$Lambda$MediaRouter2ServiceImpl$ktFKfbGb3mjvGzJIZxyEZjYDR3w;-><init>()V
 PLcom/android/server/media/-$$Lambda$MediaRouter2ServiceImpl$ktFKfbGb3mjvGzJIZxyEZjYDR3w;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/media/-$$Lambda$MediaRouter2ServiceImpl$poZa1tCE-HePySN-6FoQ8LldyOI;-><clinit>()V
+PLcom/android/server/media/-$$Lambda$MediaRouter2ServiceImpl$poZa1tCE-HePySN-6FoQ8LldyOI;-><init>()V
+PLcom/android/server/media/-$$Lambda$MediaRouter2ServiceImpl$poZa1tCE-HePySN-6FoQ8LldyOI;->accept(Ljava/lang/Object;)V
+PLcom/android/server/media/-$$Lambda$MediaRouter2ServiceImpl$xwrgJ0QIcy6O_xCDFBt_XQNI5DY;-><clinit>()V
+PLcom/android/server/media/-$$Lambda$MediaRouter2ServiceImpl$xwrgJ0QIcy6O_xCDFBt_XQNI5DY;-><init>()V
+PLcom/android/server/media/-$$Lambda$MediaRouter2ServiceImpl$xwrgJ0QIcy6O_xCDFBt_XQNI5DY;->accept(Ljava/lang/Object;)V
 HSPLcom/android/server/media/-$$Lambda$MediaSessionService$za_9dlUSlnaiZw6eCdPVEZq0XLw;-><init>(Lcom/android/server/media/MediaSessionService;)V
 HPLcom/android/server/media/-$$Lambda$MediaSessionService$za_9dlUSlnaiZw6eCdPVEZq0XLw;->onAudioPlayerActiveStateChanged(Landroid/media/AudioPlaybackConfiguration;Z)V
 PLcom/android/server/media/-$$Lambda$SystemMediaRoute2Provider$1$ebcdsGsKcvePyBmWcsYxnmypK0U;-><init>(Lcom/android/server/media/SystemMediaRoute2Provider$1;Landroid/media/AudioRoutesInfo;)V
@@ -20750,7 +22519,9 @@
 PLcom/android/server/media/BluetoothRouteProvider;->notifyBluetoothRoutesUpdated()V
 PLcom/android/server/media/BluetoothRouteProvider;->setRouteConnectionState(Lcom/android/server/media/BluetoothRouteProvider$BluetoothRouteInfo;I)V
 PLcom/android/server/media/BluetoothRouteProvider;->setRouteConnectionStateForDevice(Landroid/bluetooth/BluetoothDevice;I)V
-PLcom/android/server/media/BluetoothRouteProvider;->setSelectedRouteVolume(I)Z
+HPLcom/android/server/media/BluetoothRouteProvider;->setSelectedRouteVolume(I)Z
+PLcom/android/server/media/BluetoothRouteProvider;->start()V
+PLcom/android/server/media/BluetoothRouteProvider;->transferTo(Ljava/lang/String;)V
 HSPLcom/android/server/media/MediaButtonReceiverHolder;-><init>(ILandroid/app/PendingIntent;Landroid/content/ComponentName;I)V
 HPLcom/android/server/media/MediaButtonReceiverHolder;->create(Landroid/content/Context;ILandroid/app/PendingIntent;)Lcom/android/server/media/MediaButtonReceiverHolder;
 HPLcom/android/server/media/MediaButtonReceiverHolder;->flattenToString()Ljava/lang/String;
@@ -20785,6 +22556,8 @@
 PLcom/android/server/media/MediaRoute2ProviderWatcher;->access$100(Lcom/android/server/media/MediaRoute2ProviderWatcher;)V
 HPLcom/android/server/media/MediaRoute2ProviderWatcher;->scanPackages()V
 PLcom/android/server/media/MediaRoute2ProviderWatcher;->start()V
+PLcom/android/server/media/MediaRoute2ProviderWatcher;->stop()V
+PLcom/android/server/media/MediaRouter2ServiceImpl$ManagerRecord;-><init>(Lcom/android/server/media/MediaRouter2ServiceImpl;Lcom/android/server/media/MediaRouter2ServiceImpl$UserRecord;Landroid/media/IMediaRouter2Manager;IILjava/lang/String;)V
 PLcom/android/server/media/MediaRouter2ServiceImpl$ManagerRecord;-><init>(Lcom/android/server/media/MediaRouter2ServiceImpl;Lcom/android/server/media/MediaRouter2ServiceImpl$UserRecord;Landroid/media/IMediaRouter2Manager;IILjava/lang/String;Z)V
 PLcom/android/server/media/MediaRouter2ServiceImpl$ManagerRecord;->binderDied()V
 PLcom/android/server/media/MediaRouter2ServiceImpl$ManagerRecord;->dispose()V
@@ -20793,14 +22566,19 @@
 PLcom/android/server/media/MediaRouter2ServiceImpl$UserHandler;->access$1100(Lcom/android/server/media/MediaRouter2ServiceImpl$UserHandler;Landroid/media/IMediaRouter2Manager;)V
 PLcom/android/server/media/MediaRouter2ServiceImpl$UserHandler;->access$1200(Lcom/android/server/media/MediaRouter2ServiceImpl$UserHandler;Landroid/media/IMediaRouter2Manager;)V
 PLcom/android/server/media/MediaRouter2ServiceImpl$UserHandler;->access$1300(Lcom/android/server/media/MediaRouter2ServiceImpl$UserHandler;Landroid/media/IMediaRouter2Manager;)V
+PLcom/android/server/media/MediaRouter2ServiceImpl$UserHandler;->access$1600(Lcom/android/server/media/MediaRouter2ServiceImpl$UserHandler;)V
 PLcom/android/server/media/MediaRouter2ServiceImpl$UserHandler;->access$400(Lcom/android/server/media/MediaRouter2ServiceImpl$UserHandler;)V
 PLcom/android/server/media/MediaRouter2ServiceImpl$UserHandler;->access$500(Lcom/android/server/media/MediaRouter2ServiceImpl$UserHandler;Lcom/android/server/media/MediaRouter2ServiceImpl$Client2Record;Ljava/lang/String;Landroid/media/MediaRoute2Info;)V
+PLcom/android/server/media/MediaRouter2ServiceImpl$UserHandler;->access$700(Lcom/android/server/media/MediaRouter2ServiceImpl$UserHandler;JLcom/android/server/media/MediaRouter2ServiceImpl$RouterRecord;Ljava/lang/String;Landroid/media/MediaRoute2Info;)V
 PLcom/android/server/media/MediaRouter2ServiceImpl$UserHandler;->access$800(Lcom/android/server/media/MediaRouter2ServiceImpl$UserHandler;)V
 PLcom/android/server/media/MediaRouter2ServiceImpl$UserHandler;->access$800(Lcom/android/server/media/MediaRouter2ServiceImpl$UserHandler;Landroid/media/IMediaRouter2Manager;)V
 PLcom/android/server/media/MediaRouter2ServiceImpl$UserHandler;->checkArgumentsForSessionControl(Lcom/android/server/media/MediaRouter2ServiceImpl$Client2Record;Ljava/lang/String;Landroid/media/MediaRoute2Info;Ljava/lang/String;)Z
+PLcom/android/server/media/MediaRouter2ServiceImpl$UserHandler;->checkArgumentsForSessionControl(Lcom/android/server/media/MediaRouter2ServiceImpl$RouterRecord;Ljava/lang/String;Landroid/media/MediaRoute2Info;Ljava/lang/String;)Z
 PLcom/android/server/media/MediaRouter2ServiceImpl$UserHandler;->findClientforSessionLocked(Ljava/lang/String;)Lcom/android/server/media/MediaRouter2ServiceImpl$Client2Record;
 PLcom/android/server/media/MediaRouter2ServiceImpl$UserHandler;->findProvider(Ljava/lang/String;)Lcom/android/server/media/MediaRoute2Provider;
+PLcom/android/server/media/MediaRouter2ServiceImpl$UserHandler;->findRouterforSessionLocked(Ljava/lang/String;)Lcom/android/server/media/MediaRouter2ServiceImpl$RouterRecord;
 HPLcom/android/server/media/MediaRouter2ServiceImpl$UserHandler;->getClients()Ljava/util/List;
+HPLcom/android/server/media/MediaRouter2ServiceImpl$UserHandler;->getLastProviderInfoIndex(Ljava/lang/String;)I
 HPLcom/android/server/media/MediaRouter2ServiceImpl$UserHandler;->getManagers()Ljava/util/List;
 HPLcom/android/server/media/MediaRouter2ServiceImpl$UserHandler;->getProviderInfoIndex(Ljava/lang/String;)I
 HPLcom/android/server/media/MediaRouter2ServiceImpl$UserHandler;->getRouters()Ljava/util/List;
@@ -20826,6 +22604,8 @@
 PLcom/android/server/media/MediaRouter2ServiceImpl$UserHandler;->onSessionInfoChangedOnHandler(Lcom/android/server/media/MediaRoute2Provider;Landroid/media/RoutingSessionInfo;)V
 PLcom/android/server/media/MediaRouter2ServiceImpl$UserHandler;->onSessionUpdated(Lcom/android/server/media/MediaRoute2Provider;Landroid/media/RoutingSessionInfo;)V
 PLcom/android/server/media/MediaRouter2ServiceImpl$UserHandler;->start()V
+PLcom/android/server/media/MediaRouter2ServiceImpl$UserHandler;->stop()V
+PLcom/android/server/media/MediaRouter2ServiceImpl$UserHandler;->transferToRouteOnHandler(JLcom/android/server/media/MediaRouter2ServiceImpl$RouterRecord;Ljava/lang/String;Landroid/media/MediaRoute2Info;)V
 PLcom/android/server/media/MediaRouter2ServiceImpl$UserHandler;->transferToRouteOnHandler(Lcom/android/server/media/MediaRouter2ServiceImpl$Client2Record;Ljava/lang/String;Landroid/media/MediaRoute2Info;)V
 PLcom/android/server/media/MediaRouter2ServiceImpl$UserRecord;-><init>(Lcom/android/server/media/MediaRouter2ServiceImpl;I)V
 HSPLcom/android/server/media/MediaRouter2ServiceImpl;-><clinit>()V
@@ -20839,14 +22619,23 @@
 PLcom/android/server/media/MediaRouter2ServiceImpl;->lambda$getOrCreateUserRecordLocked$15(Ljava/lang/Object;)V
 PLcom/android/server/media/MediaRouter2ServiceImpl;->lambda$getOrCreateUserRecordLocked$16(Ljava/lang/Object;)V
 PLcom/android/server/media/MediaRouter2ServiceImpl;->lambda$getOrCreateUserRecordLocked$21(Ljava/lang/Object;)V
+PLcom/android/server/media/MediaRouter2ServiceImpl;->lambda$getOrCreateUserRecordLocked$22(Ljava/lang/Object;)V
 PLcom/android/server/media/MediaRouter2ServiceImpl;->lambda$registerManagerLocked$12(Ljava/lang/Object;Landroid/media/IMediaRouter2Manager;)V
+PLcom/android/server/media/MediaRouter2ServiceImpl;->lambda$registerManagerLocked$13(Ljava/lang/Object;Landroid/media/IMediaRouter2Manager;)V
+PLcom/android/server/media/MediaRouter2ServiceImpl;->lambda$switchUser$0(Ljava/lang/Object;)V
+PLcom/android/server/media/MediaRouter2ServiceImpl;->lambda$switchUser$1(Ljava/lang/Object;)V
 PLcom/android/server/media/MediaRouter2ServiceImpl;->lambda$transferClientRouteLocked$18(Ljava/lang/Object;Lcom/android/server/media/MediaRouter2ServiceImpl$Client2Record;Ljava/lang/String;Landroid/media/MediaRoute2Info;)V
+PLcom/android/server/media/MediaRouter2ServiceImpl;->lambda$transferToRouteWithManagerLocked$18(Ljava/lang/Object;JLcom/android/server/media/MediaRouter2ServiceImpl$RouterRecord;Ljava/lang/String;Landroid/media/MediaRoute2Info;)V
 PLcom/android/server/media/MediaRouter2ServiceImpl;->managerDied(Lcom/android/server/media/MediaRouter2ServiceImpl$ManagerRecord;)V
 PLcom/android/server/media/MediaRouter2ServiceImpl;->registerManager(Landroid/media/IMediaRouter2Manager;Ljava/lang/String;)V
+PLcom/android/server/media/MediaRouter2ServiceImpl;->registerManagerLocked(Landroid/media/IMediaRouter2Manager;IILjava/lang/String;I)V
 PLcom/android/server/media/MediaRouter2ServiceImpl;->registerManagerLocked(Landroid/media/IMediaRouter2Manager;IILjava/lang/String;IZ)V
 HSPLcom/android/server/media/MediaRouter2ServiceImpl;->switchUser()V
+PLcom/android/server/media/MediaRouter2ServiceImpl;->toUniqueRequestId(II)J
 PLcom/android/server/media/MediaRouter2ServiceImpl;->transferClientRouteLocked(Landroid/media/IMediaRouter2Manager;Ljava/lang/String;Landroid/media/MediaRoute2Info;)V
 PLcom/android/server/media/MediaRouter2ServiceImpl;->transferToClientRoute(Landroid/media/IMediaRouter2Manager;Ljava/lang/String;Landroid/media/MediaRoute2Info;)V
+PLcom/android/server/media/MediaRouter2ServiceImpl;->transferToRouteWithManager(Landroid/media/IMediaRouter2Manager;ILjava/lang/String;Landroid/media/MediaRoute2Info;)V
+PLcom/android/server/media/MediaRouter2ServiceImpl;->transferToRouteWithManagerLocked(ILandroid/media/IMediaRouter2Manager;Ljava/lang/String;Landroid/media/MediaRoute2Info;)V
 PLcom/android/server/media/MediaRouter2ServiceImpl;->unregisterManager(Landroid/media/IMediaRouter2Manager;)V
 PLcom/android/server/media/MediaRouter2ServiceImpl;->unregisterManagerLocked(Landroid/media/IMediaRouter2Manager;Z)V
 HSPLcom/android/server/media/MediaRouterService$1$1;-><init>(Lcom/android/server/media/MediaRouterService$1;)V
@@ -20958,6 +22747,7 @@
 HSPLcom/android/server/media/MediaRouterService;->switchUser()V
 HSPLcom/android/server/media/MediaRouterService;->systemRunning()V
 PLcom/android/server/media/MediaRouterService;->transferToClientRoute(Landroid/media/IMediaRouter2Manager;Ljava/lang/String;Landroid/media/MediaRoute2Info;)V
+PLcom/android/server/media/MediaRouterService;->transferToRouteWithManager(Landroid/media/IMediaRouter2Manager;ILjava/lang/String;Landroid/media/MediaRoute2Info;)V
 PLcom/android/server/media/MediaRouterService;->unregisterClient(Landroid/media/IMediaRouterClient;)V
 HPLcom/android/server/media/MediaRouterService;->unregisterClientLocked(Landroid/media/IMediaRouterClient;Z)V
 PLcom/android/server/media/MediaRouterService;->unregisterManager(Landroid/media/IMediaRouter2Manager;)V
@@ -20999,7 +22789,7 @@
 PLcom/android/server/media/MediaSessionRecord$ControllerStub;->stop(Ljava/lang/String;)V
 HPLcom/android/server/media/MediaSessionRecord$ControllerStub;->unregisterCallback(Landroid/media/session/ISessionControllerCallback;)V
 HPLcom/android/server/media/MediaSessionRecord$ISessionControllerCallbackHolder;-><init>(Lcom/android/server/media/MediaSessionRecord;Landroid/media/session/ISessionControllerCallback;Ljava/lang/String;I)V
-PLcom/android/server/media/MediaSessionRecord$ISessionControllerCallbackHolder;->access$300(Lcom/android/server/media/MediaSessionRecord$ISessionControllerCallbackHolder;)Ljava/lang/String;
+HPLcom/android/server/media/MediaSessionRecord$ISessionControllerCallbackHolder;->access$300(Lcom/android/server/media/MediaSessionRecord$ISessionControllerCallbackHolder;)Ljava/lang/String;
 HPLcom/android/server/media/MediaSessionRecord$ISessionControllerCallbackHolder;->access$400(Lcom/android/server/media/MediaSessionRecord$ISessionControllerCallbackHolder;)Landroid/media/session/ISessionControllerCallback;
 HSPLcom/android/server/media/MediaSessionRecord$MessageHandler;-><init>(Lcom/android/server/media/MediaSessionRecord;Landroid/os/Looper;)V
 HSPLcom/android/server/media/MediaSessionRecord$MessageHandler;->handleMessage(Landroid/os/Message;)V
@@ -21228,7 +23018,7 @@
 HPLcom/android/server/media/MediaSessionRecord;->pushExtrasUpdate()V
 HPLcom/android/server/media/MediaSessionRecord;->pushMetadataUpdate()V
 HPLcom/android/server/media/MediaSessionRecord;->pushPlaybackStateUpdate()V
-PLcom/android/server/media/MediaSessionRecord;->pushQueueTitleUpdate()V
+HPLcom/android/server/media/MediaSessionRecord;->pushQueueTitleUpdate()V
 HPLcom/android/server/media/MediaSessionRecord;->pushQueueUpdate()V
 HPLcom/android/server/media/MediaSessionRecord;->pushSessionDestroyed()V
 HPLcom/android/server/media/MediaSessionRecord;->pushVolumeUpdate()V
@@ -21428,8 +23218,9 @@
 HSPLcom/android/server/media/MediaSessionService;->access$4200(Lcom/android/server/media/MediaSessionService;Landroid/content/ComponentName;III)V
 HSPLcom/android/server/media/MediaSessionService;->access$4300(Lcom/android/server/media/MediaSessionService;Landroid/content/ComponentName;III)V
 PLcom/android/server/media/MediaSessionService;->access$4400(Lcom/android/server/media/MediaSessionService;)Landroid/media/AudioManagerInternal;
-PLcom/android/server/media/MediaSessionService;->access$4400(Lcom/android/server/media/MediaSessionService;Landroid/content/ComponentName;III)V
+HPLcom/android/server/media/MediaSessionService;->access$4400(Lcom/android/server/media/MediaSessionService;Landroid/content/ComponentName;III)V
 PLcom/android/server/media/MediaSessionService;->access$4500(Lcom/android/server/media/MediaSessionService;)Landroid/media/AudioManagerInternal;
+PLcom/android/server/media/MediaSessionService;->access$4600(Lcom/android/server/media/MediaSessionService;)Landroid/media/AudioManagerInternal;
 PLcom/android/server/media/MediaSessionService;->access$4700(Lcom/android/server/media/MediaSessionService;)Lcom/android/server/media/MediaKeyDispatcher;
 PLcom/android/server/media/MediaSessionService;->access$4900(Lcom/android/server/media/MediaSessionService;)Landroid/app/KeyguardManager;
 PLcom/android/server/media/MediaSessionService;->access$5000(Lcom/android/server/media/MediaSessionService;)Landroid/os/PowerManager$WakeLock;
@@ -21598,8 +23389,8 @@
 PLcom/android/server/media/SystemMediaRoute2Provider;->access$100(Lcom/android/server/media/SystemMediaRoute2Provider;)Landroid/os/Handler;
 PLcom/android/server/media/SystemMediaRoute2Provider;->access$100(Lcom/android/server/media/SystemMediaRoute2Provider;Landroid/media/AudioRoutesInfo;)V
 PLcom/android/server/media/SystemMediaRoute2Provider;->access$300(Lcom/android/server/media/SystemMediaRoute2Provider;)Lcom/android/server/media/BluetoothRouteProvider;
-PLcom/android/server/media/SystemMediaRoute2Provider;->access$300(Lcom/android/server/media/SystemMediaRoute2Provider;)Ljava/lang/String;
-PLcom/android/server/media/SystemMediaRoute2Provider;->access$400(Lcom/android/server/media/SystemMediaRoute2Provider;)Lcom/android/server/media/BluetoothRouteProvider;
+HPLcom/android/server/media/SystemMediaRoute2Provider;->access$300(Lcom/android/server/media/SystemMediaRoute2Provider;)Ljava/lang/String;
+HPLcom/android/server/media/SystemMediaRoute2Provider;->access$400(Lcom/android/server/media/SystemMediaRoute2Provider;)Lcom/android/server/media/BluetoothRouteProvider;
 PLcom/android/server/media/SystemMediaRoute2Provider;->initializeDefaultRoute()V
 PLcom/android/server/media/SystemMediaRoute2Provider;->initializeRoutes()V
 PLcom/android/server/media/SystemMediaRoute2Provider;->initializeSessionInfo()V
@@ -21607,12 +23398,15 @@
 PLcom/android/server/media/SystemMediaRoute2Provider;->lambda$new$0$SystemMediaRoute2Provider(Ljava/util/List;)V
 PLcom/android/server/media/SystemMediaRoute2Provider;->lambda$new$1$SystemMediaRoute2Provider()V
 PLcom/android/server/media/SystemMediaRoute2Provider;->notifySessionInfoUpdated()V
-PLcom/android/server/media/SystemMediaRoute2Provider;->publishProviderState()V
+HPLcom/android/server/media/SystemMediaRoute2Provider;->publishProviderState()V
 HPLcom/android/server/media/SystemMediaRoute2Provider;->publishRoutes()V
+PLcom/android/server/media/SystemMediaRoute2Provider;->transferToRoute(JLjava/lang/String;Ljava/lang/String;)V
 PLcom/android/server/media/SystemMediaRoute2Provider;->transferToRoute(Ljava/lang/String;Ljava/lang/String;)V
 PLcom/android/server/media/SystemMediaRoute2Provider;->updateAudioRoutes(Landroid/media/AudioRoutesInfo;)V
-PLcom/android/server/media/SystemMediaRoute2Provider;->updateDefaultRoute(Landroid/media/AudioRoutesInfo;)V
+HPLcom/android/server/media/SystemMediaRoute2Provider;->updateDefaultRoute(Landroid/media/AudioRoutesInfo;)V
+HPLcom/android/server/media/SystemMediaRoute2Provider;->updateDeviceRoute(Landroid/media/AudioRoutesInfo;)V
 HPLcom/android/server/media/SystemMediaRoute2Provider;->updateProviderState()V
+HPLcom/android/server/media/SystemMediaRoute2Provider;->updateSessionInfosIfNeeded()Z
 HPLcom/android/server/media/SystemMediaRoute2Provider;->updateSessionInfosIfNeededLocked()Z
 HSPLcom/android/server/media/projection/MediaProjectionManagerService$1;-><init>(Lcom/android/server/media/projection/MediaProjectionManagerService;)V
 HSPLcom/android/server/media/projection/MediaProjectionManagerService$1;->onForegroundActivitiesChanged(IIZ)V
@@ -21639,6 +23433,7 @@
 PLcom/android/server/media/projection/MediaProjectionManagerService$ClientStopCallback;-><init>(Landroid/media/projection/IMediaProjectionCallback;)V
 PLcom/android/server/media/projection/MediaProjectionManagerService$ClientStopCallback;->run()V
 PLcom/android/server/media/projection/MediaProjectionManagerService$MediaProjection$1;-><init>(Lcom/android/server/media/projection/MediaProjectionManagerService$MediaProjection;Landroid/media/projection/IMediaProjectionCallback;)V
+PLcom/android/server/media/projection/MediaProjectionManagerService$MediaProjection$1;->binderDied()V
 PLcom/android/server/media/projection/MediaProjectionManagerService$MediaProjection;-><init>(Lcom/android/server/media/projection/MediaProjectionManagerService;IILjava/lang/String;IZ)V
 PLcom/android/server/media/projection/MediaProjectionManagerService$MediaProjection;->applyVirtualDisplayFlags(I)I
 PLcom/android/server/media/projection/MediaProjectionManagerService$MediaProjection;->canProjectSecureVideo()Z
@@ -21719,7 +23514,7 @@
 HPLcom/android/server/net/-$$Lambda$NetworkStatsService$KVH4Y9nH53_gEfrhunDFp_O6ExY;->accept(Ljava/lang/Object;)V
 HPLcom/android/server/net/-$$Lambda$NetworkStatsService$NetworkStatsManagerInternalImpl$5TwpV7cRVx_8Ch3sTJ1XxcGYaFo;-><init>(Ljava/lang/String;J)V
 HPLcom/android/server/net/-$$Lambda$NetworkStatsService$NetworkStatsManagerInternalImpl$5TwpV7cRVx_8Ch3sTJ1XxcGYaFo;->accept(Ljava/lang/Object;)V
-PLcom/android/server/net/-$$Lambda$NetworkStatsService$NetworkStatsManagerInternalImpl$MWLBRMSsUTWVuMm3yJqH7bc-ZoI;-><init>(Ljava/lang/String;J)V
+HPLcom/android/server/net/-$$Lambda$NetworkStatsService$NetworkStatsManagerInternalImpl$MWLBRMSsUTWVuMm3yJqH7bc-ZoI;-><init>(Ljava/lang/String;J)V
 HPLcom/android/server/net/-$$Lambda$NetworkStatsService$NetworkStatsManagerInternalImpl$MWLBRMSsUTWVuMm3yJqH7bc-ZoI;->accept(Ljava/lang/Object;)V
 HSPLcom/android/server/net/-$$Lambda$NetworkStatsService$rLCnfQluyJtbXZ2vSn6SQAdNPMc;-><init>(Landroid/net/NetworkStats;I)V
 HPLcom/android/server/net/-$$Lambda$NetworkStatsService$rLCnfQluyJtbXZ2vSn6SQAdNPMc;->accept(Ljava/lang/Object;)V
@@ -21911,7 +23706,7 @@
 HPLcom/android/server/net/NetworkPolicyManagerService;->access$3700(Lcom/android/server/net/NetworkPolicyManagerService;)Landroid/util/SparseBooleanArray;
 PLcom/android/server/net/NetworkPolicyManagerService;->access$3800(Lcom/android/server/net/NetworkPolicyManagerService;)Landroid/util/SparseBooleanArray;
 HPLcom/android/server/net/NetworkPolicyManagerService;->access$3800(Lcom/android/server/net/NetworkPolicyManagerService;I)V
-PLcom/android/server/net/NetworkPolicyManagerService;->access$3900(Lcom/android/server/net/NetworkPolicyManagerService;I)V
+HPLcom/android/server/net/NetworkPolicyManagerService;->access$3900(Lcom/android/server/net/NetworkPolicyManagerService;I)V
 HPLcom/android/server/net/NetworkPolicyManagerService;->access$3900(Lcom/android/server/net/NetworkPolicyManagerService;Landroid/net/Network;)I
 HPLcom/android/server/net/NetworkPolicyManagerService;->access$400(Lcom/android/server/net/NetworkPolicyManagerService;)V
 HPLcom/android/server/net/NetworkPolicyManagerService;->access$4000(Lcom/android/server/net/NetworkPolicyManagerService;I)Landroid/telephony/SubscriptionPlan;
@@ -21926,6 +23721,7 @@
 PLcom/android/server/net/NetworkPolicyManagerService;->access$600(Lcom/android/server/net/NetworkPolicyManagerService;I)V
 PLcom/android/server/net/NetworkPolicyManagerService;->access$700(Lcom/android/server/net/NetworkPolicyManagerService;I)V
 PLcom/android/server/net/NetworkPolicyManagerService;->access$800(Lcom/android/server/net/NetworkPolicyManagerService;)Landroid/util/SparseArray;
+PLcom/android/server/net/NetworkPolicyManagerService;->access$800(Lcom/android/server/net/NetworkPolicyManagerService;I)V
 PLcom/android/server/net/NetworkPolicyManagerService;->access$900(Lcom/android/server/net/NetworkPolicyManagerService;I)Z
 HSPLcom/android/server/net/NetworkPolicyManagerService;->addDefaultRestrictBackgroundWhitelistUidsUL()Z
 HSPLcom/android/server/net/NetworkPolicyManagerService;->addDefaultRestrictBackgroundWhitelistUidsUL(I)Z
@@ -22187,6 +23983,7 @@
 HPLcom/android/server/net/NetworkStatsService$7;->limitReached(Ljava/lang/String;Ljava/lang/String;)V
 HSPLcom/android/server/net/NetworkStatsService$DefaultNetworkStatsSettings;-><init>(Landroid/content/Context;)V
 HPLcom/android/server/net/NetworkStatsService$DefaultNetworkStatsSettings;->getAugmentEnabled()Z
+PLcom/android/server/net/NetworkStatsService$DefaultNetworkStatsSettings;->getCombineSubtypeEnabled()Z
 HSPLcom/android/server/net/NetworkStatsService$DefaultNetworkStatsSettings;->getDevConfig()Lcom/android/server/net/NetworkStatsService$NetworkStatsSettings$Config;
 HSPLcom/android/server/net/NetworkStatsService$DefaultNetworkStatsSettings;->getDevPersistBytes(J)J
 HSPLcom/android/server/net/NetworkStatsService$DefaultNetworkStatsSettings;->getGlobalAlertBytes(J)J
@@ -22201,6 +23998,8 @@
 HSPLcom/android/server/net/NetworkStatsService$DefaultNetworkStatsSettings;->getUidTagPersistBytes(J)J
 HSPLcom/android/server/net/NetworkStatsService$DefaultNetworkStatsSettings;->getXtConfig()Lcom/android/server/net/NetworkStatsService$NetworkStatsSettings$Config;
 HSPLcom/android/server/net/NetworkStatsService$DefaultNetworkStatsSettings;->getXtPersistBytes(J)J
+PLcom/android/server/net/NetworkStatsService$Dependencies;-><init>()V
+PLcom/android/server/net/NetworkStatsService$Dependencies;->makeHandlerThread()Landroid/os/HandlerThread;
 HSPLcom/android/server/net/NetworkStatsService$DropBoxNonMonotonicObserver;-><init>(Lcom/android/server/net/NetworkStatsService;)V
 HSPLcom/android/server/net/NetworkStatsService$DropBoxNonMonotonicObserver;-><init>(Lcom/android/server/net/NetworkStatsService;Lcom/android/server/net/NetworkStatsService$1;)V
 HPLcom/android/server/net/NetworkStatsService$DropBoxNonMonotonicObserver;->foundNonMonotonic(Landroid/net/NetworkStats;ILandroid/net/NetworkStats;ILjava/lang/Object;)V
@@ -22208,6 +24007,8 @@
 HSPLcom/android/server/net/NetworkStatsService$HandlerCallback;-><init>(Lcom/android/server/net/NetworkStatsService;)V
 HPLcom/android/server/net/NetworkStatsService$HandlerCallback;->handleMessage(Landroid/os/Message;)Z
 HSPLcom/android/server/net/NetworkStatsService$NetworkStatsHandler;-><init>(Landroid/os/Looper;Landroid/os/Handler$Callback;)V
+PLcom/android/server/net/NetworkStatsService$NetworkStatsHandler;-><init>(Lcom/android/server/net/NetworkStatsService;Landroid/os/Looper;)V
+HPLcom/android/server/net/NetworkStatsService$NetworkStatsHandler;->handleMessage(Landroid/os/Message;)V
 HSPLcom/android/server/net/NetworkStatsService$NetworkStatsManagerInternalImpl;-><init>(Lcom/android/server/net/NetworkStatsService;)V
 HSPLcom/android/server/net/NetworkStatsService$NetworkStatsManagerInternalImpl;-><init>(Lcom/android/server/net/NetworkStatsService;Lcom/android/server/net/NetworkStatsService$1;)V
 PLcom/android/server/net/NetworkStatsService$NetworkStatsManagerInternalImpl;->advisePersistThreshold(J)V
@@ -22221,40 +24022,69 @@
 PLcom/android/server/net/NetworkStatsService$NetworkStatsProviderCallbackImpl;-><init>(Ljava/lang/String;Landroid/net/netstats/provider/INetworkStatsProvider;Ljava/util/concurrent/Semaphore;Landroid/net/INetworkManagementEventObserver;Landroid/os/RemoteCallbackList;)V
 PLcom/android/server/net/NetworkStatsService$NetworkStatsProviderCallbackImpl;->binderDied()V
 HPLcom/android/server/net/NetworkStatsService$NetworkStatsProviderCallbackImpl;->getCachedStats(I)Landroid/net/NetworkStats;
+HPLcom/android/server/net/NetworkStatsService$NetworkStatsProviderCallbackImpl;->notifyStatsUpdated(ILandroid/net/NetworkStats;Landroid/net/NetworkStats;)V
 HPLcom/android/server/net/NetworkStatsService$NetworkStatsProviderCallbackImpl;->onStatsUpdated(ILandroid/net/NetworkStats;Landroid/net/NetworkStats;)V
 HSPLcom/android/server/net/NetworkStatsService$NetworkStatsSettings$Config;-><init>(JJJ)V
+PLcom/android/server/net/NetworkStatsService$NetworkTypeListener;-><init>(Lcom/android/server/net/NetworkStatsService;Ljava/util/concurrent/Executor;)V
+PLcom/android/server/net/NetworkStatsService$NetworkTypeListener;->access$2100(Lcom/android/server/net/NetworkStatsService$NetworkTypeListener;)I
+HPLcom/android/server/net/NetworkStatsService$NetworkTypeListener;->onServiceStateChanged(Landroid/telephony/ServiceState;)V
 HSPLcom/android/server/net/NetworkStatsService;-><clinit>()V
 HSPLcom/android/server/net/NetworkStatsService;-><init>(Landroid/content/Context;Landroid/os/INetworkManagementService;Landroid/app/AlarmManager;Landroid/os/PowerManager$WakeLock;Ljava/time/Clock;Landroid/telephony/TelephonyManager;Lcom/android/server/net/NetworkStatsService$NetworkStatsSettings;Lcom/android/server/net/NetworkStatsFactory;Lcom/android/server/net/NetworkStatsObservers;Ljava/io/File;Ljava/io/File;)V
+PLcom/android/server/net/NetworkStatsService;-><init>(Landroid/content/Context;Landroid/os/INetworkManagementService;Landroid/app/AlarmManager;Landroid/os/PowerManager$WakeLock;Ljava/time/Clock;Landroid/telephony/TelephonyManager;Lcom/android/server/net/NetworkStatsService$NetworkStatsSettings;Lcom/android/server/net/NetworkStatsFactory;Lcom/android/server/net/NetworkStatsObservers;Ljava/io/File;Ljava/io/File;Lcom/android/server/net/NetworkStatsService$Dependencies;)V
+HPLcom/android/server/net/NetworkStatsService;->access$100(Lcom/android/server/net/NetworkStatsService;I)V
 PLcom/android/server/net/NetworkStatsService;->access$1000(Lcom/android/server/net/NetworkStatsService;)Landroid/os/PowerManager$WakeLock;
+PLcom/android/server/net/NetworkStatsService;->access$1000(Lcom/android/server/net/NetworkStatsService;)Lcom/android/server/net/NetworkStatsRecorder;
 PLcom/android/server/net/NetworkStatsService;->access$1100(Lcom/android/server/net/NetworkStatsService;[I)V
 PLcom/android/server/net/NetworkStatsService;->access$1200(Lcom/android/server/net/NetworkStatsService;I)V
 PLcom/android/server/net/NetworkStatsService;->access$1300(Lcom/android/server/net/NetworkStatsService;)V
+PLcom/android/server/net/NetworkStatsService;->access$1300(Lcom/android/server/net/NetworkStatsService;Landroid/net/NetworkTemplate;IIII)Landroid/net/NetworkStatsHistory;
 PLcom/android/server/net/NetworkStatsService;->access$1400(Lcom/android/server/net/NetworkStatsService;)Landroid/content/Context;
+PLcom/android/server/net/NetworkStatsService;->access$1400(Lcom/android/server/net/NetworkStatsService;)Landroid/os/PowerManager$WakeLock;
 PLcom/android/server/net/NetworkStatsService;->access$1500(Lcom/android/server/net/NetworkStatsService;)Landroid/os/Handler;
+PLcom/android/server/net/NetworkStatsService;->access$1500(Lcom/android/server/net/NetworkStatsService;[I)V
 PLcom/android/server/net/NetworkStatsService;->access$1600(Lcom/android/server/net/NetworkStatsService;)Lcom/android/server/net/NetworkStatsService$NetworkStatsSettings;
 PLcom/android/server/net/NetworkStatsService;->access$1600(Lcom/android/server/net/NetworkStatsService;Landroid/net/NetworkTemplate;JJ)J
 HPLcom/android/server/net/NetworkStatsService;->access$1700(Lcom/android/server/net/NetworkStatsService;Landroid/net/NetworkTemplate;JJ)J
+PLcom/android/server/net/NetworkStatsService;->access$1800(Lcom/android/server/net/NetworkStatsService;)Landroid/content/Context;
 PLcom/android/server/net/NetworkStatsService;->access$1800(Lcom/android/server/net/NetworkStatsService;J)V
+PLcom/android/server/net/NetworkStatsService;->access$1900(Lcom/android/server/net/NetworkStatsService;)Landroid/os/Handler;
 PLcom/android/server/net/NetworkStatsService;->access$1900(Lcom/android/server/net/NetworkStatsService;J)V
+HPLcom/android/server/net/NetworkStatsService;->access$200(Lcom/android/server/net/NetworkStatsService;)V
+PLcom/android/server/net/NetworkStatsService;->access$200(Lcom/android/server/net/NetworkStatsService;)[Landroid/net/NetworkState;
 HPLcom/android/server/net/NetworkStatsService;->access$200(Lcom/android/server/net/NetworkStatsService;Ljava/lang/String;)I
+PLcom/android/server/net/NetworkStatsService;->access$2000(Lcom/android/server/net/NetworkStatsService;)Lcom/android/server/net/NetworkStatsService$NetworkStatsSettings;
 HPLcom/android/server/net/NetworkStatsService;->access$2000(Lcom/android/server/net/NetworkStatsService;Lcom/android/server/net/NetworkStatsService$ThrowingConsumer;)V
+PLcom/android/server/net/NetworkStatsService;->access$2200(Lcom/android/server/net/NetworkStatsService;Landroid/net/NetworkTemplate;JJ)J
+PLcom/android/server/net/NetworkStatsService;->access$2400(Lcom/android/server/net/NetworkStatsService;J)V
+PLcom/android/server/net/NetworkStatsService;->access$2500(Lcom/android/server/net/NetworkStatsService;Lcom/android/server/net/NetworkStatsService$ThrowingConsumer;)V
 HPLcom/android/server/net/NetworkStatsService;->access$300(Lcom/android/server/net/NetworkStatsService;)Ljava/lang/Object;
+PLcom/android/server/net/NetworkStatsService;->access$300(Lcom/android/server/net/NetworkStatsService;)[Landroid/net/Network;
 HPLcom/android/server/net/NetworkStatsService;->access$400(Lcom/android/server/net/NetworkStatsService;)Lcom/android/server/net/NetworkStatsRecorder;
+PLcom/android/server/net/NetworkStatsService;->access$400(Lcom/android/server/net/NetworkStatsService;)Ljava/lang/String;
+PLcom/android/server/net/NetworkStatsService;->access$400(Lcom/android/server/net/NetworkStatsService;Ljava/lang/String;)I
 HPLcom/android/server/net/NetworkStatsService;->access$500(Lcom/android/server/net/NetworkStatsService;)Lcom/android/server/net/NetworkStatsRecorder;
+PLcom/android/server/net/NetworkStatsService;->access$500(Lcom/android/server/net/NetworkStatsService;)Ljava/lang/Object;
+HPLcom/android/server/net/NetworkStatsService;->access$500(Lcom/android/server/net/NetworkStatsService;[Landroid/net/Network;[Landroid/net/NetworkState;Ljava/lang/String;)V
+PLcom/android/server/net/NetworkStatsService;->access$600(Lcom/android/server/net/NetworkStatsService;)Lcom/android/server/net/NetworkStatsRecorder;
+HPLcom/android/server/net/NetworkStatsService;->access$600(Lcom/android/server/net/NetworkStatsService;)V
 HPLcom/android/server/net/NetworkStatsService;->access$600(Lcom/android/server/net/NetworkStatsService;Landroid/net/NetworkTemplate;IJJII)Landroid/net/NetworkStats;
 PLcom/android/server/net/NetworkStatsService;->access$700(Lcom/android/server/net/NetworkStatsService;Landroid/net/NetworkTemplate;IIII)Landroid/net/NetworkStatsHistory;
 HPLcom/android/server/net/NetworkStatsService;->access$800(Lcom/android/server/net/NetworkStatsService;I)V
+PLcom/android/server/net/NetworkStatsService;->access$800(Lcom/android/server/net/NetworkStatsService;Ljava/lang/String;)I
+PLcom/android/server/net/NetworkStatsService;->access$900(Lcom/android/server/net/NetworkStatsService;)Ljava/lang/Object;
 HPLcom/android/server/net/NetworkStatsService;->access$900(Lcom/android/server/net/NetworkStatsService;)V
 HPLcom/android/server/net/NetworkStatsService;->advisePersistThreshold(J)V
 HPLcom/android/server/net/NetworkStatsService;->assertSystemReady()V
 HSPLcom/android/server/net/NetworkStatsService;->bootstrapStatsLocked()V
 HSPLcom/android/server/net/NetworkStatsService;->buildRecorder(Ljava/lang/String;Lcom/android/server/net/NetworkStatsService$NetworkStatsSettings$Config;Z)Lcom/android/server/net/NetworkStatsRecorder;
 HPLcom/android/server/net/NetworkStatsService;->checkAccessLevel(Ljava/lang/String;)I
+PLcom/android/server/net/NetworkStatsService;->checkAnyPermissionOf([Ljava/lang/String;)Z
 HPLcom/android/server/net/NetworkStatsService;->checkBpfStatsEnable()Z
 HSPLcom/android/server/net/NetworkStatsService;->create(Landroid/content/Context;Landroid/os/INetworkManagementService;)Lcom/android/server/net/NetworkStatsService;
 HPLcom/android/server/net/NetworkStatsService;->dump(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V
 PLcom/android/server/net/NetworkStatsService;->dumpInterfaces(Landroid/util/proto/ProtoOutputStream;JLandroid/util/ArrayMap;)V
 PLcom/android/server/net/NetworkStatsService;->dumpProtoLocked(Ljava/io/FileDescriptor;)V
+PLcom/android/server/net/NetworkStatsService;->enforceAnyPermissionOf([Ljava/lang/String;)V
 HPLcom/android/server/net/NetworkStatsService;->findOrCreateNetworkIdentitySet(Landroid/util/ArrayMap;Ljava/lang/Object;)Lcom/android/server/net/NetworkIdentitySet;
 PLcom/android/server/net/NetworkStatsService;->forceUpdate()V
 HPLcom/android/server/net/NetworkStatsService;->forceUpdateIfaces([Landroid/net/Network;[Landroid/net/NetworkState;Ljava/lang/String;[Lcom/android/internal/net/VpnInfo;)V
@@ -22269,6 +24099,7 @@
 HSPLcom/android/server/net/NetworkStatsService;->getNetworkStatsUidDetail([Ljava/lang/String;)Landroid/net/NetworkStats;
 HSPLcom/android/server/net/NetworkStatsService;->getNetworkStatsXt()Landroid/net/NetworkStats;
 HPLcom/android/server/net/NetworkStatsService;->getNetworkTotalBytes(Landroid/net/NetworkTemplate;JJ)J
+PLcom/android/server/net/NetworkStatsService;->getSubTypeForState(Landroid/net/NetworkState;)I
 HPLcom/android/server/net/NetworkStatsService;->getTetherStats(Ljava/lang/String;I)J
 HPLcom/android/server/net/NetworkStatsService;->getTotalStats(I)J
 HPLcom/android/server/net/NetworkStatsService;->getUidStats(II)J
@@ -22399,6 +24230,8 @@
 PLcom/android/server/notification/-$$Lambda$NotificationHistoryDatabase$DOpPLk6FC4M8AMJ1FHTPtwlmVmQ;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
 PLcom/android/server/notification/-$$Lambda$NotificationManagerService$10$BRIIoO5T43uig1Sv3P_yA2lc3LA;-><init>(Lcom/android/server/notification/NotificationManagerService$10;Ljava/lang/String;)V
 PLcom/android/server/notification/-$$Lambda$NotificationManagerService$10$BRIIoO5T43uig1Sv3P_yA2lc3LA;->run()V
+PLcom/android/server/notification/-$$Lambda$NotificationManagerService$10$htzhfgfHA0ehIwizpUZcQfRJmoM;-><init>(Lcom/android/server/notification/NotificationManagerService$10;Ljava/lang/String;II)V
+PLcom/android/server/notification/-$$Lambda$NotificationManagerService$10$htzhfgfHA0ehIwizpUZcQfRJmoM;->run()V
 PLcom/android/server/notification/-$$Lambda$NotificationManagerService$11$JotEN8cxCghuwRUNQKNwudTtDmM;-><init>(Lcom/android/server/notification/NotificationManagerService$11;Ljava/lang/String;)V
 PLcom/android/server/notification/-$$Lambda$NotificationManagerService$11$JotEN8cxCghuwRUNQKNwudTtDmM;->run()V
 PLcom/android/server/notification/-$$Lambda$NotificationManagerService$11$zVdn9N0ybkMxz8xM8Qa1AXowlic;-><init>(Lcom/android/server/notification/NotificationManagerService$11;Ljava/lang/String;II)V
@@ -22417,8 +24250,14 @@
 PLcom/android/server/notification/-$$Lambda$NotificationManagerService$16$zTgrLv-fwhUBKBfo6G4cZaGAhWs;->apply(I)Z
 HSPLcom/android/server/notification/-$$Lambda$NotificationManagerService$1IFJYiXNBcQVsabIke0xY_TgCZI;-><init>(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;Landroid/os/VibrationEffect;)V
 HSPLcom/android/server/notification/-$$Lambda$NotificationManagerService$1IFJYiXNBcQVsabIke0xY_TgCZI;->run()V
+PLcom/android/server/notification/-$$Lambda$NotificationManagerService$7$FR2TcRnKXgS8FjXJjkSMBetsHLs;-><init>(Lcom/android/server/notification/NotificationManagerService$7;)V
+PLcom/android/server/notification/-$$Lambda$NotificationManagerService$7$FR2TcRnKXgS8FjXJjkSMBetsHLs;->runOrThrow()V
+PLcom/android/server/notification/-$$Lambda$NotificationManagerService$7$kQBbaPMB3H8PvoRWMRFutsXJqC8;-><init>(Lcom/android/server/notification/NotificationManagerService$7;Ljava/lang/String;Ljava/lang/String;II)V
+PLcom/android/server/notification/-$$Lambda$NotificationManagerService$7$kQBbaPMB3H8PvoRWMRFutsXJqC8;->runOrThrow()V
+PLcom/android/server/notification/-$$Lambda$NotificationManagerService$7$oVwblUFCYS29-pk3mwoXkriijO4;-><init>(Lcom/android/server/notification/NotificationManagerService$7;)V
+PLcom/android/server/notification/-$$Lambda$NotificationManagerService$7$oVwblUFCYS29-pk3mwoXkriijO4;->runOrThrow()V
 HPLcom/android/server/notification/-$$Lambda$NotificationManagerService$BDavS_Sg4m_dKO3ZgtuCsFeqqms;-><init>(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;Landroid/os/VibrationEffect;)V
-PLcom/android/server/notification/-$$Lambda$NotificationManagerService$BDavS_Sg4m_dKO3ZgtuCsFeqqms;->run()V
+HPLcom/android/server/notification/-$$Lambda$NotificationManagerService$BDavS_Sg4m_dKO3ZgtuCsFeqqms;->run()V
 PLcom/android/server/notification/-$$Lambda$NotificationManagerService$CancelNotificationRunnable$1i8BOFS2Ap_BvazcwqssFxW6U1U;-><clinit>()V
 PLcom/android/server/notification/-$$Lambda$NotificationManagerService$CancelNotificationRunnable$1i8BOFS2Ap_BvazcwqssFxW6U1U;-><init>()V
 PLcom/android/server/notification/-$$Lambda$NotificationManagerService$CancelNotificationRunnable$1i8BOFS2Ap_BvazcwqssFxW6U1U;->apply(I)Z
@@ -22464,11 +24303,14 @@
 PLcom/android/server/notification/-$$Lambda$NotificationManagerService$OZL_lzotNQk7U4Yu1gYgeIoj6do;->run()V
 HPLcom/android/server/notification/-$$Lambda$NotificationManagerService$PostNotificationRunnable$9JuPmiaA-c5lGdegev6EaTigwWc;-><init>(Lcom/android/server/notification/NotificationManagerService$PostNotificationRunnable;Lcom/android/server/notification/NotificationRecord;Landroid/service/notification/StatusBarNotification;)V
 HPLcom/android/server/notification/-$$Lambda$NotificationManagerService$PostNotificationRunnable$9JuPmiaA-c5lGdegev6EaTigwWc;->run()V
+PLcom/android/server/notification/-$$Lambda$NotificationManagerService$cVvNajwVr5sFISXC5NXOu3pYhPo;-><init>(Lcom/android/server/notification/NotificationManagerService;Landroid/content/pm/UserInfo;)V
+PLcom/android/server/notification/-$$Lambda$NotificationManagerService$cVvNajwVr5sFISXC5NXOu3pYhPo;->run()V
 PLcom/android/server/notification/-$$Lambda$NotificationManagerService$msGTh8UV2euOI6xhjY-rx_tZTLM;-><init>(Lcom/android/server/notification/NotificationManagerService;Landroid/content/pm/UserInfo;)V
 PLcom/android/server/notification/-$$Lambda$NotificationManagerService$msGTh8UV2euOI6xhjY-rx_tZTLM;->run()V
 PLcom/android/server/notification/-$$Lambda$NotificationManagerService$oBqbud98Vzd9hmZYK-pWIY4cBpI;-><init>(Lcom/android/server/notification/NotificationManagerService;Ljava/lang/CharSequence;)V
 PLcom/android/server/notification/-$$Lambda$NotificationManagerService$oBqbud98Vzd9hmZYK-pWIY4cBpI;->runOrThrow()V
 PLcom/android/server/notification/-$$Lambda$NotificationManagerService$pydsjOZodJQYqLnk-bBKjwKfMTw;-><init>(Lcom/android/server/notification/NotificationManagerService;)V
+PLcom/android/server/notification/-$$Lambda$NotificationManagerService$pydsjOZodJQYqLnk-bBKjwKfMTw;->repost(ILcom/android/server/notification/NotificationRecord;Z)V
 HPLcom/android/server/notification/-$$Lambda$NotificationManagerService$qSGWKI1fXQ1cTJ2fD072f_33txY;-><init>(Lcom/android/server/notification/NotificationManagerService;Ljava/lang/CharSequence;)V
 HPLcom/android/server/notification/-$$Lambda$NotificationManagerService$qSGWKI1fXQ1cTJ2fD072f_33txY;->runOrThrow()V
 PLcom/android/server/notification/-$$Lambda$NotificationManagerService$qbzDjihCkTumQH-EnAW4i5wobvM;-><init>(Lcom/android/server/notification/NotificationManagerService;Landroid/content/pm/UserInfo;)V
@@ -22479,6 +24321,9 @@
 HPLcom/android/server/notification/-$$Lambda$SnoozeHelper$333G5Hgba3G7RU9lYp0HmgKJBvA;->insert(Ljava/lang/Object;)V
 PLcom/android/server/notification/-$$Lambda$SnoozeHelper$C_0X0DORXKfskVjWiTfpnyCI82U;-><init>(Lorg/xmlpull/v1/XmlSerializer;)V
 PLcom/android/server/notification/-$$Lambda$SnoozeHelper$j9CMOic9PGs_JNf8sQeWp_WInBo;-><init>(JLorg/xmlpull/v1/XmlSerializer;)V
+HPLcom/android/server/notification/-$$Lambda$SnoozeHelper$j9CMOic9PGs_JNf8sQeWp_WInBo;->insert(Ljava/lang/Object;)V
+PLcom/android/server/notification/-$$Lambda$SnoozeHelper$qmPRhIe87AJQ1uMij6IuQyrejnw;-><init>(Lcom/android/server/notification/SnoozeHelper;Ljava/lang/String;Ljava/lang/String;IJ)V
+PLcom/android/server/notification/-$$Lambda$SnoozeHelper$qmPRhIe87AJQ1uMij6IuQyrejnw;->run()V
 HSPLcom/android/server/notification/-$$Lambda$SnoozeHelper$uY_yjjODxoDQVadkBTGNFqh7pco;-><init>(Lorg/xmlpull/v1/XmlSerializer;)V
 HSPLcom/android/server/notification/-$$Lambda$V4J7df5A6vhSIuw7Ym9xgkfahto;-><init>(Lcom/android/server/notification/NotificationManagerService;)V
 HSPLcom/android/server/notification/-$$Lambda$V4J7df5A6vhSIuw7Ym9xgkfahto;->test(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Z
@@ -22489,10 +24334,16 @@
 HSPLcom/android/server/notification/BadgeExtractor;->process(Lcom/android/server/notification/NotificationRecord;)Lcom/android/server/notification/RankingReconsideration;
 HSPLcom/android/server/notification/BadgeExtractor;->setConfig(Lcom/android/server/notification/RankingConfig;)V
 HSPLcom/android/server/notification/BadgeExtractor;->setZenHelper(Lcom/android/server/notification/ZenModeHelper;)V
+PLcom/android/server/notification/BubbleExtractor$BubbleChecker;-><init>(Landroid/content/Context;Lcom/android/server/notification/ShortcutHelper;Lcom/android/server/notification/RankingConfig;Landroid/app/ActivityManager;)V
+HPLcom/android/server/notification/BubbleExtractor$BubbleChecker;->canBubble(Lcom/android/server/notification/NotificationRecord;Ljava/lang/String;I)Z
+HPLcom/android/server/notification/BubbleExtractor$BubbleChecker;->canLaunchInActivityView(Landroid/content/Context;Landroid/app/PendingIntent;Ljava/lang/String;)Z
+HPLcom/android/server/notification/BubbleExtractor$BubbleChecker;->isNotificationAppropriateToBubble(Lcom/android/server/notification/NotificationRecord;)Z
+PLcom/android/server/notification/BubbleExtractor$BubbleChecker;->logBubbleError(Ljava/lang/String;Ljava/lang/String;)V
 HSPLcom/android/server/notification/BubbleExtractor;-><init>()V
 HSPLcom/android/server/notification/BubbleExtractor;->initialize(Landroid/content/Context;Lcom/android/server/notification/NotificationUsageStats;)V
 HSPLcom/android/server/notification/BubbleExtractor;->process(Lcom/android/server/notification/NotificationRecord;)Lcom/android/server/notification/RankingReconsideration;
 HSPLcom/android/server/notification/BubbleExtractor;->setConfig(Lcom/android/server/notification/RankingConfig;)V
+PLcom/android/server/notification/BubbleExtractor;->setShortcutHelper(Lcom/android/server/notification/ShortcutHelper;)V
 HSPLcom/android/server/notification/BubbleExtractor;->setZenHelper(Lcom/android/server/notification/ZenModeHelper;)V
 HSPLcom/android/server/notification/CalendarTracker$1;-><init>(Lcom/android/server/notification/CalendarTracker;Landroid/os/Handler;)V
 HPLcom/android/server/notification/CalendarTracker$1;->onChange(ZLandroid/net/Uri;)V
@@ -22673,7 +24524,7 @@
 HSPLcom/android/server/notification/ManagedServices;->getServiceFromTokenLocked(Landroid/os/IInterface;)Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;
 HSPLcom/android/server/notification/ManagedServices;->getServices()Ljava/util/List;
 HPLcom/android/server/notification/ManagedServices;->hasMatchingServices(Ljava/lang/String;I)Z
-PLcom/android/server/notification/ManagedServices;->isComponentEnabledForCurrentProfiles(Landroid/content/ComponentName;)Z
+HPLcom/android/server/notification/ManagedServices;->isComponentEnabledForCurrentProfiles(Landroid/content/ComponentName;)Z
 PLcom/android/server/notification/ManagedServices;->isComponentEnabledForPackage(Ljava/lang/String;)Z
 HPLcom/android/server/notification/ManagedServices;->isDefaultComponentOrPackage(Ljava/lang/String;)Z
 HPLcom/android/server/notification/ManagedServices;->isPackageAllowed(Ljava/lang/String;I)Z
@@ -22732,14 +24583,14 @@
 HSPLcom/android/server/notification/NotificationChannelExtractor;->setZenHelper(Lcom/android/server/notification/ZenModeHelper;)V
 PLcom/android/server/notification/NotificationChannelLogger$NotificationChannelEvent;-><clinit>()V
 PLcom/android/server/notification/NotificationChannelLogger$NotificationChannelEvent;-><init>(Ljava/lang/String;II)V
-PLcom/android/server/notification/NotificationChannelLogger$NotificationChannelEvent;->getCreated(Landroid/app/NotificationChannel;)Lcom/android/server/notification/NotificationChannelLogger$NotificationChannelEvent;
+HPLcom/android/server/notification/NotificationChannelLogger$NotificationChannelEvent;->getCreated(Landroid/app/NotificationChannel;)Lcom/android/server/notification/NotificationChannelLogger$NotificationChannelEvent;
 PLcom/android/server/notification/NotificationChannelLogger$NotificationChannelEvent;->getDeleted(Landroid/app/NotificationChannel;)Lcom/android/server/notification/NotificationChannelLogger$NotificationChannelEvent;
 PLcom/android/server/notification/NotificationChannelLogger$NotificationChannelEvent;->getGroupUpdated(Z)Lcom/android/server/notification/NotificationChannelLogger$NotificationChannelEvent;
-PLcom/android/server/notification/NotificationChannelLogger$NotificationChannelEvent;->getId()I
+HPLcom/android/server/notification/NotificationChannelLogger$NotificationChannelEvent;->getId()I
 PLcom/android/server/notification/NotificationChannelLogger$NotificationChannelEvent;->getUpdated(Z)Lcom/android/server/notification/NotificationChannelLogger$NotificationChannelEvent;
 HPLcom/android/server/notification/NotificationChannelLogger;->getIdHash(Landroid/app/NotificationChannel;)I
-PLcom/android/server/notification/NotificationChannelLogger;->getIdHash(Landroid/app/NotificationChannelGroup;)I
-PLcom/android/server/notification/NotificationChannelLogger;->getImportance(Landroid/app/NotificationChannelGroup;)I
+HPLcom/android/server/notification/NotificationChannelLogger;->getIdHash(Landroid/app/NotificationChannelGroup;)I
+HPLcom/android/server/notification/NotificationChannelLogger;->getImportance(Landroid/app/NotificationChannelGroup;)I
 PLcom/android/server/notification/NotificationChannelLogger;->getImportance(Z)I
 PLcom/android/server/notification/NotificationChannelLogger;->logNotificationChannelCreated(Landroid/app/NotificationChannel;ILjava/lang/String;)V
 PLcom/android/server/notification/NotificationChannelLogger;->logNotificationChannelDeleted(Landroid/app/NotificationChannel;ILjava/lang/String;)V
@@ -22764,21 +24615,28 @@
 HPLcom/android/server/notification/NotificationComparator;->isMediaNotification(Lcom/android/server/notification/NotificationRecord;)Z
 HPLcom/android/server/notification/NotificationComparator;->isOngoing(Lcom/android/server/notification/NotificationRecord;)Z
 PLcom/android/server/notification/NotificationHistoryDatabase$1;-><init>(Lcom/android/server/notification/NotificationHistoryDatabase;)V
+HPLcom/android/server/notification/NotificationHistoryDatabase$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
 PLcom/android/server/notification/NotificationHistoryDatabase$NotificationHistoryFileAttrProvider;-><init>()V
 PLcom/android/server/notification/NotificationHistoryDatabase$RemoveConversationRunnable;-><init>(Lcom/android/server/notification/NotificationHistoryDatabase;Ljava/lang/String;Ljava/lang/String;)V
 HPLcom/android/server/notification/NotificationHistoryDatabase$RemoveConversationRunnable;->run()V
+PLcom/android/server/notification/NotificationHistoryDatabase$RemovePackageRunnable;-><init>(Lcom/android/server/notification/NotificationHistoryDatabase;Ljava/lang/String;)V
+PLcom/android/server/notification/NotificationHistoryDatabase$RemovePackageRunnable;->run()V
 PLcom/android/server/notification/NotificationHistoryDatabase$WriteBufferRunnable;-><init>(Lcom/android/server/notification/NotificationHistoryDatabase;)V
 PLcom/android/server/notification/NotificationHistoryDatabase$WriteBufferRunnable;-><init>(Lcom/android/server/notification/NotificationHistoryDatabase;Lcom/android/server/notification/NotificationHistoryDatabase$1;)V
 PLcom/android/server/notification/NotificationHistoryDatabase$WriteBufferRunnable;->run()V
 PLcom/android/server/notification/NotificationHistoryDatabase;-><clinit>()V
 PLcom/android/server/notification/NotificationHistoryDatabase;-><init>(Landroid/content/Context;Landroid/os/Handler;Ljava/io/File;)V
 PLcom/android/server/notification/NotificationHistoryDatabase;-><init>(Landroid/content/Context;Landroid/os/Handler;Ljava/io/File;Lcom/android/server/notification/NotificationHistoryDatabase$FileAttrProvider;)V
+PLcom/android/server/notification/NotificationHistoryDatabase;->access$000()Ljava/lang/String;
 PLcom/android/server/notification/NotificationHistoryDatabase;->access$100()Z
 PLcom/android/server/notification/NotificationHistoryDatabase;->access$200()Z
 PLcom/android/server/notification/NotificationHistoryDatabase;->access$200(Lcom/android/server/notification/NotificationHistoryDatabase;)Ljava/lang/Object;
+PLcom/android/server/notification/NotificationHistoryDatabase;->access$300(Lcom/android/server/notification/NotificationHistoryDatabase;)Ljava/io/File;
 PLcom/android/server/notification/NotificationHistoryDatabase;->access$300(Lcom/android/server/notification/NotificationHistoryDatabase;)Ljava/lang/Object;
 PLcom/android/server/notification/NotificationHistoryDatabase;->access$400(Lcom/android/server/notification/NotificationHistoryDatabase;)Ljava/io/File;
+PLcom/android/server/notification/NotificationHistoryDatabase;->access$400(Lcom/android/server/notification/NotificationHistoryDatabase;Landroid/util/AtomicFile;Landroid/app/NotificationHistory;)V
 PLcom/android/server/notification/NotificationHistoryDatabase;->access$500(Lcom/android/server/notification/NotificationHistoryDatabase;Landroid/util/AtomicFile;Landroid/app/NotificationHistory;)V
+PLcom/android/server/notification/NotificationHistoryDatabase;->access$500(Lcom/android/server/notification/NotificationHistoryDatabase;Ljava/io/File;JI)V
 PLcom/android/server/notification/NotificationHistoryDatabase;->access$600(Landroid/util/AtomicFile;Landroid/app/NotificationHistory;Lcom/android/server/notification/NotificationHistoryFilter;)V
 HPLcom/android/server/notification/NotificationHistoryDatabase;->addNotification(Landroid/app/NotificationHistory$HistoricalNotification;)V
 PLcom/android/server/notification/NotificationHistoryDatabase;->checkVersionAndBuildLocked()V
@@ -22794,17 +24652,17 @@
 PLcom/android/server/notification/NotificationHistoryDatabase;->writeLocked(Landroid/util/AtomicFile;Landroid/app/NotificationHistory;)V
 PLcom/android/server/notification/NotificationHistoryDatabaseFactory;->create(Landroid/content/Context;Landroid/os/Handler;Ljava/io/File;)Lcom/android/server/notification/NotificationHistoryDatabase;
 PLcom/android/server/notification/NotificationHistoryDatabaseFactory;->create(Landroid/content/Context;Landroid/os/Handler;Ljava/io/File;Lcom/android/server/notification/NotificationHistoryDatabase$FileAttrProvider;)Lcom/android/server/notification/NotificationHistoryDatabase;
-PLcom/android/server/notification/NotificationHistoryFilter$Builder;-><init>()V
-PLcom/android/server/notification/NotificationHistoryFilter$Builder;->build()Lcom/android/server/notification/NotificationHistoryFilter;
-PLcom/android/server/notification/NotificationHistoryFilter;-><init>()V
-PLcom/android/server/notification/NotificationHistoryFilter;-><init>(Lcom/android/server/notification/NotificationHistoryFilter$1;)V
-PLcom/android/server/notification/NotificationHistoryFilter;->access$102(Lcom/android/server/notification/NotificationHistoryFilter;Ljava/lang/String;)Ljava/lang/String;
-PLcom/android/server/notification/NotificationHistoryFilter;->access$202(Lcom/android/server/notification/NotificationHistoryFilter;Ljava/lang/String;)Ljava/lang/String;
-PLcom/android/server/notification/NotificationHistoryFilter;->access$302(Lcom/android/server/notification/NotificationHistoryFilter;I)I
+HPLcom/android/server/notification/NotificationHistoryFilter$Builder;-><init>()V
+HPLcom/android/server/notification/NotificationHistoryFilter$Builder;->build()Lcom/android/server/notification/NotificationHistoryFilter;
+HPLcom/android/server/notification/NotificationHistoryFilter;-><init>()V
+HPLcom/android/server/notification/NotificationHistoryFilter;-><init>(Lcom/android/server/notification/NotificationHistoryFilter$1;)V
+HPLcom/android/server/notification/NotificationHistoryFilter;->access$102(Lcom/android/server/notification/NotificationHistoryFilter;Ljava/lang/String;)Ljava/lang/String;
+HPLcom/android/server/notification/NotificationHistoryFilter;->access$202(Lcom/android/server/notification/NotificationHistoryFilter;Ljava/lang/String;)Ljava/lang/String;
+HPLcom/android/server/notification/NotificationHistoryFilter;->access$302(Lcom/android/server/notification/NotificationHistoryFilter;I)I
 PLcom/android/server/notification/NotificationHistoryFilter;->getChannel()Ljava/lang/String;
-PLcom/android/server/notification/NotificationHistoryFilter;->getPackage()Ljava/lang/String;
+HPLcom/android/server/notification/NotificationHistoryFilter;->getPackage()Ljava/lang/String;
 PLcom/android/server/notification/NotificationHistoryFilter;->isFiltering()Z
-PLcom/android/server/notification/NotificationHistoryFilter;->matchesCountFilter(Landroid/app/NotificationHistory;)Z
+HPLcom/android/server/notification/NotificationHistoryFilter;->matchesCountFilter(Landroid/app/NotificationHistory;)Z
 HPLcom/android/server/notification/NotificationHistoryFilter;->matchesPackageAndChannelFilter(Landroid/app/NotificationHistory$HistoricalNotification;)Z
 HSPLcom/android/server/notification/NotificationHistoryManager$SettingsObserver;-><init>(Lcom/android/server/notification/NotificationHistoryManager;Landroid/os/Handler;)V
 HSPLcom/android/server/notification/NotificationHistoryManager$SettingsObserver;->observe()V
@@ -22830,6 +24688,7 @@
 HPLcom/android/server/notification/NotificationHistoryProtoHelper;->read(Ljava/io/InputStream;Landroid/app/NotificationHistory;Lcom/android/server/notification/NotificationHistoryFilter;)V
 HPLcom/android/server/notification/NotificationHistoryProtoHelper;->readNotification(Landroid/util/proto/ProtoInputStream;Ljava/util/List;)Landroid/app/NotificationHistory$HistoricalNotification;
 HPLcom/android/server/notification/NotificationHistoryProtoHelper;->readNotification(Landroid/util/proto/ProtoInputStream;Ljava/util/List;Landroid/app/NotificationHistory;Lcom/android/server/notification/NotificationHistoryFilter;)V
+HPLcom/android/server/notification/NotificationHistoryProtoHelper;->readStringPool(Landroid/util/proto/ProtoInputStream;)Ljava/util/List;
 HPLcom/android/server/notification/NotificationHistoryProtoHelper;->write(Ljava/io/OutputStream;Landroid/app/NotificationHistory;I)V
 HPLcom/android/server/notification/NotificationHistoryProtoHelper;->writeIcon(Landroid/util/proto/ProtoOutputStream;Landroid/app/NotificationHistory$HistoricalNotification;)V
 HPLcom/android/server/notification/NotificationHistoryProtoHelper;->writeNotification(Landroid/util/proto/ProtoOutputStream;[Ljava/lang/String;Landroid/app/NotificationHistory$HistoricalNotification;)V
@@ -22859,11 +24718,12 @@
 HSPLcom/android/server/notification/NotificationManagerService$10;->canNotifyAsPackage(Ljava/lang/String;Ljava/lang/String;I)Z
 PLcom/android/server/notification/NotificationManagerService$10;->canShowBadge(Ljava/lang/String;I)Z
 PLcom/android/server/notification/NotificationManagerService$10;->cancelAllNotifications(Ljava/lang/String;I)V
+PLcom/android/server/notification/NotificationManagerService$10;->cancelNotification(Ljava/lang/String;Ljava/lang/String;IILjava/lang/String;II)V
 PLcom/android/server/notification/NotificationManagerService$10;->cancelNotificationFromListenerLocked(Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;IILjava/lang/String;Ljava/lang/String;II)V
 HSPLcom/android/server/notification/NotificationManagerService$10;->cancelNotificationWithTag(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;II)V
 PLcom/android/server/notification/NotificationManagerService$10;->cancelNotificationsFromListener(Landroid/service/notification/INotificationListener;[Ljava/lang/String;)V
 HPLcom/android/server/notification/NotificationManagerService$10;->cancelToast(Ljava/lang/String;Landroid/app/ITransientNotification;)V
-PLcom/android/server/notification/NotificationManagerService$10;->cancelToast(Ljava/lang/String;Landroid/os/IBinder;)V
+HPLcom/android/server/notification/NotificationManagerService$10;->cancelToast(Ljava/lang/String;Landroid/os/IBinder;)V
 HPLcom/android/server/notification/NotificationManagerService$10;->checkPackagePolicyAccess(Ljava/lang/String;)Z
 HPLcom/android/server/notification/NotificationManagerService$10;->checkPolicyAccess(Ljava/lang/String;)Z
 HPLcom/android/server/notification/NotificationManagerService$10;->clearData(Ljava/lang/String;IZ)V
@@ -22879,15 +24739,18 @@
 PLcom/android/server/notification/NotificationManagerService$10;->enforcePolicyAccess(Ljava/lang/String;Ljava/lang/String;)V
 HSPLcom/android/server/notification/NotificationManagerService$10;->enforceSystemOrSystemUI(Ljava/lang/String;)V
 HPLcom/android/server/notification/NotificationManagerService$10;->enforceSystemOrSystemUIOrSamePackage(Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/notification/NotificationManagerService$10;->enqueueNotification(Ljava/lang/String;Ljava/lang/String;IILjava/lang/String;ILandroid/app/Notification;I)V
 HSPLcom/android/server/notification/NotificationManagerService$10;->enqueueNotificationWithTag(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILandroid/app/Notification;I)V
 PLcom/android/server/notification/NotificationManagerService$10;->enqueueTextOrCustomToast(Ljava/lang/String;Landroid/os/IBinder;Landroid/app/ITransientNotification;IIZ)V
 HPLcom/android/server/notification/NotificationManagerService$10;->enqueueTextToast(Ljava/lang/String;Landroid/app/ITransientNotification;II)V
 PLcom/android/server/notification/NotificationManagerService$10;->enqueueTextToast(Ljava/lang/String;Landroid/os/IBinder;Ljava/lang/CharSequence;IILandroid/app/ITransientNotificationCallback;)V
 PLcom/android/server/notification/NotificationManagerService$10;->enqueueToast(Ljava/lang/String;Landroid/app/ITransientNotification;II)V
 HPLcom/android/server/notification/NotificationManagerService$10;->enqueueToast(Ljava/lang/String;Landroid/app/ITransientNotification;IIZ)V
+PLcom/android/server/notification/NotificationManagerService$10;->enqueueToast(Ljava/lang/String;Landroid/os/IBinder;Landroid/app/ITransientNotification;II)V
+HPLcom/android/server/notification/NotificationManagerService$10;->enqueueToast(Ljava/lang/String;Landroid/os/IBinder;Ljava/lang/CharSequence;Landroid/app/ITransientNotification;IILandroid/app/ITransientNotificationCallback;)V
 HPLcom/android/server/notification/NotificationManagerService$10;->enqueueToast(Ljava/lang/String;Landroid/os/IBinder;Ljava/lang/CharSequence;Landroid/app/ITransientNotification;IILandroid/app/ITransientNotificationCallback;Z)V
 HPLcom/android/server/notification/NotificationManagerService$10;->finishToken(Ljava/lang/String;Landroid/app/ITransientNotification;)V
-PLcom/android/server/notification/NotificationManagerService$10;->finishToken(Ljava/lang/String;Landroid/os/IBinder;)V
+HPLcom/android/server/notification/NotificationManagerService$10;->finishToken(Ljava/lang/String;Landroid/os/IBinder;)V
 HPLcom/android/server/notification/NotificationManagerService$10;->getActiveNotificationsFromListener(Landroid/service/notification/INotificationListener;[Ljava/lang/String;I)Landroid/content/pm/ParceledListSlice;
 PLcom/android/server/notification/NotificationManagerService$10;->getAllowedAssistantAdjustments(Ljava/lang/String;)Ljava/util/List;
 HPLcom/android/server/notification/NotificationManagerService$10;->getAllowedNotificationAssistant()Landroid/content/ComponentName;
@@ -22901,20 +24764,26 @@
 HSPLcom/android/server/notification/NotificationManagerService$10;->getConsolidatedNotificationPolicy()Landroid/app/NotificationManager$Policy;
 HSPLcom/android/server/notification/NotificationManagerService$10;->getConversationNotificationChannel(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)Landroid/app/NotificationChannel;
 HPLcom/android/server/notification/NotificationManagerService$10;->getConversationNotificationChannel(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;ZLjava/lang/String;)Landroid/app/NotificationChannel;
+PLcom/android/server/notification/NotificationManagerService$10;->getConversations(Z)Landroid/content/pm/ParceledListSlice;
 PLcom/android/server/notification/NotificationManagerService$10;->getConversationsForPackage(Ljava/lang/String;I)Landroid/content/pm/ParceledListSlice;
 PLcom/android/server/notification/NotificationManagerService$10;->getDeletedChannelCount(Ljava/lang/String;I)I
 PLcom/android/server/notification/NotificationManagerService$10;->getEffectsSuppressor()Landroid/content/ComponentName;
 PLcom/android/server/notification/NotificationManagerService$10;->getEnabledNotificationListenerPackages()Ljava/util/List;
 HPLcom/android/server/notification/NotificationManagerService$10;->getHintsFromListener(Landroid/service/notification/INotificationListener;)I
 PLcom/android/server/notification/NotificationManagerService$10;->getHistoricalNotifications(Ljava/lang/String;IZ)[Landroid/service/notification/StatusBarNotification;
+PLcom/android/server/notification/NotificationManagerService$10;->getHistoricalNotificationsWithAttribution(Ljava/lang/String;Ljava/lang/String;IZ)[Landroid/service/notification/StatusBarNotification;
 PLcom/android/server/notification/NotificationManagerService$10;->getInterruptionFilterFromListener(Landroid/service/notification/INotificationListener;)I
+PLcom/android/server/notification/NotificationManagerService$10;->getNotificationChannel(Ljava/lang/String;ILjava/lang/String;)Landroid/app/NotificationChannel;
 HSPLcom/android/server/notification/NotificationManagerService$10;->getNotificationChannel(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)Landroid/app/NotificationChannel;
+PLcom/android/server/notification/NotificationManagerService$10;->getNotificationChannelForPackage(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Z)Landroid/app/NotificationChannel;
 HPLcom/android/server/notification/NotificationManagerService$10;->getNotificationChannelGroup(Ljava/lang/String;Ljava/lang/String;)Landroid/app/NotificationChannelGroup;
 PLcom/android/server/notification/NotificationManagerService$10;->getNotificationChannelGroupForPackage(Ljava/lang/String;Ljava/lang/String;I)Landroid/app/NotificationChannelGroup;
 HPLcom/android/server/notification/NotificationManagerService$10;->getNotificationChannelGroups(Ljava/lang/String;)Landroid/content/pm/ParceledListSlice;
 PLcom/android/server/notification/NotificationManagerService$10;->getNotificationChannelGroupsForPackage(Ljava/lang/String;IZ)Landroid/content/pm/ParceledListSlice;
 HPLcom/android/server/notification/NotificationManagerService$10;->getNotificationChannels(Ljava/lang/String;Ljava/lang/String;I)Landroid/content/pm/ParceledListSlice;
+HPLcom/android/server/notification/NotificationManagerService$10;->getNotificationChannelsBypassingDnd(Ljava/lang/String;I)Landroid/content/pm/ParceledListSlice;
 PLcom/android/server/notification/NotificationManagerService$10;->getNotificationHistory(Ljava/lang/String;)Landroid/app/NotificationHistory;
+PLcom/android/server/notification/NotificationManagerService$10;->getNotificationHistory(Ljava/lang/String;Ljava/lang/String;)Landroid/app/NotificationHistory;
 HPLcom/android/server/notification/NotificationManagerService$10;->getNotificationPolicy(Ljava/lang/String;)Landroid/app/NotificationManager$Policy;
 PLcom/android/server/notification/NotificationManagerService$10;->getNumNotificationChannelsForPackage(Ljava/lang/String;IZ)I
 PLcom/android/server/notification/NotificationManagerService$10;->getPackageImportance(Ljava/lang/String;)I
@@ -22928,17 +24797,21 @@
 HPLcom/android/server/notification/NotificationManagerService$10;->isNotificationListenerAccessGrantedForUser(Landroid/content/ComponentName;I)Z
 HPLcom/android/server/notification/NotificationManagerService$10;->isNotificationPolicyAccessGranted(Ljava/lang/String;)Z
 PLcom/android/server/notification/NotificationManagerService$10;->isNotificationPolicyAccessGrantedForPackage(Ljava/lang/String;)Z
+PLcom/android/server/notification/NotificationManagerService$10;->isPackageInForegroundForToast(Ljava/lang/String;I)Z
 HPLcom/android/server/notification/NotificationManagerService$10;->isPackagePaused(Ljava/lang/String;)Z
 PLcom/android/server/notification/NotificationManagerService$10;->lambda$enqueueToast$0$NotificationManagerService$10(Ljava/lang/String;)V
+HPLcom/android/server/notification/NotificationManagerService$10;->lambda$removeForegroundServiceFlagFromNotification$0$NotificationManagerService$10(Ljava/lang/String;II)V
 PLcom/android/server/notification/NotificationManagerService$10;->matchesCallFilter(Landroid/os/Bundle;)Z
 HSPLcom/android/server/notification/NotificationManagerService$10;->notifyConditions(Ljava/lang/String;Landroid/service/notification/IConditionProvider;[Landroid/service/notification/Condition;)V
+PLcom/android/server/notification/NotificationManagerService$10;->onConversationRemoved(Ljava/lang/String;ILjava/lang/String;)V
 PLcom/android/server/notification/NotificationManagerService$10;->onlyHasDefaultChannel(Ljava/lang/String;I)Z
 PLcom/android/server/notification/NotificationManagerService$10;->registerListener(Landroid/service/notification/INotificationListener;Landroid/content/ComponentName;I)V
 PLcom/android/server/notification/NotificationManagerService$10;->removeAutoGroup(Ljava/lang/String;)V
 HPLcom/android/server/notification/NotificationManagerService$10;->removeAutoGroupSummary(ILjava/lang/String;)V
 PLcom/android/server/notification/NotificationManagerService$10;->removeAutomaticZenRule(Ljava/lang/String;)Z
 PLcom/android/server/notification/NotificationManagerService$10;->removeAutomaticZenRules(Ljava/lang/String;)Z
-PLcom/android/server/notification/NotificationManagerService$10;->requestBindListener(Landroid/content/ComponentName;)V
+PLcom/android/server/notification/NotificationManagerService$10;->removeForegroundServiceFlagLocked(Lcom/android/server/notification/NotificationRecord;)V
+HPLcom/android/server/notification/NotificationManagerService$10;->requestBindListener(Landroid/content/ComponentName;)V
 PLcom/android/server/notification/NotificationManagerService$10;->requestBindProvider(Landroid/content/ComponentName;)V
 PLcom/android/server/notification/NotificationManagerService$10;->requestHintsFromListener(Landroid/service/notification/INotificationListener;I)V
 PLcom/android/server/notification/NotificationManagerService$10;->requestInterruptionFilterFromListener(Landroid/service/notification/INotificationListener;I)V
@@ -22955,6 +24828,7 @@
 PLcom/android/server/notification/NotificationManagerService$10;->setNotificationsEnabledForPackage(Ljava/lang/String;IZ)V
 HPLcom/android/server/notification/NotificationManagerService$10;->setNotificationsShownFromListener(Landroid/service/notification/INotificationListener;[Ljava/lang/String;)V
 PLcom/android/server/notification/NotificationManagerService$10;->setPrivateNotificationsAllowed(Z)V
+PLcom/android/server/notification/NotificationManagerService$10;->setShowBadge(Ljava/lang/String;IZ)V
 PLcom/android/server/notification/NotificationManagerService$10;->setZenMode(ILandroid/net/Uri;Ljava/lang/String;)V
 PLcom/android/server/notification/NotificationManagerService$10;->shouldHideSilentStatusIcons(Ljava/lang/String;)Z
 PLcom/android/server/notification/NotificationManagerService$10;->silenceNotificationSound()V
@@ -22963,6 +24837,7 @@
 HPLcom/android/server/notification/NotificationManagerService$10;->updateAutogroupSummary(Ljava/lang/String;Z)V
 PLcom/android/server/notification/NotificationManagerService$10;->updateAutomaticZenRule(Ljava/lang/String;Landroid/app/AutomaticZenRule;)Z
 PLcom/android/server/notification/NotificationManagerService$10;->updateNotificationChannelForPackage(Ljava/lang/String;ILandroid/app/NotificationChannel;)V
+PLcom/android/server/notification/NotificationManagerService$10;->updateNotificationChannelGroupForPackage(Ljava/lang/String;ILandroid/app/NotificationChannelGroup;)V
 HSPLcom/android/server/notification/NotificationManagerService$11$1;-><init>(Lcom/android/server/notification/NotificationManagerService$11;Ljava/lang/String;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;[Landroid/service/notification/Condition;)V
 HSPLcom/android/server/notification/NotificationManagerService$11$1;->run()V
 HSPLcom/android/server/notification/NotificationManagerService$11;-><init>(Lcom/android/server/notification/NotificationManagerService;)V
@@ -23014,7 +24889,7 @@
 HPLcom/android/server/notification/NotificationManagerService$11;->getAllowedNotificationAssistant()Landroid/content/ComponentName;
 HPLcom/android/server/notification/NotificationManagerService$11;->getAllowedNotificationAssistantForUser(I)Landroid/content/ComponentName;
 HPLcom/android/server/notification/NotificationManagerService$11;->getAppActiveNotifications(Ljava/lang/String;I)Landroid/content/pm/ParceledListSlice;
-PLcom/android/server/notification/NotificationManagerService$11;->getAppsBypassingDndCount(I)I
+HPLcom/android/server/notification/NotificationManagerService$11;->getAppsBypassingDndCount(I)I
 PLcom/android/server/notification/NotificationManagerService$11;->getAutomaticZenRule(Ljava/lang/String;)Landroid/app/AutomaticZenRule;
 PLcom/android/server/notification/NotificationManagerService$11;->getBackupPayload(I)[B
 PLcom/android/server/notification/NotificationManagerService$11;->getBlockedAppCount(I)I
@@ -23130,6 +25005,7 @@
 HPLcom/android/server/notification/NotificationManagerService$1;->onPanelHidden()V
 HPLcom/android/server/notification/NotificationManagerService$1;->onPanelRevealed(ZI)V
 HPLcom/android/server/notification/NotificationManagerService$1;->onSetDisabled(I)V
+PLcom/android/server/notification/NotificationManagerService$1;->prepareForPossibleShutdown()V
 HSPLcom/android/server/notification/NotificationManagerService$2;-><init>(Lcom/android/server/notification/NotificationManagerService;)V
 HSPLcom/android/server/notification/NotificationManagerService$2;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
 HSPLcom/android/server/notification/NotificationManagerService$3;-><init>(Lcom/android/server/notification/NotificationManagerService;)V
@@ -23140,23 +25016,134 @@
 HSPLcom/android/server/notification/NotificationManagerService$6;-><init>(Lcom/android/server/notification/NotificationManagerService;)V
 HSPLcom/android/server/notification/NotificationManagerService$6;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
 HSPLcom/android/server/notification/NotificationManagerService$7;-><init>(Lcom/android/server/notification/NotificationManagerService;)V
+PLcom/android/server/notification/NotificationManagerService$7;->lambda$onAutomaticRuleStatusChanged$2$NotificationManagerService$7(Ljava/lang/String;Ljava/lang/String;II)V
+PLcom/android/server/notification/NotificationManagerService$7;->lambda$onPolicyChanged$1$NotificationManagerService$7()V
+HPLcom/android/server/notification/NotificationManagerService$7;->lambda$onZenModeChanged$0$NotificationManagerService$7()V
 PLcom/android/server/notification/NotificationManagerService$7;->onAutomaticRuleStatusChanged(ILjava/lang/String;Ljava/lang/String;I)V
 HSPLcom/android/server/notification/NotificationManagerService$7;->onConfigChanged()V
 HSPLcom/android/server/notification/NotificationManagerService$7;->onPolicyChanged()V
 PLcom/android/server/notification/NotificationManagerService$7;->onZenModeChanged()V
 HSPLcom/android/server/notification/NotificationManagerService$8;-><init>(Lcom/android/server/notification/NotificationManagerService;)V
+HPLcom/android/server/notification/NotificationManagerService$8;->addAutoGroup(Ljava/lang/String;)V
+PLcom/android/server/notification/NotificationManagerService$8;->addAutoGroupSummary(ILjava/lang/String;Ljava/lang/String;)V
 PLcom/android/server/notification/NotificationManagerService$8;->onAutomaticRuleStatusChanged(ILjava/lang/String;Ljava/lang/String;I)V
 HSPLcom/android/server/notification/NotificationManagerService$8;->onConfigChanged()V
 HSPLcom/android/server/notification/NotificationManagerService$8;->onPolicyChanged()V
 HSPLcom/android/server/notification/NotificationManagerService$8;->onZenModeChanged()V
+PLcom/android/server/notification/NotificationManagerService$8;->removeAutoGroup(Ljava/lang/String;)V
+HPLcom/android/server/notification/NotificationManagerService$8;->removeAutoGroupSummary(ILjava/lang/String;)V
 PLcom/android/server/notification/NotificationManagerService$8;->repost(ILcom/android/server/notification/NotificationRecord;)V
+HPLcom/android/server/notification/NotificationManagerService$8;->updateAutogroupSummary(Ljava/lang/String;Z)V
+PLcom/android/server/notification/NotificationManagerService$9$1;-><init>(Lcom/android/server/notification/NotificationManagerService$9;Ljava/lang/String;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;[Landroid/service/notification/Condition;)V
+HPLcom/android/server/notification/NotificationManagerService$9$1;->run()V
 HSPLcom/android/server/notification/NotificationManagerService$9;-><init>(Lcom/android/server/notification/NotificationManagerService;)V
 PLcom/android/server/notification/NotificationManagerService$9;->addAutoGroup(Ljava/lang/String;)V
 PLcom/android/server/notification/NotificationManagerService$9;->addAutoGroupSummary(ILjava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/notification/NotificationManagerService$9;->addAutomaticZenRule(Landroid/app/AutomaticZenRule;)Ljava/lang/String;
+PLcom/android/server/notification/NotificationManagerService$9;->applyAdjustmentFromAssistant(Landroid/service/notification/INotificationListener;Landroid/service/notification/Adjustment;)V
+HPLcom/android/server/notification/NotificationManagerService$9;->applyAdjustmentsFromAssistant(Landroid/service/notification/INotificationListener;Ljava/util/List;)V
+HPLcom/android/server/notification/NotificationManagerService$9;->applyEnqueuedAdjustmentFromAssistant(Landroid/service/notification/INotificationListener;Landroid/service/notification/Adjustment;)V
+PLcom/android/server/notification/NotificationManagerService$9;->areBubblesAllowed(Ljava/lang/String;)Z
+HPLcom/android/server/notification/NotificationManagerService$9;->areBubblesAllowedForPackage(Ljava/lang/String;I)Z
+HPLcom/android/server/notification/NotificationManagerService$9;->areNotificationsEnabled(Ljava/lang/String;)Z
+HPLcom/android/server/notification/NotificationManagerService$9;->areNotificationsEnabledForPackage(Ljava/lang/String;I)Z
+HPLcom/android/server/notification/NotificationManagerService$9;->canNotifyAsPackage(Ljava/lang/String;Ljava/lang/String;I)Z
+PLcom/android/server/notification/NotificationManagerService$9;->canShowBadge(Ljava/lang/String;I)Z
+HPLcom/android/server/notification/NotificationManagerService$9;->cancelAllNotifications(Ljava/lang/String;I)V
+HPLcom/android/server/notification/NotificationManagerService$9;->cancelNotificationWithTag(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;II)V
+HPLcom/android/server/notification/NotificationManagerService$9;->cancelToast(Ljava/lang/String;Landroid/os/IBinder;)V
+HPLcom/android/server/notification/NotificationManagerService$9;->checkPackagePolicyAccess(Ljava/lang/String;)Z
+HPLcom/android/server/notification/NotificationManagerService$9;->checkPolicyAccess(Ljava/lang/String;)Z
+PLcom/android/server/notification/NotificationManagerService$9;->clearData(Ljava/lang/String;IZ)V
+PLcom/android/server/notification/NotificationManagerService$9;->createConversationNotificationChannelForPackage(Ljava/lang/String;ILjava/lang/String;Landroid/app/NotificationChannel;Ljava/lang/String;)V
+HPLcom/android/server/notification/NotificationManagerService$9;->createNotificationChannelGroups(Ljava/lang/String;Landroid/content/pm/ParceledListSlice;)V
+HPLcom/android/server/notification/NotificationManagerService$9;->createNotificationChannels(Ljava/lang/String;Landroid/content/pm/ParceledListSlice;)V
+HPLcom/android/server/notification/NotificationManagerService$9;->createNotificationChannelsForPackage(Ljava/lang/String;ILandroid/content/pm/ParceledListSlice;)V
+HPLcom/android/server/notification/NotificationManagerService$9;->createNotificationChannelsImpl(Ljava/lang/String;ILandroid/content/pm/ParceledListSlice;)V
+HPLcom/android/server/notification/NotificationManagerService$9;->deleteNotificationChannel(Ljava/lang/String;Ljava/lang/String;)V
+HPLcom/android/server/notification/NotificationManagerService$9;->deleteNotificationChannelGroup(Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/notification/NotificationManagerService$9;->dump(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V
+HPLcom/android/server/notification/NotificationManagerService$9;->enforcePolicyAccess(ILjava/lang/String;)V
+PLcom/android/server/notification/NotificationManagerService$9;->enforcePolicyAccess(Ljava/lang/String;Ljava/lang/String;)V
+HPLcom/android/server/notification/NotificationManagerService$9;->enforceSystemOrSystemUI(Ljava/lang/String;)V
+HPLcom/android/server/notification/NotificationManagerService$9;->enforceSystemOrSystemUIOrSamePackage(Ljava/lang/String;Ljava/lang/String;)V
+HPLcom/android/server/notification/NotificationManagerService$9;->enqueueNotificationWithTag(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILandroid/app/Notification;I)V
+PLcom/android/server/notification/NotificationManagerService$9;->enqueueTextOrCustomToast(Ljava/lang/String;Landroid/os/IBinder;Landroid/app/ITransientNotification;IIZ)V
+PLcom/android/server/notification/NotificationManagerService$9;->enqueueTextToast(Ljava/lang/String;Landroid/os/IBinder;Ljava/lang/CharSequence;IILandroid/app/ITransientNotificationCallback;)V
+PLcom/android/server/notification/NotificationManagerService$9;->enqueueToast(Ljava/lang/String;Landroid/os/IBinder;Landroid/app/ITransientNotification;II)V
+PLcom/android/server/notification/NotificationManagerService$9;->enqueueToast(Ljava/lang/String;Landroid/os/IBinder;Ljava/lang/CharSequence;Landroid/app/ITransientNotification;IILandroid/app/ITransientNotificationCallback;)V
+HPLcom/android/server/notification/NotificationManagerService$9;->enqueueToast(Ljava/lang/String;Landroid/os/IBinder;Ljava/lang/CharSequence;Landroid/app/ITransientNotification;IILandroid/app/ITransientNotificationCallback;Z)V
+HPLcom/android/server/notification/NotificationManagerService$9;->finishToken(Ljava/lang/String;Landroid/os/IBinder;)V
+HPLcom/android/server/notification/NotificationManagerService$9;->getActiveNotificationsFromListener(Landroid/service/notification/INotificationListener;[Ljava/lang/String;I)Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/notification/NotificationManagerService$9;->getAllowedAssistantAdjustments(Ljava/lang/String;)Ljava/util/List;
+HPLcom/android/server/notification/NotificationManagerService$9;->getAllowedNotificationAssistant()Landroid/content/ComponentName;
+HPLcom/android/server/notification/NotificationManagerService$9;->getAllowedNotificationAssistantForUser(I)Landroid/content/ComponentName;
+HPLcom/android/server/notification/NotificationManagerService$9;->getAppActiveNotifications(Ljava/lang/String;I)Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/notification/NotificationManagerService$9;->getAutomaticZenRule(Ljava/lang/String;)Landroid/app/AutomaticZenRule;
+PLcom/android/server/notification/NotificationManagerService$9;->getBackupPayload(I)[B
+PLcom/android/server/notification/NotificationManagerService$9;->getBlockedAppCount(I)I
+PLcom/android/server/notification/NotificationManagerService$9;->getBlockedChannelCount(Ljava/lang/String;I)I
+HPLcom/android/server/notification/NotificationManagerService$9;->getConsolidatedNotificationPolicy()Landroid/app/NotificationManager$Policy;
+HPLcom/android/server/notification/NotificationManagerService$9;->getConversationNotificationChannel(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;ZLjava/lang/String;)Landroid/app/NotificationChannel;
+PLcom/android/server/notification/NotificationManagerService$9;->getConversationsForPackage(Ljava/lang/String;I)Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/notification/NotificationManagerService$9;->getDeletedChannelCount(Ljava/lang/String;I)I
+PLcom/android/server/notification/NotificationManagerService$9;->getEffectsSuppressor()Landroid/content/ComponentName;
+PLcom/android/server/notification/NotificationManagerService$9;->getEnabledNotificationListenerPackages()Ljava/util/List;
+PLcom/android/server/notification/NotificationManagerService$9;->getHistoricalNotifications(Ljava/lang/String;IZ)[Landroid/service/notification/StatusBarNotification;
+PLcom/android/server/notification/NotificationManagerService$9;->getInterruptionFilterFromListener(Landroid/service/notification/INotificationListener;)I
+HPLcom/android/server/notification/NotificationManagerService$9;->getNotificationChannel(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)Landroid/app/NotificationChannel;
+HPLcom/android/server/notification/NotificationManagerService$9;->getNotificationChannelGroup(Ljava/lang/String;Ljava/lang/String;)Landroid/app/NotificationChannelGroup;
+PLcom/android/server/notification/NotificationManagerService$9;->getNotificationChannelGroupForPackage(Ljava/lang/String;Ljava/lang/String;I)Landroid/app/NotificationChannelGroup;
+HPLcom/android/server/notification/NotificationManagerService$9;->getNotificationChannelGroups(Ljava/lang/String;)Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/notification/NotificationManagerService$9;->getNotificationChannelGroupsForPackage(Ljava/lang/String;IZ)Landroid/content/pm/ParceledListSlice;
+HPLcom/android/server/notification/NotificationManagerService$9;->getNotificationChannels(Ljava/lang/String;Ljava/lang/String;I)Landroid/content/pm/ParceledListSlice;
+HPLcom/android/server/notification/NotificationManagerService$9;->getNotificationChannelsBypassingDnd(Ljava/lang/String;I)Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/notification/NotificationManagerService$9;->getNotificationHistory(Ljava/lang/String;)Landroid/app/NotificationHistory;
+HPLcom/android/server/notification/NotificationManagerService$9;->getNotificationPolicy(Ljava/lang/String;)Landroid/app/NotificationManager$Policy;
+PLcom/android/server/notification/NotificationManagerService$9;->getNumNotificationChannelsForPackage(Ljava/lang/String;IZ)I
+PLcom/android/server/notification/NotificationManagerService$9;->getPackageImportance(Ljava/lang/String;)I
+PLcom/android/server/notification/NotificationManagerService$9;->getPrivateNotificationsAllowed()Z
+PLcom/android/server/notification/NotificationManagerService$9;->getSnoozedNotificationsFromListener(Landroid/service/notification/INotificationListener;I)Landroid/content/pm/ParceledListSlice;
+HPLcom/android/server/notification/NotificationManagerService$9;->getZenMode()I
+PLcom/android/server/notification/NotificationManagerService$9;->getZenModeConfig()Landroid/service/notification/ZenModeConfig;
+PLcom/android/server/notification/NotificationManagerService$9;->getZenRules()Ljava/util/List;
+HPLcom/android/server/notification/NotificationManagerService$9;->isNotificationListenerAccessGranted(Landroid/content/ComponentName;)Z
+HPLcom/android/server/notification/NotificationManagerService$9;->isNotificationListenerAccessGrantedForUser(Landroid/content/ComponentName;I)Z
+HPLcom/android/server/notification/NotificationManagerService$9;->isNotificationPolicyAccessGranted(Ljava/lang/String;)Z
+PLcom/android/server/notification/NotificationManagerService$9;->isNotificationPolicyAccessGrantedForPackage(Ljava/lang/String;)Z
+PLcom/android/server/notification/NotificationManagerService$9;->isPackageInForegroundForToast(Ljava/lang/String;I)Z
+PLcom/android/server/notification/NotificationManagerService$9;->isPackagePaused(Ljava/lang/String;)Z
+PLcom/android/server/notification/NotificationManagerService$9;->matchesCallFilter(Landroid/os/Bundle;)Z
+HPLcom/android/server/notification/NotificationManagerService$9;->notifyConditions(Ljava/lang/String;Landroid/service/notification/IConditionProvider;[Landroid/service/notification/Condition;)V
+PLcom/android/server/notification/NotificationManagerService$9;->onlyHasDefaultChannel(Ljava/lang/String;I)Z
+PLcom/android/server/notification/NotificationManagerService$9;->registerListener(Landroid/service/notification/INotificationListener;Landroid/content/ComponentName;I)V
 PLcom/android/server/notification/NotificationManagerService$9;->removeAutoGroup(Ljava/lang/String;)V
 PLcom/android/server/notification/NotificationManagerService$9;->removeAutoGroupSummary(ILjava/lang/String;)V
+PLcom/android/server/notification/NotificationManagerService$9;->removeAutomaticZenRule(Ljava/lang/String;)Z
+PLcom/android/server/notification/NotificationManagerService$9;->removeAutomaticZenRules(Ljava/lang/String;)Z
 PLcom/android/server/notification/NotificationManagerService$9;->repost(ILcom/android/server/notification/NotificationRecord;)V
+HPLcom/android/server/notification/NotificationManagerService$9;->requestBindListener(Landroid/content/ComponentName;)V
+PLcom/android/server/notification/NotificationManagerService$9;->requestBindProvider(Landroid/content/ComponentName;)V
+PLcom/android/server/notification/NotificationManagerService$9;->requestHintsFromListener(Landroid/service/notification/INotificationListener;I)V
+PLcom/android/server/notification/NotificationManagerService$9;->requestUnbindListener(Landroid/service/notification/INotificationListener;)V
+PLcom/android/server/notification/NotificationManagerService$9;->requestUnbindProvider(Landroid/service/notification/IConditionProvider;)V
+HPLcom/android/server/notification/NotificationManagerService$9;->sanitizeSbn(Ljava/lang/String;ILandroid/service/notification/StatusBarNotification;)Landroid/service/notification/StatusBarNotification;
+PLcom/android/server/notification/NotificationManagerService$9;->setInterruptionFilter(Ljava/lang/String;I)V
+PLcom/android/server/notification/NotificationManagerService$9;->setNotificationListenerAccessGranted(Landroid/content/ComponentName;Z)V
+PLcom/android/server/notification/NotificationManagerService$9;->setNotificationListenerAccessGrantedForUser(Landroid/content/ComponentName;IZ)V
+PLcom/android/server/notification/NotificationManagerService$9;->setNotificationPolicy(Ljava/lang/String;Landroid/app/NotificationManager$Policy;)V
+PLcom/android/server/notification/NotificationManagerService$9;->setNotificationPolicyAccessGranted(Ljava/lang/String;Z)V
+PLcom/android/server/notification/NotificationManagerService$9;->setNotificationPolicyAccessGrantedForUser(Ljava/lang/String;IZ)V
+PLcom/android/server/notification/NotificationManagerService$9;->setNotificationsEnabledForPackage(Ljava/lang/String;IZ)V
+HPLcom/android/server/notification/NotificationManagerService$9;->setNotificationsShownFromListener(Landroid/service/notification/INotificationListener;[Ljava/lang/String;)V
+PLcom/android/server/notification/NotificationManagerService$9;->setPrivateNotificationsAllowed(Z)V
+PLcom/android/server/notification/NotificationManagerService$9;->setZenMode(ILandroid/net/Uri;Ljava/lang/String;)V
+PLcom/android/server/notification/NotificationManagerService$9;->shouldHideSilentStatusIcons(Ljava/lang/String;)Z
+HPLcom/android/server/notification/NotificationManagerService$9;->silenceNotificationSound()V
+PLcom/android/server/notification/NotificationManagerService$9;->unregisterListener(Landroid/service/notification/INotificationListener;I)V
 HPLcom/android/server/notification/NotificationManagerService$9;->updateAutogroupSummary(Ljava/lang/String;Z)V
+PLcom/android/server/notification/NotificationManagerService$9;->updateAutomaticZenRule(Ljava/lang/String;Landroid/app/AutomaticZenRule;)Z
+PLcom/android/server/notification/NotificationManagerService$9;->updateNotificationChannelForPackage(Ljava/lang/String;ILandroid/app/NotificationChannel;)V
 HSPLcom/android/server/notification/NotificationManagerService$Archive;-><init>(I)V
 PLcom/android/server/notification/NotificationManagerService$Archive;->descendingIterator()Ljava/util/Iterator;
 PLcom/android/server/notification/NotificationManagerService$Archive;->getArray(I)[Landroid/service/notification/StatusBarNotification;
@@ -23179,6 +25166,7 @@
 PLcom/android/server/notification/NotificationManagerService$NotificationAssistants;->access$7900(Lcom/android/server/notification/NotificationManagerService$NotificationAssistants;Lcom/android/server/notification/NotificationRecord;)V
 HPLcom/android/server/notification/NotificationManagerService$NotificationAssistants;->access$8100(Lcom/android/server/notification/NotificationManagerService$NotificationAssistants;Lcom/android/server/notification/NotificationRecord;)V
 PLcom/android/server/notification/NotificationManagerService$NotificationAssistants;->access$8200(Lcom/android/server/notification/NotificationManagerService$NotificationAssistants;Lcom/android/server/notification/NotificationRecord;)V
+PLcom/android/server/notification/NotificationManagerService$NotificationAssistants;->access$8500(Lcom/android/server/notification/NotificationManagerService$NotificationAssistants;Lcom/android/server/notification/NotificationRecord;)V
 PLcom/android/server/notification/NotificationManagerService$NotificationAssistants;->access$8600(Lcom/android/server/notification/NotificationManagerService$NotificationAssistants;Lcom/android/server/notification/NotificationRecord;)V
 PLcom/android/server/notification/NotificationManagerService$NotificationAssistants;->access$8700(Lcom/android/server/notification/NotificationManagerService$NotificationAssistants;Lcom/android/server/notification/NotificationRecord;)V
 HSPLcom/android/server/notification/NotificationManagerService$NotificationAssistants;->asInterface(Landroid/os/IBinder;)Landroid/os/IInterface;
@@ -23254,15 +25242,23 @@
 PLcom/android/server/notification/NotificationManagerService$NotificationListeners;->access$10400(Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;I)V
 HPLcom/android/server/notification/NotificationManagerService$NotificationListeners;->access$10400(Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Landroid/service/notification/NotificationRankingUpdate;)V
 PLcom/android/server/notification/NotificationManagerService$NotificationListeners;->access$10400(Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Landroid/service/notification/StatusBarNotification;Landroid/service/notification/NotificationRankingUpdate;)V
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners;->access$10400(Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Landroid/service/notification/StatusBarNotification;Landroid/service/notification/NotificationRankingUpdate;Landroid/service/notification/NotificationStats;I)V
 PLcom/android/server/notification/NotificationManagerService$NotificationListeners;->access$10500(Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;I)V
 PLcom/android/server/notification/NotificationManagerService$NotificationListeners;->access$10500(Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Landroid/service/notification/NotificationRankingUpdate;)V
+HPLcom/android/server/notification/NotificationManagerService$NotificationListeners;->access$10500(Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Landroid/service/notification/StatusBarNotification;Landroid/service/notification/NotificationRankingUpdate;)V
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners;->access$10500(Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Landroid/service/notification/StatusBarNotification;Landroid/service/notification/NotificationRankingUpdate;Landroid/service/notification/NotificationStats;I)V
 PLcom/android/server/notification/NotificationManagerService$NotificationListeners;->access$10600(Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;I)V
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners;->access$10600(Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Landroid/service/notification/NotificationRankingUpdate;)V
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners;->access$10600(Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Landroid/service/notification/StatusBarNotification;Landroid/service/notification/NotificationRankingUpdate;)V
 PLcom/android/server/notification/NotificationManagerService$NotificationListeners;->access$10600(Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Landroid/service/notification/StatusBarNotification;Landroid/service/notification/NotificationRankingUpdate;Landroid/service/notification/NotificationStats;I)V
 PLcom/android/server/notification/NotificationManagerService$NotificationListeners;->access$10700(Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;I)V
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners;->access$10700(Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Landroid/service/notification/NotificationRankingUpdate;)V
 PLcom/android/server/notification/NotificationManagerService$NotificationListeners;->access$10700(Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Landroid/service/notification/StatusBarNotification;Landroid/service/notification/NotificationRankingUpdate;)V
 PLcom/android/server/notification/NotificationManagerService$NotificationListeners;->access$10700(Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Landroid/service/notification/StatusBarNotification;Landroid/service/notification/NotificationRankingUpdate;Landroid/service/notification/NotificationStats;I)V
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners;->access$10800(Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;I)V
 PLcom/android/server/notification/NotificationManagerService$NotificationListeners;->access$10800(Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Landroid/service/notification/NotificationRankingUpdate;)V
 PLcom/android/server/notification/NotificationManagerService$NotificationListeners;->access$10800(Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Landroid/service/notification/StatusBarNotification;Landroid/service/notification/NotificationRankingUpdate;)V
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners;->access$10900(Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;I)V
 PLcom/android/server/notification/NotificationManagerService$NotificationListeners;->access$10900(Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Landroid/service/notification/NotificationRankingUpdate;)V
 PLcom/android/server/notification/NotificationManagerService$NotificationListeners;->access$11000(Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;I)V
 PLcom/android/server/notification/NotificationManagerService$NotificationListeners;->access$11100(Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;I)V
@@ -23345,24 +25341,31 @@
 HSPLcom/android/server/notification/NotificationManagerService;-><init>(Landroid/content/Context;Lcom/android/server/notification/NotificationRecordLogger;)V
 HSPLcom/android/server/notification/NotificationManagerService;-><init>(Landroid/content/Context;Lcom/android/server/notification/NotificationRecordLogger;Lcom/android/internal/logging/InstanceIdSequence;)V
 HSPLcom/android/server/notification/NotificationManagerService;->access$100(Lcom/android/server/notification/NotificationManagerService;)Landroid/util/AtomicFile;
+PLcom/android/server/notification/NotificationManagerService;->access$1000(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/internal/logging/MetricsLogger;
 HSPLcom/android/server/notification/NotificationManagerService;->access$1000(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/NotificationManagerService$WorkerHandler;
 PLcom/android/server/notification/NotificationManagerService;->access$10000(Lcom/android/server/notification/NotificationManagerService;I)V
+PLcom/android/server/notification/NotificationManagerService;->access$10000(Lcom/android/server/notification/NotificationManagerService;Landroid/os/Message;)V
 HSPLcom/android/server/notification/NotificationManagerService;->access$10000(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;)Landroid/service/notification/NotificationRankingUpdate;
+HPLcom/android/server/notification/NotificationManagerService;->access$10000(Lcom/android/server/notification/NotificationManagerService;Ljava/util/ArrayList;IILjava/lang/String;ZLjava/lang/String;Lcom/android/server/notification/NotificationManagerService$FlagChecker;ZIZILjava/lang/String;Z)V
 PLcom/android/server/notification/NotificationManagerService;->access$10100(Lcom/android/server/notification/NotificationManagerService;I)V
 PLcom/android/server/notification/NotificationManagerService;->access$10100(Lcom/android/server/notification/NotificationManagerService;Landroid/os/Message;)V
 HPLcom/android/server/notification/NotificationManagerService;->access$10100(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;)Landroid/service/notification/NotificationRankingUpdate;
+HPLcom/android/server/notification/NotificationManagerService;->access$10100(Lcom/android/server/notification/NotificationManagerService;Ljava/util/ArrayList;IILjava/lang/String;ZLjava/lang/String;Lcom/android/server/notification/NotificationManagerService$FlagChecker;ZIZILjava/lang/String;Z)V
 PLcom/android/server/notification/NotificationManagerService;->access$10200(Lcom/android/server/notification/NotificationManagerService;Landroid/os/Message;)V
 HPLcom/android/server/notification/NotificationManagerService;->access$10200(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;)Landroid/service/notification/NotificationRankingUpdate;
 HSPLcom/android/server/notification/NotificationManagerService;->access$10200(Lcom/android/server/notification/NotificationManagerService;Ljava/util/ArrayList;IILjava/lang/String;ZLjava/lang/String;Lcom/android/server/notification/NotificationManagerService$FlagChecker;ZIZILjava/lang/String;Z)V
+HPLcom/android/server/notification/NotificationManagerService;->access$10300(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;)Landroid/service/notification/NotificationRankingUpdate;
 HPLcom/android/server/notification/NotificationManagerService;->access$10300(Lcom/android/server/notification/NotificationManagerService;Ljava/util/ArrayList;IILjava/lang/String;ZLjava/lang/String;Lcom/android/server/notification/NotificationManagerService$FlagChecker;ZIZILjava/lang/String;Z)V
+PLcom/android/server/notification/NotificationManagerService;->access$10400(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;)Landroid/service/notification/NotificationRankingUpdate;
 PLcom/android/server/notification/NotificationManagerService;->access$10500(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;)Landroid/service/notification/NotificationRankingUpdate;
 PLcom/android/server/notification/NotificationManagerService;->access$10600(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;)Landroid/service/notification/NotificationRankingUpdate;
+HPLcom/android/server/notification/NotificationManagerService;->access$1100(Lcom/android/server/notification/NotificationManagerService;)Landroid/app/ActivityManager;
 HPLcom/android/server/notification/NotificationManagerService;->access$1100(Lcom/android/server/notification/NotificationManagerService;)Landroid/content/pm/IPackageManager;
 HPLcom/android/server/notification/NotificationManagerService;->access$1100(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/NotificationManagerService$WorkerHandler;
 HPLcom/android/server/notification/NotificationManagerService;->access$1200(Lcom/android/server/notification/NotificationManagerService;)Landroid/content/pm/IPackageManager;
-PLcom/android/server/notification/NotificationManagerService;->access$1200(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/NotificationManagerService$WorkerHandler;
-PLcom/android/server/notification/NotificationManagerService;->access$1300(Lcom/android/server/notification/NotificationManagerService;)Landroid/content/pm/IPackageManager;
-PLcom/android/server/notification/NotificationManagerService;->access$1400(Lcom/android/server/notification/NotificationManagerService;)Landroid/content/pm/IPackageManager;
+HPLcom/android/server/notification/NotificationManagerService;->access$1200(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/NotificationManagerService$WorkerHandler;
+HPLcom/android/server/notification/NotificationManagerService;->access$1300(Lcom/android/server/notification/NotificationManagerService;)Landroid/content/pm/IPackageManager;
+HPLcom/android/server/notification/NotificationManagerService;->access$1400(Lcom/android/server/notification/NotificationManagerService;)Landroid/content/pm/IPackageManager;
 HSPLcom/android/server/notification/NotificationManagerService;->access$1500(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/NotificationManagerService$NotificationListeners;
 HSPLcom/android/server/notification/NotificationManagerService;->access$1500(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/PreferencesHelper;
 HSPLcom/android/server/notification/NotificationManagerService;->access$1600(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/ConditionProviders;
@@ -23373,15 +25376,17 @@
 HSPLcom/android/server/notification/NotificationManagerService;->access$1700(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/NotificationManagerService$NotificationListeners;
 PLcom/android/server/notification/NotificationManagerService;->access$1800()Ljava/lang/String;
 HSPLcom/android/server/notification/NotificationManagerService;->access$1800(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/ConditionProviders;
-PLcom/android/server/notification/NotificationManagerService;->access$1800(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/NotificationManagerService$NotificationListeners;
+HPLcom/android/server/notification/NotificationManagerService;->access$1800(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/NotificationManagerService$NotificationListeners;
 PLcom/android/server/notification/NotificationManagerService;->access$1800(Lcom/android/server/notification/NotificationManagerService;Ljava/lang/String;)Lcom/android/server/notification/NotificationRecord;
 HSPLcom/android/server/notification/NotificationManagerService;->access$1900()I
 PLcom/android/server/notification/NotificationManagerService;->access$1900(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/ConditionProviders;
 PLcom/android/server/notification/NotificationManagerService;->access$1900(Lcom/android/server/notification/NotificationManagerService;Ljava/lang/String;)Lcom/android/server/notification/NotificationRecord;
 HSPLcom/android/server/notification/NotificationManagerService;->access$200(Lcom/android/server/notification/NotificationManagerService;Ljava/io/OutputStream;ZI)V
 HSPLcom/android/server/notification/NotificationManagerService;->access$2000()I
+PLcom/android/server/notification/NotificationManagerService;->access$2000()Ljava/lang/String;
 HSPLcom/android/server/notification/NotificationManagerService;->access$2100()I
 HPLcom/android/server/notification/NotificationManagerService;->access$2100(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/NotificationManagerService$WorkerHandler;
+PLcom/android/server/notification/NotificationManagerService;->access$2100(Lcom/android/server/notification/NotificationManagerService;Ljava/lang/String;)Lcom/android/server/notification/NotificationRecord;
 HSPLcom/android/server/notification/NotificationManagerService;->access$2200()I
 HSPLcom/android/server/notification/NotificationManagerService;->access$2200(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/NotificationManagerService$WorkerHandler;
 HSPLcom/android/server/notification/NotificationManagerService;->access$2200(Lcom/android/server/notification/NotificationManagerService;)V
@@ -23424,50 +25429,79 @@
 PLcom/android/server/notification/NotificationManagerService;->access$3200(Lcom/android/server/notification/NotificationManagerService;ILjava/lang/String;Ljava/lang/String;)V
 HPLcom/android/server/notification/NotificationManagerService;->access$3300(Lcom/android/server/notification/NotificationManagerService;)Landroid/app/ActivityManager;
 HPLcom/android/server/notification/NotificationManagerService;->access$3300(Lcom/android/server/notification/NotificationManagerService;ILjava/lang/String;)V
+PLcom/android/server/notification/NotificationManagerService;->access$3300(Lcom/android/server/notification/NotificationManagerService;ILjava/lang/String;Ljava/lang/String;)V
 PLcom/android/server/notification/NotificationManagerService;->access$3400(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/internal/compat/IPlatformCompat;
+HPLcom/android/server/notification/NotificationManagerService;->access$3400(Lcom/android/server/notification/NotificationManagerService;ILjava/lang/String;)V
 PLcom/android/server/notification/NotificationManagerService;->access$3400(Lcom/android/server/notification/NotificationManagerService;ILjava/util/List;)I
 PLcom/android/server/notification/NotificationManagerService;->access$3500(Lcom/android/server/notification/NotificationManagerService;)Landroid/os/Handler;
+PLcom/android/server/notification/NotificationManagerService;->access$3500(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/internal/compat/IPlatformCompat;
+PLcom/android/server/notification/NotificationManagerService;->access$3500(Lcom/android/server/notification/NotificationManagerService;ILjava/lang/String;Ljava/lang/String;)V
 HPLcom/android/server/notification/NotificationManagerService;->access$3600(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/wm/WindowManagerInternal;
 PLcom/android/server/notification/NotificationManagerService;->access$3600(Lcom/android/server/notification/NotificationManagerService;ILjava/lang/String;)V
+PLcom/android/server/notification/NotificationManagerService;->access$3700(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/internal/compat/IPlatformCompat;
+PLcom/android/server/notification/NotificationManagerService;->access$3700(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/wm/WindowManagerInternal;
 HPLcom/android/server/notification/NotificationManagerService;->access$3700(Lcom/android/server/notification/NotificationManagerService;ILjava/lang/String;Landroid/os/IBinder;Ljava/lang/CharSequence;Landroid/app/ITransientNotification;ILandroid/os/Binder;ILandroid/app/ITransientNotificationCallback;)Lcom/android/server/notification/toast/ToastRecord;
 HSPLcom/android/server/notification/NotificationManagerService;->access$3700(Lcom/android/server/notification/NotificationManagerService;Ljava/lang/String;)V
+PLcom/android/server/notification/NotificationManagerService;->access$3800(Lcom/android/server/notification/NotificationManagerService;)Landroid/os/Handler;
+PLcom/android/server/notification/NotificationManagerService;->access$3800(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/wm/WindowManagerInternal;
 PLcom/android/server/notification/NotificationManagerService;->access$3800(Lcom/android/server/notification/NotificationManagerService;)V
 HPLcom/android/server/notification/NotificationManagerService;->access$3800(Lcom/android/server/notification/NotificationManagerService;I)V
+PLcom/android/server/notification/NotificationManagerService;->access$3800(Lcom/android/server/notification/NotificationManagerService;ILjava/lang/String;Landroid/os/IBinder;Ljava/lang/CharSequence;Landroid/app/ITransientNotification;ILandroid/os/Binder;ILandroid/app/ITransientNotificationCallback;)Lcom/android/server/notification/toast/ToastRecord;
+PLcom/android/server/notification/NotificationManagerService;->access$3900(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/wm/ActivityTaskManagerInternal;
 PLcom/android/server/notification/NotificationManagerService;->access$3900(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/wm/WindowManagerInternal;
+PLcom/android/server/notification/NotificationManagerService;->access$3900(Lcom/android/server/notification/NotificationManagerService;I)V
+PLcom/android/server/notification/NotificationManagerService;->access$3900(Lcom/android/server/notification/NotificationManagerService;IILjava/lang/String;Landroid/os/IBinder;Ljava/lang/CharSequence;Landroid/app/ITransientNotification;ILandroid/os/Binder;ILandroid/app/ITransientNotificationCallback;)Lcom/android/server/notification/toast/ToastRecord;
+PLcom/android/server/notification/NotificationManagerService;->access$3900(Lcom/android/server/notification/NotificationManagerService;ILjava/lang/String;Landroid/os/IBinder;Ljava/lang/CharSequence;Landroid/app/ITransientNotification;ILandroid/os/Binder;ILandroid/app/ITransientNotificationCallback;)Lcom/android/server/notification/toast/ToastRecord;
 HSPLcom/android/server/notification/NotificationManagerService;->access$3900(Lcom/android/server/notification/NotificationManagerService;Ljava/lang/String;)V
 HPLcom/android/server/notification/NotificationManagerService;->access$400(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;)Ljava/lang/String;
+PLcom/android/server/notification/NotificationManagerService;->access$4000(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/wm/ActivityTaskManagerInternal;
 HPLcom/android/server/notification/NotificationManagerService;->access$4000(Lcom/android/server/notification/NotificationManagerService;)V
+PLcom/android/server/notification/NotificationManagerService;->access$4000(Lcom/android/server/notification/NotificationManagerService;I)V
 PLcom/android/server/notification/NotificationManagerService;->access$4000(Lcom/android/server/notification/NotificationManagerService;ILjava/lang/String;Landroid/os/IBinder;Ljava/lang/CharSequence;Landroid/app/ITransientNotification;ILandroid/os/Binder;ILandroid/app/ITransientNotificationCallback;)Lcom/android/server/notification/toast/ToastRecord;
+HPLcom/android/server/notification/NotificationManagerService;->access$4000(Lcom/android/server/notification/NotificationManagerService;Ljava/lang/String;)V
 PLcom/android/server/notification/NotificationManagerService;->access$4000(Lcom/android/server/notification/NotificationManagerService;Ljava/lang/String;ILandroid/app/NotificationChannelGroup;ZZ)V
 PLcom/android/server/notification/NotificationManagerService;->access$402(Lcom/android/server/notification/NotificationManagerService;Z)Z
 HSPLcom/android/server/notification/NotificationManagerService;->access$4100(Lcom/android/server/notification/NotificationManagerService;)Landroid/content/pm/PackageManager;
+PLcom/android/server/notification/NotificationManagerService;->access$4100(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/wm/ActivityTaskManagerInternal;
+PLcom/android/server/notification/NotificationManagerService;->access$4100(Lcom/android/server/notification/NotificationManagerService;)V
 PLcom/android/server/notification/NotificationManagerService;->access$4100(Lcom/android/server/notification/NotificationManagerService;I)V
 HSPLcom/android/server/notification/NotificationManagerService;->access$4100(Lcom/android/server/notification/NotificationManagerService;Ljava/lang/String;)V
 HPLcom/android/server/notification/NotificationManagerService;->access$4200(Lcom/android/server/notification/NotificationManagerService;)Landroid/content/pm/PackageManager;
+HPLcom/android/server/notification/NotificationManagerService;->access$4200(Lcom/android/server/notification/NotificationManagerService;)V
 HSPLcom/android/server/notification/NotificationManagerService;->access$4200(Lcom/android/server/notification/NotificationManagerService;Ljava/lang/String;)V
 PLcom/android/server/notification/NotificationManagerService;->access$4200(Lcom/android/server/notification/NotificationManagerService;Ljava/lang/String;ILandroid/app/NotificationChannel;Z)V
 HPLcom/android/server/notification/NotificationManagerService;->access$4200(Lcom/android/server/notification/NotificationManagerService;Ljava/lang/String;ILandroid/app/NotificationChannelGroup;ZZ)V
 HSPLcom/android/server/notification/NotificationManagerService;->access$4300(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/SnoozeHelper;
 PLcom/android/server/notification/NotificationManagerService;->access$4300(Lcom/android/server/notification/NotificationManagerService;)V
 PLcom/android/server/notification/NotificationManagerService;->access$4300(Lcom/android/server/notification/NotificationManagerService;)Z
+HPLcom/android/server/notification/NotificationManagerService;->access$4300(Lcom/android/server/notification/NotificationManagerService;Ljava/lang/String;)V
+PLcom/android/server/notification/NotificationManagerService;->access$4300(Lcom/android/server/notification/NotificationManagerService;Ljava/lang/String;ILandroid/app/NotificationChannelGroup;ZZ)V
 HSPLcom/android/server/notification/NotificationManagerService;->access$4400(Lcom/android/server/notification/NotificationManagerService;)Landroid/content/pm/PackageManager;
 HPLcom/android/server/notification/NotificationManagerService;->access$4400(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/SnoozeHelper;
 PLcom/android/server/notification/NotificationManagerService;->access$4400(Lcom/android/server/notification/NotificationManagerService;)V
 HSPLcom/android/server/notification/NotificationManagerService;->access$4400(Lcom/android/server/notification/NotificationManagerService;Ljava/lang/String;)V
+PLcom/android/server/notification/NotificationManagerService;->access$4400(Lcom/android/server/notification/NotificationManagerService;Ljava/lang/String;ILandroid/app/NotificationChannelGroup;ZZ)V
+PLcom/android/server/notification/NotificationManagerService;->access$4500(Lcom/android/server/notification/NotificationManagerService;)Landroid/content/pm/PackageManager;
 PLcom/android/server/notification/NotificationManagerService;->access$4500(Lcom/android/server/notification/NotificationManagerService;)V
 PLcom/android/server/notification/NotificationManagerService;->access$4500(Lcom/android/server/notification/NotificationManagerService;Ljava/lang/String;ILandroid/app/NotificationChannel;Z)V
 PLcom/android/server/notification/NotificationManagerService;->access$4500(Lcom/android/server/notification/NotificationManagerService;Ljava/lang/String;ILandroid/app/NotificationChannelGroup;ZZ)V
 PLcom/android/server/notification/NotificationManagerService;->access$4600(Lcom/android/server/notification/NotificationManagerService;)Landroid/content/pm/LauncherApps;
+PLcom/android/server/notification/NotificationManagerService;->access$4600(Lcom/android/server/notification/NotificationManagerService;)Landroid/content/pm/PackageManager;
 HSPLcom/android/server/notification/NotificationManagerService;->access$4600(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/SnoozeHelper;
 HSPLcom/android/server/notification/NotificationManagerService;->access$4700(Lcom/android/server/notification/NotificationManagerService;)Landroid/content/pm/PackageManager;
 HSPLcom/android/server/notification/NotificationManagerService;->access$4700(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/SnoozeHelper;
 PLcom/android/server/notification/NotificationManagerService;->access$4700(Lcom/android/server/notification/NotificationManagerService;)V
 HSPLcom/android/server/notification/NotificationManagerService;->access$4700(Lcom/android/server/notification/NotificationManagerService;Landroid/service/notification/StatusBarNotification;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;)Z
+PLcom/android/server/notification/NotificationManagerService;->access$4700(Lcom/android/server/notification/NotificationManagerService;Ljava/lang/String;ILandroid/app/NotificationChannel;Z)V
 PLcom/android/server/notification/NotificationManagerService;->access$4800(Lcom/android/server/notification/NotificationManagerService;)Landroid/app/AppOpsManager;
+PLcom/android/server/notification/NotificationManagerService;->access$4800(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/ShortcutHelper;
+PLcom/android/server/notification/NotificationManagerService;->access$4800(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/SnoozeHelper;
 PLcom/android/server/notification/NotificationManagerService;->access$4800(Lcom/android/server/notification/NotificationManagerService;)V
 HPLcom/android/server/notification/NotificationManagerService;->access$4800(Lcom/android/server/notification/NotificationManagerService;Landroid/service/notification/StatusBarNotification;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;)Z
 PLcom/android/server/notification/NotificationManagerService;->access$4800(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;)Z
 PLcom/android/server/notification/NotificationManagerService;->access$4900(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/NotificationManagerService$Archive;
+PLcom/android/server/notification/NotificationManagerService;->access$4900(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/ShortcutHelper;
+HPLcom/android/server/notification/NotificationManagerService;->access$4900(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/SnoozeHelper;
 PLcom/android/server/notification/NotificationManagerService;->access$4900(Lcom/android/server/notification/NotificationManagerService;)V
 PLcom/android/server/notification/NotificationManagerService;->access$4900(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;)Z
 PLcom/android/server/notification/NotificationManagerService;->access$500(Lcom/android/server/notification/NotificationManagerService;)V
@@ -23475,45 +25509,57 @@
 HSPLcom/android/server/notification/NotificationManagerService;->access$5000(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/SnoozeHelper;
 PLcom/android/server/notification/NotificationManagerService;->access$5000(Lcom/android/server/notification/NotificationManagerService;)V
 HPLcom/android/server/notification/NotificationManagerService;->access$5000(Lcom/android/server/notification/NotificationManagerService;Landroid/service/notification/StatusBarNotification;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;)Z
+PLcom/android/server/notification/NotificationManagerService;->access$5100(Lcom/android/server/notification/NotificationManagerService;)Landroid/app/AppOpsManager;
 PLcom/android/server/notification/NotificationManagerService;->access$5100(Lcom/android/server/notification/NotificationManagerService;)V
 HPLcom/android/server/notification/NotificationManagerService;->access$5100(Lcom/android/server/notification/NotificationManagerService;Landroid/service/notification/StatusBarNotification;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;)Z
 PLcom/android/server/notification/NotificationManagerService;->access$5100(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;)Z
 PLcom/android/server/notification/NotificationManagerService;->access$5100(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;I)V
 PLcom/android/server/notification/NotificationManagerService;->access$5200(Lcom/android/server/notification/NotificationManagerService;)Landroid/app/AppOpsManager;
+PLcom/android/server/notification/NotificationManagerService;->access$5200(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/NotificationManagerService$Archive;
 PLcom/android/server/notification/NotificationManagerService;->access$5200(Lcom/android/server/notification/NotificationManagerService;)V
+PLcom/android/server/notification/NotificationManagerService;->access$5200(Lcom/android/server/notification/NotificationManagerService;Landroid/service/notification/StatusBarNotification;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;)Z
 PLcom/android/server/notification/NotificationManagerService;->access$5200(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;)Z
 PLcom/android/server/notification/NotificationManagerService;->access$5200(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;I)V
 PLcom/android/server/notification/NotificationManagerService;->access$5200(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;I)Z
 PLcom/android/server/notification/NotificationManagerService;->access$5300(Lcom/android/server/notification/NotificationManagerService;)I
 PLcom/android/server/notification/NotificationManagerService;->access$5300(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/NotificationManagerService$Archive;
 PLcom/android/server/notification/NotificationManagerService;->access$5300(Lcom/android/server/notification/NotificationManagerService;)V
+PLcom/android/server/notification/NotificationManagerService;->access$5300(Lcom/android/server/notification/NotificationManagerService;Landroid/service/notification/StatusBarNotification;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;)Z
 PLcom/android/server/notification/NotificationManagerService;->access$5300(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;I)Z
 PLcom/android/server/notification/NotificationManagerService;->access$5400(Lcom/android/server/notification/NotificationManagerService;)I
 PLcom/android/server/notification/NotificationManagerService;->access$5400(Lcom/android/server/notification/NotificationManagerService;)V
-PLcom/android/server/notification/NotificationManagerService;->access$5400(Lcom/android/server/notification/NotificationManagerService;Landroid/service/notification/StatusBarNotification;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;)Z
+HPLcom/android/server/notification/NotificationManagerService;->access$5400(Lcom/android/server/notification/NotificationManagerService;Landroid/service/notification/StatusBarNotification;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;)Z
+PLcom/android/server/notification/NotificationManagerService;->access$5400(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;)Z
 PLcom/android/server/notification/NotificationManagerService;->access$5400(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;I)V
 PLcom/android/server/notification/NotificationManagerService;->access$5500(Lcom/android/server/notification/NotificationManagerService;)I
 PLcom/android/server/notification/NotificationManagerService;->access$5500(Lcom/android/server/notification/NotificationManagerService;)Landroid/app/admin/DevicePolicyManagerInternal;
+PLcom/android/server/notification/NotificationManagerService;->access$5500(Lcom/android/server/notification/NotificationManagerService;)V
 PLcom/android/server/notification/NotificationManagerService;->access$5500(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;)Z
 PLcom/android/server/notification/NotificationManagerService;->access$5500(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;I)V
 PLcom/android/server/notification/NotificationManagerService;->access$5500(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;I)Z
 PLcom/android/server/notification/NotificationManagerService;->access$5600(Lcom/android/server/notification/NotificationManagerService;)I
 PLcom/android/server/notification/NotificationManagerService;->access$5600(Lcom/android/server/notification/NotificationManagerService;)Landroid/app/admin/DevicePolicyManagerInternal;
+PLcom/android/server/notification/NotificationManagerService;->access$5600(Lcom/android/server/notification/NotificationManagerService;)V
 PLcom/android/server/notification/NotificationManagerService;->access$5600(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;I)Z
 PLcom/android/server/notification/NotificationManagerService;->access$5600(Lcom/android/server/notification/NotificationManagerService;Ljava/io/PrintWriter;Lcom/android/server/notification/NotificationManagerService$DumpFilter;)V
 PLcom/android/server/notification/NotificationManagerService;->access$5700(Lcom/android/server/notification/NotificationManagerService;)I
+PLcom/android/server/notification/NotificationManagerService;->access$5700(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;I)V
 PLcom/android/server/notification/NotificationManagerService;->access$5700(Lcom/android/server/notification/NotificationManagerService;Ljava/io/PrintWriter;Lcom/android/server/notification/NotificationManagerService$DumpFilter;)V
 PLcom/android/server/notification/NotificationManagerService;->access$5800(Lcom/android/server/notification/NotificationManagerService;)I
 PLcom/android/server/notification/NotificationManagerService;->access$5800(Lcom/android/server/notification/NotificationManagerService;)Landroid/app/admin/DevicePolicyManagerInternal;
+PLcom/android/server/notification/NotificationManagerService;->access$5800(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;I)Z
 PLcom/android/server/notification/NotificationManagerService;->access$5800(Lcom/android/server/notification/NotificationManagerService;Ljava/io/FileDescriptor;Lcom/android/server/notification/NotificationManagerService$DumpFilter;)V
 PLcom/android/server/notification/NotificationManagerService;->access$5900(Lcom/android/server/notification/NotificationManagerService;)Landroid/app/admin/DevicePolicyManagerInternal;
 PLcom/android/server/notification/NotificationManagerService;->access$5900(Lcom/android/server/notification/NotificationManagerService;Ljava/io/FileDescriptor;Lcom/android/server/notification/NotificationManagerService$DumpFilter;)V
 PLcom/android/server/notification/NotificationManagerService;->access$5900(Lcom/android/server/notification/NotificationManagerService;Ljava/io/PrintWriter;Lcom/android/server/notification/NotificationManagerService$DumpFilter;)V
 HSPLcom/android/server/notification/NotificationManagerService;->access$600(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/NotificationManagerService$NotificationAssistants;
-PLcom/android/server/notification/NotificationManagerService;->access$600(Lcom/android/server/notification/NotificationManagerService;)V
+HPLcom/android/server/notification/NotificationManagerService;->access$600(Lcom/android/server/notification/NotificationManagerService;)V
+PLcom/android/server/notification/NotificationManagerService;->access$6000(Lcom/android/server/notification/NotificationManagerService;)I
+PLcom/android/server/notification/NotificationManagerService;->access$6000(Lcom/android/server/notification/NotificationManagerService;)Landroid/app/admin/DevicePolicyManagerInternal;
 PLcom/android/server/notification/NotificationManagerService;->access$6000(Lcom/android/server/notification/NotificationManagerService;)Ljava/util/List;
 PLcom/android/server/notification/NotificationManagerService;->access$6000(Lcom/android/server/notification/NotificationManagerService;Ljava/io/PrintWriter;Lcom/android/server/notification/NotificationManagerService$DumpFilter;)V
 PLcom/android/server/notification/NotificationManagerService;->access$6100(Lcom/android/server/notification/NotificationManagerService;)I
+PLcom/android/server/notification/NotificationManagerService;->access$6100(Lcom/android/server/notification/NotificationManagerService;)Landroid/app/admin/DevicePolicyManagerInternal;
 HSPLcom/android/server/notification/NotificationManagerService;->access$6100(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/RankingHelper;
 PLcom/android/server/notification/NotificationManagerService;->access$6100(Lcom/android/server/notification/NotificationManagerService;)Ljava/util/List;
 PLcom/android/server/notification/NotificationManagerService;->access$6100(Lcom/android/server/notification/NotificationManagerService;Ljava/io/FileDescriptor;Lcom/android/server/notification/NotificationManagerService$DumpFilter;)V
@@ -23525,66 +25571,93 @@
 HSPLcom/android/server/notification/NotificationManagerService;->access$6300(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/internal/util/function/TriPredicate;
 HSPLcom/android/server/notification/NotificationManagerService;->access$6300(Lcom/android/server/notification/NotificationManagerService;)Ljava/util/List;
 HSPLcom/android/server/notification/NotificationManagerService;->access$6300(Lcom/android/server/notification/NotificationManagerService;)V
+PLcom/android/server/notification/NotificationManagerService;->access$6300(Lcom/android/server/notification/NotificationManagerService;Ljava/io/FileDescriptor;Lcom/android/server/notification/NotificationManagerService$DumpFilter;)V
 PLcom/android/server/notification/NotificationManagerService;->access$6300(Lcom/android/server/notification/NotificationManagerService;Ljava/io/PrintWriter;Lcom/android/server/notification/NotificationManagerService$DumpFilter;)V
 HSPLcom/android/server/notification/NotificationManagerService;->access$6400(Lcom/android/server/notification/NotificationManagerService;)Landroid/os/UserManager;
 HSPLcom/android/server/notification/NotificationManagerService;->access$6400(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/internal/util/function/TriPredicate;
 HPLcom/android/server/notification/NotificationManagerService;->access$6400(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/RankingHelper;
 PLcom/android/server/notification/NotificationManagerService;->access$6400(Lcom/android/server/notification/NotificationManagerService;)Ljava/util/List;
+PLcom/android/server/notification/NotificationManagerService;->access$6400(Lcom/android/server/notification/NotificationManagerService;Ljava/io/FileDescriptor;Lcom/android/server/notification/NotificationManagerService$DumpFilter;)V
+PLcom/android/server/notification/NotificationManagerService;->access$6400(Lcom/android/server/notification/NotificationManagerService;Ljava/io/PrintWriter;Lcom/android/server/notification/NotificationManagerService$DumpFilter;)V
 HSPLcom/android/server/notification/NotificationManagerService;->access$6500(Lcom/android/server/notification/NotificationManagerService;)Landroid/os/UserManager;
 PLcom/android/server/notification/NotificationManagerService;->access$6500(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/RankingHelper;
+PLcom/android/server/notification/NotificationManagerService;->access$6500(Lcom/android/server/notification/NotificationManagerService;)Ljava/util/List;
 HSPLcom/android/server/notification/NotificationManagerService;->access$6500(Lcom/android/server/notification/NotificationManagerService;)V
 PLcom/android/server/notification/NotificationManagerService;->access$6500(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;Landroid/service/notification/Adjustment;)V
+PLcom/android/server/notification/NotificationManagerService;->access$6500(Lcom/android/server/notification/NotificationManagerService;Ljava/io/PrintWriter;Lcom/android/server/notification/NotificationManagerService$DumpFilter;)V
 HSPLcom/android/server/notification/NotificationManagerService;->access$6600(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/internal/util/function/TriPredicate;
+PLcom/android/server/notification/NotificationManagerService;->access$6600(Lcom/android/server/notification/NotificationManagerService;)Ljava/util/List;
 HSPLcom/android/server/notification/NotificationManagerService;->access$6600(Lcom/android/server/notification/NotificationManagerService;)V
 PLcom/android/server/notification/NotificationManagerService;->access$6600(Lcom/android/server/notification/NotificationManagerService;)Z
 PLcom/android/server/notification/NotificationManagerService;->access$6600(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;Landroid/service/notification/Adjustment;)V
+PLcom/android/server/notification/NotificationManagerService;->access$6600(Lcom/android/server/notification/NotificationManagerService;Ljava/io/PrintWriter;Lcom/android/server/notification/NotificationManagerService$DumpFilter;)V
 HSPLcom/android/server/notification/NotificationManagerService;->access$6700(Lcom/android/server/notification/NotificationManagerService;)Landroid/os/UserManager;
 HSPLcom/android/server/notification/NotificationManagerService;->access$6700(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/internal/util/function/TriPredicate;
 HSPLcom/android/server/notification/NotificationManagerService;->access$6700(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/NotificationUsageStats;
 PLcom/android/server/notification/NotificationManagerService;->access$6700(Lcom/android/server/notification/NotificationManagerService;)Ljava/util/List;
+PLcom/android/server/notification/NotificationManagerService;->access$6700(Lcom/android/server/notification/NotificationManagerService;)V
 PLcom/android/server/notification/NotificationManagerService;->access$6700(Lcom/android/server/notification/NotificationManagerService;)Z
 HSPLcom/android/server/notification/NotificationManagerService;->access$6800(Lcom/android/server/notification/NotificationManagerService;)Landroid/os/UserManager;
+PLcom/android/server/notification/NotificationManagerService;->access$6800(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/internal/util/function/TriPredicate;
 HPLcom/android/server/notification/NotificationManagerService;->access$6800(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/NotificationUsageStats;
 PLcom/android/server/notification/NotificationManagerService;->access$6800(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/RankingHelper;
+PLcom/android/server/notification/NotificationManagerService;->access$6800(Lcom/android/server/notification/NotificationManagerService;)V
 HPLcom/android/server/notification/NotificationManagerService;->access$6800(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;Landroid/service/notification/Adjustment;)V
 PLcom/android/server/notification/NotificationManagerService;->access$6800(Lcom/android/server/notification/NotificationManagerService;Ljava/util/ArrayList;Ljava/lang/String;Ljava/lang/String;II)Ljava/util/List;
+PLcom/android/server/notification/NotificationManagerService;->access$6900(Lcom/android/server/notification/NotificationManagerService;)Landroid/os/UserManager;
+PLcom/android/server/notification/NotificationManagerService;->access$6900(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/internal/util/function/TriPredicate;
 HSPLcom/android/server/notification/NotificationManagerService;->access$6900(Lcom/android/server/notification/NotificationManagerService;)V
 PLcom/android/server/notification/NotificationManagerService;->access$6900(Lcom/android/server/notification/NotificationManagerService;)Z
 PLcom/android/server/notification/NotificationManagerService;->access$6900(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;Landroid/service/notification/Adjustment;)V
 HSPLcom/android/server/notification/NotificationManagerService;->access$6900(Lcom/android/server/notification/NotificationManagerService;Ljava/util/ArrayList;Ljava/lang/String;Ljava/lang/String;II)Lcom/android/server/notification/NotificationRecord;
 PLcom/android/server/notification/NotificationManagerService;->access$6900(Lcom/android/server/notification/NotificationManagerService;Ljava/util/ArrayList;Ljava/lang/String;Ljava/lang/String;II)Ljava/util/List;
 PLcom/android/server/notification/NotificationManagerService;->access$700(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/NotificationManagerService$NotificationAssistants;
+PLcom/android/server/notification/NotificationManagerService;->access$700(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/NotificationRecordLogger;
 HPLcom/android/server/notification/NotificationManagerService;->access$700(Lcom/android/server/notification/NotificationManagerService;)V
+PLcom/android/server/notification/NotificationManagerService;->access$7000(Lcom/android/server/notification/NotificationManagerService;)Landroid/os/UserManager;
 HSPLcom/android/server/notification/NotificationManagerService;->access$7000(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/internal/util/function/TriPredicate;
 HPLcom/android/server/notification/NotificationManagerService;->access$7000(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/NotificationUsageStats;
 PLcom/android/server/notification/NotificationManagerService;->access$7000(Lcom/android/server/notification/NotificationManagerService;)Z
+PLcom/android/server/notification/NotificationManagerService;->access$7000(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;Landroid/service/notification/Adjustment;)V
 PLcom/android/server/notification/NotificationManagerService;->access$7000(Lcom/android/server/notification/NotificationManagerService;Ljava/lang/String;)Lcom/android/server/notification/NotificationRecord;
 HPLcom/android/server/notification/NotificationManagerService;->access$7000(Lcom/android/server/notification/NotificationManagerService;Ljava/util/ArrayList;Ljava/lang/String;Ljava/lang/String;II)Lcom/android/server/notification/NotificationRecord;
 HSPLcom/android/server/notification/NotificationManagerService;->access$7100(Lcom/android/server/notification/NotificationManagerService;)Landroid/os/UserManager;
 PLcom/android/server/notification/NotificationManagerService;->access$7100(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/NotificationUsageStats;
+PLcom/android/server/notification/NotificationManagerService;->access$7100(Lcom/android/server/notification/NotificationManagerService;)Z
 PLcom/android/server/notification/NotificationManagerService;->access$7100(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;)Z
+PLcom/android/server/notification/NotificationManagerService;->access$7100(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;Landroid/service/notification/Adjustment;)V
 PLcom/android/server/notification/NotificationManagerService;->access$7100(Lcom/android/server/notification/NotificationManagerService;Ljava/util/ArrayList;Ljava/lang/String;Ljava/lang/String;II)Ljava/util/List;
+PLcom/android/server/notification/NotificationManagerService;->access$7200(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/NotificationUsageStats;
+PLcom/android/server/notification/NotificationManagerService;->access$7200(Lcom/android/server/notification/NotificationManagerService;)Z
 PLcom/android/server/notification/NotificationManagerService;->access$7200(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;)Z
 PLcom/android/server/notification/NotificationManagerService;->access$7200(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;Landroid/service/notification/Adjustment;)V
 PLcom/android/server/notification/NotificationManagerService;->access$7200(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;ZIZLjava/lang/String;)V
 HSPLcom/android/server/notification/NotificationManagerService;->access$7200(Lcom/android/server/notification/NotificationManagerService;Ljava/util/ArrayList;Ljava/lang/String;Ljava/lang/String;II)Lcom/android/server/notification/NotificationRecord;
 PLcom/android/server/notification/NotificationManagerService;->access$7200(Lcom/android/server/notification/NotificationManagerService;Ljava/util/ArrayList;Ljava/lang/String;Ljava/lang/String;II)Ljava/util/List;
+PLcom/android/server/notification/NotificationManagerService;->access$7300(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/NotificationUsageStats;
 PLcom/android/server/notification/NotificationManagerService;->access$7300(Lcom/android/server/notification/NotificationManagerService;)Z
 PLcom/android/server/notification/NotificationManagerService;->access$7300(Lcom/android/server/notification/NotificationManagerService;Ljava/lang/String;)Lcom/android/server/notification/NotificationRecord;
+PLcom/android/server/notification/NotificationManagerService;->access$7300(Lcom/android/server/notification/NotificationManagerService;Ljava/lang/String;ILjava/lang/String;)V
 HPLcom/android/server/notification/NotificationManagerService;->access$7300(Lcom/android/server/notification/NotificationManagerService;Ljava/util/ArrayList;Ljava/lang/String;Ljava/lang/String;II)Lcom/android/server/notification/NotificationRecord;
 PLcom/android/server/notification/NotificationManagerService;->access$7400(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/NotificationUsageStats;
 PLcom/android/server/notification/NotificationManagerService;->access$7400(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;)Z
 PLcom/android/server/notification/NotificationManagerService;->access$7400(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;ZIIIZLjava/lang/String;)V
 PLcom/android/server/notification/NotificationManagerService;->access$7400(Lcom/android/server/notification/NotificationManagerService;Ljava/lang/String;)Lcom/android/server/notification/NotificationRecord;
+PLcom/android/server/notification/NotificationManagerService;->access$7400(Lcom/android/server/notification/NotificationManagerService;Ljava/lang/String;ILjava/lang/String;)V
+PLcom/android/server/notification/NotificationManagerService;->access$7400(Lcom/android/server/notification/NotificationManagerService;Ljava/util/ArrayList;Ljava/lang/String;Ljava/lang/String;II)Lcom/android/server/notification/NotificationRecord;
+PLcom/android/server/notification/NotificationManagerService;->access$7400(Lcom/android/server/notification/NotificationManagerService;Ljava/util/ArrayList;Ljava/lang/String;Ljava/lang/String;II)Ljava/util/List;
 PLcom/android/server/notification/NotificationManagerService;->access$7500(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;)Z
 PLcom/android/server/notification/NotificationManagerService;->access$7500(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;IILjava/lang/String;ZLcom/android/server/notification/NotificationManagerService$FlagChecker;)V
 PLcom/android/server/notification/NotificationManagerService;->access$7500(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;ZIIIZLjava/lang/String;)V
 PLcom/android/server/notification/NotificationManagerService;->access$7500(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;ZIZLjava/lang/String;)V
 PLcom/android/server/notification/NotificationManagerService;->access$7500(Lcom/android/server/notification/NotificationManagerService;Ljava/lang/String;ILjava/lang/String;)V
+HPLcom/android/server/notification/NotificationManagerService;->access$7500(Lcom/android/server/notification/NotificationManagerService;Ljava/util/ArrayList;Ljava/lang/String;Ljava/lang/String;II)Lcom/android/server/notification/NotificationRecord;
 PLcom/android/server/notification/NotificationManagerService;->access$7600(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;IILjava/lang/String;ZLcom/android/server/notification/NotificationManagerService$FlagChecker;)V
 HSPLcom/android/server/notification/NotificationManagerService;->access$7600(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;Ljava/lang/String;ILcom/android/server/notification/NotificationRecord;Z)V
 PLcom/android/server/notification/NotificationManagerService;->access$7600(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;ZIZLjava/lang/String;)V
 HPLcom/android/server/notification/NotificationManagerService;->access$7600(Lcom/android/server/notification/NotificationManagerService;Ljava/util/ArrayList;Ljava/lang/String;Ljava/lang/String;II)Lcom/android/server/notification/NotificationRecord;
+PLcom/android/server/notification/NotificationManagerService;->access$7600(Lcom/android/server/notification/NotificationManagerService;Ljava/util/ArrayList;Ljava/lang/String;Ljava/lang/String;II)Ljava/util/List;
+PLcom/android/server/notification/NotificationManagerService;->access$7700(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;)Z
 HSPLcom/android/server/notification/NotificationManagerService;->access$7700(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;II)V
 PLcom/android/server/notification/NotificationManagerService;->access$7700(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;Ljava/lang/String;ILcom/android/server/notification/NotificationRecord;Z)V
 PLcom/android/server/notification/NotificationManagerService;->access$7700(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;ZIIIZLjava/lang/String;)V
@@ -23596,19 +25669,24 @@
 HSPLcom/android/server/notification/NotificationManagerService;->access$7900(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;)Z
 PLcom/android/server/notification/NotificationManagerService;->access$7900(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;IILjava/lang/String;ZLcom/android/server/notification/NotificationManagerService$FlagChecker;)V
 HPLcom/android/server/notification/NotificationManagerService;->access$7900(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;Ljava/lang/String;ILcom/android/server/notification/NotificationRecord;Z)V
+PLcom/android/server/notification/NotificationManagerService;->access$7900(Lcom/android/server/notification/NotificationManagerService;Ljava/lang/String;Ljava/lang/String;II)Ljava/util/List;
 PLcom/android/server/notification/NotificationManagerService;->access$800(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/internal/logging/MetricsLogger;
+PLcom/android/server/notification/NotificationManagerService;->access$800(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/NotificationManagerService$NotificationAssistants;
 PLcom/android/server/notification/NotificationManagerService;->access$800(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/NotificationRecordLogger;
 PLcom/android/server/notification/NotificationManagerService;->access$800(Lcom/android/server/notification/NotificationManagerService;)V
 HSPLcom/android/server/notification/NotificationManagerService;->access$8000(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;)Z
 HPLcom/android/server/notification/NotificationManagerService;->access$8000(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;II)V
 PLcom/android/server/notification/NotificationManagerService;->access$8000(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;Ljava/lang/String;ILcom/android/server/notification/NotificationRecord;Z)V
+HPLcom/android/server/notification/NotificationManagerService;->access$8000(Lcom/android/server/notification/NotificationManagerService;Ljava/lang/String;Ljava/lang/String;II)Ljava/util/List;
 HSPLcom/android/server/notification/NotificationManagerService;->access$8100(Lcom/android/server/notification/NotificationManagerService;Landroid/service/notification/StatusBarNotification;)Z
 PLcom/android/server/notification/NotificationManagerService;->access$8100(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;)Z
 PLcom/android/server/notification/NotificationManagerService;->access$8100(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;II)V
+PLcom/android/server/notification/NotificationManagerService;->access$8100(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;ZIIIZLjava/lang/String;)V
 HPLcom/android/server/notification/NotificationManagerService;->access$8100(Lcom/android/server/notification/NotificationManagerService;Ljava/lang/String;Ljava/lang/String;II)Ljava/util/List;
 HSPLcom/android/server/notification/NotificationManagerService;->access$8200(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/GroupHelper;
 HPLcom/android/server/notification/NotificationManagerService;->access$8200(Lcom/android/server/notification/NotificationManagerService;Landroid/service/notification/StatusBarNotification;)Z
 HPLcom/android/server/notification/NotificationManagerService;->access$8200(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;)Z
+PLcom/android/server/notification/NotificationManagerService;->access$8200(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;IILjava/lang/String;ZLcom/android/server/notification/NotificationManagerService$FlagChecker;)V
 PLcom/android/server/notification/NotificationManagerService;->access$8200(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;ZIIIZLjava/lang/String;)V
 HPLcom/android/server/notification/NotificationManagerService;->access$8200(Lcom/android/server/notification/NotificationManagerService;Ljava/lang/String;Ljava/lang/String;II)Ljava/util/List;
 PLcom/android/server/notification/NotificationManagerService;->access$8300(Lcom/android/server/notification/NotificationManagerService;)Landroid/os/Binder;
@@ -23616,6 +25694,8 @@
 PLcom/android/server/notification/NotificationManagerService;->access$8300(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/GroupHelper;
 PLcom/android/server/notification/NotificationManagerService;->access$8300(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;)Z
 PLcom/android/server/notification/NotificationManagerService;->access$8300(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;IILjava/lang/String;ZLcom/android/server/notification/NotificationManagerService$FlagChecker;)V
+PLcom/android/server/notification/NotificationManagerService;->access$8300(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;IILjava/lang/String;ZLcom/android/server/notification/NotificationManagerService$FlagChecker;I)V
+PLcom/android/server/notification/NotificationManagerService;->access$8300(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;Z)V
 PLcom/android/server/notification/NotificationManagerService;->access$8300(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;ZIIIZLjava/lang/String;)V
 PLcom/android/server/notification/NotificationManagerService;->access$8302(Lcom/android/server/notification/NotificationManagerService;Landroid/os/Binder;)Landroid/os/Binder;
 PLcom/android/server/notification/NotificationManagerService;->access$8400(Lcom/android/server/notification/NotificationManagerService;)Landroid/net/Uri;
@@ -23625,7 +25705,9 @@
 HPLcom/android/server/notification/NotificationManagerService;->access$8400(Lcom/android/server/notification/NotificationManagerService;Landroid/service/notification/StatusBarNotification;)Z
 PLcom/android/server/notification/NotificationManagerService;->access$8400(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;)Z
 PLcom/android/server/notification/NotificationManagerService;->access$8400(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;IILjava/lang/String;ZLcom/android/server/notification/NotificationManagerService$FlagChecker;)V
+PLcom/android/server/notification/NotificationManagerService;->access$8400(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;II)V
 PLcom/android/server/notification/NotificationManagerService;->access$8400(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;Ljava/lang/String;ILcom/android/server/notification/NotificationRecord;Z)V
+PLcom/android/server/notification/NotificationManagerService;->access$8400(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;Z)V
 PLcom/android/server/notification/NotificationManagerService;->access$8402(Lcom/android/server/notification/NotificationManagerService;Landroid/os/Binder;)Landroid/os/Binder;
 PLcom/android/server/notification/NotificationManagerService;->access$8500(Lcom/android/server/notification/NotificationManagerService;)Landroid/media/AudioAttributes;
 PLcom/android/server/notification/NotificationManagerService;->access$8500(Lcom/android/server/notification/NotificationManagerService;)Landroid/net/Uri;
@@ -23639,9 +25721,11 @@
 HPLcom/android/server/notification/NotificationManagerService;->access$8600(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/GroupHelper;
 HPLcom/android/server/notification/NotificationManagerService;->access$8600(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/NotificationRecordLogger;
 HPLcom/android/server/notification/NotificationManagerService;->access$8600(Lcom/android/server/notification/NotificationManagerService;Landroid/service/notification/StatusBarNotification;)Z
+PLcom/android/server/notification/NotificationManagerService;->access$8600(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;)Z
 PLcom/android/server/notification/NotificationManagerService;->access$8600(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;II)V
 PLcom/android/server/notification/NotificationManagerService;->access$8700(Lcom/android/server/notification/NotificationManagerService;)F
 PLcom/android/server/notification/NotificationManagerService;->access$8700(Lcom/android/server/notification/NotificationManagerService;)Landroid/os/Binder;
+PLcom/android/server/notification/NotificationManagerService;->access$8700(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/internal/logging/InstanceIdSequence;
 PLcom/android/server/notification/NotificationManagerService;->access$8700(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/GroupHelper;
 HPLcom/android/server/notification/NotificationManagerService;->access$8700(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/NotificationRecordLogger;
 PLcom/android/server/notification/NotificationManagerService;->access$8700(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService$ToastRecord;)V
@@ -23659,18 +25743,21 @@
 PLcom/android/server/notification/NotificationManagerService;->access$8900(Lcom/android/server/notification/NotificationManagerService;)Landroid/os/Binder;
 PLcom/android/server/notification/NotificationManagerService;->access$8900(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/internal/logging/InstanceIdSequence;
 PLcom/android/server/notification/NotificationManagerService;->access$8900(Lcom/android/server/notification/NotificationManagerService;)V
+PLcom/android/server/notification/NotificationManagerService;->access$8900(Lcom/android/server/notification/NotificationManagerService;Landroid/service/notification/StatusBarNotification;)Z
 PLcom/android/server/notification/NotificationManagerService;->access$8900(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService$ToastRecord;)V
 PLcom/android/server/notification/NotificationManagerService;->access$8900(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;)Z
 PLcom/android/server/notification/NotificationManagerService;->access$8902(Lcom/android/server/notification/NotificationManagerService;Landroid/os/Binder;)Landroid/os/Binder;
 PLcom/android/server/notification/NotificationManagerService;->access$900(Lcom/android/server/notification/NotificationManagerService;)Landroid/app/ActivityManager;
 PLcom/android/server/notification/NotificationManagerService;->access$900(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/NotificationRecordLogger;
+PLcom/android/server/notification/NotificationManagerService;->access$900(Lcom/android/server/notification/NotificationManagerService;)V
 PLcom/android/server/notification/NotificationManagerService;->access$900(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;Ljava/lang/String;ILcom/android/server/notification/NotificationRecord;Z)V
 PLcom/android/server/notification/NotificationManagerService;->access$9000(Lcom/android/server/notification/NotificationManagerService;)F
 PLcom/android/server/notification/NotificationManagerService;->access$9000(Lcom/android/server/notification/NotificationManagerService;)Landroid/media/AudioAttributes;
 PLcom/android/server/notification/NotificationManagerService;->access$9000(Lcom/android/server/notification/NotificationManagerService;)Landroid/net/Uri;
+PLcom/android/server/notification/NotificationManagerService;->access$9000(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/GroupHelper;
 PLcom/android/server/notification/NotificationManagerService;->access$9000(Lcom/android/server/notification/NotificationManagerService;)V
 PLcom/android/server/notification/NotificationManagerService;->access$9000(Lcom/android/server/notification/NotificationManagerService;I)V
-PLcom/android/server/notification/NotificationManagerService;->access$9000(Lcom/android/server/notification/NotificationManagerService;Landroid/service/notification/StatusBarNotification;)Z
+HPLcom/android/server/notification/NotificationManagerService;->access$9000(Lcom/android/server/notification/NotificationManagerService;Landroid/service/notification/StatusBarNotification;)Z
 PLcom/android/server/notification/NotificationManagerService;->access$9000(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService$ToastRecord;)V
 PLcom/android/server/notification/NotificationManagerService;->access$9000(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;)Z
 PLcom/android/server/notification/NotificationManagerService;->access$9100(Lcom/android/server/notification/NotificationManagerService;)F
@@ -23700,15 +25787,19 @@
 PLcom/android/server/notification/NotificationManagerService;->access$9600(Lcom/android/server/notification/NotificationManagerService;I)V
 HPLcom/android/server/notification/NotificationManagerService;->access$9600(Lcom/android/server/notification/NotificationManagerService;Landroid/os/Message;)V
 HSPLcom/android/server/notification/NotificationManagerService;->access$9600(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;)Landroid/service/notification/NotificationRankingUpdate;
+PLcom/android/server/notification/NotificationManagerService;->access$9600(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/toast/ToastRecord;)V
+PLcom/android/server/notification/NotificationManagerService;->access$9700(Lcom/android/server/notification/NotificationManagerService;)V
 PLcom/android/server/notification/NotificationManagerService;->access$9700(Lcom/android/server/notification/NotificationManagerService;I)V
 HPLcom/android/server/notification/NotificationManagerService;->access$9700(Lcom/android/server/notification/NotificationManagerService;Landroid/os/Message;)V
 HPLcom/android/server/notification/NotificationManagerService;->access$9700(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;)Landroid/service/notification/NotificationRankingUpdate;
+PLcom/android/server/notification/NotificationManagerService;->access$9700(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/toast/ToastRecord;)V
 HSPLcom/android/server/notification/NotificationManagerService;->access$9700(Lcom/android/server/notification/NotificationManagerService;Ljava/util/ArrayList;IILjava/lang/String;ZLjava/lang/String;Lcom/android/server/notification/NotificationManagerService$FlagChecker;ZIZILjava/lang/String;Z)V
 PLcom/android/server/notification/NotificationManagerService;->access$9800(Lcom/android/server/notification/NotificationManagerService;)V
 PLcom/android/server/notification/NotificationManagerService;->access$9800(Lcom/android/server/notification/NotificationManagerService;Landroid/os/Message;)V
 HPLcom/android/server/notification/NotificationManagerService;->access$9800(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;)Landroid/service/notification/NotificationRankingUpdate;
 HPLcom/android/server/notification/NotificationManagerService;->access$9800(Lcom/android/server/notification/NotificationManagerService;Ljava/util/ArrayList;IILjava/lang/String;ZLjava/lang/String;Lcom/android/server/notification/NotificationManagerService$FlagChecker;ZIZILjava/lang/String;Z)V
 PLcom/android/server/notification/NotificationManagerService;->access$9900(Lcom/android/server/notification/NotificationManagerService;)V
+PLcom/android/server/notification/NotificationManagerService;->access$9900(Lcom/android/server/notification/NotificationManagerService;I)V
 HSPLcom/android/server/notification/NotificationManagerService;->access$9900(Lcom/android/server/notification/NotificationManagerService;Ljava/util/ArrayList;IILjava/lang/String;ZLjava/lang/String;Lcom/android/server/notification/NotificationManagerService$FlagChecker;ZIZILjava/lang/String;Z)V
 HPLcom/android/server/notification/NotificationManagerService;->addAutoGroupAdjustment(Lcom/android/server/notification/NotificationRecord;Ljava/lang/String;)V
 HPLcom/android/server/notification/NotificationManagerService;->addAutogroupKeyLocked(Ljava/lang/String;)V
@@ -23733,7 +25824,9 @@
 HSPLcom/android/server/notification/NotificationManagerService;->cancelAllNotificationsByListLocked(Ljava/util/ArrayList;IILjava/lang/String;ZLjava/lang/String;Lcom/android/server/notification/NotificationManagerService$FlagChecker;ZIZILjava/lang/String;Z)V
 HSPLcom/android/server/notification/NotificationManagerService;->cancelAllNotificationsInt(IILjava/lang/String;Ljava/lang/String;IIZIILcom/android/server/notification/ManagedServices$ManagedServiceInfo;)V
 HPLcom/android/server/notification/NotificationManagerService;->cancelGroupChildrenByListLocked(Ljava/util/ArrayList;Lcom/android/server/notification/NotificationRecord;IILjava/lang/String;ZZLcom/android/server/notification/NotificationManagerService$FlagChecker;)V
+PLcom/android/server/notification/NotificationManagerService;->cancelGroupChildrenByListLocked(Ljava/util/ArrayList;Lcom/android/server/notification/NotificationRecord;IILjava/lang/String;ZZLcom/android/server/notification/NotificationManagerService$FlagChecker;I)V
 HPLcom/android/server/notification/NotificationManagerService;->cancelGroupChildrenLocked(Lcom/android/server/notification/NotificationRecord;IILjava/lang/String;ZLcom/android/server/notification/NotificationManagerService$FlagChecker;)V
+PLcom/android/server/notification/NotificationManagerService;->cancelGroupChildrenLocked(Lcom/android/server/notification/NotificationRecord;IILjava/lang/String;ZLcom/android/server/notification/NotificationManagerService$FlagChecker;I)V
 HSPLcom/android/server/notification/NotificationManagerService;->cancelNotification(IILjava/lang/String;Ljava/lang/String;IIIZIIIILcom/android/server/notification/ManagedServices$ManagedServiceInfo;)V
 HSPLcom/android/server/notification/NotificationManagerService;->cancelNotification(IILjava/lang/String;Ljava/lang/String;IIIZIILcom/android/server/notification/ManagedServices$ManagedServiceInfo;)V
 HSPLcom/android/server/notification/NotificationManagerService;->cancelNotificationInternal(Ljava/lang/String;Ljava/lang/String;IILjava/lang/String;II)V
@@ -23791,6 +25884,7 @@
 HSPLcom/android/server/notification/NotificationManagerService;->getRealUserId(I)I
 HPLcom/android/server/notification/NotificationManagerService;->getShortcutInfo(Ljava/lang/String;Ljava/lang/String;Landroid/os/UserHandle;)Landroid/content/pm/ShortcutInfo;
 HPLcom/android/server/notification/NotificationManagerService;->getSuppressors()Ljava/util/ArrayList;
+PLcom/android/server/notification/NotificationManagerService;->getToastRecord(IILjava/lang/String;Landroid/os/IBinder;Ljava/lang/CharSequence;Landroid/app/ITransientNotification;ILandroid/os/Binder;ILandroid/app/ITransientNotificationCallback;)Lcom/android/server/notification/toast/ToastRecord;
 HPLcom/android/server/notification/NotificationManagerService;->getToastRecord(ILjava/lang/String;Landroid/os/IBinder;Ljava/lang/CharSequence;Landroid/app/ITransientNotification;ILandroid/os/Binder;ILandroid/app/ITransientNotificationCallback;)Lcom/android/server/notification/toast/ToastRecord;
 HPLcom/android/server/notification/NotificationManagerService;->grantUriPermission(Landroid/os/IBinder;Landroid/net/Uri;ILjava/lang/String;I)V
 PLcom/android/server/notification/NotificationManagerService;->handleDurationReached(Lcom/android/server/notification/NotificationManagerService$ToastRecord;)V
@@ -23814,6 +25908,8 @@
 HPLcom/android/server/notification/NotificationManagerService;->indexOfToastLocked(Ljava/lang/String;Landroid/os/IBinder;)I
 HSPLcom/android/server/notification/NotificationManagerService;->init(Lcom/android/server/notification/NotificationManagerService$WorkerHandler;Lcom/android/server/notification/RankingHandler;Landroid/content/pm/IPackageManager;Landroid/content/pm/PackageManager;Lcom/android/server/lights/LightsManager;Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/NotificationManagerService$NotificationAssistants;Lcom/android/server/notification/ConditionProviders;Landroid/companion/ICompanionDeviceManager;Lcom/android/server/notification/SnoozeHelper;Lcom/android/server/notification/NotificationUsageStats;Landroid/util/AtomicFile;Landroid/app/ActivityManager;Lcom/android/server/notification/GroupHelper;Landroid/app/IActivityManager;Landroid/app/usage/UsageStatsManagerInternal;Landroid/app/admin/DevicePolicyManagerInternal;Landroid/app/IUriGrantsManager;Lcom/android/server/uri/UriGrantsManagerInternal;Landroid/app/AppOpsManager;Landroid/os/UserManager;Lcom/android/server/notification/NotificationHistoryManager;)V
 HSPLcom/android/server/notification/NotificationManagerService;->init(Lcom/android/server/notification/NotificationManagerService$WorkerHandler;Lcom/android/server/notification/RankingHandler;Landroid/content/pm/IPackageManager;Landroid/content/pm/PackageManager;Lcom/android/server/lights/LightsManager;Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/NotificationManagerService$NotificationAssistants;Lcom/android/server/notification/ConditionProviders;Landroid/companion/ICompanionDeviceManager;Lcom/android/server/notification/SnoozeHelper;Lcom/android/server/notification/NotificationUsageStats;Landroid/util/AtomicFile;Landroid/app/ActivityManager;Lcom/android/server/notification/GroupHelper;Landroid/app/IActivityManager;Landroid/app/usage/UsageStatsManagerInternal;Landroid/app/admin/DevicePolicyManagerInternal;Landroid/app/IUriGrantsManager;Lcom/android/server/uri/UriGrantsManagerInternal;Landroid/app/AppOpsManager;Landroid/os/UserManager;Lcom/android/server/notification/NotificationHistoryManager;Landroid/app/StatsManager;)V
+PLcom/android/server/notification/NotificationManagerService;->init(Lcom/android/server/notification/NotificationManagerService$WorkerHandler;Lcom/android/server/notification/RankingHandler;Landroid/content/pm/IPackageManager;Landroid/content/pm/PackageManager;Lcom/android/server/lights/LightsManager;Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/NotificationManagerService$NotificationAssistants;Lcom/android/server/notification/ConditionProviders;Landroid/companion/ICompanionDeviceManager;Lcom/android/server/notification/SnoozeHelper;Lcom/android/server/notification/NotificationUsageStats;Landroid/util/AtomicFile;Landroid/app/ActivityManager;Lcom/android/server/notification/GroupHelper;Landroid/app/IActivityManager;Lcom/android/server/wm/ActivityTaskManagerInternal;Landroid/app/usage/UsageStatsManagerInternal;Landroid/app/admin/DevicePolicyManagerInternal;Landroid/app/IUriGrantsManager;Lcom/android/server/uri/UriGrantsManagerInternal;Landroid/app/AppOpsManager;Landroid/os/UserManager;Lcom/android/server/notification/NotificationHistoryManager;Landroid/app/StatsManager;)V
+PLcom/android/server/notification/NotificationManagerService;->init(Lcom/android/server/notification/NotificationManagerService$WorkerHandler;Lcom/android/server/notification/RankingHandler;Landroid/content/pm/IPackageManager;Landroid/content/pm/PackageManager;Lcom/android/server/lights/LightsManager;Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/NotificationManagerService$NotificationAssistants;Lcom/android/server/notification/ConditionProviders;Landroid/companion/ICompanionDeviceManager;Lcom/android/server/notification/SnoozeHelper;Lcom/android/server/notification/NotificationUsageStats;Landroid/util/AtomicFile;Landroid/app/ActivityManager;Lcom/android/server/notification/GroupHelper;Landroid/app/IActivityManager;Lcom/android/server/wm/ActivityTaskManagerInternal;Landroid/app/usage/UsageStatsManagerInternal;Landroid/app/admin/DevicePolicyManagerInternal;Landroid/app/IUriGrantsManager;Lcom/android/server/uri/UriGrantsManagerInternal;Landroid/app/AppOpsManager;Landroid/os/UserManager;Lcom/android/server/notification/NotificationHistoryManager;Landroid/app/StatsManager;Landroid/telephony/TelephonyManager;)V
 HSPLcom/android/server/notification/NotificationManagerService;->isBlocked(Lcom/android/server/notification/NotificationRecord;)Z
 HSPLcom/android/server/notification/NotificationManagerService;->isBlocked(Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationUsageStats;)Z
 HSPLcom/android/server/notification/NotificationManagerService;->isCallerAndroid(Ljava/lang/String;I)Z
@@ -23837,7 +25933,9 @@
 HPLcom/android/server/notification/NotificationManagerService;->keepProcessAliveIfNeededLocked(I)V
 HPLcom/android/server/notification/NotificationManagerService;->lambda$doChannelWarningToast$3$NotificationManagerService(Ljava/lang/CharSequence;)V
 PLcom/android/server/notification/NotificationManagerService;->lambda$doChannelWarningToast$4$NotificationManagerService(Ljava/lang/CharSequence;)V
+PLcom/android/server/notification/NotificationManagerService;->lambda$onStart$0$NotificationManagerService(ILcom/android/server/notification/NotificationRecord;Z)V
 PLcom/android/server/notification/NotificationManagerService;->lambda$onStopUser$2$NotificationManagerService(Landroid/content/pm/UserInfo;)V
+PLcom/android/server/notification/NotificationManagerService;->lambda$onStopUser$3$NotificationManagerService(Landroid/content/pm/UserInfo;)V
 PLcom/android/server/notification/NotificationManagerService;->lambda$onUnlockUser$1$NotificationManagerService(Landroid/content/pm/UserInfo;)V
 PLcom/android/server/notification/NotificationManagerService;->lambda$onUnlockUser$2$NotificationManagerService(Landroid/content/pm/UserInfo;)V
 HSPLcom/android/server/notification/NotificationManagerService;->lambda$playVibration$4$NotificationManagerService(Lcom/android/server/notification/NotificationRecord;Landroid/os/VibrationEffect;)V
@@ -23849,6 +25947,7 @@
 PLcom/android/server/notification/NotificationManagerService;->logBubbleError(Ljava/lang/String;Ljava/lang/String;)V
 HPLcom/android/server/notification/NotificationManagerService;->logSmartSuggestionsVisible(Lcom/android/server/notification/NotificationRecord;I)V
 HSPLcom/android/server/notification/NotificationManagerService;->makeRankingUpdateLocked(Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;)Landroid/service/notification/NotificationRankingUpdate;
+PLcom/android/server/notification/NotificationManagerService;->maybeNotifyChannelGroupOwner(Ljava/lang/String;ILandroid/app/NotificationChannelGroup;Landroid/app/NotificationChannelGroup;)V
 PLcom/android/server/notification/NotificationManagerService;->maybeNotifyChannelOwner(Ljava/lang/String;ILandroid/app/NotificationChannel;Landroid/app/NotificationChannel;)V
 HSPLcom/android/server/notification/NotificationManagerService;->maybeRecordInterruptionLocked(Lcom/android/server/notification/NotificationRecord;)V
 PLcom/android/server/notification/NotificationManagerService;->notificationMatchesCurrentProfiles(Lcom/android/server/notification/NotificationRecord;I)Z
@@ -23897,6 +25996,7 @@
 HSPLcom/android/server/notification/NotificationManagerService;->updateLightsLocked()V
 PLcom/android/server/notification/NotificationManagerService;->updateListenerHintsLocked()V
 HPLcom/android/server/notification/NotificationManagerService;->updateNotificationBubbleFlags(Lcom/android/server/notification/NotificationRecord;Ljava/lang/String;ILcom/android/server/notification/NotificationRecord;Z)V
+PLcom/android/server/notification/NotificationManagerService;->updateNotificationBubbleFlags(Lcom/android/server/notification/NotificationRecord;Z)V
 PLcom/android/server/notification/NotificationManagerService;->updateNotificationChannelInt(Ljava/lang/String;ILandroid/app/NotificationChannel;Z)V
 HSPLcom/android/server/notification/NotificationManagerService;->updateNotificationPulse()V
 HSPLcom/android/server/notification/NotificationManagerService;->updateUriPermissions(Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;Ljava/lang/String;I)V
@@ -23982,6 +26082,7 @@
 HPLcom/android/server/notification/NotificationRecord;->isAudioAttributesUsage(I)Z
 HPLcom/android/server/notification/NotificationRecord;->isCategory(Ljava/lang/String;)Z
 HPLcom/android/server/notification/NotificationRecord;->isConversation()Z
+HPLcom/android/server/notification/NotificationRecord;->isFlagBubbleRemoved()Z
 HSPLcom/android/server/notification/NotificationRecord;->isHidden()Z
 HSPLcom/android/server/notification/NotificationRecord;->isIntercepted()Z
 HSPLcom/android/server/notification/NotificationRecord;->isInterruptive()Z
@@ -23993,7 +26094,7 @@
 HSPLcom/android/server/notification/NotificationRecord;->lambda$calculateGrantableUris$0$NotificationRecord(Landroid/net/Uri;)V
 PLcom/android/server/notification/NotificationRecord;->recordDirectReplied()V
 PLcom/android/server/notification/NotificationRecord;->recordDismissalSentiment(I)V
-PLcom/android/server/notification/NotificationRecord;->recordDismissalSurface(I)V
+HPLcom/android/server/notification/NotificationRecord;->recordDismissalSurface(I)V
 PLcom/android/server/notification/NotificationRecord;->recordExpanded()V
 PLcom/android/server/notification/NotificationRecord;->recordSnoozed()V
 PLcom/android/server/notification/NotificationRecord;->recordViewedSettings()V
@@ -24003,6 +26104,7 @@
 HSPLcom/android/server/notification/NotificationRecord;->setAuthoritativeRank(I)V
 HSPLcom/android/server/notification/NotificationRecord;->setContactAffinity(F)V
 PLcom/android/server/notification/NotificationRecord;->setEditChoicesBeforeSending(Z)V
+HPLcom/android/server/notification/NotificationRecord;->setFlagBubbleRemoved(Z)V
 HSPLcom/android/server/notification/NotificationRecord;->setGlobalSortKey(Ljava/lang/String;)V
 HSPLcom/android/server/notification/NotificationRecord;->setHidden(Z)V
 HSPLcom/android/server/notification/NotificationRecord;->setIntercepted(Z)Z
@@ -24013,7 +26115,7 @@
 HPLcom/android/server/notification/NotificationRecord;->setOverrideGroupKey(Ljava/lang/String;)V
 HSPLcom/android/server/notification/NotificationRecord;->setPackagePriority(I)V
 HSPLcom/android/server/notification/NotificationRecord;->setPackageVisibilityOverride(I)V
-PLcom/android/server/notification/NotificationRecord;->setPostSilently(Z)V
+HPLcom/android/server/notification/NotificationRecord;->setPostSilently(Z)V
 HSPLcom/android/server/notification/NotificationRecord;->setRecentlyIntrusive(Z)V
 HSPLcom/android/server/notification/NotificationRecord;->setRecordedInterruption(Z)V
 HPLcom/android/server/notification/NotificationRecord;->setSeen()V
@@ -24039,14 +26141,18 @@
 HPLcom/android/server/notification/NotificationRecordLogger$NotificationCancelledEvent;->values()[Lcom/android/server/notification/NotificationRecordLogger$NotificationCancelledEvent;
 PLcom/android/server/notification/NotificationRecordLogger$NotificationEvent;-><clinit>()V
 PLcom/android/server/notification/NotificationRecordLogger$NotificationEvent;-><init>(Ljava/lang/String;II)V
+PLcom/android/server/notification/NotificationRecordLogger$NotificationEvent;->fromExpanded(ZZ)Lcom/android/server/notification/NotificationRecordLogger$NotificationEvent;
 PLcom/android/server/notification/NotificationRecordLogger$NotificationEvent;->fromVisibility(Z)Lcom/android/server/notification/NotificationRecordLogger$NotificationEvent;
 PLcom/android/server/notification/NotificationRecordLogger$NotificationEvent;->getId()I
+PLcom/android/server/notification/NotificationRecordLogger$NotificationPanelEvent;-><clinit>()V
+PLcom/android/server/notification/NotificationRecordLogger$NotificationPanelEvent;-><init>(Ljava/lang/String;II)V
+HPLcom/android/server/notification/NotificationRecordLogger$NotificationPanelEvent;->getId()I
 HPLcom/android/server/notification/NotificationRecordLogger$NotificationRecordPair;-><init>(Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;)V
 PLcom/android/server/notification/NotificationRecordLogger$NotificationRecordPair;->getAssistantHash()I
 PLcom/android/server/notification/NotificationRecordLogger$NotificationRecordPair;->getChannelIdHash()I
-PLcom/android/server/notification/NotificationRecordLogger$NotificationRecordPair;->getGroupIdHash()I
-PLcom/android/server/notification/NotificationRecordLogger$NotificationRecordPair;->getInstanceId()I
-PLcom/android/server/notification/NotificationRecordLogger$NotificationRecordPair;->getNotificationIdHash()I
+HPLcom/android/server/notification/NotificationRecordLogger$NotificationRecordPair;->getGroupIdHash()I
+HPLcom/android/server/notification/NotificationRecordLogger$NotificationRecordPair;->getInstanceId()I
+HPLcom/android/server/notification/NotificationRecordLogger$NotificationRecordPair;->getNotificationIdHash()I
 HPLcom/android/server/notification/NotificationRecordLogger$NotificationRecordPair;->getNumPeople()I
 HPLcom/android/server/notification/NotificationRecordLogger$NotificationRecordPair;->getNumPeople(Landroid/os/Bundle;)I
 HPLcom/android/server/notification/NotificationRecordLogger$NotificationRecordPair;->getStyle()I
@@ -24062,10 +26168,13 @@
 PLcom/android/server/notification/NotificationRecordLogger$NotificationReportedEvents;-><clinit>()V
 PLcom/android/server/notification/NotificationRecordLogger$NotificationReportedEvents;-><init>(Ljava/lang/String;II)V
 PLcom/android/server/notification/NotificationRecordLogger$NotificationReportedEvents;->getId()I
+PLcom/android/server/notification/NotificationRecordLogger;->logNotificationCancelled(Lcom/android/server/notification/NotificationRecord;II)V
+PLcom/android/server/notification/NotificationRecordLogger;->logNotificationVisibility(Lcom/android/server/notification/NotificationRecord;Z)V
 HPLcom/android/server/notification/NotificationRecordLogger;->smallHash(I)I
 HPLcom/android/server/notification/NotificationRecordLogger;->smallHash(Ljava/lang/String;)I
 HSPLcom/android/server/notification/NotificationRecordLoggerImpl;-><init>()V
-PLcom/android/server/notification/NotificationRecordLoggerImpl;->log(Lcom/android/internal/logging/UiEventLogger$UiEventEnum;Lcom/android/server/notification/NotificationRecord;)V
+PLcom/android/server/notification/NotificationRecordLoggerImpl;->log(Lcom/android/internal/logging/UiEventLogger$UiEventEnum;)V
+HPLcom/android/server/notification/NotificationRecordLoggerImpl;->log(Lcom/android/internal/logging/UiEventLogger$UiEventEnum;Lcom/android/server/notification/NotificationRecord;)V
 PLcom/android/server/notification/NotificationRecordLoggerImpl;->logNotificationCancelled(Lcom/android/server/notification/NotificationRecord;II)V
 HPLcom/android/server/notification/NotificationRecordLoggerImpl;->logNotificationReported(Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;II)V
 PLcom/android/server/notification/NotificationRecordLoggerImpl;->logNotificationVisibility(Lcom/android/server/notification/NotificationRecord;Z)V
@@ -24187,6 +26296,7 @@
 HSPLcom/android/server/notification/PreferencesHelper;->getChannelLog(Landroid/app/NotificationChannel;Ljava/lang/String;)Landroid/metrics/LogMaker;
 HSPLcom/android/server/notification/PreferencesHelper;->getConversationNotificationChannel(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;ZZ)Landroid/app/NotificationChannel;
 PLcom/android/server/notification/PreferencesHelper;->getConversations(Ljava/lang/String;I)Ljava/util/ArrayList;
+HPLcom/android/server/notification/PreferencesHelper;->getConversations(Z)Ljava/util/ArrayList;
 HPLcom/android/server/notification/PreferencesHelper;->getDeletedChannelCount(Ljava/lang/String;I)I
 HSPLcom/android/server/notification/PreferencesHelper;->getImportance(Ljava/lang/String;I)I
 HSPLcom/android/server/notification/PreferencesHelper;->getIsAppImportanceLocked(Ljava/lang/String;I)Z
@@ -24196,6 +26306,7 @@
 HPLcom/android/server/notification/PreferencesHelper;->getNotificationChannelGroupWithChannels(Ljava/lang/String;ILjava/lang/String;Z)Landroid/app/NotificationChannelGroup;
 HPLcom/android/server/notification/PreferencesHelper;->getNotificationChannelGroups(Ljava/lang/String;IZZZ)Landroid/content/pm/ParceledListSlice;
 HPLcom/android/server/notification/PreferencesHelper;->getNotificationChannels(Ljava/lang/String;IZ)Landroid/content/pm/ParceledListSlice;
+HPLcom/android/server/notification/PreferencesHelper;->getNotificationChannelsBypassingDnd(Ljava/lang/String;I)Landroid/content/pm/ParceledListSlice;
 HSPLcom/android/server/notification/PreferencesHelper;->getOrCreatePackagePreferencesLocked(Ljava/lang/String;I)Lcom/android/server/notification/PreferencesHelper$PackagePreferences;
 HSPLcom/android/server/notification/PreferencesHelper;->getOrCreatePackagePreferencesLocked(Ljava/lang/String;IIIIIZZ)Lcom/android/server/notification/PreferencesHelper$PackagePreferences;
 HPLcom/android/server/notification/PreferencesHelper;->getPackageBans()Ljava/util/Map;
@@ -24218,6 +26329,7 @@
 HSPLcom/android/server/notification/PreferencesHelper;->readXml(Lorg/xmlpull/v1/XmlPullParser;ZI)V
 PLcom/android/server/notification/PreferencesHelper;->setEnabled(Ljava/lang/String;IZ)V
 PLcom/android/server/notification/PreferencesHelper;->setImportance(Ljava/lang/String;II)V
+PLcom/android/server/notification/PreferencesHelper;->setShowBadge(Ljava/lang/String;IZ)V
 HSPLcom/android/server/notification/PreferencesHelper;->shouldHaveDefaultChannel(Lcom/android/server/notification/PreferencesHelper$PackagePreferences;)Z
 PLcom/android/server/notification/PreferencesHelper;->shouldHideSilentStatusIcons()Z
 HSPLcom/android/server/notification/PreferencesHelper;->syncChannelsBypassingDnd(I)V
@@ -24279,6 +26391,13 @@
 HSPLcom/android/server/notification/ScheduleConditionProvider;->saveSnoozedLocked()V
 HSPLcom/android/server/notification/ScheduleConditionProvider;->setRegistered(Z)V
 HSPLcom/android/server/notification/ScheduleConditionProvider;->updateAlarm(JJ)V
+PLcom/android/server/notification/ShortcutHelper$1;-><init>(Lcom/android/server/notification/ShortcutHelper;)V
+PLcom/android/server/notification/ShortcutHelper;-><init>(Landroid/content/pm/LauncherApps;Lcom/android/server/notification/ShortcutHelper$ShortcutListener;)V
+HPLcom/android/server/notification/ShortcutHelper;->getShortcutInfo(Ljava/lang/String;Ljava/lang/String;Landroid/os/UserHandle;)Landroid/content/pm/ShortcutInfo;
+HPLcom/android/server/notification/ShortcutHelper;->getValidShortcutInfo(Ljava/lang/String;Ljava/lang/String;Landroid/os/UserHandle;)Landroid/content/pm/ShortcutInfo;
+HPLcom/android/server/notification/ShortcutHelper;->maybeListenForShortcutChangesForBubbles(Lcom/android/server/notification/NotificationRecord;ZLandroid/os/Handler;)V
+HPLcom/android/server/notification/SmallHash;->hash(I)I
+HPLcom/android/server/notification/SmallHash;->hash(Ljava/lang/String;)I
 HSPLcom/android/server/notification/SnoozeHelper$1;-><init>(Lcom/android/server/notification/SnoozeHelper;)V
 PLcom/android/server/notification/SnoozeHelper$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
 HSPLcom/android/server/notification/SnoozeHelper;-><clinit>()V
@@ -24299,17 +26418,22 @@
 PLcom/android/server/notification/SnoozeHelper;->getSnoozed()Ljava/util/List;
 HPLcom/android/server/notification/SnoozeHelper;->getSnoozed(ILjava/lang/String;)Ljava/util/Collection;
 HSPLcom/android/server/notification/SnoozeHelper;->isSnoozed(ILjava/lang/String;Ljava/lang/String;)Z
+PLcom/android/server/notification/SnoozeHelper;->lambda$scheduleRepostAtTime$2$SnoozeHelper(Ljava/lang/String;Ljava/lang/String;IJ)V
 HPLcom/android/server/notification/SnoozeHelper;->lambda$writeXml$0(JLorg/xmlpull/v1/XmlSerializer;Ljava/lang/Long;)V
+HPLcom/android/server/notification/SnoozeHelper;->lambda$writeXml$3(JLorg/xmlpull/v1/XmlSerializer;Ljava/lang/Long;)V
 HSPLcom/android/server/notification/SnoozeHelper;->readXml(Lorg/xmlpull/v1/XmlPullParser;)V
 PLcom/android/server/notification/SnoozeHelper;->readXml(Lorg/xmlpull/v1/XmlPullParser;J)V
 HSPLcom/android/server/notification/SnoozeHelper;->removeRecord(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Landroid/util/ArrayMap;)Ljava/lang/Object;
+PLcom/android/server/notification/SnoozeHelper;->removeRecordLocked(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Landroid/util/ArrayMap;)Ljava/lang/Object;
 PLcom/android/server/notification/SnoozeHelper;->repost(Ljava/lang/String;I)V
+PLcom/android/server/notification/SnoozeHelper;->repost(Ljava/lang/String;IZ)V
 HPLcom/android/server/notification/SnoozeHelper;->repostGroupSummary(Ljava/lang/String;ILjava/lang/String;)V
 PLcom/android/server/notification/SnoozeHelper;->scheduleRepost(Ljava/lang/String;Ljava/lang/String;IJ)V
 PLcom/android/server/notification/SnoozeHelper;->scheduleRepostsForPersistedNotifications(J)V
 PLcom/android/server/notification/SnoozeHelper;->snooze(Lcom/android/server/notification/NotificationRecord;)V
 PLcom/android/server/notification/SnoozeHelper;->snooze(Lcom/android/server/notification/NotificationRecord;J)V
 PLcom/android/server/notification/SnoozeHelper;->storeRecord(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Landroid/util/ArrayMap;Ljava/lang/Object;)V
+PLcom/android/server/notification/SnoozeHelper;->storeRecordLocked(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Landroid/util/ArrayMap;Ljava/lang/Object;)V
 PLcom/android/server/notification/SnoozeHelper;->update(ILcom/android/server/notification/NotificationRecord;)V
 HSPLcom/android/server/notification/SnoozeHelper;->writeXml(Lorg/xmlpull/v1/XmlSerializer;)V
 HSPLcom/android/server/notification/SnoozeHelper;->writeXml(Lorg/xmlpull/v1/XmlSerializer;Landroid/util/ArrayMap;Ljava/lang/String;Lcom/android/server/notification/SnoozeHelper$Inserter;)V
@@ -24344,8 +26468,11 @@
 PLcom/android/server/notification/ValidateNotificationPeople;->access$300(Lcom/android/server/notification/ValidateNotificationPeople;)Landroid/util/LruCache;
 PLcom/android/server/notification/ValidateNotificationPeople;->access$600(Lcom/android/server/notification/ValidateNotificationPeople;Landroid/content/Context;Ljava/lang/String;)Lcom/android/server/notification/ValidateNotificationPeople$LookupResult;
 PLcom/android/server/notification/ValidateNotificationPeople;->access$700(Lcom/android/server/notification/ValidateNotificationPeople;Landroid/content/Context;Ljava/lang/String;)Lcom/android/server/notification/ValidateNotificationPeople$LookupResult;
+PLcom/android/server/notification/ValidateNotificationPeople;->access$800(Lcom/android/server/notification/ValidateNotificationPeople;ILjava/lang/String;)Ljava/lang/String;
 PLcom/android/server/notification/ValidateNotificationPeople;->access$800(Lcom/android/server/notification/ValidateNotificationPeople;Landroid/content/Context;Landroid/net/Uri;)Lcom/android/server/notification/ValidateNotificationPeople$LookupResult;
+PLcom/android/server/notification/ValidateNotificationPeople;->access$900(Lcom/android/server/notification/ValidateNotificationPeople;)Lcom/android/server/notification/NotificationUsageStats;
 HPLcom/android/server/notification/ValidateNotificationPeople;->access$900(Lcom/android/server/notification/ValidateNotificationPeople;ILjava/lang/String;)Ljava/lang/String;
+HPLcom/android/server/notification/ValidateNotificationPeople;->addContacts(Lcom/android/server/notification/ValidateNotificationPeople$LookupResult;Landroid/content/Context;Landroid/net/Uri;)V
 HSPLcom/android/server/notification/ValidateNotificationPeople;->combineLists([Ljava/lang/String;[Ljava/lang/String;)[Ljava/lang/String;
 HPLcom/android/server/notification/ValidateNotificationPeople;->getCacheKey(ILjava/lang/String;)Ljava/lang/String;
 PLcom/android/server/notification/ValidateNotificationPeople;->getContactAffinity(Landroid/os/UserHandle;Landroid/os/Bundle;IF)F
@@ -24552,13 +26679,16 @@
 HSPLcom/android/server/notification/ZenModeHelper;->updateSnoozing(Landroid/service/notification/ZenModeConfig$ZenRule;)Z
 HSPLcom/android/server/notification/ZenModeHelper;->writeXml(Lorg/xmlpull/v1/XmlSerializer;ZLjava/lang/Integer;I)V
 HSPLcom/android/server/notification/ZenModeHelper;->zenSeverity(I)I
+PLcom/android/server/notification/toast/CustomToastRecord;-><init>(Lcom/android/server/notification/NotificationManagerService;IILjava/lang/String;Landroid/os/IBinder;Landroid/app/ITransientNotification;ILandroid/os/Binder;I)V
 PLcom/android/server/notification/toast/CustomToastRecord;-><init>(Lcom/android/server/notification/NotificationManagerService;ILjava/lang/String;Landroid/os/IBinder;Landroid/app/ITransientNotification;ILandroid/os/Binder;I)V
 HPLcom/android/server/notification/toast/CustomToastRecord;->hide()V
 HPLcom/android/server/notification/toast/CustomToastRecord;->show()Z
+PLcom/android/server/notification/toast/TextToastRecord;-><init>(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/statusbar/StatusBarManagerInternal;IILjava/lang/String;Landroid/os/IBinder;Ljava/lang/CharSequence;ILandroid/os/Binder;ILandroid/app/ITransientNotificationCallback;)V
 HPLcom/android/server/notification/toast/TextToastRecord;-><init>(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/statusbar/StatusBarManagerInternal;ILjava/lang/String;Landroid/os/IBinder;Ljava/lang/CharSequence;ILandroid/os/Binder;ILandroid/app/ITransientNotificationCallback;)V
 HPLcom/android/server/notification/toast/TextToastRecord;->hide()V
 HPLcom/android/server/notification/toast/TextToastRecord;->show()Z
 PLcom/android/server/notification/toast/TextToastRecord;->toString()Ljava/lang/String;
+PLcom/android/server/notification/toast/ToastRecord;-><init>(Lcom/android/server/notification/NotificationManagerService;IILjava/lang/String;Landroid/os/IBinder;ILandroid/os/Binder;I)V
 HPLcom/android/server/notification/toast/ToastRecord;-><init>(Lcom/android/server/notification/NotificationManagerService;ILjava/lang/String;Landroid/os/IBinder;ILandroid/os/Binder;I)V
 PLcom/android/server/notification/toast/ToastRecord;->dump(Ljava/io/PrintWriter;Ljava/lang/String;Lcom/android/server/notification/NotificationManagerService$DumpFilter;)V
 PLcom/android/server/notification/toast/ToastRecord;->getDuration()I
@@ -24591,6 +26721,7 @@
 HSPLcom/android/server/oemlock/OemLockService;->getOemLock(Landroid/content/Context;)Lcom/android/server/oemlock/OemLock;
 HSPLcom/android/server/oemlock/OemLockService;->onStart()V
 PLcom/android/server/oemlock/OemLockService;->setPersistentDataBlockOemUnlockAllowedBit(Z)V
+PLcom/android/server/oemlock/PersistentDataBlockLock;-><init>(Landroid/content/Context;)V
 HSPLcom/android/server/oemlock/VendorLock;-><init>(Landroid/content/Context;Landroid/hardware/oemlock/V1_0/IOemLock;)V
 PLcom/android/server/oemlock/VendorLock;->getLockName()Ljava/lang/String;
 HSPLcom/android/server/oemlock/VendorLock;->getOemLockHalService()Landroid/hardware/oemlock/V1_0/IOemLock;
@@ -24603,6 +26734,9 @@
 HPLcom/android/server/oemlock/VendorLock;->toByteArrayList([B)Ljava/util/ArrayList;
 HSPLcom/android/server/om/-$$Lambda$IdmapDaemon$Connection$4U-n0RSv1BPv15mvu8B8zXARcpk;-><init>(Lcom/android/server/om/IdmapDaemon$Connection;)V
 PLcom/android/server/om/-$$Lambda$IdmapDaemon$Connection$4U-n0RSv1BPv15mvu8B8zXARcpk;->run()V
+PLcom/android/server/om/-$$Lambda$IdmapDaemon$PJzhiOHnyxvsKcpF_77d27eStZs;-><clinit>()V
+PLcom/android/server/om/-$$Lambda$IdmapDaemon$PJzhiOHnyxvsKcpF_77d27eStZs;-><init>()V
+PLcom/android/server/om/-$$Lambda$IdmapDaemon$PJzhiOHnyxvsKcpF_77d27eStZs;->binderDied()V
 HSPLcom/android/server/om/-$$Lambda$IdmapDaemon$hZvlb8B5bMAnD3h9mHLjOQXKSTI;-><clinit>()V
 HSPLcom/android/server/om/-$$Lambda$IdmapDaemon$hZvlb8B5bMAnD3h9mHLjOQXKSTI;-><init>()V
 PLcom/android/server/om/-$$Lambda$IdmapDaemon$hZvlb8B5bMAnD3h9mHLjOQXKSTI;->binderDied()V
@@ -24653,6 +26787,7 @@
 HSPLcom/android/server/om/IdmapDaemon;-><clinit>()V
 HSPLcom/android/server/om/IdmapDaemon;-><init>()V
 HSPLcom/android/server/om/IdmapDaemon;->access$000()Ljava/lang/Object;
+PLcom/android/server/om/IdmapDaemon;->access$000(Lcom/android/server/om/IdmapDaemon;)Ljava/lang/Object;
 HSPLcom/android/server/om/IdmapDaemon;->access$100(Lcom/android/server/om/IdmapDaemon;)Ljava/util/concurrent/atomic/AtomicInteger;
 PLcom/android/server/om/IdmapDaemon;->access$200(Lcom/android/server/om/IdmapDaemon;)Landroid/os/IIdmap2;
 PLcom/android/server/om/IdmapDaemon;->access$202(Lcom/android/server/om/IdmapDaemon;Landroid/os/IIdmap2;)Landroid/os/IIdmap2;
@@ -24660,13 +26795,16 @@
 HSPLcom/android/server/om/IdmapDaemon;->connect()Lcom/android/server/om/IdmapDaemon$Connection;
 HSPLcom/android/server/om/IdmapDaemon;->createIdmap(Ljava/lang/String;Ljava/lang/String;IZI)Ljava/lang/String;
 HSPLcom/android/server/om/IdmapDaemon;->getIdmapPath(Ljava/lang/String;I)Ljava/lang/String;
+PLcom/android/server/om/IdmapDaemon;->getIdmapService()Landroid/os/IBinder;
 HSPLcom/android/server/om/IdmapDaemon;->getInstance()Lcom/android/server/om/IdmapDaemon;
 HSPLcom/android/server/om/IdmapDaemon;->lambda$connect$0()Landroid/os/IBinder;
 PLcom/android/server/om/IdmapDaemon;->lambda$connect$1()V
+PLcom/android/server/om/IdmapDaemon;->lambda$getIdmapService$0()V
 PLcom/android/server/om/IdmapDaemon;->removeIdmap(Ljava/lang/String;I)Z
 HSPLcom/android/server/om/IdmapDaemon;->startIdmapService()V
 PLcom/android/server/om/IdmapDaemon;->stopIdmapService()V
 HSPLcom/android/server/om/IdmapDaemon;->verifyIdmap(Ljava/lang/String;IZI)Z
+PLcom/android/server/om/IdmapDaemon;->verifyIdmap(Ljava/lang/String;Ljava/lang/String;IZI)Z
 HSPLcom/android/server/om/IdmapManager;-><clinit>()V
 HSPLcom/android/server/om/IdmapManager;-><init>(Lcom/android/server/om/OverlayManagerServiceImpl$PackageManagerHelper;)V
 HSPLcom/android/server/om/IdmapManager;-><init>(Lcom/android/server/om/OverlayableInfoCallback;)V
@@ -24714,13 +26852,17 @@
 HSPLcom/android/server/om/OverlayManagerService$PackageManagerHelper;->signaturesMatching(Ljava/lang/String;Ljava/lang/String;I)Z
 HSPLcom/android/server/om/OverlayManagerService$PackageManagerHelperImpl;-><init>(Landroid/content/Context;)V
 HSPLcom/android/server/om/OverlayManagerService$PackageManagerHelperImpl;->cachePackageInfo(Ljava/lang/String;ILandroid/content/pm/PackageInfo;)V
+PLcom/android/server/om/OverlayManagerService$PackageManagerHelperImpl;->doesTargetDefineOverlayable(Ljava/lang/String;I)Z
 PLcom/android/server/om/OverlayManagerService$PackageManagerHelperImpl;->dump(Ljava/io/PrintWriter;Lcom/android/server/om/DumpState;)V
+PLcom/android/server/om/OverlayManagerService$PackageManagerHelperImpl;->enforcePermission(Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/om/OverlayManagerService$PackageManagerHelperImpl;->forgetPackageInfo(Ljava/lang/String;I)V
 HSPLcom/android/server/om/OverlayManagerService$PackageManagerHelperImpl;->getCachedPackageInfo(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;
 HSPLcom/android/server/om/OverlayManagerService$PackageManagerHelperImpl;->getNamedActors()Ljava/util/Map;
 HSPLcom/android/server/om/OverlayManagerService$PackageManagerHelperImpl;->getOverlayPackages(I)Ljava/util/List;
 HSPLcom/android/server/om/OverlayManagerService$PackageManagerHelperImpl;->getOverlayableForTarget(Ljava/lang/String;Ljava/lang/String;I)Landroid/content/om/OverlayableInfo;
 HSPLcom/android/server/om/OverlayManagerService$PackageManagerHelperImpl;->getPackageInfo(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;
 HSPLcom/android/server/om/OverlayManagerService$PackageManagerHelperImpl;->getPackageInfo(Ljava/lang/String;IZ)Landroid/content/pm/PackageInfo;
+PLcom/android/server/om/OverlayManagerService$PackageManagerHelperImpl;->getPackagesForUid(I)[Ljava/lang/String;
 HSPLcom/android/server/om/OverlayManagerService$PackageManagerHelperImpl;->signaturesMatching(Ljava/lang/String;Ljava/lang/String;I)Z
 HSPLcom/android/server/om/OverlayManagerService$PackageReceiver;-><init>(Lcom/android/server/om/OverlayManagerService;)V
 HSPLcom/android/server/om/OverlayManagerService$PackageReceiver;-><init>(Lcom/android/server/om/OverlayManagerService;Lcom/android/server/om/OverlayManagerService$1;)V
@@ -24823,6 +26965,7 @@
 HSPLcom/android/server/om/OverlayManagerSettings$SettingsItem;->access$300(Lcom/android/server/om/OverlayManagerSettings$SettingsItem;Ljava/lang/String;)Z
 HSPLcom/android/server/om/OverlayManagerSettings$SettingsItem;->access$400(Lcom/android/server/om/OverlayManagerSettings$SettingsItem;)Z
 HSPLcom/android/server/om/OverlayManagerSettings$SettingsItem;->access$400(Lcom/android/server/om/OverlayManagerSettings$SettingsItem;Ljava/lang/String;)Z
+PLcom/android/server/om/OverlayManagerSettings$SettingsItem;->access$400(Lcom/android/server/om/OverlayManagerSettings$SettingsItem;Z)Z
 HSPLcom/android/server/om/OverlayManagerSettings$SettingsItem;->access$500(Lcom/android/server/om/OverlayManagerSettings$SettingsItem;)I
 HSPLcom/android/server/om/OverlayManagerSettings$SettingsItem;->access$500(Lcom/android/server/om/OverlayManagerSettings$SettingsItem;Ljava/lang/String;)Z
 PLcom/android/server/om/OverlayManagerSettings$SettingsItem;->access$500(Lcom/android/server/om/OverlayManagerSettings$SettingsItem;Z)Z
@@ -24914,11 +27057,15 @@
 PLcom/android/server/os/BugreportManagerServiceImpl;->access$000(Lcom/android/server/os/BugreportManagerServiceImpl;)Ljava/lang/Object;
 PLcom/android/server/os/BugreportManagerServiceImpl;->cancelBugreport()V
 PLcom/android/server/os/BugreportManagerServiceImpl;->ensureIsPrimaryUser()V
+PLcom/android/server/os/BugreportManagerServiceImpl;->getDumpstateBinderServiceLocked()Landroid/os/IDumpstate;
 PLcom/android/server/os/BugreportManagerServiceImpl;->isDumpstateBinderServiceRunningLocked()Z
+PLcom/android/server/os/BugreportManagerServiceImpl;->logAndThrow(Ljava/lang/String;)V
 PLcom/android/server/os/BugreportManagerServiceImpl;->reportError(Landroid/os/IDumpstateListener;I)V
 PLcom/android/server/os/BugreportManagerServiceImpl;->startAndGetDumpstateBinderServiceLocked()Landroid/os/IDumpstate;
 PLcom/android/server/os/BugreportManagerServiceImpl;->startBugreport(ILjava/lang/String;Ljava/io/FileDescriptor;Ljava/io/FileDescriptor;ILandroid/os/IDumpstateListener;)V
+PLcom/android/server/os/BugreportManagerServiceImpl;->startBugreport(ILjava/lang/String;Ljava/io/FileDescriptor;Ljava/io/FileDescriptor;ILandroid/os/IDumpstateListener;Z)V
 PLcom/android/server/os/BugreportManagerServiceImpl;->startBugreportLocked(ILjava/lang/String;Ljava/io/FileDescriptor;Ljava/io/FileDescriptor;ILandroid/os/IDumpstateListener;)V
+PLcom/android/server/os/BugreportManagerServiceImpl;->startBugreportLocked(ILjava/lang/String;Ljava/io/FileDescriptor;Ljava/io/FileDescriptor;ILandroid/os/IDumpstateListener;Z)V
 PLcom/android/server/os/BugreportManagerServiceImpl;->validateBugreportMode(I)V
 HSPLcom/android/server/os/DeviceIdentifiersPolicyService$DeviceIdentifiersPolicy;-><init>(Landroid/content/Context;)V
 HSPLcom/android/server/os/DeviceIdentifiersPolicyService$DeviceIdentifiersPolicy;->getSerial()Ljava/lang/String;
@@ -24947,6 +27094,12 @@
 HSPLcom/android/server/people/PeopleServiceInternal;-><init>()V
 PLcom/android/server/people/data/-$$Lambda$DataMaintenanceService$pZUzfdXzCXsv1D-xTvqArhV-TxI;-><init>(Lcom/android/server/people/data/DataMaintenanceService;ILandroid/app/job/JobParameters;)V
 PLcom/android/server/people/data/-$$Lambda$DataMaintenanceService$pZUzfdXzCXsv1D-xTvqArhV-TxI;->run()V
+PLcom/android/server/people/data/-$$Lambda$DataManager$1AVkzisn06kivBI0ljIdzW4xBFk;-><init>(Ljava/util/Set;)V
+HPLcom/android/server/people/data/-$$Lambda$DataManager$1AVkzisn06kivBI0ljIdzW4xBFk;->accept(Ljava/lang/Object;)V
+PLcom/android/server/people/data/-$$Lambda$DataManager$2PaGggbKiSnqmSoymbF0v-MHUN8;-><init>(Landroid/os/CancellationSignal;)V
+PLcom/android/server/people/data/-$$Lambda$DataManager$6pZUUZdUbBofvEMr6GDYvsQO9wE;-><init>(Ljava/util/Set;Ljava/util/List;)V
+PLcom/android/server/people/data/-$$Lambda$DataManager$9_cqwu_v_T9xr29OyOFsOM1JRW4;-><init>(Lcom/android/server/people/data/DataManager;I)V
+PLcom/android/server/people/data/-$$Lambda$DataManager$9_cqwu_v_T9xr29OyOFsOM1JRW4;->run()V
 PLcom/android/server/people/data/-$$Lambda$DataManager$CallLogContentObserver$F795P2fXEZGvzLUih_SIpFcsyic;-><init>(Ljava/lang/String;Lcom/android/server/people/data/Event;)V
 PLcom/android/server/people/data/-$$Lambda$DataManager$CallLogContentObserver$F795P2fXEZGvzLUih_SIpFcsyic;->accept(Ljava/lang/Object;)V
 HPLcom/android/server/people/data/-$$Lambda$DataManager$ContactsContentObserver$wv19gIIQIhM79fILSTcdGXPmrF0;-><init>(Landroid/net/Uri;Lcom/android/server/people/data/DataManager$ContactsContentObserver$ConversationSelector;)V
@@ -24964,6 +27117,12 @@
 PLcom/android/server/people/data/-$$Lambda$DataManager$UsageStatsQueryRunnable$XYAxcpC9us0TDcNCO-NIcs5ajqQ;-><init>(Lcom/android/server/people/data/DataManager$UsageStatsQueryRunnable;I)V
 HPLcom/android/server/people/data/-$$Lambda$DataManager$UsageStatsQueryRunnable$XYAxcpC9us0TDcNCO-NIcs5ajqQ;->apply(Ljava/lang/Object;)Ljava/lang/Object;
 PLcom/android/server/people/data/-$$Lambda$DataManager$bD3rtmmxoewwfd8otWlj3817k9I;-><init>(Ljava/util/Set;Ljava/util/List;)V
+PLcom/android/server/people/data/-$$Lambda$DataManager$cNwnFF2X1aev7d3V9cSDCsqMMMk;-><init>(Landroid/os/CancellationSignal;)V
+PLcom/android/server/people/data/-$$Lambda$DataManager$ceDzy5VXjXt37sO3OJ89MHniTpY;-><init>(Lcom/android/server/people/data/DataManager;I)V
+PLcom/android/server/people/data/-$$Lambda$DataManager$ceDzy5VXjXt37sO3OJ89MHniTpY;->run()V
+PLcom/android/server/people/data/-$$Lambda$DataManager$ePfoU6xce6fV5ihfbqLOLz2ubJM;-><init>(Ljava/util/Set;)V
+HPLcom/android/server/people/data/-$$Lambda$DataManager$ePfoU6xce6fV5ihfbqLOLz2ubJM;->accept(Ljava/lang/Object;)V
+PLcom/android/server/people/data/-$$Lambda$DataManager$lf-NuHvKPG28h9B0DUOJdjK4FJY;-><init>(Ljava/util/Set;Ljava/util/List;)V
 PLcom/android/server/people/data/-$$Lambda$DataManager$uJBSlUElmiK7KhI29TaNgrYadmw;-><init>(Ljava/util/Set;)V
 HPLcom/android/server/people/data/-$$Lambda$DataManager$uJBSlUElmiK7KhI29TaNgrYadmw;->accept(Ljava/lang/Object;)V
 PLcom/android/server/people/data/-$$Lambda$DataManager$wv7ooDmmkMQmE1mC-w4Rx8IZ8rc;-><init>(Landroid/os/CancellationSignal;)V
@@ -24980,12 +27139,13 @@
 HPLcom/android/server/people/data/CallLogQueryHelper;->querySince(J)Z
 PLcom/android/server/people/data/CallLogQueryHelper;->validateEvent(Ljava/lang/String;JI)Z
 HPLcom/android/server/people/data/ContactsQueryHelper;-><init>(Landroid/content/Context;)V
-PLcom/android/server/people/data/ContactsQueryHelper;->getContactUri()Landroid/net/Uri;
+HPLcom/android/server/people/data/ContactsQueryHelper;->getContactUri()Landroid/net/Uri;
 HPLcom/android/server/people/data/ContactsQueryHelper;->queryContact(Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)Z
 HPLcom/android/server/people/data/ContactsQueryHelper;->queryPhoneNumber(Ljava/lang/String;)Z
 HPLcom/android/server/people/data/ContactsQueryHelper;->querySince(J)Z
 PLcom/android/server/people/data/DataMaintenanceService;-><clinit>()V
 PLcom/android/server/people/data/DataMaintenanceService;-><init>()V
+PLcom/android/server/people/data/DataMaintenanceService;->cancelJob(Landroid/content/Context;I)V
 PLcom/android/server/people/data/DataMaintenanceService;->getJobId(I)I
 PLcom/android/server/people/data/DataMaintenanceService;->getUserId(I)I
 PLcom/android/server/people/data/DataMaintenanceService;->lambda$onStartJob$0$DataMaintenanceService(ILandroid/app/job/JobParameters;)V
@@ -24999,10 +27159,10 @@
 PLcom/android/server/people/data/DataManager$CallLogContentObserver;->lambda$accept$0(Ljava/lang/String;Lcom/android/server/people/data/Event;Lcom/android/server/people/data/UserData;)V
 PLcom/android/server/people/data/DataManager$CallLogContentObserver;->onChange(Z)V
 HPLcom/android/server/people/data/DataManager$ContactsContentObserver$ConversationSelector;-><init>(Lcom/android/server/people/data/DataManager$ContactsContentObserver;)V
-PLcom/android/server/people/data/DataManager$ContactsContentObserver$ConversationSelector;-><init>(Lcom/android/server/people/data/DataManager$ContactsContentObserver;Lcom/android/server/people/data/DataManager$1;)V
+HPLcom/android/server/people/data/DataManager$ContactsContentObserver$ConversationSelector;-><init>(Lcom/android/server/people/data/DataManager$ContactsContentObserver;Lcom/android/server/people/data/DataManager$1;)V
 PLcom/android/server/people/data/DataManager$ContactsContentObserver$ConversationSelector;->access$1100(Lcom/android/server/people/data/DataManager$ContactsContentObserver$ConversationSelector;)Lcom/android/server/people/data/ConversationInfo;
 PLcom/android/server/people/data/DataManager$ContactsContentObserver$ConversationSelector;->access$1200(Lcom/android/server/people/data/DataManager$ContactsContentObserver$ConversationSelector;)Lcom/android/server/people/data/ConversationInfo;
-PLcom/android/server/people/data/DataManager$ContactsContentObserver$ConversationSelector;->access$1300(Lcom/android/server/people/data/DataManager$ContactsContentObserver$ConversationSelector;)Lcom/android/server/people/data/ConversationInfo;
+HPLcom/android/server/people/data/DataManager$ContactsContentObserver$ConversationSelector;->access$1300(Lcom/android/server/people/data/DataManager$ContactsContentObserver$ConversationSelector;)Lcom/android/server/people/data/ConversationInfo;
 PLcom/android/server/people/data/DataManager$ContactsContentObserver$ConversationSelector;->access$900(Lcom/android/server/people/data/DataManager$ContactsContentObserver$ConversationSelector;)Lcom/android/server/people/data/ConversationInfo;
 PLcom/android/server/people/data/DataManager$ContactsContentObserver;-><init>(Lcom/android/server/people/data/DataManager;Landroid/os/Handler;)V
 PLcom/android/server/people/data/DataManager$ContactsContentObserver;-><init>(Lcom/android/server/people/data/DataManager;Landroid/os/Handler;Lcom/android/server/people/data/DataManager$1;)V
@@ -25082,6 +27242,7 @@
 PLcom/android/server/people/data/DataManager;->access$800(Lcom/android/server/people/data/DataManager;I)Lcom/android/server/people/data/UserData;
 PLcom/android/server/people/data/DataManager;->access$900(Lcom/android/server/people/data/DataManager;)Landroid/content/Context;
 HSPLcom/android/server/people/data/DataManager;->access$900(Lcom/android/server/people/data/DataManager;)Lcom/android/server/people/data/DataManager$Injector;
+PLcom/android/server/people/data/DataManager;->cleanupUser(I)V
 PLcom/android/server/people/data/DataManager;->forAllPackages(Ljava/util/function/Consumer;)V
 HPLcom/android/server/people/data/DataManager;->forAllUnlockedUsers(Ljava/util/function/Consumer;)V
 HPLcom/android/server/people/data/DataManager;->getEventHistoryIfEligible(Landroid/service/notification/StatusBarNotification;)Lcom/android/server/people/data/EventHistoryImpl;
@@ -25091,13 +27252,19 @@
 HPLcom/android/server/people/data/DataManager;->getUnlockedUserData(I)Lcom/android/server/people/data/UserData;
 HSPLcom/android/server/people/data/DataManager;->initialize()V
 PLcom/android/server/people/data/DataManager;->isPersonShortcut(Landroid/content/pm/ShortcutInfo;)Z
+PLcom/android/server/people/data/DataManager;->lambda$onUserStopping$1$DataManager(I)V
+PLcom/android/server/people/data/DataManager;->lambda$onUserUnlocked$0$DataManager(I)V
 HPLcom/android/server/people/data/DataManager;->lambda$pruneUninstalledPackageData$1(Ljava/util/Set;Lcom/android/server/pm/parsing/pkg/AndroidPackage;)V
+HPLcom/android/server/people/data/DataManager;->lambda$pruneUninstalledPackageData$2(Ljava/util/Set;Lcom/android/server/pm/parsing/pkg/AndroidPackage;)V
+HPLcom/android/server/people/data/DataManager;->lambda$pruneUninstalledPackageData$3(Ljava/util/Set;Lcom/android/server/pm/parsing/pkg/AndroidPackage;)V
 HPLcom/android/server/people/data/DataManager;->onShortcutAddedOrUpdated(Landroid/content/pm/ShortcutInfo;)V
 PLcom/android/server/people/data/DataManager;->onUserStopped(I)V
+PLcom/android/server/people/data/DataManager;->onUserStopping(I)V
 PLcom/android/server/people/data/DataManager;->onUserUnlocked(I)V
 PLcom/android/server/people/data/DataManager;->pruneDataForUser(ILandroid/os/CancellationSignal;)V
 PLcom/android/server/people/data/DataManager;->pruneUninstalledPackageData(Lcom/android/server/people/data/UserData;)V
 HPLcom/android/server/people/data/DataManager;->queryUsageStatsService(IJJ)V
+PLcom/android/server/people/data/DataManager;->setupUser(I)V
 PLcom/android/server/people/data/DataManager;->updateDefaultDialer(Lcom/android/server/people/data/UserData;)V
 PLcom/android/server/people/data/DataManager;->updateDefaultSmsApp(Lcom/android/server/people/data/UserData;)V
 PLcom/android/server/people/data/Event$Builder;-><init>(JI)V
@@ -25129,6 +27296,7 @@
 HPLcom/android/server/people/data/SmsQueryHelper;->validateEvent(Ljava/lang/String;JI)Z
 PLcom/android/server/people/data/UsageStatsQueryHelper;-><init>(ILjava/util/function/Function;)V
 HPLcom/android/server/people/data/UsageStatsQueryHelper;->getLastEventTimestamp()J
+PLcom/android/server/people/data/UsageStatsQueryHelper;->getUsageStatsManagerInternal()Landroid/app/usage/UsageStatsManagerInternal;
 HPLcom/android/server/people/data/UsageStatsQueryHelper;->querySince(J)Z
 PLcom/android/server/people/data/UserData;-><clinit>()V
 PLcom/android/server/people/data/UserData;-><init>(I)V
@@ -25136,12 +27304,13 @@
 PLcom/android/server/people/data/UserData;-><init>(ILjava/util/concurrent/ScheduledExecutorService;Lcom/android/server/people/data/ContactsQueryHelper;)V
 PLcom/android/server/people/data/UserData;->deletePackageData(Ljava/lang/String;)V
 HPLcom/android/server/people/data/UserData;->forAllPackages(Ljava/util/function/Consumer;)V
-PLcom/android/server/people/data/UserData;->getBackupPayload()[B
+HPLcom/android/server/people/data/UserData;->getBackupPayload()[B
 PLcom/android/server/people/data/UserData;->getDefaultDialer()Lcom/android/server/people/data/PackageData;
 PLcom/android/server/people/data/UserData;->getDefaultSmsApp()Lcom/android/server/people/data/PackageData;
 HPLcom/android/server/people/data/UserData;->getPackageData(Ljava/lang/String;)Lcom/android/server/people/data/PackageData;
 PLcom/android/server/people/data/UserData;->getUserId()I
 HPLcom/android/server/people/data/UserData;->isUnlocked()Z
+PLcom/android/server/people/data/UserData;->loadUserData()V
 PLcom/android/server/people/data/UserData;->setDefaultDialer(Ljava/lang/String;)V
 PLcom/android/server/people/data/UserData;->setDefaultSmsApp(Ljava/lang/String;)V
 PLcom/android/server/people/data/UserData;->setUserStopped()V
@@ -25180,26 +27349,39 @@
 HPLcom/android/server/pm/-$$Lambda$BackgroundDexOptService$-KiE2NsUP--OYmoSDt9BwEQICZw;-><init>(Lcom/android/server/pm/PackageManagerService;Ljava/lang/String;II)V
 HPLcom/android/server/pm/-$$Lambda$BackgroundDexOptService$-KiE2NsUP--OYmoSDt9BwEQICZw;->get()Ljava/lang/Object;
 HPLcom/android/server/pm/-$$Lambda$BackgroundDexOptService$TAsfDUuoxt92xKFoSCfpMUmY2Es;-><init>(Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/dex/DexoptOptions;)V
-PLcom/android/server/pm/-$$Lambda$BackgroundDexOptService$TAsfDUuoxt92xKFoSCfpMUmY2Es;->get()Ljava/lang/Object;
+HPLcom/android/server/pm/-$$Lambda$BackgroundDexOptService$TAsfDUuoxt92xKFoSCfpMUmY2Es;->get()Ljava/lang/Object;
 HSPLcom/android/server/pm/-$$Lambda$ComponentResolver$PuHbZd5KEOMGjkH8xDOhOwfLtC0;-><clinit>()V
 HSPLcom/android/server/pm/-$$Lambda$ComponentResolver$PuHbZd5KEOMGjkH8xDOhOwfLtC0;-><init>()V
 HSPLcom/android/server/pm/-$$Lambda$ComponentResolver$PuHbZd5KEOMGjkH8xDOhOwfLtC0;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
 PLcom/android/server/pm/-$$Lambda$CrossProfileAppsServiceImpl$-BT6ToCKHdhfX2-IK4pp-hGipzw;-><init>(Lcom/android/server/pm/CrossProfileAppsServiceImpl;ILjava/lang/String;ILjava/lang/String;)V
 PLcom/android/server/pm/-$$Lambda$CrossProfileAppsServiceImpl$-BT6ToCKHdhfX2-IK4pp-hGipzw;->getOrThrow()Ljava/lang/Object;
+PLcom/android/server/pm/-$$Lambda$CrossProfileAppsServiceImpl$35r-Eh7boIF7EPFqH7bKXyZYEDo;-><init>(Lcom/android/server/pm/CrossProfileAppsServiceImpl;Ljava/lang/String;II)V
+HPLcom/android/server/pm/-$$Lambda$CrossProfileAppsServiceImpl$35r-Eh7boIF7EPFqH7bKXyZYEDo;->getOrThrow()Ljava/lang/Object;
 PLcom/android/server/pm/-$$Lambda$CrossProfileAppsServiceImpl$4kTzFa_zjeGMtJVy5CluIOehAmM;-><init>(Lcom/android/server/pm/CrossProfileAppsServiceImpl;ILjava/lang/String;)V
 PLcom/android/server/pm/-$$Lambda$CrossProfileAppsServiceImpl$4kTzFa_zjeGMtJVy5CluIOehAmM;->getOrThrow()Ljava/lang/Object;
 PLcom/android/server/pm/-$$Lambda$CrossProfileAppsServiceImpl$D4Z_0MUKQxAr3kDglyup8aB9XLE;-><init>(Lcom/android/server/pm/CrossProfileAppsServiceImpl;Landroid/content/Intent;IILandroid/content/ComponentName;)V
 PLcom/android/server/pm/-$$Lambda$CrossProfileAppsServiceImpl$D4Z_0MUKQxAr3kDglyup8aB9XLE;->runOrThrow()V
-PLcom/android/server/pm/-$$Lambda$CrossProfileAppsServiceImpl$DxhjfM3U9U3V3tJbzSWj7AMLCBE;-><init>(Lcom/android/server/pm/CrossProfileAppsServiceImpl;Ljava/lang/String;II)V
+HPLcom/android/server/pm/-$$Lambda$CrossProfileAppsServiceImpl$DxhjfM3U9U3V3tJbzSWj7AMLCBE;-><init>(Lcom/android/server/pm/CrossProfileAppsServiceImpl;Ljava/lang/String;II)V
 HPLcom/android/server/pm/-$$Lambda$CrossProfileAppsServiceImpl$DxhjfM3U9U3V3tJbzSWj7AMLCBE;->getOrThrow()Ljava/lang/Object;
 PLcom/android/server/pm/-$$Lambda$CrossProfileAppsServiceImpl$HVfTkMl1ZNC9cAfi1atsp3Dwnyg;-><init>(Lcom/android/server/pm/CrossProfileAppsServiceImpl;Ljava/lang/String;II)V
 PLcom/android/server/pm/-$$Lambda$CrossProfileAppsServiceImpl$HVfTkMl1ZNC9cAfi1atsp3Dwnyg;->getOrThrow()Ljava/lang/Object;
+PLcom/android/server/pm/-$$Lambda$CrossProfileAppsServiceImpl$T3De7UNuZVnidaztgPZvPR9AaFc;-><clinit>()V
+PLcom/android/server/pm/-$$Lambda$CrossProfileAppsServiceImpl$T3De7UNuZVnidaztgPZvPR9AaFc;-><init>()V
+PLcom/android/server/pm/-$$Lambda$CrossProfileAppsServiceImpl$T3De7UNuZVnidaztgPZvPR9AaFc;->apply(Ljava/lang/Object;)Ljava/lang/Object;
+PLcom/android/server/pm/-$$Lambda$CrossProfileAppsServiceImpl$ZwEbVtiAVN8XYZYxg44xuGkFKak;-><init>(Lcom/android/server/pm/CrossProfileAppsServiceImpl;ILjava/lang/String;)V
+HPLcom/android/server/pm/-$$Lambda$CrossProfileAppsServiceImpl$ZwEbVtiAVN8XYZYxg44xuGkFKak;->getOrThrow()Ljava/lang/Object;
 HPLcom/android/server/pm/-$$Lambda$CrossProfileAppsServiceImpl$bl8duoKAQm4-uSci6ZlA_aEdeg8;-><init>(Lcom/android/server/pm/CrossProfileAppsServiceImpl;ILjava/lang/String;)V
 HPLcom/android/server/pm/-$$Lambda$CrossProfileAppsServiceImpl$bl8duoKAQm4-uSci6ZlA_aEdeg8;->getOrThrow()Ljava/lang/Object;
+PLcom/android/server/pm/-$$Lambda$CrossProfileAppsServiceImpl$ejSUy1m1wyOuhw0Svv8oy0FfoJk;-><init>(Lcom/android/server/pm/CrossProfileAppsServiceImpl;I)V
+PLcom/android/server/pm/-$$Lambda$CrossProfileAppsServiceImpl$ejSUy1m1wyOuhw0Svv8oy0FfoJk;->getOrThrow()Ljava/lang/Object;
 PLcom/android/server/pm/-$$Lambda$CrossProfileAppsServiceImpl$i8pCn3vFy03m7u0vRgPEFDJBRZ8;-><init>(Lcom/android/server/pm/CrossProfileAppsServiceImpl;Ljava/lang/String;)V
 PLcom/android/server/pm/-$$Lambda$CrossProfileAppsServiceImpl$i8pCn3vFy03m7u0vRgPEFDJBRZ8;->getOrThrow()Ljava/lang/Object;
 PLcom/android/server/pm/-$$Lambda$CrossProfileAppsServiceImpl$kHkdp7f4qbaDOgRXrN-WS0lCU9U;-><init>(Lcom/android/server/pm/CrossProfileAppsServiceImpl;ILjava/lang/String;I)V
 PLcom/android/server/pm/-$$Lambda$CrossProfileAppsServiceImpl$kHkdp7f4qbaDOgRXrN-WS0lCU9U;->runOrThrow()V
+PLcom/android/server/pm/-$$Lambda$CrossProfileAppsServiceImpl$l4E6Ae9ff49LL4YaaBkPQrN1gzE;-><init>(Lcom/android/server/pm/CrossProfileAppsServiceImpl;Landroid/content/Intent;II)V
+PLcom/android/server/pm/-$$Lambda$CrossProfileAppsServiceImpl$l4E6Ae9ff49LL4YaaBkPQrN1gzE;->runOrThrow()V
+PLcom/android/server/pm/-$$Lambda$CrossProfileAppsServiceImpl$rCCSB6InuDi6ezubsUXw_B_FODI;-><init>(Lcom/android/server/pm/CrossProfileAppsServiceImpl;I)V
+PLcom/android/server/pm/-$$Lambda$CrossProfileAppsServiceImpl$rCCSB6InuDi6ezubsUXw_B_FODI;->accept(Ljava/lang/Object;)V
 HSPLcom/android/server/pm/-$$Lambda$DpkuTFpeWPmvN7iGgFrn8VkMVd4;-><clinit>()V
 HSPLcom/android/server/pm/-$$Lambda$DpkuTFpeWPmvN7iGgFrn8VkMVd4;-><init>()V
 HSPLcom/android/server/pm/-$$Lambda$DpkuTFpeWPmvN7iGgFrn8VkMVd4;->apply(Ljava/lang/Object;)Ljava/lang/Object;
@@ -25231,7 +27413,7 @@
 HSPLcom/android/server/pm/-$$Lambda$PLzRNNUpYHZlGNIn1ofLtN374Ow;-><clinit>()V
 HSPLcom/android/server/pm/-$$Lambda$PLzRNNUpYHZlGNIn1ofLtN374Ow;-><init>()V
 HSPLcom/android/server/pm/-$$Lambda$PackageInstallerService$vra5ZkE3juVvcgDBu5xv0wVzno8;-><init>(I)V
-PLcom/android/server/pm/-$$Lambda$PackageInstallerService$vra5ZkE3juVvcgDBu5xv0wVzno8;->test(I)Z
+HPLcom/android/server/pm/-$$Lambda$PackageInstallerService$vra5ZkE3juVvcgDBu5xv0wVzno8;->test(I)Z
 HSPLcom/android/server/pm/-$$Lambda$PackageInstallerSession$0MwsfMSD_PrEtElmOWjbhM7455A;-><init>(Ljava/io/FileFilter;)V
 HSPLcom/android/server/pm/-$$Lambda$PackageInstallerSession$0MwsfMSD_PrEtElmOWjbhM7455A;->test(Ljava/lang/Object;)Z
 PLcom/android/server/pm/-$$Lambda$PackageInstallerSession$0Oqu1oanLjaOBEcFPtJVCRQ0lHs;-><init>(Lcom/android/server/pm/PackageInstallerSession;Landroid/system/Int64Ref;)V
@@ -25262,6 +27444,11 @@
 HSPLcom/android/server/pm/-$$Lambda$PackageManagerService$-SI_LHw6Eiq8VNiFLLjJdCbGgSQ;->run()V
 PLcom/android/server/pm/-$$Lambda$PackageManagerService$0Regyd5pBrcIdGN2_jpl21L-KWw;-><init>(Lcom/android/server/pm/PackageManagerService;I)V
 PLcom/android/server/pm/-$$Lambda$PackageManagerService$0Regyd5pBrcIdGN2_jpl21L-KWw;->accept(Ljava/lang/Object;)V
+HSPLcom/android/server/pm/-$$Lambda$PackageManagerService$1i6Y2tMn7ZgU3qq2Qyiz0czgU-g;-><clinit>()V
+HSPLcom/android/server/pm/-$$Lambda$PackageManagerService$1i6Y2tMn7ZgU3qq2Qyiz0czgU-g;-><init>()V
+HSPLcom/android/server/pm/-$$Lambda$PackageManagerService$1i6Y2tMn7ZgU3qq2Qyiz0czgU-g;->accept(Ljava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/pm/-$$Lambda$PackageManagerService$33tR-KoAu3JbEdrD_OjcuA5085g;-><init>(Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/parsing/pkg/AndroidPackage;Lcom/android/server/pm/parsing/pkg/AndroidPackage;Ljava/util/ArrayList;)V
+PLcom/android/server/pm/-$$Lambda$PackageManagerService$33tR-KoAu3JbEdrD_OjcuA5085g;->run()V
 PLcom/android/server/pm/-$$Lambda$PackageManagerService$3TlqkUBuVM7NyAg7uqJCni92WOU;-><init>(Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService$PackageInstalledInfo;Landroid/content/IntentSender;)V
 PLcom/android/server/pm/-$$Lambda$PackageManagerService$3TlqkUBuVM7NyAg7uqJCni92WOU;->run()V
 HSPLcom/android/server/pm/-$$Lambda$PackageManagerService$3yxDU_uSU2kkdLuKkfPYVKvXKGw;-><clinit>()V
@@ -25275,10 +27462,14 @@
 HSPLcom/android/server/pm/-$$Lambda$PackageManagerService$8L7pRmGgOsUHi0VNMkDwO-flFqk;-><clinit>()V
 HSPLcom/android/server/pm/-$$Lambda$PackageManagerService$8L7pRmGgOsUHi0VNMkDwO-flFqk;-><init>()V
 HSPLcom/android/server/pm/-$$Lambda$PackageManagerService$8L7pRmGgOsUHi0VNMkDwO-flFqk;->apply(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLcom/android/server/pm/-$$Lambda$PackageManagerService$93yWNMP-e7A0Of4Ed1fIXs63utE;-><clinit>()V
+HSPLcom/android/server/pm/-$$Lambda$PackageManagerService$93yWNMP-e7A0Of4Ed1fIXs63utE;-><init>()V
 HSPLcom/android/server/pm/-$$Lambda$PackageManagerService$9nrhpVUScjAieIxS9iHE0hiaATk;-><init>(Lcom/android/server/pm/PackageManagerService;)V
 HSPLcom/android/server/pm/-$$Lambda$PackageManagerService$9nrhpVUScjAieIxS9iHE0hiaATk;->forEachPackage(Ljava/util/function/BiConsumer;)V
 PLcom/android/server/pm/-$$Lambda$PackageManagerService$9znobjOH7ab0F1jsW2oFdNipS-8;-><init>(Lcom/android/server/pm/PackageManagerService;ZLjava/util/List;)V
 PLcom/android/server/pm/-$$Lambda$PackageManagerService$9znobjOH7ab0F1jsW2oFdNipS-8;->run()V
+PLcom/android/server/pm/-$$Lambda$PackageManagerService$DgA5eAhvjiH6kMq2WYU8B282b-M;-><init>(Lcom/android/server/pm/PackageManagerService;[ILjava/lang/String;Ljava/lang/String;Landroid/os/Bundle;ILjava/lang/String;Landroid/content/IIntentReceiver;Landroid/util/SparseArray;[I)V
+PLcom/android/server/pm/-$$Lambda$PackageManagerService$DgA5eAhvjiH6kMq2WYU8B282b-M;->run()V
 PLcom/android/server/pm/-$$Lambda$PackageManagerService$E8wmDWkS1hMFlGgjBX_cxNdNPXc;-><init>(Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/parsing/pkg/AndroidPackage;IIILandroid/content/pm/IPackageDataObserver;Ljava/lang/String;)V
 PLcom/android/server/pm/-$$Lambda$PackageManagerService$E8wmDWkS1hMFlGgjBX_cxNdNPXc;->run()V
 HSPLcom/android/server/pm/-$$Lambda$PackageManagerService$EQHzRzxse-rtXNIoVfzT15c8LHI;-><clinit>()V
@@ -25287,6 +27478,8 @@
 HSPLcom/android/server/pm/-$$Lambda$PackageManagerService$FFJwRezEfCP4utcPN2U9pjn2hIo;-><clinit>()V
 HSPLcom/android/server/pm/-$$Lambda$PackageManagerService$FFJwRezEfCP4utcPN2U9pjn2hIo;-><init>()V
 HSPLcom/android/server/pm/-$$Lambda$PackageManagerService$FFJwRezEfCP4utcPN2U9pjn2hIo;->produce(Lcom/android/server/pm/PackageManagerService$Injector;Lcom/android/server/pm/PackageManagerService;)Ljava/lang/Object;
+PLcom/android/server/pm/-$$Lambda$PackageManagerService$IVwrF8dMtv5eEne1inTBiECMfDo;-><init>(Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService$PackageInstalledInfo;Landroid/content/IntentSender;)V
+PLcom/android/server/pm/-$$Lambda$PackageManagerService$IVwrF8dMtv5eEne1inTBiECMfDo;->run()V
 PLcom/android/server/pm/-$$Lambda$PackageManagerService$J0eEFDuLDZBCGkS0UBLQaQGBMN8;-><init>(Lcom/android/server/pm/PackageManagerService;Ljava/lang/String;ILjava/lang/String;)V
 PLcom/android/server/pm/-$$Lambda$PackageManagerService$J0eEFDuLDZBCGkS0UBLQaQGBMN8;->run()V
 HSPLcom/android/server/pm/-$$Lambda$PackageManagerService$JQITabyRBc2Nst0hnvtDUIYPLkk;-><clinit>()V
@@ -25294,6 +27487,10 @@
 HSPLcom/android/server/pm/-$$Lambda$PackageManagerService$JqISwjRG4Nrwn7K19yITMU1WH5g;-><init>(Lcom/android/server/pm/PackageManagerService;)V
 HPLcom/android/server/pm/-$$Lambda$PackageManagerService$KUTG4a_t__F9-jF9uKK4m5M6ED0;-><init>(I)V
 PLcom/android/server/pm/-$$Lambda$PackageManagerService$KUTG4a_t__F9-jF9uKK4m5M6ED0;->run()V
+HSPLcom/android/server/pm/-$$Lambda$PackageManagerService$MT-9i21h4RNnCW49A_O4cxNuz38;-><init>(Lcom/android/server/pm/PackageManagerService;)V
+HPLcom/android/server/pm/-$$Lambda$PackageManagerService$MT-9i21h4RNnCW49A_O4cxNuz38;->test(Ljava/lang/Object;)Z
+HSPLcom/android/server/pm/-$$Lambda$PackageManagerService$NOhDFtf63kwSrt001pe3Z5eI1EM;-><init>(Lcom/android/server/pm/PackageManagerService;)V
+HSPLcom/android/server/pm/-$$Lambda$PackageManagerService$NOhDFtf63kwSrt001pe3Z5eI1EM;->forEachPackage(Ljava/util/function/BiConsumer;)V
 PLcom/android/server/pm/-$$Lambda$PackageManagerService$PPALVjzIAqON2FdZv5soozZSLq8;-><init>(Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/parsing/pkg/AndroidPackage;Lcom/android/server/pm/parsing/pkg/AndroidPackage;Ljava/util/ArrayList;)V
 PLcom/android/server/pm/-$$Lambda$PackageManagerService$PPALVjzIAqON2FdZv5soozZSLq8;->run()V
 PLcom/android/server/pm/-$$Lambda$PackageManagerService$PackageManagerInternalImpl$JycGJrzHIngCbGMk68UBYZqLVhg;-><clinit>()V
@@ -25309,8 +27506,8 @@
 HSPLcom/android/server/pm/-$$Lambda$PackageManagerService$RoklvvEqbb0_WAziY4NuUNhrlUA;->run()V
 HSPLcom/android/server/pm/-$$Lambda$PackageManagerService$U47f17sf-Z0eef3W2xgzUB-ecR4;-><clinit>()V
 HSPLcom/android/server/pm/-$$Lambda$PackageManagerService$U47f17sf-Z0eef3W2xgzUB-ecR4;-><init>()V
-PLcom/android/server/pm/-$$Lambda$PackageManagerService$UmQDc8UZK0k1X1BVBYAHhv6arhU;-><init>(Lcom/android/server/pm/PackageManagerService;Ljava/lang/String;JILandroid/content/pm/IPackageDataObserver;)V
-PLcom/android/server/pm/-$$Lambda$PackageManagerService$UmQDc8UZK0k1X1BVBYAHhv6arhU;->run()V
+HPLcom/android/server/pm/-$$Lambda$PackageManagerService$UmQDc8UZK0k1X1BVBYAHhv6arhU;-><init>(Lcom/android/server/pm/PackageManagerService;Ljava/lang/String;JILandroid/content/pm/IPackageDataObserver;)V
+HPLcom/android/server/pm/-$$Lambda$PackageManagerService$UmQDc8UZK0k1X1BVBYAHhv6arhU;->run()V
 HSPLcom/android/server/pm/-$$Lambda$PackageManagerService$UqTOzDNpKPiIlaG4_AUlesB9I1E;-><clinit>()V
 HSPLcom/android/server/pm/-$$Lambda$PackageManagerService$UqTOzDNpKPiIlaG4_AUlesB9I1E;-><init>()V
 HSPLcom/android/server/pm/-$$Lambda$PackageManagerService$WXhCf3v80czwXbh17kimYOFhAFs;-><clinit>()V
@@ -25318,12 +27515,16 @@
 HSPLcom/android/server/pm/-$$Lambda$PackageManagerService$Wnf5zZuMJLUQ4GfjHtUww4l7YUg;-><clinit>()V
 HSPLcom/android/server/pm/-$$Lambda$PackageManagerService$Wnf5zZuMJLUQ4GfjHtUww4l7YUg;-><init>()V
 HSPLcom/android/server/pm/-$$Lambda$PackageManagerService$Wnf5zZuMJLUQ4GfjHtUww4l7YUg;->produce(Lcom/android/server/pm/PackageManagerService$Injector;Lcom/android/server/pm/PackageManagerService;)Ljava/lang/Object;
+PLcom/android/server/pm/-$$Lambda$PackageManagerService$WqnaImxAHe0cZI0VBes-1l9f79k;-><init>(Lcom/android/server/pm/PackageManagerService;I)V
+PLcom/android/server/pm/-$$Lambda$PackageManagerService$WqnaImxAHe0cZI0VBes-1l9f79k;->accept(Ljava/lang/Object;)V
 HSPLcom/android/server/pm/-$$Lambda$PackageManagerService$YHVD9fSfoszBkmlqzmswh1u_y_M;-><clinit>()V
 HSPLcom/android/server/pm/-$$Lambda$PackageManagerService$YHVD9fSfoszBkmlqzmswh1u_y_M;-><init>()V
 PLcom/android/server/pm/-$$Lambda$PackageManagerService$Ze0Xh0iBIll5jkJ4VcmUxBuZyI8;-><init>(Lcom/android/server/pm/PackageManagerService;ZI[Ljava/lang/String;Ljava/lang/String;)V
 PLcom/android/server/pm/-$$Lambda$PackageManagerService$Ze0Xh0iBIll5jkJ4VcmUxBuZyI8;->run()V
 PLcom/android/server/pm/-$$Lambda$PackageManagerService$_CMCXnVAsgXUrfmWq_KOQ0-d17c;-><init>(Lcom/android/server/pm/PackageManagerService;Ljava/lang/String;IZZJII[ILandroid/content/pm/IPackageDeleteObserver2;Ljava/lang/String;)V
 PLcom/android/server/pm/-$$Lambda$PackageManagerService$_CMCXnVAsgXUrfmWq_KOQ0-d17c;->run()V
+HSPLcom/android/server/pm/-$$Lambda$PackageManagerService$_QIa0JiksaMBecXbVJ_nhUm9TCg;-><init>(Ljava/util/function/BiConsumer;)V
+HSPLcom/android/server/pm/-$$Lambda$PackageManagerService$_QIa0JiksaMBecXbVJ_nhUm9TCg;->accept(Ljava/lang/Object;)V
 PLcom/android/server/pm/-$$Lambda$PackageManagerService$aXPYjiloRwQataUrx041SxBr5us;-><init>(Lcom/android/server/pm/PackageManagerService;ZLjava/util/List;)V
 PLcom/android/server/pm/-$$Lambda$PackageManagerService$aXPYjiloRwQataUrx041SxBr5us;->run()V
 HSPLcom/android/server/pm/-$$Lambda$PackageManagerService$aptgkdXtM4g66mNvfWDFzI6FQyI;-><init>(Lcom/android/server/pm/PackageManagerService;)V
@@ -25335,12 +27536,16 @@
 HSPLcom/android/server/pm/-$$Lambda$PackageManagerService$djQQrdclAlQ8ILip1OVPcBDTkW4;-><clinit>()V
 HSPLcom/android/server/pm/-$$Lambda$PackageManagerService$djQQrdclAlQ8ILip1OVPcBDTkW4;-><init>()V
 HSPLcom/android/server/pm/-$$Lambda$PackageManagerService$djQQrdclAlQ8ILip1OVPcBDTkW4;->apply(Ljava/lang/Object;)Ljava/lang/Object;
+PLcom/android/server/pm/-$$Lambda$PackageManagerService$dxAUj27Y4Oe3hxwpfzBaLl3fLZw;-><init>(Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/parsing/pkg/AndroidPackage;IIILandroid/content/pm/IPackageDataObserver;Ljava/lang/String;)V
+PLcom/android/server/pm/-$$Lambda$PackageManagerService$dxAUj27Y4Oe3hxwpfzBaLl3fLZw;->run()V
 HSPLcom/android/server/pm/-$$Lambda$PackageManagerService$eOXySdFQ-z888HMdYTDdDb8rYuQ;-><init>(Ljava/util/function/BiConsumer;)V
 HSPLcom/android/server/pm/-$$Lambda$PackageManagerService$eOXySdFQ-z888HMdYTDdDb8rYuQ;->accept(Ljava/lang/Object;)V
 PLcom/android/server/pm/-$$Lambda$PackageManagerService$f5l1_UOwACQPN6qixqBmzSJzDMw;-><init>(Lcom/android/server/pm/PackageManagerService;Ljava/lang/String;JILandroid/content/pm/IPackageDataObserver;)V
 PLcom/android/server/pm/-$$Lambda$PackageManagerService$f5l1_UOwACQPN6qixqBmzSJzDMw;->run()V
 PLcom/android/server/pm/-$$Lambda$PackageManagerService$fQjXY6S0s38rWZ-Tv1PTQvrgJb4;-><init>(Lcom/android/server/pm/PackageManagerService;Landroid/content/pm/parsing/AndroidPackage;IIILandroid/content/pm/IPackageDataObserver;Ljava/lang/String;)V
 PLcom/android/server/pm/-$$Lambda$PackageManagerService$fQjXY6S0s38rWZ-Tv1PTQvrgJb4;->run()V
+PLcom/android/server/pm/-$$Lambda$PackageManagerService$fatmYTvGk9iEyP6L-_SkYfjFJig;-><init>(Lcom/android/server/pm/PackageManagerService;[ILjava/lang/String;Z)V
+PLcom/android/server/pm/-$$Lambda$PackageManagerService$fatmYTvGk9iEyP6L-_SkYfjFJig;->run()V
 PLcom/android/server/pm/-$$Lambda$PackageManagerService$hUwUCbxk7NyDYjopcudg9C0rNXI;-><init>(Lcom/android/server/pm/PackageManagerService;Ljava/lang/String;ILjava/lang/String;)V
 PLcom/android/server/pm/-$$Lambda$PackageManagerService$hUwUCbxk7NyDYjopcudg9C0rNXI;->run()V
 HSPLcom/android/server/pm/-$$Lambda$PackageManagerService$hlGRKJu3cTGpEnG-hyOT3QbrXxY;-><init>(Lcom/android/server/pm/PackageManagerService;Ljava/lang/String;IZZJII[ILandroid/content/pm/IPackageDeleteObserver2;Ljava/lang/String;)V
@@ -25349,6 +27554,8 @@
 PLcom/android/server/pm/-$$Lambda$PackageManagerService$i2wY1QKIZAfMEAymOPPs8KS2G5c;->run()V
 HSPLcom/android/server/pm/-$$Lambda$PackageManagerService$i6CpetYRHYknkq8R3n1zFsH2Qng;-><init>(Landroid/content/Context;Ljava/lang/Object;)V
 HSPLcom/android/server/pm/-$$Lambda$PackageManagerService$i6CpetYRHYknkq8R3n1zFsH2Qng;->produce(Lcom/android/server/pm/PackageManagerService$Injector;Lcom/android/server/pm/PackageManagerService;)Ljava/lang/Object;
+PLcom/android/server/pm/-$$Lambda$PackageManagerService$iG1AbXebGMN1Zo55kCJGOu78HXE;-><init>(Lcom/android/server/pm/PackageManagerService;ZLjava/util/List;)V
+PLcom/android/server/pm/-$$Lambda$PackageManagerService$iG1AbXebGMN1Zo55kCJGOu78HXE;->run()V
 HSPLcom/android/server/pm/-$$Lambda$PackageManagerService$imyTLGZ0HLyacORSu0iPTteivzY;-><init>(Ljava/lang/Object;)V
 HSPLcom/android/server/pm/-$$Lambda$PackageManagerService$imyTLGZ0HLyacORSu0iPTteivzY;->produce(Lcom/android/server/pm/PackageManagerService$Injector;Lcom/android/server/pm/PackageManagerService;)Ljava/lang/Object;
 HSPLcom/android/server/pm/-$$Lambda$PackageManagerService$iqEX-hdziBwn1njNVhAdQHeXwus;-><clinit>()V
@@ -25360,22 +27567,34 @@
 HSPLcom/android/server/pm/-$$Lambda$PackageManagerService$kUm15OrlWJD9K-LIlM_rBtX-g4Q;->test(Ljava/lang/Object;)Z
 PLcom/android/server/pm/-$$Lambda$PackageManagerService$kdqJJNrm44ZfCpYgQsRrZy7nM38;-><init>(Lcom/android/server/pm/PackageManagerService;Landroid/content/pm/parsing/AndroidPackage;IIILandroid/content/pm/IPackageDataObserver;Ljava/lang/String;)V
 PLcom/android/server/pm/-$$Lambda$PackageManagerService$kdqJJNrm44ZfCpYgQsRrZy7nM38;->run()V
+HSPLcom/android/server/pm/-$$Lambda$PackageManagerService$lFji3mhAT5bVVke68kDxQSlmEs4;-><clinit>()V
+HSPLcom/android/server/pm/-$$Lambda$PackageManagerService$lFji3mhAT5bVVke68kDxQSlmEs4;-><init>()V
+HPLcom/android/server/pm/-$$Lambda$PackageManagerService$lFji3mhAT5bVVke68kDxQSlmEs4;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
 HSPLcom/android/server/pm/-$$Lambda$PackageManagerService$lMzdBb_uDjCHbhFoPJTxlDi_7zo;-><init>(Lcom/android/server/pm/PackageManagerService;Ljava/util/List;I)V
 HSPLcom/android/server/pm/-$$Lambda$PackageManagerService$lMzdBb_uDjCHbhFoPJTxlDi_7zo;->run()V
 PLcom/android/server/pm/-$$Lambda$PackageManagerService$mozSqBaYzz4jQjwZjKIapdRXflc;-><init>(I)V
 PLcom/android/server/pm/-$$Lambda$PackageManagerService$mozSqBaYzz4jQjwZjKIapdRXflc;->run()V
 PLcom/android/server/pm/-$$Lambda$PackageManagerService$ms4g2QGGQv1AIanhd1siLhoElkI;-><init>(Lcom/android/server/pm/PackageManagerService;I)V
 PLcom/android/server/pm/-$$Lambda$PackageManagerService$ms4g2QGGQv1AIanhd1siLhoElkI;->accept(Ljava/lang/Object;)V
+PLcom/android/server/pm/-$$Lambda$PackageManagerService$nY7r1WodM3_tntZA-G8DR9Rw1f0;-><init>(Lcom/android/server/pm/PackageManagerService;Ljava/lang/String;IZZJII[ILandroid/content/pm/IPackageDeleteObserver2;Ljava/lang/String;)V
+PLcom/android/server/pm/-$$Lambda$PackageManagerService$nY7r1WodM3_tntZA-G8DR9Rw1f0;->run()V
 HSPLcom/android/server/pm/-$$Lambda$PackageManagerService$pVdeIe13BPz2j1-uK6W_NugHu2Q;-><init>(Lcom/android/server/pm/PackageManagerService;)V
 HSPLcom/android/server/pm/-$$Lambda$PackageManagerService$pVdeIe13BPz2j1-uK6W_NugHu2Q;->test(Ljava/lang/Object;)Z
 HSPLcom/android/server/pm/-$$Lambda$PackageManagerService$rLdmTQLwnuPeDuWTeDB-0S1Ku4I;-><init>(Lcom/android/server/pm/PackageManagerService;)V
 HSPLcom/android/server/pm/-$$Lambda$PackageManagerService$rLdmTQLwnuPeDuWTeDB-0S1Ku4I;->onInitialized(I)V
 PLcom/android/server/pm/-$$Lambda$PackageManagerService$rcVfdsXa_dlub2enxT5rL0nTx7I;-><init>(Lcom/android/server/pm/PackageManagerService;[ILjava/lang/String;Z)V
 PLcom/android/server/pm/-$$Lambda$PackageManagerService$rcVfdsXa_dlub2enxT5rL0nTx7I;->run()V
+PLcom/android/server/pm/-$$Lambda$PackageManagerService$slf4ap74wBjxrA52mf3aW1YqmdM;-><init>(Lcom/android/server/pm/PackageManagerService;Ljava/lang/String;ILjava/lang/String;)V
+PLcom/android/server/pm/-$$Lambda$PackageManagerService$slf4ap74wBjxrA52mf3aW1YqmdM;->run()V
 PLcom/android/server/pm/-$$Lambda$PackageManagerService$td_h2dUgAqjQUL1GEeARgH8IZsw;-><init>(Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService$PackageInstalledInfo;Landroid/content/IntentSender;)V
 PLcom/android/server/pm/-$$Lambda$PackageManagerService$td_h2dUgAqjQUL1GEeARgH8IZsw;->run()V
+PLcom/android/server/pm/-$$Lambda$PackageManagerService$txzHud8DxAfBnzA16Cf-Mpca3TA;-><init>(Lcom/android/server/pm/PackageManagerService;ZI[Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/pm/-$$Lambda$PackageManagerService$txzHud8DxAfBnzA16Cf-Mpca3TA;->run()V
+PLcom/android/server/pm/-$$Lambda$PackageManagerService$uKFiJiR-QQI8RsVT7igWuZ6FwAA;-><init>(Lcom/android/server/pm/PackageManagerService;)V
 PLcom/android/server/pm/-$$Lambda$PackageManagerService$vPmwW10Lr1Zc8YoNadc7v4xmIWo;-><init>(Lcom/android/server/pm/PackageManagerService;Landroid/content/pm/parsing/AndroidPackage;Landroid/content/pm/parsing/AndroidPackage;Ljava/util/ArrayList;)V
 PLcom/android/server/pm/-$$Lambda$PackageManagerService$vPmwW10Lr1Zc8YoNadc7v4xmIWo;->run()V
+PLcom/android/server/pm/-$$Lambda$PackageManagerService$vjkkm7bIol6YmxXHA9bVeSUYkB8;-><init>(I)V
+PLcom/android/server/pm/-$$Lambda$PackageManagerService$vjkkm7bIol6YmxXHA9bVeSUYkB8;->run()V
 HPLcom/android/server/pm/-$$Lambda$PackageManagerService$wsVLwSG7sxG5kNGb-a6lG3mwxKg;-><init>(Lcom/android/server/pm/PackageManagerService;[ILjava/lang/String;Ljava/lang/String;Landroid/os/Bundle;ILjava/lang/String;Landroid/content/IIntentReceiver;[I)V
 HPLcom/android/server/pm/-$$Lambda$PackageManagerService$wsVLwSG7sxG5kNGb-a6lG3mwxKg;->run()V
 HSPLcom/android/server/pm/-$$Lambda$PackageManagerService$xKD6SB7pISjc29qfmXIq5O_3OJw;-><init>(Landroid/content/Context;Lcom/android/server/pm/Installer;Ljava/lang/Object;ZLjava/lang/Object;)V
@@ -25384,6 +27603,8 @@
 HSPLcom/android/server/pm/-$$Lambda$PackageManagerService$xZAAMOZCDrDe-FJUcRmxesa8h7c;-><init>()V
 PLcom/android/server/pm/-$$Lambda$PackageManagerService$yXdgY7SVZQWnWWIG0iO_OYKuh58;-><init>(Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/parsing/pkg/AndroidPackage;Lcom/android/server/pm/parsing/pkg/AndroidPackage;Ljava/util/ArrayList;)V
 PLcom/android/server/pm/-$$Lambda$PackageManagerService$yXdgY7SVZQWnWWIG0iO_OYKuh58;->run()V
+HPLcom/android/server/pm/-$$Lambda$PackageManagerService$z8SNwemq3afWJgXWmkJMd3eb198;-><init>(Lcom/android/server/pm/PackageManagerService;[ILjava/lang/String;Ljava/lang/String;Landroid/os/Bundle;ILjava/lang/String;Landroid/content/IIntentReceiver;Landroid/util/SparseArray;[I)V
+HPLcom/android/server/pm/-$$Lambda$PackageManagerService$z8SNwemq3afWJgXWmkJMd3eb198;->run()V
 HSPLcom/android/server/pm/-$$Lambda$PackageManagerService$zCuBGosGB1OGJ7ya2EB4X5V2jBk;-><clinit>()V
 HSPLcom/android/server/pm/-$$Lambda$PackageManagerService$zCuBGosGB1OGJ7ya2EB4X5V2jBk;-><init>()V
 HSPLcom/android/server/pm/-$$Lambda$PackageManagerService$zCuBGosGB1OGJ7ya2EB4X5V2jBk;->apply(Ljava/lang/Object;)Ljava/lang/Object;
@@ -25392,7 +27613,7 @@
 PLcom/android/server/pm/-$$Lambda$PackageManagerServiceUtils$-TyALUo9to-tSa8TowQ8FvHNb6w;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
 PLcom/android/server/pm/-$$Lambda$PackageManagerServiceUtils$6Hiu23bVWNI_UB8JjRQOmllFVE8;-><clinit>()V
 PLcom/android/server/pm/-$$Lambda$PackageManagerServiceUtils$6Hiu23bVWNI_UB8JjRQOmllFVE8;-><init>()V
-PLcom/android/server/pm/-$$Lambda$PackageManagerServiceUtils$6Hiu23bVWNI_UB8JjRQOmllFVE8;->test(Ljava/lang/Object;)Z
+HPLcom/android/server/pm/-$$Lambda$PackageManagerServiceUtils$6Hiu23bVWNI_UB8JjRQOmllFVE8;->test(Ljava/lang/Object;)Z
 PLcom/android/server/pm/-$$Lambda$PackageManagerServiceUtils$CznOu58qzp1xBXuz65vwZNf-2YQ;-><init>(Lcom/android/server/pm/dex/DexManager;)V
 PLcom/android/server/pm/-$$Lambda$PackageManagerServiceUtils$CznOu58qzp1xBXuz65vwZNf-2YQ;->test(Ljava/lang/Object;)Z
 HSPLcom/android/server/pm/-$$Lambda$PackageManagerServiceUtils$JqfeXEVVj9qyD-t5TtAWP5dUo_Q;-><init>(Lcom/android/server/pm/dex/DexManager;)V
@@ -25422,9 +27643,12 @@
 PLcom/android/server/pm/-$$Lambda$PackageManagerServiceUtils$eMhMS_ozPxLQedSFcYUWkqe3DH4;-><clinit>()V
 PLcom/android/server/pm/-$$Lambda$PackageManagerServiceUtils$eMhMS_ozPxLQedSFcYUWkqe3DH4;-><init>()V
 PLcom/android/server/pm/-$$Lambda$PackageManagerServiceUtils$eMhMS_ozPxLQedSFcYUWkqe3DH4;->test(Ljava/lang/Object;)Z
+PLcom/android/server/pm/-$$Lambda$PackageManagerServiceUtils$kGgIy61AI0hVhikc5IBRoH-OqgM;-><clinit>()V
+PLcom/android/server/pm/-$$Lambda$PackageManagerServiceUtils$kGgIy61AI0hVhikc5IBRoH-OqgM;-><init>()V
+PLcom/android/server/pm/-$$Lambda$PackageManagerServiceUtils$kGgIy61AI0hVhikc5IBRoH-OqgM;->test(Ljava/lang/Object;)Z
 PLcom/android/server/pm/-$$Lambda$PackageManagerServiceUtils$mHSpCXTEDV8POwYEJDexVxYsJeU;-><clinit>()V
 PLcom/android/server/pm/-$$Lambda$PackageManagerServiceUtils$mHSpCXTEDV8POwYEJDexVxYsJeU;-><init>()V
-PLcom/android/server/pm/-$$Lambda$PackageManagerServiceUtils$mHSpCXTEDV8POwYEJDexVxYsJeU;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
+HPLcom/android/server/pm/-$$Lambda$PackageManagerServiceUtils$mHSpCXTEDV8POwYEJDexVxYsJeU;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
 PLcom/android/server/pm/-$$Lambda$PackageManagerServiceUtils$miSwAI7tlaWPbDunujMxV7oiAWA;-><init>(Landroid/util/ArraySet;)V
 PLcom/android/server/pm/-$$Lambda$PackageManagerServiceUtils$miSwAI7tlaWPbDunujMxV7oiAWA;->test(Ljava/lang/Object;)Z
 HSPLcom/android/server/pm/-$$Lambda$PackageManagerServiceUtils$pak5uFueWVDXpeD0raY40AD6lPY;-><clinit>()V
@@ -25440,6 +27664,7 @@
 PLcom/android/server/pm/-$$Lambda$PackageManagerServiceUtils$sV6Dy76F46JIA9ovYV5QyhvLuQ4;->test(Ljava/lang/Object;)Z
 HSPLcom/android/server/pm/-$$Lambda$ParallelPackageParser$FTtinPrp068lVeI7K6bC1tNE3iM;-><init>(Lcom/android/server/pm/ParallelPackageParser;Ljava/io/File;I)V
 HSPLcom/android/server/pm/-$$Lambda$ParallelPackageParser$FTtinPrp068lVeI7K6bC1tNE3iM;->run()V
+PLcom/android/server/pm/-$$Lambda$S4BXTl5Ly3EHhXAReFCtlz2B8eo;-><init>(Ljava/lang/String;)V
 HSPLcom/android/server/pm/-$$Lambda$ShortcutBitmapSaver$AUDgG57FGyGDUVDAjL-7cuiE0pM;-><init>(Lcom/android/server/pm/ShortcutBitmapSaver;)V
 HPLcom/android/server/pm/-$$Lambda$ShortcutBitmapSaver$AUDgG57FGyGDUVDAjL-7cuiE0pM;->run()V
 HPLcom/android/server/pm/-$$Lambda$ShortcutBitmapSaver$xgjvZfaiKXavxgGCSta_eIdVBnk;-><init>(Ljava/util/concurrent/CountDownLatch;)V
@@ -25592,8 +27817,14 @@
 PLcom/android/server/pm/-$$Lambda$StagingManager$l7fa-k0J9C50Vr9mDKn9MKzrXEI;->test(Ljava/lang/Object;)Z
 PLcom/android/server/pm/-$$Lambda$UserManagerService$1$DQ_02g7kZ7QrJXO6aCATwE6DYCE;-><init>(Lcom/android/server/pm/UserManagerService$1;ILandroid/content/IntentSender;)V
 PLcom/android/server/pm/-$$Lambda$UserManagerService$1$DQ_02g7kZ7QrJXO6aCATwE6DYCE;->run()V
+PLcom/android/server/pm/-$$Lambda$UserManagerService$DisableQuietModeUserUnlockedCallback$Xj5Vf2ikWbZ5QWza6wyZQhLIFdE;-><init>(Lcom/android/server/pm/UserManagerService$DisableQuietModeUserUnlockedCallback;)V
+PLcom/android/server/pm/-$$Lambda$UserManagerService$DisableQuietModeUserUnlockedCallback$Xj5Vf2ikWbZ5QWza6wyZQhLIFdE;->run()V
 HSPLcom/android/server/pm/-$$Lambda$UserManagerService$s1AxethOTPU7NQ5LXxyP4etLk7E;-><init>(Landroid/os/IUserRestrictionsListener;)V
 HSPLcom/android/server/pm/-$$Lambda$UserManagerService$s1AxethOTPU7NQ5LXxyP4etLk7E;->onUserRestrictionsChanged(ILandroid/os/Bundle;Landroid/os/Bundle;)V
+PLcom/android/server/pm/-$$Lambda$UserSystemPackageInstaller$BaBM2EgGaZ_mwYNdMEwnvM1-1EU;-><init>(Lcom/android/server/pm/UserSystemPackageInstaller;Ljava/util/Set;ZLjava/util/Set;)V
+HPLcom/android/server/pm/-$$Lambda$UserSystemPackageInstaller$BaBM2EgGaZ_mwYNdMEwnvM1-1EU;->accept(Ljava/lang/Object;)V
+PLcom/android/server/pm/-$$Lambda$UserSystemPackageInstaller$SWB43OEQXgI--EvtWi7AdFOngsk;-><init>(Ljava/util/Set;IZZLandroid/util/ArraySet;)V
+PLcom/android/server/pm/-$$Lambda$UserSystemPackageInstaller$SWB43OEQXgI--EvtWi7AdFOngsk;->accept(Ljava/lang/Object;)V
 PLcom/android/server/pm/-$$Lambda$UserSystemPackageInstaller$qgQhYPPVJE0ZGQMRr6lmVdZZll0;-><init>(Lcom/android/server/pm/UserSystemPackageInstaller;Ljava/util/Set;ZLjava/util/Set;)V
 PLcom/android/server/pm/-$$Lambda$UserSystemPackageInstaller$qgQhYPPVJE0ZGQMRr6lmVdZZll0;->accept(Ljava/lang/Object;)V
 HSPLcom/android/server/pm/-$$Lambda$YY245IBQr5Qygm_NJ7MG_oIzCHk;-><clinit>()V
@@ -25650,16 +27881,27 @@
 HSPLcom/android/server/pm/ApexManager$ActiveApexInfo;-><init>(Ljava/io/File;Ljava/io/File;)V
 HSPLcom/android/server/pm/ApexManager$ActiveApexInfo;-><init>(Ljava/io/File;Ljava/io/File;Lcom/android/server/pm/ApexManager$1;)V
 HSPLcom/android/server/pm/ApexManager$ActiveApexInfo;-><init>(Ljava/lang/String;Ljava/io/File;Ljava/io/File;)V
+HSPLcom/android/server/pm/ApexManager$ApexManagerFlattenedApex;-><init>()V
+HSPLcom/android/server/pm/ApexManager$ApexManagerFlattenedApex;-><init>(Lcom/android/server/pm/ApexManager$1;)V
+PLcom/android/server/pm/ApexManager$ApexManagerFlattenedApex;->destroyCeSnapshotsNotSpecified(I[I)Z
+HSPLcom/android/server/pm/ApexManager$ApexManagerFlattenedApex;->getActiveApexInfos()Ljava/util/List;
+PLcom/android/server/pm/ApexManager$ApexManagerFlattenedApex;->getActiveApexPackageNameContainingPackage(Lcom/android/server/pm/parsing/pkg/AndroidPackage;)Ljava/lang/String;
+PLcom/android/server/pm/ApexManager$ApexManagerFlattenedApex;->isApexPackage(Ljava/lang/String;)Z
+PLcom/android/server/pm/ApexManager$ApexManagerFlattenedApex;->registerApkInApex(Lcom/android/server/pm/parsing/pkg/AndroidPackage;)V
+PLcom/android/server/pm/ApexManager$ApexManagerFlattenedApex;->scanApexPackagesTraced(Lcom/android/server/pm/parsing/PackageParser2;Ljava/util/concurrent/ExecutorService;)V
 HSPLcom/android/server/pm/ApexManager$ApexManagerImpl$1;-><init>(Lcom/android/server/pm/ApexManager$ApexManagerImpl;)V
 PLcom/android/server/pm/ApexManager$ApexManagerImpl$1;->lambda$onReceive$0$ApexManager$ApexManagerImpl$1()V
 PLcom/android/server/pm/ApexManager$ApexManagerImpl$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+HSPLcom/android/server/pm/ApexManager$ApexManagerImpl;-><init>()V
 HSPLcom/android/server/pm/ApexManager$ApexManagerImpl;-><init>(Landroid/apex/IApexService;)V
 PLcom/android/server/pm/ApexManager$ApexManagerImpl;->abortStagedSession(I)Z
 PLcom/android/server/pm/ApexManager$ApexManagerImpl;->access$100(Lcom/android/server/pm/ApexManager$ApexManagerImpl;)V
 PLcom/android/server/pm/ApexManager$ApexManagerImpl;->access$200(Lcom/android/server/pm/ApexManager$ApexManagerImpl;)V
+PLcom/android/server/pm/ApexManager$ApexManagerImpl;->destroyCeSnapshotsNotSpecified(I[I)Z
 PLcom/android/server/pm/ApexManager$ApexManagerImpl;->dump(Ljava/io/PrintWriter;Ljava/lang/String;)V
 HPLcom/android/server/pm/ApexManager$ApexManagerImpl;->dumpFromPackagesCache(Ljava/util/List;Ljava/lang/String;Lcom/android/internal/util/IndentingPrintWriter;)V
 HSPLcom/android/server/pm/ApexManager$ApexManagerImpl;->getActiveApexInfos()Ljava/util/List;
+PLcom/android/server/pm/ApexManager$ApexManagerImpl;->getActiveApexPackageNameContainingPackage(Lcom/android/server/pm/parsing/pkg/AndroidPackage;)Ljava/lang/String;
 HPLcom/android/server/pm/ApexManager$ApexManagerImpl;->getActivePackages()Ljava/util/List;
 HSPLcom/android/server/pm/ApexManager$ApexManagerImpl;->getApexModuleNameForPackageName(Ljava/lang/String;)Ljava/lang/String;
 PLcom/android/server/pm/ApexManager$ApexManagerImpl;->getApksInApex(Ljava/lang/String;)Ljava/util/List;
@@ -25684,8 +27926,11 @@
 HSPLcom/android/server/pm/ApexManager$ApexManagerImpl;->populatePackageNameToApexModuleNameIfNeeded()V
 HSPLcom/android/server/pm/ApexManager$ApexManagerImpl;->registerApkInApex(Landroid/content/pm/parsing/AndroidPackage;)V
 HSPLcom/android/server/pm/ApexManager$ApexManagerImpl;->registerApkInApex(Lcom/android/server/pm/parsing/pkg/AndroidPackage;)V
+HSPLcom/android/server/pm/ApexManager$ApexManagerImpl;->scanApexPackagesInternalLocked(Lcom/android/server/pm/parsing/PackageParser2;Ljava/util/concurrent/ExecutorService;)V
+HSPLcom/android/server/pm/ApexManager$ApexManagerImpl;->scanApexPackagesTraced(Lcom/android/server/pm/parsing/PackageParser2;Ljava/util/concurrent/ExecutorService;)V
 PLcom/android/server/pm/ApexManager$ApexManagerImpl;->submitStagedSession(Landroid/apex/ApexSessionParams;)Landroid/apex/ApexInfoList;
 HSPLcom/android/server/pm/ApexManager$ApexManagerImpl;->systemReady(Landroid/content/Context;)V
+HSPLcom/android/server/pm/ApexManager$ApexManagerImpl;->waitForApexService()Landroid/apex/IApexService;
 HSPLcom/android/server/pm/ApexManager;-><clinit>()V
 HSPLcom/android/server/pm/ApexManager;-><init>()V
 HSPLcom/android/server/pm/ApexManager;->getInstance()Lcom/android/server/pm/ApexManager;
@@ -25697,7 +27942,7 @@
 HSPLcom/android/server/pm/AppsFilter$FeatureConfigImpl;->fetchPackageIsEnabled(Lcom/android/server/pm/parsing/pkg/AndroidPackage;)Z
 HSPLcom/android/server/pm/AppsFilter$FeatureConfigImpl;->initializePackageState(Ljava/lang/String;)V
 HSPLcom/android/server/pm/AppsFilter$FeatureConfigImpl;->isGloballyEnabled()Z
-PLcom/android/server/pm/AppsFilter$FeatureConfigImpl;->isLoggingEnabled(I)Z
+HPLcom/android/server/pm/AppsFilter$FeatureConfigImpl;->isLoggingEnabled(I)Z
 PLcom/android/server/pm/AppsFilter$FeatureConfigImpl;->lambda$onSystemReady$0$AppsFilter$FeatureConfigImpl(Landroid/provider/DeviceConfig$Properties;)V
 HSPLcom/android/server/pm/AppsFilter$FeatureConfigImpl;->onCompatChange(Ljava/lang/String;)V
 HSPLcom/android/server/pm/AppsFilter$FeatureConfigImpl;->onSystemReady()V
@@ -25720,12 +27965,17 @@
 HPLcom/android/server/pm/AppsFilter;->dumpPackageSet(Ljava/io/PrintWriter;Ljava/lang/Object;Ljava/util/Set;Ljava/lang/String;Ljava/lang/String;Lcom/android/server/pm/AppsFilter$ToString;)V
 HPLcom/android/server/pm/AppsFilter;->dumpQueries(Ljava/io/PrintWriter;Lcom/android/server/pm/PackageManagerService;Ljava/lang/Integer;Lcom/android/server/pm/DumpState;[I)V
 HPLcom/android/server/pm/AppsFilter;->dumpQueriesMap(Ljava/io/PrintWriter;Ljava/lang/Integer;Landroid/util/SparseSetArray;Ljava/lang/String;Lcom/android/server/pm/AppsFilter$ToString;)V
+HPLcom/android/server/pm/AppsFilter;->getVisibilityWhitelist(Lcom/android/server/pm/PackageSetting;[ILandroid/util/ArrayMap;)Landroid/util/SparseArray;
 HSPLcom/android/server/pm/AppsFilter;->grantImplicitAccess(II)V
 HSPLcom/android/server/pm/AppsFilter;->isSystemSigned(Landroid/content/pm/PackageParser$SigningDetails;Lcom/android/server/pm/PackageSetting;)Z
 HPLcom/android/server/pm/AppsFilter;->lambda$dumpQueries$0(Landroid/util/SparseArray;Lcom/android/server/pm/PackageManagerService;Ljava/lang/Integer;)Ljava/lang/String;
+PLcom/android/server/pm/AppsFilter;->log(Lcom/android/server/pm/SettingBase;Lcom/android/server/pm/PackageSetting;Ljava/lang/String;)V
+HSPLcom/android/server/pm/AppsFilter;->matches(Landroid/content/Intent;Landroid/content/pm/parsing/AndroidPackage;)Z
+HSPLcom/android/server/pm/AppsFilter;->matchesAnyFilter(Landroid/content/Intent;Landroid/content/pm/parsing/ComponentParseUtils$ParsedComponent;)Z
 HSPLcom/android/server/pm/AppsFilter;->matchesAnyFilter(Landroid/content/Intent;Landroid/content/pm/parsing/component/ParsedComponent;)Z
 HSPLcom/android/server/pm/AppsFilter;->matchesIntentFilters(Landroid/content/Intent;Lcom/android/server/pm/parsing/pkg/AndroidPackage;)Z
 HSPLcom/android/server/pm/AppsFilter;->onSystemReady()V
+HSPLcom/android/server/pm/AppsFilter;->pkgInstruments(Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;)Z
 HSPLcom/android/server/pm/AppsFilter;->removePackage(Lcom/android/server/pm/PackageSetting;[ILandroid/util/ArrayMap;)V
 HSPLcom/android/server/pm/AppsFilter;->shouldFilterApplication(ILcom/android/server/pm/SettingBase;Lcom/android/server/pm/PackageSetting;I)Z
 HSPLcom/android/server/pm/AppsFilter;->shouldFilterApplicationInternal(ILcom/android/server/pm/SettingBase;Lcom/android/server/pm/PackageSetting;I)Z
@@ -25801,7 +28051,7 @@
 HPLcom/android/server/pm/ComponentResolver$ActivityIntentResolver;->dumpFilterLabel(Ljava/io/PrintWriter;Ljava/lang/String;Ljava/lang/Object;I)V
 HPLcom/android/server/pm/ComponentResolver$ActivityIntentResolver;->filterToLabel(Landroid/content/IntentFilter;)Ljava/lang/Object;
 HPLcom/android/server/pm/ComponentResolver$ActivityIntentResolver;->filterToLabel(Landroid/content/pm/parsing/ComponentParseUtils$ParsedActivityIntentInfo;)Ljava/lang/Object;
-PLcom/android/server/pm/ComponentResolver$ActivityIntentResolver;->filterToLabel(Landroid/util/Pair;)Ljava/lang/Object;
+HPLcom/android/server/pm/ComponentResolver$ActivityIntentResolver;->filterToLabel(Landroid/util/Pair;)Ljava/lang/Object;
 HPLcom/android/server/pm/ComponentResolver$ActivityIntentResolver;->filterToLabel(Ljava/lang/Object;)Ljava/lang/Object;
 HSPLcom/android/server/pm/ComponentResolver$ActivityIntentResolver;->getIntentFilter(Landroid/util/Pair;)Landroid/content/IntentFilter;
 HSPLcom/android/server/pm/ComponentResolver$ActivityIntentResolver;->getIntentFilter(Ljava/lang/Object;)Landroid/content/IntentFilter;
@@ -25832,10 +28082,10 @@
 PLcom/android/server/pm/ComponentResolver$InstantAppIntentResolver;-><init>()V
 HPLcom/android/server/pm/ComponentResolver$InstantAppIntentResolver;->filterResults(Ljava/util/List;)V
 PLcom/android/server/pm/ComponentResolver$InstantAppIntentResolver;->getIntentFilter(Landroid/content/pm/AuxiliaryResolveInfo$AuxiliaryFilter;)Landroid/content/IntentFilter;
-PLcom/android/server/pm/ComponentResolver$InstantAppIntentResolver;->getIntentFilter(Ljava/lang/Object;)Landroid/content/IntentFilter;
+HPLcom/android/server/pm/ComponentResolver$InstantAppIntentResolver;->getIntentFilter(Ljava/lang/Object;)Landroid/content/IntentFilter;
 HPLcom/android/server/pm/ComponentResolver$InstantAppIntentResolver;->newArray(I)[Landroid/content/IntentFilter;
 PLcom/android/server/pm/ComponentResolver$InstantAppIntentResolver;->newArray(I)[Landroid/content/pm/AuxiliaryResolveInfo$AuxiliaryFilter;
-PLcom/android/server/pm/ComponentResolver$InstantAppIntentResolver;->newArray(I)[Ljava/lang/Object;
+HPLcom/android/server/pm/ComponentResolver$InstantAppIntentResolver;->newArray(I)[Ljava/lang/Object;
 PLcom/android/server/pm/ComponentResolver$InstantAppIntentResolver;->newResult(Landroid/content/IntentFilter;II)Ljava/lang/Object;
 PLcom/android/server/pm/ComponentResolver$InstantAppIntentResolver;->newResult(Landroid/content/pm/AuxiliaryResolveInfo$AuxiliaryFilter;II)Landroid/content/pm/AuxiliaryResolveInfo$AuxiliaryFilter;
 PLcom/android/server/pm/ComponentResolver$InstantAppIntentResolver;->newResult(Ljava/lang/Object;II)Ljava/lang/Object;
@@ -26010,34 +28260,49 @@
 HPLcom/android/server/pm/CrossProfileAppsServiceImpl$InjectorImpl;->withCleanCallingIdentity(Lcom/android/internal/util/FunctionalUtils$ThrowingSupplier;)Ljava/lang/Object;
 HSPLcom/android/server/pm/CrossProfileAppsServiceImpl$LocalService;-><init>(Lcom/android/server/pm/CrossProfileAppsServiceImpl;)V
 PLcom/android/server/pm/CrossProfileAppsServiceImpl$LocalService;->getTargetUserProfiles(Ljava/lang/String;I)Ljava/util/List;
+PLcom/android/server/pm/CrossProfileAppsServiceImpl$LocalService;->verifyPackageHasInteractAcrossProfilePermission(Ljava/lang/String;I)Z
 PLcom/android/server/pm/CrossProfileAppsServiceImpl$LocalService;->verifyUidHasInteractAcrossProfilePermission(Ljava/lang/String;I)Z
 HSPLcom/android/server/pm/CrossProfileAppsServiceImpl;-><init>(Landroid/content/Context;)V
 HSPLcom/android/server/pm/CrossProfileAppsServiceImpl;-><init>(Landroid/content/Context;Lcom/android/server/pm/CrossProfileAppsServiceImpl$Injector;)V
+PLcom/android/server/pm/CrossProfileAppsServiceImpl;->access$000(Lcom/android/server/pm/CrossProfileAppsServiceImpl;)Lcom/android/server/pm/CrossProfileAppsServiceImpl$Injector;
 PLcom/android/server/pm/CrossProfileAppsServiceImpl;->access$100(Lcom/android/server/pm/CrossProfileAppsServiceImpl;Ljava/lang/String;II)Z
 PLcom/android/server/pm/CrossProfileAppsServiceImpl;->access$200(Lcom/android/server/pm/CrossProfileAppsServiceImpl;Ljava/lang/String;I)Ljava/util/List;
 PLcom/android/server/pm/CrossProfileAppsServiceImpl;->appDeclaresCrossProfileAttribute(I)Z
 PLcom/android/server/pm/CrossProfileAppsServiceImpl;->canConfigureInteractAcrossProfiles(Ljava/lang/String;)Z
+PLcom/android/server/pm/CrossProfileAppsServiceImpl;->canUserAttemptToConfigureInteractAcrossProfiles(Ljava/lang/String;)Z
+PLcom/android/server/pm/CrossProfileAppsServiceImpl;->clearInteractAcrossProfilesAppOps()V
 PLcom/android/server/pm/CrossProfileAppsServiceImpl;->currentModeEquals(ILjava/lang/String;I)Z
+PLcom/android/server/pm/CrossProfileAppsServiceImpl;->findAllPackageNames()Ljava/util/List;
 PLcom/android/server/pm/CrossProfileAppsServiceImpl;->findBroadcastReceiversForUser(Landroid/content/Intent;Landroid/os/UserHandle;)Ljava/util/List;
 HSPLcom/android/server/pm/CrossProfileAppsServiceImpl;->getLocalService()Landroid/content/pm/CrossProfileAppsInternal;
 HPLcom/android/server/pm/CrossProfileAppsServiceImpl;->getTargetUserProfiles(Ljava/lang/String;)Ljava/util/List;
 HPLcom/android/server/pm/CrossProfileAppsServiceImpl;->getTargetUserProfilesUnchecked(Ljava/lang/String;I)Ljava/util/List;
+PLcom/android/server/pm/CrossProfileAppsServiceImpl;->hasCallerGotInteractAcrossProfilesPermission(Ljava/lang/String;)Z
 PLcom/android/server/pm/CrossProfileAppsServiceImpl;->hasInteractAcrossProfilesPermission(Ljava/lang/String;II)Z
 PLcom/android/server/pm/CrossProfileAppsServiceImpl;->hasOtherProfileWithPackageInstalled(Ljava/lang/String;I)Z
 PLcom/android/server/pm/CrossProfileAppsServiceImpl;->hasRequestedAppOpPermission(Ljava/lang/String;Ljava/lang/String;)Z
+PLcom/android/server/pm/CrossProfileAppsServiceImpl;->isCallingUserAManagedProfile()Z
 PLcom/android/server/pm/CrossProfileAppsServiceImpl;->isCrossProfilePackageWhitelisted(Ljava/lang/String;)Z
+PLcom/android/server/pm/CrossProfileAppsServiceImpl;->isManagedProfile(I)Z
 PLcom/android/server/pm/CrossProfileAppsServiceImpl;->isPackageEnabled(Ljava/lang/String;I)Z
 PLcom/android/server/pm/CrossProfileAppsServiceImpl;->isPackageInstalled(Ljava/lang/String;I)Z
 PLcom/android/server/pm/CrossProfileAppsServiceImpl;->isPermissionGranted(Ljava/lang/String;I)Z
 PLcom/android/server/pm/CrossProfileAppsServiceImpl;->isSameProfileGroup(II)Z
+PLcom/android/server/pm/CrossProfileAppsServiceImpl;->lambda$clearInteractAcrossProfilesAppOps$9$CrossProfileAppsServiceImpl(ILjava/lang/String;)V
 PLcom/android/server/pm/CrossProfileAppsServiceImpl;->lambda$currentModeEquals$7$CrossProfileAppsServiceImpl(ILjava/lang/String;ILjava/lang/String;)Ljava/lang/Boolean;
+PLcom/android/server/pm/CrossProfileAppsServiceImpl;->lambda$findAllPackageNames$10(Landroid/content/pm/ApplicationInfo;)Ljava/lang/String;
 HPLcom/android/server/pm/CrossProfileAppsServiceImpl;->lambda$getTargetUserProfilesUnchecked$1$CrossProfileAppsServiceImpl(ILjava/lang/String;)Ljava/util/List;
+HPLcom/android/server/pm/CrossProfileAppsServiceImpl;->lambda$getTargetUserProfilesUnchecked$2$CrossProfileAppsServiceImpl(ILjava/lang/String;)Ljava/util/List;
 PLcom/android/server/pm/CrossProfileAppsServiceImpl;->lambda$hasOtherProfileWithPackageInstalled$8$CrossProfileAppsServiceImpl(ILjava/lang/String;)Ljava/lang/Boolean;
 PLcom/android/server/pm/CrossProfileAppsServiceImpl;->lambda$isCrossProfilePackageWhitelisted$0$CrossProfileAppsServiceImpl(Ljava/lang/String;)Ljava/lang/Boolean;
+PLcom/android/server/pm/CrossProfileAppsServiceImpl;->lambda$isManagedProfile$12$CrossProfileAppsServiceImpl(I)Ljava/lang/Boolean;
 HPLcom/android/server/pm/CrossProfileAppsServiceImpl;->lambda$isPackageEnabled$2$CrossProfileAppsServiceImpl(Ljava/lang/String;II)Ljava/lang/Boolean;
+HPLcom/android/server/pm/CrossProfileAppsServiceImpl;->lambda$isPackageEnabled$3$CrossProfileAppsServiceImpl(Ljava/lang/String;II)Ljava/lang/Boolean;
 PLcom/android/server/pm/CrossProfileAppsServiceImpl;->lambda$isPackageInstalled$5$CrossProfileAppsServiceImpl(Ljava/lang/String;II)Ljava/lang/Boolean;
 PLcom/android/server/pm/CrossProfileAppsServiceImpl;->lambda$setInteractAcrossProfilesAppOpForUserOrThrow$6$CrossProfileAppsServiceImpl(ILjava/lang/String;I)V
+PLcom/android/server/pm/CrossProfileAppsServiceImpl;->lambda$verifyActivityCanHandleIntent$3$CrossProfileAppsServiceImpl(Landroid/content/Intent;II)V
 PLcom/android/server/pm/CrossProfileAppsServiceImpl;->lambda$verifyActivityCanHandleIntentAndExported$4$CrossProfileAppsServiceImpl(Landroid/content/Intent;IILandroid/content/ComponentName;)V
+PLcom/android/server/pm/CrossProfileAppsServiceImpl;->logStartActivityByIntent(Ljava/lang/String;)V
 PLcom/android/server/pm/CrossProfileAppsServiceImpl;->maybeLogSetInteractAcrossProfilesAppOp(Ljava/lang/String;IIZI)V
 PLcom/android/server/pm/CrossProfileAppsServiceImpl;->sendCanInteractAcrossProfilesChangedBroadcast(Ljava/lang/String;ILandroid/os/UserHandle;)V
 PLcom/android/server/pm/CrossProfileAppsServiceImpl;->setInteractAcrossProfilesAppOp(Ljava/lang/String;I)V
@@ -26045,7 +28310,9 @@
 PLcom/android/server/pm/CrossProfileAppsServiceImpl;->setInteractAcrossProfilesAppOpForUserOrThrow(Ljava/lang/String;IIZ)V
 PLcom/android/server/pm/CrossProfileAppsServiceImpl;->setInteractAcrossProfilesAppOpUnchecked(Ljava/lang/String;IZ)V
 PLcom/android/server/pm/CrossProfileAppsServiceImpl;->startActivityAsUser(Landroid/app/IApplicationThread;Ljava/lang/String;Landroid/content/ComponentName;IZ)V
-PLcom/android/server/pm/CrossProfileAppsServiceImpl;->startActivityAsUser(Landroid/app/IApplicationThread;Ljava/lang/String;Ljava/lang/String;Landroid/content/ComponentName;IZ)V
+HPLcom/android/server/pm/CrossProfileAppsServiceImpl;->startActivityAsUser(Landroid/app/IApplicationThread;Ljava/lang/String;Ljava/lang/String;Landroid/content/ComponentName;IZ)V
+PLcom/android/server/pm/CrossProfileAppsServiceImpl;->startActivityAsUserByIntent(Landroid/app/IApplicationThread;Ljava/lang/String;Ljava/lang/String;Landroid/content/Intent;ILandroid/os/IBinder;Landroid/os/Bundle;)V
+PLcom/android/server/pm/CrossProfileAppsServiceImpl;->verifyActivityCanHandleIntent(Landroid/content/Intent;II)V
 PLcom/android/server/pm/CrossProfileAppsServiceImpl;->verifyActivityCanHandleIntentAndExported(Landroid/content/Intent;Landroid/content/ComponentName;II)V
 HPLcom/android/server/pm/CrossProfileAppsServiceImpl;->verifyCallingPackage(Ljava/lang/String;)V
 HPLcom/android/server/pm/CrossProfileIntentFilter;-><init>(Landroid/content/IntentFilter;Ljava/lang/String;II)V
@@ -26183,7 +28450,7 @@
 HPLcom/android/server/pm/InstantAppRegistry;->peekInstantCookieFile(Ljava/lang/String;I)Ljava/io/File;
 PLcom/android/server/pm/InstantAppRegistry;->peekOrParseUninstalledInstantAppInfo(Ljava/lang/String;I)Landroid/content/pm/InstantAppInfo;
 HPLcom/android/server/pm/InstantAppRegistry;->propagateInstantAppPermissionsIfNeeded(Landroid/content/pm/parsing/AndroidPackage;I)V
-PLcom/android/server/pm/InstantAppRegistry;->propagateInstantAppPermissionsIfNeeded(Lcom/android/server/pm/parsing/pkg/AndroidPackage;I)V
+HPLcom/android/server/pm/InstantAppRegistry;->propagateInstantAppPermissionsIfNeeded(Lcom/android/server/pm/parsing/pkg/AndroidPackage;I)V
 PLcom/android/server/pm/InstantAppRegistry;->pruneInstalledInstantApps(JJ)Z
 PLcom/android/server/pm/InstantAppRegistry;->pruneInstantApps()V
 HPLcom/android/server/pm/InstantAppRegistry;->pruneInstantApps(JJJ)Z
@@ -26191,6 +28458,7 @@
 HSPLcom/android/server/pm/InstantAppRegistry;->removeAppLPw(II)V
 HPLcom/android/server/pm/InstantAppRegistry;->removeUninstalledInstantAppStateLPw(Ljava/util/function/Predicate;I)V
 PLcom/android/server/pm/InstantAppResolver;-><clinit>()V
+PLcom/android/server/pm/InstantAppResolver;->buildEphemeralInstallerIntent(Landroid/content/Intent;Landroid/content/Intent;Landroid/content/Intent;Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;Ljava/lang/String;ILandroid/content/ComponentName;Ljava/lang/String;ZLjava/util/List;)Landroid/content/Intent;
 HPLcom/android/server/pm/InstantAppResolver;->buildRequestInfo(Landroid/content/pm/InstantAppRequest;)Landroid/content/pm/InstantAppRequestInfo;
 HPLcom/android/server/pm/InstantAppResolver;->computeResolveFilters(Landroid/content/Intent;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Landroid/content/pm/InstantAppResolveInfo;)Ljava/util/List;
 PLcom/android/server/pm/InstantAppResolver;->createFailureIntent(Landroid/content/Intent;Ljava/lang/String;)Landroid/content/Intent;
@@ -26241,7 +28509,7 @@
 PLcom/android/server/pm/IntentFilterVerificationState;-><clinit>()V
 PLcom/android/server/pm/IntentFilterVerificationState;-><init>(IILjava/lang/String;)V
 HPLcom/android/server/pm/IntentFilterVerificationState;->addFilter(Landroid/content/pm/parsing/ComponentParseUtils$ParsedActivityIntentInfo;)V
-PLcom/android/server/pm/IntentFilterVerificationState;->addFilter(Landroid/content/pm/parsing/component/ParsedIntentInfo;)V
+HPLcom/android/server/pm/IntentFilterVerificationState;->addFilter(Landroid/content/pm/parsing/component/ParsedIntentInfo;)V
 PLcom/android/server/pm/IntentFilterVerificationState;->getFilters()Ljava/util/ArrayList;
 HPLcom/android/server/pm/IntentFilterVerificationState;->getHostsString()Ljava/lang/String;
 PLcom/android/server/pm/IntentFilterVerificationState;->getPackageName()Ljava/lang/String;
@@ -26330,13 +28598,14 @@
 HPLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->getShortcutIconFd(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)Landroid/os/ParcelFileDescriptor;
 HPLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->getShortcuts(Ljava/lang/String;JLjava/lang/String;Ljava/util/List;Landroid/content/ComponentName;ILandroid/os/UserHandle;)Landroid/content/pm/ParceledListSlice;
 HPLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->getShortcuts(Ljava/lang/String;JLjava/lang/String;Ljava/util/List;Ljava/util/List;Landroid/content/ComponentName;ILandroid/os/UserHandle;)Landroid/content/pm/ParceledListSlice;
+HPLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->getShortcuts(Ljava/lang/String;Landroid/content/pm/ShortcutQueryWrapper;Landroid/os/UserHandle;)Landroid/content/pm/ParceledListSlice;
 HPLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->hasDefaultEnableLauncherActivity(Ljava/lang/String;)Z
 HPLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->hasShortcutHostPermission(Ljava/lang/String;)Z
 HPLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->injectBinderCallingPid()I
 HPLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->injectBinderCallingUid()I
 HPLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->injectCallingUserId()I
 HPLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->injectClearCallingIdentity()J
-PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->injectHasInteractAcrossUsersFullPermission(II)Z
+HPLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->injectHasInteractAcrossUsersFullPermission(II)Z
 HPLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->injectRestoreCallingIdentity(J)V
 HPLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->isActivityEnabled(Ljava/lang/String;Landroid/content/ComponentName;Landroid/os/UserHandle;)Z
 HPLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->isEnabledProfileOf(Landroid/os/UserHandle;Landroid/os/UserHandle;Ljava/lang/String;)Z
@@ -26388,8 +28657,8 @@
 PLcom/android/server/pm/OtaDexoptService;->inMegabytes(J)I
 HPLcom/android/server/pm/OtaDexoptService;->isDone()Z
 PLcom/android/server/pm/OtaDexoptService;->lambda$prepare$0(Landroid/content/pm/parsing/AndroidPackage;Landroid/content/pm/parsing/AndroidPackage;)I
-PLcom/android/server/pm/OtaDexoptService;->lambda$prepare$0(Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;)I
-PLcom/android/server/pm/OtaDexoptService;->lambda$prepare$0(Lcom/android/server/pm/parsing/pkg/AndroidPackage;Lcom/android/server/pm/parsing/pkg/AndroidPackage;)I
+HPLcom/android/server/pm/OtaDexoptService;->lambda$prepare$0(Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;)I
+HPLcom/android/server/pm/OtaDexoptService;->lambda$prepare$0(Lcom/android/server/pm/parsing/pkg/AndroidPackage;Lcom/android/server/pm/parsing/pkg/AndroidPackage;)I
 HSPLcom/android/server/pm/OtaDexoptService;->main(Landroid/content/Context;Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/pm/OtaDexoptService;
 HSPLcom/android/server/pm/OtaDexoptService;->moveAbArtifacts(Lcom/android/server/pm/Installer;)V
 HPLcom/android/server/pm/OtaDexoptService;->nextDexoptCommand()Ljava/lang/String;
@@ -26483,7 +28752,10 @@
 HPLcom/android/server/pm/PackageInstallerService$2;->run()V
 HSPLcom/android/server/pm/PackageInstallerService$Callbacks;-><init>(Landroid/os/Looper;)V
 PLcom/android/server/pm/PackageInstallerService$Callbacks;->access$200(Lcom/android/server/pm/PackageInstallerService$Callbacks;II)V
+PLcom/android/server/pm/PackageInstallerService$Callbacks;->access$400(Lcom/android/server/pm/PackageInstallerService$Callbacks;II)V
 PLcom/android/server/pm/PackageInstallerService$Callbacks;->access$500(Lcom/android/server/pm/PackageInstallerService$Callbacks;II)V
+PLcom/android/server/pm/PackageInstallerService$Callbacks;->access$600(Lcom/android/server/pm/PackageInstallerService$Callbacks;IIZ)V
+PLcom/android/server/pm/PackageInstallerService$Callbacks;->access$700(Lcom/android/server/pm/PackageInstallerService$Callbacks;IIF)V
 PLcom/android/server/pm/PackageInstallerService$Callbacks;->access$700(Lcom/android/server/pm/PackageInstallerService$Callbacks;IIZ)V
 HPLcom/android/server/pm/PackageInstallerService$Callbacks;->access$800(Lcom/android/server/pm/PackageInstallerService$Callbacks;IIF)V
 HPLcom/android/server/pm/PackageInstallerService$Callbacks;->handleMessage(Landroid/os/Message;)V
@@ -26510,16 +28782,23 @@
 HSPLcom/android/server/pm/PackageInstallerService;-><clinit>()V
 HSPLcom/android/server/pm/PackageInstallerService;-><init>(Landroid/content/Context;Lcom/android/server/pm/PackageManagerService;)V
 HSPLcom/android/server/pm/PackageInstallerService;-><init>(Landroid/content/Context;Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/ApexManager;)V
+PLcom/android/server/pm/PackageInstallerService;-><init>(Landroid/content/Context;Lcom/android/server/pm/PackageManagerService;Ljava/util/function/Supplier;)V
 HPLcom/android/server/pm/PackageInstallerService;->abandonSession(I)V
 PLcom/android/server/pm/PackageInstallerService;->access$000(Lcom/android/server/pm/PackageInstallerService;)Landroid/util/SparseArray;
 HPLcom/android/server/pm/PackageInstallerService;->access$100(Lcom/android/server/pm/PackageInstallerService;)V
 PLcom/android/server/pm/PackageInstallerService;->access$1000(Lcom/android/server/pm/PackageInstallerService;)Lcom/android/server/pm/PackageManagerService;
 PLcom/android/server/pm/PackageInstallerService;->access$1100(Lcom/android/server/pm/PackageInstallerService;)Lcom/android/server/pm/StagingManager;
+PLcom/android/server/pm/PackageInstallerService;->access$1100(Lcom/android/server/pm/PackageInstallerService;Lcom/android/server/pm/PackageInstallerSession;)V
+PLcom/android/server/pm/PackageInstallerService;->access$1200(Lcom/android/server/pm/PackageInstallerService;I)Ljava/io/File;
 PLcom/android/server/pm/PackageInstallerService;->access$1200(Lcom/android/server/pm/PackageInstallerService;Lcom/android/server/pm/PackageInstallerSession;)V
+PLcom/android/server/pm/PackageInstallerService;->access$1300(Lcom/android/server/pm/PackageInstallerService;)Landroid/os/Handler;
 PLcom/android/server/pm/PackageInstallerService;->access$1300(Lcom/android/server/pm/PackageInstallerService;I)Ljava/io/File;
 PLcom/android/server/pm/PackageInstallerService;->access$1400(Lcom/android/server/pm/PackageInstallerService;)Landroid/os/Handler;
+PLcom/android/server/pm/PackageInstallerService;->access$300(Lcom/android/server/pm/PackageInstallerService;)Lcom/android/server/pm/PackageInstallerService$Callbacks;
 PLcom/android/server/pm/PackageInstallerService;->access$400(Lcom/android/server/pm/PackageInstallerService;)Lcom/android/server/pm/PackageInstallerService$Callbacks;
+PLcom/android/server/pm/PackageInstallerService;->access$500(Lcom/android/server/pm/PackageInstallerService;)V
 PLcom/android/server/pm/PackageInstallerService;->access$600(Lcom/android/server/pm/PackageInstallerService;)V
+PLcom/android/server/pm/PackageInstallerService;->access$800(Lcom/android/server/pm/PackageInstallerService;)Z
 PLcom/android/server/pm/PackageInstallerService;->access$900(Lcom/android/server/pm/PackageInstallerService;)Z
 HPLcom/android/server/pm/PackageInstallerService;->addHistoricalSessionLocked(Lcom/android/server/pm/PackageInstallerSession;)V
 HPLcom/android/server/pm/PackageInstallerService;->allocateSessionIdLocked()I
@@ -26592,6 +28871,7 @@
 PLcom/android/server/pm/PackageInstallerSession;->access$200(Lcom/android/server/pm/PackageInstallerSession;)V
 PLcom/android/server/pm/PackageInstallerSession;->access$300(Lcom/android/server/pm/PackageInstallerSession;)Landroid/content/Context;
 PLcom/android/server/pm/PackageInstallerSession;->access$300(Lcom/android/server/pm/PackageInstallerSession;)Z
+PLcom/android/server/pm/PackageInstallerSession;->access$400(Landroid/content/Context;Landroid/content/IntentSender;IZILjava/lang/String;ILjava/lang/String;Landroid/os/Bundle;)V
 PLcom/android/server/pm/PackageInstallerSession;->access$400(Lcom/android/server/pm/PackageInstallerSession;)Z
 PLcom/android/server/pm/PackageInstallerSession;->access$600(Lcom/android/server/pm/PackageInstallerSession;)Landroid/os/Handler;
 PLcom/android/server/pm/PackageInstallerSession;->access$700(Lcom/android/server/pm/PackageInstallerSession;)Landroid/os/Handler;
@@ -26633,6 +28913,9 @@
 HSPLcom/android/server/pm/PackageInstallerSession;->filterFiles(Ljava/io/File;[Ljava/lang/String;Ljava/io/FileFilter;)[Ljava/io/File;
 HPLcom/android/server/pm/PackageInstallerSession;->generateInfo()Landroid/content/pm/PackageInstaller$SessionInfo;
 HPLcom/android/server/pm/PackageInstallerSession;->generateInfo(Z)Landroid/content/pm/PackageInstaller$SessionInfo;
+HPLcom/android/server/pm/PackageInstallerSession;->generateInfoForCaller(ZI)Landroid/content/pm/PackageInstaller$SessionInfo;
+HPLcom/android/server/pm/PackageInstallerSession;->generateInfoInternal(ZZ)Landroid/content/pm/PackageInstaller$SessionInfo;
+PLcom/android/server/pm/PackageInstallerSession;->generateInfoScrubbed(Z)Landroid/content/pm/PackageInstaller$SessionInfo;
 PLcom/android/server/pm/PackageInstallerSession;->getAddedApksLocked()Ljava/util/List;
 HSPLcom/android/server/pm/PackageInstallerSession;->getAddedApksLocked()[Ljava/io/File;
 PLcom/android/server/pm/PackageInstallerSession;->getAddedFilesLocked()[Ljava/io/File;
@@ -26640,6 +28923,7 @@
 HSPLcom/android/server/pm/PackageInstallerSession;->getChildSessions()Ljava/util/List;
 PLcom/android/server/pm/PackageInstallerSession;->getDataLoaderParams()Landroid/content/pm/DataLoaderParamsParcel;
 PLcom/android/server/pm/PackageInstallerSession;->getInstallSource()Lcom/android/server/pm/InstallSource;
+HPLcom/android/server/pm/PackageInstallerSession;->getInstallationFilesLocked()[Landroid/content/pm/InstallationFile;
 PLcom/android/server/pm/PackageInstallerSession;->getInstallerPackageName()Ljava/lang/String;
 HPLcom/android/server/pm/PackageInstallerSession;->getInstallerUid()I
 HPLcom/android/server/pm/PackageInstallerSession;->getNames()[Ljava/lang/String;
@@ -26706,6 +28990,7 @@
 HSPLcom/android/server/pm/PackageInstallerSession;->sealAndValidateLocked(Ljava/util/List;)V
 PLcom/android/server/pm/PackageInstallerSession;->sealIfNecessary()V
 HSPLcom/android/server/pm/PackageInstallerSession;->sealLocked(Ljava/util/List;)V
+HPLcom/android/server/pm/PackageInstallerSession;->sendOnPackageInstalled(Landroid/content/Context;Landroid/content/IntentSender;IZILjava/lang/String;ILjava/lang/String;Landroid/os/Bundle;)V
 HPLcom/android/server/pm/PackageInstallerSession;->setClientProgress(F)V
 HPLcom/android/server/pm/PackageInstallerSession;->setClientProgressLocked(F)V
 PLcom/android/server/pm/PackageInstallerSession;->setParentSessionId(I)V
@@ -26713,6 +28998,7 @@
 PLcom/android/server/pm/PackageInstallerSession;->setStagedSessionApplied()V
 PLcom/android/server/pm/PackageInstallerSession;->setStagedSessionFailed(ILjava/lang/String;)V
 PLcom/android/server/pm/PackageInstallerSession;->setStagedSessionReady()V
+HPLcom/android/server/pm/PackageInstallerSession;->shouldScrubData(I)Z
 HSPLcom/android/server/pm/PackageInstallerSession;->streamAndValidateLocked()V
 PLcom/android/server/pm/PackageInstallerSession;->streamAndValidateLocked()Z
 PLcom/android/server/pm/PackageInstallerSession;->streamValidateAndCommit()Z
@@ -26721,6 +29007,7 @@
 HPLcom/android/server/pm/PackageInstallerSession;->validateApkInstallLocked(Landroid/content/pm/PackageInfo;)V
 PLcom/android/server/pm/PackageInstallerSession;->write(Ljava/lang/String;JJLandroid/os/ParcelFileDescriptor;)V
 HSPLcom/android/server/pm/PackageInstallerSession;->write(Lorg/xmlpull/v1/XmlSerializer;Ljava/io/File;)V
+HPLcom/android/server/pm/PackageInstallerSession;->writeAutoRevokePermissionsMode(Lorg/xmlpull/v1/XmlSerializer;I)V
 HSPLcom/android/server/pm/PackageInstallerSession;->writeGrantedRuntimePermissionsLocked(Lorg/xmlpull/v1/XmlSerializer;[Ljava/lang/String;)V
 HSPLcom/android/server/pm/PackageInstallerSession;->writeWhitelistedRestrictedPermissionsLocked(Lorg/xmlpull/v1/XmlSerializer;Ljava/util/List;)V
 HSPLcom/android/server/pm/PackageKeySetData;-><init>()V
@@ -26743,19 +29030,31 @@
 HSPLcom/android/server/pm/PackageManagerException;->from(Landroid/content/pm/PackageParser$PackageParserException;)Lcom/android/server/pm/PackageManagerException;
 HSPLcom/android/server/pm/PackageManagerService$1;-><init>(Lcom/android/server/pm/PackageManagerService;)V
 PLcom/android/server/pm/PackageManagerService$1;->onVolumeStateChanged(Landroid/os/storage/VolumeInfo;II)V
+HSPLcom/android/server/pm/PackageManagerService$2;-><init>(Lcom/android/server/pm/PackageManagerService;Lcom/android/server/compat/PlatformCompat;)V
 PLcom/android/server/pm/PackageManagerService$2;-><init>(Lcom/android/server/pm/PackageManagerService;Ljava/util/List;)V
+HSPLcom/android/server/pm/PackageManagerService$2;->hasFeature(Ljava/lang/String;)Z
+HSPLcom/android/server/pm/PackageManagerService$2;->isChangeEnabled(JLandroid/content/pm/ApplicationInfo;)Z
 HPLcom/android/server/pm/PackageManagerService$2;->writeElement(Landroid/content/IntentFilter;Landroid/os/Parcel;I)V
 HPLcom/android/server/pm/PackageManagerService$2;->writeElement(Ljava/lang/Object;Landroid/os/Parcel;I)V
+PLcom/android/server/pm/PackageManagerService$3;-><init>(Lcom/android/server/pm/PackageManagerService;Ljava/util/List;)V
 PLcom/android/server/pm/PackageManagerService$3;-><init>(Lcom/android/server/pm/PackageManagerService;ZLjava/lang/String;ILandroid/content/pm/IPackageDataObserver;)V
 PLcom/android/server/pm/PackageManagerService$3;->run()V
+HPLcom/android/server/pm/PackageManagerService$3;->writeElement(Landroid/content/IntentFilter;Landroid/os/Parcel;I)V
+HPLcom/android/server/pm/PackageManagerService$3;->writeElement(Ljava/lang/Object;Landroid/os/Parcel;I)V
 HSPLcom/android/server/pm/PackageManagerService$4;-><init>(Lcom/android/server/pm/PackageManagerService;Landroid/os/Handler;Landroid/content/ContentResolver;)V
+PLcom/android/server/pm/PackageManagerService$4;-><init>(Lcom/android/server/pm/PackageManagerService;ZLjava/lang/String;ILandroid/content/pm/IPackageDataObserver;)V
 HSPLcom/android/server/pm/PackageManagerService$4;->onChange(Z)V
+PLcom/android/server/pm/PackageManagerService$4;->run()V
 HSPLcom/android/server/pm/PackageManagerService$5;-><init>(Lcom/android/server/pm/PackageManagerService;)V
+PLcom/android/server/pm/PackageManagerService$5;-><init>(Lcom/android/server/pm/PackageManagerService;Landroid/os/Handler;Landroid/content/ContentResolver;)V
+PLcom/android/server/pm/PackageManagerService$5;->onChange(Z)V
 HSPLcom/android/server/pm/PackageManagerService$6;-><init>(Lcom/android/server/pm/PackageManagerService;)V
 PLcom/android/server/pm/PackageManagerService$6;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
 HSPLcom/android/server/pm/PackageManagerService$7;-><init>(Lcom/android/server/pm/PackageManagerService;)V
 HPLcom/android/server/pm/PackageManagerService$7;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
-PLcom/android/server/pm/PackageManagerService$ActiveInstallSession;-><init>(Ljava/lang/String;Ljava/io/File;Landroid/content/pm/IPackageInstallObserver2;ILandroid/content/pm/PackageInstaller$SessionParams;ILcom/android/server/pm/InstallSource;Landroid/os/UserHandle;Landroid/content/pm/PackageParser$SigningDetails;)V
+PLcom/android/server/pm/PackageManagerService$8;-><init>(Lcom/android/server/pm/PackageManagerService;)V
+PLcom/android/server/pm/PackageManagerService$8;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+HPLcom/android/server/pm/PackageManagerService$ActiveInstallSession;-><init>(Ljava/lang/String;Ljava/io/File;Landroid/content/pm/IPackageInstallObserver2;ILandroid/content/pm/PackageInstaller$SessionParams;ILcom/android/server/pm/InstallSource;Landroid/os/UserHandle;Landroid/content/pm/PackageParser$SigningDetails;)V
 PLcom/android/server/pm/PackageManagerService$ActiveInstallSession;-><init>(Ljava/lang/String;Ljava/io/File;Landroid/content/pm/IPackageInstallObserver2;Landroid/content/pm/PackageInstaller$SessionParams;ILcom/android/server/pm/InstallSource;Landroid/os/UserHandle;Landroid/content/pm/PackageParser$SigningDetails;)V
 PLcom/android/server/pm/PackageManagerService$ActiveInstallSession;->getInstallSource()Lcom/android/server/pm/InstallSource;
 PLcom/android/server/pm/PackageManagerService$ActiveInstallSession;->getInstallerUid()I
@@ -26781,7 +29080,7 @@
 PLcom/android/server/pm/PackageManagerService$FileInstallArgs;->doPostInstall(II)I
 PLcom/android/server/pm/PackageManagerService$FileInstallArgs;->doPreInstall(I)I
 HPLcom/android/server/pm/PackageManagerService$FileInstallArgs;->doRename(ILandroid/content/pm/parsing/ParsedPackage;)Z
-PLcom/android/server/pm/PackageManagerService$FileInstallArgs;->doRename(ILcom/android/server/pm/parsing/pkg/ParsedPackage;)Z
+HPLcom/android/server/pm/PackageManagerService$FileInstallArgs;->doRename(ILcom/android/server/pm/parsing/pkg/ParsedPackage;)Z
 PLcom/android/server/pm/PackageManagerService$FileInstallArgs;->getCodePath()Ljava/lang/String;
 PLcom/android/server/pm/PackageManagerService$HandlerParams;-><init>(Lcom/android/server/pm/PackageManagerService;Landroid/os/UserHandle;)V
 PLcom/android/server/pm/PackageManagerService$HandlerParams;->getRollbackUser()Landroid/os/UserHandle;
@@ -26797,8 +29096,10 @@
 HSPLcom/android/server/pm/PackageManagerService$Injector$SystemServiceProducer;-><init>(Ljava/lang/Class;)V
 HSPLcom/android/server/pm/PackageManagerService$Injector$SystemServiceProducer;->produce(Lcom/android/server/pm/PackageManagerService$Injector;Lcom/android/server/pm/PackageManagerService;)Ljava/lang/Object;
 HSPLcom/android/server/pm/PackageManagerService$Injector;-><init>(Landroid/content/Context;Ljava/lang/Object;Lcom/android/server/pm/Installer;Ljava/lang/Object;Lcom/android/server/pm/PackageAbiHelper;Lcom/android/server/pm/PackageManagerService$Injector$Producer;Lcom/android/server/pm/PackageManagerService$Injector$Producer;Lcom/android/server/pm/PackageManagerService$Injector$Producer;Lcom/android/server/pm/PackageManagerService$Injector$Producer;Lcom/android/server/pm/PackageManagerService$Injector$Producer;Lcom/android/server/pm/PackageManagerService$Injector$Producer;Lcom/android/server/pm/PackageManagerService$Injector$Producer;Lcom/android/server/pm/PackageManagerService$Injector$Producer;Lcom/android/server/pm/PackageManagerService$Injector$Producer;Lcom/android/server/pm/PackageManagerService$Injector$Producer;Lcom/android/server/pm/PackageManagerService$Injector$Producer;Lcom/android/server/pm/PackageManagerService$Injector$Producer;Lcom/android/server/pm/PackageManagerService$Injector$Producer;Lcom/android/server/pm/PackageManagerService$Injector$Producer;Lcom/android/server/pm/PackageManagerService$Injector$Producer;)V
+HSPLcom/android/server/pm/PackageManagerService$Injector;-><init>(Landroid/content/Context;Ljava/lang/Object;Lcom/android/server/pm/Installer;Ljava/lang/Object;Lcom/android/server/pm/PackageAbiHelper;Lcom/android/server/pm/PackageManagerService$Injector$Producer;Lcom/android/server/pm/PackageManagerService$Injector$Producer;Lcom/android/server/pm/PackageManagerService$Injector$Producer;Lcom/android/server/pm/PackageManagerService$Injector$Producer;Lcom/android/server/pm/PackageManagerService$Injector$Producer;Lcom/android/server/pm/PackageManagerService$Injector$Producer;Lcom/android/server/pm/PackageManagerService$Injector$Producer;Lcom/android/server/pm/PackageManagerService$Injector$Producer;Lcom/android/server/pm/PackageManagerService$Injector$Producer;Lcom/android/server/pm/PackageManagerService$Injector$Producer;Lcom/android/server/pm/PackageManagerService$Injector$Producer;Lcom/android/server/pm/PackageManagerService$Injector$Producer;Lcom/android/server/pm/PackageManagerService$Injector$Producer;Lcom/android/server/pm/PackageManagerService$Injector$Producer;Lcom/android/server/pm/PackageManagerService$Injector$Producer;Lcom/android/server/pm/PackageManagerService$Injector$Producer;)V
 HSPLcom/android/server/pm/PackageManagerService$Injector;->bootstrap(Lcom/android/server/pm/PackageManagerService;)V
 HSPLcom/android/server/pm/PackageManagerService$Injector;->getAbiHelper()Lcom/android/server/pm/PackageAbiHelper;
+PLcom/android/server/pm/PackageManagerService$Injector;->getActivityManagerInternal()Landroid/app/ActivityManagerInternal;
 HSPLcom/android/server/pm/PackageManagerService$Injector;->getActivityTaskManagerInternal()Lcom/android/server/wm/ActivityTaskManagerInternal;
 PLcom/android/server/pm/PackageManagerService$Injector;->getAppOpsManager()Landroid/app/AppOpsManager;
 HSPLcom/android/server/pm/PackageManagerService$Injector;->getAppsFilter()Lcom/android/server/pm/AppsFilter;
@@ -26819,6 +29120,7 @@
 HSPLcom/android/server/pm/PackageManagerService$Injector;->getUserManagerInternal()Landroid/os/UserManagerInternal;
 HSPLcom/android/server/pm/PackageManagerService$Injector;->getUserManagerService()Lcom/android/server/pm/UserManagerService;
 PLcom/android/server/pm/PackageManagerService$InstallArgs;-><init>(Lcom/android/server/pm/PackageManagerService$InstallParams;)V
+HSPLcom/android/server/pm/PackageManagerService$InstallArgs;-><init>(Lcom/android/server/pm/PackageManagerService$OriginInfo;Lcom/android/server/pm/PackageManagerService$MoveInfo;Landroid/content/pm/IPackageInstallObserver2;ILcom/android/server/pm/InstallSource;Ljava/lang/String;Landroid/os/UserHandle;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/util/List;ILjava/lang/String;ILandroid/content/pm/PackageParser$SigningDetails;IZLcom/android/server/pm/PackageManagerService$MultiPackageInstallParams;I)V
 HSPLcom/android/server/pm/PackageManagerService$InstallArgs;-><init>(Lcom/android/server/pm/PackageManagerService$OriginInfo;Lcom/android/server/pm/PackageManagerService$MoveInfo;Landroid/content/pm/IPackageInstallObserver2;ILcom/android/server/pm/InstallSource;Ljava/lang/String;Landroid/os/UserHandle;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/util/List;Ljava/lang/String;ILandroid/content/pm/PackageParser$SigningDetails;ILcom/android/server/pm/PackageManagerService$MultiPackageInstallParams;)V
 HSPLcom/android/server/pm/PackageManagerService$InstallArgs;-><init>(Lcom/android/server/pm/PackageManagerService$OriginInfo;Lcom/android/server/pm/PackageManagerService$MoveInfo;Landroid/content/pm/IPackageInstallObserver2;ILcom/android/server/pm/InstallSource;Ljava/lang/String;Landroid/os/UserHandle;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/util/List;Ljava/lang/String;ILandroid/content/pm/PackageParser$SigningDetails;IZLcom/android/server/pm/PackageManagerService$MultiPackageInstallParams;)V
 HSPLcom/android/server/pm/PackageManagerService$InstallArgs;-><init>(Lcom/android/server/pm/PackageManagerService$OriginInfo;Lcom/android/server/pm/PackageManagerService$MoveInfo;Landroid/content/pm/IPackageInstallObserver2;ILcom/android/server/pm/InstallSource;Ljava/lang/String;Landroid/os/UserHandle;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/util/List;Ljava/lang/String;ILandroid/content/pm/PackageParser$SigningDetails;IZLcom/android/server/pm/PackageManagerService$MultiPackageInstallParams;I)V
@@ -26847,7 +29149,7 @@
 HSPLcom/android/server/pm/PackageManagerService$IntentVerifierProxy;-><init>(Lcom/android/server/pm/PackageManagerService;Landroid/content/Context;Landroid/content/ComponentName;)V
 PLcom/android/server/pm/PackageManagerService$IntentVerifierProxy;->addOneIntentFilterVerification(IIILandroid/content/IntentFilter;Ljava/lang/String;)Z
 HPLcom/android/server/pm/PackageManagerService$IntentVerifierProxy;->addOneIntentFilterVerification(IIILandroid/content/pm/parsing/ComponentParseUtils$ParsedActivityIntentInfo;Ljava/lang/String;)Z
-PLcom/android/server/pm/PackageManagerService$IntentVerifierProxy;->addOneIntentFilterVerification(IIILandroid/content/pm/parsing/component/ParsedIntentInfo;Ljava/lang/String;)Z
+HPLcom/android/server/pm/PackageManagerService$IntentVerifierProxy;->addOneIntentFilterVerification(IIILandroid/content/pm/parsing/component/ParsedIntentInfo;Ljava/lang/String;)Z
 PLcom/android/server/pm/PackageManagerService$IntentVerifierProxy;->createDomainVerificationState(IIILjava/lang/String;)Lcom/android/server/pm/IntentFilterVerificationState;
 PLcom/android/server/pm/PackageManagerService$IntentVerifierProxy;->getDefaultScheme()Ljava/lang/String;
 HPLcom/android/server/pm/PackageManagerService$IntentVerifierProxy;->receiveVerificationResponse(I)V
@@ -26862,6 +29164,8 @@
 HSPLcom/android/server/pm/PackageManagerService$OriginInfo;-><init>(Ljava/io/File;ZZ)V
 HSPLcom/android/server/pm/PackageManagerService$OriginInfo;->fromNothing()Lcom/android/server/pm/PackageManagerService$OriginInfo;
 PLcom/android/server/pm/PackageManagerService$OriginInfo;->fromStagedFile(Ljava/io/File;)Lcom/android/server/pm/PackageManagerService$OriginInfo;
+PLcom/android/server/pm/PackageManagerService$PackageChangeObserverDeathRecipient;-><init>(Lcom/android/server/pm/PackageManagerService;Landroid/content/pm/IPackageChangeObserver;)V
+PLcom/android/server/pm/PackageManagerService$PackageChangeObserverDeathRecipient;->binderDied()V
 PLcom/android/server/pm/PackageManagerService$PackageFreezer;-><init>(Lcom/android/server/pm/PackageManagerService;)V
 HSPLcom/android/server/pm/PackageManagerService$PackageFreezer;-><init>(Lcom/android/server/pm/PackageManagerService;Ljava/lang/String;ILjava/lang/String;)V
 HSPLcom/android/server/pm/PackageManagerService$PackageFreezer;->close()V
@@ -26888,6 +29192,7 @@
 HPLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->flushPackageRestrictions(I)V
 HSPLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->forEachInstalledPackage(Ljava/util/function/Consumer;I)V
 HSPLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->forEachPackage(Ljava/util/function/Consumer;)V
+HPLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->forEachPackageSetting(Ljava/util/function/Consumer;)V
 PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->freeStorage(Ljava/lang/String;JI)V
 PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->getActivityInfo(Landroid/content/ComponentName;III)Landroid/content/pm/ActivityInfo;
 PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->getApksInApex(Ljava/lang/String;)Ljava/util/List;
@@ -26955,12 +29260,15 @@
 HSPLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->isPermissionsReviewRequired(Ljava/lang/String;I)Z
 HSPLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->isPlatformSigned(Ljava/lang/String;)Z
 HSPLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->isResolveActivityComponent(Landroid/content/pm/ComponentInfo;)Z
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->isSystemPackage(Ljava/lang/String;)Z
 PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->migrateLegacyObbData()V
 HSPLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->notifyPackageUse(Ljava/lang/String;I)V
 PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->pruneInstantApps()V
 HPLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->queryIntentActivities(Landroid/content/Intent;Ljava/lang/String;III)Ljava/util/List;
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->removeDistractingPackageRestrictions(Ljava/lang/String;I)V
 PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->removeIsolatedUid(I)V
 PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->removeLegacyDefaultBrowserPackageName(I)Ljava/lang/String;
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->removeNonSystemPackageSuspensions(Ljava/lang/String;I)V
 HSPLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->resolveContentProvider(Ljava/lang/String;II)Landroid/content/pm/ProviderInfo;
 PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->resolveIntent(Landroid/content/Intent;Ljava/lang/String;IIIZI)Landroid/content/pm/ResolveInfo;
 PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->resolveIntent(Landroid/content/Intent;Ljava/lang/String;IIZI)Landroid/content/pm/ResolveInfo;
@@ -26989,6 +29297,7 @@
 HPLcom/android/server/pm/PackageManagerService$PackageManagerNative;->getTargetSdkVersionForPackage(Ljava/lang/String;)I
 HSPLcom/android/server/pm/PackageManagerService$PackageManagerNative;->getVersionCodeForPackage(Ljava/lang/String;)J
 HPLcom/android/server/pm/PackageManagerService$PackageManagerNative;->isAudioPlaybackCaptureAllowed([Ljava/lang/String;)[Z
+PLcom/android/server/pm/PackageManagerService$PackageManagerNative;->registerPackageChangeObserver(Landroid/content/pm/IPackageChangeObserver;)V
 HSPLcom/android/server/pm/PackageManagerService$PackageParserCallback;-><init>(Lcom/android/server/pm/PackageManagerService;)V
 HSPLcom/android/server/pm/PackageManagerService$PackageParserCallback;->hasFeature(Ljava/lang/String;)Z
 HSPLcom/android/server/pm/PackageManagerService$PackageRemovedInfo;-><init>(Lcom/android/server/pm/PackageSender;)V
@@ -27029,6 +29338,7 @@
 HSPLcom/android/server/pm/PackageManagerService$ScanPartition;-><init>(Landroid/content/pm/PackagePartitions$SystemPartition;)V
 HSPLcom/android/server/pm/PackageManagerService$ScanPartition;-><init>(Ljava/io/File;Lcom/android/server/pm/PackageManagerService$ScanPartition;I)V
 HSPLcom/android/server/pm/PackageManagerService$ScanPartition;->scanFlagForPartition(Landroid/content/pm/PackagePartitions$SystemPartition;)I
+HSPLcom/android/server/pm/PackageManagerService$ScanPartition;->toString()Ljava/lang/String;
 HSPLcom/android/server/pm/PackageManagerService$ScanRequest;-><init>(Landroid/content/pm/parsing/ParsedPackage;Lcom/android/server/pm/SharedUserSetting;Landroid/content/pm/parsing/AndroidPackage;Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;Ljava/lang/String;IIZLandroid/os/UserHandle;)V
 HSPLcom/android/server/pm/PackageManagerService$ScanRequest;-><init>(Lcom/android/server/pm/parsing/pkg/ParsedPackage;Lcom/android/server/pm/SharedUserSetting;Lcom/android/server/pm/parsing/pkg/AndroidPackage;Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;Ljava/lang/String;IIZLandroid/os/UserHandle;)V
 HSPLcom/android/server/pm/PackageManagerService$ScanRequest;-><init>(Lcom/android/server/pm/parsing/pkg/ParsedPackage;Lcom/android/server/pm/SharedUserSetting;Lcom/android/server/pm/parsing/pkg/AndroidPackage;Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;Ljava/lang/String;IIZLandroid/os/UserHandle;Ljava/lang/String;)V
@@ -27044,7 +29354,9 @@
 PLcom/android/server/pm/PackageManagerService$VerificationInfo;-><init>(Landroid/net/Uri;Landroid/net/Uri;II)V
 HSPLcom/android/server/pm/PackageManagerService;-><clinit>()V
 HSPLcom/android/server/pm/PackageManagerService;-><init>(Lcom/android/server/pm/PackageManagerService$Injector;ZZ)V
+PLcom/android/server/pm/PackageManagerService;->access$000(Lcom/android/server/pm/PackageManagerService;)J
 PLcom/android/server/pm/PackageManagerService;->access$100(Lcom/android/server/pm/PackageManagerService;)J
+PLcom/android/server/pm/PackageManagerService;->access$100(Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/pm/PackageManagerService$Injector;
 PLcom/android/server/pm/PackageManagerService;->access$1000(Lcom/android/server/pm/PackageManagerService;ILandroid/net/Uri;ILandroid/os/UserHandle;)V
 PLcom/android/server/pm/PackageManagerService;->access$1100(Lcom/android/server/pm/PackageManagerService;IIZLjava/lang/String;ZLjava/util/List;)V
 PLcom/android/server/pm/PackageManagerService;->access$1200(Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/pm/PackageManagerService$IntentFilterVerifier;
@@ -27053,37 +29365,52 @@
 PLcom/android/server/pm/PackageManagerService;->access$200(Landroid/content/pm/parsing/component/ParsedIntentInfo;)Z
 PLcom/android/server/pm/PackageManagerService;->access$200(Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/pm/PackageManagerService$Injector;
 PLcom/android/server/pm/PackageManagerService;->access$2300(Lcom/android/server/pm/PackageManagerService;I)Lcom/android/server/pm/PackageManagerService$PackageInstalledInfo;
+PLcom/android/server/pm/PackageManagerService;->access$2400()Z
 PLcom/android/server/pm/PackageManagerService;->access$2400(Lcom/android/server/pm/PackageManagerService;ZLjava/util/List;)V
 PLcom/android/server/pm/PackageManagerService;->access$2500()Z
+PLcom/android/server/pm/PackageManagerService;->access$2500(Lcom/android/server/pm/PackageManagerService;Ljava/lang/String;II)I
 PLcom/android/server/pm/PackageManagerService;->access$2600(Lcom/android/server/pm/PackageManagerService;Ljava/lang/String;II)I
+PLcom/android/server/pm/PackageManagerService;->access$2600(Lcom/android/server/pm/parsing/pkg/AndroidPackage;Landroid/content/pm/PackageInfoLite;)V
 PLcom/android/server/pm/PackageManagerService;->access$2700(Landroid/content/pm/parsing/AndroidPackage;Landroid/content/pm/PackageInfoLite;)V
+PLcom/android/server/pm/PackageManagerService;->access$2700(Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService$InstallParams;)Lcom/android/server/pm/PackageManagerService$InstallArgs;
 PLcom/android/server/pm/PackageManagerService;->access$2800(Landroid/content/pm/parsing/AndroidPackage;)Z
 PLcom/android/server/pm/PackageManagerService;->access$2800(Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService$InstallParams;)Lcom/android/server/pm/PackageManagerService$InstallArgs;
+PLcom/android/server/pm/PackageManagerService;->access$2808(Lcom/android/server/pm/PackageManagerService;)I
 PLcom/android/server/pm/PackageManagerService;->access$2900(Lcom/android/server/pm/PackageManagerService;III)Z
 PLcom/android/server/pm/PackageManagerService;->access$2900(Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService$InstallParams;)Lcom/android/server/pm/PackageManagerService$InstallArgs;
 PLcom/android/server/pm/PackageManagerService;->access$300(Landroid/content/pm/parsing/ComponentParseUtils$ParsedActivityIntentInfo;)Z
-PLcom/android/server/pm/PackageManagerService;->access$300(Lcom/android/server/pm/PackageManagerService;Ljava/lang/String;ZLjava/util/ArrayList;ILjava/lang/String;)V
+HPLcom/android/server/pm/PackageManagerService;->access$300(Lcom/android/server/pm/PackageManagerService;Ljava/lang/String;ZLjava/util/ArrayList;ILjava/lang/String;)V
+PLcom/android/server/pm/PackageManagerService;->access$3000(Lcom/android/server/pm/PackageManagerService;)Z
 PLcom/android/server/pm/PackageManagerService;->access$3000(Lcom/android/server/pm/PackageManagerService;Landroid/content/Intent;Ljava/lang/String;IIZ)Ljava/util/List;
 PLcom/android/server/pm/PackageManagerService;->access$3008(Lcom/android/server/pm/PackageManagerService;)I
+PLcom/android/server/pm/PackageManagerService;->access$3100(Lcom/android/server/pm/PackageManagerService;Landroid/content/pm/PackageInfoLite;III)Z
 PLcom/android/server/pm/PackageManagerService;->access$3108(Lcom/android/server/pm/PackageManagerService;)I
 PLcom/android/server/pm/PackageManagerService;->access$3200(Lcom/android/server/pm/PackageManagerService;)Z
+PLcom/android/server/pm/PackageManagerService;->access$3200(Lcom/android/server/pm/PackageManagerService;Landroid/content/Intent;Ljava/lang/String;IIZ)Ljava/util/List;
 PLcom/android/server/pm/PackageManagerService;->access$3200(Lcom/android/server/pm/PackageManagerService;Landroid/content/pm/PackageInfoLite;Ljava/util/List;Lcom/android/server/pm/PackageVerificationState;)Ljava/util/List;
 PLcom/android/server/pm/PackageManagerService;->access$3300(Lcom/android/server/pm/PackageManagerService;III)Z
 PLcom/android/server/pm/PackageManagerService;->access$3300(Lcom/android/server/pm/PackageManagerService;Landroid/content/pm/PackageInfoLite;III)Z
+PLcom/android/server/pm/PackageManagerService;->access$3300(Lcom/android/server/pm/PackageManagerService;Landroid/content/pm/PackageInfoLite;Ljava/util/List;Lcom/android/server/pm/PackageVerificationState;)Ljava/util/List;
 PLcom/android/server/pm/PackageManagerService;->access$3300(Lcom/android/server/pm/PackageManagerService;Ljava/lang/String;Ljava/util/List;)Landroid/content/ComponentName;
 PLcom/android/server/pm/PackageManagerService;->access$3400(Lcom/android/server/pm/PackageManagerService;Landroid/content/Intent;Ljava/lang/String;IIZ)Ljava/util/List;
+PLcom/android/server/pm/PackageManagerService;->access$3400(Lcom/android/server/pm/PackageManagerService;Ljava/lang/String;Ljava/util/List;)Landroid/content/ComponentName;
 PLcom/android/server/pm/PackageManagerService;->access$3500(Lcom/android/server/pm/PackageManagerService;Landroid/content/pm/PackageInfoLite;Ljava/util/List;Lcom/android/server/pm/PackageVerificationState;)Ljava/util/List;
+PLcom/android/server/pm/PackageManagerService;->access$3500(Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService$InstallArgs;I)V
 PLcom/android/server/pm/PackageManagerService;->access$3600(Lcom/android/server/pm/PackageManagerService;Ljava/io/File;Ljava/lang/String;)Ljava/io/File;
 PLcom/android/server/pm/PackageManagerService;->access$3600(Lcom/android/server/pm/PackageManagerService;Ljava/lang/String;Ljava/util/List;)Landroid/content/ComponentName;
-PLcom/android/server/pm/PackageManagerService;->access$3700(Lcom/android/server/pm/PackageManagerService;)Landroid/os/incremental/IncrementalManager;
+HSPLcom/android/server/pm/PackageManagerService;->access$3700(Lcom/android/server/pm/PackageManagerService;)Landroid/os/incremental/IncrementalManager;
 PLcom/android/server/pm/PackageManagerService;->access$3700(Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService$InstallArgs;I)V
 PLcom/android/server/pm/PackageManagerService;->access$3700(Lcom/android/server/pm/PackageManagerService;Ljava/io/File;Ljava/lang/String;)Ljava/io/File;
 HSPLcom/android/server/pm/PackageManagerService;->access$3800(Lcom/android/server/pm/PackageManagerService;)Landroid/os/incremental/IncrementalManager;
 PLcom/android/server/pm/PackageManagerService;->access$3800(Lcom/android/server/pm/PackageManagerService;Ljava/io/File;Ljava/lang/String;)Ljava/io/File;
 HSPLcom/android/server/pm/PackageManagerService;->access$3900(Lcom/android/server/pm/PackageManagerService;)Landroid/os/incremental/IncrementalManager;
+PLcom/android/server/pm/PackageManagerService;->access$400(Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService$PackageInstalledInfo;ZZZ[Ljava/lang/String;Ljava/util/List;IZLjava/lang/String;Landroid/content/pm/IPackageInstallObserver2;I)V
 PLcom/android/server/pm/PackageManagerService;->access$400(Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService$PackageInstalledInfo;ZZZ[Ljava/lang/String;Ljava/util/List;ZLjava/lang/String;Landroid/content/pm/IPackageInstallObserver2;I)V
 HPLcom/android/server/pm/PackageManagerService;->access$400(Lcom/android/server/pm/PackageManagerService;Ljava/lang/String;ZLjava/util/ArrayList;ILjava/lang/String;)V
+PLcom/android/server/pm/PackageManagerService;->access$4200()[I
 PLcom/android/server/pm/PackageManagerService;->access$4400()[I
+PLcom/android/server/pm/PackageManagerService;->access$4500(Lcom/android/server/pm/PackageManagerService;Ljava/lang/String;I)Z
+PLcom/android/server/pm/PackageManagerService;->access$4600(Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/pm/InstantAppRegistry;
 HPLcom/android/server/pm/PackageManagerService;->access$4700(Lcom/android/server/pm/PackageManagerService;I)V
 PLcom/android/server/pm/PackageManagerService;->access$4700(Lcom/android/server/pm/PackageManagerService;Ljava/lang/String;I)Z
 HSPLcom/android/server/pm/PackageManagerService;->access$4800(Lcom/android/server/pm/PackageManagerService;)Landroid/util/SparseBooleanArray;
@@ -27096,6 +29423,8 @@
 HSPLcom/android/server/pm/PackageManagerService;->access$5000(Lcom/android/server/pm/PackageManagerService;)Landroid/util/SparseBooleanArray;
 HSPLcom/android/server/pm/PackageManagerService;->access$5100(Lcom/android/server/pm/PackageManagerService;Ljava/lang/String;IILjava/lang/String;)V
 PLcom/android/server/pm/PackageManagerService;->access$5600(Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/pm/ModuleInfoProvider;
+PLcom/android/server/pm/PackageManagerService;->access$5600(Lcom/android/server/pm/PackageManagerService;)Ljava/util/ArrayList;
+PLcom/android/server/pm/PackageManagerService;->access$5700(Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/pm/ModuleInfoProvider;
 PLcom/android/server/pm/PackageManagerService;->access$5700(Lcom/android/server/pm/PackageManagerService;III)Ljava/util/List;
 PLcom/android/server/pm/PackageManagerService;->access$5800(Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/pm/ModuleInfoProvider;
 HSPLcom/android/server/pm/PackageManagerService;->access$5800(Lcom/android/server/pm/PackageManagerService;I)Ljava/lang/String;
@@ -27130,7 +29459,7 @@
 PLcom/android/server/pm/PackageManagerService;->access$6700(Lcom/android/server/pm/PackageManagerService;Landroid/content/ComponentName;III)Landroid/content/pm/ActivityInfo;
 HPLcom/android/server/pm/PackageManagerService;->access$6700(Lcom/android/server/pm/PackageManagerService;Ljava/lang/String;JIII)Landroid/content/pm/PackageInfo;
 PLcom/android/server/pm/PackageManagerService;->access$6800(Lcom/android/server/pm/PackageManagerService;Landroid/content/Intent;Ljava/lang/String;IIIZZ)Ljava/util/List;
-PLcom/android/server/pm/PackageManagerService;->access$6800(Lcom/android/server/pm/PackageManagerService;Ljava/lang/String;III)I
+HPLcom/android/server/pm/PackageManagerService;->access$6800(Lcom/android/server/pm/PackageManagerService;Ljava/lang/String;III)I
 HSPLcom/android/server/pm/PackageManagerService;->access$6800(Lcom/android/server/pm/PackageManagerService;Ljava/lang/String;JIII)Landroid/content/pm/PackageInfo;
 HPLcom/android/server/pm/PackageManagerService;->access$6900(Lcom/android/server/pm/PackageManagerService;Ljava/lang/String;III)I
 HPLcom/android/server/pm/PackageManagerService;->access$6900(Lcom/android/server/pm/PackageManagerService;Ljava/lang/String;III)Landroid/content/pm/ApplicationInfo;
@@ -27203,12 +29532,15 @@
 HSPLcom/android/server/pm/PackageManagerService;->access$9200(Lcom/android/server/pm/PackageManagerService;Ljava/lang/String;I)[Ljava/lang/String;
 PLcom/android/server/pm/PackageManagerService;->access$9300(Lcom/android/server/pm/PackageManagerService;II)V
 PLcom/android/server/pm/PackageManagerService;->access$9400(Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/pm/ApexManager;
+PLcom/android/server/pm/PackageManagerService;->access$9400(Lcom/android/server/pm/PackageManagerService;Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/pm/PackageManagerService;->access$9500(Lcom/android/server/pm/PackageManagerService;Ljava/lang/String;)Ljava/lang/String;
 PLcom/android/server/pm/PackageManagerService;->activitySupportsIntent(Landroid/content/ComponentName;Landroid/content/Intent;Ljava/lang/String;)Z
 HSPLcom/android/server/pm/PackageManagerService;->addBuiltInSharedLibraryLocked(Ljava/lang/String;Ljava/lang/String;)Z
 HPLcom/android/server/pm/PackageManagerService;->addCrossProfileIntentFilter(Landroid/content/IntentFilter;Ljava/lang/String;III)V
 HSPLcom/android/server/pm/PackageManagerService;->addForInitLI(Landroid/content/pm/parsing/ParsedPackage;IIJLandroid/os/UserHandle;)Landroid/content/pm/parsing/AndroidPackage;
 HSPLcom/android/server/pm/PackageManagerService;->addForInitLI(Lcom/android/server/pm/parsing/pkg/ParsedPackage;IIJLandroid/os/UserHandle;)Lcom/android/server/pm/parsing/pkg/AndroidPackage;
 HSPLcom/android/server/pm/PackageManagerService;->addPackageHoldingPermissions(Ljava/util/ArrayList;Lcom/android/server/pm/PackageSetting;[Ljava/lang/String;[ZII)V
+PLcom/android/server/pm/PackageManagerService;->addPersistentPreferredActivity(Landroid/content/IntentFilter;Landroid/content/ComponentName;I)V
 PLcom/android/server/pm/PackageManagerService;->addPreferredActivity(Landroid/content/IntentFilter;I[Landroid/content/ComponentName;Landroid/content/ComponentName;I)V
 PLcom/android/server/pm/PackageManagerService;->addPreferredActivityInternal(Landroid/content/IntentFilter;I[Landroid/content/ComponentName;Landroid/content/ComponentName;ZILjava/lang/String;)V
 HSPLcom/android/server/pm/PackageManagerService;->addSharedLibraryLPr(Landroid/content/pm/parsing/AndroidPackage;Ljava/util/Set;Landroid/content/pm/SharedLibraryInfo;Landroid/content/pm/parsing/AndroidPackage;)V
@@ -27234,7 +29566,7 @@
 HPLcom/android/server/pm/PackageManagerService;->areWebInstantAppsDisabled(I)Z
 HPLcom/android/server/pm/PackageManagerService;->arrayToString([I)Ljava/lang/String;
 HPLcom/android/server/pm/PackageManagerService;->assertCodePolicy(Landroid/content/pm/parsing/AndroidPackage;)V
-PLcom/android/server/pm/PackageManagerService;->assertCodePolicy(Lcom/android/server/pm/parsing/pkg/AndroidPackage;)V
+HPLcom/android/server/pm/PackageManagerService;->assertCodePolicy(Lcom/android/server/pm/parsing/pkg/AndroidPackage;)V
 HSPLcom/android/server/pm/PackageManagerService;->assertPackageIsValid(Landroid/content/pm/parsing/AndroidPackage;II)V
 HSPLcom/android/server/pm/PackageManagerService;->assertPackageIsValid(Lcom/android/server/pm/parsing/pkg/AndroidPackage;II)V
 HSPLcom/android/server/pm/PackageManagerService;->assertPackageKnownAndInstalled(Ljava/lang/String;Ljava/lang/String;I)V
@@ -27250,7 +29582,7 @@
 HSPLcom/android/server/pm/PackageManagerService;->canViewInstantApps(II)Z
 HSPLcom/android/server/pm/PackageManagerService;->canonicalToCurrentPackageNames([Ljava/lang/String;)[Ljava/lang/String;
 HPLcom/android/server/pm/PackageManagerService;->checkDowngrade(Landroid/content/pm/parsing/AndroidPackage;Landroid/content/pm/PackageInfoLite;)V
-PLcom/android/server/pm/PackageManagerService;->checkDowngrade(Lcom/android/server/pm/parsing/pkg/AndroidPackage;Landroid/content/pm/PackageInfoLite;)V
+HPLcom/android/server/pm/PackageManagerService;->checkDowngrade(Lcom/android/server/pm/parsing/pkg/AndroidPackage;Landroid/content/pm/PackageInfoLite;)V
 PLcom/android/server/pm/PackageManagerService;->checkPackageFrozen(Ljava/lang/String;)V
 HSPLcom/android/server/pm/PackageManagerService;->checkPackageStartable(Ljava/lang/String;I)V
 HSPLcom/android/server/pm/PackageManagerService;->checkPermission(Ljava/lang/String;Ljava/lang/String;I)I
@@ -27275,6 +29607,7 @@
 HSPLcom/android/server/pm/PackageManagerService;->clearDefaultBrowserIfNeededForUser(Ljava/lang/String;I)V
 HPLcom/android/server/pm/PackageManagerService;->clearIntentFilterVerificationsLPw(I)V
 HSPLcom/android/server/pm/PackageManagerService;->clearIntentFilterVerificationsLPw(Ljava/lang/String;I)V
+PLcom/android/server/pm/PackageManagerService;->clearPackagePersistentPreferredActivities(Ljava/lang/String;I)V
 PLcom/android/server/pm/PackageManagerService;->clearPackagePreferredActivities(Ljava/lang/String;)V
 PLcom/android/server/pm/PackageManagerService;->clearPackagePreferredActivities(Ljava/lang/String;I)V
 HSPLcom/android/server/pm/PackageManagerService;->clearPackagePreferredActivitiesLPw(Ljava/lang/String;Landroid/util/SparseBooleanArray;I)V
@@ -27324,6 +29657,7 @@
 PLcom/android/server/pm/PackageManagerService;->disableSystemPackageLPw(Landroid/content/pm/parsing/AndroidPackage;)Z
 PLcom/android/server/pm/PackageManagerService;->disableSystemPackageLPw(Lcom/android/server/pm/parsing/pkg/AndroidPackage;)Z
 HSPLcom/android/server/pm/PackageManagerService;->doSendBroadcast(Landroid/app/IActivityManager;Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;ILjava/lang/String;Landroid/content/IIntentReceiver;[IZ)V
+HPLcom/android/server/pm/PackageManagerService;->doSendBroadcast(Landroid/app/IActivityManager;Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;ILjava/lang/String;Landroid/content/IIntentReceiver;[IZLandroid/util/SparseArray;)V
 HSPLcom/android/server/pm/PackageManagerService;->dropNonSystemPackages([Ljava/lang/String;)[Ljava/lang/String;
 HPLcom/android/server/pm/PackageManagerService;->dump(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V
 HPLcom/android/server/pm/PackageManagerService;->dumpCompilerStatsLPr(Ljava/io/PrintWriter;Ljava/lang/String;)V
@@ -27332,6 +29666,7 @@
 HPLcom/android/server/pm/PackageManagerService;->dumpFeaturesProto(Landroid/util/proto/ProtoOutputStream;)V
 PLcom/android/server/pm/PackageManagerService;->dumpProto(Ljava/io/FileDescriptor;)V
 HPLcom/android/server/pm/PackageManagerService;->dumpSharedLibrariesProto(Landroid/util/proto/ProtoOutputStream;)V
+PLcom/android/server/pm/PackageManagerService;->enableCompressedPackage(Lcom/android/server/pm/parsing/pkg/AndroidPackage;Lcom/android/server/pm/PackageSetting;)Z
 PLcom/android/server/pm/PackageManagerService;->enableSystemPackageLPw(Landroid/content/pm/parsing/AndroidPackage;)V
 PLcom/android/server/pm/PackageManagerService;->enforceAdjustRuntimePermissionsPolicyOrUpgradeRuntimePermissions(Ljava/lang/String;)V
 PLcom/android/server/pm/PackageManagerService;->enforceCanSetPackagesSuspendedAsUser(Ljava/lang/String;IILjava/lang/String;)V
@@ -27340,7 +29675,7 @@
 HSPLcom/android/server/pm/PackageManagerService;->ensureSystemPackageName(Ljava/lang/String;)Ljava/lang/String;
 HSPLcom/android/server/pm/PackageManagerService;->ensureSystemPackageNames([Ljava/lang/String;)[Ljava/lang/String;
 HSPLcom/android/server/pm/PackageManagerService;->executeDeletePackageLIF(Lcom/android/server/pm/PackageManagerService$DeletePackageAction;Ljava/lang/String;Z[IZLandroid/content/pm/parsing/ParsedPackage;)V
-PLcom/android/server/pm/PackageManagerService;->executeDeletePackageLIF(Lcom/android/server/pm/PackageManagerService$DeletePackageAction;Ljava/lang/String;Z[IZLcom/android/server/pm/parsing/pkg/ParsedPackage;)V
+HPLcom/android/server/pm/PackageManagerService;->executeDeletePackageLIF(Lcom/android/server/pm/PackageManagerService$DeletePackageAction;Ljava/lang/String;Z[IZLcom/android/server/pm/parsing/pkg/ParsedPackage;)V
 HPLcom/android/server/pm/PackageManagerService;->executePostCommitSteps(Lcom/android/server/pm/PackageManagerService$CommitRequest;)V
 HSPLcom/android/server/pm/PackageManagerService;->executeSharedLibrariesUpdateLPr(Landroid/content/pm/parsing/AndroidPackage;Landroid/content/pm/parsing/AndroidPackage;Ljava/util/ArrayList;)V
 HSPLcom/android/server/pm/PackageManagerService;->executeSharedLibrariesUpdateLPr(Lcom/android/server/pm/parsing/pkg/AndroidPackage;Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/parsing/pkg/AndroidPackage;Lcom/android/server/pm/PackageSetting;Ljava/util/ArrayList;)V
@@ -27363,6 +29698,7 @@
 HPLcom/android/server/pm/PackageManagerService;->finishPackageInstall(IZ)V
 HSPLcom/android/server/pm/PackageManagerService;->fixProcessName(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
 PLcom/android/server/pm/PackageManagerService;->fixUpInstallReason(Ljava/lang/String;II)I
+PLcom/android/server/pm/PackageManagerService;->flushPackageRestrictionsAsUser(I)V
 HPLcom/android/server/pm/PackageManagerService;->flushPackageRestrictionsAsUserInternalLocked(I)V
 HSPLcom/android/server/pm/PackageManagerService;->forEachInstalledPackage(Ljava/util/function/Consumer;I)V
 HSPLcom/android/server/pm/PackageManagerService;->forEachPackage(Ljava/util/function/Consumer;)V
@@ -27511,6 +29847,7 @@
 HPLcom/android/server/pm/PackageManagerService;->getVerificationTimeout()J
 HSPLcom/android/server/pm/PackageManagerService;->getWellbeingPackageName()Ljava/lang/String;
 HSPLcom/android/server/pm/PackageManagerService;->grantRuntimePermission(Ljava/lang/String;Ljava/lang/String;I)V
+HPLcom/android/server/pm/PackageManagerService;->handlePackagePostInstall(Lcom/android/server/pm/PackageManagerService$PackageInstalledInfo;ZZZ[Ljava/lang/String;Ljava/util/List;IZLjava/lang/String;Landroid/content/pm/IPackageInstallObserver2;I)V
 HPLcom/android/server/pm/PackageManagerService;->handlePackagePostInstall(Lcom/android/server/pm/PackageManagerService$PackageInstalledInfo;ZZZ[Ljava/lang/String;Ljava/util/List;ZLjava/lang/String;Landroid/content/pm/IPackageInstallObserver2;)V
 HPLcom/android/server/pm/PackageManagerService;->handlePackagePostInstall(Lcom/android/server/pm/PackageManagerService$PackageInstalledInfo;ZZZ[Ljava/lang/String;Ljava/util/List;ZLjava/lang/String;Landroid/content/pm/IPackageInstallObserver2;I)V
 PLcom/android/server/pm/PackageManagerService;->hasDomainURLs(Landroid/content/pm/parsing/AndroidPackage;)Z
@@ -27520,7 +29857,7 @@
 HSPLcom/android/server/pm/PackageManagerService;->hasSystemFeature(Ljava/lang/String;I)Z
 HSPLcom/android/server/pm/PackageManagerService;->hasSystemUidErrors()Z
 HPLcom/android/server/pm/PackageManagerService;->hasValidDomains(Landroid/content/pm/parsing/ComponentParseUtils$ParsedActivityIntentInfo;)Z
-PLcom/android/server/pm/PackageManagerService;->hasValidDomains(Landroid/content/pm/parsing/component/ParsedIntentInfo;)Z
+HPLcom/android/server/pm/PackageManagerService;->hasValidDomains(Landroid/content/pm/parsing/component/ParsedIntentInfo;)Z
 HPLcom/android/server/pm/PackageManagerService;->installExistingPackageAsUser(Ljava/lang/String;IIILjava/util/List;)I
 HPLcom/android/server/pm/PackageManagerService;->installExistingPackageAsUser(Ljava/lang/String;IIILjava/util/List;Landroid/content/IntentSender;)I
 PLcom/android/server/pm/PackageManagerService;->installPackageFromSystemLIF(Ljava/lang/String;[I[ILcom/android/server/pm/permission/PermissionsState;Z)Landroid/content/pm/parsing/AndroidPackage;
@@ -27539,7 +29876,7 @@
 PLcom/android/server/pm/PackageManagerService;->isCallerVerifier(I)Z
 PLcom/android/server/pm/PackageManagerService;->isCompatSignatureUpdateNeeded(Landroid/content/pm/parsing/AndroidPackage;)Z
 HSPLcom/android/server/pm/PackageManagerService;->isCompatSignatureUpdateNeeded(Lcom/android/server/pm/Settings$VersionInfo;)Z
-PLcom/android/server/pm/PackageManagerService;->isCompatSignatureUpdateNeeded(Lcom/android/server/pm/parsing/pkg/AndroidPackage;)Z
+HPLcom/android/server/pm/PackageManagerService;->isCompatSignatureUpdateNeeded(Lcom/android/server/pm/parsing/pkg/AndroidPackage;)Z
 PLcom/android/server/pm/PackageManagerService;->isComponentVisibleToInstantApp(Landroid/content/ComponentName;)Z
 PLcom/android/server/pm/PackageManagerService;->isComponentVisibleToInstantApp(Landroid/content/ComponentName;I)Z
 HSPLcom/android/server/pm/PackageManagerService;->isDeviceUpgrading()Z
@@ -27573,7 +29910,7 @@
 HSPLcom/android/server/pm/PackageManagerService;->isRecentsAccessingChildProfiles(II)Z
 PLcom/android/server/pm/PackageManagerService;->isRecoverSignatureUpdateNeeded(Landroid/content/pm/parsing/AndroidPackage;)Z
 HSPLcom/android/server/pm/PackageManagerService;->isRecoverSignatureUpdateNeeded(Lcom/android/server/pm/Settings$VersionInfo;)Z
-PLcom/android/server/pm/PackageManagerService;->isRecoverSignatureUpdateNeeded(Lcom/android/server/pm/parsing/pkg/AndroidPackage;)Z
+HPLcom/android/server/pm/PackageManagerService;->isRecoverSignatureUpdateNeeded(Lcom/android/server/pm/parsing/pkg/AndroidPackage;)Z
 HSPLcom/android/server/pm/PackageManagerService;->isSafeMode()Z
 PLcom/android/server/pm/PackageManagerService;->isStorageLow()Z
 PLcom/android/server/pm/PackageManagerService;->isSuspendAllowedForUser(I)Z
@@ -27591,18 +29928,23 @@
 HSPLcom/android/server/pm/PackageManagerService;->killApplication(Ljava/lang/String;IILjava/lang/String;)V
 PLcom/android/server/pm/PackageManagerService;->killApplication(Ljava/lang/String;ILjava/lang/String;)V
 HSPLcom/android/server/pm/PackageManagerService;->lambda$QIOg9odF8NpVJsmgYMdGQy_GpvY(Lcom/android/server/pm/ApexManager$ActiveApexInfo;)Lcom/android/server/pm/PackageManagerService$ScanPartition;
+PLcom/android/server/pm/PackageManagerService;->lambda$commitPackageSettings$14$PackageManagerService(Lcom/android/server/pm/parsing/pkg/AndroidPackage;Lcom/android/server/pm/parsing/pkg/AndroidPackage;Ljava/util/ArrayList;)V
 PLcom/android/server/pm/PackageManagerService;->lambda$commitPackageSettings$15$PackageManagerService(Landroid/content/pm/parsing/AndroidPackage;Landroid/content/pm/parsing/AndroidPackage;Ljava/util/ArrayList;)V
 PLcom/android/server/pm/PackageManagerService;->lambda$commitPackageSettings$15$PackageManagerService(Lcom/android/server/pm/parsing/pkg/AndroidPackage;Lcom/android/server/pm/parsing/pkg/AndroidPackage;Ljava/util/ArrayList;)V
 PLcom/android/server/pm/PackageManagerService;->lambda$commitPackageSettings$16$PackageManagerService(Lcom/android/server/pm/parsing/pkg/AndroidPackage;Lcom/android/server/pm/parsing/pkg/AndroidPackage;Ljava/util/ArrayList;)V
+PLcom/android/server/pm/PackageManagerService;->lambda$deleteApplicationCacheFilesAsUser$27$PackageManagerService(Lcom/android/server/pm/parsing/pkg/AndroidPackage;IIILandroid/content/pm/IPackageDataObserver;Ljava/lang/String;)V
 PLcom/android/server/pm/PackageManagerService;->lambda$deleteApplicationCacheFilesAsUser$28$PackageManagerService(Landroid/content/pm/parsing/AndroidPackage;IIILandroid/content/pm/IPackageDataObserver;Ljava/lang/String;)V
 PLcom/android/server/pm/PackageManagerService;->lambda$deleteApplicationCacheFilesAsUser$28$PackageManagerService(Lcom/android/server/pm/parsing/pkg/AndroidPackage;IIILandroid/content/pm/IPackageDataObserver;Ljava/lang/String;)V
 PLcom/android/server/pm/PackageManagerService;->lambda$deleteApplicationCacheFilesAsUser$29$PackageManagerService(Landroid/content/pm/parsing/AndroidPackage;IIILandroid/content/pm/IPackageDataObserver;Ljava/lang/String;)V
+PLcom/android/server/pm/PackageManagerService;->lambda$deletePackageVersioned$25$PackageManagerService(Ljava/lang/String;IZZJII[ILandroid/content/pm/IPackageDeleteObserver2;Ljava/lang/String;)V
 HSPLcom/android/server/pm/PackageManagerService;->lambda$deletePackageVersioned$26$PackageManagerService(Ljava/lang/String;IZZJII[ILandroid/content/pm/IPackageDeleteObserver2;Ljava/lang/String;)V
 PLcom/android/server/pm/PackageManagerService;->lambda$deletePackageVersioned$27$PackageManagerService(Ljava/lang/String;IZZJII[ILandroid/content/pm/IPackageDeleteObserver2;Ljava/lang/String;)V
+HSPLcom/android/server/pm/PackageManagerService;->lambda$executeSharedLibrariesUpdateLPr$13(Landroid/content/pm/SharedLibraryInfo;Landroid/content/pm/SharedLibraryInfo;)V
 HSPLcom/android/server/pm/PackageManagerService;->lambda$executeSharedLibrariesUpdateLPr$14(Landroid/content/pm/SharedLibraryInfo;Landroid/content/pm/SharedLibraryInfo;)V
 HSPLcom/android/server/pm/PackageManagerService;->lambda$executeSharedLibrariesUpdateLPr$15(Landroid/content/pm/SharedLibraryInfo;Landroid/content/pm/SharedLibraryInfo;)V
 HPLcom/android/server/pm/PackageManagerService;->lambda$freeStorageAndNotify$10$PackageManagerService(Ljava/lang/String;JILandroid/content/pm/IPackageDataObserver;)V
-PLcom/android/server/pm/PackageManagerService;->lambda$freeStorageAndNotify$11$PackageManagerService(Ljava/lang/String;JILandroid/content/pm/IPackageDataObserver;)V
+HPLcom/android/server/pm/PackageManagerService;->lambda$freeStorageAndNotify$11$PackageManagerService(Ljava/lang/String;JILandroid/content/pm/IPackageDataObserver;)V
+PLcom/android/server/pm/PackageManagerService;->lambda$installExistingPackageAsUser$18$PackageManagerService(Lcom/android/server/pm/PackageManagerService$PackageInstalledInfo;Landroid/content/IntentSender;)V
 PLcom/android/server/pm/PackageManagerService;->lambda$installExistingPackageAsUser$19$PackageManagerService(Lcom/android/server/pm/PackageManagerService$PackageInstalledInfo;Landroid/content/IntentSender;)V
 PLcom/android/server/pm/PackageManagerService;->lambda$installExistingPackageAsUser$20$PackageManagerService(Lcom/android/server/pm/PackageManagerService$PackageInstalledInfo;Landroid/content/IntentSender;)V
 HSPLcom/android/server/pm/PackageManagerService;->lambda$main$0(Ljava/lang/Object;Lcom/android/server/pm/PackageManagerService$Injector;Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/pm/ComponentResolver;
@@ -27612,32 +29954,44 @@
 HSPLcom/android/server/pm/PackageManagerService;->lambda$main$4(Lcom/android/server/pm/PackageManagerService$Injector;Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/pm/AppsFilter;
 HSPLcom/android/server/pm/PackageManagerService;->lambda$main$5(Lcom/android/server/pm/PackageManagerService$Injector;Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/compat/PlatformCompat;
 HSPLcom/android/server/pm/PackageManagerService;->lambda$new$10$PackageManagerService(Ljava/util/List;I)V
+HPLcom/android/server/pm/PackageManagerService;->lambda$new$34$PackageManagerService(Ljava/lang/String;)Z
 HSPLcom/android/server/pm/PackageManagerService;->lambda$new$35$PackageManagerService(Ljava/lang/String;)Z
 HSPLcom/android/server/pm/PackageManagerService;->lambda$new$36$PackageManagerService(Ljava/lang/String;)Z
 HSPLcom/android/server/pm/PackageManagerService;->lambda$new$7(Lcom/android/server/pm/ApexManager$ActiveApexInfo;)Lcom/android/server/pm/PackageManagerService$SystemPartition;
 HSPLcom/android/server/pm/PackageManagerService;->lambda$new$7(Lcom/android/server/pm/PackageManagerService$ScanPartition;)Ljava/lang/String;
+HSPLcom/android/server/pm/PackageManagerService;->lambda$new$7(Ljava/util/function/BiConsumer;Lcom/android/server/pm/parsing/pkg/AndroidPackage;)V
+HSPLcom/android/server/pm/PackageManagerService;->lambda$new$8$PackageManagerService(Ljava/util/function/BiConsumer;)V
 HSPLcom/android/server/pm/PackageManagerService;->lambda$new$8(Lcom/android/server/pm/PackageManagerService$SystemPartition;)Ljava/lang/String;
 HSPLcom/android/server/pm/PackageManagerService;->lambda$new$8(Ljava/util/function/BiConsumer;Lcom/android/server/pm/parsing/pkg/AndroidPackage;)V
 HSPLcom/android/server/pm/PackageManagerService;->lambda$new$9$PackageManagerService(Ljava/util/List;I)V
 HSPLcom/android/server/pm/PackageManagerService;->lambda$new$9$PackageManagerService(Ljava/util/function/BiConsumer;)V
+PLcom/android/server/pm/PackageManagerService;->lambda$notifyFirstLaunch$21$PackageManagerService(Ljava/lang/String;ILjava/lang/String;)V
 PLcom/android/server/pm/PackageManagerService;->lambda$notifyFirstLaunch$22$PackageManagerService(Ljava/lang/String;ILjava/lang/String;)V
 PLcom/android/server/pm/PackageManagerService;->lambda$notifyFirstLaunch$23$PackageManagerService(Ljava/lang/String;ILjava/lang/String;)V
+PLcom/android/server/pm/PackageManagerService;->lambda$postPreferredActivityChangedBroadcast$28(I)V
 PLcom/android/server/pm/PackageManagerService;->lambda$postPreferredActivityChangedBroadcast$29(I)V
 HPLcom/android/server/pm/PackageManagerService;->lambda$postPreferredActivityChangedBroadcast$30(I)V
+HPLcom/android/server/pm/PackageManagerService;->lambda$processInstallRequestsAsync$20$PackageManagerService(ZLjava/util/List;)V
 HPLcom/android/server/pm/PackageManagerService;->lambda$processInstallRequestsAsync$21$PackageManagerService(ZLjava/util/List;)V
-PLcom/android/server/pm/PackageManagerService;->lambda$processInstallRequestsAsync$22$PackageManagerService(ZLjava/util/List;)V
+HPLcom/android/server/pm/PackageManagerService;->lambda$processInstallRequestsAsync$22$PackageManagerService(ZLjava/util/List;)V
 PLcom/android/server/pm/PackageManagerService;->lambda$removePackageDataLIF$27$PackageManagerService(Lcom/android/server/pm/PackageSetting;)V
 PLcom/android/server/pm/PackageManagerService;->lambda$removePackageDataLIF$28$PackageManagerService(Lcom/android/server/pm/PackageSetting;)V
 PLcom/android/server/pm/PackageManagerService;->lambda$removeUnusedPackagesLPw$43$PackageManagerService(Ljava/lang/String;I)V
+PLcom/android/server/pm/PackageManagerService;->lambda$sendMyPackageSuspendedOrUnsuspended$19$PackageManagerService(ZI[Ljava/lang/String;Ljava/lang/String;)V
 HPLcom/android/server/pm/PackageManagerService;->lambda$sendMyPackageSuspendedOrUnsuspended$20$PackageManagerService(ZI[Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/pm/PackageManagerService;->lambda$sendPackageAddedForNewUsers$17$PackageManagerService([ILjava/lang/String;Z)V
 PLcom/android/server/pm/PackageManagerService;->lambda$sendPackageAddedForNewUsers$18$PackageManagerService([ILjava/lang/String;Z)V
+HPLcom/android/server/pm/PackageManagerService;->lambda$sendPackageBroadcast$15$PackageManagerService([ILjava/lang/String;Ljava/lang/String;Landroid/os/Bundle;ILjava/lang/String;Landroid/content/IIntentReceiver;Landroid/util/SparseArray;[I)V
+PLcom/android/server/pm/PackageManagerService;->lambda$sendPackageBroadcast$16$PackageManagerService([ILjava/lang/String;Ljava/lang/String;Landroid/os/Bundle;ILjava/lang/String;Landroid/content/IIntentReceiver;Landroid/util/SparseArray;[I)V
 HSPLcom/android/server/pm/PackageManagerService;->lambda$sendPackageBroadcast$16$PackageManagerService([ILjava/lang/String;Ljava/lang/String;Landroid/os/Bundle;ILjava/lang/String;Landroid/content/IIntentReceiver;[I)V
 HPLcom/android/server/pm/PackageManagerService;->lambda$sendPackageBroadcast$17$PackageManagerService([ILjava/lang/String;Ljava/lang/String;Landroid/os/Bundle;ILjava/lang/String;Landroid/content/IIntentReceiver;[I)V
+PLcom/android/server/pm/PackageManagerService;->lambda$static$16(Landroid/content/pm/ProviderInfo;Landroid/content/pm/ProviderInfo;)I
 HSPLcom/android/server/pm/PackageManagerService;->lambda$static$17(Landroid/content/pm/ProviderInfo;Landroid/content/pm/ProviderInfo;)I
 HSPLcom/android/server/pm/PackageManagerService;->lambda$static$18(Landroid/content/pm/ProviderInfo;Landroid/content/pm/ProviderInfo;)I
 HSPLcom/android/server/pm/PackageManagerService;->lambda$systemReady$36$PackageManagerService(I)V
 HSPLcom/android/server/pm/PackageManagerService;->lambda$systemReady$37$PackageManagerService(I)V
 HSPLcom/android/server/pm/PackageManagerService;->lambda$systemReady$38$PackageManagerService(I)V
+PLcom/android/server/pm/PackageManagerService;->lambda$updateDefaultHomeNotLocked$32$PackageManagerService(ILjava/lang/Boolean;)V
 PLcom/android/server/pm/PackageManagerService;->lambda$updateDefaultHomeNotLocked$33$PackageManagerService(ILjava/lang/Boolean;)V
 PLcom/android/server/pm/PackageManagerService;->lambda$updateDefaultHomeNotLocked$34$PackageManagerService(ILjava/lang/Boolean;)V
 HSPLcom/android/server/pm/PackageManagerService;->logAppProcessStartIfNeeded(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;I)V
@@ -27653,6 +30007,7 @@
 HSPLcom/android/server/pm/PackageManagerService;->maybeMigrateAppDataLIF(Landroid/content/pm/parsing/AndroidPackage;I)Z
 HSPLcom/android/server/pm/PackageManagerService;->maybeMigrateAppDataLIF(Lcom/android/server/pm/parsing/pkg/AndroidPackage;I)Z
 PLcom/android/server/pm/PackageManagerService;->needsNetworkVerificationLPr(Landroid/content/pm/parsing/ComponentParseUtils$ParsedActivityIntentInfo;)Z
+PLcom/android/server/pm/PackageManagerService;->needsNetworkVerificationLPr(Ljava/lang/String;)Z
 HSPLcom/android/server/pm/PackageManagerService;->nonStaticSharedLibExistsLocked(Ljava/lang/String;)Z
 HSPLcom/android/server/pm/PackageManagerService;->normalizePackageNameLPr(Ljava/lang/String;)Ljava/lang/String;
 HSPLcom/android/server/pm/PackageManagerService;->notifyDexLoad(Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/lang/String;)V
@@ -27661,6 +30016,9 @@
 PLcom/android/server/pm/PackageManagerService;->notifyInstallObserver(Lcom/android/server/pm/PackageManagerService$PackageInstalledInfo;Landroid/content/pm/IPackageInstallObserver2;)V
 PLcom/android/server/pm/PackageManagerService;->notifyInstallObserver(Ljava/lang/String;)V
 HPLcom/android/server/pm/PackageManagerService;->notifyPackageAdded(Ljava/lang/String;I)V
+HPLcom/android/server/pm/PackageManagerService;->notifyPackageChangeObservers(Landroid/content/pm/PackageChangeEvent;)V
+PLcom/android/server/pm/PackageManagerService;->notifyPackageChangeObserversOnDelete(Ljava/lang/String;J)V
+PLcom/android/server/pm/PackageManagerService;->notifyPackageChangeObserversOnUpdate(Lcom/android/server/pm/PackageManagerService$ReconciledPackage;)V
 HPLcom/android/server/pm/PackageManagerService;->notifyPackageChanged(Ljava/lang/String;I)V
 HPLcom/android/server/pm/PackageManagerService;->notifyPackageRemoved(Ljava/lang/String;I)V
 HSPLcom/android/server/pm/PackageManagerService;->notifyPackageUse(Ljava/lang/String;I)V
@@ -27726,6 +30084,7 @@
 HSPLcom/android/server/pm/PackageManagerService;->reconcileAppsDataLI(Ljava/lang/String;IIZZ)Ljava/util/List;
 HSPLcom/android/server/pm/PackageManagerService;->reconcilePackagesLocked(Lcom/android/server/pm/PackageManagerService$ReconcileRequest;Lcom/android/server/pm/KeySetManagerService;)Ljava/util/Map;
 PLcom/android/server/pm/PackageManagerService;->registerMoveCallback(Landroid/content/pm/IPackageMoveObserver;)V
+PLcom/android/server/pm/PackageManagerService;->removeAllDistractingPackageRestrictions(I)V
 HSPLcom/android/server/pm/PackageManagerService;->removeCodePathLI(Ljava/io/File;)V
 HSPLcom/android/server/pm/PackageManagerService;->removeDexFiles(Ljava/util/List;[Ljava/lang/String;)V
 HPLcom/android/server/pm/PackageManagerService;->removeDistractingPackageRestrictions([Ljava/lang/String;I)V
@@ -27771,7 +30130,7 @@
 HSPLcom/android/server/pm/PackageManagerService;->scanPackageOnlyLI(Lcom/android/server/pm/PackageManagerService$ScanRequest;Lcom/android/server/pm/PackageManagerService$Injector;ZJ)Lcom/android/server/pm/PackageManagerService$ScanResult;
 HPLcom/android/server/pm/PackageManagerService;->scanPackageTracedLI(Landroid/content/pm/parsing/ParsedPackage;IIJLandroid/os/UserHandle;)Lcom/android/server/pm/PackageManagerService$ScanResult;
 PLcom/android/server/pm/PackageManagerService;->scanPackageTracedLI(Lcom/android/server/pm/parsing/pkg/ParsedPackage;IIJLandroid/os/UserHandle;)Lcom/android/server/pm/PackageManagerService$ScanResult;
-PLcom/android/server/pm/PackageManagerService;->scanPackageTracedLI(Lcom/android/server/pm/parsing/pkg/ParsedPackage;IIJLandroid/os/UserHandle;Ljava/lang/String;)Lcom/android/server/pm/PackageManagerService$ScanResult;
+HPLcom/android/server/pm/PackageManagerService;->scanPackageTracedLI(Lcom/android/server/pm/parsing/pkg/ParsedPackage;IIJLandroid/os/UserHandle;Ljava/lang/String;)Lcom/android/server/pm/PackageManagerService$ScanResult;
 PLcom/android/server/pm/PackageManagerService;->scanPackageTracedLI(Ljava/io/File;IIJLandroid/os/UserHandle;)Landroid/content/pm/parsing/AndroidPackage;
 PLcom/android/server/pm/PackageManagerService;->scanPackageTracedLI(Ljava/io/File;IIJLandroid/os/UserHandle;)Lcom/android/server/pm/parsing/pkg/AndroidPackage;
 PLcom/android/server/pm/PackageManagerService;->scheduleDeferredNoKillInstallObserver(Lcom/android/server/pm/PackageManagerService$PackageInstalledInfo;Landroid/content/pm/IPackageInstallObserver2;)V
@@ -27787,6 +30146,7 @@
 HPLcom/android/server/pm/PackageManagerService;->sendPackageAddedForNewUsers(Ljava/lang/String;ZZI[I[I)V
 PLcom/android/server/pm/PackageManagerService;->sendPackageAddedForUser(Ljava/lang/String;Lcom/android/server/pm/PackageSetting;I)V
 HSPLcom/android/server/pm/PackageManagerService;->sendPackageBroadcast(Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;ILjava/lang/String;Landroid/content/IIntentReceiver;[I[I)V
+HPLcom/android/server/pm/PackageManagerService;->sendPackageBroadcast(Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;ILjava/lang/String;Landroid/content/IIntentReceiver;[I[ILandroid/util/SparseArray;)V
 HPLcom/android/server/pm/PackageManagerService;->sendPackageChangedBroadcast(Ljava/lang/String;ZLjava/util/ArrayList;ILjava/lang/String;)V
 PLcom/android/server/pm/PackageManagerService;->sendPackagesSuspendedForUser([Ljava/lang/String;[IIZ)V
 HPLcom/android/server/pm/PackageManagerService;->sendSessionCommitBroadcast(Landroid/content/pm/PackageInstaller$SessionInfo;I)V
@@ -27816,7 +30176,7 @@
 PLcom/android/server/pm/PackageManagerService;->shouldKeepUninstalledPackageLPr(Ljava/lang/String;)Z
 PLcom/android/server/pm/PackageManagerService;->shutdown()V
 HPLcom/android/server/pm/PackageManagerService;->startIntentFilterVerifications(IZLandroid/content/pm/parsing/AndroidPackage;)V
-PLcom/android/server/pm/PackageManagerService;->startIntentFilterVerifications(IZLcom/android/server/pm/parsing/pkg/AndroidPackage;)V
+HPLcom/android/server/pm/PackageManagerService;->startIntentFilterVerifications(IZLcom/android/server/pm/parsing/pkg/AndroidPackage;)V
 HSPLcom/android/server/pm/PackageManagerService;->systemReady()V
 HPLcom/android/server/pm/PackageManagerService;->unsuspendForSuspendingPackage(Ljava/lang/String;I)V
 HSPLcom/android/server/pm/PackageManagerService;->updateAllSharedLibrariesLocked(Landroid/content/pm/parsing/AndroidPackage;Ljava/util/Map;)Ljava/util/ArrayList;
@@ -27830,6 +30190,7 @@
 HSPLcom/android/server/pm/PackageManagerService;->updateFlagsForPackage(II)I
 HSPLcom/android/server/pm/PackageManagerService;->updateFlagsForResolve(IIIZ)I
 HSPLcom/android/server/pm/PackageManagerService;->updateFlagsForResolve(IIIZZ)I
+HPLcom/android/server/pm/PackageManagerService;->updateFlagsForResolve(IIIZZZ)I
 HSPLcom/android/server/pm/PackageManagerService;->updateInstantAppInstallerLocked(Ljava/lang/String;)V
 HSPLcom/android/server/pm/PackageManagerService;->updateIntentForResolve(Landroid/content/Intent;)Landroid/content/Intent;
 PLcom/android/server/pm/PackageManagerService;->updateIntentVerificationStatus(Ljava/lang/String;II)Z
@@ -27899,6 +30260,7 @@
 HPLcom/android/server/pm/PackageManagerServiceUtils;->lambda$getPackagesForDexopt$5(Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;)I
 HPLcom/android/server/pm/PackageManagerServiceUtils;->lambda$getPackagesForDexopt$6(JLcom/android/server/pm/PackageSetting;)Z
 PLcom/android/server/pm/PackageManagerServiceUtils;->lambda$getPackagesForDexopt$7(Landroid/content/pm/parsing/AndroidPackage;)Z
+PLcom/android/server/pm/PackageManagerServiceUtils;->lambda$getPackagesForDexopt$8(Lcom/android/server/pm/PackageSetting;)Z
 HSPLcom/android/server/pm/PackageManagerServiceUtils;->lambda$sortPackagesByUsageDate$0(Landroid/content/pm/parsing/AndroidPackage;Landroid/content/pm/parsing/AndroidPackage;)I
 HPLcom/android/server/pm/PackageManagerServiceUtils;->lambda$sortPackagesByUsageDate$0(Lcom/android/server/pm/parsing/pkg/AndroidPackage;Lcom/android/server/pm/parsing/pkg/AndroidPackage;)I
 HPLcom/android/server/pm/PackageManagerServiceUtils;->lambda$sortPackagesByUsageDate$1(Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;)I
@@ -27909,7 +30271,13 @@
 HPLcom/android/server/pm/PackageManagerServiceUtils;->packagesToString(Ljava/util/List;)Ljava/lang/String;
 HSPLcom/android/server/pm/PackageManagerServiceUtils;->sortPackagesByUsageDate(Ljava/util/List;Lcom/android/server/pm/PackageManagerService;)V
 HSPLcom/android/server/pm/PackageManagerServiceUtils;->verifySignatures(Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;Landroid/content/pm/PackageParser$SigningDetails;ZZ)Z
+PLcom/android/server/pm/PackageManagerShellCommand$1;-><init>(Lcom/android/server/pm/PackageManagerShellCommand;)V
+HPLcom/android/server/pm/PackageManagerShellCommand$1;->compare(Landroid/content/pm/FeatureInfo;Landroid/content/pm/FeatureInfo;)I
+HPLcom/android/server/pm/PackageManagerShellCommand$1;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
 PLcom/android/server/pm/PackageManagerShellCommand$2;-><init>(Lcom/android/server/pm/PackageManagerShellCommand;)V
+PLcom/android/server/pm/PackageManagerShellCommand$3;-><init>(Lcom/android/server/pm/PackageManagerShellCommand;)V
+PLcom/android/server/pm/PackageManagerShellCommand$3;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
+PLcom/android/server/pm/PackageManagerShellCommand$3;->compare(Ljava/lang/String;Ljava/lang/String;)I
 PLcom/android/server/pm/PackageManagerShellCommand$ClearDataObserver;-><init>()V
 PLcom/android/server/pm/PackageManagerShellCommand$ClearDataObserver;->onRemoveCompleted(Ljava/lang/String;Z)V
 PLcom/android/server/pm/PackageManagerShellCommand$InstallParams;-><init>()V
@@ -27931,6 +30299,7 @@
 HPLcom/android/server/pm/PackageManagerShellCommand;->doRunInstall(Lcom/android/server/pm/PackageManagerShellCommand$InstallParams;)I
 PLcom/android/server/pm/PackageManagerShellCommand;->doWriteSplit(ILjava/lang/String;JLjava/lang/String;Z)I
 HPLcom/android/server/pm/PackageManagerShellCommand;->doWriteSplits(ILjava/util/ArrayList;JZ)I
+PLcom/android/server/pm/PackageManagerShellCommand;->enabledSettingToString(I)Ljava/lang/String;
 HPLcom/android/server/pm/PackageManagerShellCommand;->getRemainingArgs()Ljava/util/ArrayList;
 HPLcom/android/server/pm/PackageManagerShellCommand;->makeInstallParams()Lcom/android/server/pm/PackageManagerShellCommand$InstallParams;
 HSPLcom/android/server/pm/PackageManagerShellCommand;->onCommand(Ljava/lang/String;)I
@@ -27942,9 +30311,12 @@
 PLcom/android/server/pm/PackageManagerShellCommand;->runInstallCreate()I
 PLcom/android/server/pm/PackageManagerShellCommand;->runInstallWrite()I
 HSPLcom/android/server/pm/PackageManagerShellCommand;->runList()I
+HPLcom/android/server/pm/PackageManagerShellCommand;->runListFeatures()I
 PLcom/android/server/pm/PackageManagerShellCommand;->runListInstrumentation()I
+PLcom/android/server/pm/PackageManagerShellCommand;->runListLibraries()I
 HSPLcom/android/server/pm/PackageManagerShellCommand;->runListPackages(Z)I
 PLcom/android/server/pm/PackageManagerShellCommand;->runPath()I
+PLcom/android/server/pm/PackageManagerShellCommand;->runSetEnabledSetting(I)I
 HPLcom/android/server/pm/PackageManagerShellCommand;->runUninstall()I
 HPLcom/android/server/pm/PackageManagerShellCommand;->setParamsSize(Lcom/android/server/pm/PackageManagerShellCommand$InstallParams;Ljava/util/List;)V
 HSPLcom/android/server/pm/PackageManagerShellCommand;->translateUserId(IILjava/lang/String;)I
@@ -28001,6 +30373,7 @@
 HSPLcom/android/server/pm/PackageSettingBase;->getSigningDetails()Landroid/content/pm/PackageParser$SigningDetails;
 HSPLcom/android/server/pm/PackageSettingBase;->getStopped(I)Z
 HSPLcom/android/server/pm/PackageSettingBase;->getSuspended(I)Z
+PLcom/android/server/pm/PackageSettingBase;->getUninstallReason(I)I
 HSPLcom/android/server/pm/PackageSettingBase;->getVirtulalPreload(I)Z
 PLcom/android/server/pm/PackageSettingBase;->isAnyInstalled([I)Z
 HSPLcom/android/server/pm/PackageSettingBase;->modifyUserState(I)Landroid/content/pm/PackageUserState;
@@ -28009,6 +30382,7 @@
 HSPLcom/android/server/pm/PackageSettingBase;->readUserState(I)Landroid/content/pm/PackageUserState;
 HPLcom/android/server/pm/PackageSettingBase;->removeSuspension(Ljava/lang/String;I)V
 PLcom/android/server/pm/PackageSettingBase;->removeUser(I)V
+PLcom/android/server/pm/PackageSettingBase;->resetOverrideComponentLabelIcon(I)V
 HSPLcom/android/server/pm/PackageSettingBase;->restoreComponentLPw(Ljava/lang/String;I)Z
 HPLcom/android/server/pm/PackageSettingBase;->setCeDataInode(JI)V
 PLcom/android/server/pm/PackageSettingBase;->setDistractionFlags(II)V
@@ -28026,7 +30400,9 @@
 HSPLcom/android/server/pm/PackageSettingBase;->setOverlayPathsForLibrary(Ljava/lang/String;Ljava/util/List;I)V
 PLcom/android/server/pm/PackageSettingBase;->setStopped(ZI)V
 HSPLcom/android/server/pm/PackageSettingBase;->setTimeStamp(J)V
+PLcom/android/server/pm/PackageSettingBase;->setUninstallReason(II)V
 PLcom/android/server/pm/PackageSettingBase;->setUpdateAvailable(Z)V
+HSPLcom/android/server/pm/PackageSettingBase;->setUserState(IJIZZZZIZLandroid/util/ArrayMap;ZZLjava/lang/String;Landroid/util/ArraySet;Landroid/util/ArraySet;IIIILjava/lang/String;)V
 HSPLcom/android/server/pm/PackageSettingBase;->setUserState(IJIZZZZIZLandroid/util/ArrayMap;ZZLjava/lang/String;Landroid/util/ArraySet;Landroid/util/ArraySet;IIILjava/lang/String;)V
 HSPLcom/android/server/pm/PackageSettingBase;->updateFrom(Lcom/android/server/pm/PackageSettingBase;)Lcom/android/server/pm/PackageSettingBase;
 HPLcom/android/server/pm/PackageSettingBase;->writeUsersInfoToProto(Landroid/util/proto/ProtoOutputStream;J)V
@@ -28071,6 +30447,7 @@
 HSPLcom/android/server/pm/ParallelPackageParser;->parsePackage(Ljava/io/File;I)Lcom/android/server/pm/parsing/pkg/ParsedPackage;
 HSPLcom/android/server/pm/ParallelPackageParser;->submit(Ljava/io/File;I)V
 HSPLcom/android/server/pm/ParallelPackageParser;->take()Lcom/android/server/pm/ParallelPackageParser$ParseResult;
+PLcom/android/server/pm/PersistentPreferredActivity;-><init>(Landroid/content/IntentFilter;Landroid/content/ComponentName;)V
 HSPLcom/android/server/pm/PersistentPreferredActivity;-><init>(Lorg/xmlpull/v1/XmlPullParser;)V
 HSPLcom/android/server/pm/PersistentPreferredActivity;->writeToXml(Lorg/xmlpull/v1/XmlSerializer;)V
 HSPLcom/android/server/pm/PersistentPreferredIntentResolver;-><init>()V
@@ -28138,6 +30515,21 @@
 HSPLcom/android/server/pm/ProtectedPackages;->isProtectedPackage(Ljava/lang/String;)Z
 HSPLcom/android/server/pm/ProtectedPackages;->setDeviceAndProfileOwnerPackages(ILjava/lang/String;Landroid/util/SparseArray;)V
 HSPLcom/android/server/pm/ProtectedPackages;->setDeviceOwnerProtectedPackages(Ljava/util/List;)V
+HSPLcom/android/server/pm/RestrictionsSet;-><init>()V
+HSPLcom/android/server/pm/RestrictionsSet;-><init>(ILandroid/os/Bundle;)V
+PLcom/android/server/pm/RestrictionsSet;->containsKey(I)Z
+HPLcom/android/server/pm/RestrictionsSet;->dumpRestrictions(Ljava/io/PrintWriter;Ljava/lang/String;)V
+PLcom/android/server/pm/RestrictionsSet;->getEnforcingUser(II)Landroid/os/UserManager$EnforcingUser;
+HPLcom/android/server/pm/RestrictionsSet;->getEnforcingUsers(Ljava/lang/String;I)Ljava/util/List;
+HPLcom/android/server/pm/RestrictionsSet;->getRestrictions(I)Landroid/os/Bundle;
+PLcom/android/server/pm/RestrictionsSet;->isEmpty()Z
+PLcom/android/server/pm/RestrictionsSet;->keyAt(I)I
+PLcom/android/server/pm/RestrictionsSet;->mergeAll()Landroid/os/Bundle;
+HSPLcom/android/server/pm/RestrictionsSet;->readRestrictions(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;)Lcom/android/server/pm/RestrictionsSet;
+PLcom/android/server/pm/RestrictionsSet;->removeAllRestrictions()V
+PLcom/android/server/pm/RestrictionsSet;->size()I
+HSPLcom/android/server/pm/RestrictionsSet;->updateRestrictions(ILandroid/os/Bundle;)Z
+PLcom/android/server/pm/RestrictionsSet;->writeRestrictions(Lorg/xmlpull/v1/XmlSerializer;Ljava/lang/String;)V
 HSPLcom/android/server/pm/SELinuxMMAC;-><clinit>()V
 HSPLcom/android/server/pm/SELinuxMMAC;->getSeInfo(Landroid/content/pm/parsing/AndroidPackage;Lcom/android/server/pm/SharedUserSetting;Lcom/android/server/compat/PlatformCompat;)Ljava/lang/String;
 HSPLcom/android/server/pm/SELinuxMMAC;->getSeInfo(Landroid/content/pm/parsing/AndroidPackage;ZI)Ljava/lang/String;
@@ -28461,6 +30853,10 @@
 HPLcom/android/server/pm/ShortcutParser;->parseShortcutAttributes(Lcom/android/server/pm/ShortcutService;Landroid/util/AttributeSet;Ljava/lang/String;Landroid/content/ComponentName;II)Landroid/content/pm/ShortcutInfo;
 HPLcom/android/server/pm/ShortcutParser;->parseShortcuts(Lcom/android/server/pm/ShortcutService;Ljava/lang/String;ILjava/util/List;)Ljava/util/List;
 HPLcom/android/server/pm/ShortcutParser;->parseShortcutsOneFile(Lcom/android/server/pm/ShortcutService;Landroid/content/pm/ActivityInfo;Ljava/lang/String;ILjava/util/List;Ljava/util/List;)Ljava/util/List;
+PLcom/android/server/pm/ShortcutRequestPinProcessor$PinAppWidgetRequestInner;-><init>(Lcom/android/server/pm/ShortcutRequestPinProcessor;Landroid/content/IntentSender;ILandroid/appwidget/AppWidgetProviderInfo;Landroid/os/Bundle;)V
+PLcom/android/server/pm/ShortcutRequestPinProcessor$PinAppWidgetRequestInner;-><init>(Lcom/android/server/pm/ShortcutRequestPinProcessor;Landroid/content/IntentSender;ILandroid/appwidget/AppWidgetProviderInfo;Landroid/os/Bundle;Lcom/android/server/pm/ShortcutRequestPinProcessor$1;)V
+PLcom/android/server/pm/ShortcutRequestPinProcessor$PinAppWidgetRequestInner;->getAppWidgetProviderInfo()Landroid/appwidget/AppWidgetProviderInfo;
+PLcom/android/server/pm/ShortcutRequestPinProcessor$PinAppWidgetRequestInner;->getExtras()Landroid/os/Bundle;
 PLcom/android/server/pm/ShortcutRequestPinProcessor$PinItemRequestInner;-><init>(Lcom/android/server/pm/ShortcutRequestPinProcessor;Landroid/content/IntentSender;I)V
 PLcom/android/server/pm/ShortcutRequestPinProcessor$PinItemRequestInner;-><init>(Lcom/android/server/pm/ShortcutRequestPinProcessor;Landroid/content/IntentSender;ILcom/android/server/pm/ShortcutRequestPinProcessor$1;)V
 PLcom/android/server/pm/ShortcutRequestPinProcessor$PinItemRequestInner;->accept(Landroid/os/Bundle;)Z
@@ -28534,14 +30930,21 @@
 HPLcom/android/server/pm/ShortcutService$LocalService;->lambda$getShortcutsInnerLocked$1(JLandroid/util/ArraySet;Landroid/content/ComponentName;ZZZZZLandroid/content/pm/ShortcutInfo;)Z
 HPLcom/android/server/pm/ShortcutService$LocalService;->lambda$getShortcutsInnerLocked$1(JLandroid/util/ArraySet;Landroid/util/ArraySet;Landroid/content/ComponentName;ZZZZZLandroid/content/pm/ShortcutInfo;)Z
 PLcom/android/server/pm/ShortcutService$LocalService;->pinShortcuts(ILjava/lang/String;Ljava/lang/String;Ljava/util/List;I)V
+PLcom/android/server/pm/ShortcutService$LocalService;->requestPinAppWidget(Ljava/lang/String;Landroid/appwidget/AppWidgetProviderInfo;Landroid/os/Bundle;Landroid/content/IntentSender;I)Z
 PLcom/android/server/pm/ShortcutService$LocalService;->setShortcutHostPackage(Ljava/lang/String;Ljava/lang/String;I)V
 HSPLcom/android/server/pm/ShortcutService;-><clinit>()V
 HSPLcom/android/server/pm/ShortcutService;-><init>(Landroid/content/Context;)V
 HSPLcom/android/server/pm/ShortcutService;-><init>(Landroid/content/Context;Landroid/os/Looper;Z)V
 HPLcom/android/server/pm/ShortcutService;->access$000(Landroid/content/pm/PackageInfo;)Z
 PLcom/android/server/pm/ShortcutService;->access$1000(Lcom/android/server/pm/ShortcutService;Ljava/lang/String;I)V
+PLcom/android/server/pm/ShortcutService;->access$1100(Lcom/android/server/pm/ShortcutService;)Ljava/util/concurrent/atomic/AtomicBoolean;
 PLcom/android/server/pm/ShortcutService;->access$1100(Lcom/android/server/pm/ShortcutService;Ljava/lang/String;I)V
+PLcom/android/server/pm/ShortcutService;->access$1200(Lcom/android/server/pm/ShortcutService;)Lcom/android/server/uri/UriGrantsManagerInternal;
 PLcom/android/server/pm/ShortcutService;->access$1200(Lcom/android/server/pm/ShortcutService;Ljava/lang/String;I)V
+PLcom/android/server/pm/ShortcutService;->access$1300(Lcom/android/server/pm/ShortcutService;Ljava/lang/String;I)V
+PLcom/android/server/pm/ShortcutService;->access$1400(Lcom/android/server/pm/ShortcutService;Ljava/lang/String;I)V
+PLcom/android/server/pm/ShortcutService;->access$1500(Lcom/android/server/pm/ShortcutService;Ljava/lang/String;I)V
+PLcom/android/server/pm/ShortcutService;->access$1600(Lcom/android/server/pm/ShortcutService;Ljava/lang/String;I)V
 HSPLcom/android/server/pm/ShortcutService;->access$200(Lcom/android/server/pm/ShortcutService;)Ljava/lang/Object;
 HPLcom/android/server/pm/ShortcutService;->access$300(Lcom/android/server/pm/ShortcutService;Ljava/util/List;)Ljava/util/List;
 HSPLcom/android/server/pm/ShortcutService;->access$400(Lcom/android/server/pm/ShortcutService;)Ljava/util/ArrayList;
@@ -28549,6 +30952,8 @@
 HSPLcom/android/server/pm/ShortcutService;->access$500(Lcom/android/server/pm/ShortcutService;)Ljava/util/ArrayList;
 PLcom/android/server/pm/ShortcutService;->access$600(Lcom/android/server/pm/ShortcutService;)Lcom/android/server/pm/ShortcutBitmapSaver;
 HSPLcom/android/server/pm/ShortcutService;->access$700(Lcom/android/server/pm/ShortcutService;)Ljava/util/concurrent/atomic/AtomicBoolean;
+PLcom/android/server/pm/ShortcutService;->access$700(Lcom/android/server/pm/ShortcutService;Ljava/lang/String;ILandroid/content/pm/ShortcutInfo;Landroid/appwidget/AppWidgetProviderInfo;Landroid/os/Bundle;Landroid/content/IntentSender;)Z
+PLcom/android/server/pm/ShortcutService;->access$800(Lcom/android/server/pm/ShortcutService;)Landroid/os/IBinder;
 HSPLcom/android/server/pm/ShortcutService;->access$800(Lcom/android/server/pm/ShortcutService;)Ljava/util/concurrent/atomic/AtomicBoolean;
 PLcom/android/server/pm/ShortcutService;->access$800(Lcom/android/server/pm/ShortcutService;Ljava/lang/String;I)V
 PLcom/android/server/pm/ShortcutService;->access$900(Lcom/android/server/pm/ShortcutService;Ljava/lang/String;I)V
@@ -28719,7 +31124,7 @@
 PLcom/android/server/pm/ShortcutService;->loadUserLocked(I)Lcom/android/server/pm/ShortcutUser;
 HPLcom/android/server/pm/ShortcutService;->logDurationStat(IJ)V
 HPLcom/android/server/pm/ShortcutService;->notifyListeners(Ljava/lang/String;I)V
-PLcom/android/server/pm/ShortcutService;->notifyShortcutChangeCallbacks(Ljava/lang/String;ILjava/util/List;Ljava/util/List;)V
+HPLcom/android/server/pm/ShortcutService;->notifyShortcutChangeCallbacks(Ljava/lang/String;ILjava/util/List;Ljava/util/List;)V
 PLcom/android/server/pm/ShortcutService;->onApplicationActive(Ljava/lang/String;I)V
 HSPLcom/android/server/pm/ShortcutService;->onBootPhase(I)V
 HPLcom/android/server/pm/ShortcutService;->openIconFileForWrite(ILandroid/content/pm/ShortcutInfo;)Lcom/android/server/pm/ShortcutService$FileOutputStreamWithPath;
@@ -28847,6 +31252,7 @@
 PLcom/android/server/pm/StagingManager$PreRebootVerificationHandler;->readyToStart()V
 PLcom/android/server/pm/StagingManager$PreRebootVerificationHandler;->startPreRebootVerification(I)V
 HSPLcom/android/server/pm/StagingManager;-><init>(Lcom/android/server/pm/PackageInstallerService;Landroid/content/Context;)V
+PLcom/android/server/pm/StagingManager;-><init>(Lcom/android/server/pm/PackageInstallerService;Landroid/content/Context;Ljava/util/function/Supplier;)V
 HSPLcom/android/server/pm/StagingManager;-><init>(Lcom/android/server/pm/PackageInstallerService;Lcom/android/server/pm/ApexManager;Landroid/content/Context;)V
 PLcom/android/server/pm/StagingManager;->abortCommittedSession(Lcom/android/server/pm/PackageInstallerSession;)V
 PLcom/android/server/pm/StagingManager;->abortSession(Lcom/android/server/pm/PackageInstallerSession;)V
@@ -28870,6 +31276,7 @@
 PLcom/android/server/pm/StagingManager;->extractApksInSession(Lcom/android/server/pm/PackageInstallerSession;Z)Lcom/android/server/pm/PackageInstallerSession;
 PLcom/android/server/pm/StagingManager;->findAPKsInDir(Ljava/io/File;)Ljava/util/List;
 HPLcom/android/server/pm/StagingManager;->getSessions()Landroid/content/pm/ParceledListSlice;
+HPLcom/android/server/pm/StagingManager;->getSessions(I)Landroid/content/pm/ParceledListSlice;
 PLcom/android/server/pm/StagingManager;->installApksInSession(Lcom/android/server/pm/PackageInstallerSession;)V
 PLcom/android/server/pm/StagingManager;->isApexSession(Lcom/android/server/pm/PackageInstallerSession;)Z
 PLcom/android/server/pm/StagingManager;->isApexSessionFailed(Landroid/apex/ApexSessionInfo;)Z
@@ -28931,6 +31338,7 @@
 PLcom/android/server/pm/UserManagerService$6;-><init>(Lcom/android/server/pm/UserManagerService;I)V
 PLcom/android/server/pm/UserManagerService$6;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
 PLcom/android/server/pm/UserManagerService$DisableQuietModeUserUnlockedCallback;-><init>(Lcom/android/server/pm/UserManagerService;Landroid/content/IntentSender;)V
+PLcom/android/server/pm/UserManagerService$DisableQuietModeUserUnlockedCallback;->lambda$onFinished$0$UserManagerService$DisableQuietModeUserUnlockedCallback()V
 PLcom/android/server/pm/UserManagerService$DisableQuietModeUserUnlockedCallback;->onFinished(ILandroid/os/Bundle;)V
 PLcom/android/server/pm/UserManagerService$DisableQuietModeUserUnlockedCallback;->onProgress(IILandroid/os/Bundle;)V
 PLcom/android/server/pm/UserManagerService$DisableQuietModeUserUnlockedCallback;->onStarted(ILandroid/os/Bundle;)V
@@ -28960,6 +31368,7 @@
 PLcom/android/server/pm/UserManagerService$LocalService;->removeUserState(I)V
 HSPLcom/android/server/pm/UserManagerService$LocalService;->setDeviceManaged(Z)V
 HSPLcom/android/server/pm/UserManagerService$LocalService;->setDevicePolicyUserRestrictions(ILandroid/os/Bundle;I)V
+PLcom/android/server/pm/UserManagerService$LocalService;->setDevicePolicyUserRestrictions(ILandroid/os/Bundle;Lcom/android/server/pm/RestrictionsSet;Z)V
 HSPLcom/android/server/pm/UserManagerService$LocalService;->setForceEphemeralUsers(Z)V
 PLcom/android/server/pm/UserManagerService$LocalService;->setUserIcon(ILandroid/graphics/Bitmap;)V
 HSPLcom/android/server/pm/UserManagerService$LocalService;->setUserManaged(IZ)V
@@ -28983,20 +31392,27 @@
 HSPLcom/android/server/pm/UserManagerService;-><init>(Landroid/content/Context;Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/UserDataPreparer;Ljava/lang/Object;Ljava/io/File;)V
 PLcom/android/server/pm/UserManagerService;->access$000(Lcom/android/server/pm/UserManagerService;IZLandroid/content/IntentSender;Ljava/lang/String;)V
 HSPLcom/android/server/pm/UserManagerService;->access$100(Lcom/android/server/pm/UserManagerService;)Landroid/content/Context;
+PLcom/android/server/pm/UserManagerService;->access$1000(Lcom/android/server/pm/UserManagerService;)Ljava/lang/Object;
 PLcom/android/server/pm/UserManagerService;->access$1000(Lcom/android/server/pm/UserManagerService;I)V
 PLcom/android/server/pm/UserManagerService;->access$1100(Lcom/android/server/pm/UserManagerService;)Ljava/lang/Object;
 PLcom/android/server/pm/UserManagerService;->access$1200(Lcom/android/server/pm/UserManagerService;)Ljava/lang/Object;
 PLcom/android/server/pm/UserManagerService;->access$1200(Lcom/android/server/pm/UserManagerService;I)Lcom/android/server/pm/UserManagerService$UserData;
+PLcom/android/server/pm/UserManagerService;->access$1300(Lcom/android/server/pm/UserManagerService;)Ljava/lang/Object;
 PLcom/android/server/pm/UserManagerService;->access$1300(Lcom/android/server/pm/UserManagerService;I)Lcom/android/server/pm/UserManagerService$UserData;
 PLcom/android/server/pm/UserManagerService;->access$1300(Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService$UserData;)V
+PLcom/android/server/pm/UserManagerService;->access$1400(Lcom/android/server/pm/UserManagerService;I)Lcom/android/server/pm/UserManagerService$UserData;
 HSPLcom/android/server/pm/UserManagerService;->access$1400(Lcom/android/server/pm/UserManagerService;ILandroid/os/Bundle;I)V
 PLcom/android/server/pm/UserManagerService;->access$1400(Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService$UserData;)V
 HSPLcom/android/server/pm/UserManagerService;->access$1500(Lcom/android/server/pm/UserManagerService;ILandroid/os/Bundle;I)V
+PLcom/android/server/pm/UserManagerService;->access$1500(Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService$UserData;)V
+PLcom/android/server/pm/UserManagerService;->access$1600(Lcom/android/server/pm/UserManagerService;ILandroid/os/Bundle;I)V
+PLcom/android/server/pm/UserManagerService;->access$1600(Lcom/android/server/pm/UserManagerService;ILandroid/os/Bundle;Lcom/android/server/pm/RestrictionsSet;Z)V
 PLcom/android/server/pm/UserManagerService;->access$1800(Lcom/android/server/pm/UserManagerService;)Z
 HSPLcom/android/server/pm/UserManagerService;->access$1802(Lcom/android/server/pm/UserManagerService;Z)Z
 HSPLcom/android/server/pm/UserManagerService;->access$1900(Lcom/android/server/pm/UserManagerService;)Landroid/util/SparseBooleanArray;
 PLcom/android/server/pm/UserManagerService;->access$1900(Lcom/android/server/pm/UserManagerService;)Z
 HSPLcom/android/server/pm/UserManagerService;->access$1902(Lcom/android/server/pm/UserManagerService;Z)Z
+PLcom/android/server/pm/UserManagerService;->access$200(Lcom/android/server/pm/UserManagerService;)Landroid/content/Context;
 HSPLcom/android/server/pm/UserManagerService;->access$200(Lcom/android/server/pm/UserManagerService;)Lcom/android/server/pm/PackageManagerService;
 HSPLcom/android/server/pm/UserManagerService;->access$200(Lcom/android/server/pm/UserManagerService;)Ljava/lang/Object;
 HSPLcom/android/server/pm/UserManagerService;->access$2000(Lcom/android/server/pm/UserManagerService;)Landroid/util/SparseBooleanArray;
@@ -29007,9 +31423,11 @@
 HPLcom/android/server/pm/UserManagerService;->access$2500(Lcom/android/server/pm/UserManagerService;I)Landroid/content/pm/UserInfo;
 HPLcom/android/server/pm/UserManagerService;->access$2600(Lcom/android/server/pm/UserManagerService;I)Landroid/content/pm/UserInfo;
 HSPLcom/android/server/pm/UserManagerService;->access$2800(Lcom/android/server/pm/UserManagerService;)Landroid/util/SparseIntArray;
+HSPLcom/android/server/pm/UserManagerService;->access$2800(Lcom/android/server/pm/UserManagerService;)Lcom/android/server/pm/UserManagerService$WatchedUserStates;
 HSPLcom/android/server/pm/UserManagerService;->access$2900(Lcom/android/server/pm/UserManagerService;)Landroid/util/SparseIntArray;
 HSPLcom/android/server/pm/UserManagerService;->access$2900(Lcom/android/server/pm/UserManagerService;)Lcom/android/server/pm/UserManagerService$WatchedUserStates;
 HSPLcom/android/server/pm/UserManagerService;->access$2900(Lcom/android/server/pm/UserManagerService;I)Landroid/content/pm/UserInfo;
+PLcom/android/server/pm/UserManagerService;->access$300(Lcom/android/server/pm/UserManagerService;)Lcom/android/server/pm/PackageManagerService;
 HSPLcom/android/server/pm/UserManagerService;->access$300(Lcom/android/server/pm/UserManagerService;)Ljava/lang/Object;
 HSPLcom/android/server/pm/UserManagerService;->access$300(Lcom/android/server/pm/UserManagerService;I)Lcom/android/server/pm/UserManagerService$UserData;
 HSPLcom/android/server/pm/UserManagerService;->access$3000(Lcom/android/server/pm/UserManagerService;I)Landroid/content/pm/UserInfo;
@@ -29018,15 +31436,20 @@
 HSPLcom/android/server/pm/UserManagerService;->access$3200(Lcom/android/server/pm/UserManagerService;)Landroid/util/SparseArray;
 HSPLcom/android/server/pm/UserManagerService;->access$3200(Lcom/android/server/pm/UserManagerService;I)Landroid/os/Bundle;
 HSPLcom/android/server/pm/UserManagerService;->access$3300(Lcom/android/server/pm/UserManagerService;)Landroid/util/SparseArray;
+PLcom/android/server/pm/UserManagerService;->access$400(Lcom/android/server/pm/UserManagerService;)Ljava/lang/Object;
 HSPLcom/android/server/pm/UserManagerService;->access$400(Lcom/android/server/pm/UserManagerService;I)Lcom/android/server/pm/UserManagerService$UserData;
 HSPLcom/android/server/pm/UserManagerService;->access$500()Landroid/os/IBinder;
+PLcom/android/server/pm/UserManagerService;->access$500(Lcom/android/server/pm/UserManagerService;I)Lcom/android/server/pm/UserManagerService$UserData;
 HSPLcom/android/server/pm/UserManagerService;->access$600()Landroid/os/IBinder;
 HSPLcom/android/server/pm/UserManagerService;->access$600(Lcom/android/server/pm/UserManagerService;)Lcom/android/internal/app/IAppOpsService;
+PLcom/android/server/pm/UserManagerService;->access$700()Landroid/os/IBinder;
 HSPLcom/android/server/pm/UserManagerService;->access$700(Lcom/android/server/pm/UserManagerService;)Lcom/android/internal/app/IAppOpsService;
 HSPLcom/android/server/pm/UserManagerService;->access$700(Lcom/android/server/pm/UserManagerService;)Ljava/util/ArrayList;
+PLcom/android/server/pm/UserManagerService;->access$800(Lcom/android/server/pm/UserManagerService;)Lcom/android/internal/app/IAppOpsService;
 PLcom/android/server/pm/UserManagerService;->access$800(Lcom/android/server/pm/UserManagerService;)Ljava/lang/Object;
 HSPLcom/android/server/pm/UserManagerService;->access$800(Lcom/android/server/pm/UserManagerService;)Ljava/util/ArrayList;
 PLcom/android/server/pm/UserManagerService;->access$900(Lcom/android/server/pm/UserManagerService;)Ljava/lang/Object;
+PLcom/android/server/pm/UserManagerService;->access$900(Lcom/android/server/pm/UserManagerService;)Ljava/util/ArrayList;
 PLcom/android/server/pm/UserManagerService;->addRemovingUserIdLocked(I)V
 HSPLcom/android/server/pm/UserManagerService;->addUserRestrictionsListener(Landroid/os/IUserRestrictionsListener;)V
 PLcom/android/server/pm/UserManagerService;->applyUserRestrictionsForAllUsersLR()V
@@ -29039,6 +31462,7 @@
 PLcom/android/server/pm/UserManagerService;->checkManageOrCreateUsersPermission(I)V
 HSPLcom/android/server/pm/UserManagerService;->checkManageOrCreateUsersPermission(Ljava/lang/String;)V
 HSPLcom/android/server/pm/UserManagerService;->checkManageOrInteractPermIfCallerInOtherProfileGroup(ILjava/lang/String;)V
+HSPLcom/android/server/pm/UserManagerService;->checkManageOrInteractPermissionIfCallerInOtherProfileGroup(ILjava/lang/String;)V
 PLcom/android/server/pm/UserManagerService;->checkManageUserAndAcrossUsersFullPermission(Ljava/lang/String;)V
 HSPLcom/android/server/pm/UserManagerService;->checkManageUsersPermission(Ljava/lang/String;)V
 HPLcom/android/server/pm/UserManagerService;->checkSystemOrRoot(Ljava/lang/String;)V
@@ -29066,6 +31490,7 @@
 HPLcom/android/server/pm/UserManagerService;->getApplicationRestrictionsForUser(Ljava/lang/String;I)Landroid/os/Bundle;
 PLcom/android/server/pm/UserManagerService;->getCreationTime()J
 HSPLcom/android/server/pm/UserManagerService;->getCredentialOwnerProfile(I)I
+HPLcom/android/server/pm/UserManagerService;->getDevicePolicyLocalRestrictionsForTargetUserLR(I)Lcom/android/server/pm/RestrictionsSet;
 HSPLcom/android/server/pm/UserManagerService;->getEffectiveUserRestrictions(I)Landroid/os/Bundle;
 PLcom/android/server/pm/UserManagerService;->getEnforcingUserLocked(I)Landroid/os/UserManager$EnforcingUser;
 PLcom/android/server/pm/UserManagerService;->getFreeProfileBadgeLU(ILjava/lang/String;)I
@@ -29087,6 +31512,7 @@
 HSPLcom/android/server/pm/UserManagerService;->getProfilesLU(ILjava/lang/String;ZZ)Ljava/util/List;
 PLcom/android/server/pm/UserManagerService;->getSeedAccountType()Ljava/lang/String;
 HPLcom/android/server/pm/UserManagerService;->getUidForPackage(Ljava/lang/String;)I
+HPLcom/android/server/pm/UserManagerService;->getUpdatedTargetUserIdsFromLocalRestrictions(ILcom/android/server/pm/RestrictionsSet;)Ljava/util/List;
 PLcom/android/server/pm/UserManagerService;->getUserAccount(I)Ljava/lang/String;
 HPLcom/android/server/pm/UserManagerService;->getUserBadgeColorResId(I)I
 HPLcom/android/server/pm/UserManagerService;->getUserBadgeLabelResId(I)I
@@ -29125,6 +31551,7 @@
 HPLcom/android/server/pm/UserManagerService;->hasUserRestrictionOnAnyUser(Ljava/lang/String;)Z
 HSPLcom/android/server/pm/UserManagerService;->initDefaultGuestRestrictions()V
 HSPLcom/android/server/pm/UserManagerService;->installWhitelistedSystemPackages(ZZ)Z
+PLcom/android/server/pm/UserManagerService;->installWhitelistedSystemPackages(ZZLandroid/util/ArraySet;)Z
 PLcom/android/server/pm/UserManagerService;->isAtMostOneFlag(I)Z
 HPLcom/android/server/pm/UserManagerService;->isDemoUser(I)Z
 HSPLcom/android/server/pm/UserManagerService;->isManagedProfile(I)Z
@@ -29175,12 +31602,15 @@
 PLcom/android/server/pm/UserManagerService;->sendUserInfoChangedBroadcast(I)V
 HPLcom/android/server/pm/UserManagerService;->setApplicationRestrictions(Ljava/lang/String;Landroid/os/Bundle;I)V
 HSPLcom/android/server/pm/UserManagerService;->setDevicePolicyUserRestrictionsInner(ILandroid/os/Bundle;I)V
+HPLcom/android/server/pm/UserManagerService;->setDevicePolicyUserRestrictionsInner(ILandroid/os/Bundle;Lcom/android/server/pm/RestrictionsSet;Z)V
 PLcom/android/server/pm/UserManagerService;->setQuietModeEnabled(IZLandroid/content/IntentSender;Ljava/lang/String;)V
 PLcom/android/server/pm/UserManagerService;->setUserEnabled(I)V
 PLcom/android/server/pm/UserManagerService;->setUserIcon(ILandroid/graphics/Bitmap;)V
+PLcom/android/server/pm/UserManagerService;->setUserName(ILjava/lang/String;)V
 HSPLcom/android/server/pm/UserManagerService;->setUserRestriction(Ljava/lang/String;ZI)V
 PLcom/android/server/pm/UserManagerService;->showConfirmCredentialToDisableQuietMode(ILandroid/content/IntentSender;)V
 HSPLcom/android/server/pm/UserManagerService;->systemReady()V
+HPLcom/android/server/pm/UserManagerService;->updateLocalRestrictionsForTargetUsersLR(ILcom/android/server/pm/RestrictionsSet;Ljava/util/List;)Z
 HSPLcom/android/server/pm/UserManagerService;->updateRestrictionsIfNeededLR(ILandroid/os/Bundle;Landroid/util/SparseArray;)Z
 HSPLcom/android/server/pm/UserManagerService;->updateUserIds()V
 HSPLcom/android/server/pm/UserManagerService;->updateUserRestrictionsInternalLR(Landroid/os/Bundle;I)V
@@ -29208,6 +31638,7 @@
 HSPLcom/android/server/pm/UserRestrictionsUtils;->getNewUserRestrictionSetting(Landroid/content/Context;ILjava/lang/String;Z)I
 HSPLcom/android/server/pm/UserRestrictionsUtils;->isEmpty(Landroid/os/Bundle;)Z
 HSPLcom/android/server/pm/UserRestrictionsUtils;->isGlobal(ILjava/lang/String;)Z
+PLcom/android/server/pm/UserRestrictionsUtils;->isLocal(ILjava/lang/String;)Z
 HSPLcom/android/server/pm/UserRestrictionsUtils;->isSettingRestrictedForUser(Landroid/content/Context;Ljava/lang/String;ILjava/lang/String;I)Z
 PLcom/android/server/pm/UserRestrictionsUtils;->isSystemApp(I[Ljava/lang/String;)Z
 HSPLcom/android/server/pm/UserRestrictionsUtils;->isValidRestriction(Ljava/lang/String;)Z
@@ -29227,6 +31658,7 @@
 HPLcom/android/server/pm/UserSystemPackageInstaller;->dump(Ljava/io/PrintWriter;)V
 HSPLcom/android/server/pm/UserSystemPackageInstaller;->getAndSortKeysFromMap(Landroid/util/ArrayMap;)[Ljava/lang/String;
 HSPLcom/android/server/pm/UserSystemPackageInstaller;->getBaseTypeBitSets()Ljava/util/Map;
+PLcom/android/server/pm/UserSystemPackageInstaller;->getInstallablePackagesForUserId(I)Ljava/util/Set;
 PLcom/android/server/pm/UserSystemPackageInstaller;->getInstallablePackagesForUserType(Ljava/lang/String;)Ljava/util/Set;
 HSPLcom/android/server/pm/UserSystemPackageInstaller;->getTypesBitSet(Ljava/lang/Iterable;Ljava/util/Map;)J
 PLcom/android/server/pm/UserSystemPackageInstaller;->getUserTypeMask(Ljava/lang/String;)J
@@ -29234,12 +31666,17 @@
 PLcom/android/server/pm/UserSystemPackageInstaller;->getWhitelistedPackagesForUserType(Ljava/lang/String;)Ljava/util/Set;
 HSPLcom/android/server/pm/UserSystemPackageInstaller;->getWhitelistedSystemPackages()Ljava/util/Set;
 HSPLcom/android/server/pm/UserSystemPackageInstaller;->installWhitelistedSystemPackages(ZZ)Z
+PLcom/android/server/pm/UserSystemPackageInstaller;->installWhitelistedSystemPackages(ZZLandroid/util/ArraySet;)Z
 HSPLcom/android/server/pm/UserSystemPackageInstaller;->isEnforceMode(I)Z
 PLcom/android/server/pm/UserSystemPackageInstaller;->isIgnoreOtaMode(I)Z
 HSPLcom/android/server/pm/UserSystemPackageInstaller;->isImplicitWhitelistMode(I)Z
 HSPLcom/android/server/pm/UserSystemPackageInstaller;->isLogMode(I)Z
 HPLcom/android/server/pm/UserSystemPackageInstaller;->lambda$getInstallablePackagesForUserType$2$UserSystemPackageInstaller(Ljava/util/Set;ZLjava/util/Set;Landroid/content/pm/parsing/AndroidPackage;)V
+HPLcom/android/server/pm/UserSystemPackageInstaller;->lambda$getInstallablePackagesForUserType$2$UserSystemPackageInstaller(Ljava/util/Set;ZLjava/util/Set;Lcom/android/server/pm/parsing/pkg/AndroidPackage;)V
+HPLcom/android/server/pm/UserSystemPackageInstaller;->lambda$installWhitelistedSystemPackages$0(Ljava/util/Set;IZZLandroid/util/ArraySet;Lcom/android/server/pm/PackageSetting;)V
+PLcom/android/server/pm/UserSystemPackageInstaller;->shouldChangeInstallationState(Lcom/android/server/pm/PackageSetting;ZIZZLandroid/util/ArraySet;)Z
 PLcom/android/server/pm/UserSystemPackageInstaller;->shouldInstallPackage(Landroid/content/pm/parsing/AndroidPackage;Landroid/util/ArrayMap;Ljava/util/Set;Z)Z
+HPLcom/android/server/pm/UserSystemPackageInstaller;->shouldInstallPackage(Lcom/android/server/pm/parsing/pkg/AndroidPackage;Landroid/util/ArrayMap;Ljava/util/Set;Z)Z
 HSPLcom/android/server/pm/UserTypeDetails$Builder;-><init>()V
 HSPLcom/android/server/pm/UserTypeDetails$Builder;->createUserTypeDetails()Lcom/android/server/pm/UserTypeDetails;
 HSPLcom/android/server/pm/UserTypeDetails$Builder;->hasBadge()Z
@@ -29315,6 +31752,7 @@
 HPLcom/android/server/pm/dex/ArtManagerService;->prepareAppProfiles(Landroid/content/pm/parsing/AndroidPackage;IZ)V
 PLcom/android/server/pm/dex/ArtManagerService;->prepareAppProfiles(Landroid/content/pm/parsing/AndroidPackage;[IZ)V
 HPLcom/android/server/pm/dex/ArtManagerService;->prepareAppProfiles(Lcom/android/server/pm/parsing/pkg/AndroidPackage;IZ)V
+PLcom/android/server/pm/dex/ArtManagerService;->prepareAppProfiles(Lcom/android/server/pm/parsing/pkg/AndroidPackage;[IZ)V
 HPLcom/android/server/pm/dex/ArtManagerService;->snapshotAppProfile(Ljava/lang/String;Ljava/lang/String;Landroid/content/pm/dex/ISnapshotRuntimeProfileCallback;)V
 PLcom/android/server/pm/dex/ArtManagerService;->snapshotBootImageProfile(Landroid/content/pm/dex/ISnapshotRuntimeProfileCallback;)V
 PLcom/android/server/pm/dex/ArtManagerService;->snapshotRuntimeProfile(ILjava/lang/String;Ljava/lang/String;Landroid/content/pm/dex/ISnapshotRuntimeProfileCallback;Ljava/lang/String;)V
@@ -29345,6 +31783,7 @@
 HSPLcom/android/server/pm/dex/DexManager;->isPackageSelectedToRunOob(Ljava/lang/String;)Z
 HSPLcom/android/server/pm/dex/DexManager;->isPackageSelectedToRunOob(Ljava/util/Collection;)Z
 HSPLcom/android/server/pm/dex/DexManager;->isPackageSelectedToRunOobInternal(ZLjava/lang/String;Ljava/util/Collection;)Z
+PLcom/android/server/pm/dex/DexManager;->isSystemServerDexPathSupportedForOdex(Ljava/lang/String;)Z
 HSPLcom/android/server/pm/dex/DexManager;->load(Ljava/util/Map;)V
 HSPLcom/android/server/pm/dex/DexManager;->loadInternal(Ljava/util/Map;)V
 HSPLcom/android/server/pm/dex/DexManager;->notifyDexLoad(Landroid/content/pm/ApplicationInfo;Ljava/util/List;Ljava/util/List;Ljava/lang/String;I)V
@@ -29412,13 +31851,17 @@
 PLcom/android/server/pm/dex/PackageDexUsage$DexUseInfo;->getLoadingPackages()Ljava/util/Set;
 PLcom/android/server/pm/dex/PackageDexUsage$DexUseInfo;->getOwnerUserId()I
 HPLcom/android/server/pm/dex/PackageDexUsage$DexUseInfo;->isUnknownClassLoaderContext()Z
-PLcom/android/server/pm/dex/PackageDexUsage$DexUseInfo;->isUnknownOrUnsupportedContext(Ljava/lang/String;)Z
+HPLcom/android/server/pm/dex/PackageDexUsage$DexUseInfo;->isUnknownOrUnsupportedContext(Ljava/lang/String;)Z
+PLcom/android/server/pm/dex/PackageDexUsage$DexUseInfo;->isUnsupportedClassLoaderContext()Z
+PLcom/android/server/pm/dex/PackageDexUsage$DexUseInfo;->isUnsupportedContext(Ljava/lang/String;)Z
 PLcom/android/server/pm/dex/PackageDexUsage$DexUseInfo;->isUsedByOtherApps()Z
 HPLcom/android/server/pm/dex/PackageDexUsage$DexUseInfo;->isVariableClassLoaderContext()Z
 HPLcom/android/server/pm/dex/PackageDexUsage$DexUseInfo;->merge(Lcom/android/server/pm/dex/PackageDexUsage$DexUseInfo;)Z
 HSPLcom/android/server/pm/dex/PackageDexUsage$PackageUseInfo;-><init>()V
 HSPLcom/android/server/pm/dex/PackageDexUsage$PackageUseInfo;-><init>(Lcom/android/server/pm/dex/PackageDexUsage$PackageUseInfo;)V
 HSPLcom/android/server/pm/dex/PackageDexUsage$PackageUseInfo;-><init>(Lcom/android/server/pm/dex/PackageDexUsage$PackageUseInfo;Lcom/android/server/pm/dex/PackageDexUsage$1;)V
+HPLcom/android/server/pm/dex/PackageDexUsage$PackageUseInfo;-><init>(Ljava/lang/String;)V
+PLcom/android/server/pm/dex/PackageDexUsage$PackageUseInfo;->access$000(Lcom/android/server/pm/dex/PackageDexUsage$PackageUseInfo;Ljava/lang/String;Ljava/lang/String;)Z
 HSPLcom/android/server/pm/dex/PackageDexUsage$PackageUseInfo;->access$000(Lcom/android/server/pm/dex/PackageDexUsage$PackageUseInfo;Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;)Z
 HSPLcom/android/server/pm/dex/PackageDexUsage$PackageUseInfo;->access$100(Lcom/android/server/pm/dex/PackageDexUsage$PackageUseInfo;)Ljava/util/Map;
 HSPLcom/android/server/pm/dex/PackageDexUsage$PackageUseInfo;->access$500(Lcom/android/server/pm/dex/PackageDexUsage$PackageUseInfo;)Ljava/util/Map;
@@ -29429,6 +31872,7 @@
 HSPLcom/android/server/pm/dex/PackageDexUsage$PackageUseInfo;->isAnyCodePathUsedByOtherApps()Z
 HSPLcom/android/server/pm/dex/PackageDexUsage$PackageUseInfo;->isUsedByOtherApps(Ljava/lang/String;)Z
 HSPLcom/android/server/pm/dex/PackageDexUsage$PackageUseInfo;->mergeCodePathUsedByOtherApps(Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;)Z
+PLcom/android/server/pm/dex/PackageDexUsage$PackageUseInfo;->mergePrimaryCodePaths(Ljava/lang/String;Ljava/lang/String;)Z
 HSPLcom/android/server/pm/dex/PackageDexUsage;-><init>()V
 PLcom/android/server/pm/dex/PackageDexUsage;->clearUsedByOtherApps(Ljava/lang/String;)Z
 HPLcom/android/server/pm/dex/PackageDexUsage;->clonePackageUseInfoMap()Ljava/util/Map;
@@ -29442,14 +31886,18 @@
 HSPLcom/android/server/pm/dex/PackageDexUsage;->read()V
 HSPLcom/android/server/pm/dex/PackageDexUsage;->read(Ljava/io/Reader;)V
 HSPLcom/android/server/pm/dex/PackageDexUsage;->readBoolean(Ljava/lang/String;)Z
+PLcom/android/server/pm/dex/PackageDexUsage;->readClassLoaderContext(Ljava/io/BufferedReader;I)Ljava/lang/String;
 HSPLcom/android/server/pm/dex/PackageDexUsage;->readInternal(Ljava/lang/Object;)V
 HSPLcom/android/server/pm/dex/PackageDexUsage;->readInternal(Ljava/lang/Void;)V
+PLcom/android/server/pm/dex/PackageDexUsage;->readLoadingPackages(Ljava/io/BufferedReader;I)Ljava/util/Set;
+HPLcom/android/server/pm/dex/PackageDexUsage;->record(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;ZLjava/lang/String;Ljava/lang/String;)Z
 HSPLcom/android/server/pm/dex/PackageDexUsage;->record(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;ZZLjava/lang/String;Ljava/lang/String;)Z
 PLcom/android/server/pm/dex/PackageDexUsage;->removeDexFile(Lcom/android/server/pm/dex/PackageDexUsage$PackageUseInfo;Ljava/lang/String;I)Z
 PLcom/android/server/pm/dex/PackageDexUsage;->removeDexFile(Ljava/lang/String;Ljava/lang/String;I)Z
 HSPLcom/android/server/pm/dex/PackageDexUsage;->removePackage(Ljava/lang/String;)Z
 HSPLcom/android/server/pm/dex/PackageDexUsage;->removeUserPackage(Ljava/lang/String;I)Z
 HSPLcom/android/server/pm/dex/PackageDexUsage;->syncData(Ljava/util/Map;Ljava/util/Map;)V
+HPLcom/android/server/pm/dex/PackageDexUsage;->syncData(Ljava/util/Map;Ljava/util/Map;Ljava/util/List;)V
 HPLcom/android/server/pm/dex/PackageDexUsage;->write(Ljava/io/Writer;)V
 PLcom/android/server/pm/dex/PackageDexUsage;->writeBoolean(Z)Ljava/lang/String;
 PLcom/android/server/pm/dex/PackageDexUsage;->writeInternal(Ljava/lang/Object;)V
@@ -29464,10 +31912,12 @@
 HPLcom/android/server/pm/dex/PackageDynamicCodeLoading$PackageDynamicCode;-><init>(Lcom/android/server/pm/dex/PackageDynamicCodeLoading$PackageDynamicCode;)V
 HPLcom/android/server/pm/dex/PackageDynamicCodeLoading$PackageDynamicCode;-><init>(Lcom/android/server/pm/dex/PackageDynamicCodeLoading$PackageDynamicCode;Lcom/android/server/pm/dex/PackageDynamicCodeLoading$1;)V
 HPLcom/android/server/pm/dex/PackageDynamicCodeLoading$PackageDynamicCode;->access$100(Lcom/android/server/pm/dex/PackageDynamicCodeLoading$PackageDynamicCode;Ljava/lang/String;CILjava/lang/String;)Z
+PLcom/android/server/pm/dex/PackageDynamicCodeLoading$PackageDynamicCode;->access$300(Lcom/android/server/pm/dex/PackageDynamicCodeLoading$PackageDynamicCode;I)Z
 PLcom/android/server/pm/dex/PackageDynamicCodeLoading$PackageDynamicCode;->access$400(Lcom/android/server/pm/dex/PackageDynamicCodeLoading$PackageDynamicCode;Ljava/lang/String;I)Z
 HSPLcom/android/server/pm/dex/PackageDynamicCodeLoading$PackageDynamicCode;->access$500(Lcom/android/server/pm/dex/PackageDynamicCodeLoading$PackageDynamicCode;Ljava/util/Map;Ljava/util/Set;)V
 HPLcom/android/server/pm/dex/PackageDynamicCodeLoading$PackageDynamicCode;->add(Ljava/lang/String;CILjava/lang/String;)Z
 HPLcom/android/server/pm/dex/PackageDynamicCodeLoading$PackageDynamicCode;->removeFile(Ljava/lang/String;I)Z
+PLcom/android/server/pm/dex/PackageDynamicCodeLoading$PackageDynamicCode;->removeUser(I)Z
 HSPLcom/android/server/pm/dex/PackageDynamicCodeLoading$PackageDynamicCode;->syncData(Ljava/util/Map;Ljava/util/Set;)V
 HSPLcom/android/server/pm/dex/PackageDynamicCodeLoading;-><clinit>()V
 HSPLcom/android/server/pm/dex/PackageDynamicCodeLoading;-><init>()V
@@ -29493,10 +31943,21 @@
 PLcom/android/server/pm/dex/PackageDynamicCodeLoading;->writeInternal(Ljava/lang/Object;)V
 PLcom/android/server/pm/dex/PackageDynamicCodeLoading;->writeInternal(Ljava/lang/Void;)V
 PLcom/android/server/pm/dex/PackageDynamicCodeLoading;->writeNow()V
+PLcom/android/server/pm/dex/SystemServerDexLoadReporter;-><clinit>()V
+PLcom/android/server/pm/dex/SystemServerDexLoadReporter;-><init>(Landroid/content/pm/IPackageManager;)V
+PLcom/android/server/pm/dex/SystemServerDexLoadReporter;->configureSystemServerDexReporter(Landroid/content/pm/IPackageManager;)V
+PLcom/android/server/pm/dex/SystemServerDexLoadReporter;->report(Ljava/util/Map;)V
 HSPLcom/android/server/pm/dex/ViewCompiler;-><init>(Ljava/lang/Object;Lcom/android/server/pm/Installer;)V
 HSPLcom/android/server/pm/parsing/-$$Lambda$MsCTQbj1nCkHPuW2VX512f_ZKpg;-><clinit>()V
 HSPLcom/android/server/pm/parsing/-$$Lambda$MsCTQbj1nCkHPuW2VX512f_ZKpg;-><init>()V
 HSPLcom/android/server/pm/parsing/-$$Lambda$MsCTQbj1nCkHPuW2VX512f_ZKpg;->get()Ljava/lang/Object;
+HSPLcom/android/server/pm/parsing/-$$Lambda$PackageParser2$Svc6Ot6mP20gZxXqsV5RuSFu1Lk;-><clinit>()V
+HSPLcom/android/server/pm/parsing/-$$Lambda$PackageParser2$Svc6Ot6mP20gZxXqsV5RuSFu1Lk;-><init>()V
+HSPLcom/android/server/pm/parsing/-$$Lambda$PackageParser2$Svc6Ot6mP20gZxXqsV5RuSFu1Lk;->get()Ljava/lang/Object;
+HSPLcom/android/server/pm/parsing/-$$Lambda$PackageParser2$Z1LNA-uFIqWWTxexnRn70YNNhRw;-><init>(Lcom/android/server/pm/parsing/PackageParser2;Lcom/android/server/pm/parsing/PackageParser2$Callback;)V
+HSPLcom/android/server/pm/parsing/-$$Lambda$PackageParser2$Z1LNA-uFIqWWTxexnRn70YNNhRw;->isChangeEnabled(JLjava/lang/String;I)Z
+HSPLcom/android/server/pm/parsing/-$$Lambda$PackageParser2$_jLfb1ehczUk0X2MUB2Q0T-RBTI;-><init>(Landroid/content/pm/parsing/result/ParseInput$Callback;)V
+HSPLcom/android/server/pm/parsing/-$$Lambda$PackageParser2$_jLfb1ehczUk0X2MUB2Q0T-RBTI;->get()Ljava/lang/Object;
 HSPLcom/android/server/pm/parsing/-$$Lambda$gLXiiRPkkfU6FsJxq4nR4nPlVSk;-><clinit>()V
 HSPLcom/android/server/pm/parsing/-$$Lambda$gLXiiRPkkfU6FsJxq4nR4nPlVSk;-><init>()V
 HSPLcom/android/server/pm/parsing/-$$Lambda$gLXiiRPkkfU6FsJxq4nR4nPlVSk;->get()Ljava/lang/Object;
@@ -29516,8 +31977,10 @@
 HSPLcom/android/server/pm/parsing/PackageInfoUtils;->appInfoPrivateFlags(Lcom/android/server/pm/parsing/pkg/AndroidPackage;Lcom/android/server/pm/PackageSetting;)I
 HSPLcom/android/server/pm/parsing/PackageInfoUtils;->assignSharedFieldsForComponentInfo(Landroid/content/pm/ComponentInfo;Landroid/content/pm/parsing/ComponentParseUtils$ParsedMainComponent;Lcom/android/server/pm/PackageSetting;)V
 HSPLcom/android/server/pm/parsing/PackageInfoUtils;->assignSharedFieldsForComponentInfo(Landroid/content/pm/ComponentInfo;Landroid/content/pm/parsing/component/ParsedMainComponent;Lcom/android/server/pm/PackageSetting;)V
+HPLcom/android/server/pm/parsing/PackageInfoUtils;->assignSharedFieldsForComponentInfo(Landroid/content/pm/ComponentInfo;Landroid/content/pm/parsing/component/ParsedMainComponent;Lcom/android/server/pm/PackageSetting;I)V
 HSPLcom/android/server/pm/parsing/PackageInfoUtils;->assignStateFieldsForPackageItemInfo(Landroid/content/pm/PackageItemInfo;Landroid/content/pm/parsing/ComponentParseUtils$ParsedComponent;Lcom/android/server/pm/PackageSetting;)V
 HSPLcom/android/server/pm/parsing/PackageInfoUtils;->assignStateFieldsForPackageItemInfo(Landroid/content/pm/PackageItemInfo;Landroid/content/pm/parsing/component/ParsedComponent;Lcom/android/server/pm/PackageSetting;)V
+HPLcom/android/server/pm/parsing/PackageInfoUtils;->assignStateFieldsForPackageItemInfo(Landroid/content/pm/PackageItemInfo;Landroid/content/pm/parsing/component/ParsedComponent;Lcom/android/server/pm/PackageSetting;I)V
 HSPLcom/android/server/pm/parsing/PackageInfoUtils;->checkUseInstalledOrHidden(Lcom/android/server/pm/parsing/pkg/AndroidPackage;Lcom/android/server/pm/PackageSetting;Landroid/content/pm/PackageUserState;I)Z
 HSPLcom/android/server/pm/parsing/PackageInfoUtils;->flag(ZI)I
 HSPLcom/android/server/pm/parsing/PackageInfoUtils;->generate(Lcom/android/server/pm/parsing/pkg/AndroidPackage;[IIJJLjava/util/Set;Landroid/content/pm/PackageUserState;I)Landroid/content/pm/PackageInfo;
@@ -29528,6 +31991,7 @@
 HSPLcom/android/server/pm/parsing/PackageInfoUtils;->generateActivityInfo(Lcom/android/server/pm/parsing/pkg/AndroidPackage;Landroid/content/pm/parsing/component/ParsedActivity;ILandroid/content/pm/PackageUserState;Landroid/content/pm/ApplicationInfo;ILcom/android/server/pm/PackageSetting;)Landroid/content/pm/ActivityInfo;
 HSPLcom/android/server/pm/parsing/PackageInfoUtils;->generateApplicationInfo(Lcom/android/server/pm/parsing/pkg/AndroidPackage;ILandroid/content/pm/PackageUserState;I)Landroid/content/pm/ApplicationInfo;
 HSPLcom/android/server/pm/parsing/PackageInfoUtils;->generateApplicationInfo(Lcom/android/server/pm/parsing/pkg/AndroidPackage;ILandroid/content/pm/PackageUserState;ILcom/android/server/pm/PackageSetting;)Landroid/content/pm/ApplicationInfo;
+HPLcom/android/server/pm/parsing/PackageInfoUtils;->generateInstrumentationInfo(Landroid/content/pm/parsing/component/ParsedInstrumentation;Lcom/android/server/pm/parsing/pkg/AndroidPackage;IILcom/android/server/pm/PackageSetting;)Landroid/content/pm/InstrumentationInfo;
 PLcom/android/server/pm/parsing/PackageInfoUtils;->generatePermissionGroupInfo(Landroid/content/pm/parsing/ComponentParseUtils$ParsedPermissionGroup;I)Landroid/content/pm/PermissionGroupInfo;
 PLcom/android/server/pm/parsing/PackageInfoUtils;->generatePermissionGroupInfo(Landroid/content/pm/parsing/component/ParsedPermissionGroup;I)Landroid/content/pm/PermissionGroupInfo;
 HSPLcom/android/server/pm/parsing/PackageInfoUtils;->generatePermissionInfo(Landroid/content/pm/parsing/ComponentParseUtils$ParsedPermission;I)Landroid/content/pm/PermissionInfo;
@@ -29541,13 +32005,20 @@
 HSPLcom/android/server/pm/parsing/PackageInfoUtils;->generateServiceInfo(Lcom/android/server/pm/parsing/pkg/AndroidPackage;Landroid/content/pm/parsing/component/ParsedService;ILandroid/content/pm/PackageUserState;ILcom/android/server/pm/PackageSetting;)Landroid/content/pm/ServiceInfo;
 HSPLcom/android/server/pm/parsing/PackageInfoUtils;->generateServiceInfo(Lcom/android/server/pm/parsing/pkg/AndroidPackage;Landroid/content/pm/parsing/component/ParsedService;ILandroid/content/pm/PackageUserState;Landroid/content/pm/ApplicationInfo;ILcom/android/server/pm/PackageSetting;)Landroid/content/pm/ServiceInfo;
 HSPLcom/android/server/pm/parsing/PackageInfoUtils;->generateWithComponents(Lcom/android/server/pm/parsing/pkg/AndroidPackage;[IIJJLjava/util/Set;Landroid/content/pm/PackageUserState;ILandroid/apex/ApexInfo;Lcom/android/server/pm/PackageSetting;)Landroid/content/pm/PackageInfo;
+PLcom/android/server/pm/parsing/PackageParser2$1;-><init>(Lcom/android/server/compat/PlatformCompat;)V
 PLcom/android/server/pm/parsing/PackageParser2$1;-><init>(Lcom/android/server/pm/parsing/PackageParser2;)V
 PLcom/android/server/pm/parsing/PackageParser2$1;->hasFeature(Ljava/lang/String;)Z
 HSPLcom/android/server/pm/parsing/PackageParser2$Callback;-><init>()V
 HSPLcom/android/server/pm/parsing/PackageParser2$Callback;->startParsingPackage(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/content/res/TypedArray;Z)Landroid/content/pm/parsing/ParsingPackage;
 HSPLcom/android/server/pm/parsing/PackageParser2;-><clinit>()V
 HSPLcom/android/server/pm/parsing/PackageParser2;-><init>([Ljava/lang/String;ZLandroid/util/DisplayMetrics;Ljava/io/File;Lcom/android/server/pm/parsing/PackageParser2$Callback;)V
+PLcom/android/server/pm/parsing/PackageParser2;->close()V
+PLcom/android/server/pm/parsing/PackageParser2;->forParsingFileWithDefaults()Lcom/android/server/pm/parsing/PackageParser2;
+HSPLcom/android/server/pm/parsing/PackageParser2;->lambda$new$0()Landroid/content/pm/ApplicationInfo;
+HSPLcom/android/server/pm/parsing/PackageParser2;->lambda$new$1$PackageParser2(Lcom/android/server/pm/parsing/PackageParser2$Callback;JLjava/lang/String;I)Z
+HSPLcom/android/server/pm/parsing/PackageParser2;->lambda$new$2(Landroid/content/pm/parsing/result/ParseInput$Callback;)Landroid/content/pm/parsing/result/ParseTypeImpl;
 HSPLcom/android/server/pm/parsing/PackageParser2;->parsePackage(Ljava/io/File;IZ)Lcom/android/server/pm/parsing/pkg/ParsedPackage;
+HPLcom/android/server/pm/parsing/ParsedComponentStateUtils;->getNonLocalizedLabelAndIcon(Landroid/content/pm/parsing/component/ParsedComponent;Lcom/android/server/pm/PackageSetting;I)Landroid/util/Pair;
 HSPLcom/android/server/pm/parsing/library/AndroidHidlUpdater;-><init>()V
 HSPLcom/android/server/pm/parsing/library/AndroidHidlUpdater;->updatePackage(Lcom/android/server/pm/parsing/pkg/ParsedPackage;)V
 HSPLcom/android/server/pm/parsing/library/AndroidHidlUpdater;->updatePackage(Lcom/android/server/pm/parsing/pkg/ParsedPackage;Z)V
@@ -29555,6 +32026,8 @@
 HSPLcom/android/server/pm/parsing/library/AndroidTestBaseUpdater;->isChangeEnabled(Lcom/android/server/pm/parsing/pkg/AndroidPackage;)Z
 HSPLcom/android/server/pm/parsing/library/AndroidTestBaseUpdater;->updatePackage(Lcom/android/server/pm/parsing/pkg/ParsedPackage;)V
 HSPLcom/android/server/pm/parsing/library/AndroidTestBaseUpdater;->updatePackage(Lcom/android/server/pm/parsing/pkg/ParsedPackage;Z)V
+HSPLcom/android/server/pm/parsing/library/ComGoogleAndroidMapsUpdater;-><init>()V
+HSPLcom/android/server/pm/parsing/library/ComGoogleAndroidMapsUpdater;->updatePackage(Lcom/android/server/pm/parsing/pkg/ParsedPackage;Z)V
 HSPLcom/android/server/pm/parsing/library/OrgApacheHttpLegacyUpdater;-><init>()V
 HSPLcom/android/server/pm/parsing/library/OrgApacheHttpLegacyUpdater;->apkTargetsApiLevelLessThanOrEqualToOMR1(Lcom/android/server/pm/parsing/pkg/AndroidPackage;)Z
 HSPLcom/android/server/pm/parsing/library/OrgApacheHttpLegacyUpdater;->updatePackage(Lcom/android/server/pm/parsing/pkg/ParsedPackage;)V
@@ -29592,13 +32065,15 @@
 HSPLcom/android/server/pm/parsing/pkg/AndroidPackageUtils;->isEncryptionAware(Lcom/android/server/pm/parsing/pkg/AndroidPackage;)Z
 HSPLcom/android/server/pm/parsing/pkg/AndroidPackageUtils;->isLibrary(Lcom/android/server/pm/parsing/pkg/AndroidPackage;)Z
 HSPLcom/android/server/pm/parsing/pkg/AndroidPackageUtils;->isMatchForSystemOnly(Lcom/android/server/pm/parsing/pkg/AndroidPackage;I)Z
-PLcom/android/server/pm/parsing/pkg/AndroidPackageUtils;->validatePackageDexMetadata(Lcom/android/server/pm/parsing/pkg/AndroidPackage;)V
+HPLcom/android/server/pm/parsing/pkg/AndroidPackageUtils;->validatePackageDexMetadata(Lcom/android/server/pm/parsing/pkg/AndroidPackage;)V
 HSPLcom/android/server/pm/parsing/pkg/PackageImpl$1;-><init>()V
 HSPLcom/android/server/pm/parsing/pkg/PackageImpl;-><clinit>()V
 HSPLcom/android/server/pm/parsing/pkg/PackageImpl;-><init>(Landroid/os/Parcel;)V
 HSPLcom/android/server/pm/parsing/pkg/PackageImpl;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/content/res/TypedArray;Z)V
 HSPLcom/android/server/pm/parsing/pkg/PackageImpl;->addUsesLibrary(ILjava/lang/String;)Lcom/android/server/pm/parsing/pkg/PackageImpl;
 HSPLcom/android/server/pm/parsing/pkg/PackageImpl;->addUsesLibrary(ILjava/lang/String;)Lcom/android/server/pm/parsing/pkg/ParsedPackage;
+HSPLcom/android/server/pm/parsing/pkg/PackageImpl;->addUsesOptionalLibrary(ILjava/lang/String;)Lcom/android/server/pm/parsing/pkg/PackageImpl;
+HSPLcom/android/server/pm/parsing/pkg/PackageImpl;->addUsesOptionalLibrary(ILjava/lang/String;)Lcom/android/server/pm/parsing/pkg/ParsedPackage;
 HSPLcom/android/server/pm/parsing/pkg/PackageImpl;->capPermissionPriorities()Lcom/android/server/pm/parsing/pkg/PackageImpl;
 HSPLcom/android/server/pm/parsing/pkg/PackageImpl;->capPermissionPriorities()Lcom/android/server/pm/parsing/pkg/ParsedPackage;
 HSPLcom/android/server/pm/parsing/pkg/PackageImpl;->clearAdoptPermissions()Lcom/android/server/pm/parsing/pkg/PackageImpl;
@@ -29622,6 +32097,7 @@
 HSPLcom/android/server/pm/parsing/pkg/PackageImpl;->getSeInfo()Ljava/lang/String;
 HSPLcom/android/server/pm/parsing/pkg/PackageImpl;->getSeInfoUser()Ljava/lang/String;
 HSPLcom/android/server/pm/parsing/pkg/PackageImpl;->getSecondaryCpuAbi()Ljava/lang/String;
+PLcom/android/server/pm/parsing/pkg/PackageImpl;->getSecondaryNativeLibraryDir()Ljava/lang/String;
 HSPLcom/android/server/pm/parsing/pkg/PackageImpl;->getUid()I
 HSPLcom/android/server/pm/parsing/pkg/PackageImpl;->getUsesLibraryFiles()[Ljava/lang/String;
 PLcom/android/server/pm/parsing/pkg/PackageImpl;->getUsesLibraryInfos()Ljava/util/List;
@@ -29753,12 +32229,16 @@
 PLcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$1$7A2ffMA57G4PvFD5RbG2mRh2Q_8;->run()V
 PLcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$5wIJaBo3ATYcr96ofI23sjuUqoA;-><init>(Lcom/android/server/pm/permission/PermissionManagerService;Landroid/os/UserHandle;)V
 PLcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$5wIJaBo3ATYcr96ofI23sjuUqoA;->accept(Ljava/lang/Object;)V
+PLcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$7UbsdDkY7eb6gD8CfMZMTcb6R5Y;-><init>(ILjava/util/List;)V
+HPLcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$7UbsdDkY7eb6gD8CfMZMTcb6R5Y;->accept(Ljava/lang/Object;)V
 PLcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$BEPoV9HmbUN2-ZgCcIqC6xfzvew;-><init>(Lcom/android/server/pm/permission/PermissionManagerService;[Ljava/lang/String;I)V
 PLcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$BEPoV9HmbUN2-ZgCcIqC6xfzvew;->runOrThrow()V
 PLcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$E0rM1FNIqzKUZzqphmkzeY3ZdTk;-><init>(Lcom/android/server/pm/permission/PermissionManagerService;[Ljava/lang/String;I)V
 PLcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$E0rM1FNIqzKUZzqphmkzeY3ZdTk;->runOrThrow()V
 HPLcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$JcWw5txStfnrnbvcFd2durv6YOo;-><init>(Lcom/android/server/pm/permission/PermissionManagerService;[Ljava/lang/String;I)V
 PLcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$JcWw5txStfnrnbvcFd2durv6YOo;->runOrThrow()V
+HSPLcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$MRwpP9TcX_fEwjj-3Vp2CFidMPk;-><init>(Lcom/android/server/pm/permission/PermissionManagerService;Lcom/android/server/pm/parsing/pkg/AndroidPackage;ZLjava/lang/String;Ljava/lang/String;Lcom/android/server/pm/permission/PermissionManagerServiceInternal$PermissionCallback;)V
+HSPLcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$MRwpP9TcX_fEwjj-3Vp2CFidMPk;->accept(Ljava/lang/Object;)V
 HSPLcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$NPd9St1HBvGAtg1uhMV2Upfww4g;-><clinit>()V
 HSPLcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$NPd9St1HBvGAtg1uhMV2Upfww4g;-><init>()V
 HSPLcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$NPd9St1HBvGAtg1uhMV2Upfww4g;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
@@ -29768,16 +32248,26 @@
 PLcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$T4uCZ9__oEXYpzLBYEW1T_BN3SU;->runOrThrow()V
 PLcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$TCLcs8BgJvNr88B1R6pU9xRD-jw;-><init>(Lcom/android/server/pm/permission/PermissionManagerService;Lcom/android/server/pm/permission/BasePermission;ILcom/android/server/pm/permission/PermissionManagerServiceInternal$PermissionCallback;)V
 HPLcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$TCLcs8BgJvNr88B1R6pU9xRD-jw;->accept(Ljava/lang/Object;)V
+PLcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$XR_q8pmrsZ93foAa2J5K4McsCr0;-><init>(Ljava/util/List;)V
+HPLcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$XR_q8pmrsZ93foAa2J5K4McsCr0;->accept(Ljava/lang/Object;)V
 HSPLcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$XgJON0nYdrr1Swr3OJklQ7xA-pU;-><init>(Lcom/android/server/pm/permission/PermissionManagerService;Lcom/android/server/pm/parsing/pkg/AndroidPackage;ZLjava/lang/String;Ljava/lang/String;Lcom/android/server/pm/permission/PermissionManagerServiceInternal$PermissionCallback;)V
 HSPLcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$XgJON0nYdrr1Swr3OJklQ7xA-pU;->accept(Ljava/lang/Object;)V
+PLcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$_Kakccz_-nomXOc_Nhv5q-uqA7I;-><init>(Lcom/android/server/pm/permission/PermissionManagerService;Lcom/android/server/pm/parsing/pkg/AndroidPackage;ZLjava/lang/String;Ljava/lang/String;Lcom/android/server/pm/permission/PermissionManagerServiceInternal$PermissionCallback;)V
+HPLcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$_Kakccz_-nomXOc_Nhv5q-uqA7I;->accept(Ljava/lang/Object;)V
 PLcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$aQWnOfCuKK-rSxzDPI_dUOtzv8I;-><init>(Lcom/android/server/pm/permission/PermissionManagerService;[Ljava/lang/String;I)V
 PLcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$aQWnOfCuKK-rSxzDPI_dUOtzv8I;->runOrThrow()V
+PLcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$eApyRxwI3JHTSVAxV9EbP43gFOo;-><init>(Lcom/android/server/pm/permission/PermissionManagerService;)V
+PLcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$eApyRxwI3JHTSVAxV9EbP43gFOo;->apply(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
 HSPLcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$g9Bo5gFpLYyPOsp3K8Aik5xseDI;-><init>(Lcom/android/server/pm/permission/PermissionManagerService;Landroid/content/pm/parsing/AndroidPackage;ZLjava/lang/String;Ljava/lang/String;Lcom/android/server/pm/permission/PermissionManagerServiceInternal$PermissionCallback;)V
 HSPLcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$g9Bo5gFpLYyPOsp3K8Aik5xseDI;->accept(Ljava/lang/Object;)V
 PLcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$igfYI7thImnYrDxs3qWtqs2SCRk;-><init>(II)V
 PLcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$igfYI7thImnYrDxs3qWtqs2SCRk;->run()V
+PLcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$iwnRBDwjg4K5iRGbRU5_sVt0zaU;-><init>(Lcom/android/server/pm/permission/PermissionManagerService;)V
+PLcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$iwnRBDwjg4K5iRGbRU5_sVt0zaU;->apply(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
 PLcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$oG7YD8MVgcqcPbx_HXQ04PEUOXM;-><init>(Lcom/android/server/pm/permission/PermissionManagerService;Ljava/lang/String;I)V
 PLcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$oG7YD8MVgcqcPbx_HXQ04PEUOXM;->runOrThrow()V
+PLcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$tAcOXvvLnf8YMDota79zZypUyds;-><init>(Lcom/android/server/pm/permission/PermissionManagerService;Lcom/android/server/pm/permission/BasePermission;ILcom/android/server/pm/permission/PermissionManagerServiceInternal$PermissionCallback;)V
+HPLcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$tAcOXvvLnf8YMDota79zZypUyds;->accept(Ljava/lang/Object;)V
 PLcom/android/server/pm/permission/-$$Lambda$oynlBn0BbcU0KODvfUDDUHb5LKY;-><init>(Ljava/util/concurrent/CompletableFuture;)V
 PLcom/android/server/pm/permission/-$$Lambda$oynlBn0BbcU0KODvfUDDUHb5LKY;->accept(Ljava/lang/Object;)V
 HSPLcom/android/server/pm/permission/BasePermission;-><init>(Ljava/lang/String;Ljava/lang/String;I)V
@@ -29809,7 +32299,7 @@
 HSPLcom/android/server/pm/permission/BasePermission;->isDevelopment()Z
 HSPLcom/android/server/pm/permission/BasePermission;->isDocumenter()Z
 HSPLcom/android/server/pm/permission/BasePermission;->isDynamic()Z
-PLcom/android/server/pm/permission/BasePermission;->isHardOrSoftRestricted()Z
+HPLcom/android/server/pm/permission/BasePermission;->isHardOrSoftRestricted()Z
 HSPLcom/android/server/pm/permission/BasePermission;->isHardRestricted()Z
 PLcom/android/server/pm/permission/BasePermission;->isImmutablyRestricted()Z
 HSPLcom/android/server/pm/permission/BasePermission;->isIncidentReportApprover()Z
@@ -29939,6 +32429,8 @@
 PLcom/android/server/pm/permission/PermissionManagerService$1;->lambda$onPermissionRevoked$1(II)V
 PLcom/android/server/pm/permission/PermissionManagerService$1;->onInstallPermissionGranted()V
 PLcom/android/server/pm/permission/PermissionManagerService$1;->onInstallPermissionRevoked()V
+HPLcom/android/server/pm/permission/PermissionManagerService$1;->onInstallPermissionUpdated()V
+HPLcom/android/server/pm/permission/PermissionManagerService$1;->onInstallPermissionUpdatedNotifyListener(I)V
 HSPLcom/android/server/pm/permission/PermissionManagerService$1;->onPermissionGranted(II)V
 HPLcom/android/server/pm/permission/PermissionManagerService$1;->onPermissionRevoked(II)V
 HSPLcom/android/server/pm/permission/PermissionManagerService$1;->onPermissionUpdated([IZ)V
@@ -29948,6 +32440,16 @@
 PLcom/android/server/pm/permission/PermissionManagerService$2;->onPermissionRevoked(II)V
 PLcom/android/server/pm/permission/PermissionManagerService$2;->onPermissionUpdated([IZ)V
 PLcom/android/server/pm/permission/PermissionManagerService$2;->onPermissionUpdatedNotifyListener([IZI)V
+HSPLcom/android/server/pm/permission/PermissionManagerService$Injector;-><init>(Landroid/content/Context;)V
+HPLcom/android/server/pm/permission/PermissionManagerService$Injector;->checkPermission(Ljava/lang/String;II)I
+HPLcom/android/server/pm/permission/PermissionManagerService$Injector;->clearCallingIdentity()J
+HSPLcom/android/server/pm/permission/PermissionManagerService$Injector;->disablePackageNamePermissionCache()V
+HSPLcom/android/server/pm/permission/PermissionManagerService$Injector;->disablePermissionCache()V
+HPLcom/android/server/pm/permission/PermissionManagerService$Injector;->getCallingPid()I
+HPLcom/android/server/pm/permission/PermissionManagerService$Injector;->getCallingUid()I
+HPLcom/android/server/pm/permission/PermissionManagerService$Injector;->getSystemService(Ljava/lang/String;)Ljava/lang/Object;
+HSPLcom/android/server/pm/permission/PermissionManagerService$Injector;->invalidatePackageInfoCache()V
+HPLcom/android/server/pm/permission/PermissionManagerService$Injector;->restoreCallingIdentity(J)V
 HSPLcom/android/server/pm/permission/PermissionManagerService$OnPermissionChangeListeners;-><init>(Landroid/os/Looper;)V
 HSPLcom/android/server/pm/permission/PermissionManagerService$OnPermissionChangeListeners;->addListenerLocked(Landroid/permission/IOnPermissionsChangeListener;)V
 HSPLcom/android/server/pm/permission/PermissionManagerService$OnPermissionChangeListeners;->handleMessage(Landroid/os/Message;)V
@@ -29967,6 +32469,7 @@
 HSPLcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl;->enforceCrossUserPermission(IIZZZLjava/lang/String;)V
 HSPLcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl;->getAllPermissionWithProtection(I)Ljava/util/ArrayList;
 PLcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl;->getAppOpPermissionPackages(Ljava/lang/String;I)[Ljava/lang/String;
+PLcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl;->getCheckPermissionDelegate()Landroid/permission/PermissionManagerInternal$CheckPermissionDelegate;
 HSPLcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl;->getDefaultBrowser(I)Ljava/lang/String;
 PLcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl;->getDefaultDialer(I)Ljava/lang/String;
 HSPLcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl;->getDefaultHome(I)Ljava/lang/String;
@@ -30010,6 +32513,7 @@
 HSPLcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl;->wereDefaultPermissionsGrantedSinceBoot(I)Z
 HSPLcom/android/server/pm/permission/PermissionManagerService;-><clinit>()V
 HSPLcom/android/server/pm/permission/PermissionManagerService;-><init>(Landroid/content/Context;Ljava/lang/Object;)V
+HSPLcom/android/server/pm/permission/PermissionManagerService;-><init>(Landroid/content/Context;Ljava/lang/Object;Lcom/android/server/pm/permission/PermissionManagerService$Injector;)V
 PLcom/android/server/pm/permission/PermissionManagerService;->access$000(Lcom/android/server/pm/permission/PermissionManagerService;)Landroid/os/Handler;
 HSPLcom/android/server/pm/permission/PermissionManagerService;->access$100(Lcom/android/server/pm/permission/PermissionManagerService;)Lcom/android/server/pm/permission/PermissionManagerService$OnPermissionChangeListeners;
 HSPLcom/android/server/pm/permission/PermissionManagerService;->access$1000(Lcom/android/server/pm/permission/PermissionManagerService;Landroid/content/pm/parsing/AndroidPackage;Z)V
@@ -30036,6 +32540,7 @@
 HSPLcom/android/server/pm/permission/PermissionManagerService;->access$2500(Lcom/android/server/pm/permission/PermissionManagerService;Landroid/permission/PermissionManagerInternal$OnRuntimePermissionStateChangedListener;)V
 PLcom/android/server/pm/permission/PermissionManagerService;->access$2500(Lcom/android/server/pm/permission/PermissionManagerService;Ljava/lang/String;Landroid/os/UserHandle;)V
 HSPLcom/android/server/pm/permission/PermissionManagerService;->access$2600(Lcom/android/server/pm/permission/PermissionManagerService;Landroid/permission/PermissionManagerInternal$OnRuntimePermissionStateChangedListener;)V
+PLcom/android/server/pm/permission/PermissionManagerService;->access$2800(Lcom/android/server/pm/permission/PermissionManagerService;)Landroid/permission/PermissionManagerInternal$CheckPermissionDelegate;
 PLcom/android/server/pm/permission/PermissionManagerService;->access$2800(Lcom/android/server/pm/permission/PermissionManagerService;)Lcom/android/server/pm/permission/PermissionManagerServiceInternal$DefaultBrowserProvider;
 PLcom/android/server/pm/permission/PermissionManagerService;->access$2802(Lcom/android/server/pm/permission/PermissionManagerService;Landroid/permission/PermissionManagerInternal$CheckPermissionDelegate;)Landroid/permission/PermissionManagerInternal$CheckPermissionDelegate;
 HSPLcom/android/server/pm/permission/PermissionManagerService;->access$2802(Lcom/android/server/pm/permission/PermissionManagerService;Lcom/android/server/pm/permission/PermissionManagerServiceInternal$DefaultBrowserProvider;)Lcom/android/server/pm/permission/PermissionManagerServiceInternal$DefaultBrowserProvider;
@@ -30072,9 +32577,11 @@
 HPLcom/android/server/pm/permission/PermissionManagerService;->addWhitelistedRestrictedPermission(Ljava/lang/String;Ljava/lang/String;II)Z
 HSPLcom/android/server/pm/permission/PermissionManagerService;->adjustPermissionProtectionFlagsLocked(ILjava/lang/String;I)I
 PLcom/android/server/pm/permission/PermissionManagerService;->backupRuntimePermissions(Landroid/os/UserHandle;)[B
+PLcom/android/server/pm/permission/PermissionManagerService;->buildInvalidCrossUserOrProfilePermissionMessage(Ljava/lang/String;ZZ)Ljava/lang/String;
 PLcom/android/server/pm/permission/PermissionManagerService;->buildInvalidCrossUserPermissionMessage(Ljava/lang/String;Z)Ljava/lang/String;
 HSPLcom/android/server/pm/permission/PermissionManagerService;->cacheBackgroundToForegoundPermissionMapping()V
 HPLcom/android/server/pm/permission/PermissionManagerService;->calculateCurrentPermissionFootprintLocked(Lcom/android/server/pm/permission/BasePermission;)I
+HPLcom/android/server/pm/permission/PermissionManagerService;->checkDeviceIdentifierAccess(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;II)I
 HPLcom/android/server/pm/permission/PermissionManagerService;->checkExistsAndEnforceCannotModifyImmutablyRestrictedPermission(Ljava/lang/String;)Z
 HSPLcom/android/server/pm/permission/PermissionManagerService;->checkIfLegacyStorageOpsNeedToBeUpdated(Landroid/content/pm/parsing/AndroidPackage;Z[I)[I
 HSPLcom/android/server/pm/permission/PermissionManagerService;->checkIfLegacyStorageOpsNeedToBeUpdated(Lcom/android/server/pm/parsing/pkg/AndroidPackage;Z[I)[I
@@ -30098,9 +32605,11 @@
 HPLcom/android/server/pm/permission/PermissionManagerService;->getAllPermissionGroups(I)Landroid/content/pm/ParceledListSlice;
 HPLcom/android/server/pm/permission/PermissionManagerService;->getAppOpPermissionPackages(Ljava/lang/String;)[Ljava/lang/String;
 HPLcom/android/server/pm/permission/PermissionManagerService;->getAppOpPermissionPackagesInternal(Ljava/lang/String;I)[Ljava/lang/String;
+PLcom/android/server/pm/permission/PermissionManagerService;->getAutoRevokeExemptionGrantedPackages(I)Ljava/util/List;
 HSPLcom/android/server/pm/permission/PermissionManagerService;->getBackgroundPermissions()Landroid/util/ArrayMap;
 PLcom/android/server/pm/permission/PermissionManagerService;->getDefaultBrowser(I)Ljava/lang/String;
 PLcom/android/server/pm/permission/PermissionManagerService;->getOneTimePermissionUserManager(I)Lcom/android/server/pm/permission/OneTimePermissionUserManager;
+PLcom/android/server/pm/permission/PermissionManagerService;->getPackagesWithAutoRevokePolicy(II)Ljava/util/List;
 HSPLcom/android/server/pm/permission/PermissionManagerService;->getPermission(Ljava/lang/String;)Lcom/android/server/pm/permission/BasePermission;
 HSPLcom/android/server/pm/permission/PermissionManagerService;->getPermissionFlags(Ljava/lang/String;Ljava/lang/String;I)I
 HSPLcom/android/server/pm/permission/PermissionManagerService;->getPermissionFlagsInternal(Ljava/lang/String;Ljava/lang/String;II)I
@@ -30132,7 +32641,7 @@
 HSPLcom/android/server/pm/permission/PermissionManagerService;->inheritPermissionStateToNewImplicitPermissionLocked(Landroid/util/ArraySet;Ljava/lang/String;Lcom/android/server/pm/permission/PermissionsState;Landroid/content/pm/parsing/AndroidPackage;I)V
 PLcom/android/server/pm/permission/PermissionManagerService;->inheritPermissionStateToNewImplicitPermissionLocked(Landroid/util/ArraySet;Ljava/lang/String;Lcom/android/server/pm/permission/PermissionsState;Lcom/android/server/pm/parsing/pkg/AndroidPackage;I)V
 HSPLcom/android/server/pm/permission/PermissionManagerService;->isNewPlatformPermissionForPackage(Ljava/lang/String;Landroid/content/pm/parsing/AndroidPackage;)Z
-PLcom/android/server/pm/permission/PermissionManagerService;->isNewPlatformPermissionForPackage(Ljava/lang/String;Lcom/android/server/pm/parsing/pkg/AndroidPackage;)Z
+HSPLcom/android/server/pm/permission/PermissionManagerService;->isNewPlatformPermissionForPackage(Ljava/lang/String;Lcom/android/server/pm/parsing/pkg/AndroidPackage;)Z
 HSPLcom/android/server/pm/permission/PermissionManagerService;->isPackageRequestingPermission(Landroid/content/pm/parsing/AndroidPackage;Ljava/lang/String;)Z
 HSPLcom/android/server/pm/permission/PermissionManagerService;->isPackageRequestingPermission(Lcom/android/server/pm/parsing/pkg/AndroidPackage;Ljava/lang/String;)Z
 HPLcom/android/server/pm/permission/PermissionManagerService;->isPermissionRevokedByPolicy(Ljava/lang/String;Ljava/lang/String;I)Z
@@ -30141,18 +32650,25 @@
 HPLcom/android/server/pm/permission/PermissionManagerService;->isSameProfileGroup(II)Z
 HPLcom/android/server/pm/permission/PermissionManagerService;->killUid(IILjava/lang/String;)V
 HSPLcom/android/server/pm/permission/PermissionManagerService;->lambda$NPd9St1HBvGAtg1uhMV2Upfww4g(Lcom/android/server/pm/permission/PermissionManagerService;Ljava/lang/String;I)V
+PLcom/android/server/pm/permission/PermissionManagerService;->lambda$eApyRxwI3JHTSVAxV9EbP43gFOo(Lcom/android/server/pm/permission/PermissionManagerService;Ljava/lang/String;I)I
+PLcom/android/server/pm/permission/PermissionManagerService;->lambda$getAutoRevokeExemptionGrantedPackages$11(Ljava/util/List;Lcom/android/server/pm/parsing/pkg/AndroidPackage;)V
+PLcom/android/server/pm/permission/PermissionManagerService;->lambda$getPackagesWithAutoRevokePolicy$10(ILjava/util/List;Lcom/android/server/pm/parsing/pkg/AndroidPackage;)V
 PLcom/android/server/pm/permission/PermissionManagerService;->lambda$grantDefaultPermissionsToActiveLuiApp$7$PermissionManagerService(Ljava/lang/String;I)V
 PLcom/android/server/pm/permission/PermissionManagerService;->lambda$grantDefaultPermissionsToEnabledCarrierApps$3$PermissionManagerService([Ljava/lang/String;I)V
 PLcom/android/server/pm/permission/PermissionManagerService;->lambda$grantDefaultPermissionsToEnabledImsServices$4$PermissionManagerService([Ljava/lang/String;I)V
 PLcom/android/server/pm/permission/PermissionManagerService;->lambda$grantDefaultPermissionsToEnabledTelephonyDataServices$5$PermissionManagerService([Ljava/lang/String;I)V
+PLcom/android/server/pm/permission/PermissionManagerService;->lambda$iwnRBDwjg4K5iRGbRU5_sVt0zaU(Lcom/android/server/pm/permission/PermissionManagerService;Ljava/lang/String;Ljava/lang/String;I)I
 PLcom/android/server/pm/permission/PermissionManagerService;->lambda$resetRuntimePermissionsInternal$2(II)V
 PLcom/android/server/pm/permission/PermissionManagerService;->lambda$restoreDelayedRuntimePermissions$9$PermissionManagerService(Landroid/os/UserHandle;Ljava/lang/Boolean;)V
 PLcom/android/server/pm/permission/PermissionManagerService;->lambda$revokeDefaultPermissionsFromDisabledTelephonyDataServices$6$PermissionManagerService([Ljava/lang/String;I)V
 PLcom/android/server/pm/permission/PermissionManagerService;->lambda$revokeDefaultPermissionsFromLuiApps$8$PermissionManagerService([Ljava/lang/String;I)V
 HPLcom/android/server/pm/permission/PermissionManagerService;->lambda$updatePermissionSourcePackage$11$PermissionManagerService(Lcom/android/server/pm/permission/BasePermission;ILcom/android/server/pm/permission/PermissionManagerServiceInternal$PermissionCallback;Landroid/content/pm/parsing/AndroidPackage;)V
 HPLcom/android/server/pm/permission/PermissionManagerService;->lambda$updatePermissionSourcePackage$11$PermissionManagerService(Lcom/android/server/pm/permission/BasePermission;ILcom/android/server/pm/permission/PermissionManagerServiceInternal$PermissionCallback;Lcom/android/server/pm/parsing/pkg/AndroidPackage;)V
+HPLcom/android/server/pm/permission/PermissionManagerService;->lambda$updatePermissionSourcePackage$12$PermissionManagerService(Lcom/android/server/pm/permission/BasePermission;ILcom/android/server/pm/permission/PermissionManagerServiceInternal$PermissionCallback;Lcom/android/server/pm/parsing/pkg/AndroidPackage;)V
 HSPLcom/android/server/pm/permission/PermissionManagerService;->lambda$updatePermissions$10$PermissionManagerService(Landroid/content/pm/parsing/AndroidPackage;ZLjava/lang/String;Ljava/lang/String;Lcom/android/server/pm/permission/PermissionManagerServiceInternal$PermissionCallback;Landroid/content/pm/parsing/AndroidPackage;)V
 HSPLcom/android/server/pm/permission/PermissionManagerService;->lambda$updatePermissions$10$PermissionManagerService(Lcom/android/server/pm/parsing/pkg/AndroidPackage;ZLjava/lang/String;Ljava/lang/String;Lcom/android/server/pm/permission/PermissionManagerServiceInternal$PermissionCallback;Lcom/android/server/pm/parsing/pkg/AndroidPackage;)V
+HPLcom/android/server/pm/permission/PermissionManagerService;->lambda$updatePermissions$11$PermissionManagerService(Lcom/android/server/pm/parsing/pkg/AndroidPackage;ZLjava/lang/String;Ljava/lang/String;Lcom/android/server/pm/permission/PermissionManagerServiceInternal$PermissionCallback;Lcom/android/server/pm/parsing/pkg/AndroidPackage;)V
+HSPLcom/android/server/pm/permission/PermissionManagerService;->lambda$updatePermissions$12$PermissionManagerService(Lcom/android/server/pm/parsing/pkg/AndroidPackage;ZLjava/lang/String;Ljava/lang/String;Lcom/android/server/pm/permission/PermissionManagerServiceInternal$PermissionCallback;Lcom/android/server/pm/parsing/pkg/AndroidPackage;)V
 HSPLcom/android/server/pm/permission/PermissionManagerService;->logPermission(ILjava/lang/String;Ljava/lang/String;)V
 HSPLcom/android/server/pm/permission/PermissionManagerService;->notifyRuntimePermissionStateChanged(Ljava/lang/String;I)V
 HPLcom/android/server/pm/permission/PermissionManagerService;->queryPermissionsByGroup(Ljava/lang/String;I)Landroid/content/pm/ParceledListSlice;
@@ -30407,6 +32923,9 @@
 PLcom/android/server/policy/PermissionPolicyService$1;->onPackageRemoved(Ljava/lang/String;I)V
 HSPLcom/android/server/policy/PermissionPolicyService$2;-><init>(Lcom/android/server/policy/PermissionPolicyService;)V
 HSPLcom/android/server/policy/PermissionPolicyService$2;->opChanged(IILjava/lang/String;)V
+PLcom/android/server/policy/PermissionPolicyService$3;-><init>(Lcom/android/server/policy/PermissionPolicyService;Landroid/content/pm/PackageManagerInternal;)V
+HPLcom/android/server/policy/PermissionPolicyService$3;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+HPLcom/android/server/policy/PermissionPolicyService$3;->updateUid(I)V
 HSPLcom/android/server/policy/PermissionPolicyService$Internal;-><init>(Lcom/android/server/policy/PermissionPolicyService;)V
 HSPLcom/android/server/policy/PermissionPolicyService$Internal;-><init>(Lcom/android/server/policy/PermissionPolicyService;Lcom/android/server/policy/PermissionPolicyService$1;)V
 HSPLcom/android/server/policy/PermissionPolicyService$Internal;->checkStartActivity(Landroid/content/Intent;ILjava/lang/String;)Z
@@ -30420,6 +32939,7 @@
 HSPLcom/android/server/policy/PermissionPolicyService$PermissionToOpSynchroniser;-><init>(Landroid/content/Context;)V
 HSPLcom/android/server/policy/PermissionPolicyService$PermissionToOpSynchroniser;-><init>(Lcom/android/server/policy/PermissionPolicyService;Landroid/content/Context;)V
 HSPLcom/android/server/policy/PermissionPolicyService$PermissionToOpSynchroniser;->access$400(Lcom/android/server/policy/PermissionPolicyService$PermissionToOpSynchroniser;)V
+HPLcom/android/server/policy/PermissionPolicyService$PermissionToOpSynchroniser;->access$500(Lcom/android/server/policy/PermissionPolicyService$PermissionToOpSynchroniser;)V
 HSPLcom/android/server/policy/PermissionPolicyService$PermissionToOpSynchroniser;->addAppOps(Landroid/content/pm/PackageInfo;Lcom/android/server/pm/parsing/pkg/AndroidPackage;Ljava/lang/String;)V
 HSPLcom/android/server/policy/PermissionPolicyService$PermissionToOpSynchroniser;->addAppOps(Landroid/content/pm/PackageInfo;Ljava/lang/String;)V
 HSPLcom/android/server/policy/PermissionPolicyService$PermissionToOpSynchroniser;->addExtraAppOp(Landroid/content/pm/PackageInfo;Landroid/content/pm/PermissionInfo;)V
@@ -30446,15 +32966,20 @@
 HSPLcom/android/server/policy/PermissionPolicyService;-><clinit>()V
 HSPLcom/android/server/policy/PermissionPolicyService;-><init>(Landroid/content/Context;)V
 HSPLcom/android/server/policy/PermissionPolicyService;->access$100(Lcom/android/server/policy/PermissionPolicyService;I)Z
+PLcom/android/server/policy/PermissionPolicyService;->access$1002(Lcom/android/server/policy/PermissionPolicyService;Lcom/android/server/policy/PermissionPolicyInternal$OnInitializedCallback;)Lcom/android/server/policy/PermissionPolicyInternal$OnInitializedCallback;
 PLcom/android/server/policy/PermissionPolicyService;->access$200(Lcom/android/server/policy/PermissionPolicyService;I)V
 PLcom/android/server/policy/PermissionPolicyService;->access$200(Lcom/android/server/policy/PermissionPolicyService;Ljava/lang/String;I)V
 HPLcom/android/server/policy/PermissionPolicyService;->access$300(Lcom/android/server/policy/PermissionPolicyService;I)V
 HSPLcom/android/server/policy/PermissionPolicyService;->access$300(Lcom/android/server/policy/PermissionPolicyService;Ljava/lang/String;I)V
+PLcom/android/server/policy/PermissionPolicyService;->access$400(Landroid/content/Context;Landroid/os/UserHandle;)Landroid/content/Context;
 HSPLcom/android/server/policy/PermissionPolicyService;->access$500(Ljava/lang/String;)I
 PLcom/android/server/policy/PermissionPolicyService;->access$600(Lcom/android/server/policy/PermissionPolicyService;)Lcom/android/internal/app/IAppOpsCallback;
+HPLcom/android/server/policy/PermissionPolicyService;->access$600(Ljava/lang/String;)I
+PLcom/android/server/policy/PermissionPolicyService;->access$700(Lcom/android/server/policy/PermissionPolicyService;)Lcom/android/internal/app/IAppOpsCallback;
 HSPLcom/android/server/policy/PermissionPolicyService;->access$700(Lcom/android/server/policy/PermissionPolicyService;)Ljava/lang/Object;
 HSPLcom/android/server/policy/PermissionPolicyService;->access$800(Lcom/android/server/policy/PermissionPolicyService;)Ljava/lang/Object;
 HSPLcom/android/server/policy/PermissionPolicyService;->access$802(Lcom/android/server/policy/PermissionPolicyService;Lcom/android/server/policy/PermissionPolicyInternal$OnInitializedCallback;)Lcom/android/server/policy/PermissionPolicyInternal$OnInitializedCallback;
+PLcom/android/server/policy/PermissionPolicyService;->access$900(Lcom/android/server/policy/PermissionPolicyService;)Ljava/lang/Object;
 HSPLcom/android/server/policy/PermissionPolicyService;->access$902(Lcom/android/server/policy/PermissionPolicyService;Lcom/android/server/policy/PermissionPolicyInternal$OnInitializedCallback;)Lcom/android/server/policy/PermissionPolicyInternal$OnInitializedCallback;
 HSPLcom/android/server/policy/PermissionPolicyService;->getSwitchOp(Ljava/lang/String;)I
 HSPLcom/android/server/policy/PermissionPolicyService;->getUserContext(Landroid/content/Context;Landroid/os/UserHandle;)Landroid/content/Context;
@@ -30755,6 +33280,23 @@
 HSPLcom/android/server/policy/WindowManagerPolicy;->getWindowLayerFromTypeLw(IZ)I
 HSPLcom/android/server/policy/WindowManagerPolicy;->getWindowLayerLw(Lcom/android/server/policy/WindowManagerPolicy$WindowState;)I
 HSPLcom/android/server/policy/WindowManagerPolicy;->userRotationModeToString(I)Ljava/lang/String;
+PLcom/android/server/policy/WindowOrientationListener$AccelSensorJudge;-><init>(Lcom/android/server/policy/WindowOrientationListener;Landroid/content/Context;)V
+PLcom/android/server/policy/WindowOrientationListener$AccelSensorJudge;->addTiltHistoryEntryLocked(JF)V
+PLcom/android/server/policy/WindowOrientationListener$AccelSensorJudge;->clearPredictedRotationLocked()V
+PLcom/android/server/policy/WindowOrientationListener$AccelSensorJudge;->clearTiltHistoryLocked()V
+PLcom/android/server/policy/WindowOrientationListener$AccelSensorJudge;->getProposedRotationLocked()I
+PLcom/android/server/policy/WindowOrientationListener$AccelSensorJudge;->isAcceleratingLocked(F)Z
+HPLcom/android/server/policy/WindowOrientationListener$AccelSensorJudge;->isFlatLocked(J)Z
+HPLcom/android/server/policy/WindowOrientationListener$AccelSensorJudge;->isOrientationAngleAcceptableLocked(II)Z
+HPLcom/android/server/policy/WindowOrientationListener$AccelSensorJudge;->isPredictedRotationAcceptableLocked(J)Z
+HPLcom/android/server/policy/WindowOrientationListener$AccelSensorJudge;->isSwingingLocked(JF)Z
+PLcom/android/server/policy/WindowOrientationListener$AccelSensorJudge;->isTiltAngleAcceptableLocked(II)Z
+HPLcom/android/server/policy/WindowOrientationListener$AccelSensorJudge;->nextTiltHistoryIndexLocked(I)I
+HPLcom/android/server/policy/WindowOrientationListener$AccelSensorJudge;->onSensorChanged(Landroid/hardware/SensorEvent;)V
+PLcom/android/server/policy/WindowOrientationListener$AccelSensorJudge;->onTouchEndLocked(J)V
+PLcom/android/server/policy/WindowOrientationListener$AccelSensorJudge;->onTouchStartLocked()V
+PLcom/android/server/policy/WindowOrientationListener$AccelSensorJudge;->resetLocked(Z)V
+PLcom/android/server/policy/WindowOrientationListener$AccelSensorJudge;->updatePredictedRotationLocked(JI)V
 HSPLcom/android/server/policy/WindowOrientationListener$OrientationJudge;-><init>(Lcom/android/server/policy/WindowOrientationListener;)V
 HSPLcom/android/server/policy/WindowOrientationListener$OrientationSensorJudge$1;-><init>(Lcom/android/server/policy/WindowOrientationListener$OrientationSensorJudge;)V
 HPLcom/android/server/policy/WindowOrientationListener$OrientationSensorJudge$1;->run()V
@@ -30776,6 +33318,7 @@
 HSPLcom/android/server/policy/WindowOrientationListener;-><init>(Landroid/content/Context;Landroid/os/Handler;I)V
 PLcom/android/server/policy/WindowOrientationListener;->access$000(Lcom/android/server/policy/WindowOrientationListener;)Ljava/lang/Object;
 PLcom/android/server/policy/WindowOrientationListener;->access$100()Z
+PLcom/android/server/policy/WindowOrientationListener;->access$200(Lcom/android/server/policy/WindowOrientationListener;)I
 PLcom/android/server/policy/WindowOrientationListener;->access$300(Lcom/android/server/policy/WindowOrientationListener;)Landroid/os/Handler;
 HSPLcom/android/server/policy/WindowOrientationListener;->canDetectOrientation()Z
 HPLcom/android/server/policy/WindowOrientationListener;->disable()V
@@ -30891,11 +33434,14 @@
 HSPLcom/android/server/power/-$$Lambda$ThermalManagerService$ZPQKzo9ZjU-hL4QYH693hWuTqjk;->run()V
 HSPLcom/android/server/power/-$$Lambda$ThermalManagerService$x5obtNvJKZxnpguOiQsFBDmBZ4k;-><init>(Landroid/os/IThermalEventListener;Landroid/os/Temperature;)V
 HSPLcom/android/server/power/-$$Lambda$ThermalManagerService$x5obtNvJKZxnpguOiQsFBDmBZ4k;->run()V
+HSPLcom/android/server/power/-$$Lambda$mJs78oyYBMDErllGe4sx87OZns8;-><clinit>()V
+HSPLcom/android/server/power/-$$Lambda$mJs78oyYBMDErllGe4sx87OZns8;-><init>()V
+HPLcom/android/server/power/-$$Lambda$mJs78oyYBMDErllGe4sx87OZns8;->uptimeMillis()J
 HSPLcom/android/server/power/AmbientDisplaySuppressionController;-><init>(Landroid/content/Context;)V
 PLcom/android/server/power/AmbientDisplaySuppressionController;->dump(Ljava/io/PrintWriter;)V
 PLcom/android/server/power/AmbientDisplaySuppressionController;->getStatusBar()Lcom/android/internal/statusbar/IStatusBarService;
 PLcom/android/server/power/AmbientDisplaySuppressionController;->isSuppressed()Z
-PLcom/android/server/power/AmbientDisplaySuppressionController;->suppress(Ljava/lang/String;IZ)V
+HPLcom/android/server/power/AmbientDisplaySuppressionController;->suppress(Ljava/lang/String;IZ)V
 HSPLcom/android/server/power/AttentionDetector$1;-><init>(Lcom/android/server/power/AttentionDetector;Landroid/os/Handler;Landroid/content/Context;)V
 PLcom/android/server/power/AttentionDetector$1;->onChange(Z)V
 PLcom/android/server/power/AttentionDetector$AttentionCallbackInternalImpl;-><init>(Lcom/android/server/power/AttentionDetector;I)V
@@ -31014,6 +33560,7 @@
 HSPLcom/android/server/power/PowerManagerService$BinderService;->setDozeAfterScreenOff(Z)V
 HPLcom/android/server/power/PowerManagerService$BinderService;->setDynamicPowerSaveHint(ZI)Z
 PLcom/android/server/power/PowerManagerService$BinderService;->setPowerSaveModeEnabled(Z)Z
+PLcom/android/server/power/PowerManagerService$BinderService;->setStayOnSetting(I)V
 PLcom/android/server/power/PowerManagerService$BinderService;->shutdown(ZLjava/lang/String;Z)V
 HPLcom/android/server/power/PowerManagerService$BinderService;->suppressAmbientDisplay(Ljava/lang/String;Z)V
 HSPLcom/android/server/power/PowerManagerService$BinderService;->updateWakeLockUids(Landroid/os/IBinder;[I)V
@@ -31042,6 +33589,9 @@
 HSPLcom/android/server/power/PowerManagerService$Injector;->createAmbientDisplaySuppressionController(Landroid/content/Context;)Lcom/android/server/power/AmbientDisplaySuppressionController;
 HSPLcom/android/server/power/PowerManagerService$Injector;->createBatterySaverController(Ljava/lang/Object;Landroid/content/Context;Lcom/android/server/power/batterysaver/BatterySaverPolicy;Lcom/android/server/power/batterysaver/BatterySavingStats;)Lcom/android/server/power/batterysaver/BatterySaverController;
 HSPLcom/android/server/power/PowerManagerService$Injector;->createBatterySaverPolicy(Ljava/lang/Object;Landroid/content/Context;Lcom/android/server/power/batterysaver/BatterySavingStats;)Lcom/android/server/power/batterysaver/BatterySaverPolicy;
+HSPLcom/android/server/power/PowerManagerService$Injector;->createBatterySaverStateMachine(Ljava/lang/Object;Landroid/content/Context;Lcom/android/server/power/batterysaver/BatterySaverController;)Lcom/android/server/power/batterysaver/BatterySaverStateMachine;
+HSPLcom/android/server/power/PowerManagerService$Injector;->createClock()Lcom/android/server/power/PowerManagerService$Clock;
+HSPLcom/android/server/power/PowerManagerService$Injector;->createHandler(Landroid/os/Looper;Landroid/os/Handler$Callback;)Landroid/os/Handler;
 HSPLcom/android/server/power/PowerManagerService$Injector;->createInattentiveSleepWarningController()Lcom/android/server/power/InattentiveSleepWarningController;
 HSPLcom/android/server/power/PowerManagerService$Injector;->createNativeWrapper()Lcom/android/server/power/PowerManagerService$NativeWrapper;
 HSPLcom/android/server/power/PowerManagerService$Injector;->createNotifier(Landroid/os/Looper;Landroid/content/Context;Lcom/android/internal/app/IBatteryStats;Lcom/android/server/power/SuspendBlocker;Lcom/android/server/policy/WindowManagerPolicy;)Lcom/android/server/power/Notifier;
@@ -31060,6 +33610,7 @@
 HPLcom/android/server/power/PowerManagerService$LocalService;->setDozeOverrideFromDreamManager(II)V
 HPLcom/android/server/power/PowerManagerService$LocalService;->setLightDeviceIdleMode(Z)Z
 HSPLcom/android/server/power/PowerManagerService$LocalService;->setMaximumScreenOffTimeoutFromDeviceAdmin(IJ)V
+HPLcom/android/server/power/PowerManagerService$LocalService;->setScreenBrightnessOverrideFromWindowManager(F)V
 HSPLcom/android/server/power/PowerManagerService$LocalService;->setScreenBrightnessOverrideFromWindowManager(I)V
 HSPLcom/android/server/power/PowerManagerService$LocalService;->setUserActivityTimeoutOverrideFromWindowManager(J)V
 HSPLcom/android/server/power/PowerManagerService$LocalService;->uidActive(I)V
@@ -31074,8 +33625,13 @@
 HSPLcom/android/server/power/PowerManagerService$NativeWrapper;->nativeSetAutoSuspend(Z)V
 HSPLcom/android/server/power/PowerManagerService$NativeWrapper;->nativeSetFeature(II)V
 HSPLcom/android/server/power/PowerManagerService$NativeWrapper;->nativeSetInteractive(Z)V
+PLcom/android/server/power/PowerManagerService$NativeWrapper;->nativeSetPowerMode(IZ)V
+PLcom/android/server/power/PowerManagerService$NativeWrapper;->nativeSetPowerMode(IZ)Z
 HSPLcom/android/server/power/PowerManagerService$PowerManagerHandler;-><init>(Lcom/android/server/power/PowerManagerService;Landroid/os/Looper;)V
 HSPLcom/android/server/power/PowerManagerService$PowerManagerHandler;->handleMessage(Landroid/os/Message;)V
+HSPLcom/android/server/power/PowerManagerService$PowerManagerHandlerCallback;-><init>(Lcom/android/server/power/PowerManagerService;)V
+HSPLcom/android/server/power/PowerManagerService$PowerManagerHandlerCallback;-><init>(Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService$1;)V
+HPLcom/android/server/power/PowerManagerService$PowerManagerHandlerCallback;->handleMessage(Landroid/os/Message;)Z
 HSPLcom/android/server/power/PowerManagerService$SettingsObserver;-><init>(Lcom/android/server/power/PowerManagerService;Landroid/os/Handler;)V
 PLcom/android/server/power/PowerManagerService$SettingsObserver;->onChange(ZLandroid/net/Uri;)V
 HSPLcom/android/server/power/PowerManagerService$SuspendBlockerImpl;-><init>(Lcom/android/server/power/PowerManagerService;Ljava/lang/String;)V
@@ -31100,71 +33656,116 @@
 HSPLcom/android/server/power/PowerManagerService;->access$000(Lcom/android/server/power/PowerManagerService;)Ljava/lang/Object;
 HSPLcom/android/server/power/PowerManagerService;->access$1000(II)V
 PLcom/android/server/power/PowerManagerService;->access$102(Lcom/android/server/power/PowerManagerService;I)I
+PLcom/android/server/power/PowerManagerService;->access$1100(IZ)V
 HSPLcom/android/server/power/PowerManagerService;->access$1200(II)V
+PLcom/android/server/power/PowerManagerService;->access$1200(IZ)V
+PLcom/android/server/power/PowerManagerService;->access$1200(IZ)Z
 HSPLcom/android/server/power/PowerManagerService;->access$1200(Lcom/android/server/power/PowerManagerService;)Ljava/util/ArrayList;
+HSPLcom/android/server/power/PowerManagerService;->access$1300(II)V
 HSPLcom/android/server/power/PowerManagerService;->access$1400(Lcom/android/server/power/PowerManagerService;)Ljava/util/ArrayList;
+HSPLcom/android/server/power/PowerManagerService;->access$1500(Lcom/android/server/power/PowerManagerService;)Ljava/util/ArrayList;
 HSPLcom/android/server/power/PowerManagerService;->access$1676(Lcom/android/server/power/PowerManagerService;I)I
 HSPLcom/android/server/power/PowerManagerService;->access$1700(Lcom/android/server/power/PowerManagerService;)V
 PLcom/android/server/power/PowerManagerService;->access$1802(Lcom/android/server/power/PowerManagerService;Z)Z
 PLcom/android/server/power/PowerManagerService;->access$1876(Lcom/android/server/power/PowerManagerService;I)I
 PLcom/android/server/power/PowerManagerService;->access$1900(Lcom/android/server/power/PowerManagerService;)V
 PLcom/android/server/power/PowerManagerService;->access$1900(Lcom/android/server/power/PowerManagerService;JIII)Z
+PLcom/android/server/power/PowerManagerService;->access$200(Lcom/android/server/power/PowerManagerService;)Lcom/android/server/power/PowerManagerService$Clock;
 HSPLcom/android/server/power/PowerManagerService;->access$2000(Lcom/android/server/power/PowerManagerService;)Z
 PLcom/android/server/power/PowerManagerService;->access$202(Lcom/android/server/power/PowerManagerService;I)I
+PLcom/android/server/power/PowerManagerService;->access$2076(Lcom/android/server/power/PowerManagerService;I)I
+PLcom/android/server/power/PowerManagerService;->access$2100(Lcom/android/server/power/PowerManagerService;)V
 HSPLcom/android/server/power/PowerManagerService;->access$2200(Lcom/android/server/power/PowerManagerService;)Z
+PLcom/android/server/power/PowerManagerService;->access$2200(Lcom/android/server/power/PowerManagerService;IZ)V
+PLcom/android/server/power/PowerManagerService;->access$2300(Lcom/android/server/power/PowerManagerService;)Z
 HSPLcom/android/server/power/PowerManagerService;->access$2400(Lcom/android/server/power/PowerManagerService;)Lcom/android/server/power/SuspendBlocker;
 PLcom/android/server/power/PowerManagerService;->access$2400(Lcom/android/server/power/PowerManagerService;)Z
+PLcom/android/server/power/PowerManagerService;->access$2400(Lcom/android/server/power/PowerManagerService;IZ)V
+PLcom/android/server/power/PowerManagerService;->access$2400(Lcom/android/server/power/PowerManagerService;IZ)Z
 HSPLcom/android/server/power/PowerManagerService;->access$2500(Lcom/android/server/power/PowerManagerService;)V
+PLcom/android/server/power/PowerManagerService;->access$2500(Lcom/android/server/power/PowerManagerService;)Z
 PLcom/android/server/power/PowerManagerService;->access$2600(Lcom/android/server/power/PowerManagerService;)Lcom/android/server/power/SuspendBlocker;
 HPLcom/android/server/power/PowerManagerService;->access$2600(Lcom/android/server/power/PowerManagerService;)V
+PLcom/android/server/power/PowerManagerService;->access$2600(Lcom/android/server/power/PowerManagerService;Z)V
+PLcom/android/server/power/PowerManagerService;->access$2700(Lcom/android/server/power/PowerManagerService;)Lcom/android/server/power/SuspendBlocker;
 HSPLcom/android/server/power/PowerManagerService;->access$2700(Lcom/android/server/power/PowerManagerService;)V
+PLcom/android/server/power/PowerManagerService;->access$2700(Lcom/android/server/power/PowerManagerService;)Z
 PLcom/android/server/power/PowerManagerService;->access$2800(Lcom/android/server/power/PowerManagerService;)V
+PLcom/android/server/power/PowerManagerService;->access$2800(Lcom/android/server/power/PowerManagerService;Z)V
+PLcom/android/server/power/PowerManagerService;->access$2900(Lcom/android/server/power/PowerManagerService;)Lcom/android/server/power/SuspendBlocker;
 PLcom/android/server/power/PowerManagerService;->access$2900(Lcom/android/server/power/PowerManagerService;)V
 HSPLcom/android/server/power/PowerManagerService;->access$2900(Lcom/android/server/power/PowerManagerService;II)V
 PLcom/android/server/power/PowerManagerService;->access$300(Lcom/android/server/power/PowerManagerService;J)V
+PLcom/android/server/power/PowerManagerService;->access$3000(Lcom/android/server/power/PowerManagerService;)V
+PLcom/android/server/power/PowerManagerService;->access$302(Lcom/android/server/power/PowerManagerService;I)I
 PLcom/android/server/power/PowerManagerService;->access$3100(Lcom/android/server/power/PowerManagerService;)V
 PLcom/android/server/power/PowerManagerService;->access$3100(Lcom/android/server/power/PowerManagerService;II)V
 HSPLcom/android/server/power/PowerManagerService;->access$3200(Lcom/android/server/power/PowerManagerService;)V
-PLcom/android/server/power/PowerManagerService;->access$3300(Lcom/android/server/power/PowerManagerService;)V
+PLcom/android/server/power/PowerManagerService;->access$3200(Lcom/android/server/power/PowerManagerService;II)V
+HPLcom/android/server/power/PowerManagerService;->access$3300(Lcom/android/server/power/PowerManagerService;)V
 HPLcom/android/server/power/PowerManagerService;->access$3400(Lcom/android/server/power/PowerManagerService;)V
+PLcom/android/server/power/PowerManagerService;->access$3400(Lcom/android/server/power/PowerManagerService;II)V
 HSPLcom/android/server/power/PowerManagerService;->access$3500(Landroid/os/WorkSource;)Landroid/os/WorkSource;
+HPLcom/android/server/power/PowerManagerService;->access$3500(Lcom/android/server/power/PowerManagerService;)V
+PLcom/android/server/power/PowerManagerService;->access$3600(Lcom/android/server/power/PowerManagerService;)V
 PLcom/android/server/power/PowerManagerService;->access$3600(Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService$WakeLock;)V
 HPLcom/android/server/power/PowerManagerService;->access$3700(Landroid/os/WorkSource;)Landroid/os/WorkSource;
 HSPLcom/android/server/power/PowerManagerService;->access$3700(Lcom/android/server/power/PowerManagerService;)Lcom/android/server/power/PowerManagerService$NativeWrapper;
+HPLcom/android/server/power/PowerManagerService;->access$3700(Lcom/android/server/power/PowerManagerService;)V
+HPLcom/android/server/power/PowerManagerService;->access$3800(Landroid/os/WorkSource;)Landroid/os/WorkSource;
 PLcom/android/server/power/PowerManagerService;->access$3800(Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService$WakeLock;)V
 HSPLcom/android/server/power/PowerManagerService;->access$3900(Lcom/android/server/power/PowerManagerService;)Landroid/content/Context;
 HSPLcom/android/server/power/PowerManagerService;->access$3900(Lcom/android/server/power/PowerManagerService;)Lcom/android/server/power/PowerManagerService$NativeWrapper;
+PLcom/android/server/power/PowerManagerService;->access$3900(Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService$WakeLock;)V
 HSPLcom/android/server/power/PowerManagerService;->access$400(Lcom/android/server/power/PowerManagerService;)V
+PLcom/android/server/power/PowerManagerService;->access$400(Lcom/android/server/power/PowerManagerService;J)V
+HPLcom/android/server/power/PowerManagerService;->access$4000(Landroid/os/WorkSource;)Landroid/os/WorkSource;
+HSPLcom/android/server/power/PowerManagerService;->access$4000(Lcom/android/server/power/PowerManagerService;)Lcom/android/server/power/PowerManagerService$NativeWrapper;
 HSPLcom/android/server/power/PowerManagerService;->access$4000(Lcom/android/server/power/PowerManagerService;Landroid/os/IBinder;ILjava/lang/String;Ljava/lang/String;Landroid/os/WorkSource;Ljava/lang/String;II)V
 HPLcom/android/server/power/PowerManagerService;->access$4100(Lcom/android/server/power/PowerManagerService;)Landroid/content/Context;
 HSPLcom/android/server/power/PowerManagerService;->access$4100(Lcom/android/server/power/PowerManagerService;Landroid/os/IBinder;I)V
+PLcom/android/server/power/PowerManagerService;->access$4100(Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService$WakeLock;)V
+PLcom/android/server/power/PowerManagerService;->access$4200(Lcom/android/server/power/PowerManagerService;)Landroid/content/Context;
+HSPLcom/android/server/power/PowerManagerService;->access$4200(Lcom/android/server/power/PowerManagerService;)Lcom/android/server/power/PowerManagerService$NativeWrapper;
 HSPLcom/android/server/power/PowerManagerService;->access$4200(Lcom/android/server/power/PowerManagerService;Landroid/os/IBinder;Landroid/os/WorkSource;Ljava/lang/String;I)V
 HSPLcom/android/server/power/PowerManagerService;->access$4300(Lcom/android/server/power/PowerManagerService;I)Z
 PLcom/android/server/power/PowerManagerService;->access$4400(Lcom/android/server/power/PowerManagerService;)J
+PLcom/android/server/power/PowerManagerService;->access$4400(Lcom/android/server/power/PowerManagerService;)Landroid/content/Context;
 PLcom/android/server/power/PowerManagerService;->access$4400(Lcom/android/server/power/PowerManagerService;Landroid/os/IBinder;ILjava/lang/String;Ljava/lang/String;Landroid/os/WorkSource;Ljava/lang/String;II)V
 PLcom/android/server/power/PowerManagerService;->access$4402(Lcom/android/server/power/PowerManagerService;J)J
 HPLcom/android/server/power/PowerManagerService;->access$4500(Lcom/android/server/power/PowerManagerService;JIII)V
 PLcom/android/server/power/PowerManagerService;->access$4500(Lcom/android/server/power/PowerManagerService;Landroid/os/IBinder;I)V
 PLcom/android/server/power/PowerManagerService;->access$4600(Lcom/android/server/power/PowerManagerService;JILjava/lang/String;ILjava/lang/String;I)V
+PLcom/android/server/power/PowerManagerService;->access$4600(Lcom/android/server/power/PowerManagerService;Landroid/os/IBinder;ILjava/lang/String;Ljava/lang/String;Landroid/os/WorkSource;Ljava/lang/String;II)V
 PLcom/android/server/power/PowerManagerService;->access$4600(Lcom/android/server/power/PowerManagerService;Landroid/os/IBinder;Landroid/os/WorkSource;Ljava/lang/String;I)V
 PLcom/android/server/power/PowerManagerService;->access$4700(Lcom/android/server/power/PowerManagerService;I)Z
 PLcom/android/server/power/PowerManagerService;->access$4700(Lcom/android/server/power/PowerManagerService;JIII)V
+PLcom/android/server/power/PowerManagerService;->access$4700(Lcom/android/server/power/PowerManagerService;Landroid/os/IBinder;I)V
 PLcom/android/server/power/PowerManagerService;->access$4800(Lcom/android/server/power/PowerManagerService;JI)V
+PLcom/android/server/power/PowerManagerService;->access$4800(Lcom/android/server/power/PowerManagerService;Landroid/os/IBinder;Landroid/os/WorkSource;Ljava/lang/String;I)V
 HSPLcom/android/server/power/PowerManagerService;->access$4900(Lcom/android/server/power/PowerManagerService;)Z
+PLcom/android/server/power/PowerManagerService;->access$4900(Lcom/android/server/power/PowerManagerService;I)Z
 PLcom/android/server/power/PowerManagerService;->access$4900(Lcom/android/server/power/PowerManagerService;JIII)V
+HSPLcom/android/server/power/PowerManagerService;->access$500(Lcom/android/server/power/PowerManagerService;)V
 HSPLcom/android/server/power/PowerManagerService;->access$500(Ljava/lang/String;)V
 HSPLcom/android/server/power/PowerManagerService;->access$5000(Lcom/android/server/power/PowerManagerService;)Lcom/android/server/power/batterysaver/BatterySaverController;
 PLcom/android/server/power/PowerManagerService;->access$5000(Lcom/android/server/power/PowerManagerService;JILjava/lang/String;ILjava/lang/String;I)V
 HSPLcom/android/server/power/PowerManagerService;->access$5100(Lcom/android/server/power/PowerManagerService;)Lcom/android/server/power/batterysaver/BatterySaverPolicy;
 PLcom/android/server/power/PowerManagerService;->access$5100(Lcom/android/server/power/PowerManagerService;JIII)V
+PLcom/android/server/power/PowerManagerService;->access$5200(Lcom/android/server/power/PowerManagerService;JILjava/lang/String;ILjava/lang/String;I)V
 PLcom/android/server/power/PowerManagerService;->access$5200(Lcom/android/server/power/PowerManagerService;Z)Z
 PLcom/android/server/power/PowerManagerService;->access$5300(Lcom/android/server/power/PowerManagerService;)Lcom/android/server/power/batterysaver/BatterySaverStateMachine;
 PLcom/android/server/power/PowerManagerService;->access$5300(Lcom/android/server/power/PowerManagerService;)Z
+PLcom/android/server/power/PowerManagerService;->access$5300(Lcom/android/server/power/PowerManagerService;JIII)V
 HSPLcom/android/server/power/PowerManagerService;->access$5400(Lcom/android/server/power/PowerManagerService;)Lcom/android/server/power/batterysaver/BatterySaverController;
 HSPLcom/android/server/power/PowerManagerService;->access$5500(Lcom/android/server/power/PowerManagerService;)Lcom/android/server/power/batterysaver/BatterySaverPolicy;
+PLcom/android/server/power/PowerManagerService;->access$5500(Lcom/android/server/power/PowerManagerService;)Z
 PLcom/android/server/power/PowerManagerService;->access$5500(Lcom/android/server/power/PowerManagerService;IZLjava/lang/String;Z)V
+HSPLcom/android/server/power/PowerManagerService;->access$5600(Lcom/android/server/power/PowerManagerService;)Lcom/android/server/power/batterysaver/BatterySaverController;
+HSPLcom/android/server/power/PowerManagerService;->access$5700(Lcom/android/server/power/PowerManagerService;)Lcom/android/server/power/batterysaver/BatterySaverPolicy;
 HSPLcom/android/server/power/PowerManagerService;->access$5800(Lcom/android/server/power/PowerManagerService;Z)V
 PLcom/android/server/power/PowerManagerService;->access$5900(Lcom/android/server/power/PowerManagerService;)Landroid/hardware/display/AmbientDisplayConfiguration;
+PLcom/android/server/power/PowerManagerService;->access$5900(Lcom/android/server/power/PowerManagerService;IZLjava/lang/String;Z)V
 HSPLcom/android/server/power/PowerManagerService;->access$600(Ljava/lang/String;)V
 PLcom/android/server/power/PowerManagerService;->access$6000(Lcom/android/server/power/PowerManagerService;)Lcom/android/server/power/AmbientDisplaySuppressionController;
 PLcom/android/server/power/PowerManagerService;->access$6000(Lcom/android/server/power/PowerManagerService;Ljava/lang/String;I)Ljava/lang/String;
@@ -31173,8 +33774,12 @@
 PLcom/android/server/power/PowerManagerService;->access$6200(Lcom/android/server/power/PowerManagerService;Z)V
 PLcom/android/server/power/PowerManagerService;->access$6300(Lcom/android/server/power/PowerManagerService;)Landroid/hardware/display/AmbientDisplayConfiguration;
 PLcom/android/server/power/PowerManagerService;->access$6300(Lcom/android/server/power/PowerManagerService;Ljava/io/PrintWriter;)V
+PLcom/android/server/power/PowerManagerService;->access$6400(Lcom/android/server/power/PowerManagerService;)Lcom/android/server/power/AmbientDisplaySuppressionController;
 HSPLcom/android/server/power/PowerManagerService;->access$6400(Lcom/android/server/power/PowerManagerService;I)V
+PLcom/android/server/power/PowerManagerService;->access$6400(Lcom/android/server/power/PowerManagerService;Z)V
+PLcom/android/server/power/PowerManagerService;->access$6500(Lcom/android/server/power/PowerManagerService;)Landroid/hardware/display/AmbientDisplayConfiguration;
 PLcom/android/server/power/PowerManagerService;->access$6500(Lcom/android/server/power/PowerManagerService;II)V
+PLcom/android/server/power/PowerManagerService;->access$6600(Lcom/android/server/power/PowerManagerService;)Lcom/android/server/power/AmbientDisplaySuppressionController;
 HSPLcom/android/server/power/PowerManagerService;->access$6600(Lcom/android/server/power/PowerManagerService;I)V
 PLcom/android/server/power/PowerManagerService;->access$6600(Lcom/android/server/power/PowerManagerService;Ljava/io/FileDescriptor;)V
 HSPLcom/android/server/power/PowerManagerService;->access$6700(Lcom/android/server/power/PowerManagerService;J)V
@@ -31183,15 +33788,24 @@
 PLcom/android/server/power/PowerManagerService;->access$6900(Lcom/android/server/power/PowerManagerService;)Landroid/os/PowerManager$WakeData;
 HPLcom/android/server/power/PowerManagerService;->access$6900(Lcom/android/server/power/PowerManagerService;II)V
 HSPLcom/android/server/power/PowerManagerService;->access$6900(Lcom/android/server/power/PowerManagerService;J)V
+PLcom/android/server/power/PowerManagerService;->access$6900(Lcom/android/server/power/PowerManagerService;Ljava/io/PrintWriter;)V
+HPLcom/android/server/power/PowerManagerService;->access$700(Ljava/lang/String;)V
 HSPLcom/android/server/power/PowerManagerService;->access$700(Z)V
 PLcom/android/server/power/PowerManagerService;->access$7000(Lcom/android/server/power/PowerManagerService;I)V
 PLcom/android/server/power/PowerManagerService;->access$7100(Lcom/android/server/power/PowerManagerService;II)V
 HSPLcom/android/server/power/PowerManagerService;->access$7100(Lcom/android/server/power/PowerManagerService;J)V
+PLcom/android/server/power/PowerManagerService;->access$7100(Lcom/android/server/power/PowerManagerService;Ljava/io/PrintWriter;)V
+PLcom/android/server/power/PowerManagerService;->access$7200(Lcom/android/server/power/PowerManagerService;F)V
+PLcom/android/server/power/PowerManagerService;->access$7200(Lcom/android/server/power/PowerManagerService;I)V
 PLcom/android/server/power/PowerManagerService;->access$7300(Lcom/android/server/power/PowerManagerService;)Landroid/os/PowerManager$WakeData;
+PLcom/android/server/power/PowerManagerService;->access$7300(Lcom/android/server/power/PowerManagerService;II)V
 PLcom/android/server/power/PowerManagerService;->access$7300(Lcom/android/server/power/PowerManagerService;J)V
 PLcom/android/server/power/PowerManagerService;->access$7500(Lcom/android/server/power/PowerManagerService;)Landroid/os/PowerManager$WakeData;
+PLcom/android/server/power/PowerManagerService;->access$7500(Lcom/android/server/power/PowerManagerService;J)V
+PLcom/android/server/power/PowerManagerService;->access$7700(Lcom/android/server/power/PowerManagerService;)Landroid/os/PowerManager$WakeData;
 HSPLcom/android/server/power/PowerManagerService;->access$800(Z)V
 HSPLcom/android/server/power/PowerManagerService;->access$900(II)V
+HSPLcom/android/server/power/PowerManagerService;->access$900(Z)V
 HSPLcom/android/server/power/PowerManagerService;->acquireWakeLockInternal(Landroid/os/IBinder;ILjava/lang/String;Ljava/lang/String;Landroid/os/WorkSource;Ljava/lang/String;II)V
 HSPLcom/android/server/power/PowerManagerService;->adjustWakeLockSummaryLocked(I)I
 HSPLcom/android/server/power/PowerManagerService;->applyWakeLockFlagsOnAcquireLocked(Lcom/android/server/power/PowerManagerService$WakeLock;I)V
@@ -31234,6 +33848,7 @@
 HSPLcom/android/server/power/PowerManagerService;->isLightDeviceIdleModeInternal()Z
 HSPLcom/android/server/power/PowerManagerService;->isMaximumScreenOffTimeoutFromDeviceAdminEnforcedLocked()Z
 PLcom/android/server/power/PowerManagerService;->isScreenLock(Lcom/android/server/power/PowerManagerService$WakeLock;)Z
+PLcom/android/server/power/PowerManagerService;->isValidBrightness(F)Z
 HPLcom/android/server/power/PowerManagerService;->isValidBrightness(I)Z
 HSPLcom/android/server/power/PowerManagerService;->isWakeLockLevelSupportedInternal(I)Z
 PLcom/android/server/power/PowerManagerService;->lambda$FUW_os-Z9SregUE_DR9vDwaRuXo(Lcom/android/server/power/PowerManagerService;)V
@@ -31272,7 +33887,11 @@
 HPLcom/android/server/power/PowerManagerService;->setLightDeviceIdleModeInternal(Z)Z
 PLcom/android/server/power/PowerManagerService;->setLowPowerModeInternal(Z)Z
 HSPLcom/android/server/power/PowerManagerService;->setMaximumScreenOffTimeoutFromDeviceAdminInternal(IJ)V
+PLcom/android/server/power/PowerManagerService;->setPowerModeInternal(IZ)V
+PLcom/android/server/power/PowerManagerService;->setPowerModeInternal(IZ)Z
+HPLcom/android/server/power/PowerManagerService;->setScreenBrightnessOverrideFromWindowManagerInternal(F)V
 HSPLcom/android/server/power/PowerManagerService;->setScreenBrightnessOverrideFromWindowManagerInternal(I)V
+PLcom/android/server/power/PowerManagerService;->setStayOnSettingInternal(I)V
 HSPLcom/android/server/power/PowerManagerService;->setUserActivityTimeoutOverrideFromWindowManagerInternal(J)V
 HSPLcom/android/server/power/PowerManagerService;->setWakeLockDisabledStateLocked(Lcom/android/server/power/PowerManagerService$WakeLock;)Z
 HPLcom/android/server/power/PowerManagerService;->setWakefulnessLocked(IIJ)V
@@ -31360,6 +33979,11 @@
 HSPLcom/android/server/power/ThermalManagerService$TemperatureWatcher;-><init>(Lcom/android/server/power/ThermalManagerService;)V
 HSPLcom/android/server/power/ThermalManagerService$TemperatureWatcher;-><init>(Lcom/android/server/power/ThermalManagerService;Lcom/android/server/power/ThermalManagerService$1;)V
 HSPLcom/android/server/power/ThermalManagerService$TemperatureWatcher;->updateSevereThresholds()V
+PLcom/android/server/power/ThermalManagerService$ThermalHal10Wrapper;-><init>()V
+PLcom/android/server/power/ThermalManagerService$ThermalHal10Wrapper;->connectToHal()Z
+PLcom/android/server/power/ThermalManagerService$ThermalHal11Wrapper$1;-><init>(Lcom/android/server/power/ThermalManagerService$ThermalHal11Wrapper;)V
+PLcom/android/server/power/ThermalManagerService$ThermalHal11Wrapper;-><init>()V
+PLcom/android/server/power/ThermalManagerService$ThermalHal11Wrapper;->connectToHal()Z
 HSPLcom/android/server/power/ThermalManagerService$ThermalHal20Wrapper$1;-><init>(Lcom/android/server/power/ThermalManagerService$ThermalHal20Wrapper;)V
 PLcom/android/server/power/ThermalManagerService$ThermalHal20Wrapper$1;->notifyThrottling(Landroid/hardware/thermal/V2_0/Temperature;)V
 HSPLcom/android/server/power/ThermalManagerService$ThermalHal20Wrapper;-><init>()V
@@ -31531,6 +34155,7 @@
 HSPLcom/android/server/power/batterysaver/BatterySaverController;->getBatterySaverPolicy()Lcom/android/server/power/batterysaver/BatterySaverPolicy;
 HSPLcom/android/server/power/batterysaver/BatterySaverController;->getFullEnabledLocked()Z
 HSPLcom/android/server/power/batterysaver/BatterySaverController;->getPowerManager()Landroid/os/PowerManager;
+PLcom/android/server/power/batterysaver/BatterySaverController;->getPowerSaveModeChangedListenerPackage()Ljava/util/Optional;
 HPLcom/android/server/power/batterysaver/BatterySaverController;->handleBatterySaverStateChanged(ZI)V
 PLcom/android/server/power/batterysaver/BatterySaverController;->isAdaptiveEnabled()Z
 HSPLcom/android/server/power/batterysaver/BatterySaverController;->isEnabled()Z
@@ -31799,9 +34424,9 @@
 PLcom/android/server/print/RemotePrintService$RemotePrintServiceClient;->onPrintersAdded(Landroid/content/pm/ParceledListSlice;)V
 PLcom/android/server/print/RemotePrintService$RemotePrintServiceClient;->onPrintersRemoved(Landroid/content/pm/ParceledListSlice;)V
 PLcom/android/server/print/RemotePrintService$RemotePrintServiceClient;->setPrintJobState(Landroid/print/PrintJobId;ILjava/lang/String;)Z
-PLcom/android/server/print/RemotePrintService$RemotePrintServiceClient;->throwIfPrinterIdTampered(Landroid/content/ComponentName;Landroid/print/PrinterId;)V
-PLcom/android/server/print/RemotePrintService$RemotePrintServiceClient;->throwIfPrinterIdsForPrinterInfoTampered(Landroid/content/ComponentName;Ljava/util/List;)V
-PLcom/android/server/print/RemotePrintService$RemotePrintServiceClient;->throwIfPrinterIdsTampered(Landroid/content/ComponentName;Ljava/util/List;)V
+HPLcom/android/server/print/RemotePrintService$RemotePrintServiceClient;->throwIfPrinterIdTampered(Landroid/content/ComponentName;Landroid/print/PrinterId;)V
+HPLcom/android/server/print/RemotePrintService$RemotePrintServiceClient;->throwIfPrinterIdsForPrinterInfoTampered(Landroid/content/ComponentName;Ljava/util/List;)V
+HPLcom/android/server/print/RemotePrintService$RemotePrintServiceClient;->throwIfPrinterIdsTampered(Landroid/content/ComponentName;Ljava/util/List;)V
 PLcom/android/server/print/RemotePrintService$RemotePrintServiceClient;->writePrintJobData(Landroid/os/ParcelFileDescriptor;Landroid/print/PrintJobId;)V
 PLcom/android/server/print/RemotePrintService$RemoteServiceConneciton;-><init>(Lcom/android/server/print/RemotePrintService;)V
 PLcom/android/server/print/RemotePrintService$RemoteServiceConneciton;-><init>(Lcom/android/server/print/RemotePrintService;Lcom/android/server/print/RemotePrintService$1;)V
@@ -31973,8 +34598,8 @@
 PLcom/android/server/print/UserState$PrinterDiscoverySessionMediator;->lambda$_XymASnzhemmGwK4Nu5RUIT0ahk(Lcom/android/server/print/UserState$PrinterDiscoverySessionMediator;Lcom/android/server/print/RemotePrintService;Landroid/print/PrinterId;)V
 PLcom/android/server/print/UserState$PrinterDiscoverySessionMediator;->lambda$iQrjLK8luujjjp1uW3VGCsAZK_g(Lcom/android/server/print/UserState$PrinterDiscoverySessionMediator;Lcom/android/server/print/RemotePrintService;Landroid/print/PrinterId;)V
 PLcom/android/server/print/UserState$PrinterDiscoverySessionMediator;->lambda$lfSsgTy_1NLRRkjOH_yL2Tk_x2w(Lcom/android/server/print/UserState$PrinterDiscoverySessionMediator;Ljava/util/List;)V
-PLcom/android/server/print/UserState$PrinterDiscoverySessionMediator;->onPrintersAddedLocked(Ljava/util/List;)V
-PLcom/android/server/print/UserState$PrinterDiscoverySessionMediator;->onPrintersRemovedLocked(Ljava/util/List;)V
+HPLcom/android/server/print/UserState$PrinterDiscoverySessionMediator;->onPrintersAddedLocked(Ljava/util/List;)V
+HPLcom/android/server/print/UserState$PrinterDiscoverySessionMediator;->onPrintersRemovedLocked(Ljava/util/List;)V
 PLcom/android/server/print/UserState$PrinterDiscoverySessionMediator;->removeObserverLocked(Landroid/print/IPrinterDiscoveryObserver;)V
 PLcom/android/server/print/UserState$PrinterDiscoverySessionMediator;->startPrinterDiscoveryLocked(Landroid/print/IPrinterDiscoveryObserver;Ljava/util/List;)V
 PLcom/android/server/print/UserState$PrinterDiscoverySessionMediator;->startPrinterStateTrackingLocked(Landroid/print/PrinterId;)V
@@ -32204,6 +34829,7 @@
 HPLcom/android/server/role/RoleUserState;->writeFile()V
 PLcom/android/server/rollback/-$$Lambda$Rollback$EvT1BaUrjWsJaVTizSu77MCfRBs;-><init>(Lcom/android/server/rollback/Rollback;Landroid/content/Context;Landroid/content/IntentSender;Ljava/util/List;)V
 PLcom/android/server/rollback/-$$Lambda$Rollback$EvT1BaUrjWsJaVTizSu77MCfRBs;->accept(Ljava/lang/Object;)V
+PLcom/android/server/rollback/-$$Lambda$RollbackManagerServiceImpl$0HibeeAepjXymkK7UmEMFrp6FJs;-><init>(Lcom/android/server/rollback/RollbackManagerServiceImpl;)V
 PLcom/android/server/rollback/-$$Lambda$RollbackManagerServiceImpl$1$QPIiLceItKZOKeHshAhrcNkM3m8;-><init>(Lcom/android/server/rollback/RollbackManagerServiceImpl$1;ILjava/io/File;II)V
 PLcom/android/server/rollback/-$$Lambda$RollbackManagerServiceImpl$1$QPIiLceItKZOKeHshAhrcNkM3m8;->run()V
 PLcom/android/server/rollback/-$$Lambda$RollbackManagerServiceImpl$1$whIhaWpnqJBe6ocQeiVgI5ygyCA;-><init>(Lcom/android/server/rollback/RollbackManagerServiceImpl$1;II)V
@@ -32212,6 +34838,8 @@
 PLcom/android/server/rollback/-$$Lambda$RollbackManagerServiceImpl$58BbNzpzWX_z-GzhKXpdGPwKcIU;->run()V
 PLcom/android/server/rollback/-$$Lambda$RollbackManagerServiceImpl$5VimxC3UlEV_IzyoBdYlrATzYd8;-><init>(Lcom/android/server/rollback/RollbackManagerServiceImpl;)V
 PLcom/android/server/rollback/-$$Lambda$RollbackManagerServiceImpl$5VimxC3UlEV_IzyoBdYlrATzYd8;->run()V
+PLcom/android/server/rollback/-$$Lambda$RollbackManagerServiceImpl$8P8gySPy0dcZ7pWpZaoseQ0VuIo;-><init>(Lcom/android/server/rollback/RollbackManagerServiceImpl;Ljava/lang/String;[IILjava/lang/String;I)V
+PLcom/android/server/rollback/-$$Lambda$RollbackManagerServiceImpl$8P8gySPy0dcZ7pWpZaoseQ0VuIo;->run()V
 PLcom/android/server/rollback/-$$Lambda$RollbackManagerServiceImpl$9jRyv0ATJ7l2lc6xAd3tmkVmx7g;-><init>(Lcom/android/server/rollback/RollbackManagerServiceImpl;)V
 PLcom/android/server/rollback/-$$Lambda$RollbackManagerServiceImpl$9jRyv0ATJ7l2lc6xAd3tmkVmx7g;->run()V
 PLcom/android/server/rollback/-$$Lambda$RollbackManagerServiceImpl$Be1hJgd8PbSLFX_uKif2yCGhtKo;-><init>(Lcom/android/server/rollback/RollbackManagerServiceImpl;ILjava/util/concurrent/CountDownLatch;)V
@@ -32358,6 +34986,7 @@
 PLcom/android/server/rollback/RollbackManagerServiceImpl;->completeEnableRollback(Lcom/android/server/rollback/RollbackManagerServiceImpl$NewRollback;)Lcom/android/server/rollback/Rollback;
 PLcom/android/server/rollback/RollbackManagerServiceImpl;->createNewRollbackLocked(Landroid/content/pm/PackageInstaller$SessionInfo;)Lcom/android/server/rollback/Rollback;
 PLcom/android/server/rollback/RollbackManagerServiceImpl;->createNewRollbackLocked(Landroid/content/pm/PackageInstaller$SessionInfo;)Lcom/android/server/rollback/RollbackManagerServiceImpl$NewRollback;
+PLcom/android/server/rollback/RollbackManagerServiceImpl;->destroyCeSnapshotsForExpiredRollbacks(I)V
 PLcom/android/server/rollback/RollbackManagerServiceImpl;->dump(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V
 PLcom/android/server/rollback/RollbackManagerServiceImpl;->enableRollback(I)Z
 PLcom/android/server/rollback/RollbackManagerServiceImpl;->enableRollback(ILjava/io/File;II)Z
@@ -32385,6 +35014,7 @@
 PLcom/android/server/rollback/RollbackManagerServiceImpl;->lambda$onBootCompleted$6$RollbackManagerServiceImpl()V
 PLcom/android/server/rollback/RollbackManagerServiceImpl;->lambda$onUnlockUser$4$RollbackManagerServiceImpl(ILjava/util/concurrent/CountDownLatch;)V
 PLcom/android/server/rollback/RollbackManagerServiceImpl;->lambda$scheduleExpiration$7$RollbackManagerServiceImpl()V
+PLcom/android/server/rollback/RollbackManagerServiceImpl;->lambda$snapshotAndRestoreUserData$7$RollbackManagerServiceImpl(Ljava/lang/String;[IILjava/lang/String;I)V
 PLcom/android/server/rollback/RollbackManagerServiceImpl;->lambda$snapshotAndRestoreUserData$8$RollbackManagerServiceImpl(Ljava/lang/String;[IILjava/lang/String;I)V
 PLcom/android/server/rollback/RollbackManagerServiceImpl;->makeRollbackAvailable(Lcom/android/server/rollback/Rollback;)V
 PLcom/android/server/rollback/RollbackManagerServiceImpl;->notifyStagedApkSession(II)V
@@ -32481,7 +35111,7 @@
 PLcom/android/server/search/SearchManagerService;->getGlobalSearchActivity()Landroid/content/ComponentName;
 PLcom/android/server/search/SearchManagerService;->getSearchableInfo(Landroid/content/ComponentName;)Landroid/app/SearchableInfo;
 PLcom/android/server/search/SearchManagerService;->getSearchables(I)Lcom/android/server/search/Searchables;
-PLcom/android/server/search/SearchManagerService;->getSearchables(IZ)Lcom/android/server/search/Searchables;
+HPLcom/android/server/search/SearchManagerService;->getSearchables(IZ)Lcom/android/server/search/Searchables;
 PLcom/android/server/search/SearchManagerService;->getSearchablesInGlobalSearch()Ljava/util/List;
 PLcom/android/server/search/SearchManagerService;->getWebSearchActivity()Landroid/content/ComponentName;
 PLcom/android/server/search/SearchManagerService;->onCleanupUser(I)V
@@ -32508,10 +35138,13 @@
 HPLcom/android/server/search/Searchables;->updateSearchableList()V
 HSPLcom/android/server/security/FileIntegrityService$1;-><init>(Lcom/android/server/security/FileIntegrityService;)V
 HSPLcom/android/server/security/FileIntegrityService;-><init>(Landroid/content/Context;)V
+HSPLcom/android/server/security/FileIntegrityService;->collectCertificate([B)V
 HSPLcom/android/server/security/FileIntegrityService;->loadAllCertificates()V
 HSPLcom/android/server/security/FileIntegrityService;->loadCertificatesFromDirectory(Ljava/lang/String;)V
+HSPLcom/android/server/security/FileIntegrityService;->loadCertificatesFromDirectory(Ljava/nio/file/Path;)V
 HSPLcom/android/server/security/FileIntegrityService;->loadCertificatesFromKeystore(Landroid/security/KeyStore;)V
 HSPLcom/android/server/security/FileIntegrityService;->onStart()V
+HSPLcom/android/server/security/FileIntegrityService;->toCertificate([B)Ljava/security/cert/X509Certificate;
 HSPLcom/android/server/security/KeyAttestationApplicationIdProviderService;-><init>(Landroid/content/Context;)V
 HPLcom/android/server/security/KeyAttestationApplicationIdProviderService;->getKeyAttestationApplicationId(I)Landroid/security/keymaster/KeyAttestationApplicationId;
 HSPLcom/android/server/security/KeyChainSystemService$1;-><init>(Lcom/android/server/security/KeyChainSystemService;)V
@@ -32753,6 +35386,8 @@
 HPLcom/android/server/soundtrigger/SoundTriggerDbHelper;->getGenericSoundModel(Ljava/util/UUID;)Landroid/hardware/soundtrigger/SoundTrigger$GenericSoundModel;
 PLcom/android/server/soundtrigger/SoundTriggerDbHelper;->onUpgrade(Landroid/database/sqlite/SQLiteDatabase;II)V
 HPLcom/android/server/soundtrigger/SoundTriggerDbHelper;->updateGenericSoundModel(Landroid/hardware/soundtrigger/SoundTrigger$GenericSoundModel;)Z
+PLcom/android/server/soundtrigger/SoundTriggerHelper$1;-><init>(Lcom/android/server/soundtrigger/SoundTriggerHelper;Landroid/os/Looper;)V
+PLcom/android/server/soundtrigger/SoundTriggerHelper$1;->handleMessage(Landroid/os/Message;)V
 PLcom/android/server/soundtrigger/SoundTriggerHelper$ModelData;-><init>(Ljava/util/UUID;I)V
 PLcom/android/server/soundtrigger/SoundTriggerHelper$ModelData;->callbackToString()Ljava/lang/String;
 HPLcom/android/server/soundtrigger/SoundTriggerHelper$ModelData;->clearCallback()V
@@ -32790,8 +35425,10 @@
 HSPLcom/android/server/soundtrigger/SoundTriggerHelper;-><init>(Landroid/content/Context;)V
 PLcom/android/server/soundtrigger/SoundTriggerHelper;->access$000(Lcom/android/server/soundtrigger/SoundTriggerHelper;)Ljava/lang/Object;
 PLcom/android/server/soundtrigger/SoundTriggerHelper;->access$100(Lcom/android/server/soundtrigger/SoundTriggerHelper;Z)V
+PLcom/android/server/soundtrigger/SoundTriggerHelper;->access$200(Lcom/android/server/soundtrigger/SoundTriggerHelper;)Landroid/os/Handler;
 PLcom/android/server/soundtrigger/SoundTriggerHelper;->access$200(Lcom/android/server/soundtrigger/SoundTriggerHelper;)Landroid/os/PowerManager;
 PLcom/android/server/soundtrigger/SoundTriggerHelper;->access$300(Lcom/android/server/soundtrigger/SoundTriggerHelper;Z)V
+PLcom/android/server/soundtrigger/SoundTriggerHelper;->cleanUpExistingKeyphraseModelLocked(Lcom/android/server/soundtrigger/SoundTriggerHelper$ModelData;)I
 HPLcom/android/server/soundtrigger/SoundTriggerHelper;->computeRecognitionRequestedLocked()Z
 PLcom/android/server/soundtrigger/SoundTriggerHelper;->createKeyphraseModelDataLocked(Ljava/util/UUID;I)Lcom/android/server/soundtrigger/SoundTriggerHelper$ModelData;
 PLcom/android/server/soundtrigger/SoundTriggerHelper;->dump(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V
@@ -32818,6 +35455,7 @@
 PLcom/android/server/soundtrigger/SoundTriggerHelper;->onServiceDiedLocked()V
 PLcom/android/server/soundtrigger/SoundTriggerHelper;->onServiceStateChange(I)V
 PLcom/android/server/soundtrigger/SoundTriggerHelper;->onServiceStateChangedLocked(Z)V
+PLcom/android/server/soundtrigger/SoundTriggerHelper;->prepareForRecognition(Lcom/android/server/soundtrigger/SoundTriggerHelper$ModelData;)I
 PLcom/android/server/soundtrigger/SoundTriggerHelper;->removeKeyphraseModelLocked(I)V
 PLcom/android/server/soundtrigger/SoundTriggerHelper;->sendErrorCallbacksToAllLocked(I)V
 HPLcom/android/server/soundtrigger/SoundTriggerHelper;->startGenericRecognition(Ljava/util/UUID;Landroid/hardware/soundtrigger/SoundTrigger$GenericSoundModel;Landroid/hardware/soundtrigger/IRecognitionStatusCallback;Landroid/hardware/soundtrigger/SoundTrigger$RecognitionConfig;)I
@@ -32923,6 +35561,8 @@
 HSPLcom/android/server/soundtrigger/SoundTriggerService;->onStart()V
 HSPLcom/android/server/soundtrigger/SoundTriggerService;->onStartUser(I)V
 PLcom/android/server/soundtrigger/SoundTriggerService;->onSwitchUser(I)V
+PLcom/android/server/soundtrigger_middleware/-$$Lambda$ExternalCaptureStateTracker$Ygm9zjschDPyC1_diGoIJXbnmGc;-><init>(Lcom/android/server/soundtrigger_middleware/ExternalCaptureStateTracker;)V
+PLcom/android/server/soundtrigger_middleware/-$$Lambda$ExternalCaptureStateTracker$Ygm9zjschDPyC1_diGoIJXbnmGc;->run()V
 HPLcom/android/server/soundtrigger_middleware/-$$Lambda$SoundTriggerHw2Compat$-_QZ-VR2645z-GkbokL_T8I__48;-><init>(Ljava/util/concurrent/atomic/AtomicInteger;Ljava/util/concurrent/atomic/AtomicInteger;)V
 PLcom/android/server/soundtrigger_middleware/-$$Lambda$SoundTriggerHw2Compat$-_QZ-VR2645z-GkbokL_T8I__48;->onValues(II)V
 HSPLcom/android/server/soundtrigger_middleware/-$$Lambda$SoundTriggerHw2Compat$TgbC0Y00RFANX4qn5-S2zqA0RJU;-><init>(Ljava/util/concurrent/atomic/AtomicInteger;Ljava/util/concurrent/atomic/AtomicReference;)V
@@ -32934,6 +35574,8 @@
 HSPLcom/android/server/soundtrigger_middleware/-$$Lambda$SoundTriggerMiddlewareService$Lifecycle$-t8UndY0AHGyM6n9ce2y6qok3Ho;-><clinit>()V
 HSPLcom/android/server/soundtrigger_middleware/-$$Lambda$SoundTriggerMiddlewareService$Lifecycle$-t8UndY0AHGyM6n9ce2y6qok3Ho;-><init>()V
 HSPLcom/android/server/soundtrigger_middleware/-$$Lambda$SoundTriggerMiddlewareService$Lifecycle$-t8UndY0AHGyM6n9ce2y6qok3Ho;->create()Landroid/hardware/soundtrigger/V2_0/ISoundTriggerHw;
+PLcom/android/server/soundtrigger_middleware/-$$Lambda$SoundTriggerMiddlewareService$usinpPnoUy9JbhY8PKAGU1Qj0TE;-><init>(Lcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareService;)V
+PLcom/android/server/soundtrigger_middleware/-$$Lambda$SoundTriggerMiddlewareService$usinpPnoUy9JbhY8PKAGU1Qj0TE;->accept(Ljava/lang/Object;)V
 HSPLcom/android/server/soundtrigger_middleware/AudioSessionProviderImpl;-><init>()V
 PLcom/android/server/soundtrigger_middleware/ConversionUtil;->aidl2hidlPhrase(Landroid/media/soundtrigger_middleware/Phrase;)Landroid/hardware/soundtrigger/V2_0/ISoundTriggerHw$Phrase;
 HPLcom/android/server/soundtrigger_middleware/ConversionUtil;->aidl2hidlPhraseRecognitionExtra(Landroid/media/soundtrigger_middleware/PhraseRecognitionExtra;)Landroid/hardware/soundtrigger/V2_0/PhraseRecognitionExtra;
@@ -32957,6 +35599,10 @@
 HPLcom/android/server/soundtrigger_middleware/ConversionUtil;->hidl2aidlRecognitionStatus(I)I
 PLcom/android/server/soundtrigger_middleware/ConversionUtil;->hidl2aidlSoundModelType(I)I
 HSPLcom/android/server/soundtrigger_middleware/ConversionUtil;->hidl2aidlUuid(Landroid/hardware/audio/common/V2_0/Uuid;)Ljava/lang/String;
+PLcom/android/server/soundtrigger_middleware/ExternalCaptureStateTracker;-><init>(Ljava/util/function/Consumer;)V
+PLcom/android/server/soundtrigger_middleware/ExternalCaptureStateTracker;->lambda$Ygm9zjschDPyC1_diGoIJXbnmGc(Lcom/android/server/soundtrigger_middleware/ExternalCaptureStateTracker;)V
+PLcom/android/server/soundtrigger_middleware/ExternalCaptureStateTracker;->run()V
+HPLcom/android/server/soundtrigger_middleware/ExternalCaptureStateTracker;->setCaptureState(Z)V
 PLcom/android/server/soundtrigger_middleware/HalException;-><init>(ILjava/lang/String;)V
 HPLcom/android/server/soundtrigger_middleware/HalException;->toString()Ljava/lang/String;
 HSPLcom/android/server/soundtrigger_middleware/Hw2CompatUtil;->convertProperties_2_0_to_2_3(Landroid/hardware/soundtrigger/V2_0/ISoundTriggerHw$Properties;)Landroid/hardware/soundtrigger/V2_3/Properties;
@@ -32969,7 +35615,7 @@
 HPLcom/android/server/soundtrigger_middleware/SoundTriggerHw2Compat$SoundTriggerCallback;-><init>(Lcom/android/server/soundtrigger_middleware/ISoundTriggerHw2$Callback;)V
 HPLcom/android/server/soundtrigger_middleware/SoundTriggerHw2Compat$SoundTriggerCallback;-><init>(Lcom/android/server/soundtrigger_middleware/ISoundTriggerHw2$Callback;Lcom/android/server/soundtrigger_middleware/SoundTriggerHw2Compat$1;)V
 HPLcom/android/server/soundtrigger_middleware/SoundTriggerHw2Compat$SoundTriggerCallback;->phraseRecognitionCallback_2_1(Landroid/hardware/soundtrigger/V2_1/ISoundTriggerHwCallback$PhraseRecognitionEvent;I)V
-PLcom/android/server/soundtrigger_middleware/SoundTriggerHw2Compat$SoundTriggerCallback;->recognitionCallback_2_1(Landroid/hardware/soundtrigger/V2_1/ISoundTriggerHwCallback$RecognitionEvent;I)V
+HPLcom/android/server/soundtrigger_middleware/SoundTriggerHw2Compat$SoundTriggerCallback;->recognitionCallback_2_1(Landroid/hardware/soundtrigger/V2_1/ISoundTriggerHwCallback$RecognitionEvent;I)V
 HSPLcom/android/server/soundtrigger_middleware/SoundTriggerHw2Compat;-><init>(Landroid/hardware/soundtrigger/V2_0/ISoundTriggerHw;)V
 HSPLcom/android/server/soundtrigger_middleware/SoundTriggerHw2Compat;-><init>(Landroid/os/IHwBinder;)V
 HSPLcom/android/server/soundtrigger_middleware/SoundTriggerHw2Compat;->as2_0()Landroid/hardware/soundtrigger/V2_0/ISoundTriggerHw;
@@ -33010,19 +35656,22 @@
 HSPLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareImpl;-><init>([Lcom/android/server/soundtrigger_middleware/HalFactory;Lcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareImpl$AudioSessionProvider;)V
 PLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareImpl;->attach(ILandroid/media/soundtrigger_middleware/ISoundTriggerCallback;)Landroid/media/soundtrigger_middleware/ISoundTriggerModule;
 HSPLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareImpl;->listModules()[Landroid/media/soundtrigger_middleware/SoundTriggerModuleDescriptor;
+HPLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareImpl;->setCaptureState(Z)V
 HPLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareImpl;->setExternalCaptureState(Z)V
 PLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging$CallbackLogging;-><init>(Lcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging;Landroid/media/soundtrigger_middleware/ISoundTriggerCallback;)V
 PLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging$CallbackLogging;-><init>(Lcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging;Landroid/media/soundtrigger_middleware/ISoundTriggerCallback;Lcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging$1;)V
 PLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging$CallbackLogging;->asBinder()Landroid/os/IBinder;
-PLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging$CallbackLogging;->logVoidReturn(Ljava/lang/String;[Ljava/lang/Object;)V
+HPLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging$CallbackLogging;->logVoidReturn(Ljava/lang/String;[Ljava/lang/Object;)V
+PLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging$CallbackLogging;->onModuleDied()V
 HPLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging$CallbackLogging;->onPhraseRecognition(ILandroid/media/soundtrigger_middleware/PhraseRecognitionEvent;)V
-PLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging$CallbackLogging;->onRecognition(ILandroid/media/soundtrigger_middleware/RecognitionEvent;)V
+HPLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging$CallbackLogging;->onRecognition(ILandroid/media/soundtrigger_middleware/RecognitionEvent;)V
 PLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging$CallbackLogging;->onRecognitionAvailabilityChange(Z)V
 HPLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging$CallbackLogging;->toString()Ljava/lang/String;
 HPLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging$Event;-><init>(Ljava/lang/String;)V
 PLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging$Event;-><init>(Ljava/lang/String;Lcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging$1;)V
 PLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging$ModuleLogging;-><init>(Lcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging;Landroid/media/soundtrigger_middleware/ISoundTriggerModule;)V
 PLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging$ModuleLogging;-><init>(Lcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging;Landroid/media/soundtrigger_middleware/ISoundTriggerModule;Lcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging$1;)V
+PLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging$ModuleLogging;->detach()V
 PLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging$ModuleLogging;->forceRecognitionEvent(I)V
 PLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging$ModuleLogging;->loadModel(Landroid/media/soundtrigger_middleware/SoundModel;)I
 PLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging$ModuleLogging;->loadPhraseModel(Landroid/media/soundtrigger_middleware/PhraseSoundModel;)I
@@ -33035,22 +35684,24 @@
 PLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging$ModuleLogging;->unloadModel(I)V
 PLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging;-><clinit>()V
 PLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging;-><init>(Landroid/media/soundtrigger_middleware/ISoundTriggerMiddlewareService;)V
+PLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging;-><init>(Lcom/android/server/soundtrigger_middleware/ISoundTriggerMiddlewareInternal;)V
 PLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging;->access$200(Lcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging;Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Exception;[Ljava/lang/Object;)V
 HPLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging;->access$300(Lcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging;Ljava/lang/Object;Ljava/lang/String;[Ljava/lang/Object;)V
 PLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging;->access$400(Lcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging;Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Object;[Ljava/lang/Object;)V
 HPLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging;->appendMessage(Ljava/lang/String;)V
 PLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging;->attach(ILandroid/media/soundtrigger_middleware/ISoundTriggerCallback;)Landroid/media/soundtrigger_middleware/ISoundTriggerModule;
-PLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging;->dump(Ljava/io/PrintWriter;)V
+HPLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging;->dump(Ljava/io/PrintWriter;)V
 PLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging;->listModules()[Landroid/media/soundtrigger_middleware/SoundTriggerModuleDescriptor;
 PLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging;->logException(Ljava/lang/String;Ljava/lang/Exception;[Ljava/lang/Object;)V
 HPLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging;->logExceptionWithObject(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Exception;[Ljava/lang/Object;)V
 PLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging;->logReturn(Ljava/lang/String;Ljava/lang/Object;[Ljava/lang/Object;)V
 PLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging;->logReturnWithObject(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Object;[Ljava/lang/Object;)V
-PLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging;->logVoidReturn(Ljava/lang/String;[Ljava/lang/Object;)V
+HPLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging;->logVoidReturn(Ljava/lang/String;[Ljava/lang/Object;)V
 HPLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging;->logVoidReturnWithObject(Ljava/lang/Object;Ljava/lang/String;[Ljava/lang/Object;)V
 HPLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging;->printArgs([Ljava/lang/Object;)Ljava/lang/String;
 PLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging;->printObject(Ljava/lang/Object;)Ljava/lang/String;
 HPLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging;->printObject(Ljava/lang/StringBuilder;Ljava/lang/Object;)V
+HPLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging;->setCaptureState(Z)V
 HPLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging;->setExternalCaptureState(Z)V
 HPLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging;->toString()Ljava/lang/String;
 HSPLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareService$Lifecycle;-><init>(Landroid/content/Context;)V
@@ -33079,6 +35730,8 @@
 HSPLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareService;-><init>(Landroid/media/soundtrigger_middleware/ISoundTriggerMiddlewareService;Landroid/content/Context;)V
 HSPLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareService;-><init>(Landroid/media/soundtrigger_middleware/ISoundTriggerMiddlewareService;Landroid/content/Context;Lcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareService$1;)V
 PLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareService;-><init>(Landroid/media/soundtrigger_middleware/ISoundTriggerMiddlewareService;Lcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareService$1;)V
+PLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareService;-><init>(Lcom/android/server/soundtrigger_middleware/ISoundTriggerMiddlewareInternal;)V
+PLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareService;-><init>(Lcom/android/server/soundtrigger_middleware/ISoundTriggerMiddlewareInternal;Lcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareService$1;)V
 HPLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareService;->access$100(Lcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareService;)V
 PLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareService;->access$200(Ljava/lang/Exception;)Ljava/lang/RuntimeException;
 PLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareService;->attach(ILandroid/media/soundtrigger_middleware/ISoundTriggerCallback;)Landroid/media/soundtrigger_middleware/ISoundTriggerModule;
@@ -33087,6 +35740,7 @@
 PLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareService;->dump(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V
 HSPLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareService;->enforcePermission(Ljava/lang/String;)V
 HPLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareService;->handleException(Ljava/lang/Exception;)Ljava/lang/RuntimeException;
+HPLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareService;->lambda$new$0$SoundTriggerMiddlewareService(Ljava/lang/Boolean;)V
 HSPLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareService;->listModules()[Landroid/media/soundtrigger_middleware/SoundTriggerModuleDescriptor;
 HPLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareService;->setExternalCaptureState(Z)V
 PLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareValidation$ModelState$Activity;-><clinit>()V
@@ -33094,10 +35748,13 @@
 PLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareValidation$ModelState;-><init>()V
 PLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareValidation$ModuleService;-><init>(Lcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareValidation;ILandroid/media/soundtrigger_middleware/ISoundTriggerCallback;)V
 PLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareValidation$ModuleService;->attach(Landroid/media/soundtrigger_middleware/ISoundTriggerModule;)V
+PLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareValidation$ModuleService;->detach()V
+PLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareValidation$ModuleService;->detachInternal()V
 PLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareValidation$ModuleService;->dump(Ljava/io/PrintWriter;)V
-PLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareValidation$ModuleService;->forceRecognitionEvent(I)V
+HPLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareValidation$ModuleService;->forceRecognitionEvent(I)V
 PLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareValidation$ModuleService;->loadModel(Landroid/media/soundtrigger_middleware/SoundModel;)I
 PLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareValidation$ModuleService;->loadPhraseModel(Landroid/media/soundtrigger_middleware/PhraseSoundModel;)I
+PLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareValidation$ModuleService;->onModuleDied()V
 HPLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareValidation$ModuleService;->onPhraseRecognition(ILandroid/media/soundtrigger_middleware/PhraseRecognitionEvent;)V
 HPLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareValidation$ModuleService;->onRecognition(ILandroid/media/soundtrigger_middleware/RecognitionEvent;)V
 PLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareValidation$ModuleService;->onRecognitionAvailabilityChange(Z)V
@@ -33105,15 +35762,19 @@
 HPLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareValidation$ModuleService;->stopRecognition(I)V
 HPLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareValidation$ModuleService;->toString()Ljava/lang/String;
 PLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareValidation$ModuleService;->unloadModel(I)V
+PLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareValidation$ModuleState;-><clinit>()V
+PLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareValidation$ModuleState;-><init>(Ljava/lang/String;I)V
 PLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareValidation;-><init>(Landroid/media/soundtrigger_middleware/ISoundTriggerMiddlewareService;Landroid/content/Context;)V
+PLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareValidation;-><init>(Lcom/android/server/soundtrigger_middleware/ISoundTriggerMiddlewareInternal;Landroid/content/Context;)V
 PLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareValidation;->access$000(Lcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareValidation;)Ljava/util/Map;
 PLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareValidation;->attach(ILandroid/media/soundtrigger_middleware/ISoundTriggerCallback;)Landroid/media/soundtrigger_middleware/ISoundTriggerModule;
 HPLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareValidation;->checkPermissions()V
-PLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareValidation;->checkPreemptPermissions()V
+HPLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareValidation;->checkPreemptPermissions()V
 PLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareValidation;->dump(Ljava/io/PrintWriter;)V
 HPLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareValidation;->enforcePermission(Ljava/lang/String;)V
 PLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareValidation;->handleException(Ljava/lang/Exception;)Ljava/lang/RuntimeException;
 PLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareValidation;->listModules()[Landroid/media/soundtrigger_middleware/SoundTriggerModuleDescriptor;
+HPLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareValidation;->setCaptureState(Z)V
 HPLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareValidation;->setExternalCaptureState(Z)V
 HPLcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareValidation;->toString()Ljava/lang/String;
 PLcom/android/server/soundtrigger_middleware/SoundTriggerModule$ModelState;-><clinit>()V
@@ -33364,6 +36025,7 @@
 PLcom/android/server/stats/pull/-$$Lambda$StatsPullAtomService$M5tfOmnyD25Ws5xFmcaNZmCcWv4;->onPullAtom(ILjava/util/List;)I
 HSPLcom/android/server/stats/pull/-$$Lambda$StatsPullAtomService$Myxd926lI020RejJAC3J7xJBf-M;-><init>(Lcom/android/server/stats/pull/StatsPullAtomService;)V
 HPLcom/android/server/stats/pull/-$$Lambda$StatsPullAtomService$Myxd926lI020RejJAC3J7xJBf-M;->onPullAtom(ILjava/util/List;)I
+PLcom/android/server/stats/pull/-$$Lambda$StatsPullAtomService$N3NRt-eUatVUnaOb87ZVVmp10oA;-><init>(Lcom/android/server/stats/pull/StatsPullAtomService;)V
 HSPLcom/android/server/stats/pull/-$$Lambda$StatsPullAtomService$O-i_qJRna30dOvZwoceUXgRcdmM;-><init>(Lcom/android/server/stats/pull/StatsPullAtomService;)V
 PLcom/android/server/stats/pull/-$$Lambda$StatsPullAtomService$O-i_qJRna30dOvZwoceUXgRcdmM;->onPullAtom(ILjava/util/List;)I
 PLcom/android/server/stats/pull/-$$Lambda$StatsPullAtomService$ODMP0J94F-i0lScEZVqBmBZetGs;-><init>(Lcom/android/server/stats/pull/StatsPullAtomService;)V
@@ -33482,12 +36144,19 @@
 HSPLcom/android/server/stats/pull/StatsPullAtomService;-><clinit>()V
 HSPLcom/android/server/stats/pull/StatsPullAtomService;-><init>(Landroid/content/Context;)V
 PLcom/android/server/stats/pull/StatsPullAtomService;->access$000(Lcom/android/server/stats/pull/StatsPullAtomService;IILjava/util/List;)I
+PLcom/android/server/stats/pull/StatsPullAtomService;->access$000(Lcom/android/server/stats/pull/StatsPullAtomService;ILjava/util/List;Z)I
+PLcom/android/server/stats/pull/StatsPullAtomService;->access$100(Lcom/android/server/stats/pull/StatsPullAtomService;ILjava/util/List;Z)I
+PLcom/android/server/stats/pull/StatsPullAtomService;->access$200(Lcom/android/server/stats/pull/StatsPullAtomService;IILjava/util/List;)I
 HPLcom/android/server/stats/pull/StatsPullAtomService;->addNetworkStats(ILjava/util/List;Landroid/net/NetworkStats;Z)V
+HPLcom/android/server/stats/pull/StatsPullAtomService;->addNetworkStats(ILjava/util/List;Landroid/net/NetworkStats;ZI)V
 HPLcom/android/server/stats/pull/StatsPullAtomService;->awaitControllerInfo(Landroid/os/SynchronousResultReceiver;)Landroid/os/Parcelable;
+PLcom/android/server/stats/pull/StatsPullAtomService;->estimateAppOpsSize()I
 HPLcom/android/server/stats/pull/StatsPullAtomService;->fetchBluetoothData()Landroid/bluetooth/BluetoothActivityEnergyInfo;
 HPLcom/android/server/stats/pull/StatsPullAtomService;->getINetworkStatsService()Landroid/net/INetworkStatsService;
 HPLcom/android/server/stats/pull/StatsPullAtomService;->getIStoragedService()Landroid/os/IStoraged;
 HSPLcom/android/server/stats/pull/StatsPullAtomService;->getIThermalService()Landroid/os/IThermalService;
+HPLcom/android/server/stats/pull/StatsPullAtomService;->getNetworkStatsSession()Landroid/net/INetworkStatsSession;
+HPLcom/android/server/stats/pull/StatsPullAtomService;->getUidNetworkStatsSinceBoot(Landroid/net/NetworkTemplate;Z)Landroid/net/NetworkStats;
 HSPLcom/android/server/stats/pull/StatsPullAtomService;->initializePullersState()V
 HPLcom/android/server/stats/pull/StatsPullAtomService;->isAppUid(I)Z
 HSPLcom/android/server/stats/pull/StatsPullAtomService;->lambda$onBootPhase$0$StatsPullAtomService()V
@@ -33552,8 +36221,10 @@
 HSPLcom/android/server/stats/pull/StatsPullAtomService;->onStart()V
 HPLcom/android/server/stats/pull/StatsPullAtomService;->processHistoricalOp(Landroid/app/AppOpsManager$HistoricalOp;ILjava/util/List;ILjava/lang/String;Ljava/lang/String;)I
 HPLcom/android/server/stats/pull/StatsPullAtomService;->processHistoricalOps(Landroid/app/AppOpsManager$HistoricalOps;ILjava/util/List;)I
+HPLcom/android/server/stats/pull/StatsPullAtomService;->pullAppFeaturesOps(ILjava/util/List;)I
 HPLcom/android/server/stats/pull/StatsPullAtomService;->pullAppOps(ILjava/util/List;)I
 HPLcom/android/server/stats/pull/StatsPullAtomService;->pullAppsOnExternalStorageInfo(ILjava/util/List;)I
+HPLcom/android/server/stats/pull/StatsPullAtomService;->pullAttributedAppOps(ILjava/util/List;)I
 HPLcom/android/server/stats/pull/StatsPullAtomService;->pullBatteryLevel(ILjava/util/List;)I
 HPLcom/android/server/stats/pull/StatsPullAtomService;->pullBinderCallsStats(ILjava/util/List;)I
 HPLcom/android/server/stats/pull/StatsPullAtomService;->pullBluetoothActivityInfo(ILjava/util/List;)I
@@ -33576,6 +36247,7 @@
 HPLcom/android/server/stats/pull/StatsPullAtomService;->pullKernelWakelock(ILjava/util/List;)I
 HPLcom/android/server/stats/pull/StatsPullAtomService;->pullLooperStats(ILjava/util/List;)I
 HPLcom/android/server/stats/pull/StatsPullAtomService;->pullMobileBytesTransfer(ILjava/util/List;)I
+HPLcom/android/server/stats/pull/StatsPullAtomService;->pullMobileBytesTransfer(ILjava/util/List;Z)I
 HPLcom/android/server/stats/pull/StatsPullAtomService;->pullMobileBytesTransferBackground(ILjava/util/List;)I
 HPLcom/android/server/stats/pull/StatsPullAtomService;->pullModemActivityInfo(ILjava/util/List;)I
 HPLcom/android/server/stats/pull/StatsPullAtomService;->pullNumBiometricsEnrolled(IILjava/util/List;)I
@@ -33583,19 +36255,21 @@
 HPLcom/android/server/stats/pull/StatsPullAtomService;->pullProcessMemoryHighWaterMark(ILjava/util/List;)I
 HPLcom/android/server/stats/pull/StatsPullAtomService;->pullProcessMemorySnapshot(ILjava/util/List;)I
 HPLcom/android/server/stats/pull/StatsPullAtomService;->pullProcessSystemIonHeapSize(ILjava/util/List;)I
-PLcom/android/server/stats/pull/StatsPullAtomService;->pullRuntimeAppOpAccessMessage(ILjava/util/List;)I
+HPLcom/android/server/stats/pull/StatsPullAtomService;->pullRuntimeAppOpAccessMessage(ILjava/util/List;)I
 HPLcom/android/server/stats/pull/StatsPullAtomService;->pullSystemIonHeapSize(ILjava/util/List;)I
 HPLcom/android/server/stats/pull/StatsPullAtomService;->pullSystemUptime(ILjava/util/List;)I
 HPLcom/android/server/stats/pull/StatsPullAtomService;->pullTemperature(ILjava/util/List;)I
 PLcom/android/server/stats/pull/StatsPullAtomService;->pullTimeZoneDataInfo(ILjava/util/List;)I
 HPLcom/android/server/stats/pull/StatsPullAtomService;->pullWifiActivityInfo(ILjava/util/List;)I
 HPLcom/android/server/stats/pull/StatsPullAtomService;->pullWifiBytesTransfer(ILjava/util/List;)I
+PLcom/android/server/stats/pull/StatsPullAtomService;->pullWifiBytesTransfer(ILjava/util/List;Z)I
 HPLcom/android/server/stats/pull/StatsPullAtomService;->pullWifiBytesTransferBackground(ILjava/util/List;)I
 HSPLcom/android/server/stats/pull/StatsPullAtomService;->registerAllPullers()V
 PLcom/android/server/stats/pull/StatsPullAtomService;->registerAppFeaturesOps()V
 HSPLcom/android/server/stats/pull/StatsPullAtomService;->registerAppOps()V
 HSPLcom/android/server/stats/pull/StatsPullAtomService;->registerAppSize()V
 HSPLcom/android/server/stats/pull/StatsPullAtomService;->registerAppsOnExternalStorageInfo()V
+PLcom/android/server/stats/pull/StatsPullAtomService;->registerAttributedAppOps()V
 HSPLcom/android/server/stats/pull/StatsPullAtomService;->registerBatteryCycleCount()V
 HSPLcom/android/server/stats/pull/StatsPullAtomService;->registerBatteryLevel()V
 HSPLcom/android/server/stats/pull/StatsPullAtomService;->registerBatteryVoltage()V
@@ -33655,6 +36329,7 @@
 HSPLcom/android/server/stats/pull/StatsPullAtomService;->registerWifiBytesTransfer()V
 HSPLcom/android/server/stats/pull/StatsPullAtomService;->registerWifiBytesTransferBackground()V
 HPLcom/android/server/stats/pull/StatsPullAtomService;->rollupNetworkStatsByFGBG(Landroid/net/NetworkStats;)Landroid/net/NetworkStats;
+HPLcom/android/server/stats/pull/StatsPullAtomService;->rollupNetworkStatsByFgbg(Landroid/net/NetworkStats;)Landroid/net/NetworkStats;
 HSPLcom/android/server/statusbar/-$$Lambda$StatusBarManagerService$E67OP8P-DuCzmX46ISCwIyOv93Q;-><init>(Lcom/android/server/statusbar/StatusBarManagerService;)V
 HSPLcom/android/server/statusbar/-$$Lambda$StatusBarManagerService$E67OP8P-DuCzmX46ISCwIyOv93Q;->run()V
 PLcom/android/server/statusbar/-$$Lambda$StatusBarManagerService$KPqmL9kxt0YFCz4dBAFkiUMRWw8;-><clinit>()V
@@ -33689,6 +36364,7 @@
 PLcom/android/server/statusbar/StatusBarManagerService$1;->showChargingAnimation(I)V
 PLcom/android/server/statusbar/StatusBarManagerService$1;->showRecentApps(Z)V
 PLcom/android/server/statusbar/StatusBarManagerService$1;->showShutdownUi(ZLjava/lang/String;)Z
+PLcom/android/server/statusbar/StatusBarManagerService$1;->showToast(ILjava/lang/String;Landroid/os/IBinder;Ljava/lang/CharSequence;Landroid/os/IBinder;ILandroid/app/ITransientNotificationCallback;)V
 HPLcom/android/server/statusbar/StatusBarManagerService$1;->showToast(Ljava/lang/String;Landroid/os/IBinder;Ljava/lang/CharSequence;Landroid/os/IBinder;ILandroid/app/ITransientNotificationCallback;)V
 PLcom/android/server/statusbar/StatusBarManagerService$1;->showTransient(I[I)V
 HSPLcom/android/server/statusbar/StatusBarManagerService$1;->topAppWindowChanged(IZZ)V
@@ -33779,6 +36455,7 @@
 HSPLcom/android/server/statusbar/StatusBarManagerService;->getUiState(I)Lcom/android/server/statusbar/StatusBarManagerService$UiState;
 HPLcom/android/server/statusbar/StatusBarManagerService;->handleSystemKey(I)V
 PLcom/android/server/statusbar/StatusBarManagerService;->hideAuthenticationDialog()V
+PLcom/android/server/statusbar/StatusBarManagerService;->isTracing()Z
 PLcom/android/server/statusbar/StatusBarManagerService;->lambda$disableLocked$0$StatusBarManagerService(I)V
 HSPLcom/android/server/statusbar/StatusBarManagerService;->lambda$notifyBarAttachChanged$3$StatusBarManagerService()V
 PLcom/android/server/statusbar/StatusBarManagerService;->lambda$reboot$5(Z)V
@@ -33819,6 +36496,7 @@
 HSPLcom/android/server/statusbar/StatusBarManagerService;->setIconVisibility(Ljava/lang/String;Z)V
 HPLcom/android/server/statusbar/StatusBarManagerService;->setImeWindowStatus(ILandroid/os/IBinder;IIZZ)V
 PLcom/android/server/statusbar/StatusBarManagerService;->showAuthenticationDialog(Landroid/os/Bundle;Landroid/hardware/biometrics/IBiometricServiceReceiverInternal;IZILjava/lang/String;)V
+PLcom/android/server/statusbar/StatusBarManagerService;->showAuthenticationDialog(Landroid/os/Bundle;Landroid/hardware/biometrics/IBiometricServiceReceiverInternal;IZILjava/lang/String;J)V
 PLcom/android/server/statusbar/StatusBarManagerService;->showPinningEnterExitToast(Z)V
 PLcom/android/server/statusbar/StatusBarManagerService;->showPinningEscapeToast()V
 PLcom/android/server/statusbar/StatusBarManagerService;->shutdown()V
@@ -33826,6 +36504,8 @@
 HSPLcom/android/server/statusbar/StatusBarManagerService;->topAppWindowChanged(IZZ)V
 PLcom/android/server/storage/-$$Lambda$StorageUserConnection$ActiveConnection$2ECT20JMDVk3s2c7JRifxIdFISs;-><init>(Lcom/android/server/storage/StorageUserConnection$ActiveConnection;Ljava/util/concurrent/CountDownLatch;)V
 PLcom/android/server/storage/-$$Lambda$StorageUserConnection$ActiveConnection$2ECT20JMDVk3s2c7JRifxIdFISs;->onResult(Landroid/os/Bundle;)V
+PLcom/android/server/storage/-$$Lambda$StorageUserConnection$ActiveConnection$_fNj4MMVR2_fLDVK18ztgw4RUrI;-><init>(Lcom/android/server/storage/StorageUserConnection$ActiveConnection;Ljava/util/concurrent/CountDownLatch;)V
+PLcom/android/server/storage/-$$Lambda$StorageUserConnection$ActiveConnection$_fNj4MMVR2_fLDVK18ztgw4RUrI;->onResult(Landroid/os/Bundle;)V
 PLcom/android/server/storage/-$$Lambda$StorageUserConnection$ActiveConnection$uMm3Ei4cCV446R_LJOCKr8R8AU8;-><init>(Lcom/android/server/storage/StorageUserConnection$ActiveConnection;Ljava/util/concurrent/CountDownLatch;)V
 PLcom/android/server/storage/-$$Lambda$StorageUserConnection$ActiveConnection$uMm3Ei4cCV446R_LJOCKr8R8AU8;->onResult(Landroid/os/Bundle;)V
 PLcom/android/server/storage/AppCollector$BackgroundHandler;-><init>(Lcom/android/server/storage/AppCollector;Landroid/os/Looper;Landroid/os/storage/VolumeInfo;Landroid/content/pm/PackageManager;Landroid/os/UserManager;Landroid/app/usage/StorageStatsManager;)V
@@ -33924,12 +36604,14 @@
 PLcom/android/server/storage/FileCollector;->getMeasurementResult(Landroid/content/Context;)Lcom/android/server/storage/FileCollector$MeasurementResult;
 PLcom/android/server/storage/FileCollector;->getMeasurementResult(Ljava/io/File;)Lcom/android/server/storage/FileCollector$MeasurementResult;
 PLcom/android/server/storage/FileCollector;->getSystemSize(Landroid/content/Context;)J
+PLcom/android/server/storage/StorageSessionController$ExternalStorageServiceException;-><init>(Ljava/lang/String;)V
 PLcom/android/server/storage/StorageSessionController$ExternalStorageServiceException;-><init>(Ljava/lang/String;Ljava/lang/Throwable;)V
 HSPLcom/android/server/storage/StorageSessionController;-><init>(Landroid/content/Context;Z)V
 PLcom/android/server/storage/StorageSessionController;->getExternalStorageServiceComponentName()Landroid/content/ComponentName;
 PLcom/android/server/storage/StorageSessionController;->initExternalStorageServiceComponent()V
 PLcom/android/server/storage/StorageSessionController;->isEmulatedOrPublic(Landroid/os/storage/VolumeInfo;)Z
 PLcom/android/server/storage/StorageSessionController;->killExternalStorageService(I)V
+PLcom/android/server/storage/StorageSessionController;->notifyVolumeStateChanged(Landroid/os/storage/VolumeInfo;)V
 PLcom/android/server/storage/StorageSessionController;->onReset(Landroid/os/IVold;Landroid/os/Handler;)V
 PLcom/android/server/storage/StorageSessionController;->onUnlockUser(I)V
 PLcom/android/server/storage/StorageSessionController;->onUserStopping(I)V
@@ -33955,8 +36637,10 @@
 PLcom/android/server/storage/StorageUserConnection$ActiveConnection;->endSessionLocked(Lcom/android/server/storage/StorageUserConnection$Session;)V
 PLcom/android/server/storage/StorageUserConnection$ActiveConnection;->isActiveLocked(Lcom/android/server/storage/StorageUserConnection$Session;)Z
 PLcom/android/server/storage/StorageUserConnection$ActiveConnection;->lambda$endSessionLocked$1$StorageUserConnection$ActiveConnection(Ljava/util/concurrent/CountDownLatch;Landroid/os/Bundle;)V
+PLcom/android/server/storage/StorageUserConnection$ActiveConnection;->lambda$notifyVolumeStateChangedLocked$2$StorageUserConnection$ActiveConnection(Ljava/util/concurrent/CountDownLatch;Landroid/os/Bundle;)V
 PLcom/android/server/storage/StorageUserConnection$ActiveConnection;->lambda$startSessionLocked$0$StorageUserConnection$ActiveConnection(Ljava/util/concurrent/CountDownLatch;Landroid/os/Bundle;)V
 PLcom/android/server/storage/StorageUserConnection$ActiveConnection;->maybeThrowExceptionLocked()V
+PLcom/android/server/storage/StorageUserConnection$ActiveConnection;->notifyVolumeStateChangedLocked(Ljava/lang/String;Landroid/os/storage/StorageVolume;)V
 PLcom/android/server/storage/StorageUserConnection$ActiveConnection;->setResultLocked(Ljava/util/concurrent/CountDownLatch;Landroid/os/Bundle;)V
 PLcom/android/server/storage/StorageUserConnection$ActiveConnection;->startSessionLocked(Lcom/android/server/storage/StorageUserConnection$Session;Landroid/os/ParcelFileDescriptor;)V
 PLcom/android/server/storage/StorageUserConnection$Session;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
@@ -33970,6 +36654,7 @@
 PLcom/android/server/storage/StorageUserConnection;->access$500(Lcom/android/server/storage/StorageUserConnection;)Lcom/android/server/storage/StorageSessionController;
 PLcom/android/server/storage/StorageUserConnection;->close()V
 PLcom/android/server/storage/StorageUserConnection;->getAllSessionIds()Ljava/util/Set;
+PLcom/android/server/storage/StorageUserConnection;->notifyVolumeStateChanged(Ljava/lang/String;Landroid/os/storage/StorageVolume;)V
 PLcom/android/server/storage/StorageUserConnection;->prepareRemote()V
 PLcom/android/server/storage/StorageUserConnection;->removeAllSessions()V
 PLcom/android/server/storage/StorageUserConnection;->removeSession(Ljava/lang/String;)Lcom/android/server/storage/StorageUserConnection$Session;
@@ -34126,6 +36811,7 @@
 HSPLcom/android/server/textclassifier/TextClassificationManagerService$ServiceState;->bindIfHasPendingRequestsLocked()Z
 HPLcom/android/server/textclassifier/TextClassificationManagerService$ServiceState;->bindLocked()Z
 HPLcom/android/server/textclassifier/TextClassificationManagerService$ServiceState;->checkRequestAcceptedLocked(ILjava/lang/String;)Z
+PLcom/android/server/textclassifier/TextClassificationManagerService$ServiceState;->createBindServiceFlags(Ljava/lang/String;)I
 PLcom/android/server/textclassifier/TextClassificationManagerService$ServiceState;->dump(Lcom/android/internal/util/IndentingPrintWriter;)V
 PLcom/android/server/textclassifier/TextClassificationManagerService$ServiceState;->getTextClassifierServiceComponent()Landroid/content/ComponentName;
 HPLcom/android/server/textclassifier/TextClassificationManagerService$ServiceState;->handlePendingRequestsLocked()V
@@ -34200,6 +36886,7 @@
 HSPLcom/android/server/textclassifier/TextClassificationManagerService;->getUserStateLocked(I)Lcom/android/server/textclassifier/TextClassificationManagerService$UserState;
 HPLcom/android/server/textclassifier/TextClassificationManagerService;->handleRequest(ILjava/lang/String;ZLcom/android/internal/util/FunctionalUtils$ThrowingConsumer;Ljava/lang/String;Landroid/service/textclassifier/ITextClassifierCallback;)V
 HPLcom/android/server/textclassifier/TextClassificationManagerService;->handleRequest(ILjava/lang/String;ZZLcom/android/internal/util/FunctionalUtils$ThrowingConsumer;Ljava/lang/String;Landroid/service/textclassifier/ITextClassifierCallback;)V
+HPLcom/android/server/textclassifier/TextClassificationManagerService;->handleRequest(Landroid/view/textclassifier/SystemTextClassifierMetadata;ZZLcom/android/internal/util/FunctionalUtils$ThrowingConsumer;Ljava/lang/String;Landroid/service/textclassifier/ITextClassifierCallback;)V
 PLcom/android/server/textclassifier/TextClassificationManagerService;->lambda$dump$9$TextClassificationManagerService(Lcom/android/internal/util/IndentingPrintWriter;)V
 HPLcom/android/server/textclassifier/TextClassificationManagerService;->lambda$handleRequest$10(Lcom/android/internal/util/FunctionalUtils$ThrowingConsumer;Lcom/android/server/textclassifier/TextClassificationManagerService$ServiceState;)V
 HPLcom/android/server/textclassifier/TextClassificationManagerService;->lambda$handleRequest$10(Lcom/android/internal/util/FunctionalUtils$ThrowingConsumer;Lcom/android/server/textclassifier/TextClassificationManagerService$UserState;)V
@@ -34320,6 +37007,7 @@
 HSPLcom/android/server/textservices/TextServicesManagerService;->getCurrentSpellCheckerForUser(I)Landroid/view/textservice/SpellCheckerInfo;
 HPLcom/android/server/textservices/TextServicesManagerService;->getCurrentSpellCheckerSubtype(IZ)Landroid/view/textservice/SpellCheckerSubtype;
 HPLcom/android/server/textservices/TextServicesManagerService;->getDataFromCallingUserIdLocked(I)Lcom/android/server/textservices/TextServicesManagerService$TextServicesData;
+PLcom/android/server/textservices/TextServicesManagerService;->getEnabledSpellCheckers(I)[Landroid/view/textservice/SpellCheckerInfo;
 HPLcom/android/server/textservices/TextServicesManagerService;->getSpellCheckerService(ILjava/lang/String;Ljava/lang/String;Lcom/android/internal/textservice/ITextServicesSessionListener;Lcom/android/internal/textservice/ISpellCheckerSessionListener;Landroid/os/Bundle;)V
 PLcom/android/server/textservices/TextServicesManagerService;->initializeInternalStateLocked(I)V
 HPLcom/android/server/textservices/TextServicesManagerService;->isSpellCheckerEnabled(I)Z
@@ -34399,6 +37087,8 @@
 PLcom/android/server/timezonedetector/-$$Lambda$TimeZoneDetectorService$UdeBqzyBZX1S4jHLM7d2cKvE_-U;->run()V
 PLcom/android/server/timezonedetector/-$$Lambda$TimeZoneDetectorService$fVU6C2loDoPZ5MLRbaxmXaLRy_s;-><init>(Lcom/android/server/timezonedetector/TimeZoneDetectorService;Landroid/app/timezonedetector/TelephonyTimeZoneSuggestion;)V
 PLcom/android/server/timezonedetector/-$$Lambda$TimeZoneDetectorService$fVU6C2loDoPZ5MLRbaxmXaLRy_s;->run()V
+PLcom/android/server/timezonedetector/-$$Lambda$YxXJMUW4yEyBSw8jCvXmZTpthE8;-><init>(Lcom/android/server/timezonedetector/TimeZoneDetectorStrategy;)V
+PLcom/android/server/timezonedetector/-$$Lambda$YxXJMUW4yEyBSw8jCvXmZTpthE8;->run()V
 HSPLcom/android/server/timezonedetector/ArrayMapWithHistory;-><init>(I)V
 PLcom/android/server/timezonedetector/ArrayMapWithHistory;->dump(Lcom/android/internal/util/IndentingPrintWriter;)V
 HPLcom/android/server/timezonedetector/ArrayMapWithHistory;->get(Ljava/lang/Object;)Ljava/lang/Object;
@@ -34406,12 +37096,15 @@
 HPLcom/android/server/timezonedetector/ArrayMapWithHistory;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
 HPLcom/android/server/timezonedetector/ArrayMapWithHistory;->size()I
 HPLcom/android/server/timezonedetector/ArrayMapWithHistory;->valueAt(I)Ljava/lang/Object;
+PLcom/android/server/timezonedetector/ReferenceWithHistory;-><clinit>()V
 HSPLcom/android/server/timezonedetector/ReferenceWithHistory;-><init>(I)V
 HPLcom/android/server/timezonedetector/ReferenceWithHistory;->dump(Lcom/android/internal/util/IndentingPrintWriter;)V
 HPLcom/android/server/timezonedetector/ReferenceWithHistory;->get()Ljava/lang/Object;
 HPLcom/android/server/timezonedetector/ReferenceWithHistory;->getHistoryCount()I
+PLcom/android/server/timezonedetector/ReferenceWithHistory;->packNullIfRequired(Ljava/lang/Object;)Ljava/lang/Object;
 HPLcom/android/server/timezonedetector/ReferenceWithHistory;->set(Ljava/lang/Object;)Ljava/lang/Object;
 PLcom/android/server/timezonedetector/ReferenceWithHistory;->toString()Ljava/lang/String;
+PLcom/android/server/timezonedetector/ReferenceWithHistory;->unpackNullIfRequired(Ljava/lang/Object;)Ljava/lang/Object;
 HSPLcom/android/server/timezonedetector/TimeZoneDetectorCallbackImpl;-><init>(Landroid/content/Context;)V
 PLcom/android/server/timezonedetector/TimeZoneDetectorCallbackImpl;->deviceHasTelephonyNetwork()Z
 PLcom/android/server/timezonedetector/TimeZoneDetectorCallbackImpl;->getDeviceTimeZone()Ljava/lang/String;
@@ -34460,10 +37153,12 @@
 PLcom/android/server/timezonedetector/TimeZoneDetectorStrategyImpl;->dump(Ljava/io/PrintWriter;[Ljava/lang/String;)V
 PLcom/android/server/timezonedetector/TimeZoneDetectorStrategyImpl;->findBestPhoneSuggestion()Lcom/android/server/timezonedetector/TimeZoneDetectorStrategyImpl$QualifiedPhoneTimeZoneSuggestion;
 HPLcom/android/server/timezonedetector/TimeZoneDetectorStrategyImpl;->findBestTelephonySuggestion()Lcom/android/server/timezonedetector/TimeZoneDetectorStrategyImpl$QualifiedTelephonyTimeZoneSuggestion;
+PLcom/android/server/timezonedetector/TimeZoneDetectorStrategyImpl;->handleAutoTimeZoneDetectionChanged()V
 PLcom/android/server/timezonedetector/TimeZoneDetectorStrategyImpl;->isOriginAutomatic(I)Z
 PLcom/android/server/timezonedetector/TimeZoneDetectorStrategyImpl;->scorePhoneSuggestion(Landroid/app/timezonedetector/PhoneTimeZoneSuggestion;)I
 PLcom/android/server/timezonedetector/TimeZoneDetectorStrategyImpl;->scoreTelephonySuggestion(Landroid/app/timezonedetector/TelephonyTimeZoneSuggestion;)I
 HPLcom/android/server/timezonedetector/TimeZoneDetectorStrategyImpl;->setDeviceTimeZoneIfRequired(ILjava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/timezonedetector/TimeZoneDetectorStrategyImpl;->suggestManualTimeZone(Landroid/app/timezonedetector/ManualTimeZoneSuggestion;)V
 PLcom/android/server/timezonedetector/TimeZoneDetectorStrategyImpl;->suggestPhoneTimeZone(Landroid/app/timezonedetector/PhoneTimeZoneSuggestion;)V
 HPLcom/android/server/timezonedetector/TimeZoneDetectorStrategyImpl;->suggestTelephonyTimeZone(Landroid/app/timezonedetector/TelephonyTimeZoneSuggestion;)V
 HSPLcom/android/server/trust/-$$Lambda$TrustManagerService$1$98HKBkg-C1PLlz_Q1vJz1OJtw4c;-><clinit>()V
@@ -34482,7 +37177,7 @@
 PLcom/android/server/trust/TrustAgentWrapper;-><clinit>()V
 HPLcom/android/server/trust/TrustAgentWrapper;-><init>(Landroid/content/Context;Lcom/android/server/trust/TrustManagerService;Landroid/content/Intent;Landroid/os/UserHandle;)V
 PLcom/android/server/trust/TrustAgentWrapper;->access$000(Lcom/android/server/trust/TrustAgentWrapper;)Landroid/content/ComponentName;
-PLcom/android/server/trust/TrustAgentWrapper;->access$100(Lcom/android/server/trust/TrustAgentWrapper;)Landroid/os/Handler;
+HPLcom/android/server/trust/TrustAgentWrapper;->access$100(Lcom/android/server/trust/TrustAgentWrapper;)Landroid/os/Handler;
 HPLcom/android/server/trust/TrustAgentWrapper;->access$1000(Lcom/android/server/trust/TrustAgentWrapper;)I
 HPLcom/android/server/trust/TrustAgentWrapper;->access$1100(Lcom/android/server/trust/TrustAgentWrapper;)Lcom/android/server/trust/TrustManagerService;
 PLcom/android/server/trust/TrustAgentWrapper;->access$1302(Lcom/android/server/trust/TrustAgentWrapper;Landroid/os/IBinder;)Landroid/os/IBinder;
@@ -34498,9 +37193,10 @@
 PLcom/android/server/trust/TrustAgentWrapper;->access$2200(Lcom/android/server/trust/TrustAgentWrapper;)V
 PLcom/android/server/trust/TrustAgentWrapper;->access$300(Lcom/android/server/trust/TrustAgentWrapper;)Ljava/lang/CharSequence;
 PLcom/android/server/trust/TrustAgentWrapper;->access$302(Lcom/android/server/trust/TrustAgentWrapper;Ljava/lang/CharSequence;)Ljava/lang/CharSequence;
-PLcom/android/server/trust/TrustAgentWrapper;->access$500()Z
+HPLcom/android/server/trust/TrustAgentWrapper;->access$500()Z
 PLcom/android/server/trust/TrustAgentWrapper;->destroy()V
 PLcom/android/server/trust/TrustAgentWrapper;->getMessage()Ljava/lang/CharSequence;
+PLcom/android/server/trust/TrustAgentWrapper;->getScheduledRestartUptimeMillis()J
 PLcom/android/server/trust/TrustAgentWrapper;->isBound()Z
 HPLcom/android/server/trust/TrustAgentWrapper;->isConnected()Z
 PLcom/android/server/trust/TrustAgentWrapper;->isManagingTrust()Z
@@ -34984,6 +37680,7 @@
 PLcom/android/server/usage/UsageStatsDatabase;-><init>(Ljava/io/File;I)V
 PLcom/android/server/usage/UsageStatsDatabase;->checkVersionAndBuildLocked()V
 HPLcom/android/server/usage/UsageStatsDatabase;->checkinDailyFiles(Lcom/android/server/usage/UsageStatsDatabase$CheckinAction;)Z
+PLcom/android/server/usage/UsageStatsDatabase;->deleteDirectory(Ljava/io/File;)V
 PLcom/android/server/usage/UsageStatsDatabase;->doUpgradeLocked(I)V
 HPLcom/android/server/usage/UsageStatsDatabase;->dump(Lcom/android/internal/util/IndentingPrintWriter;Z)V
 HPLcom/android/server/usage/UsageStatsDatabase;->dumpMappings(Lcom/android/internal/util/IndentingPrintWriter;)V
@@ -35004,6 +37701,8 @@
 PLcom/android/server/usage/UsageStatsDatabase;->prune(J)V
 HPLcom/android/server/usage/UsageStatsDatabase;->pruneChooserCountsOlderThan(Ljava/io/File;J)V
 HPLcom/android/server/usage/UsageStatsDatabase;->pruneFilesOlderThan(Ljava/io/File;J)V
+PLcom/android/server/usage/UsageStatsDatabase;->prunePackagesDataOnUpgrade(Ljava/util/HashMap;)V
+HPLcom/android/server/usage/UsageStatsDatabase;->pruneStats(Ljava/util/HashMap;Lcom/android/server/usage/IntervalStats;)Z
 PLcom/android/server/usage/UsageStatsDatabase;->pruneUninstalledPackagesData()Z
 HPLcom/android/server/usage/UsageStatsDatabase;->putUsageStats(ILcom/android/server/usage/IntervalStats;)V
 HPLcom/android/server/usage/UsageStatsDatabase;->queryUsageStats(IJJLcom/android/server/usage/UsageStatsDatabase$StatCombiner;)Ljava/util/List;
@@ -35023,6 +37722,7 @@
 PLcom/android/server/usage/UsageStatsIdleService;->cancelJob(Landroid/content/Context;I)V
 PLcom/android/server/usage/UsageStatsIdleService;->lambda$onStartJob$0$UsageStatsIdleService(ILandroid/app/job/JobParameters;)V
 PLcom/android/server/usage/UsageStatsIdleService;->onStartJob(Landroid/app/job/JobParameters;)Z
+PLcom/android/server/usage/UsageStatsIdleService;->onStopJob(Landroid/app/job/JobParameters;)Z
 PLcom/android/server/usage/UsageStatsIdleService;->scheduleJob(Landroid/content/Context;I)V
 PLcom/android/server/usage/UsageStatsProto;-><clinit>()V
 HPLcom/android/server/usage/UsageStatsProto;->write(Ljava/io/OutputStream;Lcom/android/server/usage/IntervalStats;)V
@@ -35118,7 +37818,7 @@
 PLcom/android/server/usage/UsageStatsService$LocalService;->reportExemptedSyncStart(Ljava/lang/String;I)V
 HSPLcom/android/server/usage/UsageStatsService$LocalService;->reportInterruptiveNotification(Ljava/lang/String;Ljava/lang/String;I)V
 PLcom/android/server/usage/UsageStatsService$LocalService;->reportShortcutUsage(Ljava/lang/String;Ljava/lang/String;I)V
-PLcom/android/server/usage/UsageStatsService$LocalService;->reportSyncScheduled(Ljava/lang/String;IZ)V
+HPLcom/android/server/usage/UsageStatsService$LocalService;->reportSyncScheduled(Ljava/lang/String;IZ)V
 HSPLcom/android/server/usage/UsageStatsService$LocalService;->setActiveAdminApps(Ljava/util/Set;I)V
 HPLcom/android/server/usage/UsageStatsService$LocalService;->setLastJobRunTime(Ljava/lang/String;IJ)V
 HSPLcom/android/server/usage/UsageStatsService$MyPackageMonitor;-><init>(Lcom/android/server/usage/UsageStatsService;)V
@@ -35186,10 +37886,10 @@
 HPLcom/android/server/usage/UsageStatsService;->reportEvent(Landroid/app/usage/UsageEvents$Event;I)V
 HSPLcom/android/server/usage/UsageStatsService;->reportEventOrAddToQueue(ILandroid/app/usage/UsageEvents$Event;)V
 HPLcom/android/server/usage/UsageStatsService;->reportEventToAllUserId(Landroid/app/usage/UsageEvents$Event;)V
-PLcom/android/server/usage/UsageStatsService;->shouldHideLocusIdEvents(II)Z
+HPLcom/android/server/usage/UsageStatsService;->shouldHideLocusIdEvents(II)Z
 HPLcom/android/server/usage/UsageStatsService;->shouldHideShortcutInvocationEvents(ILjava/lang/String;II)Z
 HPLcom/android/server/usage/UsageStatsService;->shouldObfuscateInstantAppsForCaller(II)Z
-PLcom/android/server/usage/UsageStatsService;->shouldObfuscateNotificationEvents(II)Z
+HPLcom/android/server/usage/UsageStatsService;->shouldObfuscateNotificationEvents(II)Z
 PLcom/android/server/usage/UsageStatsService;->shutdown()V
 PLcom/android/server/usage/UsageStatsService;->unregisterAppUsageLimitObserver(III)V
 PLcom/android/server/usage/UsageStatsService;->unregisterAppUsageObserver(III)V
@@ -35198,7 +37898,7 @@
 HPLcom/android/server/usage/UserUsageStatsService$1;->combine(Lcom/android/server/usage/IntervalStats;ZLjava/util/List;)V
 PLcom/android/server/usage/UserUsageStatsService$2;-><init>()V
 PLcom/android/server/usage/UserUsageStatsService$3;-><init>()V
-PLcom/android/server/usage/UserUsageStatsService$4;-><init>(Lcom/android/server/usage/UserUsageStatsService;JJILandroid/util/ArraySet;)V
+HPLcom/android/server/usage/UserUsageStatsService$4;-><init>(Lcom/android/server/usage/UserUsageStatsService;JJILandroid/util/ArraySet;)V
 HPLcom/android/server/usage/UserUsageStatsService$4;-><init>(Lcom/android/server/usage/UserUsageStatsService;JJZLandroid/util/ArraySet;)V
 HPLcom/android/server/usage/UserUsageStatsService$4;-><init>(Lcom/android/server/usage/UserUsageStatsService;JJZZLandroid/util/ArraySet;)V
 HPLcom/android/server/usage/UserUsageStatsService$4;->combine(Lcom/android/server/usage/IntervalStats;ZLjava/util/List;)V
@@ -35213,7 +37913,7 @@
 PLcom/android/server/usage/UserUsageStatsService;->checkin(Lcom/android/internal/util/IndentingPrintWriter;)V
 HPLcom/android/server/usage/UserUsageStatsService;->convertToSystemTimeLocked(Landroid/app/usage/UsageEvents$Event;)V
 PLcom/android/server/usage/UserUsageStatsService;->dump(Lcom/android/internal/util/IndentingPrintWriter;Ljava/lang/String;Z)V
-PLcom/android/server/usage/UserUsageStatsService;->dump(Lcom/android/internal/util/IndentingPrintWriter;Ljava/util/List;Z)V
+HPLcom/android/server/usage/UserUsageStatsService;->dump(Lcom/android/internal/util/IndentingPrintWriter;Ljava/util/List;Z)V
 HPLcom/android/server/usage/UserUsageStatsService;->eventToString(I)Ljava/lang/String;
 HPLcom/android/server/usage/UserUsageStatsService;->formatDateTime(JZ)Ljava/lang/String;
 HPLcom/android/server/usage/UserUsageStatsService;->formatElapsedTime(JZ)Ljava/lang/String;
@@ -35258,6 +37958,8 @@
 HSPLcom/android/server/usb/-$$Lambda$UsbService$Lifecycle$KjOG0MXO3C0J-L5Ymrj6FnSwXwQ;->run()V
 HSPLcom/android/server/usb/-$$Lambda$UsbService$Lifecycle$sV0bZ5BCi6DR9FlGZbY2PyYUP58;-><init>(Lcom/android/server/usb/UsbService$Lifecycle;)V
 HSPLcom/android/server/usb/-$$Lambda$UsbService$Lifecycle$sV0bZ5BCi6DR9FlGZbY2PyYUP58;->run()V
+PLcom/android/server/usb/-$$Lambda$UsbService$Lifecycle$uW1Zp8w_9pHt-c93nC2qQFOakXo;-><init>(Lcom/android/server/usb/UsbService$Lifecycle;Lcom/android/server/SystemService$TargetUser;)V
+PLcom/android/server/usb/-$$Lambda$UsbService$Lifecycle$uW1Zp8w_9pHt-c93nC2qQFOakXo;->run()V
 HSPLcom/android/server/usb/MtpNotificationManager$Receiver;-><init>(Lcom/android/server/usb/MtpNotificationManager;)V
 HSPLcom/android/server/usb/MtpNotificationManager$Receiver;-><init>(Lcom/android/server/usb/MtpNotificationManager;Lcom/android/server/usb/MtpNotificationManager$1;)V
 HSPLcom/android/server/usb/MtpNotificationManager;-><init>(Landroid/content/Context;Lcom/android/server/usb/MtpNotificationManager$OnOpenInAppListener;)V
@@ -35311,6 +38013,7 @@
 HSPLcom/android/server/usb/UsbDeviceManager$4;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
 HSPLcom/android/server/usb/UsbDeviceManager$UsbHandler$AdbTransport;-><init>(Lcom/android/server/usb/UsbDeviceManager$UsbHandler;)V
 PLcom/android/server/usb/UsbDeviceManager$UsbHandler$AdbTransport;->onAdbEnabled(Z)V
+PLcom/android/server/usb/UsbDeviceManager$UsbHandler$AdbTransport;->onAdbEnabled(ZB)V
 HSPLcom/android/server/usb/UsbDeviceManager$UsbHandler;-><init>(Landroid/os/Looper;Landroid/content/Context;Lcom/android/server/usb/UsbDeviceManager;Lcom/android/server/usb/UsbAlsaManager;Lcom/android/server/usb/UsbPermissionManager;)V
 PLcom/android/server/usb/UsbDeviceManager$UsbHandler;->dump(Lcom/android/internal/util/dump/DualDumpOutputStream;Ljava/lang/String;J)V
 PLcom/android/server/usb/UsbDeviceManager$UsbHandler;->dumpFunctions(Lcom/android/internal/util/dump/DualDumpOutputStream;Ljava/lang/String;JJ)V
@@ -35357,6 +38060,16 @@
 HSPLcom/android/server/usb/UsbDeviceManager$UsbHandlerHal;->handleMessage(Landroid/os/Message;)V
 HSPLcom/android/server/usb/UsbDeviceManager$UsbHandlerHal;->setEnabledFunctions(JZ)V
 HSPLcom/android/server/usb/UsbDeviceManager$UsbHandlerHal;->setUsbConfig(JZ)V
+PLcom/android/server/usb/UsbDeviceManager$UsbHandlerLegacy;-><init>(Landroid/os/Looper;Landroid/content/Context;Lcom/android/server/usb/UsbDeviceManager;Lcom/android/server/usb/UsbAlsaManager;Lcom/android/server/usb/UsbPermissionManager;)V
+PLcom/android/server/usb/UsbDeviceManager$UsbHandlerLegacy;->addFunction(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/usb/UsbDeviceManager$UsbHandlerLegacy;->applyAdbFunction(Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/usb/UsbDeviceManager$UsbHandlerLegacy;->applyOemOverrideFunction(Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/usb/UsbDeviceManager$UsbHandlerLegacy;->containsFunction(Ljava/lang/String;Ljava/lang/String;)Z
+PLcom/android/server/usb/UsbDeviceManager$UsbHandlerLegacy;->getPersistProp(Z)Ljava/lang/String;
+PLcom/android/server/usb/UsbDeviceManager$UsbHandlerLegacy;->isNormalBoot()Z
+PLcom/android/server/usb/UsbDeviceManager$UsbHandlerLegacy;->readOemUsbOverrideConfig(Landroid/content/Context;)V
+PLcom/android/server/usb/UsbDeviceManager$UsbHandlerLegacy;->setEnabledFunctions(JZ)V
+PLcom/android/server/usb/UsbDeviceManager$UsbHandlerLegacy;->trySetEnabledFunctions(JZ)Z
 HSPLcom/android/server/usb/UsbDeviceManager$UsbUEventObserver;-><init>(Lcom/android/server/usb/UsbDeviceManager;)V
 HSPLcom/android/server/usb/UsbDeviceManager$UsbUEventObserver;-><init>(Lcom/android/server/usb/UsbDeviceManager;Lcom/android/server/usb/UsbDeviceManager$1;)V
 HSPLcom/android/server/usb/UsbDeviceManager$UsbUEventObserver;->onUEvent(Landroid/os/UEventObserver$UEvent;)V
@@ -35390,6 +38103,7 @@
 PLcom/android/server/usb/UsbHandlerManager;->confirmUsbHandler(Landroid/content/pm/ResolveInfo;Landroid/hardware/usb/UsbDevice;Landroid/hardware/usb/UsbAccessory;)V
 PLcom/android/server/usb/UsbHandlerManager;->createDialogIntent()Landroid/content/Intent;
 PLcom/android/server/usb/UsbHandlerManager;->selectUsbHandler(Ljava/util/ArrayList;Landroid/os/UserHandle;Landroid/content/Intent;)V
+PLcom/android/server/usb/UsbHandlerManager;->showUsbAccessoryUriActivity(Landroid/hardware/usb/UsbAccessory;Landroid/os/UserHandle;)V
 PLcom/android/server/usb/UsbHostManager$ConnectionRecord;-><init>(Lcom/android/server/usb/UsbHostManager;Ljava/lang/String;I[B)V
 HPLcom/android/server/usb/UsbHostManager$ConnectionRecord;->dump(Lcom/android/internal/util/dump/DualDumpOutputStream;Ljava/lang/String;J)V
 HSPLcom/android/server/usb/UsbHostManager;-><clinit>()V
@@ -35515,6 +38229,7 @@
 HSPLcom/android/server/usb/UsbService$Lifecycle;-><init>(Landroid/content/Context;)V
 HSPLcom/android/server/usb/UsbService$Lifecycle;->lambda$onBootPhase$1$UsbService$Lifecycle()V
 HSPLcom/android/server/usb/UsbService$Lifecycle;->lambda$onStart$0$UsbService$Lifecycle()V
+PLcom/android/server/usb/UsbService$Lifecycle;->lambda$onUserSwitching$2$UsbService$Lifecycle(Lcom/android/server/SystemService$TargetUser;)V
 HSPLcom/android/server/usb/UsbService$Lifecycle;->onBootPhase(I)V
 HSPLcom/android/server/usb/UsbService$Lifecycle;->onStart()V
 PLcom/android/server/usb/UsbService$Lifecycle;->onStopUser(I)V
@@ -35523,10 +38238,12 @@
 PLcom/android/server/usb/UsbService$Lifecycle;->onUnlockUser(I)V
 PLcom/android/server/usb/UsbService$Lifecycle;->onUnlockUser(Lcom/android/server/SystemService$TargetUser;)V
 PLcom/android/server/usb/UsbService$Lifecycle;->onUserStopping(Lcom/android/server/SystemService$TargetUser;)V
+PLcom/android/server/usb/UsbService$Lifecycle;->onUserSwitching(Lcom/android/server/SystemService$TargetUser;Lcom/android/server/SystemService$TargetUser;)V
 PLcom/android/server/usb/UsbService$Lifecycle;->onUserUnlocking(Lcom/android/server/SystemService$TargetUser;)V
 HSPLcom/android/server/usb/UsbService;-><init>(Landroid/content/Context;)V
 PLcom/android/server/usb/UsbService;->access$000(Lcom/android/server/usb/UsbService;I)V
 PLcom/android/server/usb/UsbService;->access$000(Lcom/android/server/usb/UsbService;Landroid/os/UserHandle;)V
+PLcom/android/server/usb/UsbService;->access$100(Lcom/android/server/usb/UsbService;I)V
 PLcom/android/server/usb/UsbService;->access$100(Lcom/android/server/usb/UsbService;Landroid/os/UserHandle;)V
 HSPLcom/android/server/usb/UsbService;->access$200(Lcom/android/server/usb/UsbService;)Lcom/android/server/usb/UsbDeviceManager;
 PLcom/android/server/usb/UsbService;->bootCompleted()V
@@ -35636,6 +38353,8 @@
 PLcom/android/server/usb/descriptors/UsbACMixerUnit;-><init>(IBBI)V
 PLcom/android/server/usb/descriptors/UsbACMixerUnit;->calcControlArraySize(II)I
 PLcom/android/server/usb/descriptors/UsbACMixerUnit;->parseRawDescriptors(Lcom/android/server/usb/descriptors/ByteStream;)I
+PLcom/android/server/usb/descriptors/UsbACSelectorUnit;-><init>(IBBI)V
+PLcom/android/server/usb/descriptors/UsbACSelectorUnit;->parseRawDescriptors(Lcom/android/server/usb/descriptors/ByteStream;)I
 PLcom/android/server/usb/descriptors/UsbACTerminal;-><init>(IBBI)V
 PLcom/android/server/usb/descriptors/UsbACTerminal;->getTerminalType()I
 PLcom/android/server/usb/descriptors/UsbACTerminal;->parseRawDescriptors(Lcom/android/server/usb/descriptors/ByteStream;)I
@@ -35682,6 +38401,7 @@
 PLcom/android/server/usb/descriptors/UsbDescriptorParser;->isOutputHeadset()Z
 HPLcom/android/server/usb/descriptors/UsbDescriptorParser;->parseDescriptors([B)V
 PLcom/android/server/usb/descriptors/UsbDescriptorParser;->setACInterfaceSpec(I)V
+PLcom/android/server/usb/descriptors/UsbDescriptorParser;->setVCInterfaceSpec(I)V
 PLcom/android/server/usb/descriptors/UsbDescriptorParser;->toAndroidUsbDeviceBuilder()Landroid/hardware/usb/UsbDevice$Builder;
 PLcom/android/server/usb/descriptors/UsbDeviceDescriptor;-><init>(IB)V
 PLcom/android/server/usb/descriptors/UsbDeviceDescriptor;->addConfigDescriptor(Lcom/android/server/usb/descriptors/UsbConfigDescriptor;)V
@@ -35707,6 +38427,20 @@
 HPLcom/android/server/usb/descriptors/UsbInterfaceDescriptor;->parseRawDescriptors(Lcom/android/server/usb/descriptors/ByteStream;)I
 HPLcom/android/server/usb/descriptors/UsbInterfaceDescriptor;->toAndroid(Lcom/android/server/usb/descriptors/UsbDescriptorParser;)Landroid/hardware/usb/UsbInterface;
 PLcom/android/server/usb/descriptors/UsbUnknown;-><init>(IB)V
+PLcom/android/server/usb/descriptors/UsbVCEndpoint;->allocDescriptor(Lcom/android/server/usb/descriptors/UsbDescriptorParser;IBB)Lcom/android/server/usb/descriptors/UsbDescriptor;
+PLcom/android/server/usb/descriptors/UsbVCHeader;-><init>(IBBI)V
+PLcom/android/server/usb/descriptors/UsbVCHeader;->parseRawDescriptors(Lcom/android/server/usb/descriptors/ByteStream;)I
+PLcom/android/server/usb/descriptors/UsbVCHeaderInterface;-><init>(IBBI)V
+PLcom/android/server/usb/descriptors/UsbVCInputTerminal;-><init>(IBB)V
+PLcom/android/server/usb/descriptors/UsbVCInputTerminal;->parseRawDescriptors(Lcom/android/server/usb/descriptors/ByteStream;)I
+PLcom/android/server/usb/descriptors/UsbVCInterface;-><init>(IBB)V
+HPLcom/android/server/usb/descriptors/UsbVCInterface;->allocDescriptor(Lcom/android/server/usb/descriptors/UsbDescriptorParser;Lcom/android/server/usb/descriptors/ByteStream;IB)Lcom/android/server/usb/descriptors/UsbDescriptor;
+PLcom/android/server/usb/descriptors/UsbVCOutputTerminal;-><init>(IBB)V
+PLcom/android/server/usb/descriptors/UsbVCOutputTerminal;->parseRawDescriptors(Lcom/android/server/usb/descriptors/ByteStream;)I
+PLcom/android/server/usb/descriptors/UsbVCProcessingUnit;-><init>(IBB)V
+HPLcom/android/server/usb/descriptors/UsbVCProcessingUnit;->parseRawDescriptors(Lcom/android/server/usb/descriptors/ByteStream;)I
+PLcom/android/server/usb/descriptors/UsbVCSelectorUnit;-><init>(IBB)V
+PLcom/android/server/usb/descriptors/UsbVCSelectorUnit;->parseRawDescriptors(Lcom/android/server/usb/descriptors/ByteStream;)I
 PLcom/android/server/utils/AppInstallerUtil;->createIntent(Landroid/content/Context;Ljava/lang/String;)Landroid/content/Intent;
 PLcom/android/server/utils/AppInstallerUtil;->createIntent(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;
 PLcom/android/server/utils/AppInstallerUtil;->getInstallerPackageName(Landroid/content/Context;Ljava/lang/String;)Ljava/lang/String;
@@ -35909,8 +38643,9 @@
 PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->deleteKeyphraseSoundModel(ILjava/lang/String;)I
 PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->deliverNewSession(Landroid/os/IBinder;Landroid/service/voice/IVoiceInteractionSession;Lcom/android/internal/app/IVoiceInteractor;)Z
 PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->dump(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->enforceCallerAllowedToEnrollVoiceModel()V
 HSPLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->enforceCallingPermission(Ljava/lang/String;)V
-PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->enforceIsCurrentVoiceInteractionService()V
+HPLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->enforceIsCurrentVoiceInteractionService()V
 HPLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->enforceIsCurrentVoiceInteractionService(Landroid/service/voice/IVoiceInteractionService;)V
 PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->findAvailInteractor(ILjava/lang/String;)Landroid/service/voice/VoiceInteractionServiceInfo;
 PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->findAvailRecognizer(Ljava/lang/String;I)Landroid/content/ComponentName;
@@ -35925,12 +38660,15 @@
 PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->getEnrolledKeyphraseMetadata(Ljava/lang/String;Ljava/lang/String;)Landroid/hardware/soundtrigger/KeyphraseMetadata;
 HSPLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->getForceVoiceInteractionServicePackage(Landroid/content/res/Resources;)Ljava/lang/String;
 PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->getKeyphraseSoundModel(ILjava/lang/String;)Landroid/hardware/soundtrigger/SoundTrigger$KeyphraseSoundModel;
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->getOrCreateEnrollmentApplicationInfo()V
 HPLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->getUserDisabledShowContext()I
 HPLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->hideCurrentSession()V
 HPLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->hideSessionFromSession(Landroid/os/IBinder;)Z
 HSPLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->initForUser(I)V
 HSPLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->initForUserNoTracing(I)V
 HPLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->isCallerCurrentVoiceInteractionService()Z
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->isCallerHoldingPermission(Ljava/lang/String;)Z
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->isCallerTrustedEnrollmentApplication()Z
 PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->isEnrolledForKeyphrase(Landroid/service/voice/IVoiceInteractionService;ILjava/lang/String;)Z
 PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->isSessionRunning()Z
 PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->lambda$switchUser$0$VoiceInteractionManagerService$VoiceInteractionManagerServiceStub(I)V
@@ -35981,6 +38719,8 @@
 HSPLcom/android/server/voiceinteraction/VoiceInteractionManagerService;->onStartUser(Landroid/content/pm/UserInfo;)V
 PLcom/android/server/voiceinteraction/VoiceInteractionManagerService;->onSwitchUser(Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;)V
 PLcom/android/server/voiceinteraction/VoiceInteractionManagerService;->onUnlockUser(Landroid/content/pm/UserInfo;)V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService;->onUserStarting(Lcom/android/server/SystemService$TargetUser;)V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService;->onUserUnlocking(Lcom/android/server/SystemService$TargetUser;)V
 PLcom/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl$1;-><init>(Lcom/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl;)V
 HPLcom/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
 PLcom/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl$2;-><init>(Lcom/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl;)V
@@ -36132,13 +38872,21 @@
 HSPLcom/android/server/vr/VrManagerService;->setVrMode(ZLandroid/content/ComponentName;IILandroid/content/ComponentName;)V
 HPLcom/android/server/vr/VrManagerService;->updateCurrentVrServiceLocked(ZZLandroid/content/ComponentName;IILandroid/content/ComponentName;)Z
 HSPLcom/android/server/vr/VrManagerService;->updateVrModeAllowedLocked()V
+PLcom/android/server/wallpaper/-$$Lambda$QblJSn28fT0IWuWTmXxzYPXTYdI;-><init>(Lcom/android/server/wallpaper/WallpaperManagerService$WallpaperConnection;)V
+PLcom/android/server/wallpaper/-$$Lambda$QblJSn28fT0IWuWTmXxzYPXTYdI;->test(Ljava/lang/Object;)Z
 HSPLcom/android/server/wallpaper/-$$Lambda$WallpaperManagerService$-BqUtvsdVGS3ye_UHe7qFnTZPn4;-><init>(Lcom/android/server/wallpaper/WallpaperManagerService$WallpaperConnection;Lcom/android/server/wallpaper/WallpaperManagerService$WallpaperData;)V
 HSPLcom/android/server/wallpaper/-$$Lambda$WallpaperManagerService$-BqUtvsdVGS3ye_UHe7qFnTZPn4;->accept(Ljava/lang/Object;)V
 HSPLcom/android/server/wallpaper/-$$Lambda$WallpaperManagerService$1tPkxHr3PHUgpfvv03vRyPzY3uM;-><init>(Lcom/android/server/wallpaper/WallpaperManagerService;Lcom/android/server/wallpaper/WallpaperManagerService$WallpaperData;Lcom/android/server/wallpaper/WallpaperManagerService$WallpaperData;)V
 HSPLcom/android/server/wallpaper/-$$Lambda$WallpaperManagerService$1tPkxHr3PHUgpfvv03vRyPzY3uM;->run()V
 PLcom/android/server/wallpaper/-$$Lambda$WallpaperManagerService$4phuz9MKBqoKfDMu8M8EBVJyI2I;-><init>(Ljava/io/PrintWriter;)V
+PLcom/android/server/wallpaper/-$$Lambda$WallpaperManagerService$4phuz9MKBqoKfDMu8M8EBVJyI2I;->accept(Ljava/lang/Object;)V
+PLcom/android/server/wallpaper/-$$Lambda$WallpaperManagerService$8NPecRUvsVyVb9PqWBr_ybjykpE;-><init>(Ljava/io/PrintWriter;)V
 PLcom/android/server/wallpaper/-$$Lambda$WallpaperManagerService$93YXv2Z9dcGnT0Vr4Zebgn1qyVM;-><init>(Ljava/io/PrintWriter;)V
 PLcom/android/server/wallpaper/-$$Lambda$WallpaperManagerService$93YXv2Z9dcGnT0Vr4Zebgn1qyVM;->accept(Ljava/lang/Object;)V
+PLcom/android/server/wallpaper/-$$Lambda$WallpaperManagerService$D8sKj0RqX-3Qbw982v7_y2qaq5w;-><init>(Lcom/android/server/wallpaper/WallpaperManagerService$WallpaperConnection;Lcom/android/server/wallpaper/WallpaperManagerService$WallpaperData;)V
+PLcom/android/server/wallpaper/-$$Lambda$WallpaperManagerService$D8sKj0RqX-3Qbw982v7_y2qaq5w;->accept(Ljava/lang/Object;)V
+PLcom/android/server/wallpaper/-$$Lambda$WallpaperManagerService$NjJWXk8Bi-l1pjCm41zPCbZJ2ME;-><init>(Ljava/io/PrintWriter;)V
+PLcom/android/server/wallpaper/-$$Lambda$WallpaperManagerService$NjJWXk8Bi-l1pjCm41zPCbZJ2ME;->accept(Ljava/lang/Object;)V
 HSPLcom/android/server/wallpaper/-$$Lambda$WallpaperManagerService$SxaUJpgTTfzUoz6u3AWuAOQdoNw;-><init>(Lcom/android/server/wallpaper/WallpaperManagerService$WallpaperConnection;)V
 HSPLcom/android/server/wallpaper/-$$Lambda$WallpaperManagerService$SxaUJpgTTfzUoz6u3AWuAOQdoNw;->test(Ljava/lang/Object;)Z
 PLcom/android/server/wallpaper/-$$Lambda$WallpaperManagerService$VUhQWq8Flr0dsQqeVHhHT8jU7qY;-><init>(Ljava/io/PrintWriter;)V
@@ -36154,6 +38902,7 @@
 PLcom/android/server/wallpaper/-$$Lambda$WallpaperManagerService$WallpaperConnection$Yk86TTURTI5B9DzxOzMQGDq7aQU;-><init>(Lcom/android/server/wallpaper/WallpaperManagerService$WallpaperConnection;)V
 PLcom/android/server/wallpaper/-$$Lambda$WallpaperManagerService$WallpaperConnection$Yk86TTURTI5B9DzxOzMQGDq7aQU;->run()V
 PLcom/android/server/wallpaper/-$$Lambda$WallpaperManagerService$WallpaperConnection$d7gUC6mQx1Xv_Bvlwss1NEF5PwU;-><init>(Lcom/android/server/wallpaper/WallpaperManagerService$WallpaperConnection;)V
+PLcom/android/server/wallpaper/-$$Lambda$WallpaperManagerService$WallpaperConnection$d7gUC6mQx1Xv_Bvlwss1NEF5PwU;->run()V
 PLcom/android/server/wallpaper/-$$Lambda$WallpaperManagerService$WallpaperConnection$pf_7EcVpbLQlQnQ4nGnqzkGUhqg;-><clinit>()V
 PLcom/android/server/wallpaper/-$$Lambda$WallpaperManagerService$WallpaperConnection$pf_7EcVpbLQlQnQ4nGnqzkGUhqg;-><init>()V
 PLcom/android/server/wallpaper/-$$Lambda$WallpaperManagerService$WallpaperConnection$pf_7EcVpbLQlQnQ4nGnqzkGUhqg;->accept(Ljava/lang/Object;)V
@@ -36210,11 +38959,13 @@
 HSPLcom/android/server/wallpaper/WallpaperManagerService$WallpaperConnection;->containsDisplay(I)Z
 PLcom/android/server/wallpaper/WallpaperManagerService$WallpaperConnection;->engineShown(Landroid/service/wallpaper/IWallpaperEngine;)V
 HSPLcom/android/server/wallpaper/WallpaperManagerService$WallpaperConnection;->forEachDisplayConnector(Ljava/util/function/Consumer;)V
+PLcom/android/server/wallpaper/WallpaperManagerService$WallpaperConnection;->getConnectedEngineSize()I
 HSPLcom/android/server/wallpaper/WallpaperManagerService$WallpaperConnection;->getDisplayConnectorOrCreate(I)Lcom/android/server/wallpaper/WallpaperManagerService$WallpaperConnection$DisplayConnector;
 HSPLcom/android/server/wallpaper/WallpaperManagerService$WallpaperConnection;->initDisplayState()V
 HSPLcom/android/server/wallpaper/WallpaperManagerService$WallpaperConnection;->isUsableDisplay(Landroid/view/Display;)Z
 HSPLcom/android/server/wallpaper/WallpaperManagerService$WallpaperConnection;->lambda$NrNkceFJLqjCb8eAxErUhpLd5c8(Lcom/android/server/wallpaper/WallpaperManagerService$WallpaperConnection;Landroid/view/Display;)Z
 PLcom/android/server/wallpaper/WallpaperManagerService$WallpaperConnection;->lambda$new$0$WallpaperManagerService$WallpaperConnection()V
+PLcom/android/server/wallpaper/WallpaperManagerService$WallpaperConnection;->lambda$new$1$WallpaperManagerService$WallpaperConnection()V
 PLcom/android/server/wallpaper/WallpaperManagerService$WallpaperConnection;->lambda$onServiceDisconnected$1(Lcom/android/server/wallpaper/WallpaperManagerService$WallpaperConnection$DisplayConnector;)V
 PLcom/android/server/wallpaper/WallpaperManagerService$WallpaperConnection;->lambda$onServiceDisconnected$2$WallpaperManagerService$WallpaperConnection()V
 PLcom/android/server/wallpaper/WallpaperManagerService$WallpaperConnection;->lambda$onServiceDisconnected$2(Lcom/android/server/wallpaper/WallpaperManagerService$WallpaperConnection$DisplayConnector;)V
@@ -36268,6 +39019,7 @@
 PLcom/android/server/wallpaper/WallpaperManagerService;->detachWallpaperLocked(Lcom/android/server/wallpaper/WallpaperManagerService$WallpaperData;)V
 HPLcom/android/server/wallpaper/WallpaperManagerService;->dump(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V
 HSPLcom/android/server/wallpaper/WallpaperManagerService;->emptyCallbackList(Landroid/os/RemoteCallbackList;)Z
+PLcom/android/server/wallpaper/WallpaperManagerService;->ensureSaneWallpaperData(Lcom/android/server/wallpaper/WallpaperManagerService$WallpaperData;)V
 HSPLcom/android/server/wallpaper/WallpaperManagerService;->ensureSaneWallpaperData(Lcom/android/server/wallpaper/WallpaperManagerService$WallpaperData;I)V
 HSPLcom/android/server/wallpaper/WallpaperManagerService;->ensureSaneWallpaperDisplaySize(Lcom/android/server/wallpaper/WallpaperManagerService$DisplayData;I)V
 HSPLcom/android/server/wallpaper/WallpaperManagerService;->extractColors(Lcom/android/server/wallpaper/WallpaperManagerService$WallpaperData;)V
@@ -36294,8 +39046,11 @@
 PLcom/android/server/wallpaper/WallpaperManagerService;->isWallpaperBackupEligible(II)Z
 HSPLcom/android/server/wallpaper/WallpaperManagerService;->isWallpaperSupported(Ljava/lang/String;)Z
 HSPLcom/android/server/wallpaper/WallpaperManagerService;->lambda$attachServiceLocked$6(Lcom/android/server/wallpaper/WallpaperManagerService$WallpaperConnection;Lcom/android/server/wallpaper/WallpaperManagerService$WallpaperData;Lcom/android/server/wallpaper/WallpaperManagerService$WallpaperConnection$DisplayConnector;)V
+PLcom/android/server/wallpaper/WallpaperManagerService;->lambda$attachServiceLocked$7(Lcom/android/server/wallpaper/WallpaperManagerService$WallpaperConnection;Lcom/android/server/wallpaper/WallpaperManagerService$WallpaperData;Lcom/android/server/wallpaper/WallpaperManagerService$WallpaperConnection$DisplayConnector;)V
 PLcom/android/server/wallpaper/WallpaperManagerService;->lambda$dump$7(Ljava/io/PrintWriter;Lcom/android/server/wallpaper/WallpaperManagerService$DisplayData;)V
+PLcom/android/server/wallpaper/WallpaperManagerService;->lambda$dump$8(Ljava/io/PrintWriter;Lcom/android/server/wallpaper/WallpaperManagerService$DisplayData;)V
 PLcom/android/server/wallpaper/WallpaperManagerService;->lambda$dump$8(Ljava/io/PrintWriter;Lcom/android/server/wallpaper/WallpaperManagerService$WallpaperConnection$DisplayConnector;)V
+PLcom/android/server/wallpaper/WallpaperManagerService;->lambda$dump$9(Ljava/io/PrintWriter;Lcom/android/server/wallpaper/WallpaperManagerService$WallpaperConnection$DisplayConnector;)V
 HSPLcom/android/server/wallpaper/WallpaperManagerService;->lambda$notifyWallpaperColorsChanged$0$WallpaperManagerService(Lcom/android/server/wallpaper/WallpaperManagerService$WallpaperData;ILcom/android/server/wallpaper/WallpaperManagerService$WallpaperConnection$DisplayConnector;)V
 PLcom/android/server/wallpaper/WallpaperManagerService;->lambda$onUnlockUser$4$WallpaperManagerService(I)V
 HSPLcom/android/server/wallpaper/WallpaperManagerService;->lambda$switchUser$5$WallpaperManagerService(Lcom/android/server/wallpaper/WallpaperManagerService$WallpaperData;Lcom/android/server/wallpaper/WallpaperManagerService$WallpaperData;)V
@@ -36463,7 +39218,7 @@
 HSPLcom/android/server/wm/-$$Lambda$ADNhW0r9Skcs9ezrOGURijI-lyQ;-><clinit>()V
 HSPLcom/android/server/wm/-$$Lambda$ADNhW0r9Skcs9ezrOGURijI-lyQ;-><init>()V
 HSPLcom/android/server/wm/-$$Lambda$ADNhW0r9Skcs9ezrOGURijI-lyQ;->accept(Ljava/lang/Object;Ljava/lang/Object;)V
-PLcom/android/server/wm/-$$Lambda$AccessibilityController$DisplayMagnifier$MagnifiedViewport$ZNyFGy-UXiWV1D2yZGvH-9qN0AA;-><init>(Lcom/android/server/wm/AccessibilityController$DisplayMagnifier$MagnifiedViewport;Landroid/util/SparseArray;)V
+HPLcom/android/server/wm/-$$Lambda$AccessibilityController$DisplayMagnifier$MagnifiedViewport$ZNyFGy-UXiWV1D2yZGvH-9qN0AA;-><init>(Lcom/android/server/wm/AccessibilityController$DisplayMagnifier$MagnifiedViewport;Landroid/util/SparseArray;)V
 HPLcom/android/server/wm/-$$Lambda$AccessibilityController$DisplayMagnifier$MagnifiedViewport$ZNyFGy-UXiWV1D2yZGvH-9qN0AA;->accept(Ljava/lang/Object;)V
 HPLcom/android/server/wm/-$$Lambda$AccessibilityController$WindowsForAccessibilityObserver$2C1tADzS58YZU_H5KqoEnZ2M57I;-><init>(Lcom/android/server/wm/AccessibilityController$WindowsForAccessibilityObserver;Lcom/android/server/wm/WindowState;Landroid/graphics/Matrix;Landroid/graphics/Region;)V
 HPLcom/android/server/wm/-$$Lambda$AccessibilityController$WindowsForAccessibilityObserver$2C1tADzS58YZU_H5KqoEnZ2M57I;->accept(Ljava/lang/Object;)V
@@ -36526,16 +39281,21 @@
 HSPLcom/android/server/wm/-$$Lambda$ActivityStack$0bNPw28X3N2biqQIdsnZuX7xaP4;-><clinit>()V
 HSPLcom/android/server/wm/-$$Lambda$ActivityStack$0bNPw28X3N2biqQIdsnZuX7xaP4;-><init>()V
 HSPLcom/android/server/wm/-$$Lambda$ActivityStack$0bNPw28X3N2biqQIdsnZuX7xaP4;->test(Ljava/lang/Object;)Z
+PLcom/android/server/wm/-$$Lambda$ActivityStack$1naDAoUMprftj-K2aF4LqsZgbmk;-><init>(Lcom/android/server/wm/ActivityStack;IZ)V
+PLcom/android/server/wm/-$$Lambda$ActivityStack$1naDAoUMprftj-K2aF4LqsZgbmk;->run()V
 PLcom/android/server/wm/-$$Lambda$ActivityStack$2g-Gmexz3kbCg6lRcnM6dKBTDYc;-><init>(Lcom/android/server/wm/ActivityStack;Lcom/android/server/wm/DisplayContent;Landroid/graphics/Rect;Landroid/graphics/Rect;IIZZI)V
 PLcom/android/server/wm/-$$Lambda$ActivityStack$2g-Gmexz3kbCg6lRcnM6dKBTDYc;->run()V
+PLcom/android/server/wm/-$$Lambda$ActivityStack$3E_4gGkb9HfbJl_9i9cAvvWs0ik;-><clinit>()V
+PLcom/android/server/wm/-$$Lambda$ActivityStack$3E_4gGkb9HfbJl_9i9cAvvWs0ik;-><init>()V
+PLcom/android/server/wm/-$$Lambda$ActivityStack$3E_4gGkb9HfbJl_9i9cAvvWs0ik;->test(Ljava/lang/Object;)Z
 PLcom/android/server/wm/-$$Lambda$ActivityStack$4eA3orAXlhwXqOJQ8sydb6lzW_4;-><clinit>()V
 PLcom/android/server/wm/-$$Lambda$ActivityStack$4eA3orAXlhwXqOJQ8sydb6lzW_4;-><init>()V
 PLcom/android/server/wm/-$$Lambda$ActivityStack$4eA3orAXlhwXqOJQ8sydb6lzW_4;->test(Ljava/lang/Object;)Z
 PLcom/android/server/wm/-$$Lambda$ActivityStack$5VekJIJoJIh5JMUz2PkEx2YRfmo;-><clinit>()V
 PLcom/android/server/wm/-$$Lambda$ActivityStack$5VekJIJoJIh5JMUz2PkEx2YRfmo;-><init>()V
 PLcom/android/server/wm/-$$Lambda$ActivityStack$5VekJIJoJIh5JMUz2PkEx2YRfmo;->accept(Ljava/lang/Object;)V
-PLcom/android/server/wm/-$$Lambda$ActivityStack$7heVv97BezfdSlHS0oo3lugbypI;-><init>(Lcom/android/server/wm/ActivityStack;IZZZZZ)V
-PLcom/android/server/wm/-$$Lambda$ActivityStack$7heVv97BezfdSlHS0oo3lugbypI;->run()V
+HPLcom/android/server/wm/-$$Lambda$ActivityStack$7heVv97BezfdSlHS0oo3lugbypI;-><init>(Lcom/android/server/wm/ActivityStack;IZZZZZ)V
+HPLcom/android/server/wm/-$$Lambda$ActivityStack$7heVv97BezfdSlHS0oo3lugbypI;->run()V
 PLcom/android/server/wm/-$$Lambda$ActivityStack$8rl8kos6nVh_HCoMLzbQatFXfQM;-><clinit>()V
 PLcom/android/server/wm/-$$Lambda$ActivityStack$8rl8kos6nVh_HCoMLzbQatFXfQM;-><init>()V
 PLcom/android/server/wm/-$$Lambda$ActivityStack$8rl8kos6nVh_HCoMLzbQatFXfQM;->accept(Ljava/lang/Object;)V
@@ -36544,6 +39304,9 @@
 PLcom/android/server/wm/-$$Lambda$ActivityStack$9LPSm49BYrWURHV0f_s9bnJYnVk;->test(Ljava/lang/Object;)Z
 PLcom/android/server/wm/-$$Lambda$ActivityStack$AQt7n1uNhFzkQj_jKv_v8YLYK-E;-><init>(Lcom/android/server/wm/ActivityStack;)V
 PLcom/android/server/wm/-$$Lambda$ActivityStack$AQt7n1uNhFzkQj_jKv_v8YLYK-E;->accept(Ljava/lang/Object;)V
+PLcom/android/server/wm/-$$Lambda$ActivityStack$AXNc-RXYBO_4RmK-wntPIZnu2BU;-><clinit>()V
+PLcom/android/server/wm/-$$Lambda$ActivityStack$AXNc-RXYBO_4RmK-wntPIZnu2BU;-><init>()V
+PLcom/android/server/wm/-$$Lambda$ActivityStack$AXNc-RXYBO_4RmK-wntPIZnu2BU;->test(Ljava/lang/Object;)Z
 PLcom/android/server/wm/-$$Lambda$ActivityStack$BmRNRfPY9eDs_h7lUVkDfKuzXrA;-><clinit>()V
 PLcom/android/server/wm/-$$Lambda$ActivityStack$BmRNRfPY9eDs_h7lUVkDfKuzXrA;-><init>()V
 HPLcom/android/server/wm/-$$Lambda$ActivityStack$BmRNRfPY9eDs_h7lUVkDfKuzXrA;->accept(Ljava/lang/Object;)V
@@ -36594,6 +39357,9 @@
 PLcom/android/server/wm/-$$Lambda$ActivityStack$W1rlXKcoaLb8UYskrF3gqMvOkRU;-><clinit>()V
 PLcom/android/server/wm/-$$Lambda$ActivityStack$W1rlXKcoaLb8UYskrF3gqMvOkRU;-><init>()V
 PLcom/android/server/wm/-$$Lambda$ActivityStack$W1rlXKcoaLb8UYskrF3gqMvOkRU;->accept(Ljava/lang/Object;)V
+PLcom/android/server/wm/-$$Lambda$ActivityStack$W663mOLtnXMNAh9tDlxDJVnMnlw;-><clinit>()V
+PLcom/android/server/wm/-$$Lambda$ActivityStack$W663mOLtnXMNAh9tDlxDJVnMnlw;-><init>()V
+PLcom/android/server/wm/-$$Lambda$ActivityStack$W663mOLtnXMNAh9tDlxDJVnMnlw;->accept(Ljava/lang/Object;)V
 PLcom/android/server/wm/-$$Lambda$ActivityStack$W67sd8AeAGx32tFIatx3GYvaD8c;-><init>(Lcom/android/server/wm/ActivityStack;)V
 PLcom/android/server/wm/-$$Lambda$ActivityStack$W67sd8AeAGx32tFIatx3GYvaD8c;->run()V
 PLcom/android/server/wm/-$$Lambda$ActivityStack$X9vss1g3clUg_jG-lx3LQEpL5fM;-><clinit>()V
@@ -36602,9 +39368,14 @@
 PLcom/android/server/wm/-$$Lambda$ActivityStack$YAQEcQUrLqR06xiJJApMvOPIxhg;-><clinit>()V
 PLcom/android/server/wm/-$$Lambda$ActivityStack$YAQEcQUrLqR06xiJJApMvOPIxhg;-><init>()V
 HPLcom/android/server/wm/-$$Lambda$ActivityStack$YAQEcQUrLqR06xiJJApMvOPIxhg;->accept(Ljava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/wm/-$$Lambda$ActivityStack$YIUBC0Vum7KZ2D2K8E2QiIjsRcU;-><clinit>()V
+PLcom/android/server/wm/-$$Lambda$ActivityStack$YIUBC0Vum7KZ2D2K8E2QiIjsRcU;-><init>()V
+PLcom/android/server/wm/-$$Lambda$ActivityStack$YIUBC0Vum7KZ2D2K8E2QiIjsRcU;->accept(Ljava/lang/Object;)V
 PLcom/android/server/wm/-$$Lambda$ActivityStack$YJeneLrOvq3GBnNOpP3Jg1nkLcE;-><clinit>()V
 PLcom/android/server/wm/-$$Lambda$ActivityStack$YJeneLrOvq3GBnNOpP3Jg1nkLcE;-><init>()V
 HPLcom/android/server/wm/-$$Lambda$ActivityStack$YJeneLrOvq3GBnNOpP3Jg1nkLcE;->accept(Ljava/lang/Object;)V
+PLcom/android/server/wm/-$$Lambda$ActivityStack$YSl94_bUS3JseXf6G9nDhP6JXog;-><init>(Landroid/content/ComponentName;)V
+PLcom/android/server/wm/-$$Lambda$ActivityStack$YSl94_bUS3JseXf6G9nDhP6JXog;->test(Ljava/lang/Object;)Z
 PLcom/android/server/wm/-$$Lambda$ActivityStack$YtJbVURmslxye4JS4EFo6X31Vv0;-><clinit>()V
 PLcom/android/server/wm/-$$Lambda$ActivityStack$YtJbVURmslxye4JS4EFo6X31Vv0;-><init>()V
 PLcom/android/server/wm/-$$Lambda$ActivityStack$YtJbVURmslxye4JS4EFo6X31Vv0;->accept(Ljava/lang/Object;)V
@@ -36622,17 +39393,30 @@
 PLcom/android/server/wm/-$$Lambda$ActivityStack$dhfbladKtxXwwdCS2dFdAfUfBN4;-><clinit>()V
 PLcom/android/server/wm/-$$Lambda$ActivityStack$dhfbladKtxXwwdCS2dFdAfUfBN4;-><init>()V
 PLcom/android/server/wm/-$$Lambda$ActivityStack$dhfbladKtxXwwdCS2dFdAfUfBN4;->accept(Ljava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/wm/-$$Lambda$ActivityStack$h_1-4reDIGBYw21ijNWBS1zMxGU;-><init>(Lcom/android/server/wm/ActivityStack;)V
+PLcom/android/server/wm/-$$Lambda$ActivityStack$h_1-4reDIGBYw21ijNWBS1zMxGU;->run()V
 PLcom/android/server/wm/-$$Lambda$ActivityStack$n-w1s4z47M3zxF8atJ8fDCrw2CA;-><init>(Lcom/android/server/wm/ActivityStack;Lcom/android/server/wm/BoundsAnimationController;)V
 PLcom/android/server/wm/-$$Lambda$ActivityStack$n-w1s4z47M3zxF8atJ8fDCrw2CA;->run()V
+PLcom/android/server/wm/-$$Lambda$ActivityStack$n6lnB087ZFxNYV3rhtRTHATdcS8;-><init>(Landroid/content/ComponentName;)V
+PLcom/android/server/wm/-$$Lambda$ActivityStack$n6lnB087ZFxNYV3rhtRTHATdcS8;->test(Ljava/lang/Object;)Z
 PLcom/android/server/wm/-$$Lambda$ActivityStack$nvWNVaQ4kkXHI7BamR6vzb4wwJU;-><clinit>()V
 PLcom/android/server/wm/-$$Lambda$ActivityStack$nvWNVaQ4kkXHI7BamR6vzb4wwJU;-><init>()V
+PLcom/android/server/wm/-$$Lambda$ActivityStack$nvWNVaQ4kkXHI7BamR6vzb4wwJU;->test(Ljava/lang/Object;)Z
+PLcom/android/server/wm/-$$Lambda$ActivityStack$qkCAzDJZvvr0EXPICXZPcjlgp_o;-><init>(Lcom/android/server/wm/ActivityRecord;[I[Landroid/content/Intent;)V
+PLcom/android/server/wm/-$$Lambda$ActivityStack$qkCAzDJZvvr0EXPICXZPcjlgp_o;->apply(Ljava/lang/Object;)Ljava/lang/Object;
 PLcom/android/server/wm/-$$Lambda$ActivityStack$vLTEw6nwtjcZ-ZyMktx8L5MR_TA;-><init>(Landroid/content/ComponentName;)V
 PLcom/android/server/wm/-$$Lambda$ActivityStack$vLTEw6nwtjcZ-ZyMktx8L5MR_TA;->test(Ljava/lang/Object;)Z
+HPLcom/android/server/wm/-$$Lambda$ActivityStack$wJQPexdNStkdyCgh9H-D2te6pWw;-><init>(ZLjava/io/PrintWriter;Ljava/io/FileDescriptor;ZZLjava/lang/String;)V
+HPLcom/android/server/wm/-$$Lambda$ActivityStack$wJQPexdNStkdyCgh9H-D2te6pWw;->accept(Ljava/lang/Object;)V
+PLcom/android/server/wm/-$$Lambda$ActivityStack$wkB3-w53KH3phbITqwbrFwbXJWU;-><init>(Lcom/android/server/wm/ActivityRecord;[I[Landroid/content/Intent;)V
+PLcom/android/server/wm/-$$Lambda$ActivityStack$wkB3-w53KH3phbITqwbrFwbXJWU;->apply(Ljava/lang/Object;)Ljava/lang/Object;
 PLcom/android/server/wm/-$$Lambda$ActivityStack$xrtErRAEnS21CI3h4SKc_WzJFDA;-><clinit>()V
 PLcom/android/server/wm/-$$Lambda$ActivityStack$xrtErRAEnS21CI3h4SKc_WzJFDA;-><init>()V
 HPLcom/android/server/wm/-$$Lambda$ActivityStack$xrtErRAEnS21CI3h4SKc_WzJFDA;->test(Ljava/lang/Object;)Z
-PLcom/android/server/wm/-$$Lambda$ActivityStack$yjID4CziB85rCK56sUtW6Ulw2eI;-><init>(ZLjava/io/PrintWriter;Ljava/io/FileDescriptor;ZZLjava/lang/String;)V
-PLcom/android/server/wm/-$$Lambda$ActivityStack$yjID4CziB85rCK56sUtW6Ulw2eI;->accept(Ljava/lang/Object;)V
+PLcom/android/server/wm/-$$Lambda$ActivityStack$yggURMk9blCv0pLzL-HyhfGSMDQ;-><init>(Lcom/android/server/wm/ActivityStack;)V
+PLcom/android/server/wm/-$$Lambda$ActivityStack$yggURMk9blCv0pLzL-HyhfGSMDQ;->accept(Ljava/lang/Object;)V
+HPLcom/android/server/wm/-$$Lambda$ActivityStack$yjID4CziB85rCK56sUtW6Ulw2eI;-><init>(ZLjava/io/PrintWriter;Ljava/io/FileDescriptor;ZZLjava/lang/String;)V
+HPLcom/android/server/wm/-$$Lambda$ActivityStack$yjID4CziB85rCK56sUtW6Ulw2eI;->accept(Ljava/lang/Object;)V
 PLcom/android/server/wm/-$$Lambda$ActivityStackSupervisor$0u1RcpeZ6m0BHDGGv8EXroS3KyE;-><init>(Lcom/android/server/wm/ActivityStackSupervisor;Lcom/android/server/wm/ActivityStack;)V
 PLcom/android/server/wm/-$$Lambda$ActivityStackSupervisor$0u1RcpeZ6m0BHDGGv8EXroS3KyE;->run()V
 PLcom/android/server/wm/-$$Lambda$ActivityStackSupervisor$28Zuzbi6usdgbDcOi8hrJg6nZO0;-><init>(Lcom/android/server/wm/ActivityStackSupervisor;)V
@@ -36648,6 +39432,8 @@
 PLcom/android/server/wm/-$$Lambda$ActivityStackSupervisor$MoveTaskToFullscreenHelper$n0VOwWNM3mud17SnHip7XMiWlWE;->accept(Ljava/lang/Object;Ljava/lang/Object;)V
 PLcom/android/server/wm/-$$Lambda$ActivityStackSupervisor$PKLpVoHaca7ZAS9IjUCkoGIBtDw;-><init>(Lcom/android/server/wm/ActivityStackSupervisor;Lcom/android/server/wm/ActivityStack;Z)V
 PLcom/android/server/wm/-$$Lambda$ActivityStackSupervisor$PKLpVoHaca7ZAS9IjUCkoGIBtDw;->run()V
+PLcom/android/server/wm/-$$Lambda$ActivityStackSupervisor$UyRHhEK51F9dKhfp0wUGjTncdyo;-><init>(Lcom/android/server/wm/ActivityStackSupervisor;Lcom/android/server/wm/ActivityStack;)V
+PLcom/android/server/wm/-$$Lambda$ActivityStackSupervisor$UyRHhEK51F9dKhfp0wUGjTncdyo;->run()V
 HSPLcom/android/server/wm/-$$Lambda$ActivityStackSupervisor$iNb1-M_lYtbDycAXODgbDkmI9ww;-><init>(Lcom/android/server/wm/ActivityStackSupervisor;)V
 HSPLcom/android/server/wm/-$$Lambda$ActivityStackSupervisor$iNb1-M_lYtbDycAXODgbDkmI9ww;->run()V
 PLcom/android/server/wm/-$$Lambda$ActivityStackSupervisor$mLKHIIzkTAK9QSlSxia8-84y15M;-><clinit>()V
@@ -36672,14 +39458,20 @@
 PLcom/android/server/wm/-$$Lambda$ActivityTaskManagerService$U6g1UdnOPnEF9wX1OTm9nKVXY5k;->accept(Ljava/lang/Object;Ljava/lang/Object;)V
 HPLcom/android/server/wm/-$$Lambda$ActivityTaskManagerService$Uli7s8UWTEj0IpBUtoST5bmgvKk;-><init>(Lcom/android/server/wm/ActivityTaskManagerService;Z)V
 HPLcom/android/server/wm/-$$Lambda$ActivityTaskManagerService$Uli7s8UWTEj0IpBUtoST5bmgvKk;->run()V
+PLcom/android/server/wm/-$$Lambda$ActivityTaskManagerService$hgT7_BsCohDVg6qQfaw5Xpx0-yQ;-><init>(Lcom/android/server/wm/ActivityTaskManagerService;ZZ)V
+PLcom/android/server/wm/-$$Lambda$ActivityTaskManagerService$hgT7_BsCohDVg6qQfaw5Xpx0-yQ;->run()V
 HSPLcom/android/server/wm/-$$Lambda$ActivityTaskManagerService$iduseKQrjIWQYD0hJ8Q5DMmuSfE;-><init>(Lcom/android/server/wm/ActivityTaskManagerService;Z)V
 HSPLcom/android/server/wm/-$$Lambda$ActivityTaskManagerService$iduseKQrjIWQYD0hJ8Q5DMmuSfE;->run()V
 PLcom/android/server/wm/-$$Lambda$ActivityTaskManagerService$js0zprxhKzo_Mx9ozR8logP_1-c;-><init>(Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityRecord;Landroid/app/PictureInPictureParams;)V
 PLcom/android/server/wm/-$$Lambda$ActivityTaskManagerService$js0zprxhKzo_Mx9ozR8logP_1-c;->run()V
+PLcom/android/server/wm/-$$Lambda$ActivityTaskManagerService$nuSrfdXdOXcutw3SV8Ualpreu30;-><init>(Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityRecord;)V
+HPLcom/android/server/wm/-$$Lambda$ActivityTaskManagerService$nuSrfdXdOXcutw3SV8Ualpreu30;->run()V
 HSPLcom/android/server/wm/-$$Lambda$ActivityTaskManagerService$oP6xxIfnD4kb4JN7aSJU073ULR4;-><init>(Lcom/android/server/wm/ActivityTaskManagerService;ZZ)V
 HSPLcom/android/server/wm/-$$Lambda$ActivityTaskManagerService$oP6xxIfnD4kb4JN7aSJU073ULR4;->run()V
 HSPLcom/android/server/wm/-$$Lambda$ActivityTaskManagerService$p4I6RZJqLXjaEjdISFyNzjAe4HE;-><init>(Lcom/android/server/wm/ActivityTaskManagerService;ZLcom/android/server/wm/ActivityRecord;)V
 HSPLcom/android/server/wm/-$$Lambda$ActivityTaskManagerService$p4I6RZJqLXjaEjdISFyNzjAe4HE;->run()V
+PLcom/android/server/wm/-$$Lambda$ActivityTaskManagerService$yEgPBZves-gjR6r_sca6FAEYeiA;-><init>(Lcom/android/server/wm/ActivityTaskManagerService;)V
+HPLcom/android/server/wm/-$$Lambda$ActivityTaskManagerService$yEgPBZves-gjR6r_sca6FAEYeiA;->run()V
 PLcom/android/server/wm/-$$Lambda$ActivityTaskManagerService$yP9TbBmrgQ4lrgcxb-8oL1pBAs4;-><clinit>()V
 PLcom/android/server/wm/-$$Lambda$ActivityTaskManagerService$yP9TbBmrgQ4lrgcxb-8oL1pBAs4;-><init>()V
 PLcom/android/server/wm/-$$Lambda$ActivityTaskManagerService$yP9TbBmrgQ4lrgcxb-8oL1pBAs4;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
@@ -36742,11 +39534,16 @@
 PLcom/android/server/wm/-$$Lambda$Dimmer$DimState$QYvwJex5H10MFMe0LEzEUs1b2G0;->run()V
 HPLcom/android/server/wm/-$$Lambda$Dimmer$DimState$wU1YjYaM1_enRLsRLQ25SnC1ECw;-><init>(Lcom/android/server/wm/Dimmer$DimState;Lcom/android/server/wm/Dimmer$DimAnimatable;)V
 HPLcom/android/server/wm/-$$Lambda$Dimmer$DimState$wU1YjYaM1_enRLsRLQ25SnC1ECw;->onAnimationFinished(ILcom/android/server/wm/AnimationAdapter;)V
+PLcom/android/server/wm/-$$Lambda$DisplayArea$Root$FFTAJJ7j74rtyQzx7LluB65mKYM;-><clinit>()V
+PLcom/android/server/wm/-$$Lambda$DisplayArea$Root$FFTAJJ7j74rtyQzx7LluB65mKYM;-><init>()V
+HPLcom/android/server/wm/-$$Lambda$DisplayArea$Root$FFTAJJ7j74rtyQzx7LluB65mKYM;->apply(Ljava/lang/Object;)Ljava/lang/Object;
 HSPLcom/android/server/wm/-$$Lambda$DisplayArea$Tokens$m3rhEbIWQl888W_2uGBIkkXLdlA;-><init>(Lcom/android/server/wm/DisplayArea$Tokens;)V
 HPLcom/android/server/wm/-$$Lambda$DisplayArea$Tokens$m3rhEbIWQl888W_2uGBIkkXLdlA;->test(Ljava/lang/Object;)Z
 HSPLcom/android/server/wm/-$$Lambda$DisplayAreaPolicyBuilder$PendingArea$3ZZ3VghJFXPK9kfKPSTf_9BJZCQ;-><clinit>()V
 HSPLcom/android/server/wm/-$$Lambda$DisplayAreaPolicyBuilder$PendingArea$3ZZ3VghJFXPK9kfKPSTf_9BJZCQ;-><init>()V
 HSPLcom/android/server/wm/-$$Lambda$DisplayAreaPolicyBuilder$PendingArea$3ZZ3VghJFXPK9kfKPSTf_9BJZCQ;->applyAsInt(Ljava/lang/Object;)I
+PLcom/android/server/wm/-$$Lambda$DisplayContent$-lwLvC_wAU5sgJoEjpK20Cc7yDo;-><init>(Lcom/android/server/wm/DisplayContent;Z)V
+HPLcom/android/server/wm/-$$Lambda$DisplayContent$-lwLvC_wAU5sgJoEjpK20Cc7yDo;->accept(Ljava/lang/Object;)V
 HPLcom/android/server/wm/-$$Lambda$DisplayContent$-t02M5j-NY8t_HMWggKym0SrI5k;-><init>([I[ILandroid/graphics/Region;)V
 HPLcom/android/server/wm/-$$Lambda$DisplayContent$-t02M5j-NY8t_HMWggKym0SrI5k;->accept(Ljava/lang/Object;)V
 HPLcom/android/server/wm/-$$Lambda$DisplayContent$0DHYqZExqV37Iiw4M0GSqxCijHE;-><init>(Lcom/android/server/wm/DisplayContent;Landroid/graphics/Region;Landroid/graphics/Region;Landroid/graphics/Region;[ILandroid/graphics/Region;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Region;)V
@@ -36757,8 +39554,12 @@
 HPLcom/android/server/wm/-$$Lambda$DisplayContent$0yxrqH9eGY2qTjH1u_BvaVrXCSA;->accept(Ljava/lang/Object;)V
 HPLcom/android/server/wm/-$$Lambda$DisplayContent$2VlyMN8z2sOPqE9-yf-z3-peRMI;-><init>(I)V
 HPLcom/android/server/wm/-$$Lambda$DisplayContent$2VlyMN8z2sOPqE9-yf-z3-peRMI;->test(Ljava/lang/Object;)Z
+PLcom/android/server/wm/-$$Lambda$DisplayContent$471eZ2Y9qAx45FtnBviGRqYPWPc;-><init>(Lcom/android/server/wm/DisplayContent;I)V
+PLcom/android/server/wm/-$$Lambda$DisplayContent$471eZ2Y9qAx45FtnBviGRqYPWPc;->accept(Ljava/lang/Object;)V
 PLcom/android/server/wm/-$$Lambda$DisplayContent$4EwMMjZ5_EoQtEZ4VPJm9XUauJY;-><init>(Lcom/android/server/policy/WindowManagerPolicy;ZZZ)V
 HPLcom/android/server/wm/-$$Lambda$DisplayContent$4EwMMjZ5_EoQtEZ4VPJm9XUauJY;->accept(Ljava/lang/Object;)V
+PLcom/android/server/wm/-$$Lambda$DisplayContent$6aFyCnAfgcKG9bc7CweYPJnHxo4;-><init>(Lcom/android/server/wm/DisplayContent;II)V
+PLcom/android/server/wm/-$$Lambda$DisplayContent$6aFyCnAfgcKG9bc7CweYPJnHxo4;->run()V
 PLcom/android/server/wm/-$$Lambda$DisplayContent$7Z9gsguOLtfXssJUALjgEsOLZoE;-><clinit>()V
 PLcom/android/server/wm/-$$Lambda$DisplayContent$7Z9gsguOLtfXssJUALjgEsOLZoE;-><init>()V
 HPLcom/android/server/wm/-$$Lambda$DisplayContent$7Z9gsguOLtfXssJUALjgEsOLZoE;->test(Ljava/lang/Object;)Z
@@ -36790,6 +39591,8 @@
 HPLcom/android/server/wm/-$$Lambda$DisplayContent$JYsrGdifTPH6ASJDC3B9YWMD2pw;->test(Ljava/lang/Object;)Z
 HSPLcom/android/server/wm/-$$Lambda$DisplayContent$JibsaX4YnJd0ta_wiDDdSp-PjQk;-><init>(Lcom/android/server/wm/DisplayContent;)V
 HSPLcom/android/server/wm/-$$Lambda$DisplayContent$JibsaX4YnJd0ta_wiDDdSp-PjQk;->accept(Ljava/lang/Object;)V
+PLcom/android/server/wm/-$$Lambda$DisplayContent$L4wfLIQKzeKO_85fKAn10tvgsIo;-><init>(Lcom/android/server/wm/DisplayContent;II)V
+PLcom/android/server/wm/-$$Lambda$DisplayContent$L4wfLIQKzeKO_85fKAn10tvgsIo;->run()V
 PLcom/android/server/wm/-$$Lambda$DisplayContent$MTOrQ0uso5p3wixTLmDsYyck6h4;-><clinit>()V
 PLcom/android/server/wm/-$$Lambda$DisplayContent$MTOrQ0uso5p3wixTLmDsYyck6h4;-><init>()V
 HPLcom/android/server/wm/-$$Lambda$DisplayContent$MTOrQ0uso5p3wixTLmDsYyck6h4;->test(Ljava/lang/Object;)Z
@@ -36828,6 +39631,9 @@
 HPLcom/android/server/wm/-$$Lambda$DisplayContent$_XfE1uZ9VUv6i0SxWUvqu69FNb4;->test(Ljava/lang/Object;)Z
 HSPLcom/android/server/wm/-$$Lambda$DisplayContent$a4EkCBfpZNIl1xfYgm2ktgndF8w;-><init>(Lcom/android/server/wm/DisplayContent;)V
 HPLcom/android/server/wm/-$$Lambda$DisplayContent$a4EkCBfpZNIl1xfYgm2ktgndF8w;->apply(Ljava/lang/Object;)Z
+PLcom/android/server/wm/-$$Lambda$DisplayContent$bdlFI0H2lliPVl6xvIwtAprz6cM;-><clinit>()V
+PLcom/android/server/wm/-$$Lambda$DisplayContent$bdlFI0H2lliPVl6xvIwtAprz6cM;-><init>()V
+PLcom/android/server/wm/-$$Lambda$DisplayContent$bdlFI0H2lliPVl6xvIwtAprz6cM;->accept(Ljava/lang/Object;)V
 HSPLcom/android/server/wm/-$$Lambda$DisplayContent$cDcvMzGxc6XW13Q8FrU5X4DagqE;-><clinit>()V
 HSPLcom/android/server/wm/-$$Lambda$DisplayContent$cDcvMzGxc6XW13Q8FrU5X4DagqE;-><init>()V
 HSPLcom/android/server/wm/-$$Lambda$DisplayContent$cDcvMzGxc6XW13Q8FrU5X4DagqE;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
@@ -36841,6 +39647,8 @@
 HSPLcom/android/server/wm/-$$Lambda$DisplayContent$fiC19lMy-d_-rvza7hhOSw6bOM8;->compute(Ljava/lang/Object;I)Ljava/lang/Object;
 HPLcom/android/server/wm/-$$Lambda$DisplayContent$gpAoT7pBNdi6jYEHs_L3kzaRF0g;-><init>([I[ILandroid/graphics/Region;)V
 HPLcom/android/server/wm/-$$Lambda$DisplayContent$gpAoT7pBNdi6jYEHs_L3kzaRF0g;->accept(Ljava/lang/Object;)V
+PLcom/android/server/wm/-$$Lambda$DisplayContent$hR9cqmg13mqjX0eTykdAu3LKn8U;-><init>(Lcom/android/server/wm/DisplayContent;II)V
+PLcom/android/server/wm/-$$Lambda$DisplayContent$hR9cqmg13mqjX0eTykdAu3LKn8U;->run()V
 HSPLcom/android/server/wm/-$$Lambda$DisplayContent$hRKjZwmneu0T85LNNY6_Zcs4gKM;-><init>(Lcom/android/server/wm/DisplayContent;)V
 HSPLcom/android/server/wm/-$$Lambda$DisplayContent$hRKjZwmneu0T85LNNY6_Zcs4gKM;->accept(Ljava/lang/Object;)V
 PLcom/android/server/wm/-$$Lambda$DisplayContent$k7ctHGhg6DCeupTBZO8cyEJDjLM;-><init>(Lcom/android/server/wm/DisplayContent;Z)V
@@ -36857,6 +39665,8 @@
 HSPLcom/android/server/wm/-$$Lambda$DisplayContent$qT01Aq6xt_ZOs86A1yDQe-qmPFQ;->accept(Ljava/lang/Object;)V
 HSPLcom/android/server/wm/-$$Lambda$DisplayContent$qxt4izS31fb0LF2uo_OF9DMa7gc;-><init>(Lcom/android/server/wm/DisplayContent;)V
 HSPLcom/android/server/wm/-$$Lambda$DisplayContent$qxt4izS31fb0LF2uo_OF9DMa7gc;->accept(Ljava/lang/Object;)V
+PLcom/android/server/wm/-$$Lambda$DisplayContent$rrIyMuu-GcQqYYNiuxrgp7_xvhQ;-><init>(Landroid/view/SurfaceControl$Transaction;IIZ)V
+HPLcom/android/server/wm/-$$Lambda$DisplayContent$rrIyMuu-GcQqYYNiuxrgp7_xvhQ;->accept(Ljava/lang/Object;)V
 PLcom/android/server/wm/-$$Lambda$DisplayContent$sYPOy6TL-QiWuU_jcEHYn4HeFnQ;-><init>(II)V
 HPLcom/android/server/wm/-$$Lambda$DisplayContent$sYPOy6TL-QiWuU_jcEHYn4HeFnQ;->accept(Ljava/lang/Object;)V
 HPLcom/android/server/wm/-$$Lambda$DisplayContent$vehcSAr5hQ3Q5gWBUB0K8yByHXQ;-><init>(Lcom/android/server/wm/DisplayContent;Z)V
@@ -36870,16 +39680,24 @@
 PLcom/android/server/wm/-$$Lambda$DisplayPolicy$-jer63nl4BagHUaTYzlDJxk8xIU;-><clinit>()V
 PLcom/android/server/wm/-$$Lambda$DisplayPolicy$-jer63nl4BagHUaTYzlDJxk8xIU;-><init>()V
 HPLcom/android/server/wm/-$$Lambda$DisplayPolicy$-jer63nl4BagHUaTYzlDJxk8xIU;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/wm/-$$Lambda$DisplayPolicy$065TFLjrw5w04yG_sIUv_3nsSrA;-><init>(Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayFrames;I)V
+PLcom/android/server/wm/-$$Lambda$DisplayPolicy$065TFLjrw5w04yG_sIUv_3nsSrA;->run()V
 PLcom/android/server/wm/-$$Lambda$DisplayPolicy$3MnyIKSHFLqhfUifWEQPNp_-J6A;-><init>(Lcom/android/server/wm/DisplayPolicy;)V
 HPLcom/android/server/wm/-$$Lambda$DisplayPolicy$3MnyIKSHFLqhfUifWEQPNp_-J6A;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
 PLcom/android/server/wm/-$$Lambda$DisplayPolicy$9Q7foUL8MStILLFmJNfN48-WaJM;-><init>(Lcom/android/server/wm/DisplayPolicy;)V
 PLcom/android/server/wm/-$$Lambda$DisplayPolicy$9Q7foUL8MStILLFmJNfN48-WaJM;->createInputEventReceiver(Landroid/view/InputChannel;Landroid/os/Looper;)Landroid/view/InputEventReceiver;
+PLcom/android/server/wm/-$$Lambda$DisplayPolicy$9vMdRW11iw1rRp_fzUkWacwvib0;-><init>(I)V
+HPLcom/android/server/wm/-$$Lambda$DisplayPolicy$9vMdRW11iw1rRp_fzUkWacwvib0;->apply(Ljava/lang/Object;)Z
 PLcom/android/server/wm/-$$Lambda$DisplayPolicy$AdQlGK4do0LfpQJmOnIuKqDwp0Y;-><init>(Lcom/android/server/wm/DisplayPolicy;)V
 HPLcom/android/server/wm/-$$Lambda$DisplayPolicy$AdQlGK4do0LfpQJmOnIuKqDwp0Y;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
 HSPLcom/android/server/wm/-$$Lambda$DisplayPolicy$DaI-u7gKDqJtPizmW-_eQ3hO-BU;-><init>(Lcom/android/server/wm/DisplayPolicy;ILjava/lang/String;Landroid/util/Pair;I[Lcom/android/internal/view/AppearanceRegion;ZZZ)V
 HSPLcom/android/server/wm/-$$Lambda$DisplayPolicy$DaI-u7gKDqJtPizmW-_eQ3hO-BU;->run()V
+PLcom/android/server/wm/-$$Lambda$DisplayPolicy$E7j9SKAujlVEAp0eeRWet1AUkHs;-><init>(Lcom/android/server/wm/DisplayPolicy;)V
+PLcom/android/server/wm/-$$Lambda$DisplayPolicy$E7j9SKAujlVEAp0eeRWet1AUkHs;->run()V
 PLcom/android/server/wm/-$$Lambda$DisplayPolicy$FpQuLkFb2EnHvk4Uzhr9G5Rn_xI;-><init>(Lcom/android/server/wm/DisplayPolicy;)V
 PLcom/android/server/wm/-$$Lambda$DisplayPolicy$FpQuLkFb2EnHvk4Uzhr9G5Rn_xI;->createInputEventReceiver(Landroid/view/InputChannel;Landroid/os/Looper;)Landroid/view/InputEventReceiver;
+PLcom/android/server/wm/-$$Lambda$DisplayPolicy$FrqQUcKiL3X6Pe1CkPSji1LFTNc;-><init>(Lcom/android/server/wm/DisplayPolicy;)V
+PLcom/android/server/wm/-$$Lambda$DisplayPolicy$FrqQUcKiL3X6Pe1CkPSji1LFTNc;->run()V
 HPLcom/android/server/wm/-$$Lambda$DisplayPolicy$HbdRZfPpJ53Wnk7_Ueb0ycyz_AQ;-><init>(Lcom/android/server/wm/DisplayPolicy;ILjava/lang/String;Landroid/util/Pair;I[Lcom/android/internal/view/AppearanceRegion;ZZZ)V
 HPLcom/android/server/wm/-$$Lambda$DisplayPolicy$HbdRZfPpJ53Wnk7_Ueb0ycyz_AQ;->run()V
 PLcom/android/server/wm/-$$Lambda$DisplayPolicy$IOyP8YVRG92tn9u1muYWZgBbgc0;-><init>(Lcom/android/server/wm/DisplayPolicy;)V
@@ -36890,16 +39708,27 @@
 HPLcom/android/server/wm/-$$Lambda$DisplayPolicy$LFEaXRr2IF3nhPJdP5h3swIhnus;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
 PLcom/android/server/wm/-$$Lambda$DisplayPolicy$LkHee4mchNXMwNt7HLgsMzHofeE;-><init>(Lcom/android/server/wm/DisplayPolicy;)V
 HPLcom/android/server/wm/-$$Lambda$DisplayPolicy$LkHee4mchNXMwNt7HLgsMzHofeE;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/wm/-$$Lambda$DisplayPolicy$NcnTU5Z6X56cfSOOwc98WQ4IVv8;-><init>(Lcom/android/server/wm/DisplayPolicy;)V
+HPLcom/android/server/wm/-$$Lambda$DisplayPolicy$NcnTU5Z6X56cfSOOwc98WQ4IVv8;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
 PLcom/android/server/wm/-$$Lambda$DisplayPolicy$P8D337iYIcX04InNbwQCJWD0nmU;-><init>(Lcom/android/server/wm/DisplayPolicy;)V
 PLcom/android/server/wm/-$$Lambda$DisplayPolicy$P8D337iYIcX04InNbwQCJWD0nmU;->run()V
 PLcom/android/server/wm/-$$Lambda$DisplayPolicy$QDPgWUhyEOraWnf6a-u4mTBttdw;-><init>(Lcom/android/server/wm/DisplayPolicy;)V
 HPLcom/android/server/wm/-$$Lambda$DisplayPolicy$QDPgWUhyEOraWnf6a-u4mTBttdw;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
 PLcom/android/server/wm/-$$Lambda$DisplayPolicy$XssW_Qm0L7CsznkQYKBfWrF7PU4;-><init>(Lcom/android/server/wm/DisplayPolicy;)V
 PLcom/android/server/wm/-$$Lambda$DisplayPolicy$XssW_Qm0L7CsznkQYKBfWrF7PU4;->run()V
+PLcom/android/server/wm/-$$Lambda$DisplayPolicy$_FEXboPObSj41eBmuQropgw92iw;-><clinit>()V
+PLcom/android/server/wm/-$$Lambda$DisplayPolicy$_FEXboPObSj41eBmuQropgw92iw;-><init>()V
+HPLcom/android/server/wm/-$$Lambda$DisplayPolicy$_FEXboPObSj41eBmuQropgw92iw;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
 HSPLcom/android/server/wm/-$$Lambda$DisplayPolicy$_FsvHpVUi-gbWmSpT009cJNNmgM;-><init>(Lcom/android/server/wm/DisplayPolicy;)V
+PLcom/android/server/wm/-$$Lambda$DisplayPolicy$_TMMRrVRogk2OR6_DeTRPAotpfk;-><init>(Lcom/android/server/wm/DisplayPolicy;)V
+PLcom/android/server/wm/-$$Lambda$DisplayPolicy$_TMMRrVRogk2OR6_DeTRPAotpfk;->createInputEventReceiver(Landroid/view/InputChannel;Landroid/os/Looper;)Landroid/view/InputEventReceiver;
 PLcom/android/server/wm/-$$Lambda$DisplayPolicy$bT9mjfT_DJVx_BBfkRPXHf6mfWE;-><init>(Lcom/android/server/wm/DisplayPolicy;)V
 PLcom/android/server/wm/-$$Lambda$DisplayPolicy$bT9mjfT_DJVx_BBfkRPXHf6mfWE;->createInputEventReceiver(Landroid/view/InputChannel;Landroid/os/Looper;)Landroid/view/InputEventReceiver;
+PLcom/android/server/wm/-$$Lambda$DisplayPolicy$cEnuxDxbBynzDo57utSyr9Sq49I;-><init>(Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayFrames;)V
+PLcom/android/server/wm/-$$Lambda$DisplayPolicy$cEnuxDxbBynzDo57utSyr9Sq49I;->run()V
 HSPLcom/android/server/wm/-$$Lambda$DisplayPolicy$j3sY1jb4WFF_F3wOT9D2fB2mOts;-><init>(Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/WindowManagerService;I)V
+HPLcom/android/server/wm/-$$Lambda$DisplayPolicy$kBGaoM81dIzHnQJw_w2MKNDiHow;-><init>(Lcom/android/server/wm/DisplayPolicy;)V
+HPLcom/android/server/wm/-$$Lambda$DisplayPolicy$kBGaoM81dIzHnQJw_w2MKNDiHow;->createInputEventReceiver(Landroid/view/InputChannel;Landroid/os/Looper;)Landroid/view/InputEventReceiver;
 PLcom/android/server/wm/-$$Lambda$DisplayPolicy$m-UPXUZKrPpeFUjrauzoJMNbYjM;-><init>(Lcom/android/server/wm/DisplayPolicy;)V
 PLcom/android/server/wm/-$$Lambda$DisplayPolicy$m-UPXUZKrPpeFUjrauzoJMNbYjM;->run()V
 HPLcom/android/server/wm/-$$Lambda$DisplayPolicy$nrBrmKRLvJQjdv_P6oPT7D0GGW8;-><init>(Lcom/android/server/wm/DisplayPolicy;ILjava/lang/String;Landroid/util/Pair;I[Lcom/android/internal/view/AppearanceRegion;ZZZ)V
@@ -36912,6 +39741,11 @@
 PLcom/android/server/wm/-$$Lambda$DisplayPolicy$rkGhPuV8zWnPuCUXhzLY40zhjLk;->createInputEventReceiver(Landroid/view/InputChannel;Landroid/os/Looper;)Landroid/view/InputEventReceiver;
 HSPLcom/android/server/wm/-$$Lambda$DisplayPolicy$wrdG81IaCZoCL0YqumBunZu5DyM;-><init>(Lcom/android/server/wm/DisplayPolicy;ILjava/lang/String;Landroid/util/Pair;I[Lcom/android/internal/view/AppearanceRegion;ZZZ)V
 HSPLcom/android/server/wm/-$$Lambda$DisplayPolicy$wrdG81IaCZoCL0YqumBunZu5DyM;->run()V
+HPLcom/android/server/wm/-$$Lambda$DisplayPolicy$wuub-Dyl5Xosh1PZUGJaQMy9r5Y;-><init>(Lcom/android/server/wm/DisplayPolicy;ILjava/lang/String;Landroid/util/Pair;I[Lcom/android/internal/view/AppearanceRegion;ZZZ)V
+HPLcom/android/server/wm/-$$Lambda$DisplayPolicy$wuub-Dyl5Xosh1PZUGJaQMy9r5Y;->run()V
+PLcom/android/server/wm/-$$Lambda$DisplayRotation$2$37vRmD77aVmzN2ixs0KjlN8wUX4;-><clinit>()V
+PLcom/android/server/wm/-$$Lambda$DisplayRotation$2$37vRmD77aVmzN2ixs0KjlN8wUX4;-><init>()V
+HPLcom/android/server/wm/-$$Lambda$DisplayRotation$2$37vRmD77aVmzN2ixs0KjlN8wUX4;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
 PLcom/android/server/wm/-$$Lambda$DisplayRotation$2$pp3jOG1BWDI3rPQ3oFXammeS5Tg;-><clinit>()V
 PLcom/android/server/wm/-$$Lambda$DisplayRotation$2$pp3jOG1BWDI3rPQ3oFXammeS5Tg;-><init>()V
 HPLcom/android/server/wm/-$$Lambda$DisplayRotation$2$pp3jOG1BWDI3rPQ3oFXammeS5Tg;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
@@ -37010,6 +39844,7 @@
 HSPLcom/android/server/wm/-$$Lambda$LaunchObserverRegistryImpl$veRn_GhgLZLlOHOJ0ZYT6KcfYqo;-><clinit>()V
 HSPLcom/android/server/wm/-$$Lambda$LaunchObserverRegistryImpl$veRn_GhgLZLlOHOJ0ZYT6KcfYqo;-><init>()V
 HSPLcom/android/server/wm/-$$Lambda$LaunchObserverRegistryImpl$veRn_GhgLZLlOHOJ0ZYT6KcfYqo;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/wm/-$$Lambda$LaunchParamsPersister$Jn24e8Qu0NiiVH-qAilJf6vgADQ;-><init>(Ljava/lang/String;)V
 PLcom/android/server/wm/-$$Lambda$LaunchParamsPersister$Rc1cXPLhXa2WPSr18Q9-Xc7SdV8;-><init>(Ljava/lang/String;)V
 HPLcom/android/server/wm/-$$Lambda$LocalAnimationAdapter$X--EomqUvw4qy89IeeTFTH7aCMo;-><init>(Lcom/android/server/wm/LocalAnimationAdapter;Lcom/android/server/wm/SurfaceAnimator$OnAnimationFinishedCallback;)V
 HPLcom/android/server/wm/-$$Lambda$LocalAnimationAdapter$X--EomqUvw4qy89IeeTFTH7aCMo;->run()V
@@ -37019,6 +39854,8 @@
 PLcom/android/server/wm/-$$Lambda$LockTaskController$NMEqFdnoSJ8A7QRxQO-ZoqXOmVc;->run()V
 PLcom/android/server/wm/-$$Lambda$LockTaskController$mYEdosOvuhEWdcYLQrOC83U4Wms;-><init>(Lcom/android/server/wm/LockTaskController;Landroid/content/Intent;Lcom/android/server/wm/Task;I)V
 PLcom/android/server/wm/-$$Lambda$LockTaskController$mYEdosOvuhEWdcYLQrOC83U4Wms;->run()V
+PLcom/android/server/wm/-$$Lambda$LockTaskController$nuVptnoYwaF1CYydSggC_oxSSSc;-><init>(Lcom/android/server/wm/LockTaskController;I)V
+PLcom/android/server/wm/-$$Lambda$LockTaskController$nuVptnoYwaF1CYydSggC_oxSSSc;->run()V
 PLcom/android/server/wm/-$$Lambda$MGgYXq0deCsjjGP-28PM6ahiI2U;-><clinit>()V
 PLcom/android/server/wm/-$$Lambda$MGgYXq0deCsjjGP-28PM6ahiI2U;-><init>()V
 PLcom/android/server/wm/-$$Lambda$MGgYXq0deCsjjGP-28PM6ahiI2U;->accept(Ljava/lang/Object;)V
@@ -37110,6 +39947,9 @@
 PLcom/android/server/wm/-$$Lambda$RootWindowContainer$0aCEx04eIvMHmZVtI4ucsiK5s9I;-><clinit>()V
 PLcom/android/server/wm/-$$Lambda$RootWindowContainer$0aCEx04eIvMHmZVtI4ucsiK5s9I;-><init>()V
 HPLcom/android/server/wm/-$$Lambda$RootWindowContainer$0aCEx04eIvMHmZVtI4ucsiK5s9I;->accept(Ljava/lang/Object;)V
+PLcom/android/server/wm/-$$Lambda$RootWindowContainer$1$HOnR_rhPvM6ZPX8yI-4GFhkGqUs;-><clinit>()V
+PLcom/android/server/wm/-$$Lambda$RootWindowContainer$1$HOnR_rhPvM6ZPX8yI-4GFhkGqUs;-><init>()V
+HPLcom/android/server/wm/-$$Lambda$RootWindowContainer$1$HOnR_rhPvM6ZPX8yI-4GFhkGqUs;->accept(Ljava/lang/Object;Ljava/lang/Object;)V
 HSPLcom/android/server/wm/-$$Lambda$RootWindowContainer$3VVFoec4x74e1MMAq03gYI9kKjo;-><init>(IZ)V
 HSPLcom/android/server/wm/-$$Lambda$RootWindowContainer$3VVFoec4x74e1MMAq03gYI9kKjo;->accept(Ljava/lang/Object;)V
 HSPLcom/android/server/wm/-$$Lambda$RootWindowContainer$5fbF65VSmaJkPHxEhceOGTat7JE;-><clinit>()V
@@ -37142,6 +39982,8 @@
 HSPLcom/android/server/wm/-$$Lambda$RootWindowContainer$Vvv8jzH2oSE9-eakZwTuKd5NpsU;-><clinit>()V
 HSPLcom/android/server/wm/-$$Lambda$RootWindowContainer$Vvv8jzH2oSE9-eakZwTuKd5NpsU;-><init>()V
 HSPLcom/android/server/wm/-$$Lambda$RootWindowContainer$Vvv8jzH2oSE9-eakZwTuKd5NpsU;->accept(Ljava/lang/Object;)V
+PLcom/android/server/wm/-$$Lambda$RootWindowContainer$ZTXupc1zKRWZgWpo-r3so3blHoI;-><init>(I)V
+PLcom/android/server/wm/-$$Lambda$RootWindowContainer$ZTXupc1zKRWZgWpo-r3so3blHoI;->test(Ljava/lang/Object;)Z
 PLcom/android/server/wm/-$$Lambda$RootWindowContainer$bRRfWu3QSW54eS51jCvFD02TPt8;-><clinit>()V
 PLcom/android/server/wm/-$$Lambda$RootWindowContainer$bRRfWu3QSW54eS51jCvFD02TPt8;-><init>()V
 HPLcom/android/server/wm/-$$Lambda$RootWindowContainer$bRRfWu3QSW54eS51jCvFD02TPt8;->test(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Z
@@ -37182,6 +40024,12 @@
 PLcom/android/server/wm/-$$Lambda$ScreenRotationAnimation$SurfaceRotationAnimationController$mryOPi3UUpYZkQThzDJyjGBpl5c;->onAnimationFinished(ILcom/android/server/wm/AnimationAdapter;)V
 HPLcom/android/server/wm/-$$Lambda$Session$15hO_YO9_yR6FTMdPPe87fZzL1c;-><init>(Landroid/os/IBinder;)V
 HPLcom/android/server/wm/-$$Lambda$Session$15hO_YO9_yR6FTMdPPe87fZzL1c;->accept(Ljava/lang/Object;Ljava/lang/Object;)V
+HPLcom/android/server/wm/-$$Lambda$Session$MgROwKXIO2fCZINsq4gthndARg4;-><init>(Landroid/os/IBinder;)V
+HPLcom/android/server/wm/-$$Lambda$Session$MgROwKXIO2fCZINsq4gthndARg4;->accept(Ljava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/wm/-$$Lambda$Session$R2ONibXT5EMw7qvLbqzL2qgYR_8;-><init>(Z)V
+PLcom/android/server/wm/-$$Lambda$Session$R2ONibXT5EMw7qvLbqzL2qgYR_8;->accept(Ljava/lang/Object;Ljava/lang/Object;)V
+HPLcom/android/server/wm/-$$Lambda$Session$ioowOPU3nnV2ImsCDZtbuIYXGt0;-><init>(F)V
+PLcom/android/server/wm/-$$Lambda$Session$ioowOPU3nnV2ImsCDZtbuIYXGt0;->accept(Ljava/lang/Object;Ljava/lang/Object;)V
 HPLcom/android/server/wm/-$$Lambda$Session$zgdcs0nAb8hCdS-6ugnFMadbhU8;-><init>(FFFF)V
 HPLcom/android/server/wm/-$$Lambda$Session$zgdcs0nAb8hCdS-6ugnFMadbhU8;->accept(Ljava/lang/Object;Ljava/lang/Object;)V
 PLcom/android/server/wm/-$$Lambda$ShellRoot$ZIRxB0zj35u-emFBSiaW8a8zUus;-><init>(Lcom/android/server/wm/ShellRoot;I)V
@@ -37301,7 +40149,7 @@
 HSPLcom/android/server/wm/-$$Lambda$TaskChangeNotificationController$1ziXgnyLi0gQjqMGJAbSzs0-dmE;->accept(Landroid/app/ITaskStackListener;Landroid/os/Message;)V
 HSPLcom/android/server/wm/-$$Lambda$TaskChangeNotificationController$9ngbiJ2r3x2ASHwN59tUFO2-2BQ;-><clinit>()V
 HSPLcom/android/server/wm/-$$Lambda$TaskChangeNotificationController$9ngbiJ2r3x2ASHwN59tUFO2-2BQ;-><init>()V
-PLcom/android/server/wm/-$$Lambda$TaskChangeNotificationController$9ngbiJ2r3x2ASHwN59tUFO2-2BQ;->accept(Landroid/app/ITaskStackListener;Landroid/os/Message;)V
+HPLcom/android/server/wm/-$$Lambda$TaskChangeNotificationController$9ngbiJ2r3x2ASHwN59tUFO2-2BQ;->accept(Landroid/app/ITaskStackListener;Landroid/os/Message;)V
 HSPLcom/android/server/wm/-$$Lambda$TaskChangeNotificationController$Dvvt1gNNfFRVEKlSCdL_9VnilUE;-><clinit>()V
 HSPLcom/android/server/wm/-$$Lambda$TaskChangeNotificationController$Dvvt1gNNfFRVEKlSCdL_9VnilUE;-><init>()V
 PLcom/android/server/wm/-$$Lambda$TaskChangeNotificationController$Dvvt1gNNfFRVEKlSCdL_9VnilUE;->accept(Landroid/app/ITaskStackListener;Landroid/os/Message;)V
@@ -37328,6 +40176,7 @@
 HSPLcom/android/server/wm/-$$Lambda$TaskChangeNotificationController$SAbrujQOZNUflKs1FAg2mBnjx3A;->accept(Landroid/app/ITaskStackListener;Landroid/os/Message;)V
 HSPLcom/android/server/wm/-$$Lambda$TaskChangeNotificationController$SByuGj5tpcCpjTH9lf5zHHv2gNM;-><clinit>()V
 HSPLcom/android/server/wm/-$$Lambda$TaskChangeNotificationController$SByuGj5tpcCpjTH9lf5zHHv2gNM;-><init>()V
+PLcom/android/server/wm/-$$Lambda$TaskChangeNotificationController$SByuGj5tpcCpjTH9lf5zHHv2gNM;->accept(Landroid/app/ITaskStackListener;Landroid/os/Message;)V
 HSPLcom/android/server/wm/-$$Lambda$TaskChangeNotificationController$UexNbaqPy0mc3VxTw2coCctHho8;-><clinit>()V
 HSPLcom/android/server/wm/-$$Lambda$TaskChangeNotificationController$UexNbaqPy0mc3VxTw2coCctHho8;-><init>()V
 HPLcom/android/server/wm/-$$Lambda$TaskChangeNotificationController$UexNbaqPy0mc3VxTw2coCctHho8;->accept(Landroid/app/ITaskStackListener;Landroid/os/Message;)V
@@ -37363,12 +40212,30 @@
 HPLcom/android/server/wm/-$$Lambda$TaskChangeNotificationController$sS6OHbZtuWHjzmkm8bleSWZWFqA;->accept(Landroid/app/ITaskStackListener;Landroid/os/Message;)V
 HSPLcom/android/server/wm/-$$Lambda$TaskChangeNotificationController$sdBP_U6BS8zRbtZp-gZ0BmFW8bs;-><clinit>()V
 HSPLcom/android/server/wm/-$$Lambda$TaskChangeNotificationController$sdBP_U6BS8zRbtZp-gZ0BmFW8bs;-><init>()V
-PLcom/android/server/wm/-$$Lambda$TaskChangeNotificationController$sdBP_U6BS8zRbtZp-gZ0BmFW8bs;->accept(Landroid/app/ITaskStackListener;Landroid/os/Message;)V
+HPLcom/android/server/wm/-$$Lambda$TaskChangeNotificationController$sdBP_U6BS8zRbtZp-gZ0BmFW8bs;->accept(Landroid/app/ITaskStackListener;Landroid/os/Message;)V
 HSPLcom/android/server/wm/-$$Lambda$TaskChangeNotificationController$wuBjs4dj7gB_MI4dIdt2gV2Osus;-><clinit>()V
 HSPLcom/android/server/wm/-$$Lambda$TaskChangeNotificationController$wuBjs4dj7gB_MI4dIdt2gV2Osus;-><init>()V
 HPLcom/android/server/wm/-$$Lambda$TaskChangeNotificationController$wuBjs4dj7gB_MI4dIdt2gV2Osus;->accept(Landroid/app/ITaskStackListener;Landroid/os/Message;)V
 HSPLcom/android/server/wm/-$$Lambda$TaskChangeNotificationController$yaW9HlZsz3L55CTQ4b7y33IGo94;-><clinit>()V
 HSPLcom/android/server/wm/-$$Lambda$TaskChangeNotificationController$yaW9HlZsz3L55CTQ4b7y33IGo94;-><init>()V
+PLcom/android/server/wm/-$$Lambda$TaskContainers$89toIj4dzbPnZV52yJ_Lx-50YLc;-><init>(Ljava/util/ArrayList;)V
+HPLcom/android/server/wm/-$$Lambda$TaskContainers$89toIj4dzbPnZV52yJ_Lx-50YLc;->accept(Ljava/lang/Object;)V
+PLcom/android/server/wm/-$$Lambda$TaskContainers$Qznqwsi8-BCA1-_vB3zr05PqJDA;-><init>(Lcom/android/server/wm/TaskContainers;)V
+PLcom/android/server/wm/-$$Lambda$TaskContainers$Qznqwsi8-BCA1-_vB3zr05PqJDA;->onPreAssignChildLayers()V
+PLcom/android/server/wm/-$$Lambda$TaskContainers$_ESmy8lGTnG7nYvjr73ww_q-Aio;-><clinit>()V
+PLcom/android/server/wm/-$$Lambda$TaskContainers$_ESmy8lGTnG7nYvjr73ww_q-Aio;-><init>()V
+PLcom/android/server/wm/-$$Lambda$TaskContainers$_ESmy8lGTnG7nYvjr73ww_q-Aio;->test(Ljava/lang/Object;Ljava/lang/Object;)Z
+PLcom/android/server/wm/-$$Lambda$TaskDisplayArea$2fufOSTi1fAiixVdHx5JtOWaiDQ;-><init>(Lcom/android/server/wm/TaskDisplayArea;)V
+PLcom/android/server/wm/-$$Lambda$TaskDisplayArea$2fufOSTi1fAiixVdHx5JtOWaiDQ;->onPreAssignChildLayers()V
+PLcom/android/server/wm/-$$Lambda$TaskDisplayArea$XcH01_sSElIBkfdzcfbGZuAMtmk;-><clinit>()V
+PLcom/android/server/wm/-$$Lambda$TaskDisplayArea$XcH01_sSElIBkfdzcfbGZuAMtmk;-><init>()V
+PLcom/android/server/wm/-$$Lambda$TaskDisplayArea$XcH01_sSElIBkfdzcfbGZuAMtmk;->test(Ljava/lang/Object;Ljava/lang/Object;)Z
+HPLcom/android/server/wm/-$$Lambda$TaskDisplayArea$ajDQ2FQogtLzT2xeLoBFC1sWS3U;-><init>(Ljava/util/ArrayList;)V
+HPLcom/android/server/wm/-$$Lambda$TaskDisplayArea$ajDQ2FQogtLzT2xeLoBFC1sWS3U;->accept(Ljava/lang/Object;)V
+PLcom/android/server/wm/-$$Lambda$TaskOrganizerController$6oHHz4Ki8lAtXH-ILvgmrwWRqNM;-><init>(I)V
+PLcom/android/server/wm/-$$Lambda$TaskOrganizerController$6oHHz4Ki8lAtXH-ILvgmrwWRqNM;->accept(Ljava/lang/Object;)V
+PLcom/android/server/wm/-$$Lambda$TaskOrganizerController$TaskOrganizerCallbacks$0vq-lXzpiq-wIq4e4iVbdijNaZU;-><init>(Lcom/android/server/wm/TaskOrganizerController$TaskOrganizerCallbacks;Lcom/android/server/wm/Task;Landroid/app/ActivityManager$RunningTaskInfo;)V
+PLcom/android/server/wm/-$$Lambda$TaskOrganizerController$TaskOrganizerCallbacks$0vq-lXzpiq-wIq4e4iVbdijNaZU;->run()V
 HPLcom/android/server/wm/-$$Lambda$TaskPersister$8MhgCrM41UuyRqTjWwKtfifKRLo;-><init>(Lcom/android/server/wm/Task;)V
 PLcom/android/server/wm/-$$Lambda$TaskPersister$8MhgCrM41UuyRqTjWwKtfifKRLo;->test(Ljava/lang/Object;)Z
 HPLcom/android/server/wm/-$$Lambda$TaskPersister$mW0HULrR8EtZ9La-pL9kLTnHSzk;-><init>(Ljava/lang/String;)V
@@ -37406,8 +40273,12 @@
 HPLcom/android/server/wm/-$$Lambda$VYR_ckkt7281-Ti8Ps0f0Tx3ljY;->test(Ljava/lang/Object;Ljava/lang/Object;)Z
 HPLcom/android/server/wm/-$$Lambda$WallpaperAnimationAdapter$-EwtM9NXnIMpRq_OzBHTdmhakaM;-><init>(JJLjava/util/function/Consumer;Ljava/util/ArrayList;Ljava/util/ArrayList;)V
 HPLcom/android/server/wm/-$$Lambda$WallpaperAnimationAdapter$-EwtM9NXnIMpRq_OzBHTdmhakaM;->accept(Ljava/lang/Object;)V
+PLcom/android/server/wm/-$$Lambda$WallpaperController$0Scukj2yhz26p26xa_96t0qdaCE;-><init>(Lcom/android/server/wm/WallpaperController;)V
+HPLcom/android/server/wm/-$$Lambda$WallpaperController$0Scukj2yhz26p26xa_96t0qdaCE;->accept(Ljava/lang/Object;)V
 HSPLcom/android/server/wm/-$$Lambda$WallpaperController$6pruPGLeSJAwNl9vGfC87eso21w;-><init>(Lcom/android/server/wm/WallpaperController;)V
 HSPLcom/android/server/wm/-$$Lambda$WallpaperController$6pruPGLeSJAwNl9vGfC87eso21w;->apply(Ljava/lang/Object;)Z
+HPLcom/android/server/wm/-$$Lambda$WallpaperController$BBasRkLKZIyG7orBtnzZo0qYk68;-><init>(Lcom/android/server/wm/WindowState;)V
+HPLcom/android/server/wm/-$$Lambda$WallpaperController$BBasRkLKZIyG7orBtnzZo0qYk68;->test(Ljava/lang/Object;)Z
 PLcom/android/server/wm/-$$Lambda$WallpaperController$Gy7houdzET4VmpY0QJ2v-NX1b7k;-><init>(Lcom/android/server/wm/WindowState;)V
 HPLcom/android/server/wm/-$$Lambda$WallpaperController$Gy7houdzET4VmpY0QJ2v-NX1b7k;->test(Ljava/lang/Object;)Z
 PLcom/android/server/wm/-$$Lambda$WindowAnimationSpec$jKE7Phq2DESkeBondpaNPBLn6Cs;-><clinit>()V
@@ -37462,11 +40333,16 @@
 PLcom/android/server/wm/-$$Lambda$WindowManagerService$-84S7IuSlM65nKgepHJEvVFHdC8;->binderDied()V
 PLcom/android/server/wm/-$$Lambda$WindowManagerService$05fsn8aS3Yh8PJChNK4X3zTgx6M;-><init>(I)V
 PLcom/android/server/wm/-$$Lambda$WindowManagerService$05fsn8aS3Yh8PJChNK4X3zTgx6M;->accept(Ljava/lang/Object;)V
+PLcom/android/server/wm/-$$Lambda$WindowManagerService$3pgjva340aXusIC_xagnOER--AY;-><init>(Lcom/android/server/wm/WindowManagerService;Ljava/io/PrintWriter;)V
+PLcom/android/server/wm/-$$Lambda$WindowManagerService$3pgjva340aXusIC_xagnOER--AY;->accept(Ljava/lang/Object;)V
 PLcom/android/server/wm/-$$Lambda$WindowManagerService$76as6dijPl5n2m0AtZPbXLM-ukM;-><clinit>()V
 PLcom/android/server/wm/-$$Lambda$WindowManagerService$76as6dijPl5n2m0AtZPbXLM-ukM;-><init>()V
 PLcom/android/server/wm/-$$Lambda$WindowManagerService$76as6dijPl5n2m0AtZPbXLM-ukM;->accept(Ljava/lang/Object;)V
 HPLcom/android/server/wm/-$$Lambda$WindowManagerService$8ua71O53dXrMSZy5W0bAg3kK7ho;-><init>(Z)V
 HPLcom/android/server/wm/-$$Lambda$WindowManagerService$8ua71O53dXrMSZy5W0bAg3kK7ho;->accept(Ljava/lang/Object;)V
+PLcom/android/server/wm/-$$Lambda$WindowManagerService$KFmzvAqk_xZK5kvrW8MP3Y6A4FY;-><clinit>()V
+PLcom/android/server/wm/-$$Lambda$WindowManagerService$KFmzvAqk_xZK5kvrW8MP3Y6A4FY;-><init>()V
+PLcom/android/server/wm/-$$Lambda$WindowManagerService$KFmzvAqk_xZK5kvrW8MP3Y6A4FY;->accept(Ljava/lang/Object;)V
 HPLcom/android/server/wm/-$$Lambda$WindowManagerService$LocalService$_nYJRiVOgbON7mI191FIzNAk4Xs;-><init>(Ljava/lang/String;)V
 HPLcom/android/server/wm/-$$Lambda$WindowManagerService$LocalService$_nYJRiVOgbON7mI191FIzNAk4Xs;->accept(Ljava/lang/Object;)V
 HPLcom/android/server/wm/-$$Lambda$WindowManagerService$LocalService$rEGrcIRCgYp-4kzr5xA12LKQX0E;-><init>(Ljava/lang/String;)V
@@ -37475,6 +40351,8 @@
 PLcom/android/server/wm/-$$Lambda$WindowManagerService$Zv37mcLTUXyG89YznyHzluaKNE0;->run()V
 PLcom/android/server/wm/-$$Lambda$WindowManagerService$eaG2e7SQKd8e2ZcXySkFGa1yxFk;-><init>(Ljava/io/PrintWriter;)V
 PLcom/android/server/wm/-$$Lambda$WindowManagerService$eaG2e7SQKd8e2ZcXySkFGa1yxFk;->accept(Ljava/lang/Object;)V
+PLcom/android/server/wm/-$$Lambda$WindowManagerService$kkZ1DwaOMG22nszMFlx-BVZqi3A;-><init>(Landroid/view/SurfaceControl$Transaction;)V
+PLcom/android/server/wm/-$$Lambda$WindowManagerService$kkZ1DwaOMG22nszMFlx-BVZqi3A;->accept(Ljava/lang/Object;)V
 HPLcom/android/server/wm/-$$Lambda$WindowManagerService$pUqz7rqEpzd4geO4TXsDyOVZCOc;-><init>(Lcom/android/server/wm/WindowManagerService;)V
 HPLcom/android/server/wm/-$$Lambda$WindowManagerService$pUqz7rqEpzd4geO4TXsDyOVZCOc;->accept(Ljava/lang/Object;Ljava/lang/Object;)V
 HSPLcom/android/server/wm/-$$Lambda$WindowManagerService$qCWPyJrU0wwX4tP-_QpfmersCVc;-><init>(Landroid/content/Context;Lcom/android/server/input/InputManagerService;ZZLcom/android/server/policy/WindowManagerPolicy;Lcom/android/server/wm/ActivityTaskManagerService;Ljava/util/function/Supplier;Ljava/util/function/Supplier;Ljava/util/function/Function;)V
@@ -37497,6 +40375,9 @@
 HSPLcom/android/server/wm/-$$Lambda$cJE-iQ28Rv-ThCcuht9wXeFzPgo;->accept(Ljava/lang/Object;)V
 HSPLcom/android/server/wm/-$$Lambda$dwJG8BAnLlvKNGuDY9U3-haNY4M;-><init>(Lcom/android/server/wm/WindowContainer;)V
 HPLcom/android/server/wm/-$$Lambda$dwJG8BAnLlvKNGuDY9U3-haNY4M;->onAnimationFinished(ILcom/android/server/wm/AnimationAdapter;)V
+PLcom/android/server/wm/-$$Lambda$eT9SjQHKmQJBvlyYh6oQCJNBjSE;-><clinit>()V
+PLcom/android/server/wm/-$$Lambda$eT9SjQHKmQJBvlyYh6oQCJNBjSE;-><init>()V
+PLcom/android/server/wm/-$$Lambda$eT9SjQHKmQJBvlyYh6oQCJNBjSE;->accept(Ljava/lang/Object;Ljava/lang/Object;)V
 PLcom/android/server/wm/-$$Lambda$h-x5kpt7iRsCHGk24gs4Sab2qLw;-><clinit>()V
 PLcom/android/server/wm/-$$Lambda$h-x5kpt7iRsCHGk24gs4Sab2qLw;-><init>()V
 PLcom/android/server/wm/-$$Lambda$h-x5kpt7iRsCHGk24gs4Sab2qLw;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
@@ -37518,9 +40399,16 @@
 PLcom/android/server/wm/-$$Lambda$j9nJq2XXOKyN4f0dfDaTjqmQRvg;->accept(Ljava/lang/Object;Ljava/lang/Object;)V
 PLcom/android/server/wm/-$$Lambda$ju_KnYxEFekr6LzoWamCeaO5FHQ;-><init>(Lcom/android/server/wm/ActivityRecord;)V
 PLcom/android/server/wm/-$$Lambda$ju_KnYxEFekr6LzoWamCeaO5FHQ;->binderDied()V
+PLcom/android/server/wm/-$$Lambda$l6AtA6HpQmFuEYd_DP955eyY_WI;-><clinit>()V
+PLcom/android/server/wm/-$$Lambda$l6AtA6HpQmFuEYd_DP955eyY_WI;-><init>()V
+HPLcom/android/server/wm/-$$Lambda$l6AtA6HpQmFuEYd_DP955eyY_WI;->test(Ljava/lang/Object;)Z
 PLcom/android/server/wm/-$$Lambda$lnLU7X2Jo6KLxEmrQlMdzuxHhJA;-><clinit>()V
 PLcom/android/server/wm/-$$Lambda$lnLU7X2Jo6KLxEmrQlMdzuxHhJA;-><init>()V
 PLcom/android/server/wm/-$$Lambda$lnLU7X2Jo6KLxEmrQlMdzuxHhJA;->accept(Ljava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/wm/-$$Lambda$neohyhAIBSbDm4hUahIEOo5bYNY;-><init>(Lcom/android/internal/policy/GestureNavigationSettingsObserver;)V
+PLcom/android/server/wm/-$$Lambda$neohyhAIBSbDm4hUahIEOo5bYNY;->run()V
+PLcom/android/server/wm/-$$Lambda$o8Xf30aea0t-A93AFKY5pBW0IDI;-><init>(Lcom/android/internal/policy/GestureNavigationSettingsObserver;)V
+PLcom/android/server/wm/-$$Lambda$o8Xf30aea0t-A93AFKY5pBW0IDI;->run()V
 PLcom/android/server/wm/-$$Lambda$oZvG727evJMxIwK1im7QJjcltfo;-><clinit>()V
 PLcom/android/server/wm/-$$Lambda$oZvG727evJMxIwK1im7QJjcltfo;-><init>()V
 PLcom/android/server/wm/-$$Lambda$oZvG727evJMxIwK1im7QJjcltfo;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
@@ -37537,6 +40425,8 @@
 PLcom/android/server/wm/-$$Lambda$uwO6wQlqU3CG7OTdH7NBCKnHs64;-><clinit>()V
 PLcom/android/server/wm/-$$Lambda$uwO6wQlqU3CG7OTdH7NBCKnHs64;-><init>()V
 HPLcom/android/server/wm/-$$Lambda$uwO6wQlqU3CG7OTdH7NBCKnHs64;->accept(Ljava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/wm/-$$Lambda$vZR5471cvTgvcvM990tM31bi4pI;-><init>(Lcom/android/server/wm/WindowAnimator;)V
+PLcom/android/server/wm/-$$Lambda$vZR5471cvTgvcvM990tM31bi4pI;->accept(Ljava/lang/Object;)V
 PLcom/android/server/wm/-$$Lambda$vhwCX-wzYksBgFM46tASKUCeQRc;-><clinit>()V
 PLcom/android/server/wm/-$$Lambda$vhwCX-wzYksBgFM46tASKUCeQRc;-><init>()V
 HPLcom/android/server/wm/-$$Lambda$vhwCX-wzYksBgFM46tASKUCeQRc;->accept(Ljava/lang/Object;)V
@@ -37574,18 +40464,18 @@
 PLcom/android/server/wm/AccessibilityController$DisplayMagnifier$MagnifiedViewport;-><init>(Lcom/android/server/wm/AccessibilityController$DisplayMagnifier;)V
 PLcom/android/server/wm/AccessibilityController$DisplayMagnifier$MagnifiedViewport;->access$1200(Lcom/android/server/wm/AccessibilityController$DisplayMagnifier$MagnifiedViewport;)Landroid/graphics/Point;
 PLcom/android/server/wm/AccessibilityController$DisplayMagnifier$MagnifiedViewport;->access$1300(Lcom/android/server/wm/AccessibilityController$DisplayMagnifier$MagnifiedViewport;)F
-PLcom/android/server/wm/AccessibilityController$DisplayMagnifier$MagnifiedViewport;->access$1400(Lcom/android/server/wm/AccessibilityController$DisplayMagnifier$MagnifiedViewport;)I
+HPLcom/android/server/wm/AccessibilityController$DisplayMagnifier$MagnifiedViewport;->access$1400(Lcom/android/server/wm/AccessibilityController$DisplayMagnifier$MagnifiedViewport;)I
 PLcom/android/server/wm/AccessibilityController$DisplayMagnifier$MagnifiedViewport;->access$1400(Lcom/android/server/wm/AccessibilityController$DisplayMagnifier$MagnifiedViewport;)Landroid/view/WindowManager;
 PLcom/android/server/wm/AccessibilityController$DisplayMagnifier$MagnifiedViewport;->destroyWindow()V
-PLcom/android/server/wm/AccessibilityController$DisplayMagnifier$MagnifiedViewport;->drawWindowIfNeededLocked(Landroid/view/SurfaceControl$Transaction;)V
+HPLcom/android/server/wm/AccessibilityController$DisplayMagnifier$MagnifiedViewport;->drawWindowIfNeededLocked(Landroid/view/SurfaceControl$Transaction;)V
 HPLcom/android/server/wm/AccessibilityController$DisplayMagnifier$MagnifiedViewport;->getLetterboxBounds(Lcom/android/server/wm/WindowState;)Landroid/graphics/Region;
 PLcom/android/server/wm/AccessibilityController$DisplayMagnifier$MagnifiedViewport;->getMagnificationRegionLocked(Landroid/graphics/Region;)V
-PLcom/android/server/wm/AccessibilityController$DisplayMagnifier$MagnifiedViewport;->getMagnificationSpecLocked()Landroid/view/MagnificationSpec;
+HPLcom/android/server/wm/AccessibilityController$DisplayMagnifier$MagnifiedViewport;->getMagnificationSpecLocked()Landroid/view/MagnificationSpec;
 PLcom/android/server/wm/AccessibilityController$DisplayMagnifier$MagnifiedViewport;->getMagnifiedFrameInContentCoordsLocked(Landroid/graphics/Rect;)V
-PLcom/android/server/wm/AccessibilityController$DisplayMagnifier$MagnifiedViewport;->isMagnifyingLocked()Z
+HPLcom/android/server/wm/AccessibilityController$DisplayMagnifier$MagnifiedViewport;->isMagnifyingLocked()Z
 HPLcom/android/server/wm/AccessibilityController$DisplayMagnifier$MagnifiedViewport;->lambda$populateWindowsOnScreenLocked$0$AccessibilityController$DisplayMagnifier$MagnifiedViewport(Landroid/util/SparseArray;Lcom/android/server/wm/WindowState;)V
 PLcom/android/server/wm/AccessibilityController$DisplayMagnifier$MagnifiedViewport;->onRotationChangedLocked(Landroid/view/SurfaceControl$Transaction;)V
-PLcom/android/server/wm/AccessibilityController$DisplayMagnifier$MagnifiedViewport;->populateWindowsOnScreenLocked(Landroid/util/SparseArray;)V
+HPLcom/android/server/wm/AccessibilityController$DisplayMagnifier$MagnifiedViewport;->populateWindowsOnScreenLocked(Landroid/util/SparseArray;)V
 HPLcom/android/server/wm/AccessibilityController$DisplayMagnifier$MagnifiedViewport;->recomputeBoundsLocked()V
 HPLcom/android/server/wm/AccessibilityController$DisplayMagnifier$MagnifiedViewport;->setMagnifiedRegionBorderShownLocked(ZZ)V
 HPLcom/android/server/wm/AccessibilityController$DisplayMagnifier$MagnifiedViewport;->updateMagnificationSpecLocked(Landroid/view/MagnificationSpec;)V
@@ -37593,22 +40483,22 @@
 HPLcom/android/server/wm/AccessibilityController$DisplayMagnifier$MyHandler;->handleMessage(Landroid/os/Message;)V
 PLcom/android/server/wm/AccessibilityController$DisplayMagnifier;-><init>(Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/DisplayContent;Landroid/view/Display;Lcom/android/server/wm/WindowManagerInternal$MagnificationCallbacks;)V
 PLcom/android/server/wm/AccessibilityController$DisplayMagnifier;->access$000(Lcom/android/server/wm/AccessibilityController$DisplayMagnifier;)Landroid/content/Context;
-PLcom/android/server/wm/AccessibilityController$DisplayMagnifier;->access$100(Lcom/android/server/wm/AccessibilityController$DisplayMagnifier;)Landroid/view/Display;
-PLcom/android/server/wm/AccessibilityController$DisplayMagnifier;->access$1000(Lcom/android/server/wm/AccessibilityController$DisplayMagnifier;)Lcom/android/server/wm/WindowManagerService;
-PLcom/android/server/wm/AccessibilityController$DisplayMagnifier;->access$1100(Lcom/android/server/wm/AccessibilityController$DisplayMagnifier;)Lcom/android/server/wm/DisplayContent;
-PLcom/android/server/wm/AccessibilityController$DisplayMagnifier;->access$1500(Lcom/android/server/wm/AccessibilityController$DisplayMagnifier;)Lcom/android/server/wm/WindowManagerInternal$MagnificationCallbacks;
+HPLcom/android/server/wm/AccessibilityController$DisplayMagnifier;->access$100(Lcom/android/server/wm/AccessibilityController$DisplayMagnifier;)Landroid/view/Display;
+HPLcom/android/server/wm/AccessibilityController$DisplayMagnifier;->access$1000(Lcom/android/server/wm/AccessibilityController$DisplayMagnifier;)Lcom/android/server/wm/WindowManagerService;
+HPLcom/android/server/wm/AccessibilityController$DisplayMagnifier;->access$1100(Lcom/android/server/wm/AccessibilityController$DisplayMagnifier;)Lcom/android/server/wm/DisplayContent;
+HPLcom/android/server/wm/AccessibilityController$DisplayMagnifier;->access$1500(Lcom/android/server/wm/AccessibilityController$DisplayMagnifier;)Lcom/android/server/wm/WindowManagerInternal$MagnificationCallbacks;
 PLcom/android/server/wm/AccessibilityController$DisplayMagnifier;->access$1600(Lcom/android/server/wm/AccessibilityController$DisplayMagnifier;)Lcom/android/server/wm/AccessibilityController$DisplayMagnifier$MagnifiedViewport;
 PLcom/android/server/wm/AccessibilityController$DisplayMagnifier;->access$1600(Lcom/android/server/wm/AccessibilityController$DisplayMagnifier;)Lcom/android/server/wm/WindowManagerInternal$MagnificationCallbacks;
-PLcom/android/server/wm/AccessibilityController$DisplayMagnifier;->access$200(Lcom/android/server/wm/AccessibilityController$DisplayMagnifier;)Landroid/os/Handler;
-PLcom/android/server/wm/AccessibilityController$DisplayMagnifier;->access$300(Lcom/android/server/wm/AccessibilityController$DisplayMagnifier;)Landroid/graphics/Region;
-PLcom/android/server/wm/AccessibilityController$DisplayMagnifier;->access$400(Lcom/android/server/wm/AccessibilityController$DisplayMagnifier;)Landroid/graphics/Region;
-PLcom/android/server/wm/AccessibilityController$DisplayMagnifier;->access$600(Lcom/android/server/wm/AccessibilityController$DisplayMagnifier;)Landroid/graphics/Region;
-PLcom/android/server/wm/AccessibilityController$DisplayMagnifier;->access$700(Lcom/android/server/wm/AccessibilityController$DisplayMagnifier;)Landroid/graphics/Rect;
-PLcom/android/server/wm/AccessibilityController$DisplayMagnifier;->access$800(Lcom/android/server/wm/AccessibilityController$DisplayMagnifier;)Landroid/graphics/Region;
+HPLcom/android/server/wm/AccessibilityController$DisplayMagnifier;->access$200(Lcom/android/server/wm/AccessibilityController$DisplayMagnifier;)Landroid/os/Handler;
+HPLcom/android/server/wm/AccessibilityController$DisplayMagnifier;->access$300(Lcom/android/server/wm/AccessibilityController$DisplayMagnifier;)Landroid/graphics/Region;
+HPLcom/android/server/wm/AccessibilityController$DisplayMagnifier;->access$400(Lcom/android/server/wm/AccessibilityController$DisplayMagnifier;)Landroid/graphics/Region;
+HPLcom/android/server/wm/AccessibilityController$DisplayMagnifier;->access$600(Lcom/android/server/wm/AccessibilityController$DisplayMagnifier;)Landroid/graphics/Region;
+HPLcom/android/server/wm/AccessibilityController$DisplayMagnifier;->access$700(Lcom/android/server/wm/AccessibilityController$DisplayMagnifier;)Landroid/graphics/Rect;
+HPLcom/android/server/wm/AccessibilityController$DisplayMagnifier;->access$800(Lcom/android/server/wm/AccessibilityController$DisplayMagnifier;)Landroid/graphics/Region;
 PLcom/android/server/wm/AccessibilityController$DisplayMagnifier;->destroyLocked()V
-PLcom/android/server/wm/AccessibilityController$DisplayMagnifier;->drawMagnifiedRegionBorderIfNeededLocked(Landroid/view/SurfaceControl$Transaction;)V
+HPLcom/android/server/wm/AccessibilityController$DisplayMagnifier;->drawMagnifiedRegionBorderIfNeededLocked(Landroid/view/SurfaceControl$Transaction;)V
 PLcom/android/server/wm/AccessibilityController$DisplayMagnifier;->getMagnificationRegionLocked(Landroid/graphics/Region;)V
-PLcom/android/server/wm/AccessibilityController$DisplayMagnifier;->getMagnificationSpecForWindowLocked(Lcom/android/server/wm/WindowState;)Landroid/view/MagnificationSpec;
+HPLcom/android/server/wm/AccessibilityController$DisplayMagnifier;->getMagnificationSpecForWindowLocked(Lcom/android/server/wm/WindowState;)Landroid/view/MagnificationSpec;
 PLcom/android/server/wm/AccessibilityController$DisplayMagnifier;->isForceShowingMagnifiableBoundsLocked()Z
 HPLcom/android/server/wm/AccessibilityController$DisplayMagnifier;->onAppWindowTransitionLocked(II)V
 HPLcom/android/server/wm/AccessibilityController$DisplayMagnifier;->onRectangleOnScreenRequestedLocked(Landroid/graphics/Rect;)V
@@ -37637,7 +40527,7 @@
 HPLcom/android/server/wm/AccessibilityController$WindowsForAccessibilityObserver;->windowMattersToAccessibility(Lcom/android/server/wm/WindowState;Landroid/graphics/Region;Landroid/graphics/Region;Ljava/util/HashSet;)Z
 PLcom/android/server/wm/AccessibilityController;-><clinit>()V
 PLcom/android/server/wm/AccessibilityController;-><init>(Lcom/android/server/wm/WindowManagerService;)V
-PLcom/android/server/wm/AccessibilityController;->access$500(Lcom/android/server/wm/WindowState;Landroid/graphics/Matrix;)V
+HPLcom/android/server/wm/AccessibilityController;->access$500(Lcom/android/server/wm/WindowState;Landroid/graphics/Matrix;)V
 HPLcom/android/server/wm/AccessibilityController;->drawMagnifiedRegionBorderIfNeededLocked(ILandroid/view/SurfaceControl$Transaction;)V
 PLcom/android/server/wm/AccessibilityController;->getMagnificationRegionLocked(ILandroid/graphics/Region;)V
 HPLcom/android/server/wm/AccessibilityController;->getMagnificationSpecForWindowLocked(Lcom/android/server/wm/WindowState;)Landroid/view/MagnificationSpec;
@@ -37649,7 +40539,7 @@
 HPLcom/android/server/wm/AccessibilityController;->onWindowFocusChangedNotLocked(I)V
 HPLcom/android/server/wm/AccessibilityController;->onWindowTransitionLocked(Lcom/android/server/wm/WindowState;I)V
 HPLcom/android/server/wm/AccessibilityController;->performComputeChangedWindowsNotLocked(IZ)V
-PLcom/android/server/wm/AccessibilityController;->populateTransformationMatrixLocked(Lcom/android/server/wm/WindowState;Landroid/graphics/Matrix;)V
+HPLcom/android/server/wm/AccessibilityController;->populateTransformationMatrixLocked(Lcom/android/server/wm/WindowState;Landroid/graphics/Matrix;)V
 HPLcom/android/server/wm/AccessibilityController;->setForceShowMagnifiableBoundsLocked(IZ)V
 PLcom/android/server/wm/AccessibilityController;->setMagnificationCallbacksLocked(ILcom/android/server/wm/WindowManagerInternal$MagnificationCallbacks;)Z
 HPLcom/android/server/wm/AccessibilityController;->setMagnificationSpecLocked(ILandroid/view/MagnificationSpec;)V
@@ -37692,7 +40582,7 @@
 HSPLcom/android/server/wm/ActivityMetricsLogger;->convertTransitionTypeToLaunchObserverTemperature(I)I
 HSPLcom/android/server/wm/ActivityMetricsLogger;->done(ZLcom/android/server/wm/ActivityMetricsLogger$TransitionInfo;Ljava/lang/String;J)V
 HSPLcom/android/server/wm/ActivityMetricsLogger;->getActiveTransitionInfo(Lcom/android/server/wm/ActivityRecord;)Lcom/android/server/wm/ActivityMetricsLogger$TransitionInfo;
-PLcom/android/server/wm/ActivityMetricsLogger;->getActiveTransitionInfo(Lcom/android/server/wm/WindowContainer;)Lcom/android/server/wm/ActivityMetricsLogger$TransitionInfo;
+HPLcom/android/server/wm/ActivityMetricsLogger;->getActiveTransitionInfo(Lcom/android/server/wm/WindowContainer;)Lcom/android/server/wm/ActivityMetricsLogger$TransitionInfo;
 PLcom/android/server/wm/ActivityMetricsLogger;->getArtManagerInternal()Landroid/content/pm/dex/ArtManagerInternal;
 HSPLcom/android/server/wm/ActivityMetricsLogger;->getLastDrawnDelayMs(Lcom/android/server/wm/ActivityRecord;)I
 HSPLcom/android/server/wm/ActivityMetricsLogger;->getLaunchObserverRegistry()Lcom/android/server/wm/ActivityMetricsLaunchObserverRegistry;
@@ -37747,9 +40637,9 @@
 PLcom/android/server/wm/ActivityRecord$AppSaturationInfo;-><init>(Lcom/android/server/wm/ActivityRecord$1;)V
 PLcom/android/server/wm/ActivityRecord$AppSaturationInfo;->setSaturation([F[F)V
 HPLcom/android/server/wm/ActivityRecord$CompatDisplayInsets;-><init>(Lcom/android/server/wm/DisplayContent;Landroid/graphics/Rect;Z)V
-PLcom/android/server/wm/ActivityRecord$CompatDisplayInsets;-><init>(Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/WindowContainer;)V
-PLcom/android/server/wm/ActivityRecord$CompatDisplayInsets;->getBoundsByRotation(Landroid/graphics/Rect;I)V
-PLcom/android/server/wm/ActivityRecord$CompatDisplayInsets;->getContainerBounds(Landroid/graphics/Rect;Landroid/graphics/Rect;IIZZ)V
+HPLcom/android/server/wm/ActivityRecord$CompatDisplayInsets;-><init>(Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/WindowContainer;)V
+HPLcom/android/server/wm/ActivityRecord$CompatDisplayInsets;->getBoundsByRotation(Landroid/graphics/Rect;I)V
+HPLcom/android/server/wm/ActivityRecord$CompatDisplayInsets;->getContainerBounds(Landroid/graphics/Rect;Landroid/graphics/Rect;IIZZ)V
 HPLcom/android/server/wm/ActivityRecord$CompatDisplayInsets;->getDisplayBoundsByRotation(Landroid/graphics/Rect;I)V
 HPLcom/android/server/wm/ActivityRecord$CompatDisplayInsets;->getFrameByOrientation(Landroid/graphics/Rect;I)V
 HSPLcom/android/server/wm/ActivityRecord$Token;-><init>(Landroid/content/Intent;)V
@@ -37778,9 +40668,10 @@
 HSPLcom/android/server/wm/ActivityRecord;->allowMoveToFront()Z
 HSPLcom/android/server/wm/ActivityRecord;->allowTaskSnapshot()Z
 HPLcom/android/server/wm/ActivityRecord;->applyAnimation(Landroid/view/WindowManager$LayoutParams;IZZ)Z
-PLcom/android/server/wm/ActivityRecord;->applyAnimation(Landroid/view/WindowManager$LayoutParams;IZZLcom/android/server/wm/SurfaceAnimator$OnAnimationFinishedCallback;)Z
+HPLcom/android/server/wm/ActivityRecord;->applyAnimation(Landroid/view/WindowManager$LayoutParams;IZZLcom/android/server/wm/SurfaceAnimator$OnAnimationFinishedCallback;)Z
 HPLcom/android/server/wm/ActivityRecord;->applyAnimation(Landroid/view/WindowManager$LayoutParams;IZZLjava/lang/Runnable;)Z
 HSPLcom/android/server/wm/ActivityRecord;->applyAspectRatio(Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;)V
+PLcom/android/server/wm/ActivityRecord;->applyFixedRotationTransform(Landroid/view/DisplayInfo;Lcom/android/server/wm/DisplayFrames;Landroid/content/res/Configuration;)V
 HSPLcom/android/server/wm/ActivityRecord;->applyOptionsLocked()V
 HSPLcom/android/server/wm/ActivityRecord;->applyOptionsLocked(Landroid/app/ActivityOptions;Landroid/content/Intent;)V
 HSPLcom/android/server/wm/ActivityRecord;->asActivityRecord()Lcom/android/server/wm/ActivityRecord;
@@ -37791,6 +40682,7 @@
 HSPLcom/android/server/wm/ActivityRecord;->canBeLaunchedOnDisplay(I)Z
 HSPLcom/android/server/wm/ActivityRecord;->canBeTopRunning()Z
 PLcom/android/server/wm/ActivityRecord;->canLaunchAssistActivity(Ljava/lang/String;)Z
+PLcom/android/server/wm/ActivityRecord;->canLaunchDreamActivity(Ljava/lang/String;)Z
 HPLcom/android/server/wm/ActivityRecord;->canLaunchHomeActivity(ILcom/android/server/wm/ActivityRecord;)Z
 HSPLcom/android/server/wm/ActivityRecord;->canResumeByCompat()Z
 HSPLcom/android/server/wm/ActivityRecord;->canShowWhenLocked()Z
@@ -37871,9 +40763,11 @@
 HSPLcom/android/server/wm/ActivityRecord;->getBounds()Landroid/graphics/Rect;
 HSPLcom/android/server/wm/ActivityRecord;->getConfigurationChanges(Landroid/content/res/Configuration;)I
 HSPLcom/android/server/wm/ActivityRecord;->getDisplay()Lcom/android/server/wm/DisplayContent;
+PLcom/android/server/wm/ActivityRecord;->getDisplayArea()Lcom/android/server/wm/TaskDisplayArea;
 HSPLcom/android/server/wm/ActivityRecord;->getDisplayId()I
 HSPLcom/android/server/wm/ActivityRecord;->getDisplayedBounds()Landroid/graphics/Rect;
 PLcom/android/server/wm/ActivityRecord;->getHighestAnimLayerWindow(Lcom/android/server/wm/WindowState;)Lcom/android/server/wm/WindowState;
+PLcom/android/server/wm/ActivityRecord;->getHorizontalCenterOffset(II)I
 HPLcom/android/server/wm/ActivityRecord;->getImeTargetBelowWindow(Lcom/android/server/wm/WindowState;)Lcom/android/server/wm/WindowState;
 HSPLcom/android/server/wm/ActivityRecord;->getLetterboxInnerBounds(Landroid/graphics/Rect;)V
 HPLcom/android/server/wm/ActivityRecord;->getLetterboxInsets()Landroid/graphics/Rect;
@@ -37882,6 +40776,7 @@
 HSPLcom/android/server/wm/ActivityRecord;->getPersistentSavedState()Landroid/os/PersistableBundle;
 HPLcom/android/server/wm/ActivityRecord;->getPid()I
 HSPLcom/android/server/wm/ActivityRecord;->getProcessGlobalConfiguration()Landroid/content/res/Configuration;
+HPLcom/android/server/wm/ActivityRecord;->getProtoFieldId()J
 PLcom/android/server/wm/ActivityRecord;->getRemoteAnimationDefinition()Landroid/view/RemoteAnimationDefinition;
 HSPLcom/android/server/wm/ActivityRecord;->getRequestedOrientation()I
 HSPLcom/android/server/wm/ActivityRecord;->getRootTask()Lcom/android/server/wm/ActivityStack;
@@ -37916,7 +40811,7 @@
 HSPLcom/android/server/wm/ActivityRecord;->isClientVisible()Z
 HPLcom/android/server/wm/ActivityRecord;->isClosingOrEnteringPip()Z
 PLcom/android/server/wm/ActivityRecord;->isConfigurationCompatible(Landroid/content/res/Configuration;)Z
-PLcom/android/server/wm/ActivityRecord;->isDestroyable()Z
+HPLcom/android/server/wm/ActivityRecord;->isDestroyable()Z
 HPLcom/android/server/wm/ActivityRecord;->isFirstChildWindowGreaterThanSecond(Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;)Z
 HSPLcom/android/server/wm/ActivityRecord;->isFocusable()Z
 HSPLcom/android/server/wm/ActivityRecord;->isFreezingScreen()Z
@@ -37986,6 +40881,7 @@
 HSPLcom/android/server/wm/ActivityRecord;->notifyAppStopped()V
 HSPLcom/android/server/wm/ActivityRecord;->notifyUnknownVisibilityLaunchedForKeyguardTransition()V
 HSPLcom/android/server/wm/ActivityRecord;->occludesParent()Z
+PLcom/android/server/wm/ActivityRecord;->offsetBounds(Landroid/content/res/Configuration;II)V
 HSPLcom/android/server/wm/ActivityRecord;->okToShowLocked()Z
 HSPLcom/android/server/wm/ActivityRecord;->onAnimationFinished()V
 HSPLcom/android/server/wm/ActivityRecord;->onAnimationFinished(ILcom/android/server/wm/AnimationAdapter;)V
@@ -38032,6 +40928,7 @@
 HSPLcom/android/server/wm/ActivityRecord;->reportDescendantOrientationChangeIfNeeded()V
 PLcom/android/server/wm/ActivityRecord;->reportFullyDrawnLocked(Z)V
 HSPLcom/android/server/wm/ActivityRecord;->requestUpdateWallpaperIfNeeded()V
+HPLcom/android/server/wm/ActivityRecord;->resolveFullscreenConfiguration(Landroid/content/res/Configuration;)V
 HSPLcom/android/server/wm/ActivityRecord;->resolveOverrideConfiguration(Landroid/content/res/Configuration;)V
 HPLcom/android/server/wm/ActivityRecord;->resolveSizeCompatModeConfiguration(Landroid/content/res/Configuration;)V
 PLcom/android/server/wm/ActivityRecord;->restartProcessIfVisible()V
@@ -38058,6 +40955,7 @@
 HPLcom/android/server/wm/ActivityRecord;->setMainWindowOpaque(Z)V
 HPLcom/android/server/wm/ActivityRecord;->setOccludesParent(Z)Z
 HPLcom/android/server/wm/ActivityRecord;->setOrientation(IZ)V
+PLcom/android/server/wm/ActivityRecord;->setPictureInPictureParams(Landroid/app/PictureInPictureParams;)V
 HSPLcom/android/server/wm/ActivityRecord;->setProcess(Lcom/android/server/wm/WindowProcessController;)V
 HPLcom/android/server/wm/ActivityRecord;->setRequestedOrientation(I)V
 HSPLcom/android/server/wm/ActivityRecord;->setSavedState(Landroid/os/Bundle;)V
@@ -38167,6 +41065,7 @@
 HPLcom/android/server/wm/ActivityStack$RemoveHistoryRecordsForApp;->processActivity(Lcom/android/server/wm/ActivityRecord;)V
 HSPLcom/android/server/wm/ActivityStack;-><clinit>()V
 HSPLcom/android/server/wm/ActivityStack;-><init>(Lcom/android/server/wm/ActivityTaskManagerService;IILandroid/content/pm/ActivityInfo;Landroid/content/Intent;)V
+PLcom/android/server/wm/ActivityStack;-><init>(Lcom/android/server/wm/ActivityTaskManagerService;IILandroid/content/pm/ActivityInfo;Landroid/content/Intent;Z)V
 HSPLcom/android/server/wm/ActivityStack;-><init>(Lcom/android/server/wm/ActivityTaskManagerService;ILandroid/content/Intent;Landroid/content/Intent;Ljava/lang/String;Ljava/lang/String;Landroid/content/ComponentName;Landroid/content/ComponentName;ZZZIILjava/lang/String;JZLandroid/app/ActivityManager$TaskDescription;IIIIILjava/lang/String;IZZZIILandroid/content/pm/ActivityInfo;Landroid/service/voice/IVoiceInteractionSession;Lcom/android/internal/app/IVoiceInteractor;Lcom/android/server/wm/ActivityStack;)V
 HSPLcom/android/server/wm/ActivityStack;-><init>(Lcom/android/server/wm/ActivityTaskManagerService;ILandroid/content/Intent;Landroid/content/Intent;Ljava/lang/String;Ljava/lang/String;Landroid/content/ComponentName;Landroid/content/ComponentName;ZZZIILjava/lang/String;JZLandroid/app/ActivityManager$TaskDescription;IIIIILjava/lang/String;Ljava/lang/String;IZZZIILandroid/content/pm/ActivityInfo;Landroid/service/voice/IVoiceInteractionSession;Lcom/android/internal/app/IVoiceInteractor;Lcom/android/server/wm/ActivityStack;)V
 HSPLcom/android/server/wm/ActivityStack;-><init>(Lcom/android/server/wm/ActivityTaskManagerService;ILandroid/content/pm/ActivityInfo;Landroid/content/Intent;Landroid/service/voice/IVoiceInteractionSession;Lcom/android/internal/app/IVoiceInteractor;Landroid/app/ActivityManager$TaskDescription;Lcom/android/server/wm/ActivityStack;)V
@@ -38246,6 +41145,7 @@
 PLcom/android/server/wm/ActivityStack;->getFinalAnimationSourceHintBounds(Landroid/graphics/Rect;)V
 HPLcom/android/server/wm/ActivityStack;->getMinTopStackBottom(Landroid/graphics/Rect;I)I
 HSPLcom/android/server/wm/ActivityStack;->getName()Ljava/lang/String;
+PLcom/android/server/wm/ActivityStack;->getOccludingActivityAbove(Lcom/android/server/wm/ActivityRecord;)Lcom/android/server/wm/ActivityRecord;
 PLcom/android/server/wm/ActivityStack;->getOrientation()I
 HPLcom/android/server/wm/ActivityStack;->getParentSurfaceControl()Landroid/view/SurfaceControl;
 HSPLcom/android/server/wm/ActivityStack;->getRawBounds()Landroid/graphics/Rect;
@@ -38291,6 +41191,7 @@
 HPLcom/android/server/wm/ActivityStack;->isTopActivityVisible()Z
 HPLcom/android/server/wm/ActivityStack;->isTopRunningNonDelayed(Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;)Z
 HPLcom/android/server/wm/ActivityStack;->isTopSplitScreenStack()Z
+PLcom/android/server/wm/ActivityStack;->isTopStackInDisplayArea()Z
 HSPLcom/android/server/wm/ActivityStack;->isTopStackOnDisplay()Z
 PLcom/android/server/wm/ActivityStack;->isTransientWindowingMode(I)Z
 HPLcom/android/server/wm/ActivityStack;->lambda$GDPUuzTvyfp2z6wYxqAF0vhMJK8(Lcom/android/server/wm/Task;Landroid/graphics/Rect;Landroid/graphics/Rect;)V
@@ -38305,30 +41206,43 @@
 PLcom/android/server/wm/ActivityStack;->lambda$beginImeAdjustAnimation$18(Lcom/android/server/wm/Task;)V
 PLcom/android/server/wm/ActivityStack;->lambda$calculatePinnedBoundsForConfigChange$17$ActivityStack(Lcom/android/server/wm/DisplayContent;)V
 PLcom/android/server/wm/ActivityStack;->lambda$dhfbladKtxXwwdCS2dFdAfUfBN4(Lcom/android/server/wm/Task;Landroid/view/ITaskOrganizer;)V
+PLcom/android/server/wm/ActivityStack;->lambda$dismissPip$14$ActivityStack()V
 PLcom/android/server/wm/ActivityStack;->lambda$dismissPip$15$ActivityStack()V
 PLcom/android/server/wm/ActivityStack;->lambda$dismissPip$16$ActivityStack()V
+HPLcom/android/server/wm/ActivityStack;->lambda$dumpActivities$11(ZLjava/io/PrintWriter;Ljava/io/FileDescriptor;ZZLjava/lang/String;Lcom/android/server/wm/Task;)V
 HPLcom/android/server/wm/ActivityStack;->lambda$dumpActivities$12(ZLjava/io/PrintWriter;Ljava/io/FileDescriptor;ZZLjava/lang/String;Lcom/android/server/wm/Task;)V
 HPLcom/android/server/wm/ActivityStack;->lambda$dumpActivities$13$ActivityStack(ZLjava/io/PrintWriter;Ljava/io/FileDescriptor;ZZLjava/lang/String;Lcom/android/server/wm/Task;)V
 HPLcom/android/server/wm/ActivityStack;->lambda$dumpActivities$13(ZLjava/io/PrintWriter;Ljava/io/FileDescriptor;ZZLjava/lang/String;Lcom/android/server/wm/Task;)V
 PLcom/android/server/wm/ActivityStack;->lambda$dumpDebug$21(Landroid/util/proto/ProtoOutputStream;ILcom/android/server/wm/Task;)V
 PLcom/android/server/wm/ActivityStack;->lambda$dumpDebugInnerStackOnly$22(Landroid/util/proto/ProtoOutputStream;ILcom/android/server/wm/Task;)V
 PLcom/android/server/wm/ActivityStack;->lambda$endImeAdjustAnimation$19(Lcom/android/server/wm/Task;)V
+PLcom/android/server/wm/ActivityStack;->lambda$finishAllActivitiesImmediately$7(Lcom/android/server/wm/ActivityRecord;)V
+PLcom/android/server/wm/ActivityStack;->lambda$finishAllActivitiesImmediately$8(Lcom/android/server/wm/ActivityRecord;)V
 PLcom/android/server/wm/ActivityStack;->lambda$finishAllActivitiesImmediately$9(Lcom/android/server/wm/ActivityRecord;)V
 PLcom/android/server/wm/ActivityStack;->lambda$finishIfVoiceTask$8(Lcom/android/server/wm/Task;Lcom/android/server/wm/ActivityRecord;)V
 HPLcom/android/server/wm/ActivityStack;->lambda$getDumpActivitiesLocked$14(Lcom/android/server/am/ActivityManagerService$ItemMatcher;Ljava/util/ArrayList;Lcom/android/server/wm/ActivityRecord;)V
+PLcom/android/server/wm/ActivityStack;->lambda$getOccludingActivityAbove$10(Lcom/android/server/wm/ActivityRecord;)Z
 HPLcom/android/server/wm/ActivityStack;->lambda$goToSleep$5(Lcom/android/server/wm/ActivityRecord;)V
 HPLcom/android/server/wm/ActivityStack;->lambda$goToSleep$6(Lcom/android/server/wm/ActivityRecord;)V
 HPLcom/android/server/wm/ActivityStack;->lambda$navigateUpTo$10(Landroid/content/ComponentName;Lcom/android/server/wm/ActivityRecord;)Z
+PLcom/android/server/wm/ActivityStack;->lambda$navigateUpTo$10(Lcom/android/server/wm/ActivityRecord;[I[Landroid/content/Intent;Lcom/android/server/wm/ActivityRecord;)Ljava/lang/Boolean;
 PLcom/android/server/wm/ActivityStack;->lambda$navigateUpTo$11(Lcom/android/server/wm/ActivityRecord;[I[Landroid/content/Intent;Lcom/android/server/wm/ActivityRecord;)Ljava/lang/Boolean;
+PLcom/android/server/wm/ActivityStack;->lambda$navigateUpTo$8(Landroid/content/ComponentName;Lcom/android/server/wm/ActivityRecord;)Z
+PLcom/android/server/wm/ActivityStack;->lambda$navigateUpTo$9(Landroid/content/ComponentName;Lcom/android/server/wm/ActivityRecord;)Z
+PLcom/android/server/wm/ActivityStack;->lambda$navigateUpTo$9(Lcom/android/server/wm/ActivityRecord;[I[Landroid/content/Intent;Lcom/android/server/wm/ActivityRecord;)Ljava/lang/Boolean;
 PLcom/android/server/wm/ActivityStack;->lambda$onAnimationStart$20(Lcom/android/server/wm/WindowState;)V
 PLcom/android/server/wm/ActivityStack;->lambda$onConfigurationChanged$0(Lcom/android/server/wm/WindowState;)V
 PLcom/android/server/wm/ActivityStack;->lambda$resetCurrentBoundsAnimation$17$ActivityStack(Lcom/android/server/wm/BoundsAnimationController;)V
-PLcom/android/server/wm/ActivityStack;->lambda$setWindowingMode$0$ActivityStack(IZZZZZ)V
+PLcom/android/server/wm/ActivityStack;->lambda$setWindowingMode$0$ActivityStack(IZ)V
+HPLcom/android/server/wm/ActivityStack;->lambda$setWindowingMode$0$ActivityStack(IZZZZZ)V
 HSPLcom/android/server/wm/ActivityStack;->lambda$setWindowingMode$1$ActivityStack(IZZZZZ)V
+PLcom/android/server/wm/ActivityStack;->lambda$startActivityLocked$6(Lcom/android/server/wm/ActivityRecord;)Z
 HPLcom/android/server/wm/ActivityStack;->lambda$startActivityLocked$7(Lcom/android/server/wm/ActivityRecord;)Z
+PLcom/android/server/wm/ActivityStack;->lambda$switchUser$3$ActivityStack(Lcom/android/server/wm/Task;)V
 PLcom/android/server/wm/ActivityStack;->lambda$switchUser$4$ActivityStack(Lcom/android/server/wm/Task;)V
 HPLcom/android/server/wm/ActivityStack;->lambda$topRunningActivity$1(Lcom/android/server/wm/ActivityRecord;)Z
 HSPLcom/android/server/wm/ActivityStack;->lambda$topRunningActivity$2(Lcom/android/server/wm/ActivityRecord;)Z
+PLcom/android/server/wm/ActivityStack;->lambda$topRunningNonOverlayTaskActivity$2(Lcom/android/server/wm/ActivityRecord;)Z
 PLcom/android/server/wm/ActivityStack;->lambda$topRunningNonOverlayTaskActivity$3(Lcom/android/server/wm/ActivityRecord;)Z
 PLcom/android/server/wm/ActivityStack;->lambda$willActivityBeVisible$11(Lcom/android/server/wm/ActivityRecord;)Z
 PLcom/android/server/wm/ActivityStack;->lambda$willActivityBeVisible$12(Lcom/android/server/wm/ActivityRecord;)Z
@@ -38407,8 +41321,11 @@
 PLcom/android/server/wm/ActivityStack;->setTaskBounds(Landroid/graphics/Rect;)V
 PLcom/android/server/wm/ActivityStack;->setTaskBounds(Lcom/android/server/wm/Task;Landroid/graphics/Rect;)V
 PLcom/android/server/wm/ActivityStack;->setTaskDisplayedBounds(Landroid/graphics/Rect;)V
+PLcom/android/server/wm/ActivityStack;->setTile(Lcom/android/server/wm/TaskTile;)V
 PLcom/android/server/wm/ActivityStack;->setWindowingMode(I)V
+PLcom/android/server/wm/ActivityStack;->setWindowingMode(IZ)V
 HSPLcom/android/server/wm/ActivityStack;->setWindowingMode(IZZZZZ)V
+HPLcom/android/server/wm/ActivityStack;->setWindowingModeInSurfaceTransaction(IZ)V
 HSPLcom/android/server/wm/ActivityStack;->setWindowingModeInSurfaceTransaction(IZZZZZ)V
 HSPLcom/android/server/wm/ActivityStack;->shouldBeVisible(Lcom/android/server/wm/ActivityRecord;)Z
 PLcom/android/server/wm/ActivityStack;->shouldDeferStartOnMoveToFullscreen()Z
@@ -38456,10 +41373,12 @@
 PLcom/android/server/wm/ActivityStackSupervisor$PendingActivityLaunch;-><init>(Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;ILcom/android/server/wm/ActivityStack;Lcom/android/server/wm/WindowProcessController;)V
 HSPLcom/android/server/wm/ActivityStackSupervisor;-><clinit>()V
 HSPLcom/android/server/wm/ActivityStackSupervisor;-><init>(Lcom/android/server/wm/ActivityTaskManagerService;Landroid/os/Looper;)V
+PLcom/android/server/wm/ActivityStackSupervisor;->access$000(Lcom/android/server/wm/ActivityStackSupervisor;)Ljava/util/ArrayList;
 PLcom/android/server/wm/ActivityStackSupervisor;->access$100(Lcom/android/server/wm/ActivityStackSupervisor;)Landroid/app/ActivityOptions;
 PLcom/android/server/wm/ActivityStackSupervisor;->access$200(Lcom/android/server/wm/ActivityStackSupervisor;)Ljava/util/ArrayList;
 PLcom/android/server/wm/ActivityStackSupervisor;->access$300(Lcom/android/server/wm/ActivityStackSupervisor;)Ljava/util/ArrayList;
 PLcom/android/server/wm/ActivityStackSupervisor;->access$400(Lcom/android/server/wm/ActivityStackSupervisor;)Landroid/graphics/Rect;
+PLcom/android/server/wm/ActivityStackSupervisor;->access$500(Lcom/android/server/wm/ActivityStackSupervisor;)Lcom/android/server/wm/ActivityStackSupervisor$ActivityStackSupervisorHandler;
 PLcom/android/server/wm/ActivityStackSupervisor;->access$500(Lcom/android/server/wm/ActivityStackSupervisor;Lcom/android/server/wm/ActivityRecord;ZLjava/lang/String;)V
 PLcom/android/server/wm/ActivityStackSupervisor;->access$600(Lcom/android/server/wm/ActivityStackSupervisor;)Lcom/android/server/wm/ActivityStackSupervisor$ActivityStackSupervisorHandler;
 PLcom/android/server/wm/ActivityStackSupervisor;->access$600(Lcom/android/server/wm/ActivityStackSupervisor;Lcom/android/server/wm/ActivityRecord;)V
@@ -38518,10 +41437,12 @@
 PLcom/android/server/wm/ActivityStackSupervisor;->lambda$activityIdleInternalLocked$0$ActivityStackSupervisor()V
 PLcom/android/server/wm/ActivityStackSupervisor;->lambda$mLKHIIzkTAK9QSlSxia8-84y15M(Lcom/android/server/wm/ActivityStackSupervisor;Lcom/android/server/wm/ActivityRecord;)V
 PLcom/android/server/wm/ActivityStackSupervisor;->lambda$moveTasksToFullscreenStackLocked$1$ActivityStackSupervisor(Lcom/android/server/wm/ActivityStack;Z)V
+PLcom/android/server/wm/ActivityStackSupervisor;->lambda$removeStack$1$ActivityStackSupervisor(Lcom/android/server/wm/ActivityStack;)V
 PLcom/android/server/wm/ActivityStackSupervisor;->lambda$removeStack$2$ActivityStackSupervisor(Lcom/android/server/wm/ActivityStack;)V
 HSPLcom/android/server/wm/ActivityStackSupervisor;->logIfTransactionTooLarge(Landroid/content/Intent;Landroid/os/Bundle;)V
 HSPLcom/android/server/wm/ActivityStackSupervisor;->logStackState()V
 HPLcom/android/server/wm/ActivityStackSupervisor;->moveHomeStackToFrontIfNeeded(ILcom/android/server/wm/DisplayContent;Ljava/lang/String;)V
+PLcom/android/server/wm/ActivityStackSupervisor;->moveHomeStackToFrontIfNeeded(ILcom/android/server/wm/TaskDisplayArea;Ljava/lang/String;)V
 PLcom/android/server/wm/ActivityStackSupervisor;->moveTasksToFullscreenStackInSurfaceTransaction(Lcom/android/server/wm/ActivityStack;IZ)V
 PLcom/android/server/wm/ActivityStackSupervisor;->moveTasksToFullscreenStackLocked(Lcom/android/server/wm/ActivityStack;Z)V
 HSPLcom/android/server/wm/ActivityStackSupervisor;->nextTaskIdForUser(II)I
@@ -38538,6 +41459,7 @@
 HSPLcom/android/server/wm/ActivityStackSupervisor;->removeHistoryRecords(Lcom/android/server/wm/WindowProcessController;)V
 HSPLcom/android/server/wm/ActivityStackSupervisor;->removeHistoryRecords(Ljava/util/ArrayList;Lcom/android/server/wm/WindowProcessController;Ljava/lang/String;)V
 HPLcom/android/server/wm/ActivityStackSupervisor;->removeIdleTimeoutForActivity(Lcom/android/server/wm/ActivityRecord;)V
+PLcom/android/server/wm/ActivityStackSupervisor;->removePinnedStackInSurfaceTransaction(Lcom/android/server/wm/ActivityStack;)V
 PLcom/android/server/wm/ActivityStackSupervisor;->removeRestartTimeouts(Lcom/android/server/wm/ActivityRecord;)V
 HSPLcom/android/server/wm/ActivityStackSupervisor;->removeSleepTimeouts()V
 PLcom/android/server/wm/ActivityStackSupervisor;->removeStack(Lcom/android/server/wm/ActivityStack;)V
@@ -38623,6 +41545,7 @@
 HSPLcom/android/server/wm/ActivityStartInterceptor;->intercept(Landroid/content/Intent;Landroid/content/pm/ResolveInfo;Landroid/content/pm/ActivityInfo;Ljava/lang/String;Lcom/android/server/wm/Task;IILandroid/app/ActivityOptions;)Z
 HSPLcom/android/server/wm/ActivityStartInterceptor;->interceptHarmfulAppIfNeeded()Z
 HSPLcom/android/server/wm/ActivityStartInterceptor;->interceptLockTaskModeViolationPackageIfNeeded()Z
+HPLcom/android/server/wm/ActivityStartInterceptor;->interceptLockedManagedProfileIfNeeded()Z
 HSPLcom/android/server/wm/ActivityStartInterceptor;->interceptQuietProfileIfNeeded()Z
 HSPLcom/android/server/wm/ActivityStartInterceptor;->interceptSuspendedPackageIfNeeded()Z
 HSPLcom/android/server/wm/ActivityStartInterceptor;->interceptWithConfirmCredentialsIfNeeded(Landroid/content/pm/ActivityInfo;I)Landroid/content/Intent;
@@ -38648,6 +41571,7 @@
 HSPLcom/android/server/wm/ActivityStarter;->computeSourceStack()V
 PLcom/android/server/wm/ActivityStarter;->computeStackFocus(Lcom/android/server/wm/ActivityRecord;ZILandroid/app/ActivityOptions;)Lcom/android/server/wm/ActivityStack;
 HSPLcom/android/server/wm/ActivityStarter;->computeTargetTask()Lcom/android/server/wm/Task;
+PLcom/android/server/wm/ActivityStarter;->createLaunchIntent(Landroid/content/pm/AuxiliaryResolveInfo;Landroid/content/Intent;Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;Ljava/lang/String;I)Landroid/content/Intent;
 HPLcom/android/server/wm/ActivityStarter;->deliverNewIntent(Lcom/android/server/wm/ActivityRecord;)V
 HSPLcom/android/server/wm/ActivityStarter;->deliverToCurrentTopIfNeeded(Lcom/android/server/wm/ActivityStack;)I
 HPLcom/android/server/wm/ActivityStarter;->dump(Ljava/io/PrintWriter;Ljava/lang/String;)V
@@ -38722,6 +41646,7 @@
 PLcom/android/server/wm/ActivityTaskManagerService$2;->onDismissSucceeded()V
 HSPLcom/android/server/wm/ActivityTaskManagerService$FontScaleSettingObserver;-><init>(Lcom/android/server/wm/ActivityTaskManagerService;)V
 PLcom/android/server/wm/ActivityTaskManagerService$FontScaleSettingObserver;->onChange(ZLandroid/net/Uri;I)V
+PLcom/android/server/wm/ActivityTaskManagerService$FontScaleSettingObserver;->onChange(ZLjava/util/Collection;II)V
 HSPLcom/android/server/wm/ActivityTaskManagerService$H;-><init>(Lcom/android/server/wm/ActivityTaskManagerService;Landroid/os/Looper;)V
 HSPLcom/android/server/wm/ActivityTaskManagerService$Lifecycle;-><init>(Landroid/content/Context;)V
 HSPLcom/android/server/wm/ActivityTaskManagerService$Lifecycle;->getService()Lcom/android/server/wm/ActivityTaskManagerService;
@@ -38761,7 +41686,9 @@
 PLcom/android/server/wm/ActivityTaskManagerService$LocalService;->getTopVisibleActivities()Ljava/util/List;
 HPLcom/android/server/wm/ActivityTaskManagerService$LocalService;->handleAppCrashInActivityController(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;JLjava/lang/String;Ljava/lang/Runnable;)Z
 HSPLcom/android/server/wm/ActivityTaskManagerService$LocalService;->handleAppDied(Lcom/android/server/wm/WindowProcessController;ZLjava/lang/Runnable;)V
+PLcom/android/server/wm/ActivityTaskManagerService$LocalService;->hasResumedActivity(I)Z
 HSPLcom/android/server/wm/ActivityTaskManagerService$LocalService;->isCallerRecents(I)Z
+PLcom/android/server/wm/ActivityTaskManagerService$LocalService;->isDreaming()Z
 HSPLcom/android/server/wm/ActivityTaskManagerService$LocalService;->isFactoryTestProcess(Lcom/android/server/wm/WindowProcessController;)Z
 HPLcom/android/server/wm/ActivityTaskManagerService$LocalService;->isGetTasksAllowed(Ljava/lang/String;II)Z
 HSPLcom/android/server/wm/ActivityTaskManagerService$LocalService;->isHeavyWeightProcess(Lcom/android/server/wm/WindowProcessController;)Z
@@ -38774,6 +41701,7 @@
 PLcom/android/server/wm/ActivityTaskManagerService$LocalService;->notifyAppTransitionCancelled()V
 HSPLcom/android/server/wm/ActivityTaskManagerService$LocalService;->notifyAppTransitionFinished()V
 HSPLcom/android/server/wm/ActivityTaskManagerService$LocalService;->notifyDockedStackMinimizedChanged(Z)V
+HPLcom/android/server/wm/ActivityTaskManagerService$LocalService;->notifyDreamStateChanged(Z)V
 HPLcom/android/server/wm/ActivityTaskManagerService$LocalService;->notifyKeyguardFlagsChanged(Ljava/lang/Runnable;I)V
 HPLcom/android/server/wm/ActivityTaskManagerService$LocalService;->notifyKeyguardTrustedChanged()V
 PLcom/android/server/wm/ActivityTaskManagerService$LocalService;->notifyLockedProfile(II)V
@@ -38804,6 +41732,7 @@
 PLcom/android/server/wm/ActivityTaskManagerService$LocalService;->removeUser(I)V
 HSPLcom/android/server/wm/ActivityTaskManagerService$LocalService;->resumeTopActivities(Z)V
 PLcom/android/server/wm/ActivityTaskManagerService$LocalService;->saveANRState(Ljava/lang/String;)V
+HPLcom/android/server/wm/ActivityTaskManagerService$LocalService;->scheduleDestroyAllActivities(Ljava/lang/String;)V
 PLcom/android/server/wm/ActivityTaskManagerService$LocalService;->sendActivityResult(ILandroid/os/IBinder;Ljava/lang/String;IILandroid/content/Intent;)V
 PLcom/android/server/wm/ActivityTaskManagerService$LocalService;->setAllowAppSwitches(Ljava/lang/String;II)V
 PLcom/android/server/wm/ActivityTaskManagerService$LocalService;->setCompanionAppPackages(ILjava/util/Set;)V
@@ -38816,7 +41745,7 @@
 HPLcom/android/server/wm/ActivityTaskManagerService$LocalService;->startActivitiesInPackage(IIILjava/lang/String;Ljava/lang/String;[Landroid/content/Intent;[Ljava/lang/String;Landroid/os/IBinder;Lcom/android/server/wm/SafeActivityOptions;IZLcom/android/server/am/PendingIntentRecord;Z)I
 PLcom/android/server/wm/ActivityTaskManagerService$LocalService;->startActivitiesInPackage(IIILjava/lang/String;[Landroid/content/Intent;[Ljava/lang/String;Landroid/os/IBinder;Lcom/android/server/wm/SafeActivityOptions;IZLcom/android/server/am/PendingIntentRecord;Z)I
 PLcom/android/server/wm/ActivityTaskManagerService$LocalService;->startActivityAsUser(Landroid/app/IApplicationThread;Ljava/lang/String;Landroid/content/Intent;Landroid/os/Bundle;I)I
-PLcom/android/server/wm/ActivityTaskManagerService$LocalService;->startActivityAsUser(Landroid/app/IApplicationThread;Ljava/lang/String;Ljava/lang/String;Landroid/content/Intent;Landroid/os/IBinder;ILandroid/os/Bundle;I)I
+HPLcom/android/server/wm/ActivityTaskManagerService$LocalService;->startActivityAsUser(Landroid/app/IApplicationThread;Ljava/lang/String;Ljava/lang/String;Landroid/content/Intent;Landroid/os/IBinder;ILandroid/os/Bundle;I)I
 HPLcom/android/server/wm/ActivityTaskManagerService$LocalService;->startActivityInPackage(IIILjava/lang/String;Landroid/content/Intent;Ljava/lang/String;Landroid/os/IBinder;Ljava/lang/String;IILcom/android/server/wm/SafeActivityOptions;ILcom/android/server/wm/Task;Ljava/lang/String;ZLcom/android/server/am/PendingIntentRecord;Z)I
 HPLcom/android/server/wm/ActivityTaskManagerService$LocalService;->startActivityInPackage(IIILjava/lang/String;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;Landroid/os/IBinder;Ljava/lang/String;IILcom/android/server/wm/SafeActivityOptions;ILcom/android/server/wm/Task;Ljava/lang/String;ZLcom/android/server/am/PendingIntentRecord;Z)I
 PLcom/android/server/wm/ActivityTaskManagerService$LocalService;->startHomeActivity(ILjava/lang/String;)Z
@@ -38835,20 +41764,27 @@
 PLcom/android/server/wm/ActivityTaskManagerService;->access$000(Lcom/android/server/wm/ActivityTaskManagerService;I)V
 PLcom/android/server/wm/ActivityTaskManagerService;->access$1000(Lcom/android/server/wm/ActivityTaskManagerService;)Z
 PLcom/android/server/wm/ActivityTaskManagerService;->access$1000(Lcom/android/server/wm/ActivityTaskManagerService;Ljava/lang/String;)V
+PLcom/android/server/wm/ActivityTaskManagerService;->access$1100(Lcom/android/server/wm/ActivityTaskManagerService;)Z
 PLcom/android/server/wm/ActivityTaskManagerService;->access$1100(Lcom/android/server/wm/ActivityTaskManagerService;Landroid/util/proto/ProtoOutputStream;IZ)V
 PLcom/android/server/wm/ActivityTaskManagerService;->access$1100(Lcom/android/server/wm/ActivityTaskManagerService;Ljava/lang/String;)V
 HSPLcom/android/server/wm/ActivityTaskManagerService;->access$1200(Lcom/android/server/wm/ActivityTaskManagerService;)Lcom/android/server/wm/MirrorActiveUids;
 PLcom/android/server/wm/ActivityTaskManagerService;->access$1200(Lcom/android/server/wm/ActivityTaskManagerService;Landroid/util/proto/ProtoOutputStream;IZ)V
+PLcom/android/server/wm/ActivityTaskManagerService;->access$1200(Lcom/android/server/wm/ActivityTaskManagerService;Ljava/lang/String;)V
 PLcom/android/server/wm/ActivityTaskManagerService;->access$1300(Lcom/android/server/wm/ActivityTaskManagerService;)Landroid/util/SparseArray;
 HSPLcom/android/server/wm/ActivityTaskManagerService;->access$1300(Lcom/android/server/wm/ActivityTaskManagerService;)Lcom/android/server/wm/MirrorActiveUids;
 HPLcom/android/server/wm/ActivityTaskManagerService;->access$1400(Lcom/android/server/wm/ActivityTaskManagerService;)Landroid/util/SparseArray;
+PLcom/android/server/wm/ActivityTaskManagerService;->access$1400(Lcom/android/server/wm/ActivityTaskManagerService;)Lcom/android/server/wm/MirrorActiveUids;
 PLcom/android/server/wm/ActivityTaskManagerService;->access$1400(Lcom/android/server/wm/ActivityTaskManagerService;)Lcom/android/server/wm/RecentTasks;
+PLcom/android/server/wm/ActivityTaskManagerService;->access$1500(Lcom/android/server/wm/ActivityTaskManagerService;)Landroid/util/SparseArray;
 HSPLcom/android/server/wm/ActivityTaskManagerService;->access$1500(Lcom/android/server/wm/ActivityTaskManagerService;)Lcom/android/server/wm/RecentTasks;
 PLcom/android/server/wm/ActivityTaskManagerService;->access$1500(Lcom/android/server/wm/ActivityTaskManagerService;Landroid/content/res/Configuration;Lcom/android/server/wm/ActivityRecord;ZZIZ)Z
+PLcom/android/server/wm/ActivityTaskManagerService;->access$1600(Lcom/android/server/wm/ActivityTaskManagerService;)Lcom/android/server/wm/RecentTasks;
 PLcom/android/server/wm/ActivityTaskManagerService;->access$1600(Lcom/android/server/wm/ActivityTaskManagerService;IZZ)Landroid/app/ActivityManager$TaskSnapshot;
+PLcom/android/server/wm/ActivityTaskManagerService;->access$1600(Lcom/android/server/wm/ActivityTaskManagerService;Landroid/content/res/Configuration;Lcom/android/server/wm/ActivityRecord;ZZIZ)Z
 PLcom/android/server/wm/ActivityTaskManagerService;->access$1700(Lcom/android/server/wm/ActivityTaskManagerService;)Ljava/util/Map;
 HPLcom/android/server/wm/ActivityTaskManagerService;->access$1700(Lcom/android/server/wm/ActivityTaskManagerService;IZZ)Landroid/app/ActivityManager$TaskSnapshot;
 PLcom/android/server/wm/ActivityTaskManagerService;->access$1800(Lcom/android/server/wm/ActivityTaskManagerService;)Ljava/util/Map;
+PLcom/android/server/wm/ActivityTaskManagerService;->access$1900(Lcom/android/server/wm/ActivityTaskManagerService;)Ljava/util/Map;
 HSPLcom/android/server/wm/ActivityTaskManagerService;->access$200(Lcom/android/server/wm/ActivityTaskManagerService;)V
 PLcom/android/server/wm/ActivityTaskManagerService;->access$300(Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService$PendingAssistExtras;)V
 PLcom/android/server/wm/ActivityTaskManagerService;->access$500(Lcom/android/server/wm/ActivityTaskManagerService;)Lcom/android/server/wm/TaskChangeNotificationController;
@@ -38859,7 +41795,9 @@
 PLcom/android/server/wm/ActivityTaskManagerService;->access$700(Lcom/android/server/wm/ActivityTaskManagerService;Z)V
 PLcom/android/server/wm/ActivityTaskManagerService;->access$800(Lcom/android/server/wm/ActivityTaskManagerService;)Z
 HSPLcom/android/server/wm/ActivityTaskManagerService;->access$800(Lcom/android/server/wm/ActivityTaskManagerService;Z)V
+PLcom/android/server/wm/ActivityTaskManagerService;->access$802(Lcom/android/server/wm/ActivityTaskManagerService;Z)Z
 HSPLcom/android/server/wm/ActivityTaskManagerService;->access$900(Lcom/android/server/wm/ActivityTaskManagerService;)Z
+PLcom/android/server/wm/ActivityTaskManagerService;->access$900(Lcom/android/server/wm/ActivityTaskManagerService;Z)V
 HSPLcom/android/server/wm/ActivityTaskManagerService;->acquireSleepToken(Ljava/lang/String;I)Lcom/android/server/wm/ActivityTaskManagerInternal$SleepToken;
 HPLcom/android/server/wm/ActivityTaskManagerService;->activityDestroyed(Landroid/os/IBinder;)V
 HSPLcom/android/server/wm/ActivityTaskManagerService;->activityIdle(Landroid/os/IBinder;Landroid/content/res/Configuration;Z)V
@@ -38905,6 +41843,7 @@
 PLcom/android/server/wm/ActivityTaskManagerService;->dumpActivityContainersLocked(Ljava/io/PrintWriter;)V
 PLcom/android/server/wm/ActivityTaskManagerService;->dumpActivityStarterLocked(Ljava/io/PrintWriter;Ljava/lang/String;)V
 PLcom/android/server/wm/ActivityTaskManagerService;->dumpLastANRLocked(Ljava/io/PrintWriter;)V
+PLcom/android/server/wm/ActivityTaskManagerService;->enforceCallerIsDream(Ljava/lang/String;)V
 HSPLcom/android/server/wm/ActivityTaskManagerService;->enforceCallerIsRecentsOrHasPermission(Ljava/lang/String;Ljava/lang/String;)V
 HPLcom/android/server/wm/ActivityTaskManagerService;->enforceNotIsolatedCaller(Ljava/lang/String;)V
 HPLcom/android/server/wm/ActivityTaskManagerService;->enqueueAssistContext(ILandroid/content/Intent;Ljava/lang/String;Landroid/app/IAssistDataReceiver;Landroid/os/Bundle;Landroid/os/IBinder;ZZILandroid/os/Bundle;JI)Lcom/android/server/wm/ActivityTaskManagerService$PendingAssistExtras;
@@ -38936,6 +41875,7 @@
 HPLcom/android/server/wm/ActivityTaskManagerService;->getDeviceConfigurationInfo()Landroid/content/pm/ConfigurationInfo;
 HSPLcom/android/server/wm/ActivityTaskManagerService;->getDisplayId(Landroid/os/IBinder;)I
 HPLcom/android/server/wm/ActivityTaskManagerService;->getFilteredTasks(III)Ljava/util/List;
+HPLcom/android/server/wm/ActivityTaskManagerService;->getFilteredTasks(IZ)Ljava/util/List;
 HPLcom/android/server/wm/ActivityTaskManagerService;->getFocusedStackInfo()Landroid/app/ActivityManager$StackInfo;
 HSPLcom/android/server/wm/ActivityTaskManagerService;->getGlobalConfiguration()Landroid/content/res/Configuration;
 HPLcom/android/server/wm/ActivityTaskManagerService;->getGlobalConfigurationForCallingPid()Landroid/content/res/Configuration;
@@ -38963,18 +41903,21 @@
 HPLcom/android/server/wm/ActivityTaskManagerService;->getRecentTasks(III)Landroid/content/pm/ParceledListSlice;
 HPLcom/android/server/wm/ActivityTaskManagerService;->getRequestedOrientation(Landroid/os/IBinder;)I
 HSPLcom/android/server/wm/ActivityTaskManagerService;->getStackInfo(II)Landroid/app/ActivityManager$StackInfo;
+PLcom/android/server/wm/ActivityTaskManagerService;->getSysUiServiceComponentLocked()Landroid/content/ComponentName;
 HPLcom/android/server/wm/ActivityTaskManagerService;->getTaskBounds(I)Landroid/graphics/Rect;
 HSPLcom/android/server/wm/ActivityTaskManagerService;->getTaskChangeNotificationController()Lcom/android/server/wm/TaskChangeNotificationController;
 PLcom/android/server/wm/ActivityTaskManagerService;->getTaskDescription(I)Landroid/app/ActivityManager$TaskDescription;
 HPLcom/android/server/wm/ActivityTaskManagerService;->getTaskDescriptionIcon(Ljava/lang/String;I)Landroid/graphics/Bitmap;
 HPLcom/android/server/wm/ActivityTaskManagerService;->getTaskForActivity(Landroid/os/IBinder;Z)I
-PLcom/android/server/wm/ActivityTaskManagerService;->getTaskOrganizerController()Landroid/app/ITaskOrganizerController;
+HPLcom/android/server/wm/ActivityTaskManagerService;->getTaskOrganizerController()Landroid/app/ITaskOrganizerController;
+PLcom/android/server/wm/ActivityTaskManagerService;->getTaskOrganizerController()Landroid/window/ITaskOrganizerController;
 HPLcom/android/server/wm/ActivityTaskManagerService;->getTaskSnapshot(IZ)Landroid/app/ActivityManager$TaskSnapshot;
 HPLcom/android/server/wm/ActivityTaskManagerService;->getTaskSnapshot(IZZ)Landroid/app/ActivityManager$TaskSnapshot;
 HPLcom/android/server/wm/ActivityTaskManagerService;->getTasks(I)Ljava/util/List;
 HPLcom/android/server/wm/ActivityTaskManagerService;->getTopDisplayFocusedStack()Lcom/android/server/wm/ActivityStack;
 HPLcom/android/server/wm/ActivityTaskManagerService;->getUidState(I)I
 HSPLcom/android/server/wm/ActivityTaskManagerService;->getUserManager()Lcom/android/server/pm/UserManagerService;
+PLcom/android/server/wm/ActivityTaskManagerService;->getWindowOrganizerController()Landroid/window/IWindowOrganizerController;
 HPLcom/android/server/wm/ActivityTaskManagerService;->handleIncomingUser(IIILjava/lang/String;)I
 PLcom/android/server/wm/ActivityTaskManagerService;->hasSystemAlertWindowPermission(IILjava/lang/String;)Z
 PLcom/android/server/wm/ActivityTaskManagerService;->hasUserRestriction(Ljava/lang/String;I)Z
@@ -39008,11 +41951,14 @@
 PLcom/android/server/wm/ActivityTaskManagerService;->lambda$U6g1UdnOPnEF9wX1OTm9nKVXY5k(Lcom/android/server/wm/ActivityTaskManagerService;Ljava/util/Locale;)V
 HSPLcom/android/server/wm/ActivityTaskManagerService;->lambda$applyUpdateLockStateLocked$0$ActivityTaskManagerService(ZLcom/android/server/wm/ActivityRecord;)V
 HSPLcom/android/server/wm/ActivityTaskManagerService;->lambda$applyUpdateVrModeLocked$5$ActivityTaskManagerService(Lcom/android/server/wm/ActivityRecord;)V
+HPLcom/android/server/wm/ActivityTaskManagerService;->lambda$applyUpdateVrModeLocked$6$ActivityTaskManagerService(Lcom/android/server/wm/ActivityRecord;)V
 PLcom/android/server/wm/ActivityTaskManagerService;->lambda$enterPictureInPictureMode$4$ActivityTaskManagerService(Lcom/android/server/wm/ActivityRecord;Landroid/app/PictureInPictureParams;)V
 HSPLcom/android/server/wm/ActivityTaskManagerService;->lambda$notifyEnterAnimationComplete$1$ActivityTaskManagerService(Landroid/os/IBinder;)V
 HPLcom/android/server/wm/ActivityTaskManagerService;->lambda$onScreenAwakeChanged$3$ActivityTaskManagerService(Z)V
 HSPLcom/android/server/wm/ActivityTaskManagerService;->lambda$postFinishBooting$6$ActivityTaskManagerService(ZZ)V
+PLcom/android/server/wm/ActivityTaskManagerService;->lambda$postFinishBooting$7$ActivityTaskManagerService(ZZ)V
 HSPLcom/android/server/wm/ActivityTaskManagerService;->lambda$scheduleAppGcsLocked$7$ActivityTaskManagerService()V
+HPLcom/android/server/wm/ActivityTaskManagerService;->lambda$scheduleAppGcsLocked$8$ActivityTaskManagerService()V
 HSPLcom/android/server/wm/ActivityTaskManagerService;->lambda$setLockScreenShown$2$ActivityTaskManagerService(Z)V
 PLcom/android/server/wm/ActivityTaskManagerService;->lambda$yP9TbBmrgQ4lrgcxb-8oL1pBAs4(Lcom/android/server/wm/ActivityTaskManagerService;ILandroid/content/res/Configuration;)V
 PLcom/android/server/wm/ActivityTaskManagerService;->logAppTooSlow(Lcom/android/server/wm/WindowProcessController;JLjava/lang/String;)V
@@ -39020,6 +41966,7 @@
 HPLcom/android/server/wm/ActivityTaskManagerService;->moveActivityTaskToBack(Landroid/os/IBinder;Z)Z
 PLcom/android/server/wm/ActivityTaskManagerService;->moveTaskToFront(Landroid/app/IApplicationThread;Ljava/lang/String;IILandroid/os/Bundle;)V
 HPLcom/android/server/wm/ActivityTaskManagerService;->moveTaskToFrontLocked(Landroid/app/IApplicationThread;Ljava/lang/String;IILcom/android/server/wm/SafeActivityOptions;Z)V
+PLcom/android/server/wm/ActivityTaskManagerService;->moveTaskToSplitScreenPrimaryTile(Lcom/android/server/wm/Task;Z)V
 HPLcom/android/server/wm/ActivityTaskManagerService;->navigateUpTo(Landroid/os/IBinder;Landroid/content/Intent;ILandroid/content/Intent;)Z
 HSPLcom/android/server/wm/ActivityTaskManagerService;->notifyActivityDrawn(Landroid/os/IBinder;)V
 HSPLcom/android/server/wm/ActivityTaskManagerService;->notifyEnterAnimationComplete(Landroid/os/IBinder;)V
@@ -39087,7 +42034,7 @@
 PLcom/android/server/wm/ActivityTaskManagerService;->shouldDisableNonVrUiLocked()Z
 PLcom/android/server/wm/ActivityTaskManagerService;->shouldUpRecreateTask(Landroid/os/IBinder;Ljava/lang/String;)Z
 HSPLcom/android/server/wm/ActivityTaskManagerService;->start()V
-PLcom/android/server/wm/ActivityTaskManagerService;->startActivities(Landroid/app/IApplicationThread;Ljava/lang/String;Ljava/lang/String;[Landroid/content/Intent;[Ljava/lang/String;Landroid/os/IBinder;Landroid/os/Bundle;I)I
+HPLcom/android/server/wm/ActivityTaskManagerService;->startActivities(Landroid/app/IApplicationThread;Ljava/lang/String;Ljava/lang/String;[Landroid/content/Intent;[Ljava/lang/String;Landroid/os/IBinder;Landroid/os/Bundle;I)I
 PLcom/android/server/wm/ActivityTaskManagerService;->startActivities(Landroid/app/IApplicationThread;Ljava/lang/String;[Landroid/content/Intent;[Ljava/lang/String;Landroid/os/IBinder;Landroid/os/Bundle;I)I
 HPLcom/android/server/wm/ActivityTaskManagerService;->startActivity(Landroid/app/IApplicationThread;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;Landroid/os/IBinder;Ljava/lang/String;IILandroid/app/ProfilerInfo;Landroid/os/Bundle;)I
 HPLcom/android/server/wm/ActivityTaskManagerService;->startActivity(Landroid/app/IApplicationThread;Ljava/lang/String;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;Landroid/os/IBinder;Ljava/lang/String;IILandroid/app/ProfilerInfo;Landroid/os/Bundle;)I
@@ -39105,12 +42052,14 @@
 PLcom/android/server/wm/ActivityTaskManagerService;->startDreamActivity(Landroid/content/Intent;)Z
 PLcom/android/server/wm/ActivityTaskManagerService;->startLockTaskModeByToken(Landroid/os/IBinder;)V
 PLcom/android/server/wm/ActivityTaskManagerService;->startLockTaskModeLocked(Lcom/android/server/wm/Task;Z)V
+PLcom/android/server/wm/ActivityTaskManagerService;->startNextMatchingActivity(Landroid/os/IBinder;Landroid/content/Intent;Landroid/os/Bundle;)Z
 HSPLcom/android/server/wm/ActivityTaskManagerService;->startProcessAsync(Lcom/android/server/wm/ActivityRecord;ZZLjava/lang/String;)V
 HPLcom/android/server/wm/ActivityTaskManagerService;->startRecentsActivity(Landroid/content/Intent;Landroid/app/IAssistDataReceiver;Landroid/view/IRecentsAnimationRunner;)V
 PLcom/android/server/wm/ActivityTaskManagerService;->startSystemLockTaskMode(I)V
 HPLcom/android/server/wm/ActivityTaskManagerService;->startTimeTrackingFocusedActivityLocked()V
 PLcom/android/server/wm/ActivityTaskManagerService;->startVoiceActivity(Ljava/lang/String;IILandroid/content/Intent;Ljava/lang/String;Landroid/service/voice/IVoiceInteractionSession;Lcom/android/internal/app/IVoiceInteractor;ILandroid/app/ProfilerInfo;Landroid/os/Bundle;I)I
 HPLcom/android/server/wm/ActivityTaskManagerService;->stopAppSwitches()V
+PLcom/android/server/wm/ActivityTaskManagerService;->stopLockTaskModeByToken(Landroid/os/IBinder;)V
 PLcom/android/server/wm/ActivityTaskManagerService;->stopLockTaskModeInternal(Lcom/android/server/wm/Task;Z)V
 PLcom/android/server/wm/ActivityTaskManagerService;->stopSystemLockTaskMode()V
 PLcom/android/server/wm/ActivityTaskManagerService;->unregisterRemoteAnimations(Landroid/os/IBinder;)V
@@ -39446,6 +42395,7 @@
 HSPLcom/android/server/wm/ConfigurationContainer;->inSplitScreenSecondaryWindowingMode()Z
 HSPLcom/android/server/wm/ConfigurationContainer;->inSplitScreenWindowingMode()Z
 HSPLcom/android/server/wm/ConfigurationContainer;->isActivityTypeAssistant()Z
+HPLcom/android/server/wm/ConfigurationContainer;->isActivityTypeDream()Z
 HSPLcom/android/server/wm/ConfigurationContainer;->isActivityTypeHome()Z
 HSPLcom/android/server/wm/ConfigurationContainer;->isActivityTypeRecents()Z
 HSPLcom/android/server/wm/ConfigurationContainer;->isActivityTypeStandard()Z
@@ -39514,6 +42464,7 @@
 HPLcom/android/server/wm/DisplayArea$Root;->getSurfaceControl()Landroid/view/SurfaceControl;
 PLcom/android/server/wm/DisplayArea$Root;->getSurfaceHeight()I
 PLcom/android/server/wm/DisplayArea$Root;->getSurfaceWidth()I
+HPLcom/android/server/wm/DisplayArea$Root;->lambda$prepareSurfaces$0(Lcom/android/server/wm/Task;)Ljava/lang/Boolean;
 PLcom/android/server/wm/DisplayArea$Root;->makeAnimationLeash()Landroid/view/SurfaceControl$Builder;
 HSPLcom/android/server/wm/DisplayArea$Root;->onConfigurationChanged(Landroid/content/res/Configuration;)V
 HSPLcom/android/server/wm/DisplayArea$Root;->prepareSurfaces()V
@@ -39532,22 +42483,27 @@
 HPLcom/android/server/wm/DisplayArea$Type;->typeOf(Lcom/android/server/wm/WindowToken;)Lcom/android/server/wm/DisplayArea$Type;
 HSPLcom/android/server/wm/DisplayArea$Type;->values()[Lcom/android/server/wm/DisplayArea$Type;
 HSPLcom/android/server/wm/DisplayArea;-><init>(Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/DisplayArea$Type;Ljava/lang/String;)V
+PLcom/android/server/wm/DisplayArea;-><init>(Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/DisplayArea$Type;Ljava/lang/String;I)V
 PLcom/android/server/wm/DisplayArea;->commitPendingTransaction()V
 HPLcom/android/server/wm/DisplayArea;->dumpDebug(Landroid/util/proto/ProtoOutputStream;JI)V
 HSPLcom/android/server/wm/DisplayArea;->fillsParent()Z
 HPLcom/android/server/wm/DisplayArea;->getAnimationLeashParent()Landroid/view/SurfaceControl;
+HPLcom/android/server/wm/DisplayArea;->getDisplayArea()Lcom/android/server/wm/DisplayArea;
 HSPLcom/android/server/wm/DisplayArea;->getName()Ljava/lang/String;
 HPLcom/android/server/wm/DisplayArea;->getParentSurfaceControl()Landroid/view/SurfaceControl;
 HSPLcom/android/server/wm/DisplayArea;->getPendingTransaction()Landroid/view/SurfaceControl$Transaction;
+PLcom/android/server/wm/DisplayArea;->getProtoFieldId()J
 HSPLcom/android/server/wm/DisplayArea;->getSurfaceControl()Landroid/view/SurfaceControl;
 HPLcom/android/server/wm/DisplayArea;->getSurfaceHeight()I
 HPLcom/android/server/wm/DisplayArea;->getSurfaceWidth()I
+HPLcom/android/server/wm/DisplayArea;->isOrganized()Z
 HPLcom/android/server/wm/DisplayArea;->makeAnimationLeash()Landroid/view/SurfaceControl$Builder;
 HPLcom/android/server/wm/DisplayArea;->onAnimationLeashCreated(Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl;)V
 HPLcom/android/server/wm/DisplayArea;->onAnimationLeashLost(Landroid/view/SurfaceControl$Transaction;)V
 HSPLcom/android/server/wm/DisplayArea;->onChildPositionChanged(Lcom/android/server/wm/WindowContainer;)V
 HSPLcom/android/server/wm/DisplayArea;->onConfigurationChanged(Landroid/content/res/Configuration;)V
 PLcom/android/server/wm/DisplayArea;->toString()Ljava/lang/String;
+HSPLcom/android/server/wm/DisplayAreaOrganizerController;-><init>(Lcom/android/server/wm/ActivityTaskManagerService;)V
 PLcom/android/server/wm/DisplayAreaPolicy$1;-><clinit>()V
 HSPLcom/android/server/wm/DisplayAreaPolicy$Default$Provider;-><init>()V
 HSPLcom/android/server/wm/DisplayAreaPolicy$Default$Provider;->instantiate(Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayArea$Root;Lcom/android/server/wm/DisplayArea;Lcom/android/server/wm/DisplayContent$TaskContainers;)Lcom/android/server/wm/DisplayAreaPolicy;
@@ -39556,6 +42512,8 @@
 HSPLcom/android/server/wm/DisplayAreaPolicy$Default;->attachDisplayAreas()V
 HSPLcom/android/server/wm/DisplayAreaPolicy$DefaultProvider;-><init>()V
 HSPLcom/android/server/wm/DisplayAreaPolicy$DefaultProvider;->instantiate(Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayArea$Root;Lcom/android/server/wm/DisplayArea;Lcom/android/server/wm/DisplayContent$TaskContainers;)Lcom/android/server/wm/DisplayAreaPolicy;
+PLcom/android/server/wm/DisplayAreaPolicy$DefaultProvider;->instantiate(Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayArea$Root;Lcom/android/server/wm/DisplayArea;Lcom/android/server/wm/TaskContainers;)Lcom/android/server/wm/DisplayAreaPolicy;
+PLcom/android/server/wm/DisplayAreaPolicy$DefaultProvider;->instantiate(Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayArea$Root;Lcom/android/server/wm/DisplayArea;Lcom/android/server/wm/TaskDisplayArea;)Lcom/android/server/wm/DisplayAreaPolicy;
 HSPLcom/android/server/wm/DisplayAreaPolicy$Provider;->fromResources(Landroid/content/res/Resources;)Lcom/android/server/wm/DisplayAreaPolicy$Provider;
 HSPLcom/android/server/wm/DisplayAreaPolicy;-><init>(Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayArea$Root;Lcom/android/server/wm/DisplayArea;Lcom/android/server/wm/DisplayArea;)V
 HSPLcom/android/server/wm/DisplayAreaPolicy;-><init>(Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayArea$Root;Lcom/android/server/wm/DisplayArea;Lcom/android/server/wm/DisplayContent$TaskContainers;)V
@@ -39571,6 +42529,10 @@
 HSPLcom/android/server/wm/DisplayAreaPolicyBuilder$Result;->typeOfLayer(Lcom/android/server/policy/WindowManagerPolicy;I)I
 HSPLcom/android/server/wm/DisplayAreaPolicyBuilder;-><init>()V
 HSPLcom/android/server/wm/DisplayAreaPolicyBuilder;->build(Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayArea$Root;Lcom/android/server/wm/DisplayArea;Lcom/android/server/wm/DisplayArea;)Lcom/android/server/wm/DisplayAreaPolicyBuilder$Result;
+PLcom/android/server/wm/DisplayContent$1;-><init>(Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/ActivityRecord;)V
+PLcom/android/server/wm/DisplayContent$1;->done()V
+PLcom/android/server/wm/DisplayContent$1;->onAppTransitionFinishedLocked(Landroid/os/IBinder;)V
+PLcom/android/server/wm/DisplayContent$1;->onAppTransitionTimeoutLocked()V
 HSPLcom/android/server/wm/DisplayContent$AboveAppWindowContainers;-><init>(Lcom/android/server/wm/DisplayContent;Ljava/lang/String;Lcom/android/server/wm/WindowManagerService;)V
 HSPLcom/android/server/wm/DisplayContent$AboveAppWindowContainers;->assignChildLayers(Landroid/view/SurfaceControl$Transaction;)V
 HSPLcom/android/server/wm/DisplayContent$AboveAppWindowContainers;->assignChildLayers(Landroid/view/SurfaceControl$Transaction;Lcom/android/server/wm/WindowContainer;)V
@@ -39600,6 +42562,7 @@
 HPLcom/android/server/wm/DisplayContent$NonAppWindowContainers;->lambda$new$1$DisplayContent$NonAppWindowContainers(Lcom/android/server/wm/WindowState;)Z
 HPLcom/android/server/wm/DisplayContent$NonAppWindowContainers;->lambda$new$1(Lcom/android/server/wm/WindowState;)Z
 HSPLcom/android/server/wm/DisplayContent$NonAppWindowContainers;->prepareSurfaces()V
+HPLcom/android/server/wm/DisplayContent$NonAppWindowContainers;->shouldMagnify()Z
 PLcom/android/server/wm/DisplayContent$RemoteInsetsControlTarget;-><init>(Lcom/android/server/wm/DisplayContent;Landroid/view/IDisplayWindowInsetsController;)V
 PLcom/android/server/wm/DisplayContent$RemoteInsetsControlTarget;->hideInsets(IZ)V
 HPLcom/android/server/wm/DisplayContent$RemoteInsetsControlTarget;->notifyInsetsChanged()V
@@ -39681,10 +42644,13 @@
 HSPLcom/android/server/wm/DisplayContent;-><init>(Landroid/view/Display;Lcom/android/server/wm/RootWindowContainer;)V
 HSPLcom/android/server/wm/DisplayContent;->access$100(Lcom/android/server/wm/DisplayContent;)Lcom/android/server/wm/DisplayContent$TaskStackContainers;
 HSPLcom/android/server/wm/DisplayContent;->access$1002(Lcom/android/server/wm/DisplayContent;I)I
+PLcom/android/server/wm/DisplayContent;->access$200(Lcom/android/server/wm/DisplayContent;)Lcom/android/server/wm/DisplayContent$ImeContainer;
 HSPLcom/android/server/wm/DisplayContent;->access$200(Lcom/android/server/wm/DisplayContent;)Lcom/android/server/wm/DisplayContent$TaskContainers;
 HSPLcom/android/server/wm/DisplayContent;->access$200(Lcom/android/server/wm/DisplayContent;)Lcom/android/server/wm/DisplayContent$TaskStackContainers;
 HSPLcom/android/server/wm/DisplayContent;->access$200(Lcom/android/server/wm/DisplayContent;)Ljava/util/ArrayList;
+PLcom/android/server/wm/DisplayContent;->access$300(Lcom/android/server/wm/DisplayContent;)Lcom/android/server/wm/DisplayArea$Root;
 HSPLcom/android/server/wm/DisplayContent;->access$300(Lcom/android/server/wm/DisplayContent;)Ljava/util/ArrayList;
+PLcom/android/server/wm/DisplayContent;->access$400(Lcom/android/server/wm/DisplayContent;)Lcom/android/server/wm/DisplayAreaPolicy;
 HSPLcom/android/server/wm/DisplayContent;->access$400(Lcom/android/server/wm/DisplayContent;)Ljava/util/ArrayList;
 HSPLcom/android/server/wm/DisplayContent;->access$500(Lcom/android/server/wm/DisplayContent;)Lcom/android/server/wm/DisplayContent$NonAppWindowContainers;
 HSPLcom/android/server/wm/DisplayContent;->access$500(Lcom/android/server/wm/DisplayContent;)Ljava/util/ArrayList;
@@ -39713,7 +42679,10 @@
 HSPLcom/android/server/wm/DisplayContent;->amendWindowTapExcludeRegion(Landroid/graphics/Region;)V
 HPLcom/android/server/wm/DisplayContent;->animateForIme(FFF)Z
 HPLcom/android/server/wm/DisplayContent;->applyMagnificationSpec(Landroid/view/MagnificationSpec;)V
+HPLcom/android/server/wm/DisplayContent;->applyRotation(II)V
+PLcom/android/server/wm/DisplayContent;->applyRotationAndClearFixedRotation(II)V
 HPLcom/android/server/wm/DisplayContent;->applyRotationLocked(II)V
+HPLcom/android/server/wm/DisplayContent;->applySurfaceChangesTransaction()V
 HSPLcom/android/server/wm/DisplayContent;->applySurfaceChangesTransaction(Z)V
 HSPLcom/android/server/wm/DisplayContent;->assignChildLayers(Landroid/view/SurfaceControl$Transaction;)V
 HPLcom/android/server/wm/DisplayContent;->assignStackOrdering()V
@@ -39729,6 +42698,7 @@
 HSPLcom/android/server/wm/DisplayContent;->checkCompleteDeferredRemoval()Z
 HPLcom/android/server/wm/DisplayContent;->clearImeAdjustAnimation()Z
 HSPLcom/android/server/wm/DisplayContent;->clearLayoutNeeded()V
+HPLcom/android/server/wm/DisplayContent;->computeCompatSmallestWidth(ZIII)I
 HSPLcom/android/server/wm/DisplayContent;->computeCompatSmallestWidth(ZIIILandroid/view/DisplayCutout;)I
 PLcom/android/server/wm/DisplayContent;->computeImeControlTarget()Lcom/android/server/wm/InsetsControlTarget;
 HPLcom/android/server/wm/DisplayContent;->computeImeParent()Landroid/view/SurfaceControl;
@@ -39736,17 +42706,21 @@
 HSPLcom/android/server/wm/DisplayContent;->computeImeTargetIfNeeded(Lcom/android/server/wm/ActivityRecord;)V
 HSPLcom/android/server/wm/DisplayContent;->computeScreenAppConfiguration(Landroid/content/res/Configuration;IIIILandroid/view/DisplayCutout;)V
 HSPLcom/android/server/wm/DisplayContent;->computeScreenConfiguration(Landroid/content/res/Configuration;)V
+PLcom/android/server/wm/DisplayContent;->computeScreenConfiguration(Landroid/content/res/Configuration;I)Landroid/view/DisplayInfo;
 HSPLcom/android/server/wm/DisplayContent;->computeSizeRangesAndScreenLayout(Landroid/view/DisplayInfo;ZIIIFLandroid/content/res/Configuration;)V
 HSPLcom/android/server/wm/DisplayContent;->configureDisplayPolicy()V
 HPLcom/android/server/wm/DisplayContent;->continueUpdateImeTarget()V
+PLcom/android/server/wm/DisplayContent;->continueUpdateOrientationForDiffOrienLaunchingApp(Lcom/android/server/wm/WindowToken;)Z
 PLcom/android/server/wm/DisplayContent;->convertCropForSurfaceFlinger(Landroid/graphics/Rect;III)V
 PLcom/android/server/wm/DisplayContent;->createPortalWindowHandle(Ljava/lang/String;)Landroid/view/InputWindowHandle;
 HPLcom/android/server/wm/DisplayContent;->createRotationMatrix(IFFFFLandroid/graphics/Matrix;)V
 PLcom/android/server/wm/DisplayContent;->createRotationMatrix(IFFLandroid/graphics/Matrix;)V
 HSPLcom/android/server/wm/DisplayContent;->createStack(IIZ)Lcom/android/server/wm/ActivityStack;
 HSPLcom/android/server/wm/DisplayContent;->createStack(IIZLandroid/content/pm/ActivityInfo;Landroid/content/Intent;)Lcom/android/server/wm/ActivityStack;
+PLcom/android/server/wm/DisplayContent;->createStack(IIZLandroid/content/pm/ActivityInfo;Landroid/content/Intent;Z)Lcom/android/server/wm/ActivityStack;
 HSPLcom/android/server/wm/DisplayContent;->createStackUnchecked(IIIZ)Lcom/android/server/wm/ActivityStack;
 HSPLcom/android/server/wm/DisplayContent;->createStackUnchecked(IIIZLandroid/content/pm/ActivityInfo;Landroid/content/Intent;)Lcom/android/server/wm/ActivityStack;
+PLcom/android/server/wm/DisplayContent;->createStackUnchecked(IIIZLandroid/content/pm/ActivityInfo;Landroid/content/Intent;Z)Lcom/android/server/wm/ActivityStack;
 PLcom/android/server/wm/DisplayContent;->deferUpdateImeTarget()V
 HPLcom/android/server/wm/DisplayContent;->deltaRotation(II)I
 PLcom/android/server/wm/DisplayContent;->destroyLeakedSurfaces()Z
@@ -39766,6 +42740,7 @@
 HSPLcom/android/server/wm/DisplayContent;->getActivityRecord(Landroid/os/IBinder;)Lcom/android/server/wm/ActivityRecord;
 HPLcom/android/server/wm/DisplayContent;->getBounds(Landroid/graphics/Rect;I)V
 PLcom/android/server/wm/DisplayContent;->getCurrentOverrideConfigurationChanges()I
+HPLcom/android/server/wm/DisplayContent;->getDefaultTaskDisplayArea()Lcom/android/server/wm/TaskDisplayArea;
 HSPLcom/android/server/wm/DisplayContent;->getDisplay()Landroid/view/Display;
 HSPLcom/android/server/wm/DisplayContent;->getDisplayId()I
 HSPLcom/android/server/wm/DisplayContent;->getDisplayInfo()Landroid/view/DisplayInfo;
@@ -39778,7 +42753,7 @@
 PLcom/android/server/wm/DisplayContent;->getHomeActivity()Lcom/android/server/wm/ActivityRecord;
 HPLcom/android/server/wm/DisplayContent;->getHomeActivityForUser(I)Lcom/android/server/wm/ActivityRecord;
 HSPLcom/android/server/wm/DisplayContent;->getHomeStack()Lcom/android/server/wm/ActivityStack;
-PLcom/android/server/wm/DisplayContent;->getImeFallback()Lcom/android/server/wm/WindowState;
+HPLcom/android/server/wm/DisplayContent;->getImeFallback()Lcom/android/server/wm/WindowState;
 HPLcom/android/server/wm/DisplayContent;->getImeHostOrFallback(Lcom/android/server/wm/WindowState;)Lcom/android/server/wm/WindowState;
 HSPLcom/android/server/wm/DisplayContent;->getIndexOf(Lcom/android/server/wm/ActivityStack;)I
 HSPLcom/android/server/wm/DisplayContent;->getInputMonitor()Lcom/android/server/wm/InputMonitor;
@@ -39797,13 +42772,16 @@
 HSPLcom/android/server/wm/DisplayContent;->getNextStackId()I
 PLcom/android/server/wm/DisplayContent;->getOrCreateRootHomeTask()Lcom/android/server/wm/ActivityStack;
 HSPLcom/android/server/wm/DisplayContent;->getOrCreateStack(IIZ)Lcom/android/server/wm/ActivityStack;
+PLcom/android/server/wm/DisplayContent;->getOrCreateStack(IIZLandroid/content/Intent;Lcom/android/server/wm/Task;Z)Lcom/android/server/wm/ActivityStack;
 PLcom/android/server/wm/DisplayContent;->getOrCreateStack(Lcom/android/server/wm/ActivityRecord;Landroid/app/ActivityOptions;Lcom/android/server/wm/Task;IZ)Lcom/android/server/wm/ActivityStack;
 HSPLcom/android/server/wm/DisplayContent;->getOrientation()I
 PLcom/android/server/wm/DisplayContent;->getOverlayLayer()Landroid/view/SurfaceControl;
 HSPLcom/android/server/wm/DisplayContent;->getParentWindow()Lcom/android/server/wm/WindowState;
 HSPLcom/android/server/wm/DisplayContent;->getPinnedStack()Lcom/android/server/wm/ActivityStack;
 HSPLcom/android/server/wm/DisplayContent;->getPinnedStackController()Lcom/android/server/wm/PinnedStackController;
+PLcom/android/server/wm/DisplayContent;->getPreferredOptionsPanelGravity()I
 HPLcom/android/server/wm/DisplayContent;->getPresentUIDs()Landroid/util/IntArray;
+PLcom/android/server/wm/DisplayContent;->getProtoFieldId()J
 HSPLcom/android/server/wm/DisplayContent;->getRecentsStack()Lcom/android/server/wm/ActivityStack;
 HSPLcom/android/server/wm/DisplayContent;->getResumedActivity()Lcom/android/server/wm/ActivityRecord;
 HSPLcom/android/server/wm/DisplayContent;->getRootHomeTask()Lcom/android/server/wm/ActivityStack;
@@ -39822,6 +42800,8 @@
 HSPLcom/android/server/wm/DisplayContent;->getStackAt(I)Lcom/android/server/wm/ActivityStack;
 HSPLcom/android/server/wm/DisplayContent;->getStackCount()I
 HSPLcom/android/server/wm/DisplayContent;->getStacks()Lcom/android/server/wm/WindowList;
+HPLcom/android/server/wm/DisplayContent;->getTaskDisplayAreaAt(I)Lcom/android/server/wm/TaskDisplayArea;
+HPLcom/android/server/wm/DisplayContent;->getTaskDisplayAreaCount()I
 HSPLcom/android/server/wm/DisplayContent;->getTopStack()Lcom/android/server/wm/ActivityStack;
 HSPLcom/android/server/wm/DisplayContent;->getTopStackInWindowingMode(I)Lcom/android/server/wm/ActivityStack;
 HPLcom/android/server/wm/DisplayContent;->getTouchableWinAtPointLocked(FF)Lcom/android/server/wm/WindowState;
@@ -39856,6 +42836,7 @@
 PLcom/android/server/wm/DisplayContent;->isRemoving()Z
 HSPLcom/android/server/wm/DisplayContent;->isSingleTaskInstance()Z
 HSPLcom/android/server/wm/DisplayContent;->isSleeping()Z
+PLcom/android/server/wm/DisplayContent;->isSplitScreenModeActivated()Z
 HSPLcom/android/server/wm/DisplayContent;->isStackVisible(I)Z
 HSPLcom/android/server/wm/DisplayContent;->isTopNotPinnedStack(Lcom/android/server/wm/ActivityStack;)Z
 HSPLcom/android/server/wm/DisplayContent;->isTopStack(Lcom/android/server/wm/ActivityStack;)Z
@@ -39867,6 +42848,10 @@
 HPLcom/android/server/wm/DisplayContent;->lambda$addToGlobalAndConsumeLimit$24([I[ILandroid/graphics/Region;Landroid/graphics/Rect;)V
 HPLcom/android/server/wm/DisplayContent;->lambda$addToGlobalAndConsumeLimit$25([I[ILandroid/graphics/Region;Landroid/graphics/Rect;)V
 HPLcom/android/server/wm/DisplayContent;->lambda$adjustForImeIfNeeded$12(Lcom/android/server/wm/Task;)Z
+HPLcom/android/server/wm/DisplayContent;->lambda$applyRotation$10$DisplayContent(ZLcom/android/server/wm/WindowState;)V
+HPLcom/android/server/wm/DisplayContent;->lambda$applyRotation$9(Landroid/view/SurfaceControl$Transaction;IIZLcom/android/server/wm/WindowState;)V
+PLcom/android/server/wm/DisplayContent;->lambda$applyRotationAndClearFixedRotation$25$DisplayContent(ILcom/android/server/wm/ActivityRecord;)V
+PLcom/android/server/wm/DisplayContent;->lambda$applyRotationAndClearFixedRotation$26$DisplayContent(II)V
 HPLcom/android/server/wm/DisplayContent;->lambda$applyRotationLocked$10$DisplayContent(ZLcom/android/server/wm/WindowState;)V
 HPLcom/android/server/wm/DisplayContent;->lambda$applyRotationLocked$8(Landroid/view/SurfaceControl$Transaction;IIZLcom/android/server/wm/WindowState;)V
 HPLcom/android/server/wm/DisplayContent;->lambda$applyRotationLocked$9$DisplayContent(ZLcom/android/server/wm/WindowState;)V
@@ -39899,7 +42884,10 @@
 HPLcom/android/server/wm/DisplayContent;->lambda$new$6$DisplayContent(Lcom/android/server/wm/WindowState;)Z
 HSPLcom/android/server/wm/DisplayContent;->lambda$new$7$DisplayContent(Lcom/android/server/wm/WindowState;)V
 HSPLcom/android/server/wm/DisplayContent;->lambda$new$8$DisplayContent(Lcom/android/server/wm/WindowState;)V
+PLcom/android/server/wm/DisplayContent;->lambda$notifyLocationInParentDisplayChanged$22(Lcom/android/server/wm/WindowState;)V
 PLcom/android/server/wm/DisplayContent;->lambda$notifyLocationInParentDisplayChanged$23(Lcom/android/server/wm/WindowState;)V
+PLcom/android/server/wm/DisplayContent;->lambda$onRequestedOverrideConfigurationChanged$25$DisplayContent(II)V
+PLcom/android/server/wm/DisplayContent;->lambda$onRequestedOverrideConfigurationChanged$27$DisplayContent(II)V
 PLcom/android/server/wm/DisplayContent;->lambda$onWindowFreezeTimeout$21$DisplayContent(Lcom/android/server/wm/WindowState;)V
 HPLcom/android/server/wm/DisplayContent;->lambda$onWindowFreezeTimeout$22$DisplayContent(Lcom/android/server/wm/WindowState;)V
 PLcom/android/server/wm/DisplayContent;->lambda$pointWithinAppWindow$10([IIILcom/android/server/wm/WindowState;Landroid/graphics/Rect;)V
@@ -39963,7 +42951,9 @@
 HSPLcom/android/server/wm/DisplayContent;->reParentWindowToken(Lcom/android/server/wm/WindowToken;)V
 HSPLcom/android/server/wm/DisplayContent;->reapplyMagnificationSpec()V
 HSPLcom/android/server/wm/DisplayContent;->reconfigureDisplayLocked()V
+HPLcom/android/server/wm/DisplayContent;->reduceCompatConfigWidthSize(IIILandroid/util/DisplayMetrics;II)I
 HSPLcom/android/server/wm/DisplayContent;->reduceCompatConfigWidthSize(IIILandroid/util/DisplayMetrics;IILandroid/view/DisplayCutout;)I
+HPLcom/android/server/wm/DisplayContent;->reduceConfigLayout(IIFIII)I
 HSPLcom/android/server/wm/DisplayContent;->reduceConfigLayout(IIFIIILandroid/view/DisplayCutout;)I
 HPLcom/android/server/wm/DisplayContent;->reevaluateStatusBarVisibility()V
 HSPLcom/android/server/wm/DisplayContent;->registerPointerEventListener(Landroid/view/WindowManagerPolicyConstants$PointerEventListener;)V
@@ -40009,6 +42999,7 @@
 PLcom/android/server/wm/DisplayContent;->shouldDestroyContentOnRemove()Z
 HSPLcom/android/server/wm/DisplayContent;->shouldSleep()Z
 PLcom/android/server/wm/DisplayContent;->shouldWaitForSystemDecorWindowsOnBoot()Z
+PLcom/android/server/wm/DisplayContent;->startFixedRotationTransform(Lcom/android/server/wm/WindowToken;I)V
 HPLcom/android/server/wm/DisplayContent;->startKeyguardExitOnNonAppWindows(ZZZ)V
 HSPLcom/android/server/wm/DisplayContent;->statusBarVisibilityChanged(I)V
 HPLcom/android/server/wm/DisplayContent;->supportsSystemDecorations()Z
@@ -40029,6 +43020,7 @@
 HPLcom/android/server/wm/DisplayContent;->updateImeControlTarget(Lcom/android/server/wm/InsetsControlTarget;)V
 HPLcom/android/server/wm/DisplayContent;->updateImeControlTarget(Lcom/android/server/wm/WindowState;)V
 HPLcom/android/server/wm/DisplayContent;->updateImeParent()V
+PLcom/android/server/wm/DisplayContent;->updateLaunchRootTask(I)Lcom/android/server/wm/Task;
 HSPLcom/android/server/wm/DisplayContent;->updateLaunchTile(I)Lcom/android/server/wm/TaskTile;
 PLcom/android/server/wm/DisplayContent;->updateLocation(Lcom/android/server/wm/WindowState;II)V
 HSPLcom/android/server/wm/DisplayContent;->updateOrientation()Z
@@ -40072,10 +43064,14 @@
 HSPLcom/android/server/wm/DisplayPolicy;-><clinit>()V
 HSPLcom/android/server/wm/DisplayPolicy;-><init>(Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/DisplayContent;)V
 PLcom/android/server/wm/DisplayPolicy;->access$000(Lcom/android/server/wm/DisplayPolicy;)Landroid/view/accessibility/AccessibilityManager;
+PLcom/android/server/wm/DisplayPolicy;->access$100(Lcom/android/server/wm/DisplayPolicy;)Ljava/lang/Object;
 PLcom/android/server/wm/DisplayPolicy;->access$100(Lcom/android/server/wm/DisplayPolicy;Z)V
 PLcom/android/server/wm/DisplayPolicy;->access$1000(Lcom/android/server/wm/DisplayPolicy;)Lcom/android/server/wm/DisplayContent;
+PLcom/android/server/wm/DisplayPolicy;->access$1000(Lcom/android/server/wm/DisplayPolicy;)Z
+PLcom/android/server/wm/DisplayPolicy;->access$1100(Lcom/android/server/wm/DisplayPolicy;)Lcom/android/server/wm/SystemGesturesPointerEventListener;
 PLcom/android/server/wm/DisplayPolicy;->access$1100(Lcom/android/server/wm/DisplayPolicy;)Z
 PLcom/android/server/wm/DisplayPolicy;->access$1200(Lcom/android/server/wm/DisplayPolicy;)Lcom/android/server/wm/SystemGesturesPointerEventListener;
+PLcom/android/server/wm/DisplayPolicy;->access$1200(Lcom/android/server/wm/DisplayPolicy;)Lcom/android/server/wm/WindowManagerService;
 HPLcom/android/server/wm/DisplayPolicy;->access$1300(Lcom/android/server/wm/DisplayPolicy;)Lcom/android/server/wm/WindowManagerService;
 PLcom/android/server/wm/DisplayPolicy;->access$1400(Lcom/android/server/wm/DisplayPolicy;)Landroid/os/Handler;
 PLcom/android/server/wm/DisplayPolicy;->access$1500(Lcom/android/server/wm/DisplayPolicy;)I
@@ -40087,12 +43083,18 @@
 PLcom/android/server/wm/DisplayPolicy;->access$1800(Lcom/android/server/wm/DisplayPolicy;)Ljava/lang/Runnable;
 PLcom/android/server/wm/DisplayPolicy;->access$1902(Lcom/android/server/wm/DisplayPolicy;J)J
 PLcom/android/server/wm/DisplayPolicy;->access$200(Lcom/android/server/wm/DisplayPolicy;)Lcom/android/server/wm/WindowState;
+PLcom/android/server/wm/DisplayPolicy;->access$200(Lcom/android/server/wm/DisplayPolicy;)Ljava/lang/Object;
 PLcom/android/server/wm/DisplayPolicy;->access$2000(I)Z
 PLcom/android/server/wm/DisplayPolicy;->access$2100(Lcom/android/server/wm/DisplayPolicy;)Lcom/android/server/wm/BarController;
 PLcom/android/server/wm/DisplayPolicy;->access$300(Lcom/android/server/wm/DisplayPolicy;)Lcom/android/server/wm/WindowState;
+PLcom/android/server/wm/DisplayPolicy;->access$400(Lcom/android/server/wm/DisplayPolicy;)Lcom/android/server/wm/WindowState;
 PLcom/android/server/wm/DisplayPolicy;->access$400(Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/WindowState;)V
 PLcom/android/server/wm/DisplayPolicy;->access$500(Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/policy/WindowManagerPolicy$InputConsumer;)V
+PLcom/android/server/wm/DisplayPolicy;->access$500(Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/WindowState;)V
+PLcom/android/server/wm/DisplayPolicy;->access$600(Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/policy/WindowManagerPolicy$InputConsumer;)V
 PLcom/android/server/wm/DisplayPolicy;->access$800(Lcom/android/server/wm/DisplayPolicy;)I
+PLcom/android/server/wm/DisplayPolicy;->access$900(Lcom/android/server/wm/DisplayPolicy;)I
+PLcom/android/server/wm/DisplayPolicy;->access$900(Lcom/android/server/wm/DisplayPolicy;)Lcom/android/server/wm/DisplayContent;
 PLcom/android/server/wm/DisplayPolicy;->access$900(Lcom/android/server/wm/DisplayPolicy;)Ljava/lang/Object;
 HSPLcom/android/server/wm/DisplayPolicy;->addWindowLw(Lcom/android/server/wm/WindowState;Landroid/view/WindowManager$LayoutParams;)V
 HSPLcom/android/server/wm/DisplayPolicy;->adjustSystemUiVisibilityLw(I)I
@@ -40126,6 +43128,7 @@
 HSPLcom/android/server/wm/DisplayPolicy;->getCurrentUserResources()Landroid/content/res/Resources;
 HSPLcom/android/server/wm/DisplayPolicy;->getDisplayId()I
 HPLcom/android/server/wm/DisplayPolicy;->getDockMode()I
+PLcom/android/server/wm/DisplayPolicy;->getForceShowSystemBars()Z
 PLcom/android/server/wm/DisplayPolicy;->getForwardedInsets()Landroid/graphics/Insets;
 HSPLcom/android/server/wm/DisplayPolicy;->getImpliedSysUiFlagsForLayout(Landroid/view/WindowManager$LayoutParams;)I
 HSPLcom/android/server/wm/DisplayPolicy;->getInsetsPolicy()Lcom/android/server/wm/InsetsPolicy;
@@ -40163,6 +43166,7 @@
 HSPLcom/android/server/wm/DisplayPolicy;->isKeyguardOccluded()Z
 HSPLcom/android/server/wm/DisplayPolicy;->isKeyguardShowing()Z
 PLcom/android/server/wm/DisplayPolicy;->isNavBarEmpty(I)Z
+PLcom/android/server/wm/DisplayPolicy;->isNavigationBarRequestedVisible()Z
 HPLcom/android/server/wm/DisplayPolicy;->isPersistentVrModeEnabled()Z
 HSPLcom/android/server/wm/DisplayPolicy;->isScreenOnEarly()Z
 HSPLcom/android/server/wm/DisplayPolicy;->isScreenOnFully()Z
@@ -40171,8 +43175,10 @@
 PLcom/android/server/wm/DisplayPolicy;->isTopLayoutFullscreen()Z
 HSPLcom/android/server/wm/DisplayPolicy;->isWindowExcludedFromContent(Lcom/android/server/wm/WindowState;)Z
 HSPLcom/android/server/wm/DisplayPolicy;->isWindowManagerDrawComplete()Z
+HPLcom/android/server/wm/DisplayPolicy;->lambda$addWindowLw$2$DisplayPolicy(Lcom/android/server/wm/DisplayFrames;Lcom/android/server/wm/WindowState;Landroid/graphics/Rect;)V
 HPLcom/android/server/wm/DisplayPolicy;->lambda$addWindowLw$3$DisplayPolicy(Lcom/android/server/wm/DisplayFrames;Lcom/android/server/wm/WindowState;Landroid/graphics/Rect;)V
 HPLcom/android/server/wm/DisplayPolicy;->lambda$addWindowLw$4$DisplayPolicy(Lcom/android/server/wm/DisplayFrames;Lcom/android/server/wm/WindowState;Landroid/graphics/Rect;)V
+HPLcom/android/server/wm/DisplayPolicy;->lambda$addWindowLw$4(Lcom/android/server/wm/DisplayFrames;Lcom/android/server/wm/WindowState;Landroid/graphics/Rect;)V
 HPLcom/android/server/wm/DisplayPolicy;->lambda$addWindowLw$5$DisplayPolicy(Lcom/android/server/wm/DisplayFrames;Lcom/android/server/wm/WindowState;Landroid/graphics/Rect;)V
 HPLcom/android/server/wm/DisplayPolicy;->lambda$addWindowLw$5(Lcom/android/server/wm/DisplayFrames;Lcom/android/server/wm/WindowState;Landroid/graphics/Rect;)V
 HPLcom/android/server/wm/DisplayPolicy;->lambda$addWindowLw$6$DisplayPolicy(Lcom/android/server/wm/DisplayFrames;Lcom/android/server/wm/WindowState;Landroid/graphics/Rect;)V
@@ -40180,17 +43186,25 @@
 HPLcom/android/server/wm/DisplayPolicy;->lambda$addWindowLw$8$DisplayPolicy(Lcom/android/server/wm/DisplayFrames;Lcom/android/server/wm/WindowState;Landroid/graphics/Rect;)V
 HPLcom/android/server/wm/DisplayPolicy;->lambda$addWindowLw$9$DisplayPolicy(Lcom/android/server/wm/DisplayFrames;Lcom/android/server/wm/WindowState;Landroid/graphics/Rect;)V
 PLcom/android/server/wm/DisplayPolicy;->lambda$beginLayoutLw$10$DisplayPolicy(Landroid/view/InputChannel;Landroid/os/Looper;)Landroid/view/InputEventReceiver;
+HPLcom/android/server/wm/DisplayPolicy;->lambda$beginLayoutLw$11$DisplayPolicy(Landroid/view/InputChannel;Landroid/os/Looper;)Landroid/view/InputEventReceiver;
 PLcom/android/server/wm/DisplayPolicy;->lambda$beginLayoutLw$12$DisplayPolicy(Landroid/view/InputChannel;Landroid/os/Looper;)Landroid/view/InputEventReceiver;
 PLcom/android/server/wm/DisplayPolicy;->lambda$beginLayoutLw$8$DisplayPolicy(Landroid/view/InputChannel;Landroid/os/Looper;)Landroid/view/InputEventReceiver;
 PLcom/android/server/wm/DisplayPolicy;->lambda$beginLayoutLw$9$DisplayPolicy(Landroid/view/InputChannel;Landroid/os/Looper;)Landroid/view/InputEventReceiver;
+HPLcom/android/server/wm/DisplayPolicy;->lambda$canToastShowWhenLocked$1(ILcom/android/server/wm/WindowState;)Z
 HPLcom/android/server/wm/DisplayPolicy;->lambda$canToastShowWhenLocked$2(ILcom/android/server/wm/WindowState;)Z
+PLcom/android/server/wm/DisplayPolicy;->lambda$new$0$DisplayPolicy()V
 PLcom/android/server/wm/DisplayPolicy;->lambda$notifyDisplayReady$10$DisplayPolicy()V
 PLcom/android/server/wm/DisplayPolicy;->lambda$notifyDisplayReady$11$DisplayPolicy()V
+PLcom/android/server/wm/DisplayPolicy;->lambda$notifyDisplayReady$12$DisplayPolicy()V
 HPLcom/android/server/wm/DisplayPolicy;->lambda$notifyDisplayReady$13$DisplayPolicy()V
 HPLcom/android/server/wm/DisplayPolicy;->lambda$notifyDisplayReady$9$DisplayPolicy()V
+PLcom/android/server/wm/DisplayPolicy;->lambda$simulateLayoutDisplay$10$DisplayPolicy(Lcom/android/server/wm/DisplayFrames;)V
+PLcom/android/server/wm/DisplayPolicy;->lambda$simulateLayoutDisplay$9$DisplayPolicy(Lcom/android/server/wm/DisplayFrames;I)V
+PLcom/android/server/wm/DisplayPolicy;->lambda$updateHideNavInputEventReceiver$11$DisplayPolicy(Landroid/view/InputChannel;Landroid/os/Looper;)Landroid/view/InputEventReceiver;
 HSPLcom/android/server/wm/DisplayPolicy;->lambda$updateSystemUiVisibilityLw$10$DisplayPolicy(ILjava/lang/String;Landroid/util/Pair;I[Lcom/android/internal/view/AppearanceRegion;ZZZ)V
 HSPLcom/android/server/wm/DisplayPolicy;->lambda$updateSystemUiVisibilityLw$11$DisplayPolicy(ILjava/lang/String;Landroid/util/Pair;I[Lcom/android/internal/view/AppearanceRegion;ZZZ)V
 HPLcom/android/server/wm/DisplayPolicy;->lambda$updateSystemUiVisibilityLw$12$DisplayPolicy(ILjava/lang/String;Landroid/util/Pair;I[Lcom/android/internal/view/AppearanceRegion;ZZZ)V
+HPLcom/android/server/wm/DisplayPolicy;->lambda$updateSystemUiVisibilityLw$13$DisplayPolicy(ILjava/lang/String;Landroid/util/Pair;I[Lcom/android/internal/view/AppearanceRegion;ZZZ)V
 HPLcom/android/server/wm/DisplayPolicy;->lambda$updateSystemUiVisibilityLw$14$DisplayPolicy(ILjava/lang/String;Landroid/util/Pair;I[Lcom/android/internal/view/AppearanceRegion;ZZZ)V
 HSPLcom/android/server/wm/DisplayPolicy;->layoutNavigationBar(Lcom/android/server/wm/DisplayFrames;IZZZZ)Z
 HSPLcom/android/server/wm/DisplayPolicy;->layoutNavigationBar(Lcom/android/server/wm/DisplayFrames;IZZZZZ)Z
@@ -40224,6 +43238,8 @@
 PLcom/android/server/wm/DisplayPolicy;->setNavBarOpaqueFlag(I)I
 HSPLcom/android/server/wm/DisplayPolicy;->setNavBarTransparentFlag(I)I
 PLcom/android/server/wm/DisplayPolicy;->setPointerLocationEnabled(Z)V
+PLcom/android/server/wm/DisplayPolicy;->simulateLayoutDecorWindow(Lcom/android/server/wm/WindowState;Lcom/android/server/wm/DisplayFrames;Landroid/view/InsetsState;Lcom/android/server/wm/WindowFrames;Ljava/lang/Runnable;)V
+PLcom/android/server/wm/DisplayPolicy;->simulateLayoutDisplay(Lcom/android/server/wm/DisplayFrames;Landroid/view/InsetsState;I)V
 PLcom/android/server/wm/DisplayPolicy;->supportsPointerLocation()Z
 PLcom/android/server/wm/DisplayPolicy;->switchUser()V
 HSPLcom/android/server/wm/DisplayPolicy;->systemReady()V
@@ -40232,6 +43248,7 @@
 HSPLcom/android/server/wm/DisplayPolicy;->updateConfigurationAndScreenSizeDependentBehaviors()V
 HSPLcom/android/server/wm/DisplayPolicy;->updateCurrentUserResources()V
 PLcom/android/server/wm/DisplayPolicy;->updateDreamingSleepToken(Z)V
+HPLcom/android/server/wm/DisplayPolicy;->updateHideNavInputEventReceiver(ZZ)V
 HSPLcom/android/server/wm/DisplayPolicy;->updateInsetsStateForDisplayCutout(Lcom/android/server/wm/DisplayFrames;Landroid/view/InsetsState;)V
 HPLcom/android/server/wm/DisplayPolicy;->updateLightNavigationBarAppearanceLw(ILcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;)I
 HSPLcom/android/server/wm/DisplayPolicy;->updateLightNavigationBarLw(ILcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;)I
@@ -40246,7 +43263,9 @@
 PLcom/android/server/wm/DisplayRotation$1;->run()V
 HSPLcom/android/server/wm/DisplayRotation$2;-><init>(Lcom/android/server/wm/DisplayRotation;)V
 HPLcom/android/server/wm/DisplayRotation$2;->continueRotateDisplay(ILandroid/view/WindowContainerTransaction;)V
+HPLcom/android/server/wm/DisplayRotation$2;->continueRotateDisplay(ILandroid/window/WindowContainerTransaction;)V
 PLcom/android/server/wm/DisplayRotation$2;->lambda$continueRotateDisplay$0(Ljava/lang/Object;ILandroid/view/WindowContainerTransaction;)V
+PLcom/android/server/wm/DisplayRotation$2;->lambda$continueRotateDisplay$0(Ljava/lang/Object;ILandroid/window/WindowContainerTransaction;)V
 PLcom/android/server/wm/DisplayRotation$OrientationListener$UpdateRunnable;-><init>(Lcom/android/server/wm/DisplayRotation$OrientationListener;I)V
 HPLcom/android/server/wm/DisplayRotation$OrientationListener$UpdateRunnable;->run()V
 HSPLcom/android/server/wm/DisplayRotation$OrientationListener;-><init>(Lcom/android/server/wm/DisplayRotation;Landroid/content/Context;Landroid/os/Handler;)V
@@ -40262,6 +43281,7 @@
 HSPLcom/android/server/wm/DisplayRotation;-><init>(Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayWindowSettings;Landroid/content/Context;Ljava/lang/Object;)V
 PLcom/android/server/wm/DisplayRotation;->access$100(Lcom/android/server/wm/DisplayRotation;)I
 PLcom/android/server/wm/DisplayRotation;->access$200(Lcom/android/server/wm/DisplayRotation;ILandroid/view/WindowContainerTransaction;)V
+PLcom/android/server/wm/DisplayRotation;->access$200(Lcom/android/server/wm/DisplayRotation;ILandroid/window/WindowContainerTransaction;)V
 PLcom/android/server/wm/DisplayRotation;->access$300(Lcom/android/server/wm/DisplayRotation;)Lcom/android/server/wm/WindowManagerService;
 PLcom/android/server/wm/DisplayRotation;->access$400(Lcom/android/server/wm/DisplayRotation;)I
 PLcom/android/server/wm/DisplayRotation;->access$500(Lcom/android/server/wm/DisplayRotation;I)Z
@@ -40273,6 +43293,7 @@
 PLcom/android/server/wm/DisplayRotation;->applyCurrentRotation(I)V
 HSPLcom/android/server/wm/DisplayRotation;->configure(IIII)V
 HPLcom/android/server/wm/DisplayRotation;->continueRotation(ILandroid/view/WindowContainerTransaction;)V
+HPLcom/android/server/wm/DisplayRotation;->continueRotation(ILandroid/window/WindowContainerTransaction;)V
 HSPLcom/android/server/wm/DisplayRotation;->dump(Ljava/lang/String;Ljava/io/PrintWriter;)V
 PLcom/android/server/wm/DisplayRotation;->freezeRotation(I)V
 PLcom/android/server/wm/DisplayRotation;->getCurrentAppOrientation()I
@@ -40404,6 +43425,7 @@
 HSPLcom/android/server/wm/DockedStackDividerController;->setWindow(Lcom/android/server/wm/WindowState;)V
 PLcom/android/server/wm/DockedStackDividerController;->startImeAdjustAnimation(ZZLcom/android/server/wm/WindowState;)V
 HSPLcom/android/server/wm/DockedStackDividerController;->wasVisible()Z
+PLcom/android/server/wm/DragAndDropPermissionsHandler;-><init>(Landroid/content/ClipData;ILjava/lang/String;III)V
 HSPLcom/android/server/wm/DragDropController$1;-><init>(Lcom/android/server/wm/DragDropController;)V
 HSPLcom/android/server/wm/DragDropController$DragHandler;-><init>(Lcom/android/server/wm/DragDropController;Lcom/android/server/wm/WindowManagerService;Landroid/os/Looper;)V
 PLcom/android/server/wm/DragDropController$DragHandler;->handleMessage(Landroid/os/Message;)V
@@ -40574,12 +43596,15 @@
 PLcom/android/server/wm/InputConsumerImpl;-><init>(Lcom/android/server/wm/WindowManagerService;Landroid/os/IBinder;Ljava/lang/String;Landroid/view/InputChannel;ILandroid/os/UserHandle;I)V
 PLcom/android/server/wm/InputConsumerImpl;->binderDied()V
 PLcom/android/server/wm/InputConsumerImpl;->disposeChannelsLw()V
+PLcom/android/server/wm/InputConsumerImpl;->disposeChannelsLw(Landroid/view/SurfaceControl$Transaction;)V
 HPLcom/android/server/wm/InputConsumerImpl;->dump(Ljava/io/PrintWriter;Ljava/lang/String;Ljava/lang/String;)V
 PLcom/android/server/wm/InputConsumerImpl;->getLayerLw(I)I
 HPLcom/android/server/wm/InputConsumerImpl;->hide(Landroid/view/SurfaceControl$Transaction;)V
 HPLcom/android/server/wm/InputConsumerImpl;->layout(Landroid/view/SurfaceControl$Transaction;II)V
 HPLcom/android/server/wm/InputConsumerImpl;->layout(Landroid/view/SurfaceControl$Transaction;Landroid/graphics/Rect;)V
 PLcom/android/server/wm/InputConsumerImpl;->linkToDeathRecipient()V
+HPLcom/android/server/wm/InputConsumerImpl;->reparent(Landroid/view/SurfaceControl$Transaction;Lcom/android/server/wm/WindowContainer;)V
+HPLcom/android/server/wm/InputConsumerImpl;->show(Landroid/view/SurfaceControl$Transaction;I)V
 HPLcom/android/server/wm/InputConsumerImpl;->show(Landroid/view/SurfaceControl$Transaction;Lcom/android/server/wm/WindowState;)V
 PLcom/android/server/wm/InputConsumerImpl;->unlinkFromDeathRecipient()V
 PLcom/android/server/wm/InputManagerCallback$1;-><init>(Lcom/android/server/wm/InputManagerCallback;Ljava/lang/Runnable;Ljava/util/concurrent/CountDownLatch;JLjava/lang/String;[Z)V
@@ -40598,6 +43623,7 @@
 HPLcom/android/server/wm/InputManagerCallback;->interceptMotionBeforeQueueingNonInteractive(IJI)I
 PLcom/android/server/wm/InputManagerCallback;->isWindowAboveSystem(Lcom/android/server/wm/WindowState;)Z
 PLcom/android/server/wm/InputManagerCallback;->notifyANR(Landroid/view/InputApplicationHandle;Landroid/os/IBinder;Ljava/lang/String;)J
+PLcom/android/server/wm/InputManagerCallback;->notifyANRInner(Landroid/view/InputApplicationHandle;Landroid/os/IBinder;Ljava/lang/String;)J
 HSPLcom/android/server/wm/InputManagerCallback;->notifyConfigurationChanged()V
 HPLcom/android/server/wm/InputManagerCallback;->notifyFocusChanged(Landroid/os/IBinder;Landroid/os/IBinder;)Z
 PLcom/android/server/wm/InputManagerCallback;->notifyInputChannelBroken(Landroid/os/IBinder;)V
@@ -40610,7 +43636,7 @@
 HSPLcom/android/server/wm/InputManagerCallback;->waitForInputDevicesReady(J)Z
 PLcom/android/server/wm/InputMonitor$EventReceiverInputConsumer;-><init>(Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/InputMonitor;Landroid/os/Looper;Ljava/lang/String;Landroid/view/InputEventReceiver$Factory;ILandroid/os/UserHandle;I)V
 PLcom/android/server/wm/InputMonitor$EventReceiverInputConsumer;->dismiss()V
-PLcom/android/server/wm/InputMonitor$EventReceiverInputConsumer;->dispose()V
+HPLcom/android/server/wm/InputMonitor$EventReceiverInputConsumer;->dispose()V
 HSPLcom/android/server/wm/InputMonitor$UpdateInputForAllWindowsConsumer;-><init>(Lcom/android/server/wm/InputMonitor;)V
 HSPLcom/android/server/wm/InputMonitor$UpdateInputForAllWindowsConsumer;-><init>(Lcom/android/server/wm/InputMonitor;Lcom/android/server/wm/InputMonitor$1;)V
 HSPLcom/android/server/wm/InputMonitor$UpdateInputForAllWindowsConsumer;->accept(Lcom/android/server/wm/WindowState;)V
@@ -40623,6 +43649,7 @@
 HSPLcom/android/server/wm/InputMonitor$UpdateInputWindows;->run()V
 HSPLcom/android/server/wm/InputMonitor;-><init>(Lcom/android/server/wm/WindowManagerService;I)V
 HSPLcom/android/server/wm/InputMonitor;-><init>(Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/DisplayContent;)V
+PLcom/android/server/wm/InputMonitor;->access$000(Lcom/android/server/wm/InputMonitor;)Landroid/util/ArrayMap;
 HSPLcom/android/server/wm/InputMonitor;->access$000(Lcom/android/server/wm/InputMonitor;)Lcom/android/server/wm/WindowManagerService;
 HSPLcom/android/server/wm/InputMonitor;->access$100(Lcom/android/server/wm/InputMonitor;)Landroid/view/SurfaceControl$Transaction;
 HSPLcom/android/server/wm/InputMonitor;->access$1000(Lcom/android/server/wm/InputMonitor;)Landroid/graphics/Rect;
@@ -40648,7 +43675,7 @@
 HSPLcom/android/server/wm/InputMonitor;->access$600(Lcom/android/server/wm/InputMonitor;)Lcom/android/server/wm/InputMonitor$UpdateInputForAllWindowsConsumer;
 HSPLcom/android/server/wm/InputMonitor;->access$700(Lcom/android/server/wm/InputMonitor;)Lcom/android/server/wm/InputMonitor$UpdateInputForAllWindowsConsumer;
 PLcom/android/server/wm/InputMonitor;->addInputConsumer(Ljava/lang/String;Lcom/android/server/wm/InputConsumerImpl;)V
-PLcom/android/server/wm/InputMonitor;->createInputConsumer(Landroid/os/IBinder;Ljava/lang/String;Landroid/view/InputChannel;ILandroid/os/UserHandle;)V
+HPLcom/android/server/wm/InputMonitor;->createInputConsumer(Landroid/os/IBinder;Ljava/lang/String;Landroid/view/InputChannel;ILandroid/os/UserHandle;)V
 PLcom/android/server/wm/InputMonitor;->createInputConsumer(Landroid/os/Looper;Ljava/lang/String;Landroid/view/InputEventReceiver$Factory;)Lcom/android/server/policy/WindowManagerPolicy$InputConsumer;
 PLcom/android/server/wm/InputMonitor;->destroyInputConsumer(Ljava/lang/String;)Z
 PLcom/android/server/wm/InputMonitor;->disposeInputConsumer(Lcom/android/server/wm/InputConsumerImpl;)Z
@@ -40665,9 +43692,11 @@
 HSPLcom/android/server/wm/InputMonitor;->setFocusedAppLw(Lcom/android/server/wm/ActivityRecord;)V
 HSPLcom/android/server/wm/InputMonitor;->setInputFocusLw(Lcom/android/server/wm/WindowState;Z)V
 HSPLcom/android/server/wm/InputMonitor;->setUpdateInputWindowsNeededLw()V
+PLcom/android/server/wm/InputMonitor;->updateInputWindowsImmediately()V
+PLcom/android/server/wm/InputMonitor;->updateInputWindowsImmediately(Landroid/view/SurfaceControl$Transaction;)V
 HSPLcom/android/server/wm/InputMonitor;->updateInputWindowsLw(Z)V
 PLcom/android/server/wm/InsetsControlTarget;->canShowTransient()Z
-PLcom/android/server/wm/InsetsControlTarget;->getWindow()Lcom/android/server/wm/WindowState;
+HPLcom/android/server/wm/InsetsControlTarget;->getWindow()Lcom/android/server/wm/WindowState;
 PLcom/android/server/wm/InsetsControlTarget;->notifyInsetsControlChanged()V
 PLcom/android/server/wm/InsetsControlTarget;->showInsets(IZ)V
 HSPLcom/android/server/wm/InsetsPolicy$1;-><init>(Lcom/android/server/wm/InsetsPolicy;)V
@@ -40676,32 +43705,46 @@
 PLcom/android/server/wm/InsetsPolicy$BarWindow;->access$100(Lcom/android/server/wm/InsetsPolicy$BarWindow;Z)V
 HPLcom/android/server/wm/InsetsPolicy$BarWindow;->setVisible(Z)V
 PLcom/android/server/wm/InsetsPolicy$InsetsPolicyAnimationControlListener$InsetsPolicyAnimationControlCallbacks;-><init>(Lcom/android/server/wm/InsetsPolicy$InsetsPolicyAnimationControlListener;Lcom/android/server/wm/InsetsPolicy$InsetsPolicyAnimationControlListener;)V
+PLcom/android/server/wm/InsetsPolicy$InsetsPolicyAnimationControlListener$InsetsPolicyAnimationControlCallbacks;->access$100(Lcom/android/server/wm/InsetsPolicy$InsetsPolicyAnimationControlListener$InsetsPolicyAnimationControlCallbacks;ILandroid/util/SparseArray;Z)V
 PLcom/android/server/wm/InsetsPolicy$InsetsPolicyAnimationControlListener$InsetsPolicyAnimationControlCallbacks;->access$200(Lcom/android/server/wm/InsetsPolicy$InsetsPolicyAnimationControlListener$InsetsPolicyAnimationControlCallbacks;ILandroid/util/SparseArray;Z)V
+PLcom/android/server/wm/InsetsPolicy$InsetsPolicyAnimationControlListener$InsetsPolicyAnimationControlCallbacks;->access$500(Lcom/android/server/wm/InsetsPolicy$InsetsPolicyAnimationControlListener$InsetsPolicyAnimationControlCallbacks;)Landroid/view/InsetsAnimationControlImpl;
 PLcom/android/server/wm/InsetsPolicy$InsetsPolicyAnimationControlListener$InsetsPolicyAnimationControlCallbacks;->access$600(Lcom/android/server/wm/InsetsPolicy$InsetsPolicyAnimationControlListener$InsetsPolicyAnimationControlCallbacks;)Landroid/view/InsetsAnimationControlImpl;
 HPLcom/android/server/wm/InsetsPolicy$InsetsPolicyAnimationControlListener$InsetsPolicyAnimationControlCallbacks;->applySurfaceParams([Landroid/view/SyncRtSurfaceTransactionApplier$SurfaceParams;)V
 PLcom/android/server/wm/InsetsPolicy$InsetsPolicyAnimationControlListener$InsetsPolicyAnimationControlCallbacks;->controlAnimationUnchecked(ILandroid/util/SparseArray;Z)V
 HPLcom/android/server/wm/InsetsPolicy$InsetsPolicyAnimationControlListener$InsetsPolicyAnimationControlCallbacks;->getState()Landroid/view/InsetsState;
 PLcom/android/server/wm/InsetsPolicy$InsetsPolicyAnimationControlListener$InsetsPolicyAnimationControlCallbacks;->lambda$controlAnimationUnchecked$0$InsetsPolicy$InsetsPolicyAnimationControlListener$InsetsPolicyAnimationControlCallbacks(I)V
+PLcom/android/server/wm/InsetsPolicy$InsetsPolicyAnimationControlListener$InsetsPolicyAnimationControlCallbacks;->notifyFinished(Landroid/view/InsetsAnimationControlRunner;Z)V
+PLcom/android/server/wm/InsetsPolicy$InsetsPolicyAnimationControlListener$InsetsPolicyAnimationControlCallbacks;->releaseSurfaceControlFromRt(Landroid/view/SurfaceControl;)V
 HPLcom/android/server/wm/InsetsPolicy$InsetsPolicyAnimationControlListener$InsetsPolicyAnimationControlCallbacks;->scheduleApplyChangeInsets()V
+PLcom/android/server/wm/InsetsPolicy$InsetsPolicyAnimationControlListener$InsetsPolicyAnimationControlCallbacks;->scheduleApplyChangeInsets(Landroid/view/InsetsAnimationControlRunner;)V
+PLcom/android/server/wm/InsetsPolicy$InsetsPolicyAnimationControlListener$InsetsPolicyAnimationControlCallbacks;->startAnimation(Landroid/view/InsetsAnimationControlImpl;Landroid/view/WindowInsetsAnimationControlListener;ILandroid/view/WindowInsetsAnimation;Landroid/view/WindowInsetsAnimation$Bounds;)V
 PLcom/android/server/wm/InsetsPolicy$InsetsPolicyAnimationControlListener$InsetsPolicyAnimationControlCallbacks;->startAnimation(Landroid/view/InsetsAnimationControlImpl;Landroid/view/WindowInsetsAnimationControlListener;ILandroid/view/WindowInsetsAnimation;Landroid/view/WindowInsetsAnimation$Bounds;I)V
 PLcom/android/server/wm/InsetsPolicy$InsetsPolicyAnimationControlListener;-><init>(Lcom/android/server/wm/InsetsPolicy;ZLjava/lang/Runnable;)V
+PLcom/android/server/wm/InsetsPolicy$InsetsPolicyAnimationControlListener;-><init>(Lcom/android/server/wm/InsetsPolicy;ZLjava/lang/Runnable;I)V
 PLcom/android/server/wm/InsetsPolicy$InsetsPolicyAnimationControlListener;->onAnimationFinish()V
 HSPLcom/android/server/wm/InsetsPolicy$TransientControlTarget;-><init>(Lcom/android/server/wm/InsetsPolicy;)V
 HSPLcom/android/server/wm/InsetsPolicy$TransientControlTarget;-><init>(Lcom/android/server/wm/InsetsPolicy;Lcom/android/server/wm/InsetsPolicy$1;)V
 PLcom/android/server/wm/InsetsPolicy$TransientControlTarget;->notifyInsetsControlChanged()V
 HSPLcom/android/server/wm/InsetsPolicy;-><init>(Lcom/android/server/wm/InsetsStateController;Lcom/android/server/wm/DisplayContent;)V
+PLcom/android/server/wm/InsetsPolicy;->abortTransient()V
 PLcom/android/server/wm/InsetsPolicy;->access$200(Lcom/android/server/wm/InsetsPolicy;)Lcom/android/server/wm/DisplayContent;
 PLcom/android/server/wm/InsetsPolicy;->access$300(Lcom/android/server/wm/InsetsPolicy;)Lcom/android/server/wm/DisplayContent;
 PLcom/android/server/wm/InsetsPolicy;->access$300(Lcom/android/server/wm/InsetsPolicy;)Lcom/android/server/wm/DisplayPolicy;
 PLcom/android/server/wm/InsetsPolicy;->access$400(Lcom/android/server/wm/InsetsPolicy;)Lcom/android/server/wm/DisplayPolicy;
+PLcom/android/server/wm/InsetsPolicy;->access$400(Lcom/android/server/wm/InsetsPolicy;)Z
+PLcom/android/server/wm/InsetsPolicy;->access$402(Lcom/android/server/wm/InsetsPolicy;Z)Z
+PLcom/android/server/wm/InsetsPolicy;->access$500(Lcom/android/server/wm/InsetsPolicy;)Lcom/android/server/wm/WindowState;
 PLcom/android/server/wm/InsetsPolicy;->access$500(Lcom/android/server/wm/InsetsPolicy;)Z
+PLcom/android/server/wm/InsetsPolicy;->access$600(Lcom/android/server/wm/InsetsPolicy;)Lcom/android/server/wm/WindowState;
+PLcom/android/server/wm/InsetsPolicy;->access$600(Lcom/android/server/wm/InsetsPolicy;)[F
 PLcom/android/server/wm/InsetsPolicy;->access$700(Lcom/android/server/wm/InsetsPolicy;)Lcom/android/server/wm/WindowState;
+PLcom/android/server/wm/InsetsPolicy;->access$700(Lcom/android/server/wm/InsetsPolicy;)[F
 PLcom/android/server/wm/InsetsPolicy;->access$800(Lcom/android/server/wm/InsetsPolicy;)[F
 HSPLcom/android/server/wm/InsetsPolicy;->areSystemBarsForciblyVisible()Z
 HPLcom/android/server/wm/InsetsPolicy;->checkAbortTransient(Lcom/android/server/wm/WindowState;Landroid/view/InsetsState;)V
 PLcom/android/server/wm/InsetsPolicy;->controlAnimationUnchecked(ILandroid/util/SparseArray;ZLjava/lang/Runnable;)V
-PLcom/android/server/wm/InsetsPolicy;->forceShowsNavigationBarTransiently()Z
-PLcom/android/server/wm/InsetsPolicy;->forceShowsStatusBarTransiently()Z
+HPLcom/android/server/wm/InsetsPolicy;->forceShowsNavigationBarTransiently()Z
+HPLcom/android/server/wm/InsetsPolicy;->forceShowsStatusBarTransiently()Z
 HPLcom/android/server/wm/InsetsPolicy;->forceShowsSystemBarsForWindowingMode()Z
 HSPLcom/android/server/wm/InsetsPolicy;->getFakeNavControlTarget(Lcom/android/server/wm/WindowState;)Lcom/android/server/wm/InsetsControlTarget;
 HSPLcom/android/server/wm/InsetsPolicy;->getFakeStatusControlTarget(Lcom/android/server/wm/WindowState;)Lcom/android/server/wm/InsetsControlTarget;
@@ -40720,8 +43763,10 @@
 PLcom/android/server/wm/InsetsPolicy;->showTransient(Landroid/util/IntArray;)V
 PLcom/android/server/wm/InsetsPolicy;->startAnimation(Landroid/util/IntArray;ZLjava/lang/Runnable;)V
 HPLcom/android/server/wm/InsetsPolicy;->startAnimation(ZLjava/lang/Runnable;)V
+PLcom/android/server/wm/InsetsPolicy;->startAnimation(ZLjava/lang/Runnable;Landroid/view/InsetsState;)V
 HSPLcom/android/server/wm/InsetsPolicy;->updateBarControlTarget(Lcom/android/server/wm/WindowState;)V
-PLcom/android/server/wm/InsetsSourceProvider$ControlAdapter;-><init>(Lcom/android/server/wm/InsetsSourceProvider;)V
+PLcom/android/server/wm/InsetsPolicy;->updateHideNavInputEventReceiver()V
+HPLcom/android/server/wm/InsetsSourceProvider$ControlAdapter;-><init>(Lcom/android/server/wm/InsetsSourceProvider;)V
 PLcom/android/server/wm/InsetsSourceProvider$ControlAdapter;-><init>(Lcom/android/server/wm/InsetsSourceProvider;Lcom/android/server/wm/InsetsSourceProvider$1;)V
 PLcom/android/server/wm/InsetsSourceProvider$ControlAdapter;->access$100(Lcom/android/server/wm/InsetsSourceProvider$ControlAdapter;)Landroid/view/SurfaceControl;
 PLcom/android/server/wm/InsetsSourceProvider$ControlAdapter;->dump(Ljava/io/PrintWriter;Ljava/lang/String;)V
@@ -40737,6 +43782,8 @@
 PLcom/android/server/wm/InsetsSourceProvider;->access$400(Lcom/android/server/wm/InsetsSourceProvider;)Lcom/android/server/wm/InsetsStateController;
 PLcom/android/server/wm/InsetsSourceProvider;->access$500(Lcom/android/server/wm/InsetsSourceProvider;Z)V
 PLcom/android/server/wm/InsetsSourceProvider;->access$602(Lcom/android/server/wm/InsetsSourceProvider;Landroid/view/InsetsSourceControl;)Landroid/view/InsetsSourceControl;
+HPLcom/android/server/wm/InsetsSourceProvider;->createSimulatedSource(Lcom/android/server/wm/DisplayFrames;Lcom/android/server/wm/WindowFrames;)Landroid/view/InsetsSource;
+PLcom/android/server/wm/InsetsSourceProvider;->finishSeamlessRotation(Z)V
 PLcom/android/server/wm/InsetsSourceProvider;->getControl(Lcom/android/server/wm/InsetsControlTarget;)Landroid/view/InsetsSourceControl;
 PLcom/android/server/wm/InsetsSourceProvider;->getControlTarget()Lcom/android/server/wm/InsetsControlTarget;
 PLcom/android/server/wm/InsetsSourceProvider;->getImeOverrideFrame()Landroid/graphics/Rect;
@@ -40751,22 +43798,28 @@
 HPLcom/android/server/wm/InsetsSourceProvider;->setServerVisible(Z)V
 HPLcom/android/server/wm/InsetsSourceProvider;->setWindow(Lcom/android/server/wm/WindowState;Lcom/android/internal/util/function/TriConsumer;)V
 HPLcom/android/server/wm/InsetsSourceProvider;->setWindow(Lcom/android/server/wm/WindowState;Lcom/android/internal/util/function/TriConsumer;Lcom/android/internal/util/function/TriConsumer;)V
+PLcom/android/server/wm/InsetsSourceProvider;->startSeamlessRotation()V
 PLcom/android/server/wm/InsetsSourceProvider;->updateControlForFakeTarget(Lcom/android/server/wm/InsetsControlTarget;)V
 HPLcom/android/server/wm/InsetsSourceProvider;->updateControlForTarget(Lcom/android/server/wm/InsetsControlTarget;Z)V
 HPLcom/android/server/wm/InsetsSourceProvider;->updateSourceFrame()V
 HPLcom/android/server/wm/InsetsSourceProvider;->updateVisibility()V
 HSPLcom/android/server/wm/InsetsStateController$1;-><init>(Lcom/android/server/wm/InsetsStateController;)V
 HSPLcom/android/server/wm/InsetsStateController;-><init>(Lcom/android/server/wm/DisplayContent;)V
-PLcom/android/server/wm/InsetsStateController;->addToControlMaps(Lcom/android/server/wm/InsetsControlTarget;IZ)V
+HPLcom/android/server/wm/InsetsStateController;->addToControlMaps(Lcom/android/server/wm/InsetsControlTarget;IZ)V
+HPLcom/android/server/wm/InsetsStateController;->computeSimulatedState(Landroid/view/InsetsState;Lcom/android/server/wm/WindowState;Lcom/android/server/wm/DisplayFrames;Lcom/android/server/wm/WindowFrames;)V
 HSPLcom/android/server/wm/InsetsStateController;->dump(Ljava/lang/String;Ljava/io/PrintWriter;)V
 HPLcom/android/server/wm/InsetsStateController;->getControlsForDispatch(Lcom/android/server/wm/InsetsControlTarget;)[Landroid/view/InsetsSourceControl;
 HSPLcom/android/server/wm/InsetsStateController;->getImeSourceProvider()Lcom/android/server/wm/ImeInsetsSourceProvider;
 HSPLcom/android/server/wm/InsetsStateController;->getInsetsForDispatch(Lcom/android/server/wm/WindowState;)Landroid/view/InsetsState;
+HPLcom/android/server/wm/InsetsStateController;->getInsetsForDispatchInner(IIZZ)Landroid/view/InsetsState;
 HPLcom/android/server/wm/InsetsStateController;->getInsetsForType(I)Landroid/view/InsetsState;
+HPLcom/android/server/wm/InsetsStateController;->getInsetsForTypeAndWindowingMode(II)Landroid/view/InsetsState;
+HPLcom/android/server/wm/InsetsStateController;->getInsetsForTypeAndWindowingMode(IIZ)Landroid/view/InsetsState;
 PLcom/android/server/wm/InsetsStateController;->getInsetsForWindowMetrics(Landroid/view/WindowManager$LayoutParams;)Landroid/view/InsetsState;
 PLcom/android/server/wm/InsetsStateController;->getInsetsTypeForWindowType(I)I
 HSPLcom/android/server/wm/InsetsStateController;->getRawInsetsState()Landroid/view/InsetsState;
 HSPLcom/android/server/wm/InsetsStateController;->getSourceProvider(I)Lcom/android/server/wm/InsetsSourceProvider;
+HPLcom/android/server/wm/InsetsStateController;->isAboveIme(Lcom/android/server/wm/WindowContainer;)Z
 PLcom/android/server/wm/InsetsStateController;->isFakeTarget(ILcom/android/server/wm/InsetsControlTarget;)Z
 HPLcom/android/server/wm/InsetsStateController;->lambda$addToControlMaps$3(Lcom/android/server/wm/InsetsControlTarget;)Ljava/util/ArrayList;
 HPLcom/android/server/wm/InsetsStateController;->lambda$addToControlMaps$4(Lcom/android/server/wm/InsetsControlTarget;)Ljava/util/ArrayList;
@@ -40817,6 +43870,7 @@
 PLcom/android/server/wm/KeyguardController;->dumpDebug(Landroid/util/proto/ProtoOutputStream;J)V
 HSPLcom/android/server/wm/KeyguardController;->dumpDisplayStates(Ljava/io/PrintWriter;Ljava/lang/String;)V
 HSPLcom/android/server/wm/KeyguardController;->endActivityVisibilityUpdate()V
+PLcom/android/server/wm/KeyguardController;->failCallback(Lcom/android/internal/policy/IKeyguardDismissCallback;)V
 HSPLcom/android/server/wm/KeyguardController;->getDisplay(I)Lcom/android/server/wm/KeyguardController$KeyguardDisplayState;
 PLcom/android/server/wm/KeyguardController;->handleDismissKeyguard()V
 HPLcom/android/server/wm/KeyguardController;->handleOccludedChanged(I)V
@@ -40895,9 +43949,11 @@
 PLcom/android/server/wm/LaunchParamsPersister$PackageListObserver;->onPackageRemoved(Ljava/lang/String;I)V
 HPLcom/android/server/wm/LaunchParamsPersister$PersistableLaunchParams;-><init>(Lcom/android/server/wm/LaunchParamsPersister;)V
 HPLcom/android/server/wm/LaunchParamsPersister$PersistableLaunchParams;-><init>(Lcom/android/server/wm/LaunchParamsPersister;Lcom/android/server/wm/LaunchParamsPersister$1;)V
+HPLcom/android/server/wm/LaunchParamsPersister$PersistableLaunchParams;->restore(Ljava/io/File;Lorg/xmlpull/v1/XmlPullParser;)V
 HPLcom/android/server/wm/LaunchParamsPersister$PersistableLaunchParams;->restoreFromXml(Lorg/xmlpull/v1/XmlPullParser;)V
 HSPLcom/android/server/wm/LaunchParamsPersister;-><init>(Lcom/android/server/wm/PersisterQueue;Lcom/android/server/wm/ActivityStackSupervisor;)V
 HSPLcom/android/server/wm/LaunchParamsPersister;-><init>(Lcom/android/server/wm/PersisterQueue;Lcom/android/server/wm/ActivityStackSupervisor;Ljava/util/function/IntFunction;)V
+PLcom/android/server/wm/LaunchParamsPersister;->addComponentNameToLaunchParamAffinityMapIfNotNull(Landroid/content/ComponentName;Ljava/lang/String;)V
 PLcom/android/server/wm/LaunchParamsPersister;->getLaunchParamFolder(I)Ljava/io/File;
 HSPLcom/android/server/wm/LaunchParamsPersister;->getLaunchParams(Lcom/android/server/wm/Task;Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/LaunchParamsController$LaunchParams;)V
 PLcom/android/server/wm/LaunchParamsPersister;->getParamFile(Ljava/io/File;Landroid/content/ComponentName;)Ljava/io/File;
@@ -40976,6 +44032,7 @@
 HSPLcom/android/server/wm/LockTaskController;->isTaskWhitelisted(Lcom/android/server/wm/Task;)Z
 PLcom/android/server/wm/LockTaskController;->lambda$removeLockedTask$0$LockTaskController(Lcom/android/server/wm/Task;)V
 PLcom/android/server/wm/LockTaskController;->lambda$setLockTaskMode$1$LockTaskController(Landroid/content/Intent;Lcom/android/server/wm/Task;I)V
+PLcom/android/server/wm/LockTaskController;->lambda$updateLockTaskFeatures$2$LockTaskController(I)V
 PLcom/android/server/wm/LockTaskController;->lockKeyguardIfNeeded()V
 HSPLcom/android/server/wm/LockTaskController;->lockTaskModeToString()Ljava/lang/String;
 PLcom/android/server/wm/LockTaskController;->performStartLockTask(Ljava/lang/String;II)V
@@ -41011,7 +44068,7 @@
 HSPLcom/android/server/wm/PersisterQueue;-><clinit>()V
 HSPLcom/android/server/wm/PersisterQueue;-><init>()V
 HSPLcom/android/server/wm/PersisterQueue;-><init>(JJ)V
-PLcom/android/server/wm/PersisterQueue;->access$100(Lcom/android/server/wm/PersisterQueue;)Ljava/util/ArrayList;
+HPLcom/android/server/wm/PersisterQueue;->access$100(Lcom/android/server/wm/PersisterQueue;)Ljava/util/ArrayList;
 HPLcom/android/server/wm/PersisterQueue;->access$200(Lcom/android/server/wm/PersisterQueue;)Ljava/util/ArrayList;
 HPLcom/android/server/wm/PersisterQueue;->access$300(Lcom/android/server/wm/PersisterQueue;)V
 HPLcom/android/server/wm/PersisterQueue;->addItem(Lcom/android/server/wm/PersisterQueue$WriteQueueItem;Z)V
@@ -41065,6 +44122,7 @@
 HSPLcom/android/server/wm/PinnedStackController;->notifyMovementBoundsChanged(Z)V
 HSPLcom/android/server/wm/PinnedStackController;->notifyMovementBoundsChanged(ZZ)V
 PLcom/android/server/wm/PinnedStackController;->notifyPrepareAnimation(Landroid/graphics/Rect;FLandroid/graphics/Rect;)V
+HPLcom/android/server/wm/PinnedStackController;->onActivityHidden(Landroid/content/ComponentName;)V
 HSPLcom/android/server/wm/PinnedStackController;->onConfigurationChanged()V
 HSPLcom/android/server/wm/PinnedStackController;->onDisplayInfoChanged(Landroid/view/DisplayInfo;)V
 PLcom/android/server/wm/PinnedStackController;->onTaskStackBoundsChanged(Landroid/graphics/Rect;Landroid/graphics/Rect;)Z
@@ -41277,7 +44335,7 @@
 PLcom/android/server/wm/RemoteAnimationController$RemoteAnimationAdapterWrapper;->dump(Ljava/io/PrintWriter;Ljava/lang/String;)V
 HPLcom/android/server/wm/RemoteAnimationController$RemoteAnimationAdapterWrapper;->dumpDebug(Landroid/util/proto/ProtoOutputStream;)V
 HPLcom/android/server/wm/RemoteAnimationController$RemoteAnimationAdapterWrapper;->getDurationHint()J
-PLcom/android/server/wm/RemoteAnimationController$RemoteAnimationAdapterWrapper;->getShowWallpaper()Z
+HPLcom/android/server/wm/RemoteAnimationController$RemoteAnimationAdapterWrapper;->getShowWallpaper()Z
 HPLcom/android/server/wm/RemoteAnimationController$RemoteAnimationAdapterWrapper;->getStatusBarTransitionsStartTime()J
 HPLcom/android/server/wm/RemoteAnimationController$RemoteAnimationAdapterWrapper;->onAnimationCancelled(Landroid/view/SurfaceControl;)V
 HPLcom/android/server/wm/RemoteAnimationController$RemoteAnimationAdapterWrapper;->startAnimation(Landroid/view/SurfaceControl;Landroid/view/SurfaceControl$Transaction;ILcom/android/server/wm/SurfaceAnimator$OnAnimationFinishedCallback;)V
@@ -41435,6 +44493,8 @@
 HSPLcom/android/server/wm/RootActivityContainer;->updateUIDsPresentOnDisplay()V
 PLcom/android/server/wm/RootActivityContainer;->updateUserStack(ILcom/android/server/wm/ActivityStack;)V
 HSPLcom/android/server/wm/RootWindowContainer$1;-><init>(Lcom/android/server/wm/RootWindowContainer;)V
+PLcom/android/server/wm/RootWindowContainer$1;->lambda$run$0(Ljava/lang/Object;Lcom/android/server/wm/ActivityRecord;)V
+HPLcom/android/server/wm/RootWindowContainer$1;->run()V
 HSPLcom/android/server/wm/RootWindowContainer$FindTaskResult;-><init>()V
 HSPLcom/android/server/wm/RootWindowContainer$FindTaskResult;->apply(Lcom/android/server/wm/Task;)Ljava/lang/Boolean;
 HSPLcom/android/server/wm/RootWindowContainer$FindTaskResult;->apply(Ljava/lang/Object;)Ljava/lang/Object;
@@ -41454,6 +44514,7 @@
 HPLcom/android/server/wm/RootWindowContainer$SleepTokenImpl;->toString()Ljava/lang/String;
 HSPLcom/android/server/wm/RootWindowContainer;-><clinit>()V
 HSPLcom/android/server/wm/RootWindowContainer;-><init>(Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/RootWindowContainer;->access$000(Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/ActivityRecord;)V
 HPLcom/android/server/wm/RootWindowContainer;->access$200(Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer$SleepTokenImpl;)V
 HPLcom/android/server/wm/RootWindowContainer;->addStartingWindowsForVisibleActivities()V
 HSPLcom/android/server/wm/RootWindowContainer;->allPausedActivitiesComplete()Z
@@ -41463,10 +44524,12 @@
 HSPLcom/android/server/wm/RootWindowContainer;->anyTaskForId(II)Lcom/android/server/wm/Task;
 HSPLcom/android/server/wm/RootWindowContainer;->anyTaskForId(IILandroid/app/ActivityOptions;Z)Lcom/android/server/wm/Task;
 HSPLcom/android/server/wm/RootWindowContainer;->applySleepTokens(Z)V
+HPLcom/android/server/wm/RootWindowContainer;->applySurfaceChangesTransaction()V
 HSPLcom/android/server/wm/RootWindowContainer;->applySurfaceChangesTransaction(Z)V
 HSPLcom/android/server/wm/RootWindowContainer;->attachApplication(Lcom/android/server/wm/WindowProcessController;)Z
 HSPLcom/android/server/wm/RootWindowContainer;->calculateDefaultMinimalSizeOfResizeableTasks()V
 HSPLcom/android/server/wm/RootWindowContainer;->canLaunchOnDisplay(Lcom/android/server/wm/ActivityRecord;I)Z
+PLcom/android/server/wm/RootWindowContainer;->canShowStrictModeViolation(I)Z
 HSPLcom/android/server/wm/RootWindowContainer;->canStartHomeOnDisplay(Landroid/content/pm/ActivityInfo;IZ)Z
 HSPLcom/android/server/wm/RootWindowContainer;->cancelInitializingActivities()V
 HSPLcom/android/server/wm/RootWindowContainer;->checkAppTransitionReady(Lcom/android/server/wm/WindowSurfacePlacer;)V
@@ -41476,6 +44539,7 @@
 HSPLcom/android/server/wm/RootWindowContainer;->copyAnimToLayoutParams()Z
 HSPLcom/android/server/wm/RootWindowContainer;->createSleepToken(Ljava/lang/String;I)Lcom/android/server/wm/ActivityTaskManagerInternal$SleepToken;
 PLcom/android/server/wm/RootWindowContainer;->deferUpdateBounds(I)V
+PLcom/android/server/wm/RootWindowContainer;->destroyActivity(Lcom/android/server/wm/ActivityRecord;)V
 HPLcom/android/server/wm/RootWindowContainer;->dump(Ljava/io/PrintWriter;Ljava/lang/String;)V
 HPLcom/android/server/wm/RootWindowContainer;->dumpActivities(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;ZZLjava/lang/String;)Z
 PLcom/android/server/wm/RootWindowContainer;->dumpDebug(Landroid/util/proto/ProtoOutputStream;JI)V
@@ -41503,6 +44567,7 @@
 HSPLcom/android/server/wm/RootWindowContainer;->getCurrentInputMethodWindow()Lcom/android/server/wm/WindowState;
 HSPLcom/android/server/wm/RootWindowContainer;->getDefaultDisplay()Lcom/android/server/wm/DisplayContent;
 PLcom/android/server/wm/RootWindowContainer;->getDefaultDisplayHomeActivityForUser(I)Lcom/android/server/wm/ActivityRecord;
+HPLcom/android/server/wm/RootWindowContainer;->getDefaultTaskDisplayArea()Lcom/android/server/wm/TaskDisplayArea;
 HSPLcom/android/server/wm/RootWindowContainer;->getDisplayContent(I)Lcom/android/server/wm/DisplayContent;
 HPLcom/android/server/wm/RootWindowContainer;->getDisplayContent(Ljava/lang/String;)Lcom/android/server/wm/DisplayContent;
 HSPLcom/android/server/wm/RootWindowContainer;->getDisplayContentOrCreate(I)Lcom/android/server/wm/DisplayContent;
@@ -41515,6 +44580,7 @@
 PLcom/android/server/wm/RootWindowContainer;->getName()Ljava/lang/String;
 HPLcom/android/server/wm/RootWindowContainer;->getNextFocusableStack(Lcom/android/server/wm/ActivityStack;Z)Lcom/android/server/wm/ActivityStack;
 PLcom/android/server/wm/RootWindowContainer;->getRunningTasks(ILjava/util/List;IIIZZLandroid/util/ArraySet;)V
+PLcom/android/server/wm/RootWindowContainer;->getRunningTasks(ILjava/util/List;ZIZZLandroid/util/ArraySet;)V
 HPLcom/android/server/wm/RootWindowContainer;->getStack(I)Lcom/android/server/wm/ActivityStack;
 HSPLcom/android/server/wm/RootWindowContainer;->getStack(II)Lcom/android/server/wm/ActivityStack;
 HPLcom/android/server/wm/RootWindowContainer;->getStackInfo(I)Landroid/app/ActivityManager$StackInfo;
@@ -41527,7 +44593,7 @@
 HSPLcom/android/server/wm/RootWindowContainer;->getValidLaunchStackOnDisplay(ILcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/Task;Landroid/app/ActivityOptions;Lcom/android/server/wm/LaunchParamsController$LaunchParams;)Lcom/android/server/wm/ActivityStack;
 HSPLcom/android/server/wm/RootWindowContainer;->getWindowToken(Landroid/os/IBinder;)Lcom/android/server/wm/WindowToken;
 HSPLcom/android/server/wm/RootWindowContainer;->getWindowTokenDisplay(Lcom/android/server/wm/WindowToken;)Lcom/android/server/wm/DisplayContent;
-PLcom/android/server/wm/RootWindowContainer;->handleAppCrash(Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/WindowProcessController;)V
+HPLcom/android/server/wm/RootWindowContainer;->handleAppCrash(Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/WindowProcessController;)V
 HPLcom/android/server/wm/RootWindowContainer;->handleAppCrash(Lcom/android/server/wm/WindowProcessController;)V
 HSPLcom/android/server/wm/RootWindowContainer;->handleAppDied(Lcom/android/server/wm/WindowProcessController;)Z
 HSPLcom/android/server/wm/RootWindowContainer;->handleNotObscuredLocked(Lcom/android/server/wm/WindowState;ZZ)Z
@@ -41550,6 +44616,7 @@
 PLcom/android/server/wm/RootWindowContainer;->lambda$addStartingWindowsForVisibleActivities$10(Lcom/android/server/wm/ActivityRecord;)V
 HPLcom/android/server/wm/RootWindowContainer;->lambda$addStartingWindowsForVisibleActivities$11(Lcom/android/server/wm/ActivityRecord;)V
 PLcom/android/server/wm/RootWindowContainer;->lambda$bRRfWu3QSW54eS51jCvFD02TPt8(Lcom/android/server/wm/ActivityRecord;IZLandroid/content/Intent;Landroid/content/ComponentName;)Z
+PLcom/android/server/wm/RootWindowContainer;->lambda$canShowStrictModeViolation$6(ILcom/android/server/wm/WindowState;)Z
 PLcom/android/server/wm/RootWindowContainer;->lambda$closeSystemDialogs$11(Lcom/android/server/wm/ActivityRecord;)V
 HPLcom/android/server/wm/RootWindowContainer;->lambda$closeSystemDialogs$12(Lcom/android/server/wm/ActivityRecord;)V
 HPLcom/android/server/wm/RootWindowContainer;->lambda$dumpDebug$10(Landroid/util/proto/ProtoOutputStream;ILcom/android/server/wm/WindowState;)V
@@ -41578,7 +44645,9 @@
 HSPLcom/android/server/wm/RootWindowContainer;->onDisplayChanged(I)V
 HPLcom/android/server/wm/RootWindowContainer;->onDisplayRemoved(I)V
 HSPLcom/android/server/wm/RootWindowContainer;->onSettingsRetrieved()V
+HPLcom/android/server/wm/RootWindowContainer;->performSurfacePlacement()V
 HSPLcom/android/server/wm/RootWindowContainer;->performSurfacePlacement(Z)V
+HPLcom/android/server/wm/RootWindowContainer;->performSurfacePlacementNoTrace()V
 HSPLcom/android/server/wm/RootWindowContainer;->performSurfacePlacementNoTrace(Z)V
 HSPLcom/android/server/wm/RootWindowContainer;->positionChildAt(ILcom/android/server/wm/DisplayContent;)V
 HSPLcom/android/server/wm/RootWindowContainer;->positionChildAt(ILcom/android/server/wm/DisplayContent;Z)V
@@ -41602,6 +44671,7 @@
 HSPLcom/android/server/wm/RootWindowContainer;->resumeFocusedStacksTopActivities(Lcom/android/server/wm/ActivityStack;Lcom/android/server/wm/ActivityRecord;Landroid/app/ActivityOptions;)Z
 HPLcom/android/server/wm/RootWindowContainer;->resumeHomeActivity(Lcom/android/server/wm/ActivityRecord;Ljava/lang/String;I)Z
 HSPLcom/android/server/wm/RootWindowContainer;->scheduleAnimation()V
+HPLcom/android/server/wm/RootWindowContainer;->scheduleDestroyAllActivities(Ljava/lang/String;)V
 HSPLcom/android/server/wm/RootWindowContainer;->sendPowerHintForLaunchEndIfNeeded()V
 HSPLcom/android/server/wm/RootWindowContainer;->sendPowerHintForLaunchStartIfNeeded(ZLcom/android/server/wm/ActivityRecord;)V
 HSPLcom/android/server/wm/RootWindowContainer;->setDisplayOverrideConfigurationIfNeeded(Landroid/content/res/Configuration;Lcom/android/server/wm/DisplayContent;)V
@@ -41633,6 +44703,7 @@
 HPLcom/android/server/wm/RunningTasks;->createRunningTaskInfo(Lcom/android/server/wm/Task;)Landroid/app/ActivityManager$RunningTaskInfo;
 HPLcom/android/server/wm/RunningTasks;->getTasks(ILjava/util/List;IILcom/android/server/wm/RootActivityContainer;IZZLandroid/util/ArraySet;)V
 HPLcom/android/server/wm/RunningTasks;->getTasks(ILjava/util/List;IILcom/android/server/wm/RootWindowContainer;IZZLandroid/util/ArraySet;)V
+HPLcom/android/server/wm/RunningTasks;->getTasks(ILjava/util/List;ZLcom/android/server/wm/RootWindowContainer;IZZLandroid/util/ArraySet;)V
 HPLcom/android/server/wm/RunningTasks;->lambda$hR_Ryk91b0B2BdJN9eCfQfPwC3g(Lcom/android/server/wm/RunningTasks;Lcom/android/server/wm/Task;)V
 HPLcom/android/server/wm/RunningTasks;->lambda$static$0(Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;)I
 HPLcom/android/server/wm/RunningTasks;->processTask(Lcom/android/server/wm/Task;)V
@@ -41650,7 +44721,7 @@
 HSPLcom/android/server/wm/SafeActivityOptions;->setCallingPidUidForRemoteAnimationAdapter(Landroid/app/ActivityOptions;II)V
 PLcom/android/server/wm/ScreenRotationAnimation$SurfaceRotationAnimationController$1;-><init>(Lcom/android/server/wm/ScreenRotationAnimation$SurfaceRotationAnimationController;JLandroid/animation/ArgbEvaluator;II[FI)V
 HPLcom/android/server/wm/ScreenRotationAnimation$SurfaceRotationAnimationController$1;->apply(Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl;J)V
-PLcom/android/server/wm/ScreenRotationAnimation$SurfaceRotationAnimationController$1;->getDuration()J
+HPLcom/android/server/wm/ScreenRotationAnimation$SurfaceRotationAnimationController$1;->getDuration()J
 HPLcom/android/server/wm/ScreenRotationAnimation$SurfaceRotationAnimationController;-><init>(Lcom/android/server/wm/ScreenRotationAnimation;)V
 HPLcom/android/server/wm/ScreenRotationAnimation$SurfaceRotationAnimationController;->cancel()V
 HPLcom/android/server/wm/ScreenRotationAnimation$SurfaceRotationAnimationController;->createWindowAnimationSpec(Landroid/view/animation/Animation;)Lcom/android/server/wm/WindowAnimationSpec;
@@ -41712,6 +44783,7 @@
 HSPLcom/android/server/wm/Session;-><init>(Lcom/android/server/wm/WindowManagerService;Landroid/view/IWindowSessionCallback;)V
 HPLcom/android/server/wm/Session;->actionOnWallpaper(Landroid/os/IBinder;Ljava/util/function/BiConsumer;)V
 HSPLcom/android/server/wm/Session;->addToDisplay(Landroid/view/IWindow;ILandroid/view/WindowManager$LayoutParams;IILandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/view/DisplayCutout$ParcelableWrapper;Landroid/view/InputChannel;Landroid/view/InsetsState;)I
+HPLcom/android/server/wm/Session;->addToDisplay(Landroid/view/IWindow;ILandroid/view/WindowManager$LayoutParams;IILandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/view/DisplayCutout$ParcelableWrapper;Landroid/view/InputChannel;Landroid/view/InsetsState;[Landroid/view/InsetsSourceControl;)I
 HPLcom/android/server/wm/Session;->binderDied()V
 PLcom/android/server/wm/Session;->cancelAlertWindowNotification()V
 PLcom/android/server/wm/Session;->dragRecipientEntered(Landroid/view/IWindow;)V
@@ -41726,8 +44798,11 @@
 HPLcom/android/server/wm/Session;->hasAlertWindowSurfaces(Lcom/android/server/wm/DisplayContent;)Z
 HPLcom/android/server/wm/Session;->insetsModified(Landroid/view/IWindow;Landroid/view/InsetsState;)V
 HPLcom/android/server/wm/Session;->killSessionLocked()V
+PLcom/android/server/wm/Session;->lambda$setShouldZoomOutWallpaper$2(ZLcom/android/server/wm/WallpaperController;Lcom/android/server/wm/WindowState;)V
 HPLcom/android/server/wm/Session;->lambda$setWallpaperPosition$0(FFFFLcom/android/server/wm/WallpaperController;Lcom/android/server/wm/WindowState;)V
+PLcom/android/server/wm/Session;->lambda$setWallpaperZoomOut$1(FLcom/android/server/wm/WallpaperController;Lcom/android/server/wm/WindowState;)V
 HPLcom/android/server/wm/Session;->lambda$wallpaperOffsetsComplete$1(Landroid/os/IBinder;Lcom/android/server/wm/WallpaperController;Lcom/android/server/wm/WindowState;)V
+HPLcom/android/server/wm/Session;->lambda$wallpaperOffsetsComplete$3(Landroid/os/IBinder;Lcom/android/server/wm/WallpaperController;Lcom/android/server/wm/WindowState;)V
 HPLcom/android/server/wm/Session;->onRectangleOnScreenRequested(Landroid/os/IBinder;Landroid/graphics/Rect;)V
 HSPLcom/android/server/wm/Session;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLcom/android/server/wm/Session;->onWindowSurfaceVisibilityChanged(Lcom/android/server/wm/WindowSurfaceController;ZI)V
@@ -41738,6 +44813,7 @@
 HSPLcom/android/server/wm/Session;->relayout(Landroid/view/IWindow;ILandroid/view/WindowManager$LayoutParams;IIIIJLandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/view/DisplayCutout$ParcelableWrapper;Landroid/util/MergedConfiguration;Landroid/view/SurfaceControl;Landroid/view/InsetsState;)I
 HPLcom/android/server/wm/Session;->relayout(Landroid/view/IWindow;ILandroid/view/WindowManager$LayoutParams;IIIIJLandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/view/DisplayCutout$ParcelableWrapper;Landroid/util/MergedConfiguration;Landroid/view/SurfaceControl;Landroid/view/InsetsState;Landroid/graphics/Point;)I
 HSPLcom/android/server/wm/Session;->relayout(Landroid/view/IWindow;ILandroid/view/WindowManager$LayoutParams;IIIIJLandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/view/DisplayCutout$ParcelableWrapper;Landroid/util/MergedConfiguration;Landroid/view/SurfaceControl;Landroid/view/InsetsState;Landroid/graphics/Point;Landroid/view/SurfaceControl;)I
+HPLcom/android/server/wm/Session;->relayout(Landroid/view/IWindow;ILandroid/view/WindowManager$LayoutParams;IIIIJLandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/view/DisplayCutout$ParcelableWrapper;Landroid/util/MergedConfiguration;Landroid/view/SurfaceControl;Landroid/view/InsetsState;[Landroid/view/InsetsSourceControl;Landroid/graphics/Point;Landroid/view/SurfaceControl;)I
 HPLcom/android/server/wm/Session;->remove(Landroid/view/IWindow;)V
 PLcom/android/server/wm/Session;->reparentDisplayContent(Landroid/view/IWindow;Landroid/view/SurfaceControl;I)V
 PLcom/android/server/wm/Session;->reportDropResult(Landroid/view/IWindow;Z)V
@@ -41746,11 +44822,13 @@
 HPLcom/android/server/wm/Session;->setHasOverlayUi(Z)V
 PLcom/android/server/wm/Session;->setInTouchMode(Z)V
 HPLcom/android/server/wm/Session;->setInsets(Landroid/view/IWindow;ILandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Region;)V
+PLcom/android/server/wm/Session;->setShouldZoomOutWallpaper(Landroid/os/IBinder;Z)V
 HPLcom/android/server/wm/Session;->setTransparentRegion(Landroid/view/IWindow;Landroid/graphics/Region;)V
 HPLcom/android/server/wm/Session;->setWallpaperPosition(Landroid/os/IBinder;FFFF)V
+HPLcom/android/server/wm/Session;->setWallpaperZoomOut(Landroid/os/IBinder;F)V
 PLcom/android/server/wm/Session;->toString()Ljava/lang/String;
 HPLcom/android/server/wm/Session;->updateDisplayContentLocation(Landroid/view/IWindow;III)V
-PLcom/android/server/wm/Session;->updateInputChannel(Landroid/os/IBinder;ILandroid/view/SurfaceControl;I)V
+HPLcom/android/server/wm/Session;->updateInputChannel(Landroid/os/IBinder;ILandroid/view/SurfaceControl;I)V
 HPLcom/android/server/wm/Session;->updatePointerIcon(Landroid/view/IWindow;)V
 HPLcom/android/server/wm/Session;->updateTapExcludeRegion(Landroid/view/IWindow;Landroid/graphics/Region;)V
 HPLcom/android/server/wm/Session;->wallpaperOffsetsComplete(Landroid/os/IBinder;)V
@@ -41760,6 +44838,7 @@
 PLcom/android/server/wm/ShellRoot;->clear()V
 PLcom/android/server/wm/ShellRoot;->getSurfaceControl()Landroid/view/SurfaceControl;
 PLcom/android/server/wm/ShellRoot;->lambda$new$0$ShellRoot(I)V
+PLcom/android/server/wm/ShellRoot;->startAnimation(Landroid/view/animation/Animation;)V
 HPLcom/android/server/wm/SimpleSurfaceAnimatable$Builder;-><init>()V
 PLcom/android/server/wm/SimpleSurfaceAnimatable$Builder;->access$000(Lcom/android/server/wm/SimpleSurfaceAnimatable$Builder;)I
 PLcom/android/server/wm/SimpleSurfaceAnimatable$Builder;->access$100(Lcom/android/server/wm/SimpleSurfaceAnimatable$Builder;)I
@@ -41813,6 +44892,10 @@
 HSPLcom/android/server/wm/StatusBarController;->getAppTransitionListener()Lcom/android/server/wm/WindowManagerInternal$AppTransitionListener;
 HPLcom/android/server/wm/StatusBarController;->setTopAppHidesStatusBar(Z)V
 HPLcom/android/server/wm/StatusBarController;->skipAnimation()Z
+PLcom/android/server/wm/StrictModeFlash;-><init>(Ljava/util/function/Supplier;Lcom/android/server/wm/DisplayContent;Landroid/view/SurfaceControl$Transaction;)V
+PLcom/android/server/wm/StrictModeFlash;->drawIfNeeded()V
+PLcom/android/server/wm/StrictModeFlash;->positionSurface(IILandroid/view/SurfaceControl$Transaction;)V
+PLcom/android/server/wm/StrictModeFlash;->setVisibility(ZLandroid/view/SurfaceControl$Transaction;)V
 HPLcom/android/server/wm/SurfaceAnimationRunner$1;-><init>(Lcom/android/server/wm/SurfaceAnimationRunner;Lcom/android/server/wm/SurfaceAnimationRunner$RunningAnimation;)V
 HPLcom/android/server/wm/SurfaceAnimationRunner$1;->onAnimationEnd(Landroid/animation/Animator;)V
 HPLcom/android/server/wm/SurfaceAnimationRunner$1;->onAnimationStart(Landroid/animation/Animator;)V
@@ -41857,11 +44940,13 @@
 HSPLcom/android/server/wm/SurfaceAnimator;->cancelAnimation(Landroid/view/SurfaceControl$Transaction;ZZ)V
 HPLcom/android/server/wm/SurfaceAnimator;->createAnimationLeash(Landroid/view/SurfaceControl;Landroid/view/SurfaceControl$Transaction;IIZ)Landroid/view/SurfaceControl;
 HPLcom/android/server/wm/SurfaceAnimator;->createAnimationLeash(Lcom/android/server/wm/SurfaceAnimator$Animatable;Landroid/view/SurfaceControl;Landroid/view/SurfaceControl$Transaction;IIIIIZ)Landroid/view/SurfaceControl;
+HPLcom/android/server/wm/SurfaceAnimator;->createAnimationLeash(Lcom/android/server/wm/SurfaceAnimator$Animatable;Landroid/view/SurfaceControl;Landroid/view/SurfaceControl$Transaction;IIIIIZLjava/util/function/Supplier;)Landroid/view/SurfaceControl;
 HPLcom/android/server/wm/SurfaceAnimator;->createAnimationLeash(Lcom/android/server/wm/SurfaceAnimator$Animatable;Landroid/view/SurfaceControl;Landroid/view/SurfaceControl$Transaction;IIIIZ)Landroid/view/SurfaceControl;
 PLcom/android/server/wm/SurfaceAnimator;->dump(Ljava/io/PrintWriter;Ljava/lang/String;)V
 HPLcom/android/server/wm/SurfaceAnimator;->dumpDebug(Landroid/util/proto/ProtoOutputStream;J)V
 PLcom/android/server/wm/SurfaceAnimator;->endDelayingAnimationStart()V
 HPLcom/android/server/wm/SurfaceAnimator;->getAnimation()Lcom/android/server/wm/AnimationAdapter;
+PLcom/android/server/wm/SurfaceAnimator;->getAnimationType()I
 HSPLcom/android/server/wm/SurfaceAnimator;->getFinishedCallback(Lcom/android/server/wm/SurfaceAnimator$OnAnimationFinishedCallback;)Lcom/android/server/wm/SurfaceAnimator$OnAnimationFinishedCallback;
 HSPLcom/android/server/wm/SurfaceAnimator;->getFinishedCallback(Ljava/lang/Runnable;)Lcom/android/server/wm/SurfaceAnimator$OnAnimationFinishedCallback;
 HSPLcom/android/server/wm/SurfaceAnimator;->hasLeash()Z
@@ -41916,6 +45001,7 @@
 HSPLcom/android/server/wm/Task$TaskActivitiesReport;->reset()V
 HSPLcom/android/server/wm/Task$TaskFactory;-><init>()V
 HSPLcom/android/server/wm/Task$TaskFactory;->create(Lcom/android/server/wm/ActivityTaskManagerService;IILandroid/content/pm/ActivityInfo;Landroid/content/Intent;)Lcom/android/server/wm/Task;
+PLcom/android/server/wm/Task$TaskFactory;->create(Lcom/android/server/wm/ActivityTaskManagerService;IILandroid/content/pm/ActivityInfo;Landroid/content/Intent;Z)Lcom/android/server/wm/Task;
 PLcom/android/server/wm/Task$TaskFactory;->create(Lcom/android/server/wm/ActivityTaskManagerService;ILandroid/content/Intent;Landroid/content/Intent;Ljava/lang/String;Ljava/lang/String;Landroid/content/ComponentName;Landroid/content/ComponentName;ZZZIILjava/lang/String;JZLandroid/app/ActivityManager$TaskDescription;IIIIILjava/lang/String;IZZZIILcom/android/server/wm/ActivityStack;)Lcom/android/server/wm/Task;
 PLcom/android/server/wm/Task$TaskFactory;->create(Lcom/android/server/wm/ActivityTaskManagerService;ILandroid/content/Intent;Landroid/content/Intent;Ljava/lang/String;Ljava/lang/String;Landroid/content/ComponentName;Landroid/content/ComponentName;ZZZIILjava/lang/String;JZLandroid/app/ActivityManager$TaskDescription;IIIIILjava/lang/String;Ljava/lang/String;IZZZIILcom/android/server/wm/ActivityStack;)Lcom/android/server/wm/Task;
 HSPLcom/android/server/wm/Task$TaskFactory;->create(Lcom/android/server/wm/ActivityTaskManagerService;ILandroid/content/pm/ActivityInfo;Landroid/content/Intent;Landroid/service/voice/IVoiceInteractionSession;Lcom/android/internal/app/IVoiceInteractor;Lcom/android/server/wm/ActivityStack;)Lcom/android/server/wm/Task;
@@ -41932,12 +45018,14 @@
 HSPLcom/android/server/wm/Task;->adjustForMinimalTaskDimensions(Landroid/graphics/Rect;Landroid/graphics/Rect;)V
 HPLcom/android/server/wm/Task;->alignToAdjustedBounds(Landroid/graphics/Rect;Landroid/graphics/Rect;Z)V
 HSPLcom/android/server/wm/Task;->asTask()Lcom/android/server/wm/Task;
+PLcom/android/server/wm/Task;->asTile()Lcom/android/server/wm/TaskTile;
 HPLcom/android/server/wm/Task;->autoRemoveFromRecents()Z
 HSPLcom/android/server/wm/Task;->calculateInsetFrames(Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/view/DisplayInfo;)V
 HSPLcom/android/server/wm/Task;->canAffectSystemUiFlags()Z
 PLcom/android/server/wm/Task;->canBeLaunchedOnDisplay(I)Z
 HPLcom/android/server/wm/Task;->canCreateRemoteAnimationTarget()Z
 PLcom/android/server/wm/Task;->canResizeToBounds(Landroid/graphics/Rect;)Z
+HPLcom/android/server/wm/Task;->canSpecifyOrientation()Z
 HPLcom/android/server/wm/Task;->cleanUpActivityReferences(Lcom/android/server/wm/ActivityRecord;)V
 HPLcom/android/server/wm/Task;->cleanUpResourcesForDestroy()V
 HPLcom/android/server/wm/Task;->cleanUpResourcesForDestroy(Lcom/android/server/wm/ConfigurationContainer;)V
@@ -41945,12 +45033,14 @@
 HSPLcom/android/server/wm/Task;->clearRootProcess()V
 HPLcom/android/server/wm/Task;->closeRecentsChain()V
 HSPLcom/android/server/wm/Task;->computeConfigResourceOverrides(Landroid/content/res/Configuration;Landroid/content/res/Configuration;)V
+PLcom/android/server/wm/Task;->computeConfigResourceOverrides(Landroid/content/res/Configuration;Landroid/content/res/Configuration;Landroid/view/DisplayInfo;)V
 HSPLcom/android/server/wm/Task;->computeConfigResourceOverrides(Landroid/content/res/Configuration;Landroid/content/res/Configuration;Landroid/view/DisplayInfo;Lcom/android/server/wm/ActivityRecord$CompatDisplayInsets;)V
 HSPLcom/android/server/wm/Task;->computeConfigResourceOverrides(Landroid/content/res/Configuration;Landroid/content/res/Configuration;Lcom/android/server/wm/ActivityRecord$CompatDisplayInsets;)V
 HSPLcom/android/server/wm/Task;->computeFullscreenBounds(Landroid/graphics/Rect;Lcom/android/server/wm/ActivityRecord;Landroid/graphics/Rect;I)V
 HSPLcom/android/server/wm/Task;->computeMinUserPosition(II)I
 HSPLcom/android/server/wm/Task;->computeScreenLayoutOverride(III)I
 HSPLcom/android/server/wm/Task;->create(Lcom/android/server/wm/ActivityTaskManagerService;IILandroid/content/pm/ActivityInfo;Landroid/content/Intent;)Lcom/android/server/wm/Task;
+PLcom/android/server/wm/Task;->create(Lcom/android/server/wm/ActivityTaskManagerService;IILandroid/content/pm/ActivityInfo;Landroid/content/Intent;Z)Lcom/android/server/wm/Task;
 HSPLcom/android/server/wm/Task;->create(Lcom/android/server/wm/ActivityTaskManagerService;ILandroid/content/pm/ActivityInfo;Landroid/content/Intent;Landroid/service/voice/IVoiceInteractionSession;Lcom/android/internal/app/IVoiceInteractor;Lcom/android/server/wm/ActivityStack;)Lcom/android/server/wm/Task;
 HPLcom/android/server/wm/Task;->createRemoteAnimationTarget(Lcom/android/server/wm/RemoteAnimationController$RemoteAnimationRecord;)Landroid/view/RemoteAnimationTarget;
 HSPLcom/android/server/wm/Task;->cropWindowsToStackBounds()Z
@@ -41980,16 +45070,21 @@
 HPLcom/android/server/wm/Task;->getDescendantTaskCount()I
 HSPLcom/android/server/wm/Task;->getDimBounds(Landroid/graphics/Rect;)V
 HSPLcom/android/server/wm/Task;->getDimmer()Lcom/android/server/wm/Dimmer;
+HPLcom/android/server/wm/Task;->getDisplayArea()Lcom/android/server/wm/DisplayArea;
+HPLcom/android/server/wm/Task;->getDisplayArea()Lcom/android/server/wm/TaskDisplayArea;
 HSPLcom/android/server/wm/Task;->getDisplayContent()Lcom/android/server/wm/DisplayContent;
 HSPLcom/android/server/wm/Task;->getDisplayId()I
 HSPLcom/android/server/wm/Task;->getDisplayedBounds()Landroid/graphics/Rect;
 PLcom/android/server/wm/Task;->getDragResizeMode()I
+PLcom/android/server/wm/Task;->getHasBeenVisible()Z
 HPLcom/android/server/wm/Task;->getInactiveDuration()J
 HSPLcom/android/server/wm/Task;->getLaunchBounds()Landroid/graphics/Rect;
 PLcom/android/server/wm/Task;->getMainWindowSizeChangeTransaction()Landroid/view/SurfaceControl$Transaction;
 HSPLcom/android/server/wm/Task;->getName()Ljava/lang/String;
 HSPLcom/android/server/wm/Task;->getNumRunningActivities(Lcom/android/server/wm/Task$TaskActivitiesReport;)V
+HPLcom/android/server/wm/Task;->getOrientation(I)I
 HSPLcom/android/server/wm/Task;->getOverrideDisplayedBounds()Landroid/graphics/Rect;
+HPLcom/android/server/wm/Task;->getProtoFieldId()J
 HSPLcom/android/server/wm/Task;->getRelativeDisplayedPosition(Landroid/graphics/Point;)V
 HSPLcom/android/server/wm/Task;->getResumedActivity()Lcom/android/server/wm/ActivityRecord;
 HSPLcom/android/server/wm/Task;->getRootActivity()Lcom/android/server/wm/ActivityRecord;
@@ -41997,7 +45092,7 @@
 HSPLcom/android/server/wm/Task;->getRootActivity(ZZ)Lcom/android/server/wm/ActivityRecord;
 HSPLcom/android/server/wm/Task;->getRootTask()Lcom/android/server/wm/Task;
 HSPLcom/android/server/wm/Task;->getRootTaskId()I
-PLcom/android/server/wm/Task;->getShadowRadius(Z)F
+HPLcom/android/server/wm/Task;->getShadowRadius(Z)F
 HPLcom/android/server/wm/Task;->getSmallestScreenWidthDpForDockedBounds(Landroid/graphics/Rect;)I
 PLcom/android/server/wm/Task;->getSnapshot(ZZ)Landroid/app/ActivityManager$TaskSnapshot;
 HSPLcom/android/server/wm/Task;->getStack()Lcom/android/server/wm/ActivityStack;
@@ -42013,13 +45108,16 @@
 HSPLcom/android/server/wm/Task;->getTopVisibleActivity()Lcom/android/server/wm/ActivityRecord;
 HPLcom/android/server/wm/Task;->getTopVisibleAppMainWindow()Lcom/android/server/wm/WindowState;
 HSPLcom/android/server/wm/Task;->intersectWithInsetsIfFits(Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;)V
+PLcom/android/server/wm/Task;->invalidateAppBoundsConfig(Landroid/content/res/Configuration;)V
 PLcom/android/server/wm/Task;->isClearingToReuseTask()Z
 HSPLcom/android/server/wm/Task;->isControlledByTaskOrganizer()Z
 HPLcom/android/server/wm/Task;->isDragResizing()Z
 HSPLcom/android/server/wm/Task;->isFloating()Z
 PLcom/android/server/wm/Task;->isFocused()Z
+PLcom/android/server/wm/Task;->isForceHidden()Z
 HSPLcom/android/server/wm/Task;->isLeafTask()Z
 HPLcom/android/server/wm/Task;->isOpaqueActivity(Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;)Z
+HPLcom/android/server/wm/Task;->isOrganized()Z
 HSPLcom/android/server/wm/Task;->isResizeable()Z
 HSPLcom/android/server/wm/Task;->isResizeable(Z)Z
 HSPLcom/android/server/wm/Task;->isRootTask()Z
@@ -42067,6 +45165,7 @@
 HSPLcom/android/server/wm/Task;->onParentChanged(Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/ConfigurationContainer;)V
 PLcom/android/server/wm/Task;->onSnapshotChanged(Landroid/app/ActivityManager$TaskSnapshot;)V
 HSPLcom/android/server/wm/Task;->onSurfaceShown(Landroid/view/SurfaceControl$Transaction;)V
+PLcom/android/server/wm/Task;->onTaskOrganizerChanged()V
 HSPLcom/android/server/wm/Task;->onWindowFocusChanged(Z)V
 HPLcom/android/server/wm/Task;->onlyHasTaskOverlayActivities(Z)Z
 HPLcom/android/server/wm/Task;->performClearTaskAtIndexLocked(Ljava/lang/String;)V
@@ -42092,6 +45191,7 @@
 PLcom/android/server/wm/Task;->replaceWindowsOnTaskMove(II)Z
 PLcom/android/server/wm/Task;->resize(Landroid/graphics/Rect;IZZ)Z
 PLcom/android/server/wm/Task;->resize(ZZ)V
+PLcom/android/server/wm/Task;->resolveOrganizedOverrideConfiguration(Landroid/content/res/Configuration;)V
 HSPLcom/android/server/wm/Task;->resolveOverrideConfiguration(Landroid/content/res/Configuration;)V
 HSPLcom/android/server/wm/Task;->resolveTileOverrideConfiguration(Landroid/content/res/Configuration;)V
 PLcom/android/server/wm/Task;->restoreFromXml(Lorg/xmlpull/v1/XmlPullParser;Lcom/android/server/wm/ActivityStackSupervisor;)Lcom/android/server/wm/Task;
@@ -42103,19 +45203,25 @@
 HSPLcom/android/server/wm/Task;->saveLaunchingStateIfNeeded(Lcom/android/server/wm/DisplayContent;)V
 HPLcom/android/server/wm/Task;->saveToXml(Lorg/xmlpull/v1/XmlSerializer;)V
 HSPLcom/android/server/wm/Task;->sendTaskAppeared()V
+PLcom/android/server/wm/Task;->sendTaskVanished()V
+PLcom/android/server/wm/Task;->setActivityWindowingMode(I)V
 HSPLcom/android/server/wm/Task;->setBounds(Landroid/graphics/Rect;)I
 PLcom/android/server/wm/Task;->setBounds(Landroid/graphics/Rect;Z)I
 PLcom/android/server/wm/Task;->setCanAffectSystemUiFlags(Z)V
 PLcom/android/server/wm/Task;->setDragResizing(ZI)V
+PLcom/android/server/wm/Task;->setForceHidden(IZ)Z
 HSPLcom/android/server/wm/Task;->setForceShowForAllUsers(Z)V
+PLcom/android/server/wm/Task;->setHasBeenVisible(Z)V
 HSPLcom/android/server/wm/Task;->setIntent(Landroid/content/Intent;Landroid/content/pm/ActivityInfo;)V
 HSPLcom/android/server/wm/Task;->setIntent(Lcom/android/server/wm/ActivityRecord;)V
 HPLcom/android/server/wm/Task;->setIntent(Lcom/android/server/wm/ActivityRecord;Landroid/content/Intent;Landroid/content/pm/ActivityInfo;)V
 HSPLcom/android/server/wm/Task;->setLockTaskAuth()V
 HSPLcom/android/server/wm/Task;->setLockTaskAuth(Lcom/android/server/wm/ActivityRecord;)V
+PLcom/android/server/wm/Task;->setMainWindowSizeChangeTransaction(Landroid/view/SurfaceControl$Transaction;)V
 HSPLcom/android/server/wm/Task;->setMinDimensions(Landroid/content/pm/ActivityInfo;)V
 PLcom/android/server/wm/Task;->setNextAffiliate(Lcom/android/server/wm/Task;)V
 HPLcom/android/server/wm/Task;->setOverrideDisplayedBounds(Landroid/graphics/Rect;)V
+PLcom/android/server/wm/Task;->setPictureInPictureParams(Landroid/app/PictureInPictureParams;)V
 PLcom/android/server/wm/Task;->setPrevAffiliate(Lcom/android/server/wm/Task;)V
 HSPLcom/android/server/wm/Task;->setResumedActivity(Lcom/android/server/wm/ActivityRecord;Ljava/lang/String;)V
 HSPLcom/android/server/wm/Task;->setRootProcess(Lcom/android/server/wm/WindowProcessController;)V
@@ -42125,6 +45231,7 @@
 PLcom/android/server/wm/Task;->setTaskDockedResizing(Z)V
 HSPLcom/android/server/wm/Task;->setTaskFactory(Lcom/android/server/wm/Task$TaskFactory;)V
 HSPLcom/android/server/wm/Task;->setTaskOrganizer(Landroid/view/ITaskOrganizer;)V
+PLcom/android/server/wm/Task;->setTaskOrganizer(Landroid/window/ITaskOrganizer;)Z
 PLcom/android/server/wm/Task;->setWindowingMode(I)V
 HPLcom/android/server/wm/Task;->shouldDeferRemoval()Z
 HSPLcom/android/server/wm/Task;->shouldStartChangeTransition(II)Z
@@ -42133,6 +45240,7 @@
 HPLcom/android/server/wm/Task;->stopDimming()V
 HSPLcom/android/server/wm/Task;->supportsSplitScreenWindowingMode()Z
 HSPLcom/android/server/wm/Task;->supportsSplitScreenWindowingModeInner()Z
+PLcom/android/server/wm/Task;->taskAppearedReady()Z
 PLcom/android/server/wm/Task;->taskOrganizerDied()V
 HPLcom/android/server/wm/Task;->toString()Ljava/lang/String;
 HSPLcom/android/server/wm/Task;->topRunningActivityLocked()Lcom/android/server/wm/ActivityRecord;
@@ -42145,6 +45253,8 @@
 HSPLcom/android/server/wm/Task;->updateSurfacePosition()V
 HSPLcom/android/server/wm/Task;->updateTaskDescription()V
 HSPLcom/android/server/wm/Task;->updateTaskMovement(Z)V
+HPLcom/android/server/wm/Task;->updateTaskOrganizerState(Z)V
+HPLcom/android/server/wm/Task;->updateTaskOrganizerState(Z)Z
 HSPLcom/android/server/wm/TaskChangeNotificationController$MainHandler;-><init>(Lcom/android/server/wm/TaskChangeNotificationController;Landroid/os/Looper;)V
 HSPLcom/android/server/wm/TaskChangeNotificationController$MainHandler;->handleMessage(Landroid/os/Message;)V
 HSPLcom/android/server/wm/TaskChangeNotificationController;-><init>(Ljava/lang/Object;Lcom/android/server/wm/ActivityStackSupervisor;Landroid/os/Handler;)V
@@ -42196,6 +45306,7 @@
 HPLcom/android/server/wm/TaskChangeNotificationController;->lambda$new$25(Landroid/app/ITaskStackListener;Landroid/os/Message;)V
 HPLcom/android/server/wm/TaskChangeNotificationController;->lambda$new$3(Landroid/app/ITaskStackListener;Landroid/os/Message;)V
 HSPLcom/android/server/wm/TaskChangeNotificationController;->lambda$new$4(Landroid/app/ITaskStackListener;Landroid/os/Message;)V
+PLcom/android/server/wm/TaskChangeNotificationController;->lambda$new$5(Landroid/app/ITaskStackListener;Landroid/os/Message;)V
 HPLcom/android/server/wm/TaskChangeNotificationController;->lambda$new$6(Landroid/app/ITaskStackListener;Landroid/os/Message;)V
 HPLcom/android/server/wm/TaskChangeNotificationController;->lambda$new$7(Landroid/app/ITaskStackListener;Landroid/os/Message;)V
 PLcom/android/server/wm/TaskChangeNotificationController;->lambda$new$8(Landroid/app/ITaskStackListener;Landroid/os/Message;)V
@@ -42204,6 +45315,7 @@
 PLcom/android/server/wm/TaskChangeNotificationController;->notifyActivityForcedResizable(IILjava/lang/String;)V
 PLcom/android/server/wm/TaskChangeNotificationController;->notifyActivityPinned(Lcom/android/server/wm/ActivityRecord;)V
 HPLcom/android/server/wm/TaskChangeNotificationController;->notifyActivityRequestedOrientationChanged(II)V
+HPLcom/android/server/wm/TaskChangeNotificationController;->notifyActivityRestartAttempt(Landroid/app/ActivityManager$RunningTaskInfo;ZZ)V
 PLcom/android/server/wm/TaskChangeNotificationController;->notifyActivityUnpinned()V
 PLcom/android/server/wm/TaskChangeNotificationController;->notifyPinnedActivityRestartAttempt(Z)V
 PLcom/android/server/wm/TaskChangeNotificationController;->notifyPinnedStackAnimationEnded()V
@@ -42225,6 +45337,163 @@
 HSPLcom/android/server/wm/TaskChangeNotificationController;->notifyTaskStackChanged()V
 HSPLcom/android/server/wm/TaskChangeNotificationController;->registerTaskStackListener(Landroid/app/ITaskStackListener;)V
 HPLcom/android/server/wm/TaskChangeNotificationController;->unregisterTaskStackListener(Landroid/app/ITaskStackListener;)V
+PLcom/android/server/wm/TaskContainers;-><init>(Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/TaskContainers;->addChild(Lcom/android/server/wm/ActivityStack;I)V
+PLcom/android/server/wm/TaskContainers;->addStack(Lcom/android/server/wm/ActivityStack;I)V
+HPLcom/android/server/wm/TaskContainers;->addStackReferenceIfNeeded(Lcom/android/server/wm/ActivityStack;)V
+HPLcom/android/server/wm/TaskContainers;->allResumedActivitiesComplete()Z
+HPLcom/android/server/wm/TaskContainers;->assignChildLayers(Landroid/view/SurfaceControl$Transaction;)V
+HPLcom/android/server/wm/TaskContainers;->assignStackOrdering(Landroid/view/SurfaceControl$Transaction;)V
+PLcom/android/server/wm/TaskContainers;->createStack(IIZLandroid/content/pm/ActivityInfo;Landroid/content/Intent;Z)Lcom/android/server/wm/ActivityStack;
+PLcom/android/server/wm/TaskContainers;->createStackUnchecked(IIIZLandroid/content/pm/ActivityInfo;Landroid/content/Intent;Z)Lcom/android/server/wm/ActivityStack;
+HPLcom/android/server/wm/TaskContainers;->findPositionForStack(ILcom/android/server/wm/ActivityStack;Z)I
+HPLcom/android/server/wm/TaskContainers;->findTaskLocked(Lcom/android/server/wm/ActivityRecord;ZLcom/android/server/wm/RootWindowContainer$FindTaskResult;)V
+HPLcom/android/server/wm/TaskContainers;->forAllExitingAppTokenWindows(Lcom/android/internal/util/ToBooleanFunction;Z)Z
+HPLcom/android/server/wm/TaskContainers;->forAllWindows(Lcom/android/internal/util/ToBooleanFunction;Z)Z
+HPLcom/android/server/wm/TaskContainers;->getFocusedStack()Lcom/android/server/wm/ActivityStack;
+PLcom/android/server/wm/TaskContainers;->getHomeActivity()Lcom/android/server/wm/ActivityRecord;
+PLcom/android/server/wm/TaskContainers;->getHomeActivityForUser(I)Lcom/android/server/wm/ActivityRecord;
+PLcom/android/server/wm/TaskContainers;->getIndexOf(Lcom/android/server/wm/ActivityStack;)I
+PLcom/android/server/wm/TaskContainers;->getLastFocusedStack()Lcom/android/server/wm/ActivityStack;
+PLcom/android/server/wm/TaskContainers;->getNextFocusableStack(Lcom/android/server/wm/ActivityStack;Z)Lcom/android/server/wm/ActivityStack;
+PLcom/android/server/wm/TaskContainers;->getNextStackId()I
+PLcom/android/server/wm/TaskContainers;->getOrCreateRootHomeTask()Lcom/android/server/wm/ActivityStack;
+PLcom/android/server/wm/TaskContainers;->getOrCreateStack(IIZ)Lcom/android/server/wm/ActivityStack;
+PLcom/android/server/wm/TaskContainers;->getOrCreateStack(IIZLandroid/content/Intent;Lcom/android/server/wm/Task;Z)Lcom/android/server/wm/ActivityStack;
+PLcom/android/server/wm/TaskContainers;->getOrCreateStack(Lcom/android/server/wm/ActivityRecord;Landroid/app/ActivityOptions;Lcom/android/server/wm/Task;IZ)Lcom/android/server/wm/ActivityStack;
+HPLcom/android/server/wm/TaskContainers;->getOrientation(I)I
+HPLcom/android/server/wm/TaskContainers;->getResumedActivity()Lcom/android/server/wm/ActivityRecord;
+HPLcom/android/server/wm/TaskContainers;->getRootHomeTask()Lcom/android/server/wm/ActivityStack;
+PLcom/android/server/wm/TaskContainers;->getRootPinnedTask()Lcom/android/server/wm/ActivityStack;
+PLcom/android/server/wm/TaskContainers;->getRootSplitScreenPrimaryTask()Lcom/android/server/wm/ActivityStack;
+PLcom/android/server/wm/TaskContainers;->getSplitScreenDividerAnchor()Landroid/view/SurfaceControl;
+PLcom/android/server/wm/TaskContainers;->getStack(I)Lcom/android/server/wm/ActivityStack;
+HPLcom/android/server/wm/TaskContainers;->getStack(II)Lcom/android/server/wm/ActivityStack;
+HPLcom/android/server/wm/TaskContainers;->getStackAt(I)Lcom/android/server/wm/ActivityStack;
+HPLcom/android/server/wm/TaskContainers;->getStackCount()I
+PLcom/android/server/wm/TaskContainers;->getTopStack()Lcom/android/server/wm/ActivityStack;
+HPLcom/android/server/wm/TaskContainers;->getTopStackInWindowingMode(I)Lcom/android/server/wm/ActivityStack;
+PLcom/android/server/wm/TaskContainers;->getVisibleTasks()Ljava/util/ArrayList;
+PLcom/android/server/wm/TaskContainers;->isHomeActivityForUser(Lcom/android/server/wm/ActivityRecord;I)Z
+PLcom/android/server/wm/TaskContainers;->isSplitScreenModeActivated()Z
+HPLcom/android/server/wm/TaskContainers;->isTopNotPinnedStack(Lcom/android/server/wm/ActivityStack;)Z
+PLcom/android/server/wm/TaskContainers;->isTopStack(Lcom/android/server/wm/ActivityStack;)Z
+PLcom/android/server/wm/TaskContainers;->isWindowingModeSupported(IZZZZI)Z
+PLcom/android/server/wm/TaskContainers;->lambda$_ESmy8lGTnG7nYvjr73ww_q-Aio(Lcom/android/server/wm/ActivityRecord;I)Z
+HPLcom/android/server/wm/TaskContainers;->lambda$getVisibleTasks$0(Ljava/util/ArrayList;Lcom/android/server/wm/Task;)V
+PLcom/android/server/wm/TaskContainers;->lambda$onParentChanged$1$TaskContainers()V
+PLcom/android/server/wm/TaskContainers;->moveHomeActivityToTop(Ljava/lang/String;)V
+PLcom/android/server/wm/TaskContainers;->moveHomeStackToFront(Ljava/lang/String;)V
+HPLcom/android/server/wm/TaskContainers;->moveStackBehindBottomMostVisibleStack(Lcom/android/server/wm/ActivityStack;)V
+PLcom/android/server/wm/TaskContainers;->moveStackBehindStack(Lcom/android/server/wm/ActivityStack;Lcom/android/server/wm/ActivityStack;)V
+PLcom/android/server/wm/TaskContainers;->onParentChanged(Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/ConfigurationContainer;)V
+PLcom/android/server/wm/TaskContainers;->onStackRemoved(Lcom/android/server/wm/ActivityStack;)V
+PLcom/android/server/wm/TaskContainers;->onStackWindowingModeChanged(Lcom/android/server/wm/ActivityStack;)V
+HPLcom/android/server/wm/TaskContainers;->pauseBackStacks(ZLcom/android/server/wm/ActivityRecord;)Z
+HPLcom/android/server/wm/TaskContainers;->positionChildAt(ILcom/android/server/wm/ActivityStack;Z)V
+HPLcom/android/server/wm/TaskContainers;->positionChildAt(ILcom/android/server/wm/WindowContainer;Z)V
+PLcom/android/server/wm/TaskContainers;->positionStackAt(ILcom/android/server/wm/ActivityStack;Z)V
+PLcom/android/server/wm/TaskContainers;->positionStackAt(Lcom/android/server/wm/ActivityStack;I)V
+HPLcom/android/server/wm/TaskContainers;->positionStackAt(Lcom/android/server/wm/ActivityStack;IZLjava/lang/String;)V
+PLcom/android/server/wm/TaskContainers;->positionStackAtBottom(Lcom/android/server/wm/ActivityStack;)V
+PLcom/android/server/wm/TaskContainers;->positionStackAtBottom(Lcom/android/server/wm/ActivityStack;Ljava/lang/String;)V
+PLcom/android/server/wm/TaskContainers;->positionStackAtTop(Lcom/android/server/wm/ActivityStack;ZLjava/lang/String;)V
+PLcom/android/server/wm/TaskContainers;->removeChild(Lcom/android/server/wm/ActivityStack;)V
+PLcom/android/server/wm/TaskContainers;->removeChild(Lcom/android/server/wm/WindowContainer;)V
+HPLcom/android/server/wm/TaskContainers;->removeExistingAppTokensIfPossible()V
+PLcom/android/server/wm/TaskContainers;->removeStackReferenceIfNeeded(Lcom/android/server/wm/ActivityStack;)V
+PLcom/android/server/wm/TaskContainers;->resolveWindowingMode(Lcom/android/server/wm/ActivityRecord;Landroid/app/ActivityOptions;Lcom/android/server/wm/Task;I)I
+HPLcom/android/server/wm/TaskContainers;->setExitingTokensHasVisible(Z)V
+HPLcom/android/server/wm/TaskContainers;->topRunningActivity(Z)Lcom/android/server/wm/ActivityRecord;
+PLcom/android/server/wm/TaskContainers;->updateLaunchRootTask(I)Lcom/android/server/wm/Task;
+HPLcom/android/server/wm/TaskContainers;->validateWindowingMode(ILcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/Task;I)I
+PLcom/android/server/wm/TaskDisplayArea;-><init>(Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/WindowManagerService;)V
+HPLcom/android/server/wm/TaskDisplayArea;->addChild(Lcom/android/server/wm/ActivityStack;I)V
+PLcom/android/server/wm/TaskDisplayArea;->addStack(Lcom/android/server/wm/ActivityStack;I)V
+HPLcom/android/server/wm/TaskDisplayArea;->addStackReferenceIfNeeded(Lcom/android/server/wm/ActivityStack;)V
+HPLcom/android/server/wm/TaskDisplayArea;->allResumedActivitiesComplete()Z
+HPLcom/android/server/wm/TaskDisplayArea;->assignChildLayers(Landroid/view/SurfaceControl$Transaction;)V
+HPLcom/android/server/wm/TaskDisplayArea;->assignStackOrdering(Landroid/view/SurfaceControl$Transaction;)V
+PLcom/android/server/wm/TaskDisplayArea;->canCreateRemoteAnimationTarget()Z
+PLcom/android/server/wm/TaskDisplayArea;->createStack(IIZLandroid/content/pm/ActivityInfo;Landroid/content/Intent;Z)Lcom/android/server/wm/ActivityStack;
+HPLcom/android/server/wm/TaskDisplayArea;->createStackUnchecked(IIIZLandroid/content/pm/ActivityInfo;Landroid/content/Intent;Z)Lcom/android/server/wm/ActivityStack;
+HPLcom/android/server/wm/TaskDisplayArea;->dump(Ljava/io/PrintWriter;Ljava/lang/String;Z)V
+HPLcom/android/server/wm/TaskDisplayArea;->ensureActivitiesVisible(Lcom/android/server/wm/ActivityRecord;IZZ)V
+HPLcom/android/server/wm/TaskDisplayArea;->findPositionForStack(ILcom/android/server/wm/ActivityStack;Z)I
+HPLcom/android/server/wm/TaskDisplayArea;->findTaskLocked(Lcom/android/server/wm/ActivityRecord;ZLcom/android/server/wm/RootWindowContainer$FindTaskResult;)V
+HPLcom/android/server/wm/TaskDisplayArea;->forAllExitingAppTokenWindows(Lcom/android/internal/util/ToBooleanFunction;Z)Z
+HPLcom/android/server/wm/TaskDisplayArea;->forAllWindows(Lcom/android/internal/util/ToBooleanFunction;Z)Z
+PLcom/android/server/wm/TaskDisplayArea;->getDisplayId()I
+HPLcom/android/server/wm/TaskDisplayArea;->getFocusedActivity()Lcom/android/server/wm/ActivityRecord;
+HPLcom/android/server/wm/TaskDisplayArea;->getFocusedStack()Lcom/android/server/wm/ActivityStack;
+PLcom/android/server/wm/TaskDisplayArea;->getHomeActivity()Lcom/android/server/wm/ActivityRecord;
+PLcom/android/server/wm/TaskDisplayArea;->getHomeActivityForUser(I)Lcom/android/server/wm/ActivityRecord;
+HPLcom/android/server/wm/TaskDisplayArea;->getIndexOf(Lcom/android/server/wm/ActivityStack;)I
+PLcom/android/server/wm/TaskDisplayArea;->getLastFocusedStack()Lcom/android/server/wm/ActivityStack;
+HPLcom/android/server/wm/TaskDisplayArea;->getNextFocusableStack(Lcom/android/server/wm/ActivityStack;Z)Lcom/android/server/wm/ActivityStack;
+PLcom/android/server/wm/TaskDisplayArea;->getNextStackId()I
+PLcom/android/server/wm/TaskDisplayArea;->getOrCreateRootHomeTask()Lcom/android/server/wm/ActivityStack;
+PLcom/android/server/wm/TaskDisplayArea;->getOrCreateStack(IIZ)Lcom/android/server/wm/ActivityStack;
+PLcom/android/server/wm/TaskDisplayArea;->getOrCreateStack(IIZLandroid/content/Intent;Lcom/android/server/wm/Task;)Lcom/android/server/wm/ActivityStack;
+HPLcom/android/server/wm/TaskDisplayArea;->getOrCreateStack(IIZLandroid/content/Intent;Lcom/android/server/wm/Task;Z)Lcom/android/server/wm/ActivityStack;
+PLcom/android/server/wm/TaskDisplayArea;->getOrCreateStack(Lcom/android/server/wm/ActivityRecord;Landroid/app/ActivityOptions;Lcom/android/server/wm/Task;IZ)Lcom/android/server/wm/ActivityStack;
+HPLcom/android/server/wm/TaskDisplayArea;->getOrientation(I)I
+HPLcom/android/server/wm/TaskDisplayArea;->getResumedActivity()Lcom/android/server/wm/ActivityRecord;
+HPLcom/android/server/wm/TaskDisplayArea;->getRootHomeTask()Lcom/android/server/wm/ActivityStack;
+PLcom/android/server/wm/TaskDisplayArea;->getRootPinnedTask()Lcom/android/server/wm/ActivityStack;
+PLcom/android/server/wm/TaskDisplayArea;->getRootSplitScreenPrimaryTask()Lcom/android/server/wm/ActivityStack;
+PLcom/android/server/wm/TaskDisplayArea;->getSplitScreenDividerAnchor()Landroid/view/SurfaceControl;
+PLcom/android/server/wm/TaskDisplayArea;->getStack(I)Lcom/android/server/wm/ActivityStack;
+HPLcom/android/server/wm/TaskDisplayArea;->getStack(II)Lcom/android/server/wm/ActivityStack;
+PLcom/android/server/wm/TaskDisplayArea;->getStackAbove(Lcom/android/server/wm/ActivityStack;)Lcom/android/server/wm/ActivityStack;
+HPLcom/android/server/wm/TaskDisplayArea;->getStackAt(I)Lcom/android/server/wm/ActivityStack;
+HPLcom/android/server/wm/TaskDisplayArea;->getStackCount()I
+HPLcom/android/server/wm/TaskDisplayArea;->getTopStack()Lcom/android/server/wm/ActivityStack;
+HPLcom/android/server/wm/TaskDisplayArea;->getTopStackInWindowingMode(I)Lcom/android/server/wm/ActivityStack;
+PLcom/android/server/wm/TaskDisplayArea;->getVisibleTasks()Ljava/util/ArrayList;
+PLcom/android/server/wm/TaskDisplayArea;->hasPinnedTask()Z
+PLcom/android/server/wm/TaskDisplayArea;->isHomeActivityForUser(Lcom/android/server/wm/ActivityRecord;I)Z
+PLcom/android/server/wm/TaskDisplayArea;->isRemoved()Z
+HPLcom/android/server/wm/TaskDisplayArea;->isSplitScreenModeActivated()Z
+HPLcom/android/server/wm/TaskDisplayArea;->isStackVisible(I)Z
+HPLcom/android/server/wm/TaskDisplayArea;->isTopNotPinnedStack(Lcom/android/server/wm/ActivityStack;)Z
+PLcom/android/server/wm/TaskDisplayArea;->isTopStack(Lcom/android/server/wm/ActivityStack;)Z
+PLcom/android/server/wm/TaskDisplayArea;->isWindowingModeSupported(IZZZZI)Z
+PLcom/android/server/wm/TaskDisplayArea;->lambda$XcH01_sSElIBkfdzcfbGZuAMtmk(Lcom/android/server/wm/ActivityRecord;I)Z
+HPLcom/android/server/wm/TaskDisplayArea;->lambda$getVisibleTasks$0(Ljava/util/ArrayList;Lcom/android/server/wm/Task;)V
+PLcom/android/server/wm/TaskDisplayArea;->lambda$onParentChanged$1$TaskDisplayArea()V
+PLcom/android/server/wm/TaskDisplayArea;->moveHomeActivityToTop(Ljava/lang/String;)V
+PLcom/android/server/wm/TaskDisplayArea;->moveHomeStackToFront(Ljava/lang/String;)V
+HPLcom/android/server/wm/TaskDisplayArea;->moveStackBehindBottomMostVisibleStack(Lcom/android/server/wm/ActivityStack;)V
+PLcom/android/server/wm/TaskDisplayArea;->moveStackBehindStack(Lcom/android/server/wm/ActivityStack;Lcom/android/server/wm/ActivityStack;)V
+PLcom/android/server/wm/TaskDisplayArea;->onParentChanged(Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/ConfigurationContainer;)V
+PLcom/android/server/wm/TaskDisplayArea;->onStackOrderChanged(Lcom/android/server/wm/ActivityStack;)V
+PLcom/android/server/wm/TaskDisplayArea;->onStackRemoved(Lcom/android/server/wm/ActivityStack;)V
+PLcom/android/server/wm/TaskDisplayArea;->onStackWindowingModeChanged(Lcom/android/server/wm/ActivityStack;)V
+HPLcom/android/server/wm/TaskDisplayArea;->pauseBackStacks(ZLcom/android/server/wm/ActivityRecord;)Z
+HPLcom/android/server/wm/TaskDisplayArea;->positionChildAt(ILcom/android/server/wm/ActivityStack;Z)V
+HPLcom/android/server/wm/TaskDisplayArea;->positionChildAt(ILcom/android/server/wm/WindowContainer;Z)V
+HPLcom/android/server/wm/TaskDisplayArea;->positionStackAt(ILcom/android/server/wm/ActivityStack;Z)V
+PLcom/android/server/wm/TaskDisplayArea;->positionStackAt(Lcom/android/server/wm/ActivityStack;I)V
+HPLcom/android/server/wm/TaskDisplayArea;->positionStackAt(Lcom/android/server/wm/ActivityStack;IZLjava/lang/String;)V
+PLcom/android/server/wm/TaskDisplayArea;->positionStackAtBottom(Lcom/android/server/wm/ActivityStack;)V
+PLcom/android/server/wm/TaskDisplayArea;->positionStackAtBottom(Lcom/android/server/wm/ActivityStack;Ljava/lang/String;)V
+PLcom/android/server/wm/TaskDisplayArea;->positionStackAtTop(Lcom/android/server/wm/ActivityStack;Z)V
+PLcom/android/server/wm/TaskDisplayArea;->positionStackAtTop(Lcom/android/server/wm/ActivityStack;ZLjava/lang/String;)V
+PLcom/android/server/wm/TaskDisplayArea;->prepareFreezingTaskBounds()V
+PLcom/android/server/wm/TaskDisplayArea;->registerStackOrderChangedListener(Lcom/android/server/wm/TaskDisplayArea$OnStackOrderChangedListener;)V
+PLcom/android/server/wm/TaskDisplayArea;->removeChild(Lcom/android/server/wm/ActivityStack;)V
+PLcom/android/server/wm/TaskDisplayArea;->removeChild(Lcom/android/server/wm/WindowContainer;)V
+HPLcom/android/server/wm/TaskDisplayArea;->removeExistingAppTokensIfPossible()V
+PLcom/android/server/wm/TaskDisplayArea;->removeStackReferenceIfNeeded(Lcom/android/server/wm/ActivityStack;)V
+PLcom/android/server/wm/TaskDisplayArea;->removeStacksInWindowingModes([I)V
+PLcom/android/server/wm/TaskDisplayArea;->resolveWindowingMode(Lcom/android/server/wm/ActivityRecord;Landroid/app/ActivityOptions;Lcom/android/server/wm/Task;I)I
+HPLcom/android/server/wm/TaskDisplayArea;->setExitingTokensHasVisible(Z)V
+PLcom/android/server/wm/TaskDisplayArea;->topRunningActivity()Lcom/android/server/wm/ActivityRecord;
+HPLcom/android/server/wm/TaskDisplayArea;->topRunningActivity(Z)Lcom/android/server/wm/ActivityRecord;
+PLcom/android/server/wm/TaskDisplayArea;->unregisterStackOrderChangedListener(Lcom/android/server/wm/TaskDisplayArea$OnStackOrderChangedListener;)V
+PLcom/android/server/wm/TaskDisplayArea;->updateLaunchRootTask(I)Lcom/android/server/wm/Task;
+HPLcom/android/server/wm/TaskDisplayArea;->validateWindowingMode(ILcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/Task;I)I
 HSPLcom/android/server/wm/TaskLaunchParamsModifier;-><init>(Lcom/android/server/wm/ActivityStackSupervisor;)V
 HSPLcom/android/server/wm/TaskLaunchParamsModifier;->calculate(Lcom/android/server/wm/Task;Landroid/content/pm/ActivityInfo$WindowLayout;Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;Landroid/app/ActivityOptions;ILcom/android/server/wm/LaunchParamsController$LaunchParams;Lcom/android/server/wm/LaunchParamsController$LaunchParams;)I
 HSPLcom/android/server/wm/TaskLaunchParamsModifier;->canApplyFreeformWindowPolicy(Lcom/android/server/wm/DisplayContent;I)Z
@@ -42234,27 +45503,67 @@
 HSPLcom/android/server/wm/TaskLaunchParamsModifier;->onCalculate(Lcom/android/server/wm/Task;Landroid/content/pm/ActivityInfo$WindowLayout;Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;Landroid/app/ActivityOptions;ILcom/android/server/wm/LaunchParamsController$LaunchParams;Lcom/android/server/wm/LaunchParamsController$LaunchParams;)I
 HSPLcom/android/server/wm/TaskLaunchParamsModifier;->outputLog()V
 PLcom/android/server/wm/TaskOrganizerController$DeathRecipient;-><init>(Lcom/android/server/wm/TaskOrganizerController;Landroid/view/ITaskOrganizer;I)V
+PLcom/android/server/wm/TaskOrganizerController$DeathRecipient;-><init>(Lcom/android/server/wm/TaskOrganizerController;Landroid/window/ITaskOrganizer;)V
+PLcom/android/server/wm/TaskOrganizerController$DeathRecipient;-><init>(Lcom/android/server/wm/TaskOrganizerController;Landroid/window/ITaskOrganizer;I)V
 HPLcom/android/server/wm/TaskOrganizerController$DeathRecipient;->binderDied()V
-PLcom/android/server/wm/TaskOrganizerController$TaskOrganizerState;-><init>(Lcom/android/server/wm/TaskOrganizerController;Landroid/view/ITaskOrganizer;ILcom/android/server/wm/TaskOrganizerController$TaskOrganizerState;)V
+PLcom/android/server/wm/TaskOrganizerController$TaskOrganizerCallbacks;-><init>(Lcom/android/server/wm/TaskOrganizerController;Lcom/android/server/wm/WindowManagerService;Landroid/window/ITaskOrganizer;Ljava/util/function/Consumer;)V
+PLcom/android/server/wm/TaskOrganizerController$TaskOrganizerCallbacks;->getBinder()Landroid/os/IBinder;
+PLcom/android/server/wm/TaskOrganizerController$TaskOrganizerCallbacks;->lambda$onTaskInfoChanged$2$TaskOrganizerController$TaskOrganizerCallbacks(Lcom/android/server/wm/Task;Landroid/app/ActivityManager$RunningTaskInfo;)V
+PLcom/android/server/wm/TaskOrganizerController$TaskOrganizerCallbacks;->onTaskInfoChanged(Lcom/android/server/wm/Task;Landroid/app/ActivityManager$RunningTaskInfo;)V
+HPLcom/android/server/wm/TaskOrganizerController$TaskOrganizerState;-><init>(Lcom/android/server/wm/TaskOrganizerController;Landroid/view/ITaskOrganizer;ILcom/android/server/wm/TaskOrganizerController$TaskOrganizerState;)V
+PLcom/android/server/wm/TaskOrganizerController$TaskOrganizerState;-><init>(Lcom/android/server/wm/TaskOrganizerController;Landroid/window/ITaskOrganizer;)V
+PLcom/android/server/wm/TaskOrganizerController$TaskOrganizerState;-><init>(Lcom/android/server/wm/TaskOrganizerController;Landroid/window/ITaskOrganizer;I)V
+PLcom/android/server/wm/TaskOrganizerController$TaskOrganizerState;-><init>(Lcom/android/server/wm/TaskOrganizerController;Landroid/window/ITaskOrganizer;ILcom/android/server/wm/TaskOrganizerController$TaskOrganizerState;)V
+PLcom/android/server/wm/TaskOrganizerController$TaskOrganizerState;->access$300(Lcom/android/server/wm/TaskOrganizerController$TaskOrganizerState;)Landroid/window/ITaskOrganizer;
+PLcom/android/server/wm/TaskOrganizerController$TaskOrganizerState;->access$500(Lcom/android/server/wm/TaskOrganizerController$TaskOrganizerState;)Lcom/android/server/wm/TaskOrganizerController$TaskOrganizerCallbacks;
+PLcom/android/server/wm/TaskOrganizerController$TaskOrganizerState;->access$500(Lcom/android/server/wm/TaskOrganizerController$TaskOrganizerState;)Ljava/util/ArrayList;
+PLcom/android/server/wm/TaskOrganizerController$TaskOrganizerState;->access$600(Lcom/android/server/wm/TaskOrganizerController$TaskOrganizerState;)I
 PLcom/android/server/wm/TaskOrganizerController$TaskOrganizerState;->addTask(Lcom/android/server/wm/Task;)V
+PLcom/android/server/wm/TaskOrganizerController$TaskOrganizerState;->dispose()V
 PLcom/android/server/wm/TaskOrganizerController$TaskOrganizerState;->releaseTasks()V
 HPLcom/android/server/wm/TaskOrganizerController$TaskOrganizerState;->removeTask(Lcom/android/server/wm/Task;)V
+PLcom/android/server/wm/TaskOrganizerController$TaskOrganizerState;->unlinkDeath()V
+HSPLcom/android/server/wm/TaskOrganizerController;-><clinit>()V
 HSPLcom/android/server/wm/TaskOrganizerController;-><init>(Lcom/android/server/wm/ActivityTaskManagerService;)V
 HSPLcom/android/server/wm/TaskOrganizerController;-><init>(Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/WindowManagerGlobalLock;)V
 PLcom/android/server/wm/TaskOrganizerController;->access$000(Lcom/android/server/wm/TaskOrganizerController;)Lcom/android/server/wm/WindowManagerGlobalLock;
+PLcom/android/server/wm/TaskOrganizerController;->access$100(Lcom/android/server/wm/TaskOrganizerController;)Ljava/util/HashMap;
+PLcom/android/server/wm/TaskOrganizerController;->access$200(Lcom/android/server/wm/TaskOrganizerController;)Landroid/util/SparseArray;
+PLcom/android/server/wm/TaskOrganizerController;->access$200(Lcom/android/server/wm/TaskOrganizerController;)Ljava/util/function/Consumer;
+PLcom/android/server/wm/TaskOrganizerController;->access$300(Lcom/android/server/wm/TaskOrganizerController;)Lcom/android/server/wm/ActivityTaskManagerService;
+PLcom/android/server/wm/TaskOrganizerController;->access$400(Lcom/android/server/wm/TaskOrganizerController;)Landroid/util/SparseArray;
 HPLcom/android/server/wm/TaskOrganizerController;->applyContainerTransaction(Landroid/view/WindowContainerTransaction;)V
 HPLcom/android/server/wm/TaskOrganizerController;->applyContainerTransaction(Landroid/view/WindowContainerTransaction;Landroid/view/ITaskOrganizer;)I
+HPLcom/android/server/wm/TaskOrganizerController;->applyContainerTransaction(Landroid/window/WindowContainerTransaction;Landroid/window/ITaskOrganizer;)I
 PLcom/android/server/wm/TaskOrganizerController;->applyWindowContainerChange(Lcom/android/server/wm/WindowContainer;Landroid/view/WindowContainerTransaction$Change;)I
+HPLcom/android/server/wm/TaskOrganizerController;->applyWindowContainerChange(Lcom/android/server/wm/WindowContainer;Landroid/window/WindowContainerTransaction$Change;)I
 HPLcom/android/server/wm/TaskOrganizerController;->createRootTask(II)Landroid/app/ActivityManager$RunningTaskInfo;
 HSPLcom/android/server/wm/TaskOrganizerController;->dispatchPendingTaskInfoChanges()V
 HPLcom/android/server/wm/TaskOrganizerController;->dispatchTaskInfoChanged(Lcom/android/server/wm/Task;Z)V
+HPLcom/android/server/wm/TaskOrganizerController;->dump(Ljava/io/PrintWriter;Ljava/lang/String;)V
 HPLcom/android/server/wm/TaskOrganizerController;->enforceStackPermission(Ljava/lang/String;)V
+PLcom/android/server/wm/TaskOrganizerController;->getChildTasks(Landroid/view/IWindowContainer;[I)Ljava/util/List;
+PLcom/android/server/wm/TaskOrganizerController;->getChildTasks(Landroid/window/IWindowContainer;[I)Ljava/util/List;
 HPLcom/android/server/wm/TaskOrganizerController;->getImeTarget(I)Landroid/view/IWindowContainer;
+HPLcom/android/server/wm/TaskOrganizerController;->getImeTarget(I)Landroid/window/IWindowContainer;
+PLcom/android/server/wm/TaskOrganizerController;->getRootTasks(I[I)Ljava/util/List;
 HSPLcom/android/server/wm/TaskOrganizerController;->getTaskOrganizer(I)Landroid/view/ITaskOrganizer;
+HPLcom/android/server/wm/TaskOrganizerController;->getTaskOrganizer(I)Landroid/window/ITaskOrganizer;
+PLcom/android/server/wm/TaskOrganizerController;->handleInterceptBackPressedOnTaskRoot(Lcom/android/server/wm/Task;)Z
+PLcom/android/server/wm/TaskOrganizerController;->lambda$registerTaskOrganizer$0(ILcom/android/server/wm/Task;)V
 PLcom/android/server/wm/TaskOrganizerController;->onTaskAppeared(Landroid/view/ITaskOrganizer;Lcom/android/server/wm/Task;)V
+PLcom/android/server/wm/TaskOrganizerController;->onTaskAppeared(Landroid/window/ITaskOrganizer;Lcom/android/server/wm/Task;)V
+PLcom/android/server/wm/TaskOrganizerController;->onTaskVanished(Landroid/window/ITaskOrganizer;Lcom/android/server/wm/Task;)V
 HPLcom/android/server/wm/TaskOrganizerController;->registerTaskOrganizer(Landroid/view/ITaskOrganizer;I)V
+HPLcom/android/server/wm/TaskOrganizerController;->registerTaskOrganizer(Landroid/window/ITaskOrganizer;I)V
 PLcom/android/server/wm/TaskOrganizerController;->resizePinnedStackIfNeeded(Lcom/android/server/wm/ConfigurationContainer;IILandroid/content/res/Configuration;)V
 PLcom/android/server/wm/TaskOrganizerController;->sanitizeAndApplyChange(Lcom/android/server/wm/WindowContainer;Landroid/view/WindowContainerTransaction$Change;)I
+HPLcom/android/server/wm/TaskOrganizerController;->sanitizeAndApplyChange(Lcom/android/server/wm/WindowContainer;Landroid/window/WindowContainerTransaction$Change;)I
+PLcom/android/server/wm/TaskOrganizerController;->sanitizeAndApplyHierarchyOp(Lcom/android/server/wm/WindowContainer;Landroid/view/WindowContainerTransaction$HierarchyOp;)I
+PLcom/android/server/wm/TaskOrganizerController;->sanitizeAndApplyHierarchyOp(Lcom/android/server/wm/WindowContainer;Landroid/window/WindowContainerTransaction$HierarchyOp;)I
+PLcom/android/server/wm/TaskOrganizerController;->setLaunchRoot(ILandroid/view/IWindowContainer;)V
+PLcom/android/server/wm/TaskOrganizerController;->setLaunchRoot(ILandroid/window/IWindowContainer;)V
+PLcom/android/server/wm/TaskOrganizerController;->unregisterTaskOrganizer(Landroid/window/ITaskOrganizer;)V
 PLcom/android/server/wm/TaskPersister$1;-><init>(Lcom/android/server/wm/TaskPersister;)V
 PLcom/android/server/wm/TaskPersister$1;->compare(Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;)I
 PLcom/android/server/wm/TaskPersister$1;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
@@ -42382,7 +45691,10 @@
 HSPLcom/android/server/wm/TaskSnapshotPersister;-><init>(Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/TaskSnapshotPersister$DirectoryResolver;)V
 HSPLcom/android/server/wm/TaskSnapshotPersister;->access$100(Lcom/android/server/wm/TaskSnapshotPersister;)Ljava/lang/Object;
 HPLcom/android/server/wm/TaskSnapshotPersister;->access$1000(Lcom/android/server/wm/TaskSnapshotPersister;)F
+PLcom/android/server/wm/TaskSnapshotPersister;->access$1000(Lcom/android/server/wm/TaskSnapshotPersister;)Z
+PLcom/android/server/wm/TaskSnapshotPersister;->access$1100(Lcom/android/server/wm/TaskSnapshotPersister;)F
 PLcom/android/server/wm/TaskSnapshotPersister;->access$1100(Lcom/android/server/wm/TaskSnapshotPersister;)Landroid/util/ArraySet;
+PLcom/android/server/wm/TaskSnapshotPersister;->access$1200(Lcom/android/server/wm/TaskSnapshotPersister;)Landroid/util/ArraySet;
 HSPLcom/android/server/wm/TaskSnapshotPersister;->access$200(Lcom/android/server/wm/TaskSnapshotPersister;)Z
 HSPLcom/android/server/wm/TaskSnapshotPersister;->access$300(Lcom/android/server/wm/TaskSnapshotPersister;)Ljava/util/ArrayDeque;
 HSPLcom/android/server/wm/TaskSnapshotPersister;->access$402(Lcom/android/server/wm/TaskSnapshotPersister;Z)Z
@@ -42441,10 +45753,14 @@
 HPLcom/android/server/wm/TaskTapPointerEventListener;->onPointerEvent(Landroid/view/MotionEvent;)V
 HSPLcom/android/server/wm/TaskTapPointerEventListener;->setTouchExcludeRegion(Landroid/graphics/Region;)V
 HPLcom/android/server/wm/TaskTile;-><init>(Lcom/android/server/wm/ActivityTaskManagerService;II)V
+PLcom/android/server/wm/TaskTile;->addChild(Lcom/android/server/wm/WindowContainer;I)V
+PLcom/android/server/wm/TaskTile;->asTile()Lcom/android/server/wm/TaskTile;
 PLcom/android/server/wm/TaskTile;->createEmptyActivityInfo()Landroid/content/pm/ActivityInfo;
 PLcom/android/server/wm/TaskTile;->deferScheduleMultiWindowModeChanged()Z
 PLcom/android/server/wm/TaskTile;->dumpDebug(Landroid/util/proto/ProtoOutputStream;JI)V
 HPLcom/android/server/wm/TaskTile;->fillTaskInfo(Landroid/app/TaskInfo;)V
+PLcom/android/server/wm/TaskTile;->forAllTileActivities(Ljava/util/function/Consumer;)V
+PLcom/android/server/wm/TaskTile;->forToken(Landroid/os/IBinder;)Lcom/android/server/wm/TaskTile;
 HPLcom/android/server/wm/TaskTile;->getActivityType()I
 HPLcom/android/server/wm/TaskTile;->getBounds()Landroid/graphics/Rect;
 HPLcom/android/server/wm/TaskTile;->getBounds(Landroid/graphics/Rect;)V
@@ -42458,12 +45774,14 @@
 HPLcom/android/server/wm/TaskTile;->onDisplayChanged(Lcom/android/server/wm/DisplayContent;)V
 HPLcom/android/server/wm/TaskTile;->onRequestedOverrideConfigurationChanged(Landroid/content/res/Configuration;)V
 HPLcom/android/server/wm/TaskTile;->removeAllChildren()V
+PLcom/android/server/wm/TaskTile;->removeChild(Lcom/android/server/wm/WindowContainer;)V
 PLcom/android/server/wm/TaskTile;->removeImmediately()V
 HPLcom/android/server/wm/TaskTile;->resolveTileOverrideConfiguration(Landroid/content/res/Configuration;)V
 HPLcom/android/server/wm/TaskTile;->setBounds(Landroid/graphics/Rect;)I
 HPLcom/android/server/wm/TaskTile;->supportsSplitScreenWindowingMode()Z
 PLcom/android/server/wm/TaskTile;->taskOrganizerDied()V
 PLcom/android/server/wm/TaskTile;->toString()Ljava/lang/String;
+HPLcom/android/server/wm/TaskTile;->updateResolvedConfig(Landroid/content/res/Configuration;)V
 HPLcom/android/server/wm/TaskTile;->updateSurfacePosition()V
 HSPLcom/android/server/wm/UnknownAppVisibilityController;-><init>(Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/DisplayContent;)V
 HSPLcom/android/server/wm/UnknownAppVisibilityController;->allResolved()Z
@@ -42513,6 +45831,7 @@
 HPLcom/android/server/wm/WallpaperController;->adjustWallpaperWindowsForAppTransitionIfNeeded(Landroid/util/ArraySet;)V
 HSPLcom/android/server/wm/WallpaperController;->adjustWallpaperWindowsForAppTransitionIfNeeded(Landroid/util/ArraySet;Landroid/util/ArraySet;)V
 HSPLcom/android/server/wm/WallpaperController;->clearLastWallpaperTimeoutTime()V
+HPLcom/android/server/wm/WallpaperController;->computeLastWallpaperZoomOut()V
 HSPLcom/android/server/wm/WallpaperController;->dump(Ljava/io/PrintWriter;Ljava/lang/String;)V
 HSPLcom/android/server/wm/WallpaperController;->findWallpaperTarget()V
 HSPLcom/android/server/wm/WallpaperController;->getWallpaperTarget()Lcom/android/server/wm/WindowState;
@@ -42525,25 +45844,31 @@
 HSPLcom/android/server/wm/WallpaperController;->isWallpaperVisible()Z
 HSPLcom/android/server/wm/WallpaperController;->isWallpaperVisible(Lcom/android/server/wm/WindowState;)Z
 HSPLcom/android/server/wm/WallpaperController;->lambda$new$0$WallpaperController(Lcom/android/server/wm/WindowState;)Z
+HPLcom/android/server/wm/WallpaperController;->lambda$new$1$WallpaperController(Lcom/android/server/wm/WindowState;)V
 PLcom/android/server/wm/WallpaperController;->lambda$updateWallpaperWindowsTarget$1(Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;)Z
+PLcom/android/server/wm/WallpaperController;->lambda$updateWallpaperWindowsTarget$2(Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;)Z
 PLcom/android/server/wm/WallpaperController;->processWallpaperDrawPendingTimeout()Z
 PLcom/android/server/wm/WallpaperController;->removeWallpaperToken(Lcom/android/server/wm/WallpaperWindowToken;)V
 PLcom/android/server/wm/WallpaperController;->sendWindowWallpaperCommand(Lcom/android/server/wm/WindowState;Ljava/lang/String;IIILandroid/os/Bundle;Z)Landroid/os/Bundle;
+PLcom/android/server/wm/WallpaperController;->setShouldZoomOutWallpaper(Lcom/android/server/wm/WindowState;Z)V
+PLcom/android/server/wm/WallpaperController;->setWallpaperZoomOut(Lcom/android/server/wm/WindowState;F)V
 HPLcom/android/server/wm/WallpaperController;->setWindowWallpaperPosition(Lcom/android/server/wm/WindowState;FFFF)V
 HPLcom/android/server/wm/WallpaperController;->startWallpaperAnimation(Landroid/view/animation/Animation;)V
 HSPLcom/android/server/wm/WallpaperController;->updateWallpaperOffset(Lcom/android/server/wm/WindowState;IIZ)Z
+HPLcom/android/server/wm/WallpaperController;->updateWallpaperOffset(Lcom/android/server/wm/WindowState;Z)Z
 HPLcom/android/server/wm/WallpaperController;->updateWallpaperOffsetLocked(Lcom/android/server/wm/WindowState;Z)V
 HSPLcom/android/server/wm/WallpaperController;->updateWallpaperTokens(Z)V
 PLcom/android/server/wm/WallpaperController;->updateWallpaperVisibility()V
 HSPLcom/android/server/wm/WallpaperController;->updateWallpaperWindowsTarget(Lcom/android/server/wm/WallpaperController$FindWallpaperTargetResult;)V
 HPLcom/android/server/wm/WallpaperController;->wallpaperOffsetsComplete(Landroid/os/IBinder;)V
 HPLcom/android/server/wm/WallpaperController;->wallpaperTransitionReady()Z
+HPLcom/android/server/wm/WallpaperController;->zoomOutToScale(F)F
 HSPLcom/android/server/wm/WallpaperVisibilityListeners;-><init>()V
 HSPLcom/android/server/wm/WallpaperVisibilityListeners;->notifyWallpaperVisibilityChanged(Lcom/android/server/wm/DisplayContent;)V
 PLcom/android/server/wm/WallpaperVisibilityListeners;->registerWallpaperVisibilityListener(Landroid/view/IWallpaperVisibilityListener;I)V
 PLcom/android/server/wm/WallpaperVisibilityListeners;->unregisterWallpaperVisibilityListener(Landroid/view/IWallpaperVisibilityListener;I)V
 HSPLcom/android/server/wm/WallpaperWindowToken;-><init>(Lcom/android/server/wm/WindowManagerService;Landroid/os/IBinder;ZLcom/android/server/wm/DisplayContent;Z)V
-PLcom/android/server/wm/WallpaperWindowToken;->adjustWindowParams(Lcom/android/server/wm/WindowState;Landroid/view/WindowManager$LayoutParams;)V
+HPLcom/android/server/wm/WallpaperWindowToken;->adjustWindowParams(Lcom/android/server/wm/WindowState;Landroid/view/WindowManager$LayoutParams;)V
 HPLcom/android/server/wm/WallpaperWindowToken;->forAllWallpaperWindows(Ljava/util/function/Consumer;)V
 HPLcom/android/server/wm/WallpaperWindowToken;->hasVisibleNotDrawnWallpaper()Z
 HSPLcom/android/server/wm/WallpaperWindowToken;->hideWallpaperToken(ZLjava/lang/String;)V
@@ -42552,6 +45877,7 @@
 HPLcom/android/server/wm/WallpaperWindowToken;->startAnimation(Landroid/view/animation/Animation;)V
 HSPLcom/android/server/wm/WallpaperWindowToken;->toString()Ljava/lang/String;
 HPLcom/android/server/wm/WallpaperWindowToken;->updateWallpaperOffset(IIZ)V
+HPLcom/android/server/wm/WallpaperWindowToken;->updateWallpaperOffset(Z)V
 HPLcom/android/server/wm/WallpaperWindowToken;->updateWallpaperVisibility(Z)V
 HSPLcom/android/server/wm/WallpaperWindowToken;->updateWallpaperWindows(Z)V
 HPLcom/android/server/wm/WindowAnimationSpec$TmpValues;-><init>()V
@@ -42598,6 +45924,8 @@
 HSPLcom/android/server/wm/WindowContainer$RemoteToken;-><init>(Lcom/android/server/wm/WindowContainer;)V
 PLcom/android/server/wm/WindowContainer$RemoteToken;->fromBinder(Landroid/os/IBinder;)Lcom/android/server/wm/WindowContainer$RemoteToken;
 PLcom/android/server/wm/WindowContainer$RemoteToken;->getContainer()Lcom/android/server/wm/WindowContainer;
+PLcom/android/server/wm/WindowContainer$RemoteToken;->getLeash()Landroid/view/SurfaceControl;
+PLcom/android/server/wm/WindowContainer$RemoteToken;->toWindowContainerToken()Landroid/window/WindowContainerToken;
 HSPLcom/android/server/wm/WindowContainer;-><init>(Lcom/android/server/wm/WindowManagerService;)V
 HSPLcom/android/server/wm/WindowContainer;->access$100(Lcom/android/server/wm/WindowContainer;)Landroid/util/Pools$SynchronizedPool;
 HSPLcom/android/server/wm/WindowContainer;->addChild(Lcom/android/server/wm/WindowContainer;I)V
@@ -42620,6 +45948,7 @@
 HSPLcom/android/server/wm/WindowContainer;->commitPendingTransaction()V
 HSPLcom/android/server/wm/WindowContainer;->compareTo(Lcom/android/server/wm/WindowContainer;)I
 PLcom/android/server/wm/WindowContainer;->createRemoteAnimationTarget(Lcom/android/server/wm/RemoteAnimationController$RemoteAnimationRecord;)Landroid/view/RemoteAnimationTarget;
+HPLcom/android/server/wm/WindowContainer;->createSurfaceControl(Z)V
 HSPLcom/android/server/wm/WindowContainer;->dump(Ljava/io/PrintWriter;Ljava/lang/String;Z)V
 HSPLcom/android/server/wm/WindowContainer;->dumpDebug(Landroid/util/proto/ProtoOutputStream;JI)V
 HSPLcom/android/server/wm/WindowContainer;->forAllActivities(Ljava/util/function/Consumer;)V
@@ -42657,6 +45986,7 @@
 HSPLcom/android/server/wm/WindowContainer;->getChildAt(I)Lcom/android/server/wm/WindowContainer;
 HSPLcom/android/server/wm/WindowContainer;->getChildCount()I
 HSPLcom/android/server/wm/WindowContainer;->getDimmer()Lcom/android/server/wm/Dimmer;
+HPLcom/android/server/wm/WindowContainer;->getDisplayArea()Lcom/android/server/wm/DisplayArea;
 HSPLcom/android/server/wm/WindowContainer;->getDisplayContent()Lcom/android/server/wm/DisplayContent;
 HSPLcom/android/server/wm/WindowContainer;->getDisplayedBounds()Landroid/graphics/Rect;
 HSPLcom/android/server/wm/WindowContainer;->getLastOrientationSource()Lcom/android/server/wm/WindowContainer;
@@ -42669,6 +45999,7 @@
 HSPLcom/android/server/wm/WindowContainer;->getPendingTransaction()Landroid/view/SurfaceControl$Transaction;
 HPLcom/android/server/wm/WindowContainer;->getPrefixOrderIndex()I
 HPLcom/android/server/wm/WindowContainer;->getPrefixOrderIndex(Lcom/android/server/wm/WindowContainer;)I
+PLcom/android/server/wm/WindowContainer;->getProtoFieldId()J
 HSPLcom/android/server/wm/WindowContainer;->getRelativeDisplayedPosition(Landroid/graphics/Point;)V
 PLcom/android/server/wm/WindowContainer;->getRemoteToken()Lcom/android/server/wm/WindowContainer$RemoteToken;
 HSPLcom/android/server/wm/WindowContainer;->getRequestedConfigurationOrientation()I
@@ -42691,10 +46022,13 @@
 HSPLcom/android/server/wm/WindowContainer;->hasContentToDisplay()Z
 HSPLcom/android/server/wm/WindowContainer;->isAnimating()Z
 HSPLcom/android/server/wm/WindowContainer;->isAnimating(I)Z
+HPLcom/android/server/wm/WindowContainer;->isAnimating(II)Z
+PLcom/android/server/wm/WindowContainer;->isAnimatingExcluding(II)Z
 HSPLcom/android/server/wm/WindowContainer;->isAppTransitioning()Z
 HPLcom/android/server/wm/WindowContainer;->isDescendantOf(Lcom/android/server/wm/WindowContainer;)Z
 HSPLcom/android/server/wm/WindowContainer;->isFocusable()Z
 HSPLcom/android/server/wm/WindowContainer;->isOnTop()Z
+HPLcom/android/server/wm/WindowContainer;->isOrganized()Z
 HSPLcom/android/server/wm/WindowContainer;->isVisible()Z
 HSPLcom/android/server/wm/WindowContainer;->isWaitingForTransitionStart()Z
 HPLcom/android/server/wm/WindowContainer;->lambda$getActivityAbove$1(Lcom/android/server/wm/ActivityRecord;)Z
@@ -42751,6 +46085,7 @@
 HPLcom/android/server/wm/WindowContainer;->resetDragResizingChangeReported()V
 HSPLcom/android/server/wm/WindowContainer;->scheduleAnimation()V
 HSPLcom/android/server/wm/WindowContainer;->sendAppVisibilityToClients()V
+PLcom/android/server/wm/WindowContainer;->setFocusable(Z)Z
 HSPLcom/android/server/wm/WindowContainer;->setLayer(Landroid/view/SurfaceControl$Transaction;I)V
 HSPLcom/android/server/wm/WindowContainer;->setOrientation(I)V
 HSPLcom/android/server/wm/WindowContainer;->setOrientation(ILandroid/os/IBinder;Lcom/android/server/wm/ConfigurationContainer;)V
@@ -42763,9 +46098,10 @@
 PLcom/android/server/wm/WindowContainer;->startAnimation(Landroid/view/SurfaceControl$Transaction;Lcom/android/server/wm/AnimationAdapter;ZI)V
 HPLcom/android/server/wm/WindowContainer;->startAnimation(Landroid/view/SurfaceControl$Transaction;Lcom/android/server/wm/AnimationAdapter;ZILcom/android/server/wm/SurfaceAnimator$OnAnimationFinishedCallback;)V
 HPLcom/android/server/wm/WindowContainer;->startAnimation(Landroid/view/SurfaceControl$Transaction;Lcom/android/server/wm/AnimationAdapter;ZLjava/lang/Runnable;)V
-PLcom/android/server/wm/WindowContainer;->switchUser(I)V
+HPLcom/android/server/wm/WindowContainer;->switchUser(I)V
 PLcom/android/server/wm/WindowContainer;->transferAnimation(Lcom/android/server/wm/WindowContainer;)V
 HSPLcom/android/server/wm/WindowContainer;->updateSurfacePosition()V
+HPLcom/android/server/wm/WindowContainer;->updateSurfacePosition(Landroid/view/SurfaceControl$Transaction;)V
 HPLcom/android/server/wm/WindowContainer;->waitForAllWindowsDrawn()V
 PLcom/android/server/wm/WindowContainerThumbnail;-><init>(Landroid/view/SurfaceControl$Transaction;Lcom/android/server/wm/WindowContainer;Landroid/graphics/GraphicBuffer;ZLandroid/view/Surface;Lcom/android/server/wm/SurfaceAnimator;)V
 PLcom/android/server/wm/WindowContainerThumbnail;-><init>(Ljava/util/function/Supplier;Landroid/view/SurfaceControl$Transaction;Lcom/android/server/wm/WindowContainer;Landroid/graphics/GraphicBuffer;)V
@@ -42870,6 +46206,7 @@
 PLcom/android/server/wm/WindowManagerService$LocalService;->getMagnificationRegion(ILandroid/graphics/Region;)V
 HPLcom/android/server/wm/WindowManagerService$LocalService;->getTopFocusedDisplayId()I
 PLcom/android/server/wm/WindowManagerService$LocalService;->getTopFocusedDisplayUiContext()Landroid/content/Context;
+HPLcom/android/server/wm/WindowManagerService$LocalService;->getWindowName(Landroid/os/IBinder;)Ljava/lang/String;
 HPLcom/android/server/wm/WindowManagerService$LocalService;->getWindowOwnerUserId(Landroid/os/IBinder;)I
 HPLcom/android/server/wm/WindowManagerService$LocalService;->hideIme(I)V
 HPLcom/android/server/wm/WindowManagerService$LocalService;->hideIme(Landroid/os/IBinder;)V
@@ -42924,6 +46261,7 @@
 PLcom/android/server/wm/WindowManagerService;->access$1002(Lcom/android/server/wm/WindowManagerService;F)F
 HSPLcom/android/server/wm/WindowManagerService;->access$1100(Lcom/android/server/wm/WindowManagerService;)V
 PLcom/android/server/wm/WindowManagerService;->access$1300(Lcom/android/server/wm/WindowManagerService;)Z
+PLcom/android/server/wm/WindowManagerService;->access$1300(Lcom/android/server/wm/WindowManagerService;II)V
 HPLcom/android/server/wm/WindowManagerService;->access$1400(Lcom/android/server/wm/WindowManagerService;)Lcom/android/server/wm/RecentsAnimationController;
 PLcom/android/server/wm/WindowManagerService;->access$1400(Lcom/android/server/wm/WindowManagerService;)Z
 HPLcom/android/server/wm/WindowManagerService;->access$1500(Lcom/android/server/wm/WindowManagerService;)Lcom/android/server/wm/RecentsAnimationController;
@@ -42947,6 +46285,7 @@
 PLcom/android/server/wm/WindowManagerService;->access$902(Lcom/android/server/wm/WindowManagerService;F)F
 PLcom/android/server/wm/WindowManagerService;->addShellRoot(ILandroid/view/IWindow;I)Landroid/view/SurfaceControl;
 HSPLcom/android/server/wm/WindowManagerService;->addWindow(Lcom/android/server/wm/Session;Landroid/view/IWindow;ILandroid/view/WindowManager$LayoutParams;IILandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/view/DisplayCutout$ParcelableWrapper;Landroid/view/InputChannel;Landroid/view/InsetsState;)I
+HPLcom/android/server/wm/WindowManagerService;->addWindow(Lcom/android/server/wm/Session;Landroid/view/IWindow;ILandroid/view/WindowManager$LayoutParams;IILandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/view/DisplayCutout$ParcelableWrapper;Landroid/view/InputChannel;Landroid/view/InsetsState;[Landroid/view/InsetsSourceControl;)I
 HSPLcom/android/server/wm/WindowManagerService;->addWindowContextToken(Landroid/os/IBinder;IILjava/lang/String;)I
 HSPLcom/android/server/wm/WindowManagerService;->addWindowToken(Landroid/os/IBinder;II)V
 HPLcom/android/server/wm/WindowManagerService;->addWindowTokenWithOptions(Landroid/os/IBinder;IILandroid/os/Bundle;Ljava/lang/String;)I
@@ -42972,7 +46311,7 @@
 HSPLcom/android/server/wm/WindowManagerService;->createSurfaceControl(Landroid/view/SurfaceControl;ILcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowStateAnimator;)I
 HSPLcom/android/server/wm/WindowManagerService;->createSurfaceControl(Landroid/view/SurfaceControl;Landroid/view/SurfaceControl;ILcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowStateAnimator;)I
 HSPLcom/android/server/wm/WindowManagerService;->createWatermark()V
-PLcom/android/server/wm/WindowManagerService;->destroyInputConsumer(Ljava/lang/String;I)Z
+HPLcom/android/server/wm/WindowManagerService;->destroyInputConsumer(Ljava/lang/String;I)Z
 HSPLcom/android/server/wm/WindowManagerService;->destroyPreservedSurfaceLocked()V
 HSPLcom/android/server/wm/WindowManagerService;->detectSafeMode()Z
 HSPLcom/android/server/wm/WindowManagerService;->dipToPixel(ILandroid/util/DisplayMetrics;)I
@@ -43021,8 +46360,10 @@
 HPLcom/android/server/wm/WindowManagerService;->getInitialDisplayDensity(I)I
 PLcom/android/server/wm/WindowManagerService;->getInitialDisplaySize(ILandroid/graphics/Point;)V
 HSPLcom/android/server/wm/WindowManagerService;->getInputManagerCallback()Lcom/android/server/wm/InputManagerCallback;
+HPLcom/android/server/wm/WindowManagerService;->getInsetsSourceControls(Lcom/android/server/wm/WindowState;[Landroid/view/InsetsSourceControl;)V
 HSPLcom/android/server/wm/WindowManagerService;->getLidState()I
 PLcom/android/server/wm/WindowManagerService;->getNavBarPosition(I)I
+PLcom/android/server/wm/WindowManagerService;->getPreferredOptionsPanelGravity(I)I
 HSPLcom/android/server/wm/WindowManagerService;->getRecentsAnimationController()Lcom/android/server/wm/RecentsAnimationController;
 HSPLcom/android/server/wm/WindowManagerService;->getStableInsets(ILandroid/graphics/Rect;)V
 HSPLcom/android/server/wm/WindowManagerService;->getStableInsetsLocked(ILandroid/graphics/Rect;)V
@@ -43061,12 +46402,15 @@
 PLcom/android/server/wm/WindowManagerService;->isValidPictureInPictureAspectRatio(Lcom/android/server/wm/DisplayContent;F)Z
 PLcom/android/server/wm/WindowManagerService;->isWindowTraceEnabled()Z
 HPLcom/android/server/wm/WindowManagerService;->lambda$checkDrawnWindowsLocked$7$WindowManagerService(Lcom/android/server/wm/WindowContainer;Ljava/lang/Runnable;)V
+PLcom/android/server/wm/WindowManagerService;->lambda$dumpWindowsNoHeaderLocked$9$WindowManagerService(Ljava/io/PrintWriter;Lcom/android/server/wm/DisplayContent;)V
 PLcom/android/server/wm/WindowManagerService;->lambda$dumpWindowsNoHeaderLocked$9(Ljava/io/PrintWriter;Lcom/android/server/wm/DisplayContent;)V
 HSPLcom/android/server/wm/WindowManagerService;->lambda$main$1(Landroid/content/Context;Lcom/android/server/input/InputManagerService;ZZLcom/android/server/policy/WindowManagerPolicy;Lcom/android/server/wm/ActivityTaskManagerService;Ljava/util/function/Supplier;Ljava/util/function/Supplier;Ljava/util/function/Function;)V
 PLcom/android/server/wm/WindowManagerService;->lambda$new$0$WindowManagerService()V
 PLcom/android/server/wm/WindowManagerService;->lambda$onOverlayChanged$12(Lcom/android/server/wm/DisplayContent;)V
 PLcom/android/server/wm/WindowManagerService;->lambda$requestAssistScreenshot$3(Landroid/app/IAssistDataReceiver;Landroid/graphics/Bitmap;)V
 PLcom/android/server/wm/WindowManagerService;->lambda$setCurrentUser$2(ILcom/android/server/wm/DisplayContent;)V
+PLcom/android/server/wm/WindowManagerService;->lambda$syncInputTransactions$14(Landroid/view/SurfaceControl$Transaction;Lcom/android/server/wm/DisplayContent;)V
+PLcom/android/server/wm/WindowManagerService;->lambda$syncInputTransactions$14(Lcom/android/server/wm/DisplayContent;)V
 HPLcom/android/server/wm/WindowManagerService;->lambda$updateNonSystemOverlayWindowsVisibilityIfNeeded$13(ZLcom/android/server/wm/WindowState;)V
 PLcom/android/server/wm/WindowManagerService;->lockNow(Landroid/os/Bundle;)V
 HSPLcom/android/server/wm/WindowManagerService;->main(Landroid/content/Context;Lcom/android/server/input/InputManagerService;ZZLcom/android/server/policy/WindowManagerPolicy;Lcom/android/server/wm/ActivityTaskManagerService;)Lcom/android/server/wm/WindowManagerService;
@@ -43075,6 +46419,7 @@
 HSPLcom/android/server/wm/WindowManagerService;->makeWindowFreezingScreenIfNeededLocked(Lcom/android/server/wm/WindowState;)V
 HPLcom/android/server/wm/WindowManagerService;->modifyDisplayWindowInsets(ILandroid/view/InsetsState;)V
 HPLcom/android/server/wm/WindowManagerService;->monitor()V
+PLcom/android/server/wm/WindowManagerService;->moveDisplayToTop(I)V
 HSPLcom/android/server/wm/WindowManagerService;->notifyFocusChanged()V
 PLcom/android/server/wm/WindowManagerService;->notifyHardKeyboardStatusChange()V
 PLcom/android/server/wm/WindowManagerService;->notifyKeyguardFlagsChanged(Ljava/lang/Runnable;I)V
@@ -43117,6 +46462,7 @@
 HSPLcom/android/server/wm/WindowManagerService;->relayoutWindow(Lcom/android/server/wm/Session;Landroid/view/IWindow;ILandroid/view/WindowManager$LayoutParams;IIIIJLandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/view/DisplayCutout$ParcelableWrapper;Landroid/util/MergedConfiguration;Landroid/view/SurfaceControl;Landroid/view/InsetsState;)I
 HPLcom/android/server/wm/WindowManagerService;->relayoutWindow(Lcom/android/server/wm/Session;Landroid/view/IWindow;ILandroid/view/WindowManager$LayoutParams;IIIIJLandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/view/DisplayCutout$ParcelableWrapper;Landroid/util/MergedConfiguration;Landroid/view/SurfaceControl;Landroid/view/InsetsState;Landroid/graphics/Point;)I
 HSPLcom/android/server/wm/WindowManagerService;->relayoutWindow(Lcom/android/server/wm/Session;Landroid/view/IWindow;ILandroid/view/WindowManager$LayoutParams;IIIIJLandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/view/DisplayCutout$ParcelableWrapper;Landroid/util/MergedConfiguration;Landroid/view/SurfaceControl;Landroid/view/InsetsState;Landroid/graphics/Point;Landroid/view/SurfaceControl;)I
+HPLcom/android/server/wm/WindowManagerService;->relayoutWindow(Lcom/android/server/wm/Session;Landroid/view/IWindow;ILandroid/view/WindowManager$LayoutParams;IIIIJLandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/view/DisplayCutout$ParcelableWrapper;Landroid/util/MergedConfiguration;Landroid/view/SurfaceControl;Landroid/view/InsetsState;[Landroid/view/InsetsSourceControl;Landroid/graphics/Point;Landroid/view/SurfaceControl;)I
 HPLcom/android/server/wm/WindowManagerService;->removeObsoleteTaskFiles(Landroid/util/ArraySet;[I)V
 HPLcom/android/server/wm/WindowManagerService;->removeRotationWatcher(Landroid/view/IRotationWatcher;)V
 HPLcom/android/server/wm/WindowManagerService;->removeWindow(Lcom/android/server/wm/Session;Landroid/view/IWindow;)V
@@ -43143,6 +46489,7 @@
 HPLcom/android/server/wm/WindowManagerService;->setDockedStackDividerTouchRegion(Landroid/graphics/Rect;)V
 PLcom/android/server/wm/WindowManagerService;->setDockedStackResizing(Z)V
 HSPLcom/android/server/wm/WindowManagerService;->setEventDispatching(Z)V
+PLcom/android/server/wm/WindowManagerService;->setForcedDisplayDensityForUser(III)V
 PLcom/android/server/wm/WindowManagerService;->setForwardedInsets(ILandroid/graphics/Insets;)V
 HSPLcom/android/server/wm/WindowManagerService;->setGlobalShadowSettings()V
 HSPLcom/android/server/wm/WindowManagerService;->setHoldScreenLocked(Lcom/android/server/wm/Session;)V
@@ -43165,11 +46512,14 @@
 PLcom/android/server/wm/WindowManagerService;->shouldShowSystemDecors(I)Z
 HSPLcom/android/server/wm/WindowManagerService;->showEmulatorDisplayOverlayIfNeeded()V
 PLcom/android/server/wm/WindowManagerService;->showRecentApps()V
+PLcom/android/server/wm/WindowManagerService;->showStrictModeViolation(II)V
+PLcom/android/server/wm/WindowManagerService;->showStrictModeViolation(Z)V
 PLcom/android/server/wm/WindowManagerService;->startFreezingDisplayLocked(II)V
 HSPLcom/android/server/wm/WindowManagerService;->startFreezingDisplayLocked(IILcom/android/server/wm/DisplayContent;)V
 PLcom/android/server/wm/WindowManagerService;->startFreezingScreen(II)V
 HSPLcom/android/server/wm/WindowManagerService;->stopFreezingDisplayLocked()V
 PLcom/android/server/wm/WindowManagerService;->stopFreezingScreen()V
+PLcom/android/server/wm/WindowManagerService;->syncInputTransactions()V
 HSPLcom/android/server/wm/WindowManagerService;->systemReady()V
 PLcom/android/server/wm/WindowManagerService;->thawDisplayRotation(I)V
 PLcom/android/server/wm/WindowManagerService;->thawRotation()V
@@ -43184,13 +46534,14 @@
 HSPLcom/android/server/wm/WindowManagerService;->updateFocusedWindowLocked(IZ)Z
 PLcom/android/server/wm/WindowManagerService;->updateHiddenWhileSuspendedState(Landroid/util/ArraySet;Z)V
 HPLcom/android/server/wm/WindowManagerService;->updateInputChannel(Landroid/os/IBinder;IIILandroid/view/SurfaceControl;Ljava/lang/String;Landroid/view/InputApplicationHandle;I)V
-PLcom/android/server/wm/WindowManagerService;->updateInputChannel(Landroid/os/IBinder;ILandroid/view/SurfaceControl;I)V
+HPLcom/android/server/wm/WindowManagerService;->updateInputChannel(Landroid/os/IBinder;ILandroid/view/SurfaceControl;I)V
 HSPLcom/android/server/wm/WindowManagerService;->updateNonSystemOverlayWindowsVisibilityIfNeeded(Lcom/android/server/wm/WindowState;Z)V
 HPLcom/android/server/wm/WindowManagerService;->updatePointerIcon(Landroid/view/IWindow;)V
 HSPLcom/android/server/wm/WindowManagerService;->updateRotation(ZZ)V
 HSPLcom/android/server/wm/WindowManagerService;->updateRotationUnchecked(ZZ)V
 HPLcom/android/server/wm/WindowManagerService;->updateTapExcludeRegion(Landroid/view/IWindow;Landroid/graphics/Region;)V
 HSPLcom/android/server/wm/WindowManagerService;->useBLAST()Z
+PLcom/android/server/wm/WindowManagerService;->waitForAnimationsToComplete()V
 HPLcom/android/server/wm/WindowManagerService;->watchRotation(Landroid/view/IRotationWatcher;I)I
 HSPLcom/android/server/wm/WindowManagerService;->windowForClientLocked(Lcom/android/server/wm/Session;Landroid/os/IBinder;Z)Lcom/android/server/wm/WindowState;
 HSPLcom/android/server/wm/WindowManagerService;->windowForClientLocked(Lcom/android/server/wm/Session;Landroid/view/IWindow;Z)Lcom/android/server/wm/WindowState;
@@ -43199,8 +46550,10 @@
 PLcom/android/server/wm/WindowManagerShellCommand;->lambda$runDumpVisibleWindowViews$0(Ljava/util/ArrayList;Lcom/android/server/wm/WindowState;)V
 PLcom/android/server/wm/WindowManagerShellCommand;->onCommand(Ljava/lang/String;)I
 PLcom/android/server/wm/WindowManagerShellCommand;->printInitialDisplayDensity(Ljava/io/PrintWriter;I)V
+PLcom/android/server/wm/WindowManagerShellCommand;->printInitialDisplaySize(Ljava/io/PrintWriter;I)V
 PLcom/android/server/wm/WindowManagerShellCommand;->runDismissKeyguard(Ljava/io/PrintWriter;)I
 PLcom/android/server/wm/WindowManagerShellCommand;->runDisplayDensity(Ljava/io/PrintWriter;)I
+PLcom/android/server/wm/WindowManagerShellCommand;->runDisplaySize(Ljava/io/PrintWriter;)I
 PLcom/android/server/wm/WindowManagerShellCommand;->runDumpVisibleWindowViews(Ljava/io/PrintWriter;)I
 HSPLcom/android/server/wm/WindowManagerThreadPriorityBooster;-><init>()V
 HSPLcom/android/server/wm/WindowManagerThreadPriorityBooster;->boost()V
@@ -43208,6 +46561,14 @@
 HSPLcom/android/server/wm/WindowManagerThreadPriorityBooster;->setAppTransitionRunning(Z)V
 PLcom/android/server/wm/WindowManagerThreadPriorityBooster;->setBoundsAnimationRunning(Z)V
 HSPLcom/android/server/wm/WindowManagerThreadPriorityBooster;->updatePriorityLocked()V
+HSPLcom/android/server/wm/WindowOrganizerController;-><init>(Lcom/android/server/wm/ActivityTaskManagerService;)V
+HPLcom/android/server/wm/WindowOrganizerController;->applySyncTransaction(Landroid/window/WindowContainerTransaction;Landroid/window/IWindowContainerTransactionCallback;)I
+PLcom/android/server/wm/WindowOrganizerController;->applyTransaction(Landroid/window/WindowContainerTransaction;)V
+PLcom/android/server/wm/WindowOrganizerController;->applyWindowContainerChange(Lcom/android/server/wm/WindowContainer;Landroid/window/WindowContainerTransaction$Change;)I
+PLcom/android/server/wm/WindowOrganizerController;->enforceStackPermission(Ljava/lang/String;)V
+PLcom/android/server/wm/WindowOrganizerController;->getTaskOrganizerController()Landroid/window/ITaskOrganizerController;
+PLcom/android/server/wm/WindowOrganizerController;->resizePinnedStackIfNeeded(Lcom/android/server/wm/ConfigurationContainer;IILandroid/content/res/Configuration;)V
+HPLcom/android/server/wm/WindowOrganizerController;->sanitizeAndApplyChange(Lcom/android/server/wm/WindowContainer;Landroid/window/WindowContainerTransaction$Change;)I
 HSPLcom/android/server/wm/WindowProcessController;-><init>(Lcom/android/server/wm/ActivityTaskManagerService;Landroid/content/pm/ApplicationInfo;Ljava/lang/String;IILjava/lang/Object;Lcom/android/server/wm/WindowProcessListener;)V
 HSPLcom/android/server/wm/WindowProcessController;->addActivityIfNeeded(Lcom/android/server/wm/ActivityRecord;)V
 HSPLcom/android/server/wm/WindowProcessController;->addPackage(Ljava/lang/String;)V
@@ -43250,6 +46611,7 @@
 PLcom/android/server/wm/WindowProcessController;->hasOverlayUi()Z
 PLcom/android/server/wm/WindowProcessController;->hasPendingUiClean()Z
 HSPLcom/android/server/wm/WindowProcessController;->hasRecentTasks()Z
+PLcom/android/server/wm/WindowProcessController;->hasResumedActivity()Z
 HPLcom/android/server/wm/WindowProcessController;->hasStartedActivity(Lcom/android/server/wm/ActivityRecord;)Z
 HSPLcom/android/server/wm/WindowProcessController;->hasThread()Z
 PLcom/android/server/wm/WindowProcessController;->hasTopUi()Z
@@ -43353,6 +46715,8 @@
 HSPLcom/android/server/wm/WindowState$WindowId;-><init>(Lcom/android/server/wm/WindowState;)V
 HSPLcom/android/server/wm/WindowState$WindowId;-><init>(Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState$1;)V
 PLcom/android/server/wm/WindowState$WindowId;->isFocused()Z
+PLcom/android/server/wm/WindowState$WindowId;->registerFocusObserver(Landroid/view/IWindowFocusObserver;)V
+PLcom/android/server/wm/WindowState$WindowId;->unregisterFocusObserver(Landroid/view/IWindowFocusObserver;)V
 HSPLcom/android/server/wm/WindowState;-><clinit>()V
 HSPLcom/android/server/wm/WindowState;-><init>(Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/Session;Landroid/view/IWindow;Lcom/android/server/wm/WindowToken;Lcom/android/server/wm/WindowState;IILandroid/view/WindowManager$LayoutParams;IIZ)V
 HSPLcom/android/server/wm/WindowState;-><init>(Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/Session;Landroid/view/IWindow;Lcom/android/server/wm/WindowToken;Lcom/android/server/wm/WindowState;IILandroid/view/WindowManager$LayoutParams;IIZLcom/android/server/wm/WindowState$PowerManagerWrapper;)V
@@ -43411,6 +46775,7 @@
 HSPLcom/android/server/wm/WindowState;->getBaseType()I
 HSPLcom/android/server/wm/WindowState;->getBounds()Landroid/graphics/Rect;
 HPLcom/android/server/wm/WindowState;->getClientInsetsState()Landroid/view/InsetsState;
+PLcom/android/server/wm/WindowState;->getClientViewRootSurface()Landroid/view/SurfaceControl;
 HSPLcom/android/server/wm/WindowState;->getCompatFrame(Landroid/graphics/Rect;)V
 HSPLcom/android/server/wm/WindowState;->getCompatFrameSize(Landroid/graphics/Rect;)V
 HSPLcom/android/server/wm/WindowState;->getConfiguration()Landroid/content/res/Configuration;
@@ -43473,7 +46838,7 @@
 HPLcom/android/server/wm/WindowState;->getTransformationMatrix([FLandroid/graphics/Matrix;)V
 HPLcom/android/server/wm/WindowState;->getVisibleBounds(Landroid/graphics/Rect;)V
 HPLcom/android/server/wm/WindowState;->getVisibleFrameLw()Landroid/graphics/Rect;
-PLcom/android/server/wm/WindowState;->getWindow()Lcom/android/server/wm/WindowState;
+HPLcom/android/server/wm/WindowState;->getWindow()Lcom/android/server/wm/WindowState;
 HPLcom/android/server/wm/WindowState;->getWindow(Ljava/util/function/Predicate;)Lcom/android/server/wm/WindowState;
 HSPLcom/android/server/wm/WindowState;->getWindowFrames()Lcom/android/server/wm/WindowFrames;
 HPLcom/android/server/wm/WindowState;->getWindowInfo()Landroid/view/WindowInfo;
@@ -43497,9 +46862,11 @@
 HSPLcom/android/server/wm/WindowState;->initAppOpsState()V
 HSPLcom/android/server/wm/WindowState;->initExclusionRestrictions()V
 HPLcom/android/server/wm/WindowState;->isAnimating(I)Z
+HPLcom/android/server/wm/WindowState;->isAnimating(II)Z
 HSPLcom/android/server/wm/WindowState;->isAnimatingLw()Z
 PLcom/android/server/wm/WindowState;->isAnimatingToRecents()Z
 HSPLcom/android/server/wm/WindowState;->isChildWindow()Z
+HPLcom/android/server/wm/WindowState;->isClientLocal()Z
 PLcom/android/server/wm/WindowState;->isClosing()Z
 HSPLcom/android/server/wm/WindowState;->isDimming()Z
 HSPLcom/android/server/wm/WindowState;->isDisplayedLw()Z
@@ -43509,6 +46876,7 @@
 PLcom/android/server/wm/WindowState;->isDragResizingChangeReported()Z
 HSPLcom/android/server/wm/WindowState;->isDrawFinishedLw()Z
 HSPLcom/android/server/wm/WindowState;->isDrawnLw()Z
+HPLcom/android/server/wm/WindowState;->isDreamWindow()Z
 HSPLcom/android/server/wm/WindowState;->isFocused()Z
 HSPLcom/android/server/wm/WindowState;->isFullyTransparent()Z
 HSPLcom/android/server/wm/WindowState;->isGoneForLayoutLw()Z
@@ -43576,6 +46944,7 @@
 HSPLcom/android/server/wm/WindowState;->prelayout()V
 HSPLcom/android/server/wm/WindowState;->prepareSurfaces()V
 HSPLcom/android/server/wm/WindowState;->prepareWindowToDisplayDuringRelayout(Z)V
+PLcom/android/server/wm/WindowState;->registerFocusObserver(Landroid/view/IWindowFocusObserver;)V
 HSPLcom/android/server/wm/WindowState;->registeredForDisplayConfigChanges()Z
 HSPLcom/android/server/wm/WindowState;->relayoutVisibleWindow(II)I
 PLcom/android/server/wm/WindowState;->removeEmbeddedDisplayContent(Lcom/android/server/wm/DisplayContent;)Z
@@ -43612,6 +46981,7 @@
 HSPLcom/android/server/wm/WindowState;->setReportResizeHints()Z
 HSPLcom/android/server/wm/WindowState;->setRequestedSize(II)V
 PLcom/android/server/wm/WindowState;->setShowToOwnerOnlyLocked(Z)V
+PLcom/android/server/wm/WindowState;->setSimulatedWindowFrames(Lcom/android/server/wm/WindowFrames;)V
 HPLcom/android/server/wm/WindowState;->setSystemGestureExclusion(Ljava/util/List;)Z
 HSPLcom/android/server/wm/WindowState;->setTouchableRegionCropIfNeeded(Landroid/view/InputWindowHandle;)V
 PLcom/android/server/wm/WindowState;->setWaitingForDrawnIfResizingChanged()V
@@ -43634,13 +47004,14 @@
 HPLcom/android/server/wm/WindowState;->subtractInsets(Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;)V
 HSPLcom/android/server/wm/WindowState;->subtractTouchExcludeRegionIfNeeded(Landroid/graphics/Region;)V
 HPLcom/android/server/wm/WindowState;->surfaceInsetsChanging()Z
-PLcom/android/server/wm/WindowState;->switchUser(I)V
+HPLcom/android/server/wm/WindowState;->switchUser(I)V
 HSPLcom/android/server/wm/WindowState;->toString()Ljava/lang/String;
 HSPLcom/android/server/wm/WindowState;->transformClipRectFromScreenToSurfaceSpace(Landroid/graphics/Rect;)V
 HSPLcom/android/server/wm/WindowState;->transformFrameToSurfacePosition(IILandroid/graphics/Point;)V
 HSPLcom/android/server/wm/WindowState;->transformSurfaceInsetsPosition(Landroid/graphics/Point;Landroid/graphics/Rect;)V
 HPLcom/android/server/wm/WindowState;->translateToWindowX(F)F
 HPLcom/android/server/wm/WindowState;->translateToWindowY(F)F
+PLcom/android/server/wm/WindowState;->unregisterFocusObserver(Landroid/view/IWindowFocusObserver;)V
 HPLcom/android/server/wm/WindowState;->updateAppOpsState()V
 HSPLcom/android/server/wm/WindowState;->updateFrameRateSelectionPriorityIfNeeded()V
 HSPLcom/android/server/wm/WindowState;->updateLastFrames()V
@@ -43674,6 +47045,7 @@
 HPLcom/android/server/wm/WindowStateAnimator;->dump(Ljava/io/PrintWriter;Ljava/lang/String;Z)V
 HSPLcom/android/server/wm/WindowStateAnimator;->dumpDebug(Landroid/util/proto/ProtoOutputStream;J)V
 HSPLcom/android/server/wm/WindowStateAnimator;->finishDrawingLocked(Landroid/view/SurfaceControl$Transaction;)Z
+PLcom/android/server/wm/WindowStateAnimator;->getClientViewRootSurface()Landroid/view/SurfaceControl;
 HPLcom/android/server/wm/WindowStateAnimator;->getDeferTransactionBarrier()Landroid/view/SurfaceControl;
 HSPLcom/android/server/wm/WindowStateAnimator;->getShown()Z
 HSPLcom/android/server/wm/WindowStateAnimator;->hasSurface()Z
@@ -43692,6 +47064,8 @@
 HSPLcom/android/server/wm/WindowStateAnimator;->setSurfaceBoundariesLocked(Z)V
 PLcom/android/server/wm/WindowStateAnimator;->setTransparentRegionHintLocked(Landroid/graphics/Region;)V
 HSPLcom/android/server/wm/WindowStateAnimator;->setWallpaperOffset(II)Z
+HPLcom/android/server/wm/WindowStateAnimator;->setWallpaperOffset(IIF)Z
+HPLcom/android/server/wm/WindowStateAnimator;->setWallpaperPositionAndScale(IIFZ)V
 HSPLcom/android/server/wm/WindowStateAnimator;->showSurfaceRobustlyLocked()Z
 HPLcom/android/server/wm/WindowStateAnimator;->toString()Ljava/lang/String;
 HPLcom/android/server/wm/WindowStateAnimator;->tryChangeFormatInPlaceLocked()Z
@@ -43704,6 +47078,7 @@
 HSPLcom/android/server/wm/WindowSurfaceController;->dumpDebug(Landroid/util/proto/ProtoOutputStream;J)V
 PLcom/android/server/wm/WindowSurfaceController;->forceScaleableInTransaction(Z)V
 HSPLcom/android/server/wm/WindowSurfaceController;->getBLASTSurfaceControl(Landroid/view/SurfaceControl;)V
+PLcom/android/server/wm/WindowSurfaceController;->getClientViewRootSurface()Landroid/view/SurfaceControl;
 PLcom/android/server/wm/WindowSurfaceController;->getDeferTransactionBarrier()Landroid/view/SurfaceControl;
 HSPLcom/android/server/wm/WindowSurfaceController;->getHeight()I
 HSPLcom/android/server/wm/WindowSurfaceController;->getShown()Z
@@ -43740,28 +47115,38 @@
 HSPLcom/android/server/wm/WindowSurfacePlacer;->isLayoutDeferred()Z
 HSPLcom/android/server/wm/WindowSurfacePlacer;->performSurfacePlacement()V
 HSPLcom/android/server/wm/WindowSurfacePlacer;->performSurfacePlacement(Z)V
+PLcom/android/server/wm/WindowSurfacePlacer;->performSurfacePlacementIfScheduled()V
 HSPLcom/android/server/wm/WindowSurfacePlacer;->performSurfacePlacementLoop()V
 HSPLcom/android/server/wm/WindowSurfacePlacer;->requestTraversal()V
+PLcom/android/server/wm/WindowToken$FixedRotationTransformState;-><init>(Lcom/android/server/wm/WindowToken;Landroid/view/DisplayInfo;Lcom/android/server/wm/DisplayFrames;Landroid/view/InsetsState;Landroid/content/res/Configuration;I)V
+PLcom/android/server/wm/WindowToken$FixedRotationTransformState;->resetTransform()V
+PLcom/android/server/wm/WindowToken$FixedRotationTransformState;->transform(Lcom/android/server/wm/WindowContainer;)V
 HSPLcom/android/server/wm/WindowToken;-><init>(Lcom/android/server/wm/WindowManagerService;Landroid/os/IBinder;IZLcom/android/server/wm/DisplayContent;Z)V
 HSPLcom/android/server/wm/WindowToken;-><init>(Lcom/android/server/wm/WindowManagerService;Landroid/os/IBinder;IZLcom/android/server/wm/DisplayContent;ZZ)V
 HPLcom/android/server/wm/WindowToken;-><init>(Lcom/android/server/wm/WindowManagerService;Landroid/os/IBinder;IZLcom/android/server/wm/DisplayContent;ZZZ)V
 HSPLcom/android/server/wm/WindowToken;->addWindow(Lcom/android/server/wm/WindowState;)V
 HPLcom/android/server/wm/WindowToken;->adjustWindowParams(Lcom/android/server/wm/WindowState;Landroid/view/WindowManager$LayoutParams;)V
+PLcom/android/server/wm/WindowToken;->applyFixedRotationTransform(Landroid/view/DisplayInfo;Lcom/android/server/wm/DisplayFrames;Landroid/content/res/Configuration;)V
 PLcom/android/server/wm/WindowToken;->applyFixedRotationTransform(Lcom/android/server/wm/WindowToken;)V
 HSPLcom/android/server/wm/WindowToken;->asActivityRecord()Lcom/android/server/wm/ActivityRecord;
 HSPLcom/android/server/wm/WindowToken;->assignLayer(Landroid/view/SurfaceControl$Transaction;I)V
 HPLcom/android/server/wm/WindowToken;->canLayerAboveSystemBars()Z
+PLcom/android/server/wm/WindowToken;->clearFixedRotationTransform(Ljava/lang/Runnable;)V
+HPLcom/android/server/wm/WindowToken;->createSurfaceControl(Z)V
 HPLcom/android/server/wm/WindowToken;->dump(Ljava/io/PrintWriter;Ljava/lang/String;Z)V
 HSPLcom/android/server/wm/WindowToken;->dumpDebug(Landroid/util/proto/ProtoOutputStream;JI)V
-PLcom/android/server/wm/WindowToken;->getFixedRotationTransformDisplayBounds()Landroid/graphics/Rect;
-PLcom/android/server/wm/WindowToken;->getFixedRotationTransformDisplayFrames()Lcom/android/server/wm/DisplayFrames;
-PLcom/android/server/wm/WindowToken;->getFixedRotationTransformDisplayInfo()Landroid/view/DisplayInfo;
+PLcom/android/server/wm/WindowToken;->finishFixedRotationTransform()V
+HPLcom/android/server/wm/WindowToken;->getFixedRotationTransformDisplayBounds()Landroid/graphics/Rect;
+HPLcom/android/server/wm/WindowToken;->getFixedRotationTransformDisplayFrames()Lcom/android/server/wm/DisplayFrames;
+HPLcom/android/server/wm/WindowToken;->getFixedRotationTransformDisplayInfo()Landroid/view/DisplayInfo;
 PLcom/android/server/wm/WindowToken;->getFixedRotationTransformInsetsState()Landroid/view/InsetsState;
 HSPLcom/android/server/wm/WindowToken;->getName()Ljava/lang/String;
+HPLcom/android/server/wm/WindowToken;->getProtoFieldId()J
 HSPLcom/android/server/wm/WindowToken;->getReplacingWindow()Lcom/android/server/wm/WindowState;
 HPLcom/android/server/wm/WindowToken;->getWindowLayerFromType()I
 PLcom/android/server/wm/WindowToken;->hasFixedRotationTransform()Z
 HPLcom/android/server/wm/WindowToken;->isEmpty()Z
+PLcom/android/server/wm/WindowToken;->isFinishingFixedRotationTransform()Z
 PLcom/android/server/wm/WindowToken;->isFirstChildWindowGreaterThanSecond(Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;)Z
 HSPLcom/android/server/wm/WindowToken;->isFixedRotationTransforming()Z
 HPLcom/android/server/wm/WindowToken;->lambda$new$0$WindowToken(Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;)I
@@ -43776,6 +47161,7 @@
 HPLcom/android/server/wm/WindowToken;->setExiting()V
 HSPLcom/android/server/wm/WindowToken;->toString()Ljava/lang/String;
 HSPLcom/android/server/wm/WindowToken;->updateSurfacePosition()V
+HPLcom/android/server/wm/WindowToken;->updateSurfacePosition(Landroid/view/SurfaceControl$Transaction;)V
 HPLcom/android/server/wm/WindowToken;->windowsCanBeWallpaperTarget()Z
 HSPLcom/android/server/wm/WindowTracing;-><init>(Ljava/io/File;Lcom/android/server/wm/WindowManagerService;Landroid/view/Choreographer;I)V
 HSPLcom/android/server/wm/WindowTracing;-><init>(Ljava/io/File;Lcom/android/server/wm/WindowManagerService;Landroid/view/Choreographer;Lcom/android/server/wm/WindowManagerGlobalLock;I)V
@@ -43816,6 +47202,7 @@
 HPLcom/android/server/wm/utils/RotationAnimationUtils;->getAvgBorderLuma(Landroid/graphics/GraphicBuffer;Landroid/graphics/ColorSpace;)F
 HPLcom/android/server/wm/utils/RotationAnimationUtils;->getLumaOfSurfaceControl(Landroid/view/Display;Landroid/view/SurfaceControl;)F
 HPLcom/android/server/wm/utils/RotationAnimationUtils;->getMedianBorderLuma(Landroid/graphics/GraphicBuffer;Landroid/graphics/ColorSpace;)F
+HPLcom/android/server/wm/utils/RotationAnimationUtils;->getPixelLuminance(Ljava/nio/ByteBuffer;IIII)F
 HSPLcom/android/server/wm/utils/RotationCache;-><init>(Lcom/android/server/wm/utils/RotationCache$RotationDependentComputation;)V
 HSPLcom/android/server/wm/utils/RotationCache;->getOrCompute(Ljava/lang/Object;I)Ljava/lang/Object;
 HSPLcom/android/server/wm/utils/WmDisplayCutout;-><clinit>()V
@@ -43875,6 +47262,7 @@
 HSPLcom/google/android/startop/iorap/EventSequenceValidator;-><init>()V
 HPLcom/google/android/startop/iorap/EventSequenceValidator;->decAccIntentStartedEvents()V
 HPLcom/google/android/startop/iorap/EventSequenceValidator;->incAccIntentStartedEvents()V
+HPLcom/google/android/startop/iorap/EventSequenceValidator;->logWarningWithStackTrace(Ljava/lang/String;)V
 HSPLcom/google/android/startop/iorap/EventSequenceValidator;->onActivityLaunchCancelled([B)V
 HPLcom/google/android/startop/iorap/EventSequenceValidator;->onActivityLaunchFinished([BJ)V
 HSPLcom/google/android/startop/iorap/EventSequenceValidator;->onActivityLaunched([BI)V
@@ -43907,7 +47295,7 @@
 HSPLcom/google/android/startop/iorap/IorapForwardingService$AppLaunchObserver;->onIntentStarted(Landroid/content/Intent;J)V
 PLcom/google/android/startop/iorap/IorapForwardingService$AppLaunchObserver;->onReportFullyDrawn([BJ)V
 HSPLcom/google/android/startop/iorap/IorapForwardingService$BinderConnectionHandler;-><init>(Lcom/google/android/startop/iorap/IorapForwardingService;Landroid/os/Looper;)V
-PLcom/google/android/startop/iorap/IorapForwardingService$BinderConnectionHandler;->handleMessage(Landroid/os/Message;)V
+HSPLcom/google/android/startop/iorap/IorapForwardingService$BinderConnectionHandler;->handleMessage(Landroid/os/Message;)V
 PLcom/google/android/startop/iorap/IorapForwardingService$IorapdJobService;-><init>(Lcom/google/android/startop/iorap/IorapForwardingService;Landroid/content/Context;)V
 PLcom/google/android/startop/iorap/IorapForwardingService$IorapdJobService;->bindProxy(Lcom/google/android/startop/iorap/IorapForwardingService$IorapdJobServiceProxy;)V
 PLcom/google/android/startop/iorap/IorapForwardingService$IorapdJobService;->lambda$onStartJob$0(Lcom/google/android/startop/iorap/RequestId;Landroid/app/job/JobParameters;Lcom/google/android/startop/iorap/IIorap;)V
@@ -43926,7 +47314,7 @@
 PLcom/google/android/startop/iorap/IorapForwardingService$RemoteTaskListener;->onProgress(Lcom/google/android/startop/iorap/RequestId;Lcom/google/android/startop/iorap/TaskResult;)V
 HSPLcom/google/android/startop/iorap/IorapForwardingService;-><clinit>()V
 HSPLcom/google/android/startop/iorap/IorapForwardingService;-><init>(Landroid/content/Context;)V
-PLcom/google/android/startop/iorap/IorapForwardingService;->access$000(Lcom/google/android/startop/iorap/IorapForwardingService;I)Z
+HSPLcom/google/android/startop/iorap/IorapForwardingService;->access$000(Lcom/google/android/startop/iorap/IorapForwardingService;I)Z
 PLcom/google/android/startop/iorap/IorapForwardingService;->access$100(Lcom/google/android/startop/iorap/IorapForwardingService;)Lcom/google/android/startop/iorap/IorapForwardingService$IorapdJobService;
 HSPLcom/google/android/startop/iorap/IorapForwardingService;->access$300(Lcom/google/android/startop/iorap/IorapForwardingService;)Lcom/google/android/startop/iorap/IIorap;
 HSPLcom/google/android/startop/iorap/IorapForwardingService;->access$400(Lcom/google/android/startop/iorap/IIorap;Lcom/google/android/startop/iorap/IorapForwardingService$RemoteRunnable;)Z
@@ -44121,6 +47509,7 @@
 Landroid/hidl/manager/V1_2/IClientCallback;
 Landroid/hidl/manager/V1_2/IServiceManager$Proxy;
 Landroid/hidl/manager/V1_2/IServiceManager;
+Landroid/media/ICaptureStateListener;
 Landroid/net/-$$Lambda$IpMemoryStore$LPW97BoNSL4rh_RVPiAHfCbmGHU;
 Landroid/net/-$$Lambda$IpMemoryStore$pFctTFAvh_Nxb_aTb0gjNsixGeM;
 Landroid/net/-$$Lambda$IpMemoryStoreClient$284VFgqq7BBkkwVNFLIrF3c59Es;
@@ -44164,6 +47553,8 @@
 Landroid/net/INetworkStackConnector$Stub;
 Landroid/net/INetworkStackConnector;
 Landroid/net/ITetheringConnector;
+Landroid/net/InformationElementParcelable$1;
+Landroid/net/InformationElementParcelable;
 Landroid/net/InterfaceConfigurationParcel$1;
 Landroid/net/InterfaceConfigurationParcel;
 Landroid/net/IpMemoryStore$1;
@@ -44174,6 +47565,7 @@
 Landroid/net/MarkMaskParcel;
 Landroid/net/NattKeepalivePacketDataParcelable$1;
 Landroid/net/NattKeepalivePacketDataParcelable;
+Landroid/net/NetworkFactory;
 Landroid/net/NetworkMonitorManager;
 Landroid/net/NetworkStackClient$1;
 Landroid/net/NetworkStackClient$Dependencies;
@@ -44188,6 +47580,8 @@
 Landroid/net/ResolverParamsParcel$1;
 Landroid/net/ResolverParamsParcel;
 Landroid/net/RouteInfoParcel;
+Landroid/net/ScanResultInfoParcelable$1;
+Landroid/net/ScanResultInfoParcelable;
 Landroid/net/TcpKeepalivePacketData;
 Landroid/net/TcpKeepalivePacketDataParcelable;
 Landroid/net/TetherConfigParcel;
@@ -44231,6 +47625,7 @@
 Landroid/net/netlink/NetlinkMessage;
 Landroid/net/shared/-$$Lambda$OsobWheG5dMvEj_cOJtueqUBqBI;
 Landroid/net/shared/-$$Lambda$SYWvjOUPlAZ_O2Z6yfFU9np1858;
+Landroid/net/shared/-$$Lambda$qVdKXOBVced7rdGB-dMQlkPbLW4;
 Landroid/net/shared/InitialConfiguration;
 Landroid/net/shared/IpConfigurationParcelableUtil;
 Landroid/net/shared/LinkPropertiesParcelableUtil;
@@ -44381,15 +47776,22 @@
 Lcom/android/server/-$$Lambda$PackageWatchdog$07YAng9lcuyRJuBYy9Jk3p2pWVY;
 Lcom/android/server/-$$Lambda$PackageWatchdog$9whbrgN2UsbVDUUSdkrctYqoh5M;
 Lcom/android/server/-$$Lambda$PackageWatchdog$CQuOnXthwwBaxcS5WoAlJJAz8Tk;
+Lcom/android/server/-$$Lambda$PackageWatchdog$GB6yAhRLhCGS-ufDzSN8j7GHmGo;
 Lcom/android/server/-$$Lambda$PackageWatchdog$Q0WI2EJpRFO1jF_7_YDaj1eGHas;
 Lcom/android/server/-$$Lambda$PackageWatchdog$VAW1s9zLN90OWS2gosDw9xdVjr8;
+Lcom/android/server/-$$Lambda$PackageWatchdog$Ya4lYGbdDy3Dda20wvc2AHBqIMM;
+Lcom/android/server/-$$Lambda$PackageWatchdog$c6DeFAaAsEUAlPf0Sv5YyUydmCk;
 Lcom/android/server/-$$Lambda$PackageWatchdog$hFdPWF73rahpzi1hJ-d9hNfUNrY;
 Lcom/android/server/-$$Lambda$PackageWatchdog$ib8X74W4PjX4xo1uv-QgOpcuf4o;
+Lcom/android/server/-$$Lambda$PackageWatchdog$jINplDIdLxNaZiKt8dCCJn1Cx6c;
+Lcom/android/server/-$$Lambda$PackageWatchdog$l0t57Hik0VChZk77GfFE4tnfo0g;
 Lcom/android/server/-$$Lambda$PackageWatchdog$nOS9OaZO4hPsSe0I8skPT1UgQoo;
 Lcom/android/server/-$$Lambda$PackageWatchdog$oAoA92I4TtJeqztFu3XBOLEs7gE;
 Lcom/android/server/-$$Lambda$PackageWatchdog$pCeN8Lr1-8Uwvg-VmBTEDs1Ak0w;
+Lcom/android/server/-$$Lambda$PackageWatchdog$t3rKD-cTKjWjowHB0sDvYPa95Fc;
 Lcom/android/server/-$$Lambda$PackageWatchdog$uFI2R7Ip9Bh1wQPJqJ5H5A0soVU;
 Lcom/android/server/-$$Lambda$PackageWatchdog$vRKcIrucEj03dz6ypRVINZtns1s;
+Lcom/android/server/-$$Lambda$PackageWatchdog$wEbB54PjC3ae7wMN2BshwaF0OhE;
 Lcom/android/server/-$$Lambda$PersistentDataBlockService$EZl9OYaT2eNL7kfSr2nKUBjxidk;
 Lcom/android/server/-$$Lambda$PinnerService$3$3Ta6TX4Jq9YbpUYE5Y0r8Xt8rBw;
 Lcom/android/server/-$$Lambda$PinnerService$3$RQBbrt9b8esLBxJImxDgVTsP34I;
@@ -44657,6 +48059,7 @@
 Lcom/android/server/LooperStatsService$LooperShellCommand;
 Lcom/android/server/LooperStatsService$SettingsObserver;
 Lcom/android/server/LooperStatsService;
+Lcom/android/server/MemoryPressureUtil;
 Lcom/android/server/MmsServiceBroker$1;
 Lcom/android/server/MmsServiceBroker$2;
 Lcom/android/server/MmsServiceBroker$3;
@@ -44813,6 +48216,7 @@
 Lcom/android/server/TelephonyRegistry$1;
 Lcom/android/server/TelephonyRegistry$2;
 Lcom/android/server/TelephonyRegistry$3;
+Lcom/android/server/TelephonyRegistry$ConfigurationProvider;
 Lcom/android/server/TelephonyRegistry$Record;
 Lcom/android/server/TelephonyRegistry$TelephonyRegistryDeathRecipient;
 Lcom/android/server/TelephonyRegistry;
@@ -44838,6 +48242,7 @@
 Lcom/android/server/UiThread;
 Lcom/android/server/UpdateLockService$LockWatcher;
 Lcom/android/server/UpdateLockService;
+Lcom/android/server/UserspaceRebootLogger;
 Lcom/android/server/VibratorService$1;
 Lcom/android/server/VibratorService$2;
 Lcom/android/server/VibratorService$3;
@@ -45045,13 +48450,22 @@
 Lcom/android/server/accounts/TokenCache$TokenLruCache;
 Lcom/android/server/accounts/TokenCache$Value;
 Lcom/android/server/accounts/TokenCache;
+Lcom/android/server/adb/-$$Lambda$AdbService$AdbManagerInternalImpl$eYI_FNtHA7A5dnyLFnC4mhwBDEo;
+Lcom/android/server/adb/-$$Lambda$AdbService$AdbSettingsObserver$RoyT5Mqx9S17cRYS-VTdgg8I7zc;
+Lcom/android/server/adb/-$$Lambda$AdbService$AdbSettingsObserver$j80q7vJz3QArWlwXdP3SN7zmf1A;
+Lcom/android/server/adb/-$$Lambda$snZvZtOkSiN_ZXrW9Ua-AMDz9HU;
+Lcom/android/server/adb/AdbDebuggingManager$AdbConnectionInfo;
+Lcom/android/server/adb/AdbDebuggingManager$AdbConnectionPortListener;
 Lcom/android/server/adb/AdbDebuggingManager$AdbDebuggingHandler$1;
+Lcom/android/server/adb/AdbDebuggingManager$AdbDebuggingHandler$2;
 Lcom/android/server/adb/AdbDebuggingManager$AdbDebuggingHandler;
 Lcom/android/server/adb/AdbDebuggingManager$AdbDebuggingThread;
 Lcom/android/server/adb/AdbDebuggingManager$AdbKeyStore;
 Lcom/android/server/adb/AdbDebuggingManager$PairingThread;
+Lcom/android/server/adb/AdbDebuggingManager$PortListenerImpl;
 Lcom/android/server/adb/AdbDebuggingManager;
 Lcom/android/server/adb/AdbService$1;
+Lcom/android/server/adb/AdbService$AdbConnectionPortListener;
 Lcom/android/server/adb/AdbService$AdbHandler;
 Lcom/android/server/adb/AdbService$AdbManagerInternalImpl;
 Lcom/android/server/adb/AdbService$AdbSettingsObserver;
@@ -45121,6 +48535,7 @@
 Lcom/android/server/am/-$$Lambda$PersistentConnection$xTW-hnA2hSnEFuF87mUe85RYnfE;
 Lcom/android/server/am/-$$Lambda$ProcessList$-WIJmGtIk6c8jVr9HT6EdC2Qnzg;
 Lcom/android/server/am/-$$Lambda$ProcessList$hjUwwFAIhoht4KRKnKeUve_Kcto;
+Lcom/android/server/am/-$$Lambda$ProcessList$jjoaAPSQT_weAnGqu0R0SCcvKqw;
 Lcom/android/server/am/-$$Lambda$ProcessList$vtq7LF5jIHO4t5NE03c8g7BT7Jc;
 Lcom/android/server/am/-$$Lambda$ProcessRecord$1qn6-pj5yWgiSnKANZpVz3gwd30;
 Lcom/android/server/am/-$$Lambda$ProcessRecord$2DImTokd0AWNTECl3WgBxJkOOqs;
@@ -45158,6 +48573,9 @@
 Lcom/android/server/am/ActiveServices$3;
 Lcom/android/server/am/ActiveServices$4;
 Lcom/android/server/am/ActiveServices$ActiveForegroundApp;
+Lcom/android/server/am/ActiveServices$AppOpCallback$1;
+Lcom/android/server/am/ActiveServices$AppOpCallback$2;
+Lcom/android/server/am/ActiveServices$AppOpCallback;
 Lcom/android/server/am/ActiveServices$ForcedStandbyListener;
 Lcom/android/server/am/ActiveServices$ServiceDumper;
 Lcom/android/server/am/ActiveServices$ServiceLookupResult;
@@ -45232,6 +48650,7 @@
 Lcom/android/server/am/ActivityManagerShellCommand$2;
 Lcom/android/server/am/ActivityManagerShellCommand$IntentReceiver;
 Lcom/android/server/am/ActivityManagerShellCommand;
+Lcom/android/server/am/AnrHelper;
 Lcom/android/server/am/AppBindRecord;
 Lcom/android/server/am/AppCompactor$1;
 Lcom/android/server/am/AppCompactor$2;
@@ -45250,6 +48669,7 @@
 Lcom/android/server/am/AppExitInfoTracker$2;
 Lcom/android/server/am/AppExitInfoTracker$AppExitInfoContainer;
 Lcom/android/server/am/AppExitInfoTracker$AppExitInfoExternalSource;
+Lcom/android/server/am/AppExitInfoTracker$AppTraceRetriever;
 Lcom/android/server/am/AppExitInfoTracker$IsolatedUidRecords;
 Lcom/android/server/am/AppExitInfoTracker$KillHandler;
 Lcom/android/server/am/AppExitInfoTracker$LmkdKillListener;
@@ -45382,6 +48802,7 @@
 Lcom/android/server/am/UserController;
 Lcom/android/server/am/UserState$KeyEvictedCallback;
 Lcom/android/server/am/UserState;
+Lcom/android/server/am/UserSwitchingDialog$1;
 Lcom/android/server/am/UserSwitchingDialog;
 Lcom/android/server/appbinding/-$$Lambda$AppBindingService$C9KbqX5cmsR3luJhFKt2Gpj0uLc;
 Lcom/android/server/appbinding/-$$Lambda$AppBindingService$D_3boeCn8eAANOp2ZDk6OC2rNaI;
@@ -45426,9 +48847,11 @@
 Lcom/android/server/appop/AppOpsService$4;
 Lcom/android/server/appop/AppOpsService$5;
 Lcom/android/server/appop/AppOpsService$6;
+Lcom/android/server/appop/AppOpsService$8;
 Lcom/android/server/appop/AppOpsService$9;
 Lcom/android/server/appop/AppOpsService$ActiveCallback;
 Lcom/android/server/appop/AppOpsService$AppOpsManagerInternalImpl;
+Lcom/android/server/appop/AppOpsService$AttributedOp;
 Lcom/android/server/appop/AppOpsService$ChangeRec;
 Lcom/android/server/appop/AppOpsService$ClientRestrictionState;
 Lcom/android/server/appop/AppOpsService$ClientState;
@@ -45460,7 +48883,14 @@
 Lcom/android/server/appprediction/-$$Lambda$AppPredictionManagerService$PredictionManagerServiceStub$vSY20eQq5y5FXrxhhqOTcEmezTs;
 Lcom/android/server/appprediction/-$$Lambda$AppPredictionManagerService$PredictionManagerServiceStub$vWB3PdxOOvPr7p0_NmoqXeH8Ros;
 Lcom/android/server/appprediction/-$$Lambda$AppPredictionPerUserService$AppPredictionSessionInfo$LQ7iu1YPVHeNHnTTNfaw5e_68Z4;
+Lcom/android/server/appprediction/-$$Lambda$AppPredictionPerUserService$RCK9J9m8biTqRx8y1gTxgGKmKzQ;
+Lcom/android/server/appprediction/-$$Lambda$AppPredictionPerUserService$btX3WTDbAjwJIcfzJSydbcpQWp4;
+Lcom/android/server/appprediction/-$$Lambda$AppPredictionPerUserService$hIxY55-713pKM-HDkA5K_YGqSFg;
+Lcom/android/server/appprediction/-$$Lambda$AppPredictionPerUserService$oqptY32VI0KEa_puMq0WysdjStM;
 Lcom/android/server/appprediction/-$$Lambda$AppPredictionPerUserService$ot809pjFOVEJ6shAJalMZ9_QhCo;
+Lcom/android/server/appprediction/-$$Lambda$AppPredictionPerUserService$tttnO1OB1EjDA90qcrp178GjlPs;
+Lcom/android/server/appprediction/-$$Lambda$AppPredictionPerUserService$v7zo2hsRu873qxjO1iB_LLOf0s8;
+Lcom/android/server/appprediction/-$$Lambda$AppPredictionPerUserService$wBPAAKx3x_D9Gk2CZ1ESaD9wpZY;
 Lcom/android/server/appprediction/-$$Lambda$RemoteAppPredictionService$9DCowUTEF8fYuBlWGxOmP5hTAWA;
 Lcom/android/server/appprediction/-$$Lambda$RemoteAppPredictionService$Ikwq62LQ8mos7hCBmykUhqvUq2Y;
 Lcom/android/server/appprediction/-$$Lambda$RemoteAppPredictionService$UaZoW5Y9AD8L3ktnyw-25jtnxhA;
@@ -45520,8 +48950,10 @@
 Lcom/android/server/audio/-$$Lambda$AudioDeviceInventory$Kq15BolmuFXaWWabjDNQiScRxjo;
 Lcom/android/server/audio/-$$Lambda$AudioDeviceInventory$Nads7_S1eD53QDofbK9CuYO9Fok;
 Lcom/android/server/audio/-$$Lambda$AudioDeviceInventory$OBWGV1RNEso-eo8dzWjaFhEjC0A;
+Lcom/android/server/audio/-$$Lambda$AudioDeviceInventory$X6RLjT4CIM4r8i0wBWo1TE_1qak;
 Lcom/android/server/audio/-$$Lambda$AudioDeviceInventory$YxgcWZ4jspoxzltUgvW9l8k40io;
 Lcom/android/server/audio/-$$Lambda$AudioDeviceInventory$_CdHBhvBDErZWSm39GafCXJiOqQ;
+Lcom/android/server/audio/-$$Lambda$AudioDeviceInventory$rVjCbPoeHeOpk1Tf1e7TcZZH4rw;
 Lcom/android/server/audio/-$$Lambda$AudioService$eq0KnrBbF7KWNGmAJRjyeCTIdzQ;
 Lcom/android/server/audio/-$$Lambda$UV1wDVoVlbcxpr8zevj_aMFtUGw;
 Lcom/android/server/audio/AudioDeviceBroker$1;
@@ -45618,6 +49050,7 @@
 Lcom/android/server/autofill/-$$Lambda$Helper$laLKWmsGqkFIaRXW5rR6_s66Vsw;
 Lcom/android/server/autofill/-$$Lambda$Helper$nK3g_oXXf8NGajcUf0W5JsQzf3w;
 Lcom/android/server/autofill/-$$Lambda$Q-iZrXrDBZAnj-gnbNOhH00i8uU;
+Lcom/android/server/autofill/-$$Lambda$RemoteAugmentedAutofillService$-Icm1WEZLv2n19GTOHkDYaCS_Oc;
 Lcom/android/server/autofill/-$$Lambda$RemoteAugmentedAutofillService$06SvcwAr_tZDEPuK1BK6VWFA4mE;
 Lcom/android/server/autofill/-$$Lambda$RemoteAugmentedAutofillService$W6vVk8kBkoWieb1Jw-BucQNBDsM;
 Lcom/android/server/autofill/-$$Lambda$RemoteAugmentedAutofillService$W9MFEqI1G5VhYWyyGXoQi5u38XU;
@@ -45632,9 +49065,11 @@
 Lcom/android/server/autofill/-$$Lambda$RemoteFillService$adrL6UDQX3d0e-QQL11h9TWJcM4;
 Lcom/android/server/autofill/-$$Lambda$RemoteFillService$lQ9Txb0D49A09bfomYmOPhXTXRE;
 Lcom/android/server/autofill/-$$Lambda$RemoteInlineSuggestionRenderService$qkXs53uHunrqzogLSpFo1NOYNnw;
+Lcom/android/server/autofill/-$$Lambda$Session$0GS6sttVUDBqEERyy9UZSJ7uee4;
 Lcom/android/server/autofill/-$$Lambda$Session$Fs9zdJwELk-9rAM3RiY6AyBKswI;
 Lcom/android/server/autofill/-$$Lambda$Session$NtvZwhlT1c4eLjg2qI6EER2oCtY;
 Lcom/android/server/autofill/-$$Lambda$Session$cYu1t6lYVopApYW-vct82-7slZk;
+Lcom/android/server/autofill/-$$Lambda$Session$c_2SPX0muCe0vkZycSqBzBG3j9I;
 Lcom/android/server/autofill/-$$Lambda$Session$eVloK5PeyeuPZn1G52SC-fXIsjk;
 Lcom/android/server/autofill/-$$Lambda$Session$v6ZVyksJuHdWgJ1F8aoa_1LJWPo;
 Lcom/android/server/autofill/-$$Lambda$Session$vkywy7qU2iLN6RFRCSM48kEqmbQ;
@@ -45642,6 +49077,7 @@
 Lcom/android/server/autofill/-$$Lambda$Z6K-VL097A8ARGd4URY-lOvvM48;
 Lcom/android/server/autofill/-$$Lambda$knR7oLyPSG_CoFAxBA_nqSw3JBo;
 Lcom/android/server/autofill/-$$Lambda$sdnPz1IsKKVKSEXwI7z4h2-SxiM;
+Lcom/android/server/autofill/-$$Lambda$wyZXeMneEp2gtSDLwv1U30wtJnU;
 Lcom/android/server/autofill/AutofillManagerService$1;
 Lcom/android/server/autofill/AutofillManagerService$AugmentedAutofillState;
 Lcom/android/server/autofill/AutofillManagerService$AutoFillManagerServiceStub;
@@ -45662,7 +49098,9 @@
 Lcom/android/server/autofill/Helper;
 Lcom/android/server/autofill/InlineSuggestionFactory$InlineSuggestionUiCallback;
 Lcom/android/server/autofill/InlineSuggestionFactory;
+Lcom/android/server/autofill/InlineSuggestionSession$1;
 Lcom/android/server/autofill/InlineSuggestionSession$ImeResponse;
+Lcom/android/server/autofill/InlineSuggestionSession$ImeStatusListener;
 Lcom/android/server/autofill/InlineSuggestionSession$InlineSuggestionsRequestCallbackImpl;
 Lcom/android/server/autofill/InlineSuggestionSession;
 Lcom/android/server/autofill/RemoteAugmentedAutofillService$1$1;
@@ -46116,6 +49554,7 @@
 Lcom/android/server/connectivity/Vpn$VpnRunner;
 Lcom/android/server/connectivity/Vpn;
 Lcom/android/server/content/-$$Lambda$ContentService$5-BNVxd6JTWU9ogp3u-0kfiqgbI;
+Lcom/android/server/content/-$$Lambda$ContentService$ObserverCollector$U_N0n8bSqn83QF2baB67wvMEADg;
 Lcom/android/server/content/-$$Lambda$SyncManager$4nklbtZn-JuPLOkU32f34xZoiug;
 Lcom/android/server/content/-$$Lambda$SyncManager$68MEyNkTh36YmYoFlURJoRa_-cY;
 Lcom/android/server/content/-$$Lambda$SyncManager$6y-gkGdDn-rSLmR9G8Pz_n9zy2A;
@@ -46136,6 +49575,8 @@
 Lcom/android/server/content/ContentService$2;
 Lcom/android/server/content/ContentService$Lifecycle;
 Lcom/android/server/content/ContentService$ObserverCall;
+Lcom/android/server/content/ContentService$ObserverCollector$Key;
+Lcom/android/server/content/ContentService$ObserverCollector;
 Lcom/android/server/content/ContentService$ObserverNode$ObserverEntry;
 Lcom/android/server/content/ContentService$ObserverNode;
 Lcom/android/server/content/ContentService;
@@ -46238,6 +49679,7 @@
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$08tAXus2zREPLhPWSJJMbXKP4Sg;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$09_I4G_12aZDp0ahZnGtJryBYCg;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$0H5SdBGIQE77NlJ8chd0JlrtVZM;
+Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$0NGjMa7hJHujISQOD_pH8kTq6JI;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$0YdFTQIxrgxkEfzJdhGZzP5z4eM;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$0nS7EqUlxcoON_ZF5WsIciiV6f4;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$0xOTapp1kSvojAdqJGdavUtvjqU;
@@ -46278,6 +49720,7 @@
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$6K_0ypBXU-MxW25hBfVb_pa476Y;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$6PIUX0yt4TWM8XrZkDVo37n3skQ;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$6SGKr9VhDL9p5RwsHqFj4UpVZTQ;
+Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$6VeZWEdN1dyRdHEAUxfQP-WansI;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$6bRYy5LYRT2cwzrjgkdZcHBZJb0;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$6bgFhX4b-xoNuxSdFAd4tk1EzFE;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$6fSx-VvbGrQUHs8uDCponbuYWlE;
@@ -46299,6 +49742,8 @@
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$95bSRHpBf3i80qNV0pKAIklBD4s;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$9BBesRjvUOb0HylcboB6iBXa9rA;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$9H-OtiTr0pLXuE1px0lLrHWW2gg;
+Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$9NBgirlJS7nxqqsuv_1YJ8Y7m98;
+Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$9OlQvLYrhLnDEwdIfQUNbK4G5Kk;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$9R-Cd8_5zpYXgcD0dtPoPmXylac;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$9SJKQAytAssuizf9V09cQ9qSuUM;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$9VVtUb5jLgJSmFOsWJ9ANvL9Ep4;
@@ -46354,6 +49799,7 @@
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$HiDFwQ00KZn2k7XjSY2W4AemAmo;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$HnqfAGN_ZnO8rF2FVNW7FoAEMl4;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$HoakbJWSKTWNgXqp-KqZUDQ2v3M;
+Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$I2JVUrPjGJeIH9M5tFkFtORoZA0;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$IEMjUYhA0mP8sRicHJTUcSHklKI;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$IFjmfnHIk0cwZ4cu_jTHWTsMxfc;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$IH37q4aCcb7fKvN7WNz4-JFtN1M;
@@ -46375,6 +49821,7 @@
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$Jn1h0KwAOFO-2SLpickAr7b6UEI;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$JtphNR0tnaOuEEn0ikwSL9fXD1M;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$KGyh0GB6sRV8-ctFL89vVYZYwcg;
+Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$KHK1qaoqPOWDaYAcyuftrRCJUsU;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$KOycIT0DtH49A4P5XWP73pI0dj4;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$KVBXyPBBtnY04KgNMY8kTUc8TDM;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$KnolhWMYD7G9f7e3KfTxyhi7Xjg;
@@ -46386,6 +49833,7 @@
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$L0UrX9eXuPfnxY8pUss60yr6d3E;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$L1BjBKCM4PsL1cN_5wbAOuBRIk8;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$L3XzC2X57y8_uXrsW81Qk8KXQTA;
+Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$L726YSg1ctOhu8vS40p7mI29Hqw;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$LgaheO5I5mZ7xT2AeYYlkZKwrzU;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$LoHksgFKu14_Ln6PoeosRoDbwSw;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$LocalService$YxQa4ZcUPWKs76meOLw1c_tn1OU;
@@ -46403,9 +49851,11 @@
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$NQ8HQ2OEvYVwQcxv3HSGyE4pJg0;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$NV9-XJEdh3iVV_1FcyzVTLRWMMs;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$NZ0oxk-Ik8VTdLKIQsEmJ4u8ge4;
+Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$Nequbj6EwVoW8y_wmTthpD1fwY4;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$NktehNa2clM_QJShWPmssIgRpKs;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$Nu-f7ZVLk0_egJ3zAQpMMR_T5ZE;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$O7VBr2X2LTCZ2rClZ_UwgB-Qoa0;
+Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$O9Moi8sORA4geplcz5N36k_Djo8;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$OL2XWo5c7ghltPdi2SyRK5POm-4;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$OPWRB8NOzJI5iy7fnh0GBb93YAc;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$Ohf5PJQmXjsarWisPAuPB8WECX8;
@@ -46426,8 +49876,10 @@
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$QQFWZYAphnYjdI68Fks2LdFuAgo;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$QSJKFWOoJ7s5g0HLgGWDuDCNelU;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$QSZZ_1yoXc0KadPc27uY1ijTXpM;
+Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$QeuN0QspI6zzXRv-ZEqptxjR6bc;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$QifCEJbi3gYuH5MUDWZlPxWqsmQ;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$QrMlHNz0PC-Ctzh_dDzUj8g5xm0;
+Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$Qs_HIEUKv-t71wixXSU0Of8RNKE;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$R7jNGUHgN9uG5tT_PuItt7Vn00g;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$RGykSdYLlh5fe-bGtM_nZQjy8tA;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$RMYLQ6bxpyj9L88wy3v1nWqZ7Wg;
@@ -46438,6 +49890,7 @@
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$Rk6dbmkjZ2gQ7A2Eazn5ASwC3RU;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$Rt85y5wEY0DRLvRJ6XnzxsSF1eo;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$SSPIfQ_rRI3lQvEj0ACrAZaUe6g;
+Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$SsK3Zag7hhWHXlzNClBcOqbFDYM;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$SxNw2QtLreqUCvuB24woR-GjuMA;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$T-DYGQoYs3p1_NgKsVcKRX8fTnA;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$T4eSwgayOKOYwmmjCYnPFwO28Pw;
@@ -46452,6 +49905,7 @@
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$U68n4iP9YZvCi9l_w8clW0ezl0E;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$UGjCdSf2Rxgyqxv7KJhmrE1D48Y;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$UPnhCNO69TKnF1hSXENMzK_2NSQ;
+Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$UZjRYMPztw5R7HEv0d62H2OifHg;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$UZoVWdpJJZwABGNhZWHbxPIvMO4;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$Uaym30iZN9avnSffrQNzTzTWJi0;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$UzTmuq0qez09i7JAoEws-OmWvyE;
@@ -46459,9 +49913,11 @@
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$VDIwg4X1iKAqFvQldV7uz3FQETk;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$VTc8gcVJfS7i5Anv1t_8pKML5is;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$Vg0S0XWRLxc15dP0DNjWoFnOlo4;
+Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$VnVMpzZ38K9VY5q76LFE7Pg8Ojk;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$VqrEAorQ36H01_gtzS6luteYBs0;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$Vsgrnsu-JDIF867spjVbBkS6FtU;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$W--TL5Jqd40HLcEvbX-xfRTBXg4;
+Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$W0PqT_DujOnRfFtIRJT9BUc0AKo;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$WClCPAIaYC1HcqeEWjZ5mwt9QEY;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$WPoBmlz33wJKdfRNgazaVqch_RI;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$WYP5q_IBba00XZnGp257U-5v_qM;
@@ -46485,6 +49941,7 @@
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$Y60DjdFMzpV5YEEtub3axIwYGT4;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$YA4XK8CPWPIZ24OqYJwgVT_5HYs;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$YTkdlwrc6XAKuTn0p2mVi0oHrSM;
+Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$YUdRHstauCgFOjok0Bqvn4hAUiY;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$YZpznfYXsjCyvuZp0nh2o3O_kN8;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$Yha2g5948Y6-99_Zk6qnSQ08xaY;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$ZC4liKjHgFsuW2zQLFrbUmbNAao;
@@ -46536,6 +49993,7 @@
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$e2DzcGWRwnNdKo6blzNAob0HsSw;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$e3xcbpVR082uQMOIH1sFm-7ww_k;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$e7c2huGjk3obVFka43jMbcJT0E8;
+Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$eD2HDpBc-OGp1j6mPQwOljJf8zo;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$eJdCqp-IyLrDmjK1uT6yZqiejxI;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$eKrWywCP77ljwUZh-R1c8aoFHh4;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$eQ0RBaHhkOLVzMM_lnr1-BGJMV0;
@@ -46579,6 +50037,7 @@
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$j6r61e-hJc3TCg_zV4jTt3IZnPk;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$jDU7UhnyXuItN3e_DVSz6WUa7Qc;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$jO5ZWgZJNUQUnt-nqcwlfMcJ0pM;
+Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$jZJHZdHi2d2IGPmtF3qkyCAED30;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$ja_JdZk-BJUe5rbQuU_LxLblBfM;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$jgsUvRSr_6U0Lrv4PXbJtZQe_Mk;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$jk1zqsysE8fKSHngP11NBHDLVk8;
@@ -46596,6 +50055,7 @@
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$lxepyUaTh9HejBaF0nHpaiCx0_s;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$m2h-vVM6u7Yweb_QNLSUAbWduj8;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$m4rOeIPRBmiAyZePUlogYBlUqWg;
+Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$m7rLjOikh2mbiVKjWDn3GBpideo;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$mBXxcFZAZnjzw9sY7LWPSdbiolE;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$mB_dS0XKwfvdYuBifZkqJr3ZvWI;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$mBqOqsTnwflzQ2R1u3HUeMrbjVI;
@@ -46605,6 +50065,7 @@
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$mea0_-KQRdVOaJakQTwD6APi0GY;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$mkMQ9WtInWWL27eiU6IDs8Sol8Q;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$mkvkdiyEMl05tI1rw6O3HygvaRY;
+Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$mwB_cr6tzwviD1v06WbkopRquaI;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$mxnMynV7fO8Pt3nYwwCODWeOMC8;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$nBM3fQ_95BD262BpQ3v_i1LTo9o;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$nDo4MxovM0DSBzOVm-GzbztXFFU;
@@ -46615,6 +50076,7 @@
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$nkWVy9u7AzQNpu2s-LcA_ChoL_0;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$ntEsc6u7AnPDmT8-eKrNAgcP9-E;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$o8yCHGIwCRCQbFYZ0lEmBtEJxg0;
+Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$oLfRfy_OZS9YkdF7nu-kG1zUnKQ;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$oPL_fgeCfV3bjhOoeIBcgcoNzI4;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$o_H-PxZs9hbF8cnz9neG6sE06E8;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$p6M2CJuZlA3Rm0CLLTJMm5qd9vU;
@@ -46668,6 +50130,7 @@
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$ua0yrS5kFedpcAO57O20Vkmp_iU;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$ubKPRWVtvdZzQDW6CDEvggHJXRc;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$ufUhKIuf-ai14oI_NezHS9qCjh0;
+Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$uscGE01UNkxETEanV-Gb-ZwPjKI;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$v6Sf5hcqS7XBF5mvbFG4GLS_Hq8;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$vFs74BeiHI_1TW0yjvIUNhocv4w;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$vR-RWtti8ewEGuhsA0IoU86GAmo;
@@ -46691,9 +50154,11 @@
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$y1mmEY6CDw01OUVh1NYq1BVWf2A;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$y4TmIIzrIWhefGZSS0RoexHhlYw;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$yABzfxLSJsRtIg68zL1wRRuzKQI;
+Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$yHGh9AMijS2x8s0uNSRzcgzf08I;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$ySno4DrGDq1KjAoj9-Oin64pfm8;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$y_mls_R0U3Fi6kpHWXcMJhKYGP8;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$ylqQ-0_BWKf5SNKi5IEZksGSyuU;
+Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$yrfRAc2bMLk5BchlTNeyoNX-iCs;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$z9w-PqXATVne7zR3PADeRtW0jf4;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$zErhxcsyTkaK2GsPBoPqruFzweQ;
 Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$zHzqmkS8JoeSuppylsWsNuHcVLk;
@@ -46801,6 +50266,7 @@
 Lcom/android/server/display/DisplayDevice;
 Lcom/android/server/display/DisplayDeviceConfig;
 Lcom/android/server/display/DisplayDeviceInfo;
+Lcom/android/server/display/DisplayInfoProxy;
 Lcom/android/server/display/DisplayManagerService$1;
 Lcom/android/server/display/DisplayManagerService$AllowedDisplayModeObserver;
 Lcom/android/server/display/DisplayManagerService$BinderService;
@@ -46926,6 +50392,11 @@
 Lcom/android/server/display/whitebalance/DisplayWhiteBalanceSettings$DisplayWhiteBalanceSettingsHandler;
 Lcom/android/server/display/whitebalance/DisplayWhiteBalanceSettings;
 Lcom/android/server/display/whitebalance/DisplayWhiteBalanceThrottler;
+Lcom/android/server/dreams/-$$Lambda$DreamController$DreamRecord$RZAkATuUi2Nb2UNKTKrQg_Oz3Cw;
+Lcom/android/server/dreams/-$$Lambda$DreamController$DreamRecord$a6xKVQPRvHllqmi3b3aluvuTMEM;
+Lcom/android/server/dreams/-$$Lambda$DreamController$DreamRecord$dxWbx4rgpHpZ1Hx0p_kP0KmKxQk;
+Lcom/android/server/dreams/-$$Lambda$DreamController$MzWLPaVogrekgPcs4ryibDvi1xA;
+Lcom/android/server/dreams/-$$Lambda$DreamController$NsbIx0iECm45E_fdqE55LTS32LQ;
 Lcom/android/server/dreams/-$$Lambda$DreamManagerService$f7cEVKQvPKMm_Ir9dq0e6PSOkX8;
 Lcom/android/server/dreams/-$$Lambda$gXC4nM2f5GMCBX0ED45DCQQjqv0;
 Lcom/android/server/dreams/DreamController$1;
@@ -47110,6 +50581,7 @@
 Lcom/android/server/inputmethod/InputMethodManagerService$StartInputHistory$Entry;
 Lcom/android/server/inputmethod/InputMethodManagerService$StartInputHistory;
 Lcom/android/server/inputmethod/InputMethodManagerService$StartInputInfo;
+Lcom/android/server/inputmethod/InputMethodManagerService$UserSwitchHandlerTask;
 Lcom/android/server/inputmethod/InputMethodManagerService;
 Lcom/android/server/inputmethod/InputMethodSubtypeSwitchingController$1;
 Lcom/android/server/inputmethod/InputMethodSubtypeSwitchingController$ControllerImpl;
@@ -47281,6 +50753,7 @@
 Lcom/android/server/location/-$$Lambda$SettingsHelper$DVmNGa9ypltgL35WVwJuSTIxRS8;
 Lcom/android/server/location/-$$Lambda$SettingsHelper$Ez8giHaZAPYwS7zICeUtrlXPpBo;
 Lcom/android/server/location/-$$Lambda$_14QHG018Z6p13d3hzJuGTWnNeo;
+Lcom/android/server/location/-$$Lambda$emxC4DBjBtjrPCOadFmmcL-kgiw;
 Lcom/android/server/location/-$$Lambda$hUPZkLaip7KhcHlSjfSfX2fzk_I;
 Lcom/android/server/location/AbstractLocationProvider$1;
 Lcom/android/server/location/AbstractLocationProvider$InternalState;
@@ -47455,7 +50928,19 @@
 Lcom/android/server/location/gnss/-$$Lambda$WsssLeTVg_jaQ16K-SvqbRc0TV8;
 Lcom/android/server/location/gnss/-$$Lambda$hu439-4T6QBT8QyZnspMtXqICWs;
 Lcom/android/server/location/gnss/-$$Lambda$qoNbXUvSu3yuTPVXPUfZW_HDrTQ;
+Lcom/android/server/location/gnss/GnssAntennaInfoProvider;
+Lcom/android/server/location/gnss/GnssBatchingProvider;
+Lcom/android/server/location/gnss/GnssConfiguration;
+Lcom/android/server/location/gnss/GnssGeofenceProvider;
+Lcom/android/server/location/gnss/GnssLocationProvider;
 Lcom/android/server/location/gnss/GnssManagerService;
+Lcom/android/server/location/gnss/GnssMeasurementCorrectionsProvider;
+Lcom/android/server/location/gnss/GnssMeasurementsProvider;
+Lcom/android/server/location/gnss/GnssNavigationMessageProvider;
+Lcom/android/server/location/gnss/GnssNetworkConnectivityHandler;
+Lcom/android/server/location/gnss/GnssSatelliteBlacklistHelper$GnssSatelliteBlacklistCallback;
+Lcom/android/server/location/gnss/GnssVisibilityControl;
+Lcom/android/server/location/gnss/NtpTimeHelper$InjectNtpTimeCallback;
 Lcom/android/server/locksettings/-$$Lambda$LockSettingsService$25VQEBWGuGqdc4Xjn9m8HXt9ZTI;
 Lcom/android/server/locksettings/-$$Lambda$LockSettingsService$3iCV7W6YQrxOv5dDGr5Cx3toXr0;
 Lcom/android/server/locksettings/-$$Lambda$LockSettingsService$6ZJNEvi0AXsP3F_UD8F01RaIg3M;
@@ -47487,6 +50972,7 @@
 Lcom/android/server/locksettings/LockSettingsStorage$PersistentData;
 Lcom/android/server/locksettings/LockSettingsStorage;
 Lcom/android/server/locksettings/LockSettingsStrongAuth$1;
+Lcom/android/server/locksettings/LockSettingsStrongAuth$NonStrongBiometricIdleTimeoutAlarmListener;
 Lcom/android/server/locksettings/LockSettingsStrongAuth$StrongAuthTimeoutAlarmListener;
 Lcom/android/server/locksettings/LockSettingsStrongAuth;
 Lcom/android/server/locksettings/ManagedProfilePasswordCache;
@@ -47553,7 +51039,9 @@
 Lcom/android/server/media/-$$Lambda$MediaRouter2ServiceImpl$SDO87Krd1n1doHne7Euurb1tZWQ;
 Lcom/android/server/media/-$$Lambda$MediaRouter2ServiceImpl$UWIms6pHB4Lwnsbfj-b_9WI7INk;
 Lcom/android/server/media/-$$Lambda$MediaRouter2ServiceImpl$UserHandler$9sVKwFHJaVOpWt-fwbOrQeBJC6Y;
+Lcom/android/server/media/-$$Lambda$MediaRouter2ServiceImpl$UserHandler$pBXDXzrCaoR3Vqp98BYwg2JCXx8;
 Lcom/android/server/media/-$$Lambda$MediaRouter2ServiceImpl$UserHandler$pb5SX6gBlgZXLZp0t4uVjgjp3EE;
+Lcom/android/server/media/-$$Lambda$MediaRouter2ServiceImpl$UyhtmNkwYd0IQ4t6m6ItWaQAFKI;
 Lcom/android/server/media/-$$Lambda$MediaRouter2ServiceImpl$X4W6vrpULp0aMfJC9PBBz3m1MyM;
 Lcom/android/server/media/-$$Lambda$MediaRouter2ServiceImpl$XJkTc5hm1mMtQKQ92wWBqMIUe2M;
 Lcom/android/server/media/-$$Lambda$MediaRouter2ServiceImpl$aadBHil74jOePCRh7oROReTvBKI;
@@ -47563,6 +51051,8 @@
 Lcom/android/server/media/-$$Lambda$MediaRouter2ServiceImpl$xwrgJ0QIcy6O_xCDFBt_XQNI5DY;
 Lcom/android/server/media/-$$Lambda$MediaRouter2ServiceImpl$yPZ2ZN9TKRG_PR_HKi8QWy7YTV0;
 Lcom/android/server/media/-$$Lambda$MediaSessionService$za_9dlUSlnaiZw6eCdPVEZq0XLw;
+Lcom/android/server/media/-$$Lambda$SystemMediaRoute2Provider$1$ebcdsGsKcvePyBmWcsYxnmypK0U;
+Lcom/android/server/media/-$$Lambda$SystemMediaRoute2Provider$AB-PWlKU2NOApQQQov7CqgW5RnQ;
 Lcom/android/server/media/-$$Lambda$SystemMediaRoute2Provider$aOlVIsBkXTnw1voyl2-9vhrVhMY;
 Lcom/android/server/media/AudioPlayerStateMonitor$1;
 Lcom/android/server/media/AudioPlayerStateMonitor$AudioManagerPlaybackListener;
@@ -47673,9 +51163,11 @@
 Lcom/android/server/net/-$$Lambda$IpConfigStore$rFY3yG3j6RGRgrQey7yYfi0Yze0;
 Lcom/android/server/net/-$$Lambda$NetworkPolicyManagerService$HDTUqowtgL-W_V0Kq6psXLWC9ws;
 Lcom/android/server/net/-$$Lambda$NetworkPolicyManagerService$lv2qqWetKVoJzbe7z3LT5idTu54;
+Lcom/android/server/net/-$$Lambda$NetworkStatsService$-IJG-2djYyEsmGNuCKyh0LuHG28;
 Lcom/android/server/net/-$$Lambda$NetworkStatsService$InNd0bxX6ObmdmLP-_WGePLtUfE;
 Lcom/android/server/net/-$$Lambda$NetworkStatsService$KVH4Y9nH53_gEfrhunDFp_O6ExY;
 Lcom/android/server/net/-$$Lambda$NetworkStatsService$NetworkStatsManagerInternalImpl$5TwpV7cRVx_8Ch3sTJ1XxcGYaFo;
+Lcom/android/server/net/-$$Lambda$NetworkStatsService$NetworkStatsManagerInternalImpl$MWLBRMSsUTWVuMm3yJqH7bc-ZoI;
 Lcom/android/server/net/-$$Lambda$NetworkStatsService$rLCnfQluyJtbXZ2vSn6SQAdNPMc;
 Lcom/android/server/net/-$$Lambda$NetworkStatsService$xfTbcb80CcmFJlvul1xYQmewxlg;
 Lcom/android/server/net/DelayedDiskWrite$1;
@@ -47761,6 +51253,7 @@
 Lcom/android/server/net/watchlist/WatchlistReportDbHelper$AggregatedResult;
 Lcom/android/server/net/watchlist/WatchlistReportDbHelper;
 Lcom/android/server/net/watchlist/WatchlistSettings;
+Lcom/android/server/notification/-$$Lambda$NotificationHistoryDatabase$DOpPLk6FC4M8AMJ1FHTPtwlmVmQ;
 Lcom/android/server/notification/-$$Lambda$NotificationManagerService$1$xhbVsydQBNNW5m21WjLTPrHQojA;
 Lcom/android/server/notification/-$$Lambda$NotificationManagerService$10$BRIIoO5T43uig1Sv3P_yA2lc3LA;
 Lcom/android/server/notification/-$$Lambda$NotificationManagerService$11$JotEN8cxCghuwRUNQKNwudTtDmM;
@@ -47772,7 +51265,9 @@
 Lcom/android/server/notification/-$$Lambda$NotificationManagerService$15$wXaTmmz_lG6grUqU8upk0686eXA;
 Lcom/android/server/notification/-$$Lambda$NotificationManagerService$16$zTgrLv-fwhUBKBfo6G4cZaGAhWs;
 Lcom/android/server/notification/-$$Lambda$NotificationManagerService$1IFJYiXNBcQVsabIke0xY_TgCZI;
+Lcom/android/server/notification/-$$Lambda$NotificationManagerService$BDavS_Sg4m_dKO3ZgtuCsFeqqms;
 Lcom/android/server/notification/-$$Lambda$NotificationManagerService$CancelNotificationRunnable$1i8BOFS2Ap_BvazcwqssFxW6U1U;
+Lcom/android/server/notification/-$$Lambda$NotificationManagerService$NFdAeB-4Fj_ZP4GXkIVrEH_Cxj8;
 Lcom/android/server/notification/-$$Lambda$NotificationManagerService$NotificationAssistants$-frFvBh01OajP_vj8nGNvXvmX1Y;
 Lcom/android/server/notification/-$$Lambda$NotificationManagerService$NotificationAssistants$2uJN0X0VDgKmWRoJqYsux0bhlYo;
 Lcom/android/server/notification/-$$Lambda$NotificationManagerService$NotificationAssistants$3ktx5hfF9rabi25qaQLZ-YvqPO4;
@@ -47790,12 +51285,17 @@
 Lcom/android/server/notification/-$$Lambda$NotificationManagerService$NotificationListeners$Srt8NNqA1xJUAp_7nDU6CBZJm_0;
 Lcom/android/server/notification/-$$Lambda$NotificationManagerService$NotificationListeners$T5BM1IF40aMGtqZZRr6BWGjzNxA;
 Lcom/android/server/notification/-$$Lambda$NotificationManagerService$NotificationListeners$Uven29tL9-XX5tMiwAHBwNumQKc;
+Lcom/android/server/notification/-$$Lambda$NotificationManagerService$OZL_lzotNQk7U4Yu1gYgeIoj6do;
 Lcom/android/server/notification/-$$Lambda$NotificationManagerService$PostNotificationRunnable$9JuPmiaA-c5lGdegev6EaTigwWc;
 Lcom/android/server/notification/-$$Lambda$NotificationManagerService$msGTh8UV2euOI6xhjY-rx_tZTLM;
+Lcom/android/server/notification/-$$Lambda$NotificationManagerService$oBqbud98Vzd9hmZYK-pWIY4cBpI;
+Lcom/android/server/notification/-$$Lambda$NotificationManagerService$pydsjOZodJQYqLnk-bBKjwKfMTw;
 Lcom/android/server/notification/-$$Lambda$NotificationManagerService$qSGWKI1fXQ1cTJ2fD072f_33txY;
 Lcom/android/server/notification/-$$Lambda$NotificationManagerService$qbzDjihCkTumQH-EnAW4i5wobvM;
 Lcom/android/server/notification/-$$Lambda$NotificationRecord$XgkrZGcjOHPHem34oE9qLGy3siA;
 Lcom/android/server/notification/-$$Lambda$SnoozeHelper$333G5Hgba3G7RU9lYp0HmgKJBvA;
+Lcom/android/server/notification/-$$Lambda$SnoozeHelper$C_0X0DORXKfskVjWiTfpnyCI82U;
+Lcom/android/server/notification/-$$Lambda$SnoozeHelper$j9CMOic9PGs_JNf8sQeWp_WInBo;
 Lcom/android/server/notification/-$$Lambda$SnoozeHelper$uY_yjjODxoDQVadkBTGNFqh7pco;
 Lcom/android/server/notification/-$$Lambda$V4J7df5A6vhSIuw7Ym9xgkfahto;
 Lcom/android/server/notification/AlertRateLimiter;
@@ -47831,15 +51331,24 @@
 Lcom/android/server/notification/ManagedServices;
 Lcom/android/server/notification/NotificationAdjustmentExtractor;
 Lcom/android/server/notification/NotificationChannelExtractor;
+Lcom/android/server/notification/NotificationChannelLogger$NotificationChannelEvent;
+Lcom/android/server/notification/NotificationChannelLogger;
+Lcom/android/server/notification/NotificationChannelLoggerImpl;
 Lcom/android/server/notification/NotificationComparator$1;
 Lcom/android/server/notification/NotificationComparator;
 Lcom/android/server/notification/NotificationDelegate;
+Lcom/android/server/notification/NotificationHistoryDatabase$1;
 Lcom/android/server/notification/NotificationHistoryDatabase$FileAttrProvider;
 Lcom/android/server/notification/NotificationHistoryDatabase$NotificationHistoryFileAttrProvider;
+Lcom/android/server/notification/NotificationHistoryDatabase$RemoveConversationRunnable;
+Lcom/android/server/notification/NotificationHistoryDatabase$WriteBufferRunnable;
 Lcom/android/server/notification/NotificationHistoryDatabase;
 Lcom/android/server/notification/NotificationHistoryDatabaseFactory;
+Lcom/android/server/notification/NotificationHistoryFilter$Builder;
+Lcom/android/server/notification/NotificationHistoryFilter;
 Lcom/android/server/notification/NotificationHistoryManager$SettingsObserver;
 Lcom/android/server/notification/NotificationHistoryManager;
+Lcom/android/server/notification/NotificationHistoryProtoHelper;
 Lcom/android/server/notification/NotificationIntrusivenessExtractor$1;
 Lcom/android/server/notification/NotificationIntrusivenessExtractor;
 Lcom/android/server/notification/NotificationManagerInternal;
@@ -47891,6 +51400,7 @@
 Lcom/android/server/notification/NotificationRecord$Light;
 Lcom/android/server/notification/NotificationRecord;
 Lcom/android/server/notification/NotificationRecordLogger$NotificationCancelledEvent;
+Lcom/android/server/notification/NotificationRecordLogger$NotificationEvent;
 Lcom/android/server/notification/NotificationRecordLogger$NotificationRecordPair;
 Lcom/android/server/notification/NotificationRecordLogger$NotificationReportedEvent;
 Lcom/android/server/notification/NotificationRecordLogger$NotificationReportedEvents;
@@ -47920,6 +51430,7 @@
 Lcom/android/server/notification/RateEstimator;
 Lcom/android/server/notification/ScheduleConditionProvider$1;
 Lcom/android/server/notification/ScheduleConditionProvider;
+Lcom/android/server/notification/ShortcutHelper$ShortcutListener;
 Lcom/android/server/notification/SnoozeHelper$1;
 Lcom/android/server/notification/SnoozeHelper$Callback;
 Lcom/android/server/notification/SnoozeHelper$Inserter;
@@ -48023,17 +51534,25 @@
 Lcom/android/server/people/PeopleService;
 Lcom/android/server/people/PeopleServiceInternal;
 Lcom/android/server/people/SessionInfo;
+Lcom/android/server/people/data/-$$Lambda$DataMaintenanceService$pZUzfdXzCXsv1D-xTvqArhV-TxI;
 Lcom/android/server/people/data/-$$Lambda$DataManager$CallLogContentObserver$F795P2fXEZGvzLUih_SIpFcsyic;
 Lcom/android/server/people/data/-$$Lambda$DataManager$ContactsContentObserver$wv19gIIQIhM79fILSTcdGXPmrF0;
 Lcom/android/server/people/data/-$$Lambda$DataManager$MmsSmsContentObserver$UfeTRftTDIcNo1iUJLeOD5s_XmM;
+Lcom/android/server/people/data/-$$Lambda$DataManager$ShortcutServiceCallback$8w0TVgeTeC6l6Xt-U6TR1dPrdZ8;
+Lcom/android/server/people/data/-$$Lambda$DataManager$ShortcutServiceCallback$VlSKlwPMxQPMmAu4nKkqwOu9-pY;
 Lcom/android/server/people/data/-$$Lambda$DataManager$ShortcutServiceListener$emB0GKXSexwJTzSWLUKYnAGbCCg;
+Lcom/android/server/people/data/-$$Lambda$DataManager$ShutdownBroadcastReceiver$n_Xz0m6xk7HVlBPvkKsX5WPC4AE;
 Lcom/android/server/people/data/-$$Lambda$DataManager$UsageStatsQueryRunnable$XYAxcpC9us0TDcNCO-NIcs5ajqQ;
+Lcom/android/server/people/data/-$$Lambda$UserData$TPSEt8UEq8YfkquaYQxcUwkYOog;
+Lcom/android/server/people/data/-$$Lambda$UserData$ZvGOO47u-RNbT2ZvsBaz0srnAjw;
 Lcom/android/server/people/data/-$$Lambda$bkfsFF2Vc2A9q-5JeJQbUu98BkQ;
+Lcom/android/server/people/data/-$$Lambda$k1LMnpJLlrYtcSsQvSbPW-daMgg;
 Lcom/android/server/people/data/CallLogQueryHelper;
 Lcom/android/server/people/data/ContactsQueryHelper;
 Lcom/android/server/people/data/ConversationInfo$Builder;
 Lcom/android/server/people/data/ConversationInfo;
 Lcom/android/server/people/data/ConversationStore;
+Lcom/android/server/people/data/DataMaintenanceService;
 Lcom/android/server/people/data/DataManager$1;
 Lcom/android/server/people/data/DataManager$CallLogContentObserver;
 Lcom/android/server/people/data/DataManager$ContactsContentObserver$ConversationSelector;
@@ -48042,6 +51561,8 @@
 Lcom/android/server/people/data/DataManager$MmsSmsContentObserver;
 Lcom/android/server/people/data/DataManager$NotificationListener;
 Lcom/android/server/people/data/DataManager$PerUserBroadcastReceiver;
+Lcom/android/server/people/data/DataManager$PerUserPackageMonitor;
+Lcom/android/server/people/data/DataManager$ShortcutServiceCallback;
 Lcom/android/server/people/data/DataManager$ShortcutServiceListener;
 Lcom/android/server/people/data/DataManager$ShutdownBroadcastReceiver;
 Lcom/android/server/people/data/DataManager$UsageStatsQueryRunnable;
@@ -48072,11 +51593,14 @@
 Lcom/android/server/pm/-$$Lambda$BackgroundDexOptService$TAsfDUuoxt92xKFoSCfpMUmY2Es;
 Lcom/android/server/pm/-$$Lambda$CFSsMipQUq5_2T1_SDplRJCGzsQ;
 Lcom/android/server/pm/-$$Lambda$ComponentResolver$PuHbZd5KEOMGjkH8xDOhOwfLtC0;
+Lcom/android/server/pm/-$$Lambda$CrossProfileAppsServiceImpl$-BT6ToCKHdhfX2-IK4pp-hGipzw;
 Lcom/android/server/pm/-$$Lambda$CrossProfileAppsServiceImpl$4kTzFa_zjeGMtJVy5CluIOehAmM;
 Lcom/android/server/pm/-$$Lambda$CrossProfileAppsServiceImpl$D4Z_0MUKQxAr3kDglyup8aB9XLE;
 Lcom/android/server/pm/-$$Lambda$CrossProfileAppsServiceImpl$DxhjfM3U9U3V3tJbzSWj7AMLCBE;
 Lcom/android/server/pm/-$$Lambda$CrossProfileAppsServiceImpl$HVfTkMl1ZNC9cAfi1atsp3Dwnyg;
 Lcom/android/server/pm/-$$Lambda$CrossProfileAppsServiceImpl$bl8duoKAQm4-uSci6ZlA_aEdeg8;
+Lcom/android/server/pm/-$$Lambda$CrossProfileAppsServiceImpl$i8pCn3vFy03m7u0vRgPEFDJBRZ8;
+Lcom/android/server/pm/-$$Lambda$CrossProfileAppsServiceImpl$kHkdp7f4qbaDOgRXrN-WS0lCU9U;
 Lcom/android/server/pm/-$$Lambda$CrossProfileAppsServiceImpl$wMVevLD4FZ1cL73xmtbSkTJK9d8;
 Lcom/android/server/pm/-$$Lambda$DpkuTFpeWPmvN7iGgFrn8VkMVd4;
 Lcom/android/server/pm/-$$Lambda$EvXtX9FEb_c87yAlCmxSfLtExqQ;
@@ -48086,11 +51610,13 @@
 Lcom/android/server/pm/-$$Lambda$InstantAppRegistry$R7XSXckXZJx-7zO-lFkgYY_-lWA;
 Lcom/android/server/pm/-$$Lambda$InstantAppRegistry$UOn4sUy4zBQuofxUbY8RBYhkNSE;
 Lcom/android/server/pm/-$$Lambda$InstantAppRegistry$eaYsiecM_Rq6dliDvliwVtj695o;
+Lcom/android/server/pm/-$$Lambda$InstantAppRegistry$vQALErHqrru44QoPQ2p9uk789PM;
 Lcom/android/server/pm/-$$Lambda$InstantAppResolverConnection$D-JKXi4qrYjnPQMOwj8UtfZenps;
 Lcom/android/server/pm/-$$Lambda$K2g8Oho05j5S7zVOkoQrHzM_Gig;
 Lcom/android/server/pm/-$$Lambda$LauncherAppsService$LauncherAppsImpl$MyPackageMonitor$eTair5Mvr14v4M0nq9aQEW2cp-Y;
 Lcom/android/server/pm/-$$Lambda$LauncherAppsService$LauncherAppsImpl$PR6SMHDNFTsnoL92MFZskM-zN8k;
 Lcom/android/server/pm/-$$Lambda$OtaDexoptService$sAE9PLBjWsXDVkiiC_uzr0kwQ4k;
+Lcom/android/server/pm/-$$Lambda$OtaDexoptService$wNGdc46oIfkEYBuaHKdweqCmNM8;
 Lcom/android/server/pm/-$$Lambda$PLzRNNUpYHZlGNIn1ofLtN374Ow;
 Lcom/android/server/pm/-$$Lambda$PackageInstallerService$vra5ZkE3juVvcgDBu5xv0wVzno8;
 Lcom/android/server/pm/-$$Lambda$PackageInstallerSession$0MwsfMSD_PrEtElmOWjbhM7455A;
@@ -48114,65 +51640,96 @@
 Lcom/android/server/pm/-$$Lambda$PackageInstallerSession$yEAIQbVnbSznJVW9xPXv9WGuzI0;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$-SI_LHw6Eiq8VNiFLLjJdCbGgSQ;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$0Regyd5pBrcIdGN2_jpl21L-KWw;
+Lcom/android/server/pm/-$$Lambda$PackageManagerService$0b6YXnOBfvNwViM66M0oCcnPhGA;
+Lcom/android/server/pm/-$$Lambda$PackageManagerService$1i6Y2tMn7ZgU3qq2Qyiz0czgU-g;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$2LJuxrdU5DWIRpDkTbzKA8U7iIc;
+Lcom/android/server/pm/-$$Lambda$PackageManagerService$33tR-KoAu3JbEdrD_OjcuA5085g;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$3TlqkUBuVM7NyAg7uqJCni92WOU;
+Lcom/android/server/pm/-$$Lambda$PackageManagerService$3pjiTV1Bh76zms1xuUJ7L0B2FjE;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$3yxDU_uSU2kkdLuKkfPYVKvXKGw;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$4cqrQoT4gMgFm-tugMOyoExM1kI;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$4lr9R3-Rfzq-VEptx-WWeRaSpd4;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$8L7pRmGgOsUHi0VNMkDwO-flFqk;
+Lcom/android/server/pm/-$$Lambda$PackageManagerService$93yWNMP-e7A0Of4Ed1fIXs63utE;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$9nrhpVUScjAieIxS9iHE0hiaATk;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$BzRujGrz-3iO1VZDBUuSaqm63Go;
+Lcom/android/server/pm/-$$Lambda$PackageManagerService$CRZ0_YFfOGli8g7Aeqx4ygsbzzI;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$DWomXCDpiVbZPOk7h4gWI0gNMDM;
+Lcom/android/server/pm/-$$Lambda$PackageManagerService$DgA5eAhvjiH6kMq2WYU8B282b-M;
+Lcom/android/server/pm/-$$Lambda$PackageManagerService$E8wmDWkS1hMFlGgjBX_cxNdNPXc;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$ECakc05vOVsUm8ydpi2Z-HghH4w;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$EQHzRzxse-rtXNIoVfzT15c8LHI;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$FFJwRezEfCP4utcPN2U9pjn2hIo;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$I5XLVROcF2w_-cucMNuicHY0H0k;
+Lcom/android/server/pm/-$$Lambda$PackageManagerService$IVwrF8dMtv5eEne1inTBiECMfDo;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$J0eEFDuLDZBCGkS0UBLQaQGBMN8;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$JQITabyRBc2Nst0hnvtDUIYPLkk;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$JqISwjRG4Nrwn7K19yITMU1WH5g;
+Lcom/android/server/pm/-$$Lambda$PackageManagerService$K2R-v7P-mvZZ2SUB2fHHIXl9Nl0;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$KUTG4a_t__F9-jF9uKK4m5M6ED0;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$Kv9_Hbk7M-eyDSHfPi1rrQzjiwc;
+Lcom/android/server/pm/-$$Lambda$PackageManagerService$MSgygX88nN74lIAMKJsoJwV24Uk;
+Lcom/android/server/pm/-$$Lambda$PackageManagerService$MT-9i21h4RNnCW49A_O4cxNuz38;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$Mtahsr42dH18eRuAJ0J6DzShLys;
+Lcom/android/server/pm/-$$Lambda$PackageManagerService$NOhDFtf63kwSrt001pe3Z5eI1EM;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$OchkDx-ijr5A5mGpkAil3XLu7Oo;
+Lcom/android/server/pm/-$$Lambda$PackageManagerService$PFgBCRniz8EdHVXcR_Rh-V6PzNk;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$PPALVjzIAqON2FdZv5soozZSLq8;
+Lcom/android/server/pm/-$$Lambda$PackageManagerService$PackageManagerInternalImpl$JycGJrzHIngCbGMk68UBYZqLVhg;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$PmwkzQu9rsYKerIyizl5HqTMOeY;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$PvuTB7Ihf5rmN0ByWpLv31cRa7s;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$QEXaCTQ54nCy5aHUAa6mkt0WtpM;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$QIOg9odF8NpVJsmgYMdGQy_GpvY;
+Lcom/android/server/pm/-$$Lambda$PackageManagerService$R17iAlCA5_t5NZESLr7grPghNAY;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$RfqRmQ8KNtYywzf-EIm7VG5PHj8;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$RoklvvEqbb0_WAziY4NuUNhrlUA;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$U47f17sf-Z0eef3W2xgzUB-ecR4;
+Lcom/android/server/pm/-$$Lambda$PackageManagerService$UmQDc8UZK0k1X1BVBYAHhv6arhU;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$UqTOzDNpKPiIlaG4_AUlesB9I1E;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$VINGOt0rwLOHiIrsYfMP2VPHvl0;
+Lcom/android/server/pm/-$$Lambda$PackageManagerService$VhwOGLTfcbsRPy0bHUi5hvqGFK8;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$WLKCxynYP-nOLQg-OBNNc1w2Z18;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$WXhCf3v80czwXbh17kimYOFhAFs;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$Wnf5zZuMJLUQ4GfjHtUww4l7YUg;
+Lcom/android/server/pm/-$$Lambda$PackageManagerService$WqnaImxAHe0cZI0VBes-1l9f79k;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$XBL5VfMu2aQcjyrc4spKskHsSJU;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$XrodqQtXF-63SFPD_WxRBB7sfa4;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$YHVD9fSfoszBkmlqzmswh1u_y_M;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$Ze0Xh0iBIll5jkJ4VcmUxBuZyI8;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$_CMCXnVAsgXUrfmWq_KOQ0-d17c;
+Lcom/android/server/pm/-$$Lambda$PackageManagerService$_QIa0JiksaMBecXbVJ_nhUm9TCg;
+Lcom/android/server/pm/-$$Lambda$PackageManagerService$a2nBt_d-Fl3XWRyGmFFAkIwtoN8;
+Lcom/android/server/pm/-$$Lambda$PackageManagerService$aRzP2fsa0-qTnX7YqSXYO-LAQxo;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$aXPYjiloRwQataUrx041SxBr5us;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$aptgkdXtM4g66mNvfWDFzI6FQyI;
+Lcom/android/server/pm/-$$Lambda$PackageManagerService$bqMDOmohGt4WlcPNXkrSJme7Kuw;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$cHQqBPj5vgOw-P7yhrKC9Ssq27g;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$ccz4PCOSG7fKRFBAMJv8GMQMI08;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$djQQrdclAlQ8ILip1OVPcBDTkW4;
+Lcom/android/server/pm/-$$Lambda$PackageManagerService$dxAUj27Y4Oe3hxwpfzBaLl3fLZw;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$eOXySdFQ-z888HMdYTDdDb8rYuQ;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$ey1rLNYtfJSvujRGt9gqdyMxIwI;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$f5l1_UOwACQPN6qixqBmzSJzDMw;
+Lcom/android/server/pm/-$$Lambda$PackageManagerService$fE8eCBaTSAgZj_6LiH49hRSUkhc;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$fQjXY6S0s38rWZ-Tv1PTQvrgJb4;
+Lcom/android/server/pm/-$$Lambda$PackageManagerService$fY_nnjN_Ni8wawWS9ezZts0lmmY;
+Lcom/android/server/pm/-$$Lambda$PackageManagerService$fatmYTvGk9iEyP6L-_SkYfjFJig;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$hLkpaH_y40nbOItNYjiR8EOZUgM;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$hlGRKJu3cTGpEnG-hyOT3QbrXxY;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$i2wY1QKIZAfMEAymOPPs8KS2G5c;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$i6CpetYRHYknkq8R3n1zFsH2Qng;
+Lcom/android/server/pm/-$$Lambda$PackageManagerService$iG1AbXebGMN1Zo55kCJGOu78HXE;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$imyTLGZ0HLyacORSu0iPTteivzY;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$iqEX-hdziBwn1njNVhAdQHeXwus;
+Lcom/android/server/pm/-$$Lambda$PackageManagerService$iz2vlJQDwixv3BxhvrGhNONDT48;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$kHFR9hPPJshGwQIlj0mPFAZIZSI;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$kUm15OrlWJD9K-LIlM_rBtX-g4Q;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$kdqJJNrm44ZfCpYgQsRrZy7nM38;
+Lcom/android/server/pm/-$$Lambda$PackageManagerService$lFji3mhAT5bVVke68kDxQSlmEs4;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$lMzdBb_uDjCHbhFoPJTxlDi_7zo;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$mozSqBaYzz4jQjwZjKIapdRXflc;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$ms4g2QGGQv1AIanhd1siLhoElkI;
+Lcom/android/server/pm/-$$Lambda$PackageManagerService$nY7r1WodM3_tntZA-G8DR9Rw1f0;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$pVdeIe13BPz2j1-uK6W_NugHu2Q;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$pzzC0ChZnM8yUb83hUS8pcZYU3A;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$qNpeCKStShTSYrHT0cclQGx1igI;
@@ -48181,27 +51738,41 @@
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$rJEHTCbZuliP-AofB7kQxwDOX4I;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$rLdmTQLwnuPeDuWTeDB-0S1Ku4I;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$rcVfdsXa_dlub2enxT5rL0nTx7I;
+Lcom/android/server/pm/-$$Lambda$PackageManagerService$slf4ap74wBjxrA52mf3aW1YqmdM;
+Lcom/android/server/pm/-$$Lambda$PackageManagerService$txzHud8DxAfBnzA16Cf-Mpca3TA;
+Lcom/android/server/pm/-$$Lambda$PackageManagerService$uKFiJiR-QQI8RsVT7igWuZ6FwAA;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$vPmwW10Lr1Zc8YoNadc7v4xmIWo;
+Lcom/android/server/pm/-$$Lambda$PackageManagerService$vjkkm7bIol6YmxXHA9bVeSUYkB8;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$vyKDCUt14soSFqmBBfd52n5w5qM;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$xKD6SB7pISjc29qfmXIq5O_3OJw;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$xZAAMOZCDrDe-FJUcRmxesa8h7c;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$xv5zSGDUCMQ_E6mH4qgdkiJ5XtA;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$xwqiJpXPI0dDAZ1z9noew-rHViA;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$yXdgY7SVZQWnWWIG0iO_OYKuh58;
+Lcom/android/server/pm/-$$Lambda$PackageManagerService$z8SNwemq3afWJgXWmkJMd3eb198;
 Lcom/android/server/pm/-$$Lambda$PackageManagerService$zCuBGosGB1OGJ7ya2EB4X5V2jBk;
+Lcom/android/server/pm/-$$Lambda$PackageManagerServiceUtils$-TyALUo9to-tSa8TowQ8FvHNb6w;
 Lcom/android/server/pm/-$$Lambda$PackageManagerServiceUtils$1RbkDa86pOg-5BavmgbPLLCoJCA;
+Lcom/android/server/pm/-$$Lambda$PackageManagerServiceUtils$6Hiu23bVWNI_UB8JjRQOmllFVE8;
+Lcom/android/server/pm/-$$Lambda$PackageManagerServiceUtils$CznOu58qzp1xBXuz65vwZNf-2YQ;
 Lcom/android/server/pm/-$$Lambda$PackageManagerServiceUtils$JqfeXEVVj9qyD-t5TtAWP5dUo_Q;
+Lcom/android/server/pm/-$$Lambda$PackageManagerServiceUtils$Nz561xT8r_YIT6_Lm5bJ67n8gRs;
 Lcom/android/server/pm/-$$Lambda$PackageManagerServiceUtils$RPtRdW9NvVYNz-tG18YC0n7VJp4;
 Lcom/android/server/pm/-$$Lambda$PackageManagerServiceUtils$WqWSiwN-039OE_mRd8x6F_ORqRU;
+Lcom/android/server/pm/-$$Lambda$PackageManagerServiceUtils$X1ShBJjcdw7NZGmmKd5HWXujgg8;
 Lcom/android/server/pm/-$$Lambda$PackageManagerServiceUtils$ZEbcK7yQgHqG-8Z65v9KNo4jBgU;
 Lcom/android/server/pm/-$$Lambda$PackageManagerServiceUtils$_LUs2lN_dtgmbhOTm2Ear0f91Qg;
 Lcom/android/server/pm/-$$Lambda$PackageManagerServiceUtils$eMhMS_ozPxLQedSFcYUWkqe3DH4;
+Lcom/android/server/pm/-$$Lambda$PackageManagerServiceUtils$kGgIy61AI0hVhikc5IBRoH-OqgM;
+Lcom/android/server/pm/-$$Lambda$PackageManagerServiceUtils$miSwAI7tlaWPbDunujMxV7oiAWA;
 Lcom/android/server/pm/-$$Lambda$PackageManagerServiceUtils$pak5uFueWVDXpeD0raY40AD6lPY;
 Lcom/android/server/pm/-$$Lambda$PackageManagerServiceUtils$qCP9hzvvo1JqZQ7mV-34TucIk2o;
+Lcom/android/server/pm/-$$Lambda$PackageManagerServiceUtils$sV6Dy76F46JIA9ovYV5QyhvLuQ4;
 Lcom/android/server/pm/-$$Lambda$PackageManagerShellCommand$-OZpz58K2HXVuHDuVYKnCu6oo4c;
 Lcom/android/server/pm/-$$Lambda$PackageManagerShellCommand$v3vXA2YvCwaE7J0QfR1IQ122iTI;
 Lcom/android/server/pm/-$$Lambda$ParallelPackageParser$FTtinPrp068lVeI7K6bC1tNE3iM;
 Lcom/android/server/pm/-$$Lambda$RIrciDUAm_lS8CbvRCW_P-ee_-4;
+Lcom/android/server/pm/-$$Lambda$S4BXTl5Ly3EHhXAReFCtlz2B8eo;
 Lcom/android/server/pm/-$$Lambda$ShortcutBitmapSaver$AUDgG57FGyGDUVDAjL-7cuiE0pM;
 Lcom/android/server/pm/-$$Lambda$ShortcutBitmapSaver$xgjvZfaiKXavxgGCSta_eIdVBnk;
 Lcom/android/server/pm/-$$Lambda$ShortcutDumpFiles$rwmVVp6PnQCcurF7D6VzrdNqEdk;
@@ -48210,13 +51781,18 @@
 Lcom/android/server/pm/-$$Lambda$ShortcutPackage$ZN-r6tS0M7WKGK6nbXyJZPwNRGc;
 Lcom/android/server/pm/-$$Lambda$ShortcutPackage$hEXnzlESoRjagj8Pd9f4PrqudKE;
 Lcom/android/server/pm/-$$Lambda$ShortcutPackage$ibOAVgfKWMZFYSeVV_hLNx6jogk;
+Lcom/android/server/pm/-$$Lambda$ShortcutService$1aV3EGXTRhUmEZRUSi2Bvf-7vLg;
 Lcom/android/server/pm/-$$Lambda$ShortcutService$2mjLrqafL_ZPftw5bIS-yyK7PxI;
 Lcom/android/server/pm/-$$Lambda$ShortcutService$3$WghiV-HLnzJqZabObC5uHCmb960;
 Lcom/android/server/pm/-$$Lambda$ShortcutService$3$n_VdEzyBcjs0pGZO8GnB0FoTgR0;
+Lcom/android/server/pm/-$$Lambda$ShortcutService$5odn6Gcj54kzvMMAMZDsQQdWFR8;
+Lcom/android/server/pm/-$$Lambda$ShortcutService$BgapJrdquo1OPe4VggDVe-adDMo;
+Lcom/android/server/pm/-$$Lambda$ShortcutService$C0yXUUdkpfa84Nq_Po6ovVJWCBk;
 Lcom/android/server/pm/-$$Lambda$ShortcutService$DzwraUeMWDwA0XDfFxd3sGOsA0E;
 Lcom/android/server/pm/-$$Lambda$ShortcutService$EE8aJ-V-lThNgd-x9utgJTk3K50;
 Lcom/android/server/pm/-$$Lambda$ShortcutService$H1HFyb1U9E1-y03suEsi37_w-t0;
 Lcom/android/server/pm/-$$Lambda$ShortcutService$HrjNihAM4odnSGPLxsJbI33JkwE;
+Lcom/android/server/pm/-$$Lambda$ShortcutService$K1vIRui5MsFaCf51e19YUNsWX6s;
 Lcom/android/server/pm/-$$Lambda$ShortcutService$KOp4rgvJPqXwR4WftrrGcjb2qMQ;
 Lcom/android/server/pm/-$$Lambda$ShortcutService$LocalService$OwXAUkceFTQAGpPzTbihl14wvP4;
 Lcom/android/server/pm/-$$Lambda$ShortcutService$LocalService$Q0t7aDuDFJ8HWAf1NHW1dGQjOf8;
@@ -48228,10 +51804,14 @@
 Lcom/android/server/pm/-$$Lambda$ShortcutService$NdP-8QRYjvDVSScw7cBKt85dbWQ;
 Lcom/android/server/pm/-$$Lambda$ShortcutService$Ot_p1CCuELDP1Emv4jTa8vvA09A;
 Lcom/android/server/pm/-$$Lambda$ShortcutService$QFWliMhWloedhnaZCwVKaqKPVb4;
+Lcom/android/server/pm/-$$Lambda$ShortcutService$Rg7gKlp8SUutZh8_-nc6k078-WI;
 Lcom/android/server/pm/-$$Lambda$ShortcutService$SjK_0i78sIpSTGJKpeLWOhhhsiA;
+Lcom/android/server/pm/-$$Lambda$ShortcutService$SyYIn2KaeBI9Z7tMjhNFrCoPb80;
 Lcom/android/server/pm/-$$Lambda$ShortcutService$TAtLoMHHFYLITi_4Sj-ZTHx6ELo;
 Lcom/android/server/pm/-$$Lambda$ShortcutService$TUT0CJsDhxqkpcseduaAriOs6bg;
 Lcom/android/server/pm/-$$Lambda$ShortcutService$TVqBA9DN_h90eIcwrnmy7Mkl6jo;
+Lcom/android/server/pm/-$$Lambda$ShortcutService$_1B1BDH9-mZvjKyf_4kfMdnC-Ck;
+Lcom/android/server/pm/-$$Lambda$ShortcutService$czpyyFh3OpxQSZgJ1UuQLPlktn8;
 Lcom/android/server/pm/-$$Lambda$ShortcutService$exGcjcSQADxpLL30XenIn9sDxlI;
 Lcom/android/server/pm/-$$Lambda$ShortcutService$fCl_JbVpr187Fh4_6N-IxgnU68c;
 Lcom/android/server/pm/-$$Lambda$ShortcutService$fqEqB5P0QHkQKJgSWuI8hNg-9pk;
@@ -48241,7 +51821,10 @@
 Lcom/android/server/pm/-$$Lambda$ShortcutService$lYluTnTRdTOcpwtJusvYEvlkMjQ;
 Lcom/android/server/pm/-$$Lambda$ShortcutService$nr2YpVwPOGGO8CME0IHeIUIo4yk;
 Lcom/android/server/pm/-$$Lambda$ShortcutService$oes_dY8CJz5MllJiOggarpV9YkA;
+Lcom/android/server/pm/-$$Lambda$ShortcutService$qG817DggcAqxEWpGr6GLuNf4LhM;
+Lcom/android/server/pm/-$$Lambda$ShortcutService$qZKocFWzizz4DG9R0afdFN-7cLQ;
 Lcom/android/server/pm/-$$Lambda$ShortcutService$s11VOofRVMGkuwyyqnMY7eAyb5k;
+Lcom/android/server/pm/-$$Lambda$ShortcutService$sroKL9nhBsFcNz88fW_woYg1gFA;
 Lcom/android/server/pm/-$$Lambda$ShortcutService$t1am7miIbc4iP6CfSL0gFgEsO0Y;
 Lcom/android/server/pm/-$$Lambda$ShortcutService$uvknhLDPo5JAtmXalM9P3rrx9e4;
 Lcom/android/server/pm/-$$Lambda$ShortcutService$vKI79Gf4pKq8ASWghBXV-NKhZwk;
@@ -48383,6 +51966,7 @@
 Lcom/android/server/pm/PackageKeySetData;
 Lcom/android/server/pm/PackageList;
 Lcom/android/server/pm/PackageManagerException;
+Lcom/android/server/pm/PackageManagerService$10;
 Lcom/android/server/pm/PackageManagerService$1;
 Lcom/android/server/pm/PackageManagerService$2;
 Lcom/android/server/pm/PackageManagerService$3;
@@ -48437,6 +52021,7 @@
 Lcom/android/server/pm/PackageManagerService$ScanResult;
 Lcom/android/server/pm/PackageManagerService$SystemDeleteException;
 Lcom/android/server/pm/PackageManagerService$SystemPartition;
+Lcom/android/server/pm/PackageManagerService$TestParams;
 Lcom/android/server/pm/PackageManagerService$VerificationInfo;
 Lcom/android/server/pm/PackageManagerService;
 Lcom/android/server/pm/PackageManagerServiceCompilerMapping;
@@ -48476,6 +52061,7 @@
 Lcom/android/server/pm/PreferredIntentResolver;
 Lcom/android/server/pm/ProcessLoggingHandler;
 Lcom/android/server/pm/ProtectedPackages;
+Lcom/android/server/pm/RestrictionsSet;
 Lcom/android/server/pm/SELinuxMMAC;
 Lcom/android/server/pm/SettingBase;
 Lcom/android/server/pm/Settings$1;
@@ -48566,16 +52152,22 @@
 Lcom/android/server/pm/dex/PackageDynamicCodeLoading$DynamicCodeFile;
 Lcom/android/server/pm/dex/PackageDynamicCodeLoading$PackageDynamicCode;
 Lcom/android/server/pm/dex/PackageDynamicCodeLoading;
+Lcom/android/server/pm/dex/SystemServerDexLoadReporter;
 Lcom/android/server/pm/dex/ViewCompiler;
 Lcom/android/server/pm/parsing/-$$Lambda$MsCTQbj1nCkHPuW2VX512f_ZKpg;
+Lcom/android/server/pm/parsing/-$$Lambda$PackageParser2$Svc6Ot6mP20gZxXqsV5RuSFu1Lk;
+Lcom/android/server/pm/parsing/-$$Lambda$PackageParser2$Z1LNA-uFIqWWTxexnRn70YNNhRw;
+Lcom/android/server/pm/parsing/-$$Lambda$PackageParser2$_jLfb1ehczUk0X2MUB2Q0T-RBTI;
 Lcom/android/server/pm/parsing/-$$Lambda$gLXiiRPkkfU6FsJxq4nR4nPlVSk;
 Lcom/android/server/pm/parsing/PackageCacher;
 Lcom/android/server/pm/parsing/PackageInfoUtils$CachedApplicationInfoGenerator;
 Lcom/android/server/pm/parsing/PackageInfoUtils;
+Lcom/android/server/pm/parsing/PackageParser2$1;
 Lcom/android/server/pm/parsing/PackageParser2$Callback;
 Lcom/android/server/pm/parsing/PackageParser2;
 Lcom/android/server/pm/parsing/library/AndroidHidlUpdater;
 Lcom/android/server/pm/parsing/library/AndroidTestBaseUpdater;
+Lcom/android/server/pm/parsing/library/ComGoogleAndroidMapsUpdater;
 Lcom/android/server/pm/parsing/library/OrgApacheHttpLegacyUpdater;
 Lcom/android/server/pm/parsing/library/PackageBackwardCompatibility$AndroidTestRunnerSplitUpdater;
 Lcom/android/server/pm/parsing/library/PackageBackwardCompatibility;
@@ -48597,21 +52189,28 @@
 Lcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$1$QSCLyelVDMHZe8LrlYhYvfz5G2c;
 Lcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$3_HObOA7SDQazRHAVI1qUUdGq_s;
 Lcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$5wIJaBo3ATYcr96ofI23sjuUqoA;
+Lcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$7UbsdDkY7eb6gD8CfMZMTcb6R5Y;
+Lcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$8MsCUqeSxDj-MAni8qzyAjlwj_8;
+Lcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$9BsOvIfsXOY41ZJQWdN0BGdfLqM;
 Lcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$BEPoV9HmbUN2-ZgCcIqC6xfzvew;
 Lcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$E0rM1FNIqzKUZzqphmkzeY3ZdTk;
 Lcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$JcWw5txStfnrnbvcFd2durv6YOo;
+Lcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$MRwpP9TcX_fEwjj-3Vp2CFidMPk;
 Lcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$NPd9St1HBvGAtg1uhMV2Upfww4g;
 Lcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$PermissionManagerServiceInternalImpl$u0m9fxQ1DzsHML4E-xlMAgH2gIE;
 Lcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$QU_UFF-9J77Mq118FLJUiLh4ARI;
 Lcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$T4uCZ9__oEXYpzLBYEW1T_BN3SU;
 Lcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$TCLcs8BgJvNr88B1R6pU9xRD-jw;
 Lcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$XgJON0nYdrr1Swr3OJklQ7xA-pU;
+Lcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$_Kakccz_-nomXOc_Nhv5q-uqA7I;
+Lcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$aIXU2FAf-w3mXwfYTcpUh_uCEqE;
 Lcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$aQWnOfCuKK-rSxzDPI_dUOtzv8I;
 Lcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$eApyRxwI3JHTSVAxV9EbP43gFOo;
 Lcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$g9Bo5gFpLYyPOsp3K8Aik5xseDI;
 Lcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$igfYI7thImnYrDxs3qWtqs2SCRk;
 Lcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$iwnRBDwjg4K5iRGbRU5_sVt0zaU;
 Lcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$oG7YD8MVgcqcPbx_HXQ04PEUOXM;
+Lcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$tAcOXvvLnf8YMDota79zZypUyds;
 Lcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$vxr3T148I1WcHTp-Fe7nK-xkT-E;
 Lcom/android/server/pm/permission/-$$Lambda$oynlBn0BbcU0KODvfUDDUHb5LKY;
 Lcom/android/server/pm/permission/BasePermission;
@@ -48622,6 +52221,7 @@
 Lcom/android/server/pm/permission/OneTimePermissionUserManager;
 Lcom/android/server/pm/permission/PermissionManagerService$1;
 Lcom/android/server/pm/permission/PermissionManagerService$2;
+Lcom/android/server/pm/permission/PermissionManagerService$Injector;
 Lcom/android/server/pm/permission/PermissionManagerService$OnPermissionChangeListeners;
 Lcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl;
 Lcom/android/server/pm/permission/PermissionManagerService;
@@ -48749,6 +52349,7 @@
 Lcom/android/server/power/-$$Lambda$ThermalManagerService$ThermalHal20Wrapper$dRsq86SXVH7z342fbs2U36cr67I;
 Lcom/android/server/power/-$$Lambda$ThermalManagerService$ZPQKzo9ZjU-hL4QYH693hWuTqjk;
 Lcom/android/server/power/-$$Lambda$ThermalManagerService$x5obtNvJKZxnpguOiQsFBDmBZ4k;
+Lcom/android/server/power/-$$Lambda$mJs78oyYBMDErllGe4sx87OZns8;
 Lcom/android/server/power/AmbientDisplaySuppressionController;
 Lcom/android/server/power/AttentionDetector$1;
 Lcom/android/server/power/AttentionDetector$AttentionCallbackInternalImpl;
@@ -48770,6 +52371,7 @@
 Lcom/android/server/power/PowerManagerService$4;
 Lcom/android/server/power/PowerManagerService$BatteryReceiver;
 Lcom/android/server/power/PowerManagerService$BinderService;
+Lcom/android/server/power/PowerManagerService$Clock;
 Lcom/android/server/power/PowerManagerService$Constants;
 Lcom/android/server/power/PowerManagerService$DockReceiver;
 Lcom/android/server/power/PowerManagerService$DreamReceiver;
@@ -48779,6 +52381,7 @@
 Lcom/android/server/power/PowerManagerService$LocalService;
 Lcom/android/server/power/PowerManagerService$NativeWrapper;
 Lcom/android/server/power/PowerManagerService$PowerManagerHandler;
+Lcom/android/server/power/PowerManagerService$PowerManagerHandlerCallback;
 Lcom/android/server/power/PowerManagerService$ProfilePowerState;
 Lcom/android/server/power/PowerManagerService$SettingsObserver;
 Lcom/android/server/power/PowerManagerService$SuspendBlockerImpl;
@@ -48874,6 +52477,7 @@
 Lcom/android/server/print/PrintShellCommand;
 Lcom/android/server/print/RemotePrintService$4;
 Lcom/android/server/print/RemotePrintService$6;
+Lcom/android/server/print/RemotePrintService$9;
 Lcom/android/server/print/RemotePrintService$PrintServiceCallbacks;
 Lcom/android/server/print/RemotePrintService$RemotePrintServiceClient;
 Lcom/android/server/print/RemotePrintService$RemoteServiceConneciton;
@@ -48958,6 +52562,7 @@
 Lcom/android/server/role/RoleUserState;
 Lcom/android/server/rollback/-$$Lambda$Rollback$EvT1BaUrjWsJaVTizSu77MCfRBs;
 Lcom/android/server/rollback/-$$Lambda$RollbackManagerServiceImpl$1$QPIiLceItKZOKeHshAhrcNkM3m8;
+Lcom/android/server/rollback/-$$Lambda$RollbackManagerServiceImpl$1$whIhaWpnqJBe6ocQeiVgI5ygyCA;
 Lcom/android/server/rollback/-$$Lambda$RollbackManagerServiceImpl$58BbNzpzWX_z-GzhKXpdGPwKcIU;
 Lcom/android/server/rollback/-$$Lambda$RollbackManagerServiceImpl$5VimxC3UlEV_IzyoBdYlrATzYd8;
 Lcom/android/server/rollback/-$$Lambda$RollbackManagerServiceImpl$9jRyv0ATJ7l2lc6xAd3tmkVmx7g;
@@ -49079,27 +52684,40 @@
 Lcom/android/server/soundtrigger_middleware/-$$Lambda$SoundTriggerMiddlewareService$Lifecycle$-t8UndY0AHGyM6n9ce2y6qok3Ho;
 Lcom/android/server/soundtrigger_middleware/AudioSessionProviderImpl;
 Lcom/android/server/soundtrigger_middleware/ConversionUtil;
+Lcom/android/server/soundtrigger_middleware/Dumpable;
+Lcom/android/server/soundtrigger_middleware/ExternalCaptureStateTracker;
 Lcom/android/server/soundtrigger_middleware/HalException;
 Lcom/android/server/soundtrigger_middleware/HalFactory;
 Lcom/android/server/soundtrigger_middleware/Hw2CompatUtil;
 Lcom/android/server/soundtrigger_middleware/ISoundTriggerHw2$Callback;
 Lcom/android/server/soundtrigger_middleware/ISoundTriggerHw2;
+Lcom/android/server/soundtrigger_middleware/ISoundTriggerMiddlewareInternal;
 Lcom/android/server/soundtrigger_middleware/InternalServerError;
+Lcom/android/server/soundtrigger_middleware/ObjectPrinter;
 Lcom/android/server/soundtrigger_middleware/RecoverableException;
 Lcom/android/server/soundtrigger_middleware/SoundTriggerHw2Compat$1;
 Lcom/android/server/soundtrigger_middleware/SoundTriggerHw2Compat$NotSupported;
 Lcom/android/server/soundtrigger_middleware/SoundTriggerHw2Compat$SoundTriggerCallback;
 Lcom/android/server/soundtrigger_middleware/SoundTriggerHw2Compat;
+Lcom/android/server/soundtrigger_middleware/SoundTriggerHw2Enforcer$CallbackEnforcer;
 Lcom/android/server/soundtrigger_middleware/SoundTriggerHw2Enforcer;
 Lcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareImpl$AudioSessionProvider$AudioSession;
 Lcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareImpl$AudioSessionProvider;
 Lcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareImpl;
+Lcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging$CallbackLogging;
+Lcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging$Event;
+Lcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging$ModuleLogging;
+Lcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging;
 Lcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareService$1;
 Lcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareService$Lifecycle;
 Lcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareService$ModelState$Activity;
 Lcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareService$ModelState;
 Lcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareService$ModuleService;
 Lcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareService;
+Lcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareValidation$ModelState$Activity;
+Lcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareValidation$ModelState;
+Lcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareValidation$ModuleService;
+Lcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareValidation;
 Lcom/android/server/soundtrigger_middleware/SoundTriggerModule$1;
 Lcom/android/server/soundtrigger_middleware/SoundTriggerModule$ModelState;
 Lcom/android/server/soundtrigger_middleware/SoundTriggerModule$Session$Model;
@@ -49377,6 +52995,7 @@
 Lcom/android/server/tv/TvInputManagerService;
 Lcom/android/server/tv/TvRemoteService;
 Lcom/android/server/tv/UinputBridge;
+Lcom/android/server/tv/tunerresourcemanager/TunerResourceManagerService;
 Lcom/android/server/twilight/-$$Lambda$QlMS1hfADW-S9aqM_RavcEKO3N0;
 Lcom/android/server/twilight/-$$Lambda$TwilightService$stdw4-ZXNiEaXmDt9g9s8D1zEQU;
 Lcom/android/server/twilight/TwilightListener;
@@ -49410,6 +53029,8 @@
 Lcom/android/server/usage/-$$Lambda$StorageStatsService$2sUmj2KWW5zDR1eh9U7bRfiEbbQ;
 Lcom/android/server/usage/-$$Lambda$StorageStatsService$bqtERyu3o5aAlc4KluAfnmSEFLI;
 Lcom/android/server/usage/-$$Lambda$StorageStatsService$iSsicGWO2pdH7m9nkPc_jeZZgzE;
+Lcom/android/server/usage/-$$Lambda$StorageStatsService$tgQ1n6Nzx2HUgCixFqiqtHCcsAo;
+Lcom/android/server/usage/-$$Lambda$StorageStatsService$wNCqEjBUk3qs1tuYbJHOuDgJ8rk;
 Lcom/android/server/usage/-$$Lambda$UsageStatsIdleService$RaU7JQt6BjPuOZETPRSrIe-Hdos;
 Lcom/android/server/usage/-$$Lambda$UserUsageStatsService$wWX7s9XZT5O4B7JcG_IB_VcPI9s;
 Lcom/android/server/usage/AppTimeLimitController$1;
@@ -49652,6 +53273,9 @@
 Lcom/android/server/wallpaper/-$$Lambda$WallpaperManagerService$WallpaperConnection$QhODF3v-swnwSYvDbeEhU85gOBw;
 Lcom/android/server/wallpaper/-$$Lambda$WallpaperManagerService$WallpaperConnection$Y6NUt3jeHQDhNJsATtXxO4MiWJ0;
 Lcom/android/server/wallpaper/-$$Lambda$WallpaperManagerService$WallpaperConnection$Yk86TTURTI5B9DzxOzMQGDq7aQU;
+Lcom/android/server/wallpaper/-$$Lambda$WallpaperManagerService$WallpaperConnection$d7gUC6mQx1Xv_Bvlwss1NEF5PwU;
+Lcom/android/server/wallpaper/-$$Lambda$WallpaperManagerService$WallpaperConnection$pf_7EcVpbLQlQnQ4nGnqzkGUhqg;
+Lcom/android/server/wallpaper/-$$Lambda$WallpaperManagerService$WallpaperConnection$zdJsFydiwYuUG4WFwlznTvMvYfw;
 Lcom/android/server/wallpaper/-$$Lambda$WallpaperManagerService$ZY5r01reAnoB4Dl2bo4au8KMz3Y;
 Lcom/android/server/wallpaper/-$$Lambda$WallpaperManagerService$la7x4YHA-l88Cd6HFTscnLBbKfI;
 Lcom/android/server/wallpaper/-$$Lambda$WallpaperManagerService$pVmree9DyIpBSg0s3RDK3MDesvs;
@@ -49735,6 +53359,7 @@
 Lcom/android/server/wm/-$$Lambda$ActivityStack$4eA3orAXlhwXqOJQ8sydb6lzW_4;
 Lcom/android/server/wm/-$$Lambda$ActivityStack$5VekJIJoJIh5JMUz2PkEx2YRfmo;
 Lcom/android/server/wm/-$$Lambda$ActivityStack$5zgAl3IFHP6i4hvY3Hby3Fg4HQM;
+Lcom/android/server/wm/-$$Lambda$ActivityStack$7heVv97BezfdSlHS0oo3lugbypI;
 Lcom/android/server/wm/-$$Lambda$ActivityStack$8rl8kos6nVh_HCoMLzbQatFXfQM;
 Lcom/android/server/wm/-$$Lambda$ActivityStack$9LPSm49BYrWURHV0f_s9bnJYnVk;
 Lcom/android/server/wm/-$$Lambda$ActivityStack$AQt7n1uNhFzkQj_jKv_v8YLYK-E;
@@ -49745,6 +53370,8 @@
 Lcom/android/server/wm/-$$Lambda$ActivityStack$FkaZkaRIeozTqSdHkmYZNbNtF1I;
 Lcom/android/server/wm/-$$Lambda$ActivityStack$FmEEyG-_GV_nB2HunZ086MlsGbw;
 Lcom/android/server/wm/-$$Lambda$ActivityStack$GDPUuzTvyfp2z6wYxqAF0vhMJK8;
+Lcom/android/server/wm/-$$Lambda$ActivityStack$Htv3ORQSvt64DuTSOQvqY0tbSys;
+Lcom/android/server/wm/-$$Lambda$ActivityStack$JmaqDIfLgBPvNqAjeRohpVhqtMw;
 Lcom/android/server/wm/-$$Lambda$ActivityStack$LjKdRo1XcwS4pEMN4TDnJTwl_Xs;
 Lcom/android/server/wm/-$$Lambda$ActivityStack$MbOt7bGpxw9wmjZ8kOCkYcDCqMQ;
 Lcom/android/server/wm/-$$Lambda$ActivityStack$McNymlK649VA6OMbsDYgFAkVJo8;
@@ -49755,7 +53382,9 @@
 Lcom/android/server/wm/-$$Lambda$ActivityStack$U5MWhpArTVT_b8W6GtTa1Ao8HFs;
 Lcom/android/server/wm/-$$Lambda$ActivityStack$VIuWlCdKwIo4qqRlevMLniedZ7o;
 Lcom/android/server/wm/-$$Lambda$ActivityStack$W1rlXKcoaLb8UYskrF3gqMvOkRU;
+Lcom/android/server/wm/-$$Lambda$ActivityStack$X9vss1g3clUg_jG-lx3LQEpL5fM;
 Lcom/android/server/wm/-$$Lambda$ActivityStack$YAQEcQUrLqR06xiJJApMvOPIxhg;
+Lcom/android/server/wm/-$$Lambda$ActivityStack$YJeneLrOvq3GBnNOpP3Jg1nkLcE;
 Lcom/android/server/wm/-$$Lambda$ActivityStack$YtJbVURmslxye4JS4EFo6X31Vv0;
 Lcom/android/server/wm/-$$Lambda$ActivityStack$YwFMIPNkUBnV2uIqB9sZ47M__Og;
 Lcom/android/server/wm/-$$Lambda$ActivityStack$ZeqjtPeTSrJ3k2l6y2bUmw5uqo0;
@@ -49763,13 +53392,16 @@
 Lcom/android/server/wm/-$$Lambda$ActivityStack$ccf0sRiFvFeqRiJQ6iXIEF1eN1Q;
 Lcom/android/server/wm/-$$Lambda$ActivityStack$dhfbladKtxXwwdCS2dFdAfUfBN4;
 Lcom/android/server/wm/-$$Lambda$ActivityStack$n-w1s4z47M3zxF8atJ8fDCrw2CA;
+Lcom/android/server/wm/-$$Lambda$ActivityStack$nvWNVaQ4kkXHI7BamR6vzb4wwJU;
 Lcom/android/server/wm/-$$Lambda$ActivityStack$vLTEw6nwtjcZ-ZyMktx8L5MR_TA;
 Lcom/android/server/wm/-$$Lambda$ActivityStack$xHrv17CG5tAkxdutHyfCFt4-Iec;
 Lcom/android/server/wm/-$$Lambda$ActivityStack$xrtErRAEnS21CI3h4SKc_WzJFDA;
+Lcom/android/server/wm/-$$Lambda$ActivityStack$yjID4CziB85rCK56sUtW6Ulw2eI;
 Lcom/android/server/wm/-$$Lambda$ActivityStackSupervisor$0u1RcpeZ6m0BHDGGv8EXroS3KyE;
 Lcom/android/server/wm/-$$Lambda$ActivityStackSupervisor$28Zuzbi6usdgbDcOi8hrJg6nZO0;
 Lcom/android/server/wm/-$$Lambda$ActivityStackSupervisor$BFgD0ahFSDg4CqQNytqWrPRgFII;
 Lcom/android/server/wm/-$$Lambda$ActivityStackSupervisor$GTQdt2-hJbSgeh3nbBxR-rvVTqw;
+Lcom/android/server/wm/-$$Lambda$ActivityStackSupervisor$MoveTaskToFullscreenHelper$cwI8_ohyLNH4EeQGc44e1nA8e9M;
 Lcom/android/server/wm/-$$Lambda$ActivityStackSupervisor$MoveTaskToFullscreenHelper$n0VOwWNM3mud17SnHip7XMiWlWE;
 Lcom/android/server/wm/-$$Lambda$ActivityStackSupervisor$PKLpVoHaca7ZAS9IjUCkoGIBtDw;
 Lcom/android/server/wm/-$$Lambda$ActivityStackSupervisor$iNb1-M_lYtbDycAXODgbDkmI9ww;
@@ -49785,12 +53417,16 @@
 Lcom/android/server/wm/-$$Lambda$ActivityTaskManagerService$LocalService$xIfx_hFO4SXy-Nq34zoEHe3S9eU;
 Lcom/android/server/wm/-$$Lambda$ActivityTaskManagerService$U6g1UdnOPnEF9wX1OTm9nKVXY5k;
 Lcom/android/server/wm/-$$Lambda$ActivityTaskManagerService$Uli7s8UWTEj0IpBUtoST5bmgvKk;
+Lcom/android/server/wm/-$$Lambda$ActivityTaskManagerService$hgT7_BsCohDVg6qQfaw5Xpx0-yQ;
 Lcom/android/server/wm/-$$Lambda$ActivityTaskManagerService$iduseKQrjIWQYD0hJ8Q5DMmuSfE;
 Lcom/android/server/wm/-$$Lambda$ActivityTaskManagerService$js0zprxhKzo_Mx9ozR8logP_1-c;
+Lcom/android/server/wm/-$$Lambda$ActivityTaskManagerService$l_aPxHBjKyHZWF7sw_vGD5ZvoR4;
+Lcom/android/server/wm/-$$Lambda$ActivityTaskManagerService$nuSrfdXdOXcutw3SV8Ualpreu30;
 Lcom/android/server/wm/-$$Lambda$ActivityTaskManagerService$oP6xxIfnD4kb4JN7aSJU073ULR4;
 Lcom/android/server/wm/-$$Lambda$ActivityTaskManagerService$p4I6RZJqLXjaEjdISFyNzjAe4HE;
 Lcom/android/server/wm/-$$Lambda$ActivityTaskManagerService$w70cT1_hTWQQAYctmXaA0BeZuBc;
 Lcom/android/server/wm/-$$Lambda$ActivityTaskManagerService$x3j1aVkumtfulORwKd6dHysJyE0;
+Lcom/android/server/wm/-$$Lambda$ActivityTaskManagerService$yEgPBZves-gjR6r_sca6FAEYeiA;
 Lcom/android/server/wm/-$$Lambda$ActivityTaskManagerService$yP9TbBmrgQ4lrgcxb-8oL1pBAs4;
 Lcom/android/server/wm/-$$Lambda$AlertWindowNotification$ZuqSYML-X-nkNVTba_yeIT9hJ1s;
 Lcom/android/server/wm/-$$Lambda$AlertWindowNotification$iVtcJMb6VtqtAgEtGUDCkGay0tM;
@@ -49852,9 +53488,11 @@
 Lcom/android/server/wm/-$$Lambda$DisplayContent$TaskStackContainers$5H3Kr211kTMg-C28tapuQGzkwN8;
 Lcom/android/server/wm/-$$Lambda$DisplayContent$TaskStackContainers$rQnI0Y8R9ptQ09cGHwbCHDiG2FY;
 Lcom/android/server/wm/-$$Lambda$DisplayContent$Ufn2ZjVS0i1L8aeQ8GZMJNJfmcY;
+Lcom/android/server/wm/-$$Lambda$DisplayContent$UpcoNmXQIJX_lHKnFIxs4t_Pu24;
 Lcom/android/server/wm/-$$Lambda$DisplayContent$_XfE1uZ9VUv6i0SxWUvqu69FNb4;
 Lcom/android/server/wm/-$$Lambda$DisplayContent$a4EkCBfpZNIl1xfYgm2ktgndF8w;
 Lcom/android/server/wm/-$$Lambda$DisplayContent$cDcvMzGxc6XW13Q8FrU5X4DagqE;
+Lcom/android/server/wm/-$$Lambda$DisplayContent$cUrRhr9F2jovlTUmfY9boAvOD98;
 Lcom/android/server/wm/-$$Lambda$DisplayContent$dcSGCWAJtdQoc69foFpUzYoTn2I;
 Lcom/android/server/wm/-$$Lambda$DisplayContent$eJsj3GR1HdCnOJrZ8_oaLP52jg0;
 Lcom/android/server/wm/-$$Lambda$DisplayContent$fiC19lMy-d_-rvza7hhOSw6bOM8;
@@ -49915,6 +53553,7 @@
 Lcom/android/server/wm/-$$Lambda$IamNNBZp056cXLajnE4zHKSqj-c;
 Lcom/android/server/wm/-$$Lambda$ImeInsetsSourceProvider$1aCwANZDoNIzXR0mfeN2iV_k2Yo;
 Lcom/android/server/wm/-$$Lambda$InputMonitor$ew_vdS116C6DH9LxWaTuVXJYZPE;
+Lcom/android/server/wm/-$$Lambda$InsetsPolicy$InsetsPolicyAnimationControlListener$InsetsPolicyAnimationControlCallbacks$g4iZp8JC81kbnUW8925AyPjUE34;
 Lcom/android/server/wm/-$$Lambda$InsetsPolicy$LCR2QgJZxbNat6Qb0Be-JDpy3i0;
 Lcom/android/server/wm/-$$Lambda$InsetsPolicy$rhM012fDRQZs2vWOctMZZ_uSXvc;
 Lcom/android/server/wm/-$$Lambda$InsetsStateController$-1iOXDf-1s3wDHcMIHBKNk6MS3I;
@@ -49970,6 +53609,7 @@
 Lcom/android/server/wm/-$$Lambda$RootActivityContainer$eTBwQBLMAzyK1I2vbgH_wbrf5n0;
 Lcom/android/server/wm/-$$Lambda$RootActivityContainer$m1XaUaXYDseEoG-rccxbUydXgO8;
 Lcom/android/server/wm/-$$Lambda$RootWindowContainer$-XbbIpkF4p2mF3v0qeXeat-_w3E;
+Lcom/android/server/wm/-$$Lambda$RootWindowContainer$07q9Iva7qby1Cfkq4KztBB6CisE;
 Lcom/android/server/wm/-$$Lambda$RootWindowContainer$0ZupnQyxl7yZKgMmf2zwvykG50s;
 Lcom/android/server/wm/-$$Lambda$RootWindowContainer$0aCEx04eIvMHmZVtI4ucsiK5s9I;
 Lcom/android/server/wm/-$$Lambda$RootWindowContainer$1$HOnR_rhPvM6ZPX8yI-4GFhkGqUs;
@@ -49996,6 +53636,7 @@
 Lcom/android/server/wm/-$$Lambda$RootWindowContainer$smSIq2r4GMdbTUsLaRS4KHth6DY;
 Lcom/android/server/wm/-$$Lambda$RootWindowContainer$utugHDPHgMp2b3JwigOH_-Y0P1Q;
 Lcom/android/server/wm/-$$Lambda$RootWindowContainer$vMW2dyMvZQ0PDhptvNKN5WXpK_w;
+Lcom/android/server/wm/-$$Lambda$RootWindowContainer$wLVWfnI4-Qh591YFnQQbgqi690s;
 Lcom/android/server/wm/-$$Lambda$RootWindowContainer$y9wG_endhUBCwGznyjN4RSIYTyg;
 Lcom/android/server/wm/-$$Lambda$RunningTasks$MPCBAZpSXKx53M7vrqtvLfftJOc;
 Lcom/android/server/wm/-$$Lambda$RunningTasks$hR_Ryk91b0B2BdJN9eCfQfPwC3g;
@@ -50004,6 +53645,7 @@
 Lcom/android/server/wm/-$$Lambda$Session$3q7E1KtcKfO8_a7pOH0nnVURP8w;
 Lcom/android/server/wm/-$$Lambda$Session$6cG7louvKZjAfcc7DtiA7aAzr7U;
 Lcom/android/server/wm/-$$Lambda$Session$zgdcs0nAb8hCdS-6ugnFMadbhU8;
+Lcom/android/server/wm/-$$Lambda$ShellRoot$ZIRxB0zj35u-emFBSiaW8a8zUus;
 Lcom/android/server/wm/-$$Lambda$StatusBarController$1$3FiQ0kybPCSlgcNJkCsNm5M12iA;
 Lcom/android/server/wm/-$$Lambda$StatusBarController$1$CizMeoiz6ZVrkt6kAKpSV5htmyc;
 Lcom/android/server/wm/-$$Lambda$StatusBarController$1$t71qcQIBSxRShk0Xohf1lk53bOw;
@@ -50272,6 +53914,7 @@
 Lcom/android/server/wm/DisplayArea$Tokens;
 Lcom/android/server/wm/DisplayArea$Type;
 Lcom/android/server/wm/DisplayArea;
+Lcom/android/server/wm/DisplayAreaOrganizerController;
 Lcom/android/server/wm/DisplayAreaPolicy$1;
 Lcom/android/server/wm/DisplayAreaPolicy$Default$Provider;
 Lcom/android/server/wm/DisplayAreaPolicy$Default;
@@ -50470,6 +54113,9 @@
 Lcom/android/server/wm/TaskChangeNotificationController$MainHandler;
 Lcom/android/server/wm/TaskChangeNotificationController$TaskStackConsumer;
 Lcom/android/server/wm/TaskChangeNotificationController;
+Lcom/android/server/wm/TaskContainers;
+Lcom/android/server/wm/TaskDisplayArea$OnStackOrderChangedListener;
+Lcom/android/server/wm/TaskDisplayArea;
 Lcom/android/server/wm/TaskLaunchParamsModifier;
 Lcom/android/server/wm/TaskOrganizerController$DeathRecipient;
 Lcom/android/server/wm/TaskOrganizerController$TaskOrganizerState;
@@ -50484,6 +54130,7 @@
 Lcom/android/server/wm/TaskSnapshotCache$CacheEntry;
 Lcom/android/server/wm/TaskSnapshotCache;
 Lcom/android/server/wm/TaskSnapshotController;
+Lcom/android/server/wm/TaskSnapshotLoader$PreRLegacySnapshotConfig;
 Lcom/android/server/wm/TaskSnapshotLoader;
 Lcom/android/server/wm/TaskSnapshotPersister$1;
 Lcom/android/server/wm/TaskSnapshotPersister$DeleteWriteQueueItem;
@@ -50553,6 +54200,7 @@
 Lcom/android/server/wm/WindowManagerService;
 Lcom/android/server/wm/WindowManagerShellCommand;
 Lcom/android/server/wm/WindowManagerThreadPriorityBooster;
+Lcom/android/server/wm/WindowOrganizerController;
 Lcom/android/server/wm/WindowProcessController$ComputeOomAdjCallback;
 Lcom/android/server/wm/WindowProcessController;
 Lcom/android/server/wm/WindowProcessControllerMap;
@@ -50596,6 +54244,7 @@
 Lcom/google/android/startop/iorap/-$$Lambda$IorapForwardingService$AppLaunchObserver$bprgjb2FWBxwWDJr-Q4ViVP0aJc;
 Lcom/google/android/startop/iorap/-$$Lambda$IorapForwardingService$AppLaunchObserver$elqG7IabJdUOCjFWiPV8vgrXnVI;
 Lcom/google/android/startop/iorap/-$$Lambda$IorapForwardingService$AppLaunchObserver$qed0q0aplGsIh0O7dSm6JWk8wZI;
+Lcom/google/android/startop/iorap/-$$Lambda$IorapForwardingService$IorapdJobService$42YZ24cX_s4lPtOYWBr7EBOoX_A;
 Lcom/google/android/startop/iorap/-$$Lambda$IorapForwardingService$IorapdJobService$LUEcmjVFTNORsDoHk5dk5OHflTU;
 Lcom/google/android/startop/iorap/-$$Lambda$IorapForwardingService$miQO-RJhHA7C1W4BujwCS9blXFc;
 Lcom/google/android/startop/iorap/AppIntentEvent;
diff --git a/services/autofill/java/com/android/server/autofill/AutofillInlineSuggestionsRequestSession.java b/services/autofill/java/com/android/server/autofill/AutofillInlineSuggestionsRequestSession.java
index ea4aaa4..ce11c76 100644
--- a/services/autofill/java/com/android/server/autofill/AutofillInlineSuggestionsRequestSession.java
+++ b/services/autofill/java/com/android/server/autofill/AutofillInlineSuggestionsRequestSession.java
@@ -18,6 +18,7 @@
 
 import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage;
 import static com.android.server.autofill.Helper.sDebug;
+import static com.android.server.autofill.Helper.sVerbose;
 
 import android.annotation.BinderThread;
 import android.annotation.NonNull;
@@ -53,7 +54,16 @@
 final class AutofillInlineSuggestionsRequestSession {
 
     private static final String TAG = AutofillInlineSuggestionsRequestSession.class.getSimpleName();
-    private static final int INLINE_REQUEST_TIMEOUT_MS = 200;
+
+    // This timeout controls how long Autofill should wait for the IME to respond either
+    // unsupported or an {@link InlineSuggestionsRequest}. The timeout is needed to take into
+    // account the latency between the two events after a field is focused, 1) an Autofill
+    // request is triggered on framework; 2) the InputMethodService#onStartInput() event is
+    // triggered on the IME side. When 1) happens, Autofill may call the IME to return an {@link
+    // InlineSuggestionsRequest}, but the IME will only return it after 2) happens (or return
+    // immediately if the IME doesn't support inline suggestions). Also there is IPC latency
+    // between the framework and the IME but that should be small compare to that.
+    private static final int CREATE_INLINE_SUGGESTIONS_REQUEST_TIMEOUT_MS = 1000;
 
     @NonNull
     private final InputMethodManagerInternal mInputMethodManagerInternal;
@@ -177,10 +187,10 @@
      */
     @GuardedBy("mLock")
     void onCreateInlineSuggestionsRequestLocked() {
-        if (sDebug) Log.d(TAG, "onCreateInlineSuggestionsRequestLocked called: " + mAutofillId);
         if (mDestroyed) {
             return;
         }
+        if (sDebug) Log.d(TAG, "onCreateInlineSuggestionsRequestLocked called: " + mAutofillId);
         mInputMethodManagerInternal.onCreateInlineSuggestionsRequest(mUserId,
                 new InlineSuggestionsRequestInfo(mComponentName, mAutofillId, mUiExtras),
                 new InlineSuggestionsRequestCallbackImpl(this));
@@ -188,7 +198,7 @@
             Log.w(TAG, "Timed out waiting for IME callback InlineSuggestionsRequest.");
             handleOnReceiveImeRequest(null, null);
         };
-        mHandler.postDelayed(mTimeoutCallback, INLINE_REQUEST_TIMEOUT_MS);
+        mHandler.postDelayed(mTimeoutCallback, CREATE_INLINE_SUGGESTIONS_REQUEST_TIMEOUT_MS);
     }
 
     /**
@@ -196,7 +206,7 @@
      */
     @GuardedBy("mLock")
     private void maybeUpdateResponseToImeLocked() {
-        if (sDebug) Log.d(TAG, "maybeUpdateResponseToImeLocked called");
+        if (sVerbose) Log.v(TAG, "maybeUpdateResponseToImeLocked called");
         if (mDestroyed || mResponseCallback == null) {
             return;
         }
@@ -206,7 +216,7 @@
             // Although the inline suggestions should disappear when IME hides which removes them
             // from the view hierarchy, but we still send an empty response to be extra safe.
 
-            if (sDebug) Log.d(TAG, "Send empty inline response");
+            if (sVerbose) Log.v(TAG, "Send empty inline response");
             updateResponseToImeUncheckLocked(new InlineSuggestionsResponse(Collections.EMPTY_LIST));
             mPreviousResponseIsNotEmpty = false;
         } else if (mImeInputViewStarted && mInlineSuggestionsResponse != null && match(mAutofillId,
@@ -217,10 +227,6 @@
                 // No-op if both the previous response and current response are empty.
                 return;
             }
-            if (sDebug) {
-                Log.d(TAG, "Send inline response: "
-                        + mInlineSuggestionsResponse.getInlineSuggestions().size());
-            }
             updateResponseToImeUncheckLocked(mInlineSuggestionsResponse);
             mPreviousResponseIsNotEmpty = !isEmptyResponse;
         }
@@ -234,6 +240,7 @@
         if (mDestroyed) {
             return;
         }
+        if (sDebug) Log.d(TAG, "Send inline response: " + response.getInlineSuggestions().size());
         try {
             mResponseCallback.onInlineSuggestionsResponse(mAutofillId, response);
         } catch (RemoteException e) {
@@ -255,7 +262,7 @@
             mImeRequestReceived = true;
 
             if (mTimeoutCallback != null) {
-                if (sDebug) Log.d(TAG, "removing timeout callback");
+                if (sVerbose) Log.v(TAG, "removing timeout callback");
                 mHandler.removeCallbacks(mTimeoutCallback);
                 mTimeoutCallback = null;
             }
@@ -350,7 +357,7 @@
 
         @Override
         public void onInputMethodStartInput(AutofillId imeFieldId) throws RemoteException {
-            if (sDebug) Log.d(TAG, "onInputMethodStartInput() received on " + imeFieldId);
+            if (sVerbose) Log.v(TAG, "onInputMethodStartInput() received on " + imeFieldId);
             final AutofillInlineSuggestionsRequestSession session = mSession.get();
             if (session != null) {
                 session.mHandler.sendMessage(obtainMessage(
@@ -361,15 +368,15 @@
 
         @Override
         public void onInputMethodShowInputRequested(boolean requestResult) throws RemoteException {
-            if (sDebug) {
-                Log.d(TAG, "onInputMethodShowInputRequested() received: " + requestResult);
+            if (sVerbose) {
+                Log.v(TAG, "onInputMethodShowInputRequested() received: " + requestResult);
             }
         }
 
         @BinderThread
         @Override
         public void onInputMethodStartInputView() {
-            if (sDebug) Log.d(TAG, "onInputMethodStartInputView() received");
+            if (sVerbose) Log.v(TAG, "onInputMethodStartInputView() received");
             final AutofillInlineSuggestionsRequestSession session = mSession.get();
             if (session != null) {
                 session.mHandler.sendMessage(obtainMessage(
@@ -381,7 +388,7 @@
         @BinderThread
         @Override
         public void onInputMethodFinishInputView() {
-            if (sDebug) Log.d(TAG, "onInputMethodFinishInputView() received");
+            if (sVerbose) Log.v(TAG, "onInputMethodFinishInputView() received");
             final AutofillInlineSuggestionsRequestSession session = mSession.get();
             if (session != null) {
                 session.mHandler.sendMessage(obtainMessage(
@@ -392,7 +399,7 @@
 
         @Override
         public void onInputMethodFinishInput() throws RemoteException {
-            if (sDebug) Log.d(TAG, "onInputMethodFinishInput() received");
+            if (sVerbose) Log.v(TAG, "onInputMethodFinishInput() received");
             final AutofillInlineSuggestionsRequestSession session = mSession.get();
             if (session != null) {
                 session.mHandler.sendMessage(obtainMessage(
diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
index d1805d9..1bc026c 100644
--- a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
+++ b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
@@ -815,26 +815,27 @@
         }
     }
 
-    void logAugmentedAutofillSelected(int sessionId, @Nullable String suggestionId) {
+    void logAugmentedAutofillSelected(int sessionId, @Nullable String suggestionId,
+            @Nullable Bundle clientState) {
         synchronized (mLock) {
             if (mAugmentedAutofillEventHistory == null
                     || mAugmentedAutofillEventHistory.getSessionId() != sessionId) {
                 return;
             }
             mAugmentedAutofillEventHistory.addEvent(
-                    new Event(Event.TYPE_DATASET_SELECTED, suggestionId, null, null, null,
+                    new Event(Event.TYPE_DATASET_SELECTED, suggestionId, clientState, null, null,
                             null, null, null, null, null, null));
         }
     }
 
-    void logAugmentedAutofillShown(int sessionId) {
+    void logAugmentedAutofillShown(int sessionId, @Nullable Bundle clientState) {
         synchronized (mLock) {
             if (mAugmentedAutofillEventHistory == null
                     || mAugmentedAutofillEventHistory.getSessionId() != sessionId) {
                 return;
             }
             mAugmentedAutofillEventHistory.addEvent(
-                    new Event(Event.TYPE_DATASETS_SHOWN, null, null, null, null, null,
+                    new Event(Event.TYPE_DATASETS_SHOWN, null, clientState, null, null, null,
                             null, null, null, null, null));
 
         }
@@ -1185,15 +1186,16 @@
                         }
 
                         @Override
-                        public void logAugmentedAutofillShown(int sessionId) {
-                            AutofillManagerServiceImpl.this.logAugmentedAutofillShown(sessionId);
+                        public void logAugmentedAutofillShown(int sessionId, Bundle clientState) {
+                            AutofillManagerServiceImpl.this.logAugmentedAutofillShown(sessionId,
+                                    clientState);
                         }
 
                         @Override
                         public void logAugmentedAutofillSelected(int sessionId,
-                                String suggestionId) {
+                                String suggestionId, Bundle clientState) {
                             AutofillManagerServiceImpl.this.logAugmentedAutofillSelected(sessionId,
-                                    suggestionId);
+                                    suggestionId, clientState);
                         }
 
                         @Override
diff --git a/services/autofill/java/com/android/server/autofill/RemoteAugmentedAutofillService.java b/services/autofill/java/com/android/server/autofill/RemoteAugmentedAutofillService.java
index b6bc7c5..6cec8d8 100644
--- a/services/autofill/java/com/android/server/autofill/RemoteAugmentedAutofillService.java
+++ b/services/autofill/java/com/android/server/autofill/RemoteAugmentedAutofillService.java
@@ -168,12 +168,12 @@
                             focusedId, focusedValue, requestTime, inlineSuggestionsRequest,
                             new IFillCallback.Stub() {
                                 @Override
-                                public void onSuccess(
-                                        @Nullable List<Dataset> inlineSuggestionsData) {
+                                public void onSuccess(@Nullable List<Dataset> inlineSuggestionsData,
+                                        @Nullable Bundle clientState) {
                                     mCallbacks.resetLastResponse();
                                     maybeRequestShowInlineSuggestions(sessionId,
                                             inlineSuggestionsRequest, inlineSuggestionsData,
-                                            focusedId, inlineSuggestionsCallback,
+                                            clientState, focusedId, inlineSuggestionsCallback,
                                             client, onErrorCallback, remoteRenderService);
                                     requestAutofill.complete(null);
                                 }
@@ -238,7 +238,8 @@
 
     private void maybeRequestShowInlineSuggestions(int sessionId,
             @Nullable InlineSuggestionsRequest request,
-            @Nullable List<Dataset> inlineSuggestionsData, @NonNull AutofillId focusedId,
+            @Nullable List<Dataset> inlineSuggestionsData, @Nullable Bundle clientState,
+            @NonNull AutofillId focusedId,
             @Nullable Function<InlineSuggestionsResponse, Boolean> inlineSuggestionsCallback,
             @NonNull IAutoFillManagerClient client, @NonNull Runnable onErrorCallback,
             @Nullable RemoteInlineSuggestionRenderService remoteRenderService) {
@@ -256,7 +257,7 @@
                             @Override
                             public void autofill(Dataset dataset) {
                                 mCallbacks.logAugmentedAutofillSelected(sessionId,
-                                        dataset.getId());
+                                        dataset.getId(), clientState);
                                 try {
                                     final ArrayList<AutofillId> fieldIds = dataset.getFieldIds();
                                     final int size = fieldIds.size();
@@ -287,7 +288,7 @@
             return;
         }
         if (inlineSuggestionsCallback.apply(inlineSuggestionsResponse)) {
-            mCallbacks.logAugmentedAutofillShown(sessionId);
+            mCallbacks.logAugmentedAutofillShown(sessionId, clientState);
         }
     }
 
@@ -310,8 +311,9 @@
 
         void setLastResponse(int sessionId);
 
-        void logAugmentedAutofillShown(int sessionId);
+        void logAugmentedAutofillShown(int sessionId, @Nullable Bundle clientState);
 
-        void logAugmentedAutofillSelected(int sessionId, @Nullable String suggestionId);
+        void logAugmentedAutofillSelected(int sessionId, @Nullable String suggestionId,
+                @Nullable Bundle clientState);
     }
 }
diff --git a/services/autofill/java/com/android/server/autofill/RemoteInlineSuggestionRenderService.java b/services/autofill/java/com/android/server/autofill/RemoteInlineSuggestionRenderService.java
index 347174c..255adcd 100644
--- a/services/autofill/java/com/android/server/autofill/RemoteInlineSuggestionRenderService.java
+++ b/services/autofill/java/com/android/server/autofill/RemoteInlineSuggestionRenderService.java
@@ -97,9 +97,7 @@
      * Gets the inline suggestions renderer info as a {@link Bundle}.
      */
     public void getInlineSuggestionsRendererInfo(@NonNull RemoteCallback callback) {
-        scheduleAsyncRequest((s) -> s.getInlineSuggestionsRendererInfo(new RemoteCallback(
-                (bundle) -> callback.sendResult(bundle)
-        )));
+        scheduleAsyncRequest((s) -> s.getInlineSuggestionsRendererInfo(callback));
     }
 
     @Nullable
diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java
index 3d68618..35089d6 100644
--- a/services/autofill/java/com/android/server/autofill/Session.java
+++ b/services/autofill/java/com/android/server/autofill/Session.java
@@ -117,6 +117,7 @@
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.function.Consumer;
+import java.util.function.Function;
 
 /**
  * A session for a given activity.
@@ -717,10 +718,11 @@
             Consumer<InlineSuggestionsRequest> inlineSuggestionsRequestConsumer =
                     mAssistReceiver.newAutofillRequestLocked(/*isInlineRequest=*/ true);
             if (inlineSuggestionsRequestConsumer != null) {
+                final AutofillId focusedId = mCurrentViewId;
                 remoteRenderService.getInlineSuggestionsRendererInfo(
                         new RemoteCallback((extras) -> {
                             mInlineSessionController.onCreateInlineSuggestionsRequestLocked(
-                                    mCurrentViewId, inlineSuggestionsRequestConsumer, extras);
+                                    focusedId, inlineSuggestionsRequestConsumer, extras);
                         }
                 ));
             }
@@ -2653,6 +2655,11 @@
         } else if (viewState.id.equals(this.mCurrentViewId)
                 && (viewState.getState() & ViewState.STATE_INLINE_SHOWN) != 0) {
             requestShowInlineSuggestionsLocked(viewState.getResponse(), filterText);
+        } else if (viewState.id.equals(this.mCurrentViewId)
+                && (viewState.getState() & ViewState.STATE_TRIGGERED_AUGMENTED_AUTOFILL) != 0) {
+            if (!TextUtils.isEmpty(filterText)) {
+                mInlineSessionController.hideInlineSuggestionsUiLocked(mCurrentViewId);
+            }
         }
 
         viewState.setState(ViewState.STATE_CHANGED);
@@ -2781,6 +2788,12 @@
      */
     private boolean requestShowInlineSuggestionsLocked(@NonNull FillResponse response,
             @Nullable String filterText) {
+        if (mCurrentViewId == null) {
+            Log.w(TAG, "requestShowInlineSuggestionsLocked(): no view currently focused");
+            return false;
+        }
+        final AutofillId focusedId = mCurrentViewId;
+
         final Optional<InlineSuggestionsRequest> inlineSuggestionsRequest =
                 mInlineSessionController.getInlineSuggestionsRequestLocked();
         if (!inlineSuggestionsRequest.isPresent()) {
@@ -2795,17 +2808,17 @@
             return false;
         }
 
-        final ViewState currentView = mViewStates.get(mCurrentViewId);
+        final ViewState currentView = mViewStates.get(focusedId);
         if ((currentView.getState() & ViewState.STATE_INLINE_DISABLED) != 0) {
             response.getDatasets().clear();
         }
         InlineSuggestionsResponse inlineSuggestionsResponse =
                 InlineSuggestionFactory.createInlineSuggestionsResponse(
-                        inlineSuggestionsRequest.get(), response, filterText, mCurrentViewId,
+                        inlineSuggestionsRequest.get(), response, filterText, focusedId,
                         this, () -> {
                             synchronized (mLock) {
                                 mInlineSessionController.hideInlineSuggestionsUiLocked(
-                                        mCurrentViewId);
+                                        focusedId);
                             }
                         }, remoteRenderService);
         if (inlineSuggestionsResponse == null) {
@@ -2813,7 +2826,7 @@
             return false;
         }
 
-        return mInlineSessionController.onInlineSuggestionsResponseLocked(mCurrentViewId,
+        return mInlineSessionController.onInlineSuggestionsResponseLocked(focusedId,
                 inlineSuggestionsResponse);
     }
 
@@ -3067,19 +3080,13 @@
         final boolean isWhitelisted = mService
                 .isWhitelistedForAugmentedAutofillLocked(mComponentName);
 
-        final String historyItem =
-                "aug:id=" + id + " u=" + uid + " m=" + mode
-                + " a=" + ComponentName.flattenToShortString(mComponentName)
-                + " f=" + mCurrentViewId
-                + " s=" + remoteService.getComponentName()
-                + " w=" + isWhitelisted;
-        mService.getMaster().logRequestLocked(historyItem);
-
         if (!isWhitelisted) {
             if (sVerbose) {
                 Slog.v(TAG, "triggerAugmentedAutofillLocked(): "
                         + ComponentName.flattenToShortString(mComponentName) + " not whitelisted ");
             }
+            logAugmentedAutofillRequestLocked(mode, remoteService.getComponentName(),
+                    mCurrentViewId, isWhitelisted, /*isInline*/null);
             return null;
         }
 
@@ -3102,26 +3109,29 @@
                 remoteService.getComponentName().getPackageName());
         mAugmentedRequestsLogs.add(log);
 
-        final AutofillId focusedId = AutofillId.withoutSession(mCurrentViewId);
+        final AutofillId focusedId = mCurrentViewId;
 
+        final Function<InlineSuggestionsResponse, Boolean> inlineSuggestionsResponseCallback =
+                response -> {
+                    synchronized (mLock) {
+                        return mInlineSessionController.onInlineSuggestionsResponseLocked(
+                                focusedId, response);
+                    }
+                };
         final Consumer<InlineSuggestionsRequest> requestAugmentedAutofill =
                 (inlineSuggestionsRequest) -> {
-                    remoteService.onRequestAutofillLocked(id, mClient, taskId, mComponentName,
-                            focusedId,
-                            currentValue, inlineSuggestionsRequest,
-                            /*inlineSuggestionsCallback=*/
-                            response -> {
-                                synchronized (mLock) {
-                                    return mInlineSessionController
-                                            .onInlineSuggestionsResponseLocked(
-                                            mCurrentViewId, response);
-                                }
-                            },
-                            /*onErrorCallback=*/ () -> {
-                                synchronized (mLock) {
-                                    cancelAugmentedAutofillLocked();
-                                }
-                            }, mService.getRemoteInlineSuggestionRenderServiceLocked());
+                    synchronized (mLock) {
+                        logAugmentedAutofillRequestLocked(mode, remoteService.getComponentName(),
+                                focusedId, isWhitelisted, inlineSuggestionsRequest != null);
+                        remoteService.onRequestAutofillLocked(id, mClient, taskId, mComponentName,
+                                AutofillId.withoutSession(focusedId), currentValue,
+                                inlineSuggestionsRequest, inlineSuggestionsResponseCallback,
+                                /*onErrorCallback=*/ () -> {
+                                    synchronized (mLock) {
+                                        cancelAugmentedAutofillLocked();
+                                    }
+                                }, mService.getRemoteInlineSuggestionRenderServiceLocked());
+                    }
                 };
 
         // When the inline suggestion render service is available, there are 2 cases when
@@ -3138,9 +3148,11 @@
             if (sDebug) Slog.d(TAG, "Create inline request for augmented autofill");
             remoteRenderService.getInlineSuggestionsRendererInfo(new RemoteCallback(
                     (extras) -> {
-                        mInlineSessionController.onCreateInlineSuggestionsRequestLocked(
-                                mCurrentViewId, /*requestConsumer=*/ requestAugmentedAutofill,
-                                extras);
+                        synchronized (mLock) {
+                            mInlineSessionController.onCreateInlineSuggestionsRequestLocked(
+                                    focusedId, /*requestConsumer=*/ requestAugmentedAutofill,
+                                    extras);
+                        }
                     }, mHandler));
         } else {
             requestAugmentedAutofill.accept(
@@ -3153,6 +3165,20 @@
     }
 
     @GuardedBy("mLock")
+    private void logAugmentedAutofillRequestLocked(int mode,
+            ComponentName augmentedRemoteServiceName, AutofillId focusedId, boolean isWhitelisted,
+            Boolean isInline) {
+        final String historyItem =
+                "aug:id=" + id + " u=" + uid + " m=" + mode
+                        + " a=" + ComponentName.flattenToShortString(mComponentName)
+                        + " f=" + focusedId
+                        + " s=" + augmentedRemoteServiceName
+                        + " w=" + isWhitelisted
+                        + " i=" + isInline;
+        mService.getMaster().logRequestLocked(historyItem);
+    }
+
+    @GuardedBy("mLock")
     private void cancelAugmentedAutofillLocked() {
         final RemoteAugmentedAutofillService remoteService = mService
                 .getRemoteAugmentedAutofillServiceLocked();
diff --git a/services/backup/java/com/android/server/backup/UserBackupManagerService.java b/services/backup/java/com/android/server/backup/UserBackupManagerService.java
index 69154b4..992e984 100644
--- a/services/backup/java/com/android/server/backup/UserBackupManagerService.java
+++ b/services/backup/java/com/android/server/backup/UserBackupManagerService.java
@@ -3120,6 +3120,8 @@
      * to the backup agent during restore.
      */
     public void excludeKeysFromRestore(String packageName, List<String> keys) {
+        mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP,
+                "excludeKeysFromRestore");
         mBackupPreferences.addExcludedKeys(packageName, keys);
     }
 
diff --git a/services/core/java/android/content/pm/PackageManagerInternal.java b/services/core/java/android/content/pm/PackageManagerInternal.java
index c27ec66..81de29c 100644
--- a/services/core/java/android/content/pm/PackageManagerInternal.java
+++ b/services/core/java/android/content/pm/PackageManagerInternal.java
@@ -480,6 +480,12 @@
     public abstract void pruneInstantApps();
 
     /**
+     * Prunes the cache of the APKs in the given APEXes.
+     * @param apexPackages The list of APEX packages that may contain APK-in-APEX.
+     */
+    public abstract void pruneCachedApksInApex(@NonNull List<PackageInfo> apexPackages);
+
+    /**
      * @return The SetupWizard package name.
      */
     public abstract String getSetupWizardPackageName();
@@ -977,4 +983,9 @@
      * Returns if a package name is a valid system package.
      */
     public abstract boolean isSystemPackage(@NonNull String packageName);
+
+    /**
+     * Unblocks uninstall for all packages for the user.
+     */
+    public abstract void clearBlockUninstallForUser(@UserIdInt int userId);
 }
diff --git a/services/core/java/com/android/server/AlarmManagerService.java b/services/core/java/com/android/server/AlarmManagerService.java
index fe33fae9..4009caf 100644
--- a/services/core/java/com/android/server/AlarmManagerService.java
+++ b/services/core/java/com/android/server/AlarmManagerService.java
@@ -603,8 +603,7 @@
             }
 
             pw.print(KEY_APP_STANDBY_RESTRICTED_QUOTA); pw.print("=");
-            TimeUtils.formatDuration(APP_STANDBY_RESTRICTED_QUOTA, pw);
-            pw.println();
+            pw.println(APP_STANDBY_RESTRICTED_QUOTA);
 
             pw.print(KEY_APP_STANDBY_RESTRICTED_WINDOW); pw.print("=");
             TimeUtils.formatDuration(APP_STANDBY_RESTRICTED_WINDOW, pw);
@@ -1741,8 +1740,9 @@
 
         final long nowElapsed = mInjector.getElapsedRealtime();
         final long nominalTrigger = convertToElapsed(triggerAtTime, type);
-        // Try to prevent spamming by making sure we aren't firing alarms in the immediate future
-        final long minTrigger = nowElapsed + mConstants.MIN_FUTURITY;
+        // Try to prevent spamming by making sure apps aren't firing alarms in the immediate future
+        final long minTrigger = nowElapsed
+                + (UserHandle.isCore(callingUid) ? 0L : mConstants.MIN_FUTURITY);
         final long triggerElapsed = (nominalTrigger > minTrigger) ? nominalTrigger : minTrigger;
 
         final long maxElapsed;
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index 51427c1..552331e 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -2093,6 +2093,20 @@
                 NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK);
     }
 
+    private void enforceNetworkFactoryOrSettingsPermission() {
+        enforceAnyPermissionOf(
+                android.Manifest.permission.NETWORK_SETTINGS,
+                android.Manifest.permission.NETWORK_FACTORY,
+                NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK);
+    }
+
+    private void enforceNetworkFactoryOrTestNetworksPermission() {
+        enforceAnyPermissionOf(
+                android.Manifest.permission.MANAGE_TEST_NETWORKS,
+                android.Manifest.permission.NETWORK_FACTORY,
+                NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK);
+    }
+
     private boolean checkSettingsPermission() {
         return checkAnyPermissionOf(
                 android.Manifest.permission.NETWORK_SETTINGS,
@@ -2151,7 +2165,8 @@
     private boolean checkNetworkSignalStrengthWakeupPermission(int pid, int uid) {
         return checkAnyPermissionOf(pid, uid,
                 android.Manifest.permission.NETWORK_SIGNAL_STRENGTH_WAKEUP,
-                NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK);
+                NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK,
+                android.Manifest.permission.NETWORK_SETTINGS);
     }
 
     private void enforceConnectivityRestrictedNetworksPermission() {
@@ -2721,7 +2736,9 @@
                     break;
                 }
                 case NetworkAgent.EVENT_NETWORK_PROPERTIES_CHANGED: {
-                    handleUpdateLinkProperties(nai, (LinkProperties) msg.obj);
+                    LinkProperties newLp = (LinkProperties) msg.obj;
+                    processLinkPropertiesFromAgent(nai, newLp);
+                    handleUpdateLinkProperties(nai, newLp);
                     break;
                 }
                 case NetworkAgent.EVENT_NETWORK_INFO_CHANGED: {
@@ -5680,7 +5697,7 @@
 
     @Override
     public int registerNetworkProvider(Messenger messenger, String name) {
-        enforceNetworkFactoryPermission();
+        enforceNetworkFactoryOrSettingsPermission();
         NetworkProviderInfo npi = new NetworkProviderInfo(name, messenger,
                 null /* asyncChannel */, nextNetworkProviderId(),
                 () -> unregisterNetworkProvider(messenger));
@@ -5690,7 +5707,7 @@
 
     @Override
     public void unregisterNetworkProvider(Messenger messenger) {
-        enforceNetworkFactoryPermission();
+        enforceNetworkFactoryOrSettingsPermission();
         mHandler.sendMessage(mHandler.obtainMessage(EVENT_UNREGISTER_NETWORK_PROVIDER, messenger));
     }
 
@@ -5710,7 +5727,11 @@
 
     @Override
     public void declareNetworkRequestUnfulfillable(NetworkRequest request) {
-        enforceNetworkFactoryPermission();
+        if (request.hasTransport(TRANSPORT_TEST)) {
+            enforceNetworkFactoryOrTestNetworksPermission();
+        } else {
+            enforceNetworkFactoryPermission();
+        }
         mHandler.post(() -> handleReleaseNetworkRequest(request, Binder.getCallingUid(), true));
     }
 
@@ -5816,7 +5837,7 @@
         }
 
         LinkProperties lp = new LinkProperties(linkProperties);
-        lp.ensureDirectlyConnectedRoutes();
+
         // TODO: Instead of passing mDefaultRequest, provide an API to determine whether a Network
         // satisfies mDefaultRequest.
         final NetworkCapabilities nc = new NetworkCapabilities(networkCapabilities);
@@ -5824,8 +5845,11 @@
                 new Network(mNetIdManager.reserveNetId()), new NetworkInfo(networkInfo), lp, nc,
                 currentScore, mContext, mTrackerHandler, new NetworkAgentConfig(networkAgentConfig),
                 this, mNetd, mDnsResolver, mNMS, providerId);
-        // Make sure the network capabilities reflect what the agent info says.
+
+        // Make sure the LinkProperties and NetworkCapabilities reflect what the agent info says.
         nai.getAndSetNetworkCapabilities(mixInCapabilities(nai, nc));
+        processLinkPropertiesFromAgent(nai, nai.linkProperties);
+
         final String extraInfo = networkInfo.getExtraInfo();
         final String name = TextUtils.isEmpty(extraInfo)
                 ? nai.networkCapabilities.getSsid() : extraInfo;
@@ -5863,6 +5887,11 @@
         updateUids(nai, null, nai.networkCapabilities);
     }
 
+    private void processLinkPropertiesFromAgent(NetworkAgentInfo nai, LinkProperties lp) {
+        lp.ensureDirectlyConnectedRoutes();
+        nai.clatd.setNat64PrefixFromRa(lp.getNat64Prefix());
+    }
+
     private void updateLinkProperties(NetworkAgentInfo networkAgent, LinkProperties newLp,
             @NonNull LinkProperties oldLp) {
         int netId = networkAgent.network.netId;
@@ -6390,13 +6419,13 @@
             // Ignore updates for disconnected networks
             return;
         }
-        // newLp is already a defensive copy.
-        newLp.ensureDirectlyConnectedRoutes();
         if (VDBG || DDBG) {
             log("Update of LinkProperties for " + nai.toShortString()
                     + "; created=" + nai.created
                     + "; everConnected=" + nai.everConnected);
         }
+        // TODO: eliminate this defensive copy after confirming that updateLinkProperties does not
+        // modify its oldLp parameter.
         updateLinkProperties(nai, newLp, new LinkProperties(nai.linkProperties));
     }
 
diff --git a/services/core/java/com/android/server/LocationManagerService.java b/services/core/java/com/android/server/LocationManagerService.java
deleted file mode 100644
index 7f25de6b..0000000
--- a/services/core/java/com/android/server/LocationManagerService.java
+++ /dev/null
@@ -1,2737 +0,0 @@
-/*
- * Copyright (C) 2007 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;
-
-import static android.Manifest.permission.ACCESS_FINE_LOCATION;
-import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_AWARE;
-import static android.content.pm.PackageManager.MATCH_SYSTEM_ONLY;
-import static android.content.pm.PackageManager.PERMISSION_GRANTED;
-import static android.location.LocationManager.FUSED_PROVIDER;
-import static android.location.LocationManager.GPS_PROVIDER;
-import static android.location.LocationManager.NETWORK_PROVIDER;
-import static android.location.LocationManager.PASSIVE_PROVIDER;
-import static android.os.PowerManager.locationPowerSaveModeToString;
-
-import static com.android.server.location.CallerIdentity.PERMISSION_COARSE;
-import static com.android.server.location.CallerIdentity.PERMISSION_FINE;
-
-import static java.util.concurrent.TimeUnit.NANOSECONDS;
-
-import android.Manifest;
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.annotation.UserIdInt;
-import android.app.ActivityManager;
-import android.app.PendingIntent;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.location.Address;
-import android.location.Criteria;
-import android.location.GeocoderParams;
-import android.location.Geofence;
-import android.location.GnssCapabilities;
-import android.location.GnssMeasurementCorrections;
-import android.location.GnssRequest;
-import android.location.IBatchedLocationCallback;
-import android.location.IGnssAntennaInfoListener;
-import android.location.IGnssMeasurementsListener;
-import android.location.IGnssNavigationMessageListener;
-import android.location.IGnssStatusListener;
-import android.location.IGpsGeofenceHardware;
-import android.location.ILocationListener;
-import android.location.ILocationManager;
-import android.location.Location;
-import android.location.LocationManager;
-import android.location.LocationManagerInternal;
-import android.location.LocationProvider;
-import android.location.LocationRequest;
-import android.location.LocationTime;
-import android.os.Binder;
-import android.os.Bundle;
-import android.os.CancellationSignal;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.ICancellationSignal;
-import android.os.PowerManager;
-import android.os.PowerManager.ServiceType;
-import android.os.PowerManagerInternal;
-import android.os.Process;
-import android.os.RemoteException;
-import android.os.SystemClock;
-import android.os.UserHandle;
-import android.os.WorkSource;
-import android.os.WorkSource.WorkChain;
-import android.stats.location.LocationStatsEnums;
-import android.text.TextUtils;
-import android.util.EventLog;
-import android.util.Log;
-import android.util.SparseArray;
-import android.util.TimeUtils;
-
-import com.android.internal.annotations.GuardedBy;
-import com.android.internal.content.PackageMonitor;
-import com.android.internal.location.ProviderProperties;
-import com.android.internal.location.ProviderRequest;
-import com.android.internal.util.DumpUtils;
-import com.android.internal.util.IndentingPrintWriter;
-import com.android.internal.util.Preconditions;
-import com.android.server.location.AbstractLocationProvider;
-import com.android.server.location.AbstractLocationProvider.State;
-import com.android.server.location.AppForegroundHelper;
-import com.android.server.location.AppOpsHelper;
-import com.android.server.location.CallerIdentity;
-import com.android.server.location.CallerIdentity.PermissionLevel;
-import com.android.server.location.GeocoderProxy;
-import com.android.server.location.GeofenceManager;
-import com.android.server.location.GeofenceProxy;
-import com.android.server.location.HardwareActivityRecognitionProxy;
-import com.android.server.location.LocationFudger;
-import com.android.server.location.LocationProviderProxy;
-import com.android.server.location.LocationRequestStatistics;
-import com.android.server.location.LocationRequestStatistics.PackageProviderKey;
-import com.android.server.location.LocationRequestStatistics.PackageStatistics;
-import com.android.server.location.LocationUsageLogger;
-import com.android.server.location.MockProvider;
-import com.android.server.location.MockableLocationProvider;
-import com.android.server.location.PassiveProvider;
-import com.android.server.location.SettingsHelper;
-import com.android.server.location.UserInfoHelper;
-import com.android.server.location.UserInfoHelper.UserListener;
-import com.android.server.location.gnss.GnssManagerService;
-import com.android.server.pm.permission.PermissionManagerServiceInternal;
-
-import java.io.ByteArrayOutputStream;
-import java.io.FileDescriptor;
-import java.io.PrintStream;
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Objects;
-import java.util.Set;
-import java.util.TreeMap;
-import java.util.concurrent.CopyOnWriteArrayList;
-
-/**
- * The service class that manages LocationProviders and issues location
- * updates and alerts.
- */
-public class LocationManagerService extends ILocationManager.Stub {
-
-    /**
-     * Controls lifecycle of LocationManagerService.
-     */
-    public static class Lifecycle extends SystemService {
-
-        private final LocationManagerService mService;
-
-        public Lifecycle(Context context) {
-            super(context);
-            mService = new LocationManagerService(context);
-        }
-
-        @Override
-        public void onStart() {
-            // enable client caches by doing the first invalidate
-            LocationManager.invalidateLocalLocationEnabledCaches();
-
-            publishBinderService(Context.LOCATION_SERVICE, mService);
-            // disable caching for whatever process contains LocationManagerService
-            ((LocationManager) mService.mContext.getSystemService(LocationManager.class))
-                    .disableLocalLocationEnabledCaches();
-        }
-
-        @Override
-        public void onBootPhase(int phase) {
-            if (phase == PHASE_SYSTEM_SERVICES_READY) {
-                // the location service must be functioning after this boot phase
-                mService.onSystemReady();
-            } else if (phase == PHASE_THIRD_PARTY_APPS_CAN_START) {
-                // some providers rely on third party code, so we wait to initialize
-                // providers until third party code is allowed to run
-                mService.onSystemThirdPartyAppsCanStart();
-            }
-        }
-    }
-
-    public static final String TAG = "LocationManagerService";
-    public static final boolean D = Log.isLoggable(TAG, Log.DEBUG);
-
-    private static final String WAKELOCK_KEY = "*location*";
-
-    private static final String NETWORK_LOCATION_SERVICE_ACTION =
-            "com.android.location.service.v3.NetworkLocationProvider";
-    private static final String FUSED_LOCATION_SERVICE_ACTION =
-            "com.android.location.service.FusedLocationProvider";
-
-    // The maximum interval a location request can have and still be considered "high power".
-    private static final long HIGH_POWER_INTERVAL_MS = 5 * 60 * 1000;
-
-    // The fastest interval that applications can receive coarse locations
-    private static final long FASTEST_COARSE_INTERVAL_MS = 10 * 60 * 1000;
-
-    // maximum age of a location before it is no longer considered "current"
-    private static final long MAX_CURRENT_LOCATION_AGE_MS = 10 * 1000;
-
-    // Location Providers may sometimes deliver location updates
-    // slightly faster that requested - provide grace period so
-    // we don't unnecessarily filter events that are otherwise on
-    // time
-    private static final int MAX_PROVIDER_SCHEDULING_JITTER_MS = 100;
-
-    private static final String ATTRIBUTION_TAG = "LocationService";
-
-    private static final LocationRequest DEFAULT_LOCATION_REQUEST = new LocationRequest();
-
-    private final Object mLock = new Object();
-    private final Context mContext;
-    private final Handler mHandler;
-    private final LocalService mLocalService;
-    private final AppOpsHelper mAppOpsHelper;
-    private final UserInfoHelper mUserInfoHelper;
-    private final SettingsHelper mSettingsHelper;
-    private final AppForegroundHelper mAppForegroundHelper;
-    private final LocationUsageLogger mLocationUsageLogger;
-
-    @Nullable private GnssManagerService mGnssManagerService = null;
-
-    private final PassiveLocationProviderManager mPassiveManager;
-
-    private PowerManager mPowerManager;
-
-    private GeofenceManager mGeofenceManager;
-    private GeocoderProxy mGeocodeProvider;
-
-    @GuardedBy("mLock")
-    private String mExtraLocationControllerPackage;
-    @GuardedBy("mLock")
-    private boolean mExtraLocationControllerPackageEnabled;
-
-    // @GuardedBy("mLock")
-    // hold lock for write or to prevent write, no lock for read
-    private final CopyOnWriteArrayList<LocationProviderManager> mProviderManagers =
-            new CopyOnWriteArrayList<>();
-
-    @GuardedBy("mLock")
-    private final HashMap<Object, Receiver> mReceivers = new HashMap<>();
-    private final HashMap<String, ArrayList<UpdateRecord>> mRecordsByProvider =
-            new HashMap<>();
-
-    private final LocationRequestStatistics mRequestStatistics = new LocationRequestStatistics();
-
-    @GuardedBy("mLock")
-    @PowerManager.LocationPowerSaveMode
-    private int mBatterySaverMode;
-
-    private LocationManagerService(Context context) {
-        mContext = context.createAttributionContext(ATTRIBUTION_TAG);
-        mHandler = FgThread.getHandler();
-        mLocalService = new LocalService();
-
-        LocalServices.addService(LocationManagerInternal.class, mLocalService);
-
-        mAppOpsHelper = new AppOpsHelper(mContext);
-        mUserInfoHelper = new UserInfoHelper(mContext);
-        mSettingsHelper = new SettingsHelper(mContext, mHandler);
-        mAppForegroundHelper = new AppForegroundHelper(mContext);
-        mLocationUsageLogger = new LocationUsageLogger();
-
-        // set up passive provider - we do this early because it has no dependencies on system
-        // services or external code that isn't ready yet, and because this allows the variable to
-        // be final. other more complex providers are initialized later, when system services are
-        // ready
-        mPassiveManager = new PassiveLocationProviderManager();
-        mProviderManagers.add(mPassiveManager);
-        mPassiveManager.setRealProvider(new PassiveProvider(mContext));
-
-        // Let the package manager query which are the default location
-        // providers as they get certain permissions granted by default.
-        PermissionManagerServiceInternal permissionManagerInternal = LocalServices.getService(
-                PermissionManagerServiceInternal.class);
-        permissionManagerInternal.setLocationPackagesProvider(
-                userId -> mContext.getResources().getStringArray(
-                        com.android.internal.R.array.config_locationProviderPackageNames));
-        permissionManagerInternal.setLocationExtraPackagesProvider(
-                userId -> mContext.getResources().getStringArray(
-                        com.android.internal.R.array.config_locationExtraPackageNames));
-
-        // most startup is deferred until systemReady()
-    }
-
-    private void onSystemReady() {
-        mAppOpsHelper.onSystemReady();
-        mUserInfoHelper.onSystemReady();
-        mSettingsHelper.onSystemReady();
-        mAppForegroundHelper.onSystemReady();
-
-        synchronized (mLock) {
-            mPowerManager = mContext.getSystemService(PowerManager.class);
-            mGeofenceManager = new GeofenceManager(mContext, mSettingsHelper);
-
-            // add listeners
-            mContext.getPackageManager().addOnPermissionsChangeListener(
-                    uid -> {
-                        // listener invoked on ui thread, move to our thread to reduce risk of
-                        // blocking ui thread
-                        mHandler.post(() -> {
-                            synchronized (mLock) {
-                                onPermissionsChangedLocked();
-                            }
-                        });
-                    });
-
-            LocalServices.getService(PowerManagerInternal.class).registerLowPowerModeObserver(
-                    ServiceType.LOCATION,
-                    state -> {
-                        // listener invoked on ui thread, move to our thread to reduce risk of
-                        // blocking ui thread
-                        mHandler.post(() -> {
-                            synchronized (mLock) {
-                                onBatterySaverModeChangedLocked(state.locationMode);
-                            }
-                        });
-                    });
-            mBatterySaverMode = mPowerManager.getLocationPowerSaveMode();
-
-            mAppOpsHelper.addListener(this::onAppOpChanged);
-
-            mSettingsHelper.addOnLocationEnabledChangedListener(this::onLocationModeChanged);
-            mSettingsHelper.addOnBackgroundThrottleIntervalChangedListener(
-                    this::onBackgroundThrottleIntervalChanged);
-            mSettingsHelper.addOnBackgroundThrottlePackageWhitelistChangedListener(
-                    this::onBackgroundThrottleWhitelistChanged);
-            mSettingsHelper.addOnIgnoreSettingsPackageWhitelistChangedListener(
-                    this::onIgnoreSettingsWhitelistChanged);
-
-            PackageMonitor packageMonitor = new PackageMonitor() {
-                @Override
-                public void onPackageDisappeared(String packageName, int reason) {
-                    synchronized (mLock) {
-                        LocationManagerService.this.onPackageDisappeared(packageName);
-                    }
-                }
-            };
-            packageMonitor.register(mContext, null, true, mHandler);
-
-            mUserInfoHelper.addListener(this::onUserChanged);
-
-            mAppForegroundHelper.addListener(this::onAppForegroundChanged);
-
-            IntentFilter screenIntentFilter = new IntentFilter();
-            screenIntentFilter.addAction(Intent.ACTION_SCREEN_OFF);
-            screenIntentFilter.addAction(Intent.ACTION_SCREEN_ON);
-            mContext.registerReceiverAsUser(new BroadcastReceiver() {
-                @Override
-                public void onReceive(Context context, Intent intent) {
-                    if (Intent.ACTION_SCREEN_ON.equals(intent.getAction())
-                            || Intent.ACTION_SCREEN_OFF.equals(intent.getAction())) {
-                        onScreenStateChanged();
-                    }
-                }
-            }, UserHandle.ALL, screenIntentFilter, null, mHandler);
-
-            // initialize the current users. we would get the user started notifications for these
-            // users eventually anyways, but this takes care of it as early as possible.
-            for (int userId: mUserInfoHelper.getCurrentUserIds()) {
-                onUserChanged(userId, UserListener.USER_STARTED);
-            }
-        }
-    }
-
-    private void onSystemThirdPartyAppsCanStart() {
-        synchronized (mLock) {
-            // prepare providers
-            initializeProvidersLocked();
-        }
-    }
-
-    private void onAppOpChanged(String packageName) {
-        synchronized (mLock) {
-            for (Receiver receiver : mReceivers.values()) {
-                if (receiver.mCallerIdentity.packageName.equals(packageName)) {
-                    receiver.updateMonitoring(true);
-                }
-            }
-
-            HashSet<String> affectedProviders = new HashSet<>(mRecordsByProvider.size());
-            for (Entry<String, ArrayList<UpdateRecord>> entry : mRecordsByProvider.entrySet()) {
-                String provider = entry.getKey();
-                for (UpdateRecord record : entry.getValue()) {
-                    if (record.mReceiver.mCallerIdentity.packageName.equals(packageName)) {
-                        affectedProviders.add(provider);
-                    }
-                }
-            }
-            for (String provider : affectedProviders) {
-                applyRequirementsLocked(provider);
-            }
-        }
-    }
-
-    @GuardedBy("mLock")
-    private void onPermissionsChangedLocked() {
-        for (LocationProviderManager manager : mProviderManagers) {
-            applyRequirementsLocked(manager);
-        }
-    }
-
-    @GuardedBy("mLock")
-    private void onBatterySaverModeChangedLocked(int newLocationMode) {
-        if (mBatterySaverMode == newLocationMode) {
-            return;
-        }
-
-        if (D) {
-            Log.d(TAG,
-                    "Battery Saver location mode changed from "
-                            + locationPowerSaveModeToString(mBatterySaverMode) + " to "
-                            + locationPowerSaveModeToString(newLocationMode));
-        }
-
-        mBatterySaverMode = newLocationMode;
-
-        for (LocationProviderManager manager : mProviderManagers) {
-            applyRequirementsLocked(manager);
-        }
-    }
-
-    private void onScreenStateChanged() {
-        synchronized (mLock) {
-            if (mBatterySaverMode == PowerManager.LOCATION_MODE_THROTTLE_REQUESTS_WHEN_SCREEN_OFF) {
-                for (LocationProviderManager manager : mProviderManagers) {
-                    applyRequirementsLocked(manager);
-                }
-            }
-        }
-    }
-
-    private void onLocationModeChanged(int userId) {
-        boolean enabled = mSettingsHelper.isLocationEnabled(userId);
-        LocationManager.invalidateLocalLocationEnabledCaches();
-
-        if (D) {
-            Log.d(TAG, "[u" + userId + "] location enabled = " + enabled);
-        }
-
-        Intent intent = new Intent(LocationManager.MODE_CHANGED_ACTION)
-                .putExtra(LocationManager.EXTRA_LOCATION_ENABLED, enabled)
-                .addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY)
-                .addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
-        mContext.sendBroadcastAsUser(intent, UserHandle.of(userId));
-
-        synchronized (mLock) {
-            for (LocationProviderManager manager : mProviderManagers) {
-                manager.onEnabledChangedLocked(userId);
-            }
-        }
-    }
-
-    private void onPackageDisappeared(String packageName) {
-        synchronized (mLock) {
-            ArrayList<Receiver> deadReceivers = null;
-
-            for (Receiver receiver : mReceivers.values()) {
-                if (receiver.mCallerIdentity.packageName.equals(packageName)) {
-                    if (deadReceivers == null) {
-                        deadReceivers = new ArrayList<>();
-                    }
-                    deadReceivers.add(receiver);
-                }
-            }
-
-            // perform removal outside of mReceivers loop
-            if (deadReceivers != null) {
-                for (Receiver receiver : deadReceivers) {
-                    removeUpdatesLocked(receiver);
-                }
-            }
-        }
-    }
-
-    private void onAppForegroundChanged(int uid, boolean foreground) {
-        synchronized (mLock) {
-            HashSet<String> affectedProviders = new HashSet<>(mRecordsByProvider.size());
-            for (Entry<String, ArrayList<UpdateRecord>> entry : mRecordsByProvider.entrySet()) {
-                String provider = entry.getKey();
-                for (UpdateRecord record : entry.getValue()) {
-                    if (record.mReceiver.mCallerIdentity.uid == uid
-                            && record.mIsForegroundUid != foreground) {
-                        record.updateForeground(foreground);
-
-                        if (!isThrottlingExempt(record.mReceiver.mCallerIdentity)) {
-                            affectedProviders.add(provider);
-                        }
-                    }
-                }
-            }
-            for (String provider : affectedProviders) {
-                applyRequirementsLocked(provider);
-            }
-        }
-    }
-
-    private void onBackgroundThrottleIntervalChanged() {
-        synchronized (mLock) {
-            for (LocationProviderManager manager : mProviderManagers) {
-                applyRequirementsLocked(manager);
-            }
-        }
-    }
-
-    private void onBackgroundThrottleWhitelistChanged() {
-        synchronized (mLock) {
-            for (LocationProviderManager manager : mProviderManagers) {
-                applyRequirementsLocked(manager);
-            }
-        }
-    }
-
-    private void onIgnoreSettingsWhitelistChanged() {
-        synchronized (mLock) {
-            for (LocationProviderManager manager : mProviderManagers) {
-                applyRequirementsLocked(manager);
-            }
-        }
-    }
-
-    @GuardedBy("mLock")
-    private void initializeProvidersLocked() {
-        LocationProviderProxy networkProvider = LocationProviderProxy.createAndRegister(
-                mContext,
-                NETWORK_LOCATION_SERVICE_ACTION,
-                com.android.internal.R.bool.config_enableNetworkLocationOverlay,
-                com.android.internal.R.string.config_networkLocationProviderPackageName);
-        if (networkProvider != null) {
-            LocationProviderManager networkManager = new LocationProviderManager(NETWORK_PROVIDER);
-            mProviderManagers.add(networkManager);
-            networkManager.setRealProvider(networkProvider);
-        } else {
-            Log.w(TAG, "no network location provider found");
-        }
-
-        // ensure that a fused provider exists which will work in direct boot
-        Preconditions.checkState(!mContext.getPackageManager().queryIntentServicesAsUser(
-                new Intent(FUSED_LOCATION_SERVICE_ACTION),
-                MATCH_DIRECT_BOOT_AWARE | MATCH_SYSTEM_ONLY, UserHandle.USER_SYSTEM).isEmpty(),
-                "Unable to find a direct boot aware fused location provider");
-
-        // bind to fused provider
-        LocationProviderProxy fusedProvider = LocationProviderProxy.createAndRegister(
-                mContext,
-                FUSED_LOCATION_SERVICE_ACTION,
-                com.android.internal.R.bool.config_enableFusedLocationOverlay,
-                com.android.internal.R.string.config_fusedLocationProviderPackageName);
-        if (fusedProvider != null) {
-            LocationProviderManager fusedManager = new LocationProviderManager(FUSED_PROVIDER);
-            mProviderManagers.add(fusedManager);
-            fusedManager.setRealProvider(fusedProvider);
-        } else {
-            Log.e(TAG, "no fused location provider found");
-        }
-
-        // bind to geocoder provider
-        mGeocodeProvider = GeocoderProxy.createAndRegister(mContext);
-        if (mGeocodeProvider == null) {
-            Log.e(TAG, "no geocoder provider found");
-        }
-
-        // bind to hardware activity recognition
-        HardwareActivityRecognitionProxy hardwareActivityRecognitionProxy =
-                HardwareActivityRecognitionProxy.createAndRegister(mContext);
-        if (hardwareActivityRecognitionProxy == null) {
-            Log.e(TAG, "unable to bind ActivityRecognitionProxy");
-        }
-
-        String[] testProviderStrings = mContext.getResources().getStringArray(
-                com.android.internal.R.array.config_testLocationProviders);
-        for (String testProviderString : testProviderStrings) {
-            String[] fragments = testProviderString.split(",");
-            String name = fragments[0].trim();
-            ProviderProperties properties = new ProviderProperties(
-                    Boolean.parseBoolean(fragments[1]) /* requiresNetwork */,
-                    Boolean.parseBoolean(fragments[2]) /* requiresSatellite */,
-                    Boolean.parseBoolean(fragments[3]) /* requiresCell */,
-                    Boolean.parseBoolean(fragments[4]) /* hasMonetaryCost */,
-                    Boolean.parseBoolean(fragments[5]) /* supportsAltitude */,
-                    Boolean.parseBoolean(fragments[6]) /* supportsSpeed */,
-                    Boolean.parseBoolean(fragments[7]) /* supportsBearing */,
-                    Integer.parseInt(fragments[8]) /* powerRequirement */,
-                    Integer.parseInt(fragments[9]) /* accuracy */);
-            LocationProviderManager manager = getLocationProviderManager(name);
-            if (manager == null) {
-                manager = new LocationProviderManager(name);
-                mProviderManagers.add(manager);
-            }
-            manager.setMockProvider(new MockProvider(properties));
-        }
-
-        // initialize gnss last because it has no awareness of boot phases and blindly assumes that
-        // all other location providers are loaded at initialization
-        if (GnssManagerService.isGnssSupported()) {
-            mGnssManagerService = new GnssManagerService(mContext, mAppOpsHelper, mSettingsHelper,
-                    mAppForegroundHelper, mLocationUsageLogger);
-            mGnssManagerService.onSystemReady();
-
-            LocationProviderManager gnssManager = new LocationProviderManager(GPS_PROVIDER);
-            mProviderManagers.add(gnssManager);
-            gnssManager.setRealProvider(mGnssManagerService.getGnssLocationProvider());
-
-            // bind to geofence proxy
-            IGpsGeofenceHardware gpsGeofenceHardware = mGnssManagerService.getGpsGeofenceProxy();
-            if (gpsGeofenceHardware != null) {
-                GeofenceProxy provider = GeofenceProxy.createAndBind(mContext, gpsGeofenceHardware);
-                if (provider == null) {
-                    Log.e(TAG, "unable to bind to GeofenceProxy");
-                }
-            }
-        }
-    }
-
-    private void onUserChanged(@UserIdInt int userId, @UserListener.UserChange int change) {
-        switch (change) {
-            case UserListener.USER_SWITCHED:
-                if (D) {
-                    Log.d(TAG, "user " + userId + " current status changed");
-                }
-                synchronized (mLock) {
-                    for (LocationProviderManager manager : mProviderManagers) {
-                        manager.onEnabledChangedLocked(userId);
-                    }
-                }
-                break;
-            case UserListener.USER_STARTED:
-                if (D) {
-                    Log.d(TAG, "user " + userId + " started");
-                }
-                synchronized (mLock) {
-                    for (LocationProviderManager manager : mProviderManagers) {
-                        manager.onUserStarted(userId);
-                    }
-                }
-                break;
-            case UserListener.USER_STOPPED:
-                if (D) {
-                    Log.d(TAG, "user " + userId + " stopped");
-                }
-                synchronized (mLock) {
-                    for (LocationProviderManager manager : mProviderManagers) {
-                        manager.onUserStopped(userId);
-                    }
-                }
-                break;
-        }
-    }
-
-    /**
-     * Location provider manager, manages a LocationProvider.
-     */
-    class LocationProviderManager implements MockableLocationProvider.Listener {
-
-        private final String mName;
-
-        private final LocationFudger mLocationFudger;
-
-        // if the provider is enabled for a given user id - null or not present means unknown
-        @GuardedBy("mLock")
-        private final SparseArray<Boolean> mEnabled;
-
-        // last location for a given user
-        @GuardedBy("mLock")
-        private final SparseArray<Location> mLastLocation;
-
-        // last coarse location for a given user
-        @GuardedBy("mLock")
-        private final SparseArray<Location> mLastCoarseLocation;
-
-        // acquiring mLock makes operations on mProvider atomic, but is otherwise unnecessary
-        protected final MockableLocationProvider mProvider;
-
-        private LocationProviderManager(String name) {
-            mName = name;
-            mLocationFudger = new LocationFudger(mSettingsHelper.getCoarseLocationAccuracyM());
-            mEnabled = new SparseArray<>(2);
-            mLastLocation = new SparseArray<>(2);
-            mLastCoarseLocation = new SparseArray<>(2);
-
-            // initialize last since this lets our reference escape
-            mProvider = new MockableLocationProvider(mLock, this);
-        }
-
-        public String getName() {
-            return mName;
-        }
-
-        public boolean hasProvider() {
-            return mProvider.getProvider() != null;
-        }
-
-        public void setRealProvider(AbstractLocationProvider provider) {
-            mProvider.setRealProvider(provider);
-        }
-
-        public void setMockProvider(@Nullable MockProvider provider) {
-            synchronized (mLock) {
-                mProvider.setMockProvider(provider);
-
-                // when removing a mock provider, also clear any mock last locations and reset the
-                // location fudger. the mock provider could have been used to infer the current
-                // location fudger offsets.
-                if (provider == null) {
-                    for (int i = 0; i < mLastLocation.size(); i++) {
-                        Location lastLocation = mLastLocation.valueAt(i);
-                        if (lastLocation != null && lastLocation.isFromMockProvider()) {
-                            mLastLocation.setValueAt(i, null);
-                        }
-                    }
-
-                    for (int i = 0; i < mLastCoarseLocation.size(); i++) {
-                        Location lastCoarseLocation = mLastCoarseLocation.valueAt(i);
-                        if (lastCoarseLocation != null && lastCoarseLocation.isFromMockProvider()) {
-                            mLastCoarseLocation.setValueAt(i, null);
-                        }
-                    }
-
-                    mLocationFudger.resetOffsets();
-                }
-            }
-        }
-
-        public Set<String> getPackages() {
-            return mProvider.getState().providerPackageNames;
-        }
-
-        @Nullable
-        public ProviderProperties getProperties() {
-            return mProvider.getState().properties;
-        }
-
-        @Nullable
-        public Location getLastLocation(int userId, @PermissionLevel int permissionlevel) {
-            synchronized (mLock) {
-                switch (permissionlevel) {
-                    case PERMISSION_COARSE:
-                        return mLastCoarseLocation.get(userId);
-                    case PERMISSION_FINE:
-                        return mLastLocation.get(userId);
-                    default:
-                        throw new AssertionError();
-                }
-            }
-        }
-
-        public void injectLastLocation(Location location, int userId) {
-            synchronized (mLock) {
-                if (mLastLocation.get(userId) == null) {
-                    setLastLocation(location, userId);
-                }
-            }
-        }
-
-        private void setLastLocation(Location location, int userId) {
-            synchronized (mLock) {
-                mLastLocation.put(userId, location);
-
-                // update last coarse interval only if enough time has passed
-                long timeDeltaMs = Long.MAX_VALUE;
-                Location coarseLocation = mLastCoarseLocation.get(userId);
-                if (coarseLocation != null) {
-                    timeDeltaMs = NANOSECONDS.toMillis(location.getElapsedRealtimeNanos())
-                            - NANOSECONDS.toMillis(coarseLocation.getElapsedRealtimeNanos());
-                }
-                if (timeDeltaMs > FASTEST_COARSE_INTERVAL_MS) {
-                    mLastCoarseLocation.put(userId, mLocationFudger.createCoarse(location));
-                }
-            }
-        }
-
-        public void setMockProviderAllowed(boolean enabled) {
-            synchronized (mLock) {
-                if (!mProvider.isMock()) {
-                    throw new IllegalArgumentException(mName + " provider is not a test provider");
-                }
-
-                mProvider.setMockProviderAllowed(enabled);
-            }
-        }
-
-        public void setMockProviderLocation(Location location) {
-            synchronized (mLock) {
-                if (!mProvider.isMock()) {
-                    throw new IllegalArgumentException(mName + " provider is not a test provider");
-                }
-
-                String locationProvider = location.getProvider();
-                if (!TextUtils.isEmpty(locationProvider) && !mName.equals(locationProvider)) {
-                    // The location has an explicit provider that is different from the mock
-                    // provider name. The caller may be trying to fool us via b/33091107.
-                    EventLog.writeEvent(0x534e4554, "33091107", Binder.getCallingUid(),
-                            mName + "!=" + locationProvider);
-                }
-
-                mProvider.setMockProviderLocation(location);
-            }
-        }
-
-        public List<LocationRequest> getMockProviderRequests() {
-            synchronized (mLock) {
-                if (!mProvider.isMock()) {
-                    throw new IllegalArgumentException(mName + " provider is not a test provider");
-                }
-
-                return mProvider.getCurrentRequest().locationRequests;
-            }
-        }
-
-        public void setRequest(ProviderRequest request) {
-            mProvider.setRequest(request);
-        }
-
-        public void sendExtraCommand(int uid, int pid, String command, Bundle extras) {
-            mProvider.sendExtraCommand(uid, pid, command, extras);
-        }
-
-        @GuardedBy("mLock")
-        @Override
-        public void onReportLocation(Location location) {
-            // don't validate mock locations
-            if (!location.isFromMockProvider()) {
-                if (location.getLatitude() == 0 && location.getLongitude() == 0) {
-                    Log.w(TAG, "blocking 0,0 location from " + mName + " provider");
-                    return;
-                }
-            }
-
-            if (!location.isComplete()) {
-                Log.w(TAG, "blocking incomplete location from " + mName + " provider");
-                return;
-            }
-
-            // update last location if the provider is enabled or if servicing a bypass request
-            boolean locationSettingsIgnored = mProvider.getCurrentRequest().locationSettingsIgnored;
-            for (int userId : mUserInfoHelper.getCurrentUserIds()) {
-                if (locationSettingsIgnored || isEnabled(userId)) {
-                    setLastLocation(location, userId);
-                }
-            }
-
-            handleLocationChangedLocked(this, location, mLocationFudger.createCoarse(location));
-        }
-
-        @GuardedBy("mLock")
-        @Override
-        public void onReportLocation(List<Location> locations) {
-            if (mGnssManagerService == null || !GPS_PROVIDER.equals(mName)) {
-                return;
-            }
-
-            mGnssManagerService.onReportLocation(locations);
-        }
-
-        @GuardedBy("mLock")
-        @Override
-        public void onStateChanged(State oldState, State newState) {
-            if (oldState.allowed != newState.allowed) {
-                onEnabledChangedLocked(UserHandle.USER_ALL);
-            }
-        }
-
-        public void onUserStarted(int userId) {
-            synchronized (mLock) {
-                // clear the user's enabled state in order to force a reevalution of whether the
-                // provider is enabled or disabled for the given user. we clear the user's state
-                // first to ensure that a user starting never causes any change notifications. it's
-                // possible for us to observe a user before we observe it's been started (for
-                // example, another component gets a user started notification before us and
-                // registers a location request immediately), which would cause us to already have
-                // some state in place. when we eventually do get the user started notification
-                // ourselves we don't want to send a change notification based on the prior state
-                mEnabled.put(userId, null);
-                onEnabledChangedLocked(userId);
-            }
-        }
-
-        public void onUserStopped(int userId) {
-            synchronized (mLock) {
-                mEnabled.remove(userId);
-                mLastLocation.remove(userId);
-                mLastCoarseLocation.remove(userId);
-            }
-        }
-
-        public boolean isEnabled(int userId) {
-            if (userId == UserHandle.USER_NULL) {
-                // used during initialization - ignore since many lower level operations (checking
-                // settings for instance) do not support the null user
-                return false;
-            }
-
-            synchronized (mLock) {
-                Boolean enabled = mEnabled.get(userId);
-                if (enabled == null) {
-                    // this generally shouldn't occur, but might be possible due to race conditions
-                    // on when we are notified of new users
-                    Log.w(TAG, mName + " provider saw user " + userId + " unexpectedly");
-                    onEnabledChangedLocked(userId);
-                    enabled = Objects.requireNonNull(mEnabled.get(userId));
-                }
-
-                return enabled;
-            }
-        }
-
-        @GuardedBy("mLock")
-        public void onEnabledChangedLocked(int userId) {
-            if (userId == UserHandle.USER_NULL) {
-                // used during initialization - ignore since many lower level operations (checking
-                // settings for instance) do not support the null user
-                return;
-            } else if (userId == UserHandle.USER_ALL) {
-                // we know enabled changes can only happen for current users since providers are
-                // always disabled for all non-current users
-                for (int currentUserId : mUserInfoHelper.getCurrentUserIds()) {
-                    onEnabledChangedLocked(currentUserId);
-                }
-                return;
-            }
-
-            // if any property that contributes to "enabled" here changes state, it MUST result
-            // in a direct or indrect call to onEnabledChangedLocked. this allows the provider to
-            // guarantee that it will always eventually reach the correct state.
-            boolean enabled = mProvider.getState().allowed
-                    && mUserInfoHelper.isCurrentUserId(userId)
-                    && mSettingsHelper.isLocationEnabled(userId);
-
-            Boolean wasEnabled = mEnabled.get(userId);
-            if (wasEnabled != null && wasEnabled == enabled) {
-                return;
-            }
-
-            mEnabled.put(userId, enabled);
-
-            if (D) {
-                Log.d(TAG, "[u" + userId + "] " + mName + " provider enabled = " + enabled);
-            }
-
-            // clear last locations if we become disabled and if not servicing a bypass request
-            if (!enabled && !mProvider.getCurrentRequest().locationSettingsIgnored) {
-                mLastLocation.put(userId, null);
-                mLastCoarseLocation.put(userId, null);
-            }
-
-            // update LOCATION_PROVIDERS_ALLOWED for best effort backwards compatibility
-            mSettingsHelper.setLocationProviderAllowed(mName, enabled, userId);
-
-            // do not send change notifications if we just saw this user for the first time
-            if (wasEnabled != null) {
-                // fused and passive provider never get public updates for legacy reasons
-                if (!FUSED_PROVIDER.equals(mName) && !PASSIVE_PROVIDER.equals(mName)) {
-                    Intent intent = new Intent(LocationManager.PROVIDERS_CHANGED_ACTION)
-                            .putExtra(LocationManager.EXTRA_PROVIDER_NAME, mName)
-                            .putExtra(LocationManager.EXTRA_PROVIDER_ENABLED, enabled)
-                            .addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY)
-                            .addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
-                    mContext.sendBroadcastAsUser(intent, UserHandle.of(userId));
-                }
-            }
-
-            updateProviderEnabledLocked(this, enabled);
-        }
-
-        public void dump(FileDescriptor fd, IndentingPrintWriter pw, String[] args) {
-            synchronized (mLock) {
-                pw.print(mName + " provider");
-                if (mProvider.isMock()) {
-                    pw.print(" [mock]");
-                }
-                pw.println(":");
-
-                pw.increaseIndent();
-
-                // for now we only dump for the parent user
-                int userId = mUserInfoHelper.getCurrentUserIds()[0];
-                pw.println("last location=" + mLastLocation.get(userId));
-                pw.println("last coarse location=" + mLastCoarseLocation.get(userId));
-                pw.println("enabled=" + isEnabled(userId));
-            }
-
-            mProvider.dump(fd, pw, args);
-
-            pw.decreaseIndent();
-        }
-    }
-
-    class PassiveLocationProviderManager extends LocationProviderManager {
-
-        private PassiveLocationProviderManager() {
-            super(PASSIVE_PROVIDER);
-        }
-
-        @Override
-        public void setRealProvider(AbstractLocationProvider provider) {
-            Preconditions.checkArgument(provider instanceof PassiveProvider);
-            super.setRealProvider(provider);
-        }
-
-        @Override
-        public void setMockProvider(@Nullable MockProvider provider) {
-            if (provider != null) {
-                throw new IllegalArgumentException("Cannot mock the passive provider");
-            }
-        }
-
-        public void updateLocation(Location location) {
-            synchronized (mLock) {
-                PassiveProvider passiveProvider = (PassiveProvider) mProvider.getProvider();
-                Preconditions.checkState(passiveProvider != null);
-
-                long identity = Binder.clearCallingIdentity();
-                try {
-                    passiveProvider.updateLocation(location);
-                } finally {
-                    Binder.restoreCallingIdentity(identity);
-                }
-            }
-        }
-    }
-
-    /**
-     * A wrapper class holding either an ILocationListener or a PendingIntent to receive
-     * location updates.
-     */
-    private final class Receiver extends LocationManagerServiceUtils.LinkedListenerBase implements
-            PendingIntent.OnFinished {
-        private static final long WAKELOCK_TIMEOUT_MILLIS = 60 * 1000;
-
-        private final ILocationListener mListener;
-        final PendingIntent mPendingIntent;
-        final WorkSource mWorkSource; // WorkSource for battery blame, or null to assign to caller.
-        private final boolean mHideFromAppOps; // True if AppOps should not monitor this receiver.
-        private final Object mKey;
-
-        final HashMap<String, UpdateRecord> mUpdateRecords = new HashMap<>();
-
-        // True if app ops has started monitoring this receiver for locations.
-        private boolean mOpMonitoring;
-        // True if app ops has started monitoring this receiver for high power (gps) locations.
-        private boolean mOpHighPowerMonitoring;
-        private int mPendingBroadcasts;
-        PowerManager.WakeLock mWakeLock;
-
-        private Receiver(ILocationListener listener, PendingIntent intent, CallerIdentity identity,
-                WorkSource workSource, boolean hideFromAppOps) {
-            super(identity);
-            mListener = listener;
-            mPendingIntent = intent;
-            if (listener != null) {
-                mKey = listener.asBinder();
-            } else {
-                mKey = intent;
-            }
-            if (workSource != null && workSource.isEmpty()) {
-                workSource = null;
-            }
-            mWorkSource = workSource;
-            mHideFromAppOps = hideFromAppOps;
-
-            updateMonitoring(true);
-
-            // construct/configure wakelock
-            mWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, WAKELOCK_KEY);
-            if (workSource == null) {
-                workSource = new WorkSource(mCallerIdentity.uid, mCallerIdentity.packageName);
-            }
-            mWakeLock.setWorkSource(workSource);
-
-            // For a non-reference counted wakelock, each acquire will reset the timeout, and we
-            // only need to release it once.
-            mWakeLock.setReferenceCounted(false);
-        }
-
-        @Override
-        public boolean equals(Object otherObj) {
-            return (otherObj instanceof Receiver) && mKey.equals(((Receiver) otherObj).mKey);
-        }
-
-        @Override
-        public int hashCode() {
-            return mKey.hashCode();
-        }
-
-        @Override
-        public String toString() {
-            StringBuilder s = new StringBuilder();
-            s.append("Reciever[");
-            s.append(Integer.toHexString(System.identityHashCode(this)));
-            if (mListener != null) {
-                s.append(" listener");
-            } else {
-                s.append(" intent");
-            }
-            for (String p : mUpdateRecords.keySet()) {
-                s.append(" ").append(mUpdateRecords.get(p).toString());
-            }
-            s.append(" monitoring location: ").append(mOpMonitoring);
-            s.append("]");
-            return s.toString();
-        }
-
-        /**
-         * Update AppOp monitoring for this receiver.
-         *
-         * @param allow If true receiver is currently active, if false it's been removed.
-         */
-        public void updateMonitoring(boolean allow) {
-            if (mHideFromAppOps) {
-                return;
-            }
-
-            boolean requestingLocation = false;
-            boolean requestingHighPowerLocation = false;
-            if (allow) {
-                // See if receiver has any enabled update records.  Also note if any update records
-                // are high power (has a high power provider with an interval under a threshold).
-                for (UpdateRecord updateRecord : mUpdateRecords.values()) {
-                    LocationProviderManager manager = getLocationProviderManager(
-                            updateRecord.mProvider);
-                    if (manager == null) {
-                        continue;
-                    }
-                    if (!manager.isEnabled(UserHandle.getUserId(mCallerIdentity.uid))
-                            && !isSettingsExempt(updateRecord)) {
-                        continue;
-                    }
-
-                    requestingLocation = true;
-                    ProviderProperties properties = manager.getProperties();
-                    if (properties != null
-                            && properties.mPowerRequirement == Criteria.POWER_HIGH
-                            && updateRecord.mRequest.getInterval() < HIGH_POWER_INTERVAL_MS) {
-                        requestingHighPowerLocation = true;
-                        break;
-                    }
-                }
-            }
-
-            // First update monitoring of any location request (including high power).
-            mOpMonitoring = updateMonitoring(
-                    requestingLocation,
-                    mOpMonitoring,
-                    false);
-
-            // Now update monitoring of high power requests only.
-            boolean wasHighPowerMonitoring = mOpHighPowerMonitoring;
-            mOpHighPowerMonitoring = updateMonitoring(
-                    requestingHighPowerLocation,
-                    mOpHighPowerMonitoring,
-                    true);
-            if (mOpHighPowerMonitoring != wasHighPowerMonitoring) {
-                long identity = Binder.clearCallingIdentity();
-                try {
-                    // Send an intent to notify that a high power request has been added/removed.
-                    Intent intent = new Intent(LocationManager.HIGH_POWER_REQUEST_CHANGE_ACTION);
-                    mContext.sendBroadcastAsUser(intent, UserHandle.ALL);
-                } finally {
-                    Binder.restoreCallingIdentity(identity);
-                }
-            }
-        }
-
-        private boolean updateMonitoring(boolean allowMonitoring, boolean currentlyMonitoring,
-                boolean highPower) {
-            if (!currentlyMonitoring) {
-                if (allowMonitoring) {
-                    if (!highPower) {
-                        return mAppOpsHelper.startLocationMonitoring(mCallerIdentity);
-                    } else {
-                        return mAppOpsHelper.startHighPowerLocationMonitoring(mCallerIdentity);
-                    }
-                }
-            } else {
-                if (!allowMonitoring || !mAppOpsHelper.checkLocationAccess(mCallerIdentity)) {
-                    if (!highPower) {
-                        mAppOpsHelper.stopLocationMonitoring(mCallerIdentity);
-                    } else {
-                        mAppOpsHelper.stopHighPowerLocationMonitoring(mCallerIdentity);
-                    }
-                    return false;
-                }
-            }
-
-            return currentlyMonitoring;
-        }
-
-        public boolean isListener() {
-            return mListener != null;
-        }
-
-        public boolean isPendingIntent() {
-            return mPendingIntent != null;
-        }
-
-        public ILocationListener getListener() {
-            if (mListener != null) {
-                return mListener;
-            }
-            throw new IllegalStateException("Request for non-existent listener");
-        }
-
-        public boolean callLocationChangedLocked(Location location) {
-            if (mListener != null) {
-                try {
-                    mListener.onLocationChanged(new Location(location));
-                    // call this after broadcasting so we do not increment
-                    // if we throw an exception.
-                    incrementPendingBroadcastsLocked();
-                } catch (RemoteException e) {
-                    return false;
-                }
-            } else {
-                Intent locationChanged = new Intent();
-                locationChanged.putExtra(LocationManager.KEY_LOCATION_CHANGED,
-                        new Location(location));
-                try {
-                    mPendingIntent.send(mContext, 0, locationChanged, this, mHandler,
-                            CallerIdentity.asPermission(mCallerIdentity.permissionLevel),
-                            PendingIntentUtils.createDontSendToRestrictedAppsBundle(null));
-                    // call this after broadcasting so we do not increment
-                    // if we throw an exception.
-                    incrementPendingBroadcastsLocked();
-                } catch (PendingIntent.CanceledException e) {
-                    return false;
-                }
-            }
-            return true;
-        }
-
-        private boolean callProviderEnabledLocked(String provider, boolean enabled) {
-            // First update AppOp monitoring.
-            // An app may get/lose location access as providers are enabled/disabled.
-            updateMonitoring(true);
-
-            if (mListener != null) {
-                try {
-                    if (enabled) {
-                        mListener.onProviderEnabled(provider);
-                    } else {
-                        mListener.onProviderDisabled(provider);
-                    }
-                    // call this after broadcasting so we do not increment
-                    // if we throw an exception.
-                    incrementPendingBroadcastsLocked();
-                } catch (RemoteException e) {
-                    return false;
-                }
-            } else {
-                Intent providerIntent = new Intent();
-                providerIntent.putExtra(LocationManager.KEY_PROVIDER_ENABLED, enabled);
-                try {
-                    mPendingIntent.send(mContext, 0, providerIntent, this, mHandler,
-                            CallerIdentity.asPermission(mCallerIdentity.permissionLevel),
-                            PendingIntentUtils.createDontSendToRestrictedAppsBundle(null));
-                    // call this after broadcasting so we do not increment
-                    // if we throw an exception.
-                    incrementPendingBroadcastsLocked();
-                } catch (PendingIntent.CanceledException e) {
-                    return false;
-                }
-            }
-            return true;
-        }
-
-        public void callRemovedLocked() {
-            if (mListener != null) {
-                try {
-                    mListener.onRemoved();
-                } catch (RemoteException e) {
-                    // doesn't matter
-                }
-            }
-        }
-
-        @Override
-        public void binderDied() {
-            synchronized (mLock) {
-                removeUpdatesLocked(this);
-                clearPendingBroadcastsLocked();
-            }
-        }
-
-        @Override
-        public void onSendFinished(PendingIntent pendingIntent, Intent intent,
-                int resultCode, String resultData, Bundle resultExtras) {
-            synchronized (mLock) {
-                decrementPendingBroadcastsLocked();
-            }
-        }
-
-        // this must be called while synchronized by caller in a synchronized block
-        // containing the sending of the broadcaset
-        private void incrementPendingBroadcastsLocked() {
-            mPendingBroadcasts++;
-            // so wakelock calls will succeed
-            long identity = Binder.clearCallingIdentity();
-            try {
-                mWakeLock.acquire(WAKELOCK_TIMEOUT_MILLIS);
-            } finally {
-                Binder.restoreCallingIdentity(identity);
-            }
-        }
-
-        private void decrementPendingBroadcastsLocked() {
-            if (--mPendingBroadcasts == 0) {
-                // so wakelock calls will succeed
-                long identity = Binder.clearCallingIdentity();
-                try {
-                    if (mWakeLock.isHeld()) {
-                        mWakeLock.release();
-                    }
-                } finally {
-                    Binder.restoreCallingIdentity(identity);
-                }
-            }
-        }
-
-        public void clearPendingBroadcastsLocked() {
-            if (mPendingBroadcasts > 0) {
-                mPendingBroadcasts = 0;
-                // so wakelock calls will succeed
-                long identity = Binder.clearCallingIdentity();
-                try {
-                    if (mWakeLock.isHeld()) {
-                        mWakeLock.release();
-                    }
-                } finally {
-                    Binder.restoreCallingIdentity(identity);
-                }
-            }
-        }
-    }
-
-    @Override
-    public void locationCallbackFinished(ILocationListener listener) {
-        //Do not use getReceiverLocked here as that will add the ILocationListener to
-        //the receiver list if it is not found.  If it is not found then the
-        //LocationListener was removed when it had a pending broadcast and should
-        //not be added back.
-        synchronized (mLock) {
-            Receiver receiver = mReceivers.get(listener.asBinder());
-            if (receiver != null) {
-                receiver.decrementPendingBroadcastsLocked();
-            }
-        }
-    }
-
-    @Override
-    public int getGnssYearOfHardware() {
-        return mGnssManagerService == null ? 0 : mGnssManagerService.getGnssYearOfHardware();
-    }
-
-    @Override
-    @Nullable
-    public String getGnssHardwareModelName() {
-        return mGnssManagerService == null ? "" : mGnssManagerService.getGnssHardwareModelName();
-    }
-
-    @Override
-    public int getGnssBatchSize(String packageName) {
-        return mGnssManagerService == null ? 0 : mGnssManagerService.getGnssBatchSize(packageName);
-    }
-
-    @Override
-    public boolean addGnssBatchingCallback(IBatchedLocationCallback callback, String packageName,
-            String featureId) {
-        return mGnssManagerService != null && mGnssManagerService.addGnssBatchingCallback(
-                callback, packageName, featureId);
-    }
-
-    @Override
-    public void removeGnssBatchingCallback() {
-        if (mGnssManagerService != null) mGnssManagerService.removeGnssBatchingCallback();
-    }
-
-    @Override
-    public boolean startGnssBatch(long periodNanos, boolean wakeOnFifoFull, String packageName,
-            String featureId) {
-        return mGnssManagerService != null && mGnssManagerService.startGnssBatch(periodNanos,
-                wakeOnFifoFull, packageName, featureId);
-    }
-
-    @Override
-    public void flushGnssBatch(String packageName) {
-        if (mGnssManagerService != null) mGnssManagerService.flushGnssBatch(packageName);
-    }
-
-    @Override
-    public boolean stopGnssBatch() {
-        return mGnssManagerService != null && mGnssManagerService.stopGnssBatch();
-    }
-
-    @Nullable
-    private LocationProviderManager getLocationProviderManager(String providerName) {
-        for (LocationProviderManager manager : mProviderManagers) {
-            if (providerName.equals(manager.getName())) {
-                return manager;
-            }
-        }
-
-        return null;
-    }
-
-    @Override
-    public List<String> getAllProviders() {
-        ArrayList<String> providers = new ArrayList<>(mProviderManagers.size());
-        for (LocationProviderManager manager : mProviderManagers) {
-            if (FUSED_PROVIDER.equals(manager.getName())) {
-                continue;
-            }
-            providers.add(manager.getName());
-        }
-        return providers;
-    }
-
-    @Override
-    public List<String> getProviders(Criteria criteria, boolean enabledOnly) {
-        if (!CallerIdentity.checkCallingOrSelfLocationPermission(mContext)) {
-            return Collections.emptyList();
-        }
-
-        synchronized (mLock) {
-            ArrayList<String> providers = new ArrayList<>(mProviderManagers.size());
-            for (LocationProviderManager manager : mProviderManagers) {
-                String name = manager.getName();
-                if (FUSED_PROVIDER.equals(name)) {
-                    continue;
-                }
-                if (enabledOnly && !manager.isEnabled(UserHandle.getCallingUserId())) {
-                    continue;
-                }
-                if (criteria != null && !LocationProvider.propertiesMeetCriteria(name,
-                        manager.getProperties(), criteria)) {
-                    continue;
-                }
-                providers.add(name);
-            }
-            return providers;
-        }
-    }
-
-    @Override
-    public String getBestProvider(Criteria criteria, boolean enabledOnly) {
-        List<String> providers;
-        synchronized (mLock) {
-            providers = getProviders(criteria, enabledOnly);
-            if (providers.isEmpty()) {
-                providers = getProviders(null, enabledOnly);
-            }
-        }
-
-        if (!providers.isEmpty()) {
-            if (providers.contains(GPS_PROVIDER)) {
-                return GPS_PROVIDER;
-            } else if (providers.contains(NETWORK_PROVIDER)) {
-                return NETWORK_PROVIDER;
-            } else {
-                return providers.get(0);
-            }
-        }
-
-        return null;
-    }
-
-    @GuardedBy("mLock")
-    private void updateProviderEnabledLocked(LocationProviderManager manager, boolean enabled) {
-        ArrayList<Receiver> deadReceivers = null;
-        ArrayList<UpdateRecord> records = mRecordsByProvider.get(manager.getName());
-        if (records != null) {
-            for (UpdateRecord record : records) {
-                if (!mUserInfoHelper.isCurrentUserId(
-                        UserHandle.getUserId(record.mReceiver.mCallerIdentity.uid))) {
-                    continue;
-                }
-
-                // requests that ignore location settings will never provide notifications
-                if (isSettingsExempt(record)) {
-                    continue;
-                }
-
-                // Sends a notification message to the receiver
-                if (!record.mReceiver.callProviderEnabledLocked(manager.getName(), enabled)) {
-                    if (deadReceivers == null) {
-                        deadReceivers = new ArrayList<>();
-                    }
-                    deadReceivers.add(record.mReceiver);
-                }
-            }
-        }
-
-        if (deadReceivers != null) {
-            for (int i = deadReceivers.size() - 1; i >= 0; i--) {
-                removeUpdatesLocked(deadReceivers.get(i));
-            }
-        }
-
-        applyRequirementsLocked(manager);
-    }
-
-    @GuardedBy("mLock")
-    private void applyRequirementsLocked(String providerName) {
-        LocationProviderManager manager = getLocationProviderManager(providerName);
-        if (manager != null) {
-            applyRequirementsLocked(manager);
-        }
-    }
-
-    @GuardedBy("mLock")
-    private void applyRequirementsLocked(LocationProviderManager manager) {
-        ArrayList<UpdateRecord> records = mRecordsByProvider.get(manager.getName());
-        ProviderRequest.Builder providerRequest = new ProviderRequest.Builder();
-
-        // if provider is not active, it should not respond to requests
-
-        if (mProviderManagers.contains(manager) && records != null && !records.isEmpty()) {
-            long backgroundThrottleInterval = mSettingsHelper.getBackgroundThrottleIntervalMs();
-
-            ArrayList<LocationRequest> requests = new ArrayList<>(records.size());
-
-            final boolean isForegroundOnlyMode =
-                    mBatterySaverMode == PowerManager.LOCATION_MODE_FOREGROUND_ONLY;
-            final boolean shouldThrottleRequests =
-                    mBatterySaverMode
-                            == PowerManager.LOCATION_MODE_THROTTLE_REQUESTS_WHEN_SCREEN_OFF
-                            && !mPowerManager.isInteractive();
-            // initialize the low power mode to true and set to false if any of the records requires
-            providerRequest.setLowPowerMode(true);
-            for (UpdateRecord record : records) {
-                CallerIdentity identity = record.mReceiver.mCallerIdentity;
-                if (!mUserInfoHelper.isCurrentUserId(identity.userId)) {
-                    continue;
-                }
-
-                if (!mAppOpsHelper.checkLocationAccess(identity)) {
-                    continue;
-                }
-                final boolean isBatterySaverDisablingLocation = shouldThrottleRequests
-                        || (isForegroundOnlyMode && !record.mIsForegroundUid);
-                if (!manager.isEnabled(identity.userId) || isBatterySaverDisablingLocation) {
-                    if (isSettingsExempt(record)) {
-                        providerRequest.setLocationSettingsIgnored(true);
-                        providerRequest.setLowPowerMode(false);
-                    } else {
-                        continue;
-                    }
-                }
-
-                LocationRequest locationRequest = record.mRealRequest;
-                long interval = locationRequest.getInterval();
-
-
-                // if we're forcing location, don't apply any throttling
-                if (!providerRequest.isLocationSettingsIgnored() && !isThrottlingExempt(
-                        record.mReceiver.mCallerIdentity)) {
-                    if (!record.mIsForegroundUid) {
-                        interval = Math.max(interval, backgroundThrottleInterval);
-                    }
-                    if (interval != locationRequest.getInterval()) {
-                        locationRequest = new LocationRequest(locationRequest);
-                        locationRequest.setInterval(interval);
-                    }
-                }
-
-                record.mRequest = locationRequest;
-                requests.add(locationRequest);
-                if (!locationRequest.isLowPowerMode()) {
-                    providerRequest.setLowPowerMode(false);
-                }
-                if (interval < providerRequest.getInterval()) {
-                    providerRequest.setInterval(interval);
-                }
-            }
-
-            providerRequest.setLocationRequests(requests);
-
-            if (providerRequest.getInterval() < Long.MAX_VALUE) {
-                // calculate who to blame for power
-                // This is somewhat arbitrary. We pick a threshold interval
-                // that is slightly higher that the minimum interval, and
-                // spread the blame across all applications with a request
-                // under that threshold.
-                // TODO: overflow
-                long thresholdInterval = (providerRequest.getInterval() + 1000) * 3 / 2;
-                for (UpdateRecord record : records) {
-                    if (mUserInfoHelper.isCurrentUserId(
-                            UserHandle.getUserId(record.mReceiver.mCallerIdentity.uid))) {
-                        LocationRequest locationRequest = record.mRequest;
-
-                        // Don't assign battery blame for update records whose
-                        // client has no permission to receive location data.
-                        if (!providerRequest.getLocationRequests().contains(locationRequest)) {
-                            continue;
-                        }
-
-                        if (locationRequest.getInterval() <= thresholdInterval) {
-                            if (record.mReceiver.mWorkSource != null
-                                    && isValidWorkSource(record.mReceiver.mWorkSource)) {
-                                providerRequest.getWorkSource().add(record.mReceiver.mWorkSource);
-                            } else {
-                                // Assign blame to caller if there's no WorkSource associated with
-                                // the request or if it's invalid.
-                                providerRequest.getWorkSource().add(
-                                        record.mReceiver.mCallerIdentity.uid,
-                                        record.mReceiver.mCallerIdentity.packageName);
-                            }
-                        }
-                    }
-                }
-            }
-        }
-
-        manager.setRequest(providerRequest.build());
-    }
-
-    /**
-     * Whether a given {@code WorkSource} associated with a Location request is valid.
-     */
-    private static boolean isValidWorkSource(WorkSource workSource) {
-        if (workSource.size() > 0) {
-            // If the WorkSource has one or more non-chained UIDs, make sure they're accompanied
-            // by tags.
-            return workSource.getPackageName(0) != null;
-        } else {
-            // For now, make sure callers have supplied an attribution tag for use with
-            // AppOpsManager. This might be relaxed in the future.
-            final List<WorkChain> workChains = workSource.getWorkChains();
-            return workChains != null && !workChains.isEmpty() &&
-                    workChains.get(0).getAttributionTag() != null;
-        }
-    }
-
-    @Override
-    public String[] getBackgroundThrottlingWhitelist() {
-        return mSettingsHelper.getBackgroundThrottlePackageWhitelist().toArray(new String[0]);
-    }
-
-    @Override
-    public String[] getIgnoreSettingsWhitelist() {
-        return mSettingsHelper.getIgnoreSettingsPackageWhitelist().toArray(new String[0]);
-    }
-
-    private boolean isThrottlingExempt(CallerIdentity callerIdentity) {
-        if (callerIdentity.uid == Process.SYSTEM_UID) {
-            return true;
-        }
-
-        if (mSettingsHelper.getBackgroundThrottlePackageWhitelist().contains(
-                callerIdentity.packageName)) {
-            return true;
-        }
-
-        return mLocalService.isProviderPackage(callerIdentity.packageName);
-
-    }
-
-    private boolean isSettingsExempt(UpdateRecord record) {
-        if (!record.mRealRequest.isLocationSettingsIgnored()) {
-            return false;
-        }
-
-        if (mSettingsHelper.getIgnoreSettingsPackageWhitelist().contains(
-                record.mReceiver.mCallerIdentity.packageName)) {
-            return true;
-        }
-
-        return mLocalService.isProviderPackage(record.mReceiver.mCallerIdentity.packageName);
-
-    }
-
-    private class UpdateRecord {
-        final String mProvider;
-        private final LocationRequest mRealRequest;  // original request from client
-        LocationRequest mRequest;  // possibly throttled version of the request
-        private final Receiver mReceiver;
-        private boolean mIsForegroundUid;
-        private Location mLastFixBroadcast;
-        private Throwable mStackTrace;  // for debugging only
-        private long mExpirationRealtimeMs;
-
-        /**
-         * Note: must be constructed with lock held.
-         */
-        private UpdateRecord(String provider, LocationRequest request, Receiver receiver) {
-            mExpirationRealtimeMs = request.getExpirationRealtimeMs(SystemClock.elapsedRealtime());
-            mProvider = provider;
-            mRealRequest = request;
-            mRequest = request;
-            mReceiver = receiver;
-            mIsForegroundUid = mAppForegroundHelper.isAppForeground(mReceiver.mCallerIdentity.uid);
-
-            if (D && receiver.mCallerIdentity.pid == Process.myPid()) {
-                mStackTrace = new Throwable();
-            }
-
-            ArrayList<UpdateRecord> records = mRecordsByProvider.computeIfAbsent(provider,
-                    k -> new ArrayList<>());
-            if (!records.contains(this)) {
-                records.add(this);
-            }
-
-            // Update statistics for historical location requests by package/provider
-            mRequestStatistics.startRequesting(
-                    mReceiver.mCallerIdentity.packageName, mReceiver.mCallerIdentity.featureId,
-                    provider, request.getInterval(), mIsForegroundUid);
-        }
-
-        /**
-         * Method to be called when record changes foreground/background
-         */
-        private void updateForeground(boolean isForeground) {
-            mIsForegroundUid = isForeground;
-            mRequestStatistics.updateForeground(
-                    mReceiver.mCallerIdentity.packageName, mReceiver.mCallerIdentity.featureId,
-                    mProvider, isForeground);
-        }
-
-        /**
-         * Method to be called when a record will no longer be used.
-         */
-        private void disposeLocked(boolean removeReceiver) {
-            CallerIdentity identity = mReceiver.mCallerIdentity;
-            mRequestStatistics.stopRequesting(identity.packageName, identity.featureId, mProvider);
-
-            mLocationUsageLogger.logLocationApiUsage(
-                    LocationStatsEnums.USAGE_ENDED,
-                    LocationStatsEnums.API_REQUEST_LOCATION_UPDATES,
-                    identity.packageName,
-                    mRealRequest,
-                    mReceiver.isListener(),
-                    mReceiver.isPendingIntent(),
-                    /* geofence= */ null,
-                    mAppForegroundHelper.getImportance(mReceiver.mCallerIdentity.uid));
-
-            // remove from mRecordsByProvider
-            ArrayList<UpdateRecord> globalRecords = mRecordsByProvider.get(this.mProvider);
-            if (globalRecords != null) {
-                globalRecords.remove(this);
-            }
-
-            if (!removeReceiver) return;  // the caller will handle the rest
-
-            // remove from Receiver#mUpdateRecords
-            HashMap<String, UpdateRecord> receiverRecords = mReceiver.mUpdateRecords;
-            receiverRecords.remove(this.mProvider);
-
-            // and also remove the Receiver if it has no more update records
-            if (receiverRecords.size() == 0) {
-                removeUpdatesLocked(mReceiver);
-            }
-        }
-
-        @Override
-        public String toString() {
-            StringBuilder b = new StringBuilder("UpdateRecord[");
-            b.append(mProvider).append(" ");
-            b.append(mReceiver.mCallerIdentity).append(" ");
-            if (!mIsForegroundUid) {
-                b.append("(background) ");
-            }
-            b.append(mRealRequest).append(" ").append(mReceiver.mWorkSource);
-
-            if (mStackTrace != null) {
-                ByteArrayOutputStream tmp = new ByteArrayOutputStream();
-                mStackTrace.printStackTrace(new PrintStream(tmp));
-                b.append("\n\n").append(tmp.toString()).append("\n");
-            }
-
-            b.append("]");
-            return b.toString();
-        }
-    }
-
-    @GuardedBy("mLock")
-    private Receiver getReceiverLocked(ILocationListener listener, CallerIdentity identity,
-            WorkSource workSource, boolean hideFromAppOps) {
-        IBinder binder = listener.asBinder();
-        Receiver receiver = mReceivers.get(binder);
-        if (receiver == null && identity != null) {
-            receiver = new Receiver(listener, null, identity, workSource,
-                    hideFromAppOps);
-            if (!receiver.linkToListenerDeathNotificationLocked(
-                    receiver.getListener().asBinder())) {
-                return null;
-            }
-            mReceivers.put(binder, receiver);
-        }
-        return receiver;
-    }
-
-    @GuardedBy("mLock")
-    private Receiver getReceiverLocked(PendingIntent intent, CallerIdentity identity,
-            WorkSource workSource, boolean hideFromAppOps) {
-        Receiver receiver = mReceivers.get(intent);
-        if (receiver == null && identity != null) {
-            receiver = new Receiver(null, intent, identity, workSource,
-                    hideFromAppOps);
-            mReceivers.put(intent, receiver);
-        }
-        return receiver;
-    }
-
-    /**
-     * Creates a LocationRequest based upon the supplied LocationRequest that to meets resolution
-     * and consistency requirements.
-     *
-     * @param request the LocationRequest from which to create a sanitized version
-     * @return a version of request that meets the given resolution and consistency requirements
-     * @hide
-     */
-    private LocationRequest createSanitizedRequest(LocationRequest request, CallerIdentity identity,
-            boolean callerHasLocationHardwarePermission) {
-        LocationRequest sanitizedRequest = new LocationRequest(request);
-        if (!callerHasLocationHardwarePermission) {
-            // allow setting low power mode only for callers with location hardware permission
-            sanitizedRequest.setLowPowerMode(false);
-        }
-        if (identity.permissionLevel < PERMISSION_FINE) {
-            switch (sanitizedRequest.getQuality()) {
-                case LocationRequest.ACCURACY_FINE:
-                    sanitizedRequest.setQuality(LocationRequest.ACCURACY_BLOCK);
-                    break;
-                case LocationRequest.POWER_HIGH:
-                    sanitizedRequest.setQuality(LocationRequest.POWER_LOW);
-                    break;
-            }
-            // throttle
-            if (sanitizedRequest.getInterval() < FASTEST_COARSE_INTERVAL_MS) {
-                sanitizedRequest.setInterval(FASTEST_COARSE_INTERVAL_MS);
-            }
-            if (sanitizedRequest.getFastestInterval() < FASTEST_COARSE_INTERVAL_MS) {
-                sanitizedRequest.setFastestInterval(FASTEST_COARSE_INTERVAL_MS);
-            }
-        }
-        // make getFastestInterval() the minimum of interval and fastest interval
-        if (sanitizedRequest.getFastestInterval() > sanitizedRequest.getInterval()) {
-            sanitizedRequest.setFastestInterval(request.getInterval());
-        }
-        return sanitizedRequest;
-    }
-
-    @Override
-    public void requestLocationUpdates(LocationRequest request, ILocationListener listener,
-            PendingIntent intent, String packageName, String featureId, String listenerId) {
-        if (request == null) {
-            request = DEFAULT_LOCATION_REQUEST;
-        }
-
-        CallerIdentity identity = CallerIdentity.fromBinder(mContext, packageName, featureId,
-                listenerId);
-        identity.enforceLocationPermission();
-
-        WorkSource workSource = request.getWorkSource();
-        if (workSource != null && !workSource.isEmpty()) {
-            mContext.enforceCallingOrSelfPermission(
-                    Manifest.permission.UPDATE_DEVICE_STATS, null);
-        }
-        boolean hideFromAppOps = request.getHideFromAppOps();
-        if (hideFromAppOps) {
-            mContext.enforceCallingOrSelfPermission(
-                    Manifest.permission.UPDATE_APP_OPS_STATS, null);
-        }
-        if (request.isLocationSettingsIgnored()) {
-            mContext.enforceCallingOrSelfPermission(
-                    Manifest.permission.WRITE_SECURE_SETTINGS, null);
-        }
-        boolean callerHasLocationHardwarePermission =
-                mContext.checkCallingPermission(android.Manifest.permission.LOCATION_HARDWARE)
-                        == PERMISSION_GRANTED;
-        LocationRequest sanitizedRequest = createSanitizedRequest(request,
-                identity,
-                callerHasLocationHardwarePermission);
-
-        if (intent == null && listener == null) {
-            throw new IllegalArgumentException("need either listener or intent");
-        } else if (intent != null && listener != null) {
-            throw new IllegalArgumentException(
-                    "cannot register both listener and intent");
-        }
-
-        mLocationUsageLogger.logLocationApiUsage(
-                LocationStatsEnums.USAGE_STARTED,
-                LocationStatsEnums.API_REQUEST_LOCATION_UPDATES,
-                packageName, request, listener != null, intent != null,
-                /* geofence= */ null,
-                mAppForegroundHelper.getImportance(identity.uid));
-
-        synchronized (mLock) {
-            Receiver receiver;
-            if (intent != null) {
-                receiver = getReceiverLocked(intent, identity, workSource, hideFromAppOps);
-            } else {
-                receiver = getReceiverLocked(listener, identity, workSource, hideFromAppOps);
-            }
-            if (receiver != null) {
-                requestLocationUpdatesLocked(sanitizedRequest, receiver);
-            }
-        }
-    }
-
-    @GuardedBy("mLock")
-    private void requestLocationUpdatesLocked(LocationRequest request, Receiver receiver) {
-        // Figure out the provider. Either its explicitly request (legacy use cases), or
-        // use the fused provider
-        if (request == null) request = DEFAULT_LOCATION_REQUEST;
-        String name = request.getProvider();
-        if (name == null) {
-            throw new IllegalArgumentException("provider name must not be null");
-        }
-
-        LocationProviderManager manager = getLocationProviderManager(name);
-        if (manager == null) {
-            throw new IllegalArgumentException("provider doesn't exist: " + name);
-        }
-
-        UpdateRecord record = new UpdateRecord(name, request, receiver);
-
-        UpdateRecord oldRecord = receiver.mUpdateRecords.put(name, record);
-        if (oldRecord != null) {
-            oldRecord.disposeLocked(false);
-        }
-
-        long identity = Binder.clearCallingIdentity();
-        try {
-            int userId = UserHandle.getUserId(receiver.mCallerIdentity.uid);
-            if (!manager.isEnabled(userId) && !isSettingsExempt(record)) {
-                // Notify the listener that updates are currently disabled - but only if the request
-                // does not ignore location settings
-                receiver.callProviderEnabledLocked(name, false);
-            }
-
-            applyRequirementsLocked(name);
-
-            // Update the monitoring here just in case multiple location requests were added to the
-            // same receiver (this request may be high power and the initial might not have been).
-            receiver.updateMonitoring(true);
-        } finally {
-            Binder.restoreCallingIdentity(identity);
-        }
-    }
-
-    @Override
-    public void removeUpdates(ILocationListener listener, PendingIntent intent) {
-        if (intent == null && listener == null) {
-            throw new IllegalArgumentException("need either listener or intent");
-        } else if (intent != null && listener != null) {
-            throw new IllegalArgumentException("cannot register both listener and intent");
-        }
-
-        synchronized (mLock) {
-            Receiver receiver;
-            if (intent != null) {
-                receiver = getReceiverLocked(intent, null, null, false);
-            } else {
-                receiver = getReceiverLocked(listener, null, null, false);
-            }
-
-            if (receiver != null) {
-                removeUpdatesLocked(receiver);
-            }
-        }
-    }
-
-    @GuardedBy("mLock")
-    private void removeUpdatesLocked(Receiver receiver) {
-        if (D) Log.i(TAG, "remove " + Integer.toHexString(System.identityHashCode(receiver)));
-
-        if (mReceivers.remove(receiver.mKey) != null && receiver.isListener()) {
-            receiver.unlinkFromListenerDeathNotificationLocked(
-                    receiver.getListener().asBinder());
-            receiver.clearPendingBroadcastsLocked();
-        }
-
-        receiver.updateMonitoring(false);
-
-        // Record which providers were associated with this listener
-        HashSet<String> providers = new HashSet<>();
-        HashMap<String, UpdateRecord> oldRecords = receiver.mUpdateRecords;
-        if (oldRecords != null) {
-            // Call dispose() on the obsolete update records.
-            for (UpdateRecord record : oldRecords.values()) {
-                // Update statistics for historical location requests by package/provider
-                record.disposeLocked(false);
-            }
-            // Accumulate providers
-            providers.addAll(oldRecords.keySet());
-        }
-
-        // update provider
-        for (String provider : providers) {
-            applyRequirementsLocked(provider);
-        }
-    }
-
-    @Override
-    public Location getLastLocation(LocationRequest request, String packageName, String featureId) {
-        if (request == null) {
-            request = DEFAULT_LOCATION_REQUEST;
-        }
-
-        // unsafe is ok because app ops will verify the package name
-        CallerIdentity identity = CallerIdentity.fromBinderUnsafe(mContext, packageName, featureId);
-        identity.enforceLocationPermission();
-
-        if (mSettingsHelper.isLocationPackageBlacklisted(identity.userId, identity.packageName)) {
-            return null;
-        }
-        if (!mUserInfoHelper.isCurrentUserId(identity.userId)) {
-            return null;
-        }
-
-        synchronized (mLock) {
-            LocationProviderManager manager = getLocationProviderManager(request.getProvider());
-            if (manager == null) {
-                return null;
-            }
-            if (!manager.isEnabled(identity.userId) && !request.isLocationSettingsIgnored()) {
-                return null;
-            }
-
-            // appops check should always be right before delivery
-            if (!mAppOpsHelper.noteLocationAccess(identity)) {
-                return null;
-            }
-
-            Location location = manager.getLastLocation(identity.userId, identity.permissionLevel);
-
-            // make a defensive copy - the client could be in the same process as us
-            return location != null ? new Location(location) : null;
-        }
-    }
-
-    @Override
-    public boolean getCurrentLocation(LocationRequest locationRequest,
-            ICancellationSignal remoteCancellationSignal, ILocationListener listener,
-            String packageName, String featureId, String listenerId) {
-        // side effect of validating locationRequest and packageName
-        Location lastLocation = getLastLocation(locationRequest, packageName, featureId);
-        if (lastLocation != null) {
-            long locationAgeMs = NANOSECONDS.toMillis(
-                    SystemClock.elapsedRealtimeNanos() - lastLocation.getElapsedRealtimeNanos());
-
-            if (locationAgeMs < MAX_CURRENT_LOCATION_AGE_MS) {
-                try {
-                    listener.onLocationChanged(lastLocation);
-                    return true;
-                } catch (RemoteException e) {
-                    Log.w(TAG, e);
-                    return false;
-                }
-            }
-
-            if (!mAppForegroundHelper.isAppForeground(Binder.getCallingUid())) {
-                if (locationAgeMs < mSettingsHelper.getBackgroundThrottleIntervalMs()) {
-                    // not allowed to request new locations, so we can't return anything
-                    return false;
-                }
-            }
-        }
-
-        requestLocationUpdates(locationRequest, listener, null, packageName, featureId, listenerId);
-        CancellationSignal cancellationSignal = CancellationSignal.fromTransport(
-                remoteCancellationSignal);
-        if (cancellationSignal != null) {
-            cancellationSignal.setOnCancelListener(
-                    () -> removeUpdates(listener, null));
-        }
-        return true;
-    }
-
-    @Override
-    public LocationTime getGnssTimeMillis() {
-        synchronized (mLock) {
-            LocationProviderManager gpsManager = getLocationProviderManager(GPS_PROVIDER);
-            if (gpsManager == null) {
-                return null;
-            }
-
-            Location location = gpsManager.getLastLocation(UserHandle.getCallingUserId(),
-                    PERMISSION_FINE);
-            if (location == null) {
-                return null;
-            }
-
-            long currentNanos = SystemClock.elapsedRealtimeNanos();
-            long deltaMs = NANOSECONDS.toMillis(location.getElapsedRealtimeAgeNanos(currentNanos));
-            return new LocationTime(location.getTime() + deltaMs, currentNanos);
-        }
-    }
-
-    @Override
-    public void injectLocation(Location location) {
-        mContext.enforceCallingPermission(android.Manifest.permission.LOCATION_HARDWARE, null);
-        mContext.enforceCallingPermission(ACCESS_FINE_LOCATION, null);
-
-        Preconditions.checkArgument(location.isComplete());
-
-        int userId = UserHandle.getCallingUserId();
-        synchronized (mLock) {
-            LocationProviderManager manager = getLocationProviderManager(location.getProvider());
-            if (manager != null && manager.isEnabled(userId)) {
-                manager.injectLastLocation(Objects.requireNonNull(location), userId);
-            }
-        }
-    }
-
-    @Override
-    public void requestGeofence(LocationRequest request, Geofence geofence, PendingIntent intent,
-            String packageName, String featureId) {
-        if (request == null) {
-            request = DEFAULT_LOCATION_REQUEST;
-        }
-
-        CallerIdentity identity = CallerIdentity.fromBinder(mContext, packageName, featureId);
-        identity.enforceLocationPermission();
-
-        Objects.requireNonNull(intent);
-
-        boolean callerHasLocationHardwarePermission =
-                mContext.checkCallingPermission(android.Manifest.permission.LOCATION_HARDWARE)
-                        == PERMISSION_GRANTED;
-        LocationRequest sanitizedRequest = createSanitizedRequest(request, identity,
-                callerHasLocationHardwarePermission);
-
-        if (D) {
-            Log.d(TAG, "requestGeofence: " + sanitizedRequest + " " + geofence + " " + intent);
-        }
-
-        if (identity.userId != UserHandle.USER_SYSTEM) {
-            // temporary measure until geofences work for secondary users
-            Log.w(TAG, "proximity alerts are currently available only to the primary user");
-            return;
-        }
-
-        mLocationUsageLogger.logLocationApiUsage(
-                LocationStatsEnums.USAGE_STARTED,
-                LocationStatsEnums.API_REQUEST_GEOFENCE,
-                packageName,
-                request,
-                /* hasListener= */ false,
-                true,
-                geofence,
-                mAppForegroundHelper.getImportance(identity.uid));
-
-        mGeofenceManager.addFence(sanitizedRequest, geofence, intent, identity);
-    }
-
-    @Override
-    public void removeGeofence(Geofence geofence, PendingIntent intent, String packageName) {
-        if (intent == null) {
-            throw new IllegalArgumentException("invalid pending intent: " + null);
-        }
-
-        if (D) Log.d(TAG, "removeGeofence: " + geofence + " " + intent);
-
-        mLocationUsageLogger.logLocationApiUsage(
-                LocationStatsEnums.USAGE_ENDED,
-                LocationStatsEnums.API_REQUEST_GEOFENCE,
-                packageName,
-                /* LocationRequest= */ null,
-                /* hasListener= */ false,
-                true,
-                geofence,
-                mAppForegroundHelper.getImportance(Binder.getCallingUid()));
-
-        // geo-fence manager uses the public location API, need to clear identity
-        long identity = Binder.clearCallingIdentity();
-        try {
-            mGeofenceManager.removeFence(geofence, intent);
-        } finally {
-            Binder.restoreCallingIdentity(identity);
-        }
-    }
-
-    @Override
-    public boolean registerGnssStatusCallback(IGnssStatusListener listener, String packageName,
-            String featureId) {
-        return mGnssManagerService != null && mGnssManagerService.registerGnssStatusCallback(
-                listener, packageName, featureId);
-    }
-
-    @Override
-    public void unregisterGnssStatusCallback(IGnssStatusListener listener) {
-        if (mGnssManagerService != null) mGnssManagerService.unregisterGnssStatusCallback(listener);
-    }
-
-    @Override
-    public boolean addGnssMeasurementsListener(@Nullable GnssRequest request,
-            IGnssMeasurementsListener listener, String packageName, String featureId) {
-        return mGnssManagerService != null && mGnssManagerService.addGnssMeasurementsListener(
-                request, listener, packageName, featureId);
-    }
-
-    @Override
-    public void removeGnssMeasurementsListener(IGnssMeasurementsListener listener) {
-        if (mGnssManagerService != null) {
-            mGnssManagerService.removeGnssMeasurementsListener(
-                    listener);
-        }
-    }
-
-    @Override
-    public void injectGnssMeasurementCorrections(
-            GnssMeasurementCorrections measurementCorrections, String packageName) {
-        if (mGnssManagerService != null) {
-            mGnssManagerService.injectGnssMeasurementCorrections(measurementCorrections,
-                    packageName);
-        }
-    }
-
-    @Override
-    public long getGnssCapabilities() {
-        return mGnssManagerService == null ? GnssCapabilities.INVALID_CAPABILITIES
-                : mGnssManagerService.getGnssCapabilities();
-    }
-
-    @Override
-    public boolean addGnssAntennaInfoListener(IGnssAntennaInfoListener listener,
-            String packageName, String featureId) {
-
-        return mGnssManagerService != null && mGnssManagerService.addGnssAntennaInfoListener(
-                listener, packageName, featureId);
-    }
-
-    @Override
-    public void removeGnssAntennaInfoListener(IGnssAntennaInfoListener listener) {
-        if (mGnssManagerService != null) {
-            mGnssManagerService.removeGnssAntennaInfoListener(listener);
-        }
-    }
-
-    @Override
-    public boolean addGnssNavigationMessageListener(IGnssNavigationMessageListener listener,
-            String packageName, String featureId) {
-        return mGnssManagerService != null && mGnssManagerService.addGnssNavigationMessageListener(
-                listener, packageName, featureId);
-    }
-
-    @Override
-    public void removeGnssNavigationMessageListener(IGnssNavigationMessageListener listener) {
-        if (mGnssManagerService != null) {
-            mGnssManagerService.removeGnssNavigationMessageListener(
-                    listener);
-        }
-    }
-
-    @Override
-    public boolean sendExtraCommand(String provider, String command, Bundle extras) {
-        CallerIdentity.enforceCallingOrSelfLocationPermission(mContext);
-        mContext.enforceCallingOrSelfPermission(
-                Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, null);
-
-        LocationProviderManager manager = getLocationProviderManager(
-                Objects.requireNonNull(provider));
-        if (manager != null) {
-            manager.sendExtraCommand(Binder.getCallingUid(), Binder.getCallingPid(),
-                    Objects.requireNonNull(command), extras);
-        }
-
-        mLocationUsageLogger.logLocationApiUsage(
-                LocationStatsEnums.USAGE_STARTED,
-                LocationStatsEnums.API_SEND_EXTRA_COMMAND,
-                provider);
-
-        mLocationUsageLogger.logLocationApiUsage(
-                LocationStatsEnums.USAGE_ENDED,
-                LocationStatsEnums.API_SEND_EXTRA_COMMAND,
-                provider);
-
-        return true;
-    }
-
-    @Override
-    public ProviderProperties getProviderProperties(String providerName) {
-        LocationProviderManager manager = getLocationProviderManager(providerName);
-        if (manager == null) {
-            return null;
-        }
-        return manager.getProperties();
-    }
-
-    @Override
-    public boolean isProviderPackage(String packageName) {
-        mContext.enforceCallingOrSelfPermission(Manifest.permission.READ_DEVICE_CONFIG, null);
-        return mLocalService.isProviderPackage(packageName);
-    }
-
-    @Override
-    public List<String> getProviderPackages(String providerName) {
-        mContext.enforceCallingOrSelfPermission(Manifest.permission.READ_DEVICE_CONFIG, null);
-        LocationProviderManager manager = getLocationProviderManager(providerName);
-        return manager == null ? Collections.emptyList() : new ArrayList<>(manager.getPackages());
-    }
-
-    @Override
-    public void setExtraLocationControllerPackage(String packageName) {
-        mContext.enforceCallingPermission(Manifest.permission.LOCATION_HARDWARE,
-                Manifest.permission.LOCATION_HARDWARE + " permission required");
-        synchronized (mLock) {
-            mExtraLocationControllerPackage = packageName;
-        }
-    }
-
-    @Override
-    public String getExtraLocationControllerPackage() {
-        synchronized (mLock) {
-            return mExtraLocationControllerPackage;
-        }
-    }
-
-    @Override
-    public void setExtraLocationControllerPackageEnabled(boolean enabled) {
-        mContext.enforceCallingPermission(Manifest.permission.LOCATION_HARDWARE,
-                Manifest.permission.LOCATION_HARDWARE + " permission required");
-        synchronized (mLock) {
-            mExtraLocationControllerPackageEnabled = enabled;
-        }
-    }
-
-    @Override
-    public boolean isExtraLocationControllerPackageEnabled() {
-        synchronized (mLock) {
-            return mExtraLocationControllerPackageEnabled
-                    && (mExtraLocationControllerPackage != null);
-        }
-    }
-
-    @Override
-    public void setLocationEnabledForUser(boolean enabled, int userId) {
-        userId = ActivityManager.handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(),
-                userId, false, false, "setLocationEnabledForUser", null);
-
-        mContext.enforceCallingOrSelfPermission(Manifest.permission.WRITE_SECURE_SETTINGS, null);
-
-        LocationManager.invalidateLocalLocationEnabledCaches();
-        mSettingsHelper.setLocationEnabled(enabled, userId);
-    }
-
-    @Override
-    public boolean isLocationEnabledForUser(int userId) {
-        userId = ActivityManager.handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(),
-                userId, false, false, "isLocationEnabledForUser", null);
-        return mSettingsHelper.isLocationEnabled(userId);
-    }
-
-    @Override
-    public boolean isProviderEnabledForUser(String provider, int userId) {
-        userId = ActivityManager.handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(),
-                userId, false, false, "isProviderEnabledForUser", null);
-
-        // Fused provider is accessed indirectly via criteria rather than the provider-based APIs,
-        // so we discourage its use
-        if (FUSED_PROVIDER.equals(provider)) return false;
-
-        return mLocalService.isProviderEnabledForUser(provider, userId);
-    }
-
-    @GuardedBy("mLock")
-    private static boolean shouldBroadcastSafeLocked(
-            Location loc, Location lastLoc, UpdateRecord record, long now) {
-        // Always broadcast the first update
-        if (lastLoc == null) {
-            return true;
-        }
-
-        // Check whether sufficient time has passed
-        long minTime = record.mRealRequest.getFastestInterval();
-        long deltaMs = NANOSECONDS.toMillis(
-                loc.getElapsedRealtimeNanos() - lastLoc.getElapsedRealtimeNanos());
-        if (deltaMs < minTime - MAX_PROVIDER_SCHEDULING_JITTER_MS) {
-            return false;
-        }
-
-        // Check whether sufficient distance has been traveled
-        double minDistance = record.mRealRequest.getSmallestDisplacement();
-        if (minDistance > 0.0) {
-            if (loc.distanceTo(lastLoc) <= minDistance) {
-                return false;
-            }
-        }
-
-        // Check whether sufficient number of udpates is left
-        if (record.mRealRequest.getNumUpdates() <= 0) {
-            return false;
-        }
-
-        // Check whether the expiry date has passed
-        return record.mExpirationRealtimeMs >= now;
-    }
-
-    @GuardedBy("mLock")
-    private void handleLocationChangedLocked(LocationProviderManager manager, Location fineLocation,
-            Location coarseLocation) {
-        if (!mProviderManagers.contains(manager)) {
-            Log.w(TAG, "received location from unknown provider: " + manager.getName());
-            return;
-        }
-
-        // notify passive provider
-        if (manager != mPassiveManager) {
-            mPassiveManager.updateLocation(fineLocation);
-        }
-
-        long now = SystemClock.elapsedRealtime();
-
-        ArrayList<UpdateRecord> records = mRecordsByProvider.get(manager.getName());
-        if (records == null || records.size() == 0) return;
-
-        ArrayList<Receiver> deadReceivers = null;
-        ArrayList<UpdateRecord> deadUpdateRecords = null;
-
-        // Broadcast location to all listeners
-        for (UpdateRecord r : records) {
-            Receiver receiver = r.mReceiver;
-            CallerIdentity identity = receiver.mCallerIdentity;
-            boolean receiverDead = false;
-
-
-            if (!manager.isEnabled(identity.userId) && !isSettingsExempt(r)) {
-                continue;
-            }
-
-            if (!mUserInfoHelper.isCurrentUserId(identity.userId)
-                    && !isProviderPackage(identity.packageName)) {
-                continue;
-            }
-
-            if (mSettingsHelper.isLocationPackageBlacklisted(identity.userId,
-                    identity.packageName)) {
-                continue;
-            }
-
-            Location location;
-            switch (identity.permissionLevel) {
-                case PERMISSION_COARSE:
-                    location = coarseLocation;
-                    break;
-                case PERMISSION_FINE:
-                    location = fineLocation;
-                    break;
-                default:
-                    throw new AssertionError();
-            }
-
-            if (shouldBroadcastSafeLocked(location, r.mLastFixBroadcast, r, now)) {
-                r.mLastFixBroadcast = location;
-
-                // appops check should always be right before delivery
-                if (!mAppOpsHelper.noteLocationAccess(receiver.mCallerIdentity)) {
-                    continue;
-                }
-
-                if (!receiver.callLocationChangedLocked(location)) {
-                    receiverDead = true;
-                }
-                r.mRealRequest.decrementNumUpdates();
-            }
-
-            // track expired records
-            if (r.mRealRequest.getNumUpdates() <= 0 || r.mExpirationRealtimeMs < now) {
-                // notify the client it can remove this listener
-                r.mReceiver.callRemovedLocked();
-                if (deadUpdateRecords == null) {
-                    deadUpdateRecords = new ArrayList<>();
-                }
-                deadUpdateRecords.add(r);
-            }
-            // track dead receivers
-            if (receiverDead) {
-                if (deadReceivers == null) {
-                    deadReceivers = new ArrayList<>();
-                }
-                if (!deadReceivers.contains(receiver)) {
-                    deadReceivers.add(receiver);
-                }
-            }
-        }
-
-        // remove dead records and receivers outside the loop
-        if (deadReceivers != null) {
-            for (Receiver receiver : deadReceivers) {
-                removeUpdatesLocked(receiver);
-            }
-        }
-        if (deadUpdateRecords != null) {
-            for (UpdateRecord r : deadUpdateRecords) {
-                r.disposeLocked(true);
-            }
-            applyRequirementsLocked(manager);
-        }
-    }
-
-    // Geocoder
-
-    @Override
-    public boolean geocoderIsPresent() {
-        return mGeocodeProvider != null;
-    }
-
-    @Override
-    public String getFromLocation(double latitude, double longitude, int maxResults,
-            GeocoderParams params, List<Address> addrs) {
-        if (mGeocodeProvider != null) {
-            return mGeocodeProvider.getFromLocation(latitude, longitude, maxResults,
-                    params, addrs);
-        }
-        return null;
-    }
-
-    @Override
-    public String getFromLocationName(String locationName,
-            double lowerLeftLatitude, double lowerLeftLongitude,
-            double upperRightLatitude, double upperRightLongitude, int maxResults,
-            GeocoderParams params, List<Address> addrs) {
-
-        if (mGeocodeProvider != null) {
-            return mGeocodeProvider.getFromLocationName(locationName, lowerLeftLatitude,
-                    lowerLeftLongitude, upperRightLatitude, upperRightLongitude,
-                    maxResults, params, addrs);
-        }
-        return null;
-    }
-
-    // Mock Providers
-
-    @Override
-    public void addTestProvider(String provider, ProviderProperties properties,
-            String packageName, String featureId) {
-        // unsafe is ok because app ops will verify the package name
-        CallerIdentity identity = CallerIdentity.fromBinderUnsafe(mContext, packageName, featureId);
-        if (!mAppOpsHelper.noteMockLocationAccess(identity)) {
-            return;
-        }
-
-        synchronized (mLock) {
-            LocationProviderManager manager = getLocationProviderManager(provider);
-            if (manager == null) {
-                manager = new LocationProviderManager(provider);
-                mProviderManagers.add(manager);
-            }
-
-            manager.setMockProvider(new MockProvider(properties));
-        }
-    }
-
-    @Override
-    public void removeTestProvider(String provider, String packageName, String featureId) {
-        // unsafe is ok because app ops will verify the package name
-        CallerIdentity identity = CallerIdentity.fromBinderUnsafe(mContext, packageName, featureId);
-        if (!mAppOpsHelper.noteMockLocationAccess(identity)) {
-            return;
-        }
-
-        synchronized (mLock) {
-            LocationProviderManager manager = getLocationProviderManager(provider);
-            if (manager == null) {
-                return;
-            }
-
-            manager.setMockProvider(null);
-            if (!manager.hasProvider()) {
-                mProviderManagers.remove(manager);
-            }
-        }
-    }
-
-    @Override
-    public void setTestProviderLocation(String provider, Location location, String packageName,
-            String featureId) {
-        // unsafe is ok because app ops will verify the package name
-        CallerIdentity identity = CallerIdentity.fromBinderUnsafe(mContext, packageName, featureId);
-        if (!mAppOpsHelper.noteMockLocationAccess(identity)) {
-            return;
-        }
-
-        Preconditions.checkArgument(location.isComplete(),
-                "incomplete location object, missing timestamp or accuracy?");
-
-        LocationProviderManager manager = getLocationProviderManager(provider);
-        if (manager == null) {
-            throw new IllegalArgumentException("provider doesn't exist: " + provider);
-        }
-
-        manager.setMockProviderLocation(location);
-    }
-
-    @Override
-    public void setTestProviderEnabled(String provider, boolean enabled, String packageName,
-            String featureId) {
-        // unsafe is ok because app ops will verify the package name
-        CallerIdentity identity = CallerIdentity.fromBinderUnsafe(mContext, packageName, featureId);
-        if (!mAppOpsHelper.noteMockLocationAccess(identity)) {
-            return;
-        }
-
-        LocationProviderManager manager = getLocationProviderManager(provider);
-        if (manager == null) {
-            throw new IllegalArgumentException("provider doesn't exist: " + provider);
-        }
-
-        manager.setMockProviderAllowed(enabled);
-    }
-
-    @Override
-    @NonNull
-    public List<LocationRequest> getTestProviderCurrentRequests(String provider) {
-        LocationProviderManager manager = getLocationProviderManager(provider);
-        if (manager == null) {
-            throw new IllegalArgumentException("provider doesn't exist: " + provider);
-        }
-
-        return manager.getMockProviderRequests();
-    }
-
-    @Override
-    protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
-        if (!DumpUtils.checkDumpPermission(mContext, TAG, pw)) {
-            return;
-        }
-
-        IndentingPrintWriter ipw = new IndentingPrintWriter(pw, "  ");
-
-        synchronized (mLock) {
-            if (mGnssManagerService != null && args.length > 0 && args[0].equals("--gnssmetrics")) {
-                mGnssManagerService.dump(fd, pw, args);
-                return;
-            }
-
-            ipw.println("Location Manager State:");
-            ipw.increaseIndent();
-            ipw.print("Current System Time: "
-                    + TimeUtils.logTimeOfDay(System.currentTimeMillis()));
-            ipw.println(", Current Elapsed Time: "
-                    + TimeUtils.formatDuration(SystemClock.elapsedRealtime()));
-
-            ipw.println("User Info:");
-            ipw.increaseIndent();
-            mUserInfoHelper.dump(fd, ipw, args);
-            ipw.decreaseIndent();
-
-            ipw.println("Location Settings:");
-            ipw.increaseIndent();
-            mSettingsHelper.dump(fd, ipw, args);
-            ipw.decreaseIndent();
-
-            ipw.println("Battery Saver Location Mode: "
-                    + locationPowerSaveModeToString(mBatterySaverMode));
-
-            ipw.println("Location Listeners:");
-            ipw.increaseIndent();
-            for (Receiver receiver : mReceivers.values()) {
-                ipw.println(receiver);
-            }
-            ipw.decreaseIndent();
-
-            ipw.println("Active Records by Provider:");
-            ipw.increaseIndent();
-            for (Map.Entry<String, ArrayList<UpdateRecord>> entry : mRecordsByProvider.entrySet()) {
-                ipw.println(entry.getKey() + ":");
-                ipw.increaseIndent();
-                for (UpdateRecord record : entry.getValue()) {
-                    ipw.println(record);
-                }
-                ipw.decreaseIndent();
-            }
-            ipw.decreaseIndent();
-
-            ipw.println("Historical Records by Provider:");
-            ipw.increaseIndent();
-            TreeMap<PackageProviderKey, PackageStatistics> sorted = new TreeMap<>(
-                    mRequestStatistics.statistics);
-            for (Map.Entry<PackageProviderKey, PackageStatistics> entry
-                    : sorted.entrySet()) {
-                PackageProviderKey key = entry.getKey();
-                ipw.println(key.mPackageName + ": " + key.mProviderName + ": " + entry.getValue());
-            }
-            ipw.decreaseIndent();
-
-            mRequestStatistics.history.dump(ipw);
-
-            if (mGeofenceManager != null) {
-                ipw.println("Geofences:");
-                ipw.increaseIndent();
-                mGeofenceManager.dump(ipw);
-                ipw.decreaseIndent();
-            }
-
-            if (mExtraLocationControllerPackage != null) {
-                ipw.println("Location Controller Extra Package: " + mExtraLocationControllerPackage
-                        + (mExtraLocationControllerPackageEnabled ? " [enabled]" : "[disabled]"));
-            }
-        }
-
-        ipw.println("Location Providers:");
-        ipw.increaseIndent();
-        for (LocationProviderManager manager : mProviderManagers) {
-            manager.dump(fd, ipw, args);
-        }
-        ipw.decreaseIndent();
-
-        synchronized (mLock) {
-            if (mGnssManagerService != null) {
-                ipw.println("GNSS:");
-                ipw.increaseIndent();
-                mGnssManagerService.dump(fd, ipw, args);
-                ipw.decreaseIndent();
-            }
-        }
-    }
-
-    private class LocalService extends LocationManagerInternal {
-
-        @Override
-        public boolean isProviderEnabledForUser(@NonNull String provider, int userId) {
-            synchronized (mLock) {
-                LocationProviderManager manager = getLocationProviderManager(provider);
-                if (manager == null) {
-                    return false;
-                }
-
-                return manager.isEnabled(userId);
-            }
-        }
-
-        @Override
-        public boolean isProviderPackage(String packageName) {
-            for (LocationProviderManager manager : mProviderManagers) {
-                if (manager.getPackages().contains(packageName)) {
-                    return true;
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public void sendNiResponse(int notifId, int userResponse) {
-            if (mGnssManagerService != null) {
-                mGnssManagerService.sendNiResponse(notifId, userResponse);
-            }
-        }
-    }
-}
diff --git a/services/core/java/com/android/server/LocationManagerServiceUtils.java b/services/core/java/com/android/server/LocationManagerServiceUtils.java
deleted file mode 100644
index 9d0fe5e..0000000
--- a/services/core/java/com/android/server/LocationManagerServiceUtils.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright (C) 2019 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;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.os.IBinder;
-import android.os.RemoteException;
-
-import com.android.server.location.CallerIdentity;
-
-import java.util.NoSuchElementException;
-import java.util.function.Consumer;
-
-/**
- * Shared utilities for LocationManagerService and GnssManager.
- */
-public class LocationManagerServiceUtils {
-
-    /**
-     * Listener that can be linked to a binder.
-     * @param <TListener> listener type
-     * @param <TRequest> request type
-     */
-    public static class LinkedListener<TRequest, TListener> extends
-            LinkedListenerBase {
-        @Nullable protected final TRequest mRequest;
-        private final TListener mListener;
-        private final Consumer<TListener> mBinderDeathCallback;
-
-        public LinkedListener(
-                @Nullable TRequest request,
-                @NonNull TListener listener,
-                @NonNull CallerIdentity callerIdentity,
-                @NonNull Consumer<TListener> binderDeathCallback) {
-            super(callerIdentity);
-            mListener = listener;
-            mRequest = request;
-            mBinderDeathCallback = binderDeathCallback;
-        }
-
-        @Nullable
-        public TRequest getRequest() {
-            return mRequest;
-        }
-
-        @Override
-        public void binderDied() {
-            mBinderDeathCallback.accept(mListener);
-        }
-    }
-
-    /**
-     * Skeleton class of listener that can be linked to a binder.
-     */
-    public abstract static class LinkedListenerBase implements IBinder.DeathRecipient {
-        protected final CallerIdentity mCallerIdentity;
-
-        LinkedListenerBase(@NonNull CallerIdentity callerIdentity) {
-            mCallerIdentity = callerIdentity;
-        }
-
-        @Override
-        public String toString() {
-            return mCallerIdentity.toString();
-        }
-
-        public CallerIdentity getCallerIdentity() {
-            return mCallerIdentity;
-        }
-
-        /**
-         * Link listener (i.e. callback) to a binder, so that it will be called upon binder's death.
-         */
-        public boolean linkToListenerDeathNotificationLocked(IBinder binder) {
-            try {
-                binder.linkToDeath(this, 0 /* flags */);
-                return true;
-            } catch (RemoteException e) {
-                return false;
-            }
-        }
-
-        /**
-         * Unlink death listener (i.e. callback) from binder.
-         */
-        public void unlinkFromListenerDeathNotificationLocked(IBinder binder) {
-            try {
-                binder.unlinkToDeath(this, 0 /* flags */);
-            } catch (NoSuchElementException e) {
-                // ignore
-            }
-        }
-    }
-}
diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java
index b0a586d..14fe0c5 100644
--- a/services/core/java/com/android/server/StorageManagerService.java
+++ b/services/core/java/com/android/server/StorageManagerService.java
@@ -3215,10 +3215,14 @@
 
     @Override
     public void unlockUserKey(int userId, int serialNumber, byte[] token, byte[] secret) {
-        Slog.d(TAG, "unlockUserKey: " + userId);
+        boolean isFsEncrypted = StorageManager.isFileEncryptedNativeOrEmulated();
+        Slog.d(TAG, "unlockUserKey: " + userId
+                + " isFileEncryptedNativeOrEmulated: " + isFsEncrypted
+                + " hasToken: " + (token != null)
+                + " hasSecret: " + (secret != null));
         enforcePermission(android.Manifest.permission.STORAGE_INTERNAL);
 
-        if (StorageManager.isFileEncryptedNativeOrEmulated()) {
+        if (isFsEncrypted) {
             try {
                 mVold.unlockUserKey(userId, serialNumber, encodeBytes(token),
                         encodeBytes(secret));
diff --git a/services/core/java/com/android/server/TelephonyRegistry.java b/services/core/java/com/android/server/TelephonyRegistry.java
index 2bbf278..97a5cfe 100644
--- a/services/core/java/com/android/server/TelephonyRegistry.java
+++ b/services/core/java/com/android/server/TelephonyRegistry.java
@@ -1146,7 +1146,7 @@
                     && registrationLimit >= 1
                     && numRecordsForPid >= registrationLimit) {
                 String errorMsg = "Pid " + callingPid + " has exceeded the number of permissible"
-                        + "registered listeners. Ignoring request to add.";
+                        + " registered listeners. Ignoring request to add.";
                 loge(errorMsg);
                 if (mConfigurationProvider
                         .isRegistrationLimitEnabledInPlatformCompat(callingUid)) {
@@ -1157,7 +1157,7 @@
                 // Log the warning independently of the dynamically set limit -- apps shouldn't be
                 // doing this regardless of whether we're throwing them an exception for it.
                 Rlog.w(TAG, "Pid " + callingPid + " has exceeded half the number of permissible"
-                        + "registered listeners. Now at " + numRecordsForPid);
+                        + " registered listeners. Now at " + numRecordsForPid);
             }
 
             r = new Record();
diff --git a/services/core/java/com/android/server/UiModeManagerService.java b/services/core/java/com/android/server/UiModeManagerService.java
index 58c388e..b09d741 100644
--- a/services/core/java/com/android/server/UiModeManagerService.java
+++ b/services/core/java/com/android/server/UiModeManagerService.java
@@ -122,7 +122,6 @@
     private boolean mVrHeadset;
     private boolean mComputedNightMode;
     private int mCarModeEnableFlags;
-    private boolean mSetupWizardComplete;
 
     // flag set by resource, whether to enable Car dock launch when starting car mode.
     private boolean mEnableCarDockLaunch = true;
@@ -164,12 +163,6 @@
         mConfiguration.setToDefaults();
     }
 
-    @VisibleForTesting
-    protected UiModeManagerService(Context context, boolean setupWizardComplete) {
-        this(context);
-        mSetupWizardComplete = setupWizardComplete;
-    }
-
     private static Intent buildHomeIntent(String category) {
         Intent intent = new Intent(Intent.ACTION_MAIN);
         intent.addCategory(category);
@@ -283,25 +276,6 @@
         }
     };
 
-    private final ContentObserver mSetupWizardObserver = new ContentObserver(mHandler) {
-        @Override
-        public void onChange(boolean selfChange, Uri uri) {
-            synchronized (mLock) {
-                // setup wizard is done now so we can unblock
-                if (setupWizardCompleteForCurrentUser() && !selfChange) {
-                    mSetupWizardComplete = true;
-                    getContext().getContentResolver()
-                            .unregisterContentObserver(mSetupWizardObserver);
-                    // update night mode
-                    Context context = getContext();
-                    updateNightModeFromSettingsLocked(context, context.getResources(),
-                            UserHandle.getCallingUserId());
-                    updateLocked(0, 0);
-                }
-            }
-        }
-    };
-
     private final ContentObserver mDarkThemeObserver = new ContentObserver(mHandler) {
         @Override
         public void onChange(boolean selfChange, Uri uri) {
@@ -319,13 +293,6 @@
     }
 
     @Override
-    public void onSwitchUser(int userHandle) {
-        super.onSwitchUser(userHandle);
-        getContext().getContentResolver().unregisterContentObserver(mSetupWizardObserver);
-        verifySetupWizardCompleted();
-    }
-
-    @Override
     public void onBootPhase(int phase) {
         if (phase == SystemService.PHASE_SYSTEM_SERVICES_READY) {
             synchronized (mLock) {
@@ -351,6 +318,8 @@
                 context.registerReceiver(mBatteryReceiver, batteryFilter);
                 IntentFilter filter = new IntentFilter();
                 filter.addAction(Intent.ACTION_USER_SWITCHED);
+                context.registerReceiver(mSettingsRestored,
+                        new IntentFilter(Intent.ACTION_SETTING_RESTORED));
                 context.registerReceiver(new UserSwitchedReceiver(), filter, null, mHandler);
                 updateConfigurationLocked();
                 applyConfigurationExternallyLocked();
@@ -361,9 +330,6 @@
     @Override
     public void onStart() {
         final Context context = getContext();
-        // If setup isn't complete for this user listen for completion so we can unblock
-        // being able to send a night mode configuration change event
-        verifySetupWizardCompleted();
 
         final Resources res = context.getResources();
         mDefaultUiModeType = res.getInteger(
@@ -438,20 +404,6 @@
         return mConfiguration;
     }
 
-    // Records whether setup wizard has happened or not and adds an observer for this user if not.
-    private void verifySetupWizardCompleted() {
-        final Context context = getContext();
-        final int userId = UserHandle.getCallingUserId();
-        if (!setupWizardCompleteForCurrentUser()) {
-            mSetupWizardComplete = false;
-            context.getContentResolver().registerContentObserver(
-                    Secure.getUriFor(
-                            Secure.USER_SETUP_COMPLETE), false, mSetupWizardObserver, userId);
-        } else {
-            mSetupWizardComplete = true;
-        }
-    }
-
     private boolean setupWizardCompleteForCurrentUser() {
         return Secure.getIntForUser(getContext().getContentResolver(),
                 Secure.USER_SETUP_COMPLETE, 0, UserHandle.getCallingUserId()) == 1;
@@ -480,28 +432,20 @@
         final int defaultNightMode = res.getInteger(
                 com.android.internal.R.integer.config_defaultNightMode);
         int oldNightMode = mNightMode;
-        if (mSetupWizardComplete) {
-            mNightMode = Secure.getIntForUser(context.getContentResolver(),
-                    Secure.UI_NIGHT_MODE, defaultNightMode, userId);
-            mOverrideNightModeOn = Secure.getIntForUser(context.getContentResolver(),
-                    Secure.UI_NIGHT_MODE_OVERRIDE_ON, 0, userId) != 0;
-            mOverrideNightModeOff = Secure.getIntForUser(context.getContentResolver(),
-                    Secure.UI_NIGHT_MODE_OVERRIDE_OFF, 0, userId) != 0;
-            mCustomAutoNightModeStartMilliseconds = LocalTime.ofNanoOfDay(
-                    Secure.getLongForUser(context.getContentResolver(),
-                            Secure.DARK_THEME_CUSTOM_START_TIME,
-                            DEFAULT_CUSTOM_NIGHT_START_TIME.toNanoOfDay() / 1000L, userId) * 1000);
-            mCustomAutoNightModeEndMilliseconds = LocalTime.ofNanoOfDay(
-                    Secure.getLongForUser(context.getContentResolver(),
-                            Secure.DARK_THEME_CUSTOM_END_TIME,
-                            DEFAULT_CUSTOM_NIGHT_END_TIME.toNanoOfDay() / 1000L, userId) * 1000);
-        } else {
-            mNightMode = defaultNightMode;
-            mCustomAutoNightModeEndMilliseconds = DEFAULT_CUSTOM_NIGHT_END_TIME;
-            mCustomAutoNightModeStartMilliseconds = DEFAULT_CUSTOM_NIGHT_START_TIME;
-            mOverrideNightModeOn = false;
-            mOverrideNightModeOff = false;
-        }
+        mNightMode = Secure.getIntForUser(context.getContentResolver(),
+                Secure.UI_NIGHT_MODE, defaultNightMode, userId);
+        mOverrideNightModeOn = Secure.getIntForUser(context.getContentResolver(),
+                Secure.UI_NIGHT_MODE_OVERRIDE_ON, 0, userId) != 0;
+        mOverrideNightModeOff = Secure.getIntForUser(context.getContentResolver(),
+                Secure.UI_NIGHT_MODE_OVERRIDE_OFF, 0, userId) != 0;
+        mCustomAutoNightModeStartMilliseconds = LocalTime.ofNanoOfDay(
+                Secure.getLongForUser(context.getContentResolver(),
+                        Secure.DARK_THEME_CUSTOM_START_TIME,
+                        DEFAULT_CUSTOM_NIGHT_START_TIME.toNanoOfDay() / 1000L, userId) * 1000);
+        mCustomAutoNightModeEndMilliseconds = LocalTime.ofNanoOfDay(
+                Secure.getLongForUser(context.getContentResolver(),
+                        Secure.DARK_THEME_CUSTOM_END_TIME,
+                        DEFAULT_CUSTOM_NIGHT_END_TIME.toNanoOfDay() / 1000L, userId) * 1000);
 
         return oldNightMode != mNightMode;
     }
@@ -644,10 +588,6 @@
                 Slog.e(TAG, "Night mode locked, requires MODIFY_DAY_NIGHT_MODE permission");
                 return;
             }
-            if (!mSetupWizardComplete) {
-                Slog.d(TAG, "Night mode cannot be changed before setup wizard completes.");
-                return;
-            }
             switch (mode) {
                 case UiModeManager.MODE_NIGHT_NO:
                 case UiModeManager.MODE_NIGHT_YES:
diff --git a/services/core/java/com/android/server/UserspaceRebootLogger.java b/services/core/java/com/android/server/UserspaceRebootLogger.java
index 9a9374c..2403b63 100644
--- a/services/core/java/com/android/server/UserspaceRebootLogger.java
+++ b/services/core/java/com/android/server/UserspaceRebootLogger.java
@@ -24,6 +24,7 @@
 import static com.android.internal.util.FrameworkStatsLog.USERSPACE_REBOOT_REPORTED__USER_ENCRYPTION_STATE__LOCKED;
 import static com.android.internal.util.FrameworkStatsLog.USERSPACE_REBOOT_REPORTED__USER_ENCRYPTION_STATE__UNLOCKED;
 
+import android.os.PowerManager;
 import android.os.SystemClock;
 import android.os.SystemProperties;
 import android.text.TextUtils;
@@ -53,8 +54,15 @@
     /**
      * Modifies internal state to note that {@code UserspaceRebootReported} atom needs to be
      * logged on the next successful boot.
+     *
+     * <p>This call should only be made on devices supporting userspace reboot.
      */
     public static void noteUserspaceRebootWasRequested() {
+        if (!PowerManager.isRebootingUserspaceSupportedImpl()) {
+            Slog.wtf(TAG, "Userspace reboot is not supported.");
+            return;
+        }
+
         SystemProperties.set(USERSPACE_REBOOT_SHOULD_LOG_PROPERTY, "1");
         SystemProperties.set(USERSPACE_REBOOT_LAST_STARTED_PROPERTY,
                 String.valueOf(SystemClock.elapsedRealtime()));
@@ -64,16 +72,30 @@
      * Updates internal state on boot after successful userspace reboot.
      *
      * <p>Should be called right before framework sets {@code sys.boot_completed} property.
+     *
+     * <p>This call should only be made on devices supporting userspace reboot.
      */
     public static void noteUserspaceRebootSuccess() {
+        if (!PowerManager.isRebootingUserspaceSupportedImpl()) {
+            Slog.wtf(TAG, "Userspace reboot is not supported.");
+            return;
+        }
+
         SystemProperties.set(USERSPACE_REBOOT_LAST_FINISHED_PROPERTY,
                 String.valueOf(SystemClock.elapsedRealtime()));
     }
 
     /**
      * Returns {@code true} if {@code UserspaceRebootReported} atom should be logged.
+     *
+     * <p>This call should only be made on devices supporting userspace reboot.
      */
     public static boolean shouldLogUserspaceRebootEvent() {
+        if (!PowerManager.isRebootingUserspaceSupportedImpl()) {
+            Slog.wtf(TAG, "Userspace reboot is not supported.");
+            return false;
+        }
+
         return SystemProperties.getBoolean(USERSPACE_REBOOT_SHOULD_LOG_PROPERTY, false);
     }
 
@@ -83,8 +105,15 @@
      * <p>Should be called in the end of {@link
      * com.android.server.am.ActivityManagerService#finishBooting()} method, after framework have
      * tried to proactivelly unlock storage of the primary user.
+     *
+     * <p>This call should only be made on devices supporting userspace reboot.
      */
     public static void logEventAsync(boolean userUnlocked, Executor executor) {
+        if (!PowerManager.isRebootingUserspaceSupportedImpl()) {
+            Slog.wtf(TAG, "Userspace reboot is not supported.");
+            return;
+        }
+
         final int outcome = computeOutcome();
         final long durationMillis;
         if (outcome == USERSPACE_REBOOT_REPORTED__OUTCOME__SUCCESS) {
diff --git a/services/core/java/com/android/server/VibratorService.java b/services/core/java/com/android/server/VibratorService.java
index ac4a42c..e066d99 100644
--- a/services/core/java/com/android/server/VibratorService.java
+++ b/services/core/java/com/android/server/VibratorService.java
@@ -1034,6 +1034,9 @@
             VibrationEffect.Waveform waveform = (VibrationEffect.Waveform) vib.effect;
             waveform = waveform.resolve(mDefaultVibrationAmplitude);
             scaledEffect = waveform.scale(scale.gamma, scale.maxAmplitude);
+        } else if (vib.effect instanceof VibrationEffect.Composed) {
+            VibrationEffect.Composed composed = (VibrationEffect.Composed) vib.effect;
+            scaledEffect = composed.scale(scale.gamma, scale.maxAmplitude);
         } else {
             Slog.w(TAG, "Unable to apply intensity scaling, unknown VibrationEffect type");
         }
diff --git a/services/core/java/com/android/server/accounts/AccountManagerService.java b/services/core/java/com/android/server/accounts/AccountManagerService.java
index debc2a1..27c3ff1 100644
--- a/services/core/java/com/android/server/accounts/AccountManagerService.java
+++ b/services/core/java/com/android/server/accounts/AccountManagerService.java
@@ -46,6 +46,7 @@
 import android.app.admin.DevicePolicyManager;
 import android.app.admin.DevicePolicyManagerInternal;
 import android.content.BroadcastReceiver;
+import android.content.ClipData;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
@@ -4757,6 +4758,11 @@
          * supplied entries in the system Settings app.
          */
          protected boolean checkKeyIntent(int authUid, Intent intent) {
+            // Explicitly set an empty ClipData to ensure that we don't offer to
+            // promote any Uris contained inside for granting purposes
+            if (intent.getClipData() == null) {
+                intent.setClipData(ClipData.newPlainText(null, null));
+            }
             intent.setFlags(intent.getFlags() & ~(Intent.FLAG_GRANT_READ_URI_PERMISSION
                     | Intent.FLAG_GRANT_WRITE_URI_PERMISSION
                     | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION
diff --git a/services/core/java/com/android/server/adb/AdbDebuggingManager.java b/services/core/java/com/android/server/adb/AdbDebuggingManager.java
index e49357b..27ea471 100644
--- a/services/core/java/com/android/server/adb/AdbDebuggingManager.java
+++ b/services/core/java/com/android/server/adb/AdbDebuggingManager.java
@@ -23,7 +23,6 @@
 import android.app.Notification;
 import android.app.NotificationChannel;
 import android.app.NotificationManager;
-import android.app.PendingIntent;
 import android.content.ActivityNotFoundException;
 import android.content.BroadcastReceiver;
 import android.content.ComponentName;
@@ -36,6 +35,7 @@
 import android.content.res.Resources;
 import android.database.ContentObserver;
 import android.debug.AdbManager;
+import android.debug.AdbNotifications;
 import android.debug.AdbProtoEnums;
 import android.debug.AdbTransportType;
 import android.debug.PairDevice;
@@ -69,7 +69,6 @@
 import com.android.internal.R;
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.messages.nano.SystemMessageProto.SystemMessage;
-import com.android.internal.notification.SystemNotificationChannels;
 import com.android.internal.util.FastXmlSerializer;
 import com.android.internal.util.FrameworkStatsLog;
 import com.android.internal.util.XmlUtils;
@@ -178,7 +177,15 @@
         private String mPairingCode;
         private String mGuid;
         private String mServiceName;
-        private final String mServiceType = "_adb_secure_pairing._tcp.";
+        // From RFC6763 (https://tools.ietf.org/html/rfc6763#section-7.2),
+        // The rules for Service Names [RFC6335] state that they may be no more
+        // than fifteen characters long (not counting the mandatory underscore),
+        // consisting of only letters, digits, and hyphens, must begin and end
+        // with a letter or digit, must not contain consecutive hyphens, and
+        // must contain at least one letter.
+        @VisibleForTesting
+        static final String SERVICE_PROTOCOL = "adb-tls-pairing";
+        private final String mServiceType = String.format("_%s._tcp.", SERVICE_PROTOCOL);
         private int mPort;
 
         private native int native_pairing_start(String guid, String password);
@@ -760,40 +767,13 @@
         // Show when at least one device is connected.
         public void showAdbConnectedNotification(boolean show) {
             final int id = SystemMessage.NOTE_ADB_WIFI_ACTIVE;
-            final int titleRes = com.android.internal.R.string.adbwifi_active_notification_title;
             if (show == mAdbNotificationShown) {
                 return;
             }
             setupNotifications();
             if (!mAdbNotificationShown) {
-                Resources r = mContext.getResources();
-                CharSequence title = r.getText(titleRes);
-                CharSequence message = r.getText(
-                        com.android.internal.R.string.adbwifi_active_notification_message);
-
-                Intent intent = new Intent(Settings.ACTION_APPLICATION_DEVELOPMENT_SETTINGS);
-                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
-                        | Intent.FLAG_ACTIVITY_CLEAR_TASK);
-                PendingIntent pi = PendingIntent.getActivityAsUser(mContext, 0,
-                        intent, 0, null, UserHandle.CURRENT);
-
-                Notification notification =
-                        new Notification.Builder(mContext, SystemNotificationChannels.DEVELOPER)
-                                .setSmallIcon(com.android.internal.R.drawable.stat_sys_adb)
-                                .setWhen(0)
-                                .setOngoing(true)
-                                .setTicker(title)
-                                .setDefaults(0)  // please be quiet
-                                .setColor(mContext.getColor(
-                                        com.android.internal.R.color
-                                                .system_notification_accent_color))
-                                .setContentTitle(title)
-                                .setContentText(message)
-                                .setContentIntent(pi)
-                                .setVisibility(Notification.VISIBILITY_PUBLIC)
-                                .extend(new Notification.TvExtender()
-                                        .setChannelId(ADB_NOTIFICATION_CHANNEL_ID_TV))
-                                .build();
+                Notification notification = AdbNotifications.createNotification(mContext,
+                        AdbTransportType.WIFI);
                 mAdbNotificationShown = true;
                 mNotificationManager.notifyAsUser(null, id, notification,
                         UserHandle.ALL);
diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java
index 21760cd..419389f 100644
--- a/services/core/java/com/android/server/am/ActiveServices.java
+++ b/services/core/java/com/android/server/am/ActiveServices.java
@@ -119,7 +119,6 @@
 import java.io.StringWriter;
 import java.util.ArrayList;
 import java.util.Comparator;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
 import java.util.function.Predicate;
@@ -1753,8 +1752,8 @@
     private void updateServiceForegroundLocked(ProcessRecord proc, boolean oomAdj) {
         boolean anyForeground = false;
         int fgServiceTypes = 0;
-        for (int i = proc.services.size() - 1; i >= 0; i--) {
-            ServiceRecord sr = proc.services.valueAt(i);
+        for (int i = proc.numberOfRunningServices() - 1; i >= 0; i--) {
+            ServiceRecord sr = proc.getRunningServiceAt(i);
             if (sr.isForeground || sr.fgRequired) {
                 anyForeground = true;
                 fgServiceTypes |= sr.foregroundServiceType;
@@ -1765,8 +1764,8 @@
 
     private void updateWhitelistManagerLocked(ProcessRecord proc) {
         proc.whitelistManager = false;
-        for (int i=proc.services.size()-1; i>=0; i--) {
-            ServiceRecord sr = proc.services.valueAt(i);
+        for (int i = proc.numberOfRunningServices() - 1; i >= 0; i--) {
+            ServiceRecord sr = proc.getRunningServiceAt(i);
             if (sr.whitelistManager) {
                 proc.whitelistManager = true;
                 break;
@@ -1802,8 +1801,8 @@
         }
 
         boolean anyClientActivities = false;
-        for (int i=proc.services.size()-1; i>=0 && !anyClientActivities; i--) {
-            ServiceRecord sr = proc.services.valueAt(i);
+        for (int i = proc.numberOfRunningServices() - 1; i >= 0 && !anyClientActivities; i--) {
+            ServiceRecord sr = proc.getRunningServiceAt(i);
             ArrayMap<IBinder, ArrayList<ConnectionRecord>> connections = sr.getConnections();
             for (int conni = connections.size() - 1; conni >= 0 && !anyClientActivities; conni--) {
                 ArrayList<ConnectionRecord> clist = connections.valueAt(conni);
@@ -2995,7 +2994,7 @@
         r.setProcess(app);
         r.restartTime = r.lastActivity = SystemClock.uptimeMillis();
 
-        final boolean newService = app.services.add(r);
+        final boolean newService = app.startService(r);
         bumpServiceExecutingLocked(r, execInFg, "create");
         mAm.updateLruProcessLocked(app, false, null);
         updateServiceForegroundLocked(r.app, /* oomAdj= */ false);
@@ -3036,7 +3035,7 @@
 
                 // Cleanup.
                 if (newService) {
-                    app.services.remove(r);
+                    app.stopService(r);
                     r.setProcess(null);
                 }
 
@@ -3362,7 +3361,7 @@
             synchronized (r.stats.getBatteryStats()) {
                 r.stats.stopLaunchedLocked();
             }
-            r.app.services.remove(r);
+            r.app.stopService(r);
             r.app.updateBoundClientUids();
             if (r.whitelistManager) {
                 updateWhitelistManagerLocked(r.app);
@@ -3652,7 +3651,7 @@
             }
             if (finishing) {
                 if (r.app != null && !r.app.isPersistent()) {
-                    r.app.services.remove(r);
+                    r.app.stopService(r);
                     r.app.updateBoundClientUids();
                     if (r.whitelistManager) {
                         updateWhitelistManagerLocked(r.app);
@@ -3748,7 +3747,7 @@
                 didSomething = true;
                 Slog.i(TAG, "  Force stopping service " + service);
                 if (service.app != null && !service.app.isPersistent()) {
-                    service.app.services.remove(service);
+                    service.app.stopService(service);
                     service.app.updateBoundClientUids();
                     if (service.whitelistManager) {
                         updateWhitelistManagerLocked(service.app);
@@ -3861,24 +3860,22 @@
         if (false) {
             // XXX we are letting the client link to the service for
             // death notifications.
-            if (app.services.size() > 0) {
-                Iterator<ServiceRecord> it = app.services.iterator();
-                while (it.hasNext()) {
-                    ServiceRecord r = it.next();
-                    ArrayMap<IBinder, ArrayList<ConnectionRecord>> connections = r.getConnections();
-                    for (int conni=connections.size()-1; conni>=0; conni--) {
-                        ArrayList<ConnectionRecord> cl = connections.valueAt(conni);
-                        for (int i=0; i<cl.size(); i++) {
-                            ConnectionRecord c = cl.get(i);
-                            if (c.binding.client != app) {
-                                try {
-                                    //c.conn.connected(r.className, null);
-                                } catch (Exception e) {
-                                    // todo: this should be asynchronous!
-                                    Slog.w(TAG, "Exception thrown disconnected servce "
-                                          + r.shortInstanceName
-                                          + " from app " + app.processName, e);
-                                }
+            int numberOfRunningServices = app.numberOfRunningServices();
+            for (int sIndex = 0; sIndex < numberOfRunningServices; sIndex++) {
+                ServiceRecord r = app.getRunningServiceAt(sIndex);
+                ArrayMap<IBinder, ArrayList<ConnectionRecord>> connections = r.getConnections();
+                for (int conni = connections.size() - 1; conni >= 0; conni--) {
+                    ArrayList<ConnectionRecord> cl = connections.valueAt(conni);
+                    for (int i = 0; i < cl.size(); i++) {
+                        ConnectionRecord c = cl.get(i);
+                        if (c.binding.client != app) {
+                            try {
+                                //c.conn.connected(r.className, null);
+                            } catch (Exception e) {
+                                // todo: this should be asynchronous!
+                                Slog.w(TAG, "Exception thrown disconnected servce "
+                                        + r.shortInstanceName
+                                        + " from app " + app.processName, e);
                             }
                         }
                     }
@@ -3897,13 +3894,13 @@
         app.whitelistManager = false;
 
         // Clear app state from services.
-        for (int i = app.services.size() - 1; i >= 0; i--) {
-            ServiceRecord sr = app.services.valueAt(i);
+        for (int i = app.numberOfRunningServices() - 1; i >= 0; i--) {
+            ServiceRecord sr = app.getRunningServiceAt(i);
             synchronized (sr.stats.getBatteryStats()) {
                 sr.stats.stopLaunchedLocked();
             }
             if (sr.app != app && sr.app != null && !sr.app.isPersistent()) {
-                sr.app.services.remove(sr);
+                sr.app.stopService(sr);
                 sr.app.updateBoundClientUids();
             }
             sr.setProcess(null);
@@ -3962,13 +3959,13 @@
         ServiceMap smap = getServiceMapLocked(app.userId);
 
         // Now do remaining service cleanup.
-        for (int i=app.services.size()-1; i>=0; i--) {
-            ServiceRecord sr = app.services.valueAt(i);
+        for (int i = app.numberOfRunningServices() - 1; i >= 0; i--) {
+            ServiceRecord sr = app.getRunningServiceAt(i);
 
             // Unless the process is persistent, this process record is going away,
             // so make sure the service is cleaned out of it.
             if (!app.isPersistent()) {
-                app.services.removeAt(i);
+                app.stopService(sr);
                 app.updateBoundClientUids();
             }
 
@@ -4018,7 +4015,7 @@
         }
 
         if (!allowRestart) {
-            app.services.clear();
+            app.stopAllServices();
             app.clearBoundClientUids();
 
             // Make sure there are no more restarting services for this process.
@@ -4920,8 +4917,8 @@
             if (pr.uid != uid) {
                 continue;
             }
-            for (int j = pr.services.size() - 1; j >= 0; j--) {
-                ServiceRecord r = pr.services.valueAt(j);
+            for (int j = pr.numberOfRunningServices() - 1; j >= 0; j--) {
+                ServiceRecord r = pr.getRunningServiceAt(j);
                 if (!r.isForeground) {
                     continue;
                 }
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index e41ba0e..5d7590d 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -397,6 +397,7 @@
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
@@ -465,6 +466,8 @@
 
     static final String SYSTEM_DEBUGGABLE = "ro.debuggable";
 
+    static final String SYSTEM_USER_HOME_NEEDED = "ro.system_user_home_needed";
+
     public static final String ANR_TRACE_DIR = "/data/anr";
 
     // Maximum number of receivers an app can register.
@@ -2681,7 +2684,6 @@
         Slog.d("AppOps", "AppOpsService published");
         LocalServices.addService(ActivityManagerInternal.class, mInternal);
         mActivityTaskManager.onActivityManagerInternalAdded();
-        mUgmInternal.onActivityManagerInternalAdded();
         mPendingIntentController.onActivityManagerInternalAdded();
         // Wait for the synchronized block started in mProcessCpuThread,
         // so that any other access to mProcessCpuTracker from main thread
@@ -6410,7 +6412,7 @@
         if (pid == MY_PID) {
             return PackageManager.PERMISSION_GRANTED;
         }
-        return mUgmInternal.checkUriPermission(new GrantUri(userId, uri, false), uid, modeFlags)
+        return mUgmInternal.checkUriPermission(new GrantUri(userId, uri, modeFlags), uid, modeFlags)
                 ? PackageManager.PERMISSION_GRANTED : PackageManager.PERMISSION_DENIED;
     }
 
@@ -6422,7 +6424,7 @@
     public void grantUriPermission(IApplicationThread caller, String targetPkg, Uri uri,
             final int modeFlags, int userId) {
         enforceNotIsolatedCaller("grantUriPermission");
-        GrantUri grantUri = new GrantUri(userId, uri, false);
+        GrantUri grantUri = new GrantUri(userId, uri, modeFlags);
         synchronized(this) {
             final ProcessRecord r = getRecordForAppLocked(caller);
             if (r == null) {
@@ -6480,8 +6482,8 @@
                 return;
             }
 
-            mUgmInternal.revokeUriPermission(targetPackage, r.uid, new GrantUri(userId, uri, false),
-                    modeFlags);
+            mUgmInternal.revokeUriPermission(targetPackage, r.uid,
+                    new GrantUri(userId, uri, modeFlags), modeFlags);
         }
     }
 
@@ -9592,7 +9594,8 @@
             // to handle home activity in this case.
             if (UserManager.isSplitSystemUser() &&
                     Settings.Secure.getInt(mContext.getContentResolver(),
-                         Settings.Secure.USER_SETUP_COMPLETE, 0) != 0) {
+                         Settings.Secure.USER_SETUP_COMPLETE, 0) != 0
+                    || SystemProperties.getBoolean(SYSTEM_USER_HOME_NEEDED, false)) {
                 t.traceBegin("enableHomeActivity");
                 ComponentName cName = new ComponentName(mContext, SystemUserHomeActivity.class);
                 try {
@@ -9989,6 +9992,30 @@
     }
 
     /**
+     * Schedule to handle any pending system_server WTFs.
+     */
+    public void schedulePendingSystemServerWtfs(
+            final LinkedList<Pair<String, ApplicationErrorReport.CrashInfo>> list) {
+        mHandler.post(() -> handlePendingSystemServerWtfs(list));
+    }
+
+    /**
+     * Handle any pending system_server WTFs, add into the dropbox
+     */
+    private void handlePendingSystemServerWtfs(
+            final LinkedList<Pair<String, ApplicationErrorReport.CrashInfo>> list) {
+        ProcessRecord proc;
+        synchronized (mPidsSelfLocked) {
+            proc = mPidsSelfLocked.get(MY_PID);
+        }
+        for (Pair<String, ApplicationErrorReport.CrashInfo> p = list.poll();
+                p != null; p = list.poll()) {
+            addErrorToDropBox("wtf", proc, "system_server", null, null, null, p.first, null, null,
+                    p.second);
+        }
+    }
+
+    /**
      * @param app object of some object (as stored in {@link com.android.internal.os.RuntimeInit})
      * @return the corresponding {@link ProcessRecord} object, or null if none could be found
      */
@@ -18145,7 +18172,7 @@
         for (int i = mProcessList.mRemovedProcesses.size() - 1; i >= 0; i--) {
             final ProcessRecord app = mProcessList.mRemovedProcesses.get(i);
             if (!app.hasActivitiesOrRecentTasks()
-                    && app.curReceivers.isEmpty() && app.services.size() == 0) {
+                    && app.curReceivers.isEmpty() && app.numberOfRunningServices() == 0) {
                 Slog.i(
                     TAG, "Exiting empty application process "
                     + app.toShortString() + " ("
@@ -20018,8 +20045,7 @@
             if (uid == mTargetUid && isTargetOp(code)) {
                 final long identity = Binder.clearCallingIdentity();
                 try {
-                    return mAppOpsService.noteProxyOperation(code, Process.SHELL_UID,
-                            "com.android.shell", null, uid, packageName, featureId,
+                    return superImpl.apply(code, Process.SHELL_UID, "com.android.shell", featureId,
                             shouldCollectAsyncNotedOp, message);
                 } finally {
                     Binder.restoreCallingIdentity(identity);
diff --git a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
index 8f5fbf7..149e3ba 100644
--- a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
+++ b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
@@ -2504,7 +2504,7 @@
 
         IUsageStatsManager usm = IUsageStatsManager.Stub.asInterface(ServiceManager.getService(
                 Context.USAGE_STATS_SERVICE));
-        boolean isIdle = usm.isAppInactive(packageName, userId);
+        boolean isIdle = usm.isAppInactive(packageName, userId, SHELL_PACKAGE_NAME);
         pw.println("Idle=" + isIdle);
         return 0;
     }
diff --git a/services/core/java/com/android/server/am/AppErrors.java b/services/core/java/com/android/server/am/AppErrors.java
index b1fc029..50d2cab 100644
--- a/services/core/java/com/android/server/am/AppErrors.java
+++ b/services/core/java/com/android/server/am/AppErrors.java
@@ -702,10 +702,10 @@
         }
 
         // Bump up the crash count of any services currently running in the proc.
-        for (int i = app.services.size() - 1; i >= 0; i--) {
+        for (int i = app.numberOfRunningServices() - 1; i >= 0; i--) {
             // Any services running in the application need to be placed
             // back in the pending list.
-            ServiceRecord sr = app.services.valueAt(i);
+            ServiceRecord sr = app.getRunningServiceAt(i);
             // If the service was restarted a while ago, then reset crash count, else increment it.
             if (now > sr.restartTime + ProcessList.MIN_CRASH_INTERVAL) {
                 sr.crashCount = 1;
diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java
index dbad562..b647818 100644
--- a/services/core/java/com/android/server/am/BatteryStatsService.java
+++ b/services/core/java/com/android/server/am/BatteryStatsService.java
@@ -1013,9 +1013,7 @@
     @Override
     public void noteNetworkInterfaceType(String iface, int networkType) {
         enforceCallingPermission();
-        synchronized (mStats) {
-            mStats.noteNetworkInterfaceTypeLocked(iface, networkType);
-        }
+        mStats.noteNetworkInterfaceType(iface, networkType);
     }
 
     @Override
diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java
index 2d6ef81..ad85853 100644
--- a/services/core/java/com/android/server/am/OomAdjuster.java
+++ b/services/core/java/com/android/server/am/OomAdjuster.java
@@ -837,7 +837,8 @@
                         break;
                 }
 
-                if (app.isolated && app.services.size() <= 0 && app.isolatedEntryPoint == null) {
+                if (app.isolated && app.numberOfRunningServices() <= 0
+                        && app.isolatedEntryPoint == null) {
                     // If this is an isolated process, there are no services
                     // running in it, and it's not a special process with a
                     // custom entry point, then the process is no longer
@@ -1446,12 +1447,12 @@
         }
 
         int capabilityFromFGS = 0; // capability from foreground service.
-        for (int is = app.services.size() - 1;
+        for (int is = app.numberOfRunningServices() - 1;
                 is >= 0 && (adj > ProcessList.FOREGROUND_APP_ADJ
                         || schedGroup == ProcessList.SCHED_GROUP_BACKGROUND
                         || procState > PROCESS_STATE_TOP);
                 is--) {
-            ServiceRecord s = app.services.valueAt(is);
+            ServiceRecord s = app.getRunningServiceAt(is);
             if (s.startRequested) {
                 app.hasStartedServices = true;
                 if (procState > PROCESS_STATE_SERVICE) {
diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java
index 89fa02b..c9ee472 100644
--- a/services/core/java/com/android/server/am/ProcessList.java
+++ b/services/core/java/com/android/server/am/ProcessList.java
@@ -1668,6 +1668,33 @@
         return gidArray;
     }
 
+    private boolean shouldEnableTaggedPointers(ProcessRecord app) {
+        // Ensure we have platform + kernel support for TBI.
+        if (!Zygote.nativeSupportsTaggedPointers()) {
+            return false;
+        }
+
+        // Check to ensure the app hasn't explicitly opted-out of TBI via. the manifest attribute.
+        if (!app.info.allowsNativeHeapPointerTagging()) {
+            return false;
+        }
+
+        // Check to see that the compat feature for TBI is enabled.
+        if (!mPlatformCompat.isChangeEnabled(NATIVE_HEAP_POINTER_TAGGING, app.info)) {
+            return false;
+        }
+
+        return true;
+    }
+
+    private int decideTaggingLevel(ProcessRecord app) {
+        if (shouldEnableTaggedPointers(app)) {
+            return Zygote.MEMORY_TAG_LEVEL_TBI;
+        }
+
+        return 0;
+    }
+
     private int decideGwpAsanLevel(ProcessRecord app) {
         // Look at the process attribute first.
        if (app.processInfo != null
@@ -1856,15 +1883,6 @@
                 runtimeFlags |= Zygote.USE_APP_IMAGE_STARTUP_CACHE;
             }
 
-            if (Zygote.nativeSupportsTaggedPointers()) {
-                // Enable heap pointer tagging if supported by the kernel, unless disabled by the
-                // app manifest, target sdk level, or compat feature.
-                if (app.info.allowsNativeHeapPointerTagging()
-                        && mPlatformCompat.isChangeEnabled(NATIVE_HEAP_POINTER_TAGGING, app.info)) {
-                    runtimeFlags |= Zygote.MEMORY_TAG_LEVEL_TBI;
-                }
-            }
-
             runtimeFlags |= decideGwpAsanLevel(app);
 
             String invokeWith = null;
@@ -1895,6 +1913,20 @@
             app.setRequiredAbi(requiredAbi);
             app.instructionSet = instructionSet;
 
+            // If instructionSet is non-null, this indicates that the system_server is spawning a
+            // process with an ISA that may be different from its own. System (kernel and hardware)
+            // compatililty for these features is checked in the decideTaggingLevel in the
+            // system_server process (not the child process). As TBI is only supported in aarch64,
+            // we can simply ensure that the new process is also aarch64. This prevents the mismatch
+            // where a 64-bit system server spawns a 32-bit child that thinks it should enable some
+            // tagging variant. Theoretically, a 32-bit system server could exist that spawns 64-bit
+            // processes, in which case the new process won't get any tagging. This is fine as we
+            // haven't seen this configuration in practice, and we can reasonable assume that if
+            // tagging is desired, the system server will be 64-bit.
+            if (instructionSet == null || instructionSet.equals("arm64")) {
+                runtimeFlags |= decideTaggingLevel(app);
+            }
+
             // the per-user SELinux context must be set
             if (TextUtils.isEmpty(app.info.seInfoUser)) {
                 Slog.wtf(ActivityManagerService.TAG, "SELinux tag not defined",
@@ -2149,6 +2181,17 @@
         return result;
     }
 
+    private boolean needsStorageDataIsolation(StorageManagerInternal storageManagerInternal,
+            ProcessRecord app) {
+        return mVoldAppDataIsolationEnabled && UserHandle.isApp(app.uid)
+                && !storageManagerInternal.isExternalStorageService(app.uid)
+                // Special mounting mode doesn't need to have data isolation as they won't
+                // access /mnt/user anyway.
+                && app.mountMode != Zygote.MOUNT_EXTERNAL_ANDROID_WRITABLE
+                && app.mountMode != Zygote.MOUNT_EXTERNAL_PASS_THROUGH
+                && app.mountMode != Zygote.MOUNT_EXTERNAL_INSTALLER;
+    }
+
     private Process.ProcessStartResult startProcess(HostingRecord hostingRecord, String entryPoint,
             ProcessRecord app, int uid, int[] gids, int runtimeFlags, int zygotePolicyFlags,
             int mountExternal, String seInfo, String requiredAbi, String instructionSet,
@@ -2205,13 +2248,13 @@
             int userId = UserHandle.getUserId(uid);
             StorageManagerInternal storageManagerInternal = LocalServices.getService(
                     StorageManagerInternal.class);
-            if (mVoldAppDataIsolationEnabled && UserHandle.isApp(app.uid)
-                    && !storageManagerInternal.isExternalStorageService(uid)) {
+            if (needsStorageDataIsolation(storageManagerInternal, app)) {
                 bindMountAppStorageDirs = true;
-                if (!storageManagerInternal.prepareStorageDirs(userId, pkgDataInfoMap.keySet(),
+                if (pkgDataInfoMap == null ||
+                        !storageManagerInternal.prepareStorageDirs(userId, pkgDataInfoMap.keySet(),
                         app.processName)) {
-                    // Cannot prepare Android/app and Android/obb directory,
-                    // so we won't mount it in zygote.
+                    // Cannot prepare Android/app and Android/obb directory or inode == 0,
+                    // so we won't mount it in zygote, but resume the mount after unlocking device.
                     app.bindMountPending = true;
                     bindMountAppStorageDirs = false;
                 }
diff --git a/services/core/java/com/android/server/am/ProcessRecord.java b/services/core/java/com/android/server/am/ProcessRecord.java
index 61ebc36..a1ec07c 100644
--- a/services/core/java/com/android/server/am/ProcessRecord.java
+++ b/services/core/java/com/android/server/am/ProcessRecord.java
@@ -261,9 +261,9 @@
     // Controller for error dialogs
     private final ErrorDialogController mDialogController = new ErrorDialogController();
     // Controller for driving the process state on the window manager side.
-    final private WindowProcessController mWindowProcessController;
+    private final WindowProcessController mWindowProcessController;
     // all ServiceRecord running in this process
-    final ArraySet<ServiceRecord> services = new ArraySet<>();
+    private final ArraySet<ServiceRecord> mServices = new ArraySet<>();
     // services that are currently executing code (need to remain foreground).
     final ArraySet<ServiceRecord> executingServices = new ArraySet<>();
     // All ConnectionRecord this process holds
@@ -577,10 +577,10 @@
             pw.println(Arrays.toString(isolatedEntryPointArgs));
         }
         mWindowProcessController.dump(pw, prefix);
-        if (services.size() > 0) {
+        if (mServices.size() > 0) {
             pw.print(prefix); pw.println("Services:");
-            for (int i=0; i<services.size(); i++) {
-                pw.print(prefix); pw.print("  - "); pw.println(services.valueAt(i));
+            for (int i = 0; i < mServices.size(); i++) {
+                pw.print(prefix); pw.print("  - "); pw.println(mServices.valueAt(i));
             }
         }
         if (executingServices.size() > 0) {
@@ -735,6 +735,60 @@
         }
     }
 
+    /**
+     * Records a service as running in the process. Note that this method does not actually start
+     * the service, but records the service as started for bookkeeping.
+     *
+     * @return true if the service was added, false otherwise.
+     */
+    boolean startService(ServiceRecord record) {
+        if (record == null) {
+            return false;
+        }
+        boolean added = mServices.add(record);
+        if (added && record.serviceInfo != null) {
+            mWindowProcessController.onServiceStarted(record.serviceInfo);
+        }
+        return added;
+    }
+
+    /**
+     * Records a service as stopped. Note that like {@link #startService(ServiceRecord)} this method
+     * does not actually stop the service, but records the service as stopped for bookkeeping.
+     *
+     * @return true if the service was removed, false otherwise.
+     */
+    boolean stopService(ServiceRecord record) {
+        return mServices.remove(record);
+    }
+
+    /**
+     * The same as calling {@link #stopService(ServiceRecord)} on all current running services.
+     */
+    void stopAllServices() {
+        mServices.clear();
+    }
+
+    /**
+     * Returns the number of services added with {@link #startService(ServiceRecord)} and not yet
+     * removed by a call to {@link #stopService(ServiceRecord)} or {@link #stopAllServices()}.
+     *
+     * @see #startService(ServiceRecord)
+     * @see #stopService(ServiceRecord)
+     */
+    int numberOfRunningServices() {
+        return mServices.size();
+    }
+
+    /**
+     * Returns the service at the specified {@code index}.
+     *
+     * @see #numberOfRunningServices()
+     */
+    ServiceRecord getRunningServiceAt(int index) {
+        return mServices.valueAt(index);
+    }
+
     void setCached(boolean cached) {
         if (mCached != cached) {
             mCached = cached;
@@ -768,9 +822,9 @@
             return true;
         }
 
-        final int servicesSize = services.size();
+        final int servicesSize = mServices.size();
         for (int i = 0; i < servicesSize; i++) {
-            ServiceRecord r = services.valueAt(i);
+            ServiceRecord r = mServices.valueAt(i);
             if (r.isForeground) {
                 return true;
             }
@@ -1289,16 +1343,16 @@
     }
 
     void updateBoundClientUids() {
-        if (services.isEmpty()) {
+        if (mServices.isEmpty()) {
             clearBoundClientUids();
             return;
         }
         // grab a set of clientUids of all connections of all services
         ArraySet<Integer> boundClientUids = new ArraySet<>();
-        final int K = services.size();
-        for (int j = 0; j < K; j++) {
+        final int serviceCount = mServices.size();
+        for (int j = 0; j < serviceCount; j++) {
             ArrayMap<IBinder, ArrayList<ConnectionRecord>> conns =
-                    services.valueAt(j).getConnections();
+                    mServices.valueAt(j).getConnections();
             final int N = conns.size();
             for (int conni = 0; conni < N; conni++) {
                 ArrayList<ConnectionRecord> c = conns.valueAt(conni);
diff --git a/services/core/java/com/android/server/am/UserController.java b/services/core/java/com/android/server/am/UserController.java
index e02c6f9..c7c2510 100644
--- a/services/core/java/com/android/server/am/UserController.java
+++ b/services/core/java/com/android/server/am/UserController.java
@@ -40,6 +40,7 @@
 import static com.android.server.am.UserState.STATE_RUNNING_UNLOCKED;
 import static com.android.server.am.UserState.STATE_RUNNING_UNLOCKING;
 
+import android.annotation.IntDef;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.UserIdInt;
@@ -89,6 +90,7 @@
 import android.util.Slog;
 import android.util.SparseArray;
 import android.util.SparseIntArray;
+import android.util.SparseLongArray;
 import android.util.proto.ProtoOutputStream;
 
 import com.android.internal.R;
@@ -112,6 +114,7 @@
 import java.util.Iterator;
 import java.util.List;
 import java.util.Objects;
+import java.util.concurrent.ThreadLocalRandom;
 import java.util.concurrent.atomic.AtomicInteger;
 
 /**
@@ -159,8 +162,45 @@
     // when it never calls back.
     private static final int USER_SWITCH_CALLBACKS_TIMEOUT_MS = 5 * 1000;
 
-    // TODO(b/149604218): STOPSHIP remove  this constant and the logcat
-    private static final boolean TESTS_NEED_LOGCAT = true;
+    // Used for statsd logging with UserLifecycleJourneyReported + UserLifecycleEventOccurred atoms
+    private static final long INVALID_SESSION_ID = 0;
+
+    // The various user journeys, defined in the UserLifecycleJourneyReported atom for statsd
+    private static final int USER_JOURNEY_UNKNOWN =
+            FrameworkStatsLog.USER_LIFECYCLE_JOURNEY_REPORTED__JOURNEY__UNKNOWN;
+    private static final int USER_JOURNEY_USER_SWITCH_FG =
+            FrameworkStatsLog.USER_LIFECYCLE_JOURNEY_REPORTED__JOURNEY__USER_SWITCH_FG;
+    private static final int USER_JOURNEY_USER_SWITCH_UI =
+            FrameworkStatsLog.USER_LIFECYCLE_JOURNEY_REPORTED__JOURNEY__USER_SWITCH_UI;
+    private static final int USER_JOURNEY_USER_START =
+            FrameworkStatsLog.USER_LIFECYCLE_JOURNEY_REPORTED__JOURNEY__USER_START;
+    private static final int USER_JOURNEY_USER_CREATE =
+            FrameworkStatsLog.USER_LIFECYCLE_JOURNEY_REPORTED__JOURNEY__USER_CREATE;
+    @IntDef(prefix = { "USER_JOURNEY" }, value = {
+            USER_JOURNEY_UNKNOWN,
+            USER_JOURNEY_USER_SWITCH_FG,
+            USER_JOURNEY_USER_SWITCH_UI,
+            USER_JOURNEY_USER_START,
+            USER_JOURNEY_USER_CREATE,
+    })
+    @interface UserJourney {}
+
+    // The various user lifecycle events, defined in the UserLifecycleEventOccurred atom for statsd
+    private static final int USER_LIFECYCLE_EVENT_UNKNOWN =
+            FrameworkStatsLog.USER_LIFECYCLE_EVENT_OCCURRED__EVENT__UNKNOWN;
+    private static final int USER_LIFECYCLE_EVENT_SWITCH_USER =
+            FrameworkStatsLog.USER_LIFECYCLE_EVENT_OCCURRED__EVENT__SWITCH_USER;
+    private static final int USER_LIFECYCLE_EVENT_START_USER =
+            FrameworkStatsLog.USER_LIFECYCLE_EVENT_OCCURRED__EVENT__START_USER;
+    private static final int USER_LIFECYCLE_EVENT_CREATE_USER =
+            FrameworkStatsLog.USER_LIFECYCLE_EVENT_OCCURRED__EVENT__CREATE_USER;
+    @IntDef(prefix = { "USER_LIFECYCLE_EVENT" }, value = {
+            USER_LIFECYCLE_EVENT_UNKNOWN,
+            USER_LIFECYCLE_EVENT_SWITCH_USER,
+            USER_LIFECYCLE_EVENT_START_USER,
+            USER_LIFECYCLE_EVENT_CREATE_USER,
+    })
+    @interface UserLifecycleEvent {}
 
     /**
      * Maximum number of users we allow to be running at a time, including system user.
@@ -270,6 +310,13 @@
     @GuardedBy("mLock")
     private final ArrayList<Integer> mLastActiveUsers = new ArrayList<>();
 
+    /**
+     * A per-user, journey to session id map, used for statsd logging for the
+     * UserLifecycleJourneyReported and UserLifecycleEventOccurred atoms.
+     */
+    @GuardedBy("mUserJourneyToSessionIdMap")
+    private final SparseArray<SparseLongArray> mUserJourneyToSessionIdMap = new SparseArray<>();
+
     UserController(ActivityManagerService service) {
         this(new Injector(service));
     }
@@ -1671,9 +1718,6 @@
     }
 
     void continueUserSwitch(UserState uss, int oldUserId, int newUserId) {
-        if (TESTS_NEED_LOGCAT) {
-            Slog.d(TAG, "Continue user switch oldUser #" + oldUserId + ", newUser #" + newUserId);
-        }
         EventLog.writeEvent(EventLogTags.UC_CONTINUE_USER_SWITCH, oldUserId, newUserId);
 
         if (isUserSwitchUiEnabled()) {
@@ -1827,8 +1871,10 @@
                     builder.append("; this requires ");
                     builder.append(INTERACT_ACROSS_USERS_FULL);
                     if (allowMode != ALLOW_FULL_ONLY) {
-                        builder.append(" or ");
-                        builder.append(INTERACT_ACROSS_USERS);
+                        if (allowMode == ALLOW_NON_FULL || isSameProfileGroup) {
+                            builder.append(" or ");
+                            builder.append(INTERACT_ACROSS_USERS);
+                        }
                         if (isSameProfileGroup
                                 && allowMode == ALLOW_ALL_PROFILE_PERMISSIONS_IN_PROFILE) {
                             builder.append(" or ");
@@ -2349,6 +2395,10 @@
     public boolean handleMessage(Message msg) {
         switch (msg.what) {
             case START_USER_SWITCH_FG_MSG:
+                logUserJourneyInfo(getUserInfo(getCurrentUserId()), getUserInfo(msg.arg1),
+                        USER_JOURNEY_USER_SWITCH_FG);
+                logUserLifecycleEvent(msg.arg1, USER_JOURNEY_USER_SWITCH_FG,
+                        USER_LIFECYCLE_EVENT_SWITCH_USER, true);
                 startUserInForeground(msg.arg1);
                 break;
             case REPORT_USER_SWITCH_MSG:
@@ -2370,8 +2420,14 @@
                 mInjector.batteryStatsServiceNoteEvent(
                         BatteryStats.HistoryItem.EVENT_USER_RUNNING_START,
                         Integer.toString(msg.arg1), msg.arg1);
+                logUserJourneyInfo(null, getUserInfo(msg.arg1), USER_JOURNEY_USER_START);
+                logUserLifecycleEvent(msg.arg1, USER_JOURNEY_USER_START,
+                        USER_LIFECYCLE_EVENT_START_USER, true);
                 mInjector.getSystemServiceManager().startUser(TimingsTraceAndSlog.newAsyncLog(),
                         msg.arg1);
+                logUserLifecycleEvent(msg.arg1, USER_JOURNEY_USER_START,
+                        USER_LIFECYCLE_EVENT_START_USER, false);
+                clearSessionId(msg.arg1, USER_JOURNEY_USER_START);
                 break;
             case USER_UNLOCK_MSG:
                 final int userId = msg.arg1;
@@ -2400,17 +2456,94 @@
                 break;
             case REPORT_USER_SWITCH_COMPLETE_MSG:
                 dispatchUserSwitchComplete(msg.arg1);
+                final int currentJourney = mUserSwitchUiEnabled ? USER_JOURNEY_USER_SWITCH_UI
+                                                                : USER_JOURNEY_USER_SWITCH_FG;
+                logUserLifecycleEvent(msg.arg1, currentJourney,
+                        USER_LIFECYCLE_EVENT_SWITCH_USER, false);
+                clearSessionId(msg.arg1, currentJourney);
                 break;
             case REPORT_LOCKED_BOOT_COMPLETE_MSG:
                 dispatchLockedBootComplete(msg.arg1);
                 break;
             case START_USER_SWITCH_UI_MSG:
-                showUserSwitchDialog((Pair<UserInfo, UserInfo>) msg.obj);
+                final Pair<UserInfo, UserInfo> fromToUserPair = (Pair<UserInfo, UserInfo>) msg.obj;
+                logUserJourneyInfo(fromToUserPair.first, fromToUserPair.second,
+                        USER_JOURNEY_USER_SWITCH_UI);
+                logUserLifecycleEvent(fromToUserPair.second.id, USER_JOURNEY_USER_SWITCH_UI,
+                        USER_LIFECYCLE_EVENT_SWITCH_USER, true);
+                showUserSwitchDialog(fromToUserPair);
                 break;
         }
         return false;
     }
 
+    /**
+     * statsd helper method for logging the start of a user journey via a UserLifecycleEventOccurred
+     * atom given the originating and targeting users for the journey.
+     *
+     * Note: these info atoms are currently logged more than once per journey since there is no
+     * state associated with the user's ongoing journey - this will be updated in a later CL.
+     */
+    private void logUserJourneyInfo(UserInfo origin, UserInfo target, @UserJourney int journey) {
+        final long newSessionId = ThreadLocalRandom.current().nextLong(1, Long.MAX_VALUE);
+        synchronized (mUserJourneyToSessionIdMap) {
+            SparseLongArray userSessions = mUserJourneyToSessionIdMap.get(target.id);
+            if (userSessions == null) {
+                userSessions = new SparseLongArray();
+                mUserJourneyToSessionIdMap.put(target.id, userSessions);
+            }
+            final long oldSessionId = userSessions.get(journey);
+            if (oldSessionId != INVALID_SESSION_ID) {
+                // potentially an incomplete or timed-out session
+                FrameworkStatsLog.write(FrameworkStatsLog.USER_LIFECYCLE_EVENT_OCCURRED,
+                        oldSessionId, target.id, USER_LIFECYCLE_EVENT_UNKNOWN,
+                        FrameworkStatsLog.USER_LIFECYCLE_EVENT_OCCURRED__STATE__NONE);
+            }
+            // update session id
+            userSessions.put(journey, newSessionId);
+        }
+
+        FrameworkStatsLog.write(FrameworkStatsLog.USER_LIFECYCLE_JOURNEY_REPORTED, newSessionId,
+                journey, origin != null ? origin.id : -1,
+                target.id, UserManager.getUserTypeForStatsd(target.userType), target.flags);
+    }
+
+    /**
+     * statsd helper method for logging the begin or finish of the given event for the
+     * UserLifecycleEventOccurred statsd atom.
+     * Note: This does not clear the user's journey session id - if this event represents the end of
+     * a particular journey, call {@link #clearSessionId} to indicate that the session is over.
+     */
+    private void logUserLifecycleEvent(@UserIdInt int userId, @UserJourney int journey,
+            @UserLifecycleEvent int event, boolean begin) {
+        final long sessionId;
+        synchronized (mUserJourneyToSessionIdMap) {
+            final SparseLongArray eventToSessionMap = mUserJourneyToSessionIdMap.get(userId);
+            if (eventToSessionMap == null || eventToSessionMap.size() == 0) {
+                return;
+            }
+            sessionId = eventToSessionMap.get(journey);
+            if (sessionId == INVALID_SESSION_ID) {
+                return;
+            }
+        }
+
+        FrameworkStatsLog.write(FrameworkStatsLog.USER_LIFECYCLE_EVENT_OCCURRED, sessionId, userId,
+                event, begin ? FrameworkStatsLog.USER_LIFECYCLE_EVENT_OCCURRED__STATE__BEGIN
+                             : FrameworkStatsLog.USER_LIFECYCLE_EVENT_OCCURRED__STATE__FINISH);
+    }
+
+    /**
+     * Clears the user's session id associated with the given UserJourney (for statsd).
+     */
+    private void clearSessionId(@UserIdInt int userId, @UserJourney int journey) {
+        synchronized (mUserJourneyToSessionIdMap) {
+            if (mUserJourneyToSessionIdMap.get(userId) != null) {
+                mUserJourneyToSessionIdMap.get(userId).delete(journey);
+            }
+        }
+    }
+
     private static class UserProgressListener extends IProgressListener.Stub {
         private volatile long mUnlockStarted;
         @Override
diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java
index 31bccea..1139fb2 100644
--- a/services/core/java/com/android/server/appop/AppOpsService.java
+++ b/services/core/java/com/android/server/appop/AppOpsService.java
@@ -2830,7 +2830,6 @@
 
     private int checkOperationImpl(int code, int uid, String packageName,
                 boolean raw) {
-        verifyIncomingUid(uid);
         verifyIncomingOp(code);
         String resolvedPackageName = resolvePackageName(uid, packageName);
         if (resolvedPackageName == null) {
@@ -5309,6 +5308,12 @@
                     pw.print("    pendingCapability=");
                     pw.println(uidState.pendingCapability);
                 }
+                pw.print("    appWidgetVisible=");
+                pw.println(uidState.appWidgetVisible);
+                if (uidState.appWidgetVisible != uidState.pendingAppWidgetVisible) {
+                    pw.print("    pendingAppWidgetVisible=");
+                    pw.println(uidState.pendingAppWidgetVisible);
+                }
                 if (uidState.pendingStateCommitTime != 0) {
                     pw.print("    pendingStateCommitTime=");
                     TimeUtils.formatDuration(uidState.pendingStateCommitTime, nowElapsed, pw);
@@ -5745,7 +5750,7 @@
      */
     private void switchPackageIfBootTimeOrRarelyUsedLocked(@NonNull String packageName) {
         if (mSampledPackage == null) {
-            if (ThreadLocalRandom.current().nextFloat() < 0.1f) {
+            if (ThreadLocalRandom.current().nextFloat() < 0.5f) {
                 mSamplingStrategy = SAMPLING_STRATEGY_BOOT_TIME_SAMPLING;
                 resampleAppOpForPackageLocked(packageName);
             }
diff --git a/services/core/java/com/android/server/appop/TEST_MAPPING b/services/core/java/com/android/server/appop/TEST_MAPPING
index 9c03a36..604b9f1 100644
--- a/services/core/java/com/android/server/appop/TEST_MAPPING
+++ b/services/core/java/com/android/server/appop/TEST_MAPPING
@@ -38,6 +38,9 @@
         },
         {
             "name": "CtsAppTestCases:ActivityManagerApi29Test"
+        },
+        {
+            "name": "UidAtomTests:testAppOps"
         }
     ]
 }
diff --git a/services/core/java/com/android/server/audio/AudioDeviceBroker.java b/services/core/java/com/android/server/audio/AudioDeviceBroker.java
index c2c79d3..032ad63 100644
--- a/services/core/java/com/android/server/audio/AudioDeviceBroker.java
+++ b/services/core/java/com/android/server/audio/AudioDeviceBroker.java
@@ -30,6 +30,7 @@
 import android.media.AudioSystem;
 import android.media.IAudioRoutesObserver;
 import android.media.IStrategyPreferredDeviceDispatcher;
+import android.media.MediaMetrics;
 import android.os.Binder;
 import android.os.Handler;
 import android.os.IBinder;
@@ -668,6 +669,13 @@
         }
         AudioService.sForceUseLogger.log(
                 new AudioServiceEvents.ForceUseEvent(useCase, config, eventSource));
+        new MediaMetrics.Item(MediaMetrics.Name.AUDIO_FORCE_USE + MediaMetrics.SEPARATOR
+                + AudioSystem.forceUseUsageToString(useCase))
+                .set(MediaMetrics.Property.EVENT, "onSetForceUse")
+                .set(MediaMetrics.Property.FORCE_USE_DUE_TO, eventSource)
+                .set(MediaMetrics.Property.FORCE_USE_MODE,
+                        AudioSystem.forceUseConfigToString(config))
+                .record();
         AudioSystem.setForceUse(useCase, config);
     }
 
diff --git a/services/core/java/com/android/server/audio/AudioDeviceInventory.java b/services/core/java/com/android/server/audio/AudioDeviceInventory.java
index c17ed3e..3e97a1e 100644
--- a/services/core/java/com/android/server/audio/AudioDeviceInventory.java
+++ b/services/core/java/com/android/server/audio/AudioDeviceInventory.java
@@ -33,6 +33,7 @@
 import android.media.AudioSystem;
 import android.media.IAudioRoutesObserver;
 import android.media.IStrategyPreferredDeviceDispatcher;
+import android.media.MediaMetrics;
 import android.os.Binder;
 import android.os.RemoteCallbackList;
 import android.os.RemoteException;
@@ -64,10 +65,69 @@
     // lock to synchronize all access to mConnectedDevices and mApmConnectedDevices
     private final Object mDevicesLock = new Object();
 
+    //Audio Analytics ids.
+    private static final String mMetricsId = "audio.device.";
+
     // List of connected devices
     // Key for map created from DeviceInfo.makeDeviceListKey()
     @GuardedBy("mDevicesLock")
-    private final LinkedHashMap<String, DeviceInfo> mConnectedDevices = new LinkedHashMap<>();
+    private final LinkedHashMap<String, DeviceInfo> mConnectedDevices = new LinkedHashMap<>() {
+        @Override
+        public DeviceInfo put(String key, DeviceInfo value) {
+            final DeviceInfo result = super.put(key, value);
+            record("put", true /* connected */, key, value);
+            return result;
+        }
+
+        @Override
+        public DeviceInfo putIfAbsent(String key, DeviceInfo value) {
+            final DeviceInfo result = super.putIfAbsent(key, value);
+            if (result == null) {
+                record("putIfAbsent", true /* connected */, key, value);
+            }
+            return result;
+        }
+
+        @Override
+        public DeviceInfo remove(Object key) {
+            final DeviceInfo result = super.remove(key);
+            if (result != null) {
+                record("remove", false /* connected */, (String) key, result);
+            }
+            return result;
+        }
+
+        @Override
+        public boolean remove(Object key, Object value) {
+            final boolean result = super.remove(key, value);
+            if (result) {
+                record("remove", false /* connected */, (String) key, (DeviceInfo) value);
+            }
+            return result;
+        }
+
+        // Not overridden
+        // clear
+        // compute
+        // computeIfAbsent
+        // computeIfPresent
+        // merge
+        // putAll
+        // replace
+        // replaceAll
+        private void record(String event, boolean connected, String key, DeviceInfo value) {
+            // DeviceInfo - int mDeviceType;
+            // DeviceInfo - int mDeviceCodecFormat;
+            new MediaMetrics.Item(MediaMetrics.Name.AUDIO_DEVICE
+                    + MediaMetrics.SEPARATOR + AudioSystem.getDeviceName(value.mDeviceType))
+                    .set(MediaMetrics.Property.ADDRESS, value.mDeviceAddress)
+                    .set(MediaMetrics.Property.EVENT, event)
+                    .set(MediaMetrics.Property.NAME, value.mDeviceName)
+                    .set(MediaMetrics.Property.STATE, connected
+                            ? MediaMetrics.Value.CONNECTED : MediaMetrics.Value.DISCONNECTED)
+                    .record();
+        }
+    };
 
     // List of devices actually connected to AudioPolicy (through AudioSystem), only one
     // by device type, which is used as the key, value is the DeviceInfo generated key.
@@ -236,6 +296,16 @@
                         + " codec=" + a2dpCodec
                         + " vol=" + a2dpVolume));
 
+        new MediaMetrics.Item(mMetricsId + "a2dp")
+                .set(MediaMetrics.Property.ADDRESS, address)
+                .set(MediaMetrics.Property.ENCODING, AudioSystem.audioFormatToString(a2dpCodec))
+                .set(MediaMetrics.Property.EVENT, "onSetA2dpSinkConnectionState")
+                .set(MediaMetrics.Property.INDEX, a2dpVolume)
+                .set(MediaMetrics.Property.STATE,
+                        state == BluetoothProfile.STATE_CONNECTED
+                        ? MediaMetrics.Value.CONNECTED : MediaMetrics.Value.DISCONNECTED)
+                .record();
+
         synchronized (mDevicesLock) {
             final String key = DeviceInfo.makeDeviceListKey(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP,
                     btDevice.getAddress());
@@ -284,6 +354,15 @@
             final DeviceInfo di = mConnectedDevices.get(key);
             boolean isConnected = di != null;
 
+            new MediaMetrics.Item(mMetricsId + "onSetA2dpSourceConnectionState")
+                    .set(MediaMetrics.Property.ADDRESS, address)
+                    .set(MediaMetrics.Property.DEVICE,
+                            AudioSystem.getDeviceName(AudioSystem.DEVICE_IN_BLUETOOTH_A2DP))
+                    .set(MediaMetrics.Property.STATE,
+                            state == BluetoothProfile.STATE_CONNECTED
+                            ? MediaMetrics.Value.CONNECTED : MediaMetrics.Value.DISCONNECTED)
+                    .record();
+
             if (isConnected && state != BluetoothProfile.STATE_CONNECTED) {
                 makeA2dpSrcUnavailable(address);
             } else if (!isConnected && state == BluetoothProfile.STATE_CONNECTED) {
@@ -301,6 +380,17 @@
         AudioService.sDeviceLogger.log(new AudioEventLogger.StringEvent(
                 "onSetHearingAidConnectionState addr=" + address));
 
+        new MediaMetrics.Item(mMetricsId + "onSetHearingAidConnectionState")
+                .set(MediaMetrics.Property.ADDRESS, address)
+                .set(MediaMetrics.Property.DEVICE,
+                        AudioSystem.getDeviceName(AudioSystem.DEVICE_IN_BLUETOOTH_A2DP))
+                .set(MediaMetrics.Property.STATE,
+                        state == BluetoothProfile.STATE_CONNECTED
+                                ? MediaMetrics.Value.CONNECTED : MediaMetrics.Value.DISCONNECTED)
+                .set(MediaMetrics.Property.STREAM_TYPE,
+                        AudioSystem.streamToString(streamType))
+                .record();
+
         synchronized (mDevicesLock) {
             final String key = DeviceInfo.makeDeviceListKey(AudioSystem.DEVICE_OUT_HEARING_AID,
                     btDevice.getAddress());
@@ -317,10 +407,15 @@
     }
 
     @GuardedBy("AudioDeviceBroker.mDeviceStateLock")
-    /*package*/ void onBluetoothA2dpActiveDeviceChange(
+        /*package*/ void onBluetoothA2dpActiveDeviceChange(
             @NonNull BtHelper.BluetoothA2dpDeviceInfo btInfo, int event) {
+        MediaMetrics.Item mmi = new MediaMetrics.Item(mMetricsId
+                + "onBluetoothA2dpActiveDeviceChange")
+                .set(MediaMetrics.Property.EVENT, BtHelper.a2dpDeviceEventToString(event));
+
         final BluetoothDevice btDevice = btInfo.getBtDevice();
         if (btDevice == null) {
+            mmi.set(MediaMetrics.Property.EARLY_RETURN, "btDevice null").record();
             return;
         }
         if (AudioService.DEBUG_DEVICES) {
@@ -341,6 +436,8 @@
             if (mDeviceBroker.hasScheduledA2dpSinkConnectionState(btDevice)) {
                 AudioService.sDeviceLogger.log(new AudioEventLogger.StringEvent(
                         "A2dp config change ignored (scheduled connection change)"));
+                mmi.set(MediaMetrics.Property.EARLY_RETURN, "A2dp config change ignored")
+                        .record();
                 return;
             }
             final String key = DeviceInfo.makeDeviceListKey(
@@ -348,9 +445,16 @@
             final DeviceInfo di = mConnectedDevices.get(key);
             if (di == null) {
                 Log.e(TAG, "invalid null DeviceInfo in onBluetoothA2dpActiveDeviceChange");
+                mmi.set(MediaMetrics.Property.EARLY_RETURN, "null DeviceInfo").record();
                 return;
             }
 
+            mmi.set(MediaMetrics.Property.ADDRESS, address)
+                    .set(MediaMetrics.Property.ENCODING,
+                            AudioSystem.audioFormatToString(a2dpCodec))
+                    .set(MediaMetrics.Property.INDEX, a2dpVolume)
+                    .set(MediaMetrics.Property.NAME, di.mDeviceName);
+
             if (event == BtHelper.EVENT_ACTIVE_DEVICE_CHANGE) {
                 // Device is connected
                 if (a2dpVolume != -1) {
@@ -388,6 +492,7 @@
                                 + address + " codec=" + a2dpCodec).printLog(TAG));
             }
         }
+        mmi.record();
     }
 
     /*package*/ void onMakeA2dpDeviceUnavailableNow(String address, int a2dpCodec) {
@@ -399,6 +504,9 @@
     /*package*/ void onReportNewRoutes() {
         int n = mRoutesObservers.beginBroadcast();
         if (n > 0) {
+            new MediaMetrics.Item(mMetricsId + "onReportNewRoutes")
+                    .set(MediaMetrics.Property.OBSERVERS, n)
+                    .record();
             AudioRoutesInfo routes;
             synchronized (mCurAudioRoutes) {
                 routes = new AudioRoutesInfo(mCurAudioRoutes);
@@ -428,6 +536,13 @@
                             AudioDeviceInventory.WiredDeviceConnectionState wdcs) {
         AudioService.sDeviceLogger.log(new AudioServiceEvents.WiredDevConnectEvent(wdcs));
 
+        MediaMetrics.Item mmi = new MediaMetrics.Item(mMetricsId
+                + "onSetWiredDeviceConnectionState")
+                .set(MediaMetrics.Property.ADDRESS, wdcs.mAddress)
+                .set(MediaMetrics.Property.DEVICE, AudioSystem.getDeviceName(wdcs.mType))
+                .set(MediaMetrics.Property.STATE,
+                        wdcs.mState == AudioService.CONNECTION_STATE_DISCONNECTED
+                                ? MediaMetrics.Value.DISCONNECTED : MediaMetrics.Value.CONNECTED);
         synchronized (mDevicesLock) {
             if ((wdcs.mState == AudioService.CONNECTION_STATE_DISCONNECTED)
                     && DEVICE_OVERRIDE_A2DP_ROUTE_ON_PLUG_SET.contains(wdcs.mType)) {
@@ -438,6 +553,8 @@
             if (!handleDeviceConnection(wdcs.mState == AudioService.CONNECTION_STATE_CONNECTED,
                     wdcs.mType, wdcs.mAddress, wdcs.mName)) {
                 // change of connection state failed, bailout
+                mmi.set(MediaMetrics.Property.EARLY_RETURN, "change of connection state failed")
+                        .record();
                 return;
             }
             if (wdcs.mState != AudioService.CONNECTION_STATE_DISCONNECTED) {
@@ -453,15 +570,20 @@
             sendDeviceConnectionIntent(wdcs.mType, wdcs.mState, wdcs.mAddress, wdcs.mName);
             updateAudioRoutes(wdcs.mType, wdcs.mState);
         }
+        mmi.record();
     }
 
     /*package*/ void onToggleHdmi() {
+        MediaMetrics.Item mmi = new MediaMetrics.Item(mMetricsId + "onToggleHdmi")
+                .set(MediaMetrics.Property.DEVICE,
+                        AudioSystem.getDeviceName(AudioSystem.DEVICE_OUT_HDMI));
         synchronized (mDevicesLock) {
             // Is HDMI connected?
             final String key = DeviceInfo.makeDeviceListKey(AudioSystem.DEVICE_OUT_HDMI, "");
             final DeviceInfo di = mConnectedDevices.get(key);
             if (di == null) {
                 Log.e(TAG, "invalid null DeviceInfo in onToggleHdmi");
+                mmi.set(MediaMetrics.Property.EARLY_RETURN, "invalid null DeviceInfo").record();
                 return;
             }
             // Toggle HDMI to retrigger broadcast with proper formats.
@@ -472,6 +594,7 @@
                     AudioSystem.DEVICE_STATE_AVAILABLE, "", "",
                     "android"); // reconnect
         }
+        mmi.record();
     }
 
     /*package*/ void onSaveSetPreferredDevice(int strategy, @NonNull AudioDeviceAttributes device) {
@@ -535,6 +658,12 @@
                     + Integer.toHexString(device) + " address:" + address
                     + " name:" + deviceName + ")");
         }
+        MediaMetrics.Item mmi = new MediaMetrics.Item(mMetricsId + "handleDeviceConnection")
+                .set(MediaMetrics.Property.ADDRESS, address)
+                .set(MediaMetrics.Property.DEVICE, AudioSystem.getDeviceName(device))
+                .set(MediaMetrics.Property.MODE, connect
+                        ? MediaMetrics.Value.CONNECT : MediaMetrics.Value.DISCONNECT)
+                .set(MediaMetrics.Property.NAME, deviceName);
         synchronized (mDevicesLock) {
             final String deviceKey = DeviceInfo.makeDeviceListKey(device, address);
             if (AudioService.DEBUG_DEVICES) {
@@ -550,13 +679,18 @@
                         AudioSystem.DEVICE_STATE_AVAILABLE, address, deviceName,
                         AudioSystem.AUDIO_FORMAT_DEFAULT);
                 if (res != AudioSystem.AUDIO_STATUS_OK) {
-                    Slog.e(TAG, "not connecting device 0x" + Integer.toHexString(device)
-                            + " due to command error " + res);
+                    final String reason = "not connecting device 0x" + Integer.toHexString(device)
+                            + " due to command error " + res;
+                    Slog.e(TAG, reason);
+                    mmi.set(MediaMetrics.Property.EARLY_RETURN, reason)
+                            .set(MediaMetrics.Property.STATE, MediaMetrics.Value.DISCONNECTED)
+                            .record();
                     return false;
                 }
                 mConnectedDevices.put(deviceKey, new DeviceInfo(
                         device, deviceName, address, AudioSystem.AUDIO_FORMAT_DEFAULT));
                 mDeviceBroker.postAccessoryPlugMediaUnmute(device);
+                mmi.set(MediaMetrics.Property.STATE, MediaMetrics.Value.CONNECTED).record();
                 return true;
             } else if (!connect && isConnected) {
                 mAudioSystem.setDeviceConnectionState(device,
@@ -564,11 +698,13 @@
                         AudioSystem.AUDIO_FORMAT_DEFAULT);
                 // always remove even if disconnection failed
                 mConnectedDevices.remove(deviceKey);
+                mmi.set(MediaMetrics.Property.STATE, MediaMetrics.Value.CONNECTED).record();
                 return true;
             }
             Log.w(TAG, "handleDeviceConnection() failed, deviceKey=" + deviceKey
                     + ", deviceSpec=" + di + ", connect=" + connect);
         }
+        mmi.set(MediaMetrics.Property.STATE, MediaMetrics.Value.DISCONNECTED).record();
         return false;
     }
 
@@ -582,6 +718,8 @@
                     toRemove.add(deviceInfo.mDeviceAddress);
                 }
             });
+            new MediaMetrics.Item(mMetricsId + "disconnectA2dp")
+                    .record();
             if (toRemove.size() > 0) {
                 final int delay = checkSendBecomingNoisyIntentInt(
                         AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP,
@@ -602,6 +740,8 @@
                     toRemove.add(deviceInfo.mDeviceAddress);
                 }
             });
+            new MediaMetrics.Item(mMetricsId + "disconnectA2dpSink")
+                    .record();
             toRemove.stream().forEach(deviceAddress -> makeA2dpSrcUnavailable(deviceAddress));
         }
     }
@@ -615,6 +755,8 @@
                     toRemove.add(deviceInfo.mDeviceAddress);
                 }
             });
+            new MediaMetrics.Item(mMetricsId + "disconnectHearingAid")
+                    .record();
             if (toRemove.size() > 0) {
                 final int delay = checkSendBecomingNoisyIntentInt(
                         AudioSystem.DEVICE_OUT_HEARING_AID, 0, AudioSystem.DEVICE_NONE);
@@ -743,6 +885,8 @@
         final int res = mAudioSystem.setDeviceConnectionState(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP,
                 AudioSystem.DEVICE_STATE_AVAILABLE, address, name, a2dpCodec);
 
+        // TODO: log in MediaMetrics once distinction between connection failure and
+        // double connection is made.
         if (res != AudioSystem.AUDIO_STATUS_OK) {
             AudioService.sDeviceLogger.log(new AudioEventLogger.StringEvent(
                     "APM failed to make available A2DP device addr=" + address
@@ -771,7 +915,12 @@
 
     @GuardedBy("mDevicesLock")
     private void makeA2dpDeviceUnavailableNow(String address, int a2dpCodec) {
+        MediaMetrics.Item mmi = new MediaMetrics.Item(mMetricsId + "a2dp." + address)
+                .set(MediaMetrics.Property.ENCODING, AudioSystem.audioFormatToString(a2dpCodec))
+                .set(MediaMetrics.Property.EVENT, "makeA2dpDeviceUnavailableNow");
+
         if (address == null) {
+            mmi.set(MediaMetrics.Property.EARLY_RETURN, "address null").record();
             return;
         }
         final String deviceToRemoveKey =
@@ -783,6 +932,9 @@
             // removing A2DP device not currently used by AudioPolicy, log but don't act on it
             AudioService.sDeviceLogger.log((new AudioEventLogger.StringEvent(
                     "A2DP device " + address + " made unavailable, was not used")).printLog(TAG));
+            mmi.set(MediaMetrics.Property.EARLY_RETURN,
+                    "A2DP device made unavailable, was not used")
+                    .record();
             return;
         }
 
@@ -804,6 +956,7 @@
         mApmConnectedDevices.remove(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP);
         // Remove A2DP routes as well
         setCurrentAudioRouteNameIfPossible(null);
+        mmi.record();
     }
 
     @GuardedBy("mDevicesLock")
@@ -862,6 +1015,14 @@
         mDeviceBroker.postApplyVolumeOnDevice(streamType,
                 AudioSystem.DEVICE_OUT_HEARING_AID, "makeHearingAidDeviceAvailable");
         setCurrentAudioRouteNameIfPossible(name);
+        new MediaMetrics.Item(mMetricsId + "makeHearingAidDeviceAvailable")
+                .set(MediaMetrics.Property.ADDRESS, address != null ? address : "")
+                .set(MediaMetrics.Property.DEVICE,
+                        AudioSystem.getDeviceName(AudioSystem.DEVICE_OUT_HEARING_AID))
+                .set(MediaMetrics.Property.NAME, name)
+                .set(MediaMetrics.Property.STREAM_TYPE,
+                        AudioSystem.streamToString(streamType))
+                .record();
     }
 
     @GuardedBy("mDevicesLock")
@@ -873,6 +1034,11 @@
                 DeviceInfo.makeDeviceListKey(AudioSystem.DEVICE_OUT_HEARING_AID, address));
         // Remove Hearing Aid routes as well
         setCurrentAudioRouteNameIfPossible(null);
+        new MediaMetrics.Item(mMetricsId + "makeHearingAidDeviceUnavailable")
+                .set(MediaMetrics.Property.ADDRESS, address != null ? address : "")
+                .set(MediaMetrics.Property.DEVICE,
+                        AudioSystem.getDeviceName(AudioSystem.DEVICE_OUT_HEARING_AID))
+                .record();
     }
 
     @GuardedBy("mDevicesLock")
@@ -919,10 +1085,18 @@
     @GuardedBy("mDevicesLock")
     private int checkSendBecomingNoisyIntentInt(int device,
             @AudioService.ConnectionState int state, int musicDevice) {
+        MediaMetrics.Item mmi = new MediaMetrics.Item(mMetricsId
+                + "checkSendBecomingNoisyIntentInt")
+                .set(MediaMetrics.Property.DEVICE, AudioSystem.getDeviceName(device))
+                .set(MediaMetrics.Property.STATE,
+                        state == AudioService.CONNECTION_STATE_CONNECTED
+                                ? MediaMetrics.Value.CONNECTED : MediaMetrics.Value.DISCONNECTED);
         if (state != AudioService.CONNECTION_STATE_DISCONNECTED) {
+            mmi.set(MediaMetrics.Property.DELAY_MS, 0).record(); // OK to return
             return 0;
         }
         if (!BECOMING_NOISY_INTENT_DEVICES_SET.contains(device)) {
+            mmi.set(MediaMetrics.Property.DELAY_MS, 0).record(); // OK to return
             return 0;
         }
         int delay = 0;
@@ -950,12 +1124,14 @@
                 // the pausing of some apps that are playing remotely
                 AudioService.sDeviceLogger.log((new AudioEventLogger.StringEvent(
                         "dropping ACTION_AUDIO_BECOMING_NOISY")).printLog(TAG));
+                mmi.set(MediaMetrics.Property.DELAY_MS, 0).record(); // OK to return
                 return 0;
             }
             mDeviceBroker.postBroadcastBecomingNoisy();
             delay = AudioService.BECOMING_NOISY_DELAY_MS;
         }
 
+        mmi.set(MediaMetrics.Property.DELAY_MS, delay).record();
         return delay;
     }
 
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
old mode 100644
new mode 100755
index 02d8571..7cac376
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -88,6 +88,7 @@
 import android.media.IVolumeController;
 import android.media.MediaExtractor;
 import android.media.MediaFormat;
+import android.media.MediaMetrics;
 import android.media.PlayerBase;
 import android.media.VolumePolicy;
 import android.media.audiofx.AudioEffect;
@@ -185,6 +186,9 @@
 
     private static final String TAG = "AS.AudioService";
 
+    private final AudioSystemAdapter mAudioSystem;
+    private final SystemServerAdapter mSystemServer;
+
     /** Debug audio mode */
     protected static final boolean DEBUG_MODE = false;
 
@@ -573,6 +577,8 @@
     private boolean mMicMuteFromSwitch;
     private boolean mMicMuteFromApi;
     private boolean mMicMuteFromRestrictions;
+    // caches the value returned by AudioSystem.isMicrophoneMuted()
+    private boolean mMicMuteFromSystemCached;
 
     @GuardedBy("mSettingsLock")
     private int mAssistantUid;
@@ -647,10 +653,19 @@
 
     /** @hide */
     public AudioService(Context context) {
+        this(context, AudioSystemAdapter.getDefaultAdapter(),
+                SystemServerAdapter.getDefaultAdapter(context));
+    }
+
+    public AudioService(Context context, AudioSystemAdapter audioSystem,
+            SystemServerAdapter systemServer) {
         mContext = context;
         mContentResolver = context.getContentResolver();
         mAppOps = (AppOpsManager)context.getSystemService(Context.APP_OPS_SERVICE);
 
+        mAudioSystem = audioSystem;
+        mSystemServer = systemServer;
+
         mPlatformType = AudioSystem.getPlatformType(context);
 
         mIsSingleVolume = AudioSystem.isSingleVolume(context);
@@ -840,11 +855,13 @@
 
         context.registerReceiverAsUser(mReceiver, UserHandle.ALL, intentFilter, null, null);
 
-        LocalServices.addService(AudioManagerInternal.class, new AudioServiceInternal());
+        if (mSystemServer.isPrivileged()) {
+            LocalServices.addService(AudioManagerInternal.class, new AudioServiceInternal());
 
-        mUserManagerInternal.addUserRestrictionsListener(mUserRestrictionsListener);
+            mUserManagerInternal.addUserRestrictionsListener(mUserRestrictionsListener);
 
-        mRecordMonitor.initMonitor();
+            mRecordMonitor.initMonitor();
+        }
 
         final float[] preScale = new float[3];
         preScale[0] = mContext.getResources().getFraction(
@@ -933,6 +950,7 @@
 
         onIndicateSystemReady();
 
+        mMicMuteFromSystemCached = mAudioSystem.isMicrophoneMuted();
         setMicMuteFromSwitchInput();
     }
 
@@ -1126,6 +1144,7 @@
         sendMsg(mAudioHandler, MSG_DISPATCH_AUDIO_SERVER_STATE,
                 SENDMSG_QUEUE, 1, 0, null, 0);
 
+        setMicrophoneMuteNoCallerCheck(getCurrentUserId()); // will also update the mic mute cache
         setMicMuteFromSwitchInput();
     }
 
@@ -1632,12 +1651,15 @@
         }
 
         if (currentImeUid != mCurrentImeUid || forceUpdate) {
-            AudioSystem.setCurrentImeUid(currentImeUid);
+            mAudioSystem.setCurrentImeUid(currentImeUid);
             mCurrentImeUid = currentImeUid;
         }
     }
 
     private void readPersistedSettings() {
+        if (!mSystemServer.isPrivileged()) {
+            return;
+        }
         final ContentResolver cr = mContentResolver;
 
         int ringerModeFromSettings =
@@ -1708,6 +1730,9 @@
     }
 
     private void readUserRestrictions() {
+        if (!mSystemServer.isPrivileged()) {
+            return;
+        }
         final int currentUser = getCurrentUserId();
 
         // Check the current user restriction.
@@ -1856,6 +1881,16 @@
         synchronized (mExtVolumeControllerLock) {
             extVolCtlr = mExtVolumeController;
         }
+        new MediaMetrics.Item(mMetricsId + "adjustSuggestedStreamVolume")
+                .setUid(Binder.getCallingUid())
+                .set(MediaMetrics.Property.CALLING_PACKAGE, callingPackage)
+                .set(MediaMetrics.Property.CLIENT_NAME, caller)
+                .set(MediaMetrics.Property.DIRECTION, direction > 0
+                        ? MediaMetrics.Value.UP : MediaMetrics.Value.DOWN)
+                .set(MediaMetrics.Property.EXTERNAL, extVolCtlr != null
+                        ? MediaMetrics.Value.YES : MediaMetrics.Value.NO)
+                .set(MediaMetrics.Property.FLAGS, flags)
+                .record();
         if (extVolCtlr != null) {
             sendMsg(mAudioHandler, MSG_NOTIFY_VOL_EVENT, SENDMSG_QUEUE,
                     direction, 0 /*ignored*/,
@@ -2778,6 +2813,9 @@
     }
 
     private void sendBroadcastToAll(Intent intent) {
+        if (!mSystemServer.isPrivileged()) {
+            return;
+        }
         intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
         intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
         final long ident = Binder.clearCallingIdentity();
@@ -3114,21 +3152,32 @@
         if (uid == android.os.Process.SYSTEM_UID) {
             uid = UserHandle.getUid(userId, UserHandle.getAppId(uid));
         }
+        MediaMetrics.Item mmi = new MediaMetrics.Item(MediaMetrics.Name.AUDIO_MIC)
+                .setUid(uid)
+                .set(MediaMetrics.Property.CALLING_PACKAGE, callingPackage)
+                .set(MediaMetrics.Property.EVENT, "setMicrophoneMute")
+                .set(MediaMetrics.Property.REQUEST, on
+                        ? MediaMetrics.Value.MUTE : MediaMetrics.Value.UNMUTE);
+
         // If OP_MUTE_MICROPHONE is set, disallow unmuting.
         if (!on && mAppOps.noteOp(AppOpsManager.OP_MUTE_MICROPHONE, uid, callingPackage)
                 != AppOpsManager.MODE_ALLOWED) {
+            mmi.set(MediaMetrics.Property.EARLY_RETURN, "disallow unmuting").record();
             return;
         }
         if (!checkAudioSettingsPermission("setMicrophoneMute()")) {
+            mmi.set(MediaMetrics.Property.EARLY_RETURN, "!checkAudioSettingsPermission").record();
             return;
         }
         if (userId != UserHandle.getCallingUserId() &&
                 mContext.checkCallingOrSelfPermission(
                 android.Manifest.permission.INTERACT_ACROSS_USERS_FULL)
                 != PackageManager.PERMISSION_GRANTED) {
+            mmi.set(MediaMetrics.Property.EARLY_RETURN, "permission").record();
             return;
         }
         mMicMuteFromApi = on;
+        mmi.record(); // record now, the no caller check will set the mute state.
         setMicrophoneMuteNoCallerCheck(userId);
     }
 
@@ -3140,6 +3189,12 @@
             return;
         }
         mMicMuteFromSwitch = on;
+        new MediaMetrics.Item(MediaMetrics.Name.AUDIO_MIC)
+                .setUid(userId)
+                .set(MediaMetrics.Property.EVENT, "setMicrophoneMuteFromSwitch")
+                .set(MediaMetrics.Property.REQUEST, on
+                        ? MediaMetrics.Value.MUTE : MediaMetrics.Value.UNMUTE)
+                .record();
         setMicrophoneMuteNoCallerCheck(userId);
     }
 
@@ -3151,21 +3206,52 @@
         }
     }
 
+    /**
+     * Returns the microphone mute state as seen from the native audio system
+     * @return true if microphone is reported as muted by primary HAL
+     */
     public boolean isMicrophoneMuted() {
+        return mMicMuteFromSystemCached;
+    }
+
+    private boolean isMicrophoneSupposedToBeMuted() {
         return mMicMuteFromSwitch || mMicMuteFromRestrictions || mMicMuteFromApi;
     }
 
     private void setMicrophoneMuteNoCallerCheck(int userId) {
-        final boolean muted = isMicrophoneMuted();
+        final boolean muted = isMicrophoneSupposedToBeMuted();
         if (DEBUG_VOL) {
             Log.d(TAG, String.format("Mic mute %b, user=%d", muted, userId));
         }
         // only mute for the current user
         if (getCurrentUserId() == userId || userId == android.os.Process.SYSTEM_UID) {
-            final boolean currentMute = AudioSystem.isMicrophoneMuted();
+            final boolean currentMute = mAudioSystem.isMicrophoneMuted();
             final long identity = Binder.clearCallingIdentity();
-            AudioSystem.muteMicrophone(muted);
+            final int ret = mAudioSystem.muteMicrophone(muted);
+
+            // update cache with the real state independently from what was set
+            mMicMuteFromSystemCached = mAudioSystem.isMicrophoneMuted();
+            if (ret != AudioSystem.AUDIO_STATUS_OK) {
+                Log.e(TAG, "Error changing mic mute state to " + muted + " current:"
+                        + mMicMuteFromSystemCached);
+            }
+
+            new MediaMetrics.Item(MediaMetrics.Name.AUDIO_MIC)
+                    .setUid(userId)
+                    .set(MediaMetrics.Property.EVENT, "setMicrophoneMuteNoCallerCheck")
+                    .set(MediaMetrics.Property.MUTE, mMicMuteFromSystemCached
+                            ? MediaMetrics.Value.ON : MediaMetrics.Value.OFF)
+                    .set(MediaMetrics.Property.REQUEST, muted
+                            ? MediaMetrics.Value.MUTE : MediaMetrics.Value.UNMUTE)
+                    .set(MediaMetrics.Property.STATUS, ret)
+                    .record();
+
             try {
+                // send the intent even if there was a failure to change the actual mute state:
+                // the AudioManager.setMicrophoneMute API doesn't have a return value to
+                // indicate if the call failed to successfully change the mute state, and receiving
+                // the intent may be the only time an application can resynchronize its mic mute
+                // state with the actual system mic mute state
                 if (muted != currentMute) {
                     sendMsg(mAudioHandler, MSG_BROADCAST_MICROPHONE_MUTE,
                                 SENDMSG_NOOP, 0, 0, null, 0);
@@ -3894,10 +3980,20 @@
         }
 
         // for logging only
+        final int uid = Binder.getCallingUid();
+        final int pid = Binder.getCallingPid();
         final String eventSource = new StringBuilder("setSpeakerphoneOn(").append(on)
-                .append(") from u/pid:").append(Binder.getCallingUid()).append("/")
-                .append(Binder.getCallingPid()).toString();
+                .append(") from u/pid:").append(uid).append("/")
+                .append(pid).toString();
         final boolean stateChanged = mDeviceBroker.setSpeakerphoneOn(on, eventSource);
+        new MediaMetrics.Item(MediaMetrics.Name.AUDIO_DEVICE
+                + MediaMetrics.SEPARATOR + "setSpeakerphoneOn")
+                .setUid(uid)
+                .setPid(pid)
+                .set(MediaMetrics.Property.STATE, on
+                        ? MediaMetrics.Value.ON : MediaMetrics.Value.OFF)
+                .record();
+
         if (stateChanged) {
             final long ident = Binder.clearCallingIdentity();
             try {
@@ -3928,9 +4024,19 @@
         }
 
         // for logging only
+        final int uid = Binder.getCallingUid();
+        final int pid = Binder.getCallingPid();
         final String eventSource = new StringBuilder("setBluetoothScoOn(").append(on)
-                .append(") from u/pid:").append(Binder.getCallingUid()).append("/")
-                .append(Binder.getCallingPid()).toString();
+                .append(") from u/pid:").append(uid).append("/").append(pid).toString();
+
+        //bt sco
+        new MediaMetrics.Item(MediaMetrics.Name.AUDIO_DEVICE
+                + MediaMetrics.SEPARATOR + "setBluetoothScoOn")
+                .setUid(uid)
+                .setPid(pid)
+                .set(MediaMetrics.Property.STATE, on
+                        ? MediaMetrics.Value.ON : MediaMetrics.Value.OFF)
+                .record();
 
         mDeviceBroker.setBluetoothScoOn(on, eventSource);
     }
@@ -3946,9 +4052,20 @@
     /** @see AudioManager#setBluetoothA2dpOn(boolean) */
     public void setBluetoothA2dpOn(boolean on) {
         // for logging only
+        final int uid = Binder.getCallingUid();
+        final int pid = Binder.getCallingPid();
         final String eventSource = new StringBuilder("setBluetoothA2dpOn(").append(on)
-                .append(") from u/pid:").append(Binder.getCallingUid()).append("/")
-                .append(Binder.getCallingPid()).toString();
+                .append(") from u/pid:").append(uid).append("/")
+                .append(pid).toString();
+
+        new MediaMetrics.Item(MediaMetrics.Name.AUDIO_DEVICE
+                + MediaMetrics.SEPARATOR + "setBluetoothA2dpOn")
+                .setUid(uid)
+                .setPid(pid)
+                .set(MediaMetrics.Property.STATE, on
+                        ? MediaMetrics.Value.ON : MediaMetrics.Value.OFF)
+                .record();
+
         mDeviceBroker.setBluetoothA2dpOn_Async(on, eventSource);
     }
 
@@ -3959,31 +4076,59 @@
 
     /** @see AudioManager#startBluetoothSco() */
     public void startBluetoothSco(IBinder cb, int targetSdkVersion) {
+        final int uid = Binder.getCallingUid();
+        final int pid = Binder.getCallingPid();
         final int scoAudioMode =
                 (targetSdkVersion < Build.VERSION_CODES.JELLY_BEAN_MR2) ?
                         BtHelper.SCO_MODE_VIRTUAL_CALL : BtHelper.SCO_MODE_UNDEFINED;
         final String eventSource = new StringBuilder("startBluetoothSco()")
-                .append(") from u/pid:").append(Binder.getCallingUid()).append("/")
-                .append(Binder.getCallingPid()).toString();
+                .append(") from u/pid:").append(uid).append("/")
+                .append(pid).toString();
+
+        new MediaMetrics.Item(MediaMetrics.Name.AUDIO_BLUETOOTH)
+                .setUid(uid)
+                .setPid(pid)
+                .set(MediaMetrics.Property.EVENT, "startBluetoothSco")
+                .set(MediaMetrics.Property.SCO_AUDIO_MODE,
+                        BtHelper.scoAudioModeToString(scoAudioMode))
+                .record();
         startBluetoothScoInt(cb, scoAudioMode, eventSource);
+
     }
 
     /** @see AudioManager#startBluetoothScoVirtualCall() */
     public void startBluetoothScoVirtualCall(IBinder cb) {
+        final int uid = Binder.getCallingUid();
+        final int pid = Binder.getCallingPid();
         final String eventSource = new StringBuilder("startBluetoothScoVirtualCall()")
-                .append(") from u/pid:").append(Binder.getCallingUid()).append("/")
-                .append(Binder.getCallingPid()).toString();
+                .append(") from u/pid:").append(uid).append("/")
+                .append(pid).toString();
+
+        new MediaMetrics.Item(MediaMetrics.Name.AUDIO_BLUETOOTH)
+                .setUid(uid)
+                .setPid(pid)
+                .set(MediaMetrics.Property.EVENT, "startBluetoothScoVirtualCall")
+                .set(MediaMetrics.Property.SCO_AUDIO_MODE,
+                        BtHelper.scoAudioModeToString(BtHelper.SCO_MODE_VIRTUAL_CALL))
+                .record();
         startBluetoothScoInt(cb, BtHelper.SCO_MODE_VIRTUAL_CALL, eventSource);
     }
 
     void startBluetoothScoInt(IBinder cb, int scoAudioMode, @NonNull String eventSource) {
+        MediaMetrics.Item mmi = new MediaMetrics.Item(MediaMetrics.Name.AUDIO_BLUETOOTH)
+                .set(MediaMetrics.Property.EVENT, "startBluetoothScoInt")
+                .set(MediaMetrics.Property.SCO_AUDIO_MODE,
+                        BtHelper.scoAudioModeToString(scoAudioMode));
+
         if (!checkAudioSettingsPermission("startBluetoothSco()") ||
                 !mSystemReady) {
+            mmi.set(MediaMetrics.Property.EARLY_RETURN, "permission or systemReady").record();
             return;
         }
         synchronized (mDeviceBroker.mSetModeLock) {
             mDeviceBroker.startBluetoothScoForClient_Sync(cb, scoAudioMode, eventSource);
         }
+        mmi.record();
     }
 
     /** @see AudioManager#stopBluetoothSco() */
@@ -3992,12 +4137,21 @@
                 !mSystemReady) {
             return;
         }
+        final int uid = Binder.getCallingUid();
+        final int pid = Binder.getCallingPid();
         final String eventSource =  new StringBuilder("stopBluetoothSco()")
-                .append(") from u/pid:").append(Binder.getCallingUid()).append("/")
-                .append(Binder.getCallingPid()).toString();
+                .append(") from u/pid:").append(uid).append("/")
+                .append(pid).toString();
         synchronized (mDeviceBroker.mSetModeLock) {
             mDeviceBroker.stopBluetoothScoForClient_Sync(cb, eventSource);
         }
+        new MediaMetrics.Item(MediaMetrics.Name.AUDIO_BLUETOOTH)
+                .setUid(uid)
+                .setPid(pid)
+                .set(MediaMetrics.Property.EVENT, "stopBluetoothSco")
+                .set(MediaMetrics.Property.SCO_AUDIO_MODE,
+                        BtHelper.scoAudioModeToString(BtHelper.SCO_MODE_UNDEFINED))
+                .record();
     }
 
 
@@ -4494,6 +4648,9 @@
     }
 
     private void broadcastRingerMode(String action, int ringerMode) {
+        if (!mSystemServer.isPrivileged()) {
+            return;
+        }
         // Send sticky broadcast
         Intent broadcast = new Intent(action);
         broadcast.putExtra(AudioManager.EXTRA_RINGER_MODE, ringerMode);
@@ -4503,6 +4660,9 @@
     }
 
     private void broadcastVibrateSetting(int vibrateType) {
+        if (!mSystemServer.isPrivileged()) {
+            return;
+        }
         // Send broadcast
         if (mActivityManagerInternal.isSystemReady()) {
             Intent broadcast = new Intent(AudioManager.VIBRATE_SETTING_CHANGED_ACTION);
@@ -4753,6 +4913,14 @@
                 && state != CONNECTION_STATE_DISCONNECTED) {
             throw new IllegalArgumentException("Invalid state " + state);
         }
+        new MediaMetrics.Item(mMetricsId + "setWiredDeviceConnectionState")
+                .set(MediaMetrics.Property.ADDRESS, address)
+                .set(MediaMetrics.Property.CLIENT_NAME, caller)
+                .set(MediaMetrics.Property.DEVICE, AudioSystem.getDeviceName(type))
+                .set(MediaMetrics.Property.NAME, name)
+                .set(MediaMetrics.Property.STATE,
+                        state == CONNECTION_STATE_CONNECTED ? "connected" : "disconnected")
+                .record();
         mDeviceBroker.setWiredDeviceConnectionState(type, state, address, name, caller);
     }
 
@@ -5213,7 +5381,32 @@
         private String mVolumeIndexSettingName;
         private int mObservedDevices;
 
-        private final SparseIntArray mIndexMap = new SparseIntArray(8);
+        private final SparseIntArray mIndexMap = new SparseIntArray(8) {
+            @Override
+            public void put(int key, int value) {
+                super.put(key, value);
+                record("put", key, value);
+            }
+            @Override
+            public void setValueAt(int index, int value) {
+                super.setValueAt(index, value);
+                record("setValueAt", keyAt(index), value);
+            }
+
+            // Record all changes in the VolumeStreamState
+            private void record(String event, int key, int value) {
+                final String device = key == AudioSystem.DEVICE_OUT_DEFAULT ? "default"
+                        : AudioSystem.getOutputDeviceName(key);
+                new MediaMetrics.Item(MediaMetrics.Name.AUDIO_VOLUME + MediaMetrics.SEPARATOR
+                        + AudioSystem.streamToString(mStreamType)
+                        + "." + device)
+                        .set(MediaMetrics.Property.EVENT, event)
+                        .set(MediaMetrics.Property.INDEX, value)
+                        .set(MediaMetrics.Property.MIN_INDEX, mIndexMin)
+                        .set(MediaMetrics.Property.MAX_INDEX, mIndexMax)
+                        .record();
+            }
+        };
         private final Intent mVolumeChanged;
         private final Intent mStreamDevicesChanged;
 
@@ -5234,6 +5427,9 @@
         }
 
         public int observeDevicesForStream_syncVSS(boolean checkOthers) {
+            if (!mSystemServer.isPrivileged()) {
+                return AudioSystem.DEVICE_NONE;
+            }
             final int devices = AudioSystem.getDevicesForStream(mStreamType);
             if (devices == mObservedDevices) {
                 return devices;
@@ -5893,6 +6089,13 @@
                                 + eventSource);
                         break;
                     }
+                    new MediaMetrics.Item(MediaMetrics.Name.AUDIO_FORCE_USE
+                            + MediaMetrics.SEPARATOR + AudioSystem.forceUseUsageToString(useCase))
+                            .set(MediaMetrics.Property.EVENT, "setForceUse")
+                            .set(MediaMetrics.Property.FORCE_USE_DUE_TO, eventSource)
+                            .set(MediaMetrics.Property.FORCE_USE_MODE,
+                                    AudioSystem.forceUseConfigToString(config))
+                            .record();
                     sForceUseLogger.log(
                             new AudioServiceEvents.ForceUseEvent(useCase, config, eventSource));
                     AudioSystem.setForceUse(useCase, config);
@@ -5974,10 +6177,7 @@
                     break;
 
                 case MSG_BROADCAST_MICROPHONE_MUTE:
-                    mContext.sendBroadcastAsUser(
-                            new Intent(AudioManager.ACTION_MICROPHONE_MUTE_CHANGED)
-                                    .setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY),
-                                    UserHandle.ALL);
+                    mSystemServer.sendMicrophoneMuteChangedIntent();
                     break;
             }
         }
@@ -6397,23 +6597,42 @@
     public int requestAudioFocus(AudioAttributes aa, int durationHint, IBinder cb,
             IAudioFocusDispatcher fd, String clientId, String callingPackageName, int flags,
             IAudioPolicyCallback pcb, int sdk) {
+        final int uid = Binder.getCallingUid();
+        MediaMetrics.Item mmi = new MediaMetrics.Item(mMetricsId + "focus")
+                .setUid(uid)
+                //.putInt("durationHint", durationHint)
+                .set(MediaMetrics.Property.CALLING_PACKAGE, callingPackageName)
+                .set(MediaMetrics.Property.CLIENT_NAME, clientId)
+                .set(MediaMetrics.Property.EVENT, "requestAudioFocus")
+                .set(MediaMetrics.Property.FLAGS, flags);
+
         // permission checks
         if (aa != null && !isValidAudioAttributesUsage(aa)) {
-            Log.w(TAG, "Request using unsupported usage.");
+            final String reason = "Request using unsupported usage";
+            Log.w(TAG, reason);
+            mmi.set(MediaMetrics.Property.EARLY_RETURN, reason)
+                    .record();
             return AudioManager.AUDIOFOCUS_REQUEST_FAILED;
         }
         if ((flags & AudioManager.AUDIOFOCUS_FLAG_LOCK) == AudioManager.AUDIOFOCUS_FLAG_LOCK) {
             if (AudioSystem.IN_VOICE_COMM_FOCUS_ID.equals(clientId)) {
                 if (PackageManager.PERMISSION_GRANTED != mContext.checkCallingOrSelfPermission(
                             android.Manifest.permission.MODIFY_PHONE_STATE)) {
-                    Log.e(TAG, "Invalid permission to (un)lock audio focus", new Exception());
+                    final String reason = "Invalid permission to (un)lock audio focus";
+                    Log.e(TAG, reason, new Exception());
+                    mmi.set(MediaMetrics.Property.EARLY_RETURN, reason)
+                            .record();
                     return AudioManager.AUDIOFOCUS_REQUEST_FAILED;
                 }
             } else {
                 // only a registered audio policy can be used to lock focus
                 synchronized (mAudioPolicies) {
                     if (!mAudioPolicies.containsKey(pcb.asBinder())) {
-                        Log.e(TAG, "Invalid unregistered AudioPolicy to (un)lock audio focus");
+                        final String reason =
+                                "Invalid unregistered AudioPolicy to (un)lock audio focus";
+                        Log.e(TAG, reason);
+                        mmi.set(MediaMetrics.Property.EARLY_RETURN, reason)
+                                .record();
                         return AudioManager.AUDIOFOCUS_REQUEST_FAILED;
                     }
                 }
@@ -6421,25 +6640,40 @@
         }
 
         if (callingPackageName == null || clientId == null || aa == null) {
-            Log.e(TAG, "Invalid null parameter to request audio focus");
+            final String reason = "Invalid null parameter to request audio focus";
+            Log.e(TAG, reason);
+            mmi.set(MediaMetrics.Property.EARLY_RETURN, reason)
+                    .record();
             return AudioManager.AUDIOFOCUS_REQUEST_FAILED;
         }
-
+        mmi.record();
         return mMediaFocusControl.requestAudioFocus(aa, durationHint, cb, fd,
                 clientId, callingPackageName, flags, sdk,
-                forceFocusDuckingForAccessibility(aa, durationHint, Binder.getCallingUid()));
+                forceFocusDuckingForAccessibility(aa, durationHint, uid));
     }
 
     public int abandonAudioFocus(IAudioFocusDispatcher fd, String clientId, AudioAttributes aa,
             String callingPackageName) {
+        MediaMetrics.Item mmi = new MediaMetrics.Item(mMetricsId + "focus")
+                .set(MediaMetrics.Property.CALLING_PACKAGE, callingPackageName)
+                .set(MediaMetrics.Property.CLIENT_NAME, clientId)
+                .set(MediaMetrics.Property.EVENT, "abandonAudioFocus");
+
         if (aa != null && !isValidAudioAttributesUsage(aa)) {
             Log.w(TAG, "Request using unsupported usage.");
+            mmi.set(MediaMetrics.Property.EARLY_RETURN, "unsupported usage").record();
+
             return AudioManager.AUDIOFOCUS_REQUEST_FAILED;
         }
+        mmi.record();
         return mMediaFocusControl.abandonAudioFocus(fd, clientId, aa, callingPackageName);
     }
 
     public void unregisterAudioFocusClient(String clientId) {
+        new MediaMetrics.Item(mMetricsId + "focus")
+                .set(MediaMetrics.Property.CLIENT_NAME, clientId)
+                .set(MediaMetrics.Property.EVENT, "unregisterAudioFocusClient")
+                .record();
         mMediaFocusControl.unregisterAudioFocusClient(clientId);
     }
 
@@ -6976,6 +7210,10 @@
         pw.print("  mHdmiTvClient="); pw.println(mHdmiTvClient);
         pw.print("  mHdmiSystemAudioSupported="); pw.println(mHdmiSystemAudioSupported);
         pw.print("  mIsCallScreeningModeSupported="); pw.println(mIsCallScreeningModeSupported);
+        pw.print("  mic mute FromSwitch=" + mMicMuteFromSwitch
+                        + " FromRestrictions=" + mMicMuteFromRestrictions
+                        + " FromApi=" + mMicMuteFromApi
+                        + " from system=" + mMicMuteFromSystemCached);
 
         dumpAudioPolicies(pw);
         mDynPolicyLogger.dump(pw);
@@ -7009,6 +7247,12 @@
         }
     }
 
+    /**
+     * Audio Analytics ids.
+     */
+    private static final String mMetricsId = MediaMetrics.Name.AUDIO_SERVICE
+            + MediaMetrics.SEPARATOR;
+
     private static String safeMediaVolumeStateToString(int state) {
         switch(state) {
             case SAFE_MEDIA_VOLUME_NOT_CONFIGURED: return "SAFE_MEDIA_VOLUME_NOT_CONFIGURED";
@@ -8419,6 +8663,23 @@
     }
 
     //======================
+    // Multi Audio Focus
+    //======================
+    public void setMultiAudioFocusEnabled(boolean enabled) {
+        enforceModifyAudioRoutingPermission();
+        if (mMediaFocusControl != null) {
+            boolean mafEnabled = mMediaFocusControl.getMultiAudioFocusEnabled();
+            if (mafEnabled != enabled) {
+                mMediaFocusControl.updateMultiAudioFocus(enabled);
+                if (!enabled) {
+                    mDeviceBroker.postBroadcastBecomingNoisy();
+                }
+            }
+        }
+    }
+
+
+    //======================
     // misc
     //======================
     private final HashMap<IBinder, AudioPolicyProxy> mAudioPolicies =
diff --git a/services/core/java/com/android/server/audio/AudioServiceEvents.java b/services/core/java/com/android/server/audio/AudioServiceEvents.java
index add620e..5913567 100644
--- a/services/core/java/com/android/server/audio/AudioServiceEvents.java
+++ b/services/core/java/com/android/server/audio/AudioServiceEvents.java
@@ -19,6 +19,7 @@
 import android.media.AudioAttributes;
 import android.media.AudioManager;
 import android.media.AudioSystem;
+import android.media.MediaMetrics;
 
 import com.android.server.audio.AudioDeviceInventory.WiredDeviceConnectionState;
 
@@ -120,6 +121,7 @@
             mCaller = caller;
             mGroupName = null;
             mAudioAttributes = null;
+            logMetricEvent();
         }
 
         /** used for VOL_SET_HEARING_AID_VOL*/
@@ -132,6 +134,7 @@
             mCaller = null;
             mGroupName = null;
             mAudioAttributes = null;
+            logMetricEvent();
         }
 
         /** used for VOL_SET_AVRCP_VOL */
@@ -144,6 +147,7 @@
             mCaller = null;
             mGroupName = null;
             mAudioAttributes = null;
+            logMetricEvent();
         }
 
         /** used for VOL_VOICE_ACTIVITY_HEARING_AID */
@@ -156,6 +160,7 @@
             mCaller = null;
             mGroupName = null;
             mAudioAttributes = null;
+            logMetricEvent();
         }
 
         /** used for VOL_MODE_CHANGE_HEARING_AID */
@@ -168,6 +173,7 @@
             mCaller = null;
             mGroupName = null;
             mAudioAttributes = null;
+            logMetricEvent();
         }
 
         /** used for VOL_SET_GROUP_VOL */
@@ -179,6 +185,102 @@
             mCaller = caller;
             mGroupName = group;
             mAudioAttributes = aa;
+            logMetricEvent();
+        }
+
+
+        /**
+         * Audio Analytics unique Id.
+         */
+        private static final String mMetricsId = MediaMetrics.Name.AUDIO_VOLUME_EVENT;
+
+        /**
+         * Log mediametrics event
+         */
+        private void logMetricEvent() {
+            switch (mOp) {
+                case VOL_ADJUST_SUGG_VOL:
+                case VOL_ADJUST_VOL_UID:
+                case VOL_ADJUST_STREAM_VOL: {
+                    String eventName;
+                    switch (mOp) {
+                        case VOL_ADJUST_SUGG_VOL:
+                            eventName = "adjustSuggestedStreamVolume";
+                            break;
+                        case VOL_ADJUST_STREAM_VOL:
+                            eventName = "adjustStreamVolume";
+                            break;
+                        case VOL_ADJUST_VOL_UID:
+                            eventName = "adjustStreamVolumeForUid";
+                            break;
+                        default:
+                            return; // not possible, just return here
+                    }
+                    new MediaMetrics.Item(mMetricsId)
+                            .set(MediaMetrics.Property.CALLING_PACKAGE, mCaller)
+                            .set(MediaMetrics.Property.DIRECTION, mVal1 > 0 ? "up" : "down")
+                            .set(MediaMetrics.Property.EVENT, eventName)
+                            .set(MediaMetrics.Property.FLAGS, mVal2)
+                            .set(MediaMetrics.Property.STREAM_TYPE,
+                                    AudioSystem.streamToString(mStream))
+                            .record();
+                    return;
+                }
+                case VOL_SET_STREAM_VOL:
+                    new MediaMetrics.Item(mMetricsId)
+                            .set(MediaMetrics.Property.CALLING_PACKAGE, mCaller)
+                            .set(MediaMetrics.Property.EVENT, "setStreamVolume")
+                            .set(MediaMetrics.Property.FLAGS, mVal2)
+                            .set(MediaMetrics.Property.INDEX, mVal1)
+                            .set(MediaMetrics.Property.STREAM_TYPE,
+                                    AudioSystem.streamToString(mStream))
+                            .record();
+                    return;
+                case VOL_SET_HEARING_AID_VOL:
+                    new MediaMetrics.Item(mMetricsId)
+                            .set(MediaMetrics.Property.EVENT, "setHearingAidVolume")
+                            .set(MediaMetrics.Property.GAIN_DB, (double) mVal2)
+                            .set(MediaMetrics.Property.INDEX, mVal1)
+                            .record();
+                    return;
+                case VOL_SET_AVRCP_VOL:
+                    new MediaMetrics.Item(mMetricsId)
+                            .set(MediaMetrics.Property.EVENT, "setAvrcpVolume")
+                            .set(MediaMetrics.Property.INDEX, mVal1)
+                            .record();
+                    return;
+                case VOL_VOICE_ACTIVITY_HEARING_AID:
+                    new MediaMetrics.Item(mMetricsId)
+                            .set(MediaMetrics.Property.EVENT, "voiceActivityHearingAid")
+                            .set(MediaMetrics.Property.INDEX, mVal1)
+                            .set(MediaMetrics.Property.STATE,
+                                    mVal2 == 1 ? "active" : "inactive")
+                            .set(MediaMetrics.Property.STREAM_TYPE,
+                                    AudioSystem.streamToString(mStream))
+                            .record();
+                    return;
+                case VOL_MODE_CHANGE_HEARING_AID:
+                    new MediaMetrics.Item(mMetricsId)
+                            .set(MediaMetrics.Property.EVENT, "modeChangeHearingAid")
+                            .set(MediaMetrics.Property.INDEX, mVal1)
+                            .set(MediaMetrics.Property.MODE, AudioSystem.modeToString(mVal2))
+                            .set(MediaMetrics.Property.STREAM_TYPE,
+                                    AudioSystem.streamToString(mStream))
+                            .record();
+                    return;
+                case VOL_SET_GROUP_VOL:
+                    new MediaMetrics.Item(mMetricsId)
+                            .set(MediaMetrics.Property.ATTRIBUTES, mAudioAttributes.toString())
+                            .set(MediaMetrics.Property.CALLING_PACKAGE, mCaller)
+                            .set(MediaMetrics.Property.EVENT, "setVolumeIndexForAttributes")
+                            .set(MediaMetrics.Property.FLAGS, mVal2)
+                            .set(MediaMetrics.Property.GROUP, mGroupName)
+                            .set(MediaMetrics.Property.INDEX, mVal1)
+                            .record();
+                    return;
+                default:
+                    return;
+            }
         }
 
         @Override
diff --git a/services/core/java/com/android/server/audio/AudioSystemAdapter.java b/services/core/java/com/android/server/audio/AudioSystemAdapter.java
index 9f8f9f8..40c1390 100644
--- a/services/core/java/com/android/server/audio/AudioSystemAdapter.java
+++ b/services/core/java/com/android/server/audio/AudioSystemAdapter.java
@@ -40,10 +40,11 @@
 
     /**
      * Create an adapter for AudioSystem that always succeeds, and does nothing.
-     * @return a no-op AudioSystem adapter
+     * Overridden methods can be configured
+     * @return a no-op AudioSystem adapter with configurable adapter
      */
-    static final @NonNull AudioSystemAdapter getAlwaysOkAdapter() {
-        return new AudioSystemOkAdapter();
+    static final @NonNull AudioSystemAdapter getConfigurableAdapter() {
+        return new AudioSystemConfigurableAdapter();
     }
 
     /**
@@ -113,10 +114,51 @@
         return AudioSystem.setParameters(keyValuePairs);
     }
 
-    //--------------------------------------------------------------------
-    protected static class AudioSystemOkAdapter extends AudioSystemAdapter {
-        private static final String TAG = "ASA";
+    /**
+     * Same as {@link AudioSystem#isMicrophoneMuted()}}
+     * Checks whether the microphone mute is on or off.
+     * @return true if microphone is muted, false if it's not
+     */
+    public boolean isMicrophoneMuted() {
+        return AudioSystem.isMicrophoneMuted();
+    }
 
+    /**
+     * Same as {@link AudioSystem#muteMicrophone(boolean)}
+     * Sets the microphone mute on or off.
+     *
+     * @param on set <var>true</var> to mute the microphone;
+     *           <var>false</var> to turn mute off
+     * @return command completion status see AUDIO_STATUS_OK, see AUDIO_STATUS_ERROR
+     */
+    public int muteMicrophone(boolean on) {
+        return AudioSystem.muteMicrophone(on);
+    }
+
+    /**
+     * Same as {@link AudioSystem#setCurrentImeUid(int)}
+     * Communicate UID of current InputMethodService to audio policy service.
+     */
+    public int setCurrentImeUid(int uid) {
+        return AudioSystem.setCurrentImeUid(uid);
+    }
+
+    //--------------------------------------------------------------------
+    protected static class AudioSystemConfigurableAdapter extends AudioSystemAdapter {
+        private static final String TAG = "ASA";
+        private boolean mIsMicMuted = false;
+        private boolean mMuteMicrophoneFails = false;
+
+        public void configureIsMicrophoneMuted(boolean muted) {
+            mIsMicMuted = muted;
+        }
+
+        public void configureMuteMicrophoneToFail(boolean fail) {
+            mMuteMicrophoneFails = fail;
+        }
+
+        //-----------------------------------------------------------------
+        // Overrides of AudioSystemAdapter
         @Override
         public int setDeviceConnectionState(int device, int state, String deviceAddress,
                                             String deviceName, int codecFormat) {
@@ -152,5 +194,24 @@
         public int setParameters(String keyValuePairs) {
             return AudioSystem.AUDIO_STATUS_OK;
         }
+
+        @Override
+        public boolean isMicrophoneMuted() {
+            return mIsMicMuted;
+        }
+
+        @Override
+        public int muteMicrophone(boolean on) {
+            if (mMuteMicrophoneFails) {
+                return AudioSystem.AUDIO_STATUS_ERROR;
+            }
+            mIsMicMuted = on;
+            return AudioSystem.AUDIO_STATUS_OK;
+        }
+
+        @Override
+        public int setCurrentImeUid(int uid) {
+            return AudioSystem.AUDIO_STATUS_OK;
+        }
     }
 }
diff --git a/services/core/java/com/android/server/audio/BtHelper.java b/services/core/java/com/android/server/audio/BtHelper.java
index 93d1bed..accb90c 100644
--- a/services/core/java/com/android/server/audio/BtHelper.java
+++ b/services/core/java/com/android/server/audio/BtHelper.java
@@ -113,6 +113,24 @@
 
     private static final int BT_HEARING_AID_GAIN_MIN = -128;
 
+    /**
+     * Returns a string representation of the scoAudioMode.
+     */
+    public static String scoAudioModeToString(int scoAudioMode) {
+        switch (scoAudioMode) {
+            case SCO_MODE_UNDEFINED:
+                return "SCO_MODE_UNDEFINED";
+            case SCO_MODE_VIRTUAL_CALL:
+                return "SCO_MODE_VIRTUAL_CALL";
+            case SCO_MODE_RAW:
+                return "SCO_MODE_RAW";
+            case SCO_MODE_VR:
+                return "SCO_MODE_VR";
+            default:
+                return "SCO_MODE_(" + scoAudioMode + ")";
+        }
+    }
+
     //----------------------------------------------------------------------
     /*package*/ static class BluetoothA2dpDeviceInfo {
         private final @NonNull BluetoothDevice mBtDevice;
@@ -965,4 +983,27 @@
                 return AudioSystem.AUDIO_FORMAT_DEFAULT;
         }
     }
+
+    /**
+     * Returns the String equivalent of the btCodecType.
+     *
+     * This uses an "ENCODING_" prefix for consistency with Audio;
+     * we could alternately use the "SOURCE_CODEC_TYPE_" prefix from Bluetooth.
+     */
+    public static String bluetoothCodecToEncodingString(int btCodecType) {
+        switch (btCodecType) {
+            case BluetoothCodecConfig.SOURCE_CODEC_TYPE_SBC:
+                return "ENCODING_SBC";
+            case BluetoothCodecConfig.SOURCE_CODEC_TYPE_AAC:
+                return "ENCODING_AAC";
+            case BluetoothCodecConfig.SOURCE_CODEC_TYPE_APTX:
+                return "ENCODING_APTX";
+            case BluetoothCodecConfig.SOURCE_CODEC_TYPE_APTX_HD:
+                return "ENCODING_APTX_HD";
+            case BluetoothCodecConfig.SOURCE_CODEC_TYPE_LDAC:
+                return "ENCODING_LDAC";
+            default:
+                return "ENCODING_BT_CODEC_TYPE(" + btCodecType + ")";
+        }
+    }
 }
diff --git a/services/core/java/com/android/server/audio/MediaFocusControl.java b/services/core/java/com/android/server/audio/MediaFocusControl.java
old mode 100644
new mode 100755
index 7bf2bc8..26281b7
--- a/services/core/java/com/android/server/audio/MediaFocusControl.java
+++ b/services/core/java/com/android/server/audio/MediaFocusControl.java
@@ -25,11 +25,13 @@
 import android.media.AudioManager;
 import android.media.AudioSystem;
 import android.media.IAudioFocusDispatcher;
+import android.media.MediaMetrics;
 import android.media.audiopolicy.IAudioPolicyCallback;
 import android.os.Binder;
 import android.os.Build;
 import android.os.IBinder;
 import android.os.RemoteException;
+import android.provider.Settings;
 import android.util.Log;
 
 import com.android.internal.annotations.GuardedBy;
@@ -80,6 +82,7 @@
     private final Context mContext;
     private final AppOpsManager mAppOps;
     private PlayerFocusEnforcer mFocusEnforcer; // never null
+    private boolean mMultiAudioFocusEnabled = false;
 
     private boolean mRingOrCallActive = false;
 
@@ -91,6 +94,8 @@
         mContext = cntxt;
         mAppOps = (AppOpsManager)mContext.getSystemService(Context.APP_OPS_SERVICE);
         mFocusEnforcer = pfe;
+        mMultiAudioFocusEnabled = Settings.System.getInt(mContext.getContentResolver(),
+                Settings.System.MULTI_AUDIO_FOCUS_ENABLED, 0) != 0;
     }
 
     protected void dump(PrintWriter pw) {
@@ -100,6 +105,7 @@
         pw.println("\n");
         // log
         mEventLogger.dump(pw);
+        dumpMultiAudioFocus(pw);
     }
 
     //=================================================================
@@ -139,6 +145,8 @@
     private static final AudioEventLogger mEventLogger = new AudioEventLogger(50,
             "focus commands as seen by MediaFocusControl");
 
+    private static final String mMetricsId = MediaMetrics.Name.AUDIO_FOCUS;
+
     /*package*/ void noFocusForSuspendedApp(@NonNull String packageName, int uid) {
         synchronized (mAudioFocusLock) {
             final Iterator<FocusRequester> stackIterator = mFocusStack.iterator();
@@ -194,6 +202,14 @@
                 mFocusStack.peek().handleFocusGain(AudioManager.AUDIOFOCUS_GAIN);
             }
         }
+
+        if (mMultiAudioFocusEnabled && !mMultiAudioFocusList.isEmpty()) {
+            for (FocusRequester multifr : mMultiAudioFocusList) {
+                if (isLockedFocusOwner(multifr)) {
+                    multifr.handleFocusGain(AudioManager.AUDIOFOCUS_GAIN);
+                }
+            }
+        }
     }
 
     /**
@@ -203,17 +219,30 @@
      */
     @GuardedBy("mAudioFocusLock")
     private void propagateFocusLossFromGain_syncAf(int focusGain, final FocusRequester fr,
-            boolean forceDuck) {
+                                                   boolean forceDuck) {
         final List<String> clientsToRemove = new LinkedList<String>();
         // going through the audio focus stack to signal new focus, traversing order doesn't
         // matter as all entries respond to the same external focus gain
-        for (FocusRequester focusLoser : mFocusStack) {
-            final boolean isDefinitiveLoss =
-                    focusLoser.handleFocusLossFromGain(focusGain, fr, forceDuck);
-            if (isDefinitiveLoss) {
-                clientsToRemove.add(focusLoser.getClientId());
+        if (!mFocusStack.empty()) {
+            for (FocusRequester focusLoser : mFocusStack) {
+                final boolean isDefinitiveLoss =
+                        focusLoser.handleFocusLossFromGain(focusGain, fr, forceDuck);
+                if (isDefinitiveLoss) {
+                    clientsToRemove.add(focusLoser.getClientId());
+                }
             }
         }
+
+        if (mMultiAudioFocusEnabled && !mMultiAudioFocusList.isEmpty()) {
+            for (FocusRequester multifocusLoser : mMultiAudioFocusList) {
+                final boolean isDefinitiveLoss =
+                        multifocusLoser.handleFocusLossFromGain(focusGain, fr, forceDuck);
+                if (isDefinitiveLoss) {
+                    clientsToRemove.add(multifocusLoser.getClientId());
+                }
+            }
+        }
+
         for (String clientToRemove : clientsToRemove) {
             removeFocusStackEntry(clientToRemove, false /*signal*/,
                     true /*notifyFocusFollowers*/);
@@ -222,6 +251,8 @@
 
     private final Stack<FocusRequester> mFocusStack = new Stack<FocusRequester>();
 
+    ArrayList<FocusRequester> mMultiAudioFocusList = new ArrayList<FocusRequester>();
+
     /**
      * Helper function:
      * Display in the log the current entries in the audio focus stack
@@ -287,6 +318,22 @@
                 }
             }
         }
+
+        if (mMultiAudioFocusEnabled && !mMultiAudioFocusList.isEmpty()) {
+            Iterator<FocusRequester> listIterator = mMultiAudioFocusList.iterator();
+            while (listIterator.hasNext()) {
+                FocusRequester fr = listIterator.next();
+                if (fr.hasSameClient(clientToRemove)) {
+                    listIterator.remove();
+                    fr.release();
+                }
+            }
+
+            if (signal) {
+                // notify the new top of the stack it gained focus
+                notifyTopOfAudioFocusStack();
+            }
+        }
     }
 
     /**
@@ -410,6 +457,16 @@
                     removeFocusEntryForExtPolicy(mCb);
                 } else {
                     removeFocusStackEntryOnDeath(mCb);
+                    if (mMultiAudioFocusEnabled && !mMultiAudioFocusList.isEmpty()) {
+                        Iterator<FocusRequester> listIterator = mMultiAudioFocusList.iterator();
+                        while (listIterator.hasNext()) {
+                            FocusRequester fr = listIterator.next();
+                            if (fr.hasSameBinder(mCb)) {
+                                listIterator.remove();
+                                fr.release();
+                            }
+                        }
+                    }
                 }
             }
         }
@@ -764,6 +821,17 @@
     protected int requestAudioFocus(@NonNull AudioAttributes aa, int focusChangeHint, IBinder cb,
             IAudioFocusDispatcher fd, @NonNull String clientId, @NonNull String callingPackageName,
             int flags, int sdk, boolean forceDuck) {
+        new MediaMetrics.Item(mMetricsId)
+                .setUid(Binder.getCallingUid())
+                .set(MediaMetrics.Property.CALLING_PACKAGE, callingPackageName)
+                .set(MediaMetrics.Property.CLIENT_NAME, clientId)
+                .set(MediaMetrics.Property.EVENT, "requestAudioFocus")
+                .set(MediaMetrics.Property.FLAGS, flags)
+                .set(MediaMetrics.Property.FOCUS_CHANGE_HINT,
+                        AudioManager.audioFocusToString(focusChangeHint))
+                //.set(MediaMetrics.Property.SDK, sdk)
+                .record();
+
         mEventLogger.log((new AudioEventLogger.StringEvent(
                 "requestAudioFocus() from uid/pid " + Binder.getCallingUid()
                     + "/" + Binder.getCallingPid()
@@ -867,6 +935,35 @@
 
             final FocusRequester nfr = new FocusRequester(aa, focusChangeHint, flags, fd, cb,
                     clientId, afdh, callingPackageName, Binder.getCallingUid(), this, sdk);
+
+            if (mMultiAudioFocusEnabled
+                    && (focusChangeHint == AudioManager.AUDIOFOCUS_GAIN)) {
+                if (enteringRingOrCall) {
+                    if (!mMultiAudioFocusList.isEmpty()) {
+                        for (FocusRequester multifr : mMultiAudioFocusList) {
+                            multifr.handleFocusLossFromGain(focusChangeHint, nfr, forceDuck);
+                        }
+                    }
+                } else {
+                    boolean needAdd = true;
+                    if (!mMultiAudioFocusList.isEmpty()) {
+                        for (FocusRequester multifr : mMultiAudioFocusList) {
+                            if (multifr.getClientUid() == Binder.getCallingUid()) {
+                                needAdd = false;
+                                break;
+                            }
+                        }
+                    }
+                    if (needAdd) {
+                        mMultiAudioFocusList.add(nfr);
+                    }
+                    nfr.handleFocusGainFromRequest(AudioManager.AUDIOFOCUS_REQUEST_GRANTED);
+                    notifyExtPolicyFocusGrant_syncAf(nfr.toAudioFocusInfo(),
+                            AudioManager.AUDIOFOCUS_REQUEST_GRANTED);
+                    return AudioManager.AUDIOFOCUS_REQUEST_GRANTED;
+                }
+            }
+
             if (focusGrantDelayed) {
                 // focusGrantDelayed being true implies we can't reassign focus right now
                 // which implies the focus stack is not empty.
@@ -877,9 +974,7 @@
                 return requestResult;
             } else {
                 // propagate the focus change through the stack
-                if (!mFocusStack.empty()) {
-                    propagateFocusLossFromGain_syncAf(focusChangeHint, nfr, forceDuck);
-                }
+                propagateFocusLossFromGain_syncAf(focusChangeHint, nfr, forceDuck);
 
                 // push focus requester at the top of the audio focus stack
                 mFocusStack.push(nfr);
@@ -901,6 +996,13 @@
      * */
     protected int abandonAudioFocus(IAudioFocusDispatcher fl, String clientId, AudioAttributes aa,
             String callingPackageName) {
+        new MediaMetrics.Item(mMetricsId)
+                .setUid(Binder.getCallingUid())
+                .set(MediaMetrics.Property.CALLING_PACKAGE, callingPackageName)
+                .set(MediaMetrics.Property.CLIENT_NAME, clientId)
+                .set(MediaMetrics.Property.EVENT, "abandonAudioFocus")
+                .record();
+
         // AudioAttributes are currently ignored, to be used for zones / a11y
         mEventLogger.log((new AudioEventLogger.StringEvent(
                 "abandonAudioFocus() from uid/pid " + Binder.getCallingUid()
@@ -970,4 +1072,39 @@
             }
         }.start();
     }
+
+    public void updateMultiAudioFocus(boolean enabled) {
+        Log.d(TAG, "updateMultiAudioFocus( " + enabled + " )");
+        mMultiAudioFocusEnabled = enabled;
+        Settings.System.putInt(mContext.getContentResolver(),
+                Settings.System.MULTI_AUDIO_FOCUS_ENABLED, enabled ? 1 : 0);
+        if (!mFocusStack.isEmpty()) {
+            final FocusRequester fr = mFocusStack.peek();
+            fr.handleFocusLoss(AudioManager.AUDIOFOCUS_LOSS, null, false);
+        }
+        if (!enabled) {
+            if (!mMultiAudioFocusList.isEmpty()) {
+                for (FocusRequester multifr : mMultiAudioFocusList) {
+                    multifr.handleFocusLoss(AudioManager.AUDIOFOCUS_LOSS, null, false);
+                }
+                mMultiAudioFocusList.clear();
+            }
+        }
+    }
+
+    public boolean getMultiAudioFocusEnabled() {
+        return mMultiAudioFocusEnabled;
+    }
+
+    private void dumpMultiAudioFocus(PrintWriter pw) {
+        pw.println("Multi Audio Focus enabled :" + mMultiAudioFocusEnabled);
+        if (!mMultiAudioFocusList.isEmpty()) {
+            pw.println("Multi Audio Focus List:");
+            pw.println("------------------------------");
+            for (FocusRequester multifr : mMultiAudioFocusList) {
+                multifr.dump(pw);
+            }
+            pw.println("------------------------------");
+        }
+    }
 }
diff --git a/services/core/java/com/android/server/audio/SystemServerAdapter.java b/services/core/java/com/android/server/audio/SystemServerAdapter.java
new file mode 100644
index 0000000..509f6be
--- /dev/null
+++ b/services/core/java/com/android/server/audio/SystemServerAdapter.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.audio;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.content.Context;
+import android.content.Intent;
+import android.media.AudioManager;
+import android.os.UserHandle;
+
+/**
+ * Provides an adapter to access functionality reserved to components running in system_server
+ * Functionality such as sending privileged broadcasts is to be accessed through the default
+ * adapter, whereas tests can inject a no-op adapter.
+ */
+public class SystemServerAdapter {
+
+    protected final Context mContext;
+
+    private SystemServerAdapter(@Nullable Context context) {
+        mContext = context;
+    }
+    /**
+     * Create a wrapper around privileged functionality.
+     * @return the adapter
+     */
+    static final @NonNull SystemServerAdapter getDefaultAdapter(Context context) {
+        return new SystemServerAdapter(context);
+    }
+
+    /**
+     * Create an adapter that does nothing.
+     * Use for running non-privileged tests, such as unit tests
+     * @return a no-op adapter
+     */
+    static final @NonNull SystemServerAdapter getNoOpAdapter() {
+        return new NoOpSystemServerAdapter();
+    }
+
+    /**
+     * @return true if this is supposed to be run in system_server, false otherwise (e.g. for a
+     *     unit test)
+     */
+    public boolean isPrivileged() {
+        return true;
+    }
+
+    /**
+     * Broadcast ACTION_MICROPHONE_MUTE_CHANGED
+     */
+    public void sendMicrophoneMuteChangedIntent() {
+        mContext.sendBroadcastAsUser(
+                new Intent(AudioManager.ACTION_MICROPHONE_MUTE_CHANGED)
+                        .setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY),
+                UserHandle.ALL);
+    }
+
+    //--------------------------------------------------------------------
+    protected static class NoOpSystemServerAdapter extends SystemServerAdapter {
+
+        NoOpSystemServerAdapter() {
+            super(null);
+        }
+
+        @Override
+        public boolean isPrivileged() {
+            return false;
+        }
+
+        @Override
+        public void sendMicrophoneMuteChangedIntent() {
+            // no-op
+        }
+    }
+}
diff --git a/services/core/java/com/android/server/connectivity/Nat464Xlat.java b/services/core/java/com/android/server/connectivity/Nat464Xlat.java
index 741cb5b..34d0bed 100644
--- a/services/core/java/com/android/server/connectivity/Nat464Xlat.java
+++ b/services/core/java/com/android/server/connectivity/Nat464Xlat.java
@@ -81,12 +81,23 @@
         RUNNING,      // start() called, and the stacked iface is known to be up.
     }
 
+    /**
+     * NAT64 prefix currently in use. Only valid in STARTING or RUNNING states.
+     * Used, among other things, to avoid updates when switching from a prefix learned from one
+     * source (e.g., RA) to the same prefix learned from another source (e.g., RA).
+     */
+    private IpPrefix mNat64PrefixInUse;
+    /** NAT64 prefix (if any) discovered from DNS via RFC 7050. */
     private IpPrefix mNat64PrefixFromDns;
+    /** NAT64 prefix (if any) learned from the network via RA. */
+    private IpPrefix mNat64PrefixFromRa;
     private String mBaseIface;
     private String mIface;
     private Inet6Address mIPv6Address;
     private State mState = State.IDLE;
 
+    private boolean mPrefixDiscoveryRunning;
+
     public Nat464Xlat(NetworkAgentInfo nai, INetd netd, IDnsResolver dnsResolver,
             INetworkManagementService nmService) {
         mDnsResolver = dnsResolver;
@@ -136,15 +147,6 @@
     }
 
     /**
-     * @return true if we have started prefix discovery and not yet stopped it (regardless of
-     * whether it is still running or has succeeded).
-     * A true result corresponds to internal states DISCOVERING, STARTING and RUNNING.
-     */
-    public boolean isPrefixDiscoveryStarted() {
-        return mState == State.DISCOVERING || isStarted();
-    }
-
-    /**
      * @return true if clatd has been started and has not yet stopped.
      * A true result corresponds to internal states STARTING and RUNNING.
      */
@@ -178,9 +180,10 @@
             return;
         }
 
+        mNat64PrefixInUse = selectNat64Prefix();
         String addrStr = null;
         try {
-            addrStr = mNetd.clatdStart(baseIface, getNat64Prefix().toString());
+            addrStr = mNetd.clatdStart(baseIface, mNat64PrefixInUse.toString());
         } catch (RemoteException | ServiceSpecificException e) {
             Slog.e(TAG, "Error starting clatd on " + baseIface + ": " + e);
         }
@@ -192,6 +195,9 @@
         } catch (ClassCastException | IllegalArgumentException | NullPointerException e) {
             Slog.e(TAG, "Invalid IPv6 address " + addrStr);
         }
+        if (mPrefixDiscoveryRunning && !isPrefixDiscoveryNeeded()) {
+            stopPrefixDiscovery();
+        }
     }
 
     /**
@@ -211,12 +217,18 @@
         } catch (RemoteException | IllegalStateException e) {
             Slog.e(TAG, "Error unregistering clatd observer on " + mBaseIface + ": " + e);
         }
+        mNat64PrefixInUse = null;
         mIface = null;
         mBaseIface = null;
-        if (requiresClat(mNetwork)) {
+
+        if (isPrefixDiscoveryNeeded()) {
+            if (!mPrefixDiscoveryRunning) {
+                startPrefixDiscovery();
+            }
             mState = State.DISCOVERING;
         } else {
             stopPrefixDiscovery();
+            mState = State.IDLE;
         }
     }
 
@@ -274,19 +286,39 @@
     private void startPrefixDiscovery() {
         try {
             mDnsResolver.startPrefix64Discovery(getNetId());
-            mState = State.DISCOVERING;
         } catch (RemoteException | ServiceSpecificException e) {
             Slog.e(TAG, "Error starting prefix discovery on netId " + getNetId() + ": " + e);
         }
+        mPrefixDiscoveryRunning = true;
     }
 
     private void stopPrefixDiscovery() {
         try {
             mDnsResolver.stopPrefix64Discovery(getNetId());
-            mState = State.IDLE;
         } catch (RemoteException | ServiceSpecificException e) {
             Slog.e(TAG, "Error stopping prefix discovery on netId " + getNetId() + ": " + e);
         }
+        mPrefixDiscoveryRunning = false;
+    }
+
+    private boolean isPrefixDiscoveryNeeded() {
+        // If there is no NAT64 prefix in the RA, prefix discovery is always needed. It cannot be
+        // stopped after it succeeds, because stopping it will cause netd to report that the prefix
+        // has been removed, and that will cause us to stop clatd.
+        return requiresClat(mNetwork) && mNat64PrefixFromRa == null;
+    }
+
+    private void maybeHandleNat64PrefixChange() {
+        final IpPrefix newPrefix = selectNat64Prefix();
+        if (!Objects.equals(mNat64PrefixInUse, newPrefix)) {
+            Slog.d(TAG, "NAT64 prefix changed from " + mNat64PrefixInUse + " to "
+                    + newPrefix);
+            stop();
+            // It's safe to call update here, even though this method is called from update, because
+            // stop() is guaranteed to have moved out of STARTING and RUNNING, which are the only
+            // states in which this method can be called.
+            update();
+        }
     }
 
     /**
@@ -296,13 +328,11 @@
         // TODO: turn this class into a proper StateMachine. http://b/126113090
         switch (mState) {
             case IDLE:
-                if (requiresClat(mNetwork)) {
-                    // Network is detected to be IPv6-only.
-                    // TODO: consider going to STARTING directly if the NAT64 prefix is already
-                    // known. This would however result in clatd running without prefix discovery
-                    // running, which might be a surprising combination.
+                if (isPrefixDiscoveryNeeded()) {
                     startPrefixDiscovery();  // Enters DISCOVERING state.
-                    return;
+                    mState = State.DISCOVERING;
+                } else if (requiresClat(mNetwork)) {
+                    start();  // Enters STARTING state.
                 }
                 break;
 
@@ -315,6 +345,7 @@
                 if (!requiresClat(mNetwork)) {
                     // IPv4 address added. Go back to IDLE state.
                     stopPrefixDiscovery();
+                    mState = State.IDLE;
                     return;
                 }
                 break;
@@ -325,16 +356,28 @@
                 // Stop clatd and go back into DISCOVERING or idle.
                 if (!shouldStartClat(mNetwork)) {
                     stop();
+                    break;
                 }
+                // Only necessary while clat is actually started.
+                maybeHandleNat64PrefixChange();
                 break;
-                // TODO: support the NAT64 prefix changing after it's been discovered. There is
-                // no need to support this at the moment because it cannot happen without
-                // changes to the Dns64Configuration code in netd.
         }
     }
 
-    private IpPrefix getNat64Prefix() {
-        return mNat64PrefixFromDns;
+    /**
+     * Picks a NAT64 prefix to use. Always prefers the prefix from the RA if one is received from
+     * both RA and DNS, because the prefix in the RA has better security and updatability, and will
+     * almost always be received first anyway.
+     *
+     * Any network that supports legacy hosts will support discovering the DNS64 prefix via DNS as
+     * well. If the prefix from the RA is withdrawn, fall back to that for reliability purposes.
+     */
+    private IpPrefix selectNat64Prefix() {
+        return mNat64PrefixFromRa != null ? mNat64PrefixFromRa : mNat64PrefixFromDns;
+    }
+
+    public void setNat64PrefixFromRa(IpPrefix prefix) {
+        mNat64PrefixFromRa = prefix;
     }
 
     public void setNat64PrefixFromDns(IpPrefix prefix) {
@@ -347,7 +390,9 @@
      * has no idea that 464xlat is running on top of it.
      */
     public void fixupLinkProperties(@NonNull LinkProperties oldLp, @NonNull LinkProperties lp) {
-        lp.setNat64Prefix(getNat64Prefix());
+        // This must be done even if clatd is not running, because otherwise shouldStartClat would
+        // never return true.
+        lp.setNat64Prefix(selectNat64Prefix());
 
         if (!isRunning()) {
             return;
diff --git a/services/core/java/com/android/server/display/AutomaticBrightnessController.java b/services/core/java/com/android/server/display/AutomaticBrightnessController.java
index f4d7f9a..36d69c9 100644
--- a/services/core/java/com/android/server/display/AutomaticBrightnessController.java
+++ b/services/core/java/com/android/server/display/AutomaticBrightnessController.java
@@ -89,10 +89,8 @@
     private final BrightnessMappingStrategy mBrightnessMapper;
 
     // The minimum and maximum screen brightnesses.
-    private final int mScreenBrightnessRangeMinimum;
-    private final int mScreenBrightnessRangeMaximum;
-    private final float mScreenBrightnessRangeMinimumFloat;
-    private final float mScreenBrightnessRangeMaximumFloat;
+    private final float mScreenBrightnessRangeMinimum;
+    private final float mScreenBrightnessRangeMaximum;
 
     // How much to scale doze brightness by (should be (0, 1.0]).
     private final float mDozeScaleFactor;
@@ -156,7 +154,6 @@
     // The screen brightness threshold at which to brighten or darken the screen.
     private float mScreenBrighteningThreshold;
     private float mScreenDarkeningThreshold;
-
     // The most recent light sample.
     private float mLastObservedLux;
 
@@ -177,8 +174,9 @@
     // We preserve this value even when we stop using the light sensor so
     // that we can quickly revert to the previous auto-brightness level
     // while the light sensor warms up.
-    // Use -1 if there is no current auto-brightness value available.
-    private int mScreenAutoBrightness = PowerManager.BRIGHTNESS_INVALID;
+    // Use PowerManager.BRIGHTNESS_INVALID_FLOAT if there is no current auto-brightness value
+    // available.
+    private float mScreenAutoBrightness = PowerManager.BRIGHTNESS_INVALID_FLOAT;
 
     // The current display policy. This is useful, for example,  for knowing when we're dozing,
     // where the light sensor may not be available.
@@ -188,7 +186,7 @@
     // for the initial state of the sample.
     private boolean mBrightnessAdjustmentSamplePending;
     private float mBrightnessAdjustmentSampleOldLux;
-    private int mBrightnessAdjustmentSampleOldBrightness;
+    private float mBrightnessAdjustmentSampleOldBrightness;
 
     // When the short term model is invalidated, we don't necessarily reset it (i.e. clear the
     // user's adjustment) immediately, but wait for a drastic enough change in the ambient light.
@@ -243,13 +241,8 @@
         mCallbacks = callbacks;
         mSensorManager = sensorManager;
         mBrightnessMapper = mapper;
-        mScreenBrightnessRangeMinimum =
-                BrightnessSynchronizer.brightnessFloatToInt(mContext, brightnessMin);
-        mScreenBrightnessRangeMaximum =
-                com.android.internal.BrightnessSynchronizer.brightnessFloatToInt(
-                        mContext, brightnessMax);
-        mScreenBrightnessRangeMinimumFloat = brightnessMin;
-        mScreenBrightnessRangeMaximumFloat = brightnessMax;
+        mScreenBrightnessRangeMinimum = brightnessMin;
+        mScreenBrightnessRangeMaximum = brightnessMax;
         mLightSensorWarmUpTimeConfig = lightSensorWarmUpTime;
         mDozeScaleFactor = dozeScaleFactor;
         mNormalLightSensorRate = lightSensorRate;
@@ -299,12 +292,12 @@
         return true;
     }
 
-    public int getAutomaticScreenBrightness() {
+    public float getAutomaticScreenBrightness() {
         if (!mAmbientLuxValid) {
-            return -1;
+            return PowerManager.BRIGHTNESS_INVALID_FLOAT;
         }
         if (mDisplayPolicy == DisplayPowerRequest.POLICY_DOZE) {
-            return Math.round(mScreenAutoBrightness * mDozeScaleFactor);
+            return mScreenAutoBrightness * mDozeScaleFactor;
         }
         return mScreenAutoBrightness;
     }
@@ -385,7 +378,7 @@
 
     private boolean setScreenBrightnessByUser(float brightness) {
         if (!mAmbientLuxValid) {
-            // If we don't have a valid ambient lux then we don't have a valid brightness anyways,
+            // If we don't have a valid ambient lux then we don't have a valid brightness anyway,
             // and we can't use this data to add a new control point to the short-term model.
             return false;
         }
@@ -486,7 +479,7 @@
         } else if (mLightSensorEnabled) {
             mLightSensorEnabled = false;
             mAmbientLuxValid = !mResetAmbientLuxAfterWarmUpConfig;
-            mScreenAutoBrightness = PowerManager.BRIGHTNESS_INVALID;
+            mScreenAutoBrightness = PowerManager.BRIGHTNESS_INVALID_FLOAT;
             mRecentLightSamples = 0;
             mAmbientLightRingBuffer.clear();
             mCurrentLightSensorRate = -1;
@@ -735,29 +728,28 @@
 
         float value = mBrightnessMapper.getBrightness(mAmbientLux, mForegroundAppPackageName,
                 mForegroundAppCategory);
-        int newScreenAutoBrightness = BrightnessSynchronizer.brightnessFloatToInt(
-                mContext, clampScreenBrightnessFloat(value));
+        float newScreenAutoBrightness = clampScreenBrightness(value);
         // If screenAutoBrightness is set, we should have screen{Brightening,Darkening}Threshold,
         // in which case we ignore the new screen brightness if it doesn't differ enough from the
         // previous one.
-        if (mScreenAutoBrightness != -1
+        if (!Float.isNaN(mScreenAutoBrightness)
                 && !isManuallySet
                 && newScreenAutoBrightness > mScreenDarkeningThreshold
                 && newScreenAutoBrightness < mScreenBrighteningThreshold) {
             if (mLoggingEnabled) {
-                Slog.d(TAG, "ignoring newScreenAutoBrightness: " + mScreenDarkeningThreshold
-                        + " < " + newScreenAutoBrightness + " < " + mScreenBrighteningThreshold);
+                Slog.d(TAG, "ignoring newScreenAutoBrightness: "
+                        + mScreenDarkeningThreshold + " < " + newScreenAutoBrightness
+                        + " < " + mScreenBrighteningThreshold);
             }
             return;
         }
-
-        if (mScreenAutoBrightness != newScreenAutoBrightness) {
+        if (!BrightnessSynchronizer.floatEquals(mScreenAutoBrightness,
+                newScreenAutoBrightness)) {
             if (mLoggingEnabled) {
-                Slog.d(TAG, "updateAutoBrightness: " +
-                        "mScreenAutoBrightness=" + mScreenAutoBrightness + ", " +
-                        "newScreenAutoBrightness=" + newScreenAutoBrightness);
+                Slog.d(TAG, "updateAutoBrightness: "
+                        + "mScreenAutoBrightness=" + mScreenAutoBrightness + ", "
+                        + "newScreenAutoBrightness=" + newScreenAutoBrightness);
             }
-
             mScreenAutoBrightness = newScreenAutoBrightness;
             mScreenBrighteningThreshold = clampScreenBrightness(
                     mScreenBrightnessThresholds.getBrighteningThreshold(newScreenAutoBrightness));
@@ -770,19 +762,12 @@
         }
     }
 
-    // Clamps values with float range [1.0-255.0]
-    // TODO(brightnessfloat): convert everything that uses this to float system
+    // Clamps values with float range [0.0-1.0]
     private float clampScreenBrightness(float value) {
         return MathUtils.constrain(value,
                 mScreenBrightnessRangeMinimum, mScreenBrightnessRangeMaximum);
     }
 
-    // Clamps values with float range [0.0-1.0]
-    private float clampScreenBrightnessFloat(float value) {
-        return MathUtils.constrain(value,
-                mScreenBrightnessRangeMinimumFloat, mScreenBrightnessRangeMaximumFloat);
-    }
-
     private void prepareBrightnessAdjustmentSample() {
         if (!mBrightnessAdjustmentSamplePending) {
             mBrightnessAdjustmentSamplePending = true;
@@ -806,12 +791,13 @@
     private void collectBrightnessAdjustmentSample() {
         if (mBrightnessAdjustmentSamplePending) {
             mBrightnessAdjustmentSamplePending = false;
-            if (mAmbientLuxValid && mScreenAutoBrightness >= 0) {
+            if (mAmbientLuxValid && (mScreenAutoBrightness >= PowerManager.BRIGHTNESS_MIN
+                    || mScreenAutoBrightness == PowerManager.BRIGHTNESS_OFF_FLOAT)) {
                 if (mLoggingEnabled) {
-                    Slog.d(TAG, "Auto-brightness adjustment changed by user: " +
-                            "lux=" + mAmbientLux + ", " +
-                            "brightness=" + mScreenAutoBrightness + ", " +
-                            "ring=" + mAmbientLightRingBuffer);
+                    Slog.d(TAG, "Auto-brightness adjustment changed by user: "
+                            + "lux=" + mAmbientLux + ", "
+                            + "brightness=" + mScreenAutoBrightness + ", "
+                            + "ring=" + mAmbientLightRingBuffer);
                 }
 
                 EventLog.writeEvent(EventLogTags.AUTO_BRIGHTNESS_ADJ,
diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java
index a87fb8b..02d499f 100644
--- a/services/core/java/com/android/server/display/DisplayManagerService.java
+++ b/services/core/java/com/android/server/display/DisplayManagerService.java
@@ -28,6 +28,8 @@
 import static android.hardware.display.DisplayViewport.VIEWPORT_EXTERNAL;
 import static android.hardware.display.DisplayViewport.VIEWPORT_INTERNAL;
 import static android.hardware.display.DisplayViewport.VIEWPORT_VIRTUAL;
+import static android.view.Surface.ROTATION_270;
+import static android.view.Surface.ROTATION_90;
 
 import android.Manifest;
 import android.annotation.NonNull;
@@ -552,7 +554,8 @@
         }
         if (state == Display.STATE_OFF) {
             brightnessState = PowerManager.BRIGHTNESS_OFF_FLOAT;
-        } else if (brightnessState < PowerManager.BRIGHTNESS_MIN || Float.isNaN(brightnessState)) {
+        } else if (brightnessState != PowerManager.BRIGHTNESS_OFF_FLOAT
+                && brightnessState < PowerManager.BRIGHTNESS_MIN) {
             brightnessState = PowerManager.BRIGHTNESS_INVALID_FLOAT;
         } else if (brightnessState > PowerManager.BRIGHTNESS_MAX) {
             brightnessState = PowerManager.BRIGHTNESS_MAX;
@@ -1362,8 +1365,7 @@
         return null;
     }
 
-    private SurfaceControl.ScreenshotGraphicBuffer screenshotInternal(int displayId,
-            boolean captureSecureLayer) {
+    private SurfaceControl.ScreenshotGraphicBuffer systemScreenshotInternal(int displayId) {
         synchronized (mSyncRoot) {
             final IBinder token = getDisplayToken(displayId);
             if (token == null) {
@@ -1375,15 +1377,42 @@
             }
 
             final DisplayInfo displayInfo = logicalDisplay.getDisplayInfoLocked();
-            if (captureSecureLayer) {
-                return SurfaceControl.screenshotToBufferWithSecureLayersUnsafe(token, new Rect(),
-                        displayInfo.getNaturalWidth(), displayInfo.getNaturalHeight(),
-                        false /* useIdentityTransform */, 0 /* rotation */);
-            } else {
-                return SurfaceControl.screenshotToBuffer(token, new Rect(),
-                        displayInfo.getNaturalWidth(), displayInfo.getNaturalHeight(),
-                        false /* useIdentityTransform */, 0 /* rotation */);
+            return SurfaceControl.screenshotToBufferWithSecureLayersUnsafe(token, new Rect(),
+                    displayInfo.getNaturalWidth(), displayInfo.getNaturalHeight(),
+                    false /* useIdentityTransform */, 0 /* rotation */);
+        }
+    }
+
+    private SurfaceControl.ScreenshotGraphicBuffer userScreenshotInternal(int displayId) {
+        synchronized (mSyncRoot) {
+            final IBinder token = getDisplayToken(displayId);
+            if (token == null) {
+                return null;
             }
+            final LogicalDisplay logicalDisplay = mLogicalDisplays.get(displayId);
+            if (logicalDisplay == null) {
+                return null;
+            }
+
+            final DisplayInfo displayInfo = logicalDisplay.getDisplayInfoLocked();
+            // Takes screenshot based on current device orientation.
+            final Display display = DisplayManagerGlobal.getInstance()
+                    .getRealDisplay(displayId);
+            if (display == null) {
+                return null;
+            }
+            final Point displaySize = new Point();
+            display.getRealSize(displaySize);
+
+            int rotation = displayInfo.rotation;
+            // TODO (b/153382624) : This workaround solution would be removed after
+            // SurfaceFlinger fixes the inconsistency with rotation direction issue.
+            if (rotation == ROTATION_90 || rotation == ROTATION_270) {
+                rotation = (rotation == ROTATION_90) ? ROTATION_270 : ROTATION_90;
+            }
+
+            return SurfaceControl.screenshotToBuffer(token, new Rect(), displaySize.x,
+                    displaySize.y, false /* useIdentityTransform */, rotation /* rotation */);
         }
     }
 
@@ -2501,13 +2530,13 @@
         }
 
         @Override
-        public SurfaceControl.ScreenshotGraphicBuffer screenshot(int displayId) {
-            return screenshotInternal(displayId, true);
+        public SurfaceControl.ScreenshotGraphicBuffer systemScreenshot(int displayId) {
+            return systemScreenshotInternal(displayId);
         }
 
         @Override
-        public SurfaceControl.ScreenshotGraphicBuffer screenshotWithoutSecureLayer(int displayId) {
-            return screenshotInternal(displayId, false);
+        public SurfaceControl.ScreenshotGraphicBuffer userScreenshot(int displayId) {
+            return userScreenshotInternal(displayId);
         }
 
         @Override
diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java
index f82ec82..bafeb77 100644
--- a/services/core/java/com/android/server/display/DisplayPowerController.java
+++ b/services/core/java/com/android/server/display/DisplayPowerController.java
@@ -42,6 +42,7 @@
 import android.os.PowerManager;
 import android.os.RemoteException;
 import android.os.SystemClock;
+import android.os.SystemProperties;
 import android.os.Trace;
 import android.os.UserHandle;
 import android.provider.Settings;
@@ -389,6 +390,10 @@
     private ObjectAnimator mColorFadeOffAnimator;
     private RampAnimator<DisplayPowerState> mScreenBrightnessRampAnimator;
 
+    // The brightness synchronizer to allow changes in the int brightness value to be reflected in
+    // the float brightness value and vice versa.
+    @Nullable
+    private final BrightnessSynchronizer mBrightnessSynchronizer;
 
     /**
      * Creates the display power controller.
@@ -405,6 +410,7 @@
         mWindowManagerPolicy = LocalServices.getService(WindowManagerPolicy.class);
         mBlanker = blanker;
         mContext = context;
+        mBrightnessSynchronizer = new BrightnessSynchronizer(context);
         mDisplayDevice = displayDevice;
 
         PowerManager pm =  context.getSystemService(PowerManager.class);
@@ -942,8 +948,7 @@
         if (Float.isNaN(brightnessState)) {
             float newAutoBrightnessAdjustment = autoBrightnessAdjustment;
             if (autoBrightnessEnabled) {
-                brightnessState = BrightnessSynchronizer.brightnessIntToFloat(
-                mContext, mAutomaticBrightnessController.getAutomaticScreenBrightness());
+                brightnessState = mAutomaticBrightnessController.getAutomaticScreenBrightness();
                 newAutoBrightnessAdjustment =
                         mAutomaticBrightnessController.getAutomaticScreenBrightnessAdjustment();
             }
@@ -1243,6 +1248,8 @@
 
             if (!reportOnly) {
                 Trace.traceCounter(Trace.TRACE_TAG_POWER, "ScreenState", state);
+                // TODO(b/153319140) remove when we can get this from the above trace invocation
+                SystemProperties.set("debug.tracing.screen_state", String.valueOf(state));
                 mPowerState.setScreenState(state);
                 // Tell battery stats about the transition.
                 try {
@@ -1319,6 +1326,8 @@
         }
         if (mScreenBrightnessRampAnimator.animateTo(target, rate)) {
             Trace.traceCounter(Trace.TRACE_TAG_POWER, "TargetScreenBrightness", (int) target);
+            // TODO(b/153319140) remove when we can get this from the above trace invocation
+            SystemProperties.set("debug.tracing.screen_brightness", String.valueOf(target));
             try {
                 // TODO(brightnessfloat): change BatteryStats to use float
                 mBatteryStats.noteScreenBrightness(
diff --git a/services/core/java/com/android/server/display/HysteresisLevels.java b/services/core/java/com/android/server/display/HysteresisLevels.java
index f0a505d..2b56569 100644
--- a/services/core/java/com/android/server/display/HysteresisLevels.java
+++ b/services/core/java/com/android/server/display/HysteresisLevels.java
@@ -64,8 +64,8 @@
      * Return the brightening hysteresis threshold for the given value level.
      */
     public float getBrighteningThreshold(float value) {
-        float brightConstant = getReferenceLevel(value, mBrighteningThresholds);
-        float brightThreshold = value * (1.0f + brightConstant);
+        final float brightConstant = getReferenceLevel(value, mBrighteningThresholds);
+        final float brightThreshold = value * (1.0f + brightConstant);
         if (DEBUG) {
             Slog.d(TAG, "bright hysteresis constant=" + brightConstant + ", threshold="
                     + brightThreshold + ", value=" + value);
@@ -77,8 +77,8 @@
      * Return the darkening hysteresis threshold for the given value level.
      */
     public float getDarkeningThreshold(float value) {
-        float darkConstant = getReferenceLevel(value, mDarkeningThresholds);
-        float darkThreshold = value * (1.0f - darkConstant);
+        final float darkConstant = getReferenceLevel(value, mDarkeningThresholds);
+        final float darkThreshold = value * (1.0f - darkConstant);
         if (DEBUG) {
             Slog.d(TAG, "dark hysteresis constant=: " + darkConstant + ", threshold="
                     + darkThreshold + ", value=" + value);
diff --git a/services/core/java/com/android/server/emergency/EmergencyAffordanceService.java b/services/core/java/com/android/server/emergency/EmergencyAffordanceService.java
index 1cf27ff..cc7915c 100644
--- a/services/core/java/com/android/server/emergency/EmergencyAffordanceService.java
+++ b/services/core/java/com/android/server/emergency/EmergencyAffordanceService.java
@@ -20,90 +20,80 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
+import android.os.Binder;
+import android.os.Build;
 import android.os.Handler;
 import android.os.HandlerThread;
 import android.os.Looper;
 import android.os.Message;
 import android.provider.Settings;
-import android.telephony.CellInfo;
-import android.telephony.CellInfoGsm;
-import android.telephony.CellInfoLte;
-import android.telephony.CellInfoWcdma;
-import android.telephony.CellLocation;
-import android.telephony.PhoneStateListener;
 import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
+import android.text.TextUtils;
+import android.util.Slog;
 
+import com.android.internal.util.DumpUtils;
+import com.android.internal.util.IndentingPrintWriter;
 import com.android.server.SystemService;
 
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.List;
 
 /**
- * A service that listens to connectivity and SIM card changes and determines if the emergency mode
- * should be enabled
+ * A service that listens to connectivity and SIM card changes and determines if the emergency
+ * affordance should be enabled.
  */
 public class EmergencyAffordanceService extends SystemService {
 
     private static final String TAG = "EmergencyAffordanceService";
+    private static final boolean DBG = false;
 
-    private static final int NUM_SCANS_UNTIL_ABORT = 4;
+    private static final String SERVICE_NAME = "emergency_affordance";
 
     private static final int INITIALIZE_STATE = 1;
-    private static final int CELL_INFO_STATE_CHANGED = 2;
-    private static final int SUBSCRIPTION_CHANGED = 3;
-
     /**
-     * Global setting, whether the last scan of the sim cards reveal that a sim was inserted that
-     * requires the emergency affordance. The value is a boolean (1 or 0).
-     * @hide
+     * @param arg1 slot Index
+     * @param arg2 0
+     * @param obj ISO country code
      */
-    private static final String EMERGENCY_SIM_INSERTED_SETTING = "emergency_sim_inserted_before";
+    private static final int NETWORK_COUNTRY_CHANGED = 2;
+    private static final int SUBSCRIPTION_CHANGED = 3;
+    private static final int UPDATE_AIRPLANE_MODE_STATUS = 4;
+
+    // Global Settings to override emergency affordance country ISO for debugging.
+    // Available only on debug build. The value is a country ISO string in lower case (eg. "us").
+    private static final String EMERGENCY_AFFORDANCE_OVERRIDE_ISO =
+            "emergency_affordance_override_iso";
 
     private final Context mContext;
-    private final ArrayList<Integer> mEmergencyCallMccNumbers;
-
-    private final Object mLock = new Object();
-
-    private TelephonyManager mTelephonyManager;
+    // Country ISOs that require affordance
+    private final ArrayList<String> mEmergencyCallCountryIsos;
     private SubscriptionManager mSubscriptionManager;
-    private boolean mEmergencyAffordanceNeeded;
+    private TelephonyManager mTelephonyManager;
     private MyHandler mHandler;
-    private int mScansCompleted;
-    private PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
-        @Override
-        public void onCellInfoChanged(List<CellInfo> cellInfo) {
-            if (!isEmergencyAffordanceNeeded()) {
-                requestCellScan();
-            }
-        }
-
-        @Override
-        public void onCellLocationChanged(CellLocation location) {
-            if (!isEmergencyAffordanceNeeded()) {
-                requestCellScan();
-            }
-        }
-    };
-    private BroadcastReceiver mAirplaneModeReceiver = new BroadcastReceiver() {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            if (Settings.Global.getInt(context.getContentResolver(),
-                    Settings.Global.AIRPLANE_MODE_ON, 0) == 0) {
-                startScanning();
-                requestCellScan();
-            }
-        }
-    };
-    private boolean mSimNeedsEmergencyAffordance;
-    private boolean mNetworkNeedsEmergencyAffordance;
+    private boolean mAnySimNeedsEmergencyAffordance;
+    private boolean mAnyNetworkNeedsEmergencyAffordance;
+    private boolean mEmergencyAffordanceNeeded;
+    private boolean mAirplaneModeEnabled;
     private boolean mVoiceCapable;
 
-    private void requestCellScan() {
-        mHandler.obtainMessage(CELL_INFO_STATE_CHANGED).sendToTarget();
-    }
+    private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            if (TelephonyManager.ACTION_NETWORK_COUNTRY_CHANGED.equals(intent.getAction())) {
+                String countryCode = intent.getStringExtra(TelephonyManager.EXTRA_NETWORK_COUNTRY);
+                int slotId = intent.getIntExtra(SubscriptionManager.EXTRA_SLOT_INDEX,
+                        SubscriptionManager.INVALID_SIM_SLOT_INDEX);
+                mHandler.obtainMessage(
+                        NETWORK_COUNTRY_CHANGED, slotId, 0, countryCode).sendToTarget();
+            } else if (Intent.ACTION_AIRPLANE_MODE_CHANGED.equals(intent.getAction())) {
+                mHandler.obtainMessage(UPDATE_AIRPLANE_MODE_STATUS).sendToTarget();
+            }
+        }
+    };
 
     private SubscriptionManager.OnSubscriptionsChangedListener mSubscriptionChangedListener
             = new SubscriptionManager.OnSubscriptionsChangedListener() {
@@ -116,207 +106,200 @@
     public EmergencyAffordanceService(Context context) {
         super(context);
         mContext = context;
-        int[] numbers = context.getResources().getIntArray(
-                com.android.internal.R.array.config_emergency_mcc_codes);
-        mEmergencyCallMccNumbers = new ArrayList<>(numbers.length);
-        for (int i = 0; i < numbers.length; i++) {
-            mEmergencyCallMccNumbers.add(numbers[i]);
+        String[] isos = context.getResources().getStringArray(
+                com.android.internal.R.array.config_emergency_iso_country_codes);
+        mEmergencyCallCountryIsos = new ArrayList<>(isos.length);
+        for (String iso : isos) {
+            mEmergencyCallCountryIsos.add(iso);
         }
-    }
 
-    private void updateEmergencyAffordanceNeeded() {
-        synchronized (mLock) {
-            mEmergencyAffordanceNeeded = mVoiceCapable && (mSimNeedsEmergencyAffordance ||
-                    mNetworkNeedsEmergencyAffordance);
-            Settings.Global.putInt(mContext.getContentResolver(),
-                    Settings.Global.EMERGENCY_AFFORDANCE_NEEDED,
-                    mEmergencyAffordanceNeeded ? 1 : 0);
-            if (mEmergencyAffordanceNeeded) {
-                stopScanning();
+        if (Build.IS_DEBUGGABLE) {
+            String overrideIso = Settings.Global.getString(
+                    mContext.getContentResolver(), EMERGENCY_AFFORDANCE_OVERRIDE_ISO);
+            if (!TextUtils.isEmpty(overrideIso)) {
+                if (DBG) Slog.d(TAG, "Override ISO to " + overrideIso);
+                mEmergencyCallCountryIsos.clear();
+                mEmergencyCallCountryIsos.add(overrideIso);
             }
         }
     }
 
-    private void stopScanning() {
-        synchronized (mLock) {
-            mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE);
-            mScansCompleted = 0;
-        }
-    }
-
-    private boolean isEmergencyAffordanceNeeded() {
-        synchronized (mLock) {
-            return mEmergencyAffordanceNeeded;
-        }
-    }
-
     @Override
     public void onStart() {
+        if (DBG) Slog.i(TAG, "onStart");
+        publishBinderService(SERVICE_NAME, new BinderService());
     }
 
     @Override
     public void onBootPhase(int phase) {
         if (phase == PHASE_THIRD_PARTY_APPS_CAN_START) {
-            mTelephonyManager = mContext.getSystemService(TelephonyManager.class);
-            mVoiceCapable = mTelephonyManager.isVoiceCapable();
-            if (!mVoiceCapable) {
-                updateEmergencyAffordanceNeeded();
-                return;
-            }
-            mSubscriptionManager = SubscriptionManager.from(mContext);
-            HandlerThread thread = new HandlerThread(TAG);
-            thread.start();
-            mHandler = new MyHandler(thread.getLooper());
-            mHandler.obtainMessage(INITIALIZE_STATE).sendToTarget();
-            startScanning();
-            IntentFilter filter = new IntentFilter(Intent.ACTION_AIRPLANE_MODE_CHANGED);
-            mContext.registerReceiver(mAirplaneModeReceiver, filter);
-            mSubscriptionManager.addOnSubscriptionsChangedListener(mSubscriptionChangedListener);
+            if (DBG) Slog.i(TAG, "onBootPhase");
+            handleThirdPartyBootPhase();
         }
     }
 
-    private void startScanning() {
-        mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CELL_INFO
-                | PhoneStateListener.LISTEN_CELL_LOCATION);
-    }
-
     /** Handler to do the heavier work on */
     private class MyHandler extends Handler {
-
         public MyHandler(Looper l) {
             super(l);
         }
 
         @Override
         public void handleMessage(Message msg) {
+            if (DBG) Slog.d(TAG, "handleMessage: " + msg.what);
             switch (msg.what) {
                 case INITIALIZE_STATE:
                     handleInitializeState();
                     break;
-                case CELL_INFO_STATE_CHANGED:
-                    handleUpdateCellInfo();
+                case NETWORK_COUNTRY_CHANGED:
+                    final String countryIso = (String) msg.obj;
+                    final int slotId = msg.arg1;
+                    handleNetworkCountryChanged(countryIso, slotId);
                     break;
                 case SUBSCRIPTION_CHANGED:
                     handleUpdateSimSubscriptionInfo();
                     break;
+                case UPDATE_AIRPLANE_MODE_STATUS:
+                    handleUpdateAirplaneModeStatus();
+                    break;
+                default:
+                    Slog.e(TAG, "Unexpected message received: " + msg.what);
             }
         }
     }
 
     private void handleInitializeState() {
-        if (handleUpdateSimSubscriptionInfo()) {
-            return;
-        }
-        if (handleUpdateCellInfo()) {
-            return;
-        }
+        if (DBG) Slog.d(TAG, "handleInitializeState");
+        handleUpdateAirplaneModeStatus();
+        handleUpdateSimSubscriptionInfo();
+        updateNetworkCountry();
         updateEmergencyAffordanceNeeded();
     }
 
-    private boolean handleUpdateSimSubscriptionInfo() {
-        boolean neededBefore = simNeededAffordanceBefore();
-        boolean neededNow = neededBefore;
+    private void handleThirdPartyBootPhase() {
+        if (DBG) Slog.d(TAG, "handleThirdPartyBootPhase");
+        mTelephonyManager = mContext.getSystemService(TelephonyManager.class);
+        mVoiceCapable = mTelephonyManager.isVoiceCapable();
+        if (!mVoiceCapable) {
+            updateEmergencyAffordanceNeeded();
+            return;
+        }
+
+        HandlerThread thread = new HandlerThread(TAG);
+        thread.start();
+        mHandler = new MyHandler(thread.getLooper());
+
+        mSubscriptionManager = SubscriptionManager.from(mContext);
+        mSubscriptionManager.addOnSubscriptionsChangedListener(mSubscriptionChangedListener);
+
+        IntentFilter filter = new IntentFilter(Intent.ACTION_AIRPLANE_MODE_CHANGED);
+        filter.addAction(TelephonyManager.ACTION_NETWORK_COUNTRY_CHANGED);
+        mContext.registerReceiver(mBroadcastReceiver, filter);
+
+        mHandler.obtainMessage(INITIALIZE_STATE).sendToTarget();
+    }
+
+    private void handleUpdateAirplaneModeStatus() {
+        mAirplaneModeEnabled = Settings.Global.getInt(mContext.getContentResolver(),
+                Settings.Global.AIRPLANE_MODE_ON, 0) == 1;
+        if (DBG) Slog.d(TAG, "APM status updated to " + mAirplaneModeEnabled);
+    }
+
+    private void handleUpdateSimSubscriptionInfo() {
         List<SubscriptionInfo> activeSubscriptionInfoList =
                 mSubscriptionManager.getActiveSubscriptionInfoList();
+        if (DBG) Slog.d(TAG, "handleUpdateSimSubscriptionInfo: " + activeSubscriptionInfoList);
         if (activeSubscriptionInfoList == null) {
-            setSimNeedsEmergencyAffordance(neededNow);
-            return neededNow;
+            return;
         }
+
+        boolean needsAffordance = false;
         for (SubscriptionInfo info : activeSubscriptionInfoList) {
-            int mcc = info.getMcc();
-            if (mccRequiresEmergencyAffordance(mcc)) {
-                neededNow = true;
+            if (isoRequiresEmergencyAffordance(info.getCountryIso())) {
+                needsAffordance = true;
                 break;
-            } else if (mcc != 0 && mcc != Integer.MAX_VALUE){
-                // a Sim with a different mcc code was found
-                neededNow = false;
-            }
-            String simOperator = mTelephonyManager
-                    .createForSubscriptionId(info.getSubscriptionId()).getSimOperator();
-            mcc = 0;
-            if (simOperator != null && simOperator.length() >= 3) {
-                mcc = Integer.parseInt(simOperator.substring(0, 3));
-            }
-            if (mcc != 0) {
-                if (mccRequiresEmergencyAffordance(mcc)) {
-                    neededNow = true;
-                    break;
-                } else {
-                    // a Sim with a different mcc code was found
-                    neededNow = false;
-                }
             }
         }
-        setSimNeedsEmergencyAffordance(neededNow);
-        return neededNow;
+
+        mAnySimNeedsEmergencyAffordance = needsAffordance;
+        updateEmergencyAffordanceNeeded();
     }
 
-    private void setSimNeedsEmergencyAffordance(boolean simNeedsEmergencyAffordance) {
-        if (simNeededAffordanceBefore() != simNeedsEmergencyAffordance) {
+    private void handleNetworkCountryChanged(String countryIso, int slotId) {
+        if (DBG) {
+            Slog.d(TAG, "handleNetworkCountryChanged: countryIso=" + countryIso
+                    + ", slotId=" + slotId);
+        }
+
+        if (TextUtils.isEmpty(countryIso) && mAirplaneModeEnabled) {
+            Slog.w(TAG, "Ignore empty countryIso report when APM is on.");
+            return;
+        }
+
+        updateNetworkCountry();
+
+        updateEmergencyAffordanceNeeded();
+    }
+
+    private void updateNetworkCountry() {
+        boolean needsAffordance = false;
+
+        final int activeModems = mTelephonyManager.getActiveModemCount();
+        for (int i = 0; i < activeModems; i++) {
+            String countryIso = mTelephonyManager.getNetworkCountryIso(i);
+            if (DBG) Slog.d(TAG, "UpdateNetworkCountry: slotId=" + i + " countryIso=" + countryIso);
+            if (isoRequiresEmergencyAffordance(countryIso)) {
+                needsAffordance = true;
+                break;
+            }
+        }
+
+        mAnyNetworkNeedsEmergencyAffordance = needsAffordance;
+
+        updateEmergencyAffordanceNeeded();
+    }
+
+    private boolean isoRequiresEmergencyAffordance(String iso) {
+        return mEmergencyCallCountryIsos.contains(iso);
+    }
+
+    private void updateEmergencyAffordanceNeeded() {
+        if (DBG) {
+            Slog.d(TAG, "updateEmergencyAffordanceNeeded: mEmergencyAffordanceNeeded="
+                    + mEmergencyAffordanceNeeded + ", mVoiceCapable=" + mVoiceCapable
+                    + ", mAnySimNeedsEmergencyAffordance=" + mAnySimNeedsEmergencyAffordance
+                    + ", mAnyNetworkNeedsEmergencyAffordance="
+                    + mAnyNetworkNeedsEmergencyAffordance);
+        }
+        boolean lastAffordanceNeeded = mEmergencyAffordanceNeeded;
+
+        mEmergencyAffordanceNeeded = mVoiceCapable
+                && (mAnySimNeedsEmergencyAffordance || mAnyNetworkNeedsEmergencyAffordance);
+
+        if (lastAffordanceNeeded != mEmergencyAffordanceNeeded) {
             Settings.Global.putInt(mContext.getContentResolver(),
-                    EMERGENCY_SIM_INSERTED_SETTING,
-                    simNeedsEmergencyAffordance ? 1 : 0);
-        }
-        if (simNeedsEmergencyAffordance != mSimNeedsEmergencyAffordance) {
-            mSimNeedsEmergencyAffordance = simNeedsEmergencyAffordance;
-            updateEmergencyAffordanceNeeded();
+                    Settings.Global.EMERGENCY_AFFORDANCE_NEEDED,
+                    mEmergencyAffordanceNeeded ? 1 : 0);
         }
     }
 
-    private boolean simNeededAffordanceBefore() {
-        return Settings.Global.getInt(mContext.getContentResolver(),
-                EMERGENCY_SIM_INSERTED_SETTING, 0) != 0;
+    private void dumpInternal(IndentingPrintWriter ipw) {
+        ipw.println("EmergencyAffordanceService (dumpsys emergency_affordance) state:\n");
+        ipw.println("mEmergencyAffordanceNeeded=" + mEmergencyAffordanceNeeded);
+        ipw.println("mVoiceCapable=" + mVoiceCapable);
+        ipw.println("mAnySimNeedsEmergencyAffordance=" + mAnySimNeedsEmergencyAffordance);
+        ipw.println("mAnyNetworkNeedsEmergencyAffordance=" + mAnyNetworkNeedsEmergencyAffordance);
+        ipw.println("mEmergencyCallCountryIsos=" + String.join(",", mEmergencyCallCountryIsos));
     }
 
-    private boolean handleUpdateCellInfo() {
-        List<CellInfo> cellInfos = mTelephonyManager.getAllCellInfo();
-        if (cellInfos == null) {
-            return false;
-        }
-        boolean stopScanningAfterScan = false;
-        for (CellInfo cellInfo : cellInfos) {
-            int mcc = 0;
-            if (cellInfo instanceof CellInfoGsm) {
-                mcc = ((CellInfoGsm) cellInfo).getCellIdentity().getMcc();
-            } else if (cellInfo instanceof CellInfoLte) {
-                mcc = ((CellInfoLte) cellInfo).getCellIdentity().getMcc();
-            } else if (cellInfo instanceof CellInfoWcdma) {
-                mcc = ((CellInfoWcdma) cellInfo).getCellIdentity().getMcc();
+    private final class BinderService extends Binder {
+        @Override
+        protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
+            if (!DumpUtils.checkDumpPermission(mContext, TAG, pw)) {
+                return;
             }
-            if (mccRequiresEmergencyAffordance(mcc)) {
-                setNetworkNeedsEmergencyAffordance(true);
-                return true;
-            } else if (mcc != 0 && mcc != Integer.MAX_VALUE) {
-                // we found an mcc that isn't in the list, abort
-                stopScanningAfterScan = true;
-            }
-        }
-        if (stopScanningAfterScan) {
-            stopScanning();
-        } else {
-            onCellScanFinishedUnsuccessful();
-        }
-        setNetworkNeedsEmergencyAffordance(false);
-        return false;
-    }
 
-    private void setNetworkNeedsEmergencyAffordance(boolean needsAffordance) {
-        synchronized (mLock) {
-            mNetworkNeedsEmergencyAffordance = needsAffordance;
-            updateEmergencyAffordanceNeeded();
+            dumpInternal(new IndentingPrintWriter(pw, "  "));
         }
     }
-
-    private void onCellScanFinishedUnsuccessful() {
-        synchronized (mLock) {
-            mScansCompleted++;
-            if (mScansCompleted >= NUM_SCANS_UNTIL_ABORT) {
-                stopScanning();
-            }
-        }
-    }
-
-    private boolean mccRequiresEmergencyAffordance(int mcc) {
-        return mEmergencyCallMccNumbers.contains(mcc);
-    }
 }
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecMessage.java b/services/core/java/com/android/server/hdmi/HdmiCecMessage.java
index f8b3962..ff7da11 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecMessage.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecMessage.java
@@ -115,8 +115,12 @@
         s.append(String.format("<%s> %X%X:%02X",
                 opcodeToString(mOpcode), mSource, mDestination, mOpcode));
         if (mParams.length > 0) {
-            for (byte data : mParams) {
-                s.append(String.format(":%02X", data));
+            if (filterMessageParameters(mOpcode)) {
+                s.append(String.format(" <Redacted len=%d>", mParams.length));
+            } else {
+                for (byte data : mParams) {
+                    s.append(String.format(":%02X", data));
+                }
             }
         }
         return s.toString();
@@ -270,5 +274,21 @@
                 return String.format("Opcode: %02X", opcode);
         }
     }
+
+    private static boolean filterMessageParameters(int opcode) {
+        switch (opcode) {
+            case Constants.MESSAGE_USER_CONTROL_PRESSED:
+            case Constants.MESSAGE_USER_CONTROL_RELEASED:
+            case Constants.MESSAGE_SET_OSD_NAME:
+            case Constants.MESSAGE_SET_OSD_STRING:
+            case Constants.MESSAGE_VENDOR_COMMAND:
+            case Constants.MESSAGE_VENDOR_REMOTE_BUTTON_DOWN:
+            case Constants.MESSAGE_VENDOR_REMOTE_BUTTON_UP:
+            case Constants.MESSAGE_VENDOR_COMMAND_WITH_ID:
+                return true;
+            default:
+                return false;
+        }
+    }
 }
 
diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
index e6cb371..b949d6b 100644
--- a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
+++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
@@ -784,6 +784,7 @@
         private static final AtomicInteger sSequenceNumber = new AtomicInteger(0);
 
         private static final class Entry {
+            final int mSequenceNumber = sSequenceNumber.getAndIncrement();
             final ClientState mClientState;
             @SoftInputModeFlags
             final int mFocusedWindowSoftInputMode;
@@ -831,7 +832,7 @@
                     continue;
                 }
                 pw.print(prefix);
-                pw.println("SoftInputShowHideHistory #" + sSequenceNumber.getAndIncrement() + ":");
+                pw.println("SoftInputShowHideHistory #" + entry.mSequenceNumber + ":");
 
                 pw.print(prefix);
                 pw.println(" time=" + dataFormat.format(new Date(entry.mWallTime))
diff --git a/services/core/java/com/android/server/integrity/AppIntegrityManagerServiceImpl.java b/services/core/java/com/android/server/integrity/AppIntegrityManagerServiceImpl.java
index 273fd48..393e8db 100644
--- a/services/core/java/com/android/server/integrity/AppIntegrityManagerServiceImpl.java
+++ b/services/core/java/com/android/server/integrity/AppIntegrityManagerServiceImpl.java
@@ -27,6 +27,7 @@
 import static android.content.integrity.IntegrityUtils.getHexDigest;
 import static android.content.pm.PackageManager.EXTRA_VERIFICATION_ID;
 
+import android.annotation.BinderThread;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.content.BroadcastReceiver;
@@ -50,7 +51,6 @@
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.HandlerThread;
-import android.os.RemoteException;
 import android.os.UserHandle;
 import android.provider.Settings;
 import android.util.Slog;
@@ -89,9 +89,9 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.function.Supplier;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
-import java.util.function.Supplier;
 
 /** Implementation of {@link AppIntegrityManagerService}. */
 public class AppIntegrityManagerServiceImpl extends IAppIntegrityManager.Stub {
@@ -117,6 +117,8 @@
     private static final String ALLOWED_INSTALLER_DELIMITER = ",";
     private static final String INSTALLER_PACKAGE_CERT_DELIMITER = "\\|";
 
+    public static final boolean DEBUG_INTEGRITY_COMPONENT = false;
+
     private static final Set<String> PACKAGE_INSTALLER =
             new HashSet<>(
                     Arrays.asList(
@@ -184,9 +186,10 @@
     }
 
     @Override
+    @BinderThread
     public void updateRuleSet(
             String version, ParceledListSlice<Rule> rules, IntentSender statusReceiver) {
-        String ruleProvider = getCallerPackageNameOrThrow();
+        String ruleProvider = getCallerPackageNameOrThrow(Binder.getCallingUid());
 
         mHandler.post(
                 () -> {
@@ -220,8 +223,9 @@
     }
 
     @Override
+    @BinderThread
     public String getCurrentRuleSetVersion() {
-        getCallerPackageNameOrThrow();
+        getCallerPackageNameOrThrow(Binder.getCallingUid());
 
         RuleMetadata ruleMetadata = mIntegrityFileManager.readMetadata();
         return (ruleMetadata != null && ruleMetadata.getVersion() != null)
@@ -230,8 +234,9 @@
     }
 
     @Override
+    @BinderThread
     public String getCurrentRuleSetProvider() {
-        getCallerPackageNameOrThrow();
+        getCallerPackageNameOrThrow(Binder.getCallingUid());
 
         RuleMetadata ruleMetadata = mIntegrityFileManager.readMetadata();
         return (ruleMetadata != null && ruleMetadata.getRuleProvider() != null)
@@ -251,22 +256,26 @@
     }
 
     @Override
-    public List<String> getWhitelistedRuleProviders() throws RemoteException {
-        return getAllowedRuleProviders();
+    public List<String> getWhitelistedRuleProviders() {
+        return getAllowedRuleProviderSystemApps();
     }
 
     private void handleIntegrityVerification(Intent intent) {
         int verificationId = intent.getIntExtra(EXTRA_VERIFICATION_ID, -1);
 
         try {
-            Slog.i(TAG, "Received integrity verification intent " + intent.toString());
-            Slog.i(TAG, "Extras " + intent.getExtras());
+            if (DEBUG_INTEGRITY_COMPONENT) {
+                Slog.d(TAG, "Received integrity verification intent " + intent.toString());
+                Slog.d(TAG, "Extras " + intent.getExtras());
+            }
 
             String installerPackageName = getInstallerPackageName(intent);
 
             // Skip integrity verification if the verifier is doing the install.
             if (!integrityCheckIncludesRuleProvider() && isRuleProvider(installerPackageName)) {
-                Slog.i(TAG, "Verifier doing the install. Skipping integrity check.");
+                if (DEBUG_INTEGRITY_COMPONENT) {
+                    Slog.i(TAG, "Verifier doing the install. Skipping integrity check.");
+                }
                 mPackageManagerInternal.setIntegrityVerificationResult(
                         verificationId, PackageManagerInternal.INTEGRITY_VERIFICATION_ALLOW);
                 return;
@@ -300,19 +309,23 @@
 
             AppInstallMetadata appInstallMetadata = builder.build();
 
-            Slog.i(
-                    TAG,
-                    "To be verified: "
-                            + appInstallMetadata
-                            + " installers "
-                            + getAllowedInstallers(packageInfo));
+            if (DEBUG_INTEGRITY_COMPONENT) {
+                Slog.i(
+                        TAG,
+                        "To be verified: "
+                                + appInstallMetadata
+                                + " installers "
+                                + getAllowedInstallers(packageInfo));
+            }
             IntegrityCheckResult result = mEvaluationEngine.evaluate(appInstallMetadata);
-            Slog.i(
-                    TAG,
-                    "Integrity check result: "
-                            + result.getEffect()
-                            + " due to "
-                            + result.getMatchedRules());
+            if (DEBUG_INTEGRITY_COMPONENT) {
+                Slog.i(
+                        TAG,
+                        "Integrity check result: "
+                                + result.getEffect()
+                                + " due to "
+                                + result.getMatchedRules());
+            }
 
             FrameworkStatsLog.write(
                     FrameworkStatsLog.INTEGRITY_CHECK_RESULT_REPORTED,
@@ -367,23 +380,9 @@
             return UNKNOWN_INSTALLER;
         }
 
-        try {
-            int actualInstallerUid =
-                    mContext.getPackageManager().getPackageUid(installer, /* flags= */ 0);
-            if (actualInstallerUid != installerUid) {
-                // Installer package name can be faked but the installerUid cannot.
-                Slog.e(
-                        TAG,
-                        "Installer "
-                                + installer
-                                + " has UID "
-                                + actualInstallerUid
-                                + " which doesn't match alleged installer UID "
-                                + installerUid);
-                return UNKNOWN_INSTALLER;
-            }
-        } catch (PackageManager.NameNotFoundException e) {
-            Slog.e(TAG, "Installer package " + installer + " not found.");
+        // Verify that the installer UID actually contains the package. Note that comparing UIDs
+        // is not safe since context's uid can change in different settings; e.g. Android Auto.
+        if (!getPackageListForUid(installerUid).contains(installer)) {
             return UNKNOWN_INSTALLER;
         }
 
@@ -398,14 +397,13 @@
                 Slog.e(TAG, "Installer is package installer but originating UID not found.");
                 return UNKNOWN_INSTALLER;
             }
-            String[] installerPackages =
-                    mContext.getPackageManager().getPackagesForUid(originatingUid);
-            if (installerPackages == null || installerPackages.length == 0) {
+            List<String> installerPackages = getPackageListForUid(originatingUid);
+            if (installerPackages.isEmpty()) {
                 Slog.e(TAG, "No package found associated with originating UID " + originatingUid);
                 return UNKNOWN_INSTALLER;
             }
             // In the case of multiple package sharing a UID, we just return the first one.
-            return installerPackages[0];
+            return installerPackages.get(0);
         }
 
         return installer;
@@ -436,7 +434,7 @@
                             .getPackageInfo(installer, PackageManager.GET_SIGNING_CERTIFICATES);
             return getCertificateFingerprint(installerInfo);
         } catch (PackageManager.NameNotFoundException e) {
-            Slog.i(TAG, "Installer package " + installer + " not found.");
+            Slog.w(TAG, "Installer package " + installer + " not found.");
             return Collections.emptyList();
         }
     }
@@ -652,35 +650,71 @@
         return installationPath;
     }
 
-    private String getCallerPackageNameOrThrow() {
-        String callerPackageName = getCallerPackageName();
+    private String getCallerPackageNameOrThrow(int callingUid) {
+        String callerPackageName = getCallingRulePusherPackageName(callingUid);
         if (callerPackageName == null) {
             throw new SecurityException(
-                    "Only system packages specified in config_integrityRuleProviderPackages are"
-                            + " allowed to call this method.");
+                    "Only system packages specified in config_integrityRuleProviderPackages are "
+                            + "allowed to call this method.");
         }
         return callerPackageName;
     }
 
-    private String getCallerPackageName() {
-        final List<String> allowedRuleProviders = getAllowedRuleProviders();
-        for (String packageName : allowedRuleProviders) {
-            try {
-                // At least in tests, getPackageUid gives "NameNotFound" but getPackagesFromUid
-                // give the correct package name.
-                int uid = mContext.getPackageManager().getPackageUid(packageName, 0);
-                if (uid == Binder.getCallingUid()) {
-                    // Caller is allowed in the config.
-                    if (isSystemApp(packageName)) {
-                        return packageName;
-                    }
-                }
-            } catch (PackageManager.NameNotFoundException e) {
-                // Ignore the exception. We don't expect the app to be necessarily installed.
-                Slog.i(TAG, "Rule provider package " + packageName + " not installed.");
+    private String getCallingRulePusherPackageName(int callingUid) {
+        // Obtain the system apps that are whitelisted in config_integrityRuleProviderPackages.
+        List<String> allowedRuleProviders = getAllowedRuleProviderSystemApps();
+        if (DEBUG_INTEGRITY_COMPONENT) {
+            Slog.i(TAG, String.format(
+                    "Rule provider system app list contains: %s", allowedRuleProviders));
+        }
+
+        // Identify the package names in the caller list.
+        List<String> callingPackageNames = getPackageListForUid(callingUid);
+        if (DEBUG_INTEGRITY_COMPONENT) {
+            Slog.i(TAG, String.format("Calling packages are: ", callingPackageNames));
+        }
+
+        // Find the intersection between the allowed and calling packages. Ideally, we will have
+        // at most one package name here. But if we have more, it is fine.
+        List<String> allowedCallingPackages = new ArrayList<>();
+        for (String packageName : callingPackageNames) {
+            if (allowedRuleProviders.contains(packageName)) {
+                allowedCallingPackages.add(packageName);
             }
         }
-        return null;
+        if (DEBUG_INTEGRITY_COMPONENT) {
+            Slog.i(TAG,
+                    String.format("Calling rule pusher packages are: ", allowedCallingPackages));
+        }
+        return allowedCallingPackages.isEmpty() ? null : allowedCallingPackages.get(0);
+    }
+
+    private boolean isRuleProvider(String installerPackageName) {
+        for (String ruleProvider : getAllowedRuleProviderSystemApps()) {
+            if (ruleProvider.matches(installerPackageName)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private List<String> getAllowedRuleProviderSystemApps() {
+        List<String> integrityRuleProviders =
+                Arrays.asList(
+                        mContext.getResources()
+                                .getStringArray(R.array.config_integrityRuleProviderPackages));
+        if (DEBUG_INTEGRITY_COMPONENT) {
+            Slog.i(TAG, String.format("Rule provider list contains: %s", integrityRuleProviders));
+        }
+
+        // Filter out the rule provider packages that are not system apps.
+        List<String> systemAppRuleProviders = new ArrayList<>();
+        for (String ruleProvider: integrityRuleProviders) {
+            if (isSystemApp(ruleProvider)) {
+                systemAppRuleProviders.add(ruleProvider);
+            }
+        }
+        return systemAppRuleProviders;
     }
 
     private boolean isSystemApp(String packageName) {
@@ -694,17 +728,6 @@
         }
     }
 
-    private List<String> getAllowedRuleProviders() {
-        return Arrays.asList(
-                mContext.getResources()
-                        .getStringArray(R.array.config_integrityRuleProviderPackages));
-    }
-
-    private boolean isRuleProvider(String installerPackageName) {
-        return getAllowedRuleProviders().stream()
-                .anyMatch(ruleProvider -> ruleProvider.equals(installerPackageName));
-    }
-
     private boolean integrityCheckIncludesRuleProvider() {
         return Settings.Global.getInt(
                         mContext.getContentResolver(),
@@ -712,4 +735,13 @@
                         0)
                 == 1;
     }
+
+    private List<String> getPackageListForUid(int uid) {
+        try {
+            return Arrays.asList(mContext.getPackageManager().getPackagesForUid(uid));
+        } catch (NullPointerException e) {
+            Slog.w(TAG, String.format("No packages were found for uid: %d", uid));
+            return List.of();
+        }
+    }
 }
diff --git a/services/core/java/com/android/server/location/AppOpsHelper.java b/services/core/java/com/android/server/location/AppOpsHelper.java
index cb64c50..c598fb1 100644
--- a/services/core/java/com/android/server/location/AppOpsHelper.java
+++ b/services/core/java/com/android/server/location/AppOpsHelper.java
@@ -19,8 +19,8 @@
 import static android.app.AppOpsManager.OP_MONITOR_HIGH_POWER_LOCATION;
 import static android.app.AppOpsManager.OP_MONITOR_LOCATION;
 
-import static com.android.server.LocationManagerService.D;
-import static com.android.server.LocationManagerService.TAG;
+import static com.android.server.location.LocationManagerService.D;
+import static com.android.server.location.LocationManagerService.TAG;
 
 import android.annotation.Nullable;
 import android.app.AppOpsManager;
diff --git a/services/core/java/com/android/server/location/GeofenceManager.java b/services/core/java/com/android/server/location/GeofenceManager.java
index 195b059..095cd14 100644
--- a/services/core/java/com/android/server/location/GeofenceManager.java
+++ b/services/core/java/com/android/server/location/GeofenceManager.java
@@ -253,7 +253,7 @@
                 int op = CallerIdentity.asAppOp(identity.permissionLevel);
                 if (op >= 0) {
                     if (mAppOps.noteOpNoThrow(AppOpsManager.OP_FINE_LOCATION, identity.uid,
-                            identity.packageName, identity.featureId, null)
+                            identity.packageName, identity.featureId, identity.listenerId)
                             != AppOpsManager.MODE_ALLOWED) {
                         continue;
                     }
diff --git a/services/core/java/com/android/server/location/LocationManagerService.java b/services/core/java/com/android/server/location/LocationManagerService.java
new file mode 100644
index 0000000..4f8708a
--- /dev/null
+++ b/services/core/java/com/android/server/location/LocationManagerService.java
@@ -0,0 +1,2729 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.location;
+
+import static android.Manifest.permission.ACCESS_FINE_LOCATION;
+import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_AWARE;
+import static android.content.pm.PackageManager.MATCH_SYSTEM_ONLY;
+import static android.content.pm.PackageManager.PERMISSION_GRANTED;
+import static android.location.LocationManager.FUSED_PROVIDER;
+import static android.location.LocationManager.GPS_PROVIDER;
+import static android.location.LocationManager.NETWORK_PROVIDER;
+import static android.location.LocationManager.PASSIVE_PROVIDER;
+import static android.os.PowerManager.locationPowerSaveModeToString;
+
+import static com.android.server.location.CallerIdentity.PERMISSION_COARSE;
+import static com.android.server.location.CallerIdentity.PERMISSION_FINE;
+
+import static java.util.concurrent.TimeUnit.NANOSECONDS;
+
+import android.Manifest;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.UserIdInt;
+import android.app.ActivityManager;
+import android.app.AppOpsManager;
+import android.app.PendingIntent;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.location.Address;
+import android.location.Criteria;
+import android.location.GeocoderParams;
+import android.location.Geofence;
+import android.location.GnssCapabilities;
+import android.location.GnssMeasurementCorrections;
+import android.location.GnssRequest;
+import android.location.IBatchedLocationCallback;
+import android.location.IGnssAntennaInfoListener;
+import android.location.IGnssMeasurementsListener;
+import android.location.IGnssNavigationMessageListener;
+import android.location.IGnssStatusListener;
+import android.location.IGpsGeofenceHardware;
+import android.location.ILocationListener;
+import android.location.ILocationManager;
+import android.location.Location;
+import android.location.LocationManager;
+import android.location.LocationManagerInternal;
+import android.location.LocationProvider;
+import android.location.LocationRequest;
+import android.location.LocationTime;
+import android.os.Binder;
+import android.os.Bundle;
+import android.os.CancellationSignal;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.ICancellationSignal;
+import android.os.PowerManager;
+import android.os.PowerManager.ServiceType;
+import android.os.PowerManagerInternal;
+import android.os.Process;
+import android.os.RemoteException;
+import android.os.SystemClock;
+import android.os.UserHandle;
+import android.os.WorkSource;
+import android.os.WorkSource.WorkChain;
+import android.stats.location.LocationStatsEnums;
+import android.text.TextUtils;
+import android.util.EventLog;
+import android.util.Log;
+import android.util.SparseArray;
+import android.util.TimeUtils;
+
+import com.android.internal.annotations.GuardedBy;
+import com.android.internal.content.PackageMonitor;
+import com.android.internal.location.ProviderProperties;
+import com.android.internal.location.ProviderRequest;
+import com.android.internal.util.DumpUtils;
+import com.android.internal.util.IndentingPrintWriter;
+import com.android.internal.util.Preconditions;
+import com.android.server.FgThread;
+import com.android.server.LocalServices;
+import com.android.server.PendingIntentUtils;
+import com.android.server.SystemService;
+import com.android.server.location.AbstractLocationProvider.State;
+import com.android.server.location.CallerIdentity.PermissionLevel;
+import com.android.server.location.LocationRequestStatistics.PackageProviderKey;
+import com.android.server.location.LocationRequestStatistics.PackageStatistics;
+import com.android.server.location.UserInfoHelper.UserListener;
+import com.android.server.location.gnss.GnssManagerService;
+import com.android.server.pm.permission.PermissionManagerServiceInternal;
+
+import java.io.ByteArrayOutputStream;
+import java.io.FileDescriptor;
+import java.io.PrintStream;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Objects;
+import java.util.Set;
+import java.util.TreeMap;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+/**
+ * The service class that manages LocationProviders and issues location
+ * updates and alerts.
+ */
+public class LocationManagerService extends ILocationManager.Stub {
+
+    /**
+     * Controls lifecycle of LocationManagerService.
+     */
+    public static class Lifecycle extends SystemService {
+
+        private final LocationManagerService mService;
+
+        public Lifecycle(Context context) {
+            super(context);
+            mService = new LocationManagerService(context);
+        }
+
+        @Override
+        public void onStart() {
+            // enable client caches by doing the first invalidate
+            LocationManager.invalidateLocalLocationEnabledCaches();
+
+            publishBinderService(Context.LOCATION_SERVICE, mService);
+            // disable caching for whatever process contains LocationManagerService
+            ((LocationManager) mService.mContext.getSystemService(LocationManager.class))
+                    .disableLocalLocationEnabledCaches();
+        }
+
+        @Override
+        public void onBootPhase(int phase) {
+            if (phase == PHASE_SYSTEM_SERVICES_READY) {
+                // the location service must be functioning after this boot phase
+                mService.onSystemReady();
+            } else if (phase == PHASE_THIRD_PARTY_APPS_CAN_START) {
+                // some providers rely on third party code, so we wait to initialize
+                // providers until third party code is allowed to run
+                mService.onSystemThirdPartyAppsCanStart();
+            }
+        }
+    }
+
+    public static final String TAG = "LocationManagerService";
+    public static final boolean D = Log.isLoggable(TAG, Log.DEBUG);
+
+    private static final String WAKELOCK_KEY = "*location*";
+
+    private static final String NETWORK_LOCATION_SERVICE_ACTION =
+            "com.android.location.service.v3.NetworkLocationProvider";
+    private static final String FUSED_LOCATION_SERVICE_ACTION =
+            "com.android.location.service.FusedLocationProvider";
+
+    // The maximum interval a location request can have and still be considered "high power".
+    private static final long HIGH_POWER_INTERVAL_MS = 5 * 60 * 1000;
+
+    // The fastest interval that applications can receive coarse locations
+    private static final long FASTEST_COARSE_INTERVAL_MS = 10 * 60 * 1000;
+
+    // maximum age of a location before it is no longer considered "current"
+    private static final long MAX_CURRENT_LOCATION_AGE_MS = 10 * 1000;
+
+    // Location Providers may sometimes deliver location updates
+    // slightly faster that requested - provide grace period so
+    // we don't unnecessarily filter events that are otherwise on
+    // time
+    private static final int MAX_PROVIDER_SCHEDULING_JITTER_MS = 100;
+
+    private static final String ATTRIBUTION_TAG = "LocationService";
+
+    private static final LocationRequest DEFAULT_LOCATION_REQUEST = new LocationRequest();
+
+    private final Object mLock = new Object();
+    private final Context mContext;
+    private final Handler mHandler;
+    private final LocalService mLocalService;
+    private final AppOpsHelper mAppOpsHelper;
+    private final UserInfoHelper mUserInfoHelper;
+    private final SettingsHelper mSettingsHelper;
+    private final AppForegroundHelper mAppForegroundHelper;
+    private final LocationUsageLogger mLocationUsageLogger;
+
+    @Nullable private GnssManagerService mGnssManagerService = null;
+
+    private final PassiveLocationProviderManager mPassiveManager;
+
+    private PowerManager mPowerManager;
+
+    private GeofenceManager mGeofenceManager;
+    private GeocoderProxy mGeocodeProvider;
+
+    @GuardedBy("mLock")
+    private String mExtraLocationControllerPackage;
+    @GuardedBy("mLock")
+    private boolean mExtraLocationControllerPackageEnabled;
+
+    // @GuardedBy("mLock")
+    // hold lock for write or to prevent write, no lock for read
+    private final CopyOnWriteArrayList<LocationProviderManager> mProviderManagers =
+            new CopyOnWriteArrayList<>();
+
+    @GuardedBy("mLock")
+    private final HashMap<Object, Receiver> mReceivers = new HashMap<>();
+    private final HashMap<String, ArrayList<UpdateRecord>> mRecordsByProvider =
+            new HashMap<>();
+
+    private final LocationRequestStatistics mRequestStatistics = new LocationRequestStatistics();
+
+    @GuardedBy("mLock")
+    @PowerManager.LocationPowerSaveMode
+    private int mBatterySaverMode;
+
+    private LocationManagerService(Context context) {
+        mContext = context.createAttributionContext(ATTRIBUTION_TAG);
+        mHandler = FgThread.getHandler();
+        mLocalService = new LocalService();
+
+        LocalServices.addService(LocationManagerInternal.class, mLocalService);
+
+        mAppOpsHelper = new AppOpsHelper(mContext);
+        mUserInfoHelper = new UserInfoHelper(mContext);
+        mSettingsHelper = new SettingsHelper(mContext, mHandler);
+        mAppForegroundHelper = new AppForegroundHelper(mContext);
+        mLocationUsageLogger = new LocationUsageLogger();
+
+        // set up passive provider - we do this early because it has no dependencies on system
+        // services or external code that isn't ready yet, and because this allows the variable to
+        // be final. other more complex providers are initialized later, when system services are
+        // ready
+        mPassiveManager = new PassiveLocationProviderManager();
+        mProviderManagers.add(mPassiveManager);
+        mPassiveManager.setRealProvider(new PassiveProvider(mContext));
+
+        // Let the package manager query which are the default location
+        // providers as they get certain permissions granted by default.
+        PermissionManagerServiceInternal permissionManagerInternal = LocalServices.getService(
+                PermissionManagerServiceInternal.class);
+        permissionManagerInternal.setLocationPackagesProvider(
+                userId -> mContext.getResources().getStringArray(
+                        com.android.internal.R.array.config_locationProviderPackageNames));
+        permissionManagerInternal.setLocationExtraPackagesProvider(
+                userId -> mContext.getResources().getStringArray(
+                        com.android.internal.R.array.config_locationExtraPackageNames));
+
+        // most startup is deferred until systemReady()
+    }
+
+    private void onSystemReady() {
+        mAppOpsHelper.onSystemReady();
+        mUserInfoHelper.onSystemReady();
+        mSettingsHelper.onSystemReady();
+        mAppForegroundHelper.onSystemReady();
+
+        synchronized (mLock) {
+            mPowerManager = mContext.getSystemService(PowerManager.class);
+            mGeofenceManager = new GeofenceManager(mContext, mSettingsHelper);
+
+            // add listeners
+            mContext.getPackageManager().addOnPermissionsChangeListener(
+                    uid -> {
+                        // listener invoked on ui thread, move to our thread to reduce risk of
+                        // blocking ui thread
+                        mHandler.post(() -> {
+                            synchronized (mLock) {
+                                onPermissionsChangedLocked();
+                            }
+                        });
+                    });
+
+            LocalServices.getService(PowerManagerInternal.class).registerLowPowerModeObserver(
+                    ServiceType.LOCATION,
+                    state -> {
+                        // listener invoked on ui thread, move to our thread to reduce risk of
+                        // blocking ui thread
+                        mHandler.post(() -> {
+                            synchronized (mLock) {
+                                onBatterySaverModeChangedLocked(state.locationMode);
+                            }
+                        });
+                    });
+            mBatterySaverMode = mPowerManager.getLocationPowerSaveMode();
+
+            mAppOpsHelper.addListener(this::onAppOpChanged);
+
+            mSettingsHelper.addOnLocationEnabledChangedListener(this::onLocationModeChanged);
+            mSettingsHelper.addOnBackgroundThrottleIntervalChangedListener(
+                    this::onBackgroundThrottleIntervalChanged);
+            mSettingsHelper.addOnBackgroundThrottlePackageWhitelistChangedListener(
+                    this::onBackgroundThrottleWhitelistChanged);
+            mSettingsHelper.addOnIgnoreSettingsPackageWhitelistChangedListener(
+                    this::onIgnoreSettingsWhitelistChanged);
+
+            PackageMonitor packageMonitor = new PackageMonitor() {
+                @Override
+                public void onPackageDisappeared(String packageName, int reason) {
+                    synchronized (mLock) {
+                        LocationManagerService.this.onPackageDisappeared(packageName);
+                    }
+                }
+            };
+            packageMonitor.register(mContext, null, true, mHandler);
+
+            mUserInfoHelper.addListener(this::onUserChanged);
+
+            mAppForegroundHelper.addListener(this::onAppForegroundChanged);
+
+            IntentFilter screenIntentFilter = new IntentFilter();
+            screenIntentFilter.addAction(Intent.ACTION_SCREEN_OFF);
+            screenIntentFilter.addAction(Intent.ACTION_SCREEN_ON);
+            mContext.registerReceiverAsUser(new BroadcastReceiver() {
+                @Override
+                public void onReceive(Context context, Intent intent) {
+                    if (Intent.ACTION_SCREEN_ON.equals(intent.getAction())
+                            || Intent.ACTION_SCREEN_OFF.equals(intent.getAction())) {
+                        onScreenStateChanged();
+                    }
+                }
+            }, UserHandle.ALL, screenIntentFilter, null, mHandler);
+
+            // initialize the current users. we would get the user started notifications for these
+            // users eventually anyways, but this takes care of it as early as possible.
+            for (int userId: mUserInfoHelper.getCurrentUserIds()) {
+                onUserChanged(userId, UserListener.USER_STARTED);
+            }
+        }
+    }
+
+    private void onSystemThirdPartyAppsCanStart() {
+        synchronized (mLock) {
+            // prepare providers
+            initializeProvidersLocked();
+        }
+    }
+
+    private void onAppOpChanged(String packageName) {
+        synchronized (mLock) {
+            for (Receiver receiver : mReceivers.values()) {
+                if (receiver.mCallerIdentity.packageName.equals(packageName)) {
+                    receiver.updateMonitoring(true);
+                }
+            }
+
+            HashSet<String> affectedProviders = new HashSet<>(mRecordsByProvider.size());
+            for (Entry<String, ArrayList<UpdateRecord>> entry : mRecordsByProvider.entrySet()) {
+                String provider = entry.getKey();
+                for (UpdateRecord record : entry.getValue()) {
+                    if (record.mReceiver.mCallerIdentity.packageName.equals(packageName)) {
+                        affectedProviders.add(provider);
+                    }
+                }
+            }
+            for (String provider : affectedProviders) {
+                applyRequirementsLocked(provider);
+            }
+        }
+    }
+
+    @GuardedBy("mLock")
+    private void onPermissionsChangedLocked() {
+        for (LocationProviderManager manager : mProviderManagers) {
+            applyRequirementsLocked(manager);
+        }
+    }
+
+    @GuardedBy("mLock")
+    private void onBatterySaverModeChangedLocked(int newLocationMode) {
+        if (mBatterySaverMode == newLocationMode) {
+            return;
+        }
+
+        if (D) {
+            Log.d(TAG,
+                    "Battery Saver location mode changed from "
+                            + locationPowerSaveModeToString(mBatterySaverMode) + " to "
+                            + locationPowerSaveModeToString(newLocationMode));
+        }
+
+        mBatterySaverMode = newLocationMode;
+
+        for (LocationProviderManager manager : mProviderManagers) {
+            applyRequirementsLocked(manager);
+        }
+    }
+
+    private void onScreenStateChanged() {
+        synchronized (mLock) {
+            if (mBatterySaverMode == PowerManager.LOCATION_MODE_THROTTLE_REQUESTS_WHEN_SCREEN_OFF) {
+                for (LocationProviderManager manager : mProviderManagers) {
+                    applyRequirementsLocked(manager);
+                }
+            }
+        }
+    }
+
+    private void onLocationModeChanged(int userId) {
+        boolean enabled = mSettingsHelper.isLocationEnabled(userId);
+        LocationManager.invalidateLocalLocationEnabledCaches();
+
+        if (D) {
+            Log.d(TAG, "[u" + userId + "] location enabled = " + enabled);
+        }
+
+        Intent intent = new Intent(LocationManager.MODE_CHANGED_ACTION)
+                .putExtra(LocationManager.EXTRA_LOCATION_ENABLED, enabled)
+                .addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY)
+                .addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
+        mContext.sendBroadcastAsUser(intent, UserHandle.of(userId));
+
+        synchronized (mLock) {
+            for (LocationProviderManager manager : mProviderManagers) {
+                manager.onEnabledChangedLocked(userId);
+            }
+        }
+    }
+
+    private void onPackageDisappeared(String packageName) {
+        synchronized (mLock) {
+            ArrayList<Receiver> deadReceivers = null;
+
+            for (Receiver receiver : mReceivers.values()) {
+                if (receiver.mCallerIdentity.packageName.equals(packageName)) {
+                    if (deadReceivers == null) {
+                        deadReceivers = new ArrayList<>();
+                    }
+                    deadReceivers.add(receiver);
+                }
+            }
+
+            // perform removal outside of mReceivers loop
+            if (deadReceivers != null) {
+                for (Receiver receiver : deadReceivers) {
+                    removeUpdatesLocked(receiver);
+                }
+            }
+        }
+    }
+
+    private void onAppForegroundChanged(int uid, boolean foreground) {
+        synchronized (mLock) {
+            HashSet<String> affectedProviders = new HashSet<>(mRecordsByProvider.size());
+            for (Entry<String, ArrayList<UpdateRecord>> entry : mRecordsByProvider.entrySet()) {
+                String provider = entry.getKey();
+                for (UpdateRecord record : entry.getValue()) {
+                    if (record.mReceiver.mCallerIdentity.uid == uid
+                            && record.mIsForegroundUid != foreground) {
+                        record.updateForeground(foreground);
+
+                        if (!isThrottlingExempt(record.mReceiver.mCallerIdentity)) {
+                            affectedProviders.add(provider);
+                        }
+                    }
+                }
+            }
+            for (String provider : affectedProviders) {
+                applyRequirementsLocked(provider);
+            }
+        }
+    }
+
+    private void onBackgroundThrottleIntervalChanged() {
+        synchronized (mLock) {
+            for (LocationProviderManager manager : mProviderManagers) {
+                applyRequirementsLocked(manager);
+            }
+        }
+    }
+
+    private void onBackgroundThrottleWhitelistChanged() {
+        synchronized (mLock) {
+            for (LocationProviderManager manager : mProviderManagers) {
+                applyRequirementsLocked(manager);
+            }
+        }
+    }
+
+    private void onIgnoreSettingsWhitelistChanged() {
+        synchronized (mLock) {
+            for (LocationProviderManager manager : mProviderManagers) {
+                applyRequirementsLocked(manager);
+            }
+        }
+    }
+
+    @GuardedBy("mLock")
+    private void initializeProvidersLocked() {
+        LocationProviderProxy networkProvider = LocationProviderProxy.createAndRegister(
+                mContext,
+                NETWORK_LOCATION_SERVICE_ACTION,
+                com.android.internal.R.bool.config_enableNetworkLocationOverlay,
+                com.android.internal.R.string.config_networkLocationProviderPackageName);
+        if (networkProvider != null) {
+            LocationProviderManager networkManager = new LocationProviderManager(NETWORK_PROVIDER);
+            mProviderManagers.add(networkManager);
+            networkManager.setRealProvider(networkProvider);
+        } else {
+            Log.w(TAG, "no network location provider found");
+        }
+
+        // ensure that a fused provider exists which will work in direct boot
+        Preconditions.checkState(!mContext.getPackageManager().queryIntentServicesAsUser(
+                new Intent(FUSED_LOCATION_SERVICE_ACTION),
+                MATCH_DIRECT_BOOT_AWARE | MATCH_SYSTEM_ONLY, UserHandle.USER_SYSTEM).isEmpty(),
+                "Unable to find a direct boot aware fused location provider");
+
+        // bind to fused provider
+        LocationProviderProxy fusedProvider = LocationProviderProxy.createAndRegister(
+                mContext,
+                FUSED_LOCATION_SERVICE_ACTION,
+                com.android.internal.R.bool.config_enableFusedLocationOverlay,
+                com.android.internal.R.string.config_fusedLocationProviderPackageName);
+        if (fusedProvider != null) {
+            LocationProviderManager fusedManager = new LocationProviderManager(FUSED_PROVIDER);
+            mProviderManagers.add(fusedManager);
+            fusedManager.setRealProvider(fusedProvider);
+        } else {
+            Log.e(TAG, "no fused location provider found");
+        }
+
+        // bind to geocoder provider
+        mGeocodeProvider = GeocoderProxy.createAndRegister(mContext);
+        if (mGeocodeProvider == null) {
+            Log.e(TAG, "no geocoder provider found");
+        }
+
+        // bind to hardware activity recognition
+        HardwareActivityRecognitionProxy hardwareActivityRecognitionProxy =
+                HardwareActivityRecognitionProxy.createAndRegister(mContext);
+        if (hardwareActivityRecognitionProxy == null) {
+            Log.e(TAG, "unable to bind ActivityRecognitionProxy");
+        }
+
+        String[] testProviderStrings = mContext.getResources().getStringArray(
+                com.android.internal.R.array.config_testLocationProviders);
+        for (String testProviderString : testProviderStrings) {
+            String[] fragments = testProviderString.split(",");
+            String name = fragments[0].trim();
+            ProviderProperties properties = new ProviderProperties(
+                    Boolean.parseBoolean(fragments[1]) /* requiresNetwork */,
+                    Boolean.parseBoolean(fragments[2]) /* requiresSatellite */,
+                    Boolean.parseBoolean(fragments[3]) /* requiresCell */,
+                    Boolean.parseBoolean(fragments[4]) /* hasMonetaryCost */,
+                    Boolean.parseBoolean(fragments[5]) /* supportsAltitude */,
+                    Boolean.parseBoolean(fragments[6]) /* supportsSpeed */,
+                    Boolean.parseBoolean(fragments[7]) /* supportsBearing */,
+                    Integer.parseInt(fragments[8]) /* powerRequirement */,
+                    Integer.parseInt(fragments[9]) /* accuracy */);
+            LocationProviderManager manager = getLocationProviderManager(name);
+            if (manager == null) {
+                manager = new LocationProviderManager(name);
+                mProviderManagers.add(manager);
+            }
+            manager.setMockProvider(new MockProvider(properties));
+        }
+
+        // initialize gnss last because it has no awareness of boot phases and blindly assumes that
+        // all other location providers are loaded at initialization
+        if (GnssManagerService.isGnssSupported()) {
+            mGnssManagerService = new GnssManagerService(mContext, mAppOpsHelper, mSettingsHelper,
+                    mAppForegroundHelper, mLocationUsageLogger);
+            mGnssManagerService.onSystemReady();
+
+            LocationProviderManager gnssManager = new LocationProviderManager(GPS_PROVIDER);
+            mProviderManagers.add(gnssManager);
+            gnssManager.setRealProvider(mGnssManagerService.getGnssLocationProvider());
+
+            // bind to geofence proxy
+            IGpsGeofenceHardware gpsGeofenceHardware = mGnssManagerService.getGpsGeofenceProxy();
+            if (gpsGeofenceHardware != null) {
+                GeofenceProxy provider = GeofenceProxy.createAndBind(mContext, gpsGeofenceHardware);
+                if (provider == null) {
+                    Log.e(TAG, "unable to bind to GeofenceProxy");
+                }
+            }
+        }
+    }
+
+    private void onUserChanged(@UserIdInt int userId, @UserListener.UserChange int change) {
+        switch (change) {
+            case UserListener.USER_SWITCHED:
+                if (D) {
+                    Log.d(TAG, "user " + userId + " current status changed");
+                }
+                synchronized (mLock) {
+                    for (LocationProviderManager manager : mProviderManagers) {
+                        manager.onEnabledChangedLocked(userId);
+                    }
+                }
+                break;
+            case UserListener.USER_STARTED:
+                if (D) {
+                    Log.d(TAG, "user " + userId + " started");
+                }
+                synchronized (mLock) {
+                    for (LocationProviderManager manager : mProviderManagers) {
+                        manager.onUserStarted(userId);
+                    }
+                }
+                break;
+            case UserListener.USER_STOPPED:
+                if (D) {
+                    Log.d(TAG, "user " + userId + " stopped");
+                }
+                synchronized (mLock) {
+                    for (LocationProviderManager manager : mProviderManagers) {
+                        manager.onUserStopped(userId);
+                    }
+                }
+                break;
+        }
+    }
+
+    /**
+     * Location provider manager, manages a LocationProvider.
+     */
+    class LocationProviderManager implements MockableLocationProvider.Listener {
+
+        private final String mName;
+
+        private final LocationFudger mLocationFudger;
+
+        // if the provider is enabled for a given user id - null or not present means unknown
+        @GuardedBy("mLock")
+        private final SparseArray<Boolean> mEnabled;
+
+        // last location for a given user
+        @GuardedBy("mLock")
+        private final SparseArray<Location> mLastLocation;
+
+        // last coarse location for a given user
+        @GuardedBy("mLock")
+        private final SparseArray<Location> mLastCoarseLocation;
+
+        // acquiring mLock makes operations on mProvider atomic, but is otherwise unnecessary
+        protected final MockableLocationProvider mProvider;
+
+        private LocationProviderManager(String name) {
+            mName = name;
+            mLocationFudger = new LocationFudger(mSettingsHelper.getCoarseLocationAccuracyM());
+            mEnabled = new SparseArray<>(2);
+            mLastLocation = new SparseArray<>(2);
+            mLastCoarseLocation = new SparseArray<>(2);
+
+            // initialize last since this lets our reference escape
+            mProvider = new MockableLocationProvider(mLock, this);
+        }
+
+        public String getName() {
+            return mName;
+        }
+
+        public boolean hasProvider() {
+            return mProvider.getProvider() != null;
+        }
+
+        public void setRealProvider(AbstractLocationProvider provider) {
+            mProvider.setRealProvider(provider);
+        }
+
+        public void setMockProvider(@Nullable MockProvider provider) {
+            synchronized (mLock) {
+                mProvider.setMockProvider(provider);
+
+                // when removing a mock provider, also clear any mock last locations and reset the
+                // location fudger. the mock provider could have been used to infer the current
+                // location fudger offsets.
+                if (provider == null) {
+                    for (int i = 0; i < mLastLocation.size(); i++) {
+                        Location lastLocation = mLastLocation.valueAt(i);
+                        if (lastLocation != null && lastLocation.isFromMockProvider()) {
+                            mLastLocation.setValueAt(i, null);
+                        }
+                    }
+
+                    for (int i = 0; i < mLastCoarseLocation.size(); i++) {
+                        Location lastCoarseLocation = mLastCoarseLocation.valueAt(i);
+                        if (lastCoarseLocation != null && lastCoarseLocation.isFromMockProvider()) {
+                            mLastCoarseLocation.setValueAt(i, null);
+                        }
+                    }
+
+                    mLocationFudger.resetOffsets();
+                }
+            }
+        }
+
+        public Set<String> getPackages() {
+            return mProvider.getState().providerPackageNames;
+        }
+
+        @Nullable
+        public ProviderProperties getProperties() {
+            return mProvider.getState().properties;
+        }
+
+        @Nullable
+        public Location getLastLocation(int userId, @PermissionLevel int permissionlevel) {
+            synchronized (mLock) {
+                switch (permissionlevel) {
+                    case PERMISSION_COARSE:
+                        return mLastCoarseLocation.get(userId);
+                    case PERMISSION_FINE:
+                        return mLastLocation.get(userId);
+                    default:
+                        throw new AssertionError();
+                }
+            }
+        }
+
+        public void injectLastLocation(Location location, int userId) {
+            synchronized (mLock) {
+                if (mLastLocation.get(userId) == null) {
+                    setLastLocation(location, userId);
+                }
+            }
+        }
+
+        private void setLastLocation(Location location, int userId) {
+            synchronized (mLock) {
+                mLastLocation.put(userId, location);
+
+                // update last coarse interval only if enough time has passed
+                long timeDeltaMs = Long.MAX_VALUE;
+                Location coarseLocation = mLastCoarseLocation.get(userId);
+                if (coarseLocation != null) {
+                    timeDeltaMs = NANOSECONDS.toMillis(location.getElapsedRealtimeNanos())
+                            - NANOSECONDS.toMillis(coarseLocation.getElapsedRealtimeNanos());
+                }
+                if (timeDeltaMs > FASTEST_COARSE_INTERVAL_MS) {
+                    mLastCoarseLocation.put(userId, mLocationFudger.createCoarse(location));
+                }
+            }
+        }
+
+        public void setMockProviderAllowed(boolean enabled) {
+            synchronized (mLock) {
+                if (!mProvider.isMock()) {
+                    throw new IllegalArgumentException(mName + " provider is not a test provider");
+                }
+
+                mProvider.setMockProviderAllowed(enabled);
+            }
+        }
+
+        public void setMockProviderLocation(Location location) {
+            synchronized (mLock) {
+                if (!mProvider.isMock()) {
+                    throw new IllegalArgumentException(mName + " provider is not a test provider");
+                }
+
+                String locationProvider = location.getProvider();
+                if (!TextUtils.isEmpty(locationProvider) && !mName.equals(locationProvider)) {
+                    // The location has an explicit provider that is different from the mock
+                    // provider name. The caller may be trying to fool us via b/33091107.
+                    EventLog.writeEvent(0x534e4554, "33091107", Binder.getCallingUid(),
+                            mName + "!=" + locationProvider);
+                }
+
+                mProvider.setMockProviderLocation(location);
+            }
+        }
+
+        public List<LocationRequest> getMockProviderRequests() {
+            synchronized (mLock) {
+                if (!mProvider.isMock()) {
+                    throw new IllegalArgumentException(mName + " provider is not a test provider");
+                }
+
+                return mProvider.getCurrentRequest().locationRequests;
+            }
+        }
+
+        public void setRequest(ProviderRequest request) {
+            mProvider.setRequest(request);
+        }
+
+        public void sendExtraCommand(int uid, int pid, String command, Bundle extras) {
+            mProvider.sendExtraCommand(uid, pid, command, extras);
+        }
+
+        @GuardedBy("mLock")
+        @Override
+        public void onReportLocation(Location location) {
+            // don't validate mock locations
+            if (!location.isFromMockProvider()) {
+                if (location.getLatitude() == 0 && location.getLongitude() == 0) {
+                    Log.w(TAG, "blocking 0,0 location from " + mName + " provider");
+                    return;
+                }
+            }
+
+            if (!location.isComplete()) {
+                Log.w(TAG, "blocking incomplete location from " + mName + " provider");
+                return;
+            }
+
+            // update last location if the provider is enabled or if servicing a bypass request
+            boolean locationSettingsIgnored = mProvider.getCurrentRequest().locationSettingsIgnored;
+            for (int userId : mUserInfoHelper.getCurrentUserIds()) {
+                if (locationSettingsIgnored || isEnabled(userId)) {
+                    setLastLocation(location, userId);
+                }
+            }
+
+            handleLocationChangedLocked(this, location, mLocationFudger.createCoarse(location));
+        }
+
+        @GuardedBy("mLock")
+        @Override
+        public void onReportLocation(List<Location> locations) {
+            if (mGnssManagerService == null || !GPS_PROVIDER.equals(mName)) {
+                return;
+            }
+
+            mGnssManagerService.onReportLocation(locations);
+        }
+
+        @GuardedBy("mLock")
+        @Override
+        public void onStateChanged(State oldState, State newState) {
+            if (oldState.allowed != newState.allowed) {
+                onEnabledChangedLocked(UserHandle.USER_ALL);
+            }
+        }
+
+        public void onUserStarted(int userId) {
+            synchronized (mLock) {
+                // clear the user's enabled state in order to force a reevalution of whether the
+                // provider is enabled or disabled for the given user. we clear the user's state
+                // first to ensure that a user starting never causes any change notifications. it's
+                // possible for us to observe a user before we observe it's been started (for
+                // example, another component gets a user started notification before us and
+                // registers a location request immediately), which would cause us to already have
+                // some state in place. when we eventually do get the user started notification
+                // ourselves we don't want to send a change notification based on the prior state
+                mEnabled.put(userId, null);
+                onEnabledChangedLocked(userId);
+            }
+        }
+
+        public void onUserStopped(int userId) {
+            synchronized (mLock) {
+                mEnabled.remove(userId);
+                mLastLocation.remove(userId);
+                mLastCoarseLocation.remove(userId);
+            }
+        }
+
+        public boolean isEnabled(int userId) {
+            if (userId == UserHandle.USER_NULL) {
+                // used during initialization - ignore since many lower level operations (checking
+                // settings for instance) do not support the null user
+                return false;
+            }
+
+            synchronized (mLock) {
+                Boolean enabled = mEnabled.get(userId);
+                if (enabled == null) {
+                    // this generally shouldn't occur, but might be possible due to race conditions
+                    // on when we are notified of new users
+                    Log.w(TAG, mName + " provider saw user " + userId + " unexpectedly");
+                    onEnabledChangedLocked(userId);
+                    enabled = Objects.requireNonNull(mEnabled.get(userId));
+                }
+
+                return enabled;
+            }
+        }
+
+        @GuardedBy("mLock")
+        public void onEnabledChangedLocked(int userId) {
+            if (userId == UserHandle.USER_NULL) {
+                // used during initialization - ignore since many lower level operations (checking
+                // settings for instance) do not support the null user
+                return;
+            } else if (userId == UserHandle.USER_ALL) {
+                // we know enabled changes can only happen for current users since providers are
+                // always disabled for all non-current users
+                for (int currentUserId : mUserInfoHelper.getCurrentUserIds()) {
+                    onEnabledChangedLocked(currentUserId);
+                }
+                return;
+            }
+
+            // if any property that contributes to "enabled" here changes state, it MUST result
+            // in a direct or indrect call to onEnabledChangedLocked. this allows the provider to
+            // guarantee that it will always eventually reach the correct state.
+            boolean enabled = mProvider.getState().allowed
+                    && mUserInfoHelper.isCurrentUserId(userId)
+                    && mSettingsHelper.isLocationEnabled(userId);
+
+            Boolean wasEnabled = mEnabled.get(userId);
+            if (wasEnabled != null && wasEnabled == enabled) {
+                return;
+            }
+
+            mEnabled.put(userId, enabled);
+
+            if (D) {
+                Log.d(TAG, "[u" + userId + "] " + mName + " provider enabled = " + enabled);
+            }
+
+            // clear last locations if we become disabled and if not servicing a bypass request
+            if (!enabled && !mProvider.getCurrentRequest().locationSettingsIgnored) {
+                mLastLocation.put(userId, null);
+                mLastCoarseLocation.put(userId, null);
+            }
+
+            // update LOCATION_PROVIDERS_ALLOWED for best effort backwards compatibility
+            mSettingsHelper.setLocationProviderAllowed(mName, enabled, userId);
+
+            // do not send change notifications if we just saw this user for the first time
+            if (wasEnabled != null) {
+                // fused and passive provider never get public updates for legacy reasons
+                if (!FUSED_PROVIDER.equals(mName) && !PASSIVE_PROVIDER.equals(mName)) {
+                    Intent intent = new Intent(LocationManager.PROVIDERS_CHANGED_ACTION)
+                            .putExtra(LocationManager.EXTRA_PROVIDER_NAME, mName)
+                            .putExtra(LocationManager.EXTRA_PROVIDER_ENABLED, enabled)
+                            .addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY)
+                            .addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
+                    mContext.sendBroadcastAsUser(intent, UserHandle.of(userId));
+                }
+            }
+
+            updateProviderEnabledLocked(this, enabled);
+        }
+
+        public void dump(FileDescriptor fd, IndentingPrintWriter pw, String[] args) {
+            synchronized (mLock) {
+                pw.print(mName + " provider");
+                if (mProvider.isMock()) {
+                    pw.print(" [mock]");
+                }
+                pw.println(":");
+
+                pw.increaseIndent();
+
+                // for now we only dump for the parent user
+                int userId = mUserInfoHelper.getCurrentUserIds()[0];
+                pw.println("last location=" + mLastLocation.get(userId));
+                pw.println("last coarse location=" + mLastCoarseLocation.get(userId));
+                pw.println("enabled=" + isEnabled(userId));
+            }
+
+            mProvider.dump(fd, pw, args);
+
+            pw.decreaseIndent();
+        }
+    }
+
+    class PassiveLocationProviderManager extends LocationProviderManager {
+
+        private PassiveLocationProviderManager() {
+            super(PASSIVE_PROVIDER);
+        }
+
+        @Override
+        public void setRealProvider(AbstractLocationProvider provider) {
+            Preconditions.checkArgument(provider instanceof PassiveProvider);
+            super.setRealProvider(provider);
+        }
+
+        @Override
+        public void setMockProvider(@Nullable MockProvider provider) {
+            if (provider != null) {
+                throw new IllegalArgumentException("Cannot mock the passive provider");
+            }
+        }
+
+        public void updateLocation(Location location) {
+            synchronized (mLock) {
+                PassiveProvider passiveProvider = (PassiveProvider) mProvider.getProvider();
+                Preconditions.checkState(passiveProvider != null);
+
+                long identity = Binder.clearCallingIdentity();
+                try {
+                    passiveProvider.updateLocation(location);
+                } finally {
+                    Binder.restoreCallingIdentity(identity);
+                }
+            }
+        }
+    }
+
+    /**
+     * A wrapper class holding either an ILocationListener or a PendingIntent to receive
+     * location updates.
+     */
+    private final class Receiver extends LocationManagerServiceUtils.LinkedListenerBase implements
+            PendingIntent.OnFinished {
+        private static final long WAKELOCK_TIMEOUT_MILLIS = 60 * 1000;
+
+        private final ILocationListener mListener;
+        final PendingIntent mPendingIntent;
+        final WorkSource mWorkSource; // WorkSource for battery blame, or null to assign to caller.
+        private final boolean mHideFromAppOps; // True if AppOps should not monitor this receiver.
+        private final Object mKey;
+
+        final HashMap<String, UpdateRecord> mUpdateRecords = new HashMap<>();
+
+        // True if app ops has started monitoring this receiver for locations.
+        private boolean mOpMonitoring;
+        // True if app ops has started monitoring this receiver for high power (gps) locations.
+        private boolean mOpHighPowerMonitoring;
+        private int mPendingBroadcasts;
+        PowerManager.WakeLock mWakeLock;
+
+        private Receiver(ILocationListener listener, PendingIntent intent, CallerIdentity identity,
+                WorkSource workSource, boolean hideFromAppOps) {
+            super(identity);
+            mListener = listener;
+            mPendingIntent = intent;
+            if (listener != null) {
+                mKey = listener.asBinder();
+            } else {
+                mKey = intent;
+            }
+            if (workSource != null && workSource.isEmpty()) {
+                workSource = null;
+            }
+            mWorkSource = workSource;
+            mHideFromAppOps = hideFromAppOps;
+
+            updateMonitoring(true);
+
+            // construct/configure wakelock
+            mWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, WAKELOCK_KEY);
+            if (workSource == null) {
+                workSource = new WorkSource(mCallerIdentity.uid, mCallerIdentity.packageName);
+            }
+            mWakeLock.setWorkSource(workSource);
+
+            // For a non-reference counted wakelock, each acquire will reset the timeout, and we
+            // only need to release it once.
+            mWakeLock.setReferenceCounted(false);
+        }
+
+        @Override
+        public boolean equals(Object otherObj) {
+            return (otherObj instanceof Receiver) && mKey.equals(((Receiver) otherObj).mKey);
+        }
+
+        @Override
+        public int hashCode() {
+            return mKey.hashCode();
+        }
+
+        @Override
+        public String toString() {
+            StringBuilder s = new StringBuilder();
+            s.append("Reciever[");
+            s.append(Integer.toHexString(System.identityHashCode(this)));
+            if (mListener != null) {
+                s.append(" listener");
+            } else {
+                s.append(" intent");
+            }
+            for (String p : mUpdateRecords.keySet()) {
+                s.append(" ").append(mUpdateRecords.get(p).toString());
+            }
+            s.append(" monitoring location: ").append(mOpMonitoring);
+            s.append("]");
+            return s.toString();
+        }
+
+        /**
+         * Update AppOp monitoring for this receiver.
+         *
+         * @param allow If true receiver is currently active, if false it's been removed.
+         */
+        public void updateMonitoring(boolean allow) {
+            if (mHideFromAppOps) {
+                return;
+            }
+
+            boolean requestingLocation = false;
+            boolean requestingHighPowerLocation = false;
+            if (allow) {
+                // See if receiver has any enabled update records.  Also note if any update records
+                // are high power (has a high power provider with an interval under a threshold).
+                for (UpdateRecord updateRecord : mUpdateRecords.values()) {
+                    LocationProviderManager manager = getLocationProviderManager(
+                            updateRecord.mProvider);
+                    if (manager == null) {
+                        continue;
+                    }
+                    if (!manager.isEnabled(UserHandle.getUserId(mCallerIdentity.uid))
+                            && !isSettingsExempt(updateRecord)) {
+                        continue;
+                    }
+
+                    requestingLocation = true;
+                    ProviderProperties properties = manager.getProperties();
+                    if (properties != null
+                            && properties.mPowerRequirement == Criteria.POWER_HIGH
+                            && updateRecord.mRequest.getInterval() < HIGH_POWER_INTERVAL_MS) {
+                        requestingHighPowerLocation = true;
+                        break;
+                    }
+                }
+            }
+
+            // First update monitoring of any location request (including high power).
+            mOpMonitoring = updateMonitoring(
+                    requestingLocation,
+                    mOpMonitoring,
+                    false);
+
+            // Now update monitoring of high power requests only.
+            boolean wasHighPowerMonitoring = mOpHighPowerMonitoring;
+            mOpHighPowerMonitoring = updateMonitoring(
+                    requestingHighPowerLocation,
+                    mOpHighPowerMonitoring,
+                    true);
+            if (mOpHighPowerMonitoring != wasHighPowerMonitoring) {
+                long identity = Binder.clearCallingIdentity();
+                try {
+                    // Send an intent to notify that a high power request has been added/removed.
+                    Intent intent = new Intent(LocationManager.HIGH_POWER_REQUEST_CHANGE_ACTION);
+                    mContext.sendBroadcastAsUser(intent, UserHandle.ALL);
+                } finally {
+                    Binder.restoreCallingIdentity(identity);
+                }
+            }
+        }
+
+        private boolean updateMonitoring(boolean allowMonitoring, boolean currentlyMonitoring,
+                boolean highPower) {
+            if (!currentlyMonitoring) {
+                if (allowMonitoring) {
+                    if (!highPower) {
+                        return mAppOpsHelper.startLocationMonitoring(mCallerIdentity);
+                    } else {
+                        return mAppOpsHelper.startHighPowerLocationMonitoring(mCallerIdentity);
+                    }
+                }
+            } else {
+                if (!allowMonitoring || !mAppOpsHelper.checkLocationAccess(mCallerIdentity)) {
+                    if (!highPower) {
+                        mAppOpsHelper.stopLocationMonitoring(mCallerIdentity);
+                    } else {
+                        mAppOpsHelper.stopHighPowerLocationMonitoring(mCallerIdentity);
+                    }
+                    return false;
+                }
+            }
+
+            return currentlyMonitoring;
+        }
+
+        public boolean isListener() {
+            return mListener != null;
+        }
+
+        public boolean isPendingIntent() {
+            return mPendingIntent != null;
+        }
+
+        public ILocationListener getListener() {
+            if (mListener != null) {
+                return mListener;
+            }
+            throw new IllegalStateException("Request for non-existent listener");
+        }
+
+        public boolean callLocationChangedLocked(Location location) {
+            if (mListener != null) {
+                try {
+                    mListener.onLocationChanged(new Location(location));
+                    // call this after broadcasting so we do not increment
+                    // if we throw an exception.
+                    incrementPendingBroadcastsLocked();
+                } catch (RemoteException e) {
+                    return false;
+                }
+            } else {
+                Intent locationChanged = new Intent();
+                locationChanged.putExtra(LocationManager.KEY_LOCATION_CHANGED,
+                        new Location(location));
+                try {
+                    mPendingIntent.send(mContext, 0, locationChanged, this, mHandler,
+                            CallerIdentity.asPermission(mCallerIdentity.permissionLevel),
+                            PendingIntentUtils.createDontSendToRestrictedAppsBundle(null));
+                    // call this after broadcasting so we do not increment
+                    // if we throw an exception.
+                    incrementPendingBroadcastsLocked();
+                } catch (PendingIntent.CanceledException e) {
+                    return false;
+                }
+            }
+            return true;
+        }
+
+        private boolean callProviderEnabledLocked(String provider, boolean enabled) {
+            // First update AppOp monitoring.
+            // An app may get/lose location access as providers are enabled/disabled.
+            updateMonitoring(true);
+
+            if (mListener != null) {
+                try {
+                    if (enabled) {
+                        mListener.onProviderEnabled(provider);
+                    } else {
+                        mListener.onProviderDisabled(provider);
+                    }
+                    // call this after broadcasting so we do not increment
+                    // if we throw an exception.
+                    incrementPendingBroadcastsLocked();
+                } catch (RemoteException e) {
+                    return false;
+                }
+            } else {
+                Intent providerIntent = new Intent();
+                providerIntent.putExtra(LocationManager.KEY_PROVIDER_ENABLED, enabled);
+                try {
+                    mPendingIntent.send(mContext, 0, providerIntent, this, mHandler,
+                            CallerIdentity.asPermission(mCallerIdentity.permissionLevel),
+                            PendingIntentUtils.createDontSendToRestrictedAppsBundle(null));
+                    // call this after broadcasting so we do not increment
+                    // if we throw an exception.
+                    incrementPendingBroadcastsLocked();
+                } catch (PendingIntent.CanceledException e) {
+                    return false;
+                }
+            }
+            return true;
+        }
+
+        public void callRemovedLocked() {
+            if (mListener != null) {
+                try {
+                    mListener.onRemoved();
+                } catch (RemoteException e) {
+                    // doesn't matter
+                }
+            }
+        }
+
+        @Override
+        public void binderDied() {
+            synchronized (mLock) {
+                removeUpdatesLocked(this);
+                clearPendingBroadcastsLocked();
+            }
+        }
+
+        @Override
+        public void onSendFinished(PendingIntent pendingIntent, Intent intent,
+                int resultCode, String resultData, Bundle resultExtras) {
+            synchronized (mLock) {
+                decrementPendingBroadcastsLocked();
+            }
+        }
+
+        // this must be called while synchronized by caller in a synchronized block
+        // containing the sending of the broadcaset
+        private void incrementPendingBroadcastsLocked() {
+            mPendingBroadcasts++;
+            // so wakelock calls will succeed
+            long identity = Binder.clearCallingIdentity();
+            try {
+                mWakeLock.acquire(WAKELOCK_TIMEOUT_MILLIS);
+            } finally {
+                Binder.restoreCallingIdentity(identity);
+            }
+        }
+
+        private void decrementPendingBroadcastsLocked() {
+            if (--mPendingBroadcasts == 0) {
+                // so wakelock calls will succeed
+                long identity = Binder.clearCallingIdentity();
+                try {
+                    if (mWakeLock.isHeld()) {
+                        mWakeLock.release();
+                    }
+                } finally {
+                    Binder.restoreCallingIdentity(identity);
+                }
+            }
+        }
+
+        public void clearPendingBroadcastsLocked() {
+            if (mPendingBroadcasts > 0) {
+                mPendingBroadcasts = 0;
+                // so wakelock calls will succeed
+                long identity = Binder.clearCallingIdentity();
+                try {
+                    if (mWakeLock.isHeld()) {
+                        mWakeLock.release();
+                    }
+                } finally {
+                    Binder.restoreCallingIdentity(identity);
+                }
+            }
+        }
+    }
+
+    @Override
+    public void locationCallbackFinished(ILocationListener listener) {
+        //Do not use getReceiverLocked here as that will add the ILocationListener to
+        //the receiver list if it is not found.  If it is not found then the
+        //LocationListener was removed when it had a pending broadcast and should
+        //not be added back.
+        synchronized (mLock) {
+            Receiver receiver = mReceivers.get(listener.asBinder());
+            if (receiver != null) {
+                receiver.decrementPendingBroadcastsLocked();
+            }
+        }
+    }
+
+    @Override
+    public int getGnssYearOfHardware() {
+        return mGnssManagerService == null ? 0 : mGnssManagerService.getGnssYearOfHardware();
+    }
+
+    @Override
+    @Nullable
+    public String getGnssHardwareModelName() {
+        return mGnssManagerService == null ? "" : mGnssManagerService.getGnssHardwareModelName();
+    }
+
+    @Override
+    public int getGnssBatchSize(String packageName) {
+        return mGnssManagerService == null ? 0 : mGnssManagerService.getGnssBatchSize(packageName);
+    }
+
+    @Override
+    public boolean addGnssBatchingCallback(IBatchedLocationCallback callback, String packageName,
+            String featureId) {
+        return mGnssManagerService != null && mGnssManagerService.addGnssBatchingCallback(
+                callback, packageName, featureId);
+    }
+
+    @Override
+    public void removeGnssBatchingCallback() {
+        if (mGnssManagerService != null) mGnssManagerService.removeGnssBatchingCallback();
+    }
+
+    @Override
+    public boolean startGnssBatch(long periodNanos, boolean wakeOnFifoFull, String packageName,
+            String featureId) {
+        return mGnssManagerService != null && mGnssManagerService.startGnssBatch(periodNanos,
+                wakeOnFifoFull, packageName, featureId);
+    }
+
+    @Override
+    public void flushGnssBatch(String packageName) {
+        if (mGnssManagerService != null) mGnssManagerService.flushGnssBatch(packageName);
+    }
+
+    @Override
+    public boolean stopGnssBatch() {
+        return mGnssManagerService != null && mGnssManagerService.stopGnssBatch();
+    }
+
+    @Nullable
+    private LocationProviderManager getLocationProviderManager(String providerName) {
+        for (LocationProviderManager manager : mProviderManagers) {
+            if (providerName.equals(manager.getName())) {
+                return manager;
+            }
+        }
+
+        return null;
+    }
+
+    @Override
+    public List<String> getAllProviders() {
+        ArrayList<String> providers = new ArrayList<>(mProviderManagers.size());
+        for (LocationProviderManager manager : mProviderManagers) {
+            if (FUSED_PROVIDER.equals(manager.getName())) {
+                continue;
+            }
+            providers.add(manager.getName());
+        }
+        return providers;
+    }
+
+    @Override
+    public List<String> getProviders(Criteria criteria, boolean enabledOnly) {
+        if (!CallerIdentity.checkCallingOrSelfLocationPermission(mContext)) {
+            return Collections.emptyList();
+        }
+
+        synchronized (mLock) {
+            ArrayList<String> providers = new ArrayList<>(mProviderManagers.size());
+            for (LocationProviderManager manager : mProviderManagers) {
+                String name = manager.getName();
+                if (FUSED_PROVIDER.equals(name)) {
+                    continue;
+                }
+                if (enabledOnly && !manager.isEnabled(UserHandle.getCallingUserId())) {
+                    continue;
+                }
+                if (criteria != null && !LocationProvider.propertiesMeetCriteria(name,
+                        manager.getProperties(), criteria)) {
+                    continue;
+                }
+                providers.add(name);
+            }
+            return providers;
+        }
+    }
+
+    @Override
+    public String getBestProvider(Criteria criteria, boolean enabledOnly) {
+        List<String> providers;
+        synchronized (mLock) {
+            providers = getProviders(criteria, enabledOnly);
+            if (providers.isEmpty()) {
+                providers = getProviders(null, enabledOnly);
+            }
+        }
+
+        if (!providers.isEmpty()) {
+            if (providers.contains(GPS_PROVIDER)) {
+                return GPS_PROVIDER;
+            } else if (providers.contains(NETWORK_PROVIDER)) {
+                return NETWORK_PROVIDER;
+            } else {
+                return providers.get(0);
+            }
+        }
+
+        return null;
+    }
+
+    @GuardedBy("mLock")
+    private void updateProviderEnabledLocked(LocationProviderManager manager, boolean enabled) {
+        ArrayList<Receiver> deadReceivers = null;
+        ArrayList<UpdateRecord> records = mRecordsByProvider.get(manager.getName());
+        if (records != null) {
+            for (UpdateRecord record : records) {
+                if (!mUserInfoHelper.isCurrentUserId(
+                        UserHandle.getUserId(record.mReceiver.mCallerIdentity.uid))) {
+                    continue;
+                }
+
+                // requests that ignore location settings will never provide notifications
+                if (isSettingsExempt(record)) {
+                    continue;
+                }
+
+                // Sends a notification message to the receiver
+                if (!record.mReceiver.callProviderEnabledLocked(manager.getName(), enabled)) {
+                    if (deadReceivers == null) {
+                        deadReceivers = new ArrayList<>();
+                    }
+                    deadReceivers.add(record.mReceiver);
+                }
+            }
+        }
+
+        if (deadReceivers != null) {
+            for (int i = deadReceivers.size() - 1; i >= 0; i--) {
+                removeUpdatesLocked(deadReceivers.get(i));
+            }
+        }
+
+        applyRequirementsLocked(manager);
+    }
+
+    @GuardedBy("mLock")
+    private void applyRequirementsLocked(String providerName) {
+        LocationProviderManager manager = getLocationProviderManager(providerName);
+        if (manager != null) {
+            applyRequirementsLocked(manager);
+        }
+    }
+
+    @GuardedBy("mLock")
+    private void applyRequirementsLocked(LocationProviderManager manager) {
+        ArrayList<UpdateRecord> records = mRecordsByProvider.get(manager.getName());
+        ProviderRequest.Builder providerRequest = new ProviderRequest.Builder();
+
+        // if provider is not active, it should not respond to requests
+
+        if (mProviderManagers.contains(manager) && records != null && !records.isEmpty()) {
+            long backgroundThrottleInterval = mSettingsHelper.getBackgroundThrottleIntervalMs();
+
+            ArrayList<LocationRequest> requests = new ArrayList<>(records.size());
+
+            final boolean isForegroundOnlyMode =
+                    mBatterySaverMode == PowerManager.LOCATION_MODE_FOREGROUND_ONLY;
+            final boolean shouldThrottleRequests =
+                    mBatterySaverMode
+                            == PowerManager.LOCATION_MODE_THROTTLE_REQUESTS_WHEN_SCREEN_OFF
+                            && !mPowerManager.isInteractive();
+            // initialize the low power mode to true and set to false if any of the records requires
+            providerRequest.setLowPowerMode(true);
+            for (UpdateRecord record : records) {
+                CallerIdentity identity = record.mReceiver.mCallerIdentity;
+                if (!mUserInfoHelper.isCurrentUserId(identity.userId)) {
+                    continue;
+                }
+
+                if (!mAppOpsHelper.checkLocationAccess(identity)) {
+                    continue;
+                }
+                final boolean isBatterySaverDisablingLocation = shouldThrottleRequests
+                        || (isForegroundOnlyMode && !record.mIsForegroundUid);
+                if (!manager.isEnabled(identity.userId) || isBatterySaverDisablingLocation) {
+                    if (isSettingsExempt(record)) {
+                        providerRequest.setLocationSettingsIgnored(true);
+                        providerRequest.setLowPowerMode(false);
+                    } else {
+                        continue;
+                    }
+                }
+
+                LocationRequest locationRequest = record.mRealRequest;
+                long interval = locationRequest.getInterval();
+
+
+                // if we're forcing location, don't apply any throttling
+                if (!providerRequest.isLocationSettingsIgnored() && !isThrottlingExempt(
+                        record.mReceiver.mCallerIdentity)) {
+                    if (!record.mIsForegroundUid) {
+                        interval = Math.max(interval, backgroundThrottleInterval);
+                    }
+                    if (interval != locationRequest.getInterval()) {
+                        locationRequest = new LocationRequest(locationRequest);
+                        locationRequest.setInterval(interval);
+                    }
+                }
+
+                record.mRequest = locationRequest;
+                requests.add(locationRequest);
+                if (!locationRequest.isLowPowerMode()) {
+                    providerRequest.setLowPowerMode(false);
+                }
+                if (interval < providerRequest.getInterval()) {
+                    providerRequest.setInterval(interval);
+                }
+            }
+
+            providerRequest.setLocationRequests(requests);
+
+            if (providerRequest.getInterval() < Long.MAX_VALUE) {
+                // calculate who to blame for power
+                // This is somewhat arbitrary. We pick a threshold interval
+                // that is slightly higher that the minimum interval, and
+                // spread the blame across all applications with a request
+                // under that threshold.
+                // TODO: overflow
+                long thresholdInterval = (providerRequest.getInterval() + 1000) * 3 / 2;
+                for (UpdateRecord record : records) {
+                    if (mUserInfoHelper.isCurrentUserId(
+                            UserHandle.getUserId(record.mReceiver.mCallerIdentity.uid))) {
+                        LocationRequest locationRequest = record.mRequest;
+
+                        // Don't assign battery blame for update records whose
+                        // client has no permission to receive location data.
+                        if (!providerRequest.getLocationRequests().contains(locationRequest)) {
+                            continue;
+                        }
+
+                        if (locationRequest.getInterval() <= thresholdInterval) {
+                            if (record.mReceiver.mWorkSource != null
+                                    && isValidWorkSource(record.mReceiver.mWorkSource)) {
+                                providerRequest.getWorkSource().add(record.mReceiver.mWorkSource);
+                            } else {
+                                // Assign blame to caller if there's no WorkSource associated with
+                                // the request or if it's invalid.
+                                providerRequest.getWorkSource().add(
+                                        record.mReceiver.mCallerIdentity.uid,
+                                        record.mReceiver.mCallerIdentity.packageName);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        manager.setRequest(providerRequest.build());
+    }
+
+    /**
+     * Whether a given {@code WorkSource} associated with a Location request is valid.
+     */
+    private static boolean isValidWorkSource(WorkSource workSource) {
+        if (workSource.size() > 0) {
+            // If the WorkSource has one or more non-chained UIDs, make sure they're accompanied
+            // by tags.
+            return workSource.getPackageName(0) != null;
+        } else {
+            // For now, make sure callers have supplied an attribution tag for use with
+            // AppOpsManager. This might be relaxed in the future.
+            final List<WorkChain> workChains = workSource.getWorkChains();
+            return workChains != null && !workChains.isEmpty()
+                    && workChains.get(0).getAttributionTag() != null;
+        }
+    }
+
+    @Override
+    public String[] getBackgroundThrottlingWhitelist() {
+        return mSettingsHelper.getBackgroundThrottlePackageWhitelist().toArray(new String[0]);
+    }
+
+    @Override
+    public String[] getIgnoreSettingsWhitelist() {
+        return mSettingsHelper.getIgnoreSettingsPackageWhitelist().toArray(new String[0]);
+    }
+
+    private boolean isThrottlingExempt(CallerIdentity callerIdentity) {
+        if (callerIdentity.uid == Process.SYSTEM_UID) {
+            return true;
+        }
+
+        if (mSettingsHelper.getBackgroundThrottlePackageWhitelist().contains(
+                callerIdentity.packageName)) {
+            return true;
+        }
+
+        return mLocalService.isProviderPackage(callerIdentity.packageName);
+
+    }
+
+    private boolean isSettingsExempt(UpdateRecord record) {
+        if (!record.mRealRequest.isLocationSettingsIgnored()) {
+            return false;
+        }
+
+        if (mSettingsHelper.getIgnoreSettingsPackageWhitelist().contains(
+                record.mReceiver.mCallerIdentity.packageName)) {
+            return true;
+        }
+
+        return mLocalService.isProviderPackage(record.mReceiver.mCallerIdentity.packageName);
+
+    }
+
+    private class UpdateRecord {
+        final String mProvider;
+        private final LocationRequest mRealRequest;  // original request from client
+        LocationRequest mRequest;  // possibly throttled version of the request
+        private final Receiver mReceiver;
+        private boolean mIsForegroundUid;
+        private Location mLastFixBroadcast;
+        private Throwable mStackTrace;  // for debugging only
+        private long mExpirationRealtimeMs;
+
+        /**
+         * Note: must be constructed with lock held.
+         */
+        private UpdateRecord(String provider, LocationRequest request, Receiver receiver) {
+            mExpirationRealtimeMs = request.getExpirationRealtimeMs(SystemClock.elapsedRealtime());
+            mProvider = provider;
+            mRealRequest = request;
+            mRequest = request;
+            mReceiver = receiver;
+            mIsForegroundUid = mAppForegroundHelper.isAppForeground(mReceiver.mCallerIdentity.uid);
+
+            if (D && receiver.mCallerIdentity.pid == Process.myPid()) {
+                mStackTrace = new Throwable();
+            }
+
+            ArrayList<UpdateRecord> records = mRecordsByProvider.computeIfAbsent(provider,
+                    k -> new ArrayList<>());
+            if (!records.contains(this)) {
+                records.add(this);
+            }
+
+            // Update statistics for historical location requests by package/provider
+            mRequestStatistics.startRequesting(
+                    mReceiver.mCallerIdentity.packageName, mReceiver.mCallerIdentity.featureId,
+                    provider, request.getInterval(), mIsForegroundUid);
+        }
+
+        /**
+         * Method to be called when record changes foreground/background
+         */
+        private void updateForeground(boolean isForeground) {
+            mIsForegroundUid = isForeground;
+            mRequestStatistics.updateForeground(
+                    mReceiver.mCallerIdentity.packageName, mReceiver.mCallerIdentity.featureId,
+                    mProvider, isForeground);
+        }
+
+        /**
+         * Method to be called when a record will no longer be used.
+         */
+        private void disposeLocked(boolean removeReceiver) {
+            CallerIdentity identity = mReceiver.mCallerIdentity;
+            mRequestStatistics.stopRequesting(identity.packageName, identity.featureId, mProvider);
+
+            mLocationUsageLogger.logLocationApiUsage(
+                    LocationStatsEnums.USAGE_ENDED,
+                    LocationStatsEnums.API_REQUEST_LOCATION_UPDATES,
+                    identity.packageName,
+                    mRealRequest,
+                    mReceiver.isListener(),
+                    mReceiver.isPendingIntent(),
+                    /* geofence= */ null,
+                    mAppForegroundHelper.getImportance(mReceiver.mCallerIdentity.uid));
+
+            // remove from mRecordsByProvider
+            ArrayList<UpdateRecord> globalRecords = mRecordsByProvider.get(this.mProvider);
+            if (globalRecords != null) {
+                globalRecords.remove(this);
+            }
+
+            if (!removeReceiver) return;  // the caller will handle the rest
+
+            // remove from Receiver#mUpdateRecords
+            HashMap<String, UpdateRecord> receiverRecords = mReceiver.mUpdateRecords;
+            receiverRecords.remove(this.mProvider);
+
+            // and also remove the Receiver if it has no more update records
+            if (receiverRecords.size() == 0) {
+                removeUpdatesLocked(mReceiver);
+            }
+        }
+
+        @Override
+        public String toString() {
+            StringBuilder b = new StringBuilder("UpdateRecord[");
+            b.append(mProvider).append(" ");
+            b.append(mReceiver.mCallerIdentity).append(" ");
+            if (!mIsForegroundUid) {
+                b.append("(background) ");
+            }
+            b.append(mRealRequest).append(" ").append(mReceiver.mWorkSource);
+
+            if (mStackTrace != null) {
+                ByteArrayOutputStream tmp = new ByteArrayOutputStream();
+                mStackTrace.printStackTrace(new PrintStream(tmp));
+                b.append("\n\n").append(tmp.toString()).append("\n");
+            }
+
+            b.append("]");
+            return b.toString();
+        }
+    }
+
+    @GuardedBy("mLock")
+    private Receiver getReceiverLocked(ILocationListener listener, CallerIdentity identity,
+            WorkSource workSource, boolean hideFromAppOps) {
+        IBinder binder = listener.asBinder();
+        Receiver receiver = mReceivers.get(binder);
+        if (receiver == null && identity != null) {
+            receiver = new Receiver(listener, null, identity, workSource,
+                    hideFromAppOps);
+            if (!receiver.linkToListenerDeathNotificationLocked(
+                    receiver.getListener().asBinder())) {
+                return null;
+            }
+            mReceivers.put(binder, receiver);
+        }
+        return receiver;
+    }
+
+    @GuardedBy("mLock")
+    private Receiver getReceiverLocked(PendingIntent intent, CallerIdentity identity,
+            WorkSource workSource, boolean hideFromAppOps) {
+        Receiver receiver = mReceivers.get(intent);
+        if (receiver == null && identity != null) {
+            receiver = new Receiver(null, intent, identity, workSource,
+                    hideFromAppOps);
+            mReceivers.put(intent, receiver);
+        }
+        return receiver;
+    }
+
+    /**
+     * Creates a LocationRequest based upon the supplied LocationRequest that to meets resolution
+     * and consistency requirements.
+     *
+     * @param request the LocationRequest from which to create a sanitized version
+     * @return a version of request that meets the given resolution and consistency requirements
+     * @hide
+     */
+    private LocationRequest createSanitizedRequest(LocationRequest request, CallerIdentity identity,
+            boolean callerHasLocationHardwarePermission) {
+        LocationRequest sanitizedRequest = new LocationRequest(request);
+        if (!callerHasLocationHardwarePermission) {
+            // allow setting low power mode only for callers with location hardware permission
+            sanitizedRequest.setLowPowerMode(false);
+        }
+        if (identity.permissionLevel < PERMISSION_FINE) {
+            switch (sanitizedRequest.getQuality()) {
+                case LocationRequest.ACCURACY_FINE:
+                    sanitizedRequest.setQuality(LocationRequest.ACCURACY_BLOCK);
+                    break;
+                case LocationRequest.POWER_HIGH:
+                    sanitizedRequest.setQuality(LocationRequest.POWER_LOW);
+                    break;
+            }
+            // throttle
+            if (sanitizedRequest.getInterval() < FASTEST_COARSE_INTERVAL_MS) {
+                sanitizedRequest.setInterval(FASTEST_COARSE_INTERVAL_MS);
+            }
+            if (sanitizedRequest.getFastestInterval() < FASTEST_COARSE_INTERVAL_MS) {
+                sanitizedRequest.setFastestInterval(FASTEST_COARSE_INTERVAL_MS);
+            }
+        }
+        // make getFastestInterval() the minimum of interval and fastest interval
+        if (sanitizedRequest.getFastestInterval() > sanitizedRequest.getInterval()) {
+            sanitizedRequest.setFastestInterval(request.getInterval());
+        }
+        return sanitizedRequest;
+    }
+
+    @Override
+    public void requestLocationUpdates(LocationRequest request, ILocationListener listener,
+            PendingIntent intent, String packageName, String featureId, String listenerId) {
+        if (request == null) {
+            request = DEFAULT_LOCATION_REQUEST;
+        }
+        if (listenerId == null && intent != null) {
+            listenerId = AppOpsManager.toReceiverId(intent);
+        }
+
+        CallerIdentity identity = CallerIdentity.fromBinder(mContext, packageName, featureId,
+                listenerId);
+        identity.enforceLocationPermission();
+
+        WorkSource workSource = request.getWorkSource();
+        if (workSource != null && !workSource.isEmpty()) {
+            mContext.enforceCallingOrSelfPermission(
+                    Manifest.permission.UPDATE_DEVICE_STATS, null);
+        }
+        boolean hideFromAppOps = request.getHideFromAppOps();
+        if (hideFromAppOps) {
+            mContext.enforceCallingOrSelfPermission(
+                    Manifest.permission.UPDATE_APP_OPS_STATS, null);
+        }
+        if (request.isLocationSettingsIgnored()) {
+            mContext.enforceCallingOrSelfPermission(
+                    Manifest.permission.WRITE_SECURE_SETTINGS, null);
+        }
+        boolean callerHasLocationHardwarePermission =
+                mContext.checkCallingPermission(android.Manifest.permission.LOCATION_HARDWARE)
+                        == PERMISSION_GRANTED;
+        LocationRequest sanitizedRequest = createSanitizedRequest(request,
+                identity,
+                callerHasLocationHardwarePermission);
+
+        if (intent == null && listener == null) {
+            throw new IllegalArgumentException("need either listener or intent");
+        } else if (intent != null && listener != null) {
+            throw new IllegalArgumentException(
+                    "cannot register both listener and intent");
+        }
+
+        mLocationUsageLogger.logLocationApiUsage(
+                LocationStatsEnums.USAGE_STARTED,
+                LocationStatsEnums.API_REQUEST_LOCATION_UPDATES,
+                packageName, request, listener != null, intent != null,
+                /* geofence= */ null,
+                mAppForegroundHelper.getImportance(identity.uid));
+
+        synchronized (mLock) {
+            Receiver receiver;
+            if (intent != null) {
+                receiver = getReceiverLocked(intent, identity, workSource, hideFromAppOps);
+            } else {
+                receiver = getReceiverLocked(listener, identity, workSource, hideFromAppOps);
+            }
+            if (receiver != null) {
+                requestLocationUpdatesLocked(sanitizedRequest, receiver);
+            }
+        }
+    }
+
+    @GuardedBy("mLock")
+    private void requestLocationUpdatesLocked(LocationRequest request, Receiver receiver) {
+        // Figure out the provider. Either its explicitly request (legacy use cases), or
+        // use the fused provider
+        if (request == null) request = DEFAULT_LOCATION_REQUEST;
+        String name = request.getProvider();
+        if (name == null) {
+            throw new IllegalArgumentException("provider name must not be null");
+        }
+
+        LocationProviderManager manager = getLocationProviderManager(name);
+        if (manager == null) {
+            throw new IllegalArgumentException("provider doesn't exist: " + name);
+        }
+
+        UpdateRecord record = new UpdateRecord(name, request, receiver);
+
+        UpdateRecord oldRecord = receiver.mUpdateRecords.put(name, record);
+        if (oldRecord != null) {
+            oldRecord.disposeLocked(false);
+        }
+
+        long identity = Binder.clearCallingIdentity();
+        try {
+            int userId = UserHandle.getUserId(receiver.mCallerIdentity.uid);
+            if (!manager.isEnabled(userId) && !isSettingsExempt(record)) {
+                // Notify the listener that updates are currently disabled - but only if the request
+                // does not ignore location settings
+                receiver.callProviderEnabledLocked(name, false);
+            }
+
+            applyRequirementsLocked(name);
+
+            // Update the monitoring here just in case multiple location requests were added to the
+            // same receiver (this request may be high power and the initial might not have been).
+            receiver.updateMonitoring(true);
+        } finally {
+            Binder.restoreCallingIdentity(identity);
+        }
+    }
+
+    @Override
+    public void removeUpdates(ILocationListener listener, PendingIntent intent) {
+        if (intent == null && listener == null) {
+            throw new IllegalArgumentException("need either listener or intent");
+        } else if (intent != null && listener != null) {
+            throw new IllegalArgumentException("cannot register both listener and intent");
+        }
+
+        synchronized (mLock) {
+            Receiver receiver;
+            if (intent != null) {
+                receiver = getReceiverLocked(intent, null, null, false);
+            } else {
+                receiver = getReceiverLocked(listener, null, null, false);
+            }
+
+            if (receiver != null) {
+                removeUpdatesLocked(receiver);
+            }
+        }
+    }
+
+    @GuardedBy("mLock")
+    private void removeUpdatesLocked(Receiver receiver) {
+        if (D) Log.i(TAG, "remove " + Integer.toHexString(System.identityHashCode(receiver)));
+
+        if (mReceivers.remove(receiver.mKey) != null && receiver.isListener()) {
+            receiver.unlinkFromListenerDeathNotificationLocked(
+                    receiver.getListener().asBinder());
+            receiver.clearPendingBroadcastsLocked();
+        }
+
+        receiver.updateMonitoring(false);
+
+        // Record which providers were associated with this listener
+        HashSet<String> providers = new HashSet<>();
+        HashMap<String, UpdateRecord> oldRecords = receiver.mUpdateRecords;
+        if (oldRecords != null) {
+            // Call dispose() on the obsolete update records.
+            for (UpdateRecord record : oldRecords.values()) {
+                // Update statistics for historical location requests by package/provider
+                record.disposeLocked(false);
+            }
+            // Accumulate providers
+            providers.addAll(oldRecords.keySet());
+        }
+
+        // update provider
+        for (String provider : providers) {
+            applyRequirementsLocked(provider);
+        }
+    }
+
+    @Override
+    public Location getLastLocation(LocationRequest request, String packageName, String featureId) {
+        if (request == null) {
+            request = DEFAULT_LOCATION_REQUEST;
+        }
+
+        // unsafe is ok because app ops will verify the package name
+        CallerIdentity identity = CallerIdentity.fromBinderUnsafe(mContext, packageName, featureId);
+        identity.enforceLocationPermission();
+
+        if (mSettingsHelper.isLocationPackageBlacklisted(identity.userId, identity.packageName)) {
+            return null;
+        }
+        if (!mUserInfoHelper.isCurrentUserId(identity.userId)) {
+            return null;
+        }
+
+        synchronized (mLock) {
+            LocationProviderManager manager = getLocationProviderManager(request.getProvider());
+            if (manager == null) {
+                return null;
+            }
+            if (!manager.isEnabled(identity.userId) && !request.isLocationSettingsIgnored()) {
+                return null;
+            }
+
+            // appops check should always be right before delivery
+            if (!mAppOpsHelper.noteLocationAccess(identity)) {
+                return null;
+            }
+
+            Location location = manager.getLastLocation(identity.userId, identity.permissionLevel);
+
+            // make a defensive copy - the client could be in the same process as us
+            return location != null ? new Location(location) : null;
+        }
+    }
+
+    @Override
+    public boolean getCurrentLocation(LocationRequest locationRequest,
+            ICancellationSignal remoteCancellationSignal, ILocationListener listener,
+            String packageName, String featureId, String listenerId) {
+        // side effect of validating locationRequest and packageName
+        Location lastLocation = getLastLocation(locationRequest, packageName, featureId);
+        if (lastLocation != null) {
+            long locationAgeMs = NANOSECONDS.toMillis(
+                    SystemClock.elapsedRealtimeNanos() - lastLocation.getElapsedRealtimeNanos());
+
+            if (locationAgeMs < MAX_CURRENT_LOCATION_AGE_MS) {
+                try {
+                    listener.onLocationChanged(lastLocation);
+                    return true;
+                } catch (RemoteException e) {
+                    Log.w(TAG, e);
+                    return false;
+                }
+            }
+
+            if (!mAppForegroundHelper.isAppForeground(Binder.getCallingUid())) {
+                if (locationAgeMs < mSettingsHelper.getBackgroundThrottleIntervalMs()) {
+                    // not allowed to request new locations, so we can't return anything
+                    return false;
+                }
+            }
+        }
+
+        requestLocationUpdates(locationRequest, listener, null, packageName, featureId, listenerId);
+        CancellationSignal cancellationSignal = CancellationSignal.fromTransport(
+                remoteCancellationSignal);
+        if (cancellationSignal != null) {
+            cancellationSignal.setOnCancelListener(
+                    () -> removeUpdates(listener, null));
+        }
+        return true;
+    }
+
+    @Override
+    public LocationTime getGnssTimeMillis() {
+        synchronized (mLock) {
+            LocationProviderManager gpsManager = getLocationProviderManager(GPS_PROVIDER);
+            if (gpsManager == null) {
+                return null;
+            }
+
+            Location location = gpsManager.getLastLocation(UserHandle.getCallingUserId(),
+                    PERMISSION_FINE);
+            if (location == null) {
+                return null;
+            }
+
+            long currentNanos = SystemClock.elapsedRealtimeNanos();
+            long deltaMs = NANOSECONDS.toMillis(location.getElapsedRealtimeAgeNanos(currentNanos));
+            return new LocationTime(location.getTime() + deltaMs, currentNanos);
+        }
+    }
+
+    @Override
+    public void injectLocation(Location location) {
+        mContext.enforceCallingPermission(android.Manifest.permission.LOCATION_HARDWARE, null);
+        mContext.enforceCallingPermission(ACCESS_FINE_LOCATION, null);
+
+        Preconditions.checkArgument(location.isComplete());
+
+        int userId = UserHandle.getCallingUserId();
+        synchronized (mLock) {
+            LocationProviderManager manager = getLocationProviderManager(location.getProvider());
+            if (manager != null && manager.isEnabled(userId)) {
+                manager.injectLastLocation(Objects.requireNonNull(location), userId);
+            }
+        }
+    }
+
+    @Override
+    public void requestGeofence(LocationRequest request, Geofence geofence, PendingIntent intent,
+            String packageName, String featureId) {
+        if (request == null) {
+            request = DEFAULT_LOCATION_REQUEST;
+        }
+
+        CallerIdentity identity = CallerIdentity.fromBinder(mContext, packageName, featureId,
+                AppOpsManager.toReceiverId(intent));
+        identity.enforceLocationPermission();
+
+        Objects.requireNonNull(intent);
+
+        boolean callerHasLocationHardwarePermission =
+                mContext.checkCallingPermission(android.Manifest.permission.LOCATION_HARDWARE)
+                        == PERMISSION_GRANTED;
+        LocationRequest sanitizedRequest = createSanitizedRequest(request, identity,
+                callerHasLocationHardwarePermission);
+
+        if (D) {
+            Log.d(TAG, "requestGeofence: " + sanitizedRequest + " " + geofence + " " + intent);
+        }
+
+        if (identity.userId != UserHandle.USER_SYSTEM) {
+            // temporary measure until geofences work for secondary users
+            Log.w(TAG, "proximity alerts are currently available only to the primary user");
+            return;
+        }
+
+        mLocationUsageLogger.logLocationApiUsage(
+                LocationStatsEnums.USAGE_STARTED,
+                LocationStatsEnums.API_REQUEST_GEOFENCE,
+                packageName,
+                request,
+                /* hasListener= */ false,
+                true,
+                geofence,
+                mAppForegroundHelper.getImportance(identity.uid));
+
+        mGeofenceManager.addFence(sanitizedRequest, geofence, intent, identity);
+    }
+
+    @Override
+    public void removeGeofence(Geofence geofence, PendingIntent intent, String packageName) {
+        if (intent == null) {
+            throw new IllegalArgumentException("invalid pending intent: " + null);
+        }
+
+        if (D) Log.d(TAG, "removeGeofence: " + geofence + " " + intent);
+
+        mLocationUsageLogger.logLocationApiUsage(
+                LocationStatsEnums.USAGE_ENDED,
+                LocationStatsEnums.API_REQUEST_GEOFENCE,
+                packageName,
+                /* LocationRequest= */ null,
+                /* hasListener= */ false,
+                true,
+                geofence,
+                mAppForegroundHelper.getImportance(Binder.getCallingUid()));
+
+        // geo-fence manager uses the public location API, need to clear identity
+        long identity = Binder.clearCallingIdentity();
+        try {
+            mGeofenceManager.removeFence(geofence, intent);
+        } finally {
+            Binder.restoreCallingIdentity(identity);
+        }
+    }
+
+    @Override
+    public boolean registerGnssStatusCallback(IGnssStatusListener listener, String packageName,
+            String featureId) {
+        return mGnssManagerService != null && mGnssManagerService.registerGnssStatusCallback(
+                listener, packageName, featureId);
+    }
+
+    @Override
+    public void unregisterGnssStatusCallback(IGnssStatusListener listener) {
+        if (mGnssManagerService != null) mGnssManagerService.unregisterGnssStatusCallback(listener);
+    }
+
+    @Override
+    public boolean addGnssMeasurementsListener(@Nullable GnssRequest request,
+            IGnssMeasurementsListener listener, String packageName, String featureId) {
+        return mGnssManagerService != null && mGnssManagerService.addGnssMeasurementsListener(
+                request, listener, packageName, featureId);
+    }
+
+    @Override
+    public void removeGnssMeasurementsListener(IGnssMeasurementsListener listener) {
+        if (mGnssManagerService != null) {
+            mGnssManagerService.removeGnssMeasurementsListener(
+                    listener);
+        }
+    }
+
+    @Override
+    public void injectGnssMeasurementCorrections(
+            GnssMeasurementCorrections measurementCorrections, String packageName) {
+        if (mGnssManagerService != null) {
+            mGnssManagerService.injectGnssMeasurementCorrections(measurementCorrections,
+                    packageName);
+        }
+    }
+
+    @Override
+    public long getGnssCapabilities() {
+        return mGnssManagerService == null ? GnssCapabilities.INVALID_CAPABILITIES
+                : mGnssManagerService.getGnssCapabilities();
+    }
+
+    @Override
+    public boolean addGnssAntennaInfoListener(IGnssAntennaInfoListener listener,
+            String packageName, String featureId) {
+
+        return mGnssManagerService != null && mGnssManagerService.addGnssAntennaInfoListener(
+                listener, packageName, featureId);
+    }
+
+    @Override
+    public void removeGnssAntennaInfoListener(IGnssAntennaInfoListener listener) {
+        if (mGnssManagerService != null) {
+            mGnssManagerService.removeGnssAntennaInfoListener(listener);
+        }
+    }
+
+    @Override
+    public boolean addGnssNavigationMessageListener(IGnssNavigationMessageListener listener,
+            String packageName, String featureId) {
+        return mGnssManagerService != null && mGnssManagerService.addGnssNavigationMessageListener(
+                listener, packageName, featureId);
+    }
+
+    @Override
+    public void removeGnssNavigationMessageListener(IGnssNavigationMessageListener listener) {
+        if (mGnssManagerService != null) {
+            mGnssManagerService.removeGnssNavigationMessageListener(
+                    listener);
+        }
+    }
+
+    @Override
+    public boolean sendExtraCommand(String provider, String command, Bundle extras) {
+        CallerIdentity.enforceCallingOrSelfLocationPermission(mContext);
+        mContext.enforceCallingOrSelfPermission(
+                Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, null);
+
+        LocationProviderManager manager = getLocationProviderManager(
+                Objects.requireNonNull(provider));
+        if (manager != null) {
+            manager.sendExtraCommand(Binder.getCallingUid(), Binder.getCallingPid(),
+                    Objects.requireNonNull(command), extras);
+        }
+
+        mLocationUsageLogger.logLocationApiUsage(
+                LocationStatsEnums.USAGE_STARTED,
+                LocationStatsEnums.API_SEND_EXTRA_COMMAND,
+                provider);
+
+        mLocationUsageLogger.logLocationApiUsage(
+                LocationStatsEnums.USAGE_ENDED,
+                LocationStatsEnums.API_SEND_EXTRA_COMMAND,
+                provider);
+
+        return true;
+    }
+
+    @Override
+    public ProviderProperties getProviderProperties(String providerName) {
+        LocationProviderManager manager = getLocationProviderManager(providerName);
+        if (manager == null) {
+            return null;
+        }
+        return manager.getProperties();
+    }
+
+    @Override
+    public boolean isProviderPackage(String packageName) {
+        mContext.enforceCallingOrSelfPermission(Manifest.permission.READ_DEVICE_CONFIG, null);
+        return mLocalService.isProviderPackage(packageName);
+    }
+
+    @Override
+    public List<String> getProviderPackages(String providerName) {
+        mContext.enforceCallingOrSelfPermission(Manifest.permission.READ_DEVICE_CONFIG, null);
+        LocationProviderManager manager = getLocationProviderManager(providerName);
+        return manager == null ? Collections.emptyList() : new ArrayList<>(manager.getPackages());
+    }
+
+    @Override
+    public void setExtraLocationControllerPackage(String packageName) {
+        mContext.enforceCallingPermission(Manifest.permission.LOCATION_HARDWARE,
+                Manifest.permission.LOCATION_HARDWARE + " permission required");
+        synchronized (mLock) {
+            mExtraLocationControllerPackage = packageName;
+        }
+    }
+
+    @Override
+    public String getExtraLocationControllerPackage() {
+        synchronized (mLock) {
+            return mExtraLocationControllerPackage;
+        }
+    }
+
+    @Override
+    public void setExtraLocationControllerPackageEnabled(boolean enabled) {
+        mContext.enforceCallingPermission(Manifest.permission.LOCATION_HARDWARE,
+                Manifest.permission.LOCATION_HARDWARE + " permission required");
+        synchronized (mLock) {
+            mExtraLocationControllerPackageEnabled = enabled;
+        }
+    }
+
+    @Override
+    public boolean isExtraLocationControllerPackageEnabled() {
+        synchronized (mLock) {
+            return mExtraLocationControllerPackageEnabled
+                    && (mExtraLocationControllerPackage != null);
+        }
+    }
+
+    @Override
+    public void setLocationEnabledForUser(boolean enabled, int userId) {
+        userId = ActivityManager.handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(),
+                userId, false, false, "setLocationEnabledForUser", null);
+
+        mContext.enforceCallingOrSelfPermission(Manifest.permission.WRITE_SECURE_SETTINGS, null);
+
+        LocationManager.invalidateLocalLocationEnabledCaches();
+        mSettingsHelper.setLocationEnabled(enabled, userId);
+    }
+
+    @Override
+    public boolean isLocationEnabledForUser(int userId) {
+        userId = ActivityManager.handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(),
+                userId, false, false, "isLocationEnabledForUser", null);
+        return mSettingsHelper.isLocationEnabled(userId);
+    }
+
+    @Override
+    public boolean isProviderEnabledForUser(String provider, int userId) {
+        userId = ActivityManager.handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(),
+                userId, false, false, "isProviderEnabledForUser", null);
+
+        // Fused provider is accessed indirectly via criteria rather than the provider-based APIs,
+        // so we discourage its use
+        if (FUSED_PROVIDER.equals(provider)) return false;
+
+        return mLocalService.isProviderEnabledForUser(provider, userId);
+    }
+
+    @GuardedBy("mLock")
+    private static boolean shouldBroadcastSafeLocked(
+            Location loc, Location lastLoc, UpdateRecord record, long now) {
+        // Always broadcast the first update
+        if (lastLoc == null) {
+            return true;
+        }
+
+        // Check whether sufficient time has passed
+        long minTime = record.mRealRequest.getFastestInterval();
+        long deltaMs = NANOSECONDS.toMillis(
+                loc.getElapsedRealtimeNanos() - lastLoc.getElapsedRealtimeNanos());
+        if (deltaMs < minTime - MAX_PROVIDER_SCHEDULING_JITTER_MS) {
+            return false;
+        }
+
+        // Check whether sufficient distance has been traveled
+        double minDistance = record.mRealRequest.getSmallestDisplacement();
+        if (minDistance > 0.0) {
+            if (loc.distanceTo(lastLoc) <= minDistance) {
+                return false;
+            }
+        }
+
+        // Check whether sufficient number of udpates is left
+        if (record.mRealRequest.getNumUpdates() <= 0) {
+            return false;
+        }
+
+        // Check whether the expiry date has passed
+        return record.mExpirationRealtimeMs >= now;
+    }
+
+    @GuardedBy("mLock")
+    private void handleLocationChangedLocked(LocationProviderManager manager, Location fineLocation,
+            Location coarseLocation) {
+        if (!mProviderManagers.contains(manager)) {
+            Log.w(TAG, "received location from unknown provider: " + manager.getName());
+            return;
+        }
+
+        // notify passive provider
+        if (manager != mPassiveManager) {
+            mPassiveManager.updateLocation(fineLocation);
+        }
+
+        long now = SystemClock.elapsedRealtime();
+
+        ArrayList<UpdateRecord> records = mRecordsByProvider.get(manager.getName());
+        if (records == null || records.size() == 0) return;
+
+        ArrayList<Receiver> deadReceivers = null;
+        ArrayList<UpdateRecord> deadUpdateRecords = null;
+
+        // Broadcast location to all listeners
+        for (UpdateRecord r : records) {
+            Receiver receiver = r.mReceiver;
+            CallerIdentity identity = receiver.mCallerIdentity;
+            boolean receiverDead = false;
+
+
+            if (!manager.isEnabled(identity.userId) && !isSettingsExempt(r)) {
+                continue;
+            }
+
+            if (!mUserInfoHelper.isCurrentUserId(identity.userId)
+                    && !isProviderPackage(identity.packageName)) {
+                continue;
+            }
+
+            if (mSettingsHelper.isLocationPackageBlacklisted(identity.userId,
+                    identity.packageName)) {
+                continue;
+            }
+
+            Location location;
+            switch (identity.permissionLevel) {
+                case PERMISSION_COARSE:
+                    location = coarseLocation;
+                    break;
+                case PERMISSION_FINE:
+                    location = fineLocation;
+                    break;
+                default:
+                    throw new AssertionError();
+            }
+
+            if (shouldBroadcastSafeLocked(location, r.mLastFixBroadcast, r, now)) {
+                r.mLastFixBroadcast = location;
+
+                // appops check should always be right before delivery
+                if (!mAppOpsHelper.noteLocationAccess(receiver.mCallerIdentity)) {
+                    continue;
+                }
+
+                if (!receiver.callLocationChangedLocked(location)) {
+                    receiverDead = true;
+                }
+                r.mRealRequest.decrementNumUpdates();
+            }
+
+            // track expired records
+            if (r.mRealRequest.getNumUpdates() <= 0 || r.mExpirationRealtimeMs < now) {
+                // notify the client it can remove this listener
+                r.mReceiver.callRemovedLocked();
+                if (deadUpdateRecords == null) {
+                    deadUpdateRecords = new ArrayList<>();
+                }
+                deadUpdateRecords.add(r);
+            }
+            // track dead receivers
+            if (receiverDead) {
+                if (deadReceivers == null) {
+                    deadReceivers = new ArrayList<>();
+                }
+                if (!deadReceivers.contains(receiver)) {
+                    deadReceivers.add(receiver);
+                }
+            }
+        }
+
+        // remove dead records and receivers outside the loop
+        if (deadReceivers != null) {
+            for (Receiver receiver : deadReceivers) {
+                removeUpdatesLocked(receiver);
+            }
+        }
+        if (deadUpdateRecords != null) {
+            for (UpdateRecord r : deadUpdateRecords) {
+                r.disposeLocked(true);
+            }
+            applyRequirementsLocked(manager);
+        }
+    }
+
+    // Geocoder
+
+    @Override
+    public boolean geocoderIsPresent() {
+        return mGeocodeProvider != null;
+    }
+
+    @Override
+    public String getFromLocation(double latitude, double longitude, int maxResults,
+            GeocoderParams params, List<Address> addrs) {
+        if (mGeocodeProvider != null) {
+            return mGeocodeProvider.getFromLocation(latitude, longitude, maxResults,
+                    params, addrs);
+        }
+        return null;
+    }
+
+    @Override
+    public String getFromLocationName(String locationName,
+            double lowerLeftLatitude, double lowerLeftLongitude,
+            double upperRightLatitude, double upperRightLongitude, int maxResults,
+            GeocoderParams params, List<Address> addrs) {
+
+        if (mGeocodeProvider != null) {
+            return mGeocodeProvider.getFromLocationName(locationName, lowerLeftLatitude,
+                    lowerLeftLongitude, upperRightLatitude, upperRightLongitude,
+                    maxResults, params, addrs);
+        }
+        return null;
+    }
+
+    // Mock Providers
+
+    @Override
+    public void addTestProvider(String provider, ProviderProperties properties,
+            String packageName, String featureId) {
+        // unsafe is ok because app ops will verify the package name
+        CallerIdentity identity = CallerIdentity.fromBinderUnsafe(mContext, packageName, featureId);
+        if (!mAppOpsHelper.noteMockLocationAccess(identity)) {
+            return;
+        }
+
+        synchronized (mLock) {
+            LocationProviderManager manager = getLocationProviderManager(provider);
+            if (manager == null) {
+                manager = new LocationProviderManager(provider);
+                mProviderManagers.add(manager);
+            }
+
+            manager.setMockProvider(new MockProvider(properties));
+        }
+    }
+
+    @Override
+    public void removeTestProvider(String provider, String packageName, String featureId) {
+        // unsafe is ok because app ops will verify the package name
+        CallerIdentity identity = CallerIdentity.fromBinderUnsafe(mContext, packageName, featureId);
+        if (!mAppOpsHelper.noteMockLocationAccess(identity)) {
+            return;
+        }
+
+        synchronized (mLock) {
+            LocationProviderManager manager = getLocationProviderManager(provider);
+            if (manager == null) {
+                return;
+            }
+
+            manager.setMockProvider(null);
+            if (!manager.hasProvider()) {
+                mProviderManagers.remove(manager);
+            }
+        }
+    }
+
+    @Override
+    public void setTestProviderLocation(String provider, Location location, String packageName,
+            String featureId) {
+        // unsafe is ok because app ops will verify the package name
+        CallerIdentity identity = CallerIdentity.fromBinderUnsafe(mContext, packageName, featureId);
+        if (!mAppOpsHelper.noteMockLocationAccess(identity)) {
+            return;
+        }
+
+        Preconditions.checkArgument(location.isComplete(),
+                "incomplete location object, missing timestamp or accuracy?");
+
+        LocationProviderManager manager = getLocationProviderManager(provider);
+        if (manager == null) {
+            throw new IllegalArgumentException("provider doesn't exist: " + provider);
+        }
+
+        manager.setMockProviderLocation(location);
+    }
+
+    @Override
+    public void setTestProviderEnabled(String provider, boolean enabled, String packageName,
+            String featureId) {
+        // unsafe is ok because app ops will verify the package name
+        CallerIdentity identity = CallerIdentity.fromBinderUnsafe(mContext, packageName, featureId);
+        if (!mAppOpsHelper.noteMockLocationAccess(identity)) {
+            return;
+        }
+
+        LocationProviderManager manager = getLocationProviderManager(provider);
+        if (manager == null) {
+            throw new IllegalArgumentException("provider doesn't exist: " + provider);
+        }
+
+        manager.setMockProviderAllowed(enabled);
+    }
+
+    @Override
+    @NonNull
+    public List<LocationRequest> getTestProviderCurrentRequests(String provider) {
+        LocationProviderManager manager = getLocationProviderManager(provider);
+        if (manager == null) {
+            throw new IllegalArgumentException("provider doesn't exist: " + provider);
+        }
+
+        return manager.getMockProviderRequests();
+    }
+
+    @Override
+    protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
+        if (!DumpUtils.checkDumpPermission(mContext, TAG, pw)) {
+            return;
+        }
+
+        IndentingPrintWriter ipw = new IndentingPrintWriter(pw, "  ");
+
+        synchronized (mLock) {
+            if (mGnssManagerService != null && args.length > 0 && args[0].equals("--gnssmetrics")) {
+                mGnssManagerService.dump(fd, pw, args);
+                return;
+            }
+
+            ipw.println("Location Manager State:");
+            ipw.increaseIndent();
+            ipw.print("Current System Time: "
+                    + TimeUtils.logTimeOfDay(System.currentTimeMillis()));
+            ipw.println(", Current Elapsed Time: "
+                    + TimeUtils.formatDuration(SystemClock.elapsedRealtime()));
+
+            ipw.println("User Info:");
+            ipw.increaseIndent();
+            mUserInfoHelper.dump(fd, ipw, args);
+            ipw.decreaseIndent();
+
+            ipw.println("Location Settings:");
+            ipw.increaseIndent();
+            mSettingsHelper.dump(fd, ipw, args);
+            ipw.decreaseIndent();
+
+            ipw.println("Battery Saver Location Mode: "
+                    + locationPowerSaveModeToString(mBatterySaverMode));
+
+            ipw.println("Location Listeners:");
+            ipw.increaseIndent();
+            for (Receiver receiver : mReceivers.values()) {
+                ipw.println(receiver);
+            }
+            ipw.decreaseIndent();
+
+            ipw.println("Active Records by Provider:");
+            ipw.increaseIndent();
+            for (Map.Entry<String, ArrayList<UpdateRecord>> entry : mRecordsByProvider.entrySet()) {
+                ipw.println(entry.getKey() + ":");
+                ipw.increaseIndent();
+                for (UpdateRecord record : entry.getValue()) {
+                    ipw.println(record);
+                }
+                ipw.decreaseIndent();
+            }
+            ipw.decreaseIndent();
+
+            ipw.println("Historical Records by Provider:");
+            ipw.increaseIndent();
+            TreeMap<PackageProviderKey, PackageStatistics> sorted = new TreeMap<>(
+                    mRequestStatistics.statistics);
+            for (Map.Entry<PackageProviderKey, PackageStatistics> entry
+                    : sorted.entrySet()) {
+                PackageProviderKey key = entry.getKey();
+                ipw.println(key.mPackageName + ": " + key.mProviderName + ": " + entry.getValue());
+            }
+            ipw.decreaseIndent();
+
+            mRequestStatistics.history.dump(ipw);
+
+            if (mGeofenceManager != null) {
+                ipw.println("Geofences:");
+                ipw.increaseIndent();
+                mGeofenceManager.dump(ipw);
+                ipw.decreaseIndent();
+            }
+
+            if (mExtraLocationControllerPackage != null) {
+                ipw.println("Location Controller Extra Package: " + mExtraLocationControllerPackage
+                        + (mExtraLocationControllerPackageEnabled ? " [enabled]" : "[disabled]"));
+            }
+        }
+
+        ipw.println("Location Providers:");
+        ipw.increaseIndent();
+        for (LocationProviderManager manager : mProviderManagers) {
+            manager.dump(fd, ipw, args);
+        }
+        ipw.decreaseIndent();
+
+        synchronized (mLock) {
+            if (mGnssManagerService != null) {
+                ipw.println("GNSS:");
+                ipw.increaseIndent();
+                mGnssManagerService.dump(fd, ipw, args);
+                ipw.decreaseIndent();
+            }
+        }
+    }
+
+    private class LocalService extends LocationManagerInternal {
+
+        @Override
+        public boolean isProviderEnabledForUser(@NonNull String provider, int userId) {
+            synchronized (mLock) {
+                LocationProviderManager manager = getLocationProviderManager(provider);
+                if (manager == null) {
+                    return false;
+                }
+
+                return manager.isEnabled(userId);
+            }
+        }
+
+        @Override
+        public boolean isProviderPackage(String packageName) {
+            for (LocationProviderManager manager : mProviderManagers) {
+                if (manager.getPackages().contains(packageName)) {
+                    return true;
+                }
+            }
+            return false;
+        }
+
+        @Override
+        public void sendNiResponse(int notifId, int userResponse) {
+            if (mGnssManagerService != null) {
+                mGnssManagerService.sendNiResponse(notifId, userResponse);
+            }
+        }
+    }
+}
diff --git a/services/core/java/com/android/server/location/LocationManagerServiceUtils.java b/services/core/java/com/android/server/location/LocationManagerServiceUtils.java
new file mode 100644
index 0000000..c33a7066
--- /dev/null
+++ b/services/core/java/com/android/server/location/LocationManagerServiceUtils.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.location;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.os.IBinder;
+import android.os.RemoteException;
+
+import java.util.NoSuchElementException;
+import java.util.function.Consumer;
+
+/**
+ * Shared utilities for LocationManagerService and GnssManager.
+ */
+public class LocationManagerServiceUtils {
+
+    /**
+     * Listener that can be linked to a binder.
+     * @param <TListener> listener type
+     * @param <TRequest> request type
+     */
+    public static class LinkedListener<TRequest, TListener> extends
+            LinkedListenerBase {
+        @Nullable protected final TRequest mRequest;
+        private final TListener mListener;
+        private final Consumer<TListener> mBinderDeathCallback;
+
+        public LinkedListener(
+                @Nullable TRequest request,
+                @NonNull TListener listener,
+                @NonNull CallerIdentity callerIdentity,
+                @NonNull Consumer<TListener> binderDeathCallback) {
+            super(callerIdentity);
+            mListener = listener;
+            mRequest = request;
+            mBinderDeathCallback = binderDeathCallback;
+        }
+
+        @Nullable
+        public TRequest getRequest() {
+            return mRequest;
+        }
+
+        @Override
+        public void binderDied() {
+            mBinderDeathCallback.accept(mListener);
+        }
+    }
+
+    /**
+     * Skeleton class of listener that can be linked to a binder.
+     */
+    public abstract static class LinkedListenerBase implements IBinder.DeathRecipient {
+        protected final CallerIdentity mCallerIdentity;
+
+        LinkedListenerBase(@NonNull CallerIdentity callerIdentity) {
+            mCallerIdentity = callerIdentity;
+        }
+
+        @Override
+        public String toString() {
+            return mCallerIdentity.toString();
+        }
+
+        public CallerIdentity getCallerIdentity() {
+            return mCallerIdentity;
+        }
+
+        /**
+         * Link listener (i.e. callback) to a binder, so that it will be called upon binder's death.
+         */
+        public boolean linkToListenerDeathNotificationLocked(IBinder binder) {
+            try {
+                binder.linkToDeath(this, 0 /* flags */);
+                return true;
+            } catch (RemoteException e) {
+                return false;
+            }
+        }
+
+        /**
+         * Unlink death listener (i.e. callback) from binder.
+         */
+        public void unlinkFromListenerDeathNotificationLocked(IBinder binder) {
+            try {
+                binder.unlinkToDeath(this, 0 /* flags */);
+            } catch (NoSuchElementException e) {
+                // ignore
+            }
+        }
+    }
+}
diff --git a/services/core/java/com/android/server/location/LocationUsageLogger.java b/services/core/java/com/android/server/location/LocationUsageLogger.java
index 93e19df..b325deb 100644
--- a/services/core/java/com/android/server/location/LocationUsageLogger.java
+++ b/services/core/java/com/android/server/location/LocationUsageLogger.java
@@ -16,7 +16,7 @@
 
 package com.android.server.location;
 
-import static com.android.server.LocationManagerService.TAG;
+import static com.android.server.location.LocationManagerService.TAG;
 
 import android.app.ActivityManager;
 import android.location.Geofence;
diff --git a/services/core/java/com/android/server/location/SettingsHelper.java b/services/core/java/com/android/server/location/SettingsHelper.java
index 7ab258c..cbb06b8 100644
--- a/services/core/java/com/android/server/location/SettingsHelper.java
+++ b/services/core/java/com/android/server/location/SettingsHelper.java
@@ -26,8 +26,8 @@
 import static android.provider.Settings.Secure.LOCATION_MODE;
 import static android.provider.Settings.Secure.LOCATION_MODE_OFF;
 
-import static com.android.server.LocationManagerService.D;
-import static com.android.server.LocationManagerService.TAG;
+import static com.android.server.location.LocationManagerService.D;
+import static com.android.server.location.LocationManagerService.TAG;
 
 import android.app.ActivityManager;
 import android.content.Context;
diff --git a/services/core/java/com/android/server/location/UserInfoHelper.java b/services/core/java/com/android/server/location/UserInfoHelper.java
index 28f3f47..a3dcc40 100644
--- a/services/core/java/com/android/server/location/UserInfoHelper.java
+++ b/services/core/java/com/android/server/location/UserInfoHelper.java
@@ -18,8 +18,8 @@
 
 import static android.os.UserManager.DISALLOW_SHARE_LOCATION;
 
-import static com.android.server.LocationManagerService.D;
-import static com.android.server.LocationManagerService.TAG;
+import static com.android.server.location.LocationManagerService.D;
+import static com.android.server.location.LocationManagerService.TAG;
 
 import android.annotation.IntDef;
 import android.annotation.Nullable;
diff --git a/services/core/java/com/android/server/location/gnss/GnssManagerService.java b/services/core/java/com/android/server/location/gnss/GnssManagerService.java
index 711f45c..3c509c3 100644
--- a/services/core/java/com/android/server/location/gnss/GnssManagerService.java
+++ b/services/core/java/com/android/server/location/gnss/GnssManagerService.java
@@ -46,11 +46,11 @@
 import com.android.internal.util.IndentingPrintWriter;
 import com.android.internal.util.Preconditions;
 import com.android.server.LocalServices;
-import com.android.server.LocationManagerServiceUtils.LinkedListener;
-import com.android.server.LocationManagerServiceUtils.LinkedListenerBase;
 import com.android.server.location.AppForegroundHelper;
 import com.android.server.location.AppOpsHelper;
 import com.android.server.location.CallerIdentity;
+import com.android.server.location.LocationManagerServiceUtils.LinkedListener;
+import com.android.server.location.LocationManagerServiceUtils.LinkedListenerBase;
 import com.android.server.location.LocationUsageLogger;
 import com.android.server.location.RemoteListenerHelper;
 import com.android.server.location.SettingsHelper;
diff --git a/services/core/java/com/android/server/location/gnss/GnssNetworkConnectivityHandler.java b/services/core/java/com/android/server/location/gnss/GnssNetworkConnectivityHandler.java
index 3fb713b..e17cca4 100644
--- a/services/core/java/com/android/server/location/gnss/GnssNetworkConnectivityHandler.java
+++ b/services/core/java/com/android/server/location/gnss/GnssNetworkConnectivityHandler.java
@@ -17,8 +17,9 @@
 package com.android.server.location.gnss;
 
 import android.content.Context;
-import android.database.Cursor;
 import android.net.ConnectivityManager;
+import android.net.LinkAddress;
+import android.net.LinkProperties;
 import android.net.Network;
 import android.net.NetworkCapabilities;
 import android.net.NetworkInfo;
@@ -26,25 +27,26 @@
 import android.os.Handler;
 import android.os.Looper;
 import android.os.PowerManager;
-import android.provider.Telephony.Carriers;
-import android.telephony.ServiceState;
-import android.telephony.TelephonyManager;
+import android.telephony.PhoneStateListener;
+import android.telephony.PreciseCallState;
 import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
-import android.telephony.PreciseCallState;
-import android.telephony.PhoneStateListener;
+import android.telephony.TelephonyManager;
 import android.util.Log;
 
 import com.android.internal.location.GpsNetInitiatedHandler;
 
+import java.net.Inet4Address;
+import java.net.Inet6Address;
 import java.net.InetAddress;
 import java.net.UnknownHostException;
 import java.util.Arrays;
-import java.util.Map;
 import java.util.HashMap;
 import java.util.HashSet;
-import java.util.List;
 import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
 
 /**
  * Handles network connection requests and network state change updates for AGPS data download.
@@ -385,10 +387,10 @@
     private ConnectivityManager.NetworkCallback createSuplConnectivityCallback() {
         return new ConnectivityManager.NetworkCallback() {
             @Override
-            public void onAvailable(Network network) {
+            public void onLinkPropertiesChanged(Network network, LinkProperties linkProperties) {
                 if (DEBUG) Log.d(TAG, "SUPL network connection available.");
                 // Specific to a change to a SUPL enabled network becoming ready
-                handleSuplConnectionAvailable(network);
+                handleSuplConnectionAvailable(network, linkProperties);
             }
 
             @Override
@@ -496,7 +498,7 @@
         return networkAttributes;
     }
 
-    private void handleSuplConnectionAvailable(Network network) {
+    private void handleSuplConnectionAvailable(Network network, LinkProperties linkProperties) {
         // TODO: The synchronous method ConnectivityManager.getNetworkInfo() should not be called
         //       inside the asynchronous ConnectivityManager.NetworkCallback methods.
         NetworkInfo info = mConnMgr.getNetworkInfo(network);
@@ -528,7 +530,7 @@
                 setRouting();
             }
 
-            int apnIpType = getApnIpType(apn);
+            int apnIpType = getLinkIpType(linkProperties);
             if (DEBUG) {
                 String message = String.format(
                         "native_agps_data_conn_open: mAgpsApn=%s, mApnIpType=%s",
@@ -704,74 +706,32 @@
         }
     }
 
-    private int getApnIpType(String apn) {
+    private int getLinkIpType(LinkProperties linkProperties) {
         ensureInHandlerThread();
-        if (apn == null) {
-            return APN_INVALID;
-        }
-        TelephonyManager phone = (TelephonyManager)
-                mContext.getSystemService(Context.TELEPHONY_SERVICE);
-        // During an emergency call with an active sub id, get the Telephony Manager specific
-        // to the active sub to get the correct value from getServiceState and getNetworkType
-        if (mNiHandler.getInEmergency() && mActiveSubId >= 0) {
-            TelephonyManager subIdTelManager =
-                    phone.createForSubscriptionId(mActiveSubId);
-            if (subIdTelManager != null) {
-                phone = subIdTelManager;
+        boolean isIPv4 = false;
+        boolean isIPv6 = false;
+
+        List<LinkAddress> linkAddresses = linkProperties.getLinkAddresses();
+        for (LinkAddress linkAddress : linkAddresses) {
+            InetAddress inetAddress = linkAddress.getAddress();
+            if (inetAddress instanceof Inet4Address) {
+                isIPv4 = true;
+            } else if (inetAddress instanceof Inet6Address) {
+                isIPv6 = true;
             }
-        }
-        ServiceState serviceState = phone.getServiceState();
-        String projection = null;
-        String selection = null;
-
-        // Carrier configuration may override framework roaming state, we need to use the actual
-        // modem roaming state instead of the framework roaming state.
-        if (serviceState != null && serviceState.getDataRoamingFromRegistration()) {
-            projection = Carriers.ROAMING_PROTOCOL;
-        } else {
-            projection = Carriers.PROTOCOL;
-        }
-        // No SIM case for emergency
-        if (TelephonyManager.NETWORK_TYPE_UNKNOWN == phone.getNetworkType()
-                && AGPS_TYPE_EIMS == mAGpsType) {
-            selection = String.format(
-                "type like '%%emergency%%' and apn = '%s' and carrier_enabled = 1", apn);
-        } else {
-            selection = String.format("current = 1 and apn = '%s' and carrier_enabled = 1", apn);
-        }
-        try (Cursor cursor = mContext.getContentResolver().query(
-                Carriers.CONTENT_URI,
-                new String[]{projection},
-                selection,
-                null,
-                Carriers.DEFAULT_SORT_ORDER)) {
-            if (null != cursor && cursor.moveToFirst()) {
-                return translateToApnIpType(cursor.getString(0), apn);
-            } else {
-                Log.e(TAG, "No entry found in query for APN: " + apn);
-            }
-        } catch (Exception e) {
-            Log.e(TAG, "Error encountered on APN query for: " + apn, e);
+            if (DEBUG) Log.d(TAG, "LinkAddress : " + inetAddress.toString());
         }
 
-        return APN_IPV4V6;
-    }
-
-    private int translateToApnIpType(String ipProtocol, String apn) {
-        if ("IP".equals(ipProtocol)) {
-            return APN_IPV4;
-        }
-        if ("IPV6".equals(ipProtocol)) {
-            return APN_IPV6;
-        }
-        if ("IPV4V6".equals(ipProtocol)) {
+        if (isIPv4 && isIPv6) {
             return APN_IPV4V6;
         }
-
-        // we hit the default case so the ipProtocol is not recognized
-        String message = String.format("Unknown IP Protocol: %s, for APN: %s", ipProtocol, apn);
-        Log.e(TAG, message);
-        return APN_IPV4V6;
+        if (isIPv4) {
+            return APN_IPV4;
+        }
+        if (isIPv6) {
+            return APN_IPV6;
+        }
+        return APN_INVALID;
     }
 
     // AGPS support
diff --git a/services/core/java/com/android/server/location/gnss/GnssVisibilityControl.java b/services/core/java/com/android/server/location/gnss/GnssVisibilityControl.java
index 06fa0ea..75fd7dc 100644
--- a/services/core/java/com/android/server/location/gnss/GnssVisibilityControl.java
+++ b/services/core/java/com/android/server/location/gnss/GnssVisibilityControl.java
@@ -21,13 +21,13 @@
 import android.app.AppOpsManager;
 import android.app.Notification;
 import android.app.NotificationManager;
-import android.app.PendingIntent;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
+import android.hardware.gnss.visibility_control.V1_0.IGnssVisibilityControlCallback;
 import android.location.LocationManager;
 import android.os.Handler;
 import android.os.Looper;
@@ -39,12 +39,14 @@
 
 import com.android.internal.R;
 import com.android.internal.location.GpsNetInitiatedHandler;
+import com.android.internal.messages.nano.SystemMessageProto.SystemMessage;
 import com.android.internal.notification.SystemNotificationChannels;
 import com.android.internal.util.FrameworkStatsLog;
 
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 
 /**
  * Handles GNSS non-framework location access user visibility and control.
@@ -283,21 +285,22 @@
 
     // Represents NfwNotification structure in IGnssVisibilityControlCallback.hal
     private static class NfwNotification {
-        // These must match with NfwResponseType enum in IGnssVisibilityControlCallback.hal.
-        private static final byte NFW_RESPONSE_TYPE_REJECTED = 0;
-        private static final byte NFW_RESPONSE_TYPE_ACCEPTED_NO_LOCATION_PROVIDED = 1;
-        private static final byte NFW_RESPONSE_TYPE_ACCEPTED_LOCATION_PROVIDED = 2;
 
-        private final String mProxyAppPackageName;
-        private final byte mProtocolStack;
-        private final String mOtherProtocolStackName;
-        private final byte mRequestor;
-        private final String mRequestorId;
-        private final byte mResponseType;
-        private final boolean mInEmergencyMode;
-        private final boolean mIsCachedLocation;
+        // These must match with NfwResponseType enum in IGnssVisibilityControlCallback.hal
+        static final byte NFW_RESPONSE_TYPE_REJECTED = 0;
+        static final byte NFW_RESPONSE_TYPE_ACCEPTED_NO_LOCATION_PROVIDED = 1;
+        static final byte NFW_RESPONSE_TYPE_ACCEPTED_LOCATION_PROVIDED = 2;
 
-        private NfwNotification(String proxyAppPackageName, byte protocolStack,
+        final String mProxyAppPackageName;
+        final byte mProtocolStack;
+        final String mOtherProtocolStackName;
+        final byte mRequestor;
+        final String mRequestorId;
+        final byte mResponseType;
+        final boolean mInEmergencyMode;
+        final boolean mIsCachedLocation;
+
+        NfwNotification(String proxyAppPackageName, byte protocolStack,
                 String otherProtocolStackName, byte requestor, String requestorId,
                 byte responseType, boolean inEmergencyMode, boolean isCachedLocation) {
             mProxyAppPackageName = proxyAppPackageName;
@@ -610,43 +613,38 @@
         logEvent(nfwNotification, isPermissionMismatched);
 
         if (nfwNotification.isLocationProvided()) {
-            postEmergencyLocationUserNotification(nfwNotification);
+            displayNfwNotification(nfwNotification);
         }
     }
 
-    private void postEmergencyLocationUserNotification(NfwNotification nfwNotification) {
-        // Emulate deprecated IGnssNi.hal user notification of emergency NI requests.
-        NotificationManager notificationManager = (NotificationManager) mContext
-                .getSystemService(Context.NOTIFICATION_SERVICE);
-        if (notificationManager == null) {
-            Log.w(TAG, "Could not notify user of emergency location request. Notification: "
-                    + nfwNotification);
-            return;
+    private void displayNfwNotification(NfwNotification nfwNotification) {
+        NotificationManager notificationManager = Objects.requireNonNull(
+                mContext.getSystemService(NotificationManager.class));
+
+        String title = mContext.getString(R.string.gnss_nfw_notification_title);
+        String message;
+        if (nfwNotification.mRequestor == IGnssVisibilityControlCallback.NfwRequestor.CARRIER) {
+            message = mContext.getString(R.string.gnss_nfw_notification_message_carrier);
+        } else {
+            message = mContext.getString(R.string.gnss_nfw_notification_message_oem);
         }
 
-        notificationManager.notifyAsUser(/* tag= */ null, /* notificationId= */ 0,
-                createEmergencyLocationUserNotification(mContext), UserHandle.ALL);
-    }
-
-    private static Notification createEmergencyLocationUserNotification(Context context) {
-        // NOTE: Do not reuse the returned notification object as it will not reflect
-        //       changes to notification text when the system language is changed.
-        final String firstLineText = context.getString(R.string.gpsNotifTitle);
-        final String secondLineText =  context.getString(R.string.global_action_emergency);
-        final String accessibilityServicesText = firstLineText + " (" + secondLineText + ")";
-        return new Notification.Builder(context, SystemNotificationChannels.NETWORK_ALERTS)
-                .setSmallIcon(com.android.internal.R.drawable.stat_sys_gps_on)
-                .setWhen(0)
-                .setOngoing(false)
+        Notification.Builder builder = new Notification.Builder(mContext,
+                SystemNotificationChannels.NETWORK_ALERTS)
+                .setSmallIcon(R.drawable.stat_sys_gps_on)
+                .setCategory(Notification.CATEGORY_SYSTEM)
+                .setVisibility(Notification.VISIBILITY_SECRET)
+                .setContentTitle(title)
+                .setTicker(title)
+                .setContentText(message)
+                .setStyle(new Notification.BigTextStyle().bigText(message))
                 .setAutoCancel(true)
-                .setColor(context.getColor(
-                        com.android.internal.R.color.system_notification_accent_color))
-                .setDefaults(0)
-                .setTicker(accessibilityServicesText)
-                .setContentTitle(firstLineText)
-                .setContentText(secondLineText)
-                .setContentIntent(PendingIntent.getBroadcast(context, 0, new Intent(), 0))
-                .build();
+                .setColor(mContext.getColor(R.color.system_notification_accent_color))
+                .setWhen(System.currentTimeMillis())
+                .setShowWhen(true)
+                .setDefaults(0);
+
+        notificationManager.notify(SystemMessage.NOTE_GNSS_NFW_LOCATION_ACCESS, builder.build());
     }
 
     private void logEvent(NfwNotification notification, boolean isPermissionMismatched) {
diff --git a/services/core/java/com/android/server/locksettings/LockSettingsService.java b/services/core/java/com/android/server/locksettings/LockSettingsService.java
index 9297a43..7972f24 100644
--- a/services/core/java/com/android/server/locksettings/LockSettingsService.java
+++ b/services/core/java/com/android/server/locksettings/LockSettingsService.java
@@ -366,10 +366,15 @@
         if (mStorage.hasChildProfileLock(managedUserId)) {
             return;
         }
-        // Do not tie it to parent when parent does not have a screen lock
+        // If parent does not have a screen lock, simply clear credential from the managed profile,
+        // to maintain the invariant that unified profile should always have the same secure state
+        // as its parent.
         final int parentId = mUserManager.getProfileParent(managedUserId).id;
-        if (!isUserSecure(parentId)) {
-            if (DEBUG) Slog.v(TAG, "Parent does not have a screen lock");
+        if (!isUserSecure(parentId) && !managedUserPassword.isNone()) {
+            if (DEBUG) Slog.v(TAG, "Parent does not have a screen lock but profile has one");
+
+            setLockCredentialInternal(LockscreenCredential.createNone(), managedUserPassword,
+                    managedUserId, /* isLockTiedToParent= */ true);
             return;
         }
         // Do not tie when the parent has no SID (but does have a screen lock).
@@ -3161,6 +3166,21 @@
         return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(timestamp));
     }
 
+    private static String credentialTypeToString(int credentialType) {
+        switch (credentialType) {
+            case CREDENTIAL_TYPE_NONE:
+                return "None";
+            case CREDENTIAL_TYPE_PATTERN:
+                return "Pattern";
+            case CREDENTIAL_TYPE_PIN:
+                return "Pin";
+            case CREDENTIAL_TYPE_PASSWORD:
+                return "Password";
+            default:
+                return "Unknown " + credentialType;
+        }
+    }
+
     @Override
     protected void dump(FileDescriptor fd, PrintWriter printWriter, String[] args) {
         if (!DumpUtils.checkDumpPermission(mContext, TAG, printWriter)) return;
@@ -3192,7 +3212,8 @@
             // It's OK to dump the password type since anyone with physical access can just
             // observe it from the keyguard directly.
             pw.println("Quality: " + getKeyguardStoredQuality(userId));
-            pw.println("CredentialType: " + getCredentialTypeInternal(userId));
+            pw.println("CredentialType: " + credentialTypeToString(
+                    getCredentialTypeInternal(userId)));
             pw.println("SeparateChallenge: " + getSeparateProfileChallengeEnabledInternal(userId));
             pw.println(String.format("Metrics: %s",
                     getUserPasswordMetrics(userId) != null ? "known" : "unknown"));
diff --git a/services/core/java/com/android/server/locksettings/LockSettingsStrongAuth.java b/services/core/java/com/android/server/locksettings/LockSettingsStrongAuth.java
index fbee6f4..8480197 100644
--- a/services/core/java/com/android/server/locksettings/LockSettingsStrongAuth.java
+++ b/services/core/java/com/android/server/locksettings/LockSettingsStrongAuth.java
@@ -26,6 +26,7 @@
 import android.app.trust.IStrongAuthTracker;
 import android.content.Context;
 import android.os.Handler;
+import android.os.Looper;
 import android.os.Message;
 import android.os.RemoteCallbackList;
 import android.os.RemoteException;
@@ -36,6 +37,7 @@
 import android.util.SparseBooleanArray;
 import android.util.SparseIntArray;
 
+import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.util.IndentingPrintWriter;
 import com.android.internal.widget.LockPatternUtils.StrongAuthTracker;
 
@@ -57,11 +59,14 @@
     private static final int MSG_STRONG_BIOMETRIC_UNLOCK = 8;
     private static final int MSG_SCHEDULE_NON_STRONG_BIOMETRIC_IDLE_TIMEOUT = 9;
 
-    private static final String STRONG_AUTH_TIMEOUT_ALARM_TAG =
+    @VisibleForTesting
+    protected static final String STRONG_AUTH_TIMEOUT_ALARM_TAG =
             "LockSettingsStrongAuth.timeoutForUser";
-    private static final String NON_STRONG_BIOMETRIC_TIMEOUT_ALARM_TAG =
+    @VisibleForTesting
+    protected static final String NON_STRONG_BIOMETRIC_TIMEOUT_ALARM_TAG =
             "LockSettingsPrimaryAuth.nonStrongBiometricTimeoutForUser";
-    private static final String NON_STRONG_BIOMETRIC_IDLE_TIMEOUT_ALARM_TAG =
+    @VisibleForTesting
+    protected static final String NON_STRONG_BIOMETRIC_IDLE_TIMEOUT_ALARM_TAG =
             "LockSettingsPrimaryAuth.nonStrongBiometricIdleTimeoutForUser";
 
     /**
@@ -73,28 +78,71 @@
             4 * 60 * 60 * 1000; // 4h
 
     private final RemoteCallbackList<IStrongAuthTracker> mTrackers = new RemoteCallbackList<>();
-    private final SparseIntArray mStrongAuthForUser = new SparseIntArray();
-    private final SparseBooleanArray mIsNonStrongBiometricAllowedForUser = new SparseBooleanArray();
-    private final ArrayMap<Integer, StrongAuthTimeoutAlarmListener>
+    @VisibleForTesting
+    protected final SparseIntArray mStrongAuthForUser = new SparseIntArray();
+    @VisibleForTesting
+    protected final SparseBooleanArray mIsNonStrongBiometricAllowedForUser =
+            new SparseBooleanArray();
+    @VisibleForTesting
+    protected final ArrayMap<Integer, StrongAuthTimeoutAlarmListener>
             mStrongAuthTimeoutAlarmListenerForUser = new ArrayMap<>();
     // Track non-strong biometric timeout
-    private final ArrayMap<Integer, NonStrongBiometricTimeoutAlarmListener>
+    @VisibleForTesting
+    protected final ArrayMap<Integer, NonStrongBiometricTimeoutAlarmListener>
             mNonStrongBiometricTimeoutAlarmListener = new ArrayMap<>();
     // Track non-strong biometric idle timeout
-    private final ArrayMap<Integer, NonStrongBiometricIdleTimeoutAlarmListener>
+    @VisibleForTesting
+    protected final ArrayMap<Integer, NonStrongBiometricIdleTimeoutAlarmListener>
             mNonStrongBiometricIdleTimeoutAlarmListener = new ArrayMap<>();
 
     private final int mDefaultStrongAuthFlags;
     private final boolean mDefaultIsNonStrongBiometricAllowed = true;
 
     private final Context mContext;
-
-    private AlarmManager mAlarmManager;
+    private final Injector mInjector;
+    private final AlarmManager mAlarmManager;
 
     public LockSettingsStrongAuth(Context context) {
+        this(context, new Injector());
+    }
+
+    @VisibleForTesting
+    protected LockSettingsStrongAuth(Context context, Injector injector) {
         mContext = context;
-        mDefaultStrongAuthFlags = StrongAuthTracker.getDefaultFlags(context);
-        mAlarmManager = context.getSystemService(AlarmManager.class);
+        mInjector = injector;
+        mDefaultStrongAuthFlags = mInjector.getDefaultStrongAuthFlags(context);
+        mAlarmManager = mInjector.getAlarmManager(context);
+    }
+
+    /**
+     * Class for injecting dependencies into LockSettingsStrongAuth.
+     */
+    @VisibleForTesting
+    public static class Injector {
+
+        /**
+         * Allows to mock AlarmManager for testing.
+         */
+        @VisibleForTesting
+        public AlarmManager getAlarmManager(Context context) {
+            return context.getSystemService(AlarmManager.class);
+        }
+
+        /**
+         * Allows to get different default StrongAuthFlags for testing.
+         */
+        @VisibleForTesting
+        public int getDefaultStrongAuthFlags(Context context) {
+            return StrongAuthTracker.getDefaultFlags(context);
+        }
+
+        /**
+         * Allows to get different triggerAtMillis values when setting alarms for testing.
+         */
+        @VisibleForTesting
+        public long getNextAlarmTimeMs(long timeout) {
+            return SystemClock.elapsedRealtime() + timeout;
+        }
     }
 
     private void handleAddStrongAuthTracker(IStrongAuthTracker tracker) {
@@ -186,7 +234,8 @@
     private void handleScheduleStrongAuthTimeout(int userId) {
         final DevicePolicyManager dpm =
                 (DevicePolicyManager) mContext.getSystemService(Context.DEVICE_POLICY_SERVICE);
-        long when = SystemClock.elapsedRealtime() + dpm.getRequiredStrongAuthTimeout(null, userId);
+        long nextAlarmTime =
+                mInjector.getNextAlarmTimeMs(dpm.getRequiredStrongAuthTimeout(null, userId));
         // cancel current alarm listener for the user (if there was one)
         StrongAuthTimeoutAlarmListener alarm = mStrongAuthTimeoutAlarmListenerForUser.get(userId);
         if (alarm != null) {
@@ -196,8 +245,8 @@
             mStrongAuthTimeoutAlarmListenerForUser.put(userId, alarm);
         }
         // schedule a new alarm listener for the user
-        mAlarmManager.set(AlarmManager.ELAPSED_REALTIME, when, STRONG_AUTH_TIMEOUT_ALARM_TAG,
-                alarm, mHandler);
+        mAlarmManager.set(AlarmManager.ELAPSED_REALTIME, nextAlarmTime,
+                STRONG_AUTH_TIMEOUT_ALARM_TAG, alarm, mHandler);
 
         // cancel current non-strong biometric alarm listener for the user (if there was one)
         cancelNonStrongBiometricAlarmListener(userId);
@@ -209,7 +258,7 @@
 
     private void handleScheduleNonStrongBiometricTimeout(int userId) {
         if (DEBUG) Slog.d(TAG, "handleScheduleNonStrongBiometricTimeout for userId=" + userId);
-        long when = SystemClock.elapsedRealtime() + DEFAULT_NON_STRONG_BIOMETRIC_TIMEOUT_MS;
+        long nextAlarmTime = mInjector.getNextAlarmTimeMs(DEFAULT_NON_STRONG_BIOMETRIC_TIMEOUT_MS);
         NonStrongBiometricTimeoutAlarmListener alarm = mNonStrongBiometricTimeoutAlarmListener
                 .get(userId);
         if (alarm != null) {
@@ -226,7 +275,7 @@
             alarm = new NonStrongBiometricTimeoutAlarmListener(userId);
             mNonStrongBiometricTimeoutAlarmListener.put(userId, alarm);
             // schedule a new alarm listener for the user
-            mAlarmManager.set(AlarmManager.ELAPSED_REALTIME, when,
+            mAlarmManager.set(AlarmManager.ELAPSED_REALTIME, nextAlarmTime,
                     NON_STRONG_BIOMETRIC_TIMEOUT_ALARM_TAG, alarm, mHandler);
         }
 
@@ -268,7 +317,8 @@
         }
     }
 
-    private void setIsNonStrongBiometricAllowed(boolean allowed, int userId) {
+    @VisibleForTesting
+    protected void setIsNonStrongBiometricAllowed(boolean allowed, int userId) {
         if (DEBUG) {
             Slog.d(TAG, "setIsNonStrongBiometricAllowed for allowed=" + allowed
                     + ", userId=" + userId);
@@ -302,7 +352,8 @@
 
     private void handleScheduleNonStrongBiometricIdleTimeout(int userId) {
         if (DEBUG) Slog.d(TAG, "handleScheduleNonStrongBiometricIdleTimeout for userId=" + userId);
-        long when = SystemClock.elapsedRealtime() + DEFAULT_NON_STRONG_BIOMETRIC_IDLE_TIMEOUT_MS;
+        long nextAlarmTime =
+                mInjector.getNextAlarmTimeMs(DEFAULT_NON_STRONG_BIOMETRIC_IDLE_TIMEOUT_MS);
         // cancel current alarm listener for the user (if there was one)
         NonStrongBiometricIdleTimeoutAlarmListener alarm =
                 mNonStrongBiometricIdleTimeoutAlarmListener.get(userId);
@@ -315,7 +366,7 @@
         }
         // schedule a new alarm listener for the user
         if (DEBUG) Slog.d(TAG, "Schedule a new alarm for non-strong biometric idle timeout");
-        mAlarmManager.set(AlarmManager.ELAPSED_REALTIME, when,
+        mAlarmManager.set(AlarmManager.ELAPSED_REALTIME, nextAlarmTime,
                 NON_STRONG_BIOMETRIC_IDLE_TIMEOUT_ALARM_TAG, alarm, mHandler);
     }
 
@@ -435,7 +486,8 @@
     /**
      * Alarm of fallback timeout for primary auth
      */
-    private class StrongAuthTimeoutAlarmListener implements OnAlarmListener {
+    @VisibleForTesting
+    protected class StrongAuthTimeoutAlarmListener implements OnAlarmListener {
 
         private final int mUserId;
 
@@ -452,7 +504,8 @@
     /**
      * Alarm of fallback timeout for non-strong biometric (i.e. weak or convenience)
      */
-    private class NonStrongBiometricTimeoutAlarmListener implements OnAlarmListener {
+    @VisibleForTesting
+    protected class NonStrongBiometricTimeoutAlarmListener implements OnAlarmListener {
 
         private final int mUserId;
 
@@ -469,7 +522,8 @@
     /**
      * Alarm of idle timeout for non-strong biometric (i.e. weak or convenience biometric)
      */
-    private class NonStrongBiometricIdleTimeoutAlarmListener implements OnAlarmListener {
+    @VisibleForTesting
+    protected class NonStrongBiometricIdleTimeoutAlarmListener implements OnAlarmListener {
 
         private final int mUserId;
 
@@ -484,7 +538,8 @@
         }
     }
 
-    private final Handler mHandler = new Handler() {
+    @VisibleForTesting
+    protected final Handler mHandler = new Handler(Looper.getMainLooper()) {
         @Override
         public void handleMessage(Message msg) {
             switch (msg.what) {
diff --git a/services/core/java/com/android/server/media/BluetoothRouteProvider.java b/services/core/java/com/android/server/media/BluetoothRouteProvider.java
index 28f8380..3cf22c8 100644
--- a/services/core/java/com/android/server/media/BluetoothRouteProvider.java
+++ b/services/core/java/com/android/server/media/BluetoothRouteProvider.java
@@ -215,7 +215,6 @@
                 .setConnectionState(MediaRoute2Info.CONNECTION_STATE_DISCONNECTED)
                 .setDescription(mContext.getResources().getText(
                         R.string.bluetooth_a2dp_audio_route_name).toString())
-                //TODO: Set type correctly (BLUETOOTH_A2DP or HEARING_AID)
                 .setType(MediaRoute2Info.TYPE_BLUETOOTH_A2DP)
                 .setVolumeHandling(MediaRoute2Info.PLAYBACK_VOLUME_VARIABLE)
                 .build();
@@ -236,6 +235,8 @@
         // Update volume when the connection state is changed.
         MediaRoute2Info.Builder builder = new MediaRoute2Info.Builder(btRoute.route)
                 .setConnectionState(state);
+        builder.setType(btRoute.connectedProfiles.get(BluetoothProfile.HEARING_AID, false)
+                ? MediaRoute2Info.TYPE_HEARING_AID : MediaRoute2Info.TYPE_BLUETOOTH_A2DP);
 
         if (state == MediaRoute2Info.CONNECTION_STATE_CONNECTED) {
             int maxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
diff --git a/services/core/java/com/android/server/media/MediaKeyDispatcher.java b/services/core/java/com/android/server/media/MediaKeyDispatcher.java
index e0efd8a..0b96978 100644
--- a/services/core/java/com/android/server/media/MediaKeyDispatcher.java
+++ b/services/core/java/com/android/server/media/MediaKeyDispatcher.java
@@ -16,24 +16,64 @@
 
 package com.android.server.media;
 
+import android.annotation.IntDef;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.media.session.ISessionManager;
 import android.media.session.MediaSession;
 import android.os.Binder;
 import android.view.KeyEvent;
+import android.view.ViewConfiguration;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.util.HashMap;
+import java.util.Map;
 
 /**
  * Provides a way to customize behavior for media key events.
- *
+ * <p>
+ * In order to override the implementation of the single/double/triple click or long press,
+ * {@link #setOverriddenKeyEvents(int, int)} should be called for each key code with the
+ * overridden {@link KeyEventType} bit value set, and the corresponding method,
+ * {@link #onSingleClick(KeyEvent)}, {@link #onDoubleClick(KeyEvent)},
+ * {@link #onTripleClick(KeyEvent)}, {@link #onLongPress(KeyEvent)} should be implemented.
+ * <p>
  * Note: When instantiating this class, {@link MediaSessionService} will only use the constructor
  * without any parameters.
  */
+// TODO: Change API names from using "click" to "tap"
+// TODO: Move this class to apex/media/
 public abstract class MediaKeyDispatcher {
+    @IntDef(flag = true, value = {
+            KEY_EVENT_SINGLE_CLICK,
+            KEY_EVENT_DOUBLE_CLICK,
+            KEY_EVENT_TRIPLE_CLICK,
+            KEY_EVENT_LONG_PRESS
+    })
+    @Retention(RetentionPolicy.SOURCE)
+    @interface KeyEventType {}
+    static final int KEY_EVENT_SINGLE_CLICK = 1 << 0;
+    static final int KEY_EVENT_DOUBLE_CLICK = 1 << 1;
+    static final int KEY_EVENT_TRIPLE_CLICK = 1 << 2;
+    static final int KEY_EVENT_LONG_PRESS = 1 << 3;
+
+    private Map<Integer, Integer> mOverriddenKeyEvents;
+
     public MediaKeyDispatcher() {
         // Constructor used for reflection
+        mOverriddenKeyEvents = new HashMap<>();
+        mOverriddenKeyEvents.put(KeyEvent.KEYCODE_MEDIA_PLAY, 0);
+        mOverriddenKeyEvents.put(KeyEvent.KEYCODE_MEDIA_PAUSE, 0);
+        mOverriddenKeyEvents.put(KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE, 0);
+        mOverriddenKeyEvents.put(KeyEvent.KEYCODE_MUTE, 0);
+        mOverriddenKeyEvents.put(KeyEvent.KEYCODE_HEADSETHOOK, 0);
+        mOverriddenKeyEvents.put(KeyEvent.KEYCODE_MEDIA_STOP, 0);
+        mOverriddenKeyEvents.put(KeyEvent.KEYCODE_MEDIA_NEXT, 0);
+        mOverriddenKeyEvents.put(KeyEvent.KEYCODE_MEDIA_PREVIOUS, 0);
     }
 
+    // TODO: Move this method into SessionPolicyProvider.java for better readability.
     /**
      * Implement this to customize the logic for which MediaSession should consume which key event.
      *
@@ -49,4 +89,137 @@
             boolean asSystemService) {
         return null;
     }
+
+    /**
+     * Gets the map of key code -> {@link KeyEventType} that have been overridden.
+     * <p>
+     * The list of valid key codes are the following:
+     * <ul>
+     * <li> {@link KeyEvent#KEYCODE_MEDIA_PLAY}
+     * <li> {@link KeyEvent#KEYCODE_MEDIA_PAUSE}
+     * <li> {@link KeyEvent#KEYCODE_MEDIA_PLAY_PAUSE}
+     * <li> {@link KeyEvent#KEYCODE_MUTE}
+     * <li> {@link KeyEvent#KEYCODE_HEADSETHOOK}
+     * <li> {@link KeyEvent#KEYCODE_MEDIA_STOP}
+     * <li> {@link KeyEvent#KEYCODE_MEDIA_NEXT}
+     * <li> {@link KeyEvent#KEYCODE_MEDIA_PREVIOUS}
+     * </ul>
+     * @see {@link KeyEvent#isMediaSessionKey(int)}
+     */
+    @KeyEventType Map<Integer, Integer> getOverriddenKeyEvents() {
+        return mOverriddenKeyEvents;
+    }
+
+    static boolean isSingleClickOverridden(@KeyEventType int overriddenKeyEvents) {
+        return (overriddenKeyEvents & MediaKeyDispatcher.KEY_EVENT_SINGLE_CLICK) != 0;
+    }
+
+    static boolean isDoubleClickOverridden(@KeyEventType int overriddenKeyEvents) {
+        return (overriddenKeyEvents & MediaKeyDispatcher.KEY_EVENT_DOUBLE_CLICK) != 0;
+    }
+
+    static boolean isTripleClickOverridden(@KeyEventType int overriddenKeyEvents) {
+        return (overriddenKeyEvents & MediaKeyDispatcher.KEY_EVENT_TRIPLE_CLICK) != 0;
+    }
+
+    static boolean isLongPressOverridden(@KeyEventType int overriddenKeyEvents) {
+        return (overriddenKeyEvents & MediaKeyDispatcher.KEY_EVENT_LONG_PRESS) != 0;
+    }
+
+    /**
+     * Sets the value of the given key event type flagged with overridden {@link KeyEventType} to
+     * the given key code. If called multiple times for the same key code, will be overwritten to
+     * the most recently called {@link KeyEventType} value.
+     * <p>
+     * The list of valid key codes are the following:
+     * <ul>
+     * <li> {@link KeyEvent#KEYCODE_MEDIA_PLAY}
+     * <li> {@link KeyEvent#KEYCODE_MEDIA_PAUSE}
+     * <li> {@link KeyEvent#KEYCODE_MEDIA_PLAY_PAUSE}
+     * <li> {@link KeyEvent#KEYCODE_MUTE}
+     * <li> {@link KeyEvent#KEYCODE_HEADSETHOOK}
+     * <li> {@link KeyEvent#KEYCODE_MEDIA_STOP}
+     * <li> {@link KeyEvent#KEYCODE_MEDIA_NEXT}
+     * <li> {@link KeyEvent#KEYCODE_MEDIA_PREVIOUS}
+     * </ul>
+     * @see {@link KeyEvent#isMediaSessionKey(int)}
+     * @param keyCode
+     */
+    void setOverriddenKeyEvents(int keyCode, @KeyEventType int keyEventType) {
+        mOverriddenKeyEvents.put(keyCode, keyEventType);
+    }
+
+    /**
+     * Customized implementation for single click event. Will be run if
+     * {@link #KEY_EVENT_SINGLE_CLICK} flag is on for the corresponding key code from
+     * {@link #getOverriddenKeyEvents()}.
+     *
+     * It is considered a single click if only one {@link KeyEvent} with the same
+     * {@link KeyEvent#getKeyCode()} is dispatched within
+     * {@link ViewConfiguration#getMultiPressTimeout()} milliseconds. Change the
+     * {@link android.provider.Settings.Secure#MULTI_PRESS_TIMEOUT} value to adjust the interval.
+     *
+     * Note: This will only be called once with the {@link KeyEvent#ACTION_UP} KeyEvent.
+     *
+     * @param keyEvent
+     */
+    void onSingleClick(KeyEvent keyEvent) {
+    }
+
+    /**
+     * Customized implementation for double click event. Will be run if
+     * {@link #KEY_EVENT_DOUBLE_CLICK} flag is on for the corresponding key code from
+     * {@link #getOverriddenKeyEvents()}.
+     *
+     * It is considered a double click if two {@link KeyEvent}s with the same
+     * {@link KeyEvent#getKeyCode()} are dispatched within
+     * {@link ViewConfiguration#getMultiPressTimeout()} milliseconds of each other. Change the
+     * {@link android.provider.Settings.Secure#MULTI_PRESS_TIMEOUT} value to adjust the interval.
+     *
+     * Note: This will only be called once with the {@link KeyEvent#ACTION_UP} KeyEvent.
+     *
+     * @param keyEvent
+     */
+    void onDoubleClick(KeyEvent keyEvent) {
+    }
+
+    /**
+     * Customized implementation for triple click event. Will be run if
+     * {@link #KEY_EVENT_TRIPLE_CLICK} flag is on for the corresponding key code from
+     * {@link #getOverriddenKeyEvents()}.
+     *
+     * It is considered a triple click if three {@link KeyEvent}s with the same
+     * {@link KeyEvent#getKeyCode()} are dispatched within
+     * {@link ViewConfiguration#getMultiPressTimeout()} milliseconds of each other. Change the
+     * {@link android.provider.Settings.Secure#MULTI_PRESS_TIMEOUT} value to adjust the interval.
+     *
+     * Note: This will only be called once with the {@link KeyEvent#ACTION_UP} KeyEvent.
+     *
+     * @param keyEvent
+     */
+    void onTripleClick(KeyEvent keyEvent) {
+    }
+
+    /**
+     * Customized implementation for long press event. Will be run if
+     * {@link #KEY_EVENT_LONG_PRESS} flag is on for the corresponding key code from
+     * {@link #getOverriddenKeyEvents()}.
+     *
+     * It is considered a long press if an {@link KeyEvent#ACTION_DOWN} key event is followed by
+     * another {@link KeyEvent#ACTION_DOWN} key event with {@link KeyEvent#FLAG_LONG_PRESS}
+     * enabled, and an {@link KeyEvent#getRepeatCount()} that is equal to 1.
+     *
+     * Note: This will be called for the following key events:
+     * <ul>
+     *   <li>A {@link KeyEvent#ACTION_DOWN} KeyEvent with {@link KeyEvent#FLAG_LONG_PRESS} and
+     *   {@link KeyEvent#getRepeatCount()} equal to 1</li>
+     *   <li>Multiple {@link KeyEvent#ACTION_DOWN} KeyEvents with increasing
+     *   {@link KeyEvent#getRepeatCount()}</li>
+     *   <li>A {@link KeyEvent#ACTION_UP} KeyEvent</li>
+     * </ul>
+     *
+     * @param keyEvent
+     */
+    void onLongPress(KeyEvent keyEvent) {
+    }
 }
diff --git a/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java b/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java
index c3413e8..d8bf9ed 100644
--- a/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java
+++ b/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java
@@ -16,6 +16,8 @@
 
 package com.android.server.media;
 
+import static android.media.MediaRoute2ProviderService.REASON_ROUTE_NOT_AVAILABLE;
+import static android.media.MediaRoute2ProviderService.REASON_UNKNOWN_ERROR;
 import static android.media.MediaRoute2ProviderService.REQUEST_ID_NONE;
 import static android.media.MediaRouter2Utils.getOriginalId;
 import static android.media.MediaRouter2Utils.getProviderId;
@@ -247,6 +249,22 @@
         }
     }
 
+    public void notifySessionHintsForCreatingSession(IMediaRouter2 router,
+            long uniqueRequestId, MediaRoute2Info route, Bundle sessionHints) {
+        Objects.requireNonNull(router, "router must not be null");
+        Objects.requireNonNull(route, "route must not be null");
+
+        final long token = Binder.clearCallingIdentity();
+        try {
+            synchronized (mLock) {
+                notifySessionHintsForCreatingSessionLocked(uniqueRequestId,
+                        router, route, sessionHints);
+            }
+        } finally {
+            Binder.restoreCallingIdentity(token);
+        }
+    }
+
     public void selectRouteWithRouter2(IMediaRouter2 router, String uniqueSessionId,
             MediaRoute2Info route) {
         Objects.requireNonNull(router, "router must not be null");
@@ -265,7 +283,6 @@
         }
     }
 
-
     public void deselectRouteWithRouter2(IMediaRouter2 router, String uniqueSessionId,
             MediaRoute2Info route) {
         Objects.requireNonNull(router, "router must not be null");
@@ -622,14 +639,42 @@
             return;
         }
 
+        if (route.isSystemRoute() && !routerRecord.mHasModifyAudioRoutingPermission
+                && !TextUtils.equals(route.getId(),
+                routerRecord.mUserRecord.mHandler.mSystemProvider.getDefaultRoute().getId())) {
+            Slog.w(TAG, "MODIFY_AUDIO_ROUTING permission is required to transfer to"
+                    + route);
+            routerRecord.mUserRecord.mHandler.notifySessionCreationFailedToRouter(
+                    routerRecord, requestId);
+            return;
+        }
+
         long uniqueRequestId = toUniqueRequestId(routerRecord.mRouterId, requestId);
         routerRecord.mUserRecord.mHandler.sendMessage(
-                obtainMessage(UserHandler::requestCreateSessionOnHandler,
+                obtainMessage(UserHandler::requestCreateSessionWithRouter2OnHandler,
                         routerRecord.mUserRecord.mHandler,
-                        uniqueRequestId, routerRecord, /* managerRecord= */ null, route,
+                        uniqueRequestId, routerRecord, route,
                         sessionHints));
     }
 
+    private void notifySessionHintsForCreatingSessionLocked(long uniqueRequestId,
+            @NonNull IMediaRouter2 router,
+            @NonNull MediaRoute2Info route, @Nullable Bundle sessionHints) {
+        final IBinder binder = router.asBinder();
+        final RouterRecord routerRecord = mAllRouterRecords.get(binder);
+
+        if (routerRecord == null) {
+            Slog.w(TAG, "requestCreateSessionWithRouter2ByManagerRequestLocked: "
+                    + "Ignoring unknown router.");
+            return;
+        }
+
+        routerRecord.mUserRecord.mHandler.sendMessage(
+                obtainMessage(UserHandler::requestCreateSessionWithManagerOnHandler,
+                        routerRecord.mUserRecord.mHandler,
+                        uniqueRequestId, routerRecord, route, sessionHints));
+    }
+
     private void selectRouteWithRouter2Locked(@NonNull IMediaRouter2 router,
             @NonNull String uniqueSessionId, @NonNull MediaRoute2Info route) {
         final IBinder binder = router.asBinder();
@@ -816,12 +861,13 @@
         }
 
         long uniqueRequestId = toUniqueRequestId(managerRecord.mManagerId, requestId);
-        //TODO(b/152851868): Use MediaRouter2's OnCreateSessionListener to send session hints.
+
+        // Before requesting to the provider, get session hints from the media router.
+        // As a return, media router will request to create a session.
         routerRecord.mUserRecord.mHandler.sendMessage(
-                obtainMessage(UserHandler::requestCreateSessionOnHandler,
+                obtainMessage(UserHandler::getSessionHintsForCreatingSessionOnHandler,
                         routerRecord.mUserRecord.mHandler,
-                        uniqueRequestId, routerRecord, managerRecord, route,
-                        /* sessionHints= */ null));
+                        uniqueRequestId, routerRecord, managerRecord, route));
     }
 
     private void selectRouteWithManagerLocked(int requestId, @NonNull IMediaRouter2Manager manager,
@@ -915,9 +961,6 @@
 
         RouterRecord routerRecord = managerRecord.mUserRecord.mHandler
                 .findRouterforSessionLocked(uniqueSessionId);
-        if (routerRecord == null) {
-            return;
-        }
 
         long uniqueRequestId = toUniqueRequestId(managerRecord.mManagerId, requestId);
         managerRecord.mUserRecord.mHandler.sendMessage(
@@ -1142,7 +1185,6 @@
                     this, provider, uniqueRequestId, sessionInfo));
         }
 
-
         @Override
         public void onSessionUpdated(@NonNull MediaRoute2Provider provider,
                 @NonNull RoutingSessionInfo sessionInfo) {
@@ -1260,8 +1302,26 @@
             return -1;
         }
 
-        private void requestCreateSessionOnHandler(long uniqueRequestId,
-                @NonNull RouterRecord routerRecord, @Nullable ManagerRecord managerRecord,
+        private void getSessionHintsForCreatingSessionOnHandler(long uniqueRequestId,
+                @NonNull RouterRecord routerRecord, @NonNull ManagerRecord managerRecord,
+                @NonNull MediaRoute2Info route) {
+            SessionCreationRequest request =
+                    new SessionCreationRequest(routerRecord, uniqueRequestId, route, managerRecord);
+            mSessionCreationRequests.add(request);
+
+            try {
+                routerRecord.mRouter.getSessionHintsForCreatingSession(uniqueRequestId, route);
+            } catch (RemoteException ex) {
+                Slog.w(TAG, "requestGetSessionHintsOnHandler: "
+                        + "Failed to request. Router probably died.");
+                mSessionCreationRequests.remove(request);
+                notifyRequestFailedToManager(managerRecord.mManager,
+                        toOriginalRequestId(uniqueRequestId), REASON_UNKNOWN_ERROR);
+            }
+        }
+
+        private void requestCreateSessionWithRouter2OnHandler(long uniqueRequestId,
+                @NonNull RouterRecord routerRecord,
                 @NonNull MediaRoute2Info route, @Nullable Bundle sessionHints) {
 
             final MediaRoute2Provider provider = findProvider(route.getProviderId());
@@ -1272,19 +1332,47 @@
                         toOriginalRequestId(uniqueRequestId));
                 return;
             }
-            if (route.isSystemRoute() && !routerRecord.mHasModifyAudioRoutingPermission
-                    && !TextUtils.equals(route.getId(),
-                            mSystemProvider.getDefaultRoute().getId())) {
-                Slog.w(TAG, "MODIFY_AUDIO_ROUTING permission is required to transfer to"
-                        + route);
-                notifySessionCreationFailedToRouter(routerRecord,
-                        toOriginalRequestId(uniqueRequestId));
+
+            SessionCreationRequest request =
+                    new SessionCreationRequest(routerRecord, uniqueRequestId, route, null);
+            mSessionCreationRequests.add(request);
+
+            provider.requestCreateSession(uniqueRequestId, routerRecord.mPackageName,
+                    route.getOriginalId(), sessionHints);
+        }
+
+        private void requestCreateSessionWithManagerOnHandler(long uniqueRequestId,
+                @NonNull RouterRecord routerRecord,
+                @NonNull MediaRoute2Info route, @Nullable Bundle sessionHints) {
+            SessionCreationRequest matchingRequest = null;
+            for (SessionCreationRequest request : mSessionCreationRequests) {
+                if (request.mUniqueRequestId == uniqueRequestId) {
+                    matchingRequest = request;
+                    break;
+                }
+            }
+            if (matchingRequest == null) {
+                Slog.w(TAG, "requestCreateSessionWithKnownRequestOnHandler: "
+                        + "Ignoring an unknown request.");
                 return;
             }
 
-            SessionCreationRequest request =
-                    new SessionCreationRequest(routerRecord, uniqueRequestId, route, managerRecord);
-            mSessionCreationRequests.add(request);
+            if (!TextUtils.equals(matchingRequest.mRoute.getId(), route.getId())) {
+                Slog.w(TAG, "requestCreateSessionWithKnownRequestOnHandler: "
+                        + "The given route is different from the requested route.");
+                return;
+            }
+
+            final MediaRoute2Provider provider = findProvider(route.getProviderId());
+            if (provider == null) {
+                Slog.w(TAG, "Ignoring session creation request since no provider found for"
+                        + " given route=" + route);
+
+                mSessionCreationRequests.remove(matchingRequest);
+                notifyRequestFailedToManager(matchingRequest.mRequestedManagerRecord.mManager,
+                        toOriginalRequestId(uniqueRequestId), REASON_ROUTE_NOT_AVAILABLE);
+                return;
+            }
 
             provider.requestCreateSession(uniqueRequestId, routerRecord.mPackageName,
                     route.getOriginalId(), sessionHints);
@@ -1404,11 +1492,11 @@
         }
 
         private void releaseSessionOnHandler(long uniqueRequestId,
-                @NonNull RouterRecord routerRecord, @NonNull String uniqueSessionId) {
+                @Nullable RouterRecord routerRecord, @NonNull String uniqueSessionId) {
             final RouterRecord matchingRecord = mSessionToRouterMap.get(uniqueSessionId);
             if (matchingRecord != routerRecord) {
-                Slog.w(TAG, "Ignoring releasing session from non-matching router."
-                        + " packageName=" + routerRecord.mPackageName
+                Slog.w(TAG, "Ignoring releasing session from non-matching router. packageName="
+                        + (routerRecord == null ? null : routerRecord.mPackageName)
                         + " uniqueSessionId=" + uniqueSessionId);
                 return;
             }
diff --git a/services/core/java/com/android/server/media/MediaRouterService.java b/services/core/java/com/android/server/media/MediaRouterService.java
index d6bf9fb..bf2cc5e 100644
--- a/services/core/java/com/android/server/media/MediaRouterService.java
+++ b/services/core/java/com/android/server/media/MediaRouterService.java
@@ -487,6 +487,14 @@
 
     // Binder call
     @Override
+    public void notifySessionHintsForCreatingSession(IMediaRouter2 router,
+            long uniqueRequestId, MediaRoute2Info route, Bundle sessionHints) {
+        mService2.notifySessionHintsForCreatingSession(router,
+                uniqueRequestId, route, sessionHints);
+    }
+
+    // Binder call
+    @Override
     public void selectRouteWithRouter2(IMediaRouter2 router, String sessionId,
             MediaRoute2Info route) {
         mService2.selectRouteWithRouter2(router, sessionId, route);
diff --git a/services/core/java/com/android/server/media/MediaSessionService.java b/services/core/java/com/android/server/media/MediaSessionService.java
index 5757b1a..476c9f8 100644
--- a/services/core/java/com/android/server/media/MediaSessionService.java
+++ b/services/core/java/com/android/server/media/MediaSessionService.java
@@ -86,10 +86,10 @@
 import java.io.PrintWriter;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 /**
  * System implementation of MediaSessionManager
@@ -103,12 +103,14 @@
     private static final int WAKELOCK_TIMEOUT = 5000;
     private static final int MEDIA_KEY_LISTENER_TIMEOUT = 1000;
     private static final int SESSION_CREATION_LIMIT_PER_UID = 100;
+    private static final int LONG_PRESS_TIMEOUT = ViewConfiguration.getLongPressTimeout()
+            + /* Buffer for delayed delivery of key event */ 50;
+    private static final int MULTI_PRESS_TIMEOUT = ViewConfiguration.getMultiPressTimeout();
 
     private final Context mContext;
     private final SessionManagerImpl mSessionManagerImpl;
     private final MessageHandler mHandler = new MessageHandler();
     private final PowerManager.WakeLock mMediaEventWakeLock;
-    private final int mLongPressTimeout;
     private final INotificationManager mNotificationManager;
     private final Object mLock = new Object();
     // Keeps the full user id for each user.
@@ -142,8 +144,7 @@
 
     private SessionPolicyProvider mCustomSessionPolicyProvider;
     private MediaKeyDispatcher mCustomMediaKeyDispatcher;
-    private Method mGetSessionForKeyEventMethod;
-    private Method mGetSessionPoliciesMethod;
+    private Map<Integer, Integer> mOverriddenKeyEventsMap;
 
     public MediaSessionService(Context context) {
         super(context);
@@ -151,7 +152,6 @@
         mSessionManagerImpl = new SessionManagerImpl();
         PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
         mMediaEventWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "handleMediaEvent");
-        mLongPressTimeout = ViewConfiguration.getLongPressTimeout();
         mNotificationManager = INotificationManager.Stub.asInterface(
                 ServiceManager.getService(Context.NOTIFICATION_SERVICE));
     }
@@ -165,6 +165,10 @@
         mAudioPlayerStateMonitor = AudioPlayerStateMonitor.getInstance(mContext);
         mAudioPlayerStateMonitor.registerListener(
                 (config, isRemoved) -> {
+                    if (DEBUG) {
+                        Log.d(TAG, "Audio playback is changed, config=" + config
+                                + ", removed=" + isRemoved);
+                    }
                     if (config.getPlayerType()
                             == AudioPlaybackConfiguration.PLAYER_TYPE_JAM_SOUNDPOOL) {
                         return;
@@ -184,9 +188,10 @@
         mHasFeatureLeanback = mContext.getPackageManager().hasSystemFeature(
                 PackageManager.FEATURE_LEANBACK);
 
+        updateUser();
+
         instantiateCustomProvider(null);
         instantiateCustomDispatcher(null);
-        updateUser();
     }
 
     private boolean isGlobalPriorityActiveLocked() {
@@ -570,13 +575,9 @@
             String callerPackageName, ISessionCallback cb, String tag, Bundle sessionInfo) {
         synchronized (mLock) {
             int policies = 0;
-            if (mCustomSessionPolicyProvider != null && mGetSessionPoliciesMethod != null) {
-                try {
-                    policies = (int) mGetSessionPoliciesMethod.invoke(
-                            mCustomSessionPolicyProvider, callerUid, callerPackageName);
-                } catch (InvocationTargetException | IllegalAccessException e) {
-                    Log.w(TAG, "Encountered problem while using reflection", e);
-                }
+            if (mCustomSessionPolicyProvider != null) {
+                policies = mCustomSessionPolicyProvider.getSessionPoliciesForApplication(
+                        callerUid, callerPackageName);
             }
 
             FullUserRecord user = getFullUserRecordLocked(userId);
@@ -762,44 +763,46 @@
     }
 
     private void instantiateCustomDispatcher(String nameFromTesting) {
-        mCustomMediaKeyDispatcher = null;
-        mGetSessionForKeyEventMethod = null;
+        synchronized (mLock) {
+            mCustomMediaKeyDispatcher = null;
+            mOverriddenKeyEventsMap = null;
 
-        String customDispatcherClassName = (nameFromTesting == null)
-                ? mContext.getResources().getString(R.string.config_customMediaKeyDispatcher)
-                : nameFromTesting;
-        try {
-            if (!TextUtils.isEmpty(customDispatcherClassName)) {
-                Class customDispatcherClass = Class.forName(customDispatcherClassName);
-                Constructor constructor = customDispatcherClass.getDeclaredConstructor();
-                mCustomMediaKeyDispatcher = (MediaKeyDispatcher) constructor.newInstance();
-                mGetSessionForKeyEventMethod = customDispatcherClass.getDeclaredMethod(
-                        "getSessionForKeyEvent", KeyEvent.class, int.class, boolean.class);
+            String customDispatcherClassName = (nameFromTesting == null)
+                    ? mContext.getResources().getString(R.string.config_customMediaKeyDispatcher)
+                    : nameFromTesting;
+            try {
+                if (!TextUtils.isEmpty(customDispatcherClassName)) {
+                    Class customDispatcherClass = Class.forName(customDispatcherClassName);
+                    Constructor constructor = customDispatcherClass.getDeclaredConstructor();
+                    mCustomMediaKeyDispatcher = (MediaKeyDispatcher) constructor.newInstance();
+                    mOverriddenKeyEventsMap = mCustomMediaKeyDispatcher.getOverriddenKeyEvents();
+                }
+            } catch (ClassNotFoundException | InstantiationException | InvocationTargetException
+                    | IllegalAccessException | NoSuchMethodException e) {
+                mCustomMediaKeyDispatcher = null;
+                Log.w(TAG, "Encountered problem while using reflection", e);
             }
-        } catch (ClassNotFoundException | InstantiationException | InvocationTargetException
-                | IllegalAccessException | NoSuchMethodException e) {
-            Log.w(TAG, "Encountered problem while using reflection", e);
         }
     }
 
     private void instantiateCustomProvider(String nameFromTesting) {
-        mCustomSessionPolicyProvider = null;
-        mGetSessionPoliciesMethod = null;
+        synchronized (mLock) {
+            mCustomSessionPolicyProvider = null;
 
-        String customProviderClassName = (nameFromTesting == null)
-                ? mContext.getResources().getString(R.string.config_customSessionPolicyProvider)
-                : nameFromTesting;
-        try {
-            if (!TextUtils.isEmpty(customProviderClassName)) {
-                Class customProviderClass = Class.forName(customProviderClassName);
-                Constructor constructor = customProviderClass.getDeclaredConstructor();
-                mCustomSessionPolicyProvider = (SessionPolicyProvider) constructor.newInstance();
-                mGetSessionPoliciesMethod = customProviderClass.getDeclaredMethod(
-                        "getSessionPoliciesForApplication", int.class, String.class);
+            String customProviderClassName = (nameFromTesting == null)
+                    ? mContext.getResources().getString(R.string.config_customSessionPolicyProvider)
+                    : nameFromTesting;
+            try {
+                if (!TextUtils.isEmpty(customProviderClassName)) {
+                    Class customProviderClass = Class.forName(customProviderClassName);
+                    Constructor constructor = customProviderClass.getDeclaredConstructor();
+                    mCustomSessionPolicyProvider =
+                            (SessionPolicyProvider) constructor.newInstance();
+                }
+            } catch (ClassNotFoundException | InstantiationException | InvocationTargetException
+                    | IllegalAccessException | NoSuchMethodException e) {
+                Log.w(TAG, "Encountered problem while using reflection", e);
             }
-        } catch (ClassNotFoundException | InstantiationException | InvocationTargetException
-                | IllegalAccessException | NoSuchMethodException e) {
-            Log.w(TAG, "Encountered problem while using reflection", e);
         }
     }
 
@@ -1098,8 +1101,9 @@
                 "android.media.AudioService.WAKELOCK_ACQUIRED";
         private static final int WAKELOCK_RELEASE_ON_FINISHED = 1980; // magic number
 
-        private boolean mVoiceButtonDown = false;
-        private boolean mVoiceButtonHandled = false;
+        private KeyEvent mPendingFirstDownKeyEvent = null;
+        private boolean mIsLongPressing = false;
+        private Runnable mLongPressTimeoutRunnable = null;
 
         @Override
         public void onShellCommand(FileDescriptor in, FileDescriptor out, FileDescriptor err,
@@ -1362,12 +1366,12 @@
                             }
                         }
                     }
-                    if (!isGlobalPriorityActive && isVoiceKey(keyEvent.getKeyCode())) {
-                        handleVoiceKeyEventLocked(packageName, pid, uid, asSystemService, keyEvent,
-                                needWakeLock);
-                    } else {
+                    if (isGlobalPriorityActive) {
                         dispatchMediaKeyEventLocked(packageName, pid, uid, asSystemService,
                                 keyEvent, needWakeLock);
+                    } else {
+                        handleKeyEventLocked(packageName, pid, uid, asSystemService, keyEvent,
+                                needWakeLock);
                     }
                 }
             } finally {
@@ -1641,7 +1645,7 @@
         }
 
         /**
-         * Dispaches volume key events. This is called when the foreground activity didn't handled
+         * Dispatches volume key events. This is called when the foreground activity didn't handle
          * the incoming volume key event.
          * <p>
          * Handles the dispatching of the volume button events to one of the
@@ -1662,7 +1666,7 @@
          *            {@link KeyEvent#KEYCODE_VOLUME_DOWN},
          *            or {@link KeyEvent#KEYCODE_VOLUME_MUTE}.
          * @param stream stream type to adjust volume.
-         * @param musicOnly true if both UI nor haptic feedback aren't needed when adjust volume.
+         * @param musicOnly true if both UI and haptic feedback aren't needed when adjusting volume.
          * @see #dispatchVolumeKeyEventToSessionAsSystemService
          */
         @Override
@@ -1707,7 +1711,7 @@
                                         mHandler.obtainMessage(
                                                 MessageHandler.MSG_VOLUME_INITIAL_DOWN,
                                                 mCurrentFullUserRecord.mFullUserId, 0),
-                                        mLongPressTimeout);
+                                        LONG_PRESS_TIMEOUT);
                             }
                             if (keyEvent.getRepeatCount() > 0 || keyEvent.isLongPress()) {
                                 mHandler.removeMessages(MessageHandler.MSG_VOLUME_INITIAL_DOWN);
@@ -1993,7 +1997,7 @@
                     FullUserRecord user = getFullUserRecordLocked(record.getUserId());
                     if (record != null && user != null) {
                         record.setSessionPolicies(policies);
-                        user.mPriorityStack.updateMediaButtonSessionIfNeeded();
+                        user.mPriorityStack.updateMediaButtonSessionBySessionPolicyChange(record);
                     }
                 }
             } finally {
@@ -2112,31 +2116,147 @@
             }
         }
 
-        private void handleVoiceKeyEventLocked(String packageName, int pid, int uid,
+        // A long press is determined by:
+        // 1) A KeyEvent with KeyEvent.ACTION_DOWN and repeat count of 0, followed by
+        // 2) A KeyEvent with KeyEvent.ACTION_DOWN and repeat count of 1 and FLAG_LONG_PRESS within
+        //    ViewConfiguration.getLongPressTimeout().
+        // TODO: Add description about what a click is determined by.
+        private void handleKeyEventLocked(String packageName, int pid, int uid,
                 boolean asSystemService, KeyEvent keyEvent, boolean needWakeLock) {
-            int action = keyEvent.getAction();
-            boolean isLongPress = (keyEvent.getFlags() & KeyEvent.FLAG_LONG_PRESS) != 0;
-            if (action == KeyEvent.ACTION_DOWN) {
-                if (keyEvent.getRepeatCount() == 0) {
-                    mVoiceButtonDown = true;
-                    mVoiceButtonHandled = false;
-                } else if (mVoiceButtonDown && !mVoiceButtonHandled && isLongPress) {
-                    mVoiceButtonHandled = true;
-                    startVoiceInput(needWakeLock);
+            if (keyEvent.isCanceled()) {
+                return;
+            }
+
+            int overriddenKeyEvents = (mCustomMediaKeyDispatcher == null) ? 0
+                    : mCustomMediaKeyDispatcher.getOverriddenKeyEvents().get(keyEvent.getKeyCode());
+            cancelPendingIfNeeded(keyEvent);
+            if (!needPending(keyEvent, overriddenKeyEvents)) {
+                dispatchMediaKeyEventLocked(packageName, pid, uid, asSystemService, keyEvent,
+                        needWakeLock);
+                return;
+            }
+
+            if (isFirstDownKeyEvent(keyEvent)) {
+                mPendingFirstDownKeyEvent = keyEvent;
+                mIsLongPressing = false;
+                return;
+            }
+
+            if (isFirstLongPressKeyEvent(keyEvent)) {
+                mIsLongPressing = true;
+            }
+            if (mIsLongPressing) {
+                handleLongPressLocked(keyEvent, needWakeLock, overriddenKeyEvents);
+            } else if (keyEvent.getAction() == KeyEvent.ACTION_UP) {
+                mPendingFirstDownKeyEvent = null;
+                // TODO: Replace this with code to determine whether
+                // single/double/triple click and run custom implementations,
+                // if they exist.
+                dispatchDownAndUpKeyEventsLocked(packageName, pid, uid, asSystemService,
+                        keyEvent, needWakeLock);
+            }
+        }
+
+        private void cancelPendingIfNeeded(KeyEvent keyEvent) {
+            if (mPendingFirstDownKeyEvent == null) {
+                return;
+            }
+            if (isFirstDownKeyEvent(keyEvent)) {
+                if (mLongPressTimeoutRunnable != null) {
+                    mHandler.removeCallbacks(mLongPressTimeoutRunnable);
+                    mLongPressTimeoutRunnable.run();
+                } else {
+                    resetLongPressTracking();
                 }
-            } else if (action == KeyEvent.ACTION_UP) {
-                if (mVoiceButtonDown) {
-                    mVoiceButtonDown = false;
-                    if (!mVoiceButtonHandled && !keyEvent.isCanceled()) {
-                        // Resend the down then send this event through
-                        KeyEvent downEvent = KeyEvent.changeAction(keyEvent, KeyEvent.ACTION_DOWN);
-                        dispatchMediaKeyEventLocked(packageName, pid, uid, asSystemService,
-                                downEvent, needWakeLock);
-                        dispatchMediaKeyEventLocked(packageName, pid, uid, asSystemService,
-                                keyEvent, needWakeLock);
-                    }
+                return;
+            }
+            if (mPendingFirstDownKeyEvent.getDownTime() == keyEvent.getDownTime()
+                    && mPendingFirstDownKeyEvent.getKeyCode() == keyEvent.getKeyCode()
+                    && keyEvent.getAction() == KeyEvent.ACTION_DOWN
+                    && keyEvent.getRepeatCount() > 1 && !mIsLongPressing) {
+                resetLongPressTracking();
+            }
+        }
+
+        private boolean needPending(KeyEvent keyEvent, int overriddenKeyEvents) {
+            if (!isFirstDownKeyEvent(keyEvent)) {
+                if (mPendingFirstDownKeyEvent == null) {
+                    return false;
+                } else if (mPendingFirstDownKeyEvent.getDownTime() != keyEvent.getDownTime()
+                        || mPendingFirstDownKeyEvent.getKeyCode() != keyEvent.getKeyCode()) {
+                    return false;
                 }
             }
+            if (overriddenKeyEvents == 0 && !isVoiceKey(keyEvent.getKeyCode())) {
+                return false;
+            }
+            return true;
+        }
+
+        private void handleLongPressLocked(KeyEvent keyEvent, boolean needWakeLock,
+                int overriddenKeyEvents) {
+            if (mCustomMediaKeyDispatcher != null
+                    && mCustomMediaKeyDispatcher.isLongPressOverridden(overriddenKeyEvents)) {
+                mCustomMediaKeyDispatcher.onLongPress(keyEvent);
+
+                if (mLongPressTimeoutRunnable != null) {
+                    mHandler.removeCallbacks(mLongPressTimeoutRunnable);
+                }
+                if (keyEvent.getAction() == KeyEvent.ACTION_DOWN) {
+                    if (mLongPressTimeoutRunnable == null) {
+                        mLongPressTimeoutRunnable = createLongPressTimeoutRunnable(keyEvent);
+                    }
+                    mHandler.postDelayed(mLongPressTimeoutRunnable, LONG_PRESS_TIMEOUT);
+                } else {
+                    resetLongPressTracking();
+                }
+            } else if (isFirstLongPressKeyEvent(keyEvent) && isVoiceKey(keyEvent.getKeyCode())) {
+                // Default implementation
+                startVoiceInput(needWakeLock);
+                resetLongPressTracking();
+            }
+        }
+
+        private Runnable createLongPressTimeoutRunnable(KeyEvent keyEvent) {
+            return new Runnable() {
+                @Override
+                public void run() {
+                    if (mCustomMediaKeyDispatcher != null) {
+                        mCustomMediaKeyDispatcher.onLongPress(createCanceledKeyEvent(keyEvent));
+                    }
+                    resetLongPressTracking();
+                }
+            };
+        }
+
+        private void resetLongPressTracking() {
+            mPendingFirstDownKeyEvent = null;
+            mIsLongPressing = false;
+            mLongPressTimeoutRunnable = null;
+        }
+
+        private KeyEvent createCanceledKeyEvent(KeyEvent keyEvent) {
+            KeyEvent upEvent = KeyEvent.changeAction(keyEvent, KeyEvent.ACTION_UP);
+            return KeyEvent.changeTimeRepeat(upEvent, System.currentTimeMillis(), 0,
+                    KeyEvent.FLAG_CANCELED);
+        }
+
+        private boolean isFirstLongPressKeyEvent(KeyEvent keyEvent) {
+            return ((keyEvent.getFlags() & KeyEvent.FLAG_LONG_PRESS) != 0)
+                    && keyEvent.getRepeatCount() == 1;
+        }
+
+        private boolean isFirstDownKeyEvent(KeyEvent keyEvent) {
+            return keyEvent.getAction() == KeyEvent.ACTION_DOWN && keyEvent.getRepeatCount() == 0;
+        }
+
+        private void dispatchDownAndUpKeyEventsLocked(String packageName, int pid, int uid,
+                boolean asSystemService, KeyEvent keyEvent, boolean needWakeLock) {
+            KeyEvent downEvent = KeyEvent.changeAction(keyEvent, KeyEvent.ACTION_DOWN);
+            dispatchMediaKeyEventLocked(packageName, pid, uid, asSystemService,
+                    downEvent, needWakeLock);
+            dispatchMediaKeyEventLocked(packageName, pid, uid, asSystemService,
+                    keyEvent, needWakeLock);
         }
 
         private void dispatchMediaKeyEventLocked(String packageName, int pid, int uid,
@@ -2149,15 +2269,11 @@
             MediaSessionRecord session = null;
 
             // Retrieve custom session for key event if it exists.
-            if (mCustomMediaKeyDispatcher != null && mGetSessionForKeyEventMethod != null) {
-                try {
-                    Object tokenObject = mGetSessionForKeyEventMethod.invoke(
-                            mCustomMediaKeyDispatcher, keyEvent, uid, asSystemService);
-                    if (tokenObject != null) {
-                        session = getMediaSessionRecordLocked((MediaSession.Token) tokenObject);
-                    }
-                } catch (InvocationTargetException | IllegalAccessException e) {
-                    Log.w(TAG, "Encountered problem while using reflection", e);
+            if (mCustomMediaKeyDispatcher != null) {
+                MediaSession.Token token = mCustomMediaKeyDispatcher.getSessionForKeyEvent(
+                        keyEvent, uid, asSystemService);
+                if (token != null) {
+                    session = getMediaSessionRecordLocked(token);
                 }
             }
 
@@ -2312,12 +2428,11 @@
                 mHandled = true;
                 mHandler.removeCallbacks(this);
                 synchronized (mLock) {
-                    if (!isGlobalPriorityActiveLocked()
-                            && isVoiceKey(mKeyEvent.getKeyCode())) {
-                        handleVoiceKeyEventLocked(mPackageName, mPid, mUid, mAsSystemService,
+                    if (isGlobalPriorityActiveLocked()) {
+                        dispatchMediaKeyEventLocked(mPackageName, mPid, mUid, mAsSystemService,
                                 mKeyEvent, mNeedWakeLock);
                     } else {
-                        dispatchMediaKeyEventLocked(mPackageName, mPid, mUid, mAsSystemService,
+                        handleKeyEventLocked(mPackageName, mPid, mUid, mAsSystemService,
                                 mKeyEvent, mNeedWakeLock);
                     }
                 }
diff --git a/services/core/java/com/android/server/media/MediaSessionStack.java b/services/core/java/com/android/server/media/MediaSessionStack.java
index bd98b9c..402355a 100644
--- a/services/core/java/com/android/server/media/MediaSessionStack.java
+++ b/services/core/java/com/android/server/media/MediaSessionStack.java
@@ -16,6 +16,8 @@
 
 package com.android.server.media;
 
+import static com.android.server.media.SessionPolicyProvider.SESSION_POLICY_IGNORE_BUTTON_SESSION;
+
 import android.media.Session2Token;
 import android.media.session.MediaSession;
 import android.os.Debug;
@@ -102,6 +104,7 @@
             // When the media button session is removed, nullify the media button session and do not
             // search for the alternative media session within the app. It's because the alternative
             // media session might be a dummy which isn't able to handle the media key events.
+            // TODO(b/154456172): Make this decision unaltered by non-media app's playback.
             updateMediaButtonSession(null);
         }
         clearCache(record.getUserId());
@@ -158,7 +161,7 @@
                     findMediaButtonSession(mMediaButtonSession.getUid());
             if (newMediaButtonSession != mMediaButtonSession
                     && (newMediaButtonSession.getSessionPolicies()
-                    & SessionPolicyProvider.SESSION_POLICY_IGNORE_BUTTON_SESSION) == 0) {
+                            & SESSION_POLICY_IGNORE_BUTTON_SESSION) == 0) {
                 // Check if the policy states that this session should not be updated as a media
                 // button session.
                 updateMediaButtonSession(newMediaButtonSession);
@@ -189,19 +192,43 @@
         }
         IntArray audioPlaybackUids = mAudioPlayerStateMonitor.getSortedAudioPlaybackClientUids();
         for (int i = 0; i < audioPlaybackUids.size(); i++) {
-            MediaSessionRecordImpl mediaButtonSession =
-                    findMediaButtonSession(audioPlaybackUids.get(i));
-            if (mediaButtonSession == null) continue;
-            boolean ignoreButtonSession = (mediaButtonSession.getSessionPolicies()
-                    & SessionPolicyProvider.SESSION_POLICY_IGNORE_BUTTON_SESSION) != 0;
-            if (mediaButtonSession == mMediaButtonSession && ignoreButtonSession) {
+            int audioPlaybackUid = audioPlaybackUids.get(i);
+            MediaSessionRecordImpl mediaButtonSession = findMediaButtonSession(audioPlaybackUid);
+            if (mediaButtonSession == null) {
+                if (DEBUG) {
+                    Log.d(TAG, "updateMediaButtonSessionIfNeeded, skipping uid="
+                            + audioPlaybackUid);
+                }
+                // Ignore if the lastly played app isn't a media app (i.e. has no media session)
+                continue;
+            }
+            boolean ignoreButtonSession =
+                    (mediaButtonSession.getSessionPolicies()
+                            & SESSION_POLICY_IGNORE_BUTTON_SESSION) != 0;
+            if (DEBUG) {
+                Log.d(TAG, "updateMediaButtonSessionIfNeeded, checking uid=" + audioPlaybackUid
+                        + ", mediaButtonSession=" + mediaButtonSession
+                        + ", ignoreButtonSession=" + ignoreButtonSession);
+            }
+            if (!ignoreButtonSession) {
+                mAudioPlayerStateMonitor.cleanUpAudioPlaybackUids(mediaButtonSession.getUid());
+                if (mediaButtonSession != mMediaButtonSession) {
+                    updateMediaButtonSession(mediaButtonSession);
+                }
+                return;
+            }
+        }
+    }
+
+    // TODO: Remove this and make updateMediaButtonSessionIfNeeded() to also cover this case.
+    public void updateMediaButtonSessionBySessionPolicyChange(MediaSessionRecord record) {
+        if ((record.getSessionPolicies() & SESSION_POLICY_IGNORE_BUTTON_SESSION) != 0) {
+            if (record == mMediaButtonSession) {
+                // TODO(b/154456172): Make this decision unaltered by non-media app's playback.
                 updateMediaButtonSession(null);
-                return;
             }
-            if (mediaButtonSession != mMediaButtonSession && !ignoreButtonSession) {
-                updateMediaButtonSession(mediaButtonSession);
-                return;
-            }
+        } else {
+            updateMediaButtonSessionIfNeeded();
         }
     }
 
@@ -280,7 +307,7 @@
         return mMediaButtonSession;
     }
 
-    private void updateMediaButtonSession(MediaSessionRecordImpl newMediaButtonSession) {
+    public void updateMediaButtonSession(MediaSessionRecordImpl newMediaButtonSession) {
         MediaSessionRecordImpl oldMediaButtonSession = mMediaButtonSession;
         mMediaButtonSession = newMediaButtonSession;
         mOnMediaButtonSessionChangedListener.onMediaButtonSessionChanged(
diff --git a/services/core/java/com/android/server/media/SessionPolicyProvider.java b/services/core/java/com/android/server/media/SessionPolicyProvider.java
index 40a3d2d..5f02a07 100644
--- a/services/core/java/com/android/server/media/SessionPolicyProvider.java
+++ b/services/core/java/com/android/server/media/SessionPolicyProvider.java
@@ -29,6 +29,7 @@
  * Note: When instantiating this class, {@link MediaSessionService} will only use the constructor
  * without any parameters.
  */
+// TODO: Move this class to apex/media/
 public abstract class SessionPolicyProvider {
     @IntDef(value = {
             SESSION_POLICY_IGNORE_BUTTON_RECEIVER,
diff --git a/services/core/java/com/android/server/media/SystemMediaRoute2Provider.java b/services/core/java/com/android/server/media/SystemMediaRoute2Provider.java
index 6e2feeb..41d7fff 100644
--- a/services/core/java/com/android/server/media/SystemMediaRoute2Provider.java
+++ b/services/core/java/com/android/server/media/SystemMediaRoute2Provider.java
@@ -19,6 +19,11 @@
 import static android.media.MediaRoute2Info.FEATURE_LIVE_AUDIO;
 import static android.media.MediaRoute2Info.FEATURE_LIVE_VIDEO;
 import static android.media.MediaRoute2Info.TYPE_BUILTIN_SPEAKER;
+import static android.media.MediaRoute2Info.TYPE_DOCK;
+import static android.media.MediaRoute2Info.TYPE_HDMI;
+import static android.media.MediaRoute2Info.TYPE_USB_DEVICE;
+import static android.media.MediaRoute2Info.TYPE_WIRED_HEADPHONES;
+import static android.media.MediaRoute2Info.TYPE_WIRED_HEADSET;
 
 import android.content.BroadcastReceiver;
 import android.content.ComponentName;
@@ -194,19 +199,27 @@
 
     private void updateDeviceRoute(AudioRoutesInfo newRoutes) {
         int name = R.string.default_audio_route_name;
+        int type = TYPE_BUILTIN_SPEAKER;
         if (newRoutes != null) {
             mCurAudioRoutesInfo.mainType = newRoutes.mainType;
-            if ((newRoutes.mainType & AudioRoutesInfo.MAIN_HEADPHONES) != 0
-                    || (newRoutes.mainType & AudioRoutesInfo.MAIN_HEADSET) != 0) {
+            if ((newRoutes.mainType & AudioRoutesInfo.MAIN_HEADPHONES) != 0) {
+                type = TYPE_WIRED_HEADPHONES;
+                name = com.android.internal.R.string.default_audio_route_name_headphones;
+            } else if ((newRoutes.mainType & AudioRoutesInfo.MAIN_HEADSET) != 0) {
+                type = TYPE_WIRED_HEADSET;
                 name = com.android.internal.R.string.default_audio_route_name_headphones;
             } else if ((newRoutes.mainType & AudioRoutesInfo.MAIN_DOCK_SPEAKERS) != 0) {
+                type = TYPE_DOCK;
                 name = com.android.internal.R.string.default_audio_route_name_dock_speakers;
             } else if ((newRoutes.mainType & AudioRoutesInfo.MAIN_HDMI) != 0) {
+                type = TYPE_HDMI;
                 name = com.android.internal.R.string.default_audio_route_name_hdmi;
             } else if ((newRoutes.mainType & AudioRoutesInfo.MAIN_USB) != 0) {
+                type = TYPE_USB_DEVICE;
                 name = com.android.internal.R.string.default_audio_route_name_usb;
             }
         }
+
         mDeviceRoute = new MediaRoute2Info.Builder(
                 DEVICE_ROUTE_ID, mContext.getResources().getText(name).toString())
                 .setVolumeHandling(mAudioManager.isVolumeFixed()
@@ -214,8 +227,7 @@
                         : MediaRoute2Info.PLAYBACK_VOLUME_VARIABLE)
                 .setVolumeMax(mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC))
                 .setVolume(mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC))
-                //TODO: Guess the exact type using AudioDevice
-                .setType(TYPE_BUILTIN_SPEAKER)
+                .setType(type)
                 .addFeature(FEATURE_LIVE_AUDIO)
                 .addFeature(FEATURE_LIVE_VIDEO)
                 .setConnectionState(MediaRoute2Info.CONNECTION_STATE_CONNECTED)
@@ -261,8 +273,10 @@
                     .build();
             builder.addSelectedRoute(mSelectedRouteId);
 
-            for (MediaRoute2Info route : mBtRouteProvider.getTransferableRoutes()) {
-                builder.addTransferableRoute(route.getId());
+            if (mBtRouteProvider != null) {
+                for (MediaRoute2Info route : mBtRouteProvider.getTransferableRoutes()) {
+                    builder.addTransferableRoute(route.getId());
+                }
             }
 
             RoutingSessionInfo newSessionInfo = builder.setProviderId(mUniqueId).build();
diff --git a/services/core/java/com/android/server/net/NetworkStatsService.java b/services/core/java/com/android/server/net/NetworkStatsService.java
index d8264b3..44173c6 100644
--- a/services/core/java/com/android/server/net/NetworkStatsService.java
+++ b/services/core/java/com/android/server/net/NetworkStatsService.java
@@ -16,7 +16,6 @@
 
 package com.android.server.net;
 
-import static android.Manifest.permission.ACCESS_NETWORK_STATE;
 import static android.Manifest.permission.NETWORK_STATS_PROVIDER;
 import static android.Manifest.permission.READ_NETWORK_USAGE_HISTORY;
 import static android.Manifest.permission.UPDATE_DEVICE_STATS;
@@ -46,7 +45,6 @@
 import static android.net.NetworkStatsHistory.FIELD_ALL;
 import static android.net.NetworkTemplate.buildTemplateMobileWildcard;
 import static android.net.NetworkTemplate.buildTemplateWifiWildcard;
-import static android.net.NetworkTemplate.getCollapsedRatType;
 import static android.net.TrafficStats.KB_IN_BYTES;
 import static android.net.TrafficStats.MB_IN_BYTES;
 import static android.os.Trace.TRACE_TAG_NETWORK;
@@ -67,9 +65,6 @@
 import static android.provider.Settings.Global.NETSTATS_UID_TAG_DELETE_AGE;
 import static android.provider.Settings.Global.NETSTATS_UID_TAG_PERSIST_BYTES;
 import static android.provider.Settings.Global.NETSTATS_UID_TAG_ROTATE_AGE;
-import static android.telephony.PhoneStateListener.LISTEN_NONE;
-import static android.telephony.PhoneStateListener.LISTEN_SERVICE_STATE;
-import static android.telephony.TelephonyManager.NETWORK_TYPE_UNKNOWN;
 import static android.text.format.DateUtils.DAY_IN_MILLIS;
 import static android.text.format.DateUtils.HOUR_IN_MILLIS;
 import static android.text.format.DateUtils.MINUTE_IN_MILLIS;
@@ -133,9 +128,7 @@
 import android.service.NetworkInterfaceProto;
 import android.service.NetworkStatsServiceDumpProto;
 import android.telephony.PhoneStateListener;
-import android.telephony.ServiceState;
 import android.telephony.SubscriptionPlan;
-import android.telephony.TelephonyManager;
 import android.text.format.DateUtils;
 import android.util.ArrayMap;
 import android.util.ArraySet;
@@ -206,7 +199,6 @@
     private final NetworkStatsFactory mStatsFactory;
     private final AlarmManager mAlarmManager;
     private final Clock mClock;
-    private final TelephonyManager mTeleManager;
     private final NetworkStatsSettings mSettings;
     private final NetworkStatsObservers mStatsObservers;
 
@@ -352,6 +344,9 @@
     @NonNull
     private final Dependencies mDeps;
 
+    @NonNull
+    private final NetworkStatsSubscriptionsMonitor mNetworkStatsSubscriptionsMonitor;
+
     private static @NonNull File getDefaultSystemDir() {
         return new File(Environment.getDataDirectory(), "system");
     }
@@ -401,8 +396,8 @@
         PowerManager.WakeLock wakeLock =
                 powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
 
-        NetworkStatsService service = new NetworkStatsService(context, networkManager, alarmManager,
-                wakeLock, getDefaultClock(), context.getSystemService(TelephonyManager.class),
+        final NetworkStatsService service = new NetworkStatsService(context, networkManager,
+                alarmManager, wakeLock, getDefaultClock(),
                 new DefaultNetworkStatsSettings(context), new NetworkStatsFactory(),
                 new NetworkStatsObservers(), getDefaultSystemDir(), getDefaultBaseDir(),
                 new Dependencies());
@@ -416,16 +411,15 @@
     @VisibleForTesting
     NetworkStatsService(Context context, INetworkManagementService networkManager,
             AlarmManager alarmManager, PowerManager.WakeLock wakeLock, Clock clock,
-            TelephonyManager teleManager, NetworkStatsSettings settings,
-            NetworkStatsFactory factory, NetworkStatsObservers statsObservers, File systemDir,
-            File baseDir, @NonNull Dependencies deps) {
+            NetworkStatsSettings settings, NetworkStatsFactory factory,
+            NetworkStatsObservers statsObservers, File systemDir, File baseDir,
+            @NonNull Dependencies deps) {
         mContext = Objects.requireNonNull(context, "missing Context");
         mNetworkManager = Objects.requireNonNull(networkManager,
-            "missing INetworkManagementService");
+                "missing INetworkManagementService");
         mAlarmManager = Objects.requireNonNull(alarmManager, "missing AlarmManager");
         mClock = Objects.requireNonNull(clock, "missing Clock");
         mSettings = Objects.requireNonNull(settings, "missing NetworkStatsSettings");
-        mTeleManager = Objects.requireNonNull(teleManager, "missing TelephonyManager");
         mWakeLock = Objects.requireNonNull(wakeLock, "missing WakeLock");
         mStatsFactory = Objects.requireNonNull(factory, "missing factory");
         mStatsObservers = Objects.requireNonNull(statsObservers, "missing NetworkStatsObservers");
@@ -437,7 +431,8 @@
         final HandlerThread handlerThread = mDeps.makeHandlerThread();
         handlerThread.start();
         mHandler = new NetworkStatsHandler(handlerThread.getLooper());
-        mPhoneListener = new NetworkTypeListener(new HandlerExecutor(mHandler));
+        mNetworkStatsSubscriptionsMonitor = deps.makeSubscriptionsMonitor(mContext,
+                new HandlerExecutor(mHandler), this);
     }
 
     /**
@@ -453,6 +448,19 @@
         public HandlerThread makeHandlerThread() {
             return new HandlerThread(TAG);
         }
+
+        /**
+         * Create a {@link NetworkStatsSubscriptionsMonitor}, can be used to monitor RAT change
+         * event in NetworkStatsService.
+         */
+        @NonNull
+        public NetworkStatsSubscriptionsMonitor makeSubscriptionsMonitor(@NonNull Context context,
+                @NonNull Executor executor, @NonNull NetworkStatsService service) {
+            // TODO: Update RatType passively in NSS, instead of querying into the monitor
+            //  when forceUpdateIface.
+            return new NetworkStatsSubscriptionsMonitor(context, executor, (subscriberId, type) ->
+                    service.handleOnCollapsedRatTypeChanged());
+        }
     }
 
     private void registerLocalService() {
@@ -517,11 +525,10 @@
         mAlarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME, currentRealtime,
                 mSettings.getPollInterval(), pollIntent);
 
-        // TODO: 1. listen to changes from all subscriptions.
-        //       2. listen to settings changed to support dynamically enable/disable.
+        // TODO: listen to settings changed to support dynamically enable/disable.
         // watch for networkType changes
         if (!mSettings.getCombineSubtypeEnabled()) {
-            mTeleManager.listen(mPhoneListener, LISTEN_SERVICE_STATE);
+            mNetworkStatsSubscriptionsMonitor.start();
         }
 
         registerGlobalAlert();
@@ -544,7 +551,9 @@
         mContext.unregisterReceiver(mUserReceiver);
         mContext.unregisterReceiver(mShutdownReceiver);
 
-        mTeleManager.listen(mPhoneListener, LISTEN_NONE);
+        if (!mSettings.getCombineSubtypeEnabled()) {
+            mNetworkStatsSubscriptionsMonitor.stop();
+        }
 
         final long currentTime = mClock.millis();
 
@@ -845,7 +854,8 @@
     @Override
     public NetworkStats getDataLayerSnapshotForUid(int uid) throws RemoteException {
         if (Binder.getCallingUid() != uid) {
-            mContext.enforceCallingOrSelfPermission(ACCESS_NETWORK_STATE, TAG);
+            Log.w(TAG, "Snapshots only available for calling UID");
+            return new NetworkStats(SystemClock.elapsedRealtime(), 0);
         }
 
         // TODO: switch to data layer stats once kernel exports
@@ -1197,35 +1207,14 @@
     };
 
     /**
-     * Receiver that watches for {@link TelephonyManager} changes, such as
-     * transitioning between Radio Access Technology(RAT) types.
+     * Handle collapsed RAT type changed event.
      */
-    @NonNull
-    private final NetworkTypeListener mPhoneListener;
-
-    class NetworkTypeListener extends PhoneStateListener {
-        private volatile int mLastCollapsedRatType = NETWORK_TYPE_UNKNOWN;
-
-        NetworkTypeListener(@NonNull Executor executor) {
-            super(executor);
-        }
-
-        @Override
-        public void onServiceStateChanged(@NonNull ServiceState ss) {
-            final int networkType = ss.getDataNetworkType();
-            final int collapsedRatType = getCollapsedRatType(networkType);
-            if (collapsedRatType == mLastCollapsedRatType) return;
-
-            if (LOGD) {
-                Log.d(TAG, "subtype changed for mobile: "
-                        + mLastCollapsedRatType + " -> " + collapsedRatType);
-            }
-            // Protect service from frequently updating. Remove pending messages if any.
-            mHandler.removeMessages(MSG_UPDATE_IFACES);
-            mLastCollapsedRatType = collapsedRatType;
-            mHandler.sendMessageDelayed(
-                    mHandler.obtainMessage(MSG_UPDATE_IFACES), mSettings.getPollDelay());
-        }
+    @VisibleForTesting
+    public void handleOnCollapsedRatTypeChanged() {
+        // Protect service from frequently updating. Remove pending messages if any.
+        mHandler.removeMessages(MSG_UPDATE_IFACES);
+        mHandler.sendMessageDelayed(
+                mHandler.obtainMessage(MSG_UPDATE_IFACES), mSettings.getPollDelay());
     }
 
     private void updateIfaces(
@@ -1352,8 +1341,7 @@
             return 0;
         }
 
-        // TODO: return different subType for different subscriptions.
-        return mPhoneListener.mLastCollapsedRatType;
+        return mNetworkStatsSubscriptionsMonitor.getRatTypeForSubscriberId(state.subscriberId);
     }
 
     private static <K> NetworkIdentitySet findOrCreateNetworkIdentitySet(
diff --git a/services/core/java/com/android/server/notification/BubbleExtractor.java b/services/core/java/com/android/server/notification/BubbleExtractor.java
index 2fa80cd..27802ff 100644
--- a/services/core/java/com/android/server/notification/BubbleExtractor.java
+++ b/services/core/java/com/android/server/notification/BubbleExtractor.java
@@ -16,12 +16,18 @@
 package com.android.server.notification;
 
 import static android.app.Notification.FLAG_BUBBLE;
+import static android.app.Notification.FLAG_FOREGROUND_SERVICE;
+import static android.app.NotificationChannel.USER_LOCKED_ALLOW_BUBBLE;
+import static android.app.NotificationManager.BUBBLE_PREFERENCE_ALL;
+import static android.app.NotificationManager.BUBBLE_PREFERENCE_NONE;
+import static android.app.NotificationManager.BUBBLE_PREFERENCE_SELECTED;
 
 import static com.android.internal.util.FrameworkStatsLog.BUBBLE_DEVELOPER_ERROR_REPORTED__ERROR__ACTIVITY_INFO_MISSING;
 import static com.android.internal.util.FrameworkStatsLog.BUBBLE_DEVELOPER_ERROR_REPORTED__ERROR__ACTIVITY_INFO_NOT_RESIZABLE;
 
 import android.app.ActivityManager;
 import android.app.Notification;
+import android.app.NotificationChannel;
 import android.app.PendingIntent;
 import android.content.Context;
 import android.content.Intent;
@@ -32,13 +38,13 @@
 import com.android.internal.util.FrameworkStatsLog;
 
 /**
- * Determines whether a bubble can be shown for this notification
+ * Determines whether a bubble can be shown for this notification.
  */
 public class BubbleExtractor implements NotificationSignalExtractor {
     private static final String TAG = "BubbleExtractor";
     private static final boolean DBG = false;
 
-    private BubbleChecker mBubbleChecker;
+    private ShortcutHelper mShortcutHelper;
     private RankingConfig mConfig;
     private ActivityManager mActivityManager;
     private Context mContext;
@@ -60,24 +66,35 @@
             return null;
         }
 
-        if (mBubbleChecker == null) {
-            if (DBG) Slog.d(TAG, "missing bubble checker");
+        if (mShortcutHelper == null) {
+            if (DBG) Slog.d(TAG, "missing shortcut helper");
             return null;
         }
 
-        boolean appCanShowBubble =
-                mConfig.areBubblesAllowed(record.getSbn().getPackageName(), record.getSbn().getUid());
-        if (!mConfig.bubblesEnabled() || !appCanShowBubble) {
+        int bubblePreference =
+                mConfig.getBubblePreference(
+                        record.getSbn().getPackageName(), record.getSbn().getUid());
+        NotificationChannel recordChannel = record.getChannel();
+
+        if (!mConfig.bubblesEnabled() || bubblePreference == BUBBLE_PREFERENCE_NONE) {
             record.setAllowBubble(false);
-        } else {
-            if (record.getChannel() != null) {
-                record.setAllowBubble(record.getChannel().canBubble() && appCanShowBubble);
-            } else {
-                record.setAllowBubble(appCanShowBubble);
-            }
+        } else if (recordChannel == null) {
+            // the app is allowed but there's no channel to check
+            record.setAllowBubble(true);
+        } else if (bubblePreference == BUBBLE_PREFERENCE_ALL) {
+            // by default the channel is not allowed, only don't bubble if the user specified
+            boolean userLockedNoBubbles = !recordChannel.canBubble()
+                    && (recordChannel.getUserLockedFields() & USER_LOCKED_ALLOW_BUBBLE) != 0;
+            record.setAllowBubble(!userLockedNoBubbles);
+        } else if (bubblePreference == BUBBLE_PREFERENCE_SELECTED) {
+            record.setAllowBubble(recordChannel.canBubble());
         }
-        final boolean applyFlag = mBubbleChecker.isNotificationAppropriateToBubble(record)
-                && !record.isFlagBubbleRemoved();
+
+        final boolean fulfillsPolicy = record.canBubble()
+                && record.isConversation()
+                && !mActivityManager.isLowRamDevice()
+                && (record.getNotification().flags & FLAG_FOREGROUND_SERVICE) == 0;
+        final boolean applyFlag = fulfillsPolicy && canPresentAsBubble(record);
         if (applyFlag) {
             record.getNotification().flags |= FLAG_BUBBLE;
         } else {
@@ -95,165 +112,95 @@
     public void setZenHelper(ZenModeHelper helper) {
     }
 
-    /**
-     * Expected to be called after {@link #setConfig(RankingConfig)} has occurred.
-     */
-    void setShortcutHelper(ShortcutHelper helper) {
-        if (mConfig == null) {
-            if (DBG) Slog.d(TAG, "setting shortcut helper prior to setConfig");
-            return;
-        }
-        mBubbleChecker = new BubbleChecker(mContext, helper, mConfig, mActivityManager);
+    public void setShortcutHelper(ShortcutHelper helper) {
+        mShortcutHelper = helper;
     }
 
     @VisibleForTesting
-    void setBubbleChecker(BubbleChecker checker) {
-        mBubbleChecker = checker;
+    public void setActivityManager(ActivityManager manager) {
+        mActivityManager = manager;
     }
 
     /**
-     * Encapsulates special checks to see if a notification can be flagged as a bubble. This
-     * makes testing a bit easier.
+     * @return whether there is valid information for the notification to bubble.
      */
-    public static class BubbleChecker {
-
-        private ActivityManager mActivityManager;
-        private RankingConfig mRankingConfig;
-        private Context mContext;
-        private ShortcutHelper mShortcutHelper;
-
-        BubbleChecker(Context context, ShortcutHelper helper, RankingConfig config,
-                ActivityManager activityManager) {
-            mContext = context;
-            mActivityManager = activityManager;
-            mShortcutHelper = helper;
-            mRankingConfig = config;
+    @VisibleForTesting
+    boolean canPresentAsBubble(NotificationRecord r) {
+        Notification notification = r.getNotification();
+        Notification.BubbleMetadata metadata = notification.getBubbleMetadata();
+        String pkg = r.getSbn().getPackageName();
+        if (metadata == null) {
+            return false;
         }
 
-        /**
-         * @return whether the provided notification record is allowed to be represented as a
-         * bubble, accounting for user choice & policy.
-         */
-        public boolean isNotificationAppropriateToBubble(NotificationRecord r) {
-            final String pkg = r.getSbn().getPackageName();
-            final int userId = r.getSbn().getUser().getIdentifier();
-            Notification notification = r.getNotification();
-            if (!canBubble(r, pkg, userId)) {
-                // no log: canBubble has its own
-                return false;
-            }
-
-            if (mActivityManager.isLowRamDevice()) {
-                logBubbleError(r.getKey(), "low ram device");
-                return false;
-            }
-
-            boolean isMessageStyle = Notification.MessagingStyle.class.equals(
-                    notification.getNotificationStyle());
-            if (!isMessageStyle) {
-                logBubbleError(r.getKey(), "must be Notification.MessageStyle");
-                return false;
-            }
+        String shortcutId = metadata.getShortcutId();
+        String notificationShortcutId = r.getShortcutInfo() != null
+                ? r.getShortcutInfo().getId()
+                : null;
+        boolean shortcutValid = false;
+        if (notificationShortcutId != null && shortcutId != null) {
+            // NoMan already checks validity of shortcut, just check if they match.
+            shortcutValid = shortcutId.equals(notificationShortcutId);
+        } else if (shortcutId != null) {
+            shortcutValid =
+                    mShortcutHelper.getValidShortcutInfo(shortcutId, pkg, r.getUser()) != null;
+        }
+        if (metadata.getIntent() == null && !shortcutValid) {
+            // Should have a shortcut if intent is null
+            logBubbleError(r.getKey(),
+                    "couldn't find valid shortcut for bubble with shortcutId: " + shortcutId);
+            return false;
+        }
+        if (shortcutValid) {
+            // TODO: check the shortcut intent / ensure it can show in activity view
             return true;
         }
+        return canLaunchInActivityView(mContext, metadata.getIntent(), pkg);
+    }
 
-        /**
-         * @return whether the user has enabled the provided notification to bubble, and if the
-         * developer has provided valid information for the notification to bubble.
-         */
-        @VisibleForTesting
-        boolean canBubble(NotificationRecord r, String pkg, int userId) {
-            Notification notification = r.getNotification();
-            Notification.BubbleMetadata metadata = notification.getBubbleMetadata();
-            if (metadata == null) {
-                // no log: no need to inform dev if they didn't attach bubble metadata
-                return false;
-            }
-            if (!mRankingConfig.bubblesEnabled()) {
-                logBubbleError(r.getKey(), "bubbles disabled for user: " + userId);
-                return false;
-            }
-            if (!mRankingConfig.areBubblesAllowed(pkg, userId)) {
-                logBubbleError(r.getKey(),
-                        "bubbles for package: " + pkg + " disabled for user: " + userId);
-                return false;
-            }
-            if (!r.getChannel().canBubble()) {
-                logBubbleError(r.getKey(),
-                        "bubbles for channel " + r.getChannel().getId() + " disabled");
-                return false;
-            }
-
-            String shortcutId = metadata.getShortcutId();
-            String notificationShortcutId = r.getShortcutInfo() != null
-                    ? r.getShortcutInfo().getId()
-                    : null;
-            boolean shortcutValid = false;
-            if (notificationShortcutId != null && shortcutId != null) {
-                // NoMan already checks validity of shortcut, just check if they match.
-                shortcutValid = shortcutId.equals(notificationShortcutId);
-            } else if (shortcutId != null) {
-                shortcutValid =
-                        mShortcutHelper.getValidShortcutInfo(shortcutId, pkg, r.getUser()) != null;
-            }
-            if (metadata.getIntent() == null && !shortcutValid) {
-                // Should have a shortcut if intent is null
-                logBubbleError(r.getKey(),
-                        "couldn't find valid shortcut for bubble with shortcutId: " + shortcutId);
-                return false;
-            }
-            if (shortcutValid) {
-                return true;
-            }
-            // no log: canLaunch method has the failure log
-            return canLaunchInActivityView(mContext, metadata.getIntent(), pkg);
+    /**
+     * Whether an intent is properly configured to display in an {@link
+     * android.app.ActivityView} for bubbling.
+     *
+     * @param context       the context to use.
+     * @param pendingIntent the pending intent of the bubble.
+     * @param packageName   the notification package name for this bubble.
+     */
+    // Keep checks in sync with BubbleController#canLaunchInActivityView.
+    @VisibleForTesting
+    protected boolean canLaunchInActivityView(Context context, PendingIntent pendingIntent,
+            String packageName) {
+        if (pendingIntent == null) {
+            Slog.w(TAG, "Unable to create bubble -- no intent");
+            return false;
         }
 
-        /**
-         * Whether an intent is properly configured to display in an {@link
-         * android.app.ActivityView}.
-         *
-         * @param context       the context to use.
-         * @param pendingIntent the pending intent of the bubble.
-         * @param packageName   the notification package name for this bubble.
-         */
-        // Keep checks in sync with BubbleController#canLaunchInActivityView.
-        @VisibleForTesting
-        protected boolean canLaunchInActivityView(Context context, PendingIntent pendingIntent,
-                String packageName) {
-            if (pendingIntent == null) {
-                Slog.w(TAG, "Unable to create bubble -- no intent");
-                return false;
-            }
-
-            Intent intent = pendingIntent.getIntent();
-
-            ActivityInfo info = intent != null
-                    ? intent.resolveActivityInfo(context.getPackageManager(), 0)
-                    : null;
-            if (info == null) {
-                FrameworkStatsLog.write(FrameworkStatsLog.BUBBLE_DEVELOPER_ERROR_REPORTED,
-                        packageName,
-                        BUBBLE_DEVELOPER_ERROR_REPORTED__ERROR__ACTIVITY_INFO_MISSING);
-                Slog.w(TAG, "Unable to send as bubble -- couldn't find activity info for intent: "
-                        + intent);
-                return false;
-            }
-            if (!ActivityInfo.isResizeableMode(info.resizeMode)) {
-                FrameworkStatsLog.write(FrameworkStatsLog.BUBBLE_DEVELOPER_ERROR_REPORTED,
-                        packageName,
-                        BUBBLE_DEVELOPER_ERROR_REPORTED__ERROR__ACTIVITY_INFO_NOT_RESIZABLE);
-                Slog.w(TAG, "Unable to send as bubble -- activity is not resizable for intent: "
-                        + intent);
-                return false;
-            }
-            return true;
+        Intent intent = pendingIntent.getIntent();
+        ActivityInfo info = intent != null
+                ? intent.resolveActivityInfo(context.getPackageManager(), 0)
+                : null;
+        if (info == null) {
+            FrameworkStatsLog.write(FrameworkStatsLog.BUBBLE_DEVELOPER_ERROR_REPORTED,
+                    packageName,
+                    BUBBLE_DEVELOPER_ERROR_REPORTED__ERROR__ACTIVITY_INFO_MISSING);
+            Slog.w(TAG, "Unable to send as bubble -- couldn't find activity info for intent: "
+                    + intent);
+            return false;
         }
+        if (!ActivityInfo.isResizeableMode(info.resizeMode)) {
+            FrameworkStatsLog.write(FrameworkStatsLog.BUBBLE_DEVELOPER_ERROR_REPORTED,
+                    packageName,
+                    BUBBLE_DEVELOPER_ERROR_REPORTED__ERROR__ACTIVITY_INFO_NOT_RESIZABLE);
+            Slog.w(TAG, "Unable to send as bubble -- activity is not resizable for intent: "
+                    + intent);
+            return false;
+        }
+        return true;
+    }
 
-        private void logBubbleError(String key, String failureMessage) {
-            if (DBG) {
-                Slog.w(TAG, "Bubble notification: " + key + " failed: " + failureMessage);
-            }
+    private void logBubbleError(String key, String failureMessage) {
+        if (DBG) {
+            Slog.w(TAG, "Bubble notification: " + key + " failed: " + failureMessage);
         }
     }
 }
diff --git a/services/core/java/com/android/server/notification/ConditionProviders.java b/services/core/java/com/android/server/notification/ConditionProviders.java
index aed2927..bdf0fb9 100644
--- a/services/core/java/com/android/server/notification/ConditionProviders.java
+++ b/services/core/java/com/android/server/notification/ConditionProviders.java
@@ -30,6 +30,7 @@
 import android.service.notification.Condition;
 import android.service.notification.ConditionProviderService;
 import android.service.notification.IConditionProvider;
+import android.text.TextUtils;
 import android.util.ArrayMap;
 import android.util.ArraySet;
 import android.util.Slog;
@@ -54,7 +55,6 @@
     private final ArraySet<String> mSystemConditionProviderNames;
     private final ArraySet<SystemConditionProviderService> mSystemConditionProviders
             = new ArraySet<>();
-
     private Callback mCallback;
 
     public ConditionProviders(Context context, UserProfiles userProfiles, IPackageManager pm) {
@@ -76,7 +76,8 @@
     public void addSystemProvider(SystemConditionProviderService service) {
         mSystemConditionProviders.add(service);
         service.attachBase(mContext);
-        registerService(service.asInterface(), service.getComponent(), UserHandle.USER_SYSTEM);
+        registerSystemService(
+                service.asInterface(), service.getComponent(), UserHandle.USER_SYSTEM);
     }
 
     public Iterable<SystemConditionProviderService> getSystemProviders() {
@@ -195,6 +196,21 @@
     }
 
     @Override
+    protected void loadDefaultsFromConfig() {
+        String defaultDndAccess = mContext.getResources().getString(
+                R.string.config_defaultDndAccessPackages);
+        if (defaultDndAccess != null) {
+            String[] dnds = defaultDndAccess.split(ManagedServices.ENABLED_SERVICES_SEPARATOR);
+            for (int i = 0; i < dnds.length; i++) {
+                if (TextUtils.isEmpty(dnds[i])) {
+                    continue;
+                }
+                addDefaultComponentOrPackage(dnds[i]);
+            }
+        }
+    }
+
+    @Override
     protected void onServiceRemovedLocked(ManagedServiceInfo removed) {
         if (removed == null) return;
         for (int i = mRecords.size() - 1; i >= 0; i--) {
diff --git a/services/core/java/com/android/server/notification/ManagedServices.java b/services/core/java/com/android/server/notification/ManagedServices.java
index 45df368..fad0a7d 100644
--- a/services/core/java/com/android/server/notification/ManagedServices.java
+++ b/services/core/java/com/android/server/notification/ManagedServices.java
@@ -21,6 +21,7 @@
 import static android.content.Context.BIND_FOREGROUND_SERVICE;
 import static android.content.Context.DEVICE_POLICY_SERVICE;
 import static android.os.UserHandle.USER_ALL;
+import static android.os.UserHandle.USER_SYSTEM;
 
 import android.annotation.NonNull;
 import android.app.ActivityManager;
@@ -96,6 +97,8 @@
 
     private static final int ON_BINDING_DIED_REBIND_DELAY_MS = 10000;
     protected static final String ENABLED_SERVICES_SEPARATOR = ":";
+    private static final String DB_VERSION_1 = "1";
+
 
     /**
      * List of components and apps that can have running {@link ManagedServices}.
@@ -107,7 +110,7 @@
     static final String ATT_VERSION = "version";
     static final String ATT_DEFAULTS = "defaults";
 
-    static final int DB_VERSION = 1;
+    static final int DB_VERSION = 2;
 
     static final int APPROVAL_BY_PACKAGE = 0;
     static final int APPROVAL_BY_COMPONENT = 1;
@@ -115,7 +118,7 @@
     protected final Context mContext;
     protected final Object mMutex;
     private final UserProfiles mUserProfiles;
-    private final IPackageManager mPm;
+    protected final IPackageManager mPm;
     protected final UserManager mUm;
     private final Config mConfig;
     private final Handler mHandler = new Handler(Looper.getMainLooper());
@@ -187,17 +190,22 @@
     protected void addDefaultComponentOrPackage(String packageOrComponent) {
         if (!TextUtils.isEmpty(packageOrComponent)) {
             synchronized (mDefaultsLock) {
-                ComponentName cn = ComponentName.unflattenFromString(packageOrComponent);
-                if (cn == null) {
+                if (mApprovalLevel == APPROVAL_BY_PACKAGE) {
                     mDefaultPackages.add(packageOrComponent);
-                } else {
+                    return;
+                }
+                ComponentName cn = ComponentName.unflattenFromString(packageOrComponent);
+                if (cn != null  && mApprovalLevel == APPROVAL_BY_COMPONENT) {
                     mDefaultPackages.add(cn.getPackageName());
                     mDefaultComponents.add(cn);
+                    return;
                 }
             }
         }
     }
 
+    protected abstract void loadDefaultsFromConfig();
+
     boolean isDefaultComponentOrPackage(String packageOrComponent) {
         synchronized (mDefaultsLock) {
             ComponentName cn = ComponentName.unflattenFromString(packageOrComponent);
@@ -504,19 +512,19 @@
 
     void readDefaults(XmlPullParser parser) {
         String defaultComponents = XmlUtils.readStringAttribute(parser, ATT_DEFAULTS);
-        if (defaultComponents == null) {
-            return;
-        }
-        String[] components = defaultComponents.split(ENABLED_SERVICES_SEPARATOR);
-        synchronized (mDefaultsLock) {
-            for (int i = 0; i < components.length; i++) {
-                if (!TextUtils.isEmpty(components[i])) {
-                    ComponentName cn = ComponentName.unflattenFromString(components[i]);
-                    if (cn != null) {
-                        mDefaultPackages.add(cn.getPackageName());
-                        mDefaultComponents.add(cn);
-                    } else {
-                        mDefaultPackages.add(components[i]);
+
+        if (!TextUtils.isEmpty(defaultComponents)) {
+            String[] components = defaultComponents.split(ENABLED_SERVICES_SEPARATOR);
+            synchronized (mDefaultsLock) {
+                for (int i = 0; i < components.length; i++) {
+                    if (!TextUtils.isEmpty(components[i])) {
+                        ComponentName cn = ComponentName.unflattenFromString(components[i]);
+                        if (cn != null) {
+                            mDefaultPackages.add(cn.getPackageName());
+                            mDefaultComponents.add(cn);
+                        } else {
+                            mDefaultPackages.add(components[i]);
+                        }
                     }
                 }
             }
@@ -531,9 +539,11 @@
             throws XmlPullParserException, IOException {
         // read grants
         int type;
+        String version = "";
         readDefaults(parser);
         while ((type = parser.next()) != XmlPullParser.END_DOCUMENT) {
             String tag = parser.getName();
+            version = XmlUtils.readStringAttribute(parser, ATT_VERSION);
             if (type == XmlPullParser.END_TAG
                     && getConfig().xmlTag.equals(tag)) {
                 break;
@@ -561,9 +571,38 @@
                 }
             }
         }
+        boolean isVersionOne = TextUtils.isEmpty(version) || DB_VERSION_1.equals(version);
+        if (isVersionOne) {
+            upgradeToVersionTwo();
+        }
         rebindServices(false, USER_ALL);
     }
 
+    private void upgradeToVersionTwo() {
+        // check if any defaults are loaded
+        int defaultsSize = mDefaultComponents.size() + mDefaultPackages.size();
+        if (defaultsSize == 0) {
+            // load defaults from current allowed
+            if (this.mApprovalLevel == APPROVAL_BY_COMPONENT) {
+                List<ComponentName> approvedComponents = getAllowedComponents(USER_SYSTEM);
+                for (int i = 0; i < approvedComponents.size(); i++) {
+                    addDefaultComponentOrPackage(approvedComponents.get(i).flattenToString());
+                }
+            }
+            if (this.mApprovalLevel == APPROVAL_BY_PACKAGE) {
+                List<String> approvedPkgs = getAllowedPackages(USER_SYSTEM);
+                for (int i = 0; i < approvedPkgs.size(); i++) {
+                    addDefaultComponentOrPackage(approvedPkgs.get(i));
+                }
+            }
+        }
+        // if no defaults are loaded, then load from config
+        defaultsSize = mDefaultComponents.size() + mDefaultPackages.size();
+        if (defaultsSize == 0) {
+            loadDefaultsFromConfig();
+        }
+    }
+
     /**
      * Read extra attributes in the {@link #TAG_MANAGED_SERVICES} tag.
      */
@@ -851,9 +890,10 @@
         unregisterServiceImpl(service, userid);
     }
 
-    public void registerService(IInterface service, ComponentName component, int userid) {
+    public void registerSystemService(IInterface service, ComponentName component, int userid) {
         checkNotNull(service);
-        ManagedServiceInfo info = registerServiceImpl(service, component, userid);
+        ManagedServiceInfo info = registerServiceImpl(
+                service, component, userid, Build.VERSION_CODES.CUR_DEVELOPMENT);
         if (info != null) {
             onServiceAdded(info);
         }
@@ -1419,9 +1459,9 @@
     }
 
     private ManagedServiceInfo registerServiceImpl(final IInterface service,
-            final ComponentName component, final int userid) {
+            final ComponentName component, final int userid, int targetSdk) {
         ManagedServiceInfo info = newServiceInfo(service, component, userid,
-                true /*isSystem*/, null /*connection*/, Build.VERSION_CODES.LOLLIPOP);
+                true /*isSystem*/, null /*connection*/, targetSdk);
         return registerServiceImpl(info);
     }
 
diff --git a/services/core/java/com/android/server/notification/NotificationDelegate.java b/services/core/java/com/android/server/notification/NotificationDelegate.java
index b8140be..1051423 100644
--- a/services/core/java/com/android/server/notification/NotificationDelegate.java
+++ b/services/core/java/com/android/server/notification/NotificationDelegate.java
@@ -51,7 +51,7 @@
     /**
      * Called when the state of {@link Notification#FLAG_BUBBLE} is changed.
      */
-    void onNotificationBubbleChanged(String key, boolean isBubble);
+    void onNotificationBubbleChanged(String key, boolean isBubble, int flags);
     /**
      * Called when the state of {@link Notification.BubbleMetadata#FLAG_SUPPRESS_NOTIFICATION}
      * changes.
diff --git a/services/core/java/com/android/server/notification/NotificationHistoryDatabase.java b/services/core/java/com/android/server/notification/NotificationHistoryDatabase.java
index bfc76df..e846daf 100644
--- a/services/core/java/com/android/server/notification/NotificationHistoryDatabase.java
+++ b/services/core/java/com/android/server/notification/NotificationHistoryDatabase.java
@@ -108,7 +108,9 @@
     public void init() {
         synchronized (mLock) {
             try {
-                mHistoryDir.mkdir();
+                if (!mHistoryDir.mkdir()) {
+                    throw new IllegalStateException("could not create history directory");
+                }
                 mVersionFile.createNewFile();
             } catch (Exception e) {
                 Slog.e(TAG, "could not create needed files", e);
diff --git a/services/core/java/com/android/server/notification/NotificationHistoryManager.java b/services/core/java/com/android/server/notification/NotificationHistoryManager.java
index f7fb9b7..69a7ce90 100644
--- a/services/core/java/com/android/server/notification/NotificationHistoryManager.java
+++ b/services/core/java/com/android/server/notification/NotificationHistoryManager.java
@@ -26,6 +26,7 @@
 import android.content.pm.UserInfo;
 import android.database.ContentObserver;
 import android.net.Uri;
+import android.os.Binder;
 import android.os.Environment;
 import android.os.Handler;
 import android.os.UserHandle;
@@ -37,6 +38,7 @@
 
 import com.android.internal.annotations.GuardedBy;
 import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.util.FunctionalUtils;
 import com.android.server.IoThread;
 
 import java.io.File;
@@ -198,16 +200,18 @@
     }
 
     public void addNotification(@NonNull final HistoricalNotification notification) {
-        synchronized (mLock) {
-            final NotificationHistoryDatabase userHistory =
-                    getUserHistoryAndInitializeIfNeededLocked(notification.getUserId());
-            if (userHistory == null) {
-                Slog.w(TAG, "Attempted to add notif for locked/gone/disabled user "
-                        + notification.getUserId());
-                return;
+        Binder.withCleanCallingIdentity(() -> {
+            synchronized (mLock) {
+                final NotificationHistoryDatabase userHistory =
+                        getUserHistoryAndInitializeIfNeededLocked(notification.getUserId());
+                if (userHistory == null) {
+                    Slog.w(TAG, "Attempted to add notif for locked/gone/disabled user "
+                            + notification.getUserId());
+                    return;
+                }
+                userHistory.addNotification(notification);
             }
-            userHistory.addNotification(notification);
-        }
+        });
     }
 
     public @NonNull NotificationHistory readNotificationHistory(@UserIdInt int[] userIds) {
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index f9fc82b..341e974 100755
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -32,6 +32,7 @@
 import static android.app.NotificationManager.ACTION_NOTIFICATION_CHANNEL_BLOCK_STATE_CHANGED;
 import static android.app.NotificationManager.ACTION_NOTIFICATION_CHANNEL_GROUP_BLOCK_STATE_CHANGED;
 import static android.app.NotificationManager.ACTION_NOTIFICATION_POLICY_ACCESS_GRANTED_CHANGED;
+import static android.app.NotificationManager.BUBBLE_PREFERENCE_ALL;
 import static android.app.NotificationManager.EXTRA_AUTOMATIC_ZEN_RULE_ID;
 import static android.app.NotificationManager.EXTRA_AUTOMATIC_ZEN_RULE_STATUS;
 import static android.app.NotificationManager.IMPORTANCE_LOW;
@@ -107,6 +108,7 @@
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.RequiresPermission;
+import android.annotation.UserIdInt;
 import android.annotation.WorkerThread;
 import android.app.ActivityManager;
 import android.app.ActivityManagerInternal;
@@ -155,6 +157,7 @@
 import android.content.pm.PackageManagerInternal;
 import android.content.pm.ParceledListSlice;
 import android.content.pm.ShortcutInfo;
+import android.content.pm.ShortcutServiceInternal;
 import android.content.pm.UserInfo;
 import android.content.res.Resources;
 import android.database.ContentObserver;
@@ -286,10 +289,10 @@
 import java.io.OutputStream;
 import java.io.PrintWriter;
 import java.nio.charset.StandardCharsets;
-import java.util.ArrayDeque;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Iterator;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Map.Entry;
 import java.util.Objects;
@@ -527,13 +530,15 @@
     private NotificationRecordLogger mNotificationRecordLogger;
     private InstanceIdSequence mNotificationInstanceIdSequence;
 
-    private static class Archive {
+    static class Archive {
+        final SparseArray<Boolean> mEnabled;
         final int mBufferSize;
-        final ArrayDeque<Pair<StatusBarNotification, Integer>> mBuffer;
+        final LinkedList<Pair<StatusBarNotification, Integer>> mBuffer;
 
         public Archive(int size) {
             mBufferSize = size;
-            mBuffer = new ArrayDeque<>(mBufferSize);
+            mBuffer = new LinkedList<>();
+            mEnabled = new SparseArray<>();
         }
 
         public String toString() {
@@ -546,7 +551,10 @@
             return sb.toString();
         }
 
-        public void record(StatusBarNotification nr, int reason) {
+        public void record(StatusBarNotification sbn, int reason) {
+            if (!mEnabled.get(sbn.getNormalizedUserId(), false)) {
+                return;
+            }
             if (mBuffer.size() == mBufferSize) {
                 mBuffer.removeFirst();
             }
@@ -554,7 +562,7 @@
             // We don't want to store the heavy bits of the notification in the archive,
             // but other clients in the system process might be using the object, so we
             // store a (lightened) copy.
-            mBuffer.addLast(new Pair<>(nr.cloneLight(), reason));
+            mBuffer.addLast(new Pair<>(sbn.cloneLight(), reason));
         }
 
         public Iterator<Pair<StatusBarNotification, Integer>> descendingIterator() {
@@ -576,60 +584,25 @@
             return  a.toArray(new StatusBarNotification[a.size()]);
         }
 
+        public void updateHistoryEnabled(@UserIdInt int userId, boolean enabled) {
+            mEnabled.put(userId, enabled);
+
+            if (!enabled) {
+                for (int i = mBuffer.size() - 1; i >= 0; i--) {
+                    if (userId == mBuffer.get(i).first.getNormalizedUserId()) {
+                        mBuffer.remove(i);
+                    }
+                }
+            }
+        }
     }
 
     void loadDefaultApprovedServices(int userId) {
-        String defaultListenerAccess = getContext().getResources().getString(
-                com.android.internal.R.string.config_defaultListenerAccessPackages);
-        if (defaultListenerAccess != null) {
-            String[] listeners =
-                    defaultListenerAccess.split(ManagedServices.ENABLED_SERVICES_SEPARATOR);
-            for (int i = 0; i < listeners.length; i++) {
-                if (TextUtils.isEmpty(listeners[i])) {
-                    continue;
-                }
-                ArraySet<ComponentName> approvedListeners =
-                        mListeners.queryPackageForServices(listeners[i],
-                                MATCH_DIRECT_BOOT_AWARE
-                                        | MATCH_DIRECT_BOOT_UNAWARE, userId);
-                for (int k = 0; k < approvedListeners.size(); k++) {
-                    ComponentName cn = approvedListeners.valueAt(k);
-                    mListeners.addDefaultComponentOrPackage(cn.flattenToString());
-                }
-            }
-        }
+        mListeners.loadDefaultsFromConfig();
 
-        String defaultDndAccess = getContext().getResources().getString(
-                com.android.internal.R.string.config_defaultDndAccessPackages);
-        if (defaultDndAccess != null) {
-            String[] dnds = defaultDndAccess.split(ManagedServices.ENABLED_SERVICES_SEPARATOR);
-            for (int i = 0; i < dnds.length; i++) {
-                if (TextUtils.isEmpty(dnds[i])) {
-                    continue;
-                }
-                mConditionProviders.addDefaultComponentOrPackage(dnds[i]);
-            }
-        }
+        mConditionProviders.loadDefaultsFromConfig();
 
-
-        ArraySet<String> assistants = new ArraySet<>();
-        String deviceAssistant = DeviceConfig.getProperty(
-                DeviceConfig.NAMESPACE_SYSTEMUI,
-                SystemUiDeviceConfigFlags.NAS_DEFAULT_SERVICE);
-        if (deviceAssistant != null) {
-            assistants.addAll(Arrays.asList(deviceAssistant.split(
-                    ManagedServices.ENABLED_SERVICES_SEPARATOR)));
-        }
-        assistants.addAll(Arrays.asList(getContext().getResources().getString(
-                com.android.internal.R.string.config_defaultAssistantAccessComponent)
-                .split(ManagedServices.ENABLED_SERVICES_SEPARATOR)));
-        for (int i = 0; i < assistants.size(); i++) {
-            String cnString = assistants.valueAt(i);
-            if (TextUtils.isEmpty(cnString)) {
-                continue;
-            }
-            mAssistants.addDefaultComponentOrPackage(cnString);
-        }
+        mAssistants.loadDefaultsFromConfig();
     }
 
     protected void allowDefaultApprovedServices(int userId) {
@@ -652,11 +625,14 @@
                 DeviceConfig.NAMESPACE_SYSTEMUI,
                 SystemUiDeviceConfigFlags.NAS_DEFAULT_SERVICE);
         if (overrideDefaultAssistantString != null) {
-            ComponentName overrideDefaultAssistant =
-                    ComponentName.unflattenFromString(overrideDefaultAssistantString);
-            if (allowAssistant(userId, overrideDefaultAssistant)) return;
+            ArraySet<ComponentName> approved = mAssistants.queryPackageForServices(
+                    overrideDefaultAssistantString,
+                    MATCH_DIRECT_BOOT_AWARE | MATCH_DIRECT_BOOT_UNAWARE,
+                    userId);
+            for (int i = 0; i < approved.size(); i++) {
+                if (allowAssistant(userId, approved.valueAt(i))) return;
+            }
         }
-
         ArraySet<ComponentName> defaults = mAssistants.getDefaultComponents();
         // We should have only one default assistant by default
         // allowAssistant should execute once in practice
@@ -1195,14 +1171,7 @@
         }
 
         @Override
-        public void onNotificationBubbleChanged(String key, boolean isBubble) {
-            String pkg;
-            synchronized (mNotificationLock) {
-                NotificationRecord r = mNotificationsByKey.get(key);
-                pkg = r != null && r.getSbn() != null ? r.getSbn().getPackageName() : null;
-            }
-            boolean isAppForeground = pkg != null
-                    && mActivityManager.getPackageImportance(pkg) == IMPORTANCE_FOREGROUND;
+        public void onNotificationBubbleChanged(String key, boolean isBubble, int flags) {
             synchronized (mNotificationLock) {
                 NotificationRecord r = mNotificationsByKey.get(key);
                 if (r != null) {
@@ -1219,8 +1188,13 @@
                         // be applied there.
                         r.getNotification().flags |= FLAG_ONLY_ALERT_ONCE;
                         r.setFlagBubbleRemoved(false);
+                        if (r.getNotification().getBubbleMetadata() != null) {
+                            r.getNotification().getBubbleMetadata().setFlags(flags);
+                        }
+                        // Force isAppForeground true here, because for sysui's purposes we
+                        // want to adjust the flag behaviour.
                         mHandler.post(new EnqueueNotificationRunnable(r.getUser().getIdentifier(),
-                                r, isAppForeground));
+                                r, true /* isAppForeground*/));
                     }
                 }
             }
@@ -1639,6 +1613,9 @@
                 = Settings.System.getUriFor(Settings.System.NOTIFICATION_LIGHT_PULSE);
         private final Uri NOTIFICATION_RATE_LIMIT_URI
                 = Settings.Global.getUriFor(Settings.Global.MAX_NOTIFICATION_ENQUEUE_RATE);
+        private final Uri NOTIFICATION_HISTORY_ENABLED
+                = Settings.Secure.getUriFor(Settings.Secure.NOTIFICATION_HISTORY_ENABLED);
+
 
         SettingsObserver(Handler handler) {
             super(handler);
@@ -1654,10 +1631,12 @@
                     false, this, UserHandle.USER_ALL);
             resolver.registerContentObserver(NOTIFICATION_BUBBLES_URI,
                     false, this, UserHandle.USER_ALL);
+            resolver.registerContentObserver(NOTIFICATION_HISTORY_ENABLED,
+                    false, this, UserHandle.USER_ALL);
             update(null);
         }
 
-        @Override public void onChange(boolean selfChange, Uri uri) {
+        @Override public void onChange(boolean selfChange, Uri uri, int userId) {
             update(uri);
         }
 
@@ -1682,6 +1661,14 @@
             if (uri == null || NOTIFICATION_BUBBLES_URI.equals(uri)) {
                 mPreferencesHelper.updateBubblesEnabled();
             }
+            if (uri == null || NOTIFICATION_HISTORY_ENABLED.equals(uri)) {
+                final IntArray userIds = mUserProfiles.getCurrentProfileIds();
+
+                for (int i = 0; i < userIds.size(); i++) {
+                    mArchive.updateHistoryEnabled(userIds.get(i), Settings.Secure.getInt(resolver,
+                            Settings.Secure.NOTIFICATION_HISTORY_ENABLED, 0) == 1);
+                }
+            }
         }
     }
 
@@ -1960,7 +1947,8 @@
                 mPackageManagerClient,
                 mRankingHandler,
                 mZenModeHelper,
-                new NotificationChannelLoggerImpl());
+                new NotificationChannelLoggerImpl(),
+                mAppOps);
         mRankingHelper = new RankingHelper(getContext(),
                 mRankingHandler,
                 mPreferencesHelper,
@@ -2301,7 +2289,8 @@
             mRoleObserver.init();
             LauncherApps launcherApps =
                     (LauncherApps) getContext().getSystemService(Context.LAUNCHER_APPS_SERVICE);
-            mShortcutHelper = new ShortcutHelper(launcherApps, mShortcutListener);
+            mShortcutHelper = new ShortcutHelper(launcherApps, mShortcutListener, getLocalService(
+                    ShortcutServiceInternal.class));
             BubbleExtractor bubbsExtractor = mRankingHelper.findExtractor(BubbleExtractor.class);
             if (bubbsExtractor != null) {
                 bubbsExtractor.setShortcutHelper(mShortcutHelper);
@@ -2729,6 +2718,16 @@
         }
         return text == null ? null : String.valueOf(text);
     }
+    
+    protected void maybeRegisterMessageSent(NotificationRecord r) {
+        Context appContext = r.getSbn().getPackageContext(getContext());
+        Notification.Builder nb = 
+                Notification.Builder.recoverBuilder(appContext, r.getNotification());
+        if (nb.getStyle() instanceof Notification.MessagingStyle) {
+            mPreferencesHelper.setMessageSent(r.getSbn().getPackageName(), r.getUid());
+            handleSavePolicyFile();
+        }
+    }
 
     /**
      * Report to usage stats that the user interacted with the notification.
@@ -3079,40 +3078,37 @@
             return mPreferencesHelper.getImportance(pkg, uid) != IMPORTANCE_NONE;
         }
 
+        /**
+         * @return true if and only if "all" bubbles are allowed from the provided package.
+         */
         @Override
         public boolean areBubblesAllowed(String pkg) {
-            return areBubblesAllowedForPackage(pkg, Binder.getCallingUid());
+            return getBubblePreferenceForPackage(pkg, Binder.getCallingUid())
+                    == BUBBLE_PREFERENCE_ALL;
         }
 
         @Override
-        public boolean areBubblesAllowedForPackage(String pkg, int uid) {
+        public int getBubblePreferenceForPackage(String pkg, int uid) {
             enforceSystemOrSystemUIOrSamePackage(pkg,
                     "Caller not system or systemui or same package");
 
             if (UserHandle.getCallingUserId() != UserHandle.getUserId(uid)) {
                 getContext().enforceCallingPermission(
                         android.Manifest.permission.INTERACT_ACROSS_USERS,
-                        "canNotifyAsPackage for uid " + uid);
+                        "getBubblePreferenceForPackage for uid " + uid);
             }
 
-            return mPreferencesHelper.areBubblesAllowed(pkg, uid);
+            return mPreferencesHelper.getBubblePreference(pkg, uid);
         }
 
         @Override
-        public void setBubblesAllowed(String pkg, int uid, boolean allowed) {
-            enforceSystemOrSystemUI("Caller not system or systemui");
-            mPreferencesHelper.setBubblesAllowed(pkg, uid, allowed);
+        public void setBubblesAllowed(String pkg, int uid, int bubblePreference) {
+            checkCallerIsSystemOrSystemUiOrShell("Caller not system or sysui or shell");
+            mPreferencesHelper.setBubblesAllowed(pkg, uid, bubblePreference);
             handleSavePolicyFile();
         }
 
         @Override
-        public boolean hasUserApprovedBubblesForPackage(String pkg, int uid) {
-            enforceSystemOrSystemUI("Caller not system or systemui");
-            int lockedFields = mPreferencesHelper.getAppLockedFields(pkg, uid);
-            return (lockedFields & PreferencesHelper.LockableAppFields.USER_LOCKED_BUBBLE) != 0;
-        }
-
-        @Override
         public boolean shouldHideSilentStatusIcons(String callingPkg) {
             checkCallerIsSameApp(callingPkg);
 
@@ -3160,6 +3156,12 @@
         }
 
         @Override
+        public boolean hasSentMessage(String pkg, int uid) {
+            checkCallerIsSystem();
+            return mPreferencesHelper.hasSentMessage(pkg, uid);
+        }
+
+        @Override
         public void setNotificationDelegate(String callingPkg, String delegate) {
             checkCallerIsSameApp(callingPkg);
             final int callingUid = Binder.getCallingUid();
@@ -3308,7 +3310,7 @@
                 String targetPkg, String channelId, boolean returnParentIfNoConversationChannel,
                 String conversationId) {
             if (canNotifyAsPackage(callingPkg, targetPkg, userId)
-                    || isCallerIsSystemOrSystemUi()) {
+                    || isCallerIsSystemOrSysemUiOrShell()) {
                 int targetUid = -1;
                 try {
                     targetUid = mPackageManagerClient.getPackageUidAsUser(targetPkg, userId);
@@ -3418,7 +3420,7 @@
         @Override
         public void updateNotificationChannelForPackage(String pkg, int uid,
                 NotificationChannel channel) {
-            enforceSystemOrSystemUI("Caller not system or systemui");
+            checkCallerIsSystemOrSystemUiOrShell("Caller not system or sysui or shell");
             Objects.requireNonNull(channel);
             updateNotificationChannelInt(pkg, uid, channel, false);
         }
@@ -3842,7 +3844,7 @@
         public void registerListener(final INotificationListener listener,
                 final ComponentName component, final int userid) {
             enforceSystemOrSystemUI("INotificationManager.registerListener");
-            mListeners.registerService(listener, component, userid);
+            mListeners.registerSystemService(listener, component, userid);
         }
 
         /**
@@ -5697,6 +5699,14 @@
             return;
         }
 
+        if (info != null) {
+            // Cache the shortcut synchronously after the associated notification is posted in case
+            // the app unpublishes this shortcut immediately after posting the notification. If the
+            // user does not modify the notification settings on this conversation, the shortcut
+            // will be uncached by People Service when all the associated notifications are removed.
+            mShortcutHelper.cacheShortcut(info, user);
+        }
+
         // Whitelist pending intents.
         if (notification.allPendingIntents != null) {
             final int intentCount = notification.allPendingIntents.size();
@@ -5848,6 +5858,7 @@
                     synchronized (mNotificationLock) {
                         NotificationRecord r = mNotificationsByKey.get(key);
                         if (r != null) {
+                            r.setShortcutInfo(null);
                             // Enqueue will trigger resort & flag is updated that way.
                             r.getNotification().flags |= FLAG_ONLY_ALERT_ONCE;
                             mHandler.post(
@@ -6472,6 +6483,7 @@
                     }
 
                     maybeRecordInterruptionLocked(r);
+                    maybeRegisterMessageSent(r);
 
                     // Log event to statsd
                     mNotificationRecordLogger.maybeLogNotificationPosted(r, old, position,
@@ -7210,7 +7222,10 @@
             boolean interruptiveChanged =
                     record.canBubble() && (interruptiveBefore != record.isInterruptive());
 
-            changed = indexChanged || interceptChanged || visibilityChanged || interruptiveChanged;
+            changed = indexChanged
+                    || interceptChanged
+                    || visibilityChanged
+                    || interruptiveChanged;
             if (interceptBefore && !record.isIntercepted()
                     && record.isNewEnoughForAlerting(System.currentTimeMillis())) {
                 buzzBeepBlinkLocked(record);
@@ -8248,6 +8263,14 @@
                 == PERMISSION_GRANTED;
     }
 
+    private boolean isCallerIsSystemOrSysemUiOrShell() {
+        int callingUid = Binder.getCallingUid();
+        if (callingUid == Process.SHELL_UID || callingUid == Process.ROOT_UID) {
+            return true;
+        }
+        return isCallerIsSystemOrSystemUi();
+    }
+
     private void checkCallerIsSystemOrShell() {
         int callingUid = Binder.getCallingUid();
         if (callingUid == Process.SHELL_UID || callingUid == Process.ROOT_UID) {
@@ -8264,6 +8287,10 @@
     }
 
     private void checkCallerIsSystemOrSystemUiOrShell() {
+        checkCallerIsSystemOrSystemUiOrShell(null);
+    }
+
+    private void checkCallerIsSystemOrSystemUiOrShell(String message) {
         int callingUid = Binder.getCallingUid();
         if (callingUid == Process.SHELL_UID || callingUid == Process.ROOT_UID) {
             return;
@@ -8271,7 +8298,8 @@
         if (isCallerSystemOrPhone()) {
             return;
         }
-        getContext().enforceCallingPermission(android.Manifest.permission.STATUS_BAR_SERVICE, null);
+        getContext().enforceCallingPermission(android.Manifest.permission.STATUS_BAR_SERVICE,
+                message);
     }
 
     private void checkCallerIsSystemOrSameApp(String pkg) {
@@ -8555,6 +8583,26 @@
         private ArrayMap<Integer, Boolean> mUserSetMap = new ArrayMap<>();
         private Set<String> mAllowedAdjustments = new ArraySet<>();
 
+        @Override
+        protected void loadDefaultsFromConfig() {
+            ArraySet<String> assistants = new ArraySet<>();
+            assistants.addAll(Arrays.asList(mContext.getResources().getString(
+                    com.android.internal.R.string.config_defaultAssistantAccessComponent)
+                    .split(ManagedServices.ENABLED_SERVICES_SEPARATOR)));
+            for (int i = 0; i < assistants.size(); i++) {
+                String cnString = assistants.valueAt(i);
+                if (TextUtils.isEmpty(cnString)) {
+                    continue;
+                }
+                ArraySet<ComponentName> approved = queryPackageForServices(cnString,
+                        MATCH_DIRECT_BOOT_AWARE | MATCH_DIRECT_BOOT_UNAWARE, USER_SYSTEM);
+                for (int k = 0; k < approved.size(); k++) {
+                    ComponentName cn = approved.valueAt(k);
+                    addDefaultComponentOrPackage(cn.flattenToString());
+                }
+            }
+        }
+
         public NotificationAssistants(Context context, Object lock, UserProfiles up,
                 IPackageManager pm) {
             super(context, lock, up, pm);
@@ -8992,7 +9040,29 @@
 
         public NotificationListeners(IPackageManager pm) {
             super(getContext(), mNotificationLock, mUserProfiles, pm);
+        }
 
+        @Override
+        protected void loadDefaultsFromConfig() {
+            String defaultListenerAccess = mContext.getResources().getString(
+                    R.string.config_defaultListenerAccessPackages);
+            if (defaultListenerAccess != null) {
+                String[] listeners =
+                        defaultListenerAccess.split(ManagedServices.ENABLED_SERVICES_SEPARATOR);
+                for (int i = 0; i < listeners.length; i++) {
+                    if (TextUtils.isEmpty(listeners[i])) {
+                        continue;
+                    }
+                    ArraySet<ComponentName> approvedListeners =
+                            this.queryPackageForServices(listeners[i],
+                                    MATCH_DIRECT_BOOT_AWARE
+                                            | MATCH_DIRECT_BOOT_UNAWARE, USER_SYSTEM);
+                    for (int k = 0; k < approvedListeners.size(); k++) {
+                        ComponentName cn = approvedListeners.valueAt(k);
+                        addDefaultComponentOrPackage(cn.flattenToString());
+                    }
+                }
+            }
         }
 
         @Override
diff --git a/services/core/java/com/android/server/notification/NotificationRecord.java b/services/core/java/com/android/server/notification/NotificationRecord.java
index 192df41..e45b41d 100644
--- a/services/core/java/com/android/server/notification/NotificationRecord.java
+++ b/services/core/java/com/android/server/notification/NotificationRecord.java
@@ -55,7 +55,6 @@
 import android.service.notification.StatusBarNotification;
 import android.text.TextUtils;
 import android.util.ArraySet;
-import android.util.FeatureFlagUtils;
 import android.util.Log;
 import android.util.TimeUtils;
 import android.util.proto.ProtoOutputStream;
@@ -581,6 +580,8 @@
         pw.println(prefix + "mLight= " + mLight);
         pw.println(prefix + "mShowBadge=" + mShowBadge);
         pw.println(prefix + "mColorized=" + notification.isColorized());
+        pw.println(prefix + "mAllowBubble=" + mAllowBubble);
+        pw.println(prefix + "isBubble=" + notification.isBubbleNotification());
         pw.println(prefix + "mIsInterruptive=" + mIsInterruptive);
         pw.println(prefix + "effectiveNotificationChannel=" + getChannel());
         if (getPeopleOverride() != null) {
@@ -590,6 +591,8 @@
             pw.println(prefix + "snoozeCriteria=" + TextUtils.join(",", getSnoozeCriteria()));
         }
         pw.println(prefix + "mAdjustments=" + mAdjustments);
+        pw.println(prefix + "shortcut=" + notification.getShortcutId()
+                + " found valid? " + (mShortcutInfo != null));
     }
 
     @Override
diff --git a/services/core/java/com/android/server/notification/NotificationShellCmd.java b/services/core/java/com/android/server/notification/NotificationShellCmd.java
index 2b5ba25..e4a1774 100644
--- a/services/core/java/com/android/server/notification/NotificationShellCmd.java
+++ b/services/core/java/com/android/server/notification/NotificationShellCmd.java
@@ -38,7 +38,6 @@
 import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.Icon;
-import android.media.IRingtonePlayer;
 import android.net.Uri;
 import android.os.Binder;
 import android.os.Process;
@@ -48,8 +47,6 @@
 import android.text.TextUtils;
 import android.util.Slog;
 
-import com.android.internal.util.FunctionalUtils;
-
 import java.io.PrintWriter;
 import java.net.URISyntaxException;
 import java.util.Collections;
@@ -72,7 +69,11 @@
             + "  unsuspend_package PACKAGE\n"
             + "  reset_assistant_user_set [user_id (current user if not specified)]\n"
             + "  get_approved_assistant [user_id (current user if not specified)]\n"
-            + "  post [--help | flags] TAG TEXT";
+            + "  post [--help | flags] TAG TEXT\n"
+            + "  set_bubbles PACKAGE PREFERENCE (0=none 1=all 2=selected) "
+                    + "[user_id (current user if not specified)]\n"
+            + "  set_bubbles_channel PACKAGE CHANNEL_ID ALLOW "
+                    + "[user_id (current user if not specified)]\n";
 
     private static final String NOTIFY_USAGE =
               "usage: cmd notification post [flags] <tag> <text>\n\n"
@@ -109,6 +110,7 @@
     private final NotificationManagerService mDirectService;
     private final INotificationManager mBinderService;
     private final PackageManager mPm;
+    private NotificationChannel mChannel;
 
     public NotificationShellCmd(NotificationManagerService service) {
         mDirectService = service;
@@ -276,6 +278,40 @@
                     }
                     break;
                 }
+                case "set_bubbles": {
+                    // only use for testing
+                    String packageName = getNextArgRequired();
+                    int preference = Integer.parseInt(getNextArgRequired());
+                    if (preference > 3 || preference < 0) {
+                        pw.println("Invalid preference - must be between 0-3 "
+                                + "(0=none 1=all 2=selected)");
+                        return -1;
+                    }
+                    int userId = ActivityManager.getCurrentUser();
+                    if (peekNextArg() != null) {
+                        userId = Integer.parseInt(getNextArgRequired());
+                    }
+                    int appUid = UserHandle.getUid(userId, mPm.getPackageUid(packageName, 0));
+                    mBinderService.setBubblesAllowed(packageName, appUid, preference);
+                    break;
+                }
+                case "set_bubbles_channel": {
+                    // only use for testing
+                    String packageName = getNextArgRequired();
+                    String channelId = getNextArgRequired();
+                    boolean allow = Boolean.parseBoolean(getNextArgRequired());
+                    int userId = ActivityManager.getCurrentUser();
+                    if (peekNextArg() != null) {
+                        userId = Integer.parseInt(getNextArgRequired());
+                    }
+                    NotificationChannel channel = mBinderService.getNotificationChannel(
+                            callingPackage, userId, packageName, channelId);
+                    channel.setAllowBubbles(allow);
+                    int appUid = UserHandle.getUid(userId, mPm.getPackageUid(packageName, 0));
+                    mBinderService.updateNotificationChannelForPackage(packageName, appUid,
+                            channel);
+                    break;
+                }
                 case "post":
                 case "notify":
                     doNotify(pw, callingPackage, callingUid);
diff --git a/services/core/java/com/android/server/notification/PreferencesHelper.java b/services/core/java/com/android/server/notification/PreferencesHelper.java
index 8154988..6d7b410 100644
--- a/services/core/java/com/android/server/notification/PreferencesHelper.java
+++ b/services/core/java/com/android/server/notification/PreferencesHelper.java
@@ -16,7 +16,10 @@
 
 package com.android.server.notification;
 
+import static android.app.AppOpsManager.OP_SYSTEM_ALERT_WINDOW;
 import static android.app.NotificationChannel.PLACEHOLDER_CONVERSATION_ID;
+import static android.app.NotificationManager.BUBBLE_PREFERENCE_ALL;
+import static android.app.NotificationManager.BUBBLE_PREFERENCE_NONE;
 import static android.app.NotificationManager.IMPORTANCE_NONE;
 import static android.app.NotificationManager.IMPORTANCE_UNSPECIFIED;
 
@@ -29,6 +32,7 @@
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.UserIdInt;
+import android.app.AppOpsManager;
 import android.app.Notification;
 import android.app.NotificationChannel;
 import android.app.NotificationChannelGroup;
@@ -78,7 +82,9 @@
 
 public class PreferencesHelper implements RankingConfig {
     private static final String TAG = "NotificationPrefHelper";
-    private static final int XML_VERSION = 1;
+    private static final int XML_VERSION = 2;
+    /** What version to check to do the upgrade for bubbles. */
+    private static final int XML_VERSION_BUBBLES_UPGRADE = 1;
     private static final int UNKNOWN_UID = UserHandle.USER_NULL;
     private static final String NON_BLOCKABLE_CHANNEL_DELIM = ":";
 
@@ -110,6 +116,7 @@
     private static final String ATT_ENABLED = "enabled";
     private static final String ATT_USER_ALLOWED = "allowed";
     private static final String ATT_HIDE_SILENT = "hide_gentle";
+    private static final String ATT_SENT_MESSAGE = "sent_msg";
 
     private static final int DEFAULT_PRIORITY = Notification.PRIORITY_DEFAULT;
     private static final int DEFAULT_VISIBILITY = NotificationManager.VISIBILITY_NO_OVERRIDE;
@@ -117,10 +124,14 @@
     @VisibleForTesting
     static final boolean DEFAULT_HIDE_SILENT_STATUS_BAR_ICONS = false;
     private static final boolean DEFAULT_SHOW_BADGE = true;
-    static final boolean DEFAULT_ALLOW_BUBBLE = true;
+
     private static final boolean DEFAULT_OEM_LOCKED_IMPORTANCE  = false;
     private static final boolean DEFAULT_APP_LOCKED_IMPORTANCE  = false;
 
+    static final boolean DEFAULT_GLOBAL_ALLOW_BUBBLE = true;
+    @VisibleForTesting
+    static final int DEFAULT_BUBBLE_PREFERENCE = BUBBLE_PREFERENCE_NONE;
+
     /**
      * Default value for what fields are user locked. See {@link LockableAppFields} for all lockable
      * fields.
@@ -146,9 +157,10 @@
     private final RankingHandler mRankingHandler;
     private final ZenModeHelper mZenModeHelper;
     private final NotificationChannelLogger mNotificationChannelLogger;
+    private final AppOpsManager mAppOps;
 
     private SparseBooleanArray mBadgingEnabled;
-    private boolean mBubblesEnabled = DEFAULT_ALLOW_BUBBLE;
+    private boolean mBubblesEnabledGlobally = DEFAULT_GLOBAL_ALLOW_BUBBLE;
     private boolean mAreChannelsBypassingDnd;
     private boolean mHideSilentStatusBarIcons = DEFAULT_HIDE_SILENT_STATUS_BAR_ICONS;
 
@@ -162,12 +174,14 @@
     }
 
     public PreferencesHelper(Context context, PackageManager pm, RankingHandler rankingHandler,
-            ZenModeHelper zenHelper, NotificationChannelLogger notificationChannelLogger) {
+            ZenModeHelper zenHelper, NotificationChannelLogger notificationChannelLogger,
+            AppOpsManager appOpsManager) {
         mContext = context;
         mZenModeHelper = zenHelper;
         mRankingHandler = rankingHandler;
         mPm = pm;
         mNotificationChannelLogger = notificationChannelLogger;
+        mAppOps = appOpsManager;
 
         // STOPSHIP (b/142218092) this should be removed before ship
         if (!wasBadgingForcedTrue(context)) {
@@ -190,6 +204,15 @@
         if (type != XmlPullParser.START_TAG) return;
         String tag = parser.getName();
         if (!TAG_RANKING.equals(tag)) return;
+
+        boolean upgradeForBubbles = false;
+        if (parser.getAttributeCount() > 0) {
+            String attribute = parser.getAttributeName(0);
+            if (ATT_VERSION.equals(attribute)) {
+                int xmlVersion = Integer.parseInt(parser.getAttributeValue(0));
+                upgradeForBubbles = xmlVersion == XML_VERSION_BUBBLES_UPGRADE;
+            }
+        }
         synchronized (mPackagePreferences) {
             while ((type = parser.next()) != XmlPullParser.END_DOCUMENT) {
                 tag = parser.getName();
@@ -215,6 +238,16 @@
                                 }
                             }
                             boolean skipWarningLogged = false;
+                            boolean hasSAWPermission = false;
+                            if (upgradeForBubbles) {
+                                hasSAWPermission = mAppOps.noteOpNoThrow(
+                                        OP_SYSTEM_ALERT_WINDOW, uid, name, null,
+                                        "check-notif-bubble") == AppOpsManager.MODE_ALLOWED;
+                            }
+                            int bubblePref = hasSAWPermission
+                                    ? BUBBLE_PREFERENCE_ALL
+                                    : XmlUtils.readIntAttribute(parser, ATT_ALLOW_BUBBLE,
+                                            DEFAULT_BUBBLE_PREFERENCE);
 
                             PackagePreferences r = getOrCreatePackagePreferencesLocked(
                                     name, userId, uid,
@@ -226,8 +259,7 @@
                                             parser, ATT_VISIBILITY, DEFAULT_VISIBILITY),
                                     XmlUtils.readBooleanAttribute(
                                             parser, ATT_SHOW_BADGE, DEFAULT_SHOW_BADGE),
-                                    XmlUtils.readBooleanAttribute(
-                                            parser, ATT_ALLOW_BUBBLE, DEFAULT_ALLOW_BUBBLE));
+                                    bubblePref);
                             r.importance = XmlUtils.readIntAttribute(
                                     parser, ATT_IMPORTANCE, DEFAULT_IMPORTANCE);
                             r.priority = XmlUtils.readIntAttribute(
@@ -238,6 +270,8 @@
                                     parser, ATT_SHOW_BADGE, DEFAULT_SHOW_BADGE);
                             r.lockedAppFields = XmlUtils.readIntAttribute(parser,
                                     ATT_APP_USER_LOCKED_FIELDS, DEFAULT_LOCKED_APP_FIELDS);
+                            r.hasSentMessage = XmlUtils.readBooleanAttribute(
+                                    parser, ATT_SENT_MESSAGE, false);
 
                             final int innerDepth = parser.getDepth();
                             while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
@@ -339,19 +373,19 @@
             int uid) {
         return getOrCreatePackagePreferencesLocked(pkg, UserHandle.getUserId(uid), uid,
                 DEFAULT_IMPORTANCE, DEFAULT_PRIORITY, DEFAULT_VISIBILITY, DEFAULT_SHOW_BADGE,
-                DEFAULT_ALLOW_BUBBLE);
+                DEFAULT_BUBBLE_PREFERENCE);
     }
 
     private PackagePreferences getOrCreatePackagePreferencesLocked(String pkg,
             @UserIdInt int userId, int uid) {
         return getOrCreatePackagePreferencesLocked(pkg, userId, uid,
                 DEFAULT_IMPORTANCE, DEFAULT_PRIORITY, DEFAULT_VISIBILITY, DEFAULT_SHOW_BADGE,
-                DEFAULT_ALLOW_BUBBLE);
+                DEFAULT_BUBBLE_PREFERENCE);
     }
 
     private PackagePreferences getOrCreatePackagePreferencesLocked(String pkg,
             @UserIdInt int userId, int uid, int importance, int priority, int visibility,
-            boolean showBadge, boolean allowBubble) {
+            boolean showBadge, int bubblePreference) {
         final String key = packagePreferencesKey(pkg, uid);
         PackagePreferences
                 r = (uid == UNKNOWN_UID)
@@ -365,7 +399,7 @@
             r.priority = priority;
             r.visibility = visibility;
             r.showBadge = showBadge;
-            r.allowBubble = allowBubble;
+            r.bubblePreference = bubblePreference;
 
             try {
                 createDefaultChannelIfNeededLocked(r);
@@ -479,7 +513,8 @@
                                 || r.channels.size() > 0
                                 || r.groups.size() > 0
                                 || r.delegate != null
-                                || r.allowBubble != DEFAULT_ALLOW_BUBBLE;
+                                || r.bubblePreference != DEFAULT_BUBBLE_PREFERENCE
+                                || r.hasSentMessage;
                 if (hasNonDefaultSettings) {
                     out.startTag(null, TAG_PACKAGE);
                     out.attribute(null, ATT_NAME, r.pkg);
@@ -492,12 +527,13 @@
                     if (r.visibility != DEFAULT_VISIBILITY) {
                         out.attribute(null, ATT_VISIBILITY, Integer.toString(r.visibility));
                     }
-                    if (r.allowBubble != DEFAULT_ALLOW_BUBBLE) {
-                        out.attribute(null, ATT_ALLOW_BUBBLE, Boolean.toString(r.allowBubble));
+                    if (r.bubblePreference != DEFAULT_BUBBLE_PREFERENCE) {
+                        out.attribute(null, ATT_ALLOW_BUBBLE, Integer.toString(r.bubblePreference));
                     }
                     out.attribute(null, ATT_SHOW_BADGE, Boolean.toString(r.showBadge));
                     out.attribute(null, ATT_APP_USER_LOCKED_FIELDS,
                             Integer.toString(r.lockedAppFields));
+                    out.attribute(null, ATT_SENT_MESSAGE, Boolean.toString(r.hasSentMessage));
 
                     if (!forBackup) {
                         out.attribute(null, ATT_UID, Integer.toString(r.uid));
@@ -544,14 +580,14 @@
      *
      * @param pkg the package to allow or not allow bubbles for.
      * @param uid the uid to allow or not allow bubbles for.
-     * @param allowed whether bubbles are allowed.
+     * @param bubblePreference whether bubbles are allowed.
      */
-    public void setBubblesAllowed(String pkg, int uid, boolean allowed) {
+    public void setBubblesAllowed(String pkg, int uid, int bubblePreference) {
         boolean changed = false;
         synchronized (mPackagePreferences) {
             PackagePreferences p = getOrCreatePackagePreferencesLocked(pkg, uid);
-            changed = p.allowBubble != allowed;
-            p.allowBubble = allowed;
+            changed = p.bubblePreference != bubblePreference;
+            p.bubblePreference = bubblePreference;
             p.lockedAppFields = p.lockedAppFields | LockableAppFields.USER_LOCKED_BUBBLE;
         }
         if (changed) {
@@ -567,9 +603,9 @@
      * @return whether bubbles are allowed.
      */
     @Override
-    public boolean areBubblesAllowed(String pkg, int uid) {
+    public int getBubblePreference(String pkg, int uid) {
         synchronized (mPackagePreferences) {
-            return getOrCreatePackagePreferencesLocked(pkg, uid).allowBubble;
+            return getOrCreatePackagePreferencesLocked(pkg, uid).bubblePreference;
         }
     }
 
@@ -616,6 +652,18 @@
         updateConfig();
     }
 
+    public boolean hasSentMessage(String packageName, int uid) {
+        synchronized (mPackagePreferences) {
+            return getOrCreatePackagePreferencesLocked(packageName, uid).hasSentMessage;
+        }
+    }
+
+    public void setMessageSent(String packageName, int uid) {
+        synchronized (mPackagePreferences) {
+            getOrCreatePackagePreferencesLocked(packageName, uid).hasSentMessage = true;
+        }
+    }
+
     @Override
     public boolean isGroupBlocked(String packageName, int uid, String groupId) {
         if (groupId == null) {
@@ -788,6 +836,9 @@
             }
             if (fromTargetApp) {
                 channel.setLockscreenVisibility(r.visibility);
+                channel.setAllowBubbles(existing != null
+                        ? existing.getAllowBubbles()
+                        : NotificationChannel.DEFAULT_ALLOW_BUBBLE);
             }
             clearLockedFieldsLocked(channel);
             channel.setImportanceLockedByOEM(r.oemLockedImportance);
@@ -1221,6 +1272,7 @@
                 for (int i = 0; i < N; i++) {
                     final NotificationChannel nc = p.channels.valueAt(i);
                     if (!TextUtils.isEmpty(nc.getConversationId()) && !nc.isDeleted()
+                            && !nc.isDemoted()
                             && (nc.isImportantConversation() || !onlyImportant)) {
                         ConversationChannelWrapper conversation = new ConversationChannelWrapper();
                         conversation.setPkg(p.pkg);
@@ -1672,7 +1724,7 @@
         if (original.canShowBadge() != update.canShowBadge()) {
             update.lockFields(NotificationChannel.USER_LOCKED_SHOW_BADGE);
         }
-        if (original.canBubble() != update.canBubble()) {
+        if (original.getAllowBubbles() != update.getAllowBubbles()) {
             update.lockFields(NotificationChannel.USER_LOCKED_ALLOW_BUBBLE);
         }
     }
@@ -2125,7 +2177,7 @@
                 p.groups = new ArrayMap<>();
                 p.delegate = null;
                 p.lockedAppFields = DEFAULT_LOCKED_APP_FIELDS;
-                p.allowBubble = DEFAULT_ALLOW_BUBBLE;
+                p.bubblePreference = DEFAULT_BUBBLE_PREFERENCE;
                 p.importance = DEFAULT_IMPORTANCE;
                 p.priority = DEFAULT_PRIORITY;
                 p.visibility = DEFAULT_VISIBILITY;
@@ -2165,15 +2217,15 @@
     public void updateBubblesEnabled() {
         final boolean newValue = Settings.Global.getInt(mContext.getContentResolver(),
                 Settings.Global.NOTIFICATION_BUBBLES,
-                DEFAULT_ALLOW_BUBBLE ? 1 : 0) == 1;
-        if (newValue != mBubblesEnabled) {
-            mBubblesEnabled = newValue;
+                DEFAULT_GLOBAL_ALLOW_BUBBLE ? 1 : 0) == 1;
+        if (newValue != mBubblesEnabledGlobally) {
+            mBubblesEnabledGlobally = newValue;
             updateConfig();
         }
     }
 
     public boolean bubblesEnabled() {
-        return mBubblesEnabled;
+        return mBubblesEnabledGlobally;
     }
 
     public void updateBadgingEnabled() {
@@ -2229,13 +2281,14 @@
         int priority = DEFAULT_PRIORITY;
         int visibility = DEFAULT_VISIBILITY;
         boolean showBadge = DEFAULT_SHOW_BADGE;
-        boolean allowBubble = DEFAULT_ALLOW_BUBBLE;
+        int bubblePreference = DEFAULT_BUBBLE_PREFERENCE;
         int lockedAppFields = DEFAULT_LOCKED_APP_FIELDS;
         // these fields are loaded on boot from a different source of truth and so are not
         // written to notification policy xml
         boolean oemLockedImportance = DEFAULT_OEM_LOCKED_IMPORTANCE;
         List<String> oemLockedChannels = new ArrayList<>();
         boolean defaultAppLockedImportance = DEFAULT_APP_LOCKED_IMPORTANCE;
+        boolean hasSentMessage = false;
 
         Delegate delegate = null;
         ArrayMap<String, NotificationChannel> channels = new ArrayMap<>();
diff --git a/services/core/java/com/android/server/notification/RankingConfig.java b/services/core/java/com/android/server/notification/RankingConfig.java
index 7e98be7..7fc79e6 100644
--- a/services/core/java/com/android/server/notification/RankingConfig.java
+++ b/services/core/java/com/android/server/notification/RankingConfig.java
@@ -29,7 +29,7 @@
     void setShowBadge(String packageName, int uid, boolean showBadge);
     boolean canShowBadge(String packageName, int uid);
     boolean badgingEnabled(UserHandle userHandle);
-    boolean areBubblesAllowed(String packageName, int uid);
+    int getBubblePreference(String packageName, int uid);
     boolean bubblesEnabled();
     boolean isGroupBlocked(String packageName, int uid, String groupId);
 
diff --git a/services/core/java/com/android/server/notification/ShortcutHelper.java b/services/core/java/com/android/server/notification/ShortcutHelper.java
index f1ce3a7..13892ba0 100644
--- a/services/core/java/com/android/server/notification/ShortcutHelper.java
+++ b/services/core/java/com/android/server/notification/ShortcutHelper.java
@@ -21,23 +21,37 @@
 import static android.content.pm.LauncherApps.ShortcutQuery.FLAG_MATCH_PINNED;
 
 import android.annotation.NonNull;
+import android.content.IntentFilter;
 import android.content.pm.LauncherApps;
 import android.content.pm.ShortcutInfo;
+import android.content.pm.ShortcutServiceInternal;
 import android.os.Binder;
 import android.os.Handler;
 import android.os.UserHandle;
+import android.util.Slog;
 
 import com.android.internal.annotations.VisibleForTesting;
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 
 /**
  * Helper for querying shortcuts.
  */
-class ShortcutHelper {
+public class ShortcutHelper {
+    private static final String TAG = "ShortcutHelper";
+
+    private static final IntentFilter SHARING_FILTER = new IntentFilter();
+    static {
+        try {
+            SHARING_FILTER.addDataType("*/*");
+        } catch (IntentFilter.MalformedMimeTypeException e) {
+            Slog.e(TAG, "Bad mime type", e);
+        }
+    }
 
     /**
      * Listener to call when a shortcut we're tracking has been removed.
@@ -48,6 +62,7 @@
 
     private LauncherApps mLauncherAppsService;
     private ShortcutListener mShortcutListener;
+    private ShortcutServiceInternal mShortcutServiceInternal;
 
     // Key: packageName Value: <shortcutId, notifId>
     private HashMap<String, HashMap<String, String>> mActiveShortcutBubbles = new HashMap<>();
@@ -111,9 +126,11 @@
         }
     };
 
-    ShortcutHelper(LauncherApps launcherApps, ShortcutListener listener) {
+    ShortcutHelper(LauncherApps launcherApps, ShortcutListener listener,
+            ShortcutServiceInternal shortcutServiceInternal) {
         mLauncherAppsService = launcherApps;
         mShortcutListener = listener;
+        mShortcutServiceInternal = shortcutServiceInternal;
     }
 
     @VisibleForTesting
@@ -121,8 +138,27 @@
         mLauncherAppsService = launcherApps;
     }
 
+    @VisibleForTesting
+    void setShortcutServiceInternal(ShortcutServiceInternal shortcutServiceInternal) {
+        mShortcutServiceInternal = shortcutServiceInternal;
+    }
+
     /**
-     * Only returns shortcut info if it's found and if it's {@link ShortcutInfo#isLongLived()}.
+     * Returns whether the given shortcut info is a conversation shortcut.
+     */
+    public static boolean isConversationShortcut(
+            ShortcutInfo shortcutInfo, ShortcutServiceInternal mShortcutServiceInternal,
+            int callingUserId) {
+        if (shortcutInfo == null || !shortcutInfo.isLongLived() || !shortcutInfo.isEnabled()) {
+            return false;
+        }
+        return mShortcutServiceInternal.isSharingShortcut(callingUserId, "android",
+                shortcutInfo.getPackage(), shortcutInfo.getId(), shortcutInfo.getUserId(),
+                SHARING_FILTER);
+    }
+
+    /**
+     * Only returns shortcut info if it's found and if it's a conversation shortcut.
      */
     ShortcutInfo getValidShortcutInfo(String shortcutId, String packageName, UserHandle user) {
         if (mLauncherAppsService == null) {
@@ -141,13 +177,27 @@
             ShortcutInfo info = shortcuts != null && shortcuts.size() > 0
                     ? shortcuts.get(0)
                     : null;
-            return info != null && info.isLongLived() ? info : null;
+            if (isConversationShortcut(info, mShortcutServiceInternal, user.getIdentifier())) {
+                return info;
+            }
+            return null;
         } finally {
             Binder.restoreCallingIdentity(token);
         }
     }
 
     /**
+     * Caches the given shortcut in Shortcut Service.
+     */
+    void cacheShortcut(ShortcutInfo shortcutInfo, UserHandle user) {
+        if (shortcutInfo.isLongLived() && !shortcutInfo.isCached()) {
+            mShortcutServiceInternal.cacheShortcuts(user.getIdentifier(), "android",
+                    shortcutInfo.getPackage(), Collections.singletonList(shortcutInfo.getId()),
+                    shortcutInfo.getUserId());
+        }
+    }
+
+    /**
      * Shortcut based bubbles require some extra work to listen for shortcut changes.
      *
      * @param r the notification record to check
diff --git a/services/core/java/com/android/server/pm/AppsFilter.java b/services/core/java/com/android/server/pm/AppsFilter.java
index 7c47cf0..118fdcb 100644
--- a/services/core/java/com/android/server/pm/AppsFilter.java
+++ b/services/core/java/com/android/server/pm/AppsFilter.java
@@ -27,12 +27,11 @@
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManagerInternal;
 import android.content.pm.PackageParser;
-import android.content.pm.parsing.component.ParsedActivity;
 import android.content.pm.parsing.component.ParsedComponent;
 import android.content.pm.parsing.component.ParsedInstrumentation;
 import android.content.pm.parsing.component.ParsedIntentInfo;
+import android.content.pm.parsing.component.ParsedMainComponent;
 import android.content.pm.parsing.component.ParsedProvider;
-import android.content.pm.parsing.component.ParsedService;
 import android.os.Binder;
 import android.os.Process;
 import android.os.Trace;
@@ -302,7 +301,7 @@
             AndroidPackage potentialTarget, Set<String> protectedBroadcasts) {
         if (!querying.getQueriesIntents().isEmpty()) {
             for (Intent intent : querying.getQueriesIntents()) {
-                if (matchesIntentFilters(intent, potentialTarget, protectedBroadcasts)) {
+                if (matchesPackage(intent, potentialTarget, protectedBroadcasts)) {
                     return true;
                 }
             }
@@ -354,33 +353,35 @@
         return false;
     }
 
-    private static boolean matchesIntentFilters(Intent intent, AndroidPackage potentialTarget,
+    private static boolean matchesPackage(Intent intent, AndroidPackage potentialTarget,
             Set<String> protectedBroadcasts) {
-        for (int s = ArrayUtils.size(potentialTarget.getServices()) - 1; s >= 0; s--) {
-            ParsedService service = potentialTarget.getServices().get(s);
-            if (!service.isExported()) {
-                continue;
-            }
-            if (matchesAnyFilter(intent, service, null /*protectedBroadcasts*/)) {
-                return true;
-            }
+        if (matchesAnyComponents(
+                intent, potentialTarget.getServices(), null /*protectedBroadcasts*/)) {
+            return true;
         }
-        for (int a = ArrayUtils.size(potentialTarget.getActivities()) - 1; a >= 0; a--) {
-            ParsedActivity activity = potentialTarget.getActivities().get(a);
-            if (!activity.isExported()) {
-                continue;
-            }
+        if (matchesAnyComponents(
+                intent, potentialTarget.getActivities(), null /*protectedBroadcasts*/)) {
+            return true;
+        }
+        if (matchesAnyComponents(intent, potentialTarget.getReceivers(), protectedBroadcasts)) {
+            return true;
+        }
+        if (matchesAnyComponents(
+                intent, potentialTarget.getProviders(), null /*protectedBroadcasts*/)) {
+            return true;
+        }
+        return false;
+    }
 
-            if (matchesAnyFilter(intent, activity, null /*protectedBroadcasts*/)) {
-                return true;
-            }
-        }
-        for (int r = ArrayUtils.size(potentialTarget.getReceivers()) - 1; r >= 0; r--) {
-            ParsedActivity receiver = potentialTarget.getReceivers().get(r);
-            if (!receiver.isExported()) {
+    private static boolean matchesAnyComponents(Intent intent,
+            List<? extends ParsedMainComponent> components,
+            Set<String> protectedBroadcasts) {
+        for (int i = ArrayUtils.size(components) - 1; i >= 0; i--) {
+            ParsedMainComponent component = components.get(i);
+            if (!component.isExported()) {
                 continue;
             }
-            if (matchesAnyFilter(intent, receiver, protectedBroadcasts)) {
+            if (matchesAnyFilter(intent, component, protectedBroadcasts)) {
                 return true;
             }
         }
@@ -612,7 +613,7 @@
                     }
                     final int insert = ~loc;
                     System.arraycopy(appIds, insert, buffer, 0, whitelistSize - insert);
-                    appIds[insert] = existingUid;
+                    appIds[insert] = existingAppId;
                     System.arraycopy(buffer, 0, appIds, insert + 1, whitelistSize - insert);
                     whitelistSize++;
                 }
diff --git a/services/core/java/com/android/server/pm/BackgroundDexOptService.java b/services/core/java/com/android/server/pm/BackgroundDexOptService.java
index dab4bfd..5415967 100644
--- a/services/core/java/com/android/server/pm/BackgroundDexOptService.java
+++ b/services/core/java/com/android/server/pm/BackgroundDexOptService.java
@@ -17,6 +17,7 @@
 package com.android.server.pm;
 
 import static com.android.server.pm.PackageManagerService.DEBUG_DEXOPT;
+import static com.android.server.pm.PackageManagerService.PLATFORM_PACKAGE_NAME;
 
 import android.annotation.Nullable;
 import android.app.job.JobInfo;
@@ -434,7 +435,7 @@
                 | DexoptOptions.DEXOPT_DOWNGRADE;
         long package_size_before = getPackageSize(pm, pkg);
 
-        if (isForPrimaryDex) {
+        if (isForPrimaryDex || PLATFORM_PACKAGE_NAME.equals(pkg)) {
             // This applies for system apps or if packages location is not a directory, i.e.
             // monolithic install.
             if (!pm.canHaveOatDir(pkg)) {
@@ -486,7 +487,9 @@
                 | DexoptOptions.DEXOPT_BOOT_COMPLETE
                 | DexoptOptions.DEXOPT_IDLE_BACKGROUND_JOB;
 
-        return isForPrimaryDex
+        // System server share the same code path as primary dex files.
+        // PackageManagerService will select the right optimization path for it.
+        return (isForPrimaryDex || PLATFORM_PACKAGE_NAME.equals(pkg))
             ? performDexOptPrimary(pm, pkg, reason, dexoptFlags)
             : performDexOptSecondary(pm, pkg, reason, dexoptFlags);
     }
diff --git a/services/core/java/com/android/server/pm/DataLoaderManagerService.java b/services/core/java/com/android/server/pm/DataLoaderManagerService.java
index 09baf6e..dec3f1a 100644
--- a/services/core/java/com/android/server/pm/DataLoaderManagerService.java
+++ b/services/core/java/com/android/server/pm/DataLoaderManagerService.java
@@ -23,7 +23,6 @@
 import android.content.ServiceConnection;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.DataLoaderParamsParcel;
-import android.content.pm.FileSystemControlParcel;
 import android.content.pm.IDataLoader;
 import android.content.pm.IDataLoaderManager;
 import android.content.pm.IDataLoaderStatusListener;
@@ -35,7 +34,6 @@
 import android.util.Slog;
 import android.util.SparseArray;
 
-import com.android.internal.annotations.GuardedBy;
 import com.android.server.SystemService;
 
 import java.util.List;
@@ -49,8 +47,6 @@
     private static final String TAG = "DataLoaderManager";
     private final Context mContext;
     private final DataLoaderManagerBinderService mBinderService;
-    private final Object mLock = new Object();
-    @GuardedBy("mLock")
     private SparseArray<DataLoaderServiceConnection> mServiceConnections = new SparseArray<>();
 
     public DataLoaderManagerService(Context context) {
@@ -66,27 +62,30 @@
 
     final class DataLoaderManagerBinderService extends IDataLoaderManager.Stub {
         @Override
-        public boolean initializeDataLoader(int dataLoaderId, DataLoaderParamsParcel params,
-                FileSystemControlParcel control, IDataLoaderStatusListener listener) {
-            synchronized (mLock) {
+        public boolean bindToDataLoader(int dataLoaderId, DataLoaderParamsParcel params,
+                IDataLoaderStatusListener listener) {
+            synchronized (mServiceConnections) {
                 if (mServiceConnections.get(dataLoaderId) != null) {
-                    Slog.e(TAG, "Data loader of ID=" + dataLoaderId + " already exists.");
-                    return false;
+                    return true;
                 }
             }
             ComponentName componentName = new ComponentName(params.packageName, params.className);
             ComponentName dataLoaderComponent = resolveDataLoaderComponentName(componentName);
             if (dataLoaderComponent == null) {
+                Slog.e(TAG, "Invalid component: " + componentName + " for ID=" + dataLoaderId);
                 return false;
             }
-            // Binds to the specific data loader service
-            DataLoaderServiceConnection connection =
-                    new DataLoaderServiceConnection(dataLoaderId, params, control, listener);
+
+            // Binds to the specific data loader service.
+            DataLoaderServiceConnection connection = new DataLoaderServiceConnection(dataLoaderId,
+                    listener);
+
             Intent intent = new Intent();
             intent.setComponent(dataLoaderComponent);
             if (!mContext.bindServiceAsUser(intent, connection, Context.BIND_AUTO_CREATE,
                     UserHandle.of(UserHandle.getCallingUserId()))) {
-                Slog.e(TAG, "Failed to bind to data loader binder service.");
+                Slog.e(TAG,
+                        "Failed to bind to: " + dataLoaderComponent + " for ID=" + dataLoaderId);
                 mContext.unbindService(connection);
                 return false;
             }
@@ -146,7 +145,7 @@
          */
         @Override
         public @Nullable IDataLoader getDataLoader(int dataLoaderId) {
-            synchronized (mLock) {
+            synchronized (mServiceConnections) {
                 DataLoaderServiceConnection serviceConnection = mServiceConnections.get(
                         dataLoaderId, null);
                 if (serviceConnection == null) {
@@ -157,14 +156,14 @@
         }
 
         /**
-         * Destroys a data loader binder service, specified by its ID.
+         * Unbinds from a data loader binder service, specified by its ID. DataLoader will receive
+         * destroy notification.
          */
         @Override
-        public void destroyDataLoader(int dataLoaderId) {
-            synchronized (mLock) {
+        public void unbindFromDataLoader(int dataLoaderId) {
+            synchronized (mServiceConnections) {
                 DataLoaderServiceConnection serviceConnection = mServiceConnections.get(
                         dataLoaderId, null);
-
                 if (serviceConnection == null) {
                     return;
                 }
@@ -173,18 +172,13 @@
         }
     }
 
-    class DataLoaderServiceConnection implements ServiceConnection {
+    private class DataLoaderServiceConnection implements ServiceConnection {
         final int mId;
-        final DataLoaderParamsParcel mParams;
-        final FileSystemControlParcel mControl;
         final IDataLoaderStatusListener mListener;
         IDataLoader mDataLoader;
 
-        DataLoaderServiceConnection(int id, DataLoaderParamsParcel params,
-                FileSystemControlParcel control, IDataLoaderStatusListener listener) {
+        DataLoaderServiceConnection(int id, IDataLoaderStatusListener listener) {
             mId = id;
-            mParams = params;
-            mControl = control;
             mListener = listener;
             mDataLoader = null;
         }
@@ -192,19 +186,40 @@
         @Override
         public void onServiceConnected(ComponentName className, IBinder service) {
             mDataLoader = IDataLoader.Stub.asInterface(service);
-            synchronized (mLock) {
+            if (mDataLoader == null) {
+                onNullBinding(className);
+                return;
+            }
+            synchronized (mServiceConnections) {
+                if (mServiceConnections.get(mId) != null) {
+                    // Another connection already bound for this ID.
+                    mContext.unbindService(this);
+                    return;
+                }
                 mServiceConnections.append(mId, this);
             }
-            try {
-                mDataLoader.create(mId, mParams, mControl, mListener);
-            } catch (RemoteException e) {
-                Slog.e(TAG, "Failed to create data loader service.", e);
-            }
+            callListener(IDataLoaderStatusListener.DATA_LOADER_BOUND);
         }
 
         @Override
         public void onServiceDisconnected(ComponentName arg0) {
-            remove();
+            Slog.i(TAG, "DataLoader " + mId + " disconnected, but will try to recover");
+            callListener(IDataLoaderStatusListener.DATA_LOADER_DESTROYED);
+            destroy();
+        }
+
+        @Override
+        public void onBindingDied(ComponentName name) {
+            Slog.i(TAG, "DataLoader " + mId + " died");
+            callListener(IDataLoaderStatusListener.DATA_LOADER_DESTROYED);
+            destroy();
+        }
+
+        @Override
+        public void onNullBinding(ComponentName name) {
+            Slog.i(TAG, "DataLoader " + mId + " failed to start");
+            callListener(IDataLoaderStatusListener.DATA_LOADER_DESTROYED);
+            destroy();
         }
 
         IDataLoader getDataLoader() {
@@ -212,17 +227,30 @@
         }
 
         void destroy() {
-            try {
-                mDataLoader.destroy(mId);
-            } catch (RemoteException ignored) {
+            if (mDataLoader != null) {
+                try {
+                    mDataLoader.destroy(mId);
+                } catch (RemoteException ignored) {
+                }
+                mDataLoader = null;
             }
             mContext.unbindService(this);
+            remove();
         }
 
         private void remove() {
-            synchronized (mLock) {
+            synchronized (mServiceConnections) {
                 mServiceConnections.remove(mId);
             }
         }
+
+        private void callListener(int status) {
+            if (mListener != null) {
+                try {
+                    mListener.onStatusChanged(mId, status);
+                } catch (RemoteException ignored) {
+                }
+            }
+        }
     }
 }
diff --git a/services/core/java/com/android/server/pm/Installer.java b/services/core/java/com/android/server/pm/Installer.java
index 9fb468e..5ac86ca 100644
--- a/services/core/java/com/android/server/pm/Installer.java
+++ b/services/core/java/com/android/server/pm/Installer.java
@@ -39,6 +39,7 @@
 import dalvik.system.VMRuntime;
 
 import java.io.FileDescriptor;
+import java.util.Arrays;
 
 public class Installer extends SystemService {
     private static final String TAG = "Installer";
@@ -71,6 +72,8 @@
     public static final int DEXOPT_GENERATE_COMPACT_DEX = 1 << 11;
     /** Indicates that dexopt should generate an app image */
     public static final int DEXOPT_GENERATE_APP_IMAGE = 1 << 12;
+    /** Indicates that dexopt may be run with different performance / priority tuned for restore */
+    public static final int DEXOPT_FOR_RESTORE = 1 << 13; // TODO(b/135202722): remove
 
     public static final int FLAG_STORAGE_DE = IInstalld.FLAG_STORAGE_DE;
     public static final int FLAG_STORAGE_CE = IInstalld.FLAG_STORAGE_CE;
@@ -184,6 +187,30 @@
         }
     }
 
+    /**
+     * Batched version of createAppData for use with multiple packages.
+     */
+    public void createAppDataBatched(String[] uuids, String[] packageNames, int userId, int flags,
+            int[] appIds, String[] seInfos, int[] targetSdkVersions) throws InstallerException {
+        if (!checkBeforeRemote()) return;
+        final int batchSize = 256;
+        for (int i = 0; i < uuids.length; i += batchSize) {
+            int to = i + batchSize;
+            if (to > uuids.length) {
+                to = uuids.length;
+            }
+
+            try {
+                mInstalld.createAppDataBatched(Arrays.copyOfRange(uuids, i, to),
+                        Arrays.copyOfRange(packageNames, i, to), userId, flags,
+                        Arrays.copyOfRange(appIds, i, to), Arrays.copyOfRange(seInfos, i, to),
+                        Arrays.copyOfRange(targetSdkVersions, i, to));
+            } catch (Exception e) {
+                throw InstallerException.from(e);
+            }
+        }
+    }
+
     public void restoreconAppData(String uuid, String packageName, int userId, int flags, int appId,
             String seInfo) throws InstallerException {
         if (!checkBeforeRemote()) return;
diff --git a/services/core/java/com/android/server/pm/PackageDexOptimizer.java b/services/core/java/com/android/server/pm/PackageDexOptimizer.java
index 65b7cf3..4b8a242 100644
--- a/services/core/java/com/android/server/pm/PackageDexOptimizer.java
+++ b/services/core/java/com/android/server/pm/PackageDexOptimizer.java
@@ -22,6 +22,7 @@
 import static com.android.server.pm.Installer.DEXOPT_DEBUGGABLE;
 import static com.android.server.pm.Installer.DEXOPT_ENABLE_HIDDEN_API_CHECKS;
 import static com.android.server.pm.Installer.DEXOPT_FORCE;
+import static com.android.server.pm.Installer.DEXOPT_FOR_RESTORE;
 import static com.android.server.pm.Installer.DEXOPT_GENERATE_APP_IMAGE;
 import static com.android.server.pm.Installer.DEXOPT_GENERATE_COMPACT_DEX;
 import static com.android.server.pm.Installer.DEXOPT_IDLE_BACKGROUND_JOB;
@@ -32,6 +33,7 @@
 import static com.android.server.pm.Installer.DEXOPT_STORAGE_DE;
 import static com.android.server.pm.InstructionSets.getAppDexInstructionSets;
 import static com.android.server.pm.InstructionSets.getDexCodeInstructionSets;
+import static com.android.server.pm.PackageManagerService.PLATFORM_PACKAGE_NAME;
 import static com.android.server.pm.PackageManagerService.WATCHDOG_TIMEOUT;
 import static com.android.server.pm.PackageManagerServiceCompilerMapping.getReasonName;
 
@@ -115,7 +117,9 @@
 
     static boolean canOptimizePackage(AndroidPackage pkg) {
         // We do not dexopt a package with no code.
-        if (!pkg.isHasCode()) {
+        // Note that the system package is marked as having no code, however we can
+        // still optimize it via dexoptSystemServerPath.
+        if (!PLATFORM_PACKAGE_NAME.equals(pkg.getPackageName()) && !pkg.isHasCode()) {
             return false;
         }
 
@@ -132,6 +136,10 @@
     int performDexOpt(AndroidPackage pkg, @NonNull PackageSetting pkgSetting,
             String[] instructionSets, CompilerStats.PackageStats packageStats,
             PackageDexUsage.PackageUseInfo packageUseInfo, DexoptOptions options) {
+        if (PLATFORM_PACKAGE_NAME.equals(pkg.getPackageName())) {
+            throw new IllegalArgumentException("System server dexopting should be done via "
+                    + " DexManager and PackageDexOptimizer#dexoptSystemServerPath");
+        }
         if (pkg.getUid() == -1) {
             throw new IllegalArgumentException("Dexopt for " + pkg.getPackageName()
                     + " has invalid uid.");
@@ -699,6 +707,7 @@
                 | (options.isDexoptIdleBackgroundJob() ? DEXOPT_IDLE_BACKGROUND_JOB : 0)
                 | (generateCompactDex ? DEXOPT_GENERATE_COMPACT_DEX : 0)
                 | (generateAppImage ? DEXOPT_GENERATE_APP_IMAGE : 0)
+                | (options.isDexoptInstallForRestore() ? DEXOPT_FOR_RESTORE : 0)
                 | hiddenApiFlag;
         return adjustDexoptFlags(dexFlags);
     }
diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java
index 57908f3..3367cd5 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerService.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerService.java
@@ -82,6 +82,7 @@
 import com.android.internal.util.IndentingPrintWriter;
 import com.android.server.IoThread;
 import com.android.server.LocalServices;
+import com.android.server.SystemConfig;
 import com.android.server.pm.parsing.PackageParser2;
 import com.android.server.pm.permission.PermissionManagerServiceInternal;
 
@@ -151,6 +152,7 @@
     private final Callbacks mCallbacks;
 
     private volatile boolean mOkToSendBroadcasts = false;
+    private volatile boolean mBypassNextStagedInstallerCheck = false;
 
     /**
      * File storing persisted {@link #mSessions} metadata.
@@ -541,7 +543,7 @@
             }
         }
 
-        if (Build.IS_DEBUGGABLE || isDowngradeAllowedForCaller(callingUid)) {
+        if (Build.IS_DEBUGGABLE || isCalledBySystemOrShell(callingUid)) {
             params.installFlags |= PackageManager.INSTALL_ALLOW_DOWNGRADE;
         } else {
             params.installFlags &= ~PackageManager.INSTALL_ALLOW_DOWNGRADE;
@@ -571,6 +573,14 @@
             }
         }
 
+        if (mBypassNextStagedInstallerCheck) {
+            mBypassNextStagedInstallerCheck = false;
+        } else if (params.isStaged
+                && !isCalledBySystemOrShell(callingUid)
+                && !isWhitelistedStagedInstaller(requestedInstallerPackageName)) {
+            throw new SecurityException("Installer not allowed to commit staged install");
+        }
+
         if (!params.isMultiPackage) {
             // Only system components can circumvent runtime permissions when installing.
             if ((params.installFlags & PackageManager.INSTALL_GRANT_RUNTIME_PERMISSIONS) != 0
@@ -683,11 +693,15 @@
         return sessionId;
     }
 
-    private boolean isDowngradeAllowedForCaller(int callingUid) {
+    private boolean isCalledBySystemOrShell(int callingUid) {
         return callingUid == Process.SYSTEM_UID || callingUid == Process.ROOT_UID
                 || callingUid == Process.SHELL_UID;
     }
 
+    private boolean isWhitelistedStagedInstaller(String installerName) {
+        return SystemConfig.getInstance().getWhitelistedStagedInstallers().contains(installerName);
+    }
+
     @Override
     public void updateSessionAppIcon(int sessionId, Bitmap appIcon) {
         synchronized (mSessions) {
@@ -963,6 +977,14 @@
         }
     }
 
+    @Override
+    public void bypassNextStagedInstallerCheck(boolean value) {
+        if (!isCalledBySystemOrShell(Binder.getCallingUid())) {
+            throw new SecurityException("Caller not allowed to bypass staged installer check");
+        }
+        mBypassNextStagedInstallerCheck = value;
+    }
+
     private static int getSessionCount(SparseArray<PackageInstallerSession> sessions,
             int installerUid) {
         int count = 0;
diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java
index 2221644..8e7eaf6 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerSession.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java
@@ -150,7 +150,6 @@
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.Objects;
 import java.util.Set;
@@ -2099,11 +2098,13 @@
                             continue;
                         }
 
-                        mResolvedInstructionSets.add(archSubDir.getName());
-                        List<File> oatFiles = Arrays.asList(archSubDir.listFiles());
-                        if (!oatFiles.isEmpty()) {
-                            mResolvedInheritedFiles.addAll(oatFiles);
+                        File[] files = archSubDir.listFiles();
+                        if (files == null || files.length == 0) {
+                            continue;
                         }
+
+                        mResolvedInstructionSets.add(archSubDir.getName());
+                        mResolvedInheritedFiles.addAll(Arrays.asList(files));
                     }
                 }
             }
@@ -2117,7 +2118,8 @@
                     if (!libDir.exists() || !libDir.isDirectory()) {
                         continue;
                     }
-                    final List<File> libDirsToInherit = new LinkedList<>();
+                    final List<String> libDirsToInherit = new ArrayList<>();
+                    final List<File> libFilesToInherit = new ArrayList<>();
                     for (File archSubDir : libDir.listFiles()) {
                         if (!archSubDir.isDirectory()) {
                             continue;
@@ -2129,14 +2131,24 @@
                             Slog.e(TAG, "Skipping linking of native library directory!", e);
                             // shouldn't be possible, but let's avoid inheriting these to be safe
                             libDirsToInherit.clear();
+                            libFilesToInherit.clear();
                             break;
                         }
-                        if (!mResolvedNativeLibPaths.contains(relLibPath)) {
-                            mResolvedNativeLibPaths.add(relLibPath);
+
+                        File[] files = archSubDir.listFiles();
+                        if (files == null || files.length == 0) {
+                            continue;
                         }
-                        libDirsToInherit.addAll(Arrays.asList(archSubDir.listFiles()));
+
+                        libDirsToInherit.add(relLibPath);
+                        libFilesToInherit.addAll(Arrays.asList(files));
                     }
-                    mResolvedInheritedFiles.addAll(libDirsToInherit);
+                    for (String subDir : libDirsToInherit) {
+                        if (!mResolvedNativeLibPaths.contains(subDir)) {
+                            mResolvedNativeLibPaths.add(subDir);
+                        }
+                    }
+                    mResolvedInheritedFiles.addAll(libFilesToInherit);
                 }
             }
         }
@@ -2589,8 +2601,9 @@
                     "Failed to find data loader manager service");
         }
 
+        final DataLoaderParams params = this.params.dataLoaderParams;
         final boolean manualStartAndDestroy = !isIncrementalInstallation();
-        IDataLoaderStatusListener listener = new IDataLoaderStatusListener.Stub() {
+        final IDataLoaderStatusListener listener = new IDataLoaderStatusListener.Stub() {
             @Override
             public void onStatusChanged(int dataLoaderId, int status) {
                 switch (status) {
@@ -2617,6 +2630,15 @@
                     }
 
                     switch (status) {
+                        case IDataLoaderStatusListener.DATA_LOADER_BOUND: {
+                            if (manualStartAndDestroy) {
+                                FileSystemControlParcel control = new FileSystemControlParcel();
+                                control.callback = new FileSystemConnector(addedFiles);
+                                dataLoader.create(dataLoaderId, params.getData(), control, this);
+                            }
+
+                            break;
+                        }
                         case IDataLoaderStatusListener.DATA_LOADER_CREATED: {
                             if (manualStartAndDestroy) {
                                 // IncrementalFileStorages will call start after all files are
@@ -2668,8 +2690,8 @@
 
         if (!manualStartAndDestroy) {
             try {
-                mIncrementalFileStorages = IncrementalFileStorages.initialize(mContext,
-                        stageDir, params.dataLoaderParams, listener, addedFiles);
+                mIncrementalFileStorages = IncrementalFileStorages.initialize(mContext, stageDir,
+                        params, listener, addedFiles);
                 return false;
             } catch (IOException e) {
                 throw new PackageManagerException(INSTALL_FAILED_MEDIA_UNAVAILABLE, e.getMessage(),
@@ -2677,13 +2699,8 @@
             }
         }
 
-        final FileSystemConnector connector = new FileSystemConnector(addedFiles);
-        final FileSystemControlParcel control = new FileSystemControlParcel();
-        control.callback = connector;
-
-        final DataLoaderParams params = this.params.dataLoaderParams;
-        if (!dataLoaderManager.initializeDataLoader(
-                sessionId, params.getData(), control, listener)) {
+        if (!dataLoaderManager.bindToDataLoader(
+                sessionId, params.getData(), listener)) {
             throw new PackageManagerException(INSTALL_FAILED_MEDIA_UNAVAILABLE,
                     "Failed to initialize data loader");
         }
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 59ac603..28987ed 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -66,6 +66,8 @@
 import static android.content.pm.PackageManager.INSTALL_INTERNAL;
 import static android.content.pm.PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES;
 import static android.content.pm.PackageManager.INSTALL_PARSE_FAILED_NO_CERTIFICATES;
+import static android.content.pm.PackageManager.INSTALL_REASON_DEVICE_RESTORE;
+import static android.content.pm.PackageManager.INSTALL_REASON_DEVICE_SETUP;
 import static android.content.pm.PackageManager.INSTALL_SUCCEEDED;
 import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS;
 import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS_ASK;
@@ -94,6 +96,7 @@
 import static android.content.pm.PackageManager.PERMISSION_GRANTED;
 import static android.content.pm.PackageManager.RESTRICTION_NONE;
 import static android.content.pm.PackageManager.UNINSTALL_REASON_UNKNOWN;
+import static android.content.pm.PackageParser.SigningDetails.SignatureSchemeVersion.SIGNING_BLOCK_V4;
 import static android.content.pm.PackageParser.isApkFile;
 import static android.os.Trace.TRACE_TAG_PACKAGE_MANAGER;
 import static android.os.incremental.IncrementalManager.isIncrementalPath;
@@ -348,6 +351,7 @@
 import com.android.server.pm.dex.DexoptOptions;
 import com.android.server.pm.dex.PackageDexUsage;
 import com.android.server.pm.dex.ViewCompiler;
+import com.android.server.pm.parsing.PackageCacher;
 import com.android.server.pm.parsing.PackageInfoUtils;
 import com.android.server.pm.parsing.PackageParser2;
 import com.android.server.pm.parsing.library.PackageBackwardCompatibility;
@@ -1343,13 +1347,6 @@
                     int updatedStatus = INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED;
                     boolean needUpdate = false;
 
-                    if (DEBUG_DOMAIN_VERIFICATION) {
-                        Slog.d(TAG,
-                                "Updating IntentFilterVerificationInfo for package " + packageName
-                                + " verificationId:" + verificationId
-                                + " verified=" + verified);
-                    }
-
                     // In a success case, we promote from undefined or ASK to ALWAYS.  This
                     // supports a flow where the app fails validation but then ships an updated
                     // APK that passes, and therefore deserves to be in ALWAYS.
@@ -1820,10 +1817,12 @@
                             state.setVerifierResponse(Binder.getCallingUid(),
                                     PackageManager.VERIFICATION_ALLOW_WITHOUT_SUFFICIENT);
                             broadcastPackageVerified(verificationId, originUri,
-                                    PackageManager.VERIFICATION_ALLOW, user);
+                                    PackageManager.VERIFICATION_ALLOW, null, args.mDataLoaderType,
+                                    user);
                         } else {
                             broadcastPackageVerified(verificationId, originUri,
-                                    PackageManager.VERIFICATION_REJECT, user);
+                                    PackageManager.VERIFICATION_REJECT, null, args.mDataLoaderType,
+                                    user);
                             params.setReturnCode(
                                     PackageManager.INSTALL_FAILED_VERIFICATION_FAILURE);
                             state.setVerifierResponse(Binder.getCallingUid(),
@@ -1899,7 +1898,7 @@
 
                         if (state.isInstallAllowed()) {
                             broadcastPackageVerified(verificationId, originUri,
-                                    response.code, args.getUser());
+                                    response.code, null, args.mDataLoaderType, args.getUser());
                         } else {
                             params.setReturnCode(
                                     PackageManager.INSTALL_FAILED_VERIFICATION_FAILURE);
@@ -2812,10 +2811,14 @@
     }
 
     public PackageManagerService(Injector injector, boolean onlyCore, boolean factoryTest) {
-        PackageManager.invalidatePackageInfoCache();
         PackageManager.disableApplicationInfoCache();
         PackageManager.disablePackageInfoCache();
 
+        // Avoid invalidation-thrashing by preventing cache invalidations from causing property
+        // writes if the cache isn't enabled yet.  We re-enable writes later when we're
+        // done initializing.
+        PackageManager.corkPackageInfoCache();
+
         final TimingsTraceAndSlog t = new TimingsTraceAndSlog(TAG + "Timing",
                 Trace.TRACE_TAG_PACKAGE_MANAGER);
         mPendingBroadcasts = new PendingPackageBroadcasts();
@@ -3576,7 +3579,8 @@
             // Prepare a supplier of package parser for the staging manager to parse apex file
             // during the staging installation.
             final Supplier<PackageParser2> apexParserSupplier = () -> new PackageParser2(
-                    mSeparateProcesses, mOnlyCore, mMetrics, mCacheDir, mPackageParserCallback);
+                    mSeparateProcesses, mOnlyCore, mMetrics, null /* cacheDir */,
+                    mPackageParserCallback);
             mInstallerService = new PackageInstallerService(mContext, this, apexParserSupplier);
             final Pair<ComponentName, String> instantAppResolverComponent =
                     getInstantAppResolverLPr();
@@ -3620,6 +3624,9 @@
 
         mModuleInfoProvider = new ModuleInfoProvider(mContext, this);
 
+        // Uncork cache invalidations and allow clients to cache package information.
+        PackageManager.uncorkPackageInfoCache();
+
         // Now after opening every single application zip, make sure they
         // are all flushed.  Not really needed, but keeps things nice and
         // tidy.
@@ -5935,8 +5942,25 @@
                     || shouldFilterApplicationLocked(ps2, callingUid, callingUserId)) {
                 return PackageManager.SIGNATURE_UNKNOWN_PACKAGE;
             }
-            return compareSignatures(p1.getSigningDetails().signatures,
-                    p2.getSigningDetails().signatures);
+            SigningDetails p1SigningDetails = p1.getSigningDetails();
+            SigningDetails p2SigningDetails = p2.getSigningDetails();
+            int result = compareSignatures(p1SigningDetails.signatures,
+                    p2SigningDetails.signatures);
+            // To support backwards compatibility with clients of this API expecting pre-key
+            // rotation results if either of the packages has a signing lineage the oldest signer
+            // in the lineage is used for signature verification.
+            if (result != PackageManager.SIGNATURE_MATCH && (
+                    p1SigningDetails.hasPastSigningCertificates()
+                            || p2SigningDetails.hasPastSigningCertificates())) {
+                Signature[] p1Signatures = p1SigningDetails.hasPastSigningCertificates()
+                        ? new Signature[]{p1SigningDetails.pastSigningCertificates[0]}
+                        : p1SigningDetails.signatures;
+                Signature[] p2Signatures = p2SigningDetails.hasPastSigningCertificates()
+                        ? new Signature[]{p2SigningDetails.pastSigningCertificates[0]}
+                        : p2SigningDetails.signatures;
+                result = compareSignatures(p1Signatures, p2Signatures);
+            }
+            return result;
         }
     }
 
@@ -11179,8 +11203,16 @@
         boolean needToDeriveAbi = (scanFlags & SCAN_FIRST_BOOT_OR_UPGRADE) != 0;
         if (!needToDeriveAbi) {
             if (pkgSetting != null) {
-                primaryCpuAbiFromSettings = pkgSetting.primaryCpuAbiString;
-                secondaryCpuAbiFromSettings = pkgSetting.secondaryCpuAbiString;
+                // TODO(b/154610922): if it is not first boot or upgrade, we should directly use
+                // API info from existing package setting. However, stub packages currently do not
+                // preserve ABI info, thus the special condition check here. Remove the special
+                // check after we fix the stub generation.
+                if (pkgSetting.pkg != null && pkgSetting.pkg.isStub()) {
+                    needToDeriveAbi = true;
+                } else {
+                    primaryCpuAbiFromSettings = pkgSetting.primaryCpuAbiString;
+                    secondaryCpuAbiFromSettings = pkgSetting.secondaryCpuAbiString;
+                }
             } else {
                 // Re-scanning a system package after uninstalling updates; need to derive ABI
                 needToDeriveAbi = true;
@@ -13575,12 +13607,17 @@
     }
 
     private void broadcastPackageVerified(int verificationId, Uri packageUri,
-            int verificationCode, UserHandle user) {
+            int verificationCode, @Nullable String rootHashString, int dataLoaderType,
+            UserHandle user) {
         final Intent intent = new Intent(Intent.ACTION_PACKAGE_VERIFIED);
         intent.setDataAndType(packageUri, PACKAGE_MIME_TYPE);
         intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
         intent.putExtra(PackageManager.EXTRA_VERIFICATION_ID, verificationId);
         intent.putExtra(PackageManager.EXTRA_VERIFICATION_RESULT, verificationCode);
+        if (rootHashString != null) {
+            intent.putExtra(PackageManager.EXTRA_VERIFICATION_ROOT_HASH, rootHashString);
+        }
+        intent.putExtra(PackageInstaller.EXTRA_DATA_LOADER_TYPE, dataLoaderType);
 
         mContext.sendBroadcastAsUser(intent, user,
                 android.Manifest.permission.PACKAGE_VERIFICATION_AGENT);
@@ -14952,8 +14989,17 @@
             verificationState.setRequiredVerifierUid(requiredUid);
             final int installerUid =
                     verificationInfo == null ? -1 : verificationInfo.installerUid;
-            if (!origin.existing && isVerificationEnabled(pkgLite, verifierUser.getIdentifier(),
-                      installFlags, installerUid)) {
+            final boolean isVerificationEnabled = isVerificationEnabled(
+                    pkgLite, verifierUser.getIdentifier(), installFlags, installerUid);
+            final boolean isV4Signed =
+                    (mArgs.signingDetails.signatureSchemeVersion == SIGNING_BLOCK_V4);
+            final boolean isIncrementalInstall =
+                    (mArgs.mDataLoaderType == DataLoaderType.INCREMENTAL);
+            // NOTE: We purposefully skip verification for only incremental installs when there's
+            // a v4 signature block. Otherwise, proceed with verification as usual.
+            if (!origin.existing
+                    && isVerificationEnabled
+                    && (!isIncrementalInstall || !isV4Signed)) {
                 final Intent verification = new Intent(
                         Intent.ACTION_PACKAGE_NEEDS_VERIFICATION);
                 verification.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
@@ -16569,7 +16615,29 @@
             }
             executePostCommitSteps(commitRequest);
         } finally {
-            if (!success) {
+            if (success) {
+                for (InstallRequest request : requests) {
+                    final InstallArgs args = request.args;
+                    if (args.mDataLoaderType != DataLoaderType.INCREMENTAL) {
+                        continue;
+                    }
+                    if (args.signingDetails.signatureSchemeVersion != SIGNING_BLOCK_V4) {
+                        continue;
+                    }
+                    // For incremental installs, we bypass the verifier prior to install. Now
+                    // that we know the package is valid, send a notice to the verifier with
+                    // the root hash of the base.apk.
+                    final String baseCodePath = request.installResult.pkg.getBaseCodePath();
+                    final String[] splitCodePaths = request.installResult.pkg.getSplitCodePaths();
+                    final Uri originUri = Uri.fromFile(args.origin.resolvedFile);
+                    final int verificationId = mPendingVerificationToken++;
+                    final String rootHashString = PackageManagerServiceUtils
+                            .buildVerificationRootHashString(baseCodePath, splitCodePaths);
+                    broadcastPackageVerified(verificationId, originUri,
+                            PackageManager.VERIFICATION_ALLOW, rootHashString,
+                            args.mDataLoaderType, args.getUser());
+                }
+            } else {
                 for (ScanResult result : preparedScans.values()) {
                     if (createdAppId.getOrDefault(result.request.parsedPackage.getPackageName(),
                             false)) {
@@ -16670,10 +16738,15 @@
                 // method because `pkg` may not be in `mPackages` yet.
                 //
                 // Also, don't fail application installs if the dexopt step fails.
+                int flags = DexoptOptions.DEXOPT_BOOT_COMPLETE
+                        | DexoptOptions.DEXOPT_INSTALL_WITH_DEX_METADATA_FILE;
+                if (reconciledPkg.installArgs.installReason == INSTALL_REASON_DEVICE_RESTORE
+                        || reconciledPkg.installArgs.installReason == INSTALL_REASON_DEVICE_SETUP) {
+                    flags |= DexoptOptions.DEXOPT_FOR_RESTORE;
+                }
                 DexoptOptions dexoptOptions = new DexoptOptions(packageName,
                         REASON_INSTALL,
-                        DexoptOptions.DEXOPT_BOOT_COMPLETE
-                                | DexoptOptions.DEXOPT_INSTALL_WITH_DEX_METADATA_FILE);
+                        flags);
                 ScanResult result = reconciledPkg.scanResult;
 
                 // This mirrors logic from commitReconciledScanResultLocked, where the library files
@@ -16911,7 +16984,6 @@
             if (args.signingDetails != PackageParser.SigningDetails.UNKNOWN) {
                 parsedPackage.setSigningDetails(args.signingDetails);
             } else {
-                // TODO(b/136132412): skip for Incremental installation
                 parsedPackage.setSigningDetails(
                         ParsingPackageUtils.collectCertificates(parsedPackage, false /* skipVerify */));
             }
@@ -17569,65 +17641,120 @@
                 + " Activities needs verification ...");
 
         int count = 0;
-
+        boolean handlesWebUris = false;
+        ArraySet<String> domains = new ArraySet<>();
+        final boolean previouslyVerified;
+        boolean hostSetExpanded = false;
+        boolean needToRunVerify = false;
         synchronized (mLock) {
             // If this is a new install and we see that we've already run verification for this
             // package, we have nothing to do: it means the state was restored from backup.
-            if (!replacing) {
-                IntentFilterVerificationInfo ivi =
-                        mSettings.getIntentFilterVerificationLPr(packageName);
-                if (ivi != null) {
-                    if (DEBUG_DOMAIN_VERIFICATION) {
-                        Slog.i(TAG, "Package " + packageName+ " already verified: status="
-                                + ivi.getStatusString());
-                    }
-                    return;
+            IntentFilterVerificationInfo ivi =
+                    mSettings.getIntentFilterVerificationLPr(packageName);
+            previouslyVerified = (ivi != null);
+            if (!replacing && previouslyVerified) {
+                if (DEBUG_DOMAIN_VERIFICATION) {
+                    Slog.i(TAG, "Package " + packageName + " already verified: status="
+                            + ivi.getStatusString());
                 }
+                return;
             }
 
-            // If any filters need to be verified, then all need to be.
-            boolean needToVerify = false;
+            if (DEBUG_DOMAIN_VERIFICATION) {
+                Slog.i(TAG, "    Previous verified hosts: "
+                        + (ivi == null ? "[none]" : ivi.getDomainsString()));
+            }
+
+            // If any filters need to be verified, then all need to be.  In addition, we need to
+            // know whether an updating app has any web navigation intent filters, to re-
+            // examine handling policy even if not re-verifying.
+            final boolean needsVerification = needsNetworkVerificationLPr(packageName);
             for (ParsedActivity a : activities) {
                 for (ParsedIntentInfo filter : a.getIntents()) {
-                    if (filter.needsVerification()
-                            && needsNetworkVerificationLPr(a.getPackageName())) {
+                    if (filter.handlesWebUris(true)) {
+                        handlesWebUris = true;
+                    }
+                    if (needsVerification && filter.needsVerification()) {
                         if (DEBUG_DOMAIN_VERIFICATION) {
-                            Slog.d(TAG,
-                                    "Intent filter needs verification, so processing all filters");
+                            Slog.d(TAG, "autoVerify requested, processing all filters");
                         }
-                        needToVerify = true;
+                        needToRunVerify = true;
+                        // It's safe to break out here because filter.needsVerification()
+                        // can only be true if filter.handlesWebUris(true) returned true, so
+                        // we've already noted that.
                         break;
                     }
                 }
             }
 
-            if (needToVerify) {
-                final boolean needsVerification = needsNetworkVerificationLPr(packageName);
+            // Compare the new set of recognized hosts if the app is either requesting
+            // autoVerify or has previously used autoVerify but no longer does.
+            if (needToRunVerify || previouslyVerified) {
                 final int verificationId = mIntentFilterVerificationToken++;
                 for (ParsedActivity a : activities) {
                     for (ParsedIntentInfo filter : a.getIntents()) {
                         // Run verification against hosts mentioned in any web-nav intent filter,
                         // even if the filter matches non-web schemes as well
-                        if (needsVerification && filter.handlesWebUris(false)) {
+                        if (filter.handlesWebUris(false /*onlyWebSchemes*/)) {
                             if (DEBUG_DOMAIN_VERIFICATION) Slog.d(TAG,
                                     "Verification needed for IntentFilter:" + filter.toString());
                             mIntentFilterVerifier.addOneIntentFilterVerification(
                                     verifierUid, userId, verificationId, filter, packageName);
+                            domains.addAll(filter.getHostsList());
                             count++;
                         }
                     }
                 }
             }
+
+            if (DEBUG_DOMAIN_VERIFICATION) {
+                Slog.i(TAG, "    Update published hosts: " + domains.toString());
+            }
+
+            // If we've previously verified this same host set (or a subset), we can trust that
+            // a current ALWAYS policy is still applicable.  If this is the case, we're done.
+            // (If we aren't in ALWAYS, we want to reverify to allow for apps that had failing
+            // hosts in their intent filters, then pushed a new apk that removed them and now
+            // passes.)
+            //
+            // Cases:
+            //   + still autoVerify (needToRunVerify):
+            //      - preserve current state if all of: unexpanded, in always
+            //      - otherwise rerun as usual (fall through)
+            //   + no longer autoVerify (alreadyVerified && !needToRunVerify)
+            //      - wipe verification history always
+            //      - preserve current state if all of: unexpanded, in always
+            hostSetExpanded = !previouslyVerified
+                    || (ivi != null && !ivi.getDomains().containsAll(domains));
+            final int currentPolicy =
+                    mSettings.getIntentFilterVerificationStatusLPr(packageName, userId);
+            final boolean keepCurState = !hostSetExpanded
+                    && currentPolicy == INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS;
+
+            if (needToRunVerify && keepCurState) {
+                if (DEBUG_DOMAIN_VERIFICATION) {
+                    Slog.i(TAG, "Host set not expanding + ALWAYS -> no need to reverify");
+                }
+                ivi.setDomains(domains);
+                scheduleWriteSettingsLocked();
+                return;
+            } else if (previouslyVerified && !needToRunVerify) {
+                // Prior autoVerify state but not requesting it now.  Clear autoVerify history,
+                // and preserve the always policy iff the host set is not expanding.
+                clearIntentFilterVerificationsLPw(packageName, userId, !keepCurState);
+                return;
+            }
         }
 
-        if (count > 0) {
+        if (needToRunVerify && count > 0) {
+            // app requested autoVerify and has at least one matching intent filter
             if (DEBUG_DOMAIN_VERIFICATION) Slog.d(TAG, "Starting " + count
                     + " IntentFilter verification" + (count > 1 ? "s" : "")
                     +  " for userId:" + userId);
             mIntentFilterVerifier.startVerifications(userId);
         } else {
             if (DEBUG_DOMAIN_VERIFICATION) {
-                Slog.d(TAG, "No filters or not all autoVerify for " + packageName);
+                Slog.d(TAG, "No web filters or no new host policy for " + packageName);
             }
         }
     }
@@ -18332,7 +18459,7 @@
             if ((flags & PackageManager.DELETE_KEEP_DATA) == 0) {
                 final SparseBooleanArray changedUsers = new SparseBooleanArray();
                 synchronized (mLock) {
-                    clearIntentFilterVerificationsLPw(deletedPs.name, UserHandle.USER_ALL);
+                    clearIntentFilterVerificationsLPw(deletedPs.name, UserHandle.USER_ALL, true);
                     clearDefaultBrowserIfNeeded(packageName);
                     mSettings.mKeySetManagerService.removeAppKeySetDataLPw(packageName);
                     removedAppId = mSettings.removePackageLPw(packageName);
@@ -19425,13 +19552,14 @@
         final int packageCount = mPackages.size();
         for (int i = 0; i < packageCount; i++) {
             AndroidPackage pkg = mPackages.valueAt(i);
-            clearIntentFilterVerificationsLPw(pkg.getPackageName(), userId);
+            clearIntentFilterVerificationsLPw(pkg.getPackageName(), userId, true);
         }
     }
 
     /** This method takes a specific user id as well as UserHandle.USER_ALL. */
     @GuardedBy("mLock")
-    void clearIntentFilterVerificationsLPw(String packageName, int userId) {
+    void clearIntentFilterVerificationsLPw(String packageName, int userId,
+            boolean alsoResetStatus) {
         if (userId == UserHandle.USER_ALL) {
             if (mSettings.removeIntentFilterVerificationLPw(packageName,
                     mUserManager.getUserIds())) {
@@ -19440,7 +19568,8 @@
                 }
             }
         } else {
-            if (mSettings.removeIntentFilterVerificationLPw(packageName, userId)) {
+            if (mSettings.removeIntentFilterVerificationLPw(packageName, userId,
+                    alsoResetStatus)) {
                 scheduleWritePackageRestrictionsLocked(userId);
             }
         }
@@ -20705,8 +20834,11 @@
         final int[] instantUserIds = isInstantApp ? new int[] { userId } : EMPTY_INT_ARRAY;
         final SparseArray<int[]> broadcastWhitelist;
         synchronized (mLock) {
-            broadcastWhitelist = isInstantApp ? null : mAppsFilter.getVisibilityWhitelist(
-                    getPackageSettingInternal(packageName, Process.SYSTEM_UID),
+            PackageSetting setting = getPackageSettingInternal(packageName, Process.SYSTEM_UID);
+            if (setting == null) {
+                return;
+            }
+            broadcastWhitelist = isInstantApp ? null : mAppsFilter.getVisibilityWhitelist(setting,
                     userIds, mSettings.mPackages);
         }
         sendPackageBroadcast(Intent.ACTION_PACKAGE_CHANGED,  packageName, extras, flags, null, null,
@@ -24112,6 +24244,25 @@
         }
 
         @Override
+        public void pruneCachedApksInApex(@NonNull List<PackageInfo> apexPackages) {
+            if (mCacheDir == null) {
+                return;
+            }
+
+            final PackageCacher cacher = new PackageCacher(mCacheDir);
+            synchronized (mLock) {
+                for (int i = 0, size = apexPackages.size(); i < size; i++) {
+                    final List<String> apkNames =
+                            mApexManager.getApksInApex(apexPackages.get(i).packageName);
+                    for (int j = 0, apksInApex = apkNames.size(); j < apksInApex; j++) {
+                        final AndroidPackage pkg = getPackage(apkNames.get(j));
+                        cacher.cleanCachedResult(new File(pkg.getCodePath()));
+                    }
+                }
+            }
+        }
+
+        @Override
         public String getSetupWizardPackageName() {
             return mSetupWizardPackage;
         }
@@ -24581,6 +24732,14 @@
             return packageName.equals(
                     PackageManagerService.this.ensureSystemPackageName(packageName));
         }
+
+        @Override
+        public void clearBlockUninstallForUser(@UserIdInt int userId) {
+            synchronized (mLock) {
+                mSettings.clearBlockUninstallLPw(userId);
+                mSettings.writePackageRestrictionsLPr(userId);
+            }
+        }
     }
 
     @GuardedBy("mLock")
diff --git a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java
index 91afd84..5c175a6 100644
--- a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java
+++ b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java
@@ -32,7 +32,6 @@
 import android.app.AppGlobals;
 import android.content.Context;
 import android.content.Intent;
-import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageInfoLite;
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManagerInternal;
@@ -40,7 +39,6 @@
 import android.content.pm.PackageParser.PackageParserException;
 import android.content.pm.ResolveInfo;
 import android.content.pm.Signature;
-import android.content.pm.parsing.ParsingPackageUtils;
 import android.os.Build;
 import android.os.Debug;
 import android.os.Environment;
@@ -50,6 +48,9 @@
 import android.os.SystemProperties;
 import android.os.UserHandle;
 import android.os.UserManagerInternal;
+import android.os.incremental.IncrementalManager;
+import android.os.incremental.V4Signature;
+import android.os.incremental.V4Signature.HashingInfo;
 import android.service.pm.PackageServiceDumpProto;
 import android.system.ErrnoException;
 import android.system.Os;
@@ -62,6 +63,7 @@
 import com.android.internal.content.PackageHelper;
 import com.android.internal.util.ArrayUtils;
 import com.android.internal.util.FastPrintWriter;
+import com.android.internal.util.HexDump;
 import com.android.server.EventLogTags;
 import com.android.server.pm.dex.DexManager;
 import com.android.server.pm.dex.PackageDexUsage;
@@ -94,8 +96,6 @@
 import java.util.Date;
 import java.util.LinkedList;
 import java.util.List;
-import java.util.Map;
-import java.util.Set;
 import java.util.function.Predicate;
 import java.util.zip.GZIPInputStream;
 
@@ -943,4 +943,71 @@
             Os.chmod(currentDir.getAbsolutePath(), mode);
         }
     }
+
+    /**
+     * Returns a string that's compatible with the verification root hash extra.
+     * @see PackageManager#EXTRA_VERIFICATION_ROOT_HASH
+     */
+    @NonNull
+    public static String buildVerificationRootHashString(@NonNull String baseFilename,
+            @Nullable String[] splitFilenameArray) {
+        final StringBuilder sb = new StringBuilder();
+        final String baseFilePath =
+                baseFilename.substring(baseFilename.lastIndexOf(File.separator) + 1);
+        sb.append(baseFilePath).append(":");
+        final byte[] baseRootHash = getRootHash(baseFilename);
+        if (baseRootHash == null) {
+            sb.append("0");
+        } else {
+            sb.append(HexDump.toHexString(baseRootHash));
+        }
+        if (splitFilenameArray == null || splitFilenameArray.length == 0) {
+            return sb.toString();
+        }
+
+        for (int i = splitFilenameArray.length - 1; i >= 0; i--) {
+            final String splitFilename = splitFilenameArray[i];
+            final String splitFilePath =
+                    splitFilename.substring(splitFilename.lastIndexOf(File.separator) + 1);
+            final byte[] splitRootHash = getRootHash(splitFilename);
+            sb.append(";").append(splitFilePath).append(":");
+            if (splitRootHash == null) {
+                sb.append("0");
+            } else {
+                sb.append(HexDump.toHexString(splitRootHash));
+            }
+        }
+        return sb.toString();
+    }
+
+    /**
+     * Returns the root has for the given file.
+     * <p>Otherwise, returns {@code null} if the root hash could not be found or calculated.
+     * <p>NOTE: This currently only works on files stored on the incremental file system. The
+     * eventual goal is that this hash [among others] can be retrieved for any file.
+     */
+    @Nullable
+    private static byte[] getRootHash(String filename) {
+        try {
+            final byte[] baseFileSignature =
+                    IncrementalManager.unsafeGetFileSignature(filename);
+            if (baseFileSignature == null) {
+                throw new IOException("File signature not present");
+            }
+            final V4Signature signature =
+                    V4Signature.readFrom(baseFileSignature);
+            if (signature.hashingInfo == null) {
+                throw new IOException("Hashing info not present");
+            }
+            final HashingInfo hashInfo =
+                    HashingInfo.fromByteArray(signature.hashingInfo);
+            if (ArrayUtils.isEmpty(hashInfo.rawRootHash)) {
+                throw new IOException("Root has not present");
+            }
+            return hashInfo.rawRootHash;
+        } catch (IOException ignore) {
+            Slog.e(TAG, "ERROR: could not load root hash from incremental install");
+        }
+        return null;
+    }
 }
diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
index b4eacf6..88f442c 100644
--- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
+++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
@@ -297,6 +297,8 @@
                     return runGetModuleInfo();
                 case "log-visibility":
                     return runLogVisibility();
+                case "bypass-staged-installer-check":
+                    return runBypassStagedInstallerCheck();
                 default: {
                     String nextArg = getNextArg();
                     if (nextArg == null) {
@@ -392,6 +394,20 @@
         return 1;
     }
 
+    private int runBypassStagedInstallerCheck() {
+        final PrintWriter pw = getOutPrintWriter();
+        try {
+            mInterface.getPackageInstaller()
+                    .bypassNextStagedInstallerCheck(Boolean.parseBoolean(getNextArg()));
+            return 0;
+        } catch (RemoteException e) {
+            pw.println("Failure ["
+                    + e.getClass().getName() + " - "
+                    + e.getMessage() + "]");
+            return -1;
+        }
+    }
+
     private int uninstallSystemUpdates() {
         final PrintWriter pw = getOutPrintWriter();
         List<String> failedUninstalls = new LinkedList<>();
diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommandDataLoader.java b/services/core/java/com/android/server/pm/PackageManagerShellCommandDataLoader.java
index 2aa6e573..3614cc0 100644
--- a/services/core/java/com/android/server/pm/PackageManagerShellCommandDataLoader.java
+++ b/services/core/java/com/android/server/pm/PackageManagerShellCommandDataLoader.java
@@ -217,7 +217,7 @@
                         case Metadata.LOCAL_FILE: {
                             ParcelFileDescriptor incomingFd = null;
                             try {
-                                incomingFd = getLocalFile(shellCommand, metadata.getData());
+                                incomingFd = getLocalFilePFD(shellCommand, metadata.getData());
                                 mConnector.writeData(file.getName(), 0, incomingFd.getStatSize(),
                                         incomingFd);
                             } finally {
@@ -263,10 +263,20 @@
         }
     }
 
-    static ParcelFileDescriptor getLocalFile(ShellCommand shellCommand, String filePath) {
+    static ParcelFileDescriptor getLocalFilePFD(ShellCommand shellCommand, String filePath) {
         return shellCommand.openFileForSystem(filePath, "r");
     }
 
+    static int getStdIn(ShellCommand shellCommand) {
+        ParcelFileDescriptor pfd = getStdInPFD(shellCommand);
+        return pfd == null ? -1 : pfd.detachFd();
+    }
+
+    static int getLocalFile(ShellCommand shellCommand, String filePath) {
+        ParcelFileDescriptor pfd = getLocalFilePFD(shellCommand, filePath);
+        return pfd == null ? -1 : pfd.detachFd();
+    }
+
     @Override
     public DataLoaderService.DataLoader onCreateDataLoader(
             @NonNull DataLoaderParams dataLoaderParams) {
diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java
index f6e4e1f..ddeab29 100644
--- a/services/core/java/com/android/server/pm/Settings.java
+++ b/services/core/java/com/android/server/pm/Settings.java
@@ -1282,7 +1282,8 @@
         return result;
     }
 
-    boolean removeIntentFilterVerificationLPw(String packageName, int userId) {
+    boolean removeIntentFilterVerificationLPw(String packageName, int userId,
+            boolean alsoResetStatus) {
         PackageSetting ps = mPackages.get(packageName);
         if (ps == null) {
             if (DEBUG_DOMAIN_VERIFICATION) {
@@ -1290,14 +1291,17 @@
             }
             return false;
         }
-        ps.clearDomainVerificationStatusForUser(userId);
+        if (alsoResetStatus) {
+            ps.clearDomainVerificationStatusForUser(userId);
+        }
+        ps.setIntentFilterVerificationInfo(null);
         return true;
     }
 
     boolean removeIntentFilterVerificationLPw(String packageName, int[] userIds) {
         boolean result = false;
         for (int userId : userIds) {
-            result |= removeIntentFilterVerificationLPw(packageName, userId);
+            result |= removeIntentFilterVerificationLPw(packageName, userId, true);
         }
         return result;
     }
@@ -1829,6 +1833,10 @@
         }
     }
 
+    void clearBlockUninstallLPw(int userId) {
+        mBlockUninstallPackages.remove(userId);
+    }
+
     boolean getBlockUninstallLPr(int userId, String packageName) {
         ArraySet<String> packages = mBlockUninstallPackages.get(userId);
         if (packages == null) {
@@ -4207,18 +4215,12 @@
             }
         }
         t.traceBegin("createAppData");
-        for (int i = 0; i < packagesCount; i++) {
-            if (names[i] == null) {
-                continue;
-            }
-            // TODO: triage flags!
-            final int flags = StorageManager.FLAG_STORAGE_CE | StorageManager.FLAG_STORAGE_DE;
-            try {
-                installer.createAppData(volumeUuids[i], names[i], userHandle, flags, appIds[i],
-                        seinfos[i], targetSdkVersions[i]);
-            } catch (InstallerException e) {
-                Slog.w(TAG, "Failed to prepare app data", e);
-            }
+        final int flags = StorageManager.FLAG_STORAGE_CE | StorageManager.FLAG_STORAGE_DE;
+        try {
+            installer.createAppDataBatched(volumeUuids, names, userHandle, flags, appIds, seinfos,
+                    targetSdkVersions);
+        } catch (InstallerException e) {
+            Slog.w(TAG, "Failed to prepare app data", e);
         }
         t.traceEnd(); // createAppData
         synchronized (mLock) {
diff --git a/services/core/java/com/android/server/pm/StagingManager.java b/services/core/java/com/android/server/pm/StagingManager.java
index 8f6bd02..1c1e64d 100644
--- a/services/core/java/com/android/server/pm/StagingManager.java
+++ b/services/core/java/com/android/server/pm/StagingManager.java
@@ -523,8 +523,12 @@
                 // TODO(b/146343545): Persist failure reason across checkpoint reboot
                 Slog.d(TAG, "Reverting back to safe state. Marking " + session.sessionId
                         + " as failed.");
-                session.setStagedSessionFailed(SessionInfo.STAGED_SESSION_UNKNOWN,
-                        "Reverting back to safe state");
+                String errorMsg = "Reverting back to safe state";
+                if (!TextUtils.isEmpty(mNativeFailureReason)) {
+                    errorMsg = "Entered fs-rollback mode and reverted session due to crashing "
+                            + "native process: " + mNativeFailureReason;
+                }
+                session.setStagedSessionFailed(SessionInfo.STAGED_SESSION_UNKNOWN, errorMsg);
                 return;
             }
         } catch (RemoteException e) {
@@ -553,6 +557,10 @@
             if (isApexSessionFailed(apexSessionInfo)) {
                 String errorMsg = "APEX activation failed. Check logcat messages from apexd for "
                         + "more information.";
+                if (!TextUtils.isEmpty(mNativeFailureReason)) {
+                    errorMsg = "Session reverted due to crashing native process: "
+                            + mNativeFailureReason;
+                }
                 session.setStagedSessionFailed(SessionInfo.STAGED_SESSION_ACTIVATION_FAILED,
                         errorMsg);
                 abortCheckpoint(errorMsg);
@@ -1218,8 +1226,9 @@
             // APEX checks. For single-package sessions, check if they contain an APEX. For
             // multi-package sessions, find all the child sessions that contain an APEX.
             if (hasApex) {
+                final List<PackageInfo> apexPackages;
                 try {
-                    final List<PackageInfo> apexPackages = submitSessionToApexService(session);
+                    apexPackages = submitSessionToApexService(session);
                     for (int i = 0, size = apexPackages.size(); i < size; i++) {
                         validateApexSignature(apexPackages.get(i));
                     }
@@ -1227,6 +1236,10 @@
                     session.setStagedSessionFailed(e.error, e.getMessage());
                     return;
                 }
+
+                final PackageManagerInternal packageManagerInternal =
+                        LocalServices.getService(PackageManagerInternal.class);
+                packageManagerInternal.pruneCachedApksInApex(apexPackages);
             }
 
             notifyPreRebootVerification_Apex_Complete(session.sessionId);
diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java
index 323ffcf..4561d2e 100644
--- a/services/core/java/com/android/server/pm/UserManagerService.java
+++ b/services/core/java/com/android/server/pm/UserManagerService.java
@@ -103,6 +103,8 @@
 import com.android.internal.os.BackgroundThread;
 import com.android.internal.util.DumpUtils;
 import com.android.internal.util.FastXmlSerializer;
+import com.android.internal.util.FrameworkStatsLog;
+import com.android.internal.util.IndentingPrintWriter;
 import com.android.internal.util.Preconditions;
 import com.android.internal.util.XmlUtils;
 import com.android.internal.widget.LockPatternUtils;
@@ -137,6 +139,7 @@
 import java.util.List;
 import java.util.Objects;
 import java.util.Set;
+import java.util.concurrent.ThreadLocalRandom;
 
 /**
  * Service for {@link UserManager}.
@@ -3151,13 +3154,17 @@
 
     /**
      * Removes the app restrictions file for a specific package and user id, if it exists.
+     *
+     * @return whether there were any restrictions.
      */
-    private static void cleanAppRestrictionsForPackageLAr(String pkg, @UserIdInt int userId) {
-        File dir = Environment.getUserSystemDirectory(userId);
-        File resFile = new File(dir, packageToRestrictionsFileName(pkg));
+    private static boolean cleanAppRestrictionsForPackageLAr(String pkg, @UserIdInt int userId) {
+        final File dir = Environment.getUserSystemDirectory(userId);
+        final File resFile = new File(dir, packageToRestrictionsFileName(pkg));
         if (resFile.exists()) {
             resFile.delete();
+            return true;
         }
+        return false;
     }
 
     /**
@@ -3244,16 +3251,39 @@
             @NonNull String userType, @UserInfoFlag int flags, @UserIdInt int parentId,
             boolean preCreate, @Nullable String[] disallowedPackages)
             throws UserManager.CheckedUserOperationException {
+        final int nextProbableUserId = getNextAvailableId();
         final TimingsTraceAndSlog t = new TimingsTraceAndSlog();
         t.traceBegin("createUser-" + flags);
+        final long sessionId = logUserCreateJourneyBegin(nextProbableUserId, userType, flags);
         try {
             return createUserInternalUncheckedNoTracing(name, userType, flags, parentId,
                     preCreate, disallowedPackages, t);
         } finally {
+            logUserCreateJourneyFinish(sessionId, nextProbableUserId);
             t.traceEnd();
         }
     }
 
+    private long logUserCreateJourneyBegin(@UserIdInt int userId, String userType,
+            @UserInfoFlag int flags) {
+        final long sessionId = ThreadLocalRandom.current().nextLong(1, Long.MAX_VALUE);
+        // log the journey atom with the user metadata
+        FrameworkStatsLog.write(FrameworkStatsLog.USER_LIFECYCLE_JOURNEY_REPORTED, sessionId,
+                FrameworkStatsLog.USER_LIFECYCLE_JOURNEY_REPORTED__JOURNEY__USER_CREATE,
+                /* origin_user= */ -1, userId, UserManager.getUserTypeForStatsd(userType), flags);
+        // log the event atom to indicate the event start
+        FrameworkStatsLog.write(FrameworkStatsLog.USER_LIFECYCLE_EVENT_OCCURRED, sessionId, userId,
+                FrameworkStatsLog.USER_LIFECYCLE_EVENT_OCCURRED__EVENT__CREATE_USER,
+                FrameworkStatsLog.USER_LIFECYCLE_EVENT_OCCURRED__STATE__BEGIN);
+        return sessionId;
+    }
+
+    private void logUserCreateJourneyFinish(long sessionId, @UserIdInt int userId) {
+        FrameworkStatsLog.write(FrameworkStatsLog.USER_LIFECYCLE_EVENT_OCCURRED, sessionId, userId,
+                FrameworkStatsLog.USER_LIFECYCLE_EVENT_OCCURRED__EVENT__CREATE_USER,
+                FrameworkStatsLog.USER_LIFECYCLE_EVENT_OCCURRED__STATE__FINISH);
+    }
+
     private UserInfo createUserInternalUncheckedNoTracing(@Nullable String name,
             @NonNull String userType, @UserInfoFlag int flags, @UserIdInt int parentId,
             boolean preCreate, @Nullable String[] disallowedPackages,
@@ -3978,17 +4008,24 @@
         if (restrictions != null) {
             restrictions.setDefusable(true);
         }
+        final boolean changed;
         synchronized (mAppRestrictionsLock) {
             if (restrictions == null || restrictions.isEmpty()) {
-                cleanAppRestrictionsForPackageLAr(packageName, userId);
+                changed = cleanAppRestrictionsForPackageLAr(packageName, userId);
             } else {
                 // Write the restrictions to XML
                 writeApplicationRestrictionsLAr(packageName, restrictions, userId);
+                // TODO(b/154323615): avoid unnecessary broadcast when there is no change.
+                changed = true;
             }
         }
 
+        if (!changed) {
+            return;
+        }
+
         // Notify package of changes via an intent - only sent to explicitly registered receivers.
-        Intent changeIntent = new Intent(Intent.ACTION_APPLICATION_RESTRICTIONS_CHANGED);
+        final Intent changeIntent = new Intent(Intent.ACTION_APPLICATION_RESTRICTIONS_CHANGED);
         changeIntent.setPackage(packageName);
         changeIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
         mContext.sendBroadcastAsUser(changeIntent, UserHandle.of(userId));
@@ -4480,6 +4517,8 @@
             switch(cmd) {
                 case "list":
                     return runList(pw, shell);
+                case "list-missing-system-packages":
+                    return runListMissingSystemPackages(pw, shell);
                 default:
                     return shell.handleDefaultCommands(cmd);
             }
@@ -4546,6 +4585,30 @@
         }
     }
 
+    private int runListMissingSystemPackages(PrintWriter pw, Shell shell) {
+        boolean verbose = false;
+        boolean force = false;
+        String opt;
+        while ((opt = shell.getNextOption()) != null) {
+            switch (opt) {
+                case "-v":
+                    verbose = true;
+                    break;
+                case "--force":
+                    force = true;
+                    break;
+                default:
+                    pw.println("Invalid option: " + opt);
+                    return -1;
+            }
+        }
+
+        try (IndentingPrintWriter ipw = new IndentingPrintWriter(pw, "  ")) {
+            mSystemPackageInstaller.dumpMissingSystemPackages(ipw, force, verbose);
+        }
+        return 0;
+    }
+
     @Override
     protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
         if (!DumpUtils.checkDumpPermission(mContext, LOG_TAG, pw)) return;
@@ -5118,6 +5181,9 @@
             pw.println("");
             pw.println("  list [-v] [-all]");
             pw.println("    Prints all users on the system.");
+            pw.println("  list-missing-system-packages [-v] [--force]");
+            pw.println("    Prints all system packages that were not explicitly configured to be "
+                    + "installed.");
         }
     }
 
diff --git a/services/core/java/com/android/server/pm/UserRestrictionsUtils.java b/services/core/java/com/android/server/pm/UserRestrictionsUtils.java
index c0502b8..0b6024a 100644
--- a/services/core/java/com/android/server/pm/UserRestrictionsUtils.java
+++ b/services/core/java/com/android/server/pm/UserRestrictionsUtils.java
@@ -211,24 +211,16 @@
                     UserManager.DISALLOW_ADD_USER,
                     UserManager.DISALLOW_BLUETOOTH,
                     UserManager.DISALLOW_BLUETOOTH_SHARING,
-                    UserManager.DISALLOW_CONFIG_BLUETOOTH,
                     UserManager.DISALLOW_CONFIG_CELL_BROADCASTS,
-                    UserManager.DISALLOW_CONFIG_LOCATION,
                     UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS,
                     UserManager.DISALLOW_CONFIG_PRIVATE_DNS,
                     UserManager.DISALLOW_CONFIG_TETHERING,
-                    UserManager.DISALLOW_CONFIG_WIFI,
-                    UserManager.DISALLOW_CONTENT_CAPTURE,
-                    UserManager.DISALLOW_CONTENT_SUGGESTIONS,
                     UserManager.DISALLOW_DATA_ROAMING,
-                    UserManager.DISALLOW_DEBUGGING_FEATURES,
                     UserManager.DISALLOW_SAFE_BOOT,
-                    UserManager.DISALLOW_SHARE_LOCATION,
                     UserManager.DISALLOW_SMS,
                     UserManager.DISALLOW_USB_FILE_TRANSFER,
                     UserManager.DISALLOW_AIRPLANE_MODE,
                     UserManager.DISALLOW_MOUNT_PHYSICAL_MEDIA,
-                    UserManager.DISALLOW_OUTGOING_CALLS,
                     UserManager.DISALLOW_UNMUTE_MICROPHONE
     );
 
@@ -237,7 +229,16 @@
      * set on the parent profile instance to apply them on the personal profile.
      */
     private static final Set<String> PROFILE_OWNER_ORGANIZATION_OWNED_LOCAL_RESTRICTIONS =
-            Sets.newArraySet();
+            Sets.newArraySet(
+                    UserManager.DISALLOW_CONFIG_BLUETOOTH,
+                    UserManager.DISALLOW_CONFIG_LOCATION,
+                    UserManager.DISALLOW_CONFIG_WIFI,
+                    UserManager.DISALLOW_CONTENT_CAPTURE,
+                    UserManager.DISALLOW_CONTENT_SUGGESTIONS,
+                    UserManager.DISALLOW_DEBUGGING_FEATURES,
+                    UserManager.DISALLOW_SHARE_LOCATION,
+                    UserManager.DISALLOW_OUTGOING_CALLS
+    );
 
     /**
      * User restrictions that default to {@code true} for managed profile owners.
diff --git a/services/core/java/com/android/server/pm/UserSystemPackageInstaller.java b/services/core/java/com/android/server/pm/UserSystemPackageInstaller.java
index 85c2306..cd1087f5 100644
--- a/services/core/java/com/android/server/pm/UserSystemPackageInstaller.java
+++ b/services/core/java/com/android/server/pm/UserSystemPackageInstaller.java
@@ -22,15 +22,16 @@
 import android.annotation.UserIdInt;
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManagerInternal;
-import android.content.pm.PackageParser;
 import android.content.res.Resources;
 import android.os.SystemProperties;
 import android.os.UserHandle;
 import android.util.ArrayMap;
 import android.util.ArraySet;
+import android.util.Pair;
 import android.util.Slog;
 
 import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.util.IndentingPrintWriter;
 import com.android.server.LocalServices;
 import com.android.server.SystemConfig;
 import com.android.server.pm.parsing.pkg.AndroidPackage;
@@ -38,7 +39,9 @@
 import java.io.PrintWriter;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
+import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
@@ -263,37 +266,85 @@
         if (!isLogMode(mode) && !isEnforceMode(mode)) {
             return;
         }
-        Slog.v(TAG,  "Checking that all system packages are whitelisted.");
-        final Set<String> allWhitelistedPackages = getWhitelistedSystemPackages();
-        PackageManagerInternal pmInt = LocalServices.getService(PackageManagerInternal.class);
-
-        // Check whether all whitelisted packages are indeed on the system.
-        for (String pkgName : allWhitelistedPackages) {
-            AndroidPackage pkg = pmInt.getPackage(pkgName);
-            if (pkg == null) {
-                Slog.w(TAG, pkgName + " is whitelisted but not present.");
-            } else if (!pkg.isSystem()) {
-                Slog.w(TAG, pkgName + " is whitelisted and present but not a system package.");
-            }
-        }
-
-        // Check whether all system packages are indeed whitelisted.
-        if (isImplicitWhitelistMode(mode) && !isLogMode(mode)) {
+        final List<Pair<Boolean, String>> warnings = checkSystemPackagesWhitelistWarnings(mode);
+        final int size = warnings.size();
+        if (size == 0) {
+            Slog.v(TAG, "checkWhitelistedSystemPackages(mode=" + mode + "): no warnings");
             return;
         }
-        final boolean doWtf = isEnforceMode(mode);
-        pmInt.forEachPackage(pkg -> {
-            if (pkg.isSystem() && !allWhitelistedPackages.contains(pkg.getManifestPackageName())) {
-                final String msg = "System package " + pkg.getManifestPackageName()
-                        + " is not whitelisted using 'install-in-user-type' in SystemConfig "
-                        + "for any user types!";
+
+        if (isImplicitWhitelistMode(mode) && !isLogMode(mode)) {
+            // Only shows whether all whitelisted packages are indeed on the system.
+            for (int i = 0; i < size; i++) {
+                final Pair<Boolean, String> pair = warnings.get(i);
+                final boolean isSevere = pair.first;
+                if (!isSevere) {
+                    final String msg = pair.second;
+                    Slog.w(TAG, msg);
+                }
+            }
+            return;
+        }
+
+        Slog.v(TAG, "checkWhitelistedSystemPackages(mode=" + mode + "): " + size + " warnings");
+        boolean doWtf = !isImplicitWhitelistMode(mode);
+        for (int i = 0; i < size; i++) {
+            final Pair<Boolean, String> pair = warnings.get(i);
+            final boolean isSevere = pair.first;
+            final String msg = pair.second;
+            if (isSevere) {
                 if (doWtf) {
                     Slog.wtf(TAG, msg);
                 } else {
                     Slog.e(TAG, msg);
                 }
+            } else {
+                Slog.w(TAG, msg);
+            }
+        }
+    }
+
+    // TODO: method below was created to refactor the one-time logging logic so it can be used on
+    // dump / cmd as well. It could to be further refactored (for example, creating a new
+    // structure for the warnings so it doesn't need a Pair).
+    /**
+     * Gets warnings for system user whitelisting.
+     *
+     * @return list of warnings, where {@code Pair.first} is the severity ({@code true} for WTF,
+     * {@code false} for WARN) and {@code Pair.second} the message.
+     */
+    @NonNull
+    private List<Pair<Boolean, String>> checkSystemPackagesWhitelistWarnings(
+            @PackageWhitelistMode int mode) {
+        final Set<String> allWhitelistedPackages = getWhitelistedSystemPackages();
+        final List<Pair<Boolean, String>> warnings = new ArrayList<>();
+        final PackageManagerInternal pmInt = LocalServices.getService(PackageManagerInternal.class);
+
+        // Check whether all whitelisted packages are indeed on the system.
+        final String notPresentFmt = "%s is whitelisted but not present.";
+        final String notSystemFmt = "%s is whitelisted and present but not a system package.";
+        for (String pkgName : allWhitelistedPackages) {
+            final AndroidPackage pkg = pmInt.getPackage(pkgName);
+            if (pkg == null) {
+                warnings.add(new Pair<>(false, String.format(notPresentFmt, pkgName)));
+            } else if (!pkg.isSystem()) {
+                warnings.add(new Pair<>(false, String.format(notSystemFmt, pkgName)));
+            }
+        }
+
+        // Check whether all system packages are indeed whitelisted.
+        final String logMessageFmt = "System package %s is not whitelisted using "
+                + "'install-in-user-type' in SystemConfig for any user types!";
+        final boolean isSevere = isEnforceMode(mode);
+        pmInt.forEachPackage(pkg -> {
+            if (!pkg.isSystem()) return;
+            final String pkgName = pkg.getManifestPackageName();
+            if (!allWhitelistedPackages.contains(pkgName)) {
+                warnings.add(new Pair<>(isSevere, String.format(logMessageFmt, pkgName)));
             }
         });
+
+        return warnings;
     }
 
     /** Whether to only install system packages in new users for which they are whitelisted. */
@@ -602,32 +653,45 @@
     }
 
     void dump(PrintWriter pw) {
-        final String prefix = "    ";
-        final String prefix2 = prefix + prefix;
+        try (IndentingPrintWriter ipw = new IndentingPrintWriter(pw, "    ")) {
+            dumpIndented(ipw);
+        }
+    }
+
+    private void dumpIndented(IndentingPrintWriter pw) {
         final int mode = getWhitelistMode();
         pw.println("Whitelisted packages per user type");
-        pw.print(prefix); pw.print("Mode: ");
+
+        pw.increaseIndent();
+        pw.print("Mode: ");
         pw.print(mode);
         pw.print(isEnforceMode(mode) ? " (enforced)" : "");
         pw.print(isLogMode(mode) ? " (logged)" : "");
         pw.print(isImplicitWhitelistMode(mode) ? " (implicit)" : "");
         pw.print(isIgnoreOtaMode(mode) ? " (ignore OTAs)" : "");
         pw.println();
+        pw.decreaseIndent();
 
-        pw.print(prefix); pw.println("Legend");
+        pw.increaseIndent();
+        pw.println("Legend");
+        pw.increaseIndent();
         for (int idx = 0; idx < mUserTypes.length; idx++) {
-            pw.print(prefix2); pw.println(idx + " -> " + mUserTypes[idx]);
+            pw.println(idx + " -> " + mUserTypes[idx]);
         }
+        pw.decreaseIndent(); pw.decreaseIndent();
 
+        pw.increaseIndent();
         final int size = mWhitelistedPackagesForUserTypes.size();
         if (size == 0) {
-            pw.print(prefix); pw.println("No packages");
+            pw.println("No packages");
+            pw.decreaseIndent();
             return;
         }
-        pw.print(prefix); pw.print(size); pw.println(" packages:");
+        pw.print(size); pw.println(" packages:");
+        pw.increaseIndent();
         for (int pkgIdx = 0; pkgIdx < size; pkgIdx++) {
             final String pkgName = mWhitelistedPackagesForUserTypes.keyAt(pkgIdx);
-            pw.print(prefix2); pw.print(pkgName); pw.print(": ");
+            pw.print(pkgName); pw.print(": ");
             final long userTypesBitSet = mWhitelistedPackagesForUserTypes.valueAt(pkgIdx);
             for (int idx = 0; idx < mUserTypes.length; idx++) {
                 if ((userTypesBitSet & (1 << idx)) != 0) {
@@ -636,5 +700,40 @@
             }
             pw.println();
         }
+        pw.decreaseIndent(); pw.decreaseIndent();
+
+        pw.increaseIndent();
+        dumpMissingSystemPackages(pw, /* force= */ true, /* verbose= */ true);
+        pw.decreaseIndent();
+    }
+
+    void dumpMissingSystemPackages(IndentingPrintWriter pw, boolean force, boolean verbose) {
+        final int mode = getWhitelistMode();
+        final boolean show = force || (isEnforceMode(mode) && !isImplicitWhitelistMode(mode));
+        if (!show) return;
+
+        final List<Pair<Boolean, String>> warnings = checkSystemPackagesWhitelistWarnings(mode);
+        final int size = warnings.size();
+
+        if (size == 0) {
+            if (verbose) {
+                pw.println("All system packages are accounted for");
+            }
+            return;
+        }
+
+        if (verbose) {
+            pw.print(size); pw.println(" warnings for system user:");
+            pw.increaseIndent();
+        }
+        for (int i = 0; i < size; i++) {
+            final Pair<Boolean, String> pair = warnings.get(i);
+            final String lvl = pair.first ? "WTF" : "WARN";
+            final String msg = pair.second;
+            pw.print(lvl); pw.print(": "); pw.println(msg);
+        }
+        if (verbose) {
+            pw.decreaseIndent();
+        }
     }
 }
diff --git a/services/core/java/com/android/server/pm/dex/DexManager.java b/services/core/java/com/android/server/pm/dex/DexManager.java
index 6dcf71e..f7bf1d9 100644
--- a/services/core/java/com/android/server/pm/dex/DexManager.java
+++ b/services/core/java/com/android/server/pm/dex/DexManager.java
@@ -79,6 +79,10 @@
     private static final String PROPERTY_NAME_PM_DEXOPT_PRIV_APPS_OOB_LIST =
             "pm.dexopt.priv-apps-oob-list";
 
+    // System server cannot load executable code outside system partitions.
+    // However it can load verification data - thus we pick the "verify" compiler filter.
+    private static final String SYSTEM_SERVER_COMPILER_FILTER = "verify";
+
     private final Context mContext;
 
     // Maps package name to code locations.
@@ -443,6 +447,14 @@
      *         because they don't need to be compiled)..
      */
     public boolean dexoptSecondaryDex(DexoptOptions options) {
+        if (PLATFORM_PACKAGE_NAME.equals(options.getPackageName())) {
+            // We could easily redirect to #dexoptSystemServer in this case. But there should be
+            // no-one calling this method directly for system server.
+            // As such we prefer to abort in this case.
+            Slog.wtf(TAG, "System server jars should be optimized with dexoptSystemServer");
+            return false;
+        }
+
         PackageDexOptimizer pdo = getPackageDexOptimizer(options);
         String packageName = options.getPackageName();
         PackageUseInfo useInfo = getPackageUseInfoOrDefault(packageName);
@@ -501,8 +513,17 @@
             return PackageDexOptimizer.DEX_OPT_FAILED;
         }
 
-        PackageDexOptimizer pdo = getPackageDexOptimizer(options);
-        String packageName = options.getPackageName();
+        // Override compiler filter for system server to the expected one.
+        //
+        // We could let the caller do this every time the invoke PackageManagerServer#dexopt.
+        // However, there are a few places were this will need to be done which creates
+        // redundancy and the danger of overlooking the config (and thus generating code that will
+        // waste storage and time).
+        DexoptOptions overriddenOptions = options.overrideCompilerFilter(
+                SYSTEM_SERVER_COMPILER_FILTER);
+
+        PackageDexOptimizer pdo = getPackageDexOptimizer(overriddenOptions);
+        String packageName = overriddenOptions.getPackageName();
         PackageUseInfo useInfo = getPackageUseInfoOrDefault(packageName);
         if (useInfo.getDexUseInfoMap().isEmpty()) {
             if (DEBUG) {
@@ -527,7 +548,7 @@
                 continue;
             }
 
-            int newResult = pdo.dexoptSystemServerPath(dexPath, dexUseInfo, options);
+            int newResult = pdo.dexoptSystemServerPath(dexPath, dexUseInfo, overriddenOptions);
 
             // The end result is:
             //  - FAILED if any path failed,
@@ -600,6 +621,23 @@
                         packageName, dexUseInfo.getOwnerUserId()) || updated;
                 continue;
             }
+
+            // Special handle system server files.
+            // We don't need an installd call because we have permissions to check if the file
+            // exists.
+            if (PLATFORM_PACKAGE_NAME.equals(packageName)) {
+                if (!Files.exists(Paths.get(dexPath))) {
+                    if (DEBUG) {
+                        Slog.w(TAG, "A dex file previously loaded by System Server does not exist "
+                                + " anymore: " + dexPath);
+                    }
+                    updated = mPackageDexUsage.removeUserPackage(
+                            packageName, dexUseInfo.getOwnerUserId()) || updated;
+                }
+                continue;
+            }
+
+            // This is a regular application.
             ApplicationInfo info = pkg.applicationInfo;
             int flags = 0;
             if (info.deviceProtectedDataDir != null &&
diff --git a/services/core/java/com/android/server/pm/dex/DexoptOptions.java b/services/core/java/com/android/server/pm/dex/DexoptOptions.java
index de3c9f2..68f3886 100644
--- a/services/core/java/com/android/server/pm/dex/DexoptOptions.java
+++ b/services/core/java/com/android/server/pm/dex/DexoptOptions.java
@@ -61,6 +61,10 @@
     // should get the dex metdata file if present.
     public static final int DEXOPT_INSTALL_WITH_DEX_METADATA_FILE = 1 << 10;
 
+    // When set, indicates that dexopt is being invoked from the install flow during device restore
+    // or device setup and should be scheduled appropriately.
+    public static final int DEXOPT_FOR_RESTORE = 1 << 11; // TODO(b/135202722): remove
+
     // The name of package to optimize.
     private final String mPackageName;
 
@@ -99,7 +103,8 @@
                 DEXOPT_DOWNGRADE |
                 DEXOPT_AS_SHARED_LIBRARY |
                 DEXOPT_IDLE_BACKGROUND_JOB |
-                DEXOPT_INSTALL_WITH_DEX_METADATA_FILE;
+                DEXOPT_INSTALL_WITH_DEX_METADATA_FILE |
+                DEXOPT_FOR_RESTORE;
         if ((flags & (~validityMask)) != 0) {
             throw new IllegalArgumentException("Invalid flags : " + Integer.toHexString(flags));
         }
@@ -155,6 +160,10 @@
         return (mFlags & DEXOPT_INSTALL_WITH_DEX_METADATA_FILE) != 0;
     }
 
+    public boolean isDexoptInstallForRestore() {
+        return (mFlags & DEXOPT_FOR_RESTORE) != 0;
+    }
+
     public String getSplitName() {
         return mSplitName;
     }
@@ -166,4 +175,17 @@
     public int getCompilationReason() {
         return mCompilationReason;
     }
+
+    /**
+     * Creates a new set of DexoptOptions which are the same with the exception of the compiler
+     * filter (set to the given value).
+     */
+    public DexoptOptions overrideCompilerFilter(String newCompilerFilter) {
+        return new DexoptOptions(
+                mPackageName,
+                mCompilationReason,
+                newCompilerFilter,
+                mSplitName,
+                mFlags);
+    }
 }
diff --git a/services/core/java/com/android/server/pm/parsing/PackageCacher.java b/services/core/java/com/android/server/pm/parsing/PackageCacher.java
index e5e1b0b..99c6dd1 100644
--- a/services/core/java/com/android/server/pm/parsing/PackageCacher.java
+++ b/services/core/java/com/android/server/pm/parsing/PackageCacher.java
@@ -18,6 +18,7 @@
 
 import android.annotation.NonNull;
 import android.content.pm.PackageParserCacheHelper;
+import android.os.FileUtils;
 import android.os.Parcel;
 import android.system.ErrnoException;
 import android.system.Os;
@@ -197,4 +198,18 @@
             Slog.w(TAG, "Error saving package cache.", e);
         }
     }
+
+    /**
+     * Delete the cache files for the given {@code packageFile}.
+     */
+    public void cleanCachedResult(@NonNull File packageFile) {
+        final String packageName = packageFile.getName();
+        final File[] files = FileUtils.listFilesOrEmpty(mCacheDir,
+                (dir, name) -> name.startsWith(packageName));
+        for (File file : files) {
+            if (!file.delete()) {
+                Slog.e(TAG, "Unable to clean cache file: " + file);
+            }
+        }
+    }
 }
diff --git a/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java b/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java
index 137e0aa..09b4f89 100644
--- a/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java
+++ b/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java
@@ -235,8 +235,9 @@
         info.primaryCpuAbi = AndroidPackageUtils.getPrimaryCpuAbi(pkg, pkgSetting);
         info.secondaryCpuAbi = AndroidPackageUtils.getSecondaryCpuAbi(pkg, pkgSetting);
 
-        info.flags |= appInfoFlags(pkg, pkgSetting);
-        info.privateFlags |= appInfoPrivateFlags(pkg, pkgSetting);
+        info.flags |= appInfoFlags(info.flags, pkgSetting);
+        info.privateFlags |= appInfoPrivateFlags(info.privateFlags, pkgSetting);
+
         return info;
     }
 
@@ -455,9 +456,18 @@
     public static int appInfoFlags(AndroidPackage pkg, @Nullable PackageSetting pkgSetting) {
         // TODO(b/135203078): Add setting related state
         // @formatter:off
-        int flags = PackageInfoWithoutStateUtils.appInfoFlags(pkg)
+        int pkgWithoutStateFlags = PackageInfoWithoutStateUtils.appInfoFlags(pkg)
                 | flag(pkg.isSystem(), ApplicationInfo.FLAG_SYSTEM)
                 | flag(pkg.isFactoryTest(), ApplicationInfo.FLAG_FACTORY_TEST);
+
+        return appInfoFlags(pkgWithoutStateFlags, pkgSetting);
+        // @formatter:on
+    }
+
+    /** @see ApplicationInfo#flags */
+    public static int appInfoFlags(int pkgWithoutStateFlags, @NonNull PackageSetting pkgSetting) {
+        // @formatter:off
+        int flags = pkgWithoutStateFlags;
         if (pkgSetting != null) {
             flags |= flag(pkgSetting.getPkgState().isUpdatedSystemApp(), ApplicationInfo.FLAG_UPDATED_SYSTEM_APP);
         }
@@ -467,9 +477,8 @@
 
     /** @see ApplicationInfo#privateFlags */
     public static int appInfoPrivateFlags(AndroidPackage pkg, @Nullable PackageSetting pkgSetting) {
-        // TODO(b/135203078): Add setting related state
         // @formatter:off
-        return PackageInfoWithoutStateUtils.appInfoPrivateFlags(pkg)
+        int pkgWithoutStateFlags = PackageInfoWithoutStateUtils.appInfoPrivateFlags(pkg)
                 | flag(pkg.isSystemExt(), ApplicationInfo.PRIVATE_FLAG_SYSTEM_EXT)
                 | flag(pkg.isPrivileged(), ApplicationInfo.PRIVATE_FLAG_PRIVILEGED)
                 | flag(pkg.isOem(), ApplicationInfo.PRIVATE_FLAG_OEM)
@@ -477,6 +486,15 @@
                 | flag(pkg.isProduct(), ApplicationInfo.PRIVATE_FLAG_PRODUCT)
                 | flag(pkg.isOdm(), ApplicationInfo.PRIVATE_FLAG_ODM)
                 | flag(pkg.isSignedWithPlatformKey(), ApplicationInfo.PRIVATE_FLAG_SIGNED_WITH_PLATFORM_KEY);
+        return appInfoPrivateFlags(pkgWithoutStateFlags, pkgSetting);
+        // @formatter:on
+    }
+
+    /** @see ApplicationInfo#privateFlags */
+    public static int appInfoPrivateFlags(int pkgWithoutStateFlags, @Nullable PackageSetting pkgSetting) {
+        // @formatter:off
+        // TODO: Add state specific flags
+        return pkgWithoutStateFlags;
         // @formatter:on
     }
 
diff --git a/services/core/java/com/android/server/pm/parsing/pkg/AndroidPackage.java b/services/core/java/com/android/server/pm/parsing/pkg/AndroidPackage.java
index 46b08df..c9e0bb4 100644
--- a/services/core/java/com/android/server/pm/parsing/pkg/AndroidPackage.java
+++ b/services/core/java/com/android/server/pm/parsing/pkg/AndroidPackage.java
@@ -301,6 +301,12 @@
     ApplicationInfo toAppInfoWithoutState();
 
     /**
+     * Same as toAppInfoWithoutState except it does not compute any flags.
+     */
+    @NonNull
+    ApplicationInfo toAppInfoWithoutStateWithoutFlags();
+
+    /**
      * TODO(b/135203078): Remove usages?
      * @return a mock of what the previous package.applicationInfo would've returned for logging
      * @deprecated don't use this in any new code, just print package name directly
diff --git a/services/core/java/com/android/server/pm/parsing/pkg/AndroidPackageUtils.java b/services/core/java/com/android/server/pm/parsing/pkg/AndroidPackageUtils.java
index 780b234..4a1a6a7 100644
--- a/services/core/java/com/android/server/pm/parsing/pkg/AndroidPackageUtils.java
+++ b/services/core/java/com/android/server/pm/parsing/pkg/AndroidPackageUtils.java
@@ -31,6 +31,7 @@
 import android.content.pm.parsing.component.ParsedInstrumentation;
 import android.content.pm.parsing.component.ParsedProvider;
 import android.content.pm.parsing.component.ParsedService;
+import android.os.incremental.IncrementalManager;
 import android.text.TextUtils;
 
 import com.android.internal.content.NativeLibraryHelper;
@@ -141,8 +142,15 @@
 
     public static boolean canHaveOatDir(AndroidPackage pkg, boolean isUpdatedSystemApp) {
         // The following app types CANNOT have oat directory
-        // - non-updated system apps
-        return !pkg.isSystem() || isUpdatedSystemApp;
+        // - non-updated system apps,
+        // - incrementally installed apps.
+        if (pkg.isSystem() && !isUpdatedSystemApp) {
+            return false;
+        }
+        if (IncrementalManager.isIncrementalPath(pkg.getCodePath())) {
+            return false;
+        }
+        return true;
     }
 
     public static boolean hasComponentClassName(AndroidPackage pkg, String className) {
diff --git a/services/core/java/com/android/server/pm/parsing/pkg/PackageImpl.java b/services/core/java/com/android/server/pm/parsing/pkg/PackageImpl.java
index fee154f..43365fa 100644
--- a/services/core/java/com/android/server/pm/parsing/pkg/PackageImpl.java
+++ b/services/core/java/com/android/server/pm/parsing/pkg/PackageImpl.java
@@ -455,7 +455,7 @@
 
     @Override
     public ApplicationInfo toAppInfoWithoutState() {
-        ApplicationInfo appInfo = super.toAppInfoWithoutState();
+        ApplicationInfo appInfo = super.toAppInfoWithoutStateWithoutFlags();
         appInfo.flags = PackageInfoUtils.appInfoFlags(this, null);
         appInfo.privateFlags = PackageInfoUtils.appInfoPrivateFlags(this, null);
         appInfo.nativeLibraryDir = nativeLibraryDir;
diff --git a/services/core/java/com/android/server/pm/permission/OneTimePermissionUserManager.java b/services/core/java/com/android/server/pm/permission/OneTimePermissionUserManager.java
index 1c45680..4bbe373 100644
--- a/services/core/java/com/android/server/pm/permission/OneTimePermissionUserManager.java
+++ b/services/core/java/com/android/server/pm/permission/OneTimePermissionUserManager.java
@@ -81,9 +81,6 @@
         mAlarmManager = context.getSystemService(AlarmManager.class);
         mPermissionControllerManager = context.getSystemService(PermissionControllerManager.class);
         mHandler = context.getMainThreadHandler();
-
-        // Listen for tracked uid being uninstalled
-        context.registerReceiver(mUninstallListener, new IntentFilter(Intent.ACTION_UID_REMOVED));
     }
 
     /**
@@ -171,6 +168,14 @@
     }
 
     /**
+     * Register to listen for Uids being uninstalled. This must be done outside of the
+     * PermissionManagerService lock.
+     */
+    void registerUninstallListener() {
+        mContext.registerReceiver(mUninstallListener, new IntentFilter(Intent.ACTION_UID_REMOVED));
+    }
+
+    /**
      * A class which watches a package for inactivity and notifies the permission controller when
      * the package becomes inactive
      */
diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
index ccc7492..e4e5261 100644
--- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
+++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
@@ -26,6 +26,7 @@
 import static android.content.pm.PackageManager.FLAGS_PERMISSION_RESTRICTION_ANY_EXEMPT;
 import static android.content.pm.PackageManager.FLAG_PERMISSION_APPLY_RESTRICTION;
 import static android.content.pm.PackageManager.FLAG_PERMISSION_GRANTED_BY_DEFAULT;
+import static android.content.pm.PackageManager.FLAG_PERMISSION_ONE_TIME;
 import static android.content.pm.PackageManager.FLAG_PERMISSION_POLICY_FIXED;
 import static android.content.pm.PackageManager.FLAG_PERMISSION_REVIEW_REQUIRED;
 import static android.content.pm.PackageManager.FLAG_PERMISSION_REVOKED_COMPAT;
@@ -1656,7 +1657,8 @@
         final int userSettableMask = FLAG_PERMISSION_USER_SET
                 | FLAG_PERMISSION_USER_FIXED
                 | FLAG_PERMISSION_REVOKED_COMPAT
-                | FLAG_PERMISSION_REVIEW_REQUIRED;
+                | FLAG_PERMISSION_REVIEW_REQUIRED
+                | FLAG_PERMISSION_ONE_TIME;
 
         final int policyOrSystemFlags = FLAG_PERMISSION_SYSTEM_FIXED
                 | FLAG_PERMISSION_POLICY_FIXED;
@@ -3210,16 +3212,19 @@
     }
 
     private OneTimePermissionUserManager getOneTimePermissionUserManager(@UserIdInt int userId) {
+        OneTimePermissionUserManager oneTimePermissionUserManager;
         synchronized (mLock) {
-            OneTimePermissionUserManager oneTimePermissionUserManager =
+            oneTimePermissionUserManager =
                     mOneTimePermissionUserManagers.get(userId);
-            if (oneTimePermissionUserManager == null) {
-                oneTimePermissionUserManager = new OneTimePermissionUserManager(
-                        mContext.createContextAsUser(UserHandle.of(userId), /*flags*/ 0));
-                mOneTimePermissionUserManagers.put(userId, oneTimePermissionUserManager);
+            if (oneTimePermissionUserManager != null) {
+                return oneTimePermissionUserManager;
             }
-            return oneTimePermissionUserManager;
+            oneTimePermissionUserManager = new OneTimePermissionUserManager(
+                    mContext.createContextAsUser(UserHandle.of(userId), /*flags*/ 0));
+            mOneTimePermissionUserManagers.put(userId, oneTimePermissionUserManager);
         }
+        oneTimePermissionUserManager.registerUninstallListener();
+        return oneTimePermissionUserManager;
     }
 
     @Override
@@ -3903,11 +3908,16 @@
      */
     private void updateAllPermissions(@Nullable String volumeUuid, boolean sdkUpdated,
             @NonNull PermissionCallback callback) {
-        final int flags = UPDATE_PERMISSIONS_ALL |
-                (sdkUpdated
-                        ? UPDATE_PERMISSIONS_REPLACE_PKG | UPDATE_PERMISSIONS_REPLACE_ALL
-                        : 0);
-        updatePermissions(null, null, volumeUuid, flags, callback);
+        PackageManager.corkPackageInfoCache();  // Prevent invalidation storm
+        try {
+            final int flags = UPDATE_PERMISSIONS_ALL |
+                    (sdkUpdated
+                            ? UPDATE_PERMISSIONS_REPLACE_PKG | UPDATE_PERMISSIONS_REPLACE_ALL
+                            : 0);
+            updatePermissions(null, null, volumeUuid, flags, callback);
+        } finally {
+            PackageManager.uncorkPackageInfoCache();
+        }
     }
 
     /**
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index c973640..2f84a99 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -62,6 +62,8 @@
 import static android.view.WindowManager.LayoutParams.TYPE_VOICE_INTERACTION;
 import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER;
 import static android.view.WindowManager.LayoutParams.isSystemAlertWindowType;
+import static android.view.WindowManager.ScreenshotSource.SCREENSHOT_KEY_CHORD;
+import static android.view.WindowManager.ScreenshotSource.SCREENSHOT_KEY_OTHER;
 import static android.view.WindowManager.TAKE_SCREENSHOT_FULLSCREEN;
 import static android.view.WindowManager.TAKE_SCREENSHOT_SELECTED_REGION;
 import static android.view.WindowManagerGlobal.ADD_OKAY;
@@ -1328,6 +1330,7 @@
                 mScreenshotChordVolumeDownKeyConsumed = true;
                 cancelPendingPowerKeyAction();
                 mScreenshotRunnable.setScreenshotType(TAKE_SCREENSHOT_FULLSCREEN);
+                mScreenshotRunnable.setScreenshotSource(SCREENSHOT_KEY_CHORD);
                 mHandler.postDelayed(mScreenshotRunnable, getScreenshotChordLongPressDelay());
             }
         }
@@ -1411,14 +1414,19 @@
 
     private class ScreenshotRunnable implements Runnable {
         private int mScreenshotType = TAKE_SCREENSHOT_FULLSCREEN;
+        private int mScreenshotSource = SCREENSHOT_KEY_OTHER;
 
         public void setScreenshotType(int screenshotType) {
             mScreenshotType = screenshotType;
         }
 
+        public void setScreenshotSource(int screenshotSource) {
+            mScreenshotSource = screenshotSource;
+        }
+
         @Override
         public void run() {
-            mDefaultDisplayPolicy.takeScreenshot(mScreenshotType);
+            mDefaultDisplayPolicy.takeScreenshot(mScreenshotType, mScreenshotSource);
         }
     }
 
@@ -2693,6 +2701,7 @@
                 int type = event.isShiftPressed() ? TAKE_SCREENSHOT_SELECTED_REGION
                         : TAKE_SCREENSHOT_FULLSCREEN;
                 mScreenshotRunnable.setScreenshotType(type);
+                mScreenshotRunnable.setScreenshotSource(SCREENSHOT_KEY_OTHER);
                 mHandler.post(mScreenshotRunnable);
                 return -1;
             }
@@ -2709,6 +2718,7 @@
         } else if (keyCode == KeyEvent.KEYCODE_SYSRQ) {
             if (down && repeatCount == 0) {
                 mScreenshotRunnable.setScreenshotType(TAKE_SCREENSHOT_FULLSCREEN);
+                mScreenshotRunnable.setScreenshotSource(SCREENSHOT_KEY_OTHER);
                 mHandler.post(mScreenshotRunnable);
             }
             return -1;
@@ -4468,12 +4478,6 @@
     private void wakeUpFromPowerKey(long eventTime) {
         wakeUp(eventTime, mAllowTheaterModeWakeFromPowerKey,
                 PowerManager.WAKE_REASON_POWER_BUTTON, "android.policy:POWER");
-
-        // Turn on the connected TV and switch HDMI input if we're a HDMI playback device.
-        final HdmiControl hdmiControl = getHdmiControl();
-        if (hdmiControl != null) {
-            hdmiControl.turnOnTv();
-        }
     }
 
     private boolean wakeUp(long wakeTime, boolean wakeInTheaterMode, @WakeReason int reason,
@@ -4489,6 +4493,12 @@
         }
 
         mPowerManager.wakeUp(wakeTime, reason, details);
+
+        // Turn on the connected TV and switch HDMI input if we're a HDMI playback device.
+        final HdmiControl hdmiControl = getHdmiControl();
+        if (hdmiControl != null) {
+            hdmiControl.turnOnTv();
+        }
         return true;
     }
 
diff --git a/services/core/java/com/android/server/policy/WindowManagerPolicy.java b/services/core/java/com/android/server/policy/WindowManagerPolicy.java
index d89605a9..da07223 100644
--- a/services/core/java/com/android/server/policy/WindowManagerPolicy.java
+++ b/services/core/java/com/android/server/policy/WindowManagerPolicy.java
@@ -395,14 +395,6 @@
             return false;
         }
 
-        /**
-         * Returns true if the window has a letterbox and any part of that letterbox overlaps with
-         * the given {@code rect}.
-         */
-        default boolean isLetterboxedOverlappingWith(Rect rect) {
-            return false;
-        }
-
         /** @return the current windowing mode of this window. */
         int getWindowingMode();
 
diff --git a/services/core/java/com/android/server/power/AttentionDetector.java b/services/core/java/com/android/server/power/AttentionDetector.java
index 1ab6ade..b69c450 100644
--- a/services/core/java/com/android/server/power/AttentionDetector.java
+++ b/services/core/java/com/android/server/power/AttentionDetector.java
@@ -17,7 +17,6 @@
 package com.android.server.power;
 
 import static android.provider.DeviceConfig.NAMESPACE_ATTENTION_MANAGER_SERVICE;
-import static android.provider.Settings.Secure.ADAPTIVE_SLEEP;
 
 import android.Manifest;
 import android.app.ActivityManager;
@@ -192,9 +191,6 @@
         }
 
         if (!isAttentionServiceSupported() || !serviceHasSufficientPermissions()) {
-            // Turns off adaptive sleep in settings for all users if attention service is not
-            // available. The setting itself should also be grayed out in this case.
-            Settings.Secure.putInt(mContentResolver, ADAPTIVE_SLEEP, 0);
             return nextScreenDimming;
         }
 
diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java
index 5a3464d..764ac96 100644
--- a/services/core/java/com/android/server/power/PowerManagerService.java
+++ b/services/core/java/com/android/server/power/PowerManagerService.java
@@ -2338,8 +2338,7 @@
                     nextTimeout = -1;
                 }
 
-                if (((mUserActivitySummary & USER_ACTIVITY_SCREEN_BRIGHT) != 0
-                        || (mUserActivitySummary & USER_ACTIVITY_SCREEN_DIM) != 0)
+                if ((mUserActivitySummary & USER_ACTIVITY_SCREEN_BRIGHT) != 0
                         && (mWakeLockSummary & WAKE_LOCK_STAY_AWAKE) == 0) {
                     nextTimeout = mAttentionDetector.updateUserActivity(nextTimeout,
                             screenDimDuration);
diff --git a/services/core/java/com/android/server/power/batterysaver/BatterySaverPolicy.java b/services/core/java/com/android/server/power/batterysaver/BatterySaverPolicy.java
index 059861b..701197e 100644
--- a/services/core/java/com/android/server/power/batterysaver/BatterySaverPolicy.java
+++ b/services/core/java/com/android/server/power/batterysaver/BatterySaverPolicy.java
@@ -214,7 +214,7 @@
      * required adjustments.
      */
     @GuardedBy("mLock")
-    private Policy mEffectivePolicy = OFF_POLICY;
+    private Policy mEffectivePolicyRaw = OFF_POLICY;
 
     @IntDef(prefix = {"POLICY_LEVEL_"}, value = {
             POLICY_LEVEL_OFF,
@@ -228,12 +228,8 @@
     static final int POLICY_LEVEL_ADAPTIVE = 1;
     static final int POLICY_LEVEL_FULL = 2;
 
-    /**
-     * Do not access directly; always use {@link #setPolicyLevel}
-     * and {@link #getPolicyLevelLocked}
-     */
     @GuardedBy("mLock")
-    private int mPolicyLevelRaw = POLICY_LEVEL_OFF;
+    private int mPolicyLevel = POLICY_LEVEL_OFF;
 
     private final Context mContext;
     private final ContentResolver mContentResolver;
@@ -338,7 +334,7 @@
     private void maybeNotifyListenersOfPolicyChange() {
         final BatterySaverPolicyListener[] listeners;
         synchronized (mLock) {
-            if (getPolicyLevelLocked() == POLICY_LEVEL_OFF) {
+            if (mPolicyLevel == POLICY_LEVEL_OFF) {
                 // Current policy is OFF, so there's no change to notify listeners of.
                 return;
             }
@@ -428,14 +424,14 @@
         boolean changed = false;
         Policy newFullPolicy = Policy.fromSettings(setting, deviceSpecificSetting,
                 DEFAULT_FULL_POLICY);
-        if (getPolicyLevelLocked() == POLICY_LEVEL_FULL && !mFullPolicy.equals(newFullPolicy)) {
+        if (mPolicyLevel == POLICY_LEVEL_FULL && !mFullPolicy.equals(newFullPolicy)) {
             changed = true;
         }
         mFullPolicy = newFullPolicy;
 
         mDefaultAdaptivePolicy = Policy.fromSettings(adaptiveSetting, adaptiveDeviceSpecificSetting,
                 DEFAULT_ADAPTIVE_POLICY);
-        if (getPolicyLevelLocked() == POLICY_LEVEL_ADAPTIVE
+        if (mPolicyLevel == POLICY_LEVEL_ADAPTIVE
                 && !mAdaptivePolicy.equals(mDefaultAdaptivePolicy)) {
             changed = true;
         }
@@ -451,8 +447,9 @@
     @GuardedBy("mLock")
     private void updatePolicyDependenciesLocked() {
         final Policy rawPolicy = getCurrentRawPolicyLocked();
-
         final int locationMode;
+
+        invalidatePowerSaveModeCaches();
         if (mCarModeEnabled
                 && rawPolicy.locationMode != PowerManager.LOCATION_MODE_NO_CHANGE
                 && rawPolicy.locationMode != PowerManager.LOCATION_MODE_FOREGROUND_ONLY) {
@@ -461,7 +458,8 @@
         } else {
             locationMode = rawPolicy.locationMode;
         }
-        mEffectivePolicy = new Policy(
+
+        mEffectivePolicyRaw = new Policy(
                 rawPolicy.adjustBrightnessFactor,
                 rawPolicy.advertiseIsEnabled,
                 rawPolicy.deferFullBackup,
@@ -489,24 +487,24 @@
 
         final StringBuilder sb = new StringBuilder();
 
-        if (mEffectivePolicy.forceAllAppsStandby) sb.append("A");
-        if (mEffectivePolicy.forceBackgroundCheck) sb.append("B");
+        if (mEffectivePolicyRaw.forceAllAppsStandby) sb.append("A");
+        if (mEffectivePolicyRaw.forceBackgroundCheck) sb.append("B");
 
-        if (mEffectivePolicy.disableVibration) sb.append("v");
-        if (mEffectivePolicy.disableAnimation) sb.append("a");
-        if (mEffectivePolicy.disableSoundTrigger) sb.append("s");
-        if (mEffectivePolicy.deferFullBackup) sb.append("F");
-        if (mEffectivePolicy.deferKeyValueBackup) sb.append("K");
-        if (mEffectivePolicy.enableFirewall) sb.append("f");
-        if (mEffectivePolicy.enableDataSaver) sb.append("d");
-        if (mEffectivePolicy.enableAdjustBrightness) sb.append("b");
+        if (mEffectivePolicyRaw.disableVibration) sb.append("v");
+        if (mEffectivePolicyRaw.disableAnimation) sb.append("a");
+        if (mEffectivePolicyRaw.disableSoundTrigger) sb.append("s");
+        if (mEffectivePolicyRaw.deferFullBackup) sb.append("F");
+        if (mEffectivePolicyRaw.deferKeyValueBackup) sb.append("K");
+        if (mEffectivePolicyRaw.enableFirewall) sb.append("f");
+        if (mEffectivePolicyRaw.enableDataSaver) sb.append("d");
+        if (mEffectivePolicyRaw.enableAdjustBrightness) sb.append("b");
 
-        if (mEffectivePolicy.disableLaunchBoost) sb.append("l");
-        if (mEffectivePolicy.disableOptionalSensors) sb.append("S");
-        if (mEffectivePolicy.disableAod) sb.append("o");
-        if (mEffectivePolicy.enableQuickDoze) sb.append("q");
+        if (mEffectivePolicyRaw.disableLaunchBoost) sb.append("l");
+        if (mEffectivePolicyRaw.disableOptionalSensors) sb.append("S");
+        if (mEffectivePolicyRaw.disableAod) sb.append("o");
+        if (mEffectivePolicyRaw.enableQuickDoze) sb.append("q");
 
-        sb.append(mEffectivePolicy.locationMode);
+        sb.append(mEffectivePolicyRaw.locationMode);
 
         mEventLogKeys = sb.toString();
     }
@@ -969,14 +967,14 @@
      */
     boolean setPolicyLevel(@PolicyLevel int level) {
         synchronized (mLock) {
-            if (getPolicyLevelLocked() == level) {
+            if (mPolicyLevel == level) {
                 return false;
             }
             switch (level) {
                 case POLICY_LEVEL_FULL:
                 case POLICY_LEVEL_ADAPTIVE:
                 case POLICY_LEVEL_OFF:
-                    setPolicyLevelLocked(level);
+                    mPolicyLevel = level;
                     break;
                 default:
                     Slog.wtf(TAG, "setPolicyLevel invalid level given: " + level);
@@ -998,7 +996,7 @@
         }
 
         mAdaptivePolicy = p;
-        if (getPolicyLevelLocked() == POLICY_LEVEL_ADAPTIVE) {
+        if (mPolicyLevel == POLICY_LEVEL_ADAPTIVE) {
             updatePolicyDependenciesLocked();
             return true;
         }
@@ -1011,11 +1009,11 @@
     }
 
     private Policy getCurrentPolicyLocked() {
-        return mEffectivePolicy;
+        return mEffectivePolicyRaw;
     }
 
     private Policy getCurrentRawPolicyLocked() {
-        switch (getPolicyLevelLocked()) {
+        switch (mPolicyLevel) {
             case POLICY_LEVEL_FULL:
                 return mFullPolicy;
             case POLICY_LEVEL_ADAPTIVE:
@@ -1077,12 +1075,12 @@
 
             pw.println("  mAccessibilityEnabled=" + mAccessibilityEnabled);
             pw.println("  mCarModeEnabled=" + mCarModeEnabled);
-            pw.println("  mPolicyLevel=" + getPolicyLevelLocked());
+            pw.println("  mPolicyLevel=" + mPolicyLevel);
 
             dumpPolicyLocked(pw, "  ", "full", mFullPolicy);
             dumpPolicyLocked(pw, "  ", "default adaptive", mDefaultAdaptivePolicy);
             dumpPolicyLocked(pw, "  ", "current adaptive", mAdaptivePolicy);
-            dumpPolicyLocked(pw, "  ", "effective", mEffectivePolicy);
+            dumpPolicyLocked(pw, "  ", "effective", mEffectivePolicyRaw);
         }
     }
 
@@ -1170,20 +1168,4 @@
             }
         }
     }
-
-    /** Non-blocking getter exists as a reminder not to modify cached fields directly */
-    @GuardedBy("mLock")
-    private int getPolicyLevelLocked() {
-        return mPolicyLevelRaw;
-    }
-
-    @GuardedBy("mLock")
-    private void setPolicyLevelLocked(int level) {
-        if (mPolicyLevelRaw == level) {
-            return;
-        }
-        // Under lock, invalidate before set ensures caches won't return stale values.
-        invalidatePowerSaveModeCaches();
-        mPolicyLevelRaw = level;
-    }
 }
diff --git a/services/core/java/com/android/server/power/batterysaver/BatterySaverStateMachine.java b/services/core/java/com/android/server/power/batterysaver/BatterySaverStateMachine.java
index 2256b62..af14d84d 100644
--- a/services/core/java/com/android/server/power/batterysaver/BatterySaverStateMachine.java
+++ b/services/core/java/com/android/server/power/batterysaver/BatterySaverStateMachine.java
@@ -838,7 +838,8 @@
         Intent intent = new Intent(intentAction);
         intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
         PendingIntent batterySaverIntent = PendingIntent.getActivity(
-                mContext, 0 /* requestCode */, intent, PendingIntent.FLAG_UPDATE_CURRENT);
+                mContext, 0 /* requestCode */, intent,
+                PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT);
         final String title = res.getString(titleId);
         final String summary = res.getString(summaryId);
 
diff --git a/services/core/java/com/android/server/rollback/RollbackPackageHealthObserver.java b/services/core/java/com/android/server/rollback/RollbackPackageHealthObserver.java
index 801d75b..f6d46e2 100644
--- a/services/core/java/com/android/server/rollback/RollbackPackageHealthObserver.java
+++ b/services/core/java/com/android/server/rollback/RollbackPackageHealthObserver.java
@@ -25,6 +25,7 @@
 import android.content.IntentFilter;
 import android.content.pm.PackageInstaller;
 import android.content.pm.PackageManager;
+import android.content.pm.PackageManagerInternal;
 import android.content.pm.VersionedPackage;
 import android.content.rollback.PackageRollbackInfo;
 import android.content.rollback.RollbackInfo;
@@ -41,10 +42,13 @@
 
 import com.android.internal.annotations.GuardedBy;
 import com.android.internal.util.FrameworkStatsLog;
+import com.android.server.LocalServices;
 import com.android.server.PackageWatchdog;
 import com.android.server.PackageWatchdog.FailureReasons;
 import com.android.server.PackageWatchdog.PackageHealthObserver;
 import com.android.server.PackageWatchdog.PackageHealthObserverImpact;
+import com.android.server.pm.ApexManager;
+import com.android.server.pm.parsing.pkg.AndroidPackage;
 
 import java.io.BufferedReader;
 import java.io.File;
@@ -71,6 +75,7 @@
 
     private final Context mContext;
     private final Handler mHandler;
+    private final ApexManager mApexManager;
     private final File mLastStagedRollbackIdsFile;
     // Staged rollback ids that have been committed but their session is not yet ready
     @GuardedBy("mPendingStagedRollbackIds")
@@ -85,6 +90,7 @@
         dataDir.mkdirs();
         mLastStagedRollbackIdsFile = new File(dataDir, "last-staged-rollback-ids");
         PackageWatchdog.getInstance(mContext).registerHealthObserver(this);
+        mApexManager = ApexManager.getInstance();
     }
 
     @Override
@@ -302,6 +308,18 @@
      * Returns true if the package name is the name of a module.
      */
     private boolean isModule(String packageName) {
+        // Check if the package is an APK inside an APEX. If it is, use the parent APEX package when
+        // querying PackageManager.
+        PackageManagerInternal pmi = LocalServices.getService(PackageManagerInternal.class);
+        AndroidPackage apkPackage = pmi.getPackage(packageName);
+        if (apkPackage != null) {
+            String apexPackageName = mApexManager.getActiveApexPackageNameContainingPackage(
+                    apkPackage);
+            if (apexPackageName != null) {
+                packageName = apexPackageName;
+            }
+        }
+
         PackageManager pm = mContext.getPackageManager();
         try {
             return pm.getModuleInfo(packageName, 0) != null;
diff --git a/services/core/java/com/android/server/soundtrigger_middleware/OWNERS b/services/core/java/com/android/server/soundtrigger_middleware/OWNERS
new file mode 100644
index 0000000..e5d0370
--- /dev/null
+++ b/services/core/java/com/android/server/soundtrigger_middleware/OWNERS
@@ -0,0 +1,2 @@
[email protected]
[email protected]
diff --git a/services/core/java/com/android/server/soundtrigger_middleware/SoundTriggerHw2Enforcer.java b/services/core/java/com/android/server/soundtrigger_middleware/SoundTriggerHw2Enforcer.java
index 870d909..a18b690 100644
--- a/services/core/java/com/android/server/soundtrigger_middleware/SoundTriggerHw2Enforcer.java
+++ b/services/core/java/com/android/server/soundtrigger_middleware/SoundTriggerHw2Enforcer.java
@@ -33,7 +33,7 @@
  * This is not necessarily a strict enforcement for the HAL contract, but a place to add checks for
  * common HAL malfunctions, to help track them and assist in debugging.
  *
- * The class is not thread-safe.
+ * The class is thread-safe.
  */
 public class SoundTriggerHw2Enforcer implements ISoundTriggerHw2 {
     static final String TAG = "SoundTriggerHw2Enforcer";
@@ -55,7 +55,9 @@
     public int loadSoundModel(ISoundTriggerHw.SoundModel soundModel, Callback callback,
             int cookie) {
         int handle = mUnderlying.loadSoundModel(soundModel, new CallbackEnforcer(callback), cookie);
-        mModelStates.put(handle, false);
+        synchronized (mModelStates) {
+            mModelStates.put(handle, false);
+        }
         return handle;
     }
 
@@ -64,27 +66,35 @@
             int cookie) {
         int handle = mUnderlying.loadPhraseSoundModel(soundModel, new CallbackEnforcer(callback),
                 cookie);
-        mModelStates.put(handle, false);
+        synchronized (mModelStates) {
+            mModelStates.put(handle, false);
+        }
         return handle;
     }
 
     @Override
     public void unloadSoundModel(int modelHandle) {
         mUnderlying.unloadSoundModel(modelHandle);
-        mModelStates.remove(modelHandle);
+        synchronized (mModelStates) {
+            mModelStates.remove(modelHandle);
+        }
     }
 
     @Override
     public void stopRecognition(int modelHandle) {
         mUnderlying.stopRecognition(modelHandle);
-        mModelStates.replace(modelHandle, false);
+        synchronized (mModelStates) {
+            mModelStates.replace(modelHandle, false);
+        }
     }
 
     @Override
     public void stopAllRecognitions() {
         mUnderlying.stopAllRecognitions();
-        for (Map.Entry<Integer, Boolean> entry : mModelStates.entrySet()) {
-            entry.setValue(false);
+        synchronized (mModelStates) {
+            for (Map.Entry<Integer, Boolean> entry : mModelStates.entrySet()) {
+                entry.setValue(false);
+            }
         }
     }
 
@@ -92,7 +102,9 @@
     public void startRecognition(int modelHandle, RecognitionConfig config, Callback callback,
             int cookie) {
         mUnderlying.startRecognition(modelHandle, config, new CallbackEnforcer(callback), cookie);
-        mModelStates.replace(modelHandle, true);
+        synchronized (mModelStates) {
+            mModelStates.replace(modelHandle, true);
+        }
     }
 
     @Override
@@ -142,12 +154,14 @@
         public void recognitionCallback(ISoundTriggerHwCallback.RecognitionEvent event,
                 int cookie) {
             int model = event.header.model;
-            if (!mModelStates.getOrDefault(model, false)) {
-                Log.wtfStack(TAG, "Unexpected recognition event for model: " + model);
-            }
-            if (event.header.status
-                    != android.media.soundtrigger_middleware.RecognitionStatus.FORCED) {
-                mModelStates.replace(model, false);
+            synchronized (mModelStates) {
+                if (!mModelStates.getOrDefault(model, false)) {
+                    Log.wtfStack(TAG, "Unexpected recognition event for model: " + model);
+                }
+                if (event.header.status
+                        != android.media.soundtrigger_middleware.RecognitionStatus.FORCED) {
+                    mModelStates.replace(model, false);
+                }
             }
             mUnderlying.recognitionCallback(event, cookie);
         }
@@ -156,12 +170,14 @@
         public void phraseRecognitionCallback(ISoundTriggerHwCallback.PhraseRecognitionEvent event,
                 int cookie) {
             int model = event.common.header.model;
-            if (!mModelStates.getOrDefault(model, false)) {
-                Log.wtfStack(TAG, "Unexpected recognition event for model: " + model);
-            }
-            if (event.common.header.status
-                    != android.media.soundtrigger_middleware.RecognitionStatus.FORCED) {
-                mModelStates.replace(model, false);
+            synchronized (mModelStates) {
+                if (!mModelStates.getOrDefault(model, false)) {
+                    Log.wtfStack(TAG, "Unexpected recognition event for model: " + model);
+                }
+                if (event.common.header.status
+                        != android.media.soundtrigger_middleware.RecognitionStatus.FORCED) {
+                    mModelStates.replace(model, false);
+                }
             }
             mUnderlying.phraseRecognitionCallback(event, cookie);
         }
diff --git a/services/core/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging.java b/services/core/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging.java
index 04ba6bf..8b6ed1f 100644
--- a/services/core/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging.java
+++ b/services/core/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging.java
@@ -377,11 +377,7 @@
     }
 
     private static void printObject(@NonNull StringBuilder builder, @Nullable Object obj) {
-        if (obj instanceof Parcelable) {
-            ObjectPrinter.print(builder, obj, true, 16);
-        } else {
-            builder.append(obj.toString());
-        }
+        ObjectPrinter.print(builder, obj, true, 16);
     }
 
     private static String printObject(@Nullable Object obj) {
diff --git a/services/core/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareValidation.java b/services/core/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareValidation.java
index 2325955..bae2441 100644
--- a/services/core/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareValidation.java
+++ b/services/core/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareValidation.java
@@ -32,9 +32,9 @@
 import android.media.soundtrigger_middleware.RecognitionStatus;
 import android.media.soundtrigger_middleware.SoundModel;
 import android.media.soundtrigger_middleware.SoundTriggerModuleDescriptor;
+import android.media.soundtrigger_middleware.SoundTriggerModuleProperties;
 import android.media.soundtrigger_middleware.Status;
 import android.os.IBinder;
-import android.os.Process;
 import android.os.RemoteException;
 import android.os.ServiceSpecificException;
 import android.util.Log;
@@ -108,17 +108,26 @@
 public class SoundTriggerMiddlewareValidation implements ISoundTriggerMiddlewareInternal, Dumpable {
     private static final String TAG = "SoundTriggerMiddlewareValidation";
 
-    private enum ModuleState {
+    private enum ModuleStatus {
         ALIVE,
         DETACHED,
         DEAD
     };
 
+    private class ModuleState {
+        final @NonNull SoundTriggerModuleProperties properties;
+        Set<ModuleService> sessions = new HashSet<>();
+
+        private ModuleState(@NonNull SoundTriggerModuleProperties properties) {
+            this.properties = properties;
+        }
+    }
+
     private Boolean mCaptureState;
 
     private final @NonNull ISoundTriggerMiddlewareInternal mDelegate;
     private final @NonNull Context mContext;
-    private Map<Integer, Set<ModuleService>> mModules;
+    private Map<Integer, ModuleState> mModules;
 
     public SoundTriggerMiddlewareValidation(
             @NonNull ISoundTriggerMiddlewareInternal delegate, @NonNull Context context) {
@@ -168,7 +177,7 @@
                 SoundTriggerModuleDescriptor[] result = mDelegate.listModules();
                 mModules = new HashMap<>(result.length);
                 for (SoundTriggerModuleDescriptor desc : result) {
-                    mModules.put(desc.handle, new HashSet<>());
+                    mModules.put(desc.handle, new ModuleState(desc.properties));
                 }
                 return result;
             } catch (Exception e) {
@@ -278,18 +287,21 @@
     @Override
     public void dump(PrintWriter pw) {
         synchronized (this) {
-            pw.printf("Capture state is %s\n", mCaptureState == null ? "uninitialized"
+            pw.printf("Capture state is %s\n\n", mCaptureState == null ? "uninitialized"
                     : (mCaptureState ? "active" : "inactive"));
             if (mModules != null) {
                 for (int handle : mModules.keySet()) {
+                    final ModuleState module = mModules.get(handle);
                     pw.println("=========================================");
-                    pw.printf("Active sessions for module %d", handle);
-                    pw.println();
+                    pw.printf("Module %d\n%s\n", handle,
+                            ObjectPrinter.print(module.properties, true, 16));
                     pw.println("=========================================");
-                    for (ModuleService session : mModules.get(handle)) {
+                    for (ModuleService session : module.sessions) {
                         session.dump(pw);
                     }
                 }
+            } else {
+                pw.println("Modules have not yet been enumerated.");
             }
         }
         pw.println();
@@ -297,11 +309,18 @@
         if (mDelegate instanceof Dumpable) {
             ((Dumpable) mDelegate).dump(pw);
         }
-
     }
 
     /** State of a sound model. */
     static class ModelState {
+        ModelState(SoundModel model) {
+            this.description = ObjectPrinter.print(model, true, 16);
+        }
+
+        ModelState(PhraseSoundModel model) {
+            this.description = ObjectPrinter.print(model, true, 16);
+        }
+
         /** Activity state of a sound model. */
         enum Activity {
             /** Model is loaded, recognition is inactive. */
@@ -313,6 +332,9 @@
         /** Activity state. */
         Activity activityState = Activity.LOADED;
 
+        /** Human-readable description of the model. */
+        final String description;
+
         /**
          * A map of known parameter support. A missing key means we don't know yet whether the
          * parameter is supported. A null value means it is known to not be supported. A non-null
@@ -375,7 +397,7 @@
         private ISoundTriggerModule mDelegate;
         private @NonNull Map<Integer, ModelState> mLoadedModels = new HashMap<>();
         private final int mHandle;
-        private ModuleState mState = ModuleState.ALIVE;
+        private ModuleStatus mState = ModuleStatus.ALIVE;
 
         ModuleService(int handle, @NonNull ISoundTriggerCallback callback) {
             mCallback = callback;
@@ -389,7 +411,7 @@
 
         void attach(@NonNull ISoundTriggerModule delegate) {
             mDelegate = delegate;
-            mModules.get(mHandle).add(this);
+            mModules.get(mHandle).sessions.add(this);
         }
 
         @Override
@@ -401,14 +423,14 @@
 
             synchronized (SoundTriggerMiddlewareValidation.this) {
                 // State validation.
-                if (mState == ModuleState.DETACHED) {
+                if (mState == ModuleStatus.DETACHED) {
                     throw new IllegalStateException("Module has been detached.");
                 }
 
                 // From here on, every exception isn't client's fault.
                 try {
                     int handle = mDelegate.loadModel(model);
-                    mLoadedModels.put(handle, new ModelState());
+                    mLoadedModels.put(handle, new ModelState(model));
                     return handle;
                 } catch (Exception e) {
                     throw handleException(e);
@@ -425,14 +447,14 @@
 
             synchronized (SoundTriggerMiddlewareValidation.this) {
                 // State validation.
-                if (mState == ModuleState.DETACHED) {
+                if (mState == ModuleStatus.DETACHED) {
                     throw new IllegalStateException("Module has been detached.");
                 }
 
                 // From here on, every exception isn't client's fault.
                 try {
                     int handle = mDelegate.loadPhraseModel(model);
-                    mLoadedModels.put(handle, new ModelState());
+                    mLoadedModels.put(handle, new ModelState(model));
                     return handle;
                 } catch (Exception e) {
                     throw handleException(e);
@@ -448,7 +470,7 @@
 
             synchronized (SoundTriggerMiddlewareValidation.this) {
                 // State validation.
-                if (mState == ModuleState.DETACHED) {
+                if (mState == ModuleStatus.DETACHED) {
                     throw new IllegalStateException("Module has been detached.");
                 }
                 ModelState modelState = mLoadedModels.get(
@@ -481,7 +503,7 @@
 
             synchronized (SoundTriggerMiddlewareValidation.this) {
                 // State validation.
-                if (mState == ModuleState.DETACHED) {
+                if (mState == ModuleStatus.DETACHED) {
                     throw new IllegalStateException("Module has been detached.");
                 }
                 ModelState modelState = mLoadedModels.get(
@@ -515,7 +537,7 @@
 
             synchronized (SoundTriggerMiddlewareValidation.this) {
                 // State validation.
-                if (mState == ModuleState.DETACHED) {
+                if (mState == ModuleStatus.DETACHED) {
                     throw new IllegalStateException("Module has been detached.");
                 }
                 ModelState modelState = mLoadedModels.get(
@@ -544,7 +566,7 @@
 
             synchronized (SoundTriggerMiddlewareValidation.this) {
                 // State validation.
-                if (mState == ModuleState.DETACHED) {
+                if (mState == ModuleStatus.DETACHED) {
                     throw new IllegalStateException("Module has been detached.");
                 }
                 ModelState modelState = mLoadedModels.get(
@@ -572,7 +594,7 @@
 
             synchronized (SoundTriggerMiddlewareValidation.this) {
                 // State validation.
-                if (mState == ModuleState.DETACHED) {
+                if (mState == ModuleStatus.DETACHED) {
                     throw new IllegalStateException("Module has been detached.");
                 }
                 ModelState modelState = mLoadedModels.get(
@@ -600,7 +622,7 @@
 
             synchronized (SoundTriggerMiddlewareValidation.this) {
                 // State validation.
-                if (mState == ModuleState.DETACHED) {
+                if (mState == ModuleStatus.DETACHED) {
                     throw new IllegalStateException("Module has been detached.");
                 }
                 ModelState modelState = mLoadedModels.get(
@@ -629,7 +651,7 @@
 
             synchronized (SoundTriggerMiddlewareValidation.this) {
                 // State validation.
-                if (mState == ModuleState.DETACHED) {
+                if (mState == ModuleStatus.DETACHED) {
                     throw new IllegalStateException("Module has been detached.");
                 }
                 ModelState modelState = mLoadedModels.get(
@@ -658,10 +680,10 @@
 
             synchronized (SoundTriggerMiddlewareValidation.this) {
                 // State validation.
-                if (mState == ModuleState.DETACHED) {
+                if (mState == ModuleStatus.DETACHED) {
                     throw new IllegalStateException("Module has already been detached.");
                 }
-                if (mState == ModuleState.ALIVE && !mLoadedModels.isEmpty()) {
+                if (mState == ModuleStatus.ALIVE && !mLoadedModels.isEmpty()) {
                     throw new IllegalStateException("Cannot detach while models are loaded.");
                 }
 
@@ -683,16 +705,16 @@
         private void detachInternal() {
             try {
                 mDelegate.detach();
-                mState = ModuleState.DETACHED;
+                mState = ModuleStatus.DETACHED;
                 mCallback.asBinder().unlinkToDeath(this, 0);
-                mModules.get(mHandle).remove(this);
+                mModules.get(mHandle).sessions.remove(this);
             } catch (RemoteException e) {
                 throw e.rethrowAsRuntimeException();
             }
         }
 
         void dump(PrintWriter pw) {
-            if (mState == ModuleState.ALIVE) {
+            if (mState == ModuleStatus.ALIVE) {
                 pw.printf("Loaded models for session %s (handle, active)", toString());
                 pw.println();
                 pw.println("-------------------------------");
@@ -700,6 +722,8 @@
                     pw.print(entry.getKey());
                     pw.print('\t');
                     pw.print(entry.getValue().activityState.name());
+                    pw.print('\t');
+                    pw.print(entry.getValue().description);
                     pw.println();
                 }
             } else {
@@ -762,7 +786,7 @@
         public void onModuleDied() {
             synchronized (SoundTriggerMiddlewareValidation.this) {
                 try {
-                    mState = ModuleState.DEAD;
+                    mState = ModuleStatus.DEAD;
                     mCallback.onModuleDied();
                 } catch (RemoteException e) {
                     // Dead client will be handled by binderDied() - no need to handle here.
diff --git a/services/core/java/com/android/server/stats/pull/ProcfsMemoryUtil.java b/services/core/java/com/android/server/stats/pull/ProcfsMemoryUtil.java
index 67677c6..e1e6195 100644
--- a/services/core/java/com/android/server/stats/pull/ProcfsMemoryUtil.java
+++ b/services/core/java/com/android/server/stats/pull/ProcfsMemoryUtil.java
@@ -41,10 +41,11 @@
     public static MemorySnapshot readMemorySnapshotFromProcfs(int pid) {
         long[] output = new long[STATUS_KEYS.length];
         output[0] = -1;
+        output[3] = -1;
+        output[4] = -1;
         Process.readProcLines("/proc/" + pid + "/status", STATUS_KEYS, output);
-        if (output[0] == -1 || (output[3] == 0 && output[4] == 0)) {
-            // Could not open file or anon rss / swap are 0 indicating the process is in a zombie
-            // state.
+        if (output[0] == -1 || output[3] == -1 || output[4] == -1) {
+            // Could not open or parse file.
             return null;
         }
         final MemorySnapshot snapshot = new MemorySnapshot();
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 288c22a..6fd7250 100644
--- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
+++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
@@ -98,6 +98,7 @@
 import android.os.storage.DiskInfo;
 import android.os.storage.StorageManager;
 import android.os.storage.VolumeInfo;
+import android.provider.DeviceConfig;
 import android.provider.Settings;
 import android.stats.storage.StorageEnums;
 import android.telephony.ModemActivityInfo;
@@ -204,6 +205,7 @@
     private static final int CPU_TIME_PER_THREAD_FREQ_MAX_NUM_FREQUENCIES = 8;
     private static final int OP_FLAGS_PULLED = OP_FLAG_SELF | OP_FLAG_TRUSTED_PROXY;
     private static final String COMMON_PERMISSION_PREFIX = "android.permission.";
+    private static final String APP_OPS_TARGET_COLLECTION_SIZE = "app_ops_target_collection_size";
 
     private final Object mNetworkStatsLock = new Object();
     @GuardedBy("mNetworkStatsLock")
@@ -2059,32 +2061,35 @@
         synchronized (mProcessStatsLock) {
             final long token = Binder.clearCallingIdentity();
             try {
+                // force procstats to flush & combine old files into one store
                 long lastHighWaterMark = readProcStatsHighWaterMark(section);
                 List<ParcelFileDescriptor> statsFiles = new ArrayList<>();
-                long highWaterMark = processStatsService.getCommittedStats(
-                        lastHighWaterMark, section, true, statsFiles);
-                if (statsFiles.size() != 1) {
-                    return StatsManager.PULL_SKIP;
-                }
-                unpackStreamedData(atomTag, pulledData, statsFiles);
+
+                ProcessStats procStats = new ProcessStats(false);
+                long highWaterMark = processStatsService.getCommittedStatsMerged(
+                        lastHighWaterMark, section, true, statsFiles, procStats);
+
+                // aggregate the data together for westworld consumption
+                ProtoOutputStream proto = new ProtoOutputStream();
+                procStats.dumpAggregatedProtoForStatsd(proto);
+
+                StatsEvent e = StatsEvent.newBuilder()
+                        .setAtomId(atomTag)
+                        .writeByteArray(proto.getBytes())
+                        .build();
+                pulledData.add(e);
+
                 new File(mBaseDir.getAbsolutePath() + "/" + section + "_" + lastHighWaterMark)
                         .delete();
                 new File(mBaseDir.getAbsolutePath() + "/" + section + "_" + highWaterMark)
                         .createNewFile();
-            } catch (IOException e) {
-                Slog.e(TAG, "Getting procstats failed: ", e);
-                return StatsManager.PULL_SKIP;
-            } catch (RemoteException e) {
-                Slog.e(TAG, "Getting procstats failed: ", e);
-                return StatsManager.PULL_SKIP;
-            } catch (SecurityException e) {
+            } catch (RemoteException | IOException e) {
                 Slog.e(TAG, "Getting procstats failed: ", e);
                 return StatsManager.PULL_SKIP;
             } finally {
                 Binder.restoreCallingIdentity(token);
             }
         }
-
         return StatsManager.PULL_SUCCESS;
     }
 
@@ -2910,7 +2915,10 @@
             HistoricalOps histOps = ops.get(EXTERNAL_STATS_SYNC_TIMEOUT_MILLIS,
                     TimeUnit.MILLISECONDS);
             if (mAppOpsSamplingRate == 0) {
-                mAppOpsSamplingRate = constrain((5000 * 100) / estimateAppOpsSize(), 1, 100);
+                int appOpsTargetCollectionSize = DeviceConfig.getInt(
+                        DeviceConfig.NAMESPACE_PERMISSIONS, APP_OPS_TARGET_COLLECTION_SIZE, 5000);
+                mAppOpsSamplingRate = constrain(
+                        (appOpsTargetCollectionSize * 100) / estimateAppOpsSize(), 1, 100);
             }
             processHistoricalOps(histOps, atomTag, pulledData);
         } catch (Throwable t) {
diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
index d7a0c987..289bf66 100644
--- a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
+++ b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
@@ -1380,11 +1380,11 @@
     }
 
     @Override
-    public void onNotificationBubbleChanged(String key, boolean isBubble) {
+    public void onNotificationBubbleChanged(String key, boolean isBubble, int flags) {
         enforceStatusBarService();
         long identity = Binder.clearCallingIdentity();
         try {
-            mNotificationDelegate.onNotificationBubbleChanged(key, isBubble);
+            mNotificationDelegate.onNotificationBubbleChanged(key, isBubble, flags);
         } finally {
             Binder.restoreCallingIdentity(identity);
         }
diff --git a/services/core/java/com/android/server/testharness/TestHarnessModeService.java b/services/core/java/com/android/server/testharness/TestHarnessModeService.java
index c2ecd41..5311369 100644
--- a/services/core/java/com/android/server/testharness/TestHarnessModeService.java
+++ b/services/core/java/com/android/server/testharness/TestHarnessModeService.java
@@ -25,6 +25,7 @@
 import android.content.Intent;
 import android.content.pm.UserInfo;
 import android.debug.AdbManagerInternal;
+import android.debug.AdbTransportType;
 import android.location.LocationManager;
 import android.os.BatteryManager;
 import android.os.Binder;
@@ -161,6 +162,14 @@
     private void configureSettings() {
         ContentResolver cr = getContext().getContentResolver();
 
+        // Stop ADB before we enable it, otherwise on userdebug/eng builds, the keys won't have
+        // registered with adbd, and it will prompt the user to confirm the keys.
+        Settings.Global.putInt(cr, Settings.Global.ADB_ENABLED, 0);
+        AdbManagerInternal adbManager = LocalServices.getService(AdbManagerInternal.class);
+        if (adbManager.isAdbEnabled(AdbTransportType.USB)) {
+            adbManager.stopAdbdForTransport(AdbTransportType.USB);
+        }
+
         // Disable the TTL for ADB keys before enabling ADB
         Settings.Global.putLong(cr, Settings.Global.ADB_ALLOWED_CONNECTION_TIME, 0);
         Settings.Global.putInt(cr, Settings.Global.ADB_ENABLED, 1);
diff --git a/services/core/java/com/android/server/tv/TvRemoteProviderWatcher.java b/services/core/java/com/android/server/tv/TvRemoteProviderWatcher.java
index 06c2354..6e180bc 100644
--- a/services/core/java/com/android/server/tv/TvRemoteProviderWatcher.java
+++ b/services/core/java/com/android/server/tv/TvRemoteProviderWatcher.java
@@ -27,6 +27,7 @@
 import android.content.pm.ServiceInfo;
 import android.os.Handler;
 import android.os.UserHandle;
+import android.text.TextUtils.SimpleStringSplitter;
 import android.util.Log;
 import android.util.Slog;
 
@@ -34,6 +35,8 @@
 
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
 
 /**
  * Watches for emote provider services to be installed.
@@ -51,19 +54,33 @@
     private final PackageManager mPackageManager;
     private final ArrayList<TvRemoteProviderProxy> mProviderProxies = new ArrayList<>();
     private final int mUserId;
-    private final String mUnbundledServicePackage;
     private final Object mLock;
+    private final Set<String> mUnbundledServicePackages = new HashSet<>();
 
     private boolean mRunning;
 
-    TvRemoteProviderWatcher(Context context, Object lock) {
+    TvRemoteProviderWatcher(Context context, Object lock, Handler handler) {
         mContext = context;
-        mHandler = new Handler(true);
+        mHandler = handler;
         mUserId = UserHandle.myUserId();
         mPackageManager = context.getPackageManager();
-        mUnbundledServicePackage = context.getString(
-                com.android.internal.R.string.config_tvRemoteServicePackage);
         mLock = lock;
+
+        // Unbundled package names supports a comma-separated list
+        SimpleStringSplitter splitter = new SimpleStringSplitter(',');
+        splitter.setString(context.getString(
+                com.android.internal.R.string.config_tvRemoteServicePackage));
+
+        splitter.forEach(packageName -> {
+            packageName = packageName.trim();
+            if (!packageName.isEmpty()) {
+                mUnbundledServicePackages.add(packageName);
+            }
+        });
+    }
+
+    TvRemoteProviderWatcher(Context context, Object lock) {
+        this(context, lock, new Handler(true));
     }
 
     public void start() {
@@ -157,7 +174,7 @@
         }
 
         // Check if package name is white-listed here.
-        if (!serviceInfo.packageName.equals(mUnbundledServicePackage)) {
+        if (!mUnbundledServicePackages.contains(serviceInfo.packageName)) {
             Slog.w(TAG, "Ignoring atv remote provider service because the package has not "
                     + "been set and/or whitelisted: "
                     + serviceInfo.packageName + "/" + serviceInfo.name);
diff --git a/services/core/java/com/android/server/tv/TvRemoteServiceInput.java b/services/core/java/com/android/server/tv/TvRemoteServiceInput.java
index 8fe6da5..390340a 100644
--- a/services/core/java/com/android/server/tv/TvRemoteServiceInput.java
+++ b/services/core/java/com/android/server/tv/TvRemoteServiceInput.java
@@ -88,6 +88,47 @@
     }
 
     @Override
+    public void openGamepadBridge(IBinder token, String name) throws RemoteException {
+        if (DEBUG) {
+            Slog.d(TAG, String.format("openGamepadBridge(), token: %s, name: %s", token, name));
+        }
+
+        synchronized (mLock) {
+            if (mBridgeMap.containsKey(token)) {
+                if (DEBUG) {
+                    Slog.d(TAG, "InputBridge already exists");
+                }
+            } else {
+                final long idToken = Binder.clearCallingIdentity();
+                try {
+                    mBridgeMap.put(token, UinputBridge.openGamepad(token, name));
+                    token.linkToDeath(new IBinder.DeathRecipient() {
+                        @Override
+                        public void binderDied() {
+                            closeInputBridge(token);
+                        }
+                    }, 0);
+                } catch (IOException e) {
+                    Slog.e(TAG, "Cannot create device for " + name);
+                    return;
+                } catch (RemoteException e) {
+                    Slog.e(TAG, "Token is already dead");
+                    closeInputBridge(token);
+                    return;
+                } finally {
+                    Binder.restoreCallingIdentity(idToken);
+                }
+            }
+        }
+
+        try {
+            mProvider.onInputBridgeConnected(token);
+        } catch (RemoteException e) {
+            Slog.e(TAG, "Failed remote call to onInputBridgeConnected");
+        }
+    }
+
+    @Override
     public void closeInputBridge(IBinder token) {
         if (DEBUG) {
             Slog.d(TAG, "closeInputBridge(), token: " + token);
@@ -96,6 +137,7 @@
         synchronized (mLock) {
             UinputBridge inputBridge = mBridgeMap.remove(token);
             if (inputBridge == null) {
+                Slog.w(TAG, String.format("Input bridge not found for token: %s", token));
                 return;
             }
 
@@ -117,6 +159,7 @@
         synchronized (mLock) {
             UinputBridge inputBridge = mBridgeMap.get(token);
             if (inputBridge == null) {
+                Slog.w(TAG, String.format("Input bridge not found for token: %s", token));
                 return;
             }
 
@@ -145,6 +188,7 @@
         synchronized (mLock) {
             UinputBridge inputBridge = mBridgeMap.get(token);
             if (inputBridge == null) {
+                Slog.w(TAG, String.format("Input bridge not found for token: %s", token));
                 return;
             }
 
@@ -166,6 +210,7 @@
         synchronized (mLock) {
             UinputBridge inputBridge = mBridgeMap.get(token);
             if (inputBridge == null) {
+                Slog.w(TAG, String.format("Input bridge not found for token: %s", token));
                 return;
             }
 
@@ -188,6 +233,7 @@
         synchronized (mLock) {
             UinputBridge inputBridge = mBridgeMap.get(token);
             if (inputBridge == null) {
+                Slog.w(TAG, String.format("Input bridge not found for token: %s", token));
                 return;
             }
 
@@ -209,6 +255,7 @@
         synchronized (mLock) {
             UinputBridge inputBridge = mBridgeMap.get(token);
             if (inputBridge == null) {
+                Slog.w(TAG, String.format("Input bridge not found for token: %s", token));
                 return;
             }
 
@@ -230,6 +277,7 @@
         synchronized (mLock) {
             UinputBridge inputBridge = mBridgeMap.get(token);
             if (inputBridge == null) {
+                Slog.w(TAG, String.format("Input bridge not found for token: %s", token));
                 return;
             }
 
@@ -241,4 +289,67 @@
             }
         }
     }
+
+    @Override
+    public void sendGamepadKeyUp(IBinder token, int keyIndex) {
+        if (DEBUG_KEYS) {
+            Slog.d(TAG, String.format("sendGamepadKeyUp(), token: %s", token));
+        }
+        synchronized (mLock) {
+            UinputBridge inputBridge = mBridgeMap.get(token);
+            if (inputBridge == null) {
+                Slog.w(TAG, String.format("Input bridge not found for token: %s", token));
+                return;
+            }
+
+            final long idToken = Binder.clearCallingIdentity();
+            try {
+                inputBridge.sendGamepadKey(token, keyIndex, false);
+            } finally {
+                Binder.restoreCallingIdentity(idToken);
+            }
+        }
+    }
+
+    @Override
+    public void sendGamepadKeyDown(IBinder token, int keyCode) {
+        if (DEBUG_KEYS) {
+            Slog.d(TAG, String.format("sendGamepadKeyDown(), token: %s", token));
+        }
+        synchronized (mLock) {
+            UinputBridge inputBridge = mBridgeMap.get(token);
+            if (inputBridge == null) {
+                Slog.w(TAG, String.format("Input bridge not found for token: %s", token));
+                return;
+            }
+
+            final long idToken = Binder.clearCallingIdentity();
+            try {
+                inputBridge.sendGamepadKey(token, keyCode, true);
+            } finally {
+                Binder.restoreCallingIdentity(idToken);
+            }
+        }
+    }
+
+    @Override
+    public void sendGamepadAxisValue(IBinder token, int axis, float value) {
+        if (DEBUG_KEYS) {
+            Slog.d(TAG, String.format("sendGamepadAxisValue(), token: %s", token));
+        }
+        synchronized (mLock) {
+            UinputBridge inputBridge = mBridgeMap.get(token);
+            if (inputBridge == null) {
+                Slog.w(TAG, String.format("Input bridge not found for token: %s", token));
+                return;
+            }
+
+            final long idToken = Binder.clearCallingIdentity();
+            try {
+                inputBridge.sendGamepadAxisValue(token, axis, value);
+            } finally {
+                Binder.restoreCallingIdentity(idToken);
+            }
+        }
+    }
 }
diff --git a/services/core/java/com/android/server/tv/UinputBridge.java b/services/core/java/com/android/server/tv/UinputBridge.java
index a2fe5fc..1dc201d 100644
--- a/services/core/java/com/android/server/tv/UinputBridge.java
+++ b/services/core/java/com/android/server/tv/UinputBridge.java
@@ -42,21 +42,27 @@
     /** Opens a gamepad - will support gamepad key and axis sending */
     private static native long nativeGamepadOpen(String name, String uniqueId);
 
-    /** Marks the specified key up/down for a gamepad */
-    private static native void nativeSendGamepadKey(long ptr, int keyIndex, boolean down);
+    /**
+     * Marks the specified key up/down for a gamepad.
+     *
+     *  @param keyCode - a code like BUTTON_MODE, BUTTON_A, BUTTON_B, ...
+     */
+    private static native void nativeSendGamepadKey(long ptr, int keyCode, boolean down);
 
     /**
-     * Gamepads pre-define the following axes:
-     *   - Left joystick X, axis == ABS_X == 0, range [0, 254]
-     *   - Left joystick Y, axis == ABS_Y == 1, range [0, 254]
-     *   - Right joystick X, axis == ABS_RX == 3, range [0, 254]
-     *   - Right joystick Y, axis == ABS_RY == 4, range [0, 254]
-     *   - Left trigger, axis == ABS_Z == 2, range [0, 254]
-     *   - Right trigger, axis == ABS_RZ == 5, range [0, 254]
-     *   - DPad X, axis == ABS_HAT0X == 0x10, range [-1, 1]
-     *   - DPad Y, axis == ABS_HAT0Y == 0x11, range [-1, 1]
+     * Send an axis value.
+     *
+     * Available axes are:
+     *  <li> Left joystick: AXIS_X, AXIS_Y
+     *  <li> Right joystick: AXIS_Z, AXIS_RZ
+     *  <li> Analog triggers: AXIS_LTRIGGER, AXIS_RTRIGGER
+     *  <li> DPad: AXIS_HAT_X, AXIS_HAT_Y
+     *
+     * @param axis is a MotionEvent.AXIS_* value.
+     * @param value is a value between -1 and 1 (inclusive)
+     *
      */
-    private static native void nativeSendGamepadAxisValue(long ptr, int axis, int value);
+    private static native void nativeSendGamepadAxisValue(long ptr, int axis, float value);
 
     public UinputBridge(IBinder token, String name, int width, int height, int maxPointers)
                         throws IOException {
@@ -163,26 +169,19 @@
      *  @param keyIndex - the index of the w3-spec key
      *  @param down - is the key pressed ?
      */
-    public void sendGamepadKey(IBinder token, int keyIndex, boolean down) {
+    public void sendGamepadKey(IBinder token, int keyCode, boolean down) {
         if (isTokenValid(token)) {
-            nativeSendGamepadKey(mPtr, keyIndex, down);
+            nativeSendGamepadKey(mPtr, keyCode, down);
         }
     }
 
-    /** Send a gamepad axis value.
-     *   - Left joystick X, axis == ABS_X == 0, range [0, 254]
-     *   - Left joystick Y, axis == ABS_Y == 1, range [0, 254]
-     *   - Right joystick X, axis == ABS_RX == 3, range [0, 254]
-     *   - Right joystick Y, axis == ABS_RY == 4, range [0, 254]
-     *   - Left trigger, axis == ABS_Z == 2, range [0, 254]
-     *   - Right trigger, axis == ABS_RZ == 5, range [0, 254]
-     *   - DPad X, axis == ABS_HAT0X == 0x10, range [-1, 1]
-     *   - DPad Y, axis == ABS_HAT0Y == 0x11, range [-1, 1]
+    /**
+     * Send a gamepad axis value.
      *
-     * @param axis is the axis index
-     * @param value is the value to set for that axis
+     * @param axis is the axis code (MotionEvent.AXIS_*)
+     * @param value is the value to set for that axis in [-1, 1]
      */
-    public void sendGamepadAxisValue(IBinder token, int axis, int value) {
+    public void sendGamepadAxisValue(IBinder token, int axis, float value) {
         if (isTokenValid(token)) {
             nativeSendGamepadAxisValue(mPtr, axis, value);
         }
diff --git a/services/core/java/com/android/server/tv/tunerresourcemanager/CasResource.java b/services/core/java/com/android/server/tv/tunerresourcemanager/CasResource.java
new file mode 100644
index 0000000..54ad1d2
--- /dev/null
+++ b/services/core/java/com/android/server/tv/tunerresourcemanager/CasResource.java
@@ -0,0 +1,152 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.server.tv.tunerresourcemanager;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * A Cas resource object used by the Tuner Resource Manager to record the cas
+ * information.
+ *
+ * @hide
+ */
+public final class CasResource {
+
+    private final int mSystemId;
+
+    private int mMaxSessionNum;
+
+    private int mAvailableSessionNum;
+
+    /**
+     * The owner clients' ids when part of the Cas is occupied.
+     */
+    private Map<Integer, Integer> mOwnerClientIdsToSessionNum = new HashMap<>();
+
+    private CasResource(Builder builder) {
+        this.mSystemId = builder.mSystemId;
+        this.mMaxSessionNum = builder.mMaxSessionNum;
+        this.mAvailableSessionNum = builder.mMaxSessionNum;
+    }
+
+    public int getSystemId() {
+        return mSystemId;
+    }
+
+    public int getMaxSessionNum() {
+        return mMaxSessionNum;
+    }
+
+    public int getUsedSessionNum() {
+        return (mMaxSessionNum - mAvailableSessionNum);
+    }
+
+    public boolean isFullyUsed() {
+        return mAvailableSessionNum == 0;
+    }
+
+    /**
+     * Update max session number.
+     *
+     * @param maxSessionNum the new max session num.
+     */
+    public void updateMaxSessionNum(int maxSessionNum) {
+        mAvailableSessionNum = Math.max(
+                0, mAvailableSessionNum + (maxSessionNum - mMaxSessionNum));
+        mMaxSessionNum = maxSessionNum;
+    }
+
+    /**
+     * Set an owner for the cas
+     *
+     * @param ownerId the client id of the owner.
+     */
+    public void setOwner(int ownerId) {
+        int sessionNum = mOwnerClientIdsToSessionNum.get(ownerId) == null
+                ? 1 : (mOwnerClientIdsToSessionNum.get(ownerId) + 1);
+        mOwnerClientIdsToSessionNum.put(ownerId, sessionNum);
+        mAvailableSessionNum--;
+    }
+
+    /**
+     * Remove an owner of the Cas.
+     *
+     * @param ownerId the removing client id of the owner.
+     */
+    public void removeOwner(int ownerId) {
+        mAvailableSessionNum += mOwnerClientIdsToSessionNum.get(ownerId);
+        mOwnerClientIdsToSessionNum.remove(ownerId);
+    }
+
+    public Set<Integer> getOwnerClientIds() {
+        return mOwnerClientIdsToSessionNum.keySet();
+    }
+
+    @Override
+    public String toString() {
+        return "CasResource[systemId=" + this.mSystemId
+                + ", isFullyUsed=" + (this.mAvailableSessionNum == 0)
+                + ", maxSessionNum=" + this.mMaxSessionNum
+                + ", ownerClients=" + ownersMapToString() + "]";
+    }
+
+    /**
+     * Builder class for {@link CasResource}.
+     */
+    public static class Builder {
+
+        private int mSystemId;
+        private int mMaxSessionNum;
+
+        Builder(int systemId) {
+            this.mSystemId = systemId;
+        }
+
+        /**
+         * Builder for {@link CasResource}.
+         *
+         * @param maxSessionNum the max session num the current Cas has.
+         */
+        public Builder maxSessionNum(int maxSessionNum) {
+            this.mMaxSessionNum = maxSessionNum;
+            return this;
+        }
+
+        /**
+         * Build a {@link CasResource}.
+         *
+         * @return {@link CasResource}.
+         */
+        public CasResource build() {
+            CasResource cas = new CasResource(this);
+            return cas;
+        }
+    }
+
+    private String ownersMapToString() {
+        StringBuilder string = new StringBuilder("{");
+        for (int clienId : mOwnerClientIdsToSessionNum.keySet()) {
+            string.append(" clientId=")
+                  .append(clienId)
+                  .append(", owns session num=")
+                  .append(mOwnerClientIdsToSessionNum.get(clienId))
+                  .append(",");
+        }
+        return string.append("}").toString();
+    }
+}
diff --git a/services/core/java/com/android/server/tv/tunerresourcemanager/ClientProfile.java b/services/core/java/com/android/server/tv/tunerresourcemanager/ClientProfile.java
index e100ff8..2b0fe8a 100644
--- a/services/core/java/com/android/server/tv/tunerresourcemanager/ClientProfile.java
+++ b/services/core/java/com/android/server/tv/tunerresourcemanager/ClientProfile.java
@@ -27,6 +27,7 @@
 public final class ClientProfile {
 
     public static final int INVALID_GROUP_ID = -1;
+    public static final int INVALID_RESOURCE_ID = -1;
 
     /**
      * Client id sent to the client when registering with
@@ -56,7 +57,6 @@
      * also lose their resources.
      */
     private int mGroupId = INVALID_GROUP_ID;
-
     /**
      * Optional nice value for TRM to reduce client’s priority.
      */
@@ -68,6 +68,16 @@
     private Set<Integer> mUsingFrontendIds = new HashSet<>();
 
     /**
+     * List of the Lnb ids that are used by the current client.
+     */
+    private Set<Integer> mUsingLnbIds = new HashSet<>();
+
+    /**
+     * List of the Cas system ids that are used by the current client.
+     */
+    private int mUsingCasSystemId = INVALID_RESOURCE_ID;
+
+    /**
      * Optional arbitrary priority value given by the client.
      *
      * <p>This value can override the default priorotiy calculated from
@@ -131,21 +141,70 @@
         mUsingFrontendIds.add(frontendId);
     }
 
-    public Iterable<Integer> getInUseFrontendIds() {
+    public Set<Integer> getInUseFrontendIds() {
         return mUsingFrontendIds;
     }
 
     /**
      * Called when the client released a frontend.
      *
-     * <p>This could happen when client resource reclaimed.
-     *
      * @param frontendId being released.
      */
     public void releaseFrontend(int frontendId) {
         mUsingFrontendIds.remove(frontendId);
     }
 
+    /**
+     * Set when the client starts to use an Lnb.
+     *
+     * @param lnbId being used.
+     */
+    public void useLnb(int lnbId) {
+        mUsingLnbIds.add(lnbId);
+    }
+
+    public Set<Integer> getInUseLnbIds() {
+        return mUsingLnbIds;
+    }
+
+    /**
+     * Called when the client released an lnb.
+     *
+     * @param lnbId being released.
+     */
+    public void releaseLnb(int lnbId) {
+        mUsingLnbIds.remove(lnbId);
+    }
+
+    /**
+     * Set when the client starts to use a Cas system.
+     *
+     * @param casSystemId cas being used.
+     */
+    public void useCas(int casSystemId) {
+        mUsingCasSystemId = casSystemId;
+    }
+
+    public int getInUseCasSystemId() {
+        return mUsingCasSystemId;
+    }
+
+    /**
+     * Called when the client released a Cas System.
+     */
+    public void releaseCas() {
+        mUsingCasSystemId = INVALID_RESOURCE_ID;
+    }
+
+    /**
+     * Called to reclaim all the resources being used by the current client.
+     */
+    public void reclaimAllResources() {
+        mUsingFrontendIds.clear();
+        mUsingLnbIds.clear();
+        mUsingCasSystemId = INVALID_RESOURCE_ID;
+    }
+
     @Override
     public String toString() {
         return "ClientProfile[id=" + this.mId + ", tvInputSessionId=" + this.mTvInputSessionId
diff --git a/services/core/java/com/android/server/tv/tunerresourcemanager/FrontendResource.java b/services/core/java/com/android/server/tv/tunerresourcemanager/FrontendResource.java
index 56f6159..7ea62b2 100644
--- a/services/core/java/com/android/server/tv/tunerresourcemanager/FrontendResource.java
+++ b/services/core/java/com/android/server/tv/tunerresourcemanager/FrontendResource.java
@@ -27,14 +27,7 @@
  *
  * @hide
  */
-public final class FrontendResource {
-    public static final int INVALID_OWNER_ID = -1;
-
-    /**
-     * Id of the current frontend. Should not be changed and should be aligned with the driver level
-     * implementation.
-     */
-    private final int mId;
+public final class FrontendResource extends TunerResourceBasic {
 
     /**
      * see {@link android.media.tv.tuner.frontend.FrontendSettings.Type}
@@ -51,28 +44,12 @@
      */
     private Set<Integer> mExclusiveGroupMemberFeIds = new HashSet<>();
 
-    /**
-     * If the current resource is in use. Once resources under the same exclusive group id is in use
-     * all other resources in the same group would be considered in use.
-     */
-    private boolean mIsInUse;
-
-    /**
-     * The owner client's id if this resource is occupied. Owner of the resource under the same
-     * exclusive group id would be considered as the whole group's owner.
-     */
-    private int mOwnerClientId = INVALID_OWNER_ID;
-
     private FrontendResource(Builder builder) {
-        this.mId = builder.mId;
+        super(builder);
         this.mType = builder.mType;
         this.mExclusiveGroupId = builder.mExclusiveGroupId;
     }
 
-    public int getId() {
-        return mId;
-    }
-
     public int getType() {
         return mType;
     }
@@ -112,32 +89,6 @@
         mExclusiveGroupMemberFeIds.remove(id);
     }
 
-    public boolean isInUse() {
-        return mIsInUse;
-    }
-
-    public int getOwnerClientId() {
-        return mOwnerClientId;
-    }
-
-    /**
-     * Set an owner client on the resource.
-     *
-     * @param ownerClientId the id of the owner client.
-     */
-    public void setOwner(int ownerClientId) {
-        mIsInUse = true;
-        mOwnerClientId = ownerClientId;
-    }
-
-    /**
-     * Remove an owner client from the resource.
-     */
-    public void removeOwner() {
-        mIsInUse = false;
-        mOwnerClientId = INVALID_OWNER_ID;
-    }
-
     @Override
     public String toString() {
         return "FrontendResource[id=" + this.mId + ", type=" + this.mType
@@ -149,13 +100,12 @@
     /**
      * Builder class for {@link FrontendResource}.
      */
-    public static class Builder {
-        private final int mId;
+    public static class Builder extends TunerResourceBasic.Builder {
         @Type private int mType;
         private int mExclusiveGroupId;
 
         Builder(int id) {
-            this.mId = id;
+            super(id);
         }
 
         /**
@@ -183,6 +133,7 @@
          *
          * @return {@link FrontendResource}.
          */
+        @Override
         public FrontendResource build() {
             FrontendResource frontendResource = new FrontendResource(this);
             return frontendResource;
diff --git a/services/core/java/com/android/server/tv/tunerresourcemanager/LnbResource.java b/services/core/java/com/android/server/tv/tunerresourcemanager/LnbResource.java
new file mode 100644
index 0000000..345b4b2
--- /dev/null
+++ b/services/core/java/com/android/server/tv/tunerresourcemanager/LnbResource.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.server.tv.tunerresourcemanager;
+
+/**
+ * An Lnb resource object used by the Tuner Resource Manager to record the tuner Lnb
+ * information.
+ *
+ * @hide
+ */
+public final class LnbResource extends TunerResourceBasic {
+
+    private LnbResource(Builder builder) {
+        super(builder);
+    }
+
+    @Override
+    public String toString() {
+        return "LnbResource[id=" + this.mId
+                + ", isInUse=" + this.mIsInUse + ", ownerClientId=" + this.mOwnerClientId + "]";
+    }
+
+    /**
+     * Builder class for {@link LnbResource}.
+     */
+    public static class Builder extends TunerResourceBasic.Builder {
+
+        Builder(int id) {
+            super(id);
+        }
+
+        /**
+         * Build a {@link LnbResource}.
+         *
+         * @return {@link LnbResource}.
+         */
+        @Override
+        public LnbResource build() {
+            LnbResource lnb = new LnbResource(this);
+            return lnb;
+        }
+    }
+}
diff --git a/services/core/java/com/android/server/tv/tunerresourcemanager/TunerResourceBasic.java b/services/core/java/com/android/server/tv/tunerresourcemanager/TunerResourceBasic.java
new file mode 100644
index 0000000..7f133c3
--- /dev/null
+++ b/services/core/java/com/android/server/tv/tunerresourcemanager/TunerResourceBasic.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.server.tv.tunerresourcemanager;
+
+import static android.media.tv.tunerresourcemanager.TunerResourceManager.INVALID_OWNER_ID;
+
+/**
+ * A Tuner resource basic object used by the Tuner Resource Manager to record the resource
+ * information.
+ *
+ * @hide
+ */
+public class TunerResourceBasic {
+    /**
+     * Id of the current resource. Should not be changed and should be aligned with the driver level
+     * implementation.
+     */
+    final int mId;
+
+    /**
+     * If the current resource is in use.
+     */
+    boolean mIsInUse;
+
+    /**
+     * The owner client's id if this resource is occupied.
+     */
+    int mOwnerClientId = INVALID_OWNER_ID;
+
+    TunerResourceBasic(Builder builder) {
+        this.mId = builder.mId;
+    }
+
+    public int getId() {
+        return mId;
+    }
+
+    public boolean isInUse() {
+        return mIsInUse;
+    }
+
+    public int getOwnerClientId() {
+        return mOwnerClientId;
+    }
+
+    /**
+     * Set an owner client on the resource.
+     *
+     * @param ownerClientId the id of the owner client.
+     */
+    public void setOwner(int ownerClientId) {
+        mIsInUse = true;
+        mOwnerClientId = ownerClientId;
+    }
+
+    /**
+     * Remove an owner client from the resource.
+     */
+    public void removeOwner() {
+        mIsInUse = false;
+        mOwnerClientId = INVALID_OWNER_ID;
+    }
+
+    /**
+     * Builder class for {@link TunerResourceBasic}.
+     */
+    public static class Builder {
+        private final int mId;
+
+        Builder(int id) {
+            this.mId = id;
+        }
+
+        /**
+         * Build a {@link TunerResourceBasic}.
+         *
+         * @return {@link TunerResourceBasic}.
+         */
+        public TunerResourceBasic build() {
+            TunerResourceBasic resource = new TunerResourceBasic(this);
+            return resource;
+        }
+    }
+}
diff --git a/services/core/java/com/android/server/tv/tunerresourcemanager/TunerResourceManagerService.java b/services/core/java/com/android/server/tv/tunerresourcemanager/TunerResourceManagerService.java
index 6dded00..2f70840 100644
--- a/services/core/java/com/android/server/tv/tunerresourcemanager/TunerResourceManagerService.java
+++ b/services/core/java/com/android/server/tv/tunerresourcemanager/TunerResourceManagerService.java
@@ -63,6 +63,10 @@
 
     // Map of the current available frontend resources
     private Map<Integer, FrontendResource> mFrontendResources = new HashMap<>();
+    // Map of the current available lnb resources
+    private Map<Integer, LnbResource> mLnbResources = new HashMap<>();
+    // Map of the current available Cas resources
+    private Map<Integer, CasResource> mCasResources = new HashMap<>();
 
     @GuardedBy("mLock")
     private Map<Integer, ResourcesReclaimListenerRecord> mListeners = new HashMap<>();
@@ -156,20 +160,19 @@
         @Override
         public void updateCasInfo(int casSystemId, int maxSessionNum) {
             enforceTrmAccessPermission("updateCasInfo");
-            if (DEBUG) {
-                Slog.d(TAG,
-                        "updateCasInfo(casSystemId=" + casSystemId
-                                + ", maxSessionNum=" + maxSessionNum + ")");
+            synchronized (mLock) {
+                updateCasInfoInternal(casSystemId, maxSessionNum);
             }
         }
 
         @Override
-        public void setLnbInfoList(int[] lnbIds) {
+        public void setLnbInfoList(int[] lnbIds) throws RemoteException {
             enforceTrmAccessPermission("setLnbInfoList");
-            if (DEBUG) {
-                for (int i = 0; i < lnbIds.length; i++) {
-                    Slog.d(TAG, "updateLnbInfo(lnbId=" + lnbIds[i] + ")");
-                }
+            if (lnbIds == null) {
+                throw new RemoteException("Lnb id list can't be null");
+            }
+            synchronized (mLock) {
+                setLnbInfoListInternal(lnbIds);
             }
         }
 
@@ -182,11 +185,11 @@
                 throw new RemoteException("frontendHandle can't be null");
             }
             synchronized (mLock) {
-                try {
-                    return requestFrontendInternal(request, frontendHandle);
-                } catch (RemoteException e) {
-                    throw e.rethrowFromSystemServer();
+                if (!checkClientExists(request.getClientId())) {
+                    throw new RemoteException("Request frontend from unregistered client:"
+                            + request.getClientId());
                 }
+                return requestFrontendInternal(request, frontendHandle);
             }
         }
 
@@ -208,55 +211,92 @@
                 throw new RemoteException("demuxHandle can't be null");
             }
             synchronized (mLock) {
+                if (!checkClientExists(request.getClientId())) {
+                    throw new RemoteException("Request demux from unregistered client:"
+                            + request.getClientId());
+                }
                 return requestDemuxInternal(request, demuxHandle);
             }
         }
 
         @Override
         public boolean requestDescrambler(@NonNull TunerDescramblerRequest request,
-                    @NonNull int[] descrambleHandle) throws RemoteException {
+                    @NonNull int[] descramblerHandle) throws RemoteException {
             enforceDescramblerAccessPermission("requestDescrambler");
             enforceTrmAccessPermission("requestDescrambler");
-            if (descrambleHandle == null) {
-                throw new RemoteException("descrambleHandle can't be null");
+            if (descramblerHandle == null) {
+                throw new RemoteException("descramblerHandle can't be null");
             }
             synchronized (mLock) {
-                return requestDescramblerInternal(request, descrambleHandle);
+                if (!checkClientExists(request.getClientId())) {
+                    throw new RemoteException("Request descrambler from unregistered client:"
+                            + request.getClientId());
+                }
+                return requestDescramblerInternal(request, descramblerHandle);
             }
         }
 
         @Override
-        public boolean requestCasSession(
-                @NonNull CasSessionRequest request, @NonNull int[] sessionResourceHandle) {
+        public boolean requestCasSession(@NonNull CasSessionRequest request,
+                @NonNull int[] casSessionHandle) throws RemoteException {
             enforceTrmAccessPermission("requestCasSession");
-            if (DEBUG) {
-                Slog.d(TAG, "requestCasSession(request=" + request + ")");
+            if (casSessionHandle == null) {
+                throw new RemoteException("casSessionHandle can't be null");
             }
-
-            return true;
+            synchronized (mLock) {
+                if (!checkClientExists(request.getClientId())) {
+                    throw new RemoteException("Request cas from unregistered client:"
+                            + request.getClientId());
+                }
+                return requestCasSessionInternal(request, casSessionHandle);
+            }
         }
 
         @Override
-        public boolean requestLnb(@NonNull TunerLnbRequest request, @NonNull int[] lnbHandle) {
+        public boolean requestLnb(@NonNull TunerLnbRequest request, @NonNull int[] lnbHandle)
+                throws RemoteException {
             enforceTunerAccessPermission("requestLnb");
             enforceTrmAccessPermission("requestLnb");
-            if (DEBUG) {
-                Slog.d(TAG, "requestLnb(request=" + request + ")");
+            if (lnbHandle == null) {
+                throw new RemoteException("lnbHandle can't be null");
             }
-            return true;
+            synchronized (mLock) {
+                if (!checkClientExists(request.getClientId())) {
+                    throw new RemoteException("Request lnb from unregistered client:"
+                            + request.getClientId());
+                }
+                return requestLnbInternal(request, lnbHandle);
+            }
         }
 
         @Override
-        public void releaseFrontend(int frontendId) {
+        public void releaseFrontend(int frontendHandle, int clientId) throws RemoteException {
             enforceTunerAccessPermission("releaseFrontend");
             enforceTrmAccessPermission("releaseFrontend");
-            if (DEBUG) {
-                Slog.d(TAG, "releaseFrontend(id=" + frontendId + ")");
+            if (!validateResourceHandle(TunerResourceManager.TUNER_RESOURCE_TYPE_FRONTEND,
+                    frontendHandle)) {
+                throw new RemoteException("frontendHandle can't be invalid");
+            }
+            synchronized (mLock) {
+                if (!checkClientExists(clientId)) {
+                    throw new RemoteException("Release frontend from unregistered client:"
+                            + clientId);
+                }
+                int frontendId = getResourceIdFromHandle(frontendHandle);
+                FrontendResource fe = getFrontendResource(frontendId);
+                if (fe == null) {
+                    throw new RemoteException("Releasing frontend does not exist.");
+                }
+                if (fe.getOwnerClientId() != clientId) {
+                    throw new RemoteException(
+                            "Client is not the current owner of the releasing fe.");
+                }
+                releaseFrontendInternal(fe);
             }
         }
 
         @Override
-        public void releaseDemux(int demuxHandle) {
+        public void releaseDemux(int demuxHandle, int clientId) {
             enforceTunerAccessPermission("releaseDemux");
             enforceTrmAccessPermission("releaseDemux");
             if (DEBUG) {
@@ -265,7 +305,7 @@
         }
 
         @Override
-        public void releaseDescrambler(int descramblerHandle) {
+        public void releaseDescrambler(int descramblerHandle, int clientId) {
             enforceTunerAccessPermission("releaseDescrambler");
             enforceTrmAccessPermission("releaseDescrambler");
             if (DEBUG) {
@@ -274,19 +314,49 @@
         }
 
         @Override
-        public void releaseCasSession(int sessionResourceId) {
+        public void releaseCasSession(int casSessionHandle, int clientId) throws RemoteException {
             enforceTrmAccessPermission("releaseCasSession");
-            if (DEBUG) {
-                Slog.d(TAG, "releaseCasSession(sessionResourceId=" + sessionResourceId + ")");
+            if (!validateResourceHandle(
+                    TunerResourceManager.TUNER_RESOURCE_TYPE_CAS_SESSION, casSessionHandle)) {
+                throw new RemoteException("casSessionHandle can't be invalid");
+            }
+            synchronized (mLock) {
+                if (!checkClientExists(clientId)) {
+                    throw new RemoteException("Release cas from unregistered client:" + clientId);
+                }
+                int casSystemId = getClientProfile(clientId).getInUseCasSystemId();
+                CasResource cas = getCasResource(casSystemId);
+                if (cas == null) {
+                    throw new RemoteException("Releasing cas does not exist.");
+                }
+                if (!cas.getOwnerClientIds().contains(clientId)) {
+                    throw new RemoteException(
+                            "Client is not the current owner of the releasing cas.");
+                }
+                releaseCasSessionInternal(cas, clientId);
             }
         }
 
         @Override
-        public void releaseLnb(int lnbId) {
+        public void releaseLnb(int lnbHandle, int clientId) throws RemoteException {
             enforceTunerAccessPermission("releaseLnb");
             enforceTrmAccessPermission("releaseLnb");
-            if (DEBUG) {
-                Slog.d(TAG, "releaseLnb(lnbId=" + lnbId + ")");
+            if (!validateResourceHandle(TunerResourceManager.TUNER_RESOURCE_TYPE_LNB, lnbHandle)) {
+                throw new RemoteException("lnbHandle can't be invalid");
+            }
+            if (!checkClientExists(clientId)) {
+                throw new RemoteException("Release lnb from unregistered client:" + clientId);
+            }
+            int lnbId = getResourceIdFromHandle(lnbHandle);
+            LnbResource lnb = getLnbResource(lnbId);
+            if (lnb == null) {
+                throw new RemoteException("Releasing lnb does not exist.");
+            }
+            if (lnb.getOwnerClientId() != clientId) {
+                throw new RemoteException("Client is not the current owner of the releasing lnb.");
+            }
+            synchronized (mLock) {
+                releaseLnbInternal(lnb);
             }
         }
 
@@ -393,7 +463,6 @@
             }
         }
 
-        // TODO check if the removing resource is in use or not. Handle the conflict.
         for (int removingId : updatingFrontendIds) {
             // update the exclusive group id member list
             removeFrontendResource(removingId);
@@ -401,17 +470,74 @@
     }
 
     @VisibleForTesting
-    protected boolean requestFrontendInternal(TunerFrontendRequest request, int[] frontendHandle)
-            throws RemoteException {
+    protected void setLnbInfoListInternal(int[] lnbIds) {
+        if (DEBUG) {
+            for (int i = 0; i < lnbIds.length; i++) {
+                Slog.d(TAG, "updateLnbInfo(lnbId=" + lnbIds[i] + ")");
+            }
+        }
+
+        // A set to record the Lnbs pending on updating. Ids will be removed
+        // from this set once its updating finished. Any lnb left in this set when all
+        // the updates are done will be removed from mLnbResources.
+        Set<Integer> updatingLnbIds = new HashSet<>(getLnbResources().keySet());
+
+        // Update lnbResources map and other mappings accordingly
+        for (int i = 0; i < lnbIds.length; i++) {
+            if (getLnbResource(lnbIds[i]) != null) {
+                if (DEBUG) {
+                    Slog.d(TAG, "Lnb id=" + lnbIds[i] + "exists.");
+                }
+                updatingLnbIds.remove(lnbIds[i]);
+            } else {
+                // Add a new lnb resource
+                LnbResource newLnb = new LnbResource.Builder(lnbIds[i]).build();
+                addLnbResource(newLnb);
+            }
+        }
+
+        for (int removingId : updatingLnbIds) {
+            removeLnbResource(removingId);
+        }
+    }
+
+    @VisibleForTesting
+    protected void updateCasInfoInternal(int casSystemId, int maxSessionNum) {
+        if (DEBUG) {
+            Slog.d(TAG,
+                    "updateCasInfo(casSystemId=" + casSystemId
+                            + ", maxSessionNum=" + maxSessionNum + ")");
+        }
+        // If maxSessionNum is 0, removing the Cas Resource.
+        if (maxSessionNum == 0) {
+            removeCasResource(casSystemId);
+            return;
+        }
+        // If the Cas exists, updates the Cas Resource accordingly.
+        CasResource cas = getCasResource(casSystemId);
+        if (cas != null) {
+            if (cas.getUsedSessionNum() > maxSessionNum) {
+                // Sort and release the short number of Cas resources.
+                int releasingCasResourceNum = cas.getUsedSessionNum() - maxSessionNum;
+                releaseLowerPriorityClientCasResources(releasingCasResourceNum);
+            }
+            cas.updateMaxSessionNum(maxSessionNum);
+            return;
+        }
+        // Add the new Cas Resource.
+        cas = new CasResource.Builder(casSystemId)
+                             .maxSessionNum(maxSessionNum)
+                             .build();
+        addCasResource(cas);
+    }
+
+    @VisibleForTesting
+    protected boolean requestFrontendInternal(TunerFrontendRequest request, int[] frontendHandle) {
         if (DEBUG) {
             Slog.d(TAG, "requestFrontend(request=" + request + ")");
         }
 
         frontendHandle[0] = TunerResourceManager.INVALID_RESOURCE_HANDLE;
-        if (!checkClientExists(request.getClientId())) {
-            Slog.e(TAG, "Request frontend from unregistered client:" + request.getClientId());
-            return false;
-        }
         ClientProfile requestClient = getClientProfile(request.getClientId());
         int grantingFrontendId = -1;
         int inUseLowestPriorityFrId = -1;
@@ -432,7 +558,7 @@
                 } else if (grantingFrontendId < 0) {
                     // Record the frontend id with the lowest client priority among all the
                     // in use frontends when no available frontend has been found.
-                    int priority = getOwnerClientPriority(fr);
+                    int priority = getOwnerClientPriority(fr.getOwnerClientId());
                     if (currentLowestPriority > priority) {
                         inUseLowestPriorityFrId = fr.getId();
                         currentLowestPriority = priority;
@@ -452,10 +578,12 @@
         // When all the resources are occupied, grant the lowest priority resource if the
         // request client has higher priority.
         if (inUseLowestPriorityFrId > -1 && (requestClient.getPriority() > currentLowestPriority)) {
+            if (!reclaimResource(getFrontendResource(inUseLowestPriorityFrId).getOwnerClientId(),
+                    TunerResourceManager.TUNER_RESOURCE_TYPE_FRONTEND)) {
+                return false;
+            }
             frontendHandle[0] = generateResourceHandle(
                     TunerResourceManager.TUNER_RESOURCE_TYPE_FRONTEND, inUseLowestPriorityFrId);
-            reclaimFrontendResource(getFrontendResource(
-                    inUseLowestPriorityFrId).getOwnerClientId());
             updateFrontendClientMappingOnNewGrant(inUseLowestPriorityFrId, request.getClientId());
             return true;
         }
@@ -464,19 +592,147 @@
     }
 
     @VisibleForTesting
-    boolean requestDemuxInternal(TunerDemuxRequest request, int[] demuxHandle) {
+    protected boolean requestLnbInternal(TunerLnbRequest request, int[] lnbHandle) {
+        if (DEBUG) {
+            Slog.d(TAG, "requestLnb(request=" + request + ")");
+        }
+
+        lnbHandle[0] = TunerResourceManager.INVALID_RESOURCE_HANDLE;
+        ClientProfile requestClient = getClientProfile(request.getClientId());
+        int grantingLnbId = -1;
+        int inUseLowestPriorityLnbId = -1;
+        // Priority max value is 1000
+        int currentLowestPriority = MAX_CLIENT_PRIORITY + 1;
+        for (LnbResource lnb : getLnbResources().values()) {
+            if (!lnb.isInUse()) {
+                // Grant the unused lnb with lower id first
+                grantingLnbId = lnb.getId();
+                break;
+            } else {
+                // Record the lnb id with the lowest client priority among all the
+                // in use lnb when no available lnb has been found.
+                int priority = getOwnerClientPriority(lnb.getOwnerClientId());
+                if (currentLowestPriority > priority) {
+                    inUseLowestPriorityLnbId = lnb.getId();
+                    currentLowestPriority = priority;
+                }
+            }
+        }
+
+        // Grant Lnb when there is unused resource.
+        if (grantingLnbId > -1) {
+            lnbHandle[0] = generateResourceHandle(
+                    TunerResourceManager.TUNER_RESOURCE_TYPE_LNB, grantingLnbId);
+            updateLnbClientMappingOnNewGrant(grantingLnbId, request.getClientId());
+            return true;
+        }
+
+        // When all the resources are occupied, grant the lowest priority resource if the
+        // request client has higher priority.
+        if (inUseLowestPriorityLnbId > -1
+                && (requestClient.getPriority() > currentLowestPriority)) {
+            if (!reclaimResource(getLnbResource(inUseLowestPriorityLnbId).getOwnerClientId(),
+                    TunerResourceManager.TUNER_RESOURCE_TYPE_LNB)) {
+                return false;
+            }
+            lnbHandle[0] = generateResourceHandle(
+                    TunerResourceManager.TUNER_RESOURCE_TYPE_LNB, inUseLowestPriorityLnbId);
+            updateLnbClientMappingOnNewGrant(inUseLowestPriorityLnbId, request.getClientId());
+            return true;
+        }
+
+        return false;
+    }
+
+    @VisibleForTesting
+    protected boolean requestCasSessionInternal(CasSessionRequest request, int[] casSessionHandle) {
+        if (DEBUG) {
+            Slog.d(TAG, "requestCasSession(request=" + request + ")");
+        }
+        CasResource cas = getCasResource(request.getCasSystemId());
+        // Unregistered Cas System is treated as having unlimited sessions.
+        if (cas == null) {
+            cas = new CasResource.Builder(request.getCasSystemId())
+                                 .maxSessionNum(Integer.MAX_VALUE)
+                                 .build();
+            addCasResource(cas);
+        }
+        casSessionHandle[0] = TunerResourceManager.INVALID_RESOURCE_HANDLE;
+        ClientProfile requestClient = getClientProfile(request.getClientId());
+        int lowestPriorityOwnerId = -1;
+        // Priority max value is 1000
+        int currentLowestPriority = MAX_CLIENT_PRIORITY + 1;
+        if (!cas.isFullyUsed()) {
+            casSessionHandle[0] = generateResourceHandle(
+                    TunerResourceManager.TUNER_RESOURCE_TYPE_CAS_SESSION, cas.getSystemId());
+            updateCasClientMappingOnNewGrant(request.getCasSystemId(), request.getClientId());
+            return true;
+        }
+        for (int ownerId : cas.getOwnerClientIds()) {
+            // Record the client id with lowest priority that is using the current Cas system.
+            int priority = getOwnerClientPriority(ownerId);
+            if (currentLowestPriority > priority) {
+                lowestPriorityOwnerId = ownerId;
+                currentLowestPriority = priority;
+            }
+        }
+
+        // When all the Cas sessions are occupied, reclaim the lowest priority client if the
+        // request client has higher priority.
+        if (lowestPriorityOwnerId > -1 && (requestClient.getPriority() > currentLowestPriority)) {
+            if (!reclaimResource(lowestPriorityOwnerId,
+                    TunerResourceManager.TUNER_RESOURCE_TYPE_CAS_SESSION)) {
+                return false;
+            }
+            casSessionHandle[0] = generateResourceHandle(
+                    TunerResourceManager.TUNER_RESOURCE_TYPE_CAS_SESSION, cas.getSystemId());
+            updateCasClientMappingOnNewGrant(request.getCasSystemId(), request.getClientId());
+            return true;
+        }
+        return false;
+    }
+
+    @VisibleForTesting
+    protected void releaseFrontendInternal(FrontendResource fe) {
+        if (DEBUG) {
+            Slog.d(TAG, "releaseFrontend(id=" + fe.getId() + ")");
+        }
+        updateFrontendClientMappingOnRelease(fe);
+    }
+
+    @VisibleForTesting
+    protected void releaseLnbInternal(LnbResource lnb) {
+        if (DEBUG) {
+            Slog.d(TAG, "releaseLnb(lnbId=" + lnb.getId() + ")");
+        }
+        updateLnbClientMappingOnRelease(lnb);
+    }
+
+    @VisibleForTesting
+    protected void releaseCasSessionInternal(CasResource cas, int ownerClientId) {
+        if (DEBUG) {
+            Slog.d(TAG, "releaseCasSession(sessionResourceId=" + cas.getSystemId() + ")");
+        }
+        updateCasClientMappingOnRelease(cas, ownerClientId);
+    }
+
+    @VisibleForTesting
+    protected boolean requestDemuxInternal(TunerDemuxRequest request, int[] demuxHandle) {
         if (DEBUG) {
             Slog.d(TAG, "requestDemux(request=" + request + ")");
         }
+        // There are enough Demux resources, so we don't manage Demux in R.
         demuxHandle[0] = generateResourceHandle(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX, 0);
         return true;
     }
 
     @VisibleForTesting
-    boolean requestDescramblerInternal(TunerDescramblerRequest request, int[] descramblerHandle) {
+    protected boolean requestDescramblerInternal(
+            TunerDescramblerRequest request, int[] descramblerHandle) {
         if (DEBUG) {
             Slog.d(TAG, "requestDescrambler(request=" + request + ")");
         }
+        // There are enough Descrambler resources, so we don't manage Descrambler in R.
         descramblerHandle[0] =
                 generateResourceHandle(TunerResourceManager.TUNER_RESOURCE_TYPE_DESCRAMBLER, 0);
         return true;
@@ -530,12 +786,21 @@
     }
 
     @VisibleForTesting
-    protected void reclaimFrontendResource(int reclaimingId) {
-        try {
-            mListeners.get(reclaimingId).getListener().onReclaimResources();
-        } catch (RemoteException e) {
-            Slog.e(TAG, "Failed to reclaim resources on client " + reclaimingId, e);
+    protected boolean reclaimResource(int reclaimingClientId,
+            @TunerResourceManager.TunerResourceType int resourceType) {
+        if (DEBUG) {
+            Slog.d(TAG, "Reclaiming resources because higher priority client request resource type "
+                    + resourceType);
         }
+        try {
+            mListeners.get(reclaimingClientId).getListener().onReclaimResources();
+        } catch (RemoteException e) {
+            Slog.e(TAG, "Failed to reclaim resources on client " + reclaimingClientId, e);
+            return false;
+        }
+        ClientProfile profile = getClientProfile(reclaimingClientId);
+        reclaimingResourcesFromClient(profile);
+        return true;
     }
 
     @VisibleForTesting
@@ -568,14 +833,51 @@
         }
     }
 
+    private void updateFrontendClientMappingOnRelease(@NonNull FrontendResource releasingFrontend) {
+        ClientProfile ownerProfile = getClientProfile(releasingFrontend.getOwnerClientId());
+        releasingFrontend.removeOwner();
+        ownerProfile.releaseFrontend(releasingFrontend.getId());
+        for (int exclusiveGroupMember : releasingFrontend.getExclusiveGroupMemberFeIds()) {
+            getFrontendResource(exclusiveGroupMember).removeOwner();
+            ownerProfile.releaseFrontend(exclusiveGroupMember);
+        }
+    }
+
+    private void updateLnbClientMappingOnNewGrant(int grantingId, int ownerClientId) {
+        LnbResource grantingLnb = getLnbResource(grantingId);
+        ClientProfile ownerProfile = getClientProfile(ownerClientId);
+        grantingLnb.setOwner(ownerClientId);
+        ownerProfile.useLnb(grantingId);
+    }
+
+    private void updateLnbClientMappingOnRelease(@NonNull LnbResource releasingLnb) {
+        ClientProfile ownerProfile = getClientProfile(releasingLnb.getOwnerClientId());
+        releasingLnb.removeOwner();
+        ownerProfile.releaseLnb(releasingLnb.getId());
+    }
+
+    private void updateCasClientMappingOnNewGrant(int grantingId, int ownerClientId) {
+        CasResource grantingCas = getCasResource(grantingId);
+        ClientProfile ownerProfile = getClientProfile(ownerClientId);
+        grantingCas.setOwner(ownerClientId);
+        ownerProfile.useCas(grantingId);
+    }
+
+    private void updateCasClientMappingOnRelease(
+            @NonNull CasResource releasingCas, int ownerClientId) {
+        ClientProfile ownerProfile = getClientProfile(ownerClientId);
+        releasingCas.removeOwner(ownerClientId);
+        ownerProfile.releaseCas();
+    }
+
     /**
-     * Get the owner client's priority from the frontend id.
+     * Get the owner client's priority from the resource id.
      *
-     * @param frontend an in use frontend.
-     * @return the priority of the owner client of the frontend.
+     * @param clientId the owner client id.
+     * @return the priority of the owner client of the resource.
      */
-    private int getOwnerClientPriority(FrontendResource frontend) {
-        return getClientProfile(frontend.getOwnerClientId()).getPriority();
+    private int getOwnerClientPriority(int clientId) {
+        return getClientProfile(clientId).getPriority();
     }
 
     @VisibleForTesting
@@ -609,6 +911,12 @@
 
     private void removeFrontendResource(int removingId) {
         FrontendResource fe = getFrontendResource(removingId);
+        if (fe == null) {
+            return;
+        }
+        if (fe.isInUse()) {
+            releaseFrontendInternal(fe);
+        }
         for (int excGroupmemberFeId : fe.getExclusiveGroupMemberFeIds()) {
             getFrontendResource(excGroupmemberFeId)
                     .removeExclusiveGroupMemberFeId(fe.getId());
@@ -618,6 +926,66 @@
 
     @VisibleForTesting
     @Nullable
+    protected LnbResource getLnbResource(int lnbId) {
+        return mLnbResources.get(lnbId);
+    }
+
+    @VisibleForTesting
+    protected Map<Integer, LnbResource> getLnbResources() {
+        return mLnbResources;
+    }
+
+    private void addLnbResource(LnbResource newLnb) {
+        // Update resource list and available id list
+        mLnbResources.put(newLnb.getId(), newLnb);
+    }
+
+    private void removeLnbResource(int removingId) {
+        LnbResource lnb = getLnbResource(removingId);
+        if (lnb == null) {
+            return;
+        }
+        if (lnb.isInUse()) {
+            releaseLnbInternal(lnb);
+        }
+        mLnbResources.remove(removingId);
+    }
+
+    @VisibleForTesting
+    @Nullable
+    protected CasResource getCasResource(int systemId) {
+        return mCasResources.get(systemId);
+    }
+
+    @VisibleForTesting
+    protected Map<Integer, CasResource> getCasResources() {
+        return mCasResources;
+    }
+
+    private void addCasResource(CasResource newCas) {
+        // Update resource list and available id list
+        mCasResources.put(newCas.getSystemId(), newCas);
+    }
+
+    private void removeCasResource(int removingId) {
+        CasResource cas = getCasResource(removingId);
+        if (cas == null) {
+            return;
+        }
+        for (int ownerId : cas.getOwnerClientIds()) {
+            getClientProfile(ownerId).releaseCas();
+        }
+        mCasResources.remove(removingId);
+    }
+
+    private void releaseLowerPriorityClientCasResources(int releasingCasResourceNum) {
+        // TODO: Sort with a treemap
+
+        // select the first num client to release
+    }
+
+    @VisibleForTesting
+    @Nullable
     protected ClientProfile getClientProfile(int clientId) {
         return mClientProfiles.get(clientId);
     }
@@ -629,16 +997,24 @@
     }
 
     private void removeClientProfile(int clientId) {
-        for (int id : getClientProfile(clientId).getInUseFrontendIds()) {
-            getFrontendResource(id).removeOwner();
-            for (int groupMemberId : getFrontendResource(id).getExclusiveGroupMemberFeIds()) {
-                getFrontendResource(groupMemberId).removeOwner();
-            }
-        }
+        reclaimingResourcesFromClient(getClientProfile(clientId));
         mClientProfiles.remove(clientId);
         mListeners.remove(clientId);
     }
 
+    private void reclaimingResourcesFromClient(ClientProfile profile) {
+        for (Integer feId : profile.getInUseFrontendIds()) {
+            getFrontendResource(feId).removeOwner();
+        }
+        for (Integer lnbId : profile.getInUseLnbIds()) {
+            getLnbResource(lnbId).removeOwner();
+        }
+        if (profile.getInUseCasSystemId() != ClientProfile.INVALID_RESOURCE_ID) {
+            getCasResource(profile.getInUseCasSystemId()).removeOwner(profile.getId());
+        }
+        profile.reclaimAllResources();
+    }
+
     @VisibleForTesting
     protected boolean checkClientExists(int clientId) {
         return mClientProfiles.keySet().contains(clientId);
@@ -651,6 +1027,22 @@
                 | (mResourceRequestCount++ & 0xffff);
     }
 
+    @VisibleForTesting
+    protected int getResourceIdFromHandle(int resourceHandle) {
+        if (resourceHandle == TunerResourceManager.INVALID_RESOURCE_HANDLE) {
+            return resourceHandle;
+        }
+        return (resourceHandle & 0x00ff0000) >> 16;
+    }
+
+    private boolean validateResourceHandle(int resourceType, int resourceHandle) {
+        if (resourceHandle == TunerResourceManager.INVALID_RESOURCE_HANDLE
+                || ((resourceHandle & 0xff000000) >> 24) != resourceType) {
+            return false;
+        }
+        return true;
+    }
+
     private void enforceTrmAccessPermission(String apiName) {
         getContext().enforceCallingPermission("android.permission.TUNER_RESOURCE_ACCESS",
                 TAG + ": " + apiName);
diff --git a/services/core/java/com/android/server/uri/GrantUri.java b/services/core/java/com/android/server/uri/GrantUri.java
index 1571575..f9b6a7a 100644
--- a/services/core/java/com/android/server/uri/GrantUri.java
+++ b/services/core/java/com/android/server/uri/GrantUri.java
@@ -18,6 +18,7 @@
 
 import android.content.ContentProvider;
 import android.content.ContentResolver;
+import android.content.Intent;
 import android.net.Uri;
 import android.util.proto.ProtoOutputStream;
 
@@ -27,12 +28,12 @@
 public class GrantUri {
     public final int sourceUserId;
     public final Uri uri;
-    public boolean prefix;
+    public final boolean prefix;
 
-    public GrantUri(int sourceUserId, Uri uri, boolean prefix) {
+    public GrantUri(int sourceUserId, Uri uri, int modeFlags) {
         this.sourceUserId = sourceUserId;
         this.uri = uri;
-        this.prefix = prefix;
+        this.prefix = (modeFlags & Intent.FLAG_GRANT_PREFIX_URI_PERMISSION) != 0;
     }
 
     @Override
@@ -74,12 +75,12 @@
         proto.end(token);
     }
 
-    public static GrantUri resolve(int defaultSourceUserHandle, Uri uri) {
+    public static GrantUri resolve(int defaultSourceUserHandle, Uri uri, int modeFlags) {
         if (ContentResolver.SCHEME_CONTENT.equals(uri.getScheme())) {
             return new GrantUri(ContentProvider.getUserIdFromUri(uri, defaultSourceUserHandle),
-                    ContentProvider.getUriWithoutUserId(uri), false);
+                    ContentProvider.getUriWithoutUserId(uri), modeFlags);
         } else {
-            return new GrantUri(defaultSourceUserHandle, uri, false);
+            return new GrantUri(defaultSourceUserHandle, uri, modeFlags);
         }
     }
 }
diff --git a/services/core/java/com/android/server/uri/NeededUriGrants.java b/services/core/java/com/android/server/uri/NeededUriGrants.java
index 0120394..8c8f553 100644
--- a/services/core/java/com/android/server/uri/NeededUriGrants.java
+++ b/services/core/java/com/android/server/uri/NeededUriGrants.java
@@ -16,22 +16,23 @@
 
 package com.android.server.uri;
 
+import android.util.ArraySet;
 import android.util.proto.ProtoOutputStream;
 
 import com.android.server.am.NeededUriGrantsProto;
 
-import java.util.ArrayList;
-
 /** List of {@link GrantUri} a process needs. */
-public class NeededUriGrants extends ArrayList<GrantUri> {
+public class NeededUriGrants {
     final String targetPkg;
     final int targetUid;
     final int flags;
+    final ArraySet<GrantUri> uris;
 
     public NeededUriGrants(String targetPkg, int targetUid, int flags) {
         this.targetPkg = targetPkg;
         this.targetUid = targetUid;
         this.flags = flags;
+        this.uris = new ArraySet<>();
     }
 
     public void dumpDebug(ProtoOutputStream proto, long fieldId) {
@@ -40,9 +41,9 @@
         proto.write(NeededUriGrantsProto.TARGET_UID, targetUid);
         proto.write(NeededUriGrantsProto.FLAGS, flags);
 
-        final int N = this.size();
+        final int N = uris.size();
         for (int i = 0; i < N; i++) {
-            this.get(i).dumpDebug(proto, NeededUriGrantsProto.GRANTS);
+            uris.valueAt(i).dumpDebug(proto, NeededUriGrantsProto.GRANTS);
         }
         proto.end(token);
     }
diff --git a/services/core/java/com/android/server/uri/TEST_MAPPING b/services/core/java/com/android/server/uri/TEST_MAPPING
new file mode 100644
index 0000000..e5cda03
--- /dev/null
+++ b/services/core/java/com/android/server/uri/TEST_MAPPING
@@ -0,0 +1,30 @@
+{
+    "presubmit": [
+        {
+            "name": "FrameworksServicesTests",
+            "options": [
+                {
+                    "include-filter": "com.android.server.uri."
+                }
+            ]
+        }
+    ],
+    "postsubmit": [
+        {
+            "name": "CtsAppSecurityHostTestCases",
+            "options": [
+                {
+                    "include-filter": "android.appsecurity.cts.AppSecurityTests#testPermissionDiffCert"
+                }
+            ]
+        },
+        {
+            "name": "CtsWindowManagerDeviceTestCases",
+            "options": [
+                {
+                    "include-filter": "android.server.wm.CrossAppDragAndDropTests"
+                }
+            ]
+        }
+    ]
+}
diff --git a/services/core/java/com/android/server/uri/UriGrantsManagerInternal.java b/services/core/java/com/android/server/uri/UriGrantsManagerInternal.java
index 2f50fcb..8afb87f 100644
--- a/services/core/java/com/android/server/uri/UriGrantsManagerInternal.java
+++ b/services/core/java/com/android/server/uri/UriGrantsManagerInternal.java
@@ -30,7 +30,6 @@
  */
 public interface UriGrantsManagerInternal {
     void onSystemReady();
-    void onActivityManagerInternalAdded();
     void removeUriPermissionIfNeeded(UriPermission perm);
     void grantUriPermission(int callingUid, String targetPkg, GrantUri grantUri,
             final int modeFlags, UriPermissionOwner owner, int targetUserId);
diff --git a/services/core/java/com/android/server/uri/UriGrantsManagerService.java b/services/core/java/com/android/server/uri/UriGrantsManagerService.java
index fe34e86..b8c2f90 100644
--- a/services/core/java/com/android/server/uri/UriGrantsManagerService.java
+++ b/services/core/java/com/android/server/uri/UriGrantsManagerService.java
@@ -21,6 +21,9 @@
 import static android.Manifest.permission.GET_APP_GRANTED_URI_PERMISSIONS;
 import static android.Manifest.permission.INTERACT_ACROSS_USERS;
 import static android.app.ActivityManagerInternal.ALLOW_FULL_ONLY;
+import static android.content.Intent.FLAG_GRANT_PREFIX_URI_PERMISSION;
+import static android.content.Intent.FLAG_GRANT_READ_URI_PERMISSION;
+import static android.content.Intent.FLAG_GRANT_WRITE_URI_PERMISSION;
 import static android.content.pm.PackageManager.MATCH_ANY_USER;
 import static android.content.pm.PackageManager.MATCH_DEBUG_TRIAGED_MISSING;
 import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_AWARE;
@@ -53,7 +56,6 @@
 import android.content.ContentResolver;
 import android.content.Context;
 import android.content.Intent;
-import android.content.pm.IPackageManager;
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManagerInternal;
 import android.content.pm.ParceledListSlice;
@@ -76,6 +78,8 @@
 import android.util.SparseArray;
 import android.util.Xml;
 
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.util.ArrayUtils;
 import com.android.internal.util.FastXmlSerializer;
 import com.android.internal.util.Preconditions;
 import com.android.server.IoThread;
@@ -83,11 +87,11 @@
 import com.android.server.SystemService;
 import com.android.server.SystemServiceManager;
 
+import libcore.io.IoUtils;
+
 import com.google.android.collect.Lists;
 import com.google.android.collect.Maps;
 
-import libcore.io.IoUtils;
-
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
 import org.xmlpull.v1.XmlSerializer;
@@ -114,7 +118,6 @@
     private static final boolean ENABLE_DYNAMIC_PERMISSIONS = false;
 
     private final Object mLock = new Object();
-    private final Context mContext;
     private final H mH;
     ActivityManagerInternal mAmInternal;
     PackageManagerInternal mPmInternal;
@@ -143,27 +146,38 @@
     private final SparseArray<ArrayMap<GrantUri, UriPermission>>
             mGrantedUriPermissions = new SparseArray<>();
 
-    private UriGrantsManagerService(Context context) {
-        mContext = context;
+    private UriGrantsManagerService() {
+        this(SystemServiceManager.ensureSystemDir());
+    }
+
+    private UriGrantsManagerService(File systemDir) {
         mH = new H(IoThread.get().getLooper());
-        final File systemDir = SystemServiceManager.ensureSystemDir();
         mGrantFile = new AtomicFile(new File(systemDir, "urigrants.xml"), "uri-grants");
     }
 
+    @VisibleForTesting
+    static UriGrantsManagerService createForTest(File systemDir) {
+        final UriGrantsManagerService service = new UriGrantsManagerService(systemDir);
+        service.mAmInternal = LocalServices.getService(ActivityManagerInternal.class);
+        service.mPmInternal = LocalServices.getService(PackageManagerInternal.class);
+        return service;
+    }
+
+    @VisibleForTesting
+    UriGrantsManagerInternal getLocalService() {
+        return new LocalService();
+    }
+
     private void start() {
         LocalServices.addService(UriGrantsManagerInternal.class, new LocalService());
     }
 
-    void onActivityManagerInternalAdded() {
-        mAmInternal = LocalServices.getService(ActivityManagerInternal.class);
-    }
-
     public static final class Lifecycle extends SystemService {
         private final UriGrantsManagerService mService;
 
         public Lifecycle(Context context) {
             super(context);
-            mService = new UriGrantsManagerService(context);
+            mService = new UriGrantsManagerService();
         }
 
         @Override
@@ -172,11 +186,27 @@
             mService.start();
         }
 
+        @Override
+        public void onBootPhase(int phase) {
+            if (phase == PHASE_SYSTEM_SERVICES_READY) {
+                mService.mAmInternal = LocalServices.getService(ActivityManagerInternal.class);
+                mService.mPmInternal = LocalServices.getService(PackageManagerInternal.class);
+            }
+        }
+
         public UriGrantsManagerService getService() {
             return mService;
         }
     }
 
+    private int checkUidPermission(String permission, int uid) {
+        try {
+            return AppGlobals.getPackageManager().checkUidPermission(permission, uid);
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
     /**
      * @param uri This uri must NOT contain an embedded userId.
      * @param sourceUserId The userId in which the uri is to be resolved.
@@ -207,7 +237,7 @@
                 throw new IllegalArgumentException("null uri");
             }
 
-            grantUriPermission(fromUid, targetPkg, new GrantUri(sourceUserId, uri, false),
+            grantUriPermission(fromUid, targetPkg, new GrantUri(sourceUserId, uri, modeFlags),
                     modeFlags, owner, targetUserId);
         }
     }
@@ -220,16 +250,12 @@
 
         final int callingUid = Binder.getCallingUid();
         final int callingUserId = UserHandle.getUserId(callingUid);
-        final IPackageManager pm = AppGlobals.getPackageManager();
-        try {
-            final int packageUid = pm.getPackageUid(packageName,
-                    MATCH_DIRECT_BOOT_AWARE | MATCH_DIRECT_BOOT_UNAWARE, callingUserId);
-            if (packageUid != callingUid) {
-                throw new SecurityException(
-                        "Package " + packageName + " does not belong to calling UID " + callingUid);
-            }
-        } catch (RemoteException e) {
-            throw new SecurityException("Failed to verify package name ownership");
+        final PackageManagerInternal pm = LocalServices.getService(PackageManagerInternal.class);
+        final int packageUid = pm.getPackageUidInternal(packageName,
+                MATCH_DIRECT_BOOT_AWARE | MATCH_DIRECT_BOOT_UNAWARE, callingUserId);
+        if (packageUid != callingUid) {
+            throw new SecurityException(
+                    "Package " + packageName + " does not belong to calling UID " + callingUid);
         }
 
         final ArrayList<android.content.UriPermission> result = Lists.newArrayList();
@@ -303,7 +329,7 @@
         if (toPackage != null) {
             mAmInternal.enforceCallingPermission(FORCE_PERSISTABLE_URI_PERMISSIONS,
                     "takePersistableUriPermission");
-            uid = getPmInternal().getPackageUid(toPackage, 0, userId);
+            uid = mPmInternal.getPackageUidInternal(toPackage, 0, userId);
         } else {
             enforceNotIsolatedCaller("takePersistableUriPermission");
             uid = Binder.getCallingUid();
@@ -314,11 +340,11 @@
 
         synchronized (mLock) {
             boolean persistChanged = false;
-            GrantUri grantUri = new GrantUri(userId, uri, false);
 
-            UriPermission exactPerm = findUriPermissionLocked(uid, grantUri);
+            UriPermission exactPerm = findUriPermissionLocked(uid,
+                    new GrantUri(userId, uri, 0));
             UriPermission prefixPerm = findUriPermissionLocked(uid,
-                    new GrantUri(userId, uri, true));
+                    new GrantUri(userId, uri, FLAG_GRANT_PREFIX_URI_PERMISSION));
 
             final boolean exactValid = (exactPerm != null)
                     && ((modeFlags & exactPerm.persistableModeFlags) == modeFlags);
@@ -327,7 +353,7 @@
 
             if (!(exactValid || prefixValid)) {
                 throw new SecurityException("No persistable permission grants found for UID "
-                        + uid + " and Uri " + grantUri.toSafeString());
+                        + uid + " and Uri " + uri.toSafeString());
             }
 
             if (exactValid) {
@@ -368,7 +394,7 @@
         if (toPackage != null) {
             mAmInternal.enforceCallingPermission(FORCE_PERSISTABLE_URI_PERMISSIONS,
                     "releasePersistableUriPermission");
-            uid = getPmInternal().getPackageUid(toPackage, 0, userId);
+            uid = mPmInternal.getPackageUidInternal(toPackage, 0, userId);
         } else {
             enforceNotIsolatedCaller("releasePersistableUriPermission");
             uid = Binder.getCallingUid();
@@ -381,9 +407,9 @@
             boolean persistChanged = false;
 
             UriPermission exactPerm = findUriPermissionLocked(uid,
-                    new GrantUri(userId, uri, false));
+                    new GrantUri(userId, uri, 0));
             UriPermission prefixPerm = findUriPermissionLocked(uid,
-                    new GrantUri(userId, uri, true));
+                    new GrantUri(userId, uri, FLAG_GRANT_PREFIX_URI_PERMISSION));
             if (exactPerm == null && prefixPerm == null && toPackage == null) {
                 throw new SecurityException("No permission grants found for UID " + uid
                         + " and Uri " + uri.toSafeString());
@@ -559,16 +585,12 @@
         if (contentUserHint == UserHandle.USER_CURRENT) {
             contentUserHint = UserHandle.getUserId(callingUid);
         }
-        final IPackageManager pm = AppGlobals.getPackageManager();
         int targetUid;
         if (needed != null) {
             targetUid = needed.targetUid;
         } else {
-            try {
-                targetUid = pm.getPackageUid(targetPkg, MATCH_DEBUG_TRIAGED_MISSING, targetUserId);
-            } catch (RemoteException ex) {
-                return null;
-            }
+            targetUid = mPmInternal.getPackageUidInternal(targetPkg, MATCH_DEBUG_TRIAGED_MISSING,
+                    targetUserId);
             if (targetUid < 0) {
                 if (DEBUG) Slog.v(TAG, "Can't grant URI permission no uid for: " + targetPkg
                         + " on user " + targetUserId);
@@ -576,27 +598,27 @@
             }
         }
         if (data != null) {
-            GrantUri grantUri = GrantUri.resolve(contentUserHint, data);
+            GrantUri grantUri = GrantUri.resolve(contentUserHint, data, mode);
             targetUid = checkGrantUriPermission(callingUid, targetPkg, grantUri, mode, targetUid);
             if (targetUid > 0) {
                 if (needed == null) {
                     needed = new NeededUriGrants(targetPkg, targetUid, mode);
                 }
-                needed.add(grantUri);
+                needed.uris.add(grantUri);
             }
         }
         if (clip != null) {
             for (int i=0; i<clip.getItemCount(); i++) {
                 Uri uri = clip.getItemAt(i).getUri();
                 if (uri != null) {
-                    GrantUri grantUri = GrantUri.resolve(contentUserHint, uri);
+                    GrantUri grantUri = GrantUri.resolve(contentUserHint, uri, mode);
                     targetUid = checkGrantUriPermission(callingUid, targetPkg,
                             grantUri, mode, targetUid);
                     if (targetUid > 0) {
                         if (needed == null) {
                             needed = new NeededUriGrants(targetPkg, targetUid, mode);
                         }
-                        needed.add(grantUri);
+                        needed.uris.add(grantUri);
                     }
                 } else {
                     Intent clipIntent = clip.getItemAt(i).getIntent();
@@ -666,16 +688,13 @@
                         final ProviderInfo pi = getProviderInfo(uri.getAuthority(), sourceUserId,
                                 MATCH_DIRECT_BOOT_AWARE | MATCH_DIRECT_BOOT_UNAWARE);
                         if (pi != null && sourcePkg.equals(pi.packageName)) {
-                            int targetUid = -1;
-                            try {
-                                targetUid = AppGlobals.getPackageManager().getPackageUid(
+                            int targetUid = mPmInternal.getPackageUidInternal(
                                         targetPkg, MATCH_UNINSTALLED_PACKAGES, targetUserId);
-                            } catch (RemoteException e) {
-                            }
                             if (targetUid != -1) {
+                                final GrantUri grantUri = new GrantUri(sourceUserId, uri,
+                                        prefix ? Intent.FLAG_GRANT_PREFIX_URI_PERMISSION : 0);
                                 final UriPermission perm = findOrCreateUriPermission(
-                                        sourcePkg, targetPkg, targetUid,
-                                        new GrantUri(sourceUserId, uri, prefix));
+                                        sourcePkg, targetPkg, targetUid, grantUri);
                                 perm.initPersistedModes(modeFlags, createdTime);
                             }
                         } else {
@@ -733,13 +752,10 @@
             return;
         }
 
-        if ((modeFlags & Intent.FLAG_GRANT_PREFIX_URI_PERMISSION) != 0) {
-            grantUri.prefix = true;
-        }
         final UriPermission perm = findOrCreateUriPermission(
                 pi.packageName, targetPkg, targetUid, grantUri);
         perm.grantModes(modeFlags, owner);
-        getPmInternal().grantImplicitAccess(UserHandle.getUserId(targetUid), null,
+        mPmInternal.grantImplicitAccess(UserHandle.getUserId(targetUid), null,
                 UserHandle.getAppId(targetUid), pi.applicationInfo.uid, false /*direct*/);
     }
 
@@ -748,10 +764,10 @@
         if (needed == null) {
             return;
         }
-        for (int i=0; i<needed.size(); i++) {
-            GrantUri grantUri = needed.get(i);
+        final int N = needed.uris.size();
+        for (int i = 0; i < N; i++) {
             grantUriPermissionUnchecked(needed.targetUid, needed.targetPkg,
-                    grantUri, needed.flags, owner);
+                    needed.uris.valueAt(i), needed.flags, owner);
         }
     }
 
@@ -760,13 +776,8 @@
         if (targetPkg == null) {
             throw new NullPointerException("targetPkg");
         }
-        int targetUid;
-        final IPackageManager pm = AppGlobals.getPackageManager();
-        try {
-            targetUid = pm.getPackageUid(targetPkg, MATCH_DEBUG_TRIAGED_MISSING, targetUserId);
-        } catch (RemoteException ex) {
-            return;
-        }
+        int targetUid = mPmInternal.getPackageUidInternal(targetPkg, MATCH_DEBUG_TRIAGED_MISSING,
+                targetUserId);
 
         targetUid = checkGrantUriPermission(callingUid, targetPkg, grantUri, modeFlags, targetUid);
         if (targetUid < 0) {
@@ -780,7 +791,6 @@
             final int modeFlags) {
         if (DEBUG) Slog.v(TAG, "Revoking all granted permissions to " + grantUri);
 
-        final IPackageManager pm = AppGlobals.getPackageManager();
         final String authority = grantUri.uri.getAuthority();
         final ProviderInfo pi = getProviderInfo(authority, grantUri.sourceUserId,
                 MATCH_DIRECT_BOOT_AWARE | MATCH_DIRECT_BOOT_UNAWARE);
@@ -791,7 +801,7 @@
         }
 
         // Does the caller have this permission on the URI?
-        if (!checkHoldingPermissions(pm, pi, grantUri, callingUid, modeFlags)) {
+        if (!checkHoldingPermissions(pi, grantUri, callingUid, modeFlags)) {
             // If they don't have direct access to the URI, then revoke any
             // ownerless URI permissions that have been granted to them.
             final ArrayMap<GrantUri, UriPermission> perms = mGrantedUriPermissions.get(callingUid);
@@ -864,7 +874,7 @@
      * in {@link ContentProvider}.
      */
     private boolean checkHoldingPermissions(
-            IPackageManager pm, ProviderInfo pi, GrantUri grantUri, int uid, final int modeFlags) {
+            ProviderInfo pi, GrantUri grantUri, int uid, final int modeFlags) {
         if (DEBUG) Slog.v(TAG, "checkHoldingPermissions: uri=" + grantUri + " uid=" + uid);
         if (UserHandle.getUserId(uid) != grantUri.sourceUserId) {
             if (ActivityManager.checkComponentPermission(INTERACT_ACROSS_USERS, uid, -1, true)
@@ -872,10 +882,10 @@
                 return false;
             }
         }
-        return checkHoldingPermissionsInternal(pm, pi, grantUri, uid, modeFlags, true);
+        return checkHoldingPermissionsInternal(pi, grantUri, uid, modeFlags, true);
     }
 
-    private boolean checkHoldingPermissionsInternal(IPackageManager pm, ProviderInfo pi,
+    private boolean checkHoldingPermissionsInternal(ProviderInfo pi,
             GrantUri grantUri, int uid, final int modeFlags, boolean considerUidPermissions) {
         if (pi.applicationInfo.uid == uid) {
             return true;
@@ -885,74 +895,70 @@
 
         boolean readMet = (modeFlags & Intent.FLAG_GRANT_READ_URI_PERMISSION) == 0;
         boolean writeMet = (modeFlags & Intent.FLAG_GRANT_WRITE_URI_PERMISSION) == 0;
-        try {
-            // check if target holds top-level <provider> permissions
-            if (!readMet && pi.readPermission != null && considerUidPermissions
-                    && (pm.checkUidPermission(pi.readPermission, uid) == PERMISSION_GRANTED)) {
-                readMet = true;
-            }
-            if (!writeMet && pi.writePermission != null && considerUidPermissions
-                    && (pm.checkUidPermission(pi.writePermission, uid) == PERMISSION_GRANTED)) {
-                writeMet = true;
-            }
 
-            // track if unprotected read/write is allowed; any denied
-            // <path-permission> below removes this ability
-            boolean allowDefaultRead = pi.readPermission == null;
-            boolean allowDefaultWrite = pi.writePermission == null;
+        // check if target holds top-level <provider> permissions
+        if (!readMet && pi.readPermission != null && considerUidPermissions
+                && (checkUidPermission(pi.readPermission, uid) == PERMISSION_GRANTED)) {
+            readMet = true;
+        }
+        if (!writeMet && pi.writePermission != null && considerUidPermissions
+                && (checkUidPermission(pi.writePermission, uid) == PERMISSION_GRANTED)) {
+            writeMet = true;
+        }
 
-            // check if target holds any <path-permission> that match uri
-            final PathPermission[] pps = pi.pathPermissions;
-            if (pps != null) {
-                final String path = grantUri.uri.getPath();
-                int i = pps.length;
-                while (i > 0 && (!readMet || !writeMet)) {
-                    i--;
-                    PathPermission pp = pps[i];
-                    if (pp.match(path)) {
-                        if (!readMet) {
-                            final String pprperm = pp.getReadPermission();
-                            if (DEBUG) Slog.v(TAG,
-                                    "Checking read perm for " + pprperm + " for " + pp.getPath()
-                                            + ": match=" + pp.match(path)
-                                            + " check=" + pm.checkUidPermission(pprperm, uid));
-                            if (pprperm != null) {
-                                if (considerUidPermissions && pm.checkUidPermission(pprperm, uid)
-                                        == PERMISSION_GRANTED) {
-                                    readMet = true;
-                                } else {
-                                    allowDefaultRead = false;
-                                }
+        // track if unprotected read/write is allowed; any denied
+        // <path-permission> below removes this ability
+        boolean allowDefaultRead = pi.readPermission == null;
+        boolean allowDefaultWrite = pi.writePermission == null;
+
+        // check if target holds any <path-permission> that match uri
+        final PathPermission[] pps = pi.pathPermissions;
+        if (pps != null) {
+            final String path = grantUri.uri.getPath();
+            int i = pps.length;
+            while (i > 0 && (!readMet || !writeMet)) {
+                i--;
+                PathPermission pp = pps[i];
+                if (pp.match(path)) {
+                    if (!readMet) {
+                        final String pprperm = pp.getReadPermission();
+                        if (DEBUG) Slog.v(TAG,
+                                "Checking read perm for " + pprperm + " for " + pp.getPath()
+                                        + ": match=" + pp.match(path)
+                                        + " check=" + checkUidPermission(pprperm, uid));
+                        if (pprperm != null) {
+                            if (considerUidPermissions && checkUidPermission(pprperm, uid)
+                                    == PERMISSION_GRANTED) {
+                                readMet = true;
+                            } else {
+                                allowDefaultRead = false;
                             }
                         }
-                        if (!writeMet) {
-                            final String ppwperm = pp.getWritePermission();
-                            if (DEBUG) Slog.v(TAG,
-                                    "Checking write perm " + ppwperm + " for " + pp.getPath()
-                                            + ": match=" + pp.match(path)
-                                            + " check=" + pm.checkUidPermission(ppwperm, uid));
-                            if (ppwperm != null) {
-                                if (considerUidPermissions && pm.checkUidPermission(ppwperm, uid)
-                                        == PERMISSION_GRANTED) {
-                                    writeMet = true;
-                                } else {
-                                    allowDefaultWrite = false;
-                                }
+                    }
+                    if (!writeMet) {
+                        final String ppwperm = pp.getWritePermission();
+                        if (DEBUG) Slog.v(TAG,
+                                "Checking write perm " + ppwperm + " for " + pp.getPath()
+                                        + ": match=" + pp.match(path)
+                                        + " check=" + checkUidPermission(ppwperm, uid));
+                        if (ppwperm != null) {
+                            if (considerUidPermissions && checkUidPermission(ppwperm, uid)
+                                    == PERMISSION_GRANTED) {
+                                writeMet = true;
+                            } else {
+                                allowDefaultWrite = false;
                             }
                         }
                     }
                 }
             }
-
-            // grant unprotected <provider> read/write, if not blocked by
-            // <path-permission> above
-            if (allowDefaultRead) readMet = true;
-            if (allowDefaultWrite) writeMet = true;
-
-        } catch (RemoteException e) {
-            return false;
         }
 
+        // grant unprotected <provider> read/write, if not blocked by
+        // <path-permission> above
+        if (allowDefaultRead) readMet = true;
+        if (allowDefaultWrite) writeMet = true;
+
         // If this provider says that grants are always required, we need to
         // consult it directly to determine if the UID has permission
         final boolean forceMet;
@@ -1013,14 +1019,8 @@
     }
 
     private ProviderInfo getProviderInfo(String authority, int userHandle, int pmFlags) {
-        ProviderInfo pi = null;
-        try {
-            pi = AppGlobals.getPackageManager().resolveContentProvider(
-                    authority, PackageManager.GET_URI_PERMISSION_PATTERNS | pmFlags,
-                    userHandle);
-        } catch (RemoteException ex) {
-        }
-        return pi;
+        return mPmInternal.resolveContentProvider(authority,
+                PackageManager.GET_URI_PERMISSION_PATTERNS | pmFlags, userHandle);
     }
 
     /**
@@ -1033,7 +1033,7 @@
      * lastTargetUid else set that to -1.
      */
     int checkGrantUriPermission(int callingUid, String targetPkg, GrantUri grantUri,
-            final int modeFlags, int lastTargetUid) {
+            int modeFlags, int lastTargetUid) {
         if (!Intent.isAccessUriMode(modeFlags)) {
             return -1;
         }
@@ -1042,8 +1042,6 @@
             if (DEBUG) Slog.v(TAG, "Checking grant " + targetPkg + " permission to " + grantUri);
         }
 
-        final IPackageManager pm = AppGlobals.getPackageManager();
-
         // If this is not a content: uri, we can't do anything with it.
         if (!ContentResolver.SCHEME_CONTENT.equals(grantUri.uri.getScheme())) {
             if (DEBUG) Slog.v(TAG, "Can't grant URI permission for non-content URI: " + grantUri);
@@ -1079,39 +1077,22 @@
 
         int targetUid = lastTargetUid;
         if (targetUid < 0 && targetPkg != null) {
-            try {
-                targetUid = pm.getPackageUid(targetPkg, MATCH_DEBUG_TRIAGED_MISSING,
-                        UserHandle.getUserId(callingUid));
-                if (targetUid < 0) {
-                    if (DEBUG) Slog.v(TAG, "Can't grant URI permission no uid for: " + targetPkg);
-                    return -1;
-                }
-            } catch (RemoteException ex) {
+            targetUid = mPmInternal.getPackageUidInternal(targetPkg, MATCH_DEBUG_TRIAGED_MISSING,
+                    UserHandle.getUserId(callingUid));
+            if (targetUid < 0) {
+                if (DEBUG) Slog.v(TAG, "Can't grant URI permission no uid for: " + targetPkg);
                 return -1;
             }
         }
 
-        // Figure out the value returned when access is allowed
-        final int allowedResult;
-        if ((modeFlags & Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION) != 0
-                || pi.forceUriPermissions) {
-            // If we're extending a persistable grant or need to force, then we need to return
-            // "targetUid" so that we always create a grant data structure to
-            // support take/release APIs
-            allowedResult = targetUid;
-        } else {
-            // Otherwise, we can return "-1" to indicate that no grant data
-            // structures need to be created
-            allowedResult = -1;
-        }
-
+        boolean targetHoldsPermission = false;
         if (targetUid >= 0) {
             // First...  does the target actually need this permission?
-            if (checkHoldingPermissions(pm, pi, grantUri, targetUid, modeFlags)) {
+            if (checkHoldingPermissions(pi, grantUri, targetUid, modeFlags)) {
                 // No need to grant the target this permission.
                 if (DEBUG) Slog.v(TAG,
                         "Target " + targetPkg + " already has full permission to " + grantUri);
-                return allowedResult;
+                targetHoldsPermission = true;
             }
         } else {
             // First...  there is no target package, so can anyone access it?
@@ -1145,9 +1126,25 @@
                     }
                 }
             }
-            if (allowed) {
-                return allowedResult;
+            if (pi.forceUriPermissions) {
+                // When provider requires dynamic permission checks, the only
+                // way to be safe is to issue permission grants for each item by
+                // assuming no generic access
+                allowed = false;
             }
+            if (allowed) {
+                targetHoldsPermission = true;
+            }
+        }
+
+        final boolean basicGrant = (modeFlags & ~(FLAG_GRANT_READ_URI_PERMISSION
+                | FLAG_GRANT_WRITE_URI_PERMISSION)) == 0;
+        if (basicGrant && targetHoldsPermission) {
+            // When caller holds permission, and this is a simple permission
+            // grant, we can skip generating any bookkeeping; when any advanced
+            // features have been requested, we proceed below to make sure the
+            // provider supports granting permissions
+            return -1;
         }
 
         /* There is a special cross user grant if:
@@ -1158,38 +1155,42 @@
          */
         boolean specialCrossUserGrant = targetUid >= 0
                 && UserHandle.getUserId(targetUid) != grantUri.sourceUserId
-                && checkHoldingPermissionsInternal(pm, pi, grantUri, callingUid,
+                && checkHoldingPermissionsInternal(pi, grantUri, callingUid,
                 modeFlags, false /*without considering the uid permissions*/);
 
         // Second...  is the provider allowing granting of URI permissions?
-        if (!specialCrossUserGrant) {
-            if (!pi.grantUriPermissions) {
+        boolean grantAllowed = pi.grantUriPermissions;
+        if (!ArrayUtils.isEmpty(pi.uriPermissionPatterns)) {
+            final int N = pi.uriPermissionPatterns.length;
+            grantAllowed = false;
+            for (int i = 0; i < N; i++) {
+                if (pi.uriPermissionPatterns[i] != null
+                        && pi.uriPermissionPatterns[i].match(grantUri.uri.getPath())) {
+                    grantAllowed = true;
+                    break;
+                }
+            }
+        }
+        if (!grantAllowed) {
+            if (specialCrossUserGrant) {
+                // We're only okay issuing basic grant access across user
+                // boundaries; advanced flags are blocked here
+                if (!basicGrant) {
+                    throw new SecurityException("Provider " + pi.packageName
+                            + "/" + pi.name
+                            + " does not allow granting of advanced Uri permissions (uri "
+                            + grantUri + ")");
+                }
+            } else {
                 throw new SecurityException("Provider " + pi.packageName
                         + "/" + pi.name
                         + " does not allow granting of Uri permissions (uri "
                         + grantUri + ")");
             }
-            if (pi.uriPermissionPatterns != null) {
-                final int N = pi.uriPermissionPatterns.length;
-                boolean allowed = false;
-                for (int i=0; i<N; i++) {
-                    if (pi.uriPermissionPatterns[i] != null
-                            && pi.uriPermissionPatterns[i].match(grantUri.uri.getPath())) {
-                        allowed = true;
-                        break;
-                    }
-                }
-                if (!allowed) {
-                    throw new SecurityException("Provider " + pi.packageName
-                            + "/" + pi.name
-                            + " does not allow granting of permission to path of Uri "
-                            + grantUri);
-                }
-            }
         }
 
         // Third...  does the caller itself have permission to access this uri?
-        if (!checkHoldingPermissions(pm, pi, grantUri, callingUid, modeFlags)) {
+        if (!checkHoldingPermissions(pi, grantUri, callingUid, modeFlags)) {
             // Require they hold a strong enough Uri permission
             if (!checkUriPermission(grantUri, callingUid, modeFlags)) {
                 if (android.Manifest.permission.MANAGE_DOCUMENTS.equals(pi.readPermission)) {
@@ -1203,6 +1204,7 @@
                 }
             }
         }
+
         return targetUid;
     }
 
@@ -1212,7 +1214,7 @@
     int checkGrantUriPermission(int callingUid, String targetPkg, Uri uri, int modeFlags,
             int userId) {
         return checkGrantUriPermission(callingUid, targetPkg,
-                new GrantUri(userId, uri, false), modeFlags, -1);
+                new GrantUri(userId, uri, modeFlags), modeFlags, -1);
     }
 
     boolean checkUriPermission(GrantUri grantUri, int uid, final int modeFlags) {
@@ -1297,14 +1299,6 @@
         }
     }
 
-    private PackageManagerInternal getPmInternal() {
-        // Don't need to synchonize; worst-case scenario LocalServices will be called twice.
-        if (mPmInternal == null) {
-            mPmInternal = LocalServices.getService(PackageManagerInternal.class);
-        }
-        return mPmInternal;
-    }
-
     final class H extends Handler {
         static final int PERSIST_URI_GRANTS_MSG = 1;
 
@@ -1324,7 +1318,6 @@
     }
 
     final class LocalService implements UriGrantsManagerInternal {
-
         @Override
         public void removeUriPermissionIfNeeded(UriPermission perm) {
             synchronized (mLock) {
@@ -1419,13 +1412,6 @@
         }
 
         @Override
-        public void onActivityManagerInternalAdded() {
-            synchronized (mLock) {
-                UriGrantsManagerService.this.onActivityManagerInternalAdded();
-            }
-        }
-
-        @Override
         public IBinder newUriPermissionOwner(String name) {
             enforceNotIsolatedCaller("newUriPermissionOwner");
             synchronized(mLock) {
@@ -1454,8 +1440,7 @@
                 if (uri == null) {
                     owner.removeUriPermissions(mode);
                 } else {
-                    final boolean prefix = (mode & Intent.FLAG_GRANT_PREFIX_URI_PERMISSION) != 0;
-                    owner.removeUriPermission(new GrantUri(userId, uri, prefix), mode);
+                    owner.removeUriPermission(new GrantUri(userId, uri, mode), mode);
                 }
             }
         }
@@ -1478,12 +1463,7 @@
                     boolean printed = false;
                     int dumpUid = -2;
                     if (dumpPackage != null) {
-                        try {
-                            dumpUid = mContext.getPackageManager().getPackageUidAsUser(dumpPackage,
-                                    MATCH_ANY_USER, 0);
-                        } catch (PackageManager.NameNotFoundException e) {
-                            dumpUid = -1;
-                        }
+                        dumpUid = mPmInternal.getPackageUidInternal(dumpPackage, MATCH_ANY_USER, 0);
                     }
                     for (int i = 0; i < mGrantedUriPermissions.size(); i++) {
                         int uid = mGrantedUriPermissions.keyAt(i);
diff --git a/services/core/java/com/android/server/uri/UriPermission.java b/services/core/java/com/android/server/uri/UriPermission.java
index bd6348a..6db781a 100644
--- a/services/core/java/com/android/server/uri/UriPermission.java
+++ b/services/core/java/com/android/server/uri/UriPermission.java
@@ -16,6 +16,7 @@
 
 package com.android.server.uri;
 
+import android.annotation.Nullable;
 import android.app.GrantedUriPermission;
 import android.content.Intent;
 import android.os.Binder;
@@ -79,7 +80,7 @@
      */
     long persistedCreateTime = INVALID_TIME;
 
-    private static final long INVALID_TIME = Long.MIN_VALUE;
+    static final long INVALID_TIME = Long.MIN_VALUE;
 
     private ArraySet<UriPermissionOwner> mReadOwners;
     private ArraySet<UriPermissionOwner> mWriteOwners;
@@ -96,7 +97,7 @@
 
     private void updateModeFlags() {
         final int oldModeFlags = modeFlags;
-        modeFlags = ownedModeFlags | globalModeFlags | persistableModeFlags | persistedModeFlags;
+        modeFlags = ownedModeFlags | globalModeFlags | persistedModeFlags;
 
         if (Log.isLoggable(TAG, Log.VERBOSE) && (modeFlags != oldModeFlags)) {
             Slog.d(TAG,
@@ -123,7 +124,7 @@
         updateModeFlags();
     }
 
-    void grantModes(int modeFlags, UriPermissionOwner owner) {
+    boolean grantModes(int modeFlags, @Nullable UriPermissionOwner owner) {
         final boolean persistable = (modeFlags & Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION) != 0;
         modeFlags &= (Intent.FLAG_GRANT_READ_URI_PERMISSION
                 | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
@@ -144,6 +145,7 @@
         }
 
         updateModeFlags();
+        return false;
     }
 
     /**
@@ -176,8 +178,6 @@
                 | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
 
         final int before = persistedModeFlags;
-
-        persistableModeFlags &= ~modeFlags;
         persistedModeFlags &= ~modeFlags;
 
         if (persistedModeFlags == 0) {
diff --git a/services/core/java/com/android/server/uri/UriPermissionOwner.java b/services/core/java/com/android/server/uri/UriPermissionOwner.java
index f2c06cd..2b404a4 100644
--- a/services/core/java/com/android/server/uri/UriPermissionOwner.java
+++ b/services/core/java/com/android/server/uri/UriPermissionOwner.java
@@ -25,6 +25,7 @@
 import android.util.proto.ProtoOutputStream;
 
 import com.android.server.am.UriPermissionOwnerProto;
+
 import com.google.android.collect.Sets;
 
 import java.io.PrintWriter;
diff --git a/services/core/java/com/android/server/wm/AccessibilityController.java b/services/core/java/com/android/server/wm/AccessibilityController.java
index 68224b5..785ca90 100644
--- a/services/core/java/com/android/server/wm/AccessibilityController.java
+++ b/services/core/java/com/android/server/wm/AccessibilityController.java
@@ -16,6 +16,7 @@
 
 package com.android.server.wm;
 
+import static android.view.InsetsState.ITYPE_NAVIGATION_BAR;
 import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_IS_ROUNDED_CORNERS_OVERLAY;
 import static android.view.WindowManager.LayoutParams.TYPE_DOCK_DIVIDER;
 import static android.view.WindowManager.LayoutParams.TYPE_MAGNIFICATION_OVERLAY;
@@ -44,10 +45,12 @@
 import android.os.Looper;
 import android.os.Message;
 import android.util.ArraySet;
+import android.util.IntArray;
 import android.util.Slog;
 import android.util.SparseArray;
 import android.util.TypedValue;
 import android.view.Display;
+import android.view.InsetsState;
 import android.view.MagnificationSpec;
 import android.view.Surface;
 import android.view.Surface.OutOfResourcesException;
@@ -64,6 +67,7 @@
 import com.android.server.wm.WindowManagerInternal.MagnificationCallbacks;
 import com.android.server.wm.WindowManagerInternal.WindowsForAccessibilityCallback;
 
+import java.io.PrintWriter;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
@@ -125,14 +129,13 @@
      */
     public boolean setWindowsForAccessibilityCallbackLocked(int displayId,
             WindowsForAccessibilityCallback callback) {
-        if (callback != null) {
-            final DisplayContent dc = mService.mRoot.getDisplayContentOrCreate(displayId);
-            if (dc == null) {
-                return false;
-            }
+        final DisplayContent dc = mService.mRoot.getDisplayContentOrCreate(displayId);
+        if (dc == null) {
+            return false;
+        }
 
-            final Display display = dc.getDisplay();
-            if (display.getType() == Display.TYPE_VIRTUAL && dc.getParentWindow() != null) {
+        if (callback != null) {
+            if (isEmbeddedDisplay(dc)) {
                 // If this display is an embedded one, its window observer should have been set from
                 // window manager after setting its parent window. But if its window observer is
                 // empty, that means this mapping didn't be set, and needs to do this again.
@@ -149,13 +152,22 @@
             mWindowsForAccessibilityObserver.put(displayId,
                     new WindowsForAccessibilityObserver(mService, displayId, callback));
         } else {
+            if (isEmbeddedDisplay(dc)) {
+                // If this display is an embedded one, its window observer should be removed along
+                // with the window observer of its parent display removed because the window
+                // observer of the embedded display and its parent display is the same, and would
+                // be removed together when stopping the window tracking of its parent display. So
+                // here don't need to do removing window observer of the embedded display again.
+                return true;
+            }
             final WindowsForAccessibilityObserver windowsForA11yObserver =
                     mWindowsForAccessibilityObserver.get(displayId);
-            if  (windowsForA11yObserver == null) {
+            if (windowsForA11yObserver == null) {
                 throw new IllegalStateException(
                         "Windows for accessibility callback of display " + displayId
                                 + " already cleared!");
             }
+            removeObserverOfEmbeddedDisplay(windowsForA11yObserver);
             mWindowsForAccessibilityObserver.remove(displayId);
         }
         return true;
@@ -329,6 +341,7 @@
                 mWindowsForAccessibilityObserver.get(parentDisplayId);
 
         if (windowsForA11yObserver != null) {
+            windowsForA11yObserver.addEmbeddedDisplay(embeddedDisplayId);
             // Replaces the observer of embedded display to the one of parent display
             mWindowsForAccessibilityObserver.put(embeddedDisplayId, windowsForA11yObserver);
         }
@@ -339,6 +352,33 @@
         windowState.getTransformationMatrix(sTempFloats, outMatrix);
     }
 
+    void dump(PrintWriter pw, String prefix) {
+        for (int i = 0; i < mDisplayMagnifiers.size(); i++) {
+            final DisplayMagnifier displayMagnifier = mDisplayMagnifiers.valueAt(i);
+            if (displayMagnifier != null) {
+                displayMagnifier.dump(pw, prefix
+                        + "Magnification display# " + mDisplayMagnifiers.keyAt(i));
+            }
+        }
+    }
+
+    private void removeObserverOfEmbeddedDisplay(WindowsForAccessibilityObserver
+            observerOfParentDisplay) {
+        final IntArray embeddedDisplayIdList =
+                observerOfParentDisplay.getAndClearEmbeddedDisplayIdList();
+
+        for (int index = 0; index < embeddedDisplayIdList.size(); index++) {
+            final int embeddedDisplayId = embeddedDisplayIdList.get(index);
+            mWindowsForAccessibilityObserver.remove(embeddedDisplayId);
+        }
+    }
+
+    private static boolean isEmbeddedDisplay(DisplayContent dc) {
+        final Display display = dc.getDisplay();
+
+        return display.getType() == Display.TYPE_VIRTUAL && dc.getParentWindow() != null;
+    }
+
     /**
      * This class encapsulates the functionality related to display magnification.
      */
@@ -549,6 +589,10 @@
             mMagnifedViewport.drawWindowIfNeededLocked(t);
         }
 
+        void dump(PrintWriter pw, String prefix) {
+            mMagnifedViewport.dump(pw, prefix);
+        }
+
         private final class MagnifiedViewport {
 
             private final SparseArray<WindowState> mTempWindowStates =
@@ -672,6 +716,15 @@
                         availableBounds.op(windowBounds, Region.Op.DIFFERENCE);
                     }
 
+                    // If the navigation bar window doesn't have touchable region, count
+                    // navigation bar insets into nonMagnifiedBounds. It happens when
+                    // navigation mode is gestural.
+                    if (isUntouchableNavigationBar(windowState, mTempRegion3)) {
+                        final Rect navBarInsets = getNavBarInsets(mDisplayContent);
+                        nonMagnifiedBounds.op(navBarInsets, Region.Op.UNION);
+                        availableBounds.op(navBarInsets, Region.Op.DIFFERENCE);
+                    }
+
                     // Count letterbox into nonMagnifiedBounds
                     if (windowState.isLetterboxedForDisplayCutoutLw()) {
                         Region letterboxBounds = getLetterboxBounds(windowState);
@@ -715,8 +768,7 @@
                     } else {
                         final Region dirtyRegion = mTempRegion3;
                         dirtyRegion.set(mMagnificationRegion);
-                        dirtyRegion.op(mOldMagnificationRegion, Region.Op.UNION);
-                        dirtyRegion.op(nonMagnifiedBounds, Region.Op.INTERSECT);
+                        dirtyRegion.op(mOldMagnificationRegion, Region.Op.XOR);
                         dirtyRegion.getBounds(dirtyRect);
                         mWindow.invalidate(dirtyRect);
                     }
@@ -810,6 +862,10 @@
                 }, false /* traverseTopToBottom */ );
             }
 
+            void dump(PrintWriter pw, String prefix) {
+                mWindow.dump(pw, prefix);
+            }
+
             private final class ViewportWindow {
                 private static final String SURFACE_TITLE = "Magnification Overlay";
 
@@ -975,6 +1031,14 @@
                     mSurface.release();
                 }
 
+                void dump(PrintWriter pw, String prefix) {
+                    pw.println(prefix
+                            + " mBounds= " + mBounds
+                            + " mDirtyRect= " + mDirtyRect
+                            + " mWidth= " + mSurfaceControl.getWidth()
+                            + " mHeight= " + mSurfaceControl.getHeight());
+                }
+
                 private final class AnimationController extends Handler {
                     private static final String PROPERTY_NAME_ALPHA = "alpha";
 
@@ -1089,6 +1153,24 @@
         }
     }
 
+    static boolean isUntouchableNavigationBar(WindowState windowState,
+            Region touchableRegion) {
+        if (windowState.mAttrs.type != WindowManager.LayoutParams.TYPE_NAVIGATION_BAR) {
+            return false;
+        }
+
+        // Gets the touchable region.
+        windowState.getTouchableRegion(touchableRegion);
+
+        return touchableRegion.isEmpty();
+    }
+
+    static Rect getNavBarInsets(DisplayContent displayContent) {
+        final InsetsState insetsState =
+                displayContent.getInsetsStateController().getRawInsetsState();
+        return insetsState.getSource(ITYPE_NAVIGATION_BAR).getFrame();
+    }
+
     /**
      * This class encapsulates the functionality related to computing the windows
      * reported for accessibility purposes. These windows are all windows a sighted
@@ -1124,6 +1206,8 @@
 
         private final long mRecurringAccessibilityEventsIntervalMillis;
 
+        private final IntArray mEmbeddedDisplayIdList = new IntArray(0);
+
         public WindowsForAccessibilityObserver(WindowManagerService windowManagerService,
                 int displayId,
                 WindowsForAccessibilityCallback callback) {
@@ -1148,6 +1232,21 @@
             }
         }
 
+        IntArray getAndClearEmbeddedDisplayIdList() {
+            final IntArray returnedArray = new IntArray(mEmbeddedDisplayIdList.size());
+            returnedArray.addAll(mEmbeddedDisplayIdList);
+            mEmbeddedDisplayIdList.clear();
+
+            return returnedArray;
+        }
+
+        void addEmbeddedDisplay(int displayId) {
+            if (displayId == mDisplayId) {
+                return;
+            }
+            mEmbeddedDisplayIdList.add(displayId);
+        }
+
         /**
          * Check if windows have changed, and send them to the accessibility subsystem if they have.
          *
@@ -1203,6 +1302,13 @@
                         updateUnaccountedSpace(windowState, regionInScreen, unaccountedSpace,
                                 skipRemainingWindowsForTasks);
                         focusedWindowAdded |= windowState.isFocused();
+                    } else if (isUntouchableNavigationBar(windowState, mTempRegion1)) {
+                        // If this widow is navigation bar without touchable region, accounting the
+                        // region of navigation bar inset because all touch events from this region
+                        // would be received by launcher, i.e. this region is a un-touchable one
+                        // for the application.
+                        unaccountedSpace.op(getNavBarInsets(dc), unaccountedSpace,
+                                Region.Op.REVERSE_DIFFERENCE);
                     }
 
                     if (unaccountedSpace.isEmpty() && focusedWindowAdded) {
@@ -1210,6 +1316,16 @@
                     }
                 }
 
+                for (int i = dc.mShellRoots.size() - 1; i >= 0; --i) {
+                    final WindowInfo info = dc.mShellRoots.valueAt(i).getWindowInfo();
+                    if (info == null) {
+                        continue;
+                    }
+                    info.layer = addedWindows.size();
+                    windows.add(info);
+                    addedWindows.add(info.token);
+                }
+
                 // Remove child/parent references to windows that were not added.
                 final int windowCount = windows.size();
                 for (int i = 0; i < windowCount; i++) {
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java
index aabac77..130da2d 100644
--- a/services/core/java/com/android/server/wm/ActivityRecord.java
+++ b/services/core/java/com/android/server/wm/ActivityRecord.java
@@ -292,6 +292,7 @@
 import android.view.WindowManager;
 import android.view.WindowManager.LayoutParams;
 import android.view.animation.Animation;
+import android.window.WindowContainerToken;
 
 import com.android.internal.R;
 import com.android.internal.annotations.VisibleForTesting;
@@ -432,6 +433,8 @@
     final boolean stateNotNeeded; // As per ActivityInfo.flags
     @VisibleForTesting
     int mHandoverLaunchDisplayId = INVALID_DISPLAY; // Handover launch display id to next activity.
+    @VisibleForTesting
+    TaskDisplayArea mHandoverTaskDisplayArea; // Handover launch task display area.
     private final boolean componentSpecified;  // did caller specify an explicit component?
     final boolean rootVoiceInteraction;  // was this the root activity of a voice interaction?
 
@@ -1185,12 +1188,15 @@
 
         final boolean inPictureInPictureMode = inPinnedWindowingMode() && targetStackBounds != null;
         if (inPictureInPictureMode != mLastReportedPictureInPictureMode || forceUpdate) {
-            // Picture-in-picture mode changes also trigger a multi-window mode change as well, so
-            // update that here in order. Set the last reported MW state to the same as the PiP
-            // state since we haven't yet actually resized the task (these callbacks need to
-            // preceed the configuration change from the resiez.
+            // Picture-in-picture mode change normal triggers also multi-window mode change
+            // except transitions between pip and split screen mode, so update that here in order.
+            // Set the last reported MW state to the same as the PiP state since we haven't yet
+            // actually resized the task (these callbacks need to proceed the configuration change
+            // from the resize).
             // TODO(110009072): Once we move these callbacks to the client, remove all logic related
             // to forcing the update of the picture-in-picture mode as a part of the PiP animation.
+            final boolean shouldScheduleMultiWindowModeChange =
+                    mLastReportedMultiWindowMode != inMultiWindowMode();
             mLastReportedPictureInPictureMode = inPictureInPictureMode;
             mLastReportedMultiWindowMode = inPictureInPictureMode;
             final Configuration newConfig = new Configuration();
@@ -1201,7 +1207,9 @@
                 task.computeConfigResourceOverrides(newConfig, task.getParent().getConfiguration());
             }
             schedulePictureInPictureModeChanged(newConfig);
-            scheduleMultiWindowModeChanged(newConfig);
+            if (shouldScheduleMultiWindowModeChange) {
+                scheduleMultiWindowModeChanged(newConfig);
+            }
         }
     }
 
@@ -1298,6 +1306,19 @@
         if (newTask != null && isState(RESUMED)) {
             newTask.setResumedActivity(this, "onParentChanged");
         }
+
+        if (stack != null && stack.topRunningActivity() == this) {
+            // carry over the PictureInPictureParams to the parent stack without calling
+            // TaskOrganizerController#dispatchTaskInfoChanged.
+            // this is to ensure the stack holding up-to-dated pinned stack information
+            // when activity is re-parented to enter pip mode, see also
+            // RootWindowContainer#moveActivityToPinnedStack
+            stack.mPictureInPictureParams.copyOnlySet(pictureInPictureArgs);
+            // make ensure the TaskOrganizer still works after re-parenting
+            if (firstWindowDrawn) {
+                stack.setHasBeenVisible(true);
+            }
+        }
     }
 
     private void updateColorTransform() {
@@ -1361,8 +1382,8 @@
             final Rect spaceToFill = transformedBounds != null
                     ? transformedBounds
                     : inMultiWindowMode()
-                            ? task.getDisplayedBounds()
-                            : getRootTask().getParent().getDisplayedBounds();
+                            ? task.getBounds()
+                            : getRootTask().getParent().getBounds();
             mLetterbox.layout(spaceToFill, w.getFrameLw(), mTmpPoint);
         } else if (mLetterbox != null) {
             mLetterbox.hide();
@@ -1398,11 +1419,10 @@
     }
 
     /**
-     * @return {@code true} if there is a letterbox and any part of that letterbox overlaps with
-     * the given {@code rect}.
+     * @see Letterbox#notIntersectsOrFullyContains(Rect)
      */
-    boolean isLetterboxOverlappingWith(Rect rect) {
-        return mLetterbox != null && mLetterbox.isOverlappingWith(rect);
+    boolean letterboxNotIntersectsOrFullyContains(Rect rect) {
+        return mLetterbox == null || mLetterbox.notIntersectsOrFullyContains(rect);
     }
 
     static class Token extends IApplicationToken.Stub {
@@ -1644,7 +1664,11 @@
             if (usageReport != null) {
                 appTimeTracker = new AppTimeTracker(usageReport);
             }
-            // Gets launch display id from options. It returns INVALID_DISPLAY if not set.
+            // Gets launch task display area and display id from options. Returns
+            // null/INVALID_DISPLAY if not set.
+            final WindowContainerToken daToken = options.getLaunchTaskDisplayArea();
+            mHandoverTaskDisplayArea = daToken != null
+                    ? (TaskDisplayArea) WindowContainer.fromBinder(daToken.asBinder()) : null;
             mHandoverLaunchDisplayId = options.getLaunchDisplayId();
         }
     }
@@ -2163,7 +2187,7 @@
 
     boolean isInStackLocked() {
         final ActivityStack stack = getRootTask();
-        return stack != null && stack.isInStackLocked(this) != null;
+        return stack != null && stack.isInTask(this) != null;
     }
 
     boolean isPersistable() {
@@ -2523,23 +2547,12 @@
 
             pauseKeyDispatchingLocked();
 
-            // We are finishing the top focused activity and its stack has nothing to be focused so
-            // the next focusable stack should be focused.
-            if (mayAdjustTop
-                    && (stack.topRunningActivity() == null || !stack.isTopActivityFocusable())) {
-                if (shouldAdjustGlobalFocus) {
-                    // Move the entire hierarchy to top with updating global top resumed activity
-                    // and focused application if needed.
-                    stack.adjustFocusToNextFocusableStack("finish-top");
-                } else {
-                    // Only move the next stack to top in its task container.
-                    final TaskDisplayArea taskDisplayArea = stack.getDisplayArea();
-                    next = taskDisplayArea.topRunningActivity();
-                    if (next != null) {
-                        taskDisplayArea.positionStackAtTop(next.getRootTask(),
-                                false /* includingParents */, "finish-display-top");
-                    }
-                }
+            // We are finishing the top focused activity and its task has nothing to be focused so
+            // the next focusable task should be focused.
+            if (mayAdjustTop && ((ActivityStack) task).topRunningActivity(true /* focusableOnly */)
+                    == null) {
+                task.adjustFocusToNextFocusableTask("finish-top", false /* allowFocusSelf */,
+                        shouldAdjustGlobalFocus);
             }
 
             finishActivityResults(resultCode, resultData);
@@ -2656,6 +2669,17 @@
             return this;
         }
 
+        // Ensure activity visibilities and update lockscreen occluded/dismiss state when
+        // finishing the top activity that occluded keyguard. So that, the
+        // ActivityStack#mTopActivityOccludesKeyguard can be updated and the activity below won't
+        // be resumed.
+        if (isState(PAUSED)
+                && mStackSupervisor.getKeyguardController().isKeyguardLocked()
+                && getStack().topActivityOccludesKeyguard()) {
+            getDisplay().ensureActivitiesVisible(null /* starting */, 0 /* configChanges */,
+                    false /* preserveWindows */, false /* notifyClients */);
+        }
+
         boolean activityRemoved = false;
 
         // If this activity is currently visible, and the resumed activity is not yet visible, then
@@ -3117,7 +3141,6 @@
         commitVisibility(false /* visible */, true /* performLayout */);
 
         getDisplayContent().mOpeningApps.remove(this);
-        getDisplayContent().mChangingContainers.remove(this);
         getDisplayContent().mUnknownAppVisibilityController.appRemovedOrHidden(this);
         mWmService.mTaskSnapshotController.onAppRemoved(this);
         mStackSupervisor.getActivityMetricsLogger().notifyActivityRemoved(this);
@@ -3738,7 +3761,8 @@
                         pendingOptions.getPackageName(),
                         pendingOptions.getCustomEnterResId(),
                         pendingOptions.getCustomExitResId(),
-                        pendingOptions.getOnAnimationStartListener());
+                        pendingOptions.getAnimationStartedListener(),
+                        pendingOptions.getAnimationFinishedListener());
                 break;
             case ANIM_CLIP_REVEAL:
                 displayContent.mAppTransition.overridePendingAppTransitionClipReveal(
@@ -3768,7 +3792,7 @@
                 final GraphicBuffer buffer = pendingOptions.getThumbnail();
                 displayContent.mAppTransition.overridePendingAppTransitionThumb(buffer,
                         pendingOptions.getStartX(), pendingOptions.getStartY(),
-                        pendingOptions.getOnAnimationStartListener(),
+                        pendingOptions.getAnimationStartedListener(),
                         scaleUp);
                 if (intent.getSourceBounds() == null && buffer != null) {
                     intent.setSourceBounds(new Rect(pendingOptions.getStartX(),
@@ -3784,19 +3808,19 @@
                         pendingOptions.getSpecsFuture();
                 if (specsFuture != null) {
                     displayContent.mAppTransition.overridePendingAppTransitionMultiThumbFuture(
-                            specsFuture, pendingOptions.getOnAnimationStartListener(),
+                            specsFuture, pendingOptions.getAnimationStartedListener(),
                             animationType == ANIM_THUMBNAIL_ASPECT_SCALE_UP);
                 } else if (animationType == ANIM_THUMBNAIL_ASPECT_SCALE_DOWN
                         && specs != null) {
                     displayContent.mAppTransition.overridePendingAppTransitionMultiThumb(
-                            specs, pendingOptions.getOnAnimationStartListener(),
+                            specs, pendingOptions.getAnimationStartedListener(),
                             pendingOptions.getAnimationFinishedListener(), false);
                 } else {
                     displayContent.mAppTransition.overridePendingAppTransitionAspectScaledThumb(
                             pendingOptions.getThumbnail(),
                             pendingOptions.getStartX(), pendingOptions.getStartY(),
                             pendingOptions.getWidth(), pendingOptions.getHeight(),
-                            pendingOptions.getOnAnimationStartListener(),
+                            pendingOptions.getAnimationStartedListener(),
                             (animationType == ANIM_THUMBNAIL_ASPECT_SCALE_UP));
                     if (intent.getSourceBounds() == null) {
                         intent.setSourceBounds(new Rect(pendingOptions.getStartX(),
@@ -4691,7 +4715,7 @@
      */
     private boolean shouldBeResumed(ActivityRecord activeActivity) {
         return shouldMakeActive(activeActivity) && isFocusable()
-                && getRootTask().getVisibility(activeActivity) == STACK_VISIBILITY_VISIBLE
+                && getTask().getVisibility(activeActivity) == STACK_VISIBILITY_VISIBLE
                 && canResumeByCompat();
     }
 
@@ -5112,26 +5136,48 @@
     }
 
     void startFreezingScreen() {
+        startFreezingScreen(ROTATION_UNDEFINED /* overrideOriginalDisplayRotation */);
+    }
+
+    void startFreezingScreen(int overrideOriginalDisplayRotation) {
         ProtoLog.i(WM_DEBUG_ORIENTATION,
                 "Set freezing of %s: visible=%b freezing=%b visibleRequested=%b. %s",
                 appToken, isVisible(), mFreezingScreen, mVisibleRequested,
                 new RuntimeException().fillInStackTrace());
-        if (mVisibleRequested) {
-            if (!mFreezingScreen) {
-                mFreezingScreen = true;
-                mWmService.registerAppFreezeListener(this);
-                mWmService.mAppsFreezingScreen++;
-                if (mWmService.mAppsFreezingScreen == 1) {
-                    mWmService.startFreezingDisplayLocked(0, 0, getDisplayContent());
-                    mWmService.mH.removeMessages(H.APP_FREEZE_TIMEOUT);
-                    mWmService.mH.sendEmptyMessageDelayed(H.APP_FREEZE_TIMEOUT, 2000);
+        if (!mVisibleRequested) {
+            return;
+        }
+
+        // If the override is given, the rotation of display doesn't change but we still want to
+        // cover the activity whose configuration is changing by freezing the display and running
+        // the rotation animation.
+        final boolean forceRotation = overrideOriginalDisplayRotation != ROTATION_UNDEFINED;
+        if (!mFreezingScreen) {
+            mFreezingScreen = true;
+            mWmService.registerAppFreezeListener(this);
+            mWmService.mAppsFreezingScreen++;
+            if (mWmService.mAppsFreezingScreen == 1) {
+                if (forceRotation) {
+                    // Make sure normal rotation animation will be applied.
+                    mDisplayContent.getDisplayRotation().cancelSeamlessRotation();
                 }
+                mWmService.startFreezingDisplay(0 /* exitAnim */, 0 /* enterAnim */,
+                        mDisplayContent, overrideOriginalDisplayRotation);
+                mWmService.mH.removeMessages(H.APP_FREEZE_TIMEOUT);
+                mWmService.mH.sendEmptyMessageDelayed(H.APP_FREEZE_TIMEOUT, 2000);
             }
-            final int count = mChildren.size();
-            for (int i = 0; i < count; i++) {
-                final WindowState w = mChildren.get(i);
-                w.onStartFreezingScreen();
-            }
+        }
+        if (forceRotation) {
+            // The rotation of the real display won't change, so in order to unfreeze the screen
+            // via {@link #checkAppWindowsReadyToShow}, the windows have to be able to call
+            // {@link WindowState#reportResized} (it is skipped if the window is freezing) to update
+            // the drawn state.
+            return;
+        }
+        final int count = mChildren.size();
+        for (int i = 0; i < count; i++) {
+            final WindowState w = mChildren.get(i);
+            w.onStartFreezingScreen();
         }
     }
 
@@ -5534,7 +5580,7 @@
 
     static ActivityRecord isInStackLocked(IBinder token) {
         final ActivityRecord r = ActivityRecord.forTokenLocked(token);
-        return (r != null) ? r.getRootTask().isInStackLocked(r) : null;
+        return (r != null) ? r.getRootTask().isInTask(r) : null;
     }
 
     static ActivityStack getStackLocked(IBinder token) {
@@ -6087,19 +6133,8 @@
 
     @Override
     void cancelAnimation() {
-        cancelAnimationOnly();
-        clearThumbnail();
-        mSurfaceFreezer.unfreeze(getPendingTransaction());
-    }
-
-    /**
-     * This only cancels the animation. It doesn't do other teardown like cleaning-up thumbnail
-     * or interim leashes.
-     * <p>
-     * Used when canceling in preparation for starting a new animation.
-     */
-    void cancelAnimationOnly() {
         super.cancelAnimation();
+        clearThumbnail();
     }
 
     @VisibleForTesting
@@ -6146,6 +6181,21 @@
         ensureActivityConfiguration(0 /* globalChanges */, false /* preserveWindow */);
     }
 
+    @Override
+    void onCancelFixedRotationTransform(int originalDisplayRotation) {
+        if (this != mDisplayContent.getLastOrientationSource()
+                || getRequestedConfigurationOrientation() != ORIENTATION_UNDEFINED) {
+            // Only need to handle the activity that should be rotated with display.
+            return;
+        }
+
+        // Perform rotation animation according to the rotation of this activity.
+        startFreezingScreen(originalDisplayRotation);
+        // This activity may relaunch or perform configuration change so once it has reported drawn,
+        // the screen can be unfrozen.
+        ensureActivityConfiguration(0 /* globalChanges */, !PRESERVE_WINDOWS);
+    }
+
     void setRequestedOrientation(int requestedOrientation) {
         setOrientation(requestedOrientation, mayFreezeScreenLocked());
         mAtmService.getTaskChangeNotificationController().notifyActivityRequestedOrientationChanged(
@@ -6602,17 +6652,6 @@
         return super.getBounds();
     }
 
-    @Override
-    Rect getDisplayedBounds() {
-        if (task != null) {
-            final Rect overrideDisplayedBounds = task.getOverrideDisplayedBounds();
-            if (!overrideDisplayedBounds.isEmpty()) {
-                return overrideDisplayedBounds;
-            }
-        }
-        return getBounds();
-    }
-
     @VisibleForTesting
     @Override
     Rect getAnimationBounds(int appStackClipMode) {
diff --git a/services/core/java/com/android/server/wm/ActivityStack.java b/services/core/java/com/android/server/wm/ActivityStack.java
index bcad758..2ab03ce 100644
--- a/services/core/java/com/android/server/wm/ActivityStack.java
+++ b/services/core/java/com/android/server/wm/ActivityStack.java
@@ -18,11 +18,8 @@
 
 import static android.app.ActivityTaskManager.INVALID_TASK_ID;
 import static android.app.ITaskStackListener.FORCED_RESIZEABLE_REASON_SPLIT_SCREEN;
-import static android.app.WindowConfiguration.ACTIVITY_TYPE_ASSISTANT;
-import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
 import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
 import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED;
-import static android.app.WindowConfiguration.PINNED_WINDOWING_MODE_ELEVATION_IN_DIP;
 import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
 import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
 import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
@@ -91,7 +88,6 @@
 import static com.android.server.wm.TaskProto.BOUNDS;
 import static com.android.server.wm.TaskProto.CREATED_BY_ORGANIZER;
 import static com.android.server.wm.TaskProto.DEFER_REMOVAL;
-import static com.android.server.wm.TaskProto.DISPLAYED_BOUNDS;
 import static com.android.server.wm.TaskProto.DISPLAY_ID;
 import static com.android.server.wm.TaskProto.FILLS_PARENT;
 import static com.android.server.wm.TaskProto.LAST_NON_FULLSCREEN_BOUNDS;
@@ -143,13 +139,11 @@
 import android.os.Trace;
 import android.os.UserHandle;
 import android.service.voice.IVoiceInteractionSession;
-import android.util.DisplayMetrics;
 import android.util.Log;
 import android.util.Slog;
 import android.util.proto.ProtoOutputStream;
 import android.view.Display;
 import android.view.DisplayInfo;
-import android.view.SurfaceControl;
 
 import com.android.internal.annotations.GuardedBy;
 import com.android.internal.annotations.VisibleForTesting;
@@ -158,7 +152,6 @@
 import com.android.internal.util.function.pooled.PooledConsumer;
 import com.android.internal.util.function.pooled.PooledFunction;
 import com.android.internal.util.function.pooled.PooledLambda;
-import com.android.internal.util.function.pooled.PooledPredicate;
 import com.android.server.Watchdog;
 import com.android.server.am.ActivityManagerService;
 import com.android.server.am.ActivityManagerService.ItemMatcher;
@@ -260,11 +253,9 @@
     private Rect mTmpRect = new Rect();
     private Rect mTmpRect2 = new Rect();
 
-    /** For Pinned stack controlling. */
-    private Rect mTmpToBounds = new Rect();
-
     /** Detach this stack from its display when animation completes. */
     // TODO: maybe tie this to WindowContainer#removeChild some how...
+    // TODO: This is no longer set. Okay to remove or was the set removed by accident?
     private boolean mDeferRemoval;
 
     // If this is true, we are in the bounds animating mode. The task will be down or upscaled to
@@ -279,21 +270,12 @@
 
     Rect mPreAnimationBounds = new Rect();
 
-    /**
-     * For {@link #prepareSurfaces}.
-     */
-    private final Rect mTmpDimBoundsRect = new Rect();
-    private final Point mLastSurfaceSize = new Point();
-
     private final AnimatingActivityRegistry mAnimatingActivityRegistry =
             new AnimatingActivityRegistry();
 
     /** Stores the override windowing-mode from before a transient mode change (eg. split) */
     private int mRestoreOverrideWindowingMode = WINDOWING_MODE_UNDEFINED;
 
-    /** List for processing through a set of activities */
-    private final ArrayList<ActivityRecord> mTmpActivities = new ArrayList<>();
-
     private boolean mTopActivityOccludesKeyguard;
     private ActivityRecord mTopDismissingKeyguardActivity;
 
@@ -606,9 +588,6 @@
         final int prevWindowingMode = getWindowingMode();
         final boolean prevIsAlwaysOnTop = isAlwaysOnTop();
         final int prevRotation = getWindowConfiguration().getRotation();
-        final int prevDensity = getConfiguration().densityDpi;
-        final int prevScreenW = getConfiguration().screenWidthDp;
-        final int prevScreenH = getConfiguration().screenHeightDp;
         final Rect newBounds = mTmpRect;
         // Initialize the new bounds by previous bounds as the input and output for calculating
         // override bounds in pinned (pip) or split-screen mode.
@@ -616,10 +595,6 @@
 
         super.onConfigurationChanged(newParentConfig);
 
-        // Only need to update surface size here since the super method will handle updating
-        // surface position.
-        updateSurfaceSize(getPendingTransaction());
-
         final TaskDisplayArea taskDisplayArea = getDisplayArea();
         if (taskDisplayArea == null) {
             return;
@@ -660,8 +635,7 @@
                 setBounds(newBounds);
             } else if (overrideWindowingMode != WINDOWING_MODE_PINNED) {
                 // For pinned stack, resize is now part of the {@link WindowContainerTransaction}
-                resize(new Rect(newBounds), null /* configBounds */,
-                        PRESERVE_WINDOWS, true /* deferResume */);
+                resize(new Rect(newBounds), PRESERVE_WINDOWS, true /* deferResume */);
             }
         }
         if (prevIsAlwaysOnTop != isAlwaysOnTop()) {
@@ -783,6 +757,11 @@
         if (currentMode == WINDOWING_MODE_PINNED) {
             mAtmService.getTaskChangeNotificationController().notifyActivityUnpinned();
         }
+        if (likelyResolvedMode == WINDOWING_MODE_PINNED
+                && taskDisplayArea.getRootPinnedTask() != null) {
+            // Can only have 1 pip at a time, so replace an existing pip
+            taskDisplayArea.getRootPinnedTask().dismissPip();
+        }
         if (likelyResolvedMode != WINDOWING_MODE_FULLSCREEN
                 && topActivity != null && !topActivity.noDisplay
                 && topActivity.isNonResizableOrForcedResizable(likelyResolvedMode)) {
@@ -830,8 +809,7 @@
             }
 
             if (!Objects.equals(getRequestedOverrideBounds(), mTmpRect2)) {
-                resize(mTmpRect2, null /*configBounds*/,
-                        false /*preserveWindows*/, true /*deferResume*/);
+                resize(mTmpRect2, false /*preserveWindows*/, true /*deferResume*/);
             }
         } finally {
             mAtmService.continueWindowLayout();
@@ -854,7 +832,8 @@
 
     /** Resume next focusable stack after reparenting to another display. */
     void postReparent() {
-        adjustFocusToNextFocusableStack("reparent", true /* allowFocusSelf */);
+        adjustFocusToNextFocusableTask("reparent", true /* allowFocusSelf */,
+                true /* moveParentsToTop */);
         mRootWindowContainer.resumeFocusedStacksTopActivities();
         // Update visibility of activities before notifying WM. This way it won't try to resize
         // windows that are no longer visible.
@@ -889,9 +868,6 @@
                 setTaskBounds(mDeferredBounds);
                 setBounds(mDeferredBounds);
             }
-            if (mUpdateDisplayedBoundsDeferredCalled) {
-                setTaskDisplayedBounds(mDeferredDisplayedBounds);
-            }
         }
     }
 
@@ -921,70 +897,6 @@
         return false;
     }
 
-    ActivityRecord topRunningActivity() {
-        return topRunningActivity(false /* focusableOnly */);
-    }
-
-    ActivityRecord topRunningActivity(boolean focusableOnly) {
-        // Split into 2 to avoid object creation due to variable capture.
-        if (focusableOnly) {
-            return getActivity((r) -> r.canBeTopRunning() && r.isFocusable());
-        } else {
-            return getActivity(ActivityRecord::canBeTopRunning);
-        }
-    }
-
-    private ActivityRecord topRunningNonOverlayTaskActivity() {
-        return getActivity((r) -> (r.canBeTopRunning() && !r.isTaskOverlay()));
-    }
-
-    ActivityRecord topRunningNonDelayedActivityLocked(ActivityRecord notTop) {
-        final PooledPredicate p = PooledLambda.obtainPredicate(ActivityStack::isTopRunningNonDelayed
-                , PooledLambda.__(ActivityRecord.class), notTop);
-        final ActivityRecord r = getActivity(p);
-        p.recycle();
-        return r;
-    }
-
-    private static boolean isTopRunningNonDelayed(ActivityRecord r, ActivityRecord notTop) {
-        return !r.delayedResume && r != notTop && r.canBeTopRunning();
-    }
-
-    /**
-     * This is a simplified version of topRunningActivity that provides a number of
-     * optional skip-over modes.  It is intended for use with the ActivityController hook only.
-     *
-     * @param token If non-null, any history records matching this token will be skipped.
-     * @param taskId If non-zero, we'll attempt to skip over records with the same task ID.
-     *
-     * @return Returns the HistoryRecord of the next activity on the stack.
-     */
-    ActivityRecord topRunningActivity(IBinder token, int taskId) {
-        final PooledPredicate p = PooledLambda.obtainPredicate(ActivityStack::isTopRunning,
-                PooledLambda.__(ActivityRecord.class), taskId, token);
-        final ActivityRecord r = getActivity(p);
-        p.recycle();
-        return r;
-    }
-
-    private static boolean isTopRunning(ActivityRecord r, int taskId, IBinder notTop) {
-        return r.getTask().mTaskId != taskId && r.appToken != notTop && r.canBeTopRunning();
-    }
-
-    ActivityRecord isInStackLocked(ActivityRecord r) {
-        if (r == null) {
-            return null;
-        }
-        final Task task = r.getRootTask();
-        if (task != null && r.isDescendantOf(task)) {
-            if (task != this) Slog.w(TAG, "Illegal state! task does not point to stack it is in. "
-                    + "stack=" + this + " task=" + task + " r=" + r
-                    + " callers=" + Debug.getCallers(15, "\n"));
-            return r;
-        }
-        return null;
-    }
-
     /** @return true if the stack can only contain one task */
     boolean isSingleTaskInstance() {
         final DisplayContent display = getDisplay();
@@ -1049,6 +961,9 @@
     }
 
     /**
+     * This moves 'task' to the back of this task and also recursively moves this task to the back
+     * of its parents (if applicable).
+     *
      * @param reason The reason for moving the stack to the back.
      * @param task If non-null, the task will be moved to the bottom of the stack.
      **/
@@ -1056,18 +971,41 @@
         if (!isAttached()) {
             return;
         }
-
-        getDisplayArea().positionStackAtBottom(this, reason);
-        if (task != null && task != this) {
-            positionChildAtBottom(task);
+        final TaskDisplayArea displayArea = getDisplayArea();
+        if (!mCreatedByOrganizer) {
+            // If this is just a normal task, so move to back of parent and then move 'task' to
+            // back of this.
+            final WindowContainer parent = getParent();
+            final Task parentTask = parent != null ? parent.asTask() : null;
+            if (parentTask != null) {
+                ((ActivityStack) parentTask).moveToBack(reason, this);
+            } else {
+                displayArea.positionStackAtBottom(this, reason);
+            }
+            if (task != null && task != this) {
+                positionChildAtBottom(task);
+            }
+            return;
         }
-
-        /**
-         * The intent behind moving a primary split screen stack to the back is usually to hide
-         * behind the home stack. Exit split screen in this case.
-         */
-        if (getWindowingMode() == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY) {
-            setWindowingMode(WINDOWING_MODE_UNDEFINED);
+        if (task == null || task == this) {
+            return;
+        }
+        // This is a created-by-organizer task. In this case, let the organizer deal with this
+        // task's ordering. However, we still need to move 'task' to back. The intention is that
+        // this ends up behind the home-task so that it is made invisible; so, if the home task
+        // is not a child of this, reparent 'task' to the back of the home task's actual parent.
+        final ActivityStack home = displayArea.getOrCreateRootHomeTask();
+        final WindowContainer homeParent = home.getParent();
+        final Task homeParentTask = homeParent != null ? homeParent.asTask() : null;
+        if (homeParentTask == null) {
+            ((ActivityStack) task).reparent(displayArea, false /* onTop */);
+        } else if (homeParentTask == this) {
+            // Apparently reparent early-outs if same stack, so we have to explicitly reorder.
+            positionChildAtBottom(task);
+        } else {
+            task.reparent((ActivityStack) homeParentTask, false /* toTop */,
+                    REPARENT_LEAVE_STACK_IN_PLACE, false /* animate */, false /* deferResume */,
+                    "moveToBack");
         }
     }
 
@@ -1081,12 +1019,6 @@
         return isTopActivityFocusable() && shouldBeVisible(null /* starting */);
     }
 
-    @Override
-    public boolean isAttached() {
-        final TaskDisplayArea taskDisplayArea = getDisplayArea();
-        return taskDisplayArea != null && !taskDisplayArea.isRemoved();
-    }
-
     // TODO: Should each user have there own stacks?
     @Override
     void switchUser(int userId) {
@@ -1438,140 +1370,6 @@
     }
 
     /**
-     * Returns true if the stack should be visible.
-     *
-     * @param starting The currently starting activity or null if there is none.
-     */
-    @Override
-    boolean shouldBeVisible(ActivityRecord starting) {
-        return getVisibility(starting) != STACK_VISIBILITY_INVISIBLE;
-    }
-
-    /**
-     * Returns true if the stack should be visible.
-     *
-     * @param starting The currently starting activity or null if there is none.
-     */
-    @StackVisibility
-    int getVisibility(ActivityRecord starting) {
-        if (!isAttached() || isForceHidden()) {
-            return STACK_VISIBILITY_INVISIBLE;
-        }
-
-        final TaskDisplayArea taskDisplayArea = getDisplayArea();
-        boolean gotSplitScreenStack = false;
-        boolean gotOpaqueSplitScreenPrimary = false;
-        boolean gotOpaqueSplitScreenSecondary = false;
-        boolean gotTranslucentFullscreen = false;
-        boolean gotTranslucentSplitScreenPrimary = false;
-        boolean gotTranslucentSplitScreenSecondary = false;
-        boolean shouldBeVisible = true;
-        final int windowingMode = getWindowingMode();
-        final boolean isAssistantType = isActivityTypeAssistant();
-        for (int i = taskDisplayArea.getStackCount() - 1; i >= 0; --i) {
-            final ActivityStack other = taskDisplayArea.getStackAt(i);
-            final boolean hasRunningActivities = other.topRunningActivity() != null;
-            if (other == this) {
-                // Should be visible if there is no other stack occluding it, unless it doesn't
-                // have any running activities, not starting one and not home stack.
-                shouldBeVisible = hasRunningActivities || isInStackLocked(starting) != null
-                        || isActivityTypeHome();
-                break;
-            }
-
-            if (!hasRunningActivities) {
-                continue;
-            }
-
-            final int otherWindowingMode = other.getWindowingMode();
-
-            if (otherWindowingMode == WINDOWING_MODE_FULLSCREEN) {
-                // In this case the home stack isn't resizeable even though we are in split-screen
-                // mode. We still want the primary splitscreen stack to be visible as there will be
-                // a slight hint of it in the status bar area above the non-resizeable home
-                // activity. In addition, if the fullscreen assistant is over primary splitscreen
-                // stack, the stack should still be visible in the background as long as the recents
-                // animation is running.
-                final int activityType = other.getActivityType();
-                if (windowingMode == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY) {
-                    if (activityType == ACTIVITY_TYPE_HOME
-                            || (activityType == ACTIVITY_TYPE_ASSISTANT
-                                && mWmService.getRecentsAnimationController() != null)) {
-                        break;
-                    }
-                }
-                if (other.isTranslucent(starting)) {
-                    // Can be visible behind a translucent fullscreen stack.
-                    gotTranslucentFullscreen = true;
-                    continue;
-                }
-                return STACK_VISIBILITY_INVISIBLE;
-            } else if (otherWindowingMode == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY
-                    && !gotOpaqueSplitScreenPrimary) {
-                gotSplitScreenStack = true;
-                gotTranslucentSplitScreenPrimary = other.isTranslucent(starting);
-                gotOpaqueSplitScreenPrimary = !gotTranslucentSplitScreenPrimary;
-                if (windowingMode == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY
-                        && gotOpaqueSplitScreenPrimary) {
-                    // Can not be visible behind another opaque stack in split-screen-primary mode.
-                    return STACK_VISIBILITY_INVISIBLE;
-                }
-            } else if (otherWindowingMode == WINDOWING_MODE_SPLIT_SCREEN_SECONDARY
-                    && !gotOpaqueSplitScreenSecondary) {
-                gotSplitScreenStack = true;
-                gotTranslucentSplitScreenSecondary = other.isTranslucent(starting);
-                gotOpaqueSplitScreenSecondary = !gotTranslucentSplitScreenSecondary;
-                if (windowingMode == WINDOWING_MODE_SPLIT_SCREEN_SECONDARY
-                        && gotOpaqueSplitScreenSecondary) {
-                    // Can not be visible behind another opaque stack in split-screen-secondary mode.
-                    return STACK_VISIBILITY_INVISIBLE;
-                }
-            }
-            if (gotOpaqueSplitScreenPrimary && gotOpaqueSplitScreenSecondary) {
-                // Can not be visible if we are in split-screen windowing mode and both halves of
-                // the screen are opaque.
-                return STACK_VISIBILITY_INVISIBLE;
-            }
-            if (isAssistantType && gotSplitScreenStack) {
-                // Assistant stack can't be visible behind split-screen. In addition to this not
-                // making sense, it also works around an issue here we boost the z-order of the
-                // assistant window surfaces in window manager whenever it is visible.
-                return STACK_VISIBILITY_INVISIBLE;
-            }
-        }
-
-        if (!shouldBeVisible) {
-            return STACK_VISIBILITY_INVISIBLE;
-        }
-
-        // Handle cases when there can be a translucent split-screen stack on top.
-        switch (windowingMode) {
-            case WINDOWING_MODE_FULLSCREEN:
-                if (gotTranslucentSplitScreenPrimary || gotTranslucentSplitScreenSecondary) {
-                    // At least one of the split-screen stacks that covers this one is translucent.
-                    return STACK_VISIBILITY_VISIBLE_BEHIND_TRANSLUCENT;
-                }
-                break;
-            case WINDOWING_MODE_SPLIT_SCREEN_PRIMARY:
-                if (gotTranslucentSplitScreenPrimary) {
-                    // Covered by translucent primary split-screen on top.
-                    return STACK_VISIBILITY_VISIBLE_BEHIND_TRANSLUCENT;
-                }
-                break;
-            case WINDOWING_MODE_SPLIT_SCREEN_SECONDARY:
-                if (gotTranslucentSplitScreenSecondary) {
-                    // Covered by translucent secondary split-screen on top.
-                    return STACK_VISIBILITY_VISIBLE_BEHIND_TRANSLUCENT;
-                }
-                break;
-        }
-
-        // Lastly - check if there is a translucent fullscreen stack on top.
-        return gotTranslucentFullscreen ? STACK_VISIBILITY_VISIBLE_BEHIND_TRANSLUCENT
-                : STACK_VISIBILITY_VISIBLE;
-    }
-
-    /**
      * Make sure that all activities that need to be visible in the stack (that is, they
      * currently can be seen by the user) actually are and update their configuration.
      */
@@ -2257,7 +2055,7 @@
         final String reason = "noMoreActivities";
 
         if (!isActivityTypeHome()) {
-            final ActivityStack nextFocusedStack = adjustFocusToNextFocusableStack(reason);
+            final ActivityStack nextFocusedStack = adjustFocusToNextFocusableTask(reason);
             if (nextFocusedStack != null) {
                 // Try to move focus to the next visible stack with a running activity if this
                 // stack is not covering the entire screen or is on a secondary display with no home
@@ -2466,48 +2264,6 @@
     }
 
     /**
-     * Find next proper focusable stack and make it focused.
-     * @return The stack that now got the focus, {@code null} if none found.
-     */
-    ActivityStack adjustFocusToNextFocusableStack(String reason) {
-        return adjustFocusToNextFocusableStack(reason, false /* allowFocusSelf */);
-    }
-
-    /**
-     * Find next proper focusable stack and make it focused.
-     * @param allowFocusSelf Is the focus allowed to remain on the same stack.
-     * @return The stack that now got the focus, {@code null} if none found.
-     */
-    private ActivityStack adjustFocusToNextFocusableStack(String reason, boolean allowFocusSelf) {
-        final ActivityStack stack =
-                mRootWindowContainer.getNextFocusableStack(this, !allowFocusSelf);
-        final String myReason = reason + " adjustFocusToNextFocusableStack";
-        if (stack == null) {
-            return null;
-        }
-
-        final ActivityRecord top = stack.topRunningActivity();
-
-        if (stack.isActivityTypeHome() && (top == null || !top.mVisibleRequested)) {
-            // If we will be focusing on the home stack next and its current top activity isn't
-            // visible, then use the move the home stack task to top to make the activity visible.
-            stack.getDisplayArea().moveHomeActivityToTop(reason);
-            return stack;
-        }
-
-        stack.moveToFront(myReason);
-        // Top display focused stack is changed, update top resumed activity if needed.
-        if (stack.mResumedActivity != null) {
-            mStackSupervisor.updateTopResumedActivityIfNeeded();
-            // Set focused app directly because if the next focused activity is already resumed
-            // (e.g. the next top activity is on a different display), there won't have activity
-            // state change to update it.
-            mAtmService.setResumedActivityUncheckLocked(stack.mResumedActivity, reason);
-        }
-        return stack;
-    }
-
-    /**
      * Finish the topmost activity that belongs to the crashed app. We may also finish the activity
      * that requested launch of the crashed one to prevent launch-crash loop.
      * @param app The app that crashed.
@@ -2935,8 +2691,7 @@
 
     // TODO: Can only be called from special methods in ActivityStackSupervisor.
     // Need to consolidate those calls points into this resize method so anyone can call directly.
-    void resize(Rect displayedBounds, Rect configBounds, boolean preserveWindows,
-            boolean deferResume) {
+    void resize(Rect displayedBounds, boolean preserveWindows, boolean deferResume) {
         if (!updateBoundsAllowed(displayedBounds)) {
             return;
         }
@@ -2948,7 +2703,7 @@
             // Update override configurations of all tasks in the stack.
             final PooledConsumer c = PooledLambda.obtainConsumer(
                     ActivityStack::processTaskResizeBounds, PooledLambda.__(Task.class),
-                    displayedBounds, configBounds);
+                    displayedBounds);
             forAllTasks(c, true /* traverseTopToBottom */);
             c.recycle();
 
@@ -2969,17 +2724,10 @@
         }
     }
 
-    private static void processTaskResizeBounds(
-            Task task, Rect displayedBounds, Rect configBounds) {
+    private static void processTaskResizeBounds(Task task, Rect displayedBounds) {
         if (!task.isResizeable()) return;
 
-        if (configBounds != null && !configBounds.isEmpty()) {
-            task.setOverrideDisplayedBounds(displayedBounds);
-            task.setBounds(configBounds);
-        } else {
-            task.setOverrideDisplayedBounds(null);
-            task.setBounds(displayedBounds);
-        }
+        task.setBounds(displayedBounds);
     }
 
     /**
@@ -3001,22 +2749,6 @@
         task.setBounds(task.isResizeable() ? bounds : null);
     }
 
-    /** Helper to setDisplayedBounds on all child tasks */
-    private void setTaskDisplayedBounds(Rect bounds) {
-        if (!updateDisplayedBoundsAllowed(bounds)) {
-            return;
-        }
-
-        final PooledConsumer c = PooledLambda.obtainConsumer(ActivityStack::setTaskDisplayedBounds,
-                PooledLambda.__(Task.class), bounds);
-        forAllLeafTasks(c, true /* traverseTopToBottom */);
-        c.recycle();
-    }
-
-    private static void setTaskDisplayedBounds(Task task, Rect bounds) {
-        task.setOverrideDisplayedBounds(bounds == null || bounds.isEmpty() ? null : bounds);
-    }
-
     /**
      * Returns the top-most activity that occludes the given one, or @{code null} if none.
      */
@@ -3515,61 +3247,14 @@
         scheduleAnimation();
     }
 
-    /**
-     * Calculate an amount by which to expand the stack bounds in each direction.
-     * Used to make room for shadows in the pinned windowing mode.
-     */
-    int getStackOutset() {
-        // If we are drawing shadows on the task then don't outset the stack.
-        if (mWmService.mRenderShadowsInCompositor) {
-            return 0;
-        }
-        DisplayContent displayContent = getDisplayContent();
-        if (inPinnedWindowingMode() && displayContent != null) {
-            final DisplayMetrics displayMetrics = displayContent.getDisplayMetrics();
-
-            // We multiply by two to match the client logic for converting view elevation
-            // to insets, as in {@link WindowManager.LayoutParams#setSurfaceInsets}
-            return (int) Math.ceil(
-                    mWmService.dipToPixel(PINNED_WINDOWING_MODE_ELEVATION_IN_DIP, displayMetrics)
-                            * 2);
-        }
-        return 0;
-    }
-
     @Override
-    void getRelativeDisplayedPosition(Point outPos) {
-        super.getRelativeDisplayedPosition(outPos);
-        final int outset = getStackOutset();
+    void getRelativePosition(Point outPos) {
+        super.getRelativePosition(outPos);
+        final int outset = getTaskOutset();
         outPos.x -= outset;
         outPos.y -= outset;
     }
 
-    private void updateSurfaceSize(SurfaceControl.Transaction transaction) {
-        if (mSurfaceControl == null) {
-            return;
-        }
-
-        final Rect stackBounds = getDisplayedBounds();
-        int width = stackBounds.width();
-        int height = stackBounds.height();
-
-        final int outset = getStackOutset();
-        width += 2 * outset;
-        height += 2 * outset;
-
-        if (width == mLastSurfaceSize.x && height == mLastSurfaceSize.y) {
-            return;
-        }
-        transaction.setWindowCrop(mSurfaceControl, width, height);
-        mLastSurfaceSize.set(width, height);
-    }
-
-    @VisibleForTesting
-    Point getLastSurfaceSize() {
-        return mLastSurfaceSize;
-    }
-
     @Override
     void onDisplayChanged(DisplayContent dc) {
         super.onDisplayChanged(dc);
@@ -3579,7 +3264,15 @@
     }
 
     boolean shouldIgnoreInput() {
-        return inSplitScreenPrimaryWindowingMode() && !isFocusable();
+        if (inSplitScreenPrimaryWindowingMode() && !isFocusable()) {
+            return true;
+        }
+        if (mAtmService.mHasLeanbackFeature && inPinnedWindowingMode()
+                && !isFocusedStackOnDisplay()) {
+            // Preventing Picture-in-Picture stack from receiving input on TVs.
+            return true;
+        }
+        return false;
     }
 
     @Override
@@ -3745,7 +3438,6 @@
         proto.write(FILLS_PARENT, matchParentBounds());
         getRawBounds().dumpDebug(proto, BOUNDS);
 
-        getOverrideDisplayedBounds().dumpDebug(proto, DISPLAYED_BOUNDS);
         if (mLastNonFullscreenBounds != null) {
             mLastNonFullscreenBounds.dumpDebug(proto, LAST_NON_FULLSCREEN_BOUNDS);
         }
diff --git a/services/core/java/com/android/server/wm/ActivityStackSupervisor.java b/services/core/java/com/android/server/wm/ActivityStackSupervisor.java
index f924bd4..fe9e5f3c 100644
--- a/services/core/java/com/android/server/wm/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/wm/ActivityStackSupervisor.java
@@ -1053,6 +1053,13 @@
         return true;
     }
 
+    /** Check if caller is allowed to launch activities on specified task display area. */
+    boolean isCallerAllowedToLaunchOnTaskDisplayArea(int callingPid, int callingUid,
+            TaskDisplayArea taskDisplayArea, ActivityInfo aInfo) {
+        return isCallerAllowedToLaunchOnDisplay(callingPid, callingUid,
+                taskDisplayArea != null ? taskDisplayArea.getDisplayId() : DEFAULT_DISPLAY, aInfo);
+    }
+
     /** Check if caller is allowed to launch activities on specified display. */
     boolean isCallerAllowedToLaunchOnDisplay(int callingPid, int callingUid, int launchDisplayId,
             ActivityInfo aInfo) {
@@ -1357,7 +1364,7 @@
                 // still need moveTaskToFrontLocked() below for any transition settings.
             }
             if (stack.shouldResizeStackWithLaunchBounds()) {
-                stack.resize(bounds, null /* configBounds */, !PRESERVE_WINDOWS, !DEFER_RESUME);
+                stack.resize(bounds, !PRESERVE_WINDOWS, !DEFER_RESUME);
             } else {
                 // WM resizeTask must be done after the task is moved to the correct stack,
                 // because Task's setBounds() also updates dim layer's bounds, but that has
@@ -2133,18 +2140,6 @@
                 WindowManagerService.WINDOW_FREEZE_TIMEOUT_DURATION);
     }
 
-    // TODO(b/152116619): Remove after complete switch to TaskDisplayArea
-    void handleNonResizableTaskIfNeeded(Task task, int preferredWindowingMode,
-            int preferredDisplayId, ActivityStack actualStack) {
-        final DisplayContent preferredDisplayContent = mRootWindowContainer
-                .getDisplayContent(preferredDisplayId);
-        final TaskDisplayArea preferredDisplayArea = preferredDisplayContent != null
-                ? preferredDisplayContent.getDefaultTaskDisplayArea()
-                : null;
-        handleNonResizableTaskIfNeeded(task, preferredWindowingMode, preferredDisplayArea,
-                actualStack);
-    }
-
     void handleNonResizableTaskIfNeeded(Task task, int preferredWindowingMode,
             TaskDisplayArea preferredTaskDisplayArea, ActivityStack actualStack) {
         handleNonResizableTaskIfNeeded(task, preferredWindowingMode, preferredTaskDisplayArea,
diff --git a/services/core/java/com/android/server/wm/ActivityStartController.java b/services/core/java/com/android/server/wm/ActivityStartController.java
index ad54356..7fad395 100644
--- a/services/core/java/com/android/server/wm/ActivityStartController.java
+++ b/services/core/java/com/android/server/wm/ActivityStartController.java
@@ -184,8 +184,8 @@
         }
         final int displayId = taskDisplayArea.getDisplayId();
         options.setLaunchDisplayId(displayId);
-        // TODO(b/152116619): Enable after complete switch to WindowContainerToken
-        //options.setLaunchWindowContainerToken(taskDisplayArea.getWindowContainerToken());
+        options.setLaunchTaskDisplayArea(taskDisplayArea.mRemoteToken
+                .toWindowContainerToken());
 
         // The home activity will be started later, defer resuming to avoid unneccerary operations
         // (e.g. start home recursively) when creating home stack.
diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java
index 0bd1aca..8edc84f 100644
--- a/services/core/java/com/android/server/wm/ActivityStarter.java
+++ b/services/core/java/com/android/server/wm/ActivityStarter.java
@@ -55,7 +55,6 @@
 import static android.content.pm.PackageManager.PERMISSION_GRANTED;
 import static android.os.Process.INVALID_UID;
 import static android.view.Display.DEFAULT_DISPLAY;
-import static android.view.Display.INVALID_DISPLAY;
 
 import static com.android.server.wm.ActivityStack.ActivityState.RESUMED;
 import static com.android.server.wm.ActivityStackSupervisor.DEFER_RESUME;
@@ -167,9 +166,8 @@
     private int mStartFlags;
     private ActivityRecord mSourceRecord;
 
-    // The display to launch the activity onto, barring any strong reason to do otherwise.
-    private int mPreferredDisplayId;
-    // The windowing mode to apply to the root task, if possible
+    // The task display area to launch the activity onto, barring any strong reason to do otherwise.
+    private TaskDisplayArea mPreferredTaskDisplayArea;
     private int mPreferredWindowingMode;
 
     private Task mInTask;
@@ -538,7 +536,7 @@
         mDoResume = starter.mDoResume;
         mStartFlags = starter.mStartFlags;
         mSourceRecord = starter.mSourceRecord;
-        mPreferredDisplayId = starter.mPreferredDisplayId;
+        mPreferredTaskDisplayArea = starter.mPreferredTaskDisplayArea;
         mPreferredWindowingMode = starter.mPreferredWindowingMode;
 
         mInTask = starter.mInTask;
@@ -1561,9 +1559,6 @@
         if (!mAvoidMoveToFront && mDoResume) {
             mTargetStack.getStack().moveToFront("reuseOrNewTask", targetTask);
             if (mOptions != null) {
-                if (mPreferredWindowingMode != WINDOWING_MODE_UNDEFINED) {
-                    mTargetStack.setWindowingMode(mPreferredWindowingMode);
-                }
                 if (mOptions.getTaskAlwaysOnTop()) {
                     mTargetStack.setAlwaysOnTop(true);
                 }
@@ -1631,7 +1626,7 @@
         // Update the recent tasks list immediately when the activity starts
         mSupervisor.mRecentTasks.add(mStartActivity.getTask());
         mSupervisor.handleNonResizableTaskIfNeeded(mStartActivity.getTask(),
-                mPreferredWindowingMode, mPreferredDisplayId, mTargetStack);
+                mPreferredWindowingMode, mPreferredTaskDisplayArea, mTargetStack);
 
         return START_SUCCESS;
     }
@@ -1684,9 +1679,9 @@
 
         mSupervisor.getLaunchParamsController().calculate(targetTask, r.info.windowLayout, r,
                 sourceRecord, mOptions, PHASE_BOUNDS, mLaunchParams);
-        mPreferredDisplayId = mLaunchParams.hasPreferredDisplay()
-                ? mLaunchParams.mPreferredDisplayId
-                : DEFAULT_DISPLAY;
+        mPreferredTaskDisplayArea = mLaunchParams.hasPreferredTaskDisplayArea()
+                ? mLaunchParams.mPreferredTaskDisplayArea
+                : mRootWindowContainer.getDefaultTaskDisplayArea();
         mPreferredWindowingMode = mLaunchParams.mWindowingMode;
     }
 
@@ -1703,10 +1698,12 @@
         // Do not start home activity if it cannot be launched on preferred display. We are not
         // doing this in ActivityStackSupervisor#canPlaceEntityOnDisplay because it might
         // fallback to launch on other displays.
-        if (r.isActivityTypeHome() && !mRootWindowContainer.canStartHomeOnDisplay(r.info,
-                mPreferredDisplayId, true /* allowInstrumenting */)) {
-            Slog.w(TAG, "Cannot launch home on display " + mPreferredDisplayId);
-            return START_CANCELED;
+        if (r.isActivityTypeHome()) {
+            if (!mRootWindowContainer.canStartHomeOnDisplayArea(r.info, mPreferredTaskDisplayArea,
+                    true /* allowInstrumenting */)) {
+                Slog.w(TAG, "Cannot launch home on display area " + mPreferredTaskDisplayArea);
+                return START_CANCELED;
+            }
         }
 
         if (mRestrictedBgActivity && (newTask || !targetTask.isUidPresent(mCallingUid))
@@ -1841,10 +1838,10 @@
                 && top.attachedToProcess()
                 && ((mLaunchFlags & FLAG_ACTIVITY_SINGLE_TOP) != 0
                 || isLaunchModeOneOf(LAUNCH_SINGLE_TOP, LAUNCH_SINGLE_TASK))
-                // This allows home activity to automatically launch on secondary display when
-                // display added, if home was the top activity on default display, instead of
-                // sending new intent to the home activity on default display.
-                && (!top.isActivityTypeHome() || top.getDisplayId() == mPreferredDisplayId);
+                // This allows home activity to automatically launch on secondary task display area
+                // when it was added, if home was the top activity on default task display area,
+                // instead of sending new intent to the home activity on default display area.
+                && (!top.isActivityTypeHome() || top.getDisplayArea() == mPreferredTaskDisplayArea);
         if (!dontStart) {
             return START_SUCCESS;
         }
@@ -1866,7 +1863,7 @@
         // Don't use mStartActivity.task to show the toast. We're not starting a new activity but
         // reusing 'top'. Fields in mStartActivity may not be fully initialized.
         mSupervisor.handleNonResizableTaskIfNeeded(top.getTask(),
-                mLaunchParams.mWindowingMode, mPreferredDisplayId, topStack);
+                mLaunchParams.mWindowingMode, mPreferredTaskDisplayArea, topStack);
 
         return START_DELIVERED_TO_TOP;
     }
@@ -2010,7 +2007,7 @@
         mDoResume = false;
         mStartFlags = 0;
         mSourceRecord = null;
-        mPreferredDisplayId = INVALID_DISPLAY;
+        mPreferredTaskDisplayArea = null;
         mPreferredWindowingMode = WINDOWING_MODE_UNDEFINED;
 
         mInTask = null;
@@ -2060,9 +2057,9 @@
         // after we located a reusable task (which might be resided in another display).
         mSupervisor.getLaunchParamsController().calculate(inTask, r.info.windowLayout, r,
                 sourceRecord, options, PHASE_DISPLAY, mLaunchParams);
-        mPreferredDisplayId = mLaunchParams.hasPreferredDisplay()
-                ? mLaunchParams.mPreferredDisplayId
-                : DEFAULT_DISPLAY;
+        mPreferredTaskDisplayArea = mLaunchParams.hasPreferredTaskDisplayArea()
+                ? mLaunchParams.mPreferredTaskDisplayArea
+                : mRootWindowContainer.getDefaultTaskDisplayArea();
         mPreferredWindowingMode = mLaunchParams.mWindowingMode;
 
         mLaunchMode = r.launchMode;
@@ -2334,14 +2331,14 @@
             } else {
                 // Otherwise find the best task to put the activity in.
                 intentActivity =
-                        mRootWindowContainer.findTask(mStartActivity, mPreferredDisplayId);
+                        mRootWindowContainer.findTask(mStartActivity, mPreferredTaskDisplayArea);
             }
         }
 
         if (intentActivity != null
                 && (mStartActivity.isActivityTypeHome() || intentActivity.isActivityTypeHome())
-                && intentActivity.getDisplayId() != mPreferredDisplayId) {
-            // Do not reuse home activity on other displays.
+                && intentActivity.getDisplayArea() != mPreferredTaskDisplayArea) {
+            // Do not reuse home activity on other display areas.
             intentActivity = null;
         }
 
@@ -2363,7 +2360,7 @@
         // the same behavior as if a new instance was being started, which means not bringing it
         // to the front if the caller is not itself in the front.
         final boolean differentTopTask;
-        if (mPreferredDisplayId == mTargetStack.getDisplayId()) {
+        if (mTargetStack.getDisplayArea() == mPreferredTaskDisplayArea) {
             final ActivityStack focusStack = mTargetStack.getDisplay().getFocusedStack();
             final ActivityRecord curTop = (focusStack == null)
                     ? null : focusStack.topRunningNonDelayedActivityLocked(mNotTop);
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
index f4eb0d2..5220fb2 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
@@ -42,7 +42,9 @@
 import static android.content.pm.ApplicationInfo.FLAG_FACTORY_TEST;
 import static android.content.pm.ConfigurationInfo.GL_ES_VERSION_UNDEFINED;
 import static android.content.pm.PackageManager.FEATURE_ACTIVITIES_ON_SECONDARY_DISPLAYS;
+import static android.content.pm.PackageManager.FEATURE_CANT_SAVE_STATE;
 import static android.content.pm.PackageManager.FEATURE_FREEFORM_WINDOW_MANAGEMENT;
+import static android.content.pm.PackageManager.FEATURE_LEANBACK;
 import static android.content.pm.PackageManager.FEATURE_PICTURE_IN_PICTURE;
 import static android.content.pm.PackageManager.PERMISSION_GRANTED;
 import static android.os.FactoryTest.FACTORY_TEST_HIGH_LEVEL;
@@ -393,6 +395,7 @@
     /** The currently running heavy-weight process, if any. */
     WindowProcessController mHeavyWeightProcess = null;
     boolean mHasHeavyWeightFeature;
+    boolean mHasLeanbackFeature;
     /**
      * This is the process holding the activity the user last visited that is in a different process
      * from the one they are currently in.
@@ -734,8 +737,9 @@
 
     public void onSystemReady() {
         synchronized (mGlobalLock) {
-            mHasHeavyWeightFeature = mContext.getPackageManager().hasSystemFeature(
-                    PackageManager.FEATURE_CANT_SAVE_STATE);
+            final PackageManager pm = mContext.getPackageManager();
+            mHasHeavyWeightFeature = pm.hasSystemFeature(FEATURE_CANT_SAVE_STATE);
+            mHasLeanbackFeature = pm.hasSystemFeature(FEATURE_LEANBACK);
             mAssistUtils = new AssistUtils(mContext);
             mVrController.onSystemReady();
             mRecentTasks.onSystemReadyLocked();
@@ -2003,7 +2007,7 @@
             if (self.isState(
                     ActivityStack.ActivityState.RESUMED, ActivityStack.ActivityState.PAUSING)) {
                 self.getDisplay().mDisplayContent.mAppTransition.overridePendingAppTransition(
-                        packageName, enterAnim, exitAnim, null);
+                        packageName, enterAnim, exitAnim, null, null);
             }
 
             Binder.restoreCallingIdentity(origId);
@@ -2786,6 +2790,11 @@
         }
 
         final int prevMode = task.getWindowingMode();
+        if (prevMode == windowingMode) {
+            // The task is already in split-screen and with correct windowing mode.
+            return true;
+        }
+
         moveTaskToSplitScreenPrimaryTask(task, toTop);
         return prevMode != task.getWindowingMode();
     }
@@ -4060,7 +4069,7 @@
         return r != null
                 && r.getRootTask() != null
                 && r.inPinnedWindowingMode()
-                && r.getRootTask().isInStackLocked(r) != null;
+                && r.getRootTask().isInTask(r) != null;
     }
 
     @Override
@@ -4093,11 +4102,8 @@
                         r.setPictureInPictureParams(params);
                         final float aspectRatio = r.pictureInPictureArgs.getAspectRatio();
                         final List<RemoteAction> actions = r.pictureInPictureArgs.getActions();
-                        // Adjust the source bounds by the insets for the transition down
-                        final Rect sourceBounds = new Rect(
-                                r.pictureInPictureArgs.getSourceRectHint());
                         mRootWindowContainer.moveActivityToPinnedStack(
-                                r, sourceBounds, aspectRatio, "enterPictureInPictureMode");
+                                r, "enterPictureInPictureMode");
                         final ActivityStack stack = r.getRootTask();
                         stack.setPictureInPictureAspectRatio(aspectRatio);
                         stack.setPictureInPictureActions(actions);
@@ -5398,14 +5404,11 @@
         final boolean inputMethodExists = !(config.keyboard == Configuration.KEYBOARD_NOKEYS
                 && config.touchscreen == Configuration.TOUCHSCREEN_NOTOUCH
                 && config.navigation == Configuration.NAVIGATION_NONAV);
-        int modeType = config.uiMode & Configuration.UI_MODE_TYPE_MASK;
-        final boolean uiModeSupportsDialogs = (modeType != Configuration.UI_MODE_TYPE_CAR
-                && !(modeType == Configuration.UI_MODE_TYPE_WATCH && Build.IS_USER)
-                && modeType != Configuration.UI_MODE_TYPE_TELEVISION
-                && modeType != Configuration.UI_MODE_TYPE_VR_HEADSET);
         final boolean hideDialogsSet = Settings.Global.getInt(mContext.getContentResolver(),
                 HIDE_ERROR_DIALOGS, 0) != 0;
-        mShowDialogs = inputMethodExists && uiModeSupportsDialogs && !hideDialogsSet;
+        mShowDialogs = inputMethodExists
+                && ActivityTaskManager.currentUiModeSupportsErrorDialogs(mContext)
+                && !hideDialogsSet;
     }
 
     private void updateFontScaleIfNeeded(@UserIdInt int userId) {
@@ -6605,7 +6608,6 @@
                     }
                     return;
                 }
-                process.mIsImeProcess = true;
                 process.registerDisplayConfigurationListener(displayContent);
             }
         }
diff --git a/services/core/java/com/android/server/wm/AppTransition.java b/services/core/java/com/android/server/wm/AppTransition.java
index 6f1ddcd..c31d55c 100644
--- a/services/core/java/com/android/server/wm/AppTransition.java
+++ b/services/core/java/com/android/server/wm/AppTransition.java
@@ -1417,23 +1417,7 @@
                 : new TranslateAnimation(0, fromX, 0, fromY);
         set.addAnimation(scale);
         set.addAnimation(translation);
-
-        final IRemoteCallback callback = mAnimationFinishedCallback;
-        if (callback != null) {
-            set.setAnimationListener(new Animation.AnimationListener() {
-                @Override
-                public void onAnimationStart(Animation animation) { }
-
-                @Override
-                public void onAnimationEnd(Animation animation) {
-                    mHandler.sendMessage(PooledLambda.obtainMessage(
-                            AppTransition::doAnimationCallback, callback));
-                }
-
-                @Override
-                public void onAnimationRepeat(Animation animation) { }
-            });
-        }
+        setAppTransitionFinishedCallbackIfNeeded(set);
         return set;
     }
 
@@ -1671,6 +1655,7 @@
                     "applyAnimation: anim=%s nextAppTransition=ANIM_CUSTOM transit=%s "
                             + "isEntrance=%b Callers=%s",
                     a, appTransitionToString(transit), enter, Debug.getCallers(3));
+            setAppTransitionFinishedCallbackIfNeeded(a);
         } else if (mNextAppTransitionType == NEXT_TRANSIT_TYPE_CUSTOM_IN_PLACE) {
             a = loadAnimationRes(mNextAppTransitionPackage, mNextAppTransitionInPlace);
             ProtoLog.v(WM_DEBUG_APP_TRANSITIONS_ANIM,
@@ -1835,7 +1820,7 @@
     }
 
     void overridePendingAppTransition(String packageName, int enterAnim, int exitAnim,
-            IRemoteCallback startedCallback) {
+            IRemoteCallback startedCallback, IRemoteCallback endedCallback) {
         if (canOverridePendingAppTransition()) {
             clear();
             mNextAppTransitionType = NEXT_TRANSIT_TYPE_CUSTOM;
@@ -1844,6 +1829,7 @@
             mNextAppTransitionExit = exitAnim;
             postAnimationCallback();
             mNextAppTransitionCallback = startedCallback;
+            mAnimationFinishedCallback = endedCallback;
         }
     }
 
@@ -2331,6 +2317,25 @@
         }
     }
 
+    private void setAppTransitionFinishedCallbackIfNeeded(Animation anim) {
+        final IRemoteCallback callback = mAnimationFinishedCallback;
+        if (callback != null && anim != null) {
+            anim.setAnimationListener(new Animation.AnimationListener() {
+                @Override
+                public void onAnimationStart(Animation animation) { }
+
+                @Override
+                public void onAnimationEnd(Animation animation) {
+                    mHandler.sendMessage(PooledLambda.obtainMessage(
+                            AppTransition::doAnimationCallback, callback));
+                }
+
+                @Override
+                public void onAnimationRepeat(Animation animation) { }
+            });
+        }
+    }
+
     void removeAppTransitionTimeoutCallbacks() {
         mHandler.removeCallbacks(mHandleAppTransitionTimeoutRunnable);
     }
diff --git a/services/core/java/com/android/server/wm/BarController.java b/services/core/java/com/android/server/wm/BarController.java
index 57cdb0b..8b14095 100644
--- a/services/core/java/com/android/server/wm/BarController.java
+++ b/services/core/java/com/android/server/wm/BarController.java
@@ -168,7 +168,7 @@
     }
 
     boolean isTransparentAllowed(WindowState win) {
-        return win == null || !win.isLetterboxedOverlappingWith(mContentFrame);
+        return win == null || win.letterboxNotIntersectsOrFullyContains(mContentFrame);
     }
 
     boolean setBarShowingLw(final boolean show) {
diff --git a/services/core/java/com/android/server/wm/DisplayArea.java b/services/core/java/com/android/server/wm/DisplayArea.java
index a512337..9b34bd1 100644
--- a/services/core/java/com/android/server/wm/DisplayArea.java
+++ b/services/core/java/com/android/server/wm/DisplayArea.java
@@ -31,8 +31,10 @@
 import static com.android.server.wm.ProtoLogGroup.WM_DEBUG_ORIENTATION;
 import static com.android.server.wm.WindowContainerChildProto.DISPLAY_AREA;
 
+import android.content.res.Configuration;
 import android.graphics.Rect;
 import android.util.proto.ProtoOutputStream;
+import android.window.DisplayAreaInfo;
 import android.window.IDisplayAreaOrganizer;
 
 import com.android.server.policy.WindowManagerPolicy;
@@ -154,10 +156,26 @@
     }
 
     @Override
+    public void onConfigurationChanged(Configuration newParentConfig) {
+        super.onConfigurationChanged(newParentConfig);
+        if (mOrganizer != null) {
+            mOrganizerController.onDisplayAreaInfoChanged(mOrganizer, this);
+        }
+    }
+
+    @Override
     boolean isOrganized() {
         return mOrganizer != null;
     }
 
+
+    DisplayAreaInfo getDisplayAreaInfo() {
+        DisplayAreaInfo info = new DisplayAreaInfo(mRemoteToken.toWindowContainerToken(),
+                getDisplayContent().getDisplayId());
+        info.configuration.setTo(getConfiguration());
+        return info;
+    }
+
     /**
      * DisplayArea that contains WindowTokens, and orders them according to their type.
      */
diff --git a/services/core/java/com/android/server/wm/DisplayAreaOrganizerController.java b/services/core/java/com/android/server/wm/DisplayAreaOrganizerController.java
index f05783b..2c8c820 100644
--- a/services/core/java/com/android/server/wm/DisplayAreaOrganizerController.java
+++ b/services/core/java/com/android/server/wm/DisplayAreaOrganizerController.java
@@ -92,9 +92,28 @@
         }
     }
 
+    @Override
+    public void unregisterOrganizer(IDisplayAreaOrganizer organizer) {
+        enforceStackPermission("unregisterTaskOrganizer()");
+        final long origId = Binder.clearCallingIdentity();
+        try {
+            synchronized (mGlobalLock) {
+                mOrganizersByFeatureIds.entrySet().removeIf(
+                        entry -> entry.getValue().asBinder() == organizer.asBinder());
+
+                mService.mRootWindowContainer.forAllDisplayAreas((da) -> {
+                    if (da.mOrganizer != organizer) return;
+                    da.setOrganizer(null);
+                });
+            }
+        } finally {
+            Binder.restoreCallingIdentity(origId);
+        }
+    }
+
     void onDisplayAreaAppeared(IDisplayAreaOrganizer organizer, DisplayArea da) {
         try {
-            organizer.onDisplayAreaAppeared(da.mRemoteToken.toWindowContainerToken());
+            organizer.onDisplayAreaAppeared(da.getDisplayAreaInfo());
         } catch (RemoteException e) {
             // Oh well...
         }
@@ -102,7 +121,15 @@
 
     void onDisplayAreaVanished(IDisplayAreaOrganizer organizer, DisplayArea da) {
         try {
-            organizer.onDisplayAreaVanished(da.mRemoteToken.toWindowContainerToken());
+            organizer.onDisplayAreaVanished(da.getDisplayAreaInfo());
+        } catch (RemoteException e) {
+            // Oh well...
+        }
+    }
+
+    void onDisplayAreaInfoChanged(IDisplayAreaOrganizer organizer, DisplayArea da) {
+        try {
+            organizer.onDisplayAreaInfoChanged(da.getDisplayAreaInfo());
         } catch (RemoteException e) {
             // Oh well...
         }
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index 80a1a45..8f7fc9e 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -25,6 +25,7 @@
 import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
 import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
 import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW;
+import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
 import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECONDARY;
 import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
 import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSET;
@@ -72,7 +73,6 @@
 import static android.view.WindowManager.TRANSIT_ACTIVITY_OPEN;
 import static android.view.WindowManager.TRANSIT_TASK_OPEN;
 import static android.view.WindowManager.TRANSIT_TASK_TO_FRONT;
-import static android.window.DisplayAreaOrganizer.FEATURE_DEFAULT_TASK_CONTAINER;
 
 import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM;
 import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_CONFIG;
@@ -141,6 +141,7 @@
 import android.annotation.Nullable;
 import android.app.ActivityManager;
 import android.app.ActivityManagerInternal;
+import android.app.WindowConfiguration;
 import android.content.Context;
 import android.content.pm.ActivityInfo;
 import android.content.pm.ActivityInfo.ScreenOrientation;
@@ -198,7 +199,6 @@
 import android.view.WindowInsets;
 import android.view.WindowManager;
 import android.view.WindowManagerPolicyConstants.PointerEventListener;
-import android.window.ITaskOrganizer;
 
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.logging.MetricsLogger;
@@ -494,6 +494,7 @@
      * The launching activity which is using fixed rotation transformation.
      *
      * @see #handleTopActivityLaunchingInDifferentOrientation
+     * @see DisplayRotation#shouldRotateSeamlessly
      */
     ActivityRecord mFixedRotationLaunchingApp;
 
@@ -538,6 +539,15 @@
      */
     WindowState mInputMethodTarget;
 
+    /**
+     * The window which receives input from the input method. This is also a candidate of the
+     * input method control target.
+     */
+    WindowState mInputMethodInputTarget;
+
+    /**
+     * This controls the visibility and animation of the input method window.
+     */
     InsetsControlTarget mInputMethodControlTarget;
 
     /** If true hold off on modifying the animation layer of mInputMethodTarget */
@@ -563,7 +573,7 @@
     /** Corner radius that windows should have in order to match the display. */
     private final float mWindowCornerRadius;
 
-    private final SparseArray<ShellRoot> mShellRoots = new SparseArray<>();
+    final SparseArray<ShellRoot> mShellRoots = new SparseArray<>();
     RemoteInsetsControlTarget mRemoteInsetsControlTarget = null;
     private final IBinder.DeathRecipient mRemoteInsetsDeath =
             () -> {
@@ -1237,7 +1247,7 @@
 
         if (configChanged) {
             mWaitingForConfig = true;
-            mWmService.startFreezingDisplayLocked(0 /* exitAnim */, 0 /* enterAnim */, this);
+            mWmService.startFreezingDisplay(0 /* exitAnim */, 0 /* enterAnim */, this);
             sendNewConfiguration();
         }
 
@@ -1475,6 +1485,9 @@
             sendNewConfiguration();
             return true;
         }
+        // The display won't rotate (e.g. the orientation from sensor has updated again before
+        // applying rotation to display), so clear it to stop using seamless rotation.
+        mFixedRotationLaunchingApp = null;
         return false;
     }
 
@@ -3242,6 +3255,7 @@
         mInsetsStateController.getSourceProvider(ITYPE_IME).setWindow(win,
                 null /* frameProvider */, null /* imeFrameProvider */);
         computeImeTarget(true /* updateImeTarget */);
+        updateImeControlTarget();
     }
 
     /**
@@ -3357,34 +3371,18 @@
         }
     }
 
+    private boolean isImeControlledByApp() {
+        return mInputMethodTarget != null && !WindowConfiguration.isSplitScreenWindowingMode(
+                mInputMethodTarget.getWindowingMode());
+    }
+
     boolean isImeAttachedToApp() {
-        return (mInputMethodTarget != null && mInputMethodTarget.mActivityRecord != null
+        return isImeControlledByApp()
+                && mInputMethodTarget.mActivityRecord != null
                 && mInputMethodTarget.getWindowingMode() == WINDOWING_MODE_FULLSCREEN
                 // An activity with override bounds should be letterboxed inside its parent bounds,
                 // so it doesn't fill the screen.
-                && mInputMethodTarget.mActivityRecord.matchParentBounds());
-    }
-
-    /**
-     * Get IME target that should host IME when this display that is reparented to another
-     * WindowState.
-     * IME is never displayed in a child display.
-     * Use {@link WindowState#getImeControlTarget()} when IME target window
-     * which originally called
-     * {@link android.view.inputmethod.InputMethodManager#showSoftInput(View, int)} is known.
-     *
-     * @return {@link WindowState} of host that controls IME.
-     *         {@code null} when {@param dc} is not a virtual display.
-     * @see DisplayContent#reparent
-     */
-    @Nullable
-    WindowState getImeControlTarget() {
-        WindowState imeTarget = mInputMethodTarget;
-        if (imeTarget != null) {
-            return imeTarget.getImeControlTarget();
-        }
-
-        return getInsetsStateController().getImeSourceProvider().getControlTarget().getWindow();
+                && mInputMethodTarget.mActivityRecord.matchParentBounds();
     }
 
     /**
@@ -3394,7 +3392,6 @@
      *
      * @param target current IME target.
      * @return {@link WindowState} that can host IME.
-     * @see DisplayContent#getImeControlTarget()
      */
     WindowState getImeHostOrFallback(WindowState target) {
         if (target != null && target.getDisplayContent().canShowIme()) {
@@ -3421,42 +3418,35 @@
     }
 
     private void setInputMethodTarget(WindowState target, boolean targetWaitingAnim) {
-        // Always update control target. This is needed to handle rotation.
-        updateImeControlTarget(target);
         if (target == mInputMethodTarget && mInputMethodTargetWaitingAnim == targetWaitingAnim) {
             return;
         }
 
         mInputMethodTarget = target;
         mInputMethodTargetWaitingAnim = targetWaitingAnim;
-        assignWindowLayers(false /* setLayoutNeeded */);
+        assignWindowLayers(true /* setLayoutNeeded */);
         updateImeParent();
+        updateImeControlTarget();
     }
 
     /**
-     * IME control target is the window that controls the IME visibility and animation.
-     * This window is same as the window on which startInput is called.
-     * @param target the window that receives IME control. This is ignored if we aren't attaching
-     *               the IME to an app (eg. when in multi-window mode).
-     *
-     * @see #getImeControlTarget()
+     * The IME input target is the window which receives input from IME. It is also a candidate
+     * which controls the visibility and animation of the input method window.
      */
-    void updateImeControlTarget(InsetsControlTarget target) {
-        if (!isImeAttachedToApp() && mRemoteInsetsControlTarget != null) {
-            mInputMethodControlTarget = mRemoteInsetsControlTarget;
-        } else {
-            // Otherwise, we just use the ime target
-            mInputMethodControlTarget = target;
+    void setInputMethodInputTarget(WindowState target) {
+        if (mInputMethodInputTarget != target) {
+            mInputMethodInputTarget = target;
+            updateImeControlTarget();
         }
+    }
+
+    private void updateImeControlTarget() {
+        mInputMethodControlTarget = computeImeControlTarget();
         mInsetsStateController.onImeControlTargetChanged(mInputMethodControlTarget);
     }
 
     private void updateImeParent() {
-        // Force attaching IME to the display when magnifying, or it would be magnified with
-        // target app together.
-        final boolean shouldAttachToDisplay = (mMagnificationSpec != null);
-        final SurfaceControl newParent =
-                shouldAttachToDisplay ? mWindowContainers.getSurfaceControl() : computeImeParent();
+        final SurfaceControl newParent = computeImeParent();
         if (newParent != null) {
             getPendingTransaction().reparent(mImeWindowsContainers.mSurfaceControl, newParent);
             scheduleAnimation();
@@ -3464,20 +3454,36 @@
     }
 
     /**
+     * Computes the window where we hand IME control to.
+     */
+    @VisibleForTesting
+    InsetsControlTarget computeImeControlTarget() {
+        if (!isImeControlledByApp() && mRemoteInsetsControlTarget != null) {
+            return mRemoteInsetsControlTarget;
+        } else {
+            // Otherwise, we just use the ime target as received from IME.
+            return mInputMethodInputTarget;
+        }
+    }
+
+    /**
      * Computes the window the IME should be attached to.
      */
     @VisibleForTesting
     SurfaceControl computeImeParent() {
+        // Force attaching IME to the display when magnifying, or it would be magnified with
+        // target app together.
+        final boolean allowAttachToApp = (mMagnificationSpec == null);
 
         // Attach it to app if the target is part of an app and such app is covering the entire
         // screen. If it's not covering the entire screen the IME might extend beyond the apps
         // bounds.
-        if (isImeAttachedToApp()) {
+        if (allowAttachToApp && isImeAttachedToApp()) {
             return mInputMethodTarget.mActivityRecord.getSurfaceControl();
         }
 
-        // Otherwise, we just attach it to the display.
-        return mWindowContainers.getSurfaceControl();
+        // Otherwise, we just attach it to where the display area policy put it.
+        return mImeWindowsContainers.getParent().getSurfaceControl();
     }
 
     void setLayoutNeeded() {
@@ -4722,6 +4728,11 @@
         return mWindowContainers.getSurfaceControl();
     }
 
+    @VisibleForTesting
+    WindowContainer<?> getImeContainer() {
+        return mImeWindowsContainers;
+    }
+
     SurfaceControl getOverlayLayer() {
         return mOverlayContainers.getSurfaceControl();
     }
@@ -5028,6 +5039,7 @@
         return activityType == ACTIVITY_TYPE_STANDARD
                 && (windowingMode == WINDOWING_MODE_FULLSCREEN
                 || windowingMode == WINDOWING_MODE_FREEFORM
+                || windowingMode == WINDOWING_MODE_PINNED
                 || windowingMode == WINDOWING_MODE_SPLIT_SCREEN_SECONDARY
                 || windowingMode == WINDOWING_MODE_MULTI_WINDOW);
     }
@@ -5437,6 +5449,46 @@
         return mWmService.mDisplayManagerInternal.getDisplayPosition(getDisplayId());
     }
 
+    /**
+     * Locates the appropriate target window for scroll capture. The search progresses top to
+     * bottom.
+     * If {@code searchBehind} is non-null, the search will only consider windows behind this one.
+     * If a valid taskId is specified, the target window must belong to the given task.
+     *
+     * @param searchBehind a window used to filter the search to windows behind it, or null to begin
+     *                     the search at the top window of the display
+     * @param taskId       specifies the id of a task the result must belong to or
+     *                     {@link android.app.ActivityTaskManager#INVALID_TASK_ID INVALID_TASK_ID}
+     *                     to match any window
+     * @return the located window or null if none could be found matching criteria
+     */
+    @Nullable
+    WindowState findScrollCaptureTargetWindow(@Nullable WindowState searchBehind, int taskId) {
+        return getWindow(new Predicate<WindowState>() {
+            boolean behindTopWindow = (searchBehind == null); // optional filter
+            @Override
+            public boolean test(WindowState nextWindow) {
+                // Skip through all windows until we pass topWindow (if specified)
+                if (!behindTopWindow) {
+                    if (nextWindow == searchBehind) {
+                        behindTopWindow = true;
+                    }
+                    return false; /* continue */
+                }
+                if (taskId != INVALID_TASK_ID) {
+                    Task task = nextWindow.getTask();
+                    if (task == null || !task.isTaskId(taskId)) {
+                        return false; /* continue */
+                    }
+                }
+                if (!nextWindow.canReceiveKeys()) {
+                    return false; /* continue */
+                }
+                return true; /* stop */
+            }
+        });
+    }
+
     class RemoteInsetsControlTarget implements InsetsControlTarget {
         private final IDisplayWindowInsetsController mRemoteInsetsController;
 
@@ -5482,4 +5534,34 @@
             }
         }
     }
+
+    /**
+     * Returns the number of window tokens without surface on this display. A {@link WindowToken}
+     * won't have its {@link SurfaceControl} until a window is added to a {@link WindowToken}.
+     * The purpose of this method is to accumulate non-window containing {@link WindowToken}s and
+     * limit the usage if the count exceeds a number.
+     *
+     * @param callingUid app calling uid
+     * @return the number of window tokens without surface on this display
+     * @see WindowToken#addWindow(WindowState)
+     */
+    int getWindowTokensWithoutSurfaceCount(int callingUid) {
+        List<WindowToken> tokens = new ArrayList<>(mTokenMap.values());
+        int count = 0;
+        for (int i = tokens.size() - 1; i >= 0; i--) {
+            final WindowToken token = tokens.get(i);
+            if (callingUid != token.getOwnerUid()) {
+                continue;
+            }
+            // Skip if token is an Activity
+            if (token.asActivityRecord() != null) {
+                continue;
+            }
+            if (token.mSurfaceControl != null) {
+                continue;
+            }
+            count++;
+        }
+        return count;
+    }
 }
diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java
index e9d3d56..8aace21 100644
--- a/services/core/java/com/android/server/wm/DisplayPolicy.java
+++ b/services/core/java/com/android/server/wm/DisplayPolicy.java
@@ -261,6 +261,8 @@
     @Px
     private int mRightGestureInset;
 
+    private boolean mNavButtonForcedVisible;
+
     StatusBarManagerInternal getStatusBarManagerInternal() {
         synchronized (mServiceAcquireLock) {
             if (mStatusBarManagerInternal == null) {
@@ -1046,12 +1048,14 @@
                             // calculate inset.
                             if (navigationBarPosition(displayFrames.mDisplayWidth,
                                     displayFrames.mDisplayHeight,
-                                    displayFrames.mRotation) == NAV_BAR_BOTTOM) {
+                                    displayFrames.mRotation) == NAV_BAR_BOTTOM
+                                    && !mNavButtonForcedVisible) {
+
                                 sTmpRect.set(displayFrames.mUnrestricted);
                                 sTmpRect.intersectUnchecked(displayFrames.mDisplayCutoutSafe);
                                 inOutFrame.top = sTmpRect.bottom
                                         - getNavigationBarHeight(displayFrames.mRotation,
-                                                mDisplayContent.getConfiguration().uiMode);
+                                        mDisplayContent.getConfiguration().uiMode);
                             }
                         },
 
@@ -2810,6 +2814,8 @@
         mNavBarOpacityMode = res.getInteger(R.integer.config_navBarOpacityMode);
         mLeftGestureInset = mGestureNavigationSettingsObserver.getLeftSensitivity(res);
         mRightGestureInset = mGestureNavigationSettingsObserver.getRightSensitivity(res);
+        mNavButtonForcedVisible =
+                mGestureNavigationSettingsObserver.areNavigationButtonForcedVisible();
         mNavigationBarLetsThroughTaps = res.getBoolean(R.bool.config_navBarTapThrough);
         mNavigationBarAlwaysShowOnSideGesture =
                 res.getBoolean(R.bool.config_navBarAlwaysShowOnSideEdgeGesture);
@@ -3783,13 +3789,14 @@
      * @param screenshotType The type of screenshot, for example either
      *                       {@link WindowManager#TAKE_SCREENSHOT_FULLSCREEN} or
      *                       {@link WindowManager#TAKE_SCREENSHOT_SELECTED_REGION}
+     * @param source Where the screenshot originated from (see WindowManager.ScreenshotSource)
      */
-    public void takeScreenshot(int screenshotType) {
+    public void takeScreenshot(int screenshotType, int source) {
         if (mScreenshotHelper != null) {
             mScreenshotHelper.takeScreenshot(screenshotType,
                     mStatusBar != null && mStatusBar.isVisibleLw(),
                     mNavigationBar != null && mNavigationBar.isVisibleLw(),
-                    mHandler, null /* completionConsumer */);
+                    source, mHandler, null /* completionConsumer */);
         }
     }
 
diff --git a/services/core/java/com/android/server/wm/DisplayRotation.java b/services/core/java/com/android/server/wm/DisplayRotation.java
index bef80f0..ebfe70c 100644
--- a/services/core/java/com/android/server/wm/DisplayRotation.java
+++ b/services/core/java/com/android/server/wm/DisplayRotation.java
@@ -537,8 +537,29 @@
     }
 
     void prepareNormalRotationAnimation() {
+        cancelSeamlessRotation();
         final RotationAnimationPair anim = selectRotationAnimation();
-        mService.startFreezingDisplayLocked(anim.mExit, anim.mEnter, mDisplayContent);
+        mService.startFreezingDisplay(anim.mExit, anim.mEnter, mDisplayContent);
+    }
+
+    /**
+     * This ensures that normal rotation animation is used. E.g. {@link #mRotatingSeamlessly} was
+     * set by previous {@link #updateRotationUnchecked}, but another orientation change happens
+     * before calling {@link DisplayContent#sendNewConfiguration} (remote rotation hasn't finished)
+     * and it doesn't choose seamless rotation.
+     */
+    void cancelSeamlessRotation() {
+        if (!mRotatingSeamlessly) {
+            return;
+        }
+        mDisplayContent.forAllWindows(w -> {
+            if (w.mSeamlesslyRotated) {
+                w.finishSeamlessRotation(false /* timeout */);
+                w.mSeamlesslyRotated = false;
+            }
+        }, true /* traverseTopToBottom */);
+        mSeamlessRotationCount = 0;
+        mRotatingSeamlessly = false;
     }
 
     private void prepareSeamlessRotation() {
diff --git a/services/core/java/com/android/server/wm/DockedStackDividerController.java b/services/core/java/com/android/server/wm/DockedStackDividerController.java
index 20738ed..803bec8 100644
--- a/services/core/java/com/android/server/wm/DockedStackDividerController.java
+++ b/services/core/java/com/android/server/wm/DockedStackDividerController.java
@@ -45,6 +45,11 @@
 
     void setTouchRegion(Rect touchRegion) {
         mTouchRegion.set(touchRegion);
+        // We need to report touchable region changes to accessibility.
+        if (mDisplayContent.mWmService.mAccessibilityController != null) {
+            mDisplayContent.mWmService.mAccessibilityController.onSomeWindowResizedOrMovedLocked(
+                    mDisplayContent.getDisplayId());
+        }
     }
 
     void getTouchRegion(Rect outRegion) {
diff --git a/services/core/java/com/android/server/wm/InputMonitor.java b/services/core/java/com/android/server/wm/InputMonitor.java
index 8b34b9b..656dca5 100644
--- a/services/core/java/com/android/server/wm/InputMonitor.java
+++ b/services/core/java/com/android/server/wm/InputMonitor.java
@@ -487,7 +487,8 @@
                     || w.cantReceiveTouchInput()) {
                 if (w.mWinAnimator.hasSurface()) {
                     mInputTransaction.setInputWindowInfo(
-                            w.mWinAnimator.mSurfaceController.mSurfaceControl, mInvalidInputWindow);
+                        w.mWinAnimator.mSurfaceController.getClientViewRootSurface(),
+                        mInvalidInputWindow);
                 }
                 // Skip this window because it cannot possibly receive input.
                 return;
@@ -560,7 +561,8 @@
 
             if (w.mWinAnimator.hasSurface()) {
                 mInputTransaction.setInputWindowInfo(
-                        w.mWinAnimator.mSurfaceController.mSurfaceControl, inputWindowHandle);
+                    w.mWinAnimator.mSurfaceController.getClientViewRootSurface(),
+                    inputWindowHandle);
             }
         }
     }
diff --git a/services/core/java/com/android/server/wm/InsetsPolicy.java b/services/core/java/com/android/server/wm/InsetsPolicy.java
index 61a199a..5a9bf80 100644
--- a/services/core/java/com/android/server/wm/InsetsPolicy.java
+++ b/services/core/java/com/android/server/wm/InsetsPolicy.java
@@ -126,13 +126,22 @@
             mPolicy.getStatusBarManagerInternal().showTransient(mDisplayContent.getDisplayId(),
                     mShowingTransientTypes.toArray());
             updateBarControlTarget(mFocusedWin);
-            InsetsState state = new InsetsState(mStateController.getRawInsetsState());
-            startAnimation(true /* show */, () -> {
+
+            // The leashes can be created while updating bar control target. The surface transaction
+            // of the new leashes might not be applied yet. The callback posted here ensures we can
+            // get the valid leashes because the surface transaction will be applied in the next
+            // animation frame which will be triggered if a new leash is created.
+            mDisplayContent.mWmService.mAnimator.getChoreographer().postFrameCallback(time -> {
                 synchronized (mDisplayContent.mWmService.mGlobalLock) {
-                    mStateController.notifyInsetsChanged();
+                    final InsetsState state = new InsetsState(mStateController.getRawInsetsState());
+                    startAnimation(true /* show */, () -> {
+                        synchronized (mDisplayContent.mWmService.mGlobalLock) {
+                            mStateController.notifyInsetsChanged();
+                        }
+                    }, state);
+                    mStateController.onInsetsModified(mDummyControlTarget, state);
                 }
-            }, state);
-            mStateController.onInsetsModified(mDummyControlTarget, state);
+            });
         }
     }
 
diff --git a/services/core/java/com/android/server/wm/InsetsSourceProvider.java b/services/core/java/com/android/server/wm/InsetsSourceProvider.java
index cb0d853..351743f 100644
--- a/services/core/java/com/android/server/wm/InsetsSourceProvider.java
+++ b/services/core/java/com/android/server/wm/InsetsSourceProvider.java
@@ -66,6 +66,7 @@
     private TriConsumer<DisplayFrames, WindowState, Rect> mFrameProvider;
     private TriConsumer<DisplayFrames, WindowState, Rect> mImeFrameProvider;
     private final Rect mImeOverrideFrame = new Rect();
+    private boolean mIsLeashReadyForDispatching;
 
     /** The visibility override from the current controlling window. */
     private boolean mClientVisible;
@@ -269,6 +270,11 @@
         final Transaction t = mDisplayContent.getPendingTransaction();
         mWin.startAnimation(t, mAdapter, !mClientVisible /* hidden */,
                 ANIMATION_TYPE_INSETS_CONTROL, null /* animationFinishedCallback */);
+
+        // The leash was just created. We cannot dispatch it until its surface transaction is
+        // applied. Otherwise, the client's operation to the leash might be overwritten by us.
+        mIsLeashReadyForDispatching = false;
+
         final SurfaceControl leash = mAdapter.mCapturedLeash;
         final long frameNumber = mFinishSeamlessRotateFrameNumber;
         mFinishSeamlessRotateFrameNumber = -1;
@@ -310,6 +316,10 @@
         return true;
     }
 
+    void onSurfaceTransactionApplied() {
+        mIsLeashReadyForDispatching = true;
+    }
+
     private void setClientVisible(boolean clientVisible) {
         if (mClientVisible == clientVisible) {
             return;
@@ -331,6 +341,13 @@
 
     InsetsSourceControl getControl(InsetsControlTarget target) {
         if (target == mControlTarget) {
+            if (!mIsLeashReadyForDispatching && mControl != null) {
+                // The surface transaction of preparing leash is not applied yet. We don't send it
+                // to the client in case that the client applies its transaction sooner than ours
+                // that we could unexpectedly overwrite the surface state.
+                return new InsetsSourceControl(mControl.getType(), null /* leash */,
+                        mControl.getSurfacePosition());
+            }
             return mControl;
         }
         if (target == mFakeControlTarget) {
diff --git a/services/core/java/com/android/server/wm/InsetsStateController.java b/services/core/java/com/android/server/wm/InsetsStateController.java
index ba14d48..765f980 100644
--- a/services/core/java/com/android/server/wm/InsetsStateController.java
+++ b/services/core/java/com/android/server/wm/InsetsStateController.java
@@ -171,7 +171,7 @@
 
         if (aboveIme) {
             state = new InsetsState(state);
-            state.removeSource(ITYPE_IME);
+            state.setSourceVisible(ITYPE_IME, false);
         }
 
         return state;
@@ -407,6 +407,10 @@
             return;
         }
         mDisplayContent.mWmService.mAnimator.addAfterPrepareSurfacesRunnable(() -> {
+            for (int i = mProviders.size() - 1; i >= 0; i--) {
+                final InsetsSourceProvider provider = mProviders.valueAt(i);
+                provider.onSurfaceTransactionApplied();
+            }
             for (int i = mPendingControlChanged.size() - 1; i >= 0; i--) {
                 final InsetsControlTarget controlTarget = mPendingControlChanged.valueAt(i);
                 controlTarget.notifyInsetsControlChanged();
diff --git a/services/core/java/com/android/server/wm/LaunchParamsController.java b/services/core/java/com/android/server/wm/LaunchParamsController.java
index a9820ef..4cd3180 100644
--- a/services/core/java/com/android/server/wm/LaunchParamsController.java
+++ b/services/core/java/com/android/server/wm/LaunchParamsController.java
@@ -17,7 +17,6 @@
 package com.android.server.wm;
 
 import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
-import static android.view.Display.DEFAULT_DISPLAY;
 import static android.view.Display.INVALID_DISPLAY;
 
 import static com.android.server.wm.LaunchParamsController.LaunchParamsModifier.PHASE_BOUNDS;
@@ -26,6 +25,7 @@
 import static com.android.server.wm.LaunchParamsController.LaunchParamsModifier.RESULT_SKIP;
 
 import android.annotation.IntDef;
+import android.annotation.Nullable;
 import android.app.ActivityOptions;
 import android.content.pm.ActivityInfo.WindowLayout;
 import android.graphics.Rect;
@@ -108,11 +108,13 @@
 
         if (activity != null && activity.requestedVrComponent != null) {
             // Check if the Activity is a VR activity. If so, it should be launched in main display.
-            result.mPreferredDisplayId = DEFAULT_DISPLAY;
+            result.mPreferredTaskDisplayArea = mService.mRootWindowContainer
+                    .getDefaultTaskDisplayArea();
         } else if (mService.mVr2dDisplayId != INVALID_DISPLAY) {
             // Get the virtual display ID from ActivityTaskManagerService. If that's set we
             // should always use that.
-            result.mPreferredDisplayId = mService.mVr2dDisplayId;
+            result.mPreferredTaskDisplayArea = mService.mRootWindowContainer
+                    .getDisplayContent(mService.mVr2dDisplayId).getDefaultTaskDisplayArea();
         }
     }
 
@@ -136,9 +138,10 @@
         mService.deferWindowLayout();
 
         try {
-            if (mTmpParams.hasPreferredDisplay()
-                    && mTmpParams.mPreferredDisplayId != task.getStack().getDisplay().mDisplayId) {
-                mService.moveStackToDisplay(task.getRootTaskId(), mTmpParams.mPreferredDisplayId);
+            if (mTmpParams.mPreferredTaskDisplayArea != null
+                    && task.getDisplayArea() != mTmpParams.mPreferredTaskDisplayArea) {
+                mService.mRootWindowContainer.moveStackToTaskDisplayArea(task.getRootTaskId(),
+                        mTmpParams.mPreferredTaskDisplayArea, true /* onTop */);
             }
 
             if (mTmpParams.hasWindowingMode()
@@ -184,8 +187,9 @@
         /** The bounds within the parent container. */
         final Rect mBounds = new Rect();
 
-        /** The id of the display the {@link Task} would prefer to be on. */
-        int mPreferredDisplayId;
+        /** The display area the {@link Task} would prefer to be on. */
+        @Nullable
+        TaskDisplayArea mPreferredTaskDisplayArea;
 
         /** The windowing mode to be in. */
         int mWindowingMode;
@@ -193,20 +197,20 @@
         /** Sets values back to default. {@link #isEmpty} will return {@code true} once called. */
         void reset() {
             mBounds.setEmpty();
-            mPreferredDisplayId = INVALID_DISPLAY;
+            mPreferredTaskDisplayArea = null;
             mWindowingMode = WINDOWING_MODE_UNDEFINED;
         }
 
         /** Copies the values set on the passed in {@link LaunchParams}. */
         void set(LaunchParams params) {
             mBounds.set(params.mBounds);
-            mPreferredDisplayId = params.mPreferredDisplayId;
+            mPreferredTaskDisplayArea = params.mPreferredTaskDisplayArea;
             mWindowingMode = params.mWindowingMode;
         }
 
         /** Returns {@code true} if no values have been explicitly set. */
         boolean isEmpty() {
-            return mBounds.isEmpty() && mPreferredDisplayId == INVALID_DISPLAY
+            return mBounds.isEmpty() && mPreferredTaskDisplayArea == null
                     && mWindowingMode == WINDOWING_MODE_UNDEFINED;
         }
 
@@ -214,8 +218,8 @@
             return mWindowingMode != WINDOWING_MODE_UNDEFINED;
         }
 
-        boolean hasPreferredDisplay() {
-            return mPreferredDisplayId != INVALID_DISPLAY;
+        boolean hasPreferredTaskDisplayArea() {
+            return mPreferredTaskDisplayArea != null;
         }
 
         @Override
@@ -225,7 +229,7 @@
 
             LaunchParams that = (LaunchParams) o;
 
-            if (mPreferredDisplayId != that.mPreferredDisplayId) return false;
+            if (mPreferredTaskDisplayArea != that.mPreferredTaskDisplayArea) return false;
             if (mWindowingMode != that.mWindowingMode) return false;
             return mBounds != null ? mBounds.equals(that.mBounds) : that.mBounds == null;
         }
@@ -233,7 +237,8 @@
         @Override
         public int hashCode() {
             int result = mBounds != null ? mBounds.hashCode() : 0;
-            result = 31 * result + mPreferredDisplayId;
+            result = 31 * result + (mPreferredTaskDisplayArea != null
+                    ? mPreferredTaskDisplayArea.hashCode() : 0);
             result = 31 * result + mWindowingMode;
             return result;
         }
diff --git a/services/core/java/com/android/server/wm/LaunchParamsPersister.java b/services/core/java/com/android/server/wm/LaunchParamsPersister.java
index 9371c0e..a974332 100644
--- a/services/core/java/com/android/server/wm/LaunchParamsPersister.java
+++ b/services/core/java/com/android/server/wm/LaunchParamsPersister.java
@@ -318,7 +318,9 @@
         final DisplayContent display = mSupervisor.mRootWindowContainer.getDisplayContent(
                 persistableParams.mDisplayUniqueId);
         if (display != null) {
-            outParams.mPreferredDisplayId =  display.mDisplayId;
+            // TODO(b/153764726): Investigate if task display area needs to be persisted vs
+            // always choosing the default one.
+            outParams.mPreferredTaskDisplayArea = display.getDefaultTaskDisplayArea();
         }
         outParams.mWindowingMode = persistableParams.mWindowingMode;
         outParams.mBounds.set(persistableParams.mBounds);
diff --git a/services/core/java/com/android/server/wm/Letterbox.java b/services/core/java/com/android/server/wm/Letterbox.java
index 6721ef8..00a4be3 100644
--- a/services/core/java/com/android/server/wm/Letterbox.java
+++ b/services/core/java/com/android/server/wm/Letterbox.java
@@ -77,10 +77,10 @@
         mOuter.set(outer);
         mInner.set(inner);
 
-        mTop.layout(outer.left, outer.top, inner.right, inner.top, surfaceOrigin);
-        mLeft.layout(outer.left, inner.top, inner.left, outer.bottom, surfaceOrigin);
-        mBottom.layout(inner.left, inner.bottom, outer.right, outer.bottom, surfaceOrigin);
-        mRight.layout(inner.right, outer.top, outer.right, inner.bottom, surfaceOrigin);
+        mTop.layout(outer.left, outer.top, outer.right, inner.top, surfaceOrigin);
+        mLeft.layout(outer.left, outer.top, inner.left, outer.bottom, surfaceOrigin);
+        mBottom.layout(outer.left, inner.bottom, outer.right, outer.bottom, surfaceOrigin);
+        mRight.layout(inner.right, outer.top, outer.right, outer.bottom, surfaceOrigin);
     }
 
 
@@ -101,17 +101,29 @@
     }
 
     /**
-     * Returns true if any part of the letterbox overlaps with the given {@code rect}.
+     * Returns {@code true} if the letterbox does not overlap with the bar, or the letterbox can
+     * fully cover the window frame.
+     *
+     * @param rect The area of the window frame.
      */
-    public boolean isOverlappingWith(Rect rect) {
+    boolean notIntersectsOrFullyContains(Rect rect) {
+        int emptyCount = 0;
+        int noOverlappingCount = 0;
         for (LetterboxSurface surface : mSurfaces) {
-            if (surface.isOverlappingWith(rect)) {
+            final Rect surfaceRect = surface.mLayoutFrameGlobal;
+            if (surfaceRect.isEmpty()) {
+                // empty letterbox
+                emptyCount++;
+            } else if (!Rect.intersects(surfaceRect, rect)) {
+                // no overlapping
+                noOverlappingCount++;
+            } else if (surfaceRect.contains(rect)) {
+                // overlapping and covered
                 return true;
             }
         }
-        return false;
+        return (emptyCount + noOverlappingCount) == mSurfaces.length;
     }
-
     /**
      * Hides the letterbox.
      *
@@ -282,17 +294,6 @@
             return Math.max(0, mLayoutFrameGlobal.height());
         }
 
-        /**
-         * Returns if the given {@code rect} overlaps with this letterbox piece.
-         * @param rect the area to check for overlap in global coordinates
-         */
-        public boolean isOverlappingWith(Rect rect) {
-            if (mLayoutFrameGlobal.isEmpty()) {
-                return false;
-            }
-            return Rect.intersects(rect, mLayoutFrameGlobal);
-        }
-
         public void applySurfaceChanges(SurfaceControl.Transaction t) {
             if (mSurfaceFrameRelative.equals(mLayoutFrameRelative)) {
                 // Nothing changed.
diff --git a/services/core/java/com/android/server/wm/RecentTasks.java b/services/core/java/com/android/server/wm/RecentTasks.java
index 9b30103..09700c5 100644
--- a/services/core/java/com/android/server/wm/RecentTasks.java
+++ b/services/core/java/com/android/server/wm/RecentTasks.java
@@ -1398,10 +1398,9 @@
             return false;
         }
 
-        // Trim tasks that are in stacks that are behind the home stack
+        // Trim tasks that are behind the home task.
         final TaskDisplayArea taskDisplayArea = stack.getDisplayArea();
-        return taskDisplayArea.getIndexOf(stack) < taskDisplayArea.getIndexOf(
-                taskDisplayArea.getRootHomeTask());
+        return task.compareTo(taskDisplayArea.getRootHomeTask()) < 0;
     }
 
     /** Remove the tasks that user may not be able to return. */
diff --git a/services/core/java/com/android/server/wm/RecentsAnimation.java b/services/core/java/com/android/server/wm/RecentsAnimation.java
index 0a9878d..bded651 100644
--- a/services/core/java/com/android/server/wm/RecentsAnimation.java
+++ b/services/core/java/com/android/server/wm/RecentsAnimation.java
@@ -165,17 +165,6 @@
         ProtoLog.d(WM_DEBUG_RECENTS_ANIMATIONS, "startRecentsActivity(): intent=%s", mTargetIntent);
         Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "RecentsAnimation#startRecentsActivity");
 
-        // TODO(multi-display) currently only support recents animation in default display.
-        final DisplayContent dc =
-                mService.mRootWindowContainer.getDefaultDisplay().mDisplayContent;
-        if (!mWindowManager.canStartRecentsAnimation()) {
-            notifyAnimationCancelBeforeStart(recentsAnimationRunner);
-            ProtoLog.d(WM_DEBUG_RECENTS_ANIMATIONS,
-                    "Can't start recents animation, nextAppTransition=%s",
-                        dc.mAppTransition.getAppTransition());
-            return;
-        }
-
         // If the activity is associated with the recents stack, then try and get that first
         ActivityStack targetStack = mDefaultTaskDisplayArea.getStack(WINDOWING_MODE_UNDEFINED,
                 mTargetActivityType);
@@ -313,7 +302,7 @@
                     // Prefer to use the original target activity instead of top activity because
                     // we may have moved another task to top (starting 3p launcher).
                     final ActivityRecord targetActivity = targetStack != null
-                            ? targetStack.isInStackLocked(mLaunchedTargetActivity)
+                            ? targetStack.isInTask(mLaunchedTargetActivity)
                             : null;
                     ProtoLog.d(WM_DEBUG_RECENTS_ANIMATIONS,
                             "onAnimationFinished(): targetStack=%s targetActivity=%s "
diff --git a/services/core/java/com/android/server/wm/RecentsAnimationController.java b/services/core/java/com/android/server/wm/RecentsAnimationController.java
index 54210ae..2ce10a7 100644
--- a/services/core/java/com/android/server/wm/RecentsAnimationController.java
+++ b/services/core/java/com/android/server/wm/RecentsAnimationController.java
@@ -898,11 +898,11 @@
         TaskAnimationAdapter(Task task, boolean isRecentTaskInvisible) {
             mTask = task;
             mIsRecentTaskInvisible = isRecentTaskInvisible;
-            mBounds.set(mTask.getDisplayedBounds());
+            mBounds.set(mTask.getBounds());
 
             mLocalBounds.set(mBounds);
             Point tmpPos = new Point();
-            mTask.getRelativeDisplayedPosition(tmpPos);
+            mTask.getRelativePosition(tmpPos);
             mLocalBounds.offsetTo(tmpPos.x, tmpPos.y);
         }
 
diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java
index 1a70de7..77841dc2 100644
--- a/services/core/java/com/android/server/wm/RootWindowContainer.java
+++ b/services/core/java/com/android/server/wm/RootWindowContainer.java
@@ -42,6 +42,7 @@
 
 import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT;
 import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
+import static com.android.server.wm.ActivityStack.ActivityState.FINISHING;
 import static com.android.server.wm.ActivityStack.ActivityState.PAUSED;
 import static com.android.server.wm.ActivityStack.ActivityState.RESUMED;
 import static com.android.server.wm.ActivityStack.ActivityState.STOPPED;
@@ -139,6 +140,7 @@
 import android.view.DisplayInfo;
 import android.view.SurfaceControl;
 import android.view.WindowManager;
+import android.window.WindowContainerToken;
 
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.app.ResolverActivity;
@@ -1519,8 +1521,7 @@
         if (taskDisplayArea == getDefaultTaskDisplayArea()) {
             homeIntent = mService.getHomeIntent();
             aInfo = resolveHomeActivity(userId, homeIntent);
-        } else if (taskDisplayArea.getDisplayId() == DEFAULT_DISPLAY
-                || shouldPlaceSecondaryHomeOnDisplay(taskDisplayArea.getDisplayId())) {
+        } else if (shouldPlaceSecondaryHomeOnDisplayArea(taskDisplayArea)) {
             Pair<ActivityInfo, Intent> info = resolveSecondaryHomeActivity(userId, taskDisplayArea);
             aInfo = info.first;
             homeIntent = info.second;
@@ -1529,7 +1530,7 @@
             return false;
         }
 
-        if (!canStartHomeOnDisplay(aInfo, taskDisplayArea.getDisplayId(), allowInstrumenting)) {
+        if (!canStartHomeOnDisplayArea(aInfo, taskDisplayArea, allowInstrumenting)) {
             return false;
         }
 
@@ -1625,8 +1626,7 @@
         }
 
         if (aInfo != null) {
-            if (!canStartHomeOnDisplay(aInfo, taskDisplayArea.getDisplayId(),
-                    false /* allowInstrumenting */)) {
+            if (!canStartHomeOnDisplayArea(aInfo, taskDisplayArea, false /* allowInstrumenting */)) {
                 aInfo = null;
             }
         }
@@ -1683,19 +1683,19 @@
     }
 
     /**
-     * Check if the display is valid for secondary home activity.
-     * @param displayId The id of the target display.
+     * Check if the display area is valid for secondary home activity.
+     * @param taskDisplayArea The target display area.
      * @return {@code true} if allow to launch, {@code false} otherwise.
      */
-    boolean shouldPlaceSecondaryHomeOnDisplay(int displayId) {
-        if (displayId == DEFAULT_DISPLAY) {
+    boolean shouldPlaceSecondaryHomeOnDisplayArea(TaskDisplayArea taskDisplayArea) {
+        if (getDefaultTaskDisplayArea() == taskDisplayArea) {
             throw new IllegalArgumentException(
-                    "shouldPlaceSecondaryHomeOnDisplay: Should not be DEFAULT_DISPLAY");
-        } else if (displayId == INVALID_DISPLAY) {
+                    "shouldPlaceSecondaryHomeOnDisplay: Should not be on default task container");
+        } else if (taskDisplayArea == null) {
             return false;
         }
 
-        if (!mService.mSupportsMultiDisplay) {
+        if (taskDisplayArea.getDisplayId() != DEFAULT_DISPLAY && !mService.mSupportsMultiDisplay) {
             // Can't launch home on secondary display if device does not support multi-display.
             return false;
         }
@@ -1704,16 +1704,16 @@
                 mService.mContext.getContentResolver(),
                 Settings.Global.DEVICE_PROVISIONED, 0) != 0;
         if (!deviceProvisioned) {
-            // Can't launch home on secondary display before device is provisioned.
+            // Can't launch home on secondary display areas before device is provisioned.
             return false;
         }
 
         if (!StorageManager.isUserKeyUnlocked(mCurrentUser)) {
-            // Can't launch home on secondary displays if device is still locked.
+            // Can't launch home on secondary display areas if device is still locked.
             return false;
         }
 
-        final DisplayContent display = getDisplayContent(displayId);
+        final DisplayContent display = taskDisplayArea.getDisplayContent();
         if (display == null || display.isRemoved() || !display.supportsSystemDecorations()) {
             // Can't launch home on display that doesn't support system decorations.
             return false;
@@ -1725,11 +1725,11 @@
     /**
      * Check if home activity start should be allowed on a display.
      * @param homeInfo {@code ActivityInfo} of the home activity that is going to be launched.
-     * @param displayId The id of the target display.
+     * @param taskDisplayArea The target display area.
      * @param allowInstrumenting Whether launching home should be allowed if being instrumented.
      * @return {@code true} if allow to launch, {@code false} otherwise.
      */
-    boolean canStartHomeOnDisplay(ActivityInfo homeInfo, int displayId,
+    boolean canStartHomeOnDisplayArea(ActivityInfo homeInfo, TaskDisplayArea taskDisplayArea,
             boolean allowInstrumenting) {
         if (mService.mFactoryTest == FactoryTest.FACTORY_TEST_LOW_LEVEL
                 && mService.mTopAction == null) {
@@ -1745,13 +1745,15 @@
             return false;
         }
 
+        final int displayId = taskDisplayArea != null ? taskDisplayArea.getDisplayId()
+                : INVALID_DISPLAY;
         if (displayId == DEFAULT_DISPLAY || (displayId != INVALID_DISPLAY
                 && displayId == mService.mVr2dDisplayId)) {
             // No restrictions to default display or vr 2d display.
             return true;
         }
 
-        if (!shouldPlaceSecondaryHomeOnDisplay(displayId)) {
+        if (!shouldPlaceSecondaryHomeOnDisplayArea(taskDisplayArea)) {
             return false;
         }
 
@@ -2147,13 +2149,11 @@
             return false;
         }
 
-        moveActivityToPinnedStack(r, null /* sourceBounds */, 0f /* aspectRatio */,
-                "moveTopActivityToPinnedStack");
+        moveActivityToPinnedStack(r, "moveTopActivityToPinnedStack");
         return true;
     }
 
-    void moveActivityToPinnedStack(ActivityRecord r, Rect sourceHintBounds, float aspectRatio,
-            String reason) {
+    void moveActivityToPinnedStack(ActivityRecord r, String reason) {
         mService.deferWindowLayout();
 
         final TaskDisplayArea taskDisplayArea = r.getDisplayArea();
@@ -2176,17 +2176,19 @@
             final ActivityStack stack;
             if (singleActivity) {
                 stack = r.getRootTask();
-                stack.setWindowingMode(WINDOWING_MODE_PINNED);
             } else {
                 // In the case of multiple activities, we will create a new task for it and then
                 // move the PIP activity into the task.
-                stack = taskDisplayArea.createStack(WINDOWING_MODE_PINNED, r.getActivityType(),
+                stack = taskDisplayArea.createStack(WINDOWING_MODE_UNDEFINED, r.getActivityType(),
                         ON_TOP, r.info, r.intent, false /* createdByOrganizer */);
 
                 // There are multiple activities in the task and moving the top activity should
                 // reveal/leave the other activities in their original task.
-                r.reparent(stack, MAX_VALUE, "moveActivityToStack");
+                // On the other hand, ActivityRecord#onParentChanged takes care of setting the
+                // up-to-dated pinned stack information on this newly created stack.
+                r.reparent(stack, MAX_VALUE, reason);
             }
+            stack.setWindowingMode(WINDOWING_MODE_PINNED);
 
             // Reset the state that indicates it can enter PiP while pausing after we've moved it
             // to the pinned stack
@@ -2208,15 +2210,14 @@
         }
     }
 
-    ActivityRecord findTask(ActivityRecord r, int preferredDisplayId) {
+    ActivityRecord findTask(ActivityRecord r, TaskDisplayArea preferredTaskDisplayArea) {
         if (DEBUG_TASKS) Slog.d(TAG_TASKS, "Looking for task of " + r);
         mTmpFindTaskResult.clear();
 
-        // Looking up task on preferred display first
-        final DisplayContent preferredDisplay = getDisplayContent(preferredDisplayId);
-        if (preferredDisplay != null) {
-            preferredDisplay.getDefaultTaskDisplayArea().findTaskLocked(r,
-                    true /* isPreferredDisplay */, mTmpFindTaskResult);
+        // Looking up task on preferred display area first
+        if (preferredTaskDisplayArea != null) {
+            preferredTaskDisplayArea.findTaskLocked(r, true /* isPreferredDisplay */,
+                    mTmpFindTaskResult);
             if (mTmpFindTaskResult.mIdealMatch) {
                 return mTmpFindTaskResult.mRecord;
             }
@@ -2224,14 +2225,17 @@
 
         for (int displayNdx = getChildCount() - 1; displayNdx >= 0; --displayNdx) {
             final DisplayContent display = getChildAt(displayNdx);
-            if (display.mDisplayId == preferredDisplayId) {
-                continue;
-            }
+            for (int tdaNdx = display.getTaskDisplayAreaCount() - 1; tdaNdx >= 0; --tdaNdx) {
+                final TaskDisplayArea taskDisplayArea = display.getTaskDisplayAreaAt(tdaNdx);
+                if (taskDisplayArea == preferredTaskDisplayArea) {
+                    continue;
+                }
 
-            display.getDefaultTaskDisplayArea().findTaskLocked(r, false /* isPreferredDisplay */,
-                    mTmpFindTaskResult);
-            if (mTmpFindTaskResult.mIdealMatch) {
-                return mTmpFindTaskResult.mRecord;
+                taskDisplayArea.findTaskLocked(r, false /* isPreferredDisplay */,
+                        mTmpFindTaskResult);
+                if (mTmpFindTaskResult.mIdealMatch) {
+                    return mTmpFindTaskResult.mRecord;
+                }
             }
         }
 
@@ -2422,6 +2426,7 @@
         info.userId = stack.mCurrentUser;
         info.visible = stack.shouldBeVisible(null);
         // A stack might be not attached to a display.
+        // TODO: Can be removed since no one is using it.
         info.position = taskDisplayArea != null ? taskDisplayArea.getIndexOf(stack) : 0;
         info.configuration.setTo(stack.getConfiguration());
 
@@ -2823,11 +2828,15 @@
             int realCallingUid) {
         int taskId = INVALID_TASK_ID;
         int displayId = INVALID_DISPLAY;
+        TaskDisplayArea taskDisplayArea = null;
 
         // We give preference to the launch preference in activity options.
         if (options != null) {
             taskId = options.getLaunchTaskId();
             displayId = options.getLaunchDisplayId();
+            final WindowContainerToken daToken = options.getLaunchTaskDisplayArea();
+            taskDisplayArea = daToken != null
+                    ? (TaskDisplayArea) WindowContainer.fromBinder(daToken.asBinder()) : null;
         }
 
         // First preference for stack goes to the task Id set in the activity options. Use the stack
@@ -2846,30 +2855,34 @@
         final int activityType = resolveActivityType(r, options, candidateTask);
         ActivityStack stack = null;
 
-        // Next preference for stack goes to the display Id set the candidate display.
-        if (launchParams != null && launchParams.mPreferredDisplayId != INVALID_DISPLAY) {
-            displayId = launchParams.mPreferredDisplayId;
+        // Next preference for stack goes to the taskDisplayArea candidate.
+        if (launchParams != null && launchParams.mPreferredTaskDisplayArea != null) {
+            taskDisplayArea = launchParams.mPreferredTaskDisplayArea;
         }
-        final boolean canLaunchOnDisplayFromStartRequest =
-                realCallingPid != 0 && realCallingUid > 0 && r != null
-                        && mStackSupervisor.canPlaceEntityOnDisplay(displayId, realCallingPid,
-                        realCallingUid, r.info);
-        // Checking if the activity's launch caller, or the realCallerId of the activity from
-        // start request (i.e. entity that invokes PendingIntent) is allowed to launch on the
-        // display.
-        if (displayId != INVALID_DISPLAY && (canLaunchOnDisplay(r, displayId)
-                || canLaunchOnDisplayFromStartRequest)) {
-            if (r != null) {
-                stack = getValidLaunchStackOnDisplay(displayId, r, candidateTask, options,
-                        launchParams);
-                if (stack != null) {
-                    return stack;
-                }
+
+        if (taskDisplayArea == null && displayId != INVALID_DISPLAY) {
+            final DisplayContent displayContent = getDisplayContent(displayId);
+            if (displayContent != null) {
+                taskDisplayArea = displayContent.getDefaultTaskDisplayArea();
             }
-            final DisplayContent display = getDisplayContentOrCreate(displayId);
-            if (display != null) {
+        }
+
+        if (taskDisplayArea != null) {
+            final int tdaDisplayId = taskDisplayArea.getDisplayId();
+            final boolean canLaunchOnDisplayFromStartRequest =
+                    realCallingPid != 0 && realCallingUid > 0 && r != null
+                            && mStackSupervisor.canPlaceEntityOnDisplay(tdaDisplayId,
+                            realCallingPid, realCallingUid, r.info);
+            if (canLaunchOnDisplayFromStartRequest || canLaunchOnDisplay(r, tdaDisplayId)) {
+                if (r != null) {
+                    final ActivityStack result = getValidLaunchStackInTaskDisplayArea(
+                            taskDisplayArea, r, candidateTask, options, launchParams);
+                    if (result != null) {
+                        return result;
+                    }
+                }
                 // Falling back to default task container
-                final TaskDisplayArea taskDisplayArea = display.getDefaultTaskDisplayArea();
+                taskDisplayArea = taskDisplayArea.mDisplayContent.getDefaultTaskDisplayArea();
                 stack = taskDisplayArea.getOrCreateStack(r, options, candidateTask, activityType,
                         onTop);
                 if (stack != null) {
@@ -2936,40 +2949,37 @@
     }
 
     /**
-     * Get a topmost stack on the display, that is a valid launch stack for specified activity.
+     * Get a topmost stack on the display area, that is a valid launch stack for specified activity.
      * If there is no such stack, new dynamic stack can be created.
-     * @param displayId Target display.
+     * @param taskDisplayArea Target display area.
      * @param r Activity that should be launched there.
      * @param candidateTask The possible task the activity might be put in.
      * @return Existing stack if there is a valid one, new dynamic stack if it is valid or null.
      */
     @VisibleForTesting
-    ActivityStack getValidLaunchStackOnDisplay(int displayId, @NonNull ActivityRecord r,
-            @Nullable Task candidateTask, @Nullable ActivityOptions options,
+    ActivityStack getValidLaunchStackInTaskDisplayArea(@NonNull TaskDisplayArea taskDisplayArea,
+            @NonNull ActivityRecord r, @Nullable Task candidateTask,
+            @Nullable ActivityOptions options,
             @Nullable LaunchParamsController.LaunchParams launchParams) {
-        final DisplayContent displayContent = getDisplayContentOrCreate(displayId);
-        if (displayContent == null) {
-            throw new IllegalArgumentException(
-                    "Display with displayId=" + displayId + " not found.");
-        }
-
-        if (!r.canBeLaunchedOnDisplay(displayId)) {
+        if (!r.canBeLaunchedOnDisplay(taskDisplayArea.getDisplayId())) {
             return null;
         }
 
-        // If {@code r} is already in target display and its task is the same as the candidate task,
-        // the intention should be getting a launch stack for the reusable activity, so we can use
-        // the existing stack.
+        // If {@code r} is already in target display area and its task is the same as the candidate
+        // task, the intention should be getting a launch stack for the reusable activity, so we can
+        // use the existing stack.
         if (candidateTask != null && (r.getTask() == null || r.getTask() == candidateTask)) {
-            final int attachedDisplayId = r.getDisplayId();
-            if (attachedDisplayId == INVALID_DISPLAY || attachedDisplayId == displayId) {
+            // TODO(b/153920825): Fix incorrect evaluation of attached state
+            final TaskDisplayArea attachedTaskDisplayArea = r.getTask() != null
+                    ? r.getTask().getDisplayArea() : r.getDisplayArea();
+            if (attachedTaskDisplayArea == null || attachedTaskDisplayArea == taskDisplayArea) {
                 return candidateTask.getStack();
             }
             // Or the candidate task is already a root task that can be reused by reparenting
             // it to the target display.
             if (candidateTask.isRootTask()) {
                 final ActivityStack stack = candidateTask.getStack();
-                stack.reparent(displayContent.getDefaultTaskDisplayArea(), true /* onTop */);
+                stack.reparent(taskDisplayArea, true /* onTop */);
                 return stack;
             }
         }
@@ -2984,39 +2994,30 @@
             windowingMode = options != null ? options.getLaunchWindowingMode()
                     : r.getWindowingMode();
         }
+        windowingMode = taskDisplayArea.validateWindowingMode(windowingMode, r, candidateTask,
+                r.getActivityType());
 
         // Return the topmost valid stack on the display.
-        for (int tdaNdx = displayContent.getTaskDisplayAreaCount() - 1; tdaNdx >= 0; --tdaNdx) {
-            final TaskDisplayArea taskDisplayArea = displayContent.getTaskDisplayAreaAt(tdaNdx);
-            final int validatedWindowingMode = taskDisplayArea
-                    .validateWindowingMode(windowingMode, r, candidateTask, r.getActivityType());
-            for (int sNdx = taskDisplayArea.getStackCount() - 1; sNdx >= 0; --sNdx) {
-                final ActivityStack stack = taskDisplayArea.getStackAt(sNdx);
-                if (isValidLaunchStack(stack, r, validatedWindowingMode)) {
-                    return stack;
-                }
+        for (int i = taskDisplayArea.getStackCount() - 1; i >= 0; --i) {
+            final ActivityStack stack = taskDisplayArea.getStackAt(i);
+            if (isValidLaunchStack(stack, r, windowingMode)) {
+                return stack;
             }
         }
 
-        // If there is no valid stack on the external display - check if new dynamic stack will do.
-        if (displayId != DEFAULT_DISPLAY) {
+        // If there is no valid stack on the secondary display area - check if new dynamic stack
+        // will do.
+        if (taskDisplayArea != getDisplayContent(taskDisplayArea.getDisplayId())
+                .getDefaultTaskDisplayArea()) {
             final int activityType =
                     options != null && options.getLaunchActivityType() != ACTIVITY_TYPE_UNDEFINED
                             ? options.getLaunchActivityType() : r.getActivityType();
-            final TaskDisplayArea taskDisplayArea = displayContent.getDefaultTaskDisplayArea();
             return taskDisplayArea.createStack(windowingMode, activityType, true /*onTop*/);
         }
 
         return null;
     }
 
-    ActivityStack getValidLaunchStackOnDisplay(int displayId, @NonNull ActivityRecord r,
-            @Nullable ActivityOptions options,
-            @Nullable LaunchParamsController.LaunchParams launchParams) {
-        return getValidLaunchStackOnDisplay(displayId, r, null /* candidateTask */, options,
-                launchParams);
-    }
-
     // TODO: Can probably be consolidated into getLaunchStack()...
     private boolean isValidLaunchStack(ActivityStack stack, ActivityRecord r, int windowingMode) {
         switch (stack.getActivityType()) {
@@ -3324,7 +3325,7 @@
                 for (int sNdx = taskDisplayArea.getStackCount() - 1; sNdx >= 0; --sNdx) {
                     final ActivityStack stack = taskDisplayArea.getStackAt(sNdx);
                     final ActivityRecord r = stack.mPausingActivity;
-                    if (r != null && !r.isState(PAUSED, STOPPED, STOPPING)) {
+                    if (r != null && !r.isState(PAUSED, STOPPED, STOPPING, FINISHING)) {
                         if (DEBUG_STATES) {
                             Slog.d(TAG_STATES, "allPausedActivitiesComplete: r=" + r
                                     + " state=" + r.getState());
diff --git a/services/core/java/com/android/server/wm/SafeActivityOptions.java b/services/core/java/com/android/server/wm/SafeActivityOptions.java
index a7b5368..b71ecbb 100644
--- a/services/core/java/com/android/server/wm/SafeActivityOptions.java
+++ b/services/core/java/com/android/server/wm/SafeActivityOptions.java
@@ -18,10 +18,11 @@
 
 import static android.Manifest.permission.CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS;
 import static android.Manifest.permission.START_TASKS_FROM_RECENTS;
+import static android.app.ActivityTaskManager.INVALID_TASK_ID;
 import static android.content.pm.PackageManager.PERMISSION_DENIED;
 import static android.content.pm.PackageManager.PERMISSION_GRANTED;
 import static android.view.Display.INVALID_DISPLAY;
-import static android.app.ActivityTaskManager.INVALID_TASK_ID;
+
 import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_ATM;
 import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_WITH_CLASS_NAME;
 
@@ -36,6 +37,7 @@
 import android.os.UserHandle;
 import android.util.Slog;
 import android.view.RemoteAnimationAdapter;
+import android.window.WindowContainerToken;
 
 import com.android.internal.annotations.VisibleForTesting;
 
@@ -206,8 +208,20 @@
                 throw new SecurityException(msg);
             }
         }
-        // Check if someone tries to launch an activity on a private display with a different
-        // owner.
+        // Check if the caller is allowed to launch on the specified display area.
+        final WindowContainerToken daToken = options.getLaunchTaskDisplayArea();
+        final TaskDisplayArea taskDisplayArea = daToken != null
+                ? (TaskDisplayArea) WindowContainer.fromBinder(daToken.asBinder()) : null;
+        if (aInfo != null && taskDisplayArea != null
+                && !supervisor.isCallerAllowedToLaunchOnTaskDisplayArea(callingPid, callingUid,
+                taskDisplayArea, aInfo)) {
+            final String msg = "Permission Denial: starting " + getIntentString(intent)
+                    + " from " + callerApp + " (pid=" + callingPid
+                    + ", uid=" + callingUid + ") with launchTaskDisplayArea=" + taskDisplayArea;
+            Slog.w(TAG, msg);
+            throw new SecurityException(msg);
+        }
+        // Check if the caller is allowed to launch on the specified display.
         final int launchDisplayId = options.getLaunchDisplayId();
         if (aInfo != null && launchDisplayId != INVALID_DISPLAY
                 && !supervisor.isCallerAllowedToLaunchOnDisplay(callingPid, callingUid,
diff --git a/services/core/java/com/android/server/wm/ScreenRotationAnimation.java b/services/core/java/com/android/server/wm/ScreenRotationAnimation.java
index b92ead1..86e0818 100644
--- a/services/core/java/com/android/server/wm/ScreenRotationAnimation.java
+++ b/services/core/java/com/android/server/wm/ScreenRotationAnimation.java
@@ -41,7 +41,6 @@
 import android.os.Trace;
 import android.util.Slog;
 import android.util.proto.ProtoOutputStream;
-import android.view.Display;
 import android.view.DisplayInfo;
 import android.view.Surface;
 import android.view.Surface.OutOfResourcesException;
@@ -117,8 +116,9 @@
     private BlackFrame mEnteringBlackFrame;
     private int mWidth, mHeight;
 
-    private int mOriginalRotation;
-    private int mOriginalWidth, mOriginalHeight;
+    private final int mOriginalRotation;
+    private final int mOriginalWidth;
+    private final int mOriginalHeight;
     private int mCurRotation;
 
     private Rect mOriginalDisplayRect = new Rect();
@@ -140,20 +140,18 @@
     /** Intensity of light/whiteness of the layout after rotation occurs. */
     private float mEndLuma;
 
-    public ScreenRotationAnimation(Context context, DisplayContent displayContent,
-            boolean fixedToUserRotation, boolean isSecure, WindowManagerService service) {
-        mService = service;
-        mContext = context;
+    ScreenRotationAnimation(DisplayContent displayContent, @Surface.Rotation int originalRotation) {
+        mService = displayContent.mWmService;
+        mContext = mService.mContext;
         mDisplayContent = displayContent;
         displayContent.getBounds(mOriginalDisplayRect);
 
         // Screenshot does NOT include rotation!
-        final Display display = displayContent.getDisplay();
-        int originalRotation = display.getRotation();
+        final DisplayInfo displayInfo = displayContent.getDisplayInfo();
+        final int realOriginalRotation = displayInfo.rotation;
         final int originalWidth;
         final int originalHeight;
-        DisplayInfo displayInfo = displayContent.getDisplayInfo();
-        if (fixedToUserRotation) {
+        if (displayContent.getDisplayRotation().isFixedToUserRotation()) {
             // Emulated orientation.
             mForceDefaultOrientation = true;
             originalWidth = displayContent.mBaseDisplayWidth;
@@ -163,8 +161,8 @@
             originalWidth = displayInfo.logicalWidth;
             originalHeight = displayInfo.logicalHeight;
         }
-        if (originalRotation == Surface.ROTATION_90
-                || originalRotation == Surface.ROTATION_270) {
+        if (realOriginalRotation == Surface.ROTATION_90
+                || realOriginalRotation == Surface.ROTATION_270) {
             mWidth = originalHeight;
             mHeight = originalWidth;
         } else {
@@ -173,10 +171,18 @@
         }
 
         mOriginalRotation = originalRotation;
-        mOriginalWidth = originalWidth;
-        mOriginalHeight = originalHeight;
+        // If the delta is not zero, the rotation of display may not change, but we still want to
+        // apply rotation animation because there should be a top app shown as rotated. So the
+        // specified original rotation customizes the direction of animation to have better look
+        // when restoring the rotated app to the same rotation as current display.
+        final int delta = DisplayContent.deltaRotation(originalRotation, realOriginalRotation);
+        final boolean flipped = delta == Surface.ROTATION_90 || delta == Surface.ROTATION_270;
+        mOriginalWidth = flipped ? originalHeight : originalWidth;
+        mOriginalHeight = flipped ? originalWidth : originalHeight;
         mSurfaceRotationAnimationController = new SurfaceRotationAnimationController();
 
+        // Check whether the current screen contains any secure content.
+        final boolean isSecure = displayContent.hasSecureWindowOnScreen();
         final SurfaceControl.Transaction t = mService.mTransactionFactory.get();
         try {
             mBackColorSurface = displayContent.makeChildSurface(null)
@@ -202,11 +208,11 @@
             t2.apply(true /* sync */);
 
             // Capture a screenshot into the surface we just created.
-            final int displayId = display.getDisplayId();
+            final int displayId = displayContent.getDisplayId();
             final Surface surface = mService.mSurfaceFactory.get();
             surface.copyFrom(mScreenshotLayer);
             SurfaceControl.ScreenshotGraphicBuffer gb =
-                    mService.mDisplayManagerInternal.screenshot(displayId);
+                    mService.mDisplayManagerInternal.systemScreenshot(displayId);
             if (gb != null) {
                 Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER,
                         "ScreenRotationAnimation#getMedianBorderLuma");
@@ -242,7 +248,7 @@
 
         ProtoLog.i(WM_SHOW_SURFACE_ALLOC,
                     "  FREEZE %s: CREATE", mScreenshotLayer);
-        setRotation(t, originalRotation);
+        setRotation(t, realOriginalRotation);
         t.apply();
     }
 
@@ -591,8 +597,8 @@
             return startAnimation(initializeBuilder()
                             .setSurfaceControl(mScreenshotLayer)
                             .setAnimationLeashParent(mDisplayContent.getOverlayLayer())
-                            .setWidth(mWidth)
-                            .setHeight(mHeight)
+                            .setWidth(mDisplayContent.getSurfaceWidth())
+                            .setHeight(mDisplayContent.getSurfaceHeight())
                             .build(),
                     createWindowAnimationSpec(mRotateAlphaAnimation),
                     this::onAnimationEnd);
diff --git a/services/core/java/com/android/server/wm/ShellRoot.java b/services/core/java/com/android/server/wm/ShellRoot.java
index 701feff..0b1760d 100644
--- a/services/core/java/com/android/server/wm/ShellRoot.java
+++ b/services/core/java/com/android/server/wm/ShellRoot.java
@@ -23,12 +23,14 @@
 
 import android.annotation.NonNull;
 import android.graphics.Point;
+import android.graphics.Rect;
 import android.os.IBinder;
 import android.os.RemoteException;
 import android.util.Slog;
 import android.view.DisplayInfo;
 import android.view.IWindow;
 import android.view.SurfaceControl;
+import android.view.WindowInfo;
 import android.view.animation.Animation;
 
 /**
@@ -102,5 +104,27 @@
         mToken.startAnimation(mToken.getPendingTransaction(), adapter, false /* hidden */,
                 ANIMATION_TYPE_WINDOW_ANIMATION, null /* animationFinishedCallback */);
     }
+
+    WindowInfo getWindowInfo() {
+        if (mToken.windowType != TYPE_DOCK_DIVIDER) {
+            return null;
+        }
+        if (!mDisplayContent.getDefaultTaskDisplayArea().isSplitScreenModeActivated()) {
+            return null;
+        }
+        WindowInfo windowInfo = WindowInfo.obtain();
+        windowInfo.displayId = mToken.getDisplayArea().getDisplayContent().mDisplayId;
+        windowInfo.type = mToken.windowType;
+        windowInfo.layer = mToken.getWindowLayerFromType();
+        windowInfo.token = mClient.asBinder();
+        windowInfo.title = "Splitscreen Divider";
+        windowInfo.focused = false;
+        windowInfo.inPictureInPicture = false;
+        windowInfo.hasFlagWatchOutsideTouch = false;
+        final Rect regionRect = new Rect();
+        mDisplayContent.getDockedDividerController().getTouchRegion(regionRect);
+        windowInfo.regionInScreen.set(regionRect);
+        return windowInfo;
+    }
 }
 
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index f8ee09b..93c6b6e 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -52,7 +52,6 @@
 import static android.content.pm.ActivityInfo.RESIZE_MODE_RESIZEABLE_AND_PIPABLE_DEPRECATED;
 import static android.content.pm.ActivityInfo.RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION;
 import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSET;
-import static android.content.res.Configuration.EMPTY;
 import static android.content.res.Configuration.ORIENTATION_LANDSCAPE;
 import static android.content.res.Configuration.ORIENTATION_PORTRAIT;
 import static android.content.res.Configuration.ORIENTATION_UNDEFINED;
@@ -66,6 +65,9 @@
 import static com.android.internal.policy.DecorView.DECOR_SHADOW_UNFOCUSED_HEIGHT_IN_DIP;
 import static com.android.server.wm.ActivityRecord.STARTING_WINDOW_SHOWN;
 import static com.android.server.wm.ActivityStack.ActivityState.RESUMED;
+import static com.android.server.wm.ActivityStack.STACK_VISIBILITY_INVISIBLE;
+import static com.android.server.wm.ActivityStack.STACK_VISIBILITY_VISIBLE;
+import static com.android.server.wm.ActivityStack.STACK_VISIBILITY_VISIBLE_BEHIND_TRANSLUCENT;
 import static com.android.server.wm.ActivityStackSupervisor.ON_TOP;
 import static com.android.server.wm.ActivityStackSupervisor.PRESERVE_WINDOWS;
 import static com.android.server.wm.ActivityStackSupervisor.REMOVE_FROM_RECENTS;
@@ -118,6 +120,7 @@
 import android.content.pm.IPackageManager;
 import android.content.pm.PackageManager;
 import android.content.res.Configuration;
+import android.graphics.Point;
 import android.graphics.Rect;
 import android.os.Debug;
 import android.os.IBinder;
@@ -211,8 +214,6 @@
 
     static final int INVALID_MIN_SIZE = -1;
     private float mShadowRadius = 0;
-    private final Rect mLastSurfaceCrop = new Rect();
-    private static final boolean ENABLE_FREEFORM_COMPOSITOR_SHADOWS = false;
 
     /**
      * The modes to control how the stack is moved to the front when calling {@link Task#reparent}.
@@ -354,10 +355,6 @@
     final Rect mPreparedFrozenBounds = new Rect();
     final Configuration mPreparedFrozenMergedConfig = new Configuration();
 
-    // If non-empty, bounds used to display the task during animations/interactions.
-    // TODO(b/119687367): This member is temporary.
-    private final Rect mOverrideDisplayedBounds = new Rect();
-
     // Id of the previous display the stack was on.
     int mPrevDisplayId = INVALID_DISPLAY;
 
@@ -400,6 +397,7 @@
 
     private Dimmer mDimmer = new Dimmer(this);
     private final Rect mTmpDimBoundsRect = new Rect();
+    private final Point mLastSurfaceSize = new Point();
 
     /** @see #setCanAffectSystemUiFlags */
     private boolean mCanAffectSystemUiFlags = true;
@@ -439,7 +437,6 @@
     static final int FLAG_FORCE_HIDDEN_FOR_TASK_ORG = 1 << 1;
     private int mForceHiddenFlags = 0;
 
-
     SurfaceControl.Transaction mMainWindowSizeChangeTransaction;
 
     private final FindRootHelper mFindRootHelper = new FindRootHelper();
@@ -1379,6 +1376,9 @@
     void addChild(WindowContainer child, int index) {
         // If this task had any child before we added this one.
         boolean hadChild = hasChild();
+        // getActivityType() looks at the top child, so we need to read the type before adding
+        // a new child in case the new child is on top and UNDEFINED.
+        final int activityType = getActivityType();
 
         index = getAdjustedChildPosition(child, index);
         super.addChild(child, index);
@@ -1419,7 +1419,7 @@
                     ActivityTaskManager.getMaxAppRecentsLimitStatic());
         } else {
             // Otherwise make all added activities match this one.
-            r.setActivityType(getActivityType());
+            r.setActivityType(activityType);
         }
 
         updateEffectiveIntent();
@@ -1943,8 +1943,15 @@
         final int prevWinMode = getWindowingMode();
         mTmpPrevBounds.set(getBounds());
         final boolean wasInMultiWindowMode = inMultiWindowMode();
+        final boolean wasInPictureInPicture = inPinnedWindowingMode();
         super.onConfigurationChanged(newParentConfig);
-        if (wasInMultiWindowMode != inMultiWindowMode()) {
+        // Only need to update surface size here since the super method will handle updating
+        // surface position.
+        updateSurfaceSize(getPendingTransaction());
+
+        if (wasInPictureInPicture != inPinnedWindowingMode()) {
+            mStackSupervisor.scheduleUpdatePictureInPictureModeIfNeeded(this, getStack());
+        } else if (wasInMultiWindowMode != inMultiWindowMode()) {
             mStackSupervisor.scheduleUpdateMultiWindowMode(this);
         }
 
@@ -1988,7 +1995,8 @@
         if (mWmService.mDisableTransitionAnimation
                 || !isVisible()
                 || getDisplayContent().mAppTransition.isTransitionSet()
-                || getSurfaceControl() == null) {
+                || getSurfaceControl() == null
+                || !isLeafTask()) {
             return false;
         }
         // Only do an animation into and out-of freeform mode for now. Other mode
@@ -1996,6 +2004,57 @@
         return (prevWinMode == WINDOWING_MODE_FREEFORM) != (newWinMode == WINDOWING_MODE_FREEFORM);
     }
 
+    void updateSurfaceSize(SurfaceControl.Transaction transaction) {
+        if (mSurfaceControl == null || mCreatedByOrganizer) {
+            return;
+        }
+
+        // Apply crop to root tasks only and clear the crops of the descendant tasks.
+        int width = 0;
+        int height = 0;
+        if (isRootTask()) {
+            final Rect taskBounds = getBounds();
+            width = taskBounds.width();
+            height = taskBounds.height();
+
+            final int outset = getTaskOutset();
+            width += 2 * outset;
+            height += 2 * outset;
+        }
+        if (width == mLastSurfaceSize.x && height == mLastSurfaceSize.y) {
+            return;
+        }
+        transaction.setWindowCrop(mSurfaceControl, width, height);
+        mLastSurfaceSize.set(width, height);
+    }
+
+    /**
+     * Calculate an amount by which to expand the task bounds in each direction.
+     * Used to make room for shadows in the pinned windowing mode.
+     */
+    int getTaskOutset() {
+        // If we are drawing shadows on the task then don't outset the stack.
+        if (mWmService.mRenderShadowsInCompositor) {
+            return 0;
+        }
+        DisplayContent displayContent = getDisplayContent();
+        if (inPinnedWindowingMode() && displayContent != null) {
+            final DisplayMetrics displayMetrics = displayContent.getDisplayMetrics();
+
+            // We multiply by two to match the client logic for converting view elevation
+            // to insets, as in {@link WindowManager.LayoutParams#setSurfaceInsets}
+            return (int) Math.ceil(
+                    mWmService.dipToPixel(PINNED_WINDOWING_MODE_ELEVATION_IN_DIP, displayMetrics)
+                            * 2);
+        }
+        return 0;
+    }
+
+    @VisibleForTesting
+    Point getLastSurfaceSize() {
+        return mLastSurfaceSize;
+    }
+
     @VisibleForTesting
     boolean isInChangeTransition() {
         return mSurfaceFreezer.hasLeash() || AppTransition.isChangeTransit(mTransit);
@@ -2226,14 +2285,18 @@
         }
         density *= DisplayMetrics.DENSITY_DEFAULT_SCALE;
 
+        // The bounds may have been overridden at this level. If the parent cannot cover these
+        // bounds, the configuration is still computed according to the override bounds.
+        final boolean insideParentBounds;
+
+        final Rect parentBounds = parentConfig.windowConfiguration.getBounds();
         final Rect resolvedBounds = inOutConfig.windowConfiguration.getBounds();
-        if (resolvedBounds == null) {
-            mTmpFullBounds.setEmpty();
+        if (resolvedBounds == null || resolvedBounds.isEmpty()) {
+            mTmpFullBounds.set(parentBounds);
+            insideParentBounds = true;
         } else {
             mTmpFullBounds.set(resolvedBounds);
-        }
-        if (mTmpFullBounds.isEmpty()) {
-            mTmpFullBounds.set(parentConfig.windowConfiguration.getBounds());
+            insideParentBounds = parentBounds.contains(resolvedBounds);
         }
 
         Rect outAppBounds = inOutConfig.windowConfiguration.getAppBounds();
@@ -2242,21 +2305,30 @@
             outAppBounds = inOutConfig.windowConfiguration.getAppBounds();
         }
         // Non-null compatibility insets means the activity prefers to keep its original size, so
-        // the out bounds doesn't need to be restricted by the parent.
-        final boolean insideParentBounds = compatInsets == null;
-        if (insideParentBounds && windowingMode != WINDOWING_MODE_FREEFORM) {
-            final Rect parentAppBounds = parentConfig.windowConfiguration.getAppBounds();
-            if (parentAppBounds != null && !parentAppBounds.isEmpty()) {
-                outAppBounds.intersect(parentAppBounds);
+        // the out bounds doesn't need to be restricted by the parent or current display.
+        final boolean customContainerPolicy = compatInsets != null;
+        if (!customContainerPolicy && windowingMode != WINDOWING_MODE_FREEFORM) {
+            final Rect containingAppBounds;
+            if (insideParentBounds) {
+                containingAppBounds = parentConfig.windowConfiguration.getAppBounds();
+            } else {
+                // Restrict appBounds to display non-decor rather than parent because the override
+                // bounds are beyond the parent. Otherwise, it won't match the overridden bounds.
+                final TaskDisplayArea displayArea = getDisplayArea();
+                containingAppBounds = displayArea != null
+                        ? displayArea.getWindowConfiguration().getAppBounds() : null;
+            }
+            if (containingAppBounds != null && !containingAppBounds.isEmpty()) {
+                outAppBounds.intersect(containingAppBounds);
             }
         }
 
         if (inOutConfig.screenWidthDp == Configuration.SCREEN_WIDTH_DP_UNDEFINED
                 || inOutConfig.screenHeightDp == Configuration.SCREEN_HEIGHT_DP_UNDEFINED) {
-            if (insideParentBounds && WindowConfiguration.isFloating(windowingMode)) {
+            if (!customContainerPolicy && WindowConfiguration.isFloating(windowingMode)) {
                 mTmpNonDecorBounds.set(mTmpFullBounds);
                 mTmpStableBounds.set(mTmpFullBounds);
-            } else if (insideParentBounds
+            } else if (!customContainerPolicy
                     && (overrideDisplayInfo != null || getDisplayContent() != null)) {
                 final DisplayInfo di = overrideDisplayInfo != null
                         ? overrideDisplayInfo
@@ -2274,7 +2346,7 @@
                 if (rotation == ROTATION_UNDEFINED) {
                     rotation = parentConfig.windowConfiguration.getRotation();
                 }
-                if (rotation != ROTATION_UNDEFINED && compatInsets != null) {
+                if (rotation != ROTATION_UNDEFINED && customContainerPolicy) {
                     mTmpNonDecorBounds.set(mTmpFullBounds);
                     mTmpStableBounds.set(mTmpFullBounds);
                     compatInsets.getBoundsByRotation(mTmpBounds, rotation);
@@ -2292,13 +2364,13 @@
 
             if (inOutConfig.screenWidthDp == Configuration.SCREEN_WIDTH_DP_UNDEFINED) {
                 final int overrideScreenWidthDp = (int) (mTmpStableBounds.width() / density);
-                inOutConfig.screenWidthDp = insideParentBounds
+                inOutConfig.screenWidthDp = (insideParentBounds && !customContainerPolicy)
                         ? Math.min(overrideScreenWidthDp, parentConfig.screenWidthDp)
                         : overrideScreenWidthDp;
             }
             if (inOutConfig.screenHeightDp == Configuration.SCREEN_HEIGHT_DP_UNDEFINED) {
                 final int overrideScreenHeightDp = (int) (mTmpStableBounds.height() / density);
-                inOutConfig.screenHeightDp = insideParentBounds
+                inOutConfig.screenHeightDp = (insideParentBounds && !customContainerPolicy)
                         ? Math.min(overrideScreenHeightDp, parentConfig.screenHeightDp)
                         : overrideScreenHeightDp;
             }
@@ -2345,25 +2417,27 @@
         mTmpBounds.set(getResolvedOverrideConfiguration().windowConfiguration.getBounds());
         super.resolveOverrideConfiguration(newParentConfig);
 
-        // Resolve override windowing mode to fullscreen for home task (even on freeform
-        // display), or split-screen-secondary if in split-screen mode.
         int windowingMode =
                 getResolvedOverrideConfiguration().windowConfiguration.getWindowingMode();
+
+        // Resolve override windowing mode to fullscreen for home task (even on freeform
+        // display), or split-screen if in split-screen mode.
         if (getActivityType() == ACTIVITY_TYPE_HOME && windowingMode == WINDOWING_MODE_UNDEFINED) {
-            windowingMode = inSplitScreenWindowingMode() ? WINDOWING_MODE_SPLIT_SCREEN_SECONDARY
-                    : WINDOWING_MODE_FULLSCREEN;
+            final int parentWindowingMode = newParentConfig.windowConfiguration.getWindowingMode();
+            windowingMode = WindowConfiguration.isSplitScreenWindowingMode(parentWindowingMode)
+                    ? parentWindowingMode : WINDOWING_MODE_FULLSCREEN;
             getResolvedOverrideConfiguration().windowConfiguration.setWindowingMode(windowingMode);
         }
 
-        if (!isLeafTask()) {
-            // Compute configuration overrides for tasks that created by organizer, so that
-            // organizer can get the correct configuration from those tasks.
-            if (mCreatedByOrganizer) {
-                computeConfigResourceOverrides(getResolvedOverrideConfiguration(), newParentConfig);
-            }
-            return;
+        if (isLeafTask()) {
+            resolveLeafOnlyOverrideConfigs(newParentConfig);
         }
+        computeConfigResourceOverrides(getResolvedOverrideConfiguration(), newParentConfig);
+    }
 
+    void resolveLeafOnlyOverrideConfigs(Configuration newParentConfig) {
+        int windowingMode =
+                getResolvedOverrideConfiguration().windowConfiguration.getWindowingMode();
         if (windowingMode == WINDOWING_MODE_UNDEFINED) {
             windowingMode = newParentConfig.windowConfiguration.getWindowingMode();
         }
@@ -2403,7 +2477,6 @@
                 outOverrideBounds.offset(0, offsetTop);
             }
         }
-        computeConfigResourceOverrides(getResolvedOverrideConfiguration(), newParentConfig);
     }
 
     /**
@@ -2578,6 +2651,80 @@
         return currentCount[0];
     }
 
+    /**
+     * Find next proper focusable stack and make it focused.
+     * @return The stack that now got the focus, {@code null} if none found.
+     */
+    ActivityStack adjustFocusToNextFocusableTask(String reason) {
+        return adjustFocusToNextFocusableTask(reason, false /* allowFocusSelf */,
+                true /* moveParentsToTop */);
+    }
+
+    /** Return the next focusable task by looking from the siblings and parent tasks */
+    private Task getNextFocusableTask(boolean allowFocusSelf) {
+        final WindowContainer parent = getParent();
+        if (parent == null) {
+            return null;
+        }
+
+        final Task focusableTask = parent.getTask((task) -> (allowFocusSelf || task != this)
+                && ((ActivityStack) task).isFocusableAndVisible());
+        if (focusableTask == null && parent.asTask() != null) {
+            return parent.asTask().getNextFocusableTask(allowFocusSelf);
+        } else {
+            return focusableTask;
+        }
+    }
+
+    /**
+     * Find next proper focusable task and make it focused.
+     * @param reason The reason of making the adjustment.
+     * @param allowFocusSelf Is the focus allowed to remain on the same task.
+     * @param moveParentsToTop Whether to move parents to top while making the task focused.
+     * @return The root task that now got the focus, {@code null} if none found.
+     */
+    ActivityStack adjustFocusToNextFocusableTask(String reason, boolean allowFocusSelf,
+            boolean moveParentsToTop) {
+        ActivityStack focusableTask = (ActivityStack) getNextFocusableTask(allowFocusSelf);
+        if (focusableTask == null) {
+            focusableTask = mRootWindowContainer.getNextFocusableStack((ActivityStack) this,
+                    !allowFocusSelf);
+        }
+        if (focusableTask == null) {
+            return null;
+        }
+
+        final String myReason = reason + " adjustFocusToNextFocusableStack";
+        final ActivityRecord top = focusableTask.topRunningActivity();
+        final ActivityStack rootTask = (ActivityStack) focusableTask.getRootTask();
+        if (focusableTask.isActivityTypeHome() && (top == null || !top.mVisibleRequested)) {
+            // If we will be focusing on the home stack next and its current top activity isn't
+            // visible, then use the move the home stack task to top to make the activity visible.
+            focusableTask.getDisplayArea().moveHomeActivityToTop(myReason);
+            return rootTask;
+        }
+
+        if (!moveParentsToTop) {
+            // Only move the next stack to top in its task container.
+            WindowContainer parent = focusableTask.getParent();
+            parent.positionChildAt(POSITION_TOP, focusableTask, false /* includingParents */);
+            return rootTask;
+        }
+
+        // Move the entire hierarchy to top with updating global top resumed activity
+        // and focused application if needed.
+        focusableTask.moveToFront(myReason);
+        // Top display focused stack is changed, update top resumed activity if needed.
+        if (rootTask.mResumedActivity != null) {
+            mStackSupervisor.updateTopResumedActivityIfNeeded();
+            // Set focused app directly because if the next focused activity is already resumed
+            // (e.g. the next top activity is on a different display), there won't have activity
+            // state change to update it.
+            mAtmService.setResumedActivityUncheckLocked(rootTask.mResumedActivity, reason);
+        }
+        return rootTask;
+    }
+
     /** Calculate the minimum possible position for a task that can be shown to the user.
      *  The minimum position will be above all other tasks that can't be shown.
      *  @param minPosition The minimum position the caller is suggesting.
@@ -2728,30 +2875,6 @@
         return boundsChange;
     }
 
-    private void updateSurfaceCrop() {
-        // TODO(b/149585281) remove when root task has the correct bounds for freeform
-        // Only update the crop if we are drawing shadows on the task.
-        if (mSurfaceControl == null || !mWmService.mRenderShadowsInCompositor
-                || !isRootTask() || !ENABLE_FREEFORM_COMPOSITOR_SHADOWS) {
-            return;
-        }
-
-        if (inSplitScreenWindowingMode()) {
-            // inherit crop from parent
-            mTmpRect.setEmpty();
-        } else {
-            getBounds(mTmpRect);
-        }
-
-        mTmpRect.offsetTo(0, 0);
-        if (mLastSurfaceCrop.equals(mTmpRect)) {
-            return;
-        }
-
-        getPendingTransaction().setWindowCrop(mSurfaceControl, mTmpRect);
-        mLastSurfaceCrop.set(mTmpRect);
-    }
-
     @Override
     public boolean onDescendantOrientationChanged(IBinder freezeDisplayToken,
             ConfigurationContainer requestingContainer) {
@@ -2780,45 +2903,12 @@
         if (!isRootTask) {
             adjustBoundsForDisplayChangeIfNeeded(dc);
         }
-        final DisplayContent prevDc = mDisplayContent;
         super.onDisplayChanged(dc);
         if (!isRootTask) {
             final int displayId = (dc != null) ? dc.getDisplayId() : INVALID_DISPLAY;
             mWmService.mAtmService.getTaskChangeNotificationController().notifyTaskDisplayChanged(
                     mTaskId, displayId);
         }
-        if (prevDc != null && prevDc.mChangingContainers.remove(this)) {
-            // This gets called *after* this has been reparented to the new display.
-            // That reparenting resulted in this window changing modes (eg. FREEFORM -> FULLSCREEN),
-            // so this token is now "frozen" while waiting for the animation to start on prevDc
-            // (which will be cancelled since the window is no-longer a child). However, since this
-            // is no longer a child of prevDc, this won't be notified of the cancelled animation,
-            // so we need to cancel the change transition here.
-            mSurfaceFreezer.unfreeze(getPendingTransaction());
-        }
-    }
-
-    /**
-     * Displayed bounds are used to set where the task is drawn at any given time. This is
-     * separate from its actual bounds so that the app doesn't see any meaningful configuration
-     * changes during transitionary periods.
-     */
-    void setOverrideDisplayedBounds(Rect overrideDisplayedBounds) {
-        if (overrideDisplayedBounds != null) {
-            adjustForMinimalTaskDimensions(overrideDisplayedBounds, mOverrideDisplayedBounds);
-            mOverrideDisplayedBounds.set(overrideDisplayedBounds);
-        } else {
-            mOverrideDisplayedBounds.setEmpty();
-        }
-        updateSurfacePosition();
-    }
-
-    /**
-     * Gets the bounds that override where the task is displayed. See
-     * {@link android.app.IActivityTaskManager#resizeDockedStack} why this is needed.
-     */
-    Rect getOverrideDisplayedBounds() {
-        return mOverrideDisplayedBounds;
     }
 
     boolean isResizeable(boolean checkSupportsPip) {
@@ -2854,49 +2944,6 @@
         mPreparedFrozenMergedConfig.setTo(getConfiguration());
     }
 
-    /**
-     * Align the task to the adjusted bounds.
-     *
-     * @param adjustedBounds Adjusted bounds to which the task should be aligned.
-     * @param tempInsetBounds Insets bounds for the task.
-     * @param alignBottom True if the task's bottom should be aligned to the adjusted
-     *                    bounds's bottom; false if the task's top should be aligned
-     *                    the adjusted bounds's top.
-     */
-    void alignToAdjustedBounds(Rect adjustedBounds, Rect tempInsetBounds, boolean alignBottom) {
-        if (!isResizeable() || EMPTY.equals(getRequestedOverrideConfiguration())) {
-            return;
-        }
-
-        getBounds(mTmpRect2);
-        if (alignBottom) {
-            int offsetY = adjustedBounds.bottom - mTmpRect2.bottom;
-            mTmpRect2.offset(0, offsetY);
-        } else {
-            mTmpRect2.offsetTo(adjustedBounds.left, adjustedBounds.top);
-        }
-        if (tempInsetBounds == null || tempInsetBounds.isEmpty()) {
-            setOverrideDisplayedBounds(null);
-            setBounds(mTmpRect2);
-        } else {
-            setOverrideDisplayedBounds(mTmpRect2);
-            setBounds(tempInsetBounds);
-        }
-    }
-
-    /**
-     * Gets the current overridden displayed bounds. These will be empty if the task is not
-     * currently overriding where it is displayed.
-     */
-    @Override
-    public Rect getDisplayedBounds() {
-        if (mOverrideDisplayedBounds.isEmpty()) {
-            return super.getDisplayedBounds();
-        } else {
-            return mOverrideDisplayedBounds;
-        }
-    }
-
     @Override
     void getAnimationFrames(Rect outFrame, Rect outInsets, Rect outStableInsets,
             Rect outSurfaceInsets) {
@@ -3072,6 +3119,7 @@
         mForceShowForAllUsers = forceShowForAllUsers;
     }
 
+    @Override
     public boolean isAttached() {
         final TaskDisplayArea taskDisplayArea = getDisplayArea();
         return taskDisplayArea != null && !taskDisplayArea.isRemoved();
@@ -3209,6 +3257,52 @@
         return activity != null ? activity.findMainWindow() : null;
     }
 
+    ActivityRecord topRunningActivity() {
+        return topRunningActivity(false /* focusableOnly */);
+    }
+
+    ActivityRecord topRunningActivity(boolean focusableOnly) {
+        // Split into 2 to avoid object creation due to variable capture.
+        if (focusableOnly) {
+            return getActivity((r) -> r.canBeTopRunning() && r.isFocusable());
+        } else {
+            return getActivity(ActivityRecord::canBeTopRunning);
+        }
+    }
+
+    ActivityRecord topRunningNonDelayedActivityLocked(ActivityRecord notTop) {
+        final PooledPredicate p = PooledLambda.obtainPredicate(Task::isTopRunningNonDelayed
+                , PooledLambda.__(ActivityRecord.class), notTop);
+        final ActivityRecord r = getActivity(p);
+        p.recycle();
+        return r;
+    }
+
+    private static boolean isTopRunningNonDelayed(ActivityRecord r, ActivityRecord notTop) {
+        return !r.delayedResume && r != notTop && r.canBeTopRunning();
+    }
+
+    /**
+     * This is a simplified version of topRunningActivity that provides a number of
+     * optional skip-over modes.  It is intended for use with the ActivityController hook only.
+     *
+     * @param token If non-null, any history records matching this token will be skipped.
+     * @param taskId If non-zero, we'll attempt to skip over records with the same task ID.
+     *
+     * @return Returns the HistoryRecord of the next activity on the stack.
+     */
+    ActivityRecord topRunningActivity(IBinder token, int taskId) {
+        final PooledPredicate p = PooledLambda.obtainPredicate(Task::isTopRunning,
+                PooledLambda.__(ActivityRecord.class), taskId, token);
+        final ActivityRecord r = getActivity(p);
+        p.recycle();
+        return r;
+    }
+
+    private static boolean isTopRunning(ActivityRecord r, int taskId, IBinder notTop) {
+        return r.getTask().mTaskId != taskId && r.appToken != notTop && r.canBeTopRunning();
+    }
+
     ActivityRecord getTopFullscreenActivity() {
         return getActivity((r) -> {
             final WindowState win = r.findMainWindow();
@@ -3399,7 +3493,6 @@
             mTmpDimBoundsRect.offsetTo(0, 0);
         }
 
-        updateSurfaceCrop();
         updateShadowsRadius(isFocused(), getPendingTransaction());
 
         if (mDimmer.updateDims(getPendingTransaction(), mTmpDimBoundsRect)) {
@@ -3433,7 +3526,6 @@
         pw.println(prefix + "taskId=" + mTaskId);
         pw.println(doublePrefix + "mBounds=" + getBounds().toShortString());
         pw.println(doublePrefix + "appTokens=" + mChildren);
-        pw.println(doublePrefix + "mDisplayedBounds=" + mOverrideDisplayedBounds.toShortString());
 
         final String triplePrefix = doublePrefix + "  ";
         final String quadruplePrefix = triplePrefix + "  ";
@@ -3459,7 +3551,9 @@
         final Intent baseIntent = getBaseIntent();
         // Make a copy of base intent because this is like a snapshot info.
         // Besides, {@link RecentTasks#getRecentTasksImpl} may modify it.
+        final int baseIntentFlags = baseIntent == null ? 0 : baseIntent.getFlags();
         info.baseIntent = baseIntent == null ? new Intent() : baseIntent.cloneFilter();
+        info.baseIntent.setFlags(baseIntentFlags);
         info.baseActivity = mReuseActivitiesReport.base != null
                 ? mReuseActivitiesReport.base.intent.getComponent()
                 : null;
@@ -3510,9 +3604,169 @@
         return this;
     }
 
-    // TODO(task-merge): Figure-out how this should work with hierarchy tasks.
+    /**
+     * Returns true if the task should be visible.
+     *
+     * @param starting The currently starting activity or null if there is none.
+     */
     boolean shouldBeVisible(ActivityRecord starting) {
-        return true;
+        return getVisibility(starting) != STACK_VISIBILITY_INVISIBLE;
+    }
+
+    /**
+     * Returns true if the task should be visible.
+     *
+     * @param starting The currently starting activity or null if there is none.
+     */
+    @ActivityStack.StackVisibility
+    int getVisibility(ActivityRecord starting) {
+        if (!isAttached() || isForceHidden()) {
+            return STACK_VISIBILITY_INVISIBLE;
+        }
+
+        boolean gotSplitScreenStack = false;
+        boolean gotOpaqueSplitScreenPrimary = false;
+        boolean gotOpaqueSplitScreenSecondary = false;
+        boolean gotTranslucentFullscreen = false;
+        boolean gotTranslucentSplitScreenPrimary = false;
+        boolean gotTranslucentSplitScreenSecondary = false;
+        boolean shouldBeVisible = true;
+
+        // This stack is only considered visible if all its parent stacks are considered visible,
+        // so check the visibility of all ancestor stacks first.
+        final WindowContainer parent = getParent();
+        if (parent.asTask() != null) {
+            final int parentVisibility = parent.asTask().getVisibility(starting);
+            if (parentVisibility == STACK_VISIBILITY_INVISIBLE) {
+                // Can't be visible if parent isn't visible
+                return STACK_VISIBILITY_INVISIBLE;
+            } else if (parentVisibility == STACK_VISIBILITY_VISIBLE_BEHIND_TRANSLUCENT) {
+                // Parent is behind a translucent container so the highest visibility this container
+                // can get is that.
+                gotTranslucentFullscreen = true;
+            }
+        }
+
+        final int windowingMode = getWindowingMode();
+        final boolean isAssistantType = isActivityTypeAssistant();
+        for (int i = parent.getChildCount() - 1; i >= 0; --i) {
+            final WindowContainer wc = parent.getChildAt(i);
+            final Task other = wc.asTask();
+            if (other == null) continue;
+
+            final boolean hasRunningActivities = other.topRunningActivity() != null;
+            if (other == this) {
+                // Should be visible if there is no other stack occluding it, unless it doesn't
+                // have any running activities, not starting one and not home stack.
+                shouldBeVisible = hasRunningActivities || isInTask(starting) != null
+                        || isActivityTypeHome();
+                break;
+            }
+
+            if (!hasRunningActivities) {
+                continue;
+            }
+
+            final int otherWindowingMode = other.getWindowingMode();
+
+            if (otherWindowingMode == WINDOWING_MODE_FULLSCREEN) {
+                // In this case the home stack isn't resizeable even though we are in split-screen
+                // mode. We still want the primary splitscreen stack to be visible as there will be
+                // a slight hint of it in the status bar area above the non-resizeable home
+                // activity. In addition, if the fullscreen assistant is over primary splitscreen
+                // stack, the stack should still be visible in the background as long as the recents
+                // animation is running.
+                final int activityType = other.getActivityType();
+                if (windowingMode == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY) {
+                    if (activityType == ACTIVITY_TYPE_HOME
+                            || (activityType == ACTIVITY_TYPE_ASSISTANT
+                            && mWmService.getRecentsAnimationController() != null)) {
+                        break;
+                    }
+                }
+                if (other.isTranslucent(starting)) {
+                    // Can be visible behind a translucent fullscreen stack.
+                    gotTranslucentFullscreen = true;
+                    continue;
+                }
+                return STACK_VISIBILITY_INVISIBLE;
+            } else if (otherWindowingMode == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY
+                    && !gotOpaqueSplitScreenPrimary) {
+                gotSplitScreenStack = true;
+                gotTranslucentSplitScreenPrimary = other.isTranslucent(starting);
+                gotOpaqueSplitScreenPrimary = !gotTranslucentSplitScreenPrimary;
+                if (windowingMode == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY
+                        && gotOpaqueSplitScreenPrimary) {
+                    // Can not be visible behind another opaque stack in split-screen-primary mode.
+                    return STACK_VISIBILITY_INVISIBLE;
+                }
+            } else if (otherWindowingMode == WINDOWING_MODE_SPLIT_SCREEN_SECONDARY
+                    && !gotOpaqueSplitScreenSecondary) {
+                gotSplitScreenStack = true;
+                gotTranslucentSplitScreenSecondary = other.isTranslucent(starting);
+                gotOpaqueSplitScreenSecondary = !gotTranslucentSplitScreenSecondary;
+                if (windowingMode == WINDOWING_MODE_SPLIT_SCREEN_SECONDARY
+                        && gotOpaqueSplitScreenSecondary) {
+                    // Can not be visible behind another opaque stack in split-screen-secondary mode.
+                    return STACK_VISIBILITY_INVISIBLE;
+                }
+            }
+            if (gotOpaqueSplitScreenPrimary && gotOpaqueSplitScreenSecondary) {
+                // Can not be visible if we are in split-screen windowing mode and both halves of
+                // the screen are opaque.
+                return STACK_VISIBILITY_INVISIBLE;
+            }
+            if (isAssistantType && gotSplitScreenStack) {
+                // Assistant stack can't be visible behind split-screen. In addition to this not
+                // making sense, it also works around an issue here we boost the z-order of the
+                // assistant window surfaces in window manager whenever it is visible.
+                return STACK_VISIBILITY_INVISIBLE;
+            }
+        }
+
+        if (!shouldBeVisible) {
+            return STACK_VISIBILITY_INVISIBLE;
+        }
+
+        // Handle cases when there can be a translucent split-screen stack on top.
+        switch (windowingMode) {
+            case WINDOWING_MODE_FULLSCREEN:
+                if (gotTranslucentSplitScreenPrimary || gotTranslucentSplitScreenSecondary) {
+                    // At least one of the split-screen stacks that covers this one is translucent.
+                    return STACK_VISIBILITY_VISIBLE_BEHIND_TRANSLUCENT;
+                }
+                break;
+            case WINDOWING_MODE_SPLIT_SCREEN_PRIMARY:
+                if (gotTranslucentSplitScreenPrimary) {
+                    // Covered by translucent primary split-screen on top.
+                    return STACK_VISIBILITY_VISIBLE_BEHIND_TRANSLUCENT;
+                }
+                break;
+            case WINDOWING_MODE_SPLIT_SCREEN_SECONDARY:
+                if (gotTranslucentSplitScreenSecondary) {
+                    // Covered by translucent secondary split-screen on top.
+                    return STACK_VISIBILITY_VISIBLE_BEHIND_TRANSLUCENT;
+                }
+                break;
+        }
+
+        // Lastly - check if there is a translucent fullscreen stack on top.
+        return gotTranslucentFullscreen ? STACK_VISIBILITY_VISIBLE_BEHIND_TRANSLUCENT
+                : STACK_VISIBILITY_VISIBLE;
+    }
+
+    ActivityRecord isInTask(ActivityRecord r) {
+        if (r == null) {
+            return null;
+        }
+        final Task task = r.getRootTask();
+        if (task != null && r.isDescendantOf(task)) {
+            if (task != this) Slog.w(TAG, "Illegal state! task does not point to stack it is in. "
+                    + "stack=" + this + " task=" + task + " r=" + r
+                    + " callers=" + Debug.getCallers(15, "\n"));
+            return r;
+        }
+        return null;
     }
 
     void dump(PrintWriter pw, String prefix) {
@@ -4177,19 +4431,20 @@
         // Let the old organizer know it has lost control.
         sendTaskVanished();
         mTaskOrganizer = organizer;
-        sendTaskAppeared();
-        onTaskOrganizerChanged();
-        return true;
-    }
 
-    void taskOrganizerUnregistered() {
-        mTaskOrganizer = null;
-        mTaskAppearedSent = false;
-        mLastTaskOrganizerWindowingMode = -1;
-        onTaskOrganizerChanged();
-        if (mCreatedByOrganizer) {
-            removeImmediately();
+        if (mTaskOrganizer != null) {
+            sendTaskAppeared();
+        } else {
+            // No longer managed by any organizer.
+            mTaskAppearedSent = false;
+            mLastTaskOrganizerWindowingMode = -1;
+            setForceHidden(FLAG_FORCE_HIDDEN_FOR_TASK_ORG, false /* set */);
+            if (mCreatedByOrganizer) {
+                removeImmediately();
+            }
         }
+
+        return true;
     }
 
     /**
@@ -4226,14 +4481,6 @@
         return result;
     }
 
-    private void onTaskOrganizerChanged() {
-        if (mTaskOrganizer == null) {
-            // If this task is no longer controlled by a task organizer, then reset the force hidden
-            // state
-            setForceHidden(FLAG_FORCE_HIDDEN_FOR_TASK_ORG, false /* set */);
-        }
-    }
-
     @Override
     void setSurfaceControl(SurfaceControl sc) {
         super.setSurfaceControl(sc);
@@ -4272,8 +4519,7 @@
         // Get elevation for a specific windowing mode.
         if (inPinnedWindowingMode()) {
             elevation = PINNED_WINDOWING_MODE_ELEVATION_IN_DIP;
-        } else if (ENABLE_FREEFORM_COMPOSITOR_SHADOWS && inFreeformWindowingMode()) {
-            // TODO(b/149585281) remove when root task has the correct bounds for freeform
+        } else if (inFreeformWindowingMode()) {
             elevation = taskIsFocused
                     ? DECOR_SHADOW_FOCUSED_HEIGHT_IN_DIP : DECOR_SHADOW_UNFOCUSED_HEIGHT_IN_DIP;
         } else {
@@ -4333,7 +4579,7 @@
 
     void setActivityWindowingMode(int windowingMode) {
         PooledConsumer c = PooledLambda.obtainConsumer(ActivityRecord::setWindowingMode,
-            PooledLambda.__(ActivityRecord.class), windowingMode);
+                PooledLambda.__(ActivityRecord.class), windowingMode);
         forAllActivities(c);
         c.recycle();
     }
diff --git a/services/core/java/com/android/server/wm/TaskDisplayArea.java b/services/core/java/com/android/server/wm/TaskDisplayArea.java
index ea9a362..3dc6723 100644
--- a/services/core/java/com/android/server/wm/TaskDisplayArea.java
+++ b/services/core/java/com/android/server/wm/TaskDisplayArea.java
@@ -123,6 +123,10 @@
     private final RootWindowContainer.FindTaskResult
             mTmpFindTaskResult = new RootWindowContainer.FindTaskResult();
 
+    // Indicates whether the Assistant should show on top of the Dream (respectively, above
+    // everything else on screen). Otherwise, it will be put under always-on-top stacks.
+    private final boolean mAssistantOnTopOfDream;
+
     /**
      * If this is the same as {@link #getFocusedStack} then the activity on the top of the focused
      * stack has been resumed. If stacks are changing position this will hold the old stack until
@@ -148,6 +152,9 @@
         mDisplayContent = displayContent;
         mRootWindowContainer = service.mRoot;
         mAtmService = service.mAtmService;
+
+        mAssistantOnTopOfDream = mWmService.mContext.getResources().getBoolean(
+                    com.android.internal.R.bool.config_assistantOnTopOfDream);
     }
 
     /**
@@ -184,6 +191,7 @@
         return count > 0 ? getChildAt(count - 1) : null;
     }
 
+    // TODO: Figure-out a way to remove since it might be a source of confusion.
     int getIndexOf(ActivityStack stack) {
         return mChildren.indexOf(stack);
     }
@@ -266,16 +274,14 @@
 
     @Override
     void addChild(ActivityStack stack, int position) {
+        if (DEBUG_STACK) Slog.d(TAG_WM, "Set stack=" + stack + " on taskDisplayArea=" + this);
         addStackReferenceIfNeeded(stack);
         position = findPositionForStack(position, stack, true /* adding */);
 
         super.addChild(stack, position);
         mAtmService.updateSleepIfNeededLocked();
 
-        // The reparenting case is handled in WindowContainer.
-        if (!stack.mReparenting) {
-            mDisplayContent.setLayoutNeeded();
-        }
+        positionStackAt(stack, position);
     }
 
     @Override
@@ -328,55 +334,80 @@
     }
 
     /**
+     * Assigns a priority number to stack types. This priority defines an order between the types
+     * of stacks that are added to the task display area.
+     *
+     * Higher priority number indicates that the stack should have a higher z-order.
+     *
+     * @return the priority of the stack
+     */
+    private int getPriority(ActivityStack stack) {
+        if (mAssistantOnTopOfDream && stack.isActivityTypeAssistant()) return 4;
+        if (stack.isActivityTypeDream()) return 3;
+        if (stack.inPinnedWindowingMode()) return 2;
+        if (stack.isAlwaysOnTop()) return 1;
+        return 0;
+    }
+
+    private int findMinPositionForStack(ActivityStack stack) {
+        int minPosition = POSITION_BOTTOM;
+        for (int i = 0; i < mChildren.size(); ++i) {
+            if (getPriority(getStackAt(i)) < getPriority(stack)) {
+                minPosition = i;
+            } else {
+                break;
+            }
+        }
+
+        if (stack.isAlwaysOnTop()) {
+            // Since a stack could be repositioned while still being one of the children, we check
+            // if this always-on-top stack already exists and if so, set the minPosition to its
+            // previous position.
+            final int currentIndex = getIndexOf(stack);
+            if (currentIndex > minPosition) {
+                minPosition = currentIndex;
+            }
+        }
+        return minPosition;
+    }
+
+    private int findMaxPositionForStack(ActivityStack stack) {
+        for (int i = mChildren.size() - 1; i >= 0; --i) {
+            final ActivityStack curr = getStackAt(i);
+            // Since a stack could be repositioned while still being one of the children, we check
+            // if 'curr' is the same stack and skip it if so
+            final boolean sameStack = curr == stack;
+            if (getPriority(curr) <= getPriority(stack) && !sameStack) {
+                return i;
+            }
+        }
+        return 0;
+    }
+
+    /**
      * When stack is added or repositioned, find a proper position for it.
-     * This will make sure that pinned stack always stays on top.
+     *
+     * The order is defined as:
+     *  - Dream is on top of everything
+     *  - PiP is directly below the Dream
+     *  - always-on-top stacks are directly below PiP; new always-on-top stacks are added above
+     *    existing ones
+     *  - other non-always-on-top stacks come directly below always-on-top stacks; new
+     *    non-always-on-top stacks are added directly below always-on-top stacks and above existing
+     *    non-always-on-top stacks
+     *  - if {@link #mAssistantOnTopOfDream} is enabled, then Assistant is on top of everything
+     *    (including the Dream); otherwise, it is a normal non-always-on-top stack
+     *
      * @param requestedPosition Position requested by caller.
      * @param stack Stack to be added or positioned.
      * @param adding Flag indicates whether we're adding a new stack or positioning an existing.
      * @return The proper position for the stack.
      */
-    private int findPositionForStack(int requestedPosition, ActivityStack stack,
-            boolean adding) {
-        if (stack.isActivityTypeDream()) {
-            return POSITION_TOP;
-        }
-
-        if (stack.inPinnedWindowingMode()) {
-            return POSITION_TOP;
-        }
-
-        final int topChildPosition = mChildren.size() - 1;
-        int belowAlwaysOnTopPosition = POSITION_BOTTOM;
-        for (int i = topChildPosition; i >= 0; --i) {
-            // Since a stack could be repositioned while being one of the child, return
-            // current index if that's the same stack we are positioning and it is always on
-            // top.
-            final boolean sameStack = mChildren.get(i) == stack;
-            if ((sameStack && stack.isAlwaysOnTop())
-                    || (!sameStack && !mChildren.get(i).isAlwaysOnTop())) {
-                belowAlwaysOnTopPosition = i;
-                break;
-            }
-        }
-
+    private int findPositionForStack(int requestedPosition, ActivityStack stack, boolean adding) {
         // The max possible position we can insert the stack at.
-        int maxPosition = POSITION_TOP;
+        int maxPosition = findMaxPositionForStack(stack);
         // The min possible position we can insert the stack at.
-        int minPosition = POSITION_BOTTOM;
-
-        if (stack.isAlwaysOnTop()) {
-            if (hasPinnedTask()) {
-                // Always-on-top stacks go below the pinned stack.
-                maxPosition = mChildren.indexOf(mRootPinnedTask) - 1;
-            }
-            // Always-on-top stacks need to be above all other stacks.
-            minPosition = belowAlwaysOnTopPosition
-                    != POSITION_BOTTOM ? belowAlwaysOnTopPosition : topChildPosition;
-        } else {
-            // Other stacks need to be below the always-on-top stacks.
-            maxPosition = belowAlwaysOnTopPosition
-                    != POSITION_BOTTOM ? belowAlwaysOnTopPosition : 0;
-        }
+        int minPosition = findMinPositionForStack(stack);
 
         // Cap the requested position to something reasonable for the previous position check
         // below.
@@ -637,12 +668,6 @@
         }
     }
 
-    void addStack(ActivityStack stack, int position) {
-        if (DEBUG_STACK) Slog.d(TAG_WM, "Set stack=" + stack + " on taskDisplayArea=" + this);
-        addChild(stack, position);
-        positionStackAt(stack, position);
-    }
-
     void onStackRemoved(ActivityStack stack) {
         if (ActivityTaskManagerDebugConfig.DEBUG_STACK) {
             Slog.v(TAG_STACK, "removeStack: detaching " + stack + " from displayId="
@@ -690,7 +715,7 @@
         //       the position internally, also update the logic here
         final ActivityStack prevFocusedStack = updateLastFocusedStackReason != null
                 ? getFocusedStack() : null;
-        final boolean wasContained = getIndexOf(stack) >= 0;
+        final boolean wasContained = mChildren.contains(stack);
         if (mDisplayContent.mSingleTaskInstance && getStackCount() == 1 && !wasContained) {
             throw new IllegalStateException(
                     "positionStackAt: Can only have one task on display=" + this);
@@ -786,7 +811,7 @@
                 }
             } else if (stack.getDisplayArea() != this || !stack.isRootTask()) {
                 if (stack.getParent() == null) {
-                    addStack(stack, position);
+                    addChild(stack, position);
                 } else {
                     stack.reparent(this, onTop);
                 }
@@ -879,6 +904,11 @@
                     + windowingMode);
         }
 
+        if (windowingMode == WINDOWING_MODE_PINNED && getRootPinnedTask() != null) {
+            // Only 1 stack can be PINNED at a time, so dismiss the existing one
+            getRootPinnedTask().dismissPip();
+        }
+
         final int stackId = getNextStackId();
         return createStackUnchecked(windowingMode, activityType, stackId, onTop, info, intent,
                 createdByOrganizer);
@@ -937,7 +967,7 @@
                 positionStackAtTop((ActivityStack) launchRootTask, false /* includingParents */);
             }
         } else {
-            addStack(stack, onTop ? POSITION_TOP : POSITION_BOTTOM);
+            addChild(stack, onTop ? POSITION_TOP : POSITION_BOTTOM);
             stack.setWindowingMode(windowingMode, true /* creating */);
         }
         return stack;
diff --git a/services/core/java/com/android/server/wm/TaskLaunchParamsModifier.java b/services/core/java/com/android/server/wm/TaskLaunchParamsModifier.java
index da4401a..11c20b6 100644
--- a/services/core/java/com/android/server/wm/TaskLaunchParamsModifier.java
+++ b/services/core/java/com/android/server/wm/TaskLaunchParamsModifier.java
@@ -48,6 +48,7 @@
 import android.util.Slog;
 import android.view.Gravity;
 import android.view.View;
+import android.window.WindowContainerToken;
 
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.server.wm.LaunchParamsController.LaunchParams;
@@ -134,13 +135,15 @@
             return RESULT_SKIP;
         }
 
-        // STEP 1: Determine the display to launch the activity/task.
-        final int displayId = getPreferredLaunchDisplay(task, options, source, currentParams);
-        outParams.mPreferredDisplayId = displayId;
-        DisplayContent display = mSupervisor.mRootWindowContainer.getDisplayContent(displayId);
+        // STEP 1: Determine the display area to launch the activity/task.
+        final TaskDisplayArea taskDisplayArea = getPreferredLaunchTaskDisplayArea(task,
+                options, source, currentParams);
+        outParams.mPreferredTaskDisplayArea = taskDisplayArea;
+        // TODO(b/152116619): Update the usages of display to use taskDisplayArea below.
+        final DisplayContent display = taskDisplayArea.mDisplayContent;
         if (DEBUG) {
-            appendLog("display-id=" + outParams.mPreferredDisplayId + " display-windowing-mode="
-                    + display.getWindowingMode());
+            appendLog("task-display-area=" + outParams.mPreferredTaskDisplayArea
+                    + " display-area-windowing-mode=" + taskDisplayArea.getWindowingMode());
         }
 
         if (phase == PHASE_DISPLAY) {
@@ -210,8 +213,8 @@
         // layout and display conditions are not contradictory to their suggestions. It's important
         // to carry over their values because LaunchParamsController doesn't automatically do that.
         if (!currentParams.isEmpty() && !hasInitialBounds
-                && (!currentParams.hasPreferredDisplay()
-                    || displayId == currentParams.mPreferredDisplayId)) {
+                && (currentParams.mPreferredTaskDisplayArea == null
+                    || currentParams.mPreferredTaskDisplayArea == taskDisplayArea)) {
             // Only set windowing mode if display is in freeform. If the display is in fullscreen
             // mode we should only launch a task in fullscreen mode.
             if (currentParams.hasWindowingMode() && display.inFreeformWindowingMode()) {
@@ -270,19 +273,19 @@
                 : display.getWindowingMode();
         if (fullyResolvedCurrentParam) {
             if (resolvedMode == WINDOWING_MODE_FREEFORM) {
-                // Make sure bounds are in the display if it's possibly in a different display.
-                if (currentParams.mPreferredDisplayId != displayId) {
+                // Make sure bounds are in the display if it's possibly in a different display/area.
+                if (currentParams.mPreferredTaskDisplayArea != taskDisplayArea) {
                     adjustBoundsToFitInDisplay(display, outParams.mBounds);
                 }
                 // Even though we want to keep original bounds, we still don't want it to stomp on
                 // an existing task.
                 adjustBoundsToAvoidConflictInDisplay(display, outParams.mBounds);
             }
-        } else if (display.inFreeformWindowingMode()) {
+        } else if (taskDisplayArea.inFreeformWindowingMode()) {
             if (source != null && source.inFreeformWindowingMode()
                     && resolvedMode == WINDOWING_MODE_FREEFORM
                     && outParams.mBounds.isEmpty()
-                    && source.getDisplayId() == display.getDisplayId()) {
+                    && source.getDisplayArea() == taskDisplayArea) {
                 // Set bounds to be not very far from source activity.
                 cascadeBounds(source.getConfiguration().windowConfiguration.getBounds(),
                         display, outParams.mBounds);
@@ -293,54 +296,87 @@
         return RESULT_CONTINUE;
     }
 
-    private int getPreferredLaunchDisplay(@Nullable Task task,
+    private TaskDisplayArea getPreferredLaunchTaskDisplayArea(@Nullable Task task,
             @Nullable ActivityOptions options, ActivityRecord source, LaunchParams currentParams) {
-        if (!mSupervisor.mService.mSupportsMultiDisplay) {
-            return DEFAULT_DISPLAY;
+        TaskDisplayArea taskDisplayArea = null;
+
+        final WindowContainerToken optionLaunchTaskDisplayAreaToken = options != null
+                ? options.getLaunchTaskDisplayArea() : null;
+        if (optionLaunchTaskDisplayAreaToken != null) {
+            taskDisplayArea = (TaskDisplayArea) WindowContainer.fromBinder(
+                    optionLaunchTaskDisplayAreaToken.asBinder());
+            if (DEBUG) appendLog("display-area-from-option=" + taskDisplayArea);
         }
 
-        int displayId = INVALID_DISPLAY;
-        final int optionLaunchId = options != null ? options.getLaunchDisplayId() : INVALID_DISPLAY;
-        if (optionLaunchId != INVALID_DISPLAY) {
-            if (DEBUG) appendLog("display-from-option=" + optionLaunchId);
-            displayId = optionLaunchId;
+        // If task display area is not specified in options - try display id
+        if (taskDisplayArea == null) {
+            final int optionLaunchId =
+                    options != null ? options.getLaunchDisplayId() : INVALID_DISPLAY;
+            if (optionLaunchId != INVALID_DISPLAY) {
+                final DisplayContent dc = mSupervisor.mRootWindowContainer
+                        .getDisplayContent(optionLaunchId);
+                if (dc != null) {
+                    taskDisplayArea = dc.getDefaultTaskDisplayArea();
+                    if (DEBUG) appendLog("display-from-option=" + optionLaunchId);
+                }
+            }
         }
 
-        // If the source activity is a no-display activity, pass on the launch display id from
-        // source activity as currently preferred.
-        if (displayId == INVALID_DISPLAY && source != null && source.noDisplay) {
-            displayId = source.mHandoverLaunchDisplayId;
-            if (DEBUG) appendLog("display-from-no-display-source=" + displayId);
+        // If the source activity is a no-display activity, pass on the launch display area token
+        // from source activity as currently preferred.
+        if (taskDisplayArea == null && source != null
+                && source.noDisplay) {
+            taskDisplayArea = source.mHandoverTaskDisplayArea;
+            if (taskDisplayArea != null) {
+                if (DEBUG) appendLog("display-area-from-no-display-source=" + taskDisplayArea);
+            } else {
+                // Try handover display id
+                final int displayId = source.mHandoverLaunchDisplayId;
+                final DisplayContent dc =
+                        mSupervisor.mRootWindowContainer.getDisplayContent(displayId);
+                if (dc != null) {
+                    taskDisplayArea = dc.getDefaultTaskDisplayArea();
+                    if (DEBUG) appendLog("display-from-no-display-source=" + displayId);
+                }
+            }
         }
 
-        ActivityStack stack =
-                (displayId == INVALID_DISPLAY && task != null) ? task.getStack() : null;
+        ActivityStack stack = (taskDisplayArea == null && task != null)
+                ? task.getStack() : null;
         if (stack != null) {
             if (DEBUG) appendLog("display-from-task=" + stack.getDisplayId());
-            displayId = stack.getDisplayId();
+            taskDisplayArea = stack.getDisplayArea();
         }
 
-        if (displayId == INVALID_DISPLAY && source != null) {
-            final int sourceDisplayId = source.getDisplayId();
-            if (DEBUG) appendLog("display-from-source=" + sourceDisplayId);
-            displayId = sourceDisplayId;
+        if (taskDisplayArea == null && source != null) {
+            final TaskDisplayArea sourceDisplayArea = source.getDisplayArea();
+            if (DEBUG) appendLog("display-area-from-source=" + sourceDisplayArea);
+            taskDisplayArea = sourceDisplayArea;
         }
 
-        if (displayId == INVALID_DISPLAY && options != null) {
+        if (taskDisplayArea == null && options != null) {
             final int callerDisplayId = options.getCallerDisplayId();
-            if (DEBUG) appendLog("display-from-caller=" + callerDisplayId);
-            displayId = callerDisplayId;
+            final DisplayContent dc =
+                    mSupervisor.mRootWindowContainer.getDisplayContent(callerDisplayId);
+            if (dc != null) {
+                taskDisplayArea = dc.getDefaultTaskDisplayArea();
+                if (DEBUG) appendLog("display-from-caller=" + callerDisplayId);
+            }
         }
 
-        if (displayId != INVALID_DISPLAY
-                && mSupervisor.mRootWindowContainer.getDisplayContent(displayId) == null) {
-            displayId = currentParams.mPreferredDisplayId;
+        if (taskDisplayArea == null) {
+            taskDisplayArea = currentParams.mPreferredTaskDisplayArea;
         }
-        displayId = (displayId == INVALID_DISPLAY) ? currentParams.mPreferredDisplayId : displayId;
 
-        return (displayId != INVALID_DISPLAY
-                && mSupervisor.mRootWindowContainer.getDisplayContent(displayId) != null)
-                ? displayId : DEFAULT_DISPLAY;
+        // Fallback to default display if the device didn't declare support for multi-display
+        if (taskDisplayArea != null && !mSupervisor.mService.mSupportsMultiDisplay
+                && taskDisplayArea.getDisplayId() != DEFAULT_DISPLAY) {
+            taskDisplayArea = mSupervisor.mRootWindowContainer.getDefaultTaskDisplayArea();
+        }
+
+        return (taskDisplayArea != null)
+                ? taskDisplayArea
+                : mSupervisor.mRootWindowContainer.getDefaultTaskDisplayArea();
     }
 
     private boolean canInheritWindowingModeFromSource(@NonNull DisplayContent display,
diff --git a/services/core/java/com/android/server/wm/TaskOrganizerController.java b/services/core/java/com/android/server/wm/TaskOrganizerController.java
index adc50bf..306c100 100644
--- a/services/core/java/com/android/server/wm/TaskOrganizerController.java
+++ b/services/core/java/com/android/server/wm/TaskOrganizerController.java
@@ -218,18 +218,24 @@
         }
 
         void dispose() {
-            releaseTasks();
+            // Move organizer from managing specific windowing modes
             for (int i = mTaskOrganizersForWindowingMode.size() - 1; i >= 0; --i) {
                 mTaskOrganizersForWindowingMode.valueAt(i).remove(mOrganizer.getBinder());
             }
-        }
 
-        private void releaseTasks() {
-            for (int i = mOrganizedTasks.size() - 1; i >= 0; i--) {
-                final Task t = mOrganizedTasks.get(i);
-                removeTask(t);
-                t.taskOrganizerUnregistered();
+            // Update tasks currently managed by this organizer to the next one available if
+            // possible.
+            while (!mOrganizedTasks.isEmpty()) {
+                final Task t = mOrganizedTasks.get(0);
+                t.updateTaskOrganizerState(true /* forceUpdate */);
+                if (mOrganizedTasks.contains(t)) {
+                    removeTask(t);
+                }
             }
+
+            // Remove organizer state after removing tasks so we get a chance to send
+            // onTaskVanished.
+            mTaskOrganizerStates.remove(asBinder());
         }
 
         void unlinkDeath() {
@@ -313,16 +319,11 @@
                             new TaskOrganizerState(organizer, uid));
                 }
 
-                if (orgs.size() == 1) {
-                    // Only in the case where this is the root task organizer for the given
-                    // windowing mode, we add report all existing tasks in that mode to the new
-                    // task organizer.
-                    mService.mRootWindowContainer.forAllTasks((task) -> {
-                        if (task.getWindowingMode() == windowingMode) {
-                            task.updateTaskOrganizerState(true /* forceUpdate */);
-                        }
-                    });
-                }
+                mService.mRootWindowContainer.forAllTasks((task) -> {
+                    if (task.getWindowingMode() == windowingMode) {
+                        task.updateTaskOrganizerState(true /* forceUpdate */);
+                    }
+                });
             }
         } finally {
             Binder.restoreCallingIdentity(origId);
@@ -335,7 +336,7 @@
         final long origId = Binder.clearCallingIdentity();
         try {
             synchronized (mGlobalLock) {
-                final TaskOrganizerState state = mTaskOrganizerStates.remove(organizer.asBinder());
+                final TaskOrganizerState state = mTaskOrganizerStates.get(organizer.asBinder());
                 if (state == null) {
                     return;
                 }
@@ -367,7 +368,9 @@
 
     void onTaskVanished(ITaskOrganizer organizer, Task task) {
         final TaskOrganizerState state = mTaskOrganizerStates.get(organizer.asBinder());
-        state.removeTask(task);
+        if (state != null) {
+            state.removeTask(task);
+        }
     }
 
     @Override
diff --git a/services/core/java/com/android/server/wm/TaskSnapshotSurface.java b/services/core/java/com/android/server/wm/TaskSnapshotSurface.java
index 14e5c6c..24cd7d1 100644
--- a/services/core/java/com/android/server/wm/TaskSnapshotSurface.java
+++ b/services/core/java/com/android/server/wm/TaskSnapshotSurface.java
@@ -217,6 +217,7 @@
                     = topFullscreenOpaqueWindow.mAttrs.insetsFlags.behavior;
             layoutParams.insetsFlags.appearance
                     = topFullscreenOpaqueWindow.mAttrs.insetsFlags.appearance;
+            layoutParams.layoutInDisplayCutoutMode = attrs.layoutInDisplayCutoutMode;
             layoutParams.setFitInsetsTypes(attrs.getFitInsetsTypes());
             layoutParams.setFitInsetsSides(attrs.getFitInsetsSides());
             layoutParams.setFitInsetsIgnoringVisibility(attrs.isFitInsetsIgnoringVisibility());
@@ -374,15 +375,15 @@
             frame = calculateSnapshotFrame(crop);
             mTransaction.setWindowCrop(mChildSurfaceControl, crop);
             mTransaction.setPosition(mChildSurfaceControl, frame.left, frame.top);
+            mTmpSnapshotSize.set(crop);
             mTmpDstFrame.set(frame);
         } else {
             frame = null;
+            mTmpSnapshotSize.set(0, 0, buffer.getWidth(), buffer.getHeight());
             mTmpDstFrame.set(mFrame);
         }
-        mTmpDstFrame.offsetTo(0, 0);
 
         // Scale the mismatch dimensions to fill the task bounds
-        mTmpSnapshotSize.set(0, 0, buffer.getWidth(), buffer.getHeight());
         mSnapshotMatrix.setRectToRect(mTmpSnapshotSize, mTmpDstFrame, Matrix.ScaleToFit.FILL);
         mTransaction.setMatrix(mChildSurfaceControl, mSnapshotMatrix, mTmpFloat9);
 
@@ -435,16 +436,11 @@
                 (float) mSnapshot.getSnapshot().getHeight() / mSnapshot.getTaskSize().y;
 
         // Rescale the frame from snapshot to window coordinate space
-        final Rect frame = new Rect(
-                (int) (crop.left / scaleX + 0.5f),
-                (int) (crop.top / scaleY + 0.5f),
-                (int) (crop.right / scaleX + 0.5f),
-                (int) (crop.bottom / scaleY + 0.5f)
+        final Rect frame = new Rect(0, 0,
+                (int) (crop.width() / scaleX + 0.5f),
+                (int) (crop.height() / scaleY + 0.5f)
         );
 
-        // By default, offset it to to top/left corner
-        frame.offsetTo((int) (-crop.left / scaleX), (int) (-crop.top / scaleY));
-
         // However, we also need to make space for the navigation bar on the left side.
         final int colorViewLeftInset = getColorViewLeftInset(mStableInsets.left,
                 mContentInsets.left);
diff --git a/services/core/java/com/android/server/wm/WallpaperWindowToken.java b/services/core/java/com/android/server/wm/WallpaperWindowToken.java
index 203ca25..5f3c633 100644
--- a/services/core/java/com/android/server/wm/WallpaperWindowToken.java
+++ b/services/core/java/com/android/server/wm/WallpaperWindowToken.java
@@ -16,6 +16,7 @@
 
 package com.android.server.wm;
 
+import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
 import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER;
 
 import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_LAYERS;
@@ -45,6 +46,7 @@
             DisplayContent dc, boolean ownerCanManageAppTokens) {
         super(service, token, TYPE_WALLPAPER, explicit, dc, ownerCanManageAppTokens);
         dc.mWallpaperController.addWallpaperToken(this);
+        setWindowingMode(WINDOWING_MODE_FULLSCREEN);
     }
 
     @Override
diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java
index fba22dd..591bc54 100644
--- a/services/core/java/com/android/server/wm/WindowContainer.java
+++ b/services/core/java/com/android/server/wm/WindowContainer.java
@@ -526,6 +526,11 @@
      */
     @CallSuper
     void removeImmediately() {
+        final DisplayContent dc = getDisplayContent();
+        if (dc != null) {
+            mSurfaceFreezer.unfreeze(getPendingTransaction());
+            dc.mChangingContainers.remove(this);
+        }
         while (!mChildren.isEmpty()) {
             final E child = mChildren.peekLast();
             child.removeImmediately();
@@ -662,9 +667,11 @@
                 //       position that takes into account the removed child (if the index of the
                 //       child < position, then the position should be adjusted). We should consider
                 //       doing this adjustment here and remove any adjustments in the callers.
-                mChildren.remove(child);
-                mChildren.add(position, child);
-                onChildPositionChanged(child);
+                if (mChildren.indexOf(child) != position) {
+                    mChildren.remove(child);
+                    mChildren.add(position, child);
+                    onChildPositionChanged(child);
+                }
         }
     }
 
@@ -716,6 +723,10 @@
      * @param dc The display this container is on after changes.
      */
     void onDisplayChanged(DisplayContent dc) {
+        if (mDisplayContent != null && mDisplayContent.mChangingContainers.remove(this)) {
+            // Cancel any change transition queued-up for this container on the old display.
+            mSurfaceFreezer.unfreeze(getPendingTransaction());
+        }
         mDisplayContent = dc;
         if (dc != null && dc != this) {
             dc.getPendingTransaction().merge(mPendingTransaction);
@@ -737,6 +748,10 @@
         return parent != null ? parent.getDisplayArea() : null;
     }
 
+    boolean isAttached() {
+        return getDisplayArea() != null;
+    }
+
     void setWaitingForDrawnIfResizingChanged() {
         for (int i = mChildren.size() - 1; i >= 0; --i) {
             final WindowContainer wc = mChildren.get(i);
@@ -2027,6 +2042,7 @@
 
     void cancelAnimation() {
         mSurfaceAnimator.cancelAnimation();
+        mSurfaceFreezer.unfreeze(getPendingTransaction());
     }
 
     @Override
@@ -2058,7 +2074,7 @@
     // TODO: Remove this and use #getBounds() instead once we set an app transition animation
     // on TaskStack.
     Rect getAnimationBounds(int appStackClipMode) {
-        return getDisplayedBounds();
+        return getBounds();
     }
 
     /**
@@ -2120,7 +2136,7 @@
         // Separate position and size for use in animators.
         mTmpRect.set(getAnimationBounds(appStackClipMode));
         if (sHierarchicalAnimations) {
-            getRelativeDisplayedPosition(mTmpPoint);
+            getRelativePosition(mTmpPoint);
         } else {
             mTmpPoint.set(mTmpRect.left, mTmpRect.top);
         }
@@ -2300,14 +2316,18 @@
         }
     }
 
+    void resetSurfacePositionForAnimationLeash(Transaction t) {
+        t.setPosition(mSurfaceControl, 0, 0);
+        mLastSurfacePosition.set(0, 0);
+    }
+
     @Override
     public void onAnimationLeashCreated(Transaction t, SurfaceControl leash) {
         mLastLayer = -1;
         reassignLayer(t);
 
         // Leash is now responsible for position, so set our position to 0.
-        t.setPosition(mSurfaceControl, 0, 0);
-        mLastSurfacePosition.set(0, 0);
+        resetSurfacePositionForAnimationLeash(t);
     }
 
     @Override
@@ -2391,7 +2411,7 @@
             return;
         }
 
-        getRelativeDisplayedPosition(mTmpPos);
+        getRelativePosition(mTmpPos);
         if (mTmpPos.equals(mLastSurfacePosition)) {
             return;
         }
@@ -2406,16 +2426,6 @@
     }
 
     /**
-     * Displayed bounds specify where to display this container at. It differs from bounds during
-     * certain operations (like animation or interactive dragging).
-     *
-     * @return the bounds to display this container at.
-     */
-    Rect getDisplayedBounds() {
-        return getBounds();
-    }
-
-    /**
      * The {@code outFrame} retrieved by this method specifies where the animation will finish
      * the entrance animation, as the next frame will display the window at these coordinates. In
      * case of exit animation, this is where the animation will start, as the frame before the
@@ -2435,7 +2445,7 @@
         outSurfaceInsets.setEmpty();
     }
 
-    void getRelativeDisplayedPosition(Point outPos) {
+    void getRelativePosition(Point outPos) {
         // In addition to updateSurfacePosition, we keep other code that sets
         // position from fighting with the organizer
         if (isOrganized()) {
@@ -2443,11 +2453,11 @@
             return;
         }
 
-        final Rect dispBounds = getDisplayedBounds();
+        final Rect dispBounds = getBounds();
         outPos.set(dispBounds.left, dispBounds.top);
         final WindowContainer parent = getParent();
         if (parent != null) {
-            final Rect parentBounds = parent.getDisplayedBounds();
+            final Rect parentBounds = parent.getBounds();
             outPos.offset(-parentBounds.left, -parentBounds.top);
         }
     }
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 9d87976..8eb4b26 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -23,12 +23,14 @@
 import static android.Manifest.permission.READ_FRAME_BUFFER;
 import static android.Manifest.permission.REGISTER_WINDOW_MANAGER_LISTENERS;
 import static android.Manifest.permission.RESTRICTED_VR_ACCESS;
+import static android.Manifest.permission.STATUS_BAR_SERVICE;
 import static android.Manifest.permission.WRITE_SECURE_SETTINGS;
 import static android.app.ActivityManagerInternal.ALLOW_FULL_ONLY;
 import static android.app.ActivityManagerInternal.ALLOW_NON_FULL;
 import static android.app.ActivityTaskManager.SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT;
 import static android.app.AppOpsManager.OP_SYSTEM_ALERT_WINDOW;
 import static android.app.StatusBarManager.DISABLE_MASK;
+import static android.app.WindowConfiguration.ROTATION_UNDEFINED;
 import static android.app.admin.DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED;
 import static android.content.pm.PackageManager.FEATURE_FREEFORM_WINDOW_MANAGEMENT;
 import static android.content.pm.PackageManager.FEATURE_PC;
@@ -73,6 +75,7 @@
 import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER;
 import static android.view.WindowManager.REMOVE_CONTENT_MODE_UNDEFINED;
 import static android.view.WindowManagerGlobal.ADD_OKAY;
+import static android.view.WindowManagerGlobal.ADD_TOO_MANY_TOKENS;
 import static android.view.WindowManagerGlobal.RELAYOUT_DEFER_SURFACE_DESTROY;
 import static android.view.WindowManagerGlobal.RELAYOUT_RES_BLAST_SYNC;
 import static android.view.WindowManagerGlobal.RELAYOUT_RES_SURFACE_CHANGED;
@@ -218,6 +221,7 @@
 import android.view.IPinnedStackListener;
 import android.view.IRecentsAnimationRunner;
 import android.view.IRotationWatcher;
+import android.view.IScrollCaptureController;
 import android.view.ISystemGestureExclusionListener;
 import android.view.IWallpaperVisibilityListener;
 import android.view.IWindow;
@@ -411,6 +415,12 @@
 
     private static final int ANIMATION_COMPLETED_TIMEOUT_MS = 5000;
 
+    /** The maximum count of window tokens without surface that an app can register. */
+    private static final int MAXIMUM_WINDOW_TOKEN_COUNT_WITHOUT_SURFACE = 5;
+
+    /** System UI can create more window context... */
+    private static final int SYSTEM_UI_MULTIPLIER = 2;
+
     // TODO(b/143053092): Remove the settings if it becomes stable.
     private static final String FIXED_ROTATION_TRANSFORM_SETTING_NAME = "fixed_rotation_transform";
     boolean mIsFixedRotationTransformEnabled;
@@ -1696,15 +1706,14 @@
             }
             displayContent.getInputMonitor().updateInputWindowsLw(false /*force*/);
 
-            getInsetsSourceControls(win, outActiveControls);
-
             ProtoLog.v(WM_DEBUG_ADD_REMOVE, "addWindow: New client %s"
                     + ": window=%s Callers=%s", client.asBinder(), win, Debug.getCallers(5));
 
-
             if (win.isVisibleOrAdding() && displayContent.updateOrientation()) {
                 displayContent.sendNewConfiguration();
             }
+
+            getInsetsSourceControls(win, outActiveControls);
         }
 
         Binder.restoreCallingIdentity(origId);
@@ -2400,7 +2409,6 @@
             outCutout.set(win.getWmDisplayCutout().getDisplayCutout());
             outBackdropFrame.set(win.getBackdropFrame(win.getFrameLw()));
             outInsetsState.set(win.getInsetsState(), win.isClientLocal());
-            getInsetsSourceControls(win, outActiveControls);
             if (DEBUG) {
                 Slog.v(TAG_WM, "Relayout given client " + client.asBinder()
                         + ", requestedWidth=" + requestedWidth
@@ -2431,6 +2439,7 @@
                 outSurfaceSize.set(winAnimator.mSurfaceController.getWidth(),
                                          winAnimator.mSurfaceController.getHeight());
             }
+            getInsetsSourceControls(win, outActiveControls);
         }
 
         Binder.restoreCallingIdentity(origId);
@@ -2445,8 +2454,15 @@
             if (controls != null) {
                 final int length = Math.min(controls.length, outControls.length);
                 for (int i = 0; i < length; i++) {
-                    outControls[i] = win.isClientLocal()
-                            ? new InsetsSourceControl(controls[i]) : controls[i];
+                    // We will leave the critical section before returning the leash to the client,
+                    // so we need to copy the leash to prevent others release the one that we are
+                    // about to return.
+                    // TODO: We will have an extra copy if the client is not local.
+                    //       For now, we rely on GC to release it.
+                    //       Maybe we can modify InsetsSourceControl.writeToParcel so it can release
+                    //       the extra leash as soon as possible.
+                    outControls[i] = controls[i] != null
+                            ? new InsetsSourceControl(controls[i]) : null;
                 }
             }
         }
@@ -2586,10 +2602,30 @@
     @Override
     public int addWindowTokenWithOptions(IBinder binder, int type, int displayId, Bundle options,
             String packageName) {
+        if (tokenCountExceed()) {
+            return ADD_TOO_MANY_TOKENS;
+        }
         return addWindowTokenWithOptions(binder, type, displayId, options, packageName,
                 true /* fromClientToken */);
     }
 
+    private boolean tokenCountExceed() {
+        final int callingUid = Binder.getCallingUid();
+        // Don't check if caller is from system server.
+        if (callingUid == myPid()) {
+            return false;
+        }
+        final int limit =
+                (checkCallingPermission(STATUS_BAR_SERVICE, "addWindowTokenWithOptions"))
+                        ?  MAXIMUM_WINDOW_TOKEN_COUNT_WITHOUT_SURFACE * SYSTEM_UI_MULTIPLIER
+                        : MAXIMUM_WINDOW_TOKEN_COUNT_WITHOUT_SURFACE;
+        synchronized (mGlobalLock) {
+            int[] count = new int[1];
+            mRoot.forAllDisplays(d -> count[0] += d.getWindowTokensWithoutSurfaceCount(callingUid));
+            return count[0] >= limit;
+        }
+    }
+
     private int addWindowTokenWithOptions(IBinder binder, int type, int displayId, Bundle options,
             String packageName, boolean fromClientToken) {
         final boolean callerCanManageAppTokens =
@@ -2788,18 +2824,6 @@
         return mRecentsAnimationController;
     }
 
-    /**
-     * @return Whether the next recents animation can continue to start. Called from
-     *         {@link RecentsAnimation#startRecentsActivity}.
-     */
-    boolean canStartRecentsAnimation() {
-        // TODO(multi-display): currently only default display support recent activity
-        if (getDefaultDisplayContentLocked().mAppTransition.isTransitionSet()) {
-            return false;
-        }
-        return true;
-    }
-
     void cancelRecentsAnimation(
             @RecentsAnimationController.ReorderMode int reorderMode, String reason) {
         if (mRecentsAnimationController != null) {
@@ -2941,7 +2965,7 @@
                 mClientFreezingScreen = true;
                 final long origId = Binder.clearCallingIdentity();
                 try {
-                    startFreezingDisplayLocked(exitAnim, enterAnim);
+                    startFreezingDisplay(exitAnim, enterAnim);
                     mH.removeMessages(H.CLIENT_FREEZE_TIMEOUT);
                     mH.sendEmptyMessageDelayed(H.CLIENT_FREEZE_TIMEOUT, 5000);
                 } finally {
@@ -5479,13 +5503,17 @@
         return changed;
     }
 
-    void startFreezingDisplayLocked(int exitAnim, int enterAnim) {
-        startFreezingDisplayLocked(exitAnim, enterAnim,
-                getDefaultDisplayContentLocked());
+    void startFreezingDisplay(int exitAnim, int enterAnim) {
+        startFreezingDisplay(exitAnim, enterAnim, getDefaultDisplayContentLocked());
     }
 
-    void startFreezingDisplayLocked(int exitAnim, int enterAnim,
-            DisplayContent displayContent) {
+    void startFreezingDisplay(int exitAnim, int enterAnim, DisplayContent displayContent) {
+        startFreezingDisplay(exitAnim, enterAnim, displayContent,
+                ROTATION_UNDEFINED /* overrideOriginalRotation */);
+    }
+
+    void startFreezingDisplay(int exitAnim, int enterAnim, DisplayContent displayContent,
+            int overrideOriginalRotation) {
         if (mDisplayFrozen || displayContent.getDisplayRotation().isRotatingSeamlessly()) {
             return;
         }
@@ -5529,14 +5557,12 @@
             screenRotationAnimation.kill();
         }
 
-        // Check whether the current screen contains any secure content.
-        boolean isSecure = displayContent.hasSecureWindowOnScreen();
-
         displayContent.updateDisplayInfo();
-        screenRotationAnimation = new ScreenRotationAnimation(mContext, displayContent,
-                displayContent.getDisplayRotation().isFixedToUserRotation(), isSecure,
-                this);
-        displayContent.setRotationAnimation(screenRotationAnimation);
+        final int originalRotation = overrideOriginalRotation != ROTATION_UNDEFINED
+                ? overrideOriginalRotation
+                : displayContent.getDisplayInfo().rotation;
+        displayContent.setRotationAnimation(new ScreenRotationAnimation(displayContent,
+                originalRotation));
     }
 
     void stopFreezingDisplayLocked() {
@@ -6104,18 +6130,14 @@
         mRoot.forAllDisplays(dc -> {
             final int displayId = dc.getDisplayId();
             final WindowState inputMethodTarget = dc.mInputMethodTarget;
+            final WindowState inputMethodInputTarget = dc.mInputMethodInputTarget;
             if (inputMethodTarget != null) {
                 pw.print("  mInputMethodTarget in display# "); pw.print(displayId);
                 pw.print(' '); pw.println(inputMethodTarget);
             }
-            if (mAccessibilityController != null) {
-                final Region magnificationRegion = new Region();
-                mAccessibilityController.getMagnificationRegionLocked(displayId,
-                        magnificationRegion);
-                pw.print("  mMagnificationRegion in display# ");
-                pw.print(displayId);
-                pw.print(' ');
-                pw.println(magnificationRegion);
+            if (inputMethodInputTarget != null) {
+                pw.print("  mInputMethodInputTarget in display# "); pw.print(displayId);
+                pw.print(' '); pw.println(inputMethodInputTarget);
             }
         });
         pw.print("  mInTouchMode="); pw.println(mInTouchMode);
@@ -6132,6 +6154,9 @@
 
         mInputManagerCallback.dump(pw, "  ");
         mTaskSnapshotController.dump(pw, "  ");
+        if (mAccessibilityController != null) {
+            mAccessibilityController.dump(pw, "  ");
+        }
 
         if (dumpAll) {
             final WindowState imeWindow = mRoot.getCurrentInputMethodWindow();
@@ -6833,6 +6858,58 @@
         }
     }
 
+    /**
+     * Forwards a scroll capture request to the appropriate window, if available.
+     *
+     * @param displayId the display for the request
+     * @param behindClient token for a window, used to filter the search to windows behind it
+     * @param taskId specifies the id of a task the result must belong to or -1 to ignore task ids
+     * @param controller the controller to receive results; a call to either
+     *      {@link IScrollCaptureController#onClientConnected} or
+     *      {@link IScrollCaptureController#onClientUnavailable}.
+     */
+    public void requestScrollCapture(int displayId, @Nullable IBinder behindClient, int taskId,
+            IScrollCaptureController controller) {
+        if (!checkCallingPermission(READ_FRAME_BUFFER, "requestScrollCapture()")) {
+            throw new SecurityException("Requires READ_FRAME_BUFFER permission");
+        }
+        final long token = Binder.clearCallingIdentity();
+        try {
+            synchronized (mGlobalLock) {
+                DisplayContent dc = mRoot.getDisplayContent(displayId);
+                if (dc == null) {
+                    ProtoLog.e(WM_ERROR,
+                            "Invalid displayId for requestScrollCapture: %d", displayId);
+                    controller.onClientUnavailable();
+                    return;
+                }
+                WindowState topWindow = null;
+                if (behindClient != null) {
+                    topWindow = windowForClientLocked(null, behindClient, /* throwOnError*/ true);
+                }
+                WindowState targetWindow = dc.findScrollCaptureTargetWindow(topWindow, taskId);
+                if (targetWindow == null) {
+                    controller.onClientUnavailable();
+                    return;
+                }
+                // Forward to the window for handling.
+                try {
+                    targetWindow.mClient.requestScrollCapture(controller);
+                } catch (RemoteException e) {
+                    ProtoLog.w(WM_ERROR,
+                            "requestScrollCapture: caught exception dispatching to window."
+                                    + "token=%s", targetWindow.mClient.asBinder());
+                    controller.onClientUnavailable();
+                }
+            }
+        } catch (RemoteException e) {
+            ProtoLog.w(WM_ERROR,
+                    "requestScrollCapture: caught exception dispatching callback: %s", e);
+        } finally {
+            Binder.restoreCallingIdentity(token);
+        }
+    }
+
     @Override
     public void dontOverrideDisplayInfo(int displayId) {
         final long token = Binder.clearCallingIdentity();
@@ -7359,7 +7436,7 @@
             synchronized (mGlobalLock) {
                 final WindowState imeTarget = mWindowMap.get(imeTargetWindowToken);
                 if (imeTarget != null) {
-                    imeTarget.getDisplayContent().updateImeControlTarget(imeTarget);
+                    imeTarget.getDisplayContent().setInputMethodInputTarget(imeTarget);
                 }
             }
         }
@@ -7601,15 +7678,8 @@
                     Slog.w(TAG, "Cannot find window which accessibility connection is added to");
                     return;
                 }
-                try (SurfaceControl.Transaction t = new SurfaceControl.Transaction()) {
-                    t.setMetadata(
-                            state.mSurfaceControl,
-                            SurfaceControl.METADATA_ACCESSIBILITY_ID,
-                            accessibilityWindowId);
-                    t.apply();
-                } finally {
-                    SurfaceControl.closeTransaction();
-                }
+                mTransaction.setMetadata(state.mSurfaceControl,
+                        SurfaceControl.METADATA_ACCESSIBILITY_ID, accessibilityWindowId).apply();
             }
         }
 
diff --git a/services/core/java/com/android/server/wm/WindowOrganizerController.java b/services/core/java/com/android/server/wm/WindowOrganizerController.java
index 86bc013..160978d 100644
--- a/services/core/java/com/android/server/wm/WindowOrganizerController.java
+++ b/services/core/java/com/android/server/wm/WindowOrganizerController.java
@@ -129,6 +129,10 @@
                         final Map.Entry<IBinder, WindowContainerTransaction.Change> entry =
                                 entries.next();
                         final WindowContainer wc = WindowContainer.fromBinder(entry.getKey());
+                        if (!wc.isAttached()) {
+                            Slog.e(TAG, "Attempt to operate on detached container: " + wc);
+                            continue;
+                        }
                         int containerEffect = applyWindowContainerChange(wc, entry.getValue());
                         effects |= containerEffect;
 
@@ -146,6 +150,10 @@
                     for (int i = 0, n = hops.size(); i < n; ++i) {
                         final WindowContainerTransaction.HierarchyOp hop = hops.get(i);
                         final WindowContainer wc = WindowContainer.fromBinder(hop.getContainer());
+                        if (!wc.isAttached()) {
+                            Slog.e(TAG, "Attempt to operate on detached container: " + wc);
+                            continue;
+                        }
                         effects |= sanitizeAndApplyHierarchyOp(wc, hop);
                     }
                     if ((effects & TRANSACT_EFFECTS_LIFECYCLE) != 0) {
@@ -178,12 +186,7 @@
         return syncId;
     }
 
-    private int sanitizeAndApplyChange(WindowContainer container,
-            WindowContainerTransaction.Change change) {
-        if (!(container instanceof Task)) {
-            throw new RuntimeException("Invalid token in task transaction");
-        }
-        final Task task = (Task) container;
+    private int applyChanges(WindowContainer container, WindowContainerTransaction.Change change) {
         // The "client"-facing API should prevent bad changes; however, just in case, sanitize
         // masks here.
         final int configMask = change.getConfigSetMask() & CONTROLLABLE_CONFIGS;
@@ -203,11 +206,38 @@
                 effects |= TRANSACT_EFFECTS_LIFECYCLE;
             }
         }
-        if ((change.getChangeMask() & WindowContainerTransaction.Change.CHANGE_HIDDEN) != 0) {
-            if (task.setForceHidden(FLAG_FORCE_HIDDEN_FOR_TASK_ORG, change.getHidden())) {
-                effects |= TRANSACT_EFFECTS_LIFECYCLE;
+
+        final int windowingMode = change.getWindowingMode();
+        if (windowingMode > -1) {
+            container.setWindowingMode(windowingMode);
+        }
+        return effects;
+    }
+
+    private int applyTaskChanges(Task tr, WindowContainerTransaction.Change c) {
+        int effects = 0;
+        final SurfaceControl.Transaction t = c.getBoundsChangeTransaction();
+
+        if ((c.getChangeMask() & WindowContainerTransaction.Change.CHANGE_HIDDEN) != 0) {
+            if (tr.setForceHidden(FLAG_FORCE_HIDDEN_FOR_TASK_ORG, c.getHidden())) {
+                effects = TRANSACT_EFFECTS_LIFECYCLE;
             }
         }
+
+        final int childWindowingMode = c.getActivityWindowingMode();
+        if (childWindowingMode > -1) {
+            tr.setActivityWindowingMode(childWindowingMode);
+        }
+
+        if (t != null) {
+            tr.setMainWindowSizeChangeTransaction(t);
+        }
+
+        Rect enterPipBounds = c.getEnterPipBounds();
+        if (enterPipBounds != null) {
+            mService.mStackSupervisor.updatePictureInPictureMode(tr, enterPipBounds, true);
+        }
+
         return effects;
     }
 
@@ -275,30 +305,20 @@
         return TRANSACT_EFFECTS_LIFECYCLE;
     }
 
+    private void sanitizeWindowContainer(WindowContainer wc) {
+        if (!(wc instanceof Task) && !(wc instanceof DisplayArea)) {
+            throw new RuntimeException("Invalid token in task or displayArea transaction");
+        }
+    }
+
     private int applyWindowContainerChange(WindowContainer wc,
             WindowContainerTransaction.Change c) {
-        int effects = sanitizeAndApplyChange(wc, c);
+        sanitizeWindowContainer(wc);
 
-        final Task tr = wc.asTask();
+        int effects = applyChanges(wc, c);
 
-        final SurfaceControl.Transaction t = c.getBoundsChangeTransaction();
-        if (t != null) {
-            tr.setMainWindowSizeChangeTransaction(t);
-        }
-
-        Rect enterPipBounds = c.getEnterPipBounds();
-        if (enterPipBounds != null) {
-            mService.mStackSupervisor.updatePictureInPictureMode(tr,
-                    enterPipBounds, true);
-        }
-
-        final int windowingMode = c.getWindowingMode();
-        if (windowingMode > -1) {
-            tr.setWindowingMode(windowingMode);
-        }
-        final int childWindowingMode = c.getActivityWindowingMode();
-        if (childWindowingMode > -1) {
-            tr.setActivityWindowingMode(childWindowingMode);
+        if (wc instanceof Task) {
+            effects |= applyTaskChanges(wc.asTask(), c);
         }
 
         return effects;
@@ -312,7 +332,7 @@
             final ActivityStack stack = (ActivityStack) container;
             if (stack.inPinnedWindowingMode()) {
                 stack.resize(config.windowConfiguration.getBounds(),
-                        null /* configBounds */, PRESERVE_WINDOWS, true /* deferResume */);
+                        PRESERVE_WINDOWS, true /* deferResume */);
             }
         }
     }
diff --git a/services/core/java/com/android/server/wm/WindowProcessController.java b/services/core/java/com/android/server/wm/WindowProcessController.java
index 194ed3e..41bd707 100644
--- a/services/core/java/com/android/server/wm/WindowProcessController.java
+++ b/services/core/java/com/android/server/wm/WindowProcessController.java
@@ -40,6 +40,7 @@
 import static com.android.server.wm.ActivityTaskManagerService.KEY_DISPATCHING_TIMEOUT_MS;
 import static com.android.server.wm.ActivityTaskManagerService.RELAUNCH_REASON_NONE;
 
+import android.Manifest;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.app.ActivityThread;
@@ -50,6 +51,7 @@
 import android.content.Intent;
 import android.content.pm.ActivityInfo;
 import android.content.pm.ApplicationInfo;
+import android.content.pm.ServiceInfo;
 import android.content.res.Configuration;
 import android.os.Build;
 import android.os.Message;
@@ -165,7 +167,8 @@
     // Thread currently set for VR scheduling
     int mVrThreadTid;
 
-    boolean mIsImeProcess;
+    // Whether this process has ever started a service with the BIND_INPUT_METHOD permission.
+    private volatile boolean mHasImeService;
 
     // all activities running in the process
     private final ArrayList<ActivityRecord> mActivities = new ArrayList<>();
@@ -187,6 +190,8 @@
     // Registered display id as a listener to override config change
     private int mDisplayId;
     private ActivityRecord mConfigActivityRecord;
+    // Whether the activity config override is allowed for this process.
+    private volatile boolean mIsActivityConfigOverrideAllowed = true;
     /**
      * Activities that hosts some UI drawn by the current process. The activities live
      * in another process. This is used to check if the process is currently showing anything
@@ -201,9 +206,6 @@
     /** Whether our process is currently running a {@link IRemoteAnimationRunner} */
     private boolean mRunningRemoteAnimation;
 
-    /** Whether this process is owned by the System UI package. */
-    final boolean mIsSysUiPackage;
-
     public WindowProcessController(@NonNull ActivityTaskManagerService atm, ApplicationInfo info,
             String name, int uid, int userId, Object owner, WindowProcessListener listener) {
         mInfo = info;
@@ -215,8 +217,13 @@
         mAtm = atm;
         mDisplayId = INVALID_DISPLAY;
 
-        mIsSysUiPackage = info.packageName.equals(
+        boolean isSysUiPackage = info.packageName.equals(
                 mAtm.getSysUiServiceComponentLocked().getPackageName());
+        if (isSysUiPackage || mUid == Process.SYSTEM_UID) {
+            // This is a system owned process and should not use an activity config.
+            // TODO(b/151161907): Remove after support for display-independent (raw) SysUi configs.
+            mIsActivityConfigOverrideAllowed = false;
+        }
 
         onConfigurationChanged(atm.getGlobalConfiguration());
     }
@@ -1095,9 +1102,7 @@
      * always track the configuration of the non-finishing activity last added to the process.
      */
     private void updateActivityConfigurationListener() {
-        if (mIsSysUiPackage || mUid == Process.SYSTEM_UID) {
-            // This is a system owned process and should not use an activity config.
-            // TODO(b/151161907): Remove after support for display-independent (raw) SysUi configs.
+        if (!mIsActivityConfigOverrideAllowed) {
             return;
         }
 
@@ -1132,7 +1137,7 @@
         final Configuration config = getConfiguration();
         if (mLastReportedConfiguration.diff(config) == 0) {
             // Nothing changed.
-            if (Build.IS_DEBUGGABLE && mIsImeProcess) {
+            if (Build.IS_DEBUGGABLE && mHasImeService) {
                 // TODO (b/135719017): Temporary log for debugging IME service.
                 Slog.w(TAG_CONFIGURATION, "Current config: " + config
                         + " unchanged for IME proc " + mName);
@@ -1156,7 +1161,7 @@
 
     private void dispatchConfigurationChange(Configuration config) {
         if (mThread == null) {
-            if (Build.IS_DEBUGGABLE && mIsImeProcess) {
+            if (Build.IS_DEBUGGABLE && mHasImeService) {
                 // TODO (b/135719017): Temporary log for debugging IME service.
                 Slog.w(TAG_CONFIGURATION, "Unable to send config for IME proc " + mName
                         + ": no app thread");
@@ -1166,7 +1171,7 @@
         if (DEBUG_CONFIGURATION) {
             Slog.v(TAG_CONFIGURATION, "Sending to proc " + mName + " new config " + config);
         }
-        if (Build.IS_DEBUGGABLE && mIsImeProcess) {
+        if (Build.IS_DEBUGGABLE && mHasImeService) {
             // TODO (b/135719017): Temporary log for debugging IME service.
             Slog.v(TAG_CONFIGURATION, "Sending to IME proc " + mName + " new config " + config);
         }
@@ -1286,6 +1291,35 @@
         }
     }
 
+    /**
+     * Called to notify {@link WindowProcessController} of a started service.
+     *
+     * @param serviceInfo information describing the started service.
+     */
+    public void onServiceStarted(ServiceInfo serviceInfo) {
+        String permission = serviceInfo.permission;
+        if (permission == null) {
+            return;
+        }
+
+        // TODO: Audit remaining services for disabling activity override (Wallpaper, Dream, etc).
+        switch (permission) {
+            case Manifest.permission.BIND_INPUT_METHOD:
+                mHasImeService = true;
+                // Fall-through
+            case Manifest.permission.BIND_ACCESSIBILITY_SERVICE:
+            case Manifest.permission.BIND_VOICE_INTERACTION:
+                // We want to avoid overriding the config of these services with that of the
+                // activity as it could lead to incorrect display metrics. For ex, IME services
+                // expect their config to match the config of the display with the IME window
+                // showing.
+                mIsActivityConfigOverrideAllowed = false;
+                break;
+            default:
+                break;
+        }
+    }
+
     @HotPath(caller = HotPath.OOM_ADJUSTMENT)
     public void onTopProcChanged() {
         synchronized (mAtm.mGlobalLockWithoutBoost) {
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index c11c29b5..bbe5d94 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -999,18 +999,6 @@
         frame.inset(left, top, right, bottom);
     }
 
-    @Override
-    public Rect getDisplayedBounds() {
-        final Task task = getTask();
-        if (task != null) {
-            Rect bounds = task.getOverrideDisplayedBounds();
-            if (!bounds.isEmpty()) {
-                return bounds;
-            }
-        }
-        return super.getDisplayedBounds();
-    }
-
     void computeFrame(DisplayFrames displayFrames) {
         getLayoutingWindowFrames().setDisplayCutout(displayFrames.mDisplayCutout);
         computeFrameLw();
@@ -1065,7 +1053,7 @@
             layoutXDiff = 0;
             layoutYDiff = 0;
         } else {
-            windowFrames.mContainingFrame.set(getDisplayedBounds());
+            windowFrames.mContainingFrame.set(getBounds());
             if (mActivityRecord != null && !mActivityRecord.mFrozenBounds.isEmpty()) {
 
                 // If the bounds are frozen, we still want to translate the window freely and only
@@ -1223,7 +1211,7 @@
             parentLeft = ((WindowState) parent).mWindowFrames.mFrame.left;
             parentTop = ((WindowState) parent).mWindowFrames.mFrame.top;
         } else if (parent != null) {
-            final Rect parentBounds = parent.getDisplayedBounds();
+            final Rect parentBounds = parent.getBounds();
             parentLeft = parentBounds.left;
             parentTop = parentBounds.top;
         }
@@ -1469,6 +1457,11 @@
 
     @Override
     void onDisplayChanged(DisplayContent dc) {
+        if (dc != null && mDisplayContent != null && dc != mDisplayContent
+                && mDisplayContent.mInputMethodInputTarget == this) {
+            dc.setInputMethodInputTarget(mDisplayContent.mInputMethodInputTarget);
+            mDisplayContent.mInputMethodInputTarget = null;
+        }
         super.onDisplayChanged(dc);
         // Window was not laid out for this display yet, so make sure mLayoutSeq does not match.
         if (dc != null && mInputWindowHandle.displayId != dc.getDisplayId()) {
@@ -3539,7 +3532,7 @@
             mClient.insetsControlChanged(getInsetsState(),
                     stateController.getControlsForDispatch(this));
         } catch (RemoteException e) {
-            Slog.w(TAG, "Failed to deliver inset state change", e);
+            Slog.w(TAG, "Failed to deliver inset state change to w=" + this, e);
         }
     }
 
@@ -3667,9 +3660,12 @@
         return mActivityRecord.getBounds().equals(mTmpRect);
     }
 
-    @Override
-    public boolean isLetterboxedOverlappingWith(Rect rect) {
-        return mActivityRecord != null && mActivityRecord.isLetterboxOverlappingWith(rect);
+    /**
+     * @see Letterbox#notIntersectsOrFullyContains(Rect)
+     */
+    boolean letterboxNotIntersectsOrFullyContains(Rect rect) {
+        return mActivityRecord == null
+                || mActivityRecord.letterboxNotIntersectsOrFullyContains(rect);
     }
 
     boolean isDragResizeChanged() {
@@ -5245,16 +5241,6 @@
     }
 
     @Override
-    public void onAnimationLeashCreated(Transaction t, SurfaceControl leash) {
-        super.onAnimationLeashCreated(t, leash);
-    }
-
-    @Override
-    public void onAnimationLeashLost(Transaction t) {
-        super.onAnimationLeashLost(t);
-    }
-
-    @Override
     @VisibleForTesting
     void updateSurfacePosition(Transaction t) {
         if (mSurfaceControl == null) {
@@ -5295,7 +5281,7 @@
             outPoint.offset(-parent.mWindowFrames.mFrame.left + mTmpPoint.x,
                     -parent.mWindowFrames.mFrame.top + mTmpPoint.y);
         } else if (parentWindowContainer != null) {
-            final Rect parentBounds = parentWindowContainer.getDisplayedBounds();
+            final Rect parentBounds = parentWindowContainer.getBounds();
             outPoint.offset(-parentBounds.left, -parentBounds.top);
         }
 
@@ -5306,7 +5292,7 @@
         // to account for it. If we actually have shadows we will
         // then un-inset ourselves by the surfaceInsets.
         if (stack != null) {
-            final int outset = stack.getStackOutset();
+            final int outset = stack.getTaskOutset();
             outPoint.offset(outset, outset);
         }
 
@@ -5347,7 +5333,9 @@
             // this promotion.
             final WindowState imeTarget = getDisplayContent().mInputMethodTarget;
             boolean inTokenWithAndAboveImeTarget = imeTarget != null && imeTarget != this
-                    && imeTarget.mToken == mToken && imeTarget.compareTo(this) <= 0;
+                    && imeTarget.mToken == mToken
+                    && getParent() != null
+                    && imeTarget.compareTo(this) <= 0;
             return inTokenWithAndAboveImeTarget;
         }
         return false;
diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java
index d4470f8..bfe3b28 100644
--- a/services/core/java/com/android/server/wm/WindowStateAnimator.java
+++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java
@@ -884,8 +884,8 @@
             clipRect = mTmpClipRect;
         }
 
-        if (mSurfaceResized && (mAttrType == TYPE_BASE_APPLICATION) &&
-            (task != null) && (task.getMainWindowSizeChangeTransaction() != null)) {
+        if (w.mInRelayout && (mAttrType == TYPE_BASE_APPLICATION) && (task != null)
+                && (task.getMainWindowSizeChangeTransaction() != null)) {
             mSurfaceController.deferTransactionUntil(mWin.getClientViewRootSurface(),
                     mWin.getFrameNumber());
             SurfaceControl.mergeToGlobalTransaction(task.getMainWindowSizeChangeTransaction());
@@ -1030,7 +1030,7 @@
                         mTmpPos.x = 0;
                         mTmpPos.y = 0;
                         if (stack != null) {
-                            stack.getRelativeDisplayedPosition(mTmpPos);
+                            stack.getRelativePosition(mTmpPos);
                         }
 
                         xOffset = -mTmpPos.x;
@@ -1476,6 +1476,7 @@
         if (dumpAll) {
             pw.print(prefix); pw.print("mDrawState="); pw.print(drawStateToString());
             pw.print(prefix); pw.print(" mLastHidden="); pw.println(mLastHidden);
+            pw.print(prefix); pw.print("mEnterAnimationPending=" + mEnterAnimationPending);
             pw.print(prefix); pw.print("mSystemDecorRect="); mSystemDecorRect.printShortString(pw);
             pw.print(" mLastClipRect="); mLastClipRect.printShortString(pw);
 
diff --git a/services/core/java/com/android/server/wm/WindowToken.java b/services/core/java/com/android/server/wm/WindowToken.java
index e34b816..21c7687 100644
--- a/services/core/java/com/android/server/wm/WindowToken.java
+++ b/services/core/java/com/android/server/wm/WindowToken.java
@@ -422,14 +422,17 @@
         if (!shouldReportToClient()) {
             return;
         }
+        if (mLastReportedConfig == null) {
+            mLastReportedConfig = new Configuration();
+        }
         final Configuration config = getConfiguration();
         final int displayId = getDisplayContent().getDisplayId();
-        if (config.equals(mLastReportedConfig) && displayId == mLastReportedDisplay) {
+        if (config.diff(mLastReportedConfig) == 0 && displayId == mLastReportedDisplay) {
             // No changes since last reported time.
             return;
         }
 
-        mLastReportedConfig = config;
+        mLastReportedConfig.setTo(config);
         mLastReportedDisplay = displayId;
 
         IWindowToken windowTokenClient = IWindowToken.Stub.asInterface(token);
@@ -595,7 +598,17 @@
             // The window may be detached or detaching.
             return;
         }
+        final int originalRotation = getWindowConfiguration().getRotation();
         onConfigurationChanged(parent.getConfiguration());
+        onCancelFixedRotationTransform(originalRotation);
+    }
+
+    /**
+     * It is called when the window is using fixed rotation transform, and before display applies
+     * the same rotation, the rotation change for display is canceled, e.g. the orientation from
+     * sensor is updated to previous direction.
+     */
+    void onCancelFixedRotationTransform(int originalDisplayRotation) {
     }
 
     @Override
@@ -619,6 +632,15 @@
         }
     }
 
+    @Override
+    void resetSurfacePositionForAnimationLeash(SurfaceControl.Transaction t) {
+        // Keep the transformed position to animate because the surface will show in different
+        // rotation than the animator of leash.
+        if (!isFixedRotationTransforming()) {
+            super.resetSurfacePositionForAnimationLeash(t);
+        }
+    }
+
     /**
      * Gives a chance to this {@link WindowToken} to adjust the {@link
      * android.view.WindowManager.LayoutParams} of its windows.
diff --git a/services/core/jni/com_android_server_pm_PackageManagerShellCommandDataLoader.cpp b/services/core/jni/com_android_server_pm_PackageManagerShellCommandDataLoader.cpp
index e32a343..6cf8133 100644
--- a/services/core/jni/com_android_server_pm_PackageManagerShellCommandDataLoader.cpp
+++ b/services/core/jni/com_android_server_pm_PackageManagerShellCommandDataLoader.cpp
@@ -69,14 +69,9 @@
 struct JniIds {
     jclass packageManagerShellCommandDataLoader;
     jmethodID pmscdLookupShellCommand;
-    jmethodID pmscdGetStdInPFD;
+    jmethodID pmscdGetStdIn;
     jmethodID pmscdGetLocalFile;
 
-    jmethodID parcelFileDescriptorGetFileDescriptor;
-
-    jclass ioUtils;
-    jmethodID ioUtilsCloseQuietly;
-
     JniIds(JNIEnv* env) {
         packageManagerShellCommandDataLoader = (jclass)env->NewGlobalRef(
                 FindClassOrDie(env, "com/android/server/pm/PackageManagerShellCommandDataLoader"));
@@ -84,23 +79,11 @@
                 GetStaticMethodIDOrDie(env, packageManagerShellCommandDataLoader,
                                        "lookupShellCommand",
                                        "(Ljava/lang/String;)Landroid/os/ShellCommand;");
-        pmscdGetStdInPFD =
-                GetStaticMethodIDOrDie(env, packageManagerShellCommandDataLoader, "getStdInPFD",
-                                       "(Landroid/os/ShellCommand;)Landroid/os/"
-                                       "ParcelFileDescriptor;");
+        pmscdGetStdIn = GetStaticMethodIDOrDie(env, packageManagerShellCommandDataLoader,
+                                               "getStdIn", "(Landroid/os/ShellCommand;)I");
         pmscdGetLocalFile =
                 GetStaticMethodIDOrDie(env, packageManagerShellCommandDataLoader, "getLocalFile",
-                                       "(Landroid/os/ShellCommand;Ljava/lang/String;)Landroid/os/"
-                                       "ParcelFileDescriptor;");
-
-        auto parcelFileDescriptor = FindClassOrDie(env, "android/os/ParcelFileDescriptor");
-        parcelFileDescriptorGetFileDescriptor =
-                GetMethodIDOrDie(env, parcelFileDescriptor, "getFileDescriptor",
-                                 "()Ljava/io/FileDescriptor;");
-
-        ioUtils = (jclass)env->NewGlobalRef(FindClassOrDie(env, "libcore/io/IoUtils"));
-        ioUtilsCloseQuietly = GetStaticMethodIDOrDie(env, ioUtils, "closeQuietly",
-                                                     "(Ljava/lang/AutoCloseable;)V");
+                                       "(Landroid/os/ShellCommand;Ljava/lang/String;)I");
     }
 };
 
@@ -211,22 +194,6 @@
     return total_tree_block_count * INCFS_DATA_FILE_BLOCK_SIZE;
 }
 
-static inline unique_fd convertPfdToFdAndDup(JNIEnv* env, const JniIds& jni, jobject pfd) {
-    if (!pfd) {
-        ALOGE("Missing In ParcelFileDescriptor.");
-        return {};
-    }
-    auto managedFd = env->CallObjectMethod(pfd, jni.parcelFileDescriptorGetFileDescriptor);
-    if (!pfd) {
-        ALOGE("Missing In FileDescriptor.");
-        return {};
-    }
-    unique_fd result{dup(jniGetFDFromFileDescriptor(env, managedFd))};
-    // Can be closed after dup.
-    env->CallStaticVoidMethod(jni.ioUtils, jni.ioUtilsCloseQuietly, pfd);
-    return result;
-}
-
 enum MetadataMode : int8_t {
     STDIN = 0,
     LOCAL_FILE = 1,
@@ -263,11 +230,9 @@
 
     const std::string idsigPath = filePath + ".idsig";
 
-    auto idsigFd = convertPfdToFdAndDup(
-            env, jni,
-            env->CallStaticObjectMethod(jni.packageManagerShellCommandDataLoader,
-                                        jni.pmscdGetLocalFile, shellCommand,
-                                        env->NewStringUTF(idsigPath.c_str())));
+    unique_fd idsigFd{env->CallStaticIntMethod(jni.packageManagerShellCommandDataLoader,
+                                               jni.pmscdGetLocalFile, shellCommand,
+                                               env->NewStringUTF(idsigPath.c_str()))};
     if (idsigFd.ok()) {
         auto treeSize = verityTreeSizeForFile(size);
         auto actualTreeSize = skipIdSigHeaders(idsigFd);
@@ -283,11 +248,9 @@
         });
     }
 
-    auto fileFd = convertPfdToFdAndDup(
-            env, jni,
-            env->CallStaticObjectMethod(jni.packageManagerShellCommandDataLoader,
-                                        jni.pmscdGetLocalFile, shellCommand,
-                                        env->NewStringUTF(filePath.c_str())));
+    unique_fd fileFd{env->CallStaticIntMethod(jni.packageManagerShellCommandDataLoader,
+                                              jni.pmscdGetLocalFile, shellCommand,
+                                              env->NewStringUTF(filePath.c_str()))};
     if (fileFd.ok()) {
         result.push_back(InputDesc{
                 .fd = std::move(fileFd),
@@ -307,10 +270,8 @@
                              std::string(metadata.data, metadata.size));
     }
 
-    auto fd = convertPfdToFdAndDup(
-            env, jni,
-            env->CallStaticObjectMethod(jni.packageManagerShellCommandDataLoader,
-                                        jni.pmscdGetStdInPFD, shellCommand));
+    unique_fd fd{env->CallStaticIntMethod(jni.packageManagerShellCommandDataLoader,
+                                          jni.pmscdGetStdIn, shellCommand)};
     if (!fd.ok()) {
         return {};
     }
diff --git a/services/core/jni/com_android_server_power_PowerManagerService.cpp b/services/core/jni/com_android_server_power_PowerManagerService.cpp
index d19398c..4698383 100644
--- a/services/core/jni/com_android_server_power_PowerManagerService.cpp
+++ b/services/core/jni/com_android_server_power_PowerManagerService.cpp
@@ -114,7 +114,7 @@
             gPowerHalAidl_ = waitForVintfService<IPowerAidl>();
         }
         if (gPowerHalAidl_) {
-            ALOGI("Successfully connected to Power HAL AIDL service.");
+            ALOGV("Successfully connected to Power HAL AIDL service.");
             return HalVersion::AIDL;
         } else {
             gPowerHalAidlExists = false;
@@ -123,14 +123,14 @@
     if (gPowerHalHidlExists && gPowerHalHidlV1_0_ == nullptr) {
         gPowerHalHidlV1_0_ = IPowerV1_0::getService();
         if (gPowerHalHidlV1_0_) {
-            ALOGI("Successfully connected to Power HAL HIDL 1.0 service.");
+            ALOGV("Successfully connected to Power HAL HIDL 1.0 service.");
             // Try cast to powerHAL HIDL V1_1
             gPowerHalHidlV1_1_ = IPowerV1_1::castFrom(gPowerHalHidlV1_0_);
             if (gPowerHalHidlV1_1_) {
-                ALOGI("Successfully connected to Power HAL HIDL 1.1 service.");
+                ALOGV("Successfully connected to Power HAL HIDL 1.1 service.");
             }
         } else {
-            ALOGI("Couldn't load power HAL HIDL service");
+            ALOGV("Couldn't load power HAL HIDL service");
             gPowerHalHidlExists = false;
             return HalVersion::NONE;
         }
diff --git a/services/core/jni/com_android_server_tv_GamepadKeys.h b/services/core/jni/com_android_server_tv_GamepadKeys.h
index 11fc903..127010f 100644
--- a/services/core/jni/com_android_server_tv_GamepadKeys.h
+++ b/services/core/jni/com_android_server_tv_GamepadKeys.h
@@ -1,77 +1,104 @@
 #ifndef ANDROIDTVREMOTE_SERVICE_JNI_GAMEPAD_KEYS_H_
 #define ANDROIDTVREMOTE_SERVICE_JNI_GAMEPAD_KEYS_H_
 
+#include <android/input.h>
+#include <android/keycodes.h>
 #include <linux/input.h>
 
 namespace android {
 
-// Follows the W3 spec for gamepad buttons and their corresponding mapping into
-// Linux keycodes. Note that gamepads are generally not very well standardized
-// and various controllers will result in different buttons. This mapping tries
-// to be reasonable.
+// The constant array below defines a mapping between "Android" IDs (key code
+// within events) and what is being sent through /dev/uinput.
 //
-// W3 Button spec: https://www.w3.org/TR/gamepad/#remapping
+// The translation back from uinput key codes into android key codes is done through
+// the corresponding key layout files. This file and
 //
-// Standard gamepad keycodes are added plus 2 additional buttons (e.g. Stadia
-// has "Assistant" and "Share", PS4 has the touchpad button).
+//    data/keyboards/Vendor_18d1_Product_0200.kl
 //
-// To generate this list, PS4, XBox, Stadia and Nintendo Switch Pro were tested.
-static const int GAMEPAD_KEY_CODES[19] = {
-        // Right-side buttons. A/B/X/Y or circle/triangle/square/X or similar
-        BTN_A, // "South", A, GAMEPAD and SOUTH have the same constant
-        BTN_B, // "East", BTN_B, BTN_EAST have the same constant
-        BTN_X, // "West", Note that this maps to X and NORTH in constants
-        BTN_Y, // "North", Note that this maps to Y and WEST in constants
+// MUST be kept in sync.
+//
+// see https://source.android.com/devices/input/key-layout-files for documentation.
 
-        BTN_TL, // "Left Bumper" / "L1" - Nintendo sends BTN_WEST instead
-        BTN_TR, // "Right Bumper" / "R1" - Nintendo sends BTN_Z instead
-
-        // For triggers, gamepads vary:
-        //   - Stadia sends analog values over ABS_GAS/ABS_BRAKE and sends
-        //     TriggerHappy3/4 as digital presses
-        //   - PS4 and Xbox send analog values as ABS_Z/ABS_RZ
-        //   - Nintendo Pro sends BTN_TL/BTN_TR (since bumpers behave differently)
-        // As placeholders we chose the stadia trigger-happy values since TL/TR are
-        // sent for bumper button presses
-        BTN_TRIGGER_HAPPY4, // "Left Trigger" / "L2"
-        BTN_TRIGGER_HAPPY3, // "Right Trigger" / "R2"
-
-        BTN_SELECT, // "Select/Back". Often "options" or similar
-        BTN_START,  // "Start/forward". Often "hamburger" icon
-
-        BTN_THUMBL, // "Left Joystick Pressed"
-        BTN_THUMBR, // "Right Joystick Pressed"
-
-        // For DPads, gamepads generally only send axis changes
-        // on ABS_HAT0X and ABS_HAT0Y.
-        KEY_UP,    // "Digital Pad up"
-        KEY_DOWN,  // "Digital Pad down"
-        KEY_LEFT,  // "Digital Pad left"
-        KEY_RIGHT, // "Digital Pad right"
-
-        BTN_MODE, // "Main button" (Stadia/PS/XBOX/Home)
-
-        BTN_TRIGGER_HAPPY1, // Extra button: "Assistant" for Stadia
-        BTN_TRIGGER_HAPPY2, // Extra button: "Share" for Stadia
+// Defines axis mapping information between android and
+// uinput axis.
+struct GamepadKey {
+    int32_t androidKeyCode;
+    int linuxUinputKeyCode;
 };
 
-// Defines information for an axis.
-struct Axis {
-    int number;
-    int rangeMin;
-    int rangeMax;
+static const GamepadKey GAMEPAD_KEYS[] = {
+        // Right-side buttons. A/B/X/Y or circle/triangle/square/X or similar
+        {AKEYCODE_BUTTON_A, BTN_A},
+        {AKEYCODE_BUTTON_B, BTN_B},
+        {AKEYCODE_BUTTON_X, BTN_X},
+        {AKEYCODE_BUTTON_Y, BTN_Y},
+
+        // Bumper buttons and digital triggers. Triggers generally have
+        // both analog versions (GAS and BRAKE output) and digital ones
+        {AKEYCODE_BUTTON_L1, BTN_TL2},
+        {AKEYCODE_BUTTON_L2, BTN_TL},
+        {AKEYCODE_BUTTON_R1, BTN_TR2},
+        {AKEYCODE_BUTTON_R2, BTN_TR},
+
+        // general actions for controllers
+        {AKEYCODE_BUTTON_SELECT, BTN_SELECT}, // Options or "..."
+        {AKEYCODE_BUTTON_START, BTN_START},   // Menu/Hamburger menu
+        {AKEYCODE_BUTTON_MODE, BTN_MODE},     // "main" button
+
+        // Pressing on the joyticks themselves
+        {AKEYCODE_BUTTON_THUMBL, BTN_THUMBL},
+        {AKEYCODE_BUTTON_THUMBR, BTN_THUMBR},
+
+        // DPAD digital keys. HAT axis events are generally also sent.
+        {AKEYCODE_DPAD_UP, KEY_UP},
+        {AKEYCODE_DPAD_DOWN, KEY_DOWN},
+        {AKEYCODE_DPAD_LEFT, KEY_LEFT},
+        {AKEYCODE_DPAD_RIGHT, KEY_RIGHT},
+
+        // "Extra" controller buttons: some devices have "share" and "assistant"
+        {AKEYCODE_BUTTON_1, BTN_TRIGGER_HAPPY1},
+        {AKEYCODE_BUTTON_2, BTN_TRIGGER_HAPPY2},
+        {AKEYCODE_BUTTON_3, BTN_TRIGGER_HAPPY3},
+        {AKEYCODE_BUTTON_4, BTN_TRIGGER_HAPPY4},
+        {AKEYCODE_BUTTON_5, BTN_TRIGGER_HAPPY5},
+        {AKEYCODE_BUTTON_6, BTN_TRIGGER_HAPPY6},
+        {AKEYCODE_BUTTON_7, BTN_TRIGGER_HAPPY7},
+        {AKEYCODE_BUTTON_8, BTN_TRIGGER_HAPPY8},
+        {AKEYCODE_BUTTON_9, BTN_TRIGGER_HAPPY9},
+        {AKEYCODE_BUTTON_10, BTN_TRIGGER_HAPPY10},
+        {AKEYCODE_BUTTON_11, BTN_TRIGGER_HAPPY11},
+        {AKEYCODE_BUTTON_12, BTN_TRIGGER_HAPPY12},
+        {AKEYCODE_BUTTON_13, BTN_TRIGGER_HAPPY13},
+        {AKEYCODE_BUTTON_14, BTN_TRIGGER_HAPPY14},
+        {AKEYCODE_BUTTON_15, BTN_TRIGGER_HAPPY15},
+        {AKEYCODE_BUTTON_16, BTN_TRIGGER_HAPPY16},
+
+        // Assignment to support global assistant for devices that support it.
+        {AKEYCODE_ASSIST, KEY_ASSISTANT},
+        {AKEYCODE_VOICE_ASSIST, KEY_VOICECOMMAND},
+};
+
+// Defines axis mapping information between android and
+// uinput axis.
+struct GamepadAxis {
+    int32_t androidAxis;
+    float androidRangeMin;
+    float androidRangeMax;
+    int linuxUinputAxis;
+    int linuxUinputRangeMin;
+    int linuxUinputRangeMax;
 };
 
 // List of all axes supported by a gamepad
-static const Axis GAMEPAD_AXES[] = {
-        {ABS_X, 0, 254},    // Left joystick X
-        {ABS_Y, 0, 254},    // Left joystick Y
-        {ABS_RX, 0, 254},   // Right joystick X
-        {ABS_RY, 0, 254},   // Right joystick Y
-        {ABS_Z, 0, 254},    // Left trigger
-        {ABS_RZ, 0, 254},   // Right trigger
-        {ABS_HAT0X, -1, 1}, // DPad X
-        {ABS_HAT0Y, -1, 1}, // DPad Y
+static const GamepadAxis GAMEPAD_AXES[] = {
+        {AMOTION_EVENT_AXIS_X, -1, 1, ABS_X, 0, 254},           // Left joystick X
+        {AMOTION_EVENT_AXIS_Y, -1, 1, ABS_Y, 0, 254},           // Left joystick Y
+        {AMOTION_EVENT_AXIS_Z, -1, 1, ABS_Z, 0, 254},           // Right joystick X
+        {AMOTION_EVENT_AXIS_RZ, -1, 1, ABS_RZ, 0, 254},         // Right joystick Y
+        {AMOTION_EVENT_AXIS_LTRIGGER, 0, 1, ABS_GAS, 0, 254},   // Left trigger
+        {AMOTION_EVENT_AXIS_RTRIGGER, 0, 1, ABS_BRAKE, 0, 254}, // Right trigger
+        {AMOTION_EVENT_AXIS_HAT_X, -1, 1, ABS_HAT0X, -1, 1},    // DPad X
+        {AMOTION_EVENT_AXIS_HAT_Y, -1, 1, ABS_HAT0Y, -1, 1},    // DPad Y
 };
 
 } // namespace android
diff --git a/services/core/jni/com_android_server_tv_TvUinputBridge.cpp b/services/core/jni/com_android_server_tv_TvUinputBridge.cpp
index 0e96bd7..99deab4 100644
--- a/services/core/jni/com_android_server_tv_TvUinputBridge.cpp
+++ b/services/core/jni/com_android_server_tv_TvUinputBridge.cpp
@@ -31,27 +31,38 @@
 #include <utils/String8.h>
 
 #include <ctype.h>
-#include <linux/input.h>
-#include <unistd.h>
-#include <sys/time.h>
-#include <time.h>
-#include <stdint.h>
-#include <map>
 #include <fcntl.h>
+#include <linux/input.h>
 #include <linux/uinput.h>
 #include <signal.h>
+#include <stdint.h>
 #include <sys/inotify.h>
 #include <sys/stat.h>
+#include <sys/time.h>
 #include <sys/types.h>
+#include <time.h>
+#include <unistd.h>
+#include <unordered_map>
 
 #define SLOT_UNKNOWN -1
 
 namespace android {
 
-static std::map<int32_t,int> keysMap;
-static std::map<int32_t,int32_t> slotsMap;
+#define GOOGLE_VENDOR_ID 0x18d1
+
+#define GOOGLE_VIRTUAL_REMOTE_PRODUCT_ID 0x0100
+#define GOOGLE_VIRTUAL_GAMEPAD_PROUCT_ID 0x0200
+
+static std::unordered_map<int32_t, int> keysMap;
+static std::unordered_map<int32_t, int32_t> slotsMap;
 static BitSet32 mtSlots;
 
+// Maps android key code to linux key code.
+static std::unordered_map<int32_t, int> gamepadAndroidToLinuxKeyMap;
+
+// Maps an android gamepad axis to the index within the GAMEPAD_AXES array.
+static std::unordered_map<int32_t, int> gamepadAndroidAxisToIndexMap;
+
 static void initKeysMap() {
     if (keysMap.empty()) {
         for (size_t i = 0; i < NELEM(KEYS); i++) {
@@ -60,16 +71,49 @@
     }
 }
 
+static void initGamepadKeyMap() {
+    if (gamepadAndroidToLinuxKeyMap.empty()) {
+        for (size_t i = 0; i < NELEM(GAMEPAD_KEYS); i++) {
+            gamepadAndroidToLinuxKeyMap[GAMEPAD_KEYS[i].androidKeyCode] =
+                    GAMEPAD_KEYS[i].linuxUinputKeyCode;
+        }
+    }
+
+    if (gamepadAndroidAxisToIndexMap.empty()) {
+        for (size_t i = 0; i < NELEM(GAMEPAD_AXES); i++) {
+            gamepadAndroidAxisToIndexMap[GAMEPAD_AXES[i].androidAxis] = i;
+        }
+    }
+}
+
 static int32_t getLinuxKeyCode(int32_t androidKeyCode) {
-    std::map<int,int>::iterator it = keysMap.find(androidKeyCode);
+    std::unordered_map<int, int>::iterator it = keysMap.find(androidKeyCode);
     if (it != keysMap.end()) {
         return it->second;
     }
     return KEY_UNKNOWN;
 }
 
+static int getGamepadkeyCode(int32_t androidKeyCode) {
+    std::unordered_map<int32_t, int>::iterator it =
+            gamepadAndroidToLinuxKeyMap.find(androidKeyCode);
+    if (it != gamepadAndroidToLinuxKeyMap.end()) {
+        return it->second;
+    }
+    return KEY_UNKNOWN;
+}
+
+static const GamepadAxis* getGamepadAxis(int32_t androidAxisCode) {
+    std::unordered_map<int32_t, int>::iterator it =
+            gamepadAndroidAxisToIndexMap.find(androidAxisCode);
+    if (it == gamepadAndroidAxisToIndexMap.end()) {
+        return nullptr;
+    }
+    return &GAMEPAD_AXES[it->second];
+}
+
 static int findSlot(int32_t pointerId) {
-    std::map<int,int>::iterator it = slotsMap.find(pointerId);
+    std::unordered_map<int, int>::iterator it = slotsMap.find(pointerId);
     if (it != slotsMap.end()) {
         return it->second;
     }
@@ -107,7 +151,7 @@
 
     // Open /dev/uinput and prepare to register
     // the device with the given name and unique Id
-    bool Open(const char* name, const char* uniqueId);
+    bool Open(const char* name, const char* uniqueId, uint16_t product);
 
     // Checks if the current file descriptor is valid
     bool IsValid() const { return mFd != kInvalidFileDescriptor; }
@@ -141,7 +185,7 @@
     return fd;
 }
 
-bool UInputDescriptor::Open(const char* name, const char* uniqueId) {
+bool UInputDescriptor::Open(const char* name, const char* uniqueId, uint16_t product) {
     if (IsValid()) {
         ALOGE("UInput device already open");
         return false;
@@ -161,6 +205,8 @@
     strlcpy(mUinputDescriptor.name, name, UINPUT_MAX_NAME_SIZE);
     mUinputDescriptor.id.version = 1;
     mUinputDescriptor.id.bustype = BUS_VIRTUAL;
+    mUinputDescriptor.id.vendor = GOOGLE_VENDOR_ID;
+    mUinputDescriptor.id.product = product;
 
     // All UInput devices we use process keys
     ioctl(mFd, UI_SET_EVBIT, EV_KEY);
@@ -258,7 +304,7 @@
     initKeysMap();
 
     UInputDescriptor descriptor;
-    if (!descriptor.Open(name, uniqueId)) {
+    if (!descriptor.Open(name, uniqueId, GOOGLE_VIRTUAL_REMOTE_PRODUCT_ID)) {
         return nullptr;
     }
 
@@ -277,21 +323,24 @@
 NativeConnection* NativeConnection::openGamepad(const char* name, const char* uniqueId) {
     ALOGI("Registering uinput device %s: gamepad", name);
 
+    initGamepadKeyMap();
+
     UInputDescriptor descriptor;
-    if (!descriptor.Open(name, uniqueId)) {
+    if (!descriptor.Open(name, uniqueId, GOOGLE_VIRTUAL_GAMEPAD_PROUCT_ID)) {
         return nullptr;
     }
 
     // set the keys mapped for gamepads
-    for (size_t i = 0; i < NELEM(GAMEPAD_KEY_CODES); i++) {
-        descriptor.EnableKey(GAMEPAD_KEY_CODES[i]);
+    for (size_t i = 0; i < NELEM(GAMEPAD_KEYS); i++) {
+        descriptor.EnableKey(GAMEPAD_KEYS[i].linuxUinputKeyCode);
     }
 
     // define the axes that are required
     descriptor.EnableAxesEvents();
     for (size_t i = 0; i < NELEM(GAMEPAD_AXES); i++) {
-        const Axis& axis = GAMEPAD_AXES[i];
-        descriptor.EnableAxis(axis.number, axis.rangeMin, axis.rangeMax);
+        const GamepadAxis& axis = GAMEPAD_AXES[i];
+        descriptor.EnableAxis(axis.linuxUinputAxis, axis.linuxUinputRangeMin,
+                              axis.linuxUinputRangeMax);
     }
 
     if (!descriptor.Create()) {
@@ -350,7 +399,7 @@
     }
 }
 
-static void nativeSendGamepadKey(JNIEnv* env, jclass clazz, jlong ptr, jint keyIndex,
+static void nativeSendGamepadKey(JNIEnv* env, jclass clazz, jlong ptr, jint keyCode,
                                  jboolean down) {
     NativeConnection* connection = reinterpret_cast<NativeConnection*>(ptr);
 
@@ -359,16 +408,16 @@
         return;
     }
 
-    if ((keyIndex < 0) || (keyIndex >= NELEM(GAMEPAD_KEY_CODES))) {
-        ALOGE("Invalid gamepad key index: %d", keyIndex);
+    int linuxKeyCode = getGamepadkeyCode(keyCode);
+    if (linuxKeyCode == KEY_UNKNOWN) {
+        ALOGE("Gamepad: received an unknown keycode of %d.", keyCode);
         return;
     }
-
-    connection->sendEvent(EV_KEY, GAMEPAD_KEY_CODES[keyIndex], down ? 1 : 0);
+    connection->sendEvent(EV_KEY, linuxKeyCode, down ? 1 : 0);
 }
 
 static void nativeSendGamepadAxisValue(JNIEnv* env, jclass clazz, jlong ptr, jint axis,
-                                       jint value) {
+                                       jfloat value) {
     NativeConnection* connection = reinterpret_cast<NativeConnection*>(ptr);
 
     if (!connection->IsGamepad()) {
@@ -376,7 +425,25 @@
         return;
     }
 
-    connection->sendEvent(EV_ABS, axis, value);
+    const GamepadAxis* axisInfo = getGamepadAxis(axis);
+    if (axisInfo == nullptr) {
+        ALOGE("Invalid axis: %d", axis);
+        return;
+    }
+
+    if (value > axisInfo->androidRangeMax) {
+        value = axisInfo->androidRangeMax;
+    } else if (value < axisInfo->androidRangeMin) {
+        value = axisInfo->androidRangeMin;
+    }
+
+    // Converts the android range into the device range
+    float movementPercent = (value - axisInfo->androidRangeMin) /
+            (axisInfo->androidRangeMax - axisInfo->androidRangeMin);
+    int axisRawValue = axisInfo->linuxUinputRangeMin +
+            movementPercent * (axisInfo->linuxUinputRangeMax - axisInfo->linuxUinputRangeMin);
+
+    connection->sendEvent(EV_ABS, axisInfo->linuxUinputAxis, axisRawValue);
 }
 
 static void nativeSendPointerDown(JNIEnv* env, jclass clazz, jlong ptr,
@@ -441,18 +508,20 @@
             }
         }
     } else {
-        for (size_t i = 0; i < NELEM(GAMEPAD_KEY_CODES); i++) {
-            connection->sendEvent(EV_KEY, GAMEPAD_KEY_CODES[i], 0);
+        for (size_t i = 0; i < NELEM(GAMEPAD_KEYS); i++) {
+            connection->sendEvent(EV_KEY, GAMEPAD_KEYS[i].linuxUinputKeyCode, 0);
         }
 
         for (size_t i = 0; i < NELEM(GAMEPAD_AXES); i++) {
-            const Axis& axis = GAMEPAD_AXES[i];
-            if ((axis.number == ABS_Z) || (axis.number == ABS_RZ)) {
+            const GamepadAxis& axis = GAMEPAD_AXES[i];
+
+            if ((axis.linuxUinputAxis == ABS_Z) || (axis.linuxUinputAxis == ABS_RZ)) {
                 // Mark triggers unpressed
-                connection->sendEvent(EV_ABS, axis.number, 0);
+                connection->sendEvent(EV_ABS, axis.linuxUinputAxis, axis.linuxUinputRangeMin);
             } else {
                 // Joysticks and dpad rests on center
-                connection->sendEvent(EV_ABS, axis.number, (axis.rangeMin + axis.rangeMax) / 2);
+                connection->sendEvent(EV_ABS, axis.linuxUinputAxis,
+                                      (axis.linuxUinputRangeMin + axis.linuxUinputRangeMax) / 2);
             }
         }
     }
@@ -475,7 +544,7 @@
         {"nativeClear", "(J)V", (void*)nativeClear},
         {"nativeSendPointerSync", "(J)V", (void*)nativeSendPointerSync},
         {"nativeSendGamepadKey", "(JIZ)V", (void*)nativeSendGamepadKey},
-        {"nativeSendGamepadAxisValue", "(JII)V", (void*)nativeSendGamepadAxisValue},
+        {"nativeSendGamepadAxisValue", "(JIF)V", (void*)nativeSendGamepadAxisValue},
 };
 
 int register_android_server_tv_TvUinputBridge(JNIEnv* env) {
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index 1da0740..5d5e424 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -161,8 +161,11 @@
 import android.content.ComponentName;
 import android.content.ContentValues;
 import android.content.Context;
+import android.content.IIntentReceiver;
+import android.content.IIntentSender;
 import android.content.Intent;
 import android.content.IntentFilter;
+import android.content.IntentSender;
 import android.content.PermissionChecker;
 import android.content.pm.ActivityInfo;
 import android.content.pm.ApplicationInfo;
@@ -171,6 +174,7 @@
 import android.content.pm.IPackageDataObserver;
 import android.content.pm.IPackageManager;
 import android.content.pm.PackageInfo;
+import android.content.pm.PackageInstaller;
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager.NameNotFoundException;
 import android.content.pm.PackageManagerInternal;
@@ -399,11 +403,14 @@
 
     private static final long EXPIRATION_GRACE_PERIOD_MS = 5 * MS_PER_DAY; // 5 days, in ms
     private static final long MANAGED_PROFILE_MAXIMUM_TIME_OFF_THRESHOLD = 3 * MS_PER_DAY;
+    /** When to warn the user about the approaching work profile off deadline: 1 day before */
+    private static final long MANAGED_PROFILE_OFF_WARNING_PERIOD = 1 * MS_PER_DAY;
 
     private static final String ACTION_EXPIRED_PASSWORD_NOTIFICATION =
             "com.android.server.ACTION_EXPIRED_PASSWORD_NOTIFICATION";
 
-    private static final String ACTION_PROFILE_OFF_DEADLINE =
+    @VisibleForTesting
+    static final String ACTION_PROFILE_OFF_DEADLINE =
             "com.android.server.ACTION_PROFILE_OFF_DEADLINE";
 
     private static final String ATTR_PERMISSION_PROVIDER = "permission-provider";
@@ -645,6 +652,13 @@
 
     private static final boolean ENABLE_LOCK_GUARD = true;
 
+    /** Profile off deadline is not set or more than MANAGED_PROFILE_OFF_WARNING_PERIOD away. */
+    private static final int PROFILE_OFF_DEADLINE_DEFAULT = 0;
+    /** Profile off deadline is closer than MANAGED_PROFILE_OFF_WARNING_PERIOD. */
+    private static final int PROFILE_OFF_DEADLINE_WARNING = 1;
+    /** Profile off deadline reached, notify the user that personal apps blocked. */
+    private static final int PROFILE_OFF_DEADLINE_REACHED = 2;
+
     interface Stats {
         int LOCK_GUARD_GUARD = 0;
 
@@ -922,11 +936,12 @@
                     mUserData.remove(userHandle);
                 }
                 handlePackagesChanged(null /* check all admins */, userHandle);
+                updatePersonalAppsSuspensionOnUserStart(userHandle);
             } else if (Intent.ACTION_USER_STOPPED.equals(action)) {
                 sendDeviceOwnerUserCommand(DeviceAdminReceiver.ACTION_USER_STOPPED, userHandle);
                 if (isManagedProfile(userHandle)) {
                     Slog.d(LOG_TAG, "Managed profile was stopped");
-                    updatePersonalAppSuspension(userHandle, false /* profileIsOn */);
+                    updatePersonalAppsSuspension(userHandle, false /* unlocked */);
                 }
             } else if (Intent.ACTION_USER_SWITCHED.equals(action)) {
                 sendDeviceOwnerUserCommand(DeviceAdminReceiver.ACTION_USER_SWITCHED, userHandle);
@@ -936,7 +951,7 @@
                 }
                 if (isManagedProfile(userHandle)) {
                     Slog.d(LOG_TAG, "Managed profile became unlocked");
-                    updatePersonalAppSuspension(userHandle, true /* profileIsOn */);
+                    updatePersonalAppsSuspension(userHandle, true /* unlocked */);
                 }
             } else if (Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE.equals(action)) {
                 handlePackagesChanged(null /* check all admins */, userHandle);
@@ -963,7 +978,7 @@
                 Slog.i(LOG_TAG, "Profile off deadline alarm was triggered");
                 final int userId = getManagedUserId(UserHandle.USER_SYSTEM);
                 if (userId >= 0) {
-                    updatePersonalAppSuspension(userId, mUserManager.isUserUnlocked(userId));
+                    updatePersonalAppsSuspension(userId, mUserManager.isUserUnlocked(userId));
                 } else {
                     Slog.wtf(LOG_TAG, "Got deadline alarm for nonexistent profile");
                 }
@@ -2482,6 +2497,16 @@
         public void runCryptoSelfTest() {
             CryptoTestHelper.runAndLogSelfTest();
         }
+
+        public String[] getPersonalAppsForSuspension(int userId) {
+            return new PersonalAppsSuspensionHelper(
+                    mContext.createContextAsUser(UserHandle.of(userId), 0 /* flags */))
+                    .getPersonalAppsForSuspension();
+        }
+
+        public long systemCurrentTimeMillis() {
+            return System.currentTimeMillis();
+        }
     }
 
     /**
@@ -2703,8 +2728,9 @@
         final ComponentName doAdminReceiver = doAdmin.info.getComponent();
         clearDeviceOwnerLocked(doAdmin, doUserId);
         Slog.i(LOG_TAG, "Removing admin artifacts...");
-        // TODO(b/149075700): Clean up application restrictions in UserManager.
         removeAdminArtifacts(doAdminReceiver, doUserId);
+        Slog.i(LOG_TAG, "Uninstalling the DO...");
+        uninstallOrDisablePackage(doAdminComponent.getPackageName(), doUserId);
         Slog.i(LOG_TAG, "Migration complete.");
 
         // Note: KeyChain keys are not removed and will remain accessible for the apps that have
@@ -2716,6 +2742,47 @@
                 .write();
     }
 
+    private void uninstallOrDisablePackage(String packageName, int userHandle) {
+        final ApplicationInfo appInfo;
+        try {
+            appInfo = mIPackageManager.getApplicationInfo(
+                    packageName, MATCH_DIRECT_BOOT_AWARE | MATCH_DIRECT_BOOT_UNAWARE, userHandle);
+        } catch (RemoteException e) {
+            // Shouldn't happen.
+            return;
+        }
+        if (appInfo == null) {
+            Slog.wtf(LOG_TAG, "Failed to get package info for " + packageName);
+            return;
+        }
+        if ((appInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
+            Slog.i(LOG_TAG, String.format(
+                    "Package %s is pre-installed, marking disabled until used", packageName));
+            mContext.getPackageManager().setApplicationEnabledSetting(packageName,
+                    PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED, 0 /* flags */);
+            return;
+        }
+
+        final IIntentSender.Stub mLocalSender = new IIntentSender.Stub() {
+            @Override
+            public void send(int code, Intent intent, String resolvedType, IBinder whitelistToken,
+                    IIntentReceiver finishedReceiver, String requiredPermission, Bundle options) {
+                final int status = intent.getIntExtra(
+                        PackageInstaller.EXTRA_STATUS, PackageInstaller.STATUS_FAILURE);
+                if (status == PackageInstaller.STATUS_SUCCESS) {
+                    Slog.i(LOG_TAG, String.format(
+                            "Package %s uninstalled for user %d", packageName, userHandle));
+                } else {
+                    Slog.e(LOG_TAG, String.format(
+                            "Failed to uninstall %s; status: %d", packageName, status));
+                }
+            }
+        };
+
+        final PackageInstaller pi = mInjector.getPackageManager(userHandle).getPackageInstaller();
+        pi.uninstall(packageName, 0 /* flags */, new IntentSender((IIntentSender) mLocalSender));
+    }
+
     private void moveDoPoliciesToProfileParentAdmin(ActiveAdmin doAdmin, ActiveAdmin parentAdmin) {
         // The following policies can be already controlled via parent instance, skip if so.
         if (parentAdmin.mPasswordPolicy.quality == PASSWORD_QUALITY_UNSPECIFIED) {
@@ -3999,10 +4066,6 @@
                     applyManagedProfileRestrictionIfDeviceOwnerLocked();
                 }
                 maybeStartSecurityLogMonitorOnActivityManagerReady();
-                final int userId = getManagedUserId(UserHandle.USER_SYSTEM);
-                if (userId >= 0) {
-                    updatePersonalAppSuspension(userId, false /* running */);
-                }
                 break;
             case SystemService.PHASE_BOOT_COMPLETED:
                 ensureDeviceOwnerUserStarted(); // TODO Consider better place to do this.
@@ -4010,6 +4073,16 @@
         }
     }
 
+    private void updatePersonalAppsSuspensionOnUserStart(int userHandle) {
+        final int profileUserHandle = getManagedUserId(userHandle);
+        if (profileUserHandle >= 0) {
+            // Given that the parent user has just started, profile should be locked.
+            updatePersonalAppsSuspension(profileUserHandle, false /* unlocked */);
+        } else {
+            suspendPersonalAppsInternal(userHandle, false);
+        }
+    }
+
     private void onLockSettingsReady() {
         getUserData(UserHandle.USER_SYSTEM);
         loadOwners();
@@ -4733,33 +4806,13 @@
         if (!parent && isSeparateProfileChallengeEnabled(userHandle)) {
             // If this user has a separate challenge, only return its restrictions.
             return getUserDataUnchecked(userHandle).mAdminList;
-        } else {
-            // Return all admins for this user and the profiles that are visible from this
-            // user that do not use a separate work challenge.
-            ArrayList<ActiveAdmin> admins = new ArrayList<ActiveAdmin>();
-            for (UserInfo userInfo : mUserManager.getProfiles(userHandle)) {
-                DevicePolicyData policy = getUserData(userInfo.id);
-                if (!userInfo.isManagedProfile()) {
-                    admins.addAll(policy.mAdminList);
-                } else {
-                    // For managed profiles, we always include the policies set on the parent
-                    // profile. Additionally, we include the ones set on the managed profile
-                    // if no separate challenge is in place.
-                    boolean hasSeparateChallenge = isSeparateProfileChallengeEnabled(userInfo.id);
-                    final int N = policy.mAdminList.size();
-                    for (int i = 0; i < N; i++) {
-                        ActiveAdmin admin = policy.mAdminList.get(i);
-                        if (admin.hasParentActiveAdmin()) {
-                            admins.add(admin.getParentActiveAdmin());
-                        }
-                        if (!hasSeparateChallenge) {
-                            admins.add(admin);
-                        }
-                    }
-                }
-            }
-            return admins;
         }
+        // Either parent == true, or isSeparateProfileChallengeEnabled == false
+        // If parent is true, query the parent user of userHandle by definition,
+        // If isSeparateProfileChallengeEnabled is false, userHandle points to a managed profile
+        // with unified challenge so also need to query the parent user who owns the credential.
+        return getActiveAdminsForUserAndItsManagedProfilesLocked(getProfileParentId(userHandle),
+                (user) -> !mLockPatternUtils.isSeparateProfileChallengeEnabled(user.id));
     }
 
     /**
@@ -4777,6 +4830,19 @@
         if (isManagedProfile(userHandle)) {
             return getUserDataUnchecked(userHandle).mAdminList;
         }
+        return getActiveAdminsForUserAndItsManagedProfilesLocked(userHandle,
+                /* shouldIncludeProfileAdmins */ (user) -> false);
+    }
+
+    /**
+     * Returns the list of admins on the given user, as well as parent admins for each managed
+     * profile associated with the given user. Optionally also include the admin of each managed
+     * profile.
+     * <p> Should not be called on a profile user.
+     */
+    @GuardedBy("getLockObject()")
+    private List<ActiveAdmin> getActiveAdminsForUserAndItsManagedProfilesLocked(int userHandle,
+            Predicate<UserInfo> shouldIncludeProfileAdmins) {
         ArrayList<ActiveAdmin> admins = new ArrayList<>();
         mInjector.binderWithCleanCallingIdentity(() -> {
             for (UserInfo userInfo : mUserManager.getProfiles(userHandle)) {
@@ -4784,12 +4850,14 @@
                 if (userInfo.id == userHandle) {
                     admins.addAll(policy.mAdminList);
                 } else if (userInfo.isManagedProfile()) {
-                    // For managed profiles, policies set on the parent profile will be included
                     for (int i = 0; i < policy.mAdminList.size(); i++) {
                         ActiveAdmin admin = policy.mAdminList.get(i);
                         if (admin.hasParentActiveAdmin()) {
                             admins.add(admin.getParentActiveAdmin());
                         }
+                        if (shouldIncludeProfileAdmins.test(userInfo)) {
+                            admins.add(admin);
+                        }
                     }
                 } else {
                     Slog.w(LOG_TAG, "Unknown user type: " + userInfo);
@@ -5366,6 +5434,32 @@
         }
     }
 
+    @Override
+    public boolean isPasswordSufficientAfterProfileUnification(int userHandle, int profileUser) {
+        if (!mHasFeature) {
+            return true;
+        }
+        enforceFullCrossUsersPermission(userHandle);
+        enforceNotManagedProfile(userHandle, "check password sufficiency");
+        enforceUserUnlocked(userHandle);
+
+        synchronized (getLockObject()) {
+            PasswordMetrics metrics = mLockSettingsInternal.getUserPasswordMetrics(userHandle);
+
+            // Combine password policies across the user and its profiles. Profile admins are
+            // included if the profile is to be unified or currently has unified challenge
+            List<ActiveAdmin> admins = getActiveAdminsForUserAndItsManagedProfilesLocked(userHandle,
+                    /* shouldIncludeProfileAdmins */ (user) -> user.id == profileUser
+                    || !mLockPatternUtils.isSeparateProfileChallengeEnabled(user.id));
+            ArrayList<PasswordMetrics> adminMetrics = new ArrayList<>(admins.size());
+            for (ActiveAdmin admin : admins) {
+                adminMetrics.add(admin.mPasswordPolicy.getMinMetrics());
+            }
+            return PasswordMetrics.validatePasswordMetrics(PasswordMetrics.merge(adminMetrics),
+                    PASSWORD_COMPLEXITY_NONE, false, metrics).isEmpty();
+        }
+    }
+
     private boolean isActivePasswordSufficientForUserLocked(
             boolean passwordValidAtLastCheckpoint, @Nullable PasswordMetrics metrics,
             int userHandle, boolean parent) {
@@ -8745,6 +8839,8 @@
         saveSettingsLocked(UserHandle.USER_SYSTEM);
         clearUserPoliciesLocked(userId);
         clearOverrideApnUnchecked();
+        clearApplicationRestrictions(userId);
+        mInjector.getPackageManagerInternal().clearBlockUninstallForUser(userId);
 
         mOwners.clearDeviceOwner();
         mOwners.writeDeviceOwner();
@@ -8758,6 +8854,19 @@
         toggleBackupServiceActive(UserHandle.USER_SYSTEM, true);
     }
 
+    private void clearApplicationRestrictions(int userId) {
+        // Changing app restrictions involves disk IO, offload it to the background thread.
+        mBackgroundHandler.post(() -> {
+            final List<PackageInfo> installedPackageInfos = mInjector.getPackageManager(userId)
+                    .getInstalledPackages(MATCH_DIRECT_BOOT_AWARE | MATCH_DIRECT_BOOT_UNAWARE);
+            final UserHandle userHandle = UserHandle.of(userId);
+            for (final PackageInfo packageInfo : installedPackageInfos) {
+                mInjector.getUserManager().setApplicationRestrictions(
+                        packageInfo.packageName, null /* restrictions */, userHandle);
+            }
+        });
+    }
+
     @Override
     public boolean setProfileOwner(ComponentName who, String ownerName, int userHandle) {
         if (!mHasFeature) {
@@ -8877,6 +8986,7 @@
         policyData.mOwnerInstalledCaCerts.clear();
         saveSettingsLocked(userId);
         clearUserPoliciesLocked(userId);
+        clearApplicationRestrictions(userId);
         mOwners.removeProfileOwner(userId);
         mOwners.writeProfileOwner(userId);
         deleteTransferOwnershipBundleLocked(userId);
@@ -15810,11 +15920,8 @@
             }
         }
 
-        final int suspendedState = suspended
-                ? PERSONAL_APPS_SUSPENDED_EXPLICITLY
-                : PERSONAL_APPS_NOT_SUSPENDED;
-        mInjector.binderWithCleanCallingIdentity(
-                () -> applyPersonalAppsSuspension(callingUserId, suspendedState));
+        mInjector.binderWithCleanCallingIdentity(() -> updatePersonalAppsSuspension(
+                callingUserId, mUserManager.isUserUnlocked(callingUserId)));
 
         DevicePolicyEventLogger
                 .createEvent(DevicePolicyEnums.SET_PERSONAL_APPS_SUSPENDED)
@@ -15824,44 +15931,54 @@
     }
 
     /**
-     * Checks whether there is a policy that requires personal apps to be suspended and if so,
-     * applies it.
-     * @param running whether the profile is currently considered running.
+     * Checks whether personal apps should be suspended according to the policy and applies the
+     * change if needed.
+     *
+     * @param unlocked whether the profile is currently running unlocked.
      */
-    private void updatePersonalAppSuspension(int profileUserId, boolean running) {
-        final int suspensionState;
+    private void updatePersonalAppsSuspension(int profileUserId, boolean unlocked) {
+        final boolean suspended;
         synchronized (getLockObject()) {
             final ActiveAdmin profileOwner = getProfileOwnerAdminLocked(profileUserId);
             if (profileOwner != null) {
-                final boolean deadlineReached =
-                        updateProfileOffDeadlineLocked(profileUserId, profileOwner, running);
-                suspensionState = makeSuspensionReasons(
-                        profileOwner.mSuspendPersonalApps, deadlineReached);
-                Slog.d(LOG_TAG,
-                        String.format("New personal apps suspension state: %d", suspensionState));
+                final int deadlineState =
+                        updateProfileOffDeadlineLocked(profileUserId, profileOwner, unlocked);
+                suspended = profileOwner.mSuspendPersonalApps
+                        || deadlineState == PROFILE_OFF_DEADLINE_REACHED;
+                Slog.d(LOG_TAG, String.format("Personal apps suspended: %b, deadline state: %d",
+                            suspended, deadlineState));
+                updateProfileOffDeadlineNotificationLocked(profileUserId, profileOwner,
+                        unlocked ? PROFILE_OFF_DEADLINE_DEFAULT : deadlineState);
             } else {
-                suspensionState = PERSONAL_APPS_NOT_SUSPENDED;
+                suspended = false;
             }
         }
 
-        applyPersonalAppsSuspension(profileUserId, suspensionState);
+        final int parentUserId = getProfileParentId(profileUserId);
+        suspendPersonalAppsInternal(parentUserId, suspended);
     }
 
     /**
      * Checks work profile time off policy, scheduling personal apps suspension via alarm if
      * necessary.
-     * @return whether the apps should be suspended based on maximum time off policy.
+     * @return profile deadline state
      */
-    private boolean updateProfileOffDeadlineLocked(
+    private int updateProfileOffDeadlineLocked(
             int profileUserId, ActiveAdmin profileOwner, boolean unlocked) {
-        final long now = System.currentTimeMillis();
+        final long now = mInjector.systemCurrentTimeMillis();
         if (profileOwner.mProfileOffDeadline != 0 && now > profileOwner.mProfileOffDeadline) {
             // Profile off deadline is already reached.
             Slog.i(LOG_TAG, "Profile off deadline has been reached.");
-            return true;
+            return PROFILE_OFF_DEADLINE_REACHED;
         }
         boolean shouldSaveSettings = false;
-        if (profileOwner.mProfileOffDeadline != 0
+        if (profileOwner.mSuspendPersonalApps) {
+            // When explicit suspension is active, deadline shouldn't be set.
+            if (profileOwner.mProfileOffDeadline != 0) {
+                profileOwner.mProfileOffDeadline = 0;
+                shouldSaveSettings = true;
+            }
+        } else if (profileOwner.mProfileOffDeadline != 0
                 && (profileOwner.mProfileMaximumTimeOffMillis == 0 || unlocked)) {
             // There is a deadline but either there is no policy or the profile is unlocked -> clear
             // the deadline.
@@ -15877,52 +15994,51 @@
             shouldSaveSettings = true;
         }
 
-        updateProfileOffAlarm(profileOwner.mProfileOffDeadline);
-
         if (shouldSaveSettings) {
             saveSettingsLocked(profileUserId);
         }
-        return false;
-    }
 
-    private void updateProfileOffAlarm(long profileOffDeadline) {
+        final long alarmTime;
+        final int deadlineState;
+        if (profileOwner.mProfileOffDeadline == 0) {
+            alarmTime = 0;
+            deadlineState = PROFILE_OFF_DEADLINE_DEFAULT;
+        } else if (profileOwner.mProfileOffDeadline - now < MANAGED_PROFILE_OFF_WARNING_PERIOD) {
+            // The deadline is close, upon the alarm personal apps should be suspended.
+            alarmTime = profileOwner.mProfileOffDeadline;
+            deadlineState = PROFILE_OFF_DEADLINE_WARNING;
+        } else {
+            // The deadline is quite far, upon the alarm we should warn the user first, so the
+            // alarm is scheduled earlier than the actual deadline.
+            alarmTime = profileOwner.mProfileOffDeadline - MANAGED_PROFILE_OFF_WARNING_PERIOD;
+            deadlineState = PROFILE_OFF_DEADLINE_DEFAULT;
+        }
+
         final AlarmManager am = mInjector.getAlarmManager();
         final PendingIntent pi = mInjector.pendingIntentGetBroadcast(
                 mContext, REQUEST_PROFILE_OFF_DEADLINE, new Intent(ACTION_PROFILE_OFF_DEADLINE),
                 PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_UPDATE_CURRENT);
-        am.cancel(pi);
-        if (profileOffDeadline != 0) {
-            Slog.i(LOG_TAG, "Profile off deadline alarm is set.");
-            am.set(AlarmManager.RTC, profileOffDeadline, pi);
-        } else {
+
+        if (alarmTime == 0) {
             Slog.i(LOG_TAG, "Profile off deadline alarm is removed.");
-        }
-    }
-
-    private void applyPersonalAppsSuspension(
-            int profileUserId, @PersonalAppsSuspensionReason int suspensionState) {
-        final boolean suspended = getUserData(UserHandle.USER_SYSTEM).mAppsSuspended;
-        final boolean shouldSuspend = suspensionState != PERSONAL_APPS_NOT_SUSPENDED;
-        if (suspended != shouldSuspend) {
-            suspendPersonalAppsInternal(shouldSuspend, UserHandle.USER_SYSTEM);
-        }
-
-        if (suspensionState == PERSONAL_APPS_SUSPENDED_PROFILE_TIMEOUT) {
-            sendPersonalAppsSuspendedNotification(profileUserId);
+            am.cancel(pi);
         } else {
-            clearPersonalAppsSuspendedNotification();
+            Slog.i(LOG_TAG, "Profile off deadline alarm is set.");
+            am.set(AlarmManager.RTC, alarmTime, pi);
         }
+
+        return deadlineState;
     }
 
-    private void suspendPersonalAppsInternal(boolean suspended, int userId) {
+    private void suspendPersonalAppsInternal(int userId, boolean suspended) {
+        if (getUserData(userId).mAppsSuspended == suspended) {
+            return;
+        }
         Slog.i(LOG_TAG, String.format("%s personal apps for user %d",
                 suspended ? "Suspending" : "Unsuspending", userId));
         mInjector.binderWithCleanCallingIdentity(() -> {
             try {
-                final String[] appsToSuspend =
-                        new PersonalAppsSuspensionHelper(
-                                mContext.createContextAsUser(UserHandle.of(userId), 0 /* flags */))
-                                .getPersonalAppsForSuspension();
+                final String[] appsToSuspend = mInjector.getPersonalAppsForSuspension(userId);
                 final String[] failedPackages = mIPackageManager.setPackagesSuspendedAsUser(
                         appsToSuspend, suspended, null, null, null, PLATFORM_PACKAGE_NAME, userId);
                 if (!ArrayUtils.isEmpty(failedPackages)) {
@@ -15941,37 +16057,38 @@
         }
     }
 
-    private void clearPersonalAppsSuspendedNotification() {
-        mInjector.binderWithCleanCallingIdentity(() ->
-                mInjector.getNotificationManager().cancel(
-                        SystemMessage.NOTE_PERSONAL_APPS_SUSPENDED));
-    }
+    private void updateProfileOffDeadlineNotificationLocked(int profileUserId,
+            @Nullable ActiveAdmin profileOwner, int notificationState) {
 
-    private void sendPersonalAppsSuspendedNotification(int userId) {
-        final String profileOwnerPackageName;
-        final long maxTimeOffDays;
-        synchronized (getLockObject()) {
-            profileOwnerPackageName = mOwners.getProfileOwnerComponent(userId).getPackageName();
-            final ActiveAdmin poAdmin = getProfileOwnerAdminLocked(userId);
-            maxTimeOffDays = TimeUnit.MILLISECONDS.toDays(poAdmin.mProfileMaximumTimeOffMillis);
+        if (notificationState == PROFILE_OFF_DEADLINE_DEFAULT) {
+            mInjector.getNotificationManager().cancel(SystemMessage.NOTE_PERSONAL_APPS_SUSPENDED);
+            return;
         }
 
+        final String profileOwnerPackageName = profileOwner.info.getPackageName();
+        final long maxTimeOffDays =
+                TimeUnit.MILLISECONDS.toDays(profileOwner.mProfileMaximumTimeOffMillis);
+
         final Intent intent = new Intent(DevicePolicyManager.ACTION_CHECK_POLICY_COMPLIANCE);
         intent.setPackage(profileOwnerPackageName);
 
         final PendingIntent pendingIntent = mInjector.pendingIntentGetActivityAsUser(mContext,
-                0 /* requestCode */, intent, PendingIntent.FLAG_UPDATE_CURRENT, null /* options */,
-                UserHandle.of(userId));
+                0 /* requestCode */, intent, PendingIntent.FLAG_UPDATE_CURRENT,
+                null /* options */, UserHandle.of(profileUserId));
+
+        // TODO(b/149075510): Only the first of the notifications should be dismissible.
+        final String title = mContext.getString(
+                notificationState == PROFILE_OFF_DEADLINE_WARNING
+                ? R.string.personal_apps_suspended_tomorrow_title
+                : R.string.personal_apps_suspended_title);
 
         final Notification notification =
                 new Notification.Builder(mContext, SystemNotificationChannels.DEVICE_ADMIN)
                         .setSmallIcon(android.R.drawable.stat_sys_warning)
                         .setOngoing(true)
-                        .setContentTitle(
-                                mContext.getString(
-                                        R.string.personal_apps_suspended_title))
+                        .setContentTitle(title)
                         .setContentText(mContext.getString(
-                                R.string.personal_apps_suspended_text, maxTimeOffDays))
+                            R.string.personal_apps_suspended_text, maxTimeOffDays))
                         .setColor(mContext.getColor(R.color.system_notification_accent_color))
                         .setContentIntent(pendingIntent)
                         .build();
@@ -16003,7 +16120,7 @@
         }
 
         mInjector.binderWithCleanCallingIdentity(
-                () -> updatePersonalAppSuspension(userId, mUserManager.isUserUnlocked()));
+                () -> updatePersonalAppsSuspension(userId, mUserManager.isUserUnlocked()));
 
         DevicePolicyEventLogger
                 .createEvent(DevicePolicyEnums.SET_MANAGED_PROFILE_MAXIMUM_TIME_OFF)
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/PersonalAppsSuspensionHelper.java b/services/devicepolicy/java/com/android/server/devicepolicy/PersonalAppsSuspensionHelper.java
index d9db17e..da716ea 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/PersonalAppsSuspensionHelper.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/PersonalAppsSuspensionHelper.java
@@ -51,6 +51,10 @@
 public class PersonalAppsSuspensionHelper {
     private static final String LOG_TAG = DevicePolicyManagerService.LOG_TAG;
 
+    // Flags to get all packages even if the user is still locked.
+    private static final int PACKAGE_QUERY_FLAGS =
+            PackageManager.MATCH_DIRECT_BOOT_AWARE | PackageManager.MATCH_DIRECT_BOOT_UNAWARE;
+
     private final Context mContext;
     private final PackageManager mPackageManager;
 
@@ -67,7 +71,7 @@
      */
     String[] getPersonalAppsForSuspension() {
         final List<PackageInfo> installedPackageInfos =
-                mPackageManager.getInstalledPackages(0 /* flags */);
+                mPackageManager.getInstalledPackages(PACKAGE_QUERY_FLAGS);
         final Set<String> result = new ArraySet<>();
         for (final PackageInfo packageInfo : installedPackageInfos) {
             final ApplicationInfo info = packageInfo.applicationInfo;
@@ -97,7 +101,7 @@
         final Intent intent = new Intent(Intent.ACTION_MAIN);
         intent.addCategory(Intent.CATEGORY_HOME);
         final List<ResolveInfo> matchingActivities =
-                mPackageManager.queryIntentActivities(intent, 0);
+                mPackageManager.queryIntentActivities(intent, PACKAGE_QUERY_FLAGS);
         for (final ResolveInfo resolveInfo : matchingActivities) {
             if (resolveInfo.activityInfo == null
                     || TextUtils.isEmpty(resolveInfo.activityInfo.packageName)) {
@@ -107,7 +111,7 @@
             final String packageName = resolveInfo.activityInfo.packageName;
             try {
                 final ApplicationInfo applicationInfo =
-                        mPackageManager.getApplicationInfo(packageName, 0);
+                        mPackageManager.getApplicationInfo(packageName, PACKAGE_QUERY_FLAGS);
                 if (applicationInfo.isSystemApp() || applicationInfo.isUpdatedSystemApp()) {
                     result.add(packageName);
                 }
@@ -147,7 +151,8 @@
     private String getSettingsPackageName() {
         final Intent intent = new Intent(Settings.ACTION_SETTINGS);
         intent.addCategory(Intent.CATEGORY_DEFAULT);
-        final ResolveInfo resolveInfo = mPackageManager.resolveActivity(intent, /* flags= */ 0);
+        final ResolveInfo resolveInfo =
+                mPackageManager.resolveActivity(intent, PACKAGE_QUERY_FLAGS);
         if (resolveInfo != null) {
             return resolveInfo.activityInfo.packageName;
         }
@@ -164,7 +169,7 @@
         intentToResolve.addCategory(Intent.CATEGORY_LAUNCHER);
         intentToResolve.setPackage(packageName);
         final List<ResolveInfo> resolveInfos =
-                mPackageManager.queryIntentActivities(intentToResolve, /* flags= */ 0);
+                mPackageManager.queryIntentActivities(intentToResolve, PACKAGE_QUERY_FLAGS);
         return resolveInfos != null && !resolveInfos.isEmpty();
     }
 
diff --git a/services/incremental/Android.bp b/services/incremental/Android.bp
index b13d330..de639c5 100644
--- a/services/incremental/Android.bp
+++ b/services/incremental/Android.bp
@@ -19,6 +19,21 @@
     proto: {
         type: "lite",
     },
+    tidy: true,
+    tidy_checks: [
+        "android-*",
+        "cert-*",
+        "clang-analyzer-security*",
+        "-cert-err34-c",
+        "clang-analyzer-security*",
+        // Disabling due to many unavoidable warnings from POSIX API usage.
+        "-google-runtime-int",
+        "-google-explicit-constructor",
+        // do not define variadic C function - JNI headers
+        "-cert-dcl50-cpp",
+        // operator=() does not handle self-assignment properly - all protobuf-generated classes
+        "-cert-oop54-cpp",
+    ],
 }
 
 cc_defaults {
@@ -62,6 +77,7 @@
     srcs: [
         "incremental_service.c",
         "IncrementalService.cpp",
+        "IncrementalServiceValidation.cpp",
         "BinderIncrementalService.cpp",
         "path.cpp",
         "ServiceWrappers.cpp",
diff --git a/services/incremental/BinderIncrementalService.cpp b/services/incremental/BinderIncrementalService.cpp
index fc8c6fe..8476674 100644
--- a/services/incremental/BinderIncrementalService.cpp
+++ b/services/incremental/BinderIncrementalService.cpp
@@ -18,6 +18,7 @@
 
 #include <android-base/logging.h>
 #include <android-base/no_destructor.h>
+#include <android/os/IVold.h>
 #include <binder/IResultReceiver.h>
 #include <binder/PermissionCache.h>
 #include <incfs.h>
@@ -117,11 +118,12 @@
 }
 
 binder::Status BinderIncrementalService::createStorage(
-        const std::string& path, const DataLoaderParamsParcel& params,
+        const std::string& path, const content::pm::DataLoaderParamsParcel& params,
         const ::android::sp<::android::content::pm::IDataLoaderStatusListener>& listener,
         int32_t createMode, int32_t* _aidl_return) {
     *_aidl_return =
-            mImpl.createStorage(path, const_cast<DataLoaderParamsParcel&&>(params), listener,
+            mImpl.createStorage(path, const_cast<content::pm::DataLoaderParamsParcel&&>(params),
+                                listener,
                                 android::incremental::IncrementalService::CreateOptions(
                                         createMode));
     return ok();
@@ -238,11 +240,8 @@
 binder::Status BinderIncrementalService::getMetadataByPath(int32_t storageId,
                                                            const std::string& path,
                                                            std::vector<uint8_t>* _aidl_return) {
-    auto fid = mImpl.nodeFor(storageId, path);
-    if (fid != kIncFsInvalidFileId) {
-        auto metadata = mImpl.getMetadata(storageId, fid);
-        _aidl_return->assign(metadata.begin(), metadata.end());
-    }
+    auto metadata = mImpl.getMetadata(storageId, path);
+    _aidl_return->assign(metadata.begin(), metadata.end());
     return ok();
 }
 
diff --git a/services/incremental/IncrementalService.cpp b/services/incremental/IncrementalService.cpp
index 149dfa6..a1b4f24 100644
--- a/services/incremental/IncrementalService.cpp
+++ b/services/incremental/IncrementalService.cpp
@@ -18,32 +18,26 @@
 
 #include "IncrementalService.h"
 
-#include <android-base/file.h>
 #include <android-base/logging.h>
 #include <android-base/no_destructor.h>
 #include <android-base/properties.h>
 #include <android-base/stringprintf.h>
-#include <android-base/strings.h>
-#include <android/content/pm/IDataLoaderStatusListener.h>
-#include <android/os/IVold.h>
-#include <binder/BinderService.h>
+#include <binder/AppOpsManager.h>
 #include <binder/Nullable.h>
-#include <binder/ParcelFileDescriptor.h>
 #include <binder/Status.h>
 #include <sys/stat.h>
 #include <uuid/uuid.h>
 
 #include <charconv>
 #include <ctime>
-#include <filesystem>
 #include <iterator>
 #include <span>
 #include <type_traits>
 
+#include "IncrementalServiceValidation.h"
 #include "Metadata.pb.h"
 
 using namespace std::literals;
-using namespace android::content::pm;
 namespace fs = std::filesystem;
 
 constexpr const char* kDataUsageStats = "android.permission.LOADER_USAGE_STATS";
@@ -51,10 +45,13 @@
 
 namespace android::incremental {
 
+using content::pm::DataLoaderParamsParcel;
+using content::pm::FileSystemControlParcel;
+using content::pm::IDataLoader;
+
 namespace {
 
-using IncrementalFileSystemControlParcel =
-        ::android::os::incremental::IncrementalFileSystemControlParcel;
+using IncrementalFileSystemControlParcel = os::incremental::IncrementalFileSystemControlParcel;
 
 struct Constants {
     static constexpr auto backing = "backing_store"sv;
@@ -105,10 +102,13 @@
     if (path::isAbsolute(path)) {
         path.remove_prefix(1);
     }
+    if (path.size() > 16) {
+        path = path.substr(0, 16);
+    }
     std::string res(path);
-    std::replace(res.begin(), res.end(), '/', '_');
-    std::replace(res.begin(), res.end(), '@', '_');
-    return std::string(constants().mountKeyPrefix) + res;
+    std::replace_if(
+            res.begin(), res.end(), [](char c) { return c == '/' || c == '@'; }, '_');
+    return std::string(constants().mountKeyPrefix) += res;
 }
 
 static std::pair<std::string, std::string> makeMountDir(std::string_view incrementalDir,
@@ -125,8 +125,26 @@
     return {};
 }
 
+template <class Map>
+typename Map::const_iterator findParentPath(const Map& map, std::string_view path) {
+    const auto nextIt = map.upper_bound(path);
+    if (nextIt == map.begin()) {
+        return map.end();
+    }
+    const auto suspectIt = std::prev(nextIt);
+    if (!path::startsWith(path, suspectIt->first)) {
+        return map.end();
+    }
+    return suspectIt;
+}
+
+static base::unique_fd dup(base::borrowed_fd fd) {
+    const auto res = fcntl(fd.get(), F_DUPFD_CLOEXEC, 0);
+    return base::unique_fd(res);
+}
+
 template <class ProtoMessage, class Control>
-static ProtoMessage parseFromIncfs(const IncFsWrapper* incfs, Control&& control,
+static ProtoMessage parseFromIncfs(const IncFsWrapper* incfs, const Control& control,
                                    std::string_view path) {
     auto md = incfs->getMetadata(control, path);
     ProtoMessage message;
@@ -155,19 +173,18 @@
 }
 } // namespace
 
-const bool IncrementalService::sEnablePerfLogging =
-        android::base::GetBoolProperty("incremental.perflogging", false);
-
 IncrementalService::IncFsMount::~IncFsMount() {
     if (dataLoaderStub) {
-        dataLoaderStub->destroy();
+        dataLoaderStub->cleanupResources();
+        dataLoaderStub = {};
     }
+    control.close();
     LOG(INFO) << "Unmounting and cleaning up mount " << mountId << " with root '" << root << '\'';
     for (auto&& [target, _] : bindPoints) {
-        LOG(INFO) << "\tbind: " << target;
+        LOG(INFO) << "  bind: " << target;
         incrementalService.mVold->unmountIncFs(target);
     }
-    LOG(INFO) << "\troot: " << root;
+    LOG(INFO) << "  root: " << root;
     incrementalService.mVold->unmountIncFs(path::join(root, constants().mount));
     cleanupFilesystem(root);
 }
@@ -192,8 +209,19 @@
     return storages.end();
 }
 
-static std::unique_ptr<DIR, decltype(&::closedir)> openDir(const char* path) {
-    return {::opendir(path), ::closedir};
+template <class Func>
+static auto makeCleanup(Func&& f) {
+    auto deleter = [f = std::move(f)](auto) { f(); };
+    // &f is a dangling pointer here, but we actually never use it as deleter moves it in.
+    return std::unique_ptr<Func, decltype(deleter)>(&f, std::move(deleter));
+}
+
+static std::unique_ptr<DIR, decltype(&::closedir)> openDir(const char* dir) {
+    return {::opendir(dir), ::closedir};
+}
+
+static auto openDir(std::string_view dir) {
+    return openDir(path::c_str(dir));
 }
 
 static int rmDirContent(const char* path) {
@@ -205,7 +233,7 @@
         if (entry->d_name == "."sv || entry->d_name == ".."sv) {
             continue;
         }
-        auto fullPath = android::base::StringPrintf("%s/%s", path, entry->d_name);
+        auto fullPath = base::StringPrintf("%s/%s", path, entry->d_name);
         if (entry->d_type == DT_DIR) {
             if (const auto err = rmDirContent(fullPath.c_str()); err != 0) {
                 PLOG(WARNING) << "Failed to delete " << fullPath << " content";
@@ -255,11 +283,8 @@
         runJobProcessing();
     });
 
-    mountExistingImages();
-}
-
-FileId IncrementalService::idFromMetadata(std::span<const uint8_t> metadata) {
-    return IncFs_FileIdFromMetadata({(const char*)metadata.data(), metadata.size()});
+    const auto mountedRootNames = adoptMountedInstances();
+    mountExistingImages(mountedRootNames);
 }
 
 IncrementalService::~IncrementalService() {
@@ -271,15 +296,7 @@
     mJobProcessor.join();
 }
 
-inline const char* toString(TimePoint t) {
-    using SystemClock = std::chrono::system_clock;
-    time_t time = SystemClock::to_time_t(
-            SystemClock::now() +
-            std::chrono::duration_cast<SystemClock::duration>(t - Clock::now()));
-    return std::ctime(&time);
-}
-
-inline const char* toString(IncrementalService::BindKind kind) {
+static const char* toString(IncrementalService::BindKind kind) {
     switch (kind) {
         case IncrementalService::BindKind::Temporary:
             return "Temporary";
@@ -294,47 +311,48 @@
 
     std::unique_lock l(mLock);
 
-    dprintf(fd, "Mounts (%d):\n", int(mMounts.size()));
+    dprintf(fd, "Mounts (%d): {\n", int(mMounts.size()));
     for (auto&& [id, ifs] : mMounts) {
-        const IncFsMount& mnt = *ifs.get();
-        dprintf(fd, "\t[%d]:\n", id);
-        dprintf(fd, "\t\tmountId: %d\n", mnt.mountId);
-        dprintf(fd, "\t\troot: %s\n", mnt.root.c_str());
-        dprintf(fd, "\t\tnextStorageDirNo: %d\n", mnt.nextStorageDirNo.load());
-        if (mnt.dataLoaderStub) {
-            const auto& dataLoaderStub = *mnt.dataLoaderStub;
-            dprintf(fd, "\t\tdataLoaderStatus: %d\n", dataLoaderStub.status());
-            dprintf(fd, "\t\tdataLoaderStartRequested: %s\n",
-                    dataLoaderStub.startRequested() ? "true" : "false");
-            const auto& params = dataLoaderStub.params();
-            dprintf(fd, "\t\tdataLoaderParams:\n");
-            dprintf(fd, "\t\t\ttype: %s\n", toString(params.type).c_str());
-            dprintf(fd, "\t\t\tpackageName: %s\n", params.packageName.c_str());
-            dprintf(fd, "\t\t\tclassName: %s\n", params.className.c_str());
-            dprintf(fd, "\t\t\targuments: %s\n", params.arguments.c_str());
-        }
-        dprintf(fd, "\t\tstorages (%d):\n", int(mnt.storages.size()));
-        for (auto&& [storageId, storage] : mnt.storages) {
-            dprintf(fd, "\t\t\t[%d] -> [%s]\n", storageId, storage.name.c_str());
-        }
+        const IncFsMount& mnt = *ifs;
+        dprintf(fd, "  [%d]: {\n", id);
+        if (id != mnt.mountId) {
+            dprintf(fd, "    reference to mountId: %d\n", mnt.mountId);
+        } else {
+            dprintf(fd, "    mountId: %d\n", mnt.mountId);
+            dprintf(fd, "    root: %s\n", mnt.root.c_str());
+            dprintf(fd, "    nextStorageDirNo: %d\n", mnt.nextStorageDirNo.load());
+            if (mnt.dataLoaderStub) {
+                mnt.dataLoaderStub->onDump(fd);
+            } else {
+                dprintf(fd, "    dataLoader: null\n");
+            }
+            dprintf(fd, "    storages (%d): {\n", int(mnt.storages.size()));
+            for (auto&& [storageId, storage] : mnt.storages) {
+                dprintf(fd, "      [%d] -> [%s]\n", storageId, storage.name.c_str());
+            }
+            dprintf(fd, "    }\n");
 
-        dprintf(fd, "\t\tbindPoints (%d):\n", int(mnt.bindPoints.size()));
-        for (auto&& [target, bind] : mnt.bindPoints) {
-            dprintf(fd, "\t\t\t[%s]->[%d]:\n", target.c_str(), bind.storage);
-            dprintf(fd, "\t\t\t\tsavedFilename: %s\n", bind.savedFilename.c_str());
-            dprintf(fd, "\t\t\t\tsourceDir: %s\n", bind.sourceDir.c_str());
-            dprintf(fd, "\t\t\t\tkind: %s\n", toString(bind.kind));
+            dprintf(fd, "    bindPoints (%d): {\n", int(mnt.bindPoints.size()));
+            for (auto&& [target, bind] : mnt.bindPoints) {
+                dprintf(fd, "      [%s]->[%d]:\n", target.c_str(), bind.storage);
+                dprintf(fd, "        savedFilename: %s\n", bind.savedFilename.c_str());
+                dprintf(fd, "        sourceDir: %s\n", bind.sourceDir.c_str());
+                dprintf(fd, "        kind: %s\n", toString(bind.kind));
+            }
+            dprintf(fd, "    }\n");
         }
+        dprintf(fd, "  }\n");
     }
-
-    dprintf(fd, "Sorted binds (%d):\n", int(mBindsByPath.size()));
+    dprintf(fd, "}\n");
+    dprintf(fd, "Sorted binds (%d): {\n", int(mBindsByPath.size()));
     for (auto&& [target, mountPairIt] : mBindsByPath) {
         const auto& bind = mountPairIt->second;
-        dprintf(fd, "\t\t[%s]->[%d]:\n", target.c_str(), bind.storage);
-        dprintf(fd, "\t\t\tsavedFilename: %s\n", bind.savedFilename.c_str());
-        dprintf(fd, "\t\t\tsourceDir: %s\n", bind.sourceDir.c_str());
-        dprintf(fd, "\t\t\tkind: %s\n", toString(bind.kind));
+        dprintf(fd, "    [%s]->[%d]:\n", target.c_str(), bind.storage);
+        dprintf(fd, "      savedFilename: %s\n", bind.savedFilename.c_str());
+        dprintf(fd, "      sourceDir: %s\n", bind.sourceDir.c_str());
+        dprintf(fd, "      kind: %s\n", toString(bind.kind));
     }
+    dprintf(fd, "}\n");
 }
 
 void IncrementalService::onSystemReady() {
@@ -360,12 +378,7 @@
     std::thread([this, mounts = std::move(mounts)]() {
         mJni->initializeForCurrentThread();
         for (auto&& ifs : mounts) {
-            if (ifs->dataLoaderStub->create()) {
-                LOG(INFO) << "Successfully started data loader for mount " << ifs->mountId;
-            } else {
-                // TODO(b/133435829): handle data loader start failures
-                LOG(WARNING) << "Failed to start data loader for mount " << ifs->mountId;
-            }
+            ifs->dataLoaderStub->requestStart();
         }
     }).detach();
 }
@@ -488,9 +501,9 @@
         metadata::Mount m;
         m.mutable_storage()->set_id(ifs->mountId);
         m.mutable_loader()->set_type((int)dataLoaderParams.type);
-        m.mutable_loader()->set_package_name(dataLoaderParams.packageName);
-        m.mutable_loader()->set_class_name(dataLoaderParams.className);
-        m.mutable_loader()->set_arguments(dataLoaderParams.arguments);
+        m.mutable_loader()->set_allocated_package_name(&dataLoaderParams.packageName);
+        m.mutable_loader()->set_allocated_class_name(&dataLoaderParams.className);
+        m.mutable_loader()->set_allocated_arguments(&dataLoaderParams.arguments);
         const auto metadata = m.SerializeAsString();
         m.mutable_loader()->release_arguments();
         m.mutable_loader()->release_class_name();
@@ -525,7 +538,7 @@
     mountIt->second = std::move(ifs);
     l.unlock();
 
-    if (mSystemReady.load(std::memory_order_relaxed) && !dataLoaderStub->create()) {
+    if (mSystemReady.load(std::memory_order_relaxed) && !dataLoaderStub->requestCreate()) {
         // failed to create data loader
         LOG(ERROR) << "initializeDataLoader() failed";
         deleteStorage(dataLoaderStub->id());
@@ -545,7 +558,7 @@
     }
 
     std::unique_lock l(mLock);
-    const auto& ifs = getIfsLocked(linkedStorage);
+    auto ifs = getIfsLocked(linkedStorage);
     if (!ifs) {
         LOG(ERROR) << "Ifs unavailable";
         return kInvalidStorageId;
@@ -569,6 +582,8 @@
                                 bk, l);
         err < 0) {
         LOG(ERROR) << "bindMount failed with error: " << err;
+        (void)mIncFs->unlink(ifs->control, storageIt->second.name);
+        ifs->storages.erase(storageIt);
         return kInvalidStorageId;
     }
 
@@ -578,15 +593,7 @@
 
 IncrementalService::BindPathMap::const_iterator IncrementalService::findStorageLocked(
         std::string_view path) const {
-    auto bindPointIt = mBindsByPath.upper_bound(path);
-    if (bindPointIt == mBindsByPath.begin()) {
-        return mBindsByPath.end();
-    }
-    --bindPointIt;
-    if (!path::startsWith(path, bindPointIt->first)) {
-        return mBindsByPath.end();
-    }
-    return bindPointIt;
+    return findParentPath(mBindsByPath, path);
 }
 
 StorageId IncrementalService::findStorageId(std::string_view path) const {
@@ -628,13 +635,12 @@
 }
 
 binder::Status IncrementalService::applyStorageParams(IncFsMount& ifs, bool enableReadLogs) {
-    using unique_fd = ::android::base::unique_fd;
-    ::android::os::incremental::IncrementalFileSystemControlParcel control;
-    control.cmd.reset(unique_fd(dup(ifs.control.cmd())));
-    control.pendingReads.reset(unique_fd(dup(ifs.control.pendingReads())));
+    os::incremental::IncrementalFileSystemControlParcel control;
+    control.cmd.reset(dup(ifs.control.cmd()));
+    control.pendingReads.reset(dup(ifs.control.pendingReads()));
     auto logsFd = ifs.control.logs();
     if (logsFd >= 0) {
-        control.log.reset(unique_fd(dup(logsFd)));
+        control.log.reset(dup(logsFd));
     }
 
     std::lock_guard l(mMountOperationLock);
@@ -681,38 +687,6 @@
     return findStorageId(path::normalize(pathInMount));
 }
 
-FileId IncrementalService::nodeFor(StorageId storage, std::string_view subpath) const {
-    const auto ifs = getIfs(storage);
-    if (!ifs) {
-        return kIncFsInvalidFileId;
-    }
-    std::unique_lock l(ifs->lock);
-    auto storageIt = ifs->storages.find(storage);
-    if (storageIt == ifs->storages.end()) {
-        return kIncFsInvalidFileId;
-    }
-    if (subpath.empty() || subpath == "."sv) {
-        return kIncFsInvalidFileId;
-    }
-    auto path = path::join(ifs->root, constants().mount, storageIt->second.name, subpath);
-    l.unlock();
-    return mIncFs->getFileId(ifs->control, path);
-}
-
-std::pair<FileId, std::string_view> IncrementalService::parentAndNameFor(
-        StorageId storage, std::string_view subpath) const {
-    auto name = path::basename(subpath);
-    if (name.empty()) {
-        return {kIncFsInvalidFileId, {}};
-    }
-    auto dir = path::dirname(subpath);
-    if (dir.empty() || dir == "/"sv) {
-        return {kIncFsInvalidFileId, {}};
-    }
-    auto id = nodeFor(storage, dir);
-    return {id, name};
-}
-
 IncrementalService::IfsMountPtr IncrementalService::getIfs(StorageId storage) const {
     std::lock_guard l(mLock);
     return getIfsLocked(storage);
@@ -721,7 +695,7 @@
 const IncrementalService::IfsMountPtr& IncrementalService::getIfsLocked(StorageId storage) const {
     auto it = mMounts.find(storage);
     if (it == mMounts.end()) {
-        static const android::base::NoDestructor<IfsMountPtr> kEmpty{};
+        static const base::NoDestructor<IfsMountPtr> kEmpty{};
         return *kEmpty;
     }
     return it->second;
@@ -730,21 +704,25 @@
 int IncrementalService::bind(StorageId storage, std::string_view source, std::string_view target,
                              BindKind kind) {
     if (!isValidMountTarget(target)) {
+        LOG(ERROR) << __func__ << ": not a valid bind target " << target;
         return -EINVAL;
     }
 
     const auto ifs = getIfs(storage);
     if (!ifs) {
+        LOG(ERROR) << __func__ << ": no ifs object for storage " << storage;
         return -EINVAL;
     }
 
     std::unique_lock l(ifs->lock);
     const auto storageInfo = ifs->storages.find(storage);
     if (storageInfo == ifs->storages.end()) {
+        LOG(ERROR) << "no storage";
         return -EINVAL;
     }
-    std::string normSource = normalizePathToStorageLocked(storageInfo, source);
+    std::string normSource = normalizePathToStorageLocked(*ifs, storageInfo, source);
     if (normSource.empty()) {
+        LOG(ERROR) << "invalid source path";
         return -EINVAL;
     }
     l.unlock();
@@ -796,33 +774,37 @@
 }
 
 std::string IncrementalService::normalizePathToStorageLocked(
-        IncFsMount::StorageMap::iterator storageIt, std::string_view path) {
-    std::string normPath;
-    if (path::isAbsolute(path)) {
-        normPath = path::normalize(path);
-        if (!path::startsWith(normPath, storageIt->second.name)) {
-            return {};
-        }
-    } else {
-        normPath = path::normalize(path::join(storageIt->second.name, path));
+        const IncFsMount& incfs, IncFsMount::StorageMap::const_iterator storageIt,
+        std::string_view path) const {
+    if (!path::isAbsolute(path)) {
+        return path::normalize(path::join(storageIt->second.name, path));
     }
-    return normPath;
-}
-
-std::string IncrementalService::normalizePathToStorage(const IncrementalService::IfsMountPtr& ifs,
-                                                       StorageId storage, std::string_view path) {
-    std::unique_lock l(ifs->lock);
-    const auto storageInfo = ifs->storages.find(storage);
-    if (storageInfo == ifs->storages.end()) {
+    auto normPath = path::normalize(path);
+    if (path::startsWith(normPath, storageIt->second.name)) {
+        return normPath;
+    }
+    // not that easy: need to find if any of the bind points match
+    const auto bindIt = findParentPath(incfs.bindPoints, normPath);
+    if (bindIt == incfs.bindPoints.end()) {
         return {};
     }
-    return normalizePathToStorageLocked(storageInfo, path);
+    return path::join(bindIt->second.sourceDir, path::relativize(bindIt->first, normPath));
+}
+
+std::string IncrementalService::normalizePathToStorage(const IncFsMount& ifs, StorageId storage,
+                                                       std::string_view path) const {
+    std::unique_lock l(ifs.lock);
+    const auto storageInfo = ifs.storages.find(storage);
+    if (storageInfo == ifs.storages.end()) {
+        return {};
+    }
+    return normalizePathToStorageLocked(ifs, storageInfo, path);
 }
 
 int IncrementalService::makeFile(StorageId storage, std::string_view path, int mode, FileId id,
                                  incfs::NewFileParams params) {
     if (auto ifs = getIfs(storage)) {
-        std::string normPath = normalizePathToStorage(ifs, storage, path);
+        std::string normPath = normalizePathToStorage(*ifs, storage, path);
         if (normPath.empty()) {
             LOG(ERROR) << "Internal error: storageId " << storage
                        << " failed to normalize: " << path;
@@ -840,7 +822,7 @@
 
 int IncrementalService::makeDir(StorageId storageId, std::string_view path, int mode) {
     if (auto ifs = getIfs(storageId)) {
-        std::string normPath = normalizePathToStorage(ifs, storageId, path);
+        std::string normPath = normalizePathToStorage(*ifs, storageId, path);
         if (normPath.empty()) {
             return -EINVAL;
         }
@@ -854,40 +836,41 @@
     if (!ifs) {
         return -EINVAL;
     }
+    return makeDirs(*ifs, storageId, path, mode);
+}
+
+int IncrementalService::makeDirs(const IncFsMount& ifs, StorageId storageId, std::string_view path,
+                                 int mode) {
     std::string normPath = normalizePathToStorage(ifs, storageId, path);
     if (normPath.empty()) {
         return -EINVAL;
     }
-    auto err = mIncFs->makeDir(ifs->control, normPath, mode);
-    if (err == -EEXIST) {
-        return 0;
-    } else if (err != -ENOENT) {
-        return err;
-    }
-    if (auto err = makeDirs(storageId, path::dirname(normPath), mode)) {
-        return err;
-    }
-    return mIncFs->makeDir(ifs->control, normPath, mode);
+    return mIncFs->makeDirs(ifs.control, normPath, mode);
 }
 
 int IncrementalService::link(StorageId sourceStorageId, std::string_view oldPath,
                              StorageId destStorageId, std::string_view newPath) {
-    auto ifsSrc = getIfs(sourceStorageId);
-    auto ifsDest = sourceStorageId == destStorageId ? ifsSrc : getIfs(destStorageId);
-    if (ifsSrc && ifsSrc == ifsDest) {
-        std::string normOldPath = normalizePathToStorage(ifsSrc, sourceStorageId, oldPath);
-        std::string normNewPath = normalizePathToStorage(ifsDest, destStorageId, newPath);
-        if (normOldPath.empty() || normNewPath.empty()) {
-            return -EINVAL;
-        }
-        return mIncFs->link(ifsSrc->control, normOldPath, normNewPath);
+    std::unique_lock l(mLock);
+    auto ifsSrc = getIfsLocked(sourceStorageId);
+    if (!ifsSrc) {
+        return -EINVAL;
     }
-    return -EINVAL;
+    if (sourceStorageId != destStorageId && getIfsLocked(destStorageId) != ifsSrc) {
+        return -EINVAL;
+    }
+    l.unlock();
+    std::string normOldPath = normalizePathToStorage(*ifsSrc, sourceStorageId, oldPath);
+    std::string normNewPath = normalizePathToStorage(*ifsSrc, destStorageId, newPath);
+    if (normOldPath.empty() || normNewPath.empty()) {
+        LOG(ERROR) << "Invalid paths in link(): " << normOldPath << " | " << normNewPath;
+        return -EINVAL;
+    }
+    return mIncFs->link(ifsSrc->control, normOldPath, normNewPath);
 }
 
 int IncrementalService::unlink(StorageId storage, std::string_view path) {
     if (auto ifs = getIfs(storage)) {
-        std::string normOldPath = normalizePathToStorage(ifs, storage, path);
+        std::string normOldPath = normalizePathToStorage(*ifs, storage, path);
         return mIncFs->unlink(ifs->control, normOldPath);
     }
     return -EINVAL;
@@ -898,10 +881,12 @@
                                      std::string&& target, BindKind kind,
                                      std::unique_lock<std::mutex>& mainLock) {
     if (!isValidMountTarget(target)) {
+        LOG(ERROR) << __func__ << ": invalid mount target " << target;
         return -EINVAL;
     }
 
     std::string mdFileName;
+    std::string metadataFullPath;
     if (kind != BindKind::Temporary) {
         metadata::BindPoint bp;
         bp.set_storage_id(storage);
@@ -911,17 +896,21 @@
         bp.release_dest_path();
         bp.release_source_subdir();
         mdFileName = makeBindMdName();
-        auto node =
-                mIncFs->makeFile(ifs.control, path::join(ifs.root, constants().mount, mdFileName),
-                                 0444, idFromMetadata(metadata),
-                                 {.metadata = {metadata.data(), (IncFsSize)metadata.size()}});
+        metadataFullPath = path::join(ifs.root, constants().mount, mdFileName);
+        auto node = mIncFs->makeFile(ifs.control, metadataFullPath, 0444, idFromMetadata(metadata),
+                                     {.metadata = {metadata.data(), (IncFsSize)metadata.size()}});
         if (node) {
+            LOG(ERROR) << __func__ << ": couldn't create a mount node " << mdFileName;
             return int(node);
         }
     }
 
-    return addBindMountWithMd(ifs, storage, std::move(mdFileName), std::move(source),
-                              std::move(target), kind, mainLock);
+    const auto res = addBindMountWithMd(ifs, storage, std::move(mdFileName), std::move(source),
+                                        std::move(target), kind, mainLock);
+    if (res) {
+        mIncFs->unlink(ifs.control, metadataFullPath);
+    }
+    return res;
 }
 
 int IncrementalService::addBindMountWithMd(IncrementalService::IncFsMount& ifs, StorageId storage,
@@ -946,12 +935,31 @@
         mainLock.lock();
     }
     std::lock_guard l(ifs.lock);
+    addBindMountRecordLocked(ifs, storage, std::move(metadataName), std::move(source),
+                             std::move(target), kind);
+    return 0;
+}
+
+void IncrementalService::addBindMountRecordLocked(IncFsMount& ifs, StorageId storage,
+                                                  std::string&& metadataName, std::string&& source,
+                                                  std::string&& target, BindKind kind) {
     const auto [it, _] =
             ifs.bindPoints.insert_or_assign(target,
                                             IncFsMount::Bind{storage, std::move(metadataName),
                                                              std::move(source), kind});
     mBindsByPath[std::move(target)] = it;
-    return 0;
+}
+
+RawMetadata IncrementalService::getMetadata(StorageId storage, std::string_view path) const {
+    const auto ifs = getIfs(storage);
+    if (!ifs) {
+        return {};
+    }
+    const auto normPath = normalizePathToStorage(*ifs, storage, path);
+    if (normPath.empty()) {
+        return {};
+    }
+    return mIncFs->getMetadata(ifs->control, normPath);
 }
 
 RawMetadata IncrementalService::getMetadata(StorageId storage, FileId node) const {
@@ -962,47 +970,6 @@
     return mIncFs->getMetadata(ifs->control, node);
 }
 
-std::vector<std::string> IncrementalService::listFiles(StorageId storage) const {
-    const auto ifs = getIfs(storage);
-    if (!ifs) {
-        return {};
-    }
-
-    std::unique_lock l(ifs->lock);
-    auto subdirIt = ifs->storages.find(storage);
-    if (subdirIt == ifs->storages.end()) {
-        return {};
-    }
-    auto dir = path::join(ifs->root, constants().mount, subdirIt->second.name);
-    l.unlock();
-
-    const auto prefixSize = dir.size() + 1;
-    std::vector<std::string> todoDirs{std::move(dir)};
-    std::vector<std::string> result;
-    do {
-        auto currDir = std::move(todoDirs.back());
-        todoDirs.pop_back();
-
-        auto d =
-                std::unique_ptr<DIR, decltype(&::closedir)>(::opendir(currDir.c_str()), ::closedir);
-        while (auto e = ::readdir(d.get())) {
-            if (e->d_type == DT_REG) {
-                result.emplace_back(
-                        path::join(std::string_view(currDir).substr(prefixSize), e->d_name));
-                continue;
-            }
-            if (e->d_type == DT_DIR) {
-                if (e->d_name == "."sv || e->d_name == ".."sv) {
-                    continue;
-                }
-                todoDirs.emplace_back(path::join(currDir, e->d_name));
-                continue;
-            }
-        }
-    } while (!todoDirs.empty());
-    return result;
-}
-
 bool IncrementalService::startLoading(StorageId storage) const {
     DataLoaderStubPtr dataLoaderStub;
     {
@@ -1016,19 +983,220 @@
             return false;
         }
     }
-    return dataLoaderStub->start();
+    dataLoaderStub->requestStart();
+    return true;
 }
 
-void IncrementalService::mountExistingImages() {
-    for (const auto& entry : fs::directory_iterator(mIncrementalDir)) {
-        const auto path = entry.path().u8string();
-        const auto name = entry.path().filename().u8string();
-        if (!base::StartsWith(name, constants().mountKeyPrefix)) {
+std::unordered_set<std::string_view> IncrementalService::adoptMountedInstances() {
+    std::unordered_set<std::string_view> mountedRootNames;
+    mIncFs->listExistingMounts([this, &mountedRootNames](auto root, auto backingDir, auto binds) {
+        LOG(INFO) << "Existing mount: " << backingDir << "->" << root;
+        for (auto [source, target] : binds) {
+            LOG(INFO) << "  bind: '" << source << "'->'" << target << "'";
+            LOG(INFO) << "         " << path::join(root, source);
+        }
+
+        // Ensure it's a kind of a mount that's managed by IncrementalService
+        if (path::basename(root) != constants().mount ||
+            path::basename(backingDir) != constants().backing) {
+            return;
+        }
+        const auto expectedRoot = path::dirname(root);
+        if (path::dirname(backingDir) != expectedRoot) {
+            return;
+        }
+        if (path::dirname(expectedRoot) != mIncrementalDir) {
+            return;
+        }
+        if (!path::basename(expectedRoot).starts_with(constants().mountKeyPrefix)) {
+            return;
+        }
+
+        LOG(INFO) << "Looks like an IncrementalService-owned: " << expectedRoot;
+
+        // make sure we clean up the mount if it happens to be a bad one.
+        // Note: unmounting needs to run first, so the cleanup object is created _last_.
+        auto cleanupFiles = makeCleanup([&]() {
+            LOG(INFO) << "Failed to adopt existing mount, deleting files: " << expectedRoot;
+            IncFsMount::cleanupFilesystem(expectedRoot);
+        });
+        auto cleanupMounts = makeCleanup([&]() {
+            LOG(INFO) << "Failed to adopt existing mount, cleaning up: " << expectedRoot;
+            for (auto&& [_, target] : binds) {
+                mVold->unmountIncFs(std::string(target));
+            }
+            mVold->unmountIncFs(std::string(root));
+        });
+
+        auto control = mIncFs->openMount(root);
+        if (!control) {
+            LOG(INFO) << "failed to open mount " << root;
+            return;
+        }
+
+        auto mountRecord =
+                parseFromIncfs<metadata::Mount>(mIncFs.get(), control,
+                                                path::join(root, constants().infoMdName));
+        if (!mountRecord.has_loader() || !mountRecord.has_storage()) {
+            LOG(ERROR) << "Bad mount metadata in mount at " << expectedRoot;
+            return;
+        }
+
+        auto mountId = mountRecord.storage().id();
+        mNextId = std::max(mNextId, mountId + 1);
+
+        DataLoaderParamsParcel dataLoaderParams;
+        {
+            const auto& loader = mountRecord.loader();
+            dataLoaderParams.type = (content::pm::DataLoaderType)loader.type();
+            dataLoaderParams.packageName = loader.package_name();
+            dataLoaderParams.className = loader.class_name();
+            dataLoaderParams.arguments = loader.arguments();
+        }
+
+        auto ifs = std::make_shared<IncFsMount>(std::string(expectedRoot), mountId,
+                                                std::move(control), *this);
+        cleanupFiles.release(); // ifs will take care of that now
+
+        std::vector<std::pair<std::string, metadata::BindPoint>> permanentBindPoints;
+        auto d = openDir(root);
+        while (auto e = ::readdir(d.get())) {
+            if (e->d_type == DT_REG) {
+                auto name = std::string_view(e->d_name);
+                if (name.starts_with(constants().mountpointMdPrefix)) {
+                    permanentBindPoints
+                            .emplace_back(name,
+                                          parseFromIncfs<metadata::BindPoint>(mIncFs.get(),
+                                                                              ifs->control,
+                                                                              path::join(root,
+                                                                                         name)));
+                    if (permanentBindPoints.back().second.dest_path().empty() ||
+                        permanentBindPoints.back().second.source_subdir().empty()) {
+                        permanentBindPoints.pop_back();
+                        mIncFs->unlink(ifs->control, path::join(root, name));
+                    } else {
+                        LOG(INFO) << "Permanent bind record: '"
+                                  << permanentBindPoints.back().second.source_subdir() << "'->'"
+                                  << permanentBindPoints.back().second.dest_path() << "'";
+                    }
+                }
+            } else if (e->d_type == DT_DIR) {
+                if (e->d_name == "."sv || e->d_name == ".."sv) {
+                    continue;
+                }
+                auto name = std::string_view(e->d_name);
+                if (name.starts_with(constants().storagePrefix)) {
+                    int storageId;
+                    const auto res =
+                            std::from_chars(name.data() + constants().storagePrefix.size() + 1,
+                                            name.data() + name.size(), storageId);
+                    if (res.ec != std::errc{} || *res.ptr != '_') {
+                        LOG(WARNING) << "Ignoring storage with invalid name '" << name
+                                     << "' for mount " << expectedRoot;
+                        continue;
+                    }
+                    auto [_, inserted] = mMounts.try_emplace(storageId, ifs);
+                    if (!inserted) {
+                        LOG(WARNING) << "Ignoring storage with duplicate id " << storageId
+                                     << " for mount " << expectedRoot;
+                        continue;
+                    }
+                    ifs->storages.insert_or_assign(storageId,
+                                                   IncFsMount::Storage{path::join(root, name)});
+                    mNextId = std::max(mNextId, storageId + 1);
+                }
+            }
+        }
+
+        if (ifs->storages.empty()) {
+            LOG(WARNING) << "No valid storages in mount " << root;
+            return;
+        }
+
+        // now match the mounted directories with what we expect to have in the metadata
+        {
+            std::unique_lock l(mLock, std::defer_lock);
+            for (auto&& [metadataFile, bindRecord] : permanentBindPoints) {
+                auto mountedIt = std::find_if(binds.begin(), binds.end(),
+                                              [&, bindRecord = bindRecord](auto&& bind) {
+                                                  return bind.second == bindRecord.dest_path() &&
+                                                          path::join(root, bind.first) ==
+                                                          bindRecord.source_subdir();
+                                              });
+                if (mountedIt != binds.end()) {
+                    LOG(INFO) << "Matched permanent bound " << bindRecord.source_subdir()
+                              << " to mount " << mountedIt->first;
+                    addBindMountRecordLocked(*ifs, bindRecord.storage_id(), std::move(metadataFile),
+                                             std::move(*bindRecord.mutable_source_subdir()),
+                                             std::move(*bindRecord.mutable_dest_path()),
+                                             BindKind::Permanent);
+                    if (mountedIt != binds.end() - 1) {
+                        std::iter_swap(mountedIt, binds.end() - 1);
+                    }
+                    binds = binds.first(binds.size() - 1);
+                } else {
+                    LOG(INFO) << "Didn't match permanent bound " << bindRecord.source_subdir()
+                              << ", mounting";
+                    // doesn't exist - try mounting back
+                    if (addBindMountWithMd(*ifs, bindRecord.storage_id(), std::move(metadataFile),
+                                           std::move(*bindRecord.mutable_source_subdir()),
+                                           std::move(*bindRecord.mutable_dest_path()),
+                                           BindKind::Permanent, l)) {
+                        mIncFs->unlink(ifs->control, metadataFile);
+                    }
+                }
+            }
+        }
+
+        // if anything stays in |binds| those are probably temporary binds; system restarted since
+        // they were mounted - so let's unmount them all.
+        for (auto&& [source, target] : binds) {
+            if (source.empty()) {
+                continue;
+            }
+            mVold->unmountIncFs(std::string(target));
+        }
+        cleanupMounts.release(); // ifs now manages everything
+
+        if (ifs->bindPoints.empty()) {
+            LOG(WARNING) << "No valid bind points for mount " << expectedRoot;
+            deleteStorage(*ifs);
+            return;
+        }
+
+        prepareDataLoaderLocked(*ifs, std::move(dataLoaderParams));
+        CHECK(ifs->dataLoaderStub);
+
+        mountedRootNames.insert(path::basename(ifs->root));
+
+        // not locking here at all: we're still in the constructor, no other calls can happen
+        mMounts[ifs->mountId] = std::move(ifs);
+    });
+
+    return mountedRootNames;
+}
+
+void IncrementalService::mountExistingImages(
+        const std::unordered_set<std::string_view>& mountedRootNames) {
+    auto dir = openDir(mIncrementalDir);
+    if (!dir) {
+        PLOG(WARNING) << "Couldn't open the root incremental dir " << mIncrementalDir;
+        return;
+    }
+    while (auto entry = ::readdir(dir.get())) {
+        if (entry->d_type != DT_DIR) {
+            continue;
+        }
+        std::string_view name = entry->d_name;
+        if (!name.starts_with(constants().mountKeyPrefix)) {
+            continue;
+        }
+        if (mountedRootNames.find(name) != mountedRootNames.end()) {
             continue;
         }
         const auto root = path::join(mIncrementalDir, name);
         if (!mountExistingImage(root)) {
-            IncFsMount::cleanupFilesystem(path);
+            IncFsMount::cleanupFilesystem(root);
         }
     }
 }
@@ -1065,7 +1233,7 @@
     DataLoaderParamsParcel dataLoaderParams;
     {
         const auto& loader = mount.loader();
-        dataLoaderParams.type = (android::content::pm::DataLoaderType)loader.type();
+        dataLoaderParams.type = (content::pm::DataLoaderType)loader.type();
         dataLoaderParams.packageName = loader.package_name();
         dataLoaderParams.className = loader.class_name();
         dataLoaderParams.arguments = loader.arguments();
@@ -1075,7 +1243,7 @@
     CHECK(ifs->dataLoaderStub);
 
     std::vector<std::pair<std::string, metadata::BindPoint>> bindPoints;
-    auto d = openDir(path::c_str(mountTarget));
+    auto d = openDir(mountTarget);
     while (auto e = ::readdir(d.get())) {
         if (e->d_type == DT_REG) {
             auto name = std::string_view(e->d_name);
@@ -1125,12 +1293,14 @@
     }
 
     int bindCount = 0;
-    for (auto&& bp : bindPoints) {
+    {
         std::unique_lock l(mLock, std::defer_lock);
-        bindCount += !addBindMountWithMd(*ifs, bp.second.storage_id(), std::move(bp.first),
-                                         std::move(*bp.second.mutable_source_subdir()),
-                                         std::move(*bp.second.mutable_dest_path()),
-                                         BindKind::Permanent, l);
+        for (auto&& bp : bindPoints) {
+            bindCount += !addBindMountWithMd(*ifs, bp.second.storage_id(), std::move(bp.first),
+                                             std::move(*bp.second.mutable_source_subdir()),
+                                             std::move(*bp.second.mutable_dest_path()),
+                                             BindKind::Permanent, l);
+        }
     }
 
     if (bindCount == 0) {
@@ -1139,30 +1309,35 @@
         return false;
     }
 
+    // not locking here at all: we're still in the constructor, no other calls can happen
     mMounts[ifs->mountId] = std::move(ifs);
     return true;
 }
 
 IncrementalService::DataLoaderStubPtr IncrementalService::prepareDataLoader(
-        IncrementalService::IncFsMount& ifs, DataLoaderParamsParcel&& params,
+        IncFsMount& ifs, DataLoaderParamsParcel&& params,
         const DataLoaderStatusListener* externalListener) {
     std::unique_lock l(ifs.lock);
+    prepareDataLoaderLocked(ifs, std::move(params), externalListener);
+    return ifs.dataLoaderStub;
+}
+
+void IncrementalService::prepareDataLoaderLocked(IncFsMount& ifs, DataLoaderParamsParcel&& params,
+                                                 const DataLoaderStatusListener* externalListener) {
     if (ifs.dataLoaderStub) {
         LOG(INFO) << "Skipped data loader preparation because it already exists";
-        return ifs.dataLoaderStub;
+        return;
     }
 
     FileSystemControlParcel fsControlParcel;
     fsControlParcel.incremental = aidl::make_nullable<IncrementalFileSystemControlParcel>();
-    fsControlParcel.incremental->cmd.reset(base::unique_fd(::dup(ifs.control.cmd())));
-    fsControlParcel.incremental->pendingReads.reset(
-            base::unique_fd(::dup(ifs.control.pendingReads())));
-    fsControlParcel.incremental->log.reset(base::unique_fd(::dup(ifs.control.logs())));
+    fsControlParcel.incremental->cmd.reset(dup(ifs.control.cmd()));
+    fsControlParcel.incremental->pendingReads.reset(dup(ifs.control.pendingReads()));
+    fsControlParcel.incremental->log.reset(dup(ifs.control.logs()));
     fsControlParcel.service = new IncrementalServiceConnector(*this, ifs.mountId);
 
     ifs.dataLoaderStub = new DataLoaderStub(*this, ifs.mountId, std::move(params),
                                             std::move(fsControlParcel), externalListener);
-    return ifs.dataLoaderStub;
 }
 
 template <class Duration>
@@ -1183,7 +1358,7 @@
     }
 
     // First prepare target directories if they don't exist yet
-    if (auto res = makeDirs(storage, libDirRelativePath, 0755)) {
+    if (auto res = makeDirs(*ifs, storage, libDirRelativePath, 0755)) {
         LOG(ERROR) << "Failed to prepare target lib directory " << libDirRelativePath
                    << " errno: " << res;
         return false;
@@ -1220,11 +1395,11 @@
         auto startFileTs = Clock::now();
 
         const auto libName = path::basename(fileName);
-        const auto targetLibPath = path::join(libDirRelativePath, libName);
-        const auto targetLibPathAbsolute = normalizePathToStorage(ifs, storage, targetLibPath);
+        auto targetLibPath = path::join(libDirRelativePath, libName);
+        const auto targetLibPathAbsolute = normalizePathToStorage(*ifs, storage, targetLibPath);
         // If the extract file already exists, skip
         if (access(targetLibPathAbsolute.c_str(), F_OK) == 0) {
-            if (sEnablePerfLogging) {
+            if (perfLoggingEnabled()) {
                 LOG(INFO) << "incfs: Native lib file already exists: " << targetLibPath
                           << "; skipping extraction, spent "
                           << elapsedMcs(startFileTs, Clock::now()) << "mcs";
@@ -1251,7 +1426,7 @@
 
         // If it is a zero-byte file, skip data writing
         if (entry.uncompressed_length == 0) {
-            if (sEnablePerfLogging) {
+            if (perfLoggingEnabled()) {
                 LOG(INFO) << "incfs: Extracted " << libName
                           << "(0 bytes): " << elapsedMcs(startFileTs, makeFileTs) << "mcs";
             }
@@ -1264,7 +1439,7 @@
             extractZipFile(ifs.lock(), zipFile.get(), entry, libFileId, libPath, makeFileTs);
         });
 
-        if (sEnablePerfLogging) {
+        if (perfLoggingEnabled()) {
             auto prepareJobTs = Clock::now();
             LOG(INFO) << "incfs: Processed " << libName << ": "
                       << elapsedMcs(startFileTs, prepareJobTs)
@@ -1291,7 +1466,7 @@
         mJobCondition.notify_all();
     }
 
-    if (sEnablePerfLogging) {
+    if (perfLoggingEnabled()) {
         auto end = Clock::now();
         LOG(INFO) << "incfs: configureNativeBinaries complete in " << elapsedMcs(start, end)
                   << "mcs, make dirs: " << elapsedMcs(start, mkDirsTs)
@@ -1337,13 +1512,13 @@
     std::vector<IncFsDataBlock> instructions(numBlocks);
     auto remainingData = std::span(libData.get(), entry.uncompressed_length);
     for (int i = 0; i < numBlocks; i++) {
-        const auto blockSize = std::min<uint16_t>(constants().blockSize, remainingData.size());
+        const auto blockSize = std::min<long>(constants().blockSize, remainingData.size());
         instructions[i] = IncFsDataBlock{
                 .fileFd = writeFd.get(),
                 .pageIndex = static_cast<IncFsBlockIndex>(i),
                 .compression = INCFS_COMPRESSION_KIND_NONE,
                 .kind = INCFS_BLOCK_KIND_DATA,
-                .dataSize = blockSize,
+                .dataSize = static_cast<uint32_t>(blockSize),
                 .data = reinterpret_cast<const char*>(remainingData.data()),
         };
         remainingData = remainingData.subspan(blockSize);
@@ -1356,7 +1531,7 @@
         return;
     }
 
-    if (sEnablePerfLogging) {
+    if (perfLoggingEnabled()) {
         auto endFileTs = Clock::now();
         LOG(INFO) << "incfs: Extracted " << libName << "(" << entry.compressed_length << " -> "
                   << entry.uncompressed_length << " bytes): " << elapsedMcs(startedTs, endFileTs)
@@ -1372,7 +1547,7 @@
     struct WaitPrinter {
         const Clock::time_point startTs = Clock::now();
         ~WaitPrinter() noexcept {
-            if (sEnablePerfLogging) {
+            if (perfLoggingEnabled()) {
                 const auto endTs = Clock::now();
                 LOG(INFO) << "incfs: waitForNativeBinariesExtraction() complete in "
                           << elapsedMcs(startTs, endTs) << "mcs";
@@ -1397,6 +1572,11 @@
     return mRunning;
 }
 
+bool IncrementalService::perfLoggingEnabled() {
+    static const bool enabled = base::GetBoolProperty("incremental.perflogging", false);
+    return enabled;
+}
+
 void IncrementalService::runJobProcessing() {
     for (;;) {
         std::unique_lock lock(mJobMutex);
@@ -1474,111 +1654,210 @@
     }
 }
 
-IncrementalService::DataLoaderStub::~DataLoaderStub() {
-    CHECK(mStatus == -1 || mStatus == IDataLoaderStatusListener::DATA_LOADER_DESTROYED)
-            << "Dataloader has to be destroyed prior to destructor: " << mId
-            << ", status: " << mStatus;
+IncrementalService::DataLoaderStub::DataLoaderStub(IncrementalService& service, MountId id,
+                                                   DataLoaderParamsParcel&& params,
+                                                   FileSystemControlParcel&& control,
+                                                   const DataLoaderStatusListener* externalListener)
+      : mService(service),
+        mId(id),
+        mParams(std::move(params)),
+        mControl(std::move(control)),
+        mListener(externalListener ? *externalListener : DataLoaderStatusListener()) {
+}
+
+IncrementalService::DataLoaderStub::~DataLoaderStub() = default;
+
+void IncrementalService::DataLoaderStub::cleanupResources() {
+    requestDestroy();
+    mParams = {};
+    mControl = {};
+    waitForStatus(IDataLoaderStatusListener::DATA_LOADER_DESTROYED, std::chrono::seconds(60));
+    mListener = {};
+    mId = kInvalidStorageId;
+}
+
+bool IncrementalService::DataLoaderStub::requestCreate() {
+    return setTargetStatus(IDataLoaderStatusListener::DATA_LOADER_CREATED);
+}
+
+bool IncrementalService::DataLoaderStub::requestStart() {
+    return setTargetStatus(IDataLoaderStatusListener::DATA_LOADER_STARTED);
+}
+
+bool IncrementalService::DataLoaderStub::requestDestroy() {
+    return setTargetStatus(IDataLoaderStatusListener::DATA_LOADER_DESTROYED);
+}
+
+bool IncrementalService::DataLoaderStub::setTargetStatus(int newStatus) {
+    int oldStatus, curStatus;
+    {
+        std::unique_lock lock(mStatusMutex);
+        oldStatus = mTargetStatus;
+        mTargetStatus = newStatus;
+        mTargetStatusTs = Clock::now();
+        curStatus = mCurrentStatus;
+    }
+    LOG(DEBUG) << "Target status update for DataLoader " << mId << ": " << oldStatus << " -> "
+               << newStatus << " (current " << curStatus << ")";
+    return fsmStep();
+}
+
+bool IncrementalService::DataLoaderStub::waitForStatus(int status, Clock::duration duration) {
+    auto now = Clock::now();
+    std::unique_lock lock(mStatusMutex);
+    return mStatusCondition.wait_until(lock, now + duration,
+                                       [this, status] { return mCurrentStatus == status; });
+}
+
+bool IncrementalService::DataLoaderStub::bind() {
+    bool result = false;
+    auto status = mService.mDataLoaderManager->bindToDataLoader(mId, mParams, this, &result);
+    if (!status.isOk() || !result) {
+        LOG(ERROR) << "Failed to bind a data loader for mount " << mId;
+        return false;
+    }
+    return true;
 }
 
 bool IncrementalService::DataLoaderStub::create() {
-    bool created = false;
-    auto status = mService.mDataLoaderManager->initializeDataLoader(mId, mParams, mControl, this,
-                                                                    &created);
-    if (!status.isOk() || !created) {
-        LOG(ERROR) << "Failed to create a data loader for mount " << mId;
+    sp<IDataLoader> dataloader;
+    auto status = mService.mDataLoaderManager->getDataLoader(mId, &dataloader);
+    if (!status.isOk()) {
+        LOG(ERROR) << "Failed to get dataloader: " << status.toString8();
+        return false;
+    }
+    if (!dataloader) {
+        LOG(ERROR) << "DataLoader is null: " << status.toString8();
+        return false;
+    }
+    status = dataloader->create(mId, mParams, mControl, this);
+    if (!status.isOk()) {
+        LOG(ERROR) << "Failed to start DataLoader: " << status.toString8();
         return false;
     }
     return true;
 }
 
 bool IncrementalService::DataLoaderStub::start() {
-    if (mStatus != IDataLoaderStatusListener::DATA_LOADER_CREATED) {
-        mStartRequested = true;
-        return true;
-    }
-
     sp<IDataLoader> dataloader;
     auto status = mService.mDataLoaderManager->getDataLoader(mId, &dataloader);
     if (!status.isOk()) {
+        LOG(ERROR) << "Failed to get dataloader: " << status.toString8();
         return false;
     }
     if (!dataloader) {
+        LOG(ERROR) << "DataLoader is null: " << status.toString8();
         return false;
     }
     status = dataloader->start(mId);
     if (!status.isOk()) {
+        LOG(ERROR) << "Failed to start DataLoader: " << status.toString8();
         return false;
     }
     return true;
 }
 
-void IncrementalService::DataLoaderStub::destroy() {
-    mDestroyRequested = true;
-    mService.mDataLoaderManager->destroyDataLoader(mId);
+bool IncrementalService::DataLoaderStub::destroy() {
+    mService.mDataLoaderManager->unbindFromDataLoader(mId);
+    return true;
+}
+
+bool IncrementalService::DataLoaderStub::fsmStep() {
+    if (!isValid()) {
+        return false;
+    }
+
+    int currentStatus;
+    int targetStatus;
+    {
+        std::unique_lock lock(mStatusMutex);
+        currentStatus = mCurrentStatus;
+        targetStatus = mTargetStatus;
+    }
+
+    if (currentStatus == targetStatus) {
+        return true;
+    }
+
+    switch (targetStatus) {
+        case IDataLoaderStatusListener::DATA_LOADER_DESTROYED: {
+            return destroy();
+        }
+        case IDataLoaderStatusListener::DATA_LOADER_STARTED: {
+            switch (currentStatus) {
+                case IDataLoaderStatusListener::DATA_LOADER_CREATED:
+                case IDataLoaderStatusListener::DATA_LOADER_STOPPED:
+                    return start();
+            }
+            // fallthrough
+        }
+        case IDataLoaderStatusListener::DATA_LOADER_CREATED:
+            switch (currentStatus) {
+                case IDataLoaderStatusListener::DATA_LOADER_DESTROYED:
+                    return bind();
+                case IDataLoaderStatusListener::DATA_LOADER_BOUND:
+                    return create();
+            }
+            break;
+        default:
+            LOG(ERROR) << "Invalid target status: " << targetStatus
+                       << ", current status: " << currentStatus;
+            break;
+    }
+    return false;
 }
 
 binder::Status IncrementalService::DataLoaderStub::onStatusChanged(MountId mountId, int newStatus) {
-    if (mStatus == newStatus) {
-        return binder::Status::ok();
+    if (!isValid()) {
+        return binder::Status::
+                fromServiceSpecificError(-EINVAL, "onStatusChange came to invalid DataLoaderStub");
+    }
+    if (mId != mountId) {
+        LOG(ERROR) << "Mount ID mismatch: expected " << mId << ", but got: " << mountId;
+        return binder::Status::fromServiceSpecificError(-EPERM, "Mount ID mismatch.");
     }
 
+    int targetStatus, oldStatus;
+    {
+        std::unique_lock lock(mStatusMutex);
+        if (mCurrentStatus == newStatus) {
+            return binder::Status::ok();
+        }
+        mCurrentStatus = newStatus;
+        oldStatus = mCurrentStatus;
+        targetStatus = mTargetStatus;
+    }
+
+    LOG(DEBUG) << "Current status update for DataLoader " << mId << ": " << oldStatus << " -> "
+               << newStatus << " (target " << targetStatus << ")";
+
     if (mListener) {
-        // Give an external listener a chance to act before we destroy something.
         mListener->onStatusChanged(mountId, newStatus);
     }
 
-    {
-        std::unique_lock l(mService.mLock);
-        const auto& ifs = mService.getIfsLocked(mountId);
-        if (!ifs) {
-            LOG(WARNING) << "Received data loader status " << int(newStatus)
-                         << " for unknown mount " << mountId;
-            return binder::Status::ok();
-        }
-        mStatus = newStatus;
+    fsmStep();
 
-        if (!mDestroyRequested && newStatus == IDataLoaderStatusListener::DATA_LOADER_DESTROYED) {
-            mService.deleteStorageLocked(*ifs, std::move(l));
-            return binder::Status::ok();
-        }
-    }
-
-    switch (newStatus) {
-        case IDataLoaderStatusListener::DATA_LOADER_CREATED: {
-            if (mStartRequested) {
-                start();
-            }
-            break;
-        }
-        case IDataLoaderStatusListener::DATA_LOADER_DESTROYED: {
-            break;
-        }
-        case IDataLoaderStatusListener::DATA_LOADER_STARTED: {
-            break;
-        }
-        case IDataLoaderStatusListener::DATA_LOADER_STOPPED: {
-            break;
-        }
-        case IDataLoaderStatusListener::DATA_LOADER_IMAGE_READY: {
-            break;
-        }
-        case IDataLoaderStatusListener::DATA_LOADER_IMAGE_NOT_READY: {
-            break;
-        }
-        case IDataLoaderStatusListener::DATA_LOADER_UNRECOVERABLE: {
-            // Nothing for now. Rely on externalListener to handle this.
-            break;
-        }
-        default: {
-            LOG(WARNING) << "Unknown data loader status: " << newStatus
-                         << " for mount: " << mountId;
-            break;
-        }
-    }
+    mStatusCondition.notify_all();
 
     return binder::Status::ok();
 }
 
+void IncrementalService::DataLoaderStub::onDump(int fd) {
+    dprintf(fd, "    dataLoader: {\n");
+    dprintf(fd, "      currentStatus: %d\n", mCurrentStatus);
+    dprintf(fd, "      targetStatus: %d\n", mTargetStatus);
+    dprintf(fd, "      targetStatusTs: %lldmcs\n",
+            (long long)(elapsedMcs(mTargetStatusTs, Clock::now())));
+    const auto& params = mParams;
+    dprintf(fd, "      dataLoaderParams: {\n");
+    dprintf(fd, "        type: %s\n", toString(params.type).c_str());
+    dprintf(fd, "        packageName: %s\n", params.packageName.c_str());
+    dprintf(fd, "        className: %s\n", params.className.c_str());
+    dprintf(fd, "        arguments: %s\n", params.arguments.c_str());
+    dprintf(fd, "      }\n");
+    dprintf(fd, "    }\n");
+}
+
 void IncrementalService::AppOpsListener::opChanged(int32_t, const String16&) {
     incrementalService.onAppOpChanged(packageName);
 }
@@ -1589,4 +1868,8 @@
     return binder::Status::ok();
 }
 
+FileId IncrementalService::idFromMetadata(std::span<const uint8_t> metadata) {
+    return IncFs_FileIdFromMetadata({(const char*)metadata.data(), metadata.size()});
+}
+
 } // namespace android::incremental
diff --git a/services/incremental/IncrementalService.h b/services/incremental/IncrementalService.h
index c016bab..1de0070 100644
--- a/services/incremental/IncrementalService.h
+++ b/services/incremental/IncrementalService.h
@@ -16,13 +16,13 @@
 
 #pragma once
 
-#include <android-base/strings.h>
-#include <android-base/unique_fd.h>
+#include <android/content/pm/BnDataLoaderStatusListener.h>
 #include <android/content/pm/DataLoaderParamsParcel.h>
-#include <binder/IServiceManager.h>
+#include <android/content/pm/IDataLoaderStatusListener.h>
+#include <android/os/incremental/BnIncrementalServiceConnector.h>
+#include <binder/IAppOpsCallback.h>
 #include <utils/String16.h>
 #include <utils/StrongPointer.h>
-#include <utils/Vector.h>
 #include <ziparchive/zip_archive.h>
 
 #include <atomic>
@@ -37,21 +37,14 @@
 #include <string_view>
 #include <thread>
 #include <unordered_map>
+#include <unordered_set>
 #include <utility>
 #include <vector>
 
 #include "ServiceWrappers.h"
-#include "android/content/pm/BnDataLoaderStatusListener.h"
-#include "android/os/incremental/BnIncrementalServiceConnector.h"
 #include "incfs.h"
 #include "path.h"
 
-using namespace android::os::incremental;
-
-namespace android::os {
-class IVold;
-}
-
 namespace android::incremental {
 
 using MountId = int;
@@ -101,17 +94,14 @@
 
     void onSystemReady();
 
-    StorageId createStorage(std::string_view mountPoint, DataLoaderParamsParcel&& dataLoaderParams,
+    StorageId createStorage(std::string_view mountPoint,
+                            content::pm::DataLoaderParamsParcel&& dataLoaderParams,
                             const DataLoaderStatusListener& dataLoaderStatusListener,
                             CreateOptions options = CreateOptions::Default);
     StorageId createLinkedStorage(std::string_view mountPoint, StorageId linkedStorage,
                                   CreateOptions options = CreateOptions::Default);
     StorageId openStorage(std::string_view path);
 
-    FileId nodeFor(StorageId storage, std::string_view path) const;
-    std::pair<FileId, std::string_view> parentAndNameFor(StorageId storage,
-                                                         std::string_view path) const;
-
     int bind(StorageId storage, std::string_view source, std::string_view target, BindKind kind);
     int unbind(StorageId storage, std::string_view target);
     void deleteStorage(StorageId storage);
@@ -131,9 +121,9 @@
         return false;
     }
 
+    RawMetadata getMetadata(StorageId storage, std::string_view path) const;
     RawMetadata getMetadata(StorageId storage, FileId node) const;
 
-    std::vector<std::string> listFiles(StorageId storage) const;
     bool startLoading(StorageId storage) const;
 
     bool configureNativeBinaries(StorageId storage, std::string_view apkFullPath,
@@ -151,7 +141,7 @@
         const std::string packageName;
     };
 
-    class IncrementalServiceConnector : public BnIncrementalServiceConnector {
+    class IncrementalServiceConnector : public os::incremental::BnIncrementalServiceConnector {
     public:
         IncrementalServiceConnector(IncrementalService& incrementalService, int32_t storage)
               : incrementalService(incrementalService), storage(storage) {}
@@ -163,44 +153,54 @@
     };
 
 private:
-    static const bool sEnablePerfLogging;
-
     struct IncFsMount;
 
-    class DataLoaderStub : public android::content::pm::BnDataLoaderStatusListener {
+    class DataLoaderStub : public content::pm::BnDataLoaderStatusListener {
     public:
-        DataLoaderStub(IncrementalService& service, MountId id, DataLoaderParamsParcel&& params,
-                       FileSystemControlParcel&& control,
-                       const DataLoaderStatusListener* externalListener)
-              : mService(service),
-                mId(id),
-                mParams(std::move(params)),
-                mControl(std::move(control)),
-                mListener(externalListener ? *externalListener : DataLoaderStatusListener()) {}
+        DataLoaderStub(IncrementalService& service, MountId id,
+                       content::pm::DataLoaderParamsParcel&& params,
+                       content::pm::FileSystemControlParcel&& control,
+                       const DataLoaderStatusListener* externalListener);
         ~DataLoaderStub();
+        // Cleans up the internal state and invalidates DataLoaderStub. Any subsequent calls will
+        // result in an error.
+        void cleanupResources();
 
-        bool create();
-        bool start();
-        void destroy();
+        bool requestCreate();
+        bool requestStart();
+        bool requestDestroy();
 
-        // accessors
+        void onDump(int fd);
+
         MountId id() const { return mId; }
-        const DataLoaderParamsParcel& params() const { return mParams; }
-        int status() const { return mStatus.load(); }
-        bool startRequested() const { return mStartRequested; }
+        const content::pm::DataLoaderParamsParcel& params() const { return mParams; }
 
     private:
         binder::Status onStatusChanged(MountId mount, int newStatus) final;
 
-        IncrementalService& mService;
-        MountId const mId;
-        DataLoaderParamsParcel const mParams;
-        FileSystemControlParcel const mControl;
-        DataLoaderStatusListener const mListener;
+        bool isValid() const { return mId != kInvalidStorageId; }
 
-        std::atomic<int> mStatus = -1;
-        bool mStartRequested = false;
-        bool mDestroyRequested = false;
+        bool bind();
+        bool create();
+        bool start();
+        bool destroy();
+
+        bool setTargetStatus(int status);
+        bool waitForStatus(int status, Clock::duration duration);
+
+        bool fsmStep();
+
+        IncrementalService& mService;
+        MountId mId = kInvalidStorageId;
+        content::pm::DataLoaderParamsParcel mParams;
+        content::pm::FileSystemControlParcel mControl;
+        DataLoaderStatusListener mListener;
+
+        std::mutex mStatusMutex;
+        std::condition_variable mStatusCondition;
+        int mCurrentStatus = content::pm::IDataLoaderStatusListener::DATA_LOADER_DESTROYED;
+        int mTargetStatus = content::pm::IDataLoaderStatusListener::DATA_LOADER_DESTROYED;
+        TimePoint mTargetStatusTs = {};
     };
     using DataLoaderStubPtr = sp<DataLoaderStub>;
 
@@ -218,7 +218,7 @@
 
         using Control = incfs::UniqueControl;
 
-        using BindMap = std::map<std::string, Bind>;
+        using BindMap = std::map<std::string, Bind, path::PathLess>;
         using StorageMap = std::unordered_map<StorageId, Storage>;
 
         mutable std::mutex lock;
@@ -250,7 +250,10 @@
     using MountMap = std::unordered_map<MountId, IfsMountPtr>;
     using BindPathMap = std::map<std::string, IncFsMount::BindMap::iterator, path::PathLess>;
 
-    void mountExistingImages();
+    static bool perfLoggingEnabled();
+
+    std::unordered_set<std::string_view> adoptMountedInstances();
+    void mountExistingImages(const std::unordered_set<std::string_view>& mountedRootNames);
     bool mountExistingImage(std::string_view root);
 
     IfsMountPtr getIfs(StorageId storage) const;
@@ -263,8 +266,14 @@
                            std::string&& source, std::string&& target, BindKind kind,
                            std::unique_lock<std::mutex>& mainLock);
 
-    DataLoaderStubPtr prepareDataLoader(IncFsMount& ifs, DataLoaderParamsParcel&& params,
+    void addBindMountRecordLocked(IncFsMount& ifs, StorageId storage, std::string&& metadataName,
+                                  std::string&& source, std::string&& target, BindKind kind);
+
+    DataLoaderStubPtr prepareDataLoader(IncFsMount& ifs,
+                                        content::pm::DataLoaderParamsParcel&& params,
                                         const DataLoaderStatusListener* externalListener = nullptr);
+    void prepareDataLoaderLocked(IncFsMount& ifs, content::pm::DataLoaderParamsParcel&& params,
+                                 const DataLoaderStatusListener* externalListener = nullptr);
 
     BindPathMap::const_iterator findStorageLocked(std::string_view path) const;
     StorageId findStorageId(std::string_view path) const;
@@ -272,11 +281,12 @@
     void deleteStorage(IncFsMount& ifs);
     void deleteStorageLocked(IncFsMount& ifs, std::unique_lock<std::mutex>&& ifsLock);
     MountMap::iterator getStorageSlotLocked();
-    std::string normalizePathToStorage(const IfsMountPtr& incfs, StorageId storage,
-                                       std::string_view path);
-    std::string normalizePathToStorageLocked(IncFsMount::StorageMap::iterator storageIt,
-                                             std::string_view path);
-
+    std::string normalizePathToStorage(const IncFsMount& incfs, StorageId storage,
+                                       std::string_view path) const;
+    std::string normalizePathToStorageLocked(const IncFsMount& incfs,
+                                             IncFsMount::StorageMap::const_iterator storageIt,
+                                             std::string_view path) const;
+    int makeDirs(const IncFsMount& ifs, StorageId storageId, std::string_view path, int mode);
     binder::Status applyStorageParams(IncFsMount& ifs, bool enableReadLogs);
 
     void registerAppOpsCallback(const std::string& packageName);
diff --git a/services/incremental/IncrementalServiceValidation.cpp b/services/incremental/IncrementalServiceValidation.cpp
new file mode 100644
index 0000000..abadbbf
--- /dev/null
+++ b/services/incremental/IncrementalServiceValidation.cpp
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "IncrementalServiceValidation.h"
+
+#include <android-base/stringprintf.h>
+#include <binder/IPCThreadState.h>
+#include <binder/PermissionCache.h>
+#include <binder/PermissionController.h>
+#include <errno.h>
+#include <utils/String16.h>
+
+namespace android::incremental {
+
+binder::Status Ok() {
+    return binder::Status::ok();
+}
+
+binder::Status Exception(uint32_t code, const std::string& msg) {
+    return binder::Status::fromExceptionCode(code, String8(msg.c_str()));
+}
+
+int fromBinderStatus(const binder::Status& status) {
+    return status.exceptionCode() == binder::Status::EX_SERVICE_SPECIFIC
+            ? status.serviceSpecificErrorCode() > 0
+                    ? -status.serviceSpecificErrorCode()
+                    : status.serviceSpecificErrorCode() == 0 ? -EFAULT
+                                                             : status.serviceSpecificErrorCode()
+            : -EIO;
+}
+
+binder::Status CheckPermissionForDataDelivery(const char* permission, const char* operation,
+                                              const char* package) {
+    using android::base::StringPrintf;
+
+    int32_t pid;
+    int32_t uid;
+
+    if (!PermissionCache::checkCallingPermission(String16(permission), &pid, &uid)) {
+        return Exception(binder::Status::EX_SECURITY,
+                         StringPrintf("UID %d / PID %d lacks permission %s", uid, pid, permission));
+    }
+
+    String16 packageName{package};
+
+    // Caller must also have op granted.
+    PermissionController pc;
+    if (auto packageUid = pc.getPackageUid(packageName, 0); packageUid != uid) {
+        return Exception(binder::Status::EX_SECURITY,
+                         StringPrintf("UID %d / PID %d does not own package %s", uid, pid,
+                                      package));
+    }
+    switch (auto result = pc.noteOp(String16(operation), uid, packageName); result) {
+        case PermissionController::MODE_ALLOWED:
+        case PermissionController::MODE_DEFAULT:
+            return binder::Status::ok();
+        default:
+            return Exception(binder::Status::EX_SECURITY,
+                             StringPrintf("UID %d / PID %d / package %s lacks app-op %s, error %d",
+                                          uid, pid, package, operation, result));
+    }
+}
+
+} // namespace android::incremental
diff --git a/services/incremental/IncrementalServiceValidation.h b/services/incremental/IncrementalServiceValidation.h
index 48894c6..0e50c4d 100644
--- a/services/incremental/IncrementalServiceValidation.h
+++ b/services/incremental/IncrementalServiceValidation.h
@@ -16,61 +16,17 @@
 
 #pragma once
 
-#include <android-base/stringprintf.h>
-#include <binder/IPCThreadState.h>
-#include <binder/PermissionCache.h>
-#include <binder/PermissionController.h>
 #include <binder/Status.h>
+#include <stdint.h>
+
+#include <string>
 
 namespace android::incremental {
 
-inline binder::Status Ok() {
-    return binder::Status::ok();
-}
-
-inline binder::Status Exception(uint32_t code, const std::string& msg) {
-    return binder::Status::fromExceptionCode(code, String8(msg.c_str()));
-}
-
-inline int fromBinderStatus(const binder::Status& status) {
-    return status.exceptionCode() == binder::Status::EX_SERVICE_SPECIFIC
-            ? status.serviceSpecificErrorCode() > 0 ? -status.serviceSpecificErrorCode()
-                                                    : status.serviceSpecificErrorCode() == 0
-                            ? -EFAULT
-                            : status.serviceSpecificErrorCode()
-            : -EIO;
-}
-
-inline binder::Status CheckPermissionForDataDelivery(const char* permission, const char* operation,
-                                                     const char* package) {
-    using android::base::StringPrintf;
-
-    int32_t pid;
-    int32_t uid;
-
-    if (!PermissionCache::checkCallingPermission(String16(permission), &pid, &uid)) {
-        return Exception(binder::Status::EX_SECURITY,
-                         StringPrintf("UID %d / PID %d lacks permission %s", uid, pid, permission));
-    }
-
-    String16 packageName{package};
-
-    // Caller must also have op granted.
-    PermissionController pc;
-    if (auto packageUid = pc.getPackageUid(packageName, 0); packageUid != uid) {
-        return Exception(binder::Status::EX_SECURITY,
-                         StringPrintf("UID %d / PID %d does not own package %s", uid, pid,
-                                      package));
-    }
-    switch (auto result = pc.noteOp(String16(operation), uid, packageName); result) {
-        case PermissionController::MODE_ALLOWED:
-        case PermissionController::MODE_DEFAULT:
-            return binder::Status::ok();
-        default:
-            return Exception(binder::Status::EX_SECURITY,
-                             StringPrintf("UID %d / PID %d / package %s lacks app-op %s, error %d",
-                                          uid, pid, package, operation, result));
-    }
-}
+binder::Status Ok();
+binder::Status Exception(uint32_t code, const std::string& msg);
+int fromBinderStatus(const binder::Status& status);
+binder::Status CheckPermissionForDataDelivery(const char* permission, const char* operation,
+                                              const char* package);
 
 } // namespace android::incremental
diff --git a/services/incremental/ServiceWrappers.cpp b/services/incremental/ServiceWrappers.cpp
index bf8e696..85f7441 100644
--- a/services/incremental/ServiceWrappers.cpp
+++ b/services/incremental/ServiceWrappers.cpp
@@ -18,23 +18,29 @@
 
 #include "ServiceWrappers.h"
 
+#include <MountRegistry.h>
 #include <android-base/logging.h>
+#include <android/content/pm/IDataLoaderManager.h>
+#include <android/os/IVold.h>
+#include <binder/AppOpsManager.h>
 #include <utils/String16.h>
 
+#include "IncrementalServiceValidation.h"
+
 using namespace std::literals;
 
-namespace android::os::incremental {
+namespace android::incremental {
 
 static constexpr auto kVoldServiceName = "vold"sv;
 static constexpr auto kDataLoaderManagerName = "dataloader_manager"sv;
 
 class RealVoldService : public VoldServiceWrapper {
 public:
-    RealVoldService(const sp<os::IVold> vold) : mInterface(std::move(vold)) {}
+    RealVoldService(sp<os::IVold> vold) : mInterface(std::move(vold)) {}
     ~RealVoldService() = default;
-    binder::Status mountIncFs(const std::string& backingPath, const std::string& targetDir,
-                              int32_t flags,
-                              IncrementalFileSystemControlParcel* _aidl_return) const final {
+    binder::Status mountIncFs(
+            const std::string& backingPath, const std::string& targetDir, int32_t flags,
+            os::incremental::IncrementalFileSystemControlParcel* _aidl_return) const final {
         return mInterface->mountIncFs(backingPath, targetDir, flags, _aidl_return);
     }
     binder::Status unmountIncFs(const std::string& dir) const final {
@@ -56,20 +62,21 @@
 
 class RealDataLoaderManager : public DataLoaderManagerWrapper {
 public:
-    RealDataLoaderManager(const sp<content::pm::IDataLoaderManager> manager)
-          : mInterface(manager) {}
+    RealDataLoaderManager(sp<content::pm::IDataLoaderManager> manager)
+          : mInterface(std::move(manager)) {}
     ~RealDataLoaderManager() = default;
-    binder::Status initializeDataLoader(MountId mountId, const DataLoaderParamsParcel& params,
-                                        const FileSystemControlParcel& control,
-                                        const sp<IDataLoaderStatusListener>& listener,
-                                        bool* _aidl_return) const final {
-        return mInterface->initializeDataLoader(mountId, params, control, listener, _aidl_return);
+    binder::Status bindToDataLoader(MountId mountId,
+                                    const content::pm::DataLoaderParamsParcel& params,
+                                    const sp<content::pm::IDataLoaderStatusListener>& listener,
+                                    bool* _aidl_return) const final {
+        return mInterface->bindToDataLoader(mountId, params, listener, _aidl_return);
     }
-    binder::Status getDataLoader(MountId mountId, sp<IDataLoader>* _aidl_return) const final {
+    binder::Status getDataLoader(MountId mountId,
+                                 sp<content::pm::IDataLoader>* _aidl_return) const final {
         return mInterface->getDataLoader(mountId, _aidl_return);
     }
-    binder::Status destroyDataLoader(MountId mountId) const final {
-        return mInterface->destroyDataLoader(mountId);
+    binder::Status unbindFromDataLoader(MountId mountId) const final {
+        return mInterface->unbindFromDataLoader(mountId);
     }
 
 private:
@@ -109,21 +116,31 @@
 class RealIncFs : public IncFsWrapper {
 public:
     RealIncFs() = default;
-    ~RealIncFs() = default;
+    ~RealIncFs() final = default;
+    void listExistingMounts(const ExistingMountCallback& cb) const final {
+        for (auto mount : incfs::defaultMountRegistry().copyMounts()) {
+            auto binds = mount.binds(); // span() doesn't like rvalue containers, needs to save it.
+            cb(mount.root(), mount.backingDir(), binds);
+        }
+    }
+    Control openMount(std::string_view path) const final { return incfs::open(path); }
     Control createControl(IncFsFd cmd, IncFsFd pendingReads, IncFsFd logs) const final {
         return incfs::createControl(cmd, pendingReads, logs);
     }
     ErrorCode makeFile(const Control& control, std::string_view path, int mode, FileId id,
-                       NewFileParams params) const final {
+                       incfs::NewFileParams params) const final {
         return incfs::makeFile(control, path, mode, id, params);
     }
     ErrorCode makeDir(const Control& control, std::string_view path, int mode) const final {
         return incfs::makeDir(control, path, mode);
     }
-    RawMetadata getMetadata(const Control& control, FileId fileid) const final {
+    ErrorCode makeDirs(const Control& control, std::string_view path, int mode) const final {
+        return incfs::makeDirs(control, path, mode);
+    }
+    incfs::RawMetadata getMetadata(const Control& control, FileId fileid) const final {
         return incfs::getMetadata(control, fileid);
     }
-    RawMetadata getMetadata(const Control& control, std::string_view path) const final {
+    incfs::RawMetadata getMetadata(const Control& control, std::string_view path) const final {
         return incfs::getMetadata(control, path);
     }
     FileId getFileId(const Control& control, std::string_view path) const final {
@@ -138,8 +155,8 @@
     base::unique_fd openForSpecialOps(const Control& control, FileId id) const final {
         return base::unique_fd{incfs::openForSpecialOps(control, id).release()};
     }
-    ErrorCode writeBlocks(Span<const DataBlock> blocks) const final {
-        return incfs::writeBlocks(blocks);
+    ErrorCode writeBlocks(std::span<const incfs::DataBlock> blocks) const final {
+        return incfs::writeBlocks({blocks.data(), size_t(blocks.size())});
     }
 };
 
@@ -165,8 +182,9 @@
 }
 
 std::unique_ptr<DataLoaderManagerWrapper> RealServiceManager::getDataLoaderManager() {
-    sp<IDataLoaderManager> manager =
-            RealServiceManager::getRealService<IDataLoaderManager>(kDataLoaderManagerName);
+    sp<content::pm::IDataLoaderManager> manager =
+            RealServiceManager::getRealService<content::pm::IDataLoaderManager>(
+                    kDataLoaderManagerName);
     if (manager) {
         return std::make_unique<RealDataLoaderManager>(manager);
     }
@@ -239,4 +257,4 @@
     return getJavaVm(env);
 }
 
-} // namespace android::os::incremental
+} // namespace android::incremental
diff --git a/services/incremental/ServiceWrappers.h b/services/incremental/ServiceWrappers.h
index 142bf2e..3792830 100644
--- a/services/incremental/ServiceWrappers.h
+++ b/services/incremental/ServiceWrappers.h
@@ -16,29 +16,23 @@
 
 #pragma once
 
-#include "IncrementalServiceValidation.h"
-
-#include <android-base/strings.h>
 #include <android-base/unique_fd.h>
 #include <android/content/pm/DataLoaderParamsParcel.h>
 #include <android/content/pm/FileSystemControlParcel.h>
 #include <android/content/pm/IDataLoader.h>
-#include <android/content/pm/IDataLoaderManager.h>
 #include <android/content/pm/IDataLoaderStatusListener.h>
-#include <android/os/IVold.h>
-#include <binder/AppOpsManager.h>
+#include <binder/IAppOpsCallback.h>
 #include <binder/IServiceManager.h>
+#include <binder/Status.h>
 #include <incfs.h>
 #include <jni.h>
 
 #include <memory>
+#include <span>
 #include <string>
 #include <string_view>
 
-using namespace android::incfs;
-using namespace android::content::pm;
-
-namespace android::os::incremental {
+namespace android::incremental {
 
 // --- Wrapper interfaces ---
 
@@ -47,42 +41,54 @@
 class VoldServiceWrapper {
 public:
     virtual ~VoldServiceWrapper() = default;
-    virtual binder::Status mountIncFs(const std::string& backingPath, const std::string& targetDir,
-                                      int32_t flags,
-                                      IncrementalFileSystemControlParcel* _aidl_return) const = 0;
+    virtual binder::Status mountIncFs(
+            const std::string& backingPath, const std::string& targetDir, int32_t flags,
+            os::incremental::IncrementalFileSystemControlParcel* result) const = 0;
     virtual binder::Status unmountIncFs(const std::string& dir) const = 0;
     virtual binder::Status bindMount(const std::string& sourceDir,
                                      const std::string& targetDir) const = 0;
-    virtual binder::Status setIncFsMountOptions(const ::android::os::incremental::IncrementalFileSystemControlParcel& control, bool enableReadLogs) const = 0;
+    virtual binder::Status setIncFsMountOptions(
+            const os::incremental::IncrementalFileSystemControlParcel& control,
+            bool enableReadLogs) const = 0;
 };
 
 class DataLoaderManagerWrapper {
 public:
     virtual ~DataLoaderManagerWrapper() = default;
-    virtual binder::Status initializeDataLoader(MountId mountId,
-                                                const DataLoaderParamsParcel& params,
-                                                const FileSystemControlParcel& control,
-                                                const sp<IDataLoaderStatusListener>& listener,
-                                                bool* _aidl_return) const = 0;
-    virtual binder::Status getDataLoader(MountId mountId, sp<IDataLoader>* _aidl_return) const = 0;
-    virtual binder::Status destroyDataLoader(MountId mountId) const = 0;
+    virtual binder::Status bindToDataLoader(
+            MountId mountId, const content::pm::DataLoaderParamsParcel& params,
+            const sp<content::pm::IDataLoaderStatusListener>& listener, bool* result) const = 0;
+    virtual binder::Status getDataLoader(MountId mountId,
+                                         sp<content::pm::IDataLoader>* result) const = 0;
+    virtual binder::Status unbindFromDataLoader(MountId mountId) const = 0;
 };
 
 class IncFsWrapper {
 public:
+    using Control = incfs::Control;
+    using FileId = incfs::FileId;
+    using ErrorCode = incfs::ErrorCode;
+
+    using ExistingMountCallback =
+            std::function<void(std::string_view root, std::string_view backingDir,
+                               std::span<std::pair<std::string_view, std::string_view>> binds)>;
+
     virtual ~IncFsWrapper() = default;
+    virtual void listExistingMounts(const ExistingMountCallback& cb) const = 0;
+    virtual Control openMount(std::string_view path) const = 0;
     virtual Control createControl(IncFsFd cmd, IncFsFd pendingReads, IncFsFd logs) const = 0;
     virtual ErrorCode makeFile(const Control& control, std::string_view path, int mode, FileId id,
-                               NewFileParams params) const = 0;
+                               incfs::NewFileParams params) const = 0;
     virtual ErrorCode makeDir(const Control& control, std::string_view path, int mode) const = 0;
-    virtual RawMetadata getMetadata(const Control& control, FileId fileid) const = 0;
-    virtual RawMetadata getMetadata(const Control& control, std::string_view path) const = 0;
+    virtual ErrorCode makeDirs(const Control& control, std::string_view path, int mode) const = 0;
+    virtual incfs::RawMetadata getMetadata(const Control& control, FileId fileid) const = 0;
+    virtual incfs::RawMetadata getMetadata(const Control& control, std::string_view path) const = 0;
     virtual FileId getFileId(const Control& control, std::string_view path) const = 0;
     virtual ErrorCode link(const Control& control, std::string_view from,
                            std::string_view to) const = 0;
     virtual ErrorCode unlink(const Control& control, std::string_view path) const = 0;
     virtual base::unique_fd openForSpecialOps(const Control& control, FileId id) const = 0;
-    virtual ErrorCode writeBlocks(Span<const DataBlock> blocks) const = 0;
+    virtual ErrorCode writeBlocks(std::span<const incfs::DataBlock> blocks) const = 0;
 };
 
 class AppOpsManagerWrapper {
@@ -129,4 +135,4 @@
     JavaVM* const mJvm;
 };
 
-} // namespace android::os::incremental
+} // namespace android::incremental
diff --git a/services/incremental/path.cpp b/services/incremental/path.cpp
index 0d86f2a..338659d 100644
--- a/services/incremental/path.cpp
+++ b/services/incremental/path.cpp
@@ -44,7 +44,7 @@
                                         PathCharsLess());
 }
 
-static void preparePathComponent(std::string_view path, bool trimFront) {
+static void preparePathComponent(std::string_view& path, bool trimFront) {
     if (trimFront) {
         while (!path.empty() && path.front() == '/') {
             path.remove_prefix(1);
diff --git a/services/incremental/test/IncrementalServiceTest.cpp b/services/incremental/test/IncrementalServiceTest.cpp
index 117dca8..2205bfe 100644
--- a/services/incremental/test/IncrementalServiceTest.cpp
+++ b/services/incremental/test/IncrementalServiceTest.cpp
@@ -25,6 +25,7 @@
 #include <future>
 
 #include "IncrementalService.h"
+#include "IncrementalServiceValidation.h"
 #include "Metadata.pb.h"
 #include "ServiceWrappers.h"
 
@@ -103,75 +104,74 @@
     TemporaryFile logFile;
 };
 
-class FakeDataLoader : public IDataLoader {
+class MockDataLoader : public IDataLoader {
 public:
+    MockDataLoader() {
+        ON_CALL(*this, create(_, _, _, _)).WillByDefault(Invoke(this, &MockDataLoader::createOk));
+        ON_CALL(*this, start(_)).WillByDefault(Invoke(this, &MockDataLoader::startOk));
+        ON_CALL(*this, stop(_)).WillByDefault(Invoke(this, &MockDataLoader::stopOk));
+        ON_CALL(*this, destroy(_)).WillByDefault(Invoke(this, &MockDataLoader::destroyOk));
+        ON_CALL(*this, prepareImage(_, _, _))
+                .WillByDefault(Invoke(this, &MockDataLoader::prepareImageOk));
+    }
     IBinder* onAsBinder() override { return nullptr; }
-    binder::Status create(int32_t, const DataLoaderParamsParcel&, const FileSystemControlParcel&,
-                          const sp<IDataLoaderStatusListener>&) override {
+    MOCK_METHOD4(create,
+                 binder::Status(int32_t id, const DataLoaderParamsParcel& params,
+                                const FileSystemControlParcel& control,
+                                const sp<IDataLoaderStatusListener>& listener));
+    MOCK_METHOD1(start, binder::Status(int32_t id));
+    MOCK_METHOD1(stop, binder::Status(int32_t id));
+    MOCK_METHOD1(destroy, binder::Status(int32_t id));
+    MOCK_METHOD3(prepareImage,
+                 binder::Status(int32_t id, const std::vector<InstallationFileParcel>& addedFiles,
+                                const std::vector<std::string>& removedFiles));
+
+    void initializeCreateOkNoStatus() {
+        ON_CALL(*this, create(_, _, _, _))
+                .WillByDefault(Invoke(this, &MockDataLoader::createOkNoStatus));
+    }
+
+    binder::Status createOk(int32_t id, const content::pm::DataLoaderParamsParcel& params,
+                            const content::pm::FileSystemControlParcel& control,
+                            const sp<content::pm::IDataLoaderStatusListener>& listener) {
+        createOkNoStatus(id, params, control, listener);
+        if (mListener) {
+            mListener->onStatusChanged(id, IDataLoaderStatusListener::DATA_LOADER_CREATED);
+        }
         return binder::Status::ok();
     }
-    binder::Status start(int32_t) override { return binder::Status::ok(); }
-    binder::Status stop(int32_t) override { return binder::Status::ok(); }
-    binder::Status destroy(int32_t) override { return binder::Status::ok(); }
-    binder::Status prepareImage(int32_t,
-                                const std::vector<InstallationFileParcel>&,
-                                const std::vector<std::string>&) override {
-        return binder::Status::ok();
-    }
-};
-
-class MockDataLoaderManager : public DataLoaderManagerWrapper {
-public:
-    MOCK_CONST_METHOD5(initializeDataLoader,
-                       binder::Status(int32_t mountId, const DataLoaderParamsParcel& params,
-                                      const FileSystemControlParcel& control,
-                                      const sp<IDataLoaderStatusListener>& listener,
-                                      bool* _aidl_return));
-    MOCK_CONST_METHOD2(getDataLoader,
-                       binder::Status(int32_t mountId, sp<IDataLoader>* _aidl_return));
-    MOCK_CONST_METHOD1(destroyDataLoader, binder::Status(int32_t mountId));
-
-    void initializeDataLoaderSuccess() {
-        ON_CALL(*this, initializeDataLoader(_, _, _, _, _))
-                .WillByDefault(Invoke(this, &MockDataLoaderManager::initializeDataLoaderOk));
-    }
-    void initializeDataLoaderFails() {
-        ON_CALL(*this, initializeDataLoader(_, _, _, _, _))
-                .WillByDefault(Return(
-                        (binder::Status::fromExceptionCode(1, String8("failed to prepare")))));
-    }
-    void getDataLoaderSuccess() {
-        ON_CALL(*this, getDataLoader(_, _))
-                .WillByDefault(Invoke(this, &MockDataLoaderManager::getDataLoaderOk));
-    }
-    void destroyDataLoaderOk() {
-        ON_CALL(*this, destroyDataLoader(_))
-                .WillByDefault(Invoke(this, &MockDataLoaderManager::setDataLoaderStatusDestroyed));
-    }
-    binder::Status initializeDataLoaderOk(int32_t mountId, const DataLoaderParamsParcel& params,
-                                          const FileSystemControlParcel& control,
-                                          const sp<IDataLoaderStatusListener>& listener,
-                                          bool* _aidl_return) {
-        mId = mountId;
-        mListener = listener;
+    binder::Status createOkNoStatus(int32_t id, const content::pm::DataLoaderParamsParcel& params,
+                                    const content::pm::FileSystemControlParcel& control,
+                                    const sp<content::pm::IDataLoaderStatusListener>& listener) {
         mServiceConnector = control.service;
-        *_aidl_return = true;
+        mListener = listener;
         return binder::Status::ok();
     }
-    binder::Status getDataLoaderOk(int32_t mountId, sp<IDataLoader>* _aidl_return) {
-        *_aidl_return = mDataLoader;
+    binder::Status startOk(int32_t id) {
+        if (mListener) {
+            mListener->onStatusChanged(id, IDataLoaderStatusListener::DATA_LOADER_STARTED);
+        }
         return binder::Status::ok();
     }
-    void setDataLoaderStatusNotReady() {
-        mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_DESTROYED);
+    binder::Status stopOk(int32_t id) {
+        if (mListener) {
+            mListener->onStatusChanged(id, IDataLoaderStatusListener::DATA_LOADER_STOPPED);
+        }
+        return binder::Status::ok();
     }
-    void setDataLoaderStatusReady() {
-        mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_CREATED);
-    }
-    binder::Status setDataLoaderStatusDestroyed(int32_t id) {
+    binder::Status destroyOk(int32_t id) {
         if (mListener) {
             mListener->onStatusChanged(id, IDataLoaderStatusListener::DATA_LOADER_DESTROYED);
         }
+        mListener = nullptr;
+        return binder::Status::ok();
+    }
+    binder::Status prepareImageOk(int32_t id,
+                                  const ::std::vector<content::pm::InstallationFileParcel>&,
+                                  const ::std::vector<::std::string>&) {
+        if (mListener) {
+            mListener->onStatusChanged(id, IDataLoaderStatusListener::DATA_LOADER_IMAGE_READY);
+        }
         return binder::Status::ok();
     }
     int32_t setStorageParams(bool enableReadLogs) {
@@ -182,19 +182,97 @@
     }
 
 private:
+    sp<IIncrementalServiceConnector> mServiceConnector;
+    sp<IDataLoaderStatusListener> mListener;
+};
+
+class MockDataLoaderManager : public DataLoaderManagerWrapper {
+public:
+    MockDataLoaderManager(sp<IDataLoader> dataLoader) : mDataLoaderHolder(std::move(dataLoader)) {
+        EXPECT_TRUE(mDataLoaderHolder != nullptr);
+    }
+
+    MOCK_CONST_METHOD4(bindToDataLoader,
+                       binder::Status(int32_t mountId, const DataLoaderParamsParcel& params,
+                                      const sp<IDataLoaderStatusListener>& listener,
+                                      bool* _aidl_return));
+    MOCK_CONST_METHOD2(getDataLoader,
+                       binder::Status(int32_t mountId, sp<IDataLoader>* _aidl_return));
+    MOCK_CONST_METHOD1(unbindFromDataLoader, binder::Status(int32_t mountId));
+
+    void bindToDataLoaderSuccess() {
+        ON_CALL(*this, bindToDataLoader(_, _, _, _))
+                .WillByDefault(Invoke(this, &MockDataLoaderManager::bindToDataLoaderOk));
+    }
+    void bindToDataLoaderFails() {
+        ON_CALL(*this, bindToDataLoader(_, _, _, _))
+                .WillByDefault(Return(
+                        (binder::Status::fromExceptionCode(1, String8("failed to prepare")))));
+    }
+    void getDataLoaderSuccess() {
+        ON_CALL(*this, getDataLoader(_, _))
+                .WillByDefault(Invoke(this, &MockDataLoaderManager::getDataLoaderOk));
+    }
+    void unbindFromDataLoaderSuccess() {
+        ON_CALL(*this, unbindFromDataLoader(_))
+                .WillByDefault(Invoke(this, &MockDataLoaderManager::unbindFromDataLoaderOk));
+    }
+    binder::Status bindToDataLoaderOk(int32_t mountId, const DataLoaderParamsParcel& params,
+                                      const sp<IDataLoaderStatusListener>& listener,
+                                      bool* _aidl_return) {
+        mId = mountId;
+        mListener = listener;
+        mDataLoader = mDataLoaderHolder;
+        *_aidl_return = true;
+        if (mListener) {
+            mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_BOUND);
+        }
+        return binder::Status::ok();
+    }
+    binder::Status getDataLoaderOk(int32_t mountId, sp<IDataLoader>* _aidl_return) {
+        *_aidl_return = mDataLoader;
+        return binder::Status::ok();
+    }
+    void setDataLoaderStatusCreated() {
+        mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_CREATED);
+    }
+    void setDataLoaderStatusStarted() {
+        mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_STARTED);
+    }
+    void setDataLoaderStatusDestroyed() {
+        mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_DESTROYED);
+    }
+    binder::Status unbindFromDataLoaderOk(int32_t id) {
+        if (mDataLoader) {
+            if (auto status = mDataLoader->destroy(id); !status.isOk()) {
+                return status;
+            }
+            mDataLoader = nullptr;
+        }
+        if (mListener) {
+            mListener->onStatusChanged(id, IDataLoaderStatusListener::DATA_LOADER_DESTROYED);
+        }
+        return binder::Status::ok();
+    }
+
+private:
     int mId;
     sp<IDataLoaderStatusListener> mListener;
-    sp<IIncrementalServiceConnector> mServiceConnector;
-    sp<IDataLoader> mDataLoader = sp<IDataLoader>(new FakeDataLoader());
+    sp<IDataLoader> mDataLoader;
+    sp<IDataLoader> mDataLoaderHolder;
 };
 
 class MockIncFs : public IncFsWrapper {
 public:
+    MOCK_CONST_METHOD1(listExistingMounts, void(const ExistingMountCallback& cb));
+    MOCK_CONST_METHOD1(openMount, Control(std::string_view path));
     MOCK_CONST_METHOD3(createControl, Control(IncFsFd cmd, IncFsFd pendingReads, IncFsFd logs));
     MOCK_CONST_METHOD5(makeFile,
                        ErrorCode(const Control& control, std::string_view path, int mode, FileId id,
                                  NewFileParams params));
     MOCK_CONST_METHOD3(makeDir, ErrorCode(const Control& control, std::string_view path, int mode));
+    MOCK_CONST_METHOD3(makeDirs,
+                       ErrorCode(const Control& control, std::string_view path, int mode));
     MOCK_CONST_METHOD2(getMetadata, RawMetadata(const Control& control, FileId fileid));
     MOCK_CONST_METHOD2(getMetadata, RawMetadata(const Control& control, std::string_view path));
     MOCK_CONST_METHOD2(getFileId, FileId(const Control& control, std::string_view path));
@@ -202,10 +280,13 @@
                        ErrorCode(const Control& control, std::string_view from, std::string_view to));
     MOCK_CONST_METHOD2(unlink, ErrorCode(const Control& control, std::string_view path));
     MOCK_CONST_METHOD2(openForSpecialOps, base::unique_fd(const Control& control, FileId id));
-    MOCK_CONST_METHOD1(writeBlocks, ErrorCode(Span<const DataBlock> blocks));
+    MOCK_CONST_METHOD1(writeBlocks, ErrorCode(std::span<const DataBlock> blocks));
+
+    MockIncFs() { ON_CALL(*this, listExistingMounts(_)).WillByDefault(Return()); }
 
     void makeFileFails() { ON_CALL(*this, makeFile(_, _, _, _, _)).WillByDefault(Return(-1)); }
     void makeFileSuccess() { ON_CALL(*this, makeFile(_, _, _, _, _)).WillByDefault(Return(0)); }
+
     RawMetadata getMountInfoMetadata(const Control& control, std::string_view path) {
         metadata::Mount m;
         m.mutable_storage()->set_id(100);
@@ -303,7 +384,9 @@
     void SetUp() override {
         auto vold = std::make_unique<NiceMock<MockVoldService>>();
         mVold = vold.get();
-        auto dataloaderManager = std::make_unique<NiceMock<MockDataLoaderManager>>();
+        sp<NiceMock<MockDataLoader>> dataLoader{new NiceMock<MockDataLoader>};
+        mDataLoader = dataLoader.get();
+        auto dataloaderManager = std::make_unique<NiceMock<MockDataLoaderManager>>(dataLoader);
         mDataLoaderManager = dataloaderManager.get();
         auto incFs = std::make_unique<NiceMock<MockIncFs>>();
         mIncFs = incFs.get();
@@ -321,7 +404,7 @@
                                                      mRootDir.path);
         mDataLoaderParcel.packageName = "com.test";
         mDataLoaderParcel.arguments = "uri";
-        mDataLoaderManager->destroyDataLoaderOk();
+        mDataLoaderManager->unbindFromDataLoaderSuccess();
         mIncrementalService->onSystemReady();
     }
 
@@ -352,6 +435,7 @@
     NiceMock<MockDataLoaderManager>* mDataLoaderManager;
     NiceMock<MockAppOpsManager>* mAppOpsManager;
     NiceMock<MockJniWrapper>* mJni;
+    NiceMock<MockDataLoader>* mDataLoader;
     std::unique_ptr<IncrementalService> mIncrementalService;
     TemporaryDir mRootDir;
     DataLoaderParamsParcel mDataLoaderParcel;
@@ -359,7 +443,7 @@
 
 TEST_F(IncrementalServiceTest, testCreateStorageMountIncFsFails) {
     mVold->mountIncFsFails();
-    EXPECT_CALL(*mDataLoaderManager, initializeDataLoader(_, _, _, _, _)).Times(0);
+    EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _)).Times(0);
     TemporaryDir tempDir;
     int storageId =
             mIncrementalService->createStorage(tempDir.path, std::move(mDataLoaderParcel), {},
@@ -369,8 +453,8 @@
 
 TEST_F(IncrementalServiceTest, testCreateStorageMountIncFsInvalidControlParcel) {
     mVold->mountIncFsInvalidControlParcel();
-    EXPECT_CALL(*mDataLoaderManager, initializeDataLoader(_, _, _, _, _)).Times(0);
-    EXPECT_CALL(*mDataLoaderManager, destroyDataLoader(_)).Times(0);
+    EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _)).Times(0);
+    EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
     TemporaryDir tempDir;
     int storageId =
             mIncrementalService->createStorage(tempDir.path, std::move(mDataLoaderParcel), {},
@@ -381,8 +465,8 @@
 TEST_F(IncrementalServiceTest, testCreateStorageMakeFileFails) {
     mVold->mountIncFsSuccess();
     mIncFs->makeFileFails();
-    EXPECT_CALL(*mDataLoaderManager, initializeDataLoader(_, _, _, _, _)).Times(0);
-    EXPECT_CALL(*mDataLoaderManager, destroyDataLoader(_)).Times(0);
+    EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _)).Times(0);
+    EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
     EXPECT_CALL(*mVold, unmountIncFs(_));
     TemporaryDir tempDir;
     int storageId =
@@ -395,8 +479,8 @@
     mVold->mountIncFsSuccess();
     mIncFs->makeFileSuccess();
     mVold->bindMountFails();
-    EXPECT_CALL(*mDataLoaderManager, initializeDataLoader(_, _, _, _, _)).Times(0);
-    EXPECT_CALL(*mDataLoaderManager, destroyDataLoader(_)).Times(0);
+    EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _)).Times(0);
+    EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
     EXPECT_CALL(*mVold, unmountIncFs(_));
     TemporaryDir tempDir;
     int storageId =
@@ -409,8 +493,12 @@
     mVold->mountIncFsSuccess();
     mIncFs->makeFileSuccess();
     mVold->bindMountSuccess();
-    mDataLoaderManager->initializeDataLoaderFails();
-    EXPECT_CALL(*mDataLoaderManager, destroyDataLoader(_)).Times(1);
+    mDataLoaderManager->bindToDataLoaderFails();
+    EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _)).Times(1);
+    EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
+    EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(0);
+    EXPECT_CALL(*mDataLoader, start(_)).Times(0);
+    EXPECT_CALL(*mDataLoader, destroy(_)).Times(0);
     EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
     TemporaryDir tempDir;
     int storageId =
@@ -423,8 +511,13 @@
     mVold->mountIncFsSuccess();
     mIncFs->makeFileSuccess();
     mVold->bindMountSuccess();
-    mDataLoaderManager->initializeDataLoaderSuccess();
-    EXPECT_CALL(*mDataLoaderManager, destroyDataLoader(_)).Times(1);
+    mDataLoaderManager->bindToDataLoaderSuccess();
+    mDataLoaderManager->getDataLoaderSuccess();
+    EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _)).Times(1);
+    EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
+    EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
+    EXPECT_CALL(*mDataLoader, start(_)).Times(0);
+    EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
     EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
     TemporaryDir tempDir;
     int storageId =
@@ -434,36 +527,70 @@
     mIncrementalService->deleteStorage(storageId);
 }
 
-TEST_F(IncrementalServiceTest, testOnStatusNotReady) {
+TEST_F(IncrementalServiceTest, testDataLoaderDestroyed) {
     mVold->mountIncFsSuccess();
     mIncFs->makeFileSuccess();
     mVold->bindMountSuccess();
-    mDataLoaderManager->initializeDataLoaderSuccess();
-    EXPECT_CALL(*mDataLoaderManager, destroyDataLoader(_));
+    mDataLoaderManager->bindToDataLoaderSuccess();
+    mDataLoaderManager->getDataLoaderSuccess();
+    EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _)).Times(2);
+    EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
+    EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(2);
+    EXPECT_CALL(*mDataLoader, start(_)).Times(0);
+    EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
     EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
     TemporaryDir tempDir;
     int storageId =
             mIncrementalService->createStorage(tempDir.path, std::move(mDataLoaderParcel), {},
                                                IncrementalService::CreateOptions::CreateNew);
     ASSERT_GE(storageId, 0);
-    mDataLoaderManager->setDataLoaderStatusNotReady();
+    // Simulated crash/other connection breakage.
+    mDataLoaderManager->setDataLoaderStatusDestroyed();
 }
 
-TEST_F(IncrementalServiceTest, testStartDataLoaderSuccess) {
+TEST_F(IncrementalServiceTest, testStartDataLoaderCreate) {
     mVold->mountIncFsSuccess();
     mIncFs->makeFileSuccess();
     mVold->bindMountSuccess();
-    mDataLoaderManager->initializeDataLoaderSuccess();
+    mDataLoader->initializeCreateOkNoStatus();
+    mDataLoaderManager->bindToDataLoaderSuccess();
     mDataLoaderManager->getDataLoaderSuccess();
-    EXPECT_CALL(*mDataLoaderManager, destroyDataLoader(_));
+    EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _)).Times(1);
+    EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
+    EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
+    EXPECT_CALL(*mDataLoader, start(_)).Times(1);
+    EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
     EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
     TemporaryDir tempDir;
     int storageId =
             mIncrementalService->createStorage(tempDir.path, std::move(mDataLoaderParcel), {},
                                                IncrementalService::CreateOptions::CreateNew);
     ASSERT_GE(storageId, 0);
-    mDataLoaderManager->setDataLoaderStatusReady();
+    mDataLoaderManager->setDataLoaderStatusCreated();
     ASSERT_TRUE(mIncrementalService->startLoading(storageId));
+    mDataLoaderManager->setDataLoaderStatusStarted();
+}
+
+TEST_F(IncrementalServiceTest, testStartDataLoaderPendingStart) {
+    mVold->mountIncFsSuccess();
+    mIncFs->makeFileSuccess();
+    mVold->bindMountSuccess();
+    mDataLoader->initializeCreateOkNoStatus();
+    mDataLoaderManager->bindToDataLoaderSuccess();
+    mDataLoaderManager->getDataLoaderSuccess();
+    EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _)).Times(1);
+    EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
+    EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(2);
+    EXPECT_CALL(*mDataLoader, start(_)).Times(1);
+    EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
+    EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
+    TemporaryDir tempDir;
+    int storageId =
+            mIncrementalService->createStorage(tempDir.path, std::move(mDataLoaderParcel), {},
+                                               IncrementalService::CreateOptions::CreateNew);
+    ASSERT_GE(storageId, 0);
+    ASSERT_TRUE(mIncrementalService->startLoading(storageId));
+    mDataLoaderManager->setDataLoaderStatusCreated();
 }
 
 TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccess) {
@@ -471,10 +598,10 @@
     mIncFs->makeFileSuccess();
     mVold->bindMountSuccess();
     mVold->setIncFsMountOptionsSuccess();
-    mDataLoaderManager->initializeDataLoaderSuccess();
+    mDataLoaderManager->bindToDataLoaderSuccess();
     mDataLoaderManager->getDataLoaderSuccess();
     mAppOpsManager->checkPermissionSuccess();
-    EXPECT_CALL(*mDataLoaderManager, destroyDataLoader(_));
+    EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
     EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
     // We are calling setIncFsMountOptions(true).
     EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(1);
@@ -487,7 +614,7 @@
             mIncrementalService->createStorage(tempDir.path, std::move(mDataLoaderParcel), {},
                                                IncrementalService::CreateOptions::CreateNew);
     ASSERT_GE(storageId, 0);
-    ASSERT_GE(mDataLoaderManager->setStorageParams(true), 0);
+    ASSERT_GE(mDataLoader->setStorageParams(true), 0);
 }
 
 TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndPermissionChanged) {
@@ -495,11 +622,11 @@
     mIncFs->makeFileSuccess();
     mVold->bindMountSuccess();
     mVold->setIncFsMountOptionsSuccess();
-    mDataLoaderManager->initializeDataLoaderSuccess();
+    mDataLoaderManager->bindToDataLoaderSuccess();
     mDataLoaderManager->getDataLoaderSuccess();
     mAppOpsManager->checkPermissionSuccess();
     mAppOpsManager->initializeStartWatchingMode();
-    EXPECT_CALL(*mDataLoaderManager, destroyDataLoader(_));
+    EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
     EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
     // We are calling setIncFsMountOptions(true).
     EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(1);
@@ -514,7 +641,7 @@
             mIncrementalService->createStorage(tempDir.path, std::move(mDataLoaderParcel), {},
                                                IncrementalService::CreateOptions::CreateNew);
     ASSERT_GE(storageId, 0);
-    ASSERT_GE(mDataLoaderManager->setStorageParams(true), 0);
+    ASSERT_GE(mDataLoader->setStorageParams(true), 0);
     ASSERT_NE(nullptr, mAppOpsManager->mStoredCallback.get());
     mAppOpsManager->mStoredCallback->opChanged(0, {});
 }
@@ -523,10 +650,10 @@
     mVold->mountIncFsSuccess();
     mIncFs->makeFileSuccess();
     mVold->bindMountSuccess();
-    mDataLoaderManager->initializeDataLoaderSuccess();
+    mDataLoaderManager->bindToDataLoaderSuccess();
     mDataLoaderManager->getDataLoaderSuccess();
     mAppOpsManager->checkPermissionFails();
-    EXPECT_CALL(*mDataLoaderManager, destroyDataLoader(_));
+    EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
     EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
     // checkPermission fails, no calls to set opitions,  start or stop WatchingMode.
     EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(0);
@@ -537,7 +664,7 @@
             mIncrementalService->createStorage(tempDir.path, std::move(mDataLoaderParcel), {},
                                                IncrementalService::CreateOptions::CreateNew);
     ASSERT_GE(storageId, 0);
-    ASSERT_LT(mDataLoaderManager->setStorageParams(true), 0);
+    ASSERT_LT(mDataLoader->setStorageParams(true), 0);
 }
 
 TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsFails) {
@@ -545,10 +672,10 @@
     mIncFs->makeFileSuccess();
     mVold->bindMountSuccess();
     mVold->setIncFsMountOptionsFails();
-    mDataLoaderManager->initializeDataLoaderSuccess();
+    mDataLoaderManager->bindToDataLoaderSuccess();
     mDataLoaderManager->getDataLoaderSuccess();
     mAppOpsManager->checkPermissionSuccess();
-    EXPECT_CALL(*mDataLoaderManager, destroyDataLoader(_));
+    EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
     EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
     // We are calling setIncFsMountOptions.
     EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(1);
@@ -560,14 +687,14 @@
             mIncrementalService->createStorage(tempDir.path, std::move(mDataLoaderParcel), {},
                                                IncrementalService::CreateOptions::CreateNew);
     ASSERT_GE(storageId, 0);
-    ASSERT_LT(mDataLoaderManager->setStorageParams(true), 0);
+    ASSERT_LT(mDataLoader->setStorageParams(true), 0);
 }
 
 TEST_F(IncrementalServiceTest, testMakeDirectory) {
     mVold->mountIncFsSuccess();
     mIncFs->makeFileSuccess();
     mVold->bindMountSuccess();
-    mDataLoaderManager->initializeDataLoaderSuccess();
+    mDataLoaderManager->bindToDataLoaderSuccess();
     mDataLoaderManager->getDataLoaderSuccess();
     TemporaryDir tempDir;
     int storageId =
@@ -575,14 +702,14 @@
                                                IncrementalService::CreateOptions::CreateNew);
     std::string dir_path("test");
 
-    std::string tempPath(tempDir.path);
-    std::replace(tempPath.begin(), tempPath.end(), '/', '_');
-    std::string mount_dir = std::string(mRootDir.path) + "/MT_" + tempPath.substr(1);
-    std::string normalized_dir_path = mount_dir + "/mount/st_1_0/" + dir_path;
-
     // Expecting incfs to call makeDir on a path like:
-    // /data/local/tmp/TemporaryDir-06yixG/data_local_tmp_TemporaryDir-xwdFhT/mount/st_1_0/test
-    EXPECT_CALL(*mIncFs, makeDir(_, std::string_view(normalized_dir_path), _));
+    // <root>/*/mount/<storage>/test
+    EXPECT_CALL(*mIncFs,
+                makeDir(_, Truly([&](std::string_view arg) {
+                            return arg.starts_with(mRootDir.path) &&
+                                    arg.ends_with("/mount/st_1_0/" + dir_path);
+                        }),
+                        _));
     auto res = mIncrementalService->makeDir(storageId, dir_path, 0555);
     ASSERT_EQ(res, 0);
 }
@@ -591,7 +718,7 @@
     mVold->mountIncFsSuccess();
     mIncFs->makeFileSuccess();
     mVold->bindMountSuccess();
-    mDataLoaderManager->initializeDataLoaderSuccess();
+    mDataLoaderManager->bindToDataLoaderSuccess();
     mDataLoaderManager->getDataLoaderSuccess();
     TemporaryDir tempDir;
     int storageId =
@@ -600,29 +727,15 @@
     auto first = "first"sv;
     auto second = "second"sv;
     auto third = "third"sv;
+    auto dir_path = std::string(first) + "/" + std::string(second) + "/" + std::string(third);
 
-    std::string tempPath(tempDir.path);
-    std::replace(tempPath.begin(), tempPath.end(), '/', '_');
-    std::string mount_dir = std::string(mRootDir.path) + "/MT_" + tempPath.substr(1);
-
-    InSequence seq;
-    auto parent_path = std::string(first) + "/" + std::string(second);
-    auto dir_path = parent_path + "/" + std::string(third);
-
-    std::string normalized_first_path = mount_dir + "/mount/st_1_0/" + std::string(first);
-    std::string normalized_parent_path = mount_dir + "/mount/st_1_0/" + parent_path;
-    std::string normalized_dir_path = mount_dir + "/mount/st_1_0/" + dir_path;
-
-    EXPECT_CALL(*mIncFs, makeDir(_, std::string_view(normalized_dir_path), _))
-            .WillOnce(Return(-ENOENT));
-    EXPECT_CALL(*mIncFs, makeDir(_, std::string_view(normalized_parent_path), _))
-            .WillOnce(Return(-ENOENT));
-    EXPECT_CALL(*mIncFs, makeDir(_, std::string_view(normalized_first_path), _))
-            .WillOnce(Return(0));
-    EXPECT_CALL(*mIncFs, makeDir(_, std::string_view(normalized_parent_path), _))
-            .WillOnce(Return(0));
-    EXPECT_CALL(*mIncFs, makeDir(_, std::string_view(normalized_dir_path), _)).WillOnce(Return(0));
-    auto res = mIncrementalService->makeDirs(storageId, normalized_dir_path, 0555);
+    EXPECT_CALL(*mIncFs,
+                makeDirs(_, Truly([&](std::string_view arg) {
+                             return arg.starts_with(mRootDir.path) &&
+                                     arg.ends_with("/mount/st_1_0/" + dir_path);
+                         }),
+                         _));
+    auto res = mIncrementalService->makeDirs(storageId, dir_path, 0555);
     ASSERT_EQ(res, 0);
 }
 } // namespace android::os::incremental
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index e2a2473..0fc333f 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -21,6 +21,8 @@
 import static android.os.IServiceManager.DUMP_FLAG_PRIORITY_HIGH;
 import static android.os.IServiceManager.DUMP_FLAG_PRIORITY_NORMAL;
 import static android.os.IServiceManager.DUMP_FLAG_PROTO;
+import static android.os.Process.SYSTEM_UID;
+import static android.os.Process.myPid;
 import static android.view.Display.DEFAULT_DISPLAY;
 
 import static com.android.server.utils.TimingsTraceAndSlog.SYSTEM_SERVER_TIMING_TAG;
@@ -29,6 +31,7 @@
 import android.annotation.StringRes;
 import android.app.ActivityThread;
 import android.app.AppCompatCallbacks;
+import android.app.ApplicationErrorReport;
 import android.app.INotificationManager;
 import android.app.SystemServiceRegistry;
 import android.app.usage.UsageStatsManagerInternal;
@@ -53,6 +56,7 @@
 import android.os.Environment;
 import android.os.FactoryTest;
 import android.os.FileUtils;
+import android.os.IBinder;
 import android.os.IIncidentManager;
 import android.os.Looper;
 import android.os.Message;
@@ -67,16 +71,19 @@
 import android.os.storage.IStorageManager;
 import android.provider.DeviceConfig;
 import android.provider.Settings;
+import android.server.ServerProtoEnums;
 import android.sysprop.VoldProperties;
 import android.text.TextUtils;
 import android.util.DisplayMetrics;
 import android.util.EventLog;
+import android.util.Pair;
 import android.util.Slog;
 import android.view.contentcapture.ContentCaptureManager;
 
 import com.android.internal.R;
 import com.android.internal.notification.SystemNotificationChannels;
 import com.android.internal.os.BinderInternal;
+import com.android.internal.os.RuntimeInit;
 import com.android.internal.util.ConcurrentUtils;
 import com.android.internal.util.EmergencyAffordanceManager;
 import com.android.internal.util.FrameworkStatsLog;
@@ -112,6 +119,7 @@
 import com.android.server.inputmethod.MultiClientInputMethodManagerService;
 import com.android.server.integrity.AppIntegrityManagerService;
 import com.android.server.lights.LightsService;
+import com.android.server.location.LocationManagerService;
 import com.android.server.media.MediaResourceMonitorService;
 import com.android.server.media.MediaRouterService;
 import com.android.server.media.MediaSessionService;
@@ -178,6 +186,7 @@
 
 import java.io.File;
 import java.io.IOException;
+import java.util.LinkedList;
 import java.util.Locale;
 import java.util.Timer;
 import java.util.concurrent.CountDownLatch;
@@ -357,6 +366,11 @@
     private Future<?> mBlobStoreServiceStart;
 
     /**
+     * The pending WTF to be logged into dropbox.
+     */
+    private static LinkedList<Pair<String, ApplicationErrorReport.CrashInfo>> sPendingWtfs;
+
+    /**
      * Start the sensor service. This is a blocking call and can take time.
      */
     private static native void startSensorService();
@@ -567,6 +581,9 @@
             t.traceEnd();  // InitBeforeStartServices
         }
 
+        // Setup the default WTF handler
+        RuntimeInit.setDefaultApplicationWtfHandler(SystemServer::handleEarlySystemWtf);
+
         // Start services.
         try {
             t.traceBegin("StartServices");
@@ -2113,6 +2130,14 @@
         }
         t.traceEnd();
 
+        // Emit any pending system_server WTFs
+        synchronized (SystemService.class) {
+            if (sPendingWtfs != null) {
+                mActivityManagerService.schedulePendingSystemServerWtfs(sPendingWtfs);
+                sPendingWtfs = null;
+            }
+        }
+
         if (safeMode) {
             mActivityManagerService.showSafeModeOverlay();
         }
@@ -2149,12 +2174,6 @@
         mPackageManagerService.systemReady();
         t.traceEnd();
 
-        if (mIncrementalServiceHandle != 0) {
-            t.traceBegin("MakeIncrementalServiceReady");
-            setIncrementalServiceSystemReady(mIncrementalServiceHandle);
-            t.traceEnd();
-        }
-
         t.traceBegin("MakeDisplayManagerServiceReady");
         try {
             // TODO: use boot phase and communicate these flags some other way
@@ -2424,6 +2443,12 @@
                 reportWtf("Notifying incident daemon running", e);
             }
             t.traceEnd();
+
+            if (mIncrementalServiceHandle != 0) {
+                t.traceBegin("MakeIncrementalServiceReady");
+                setIncrementalServiceSystemReady(mIncrementalServiceHandle);
+                t.traceEnd();
+            }
         }, t);
 
         t.traceEnd(); // startOtherServices
@@ -2502,4 +2527,29 @@
         context.startServiceAsUser(intent, UserHandle.SYSTEM);
         windowManager.onSystemUiStarted();
     }
+
+    /**
+     * Handle the serious errors during early system boot, used by {@link Log} via
+     * {@link com.android.internal.os.RuntimeInit}.
+     */
+    private static boolean handleEarlySystemWtf(final IBinder app, final String tag, boolean system,
+            final ApplicationErrorReport.ParcelableCrashInfo crashInfo, int immediateCallerPid) {
+        final String processName = "system_server";
+        final int myPid = myPid();
+
+        com.android.server.am.EventLogTags.writeAmWtf(UserHandle.getUserId(SYSTEM_UID), myPid,
+                processName, -1, tag, crashInfo.exceptionMessage);
+
+        FrameworkStatsLog.write(FrameworkStatsLog.WTF_OCCURRED, SYSTEM_UID, tag, processName,
+                myPid, ServerProtoEnums.SYSTEM_SERVER);
+
+        synchronized (SystemServer.class) {
+            if (sPendingWtfs == null) {
+                sPendingWtfs = new LinkedList<>();
+            }
+            sPendingWtfs.add(new Pair<>(tag, crashInfo));
+        }
+        return false;
+    }
+
 }
diff --git a/services/net/Android.bp b/services/net/Android.bp
index 9f29799..bb5409b 100644
--- a/services/net/Android.bp
+++ b/services/net/Android.bp
@@ -41,6 +41,7 @@
     sdk_version: "module_current",
     libs: [
         "unsupportedappusage",
+        "framework-wifi-util-lib",
     ],
     static_libs: [
         "dnsresolver_aidl_interface-V2-java",
diff --git a/services/people/java/com/android/server/people/data/ConversationInfo.java b/services/people/java/com/android/server/people/data/ConversationInfo.java
index dc3fa2a..27fa36b 100644
--- a/services/people/java/com/android/server/people/data/ConversationInfo.java
+++ b/services/people/java/com/android/server/people/data/ConversationInfo.java
@@ -62,6 +62,8 @@
 
     private static final int FLAG_DEMOTED = 1 << 6;
 
+    private static final int FLAG_NOTIFICATION_SETTING_CHANGED = 1 << 7;
+
     @IntDef(flag = true, prefix = {"FLAG_"}, value = {
             FLAG_IMPORTANT,
             FLAG_NOTIFICATION_SILENCED,
@@ -70,6 +72,7 @@
             FLAG_PERSON_BOT,
             FLAG_CONTACT_STARRED,
             FLAG_DEMOTED,
+            FLAG_NOTIFICATION_SETTING_CHANGED,
     })
     @Retention(RetentionPolicy.SOURCE)
     private @interface ConversationFlags {
@@ -185,6 +188,11 @@
         return hasConversationFlags(FLAG_CONTACT_STARRED);
     }
 
+    /** Whether the conversation's notification setting has ever been changed by the user. */
+    boolean isNotificationSettingChanged() {
+        return hasConversationFlags(FLAG_NOTIFICATION_SETTING_CHANGED);
+    }
+
     @Override
     public boolean equals(Object obj) {
         if (this == obj) {
@@ -491,6 +499,10 @@
             return setConversationFlag(FLAG_CONTACT_STARRED, value);
         }
 
+        Builder setNotificationSettingChanged(boolean value) {
+            return setConversationFlag(FLAG_NOTIFICATION_SETTING_CHANGED, value);
+        }
+
         private Builder setConversationFlag(@ConversationFlags int flags, boolean value) {
             if (value) {
                 return addConversationFlags(flags);
diff --git a/services/people/java/com/android/server/people/data/DataManager.java b/services/people/java/com/android/server/people/data/DataManager.java
index c87ece2..8e1141d 100644
--- a/services/people/java/com/android/server/people/data/DataManager.java
+++ b/services/people/java/com/android/server/people/data/DataManager.java
@@ -16,6 +16,8 @@
 
 package com.android.server.people.data;
 
+import static android.app.NotificationChannel.USER_LOCKED_ALLOW_BUBBLE;
+
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.UserIdInt;
@@ -56,6 +58,7 @@
 import android.service.notification.StatusBarNotification;
 import android.telecom.TelecomManager;
 import android.text.format.DateUtils;
+import android.util.ArrayMap;
 import android.util.ArraySet;
 import android.util.Slog;
 import android.util.SparseArray;
@@ -67,6 +70,7 @@
 import com.android.internal.telephony.SmsApplication;
 import com.android.server.LocalServices;
 import com.android.server.notification.NotificationManagerInternal;
+import com.android.server.notification.ShortcutHelper;
 
 import java.util.ArrayList;
 import java.util.Collections;
@@ -481,7 +485,8 @@
     }
 
     @Nullable
-    private EventHistoryImpl getEventHistoryIfEligible(StatusBarNotification sbn) {
+    private PackageData getPackageIfConversationExists(StatusBarNotification sbn,
+            Consumer<ConversationInfo> conversationConsumer) {
         Notification notification = sbn.getNotification();
         String shortcutId = notification.getShortcutId();
         if (shortcutId == null) {
@@ -489,16 +494,16 @@
         }
         PackageData packageData = getPackage(sbn.getPackageName(),
                 sbn.getUser().getIdentifier());
-        if (packageData == null
-                || packageData.getConversationStore().getConversation(shortcutId) == null) {
+        if (packageData == null) {
             return null;
         }
-        return packageData.getEventStore().getOrCreateEventHistory(
-                EventStore.CATEGORY_SHORTCUT_BASED, shortcutId);
-    }
-
-    private boolean isPersonShortcut(@NonNull ShortcutInfo shortcutInfo) {
-        return shortcutInfo.getPersons() != null && shortcutInfo.getPersons().length != 0;
+        ConversationInfo conversationInfo =
+                packageData.getConversationStore().getConversation(shortcutId);
+        if (conversationInfo == null) {
+            return null;
+        }
+        conversationConsumer.accept(conversationInfo);
+        return packageData;
     }
 
     @VisibleForTesting
@@ -712,7 +717,8 @@
                 @NonNull List<ShortcutInfo> shortcuts, @NonNull UserHandle user) {
             mInjector.getBackgroundExecutor().execute(() -> {
                 for (ShortcutInfo shortcut : shortcuts) {
-                    if (isPersonShortcut(shortcut)) {
+                    if (ShortcutHelper.isConversationShortcut(
+                            shortcut, mShortcutServiceInternal, user.getIdentifier())) {
                         addOrUpdateConversationInfo(shortcut);
                     }
                 }
@@ -747,10 +753,19 @@
     /** Listener for the notifications and their settings changes. */
     private class NotificationListener extends NotificationListenerService {
 
+        // Conversation shortcut ID -> Number of active notifications
+        private final Map<String, Integer> mActiveNotifCounts = new ArrayMap<>();
+
         @Override
         public void onNotificationPosted(StatusBarNotification sbn) {
-            EventHistoryImpl eventHistory = getEventHistoryIfEligible(sbn);
-            if (eventHistory != null) {
+            String shortcutId = sbn.getNotification().getShortcutId();
+            PackageData packageData = getPackageIfConversationExists(sbn, conversationInfo -> {
+                mActiveNotifCounts.merge(shortcutId, 1, Integer::sum);
+            });
+
+            if (packageData != null) {
+                EventHistoryImpl eventHistory = packageData.getEventStore().getOrCreateEventHistory(
+                        EventStore.CATEGORY_SHORTCUT_BASED, shortcutId);
                 eventHistory.addEvent(new Event(sbn.getPostTime(), Event.TYPE_NOTIFICATION_POSTED));
             }
         }
@@ -758,13 +773,32 @@
         @Override
         public void onNotificationRemoved(StatusBarNotification sbn, RankingMap rankingMap,
                 int reason) {
-            if (reason != REASON_CLICK) {
+            String shortcutId = sbn.getNotification().getShortcutId();
+            PackageData packageData = getPackageIfConversationExists(sbn, conversationInfo -> {
+                int count = mActiveNotifCounts.getOrDefault(shortcutId, 0) - 1;
+                if (count <= 0) {
+                    mActiveNotifCounts.remove(sbn.getNotification().getShortcutId());
+                    // The shortcut was cached by Notification Manager synchronously when the
+                    // associated notification was posted. Uncache it here when all the associated
+                    // notifications are removed.
+                    if (conversationInfo.isShortcutCached()
+                            && !conversationInfo.isNotificationSettingChanged()) {
+                        int userId = sbn.getUser().getIdentifier();
+                        mShortcutServiceInternal.uncacheShortcuts(userId,
+                                mContext.getPackageName(), sbn.getPackageName(),
+                                Collections.singletonList(conversationInfo.getShortcutId()),
+                                userId);
+                    }
+                } else {
+                    mActiveNotifCounts.put(shortcutId, count);
+                }
+            });
+
+            if (reason != REASON_CLICK || packageData == null) {
                 return;
             }
-            EventHistoryImpl eventHistory = getEventHistoryIfEligible(sbn);
-            if (eventHistory == null) {
-                return;
-            }
+            EventHistoryImpl eventHistory = packageData.getEventStore().getOrCreateEventHistory(
+                    EventStore.CATEGORY_SHORTCUT_BASED, shortcutId);
             long currentTime = System.currentTimeMillis();
             eventHistory.addEvent(new Event(currentTime, Event.TYPE_NOTIFICATION_OPENED));
         }
@@ -782,7 +816,16 @@
             if (conversationInfo == null) {
                 return;
             }
+            boolean isNotificationSettingChanged =
+                    conversationInfo.isImportant() != channel.isImportantConversation()
+                            || conversationInfo.isDemoted() != channel.isDemoted()
+                            || channel.hasUserSetImportance()
+                            || (channel.getUserLockedFields() & USER_LOCKED_ALLOW_BUBBLE) != 0;
             ConversationInfo.Builder builder = new ConversationInfo.Builder(conversationInfo);
+            if (modificationType == NOTIFICATION_CHANNEL_OR_GROUP_UPDATED
+                    && isNotificationSettingChanged) {
+                builder.setNotificationSettingChanged(true);
+            }
             switch (modificationType) {
                 case NOTIFICATION_CHANNEL_OR_GROUP_ADDED:
                 case NOTIFICATION_CHANNEL_OR_GROUP_UPDATED:
@@ -804,15 +847,6 @@
                     break;
             }
             conversationStore.addOrUpdate(builder.build());
-
-            if (modificationType == NOTIFICATION_CHANNEL_OR_GROUP_UPDATED
-                    && conversationInfo.isShortcutLongLived()
-                    && !conversationInfo.isShortcutCached()) {
-                mShortcutServiceInternal.cacheShortcuts(user.getIdentifier(),
-                        mContext.getPackageName(), pkg,
-                        Collections.singletonList(conversationInfo.getShortcutId()),
-                        user.getIdentifier());
-            }
         }
     }
 
diff --git a/services/robotests/backup/src/com/android/server/backup/UserBackupManagerServiceTest.java b/services/robotests/backup/src/com/android/server/backup/UserBackupManagerServiceTest.java
index 8b2f15c..fea61aa 100644
--- a/services/robotests/backup/src/com/android/server/backup/UserBackupManagerServiceTest.java
+++ b/services/robotests/backup/src/com/android/server/backup/UserBackupManagerServiceTest.java
@@ -85,6 +85,7 @@
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.io.StringWriter;
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -519,6 +520,23 @@
         expectThrows(SecurityException.class, backupManagerService::getCurrentTransportComponent);
     }
 
+    /**
+     * Test verifying that {@link UserBackupManagerService#excludeKeysFromRestore(String, List)}
+     * throws a {@link SecurityException} if the caller does not have backup permission.
+     */
+    @Test
+    public void testExcludeKeysFromRestore_withoutPermission() throws Exception {
+        mShadowContext.denyPermissions(android.Manifest.permission.BACKUP);
+        UserBackupManagerService backupManagerService = createUserBackupManagerServiceAndRunTasks();
+
+        expectThrows(
+                SecurityException.class,
+                () ->
+                        backupManagerService.excludeKeysFromRestore(
+                                PACKAGE_1,
+                                new ArrayList<String>(){}));
+    }
+
     /* Tests for updating transport attributes */
 
     private static final int PACKAGE_UID = 10;
diff --git a/services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java b/services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java
index 7a175ca1..2983d58 100644
--- a/services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java
+++ b/services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java
@@ -541,7 +541,7 @@
         doReturn(new ArrayMap<IBinder, ArrayList<ConnectionRecord>>()).when(s).getConnections();
         s.startRequested = true;
         s.lastActivity = SystemClock.uptimeMillis();
-        app.services.add(s);
+        app.startService(s);
         sService.mWakefulness = PowerManagerInternal.WAKEFULNESS_AWAKE;
         sService.mOomAdjuster.updateOomAdjLocked(app, false, OomAdjuster.OOM_ADJ_REASON_NONE);
 
@@ -585,7 +585,7 @@
         doReturn(new ArrayMap<IBinder, ArrayList<ConnectionRecord>>()).when(s).getConnections();
         s.startRequested = true;
         s.lastActivity = SystemClock.uptimeMillis();
-        app.services.add(s);
+        app.startService(s);
         sService.mWakefulness = PowerManagerInternal.WAKEFULNESS_AWAKE;
         sService.mOomAdjuster.updateOomAdjLocked(app, false, OomAdjuster.OOM_ADJ_REASON_NONE);
 
@@ -1593,7 +1593,7 @@
         s.app = app3;
         setFieldValue(ServiceRecord.class, s, "connections",
                 new ArrayMap<IBinder, ArrayList<ConnectionRecord>>());
-        app3.services.add(s);
+        app3.startService(s);
         doCallRealMethod().when(s).getConnections();
         s.startRequested = true;
         s.lastActivity = now;
@@ -1698,7 +1698,7 @@
             record.app = service;
             setFieldValue(ServiceRecord.class, record, "connections",
                     new ArrayMap<IBinder, ArrayList<ConnectionRecord>>());
-            service.services.add(record);
+            service.startService(record);
             doCallRealMethod().when(record).getConnections();
         }
         AppBindRecord binding = new AppBindRecord(record, null, client);
diff --git a/services/tests/servicestests/AndroidManifest.xml b/services/tests/servicestests/AndroidManifest.xml
index 109c119..270a3b5 100644
--- a/services/tests/servicestests/AndroidManifest.xml
+++ b/services/tests/servicestests/AndroidManifest.xml
@@ -78,6 +78,7 @@
     <uses-permission android:name="android.permission.DUMP"/>
     <uses-permission android:name="android.permission.READ_DREAM_STATE"/>
     <uses-permission android:name="android.permission.WRITE_DREAM_STATE"/>
+    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
 
     <!-- Uses API introduced in O (26) -->
     <uses-sdk android:minSdkVersion="1"
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/SystemActionPerformerTest.java b/services/tests/servicestests/src/com/android/server/accessibility/SystemActionPerformerTest.java
index 3352177..064e348 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/SystemActionPerformerTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/SystemActionPerformerTest.java
@@ -16,6 +16,8 @@
 
 package com.android.server.accessibility;
 
+import static android.view.WindowManager.ScreenshotSource.SCREENSHOT_ACCESSIBILITY_ACTIONS;
+
 import static org.hamcrest.Matchers.hasItem;
 import static org.hamcrest.Matchers.is;
 import static org.hamcrest.Matchers.not;
@@ -308,7 +310,7 @@
                 AccessibilityService.GLOBAL_ACTION_TAKE_SCREENSHOT);
         verify(mMockScreenshotHelper).takeScreenshot(
                 eq(android.view.WindowManager.TAKE_SCREENSHOT_FULLSCREEN), anyBoolean(),
-                anyBoolean(), any(Handler.class), any());
+                anyBoolean(), eq(SCREENSHOT_ACCESSIBILITY_ACTIONS), any(Handler.class), any());
     }
 
     // PendingIntent is a final class and cannot be mocked. So we are using this
diff --git a/services/tests/servicestests/src/com/android/server/adb/AdbDebuggingManagerTest.java b/services/tests/servicestests/src/com/android/server/adb/AdbDebuggingManagerTest.java
index 757a2b1..cffff66 100644
--- a/services/tests/servicestests/src/com/android/server/adb/AdbDebuggingManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/adb/AdbDebuggingManagerTest.java
@@ -721,6 +721,98 @@
                 isKeyInFile(TEST_KEY_2, mAdbKeyFile));
     }
 
+    @Test
+    public void testIsValidMdnsServiceName() {
+        // Longer than 15 characters
+        assertFalse(isValidMdnsServiceName("abcd1234abcd1234"));
+
+        // Contains invalid characters
+        assertFalse(isValidMdnsServiceName("a*a"));
+        assertFalse(isValidMdnsServiceName("a_a"));
+        assertFalse(isValidMdnsServiceName("_a"));
+
+        // Does not begin or end with letter or digit
+        assertFalse(isValidMdnsServiceName(""));
+        assertFalse(isValidMdnsServiceName("-"));
+        assertFalse(isValidMdnsServiceName("-a"));
+        assertFalse(isValidMdnsServiceName("-1"));
+        assertFalse(isValidMdnsServiceName("a-"));
+        assertFalse(isValidMdnsServiceName("1-"));
+
+        // Contains consecutive hyphens
+        assertFalse(isValidMdnsServiceName("a--a"));
+
+        // Does not contain at least one letter
+        assertFalse(isValidMdnsServiceName("1"));
+        assertFalse(isValidMdnsServiceName("12"));
+        assertFalse(isValidMdnsServiceName("1-2"));
+
+        // letter not within [a-zA-Z]
+        assertFalse(isValidMdnsServiceName("aés"));
+
+        // Some valid names
+        assertTrue(isValidMdnsServiceName("a"));
+        assertTrue(isValidMdnsServiceName("a1"));
+        assertTrue(isValidMdnsServiceName("1A"));
+        assertTrue(isValidMdnsServiceName("aZ"));
+        assertTrue(isValidMdnsServiceName("a-Z"));
+        assertTrue(isValidMdnsServiceName("a-b-Z"));
+        assertTrue(isValidMdnsServiceName("abc-def-123-456"));
+    }
+
+    @Test
+    public void testPairingThread_MdnsServiceName_RFC6335() {
+        assertTrue(isValidMdnsServiceName(AdbDebuggingManager.PairingThread.SERVICE_PROTOCOL));
+    }
+
+    private boolean isValidMdnsServiceName(String name) {
+        // The rules for Service Names [RFC6335] state that they may be no more
+        // than fifteen characters long (not counting the mandatory underscore),
+        // consisting of only letters, digits, and hyphens, must begin and end
+        // with a letter or digit, must not contain consecutive hyphens, and
+        // must contain at least one letter.
+        // No more than 15 characters long
+        final int len = name.length();
+        if (name.isEmpty() || len > 15) {
+            return false;
+        }
+
+        boolean hasAtLeastOneLetter = false;
+        boolean sawHyphen = false;
+        for (int i = 0; i < len; ++i) {
+            // Must contain at least one letter
+            // Only contains letters, digits and hyphens
+            char c = name.charAt(i);
+            if (c == '-') {
+                // Cannot be at beginning or end
+                if (i == 0 || i == len - 1) {
+                    return false;
+                }
+                if (sawHyphen) {
+                    // Consecutive hyphen found
+                    return false;
+                }
+                sawHyphen = true;
+                continue;
+            }
+
+            sawHyphen = false;
+            if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
+                hasAtLeastOneLetter = true;
+                continue;
+            }
+
+            if (c >= '0' && c <= '9') {
+                continue;
+            }
+
+            // Invalid character
+            return false;
+        }
+
+        return hasAtLeastOneLetter;
+    }
+
     /**
      * Runs an adb test with the provided configuration.
      *
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/am/ActivityManagerServiceTest.java
index f8bcff5..6fe259e 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityManagerServiceTest.java
@@ -45,6 +45,8 @@
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.verifyNoMoreInteractions;
 import static org.mockito.Mockito.verifyZeroInteractions;
@@ -54,9 +56,11 @@
 import android.app.AppOpsManager;
 import android.app.IApplicationThread;
 import android.app.IUidObserver;
+import android.content.ComponentName;
 import android.content.Context;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
+import android.content.pm.PackageManagerInternal;
 import android.os.Handler;
 import android.os.HandlerThread;
 import android.os.IBinder;
@@ -70,6 +74,7 @@
 import androidx.test.filters.MediumTest;
 import androidx.test.filters.SmallTest;
 
+import com.android.server.LocalServices;
 import com.android.server.am.ProcessList.IsolatedUidRange;
 import com.android.server.am.ProcessList.IsolatedUidRangeAllocator;
 import com.android.server.appop.AppOpsService;
@@ -77,6 +82,7 @@
 
 import org.junit.After;
 import org.junit.Before;
+import org.junit.BeforeClass;
 import org.junit.Rule;
 import org.junit.Test;
 import org.mockito.Mock;
@@ -115,6 +121,18 @@
         UidRecord.CHANGE_ACTIVE
     };
 
+    private static PackageManagerInternal sPackageManagerInternal;
+
+    @BeforeClass
+    public static void setUpOnce() {
+        sPackageManagerInternal = mock(PackageManagerInternal.class);
+        doReturn(new ComponentName("", "")).when(sPackageManagerInternal)
+                .getSystemUiServiceComponent();
+        // Remove stale instance of PackageManagerInternal if there is any
+        LocalServices.removeServiceForTest(PackageManagerInternal.class);
+        LocalServices.addService(PackageManagerInternal.class, sPackageManagerInternal);
+    }
+
     @Rule public ServiceThreadRule mServiceThreadRule = new ServiceThreadRule();
 
     private Context mContext = getInstrumentation().getTargetContext();
@@ -258,8 +276,11 @@
         uidRec.hasInternetPermission = true;
         mAms.mProcessList.mActiveUids.put(uid, uidRec);
 
-        final ProcessRecord appRec = new ProcessRecord(mAms, new ApplicationInfo(), TAG, uid);
-        appRec.thread = Mockito.mock(IApplicationThread.class);
+        ApplicationInfo info = new ApplicationInfo();
+        info.packageName = "";
+
+        final ProcessRecord appRec = new ProcessRecord(mAms, info, TAG, uid);
+        appRec.thread = mock(IApplicationThread.class);
         mAms.mProcessList.mLruProcesses.add(appRec);
 
         return uidRec;
@@ -497,7 +518,7 @@
         };
         final IUidObserver[] observers = new IUidObserver.Stub[changesToObserve.length];
         for (int i = 0; i < observers.length; ++i) {
-            observers[i] = Mockito.mock(IUidObserver.Stub.class);
+            observers[i] = mock(IUidObserver.Stub.class);
             when(observers[i].asBinder()).thenReturn((IBinder) observers[i]);
             mAms.registerUidObserver(observers[i], changesToObserve[i] /* which */,
                     ActivityManager.PROCESS_STATE_UNKNOWN /* cutpoint */, null /* caller */);
@@ -610,7 +631,7 @@
      */
     @Test
     public void testDispatchUidChanges_procStateCutpoint() throws RemoteException {
-        final IUidObserver observer = Mockito.mock(IUidObserver.Stub.class);
+        final IUidObserver observer = mock(IUidObserver.Stub.class);
 
         when(observer.asBinder()).thenReturn((IBinder) observer);
         mAms.registerUidObserver(observer, ActivityManager.UID_OBSERVER_PROCSTATE /* which */,
@@ -704,7 +725,7 @@
         assertEquals("No observers registered, so validateUids should be empty",
                 0, mAms.mValidateUids.size());
 
-        final IUidObserver observer = Mockito.mock(IUidObserver.Stub.class);
+        final IUidObserver observer = mock(IUidObserver.Stub.class);
         when(observer.asBinder()).thenReturn((IBinder) observer);
         mAms.registerUidObserver(observer, 0, 0, null);
         // Verify that when observers are registered, then validateUids is correctly updated.
diff --git a/services/tests/servicestests/src/com/android/server/am/OomAdjusterTests.java b/services/tests/servicestests/src/com/android/server/am/OomAdjusterTests.java
index d12d804..b2d7177 100644
--- a/services/tests/servicestests/src/com/android/server/am/OomAdjusterTests.java
+++ b/services/tests/servicestests/src/com/android/server/am/OomAdjusterTests.java
@@ -22,12 +22,15 @@
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
+import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.spy;
 
 import android.app.ActivityManager;
 import android.app.usage.UsageStatsManagerInternal;
+import android.content.ComponentName;
 import android.content.Context;
+import android.content.pm.PackageManagerInternal;
 
 import com.android.server.LocalServices;
 import com.android.server.wm.ActivityTaskManagerService;
@@ -45,6 +48,7 @@
 public class OomAdjusterTests {
     private static Context sContext;
     private static ActivityManagerService sService;
+    private static PackageManagerInternal sPackageManagerInternal;
 
     private ProcessRecord mProcessRecord;
 
@@ -56,6 +60,13 @@
     public static void setUpOnce() {
         sContext = getInstrumentation().getTargetContext();
 
+        sPackageManagerInternal = mock(PackageManagerInternal.class);
+        doReturn(new ComponentName("", "")).when(sPackageManagerInternal)
+                .getSystemUiServiceComponent();
+        // Remove stale instance of PackageManagerInternal if there is any
+        LocalServices.removeServiceForTest(PackageManagerInternal.class);
+        LocalServices.addService(PackageManagerInternal.class, sPackageManagerInternal);
+
         // We need to run with dexmaker share class loader to make use of
         // ActivityTaskManagerService from wm package.
         runWithDexmakerShareClassLoader(() -> {
diff --git a/services/tests/servicestests/src/com/android/server/audio/AudioDeviceBrokerTest.java b/services/tests/servicestests/src/com/android/server/audio/AudioDeviceBrokerTest.java
index 73a191d..22f8b9c 100644
--- a/services/tests/servicestests/src/com/android/server/audio/AudioDeviceBrokerTest.java
+++ b/services/tests/servicestests/src/com/android/server/audio/AudioDeviceBrokerTest.java
@@ -66,7 +66,7 @@
         mContext = InstrumentationRegistry.getTargetContext();
 
         mMockAudioService = mock(AudioService.class);
-        mSpyAudioSystem = spy(AudioSystemAdapter.getAlwaysOkAdapter());
+        mSpyAudioSystem = spy(AudioSystemAdapter.getConfigurableAdapter());
         mSpyDevInventory = spy(new AudioDeviceInventory(mSpyAudioSystem));
         mAudioDeviceBroker = new AudioDeviceBroker(mContext, mMockAudioService, mSpyDevInventory);
         mSpyDevInventory.setDeviceBroker(mAudioDeviceBroker);
diff --git a/services/tests/servicestests/src/com/android/server/audio/AudioServiceTest.java b/services/tests/servicestests/src/com/android/server/audio/AudioServiceTest.java
new file mode 100644
index 0000000..6185ae6
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/audio/AudioServiceTest.java
@@ -0,0 +1,115 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.server.audio;
+
+import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
+import android.content.Context;
+import android.os.Looper;
+import android.os.UserHandle;
+import android.util.Log;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.MediumTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Spy;
+
+@MediumTest
+@RunWith(AndroidJUnit4.class)
+public class AudioServiceTest {
+    private static final String TAG = "AudioServiceTest";
+
+    private static final int MAX_MESSAGE_HANDLING_DELAY_MS = 100;
+
+    private Context mContext;
+    private AudioSystemAdapter mAudioSystem;
+    @Spy private SystemServerAdapter mSpySystemServer;
+    // the class being unit-tested here
+    private AudioService mAudioService;
+
+    private static boolean sLooperPrepared = false;
+
+    @Before
+    public void setUp() throws Exception {
+        if (!sLooperPrepared) {
+            Looper.prepare();
+            sLooperPrepared = true;
+        }
+        mContext = InstrumentationRegistry.getTargetContext();
+        mAudioSystem = AudioSystemAdapter.getConfigurableAdapter();
+        mSpySystemServer = spy(SystemServerAdapter.getNoOpAdapter());
+        mAudioService = new AudioService(mContext, mAudioSystem, mSpySystemServer);
+    }
+
+    /**
+     * Test muting the mic reports the expected value, and the corresponding intent was fired
+     * @throws Exception
+     */
+    @Test
+    public void testMuteMicrophone() throws Exception {
+        Log.i(TAG, "running testMuteMicrophone");
+        Assert.assertNotNull(mAudioService);
+        final AudioSystemAdapter.AudioSystemConfigurableAdapter testAudioSystem =
+                (AudioSystemAdapter.AudioSystemConfigurableAdapter) mAudioSystem;
+        testAudioSystem.configureMuteMicrophoneToFail(false);
+        for (boolean muted : new boolean[] { true, false}) {
+            testAudioSystem.configureIsMicrophoneMuted(!muted);
+            mAudioService.setMicrophoneMute(muted, mContext.getOpPackageName(),
+                    UserHandle.getCallingUserId());
+            Assert.assertEquals("mic mute reporting wrong value",
+                    muted, mAudioService.isMicrophoneMuted());
+            // verify the intent for mic mute changed is supposed to be fired
+            Thread.sleep(MAX_MESSAGE_HANDLING_DELAY_MS);
+            verify(mSpySystemServer, times(1))
+                    .sendMicrophoneMuteChangedIntent();
+            reset(mSpySystemServer);
+        }
+    }
+
+    /**
+     * Test muting the mic with simulated failure reports the expected value, and the corresponding
+     * intent was fired
+     * @throws Exception
+     */
+    @Test
+    public void testMuteMicrophoneWhenFail() throws Exception {
+        Log.i(TAG, "running testMuteMicrophoneWhenFail");
+        Assert.assertNotNull(mAudioService);
+        final AudioSystemAdapter.AudioSystemConfigurableAdapter testAudioSystem =
+                (AudioSystemAdapter.AudioSystemConfigurableAdapter) mAudioSystem;
+        testAudioSystem.configureMuteMicrophoneToFail(true);
+        for (boolean muted : new boolean[] { true, false}) {
+            testAudioSystem.configureIsMicrophoneMuted(!muted);
+            mAudioService.setMicrophoneMute(muted, mContext.getOpPackageName(),
+                    UserHandle.getCallingUserId());
+            Assert.assertEquals("mic mute reporting wrong value",
+                    !muted, mAudioService.isMicrophoneMuted());
+            // verify the intent for mic mute changed is supposed to be fired
+            Thread.sleep(MAX_MESSAGE_HANDLING_DELAY_MS);
+            verify(mSpySystemServer, times(1))
+                    .sendMicrophoneMuteChangedIntent();
+            reset(mSpySystemServer);
+        }
+    }
+}
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceMigrationTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceMigrationTest.java
index 74e7f8c..a0b9d9d 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceMigrationTest.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceMigrationTest.java
@@ -62,6 +62,10 @@
 
         mContext = getContext();
 
+        // Make createContextAsUser to work.
+        mContext.packageName = "com.android.frameworks.servicestests";
+        getServices().addPackageContext(UserHandle.of(0), mContext);
+
         when(getServices().packageManager.hasSystemFeature(eq(PackageManager.FEATURE_DEVICE_ADMIN)))
                 .thenReturn(true);
     }
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceTestable.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceTestable.java
index 3e5c21c..cbe49eb 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceTestable.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceTestable.java
@@ -124,6 +124,9 @@
         // Key is a pair of uri and userId
         private final Map<Pair<Uri, Integer>, ContentObserver> mContentObservers = new ArrayMap<>();
 
+        // Used as an override when set to nonzero.
+        private long mCurrentTimeMillis = 0;
+
         public MockInjector(MockSystemServices services, DpmMockContext context) {
             super(context);
             this.services = services;
@@ -470,5 +473,19 @@
 
         @Override
         public void runCryptoSelfTest() {}
+
+        @Override
+        public String[] getPersonalAppsForSuspension(int userId) {
+            return new String[]{};
+        }
+
+        public void setSystemCurrentTimeMillis(long value) {
+            mCurrentTimeMillis = value;
+        }
+
+        @Override
+        public long systemCurrentTimeMillis() {
+            return mCurrentTimeMillis != 0 ? mCurrentTimeMillis : System.currentTimeMillis();
+        }
     }
 }
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
index fe224ce..b042e77 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
@@ -44,6 +44,7 @@
 import static org.mockito.Matchers.isNull;
 import static org.mockito.Mockito.atLeast;
 import static org.mockito.Mockito.atMost;
+import static org.mockito.Mockito.clearInvocations;
 import static org.mockito.Mockito.doAnswer;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.never;
@@ -62,6 +63,7 @@
 import android.app.Activity;
 import android.app.AppOpsManager;
 import android.app.Notification;
+import android.app.PendingIntent;
 import android.app.admin.DeviceAdminReceiver;
 import android.app.admin.DevicePolicyManager;
 import android.app.admin.DevicePolicyManagerInternal;
@@ -96,6 +98,7 @@
 import androidx.test.filters.SmallTest;
 
 import com.android.internal.R;
+import com.android.internal.messages.nano.SystemMessageProto;
 import com.android.internal.widget.LockscreenCredential;
 import com.android.server.LocalServices;
 import com.android.server.SystemService;
@@ -103,6 +106,7 @@
 
 import org.hamcrest.BaseMatcher;
 import org.hamcrest.Description;
+import org.hamcrest.Matcher;
 import org.mockito.Mockito;
 import org.mockito.internal.util.collections.Sets;
 import org.mockito.stubbing.Answer;
@@ -181,6 +185,20 @@
             "wQ==\n" +
             "-----END CERTIFICATE-----\n";
 
+    // Constants for testing setManagedProfileMaximumTimeOff:
+    // Profile maximum time off value
+    private static final long PROFILE_OFF_TIMEOUT = TimeUnit.DAYS.toMillis(5);
+    // Synthetic time at the beginning of test.
+    private static final long PROFILE_OFF_START = 1;
+    // Time when warning notification should be posted,
+    private static final long PROFILE_OFF_WARNING_TIME =
+            PROFILE_OFF_START + PROFILE_OFF_TIMEOUT - TimeUnit.DAYS.toMillis(1);
+    // Time when the apps should be suspended
+    private static final long PROFILE_OFF_DEADLINE = PROFILE_OFF_START + PROFILE_OFF_TIMEOUT;
+    // Notification titles for setManagedProfileMaximumTimeOff tests:
+    private static final String PROFILE_OFF_WARNING_TITLE = "suspended_tomorrow";
+    private static final String PROFILE_OFF_SUSPENDED_TITLE = "suspended";
+
     @Override
     protected void setUp() throws Exception {
         super.setUp();
@@ -196,6 +214,11 @@
                         anyInt(),
                         any(UserHandle.class));
 
+        // Make createContextAsUser to work.
+        mContext.packageName = "com.android.frameworks.servicestests";
+        getServices().addPackageContext(UserHandle.of(0), mContext);
+        getServices().addPackageContext(UserHandle.of(DpmMockContext.CALLER_USER_HANDLE), mContext);
+
         // By default, pretend all users are running and unlocked.
         when(getServices().userManager.isUserUnlocked(anyInt())).thenReturn(true);
 
@@ -1553,20 +1576,7 @@
         dpms.approveCaCert(fourCerts.getList().get(1), userId, true);
         // a notification should be shown saying that there are two certificates left to approve.
         verify(getServices().notificationManager, timeout(1000))
-                .notifyAsUser(anyString(), anyInt(), argThat(
-                        new BaseMatcher<Notification>() {
-                            @Override
-                            public boolean matches(Object item) {
-                                final Notification noti = (Notification) item;
-                                return TEST_STRING.equals(
-                                        noti.extras.getString(Notification.EXTRA_TITLE));
-                            }
-                            @Override
-                            public void describeTo(Description description) {
-                                description.appendText(
-                                        "Notification{title=\"" + TEST_STRING + "\"}");
-                            }
-                        }), eq(user));
+                .notifyAsUser(anyString(), anyInt(), argThat(hasTitle(TEST_STRING)), eq(user));
     }
 
     /**
@@ -1986,29 +1996,32 @@
             Sets.newSet(
                     UserManager.DISALLOW_CONFIG_DATE_TIME,
                     UserManager.DISALLOW_ADD_USER,
-                    UserManager.DISALLOW_BLUETOOTH,
                     UserManager.DISALLOW_BLUETOOTH_SHARING,
-                    UserManager.DISALLOW_CONFIG_BLUETOOTH,
                     UserManager.DISALLOW_CONFIG_CELL_BROADCASTS,
-                    UserManager.DISALLOW_CONFIG_LOCATION,
                     UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS,
                     UserManager.DISALLOW_CONFIG_PRIVATE_DNS,
                     UserManager.DISALLOW_CONFIG_TETHERING,
-                    UserManager.DISALLOW_CONFIG_WIFI,
-                    UserManager.DISALLOW_CONTENT_CAPTURE,
-                    UserManager.DISALLOW_CONTENT_SUGGESTIONS,
                     UserManager.DISALLOW_DATA_ROAMING,
-                    UserManager.DISALLOW_DEBUGGING_FEATURES,
                     UserManager.DISALLOW_SAFE_BOOT,
-                    UserManager.DISALLOW_SHARE_LOCATION,
                     UserManager.DISALLOW_SMS,
                     UserManager.DISALLOW_USB_FILE_TRANSFER,
                     UserManager.DISALLOW_AIRPLANE_MODE,
                     UserManager.DISALLOW_MOUNT_PHYSICAL_MEDIA,
-                    UserManager.DISALLOW_OUTGOING_CALLS,
                     UserManager.DISALLOW_UNMUTE_MICROPHONE
             );
 
+    private static final Set<String> PROFILE_OWNER_ORGANIZATION_OWNED_LOCAL_RESTRICTIONS =
+            Sets.newSet(
+                    UserManager.DISALLOW_CONFIG_BLUETOOTH,
+                    UserManager.DISALLOW_CONFIG_LOCATION,
+                    UserManager.DISALLOW_CONFIG_WIFI,
+                    UserManager.DISALLOW_CONTENT_CAPTURE,
+                    UserManager.DISALLOW_CONTENT_SUGGESTIONS,
+                    UserManager.DISALLOW_DEBUGGING_FEATURES,
+                    UserManager.DISALLOW_SHARE_LOCATION,
+                    UserManager.DISALLOW_OUTGOING_CALLS
+            );
+
     public void testSetUserRestriction_asPoOfOrgOwnedDevice() throws Exception {
         final int MANAGED_PROFILE_ADMIN_UID =
                 UserHandle.getUid(DpmMockContext.CALLER_USER_HANDLE, DpmMockContext.SYSTEM_UID);
@@ -2021,7 +2034,10 @@
                 .thenReturn(new UserInfo(UserHandle.USER_SYSTEM, "user system", 0));
 
         for (String restriction : PROFILE_OWNER_ORGANIZATION_OWNED_GLOBAL_RESTRICTIONS) {
-            addAndRemoveUserRestrictionOnParentDpm(restriction);
+            addAndRemoveGlobalUserRestrictionOnParentDpm(restriction);
+        }
+        for (String restriction : PROFILE_OWNER_ORGANIZATION_OWNED_LOCAL_RESTRICTIONS) {
+            addAndRemoveLocalUserRestrictionOnParentDpm(restriction);
         }
 
         parentDpm.setCameraDisabled(admin1, true);
@@ -2047,7 +2063,7 @@
         reset(getServices().userManagerInternal);
     }
 
-    private void addAndRemoveUserRestrictionOnParentDpm(String restriction) {
+    private void addAndRemoveGlobalUserRestrictionOnParentDpm(String restriction) {
         parentDpm.addUserRestriction(admin1, restriction);
         verify(getServices().userManagerInternal).setDevicePolicyUserRestrictions(
                 eq(DpmMockContext.CALLER_USER_HANDLE),
@@ -2063,6 +2079,22 @@
         );
     }
 
+    private void addAndRemoveLocalUserRestrictionOnParentDpm(String restriction) {
+        parentDpm.addUserRestriction(admin1, restriction);
+        verify(getServices().userManagerInternal).setDevicePolicyUserRestrictions(
+                eq(DpmMockContext.CALLER_USER_HANDLE),
+                MockUtils.checkUserRestrictions(),
+                MockUtils.checkUserRestrictions(UserHandle.USER_SYSTEM, restriction),
+                eq(false));
+        parentDpm.clearUserRestriction(admin1, restriction);
+        DpmTestUtils.assertRestrictions(
+                DpmTestUtils.newRestrictions(),
+                dpms.getProfileOwnerAdminLocked(DpmMockContext.CALLER_USER_HANDLE)
+                        .getParentActiveAdmin()
+                        .getEffectiveRestrictions()
+        );
+    }
+
     public void testNoDefaultEnabledUserRestrictions() throws Exception {
         mContext.callerPermissions.add(permission.MANAGE_DEVICE_ADMINS);
         mContext.callerPermissions.add(permission.MANAGE_USERS);
@@ -4841,6 +4873,33 @@
         assertFalse(dpm.isActivePasswordSufficient());
     }
 
+    public void testIsPasswordSufficientAfterProfileUnification() throws Exception {
+        final int managedProfileUserId = DpmMockContext.CALLER_USER_HANDLE;
+        final int managedProfileAdminUid =
+                UserHandle.getUid(managedProfileUserId, DpmMockContext.SYSTEM_UID);
+        mContext.binder.callingUid = managedProfileAdminUid;
+
+        addManagedProfile(admin1, managedProfileAdminUid, admin1);
+        doReturn(true).when(getServices().lockPatternUtils)
+                .isSeparateProfileChallengeEnabled(managedProfileUserId);
+
+        dpm.setPasswordQuality(admin1, DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC);
+        parentDpm.setPasswordQuality(admin1, DevicePolicyManager.PASSWORD_QUALITY_NUMERIC);
+
+        when(getServices().lockSettingsInternal.getUserPasswordMetrics(UserHandle.USER_SYSTEM))
+                .thenReturn(computeForPassword("1234".getBytes()));
+
+        // Numeric password is compliant with current requirement (QUALITY_NUMERIC set explicitly
+        // on the parent admin)
+        assertTrue(dpm.isPasswordSufficientAfterProfileUnification(UserHandle.USER_SYSTEM,
+                UserHandle.USER_NULL));
+        // Numeric password is not compliant if profile is to be unified: the profile has a
+        // QUALITY_ALPHABETIC policy on itself which will be enforced on the password after
+        // unification.
+        assertFalse(dpm.isPasswordSufficientAfterProfileUnification(UserHandle.USER_SYSTEM,
+                managedProfileUserId));
+    }
+
     private void setActivePasswordState(PasswordMetrics passwordMetrics)
             throws Exception {
         final int userHandle = UserHandle.getUserId(mContext.binder.callingUid);
@@ -6218,7 +6277,214 @@
         assertThat(dpm.getAccountTypesWithManagementDisabled()).isEmpty();
     }
 
-    // admin1 is the outgoing DPC, adminAnotherPakcage is the incoming one.
+    /**
+     * Tests the case when the user doesn't turn the profile on in time, verifies that the user is
+     * warned with a notification and then the apps get suspended.
+     */
+    public void testMaximumProfileTimeOff_profileOffTimeExceeded() throws Exception {
+        prepareMocksForSetMaximumProfileTimeOff();
+
+        mContext.binder.callingUid = DpmMockContext.CALLER_UID;
+        dpm.setManagedProfileMaximumTimeOff(admin1, PROFILE_OFF_TIMEOUT);
+
+        mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
+        // The profile is running, neither alarm nor notification should be posted.
+        verify(getServices().alarmManager, never())
+                .set(anyInt(), anyLong(), any(PendingIntent.class));
+        verify(getServices().notificationManager, never())
+                .notify(anyInt(), any(Notification.class));
+        // Apps shouldn't be suspended.
+        verifyZeroInteractions(getServices().ipackageManager);
+        clearInvocations(getServices().alarmManager);
+
+        sendUserStoppedBroadcastForProfile();
+
+        // Verify the alarm was scheduled for time when the warning should be shown.
+        verify(getServices().alarmManager, times(1))
+                .set(anyInt(), eq(PROFILE_OFF_WARNING_TIME), any());
+        // But still no notification should be posted at this point.
+        verify(getServices().notificationManager, never())
+                .notify(anyInt(), any(Notification.class));
+        // Apps shouldn't be suspended.
+        verifyZeroInteractions(getServices().ipackageManager);
+        clearInvocations(getServices().alarmManager);
+
+        // Pretend the alarm went off.
+        dpms.mMockInjector.setSystemCurrentTimeMillis(PROFILE_OFF_WARNING_TIME + 10);
+        sendProfileOffDeadlineAlarmBroadcast();
+
+        // Verify the alarm was scheduled for the actual deadline this time.
+        verify(getServices().alarmManager, times(1)).set(anyInt(), eq(PROFILE_OFF_DEADLINE), any());
+        // Now the user should see a warning notification.
+        verify(getServices().notificationManager, times(1))
+                .notify(anyInt(), argThat(hasTitle(PROFILE_OFF_WARNING_TITLE)));
+        // Apps shouldn't be suspended yet.
+        verifyZeroInteractions(getServices().ipackageManager);
+        clearInvocations(getServices().alarmManager);
+        clearInvocations(getServices().notificationManager);
+
+        // Pretend the alarm went off.
+        dpms.mMockInjector.setSystemCurrentTimeMillis(PROFILE_OFF_DEADLINE + 10);
+        sendProfileOffDeadlineAlarmBroadcast();
+
+        // Verify the alarm was not set.
+        verifyZeroInteractions(getServices().alarmManager);
+        // Now the user should see a notification about suspended apps.
+        verify(getServices().notificationManager, times(1))
+                .notify(anyInt(), argThat(hasTitle(PROFILE_OFF_SUSPENDED_TITLE)));
+        // Verify that the apps are suspended.
+        verify(getServices().ipackageManager, times(1)).setPackagesSuspendedAsUser(
+                any(), eq(true), any(), any(), any(), any(), anyInt());
+    }
+
+    /**
+     * Tests the case when the user turns the profile back on long before the deadline (> 1 day).
+     */
+    public void testMaximumProfileTimeOff_turnOnBeforeWarning() throws Exception {
+        prepareMocksForSetMaximumProfileTimeOff();
+
+        mContext.binder.callingUid = DpmMockContext.CALLER_UID;
+        dpm.setManagedProfileMaximumTimeOff(admin1, PROFILE_OFF_TIMEOUT);
+
+        mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
+        sendUserStoppedBroadcastForProfile();
+        clearInvocations(getServices().alarmManager);
+        sendUserUnlockedBroadcastForProfile();
+
+        // Verify that the alarm got discharged.
+        verify(getServices().alarmManager, times(1)).cancel((PendingIntent) null);
+    }
+
+    /**
+     * Tests the case when the user turns the profile back on after the warning notification.
+     */
+    public void testMaximumProfileTimeOff_turnOnAfterWarning() throws Exception {
+        prepareMocksForSetMaximumProfileTimeOff();
+
+        mContext.binder.callingUid = DpmMockContext.CALLER_UID;
+        dpm.setManagedProfileMaximumTimeOff(admin1, PROFILE_OFF_TIMEOUT);
+
+        mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
+        sendUserStoppedBroadcastForProfile();
+
+        // Pretend the alarm went off.
+        dpms.mMockInjector.setSystemCurrentTimeMillis(PROFILE_OFF_WARNING_TIME + 10);
+        sendProfileOffDeadlineAlarmBroadcast();
+
+        clearInvocations(getServices().alarmManager);
+        clearInvocations(getServices().notificationManager);
+        sendUserUnlockedBroadcastForProfile();
+
+        // Verify that the alarm got discharged.
+        verify(getServices().alarmManager, times(1)).cancel((PendingIntent) null);
+        // Verify that the notification is removed.
+        verify(getServices().notificationManager, times(1))
+                .cancel(eq(SystemMessageProto.SystemMessage.NOTE_PERSONAL_APPS_SUSPENDED));
+    }
+
+    /**
+     * Tests the case when the user turns the profile back on when the apps are already suspended.
+     */
+    public void testMaximumProfileTimeOff_turnOnAfterDeadline() throws Exception {
+        prepareMocksForSetMaximumProfileTimeOff();
+
+        mContext.binder.callingUid = DpmMockContext.CALLER_UID;
+        dpm.setManagedProfileMaximumTimeOff(admin1, PROFILE_OFF_TIMEOUT);
+
+        mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
+        sendUserStoppedBroadcastForProfile();
+
+        // Pretend the alarm went off after the deadline.
+        dpms.mMockInjector.setSystemCurrentTimeMillis(PROFILE_OFF_DEADLINE + 10);
+        sendProfileOffDeadlineAlarmBroadcast();
+
+        clearInvocations(getServices().alarmManager);
+        clearInvocations(getServices().notificationManager);
+        clearInvocations(getServices().ipackageManager);
+
+        sendUserUnlockedBroadcastForProfile();
+
+        // Verify that the notification is removed (at this point DPC should show it).
+        verify(getServices().notificationManager, times(1))
+                .cancel(eq(SystemMessageProto.SystemMessage.NOTE_PERSONAL_APPS_SUSPENDED));
+        // Verify that the apps are NOT unsuspeded.
+        verify(getServices().ipackageManager, never()).setPackagesSuspendedAsUser(
+                any(), eq(false), any(), any(), any(), any(), anyInt());
+    }
+
+    private void sendUserUnlockedBroadcastForProfile() throws Exception {
+        when(getServices().userManager.isUserUnlocked(eq(DpmMockContext.CALLER_USER_HANDLE)))
+                .thenReturn(true);
+        final Intent unlockedIntent = new Intent(Intent.ACTION_USER_UNLOCKED)
+                .putExtra(Intent.EXTRA_USER_HANDLE, DpmMockContext.CALLER_USER_HANDLE);
+        getServices().injectBroadcast(
+                mServiceContext, unlockedIntent, DpmMockContext.CALLER_USER_HANDLE);
+        flushTasks();
+    }
+
+
+    private void sendProfileOffDeadlineAlarmBroadcast() throws Exception {
+        final Intent deadlineAlarmIntent =
+                new Intent(DevicePolicyManagerService.ACTION_PROFILE_OFF_DEADLINE);
+        getServices().injectBroadcast(
+                mServiceContext, deadlineAlarmIntent, DpmMockContext.CALLER_USER_HANDLE);
+        flushTasks();
+    }
+
+    private void sendUserStoppedBroadcastForProfile() throws Exception {
+        when(getServices().userManager.isUserUnlocked(eq(DpmMockContext.CALLER_USER_HANDLE)))
+                .thenReturn(false);
+        final Intent stoppedIntent = new Intent(Intent.ACTION_USER_STOPPED)
+                .putExtra(Intent.EXTRA_USER_HANDLE, DpmMockContext.CALLER_USER_HANDLE);
+        getServices().injectBroadcast(mServiceContext, stoppedIntent,
+                DpmMockContext.CALLER_USER_HANDLE);
+        flushTasks();
+    }
+
+    private void prepareMocksForSetMaximumProfileTimeOff() throws Exception {
+        addManagedProfile(admin1, DpmMockContext.CALLER_UID, admin1);
+        configureProfileOwnerOfOrgOwnedDevice(admin1, DpmMockContext.CALLER_USER_HANDLE);
+
+        when(getServices().userManager.isUserUnlocked()).thenReturn(true);
+
+        // Pretend our admin handles CHECK_POLICY_COMPLIANCE intent.
+        final Intent intent = new Intent(DevicePolicyManager.ACTION_CHECK_POLICY_COMPLIANCE);
+        intent.setPackage(admin1.getPackageName());
+
+        doReturn(Collections.singletonList(new ResolveInfo()))
+                .when(getServices().packageManager).queryIntentActivitiesAsUser(
+                        any(Intent.class), anyInt(), eq(DpmMockContext.CALLER_USER_HANDLE));
+
+        dpms.mMockInjector.setSystemCurrentTimeMillis(PROFILE_OFF_START);
+        // To allow creation of Notification via Notification.Builder
+        mContext.applicationInfo = mRealTestContext.getApplicationInfo();
+
+        // Setup notification titles.
+        when(mServiceContext.resources
+                .getString(R.string.personal_apps_suspended_tomorrow_title))
+                .thenReturn(PROFILE_OFF_WARNING_TITLE);
+        when(mServiceContext.resources
+                .getString(R.string.personal_apps_suspended_title))
+                .thenReturn(PROFILE_OFF_SUSPENDED_TITLE);
+
+        clearInvocations(getServices().ipackageManager);
+    }
+
+    private static Matcher<Notification> hasTitle(String expected) {
+        return new BaseMatcher<Notification>() {
+            @Override
+            public boolean matches(Object item) {
+                final Notification notification = (Notification) item;
+                return expected.equals(notification.extras.getString(Notification.EXTRA_TITLE));
+            }
+            @Override
+            public void describeTo(Description description) {
+                description.appendText("Notification{title=\"" + expected + "\"}");
+            }
+        };
+    }
+
+    // admin1 is the outgoing DPC, adminAnotherPackage is the incoming one.
     private void assertDeviceOwnershipRevertedWithFakeTransferMetadata() throws Exception {
         writeFakeTransferMetadataFile(UserHandle.USER_SYSTEM,
                 TransferOwnershipMetadataManager.ADMIN_TYPE_DEVICE_OWNER);
@@ -6245,7 +6511,7 @@
         mServiceContext.binder.restoreCallingIdentity(ident);
     }
 
-    // admin1 is the outgoing DPC, adminAnotherPakcage is the incoming one.
+    // admin1 is the outgoing DPC, adminAnotherPackage is the incoming one.
     private void assertProfileOwnershipRevertedWithFakeTransferMetadata() throws Exception {
         writeFakeTransferMetadataFile(DpmMockContext.CALLER_USER_HANDLE,
                 TransferOwnershipMetadataManager.ADMIN_TYPE_PROFILE_OWNER);
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DpmMockContext.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DpmMockContext.java
index 8625a1e..20716ab 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/DpmMockContext.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DpmMockContext.java
@@ -460,6 +460,15 @@
     }
 
     @Override
+    public Context createContextAsUser(UserHandle user, int flags) {
+        try {
+            return mMockSystemServices.createPackageContextAsUser(packageName, flags, user);
+        } catch (PackageManager.NameNotFoundException e) {
+            throw new IllegalStateException(e);
+        }
+    }
+
+    @Override
     public ContentResolver getContentResolver() {
         return mMockSystemServices.contentResolver;
     }
diff --git a/services/tests/servicestests/src/com/android/server/display/AutomaticBrightnessControllerTest.java b/services/tests/servicestests/src/com/android/server/display/AutomaticBrightnessControllerTest.java
index 7b3417a..b69cc47 100644
--- a/services/tests/servicestests/src/com/android/server/display/AutomaticBrightnessControllerTest.java
+++ b/services/tests/servicestests/src/com/android/server/display/AutomaticBrightnessControllerTest.java
@@ -107,9 +107,10 @@
                 eq(INITIAL_LIGHT_SENSOR_RATE * 1000), any(Handler.class));
         SensorEventListener listener = listenerCaptor.getValue();
 
-        // Set up system to return 5 as a brightness value
+        // Set up system to return 0.02f as a brightness value
         float lux1 = 100.0f;
-        float normalizedBrightness1 = 0.0158f; //float equivalent of 5 out of 255
+        // Brightness as float (from 0.0f to 1.0f)
+        float normalizedBrightness1 = 0.02f;
         when(mAmbientBrightnessThresholds.getBrighteningThreshold(lux1))
                 .thenReturn(lux1);
         when(mAmbientBrightnessThresholds.getDarkeningThreshold(lux1))
@@ -120,14 +121,14 @@
         // This is the important bit: When the new brightness is set, make sure the new
         // brightening threshold is beyond the maximum brightness value...so that we can test that
         // our threshold clamping works.
-        when(mScreenBrightnessThresholds.getBrighteningThreshold(5)).thenReturn(1.0f);
+        when(mScreenBrightnessThresholds.getBrighteningThreshold(normalizedBrightness1))
+                .thenReturn(1.0f);
 
         // Send new sensor value and verify
         listener.onSensorChanged(TestUtils.createSensorEvent(lightSensor, (int) lux1));
-        assertEquals(5, controller.getAutomaticScreenBrightness());
+        assertEquals(normalizedBrightness1, controller.getAutomaticScreenBrightness(), 0.001f);
 
-
-        // Set up system to return 255 as a brightness value
+        // Set up system to return 0.0f (minimum possible brightness) as a brightness value
         float lux2 = 10.0f;
         float normalizedBrightness2 = 0.0f;
         when(mAmbientBrightnessThresholds.getBrighteningThreshold(lux2))
@@ -139,7 +140,7 @@
 
         // Send new sensor value and verify
         listener.onSensorChanged(TestUtils.createSensorEvent(lightSensor, (int) lux2));
-        assertEquals(1, controller.getAutomaticScreenBrightness());
+        assertEquals(normalizedBrightness2, controller.getAutomaticScreenBrightness(), 0.001f);
     }
 
     @Test
@@ -153,9 +154,9 @@
                 eq(INITIAL_LIGHT_SENSOR_RATE * 1000), any(Handler.class));
         SensorEventListener listener = listenerCaptor.getValue();
 
-        // Set up system to return 250 as a brightness value
+        // Set up system to return 0.98f as a brightness value
         float lux1 = 100.0f;
-        float normalizedBrightness1 = 0.981f; //float equivalent of 250 out of 255
+        float normalizedBrightness1 = 0.98f;
         when(mAmbientBrightnessThresholds.getBrighteningThreshold(lux1))
                 .thenReturn(lux1);
         when(mAmbientBrightnessThresholds.getDarkeningThreshold(lux1))
@@ -166,14 +167,15 @@
         // This is the important bit: When the new brightness is set, make sure the new
         // brightening threshold is beyond the maximum brightness value...so that we can test that
         // our threshold clamping works.
-        when(mScreenBrightnessThresholds.getBrighteningThreshold(250)).thenReturn(260.0f);
+        when(mScreenBrightnessThresholds.getBrighteningThreshold(normalizedBrightness1))
+                .thenReturn(1.1f);
 
         // Send new sensor value and verify
         listener.onSensorChanged(TestUtils.createSensorEvent(lightSensor, (int) lux1));
-        assertEquals(250, controller.getAutomaticScreenBrightness());
+        assertEquals(normalizedBrightness1, controller.getAutomaticScreenBrightness(), 0.001f);
 
 
-        // Set up system to return 255 as a brightness value
+        // Set up system to return 1.0f as a brightness value (brightness_max)
         float lux2 = 110.0f;
         float normalizedBrightness2 = 1.0f;
         when(mAmbientBrightnessThresholds.getBrighteningThreshold(lux2))
@@ -185,7 +187,7 @@
 
         // Send new sensor value and verify
         listener.onSensorChanged(TestUtils.createSensorEvent(lightSensor, (int) lux2));
-        assertEquals(255, controller.getAutomaticScreenBrightness());
+        assertEquals(normalizedBrightness2, controller.getAutomaticScreenBrightness(), 0.001f);
     }
 
     @Test
@@ -204,10 +206,10 @@
 
         // User sets brightness to 100
         controller.configure(true /* enable */, null /* configuration */,
-                100 /* brightness */, true /* userChangedBrightness */, 0 /* adjustment */,
+                0.5f /* brightness */, true /* userChangedBrightness */, 0 /* adjustment */,
                 false /* userChanged */, DisplayPowerRequest.POLICY_BRIGHT);
 
         // There should be a user data point added to the mapper.
-        verify(mBrightnessMappingStrategy).addUserDataPoint(1000f, 100);
+        verify(mBrightnessMappingStrategy).addUserDataPoint(1000f, 0.5f);
     }
 }
diff --git a/services/tests/servicestests/src/com/android/server/display/DisplayManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/display/DisplayManagerServiceTest.java
index 7ad39b4..b1f3871 100644
--- a/services/tests/servicestests/src/com/android/server/display/DisplayManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/display/DisplayManagerServiceTest.java
@@ -26,6 +26,7 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import android.app.PropertyInvalidatedCache;
 import android.content.Context;
 import android.hardware.display.BrightnessConfiguration;
 import android.hardware.display.Curve;
@@ -120,6 +121,9 @@
         LocalServices.addService(LightsManager.class, mMockLightsManager);
 
         mContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
+
+        // Disable binder caches in this process.
+        PropertyInvalidatedCache.disableForTestMode();
     }
 
     @Test
diff --git a/services/tests/servicestests/src/com/android/server/emergency/EmergencyAffordanceServiceTest.java b/services/tests/servicestests/src/com/android/server/emergency/EmergencyAffordanceServiceTest.java
new file mode 100644
index 0000000..d438a0e
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/emergency/EmergencyAffordanceServiceTest.java
@@ -0,0 +1,486 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.emergency;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.verify;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.res.Resources;
+import android.os.UserHandle;
+import android.provider.Settings;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
+import android.telephony.SubscriptionManager.OnSubscriptionsChangedListener;
+import android.telephony.TelephonyManager;
+import android.test.mock.MockContentResolver;
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper;
+
+import androidx.test.InstrumentationRegistry;
+
+import com.android.internal.util.test.BroadcastInterceptingContext;
+import com.android.internal.util.test.FakeSettingsProvider;
+import com.android.server.SystemService;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.Supplier;
+
+/**
+ * Unit test for EmergencyAffordanceService (EAS for short) which determines when
+ * should we enable Emergency Affordance feature (EA for short).
+ *
+ * Please refer to https://source.android.com/devices/tech/connect/emergency-affordance
+ * to see the details of the feature.
+ */
+@RunWith(AndroidTestingRunner.class)
[email protected]
+public class EmergencyAffordanceServiceTest {
+
+    // Default country ISO that should enable EA. Value comes from resource
+    // com.android.internal.R.array.config_emergency_iso_country_codes
+    private static final String EMERGENCY_ISO_CODE = "in";
+    // Randomly picked country ISO that should not enable EA.
+    private static final String NON_EMERGENCY_ISO_CODE = "us";
+
+    // Valid values for Settings.Global.EMERGENCY_AFFORDANCE_NEEDED
+    private static final int OFF = 0; // which means feature disabled
+    private static final int ON  = 1; // which means feature enabled
+
+    private static final int ACTIVE_MODEM_COUNT = 2;
+
+    @Mock private Resources mResources;
+    @Mock private SubscriptionManager mSubscriptionManager;
+    @Mock private TelephonyManager mTelephonyManager;
+
+    private TestContext mServiceContext;
+    private MockContentResolver mContentResolver;
+    private OnSubscriptionsChangedListener mSubscriptionChangedListener;
+    private EmergencyAffordanceService mService;
+
+    // Testable Context that mocks resources, content resolver and system services
+    private class TestContext extends BroadcastInterceptingContext {
+        TestContext(Context base) {
+            super(base);
+        }
+
+        @Override
+        public ContentResolver getContentResolver() {
+            return mContentResolver;
+        }
+
+        @Override
+        public Resources getResources() {
+            return mResources;
+        }
+
+        @Override
+        public Object getSystemService(String name) {
+            switch (name) {
+                case Context.TELEPHONY_SUBSCRIPTION_SERVICE:
+                    return mSubscriptionManager;
+                case Context.TELEPHONY_SERVICE:
+                    return mTelephonyManager;
+                default:
+                    return super.getSystemService(name);
+            }
+        }
+    }
+
+    @Before
+    public void setUp() throws Exception {
+        MockitoAnnotations.initMocks(this);
+
+        doReturn(new String[] { EMERGENCY_ISO_CODE }).when(mResources)
+                .getStringArray(com.android.internal.R.array.config_emergency_iso_country_codes);
+
+        final Context context = InstrumentationRegistry.getContext();
+        mServiceContext = new TestContext(context);
+        mContentResolver = new MockContentResolver(mServiceContext);
+        mContentResolver.addProvider(Settings.AUTHORITY, new FakeSettingsProvider());
+
+        // Initialize feature off, to have constant starting
+        Settings.Global.putInt(mContentResolver, Settings.Global.EMERGENCY_AFFORDANCE_NEEDED, 0);
+        mService = new EmergencyAffordanceService(mServiceContext);
+    }
+
+    /**
+     * Verify if the device is not voice capable, the feature should be disabled.
+     */
+    @Test
+    public void testSettings_shouldBeOff_whenVoiceCapableIsFalse() throws Exception {
+        // Given: the device is not voice capable
+        // When:  setup device and boot service
+        setUpDevice(false /* withVoiceCapable */, true /* withEmergencyIsoInSim */,
+                true /* withEmergencyIsoInCell */);
+
+        // Then: EA setting will should be 0
+        verifyEmergencyAffordanceNeededSettings(OFF);
+    }
+
+    /**
+     * Verify the voice capable device is booted up without EA-enabled cell network, with
+     * no EA-enabled SIM installed, feature should be disabled.
+     */
+    @Test
+    public void testSettings_shouldBeOff_whenWithoutEAEanbledNetworkNorSim() throws Exception {
+        // Given: the device is voice capble, no EA-enable SIM, no EA-enabled Cell
+        setUpDevice(true /* withVoiceCapable */, false /* withEmergencyIsoInSim */,
+                false /* withEmergencyIsoInCell */);
+
+        // Then: EA setting will should be 0
+        verifyEmergencyAffordanceNeededSettings(OFF);
+    }
+
+    /**
+     * Verify the voice capable device is booted up with EA-enabled SIM installed, the
+     * feature should be enabled.
+     */
+    @Test
+    public void testSettings_shouldBeOn_whenBootUpWithEAEanbledSim() throws Exception {
+        // Given: the device is voice capble, with EA-enable SIM, no EA-enabled Cell
+        setUpDevice(true /* withVoiceCapable */, true /* withEmergencyIsoInSim */,
+                false /* withEmergencyIsoInCell */);
+
+        // Then: EA setting will immediately update to 1
+        verifyEmergencyAffordanceNeededSettings(ON);
+    }
+
+    /**
+     * Verify the voice capable device is booted up with EA-enabled Cell network, the
+     * feature should be enabled.
+     */
+    @Test
+    public void testSettings_shouldBeOn_whenBootUpWithEAEanbledCell() throws Exception {
+        // Given: the device is voice capble, with EA-enable SIM, with EA-enabled Cell
+        setUpDevice(true /* withVoiceCapable */, false /* withEmergencyIsoInSim */,
+                true /* withEmergencyIsoInCell */);
+
+        // Then: EA setting will immediately update to 1
+        verifyEmergencyAffordanceNeededSettings(ON);
+    }
+
+    /**
+     * Verify when device boot up with no EA-enabled SIM, but later install one,
+     * feature should be enabled.
+     */
+    @Test
+    public void testSettings_shouldBeOn_whenSubscriptionInfoChangedWithEmergencyIso()
+            throws Exception {
+        // Given: the device is voice capable, boot up with no EA-enabled SIM, no EA-enabled Cell
+        setUpDevice(true /* withVoiceCapable */, false/* withEmergencyIsoInSim */,
+                false /* withEmergencyIsoInCell */);
+
+        // When: Insert EA-enabled SIM and get notified
+        setUpSim(true /* withEmergencyIsoInSim */);
+        mSubscriptionChangedListener.onSubscriptionsChanged();
+
+        // Then: EA Setting will update to 1
+        verifyEmergencyAffordanceNeededSettings(ON);
+    }
+
+    /**
+     * Verify when feature was on, device re-insert with no EA-enabled SIMs,
+     * feature should be disabled.
+     */
+    @Test
+    public void testSettings_shouldBeOff_whenSubscriptionInfoChangedWithoutEmergencyIso()
+            throws Exception {
+        // Given: the device is voice capable, no EA-enabled Cell, with EA-enabled SIM
+        setUpDevice(true /* withVoiceCapable */, true /* withEmergencyIsoInSim */,
+                false /* withEmergencyIsoInCell */);
+
+        // When: All SIMs are replaced with EA-disabled ones.
+        setUpSim(false /* withEmergencyIsoInSim */);
+        mSubscriptionChangedListener.onSubscriptionsChanged();
+
+        // Then: EA Setting will update to 0
+        verifyEmergencyAffordanceNeededSettings(OFF);
+    }
+
+    /**
+     * Verify when device boot up with no EA-enabled Cell, but later move into one,
+     * feature should be enabled.
+     */
+    @Test
+    public void testSettings_shouldBeOn_whenCountryIsoChangedWithEmergencyIso()
+            throws Exception {
+        // Given: the device is voice capable, boot up with no EA-enabled SIM, no EA-enabled Cell
+        setUpDevice(true /* withVoiceCapable */, false/* withEmergencyIsoInSim */,
+                false /* withEmergencyIsoInCell */);
+
+        // When: device locale change to EA-enabled Cell and get notified
+        resetCell(true /* withEmergencyIsoInSim */);
+        sendBroadcastNetworkCountryChanged(EMERGENCY_COUNTRY_ISO);
+
+        // Then: EA Setting will update to 1
+        verifyEmergencyAffordanceNeededSettings(ON);
+    }
+
+    /**
+     * Verify when device boot up with  EA-enabled Cell, but later move out of it,
+     * feature should be enabled.
+     */
+    @Test
+    public void testSettings_shouldBeOff_whenCountryIsoChangedWithoutEmergencyIso()
+            throws Exception {
+        // Given: the device is voice capable, boot up with no EA-enabled SIM, with EA-enabled Cell
+        setUpDevice(true /* withVoiceCapable */, false/* withEmergencyIsoInSim */,
+                true /* withEmergencyIsoInCell */);
+
+        // When: device locale change to no EA-enabled Cell and get notified
+        resetCell(false /* withEmergencyIsoInSim */);
+        sendBroadcastNetworkCountryChanged(NON_EMERGENCY_COUNTRY_ISO);
+
+        // Then: EA Setting will update to 0
+        verifyEmergencyAffordanceNeededSettings(OFF);
+    }
+    /**
+     * Verify if device is not in EA-enabled Mobile Network without EA-enable SIM(s) installed,
+     * when receive SubscriptionInfo change, the feature should not be enabled.
+     */
+    @Test
+    public void testSettings_shouldBeOff_whenNoEmergencyIsoInCellNorSim() throws Exception {
+        // Given: the device is voice capable, no EA-enabled Cell, no EA-enabled SIM
+        setUpDevice(true /* withVoiceCapable */, false /* withEmergencyIsoInSim */,
+                false /* withEmergencyIsoInCell */);
+
+        // When: Subscription changed event received
+        mSubscriptionChangedListener.onSubscriptionsChanged();
+
+        // Then: EA Settings should be 0
+        verifyEmergencyAffordanceNeededSettings(OFF);
+    }
+
+    /**
+     * Verify while feature was on, when device receive empty country iso change, while APM is
+     * enabled, feature status should keep on.
+     */
+    @Test
+    public void testSettings_shouldOn_whenReceiveEmptyISOWithAPMEnabled() throws Exception {
+        // Given: the device is voice capable,  no EA-enabled SIM, with EA-enabled Cell
+        setUpDevice(true /* withVoiceCapable */, false /* withEmergencyIsoInSim */,
+                true /* withEmergencyIsoInCell */);
+
+        // Then: EA Settings will update to 1
+        verifyEmergencyAffordanceNeededSettings(ON);
+
+        // When: Airplane mode is enabled, and we receive EMPTY ISO in locale change
+        setAirplaneMode(true);
+        sendBroadcastNetworkCountryChanged(EMPTY_COUNTRY_ISO);
+
+        // Then: EA Settings will keep to 1
+        verifyEmergencyAffordanceNeededSettings(ON);
+    }
+
+    /**
+     * Verify while feature was on, when device receive empty country iso change, while APM is
+     * disabled, feature should be disabled.
+     */
+    @Test
+    public void testSettings_shouldOff_whenReceiveEmptyISOWithAPMDisabled() throws Exception {
+        // Given: the device is voice capable,  no EA-enabled SIM, with EA-enabled Cell
+        setUpDevice(true /* withVoiceCapable */, false /* withEmergencyIsoInSim */,
+                true /* withEmergencyIsoInCell */);
+
+        // Then: EA Settings will update to 1
+        verifyEmergencyAffordanceNeededSettings(ON);
+
+        // When: Airplane mode is disabled, and we receive valid empty ISO in locale change
+        setUpCell(false /* withEmergencyIsoInCell */);
+        setAirplaneMode(false);
+        sendBroadcastNetworkCountryChanged(EMPTY_COUNTRY_ISO);
+
+        // Then: EA Settings will keep to 0
+        verifyEmergencyAffordanceNeededSettings(OFF);
+    }
+
+    /**
+     * Verify when airplane mode is turn on and off in cell network with EA-enabled ISO,
+     * feature should keep enabled.
+     */
+    @Test
+    public void testSettings_shouldBeOn_whenAirplaneModeOnOffWithEmergencyIsoInCell()
+            throws Exception {
+        // Given: the device is voice capable,  no EA-enabled SIM, with EA-enabled Cell
+        setUpDevice(true /* withVoiceCapable */, false /* withEmergencyIsoInSim */,
+                true /* withEmergencyIsoInCell */);
+
+        // When: Device receive locale change with EA-enabled iso
+        sendBroadcastNetworkCountryChanged(EMERGENCY_COUNTRY_ISO);
+
+        // When: Airplane mode is disabled
+        setAirplaneMode(false);
+
+        // Then: EA Settings will keep with 1
+        verifyEmergencyAffordanceNeededSettings(ON);
+
+        // When: Airplane mode is enabled
+        setAirplaneMode(true);
+
+        // Then: EA Settings is still 1
+        verifyEmergencyAffordanceNeededSettings(ON);
+    }
+
+    /**
+     * Verify when airplane mode is turn on and off with EA-enabled ISO in SIM,
+     * feature should keep enabled.
+     */
+    @Test
+    public void testSettings_shouldBeOn_whenAirplaneModeOnOffWithEmergencyIsoInSim()
+            throws Exception {
+        // Given: the device is voice capable, no EA-enabled Cell Network, with EA-enabled SIM
+        setUpDevice(true /* withVoiceCapable */, true /* withEmergencyIsoInSim */,
+                false /* withEmergencyIsoInCell */);
+
+        // When: Airplane mode is disabled
+        setAirplaneMode(false);
+
+        // Then: EA Settings will keep with 1
+        verifyEmergencyAffordanceNeededSettings(ON);
+
+        // When: Airplane mode is enabled
+        setAirplaneMode(true);
+
+        // Then: EA Settings is still 1
+        verifyEmergencyAffordanceNeededSettings(ON);
+    }
+
+    // EAS reads voice capable during boot up and cache it. To test non voice capable device,
+    // we can not put this in setUp
+    private void setUpDevice(boolean withVoiceCapable, boolean withEmergencyIsoInSim,
+            boolean withEmergencyIsoInCell) throws Exception {
+        setUpVoiceCapable(withVoiceCapable);
+
+        setUpSim(withEmergencyIsoInSim);
+
+        setUpCell(withEmergencyIsoInCell);
+
+        // bypass onStart which is used to publish binder service and need sepolicy policy update
+        // mService.onStart();
+
+        mService.onBootPhase(SystemService.PHASE_THIRD_PARTY_APPS_CAN_START);
+
+        if (!withVoiceCapable) {
+            return;
+        }
+
+        captureSubscriptionChangeListener();
+    }
+
+    private void setUpVoiceCapable(boolean voiceCapable) {
+        doReturn(voiceCapable).when(mTelephonyManager).isVoiceCapable();
+    }
+
+    private static final Supplier<String> EMPTY_COUNTRY_ISO = () -> "";
+    private static final Supplier<String> EMERGENCY_COUNTRY_ISO = () -> EMERGENCY_ISO_CODE;
+    private static final Supplier<String> NON_EMERGENCY_COUNTRY_ISO = () -> NON_EMERGENCY_ISO_CODE;
+    private void sendBroadcastNetworkCountryChanged(Supplier<String> countryIso) {
+        Intent intent = new Intent(TelephonyManager.ACTION_NETWORK_COUNTRY_CHANGED);
+        intent.putExtra(TelephonyManager.EXTRA_NETWORK_COUNTRY, countryIso.get());
+        SubscriptionManager.putPhoneIdAndSubIdExtra(intent, 0);
+        mServiceContext.sendBroadcastAsUser(intent, UserHandle.ALL);
+    }
+
+    private void setUpSim(boolean withEmergencyIsoInSim) {
+        List<SubscriptionInfo> subInfos = getSubscriptionInfoList(withEmergencyIsoInSim);
+        doReturn(subInfos).when(mSubscriptionManager).getActiveSubscriptionInfoList();
+    }
+
+    private void setUpCell(boolean withEmergencyIsoInCell) {
+        doReturn(ACTIVE_MODEM_COUNT).when(mTelephonyManager).getActiveModemCount();
+        doReturn(NON_EMERGENCY_ISO_CODE).when(mTelephonyManager).getNetworkCountryIso(0);
+        doReturn(withEmergencyIsoInCell ? EMERGENCY_ISO_CODE : NON_EMERGENCY_ISO_CODE)
+                .when(mTelephonyManager).getNetworkCountryIso(1);
+    }
+
+    private void resetCell(boolean withEmergencyIsoInCell) {
+        doReturn(withEmergencyIsoInCell ? EMERGENCY_ISO_CODE : NON_EMERGENCY_ISO_CODE)
+                .when(mTelephonyManager).getNetworkCountryIso(1);
+    }
+
+    private void captureSubscriptionChangeListener() {
+        final ArgumentCaptor<OnSubscriptionsChangedListener> subChangedListenerCaptor =
+                ArgumentCaptor.forClass(OnSubscriptionsChangedListener.class);
+        verify(mSubscriptionManager).addOnSubscriptionsChangedListener(
+                subChangedListenerCaptor.capture());
+        mSubscriptionChangedListener = subChangedListenerCaptor.getValue();
+    }
+
+    private void setAirplaneMode(boolean enabled) {
+        // Change the system settings
+        Settings.Global.putInt(mContentResolver, Settings.Global.AIRPLANE_MODE_ON,
+                enabled ? 1 : 0);
+
+        // Post the intent
+        final Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
+        intent.putExtra("state", enabled);
+        mServiceContext.sendBroadcastAsUser(intent, UserHandle.ALL);
+    }
+
+    private List<SubscriptionInfo> getSubscriptionInfoList(boolean withEmergencyIso) {
+        List<SubscriptionInfo> subInfos = new ArrayList<>(2);
+
+        // Test with Multiple SIMs. SIM1 is a non-EA SIM
+        // Only country iso is valuable, all other info are filled with dummy values
+        SubscriptionInfo subInfo = new SubscriptionInfo(1, "890126042XXXXXXXXXXX", 0, "T-mobile",
+                "T-mobile", 0, 255, "12345", 0, null,
+                "310", "226", NON_EMERGENCY_ISO_CODE, false, null, null);
+        subInfos.add(subInfo);
+
+        // SIM2 can configured to be non-EA or EA SIM according parameter withEmergencyIso
+        SubscriptionInfo subInfo2 = new SubscriptionInfo(1, "890126042XXXXXXXXXXX", 0, "Airtel",
+                "Aritel", 0, 255, "12345", 0, null, "310", "226",
+                withEmergencyIso ? EMERGENCY_ISO_CODE : NON_EMERGENCY_ISO_CODE,
+                false, null, null);
+        subInfos.add(subInfo2);
+
+        return subInfos;
+    }
+
+    // EAS has handler thread to perform heavy work, while FakeSettingProvider does not support
+    // ContentObserver. To make sure consistent result, we use a simple sleep & retry to wait for
+    // real work finished before verify result.
+    private static final int TIME_DELAY_BEFORE_VERIFY_IN_MS = 50;
+    private static final int RETRIES_BEFORE_VERIFY = 20;
+    private void verifyEmergencyAffordanceNeededSettings(int expected) throws Exception {
+        try {
+            int ct = 0;
+            int actual = -1;
+            while (ct++ < RETRIES_BEFORE_VERIFY
+                    && (actual = Settings.Global.getInt(mContentResolver,
+                    Settings.Global.EMERGENCY_AFFORDANCE_NEEDED)) != expected) {
+                Thread.sleep(TIME_DELAY_BEFORE_VERIFY_IN_MS);
+            }
+            assertEquals(expected, actual);
+        } catch (Settings.SettingNotFoundException e) {
+            fail("SettingNotFoundException thrown for Settings.Global.EMERGENCY_AFFORDANCE_NEEDED");
+        }
+    }
+}
diff --git a/services/tests/servicestests/src/com/android/server/integrity/AppIntegrityManagerServiceImplTest.java b/services/tests/servicestests/src/com/android/server/integrity/AppIntegrityManagerServiceImplTest.java
index e5741ee..9c2ef4f 100644
--- a/services/tests/servicestests/src/com/android/server/integrity/AppIntegrityManagerServiceImplTest.java
+++ b/services/tests/servicestests/src/com/android/server/integrity/AppIntegrityManagerServiceImplTest.java
@@ -489,8 +489,17 @@
     }
 
     @Test
+    public void getWhitelistedRuleProviders_returnsEmptyForNonSystemApps() throws Exception {
+        whitelistUsAsRuleProvider();
+        makeUsSystemApp(false);
+
+        assertThat(mService.getWhitelistedRuleProviders()).isEmpty();
+    }
+
+    @Test
     public void getWhitelistedRuleProviders() throws Exception {
         whitelistUsAsRuleProvider();
+        makeUsSystemApp();
 
         assertThat(mService.getWhitelistedRuleProviders()).containsExactly(TEST_FRAMEWORK_PACKAGE);
     }
@@ -535,6 +544,7 @@
                                 TEST_FRAMEWORK_PACKAGE, PackageManager.GET_SIGNING_CERTIFICATES);
         doReturn(packageInfo).when(mSpyPackageManager).getPackageInfo(eq(INSTALLER), anyInt());
         doReturn(1).when(mSpyPackageManager).getPackageUid(eq(INSTALLER), anyInt());
+        doReturn(new String[]{INSTALLER}).when(mSpyPackageManager).getPackagesForUid(anyInt());
         return makeVerificationIntent(INSTALLER);
     }
 
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsServiceTests.java b/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsServiceTests.java
index 07d7830..12b144f 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsServiceTests.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsServiceTests.java
@@ -209,6 +209,26 @@
     }
 
     @Test
+    public void testManagedProfileChallengeUnification_parentUserNoPassword() throws Exception {
+        // Start with a profile with unified challenge, parent user has not password
+        mService.setSeparateProfileChallengeEnabled(MANAGED_PROFILE_USER_ID, false, null);
+        assertEquals(0, mGateKeeperService.getSecureUserId(MANAGED_PROFILE_USER_ID));
+        assertEquals(CREDENTIAL_TYPE_NONE, mService.getCredentialType(MANAGED_PROFILE_USER_ID));
+
+        // Set a separate challenge on the profile
+        assertTrue(mService.setLockCredential(
+                newPassword("12345678"), nonePassword(), MANAGED_PROFILE_USER_ID));
+        assertNotEquals(0, mGateKeeperService.getSecureUserId(MANAGED_PROFILE_USER_ID));
+        assertEquals(CREDENTIAL_TYPE_PASSWORD, mService.getCredentialType(MANAGED_PROFILE_USER_ID));
+
+        // Now unify again, profile should become passwordless again
+        mService.setSeparateProfileChallengeEnabled(MANAGED_PROFILE_USER_ID, false,
+                newPassword("12345678"));
+        assertEquals(0, mGateKeeperService.getSecureUserId(MANAGED_PROFILE_USER_ID));
+        assertEquals(CREDENTIAL_TYPE_NONE, mService.getCredentialType(MANAGED_PROFILE_USER_ID));
+    }
+
+    @Test
     public void testSetLockCredential_forPrimaryUser_sendsCredentials() throws Exception {
         assertTrue(mService.setLockCredential(
                 newPassword("password"),
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsStrongAuthTest.java b/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsStrongAuthTest.java
new file mode 100644
index 0000000..c9dbdd2
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsStrongAuthTest.java
@@ -0,0 +1,252 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.locksettings;
+
+import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_NOT_REQUIRED;
+import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_NON_STRONG_BIOMETRICS_TIMEOUT;
+import static com.android.server.locksettings.LockSettingsStrongAuth.DEFAULT_NON_STRONG_BIOMETRIC_IDLE_TIMEOUT_MS;
+import static com.android.server.locksettings.LockSettingsStrongAuth.DEFAULT_NON_STRONG_BIOMETRIC_TIMEOUT_MS;
+import static com.android.server.locksettings.LockSettingsStrongAuth.NON_STRONG_BIOMETRIC_IDLE_TIMEOUT_ALARM_TAG;
+import static com.android.server.locksettings.LockSettingsStrongAuth.NON_STRONG_BIOMETRIC_TIMEOUT_ALARM_TAG;
+import static com.android.server.locksettings.LockSettingsStrongAuth.STRONG_AUTH_TIMEOUT_ALARM_TAG;
+
+import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertNotNull;
+import static junit.framework.Assert.assertNull;
+import static junit.framework.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;
+
+import android.app.AlarmManager;
+import android.app.admin.DevicePolicyManager;
+import android.content.Context;
+import android.util.Log;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+
+import com.android.server.locksettings.LockSettingsStrongAuth.NonStrongBiometricIdleTimeoutAlarmListener;
+import com.android.server.locksettings.LockSettingsStrongAuth.NonStrongBiometricTimeoutAlarmListener;
+import com.android.server.locksettings.LockSettingsStrongAuth.StrongAuthTimeoutAlarmListener;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@SmallTest
+public class LockSettingsStrongAuthTest {
+
+    private static final String TAG = LockSettingsStrongAuthTest.class.getSimpleName();
+
+    private static final int PRIMARY_USER_ID = 0;
+
+    private LockSettingsStrongAuth mStrongAuth;
+    private final int mDefaultStrongAuthFlags = STRONG_AUTH_NOT_REQUIRED;
+    private final boolean mDefaultIsNonStrongBiometricAllowed = true;
+
+    @Mock
+    private Context mContext;
+    @Mock
+    private LockSettingsStrongAuth.Injector mInjector;
+    @Mock
+    private AlarmManager mAlarmManager;
+    @Mock
+    private DevicePolicyManager mDPM;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        when(mInjector.getAlarmManager(mContext)).thenReturn(mAlarmManager);
+        when(mInjector.getDefaultStrongAuthFlags(mContext)).thenReturn(mDefaultStrongAuthFlags);
+        when(mContext.getSystemService(Context.DEVICE_POLICY_SERVICE)).thenReturn(mDPM);
+
+        mStrongAuth = new LockSettingsStrongAuth(mContext, mInjector);
+    }
+
+    @Test
+    public void testScheduleNonStrongBiometricIdleTimeout() {
+        final long nextAlarmTime = 1000;
+        when(mInjector.getNextAlarmTimeMs(DEFAULT_NON_STRONG_BIOMETRIC_IDLE_TIMEOUT_MS))
+                .thenReturn(nextAlarmTime);
+        mStrongAuth.scheduleNonStrongBiometricIdleTimeout(PRIMARY_USER_ID);
+
+        waitForIdle();
+        NonStrongBiometricIdleTimeoutAlarmListener alarm = mStrongAuth
+                .mNonStrongBiometricIdleTimeoutAlarmListener.get(PRIMARY_USER_ID);
+        // verify that a new alarm for idle timeout is added for the user
+        assertNotNull(alarm);
+        // verify that the alarm is scheduled
+        verifyAlarm(nextAlarmTime, NON_STRONG_BIOMETRIC_IDLE_TIMEOUT_ALARM_TAG, alarm);
+    }
+
+    @Test
+    public void testSetIsNonStrongBiometricAllowed_disallowed() {
+        mStrongAuth.setIsNonStrongBiometricAllowed(false /* allowed */, PRIMARY_USER_ID);
+
+        waitForIdle();
+        // verify that unlocking with non-strong biometrics is not allowed
+        assertFalse(mStrongAuth.mIsNonStrongBiometricAllowedForUser
+                .get(PRIMARY_USER_ID, mDefaultIsNonStrongBiometricAllowed));
+    }
+
+    @Test
+    public void testReportSuccessfulBiometricUnlock_nonStrongBiometric_fallbackTimeout() {
+        final long nextAlarmTime = 1000;
+        when(mInjector.getNextAlarmTimeMs(DEFAULT_NON_STRONG_BIOMETRIC_TIMEOUT_MS))
+                .thenReturn(nextAlarmTime);
+        mStrongAuth.reportSuccessfulBiometricUnlock(false /* isStrongBiometric */, PRIMARY_USER_ID);
+
+        waitForIdle();
+        NonStrongBiometricTimeoutAlarmListener alarm =
+                mStrongAuth.mNonStrongBiometricTimeoutAlarmListener.get(PRIMARY_USER_ID);
+        // verify that a new alarm for fallback timeout is added for the user
+        assertNotNull(alarm);
+        // verify that the alarm is scheduled
+        verifyAlarm(nextAlarmTime, NON_STRONG_BIOMETRIC_TIMEOUT_ALARM_TAG, alarm);
+    }
+
+    @Test
+    public void testRequireStrongAuth_nonStrongBiometric_fallbackTimeout() {
+        mStrongAuth.requireStrongAuth(
+                STRONG_AUTH_REQUIRED_AFTER_NON_STRONG_BIOMETRICS_TIMEOUT /* strongAuthReason */,
+                PRIMARY_USER_ID);
+
+        waitForIdle();
+        // verify that the StrongAuthFlags for the user contains the expected flag
+        final int expectedFlag = STRONG_AUTH_REQUIRED_AFTER_NON_STRONG_BIOMETRICS_TIMEOUT;
+        verifyStrongAuthFlags(expectedFlag, PRIMARY_USER_ID);
+    }
+
+    @Test
+    public void testReportSuccessfulBiometricUnlock_nonStrongBiometric_cancelIdleTimeout() {
+        // lock device and schedule an alarm for non-strong biometric idle timeout
+        mStrongAuth.scheduleNonStrongBiometricIdleTimeout(PRIMARY_USER_ID);
+        // unlock with non-strong biometric
+        mStrongAuth.reportSuccessfulBiometricUnlock(false /* isStrongBiometric */, PRIMARY_USER_ID);
+
+        waitForIdle();
+
+        // verify that the current alarm for idle timeout is cancelled after a successful unlock
+        verify(mAlarmManager).cancel(any(NonStrongBiometricIdleTimeoutAlarmListener.class));
+    }
+
+    @Test
+    public void testReportSuccessfulBiometricUnlock_strongBio_cancelAlarmsAndAllowNonStrongBio() {
+        setupAlarms(PRIMARY_USER_ID);
+        mStrongAuth.reportSuccessfulBiometricUnlock(true /* isStrongBiometric */, PRIMARY_USER_ID);
+
+        waitForIdle();
+        // verify that unlocking with strong biometric cancels alarms for fallback and idle timeout
+        // and re-allow unlocking with non-strong biometric
+        verifyAlarmsCancelledAndNonStrongBiometricAllowed(PRIMARY_USER_ID);
+    }
+
+    @Test
+    public void testReportSuccessfulStrongAuthUnlock_schedulePrimaryAuthTimeout() {
+        final long nextAlarmTime = 1000;
+        when(mInjector.getNextAlarmTimeMs(mDPM.getRequiredStrongAuthTimeout(null, PRIMARY_USER_ID)))
+                .thenReturn(nextAlarmTime);
+        mStrongAuth.reportSuccessfulStrongAuthUnlock(PRIMARY_USER_ID);
+
+        waitForIdle();
+        StrongAuthTimeoutAlarmListener alarm =
+                mStrongAuth.mStrongAuthTimeoutAlarmListenerForUser.get(PRIMARY_USER_ID);
+        // verify that a new alarm for primary auth timeout is added for the user
+        assertNotNull(alarm);
+        // verify that the alarm is scheduled
+        verifyAlarm(nextAlarmTime, STRONG_AUTH_TIMEOUT_ALARM_TAG, alarm);
+    }
+
+    @Test
+    public void testReportSuccessfulStrongAuthUnlock_cancelAlarmsAndAllowNonStrongBio() {
+        setupAlarms(PRIMARY_USER_ID);
+        mStrongAuth.reportSuccessfulStrongAuthUnlock(PRIMARY_USER_ID);
+
+        waitForIdle();
+        // verify that unlocking with primary auth (PIN/pattern/password) cancels alarms
+        // for fallback and idle timeout and re-allow unlocking with non-strong biometric
+        verifyAlarmsCancelledAndNonStrongBiometricAllowed(PRIMARY_USER_ID);
+    }
+
+    @Test
+    public void testFallbackTimeout_convenienceBiometric_weakBiometric() {
+        // assume that unlock with convenience biometric
+        mStrongAuth.reportSuccessfulBiometricUnlock(false /* isStrongBiometric */, PRIMARY_USER_ID);
+        // assume that unlock again with weak biometric
+        mStrongAuth.reportSuccessfulBiometricUnlock(false /* isStrongBiometric */, PRIMARY_USER_ID);
+
+        waitForIdle();
+        // verify that the fallback alarm scheduled when unlocking with convenience biometric is
+        // not affected when unlocking again with weak biometric
+        verify(mAlarmManager, never()).cancel(any(NonStrongBiometricTimeoutAlarmListener.class));
+        assertNotNull(mStrongAuth.mNonStrongBiometricTimeoutAlarmListener.get(PRIMARY_USER_ID));
+    }
+
+    private void verifyAlarm(long when, String tag, AlarmManager.OnAlarmListener alarm) {
+        verify(mAlarmManager).set(
+                eq(AlarmManager.ELAPSED_REALTIME),
+                eq(when),
+                eq(tag),
+                eq(alarm),
+                eq(mStrongAuth.mHandler));
+    }
+
+    private void verifyStrongAuthFlags(int reason, int userId) {
+        final int flags = mStrongAuth.mStrongAuthForUser.get(userId, mDefaultStrongAuthFlags);
+        Log.d(TAG, "verifyStrongAuthFlags:"
+                + " reason=" + Integer.toHexString(reason)
+                + " userId=" + userId
+                + " flags=" + Integer.toHexString(flags));
+        assertTrue(containsFlag(flags, reason));
+    }
+
+    private void setupAlarms(int userId) {
+        // schedule (a) an alarm for non-strong biometric fallback timeout and (b) an alarm for
+        // non-strong biometric idle timeout, so later we can verify that unlocking with
+        // strong biometric or primary auth will cancel those alarms
+        mStrongAuth.reportSuccessfulBiometricUnlock(false /* isStrongBiometric */, PRIMARY_USER_ID);
+        mStrongAuth.scheduleNonStrongBiometricIdleTimeout(PRIMARY_USER_ID);
+    }
+
+    private void verifyAlarmsCancelledAndNonStrongBiometricAllowed(int userId) {
+        // verify that the current alarm for non-strong biometric fallback timeout is cancelled and
+        // removed
+        verify(mAlarmManager).cancel(any(NonStrongBiometricTimeoutAlarmListener.class));
+        assertNull(mStrongAuth.mNonStrongBiometricTimeoutAlarmListener.get(userId));
+
+        // verify that the current alarm for non-strong biometric idle timeout is cancelled
+        verify(mAlarmManager).cancel(any(NonStrongBiometricIdleTimeoutAlarmListener.class));
+
+        // verify that unlocking with non-strong biometrics is allowed
+        assertTrue(mStrongAuth.mIsNonStrongBiometricAllowedForUser
+                .get(userId, mDefaultIsNonStrongBiometricAllowed));
+    }
+
+    private static boolean containsFlag(int haystack, int needle) {
+        return (haystack & needle) != 0;
+    }
+
+    private static void waitForIdle() {
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+    }
+}
diff --git a/services/tests/servicestests/src/com/android/server/om/TEST_MAPPING b/services/tests/servicestests/src/com/android/server/om/TEST_MAPPING
new file mode 100644
index 0000000..8070bd1
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/om/TEST_MAPPING
@@ -0,0 +1,12 @@
+{
+  "presubmit": [
+    {
+      "name": "FrameworksServicesTests",
+      "options": [
+        {
+          "include-filter": "com.android.server.om."
+        }
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/services/tests/servicestests/src/com/android/server/people/data/ConversationInfoTest.java b/services/tests/servicestests/src/com/android/server/people/data/ConversationInfoTest.java
index 70d6cf8..ea8aa6b 100644
--- a/services/tests/servicestests/src/com/android/server/people/data/ConversationInfoTest.java
+++ b/services/tests/servicestests/src/com/android/server/people/data/ConversationInfoTest.java
@@ -54,6 +54,7 @@
                 .setPersonImportant(true)
                 .setPersonBot(true)
                 .setContactStarred(true)
+                .setNotificationSettingChanged(true)
                 .build();
 
         assertEquals(SHORTCUT_ID, conversationInfo.getShortcutId());
@@ -70,6 +71,7 @@
         assertTrue(conversationInfo.isPersonImportant());
         assertTrue(conversationInfo.isPersonBot());
         assertTrue(conversationInfo.isContactStarred());
+        assertTrue(conversationInfo.isNotificationSettingChanged());
     }
 
     @Test
@@ -92,6 +94,7 @@
         assertFalse(conversationInfo.isPersonImportant());
         assertFalse(conversationInfo.isPersonBot());
         assertFalse(conversationInfo.isContactStarred());
+        assertFalse(conversationInfo.isNotificationSettingChanged());
     }
 
     @Test
@@ -109,6 +112,7 @@
                 .setPersonImportant(true)
                 .setPersonBot(true)
                 .setContactStarred(true)
+                .setNotificationSettingChanged(true)
                 .build();
 
         ConversationInfo destination = new ConversationInfo.Builder(source)
@@ -128,5 +132,6 @@
         assertTrue(destination.isPersonImportant());
         assertTrue(destination.isPersonBot());
         assertFalse(destination.isContactStarred());
+        assertTrue(destination.isNotificationSettingChanged());
     }
 }
diff --git a/services/tests/servicestests/src/com/android/server/people/data/DataManagerTest.java b/services/tests/servicestests/src/com/android/server/people/data/DataManagerTest.java
index 728e149..e51ab9db 100644
--- a/services/tests/servicestests/src/com/android/server/people/data/DataManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/people/data/DataManagerTest.java
@@ -34,6 +34,7 @@
 import static org.mockito.Mockito.doAnswer;
 import static org.mockito.Mockito.eq;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
@@ -215,6 +216,8 @@
         mDataManager = new DataManager(mContext, mInjector);
         mDataManager.initialize();
 
+        when(mShortcutServiceInternal.isSharingShortcut(anyInt(), anyString(), anyString(),
+                anyString(), anyInt(), any())).thenReturn(true);
         verify(mShortcutServiceInternal).addShortcutChangeCallback(
                 mShortcutChangeCallbackCaptor.capture());
         mShortcutChangeCallback = mShortcutChangeCallbackCaptor.getValue();
@@ -405,6 +408,7 @@
 
         ShortcutInfo shortcut = buildShortcutInfo(TEST_PKG_NAME, USER_ID_PRIMARY, TEST_SHORTCUT_ID,
                 buildPerson());
+        shortcut.setCached();
         mDataManager.addOrUpdateConversationInfo(shortcut);
 
         NotificationListenerService listenerService =
@@ -416,6 +420,68 @@
         List<Range<Long>> activeNotificationOpenTimeSlots = getActiveSlotsForTestShortcut(
                 Event.NOTIFICATION_EVENT_TYPES);
         assertEquals(1, activeNotificationOpenTimeSlots.size());
+        verify(mShortcutServiceInternal).uncacheShortcuts(
+                anyInt(), any(), eq(TEST_PKG_NAME),
+                eq(Collections.singletonList(TEST_SHORTCUT_ID)), eq(USER_ID_PRIMARY));
+    }
+
+    @Test
+    public void testNotificationDismissed() {
+        mDataManager.onUserUnlocked(USER_ID_PRIMARY);
+
+        ShortcutInfo shortcut = buildShortcutInfo(TEST_PKG_NAME, USER_ID_PRIMARY, TEST_SHORTCUT_ID,
+                buildPerson());
+        mDataManager.addOrUpdateConversationInfo(shortcut);
+
+        NotificationListenerService listenerService =
+                mDataManager.getNotificationListenerServiceForTesting(USER_ID_PRIMARY);
+
+        // Post one notification.
+        shortcut.setCached();
+        mDataManager.addOrUpdateConversationInfo(shortcut);
+        listenerService.onNotificationPosted(mStatusBarNotification);
+
+        // Post another notification.
+        listenerService.onNotificationPosted(mStatusBarNotification);
+
+        // Removing one of the two notifications does not un-cache the shortcut.
+        listenerService.onNotificationRemoved(mStatusBarNotification, null,
+                NotificationListenerService.REASON_CANCEL);
+        verify(mShortcutServiceInternal, never()).uncacheShortcuts(
+                anyInt(), any(), anyString(), any(), anyInt());
+
+        // Removing the second notification un-caches the shortcut.
+        listenerService.onNotificationRemoved(mStatusBarNotification, null,
+                NotificationListenerService.REASON_CANCEL_ALL);
+        verify(mShortcutServiceInternal).uncacheShortcuts(
+                anyInt(), any(), eq(TEST_PKG_NAME),
+                eq(Collections.singletonList(TEST_SHORTCUT_ID)), eq(USER_ID_PRIMARY));
+    }
+
+    @Test
+    public void testShortcutNotUncachedIfSettingChanged() {
+        mDataManager.onUserUnlocked(USER_ID_PRIMARY);
+
+        ShortcutInfo shortcut = buildShortcutInfo(TEST_PKG_NAME, USER_ID_PRIMARY, TEST_SHORTCUT_ID,
+                buildPerson());
+        mDataManager.addOrUpdateConversationInfo(shortcut);
+
+        NotificationListenerService listenerService =
+                mDataManager.getNotificationListenerServiceForTesting(USER_ID_PRIMARY);
+
+        listenerService.onNotificationPosted(mStatusBarNotification);
+        shortcut.setCached();
+        mDataManager.addOrUpdateConversationInfo(shortcut);
+
+        mNotificationChannel.setImportantConversation(true);
+        listenerService.onNotificationChannelModified(TEST_PKG_NAME, UserHandle.of(USER_ID_PRIMARY),
+                mNotificationChannel, NOTIFICATION_CHANNEL_OR_GROUP_UPDATED);
+
+        listenerService.onNotificationRemoved(mStatusBarNotification, null,
+                NotificationListenerService.REASON_CANCEL_ALL);
+        verify(mShortcutServiceInternal, never()).uncacheShortcuts(
+                anyInt(), any(), eq(TEST_PKG_NAME),
+                eq(Collections.singletonList(TEST_SHORTCUT_ID)), eq(USER_ID_PRIMARY));
     }
 
     @Test
@@ -464,9 +530,7 @@
         assertTrue(conversationInfo.isImportant());
         assertFalse(conversationInfo.isNotificationSilenced());
         assertFalse(conversationInfo.isDemoted());
-        verify(mShortcutServiceInternal).cacheShortcuts(
-                anyInt(), any(), eq(TEST_PKG_NAME),
-                eq(Collections.singletonList(TEST_SHORTCUT_ID)), eq(USER_ID_PRIMARY));
+        assertTrue(conversationInfo.isNotificationSettingChanged());
     }
 
     @Test
diff --git a/services/tests/servicestests/src/com/android/server/pm/UserSystemPackageInstallerTest.java b/services/tests/servicestests/src/com/android/server/pm/UserSystemPackageInstallerTest.java
index ce21099..c55df51 100644
--- a/services/tests/servicestests/src/com/android/server/pm/UserSystemPackageInstallerTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/UserSystemPackageInstallerTest.java
@@ -35,6 +35,7 @@
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
+import android.app.PropertyInvalidatedCache;
 import android.content.Context;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
@@ -98,6 +99,9 @@
         if (Looper.myLooper() == null) {
             Looper.prepare();
         }
+        // Disable binder caches in this process.
+        PropertyInvalidatedCache.disableForTestMode();
+
         LocalServices.removeServiceForTest(UserManagerInternal.class);
         UserManagerService ums = new UserManagerService(InstrumentationRegistry.getContext());
 
diff --git a/services/tests/servicestests/src/com/android/server/pm/dex/DexoptOptionsTests.java b/services/tests/servicestests/src/com/android/server/pm/dex/DexoptOptionsTests.java
index 62589eb..22020ad 100644
--- a/services/tests/servicestests/src/com/android/server/pm/dex/DexoptOptionsTests.java
+++ b/services/tests/servicestests/src/com/android/server/pm/dex/DexoptOptionsTests.java
@@ -54,6 +54,7 @@
         assertFalse(opt.isForce());
         assertFalse(opt.isDexoptIdleBackgroundJob());
         assertFalse(opt.isDexoptInstallWithDexMetadata());
+        assertFalse(opt.isDexoptInstallForRestore());
     }
 
     @Test
@@ -67,7 +68,8 @@
                 DexoptOptions.DEXOPT_DOWNGRADE  |
                 DexoptOptions.DEXOPT_AS_SHARED_LIBRARY |
                 DexoptOptions.DEXOPT_IDLE_BACKGROUND_JOB |
-                DexoptOptions.DEXOPT_INSTALL_WITH_DEX_METADATA_FILE;
+                DexoptOptions.DEXOPT_INSTALL_WITH_DEX_METADATA_FILE |
+                DexoptOptions.DEXOPT_FOR_RESTORE;
 
         DexoptOptions opt = new DexoptOptions(mPackageName, mCompilerFilter, flags);
         assertEquals(mPackageName, opt.getPackageName());
@@ -82,6 +84,7 @@
         assertTrue(opt.isDexoptAsSharedLibrary());
         assertTrue(opt.isDexoptIdleBackgroundJob());
         assertTrue(opt.isDexoptInstallWithDexMetadata());
+        assertTrue(opt.isDexoptInstallForRestore());
     }
 
     @Test
diff --git a/services/tests/servicestests/src/com/android/server/pm/parsing/PackageParserLegacyCoreTest.java b/services/tests/servicestests/src/com/android/server/pm/parsing/PackageParserLegacyCoreTest.java
index af89761..939b7a0 100644
--- a/services/tests/servicestests/src/com/android/server/pm/parsing/PackageParserLegacyCoreTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/parsing/PackageParserLegacyCoreTest.java
@@ -35,6 +35,7 @@
 import android.os.Bundle;
 import android.os.FileUtils;
 import android.platform.test.annotations.Presubmit;
+import android.util.SparseIntArray;
 
 import androidx.test.InstrumentationRegistry;
 import androidx.test.filters.SmallTest;
@@ -542,7 +543,12 @@
 
     @Test
     public void testUsesSdk() throws Exception {
-        parsePackage("install_uses_sdk.apk_r0", R.raw.install_uses_sdk_r0, x -> x);
+        ParsedPackage pkg =
+                parsePackage("install_uses_sdk.apk_r0", R.raw.install_uses_sdk_r0, x -> x);
+        SparseIntArray minExtVers = pkg.getMinExtensionVersions();
+        assertEquals(1, minExtVers.size());
+        assertEquals(0, minExtVers.get(10000, -1));
+
         try {
             parsePackage("install_uses_sdk.apk_r5", R.raw.install_uses_sdk_r5, x -> x);
             fail("Expected parsing exception due to incompatible extension SDK version");
diff --git a/services/tests/servicestests/src/com/android/server/power/AttentionDetectorTest.java b/services/tests/servicestests/src/com/android/server/power/AttentionDetectorTest.java
index c4289ef..e7e8aca 100644
--- a/services/tests/servicestests/src/com/android/server/power/AttentionDetectorTest.java
+++ b/services/tests/servicestests/src/com/android/server/power/AttentionDetectorTest.java
@@ -158,17 +158,6 @@
     }
 
     @Test
-    public void testOnUserActivity_disablesSettingIfNotSufficientPermissions() {
-        when(mPackageManager.checkPermission(any(), any())).thenReturn(
-                PackageManager.PERMISSION_DENIED);
-
-        registerAttention();
-        boolean enabled = Settings.Secure.getIntForUser(getContext().getContentResolver(),
-                Settings.Secure.ADAPTIVE_SLEEP, 0, UserHandle.USER_CURRENT) == 1;
-        assertFalse(enabled);
-    }
-
-    @Test
     public void testOnUserActivity_doesntCrashIfNoAttentionService() {
         mAttentionManagerInternal = null;
         registerAttention();
diff --git a/services/tests/servicestests/src/com/android/server/tv/TvRemoteProviderWatcherTest.java b/services/tests/servicestests/src/com/android/server/tv/TvRemoteProviderWatcherTest.java
index 0a2bb62..d64ad93 100644
--- a/services/tests/servicestests/src/com/android/server/tv/TvRemoteProviderWatcherTest.java
+++ b/services/tests/servicestests/src/com/android/server/tv/TvRemoteProviderWatcherTest.java
@@ -29,6 +29,7 @@
 import android.content.pm.PackageManager;
 import android.content.pm.ServiceInfo;
 import android.content.res.Resources;
+import android.os.Handler;
 import android.os.Looper;
 
 import androidx.test.filters.SmallTest;
@@ -84,6 +85,32 @@
     }
 
     @Test
+    public void acceptsValidCsvPackageName() {
+        // Test intentionally includes empty spacing for a more complex test
+        when(mMockResources.getString(com.android.internal.R.string.config_tvRemoteServicePackage))
+            .thenReturn(",,foo,  " + TV_REMOTE_SERVICE_PACKAGE_NAME + ",bar, baz,,");
+
+        // Re-create the object since package name is loaded in the constructor
+        TvRemoteProviderWatcher watcher =
+                new TvRemoteProviderWatcher(
+                        mMockContext, new Object(), new Handler(Looper.getMainLooper()));
+        assertTrue(watcher.verifyServiceTrusted(createTvServiceInfo()));
+    }
+
+    @Test
+    public void rejectsInvalidCsvPackageName() {
+        // Checks include empty strings to validate that processing as well
+        when(mMockResources.getString(com.android.internal.R.string.config_tvRemoteServicePackage))
+            .thenReturn(",,foo,,  ,bar,   baz,,");
+
+        // Re-create the object since package name is loaded in the constructor
+        TvRemoteProviderWatcher watcher =
+                new TvRemoteProviderWatcher(
+                        mMockContext, new Object(), new Handler(Looper.getMainLooper()));
+        assertFalse(watcher.verifyServiceTrusted(createTvServiceInfo()));
+    }
+
+    @Test
     public void tvServiceIsTrusted() {
         assertTrue(mTvRemoteProviderWatcher.verifyServiceTrusted(createTvServiceInfo()));
     }
@@ -123,14 +150,9 @@
     public void whitelistingPackageNameIsRequired() {
         reset(mMockResources);
         when(mMockResources.getString(anyInt())).thenReturn("");
-
-        // Create a new watcher, as the resources are read in the constructor of the class
-        if (Looper.myLooper() == null) {
-            Looper.prepare();
-        }
-
         TvRemoteProviderWatcher watcher =
-                new TvRemoteProviderWatcher(mMockContext, new Object());
+                new TvRemoteProviderWatcher(
+                        mMockContext, new Object(), new Handler(Looper.getMainLooper()));
         assertFalse(watcher.verifyServiceTrusted(createTvServiceInfo()));
     }
 
diff --git a/services/tests/servicestests/src/com/android/server/tv/tunerresourcemanager/TunerResourceManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/tv/tunerresourcemanager/TunerResourceManagerServiceTest.java
index fcbd507..21af356 100644
--- a/services/tests/servicestests/src/com/android/server/tv/tunerresourcemanager/TunerResourceManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/tv/tunerresourcemanager/TunerResourceManagerServiceTest.java
@@ -26,14 +26,15 @@
 import android.media.tv.TvInputManager;
 import android.media.tv.TvInputService;
 import android.media.tv.tuner.frontend.FrontendSettings;
+import android.media.tv.tunerresourcemanager.CasSessionRequest;
 import android.media.tv.tunerresourcemanager.IResourcesReclaimListener;
 import android.media.tv.tunerresourcemanager.ResourceClientProfile;
 import android.media.tv.tunerresourcemanager.TunerDemuxRequest;
 import android.media.tv.tunerresourcemanager.TunerDescramblerRequest;
 import android.media.tv.tunerresourcemanager.TunerFrontendInfo;
 import android.media.tv.tunerresourcemanager.TunerFrontendRequest;
+import android.media.tv.tunerresourcemanager.TunerLnbRequest;
 import android.media.tv.tunerresourcemanager.TunerResourceManager;
-import android.os.RemoteException;
 import android.platform.test.annotations.Presubmit;
 
 import androidx.test.InstrumentationRegistry;
@@ -49,6 +50,7 @@
 import org.mockito.MockitoAnnotations;
 
 import java.util.Arrays;
+import java.util.HashSet;
 import java.util.Map;
 
 /**
@@ -96,13 +98,6 @@
             }
         };
 
-    private static int getResourceIdFromHandle(int resourceHandle) {
-        if (resourceHandle == TunerResourceManager.INVALID_RESOURCE_HANDLE) {
-            return resourceHandle;
-        }
-        return (resourceHandle & 0x00ff0000) >> 16;
-    }
-
     @Before
     public void setUp() throws Exception {
         MockitoAnnotations.initMocks(this);
@@ -241,13 +236,9 @@
         TunerFrontendRequest request =
                 new TunerFrontendRequest(0 /*clientId*/, FrontendSettings.TYPE_DVBT);
         int[] frontendHandle = new int[1];
-        try {
-            assertThat(mTunerResourceManagerService
-                    .requestFrontendInternal(request, frontendHandle)).isFalse();
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-        assertThat(getResourceIdFromHandle(frontendHandle[0]))
+        assertThat(mTunerResourceManagerService
+                .requestFrontendInternal(request, frontendHandle)).isFalse();
+        assertThat(mTunerResourceManagerService.getResourceIdFromHandle(frontendHandle[0]))
                 .isEqualTo(TunerResourceManager.INVALID_RESOURCE_HANDLE);
     }
 
@@ -269,13 +260,9 @@
         TunerFrontendRequest request =
                 new TunerFrontendRequest(clientId[0] /*clientId*/, FrontendSettings.TYPE_DVBT);
         int[] frontendHandle = new int[1];
-        try {
-            assertThat(mTunerResourceManagerService
-                    .requestFrontendInternal(request, frontendHandle)).isFalse();
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-        assertThat(getResourceIdFromHandle(frontendHandle[0]))
+        assertThat(mTunerResourceManagerService
+                .requestFrontendInternal(request, frontendHandle)).isFalse();
+        assertThat(mTunerResourceManagerService.getResourceIdFromHandle(frontendHandle[0]))
                 .isEqualTo(TunerResourceManager.INVALID_RESOURCE_HANDLE);
     }
 
@@ -301,13 +288,10 @@
         TunerFrontendRequest request =
                 new TunerFrontendRequest(clientId[0] /*clientId*/, FrontendSettings.TYPE_DVBT);
         int[] frontendHandle = new int[1];
-        try {
-            assertThat(mTunerResourceManagerService
-                    .requestFrontendInternal(request, frontendHandle)).isTrue();
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-        assertThat(getResourceIdFromHandle(frontendHandle[0])).isEqualTo(0);
+        assertThat(mTunerResourceManagerService
+                .requestFrontendInternal(request, frontendHandle)).isTrue();
+        assertThat(mTunerResourceManagerService.getResourceIdFromHandle(frontendHandle[0]))
+                .isEqualTo(0);
     }
 
     @Test
@@ -338,23 +322,17 @@
         int[] frontendHandle = new int[1];
         TunerFrontendRequest request =
                 new TunerFrontendRequest(clientId1[0] /*clientId*/, FrontendSettings.TYPE_DVBT);
-        try {
-            assertThat(mTunerResourceManagerService
-                    .requestFrontendInternal(request, frontendHandle)).isTrue();
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-        assertThat(getResourceIdFromHandle(frontendHandle[0])).isEqualTo(infos[0].getId());
+        assertThat(mTunerResourceManagerService
+                .requestFrontendInternal(request, frontendHandle)).isTrue();
+        assertThat(mTunerResourceManagerService.getResourceIdFromHandle(frontendHandle[0]))
+                .isEqualTo(infos[0].getId());
 
         request =
                 new TunerFrontendRequest(clientId0[0] /*clientId*/, FrontendSettings.TYPE_DVBT);
-        try {
-            assertThat(mTunerResourceManagerService
-                    .requestFrontendInternal(request, frontendHandle)).isTrue();
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-        assertThat(getResourceIdFromHandle(frontendHandle[0])).isEqualTo(infos[1].getId());
+        assertThat(mTunerResourceManagerService
+                .requestFrontendInternal(request, frontendHandle)).isTrue();
+        assertThat(mTunerResourceManagerService.getResourceIdFromHandle(frontendHandle[0]))
+                .isEqualTo(infos[1].getId());
         assertThat(mTunerResourceManagerService.getFrontendResource(infos[1].getId())
                 .isInUse()).isTrue();
         assertThat(mTunerResourceManagerService.getFrontendResource(infos[2].getId())
@@ -396,32 +374,20 @@
         TunerFrontendRequest request =
                 new TunerFrontendRequest(clientId0[0] /*clientId*/, FrontendSettings.TYPE_DVBT);
         int[] frontendHandle = new int[1];
-        try {
-            assertThat(mTunerResourceManagerService
-                    .requestFrontendInternal(request, frontendHandle)).isTrue();
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
+        assertThat(mTunerResourceManagerService
+                .requestFrontendInternal(request, frontendHandle)).isTrue();
 
         request =
                 new TunerFrontendRequest(clientId1[0] /*clientId*/, FrontendSettings.TYPE_DVBT);
-        try {
-            assertThat(mTunerResourceManagerService
-                    .requestFrontendInternal(request, frontendHandle)).isFalse();
-            assertThat(listener.isRelaimed()).isFalse();
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
+        assertThat(mTunerResourceManagerService
+                .requestFrontendInternal(request, frontendHandle)).isFalse();
+        assertThat(listener.isRelaimed()).isFalse();
 
         request =
                 new TunerFrontendRequest(clientId1[0] /*clientId*/, FrontendSettings.TYPE_DVBS);
-        try {
-            assertThat(mTunerResourceManagerService
-                    .requestFrontendInternal(request, frontendHandle)).isFalse();
-            assertThat(listener.isRelaimed()).isFalse();
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
+        assertThat(mTunerResourceManagerService
+                .requestFrontendInternal(request, frontendHandle)).isFalse();
+        assertThat(listener.isRelaimed()).isFalse();
     }
 
     @Test
@@ -458,23 +424,20 @@
         TunerFrontendRequest request =
                 new TunerFrontendRequest(clientId0[0] /*clientId*/, FrontendSettings.TYPE_DVBT);
         int[] frontendHandle = new int[1];
-        try {
-            assertThat(mTunerResourceManagerService
-                    .requestFrontendInternal(request, frontendHandle)).isTrue();
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-        assertThat(getResourceIdFromHandle(frontendHandle[0])).isEqualTo(infos[0].getId());
+        assertThat(mTunerResourceManagerService
+                .requestFrontendInternal(request, frontendHandle)).isTrue();
+        assertThat(mTunerResourceManagerService.getResourceIdFromHandle(frontendHandle[0]))
+                .isEqualTo(infos[0].getId());
+        assertThat(mTunerResourceManagerService.getClientProfile(clientId0[0])
+                .getInUseFrontendIds()).isEqualTo(
+                        new HashSet<Integer>(Arrays.asList(infos[0].getId(), infos[1].getId())));
 
         request =
                 new TunerFrontendRequest(clientId1[0] /*clientId*/, FrontendSettings.TYPE_DVBS);
-        try {
-            assertThat(mTunerResourceManagerService
-                    .requestFrontendInternal(request, frontendHandle)).isTrue();
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-        assertThat(getResourceIdFromHandle(frontendHandle[0])).isEqualTo(infos[1].getId());
+        assertThat(mTunerResourceManagerService
+                .requestFrontendInternal(request, frontendHandle)).isTrue();
+        assertThat(mTunerResourceManagerService.getResourceIdFromHandle(frontendHandle[0]))
+                .isEqualTo(infos[1].getId());
         assertThat(mTunerResourceManagerService.getFrontendResource(infos[0].getId())
                 .isInUse()).isTrue();
         assertThat(mTunerResourceManagerService.getFrontendResource(infos[1].getId())
@@ -487,6 +450,220 @@
     }
 
     @Test
+    public void releaseFrontendTest_UnderTheSameExclusiveGroup() {
+        // Register clients
+        ResourceClientProfile[] profiles = new ResourceClientProfile[1];
+        profiles[0] = new ResourceClientProfile("0" /*sessionId*/,
+                TvInputService.PRIORITY_HINT_USE_CASE_TYPE_PLAYBACK);
+        int[] clientId = new int[1];
+        TestResourcesReclaimListener listener = new TestResourcesReclaimListener();
+        mTunerResourceManagerService.registerClientProfileInternal(profiles[0], listener, clientId);
+        assertThat(clientId[0]).isNotEqualTo(TunerResourceManagerService.INVALID_CLIENT_ID);
+
+        // Init frontend resources.
+        TunerFrontendInfo[] infos = new TunerFrontendInfo[2];
+        infos[0] =
+                new TunerFrontendInfo(0 /*id*/, FrontendSettings.TYPE_DVBT, 1 /*exclusiveGroupId*/);
+        infos[1] =
+                new TunerFrontendInfo(1 /*id*/, FrontendSettings.TYPE_DVBS, 1 /*exclusiveGroupId*/);
+        mTunerResourceManagerService.setFrontendInfoListInternal(infos);
+
+        TunerFrontendRequest request =
+                new TunerFrontendRequest(clientId[0] /*clientId*/, FrontendSettings.TYPE_DVBT);
+        int[] frontendHandle = new int[1];
+        assertThat(mTunerResourceManagerService
+                .requestFrontendInternal(request, frontendHandle)).isTrue();
+        int frontendId = mTunerResourceManagerService.getResourceIdFromHandle(frontendHandle[0]);
+        assertThat(frontendId).isEqualTo(infos[0].getId());
+        assertThat(mTunerResourceManagerService
+                .getFrontendResource(infos[1].getId()).isInUse()).isTrue();
+
+        // Release frontend
+        mTunerResourceManagerService.releaseFrontendInternal(mTunerResourceManagerService
+                .getFrontendResource(frontendId));
+        assertThat(mTunerResourceManagerService
+                .getFrontendResource(frontendId).isInUse()).isFalse();
+        assertThat(mTunerResourceManagerService
+                .getFrontendResource(infos[1].getId()).isInUse()).isFalse();
+        assertThat(mTunerResourceManagerService
+                .getClientProfile(clientId[0]).getInUseFrontendIds().size()).isEqualTo(0);
+    }
+
+    @Test
+    public void requestCasTest_NoCasAvailable_RequestWithHigherPriority() {
+        // Register clients
+        ResourceClientProfile[] profiles = new ResourceClientProfile[2];
+        profiles[0] = new ResourceClientProfile("0" /*sessionId*/,
+                TvInputService.PRIORITY_HINT_USE_CASE_TYPE_PLAYBACK);
+        profiles[1] = new ResourceClientProfile("1" /*sessionId*/,
+                TvInputService.PRIORITY_HINT_USE_CASE_TYPE_PLAYBACK);
+        int[] clientPriorities = {100, 500};
+        int[] clientId0 = new int[1];
+        int[] clientId1 = new int[1];
+        TestResourcesReclaimListener listener = new TestResourcesReclaimListener();
+        mTunerResourceManagerService.registerClientProfileInternal(
+                profiles[0], listener, clientId0);
+        assertThat(clientId0[0]).isNotEqualTo(TunerResourceManagerService.INVALID_CLIENT_ID);
+        mTunerResourceManagerService.getClientProfile(clientId0[0])
+                .setPriority(clientPriorities[0]);
+        mTunerResourceManagerService.registerClientProfileInternal(
+                profiles[1], new TestResourcesReclaimListener(), clientId1);
+        assertThat(clientId1[0]).isNotEqualTo(TunerResourceManagerService.INVALID_CLIENT_ID);
+        mTunerResourceManagerService.getClientProfile(clientId1[0])
+                .setPriority(clientPriorities[1]);
+
+        // Init cas resources.
+        mTunerResourceManagerService.updateCasInfoInternal(1 /*casSystemId*/, 2 /*maxSessionNum*/);
+
+        CasSessionRequest request = new CasSessionRequest(clientId0[0], 1 /*casSystemId*/);
+        int[] casSessionHandle = new int[1];
+        // Request for 2 cas sessions.
+        assertThat(mTunerResourceManagerService
+                .requestCasSessionInternal(request, casSessionHandle)).isTrue();
+        assertThat(mTunerResourceManagerService
+                .requestCasSessionInternal(request, casSessionHandle)).isTrue();
+        assertThat(mTunerResourceManagerService.getResourceIdFromHandle(casSessionHandle[0]))
+                .isEqualTo(1);
+        assertThat(mTunerResourceManagerService.getClientProfile(clientId0[0])
+                .getInUseCasSystemId()).isEqualTo(1);
+        assertThat(mTunerResourceManagerService.getCasResource(1)
+                .getOwnerClientIds()).isEqualTo(new HashSet<Integer>(Arrays.asList(clientId0[0])));
+        assertThat(mTunerResourceManagerService.getCasResource(1).isFullyUsed()).isTrue();
+
+        request = new CasSessionRequest(clientId1[0], 1);
+        assertThat(mTunerResourceManagerService
+                .requestCasSessionInternal(request, casSessionHandle)).isTrue();
+        assertThat(mTunerResourceManagerService.getResourceIdFromHandle(casSessionHandle[0]))
+                .isEqualTo(1);
+        assertThat(mTunerResourceManagerService.getClientProfile(clientId1[0])
+                .getInUseCasSystemId()).isEqualTo(1);
+        assertThat(mTunerResourceManagerService.getClientProfile(clientId0[0])
+                .getInUseCasSystemId()).isEqualTo(ClientProfile.INVALID_RESOURCE_ID);
+        assertThat(mTunerResourceManagerService.getCasResource(1)
+                .getOwnerClientIds()).isEqualTo(new HashSet<Integer>(Arrays.asList(clientId1[0])));
+        assertThat(mTunerResourceManagerService.getCasResource(1).isFullyUsed()).isFalse();
+        assertThat(listener.isRelaimed()).isTrue();
+    }
+
+    @Test
+    public void releaseCasTest() {
+        // Register clients
+        ResourceClientProfile[] profiles = new ResourceClientProfile[1];
+        profiles[0] = new ResourceClientProfile("0" /*sessionId*/,
+                TvInputService.PRIORITY_HINT_USE_CASE_TYPE_PLAYBACK);
+        int[] clientId = new int[1];
+        TestResourcesReclaimListener listener = new TestResourcesReclaimListener();
+        mTunerResourceManagerService.registerClientProfileInternal(profiles[0], listener, clientId);
+        assertThat(clientId[0]).isNotEqualTo(TunerResourceManagerService.INVALID_CLIENT_ID);
+
+        // Init cas resources.
+        mTunerResourceManagerService.updateCasInfoInternal(1 /*casSystemId*/, 2 /*maxSessionNum*/);
+
+        CasSessionRequest request = new CasSessionRequest(clientId[0], 1 /*casSystemId*/);
+        int[] casSessionHandle = new int[1];
+        // Request for 1 cas sessions.
+        assertThat(mTunerResourceManagerService
+                .requestCasSessionInternal(request, casSessionHandle)).isTrue();
+        assertThat(mTunerResourceManagerService.getResourceIdFromHandle(casSessionHandle[0]))
+                .isEqualTo(1);
+        assertThat(mTunerResourceManagerService.getClientProfile(clientId[0])
+                .getInUseCasSystemId()).isEqualTo(1);
+        assertThat(mTunerResourceManagerService.getCasResource(1)
+                .getOwnerClientIds()).isEqualTo(new HashSet<Integer>(Arrays.asList(clientId[0])));
+        assertThat(mTunerResourceManagerService.getCasResource(1).isFullyUsed()).isFalse();
+
+        // Release cas
+        mTunerResourceManagerService.releaseCasSessionInternal(mTunerResourceManagerService
+                .getCasResource(1), clientId[0]);
+        assertThat(mTunerResourceManagerService.getClientProfile(clientId[0])
+                .getInUseCasSystemId()).isEqualTo(ClientProfile.INVALID_RESOURCE_ID);
+        assertThat(mTunerResourceManagerService.getCasResource(1).isFullyUsed()).isFalse();
+        assertThat(mTunerResourceManagerService.getCasResource(1)
+                .getOwnerClientIds()).isEmpty();
+    }
+
+    @Test
+    public void requestLnbTest_NoLnbAvailable_RequestWithHigherPriority() {
+        // Register clients
+        ResourceClientProfile[] profiles = new ResourceClientProfile[2];
+        profiles[0] = new ResourceClientProfile("0" /*sessionId*/,
+                TvInputService.PRIORITY_HINT_USE_CASE_TYPE_PLAYBACK);
+        profiles[1] = new ResourceClientProfile("1" /*sessionId*/,
+                TvInputService.PRIORITY_HINT_USE_CASE_TYPE_PLAYBACK);
+        int[] clientPriorities = {100, 500};
+        int[] clientId0 = new int[1];
+        int[] clientId1 = new int[1];
+        TestResourcesReclaimListener listener = new TestResourcesReclaimListener();
+        mTunerResourceManagerService.registerClientProfileInternal(
+                profiles[0], listener, clientId0);
+        assertThat(clientId0[0]).isNotEqualTo(TunerResourceManagerService.INVALID_CLIENT_ID);
+        mTunerResourceManagerService.getClientProfile(clientId0[0])
+                .setPriority(clientPriorities[0]);
+        mTunerResourceManagerService.registerClientProfileInternal(
+                profiles[1], new TestResourcesReclaimListener(), clientId1);
+        assertThat(clientId1[0]).isNotEqualTo(TunerResourceManagerService.INVALID_CLIENT_ID);
+        mTunerResourceManagerService.getClientProfile(clientId1[0])
+                .setPriority(clientPriorities[1]);
+
+        // Init lnb resources.
+        int[] lnbIds = {1};
+        mTunerResourceManagerService.setLnbInfoListInternal(lnbIds);
+
+        TunerLnbRequest request = new TunerLnbRequest(clientId0[0]);
+        int[] lnbHandle = new int[1];
+        assertThat(mTunerResourceManagerService
+                .requestLnbInternal(request, lnbHandle)).isTrue();
+        assertThat(mTunerResourceManagerService.getResourceIdFromHandle(lnbHandle[0]))
+                .isEqualTo(lnbIds[0]);
+        assertThat(mTunerResourceManagerService.getClientProfile(clientId0[0])
+                .getInUseLnbIds()).isEqualTo(new HashSet<Integer>(Arrays.asList(lnbIds[0])));
+
+        request = new TunerLnbRequest(clientId1[0]);
+        assertThat(mTunerResourceManagerService
+                .requestLnbInternal(request, lnbHandle)).isTrue();
+        assertThat(mTunerResourceManagerService.getResourceIdFromHandle(lnbHandle[0]))
+                .isEqualTo(lnbIds[0]);
+        assertThat(mTunerResourceManagerService.getLnbResource(lnbIds[0])
+                .isInUse()).isTrue();
+        assertThat(mTunerResourceManagerService.getLnbResource(lnbIds[0])
+                .getOwnerClientId()).isEqualTo(clientId1[0]);
+        assertThat(listener.isRelaimed()).isTrue();
+        assertThat(mTunerResourceManagerService.getClientProfile(clientId0[0])
+                .getInUseLnbIds().size()).isEqualTo(0);
+    }
+
+    @Test
+    public void releaseLnbTest() {
+        // Register clients
+        ResourceClientProfile[] profiles = new ResourceClientProfile[1];
+        profiles[0] = new ResourceClientProfile("0" /*sessionId*/,
+                TvInputService.PRIORITY_HINT_USE_CASE_TYPE_PLAYBACK);
+        int[] clientId = new int[1];
+        TestResourcesReclaimListener listener = new TestResourcesReclaimListener();
+        mTunerResourceManagerService.registerClientProfileInternal(profiles[0], listener, clientId);
+        assertThat(clientId[0]).isNotEqualTo(TunerResourceManagerService.INVALID_CLIENT_ID);
+
+        // Init lnb resources.
+        int[] lnbIds = {0};
+        mTunerResourceManagerService.setLnbInfoListInternal(lnbIds);
+
+        TunerLnbRequest request = new TunerLnbRequest(clientId[0]);
+        int[] lnbHandle = new int[1];
+        assertThat(mTunerResourceManagerService
+                .requestLnbInternal(request, lnbHandle)).isTrue();
+        int lnbId = mTunerResourceManagerService.getResourceIdFromHandle(lnbHandle[0]);
+        assertThat(lnbId).isEqualTo(lnbIds[0]);
+
+        // Release lnb
+        mTunerResourceManagerService.releaseLnbInternal(mTunerResourceManagerService
+                .getLnbResource(lnbId));
+        assertThat(mTunerResourceManagerService
+                .getLnbResource(lnbId).isInUse()).isFalse();
+        assertThat(mTunerResourceManagerService
+                .getClientProfile(clientId[0]).getInUseLnbIds().size()).isEqualTo(0);
+    }
+
+    @Test
     public void unregisterClientTest_usingFrontend() {
         // Register client
         ResourceClientProfile profile = new ResourceClientProfile("0" /*sessionId*/,
@@ -507,13 +684,10 @@
         TunerFrontendRequest request =
                 new TunerFrontendRequest(clientId[0] /*clientId*/, FrontendSettings.TYPE_DVBT);
         int[] frontendHandle = new int[1];
-        try {
-            assertThat(mTunerResourceManagerService
-                    .requestFrontendInternal(request, frontendHandle)).isTrue();
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-        assertThat(getResourceIdFromHandle(frontendHandle[0])).isEqualTo(infos[0].getId());
+        assertThat(mTunerResourceManagerService
+                .requestFrontendInternal(request, frontendHandle)).isTrue();
+        assertThat(mTunerResourceManagerService.getResourceIdFromHandle(frontendHandle[0]))
+                .isEqualTo(infos[0].getId());
         assertThat(mTunerResourceManagerService.getFrontendResource(infos[0].getId())
                 .isInUse()).isTrue();
         assertThat(mTunerResourceManagerService.getFrontendResource(infos[1].getId())
@@ -543,7 +717,8 @@
         TunerDemuxRequest request = new TunerDemuxRequest(clientId[0]);
         assertThat(mTunerResourceManagerService.requestDemuxInternal(request, demuxHandle))
                 .isTrue();
-        assertThat(getResourceIdFromHandle(demuxHandle[0])).isEqualTo(0);
+        assertThat(mTunerResourceManagerService.getResourceIdFromHandle(demuxHandle[0]))
+                .isEqualTo(0);
     }
 
     @Test
@@ -560,6 +735,6 @@
         TunerDescramblerRequest request = new TunerDescramblerRequest(clientId[0]);
         assertThat(mTunerResourceManagerService.requestDescramblerInternal(request, desHandle))
                 .isTrue();
-        assertThat(getResourceIdFromHandle(desHandle[0])).isEqualTo(0);
+        assertThat(mTunerResourceManagerService.getResourceIdFromHandle(desHandle[0])).isEqualTo(0);
     }
 }
diff --git a/services/tests/servicestests/src/com/android/server/uri/UriGrantsManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/uri/UriGrantsManagerServiceTest.java
new file mode 100644
index 0000000..cf1978e
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/uri/UriGrantsManagerServiceTest.java
@@ -0,0 +1,355 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.server.uri;
+
+import static com.android.server.uri.UriGrantsMockContext.FLAG_PERSISTABLE;
+import static com.android.server.uri.UriGrantsMockContext.FLAG_PREFIX;
+import static com.android.server.uri.UriGrantsMockContext.FLAG_READ;
+import static com.android.server.uri.UriGrantsMockContext.PKG_CAMERA;
+import static com.android.server.uri.UriGrantsMockContext.PKG_COMPLEX;
+import static com.android.server.uri.UriGrantsMockContext.PKG_SOCIAL;
+import static com.android.server.uri.UriGrantsMockContext.UID_PRIMARY_CAMERA;
+import static com.android.server.uri.UriGrantsMockContext.UID_PRIMARY_COMPLEX;
+import static com.android.server.uri.UriGrantsMockContext.UID_PRIMARY_PRIVATE;
+import static com.android.server.uri.UriGrantsMockContext.UID_PRIMARY_PUBLIC;
+import static com.android.server.uri.UriGrantsMockContext.UID_PRIMARY_SOCIAL;
+import static com.android.server.uri.UriGrantsMockContext.UID_SECONDARY_CAMERA;
+import static com.android.server.uri.UriGrantsMockContext.UID_SECONDARY_SOCIAL;
+import static com.android.server.uri.UriGrantsMockContext.URI_PHOTO_1;
+import static com.android.server.uri.UriGrantsMockContext.URI_PRIVATE;
+import static com.android.server.uri.UriGrantsMockContext.URI_PUBLIC;
+import static com.android.server.uri.UriGrantsMockContext.USER_PRIMARY;
+import static com.android.server.uri.UriGrantsMockContext.USER_SECONDARY;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import android.content.ClipData;
+import android.content.Intent;
+import android.content.pm.ProviderInfo;
+import android.net.Uri;
+import android.util.ArraySet;
+
+import androidx.test.InstrumentationRegistry;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.Set;
+
+public class UriGrantsManagerServiceTest {
+    private UriGrantsMockContext mContext;
+    private UriGrantsManagerService mService;
+    private UriGrantsManagerInternal mLocalService;
+
+    @Before
+    public void setUp() throws Exception {
+        mContext = new UriGrantsMockContext(InstrumentationRegistry.getContext());
+        mService = UriGrantsManagerService.createForTest(mContext.getFilesDir());
+        mLocalService = mService.getLocalService();
+    }
+
+    @Test
+    public void testNeeded_normal() {
+        final Intent intent = new Intent(Intent.ACTION_VIEW, URI_PHOTO_1).addFlags(FLAG_READ);
+        final GrantUri expectedGrant = new GrantUri(USER_PRIMARY, URI_PHOTO_1, FLAG_READ);
+
+        final NeededUriGrants needed = mService.checkGrantUriPermissionFromIntent(
+                UID_PRIMARY_CAMERA, PKG_SOCIAL, intent, intent.getFlags(), null,
+                USER_PRIMARY);
+        assertEquals(PKG_SOCIAL, needed.targetPkg);
+        assertEquals(UID_PRIMARY_SOCIAL, needed.targetUid);
+        assertEquals(FLAG_READ, needed.flags);
+        assertEquals(asSet(expectedGrant), needed.uris);
+    }
+
+    /**
+     * No need to issue grants for public authorities.
+     */
+    @Test
+    public void testNeeded_public() {
+        final Intent intent = new Intent(Intent.ACTION_VIEW, URI_PUBLIC).addFlags(FLAG_READ);
+        final NeededUriGrants needed = mService.checkGrantUriPermissionFromIntent(
+                UID_PRIMARY_PUBLIC, PKG_SOCIAL, intent, intent.getFlags(), null,
+                USER_PRIMARY);
+        assertNull(needed);
+    }
+
+    /**
+     * But we're willing to issue grants to public authorities when crossing
+     * user boundaries.
+     */
+    @Test
+    public void testNeeded_public_differentUser() {
+        final Intent intent = new Intent(Intent.ACTION_VIEW, URI_PUBLIC).addFlags(FLAG_READ);
+        final GrantUri expectedGrant = new GrantUri(USER_PRIMARY, URI_PUBLIC, FLAG_READ);
+
+        final NeededUriGrants needed = mService.checkGrantUriPermissionFromIntent(
+                UID_PRIMARY_PUBLIC, PKG_SOCIAL, intent, intent.getFlags(), null, USER_SECONDARY);
+        assertEquals(PKG_SOCIAL, needed.targetPkg);
+        assertEquals(UID_SECONDARY_SOCIAL, needed.targetUid);
+        assertEquals(FLAG_READ, needed.flags);
+        assertEquals(asSet(expectedGrant), needed.uris);
+    }
+
+    /**
+     * Refuse to issue grants for private authorities.
+     */
+    @Test
+    public void testNeeded_private() {
+        final Intent intent = new Intent(Intent.ACTION_VIEW, URI_PRIVATE).addFlags(FLAG_READ);
+        try {
+            mService.checkGrantUriPermissionFromIntent(
+                    UID_PRIMARY_PRIVATE, PKG_SOCIAL, intent, intent.getFlags(), null, USER_PRIMARY);
+            fail();
+        } catch (SecurityException expected) {
+        }
+    }
+
+    /**
+     * Verify that we can't grant permissions to top level of a provider with
+     * complex permission model.
+     */
+    @Test
+    public void testNeeded_complex_top() {
+        final Uri uri = Uri.parse("content://" + PKG_COMPLEX + "/");
+        {
+            final Intent intent = new Intent(Intent.ACTION_VIEW, uri)
+                    .addFlags(FLAG_READ);
+            assertNull(mService.checkGrantUriPermissionFromIntent(UID_PRIMARY_COMPLEX, PKG_SOCIAL,
+                    intent, intent.getFlags(), null, USER_PRIMARY));
+        }
+        {
+            final Intent intent = new Intent(Intent.ACTION_VIEW, uri)
+                    .addFlags(FLAG_READ | FLAG_PREFIX);
+            try {
+                mService.checkGrantUriPermissionFromIntent(UID_PRIMARY_COMPLEX, PKG_SOCIAL,
+                        intent, intent.getFlags(), null, USER_PRIMARY);
+                fail();
+            } catch (SecurityException expected) {
+            }
+        }
+        {
+            final Intent intent = new Intent(Intent.ACTION_VIEW, uri)
+                    .addFlags(FLAG_READ | FLAG_PERSISTABLE);
+            try {
+                mService.checkGrantUriPermissionFromIntent(UID_PRIMARY_COMPLEX, PKG_SOCIAL,
+                        intent, intent.getFlags(), null, USER_PRIMARY);
+                fail();
+            } catch (SecurityException expected) {
+            }
+        }
+    }
+
+    /**
+     * Verify that we allow special cross-user grants to top level of a provider
+     * that normally wouldn't allow it. Only basic permission modes are allowed;
+     * advanced modes throw.
+     */
+    @Test
+    public void testNeeded_complex_top_differentUser() {
+        final Uri uri = Uri.parse("content://" + PKG_COMPLEX + "/");
+        {
+            final Intent intent = new Intent(Intent.ACTION_VIEW, uri)
+                    .addFlags(FLAG_READ);
+            final NeededUriGrants needed = mService.checkGrantUriPermissionFromIntent(
+                    UID_PRIMARY_COMPLEX, PKG_SOCIAL, intent, intent.getFlags(), null,
+                    USER_SECONDARY);
+            assertEquals(FLAG_READ, needed.flags);
+        }
+        {
+            final Intent intent = new Intent(Intent.ACTION_VIEW, uri)
+                    .addFlags(FLAG_READ | FLAG_PREFIX);
+            try {
+                mService.checkGrantUriPermissionFromIntent(
+                        UID_PRIMARY_COMPLEX, PKG_SOCIAL, intent, intent.getFlags(), null,
+                        USER_SECONDARY);
+                fail();
+            } catch (SecurityException expected) {
+            }
+        }
+        {
+            final Intent intent = new Intent(Intent.ACTION_VIEW, uri)
+                    .addFlags(FLAG_READ | FLAG_PERSISTABLE);
+            try {
+                mService.checkGrantUriPermissionFromIntent(
+                        UID_PRIMARY_COMPLEX, PKG_SOCIAL, intent, intent.getFlags(), null,
+                        USER_SECONDARY);
+                fail();
+            } catch (SecurityException expected) {
+            }
+        }
+    }
+
+    /**
+     * Verify that we can grant permissions to middle level of a provider with
+     * complex permission model.
+     */
+    @Test
+    public void testNeeded_complex_middle() {
+        final Uri uri = Uri.parse("content://" + PKG_COMPLEX + "/secure/12");
+        {
+            final Intent intent = new Intent(Intent.ACTION_VIEW, uri)
+                    .addFlags(FLAG_READ);
+            final NeededUriGrants needed = mService.checkGrantUriPermissionFromIntent(
+                    UID_PRIMARY_COMPLEX, PKG_SOCIAL, intent, intent.getFlags(), null, USER_PRIMARY);
+            assertEquals(asSet(new GrantUri(USER_PRIMARY, uri, 0)), needed.uris);
+        }
+        {
+            final Intent intent = new Intent(Intent.ACTION_VIEW, uri)
+                    .addFlags(FLAG_READ | FLAG_PREFIX);
+            final NeededUriGrants needed = mService.checkGrantUriPermissionFromIntent(
+                    UID_PRIMARY_COMPLEX, PKG_SOCIAL, intent, intent.getFlags(), null, USER_PRIMARY);
+            assertEquals(asSet(new GrantUri(USER_PRIMARY, uri, FLAG_PREFIX)), needed.uris);
+        }
+        {
+            final Intent intent = new Intent(Intent.ACTION_VIEW, uri)
+                    .addFlags(FLAG_READ | FLAG_PERSISTABLE);
+            final NeededUriGrants needed = mService.checkGrantUriPermissionFromIntent(
+                    UID_PRIMARY_COMPLEX, PKG_SOCIAL, intent, intent.getFlags(), null, USER_PRIMARY);
+            assertEquals(asSet(new GrantUri(USER_PRIMARY, uri, 0)), needed.uris);
+        }
+    }
+
+    /**
+     * Verify that when we try sending a list of mixed items that the actual
+     * grants are verified based on the capabilities of the caller.
+     */
+    @Test
+    public void testNeeded_mixedPersistable() {
+        final ClipData clip = ClipData.newRawUri("test", URI_PHOTO_1);
+        clip.addItem(new ClipData.Item(URI_PUBLIC));
+
+        final Intent intent = new Intent(Intent.ACTION_VIEW);
+        intent.addFlags(FLAG_READ | FLAG_PERSISTABLE);
+        intent.setClipData(clip);
+
+        {
+            // When granting towards primary, persistable can't be honored so
+            // the entire grant fails
+            try {
+                mService.checkGrantUriPermissionFromIntent(UID_PRIMARY_CAMERA, PKG_SOCIAL, intent,
+                        intent.getFlags(), null, USER_PRIMARY);
+                fail();
+            } catch (SecurityException expected) {
+            }
+        }
+        {
+            // When granting towards secondary, persistable can't be honored so
+            // the entire grant fails
+            try {
+                mService.checkGrantUriPermissionFromIntent(UID_PRIMARY_CAMERA, PKG_SOCIAL, intent,
+                        intent.getFlags(), null, USER_SECONDARY);
+                fail();
+            } catch (SecurityException expected) {
+            }
+        }
+    }
+
+    /**
+     * Verify that two overlapping owners require separate grants and that they
+     * don't interfere with each other.
+     */
+    @Test
+    public void testGrant_overlap() {
+        final Intent intent = new Intent(Intent.ACTION_VIEW, URI_PHOTO_1).addFlags(FLAG_READ);
+
+        final UriPermissionOwner activity = new UriPermissionOwner(mLocalService, "activity");
+        final UriPermissionOwner service = new UriPermissionOwner(mLocalService, "service");
+
+        final GrantUri expectedGrant = new GrantUri(USER_PRIMARY, URI_PHOTO_1, FLAG_READ);
+
+        // Grant read via activity and write via service
+        mService.grantUriPermissionUncheckedFromIntent(mService.checkGrantUriPermissionFromIntent(
+                UID_PRIMARY_CAMERA, PKG_SOCIAL, intent, intent.getFlags(), null, USER_PRIMARY),
+                activity);
+        mService.grantUriPermissionUncheckedFromIntent(mService.checkGrantUriPermissionFromIntent(
+                UID_PRIMARY_CAMERA, PKG_SOCIAL, intent, intent.getFlags(), null, USER_PRIMARY),
+                service);
+
+        // Verify that everything is good with the world
+        assertTrue(mService.checkUriPermission(expectedGrant, UID_PRIMARY_SOCIAL, FLAG_READ));
+
+        // Finish activity; service should hold permission
+        activity.removeUriPermissions();
+        assertTrue(mService.checkUriPermission(expectedGrant, UID_PRIMARY_SOCIAL, FLAG_READ));
+
+        // And finishing service should wrap things up
+        service.removeUriPermissions();
+        assertFalse(mService.checkUriPermission(expectedGrant, UID_PRIMARY_SOCIAL, FLAG_READ));
+    }
+
+    @Test
+    public void testCheckAuthorityGrants() {
+        final Intent intent = new Intent(Intent.ACTION_VIEW, URI_PHOTO_1).addFlags(FLAG_READ);
+        final UriPermissionOwner owner = new UriPermissionOwner(mLocalService, "primary");
+
+        final ProviderInfo cameraInfo = mContext.mPmInternal.resolveContentProvider(
+                PKG_CAMERA, 0, USER_PRIMARY);
+
+        // By default no social can see any camera
+        assertFalse(mService.checkAuthorityGrants(UID_PRIMARY_SOCIAL,
+                cameraInfo, USER_PRIMARY, true));
+        assertFalse(mService.checkAuthorityGrants(UID_PRIMARY_SOCIAL,
+                cameraInfo, USER_SECONDARY, true));
+        assertFalse(mService.checkAuthorityGrants(UID_SECONDARY_SOCIAL,
+                cameraInfo, USER_PRIMARY, true));
+        assertFalse(mService.checkAuthorityGrants(UID_SECONDARY_SOCIAL,
+                cameraInfo, USER_SECONDARY, true));
+
+        // Granting primary camera to primary social
+        mService.grantUriPermissionUncheckedFromIntent(mService.checkGrantUriPermissionFromIntent(
+                UID_PRIMARY_CAMERA, PKG_SOCIAL, intent, intent.getFlags(), null, USER_PRIMARY),
+                owner);
+        assertTrue(mService.checkAuthorityGrants(UID_PRIMARY_SOCIAL,
+                cameraInfo, USER_PRIMARY, true));
+        assertFalse(mService.checkAuthorityGrants(UID_PRIMARY_SOCIAL,
+                cameraInfo, USER_SECONDARY, true));
+        assertFalse(mService.checkAuthorityGrants(UID_SECONDARY_SOCIAL,
+                cameraInfo, USER_PRIMARY, true));
+        assertFalse(mService.checkAuthorityGrants(UID_SECONDARY_SOCIAL,
+                cameraInfo, USER_SECONDARY, true));
+
+        // Granting secondary camera to primary social
+        mService.grantUriPermissionUncheckedFromIntent(mService.checkGrantUriPermissionFromIntent(
+                UID_SECONDARY_CAMERA, PKG_SOCIAL, intent, intent.getFlags(), null, USER_PRIMARY),
+                owner);
+        assertTrue(mService.checkAuthorityGrants(UID_PRIMARY_SOCIAL,
+                cameraInfo, USER_PRIMARY, true));
+        assertTrue(mService.checkAuthorityGrants(UID_PRIMARY_SOCIAL,
+                cameraInfo, USER_SECONDARY, true));
+        assertFalse(mService.checkAuthorityGrants(UID_SECONDARY_SOCIAL,
+                cameraInfo, USER_PRIMARY, true));
+        assertFalse(mService.checkAuthorityGrants(UID_SECONDARY_SOCIAL,
+                cameraInfo, USER_SECONDARY, true));
+
+        // And releasing the grant means we lose access
+        owner.removeUriPermissions();
+        assertFalse(mService.checkAuthorityGrants(UID_PRIMARY_SOCIAL,
+                cameraInfo, USER_PRIMARY, true));
+        assertFalse(mService.checkAuthorityGrants(UID_PRIMARY_SOCIAL,
+                cameraInfo, USER_SECONDARY, true));
+    }
+
+    private static <T> Set<T> asSet(T... values) {
+        return new ArraySet<T>(Arrays.asList(values));
+    }
+}
diff --git a/services/tests/servicestests/src/com/android/server/uri/UriGrantsMockContext.java b/services/tests/servicestests/src/com/android/server/uri/UriGrantsMockContext.java
new file mode 100644
index 0000000..989928d
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/uri/UriGrantsMockContext.java
@@ -0,0 +1,207 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.server.uri;
+
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import android.annotation.NonNull;
+import android.app.ActivityManagerInternal;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.ContextWrapper;
+import android.content.Intent;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManagerInternal;
+import android.content.pm.PathPermission;
+import android.content.pm.ProviderInfo;
+import android.net.Uri;
+import android.os.FileUtils;
+import android.os.PatternMatcher;
+import android.os.UserHandle;
+import android.test.mock.MockContentResolver;
+import android.test.mock.MockPackageManager;
+
+import com.android.server.LocalServices;
+
+import java.io.File;
+
+public class UriGrantsMockContext extends ContextWrapper {
+    static final String TAG = "UriGrants";
+
+    static final int FLAG_READ = Intent.FLAG_GRANT_READ_URI_PERMISSION;
+    static final int FLAG_WRITE = Intent.FLAG_GRANT_WRITE_URI_PERMISSION;
+    static final int FLAG_PERSISTABLE = Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION;
+    static final int FLAG_PREFIX = Intent.FLAG_GRANT_PREFIX_URI_PERMISSION;
+
+    static final int USER_PRIMARY = 10;
+    static final int USER_SECONDARY = 11;
+
+    /** Typical social network app */
+    static final String PKG_SOCIAL = "com.example.social";
+    /** Typical camera app that allows grants */
+    static final String PKG_CAMERA = "com.example.camera";
+    /** Completely private app/provider that offers no grants */
+    static final String PKG_PRIVATE = "com.example.private";
+    /** Completely public app/provider that needs no grants */
+    static final String PKG_PUBLIC = "com.example.public";
+    /** Complex provider that offers nested grants */
+    static final String PKG_COMPLEX = "com.example.complex";
+
+    private static final int UID_SOCIAL = android.os.Process.LAST_APPLICATION_UID - 1;
+    private static final int UID_CAMERA = android.os.Process.LAST_APPLICATION_UID - 2;
+    private static final int UID_PRIVATE = android.os.Process.LAST_APPLICATION_UID - 3;
+    private static final int UID_PUBLIC = android.os.Process.LAST_APPLICATION_UID - 4;
+    private static final int UID_COMPLEX = android.os.Process.LAST_APPLICATION_UID - 5;
+
+    static final int UID_PRIMARY_SOCIAL = UserHandle.getUid(USER_PRIMARY, UID_SOCIAL);
+    static final int UID_PRIMARY_CAMERA = UserHandle.getUid(USER_PRIMARY, UID_CAMERA);
+    static final int UID_PRIMARY_PRIVATE = UserHandle.getUid(USER_PRIMARY, UID_PRIVATE);
+    static final int UID_PRIMARY_PUBLIC = UserHandle.getUid(USER_PRIMARY, UID_PUBLIC);
+    static final int UID_PRIMARY_COMPLEX = UserHandle.getUid(USER_PRIMARY, UID_COMPLEX);
+
+    static final int UID_SECONDARY_SOCIAL = UserHandle.getUid(USER_SECONDARY, UID_SOCIAL);
+    static final int UID_SECONDARY_CAMERA = UserHandle.getUid(USER_SECONDARY, UID_CAMERA);
+    static final int UID_SECONDARY_PRIVATE = UserHandle.getUid(USER_SECONDARY, UID_PRIVATE);
+    static final int UID_SECONDARY_PUBLIC = UserHandle.getUid(USER_SECONDARY, UID_PUBLIC);
+    static final int UID_SECONDARY_COMPLEX = UserHandle.getUid(USER_PRIMARY, UID_COMPLEX);
+
+    static final Uri URI_PHOTO_1 = Uri.parse("content://" + PKG_CAMERA + "/1");
+    static final Uri URI_PHOTO_2 = Uri.parse("content://" + PKG_CAMERA + "/2");
+    static final Uri URI_PRIVATE = Uri.parse("content://" + PKG_PRIVATE + "/42");
+    static final Uri URI_PUBLIC = Uri.parse("content://" + PKG_PUBLIC + "/42");
+
+    private final File mDir;
+
+    private final MockPackageManager mPackage;
+    private final MockContentResolver mResolver;
+
+    final ActivityManagerInternal mAmInternal;
+    final PackageManagerInternal mPmInternal;
+
+    public UriGrantsMockContext(@NonNull Context base) {
+        super(base);
+        mDir = new File(base.getFilesDir(), TAG);
+        mDir.mkdirs();
+        FileUtils.deleteContents(mDir);
+
+        mPackage = new MockPackageManager();
+        mResolver = new MockContentResolver(this);
+
+        mAmInternal = mock(ActivityManagerInternal.class);
+        LocalServices.removeServiceForTest(ActivityManagerInternal.class);
+        LocalServices.addService(ActivityManagerInternal.class, mAmInternal);
+
+        mPmInternal = mock(PackageManagerInternal.class);
+        LocalServices.removeServiceForTest(PackageManagerInternal.class);
+        LocalServices.addService(PackageManagerInternal.class, mPmInternal);
+
+        for (int userId : new int[] { USER_PRIMARY, USER_SECONDARY }) {
+            when(mPmInternal.getPackageUidInternal(eq(PKG_SOCIAL), anyInt(), eq(userId)))
+                    .thenReturn(UserHandle.getUid(userId, UID_SOCIAL));
+            when(mPmInternal.getPackageUidInternal(eq(PKG_CAMERA), anyInt(), eq(userId)))
+                    .thenReturn(UserHandle.getUid(userId, UID_CAMERA));
+            when(mPmInternal.getPackageUidInternal(eq(PKG_PRIVATE), anyInt(), eq(userId)))
+                    .thenReturn(UserHandle.getUid(userId, UID_PRIVATE));
+            when(mPmInternal.getPackageUidInternal(eq(PKG_PUBLIC), anyInt(), eq(userId)))
+                    .thenReturn(UserHandle.getUid(userId, UID_PUBLIC));
+            when(mPmInternal.getPackageUidInternal(eq(PKG_COMPLEX), anyInt(), eq(userId)))
+                    .thenReturn(UserHandle.getUid(userId, UID_COMPLEX));
+
+            when(mPmInternal.resolveContentProvider(eq(PKG_CAMERA), anyInt(), eq(userId)))
+                    .thenReturn(buildCameraProvider(userId));
+            when(mPmInternal.resolveContentProvider(eq(PKG_PRIVATE), anyInt(), eq(userId)))
+                    .thenReturn(buildPrivateProvider(userId));
+            when(mPmInternal.resolveContentProvider(eq(PKG_PUBLIC), anyInt(), eq(userId)))
+                    .thenReturn(buildPublicProvider(userId));
+            when(mPmInternal.resolveContentProvider(eq(PKG_COMPLEX), anyInt(), eq(userId)))
+                    .thenReturn(buildComplexProvider(userId));
+        }
+    }
+
+    private static ProviderInfo buildCameraProvider(int userId) {
+        final ProviderInfo pi = new ProviderInfo();
+        pi.packageName = PKG_CAMERA;
+        pi.authority = PKG_CAMERA;
+        pi.readPermission = android.Manifest.permission.READ_EXTERNAL_STORAGE;
+        pi.writePermission = android.Manifest.permission.WRITE_EXTERNAL_STORAGE;
+        pi.grantUriPermissions = true;
+        pi.applicationInfo = new ApplicationInfo();
+        pi.applicationInfo.uid = UserHandle.getUid(userId, UID_CAMERA);
+        return pi;
+    }
+
+    private static ProviderInfo buildPrivateProvider(int userId) {
+        final ProviderInfo pi = new ProviderInfo();
+        pi.packageName = PKG_PRIVATE;
+        pi.authority = PKG_PRIVATE;
+        pi.exported = false;
+        pi.grantUriPermissions = false;
+        pi.applicationInfo = new ApplicationInfo();
+        pi.applicationInfo.uid = UserHandle.getUid(userId, UID_PRIVATE);
+        return pi;
+    }
+
+    private static ProviderInfo buildPublicProvider(int userId) {
+        final ProviderInfo pi = new ProviderInfo();
+        pi.packageName = PKG_PUBLIC;
+        pi.authority = PKG_PUBLIC;
+        pi.exported = true;
+        pi.grantUriPermissions = false;
+        pi.applicationInfo = new ApplicationInfo();
+        pi.applicationInfo.uid = UserHandle.getUid(userId, UID_PUBLIC);
+        return pi;
+    }
+
+    private static ProviderInfo buildComplexProvider(int userId) {
+        final ProviderInfo pi = new ProviderInfo();
+        pi.packageName = PKG_COMPLEX;
+        pi.authority = PKG_COMPLEX;
+        pi.exported = true;
+        pi.grantUriPermissions = true;
+        pi.applicationInfo = new ApplicationInfo();
+        pi.applicationInfo.uid = UserHandle.getUid(userId, UID_COMPLEX);
+        pi.pathPermissions = new PathPermission[] {
+                new PathPermission("/secure", PathPermission.PATTERN_PREFIX,
+                        android.Manifest.permission.READ_EXTERNAL_STORAGE,
+                        android.Manifest.permission.WRITE_EXTERNAL_STORAGE),
+        };
+        pi.uriPermissionPatterns = new PatternMatcher[] {
+                new PatternMatcher("/secure", PathPermission.PATTERN_PREFIX),
+                new PatternMatcher("/insecure", PathPermission.PATTERN_PREFIX),
+        };
+        return pi;
+    }
+
+    @Override
+    public PackageManager getPackageManager() {
+        return mPackage;
+    }
+
+    @Override
+    public ContentResolver getContentResolver() {
+        return mResolver;
+    }
+
+    @Override
+    public File getFilesDir() {
+        return mDir;
+    }
+}
diff --git a/services/tests/servicestests/src/com/android/server/uri/UriPermissionTest.java b/services/tests/servicestests/src/com/android/server/uri/UriPermissionTest.java
new file mode 100644
index 0000000..07005a9
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/uri/UriPermissionTest.java
@@ -0,0 +1,170 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.server.uri;
+
+import static com.android.server.uri.UriGrantsMockContext.FLAG_PERSISTABLE;
+import static com.android.server.uri.UriGrantsMockContext.FLAG_READ;
+import static com.android.server.uri.UriGrantsMockContext.FLAG_WRITE;
+import static com.android.server.uri.UriGrantsMockContext.PKG_CAMERA;
+import static com.android.server.uri.UriGrantsMockContext.PKG_SOCIAL;
+import static com.android.server.uri.UriGrantsMockContext.UID_PRIMARY_SOCIAL;
+import static com.android.server.uri.UriGrantsMockContext.URI_PHOTO_1;
+import static com.android.server.uri.UriGrantsMockContext.URI_PHOTO_2;
+import static com.android.server.uri.UriGrantsMockContext.USER_PRIMARY;
+import static com.android.server.uri.UriPermission.INVALID_TIME;
+import static com.android.server.uri.UriPermission.STRENGTH_GLOBAL;
+import static com.android.server.uri.UriPermission.STRENGTH_NONE;
+import static com.android.server.uri.UriPermission.STRENGTH_OWNED;
+import static com.android.server.uri.UriPermission.STRENGTH_PERSISTABLE;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+public class UriPermissionTest {
+    @Mock
+    private UriGrantsManagerInternal mService;
+
+    @Before
+    public void setUp() throws Exception {
+        MockitoAnnotations.initMocks(this);
+    }
+
+    @Test
+    public void testNone() {
+        final GrantUri grant = new GrantUri(USER_PRIMARY, URI_PHOTO_1, FLAG_READ);
+        final UriPermission perm = new UriPermission(PKG_CAMERA,
+                PKG_SOCIAL, UID_PRIMARY_SOCIAL, grant);
+        assertEquals(STRENGTH_NONE, perm.getStrength(FLAG_READ));
+    }
+
+    @Test
+    public void testGlobal() {
+        final GrantUri grant = new GrantUri(USER_PRIMARY, URI_PHOTO_1, FLAG_READ);
+        final UriPermission perm = new UriPermission(PKG_CAMERA,
+                PKG_SOCIAL, UID_PRIMARY_SOCIAL, grant);
+
+        assertFalse(perm.grantModes(FLAG_READ, null));
+        assertEquals(STRENGTH_GLOBAL, perm.getStrength(FLAG_READ));
+
+        assertFalse(perm.revokeModes(FLAG_READ, true));
+        assertEquals(STRENGTH_NONE, perm.getStrength(FLAG_READ));
+    }
+
+    @Test
+    public void testOwned() {
+        final GrantUri grant = new GrantUri(USER_PRIMARY, URI_PHOTO_1, FLAG_READ);
+        final UriPermission perm = new UriPermission(PKG_CAMERA,
+                PKG_SOCIAL, UID_PRIMARY_SOCIAL, grant);
+        final UriPermissionOwner owner = new UriPermissionOwner(mService, "test");
+
+        assertFalse(perm.grantModes(FLAG_READ, owner));
+        assertEquals(STRENGTH_OWNED, perm.getStrength(FLAG_READ));
+
+        assertFalse(perm.revokeModes(FLAG_READ, false));
+        assertEquals(STRENGTH_OWNED, perm.getStrength(FLAG_READ));
+
+        assertFalse(perm.revokeModes(FLAG_READ, true));
+        assertEquals(STRENGTH_NONE, perm.getStrength(FLAG_READ));
+    }
+
+    @Test
+    public void testOverlap() {
+        final GrantUri grant1 = new GrantUri(USER_PRIMARY, URI_PHOTO_1, FLAG_READ);
+        final GrantUri grant2 = new GrantUri(USER_PRIMARY, URI_PHOTO_2, FLAG_READ);
+
+        final UriPermission photo1 = new UriPermission(PKG_CAMERA,
+                PKG_SOCIAL, UID_PRIMARY_SOCIAL, grant1);
+        final UriPermission photo2 = new UriPermission(PKG_CAMERA,
+                PKG_SOCIAL, UID_PRIMARY_SOCIAL, grant2);
+
+        // Verify behavior when we have multiple owners within the same app
+        final UriPermissionOwner activity = new UriPermissionOwner(mService, "activity");
+        final UriPermissionOwner service = new UriPermissionOwner(mService, "service");
+
+        photo1.grantModes(FLAG_READ | FLAG_WRITE, activity);
+        photo1.grantModes(FLAG_READ, service);
+        photo2.grantModes(FLAG_READ, activity);
+        photo2.grantModes(FLAG_WRITE, null);
+
+        assertEquals(FLAG_READ | FLAG_WRITE, photo1.modeFlags);
+        assertEquals(FLAG_READ | FLAG_WRITE, photo2.modeFlags);
+
+        // Shutting down activity should only trim away write access
+        activity.removeUriPermissions();
+        assertEquals(FLAG_READ, photo1.modeFlags);
+        assertEquals(FLAG_WRITE, photo2.modeFlags);
+
+        // Shutting down service should bring everything else down
+        service.removeUriPermissions();
+        assertEquals(0, photo1.modeFlags);
+        assertEquals(FLAG_WRITE, photo2.modeFlags);
+    }
+
+    @Test
+    public void testPersist() {
+        final GrantUri grant = new GrantUri(USER_PRIMARY, URI_PHOTO_1, FLAG_READ);
+        final UriPermission perm = new UriPermission(PKG_CAMERA,
+                PKG_SOCIAL, UID_PRIMARY_SOCIAL, grant);
+
+        assertFalse(perm.grantModes(FLAG_READ, null));
+        assertFalse(perm.grantModes(FLAG_WRITE | FLAG_PERSISTABLE, null));
+        assertEquals(STRENGTH_GLOBAL, perm.getStrength(FLAG_READ));
+        assertEquals(STRENGTH_PERSISTABLE, perm.getStrength(FLAG_WRITE));
+
+        // Verify behavior of non-persistable mode; nothing happens
+        {
+            assertFalse(perm.takePersistableModes(FLAG_READ));
+            assertEquals(0, perm.persistedModeFlags);
+
+            assertFalse(perm.releasePersistableModes(FLAG_READ));
+            assertEquals(0, perm.persistedModeFlags);
+        }
+
+        // Verify behavior of persistable mode
+        {
+            assertEquals(FLAG_WRITE, perm.persistableModeFlags);
+            assertEquals(0, perm.persistedModeFlags);
+            assertTrue(perm.takePersistableModes(FLAG_WRITE));
+            assertEquals(FLAG_WRITE, perm.persistableModeFlags);
+            assertEquals(FLAG_WRITE, perm.persistedModeFlags);
+
+            // Attempting to take a second time should be a no-op
+            final long createTime = perm.persistedCreateTime;
+            assertFalse(perm.takePersistableModes(FLAG_WRITE));
+            assertEquals(createTime, perm.persistedCreateTime);
+
+            assertTrue(perm.releasePersistableModes(FLAG_WRITE));
+            assertEquals(FLAG_WRITE, perm.persistableModeFlags);
+            assertEquals(0, perm.persistedModeFlags);
+            assertEquals(INVALID_TIME, perm.persistedCreateTime);
+
+            // Attempting to release a second time should be a no-op
+            assertFalse(perm.releasePersistableModes(FLAG_WRITE));
+
+            // We should still be able to take again
+            assertTrue(perm.takePersistableModes(FLAG_WRITE));
+            assertEquals(FLAG_WRITE, perm.persistableModeFlags);
+            assertEquals(FLAG_WRITE, perm.persistedModeFlags);
+        }
+    }
+}
diff --git a/services/tests/uiservicestests/src/com/android/server/UiModeManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/UiModeManagerServiceTest.java
index 69ef499..df92b6e 100644
--- a/services/tests/uiservicestests/src/com/android/server/UiModeManagerServiceTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/UiModeManagerServiceTest.java
@@ -31,7 +31,6 @@
 import android.os.PowerManagerInternal;
 import android.os.PowerSaveState;
 import android.os.RemoteException;
-import android.provider.Settings;
 import android.testing.AndroidTestingRunner;
 import android.testing.TestableLooper;
 import com.android.server.twilight.TwilightManager;
@@ -55,7 +54,6 @@
 import static junit.framework.TestCase.assertTrue;
 import static org.junit.Assert.assertEquals;
 import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.anyLong;
 import static org.mockito.ArgumentMatchers.anyString;
@@ -146,7 +144,7 @@
         addLocalService(PowerManagerInternal.class, mLocalPowerManager);
         addLocalService(TwilightManager.class, mTwilightManager);
         
-        mUiManagerService = new UiModeManagerService(mContext, true);
+        mUiManagerService = new UiModeManagerService(mContext);
         try {
             mUiManagerService.onBootPhase(SystemService.PHASE_SYSTEM_SERVICES_READY);
         } catch (SecurityException e) {/* ignore for permission denial */}
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/ArchiveTest.java b/services/tests/uiservicestests/src/com/android/server/notification/ArchiveTest.java
new file mode 100644
index 0000000..c69ef8d
--- /dev/null
+++ b/services/tests/uiservicestests/src/com/android/server/notification/ArchiveTest.java
@@ -0,0 +1,143 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.server.notification;
+
+import static android.os.UserHandle.USER_CURRENT;
+import static android.os.UserHandle.USER_SYSTEM;
+import static android.service.notification.NotificationListenerService.REASON_CANCEL;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.app.Notification;
+import android.os.UserHandle;
+import android.service.notification.StatusBarNotification;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import androidx.test.runner.AndroidJUnit4;
+
+import com.android.server.UiServiceTestCase;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.MockitoAnnotations;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class ArchiveTest extends UiServiceTestCase {
+    private static final int SIZE = 5;
+
+    private NotificationManagerService.Archive mArchive;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        mArchive = new NotificationManagerService.Archive(SIZE);
+        mArchive.updateHistoryEnabled(USER_SYSTEM, true);
+        mArchive.updateHistoryEnabled(USER_CURRENT, true);
+    }
+
+    private StatusBarNotification getNotification(String pkg, int id, UserHandle user) {
+        Notification n = new Notification.Builder(getContext(), "test")
+                .setContentTitle("A")
+                .setWhen(1205)
+                .build();
+        return  new StatusBarNotification(
+                pkg, pkg, id, null, 0, 0, n, user, null, System.currentTimeMillis());
+    }
+
+
+    @Test
+    public void testRecordAndRead() {
+        List<String> expected = new ArrayList<>();
+        for (int i = 0; i < SIZE; i++) {
+            StatusBarNotification sbn = getNotification("pkg" + i, i,
+                    UserHandle.of(i % 2 ==0 ? USER_SYSTEM : USER_CURRENT));
+            expected.add(sbn.getKey());
+            mArchive.record(sbn, REASON_CANCEL);
+        }
+
+        List<StatusBarNotification> actual = Arrays.asList(mArchive.getArray(SIZE, true));
+        assertThat(actual).hasSize(expected.size());
+        for (StatusBarNotification sbn : actual) {
+            assertThat(expected).contains(sbn.getKey());
+        }
+    }
+
+    @Test
+    public void testRecordAndRead_overLimit() {
+        List<String> expected = new ArrayList<>();
+        for (int i = 0; i < (SIZE * 2); i++) {
+            StatusBarNotification sbn = getNotification("pkg" + i, i, UserHandle.of(USER_SYSTEM));
+            mArchive.record(sbn, REASON_CANCEL);
+            if (i >= SIZE) {
+                expected.add(sbn.getKey());
+            }
+        }
+
+        List<StatusBarNotification> actual = Arrays.asList(mArchive.getArray((SIZE * 2), true));
+        assertThat(actual).hasSize(expected.size());
+        for (StatusBarNotification sbn : actual) {
+            assertThat(expected).contains(sbn.getKey());
+        }
+    }
+
+    @Test
+    public void testDoesNotRecordIfHistoryDisabled() {
+        mArchive.updateHistoryEnabled(USER_CURRENT, false);
+        List<String> expected = new ArrayList<>();
+        for (int i = 0; i < SIZE; i++) {
+            StatusBarNotification sbn = getNotification("pkg" + i, i,
+                    UserHandle.of(i % 2 ==0 ? USER_SYSTEM : USER_CURRENT));
+            mArchive.record(sbn, REASON_CANCEL);
+            if (i % 2 ==0) {
+                expected.add(sbn.getKey());
+            }
+        }
+
+        List<StatusBarNotification> actual = Arrays.asList(mArchive.getArray(SIZE, true));
+        assertThat(actual).hasSize(expected.size());
+        for (StatusBarNotification sbn : actual) {
+            assertThat(expected).contains(sbn.getKey());
+        }
+    }
+
+    @Test
+    public void testRemovesEntriesWhenHistoryDisabled() {
+        mArchive.updateHistoryEnabled(USER_CURRENT, true);
+        List<String> expected = new ArrayList<>();
+        for (int i = 0; i < SIZE; i++) {
+            StatusBarNotification sbn = getNotification("pkg" + i, i,
+                    UserHandle.of(i % 2 ==0 ? USER_SYSTEM : USER_CURRENT));
+            mArchive.record(sbn, REASON_CANCEL);
+            if (i % 2 ==0) {
+                expected.add(sbn.getKey());
+            }
+        }
+        mArchive.updateHistoryEnabled(USER_CURRENT, false);
+
+        List<StatusBarNotification> actual = Arrays.asList(mArchive.getArray(SIZE, true));
+        assertThat(actual).hasSize(expected.size());
+        for (StatusBarNotification sbn : actual) {
+            assertThat(expected).contains(sbn.getKey());
+        }
+    }
+}
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/BubbleCheckerTest.java b/services/tests/uiservicestests/src/com/android/server/notification/BubbleCheckerTest.java
deleted file mode 100644
index 2578ca8..0000000
--- a/services/tests/uiservicestests/src/com/android/server/notification/BubbleCheckerTest.java
+++ /dev/null
@@ -1,261 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.notification;
-
-import static android.content.pm.ActivityInfo.RESIZE_MODE_RESIZEABLE;
-import static android.content.pm.ActivityInfo.RESIZE_MODE_UNRESIZEABLE;
-
-import static junit.framework.Assert.assertTrue;
-
-import static org.junit.Assert.assertFalse;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-import android.app.ActivityManager;
-import android.app.Notification;
-import android.app.NotificationChannel;
-import android.app.PendingIntent;
-import android.content.Intent;
-import android.content.pm.ActivityInfo;
-import android.content.pm.ShortcutInfo;
-import android.os.UserHandle;
-import android.service.notification.StatusBarNotification;
-import android.test.suitebuilder.annotation.SmallTest;
-
-import androidx.test.runner.AndroidJUnit4;
-
-import com.android.server.UiServiceTestCase;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-@SmallTest
-@RunWith(AndroidJUnit4.class)
-public class BubbleCheckerTest extends UiServiceTestCase {
-
-    private static final String SHORTCUT_ID = "shortcut";
-    private static final String PKG = "pkg";
-    private static final String KEY = "key";
-    private static final int USER_ID = 1;
-
-    @Mock
-    ActivityManager mActivityManager;
-    @Mock
-    RankingConfig mRankingConfig;
-    @Mock
-    ShortcutHelper mShortcutHelper;
-
-    @Mock
-    NotificationRecord mNr;
-    @Mock
-    UserHandle mUserHandle;
-    @Mock
-    Notification mNotif;
-    @Mock
-    StatusBarNotification mSbn;
-    @Mock
-    NotificationChannel mChannel;
-    @Mock
-    Notification.BubbleMetadata mBubbleMetadata;
-    @Mock
-    PendingIntent mPendingIntent;
-    @Mock
-    Intent mIntent;
-
-    BubbleExtractor.BubbleChecker mBubbleChecker;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-
-        when(mNr.getKey()).thenReturn(KEY);
-        when(mNr.getSbn()).thenReturn(mSbn);
-        when(mNr.getUser()).thenReturn(mUserHandle);
-        when(mUserHandle.getIdentifier()).thenReturn(USER_ID);
-        when(mNr.getChannel()).thenReturn(mChannel);
-        when(mSbn.getPackageName()).thenReturn(PKG);
-        when(mSbn.getUser()).thenReturn(mUserHandle);
-        when(mNr.getNotification()).thenReturn(mNotif);
-        when(mNotif.getBubbleMetadata()).thenReturn(mBubbleMetadata);
-
-        mBubbleChecker = new BubbleExtractor.BubbleChecker(mContext,
-                mShortcutHelper,
-                mRankingConfig,
-                mActivityManager);
-    }
-
-    void setUpIntentBubble() {
-        when(mPendingIntent.getIntent()).thenReturn(mIntent);
-        when(mBubbleMetadata.getIntent()).thenReturn(mPendingIntent);
-        when(mBubbleMetadata.getShortcutId()).thenReturn(null);
-    }
-
-    void setUpShortcutBubble(boolean isValid) {
-        when(mBubbleMetadata.getShortcutId()).thenReturn(SHORTCUT_ID);
-        ShortcutInfo info = mock(ShortcutInfo.class);
-        when(info.getId()).thenReturn(SHORTCUT_ID);
-        when(mShortcutHelper.getValidShortcutInfo(SHORTCUT_ID, PKG, mUserHandle))
-                .thenReturn(isValid ? info : null);
-        when(mBubbleMetadata.getIntent()).thenReturn(null);
-    }
-
-    void setUpBubblesEnabled(boolean feature, boolean app, boolean channel) {
-        when(mRankingConfig.bubblesEnabled()).thenReturn(feature);
-        when(mRankingConfig.areBubblesAllowed(PKG, USER_ID)).thenReturn(app);
-        when(mChannel.canBubble()).thenReturn(channel);
-    }
-
-    void setUpActivityIntent(boolean isResizable) {
-        when(mPendingIntent.getIntent()).thenReturn(mIntent);
-        ActivityInfo info = new ActivityInfo();
-        info.resizeMode = isResizable
-                ? RESIZE_MODE_RESIZEABLE
-                : RESIZE_MODE_UNRESIZEABLE;
-        when(mIntent.resolveActivityInfo(any(), anyInt())).thenReturn(info);
-    }
-
-    //
-    // canBubble
-    //
-
-    @Test
-    public void testCanBubble_true_intentBubble() {
-        setUpBubblesEnabled(true /* feature */, true /* app */, true /* channel */);
-        setUpIntentBubble();
-        setUpActivityIntent(true /* isResizable */);
-        when(mActivityManager.isLowRamDevice()).thenReturn(false);
-        assertTrue(mBubbleChecker.canBubble(mNr, PKG, USER_ID));
-    }
-
-    @Test
-    public void testCanBubble_true_shortcutBubble() {
-        setUpBubblesEnabled(true /* feature */, true /* app */, true /* channel */);
-        setUpShortcutBubble(true /* isValid */);
-        assertTrue(mBubbleChecker.canBubble(mNr, PKG, USER_ID));
-    }
-
-    @Test
-    public void testCanBubble_false_noIntentInvalidShortcut() {
-        setUpBubblesEnabled(true /* feature */, true /* app */, true /* channel */);
-        setUpShortcutBubble(false /* isValid */);
-        assertFalse(mBubbleChecker.canBubble(mNr, PKG, USER_ID));
-    }
-
-    @Test
-    public void testCanBubble_false_noIntentNoShortcut() {
-        setUpBubblesEnabled(true /* feature */, true /* app */, true /* channel */);
-        when(mBubbleMetadata.getIntent()).thenReturn(null);
-        when(mBubbleMetadata.getShortcutId()).thenReturn(null);
-        assertFalse(mBubbleChecker.canBubble(mNr, PKG, USER_ID));
-    }
-
-    @Test
-    public void testCanBubbble_false_noMetadata() {
-        setUpBubblesEnabled(true/* feature */, true /* app */, true /* channel */);
-        when(mNotif.getBubbleMetadata()).thenReturn(null);
-        assertFalse(mBubbleChecker.canBubble(mNr, PKG, USER_ID));
-    }
-
-    @Test
-    public void testCanBubble_false_bubblesNotEnabled() {
-        setUpBubblesEnabled(false /* feature */, true /* app */, true /* channel */);
-        assertFalse(mBubbleChecker.canBubble(mNr, PKG, USER_ID));
-    }
-
-    @Test
-    public void testCanBubble_false_packageNotAllowed() {
-        setUpBubblesEnabled(true /* feature */, false /* app */, true /* channel */);
-        assertFalse(mBubbleChecker.canBubble(mNr, PKG, USER_ID));
-    }
-
-    @Test
-    public void testCanBubble_false_channelNotAllowed() {
-        setUpBubblesEnabled(true /* feature */, true /* app */, false /* channel */);
-        assertFalse(mBubbleChecker.canBubble(mNr, PKG, USER_ID));
-    }
-
-    //
-    // canLaunchInActivityView
-    //
-
-    @Test
-    public void testCanLaunchInActivityView_true() {
-        setUpActivityIntent(true /* resizable */);
-        assertTrue(mBubbleChecker.canLaunchInActivityView(mContext, mPendingIntent, PKG));
-    }
-
-    @Test
-    public void testCanLaunchInActivityView_false_noIntent() {
-        when(mPendingIntent.getIntent()).thenReturn(null);
-        assertFalse(mBubbleChecker.canLaunchInActivityView(mContext, mPendingIntent, PKG));
-    }
-
-    @Test
-    public void testCanLaunchInActivityView_false_noInfo() {
-        when(mPendingIntent.getIntent()).thenReturn(mIntent);
-        when(mIntent.resolveActivityInfo(any(), anyInt())).thenReturn(null);
-        assertFalse(mBubbleChecker.canLaunchInActivityView(mContext, mPendingIntent, PKG));
-    }
-
-    @Test
-    public void testCanLaunchInActivityView_false_notResizable() {
-        setUpActivityIntent(false  /* resizable */);
-        assertFalse(mBubbleChecker.canLaunchInActivityView(mContext, mPendingIntent, PKG));
-    }
-
-    //
-    // isNotificationAppropriateToBubble
-    //
-
-    @Test
-    public void testIsNotifAppropriateToBubble_true() {
-        setUpBubblesEnabled(true /* feature */, true /* app */, true /* channel */);
-        setUpIntentBubble();
-        when(mActivityManager.isLowRamDevice()).thenReturn(false);
-        setUpActivityIntent(true /* resizable */);
-        doReturn(Notification.MessagingStyle.class).when(mNotif).getNotificationStyle();
-
-        assertTrue(mBubbleChecker.isNotificationAppropriateToBubble(mNr));
-    }
-
-    @Test
-    public void testIsNotifAppropriateToBubble_false_lowRam() {
-        setUpBubblesEnabled(true /* feature */, true /* app */, true /* channel */);
-        when(mActivityManager.isLowRamDevice()).thenReturn(true);
-        setUpActivityIntent(true /* resizable */);
-        doReturn(Notification.MessagingStyle.class).when(mNotif).getNotificationStyle();
-
-        assertFalse(mBubbleChecker.isNotificationAppropriateToBubble(mNr));
-    }
-
-    @Test
-    public void testIsNotifAppropriateToBubble_false_notMessageStyle() {
-        setUpBubblesEnabled(true /* feature */, true /* app */, true /* channel */);
-        when(mActivityManager.isLowRamDevice()).thenReturn(false);
-        setUpActivityIntent(true /* resizable */);
-        doReturn(Notification.BigPictureStyle.class).when(mNotif).getNotificationStyle();
-
-        assertFalse(mBubbleChecker.isNotificationAppropriateToBubble(mNr));
-    }
-
-}
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/BubbleExtractorTest.java b/services/tests/uiservicestests/src/com/android/server/notification/BubbleExtractorTest.java
index 0dbbbaa..3c376c9 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/BubbleExtractorTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/BubbleExtractorTest.java
@@ -15,12 +15,19 @@
  */
 package com.android.server.notification;
 
-import static android.app.NotificationManager.IMPORTANCE_HIGH;
-import static android.app.NotificationManager.IMPORTANCE_UNSPECIFIED;
+import static android.app.NotificationChannel.USER_LOCKED_ALLOW_BUBBLE;
+import static android.app.NotificationManager.BUBBLE_PREFERENCE_ALL;
+import static android.app.NotificationManager.BUBBLE_PREFERENCE_NONE;
+import static android.app.NotificationManager.BUBBLE_PREFERENCE_SELECTED;
+import static android.content.pm.ActivityInfo.RESIZE_MODE_RESIZEABLE;
+import static android.content.pm.ActivityInfo.RESIZE_MODE_UNRESIZEABLE;
 
 import static junit.framework.Assert.assertFalse;
 import static junit.framework.Assert.assertTrue;
 
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
@@ -28,6 +35,12 @@
 import android.app.Notification;
 import android.app.Notification.Builder;
 import android.app.NotificationChannel;
+import android.app.PendingIntent;
+import android.app.Person;
+import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.content.pm.ShortcutInfo;
+import android.os.SystemClock;
 import android.os.UserHandle;
 import android.service.notification.StatusBarNotification;
 import android.test.suitebuilder.annotation.SmallTest;
@@ -46,16 +59,32 @@
 @RunWith(AndroidJUnit4.class)
 public class BubbleExtractorTest extends UiServiceTestCase {
 
-    @Mock RankingConfig mConfig;
-    @Mock BubbleExtractor.BubbleChecker mBubbleChecker;
+    private static final String SHORTCUT_ID = "shortcut";
+    private static final String PKG = "com.android.server.notification";
+    private static final String TAG = null;
+    private static final int ID = 1001;
+    private static final int UID = 1000;
+    private static final int PID = 2000;
+    UserHandle mUser = UserHandle.of(ActivityManager.getCurrentUser());
+
     BubbleExtractor mBubbleExtractor;
 
-    private String mPkg = "com.android.server.notification";
-    private int mId = 1001;
-    private String mTag = null;
-    private int mUid = 1000;
-    private int mPid = 2000;
-    private UserHandle mUser = UserHandle.of(ActivityManager.getCurrentUser());
+    @Mock
+    RankingConfig mConfig;
+    @Mock
+    NotificationChannel mChannel;
+    @Mock
+    Notification.BubbleMetadata mBubbleMetadata;
+    @Mock
+    PendingIntent mPendingIntent;
+    @Mock
+    Intent mIntent;
+    @Mock
+    ShortcutInfo mShortcutInfo;
+    @Mock
+    ShortcutHelper mShortcutHelper;
+    @Mock
+    ActivityManager mActivityManager;
 
     @Before
     public void setUp() {
@@ -63,58 +92,103 @@
         mBubbleExtractor = new BubbleExtractor();
         mBubbleExtractor.initialize(mContext, mock(NotificationUsageStats.class));
         mBubbleExtractor.setConfig(mConfig);
-        mBubbleExtractor.setShortcutHelper(mock(ShortcutHelper.class));
+        mBubbleExtractor.setShortcutHelper(mShortcutHelper);
+        mBubbleExtractor.setActivityManager(mActivityManager);
+
+        when(mConfig.getNotificationChannel(PKG, UID, "a", false)).thenReturn(mChannel);
+        when(mShortcutInfo.getId()).thenReturn(SHORTCUT_ID);
     }
 
-    private NotificationRecord getNotificationRecord(boolean allow, int importanceHigh) {
-        NotificationChannel channel = new NotificationChannel("a", "a", importanceHigh);
-        channel.setAllowBubbles(allow);
-        when(mConfig.getNotificationChannel(mPkg, mUid, "a", false)).thenReturn(channel);
-
+    /* NotificationRecord that fulfills conversation requirements (message style + shortcut) */
+    private NotificationRecord getNotificationRecord(boolean addBubble) {
         final Builder builder = new Builder(getContext())
                 .setContentTitle("foo")
                 .setSmallIcon(android.R.drawable.sym_def_app_icon)
                 .setPriority(Notification.PRIORITY_HIGH)
                 .setDefaults(Notification.DEFAULT_SOUND);
-
+        Person person = new Person.Builder()
+                .setName("bubblebot")
+                .build();
+        builder.setShortcutId(SHORTCUT_ID);
+        builder.setStyle(new Notification.MessagingStyle(person)
+                .setConversationTitle("Bubble Chat")
+                .addMessage("Hello?",
+                        SystemClock.currentThreadTimeMillis() - 300000, person)
+                .addMessage("Is it me you're looking for?",
+                        SystemClock.currentThreadTimeMillis(), person));
         Notification n = builder.build();
-        StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, mId, mTag, mUid,
-                mPid, n, mUser, null, System.currentTimeMillis());
-        NotificationRecord r = new NotificationRecord(getContext(), sbn, channel);
+        if (addBubble) {
+            n.setBubbleMetadata(mBubbleMetadata);
+        }
+        StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, ID, TAG, UID,
+                PID, n, mUser, null, System.currentTimeMillis());
+        NotificationRecord r = new NotificationRecord(getContext(), sbn, mChannel);
+        r.setShortcutInfo(mShortcutInfo);
         return r;
     }
 
+    void setUpIntentBubble(boolean isValid) {
+        when(mPendingIntent.getIntent()).thenReturn(mIntent);
+        when(mBubbleMetadata.getIntent()).thenReturn(mPendingIntent);
+        when(mBubbleMetadata.getShortcutId()).thenReturn(null);
+
+        when(mPendingIntent.getIntent()).thenReturn(mIntent);
+        ActivityInfo info = new ActivityInfo();
+        info.resizeMode = isValid
+                ? RESIZE_MODE_RESIZEABLE
+                : RESIZE_MODE_UNRESIZEABLE;
+        when(mIntent.resolveActivityInfo(any(), anyInt())).thenReturn(info);
+    }
+
+    void setUpShortcutBubble(boolean isValid) {
+        when(mBubbleMetadata.getShortcutId()).thenReturn(SHORTCUT_ID);
+        when(mBubbleMetadata.getIntent()).thenReturn(null);
+        ShortcutInfo answer = isValid ? mShortcutInfo : null;
+        when(mShortcutHelper.getValidShortcutInfo(SHORTCUT_ID, PKG, mUser)).thenReturn(answer);
+    }
+
+    void setUpBubblesEnabled(boolean feature, int app, boolean channel) {
+        when(mConfig.bubblesEnabled()).thenReturn(feature);
+        when(mConfig.getBubblePreference(anyString(), anyInt())).thenReturn(app);
+        when(mChannel.canBubble()).thenReturn(channel);
+    }
+
     //
-    // Tests
+    // Tests for the record being allowed to bubble.
     //
 
     @Test
     public void testAppYesChannelNo() {
-        when(mConfig.bubblesEnabled()).thenReturn(true);
-        when(mConfig.areBubblesAllowed(mPkg, mUid)).thenReturn(true);
-        NotificationRecord r = getNotificationRecord(false, IMPORTANCE_UNSPECIFIED);
-
+        setUpBubblesEnabled(true /* feature */,
+                BUBBLE_PREFERENCE_ALL /* app */,
+                false /* channel */);
+        NotificationRecord r = getNotificationRecord(true /* bubble */);
+        when(mChannel.getUserLockedFields()).thenReturn(USER_LOCKED_ALLOW_BUBBLE);
         mBubbleExtractor.process(r);
 
         assertFalse(r.canBubble());
+        assertFalse(r.getNotification().isBubbleNotification());
     }
 
     @Test
     public void testAppNoChannelYes() throws Exception {
-        when(mConfig.bubblesEnabled()).thenReturn(true);
-        when(mConfig.areBubblesAllowed(mPkg, mUid)).thenReturn(false);
-        NotificationRecord r = getNotificationRecord(true, IMPORTANCE_HIGH);
+        setUpBubblesEnabled(true /* feature */,
+                BUBBLE_PREFERENCE_NONE /* app */,
+                true /* channel */);
+        NotificationRecord r = getNotificationRecord(true /* bubble */);
 
         mBubbleExtractor.process(r);
 
         assertFalse(r.canBubble());
+        assertFalse(r.getNotification().isBubbleNotification());
     }
 
     @Test
     public void testAppYesChannelYes() {
-        when(mConfig.bubblesEnabled()).thenReturn(true);
-        when(mConfig.areBubblesAllowed(mPkg, mUid)).thenReturn(true);
-        NotificationRecord r = getNotificationRecord(true, IMPORTANCE_UNSPECIFIED);
+        setUpBubblesEnabled(true /* feature */,
+                BUBBLE_PREFERENCE_ALL /* app */,
+                true /* channel */);
+        NotificationRecord r = getNotificationRecord(true /* bubble */);
 
         mBubbleExtractor.process(r);
 
@@ -123,34 +197,85 @@
 
     @Test
     public void testAppNoChannelNo() {
-        when(mConfig.bubblesEnabled()).thenReturn(true);
-        when(mConfig.areBubblesAllowed(mPkg, mUid)).thenReturn(false);
-        NotificationRecord r = getNotificationRecord(false, IMPORTANCE_UNSPECIFIED);
+        setUpBubblesEnabled(true /* feature */,
+                BUBBLE_PREFERENCE_NONE /* app */,
+                false /* channel */);
+        NotificationRecord r = getNotificationRecord(true /* bubble */);
 
         mBubbleExtractor.process(r);
 
         assertFalse(r.canBubble());
+        assertFalse(r.getNotification().isBubbleNotification());
     }
 
     @Test
     public void testAppYesChannelYesUserNo() {
-        when(mConfig.bubblesEnabled()).thenReturn(false);
-        when(mConfig.areBubblesAllowed(mPkg, mUid)).thenReturn(true);
-        NotificationRecord r = getNotificationRecord(true, IMPORTANCE_HIGH);
+        setUpBubblesEnabled(false /* feature */,
+                BUBBLE_PREFERENCE_ALL /* app */,
+                true /* channel */);
+        NotificationRecord r = getNotificationRecord(true /* bubble */);
 
         mBubbleExtractor.process(r);
 
         assertFalse(r.canBubble());
+        assertFalse(r.getNotification().isBubbleNotification());
     }
 
     @Test
-    public void testFlagBubble_true() {
-        when(mConfig.bubblesEnabled()).thenReturn(true);
-        when(mConfig.areBubblesAllowed(mPkg, mUid)).thenReturn(true);
-        NotificationRecord r = getNotificationRecord(true, IMPORTANCE_UNSPECIFIED);
+    public void testAppSelectedChannelNo() {
+        setUpBubblesEnabled(true /* feature */,
+                BUBBLE_PREFERENCE_SELECTED /* app */,
+                false /* channel */);
+        NotificationRecord r = getNotificationRecord(true /* bubble */);
 
-        mBubbleExtractor.setBubbleChecker(mBubbleChecker);
-        when(mBubbleChecker.isNotificationAppropriateToBubble(r)).thenReturn(true);
+        mBubbleExtractor.process(r);
+
+        assertFalse(r.canBubble());
+        assertFalse(r.getNotification().isBubbleNotification());
+    }
+
+    @Test
+    public void testAppSeletedChannelYes() {
+        setUpBubblesEnabled(true /* feature */,
+                BUBBLE_PREFERENCE_SELECTED /* app */,
+                true /* channel */);
+        NotificationRecord r = getNotificationRecord(true /* bubble */);
+        when(mChannel.getUserLockedFields()).thenReturn(USER_LOCKED_ALLOW_BUBBLE);
+
+        mBubbleExtractor.process(r);
+
+        assertTrue(r.canBubble());
+    }
+
+    //
+    // Tests for flagging it as a bubble.
+    //
+
+    @Test
+    public void testFlagBubble_false_previouslyRemoved() {
+        setUpBubblesEnabled(true /* feature */,
+                BUBBLE_PREFERENCE_ALL /* app */,
+                true /* channel */);
+        when(mActivityManager.isLowRamDevice()).thenReturn(false);
+
+        NotificationRecord r = getNotificationRecord(true /* bubble */);
+        r.setFlagBubbleRemoved(true);
+
+        mBubbleExtractor.process(r);
+
+        assertTrue(r.canBubble());
+        assertFalse(r.getNotification().isBubbleNotification());
+    }
+
+    @Test
+    public void testFlagBubble_true_shortcutBubble() {
+        setUpBubblesEnabled(true /* feature */,
+                BUBBLE_PREFERENCE_ALL /* app */,
+                true /* channel */);
+        when(mActivityManager.isLowRamDevice()).thenReturn(false);
+        setUpShortcutBubble(true /* isValid */);
+
+        NotificationRecord r = getNotificationRecord(true /* bubble */);
         mBubbleExtractor.process(r);
 
         assertTrue(r.canBubble());
@@ -158,14 +283,142 @@
     }
 
     @Test
-    public void testFlagBubble_noFlag_previouslyRemoved() {
-        when(mConfig.bubblesEnabled()).thenReturn(true);
-        when(mConfig.areBubblesAllowed(mPkg, mUid)).thenReturn(true);
-        NotificationRecord r = getNotificationRecord(true, IMPORTANCE_UNSPECIFIED);
-        r.setFlagBubbleRemoved(true);
+    public void testFlagBubble_true_intentBubble() {
+        setUpBubblesEnabled(true /* feature */,
+                BUBBLE_PREFERENCE_ALL /* app */,
+                true /* channel */);
+        when(mActivityManager.isLowRamDevice()).thenReturn(false);
+        setUpIntentBubble(true /* isValid */);
 
-        mBubbleExtractor.setBubbleChecker(mBubbleChecker);
-        when(mBubbleChecker.isNotificationAppropriateToBubble(r)).thenReturn(true);
+        NotificationRecord r = getNotificationRecord(true /* bubble */);
+        mBubbleExtractor.process(r);
+
+        assertTrue(r.canBubble());
+        assertTrue(r.getNotification().isBubbleNotification());
+    }
+
+    @Test
+    public void testFlagBubble_false_noIntentInvalidShortcut() {
+        setUpBubblesEnabled(true /* feature */,
+                BUBBLE_PREFERENCE_ALL /* app */,
+                true /* channel */);
+        when(mActivityManager.isLowRamDevice()).thenReturn(false);
+        setUpShortcutBubble(false /* isValid */);
+
+        NotificationRecord r = getNotificationRecord(true /* bubble */);
+        r.setShortcutInfo(null);
+        mBubbleExtractor.process(r);
+
+        assertTrue(r.canBubble());
+        assertFalse(r.getNotification().isBubbleNotification());
+    }
+
+    @Test
+    public void testFlagBubble_false_invalidIntentNoShortcut() {
+        setUpBubblesEnabled(true /* feature */,
+                BUBBLE_PREFERENCE_ALL /* app */,
+                true /* channel */);
+        when(mActivityManager.isLowRamDevice()).thenReturn(false);
+        setUpIntentBubble(false /* isValid */);
+
+        NotificationRecord r = getNotificationRecord(true /* bubble */);
+        r.setShortcutInfo(null);
+        mBubbleExtractor.process(r);
+
+        assertTrue(r.canBubble());
+        assertFalse(r.getNotification().isBubbleNotification());
+    }
+
+    @Test
+    public void testFlagBubble_false_noIntentNoShortcut() {
+        setUpBubblesEnabled(true /* feature */,
+                BUBBLE_PREFERENCE_ALL /* app */,
+                true /* channel */);
+        when(mActivityManager.isLowRamDevice()).thenReturn(false);
+
+        // Shortcut here is for the notification not the bubble
+        NotificationRecord r = getNotificationRecord(true /* bubble */);
+        mBubbleExtractor.process(r);
+
+        assertTrue(r.canBubble());
+        assertFalse(r.getNotification().isBubbleNotification());
+    }
+
+    @Test
+    public void testFlagBubble_false_noMetadata() {
+        setUpBubblesEnabled(true /* feature */,
+                BUBBLE_PREFERENCE_ALL /* app */,
+                true /* channel */);
+        when(mActivityManager.isLowRamDevice()).thenReturn(false);
+
+        NotificationRecord r = getNotificationRecord(false /* bubble */);
+        mBubbleExtractor.process(r);
+
+        assertTrue(r.canBubble());
+        assertFalse(r.getNotification().isBubbleNotification());
+    }
+
+    @Test
+    public void testFlagBubble_false_notConversation() {
+        setUpBubblesEnabled(true /* feature */,
+                BUBBLE_PREFERENCE_ALL /* app */,
+                true /* channel */);
+        when(mActivityManager.isLowRamDevice()).thenReturn(false);
+        setUpIntentBubble(true /* isValid */);
+
+        NotificationRecord r = getNotificationRecord(true /* bubble */);
+        // No longer a conversation:
+        r.setShortcutInfo(null);
+        r.getNotification().extras.putString(Notification.EXTRA_TEMPLATE, null);
+
+        mBubbleExtractor.process(r);
+
+        assertTrue(r.canBubble());
+        assertFalse(r.getNotification().isBubbleNotification());
+    }
+
+    @Test
+    public void testFlagBubble_false_lowRamDevice() {
+        setUpBubblesEnabled(true /* feature */,
+                BUBBLE_PREFERENCE_ALL /* app */,
+                true /* channel */);
+        when(mActivityManager.isLowRamDevice()).thenReturn(true);
+        setUpIntentBubble(true /* isValid */);
+
+        NotificationRecord r = getNotificationRecord(true /* bubble */);
+        mBubbleExtractor.process(r);
+
+        assertTrue(r.canBubble());
+        assertFalse(r.getNotification().isBubbleNotification());
+    }
+
+    @Test
+    public void testFlagBubble_false_noIntent() {
+        setUpBubblesEnabled(true /* feature */,
+                BUBBLE_PREFERENCE_ALL /* app */,
+                true /* channel */);
+        when(mActivityManager.isLowRamDevice()).thenReturn(true);
+        setUpIntentBubble(true /* isValid */);
+        when(mPendingIntent.getIntent()).thenReturn(null);
+
+        NotificationRecord r = getNotificationRecord(true /* bubble */);
+        mBubbleExtractor.process(r);
+
+        assertTrue(r.canBubble());
+        assertFalse(r.getNotification().isBubbleNotification());
+    }
+
+    @Test
+    public void testFlagBubble_false_noActivityInfo() {
+        setUpBubblesEnabled(true /* feature */,
+                BUBBLE_PREFERENCE_ALL /* app */,
+                true /* channel */);
+        when(mActivityManager.isLowRamDevice()).thenReturn(true);
+        setUpIntentBubble(true /* isValid */);
+        when(mPendingIntent.getIntent()).thenReturn(mIntent);
+        when(mIntent.resolveActivityInfo(any(), anyInt())).thenReturn(null);
+
+        NotificationRecord r = getNotificationRecord(true /* bubble */);
         mBubbleExtractor.process(r);
 
         assertTrue(r.canBubble());
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/ManagedServicesTest.java b/services/tests/uiservicestests/src/com/android/server/notification/ManagedServicesTest.java
index 7b7470c..99433a6 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/ManagedServicesTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/ManagedServicesTest.java
@@ -77,6 +77,7 @@
 import java.io.ByteArrayOutputStream;
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
@@ -96,6 +97,10 @@
 
     UserInfo mZero = new UserInfo(0, "zero", 0);
     UserInfo mTen = new UserInfo(10, "ten", 0);
+    private String mDefaultsString;
+    private String mVersionString;
+    private final Set<ComponentName> mDefaults = new ArraySet();
+    private ManagedServices mService;
 
     private static final String SETTING = "setting";
     private static final String SECONDARY_SETTING = "secondary_setting";
@@ -106,8 +111,8 @@
     private ArrayMap<Integer, String> mExpectedSecondaryComponentNames;
 
     // type : user : list of approved
-    private ArrayMap<Integer, ArrayMap<Integer, String>> mExpectedPrimary = new ArrayMap<>();
-    private ArrayMap<Integer, ArrayMap<Integer, String>> mExpectedSecondary = new ArrayMap<>();
+    private ArrayMap<Integer, ArrayMap<Integer, String>> mExpectedPrimary;
+    private ArrayMap<Integer, ArrayMap<Integer, String>> mExpectedSecondary;
 
     @Before
     public void setUp() throws Exception {
@@ -132,6 +137,9 @@
         profileIds.add(12);
         when(mUserProfiles.getCurrentProfileIds()).thenReturn(profileIds);
 
+        mVersionString = "2";
+        mExpectedPrimary = new ArrayMap<>();
+        mExpectedSecondary = new ArrayMap<>();
         mExpectedPrimaryPackages = new ArrayMap<>();
         mExpectedPrimaryPackages.put(0, "this.is.a.package.name:another.package");
         mExpectedPrimaryPackages.put(10, "this.is.another.package");
@@ -155,6 +163,8 @@
                 "this.is.another.package:component:package");
         mExpectedSecondary.put(APPROVAL_BY_PACKAGE, mExpectedSecondaryPackages);
         mExpectedSecondary.put(APPROVAL_BY_COMPONENT, mExpectedSecondaryComponentNames);
+        mService = new TestManagedServices(getContext(), mLock, mUserProfiles,
+                mIpm, APPROVAL_BY_COMPONENT);
     }
 
     @Test
@@ -962,7 +972,7 @@
         when(service.asBinder()).thenReturn(mock(IBinder.class));
         ManagedServices services = new TestManagedServices(getContext(), mLock, mUserProfiles,
                 mIpm, APPROVAL_BY_PACKAGE);
-        services.registerService(service, null, 10);
+        services.registerSystemService(service, null, 10);
         ManagedServices.ManagedServiceInfo info = services.checkServiceTokenLocked(service);
         info.isSystem = true;
 
@@ -1178,9 +1188,99 @@
         }
     }
 
+    @Test
+    public void loadDefaults_noVersionNoDefaults() throws Exception {
+        resetComponentsAndPackages();
+        loadXml(mService);
+        assertEquals(mService.getDefaultComponents().size(), 0);
+    }
+
+    @Test
+    public void loadDefaults_noVersionNoDefaultsOneActive() throws Exception {
+        resetComponentsAndPackages();
+        mService.addDefaultComponentOrPackage("package/class");
+        loadXml(mService);
+        assertEquals(1, mService.getDefaultComponents().size());
+        assertTrue(mService.getDefaultComponents()
+                .contains(ComponentName.unflattenFromString("package/class")));
+    }
+
+    @Test
+    public void loadDefaults_noVersionWithDefaults() throws Exception {
+        resetComponentsAndPackages();
+        mDefaults.add(new ComponentName("default", "class"));
+        loadXml(mService);
+        assertEquals(mService.getDefaultComponents(), mDefaults);
+    }
+
+    @Test
+    public void loadDefaults_versionOneWithDefaultsWithActive() throws Exception {
+        resetComponentsAndPackages();
+        mDefaults.add(new ComponentName("default", "class"));
+        mExpectedPrimaryComponentNames.put(0, "package/class");
+        mVersionString = "1";
+        loadXml(mService);
+        assertEquals(mService.getDefaultComponents(),
+                new ArraySet(Arrays.asList(new ComponentName("package", "class"))));
+    }
+
+    @Test
+    public void loadDefaults_versionTwoWithDefaultsWithActive() throws Exception {
+        resetComponentsAndPackages();
+        mDefaults.add(new ComponentName("default", "class"));
+        mDefaultsString = "default/class";
+        mExpectedPrimaryComponentNames.put(0, "package/class");
+        mVersionString = "2";
+        loadXml(mService);
+        assertEquals(1, mService.getDefaultComponents().size());
+        mDefaults.forEach(pkg -> {
+            assertTrue(mService.getDefaultComponents().contains(pkg));
+        });
+    }
+
+    @Test
+    public void loadDefaults_versionOneWithXMLDefaultsWithActive() throws Exception {
+        resetComponentsAndPackages();
+        mDefaults.add(new ComponentName("default", "class"));
+        mDefaultsString = "xml/class";
+        mExpectedPrimaryComponentNames.put(0, "package/class");
+        mVersionString = "1";
+        loadXml(mService);
+        assertEquals(mService.getDefaultComponents(),
+                new ArraySet(Arrays.asList(new ComponentName("xml", "class"))));
+    }
+
+    @Test
+    public void loadDefaults_versionTwoWithXMLDefaultsWithActive() throws Exception {
+        resetComponentsAndPackages();
+        mDefaults.add(new ComponentName("default", "class"));
+        mDefaultsString = "xml/class";
+        mExpectedPrimaryComponentNames.put(0, "package/class");
+        mVersionString = "2";
+        loadXml(mService);
+        assertEquals(mService.getDefaultComponents(),
+                new ArraySet(Arrays.asList(new ComponentName("xml", "class"))));
+    }
+
+    private void resetComponentsAndPackages() {
+        ArrayMap<Integer, ArrayMap<Integer, String>> empty = new ArrayMap(1);
+        ArrayMap<Integer, String> emptyPkgs = new ArrayMap(0);
+        empty.append(mService.mApprovalLevel, emptyPkgs);
+        mExpectedPrimary = empty;
+        mExpectedPrimaryComponentNames = emptyPkgs;
+        mExpectedPrimaryPackages = emptyPkgs;
+        mExpectedSecondary = empty;
+        mExpectedSecondaryComponentNames = emptyPkgs;
+        mExpectedSecondaryPackages = emptyPkgs;
+    }
+
     private void loadXml(ManagedServices service) throws Exception {
         final StringBuffer xml = new StringBuffer();
-        xml.append("<" + service.getConfig().xmlTag + ">\n");
+        String xmlTag = service.getConfig().xmlTag;
+        xml.append("<" + xmlTag
+                + (mDefaultsString != null ? " defaults=\"" + mDefaultsString + "\" " : "")
+                + (mVersionString != null ? " version=\"" + mVersionString + "\" " : "")
+                + ">\n");
         for (int userId : mExpectedPrimary.get(service.mApprovalLevel).keySet()) {
             xml.append(getXmlEntry(
                     mExpectedPrimary.get(service.mApprovalLevel).get(userId), userId, true));
@@ -1197,7 +1297,7 @@
                 + ManagedServices.ATT_USER_ID + "=\"98\" "
                 + ManagedServices.ATT_IS_PRIMARY + "=\"false\" "
                 + ManagedServices.ATT_APPROVED_LIST + "=\"98\" />\n");
-        xml.append("</" + service.getConfig().xmlTag + ">");
+        xml.append("</" + xmlTag + ">");
 
         XmlPullParser parser = Xml.newPullParser();
         parser.setInput(new BufferedInputStream(
@@ -1224,6 +1324,7 @@
 
     private void addExpectedServices(final ManagedServices service, final List<String> packages,
             int userId) {
+        ManagedServices.Config config = service.getConfig();
         when(mPm.queryIntentServicesAsUser(any(), anyInt(), eq(userId))).
                 thenAnswer(new Answer<List<ResolveInfo>>() {
                     @Override
@@ -1233,7 +1334,7 @@
                         Intent invocationIntent = (Intent) args[0];
                         if (invocationIntent != null) {
                             if (invocationIntent.getAction().equals(
-                                    service.getConfig().serviceInterface)
+                                    config.serviceInterface)
                                     && packages.contains(invocationIntent.getPackage())) {
                                 List<ResolveInfo> dummyServices = new ArrayList<>();
                                 for (int i = 1; i <= 3; i ++) {
@@ -1431,6 +1532,11 @@
         }
 
         @Override
+        protected void loadDefaultsFromConfig() {
+            mDefaultComponents.addAll(mDefaults);
+        }
+
+        @Override
         protected String getRequiredPermission() {
             return null;
         }
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationAssistantsTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationAssistantsTest.java
index 88186cd..ab4dc47 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationAssistantsTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationAssistantsTest.java
@@ -72,13 +72,13 @@
 
     Object mLock = new Object();
 
+
     UserInfo mZero = new UserInfo(0, "zero", 0);
     UserInfo mTen = new UserInfo(10, "ten", 0);
 
     @Before
     public void setUp() throws Exception {
         MockitoAnnotations.initMocks(this);
-
         getContext().setMockPackageManager(mPm);
         getContext().addMockSystemService(Context.USER_SERVICE, mUm);
         mAssistants = spy(mNm.new NotificationAssistants(getContext(), mLock, mUserProfiles, miPm));
@@ -122,7 +122,7 @@
 
     @Test
     public void testXmlUpgradeExistingApprovedComponents() throws Exception {
-        String xml = "<enabled_assistants>"
+        String xml = "<enabled_assistants version=\"2\" defaults=\"b\\b\">"
                 + "<service_listing approved=\"b/b\" user=\"10\" primary=\"true\" />"
                 + "</enabled_assistants>";
 
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
index 15220e1..41748b8 100755
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
@@ -21,6 +21,10 @@
 import static android.app.Notification.FLAG_AUTO_CANCEL;
 import static android.app.Notification.FLAG_BUBBLE;
 import static android.app.Notification.FLAG_FOREGROUND_SERVICE;
+import static android.app.NotificationChannel.USER_LOCKED_ALLOW_BUBBLE;
+import static android.app.NotificationManager.BUBBLE_PREFERENCE_ALL;
+import static android.app.NotificationManager.BUBBLE_PREFERENCE_NONE;
+import static android.app.NotificationManager.BUBBLE_PREFERENCE_SELECTED;
 import static android.app.NotificationManager.EXTRA_BLOCKED_STATE;
 import static android.app.NotificationManager.IMPORTANCE_DEFAULT;
 import static android.app.NotificationManager.IMPORTANCE_HIGH;
@@ -39,6 +43,7 @@
 import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_SCREEN_OFF;
 import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_SCREEN_ON;
 import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_STATUS_BAR;
+import static android.content.pm.ActivityInfo.RESIZE_MODE_RESIZEABLE;
 import static android.content.pm.PackageManager.FEATURE_WATCH;
 import static android.content.pm.PackageManager.PERMISSION_DENIED;
 import static android.content.pm.PackageManager.PERMISSION_GRANTED;
@@ -101,12 +106,14 @@
 import android.content.ContentUris;
 import android.content.Context;
 import android.content.Intent;
+import android.content.pm.ActivityInfo;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.IPackageManager;
 import android.content.pm.LauncherApps;
 import android.content.pm.PackageManager;
 import android.content.pm.ParceledListSlice;
 import android.content.pm.ShortcutInfo;
+import android.content.pm.ShortcutServiceInternal;
 import android.content.pm.UserInfo;
 import android.content.res.Resources;
 import android.graphics.Color;
@@ -204,7 +211,6 @@
     private TestableNotificationManagerService mService;
     private INotificationManager mBinderService;
     private NotificationManagerInternal mInternalService;
-    private TestableBubbleChecker mTestableBubbleChecker;
     private ShortcutHelper mShortcutHelper;
     @Mock
     private IPackageManager mPackageManager;
@@ -229,6 +235,8 @@
     @Mock
     private LauncherApps mLauncherApps;
     @Mock
+    private ShortcutServiceInternal mShortcutServiceInternal;
+    @Mock
     ActivityManager mActivityManager;
     @Mock
     Resources mResources;
@@ -347,21 +355,6 @@
         }
     }
 
-    private class TestableBubbleChecker extends BubbleExtractor.BubbleChecker {
-
-        TestableBubbleChecker(Context context, ShortcutHelper helper, RankingConfig config,
-                ActivityManager manager) {
-            super(context, helper, config, manager);
-        }
-
-        @Override
-        protected boolean canLaunchInActivityView(Context context, PendingIntent pendingIntent,
-                String packageName) {
-            // Tests for this not being true are in CTS NotificationManagerTest
-            return true;
-        }
-    }
-
     private class TestableToastCallback extends ITransientNotification.Stub {
         @Override
         public void show(IBinder windowToken) {
@@ -476,13 +469,12 @@
 
         mShortcutHelper = mService.getShortcutHelper();
         mShortcutHelper.setLauncherApps(mLauncherApps);
+        mShortcutHelper.setShortcutServiceInternal(mShortcutServiceInternal);
 
         // Set the testable bubble extractor
         RankingHelper rankingHelper = mService.getRankingHelper();
         BubbleExtractor extractor = rankingHelper.findExtractor(BubbleExtractor.class);
-        mTestableBubbleChecker = new TestableBubbleChecker(mContext, mShortcutHelper,
-                mService.mPreferencesHelper, mActivityManager);
-        extractor.setBubbleChecker(mTestableBubbleChecker);
+        extractor.setActivityManager(mActivityManager);
 
         // Tests call directly into the Binder.
         mBinderService = mService.getBinderService();
@@ -544,13 +536,13 @@
     }
 
     private void setUpPrefsForBubbles(String pkg, int uid, boolean globalEnabled,
-            boolean pkgEnabled, boolean channelEnabled) {
+            int pkgPref, boolean channelEnabled) {
         Settings.Global.putInt(mContext.getContentResolver(),
                 Settings.Global.NOTIFICATION_BUBBLES, globalEnabled ? 1 : 0);
         mService.mPreferencesHelper.updateBubblesEnabled();
         assertEquals(globalEnabled, mService.mPreferencesHelper.bubblesEnabled());
         try {
-            mBinderService.setBubblesAllowed(pkg, uid, pkgEnabled);
+            mBinderService.setBubblesAllowed(pkg, uid, pkgPref);
         } catch (RemoteException e) {
             e.printStackTrace();
         }
@@ -687,19 +679,12 @@
                 false);
     }
 
-    private Notification.BubbleMetadata.Builder getBubbleMetadataBuilder() {
-        PendingIntent pi = PendingIntent.getActivity(mContext, 0, new Intent(), 0);
-        return new Notification.BubbleMetadata.Builder(pi,
-                Icon.createWithResource(mContext, android.R.drawable.sym_def_app_icon));
-    }
-
     private Notification.Builder getMessageStyleNotifBuilder(boolean addBubbleMetadata,
             String groupKey, boolean isSummary) {
         // Give it a person
         Person person = new Person.Builder()
                 .setName("bubblebot")
                 .build();
-        // It needs remote input to be bubble-able
         RemoteInput remoteInput = new RemoteInput.Builder("reply_key").setLabel("reply").build();
         PendingIntent inputIntent = PendingIntent.getActivity(mContext, 0, new Intent(), 0);
         Icon icon = Icon.createWithResource(mContext, android.R.drawable.sym_def_app_icon);
@@ -724,11 +709,26 @@
             nb.setGroup(groupKey);
         }
         if (addBubbleMetadata) {
-            nb.setBubbleMetadata(getBubbleMetadataBuilder().build());
+            nb.setBubbleMetadata(getBubbleMetadata());
         }
         return nb;
     }
 
+    private Notification.BubbleMetadata getBubbleMetadata() {
+        PendingIntent pendingIntent = mock(PendingIntent.class);
+        Intent intent = mock(Intent.class);
+        when(pendingIntent.getIntent()).thenReturn(intent);
+
+        ActivityInfo info = new ActivityInfo();
+        info.resizeMode = RESIZE_MODE_RESIZEABLE;
+        when(intent.resolveActivityInfo(any(), anyInt())).thenReturn(info);
+
+        return new Notification.BubbleMetadata.Builder(
+                pendingIntent,
+                Icon.createWithResource(mContext, android.R.drawable.sym_def_app_icon))
+                .build();
+    }
+
     private NotificationRecord addGroupWithBubblesAndValidateAdded(boolean summaryAutoCancel)
             throws RemoteException {
 
@@ -786,33 +786,16 @@
         userInfos.add(new UserInfo(0, "", 0));
         final ArraySet<ComponentName> validAssistants = new ArraySet<>();
         validAssistants.add(ComponentName.unflattenFromString(testComponent));
-        final String originalComponent = DeviceConfig.getProperty(
-                DeviceConfig.NAMESPACE_SYSTEMUI,
-                SystemUiDeviceConfigFlags.NAS_DEFAULT_SERVICE
-        );
-        DeviceConfig.setProperty(
-                DeviceConfig.NAMESPACE_SYSTEMUI,
-                SystemUiDeviceConfigFlags.NAS_DEFAULT_SERVICE,
-                testComponent,
-                false
-        );
         when(mActivityManager.isLowRamDevice()).thenReturn(false);
         when(mAssistants.queryPackageForServices(isNull(), anyInt(), anyInt()))
                 .thenReturn(validAssistants);
-        when(mAssistants.getDefaultComponents()).thenReturn(new ArraySet<>());
+        when(mAssistants.getDefaultComponents()).thenReturn(validAssistants);
         when(mUm.getEnabledProfiles(anyInt())).thenReturn(userInfos);
 
         mService.setDefaultAssistantForUser(userId);
 
         verify(mAssistants).setPackageOrComponentEnabled(
                 eq(testComponent), eq(userId), eq(true), eq(true));
-
-        DeviceConfig.setProperty(
-                DeviceConfig.NAMESPACE_SYSTEMUI,
-                SystemUiDeviceConfigFlags.NAS_DEFAULT_SERVICE,
-                originalComponent,
-                false
-        );
     }
 
     @Test
@@ -4483,24 +4466,31 @@
 
     @Test
     public void testBubble() throws Exception {
-        mBinderService.setBubblesAllowed(PKG, mUid, false);
-        assertFalse(mBinderService.areBubblesAllowedForPackage(PKG, mUid));
+        mBinderService.setBubblesAllowed(PKG, mUid, BUBBLE_PREFERENCE_NONE);
+        assertFalse(mBinderService.areBubblesAllowed(PKG));
+        assertEquals(mBinderService.getBubblePreferenceForPackage(PKG, mUid),
+                BUBBLE_PREFERENCE_NONE);
     }
 
     @Test
-    public void testUserApprovedBubblesForPackage() throws Exception {
-        assertFalse(mBinderService.hasUserApprovedBubblesForPackage(PKG, mUid));
-        mBinderService.setBubblesAllowed(PKG, mUid, true);
-        assertTrue(mBinderService.hasUserApprovedBubblesForPackage(PKG, mUid));
-        assertTrue(mBinderService.areBubblesAllowedForPackage(PKG, mUid));
+    public void testUserApprovedBubblesForPackageSelected() throws Exception {
+        mBinderService.setBubblesAllowed(PKG, mUid, BUBBLE_PREFERENCE_SELECTED);
+        assertEquals(mBinderService.getBubblePreferenceForPackage(PKG, mUid),
+                BUBBLE_PREFERENCE_SELECTED);
+    }
+
+    @Test
+    public void testUserApprovedBubblesForPackageAll() throws Exception {
+        mBinderService.setBubblesAllowed(PKG, mUid, BUBBLE_PREFERENCE_ALL);
+        assertTrue(mBinderService.areBubblesAllowed(PKG));
+        assertEquals(mBinderService.getBubblePreferenceForPackage(PKG, mUid),
+                BUBBLE_PREFERENCE_ALL);
     }
 
     @Test
     public void testUserRejectsBubblesForPackage() throws Exception {
-        assertFalse(mBinderService.hasUserApprovedBubblesForPackage(PKG, mUid));
-        mBinderService.setBubblesAllowed(PKG, mUid, false);
-        assertTrue(mBinderService.hasUserApprovedBubblesForPackage(PKG, mUid));
-        assertFalse(mBinderService.areBubblesAllowedForPackage(PKG, mUid));
+        mBinderService.setBubblesAllowed(PKG, mUid, BUBBLE_PREFERENCE_NONE);
+        assertFalse(mBinderService.areBubblesAllowed(PKG));
     }
 
     @Test
@@ -5166,8 +5156,10 @@
 
     @Test
     public void testFlagBubble() throws RemoteException {
-        // Bubbles are allowed!
-        setUpPrefsForBubbles(PKG, mUid, true /* global */, true /* app */, true /* channel */);
+        setUpPrefsForBubbles(PKG, mUid,
+                true /* global */,
+                BUBBLE_PREFERENCE_ALL /* app */,
+                true /* channel */);
 
         NotificationRecord nr =
                 generateMessageBubbleNotifRecord(mTestNotificationChannel, "testFlagBubble");
@@ -5185,8 +5177,10 @@
 
     @Test
     public void testFlagBubble_noFlag_appNotAllowed() throws RemoteException {
-        // Bubbles are allowed!
-        setUpPrefsForBubbles(PKG, mUid, true /* global */, false /* app */, true /* channel */);
+        setUpPrefsForBubbles(PKG, mUid,
+                true /* global */,
+                BUBBLE_PREFERENCE_NONE /* app */,
+                true /* channel */);
 
         NotificationRecord nr = generateMessageBubbleNotifRecord(mTestNotificationChannel,
                         "testFlagBubble_noFlag_appNotAllowed");
@@ -5204,15 +5198,17 @@
 
     @Test
     public void testFlagBubbleNotifs_noFlag_whenAppForeground() throws RemoteException {
-        // Bubbles are allowed!
-        setUpPrefsForBubbles(PKG, mUid, true /* global */, true /* app */, true /* channel */);
+        setUpPrefsForBubbles(PKG, mUid,
+                true /* global */,
+                BUBBLE_PREFERENCE_ALL /* app */,
+                true /* channel */);
 
         // Notif with bubble metadata but not our other misc requirements
         Notification.Builder nb = new Notification.Builder(mContext,
                 mTestNotificationChannel.getId())
                 .setContentTitle("foo")
                 .setSmallIcon(android.R.drawable.sym_def_app_icon)
-                .setBubbleMetadata(getBubbleMetadataBuilder().build());
+                .setBubbleMetadata(getBubbleMetadata());
         StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 1, "tag", mUid, 0,
                 nb.build(), new UserHandle(mUid), null, 0);
         NotificationRecord nr = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
@@ -5232,8 +5228,10 @@
 
     @Test
     public void testFlagBubbleNotifs_flag_messaging() throws RemoteException {
-        // Bubbles are allowed!
-        setUpPrefsForBubbles(PKG, mUid, true /* global */, true /* app */, true /* channel */);
+        setUpPrefsForBubbles(PKG, mUid,
+                true /* global */,
+                BUBBLE_PREFERENCE_ALL /* app */,
+                true /* channel */);
 
         NotificationRecord nr = generateMessageBubbleNotifRecord(mTestNotificationChannel,
                 "testFlagBubbleNotifs_flag_messaging");
@@ -5249,8 +5247,10 @@
 
     @Test
     public void testFlagBubbleNotifs_noFlag_messaging_appNotAllowed() throws RemoteException {
-        // Bubbles are NOT allowed!
-        setUpPrefsForBubbles(PKG, mUid, true /* global */, false /* app */, true /* channel */);
+        setUpPrefsForBubbles(PKG, mUid,
+                true /* global */,
+                BUBBLE_PREFERENCE_NONE /* app */,
+                true /* channel */);
 
         NotificationRecord nr = generateMessageBubbleNotifRecord(mTestNotificationChannel,
                 "testFlagBubbleNotifs_noFlag_messaging_appNotAllowed");
@@ -5267,8 +5267,10 @@
 
     @Test
     public void testFlagBubbleNotifs_noFlag_notBubble() throws RemoteException {
-        // Bubbles are allowed!
-        setUpPrefsForBubbles(PKG, mUid, true /* global */, true /* app */, true /* channel */);
+        setUpPrefsForBubbles(PKG, mUid,
+                true /* global */,
+                BUBBLE_PREFERENCE_ALL /* app */,
+                true /* channel */);
 
         // Messaging notif WITHOUT bubble metadata
         Notification.Builder nb = getMessageStyleNotifBuilder(false /* addBubbleMetadata */,
@@ -5291,11 +5293,14 @@
 
     @Test
     public void testFlagBubbleNotifs_noFlag_messaging_channelNotAllowed() throws RemoteException {
-        // Bubbles are allowed except on this channel
-        setUpPrefsForBubbles(PKG, mUid, true /* global */, true /* app */, false /* channel */);
+        setUpPrefsForBubbles(PKG, mUid,
+                true /* global */,
+                BUBBLE_PREFERENCE_ALL /* app */,
+                false /* channel */);
 
         NotificationRecord nr = generateMessageBubbleNotifRecord(mTestNotificationChannel,
                 "testFlagBubbleNotifs_noFlag_messaging_channelNotAllowed");
+        nr.getChannel().lockFields(USER_LOCKED_ALLOW_BUBBLE);
 
         // Post the notification
         mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
@@ -5488,7 +5493,7 @@
     @Test
     public void testAreBubblesAllowedForPackage_crossUser() throws Exception {
         try {
-            mBinderService.areBubblesAllowedForPackage(mContext.getPackageName(),
+            mBinderService.getBubblePreferenceForPackage(mContext.getPackageName(),
                     mUid + UserHandle.PER_USER_RANGE);
             fail("Cannot call cross user without permission");
         } catch (SecurityException e) {
@@ -5497,7 +5502,7 @@
 
         // cross user, with permission, no problem
         enableInteractAcrossUsers();
-        mBinderService.areBubblesAllowedForPackage(mContext.getPackageName(),
+        mBinderService.getBubblePreferenceForPackage(mContext.getPackageName(),
                 mUid + UserHandle.PER_USER_RANGE);
     }
 
@@ -5508,8 +5513,10 @@
 
     @Test
     public void testNotificationBubbleChanged_false() throws Exception {
-        // Bubbles are allowed!
-        setUpPrefsForBubbles(PKG, mUid, true /* global */, true /* app */, true /* channel */);
+        setUpPrefsForBubbles(PKG, mUid,
+                true /* global */,
+                BUBBLE_PREFERENCE_ALL /* app */,
+                true /* channel */);
 
         // Notif with bubble metadata
         NotificationRecord nr = generateMessageBubbleNotifRecord(mTestNotificationChannel,
@@ -5528,7 +5535,7 @@
         assertTrue((notifsBefore[0].getNotification().flags & FLAG_BUBBLE) != 0);
 
         // Notify we're not a bubble
-        mService.mNotificationDelegate.onNotificationBubbleChanged(nr.getKey(), false);
+        mService.mNotificationDelegate.onNotificationBubbleChanged(nr.getKey(), false, 0);
         waitForIdle();
 
         // Make sure we are not a bubble
@@ -5539,8 +5546,10 @@
 
     @Test
     public void testNotificationBubbleChanged_true() throws Exception {
-        // Bubbles are allowed!
-        setUpPrefsForBubbles(PKG, mUid, true /* global */, true /* app */, true /* channel */);
+        setUpPrefsForBubbles(PKG, mUid,
+                true /* global */,
+                BUBBLE_PREFERENCE_ALL /* app */,
+                true /* channel */);
 
         // Notif that is not a bubble
         NotificationRecord nr = generateNotificationRecord(mTestNotificationChannel,
@@ -5565,7 +5574,7 @@
         reset(mListeners);
 
         // Notify we are now a bubble
-        mService.mNotificationDelegate.onNotificationBubbleChanged(nr.getKey(), true);
+        mService.mNotificationDelegate.onNotificationBubbleChanged(nr.getKey(), true, 0);
         waitForIdle();
 
         // Make sure we are a bubble
@@ -5576,8 +5585,10 @@
 
     @Test
     public void testNotificationBubbleChanged_true_notAllowed() throws Exception {
-        // Bubbles are allowed!
-        setUpPrefsForBubbles(PKG, mUid, true /* global */, true /* app */, true /* channel */);
+        setUpPrefsForBubbles(PKG, mUid,
+                true /* global */,
+                BUBBLE_PREFERENCE_ALL /* app */,
+                true /* channel */);
 
         // Notif that is not a bubble
         NotificationRecord nr = generateNotificationRecord(mTestNotificationChannel);
@@ -5594,7 +5605,7 @@
         assertEquals((notifsBefore[0].getNotification().flags & FLAG_BUBBLE), 0);
 
         // Notify we are now a bubble
-        mService.mNotificationDelegate.onNotificationBubbleChanged(nr.getKey(), true);
+        mService.mNotificationDelegate.onNotificationBubbleChanged(nr.getKey(), true, 0);
         waitForIdle();
 
         // We still wouldn't be a bubble because the notification didn't meet requirements
@@ -5605,8 +5616,11 @@
 
     @Test
     public void testNotificationBubbleIsFlagRemoved_resetOnUpdate() throws Exception {
-        // Bubbles are allowed!
-        setUpPrefsForBubbles(PKG, mUid, true /* global */, true /* app */, true /* channel */);
+        setUpPrefsForBubbles(PKG, mUid,
+                true /* global */,
+                BUBBLE_PREFERENCE_ALL /* app */,
+                true /* channel */);
+
         // Notif with bubble metadata
         NotificationRecord nr = generateMessageBubbleNotifRecord(mTestNotificationChannel,
                 "testNotificationBubbleIsFlagRemoved_resetOnUpdate");
@@ -5619,7 +5633,7 @@
         assertFalse(recordToCheck.isFlagBubbleRemoved());
 
         // Notify we're not a bubble
-        mService.mNotificationDelegate.onNotificationBubbleChanged(nr.getKey(), false);
+        mService.mNotificationDelegate.onNotificationBubbleChanged(nr.getKey(), false, 0);
         waitForIdle();
         // Flag should be modified
         recordToCheck = mService.getNotificationRecord(nr.getSbn().getKey());
@@ -5637,8 +5651,11 @@
 
     @Test
     public void testNotificationBubbleIsFlagRemoved_resetOnBubbleChangedTrue() throws Exception {
-        // Bubbles are allowed!
-        setUpPrefsForBubbles(PKG, mUid, true /* global */, true /* app */, true /* channel */);
+        setUpPrefsForBubbles(PKG, mUid,
+                true /* global */,
+                BUBBLE_PREFERENCE_ALL /* app */,
+                true /* channel */);
+
         // Notif with bubble metadata
         NotificationRecord nr = generateMessageBubbleNotifRecord(mTestNotificationChannel,
                 "testNotificationBubbleIsFlagRemoved_trueOnBubbleChangedTrue");
@@ -5651,14 +5668,14 @@
         assertFalse(recordToCheck.isFlagBubbleRemoved());
 
         // Notify we're not a bubble
-        mService.mNotificationDelegate.onNotificationBubbleChanged(nr.getKey(), false);
+        mService.mNotificationDelegate.onNotificationBubbleChanged(nr.getKey(), false, 0);
         waitForIdle();
         // Flag should be modified
         recordToCheck = mService.getNotificationRecord(nr.getSbn().getKey());
         assertTrue(recordToCheck.isFlagBubbleRemoved());
 
         // Notify we are a bubble
-        mService.mNotificationDelegate.onNotificationBubbleChanged(nr.getKey(), true);
+        mService.mNotificationDelegate.onNotificationBubbleChanged(nr.getKey(), true, 0);
         waitForIdle();
         // And the flag is reset
         assertFalse(recordToCheck.isFlagBubbleRemoved());
@@ -5666,16 +5683,14 @@
 
     @Test
     public void testOnBubbleNotificationSuppressionChanged() throws Exception {
-        // Bubbles are allowed!
-        setUpPrefsForBubbles(PKG, mUid, true /* global */, true /* app */, true /* channel */);
+        setUpPrefsForBubbles(PKG, mUid,
+                true /* global */,
+                BUBBLE_PREFERENCE_ALL /* app */,
+                true /* channel */);
 
         // Bubble notification
         NotificationRecord nr = generateMessageBubbleNotifRecord(mTestNotificationChannel, "tag");
 
-        // Bubbles are allowed!
-        setUpPrefsForBubbles(PKG, nr.getSbn().getUserId(), true /* global */,
-                true /* app */, true /* channel */);
-
         mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
                 nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
         waitForIdle();
@@ -5888,8 +5903,10 @@
 
     @Test
     public void testNotificationBubbles_disabled_lowRamDevice() throws Exception {
-        // Bubbles are allowed!
-        setUpPrefsForBubbles(PKG, mUid, true /* global */, true /* app */, true /* channel */);
+        setUpPrefsForBubbles(PKG, mUid,
+                true /* global */,
+                BUBBLE_PREFERENCE_ALL /* app */,
+                true /* channel */);
 
         // And we are low ram
         when(mActivityManager.isLowRamDevice()).thenReturn(true);
@@ -5972,8 +5989,10 @@
     @Test
     public void testNotificationBubbles_flagAutoExpandForeground_fails_notForeground()
             throws Exception {
-        // Bubbles are allowed!
-        setUpPrefsForBubbles(PKG, mUid, true /* global */, true /* app */, true /* channel */);
+        setUpPrefsForBubbles(PKG, mUid,
+                true /* global */,
+                BUBBLE_PREFERENCE_ALL /* app */,
+                true /* channel */);
 
         NotificationRecord nr = generateMessageBubbleNotifRecord(mTestNotificationChannel,
                 "testNotificationBubbles_flagAutoExpandForeground_fails_notForeground");
@@ -6002,8 +6021,10 @@
     @Test
     public void testNotificationBubbles_flagAutoExpandForeground_succeeds_foreground()
             throws RemoteException {
-        // Bubbles are allowed!
-        setUpPrefsForBubbles(PKG, mUid, true /* global */, true /* app */, true /* channel */);
+        setUpPrefsForBubbles(PKG, mUid,
+                true /* global */,
+                BUBBLE_PREFERENCE_ALL /* app */,
+                true /* channel */);
 
         NotificationRecord nr = generateMessageBubbleNotifRecord(mTestNotificationChannel,
                 "testNotificationBubbles_flagAutoExpandForeground_succeeds_foreground");
@@ -6032,17 +6053,21 @@
     @Test
     public void testNotificationBubbles_flagRemoved_whenShortcutRemoved()
             throws RemoteException {
-        // Bubbles are allowed!
-        setUpPrefsForBubbles(PKG, mUid, true /* global */, true /* app */, true /* channel */);
+        final String shortcutId = "someshortcutId";
+        setUpPrefsForBubbles(PKG, mUid,
+                true /* global */,
+                BUBBLE_PREFERENCE_ALL /* app */,
+                true /* channel */);
 
         ArgumentCaptor<LauncherApps.Callback> launcherAppsCallback =
                 ArgumentCaptor.forClass(LauncherApps.Callback.class);
 
         // Messaging notification with shortcut info
         Notification.BubbleMetadata metadata =
-                new Notification.BubbleMetadata.Builder("someshortcutId").build();
+                new Notification.BubbleMetadata.Builder(shortcutId).build();
         Notification.Builder nb = getMessageStyleNotifBuilder(false /* addDefaultMetadata */,
                 null /* groupKey */, false /* isSummary */);
+        nb.setShortcutId(shortcutId);
         nb.setBubbleMetadata(metadata);
         StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 1,
                 "tag", mUid, 0, nb.build(), new UserHandle(mUid), null, 0);
@@ -6051,9 +6076,15 @@
         // Pretend the shortcut exists
         List<ShortcutInfo> shortcutInfos = new ArrayList<>();
         ShortcutInfo info = mock(ShortcutInfo.class);
+        when(info.getPackage()).thenReturn(PKG);
+        when(info.getId()).thenReturn(shortcutId);
+        when(info.getUserId()).thenReturn(USER_SYSTEM);
         when(info.isLongLived()).thenReturn(true);
+        when(info.isEnabled()).thenReturn(true);
         shortcutInfos.add(info);
         when(mLauncherApps.getShortcuts(any(), any())).thenReturn(shortcutInfos);
+        when(mShortcutServiceInternal.isSharingShortcut(anyInt(), anyString(), anyString(),
+                anyString(), anyInt(), any())).thenReturn(true);
 
         // Test: Send the bubble notification
         mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
@@ -6069,6 +6100,11 @@
         Notification notif = mService.getNotificationRecord(nr.getSbn().getKey()).getNotification();
         assertTrue(notif.isBubbleNotification());
 
+        // Make sure the shortcut is cached.
+        verify(mShortcutServiceInternal).cacheShortcuts(
+                anyInt(), any(), eq(PKG), eq(Collections.singletonList(shortcutId)),
+                eq(USER_SYSTEM));
+
         // Test: Remove the shortcut
         when(mLauncherApps.getShortcuts(any(), any())).thenReturn(null);
         launcherAppsCallback.getValue().onShortcutsChanged(PKG, Collections.emptyList(),
@@ -6090,17 +6126,21 @@
     @Test
     public void testNotificationBubbles_shortcut_stopListeningWhenNotifRemoved()
             throws RemoteException {
-        // Bubbles are allowed!
-        setUpPrefsForBubbles(PKG, mUid, true /* global */, true /* app */, true /* channel */);
+        final String shortcutId = "someshortcutId";
+        setUpPrefsForBubbles(PKG, mUid,
+                true /* global */,
+                BUBBLE_PREFERENCE_ALL /* app */,
+                true /* channel */);
 
         ArgumentCaptor<LauncherApps.Callback> launcherAppsCallback =
                 ArgumentCaptor.forClass(LauncherApps.Callback.class);
 
         // Messaging notification with shortcut info
         Notification.BubbleMetadata metadata = new Notification.BubbleMetadata.Builder(
-                "someshortcutId").build();
+                shortcutId).build();
         Notification.Builder nb = getMessageStyleNotifBuilder(false /* addDefaultMetadata */,
                 null /* groupKey */, false /* isSummary */);
+        nb.setShortcutId(shortcutId);
         nb.setBubbleMetadata(metadata);
         StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 1,
                 "tag", mUid, 0, nb.build(), new UserHandle(mUid), null, 0);
@@ -6109,9 +6149,15 @@
         // Pretend the shortcut exists
         List<ShortcutInfo> shortcutInfos = new ArrayList<>();
         ShortcutInfo info = mock(ShortcutInfo.class);
+        when(info.getPackage()).thenReturn(PKG);
+        when(info.getId()).thenReturn(shortcutId);
+        when(info.getUserId()).thenReturn(USER_SYSTEM);
         when(info.isLongLived()).thenReturn(true);
+        when(info.isEnabled()).thenReturn(true);
         shortcutInfos.add(info);
         when(mLauncherApps.getShortcuts(any(), any())).thenReturn(shortcutInfos);
+        when(mShortcutServiceInternal.isSharingShortcut(anyInt(), anyString(), anyString(),
+                anyString(), anyInt(), any())).thenReturn(true);
 
         // Test: Send the bubble notification
         mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
@@ -6127,6 +6173,11 @@
         Notification notif = mService.getNotificationRecord(nr.getSbn().getKey()).getNotification();
         assertTrue(notif.isBubbleNotification());
 
+        // Make sure the shortcut is cached.
+        verify(mShortcutServiceInternal).cacheShortcuts(
+                anyInt(), any(), eq(PKG), eq(Collections.singletonList(shortcutId)),
+                eq(USER_SYSTEM));
+
         // Test: Remove the notification
         mBinderService.cancelNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
                 nr.getSbn().getId(), nr.getSbn().getUserId());
@@ -6141,8 +6192,10 @@
     @Test
     public void testNotificationBubbles_bubbleChildrenStay_whenGroupSummaryDismissed()
             throws Exception {
-        // Bubbles are allowed!
-        setUpPrefsForBubbles(PKG, mUid, true /* global */, true /* app */, true /* channel */);
+        setUpPrefsForBubbles(PKG, mUid,
+                true /* global */,
+                BUBBLE_PREFERENCE_ALL /* app */,
+                true /* channel */);
 
         NotificationRecord nrSummary = addGroupWithBubblesAndValidateAdded(
                 true /* summaryAutoCancel */);
@@ -6165,8 +6218,10 @@
     @Test
     public void testNotificationBubbles_bubbleChildrenStay_whenGroupSummaryClicked()
             throws Exception {
-        // Bubbles are allowed!
-        setUpPrefsForBubbles(PKG, mUid, true /* global */, true /* app */, true /* channel */);
+        setUpPrefsForBubbles(PKG, mUid,
+                true /* global */,
+                BUBBLE_PREFERENCE_ALL /* app */,
+                true /* channel */);
 
         NotificationRecord nrSummary = addGroupWithBubblesAndValidateAdded(
                 true /* summaryAutoCancel */);
@@ -6197,8 +6252,12 @@
     @Test
     public void testNotificationBubbles_bubbleStays_whenClicked()
             throws Exception {
+        setUpPrefsForBubbles(PKG, mUid,
+                true /* global */,
+                BUBBLE_PREFERENCE_ALL /* app */,
+                true /* channel */);
+
         // GIVEN a notification that has the auto cancels flag (cancel on click) and is a bubble
-        setUpPrefsForBubbles(PKG, mUid, true /* global */, true /* app */, true /* channel */);
         final NotificationRecord nr = generateNotificationRecord(mTestNotificationChannel);
         nr.getSbn().getNotification().flags |= FLAG_BUBBLE | FLAG_AUTO_CANCEL;
         mService.addNotification(nr);
@@ -6243,7 +6302,7 @@
 
         mService.loadDefaultApprovedServices(USER_SYSTEM);
 
-        verify(mConditionProviders, times(1)).addDefaultComponentOrPackage("test");
+        verify(mConditionProviders, times(1)).loadDefaultsFromConfig();
     }
 
     // TODO: add tests for the rest of the non-empty cases
@@ -6332,7 +6391,7 @@
         assertEquals("friend", friendChannel.getConversationId());
         assertEquals(null, original.getConversationId());
         assertEquals(original.canShowBadge(), friendChannel.canShowBadge());
-        assertEquals(original.canBubble(), friendChannel.canBubble());
+        assertFalse(friendChannel.canBubble()); // can't be modified by app
         assertFalse(original.getId().equals(friendChannel.getId()));
         assertNotNull(friendChannel.getId());
     }
@@ -6444,9 +6503,15 @@
         when(mPreferencesHelper.getConversations(anyString(), anyInt())).thenReturn(convos);
 
         ShortcutInfo si = mock(ShortcutInfo.class);
+        when(si.getPackage()).thenReturn(PKG_P);
+        when(si.getId()).thenReturn("convo");
+        when(si.getUserId()).thenReturn(USER_SYSTEM);
         when(si.getShortLabel()).thenReturn("Hello");
         when(si.isLongLived()).thenReturn(true);
+        when(si.isEnabled()).thenReturn(true);
         when(mLauncherApps.getShortcuts(any(), any())).thenReturn(Arrays.asList(si));
+        when(mShortcutServiceInternal.isSharingShortcut(anyInt(), anyString(), anyString(),
+                anyString(), anyInt(), any())).thenReturn(true);
 
         List<ConversationChannelWrapper> conversations =
                 mBinderService.getConversationsForPackage(PKG_P, mUid).getList();
@@ -6472,6 +6537,9 @@
         when(mPreferencesHelper.getConversations(anyString(), anyInt())).thenReturn(convos);
 
         ShortcutInfo si = mock(ShortcutInfo.class);
+        when(si.getPackage()).thenReturn(PKG_P);
+        when(si.getId()).thenReturn("convo");
+        when(si.getUserId()).thenReturn(USER_SYSTEM);
         when(si.getShortLabel()).thenReturn("Hello");
         when(si.isLongLived()).thenReturn(false);
         when(mLauncherApps.getShortcuts(any(), any())).thenReturn(Arrays.asList(si));
@@ -6519,4 +6587,16 @@
             fail(e.getMessage());
         }
     }
+
+    @Test
+    public void testRecordMessages() throws RemoteException {
+        NotificationRecord nr =
+                generateMessageBubbleNotifRecord(mTestNotificationChannel,
+                        "testRecordMessages");
+        mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+                nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
+        waitForIdle();
+
+        assertTrue(mBinderService.hasSentMessage(PKG, mUid));
+    }
 }
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java
index ed5ec6a..e11392b 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java
@@ -15,7 +15,13 @@
  */
 package com.android.server.notification;
 
+import static android.app.AppOpsManager.MODE_ALLOWED;
+import static android.app.AppOpsManager.MODE_DEFAULT;
+import static android.app.AppOpsManager.OP_SYSTEM_ALERT_WINDOW;
 import static android.app.NotificationChannel.CONVERSATION_CHANNEL_ID_FORMAT;
+import static android.app.NotificationManager.BUBBLE_PREFERENCE_ALL;
+import static android.app.NotificationManager.BUBBLE_PREFERENCE_NONE;
+import static android.app.NotificationManager.BUBBLE_PREFERENCE_SELECTED;
 import static android.app.NotificationManager.IMPORTANCE_DEFAULT;
 import static android.app.NotificationManager.IMPORTANCE_HIGH;
 import static android.app.NotificationManager.IMPORTANCE_LOW;
@@ -23,6 +29,7 @@
 import static android.app.NotificationManager.IMPORTANCE_NONE;
 import static android.app.NotificationManager.IMPORTANCE_UNSPECIFIED;
 
+import static com.android.server.notification.PreferencesHelper.DEFAULT_BUBBLE_PREFERENCE;
 import static com.android.server.notification.PreferencesHelper.NOTIFICATION_CHANNEL_COUNT_LIMIT;
 
 import static com.google.common.truth.Truth.assertThat;
@@ -46,6 +53,7 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import android.app.AppOpsManager;
 import android.app.Notification;
 import android.app.NotificationChannel;
 import android.app.NotificationChannelGroup;
@@ -128,6 +136,7 @@
     @Spy IContentProvider mTestIContentProvider = new MockIContentProvider();
     @Mock Context mContext;
     @Mock ZenModeHelper mMockZenModeHelper;
+    @Mock AppOpsManager mAppOpsManager;
 
     private NotificationManager.Policy mTestNotificationPolicy;
 
@@ -183,7 +192,10 @@
         mTestNotificationPolicy = new NotificationManager.Policy(0, 0, 0, 0,
                 NotificationManager.Policy.STATE_CHANNELS_BYPASSING_DND, 0);
         when(mMockZenModeHelper.getNotificationPolicy()).thenReturn(mTestNotificationPolicy);
-        mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger);
+        when(mAppOpsManager.noteOpNoThrow(anyInt(), anyInt(),
+                anyString(), eq(null), anyString())).thenReturn(MODE_DEFAULT);
+        mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger,
+                mAppOpsManager);
         resetZenModeHelper();
 
         mAudioAttributes = new AudioAttributes.Builder()
@@ -442,6 +454,7 @@
         mHelper.createNotificationChannel(PKG_O, UID_O, getChannel(), true, false);
 
         mHelper.setShowBadge(PKG_N_MR1, UID_N_MR1, true);
+        mHelper.setMessageSent(PKG_P, UID_P);
 
         mHelper.setImportance(PKG_O, UID_O, IMPORTANCE_NONE);
 
@@ -457,6 +470,8 @@
 
         assertEquals(IMPORTANCE_NONE, mHelper.getImportance(PKG_O, UID_O));
         assertTrue(mHelper.canShowBadge(PKG_N_MR1, UID_N_MR1));
+        assertTrue(mHelper.hasSentMessage(PKG_P, UID_P));
+        assertFalse(mHelper.hasSentMessage(PKG_N_MR1, UID_N_MR1));
         assertEquals(channel1,
                 mHelper.getNotificationChannel(PKG_N_MR1, UID_N_MR1, channel1.getId(), false));
         compareChannels(channel2,
@@ -1094,7 +1109,7 @@
                         .getUserLockedFields());
 
         final NotificationChannel update = getChannel();
-        update.setAllowBubbles(false);
+        update.setAllowBubbles(true);
         mHelper.updateNotificationChannel(PKG_N_MR1, UID_N_MR1, update, true);
         assertEquals(NotificationChannel.USER_LOCKED_ALLOW_BUBBLE,
                 mHelper.getNotificationChannel(PKG_N_MR1, UID_N_MR1, update.getId(), false)
@@ -1460,7 +1475,8 @@
         mTestNotificationPolicy = new NotificationManager.Policy(0, 0, 0, 0,
                 NotificationManager.Policy.STATE_CHANNELS_BYPASSING_DND, 0);
         when(mMockZenModeHelper.getNotificationPolicy()).thenReturn(mTestNotificationPolicy);
-        mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger);
+        mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger,
+                mAppOpsManager);
         assertFalse(mHelper.areChannelsBypassingDnd());
         verify(mMockZenModeHelper, times(1)).setNotificationPolicy(any());
         resetZenModeHelper();
@@ -1471,7 +1487,8 @@
         // start notification policy off with mAreChannelsBypassingDnd = false
         mTestNotificationPolicy = new NotificationManager.Policy(0, 0, 0, 0, 0, 0);
         when(mMockZenModeHelper.getNotificationPolicy()).thenReturn(mTestNotificationPolicy);
-        mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger);
+        mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger,
+                mAppOpsManager);
         assertFalse(mHelper.areChannelsBypassingDnd());
         verify(mMockZenModeHelper, never()).setNotificationPolicy(any());
         resetZenModeHelper();
@@ -1734,14 +1751,14 @@
         mHelper.updateDefaultApps(UserHandle.getUserId(UID_O), null, pkgPair);
         mHelper.setNotificationDelegate(PKG_O, UID_O, "", 1);
         mHelper.setImportance(PKG_O, UID_O, IMPORTANCE_NONE);
-        mHelper.setBubblesAllowed(PKG_O, UID_O, false);
+        mHelper.setBubblesAllowed(PKG_O, UID_O, DEFAULT_BUBBLE_PREFERENCE);
         mHelper.setShowBadge(PKG_O, UID_O, false);
         mHelper.setAppImportanceLocked(PKG_O, UID_O);
 
         mHelper.clearData(PKG_O, UID_O);
 
         assertEquals(IMPORTANCE_UNSPECIFIED, mHelper.getImportance(PKG_O, UID_O));
-        assertTrue(mHelper.areBubblesAllowed(PKG_O, UID_O));
+        assertEquals(mHelper.getBubblePreference(PKG_O, UID_O), DEFAULT_BUBBLE_PREFERENCE);
         assertTrue(mHelper.canShowBadge(PKG_O, UID_O));
         assertNull(mHelper.getNotificationDelegate(PKG_O, UID_O));
         assertEquals(0, mHelper.getAppLockedFields(PKG_O, UID_O));
@@ -2237,7 +2254,8 @@
                 + "content_type=\"4\" flags=\"0\" show_badge=\"true\" />\n"
                 + "</package>\n"
                 + "</ranking>\n";
-        mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger);
+        mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger,
+                mAppOpsManager);
         loadByteArrayXml(preQXml.getBytes(), true, UserHandle.USER_SYSTEM);
 
         assertEquals(PreferencesHelper.DEFAULT_HIDE_SILENT_STATUS_BAR_ICONS,
@@ -2249,7 +2267,8 @@
         mHelper.setHideSilentStatusIcons(!PreferencesHelper.DEFAULT_HIDE_SILENT_STATUS_BAR_ICONS);
 
         ByteArrayOutputStream baos = writeXmlAndPurge(PKG_O, UID_O, false, UserHandle.USER_ALL);
-        mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger);
+        mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger,
+                mAppOpsManager);
         loadStreamXml(baos, false, UserHandle.USER_ALL);
 
         assertEquals(!PreferencesHelper.DEFAULT_HIDE_SILENT_STATUS_BAR_ICONS,
@@ -2345,7 +2364,8 @@
         mHelper.setImportance(PKG_O, UID_O, IMPORTANCE_UNSPECIFIED);
 
         ByteArrayOutputStream baos = writeXmlAndPurge(PKG_O, UID_O, false, UserHandle.USER_ALL);
-        mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger);
+        mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger,
+                mAppOpsManager);
         loadStreamXml(baos, false, UserHandle.USER_ALL);
 
         assertNull(mHelper.getNotificationDelegate(PKG_O, UID_O));
@@ -2356,7 +2376,8 @@
         mHelper.setNotificationDelegate(PKG_O, UID_O, "other", 53);
 
         ByteArrayOutputStream baos = writeXmlAndPurge(PKG_O, UID_O, false, UserHandle.USER_ALL);
-        mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger);
+        mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger,
+                mAppOpsManager);
         loadStreamXml(baos, false, UserHandle.USER_ALL);
 
         assertEquals("other", mHelper.getNotificationDelegate(PKG_O, UID_O));
@@ -2368,7 +2389,8 @@
         mHelper.revokeNotificationDelegate(PKG_O, UID_O);
 
         ByteArrayOutputStream baos = writeXmlAndPurge(PKG_O, UID_O, false, UserHandle.USER_ALL);
-        mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger);
+        mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger,
+                mAppOpsManager);
         loadStreamXml(baos, false, UserHandle.USER_ALL);
 
         assertNull(mHelper.getNotificationDelegate(PKG_O, UID_O));
@@ -2380,7 +2402,8 @@
         mHelper.toggleNotificationDelegate(PKG_O, UID_O, false);
 
         ByteArrayOutputStream baos = writeXmlAndPurge(PKG_O, UID_O, false, UserHandle.USER_ALL);
-        mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger);
+        mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger,
+                mAppOpsManager);
         loadStreamXml(baos, false, UserHandle.USER_ALL);
 
         // appears disabled
@@ -2398,7 +2421,8 @@
         mHelper.revokeNotificationDelegate(PKG_O, UID_O);
 
         ByteArrayOutputStream baos = writeXmlAndPurge(PKG_O, UID_O, false, UserHandle.USER_ALL);
-        mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger);
+        mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger,
+                mAppOpsManager);
         loadStreamXml(baos, false, UserHandle.USER_ALL);
 
         // appears disabled
@@ -2412,29 +2436,87 @@
     }
 
     @Test
-    public void testAllowBubbles_defaults() throws Exception {
-        assertTrue(mHelper.areBubblesAllowed(PKG_O, UID_O));
+    public void testBubblePreference_defaults() throws Exception {
+        assertEquals(BUBBLE_PREFERENCE_NONE, mHelper.getBubblePreference(PKG_O, UID_O));
 
         ByteArrayOutputStream baos = writeXmlAndPurge(PKG_O, UID_O, false, UserHandle.USER_ALL);
-        mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger);
+        mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger,
+                mAppOpsManager);
         loadStreamXml(baos, false, UserHandle.USER_ALL);
 
-        assertTrue(mHelper.areBubblesAllowed(PKG_O, UID_O));
+        assertEquals(BUBBLE_PREFERENCE_NONE, mHelper.getBubblePreference(PKG_O, UID_O));
         assertEquals(0, mHelper.getAppLockedFields(PKG_O, UID_O));
     }
 
     @Test
-    public void testAllowBubbles_xml() throws Exception {
-        mHelper.setBubblesAllowed(PKG_O, UID_O, false);
-        assertFalse(mHelper.areBubblesAllowed(PKG_O, UID_O));
+    public void testBubblePreference_upgradeWithSAWPermission() throws Exception {
+        when(mAppOpsManager.noteOpNoThrow(eq(OP_SYSTEM_ALERT_WINDOW), anyInt(),
+                anyString(), eq(null), anyString())).thenReturn(MODE_ALLOWED);
+
+        final String xml = "<ranking version=\"1\">\n"
+                + "<package name=\"" + PKG_O + "\" uid=\"" + UID_O + "\">\n"
+                + "<channel id=\"someId\" name=\"hi\""
+                + " importance=\"3\"/>"
+                + "</package>"
+                + "</ranking>";
+        XmlPullParser parser = Xml.newPullParser();
+        parser.setInput(new BufferedInputStream(new ByteArrayInputStream(xml.getBytes())),
+                null);
+        parser.nextTag();
+        mHelper.readXml(parser, false, UserHandle.USER_ALL);
+
+        assertEquals(BUBBLE_PREFERENCE_ALL, mHelper.getBubblePreference(PKG_O, UID_O));
+        assertEquals(0, mHelper.getAppLockedFields(PKG_O, UID_O));
+    }
+
+    @Test
+    public void testBubblePreference_upgradeWithSAWThenUserOverride() throws Exception {
+        when(mAppOpsManager.noteOpNoThrow(eq(OP_SYSTEM_ALERT_WINDOW), anyInt(),
+                anyString(), eq(null), anyString())).thenReturn(MODE_ALLOWED);
+
+        final String xml = "<ranking version=\"1\">\n"
+                + "<package name=\"" + PKG_O + "\" uid=\"" + UID_O + "\">\n"
+                + "<channel id=\"someId\" name=\"hi\""
+                + " importance=\"3\"/>"
+                + "</package>"
+                + "</ranking>";
+        XmlPullParser parser = Xml.newPullParser();
+        parser.setInput(new BufferedInputStream(new ByteArrayInputStream(xml.getBytes())),
+                null);
+        parser.nextTag();
+        mHelper.readXml(parser, false, UserHandle.USER_ALL);
+
+        assertEquals(BUBBLE_PREFERENCE_ALL, mHelper.getBubblePreference(PKG_O, UID_O));
+        assertEquals(0, mHelper.getAppLockedFields(PKG_O, UID_O));
+
+        mHelper.setBubblesAllowed(PKG_O, UID_O, BUBBLE_PREFERENCE_SELECTED);
+        assertEquals(BUBBLE_PREFERENCE_SELECTED, mHelper.getBubblePreference(PKG_O, UID_O));
         assertEquals(PreferencesHelper.LockableAppFields.USER_LOCKED_BUBBLE,
                 mHelper.getAppLockedFields(PKG_O, UID_O));
 
         ByteArrayOutputStream baos = writeXmlAndPurge(PKG_O, UID_O, false, UserHandle.USER_ALL);
-        mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger);
+        mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger,
+                mAppOpsManager);
         loadStreamXml(baos, false, UserHandle.USER_ALL);
 
-        assertFalse(mHelper.areBubblesAllowed(PKG_O, UID_O));
+        assertEquals(BUBBLE_PREFERENCE_SELECTED, mHelper.getBubblePreference(PKG_O, UID_O));
+        assertEquals(PreferencesHelper.LockableAppFields.USER_LOCKED_BUBBLE,
+                mHelper.getAppLockedFields(PKG_O, UID_O));
+    }
+
+    @Test
+    public void testBubblePreference_xml() throws Exception {
+        mHelper.setBubblesAllowed(PKG_O, UID_O, BUBBLE_PREFERENCE_NONE);
+        assertEquals(mHelper.getBubblePreference(PKG_O, UID_O), BUBBLE_PREFERENCE_NONE);
+        assertEquals(PreferencesHelper.LockableAppFields.USER_LOCKED_BUBBLE,
+                mHelper.getAppLockedFields(PKG_O, UID_O));
+
+        ByteArrayOutputStream baos = writeXmlAndPurge(PKG_O, UID_O, false, UserHandle.USER_ALL);
+        mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger,
+                mAppOpsManager);
+        loadStreamXml(baos, false, UserHandle.USER_ALL);
+
+        assertEquals(mHelper.getBubblePreference(PKG_O, UID_O), BUBBLE_PREFERENCE_NONE);
         assertEquals(PreferencesHelper.LockableAppFields.USER_LOCKED_BUBBLE,
                 mHelper.getAppLockedFields(PKG_O, UID_O));
     }
@@ -2766,9 +2848,29 @@
     }
 
     @Test
-    public void testSetBubblesAllowed_false() {
-        mHelper.setBubblesAllowed(PKG_O, UID_O, false);
-        assertFalse(mHelper.areBubblesAllowed(PKG_O, UID_O));
+    public void testSetBubblesAllowed_none() {
+        // Change it to non-default first
+        mHelper.setBubblesAllowed(PKG_O, UID_O, BUBBLE_PREFERENCE_ALL);
+        assertEquals(mHelper.getBubblePreference(PKG_O, UID_O), BUBBLE_PREFERENCE_ALL);
+        verify(mHandler, times(1)).requestSort();
+        reset(mHandler);
+        // Now test
+        mHelper.setBubblesAllowed(PKG_O, UID_O, BUBBLE_PREFERENCE_NONE);
+        assertEquals(mHelper.getBubblePreference(PKG_O, UID_O), BUBBLE_PREFERENCE_NONE);
+        verify(mHandler, times(1)).requestSort();
+    }
+
+    @Test
+    public void testSetBubblesAllowed_all() {
+        mHelper.setBubblesAllowed(PKG_O, UID_O, BUBBLE_PREFERENCE_ALL);
+        assertEquals(mHelper.getBubblePreference(PKG_O, UID_O), BUBBLE_PREFERENCE_ALL);
+        verify(mHandler, times(1)).requestSort();
+    }
+
+    @Test
+    public void testSetBubblesAllowed_selected() {
+        mHelper.setBubblesAllowed(PKG_O, UID_O, BUBBLE_PREFERENCE_SELECTED);
+        assertEquals(mHelper.getBubblePreference(PKG_O, UID_O), BUBBLE_PREFERENCE_SELECTED);
         verify(mHandler, times(1)).requestSort();
     }
 
@@ -2925,7 +3027,8 @@
         Settings.Global.putInt(mContext.getContentResolver(),
                 Settings.Global.REQUIRE_SHORTCUTS_FOR_CONVERSATIONS, 0);
 
-        mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger);
+        mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger,
+                mAppOpsManager);
 
         final String xml = "<ranking version=\"1\">\n"
                 + "<package name=\"" + PKG_O + "\" uid=\"" + UID_O + "\" >\n"
@@ -2945,7 +3048,8 @@
     public void testPlaceholderConversationId_shortcutRequired() throws Exception {
         Settings.Global.putInt(mContext.getContentResolver(),
                 Settings.Global.REQUIRE_SHORTCUTS_FOR_CONVERSATIONS, 1);
-        mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger);
+        mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger,
+                mAppOpsManager);
 
         final String xml = "<ranking version=\"1\">\n"
                 + "<package name=\"" + PKG_O + "\" uid=\"" + UID_O + "\" >\n"
@@ -2965,7 +3069,8 @@
     public void testNormalConversationId_shortcutRequired() throws Exception {
         Settings.Global.putInt(mContext.getContentResolver(),
                 Settings.Global.REQUIRE_SHORTCUTS_FOR_CONVERSATIONS, 1);
-        mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger);
+        mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger,
+                mAppOpsManager);
 
         final String xml = "<ranking version=\"1\">\n"
                 + "<package name=\"" + PKG_O + "\" uid=\"" + UID_O + "\" >\n"
@@ -2985,7 +3090,8 @@
     public void testNoConversationId_shortcutRequired() throws Exception {
         Settings.Global.putInt(mContext.getContentResolver(),
                 Settings.Global.REQUIRE_SHORTCUTS_FOR_CONVERSATIONS, 1);
-        mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger);
+        mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger,
+                mAppOpsManager);
 
         final String xml = "<ranking version=\"1\">\n"
                 + "<package name=\"" + PKG_O + "\" uid=\"" + UID_O + "\" >\n"
@@ -3039,6 +3145,44 @@
     }
 
     @Test
+    public void testGetConversations_notDemoted() {
+        String convoId = "convo";
+        NotificationChannel messages =
+                new NotificationChannel("messages", "Messages", IMPORTANCE_DEFAULT);
+        mHelper.createNotificationChannel(PKG_O, UID_O, messages, true, false);
+        NotificationChannel calls =
+                new NotificationChannel("calls", "Calls", IMPORTANCE_DEFAULT);
+        mHelper.createNotificationChannel(PKG_O, UID_O, calls, true, false);
+        NotificationChannel p =
+                new NotificationChannel("p calls", "Calls", IMPORTANCE_DEFAULT);
+        mHelper.createNotificationChannel(PKG_P, UID_P, p, true, false);
+
+        NotificationChannel channel =
+                new NotificationChannel("A person msgs", "messages from A", IMPORTANCE_DEFAULT);
+        channel.setConversationId(messages.getId(), convoId);
+        mHelper.createNotificationChannel(PKG_O, UID_O, channel, true, false);
+
+        NotificationChannel diffConvo =
+                new NotificationChannel("B person msgs", "messages from B", IMPORTANCE_DEFAULT);
+        diffConvo.setConversationId(p.getId(), "different convo");
+        diffConvo.setDemoted(true);
+        mHelper.createNotificationChannel(PKG_P, UID_P, diffConvo, true, false);
+
+        NotificationChannel channel2 =
+                new NotificationChannel("A person calls", "calls from A", IMPORTANCE_DEFAULT);
+        channel2.setConversationId(calls.getId(), convoId);
+        channel2.setImportantConversation(true);
+        mHelper.createNotificationChannel(PKG_O, UID_O, channel2, true, false);
+
+        List<ConversationChannelWrapper> convos = mHelper.getConversations(false);
+
+        assertEquals(2, convos.size());
+        assertTrue(conversationWrapperContainsChannel(convos, channel));
+        assertFalse(conversationWrapperContainsChannel(convos, diffConvo));
+        assertTrue(conversationWrapperContainsChannel(convos, channel2));
+    }
+
+    @Test
     public void testGetConversations_onlyImportant() {
         String convoId = "convo";
         NotificationChannel messages =
@@ -3249,4 +3393,17 @@
                         .NOTIFICATION_CHANNEL_CONVERSATION_DELETED,
                 mLogger.get(6).event);  // Delete Channel channel2 - Conversation A person calls
     }
+
+    @Test
+    public void testMessageSent() {
+        // create package preferences
+        mHelper.canShowBadge(PKG_P, UID_P);
+
+        // check default value
+        assertFalse(mHelper.hasSentMessage(PKG_P, UID_P));
+
+        // change it
+        mHelper.setMessageSent(PKG_P, UID_P);
+        assertTrue(mHelper.hasSentMessage(PKG_P, UID_P));
+    }
 }
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/ShortcutHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/ShortcutHelperTest.java
index 50fb9b4..3095c87 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/ShortcutHelperTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/ShortcutHelperTest.java
@@ -16,7 +16,11 @@
 
 package com.android.server.notification;
 
+import static com.google.common.truth.Truth.assertThat;
+
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
@@ -25,6 +29,7 @@
 import android.app.Notification;
 import android.content.pm.LauncherApps;
 import android.content.pm.ShortcutInfo;
+import android.content.pm.ShortcutServiceInternal;
 import android.os.UserHandle;
 import android.service.notification.StatusBarNotification;
 import android.test.suitebuilder.annotation.SmallTest;
@@ -58,6 +63,8 @@
     @Mock
     ShortcutHelper.ShortcutListener mShortcutListener;
     @Mock
+    ShortcutServiceInternal mShortcutServiceInternal;
+    @Mock
     NotificationRecord mNr;
     @Mock
     Notification mNotif;
@@ -72,7 +79,8 @@
     public void setUp() {
         MockitoAnnotations.initMocks(this);
 
-        mShortcutHelper = new ShortcutHelper(mLauncherApps, mShortcutListener);
+        mShortcutHelper = new ShortcutHelper(
+                mLauncherApps, mShortcutListener, mShortcutServiceInternal);
         when(mNr.getKey()).thenReturn(KEY);
         when(mNr.getSbn()).thenReturn(mSbn);
         when(mSbn.getPackageName()).thenReturn(PKG);
@@ -138,4 +146,92 @@
         callback.onShortcutsChanged(PKG, shortcutInfos, mock(UserHandle.class));
         verify(mShortcutListener).onShortcutRemoved(mNr.getKey());
     }
+
+    @Test
+    public void testGetValidShortcutInfo_noMatchingShortcut() {
+        when(mLauncherApps.getShortcuts(any(), any())).thenReturn(null);
+        when(mShortcutServiceInternal.isSharingShortcut(anyInt(), anyString(), anyString(),
+                anyString(), anyInt(), any())).thenReturn(true);
+
+        assertThat(mShortcutHelper.getValidShortcutInfo("a", "p", UserHandle.SYSTEM)).isNull();
+    }
+
+    @Test
+    public void testGetValidShortcutInfo_nullShortcut() {
+        ArrayList<ShortcutInfo> shortcuts = new ArrayList<>();
+        shortcuts.add(null);
+        when(mLauncherApps.getShortcuts(any(), any())).thenReturn(shortcuts);
+        when(mShortcutServiceInternal.isSharingShortcut(anyInt(), anyString(), anyString(),
+                anyString(), anyInt(), any())).thenReturn(true);
+
+        assertThat(mShortcutHelper.getValidShortcutInfo("a", "p", UserHandle.SYSTEM)).isNull();
+    }
+
+    @Test
+    public void testGetValidShortcutInfo_notLongLived() {
+        ShortcutInfo si = mock(ShortcutInfo.class);
+        when(si.getPackage()).thenReturn(PKG);
+        when(si.getId()).thenReturn(SHORTCUT_ID);
+        when(si.getUserId()).thenReturn(UserHandle.USER_SYSTEM);
+        when(si.isLongLived()).thenReturn(false);
+        when(si.isEnabled()).thenReturn(true);
+        ArrayList<ShortcutInfo> shortcuts = new ArrayList<>();
+        shortcuts.add(si);
+        when(mLauncherApps.getShortcuts(any(), any())).thenReturn(shortcuts);
+        when(mShortcutServiceInternal.isSharingShortcut(anyInt(), anyString(), anyString(),
+                anyString(), anyInt(), any())).thenReturn(true);
+
+        assertThat(mShortcutHelper.getValidShortcutInfo("a", "p", UserHandle.SYSTEM)).isNull();
+    }
+
+    @Test
+    public void testGetValidShortcutInfo_notSharingShortcut() {
+        ShortcutInfo si = mock(ShortcutInfo.class);
+        when(si.getPackage()).thenReturn(PKG);
+        when(si.getId()).thenReturn(SHORTCUT_ID);
+        when(si.getUserId()).thenReturn(UserHandle.USER_SYSTEM);
+        when(si.isLongLived()).thenReturn(true);
+        when(si.isEnabled()).thenReturn(true);
+        ArrayList<ShortcutInfo> shortcuts = new ArrayList<>();
+        shortcuts.add(si);
+        when(mLauncherApps.getShortcuts(any(), any())).thenReturn(shortcuts);
+        when(mShortcutServiceInternal.isSharingShortcut(anyInt(), anyString(), anyString(),
+                anyString(), anyInt(), any())).thenReturn(false);
+
+        assertThat(mShortcutHelper.getValidShortcutInfo("a", "p", UserHandle.SYSTEM)).isNull();
+    }
+
+    @Test
+    public void testGetValidShortcutInfo_notEnabled() {
+        ShortcutInfo si = mock(ShortcutInfo.class);
+        when(si.getPackage()).thenReturn(PKG);
+        when(si.getId()).thenReturn(SHORTCUT_ID);
+        when(si.getUserId()).thenReturn(UserHandle.USER_SYSTEM);
+        when(si.isLongLived()).thenReturn(true);
+        when(si.isEnabled()).thenReturn(false);
+        ArrayList<ShortcutInfo> shortcuts = new ArrayList<>();
+        shortcuts.add(si);
+        when(mLauncherApps.getShortcuts(any(), any())).thenReturn(shortcuts);
+        when(mShortcutServiceInternal.isSharingShortcut(anyInt(), anyString(), anyString(),
+                anyString(), anyInt(), any())).thenReturn(true);
+
+        assertThat(mShortcutHelper.getValidShortcutInfo("a", "p", UserHandle.SYSTEM)).isNull();
+    }
+
+    @Test
+    public void testGetValidShortcutInfo_isValid() {
+        ShortcutInfo si = mock(ShortcutInfo.class);
+        when(si.getPackage()).thenReturn(PKG);
+        when(si.getId()).thenReturn(SHORTCUT_ID);
+        when(si.getUserId()).thenReturn(UserHandle.USER_SYSTEM);
+        when(si.isLongLived()).thenReturn(true);
+        when(si.isEnabled()).thenReturn(true);
+        ArrayList<ShortcutInfo> shortcuts = new ArrayList<>();
+        shortcuts.add(si);
+        when(mLauncherApps.getShortcuts(any(), any())).thenReturn(shortcuts);
+        when(mShortcutServiceInternal.isSharingShortcut(anyInt(), anyString(), anyString(),
+                anyString(), anyInt(), any())).thenReturn(true);
+
+        assertThat(mShortcutHelper.getValidShortcutInfo("a", "p", UserHandle.SYSTEM)).isSameAs(si);
+    }
 }
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityDisplayTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityDisplayTests.java
index 1debd8c..e3bb1b6 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityDisplayTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityDisplayTests.java
@@ -16,6 +16,8 @@
 
 package com.android.server.wm;
 
+import static android.app.WindowConfiguration.ACTIVITY_TYPE_ASSISTANT;
+import static android.app.WindowConfiguration.ACTIVITY_TYPE_DREAM;
 import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
 import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
 import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
@@ -270,6 +272,28 @@
         anotherAlwaysOnTopStack.setWindowingMode(WINDOWING_MODE_FREEFORM);
         assertTrue(anotherAlwaysOnTopStack.isAlwaysOnTop());
         assertEquals(anotherAlwaysOnTopStack, taskDisplayArea.getStackAt(topPosition - 1));
+
+        final ActivityStack dreamStack = taskDisplayArea.createStack(
+                WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_DREAM, true /* onTop */);
+        assertEquals(taskDisplayArea, dreamStack.getDisplayArea());
+        assertTrue(dreamStack.isAlwaysOnTop());
+        topPosition = taskDisplayArea.getStackCount() - 1;
+        // Ensure dream shows above all activities, including PiP
+        assertEquals(dreamStack, taskDisplayArea.getTopStack());
+        assertEquals(pinnedStack, taskDisplayArea.getStackAt(topPosition - 1));
+
+        final ActivityStack assistStack = taskDisplayArea.createStack(
+                WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_ASSISTANT, true /* onTop */);
+        assertEquals(taskDisplayArea, assistStack.getDisplayArea());
+        assertFalse(assistStack.isAlwaysOnTop());
+        topPosition = taskDisplayArea.getStackCount() - 1;
+
+        // Ensure Assistant shows as a non-always-on-top activity when config_assistantOnTopOfDream
+        // is false and on top of everything when true.
+        final boolean isAssistantOnTop = mContext.getResources()
+                .getBoolean(com.android.internal.R.bool.config_assistantOnTopOfDream);
+        assertEquals(assistStack, taskDisplayArea.getStackAt(
+                    isAssistantOnTop ? topPosition : topPosition - 4));
     }
 
     @Test
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
index 08f6409..6a28918 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
@@ -32,6 +32,7 @@
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.anyBoolean;
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.atLeast;
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.doAnswer;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.doCallRealMethod;
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.eq;
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.reset;
@@ -63,6 +64,7 @@
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.Mockito.never;
 
@@ -750,6 +752,31 @@
     }
 
     /**
+     * Verify that when finishing the top focused activity while root task was created by organizer,
+     * the stack order will be changed by adjusting focus.
+     */
+    @Test
+    public void testFinishActivityIfPossible_adjustStackOrderOrganizedRoot() {
+        // Make mStack be a the root task that created by task organizer
+        mStack.mCreatedByOrganizer = true;
+
+        // Have two tasks (topRootableTask and mTask) as the children of mStack.
+        ActivityRecord topActivity = new ActivityBuilder(mActivity.mAtmService)
+                .setCreateTask(true)
+                .setStack(mStack)
+                .build();
+        ActivityStack topRootableTask = (ActivityStack) topActivity.getTask();
+        topRootableTask.moveToFront("test");
+        assertTrue(mStack.isTopStackInDisplayArea());
+
+        // Finish top activity and verify the next focusable rootable task has adjusted to top.
+        topActivity.setState(RESUMED, "test");
+        topActivity.finishIfPossible(0 /* resultCode */, null /* resultData */, "test",
+                false /* oomAdj */);
+        assertEquals(mTask, mStack.getTopMostTask());
+    }
+
+    /**
      * Verify that resumed activity is paused due to finish request.
      */
     @Test
@@ -1024,6 +1051,38 @@
     }
 
     /**
+     * Verify that complete finish request for a show-when-locked activity must ensure the
+     * keyguard occluded state being updated.
+     */
+    @Test
+    public void testCompleteFinishing_showWhenLocked() {
+        // Make keyguard locked and set the top activity show-when-locked.
+        KeyguardController keyguardController = mActivity.mStackSupervisor.getKeyguardController();
+        doReturn(true).when(keyguardController).isKeyguardLocked();
+        final ActivityRecord topActivity = new ActivityBuilder(mService).setTask(mTask).build();
+        topActivity.mVisibleRequested = true;
+        topActivity.nowVisible = true;
+        topActivity.setState(RESUMED, "true");
+        doCallRealMethod().when(mRootWindowContainer).ensureActivitiesVisible(
+                any() /* starting */, anyInt() /* configChanges */,
+                anyBoolean() /* preserveWindows */, anyBoolean() /* notifyClients */);
+        topActivity.setShowWhenLocked(true);
+
+        // Verify the stack-top activity is occluded keyguard.
+        assertEquals(topActivity, mStack.topRunningActivity());
+        assertTrue(mStack.topActivityOccludesKeyguard());
+
+        // Finish the top activity
+        topActivity.setState(PAUSED, "true");
+        topActivity.finishing = true;
+        topActivity.completeFinishing("test");
+
+        // Verify new top activity does not occlude keyguard.
+        assertEquals(mActivity, mStack.topRunningActivity());
+        assertFalse(mStack.topActivityOccludesKeyguard());
+    }
+
+    /**
      * Verify destroy activity request completes successfully.
      */
     @Test
@@ -1273,6 +1332,48 @@
     }
 
     @Test
+    public void testActivityOnCancelFixedRotationTransform() {
+        mService.mWindowManager.mIsFixedRotationTransformEnabled = true;
+        final DisplayRotation displayRotation = mActivity.mDisplayContent.getDisplayRotation();
+        spyOn(displayRotation);
+
+        final DisplayContent display = mActivity.mDisplayContent;
+        final int originalRotation = display.getRotation();
+
+        // Make {@link DisplayContent#sendNewConfiguration} not apply rotation immediately.
+        doReturn(true).when(displayRotation).isWaitingForRemoteRotation();
+        doReturn((originalRotation + 1) % 4).when(displayRotation).rotationForOrientation(
+                anyInt() /* orientation */, anyInt() /* lastRotation */);
+        // Set to visible so the activity can freeze the screen.
+        mActivity.setVisibility(true);
+
+        display.rotateInDifferentOrientationIfNeeded(mActivity);
+        display.mFixedRotationLaunchingApp = mActivity;
+        displayRotation.updateRotationUnchecked(true /* forceUpdate */);
+
+        assertTrue(displayRotation.isRotatingSeamlessly());
+
+        // Simulate the rotation has been updated to previous one, e.g. sensor updates before the
+        // remote rotation is completed.
+        doReturn(originalRotation).when(displayRotation).rotationForOrientation(
+                anyInt() /* orientation */, anyInt() /* lastRotation */);
+        display.updateOrientation();
+
+        final DisplayInfo rotatedInfo = mActivity.getFixedRotationTransformDisplayInfo();
+        mActivity.finishFixedRotationTransform();
+        final ScreenRotationAnimation rotationAnim = display.getRotationAnimation();
+        rotationAnim.setRotation(display.getPendingTransaction(), originalRotation);
+
+        // Because the display doesn't rotate, the rotated activity needs to cancel the fixed
+        // rotation. There should be a rotation animation to cover the change of activity.
+        verify(mActivity).onCancelFixedRotationTransform(rotatedInfo.rotation);
+        assertTrue(mActivity.isFreezingScreen());
+        assertFalse(displayRotation.isRotatingSeamlessly());
+        assertNotNull(rotationAnim);
+        assertTrue(rotationAnim.isRotating());
+    }
+
+    @Test
     public void testActivityOnDifferentDisplayUpdatesProcessOverride() {
         final ActivityRecord secondaryDisplayActivity =
                 createActivityOnDisplay(false /* defaultDisplay */, null /* process */);
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java
index 3d15401..6c209e4 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java
@@ -19,6 +19,7 @@
 import static android.app.WindowConfiguration.ACTIVITY_TYPE_ASSISTANT;
 import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
 import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
+import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED;
 import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
 import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
 import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
@@ -44,8 +45,10 @@
 import static com.android.server.wm.ActivityStack.STACK_VISIBILITY_VISIBLE_BEHIND_TRANSLUCENT;
 import static com.android.server.wm.ActivityTaskManagerService.RELAUNCH_REASON_FREE_RESIZE;
 import static com.android.server.wm.ActivityTaskManagerService.RELAUNCH_REASON_WINDOWING_MODE_RESIZE;
+import static com.android.server.wm.Task.FLAG_FORCE_HIDDEN_FOR_TASK_ORG;
 import static com.android.server.wm.Task.REPARENT_MOVE_STACK_TO_FRONT;
 import static com.android.server.wm.TaskDisplayArea.getStackAbove;
+import static com.android.server.wm.WindowContainer.POSITION_TOP;
 
 import static com.google.common.truth.Truth.assertThat;
 
@@ -140,9 +143,12 @@
     }
 
     @Test
-    public void testPrimarySplitScreenRestoresWhenMovedToBack() {
-        // Create primary splitscreen stack. This will create secondary stacks and places the
-        // existing fullscreen stack on the bottom.
+    public void testPrimarySplitScreenMoveToBack() {
+        TestSplitOrganizer organizer = new TestSplitOrganizer(mService);
+        // We're testing an edge case here where we have primary + fullscreen rather than secondary.
+        organizer.setMoveToSecondaryOnEnter(false);
+
+        // Create primary splitscreen stack.
         final ActivityStack primarySplitScreen = mDefaultTaskDisplayArea.createStack(
                 WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, ACTIVITY_TYPE_STANDARD, true /* onTop */);
 
@@ -165,12 +171,14 @@
     }
 
     @Test
-    public void testPrimarySplitScreenRestoresPreviousWhenMovedToBack() {
+    public void testMoveToPrimarySplitScreenThenMoveToBack() {
+        TestSplitOrganizer organizer = new TestSplitOrganizer(mService);
         // This time, start with a fullscreen activitystack
         final ActivityStack primarySplitScreen = mDefaultTaskDisplayArea.createStack(
-                WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
+                WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_STANDARD, true /* onTop */);
 
-        primarySplitScreen.setWindowingMode(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY);
+        primarySplitScreen.reparent((ActivityStack) organizer.mPrimary, POSITION_TOP,
+                false /*moveParents*/, "test");
 
         // Assert windowing mode.
         assertEquals(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, primarySplitScreen.getWindowingMode());
@@ -180,14 +188,52 @@
                 null /* task */);
 
         // Assert that stack is at the bottom.
-        assertEquals(0, mDefaultTaskDisplayArea.getIndexOf(primarySplitScreen));
+        assertEquals(primarySplitScreen, organizer.mSecondary.getChildAt(0));
 
         // Ensure that the override mode is restored to what it was (fullscreen)
-        assertEquals(WINDOWING_MODE_FULLSCREEN,
+        assertEquals(WINDOWING_MODE_UNDEFINED,
                 primarySplitScreen.getRequestedOverrideWindowingMode());
     }
 
     @Test
+    public void testSplitScreenMoveToBack() {
+        TestSplitOrganizer organizer = new TestSplitOrganizer(mService);
+        // Set up split-screen with primary on top and secondary containing the home task below
+        // another stack.
+        final ActivityStack primaryTask = mDefaultTaskDisplayArea.createStack(
+                WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, ACTIVITY_TYPE_STANDARD, true /* onTop */);
+        final ActivityStack homeRoot = mDefaultTaskDisplayArea.getStack(
+                WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME);
+        final ActivityStack secondaryTask = mDefaultTaskDisplayArea.createStack(
+                WINDOWING_MODE_SPLIT_SCREEN_SECONDARY, ACTIVITY_TYPE_STANDARD, true /* onTop */);
+        mDefaultTaskDisplayArea.positionStackAtTop((ActivityStack) organizer.mPrimary,
+                false /* includingParents */);
+
+        // Move primary to back.
+        primaryTask.moveToBack("test", null /* task */);
+
+        // Assert that the primaryTask is now below home in its parent but primary is left alone.
+        assertEquals(0, organizer.mPrimary.getChildCount());
+        assertEquals(primaryTask, organizer.mSecondary.getChildAt(0));
+        assertEquals(1, organizer.mPrimary.compareTo(organizer.mSecondary));
+        assertEquals(1, homeRoot.compareTo(primaryTask));
+        assertEquals(homeRoot.getParent(), primaryTask.getParent());
+
+        // Make sure windowing modes are correct
+        assertEquals(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, organizer.mPrimary.getWindowingMode());
+        assertEquals(WINDOWING_MODE_SPLIT_SCREEN_SECONDARY, primaryTask.getWindowingMode());
+
+        // Move secondary to back via parent (should be equivalent)
+        ((ActivityStack) organizer.mSecondary).moveToBack("test", secondaryTask);
+
+        // Assert that it is now in back but still in secondary split
+        assertEquals(1, homeRoot.compareTo(primaryTask));
+        assertEquals(secondaryTask, organizer.mSecondary.getChildAt(0));
+        assertEquals(1, primaryTask.compareTo(secondaryTask));
+        assertEquals(homeRoot.getParent(), secondaryTask.getParent());
+    }
+
+    @Test
     public void testStackInheritsDisplayWindowingMode() {
         final ActivityStack primarySplitScreen = mDefaultTaskDisplayArea.createStack(
                 WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_STANDARD, true /* onTop */);
@@ -425,23 +471,88 @@
         assertEquals(STACK_VISIBILITY_VISIBLE_BEHIND_TRANSLUCENT,
                 splitScreenSecondary2.getVisibility(null /* starting */));
 
-        // Assistant stack shouldn't be visible behind translucent split-screen stack
+        // Assistant stack shouldn't be visible behind translucent split-screen stack,
+        // unless it is configured to show on top of everything.
         doReturn(false).when(assistantStack).isTranslucent(any());
         doReturn(true).when(splitScreenPrimary).isTranslucent(any());
         doReturn(true).when(splitScreenSecondary2).isTranslucent(any());
         splitScreenSecondary2.moveToFront("testShouldBeVisible_SplitScreen");
         splitScreenPrimary.moveToFront("testShouldBeVisible_SplitScreen");
-        assertFalse(assistantStack.shouldBeVisible(null /* starting */));
-        assertTrue(splitScreenPrimary.shouldBeVisible(null /* starting */));
-        assertTrue(splitScreenSecondary2.shouldBeVisible(null /* starting */));
-        assertEquals(STACK_VISIBILITY_INVISIBLE,
-                assistantStack.getVisibility(null /* starting */));
-        assertEquals(STACK_VISIBILITY_VISIBLE,
-                splitScreenPrimary.getVisibility(null /* starting */));
-        assertEquals(STACK_VISIBILITY_INVISIBLE,
-                splitScreenSecondary.getVisibility(null /* starting */));
-        assertEquals(STACK_VISIBILITY_VISIBLE,
-                splitScreenSecondary2.getVisibility(null /* starting */));
+
+        if (isAssistantOnTop()) {
+            assertTrue(assistantStack.shouldBeVisible(null /* starting */));
+            assertFalse(splitScreenPrimary.shouldBeVisible(null /* starting */));
+            assertFalse(splitScreenSecondary2.shouldBeVisible(null /* starting */));
+            assertEquals(STACK_VISIBILITY_VISIBLE,
+                    assistantStack.getVisibility(null /* starting */));
+            assertEquals(STACK_VISIBILITY_INVISIBLE,
+                    splitScreenPrimary.getVisibility(null /* starting */));
+            assertEquals(STACK_VISIBILITY_INVISIBLE,
+                    splitScreenSecondary.getVisibility(null /* starting */));
+            assertEquals(STACK_VISIBILITY_INVISIBLE,
+                    splitScreenSecondary2.getVisibility(null /* starting */));
+        } else {
+            assertFalse(assistantStack.shouldBeVisible(null /* starting */));
+            assertTrue(splitScreenPrimary.shouldBeVisible(null /* starting */));
+            assertTrue(splitScreenSecondary2.shouldBeVisible(null /* starting */));
+            assertEquals(STACK_VISIBILITY_INVISIBLE,
+                    assistantStack.getVisibility(null /* starting */));
+            assertEquals(STACK_VISIBILITY_VISIBLE,
+                    splitScreenPrimary.getVisibility(null /* starting */));
+            assertEquals(STACK_VISIBILITY_INVISIBLE,
+                    splitScreenSecondary.getVisibility(null /* starting */));
+            assertEquals(STACK_VISIBILITY_VISIBLE,
+                    splitScreenSecondary2.getVisibility(null /* starting */));
+        }
+    }
+
+    @Test
+    public void testGetVisibility_MultiLevel() {
+        final ActivityStack homeStack = createStackForShouldBeVisibleTest(
+                mDefaultTaskDisplayArea, WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_HOME,
+                true /* onTop */);
+        final ActivityStack splitPrimary = createStackForShouldBeVisibleTest(
+                mDefaultTaskDisplayArea, WINDOWING_MODE_SPLIT_SCREEN_PRIMARY,
+                ACTIVITY_TYPE_UNDEFINED, true /* onTop */);
+        final ActivityStack splitSecondary = createStackForShouldBeVisibleTest(
+                mDefaultTaskDisplayArea, WINDOWING_MODE_SPLIT_SCREEN_SECONDARY,
+                ACTIVITY_TYPE_UNDEFINED, true /* onTop */);
+
+        doReturn(false).when(homeStack).isTranslucent(any());
+        doReturn(false).when(splitPrimary).isTranslucent(any());
+        doReturn(false).when(splitSecondary).isTranslucent(any());
+
+
+        // Re-parent home to split secondary.
+        homeStack.reparent(splitSecondary, POSITION_TOP);
+        // Current tasks should be visible.
+        assertEquals(STACK_VISIBILITY_VISIBLE, splitPrimary.getVisibility(null /* starting */));
+        assertEquals(STACK_VISIBILITY_VISIBLE, splitSecondary.getVisibility(null /* starting */));
+        // Home task should still be visible even though it is a child of another visible task.
+        assertEquals(STACK_VISIBILITY_VISIBLE, homeStack.getVisibility(null /* starting */));
+
+
+        // Add fullscreen translucent task that partially occludes split tasks
+        final ActivityStack translucentStack = createStandardStackForVisibilityTest(
+                WINDOWING_MODE_FULLSCREEN, true /* translucent */);
+        // Fullscreen translucent task should be visible
+        assertEquals(STACK_VISIBILITY_VISIBLE, translucentStack.getVisibility(null /* starting */));
+        // Split tasks should be visible behind translucent
+        assertEquals(STACK_VISIBILITY_VISIBLE_BEHIND_TRANSLUCENT,
+                splitPrimary.getVisibility(null /* starting */));
+        assertEquals(STACK_VISIBILITY_VISIBLE_BEHIND_TRANSLUCENT,
+                splitSecondary.getVisibility(null /* starting */));
+        // Home task should be visible behind translucent since its parent is visible behind
+        // translucent.
+        assertEquals(STACK_VISIBILITY_VISIBLE_BEHIND_TRANSLUCENT,
+                homeStack.getVisibility(null /* starting */));
+
+
+        // Hide split-secondary
+        splitSecondary.setForceHidden(FLAG_FORCE_HIDDEN_FOR_TASK_ORG, true /* set */);
+        // Home split secondary and home task should be invisible.
+        assertEquals(STACK_VISIBILITY_INVISIBLE, splitSecondary.getVisibility(null /* starting */));
+        assertEquals(STACK_VISIBILITY_INVISIBLE, homeStack.getVisibility(null /* starting */));
     }
 
     @Test
@@ -832,9 +943,15 @@
 
         splitScreenSecondary.moveToFront("testSplitScreenMoveToFront");
 
-        assertTrue(splitScreenPrimary.shouldBeVisible(null /* starting */));
-        assertTrue(splitScreenSecondary.shouldBeVisible(null /* starting */));
-        assertFalse(assistantStack.shouldBeVisible(null /* starting */));
+        if (isAssistantOnTop()) {
+            assertFalse(splitScreenPrimary.shouldBeVisible(null /* starting */));
+            assertFalse(splitScreenSecondary.shouldBeVisible(null /* starting */));
+            assertTrue(assistantStack.shouldBeVisible(null /* starting */));
+        } else {
+            assertTrue(splitScreenPrimary.shouldBeVisible(null /* starting */));
+            assertTrue(splitScreenSecondary.shouldBeVisible(null /* starting */));
+            assertFalse(assistantStack.shouldBeVisible(null /* starting */));
+        }
     }
 
     private ActivityStack createStandardStackForVisibilityTest(int windowingMode,
@@ -1101,7 +1218,7 @@
         mDefaultTaskDisplayArea.registerStackOrderChangedListener(listener);
         try {
             mStack.mReparenting = true;
-            mDefaultTaskDisplayArea.addStack(mStack, 0);
+            mDefaultTaskDisplayArea.addChild(mStack, 0);
         } finally {
             mDefaultTaskDisplayArea.unregisterStackOrderChangedListener(listener);
         }
@@ -1249,6 +1366,11 @@
                 anyBoolean());
     }
 
+    private boolean isAssistantOnTop() {
+        return mContext.getResources().getBoolean(
+                com.android.internal.R.bool.config_assistantOnTopOfDream);
+    }
+
     private void verifyShouldSleepActivities(boolean focusedStack,
             boolean keyguardGoingAway, boolean displaySleeping, boolean expected) {
         final DisplayContent display = mock(DisplayContent.class);
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java
index bdba4b6..a84a0a2 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java
@@ -30,7 +30,6 @@
 import static android.app.ActivityManager.START_SWITCHES_CANCELED;
 import static android.app.ActivityManager.START_TASK_TO_FRONT;
 import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
-import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED;
 import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
 import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
 import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECONDARY;
@@ -64,10 +63,8 @@
 import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.ArgumentMatchers.eq;
 
-import android.app.ActivityManager;
 import android.app.ActivityOptions;
 import android.app.IApplicationThread;
-import android.app.WindowConfiguration;
 import android.content.ComponentName;
 import android.content.Intent;
 import android.content.pm.ActivityInfo;
@@ -82,8 +79,6 @@
 import android.platform.test.annotations.Presubmit;
 import android.service.voice.IVoiceInteractionSession;
 import android.view.Gravity;
-import android.window.ITaskOrganizer;
-import android.window.WindowContainerToken;
 
 import androidx.test.filters.SmallTest;
 
@@ -431,7 +426,7 @@
 
         // Start activity and delivered new intent.
         starter.getIntent().setComponent(splitSecondReusableActivity.mActivityComponent);
-        doReturn(splitSecondReusableActivity).when(mRootWindowContainer).findTask(any(), anyInt());
+        doReturn(splitSecondReusableActivity).when(mRootWindowContainer).findTask(any(), any());
         final int result = starter.setReason("testSplitScreenDeliverToTop").execute();
 
         // Ensure result is delivering intent to top.
@@ -467,7 +462,7 @@
 
         // Start activity and delivered new intent.
         starter.getIntent().setComponent(splitSecondReusableActivity.mActivityComponent);
-        doReturn(splitSecondReusableActivity).when(mRootWindowContainer).findTask(any(), anyInt());
+        doReturn(splitSecondReusableActivity).when(mRootWindowContainer).findTask(any(), any());
         final int result = starter.setReason("testSplitScreenMoveToFront").execute();
 
         // Ensure result is moving task to front.
@@ -1004,62 +999,4 @@
 
         verify(recentTasks, times(1)).add(any());
     }
-
-    static class TestSplitOrganizer extends ITaskOrganizer.Stub {
-        final ActivityTaskManagerService mService;
-        Task mPrimary;
-        Task mSecondary;
-        boolean mInSplit = false;
-        int mDisplayId;
-        TestSplitOrganizer(ActivityTaskManagerService service, int displayId) {
-            mService = service;
-            mDisplayId = displayId;
-            mService.mTaskOrganizerController.registerTaskOrganizer(this,
-                    WINDOWING_MODE_SPLIT_SCREEN_PRIMARY);
-            mService.mTaskOrganizerController.registerTaskOrganizer(this,
-                    WINDOWING_MODE_SPLIT_SCREEN_SECONDARY);
-            WindowContainerToken primary = mService.mTaskOrganizerController.createRootTask(
-                    displayId, WINDOWING_MODE_SPLIT_SCREEN_PRIMARY).token;
-            mPrimary = WindowContainer.fromBinder(primary.asBinder()).asTask();
-            WindowContainerToken secondary = mService.mTaskOrganizerController.createRootTask(
-                    displayId, WINDOWING_MODE_SPLIT_SCREEN_SECONDARY).token;
-            mSecondary = WindowContainer.fromBinder(secondary.asBinder()).asTask();
-        }
-        @Override
-        public void onTaskAppeared(ActivityManager.RunningTaskInfo info) {
-        }
-        @Override
-        public void onTaskVanished(ActivityManager.RunningTaskInfo info) {
-        }
-        @Override
-        public void onTaskInfoChanged(ActivityManager.RunningTaskInfo info) {
-            if (mInSplit) {
-                return;
-            }
-            if (info.topActivityType != ACTIVITY_TYPE_UNDEFINED) {
-                if (info.configuration.windowConfiguration.getWindowingMode()
-                        == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY) {
-                    mInSplit = true;
-                    mService.mTaskOrganizerController.setLaunchRoot(mDisplayId,
-                            mSecondary.mRemoteToken.toWindowContainerToken());
-                    // move everything to secondary because test expects this but usually sysui
-                    // does it.
-                    DisplayContent dc = mService.mRootWindowContainer.getDisplayContent(mDisplayId);
-                    for (int tdaNdx = dc.getTaskDisplayAreaCount() - 1; tdaNdx >= 0; --tdaNdx) {
-                        final TaskDisplayArea taskDisplayArea = dc.getTaskDisplayAreaAt(tdaNdx);
-                        for (int sNdx = taskDisplayArea.getStackCount() - 1; sNdx >= 0; --sNdx) {
-                            final ActivityStack stack = taskDisplayArea.getStackAt(sNdx);
-                            if (!WindowConfiguration.isSplitScreenWindowingMode(
-                                    stack.getWindowingMode())) {
-                                stack.reparent(mSecondary, POSITION_BOTTOM);
-                            }
-                        }
-                    }
-                }
-            }
-        }
-        @Override
-        public void onBackPressedOnTaskRoot(ActivityManager.RunningTaskInfo taskInfo) {
-        }
-    };
 }
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java
index 4532400..17dd26e 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java
@@ -89,13 +89,13 @@
     public void testOnPictureInPictureRequested() throws RemoteException {
         final ActivityStack stack = new StackBuilder(mRootWindowContainer).build();
         final ActivityRecord activity = stack.getBottomMostTask().getTopNonFinishingActivity();
-        ClientLifecycleManager lifecycleManager = mService.getLifecycleManager();
-        doNothing().when(lifecycleManager).scheduleTransaction(any());
+        final ClientLifecycleManager mockLifecycleManager = mock(ClientLifecycleManager.class);
+        doReturn(mockLifecycleManager).when(mService).getLifecycleManager();
         doReturn(true).when(activity).checkEnterPictureInPictureState(anyString(), anyBoolean());
 
         mService.requestPictureInPictureMode(activity.token);
 
-        verify(lifecycleManager).scheduleTransaction(mClientTransactionCaptor.capture());
+        verify(mockLifecycleManager).scheduleTransaction(mClientTransactionCaptor.capture());
         final ClientTransaction transaction = mClientTransactionCaptor.getValue();
         // Check that only an enter pip request item callback was scheduled.
         assertEquals(1, transaction.getCallbacks().size());
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java b/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java
index 67d4769..0700f9f 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java
@@ -17,7 +17,10 @@
 package com.android.server.wm;
 
 import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
+import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED;
 import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
+import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
+import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECONDARY;
 import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
 import static android.content.pm.ActivityInfo.RESIZE_MODE_RESIZEABLE;
 import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
@@ -30,9 +33,12 @@
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock;
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
+import static com.android.server.wm.WindowContainer.POSITION_BOTTOM;
 
+import android.app.ActivityManager;
 import android.app.ActivityOptions;
 import android.app.IApplicationThread;
+import android.app.WindowConfiguration;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
@@ -43,6 +49,8 @@
 import android.os.Bundle;
 import android.os.UserHandle;
 import android.service.voice.IVoiceInteractionSession;
+import android.window.ITaskOrganizer;
+import android.window.WindowContainerToken;
 
 import com.android.server.AttributeCache;
 
@@ -321,6 +329,7 @@
         private boolean mCreateStack = true;
 
         private ActivityStack mStack;
+        private TaskDisplayArea mTaskDisplayArea;
 
         TaskBuilder(ActivityStackSupervisor supervisor) {
             mSupervisor = supervisor;
@@ -370,9 +379,16 @@
             return this;
         }
 
+        TaskBuilder setDisplay(DisplayContent display) {
+            mTaskDisplayArea = display.getDefaultTaskDisplayArea();
+            return this;
+        }
+
         Task build() {
             if (mStack == null && mCreateStack) {
-                mStack = mSupervisor.mRootWindowContainer.getDefaultTaskDisplayArea().createStack(
+                TaskDisplayArea displayArea = mTaskDisplayArea != null ? mTaskDisplayArea
+                        : mSupervisor.mRootWindowContainer.getDefaultTaskDisplayArea();
+                mStack = displayArea.createStack(
                         WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
                 spyOn(mStack);
             }
@@ -505,4 +521,74 @@
         }
 
     }
+
+    static class TestSplitOrganizer extends ITaskOrganizer.Stub {
+        final ActivityTaskManagerService mService;
+        Task mPrimary;
+        Task mSecondary;
+        boolean mInSplit = false;
+        // moves everything to secondary. Most tests expect this since sysui usually does it.
+        boolean mMoveToSecondaryOnEnter = true;
+        int mDisplayId;
+        TestSplitOrganizer(ActivityTaskManagerService service, int displayId) {
+            mService = service;
+            mDisplayId = displayId;
+            mService.mTaskOrganizerController.registerTaskOrganizer(this,
+                    WINDOWING_MODE_SPLIT_SCREEN_PRIMARY);
+            mService.mTaskOrganizerController.registerTaskOrganizer(this,
+                    WINDOWING_MODE_SPLIT_SCREEN_SECONDARY);
+            WindowContainerToken primary = mService.mTaskOrganizerController.createRootTask(
+                    displayId, WINDOWING_MODE_SPLIT_SCREEN_PRIMARY).token;
+            mPrimary = WindowContainer.fromBinder(primary.asBinder()).asTask();
+            WindowContainerToken secondary = mService.mTaskOrganizerController.createRootTask(
+                    displayId, WINDOWING_MODE_SPLIT_SCREEN_SECONDARY).token;
+            mSecondary = WindowContainer.fromBinder(secondary.asBinder()).asTask();
+        }
+        TestSplitOrganizer(ActivityTaskManagerService service) {
+            this(service,
+                    service.mStackSupervisor.mRootWindowContainer.getDefaultDisplay().mDisplayId);
+        }
+        public void setMoveToSecondaryOnEnter(boolean move) {
+            mMoveToSecondaryOnEnter = move;
+        }
+        @Override
+        public void onTaskAppeared(ActivityManager.RunningTaskInfo info) {
+        }
+        @Override
+        public void onTaskVanished(ActivityManager.RunningTaskInfo info) {
+        }
+        @Override
+        public void onTaskInfoChanged(ActivityManager.RunningTaskInfo info) {
+            if (mInSplit) {
+                return;
+            }
+            if (info.topActivityType == ACTIVITY_TYPE_UNDEFINED) {
+                // Not populated
+                return;
+            }
+            if (info.configuration.windowConfiguration.getWindowingMode()
+                    != WINDOWING_MODE_SPLIT_SCREEN_PRIMARY) {
+                return;
+            }
+            mInSplit = true;
+            if (!mMoveToSecondaryOnEnter) {
+                return;
+            }
+            mService.mTaskOrganizerController.setLaunchRoot(mDisplayId,
+                    mSecondary.mRemoteToken.toWindowContainerToken());
+            DisplayContent dc = mService.mRootWindowContainer.getDisplayContent(mDisplayId);
+            for (int tdaNdx = dc.getTaskDisplayAreaCount() - 1; tdaNdx >= 0; --tdaNdx) {
+                final TaskDisplayArea taskDisplayArea = dc.getTaskDisplayAreaAt(tdaNdx);
+                for (int sNdx = taskDisplayArea.getStackCount() - 1; sNdx >= 0; --sNdx) {
+                    final ActivityStack stack = taskDisplayArea.getStackAt(sNdx);
+                    if (!WindowConfiguration.isSplitScreenWindowingMode(stack.getWindowingMode())) {
+                        stack.reparent(mSecondary, POSITION_BOTTOM);
+                    }
+                }
+            }
+        }
+        @Override
+        public void onBackPressedOnTaskRoot(ActivityManager.RunningTaskInfo taskInfo) {
+        }
+    };
 }
diff --git a/services/tests/wmtests/src/com/android/server/wm/AppChangeTransitionTests.java b/services/tests/wmtests/src/com/android/server/wm/AppChangeTransitionTests.java
index 9b7ffd6..e8fab2b 100644
--- a/services/tests/wmtests/src/com/android/server/wm/AppChangeTransitionTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/AppChangeTransitionTests.java
@@ -37,7 +37,6 @@
 import android.view.RemoteAnimationDefinition;
 import android.view.RemoteAnimationTarget;
 
-import androidx.test.filters.FlakyTest;
 import androidx.test.filters.SmallTest;
 
 import org.junit.Test;
@@ -97,7 +96,6 @@
     }
 
     @Test
-    @FlakyTest(bugId = 131005232)
     public void testModeChangeRemoteAnimatorNoSnapshot() {
         // setup currently defaults to no snapshot.
         setUpOnDisplay(mDisplayContent);
@@ -115,7 +113,6 @@
     }
 
     @Test
-    @FlakyTest(bugId = 131005232)
     public void testCancelPendingChangeOnRemove() {
         // setup currently defaults to no snapshot.
         setUpOnDisplay(mDisplayContent);
@@ -135,8 +132,7 @@
     }
 
     @Test
-    @FlakyTest(bugId = 131005232)
-    public void testNoChangeWhenMoveDisplay() {
+    public void testNoChangeOnOldDisplayWhenMoveDisplay() {
         mDisplayContent.setWindowingMode(WINDOWING_MODE_FULLSCREEN);
         final DisplayContent dc1 = createNewDisplay(Display.STATE_ON);
         dc1.setWindowingMode(WINDOWING_MODE_FREEFORM);
@@ -151,9 +147,8 @@
 
         assertEquals(WINDOWING_MODE_FULLSCREEN, mTask.getWindowingMode());
 
-        // Make sure we're not waiting for a change animation (no leash)
-        assertFalse(mTask.isInChangeTransition());
-        assertNull(mActivity.mSurfaceFreezer.mSnapshot);
+        // Make sure the change transition is not the old display
+        assertFalse(dc1.mChangingContainers.contains(mTask));
 
         waitUntilHandlersIdle();
         mActivity.removeImmediately();
diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayAreaOrganizerTest.java b/services/tests/wmtests/src/com/android/server/wm/DisplayAreaOrganizerTest.java
new file mode 100644
index 0000000..307b40f
--- /dev/null
+++ b/services/tests/wmtests/src/com/android/server/wm/DisplayAreaOrganizerTest.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.wm;
+
+import static android.window.DisplayAreaOrganizer.FEATURE_VENDOR_FIRST;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.graphics.Rect;
+import android.os.Binder;
+import android.os.RemoteException;
+import android.platform.test.annotations.Presubmit;
+import android.window.IDisplayAreaOrganizer;
+
+import androidx.test.filters.SmallTest;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@SmallTest
+@Presubmit
+@RunWith(WindowTestRunner.class)
+public class DisplayAreaOrganizerTest extends WindowTestsBase {
+
+    private DisplayArea mTestDisplayArea;
+
+    @Before
+    public void setUp() {
+        WindowContainer parentWindow = mDisplayContent.getDefaultTaskDisplayArea().getParent();
+        mTestDisplayArea = new DisplayArea(mWm, DisplayArea.Type.ANY,
+                "TestDisplayArea", FEATURE_VENDOR_FIRST);
+        parentWindow.addChild(mTestDisplayArea,
+                parentWindow.mChildren.indexOf(mDisplayContent.getDefaultTaskDisplayArea()) + 1);
+    }
+
+    @After
+    public void tearDown() {
+        mTestDisplayArea.removeImmediately();
+    }
+
+    private IDisplayAreaOrganizer registerMockOrganizer(int feature) {
+        final IDisplayAreaOrganizer organizer = mock(IDisplayAreaOrganizer.class);
+        when(organizer.asBinder()).thenReturn(new Binder());
+
+        mWm.mAtmService.mWindowOrganizerController.mDisplayAreaOrganizerController
+                .registerOrganizer(organizer, feature);
+        return organizer;
+    }
+
+    private void unregisterMockOrganizer(IDisplayAreaOrganizer organizer) {
+        mWm.mAtmService.mWindowOrganizerController.mDisplayAreaOrganizerController
+                .unregisterOrganizer(organizer);
+    }
+
+    @Test
+    public void testAppearedVanished() throws RemoteException {
+        IDisplayAreaOrganizer organizer = registerMockOrganizer(FEATURE_VENDOR_FIRST);
+        verify(organizer).onDisplayAreaAppeared(any());
+
+        unregisterMockOrganizer(organizer);
+        verify(organizer).onDisplayAreaVanished(any());
+    }
+
+    @Test
+    public void testChanged() throws RemoteException {
+        IDisplayAreaOrganizer organizer = registerMockOrganizer(FEATURE_VENDOR_FIRST);
+        verify(organizer).onDisplayAreaAppeared(any());
+
+        mDisplayContent.setBounds(new Rect(0, 0, 1000, 1000));
+        verify(organizer).onDisplayAreaInfoChanged(any());
+    }
+}
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 a901d1e..80fcf2e 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
@@ -41,6 +41,7 @@
 import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
 import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
 import static android.view.WindowManager.LayoutParams.TYPE_NOTIFICATION_SHADE;
+import static android.view.WindowManager.LayoutParams.TYPE_SCREENSHOT;
 import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR;
 import static android.view.WindowManager.LayoutParams.TYPE_VOICE_INTERACTION;
 import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER;
@@ -65,6 +66,7 @@
 import static org.hamcrest.Matchers.is;
 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.assertNull;
 import static org.junit.Assert.assertThat;
@@ -73,6 +75,7 @@
 import static org.mockito.ArgumentMatchers.eq;
 
 import android.annotation.SuppressLint;
+import android.app.ActivityTaskManager;
 import android.app.WindowConfiguration;
 import android.content.res.Configuration;
 import android.graphics.Rect;
@@ -84,12 +87,16 @@
 import android.util.DisplayMetrics;
 import android.view.DisplayCutout;
 import android.view.Gravity;
+import android.view.IDisplayWindowInsetsController;
 import android.view.IDisplayWindowRotationCallback;
 import android.view.IDisplayWindowRotationController;
 import android.view.ISystemGestureExclusionListener;
 import android.view.IWindowManager;
+import android.view.InsetsSourceControl;
+import android.view.InsetsState;
 import android.view.MotionEvent;
 import android.view.Surface;
+import android.view.SurfaceControl.Transaction;
 import android.view.ViewRootImpl;
 import android.view.WindowManager;
 import android.view.test.InsetsModeSession;
@@ -809,25 +816,19 @@
 
     @Test
     public void testComputeImeParent_app() throws Exception {
-        try (final InsetsModeSession session =
-                     new InsetsModeSession(ViewRootImpl.NEW_INSETS_MODE_IME)) {
-            final DisplayContent dc = createNewDisplay();
-            dc.mInputMethodTarget = createWindow(null, TYPE_BASE_APPLICATION, "app");
-            assertEquals(dc.mInputMethodTarget.mActivityRecord.getSurfaceControl(),
-                    dc.computeImeParent());
-        }
+        final DisplayContent dc = createNewDisplay();
+        dc.mInputMethodTarget = createWindow(null, TYPE_BASE_APPLICATION, "app");
+        assertEquals(dc.mInputMethodTarget.mActivityRecord.getSurfaceControl(),
+                dc.computeImeParent());
     }
 
     @Test
     public void testComputeImeParent_app_notFullscreen() throws Exception {
-        try (final InsetsModeSession session =
-                     new InsetsModeSession(ViewRootImpl.NEW_INSETS_MODE_IME)) {
-            final DisplayContent dc = createNewDisplay();
-            dc.mInputMethodTarget = createWindow(null, TYPE_STATUS_BAR, "app");
-            dc.mInputMethodTarget.setWindowingMode(
-                    WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY);
-            assertEquals(dc.getWindowingLayer(), dc.computeImeParent());
-        }
+        final DisplayContent dc = createNewDisplay();
+        dc.mInputMethodTarget = createWindow(null, TYPE_STATUS_BAR, "app");
+        dc.mInputMethodTarget.setWindowingMode(
+                WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY);
+        assertEquals(dc.getImeContainer().getParentSurfaceControl(), dc.computeImeParent());
     }
 
     @Test
@@ -836,17 +837,67 @@
         doReturn(false).when(mAppWindow.mActivityRecord).matchParentBounds();
         mDisplayContent.mInputMethodTarget = mAppWindow;
         // The surface parent of IME should be the display instead of app window.
-        assertEquals(mDisplayContent.getWindowingLayer(), mDisplayContent.computeImeParent());
+        assertEquals(mDisplayContent.getImeContainer().getParentSurfaceControl(),
+                mDisplayContent.computeImeParent());
     }
 
     @Test
     public void testComputeImeParent_noApp() throws Exception {
-        try (final InsetsModeSession session =
-                     new InsetsModeSession(ViewRootImpl.NEW_INSETS_MODE_IME)) {
-            final DisplayContent dc = createNewDisplay();
-            dc.mInputMethodTarget = createWindow(null, TYPE_STATUS_BAR, "statusBar");
-            assertEquals(dc.getWindowingLayer(), dc.computeImeParent());
-        }
+        final DisplayContent dc = createNewDisplay();
+        dc.mInputMethodTarget = createWindow(null, TYPE_STATUS_BAR, "statusBar");
+        assertEquals(dc.getImeContainer().getParentSurfaceControl(), dc.computeImeParent());
+    }
+
+    @Test
+    public void testComputeImeControlTarget() throws Exception {
+        final DisplayContent dc = createNewDisplay();
+        dc.setRemoteInsetsController(createDisplayWindowInsetsController());
+        dc.mInputMethodInputTarget = createWindow(null, TYPE_BASE_APPLICATION, "app");
+        dc.mInputMethodTarget = dc.mInputMethodInputTarget;
+        assertEquals(dc.mInputMethodInputTarget, dc.computeImeControlTarget());
+    }
+
+    @Test
+    public void testComputeImeControlTarget_splitscreen() throws Exception {
+        final DisplayContent dc = createNewDisplay();
+        dc.mInputMethodInputTarget = createWindow(null, TYPE_BASE_APPLICATION, "app");
+        dc.mInputMethodInputTarget.setWindowingMode(
+                WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY);
+        dc.mInputMethodTarget = dc.mInputMethodInputTarget;
+        dc.setRemoteInsetsController(createDisplayWindowInsetsController());
+        assertNotEquals(dc.mInputMethodInputTarget, dc.computeImeControlTarget());
+    }
+
+    @Test
+    public void testComputeImeControlTarget_notMatchParentBounds() throws Exception {
+        spyOn(mAppWindow.mActivityRecord);
+        doReturn(false).when(mAppWindow.mActivityRecord).matchParentBounds();
+        mDisplayContent.mInputMethodInputTarget = mAppWindow;
+        mDisplayContent.mInputMethodTarget = mDisplayContent.mInputMethodInputTarget;
+        mDisplayContent.setRemoteInsetsController(createDisplayWindowInsetsController());
+        assertEquals(mAppWindow, mDisplayContent.computeImeControlTarget());
+    }
+
+    private IDisplayWindowInsetsController createDisplayWindowInsetsController() {
+        return new IDisplayWindowInsetsController.Stub() {
+
+            @Override
+            public void insetsChanged(InsetsState insetsState) throws RemoteException {
+            }
+
+            @Override
+            public void insetsControlChanged(InsetsState insetsState,
+                    InsetsSourceControl[] insetsSourceControls) throws RemoteException {
+            }
+
+            @Override
+            public void showInsets(int i, boolean b) throws RemoteException {
+            }
+
+            @Override
+            public void hideInsets(int i, boolean b) throws RemoteException {
+            }
+        };
     }
 
     @Test
@@ -1039,6 +1090,12 @@
         assertEquals(config90.orientation, app.getConfiguration().orientation);
         assertEquals(config90.windowConfiguration.getBounds(), app.getBounds());
 
+        // Make wallaper laid out with the fixed rotation transform.
+        final WindowToken wallpaperToken = mWallpaperWindow.mToken;
+        wallpaperToken.linkFixedRotationTransform(app);
+        mWallpaperWindow.mLayoutNeeded = true;
+        performLayout(mDisplayContent);
+
         // Force the negative offset to verify it can be updated.
         mWallpaperWindow.mWinAnimator.mXOffset = mWallpaperWindow.mWinAnimator.mYOffset = -1;
         assertTrue(mDisplayContent.mWallpaperController.updateWallpaperOffset(mWallpaperWindow,
@@ -1046,6 +1103,13 @@
         assertThat(mWallpaperWindow.mWinAnimator.mXOffset).isGreaterThan(-1);
         assertThat(mWallpaperWindow.mWinAnimator.mYOffset).isGreaterThan(-1);
 
+        // The wallpaper need to animate with transformed position, so its surface position should
+        // not be reset.
+        final Transaction t = wallpaperToken.getPendingTransaction();
+        spyOn(t);
+        mWallpaperWindow.mToken.onAnimationLeashCreated(t, null /* leash */);
+        verify(t, never()).setPosition(any(), eq(0), eq(0));
+
         mDisplayContent.mAppTransition.notifyAppTransitionFinishedLocked(app.token);
 
         // The animation in old rotation should be cancelled.
@@ -1145,6 +1209,31 @@
         assertNull(taskDisplayArea.getOrCreateRootHomeTask());
     }
 
+    @Test
+    public void testFindScrollCaptureTargetWindow_behindWindow() {
+        DisplayContent display = createNewDisplay();
+        ActivityStack stack = createTaskStackOnDisplay(display);
+        Task task = createTaskInStack(stack, 0 /* userId */);
+        WindowState activityWindow = createAppWindow(task, TYPE_APPLICATION, "App Window");
+        WindowState behindWindow = createWindow(null, TYPE_SCREENSHOT, display, "Screenshot");
+
+        WindowState result = display.findScrollCaptureTargetWindow(behindWindow,
+                ActivityTaskManager.INVALID_TASK_ID);
+        assertEquals(activityWindow, result);
+    }
+
+    @Test
+    public void testFindScrollCaptureTargetWindow_taskId() {
+        DisplayContent display = createNewDisplay();
+        ActivityStack stack = createTaskStackOnDisplay(display);
+        Task task = createTaskInStack(stack, 0 /* userId */);
+        WindowState window = createAppWindow(task, TYPE_APPLICATION, "App Window");
+        WindowState behindWindow = createWindow(null, TYPE_SCREENSHOT, display, "Screenshot");
+
+        WindowState result = display.findScrollCaptureTargetWindow(null, task.mTaskId);
+        assertEquals(window, result);
+    }
+
     private boolean isOptionsPanelAtRight(int displayId) {
         return (mWm.getPreferredOptionsPanelGravity(displayId) & Gravity.RIGHT) == Gravity.RIGHT;
     }
diff --git a/services/tests/wmtests/src/com/android/server/wm/InsetsPolicyTest.java b/services/tests/wmtests/src/com/android/server/wm/InsetsPolicyTest.java
index b6eb901..f831287 100644
--- a/services/tests/wmtests/src/com/android/server/wm/InsetsPolicyTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/InsetsPolicyTest.java
@@ -50,6 +50,7 @@
 import androidx.test.filters.SmallTest;
 
 import org.junit.AfterClass;
+import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -72,6 +73,11 @@
         sInsetsModeSession.close();
     }
 
+    @Before
+    public void setup() {
+        mWm.mAnimator.ready();
+    }
+
     @Test
     public void testControlsForDispatch_regular() {
         addWindow(TYPE_STATUS_BAR, "statusBar");
@@ -194,6 +200,7 @@
         policy.updateBarControlTarget(mAppWindow);
         policy.showTransient(
                 IntArray.wrap(new int[]{ITYPE_STATUS_BAR, ITYPE_NAVIGATION_BAR}));
+        waitUntilWindowAnimatorIdle();
         final InsetsSourceControl[] controls =
                 mDisplayContent.getInsetsStateController().getControlsForDispatch(mAppWindow);
 
@@ -221,6 +228,7 @@
         policy.updateBarControlTarget(mAppWindow);
         policy.showTransient(
                 IntArray.wrap(new int[]{ITYPE_STATUS_BAR, ITYPE_NAVIGATION_BAR}));
+        waitUntilWindowAnimatorIdle();
         final InsetsSourceControl[] controls =
                 mDisplayContent.getInsetsStateController().getControlsForDispatch(mAppWindow);
 
@@ -249,6 +257,7 @@
         policy.updateBarControlTarget(mAppWindow);
         policy.showTransient(
                 IntArray.wrap(new int[]{ITYPE_STATUS_BAR, ITYPE_NAVIGATION_BAR}));
+        waitUntilWindowAnimatorIdle();
         InsetsSourceControl[] controls =
                 mDisplayContent.getInsetsStateController().getControlsForDispatch(mAppWindow);
 
@@ -262,6 +271,7 @@
         state.setSourceVisible(ITYPE_STATUS_BAR, true);
         state.setSourceVisible(ITYPE_NAVIGATION_BAR, true);
         policy.onInsetsModified(mAppWindow, state);
+        waitUntilWindowAnimatorIdle();
 
         controls = mDisplayContent.getInsetsStateController().getControlsForDispatch(mAppWindow);
 
diff --git a/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java
index 61b74b0..9f28f45 100644
--- a/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java
@@ -29,9 +29,11 @@
 import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION;
 
 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.assertNull;
+import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.atLeast;
 import static org.mockito.Mockito.clearInvocations;
 import static org.mockito.Mockito.spy;
@@ -44,7 +46,6 @@
 import android.view.InsetsState;
 import android.view.test.InsetsModeSession;
 
-import androidx.test.filters.FlakyTest;
 import androidx.test.filters.SmallTest;
 
 import org.junit.AfterClass;
@@ -153,22 +154,24 @@
 
     @Test
     public void testStripForDispatch_belowIme() {
+        getController().getSourceProvider(ITYPE_IME).setWindow(mImeWindow, null, null);
+
         final WindowState app = createWindow(null, TYPE_APPLICATION, "app");
-        final WindowState ime = createWindow(null, TYPE_APPLICATION, "ime");
+        app.mBehindIme = true;
 
-        getController().getSourceProvider(ITYPE_IME).setWindow(ime, null, null);
-
-        assertNotNull(getController().getInsetsForDispatch(app).peekSource(ITYPE_IME));
+        getController().getRawInsetsState().setSourceVisible(ITYPE_IME, true);
+        assertTrue(getController().getInsetsForDispatch(app).getSource(ITYPE_IME).isVisible());
     }
 
     @Test
     public void testStripForDispatch_aboveIme() {
-        final WindowState ime = createWindow(null, TYPE_APPLICATION, "ime");
+        getController().getSourceProvider(ITYPE_IME).setWindow(mImeWindow, null, null);
+
         final WindowState app = createWindow(null, TYPE_APPLICATION, "app");
+        app.mBehindIme = false;
 
-        getController().getSourceProvider(ITYPE_IME).setWindow(ime, null, null);
-
-        assertNull(getController().getInsetsForDispatch(app).peekSource(ITYPE_IME));
+        getController().getRawInsetsState().setSourceVisible(ITYPE_IME, true);
+        assertFalse(getController().getInsetsForDispatch(app).getSource(ITYPE_IME).isVisible());
     }
 
     @Test
@@ -188,11 +191,11 @@
         // Adding FLAG_NOT_FOCUSABLE makes app above IME.
         app.mAttrs.flags |= FLAG_NOT_FOCUSABLE;
         mDisplayContent.computeImeTarget(true);
-        mDisplayContent.setLayoutNeeded();
         mDisplayContent.applySurfaceChangesTransaction();
 
-        // app won't get IME insets while above IME.
-        assertNull(getController().getInsetsForDispatch(app).peekSource(ITYPE_IME));
+        // app won't get visible IME insets while above IME even when IME is visible.
+        getController().getRawInsetsState().setSourceVisible(ITYPE_IME, true);
+        assertFalse(getController().getInsetsForDispatch(app).getSource(ITYPE_IME).isVisible());
 
         // Reset invocation counter.
         clearInvocations(app);
@@ -200,49 +203,49 @@
         // Removing FLAG_NOT_FOCUSABLE makes app below IME.
         app.mAttrs.flags &= ~FLAG_NOT_FOCUSABLE;
         mDisplayContent.computeImeTarget(true);
-        mDisplayContent.setLayoutNeeded();
         mDisplayContent.applySurfaceChangesTransaction();
 
         // Make sure app got notified.
         verify(app, atLeast(1)).notifyInsetsChanged();
 
-        // app will get IME insets while below IME.
-        assertNotNull(getController().getInsetsForDispatch(app).peekSource(ITYPE_IME));
+        // app will get visible IME insets while below IME when IME is visible.
+        getController().getRawInsetsState().setSourceVisible(ITYPE_IME, true);
+        assertTrue(getController().getInsetsForDispatch(app).getSource(ITYPE_IME).isVisible());
     }
 
     @Test
     public void testStripForDispatch_childWindow_altFocusable() {
-        final WindowState app = createWindow(null, TYPE_APPLICATION, "app");
+        getController().getSourceProvider(ITYPE_IME).setWindow(mImeWindow, null, null);
 
+        final WindowState app = createWindow(null, TYPE_APPLICATION, "app");
         final WindowState child = createWindow(app, TYPE_APPLICATION, "child");
         child.mAttrs.flags |= FLAG_ALT_FOCUSABLE_IM;
 
-        final WindowState ime = createWindow(null, TYPE_APPLICATION, "ime");
+        mDisplayContent.computeImeTarget(true);
+        mDisplayContent.setLayoutNeeded();
+        mDisplayContent.applySurfaceChangesTransaction();
 
-        // IME cannot be the IME target.
-        ime.mAttrs.flags |= FLAG_NOT_FOCUSABLE;
-
-        getController().getSourceProvider(ITYPE_IME).setWindow(ime, null, null);
-
-        assertNull(getController().getInsetsForDispatch(child).peekSource(ITYPE_IME));
+        getController().getRawInsetsState().setSourceVisible(ITYPE_IME, true);
+        assertTrue(getController().getInsetsForDispatch(app).getSource(ITYPE_IME).isVisible());
+        assertFalse(getController().getInsetsForDispatch(child).getSource(ITYPE_IME).isVisible());
     }
 
     @Test
     public void testStripForDispatch_childWindow_splitScreen() {
-        final WindowState app = createWindow(null, TYPE_APPLICATION, "app");
+        getController().getSourceProvider(ITYPE_IME).setWindow(mImeWindow, null, null);
 
+        final WindowState app = createWindow(null, TYPE_APPLICATION, "app");
         final WindowState child = createWindow(app, TYPE_APPLICATION, "child");
         child.mAttrs.flags |= FLAG_NOT_FOCUSABLE;
         child.setWindowingMode(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY);
 
-        final WindowState ime = createWindow(null, TYPE_APPLICATION, "ime");
+        mDisplayContent.computeImeTarget(true);
+        mDisplayContent.setLayoutNeeded();
+        mDisplayContent.applySurfaceChangesTransaction();
 
-        // IME cannot be the IME target.
-        ime.mAttrs.flags |= FLAG_NOT_FOCUSABLE;
-
-        getController().getSourceProvider(ITYPE_IME).setWindow(ime, null, null);
-
-        assertNull(getController().getInsetsForDispatch(child).peekSource(ITYPE_IME));
+        getController().getRawInsetsState().setSourceVisible(ITYPE_IME, true);
+        assertTrue(getController().getInsetsForDispatch(app).getSource(ITYPE_IME).isVisible());
+        assertFalse(getController().getInsetsForDispatch(child).getSource(ITYPE_IME).isVisible());
     }
 
     @Test
diff --git a/services/tests/wmtests/src/com/android/server/wm/LaunchParamsControllerTests.java b/services/tests/wmtests/src/com/android/server/wm/LaunchParamsControllerTests.java
index 8a9504d..61de7d8 100644
--- a/services/tests/wmtests/src/com/android/server/wm/LaunchParamsControllerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/LaunchParamsControllerTests.java
@@ -19,7 +19,6 @@
 import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
 import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
 import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
-import static android.view.Display.DEFAULT_DISPLAY;
 import static android.view.Display.INVALID_DISPLAY;
 
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.any;
@@ -112,7 +111,7 @@
         final ActivityRecord activity = new ActivityBuilder(mService).setComponent(name)
                 .setUid(userId).build();
         final LaunchParams expected = new LaunchParams();
-        expected.mPreferredDisplayId = 3;
+        expected.mPreferredTaskDisplayArea = mock(TaskDisplayArea.class);
         expected.mWindowingMode = WINDOWING_MODE_PINNED;
         expected.mBounds.set(200, 300, 400, 500);
 
@@ -183,7 +182,7 @@
         final LaunchParams params = new LaunchParams();
         params.mWindowingMode = WINDOWING_MODE_FREEFORM;
         params.mBounds.set(0, 0, 30, 20);
-        params.mPreferredDisplayId = 3;
+        params.mPreferredTaskDisplayArea = mock(TaskDisplayArea.class);
 
         final InstrumentedPositioner positioner2 = new InstrumentedPositioner(RESULT_CONTINUE,
                 params);
@@ -228,8 +227,8 @@
      */
     @Test
     public void testVrPreferredDisplay() {
-        final int vr2dDisplayId = 1;
-        mService.mVr2dDisplayId = vr2dDisplayId;
+        final TestDisplayContent vrDisplay = createNewDisplayContent();
+        mService.mVr2dDisplayId = vrDisplay.mDisplayId;
 
         final LaunchParams result = new LaunchParams();
         final ActivityRecord vrActivity = new ActivityBuilder(mService).build();
@@ -238,16 +237,17 @@
         // VR activities should always land on default display.
         mController.calculate(null /*task*/, null /*layout*/, vrActivity /*activity*/,
                 null /*source*/, null /*options*/, PHASE_BOUNDS, result);
-        assertEquals(DEFAULT_DISPLAY, result.mPreferredDisplayId);
+        assertEquals(mRootWindowContainer.getDefaultTaskDisplayArea(),
+                result.mPreferredTaskDisplayArea);
 
         // Otherwise, always lands on VR 2D display.
         final ActivityRecord vr2dActivity = new ActivityBuilder(mService).build();
         mController.calculate(null /*task*/, null /*layout*/, vr2dActivity /*activity*/,
                 null /*source*/, null /*options*/, PHASE_BOUNDS, result);
-        assertEquals(vr2dDisplayId, result.mPreferredDisplayId);
+        assertEquals(vrDisplay.getDefaultTaskDisplayArea(), result.mPreferredTaskDisplayArea);
         mController.calculate(null /*task*/, null /*layout*/, null /*activity*/, null /*source*/,
                 null /*options*/, PHASE_BOUNDS, result);
-        assertEquals(vr2dDisplayId, result.mPreferredDisplayId);
+        assertEquals(vrDisplay.getDefaultTaskDisplayArea(), result.mPreferredTaskDisplayArea);
 
         mService.mVr2dDisplayId = INVALID_DISPLAY;
     }
@@ -282,9 +282,7 @@
         final LaunchParams params = new LaunchParams();
         final TestDisplayContent display = createNewDisplayContent();
         final TaskDisplayArea preferredTaskDisplayArea = display.getDefaultTaskDisplayArea();
-        // TODO(b/152116619): Enable after complete switch to WindowContainerToken
-        //params.mPreferredWindowContainerToken = preferredTaskDisplayAreaToken;
-        params.mPreferredDisplayId = display.mDisplayId;
+        params.mPreferredTaskDisplayArea = preferredTaskDisplayArea;
         final InstrumentedPositioner positioner = new InstrumentedPositioner(RESULT_DONE, params);
         final Task task = new TaskBuilder(mService.mStackSupervisor).build();
 
@@ -433,7 +431,7 @@
         void saveTask(Task task, DisplayContent display) {
             final int userId = task.mUserId;
             final ComponentName realActivity = task.realActivity;
-            mTmpParams.mPreferredDisplayId = task.getDisplayId();
+            mTmpParams.mPreferredTaskDisplayArea = task.getDisplayArea();
             mTmpParams.mWindowingMode = task.getWindowingMode();
             if (task.mLastNonFullscreenBounds != null) {
                 mTmpParams.mBounds.set(task.mLastNonFullscreenBounds);
diff --git a/services/tests/wmtests/src/com/android/server/wm/LaunchParamsPersisterTests.java b/services/tests/wmtests/src/com/android/server/wm/LaunchParamsPersisterTests.java
index 6a71a7d..9bf86d2 100644
--- a/services/tests/wmtests/src/com/android/server/wm/LaunchParamsPersisterTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/LaunchParamsPersisterTests.java
@@ -19,7 +19,6 @@
 import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
 import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
 import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
-import static android.view.Display.INVALID_DISPLAY;
 
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock;
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
@@ -27,6 +26,7 @@
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Matchers.any;
@@ -163,7 +163,7 @@
 
         mTarget.getLaunchParams(mTestTask, null, mResult);
 
-        assertEquals(mTestDisplay.mDisplayId, mResult.mPreferredDisplayId);
+        assertEquals(mTestDisplay.getDefaultTaskDisplayArea(), mResult.mPreferredTaskDisplayArea);
         assertEquals(TEST_WINDOWING_MODE, mResult.mWindowingMode);
         assertEquals(TEST_BOUNDS, mResult.mBounds);
     }
@@ -177,7 +177,7 @@
 
         mTarget.getLaunchParams(null, activity, mResult);
 
-        assertEquals(mTestDisplay.mDisplayId, mResult.mPreferredDisplayId);
+        assertEquals(mTestDisplay.getDefaultTaskDisplayArea(), mResult.mPreferredTaskDisplayArea);
         assertEquals(TEST_WINDOWING_MODE, mResult.mWindowingMode);
         assertEquals(TEST_BOUNDS, mResult.mBounds);
     }
@@ -190,7 +190,7 @@
 
         mTarget.getLaunchParams(mTestTask, null, mResult);
 
-        assertEquals(INVALID_DISPLAY, mResult.mPreferredDisplayId);
+        assertNull(mResult.mPreferredTaskDisplayArea);
         assertEquals(TEST_WINDOWING_MODE, mResult.mWindowingMode);
         assertEquals(TEST_BOUNDS, mResult.mBounds);
     }
@@ -223,7 +223,7 @@
         mTaskWithDifferentComponent.mWindowLayoutAffinity = TEST_WINDOW_LAYOUT_AFFINITY;
         mTarget.getLaunchParams(mTaskWithDifferentComponent, null, mResult);
 
-        assertEquals(mTestDisplay.mDisplayId, mResult.mPreferredDisplayId);
+        assertEquals(mTestDisplay.getDefaultTaskDisplayArea(), mResult.mPreferredTaskDisplayArea);
         assertEquals(TEST_WINDOWING_MODE, mResult.mWindowingMode);
         assertEquals(TEST_BOUNDS, mResult.mBounds);
     }
@@ -241,7 +241,7 @@
 
         mTarget.getLaunchParams(mTaskWithDifferentComponent, null, mResult);
 
-        assertEquals(mTestDisplay.mDisplayId, mResult.mPreferredDisplayId);
+        assertEquals(mTestDisplay.getDefaultTaskDisplayArea(), mResult.mPreferredTaskDisplayArea);
         assertEquals(TEST_WINDOWING_MODE, mResult.mWindowingMode);
         assertEquals(TEST_BOUNDS, mResult.mBounds);
     }
@@ -282,7 +282,7 @@
 
         target.getLaunchParams(mTestTask, null, mResult);
 
-        assertEquals(mTestDisplay.mDisplayId, mResult.mPreferredDisplayId);
+        assertEquals(mTestDisplay.getDefaultTaskDisplayArea(), mResult.mPreferredTaskDisplayArea);
         assertEquals(TEST_WINDOWING_MODE, mResult.mWindowingMode);
         assertEquals(TEST_BOUNDS, mResult.mBounds);
     }
@@ -301,7 +301,7 @@
         mTaskWithDifferentComponent.mWindowLayoutAffinity = TEST_WINDOW_LAYOUT_AFFINITY;
         target.getLaunchParams(mTaskWithDifferentComponent, null, mResult);
 
-        assertEquals(mTestDisplay.mDisplayId, mResult.mPreferredDisplayId);
+        assertEquals(mTestDisplay.getDefaultTaskDisplayArea(), mResult.mPreferredTaskDisplayArea);
         assertEquals(TEST_WINDOWING_MODE, mResult.mWindowingMode);
         assertEquals(TEST_BOUNDS, mResult.mBounds);
     }
@@ -328,7 +328,7 @@
 
         target.getLaunchParams(mTaskWithDifferentComponent, null, mResult);
 
-        assertEquals(mTestDisplay.mDisplayId, mResult.mPreferredDisplayId);
+        assertEquals(mTestDisplay.getDefaultTaskDisplayArea(), mResult.mPreferredTaskDisplayArea);
         assertEquals(TEST_WINDOWING_MODE, mResult.mWindowingMode);
         assertEquals(TEST_BOUNDS, mResult.mBounds);
     }
diff --git a/services/tests/wmtests/src/com/android/server/wm/LetterboxTest.java b/services/tests/wmtests/src/com/android/server/wm/LetterboxTest.java
index 15417d7..2251ee0 100644
--- a/services/tests/wmtests/src/com/android/server/wm/LetterboxTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/LetterboxTest.java
@@ -16,6 +16,7 @@
 
 package com.android.server.wm;
 
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.Mockito.clearInvocations;
@@ -53,10 +54,102 @@
         mTransaction = spy(StubTransaction.class);
     }
 
+    private static final int TOP_BAR = 0x1;
+    private static final int BOTTOM_BAR = 0x2;
+    private static final int LEFT_BAR = 0x4;
+    private static final int RIGHT_BAR = 0x8;
+
     @Test
-    public void testOverlappingWith_usesGlobalCoordinates() {
-        mLetterbox.layout(new Rect(0, 0, 10, 50), new Rect(0, 2, 10, 45), new Point(1000, 2000));
-        assertTrue(mLetterbox.isOverlappingWith(new Rect(0, 0, 1, 1)));
+    public void testNotIntersectsOrFullyContains_usesGlobalCoordinates() {
+        final Rect outer = new Rect(0, 0, 10, 50);
+        final Point surfaceOrig = new Point(1000, 2000);
+
+        final Rect topBar = new Rect(0, 0, 10, 2);
+        final Rect bottomBar = new Rect(0, 45, 10, 50);
+        final Rect leftBar = new Rect(0, 0, 2, 50);
+        final Rect rightBar = new Rect(8, 0, 10, 50);
+
+        final LetterboxLayoutVerifier verifier =
+                new LetterboxLayoutVerifier(outer, surfaceOrig, mLetterbox);
+        verifier.setBarRect(topBar, bottomBar, leftBar, rightBar);
+
+        // top
+        verifier.setInner(0, 2, 10, 50).verifyPositions(TOP_BAR | BOTTOM_BAR, BOTTOM_BAR);
+        // bottom
+        verifier.setInner(0, 0, 10, 45).verifyPositions(TOP_BAR | BOTTOM_BAR, TOP_BAR);
+        // left
+        verifier.setInner(2, 0, 10, 50).verifyPositions(LEFT_BAR | RIGHT_BAR, RIGHT_BAR);
+        // right
+        verifier.setInner(0, 0, 8, 50).verifyPositions(LEFT_BAR | RIGHT_BAR, LEFT_BAR);
+        // top + bottom
+        verifier.setInner(0, 2, 10, 45).verifyPositions(TOP_BAR | BOTTOM_BAR, 0);
+        // left + right
+        verifier.setInner(2, 0, 8, 50).verifyPositions(LEFT_BAR | RIGHT_BAR, 0);
+        // top + left
+        verifier.setInner(2, 2, 10, 50).verifyPositions(TOP_BAR | LEFT_BAR, 0);
+        // top + left + right
+        verifier.setInner(2, 2, 8, 50).verifyPositions(TOP_BAR | LEFT_BAR | RIGHT_BAR, 0);
+        // left + right + bottom
+        verifier.setInner(2, 0, 8, 45).verifyPositions(LEFT_BAR | RIGHT_BAR | BOTTOM_BAR, 0);
+        // all
+        verifier.setInner(2, 2, 8, 45)
+                .verifyPositions(TOP_BAR | BOTTOM_BAR | LEFT_BAR | RIGHT_BAR, 0);
+    }
+
+    private static class LetterboxLayoutVerifier {
+        final Rect mOuter;
+        final Rect mInner = new Rect();
+        final Point mSurfaceOrig;
+        final Letterbox mLetterbox;
+        final Rect mTempRect = new Rect();
+
+        final Rect mTop = new Rect();
+        final Rect mBottom = new Rect();
+        final Rect mLeft = new Rect();
+        final Rect mRight = new Rect();
+
+        LetterboxLayoutVerifier(Rect outer, Point surfaceOrig, Letterbox letterbox) {
+            mOuter = new Rect(outer);
+            mSurfaceOrig = new Point(surfaceOrig);
+            mLetterbox = letterbox;
+        }
+
+        LetterboxLayoutVerifier setInner(int left, int top, int right, int bottom) {
+            mInner.set(left, top, right, bottom);
+            mLetterbox.layout(mOuter, mInner, mSurfaceOrig);
+            return this;
+        }
+
+        void setBarRect(Rect top, Rect bottom, Rect left, Rect right) {
+            mTop.set(top);
+            mBottom.set(bottom);
+            mLeft.set(left);
+            mRight.set(right);
+        }
+
+        void verifyPositions(int allowedPos, int noOverlapPos) {
+            assertEquals(mLetterbox.notIntersectsOrFullyContains(mTop),
+                    (allowedPos & TOP_BAR) != 0);
+            assertEquals(mLetterbox.notIntersectsOrFullyContains(mBottom),
+                    (allowedPos & BOTTOM_BAR) != 0);
+            assertEquals(mLetterbox.notIntersectsOrFullyContains(mLeft),
+                    (allowedPos & LEFT_BAR) != 0);
+            assertEquals(mLetterbox.notIntersectsOrFullyContains(mRight),
+                    (allowedPos & RIGHT_BAR) != 0);
+
+            mTempRect.set(mTop.left, mTop.top, mTop.right, mTop.bottom + 1);
+            assertEquals(mLetterbox.notIntersectsOrFullyContains(mTempRect),
+                    (noOverlapPos & TOP_BAR) != 0);
+            mTempRect.set(mLeft.left, mLeft.top, mLeft.right + 1, mLeft.bottom);
+            assertEquals(mLetterbox.notIntersectsOrFullyContains(mTempRect),
+                    (noOverlapPos & LEFT_BAR) != 0);
+            mTempRect.set(mRight.left - 1, mRight.top, mRight.right, mRight.bottom);
+            assertEquals(mLetterbox.notIntersectsOrFullyContains(mTempRect),
+                    (noOverlapPos & RIGHT_BAR) != 0);
+            mTempRect.set(mBottom.left, mBottom.top - 1, mBottom.right, mBottom.bottom);
+            assertEquals(mLetterbox.notIntersectsOrFullyContains(mTempRect),
+                    (noOverlapPos & BOTTOM_BAR) != 0);
+        }
     }
 
     @Test
diff --git a/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationTest.java b/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationTest.java
index 1f6ba7a..44ca2cd 100644
--- a/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationTest.java
@@ -79,7 +79,6 @@
         mService.mWindowManager.setRecentsAnimationController(mRecentsAnimationController);
         doNothing().when(mService.mWindowManager).initializeRecentsAnimation(
                 anyInt(), any(), any(), anyInt(), any(), any());
-        doReturn(true).when(mService.mWindowManager).canStartRecentsAnimation();
 
         final RecentTasks recentTasks = mService.getRecentTasks();
         spyOn(recentTasks);
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 be25597..e887be0 100644
--- a/services/tests/wmtests/src/com/android/server/wm/RefreshRatePolicyTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/RefreshRatePolicyTest.java
@@ -33,6 +33,7 @@
 
 import org.junit.Before;
 import org.junit.Test;
+import org.junit.runner.RunWith;
 
 /**
  * Build/Install/Run:
@@ -40,6 +41,7 @@
  */
 @SmallTest
 @Presubmit
+@RunWith(WindowTestRunner.class)
 @FlakyTest
 public class RefreshRatePolicyTest extends WindowTestsBase {
 
diff --git a/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java b/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java
index 7613655..5dba0045 100644
--- a/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java
@@ -58,7 +58,6 @@
 import android.content.pm.ApplicationInfo;
 import android.content.pm.ResolveInfo;
 import android.content.res.Resources;
-import android.graphics.Rect;
 import android.platform.test.annotations.Presubmit;
 import android.util.Pair;
 
@@ -126,9 +125,7 @@
         ensureStackPlacement(mFullscreenStack, firstActivity, secondActivity);
 
         // Move first activity to pinned stack.
-        final Rect sourceBounds = new Rect();
-        mRootWindowContainer.moveActivityToPinnedStack(firstActivity, sourceBounds,
-                0f /*aspectRatio*/, "initialMove");
+        mRootWindowContainer.moveActivityToPinnedStack(firstActivity, "initialMove");
 
         final TaskDisplayArea taskDisplayArea = mFullscreenStack.getDisplayArea();
         ActivityStack pinnedStack = taskDisplayArea.getRootPinnedTask();
@@ -137,8 +134,7 @@
         ensureStackPlacement(mFullscreenStack, secondActivity);
 
         // Move second activity to pinned stack.
-        mRootWindowContainer.moveActivityToPinnedStack(secondActivity, sourceBounds,
-                0f /*aspectRatio*/, "secondMove");
+        mRootWindowContainer.moveActivityToPinnedStack(secondActivity, "secondMove");
 
         // Need to get stacks again as a new instance might have been created.
         pinnedStack = taskDisplayArea.getRootPinnedTask();
@@ -541,8 +537,8 @@
 
         doReturn(true).when(mRootWindowContainer)
                 .ensureVisibilityAndConfig(any(), anyInt(), anyBoolean(), anyBoolean());
-        doReturn(true).when(mRootWindowContainer).canStartHomeOnDisplay(
-                any(), anyInt(), anyBoolean());
+        doReturn(true).when(mRootWindowContainer).canStartHomeOnDisplayArea(any(), any(),
+                anyBoolean());
 
         mRootWindowContainer.startHomeOnAllDisplays(0, "testStartHome");
 
@@ -582,17 +578,19 @@
 
         // Can not start home if we don't want to start home while home is being instrumented.
         doReturn(true).when(app).isInstrumenting();
-        assertFalse(mRootWindowContainer.canStartHomeOnDisplay(info, DEFAULT_DISPLAY,
+        final TaskDisplayArea defaultTaskDisplayArea = mRootWindowContainer
+                .getDefaultTaskDisplayArea();
+        assertFalse(mRootWindowContainer.canStartHomeOnDisplayArea(info, defaultTaskDisplayArea,
                 false /* allowInstrumenting*/));
 
         // Can start home for other cases.
-        assertTrue(mRootWindowContainer.canStartHomeOnDisplay(info, DEFAULT_DISPLAY,
+        assertTrue(mRootWindowContainer.canStartHomeOnDisplayArea(info, defaultTaskDisplayArea,
                 true /* allowInstrumenting*/));
 
         doReturn(false).when(app).isInstrumenting();
-        assertTrue(mRootWindowContainer.canStartHomeOnDisplay(info, DEFAULT_DISPLAY,
+        assertTrue(mRootWindowContainer.canStartHomeOnDisplayArea(info, defaultTaskDisplayArea,
                 false /* allowInstrumenting*/));
-        assertTrue(mRootWindowContainer.canStartHomeOnDisplay(info, DEFAULT_DISPLAY,
+        assertTrue(mRootWindowContainer.canStartHomeOnDisplayArea(info, defaultTaskDisplayArea,
                 true /* allowInstrumenting*/));
     }
 
@@ -698,8 +696,8 @@
         resolutions.add(resolveInfo);
         doReturn(resolutions).when(mRootWindowContainer).resolveActivities(anyInt(),
                 refEq(secondaryHomeIntent));
-        doReturn(true).when(mRootWindowContainer).canStartHomeOnDisplay(
-                any(), anyInt(), anyBoolean());
+        doReturn(true).when(mRootWindowContainer).canStartHomeOnDisplayArea(any(), any(),
+                anyBoolean());
 
         // Run the test.
         final Pair<ActivityInfo, Intent> resolvedInfo = mRootWindowContainer
@@ -751,8 +749,8 @@
         resolutions.add(infoFake2);
         doReturn(resolutions).when(mRootWindowContainer).resolveActivities(anyInt(), any());
 
-        doReturn(true).when(mRootWindowContainer).canStartHomeOnDisplay(
-                any(), anyInt(), anyBoolean());
+        doReturn(true).when(mRootWindowContainer).canStartHomeOnDisplayArea(any(), any(),
+                anyBoolean());
 
         // Run the test.
         final Pair<ActivityInfo, Intent> resolvedInfo = mRootWindowContainer
@@ -785,8 +783,8 @@
         resolutions.add(infoFake2);
         doReturn(resolutions).when(mRootWindowContainer).resolveActivities(anyInt(), any());
 
-        doReturn(true).when(mRootWindowContainer).canStartHomeOnDisplay(
-                any(), anyInt(), anyBoolean());
+        doReturn(true).when(mRootWindowContainer).canStartHomeOnDisplayArea(any(), any(),
+                anyBoolean());
 
         // Use the first one of matched activities in the same package as selected primary home.
         final Pair<ActivityInfo, Intent> resolvedInfo = mRootWindowContainer
@@ -840,8 +838,9 @@
                 .setTask(task).build();
 
         // Make sure the root task is valid and can be reused on default display.
-        final ActivityStack stack = mRootWindowContainer.getValidLaunchStackOnDisplay(
-                DEFAULT_DISPLAY, activity, task, null, null);
+        final ActivityStack stack = mRootWindowContainer.getValidLaunchStackInTaskDisplayArea(
+                mRootWindowContainer.getDefaultTaskDisplayArea(), activity, task, null,
+                null);
         assertEquals(task, stack);
     }
 
diff --git a/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java b/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java
index 67b1dac..35d1b17 100644
--- a/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java
@@ -16,12 +16,23 @@
 
 package com.android.server.wm;
 
+import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
+import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
+import static android.view.Display.DEFAULT_DISPLAY;
 import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION;
 import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING;
 import static android.view.WindowManager.LayoutParams.TYPE_NOTIFICATION_SHADE;
 import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR;
 import static android.view.WindowManager.LayoutParams.TYPE_TOAST;
 
+import static com.android.server.wm.ActivityStack.ActivityState.FINISHING;
+import static com.android.server.wm.ActivityStack.ActivityState.PAUSED;
+import static com.android.server.wm.ActivityStack.ActivityState.PAUSING;
+import static com.android.server.wm.ActivityStack.ActivityState.STOPPED;
+import static com.android.server.wm.ActivityStack.ActivityState.STOPPING;
+
+import static com.google.common.truth.Truth.assertThat;
+
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
@@ -133,5 +144,30 @@
         assertEquals(activity, mWm.mRoot.findActivity(activity.intent, activity.info,
                 false /* compareIntentFilters */));
     }
+
+    @Test
+    public void testAllPausedActivitiesComplete() {
+        DisplayContent displayContent = mWm.mRoot.getDisplayContent(DEFAULT_DISPLAY);
+        TaskDisplayArea taskDisplayArea = displayContent.getTaskDisplayAreaAt(0);
+        ActivityStack stack = taskDisplayArea.getStackAt(0);
+        ActivityRecord activity = createActivityRecord(displayContent,
+                WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD);
+        stack.mPausingActivity = activity;
+
+        activity.setState(PAUSING, "test PAUSING");
+        assertThat(mWm.mRoot.allPausedActivitiesComplete()).isFalse();
+
+        activity.setState(PAUSED, "test PAUSED");
+        assertThat(mWm.mRoot.allPausedActivitiesComplete()).isTrue();
+
+        activity.setState(STOPPED, "test STOPPED");
+        assertThat(mWm.mRoot.allPausedActivitiesComplete()).isTrue();
+
+        activity.setState(STOPPING, "test STOPPING");
+        assertThat(mWm.mRoot.allPausedActivitiesComplete()).isTrue();
+
+        activity.setState(FINISHING, "test FINISHING");
+        assertThat(mWm.mRoot.allPausedActivitiesComplete()).isTrue();
+    }
 }
 
diff --git a/services/tests/wmtests/src/com/android/server/wm/ScreenDecorWindowTests.java b/services/tests/wmtests/src/com/android/server/wm/ScreenDecorWindowTests.java
index ecb8015..5e8de87 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ScreenDecorWindowTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ScreenDecorWindowTests.java
@@ -25,6 +25,8 @@
 import static android.view.Gravity.LEFT;
 import static android.view.Gravity.RIGHT;
 import static android.view.Gravity.TOP;
+import static android.view.InsetsState.ITYPE_NAVIGATION_BAR;
+import static android.view.InsetsState.ITYPE_STATUS_BAR;
 import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
 import static android.view.WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
 import static android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
@@ -60,7 +62,6 @@
 import android.view.WindowManager;
 import android.widget.TextView;
 
-import androidx.test.filters.FlakyTest;
 import androidx.test.filters.SmallTest;
 
 import org.junit.After;
@@ -78,8 +79,6 @@
  */
 // TODO: Add test for FLAG_FULLSCREEN which hides the status bar and also other flags.
 // TODO: Test non-Activity windows.
-@FlakyTest(detail = "TODO (b/145242835): Re-enable once type mapping is implemented for "
-        + "PRIVATE_FLAG_IS_SCREEN_DECOR")
 @SmallTest
 @Presubmit
 public class ScreenDecorWindowTests {
@@ -187,13 +186,24 @@
         assertTopInsetEquals(mTestActivity, initialInsets.getSystemWindowInsetTop());
     }
 
+    @Test
+    public void testProvidesInsetsTypes() {
+        int[] providesInsetsTypes = new int[]{ITYPE_STATUS_BAR};
+        final View win = createWindow("StatusBarSubPanel", TOP, MATCH_PARENT, mDecorThickness, RED,
+                FLAG_LAYOUT_IN_SCREEN, 0, providesInsetsTypes);
+
+        assertInsetGreaterOrEqual(mTestActivity, TOP, mDecorThickness);
+    }
+
     private View createDecorWindow(int gravity, int width, int height) {
+        int[] providesInsetsTypes =
+                new int[]{gravity == TOP ? ITYPE_STATUS_BAR : ITYPE_NAVIGATION_BAR};
         return createWindow("decorWindow", gravity, width, height, RED,
-                FLAG_LAYOUT_IN_SCREEN, PRIVATE_FLAG_IS_SCREEN_DECOR);
+                FLAG_LAYOUT_IN_SCREEN, PRIVATE_FLAG_IS_SCREEN_DECOR, providesInsetsTypes);
     }
 
     private View createWindow(String name, int gravity, int width, int height, int color, int flags,
-            int privateFlags) {
+            int privateFlags, int[] providesInsetsTypes) {
 
         final View[] viewHolder = new View[1];
         final int finalFlag = flags
@@ -205,6 +215,7 @@
                     width, height, TYPE_APPLICATION_OVERLAY, finalFlag, PixelFormat.OPAQUE);
             lp.gravity = gravity;
             lp.privateFlags |= privateFlags;
+            lp.providesInsetsTypes = providesInsetsTypes;
 
             final TextView view = new TextView(mContext);
             view.setText("ScreenDecorWindowTests - " + name);
diff --git a/services/tests/wmtests/src/com/android/server/wm/SystemServiceTestsBase.java b/services/tests/wmtests/src/com/android/server/wm/SystemServiceTestsBase.java
index f6ed314..d7462f8 100644
--- a/services/tests/wmtests/src/com/android/server/wm/SystemServiceTestsBase.java
+++ b/services/tests/wmtests/src/com/android/server/wm/SystemServiceTestsBase.java
@@ -40,6 +40,11 @@
         mLockRule.waitForLocked(mSystemServicesTestRule::waitUntilWindowManagerHandlersIdle);
     }
 
+    /** Waits until the choreographer of WindowAnimator has processed all callbacks. */
+    void waitUntilWindowAnimatorIdle() {
+        mLockRule.waitForLocked(mSystemServicesTestRule::waitUntilWindowAnimatorIdle);
+    }
+
     void cleanupWindowManagerHandlers() {
         mLockRule.waitForLocked(mSystemServicesTestRule::cleanupWindowManagerHandlers);
     }
diff --git a/services/tests/wmtests/src/com/android/server/wm/SystemServicesTestRule.java b/services/tests/wmtests/src/com/android/server/wm/SystemServicesTestRule.java
index af3ec38..dea9294 100644
--- a/services/tests/wmtests/src/com/android/server/wm/SystemServicesTestRule.java
+++ b/services/tests/wmtests/src/com/android/server/wm/SystemServicesTestRule.java
@@ -429,6 +429,31 @@
         }
     }
 
+    void waitUntilWindowAnimatorIdle() {
+        final WindowManagerService wm = getWindowManagerService();
+        if (wm == null) {
+            return;
+        }
+        synchronized (mCurrentMessagesProcessed) {
+            // Add a message to the handler queue and make sure it is fully processed before we move
+            // on. This makes sure all previous messages in the handler are fully processed vs. just
+            // popping them from the message queue.
+            mCurrentMessagesProcessed.set(false);
+            wm.mAnimator.getChoreographer().postFrameCallback(time -> {
+                synchronized (mCurrentMessagesProcessed) {
+                    mCurrentMessagesProcessed.set(true);
+                    mCurrentMessagesProcessed.notifyAll();
+                }
+            });
+            while (!mCurrentMessagesProcessed.get()) {
+                try {
+                    mCurrentMessagesProcessed.wait();
+                } catch (InterruptedException e) {
+                }
+            }
+        }
+    }
+
     /**
      * Throws if caller doesn't hold the given lock.
      * @param lock the lock
diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskDisplayAreaTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskDisplayAreaTests.java
index a708533..52a5187 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TaskDisplayAreaTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TaskDisplayAreaTests.java
@@ -172,7 +172,7 @@
         assertGetOrCreateStack(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, type, candidateTask,
                 false /* reuseCandidate */);
         assertGetOrCreateStack(WINDOWING_MODE_PINNED, type, candidateTask,
-                false /* reuseCandidate */);
+                true /* reuseCandidate */);
 
         final int windowingMode = WINDOWING_MODE_FULLSCREEN;
         assertGetOrCreateStack(windowingMode, ACTIVITY_TYPE_HOME, candidateTask,
diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskLaunchParamsModifierTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskLaunchParamsModifierTests.java
index 1a38ff2..a69231b 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TaskLaunchParamsModifierTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TaskLaunchParamsModifierTests.java
@@ -30,6 +30,7 @@
 import static android.view.Display.DEFAULT_DISPLAY;
 
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.doNothing;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock;
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
 import static com.android.server.wm.LaunchParamsController.LaunchParamsModifier.RESULT_CONTINUE;
 import static com.android.server.wm.LaunchParamsController.LaunchParamsModifier.RESULT_SKIP;
@@ -44,7 +45,6 @@
 import android.graphics.Rect;
 import android.os.Build;
 import android.platform.test.annotations.Presubmit;
-import android.view.Display;
 import android.view.Gravity;
 
 import androidx.test.filters.SmallTest;
@@ -106,53 +106,45 @@
     // Display ID Related Tests
     // =============================
     @Test
-    public void testDefaultToPrimaryDisplay() {
+    public void testDefaultToPrimaryDisplayArea() {
         createNewDisplayContent(WINDOWING_MODE_FREEFORM);
 
         assertEquals(RESULT_CONTINUE, mTarget.onCalculate(/* task */ null, /* layout */ null,
                 mActivity, /* source */ null, /* options */ null, mCurrent, mResult));
 
-        assertEquals(DEFAULT_DISPLAY, mResult.mPreferredDisplayId);
+        assertEquals(mRootWindowContainer.getDefaultTaskDisplayArea(),
+                mResult.mPreferredTaskDisplayArea);
     }
 
     @Test
-    public void testUsesDefaultDisplayIfPreviousDisplayNotExists() {
-        mCurrent.mPreferredDisplayId = 19;
-
-        assertEquals(RESULT_CONTINUE, mTarget.onCalculate(/* task */ null, /* layout */ null,
-                mActivity, /* source */ null, /* options */ null, mCurrent, mResult));
-
-        assertEquals(DEFAULT_DISPLAY, mResult.mPreferredDisplayId);
-    }
-
-    @Test
-    public void testUsesPreviousDisplayIdIfSet() {
+    public void testUsesPreviousDisplayAreaIfSet() {
         createNewDisplayContent(WINDOWING_MODE_FREEFORM);
         final TestDisplayContent display = createNewDisplayContent(WINDOWING_MODE_FULLSCREEN);
 
-        mCurrent.mPreferredDisplayId = display.mDisplayId;
+        mCurrent.mPreferredTaskDisplayArea = display.getDefaultTaskDisplayArea();
 
         assertEquals(RESULT_CONTINUE, mTarget.onCalculate(/* task */ null, /* layout */ null,
                 mActivity, /* source */ null, /* options */ null, mCurrent, mResult));
 
-        assertEquals(display.mDisplayId, mResult.mPreferredDisplayId);
+        assertEquals(display.getDefaultTaskDisplayArea(), mResult.mPreferredTaskDisplayArea);
     }
 
     @Test
-    public void testUsesSourcesDisplayIdIfSet() {
+    public void testUsesSourcesDisplayAreaIfSet() {
         final TestDisplayContent freeformDisplay = createNewDisplayContent(
                 WINDOWING_MODE_FREEFORM);
         final TestDisplayContent fullscreenDisplay = createNewDisplayContent(
                 WINDOWING_MODE_FULLSCREEN);
 
-        mCurrent.mPreferredDisplayId = freeformDisplay.mDisplayId;
+        mCurrent.mPreferredTaskDisplayArea = freeformDisplay.getDefaultTaskDisplayArea();
 
         ActivityRecord source = createSourceActivity(fullscreenDisplay);
 
         assertEquals(RESULT_CONTINUE, mTarget.onCalculate(/* task */ null, /* layout */ null,
                 mActivity, source, /* options */ null, mCurrent, mResult));
 
-        assertEquals(fullscreenDisplay.mDisplayId, mResult.mPreferredDisplayId);
+        assertEquals(fullscreenDisplay.getDefaultTaskDisplayArea(),
+                mResult.mPreferredTaskDisplayArea);
     }
 
     @Test
@@ -162,7 +154,7 @@
         final TestDisplayContent fullscreenDisplay = createNewDisplayContent(
                 WINDOWING_MODE_FULLSCREEN);
 
-        mCurrent.mPreferredDisplayId = freeformDisplay.mDisplayId;
+        mCurrent.mPreferredTaskDisplayArea = freeformDisplay.getDefaultTaskDisplayArea();
         ActivityRecord source = createSourceActivity(freeformDisplay);
 
         ActivityOptions options = ActivityOptions.makeBasic();
@@ -171,28 +163,51 @@
         assertEquals(RESULT_CONTINUE, mTarget.onCalculate(/* task */ null, /* layout */ null,
                 mActivity, source, options, mCurrent, mResult));
 
-        assertEquals(fullscreenDisplay.mDisplayId, mResult.mPreferredDisplayId);
+        assertEquals(fullscreenDisplay.getDefaultTaskDisplayArea(),
+                mResult.mPreferredTaskDisplayArea);
     }
 
     @Test
-    public void testUsesTasksDisplayIdPriorToSourceIfSet() {
+    public void testUsesOptionsDisplayAreaTokenIfSet() {
         final TestDisplayContent freeformDisplay = createNewDisplayContent(
                 WINDOWING_MODE_FREEFORM);
         final TestDisplayContent fullscreenDisplay = createNewDisplayContent(
                 WINDOWING_MODE_FULLSCREEN);
 
-        mCurrent.mPreferredDisplayId = freeformDisplay.mDisplayId;
+        mCurrent.mPreferredTaskDisplayArea = freeformDisplay.getDefaultTaskDisplayArea();
+        ActivityRecord source = createSourceActivity(freeformDisplay);
+
+        ActivityOptions options = ActivityOptions.makeBasic();
+        options.setLaunchTaskDisplayArea(fullscreenDisplay.getDefaultTaskDisplayArea()
+                .mRemoteToken.toWindowContainerToken());
+
+        assertEquals(RESULT_CONTINUE, mTarget.onCalculate(/* task */ null, /* layout */ null,
+                mActivity, source, options, mCurrent, mResult));
+
+        assertEquals(fullscreenDisplay.getDefaultTaskDisplayArea(),
+                mResult.mPreferredTaskDisplayArea);
+    }
+
+    @Test
+    public void testUsesTasksDisplayAreaIdPriorToSourceIfSet() {
+        final TestDisplayContent freeformDisplay = createNewDisplayContent(
+                WINDOWING_MODE_FREEFORM);
+        final TestDisplayContent fullscreenDisplay = createNewDisplayContent(
+                WINDOWING_MODE_FULLSCREEN);
+
+        mCurrent.mPreferredTaskDisplayArea = freeformDisplay.getDefaultTaskDisplayArea();
         ActivityRecord reusableActivity = createSourceActivity(fullscreenDisplay);
         ActivityRecord source = createSourceActivity(freeformDisplay);
 
         assertEquals(RESULT_CONTINUE, mTarget.onCalculate(reusableActivity.getTask(),
                 /* layout */ null, mActivity, source, /* options */ null, mCurrent, mResult));
 
-        assertEquals(fullscreenDisplay.mDisplayId, mResult.mPreferredDisplayId);
+        assertEquals(fullscreenDisplay.getDefaultTaskDisplayArea(),
+                mResult.mPreferredTaskDisplayArea);
     }
 
     @Test
-    public void testUsesTaskDisplayIdIfSet() {
+    public void testUsesTaskDisplayAreaIdIfSet() {
         final TestDisplayContent freeformDisplay = createNewDisplayContent(
                 WINDOWING_MODE_FREEFORM);
         ActivityRecord source = createSourceActivity(freeformDisplay);
@@ -200,7 +215,8 @@
         assertEquals(RESULT_CONTINUE, mTarget.onCalculate(source.getTask(), null /* layout */,
                 null /* activity */, null /* source */, null /* options */, mCurrent, mResult));
 
-        assertEquals(freeformDisplay.mDisplayId, mResult.mPreferredDisplayId);
+        assertEquals(freeformDisplay.getDefaultTaskDisplayArea(),
+                mResult.mPreferredTaskDisplayArea);
     }
 
     @Test
@@ -210,7 +226,7 @@
         final TestDisplayContent fullscreenDisplay = createNewDisplayContent(
                 WINDOWING_MODE_FULLSCREEN);
 
-        mCurrent.mPreferredDisplayId = fullscreenDisplay.mDisplayId;
+        mCurrent.mPreferredTaskDisplayArea = fullscreenDisplay.getDefaultTaskDisplayArea();
         ActivityRecord reusableActivity = createSourceActivity(fullscreenDisplay);
         ActivityRecord source = createSourceActivity(freeformDisplay);
         source.mHandoverLaunchDisplayId = freeformDisplay.mDisplayId;
@@ -219,7 +235,28 @@
         assertEquals(RESULT_CONTINUE, mTarget.onCalculate(reusableActivity.getTask(),
                 null /* layout */, mActivity, source, null /* options */, mCurrent, mResult));
 
-        assertEquals(freeformDisplay.mDisplayId, mResult.mPreferredDisplayId);
+        assertEquals(freeformDisplay.getDefaultTaskDisplayArea(),
+                mResult.mPreferredTaskDisplayArea);
+    }
+
+    @Test
+    public void testUsesNoDisplaySourceHandoverDisplayAreaIdIfSet() {
+        final TestDisplayContent freeformDisplay = createNewDisplayContent(
+                WINDOWING_MODE_FREEFORM);
+        final TestDisplayContent fullscreenDisplay = createNewDisplayContent(
+                WINDOWING_MODE_FULLSCREEN);
+
+        mCurrent.mPreferredTaskDisplayArea = fullscreenDisplay.getDefaultTaskDisplayArea();
+        ActivityRecord reusableActivity = createSourceActivity(fullscreenDisplay);
+        ActivityRecord source = createSourceActivity(freeformDisplay);
+        source.mHandoverTaskDisplayArea = freeformDisplay.getDefaultTaskDisplayArea();
+        source.noDisplay = true;
+
+        assertEquals(RESULT_CONTINUE, mTarget.onCalculate(reusableActivity.getTask(),
+                null /* layout */, mActivity, source, null /* options */, mCurrent, mResult));
+
+        assertEquals(freeformDisplay.getDefaultTaskDisplayArea(),
+                mResult.mPreferredTaskDisplayArea);
     }
 
     // =====================================
@@ -233,7 +270,7 @@
         final ActivityOptions options = ActivityOptions.makeBasic();
         options.setLaunchBounds(new Rect(0, 0, 100, 100));
 
-        mCurrent.mPreferredDisplayId = freeformDisplay.mDisplayId;
+        mCurrent.mPreferredTaskDisplayArea = freeformDisplay.getDefaultTaskDisplayArea();
 
         assertEquals(RESULT_CONTINUE, mTarget.onCalculate(/* task */ null, /* layout */ null,
                 mActivity, /* source */ null, options, mCurrent, mResult));
@@ -247,7 +284,7 @@
         final ActivityOptions options = ActivityOptions.makeBasic();
         options.setLaunchBounds(new Rect(0, 0, 100, 100));
 
-        mCurrent.mPreferredDisplayId = DEFAULT_DISPLAY;
+        mCurrent.mPreferredTaskDisplayArea = mRootWindowContainer.getDefaultTaskDisplayArea();
 
         assertEquals(RESULT_CONTINUE, mTarget.onCalculate(/* task */ null, /* layout */ null,
                 mActivity, /* source */ null, options, mCurrent, mResult));
@@ -278,7 +315,7 @@
         final ActivityOptions options = ActivityOptions.makeBasic();
         options.setLaunchWindowingMode(WINDOWING_MODE_PINNED);
 
-        mCurrent.mPreferredDisplayId = freeformDisplay.mDisplayId;
+        mCurrent.mPreferredTaskDisplayArea = freeformDisplay.getDefaultTaskDisplayArea();
 
         assertEquals(RESULT_CONTINUE, mTarget.onCalculate(/* task */ null, /* layout */ null,
                 mActivity, /* source */ null, options, mCurrent, mResult));
@@ -296,7 +333,7 @@
         options.setLaunchWindowingMode(WINDOWING_MODE_PINNED);
         options.setLaunchBounds(new Rect(0, 0, 100, 100));
 
-        mCurrent.mPreferredDisplayId = freeformDisplay.mDisplayId;
+        mCurrent.mPreferredTaskDisplayArea = freeformDisplay.getDefaultTaskDisplayArea();
 
         assertEquals(RESULT_CONTINUE, mTarget.onCalculate(/* task */ null, /* layout */ null,
                 mActivity, /* source */ null, options, mCurrent, mResult));
@@ -310,7 +347,7 @@
         final ActivityOptions options = ActivityOptions.makeBasic();
         options.setLaunchWindowingMode(WINDOWING_MODE_FULLSCREEN);
 
-        mCurrent.mPreferredDisplayId = DEFAULT_DISPLAY;
+        mCurrent.mPreferredTaskDisplayArea = mRootWindowContainer.getDefaultTaskDisplayArea();
 
         assertEquals(RESULT_CONTINUE, mTarget.onCalculate(/* task */ null, /* layout */ null,
                 mActivity, /* source */ null, options, mCurrent, mResult));
@@ -324,7 +361,7 @@
         final TestDisplayContent freeformDisplay = createNewDisplayContent(
                 WINDOWING_MODE_FREEFORM);
 
-        mCurrent.mPreferredDisplayId = freeformDisplay.mDisplayId;
+        mCurrent.mPreferredTaskDisplayArea = freeformDisplay.getDefaultTaskDisplayArea();
 
         final ActivityInfo.WindowLayout layout = new WindowLayoutBuilder()
                 .setWidth(120).setHeight(80).build();
@@ -341,7 +378,7 @@
         final TestDisplayContent freeformDisplay = createNewDisplayContent(
                 WINDOWING_MODE_FREEFORM);
 
-        mCurrent.mPreferredDisplayId = freeformDisplay.mDisplayId;
+        mCurrent.mPreferredTaskDisplayArea = freeformDisplay.getDefaultTaskDisplayArea();
 
         final ActivityInfo.WindowLayout layout = new WindowLayoutBuilder()
                 .setGravity(Gravity.LEFT).build();
@@ -358,7 +395,7 @@
         final ActivityInfo.WindowLayout layout = new WindowLayoutBuilder()
                 .setWidth(120).setHeight(80).build();
 
-        mCurrent.mPreferredDisplayId = DEFAULT_DISPLAY;
+        mCurrent.mPreferredTaskDisplayArea = mRootWindowContainer.getDefaultTaskDisplayArea();
 
         assertEquals(RESULT_CONTINUE, mTarget.onCalculate(/* task */ null, layout, mActivity,
                 /* source */ null, /* options */ null, mCurrent, mResult));
@@ -369,7 +406,7 @@
 
     @Test
     public void testLaunchesFullscreenOnFullscreenDisplayWithFreeformHistory() {
-        mCurrent.mPreferredDisplayId = Display.INVALID_DISPLAY;
+        mCurrent.mPreferredTaskDisplayArea = null;
         mCurrent.mWindowingMode = WINDOWING_MODE_FREEFORM;
         mCurrent.mBounds.set(0, 0, 200, 100);
 
@@ -385,7 +422,7 @@
         final TestDisplayContent freeformDisplay = createNewDisplayContent(
                 WINDOWING_MODE_FREEFORM);
 
-        mCurrent.mPreferredDisplayId = freeformDisplay.mDisplayId;
+        mCurrent.mPreferredTaskDisplayArea = freeformDisplay.getDefaultTaskDisplayArea();
         mCurrent.mWindowingMode = WINDOWING_MODE_FULLSCREEN;
 
         assertEquals(RESULT_CONTINUE, mTarget.onCalculate(/* task */ null, /* layout */ null,
@@ -400,7 +437,7 @@
         final TestDisplayContent freeformDisplay = createNewDisplayContent(
                 WINDOWING_MODE_FREEFORM);
 
-        mCurrent.mPreferredDisplayId = freeformDisplay.mDisplayId;
+        mCurrent.mPreferredTaskDisplayArea = freeformDisplay.getDefaultTaskDisplayArea();
         mCurrent.mWindowingMode = WINDOWING_MODE_FREEFORM;
         mCurrent.mBounds.set(0, 0, 200, 100);
 
@@ -421,7 +458,7 @@
         options.setLaunchWindowingMode(WINDOWING_MODE_FREEFORM);
         options.setLaunchBounds(new Rect(0, 0, 200, 100));
 
-        mCurrent.mPreferredDisplayId = freeformDisplay.mDisplayId;
+        mCurrent.mPreferredTaskDisplayArea = freeformDisplay.getDefaultTaskDisplayArea();
         mCurrent.mWindowingMode = WINDOWING_MODE_FREEFORM;
         mCurrent.mBounds.set(0, 0, 200, 100);
 
@@ -446,7 +483,7 @@
         options.setLaunchWindowingMode(WINDOWING_MODE_FREEFORM);
         options.setLaunchBounds(expectedLaunchBounds);
 
-        mCurrent.mPreferredDisplayId = freeformDisplay.mDisplayId;
+        mCurrent.mPreferredTaskDisplayArea = freeformDisplay.getDefaultTaskDisplayArea();
         mCurrent.mWindowingMode = WINDOWING_MODE_FREEFORM;
         mCurrent.mBounds.set(expectedLaunchBounds);
 
@@ -467,7 +504,7 @@
         options.setLaunchWindowingMode(WINDOWING_MODE_FREEFORM);
         options.setLaunchBounds(new Rect(0, 0, 200, 100));
 
-        mCurrent.mPreferredDisplayId = DEFAULT_DISPLAY;
+        mCurrent.mPreferredTaskDisplayArea = mRootWindowContainer.getDefaultTaskDisplayArea();
         mCurrent.mWindowingMode = WINDOWING_MODE_FREEFORM;
         mCurrent.mBounds.set(0, 0, 200, 100);
 
@@ -568,7 +605,7 @@
         final Rect expected = new Rect(0, 0, 100, 100);
         options.setLaunchBounds(expected);
 
-        mCurrent.mPreferredDisplayId = freeformDisplay.mDisplayId;
+        mCurrent.mPreferredTaskDisplayArea = freeformDisplay.getDefaultTaskDisplayArea();
 
         assertEquals(RESULT_CONTINUE, mTarget.onCalculate(/* task */ null, /* layout */ null,
                 mActivity, /* source */ null, options, mCurrent, mResult));
@@ -598,7 +635,7 @@
         final TestDisplayContent freeformDisplay = createNewDisplayContent(
                 WINDOWING_MODE_FREEFORM);
 
-        mCurrent.mPreferredDisplayId = freeformDisplay.mDisplayId;
+        mCurrent.mPreferredTaskDisplayArea = freeformDisplay.getDefaultTaskDisplayArea();
 
         final ActivityInfo.WindowLayout layout = new WindowLayoutBuilder()
                 .setGravity(Gravity.LEFT).build();
@@ -614,7 +651,7 @@
         final TestDisplayContent freeformDisplay = createNewDisplayContent(
                 WINDOWING_MODE_FREEFORM);
 
-        mCurrent.mPreferredDisplayId = freeformDisplay.mDisplayId;
+        mCurrent.mPreferredTaskDisplayArea = freeformDisplay.getDefaultTaskDisplayArea();
 
         final ActivityInfo.WindowLayout layout = new WindowLayoutBuilder()
                 .setGravity(Gravity.TOP).build();
@@ -630,7 +667,7 @@
         final TestDisplayContent freeformDisplay = createNewDisplayContent(
                 WINDOWING_MODE_FREEFORM);
 
-        mCurrent.mPreferredDisplayId = freeformDisplay.mDisplayId;
+        mCurrent.mPreferredTaskDisplayArea = freeformDisplay.getDefaultTaskDisplayArea();
 
         final ActivityInfo.WindowLayout layout = new WindowLayoutBuilder()
                 .setGravity(Gravity.TOP | Gravity.LEFT).build();
@@ -647,7 +684,7 @@
         final TestDisplayContent freeformDisplay = createNewDisplayContent(
                 WINDOWING_MODE_FREEFORM);
 
-        mCurrent.mPreferredDisplayId = freeformDisplay.mDisplayId;
+        mCurrent.mPreferredTaskDisplayArea = freeformDisplay.getDefaultTaskDisplayArea();
 
         final ActivityInfo.WindowLayout layout = new WindowLayoutBuilder()
                 .setGravity(Gravity.RIGHT).build();
@@ -663,7 +700,7 @@
         final TestDisplayContent freeformDisplay = createNewDisplayContent(
                 WINDOWING_MODE_FREEFORM);
 
-        mCurrent.mPreferredDisplayId = freeformDisplay.mDisplayId;
+        mCurrent.mPreferredTaskDisplayArea = freeformDisplay.getDefaultTaskDisplayArea();
 
         final ActivityInfo.WindowLayout layout = new WindowLayoutBuilder()
                 .setGravity(Gravity.BOTTOM).build();
@@ -679,7 +716,7 @@
         final TestDisplayContent freeformDisplay = createNewDisplayContent(
                 WINDOWING_MODE_FREEFORM);
 
-        mCurrent.mPreferredDisplayId = freeformDisplay.mDisplayId;
+        mCurrent.mPreferredTaskDisplayArea = freeformDisplay.getDefaultTaskDisplayArea();
 
         final ActivityInfo.WindowLayout layout = new WindowLayoutBuilder()
                 .setGravity(Gravity.BOTTOM | Gravity.RIGHT).build();
@@ -696,7 +733,7 @@
         final TestDisplayContent freeformDisplay = createNewDisplayContent(
                 WINDOWING_MODE_FREEFORM);
 
-        mCurrent.mPreferredDisplayId = freeformDisplay.mDisplayId;
+        mCurrent.mPreferredTaskDisplayArea = freeformDisplay.getDefaultTaskDisplayArea();
 
         final ActivityInfo.WindowLayout layout = new WindowLayoutBuilder()
                 .setWidth(120).setHeight(80).build();
@@ -712,7 +749,7 @@
         final TestDisplayContent freeformDisplay = createNewDisplayContent(
                 WINDOWING_MODE_FREEFORM);
 
-        mCurrent.mPreferredDisplayId = freeformDisplay.mDisplayId;
+        mCurrent.mPreferredTaskDisplayArea = freeformDisplay.getDefaultTaskDisplayArea();
 
         final ActivityInfo.WindowLayout layout = new WindowLayoutBuilder()
                 .setWidth(120).setHeight(80).setGravity(Gravity.LEFT).build();
@@ -728,7 +765,7 @@
         final TestDisplayContent freeformDisplay = createNewDisplayContent(
                 WINDOWING_MODE_FREEFORM);
 
-        mCurrent.mPreferredDisplayId = freeformDisplay.mDisplayId;
+        mCurrent.mPreferredTaskDisplayArea = freeformDisplay.getDefaultTaskDisplayArea();
 
         final ActivityInfo.WindowLayout layout = new WindowLayoutBuilder()
                 .setWidth(120).setHeight(80).setGravity(Gravity.TOP).build();
@@ -744,7 +781,7 @@
         final TestDisplayContent freeformDisplay = createNewDisplayContent(
                 WINDOWING_MODE_FREEFORM);
 
-        mCurrent.mPreferredDisplayId = freeformDisplay.mDisplayId;
+        mCurrent.mPreferredTaskDisplayArea = freeformDisplay.getDefaultTaskDisplayArea();
 
         final ActivityInfo.WindowLayout layout = new WindowLayoutBuilder()
                 .setWidth(120).setHeight(80).setGravity(Gravity.TOP | Gravity.LEFT).build();
@@ -760,7 +797,7 @@
         final TestDisplayContent freeformDisplay = createNewDisplayContent(
                 WINDOWING_MODE_FREEFORM);
 
-        mCurrent.mPreferredDisplayId = freeformDisplay.mDisplayId;
+        mCurrent.mPreferredTaskDisplayArea = freeformDisplay.getDefaultTaskDisplayArea();
 
         final ActivityInfo.WindowLayout layout = new WindowLayoutBuilder()
                 .setWidth(120).setHeight(80).setGravity(Gravity.RIGHT).build();
@@ -776,7 +813,7 @@
         final TestDisplayContent freeformDisplay = createNewDisplayContent(
                 WINDOWING_MODE_FREEFORM);
 
-        mCurrent.mPreferredDisplayId = freeformDisplay.mDisplayId;
+        mCurrent.mPreferredTaskDisplayArea = freeformDisplay.getDefaultTaskDisplayArea();
 
         final ActivityInfo.WindowLayout layout = new WindowLayoutBuilder()
                 .setWidth(120).setHeight(80).setGravity(Gravity.BOTTOM).build();
@@ -792,7 +829,7 @@
         final TestDisplayContent freeformDisplay = createNewDisplayContent(
                 WINDOWING_MODE_FREEFORM);
 
-        mCurrent.mPreferredDisplayId = freeformDisplay.mDisplayId;
+        mCurrent.mPreferredTaskDisplayArea = freeformDisplay.getDefaultTaskDisplayArea();
 
         final ActivityInfo.WindowLayout layout = new WindowLayoutBuilder()
                 .setWidth(120).setHeight(80).setGravity(Gravity.BOTTOM | Gravity.RIGHT).build();
@@ -808,7 +845,7 @@
         final TestDisplayContent freeformDisplay = createNewDisplayContent(
                 WINDOWING_MODE_FREEFORM);
 
-        mCurrent.mPreferredDisplayId = freeformDisplay.mDisplayId;
+        mCurrent.mPreferredTaskDisplayArea = freeformDisplay.getDefaultTaskDisplayArea();
 
         final ActivityInfo.WindowLayout layout = new WindowLayoutBuilder()
                 .setWidthFraction(0.125f).setHeightFraction(0.1f).build();
@@ -824,7 +861,7 @@
         final TestDisplayContent freeformDisplay = createNewDisplayContent(
                 WINDOWING_MODE_FREEFORM);
 
-        mCurrent.mPreferredDisplayId = freeformDisplay.mDisplayId;
+        mCurrent.mPreferredTaskDisplayArea = freeformDisplay.getDefaultTaskDisplayArea();
         mCurrent.mWindowingMode = WINDOWING_MODE_FREEFORM;
         mCurrent.mBounds.set(0, 0, 200, 100);
 
@@ -839,7 +876,7 @@
         final TestDisplayContent freeformDisplay = createNewDisplayContent(
                 WINDOWING_MODE_FREEFORM);
 
-        mCurrent.mPreferredDisplayId = freeformDisplay.mDisplayId;
+        mCurrent.mPreferredTaskDisplayArea = freeformDisplay.getDefaultTaskDisplayArea();
         mCurrent.mWindowingMode = WINDOWING_MODE_FULLSCREEN;
         mCurrent.mBounds.set(0, 0, 200, 100);
 
@@ -1217,7 +1254,7 @@
 
     @Test
     public void returnsNonFullscreenBoundsOnFullscreenDisplayWithFreeformHistory() {
-        mCurrent.mPreferredDisplayId = Display.INVALID_DISPLAY;
+        mCurrent.mPreferredTaskDisplayArea = null;
         mCurrent.mWindowingMode = WINDOWING_MODE_FREEFORM;
         mCurrent.mBounds.set(0, 0, 200, 100);
 
@@ -1233,7 +1270,7 @@
         final TestDisplayContent freeformDisplay = createNewDisplayContent(
                 WINDOWING_MODE_FREEFORM);
 
-        mCurrent.mPreferredDisplayId = Display.INVALID_DISPLAY;
+        mCurrent.mPreferredTaskDisplayArea = null;
         mCurrent.mWindowingMode = WINDOWING_MODE_FREEFORM;
         mCurrent.mBounds.set(-100, -200, 200, 100);
 
@@ -1253,7 +1290,7 @@
 
         addFreeformTaskTo(freeformDisplay, new Rect(0, 0, 200, 100));
 
-        mCurrent.mPreferredDisplayId = freeformDisplay.mDisplayId;
+        mCurrent.mPreferredTaskDisplayArea = freeformDisplay.getDefaultTaskDisplayArea();
         mCurrent.mWindowingMode = WINDOWING_MODE_FREEFORM;
         mCurrent.mBounds.set(0, 0, 200, 100);
 
@@ -1284,13 +1321,14 @@
     public void testNoMultiDisplaySupports() {
         final boolean orgValue = mService.mSupportsMultiDisplay;
         final TestDisplayContent display = createNewDisplayContent(WINDOWING_MODE_FULLSCREEN);
-        mCurrent.mPreferredDisplayId = display.mDisplayId;
+        mCurrent.mPreferredTaskDisplayArea = display.getDefaultTaskDisplayArea();
 
         try {
             mService.mSupportsMultiDisplay = false;
             assertEquals(RESULT_CONTINUE, mTarget.onCalculate(/* task */ null, /* layout */ null,
                     mActivity, /* source */ null, /* options */ null, mCurrent, mResult));
-            assertEquals(DEFAULT_DISPLAY, mResult.mPreferredDisplayId);
+            assertEquals(mRootWindowContainer.getDefaultTaskDisplayArea(),
+                    mResult.mPreferredTaskDisplayArea);
         } finally {
             mService.mSupportsMultiDisplay = orgValue;
         }
diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskOrganizerTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskOrganizerTests.java
deleted file mode 100644
index e41d4dc..0000000
--- a/services/tests/wmtests/src/com/android/server/wm/TaskOrganizerTests.java
+++ /dev/null
@@ -1,928 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.wm;
-
-import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
-import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
-import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED;
-import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
-import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
-import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW;
-import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
-import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
-import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECONDARY;
-import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
-import static android.content.res.Configuration.SCREEN_HEIGHT_DP_UNDEFINED;
-import static android.content.res.Configuration.SCREEN_WIDTH_DP_UNDEFINED;
-import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION;
-
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.doNothing;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.never;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.reset;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.times;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.when;
-import static com.android.server.wm.WindowContainer.POSITION_TOP;
-
-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 static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyBoolean;
-import static org.mockito.ArgumentMatchers.anyInt;
-
-import android.app.ActivityManager;
-import android.app.ActivityManager.RunningTaskInfo;
-import android.app.ActivityManager.StackInfo;
-import android.app.IRequestFinishCallback;
-import android.app.PictureInPictureParams;
-import android.content.pm.ActivityInfo;
-import android.content.res.Configuration;
-import android.graphics.Rect;
-import android.os.Binder;
-import android.os.IBinder;
-import android.os.RemoteException;
-import android.platform.test.annotations.Presubmit;
-import android.util.ArrayMap;
-import android.util.Rational;
-import android.view.Display;
-import android.window.ITaskOrganizer;
-import android.window.WindowContainerTransaction;
-
-import androidx.test.filters.SmallTest;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Test class for {@link ITaskOrganizer} and {@link android.window.ITaskOrganizerController}.
- *
- * Build/Install/Run:
- *  atest WmTests:TaskOrganizerTests
- */
-@SmallTest
-@Presubmit
-@RunWith(WindowTestRunner.class)
-public class TaskOrganizerTests extends WindowTestsBase {
-    private ITaskOrganizer registerMockOrganizer(int windowingMode) {
-        final ITaskOrganizer organizer = mock(ITaskOrganizer.class);
-        when(organizer.asBinder()).thenReturn(new Binder());
-
-        mWm.mAtmService.mTaskOrganizerController.registerTaskOrganizer(
-                organizer, windowingMode);
-
-        return organizer;
-    }
-
-    private ITaskOrganizer registerMockOrganizer() {
-        return registerMockOrganizer(WINDOWING_MODE_MULTI_WINDOW);
-    }
-
-    Task createTask(ActivityStack stack, boolean fakeDraw) {
-        final Task task = createTaskInStack(stack, 0);
-
-        if (fakeDraw) {
-            task.setHasBeenVisible(true);
-        }
-        return task;
-    }
-
-    Task createTask(ActivityStack stack) {
-        // Fake draw notifications for most of our tests.
-        return createTask(stack, true);
-    }
-
-    ActivityStack createStack() {
-        return createTaskStackOnDisplay(mDisplayContent);
-    }
-
-    @Before
-    public void setUp() {
-        // We defer callbacks since we need to adjust task surface visibility, but for these tests,
-        // just run the callbacks synchronously
-        mWm.mAtmService.mTaskOrganizerController.setDeferTaskOrgCallbacksConsumer((r) -> r.run());
-    }
-
-    @Test
-    public void testAppearVanish() throws RemoteException {
-        final ActivityStack stack = createStack();
-        final Task task = createTask(stack);
-        final ITaskOrganizer organizer = registerMockOrganizer();
-
-        task.setTaskOrganizer(organizer);
-        verify(organizer).onTaskAppeared(any());
-
-        task.removeImmediately();
-        verify(organizer).onTaskVanished(any());
-    }
-
-    @Test
-    public void testAppearWaitsForVisibility() throws RemoteException {
-        final ActivityStack stack = createStack();
-        final Task task = createTask(stack, false);
-        final ITaskOrganizer organizer = registerMockOrganizer();
-
-        task.setTaskOrganizer(organizer);
-
-        verify(organizer, never()).onTaskAppeared(any());
-        task.setHasBeenVisible(true);
-        assertTrue(stack.getHasBeenVisible());
-
-        verify(organizer).onTaskAppeared(any());
-
-        task.removeImmediately();
-        verify(organizer).onTaskVanished(any());
-    }
-
-    @Test
-    public void testNoVanishedIfNoAppear() throws RemoteException {
-        final ActivityStack stack = createStack();
-        final Task task = createTask(stack, false /* hasBeenVisible */);
-        final ITaskOrganizer organizer = registerMockOrganizer();
-
-        // In this test we skip making the Task visible, and verify
-        // that even though a TaskOrganizer is set remove doesn't emit
-        // a vanish callback, because we never emitted appear.
-        task.setTaskOrganizer(organizer);
-        verify(organizer, never()).onTaskAppeared(any());
-        task.removeImmediately();
-        verify(organizer, never()).onTaskVanished(any());
-    }
-
-    @Test
-    public void testSwapOrganizer() throws RemoteException {
-        final ActivityStack stack = createStack();
-        final Task task = createTask(stack);
-        final ITaskOrganizer organizer = registerMockOrganizer(WINDOWING_MODE_MULTI_WINDOW);
-        final ITaskOrganizer organizer2 = registerMockOrganizer(WINDOWING_MODE_PINNED);
-
-        task.setTaskOrganizer(organizer);
-        verify(organizer).onTaskAppeared(any());
-        task.setTaskOrganizer(organizer2);
-        verify(organizer).onTaskVanished(any());
-        verify(organizer2).onTaskAppeared(any());
-    }
-
-    @Test
-    public void testSwapWindowingModes() throws RemoteException {
-        final ActivityStack stack = createStack();
-        final Task task = createTask(stack);
-        final ITaskOrganizer organizer = registerMockOrganizer(WINDOWING_MODE_MULTI_WINDOW);
-        final ITaskOrganizer organizer2 = registerMockOrganizer(WINDOWING_MODE_PINNED);
-
-        stack.setWindowingMode(WINDOWING_MODE_MULTI_WINDOW);
-        verify(organizer).onTaskAppeared(any());
-        stack.setWindowingMode(WINDOWING_MODE_PINNED);
-        verify(organizer).onTaskVanished(any());
-        verify(organizer2).onTaskAppeared(any());
-    }
-
-    @Test
-    public void testTaskNoDraw() throws RemoteException {
-        final ActivityStack stack = createStack();
-        final Task task = createTask(stack, false /* fakeDraw */);
-        final ITaskOrganizer organizer = registerMockOrganizer();
-
-        stack.setWindowingMode(WINDOWING_MODE_MULTI_WINDOW);
-        verify(organizer, never()).onTaskAppeared(any());
-        assertTrue(stack.isOrganized());
-
-        mWm.mAtmService.mTaskOrganizerController.unregisterTaskOrganizer(organizer);
-        verify(organizer, never()).onTaskVanished(any());
-        assertFalse(stack.isOrganized());
-    }
-
-    @Test
-    public void testClearOrganizer() throws RemoteException {
-        final ActivityStack stack = createStack();
-        final Task task = createTask(stack);
-        final ITaskOrganizer organizer = registerMockOrganizer();
-
-        stack.setTaskOrganizer(organizer);
-        verify(organizer).onTaskAppeared(any());
-        assertTrue(stack.isOrganized());
-
-        stack.setTaskOrganizer(null);
-        verify(organizer).onTaskVanished(any());
-        assertFalse(stack.isOrganized());
-    }
-
-    @Test
-    public void testUnregisterOrganizer() throws RemoteException {
-        final ActivityStack stack = createStack();
-        final Task task = createTask(stack);
-        final ITaskOrganizer organizer = registerMockOrganizer();
-
-        stack.setWindowingMode(WINDOWING_MODE_MULTI_WINDOW);
-        verify(organizer).onTaskAppeared(any());
-        assertTrue(stack.isOrganized());
-
-        mWm.mAtmService.mTaskOrganizerController.unregisterTaskOrganizer(organizer);
-        verify(organizer).onTaskVanished(any());
-        assertFalse(stack.isOrganized());
-    }
-
-    @Test
-    public void testUnregisterOrganizerReturnsRegistrationToPrevious() throws RemoteException {
-        final ActivityStack stack = createStack();
-        final Task task = createTask(stack);
-        final ActivityStack stack2 = createStack();
-        final Task task2 = createTask(stack2);
-        final ActivityStack stack3 = createStack();
-        final Task task3 = createTask(stack3);
-        final ITaskOrganizer organizer = registerMockOrganizer(WINDOWING_MODE_MULTI_WINDOW);
-
-        // First organizer is registered, verify a task appears when changing windowing mode
-        stack.setWindowingMode(WINDOWING_MODE_MULTI_WINDOW);
-        verify(organizer, times(1)).onTaskAppeared(any());
-        assertTrue(stack.isOrganized());
-
-        // Now we replace the registration and1 verify the new organizer receives tasks
-        // newly entering the windowing mode.
-        final ITaskOrganizer organizer2 = registerMockOrganizer(WINDOWING_MODE_MULTI_WINDOW);
-        stack2.setWindowingMode(WINDOWING_MODE_MULTI_WINDOW);
-        verify(organizer2).onTaskAppeared(any());
-        assertTrue(stack2.isOrganized());
-
-        // Now we unregister the second one, the first one should automatically be reregistered
-        // so we verify that it's now seeing changes.
-        mWm.mAtmService.mTaskOrganizerController.unregisterTaskOrganizer(organizer2);
-
-        stack3.setWindowingMode(WINDOWING_MODE_MULTI_WINDOW);
-        verify(organizer, times(2)).onTaskAppeared(any());
-        assertTrue(stack3.isOrganized());
-    }
-
-    @Test
-    public void testRegisterTaskOrganizerStackWindowingModeChanges() throws RemoteException {
-        final ITaskOrganizer organizer = registerMockOrganizer(WINDOWING_MODE_PINNED);
-
-        final ActivityStack stack = createStack();
-        final Task task = createTask(stack);
-        final Task task2 = createTask(stack);
-        stack.setWindowingMode(WINDOWING_MODE_PINNED);
-        verify(organizer, times(1)).onTaskAppeared(any());
-
-        stack.setWindowingMode(WINDOWING_MODE_FULLSCREEN);
-        verify(organizer, times(1)).onTaskVanished(any());
-    }
-
-    @Test
-    public void testRegisterTaskOrganizerWithExistingTasks() throws RemoteException {
-        final ActivityStack stack = createStack();
-        final Task task = createTask(stack);
-        stack.setWindowingMode(WINDOWING_MODE_PINNED);
-
-        final ITaskOrganizer organizer = registerMockOrganizer(WINDOWING_MODE_PINNED);
-        verify(organizer, times(1)).onTaskAppeared(any());
-    }
-
-    @Test
-    public void testTaskTransaction() {
-        removeGlobalMinSizeRestriction();
-        final ActivityStack stack = new ActivityTestsBase.StackBuilder(mWm.mRoot)
-                .setWindowingMode(WINDOWING_MODE_FREEFORM).build();
-        final Task task = stack.getTopMostTask();
-        WindowContainerTransaction t = new WindowContainerTransaction();
-        Rect newBounds = new Rect(10, 10, 100, 100);
-        t.setBounds(task.mRemoteToken.toWindowContainerToken(), new Rect(10, 10, 100, 100));
-        mWm.mAtmService.mWindowOrganizerController.applyTransaction(t);
-        assertEquals(newBounds, task.getBounds());
-    }
-
-    @Test
-    public void testStackTransaction() {
-        removeGlobalMinSizeRestriction();
-        final ActivityStack stack = new ActivityTestsBase.StackBuilder(mWm.mRoot)
-                .setWindowingMode(WINDOWING_MODE_FREEFORM).build();
-        StackInfo info =
-                mWm.mAtmService.getStackInfo(WINDOWING_MODE_FREEFORM, ACTIVITY_TYPE_STANDARD);
-        WindowContainerTransaction t = new WindowContainerTransaction();
-        assertEquals(stack.mRemoteToken.toWindowContainerToken(), info.stackToken);
-        Rect newBounds = new Rect(10, 10, 100, 100);
-        t.setBounds(info.stackToken, new Rect(10, 10, 100, 100));
-        mWm.mAtmService.mWindowOrganizerController.applyTransaction(t);
-        assertEquals(newBounds, stack.getBounds());
-    }
-
-    @Test
-    public void testSetWindowingMode() {
-        final ActivityStack stack = new ActivityTestsBase.StackBuilder(mWm.mRoot)
-            .setWindowingMode(WINDOWING_MODE_FREEFORM).build();
-        final WindowContainerTransaction t = new WindowContainerTransaction();
-
-        t.setWindowingMode(stack.mRemoteToken.toWindowContainerToken(), WINDOWING_MODE_FULLSCREEN);
-        mWm.mAtmService.mWindowOrganizerController.applyTransaction(t);
-
-        assertEquals(WINDOWING_MODE_FULLSCREEN, stack.getWindowingMode());
-    }
-
-    @Test
-    public void testSetActivityWindowingMode() {
-        final ActivityRecord record = makePipableActivity();
-        final ActivityStack stack = record.getStack();
-        final WindowContainerTransaction t = new WindowContainerTransaction();
-
-        t.setWindowingMode(stack.mRemoteToken.toWindowContainerToken(), WINDOWING_MODE_PINNED);
-        t.setActivityWindowingMode(
-                stack.mRemoteToken.toWindowContainerToken(), WINDOWING_MODE_FULLSCREEN);
-        mWm.mAtmService.mWindowOrganizerController.applyTransaction(t);
-
-        assertEquals(WINDOWING_MODE_FULLSCREEN, record.getWindowingMode());
-        assertEquals(WINDOWING_MODE_PINNED, stack.getWindowingMode());
-    }
-
-    @Test
-    public void testContainerFocusableChanges() {
-        removeGlobalMinSizeRestriction();
-        final ActivityStack stack = new ActivityTestsBase.StackBuilder(mWm.mRoot)
-                .setWindowingMode(WINDOWING_MODE_FREEFORM).build();
-        final Task task = stack.getTopMostTask();
-        WindowContainerTransaction t = new WindowContainerTransaction();
-        assertTrue(task.isFocusable());
-        t.setFocusable(stack.mRemoteToken.toWindowContainerToken(), false);
-        mWm.mAtmService.mWindowOrganizerController.applyTransaction(t);
-        assertFalse(task.isFocusable());
-        t.setFocusable(stack.mRemoteToken.toWindowContainerToken(), true);
-        mWm.mAtmService.mWindowOrganizerController.applyTransaction(t);
-        assertTrue(task.isFocusable());
-    }
-
-    @Test
-    public void testContainerHiddenChanges() {
-        removeGlobalMinSizeRestriction();
-        final ActivityStack stack = new ActivityTestsBase.StackBuilder(mWm.mRoot)
-                .setWindowingMode(WINDOWING_MODE_FREEFORM).build();
-        WindowContainerTransaction t = new WindowContainerTransaction();
-        assertTrue(stack.shouldBeVisible(null));
-        t.setHidden(stack.mRemoteToken.toWindowContainerToken(), true);
-        mWm.mAtmService.mWindowOrganizerController.applyTransaction(t);
-        assertFalse(stack.shouldBeVisible(null));
-        t.setHidden(stack.mRemoteToken.toWindowContainerToken(), false);
-        mWm.mAtmService.mWindowOrganizerController.applyTransaction(t);
-        assertTrue(stack.shouldBeVisible(null));
-    }
-
-    @Test
-    public void testOverrideConfigSize() {
-        removeGlobalMinSizeRestriction();
-        final ActivityStack stack = new ActivityTestsBase.StackBuilder(mWm.mRoot)
-                .setWindowingMode(WINDOWING_MODE_FREEFORM).build();
-        final Task task = stack.getTopMostTask();
-        WindowContainerTransaction t = new WindowContainerTransaction();
-        t.setBounds(task.mRemoteToken.toWindowContainerToken(), new Rect(10, 10, 100, 100));
-        mWm.mAtmService.mWindowOrganizerController.applyTransaction(t);
-        final int origScreenWDp = task.getConfiguration().screenHeightDp;
-        final int origScreenHDp = task.getConfiguration().screenHeightDp;
-        t = new WindowContainerTransaction();
-        // verify that setting config overrides on parent restricts children.
-        t.setScreenSizeDp(stack.mRemoteToken.toWindowContainerToken(), origScreenWDp, origScreenHDp);
-        t.setBounds(task.mRemoteToken.toWindowContainerToken(), new Rect(10, 10, 150, 200));
-        mWm.mAtmService.mWindowOrganizerController.applyTransaction(t);
-        assertEquals(origScreenHDp, task.getConfiguration().screenHeightDp);
-        t = new WindowContainerTransaction();
-        t.setScreenSizeDp(stack.mRemoteToken.toWindowContainerToken(), SCREEN_WIDTH_DP_UNDEFINED,
-                SCREEN_HEIGHT_DP_UNDEFINED);
-        mWm.mAtmService.mWindowOrganizerController.applyTransaction(t);
-        assertNotEquals(origScreenHDp, task.getConfiguration().screenHeightDp);
-    }
-
-    @Test
-    public void testCreateDeleteRootTasks() {
-        RunningTaskInfo info1 = mWm.mAtmService.mTaskOrganizerController.createRootTask(
-                Display.DEFAULT_DISPLAY,
-                WINDOWING_MODE_SPLIT_SCREEN_PRIMARY);
-        assertEquals(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY,
-                info1.configuration.windowConfiguration.getWindowingMode());
-        assertEquals(ACTIVITY_TYPE_UNDEFINED, info1.topActivityType);
-
-        RunningTaskInfo info2 = mWm.mAtmService.mTaskOrganizerController.createRootTask(
-                Display.DEFAULT_DISPLAY,
-                WINDOWING_MODE_SPLIT_SCREEN_SECONDARY);
-        assertEquals(WINDOWING_MODE_SPLIT_SCREEN_SECONDARY,
-                info2.configuration.windowConfiguration.getWindowingMode());
-        assertEquals(ACTIVITY_TYPE_UNDEFINED, info2.topActivityType);
-
-        DisplayContent dc = mWm.mRoot.getDisplayContent(Display.DEFAULT_DISPLAY);
-        List<Task> infos = getTasksCreatedByOrganizer(dc);
-        assertEquals(2, infos.size());
-
-        assertTrue(mWm.mAtmService.mTaskOrganizerController.deleteRootTask(info1.token));
-        infos = getTasksCreatedByOrganizer(dc);
-        assertEquals(1, infos.size());
-        assertEquals(WINDOWING_MODE_SPLIT_SCREEN_SECONDARY, infos.get(0).getWindowingMode());
-    }
-
-    @Test
-    public void testTileAddRemoveChild() {
-        ITaskOrganizer listener = new ITaskOrganizer.Stub() {
-            @Override
-            public void onTaskAppeared(RunningTaskInfo taskInfo) { }
-
-            @Override
-            public void onTaskVanished(RunningTaskInfo container) { }
-
-            @Override
-            public void onTaskInfoChanged(RunningTaskInfo info) throws RemoteException {
-            }
-
-            @Override
-            public void onBackPressedOnTaskRoot(RunningTaskInfo taskInfo) {
-            }
-        };
-        mWm.mAtmService.mTaskOrganizerController.registerTaskOrganizer(listener,
-                WINDOWING_MODE_SPLIT_SCREEN_SECONDARY);
-        RunningTaskInfo info1 = mWm.mAtmService.mTaskOrganizerController.createRootTask(
-                mDisplayContent.mDisplayId, WINDOWING_MODE_SPLIT_SCREEN_SECONDARY);
-
-        final ActivityStack stack = createTaskStackOnDisplay(
-                WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_STANDARD, mDisplayContent);
-        assertEquals(mDisplayContent.getWindowingMode(), stack.getWindowingMode());
-        WindowContainerTransaction wct = new WindowContainerTransaction();
-        wct.reparent(stack.mRemoteToken.toWindowContainerToken(), info1.token, true /* onTop */);
-        mWm.mAtmService.mWindowOrganizerController.applyTransaction(wct);
-        assertEquals(info1.configuration.windowConfiguration.getWindowingMode(),
-                stack.getWindowingMode());
-
-        // Info should reflect new membership
-        List<Task> infos = getTasksCreatedByOrganizer(mDisplayContent);
-        info1 = infos.get(0).getTaskInfo();
-        assertEquals(ACTIVITY_TYPE_STANDARD, info1.topActivityType);
-
-        // Children inherit configuration
-        Rect newSize = new Rect(10, 10, 300, 300);
-        Task task1 = WindowContainer.fromBinder(info1.token.asBinder()).asTask();
-        Configuration c = new Configuration(task1.getRequestedOverrideConfiguration());
-        c.windowConfiguration.setBounds(newSize);
-        doNothing().when(stack).adjustForMinimalTaskDimensions(any(), any());
-        task1.onRequestedOverrideConfigurationChanged(c);
-        assertEquals(newSize, stack.getBounds());
-
-        wct = new WindowContainerTransaction();
-        wct.reparent(stack.mRemoteToken.toWindowContainerToken(), null, true /* onTop */);
-        mWm.mAtmService.mWindowOrganizerController.applyTransaction(wct);
-        assertEquals(mDisplayContent.getWindowingMode(), stack.getWindowingMode());
-        infos = getTasksCreatedByOrganizer(mDisplayContent);
-        info1 = infos.get(0).getTaskInfo();
-        assertEquals(ACTIVITY_TYPE_UNDEFINED, info1.topActivityType);
-    }
-
-    @Test
-    public void testTaskInfoCallback() {
-        final ArrayList<RunningTaskInfo> lastReportedTiles = new ArrayList<>();
-        final boolean[] called = {false};
-        ITaskOrganizer listener = new ITaskOrganizer.Stub() {
-            @Override
-            public void onTaskAppeared(RunningTaskInfo taskInfo) { }
-
-            @Override
-            public void onTaskVanished(RunningTaskInfo container) { }
-
-            @Override
-            public void onTaskInfoChanged(RunningTaskInfo info) throws RemoteException {
-                lastReportedTiles.add(info);
-                called[0] = true;
-            }
-
-            @Override
-            public void onBackPressedOnTaskRoot(RunningTaskInfo taskInfo) {
-            }
-        };
-        mWm.mAtmService.mTaskOrganizerController.registerTaskOrganizer(listener,
-                WINDOWING_MODE_SPLIT_SCREEN_SECONDARY);
-        RunningTaskInfo info1 = mWm.mAtmService.mTaskOrganizerController.createRootTask(
-                mDisplayContent.mDisplayId, WINDOWING_MODE_SPLIT_SCREEN_SECONDARY);
-        lastReportedTiles.clear();
-        called[0] = false;
-
-        final ActivityStack stack = createTaskStackOnDisplay(
-                WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_STANDARD, mDisplayContent);
-        Task task1 = WindowContainer.fromBinder(info1.token.asBinder()).asTask();
-        WindowContainerTransaction wct = new WindowContainerTransaction();
-        wct.reparent(stack.mRemoteToken.toWindowContainerToken(), info1.token, true /* onTop */);
-        mWm.mAtmService.mWindowOrganizerController.applyTransaction(wct);
-        assertTrue(called[0]);
-        assertEquals(ACTIVITY_TYPE_STANDARD, lastReportedTiles.get(0).topActivityType);
-
-        lastReportedTiles.clear();
-        called[0] = false;
-        final ActivityStack stack2 = createTaskStackOnDisplay(
-                WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_HOME, mDisplayContent);
-        wct = new WindowContainerTransaction();
-        wct.reparent(stack2.mRemoteToken.toWindowContainerToken(), info1.token, true /* onTop */);
-        mWm.mAtmService.mWindowOrganizerController.applyTransaction(wct);
-        assertTrue(called[0]);
-        assertEquals(ACTIVITY_TYPE_HOME, lastReportedTiles.get(0).topActivityType);
-
-        lastReportedTiles.clear();
-        called[0] = false;
-        task1.positionChildAt(POSITION_TOP, stack, false /* includingParents */);
-        assertTrue(called[0]);
-        assertEquals(ACTIVITY_TYPE_STANDARD, lastReportedTiles.get(0).topActivityType);
-
-        lastReportedTiles.clear();
-        called[0] = false;
-        wct = new WindowContainerTransaction();
-        wct.reparent(stack.mRemoteToken.toWindowContainerToken(), null, true /* onTop */);
-        wct.reparent(stack2.mRemoteToken.toWindowContainerToken(), null, true /* onTop */);
-        mWm.mAtmService.mWindowOrganizerController.applyTransaction(wct);
-        assertTrue(called[0]);
-        assertEquals(ACTIVITY_TYPE_UNDEFINED, lastReportedTiles.get(0).topActivityType);
-    }
-
-    @Test
-    public void testHierarchyTransaction() {
-        final ArrayMap<IBinder, RunningTaskInfo> lastReportedTiles = new ArrayMap<>();
-        ITaskOrganizer listener = new ITaskOrganizer.Stub() {
-            @Override
-            public void onTaskAppeared(RunningTaskInfo taskInfo) { }
-
-            @Override
-            public void onTaskVanished(RunningTaskInfo container) { }
-
-            @Override
-            public void onTaskInfoChanged(RunningTaskInfo info) {
-                lastReportedTiles.put(info.token.asBinder(), info);
-            }
-
-            @Override
-            public void onBackPressedOnTaskRoot(RunningTaskInfo taskInfo) {
-            }
-        };
-        mWm.mAtmService.mTaskOrganizerController.registerTaskOrganizer(
-                listener, WINDOWING_MODE_SPLIT_SCREEN_PRIMARY);
-        mWm.mAtmService.mTaskOrganizerController.registerTaskOrganizer(
-                listener, WINDOWING_MODE_SPLIT_SCREEN_SECONDARY);
-        RunningTaskInfo info1 = mWm.mAtmService.mTaskOrganizerController.createRootTask(
-                mDisplayContent.mDisplayId, WINDOWING_MODE_SPLIT_SCREEN_PRIMARY);
-        RunningTaskInfo info2 = mWm.mAtmService.mTaskOrganizerController.createRootTask(
-                mDisplayContent.mDisplayId, WINDOWING_MODE_SPLIT_SCREEN_SECONDARY);
-
-        final int initialRootTaskCount = mWm.mAtmService.mTaskOrganizerController.getRootTasks(
-                mDisplayContent.mDisplayId, null /* activityTypes */).size();
-
-        final ActivityStack stack = createTaskStackOnDisplay(
-                WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_STANDARD, mDisplayContent);
-        final ActivityStack stack2 = createTaskStackOnDisplay(
-                WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_HOME, mDisplayContent);
-
-        // Check getRootTasks works
-        List<RunningTaskInfo> roots = mWm.mAtmService.mTaskOrganizerController.getRootTasks(
-                mDisplayContent.mDisplayId, null /* activityTypes */);
-        assertEquals(initialRootTaskCount + 2, roots.size());
-
-        lastReportedTiles.clear();
-        WindowContainerTransaction wct = new WindowContainerTransaction();
-        wct.reparent(stack.mRemoteToken.toWindowContainerToken(), info1.token, true /* onTop */);
-        wct.reparent(stack2.mRemoteToken.toWindowContainerToken(), info2.token, true /* onTop */);
-        mWm.mAtmService.mWindowOrganizerController.applyTransaction(wct);
-        assertFalse(lastReportedTiles.isEmpty());
-        assertEquals(ACTIVITY_TYPE_STANDARD,
-                lastReportedTiles.get(info1.token.asBinder()).topActivityType);
-        assertEquals(ACTIVITY_TYPE_HOME,
-                lastReportedTiles.get(info2.token.asBinder()).topActivityType);
-
-        lastReportedTiles.clear();
-        wct = new WindowContainerTransaction();
-        wct.reparent(stack2.mRemoteToken.toWindowContainerToken(), info1.token, false /* onTop */);
-        mWm.mAtmService.mWindowOrganizerController.applyTransaction(wct);
-        assertFalse(lastReportedTiles.isEmpty());
-        // Standard should still be on top of tile 1, so no change there
-        assertFalse(lastReportedTiles.containsKey(info1.token.asBinder()));
-        // But tile 2 has no children, so should become undefined
-        assertEquals(ACTIVITY_TYPE_UNDEFINED,
-                lastReportedTiles.get(info2.token.asBinder()).topActivityType);
-
-        // Check the getChildren call
-        List<RunningTaskInfo> children =
-                mWm.mAtmService.mTaskOrganizerController.getChildTasks(info1.token,
-                        null /* activityTypes */);
-        assertEquals(2, children.size());
-        children = mWm.mAtmService.mTaskOrganizerController.getChildTasks(info2.token,
-                null /* activityTypes */);
-        assertEquals(0, children.size());
-
-        // Check that getRootTasks doesn't include children of tiles
-        roots = mWm.mAtmService.mTaskOrganizerController.getRootTasks(mDisplayContent.mDisplayId,
-                null /* activityTypes */);
-        assertEquals(initialRootTaskCount, roots.size());
-
-        lastReportedTiles.clear();
-        wct = new WindowContainerTransaction();
-        wct.reorder(stack2.mRemoteToken.toWindowContainerToken(), true /* onTop */);
-        mWm.mAtmService.mWindowOrganizerController.applyTransaction(wct);
-        // Home should now be on top. No change occurs in second tile, so not reported
-        assertEquals(1, lastReportedTiles.size());
-        assertEquals(ACTIVITY_TYPE_HOME,
-                lastReportedTiles.get(info1.token.asBinder()).topActivityType);
-    }
-
-    private List<Task> getTasksCreatedByOrganizer(DisplayContent dc) {
-        ArrayList<Task> out = new ArrayList<>();
-        for (int tdaNdx = dc.getTaskDisplayAreaCount() - 1; tdaNdx >= 0; --tdaNdx) {
-            final TaskDisplayArea taskDisplayArea = dc.getTaskDisplayAreaAt(tdaNdx);
-            for (int sNdx = taskDisplayArea.getStackCount() - 1; sNdx >= 0; --sNdx) {
-                final Task t = taskDisplayArea.getStackAt(sNdx);
-                if (t.mCreatedByOrganizer) out.add(t);
-            }
-        }
-        return out;
-    }
-
-    @Test
-    public void testTrivialBLASTCallback() throws RemoteException {
-        final ActivityStack stackController1 = createStack();
-        final Task task = createTask(stackController1);
-        final ITaskOrganizer organizer = registerMockOrganizer();
-
-        spyOn(task);
-        doReturn(true).when(task).isVisible();
-
-        BLASTSyncEngine bse = new BLASTSyncEngine();
-
-        BLASTSyncEngine.TransactionReadyListener transactionListener =
-            mock(BLASTSyncEngine.TransactionReadyListener.class);
-
-        int id = bse.startSyncSet(transactionListener);
-        bse.addToSyncSet(id, task);
-        bse.setReady(id);
-        // Since this task has no windows the sync is trivial and completes immediately.
-        verify(transactionListener)
-            .onTransactionReady(anyInt(), any());
-    }
-
-    @Test
-    public void testOverlappingBLASTCallback() throws RemoteException {
-        final ActivityStack stackController1 = createStack();
-        final Task task = createTask(stackController1);
-        final ITaskOrganizer organizer = registerMockOrganizer();
-
-        spyOn(task);
-        doReturn(true).when(task).isVisible();
-        final WindowState w = createAppWindow(task, TYPE_APPLICATION, "Enlightened Window");
-        makeWindowVisible(w);
-
-        BLASTSyncEngine bse = new BLASTSyncEngine();
-
-        BLASTSyncEngine.TransactionReadyListener transactionListener =
-            mock(BLASTSyncEngine.TransactionReadyListener.class);
-
-        int id = bse.startSyncSet(transactionListener);
-        assertEquals(true, bse.addToSyncSet(id, task));
-        bse.setReady(id);
-
-        int id2 = bse.startSyncSet(transactionListener);
-        // We should be rejected from the second sync since we are already
-        // in one.
-        assertEquals(false, bse.addToSyncSet(id2, task));
-        w.finishDrawing(null);
-        assertEquals(true, bse.addToSyncSet(id2, task));
-        bse.setReady(id2);
-    }
-
-    @Test
-    public void testBLASTCallbackWithWindow() {
-        final ActivityStack stackController1 = createStack();
-        final Task task = createTask(stackController1);
-        final ITaskOrganizer organizer = registerMockOrganizer();
-        final WindowState w = createAppWindow(task, TYPE_APPLICATION, "Enlightened Window");
-        makeWindowVisible(w);
-
-        BLASTSyncEngine bse = new BLASTSyncEngine();
-
-        BLASTSyncEngine.TransactionReadyListener transactionListener =
-            mock(BLASTSyncEngine.TransactionReadyListener.class);
-
-        int id = bse.startSyncSet(transactionListener);
-        bse.addToSyncSet(id, task);
-        bse.setReady(id);
-        // Since we have a window we have to wait for it to draw to finish sync.
-        verify(transactionListener, never())
-            .onTransactionReady(anyInt(), any());
-        w.finishDrawing(null);
-        verify(transactionListener)
-            .onTransactionReady(anyInt(), any());
-    }
-
-    @Test
-    public void testBLASTCallbackWithInvisibleWindow() {
-        final ActivityStack stackController1 = createStack();
-        final Task task = createTask(stackController1);
-        final ITaskOrganizer organizer = registerMockOrganizer();
-        final WindowState w = createAppWindow(task, TYPE_APPLICATION, "Enlightened Window");
-
-        BLASTSyncEngine bse = new BLASTSyncEngine();
-
-        BLASTSyncEngine.TransactionReadyListener transactionListener =
-            mock(BLASTSyncEngine.TransactionReadyListener.class);
-
-        int id = bse.startSyncSet(transactionListener);
-        bse.addToSyncSet(id, task);
-        bse.setReady(id);
-
-        // Since the window was invisible, the Task had no visible leaves and the sync should
-        // complete as soon as we call setReady.
-        verify(transactionListener)
-            .onTransactionReady(anyInt(), any());
-    }
-
-    @Test
-    public void testBLASTCallbackWithChildWindow() {
-        final ActivityStack stackController1 = createStack();
-        final Task task = createTask(stackController1);
-        final ITaskOrganizer organizer = registerMockOrganizer();
-        final WindowState w = createAppWindow(task, TYPE_APPLICATION, "Enlightened Window");
-        final WindowState child = createWindow(w, TYPE_APPLICATION, "Other Window");
-
-        w.mActivityRecord.setVisible(true);
-        makeWindowVisible(w, child);
-
-        BLASTSyncEngine bse = new BLASTSyncEngine();
-
-        BLASTSyncEngine.TransactionReadyListener transactionListener =
-            mock(BLASTSyncEngine.TransactionReadyListener.class);
-
-        int id = bse.startSyncSet(transactionListener);
-        assertEquals(true, bse.addToSyncSet(id, task));
-        bse.setReady(id);
-        w.finishDrawing(null);
-
-        // Since we have a child window we still shouldn't be done.
-        verify(transactionListener, never())
-            .onTransactionReady(anyInt(), any());
-        reset(transactionListener);
-
-        child.finishDrawing(null);
-        // Ah finally! Done
-        verify(transactionListener)
-                .onTransactionReady(anyInt(), any());
-    }
-
-    class StubOrganizer extends ITaskOrganizer.Stub {
-        RunningTaskInfo mInfo;
-
-        @Override
-        public void onTaskAppeared(RunningTaskInfo info) {
-            mInfo = info;
-        }
-        @Override
-        public void onTaskVanished(RunningTaskInfo info) {
-        }
-        @Override
-        public void onTaskInfoChanged(RunningTaskInfo info) {
-        }
-        @Override
-        public void onBackPressedOnTaskRoot(RunningTaskInfo taskInfo) {
-        }
-    };
-
-    private ActivityRecord makePipableActivity() {
-        final ActivityRecord record = createActivityRecord(mDisplayContent,
-                WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD);
-        record.info.flags |= ActivityInfo.FLAG_SUPPORTS_PICTURE_IN_PICTURE;
-        spyOn(record);
-        doReturn(true).when(record).checkEnterPictureInPictureState(any(), anyBoolean());
-
-        record.getRootTask().setHasBeenVisible(true);
-        return record;
-    }
-
-    @Test
-    public void testEnterPipParams() {
-        final StubOrganizer o = new StubOrganizer();
-        mWm.mAtmService.mTaskOrganizerController.registerTaskOrganizer(o, WINDOWING_MODE_PINNED);
-        final ActivityRecord record = makePipableActivity();
-
-        final PictureInPictureParams p =
-            new PictureInPictureParams.Builder().setAspectRatio(new Rational(1, 2)).build();
-        assertTrue(mWm.mAtmService.enterPictureInPictureMode(record.token, p));
-        waitUntilHandlersIdle();
-        assertNotNull(o.mInfo);
-        assertNotNull(o.mInfo.pictureInPictureParams);
-    }
-
-    @Test
-    public void testChangePipParams() {
-        class ChangeSavingOrganizer extends StubOrganizer {
-            RunningTaskInfo mChangedInfo;
-            @Override
-            public void onTaskInfoChanged(RunningTaskInfo info) {
-                mChangedInfo = info;
-            }
-        }
-        ChangeSavingOrganizer o = new ChangeSavingOrganizer();
-        mWm.mAtmService.mTaskOrganizerController.registerTaskOrganizer(o, WINDOWING_MODE_PINNED);
-
-        final ActivityRecord record = makePipableActivity();
-        final PictureInPictureParams p =
-            new PictureInPictureParams.Builder().setAspectRatio(new Rational(1, 2)).build();
-        assertTrue(mWm.mAtmService.enterPictureInPictureMode(record.token, p));
-        waitUntilHandlersIdle();
-        assertNotNull(o.mInfo);
-        assertNotNull(o.mInfo.pictureInPictureParams);
-
-        final PictureInPictureParams p2 =
-            new PictureInPictureParams.Builder().setAspectRatio(new Rational(3, 4)).build();
-        mWm.mAtmService.setPictureInPictureParams(record.token, p2);
-        waitUntilHandlersIdle();
-        assertNotNull(o.mChangedInfo);
-        assertNotNull(o.mChangedInfo.pictureInPictureParams);
-        final Rational ratio = o.mChangedInfo.pictureInPictureParams.getAspectRatioRational();
-        assertEquals(3, ratio.getNumerator());
-        assertEquals(4, ratio.getDenominator());
-    }
-
-    @Test
-    public void testChangeTaskDescription() {
-        class ChangeSavingOrganizer extends StubOrganizer {
-            RunningTaskInfo mChangedInfo;
-            @Override
-            public void onTaskInfoChanged(RunningTaskInfo info) {
-                mChangedInfo = info;
-            }
-        }
-        ChangeSavingOrganizer o = new ChangeSavingOrganizer();
-        mWm.mAtmService.mTaskOrganizerController.registerTaskOrganizer(o,
-                WINDOWING_MODE_MULTI_WINDOW);
-
-        final ActivityStack stack = createStack();
-        final Task task = createTask(stack);
-        final ActivityRecord record = WindowTestUtils.createActivityRecordInTask(
-                stack.mDisplayContent, task);
-
-        stack.setWindowingMode(WINDOWING_MODE_MULTI_WINDOW);
-        record.setTaskDescription(new ActivityManager.TaskDescription("TestDescription"));
-        waitUntilHandlersIdle();
-        assertEquals("TestDescription", o.mChangedInfo.taskDescription.getLabel());
-    }
-
-    @Test
-    public void testPreventDuplicateAppear() throws RemoteException {
-        final ActivityStack stack = createStack();
-        final Task task = createTask(stack);
-        final ITaskOrganizer organizer = registerMockOrganizer();
-
-        task.setTaskOrganizer(organizer);
-        // setHasBeenVisible was already called once by the set-up code.
-        task.setHasBeenVisible(true);
-        verify(organizer, times(1)).onTaskAppeared(any());
-
-        task.taskOrganizerUnregistered();
-        task.setTaskOrganizer(organizer);
-        verify(organizer, times(2)).onTaskAppeared(any());
-
-        task.removeImmediately();
-        verify(organizer).onTaskVanished(any());
-    }
-
-    @Test
-    public void testInterceptBackPressedOnTaskRoot() throws RemoteException {
-        final ActivityStack stack = createStack();
-        final Task task = createTask(stack);
-        final ActivityRecord activity = WindowTestUtils.createActivityRecordInTask(
-                stack.mDisplayContent, task);
-        final ITaskOrganizer organizer = registerMockOrganizer(WINDOWING_MODE_MULTI_WINDOW);
-
-        // Setup the task to be controlled by the MW mode organizer
-        stack.setWindowingMode(WINDOWING_MODE_MULTI_WINDOW);
-        assertTrue(stack.isOrganized());
-
-        // Verify a back pressed does not call the organizer
-        mWm.mAtmService.onBackPressedOnTaskRoot(activity.token,
-                new IRequestFinishCallback.Default());
-        verify(organizer, never()).onBackPressedOnTaskRoot(any());
-
-        // Enable intercepting back
-        mWm.mAtmService.mTaskOrganizerController.setInterceptBackPressedOnTaskRoot(organizer,
-                true);
-
-        // Verify now that the back press does call the organizer
-        mWm.mAtmService.onBackPressedOnTaskRoot(activity.token,
-                new IRequestFinishCallback.Default());
-        verify(organizer, times(1)).onBackPressedOnTaskRoot(any());
-    }
-}
diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskRecordTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskRecordTests.java
index 519ac78..60875de 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TaskRecordTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TaskRecordTests.java
@@ -54,10 +54,7 @@
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.same;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
 
 import android.app.ActivityManager;
 import android.app.TaskInfo;
@@ -75,12 +72,10 @@
 import android.util.Xml;
 import android.view.DisplayInfo;
 
-import androidx.test.filters.FlakyTest;
 import androidx.test.filters.MediumTest;
 
 import com.android.internal.app.IVoiceInteractor;
 import com.android.server.wm.Task.TaskFactory;
-import com.android.server.wm.utils.WmDisplayCutout;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -368,49 +363,65 @@
 
     @Test
     public void testComputeConfigResourceOverrides() {
-        final Task task = new TaskBuilder(mSupervisor).build();
+        final Rect fullScreenBounds = new Rect(0, 0, 1080, 1920);
+        TestDisplayContent display = new TestDisplayContent.Builder(
+                mService, fullScreenBounds.width(), fullScreenBounds.height()).build();
+        final Task task = new TaskBuilder(mSupervisor).setDisplay(display).build();
         final Configuration inOutConfig = new Configuration();
         final Configuration parentConfig = new Configuration();
         final int longSide = 1200;
         final int shortSide = 600;
+        final Rect parentBounds = new Rect(0, 0, 250, 500);
+        final Rect parentAppBounds = new Rect(0, 0, 250, 480);
+        parentConfig.windowConfiguration.setBounds(parentBounds);
+        parentConfig.windowConfiguration.setAppBounds(parentAppBounds);
         parentConfig.densityDpi = 400;
-        parentConfig.screenHeightDp = 200; // 200 * 400 / 160 = 500px
-        parentConfig.screenWidthDp = 100; // 100 * 400 / 160 = 250px
+        parentConfig.screenHeightDp = (parentBounds.bottom * 160) / parentConfig.densityDpi; // 200
+        parentConfig.screenWidthDp = (parentBounds.right * 160) / parentConfig.densityDpi; // 100
         parentConfig.windowConfiguration.setRotation(ROTATION_0);
 
-        // Portrait bounds.
-        inOutConfig.windowConfiguration.getBounds().set(0, 0, shortSide, longSide);
-        // By default, the parent bounds should limit the existing input bounds.
+        // By default, the input bounds will fill parent.
         task.computeConfigResourceOverrides(inOutConfig, parentConfig);
 
         assertEquals(parentConfig.screenHeightDp, inOutConfig.screenHeightDp);
         assertEquals(parentConfig.screenWidthDp, inOutConfig.screenWidthDp);
+        assertEquals(parentAppBounds, inOutConfig.windowConfiguration.getAppBounds());
         assertEquals(Configuration.ORIENTATION_PORTRAIT, inOutConfig.orientation);
 
+        // If bounds are overridden, config properties should be made to match. Surface hierarchy
+        // will crop for policy.
+        inOutConfig.setToDefaults();
+        final Rect largerPortraitBounds = new Rect(0, 0, shortSide, longSide);
+        inOutConfig.windowConfiguration.setBounds(largerPortraitBounds);
+        task.computeConfigResourceOverrides(inOutConfig, parentConfig);
+        // The override bounds are beyond the parent, the out appBounds should not be intersected
+        // by parent appBounds.
+        assertEquals(largerPortraitBounds, inOutConfig.windowConfiguration.getAppBounds());
+        assertEquals(longSide, inOutConfig.screenHeightDp * parentConfig.densityDpi / 160);
+        assertEquals(shortSide, inOutConfig.screenWidthDp * parentConfig.densityDpi / 160);
+
         inOutConfig.setToDefaults();
         // Landscape bounds.
-        inOutConfig.windowConfiguration.getBounds().set(0, 0, longSide, shortSide);
+        final Rect largerLandscapeBounds = new Rect(0, 0, longSide, shortSide);
+        inOutConfig.windowConfiguration.setBounds(largerLandscapeBounds);
 
         // Setup the display with a top stable inset. The later assertion will ensure the inset is
         // excluded from screenHeightDp.
         final int statusBarHeight = 100;
-        final DisplayContent displayContent = task.mDisplayContent;
-        final DisplayPolicy policy = mock(DisplayPolicy.class);
+        final DisplayPolicy policy = display.getDisplayPolicy();
         doAnswer(invocationOnMock -> {
             final Rect insets = invocationOnMock.<Rect>getArgument(0);
             insets.top = statusBarHeight;
             return null;
         }).when(policy).convertNonDecorInsetsToStableInsets(any(), eq(ROTATION_0));
-        doReturn(policy).when(displayContent).getDisplayPolicy();
-        doReturn(mock(WmDisplayCutout.class)).when(displayContent)
-                .calculateDisplayCutoutForRotation(anyInt());
 
         // Without limiting to be inside the parent bounds, the out screen size should keep relative
         // to the input bounds.
         final ActivityRecord.CompatDisplayInsets compatIntsets =
-                new ActivityRecord.CompatDisplayInsets(displayContent, task);
+                new ActivityRecord.CompatDisplayInsets(display, task);
         task.computeConfigResourceOverrides(inOutConfig, parentConfig, compatIntsets);
 
+        assertEquals(largerLandscapeBounds, inOutConfig.windowConfiguration.getAppBounds());
         assertEquals((shortSide - statusBarHeight) * DENSITY_DEFAULT / parentConfig.densityDpi,
                 inOutConfig.screenHeightDp);
         assertEquals(longSide * DENSITY_DEFAULT / parentConfig.densityDpi,
@@ -454,7 +465,6 @@
         parentConfig.screenWidthDp = 100; // 100 * 400 / 160 = 250px
         parentConfig.windowConfiguration.setRotation(ROTATION_0);
 
-        final float density = 2.5f; // densityDpi / DENSITY_DEFAULT_SCALE = 400 / 160.0f
         final int longSideDp = 480; // longSide / density = 1200 / 400 * 160
         final int shortSideDp = 240; // shortSide / density = 600 / 400 * 160
         final int screenLayout = parentConfig.screenLayout
@@ -463,31 +473,38 @@
                 Configuration.reduceScreenLayout(screenLayout, longSideDp, shortSideDp);
 
         // Portrait bounds overlapping with navigation bar, without insets.
-        inOutConfig.windowConfiguration.getBounds().set(0,
+        final Rect freeformBounds = new Rect(0,
                 displayHeight - 10 - longSide,
                 shortSide,
                 displayHeight - 10);
+        inOutConfig.windowConfiguration.setBounds(freeformBounds);
         // Set to freeform mode to verify bug fix.
         inOutConfig.windowConfiguration.setWindowingMode(WINDOWING_MODE_FREEFORM);
 
         task.computeConfigResourceOverrides(inOutConfig, parentConfig);
 
-        assertEquals(parentConfig.screenWidthDp, inOutConfig.screenWidthDp);
-        assertEquals(parentConfig.screenHeightDp, inOutConfig.screenHeightDp);
+        // screenW/H should not be effected by parent since overridden and freeform
+        assertEquals(freeformBounds.width() * 160 / parentConfig.densityDpi,
+                inOutConfig.screenWidthDp);
+        assertEquals(freeformBounds.height() * 160 / parentConfig.densityDpi,
+                inOutConfig.screenHeightDp);
         assertEquals(reducedScreenLayout, inOutConfig.screenLayout);
 
         inOutConfig.setToDefaults();
         // Landscape bounds overlapping with navigtion bar, without insets.
-        inOutConfig.windowConfiguration.getBounds().set(0,
+        freeformBounds.set(0,
                 displayHeight - 10 - shortSide,
                 longSide,
                 displayHeight - 10);
+        inOutConfig.windowConfiguration.setBounds(freeformBounds);
         inOutConfig.windowConfiguration.setWindowingMode(WINDOWING_MODE_FREEFORM);
 
         task.computeConfigResourceOverrides(inOutConfig, parentConfig);
 
-        assertEquals(parentConfig.screenWidthDp, inOutConfig.screenWidthDp);
-        assertEquals(parentConfig.screenHeightDp, inOutConfig.screenHeightDp);
+        assertEquals(freeformBounds.width() * 160 / parentConfig.densityDpi,
+                inOutConfig.screenWidthDp);
+        assertEquals(freeformBounds.height() * 160 / parentConfig.densityDpi,
+                inOutConfig.screenHeightDp);
         assertEquals(reducedScreenLayout, inOutConfig.screenLayout);
     }
 
diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotSurfaceTest.java b/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotSurfaceTest.java
index 67d4016..4907bdc 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotSurfaceTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotSurfaceTest.java
@@ -181,11 +181,17 @@
     }
 
     @Test
+    public void testCalculateSnapshotCrop_waterfall() {
+        setupSurface(100, 100, new Rect(5, 10, 5, 10), 0, 0, new Rect(0, 0, 100, 100));
+        assertEquals(new Rect(5, 0, 95, 90), mSurface.calculateSnapshotCrop());
+    }
+
+    @Test
     public void testCalculateSnapshotFrame() {
         setupSurface(100, 100);
         final Rect insets = new Rect(0, 10, 0, 10);
         mSurface.setFrames(new Rect(0, 0, 100, 100), insets, insets);
-        assertEquals(new Rect(0, -10, 100, 70),
+        assertEquals(new Rect(0, 0, 100, 80),
                 mSurface.calculateSnapshotFrame(new Rect(0, 10, 100, 90)));
     }
 
@@ -194,11 +200,20 @@
         setupSurface(100, 100);
         final Rect insets = new Rect(10, 10, 0, 0);
         mSurface.setFrames(new Rect(0, 0, 100, 100), insets, insets);
-        assertEquals(new Rect(0, -10, 90, 80),
+        assertEquals(new Rect(10, 0, 100, 90),
                 mSurface.calculateSnapshotFrame(new Rect(10, 10, 100, 100)));
     }
 
     @Test
+    public void testCalculateSnapshotFrame_waterfall() {
+        setupSurface(100, 100, new Rect(5, 10, 5, 10), 0, 0, new Rect(0, 0, 100, 100));
+        final Rect insets = new Rect(0, 10, 0, 10);
+        mSurface.setFrames(new Rect(5, 0, 95, 100), insets, insets);
+        assertEquals(new Rect(0, 0, 90, 90),
+                mSurface.calculateSnapshotFrame(new Rect(5, 0, 95, 90)));
+    }
+
+    @Test
     public void testDrawStatusBarBackground() {
         setupSurface(100, 100);
         final Rect insets = new Rect(0, 10, 10, 0);
diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskStackTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskStackTests.java
index 413ae13..f354a04 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TaskStackTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TaskStackTests.java
@@ -186,7 +186,7 @@
         final ActivityStack stack = createTaskStackOnDisplay(mDisplayContent);
         final int stackOutset = 10;
         spyOn(stack);
-        doReturn(stackOutset).when(stack).getStackOutset();
+        doReturn(stackOutset).when(stack).getTaskOutset();
         doReturn(true).when(stack).inMultiWindowMode();
 
         // Mock the resolved override windowing mode to non-fullscreen
@@ -208,4 +208,22 @@
         assertEquals(stackBounds.left - stackOutset, stack.getLastSurfacePosition().x);
         assertEquals(stackBounds.top - stackOutset, stack.getLastSurfacePosition().y);
     }
+
+    @Test
+    public void testActivityAndTaskGetsProperType() {
+        final ActivityStack stack = createTaskStackOnDisplay(mDisplayContent);
+        final Task task1 = createTaskInStack(stack, 0 /* userId */);
+        ActivityRecord activity1 = WindowTestUtils.createTestActivityRecord(mDisplayContent);
+
+        // First activity should become standard
+        task1.addChild(activity1, 0);
+        assertEquals(WindowConfiguration.ACTIVITY_TYPE_STANDARD, activity1.getActivityType());
+        assertEquals(WindowConfiguration.ACTIVITY_TYPE_STANDARD, task1.getActivityType());
+
+        // Second activity should also become standard
+        ActivityRecord activity2 = WindowTestUtils.createTestActivityRecord(mDisplayContent);
+        task1.addChild(activity2, WindowContainer.POSITION_TOP);
+        assertEquals(WindowConfiguration.ACTIVITY_TYPE_STANDARD, activity2.getActivityType());
+        assertEquals(WindowConfiguration.ACTIVITY_TYPE_STANDARD, task1.getActivityType());
+    }
 }
diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskTests.java
index ec77be8..473c1c5 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TaskTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TaskTests.java
@@ -145,9 +145,5 @@
         Rect bounds = new Rect(10, 10, 100, 200);
         task.setBounds(bounds);
         assertEquals(new Point(bounds.left, bounds.top), task.getLastSurfacePosition());
-
-        Rect dispBounds = new Rect(20, 30, 110, 220);
-        task.setOverrideDisplayedBounds(dispBounds);
-        assertEquals(new Point(dispBounds.left, dispBounds.top), task.getLastSurfacePosition());
     }
 }
diff --git a/services/tests/wmtests/src/com/android/server/wm/TestIWindow.java b/services/tests/wmtests/src/com/android/server/wm/TestIWindow.java
index 91c3c27..e39b4bc 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TestIWindow.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TestIWindow.java
@@ -24,6 +24,7 @@
 import android.util.MergedConfiguration;
 import android.view.DisplayCutout;
 import android.view.DragEvent;
+import android.view.IScrollCaptureController;
 import android.view.IWindow;
 import android.view.InsetsSourceControl;
 import android.view.InsetsState;
@@ -113,6 +114,10 @@
     }
 
     @Override
+    public void requestScrollCapture(IScrollCaptureController controller) throws RemoteException {
+    }
+
+    @Override
     public void showInsets(int types, boolean fromIme) throws RemoteException {
     }
 
diff --git a/services/tests/wmtests/src/com/android/server/wm/WallpaperControllerTests.java b/services/tests/wmtests/src/com/android/server/wm/WallpaperControllerTests.java
index a4f1487..520ac19 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WallpaperControllerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WallpaperControllerTests.java
@@ -16,6 +16,9 @@
 
 package com.android.server.wm;
 
+import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
+import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
+import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
 import static android.view.WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS;
 import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
 import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION;
@@ -251,6 +254,22 @@
         assertEquals(otherWindowInitialZoom, wallpaperWindow.mWallpaperZoomOut, .01f);
     }
 
+    /**
+     * Tests that the windowing mode of the wallpaper window must always be fullscreen.
+     */
+    @Test
+    public void testWallpaperTokenWindowingMode() {
+        final DisplayContent dc = mWm.mRoot.getDefaultDisplay();
+        final WallpaperWindowToken token = new WallpaperWindowToken(mWm, mock(IBinder.class),
+                true, dc, true /* ownerCanManageAppTokens */);
+
+        // The wallpaper should have requested override fullscreen windowing mode, so the
+        // configuration (windowing mode) propagation from display won't change it.
+        dc.setWindowingMode(WINDOWING_MODE_FREEFORM);
+        assertEquals(WINDOWING_MODE_FULLSCREEN, token.getWindowingMode());
+        dc.setWindowingMode(WINDOWING_MODE_UNDEFINED);
+        assertEquals(WINDOWING_MODE_FULLSCREEN, token.getWindowingMode());
+    }
 
     private WindowState createWallpaperTargetWindow(DisplayContent dc) {
         final ActivityRecord homeActivity = new ActivityTestsBase.ActivityBuilder(mWm.mAtmService)
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowFrameTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowFrameTests.java
index 7be05a3..eb2aa41 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowFrameTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowFrameTests.java
@@ -310,27 +310,6 @@
         assertContentFrame(w, new Rect(resolvedTaskBounds.left, resolvedTaskBounds.top,
                 resolvedTaskBounds.right - contentInsetRight,
                 resolvedTaskBounds.bottom - contentInsetBottom));
-
-        pf.set(0, 0, logicalWidth, logicalHeight);
-        // If we set displayed bounds, the insets will be computed with the main task bounds
-        // but the frame will be positioned according to the displayed bounds.
-        final int insetLeft = logicalWidth / 5;
-        final int insetTop = logicalHeight / 5;
-        final int insetRight = insetLeft + (resolvedTaskBounds.right - resolvedTaskBounds.left);
-        final int insetBottom = insetTop + (resolvedTaskBounds.bottom - resolvedTaskBounds.top);
-        task.setOverrideDisplayedBounds(resolvedTaskBounds);
-        task.setBounds(insetLeft, insetTop, insetRight, insetBottom);
-        windowFrames.setFrames(pf, pf, cf, cf, pf, cf);
-        w.computeFrameLw();
-        assertEquals(resolvedTaskBounds, w.getFrameLw());
-        assertEquals(0, w.getRelativeFrameLw().left);
-        assertEquals(0, w.getRelativeFrameLw().top);
-        contentInsetRight = insetRight - cfRight;
-        contentInsetBottom = insetBottom - cfBottom;
-        assertContentInset(w, 0, 0, contentInsetRight, contentInsetBottom);
-        assertContentFrame(w, new Rect(resolvedTaskBounds.left, resolvedTaskBounds.top,
-                resolvedTaskBounds.right - contentInsetRight,
-                resolvedTaskBounds.bottom - contentInsetBottom));
     }
 
     @Test
@@ -460,33 +439,6 @@
     }
 
     @Test
-    @FlakyTest(bugId = 130388666)
-    public void testDisplayCutout_tempDisplayedBounds() {
-        // Regular fullscreen task and window
-        WindowState w = createWindow();
-        final Task task = w.getTask();
-        task.setBounds(new Rect(0, 0, 1000, 2000));
-        task.setOverrideDisplayedBounds(new Rect(0, -500, 1000, 1500));
-        w.mAttrs.gravity = Gravity.LEFT | Gravity.TOP;
-
-        final Rect pf = new Rect(0, -500, 1000, 1500);
-        // Create a display cutout of size 50x50, aligned top-center
-        final WmDisplayCutout cutout = WmDisplayCutout.computeSafeInsets(
-                fromBoundingRect(500, 0, 550, 50, BOUNDS_POSITION_TOP),
-                pf.width(), pf.height());
-
-        final WindowFrames windowFrames = w.getWindowFrames();
-        windowFrames.setFrames(pf, pf, pf, pf, pf, pf);
-        windowFrames.setDisplayCutout(cutout);
-        w.computeFrameLw();
-
-        assertEquals(w.getWmDisplayCutout().getDisplayCutout().getSafeInsetTop(), 50);
-        assertEquals(w.getWmDisplayCutout().getDisplayCutout().getSafeInsetBottom(), 0);
-        assertEquals(w.getWmDisplayCutout().getDisplayCutout().getSafeInsetLeft(), 0);
-        assertEquals(w.getWmDisplayCutout().getDisplayCutout().getSafeInsetRight(), 0);
-    }
-
-    @Test
     public void testFreeformContentInsets() {
         removeGlobalMinSizeRestriction();
         // fullscreen task doesn't use bounds for computeFrame
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java
new file mode 100644
index 0000000..7d2e880
--- /dev/null
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java
@@ -0,0 +1,947 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.wm;
+
+import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
+import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
+import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED;
+import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
+import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
+import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW;
+import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
+import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
+import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECONDARY;
+import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
+import static android.content.res.Configuration.SCREEN_HEIGHT_DP_UNDEFINED;
+import static android.content.res.Configuration.SCREEN_WIDTH_DP_UNDEFINED;
+import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION;
+
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.doNothing;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.never;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.reset;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.times;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.when;
+import static com.android.server.wm.DisplayArea.Type.ABOVE_TASKS;
+import static com.android.server.wm.WindowContainer.POSITION_TOP;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.anyInt;
+
+import android.app.ActivityManager;
+import android.app.ActivityManager.RunningTaskInfo;
+import android.app.ActivityManager.StackInfo;
+import android.app.IRequestFinishCallback;
+import android.app.PictureInPictureParams;
+import android.content.pm.ActivityInfo;
+import android.content.res.Configuration;
+import android.graphics.Rect;
+import android.os.Binder;
+import android.os.IBinder;
+import android.os.RemoteException;
+import android.platform.test.annotations.Presubmit;
+import android.util.ArrayMap;
+import android.util.Rational;
+import android.view.Display;
+import android.window.ITaskOrganizer;
+import android.window.WindowContainerTransaction;
+
+import androidx.test.filters.SmallTest;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Test class for {@link ITaskOrganizer} and {@link android.window.ITaskOrganizerController}.
+ *
+ * Build/Install/Run:
+ *  atest WmTests:WindowOrganizerTests
+ */
+@SmallTest
+@Presubmit
+@RunWith(WindowTestRunner.class)
+public class WindowOrganizerTests extends WindowTestsBase {
+    private ITaskOrganizer registerMockOrganizer(int windowingMode) {
+        final ITaskOrganizer organizer = mock(ITaskOrganizer.class);
+        when(organizer.asBinder()).thenReturn(new Binder());
+
+        mWm.mAtmService.mTaskOrganizerController.registerTaskOrganizer(
+                organizer, windowingMode);
+
+        return organizer;
+    }
+
+    private ITaskOrganizer registerMockOrganizer() {
+        return registerMockOrganizer(WINDOWING_MODE_MULTI_WINDOW);
+    }
+
+    Task createTask(ActivityStack stack, boolean fakeDraw) {
+        final Task task = createTaskInStack(stack, 0);
+
+        if (fakeDraw) {
+            task.setHasBeenVisible(true);
+        }
+        return task;
+    }
+
+    Task createTask(ActivityStack stack) {
+        // Fake draw notifications for most of our tests.
+        return createTask(stack, true);
+    }
+
+    ActivityStack createStack() {
+        return createTaskStackOnDisplay(mDisplayContent);
+    }
+
+    @Before
+    public void setUp() {
+        // We defer callbacks since we need to adjust task surface visibility, but for these tests,
+        // just run the callbacks synchronously
+        mWm.mAtmService.mTaskOrganizerController.setDeferTaskOrgCallbacksConsumer((r) -> r.run());
+    }
+
+    @Test
+    public void testAppearVanish() throws RemoteException {
+        final ActivityStack stack = createStack();
+        final Task task = createTask(stack);
+        final ITaskOrganizer organizer = registerMockOrganizer();
+
+        task.setTaskOrganizer(organizer);
+        verify(organizer).onTaskAppeared(any());
+
+        task.removeImmediately();
+        verify(organizer).onTaskVanished(any());
+    }
+
+    @Test
+    public void testAppearWaitsForVisibility() throws RemoteException {
+        final ActivityStack stack = createStack();
+        final Task task = createTask(stack, false);
+        final ITaskOrganizer organizer = registerMockOrganizer();
+
+        task.setTaskOrganizer(organizer);
+
+        verify(organizer, never()).onTaskAppeared(any());
+        task.setHasBeenVisible(true);
+        assertTrue(stack.getHasBeenVisible());
+
+        verify(organizer).onTaskAppeared(any());
+
+        task.removeImmediately();
+        verify(organizer).onTaskVanished(any());
+    }
+
+    @Test
+    public void testNoVanishedIfNoAppear() throws RemoteException {
+        final ActivityStack stack = createStack();
+        final Task task = createTask(stack, false /* hasBeenVisible */);
+        final ITaskOrganizer organizer = registerMockOrganizer();
+
+        // In this test we skip making the Task visible, and verify
+        // that even though a TaskOrganizer is set remove doesn't emit
+        // a vanish callback, because we never emitted appear.
+        task.setTaskOrganizer(organizer);
+        verify(organizer, never()).onTaskAppeared(any());
+        task.removeImmediately();
+        verify(organizer, never()).onTaskVanished(any());
+    }
+
+    @Test
+    public void testSwapOrganizer() throws RemoteException {
+        final ActivityStack stack = createStack();
+        final Task task = createTask(stack);
+        final ITaskOrganizer organizer = registerMockOrganizer(WINDOWING_MODE_MULTI_WINDOW);
+        final ITaskOrganizer organizer2 = registerMockOrganizer(WINDOWING_MODE_PINNED);
+
+        task.setTaskOrganizer(organizer);
+        verify(organizer).onTaskAppeared(any());
+        task.setTaskOrganizer(organizer2);
+        verify(organizer).onTaskVanished(any());
+        verify(organizer2).onTaskAppeared(any());
+    }
+
+    @Test
+    public void testSwapWindowingModes() throws RemoteException {
+        final ActivityStack stack = createStack();
+        final Task task = createTask(stack);
+        final ITaskOrganizer organizer = registerMockOrganizer(WINDOWING_MODE_MULTI_WINDOW);
+        final ITaskOrganizer organizer2 = registerMockOrganizer(WINDOWING_MODE_PINNED);
+
+        stack.setWindowingMode(WINDOWING_MODE_MULTI_WINDOW);
+        verify(organizer).onTaskAppeared(any());
+        stack.setWindowingMode(WINDOWING_MODE_PINNED);
+        verify(organizer).onTaskVanished(any());
+        verify(organizer2).onTaskAppeared(any());
+    }
+
+    @Test
+    public void testTaskNoDraw() throws RemoteException {
+        final ActivityStack stack = createStack();
+        final Task task = createTask(stack, false /* fakeDraw */);
+        final ITaskOrganizer organizer = registerMockOrganizer();
+
+        stack.setWindowingMode(WINDOWING_MODE_MULTI_WINDOW);
+        verify(organizer, never()).onTaskAppeared(any());
+        assertTrue(stack.isOrganized());
+
+        mWm.mAtmService.mTaskOrganizerController.unregisterTaskOrganizer(organizer);
+        verify(organizer, never()).onTaskVanished(any());
+        assertFalse(stack.isOrganized());
+    }
+
+    @Test
+    public void testClearOrganizer() throws RemoteException {
+        final ActivityStack stack = createStack();
+        final Task task = createTask(stack);
+        final ITaskOrganizer organizer = registerMockOrganizer();
+
+        stack.setTaskOrganizer(organizer);
+        verify(organizer).onTaskAppeared(any());
+        assertTrue(stack.isOrganized());
+
+        stack.setTaskOrganizer(null);
+        verify(organizer).onTaskVanished(any());
+        assertFalse(stack.isOrganized());
+    }
+
+    @Test
+    public void testUnregisterOrganizer() throws RemoteException {
+        final ActivityStack stack = createStack();
+        final Task task = createTask(stack);
+        final ITaskOrganizer organizer = registerMockOrganizer();
+
+        stack.setWindowingMode(WINDOWING_MODE_MULTI_WINDOW);
+        verify(organizer).onTaskAppeared(any());
+        assertTrue(stack.isOrganized());
+
+        mWm.mAtmService.mTaskOrganizerController.unregisterTaskOrganizer(organizer);
+        verify(organizer).onTaskVanished(any());
+        assertFalse(stack.isOrganized());
+    }
+
+    @Test
+    public void testUnregisterOrganizerReturnsRegistrationToPrevious() throws RemoteException {
+        final ActivityStack stack = createStack();
+        final Task task = createTask(stack);
+        final ActivityStack stack2 = createStack();
+        final Task task2 = createTask(stack2);
+        final ActivityStack stack3 = createStack();
+        final Task task3 = createTask(stack3);
+        final ITaskOrganizer organizer = registerMockOrganizer(WINDOWING_MODE_MULTI_WINDOW);
+
+        // First organizer is registered, verify a task appears when changing windowing mode
+        stack.setWindowingMode(WINDOWING_MODE_MULTI_WINDOW);
+        verify(organizer, times(1)).onTaskAppeared(any());
+        assertTrue(stack.isOrganized());
+
+        // Now we replace the registration and1 verify the new organizer receives tasks
+        // newly entering the windowing mode.
+        final ITaskOrganizer organizer2 = registerMockOrganizer(WINDOWING_MODE_MULTI_WINDOW);
+        stack2.setWindowingMode(WINDOWING_MODE_MULTI_WINDOW);
+        // One each for task and task2
+        verify(organizer2, times(2)).onTaskAppeared(any());
+        verify(organizer2, times(0)).onTaskVanished(any());
+        // One for task
+        verify(organizer).onTaskVanished(any());
+        assertTrue(stack2.isOrganized());
+
+        // Now we unregister the second one, the first one should automatically be reregistered
+        // so we verify that it's now seeing changes.
+        mWm.mAtmService.mTaskOrganizerController.unregisterTaskOrganizer(organizer2);
+        verify(organizer, times(3)).onTaskAppeared(any());
+        verify(organizer2, times(2)).onTaskVanished(any());
+
+        stack3.setWindowingMode(WINDOWING_MODE_MULTI_WINDOW);
+        verify(organizer, times(4)).onTaskAppeared(any());
+        verify(organizer2, times(2)).onTaskVanished(any());
+        assertTrue(stack3.isOrganized());
+    }
+
+    @Test
+    public void testRegisterTaskOrganizerStackWindowingModeChanges() throws RemoteException {
+        final ITaskOrganizer organizer = registerMockOrganizer(WINDOWING_MODE_PINNED);
+
+        final ActivityStack stack = createStack();
+        final Task task = createTask(stack);
+        final Task task2 = createTask(stack);
+        stack.setWindowingMode(WINDOWING_MODE_PINNED);
+        verify(organizer, times(1)).onTaskAppeared(any());
+
+        stack.setWindowingMode(WINDOWING_MODE_FULLSCREEN);
+        verify(organizer, times(1)).onTaskVanished(any());
+    }
+
+    @Test
+    public void testRegisterTaskOrganizerWithExistingTasks() throws RemoteException {
+        final ActivityStack stack = createStack();
+        final Task task = createTask(stack);
+        stack.setWindowingMode(WINDOWING_MODE_PINNED);
+
+        final ITaskOrganizer organizer = registerMockOrganizer(WINDOWING_MODE_PINNED);
+        verify(organizer, times(1)).onTaskAppeared(any());
+    }
+
+    @Test
+    public void testTaskTransaction() {
+        removeGlobalMinSizeRestriction();
+        final ActivityStack stack = new ActivityTestsBase.StackBuilder(mWm.mRoot)
+                .setWindowingMode(WINDOWING_MODE_FREEFORM).build();
+        final Task task = stack.getTopMostTask();
+        testTransaction(task);
+    }
+
+    @Test
+    public void testStackTransaction() {
+        removeGlobalMinSizeRestriction();
+        final ActivityStack stack = new ActivityTestsBase.StackBuilder(mWm.mRoot)
+                .setWindowingMode(WINDOWING_MODE_FREEFORM).build();
+        StackInfo info =
+                mWm.mAtmService.getStackInfo(WINDOWING_MODE_FREEFORM, ACTIVITY_TYPE_STANDARD);
+        assertEquals(stack.mRemoteToken.toWindowContainerToken(), info.stackToken);
+        testTransaction(stack);
+    }
+
+    @Test
+    public void testDisplayAreaTransaction() {
+        removeGlobalMinSizeRestriction();
+        final DisplayArea displayArea = new DisplayArea<>(mWm, ABOVE_TASKS, "DisplayArea");
+        testTransaction(displayArea);
+    }
+
+    private void testTransaction(WindowContainer wc) {
+        WindowContainerTransaction t = new WindowContainerTransaction();
+        Rect newBounds = new Rect(10, 10, 100, 100);
+        t.setBounds(wc.mRemoteToken.toWindowContainerToken(), new Rect(10, 10, 100, 100));
+        mWm.mAtmService.mWindowOrganizerController.applyTransaction(t);
+        assertEquals(newBounds, wc.getBounds());
+    }
+
+    @Test
+    public void testSetWindowingMode() {
+        final ActivityStack stack = new ActivityTestsBase.StackBuilder(mWm.mRoot)
+                .setWindowingMode(WINDOWING_MODE_FREEFORM).build();
+        testSetWindowingMode(stack);
+
+        final DisplayArea displayArea = new DisplayArea<>(mWm, ABOVE_TASKS, "DisplayArea");
+        displayArea.setWindowingMode(WINDOWING_MODE_FREEFORM);
+        testSetWindowingMode(displayArea);
+    }
+
+    private void testSetWindowingMode(WindowContainer wc) {
+        final WindowContainerTransaction t = new WindowContainerTransaction();
+        t.setWindowingMode(wc.mRemoteToken.toWindowContainerToken(), WINDOWING_MODE_FULLSCREEN);
+        mWm.mAtmService.mWindowOrganizerController.applyTransaction(t);
+        assertEquals(WINDOWING_MODE_FULLSCREEN, wc.getWindowingMode());
+    }
+
+    @Test
+    public void testSetActivityWindowingMode() {
+        final ActivityRecord record = makePipableActivity();
+        final ActivityStack stack = record.getStack();
+        final WindowContainerTransaction t = new WindowContainerTransaction();
+
+        t.setWindowingMode(stack.mRemoteToken.toWindowContainerToken(), WINDOWING_MODE_PINNED);
+        t.setActivityWindowingMode(
+                stack.mRemoteToken.toWindowContainerToken(), WINDOWING_MODE_FULLSCREEN);
+        mWm.mAtmService.mWindowOrganizerController.applyTransaction(t);
+
+        assertEquals(WINDOWING_MODE_FULLSCREEN, record.getWindowingMode());
+        assertEquals(WINDOWING_MODE_PINNED, stack.getWindowingMode());
+    }
+
+    @Test
+    public void testContainerFocusableChanges() {
+        removeGlobalMinSizeRestriction();
+        final ActivityStack stack = new ActivityTestsBase.StackBuilder(mWm.mRoot)
+                .setWindowingMode(WINDOWING_MODE_FREEFORM).build();
+        final Task task = stack.getTopMostTask();
+        WindowContainerTransaction t = new WindowContainerTransaction();
+        assertTrue(task.isFocusable());
+        t.setFocusable(stack.mRemoteToken.toWindowContainerToken(), false);
+        mWm.mAtmService.mWindowOrganizerController.applyTransaction(t);
+        assertFalse(task.isFocusable());
+        t.setFocusable(stack.mRemoteToken.toWindowContainerToken(), true);
+        mWm.mAtmService.mWindowOrganizerController.applyTransaction(t);
+        assertTrue(task.isFocusable());
+    }
+
+    @Test
+    public void testContainerHiddenChanges() {
+        removeGlobalMinSizeRestriction();
+        final ActivityStack stack = new ActivityTestsBase.StackBuilder(mWm.mRoot)
+                .setWindowingMode(WINDOWING_MODE_FREEFORM).build();
+        WindowContainerTransaction t = new WindowContainerTransaction();
+        assertTrue(stack.shouldBeVisible(null));
+        t.setHidden(stack.mRemoteToken.toWindowContainerToken(), true);
+        mWm.mAtmService.mWindowOrganizerController.applyTransaction(t);
+        assertFalse(stack.shouldBeVisible(null));
+        t.setHidden(stack.mRemoteToken.toWindowContainerToken(), false);
+        mWm.mAtmService.mWindowOrganizerController.applyTransaction(t);
+        assertTrue(stack.shouldBeVisible(null));
+    }
+
+    @Test
+    public void testOverrideConfigSize() {
+        removeGlobalMinSizeRestriction();
+        final ActivityStack stack = new ActivityTestsBase.StackBuilder(mWm.mRoot)
+                .setWindowingMode(WINDOWING_MODE_FREEFORM).build();
+        final Task task = stack.getTopMostTask();
+        WindowContainerTransaction t = new WindowContainerTransaction();
+        mWm.mAtmService.mWindowOrganizerController.applyTransaction(t);
+        final int origScreenWDp = task.getConfiguration().screenHeightDp;
+        final int origScreenHDp = task.getConfiguration().screenHeightDp;
+        t = new WindowContainerTransaction();
+        // verify that setting config overrides on parent restricts children.
+        t.setScreenSizeDp(stack.mRemoteToken
+                .toWindowContainerToken(), origScreenWDp, origScreenHDp / 2);
+        mWm.mAtmService.mWindowOrganizerController.applyTransaction(t);
+        assertEquals(origScreenHDp / 2, task.getConfiguration().screenHeightDp);
+        t = new WindowContainerTransaction();
+        t.setScreenSizeDp(stack.mRemoteToken.toWindowContainerToken(), SCREEN_WIDTH_DP_UNDEFINED,
+                SCREEN_HEIGHT_DP_UNDEFINED);
+        mWm.mAtmService.mWindowOrganizerController.applyTransaction(t);
+        assertEquals(origScreenHDp, task.getConfiguration().screenHeightDp);
+    }
+
+    @Test
+    public void testCreateDeleteRootTasks() {
+        RunningTaskInfo info1 = mWm.mAtmService.mTaskOrganizerController.createRootTask(
+                Display.DEFAULT_DISPLAY,
+                WINDOWING_MODE_SPLIT_SCREEN_PRIMARY);
+        assertEquals(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY,
+                info1.configuration.windowConfiguration.getWindowingMode());
+        assertEquals(ACTIVITY_TYPE_UNDEFINED, info1.topActivityType);
+
+        RunningTaskInfo info2 = mWm.mAtmService.mTaskOrganizerController.createRootTask(
+                Display.DEFAULT_DISPLAY,
+                WINDOWING_MODE_SPLIT_SCREEN_SECONDARY);
+        assertEquals(WINDOWING_MODE_SPLIT_SCREEN_SECONDARY,
+                info2.configuration.windowConfiguration.getWindowingMode());
+        assertEquals(ACTIVITY_TYPE_UNDEFINED, info2.topActivityType);
+
+        DisplayContent dc = mWm.mRoot.getDisplayContent(Display.DEFAULT_DISPLAY);
+        List<Task> infos = getTasksCreatedByOrganizer(dc);
+        assertEquals(2, infos.size());
+
+        assertTrue(mWm.mAtmService.mTaskOrganizerController.deleteRootTask(info1.token));
+        infos = getTasksCreatedByOrganizer(dc);
+        assertEquals(1, infos.size());
+        assertEquals(WINDOWING_MODE_SPLIT_SCREEN_SECONDARY, infos.get(0).getWindowingMode());
+    }
+
+    @Test
+    public void testTileAddRemoveChild() {
+        ITaskOrganizer listener = new ITaskOrganizer.Stub() {
+            @Override
+            public void onTaskAppeared(RunningTaskInfo taskInfo) { }
+
+            @Override
+            public void onTaskVanished(RunningTaskInfo container) { }
+
+            @Override
+            public void onTaskInfoChanged(RunningTaskInfo info) throws RemoteException {
+            }
+
+            @Override
+            public void onBackPressedOnTaskRoot(RunningTaskInfo taskInfo) {
+            }
+        };
+        mWm.mAtmService.mTaskOrganizerController.registerTaskOrganizer(listener,
+                WINDOWING_MODE_SPLIT_SCREEN_SECONDARY);
+        RunningTaskInfo info1 = mWm.mAtmService.mTaskOrganizerController.createRootTask(
+                mDisplayContent.mDisplayId, WINDOWING_MODE_SPLIT_SCREEN_SECONDARY);
+
+        final ActivityStack stack = createTaskStackOnDisplay(
+                WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_STANDARD, mDisplayContent);
+        assertEquals(mDisplayContent.getWindowingMode(), stack.getWindowingMode());
+        WindowContainerTransaction wct = new WindowContainerTransaction();
+        wct.reparent(stack.mRemoteToken.toWindowContainerToken(), info1.token, true /* onTop */);
+        mWm.mAtmService.mWindowOrganizerController.applyTransaction(wct);
+        assertEquals(info1.configuration.windowConfiguration.getWindowingMode(),
+                stack.getWindowingMode());
+
+        // Info should reflect new membership
+        List<Task> infos = getTasksCreatedByOrganizer(mDisplayContent);
+        info1 = infos.get(0).getTaskInfo();
+        assertEquals(ACTIVITY_TYPE_STANDARD, info1.topActivityType);
+
+        // Children inherit configuration
+        Rect newSize = new Rect(10, 10, 300, 300);
+        Task task1 = WindowContainer.fromBinder(info1.token.asBinder()).asTask();
+        Configuration c = new Configuration(task1.getRequestedOverrideConfiguration());
+        c.windowConfiguration.setBounds(newSize);
+        doNothing().when(stack).adjustForMinimalTaskDimensions(any(), any());
+        task1.onRequestedOverrideConfigurationChanged(c);
+        assertEquals(newSize, stack.getBounds());
+
+        wct = new WindowContainerTransaction();
+        wct.reparent(stack.mRemoteToken.toWindowContainerToken(), null, true /* onTop */);
+        mWm.mAtmService.mWindowOrganizerController.applyTransaction(wct);
+        assertEquals(mDisplayContent.getWindowingMode(), stack.getWindowingMode());
+        infos = getTasksCreatedByOrganizer(mDisplayContent);
+        info1 = infos.get(0).getTaskInfo();
+        assertEquals(ACTIVITY_TYPE_UNDEFINED, info1.topActivityType);
+    }
+
+    @Test
+    public void testTaskInfoCallback() {
+        final ArrayList<RunningTaskInfo> lastReportedTiles = new ArrayList<>();
+        final boolean[] called = {false};
+        ITaskOrganizer listener = new ITaskOrganizer.Stub() {
+            @Override
+            public void onTaskAppeared(RunningTaskInfo taskInfo) { }
+
+            @Override
+            public void onTaskVanished(RunningTaskInfo container) { }
+
+            @Override
+            public void onTaskInfoChanged(RunningTaskInfo info) throws RemoteException {
+                lastReportedTiles.add(info);
+                called[0] = true;
+            }
+
+            @Override
+            public void onBackPressedOnTaskRoot(RunningTaskInfo taskInfo) {
+            }
+        };
+        mWm.mAtmService.mTaskOrganizerController.registerTaskOrganizer(listener,
+                WINDOWING_MODE_SPLIT_SCREEN_SECONDARY);
+        RunningTaskInfo info1 = mWm.mAtmService.mTaskOrganizerController.createRootTask(
+                mDisplayContent.mDisplayId, WINDOWING_MODE_SPLIT_SCREEN_SECONDARY);
+        lastReportedTiles.clear();
+        called[0] = false;
+
+        final ActivityStack stack = createTaskStackOnDisplay(
+                WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_STANDARD, mDisplayContent);
+        Task task1 = WindowContainer.fromBinder(info1.token.asBinder()).asTask();
+        WindowContainerTransaction wct = new WindowContainerTransaction();
+        wct.reparent(stack.mRemoteToken.toWindowContainerToken(), info1.token, true /* onTop */);
+        mWm.mAtmService.mWindowOrganizerController.applyTransaction(wct);
+        assertTrue(called[0]);
+        assertEquals(ACTIVITY_TYPE_STANDARD, lastReportedTiles.get(0).topActivityType);
+
+        lastReportedTiles.clear();
+        called[0] = false;
+        final ActivityStack stack2 = createTaskStackOnDisplay(
+                WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_HOME, mDisplayContent);
+        wct = new WindowContainerTransaction();
+        wct.reparent(stack2.mRemoteToken.toWindowContainerToken(), info1.token, true /* onTop */);
+        mWm.mAtmService.mWindowOrganizerController.applyTransaction(wct);
+        assertTrue(called[0]);
+        assertEquals(ACTIVITY_TYPE_HOME, lastReportedTiles.get(0).topActivityType);
+
+        lastReportedTiles.clear();
+        called[0] = false;
+        task1.positionChildAt(POSITION_TOP, stack, false /* includingParents */);
+        assertTrue(called[0]);
+        assertEquals(ACTIVITY_TYPE_STANDARD, lastReportedTiles.get(0).topActivityType);
+
+        lastReportedTiles.clear();
+        called[0] = false;
+        wct = new WindowContainerTransaction();
+        wct.reparent(stack.mRemoteToken.toWindowContainerToken(), null, true /* onTop */);
+        wct.reparent(stack2.mRemoteToken.toWindowContainerToken(), null, true /* onTop */);
+        mWm.mAtmService.mWindowOrganizerController.applyTransaction(wct);
+        assertTrue(called[0]);
+        assertEquals(ACTIVITY_TYPE_UNDEFINED, lastReportedTiles.get(0).topActivityType);
+    }
+
+    @Test
+    public void testHierarchyTransaction() {
+        final ArrayMap<IBinder, RunningTaskInfo> lastReportedTiles = new ArrayMap<>();
+        ITaskOrganizer listener = new ITaskOrganizer.Stub() {
+            @Override
+            public void onTaskAppeared(RunningTaskInfo taskInfo) { }
+
+            @Override
+            public void onTaskVanished(RunningTaskInfo container) { }
+
+            @Override
+            public void onTaskInfoChanged(RunningTaskInfo info) {
+                lastReportedTiles.put(info.token.asBinder(), info);
+            }
+
+            @Override
+            public void onBackPressedOnTaskRoot(RunningTaskInfo taskInfo) {
+            }
+        };
+        mWm.mAtmService.mTaskOrganizerController.registerTaskOrganizer(
+                listener, WINDOWING_MODE_SPLIT_SCREEN_PRIMARY);
+        mWm.mAtmService.mTaskOrganizerController.registerTaskOrganizer(
+                listener, WINDOWING_MODE_SPLIT_SCREEN_SECONDARY);
+        RunningTaskInfo info1 = mWm.mAtmService.mTaskOrganizerController.createRootTask(
+                mDisplayContent.mDisplayId, WINDOWING_MODE_SPLIT_SCREEN_PRIMARY);
+        RunningTaskInfo info2 = mWm.mAtmService.mTaskOrganizerController.createRootTask(
+                mDisplayContent.mDisplayId, WINDOWING_MODE_SPLIT_SCREEN_SECONDARY);
+
+        final int initialRootTaskCount = mWm.mAtmService.mTaskOrganizerController.getRootTasks(
+                mDisplayContent.mDisplayId, null /* activityTypes */).size();
+
+        final ActivityStack stack = createTaskStackOnDisplay(
+                WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_STANDARD, mDisplayContent);
+        final ActivityStack stack2 = createTaskStackOnDisplay(
+                WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_HOME, mDisplayContent);
+
+        // Check getRootTasks works
+        List<RunningTaskInfo> roots = mWm.mAtmService.mTaskOrganizerController.getRootTasks(
+                mDisplayContent.mDisplayId, null /* activityTypes */);
+        assertEquals(initialRootTaskCount + 2, roots.size());
+
+        lastReportedTiles.clear();
+        WindowContainerTransaction wct = new WindowContainerTransaction();
+        wct.reparent(stack.mRemoteToken.toWindowContainerToken(), info1.token, true /* onTop */);
+        wct.reparent(stack2.mRemoteToken.toWindowContainerToken(), info2.token, true /* onTop */);
+        mWm.mAtmService.mWindowOrganizerController.applyTransaction(wct);
+        assertFalse(lastReportedTiles.isEmpty());
+        assertEquals(ACTIVITY_TYPE_STANDARD,
+                lastReportedTiles.get(info1.token.asBinder()).topActivityType);
+        assertEquals(ACTIVITY_TYPE_HOME,
+                lastReportedTiles.get(info2.token.asBinder()).topActivityType);
+
+        lastReportedTiles.clear();
+        wct = new WindowContainerTransaction();
+        wct.reparent(stack2.mRemoteToken.toWindowContainerToken(), info1.token, false /* onTop */);
+        mWm.mAtmService.mWindowOrganizerController.applyTransaction(wct);
+        assertFalse(lastReportedTiles.isEmpty());
+        // Standard should still be on top of tile 1, so no change there
+        assertFalse(lastReportedTiles.containsKey(info1.token.asBinder()));
+        // But tile 2 has no children, so should become undefined
+        assertEquals(ACTIVITY_TYPE_UNDEFINED,
+                lastReportedTiles.get(info2.token.asBinder()).topActivityType);
+
+        // Check the getChildren call
+        List<RunningTaskInfo> children =
+                mWm.mAtmService.mTaskOrganizerController.getChildTasks(info1.token,
+                        null /* activityTypes */);
+        assertEquals(2, children.size());
+        children = mWm.mAtmService.mTaskOrganizerController.getChildTasks(info2.token,
+                null /* activityTypes */);
+        assertEquals(0, children.size());
+
+        // Check that getRootTasks doesn't include children of tiles
+        roots = mWm.mAtmService.mTaskOrganizerController.getRootTasks(mDisplayContent.mDisplayId,
+                null /* activityTypes */);
+        assertEquals(initialRootTaskCount, roots.size());
+
+        lastReportedTiles.clear();
+        wct = new WindowContainerTransaction();
+        wct.reorder(stack2.mRemoteToken.toWindowContainerToken(), true /* onTop */);
+        mWm.mAtmService.mWindowOrganizerController.applyTransaction(wct);
+        // Home should now be on top. No change occurs in second tile, so not reported
+        assertEquals(1, lastReportedTiles.size());
+        assertEquals(ACTIVITY_TYPE_HOME,
+                lastReportedTiles.get(info1.token.asBinder()).topActivityType);
+    }
+
+    private List<Task> getTasksCreatedByOrganizer(DisplayContent dc) {
+        ArrayList<Task> out = new ArrayList<>();
+        for (int tdaNdx = dc.getTaskDisplayAreaCount() - 1; tdaNdx >= 0; --tdaNdx) {
+            final TaskDisplayArea taskDisplayArea = dc.getTaskDisplayAreaAt(tdaNdx);
+            for (int sNdx = taskDisplayArea.getStackCount() - 1; sNdx >= 0; --sNdx) {
+                final Task t = taskDisplayArea.getStackAt(sNdx);
+                if (t.mCreatedByOrganizer) out.add(t);
+            }
+        }
+        return out;
+    }
+
+    @Test
+    public void testTrivialBLASTCallback() throws RemoteException {
+        final ActivityStack stackController1 = createStack();
+        final Task task = createTask(stackController1);
+        final ITaskOrganizer organizer = registerMockOrganizer();
+
+        spyOn(task);
+        doReturn(true).when(task).isVisible();
+
+        BLASTSyncEngine bse = new BLASTSyncEngine();
+
+        BLASTSyncEngine.TransactionReadyListener transactionListener =
+                mock(BLASTSyncEngine.TransactionReadyListener.class);
+
+        int id = bse.startSyncSet(transactionListener);
+        bse.addToSyncSet(id, task);
+        bse.setReady(id);
+        // Since this task has no windows the sync is trivial and completes immediately.
+        verify(transactionListener)
+            .onTransactionReady(anyInt(), any());
+    }
+
+    @Test
+    public void testOverlappingBLASTCallback() throws RemoteException {
+        final ActivityStack stackController1 = createStack();
+        final Task task = createTask(stackController1);
+        final ITaskOrganizer organizer = registerMockOrganizer();
+
+        spyOn(task);
+        doReturn(true).when(task).isVisible();
+        final WindowState w = createAppWindow(task, TYPE_APPLICATION, "Enlightened Window");
+        makeWindowVisible(w);
+
+        BLASTSyncEngine bse = new BLASTSyncEngine();
+
+        BLASTSyncEngine.TransactionReadyListener transactionListener =
+                mock(BLASTSyncEngine.TransactionReadyListener.class);
+
+        int id = bse.startSyncSet(transactionListener);
+        assertEquals(true, bse.addToSyncSet(id, task));
+        bse.setReady(id);
+
+        int id2 = bse.startSyncSet(transactionListener);
+        // We should be rejected from the second sync since we are already
+        // in one.
+        assertEquals(false, bse.addToSyncSet(id2, task));
+        w.finishDrawing(null);
+        assertEquals(true, bse.addToSyncSet(id2, task));
+        bse.setReady(id2);
+    }
+
+    @Test
+    public void testBLASTCallbackWithWindow() {
+        final ActivityStack stackController1 = createStack();
+        final Task task = createTask(stackController1);
+        final ITaskOrganizer organizer = registerMockOrganizer();
+        final WindowState w = createAppWindow(task, TYPE_APPLICATION, "Enlightened Window");
+        makeWindowVisible(w);
+
+        BLASTSyncEngine bse = new BLASTSyncEngine();
+
+        BLASTSyncEngine.TransactionReadyListener transactionListener =
+                mock(BLASTSyncEngine.TransactionReadyListener.class);
+
+        int id = bse.startSyncSet(transactionListener);
+        bse.addToSyncSet(id, task);
+        bse.setReady(id);
+        // Since we have a window we have to wait for it to draw to finish sync.
+        verify(transactionListener, never())
+            .onTransactionReady(anyInt(), any());
+        w.finishDrawing(null);
+        verify(transactionListener)
+            .onTransactionReady(anyInt(), any());
+    }
+
+    @Test
+    public void testBLASTCallbackWithInvisibleWindow() {
+        final ActivityStack stackController1 = createStack();
+        final Task task = createTask(stackController1);
+        final ITaskOrganizer organizer = registerMockOrganizer();
+        final WindowState w = createAppWindow(task, TYPE_APPLICATION, "Enlightened Window");
+
+        BLASTSyncEngine bse = new BLASTSyncEngine();
+
+        BLASTSyncEngine.TransactionReadyListener transactionListener =
+                mock(BLASTSyncEngine.TransactionReadyListener.class);
+
+        int id = bse.startSyncSet(transactionListener);
+        bse.addToSyncSet(id, task);
+        bse.setReady(id);
+
+        // Since the window was invisible, the Task had no visible leaves and the sync should
+        // complete as soon as we call setReady.
+        verify(transactionListener)
+            .onTransactionReady(anyInt(), any());
+    }
+
+    @Test
+    public void testBLASTCallbackWithChildWindow() {
+        final ActivityStack stackController1 = createStack();
+        final Task task = createTask(stackController1);
+        final ITaskOrganizer organizer = registerMockOrganizer();
+        final WindowState w = createAppWindow(task, TYPE_APPLICATION, "Enlightened Window");
+        final WindowState child = createWindow(w, TYPE_APPLICATION, "Other Window");
+
+        w.mActivityRecord.setVisible(true);
+        makeWindowVisible(w, child);
+
+        BLASTSyncEngine bse = new BLASTSyncEngine();
+
+        BLASTSyncEngine.TransactionReadyListener transactionListener =
+                mock(BLASTSyncEngine.TransactionReadyListener.class);
+
+        int id = bse.startSyncSet(transactionListener);
+        assertEquals(true, bse.addToSyncSet(id, task));
+        bse.setReady(id);
+        w.finishDrawing(null);
+
+        // Since we have a child window we still shouldn't be done.
+        verify(transactionListener, never())
+            .onTransactionReady(anyInt(), any());
+        reset(transactionListener);
+
+        child.finishDrawing(null);
+        // Ah finally! Done
+        verify(transactionListener)
+                .onTransactionReady(anyInt(), any());
+    }
+
+    class StubOrganizer extends ITaskOrganizer.Stub {
+        RunningTaskInfo mInfo;
+
+        @Override
+        public void onTaskAppeared(RunningTaskInfo info) {
+            mInfo = info;
+        }
+        @Override
+        public void onTaskVanished(RunningTaskInfo info) {
+        }
+        @Override
+        public void onTaskInfoChanged(RunningTaskInfo info) {
+        }
+        @Override
+        public void onBackPressedOnTaskRoot(RunningTaskInfo taskInfo) {
+        }
+    };
+
+    private ActivityRecord makePipableActivity() {
+        final ActivityRecord record = createActivityRecord(mDisplayContent,
+                WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD);
+        record.info.flags |= ActivityInfo.FLAG_SUPPORTS_PICTURE_IN_PICTURE;
+        spyOn(record);
+        doReturn(true).when(record).checkEnterPictureInPictureState(any(), anyBoolean());
+
+        record.getRootTask().setHasBeenVisible(true);
+        return record;
+    }
+
+    @Test
+    public void testEnterPipParams() {
+        final StubOrganizer o = new StubOrganizer();
+        mWm.mAtmService.mTaskOrganizerController.registerTaskOrganizer(o, WINDOWING_MODE_PINNED);
+        final ActivityRecord record = makePipableActivity();
+
+        final PictureInPictureParams p = new PictureInPictureParams.Builder()
+                .setAspectRatio(new Rational(1, 2)).build();
+        assertTrue(mWm.mAtmService.enterPictureInPictureMode(record.token, p));
+        waitUntilHandlersIdle();
+        assertNotNull(o.mInfo);
+        assertNotNull(o.mInfo.pictureInPictureParams);
+    }
+
+    @Test
+    public void testChangePipParams() {
+        class ChangeSavingOrganizer extends StubOrganizer {
+            RunningTaskInfo mChangedInfo;
+            @Override
+            public void onTaskInfoChanged(RunningTaskInfo info) {
+                mChangedInfo = info;
+            }
+        }
+        ChangeSavingOrganizer o = new ChangeSavingOrganizer();
+        mWm.mAtmService.mTaskOrganizerController.registerTaskOrganizer(o, WINDOWING_MODE_PINNED);
+
+        final ActivityRecord record = makePipableActivity();
+        final PictureInPictureParams p = new PictureInPictureParams.Builder()
+                .setAspectRatio(new Rational(1, 2)).build();
+        assertTrue(mWm.mAtmService.enterPictureInPictureMode(record.token, p));
+        waitUntilHandlersIdle();
+        assertNotNull(o.mInfo);
+        assertNotNull(o.mInfo.pictureInPictureParams);
+
+        final PictureInPictureParams p2 = new PictureInPictureParams.Builder()
+                .setAspectRatio(new Rational(3, 4)).build();
+        mWm.mAtmService.setPictureInPictureParams(record.token, p2);
+        waitUntilHandlersIdle();
+        assertNotNull(o.mChangedInfo);
+        assertNotNull(o.mChangedInfo.pictureInPictureParams);
+        final Rational ratio = o.mChangedInfo.pictureInPictureParams.getAspectRatioRational();
+        assertEquals(3, ratio.getNumerator());
+        assertEquals(4, ratio.getDenominator());
+    }
+
+    @Test
+    public void testChangeTaskDescription() {
+        class ChangeSavingOrganizer extends StubOrganizer {
+            RunningTaskInfo mChangedInfo;
+            @Override
+            public void onTaskInfoChanged(RunningTaskInfo info) {
+                mChangedInfo = info;
+            }
+        }
+        ChangeSavingOrganizer o = new ChangeSavingOrganizer();
+        mWm.mAtmService.mTaskOrganizerController.registerTaskOrganizer(o,
+                WINDOWING_MODE_MULTI_WINDOW);
+
+        final ActivityStack stack = createStack();
+        final Task task = createTask(stack);
+        final ActivityRecord record = WindowTestUtils.createActivityRecordInTask(
+                stack.mDisplayContent, task);
+
+        stack.setWindowingMode(WINDOWING_MODE_MULTI_WINDOW);
+        record.setTaskDescription(new ActivityManager.TaskDescription("TestDescription"));
+        waitUntilHandlersIdle();
+        assertEquals("TestDescription", o.mChangedInfo.taskDescription.getLabel());
+    }
+
+    @Test
+    public void testPreventDuplicateAppear() throws RemoteException {
+        final ActivityStack stack = createStack();
+        final Task task = createTask(stack);
+        final ITaskOrganizer organizer = registerMockOrganizer();
+
+        task.setTaskOrganizer(organizer);
+        // setHasBeenVisible was already called once by the set-up code.
+        task.setHasBeenVisible(true);
+        verify(organizer, times(1)).onTaskAppeared(any());
+
+        task.setTaskOrganizer(null);
+        verify(organizer, times(1)).onTaskVanished(any());
+        task.setTaskOrganizer(organizer);
+        verify(organizer, times(2)).onTaskAppeared(any());
+
+        task.removeImmediately();
+        verify(organizer, times(2)).onTaskVanished(any());
+    }
+
+    @Test
+    public void testInterceptBackPressedOnTaskRoot() throws RemoteException {
+        final ActivityStack stack = createStack();
+        final Task task = createTask(stack);
+        final ActivityRecord activity = WindowTestUtils.createActivityRecordInTask(
+                stack.mDisplayContent, task);
+        final ITaskOrganizer organizer = registerMockOrganizer(WINDOWING_MODE_MULTI_WINDOW);
+
+        // Setup the task to be controlled by the MW mode organizer
+        stack.setWindowingMode(WINDOWING_MODE_MULTI_WINDOW);
+        assertTrue(stack.isOrganized());
+
+        // Verify a back pressed does not call the organizer
+        mWm.mAtmService.onBackPressedOnTaskRoot(activity.token,
+                new IRequestFinishCallback.Default());
+        verify(organizer, never()).onBackPressedOnTaskRoot(any());
+
+        // Enable intercepting back
+        mWm.mAtmService.mTaskOrganizerController.setInterceptBackPressedOnTaskRoot(organizer,
+                true);
+
+        // Verify now that the back press does call the organizer
+        mWm.mAtmService.onBackPressedOnTaskRoot(activity.token,
+                new IRequestFinishCallback.Default());
+        verify(organizer, times(1)).onBackPressedOnTaskRoot(any());
+    }
+}
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowProcessControllerTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowProcessControllerTests.java
index 07a6179..cdf8eb4 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowProcessControllerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowProcessControllerTests.java
@@ -28,9 +28,11 @@
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.when;
 
+import android.Manifest;
 import android.app.IApplicationThread;
 import android.content.ComponentName;
 import android.content.pm.ApplicationInfo;
+import android.content.pm.ServiceInfo;
 import android.content.res.Configuration;
 import android.platform.test.annotations.Presubmit;
 
@@ -200,6 +202,57 @@
         assertFalse(wpc.registeredForActivityConfigChanges());
     }
 
+    @Test
+    public void testActivityNotOverridingImeProcessConfig() {
+        ServiceInfo serviceInfo = new ServiceInfo();
+        serviceInfo.permission = Manifest.permission.BIND_INPUT_METHOD;
+        // Notify WPC that this process has started an IME service.
+        mWpc.onServiceStarted(serviceInfo);
+
+        final ActivityRecord activity = new ActivityBuilder(mService)
+                .setCreateTask(true)
+                .setUseProcess(mWpc)
+                .build();
+
+        mWpc.addActivityIfNeeded(activity);
+        // IME processes should not be registered for activity config changes.
+        assertFalse(mWpc.registeredForActivityConfigChanges());
+    }
+
+    @Test
+    public void testActivityNotOverridingAllyProcessConfig() {
+        ServiceInfo serviceInfo = new ServiceInfo();
+        serviceInfo.permission = Manifest.permission.BIND_ACCESSIBILITY_SERVICE;
+        // Notify WPC that this process has started an ally service.
+        mWpc.onServiceStarted(serviceInfo);
+
+        final ActivityRecord activity = new ActivityBuilder(mService)
+                .setCreateTask(true)
+                .setUseProcess(mWpc)
+                .build();
+
+        mWpc.addActivityIfNeeded(activity);
+        // Ally processes should not be registered for activity config changes.
+        assertFalse(mWpc.registeredForActivityConfigChanges());
+    }
+
+    @Test
+    public void testActivityNotOverridingVoiceInteractionProcessConfig() {
+        ServiceInfo serviceInfo = new ServiceInfo();
+        serviceInfo.permission = Manifest.permission.BIND_VOICE_INTERACTION;
+        // Notify WPC that this process has started an voice interaction service.
+        mWpc.onServiceStarted(serviceInfo);
+
+        final ActivityRecord activity = new ActivityBuilder(mService)
+                .setCreateTask(true)
+                .setUseProcess(mWpc)
+                .build();
+
+        mWpc.addActivityIfNeeded(activity);
+        // Voice interaction service processes should not be registered for activity config changes.
+        assertFalse(mWpc.registeredForActivityConfigChanges());
+    }
+
     private TestDisplayContent createTestDisplayContentInContainer() {
         return new TestDisplayContent.Builder(mService, 1000, 1500).build();
     }
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java
index 71b35b6..65fb2c0 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java
@@ -657,4 +657,16 @@
         win0.mActivityRecord.getStack().setFocusable(false);
         assertTrue(win0.cantReceiveTouchInput());
     }
+
+    @Test
+    public void testNeedsRelativeLayeringToIme_notAttached() {
+        WindowState sameTokenWindow = createWindow(null, TYPE_BASE_APPLICATION, mAppWindow.mToken,
+                "SameTokenWindow");
+        mDisplayContent.mInputMethodTarget = mAppWindow;
+        sameTokenWindow.mActivityRecord.getStack().setWindowingMode(
+                WINDOWING_MODE_SPLIT_SCREEN_PRIMARY);
+        assertTrue(sameTokenWindow.needsRelativeLayeringToIme());
+        sameTokenWindow.removeImmediately();
+        assertFalse(sameTokenWindow.needsRelativeLayeringToIme());
+    }
 }
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java
index e561c13..6a64d1c 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java
@@ -247,7 +247,7 @@
     WindowState createAppWindow(Task task, int type, String name) {
         synchronized (mWm.mGlobalLock) {
             final ActivityRecord activity =
-                    WindowTestUtils.createTestActivityRecord(mDisplayContent);
+                    WindowTestUtils.createTestActivityRecord(task.getDisplayContent());
             task.addChild(activity, 0);
             return createWindow(null, type, activity, name);
         }
diff --git a/services/usage/java/com/android/server/usage/UsageStatsService.java b/services/usage/java/com/android/server/usage/UsageStatsService.java
index bbe9851..5b5d57b 100644
--- a/services/usage/java/com/android/server/usage/UsageStatsService.java
+++ b/services/usage/java/com/android/server/usage/UsageStatsService.java
@@ -1577,15 +1577,27 @@
         }
 
         @Override
-        public boolean isAppInactive(String packageName, int userId) {
+        public boolean isAppInactive(String packageName, int userId, String callingPackage) {
+            final int callingUid = Binder.getCallingUid();
             try {
                 userId = ActivityManager.getService().handleIncomingUser(Binder.getCallingPid(),
-                        Binder.getCallingUid(), userId, false, false, "isAppInactive", null);
+                        callingUid, userId, false, false, "isAppInactive", null);
             } catch (RemoteException re) {
                 throw re.rethrowFromSystemServer();
             }
+
+            // If the calling app is asking about itself, continue, else check for permission.
+            if (packageName.equals(callingPackage)) {
+                final int actualCallingUid = mPackageManagerInternal.getPackageUidInternal(
+                        callingPackage, 0, userId);
+                if (actualCallingUid != callingUid) {
+                    return false;
+                }
+            } else if (!hasPermission(callingPackage)) {
+                return false;
+            }
             final boolean obfuscateInstantApps = shouldObfuscateInstantAppsForCaller(
-                    Binder.getCallingUid(), userId);
+                    callingUid, userId);
             final long token = Binder.clearCallingIdentity();
             try {
                 return mAppStandby.isAppIdleFiltered(
diff --git a/services/usb/java/com/android/server/usb/UsbDeviceManager.java b/services/usb/java/com/android/server/usb/UsbDeviceManager.java
index 747c8d9..7595e3f 100644
--- a/services/usb/java/com/android/server/usb/UsbDeviceManager.java
+++ b/services/usb/java/com/android/server/usb/UsbDeviceManager.java
@@ -41,6 +41,7 @@
 import android.content.pm.PackageManager;
 import android.content.res.Resources;
 import android.debug.AdbManagerInternal;
+import android.debug.AdbNotifications;
 import android.debug.AdbTransportType;
 import android.debug.IAdbTransport;
 import android.hardware.usb.ParcelableUsbPort;
@@ -1180,7 +1181,6 @@
         protected void updateAdbNotification(boolean force) {
             if (mNotificationManager == null) return;
             final int id = SystemMessage.NOTE_ADB_ACTIVE;
-            final int titleRes = com.android.internal.R.string.adb_active_notification_title;
 
             if (isAdbEnabled() && mConnected) {
                 if ("0".equals(getSystemProperty("persist.adb.notify", ""))) return;
@@ -1191,38 +1191,10 @@
                 }
 
                 if (!mAdbNotificationShown) {
-                    Resources r = mContext.getResources();
-                    CharSequence title = r.getText(titleRes);
-                    CharSequence message = r.getText(
-                            com.android.internal.R.string.adb_active_notification_message);
-
-                    Intent intent = new Intent(Settings.ACTION_APPLICATION_DEVELOPMENT_SETTINGS);
-                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
-                            | Intent.FLAG_ACTIVITY_CLEAR_TASK);
-                    PendingIntent pi = PendingIntent.getActivityAsUser(mContext, 0,
-                            intent, 0, null, UserHandle.CURRENT);
-
-                    Notification notification =
-                            new Notification.Builder(mContext,
-                                    SystemNotificationChannels.DEVELOPER_IMPORTANT)
-                                    .setSmallIcon(com.android.internal.R.drawable.stat_sys_adb)
-                                    .setWhen(0)
-                                    .setOngoing(true)
-                                    .setTicker(title)
-                                    .setDefaults(0)  // please be quiet
-                                    .setColor(mContext.getColor(
-                                            com.android.internal.R.color
-                                                    .system_notification_accent_color))
-                                    .setContentTitle(title)
-                                    .setContentText(message)
-                                    .setContentIntent(pi)
-                                    .setVisibility(Notification.VISIBILITY_PUBLIC)
-                                    .extend(new Notification.TvExtender()
-                                            .setChannelId(ADB_NOTIFICATION_CHANNEL_ID_TV))
-                                    .build();
+                    Notification notification = AdbNotifications.createNotification(mContext,
+                            AdbTransportType.USB);
                     mAdbNotificationShown = true;
-                    mNotificationManager.notifyAsUser(null, id, notification,
-                            UserHandle.ALL);
+                    mNotificationManager.notifyAsUser(null, id, notification, UserHandle.ALL);
                 }
             } else if (mAdbNotificationShown) {
                 mAdbNotificationShown = false;
diff --git a/startop/iorap/functional_tests/Android.bp b/startop/iorap/functional_tests/Android.bp
index ad85f14..8a5bd34 100644
--- a/startop/iorap/functional_tests/Android.bp
+++ b/startop/iorap/functional_tests/Android.bp
@@ -15,7 +15,7 @@
 android_test {
     name: "iorap-functional-tests",
     srcs: ["src/**/*.java"],
-    data: ["test_data/*"],
+    data: [":iorap-functional-test-apps"],
     static_libs: [
         // Non-test dependencies
         // library under test
diff --git a/startop/iorap/functional_tests/src/com/google/android/startop/iorap/IorapWorkFlowTest.java b/startop/iorap/functional_tests/src/com/google/android/startop/iorap/IorapWorkFlowTest.java
index c35dd3b..5352be6 100644
--- a/startop/iorap/functional_tests/src/com/google/android/startop/iorap/IorapWorkFlowTest.java
+++ b/startop/iorap/functional_tests/src/com/google/android/startop/iorap/IorapWorkFlowTest.java
@@ -397,7 +397,7 @@
     public LogcatTimestamp() throws Exception{
       long currentTimeMillis = System.currentTimeMillis();
       epochTime = String.format(
-          "%d.%d", currentTimeMillis/1000, currentTimeMillis%1000);
+          "%d.%03d", currentTimeMillis/1000, currentTimeMillis%1000);
       Log.i(TAG, "Current logcat timestamp is " + epochTime);
     }
 
diff --git a/startop/iorap/functional_tests/test_data/iorap_test_app_v1.apk b/startop/iorap/functional_tests/test_data/iorap_test_app_v1.apk
deleted file mode 120000
index 1c1a437f..0000000
--- a/startop/iorap/functional_tests/test_data/iorap_test_app_v1.apk
+++ /dev/null
@@ -1 +0,0 @@
-../../../../../../packages/modules/ArtPrebuilt/iorap/test/iorap_test_app_v1.apk
\ No newline at end of file
diff --git a/startop/iorap/functional_tests/test_data/iorap_test_app_v2.apk b/startop/iorap/functional_tests/test_data/iorap_test_app_v2.apk
deleted file mode 120000
index 7cd41c4..0000000
--- a/startop/iorap/functional_tests/test_data/iorap_test_app_v2.apk
+++ /dev/null
@@ -1 +0,0 @@
-../../../../../../packages/modules/ArtPrebuilt/iorap/test/iorap_test_app_v2.apk
\ No newline at end of file
diff --git a/startop/iorap/functional_tests/test_data/iorap_test_app_v3.apk b/startop/iorap/functional_tests/test_data/iorap_test_app_v3.apk
deleted file mode 120000
index 7f4e996..0000000
--- a/startop/iorap/functional_tests/test_data/iorap_test_app_v3.apk
+++ /dev/null
@@ -1 +0,0 @@
-../../../../../../packages/modules/ArtPrebuilt/iorap/test/iorap_test_app_v3.apk
\ No newline at end of file
diff --git a/startop/iorap/src/com/google/android/startop/iorap/DexOptEvent.java b/startop/iorap/src/com/google/android/startop/iorap/DexOptEvent.java
new file mode 100644
index 0000000..72c5eaa
--- /dev/null
+++ b/startop/iorap/src/com/google/android/startop/iorap/DexOptEvent.java
@@ -0,0 +1,114 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.android.startop.iorap;
+
+import android.annotation.NonNull;
+import android.os.Parcelable;
+import android.os.Parcel;
+
+import android.annotation.IntDef;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.util.Objects;
+
+/**
+ * Notifications for iorapd specifying when a package is updated by dexopt service.<br /><br />
+ *
+ * @hide
+ */
+public class DexOptEvent implements Parcelable {
+    public static final int TYPE_PACKAGE_UPDATE = 0;
+    private static final int TYPE_MAX = 0;
+
+    /** @hide */
+    @IntDef(flag = true, prefix = { "TYPE_" }, value = {
+            TYPE_PACKAGE_UPDATE,
+    })
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface Type {}
+
+    @Type public final int type;
+    public final String packageName;
+
+    @NonNull
+    public static DexOptEvent createPackageUpdate(String packageName) {
+        return new DexOptEvent(TYPE_PACKAGE_UPDATE, packageName);
+    }
+
+    private DexOptEvent(@Type int type, String packageName) {
+        this.type = type;
+        this.packageName = packageName;
+
+        checkConstructorArguments();
+    }
+
+    private void checkConstructorArguments() {
+        CheckHelpers.checkTypeInRange(type, TYPE_MAX);
+        Objects.requireNonNull(packageName, "packageName");
+    }
+
+    @Override
+    public String toString() {
+        return String.format("{DexOptEvent: packageName: %s}", packageName);
+    }
+
+    @Override
+    public boolean equals(Object other) {
+        if (this == other) {
+            return true;
+        } else if (other instanceof DexOptEvent) {
+            return equals((DexOptEvent) other);
+        }
+        return false;
+    }
+
+    private boolean equals(DexOptEvent other) {
+        return packageName.equals(other.packageName);
+    }
+
+    //<editor-fold desc="Binder boilerplate">
+    @Override
+    public void writeToParcel(Parcel out, int flags) {
+        out.writeInt(type);
+        out.writeString(packageName);
+    }
+
+    private DexOptEvent(Parcel in) {
+        this.type = in.readInt();
+        this.packageName = in.readString();
+
+        checkConstructorArguments();
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    public static final Parcelable.Creator<DexOptEvent> CREATOR
+            = new Parcelable.Creator<DexOptEvent>() {
+        public DexOptEvent createFromParcel(Parcel in) {
+            return new DexOptEvent(in);
+        }
+
+        public DexOptEvent[] newArray(int size) {
+            return new DexOptEvent[size];
+        }
+    };
+    //</editor-fold>
+}
diff --git a/startop/iorap/src/com/google/android/startop/iorap/IorapForwardingService.java b/startop/iorap/src/com/google/android/startop/iorap/IorapForwardingService.java
index 0c25cfb..8f1d0ad 100644
--- a/startop/iorap/src/com/google/android/startop/iorap/IorapForwardingService.java
+++ b/startop/iorap/src/com/google/android/startop/iorap/IorapForwardingService.java
@@ -324,6 +324,11 @@
             String[] updated = updatedPackages.toArray(new String[0]);
             for (String packageName : updated) {
                 Log.d(TAG, "onPackagesUpdated: " + packageName);
+                invokeRemote(mIorapRemote,
+                    (IIorap remote) ->
+                        remote.onDexOptEvent(RequestId.nextValueForSequence(),
+                                DexOptEvent.createPackageUpdate(packageName))
+                );
             }
         }
     }
diff --git a/telecomm/java/android/telecom/Conference.java b/telecomm/java/android/telecom/Conference.java
index 4e14fd3..d960552 100644
--- a/telecomm/java/android/telecom/Conference.java
+++ b/telecomm/java/android/telecom/Conference.java
@@ -106,6 +106,7 @@
     private int mCallerDisplayNamePresentation;
     private int mCallDirection;
     private boolean mRingbackRequested = false;
+    private boolean mIsMultiparty = true;
 
     private final Connection.Listener mConnectionDeathListener = new Connection.Listener() {
         @Override
@@ -998,8 +999,8 @@
     public void onExtrasChanged(Bundle extras) {}
 
     /**
-     * Set whether Telecom should treat this {@link Conference} as a conference call or if it
-     * should treat it as a single-party call.
+     * Set whether Telecom should treat this {@link Conference} as a multiparty conference call or
+     * if it should treat it as a single-party call.
      * This method is used as part of a workaround regarding IMS conference calls and user
      * expectation.  In IMS, once a conference is formed, the UE is connected to an IMS conference
      * server.  If all participants of the conference drop out of the conference except for one, the
@@ -1020,6 +1021,7 @@
     @TestApi
     @RequiresPermission(MODIFY_PHONE_STATE)
     public void setConferenceState(boolean isConference) {
+        mIsMultiparty = isConference;
         for (Listener l : mListeners) {
             l.onConferenceStateChanged(this, isConference);
         }
@@ -1043,6 +1045,20 @@
         }
     }
 
+    /**
+     * Determines if the {@link Conference} is considered "multiparty" or not.  By default all
+     * conferences are considered multiparty.  A multiparty conference is one where there are
+     * multiple conference participants (other than the host) in the conference.
+     * This is tied to {@link #setConferenceState(boolean)}, which is used for some use cases to
+     * have a conference appear as if it is a standalone call, in which case the conference will
+     * no longer be multiparty.
+     * @return {@code true} if conference is treated as a conference (i.e. it is multiparty),
+     * {@code false} if it should emulate a standalone call (i.e. not multiparty).
+     * @hide
+     */
+    public boolean isMultiparty() {
+        return mIsMultiparty;
+    }
 
     /**
      * Sets the address of this {@link Conference}.  Used when {@link #setConferenceState(boolean)}
diff --git a/telecomm/java/android/telecom/Connection.java b/telecomm/java/android/telecom/Connection.java
index 9dfa3ac..fa99095 100755
--- a/telecomm/java/android/telecom/Connection.java
+++ b/telecomm/java/android/telecom/Connection.java
@@ -734,6 +734,31 @@
             "android.telecom.extra.ORIGINAL_CONNECTION_ID";
 
     /**
+     * Extra key set on a {@link Connection} when it was created via a remote connection service.
+     * For example, if a connection manager requests a remote connection service to create a call
+     * using one of the remote connection service's phone account handle, this extra will be set so
+     * that Telecom knows that the wrapped remote connection originated in a remote connection
+     * service.  We stash this in the extras since connection managers will typically copy the
+     * extras from a {@link RemoteConnection} to a {@link Connection} (there is ultimately not
+     * other way to relate a {@link RemoteConnection} to a {@link Connection}.
+     * @hide
+     */
+    public static final String EXTRA_REMOTE_PHONE_ACCOUNT_HANDLE =
+            "android.telecom.extra.REMOTE_PHONE_ACCOUNT_HANDLE";
+
+    /**
+     * Extra key set from a {@link ConnectionService} when using the remote connection APIs
+     * (e.g. {@link RemoteConnectionService#createRemoteConnection(PhoneAccountHandle,
+     * ConnectionRequest, boolean)}) to create a remote connection.  Provides the receiving
+     * {@link ConnectionService} with a means to know the package name of the requesting
+     * {@link ConnectionService} so that {@link #EXTRA_REMOTE_PHONE_ACCOUNT_HANDLE} can be set for
+     * better visibility in Telecom of where a connection ultimately originated.
+     * @hide
+     */
+    public static final String EXTRA_REMOTE_CONNECTION_ORIGINATING_PACKAGE_NAME =
+            "android.telecom.extra.REMOTE_CONNECTION_ORIGINATING_PACKAGE_NAME";
+
+    /**
      * Boolean connection extra key set on the extras passed to
      * {@link Connection#sendConnectionEvent} which indicates that audio is present
      * on the RTT call when the extra value is true.
diff --git a/telecomm/java/android/telecom/ConnectionService.java b/telecomm/java/android/telecom/ConnectionService.java
index 73296986..a716b37 100755
--- a/telecomm/java/android/telecom/ConnectionService.java
+++ b/telecomm/java/android/telecom/ConnectionService.java
@@ -1859,9 +1859,25 @@
                     new DisconnectCause(DisconnectCause.ERROR, "IMPL_RETURNED_NULL_CONFERENCE"),
                     request.getAccountHandle());
         }
-        if (conference.getExtras() != null) {
-            conference.getExtras().putString(Connection.EXTRA_ORIGINAL_CONNECTION_ID, callId);
+
+        Bundle extras = request.getExtras();
+        Bundle newExtras = new Bundle();
+        newExtras.putString(Connection.EXTRA_ORIGINAL_CONNECTION_ID, callId);
+        if (extras != null) {
+            // If the request originated from a remote connection service, we will add some
+            // tracking information that Telecom can use to keep informed of which package
+            // made the remote request, and which remote connection service was used.
+            if (extras.containsKey(Connection.EXTRA_REMOTE_CONNECTION_ORIGINATING_PACKAGE_NAME)) {
+                newExtras.putString(
+                        Connection.EXTRA_REMOTE_CONNECTION_ORIGINATING_PACKAGE_NAME,
+                        extras.getString(
+                                Connection.EXTRA_REMOTE_CONNECTION_ORIGINATING_PACKAGE_NAME));
+                newExtras.putParcelable(Connection.EXTRA_REMOTE_PHONE_ACCOUNT_HANDLE,
+                        request.getAccountHandle());
+            }
         }
+        conference.putExtras(newExtras);
+
         mConferenceById.put(callId, conference);
         mIdByConference.put(conference, callId);
         conference.addListener(mConferenceListener);
@@ -1936,6 +1952,30 @@
             Log.i(this, "createConnection, implementation returned null connection.");
             connection = Connection.createFailedConnection(
                     new DisconnectCause(DisconnectCause.ERROR, "IMPL_RETURNED_NULL_CONNECTION"));
+        } else {
+            try {
+                Bundle extras = request.getExtras();
+                if (extras != null) {
+                    // If the request originated from a remote connection service, we will add some
+                    // tracking information that Telecom can use to keep informed of which package
+                    // made the remote request, and which remote connection service was used.
+                    if (extras.containsKey(
+                            Connection.EXTRA_REMOTE_CONNECTION_ORIGINATING_PACKAGE_NAME)) {
+                        Bundle newExtras = new Bundle();
+                        newExtras.putString(
+                                Connection.EXTRA_REMOTE_CONNECTION_ORIGINATING_PACKAGE_NAME,
+                                extras.getString(
+                                        Connection.EXTRA_REMOTE_CONNECTION_ORIGINATING_PACKAGE_NAME
+                                ));
+                        newExtras.putParcelable(Connection.EXTRA_REMOTE_PHONE_ACCOUNT_HANDLE,
+                                request.getAccountHandle());
+                        connection.putExtras(newExtras);
+                    }
+                }
+            } catch (UnsupportedOperationException ose) {
+                // Do nothing; if the ConnectionService reported a failure it will be an instance
+                // of an immutable Connection which we cannot edit, so we're out of luck.
+            }
         }
 
         boolean isSelfManaged =
@@ -2505,6 +2545,11 @@
             mAdapter.addConferenceCall(id, parcelableConference);
             mAdapter.setVideoProvider(id, conference.getVideoProvider());
             mAdapter.setVideoState(id, conference.getVideoState());
+            // In some instances a conference can start its life as a standalone call with just a
+            // single participant; ensure we signal to Telecom in this case.
+            if (!conference.isMultiparty()) {
+                mAdapter.setConferenceState(id, conference.isMultiparty());
+            }
 
             // Go through any child calls and set the parent.
             for (Connection connection : conference.getConnections()) {
diff --git a/telecomm/java/android/telecom/GatewayInfo.java b/telecomm/java/android/telecom/GatewayInfo.java
index 0faa4fd..31c24d5 100644
--- a/telecomm/java/android/telecom/GatewayInfo.java
+++ b/telecomm/java/android/telecom/GatewayInfo.java
@@ -111,7 +111,7 @@
     @Override
     public void writeToParcel(Parcel destination, int flags) {
         destination.writeString(mGatewayProviderPackageName);
-        mGatewayAddress.writeToParcel(destination, 0);
-        mOriginalAddress.writeToParcel(destination, 0);
+        Uri.writeToParcel(destination, mGatewayAddress);
+        Uri.writeToParcel(destination, mOriginalAddress);
     }
 }
diff --git a/telecomm/java/android/telecom/Logging/Session.java b/telecomm/java/android/telecom/Logging/Session.java
index d82e93f..8d3f4e1 100644
--- a/telecomm/java/android/telecom/Logging/Session.java
+++ b/telecomm/java/android/telecom/Logging/Session.java
@@ -427,7 +427,7 @@
             StringBuilder methodName = new StringBuilder();
             methodName.append(getFullMethodPath(false /*truncatePath*/));
             if (mOwnerInfo != null && !mOwnerInfo.isEmpty()) {
-                methodName.append("(InCall package: ");
+                methodName.append("(");
                 methodName.append(mOwnerInfo);
                 methodName.append(")");
             }
diff --git a/telecomm/java/android/telecom/ParcelableCall.java b/telecomm/java/android/telecom/ParcelableCall.java
index 415a817..182dc8b 100644
--- a/telecomm/java/android/telecom/ParcelableCall.java
+++ b/telecomm/java/android/telecom/ParcelableCall.java
@@ -629,7 +629,7 @@
             int capabilities = source.readInt();
             int properties = source.readInt();
             long connectTimeMillis = source.readLong();
-            Uri handle = source.readParcelable(classLoader);
+            Uri handle = Uri.CREATOR.createFromParcel(source);
             int handlePresentation = source.readInt();
             String callerDisplayName = source.readString();
             int callerDisplayNamePresentation = source.readInt();
@@ -711,7 +711,7 @@
         destination.writeInt(mCapabilities);
         destination.writeInt(mProperties);
         destination.writeLong(mConnectTimeMillis);
-        destination.writeParcelable(mHandle, 0);
+        Uri.writeToParcel(destination, mHandle);
         destination.writeInt(mHandlePresentation);
         destination.writeString(mCallerDisplayName);
         destination.writeInt(mCallerDisplayNamePresentation);
diff --git a/telecomm/java/android/telecom/RemoteConnectionService.java b/telecomm/java/android/telecom/RemoteConnectionService.java
index cad5b70..a083301 100644
--- a/telecomm/java/android/telecom/RemoteConnectionService.java
+++ b/telecomm/java/android/telecom/RemoteConnectionService.java
@@ -258,6 +258,9 @@
             // See comments on Connection.EXTRA_ORIGINAL_CONNECTION_ID for more information.
             Bundle newExtras = new Bundle();
             newExtras.putString(Connection.EXTRA_ORIGINAL_CONNECTION_ID, callId);
+            // Track the fact this request was relayed through the remote connection service.
+            newExtras.putParcelable(Connection.EXTRA_REMOTE_PHONE_ACCOUNT_HANDLE,
+                    parcel.getPhoneAccount());
             conference.putExtras(newExtras);
 
             conference.registerCallback(new RemoteConference.Callback() {
@@ -383,6 +386,11 @@
             RemoteConnection remoteConnection = new RemoteConnection(callId,
                     mOutgoingConnectionServiceRpc, connection, callingPackage,
                     callingTargetSdkVersion);
+            // Track that it is via a remote connection.
+            Bundle newExtras = new Bundle();
+            newExtras.putParcelable(Connection.EXTRA_REMOTE_PHONE_ACCOUNT_HANDLE,
+                    connection.getPhoneAccount());
+            remoteConnection.putExtras(newExtras);
             mConnectionById.put(callId, remoteConnection);
             remoteConnection.registerCallback(new RemoteConnection.Callback() {
                 @Override
@@ -535,10 +543,20 @@
             ConnectionRequest request,
             boolean isIncoming) {
         final String id = UUID.randomUUID().toString();
+        Bundle extras = new Bundle();
+        if (request.getExtras() != null) {
+            extras.putAll(request.getExtras());
+        }
+        // We will set the package name for the originator of the remote request; this lets the
+        // receiving ConnectionService know that the request originated from a remote connection
+        // service so that it can provide tracking information for Telecom.
+        extras.putString(Connection.EXTRA_REMOTE_CONNECTION_ORIGINATING_PACKAGE_NAME,
+                mOurConnectionServiceImpl.getApplicationContext().getOpPackageName());
+
         final ConnectionRequest newRequest = new ConnectionRequest.Builder()
                 .setAccountHandle(request.getAccountHandle())
                 .setAddress(request.getAddress())
-                .setExtras(request.getExtras())
+                .setExtras(extras)
                 .setVideoState(request.getVideoState())
                 .setRttPipeFromInCall(request.getRttPipeFromInCall())
                 .setRttPipeToInCall(request.getRttPipeToInCall())
diff --git a/telecomm/java/android/telecom/TelecomManager.java b/telecomm/java/android/telecom/TelecomManager.java
index b974c56..0983db6 100644
--- a/telecomm/java/android/telecom/TelecomManager.java
+++ b/telecomm/java/android/telecom/TelecomManager.java
@@ -2218,15 +2218,23 @@
     @NonNull
     public Intent createLaunchEmergencyDialerIntent(@Nullable String number) {
         ITelecomService service = getTelecomService();
-        Intent result = null;
         if (service != null) {
             try {
-                result = service.createLaunchEmergencyDialerIntent(number);
+                return service.createLaunchEmergencyDialerIntent(number);
             } catch (RemoteException e) {
                 Log.e(TAG, "Error createLaunchEmergencyDialerIntent", e);
             }
+        } else {
+            Log.w(TAG, "createLaunchEmergencyDialerIntent - Telecom service not available.");
         }
-        return result;
+
+        // Telecom service knows the package name of the expected emergency dialer package; if it
+        // is not available, then fallback to not targeting a specific package.
+        Intent intent = new Intent(Intent.ACTION_DIAL_EMERGENCY);
+        if (!TextUtils.isEmpty(number) && TextUtils.isDigitsOnly(number)) {
+            intent.setData(Uri.fromParts(PhoneAccount.SCHEME_TEL, number, null));
+        }
+        return intent;
     }
 
     /**
diff --git a/telephony/framework-telephony-jarjar-rules.txt b/telephony/framework-telephony-jarjar-rules.txt
deleted file mode 100644
index 212eba1..0000000
--- a/telephony/framework-telephony-jarjar-rules.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-rule android.telephony.Annotation* android.telephony.framework.Annotation@1
-rule android.util.RecurrenceRule* android.telephony.RecurrenceRule@1
-rule com.android.i18n.phonenumbers.** com.android.telephony.framework.phonenumbers.@1
-rule com.android.internal.os.SomeArgs* android.telephony.SomeArgs@1
-rule com.android.internal.util.BitwiseInputStream* android.telephony.BitwiseInputStream@1
-rule com.android.internal.util.BitwiseOutputStream* android.telephony.BitwiseOutputStream@1
-rule com.android.internal.util.Preconditions* android.telephony.Preconditions@1
-rule com.android.internal.util.IndentingPrintWriter* android.telephony.IndentingPrintWriter@1
-rule com.android.internal.util.HexDump* android.telephony.HexDump@1
diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java
index 7f6e123..d2de19a 100755
--- a/telephony/java/android/telephony/CarrierConfigManager.java
+++ b/telephony/java/android/telephony/CarrierConfigManager.java
@@ -505,6 +505,15 @@
     public static final String KEY_CARRIER_VT_AVAILABLE_BOOL = "carrier_vt_available_bool";
 
     /**
+     * Flag specifying whether to show an alert dialog for 5G disable when the user disables VoLTE.
+     * By default this value is {@code false}.
+     *
+     * @hide
+     */
+    public static final String KEY_VOLTE_5G_LIMITED_ALERT_DIALOG_BOOL =
+            "volte_5g_limited_alert_dialog_bool";
+
+    /**
      * Flag specifying whether the carrier wants to notify the user when a VT call has been handed
      * over from WIFI to LTE.
      * <p>
@@ -2529,6 +2538,16 @@
             "parameters_use_for_5g_nr_signal_bar_int";
 
     /**
+     * There are two signal strengths, NR and LTE signal strength, during NR (non-standalone).
+     * Boolean indicating whether to use LTE signal strength as primary during NR (non-standalone).
+     * By default this value is true.
+     *
+     * @hide
+     */
+    public static final String KEY_SIGNAL_STRENGTH_NR_NSA_USE_LTE_AS_PRIMARY_BOOL =
+            "signal_strength_nr_nsa_use_lte_as_primary_bool";
+
+    /**
      * String array of default bandwidth values per network type.
      * The entries should be of form "network_name:downstream,upstream", with values in Kbps.
      * @hide
@@ -3074,6 +3093,16 @@
     public static final String KEY_UNMETERED_NR_NSA_SUB6_BOOL = "unmetered_nr_nsa_sub6_bool";
 
     /**
+     * Whether NR (non-standalone) should be unmetered when the device is roaming.
+     * If false, then the values for {@link #KEY_UNMETERED_NR_NSA_BOOL},
+     * {@link #KEY_UNMETERED_NR_NSA_MMWAVE_BOOL}, {@link #KEY_UNMETERED_NR_NSA_SUB6_BOOL},
+     * and unmetered {@link SubscriptionPlan} will be ignored.
+     * @hide
+     */
+    public static final String KEY_UNMETERED_NR_NSA_WHEN_ROAMING_BOOL =
+            "unmetered_nr_nsa_when_roaming_bool";
+
+    /**
      * Whether NR (standalone) should be unmetered for all frequencies.
      * If either {@link #KEY_UNMETERED_NR_SA_MMWAVE_BOOL} or
      * {@link #KEY_UNMETERED_NR_SA_SUB6_BOOL} are true, then this value will be ignored.
@@ -3693,6 +3722,7 @@
         sDefaults.putBoolean(KEY_CARRIER_SETTINGS_ENABLE_BOOL, false);
         sDefaults.putBoolean(KEY_CARRIER_VOLTE_AVAILABLE_BOOL, false);
         sDefaults.putBoolean(KEY_CARRIER_VT_AVAILABLE_BOOL, false);
+        sDefaults.putBoolean(KEY_VOLTE_5G_LIMITED_ALERT_DIALOG_BOOL, false);
         sDefaults.putBoolean(KEY_NOTIFY_HANDOVER_VIDEO_FROM_WIFI_TO_LTE_BOOL, false);
         sDefaults.putBoolean(KEY_ALLOW_MERGING_RTT_CALLS_BOOL, false);
         sDefaults.putBoolean(KEY_NOTIFY_HANDOVER_VIDEO_FROM_LTE_TO_WIFI_BOOL, false);
@@ -4095,6 +4125,7 @@
                 });
         sDefaults.putInt(KEY_PARAMETERS_USE_FOR_5G_NR_SIGNAL_BAR_INT,
                 CellSignalStrengthNr.USE_SSRSRP);
+        sDefaults.putBoolean(KEY_SIGNAL_STRENGTH_NR_NSA_USE_LTE_AS_PRIMARY_BOOL, true);
         sDefaults.putStringArray(KEY_BANDWIDTH_STRING_ARRAY, new String[]{
                 "GPRS:24,24", "EDGE:70,18", "UMTS:115,115", "CDMA-IS95A:14,14", "CDMA-IS95B:14,14",
                 "1xRTT:30,30", "EvDo-rev.0:750,48", "EvDo-rev.A:950,550", "HSDPA:4300,620",
@@ -4123,6 +4154,7 @@
         sDefaults.putBoolean(KEY_UNMETERED_NR_NSA_BOOL, false);
         sDefaults.putBoolean(KEY_UNMETERED_NR_NSA_MMWAVE_BOOL, false);
         sDefaults.putBoolean(KEY_UNMETERED_NR_NSA_SUB6_BOOL, false);
+        sDefaults.putBoolean(KEY_UNMETERED_NR_NSA_WHEN_ROAMING_BOOL, false);
         sDefaults.putBoolean(KEY_UNMETERED_NR_SA_BOOL, false);
         sDefaults.putBoolean(KEY_UNMETERED_NR_SA_MMWAVE_BOOL, false);
         sDefaults.putBoolean(KEY_UNMETERED_NR_SA_SUB6_BOOL, false);
diff --git a/telephony/java/android/telephony/CellIdentity.java b/telephony/java/android/telephony/CellIdentity.java
index 390a79a..33a43c1 100644
--- a/telephony/java/android/telephony/CellIdentity.java
+++ b/telephony/java/android/telephony/CellIdentity.java
@@ -45,8 +45,10 @@
      */
     public static final int MCC_LENGTH = 3;
 
-    private static final int MNC_MIN_LENGTH = 2;
-    private static final int MNC_MAX_LENGTH = 3;
+    /** @hide */
+    public static final int MNC_MIN_LENGTH = 2;
+    /** @hide */
+    public static final int MNC_MAX_LENGTH = 3;
 
     // Log tag
     /** @hide */
diff --git a/telephony/java/android/telephony/SignalStrength.java b/telephony/java/android/telephony/SignalStrength.java
index 2bb4eb1..1376cdd 100644
--- a/telephony/java/android/telephony/SignalStrength.java
+++ b/telephony/java/android/telephony/SignalStrength.java
@@ -82,6 +82,8 @@
     // Effectively final. Timestamp is set during construction of SignalStrength
     private long mTimestampMillis;
 
+    private boolean mLteAsPrimaryInNrNsa = true;
+
     CellSignalStrengthCdma mCdma;
     CellSignalStrengthGsm mGsm;
     CellSignalStrengthWcdma mWcdma;
@@ -188,6 +190,10 @@
     private CellSignalStrength getPrimary() {
         // This behavior is intended to replicate the legacy behavior of getLevel() by prioritizing
         // newer faster RATs for default/for display purposes.
+
+        if (mLteAsPrimaryInNrNsa) {
+            if (mLte.isValid()) return mLte;
+        }
         if (mNr.isValid()) return mNr;
         if (mLte.isValid()) return mLte;
         if (mCdma.isValid()) return mCdma;
@@ -268,6 +274,10 @@
 
     /** @hide */
     public void updateLevel(PersistableBundle cc, ServiceState ss) {
+        if (cc != null) {
+            mLteAsPrimaryInNrNsa = cc.getBoolean(
+                    CarrierConfigManager.KEY_SIGNAL_STRENGTH_NR_NSA_USE_LTE_AS_PRIMARY_BOOL, true);
+        }
         mCdma.updateLevel(cc, ss);
         mGsm.updateLevel(cc, ss);
         mWcdma.updateLevel(cc, ss);
diff --git a/telephony/java/android/telephony/TelephonyDisplayInfo.java b/telephony/java/android/telephony/TelephonyDisplayInfo.java
index 2c4d5ae..36fa5cc 100644
--- a/telephony/java/android/telephony/TelephonyDisplayInfo.java
+++ b/telephony/java/android/telephony/TelephonyDisplayInfo.java
@@ -154,7 +154,14 @@
         return Objects.hash(mNetworkType, mOverrideNetworkType);
     }
 
-    private static String overrideNetworkTypeToString(@OverrideNetworkType int type) {
+    /**
+     * Convert override network type to string.
+     *
+     * @param type Override network type
+     * @return Override network type in string format
+     * @hide
+     */
+    public static String overrideNetworkTypeToString(@OverrideNetworkType int type) {
         switch (type) {
             case OVERRIDE_NETWORK_TYPE_NONE: return "NONE";
             case OVERRIDE_NETWORK_TYPE_LTE_CA: return "LTE_CA";
@@ -168,6 +175,6 @@
     @Override
     public String toString() {
         return "TelephonyDisplayInfo {network=" + TelephonyManager.getNetworkTypeName(mNetworkType)
-                + ", override=" + overrideNetworkTypeToString(mOverrideNetworkType);
+                + ", override=" + overrideNetworkTypeToString(mOverrideNetworkType) + "}";
     }
 }
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index f623649..835ef59 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -13250,4 +13250,21 @@
     public static void enableServiceHandleCaching() {
         sServiceHandleCacheEnabled = true;
     }
+
+    /**
+     * Whether device can connect to 5G network when two SIMs are active.
+     * @hide
+     * TODO b/153669716: remove or make system API.
+     */
+    public boolean canConnectTo5GInDsdsMode() {
+        ITelephony telephony = getITelephony();
+        if (telephony == null) return true;
+        try {
+            return telephony.canConnectTo5GInDsdsMode();
+        } catch (RemoteException ex) {
+            return true;
+        } catch (NullPointerException ex) {
+            return true;
+        }
+    }
 }
diff --git a/telephony/java/android/telephony/data/DataCallResponse.java b/telephony/java/android/telephony/data/DataCallResponse.java
index a116c07..242c2e9 100644
--- a/telephony/java/android/telephony/data/DataCallResponse.java
+++ b/telephony/java/android/telephony/data/DataCallResponse.java
@@ -80,7 +80,6 @@
     private final int mMtu;
     private final int mMtuV4;
     private final int mMtuV6;
-    private final int mVersion;
 
     /**
      * @param cause Data call fail cause. {@link DataFailCause#NONE} indicates no error.
@@ -126,9 +125,7 @@
                 ? new ArrayList<>() : new ArrayList<>(gatewayAddresses);
         mPcscfAddresses = (pcscfAddresses == null)
                 ? new ArrayList<>() : new ArrayList<>(pcscfAddresses);
-        mMtu = mtu;
-        mMtuV4 = mMtuV6 = 0;
-        mVersion = 0;
+        mMtu = mMtuV4 = mMtuV6 = mtu;
     }
 
     /** @hide */
@@ -136,7 +133,7 @@
             @LinkStatus int linkStatus, @ProtocolType int protocolType,
             @Nullable String interfaceName, @Nullable List<LinkAddress> addresses,
             @Nullable List<InetAddress> dnsAddresses, @Nullable List<InetAddress> gatewayAddresses,
-            @Nullable List<InetAddress> pcscfAddresses, int mtuV4, int mtuV6, int version) {
+            @Nullable List<InetAddress> pcscfAddresses, int mtu, int mtuV4, int mtuV6) {
         mCause = cause;
         mSuggestedRetryTime = suggestedRetryTime;
         mId = id;
@@ -151,10 +148,9 @@
                 ? new ArrayList<>() : new ArrayList<>(gatewayAddresses);
         mPcscfAddresses = (pcscfAddresses == null)
                 ? new ArrayList<>() : new ArrayList<>(pcscfAddresses);
-        mMtu = 0;
+        mMtu = mtu;
         mMtuV4 = mtuV4;
         mMtuV6 = mtuV6;
-        mVersion = version;
     }
 
     /** @hide */
@@ -177,7 +173,6 @@
         mMtu = source.readInt();
         mMtuV4 = source.readInt();
         mMtuV6 = source.readInt();
-        mVersion = source.readInt();
     }
 
     /**
@@ -247,7 +242,7 @@
      */
     @Deprecated
     public int getMtu() {
-        return mVersion < 5 ? mMtu : 0;
+        return mMtu;
     }
 
     /**
@@ -256,7 +251,7 @@
      * Zero or negative values means network has either not sent a value or sent an invalid value.
      */
     public int getMtuV4() {
-        return mVersion < 5 ? 0 : mMtuV4;
+        return mMtuV4;
     }
 
     /**
@@ -264,7 +259,7 @@
      * Zero or negative values means network has either not sent a value or sent an invalid value.
      */
     public int getMtuV6() {
-        return mVersion < 5 ? 0 : mMtuV6;
+        return mMtuV6;
     }
 
     @NonNull
@@ -282,10 +277,9 @@
            .append(" dnses=").append(mDnsAddresses)
            .append(" gateways=").append(mGatewayAddresses)
            .append(" pcscf=").append(mPcscfAddresses)
-           .append(" mtu=").append(mMtu)
-           .append(" mtuV4=").append(mMtuV4)
-           .append(" mtuV6=").append(mMtuV6)
-           .append(" version=").append(mVersion)
+           .append(" mtu=").append(getMtu())
+           .append(" mtuV4=").append(getMtuV4())
+           .append(" mtuV6=").append(getMtuV6())
            .append("}");
         return sb.toString();
     }
@@ -315,15 +309,14 @@
                 && mPcscfAddresses.containsAll(other.mPcscfAddresses)
                 && mMtu == other.mMtu
                 && mMtuV4 == other.mMtuV4
-                && mMtuV6 == other.mMtuV6
-                && mVersion == other.mVersion;
+                && mMtuV6 == other.mMtuV6;
     }
 
     @Override
     public int hashCode() {
         return Objects.hash(mCause, mSuggestedRetryTime, mId, mLinkStatus, mProtocolType,
                 mInterfaceName, mAddresses, mDnsAddresses, mGatewayAddresses, mPcscfAddresses,
-                mMtu, mMtuV4, mMtuV6, mVersion);
+                mMtu, mMtuV4, mMtuV6);
     }
 
     @Override
@@ -346,7 +339,6 @@
         dest.writeInt(mMtu);
         dest.writeInt(mMtuV4);
         dest.writeInt(mMtuV6);
-        dest.writeInt(mVersion);
     }
 
     public static final @android.annotation.NonNull Parcelable.Creator<DataCallResponse> CREATOR =
@@ -403,8 +395,6 @@
 
         private int mMtuV6;
 
-        private int mVersion;
-
         /**
          * Default constructor for Builder.
          */
@@ -563,29 +553,14 @@
         }
 
         /**
-         * Set the IRadio version for this DataCallResponse
-         * @hide
-         */
-        public @NonNull Builder setVersion(int version) {
-            mVersion = version;
-            return this;
-        }
-
-        /**
          * Build the DataCallResponse.
          *
          * @return the DataCallResponse object.
          */
         public @NonNull DataCallResponse build() {
-            if (mVersion >= 5) {
-                return new DataCallResponse(mCause, mSuggestedRetryTime, mId, mLinkStatus,
-                        mProtocolType, mInterfaceName, mAddresses, mDnsAddresses, mGatewayAddresses,
-                        mPcscfAddresses, mMtuV4, mMtuV6, mVersion);
-            } else {
-                return new DataCallResponse(mCause, mSuggestedRetryTime, mId, mLinkStatus,
-                        mProtocolType, mInterfaceName, mAddresses, mDnsAddresses, mGatewayAddresses,
-                        mPcscfAddresses, mMtu);
-            }
+            return new DataCallResponse(mCause, mSuggestedRetryTime, mId, mLinkStatus,
+                    mProtocolType, mInterfaceName, mAddresses, mDnsAddresses, mGatewayAddresses,
+                    mPcscfAddresses, mMtu, mMtuV4, mMtuV6);
         }
     }
 }
diff --git a/telephony/java/android/telephony/ims/ImsRcsManager.java b/telephony/java/android/telephony/ims/ImsRcsManager.java
index 151fb59..ede67dd 100644
--- a/telephony/java/android/telephony/ims/ImsRcsManager.java
+++ b/telephony/java/android/telephony/ims/ImsRcsManager.java
@@ -49,7 +49,7 @@
  *
  * Use {@link ImsManager#getImsRcsManager(int)} to create an instance of this manager.
  */
-public class ImsRcsManager implements RegistrationManager {
+public class ImsRcsManager {
     private static final String TAG = "ImsRcsManager";
 
     /**
@@ -173,11 +173,11 @@
     /**
      * @hide
      */
-    @Override
+    // @Override add back to RegistrationManager interface once public.
     @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
     public void registerImsRegistrationCallback(
             @NonNull @CallbackExecutor Executor executor,
-            @NonNull RegistrationCallback c)
+            @NonNull RegistrationManager.RegistrationCallback c)
             throws ImsException {
         if (c == null) {
             throw new IllegalArgumentException("Must include a non-null RegistrationCallback.");
@@ -204,7 +204,7 @@
     /**
      * @hide
      */
-    @Override
+    // @Override add back to RegistrationManager interface once public.
     @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
     public void unregisterImsRegistrationCallback(
             @NonNull RegistrationManager.RegistrationCallback c) {
@@ -228,10 +228,10 @@
     /**
      * @hide
      */
-    @Override
+    // @Override add back to RegistrationManager interface once public.
     @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
     public void getRegistrationState(@NonNull @CallbackExecutor Executor executor,
-            @NonNull @ImsRegistrationState Consumer<Integer> stateCallback) {
+            @NonNull @RegistrationManager.ImsRegistrationState Consumer<Integer> stateCallback) {
         if (stateCallback == null) {
             throw new IllegalArgumentException("Must include a non-null stateCallback.");
         }
@@ -260,7 +260,6 @@
     /**
      * @hide
      */
-    @Override
     @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
     public void getRegistrationTransportType(@NonNull @CallbackExecutor Executor executor,
             @NonNull @AccessNetworkConstants.TransportType
@@ -347,8 +346,7 @@
      * inactive subscription, it will result in a no-op.
      * @param c The RCS {@link AvailabilityCallback} to be removed.
      * @see #registerRcsAvailabilityCallback(Executor, AvailabilityCallback)
-     * @throws ImsException if the IMS service is not available when calling this method
-     * {@link ImsRcsController#unregisterRcsAvailabilityCallback()}.
+     * @throws ImsException if the IMS service is not available when calling this method.
      * See {@link ImsException#getCode()} for more information on the error codes.
      * @hide
      */
@@ -390,8 +388,7 @@
      * rather the subscription is capable of this service over IMS.
      * @see #isAvailable(int)
      * @see android.telephony.CarrierConfigManager#KEY_USE_RCS_PRESENCE_BOOL
-     * @throws ImsException if the IMS service is not available when calling this method
-     * {@link ImsRcsController#isCapable(int, int)}.
+     * @throws ImsException if the IMS service is not available when calling this method.
      * See {@link ImsException#getCode()} for more information on the error codes.
      * @hide
      */
@@ -424,9 +421,8 @@
      * @return true if the RCS capability is currently available for the associated subscription,
      * false otherwise. If the capability is available, IMS is registered and the service is
      * currently available over IMS.
-     * @see #isCapable(int)
-     * @throws ImsException if the IMS service is not available when calling this method
-     * {@link ImsRcsController#isAvailable(int, int)}.
+     * @see #isCapable(int, int)
+     * @throws ImsException if the IMS service is not available when calling this method.
      * See {@link ImsException#getCode()} for more information on the error codes.
      * @hide
      */
diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl
index 43aeb19..f5cd68f 100644
--- a/telephony/java/com/android/internal/telephony/ITelephony.aidl
+++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl
@@ -2268,4 +2268,9 @@
      * @return operatorinfo on success
      */
     String getManualNetworkSelectionPlmn(int subId);
+
+    /**
+     * Whether device can connect to 5G network when two SIMs are active.
+     */
+    boolean canConnectTo5GInDsdsMode();
 }
diff --git a/telephony/java/com/android/internal/telephony/SmsHeader.java b/telephony/java/com/android/internal/telephony/SmsHeader.java
index ab3fdf4..2f3897b 100644
--- a/telephony/java/com/android/internal/telephony/SmsHeader.java
+++ b/telephony/java/com/android/internal/telephony/SmsHeader.java
@@ -23,6 +23,8 @@
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Objects;
 
 /**
  * SMS user data header, as specified in TS 23.040 9.2.3.24.
@@ -71,6 +73,25 @@
     public static final int PORT_WAP_PUSH = 2948;
     public static final int PORT_WAP_WSP  = 9200;
 
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        SmsHeader smsHeader = (SmsHeader) o;
+        return languageTable == smsHeader.languageTable
+                && languageShiftTable == smsHeader.languageShiftTable
+                && Objects.equals(portAddrs, smsHeader.portAddrs)
+                && Objects.equals(concatRef, smsHeader.concatRef)
+                && Objects.equals(specialSmsMsgList, smsHeader.specialSmsMsgList)
+                && Objects.equals(miscEltList, smsHeader.miscEltList);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(portAddrs, concatRef, specialSmsMsgList, miscEltList, languageTable,
+                languageShiftTable);
+    }
+
     public static class PortAddrs {
         @UnsupportedAppUsage
         public PortAddrs() {
@@ -81,6 +102,21 @@
         @UnsupportedAppUsage
         public int origPort;
         public boolean areEightBits;
+
+        @Override
+        public boolean equals(Object o) {
+            if (this == o) return true;
+            if (o == null || getClass() != o.getClass()) return false;
+            PortAddrs portAddrs = (PortAddrs) o;
+            return destPort == portAddrs.destPort
+                    && origPort == portAddrs.origPort
+                    && areEightBits == portAddrs.areEightBits;
+        }
+
+        @Override
+        public int hashCode() {
+            return Objects.hash(destPort, origPort, areEightBits);
+        }
     }
 
     public static class ConcatRef {
@@ -95,11 +131,41 @@
         @UnsupportedAppUsage
         public int msgCount;
         public boolean isEightBits;
+
+        @Override
+        public boolean equals(Object o) {
+            if (this == o) return true;
+            if (o == null || getClass() != o.getClass()) return false;
+            ConcatRef concatRef = (ConcatRef) o;
+            return refNumber == concatRef.refNumber
+                    && seqNumber == concatRef.seqNumber
+                    && msgCount == concatRef.msgCount
+                    && isEightBits == concatRef.isEightBits;
+        }
+
+        @Override
+        public int hashCode() {
+            return Objects.hash(refNumber, seqNumber, msgCount, isEightBits);
+        }
     }
 
     public static class SpecialSmsMsg {
         public int msgIndType;
         public int msgCount;
+
+        @Override
+        public boolean equals(Object o) {
+            if (this == o) return true;
+            if (o == null || getClass() != o.getClass()) return false;
+            SpecialSmsMsg that = (SpecialSmsMsg) o;
+            return msgIndType == that.msgIndType
+                    && msgCount == that.msgCount;
+        }
+
+        @Override
+        public int hashCode() {
+            return Objects.hash(msgIndType, msgCount);
+        }
     }
 
     /**
@@ -109,6 +175,22 @@
     public static class MiscElt {
         public int id;
         public byte[] data;
+
+        @Override
+        public boolean equals(Object o) {
+            if (this == o) return true;
+            if (o == null || getClass() != o.getClass()) return false;
+            MiscElt miscElt = (MiscElt) o;
+            return id == miscElt.id
+                    && Arrays.equals(data, miscElt.data);
+        }
+
+        @Override
+        public int hashCode() {
+            int result = Objects.hash(id);
+            result = 31 * result + Arrays.hashCode(data);
+            return result;
+        }
     }
 
     @UnsupportedAppUsage
diff --git a/tests/AppLaunch/Android.bp b/tests/AppLaunch/Android.bp
index f90f26f..75db551 100644
--- a/tests/AppLaunch/Android.bp
+++ b/tests/AppLaunch/Android.bp
@@ -8,6 +8,8 @@
         "android.test.base",
         "android.test.runner",
     ],
-    static_libs: ["androidx.test.rules"],
+    static_libs: [
+        "androidx.test.rules",
+        "ub-uiautomator"],
     test_suites: ["device-tests"],
 }
diff --git a/tests/AppLaunch/src/com/android/tests/applaunch/AppLaunch.java b/tests/AppLaunch/src/com/android/tests/applaunch/AppLaunch.java
index 2d2f4db..7d750b7 100644
--- a/tests/AppLaunch/src/com/android/tests/applaunch/AppLaunch.java
+++ b/tests/AppLaunch/src/com/android/tests/applaunch/AppLaunch.java
@@ -15,6 +15,8 @@
  */
 package com.android.tests.applaunch;
 
+import static org.junit.Assert.assertNotNull;
+
 import android.accounts.Account;
 import android.accounts.AccountManager;
 import android.app.ActivityManager;
@@ -29,7 +31,9 @@
 import android.os.Bundle;
 import android.os.ParcelFileDescriptor;
 import android.os.RemoteException;
+import android.os.SystemClock;
 import android.os.UserHandle;
+import android.support.test.uiautomator.UiDevice;
 import android.test.InstrumentationTestCase;
 import android.test.InstrumentationTestRunner;
 import android.util.Log;
@@ -46,6 +50,7 @@
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.io.OutputStreamWriter;
+import java.nio.file.Paths;
 import java.time.format.DateTimeFormatter;
 import java.time.ZonedDateTime;
 import java.time.ZoneOffset;
@@ -67,6 +72,7 @@
  * in the following format:
  * -e apps <app name>^<result key>|<app name>^<result key>
  */
+@Deprecated
 public class AppLaunch extends InstrumentationTestCase {
 
     private static final int JOIN_TIMEOUT = 10000;
@@ -94,6 +100,9 @@
     private static final String KEY_TRACE_DUMPINTERVAL = "tracedump_interval";
     private static final String KEY_COMPILER_FILTERS = "compiler_filters";
     private static final String KEY_FORCE_STOP_APP = "force_stop_app";
+    private static final String ENABLE_SCREEN_RECORDING = "enable_screen_recording";
+    private static final int MAX_RECORDING_PARTS = 5;
+    private static final long VIDEO_TAIL_BUFFER = 500;
 
     private static final String SIMPLEPERF_APP_CMD =
             "simpleperf --log fatal stat --csv -e cpu-cycles,major-faults --app %s & %s";
@@ -144,14 +153,17 @@
 
     private Map<String, Intent> mNameToIntent;
     private List<LaunchOrder> mLaunchOrderList = new ArrayList<LaunchOrder>();
+    private RecordingThread mCurrentThread;
     private Map<String, String> mNameToResultKey;
     private Map<String, Map<String, List<AppLaunchResult>>> mNameToLaunchTime;
     private IActivityManager mAm;
+    private File launchSubDir = null;
     private String mSimplePerfCmd = null;
     private String mLaunchOrder = null;
     private boolean mDropCache = false;
     private int mLaunchIterations = 10;
     private boolean mForceStopApp = true;
+    private boolean mEnableRecording = false;
     private int mTraceLaunchCount = 0;
     private String mTraceDirectoryStr = null;
     private Bundle mResult = new Bundle();
@@ -166,6 +178,7 @@
     private boolean mCycleCleanUp = false;
     private boolean mTraceAll = false;
     private boolean mIterationCycle = false;
+    private UiDevice mDevice;
 
     enum IorapStatus {
         UNDEFINED,
@@ -222,7 +235,7 @@
         }
 
         try {
-            File launchSubDir = new File(launchRootDir, LAUNCH_SUB_DIRECTORY);
+            launchSubDir = new File(launchRootDir, LAUNCH_SUB_DIRECTORY);
 
             if (!launchSubDir.exists() && !launchSubDir.mkdirs()) {
                 throw new IOException("Unable to create the lauch file sub directory "
@@ -923,9 +936,16 @@
             mLaunchIterations = Integer.parseInt(launchIterations);
         }
         String forceStopApp = args.getString(KEY_FORCE_STOP_APP);
+
         if (forceStopApp != null) {
             mForceStopApp = Boolean.parseBoolean(forceStopApp);
         }
+
+        String enableRecording = args.getString(ENABLE_SCREEN_RECORDING);
+
+        if (enableRecording != null) {
+            mEnableRecording = Boolean.parseBoolean(enableRecording);
+        }
         String appList = args.getString(KEY_APPS);
         if (appList == null)
             return;
@@ -1038,6 +1058,9 @@
     private AppLaunchResult startApp(String appName, String launchReason)
             throws NameNotFoundException, RemoteException {
         Log.i(TAG, "Starting " + appName);
+        if(mEnableRecording) {
+            startRecording(appName, launchReason);
+        }
 
         Intent startIntent = mNameToIntent.get(appName);
         if (startIntent == null) {
@@ -1053,6 +1076,10 @@
         } catch (InterruptedException e) {
             // ignore
         }
+
+        if(mEnableRecording) {
+            stopRecording();
+        }
         return runnable.getResult();
     }
 
@@ -1360,4 +1387,126 @@
         }
 
     }
+
+    /**
+     * Start the screen recording while launching the app.
+     *
+     * @param appName
+     * @param launchReason
+     */
+    private void startRecording(String appName, String launchReason) {
+        Log.v(TAG, "Started Recording");
+        mCurrentThread = new RecordingThread("test-screen-record",
+                String.format("%s_%s", appName, launchReason));
+        mCurrentThread.start();
+    }
+
+    /**
+     * Stop already started screen recording.
+     */
+    private void stopRecording() {
+        // Skip if not directory.
+        if (launchSubDir == null) {
+            return;
+        }
+
+        // Add some extra time to the video end.
+        SystemClock.sleep(VIDEO_TAIL_BUFFER);
+        // Ctrl + C all screen record processes.
+        mCurrentThread.cancel();
+        // Wait for the thread to completely die.
+        try {
+            mCurrentThread.join();
+        } catch (InterruptedException ex) {
+            Log.e(TAG, "Interrupted when joining the recording thread.", ex);
+        }
+        Log.v(TAG, "Stopped Recording");
+    }
+
+    /** Returns the recording's name for part {@code part} of launch description. */
+    private File getOutputFile(String description, int part) {
+        // Omit the iteration number for the first iteration.
+        final String fileName =
+                String.format(
+                        "%s-video%s.mp4", description, part == 1 ? "" : part);
+        return Paths.get(launchSubDir.getAbsolutePath(), description).toFile();
+    }
+
+
+    /**
+     * Encapsulates the start and stop screen recording logic.
+     * Copied from ScreenRecordCollector.
+     */
+    private class RecordingThread extends Thread {
+        private final String mDescription;
+        private final List<File> mRecordings;
+
+        private boolean mContinue;
+
+        public RecordingThread(String name, String description) {
+            super(name);
+
+            mContinue = true;
+            mRecordings = new ArrayList<>();
+
+            assertNotNull("No test description provided for recording.", description);
+            mDescription = description;
+        }
+
+        @Override
+        public void run() {
+            try {
+                // Start at i = 1 to encode parts as X.mp4, X2.mp4, X3.mp4, etc.
+                for (int i = 1; i <= MAX_RECORDING_PARTS && mContinue; i++) {
+                    File output = getOutputFile(mDescription, i);
+                    Log.d(
+                            TAG,
+                            String.format("Recording screen to %s", output.getAbsolutePath()));
+                    mRecordings.add(output);
+                    // Make sure not to block on this background command in the main thread so
+                    // that the test continues to run, but block in this thread so it does not
+                    // trigger a new screen recording session before the prior one completes.
+                    getDevice().executeShellCommand(
+                                    String.format("screenrecord %s", output.getAbsolutePath()));
+                }
+            } catch (IOException e) {
+                throw new RuntimeException("Caught exception while screen recording.");
+            }
+        }
+
+        public void cancel() {
+            mContinue = false;
+
+            // Identify the screenrecord PIDs and send SIGINT 2 (Ctrl + C) to each.
+            try {
+                String[] pids = getDevice().executeShellCommand(
+                        "pidof screenrecord").split(" ");
+                for (String pid : pids) {
+                    // Avoid empty process ids, because of weird splitting behavior.
+                    if (pid.isEmpty()) {
+                        continue;
+                    }
+
+                    getDevice().executeShellCommand(
+                            String.format("kill -2 %s", pid));
+                    Log.d(
+                            TAG,
+                            String.format("Sent SIGINT 2 to screenrecord process (%s)", pid));
+                }
+            } catch (IOException e) {
+                throw new RuntimeException("Failed to kill screen recording process.");
+            }
+        }
+
+        public List<File> getRecordings() {
+            return mRecordings;
+        }
+    }
+
+    public UiDevice getDevice() {
+        if (mDevice == null) {
+            mDevice = UiDevice.getInstance(getInstrumentation());
+        }
+        return mDevice;
+    }
 }
diff --git a/tests/AutoVerify/app1/Android.bp b/tests/AutoVerify/app1/Android.bp
new file mode 100644
index 0000000..548519f
--- /dev/null
+++ b/tests/AutoVerify/app1/Android.bp
@@ -0,0 +1,11 @@
+android_app {
+    name: "AutoVerifyTest",
+    srcs: ["src/**/*.java"],
+    resource_dirs: ["res"],
+    platform_apis: true,
+    min_sdk_version: "26",
+    target_sdk_version: "26",
+    optimize: {
+        enabled: false,
+    },
+}
diff --git a/tests/AutoVerify/app1/AndroidManifest.xml b/tests/AutoVerify/app1/AndroidManifest.xml
new file mode 100644
index 0000000..d9caad4
--- /dev/null
+++ b/tests/AutoVerify/app1/AndroidManifest.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.android.test.autoverify" >
+
+    <uses-sdk android:targetSdkVersion="26" />
+
+    <application
+        android:label="@string/app_name" >
+        <activity
+            android:name=".MainActivity"
+            android:label="@string/app_name" >
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+
+            <intent-filter android:autoVerify="true">
+                <action android:name="android.intent.action.VIEW" />
+                <category android:name="android.intent.category.DEFAULT" />
+                <category android:name="android.intent.category.BROWSABLE" />
+                <data android:scheme="http" />
+                <data android:scheme="https" />
+                <data android:host="explicit.example.com" />
+            </intent-filter>
+        </activity>
+    </application>
+</manifest>
diff --git a/tests/AutoVerify/app1/res/values/strings.xml b/tests/AutoVerify/app1/res/values/strings.xml
new file mode 100644
index 0000000..e234355
--- /dev/null
+++ b/tests/AutoVerify/app1/res/values/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright 2020 The Android Open Source Project
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+
+<resources>
+    <!-- app icon label, do not translate -->
+    <string name="app_name" translatable="false">AutoVerify Test</string>
+</resources>
diff --git a/tests/AutoVerify/app1/src/com/android/test/autoverify/MainActivity.java b/tests/AutoVerify/app1/src/com/android/test/autoverify/MainActivity.java
new file mode 100644
index 0000000..09ef472
--- /dev/null
+++ b/tests/AutoVerify/app1/src/com/android/test/autoverify/MainActivity.java
@@ -0,0 +1,15 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
diff --git a/tests/AutoVerify/app2/Android.bp b/tests/AutoVerify/app2/Android.bp
new file mode 100644
index 0000000..1c6c97b
--- /dev/null
+++ b/tests/AutoVerify/app2/Android.bp
@@ -0,0 +1,11 @@
+android_app {
+    name: "AutoVerifyTest2",
+    srcs: ["src/**/*.java"],
+    resource_dirs: ["res"],
+    platform_apis: true,
+    min_sdk_version: "26",
+    target_sdk_version: "26",
+    optimize: {
+        enabled: false,
+    },
+}
diff --git a/tests/AutoVerify/app2/AndroidManifest.xml b/tests/AutoVerify/app2/AndroidManifest.xml
new file mode 100644
index 0000000..a008078
--- /dev/null
+++ b/tests/AutoVerify/app2/AndroidManifest.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.android.test.autoverify" >
+
+    <uses-sdk android:targetSdkVersion="26" />
+
+    <application
+        android:label="@string/app_name" >
+        <activity
+            android:name=".MainActivity"
+            android:label="@string/app_name" >
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+
+            <intent-filter android:autoVerify="true">
+                <action android:name="android.intent.action.VIEW" />
+                <category android:name="android.intent.category.DEFAULT" />
+                <category android:name="android.intent.category.BROWSABLE" />
+                <data android:scheme="http" />
+                <data android:scheme="https" />
+                <data android:host="explicit.example.com" />
+                <data android:host="*.wildcard.tld" />
+            </intent-filter>
+        </activity>
+    </application>
+</manifest>
diff --git a/tests/AutoVerify/app2/res/values/strings.xml b/tests/AutoVerify/app2/res/values/strings.xml
new file mode 100644
index 0000000..e234355
--- /dev/null
+++ b/tests/AutoVerify/app2/res/values/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright 2020 The Android Open Source Project
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+
+<resources>
+    <!-- app icon label, do not translate -->
+    <string name="app_name" translatable="false">AutoVerify Test</string>
+</resources>
diff --git a/tests/AutoVerify/app2/src/com/android/test/autoverify/MainActivity.java b/tests/AutoVerify/app2/src/com/android/test/autoverify/MainActivity.java
new file mode 100644
index 0000000..09ef472
--- /dev/null
+++ b/tests/AutoVerify/app2/src/com/android/test/autoverify/MainActivity.java
@@ -0,0 +1,15 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
diff --git a/tests/AutoVerify/app3/Android.bp b/tests/AutoVerify/app3/Android.bp
new file mode 100644
index 0000000..70a2b77
--- /dev/null
+++ b/tests/AutoVerify/app3/Android.bp
@@ -0,0 +1,11 @@
+android_app {
+    name: "AutoVerifyTest3",
+    srcs: ["src/**/*.java"],
+    resource_dirs: ["res"],
+    platform_apis: true,
+    min_sdk_version: "26",
+    target_sdk_version: "26",
+    optimize: {
+        enabled: false,
+    },
+}
diff --git a/tests/AutoVerify/app3/AndroidManifest.xml b/tests/AutoVerify/app3/AndroidManifest.xml
new file mode 100644
index 0000000..efaabc9
--- /dev/null
+++ b/tests/AutoVerify/app3/AndroidManifest.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.android.test.autoverify" >
+
+    <uses-sdk android:targetSdkVersion="26" />
+
+    <application
+        android:label="@string/app_name" >
+        <activity
+            android:name=".MainActivity"
+            android:label="@string/app_name" >
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+
+            <!-- does not request autoVerify -->
+            <intent-filter>
+                <action android:name="android.intent.action.VIEW" />
+                <category android:name="android.intent.category.DEFAULT" />
+                <category android:name="android.intent.category.BROWSABLE" />
+                <data android:scheme="http" />
+                <data android:scheme="https" />
+                <data android:host="explicit.example.com" />
+            </intent-filter>
+        </activity>
+    </application>
+</manifest>
diff --git a/tests/AutoVerify/app3/res/values/strings.xml b/tests/AutoVerify/app3/res/values/strings.xml
new file mode 100644
index 0000000..e234355
--- /dev/null
+++ b/tests/AutoVerify/app3/res/values/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright 2020 The Android Open Source Project
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+
+<resources>
+    <!-- app icon label, do not translate -->
+    <string name="app_name" translatable="false">AutoVerify Test</string>
+</resources>
diff --git a/tests/AutoVerify/app3/src/com/android/test/autoverify/MainActivity.java b/tests/AutoVerify/app3/src/com/android/test/autoverify/MainActivity.java
new file mode 100644
index 0000000..09ef472
--- /dev/null
+++ b/tests/AutoVerify/app3/src/com/android/test/autoverify/MainActivity.java
@@ -0,0 +1,15 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
diff --git a/tests/AutoVerify/app4/Android.bp b/tests/AutoVerify/app4/Android.bp
new file mode 100644
index 0000000..fbdae11
--- /dev/null
+++ b/tests/AutoVerify/app4/Android.bp
@@ -0,0 +1,11 @@
+android_app {
+    name: "AutoVerifyTest4",
+    srcs: ["src/**/*.java"],
+    resource_dirs: ["res"],
+    platform_apis: true,
+    min_sdk_version: "26",
+    target_sdk_version: "26",
+    optimize: {
+        enabled: false,
+    },
+}
diff --git a/tests/AutoVerify/app4/AndroidManifest.xml b/tests/AutoVerify/app4/AndroidManifest.xml
new file mode 100644
index 0000000..1c975f8
--- /dev/null
+++ b/tests/AutoVerify/app4/AndroidManifest.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.android.test.autoverify" >
+
+    <uses-sdk android:targetSdkVersion="26" />
+
+    <application
+        android:label="@string/app_name" >
+        <activity
+            android:name=".MainActivity"
+            android:label="@string/app_name" >
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+
+            <!-- intentionally does not autoVerify -->
+            <intent-filter>
+                <action android:name="android.intent.action.VIEW" />
+                <category android:name="android.intent.category.DEFAULT" />
+                <category android:name="android.intent.category.BROWSABLE" />
+                <data android:scheme="http" />
+                <data android:scheme="https" />
+                <data android:host="explicit.example.com" />
+                <data android:host="*.wildcard.tld" />
+            </intent-filter>
+        </activity>
+    </application>
+</manifest>
diff --git a/tests/AutoVerify/app4/res/values/strings.xml b/tests/AutoVerify/app4/res/values/strings.xml
new file mode 100644
index 0000000..e234355
--- /dev/null
+++ b/tests/AutoVerify/app4/res/values/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright 2020 The Android Open Source Project
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+
+<resources>
+    <!-- app icon label, do not translate -->
+    <string name="app_name" translatable="false">AutoVerify Test</string>
+</resources>
diff --git a/tests/AutoVerify/app4/src/com/android/test/autoverify/MainActivity.java b/tests/AutoVerify/app4/src/com/android/test/autoverify/MainActivity.java
new file mode 100644
index 0000000..09ef472
--- /dev/null
+++ b/tests/AutoVerify/app4/src/com/android/test/autoverify/MainActivity.java
@@ -0,0 +1,15 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
diff --git a/tests/BlobStoreTestUtils/src/com/android/utils/blob/DummyBlobData.java b/tests/BlobStoreTestUtils/src/com/android/utils/blob/DummyBlobData.java
index 35a6c26..371375c 100644
--- a/tests/BlobStoreTestUtils/src/com/android/utils/blob/DummyBlobData.java
+++ b/tests/BlobStoreTestUtils/src/com/android/utils/blob/DummyBlobData.java
@@ -77,7 +77,7 @@
             return mRandomSeed;
         }
 
-        public Builder setFileSize(int fileSize) {
+        public Builder setFileSize(long fileSize) {
             mFileSize = fileSize;
             return this;
         }
diff --git a/tests/BlobStoreTestUtils/src/com/android/utils/blob/Utils.java b/tests/BlobStoreTestUtils/src/com/android/utils/blob/Utils.java
index 482b23f..6927e86 100644
--- a/tests/BlobStoreTestUtils/src/com/android/utils/blob/Utils.java
+++ b/tests/BlobStoreTestUtils/src/com/android/utils/blob/Utils.java
@@ -34,6 +34,9 @@
 public class Utils {
     public static final int BUFFER_SIZE_BYTES = 16 * 1024;
 
+    public static final long KB_IN_BYTES = 1000;
+    public static final long MB_IN_BYTES = KB_IN_BYTES * 1000;
+
     public static void copy(InputStream in, OutputStream out, long lengthBytes)
             throws IOException {
         final byte[] buffer = new byte[BUFFER_SIZE_BYTES];
diff --git a/tests/DozeTest/src/com/android/dreams/dozetest/DozeTestDream.java b/tests/DozeTest/src/com/android/dreams/dozetest/DozeTestDream.java
index f4f610b..fa292bd 100644
--- a/tests/DozeTest/src/com/android/dreams/dozetest/DozeTestDream.java
+++ b/tests/DozeTest/src/com/android/dreams/dozetest/DozeTestDream.java
@@ -100,7 +100,6 @@
     public void onAttachedToWindow() {
         super.onAttachedToWindow();
         setInteractive(false);
-        setLowProfile(true);
         setFullscreen(true);
         setContentView(R.layout.dream);
         setScreenBright(false);
diff --git a/tests/RollbackTest/MultiUserRollbackTest/src/com/android/tests/rollback/host/MultiUserRollbackTest.java b/tests/RollbackTest/MultiUserRollbackTest/src/com/android/tests/rollback/host/MultiUserRollbackTest.java
index 4c29e72e..a4c81d5 100644
--- a/tests/RollbackTest/MultiUserRollbackTest/src/com/android/tests/rollback/host/MultiUserRollbackTest.java
+++ b/tests/RollbackTest/MultiUserRollbackTest/src/com/android/tests/rollback/host/MultiUserRollbackTest.java
@@ -56,8 +56,7 @@
         cleanUp();
         mOriginalUserId = getDevice().getCurrentUser();
         createAndStartSecondaryUser();
-        // TODO(b/149733368): Remove the '-g' workaround when the bug is fixed.
-        installPackage("RollbackTest.apk", "-g --user all");
+        installPackage("RollbackTest.apk", "--user all");
     }
 
     @Test
diff --git a/tests/UiBench/AndroidManifest.xml b/tests/UiBench/AndroidManifest.xml
index c6b4a54..dd255ef 100644
--- a/tests/UiBench/AndroidManifest.xml
+++ b/tests/UiBench/AndroidManifest.xml
@@ -306,5 +306,14 @@
                 <category android:name="com.android.test.uibench.TEST" />
             </intent-filter>
         </activity>
+
+        <activity
+            android:name="WindowInsetsControllerActivity"
+            android:label="WindowInsetsControllerActivity" >
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.android.test.uibench.TEST" />
+            </intent-filter>
+        </activity>
     </application>
 </manifest>
diff --git a/tests/UiBench/src/com/android/test/uibench/WindowInsetsControllerActivity.java b/tests/UiBench/src/com/android/test/uibench/WindowInsetsControllerActivity.java
new file mode 100644
index 0000000..e4b89cd
--- /dev/null
+++ b/tests/UiBench/src/com/android/test/uibench/WindowInsetsControllerActivity.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.test.uibench;
+
+import static android.view.WindowInsetsAnimation.Callback.DISPATCH_MODE_STOP;
+
+import android.os.Bundle;
+import android.os.PersistableBundle;
+import android.view.WindowInsets;
+import android.view.WindowInsetsAnimation;
+import android.widget.EditText;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
+
+import java.util.List;
+
+public class WindowInsetsControllerActivity extends AppCompatActivity {
+
+    @Override
+    public void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        EditText text = new EditText(this);
+        text.setText("WindowInsetsController");
+        setContentView(text);
+        getWindow().setDecorFitsSystemWindows(false);
+
+        text.setWindowInsetsAnimationCallback(
+                new WindowInsetsAnimation.Callback(DISPATCH_MODE_STOP) {
+            @NonNull
+            @Override
+            public WindowInsets onProgress(@NonNull WindowInsets insets,
+                    @NonNull List<WindowInsetsAnimation> runningAnimations) {
+                return WindowInsets.CONSUMED;
+            }
+        });
+    }
+}
diff --git a/tests/VoiceInteraction/src/com/android/test/voiceinteraction/MainInteractionService.java b/tests/VoiceInteraction/src/com/android/test/voiceinteraction/MainInteractionService.java
index f1dd1de..b7f5b15 100644
--- a/tests/VoiceInteraction/src/com/android/test/voiceinteraction/MainInteractionService.java
+++ b/tests/VoiceInteraction/src/com/android/test/voiceinteraction/MainInteractionService.java
@@ -16,14 +16,11 @@
 
 package com.android.test.voiceinteraction;
 
-import android.content.ComponentName;
 import android.content.Intent;
-import android.os.Bundle;
 import android.service.voice.AlwaysOnHotwordDetector;
 import android.service.voice.AlwaysOnHotwordDetector.Callback;
 import android.service.voice.AlwaysOnHotwordDetector.EventPayload;
 import android.service.voice.VoiceInteractionService;
-import android.service.voice.VoiceInteractionSession;
 import android.util.Log;
 
 import java.util.Arrays;
@@ -68,7 +65,8 @@
         Log.i(TAG, "Creating " + this);
         Log.i(TAG, "Keyphrase enrollment error? " + getKeyphraseEnrollmentInfo().getParseError());
         Log.i(TAG, "Keyphrase enrollment meta-data: "
-                + Arrays.toString(getKeyphraseEnrollmentInfo().listKeyphraseMetadata()));
+                + Arrays.toString(getKeyphraseEnrollmentInfo().listKeyphraseMetadata().toArray(
+                new android.hardware.soundtrigger.KeyphraseMetadata[0])));
 
         mHotwordDetector = createAlwaysOnHotwordDetector(
                 "Hello There", Locale.forLanguageTag("en-US"), mHotwordCallback);
diff --git a/tests/net/common/java/android/net/CaptivePortalDataTest.kt b/tests/net/common/java/android/net/CaptivePortalDataTest.kt
new file mode 100644
index 0000000..bd1847b
--- /dev/null
+++ b/tests/net/common/java/android/net/CaptivePortalDataTest.kt
@@ -0,0 +1,117 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net
+
+import android.os.Build
+import androidx.test.filters.SmallTest
+import com.android.testutils.assertParcelSane
+import com.android.testutils.assertParcelingIsLossless
+import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo
+import com.android.testutils.DevSdkIgnoreRunner
+import org.junit.Assert.assertFalse
+import org.junit.Assert.assertTrue
+import org.junit.Test
+import org.junit.runner.RunWith
+import kotlin.test.assertEquals
+import kotlin.test.assertNotEquals
+
+@SmallTest
+@RunWith(DevSdkIgnoreRunner::class)
+@IgnoreUpTo(Build.VERSION_CODES.Q)
+class CaptivePortalDataTest {
+    private val data = CaptivePortalData.Builder()
+            .setRefreshTime(123L)
+            .setUserPortalUrl(Uri.parse("https://portal.example.com/test"))
+            .setVenueInfoUrl(Uri.parse("https://venue.example.com/test"))
+            .setSessionExtendable(true)
+            .setBytesRemaining(456L)
+            .setExpiryTime(789L)
+            .setCaptive(true)
+            .build()
+
+    private fun makeBuilder() = CaptivePortalData.Builder(data)
+
+    @Test
+    fun testParcelUnparcel() {
+        assertParcelSane(data, fieldCount = 7)
+
+        assertParcelingIsLossless(makeBuilder().setUserPortalUrl(null).build())
+        assertParcelingIsLossless(makeBuilder().setVenueInfoUrl(null).build())
+    }
+
+    @Test
+    fun testEquals() {
+        assertEquals(data, makeBuilder().build())
+
+        assertNotEqualsAfterChange { it.setRefreshTime(456L) }
+        assertNotEqualsAfterChange { it.setUserPortalUrl(Uri.parse("https://example.com/")) }
+        assertNotEqualsAfterChange { it.setUserPortalUrl(null) }
+        assertNotEqualsAfterChange { it.setVenueInfoUrl(Uri.parse("https://example.com/")) }
+        assertNotEqualsAfterChange { it.setVenueInfoUrl(null) }
+        assertNotEqualsAfterChange { it.setSessionExtendable(false) }
+        assertNotEqualsAfterChange { it.setBytesRemaining(789L) }
+        assertNotEqualsAfterChange { it.setExpiryTime(12L) }
+        assertNotEqualsAfterChange { it.setCaptive(false) }
+    }
+
+    @Test
+    fun testUserPortalUrl() {
+        assertEquals(Uri.parse("https://portal.example.com/test"), data.userPortalUrl)
+    }
+
+    @Test
+    fun testVenueInfoUrl() {
+        assertEquals(Uri.parse("https://venue.example.com/test"), data.venueInfoUrl)
+    }
+
+    @Test
+    fun testIsSessionExtendable() {
+        assertTrue(data.isSessionExtendable)
+    }
+
+    @Test
+    fun testByteLimit() {
+        assertEquals(456L, data.byteLimit)
+        // Test byteLimit unset.
+        assertEquals(-1L, CaptivePortalData.Builder(null).build().byteLimit)
+    }
+
+    @Test
+    fun testRefreshTimeMillis() {
+        assertEquals(123L, data.refreshTimeMillis)
+    }
+
+    @Test
+    fun testExpiryTimeMillis() {
+        assertEquals(789L, data.expiryTimeMillis)
+        // Test expiryTimeMillis unset.
+        assertEquals(-1L, CaptivePortalData.Builder(null).build().expiryTimeMillis)
+    }
+
+    @Test
+    fun testIsCaptive() {
+        assertTrue(data.isCaptive)
+        assertFalse(makeBuilder().setCaptive(false).build().isCaptive)
+    }
+
+    private fun CaptivePortalData.mutate(mutator: (CaptivePortalData.Builder) -> Unit) =
+            CaptivePortalData.Builder(this).apply { mutator(this) }.build()
+
+    private fun assertNotEqualsAfterChange(mutator: (CaptivePortalData.Builder) -> Unit) {
+        assertNotEquals(data, data.mutate(mutator))
+    }
+}
\ No newline at end of file
diff --git a/tests/net/common/java/android/net/NetworkProviderTest.kt b/tests/net/common/java/android/net/NetworkProviderTest.kt
new file mode 100644
index 0000000..b7c47c2
--- /dev/null
+++ b/tests/net/common/java/android/net/NetworkProviderTest.kt
@@ -0,0 +1,187 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net
+
+import android.app.Instrumentation
+import android.content.Context
+import android.net.NetworkCapabilities.TRANSPORT_TEST
+import android.os.Build
+import android.os.HandlerThread
+import android.os.Looper
+import android.net.NetworkProviderTest.TestNetworkCallback.CallbackEntry.OnUnavailable
+import android.net.NetworkProviderTest.TestNetworkProvider.CallbackEntry.OnNetworkRequested
+import android.net.NetworkProviderTest.TestNetworkProvider.CallbackEntry.OnNetworkRequestWithdrawn
+import androidx.test.InstrumentationRegistry
+import com.android.testutils.ArrayTrackRecord
+import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo
+import com.android.testutils.DevSdkIgnoreRunner
+import java.util.UUID
+import kotlin.test.assertEquals
+import kotlin.test.assertNotEquals
+import org.junit.After
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+
+private const val DEFAULT_TIMEOUT_MS = 5000L
+private val instrumentation: Instrumentation
+    get() = InstrumentationRegistry.getInstrumentation()
+private val context: Context get() = InstrumentationRegistry.getContext()
+private val PROVIDER_NAME = "NetworkProviderTest"
+
+@RunWith(DevSdkIgnoreRunner::class)
+@IgnoreUpTo(Build.VERSION_CODES.Q)
+class NetworkProviderTest {
+    private val mCm = context.getSystemService(ConnectivityManager::class.java)
+    private val mHandlerThread = HandlerThread("${javaClass.simpleName} handler thread")
+
+    @Before
+    fun setUp() {
+        instrumentation.getUiAutomation().adoptShellPermissionIdentity()
+        mHandlerThread.start()
+    }
+
+    @After
+    fun tearDown() {
+        mHandlerThread.quitSafely()
+        instrumentation.getUiAutomation().dropShellPermissionIdentity()
+    }
+
+    private class TestNetworkProvider(context: Context, looper: Looper) :
+            NetworkProvider(context, looper, PROVIDER_NAME) {
+        private val seenEvents = ArrayTrackRecord<CallbackEntry>().newReadHead()
+
+        sealed class CallbackEntry {
+            data class OnNetworkRequested(
+                val request: NetworkRequest,
+                val score: Int,
+                val id: Int
+            ) : CallbackEntry()
+            data class OnNetworkRequestWithdrawn(val request: NetworkRequest) : CallbackEntry()
+        }
+
+        override fun onNetworkRequested(request: NetworkRequest, score: Int, id: Int) {
+            seenEvents.add(OnNetworkRequested(request, score, id))
+        }
+
+        override fun onNetworkRequestWithdrawn(request: NetworkRequest) {
+            seenEvents.add(OnNetworkRequestWithdrawn(request))
+        }
+
+        inline fun <reified T : CallbackEntry> expectCallback(
+            crossinline predicate: (T) -> Boolean
+        ) = seenEvents.poll(DEFAULT_TIMEOUT_MS) { it is T && predicate(it) }
+    }
+
+    private fun createNetworkProvider(): TestNetworkProvider {
+        return TestNetworkProvider(context, mHandlerThread.looper)
+    }
+
+    @Test
+    fun testOnNetworkRequested() {
+        val provider = createNetworkProvider()
+        assertEquals(provider.getProviderId(), NetworkProvider.ID_NONE)
+        mCm.registerNetworkProvider(provider)
+        assertNotEquals(provider.getProviderId(), NetworkProvider.ID_NONE)
+
+        val specifier = StringNetworkSpecifier(UUID.randomUUID().toString())
+        val nr: NetworkRequest = NetworkRequest.Builder()
+                .addTransportType(TRANSPORT_TEST)
+                .setNetworkSpecifier(specifier)
+                .build()
+        val cb = ConnectivityManager.NetworkCallback()
+        mCm.requestNetwork(nr, cb)
+        provider.expectCallback<OnNetworkRequested>() { callback ->
+            callback.request.getNetworkSpecifier() == specifier &&
+            callback.request.hasTransport(TRANSPORT_TEST)
+        }
+
+        val initialScore = 40
+        val updatedScore = 60
+        val nc = NetworkCapabilities().apply {
+                addTransportType(NetworkCapabilities.TRANSPORT_TEST)
+                removeCapability(NetworkCapabilities.NET_CAPABILITY_TRUSTED)
+                removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
+                addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_SUSPENDED)
+                addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING)
+                addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN)
+                setNetworkSpecifier(specifier)
+        }
+        val lp = LinkProperties()
+        val config = NetworkAgentConfig.Builder().build()
+        val agent = object : NetworkAgent(context, mHandlerThread.looper, "TestAgent", nc, lp,
+                initialScore, config, provider) {}
+
+        provider.expectCallback<OnNetworkRequested>() { callback ->
+            callback.request.getNetworkSpecifier() == specifier &&
+            callback.score == initialScore &&
+            callback.id == agent.providerId
+        }
+
+        agent.sendNetworkScore(updatedScore)
+        provider.expectCallback<OnNetworkRequested>() { callback ->
+            callback.request.getNetworkSpecifier() == specifier &&
+            callback.score == updatedScore &&
+            callback.id == agent.providerId
+        }
+
+        mCm.unregisterNetworkCallback(cb)
+        provider.expectCallback<OnNetworkRequestWithdrawn>() { callback ->
+            callback.request.getNetworkSpecifier() == specifier &&
+            callback.request.hasTransport(TRANSPORT_TEST)
+        }
+        mCm.unregisterNetworkProvider(provider)
+        // Provider id should be ID_NONE after unregister network provider
+        assertEquals(provider.getProviderId(), NetworkProvider.ID_NONE)
+        // unregisterNetworkProvider should not crash even if it's called on an
+        // already unregistered provider.
+        mCm.unregisterNetworkProvider(provider)
+    }
+
+    private class TestNetworkCallback : ConnectivityManager.NetworkCallback() {
+        private val seenEvents = ArrayTrackRecord<CallbackEntry>().newReadHead()
+        sealed class CallbackEntry {
+            object OnUnavailable : CallbackEntry()
+        }
+
+        override fun onUnavailable() {
+            seenEvents.add(OnUnavailable)
+        }
+
+        inline fun <reified T : CallbackEntry> expectCallback(
+            crossinline predicate: (T) -> Boolean
+        ) = seenEvents.poll(DEFAULT_TIMEOUT_MS) { it is T && predicate(it) }
+    }
+
+    @Test
+    fun testDeclareNetworkRequestUnfulfillable() {
+        val provider = createNetworkProvider()
+        mCm.registerNetworkProvider(provider)
+
+        val specifier = StringNetworkSpecifier(UUID.randomUUID().toString())
+        val nr: NetworkRequest = NetworkRequest.Builder()
+                .addTransportType(TRANSPORT_TEST)
+                .setNetworkSpecifier(specifier)
+                .build()
+
+        val cb = TestNetworkCallback()
+        mCm.requestNetwork(nr, cb)
+        provider.declareNetworkRequestUnfulfillable(nr)
+        cb.expectCallback<OnUnavailable>() { nr.getNetworkSpecifier() == specifier }
+        mCm.unregisterNetworkProvider(provider)
+    }
+}
\ No newline at end of file
diff --git a/tests/net/java/android/net/CaptivePortalDataTest.kt b/tests/net/java/android/net/CaptivePortalDataTest.kt
deleted file mode 100644
index 0071438..0000000
--- a/tests/net/java/android/net/CaptivePortalDataTest.kt
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net
-
-import androidx.test.filters.SmallTest
-import androidx.test.runner.AndroidJUnit4
-import com.android.testutils.assertParcelSane
-import com.android.testutils.assertParcelingIsLossless
-import org.junit.Test
-import org.junit.runner.RunWith
-import kotlin.test.assertEquals
-import kotlin.test.assertNotEquals
-
-@SmallTest
-@RunWith(AndroidJUnit4::class)
-class CaptivePortalDataTest {
-    private val data = CaptivePortalData.Builder()
-            .setRefreshTime(123L)
-            .setUserPortalUrl(Uri.parse("https://portal.example.com/test"))
-            .setVenueInfoUrl(Uri.parse("https://venue.example.com/test"))
-            .setSessionExtendable(true)
-            .setBytesRemaining(456L)
-            .setExpiryTime(789L)
-            .setCaptive(true)
-            .build()
-
-    private fun makeBuilder() = CaptivePortalData.Builder(data)
-
-    @Test
-    fun testParcelUnparcel() {
-        assertParcelSane(data, fieldCount = 7)
-
-        assertParcelingIsLossless(makeBuilder().setUserPortalUrl(null).build())
-        assertParcelingIsLossless(makeBuilder().setVenueInfoUrl(null).build())
-    }
-
-    @Test
-    fun testEquals() {
-        assertEquals(data, makeBuilder().build())
-
-        assertNotEqualsAfterChange { it.setRefreshTime(456L) }
-        assertNotEqualsAfterChange { it.setUserPortalUrl(Uri.parse("https://example.com/")) }
-        assertNotEqualsAfterChange { it.setUserPortalUrl(null) }
-        assertNotEqualsAfterChange { it.setVenueInfoUrl(Uri.parse("https://example.com/")) }
-        assertNotEqualsAfterChange { it.setVenueInfoUrl(null) }
-        assertNotEqualsAfterChange { it.setSessionExtendable(false) }
-        assertNotEqualsAfterChange { it.setBytesRemaining(789L) }
-        assertNotEqualsAfterChange { it.setExpiryTime(12L) }
-        assertNotEqualsAfterChange { it.setCaptive(false) }
-    }
-
-    private fun CaptivePortalData.mutate(mutator: (CaptivePortalData.Builder) -> Unit) =
-            CaptivePortalData.Builder(this).apply { mutator(this) }.build()
-
-    private fun assertNotEqualsAfterChange(mutator: (CaptivePortalData.Builder) -> Unit) {
-        assertNotEquals(data, data.mutate(mutator))
-    }
-}
\ No newline at end of file
diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java
index b864e37..a478e68 100644
--- a/tests/net/java/com/android/server/ConnectivityServiceTest.java
+++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java
@@ -5969,6 +5969,9 @@
         final LinkAddress myIpv6 = new LinkAddress("2001:db8:1::1/64");
         final String kNat64PrefixString = "2001:db8:64:64:64:64::";
         final IpPrefix kNat64Prefix = new IpPrefix(InetAddress.getByName(kNat64PrefixString), 96);
+        final String kOtherNat64PrefixString = "64:ff9b::";
+        final IpPrefix kOtherNat64Prefix = new IpPrefix(
+                InetAddress.getByName(kOtherNat64PrefixString), 96);
         final RouteInfo defaultRoute = new RouteInfo((IpPrefix) null, myIpv6.getAddress(),
                                                      MOBILE_IFNAME);
         final RouteInfo ipv6Subnet = new RouteInfo(myIpv6, null, MOBILE_IFNAME);
@@ -6082,6 +6085,24 @@
         }
         reset(mMockNetd);
 
+        // Change the NAT64 prefix without first removing it.
+        // Expect clatd to be stopped and started with the new prefix.
+        mService.mNetdEventCallback.onNat64PrefixEvent(cellNetId, true /* added */,
+                kOtherNat64PrefixString, 96);
+        networkCallback.expectLinkPropertiesThat(mCellNetworkAgent,
+                (lp) -> lp.getStackedLinks().size() == 0);
+        verify(mMockNetd, times(1)).clatdStop(MOBILE_IFNAME);
+        assertRoutesRemoved(cellNetId, stackedDefault);
+
+        verify(mMockNetd, times(1)).clatdStart(MOBILE_IFNAME, kOtherNat64Prefix.toString());
+        networkCallback.expectLinkPropertiesThat(mCellNetworkAgent,
+                (lp) -> lp.getNat64Prefix().equals(kOtherNat64Prefix));
+        clat.interfaceLinkStateChanged(CLAT_PREFIX + MOBILE_IFNAME, true);
+        networkCallback.expectLinkPropertiesThat(mCellNetworkAgent,
+                (lp) -> lp.getStackedLinks().size() == 1);
+        assertRoutesAdded(cellNetId, stackedDefault);
+        reset(mMockNetd);
+
         // Add ipv4 address, expect that clatd and prefix discovery are stopped and stacked
         // linkproperties are cleaned up.
         cellLp.addLinkAddress(myIpv4);
@@ -6096,7 +6117,7 @@
         networkCallback.expectCallback(CallbackEntry.LINK_PROPERTIES_CHANGED, mCellNetworkAgent);
         LinkProperties actualLpAfterIpv4 = mCm.getLinkProperties(mCellNetworkAgent.getNetwork());
         LinkProperties expected = new LinkProperties(cellLp);
-        expected.setNat64Prefix(kNat64Prefix);
+        expected.setNat64Prefix(kOtherNat64Prefix);
         assertEquals(expected, actualLpAfterIpv4);
         assertEquals(0, actualLpAfterIpv4.getStackedLinks().size());
         assertRoutesRemoved(cellNetId, stackedDefault);
@@ -6115,7 +6136,7 @@
 
         // Stopping prefix discovery causes netd to tell us that the NAT64 prefix is gone.
         mService.mNetdEventCallback.onNat64PrefixEvent(cellNetId, false /* added */,
-                kNat64PrefixString, 96);
+                kOtherNat64PrefixString, 96);
         networkCallback.expectLinkPropertiesThat(mCellNetworkAgent,
                 (lp) -> lp.getNat64Prefix() == null);
 
@@ -6158,6 +6179,111 @@
         mCm.unregisterNetworkCallback(networkCallback);
     }
 
+    private void expectNat64PrefixChange(TestableNetworkCallback callback,
+            TestNetworkAgentWrapper agent, IpPrefix prefix) {
+        callback.expectLinkPropertiesThat(agent, x -> Objects.equals(x.getNat64Prefix(), prefix));
+    }
+
+    @Test
+    public void testNat64PrefixMultipleSources() throws Exception {
+        final String iface = "wlan0";
+        final String pref64FromRaStr = "64:ff9b::";
+        final String pref64FromDnsStr = "2001:db8:64::";
+        final IpPrefix pref64FromRa = new IpPrefix(InetAddress.getByName(pref64FromRaStr), 96);
+        final IpPrefix pref64FromDns = new IpPrefix(InetAddress.getByName(pref64FromDnsStr), 96);
+        final IpPrefix newPref64FromRa = new IpPrefix("2001:db8:64:64:64:64::/96");
+
+        final NetworkRequest request = new NetworkRequest.Builder()
+                .addCapability(NET_CAPABILITY_INTERNET)
+                .build();
+        final TestNetworkCallback callback = new TestNetworkCallback();
+        mCm.registerNetworkCallback(request, callback);
+
+        final LinkProperties baseLp = new LinkProperties();
+        baseLp.setInterfaceName(iface);
+        baseLp.addLinkAddress(new LinkAddress("2001:db8:1::1/64"));
+        baseLp.addDnsServer(InetAddress.getByName("2001:4860:4860::6464"));
+
+        reset(mMockNetd, mMockDnsResolver);
+        InOrder inOrder = inOrder(mMockNetd, mMockDnsResolver);
+
+        // If a network already has a NAT64 prefix on connect, clatd is started immediately and
+        // prefix discovery is never started.
+        LinkProperties lp = new LinkProperties(baseLp);
+        lp.setNat64Prefix(pref64FromRa);
+        mCellNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI, lp);
+        mCellNetworkAgent.connect(false);
+        final Network network = mCellNetworkAgent.getNetwork();
+        int netId = network.getNetId();
+        callback.expectAvailableCallbacksUnvalidated(mCellNetworkAgent);
+        inOrder.verify(mMockNetd).clatdStart(iface, pref64FromRa.toString());
+        inOrder.verify(mMockDnsResolver, never()).startPrefix64Discovery(netId);
+        callback.assertNoCallback();
+        assertEquals(pref64FromRa, mCm.getLinkProperties(network).getNat64Prefix());
+
+        // If the RA prefix is withdrawn, clatd is stopped and prefix discovery is started.
+        lp.setNat64Prefix(null);
+        mCellNetworkAgent.sendLinkProperties(lp);
+        expectNat64PrefixChange(callback, mCellNetworkAgent, null);
+        inOrder.verify(mMockNetd).clatdStop(iface);
+        inOrder.verify(mMockDnsResolver).startPrefix64Discovery(netId);
+
+        // If the RA prefix appears while DNS discovery is in progress, discovery is stopped and
+        // clatd is started with the prefix from the RA.
+        lp.setNat64Prefix(pref64FromRa);
+        mCellNetworkAgent.sendLinkProperties(lp);
+        expectNat64PrefixChange(callback, mCellNetworkAgent, pref64FromRa);
+        inOrder.verify(mMockNetd).clatdStart(iface, pref64FromRa.toString());
+        inOrder.verify(mMockDnsResolver).stopPrefix64Discovery(netId);
+
+        // Withdraw the RA prefix so we can test the case where an RA prefix appears after DNS
+        // discovery has succeeded.
+        lp.setNat64Prefix(null);
+        mCellNetworkAgent.sendLinkProperties(lp);
+        expectNat64PrefixChange(callback, mCellNetworkAgent, null);
+        inOrder.verify(mMockNetd).clatdStop(iface);
+        inOrder.verify(mMockDnsResolver).startPrefix64Discovery(netId);
+
+        mService.mNetdEventCallback.onNat64PrefixEvent(netId, true /* added */,
+                pref64FromDnsStr, 96);
+        expectNat64PrefixChange(callback, mCellNetworkAgent, pref64FromDns);
+        inOrder.verify(mMockNetd).clatdStart(iface, pref64FromDns.toString());
+
+        // If the RA prefix reappears, clatd is restarted and prefix discovery is stopped.
+        lp.setNat64Prefix(pref64FromRa);
+        mCellNetworkAgent.sendLinkProperties(lp);
+        expectNat64PrefixChange(callback, mCellNetworkAgent, pref64FromRa);
+        inOrder.verify(mMockNetd).clatdStop(iface);
+        inOrder.verify(mMockDnsResolver).stopPrefix64Discovery(netId);
+        inOrder.verify(mMockNetd).clatdStart(iface, pref64FromRa.toString());
+        inOrder.verify(mMockDnsResolver, never()).startPrefix64Discovery(netId);
+
+        // If the RA prefix changes, clatd is restarted and prefix discovery is not started.
+        lp.setNat64Prefix(newPref64FromRa);
+        mCellNetworkAgent.sendLinkProperties(lp);
+        expectNat64PrefixChange(callback, mCellNetworkAgent, newPref64FromRa);
+        inOrder.verify(mMockNetd).clatdStop(iface);
+        inOrder.verify(mMockNetd).clatdStart(iface, newPref64FromRa.toString());
+        inOrder.verify(mMockDnsResolver, never()).stopPrefix64Discovery(netId);
+        inOrder.verify(mMockDnsResolver, never()).startPrefix64Discovery(netId);
+
+        // If the RA prefix changes to the same value, nothing happens.
+        lp.setNat64Prefix(newPref64FromRa);
+        mCellNetworkAgent.sendLinkProperties(lp);
+        callback.assertNoCallback();
+        assertEquals(newPref64FromRa, mCm.getLinkProperties(network).getNat64Prefix());
+        inOrder.verify(mMockNetd, never()).clatdStop(iface);
+        inOrder.verify(mMockNetd, never()).clatdStart(eq(iface), anyString());
+        inOrder.verify(mMockDnsResolver, never()).stopPrefix64Discovery(netId);
+        inOrder.verify(mMockDnsResolver, never()).startPrefix64Discovery(netId);
+
+        // The transition between no prefix and DNS prefix is tested in testStackedLinkProperties.
+
+        callback.assertNoCallback();
+        mCellNetworkAgent.disconnect();
+        mCm.unregisterNetworkCallback(callback);
+    }
+
     @Test
     public void testDataActivityTracking() throws Exception {
         final TestNetworkCallback networkCallback = new TestNetworkCallback();
diff --git a/tests/net/java/com/android/server/connectivity/DnsManagerTest.java b/tests/net/java/com/android/server/connectivity/DnsManagerTest.java
index a392ae3..0a603b8 100644
--- a/tests/net/java/com/android/server/connectivity/DnsManagerTest.java
+++ b/tests/net/java/com/android/server/connectivity/DnsManagerTest.java
@@ -18,6 +18,8 @@
 
 import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_OFF;
 import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_PROVIDER_HOSTNAME;
+import static android.net.NetworkCapabilities.MAX_TRANSPORT;
+import static android.net.NetworkCapabilities.MIN_TRANSPORT;
 import static android.net.NetworkCapabilities.TRANSPORT_VPN;
 import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
 import static android.provider.Settings.Global.PRIVATE_DNS_DEFAULT_MODE;
@@ -30,6 +32,7 @@
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.reset;
@@ -44,16 +47,19 @@
 import android.net.LinkAddress;
 import android.net.LinkProperties;
 import android.net.Network;
+import android.net.NetworkCapabilities;
 import android.net.ResolverOptionsParcel;
 import android.net.ResolverParamsParcel;
 import android.net.RouteInfo;
 import android.net.shared.PrivateDnsConfig;
 import android.provider.Settings;
 import android.test.mock.MockContentResolver;
+import android.util.SparseArray;
 
 import androidx.test.filters.SmallTest;
 import androidx.test.runner.AndroidJUnit4;
 
+import com.android.internal.util.MessageUtils;
 import com.android.internal.util.test.FakeSettingsProvider;
 
 import org.junit.Before;
@@ -354,4 +360,23 @@
         expectedParams.resolverOptions = new ResolverOptionsParcel();
         assertResolverParamsEquals(actualParams, expectedParams);
     }
+
+    @Test
+    public void testTransportTypesEqual() throws Exception {
+        SparseArray<String> ncTransTypes = MessageUtils.findMessageNames(
+                new Class[] { NetworkCapabilities.class }, new String[]{ "TRANSPORT_" });
+        SparseArray<String> dnsTransTypes = MessageUtils.findMessageNames(
+                new Class[] { IDnsResolver.class }, new String[]{ "TRANSPORT_" });
+        assertEquals(0, MIN_TRANSPORT);
+        assertEquals(MAX_TRANSPORT + 1, ncTransTypes.size());
+        // TRANSPORT_UNKNOWN in IDnsResolver is defined to -1 and only for resolver.
+        assertEquals("TRANSPORT_UNKNOWN", dnsTransTypes.get(-1));
+        assertEquals(ncTransTypes.size(), dnsTransTypes.size() - 1);
+        for (int i = MIN_TRANSPORT; i < MAX_TRANSPORT; i++) {
+            String name = ncTransTypes.get(i, null);
+            assertNotNull("Could not find NetworkCapabilies.TRANSPORT_* constant equal to "
+                    + i, name);
+            assertEquals(name, dnsTransTypes.get(i));
+        }
+    }
 }
diff --git a/tests/net/java/com/android/server/connectivity/Nat464XlatTest.java b/tests/net/java/com/android/server/connectivity/Nat464XlatTest.java
index d0ebb52..5046b65 100644
--- a/tests/net/java/com/android/server/connectivity/Nat464XlatTest.java
+++ b/tests/net/java/com/android/server/connectivity/Nat464XlatTest.java
@@ -58,8 +58,10 @@
 
     static final String BASE_IFACE = "test0";
     static final String STACKED_IFACE = "v4-test0";
+    static final LinkAddress V6ADDR = new LinkAddress("2001:db8:1::f00/64");
     static final LinkAddress ADDR = new LinkAddress("192.0.2.5/29");
     static final String NAT64_PREFIX = "64:ff9b::/96";
+    static final String OTHER_NAT64_PREFIX = "2001:db8:0:64::/96";
     static final int NETID = 42;
 
     @Mock ConnectivityService mConnectivity;
@@ -81,6 +83,14 @@
         };
     }
 
+    private void markNetworkConnected() {
+        mNai.networkInfo.setDetailedState(NetworkInfo.DetailedState.CONNECTED, "", "");
+    }
+
+    private void markNetworkDisconnected() {
+        mNai.networkInfo.setDetailedState(NetworkInfo.DetailedState.DISCONNECTED, "", "");
+    }
+
     @Before
     public void setUp() throws Exception {
         mLooper = new TestLooper();
@@ -92,6 +102,7 @@
         mNai.linkProperties.setInterfaceName(BASE_IFACE);
         mNai.networkInfo = new NetworkInfo(null);
         mNai.networkInfo.setType(ConnectivityManager.TYPE_WIFI);
+        markNetworkConnected();
         when(mNai.connService()).thenReturn(mConnectivity);
         when(mNai.netAgentConfig()).thenReturn(mAgentConfig);
         when(mNai.handler()).thenReturn(mHandler);
@@ -139,7 +150,7 @@
             for (NetworkInfo.DetailedState state : supportedDetailedStates) {
                 mNai.networkInfo.setDetailedState(state, "reason", "extraInfo");
 
-                mNai.linkProperties.setNat64Prefix(new IpPrefix("2001:db8:0:64::/96"));
+                mNai.linkProperties.setNat64Prefix(new IpPrefix(OTHER_NAT64_PREFIX));
                 assertRequiresClat(false, mNai);
                 assertShouldStartClat(false, mNai);
 
@@ -176,11 +187,20 @@
         }
     }
 
-    @Test
-    public void testNormalStartAndStop() throws Exception {
+    private void makeClatUnnecessary(boolean dueToDisconnect) {
+        if (dueToDisconnect) {
+            markNetworkDisconnected();
+        } else {
+            mNai.linkProperties.addLinkAddress(ADDR);
+        }
+    }
+
+    private void checkNormalStartAndStop(boolean dueToDisconnect) throws Exception {
         Nat464Xlat nat = makeNat464Xlat();
         ArgumentCaptor<LinkProperties> c = ArgumentCaptor.forClass(LinkProperties.class);
 
+        mNai.linkProperties.addLinkAddress(V6ADDR);
+
         nat.setNat64PrefixFromDns(new IpPrefix(NAT64_PREFIX));
 
         // Start clat.
@@ -200,6 +220,7 @@
         assertRunning(nat);
 
         // Stop clat (Network disconnects, IPv4 addr appears, ...).
+        makeClatUnnecessary(dueToDisconnect);
         nat.stop();
 
         verify(mNetd).clatdStop(eq(BASE_IFACE));
@@ -217,11 +238,23 @@
         verifyNoMoreInteractions(mNetd, mNms, mConnectivity);
     }
 
+    @Test
+    public void testNormalStartAndStopDueToDisconnect() throws Exception {
+        checkNormalStartAndStop(true);
+    }
+
+    @Test
+    public void testNormalStartAndStopDueToIpv4Addr() throws Exception {
+        checkNormalStartAndStop(false);
+    }
+
     private void checkStartStopStart(boolean interfaceRemovedFirst) throws Exception {
         Nat464Xlat nat = makeNat464Xlat();
         ArgumentCaptor<LinkProperties> c = ArgumentCaptor.forClass(LinkProperties.class);
         InOrder inOrder = inOrder(mNetd, mConnectivity);
 
+        mNai.linkProperties.addLinkAddress(V6ADDR);
+
         nat.setNat64PrefixFromDns(new IpPrefix(NAT64_PREFIX));
 
         nat.start();
@@ -344,10 +377,11 @@
         verifyNoMoreInteractions(mNetd, mNms, mConnectivity);
     }
 
-    @Test
-    public void testStopBeforeClatdStarts() throws Exception {
+    private void checkStopBeforeClatdStarts(boolean dueToDisconnect) throws Exception {
         Nat464Xlat nat = makeNat464Xlat();
 
+        mNai.linkProperties.addLinkAddress(new LinkAddress("2001:db8::1/64"));
+
         nat.setNat64PrefixFromDns(new IpPrefix(NAT64_PREFIX));
 
         nat.start();
@@ -356,6 +390,7 @@
         verify(mNetd).clatdStart(eq(BASE_IFACE), eq(NAT64_PREFIX));
 
         // ConnectivityService immediately stops clat (Network disconnects, IPv4 addr appears, ...)
+        makeClatUnnecessary(dueToDisconnect);
         nat.stop();
 
         verify(mNetd).clatdStop(eq(BASE_IFACE));
@@ -377,9 +412,20 @@
     }
 
     @Test
-    public void testStopAndClatdNeverStarts() throws Exception {
+    public void testStopDueToDisconnectBeforeClatdStarts() throws Exception {
+        checkStopBeforeClatdStarts(true);
+    }
+
+    @Test
+    public void testStopDueToIpv4AddrBeforeClatdStarts() throws Exception {
+        checkStopBeforeClatdStarts(false);
+    }
+
+    private void checkStopAndClatdNeverStarts(boolean dueToDisconnect) throws Exception {
         Nat464Xlat nat = makeNat464Xlat();
 
+        mNai.linkProperties.addLinkAddress(new LinkAddress("2001:db8::1/64"));
+
         nat.setNat64PrefixFromDns(new IpPrefix(NAT64_PREFIX));
 
         nat.start();
@@ -388,6 +434,7 @@
         verify(mNetd).clatdStart(eq(BASE_IFACE), eq(NAT64_PREFIX));
 
         // ConnectivityService immediately stops clat (Network disconnects, IPv4 addr appears, ...)
+        makeClatUnnecessary(dueToDisconnect);
         nat.stop();
 
         verify(mNetd).clatdStop(eq(BASE_IFACE));
@@ -398,6 +445,57 @@
         verifyNoMoreInteractions(mNetd, mNms, mConnectivity);
     }
 
+    @Test
+    public void testStopDueToDisconnectAndClatdNeverStarts() throws Exception {
+        checkStopAndClatdNeverStarts(true);
+    }
+
+    @Test
+    public void testStopDueToIpv4AddressAndClatdNeverStarts() throws Exception {
+        checkStopAndClatdNeverStarts(false);
+    }
+
+    @Test
+    public void testNat64PrefixPreference() throws Exception {
+        final IpPrefix prefixFromDns = new IpPrefix(NAT64_PREFIX);
+        final IpPrefix prefixFromRa = new IpPrefix(OTHER_NAT64_PREFIX);
+
+        Nat464Xlat nat = makeNat464Xlat();
+
+        final LinkProperties emptyLp = new LinkProperties();
+        LinkProperties fixedupLp;
+
+        fixedupLp = new LinkProperties();
+        nat.setNat64PrefixFromDns(prefixFromDns);
+        nat.fixupLinkProperties(emptyLp, fixedupLp);
+        assertEquals(prefixFromDns, fixedupLp.getNat64Prefix());
+
+        fixedupLp = new LinkProperties();
+        nat.setNat64PrefixFromRa(prefixFromRa);
+        nat.fixupLinkProperties(emptyLp, fixedupLp);
+        assertEquals(prefixFromRa, fixedupLp.getNat64Prefix());
+
+        fixedupLp = new LinkProperties();
+        nat.setNat64PrefixFromRa(null);
+        nat.fixupLinkProperties(emptyLp, fixedupLp);
+        assertEquals(prefixFromDns, fixedupLp.getNat64Prefix());
+
+        fixedupLp = new LinkProperties();
+        nat.setNat64PrefixFromRa(prefixFromRa);
+        nat.fixupLinkProperties(emptyLp, fixedupLp);
+        assertEquals(prefixFromRa, fixedupLp.getNat64Prefix());
+
+        fixedupLp = new LinkProperties();
+        nat.setNat64PrefixFromDns(null);
+        nat.fixupLinkProperties(emptyLp, fixedupLp);
+        assertEquals(prefixFromRa, fixedupLp.getNat64Prefix());
+
+        fixedupLp = new LinkProperties();
+        nat.setNat64PrefixFromRa(null);
+        nat.fixupLinkProperties(emptyLp, fixedupLp);
+        assertEquals(null, fixedupLp.getNat64Prefix());
+    }
+
     static void assertIdle(Nat464Xlat nat) {
         assertTrue("Nat464Xlat was not IDLE", !nat.isStarted());
     }
diff --git a/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java b/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java
index 6e63313..a1bb0d5 100644
--- a/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java
+++ b/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java
@@ -60,14 +60,13 @@
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.anyLong;
+import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import android.annotation.NonNull;
-import android.annotation.Nullable;
 import android.app.AlarmManager;
 import android.app.usage.NetworkStatsManager;
 import android.content.Context;
@@ -95,8 +94,6 @@
 import android.os.Messenger;
 import android.os.PowerManager;
 import android.os.SimpleClock;
-import android.telephony.PhoneStateListener;
-import android.telephony.ServiceState;
 import android.telephony.TelephonyManager;
 
 import androidx.test.InstrumentationRegistry;
@@ -109,7 +106,7 @@
 import com.android.server.net.NetworkStatsService.NetworkStatsSettings;
 import com.android.server.net.NetworkStatsService.NetworkStatsSettings.Config;
 import com.android.testutils.HandlerUtilsKt;
-import com.android.testutils.TestableNetworkStatsProvider;
+import com.android.testutils.TestableNetworkStatsProviderBinder;
 
 import libcore.io.IoUtils;
 
@@ -126,6 +123,7 @@
 import java.time.Clock;
 import java.time.ZoneOffset;
 import java.util.Objects;
+import java.util.concurrent.Executor;
 
 /**
  * Tests for {@link NetworkStatsService}.
@@ -168,14 +166,13 @@
     private @Mock NetworkStatsSettings mSettings;
     private @Mock IBinder mBinder;
     private @Mock AlarmManager mAlarmManager;
-    private @Mock TelephonyManager mTelephonyManager;
+    @Mock
+    private NetworkStatsSubscriptionsMonitor mNetworkStatsSubscriptionsMonitor;
     private HandlerThread mHandlerThread;
 
     private NetworkStatsService mService;
     private INetworkStatsSession mSession;
     private INetworkManagementEventObserver mNetworkObserver;
-    @Nullable
-    private PhoneStateListener mPhoneStateListener;
 
     private final Clock mClock = new SimpleClock(ZoneOffset.UTC) {
         @Override
@@ -203,8 +200,8 @@
         mHandlerThread = new HandlerThread("HandlerThread");
         final NetworkStatsService.Dependencies deps = makeDependencies();
         mService = new NetworkStatsService(mServiceContext, mNetManager, mAlarmManager, wakeLock,
-                mClock, mTelephonyManager, mSettings,
-                mStatsFactory, new NetworkStatsObservers(), mStatsDir, getBaseDir(mStatsDir), deps);
+                mClock, mSettings, mStatsFactory, new NetworkStatsObservers(), mStatsDir,
+                getBaseDir(mStatsDir), deps);
 
         mElapsedRealtime = 0L;
 
@@ -224,12 +221,6 @@
                 ArgumentCaptor.forClass(INetworkManagementEventObserver.class);
         verify(mNetManager).registerObserver(networkObserver.capture());
         mNetworkObserver = networkObserver.getValue();
-
-        // Capture the phone state listener that created by service.
-        final ArgumentCaptor<PhoneStateListener> phoneStateListenerCaptor =
-                ArgumentCaptor.forClass(PhoneStateListener.class);
-        verify(mTelephonyManager).listen(phoneStateListenerCaptor.capture(), anyInt());
-        mPhoneStateListener = phoneStateListenerCaptor.getValue();
     }
 
     @NonNull
@@ -239,6 +230,14 @@
             public HandlerThread makeHandlerThread() {
                 return mHandlerThread;
             }
+
+            @Override
+            public NetworkStatsSubscriptionsMonitor makeSubscriptionsMonitor(
+                    @NonNull Context context, @NonNull Executor executor,
+                    @NonNull NetworkStatsService service) {
+
+                return mNetworkStatsSubscriptionsMonitor;
+            }
         };
     }
 
@@ -678,10 +677,9 @@
 
     // TODO: support per IMSI state
     private void setMobileRatTypeAndWaitForIdle(int ratType) {
-        final ServiceState mockSs = mock(ServiceState.class);
-        when(mockSs.getDataNetworkType()).thenReturn(ratType);
-        mPhoneStateListener.onServiceStateChanged(mockSs);
-
+        when(mNetworkStatsSubscriptionsMonitor.getRatTypeForSubscriberId(anyString()))
+                .thenReturn(ratType);
+        mService.handleOnCollapsedRatTypeChanged();
         HandlerUtilsKt.waitForIdle(mHandlerThread, WAIT_TIMEOUT);
     }
 
@@ -1118,7 +1116,8 @@
         expectNetworkStatsUidDetail(buildEmptyStats());
 
         // Register custom provider and retrieve callback.
-        final TestableNetworkStatsProvider provider = new TestableNetworkStatsProvider();
+        final TestableNetworkStatsProviderBinder provider =
+                new TestableNetworkStatsProviderBinder();
         final INetworkStatsProviderCallback cb =
                 mService.registerNetworkStatsProvider("TEST", provider);
         assertNotNull(cb);
@@ -1176,7 +1175,8 @@
         mService.forceUpdateIfaces(NETWORKS_WIFI, states, getActiveIface(states), new VpnInfo[0]);
 
         // Register custom provider and retrieve callback.
-        final TestableNetworkStatsProvider provider = new TestableNetworkStatsProvider();
+        final TestableNetworkStatsProviderBinder provider =
+                new TestableNetworkStatsProviderBinder();
         final INetworkStatsProviderCallback cb =
                 mService.registerNetworkStatsProvider("TEST", provider);
         assertNotNull(cb);
diff --git a/tools/protologtool/Android.bp b/tools/protologtool/Android.bp
index d1a86c2..ce551bd 100644
--- a/tools/protologtool/Android.bp
+++ b/tools/protologtool/Android.bp
@@ -6,7 +6,7 @@
     static_libs: [
         "protolog-common",
         "javaparser",
-        "protolog-proto",
+        "platformprotos",
         "jsonlib",
     ],
 }
diff --git a/tools/stats_log_api_gen/Collation.cpp b/tools/stats_log_api_gen/Collation.cpp
index 526876f..958e94e 100644
--- a/tools/stats_log_api_gen/Collation.cpp
+++ b/tools/stats_log_api_gen/Collation.cpp
@@ -478,7 +478,6 @@
 int collate_atoms(const Descriptor* descriptor, const string& moduleName, Atoms* atoms) {
     int errorCount = 0;
 
-    int maxPushedAtomId = 2;
     for (int i = 0; i < descriptor->field_count(); i++) {
         const FieldDescriptor* atomField = descriptor->field(i);
 
@@ -563,14 +562,8 @@
 
             atoms->non_chained_decls.insert(nonChainedAtomDecl);
         }
-
-        if (atomDecl->code < PULL_ATOM_START_ID && atomDecl->code > maxPushedAtomId) {
-            maxPushedAtomId = atomDecl->code;
-        }
     }
 
-    atoms->maxPushedAtomId = maxPushedAtomId;
-
     if (dbg) {
         printf("signatures = [\n");
         for (SignatureInfoMap::const_iterator it = atoms->signatureInfoMap.begin();
diff --git a/tools/stats_log_api_gen/Collation.h b/tools/stats_log_api_gen/Collation.h
index b513463e..043f8b1 100644
--- a/tools/stats_log_api_gen/Collation.h
+++ b/tools/stats_log_api_gen/Collation.h
@@ -191,7 +191,6 @@
     AtomDeclSet decls;
     AtomDeclSet non_chained_decls;
     SignatureInfoMap nonChainedSignatureInfoMap;
-    int maxPushedAtomId;
 };
 
 /**
diff --git a/tools/stats_log_api_gen/atoms_info_writer.cpp b/tools/stats_log_api_gen/atoms_info_writer.cpp
index 5fe94987..292cb21 100644
--- a/tools/stats_log_api_gen/atoms_info_writer.cpp
+++ b/tools/stats_log_api_gen/atoms_info_writer.cpp
@@ -25,68 +25,13 @@
 namespace android {
 namespace stats_log_api_gen {
 
-static void write_atoms_info_header_body(FILE* out, const Atoms& atoms) {
-    fprintf(out, "static int UNSET_VALUE = INT_MAX;\n");
-    fprintf(out, "static int FIRST_UID_IN_CHAIN = 0;\n");
-
-    fprintf(out, "struct StateAtomFieldOptions {\n");
-    fprintf(out, "  std::vector<int> primaryFields;\n");
-    fprintf(out, "  int exclusiveField;\n");
-    fprintf(out, "  int defaultState = UNSET_VALUE;\n");
-    fprintf(out, "  int resetState = UNSET_VALUE;\n");
-    fprintf(out, "  bool nested;\n");
-    fprintf(out, "};\n");
-    fprintf(out, "\n");
-
+static void write_atoms_info_header_body(FILE* out) {
     fprintf(out, "struct AtomsInfo {\n");
-    fprintf(out,
-            "  const static std::set<int> "
-            "kTruncatingTimestampAtomBlackList;\n");
-    fprintf(out, "  const static std::set<int> kAtomsWithAttributionChain;\n");
-    fprintf(out,
-            "  const static std::map<int, StateAtomFieldOptions> "
-            "kStateAtomsFieldOptions;\n");
     fprintf(out, "  const static std::set<int> kWhitelistedAtoms;\n");
     fprintf(out, "};\n");
-    fprintf(out, "const static int kMaxPushedAtomId = %d;\n\n", atoms.maxPushedAtomId);
 }
 
 static void write_atoms_info_cpp_body(FILE* out, const Atoms& atoms) {
-    std::set<string> kTruncatingAtomNames = {"mobile_radio_power_state_changed",
-                                             "audio_state_changed",
-                                             "call_state_changed",
-                                             "phone_signal_strength_changed",
-                                             "mobile_bytes_transfer_by_fg_bg",
-                                             "mobile_bytes_transfer"};
-    fprintf(out,
-            "const std::set<int> "
-            "AtomsInfo::kTruncatingTimestampAtomBlackList = {\n");
-    for (AtomDeclSet::const_iterator atomIt = atoms.decls.begin(); atomIt != atoms.decls.end();
-         atomIt++) {
-        if (kTruncatingAtomNames.find((*atomIt)->name) != kTruncatingAtomNames.end()) {
-            const string constant = make_constant_name((*atomIt)->name);
-            fprintf(out, "    %d, // %s\n", (*atomIt)->code, constant.c_str());
-        }
-    }
-
-    fprintf(out, "};\n");
-    fprintf(out, "\n");
-
-    fprintf(out, "const std::set<int> AtomsInfo::kAtomsWithAttributionChain = {\n");
-    for (AtomDeclSet::const_iterator atomIt = atoms.decls.begin(); atomIt != atoms.decls.end();
-         atomIt++) {
-        for (vector<AtomField>::const_iterator field = (*atomIt)->fields.begin();
-             field != (*atomIt)->fields.end(); field++) {
-            if (field->javaType == JAVA_TYPE_ATTRIBUTION_CHAIN) {
-                const string constant = make_constant_name((*atomIt)->name);
-                fprintf(out, "    %d, // %s\n", (*atomIt)->code, constant.c_str());
-                break;
-            }
-        }
-    }
-
-    fprintf(out, "};\n");
-    fprintf(out, "\n");
 
     fprintf(out, "const std::set<int> AtomsInfo::kWhitelistedAtoms = {\n");
     for (AtomDeclSet::const_iterator atomIt = atoms.decls.begin(); atomIt != atoms.decls.end();
@@ -100,52 +45,9 @@
     fprintf(out, "};\n");
     fprintf(out, "\n");
 
-    fprintf(out,
-            "static std::map<int, StateAtomFieldOptions> "
-            "getStateAtomFieldOptions() {\n");
-    fprintf(out, "    std::map<int, StateAtomFieldOptions> options;\n");
-    fprintf(out, "    StateAtomFieldOptions* opt;\n");
-    for (AtomDeclSet::const_iterator atomIt = atoms.decls.begin(); atomIt != atoms.decls.end();
-         atomIt++) {
-        if ((*atomIt)->primaryFields.size() == 0 && (*atomIt)->exclusiveField == 0) {
-            continue;
-        }
-        fprintf(out,
-                "\n    // Adding primary and exclusive fields for atom "
-                "(%d)%s\n",
-                (*atomIt)->code, (*atomIt)->name.c_str());
-        fprintf(out, "    opt = &(options[%d /* %s */]);\n", (*atomIt)->code,
-                make_constant_name((*atomIt)->name).c_str());
-        fprintf(out, "    opt->primaryFields.reserve(%lu);\n", (*atomIt)->primaryFields.size());
-        for (const auto& field : (*atomIt)->primaryFields) {
-            fprintf(out, "    opt->primaryFields.push_back(%d);\n", field);
-        }
-
-        fprintf(out, "    opt->exclusiveField = %d;\n", (*atomIt)->exclusiveField);
-        if ((*atomIt)->defaultState != INT_MAX) {
-            fprintf(out, "    opt->defaultState = %d;\n", (*atomIt)->defaultState);
-        } else {
-            fprintf(out, "    opt->defaultState = UNSET_VALUE;\n");
-        }
-
-        if ((*atomIt)->triggerStateReset != INT_MAX) {
-            fprintf(out, "    opt->resetState = %d;\n", (*atomIt)->triggerStateReset);
-        } else {
-            fprintf(out, "    opt->resetState = UNSET_VALUE;\n");
-        }
-        fprintf(out, "    opt->nested = %d;\n", (*atomIt)->nested);
-    }
-
-    fprintf(out, "    return options;\n");
-    fprintf(out, "}\n");
-
-    fprintf(out,
-            "const std::map<int, StateAtomFieldOptions> "
-            "AtomsInfo::kStateAtomsFieldOptions = "
-            "getStateAtomFieldOptions();\n");
 }
 
-int write_atoms_info_header(FILE* out, const Atoms& atoms, const string& namespaceStr) {
+int write_atoms_info_header(FILE* out, const string& namespaceStr) {
     // Print prelude
     fprintf(out, "// This file is autogenerated\n");
     fprintf(out, "\n");
@@ -158,7 +60,7 @@
 
     write_namespace(out, namespaceStr);
 
-    write_atoms_info_header_body(out, atoms);
+    write_atoms_info_header_body(out);
 
     fprintf(out, "\n");
     write_closing_namespace(out, namespaceStr);
diff --git a/tools/stats_log_api_gen/atoms_info_writer.h b/tools/stats_log_api_gen/atoms_info_writer.h
index ffe9e439..09a4303 100644
--- a/tools/stats_log_api_gen/atoms_info_writer.h
+++ b/tools/stats_log_api_gen/atoms_info_writer.h
@@ -29,7 +29,7 @@
 int write_atoms_info_cpp(FILE* out, const Atoms& atoms, const string& namespaceStr,
                          const string& importHeader);
 
-int write_atoms_info_header(FILE* out, const Atoms& atoms, const string& namespaceStr);
+int write_atoms_info_header(FILE* out, const string& namespaceStr);
 
 }  // namespace stats_log_api_gen
 }  // namespace android
diff --git a/tools/stats_log_api_gen/main.cpp b/tools/stats_log_api_gen/main.cpp
index fda5736..136933b 100644
--- a/tools/stats_log_api_gen/main.cpp
+++ b/tools/stats_log_api_gen/main.cpp
@@ -229,7 +229,7 @@
             fprintf(stderr, "Unable to open file for write: %s\n", atomsInfoHeaderFilename.c_str());
             return 1;
         }
-        errorCount = android::stats_log_api_gen::write_atoms_info_header(out, atoms, cppNamespace);
+        errorCount = android::stats_log_api_gen::write_atoms_info_header(out, cppNamespace);
         fclose(out);
     }
 
diff --git a/wifi/jarjar-rules.txt b/wifi/jarjar-rules.txt
index 2ecf309..e55a89f 100644
--- a/wifi/jarjar-rules.txt
+++ b/wifi/jarjar-rules.txt
@@ -1,14 +1,41 @@
-# used by wifi-service
-# TODO (b/153596226): Find a solution for networkstack's AIDL parcelables & interfaces.
-# Parcelable class names are serialized in the wire, so renaming them
-# will result in the class not being found for any parcelable received/sent from the
-# wifi-service jar.
+## used by service-wifi ##
 
-# Note: This rule is needed to ensure the rule below does not rename a Parcelable (see TODO above).
-rule android.net.DhcpResultsParcelable* @0
+# Network Stack AIDL interface.
+rule android.net.DhcpResultsParcelable* com.android.wifi.x.@0
+rule android.net.IIpMemoryStore* com.android.wifi.x.@0
+rule android.net.IIpMemoryStoreCallbacks* com.android.wifi.x.@0
+rule android.net.INetd* com.android.wifi.x.@0
+rule android.net.INetdUnsolicitedEventListener* com.android.wifi.x.@0
+rule android.net.INetworkStackConnector* com.android.wifi.x.@0
+rule android.net.InformationElementParcelable* com.android.wifi.x.@0
+rule android.net.InitialConfigurationParcelable* com.android.wifi.x.@0
+rule android.net.InterfaceConfigurationParcel* com.android.wifi.x.@0
+rule android.net.Layer2InformationParcelable* com.android.wifi.x.@0
+rule android.net.Layer2PacketParcelable* com.android.wifi.x.@0
+rule android.net.MarkMaskParcel* com.android.wifi.x.@0
+rule android.net.NattKeepalivePacketDataParcelable* com.android.wifi.x.@0
+rule android.net.PrivateDnsConfigParcel* com.android.wifi.x.@0
+rule android.net.ProvisioningConfigurationParcelable* com.android.wifi.x.@0
+rule android.net.ResolverParamsParcel* com.android.wifi.x.@0
+rule android.net.RouteInfoParcel* com.android.wifi.x.@0
+rule android.net.ScanResultInfoParcelable* com.android.wifi.x.@0
+rule android.net.TetherConfigParcel* com.android.wifi.x.@0
+rule android.net.TetherOffloadRuleParcel* com.android.wifi.x.@0
+rule android.net.TetherStatsParcel* com.android.wifi.x.@0
+rule android.net.UidRangeParcel* com.android.wifi.x.@0
+rule android.net.dhcp.DhcpLeaseParcelable* com.android.wifi.x.@0
+rule android.net.dhcp.DhcpServingParamsParcel* com.android.wifi.x.@0
+rule android.net.ip.IIpClient* com.android.wifi.x.@0
+rule android.net.ip.IIpClientCallbacks* com.android.wifi.x.@0
+rule android.net.ipmemorystore.Blob* com.android.wifi.x.@0
+rule android.net.ipmemorystore.IOnBlobRetrievedListener* com.android.wifi.x.@0
+rule android.net.ipmemorystore.IOnStatusListener* com.android.wifi.x.@0
+rule android.net.ipmemorystore.NetworkAttributesParcelable* com.android.wifi.x.@0
+rule android.net.ipmemorystore.SameL3NetworkResponseParcelable* com.android.wifi.x.@0
+rule android.net.ipmemorystore.StatusParcelable* com.android.wifi.x.@0
+
+# Net utils (includes Network Stack helper classes).
 rule android.net.DhcpResults* com.android.wifi.x.@0
-# Note: This rule is needed to ensure the rule below does not rename a Parcelable (see TODO above).
-rule android.net.InterfaceConfigurationParcel* @0
 rule android.net.InterfaceConfiguration* com.android.wifi.x.@0
 rule android.net.IpMemoryStore* com.android.wifi.x.@0
 rule android.net.NetworkMonitorManager* com.android.wifi.x.@0
@@ -19,8 +46,6 @@
 rule android.net.ip.IpClientUtil* com.android.wifi.x.@0
 rule android.net.ipmemorystore.OnBlobRetrievedListener* com.android.wifi.x.@0
 rule android.net.ipmemorystore.OnStatusListener* com.android.wifi.x.@0
-# Note: This rule is needed to ensure the rule below does not rename a Parcelable (see TODO above).
-rule android.net.ipmemorystore.StatusParcelable* @0
 rule android.net.ipmemorystore.Status* com.android.wifi.x.@0
 rule android.net.networkstack.ModuleNetworkStackClient* com.android.wifi.x.@0
 rule android.net.networkstack.NetworkStackClientBase* com.android.wifi.x.@0
@@ -81,7 +106,7 @@
 # Use our statically linked nanohttpd
 rule fi.iki.elonen.** com.android.wifi.x.@0
 
-# used by both framework-wifi and wifi-service
+## used by both framework-wifi and service-wifi ##
 rule android.content.pm.BaseParceledListSlice* com.android.wifi.x.@0
 rule android.content.pm.ParceledListSlice* com.android.wifi.x.@0
 rule android.net.shared.Inet4AddressUtils* com.android.wifi.x.@0
diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java
index 6c8dc00..7d20d0d 100644
--- a/wifi/java/android/net/wifi/WifiManager.java
+++ b/wifi/java/android/net/wifi/WifiManager.java
@@ -758,6 +758,13 @@
     @SystemApi
     public static final int SAP_CLIENT_BLOCK_REASON_CODE_NO_MORE_STAS = 1;
 
+    /**
+     * Client disconnected for unspecified reason. This could for example be because the AP is being
+     * shut down.
+     * @hide
+     */
+    public static final int SAP_CLIENT_DISCONNECT_REASON_CODE_UNSPECIFIED = 2;
+
     /** @hide */
     @Retention(RetentionPolicy.SOURCE)
     @IntDef(prefix = {"IFACE_IP_MODE_"}, value = {
diff --git a/wifi/java/android/net/wifi/WifiNetworkSpecifier.java b/wifi/java/android/net/wifi/WifiNetworkSpecifier.java
index 737b7c7..b0213b0 100644
--- a/wifi/java/android/net/wifi/WifiNetworkSpecifier.java
+++ b/wifi/java/android/net/wifi/WifiNetworkSpecifier.java
@@ -384,7 +384,8 @@
          *
          * For example:
          * To connect to an open network with a SSID prefix of "test" and a BSSID OUI of "10:03:23":
-         * {@code
+         *
+         * <pre>{@code
          * final NetworkSpecifier specifier =
          *      new Builder()
          *      .setSsidPattern(new PatternMatcher("test", PatterMatcher.PATTERN_PREFIX))
@@ -406,7 +407,7 @@
          *      // etc.
          * };
          * connectivityManager.requestNetwork(request, networkCallback);
-         * }
+         * }</pre>
          *
          * @return Instance of {@link NetworkSpecifier}.
          * @throws IllegalStateException on invalid params set.